From d0f83e451ca302025c849640dffa0c76ad64223d Mon Sep 17 00:00:00 2001 From: calebhf1 <62314190+calebhf1@users.noreply.github.com> Date: Wed, 25 Sep 2024 13:59:01 -0500 Subject: [PATCH 1/4] first run --- out/Graphsfig1.png | Bin 0 -> 136270 bytes out/Graphsfig2.png | Bin 0 -> 59927 bytes out/Graphsfig3.png | Bin 0 -> 109605 bytes out/Graphsfig4.gph | Bin 0 -> 26590 bytes out/Graphsfig4.png | Bin 0 -> 53298 bytes out/Graphsfig5.png | Bin 0 -> 113624 bytes out/Graphsfig5a.gph | Bin 0 -> 16034 bytes out/Graphsfig5b.gph | Bin 0 -> 15975 bytes out/Graphsfig6.png | Bin 0 -> 150096 bytes out/Graphsfig7.png | Bin 0 -> 127862 bytes out/Graphsfiga1.gph | Bin 0 -> 378290 bytes out/Graphsfiga1.png | Bin 0 -> 101758 bytes out/Graphsfiga2.gph | Bin 0 -> 7767 bytes out/Graphsfiga2.png | Bin 0 -> 48464 bytes out/Graphsfiga3.gph | Bin 0 -> 44953 bytes out/Graphsfiga3.png | Bin 0 -> 75441 bytes out/Graphsfiga4a.gph | Bin 0 -> 30718 bytes out/Graphsfiga4a.png | Bin 0 -> 69262 bytes out/Graphsfiga4b.gph | Bin 0 -> 30564 bytes out/Graphsfiga4b.png | Bin 0 -> 66214 bytes out/Graphsfiga5.gph | Bin 0 -> 20438 bytes out/Graphsfiga5.png | Bin 0 -> 126012 bytes out/Graphsfige1.gph | Bin 0 -> 221913 bytes out/Graphsfige1.png | Bin 0 -> 104511 bytes out/Tables/table1a.csv | 16 ++++++++++++++++ out/Tables/table1b.csv | 15 +++++++++++++++ out/Tables/table6.txt | 15 +++++++++++++++ out/Tables/table6.xls | 1 + out/Tables/table7.txt | 16 ++++++++++++++++ out/Tables/table7.xls | 1 + out/Tables/table8.txt | 32 ++++++++++++++++++++++++++++++++ out/Tables/table8.xls | 1 + out/Tables/tablea1.csv | 9 +++++++++ out/Tables/tablea10.txt | 14 ++++++++++++++ out/Tables/tablea10.xls | 1 + out/Tables/tablea3.txt | 31 +++++++++++++++++++++++++++++++ out/Tables/tablea3.xls | 1 + out/Tablestable2.txt | 16 ++++++++++++++++ out/Tablestable2.xls | 1 + out/Tablestable3a.txt | 14 ++++++++++++++ out/Tablestable3a.xls | 1 + out/Tablestable3b.txt | 14 ++++++++++++++ out/Tablestable3b.xls | 1 + out/Tablestable4.txt | 28 ++++++++++++++++++++++++++++ out/Tablestable4.xls | 1 + out/Tablestable5.txt | 33 +++++++++++++++++++++++++++++++++ out/Tablestable5.xls | 1 + out/Tablestable9.txt | 18 ++++++++++++++++++ out/Tablestable9.xls | 1 + out/Tablestablea2.txt | 16 ++++++++++++++++ out/Tablestablea2.xls | 1 + out/Tablestablea4.txt | 21 +++++++++++++++++++++ out/Tablestablea4.xls | 1 + out/Tablestablea5.txt | 17 +++++++++++++++++ out/Tablestablea5.xls | 1 + out/Tablestablea6.txt | 20 ++++++++++++++++++++ out/Tablestablea6.xls | 1 + out/Tablestablea7.txt | 15 +++++++++++++++ out/Tablestablea7.xls | 1 + out/Tablestablea9.txt | 16 ++++++++++++++++ out/Tablestablea9.xls | 1 + 61 files changed, 393 insertions(+) create mode 100644 out/Graphsfig1.png create mode 100644 out/Graphsfig2.png create mode 100644 out/Graphsfig3.png create mode 100644 out/Graphsfig4.gph create mode 100644 out/Graphsfig4.png create mode 100644 out/Graphsfig5.png create mode 100644 out/Graphsfig5a.gph create mode 100644 out/Graphsfig5b.gph create mode 100644 out/Graphsfig6.png create mode 100644 out/Graphsfig7.png create mode 100644 out/Graphsfiga1.gph create mode 100644 out/Graphsfiga1.png create mode 100644 out/Graphsfiga2.gph create mode 100644 out/Graphsfiga2.png create mode 100644 out/Graphsfiga3.gph create mode 100644 out/Graphsfiga3.png create mode 100644 out/Graphsfiga4a.gph create mode 100644 out/Graphsfiga4a.png create mode 100644 out/Graphsfiga4b.gph create mode 100644 out/Graphsfiga4b.png create mode 100644 out/Graphsfiga5.gph create mode 100644 out/Graphsfiga5.png create mode 100644 out/Graphsfige1.gph create mode 100644 out/Graphsfige1.png create mode 100644 out/Tables/table1a.csv create mode 100644 out/Tables/table1b.csv create mode 100644 out/Tables/table6.txt create mode 100644 out/Tables/table6.xls create mode 100644 out/Tables/table7.txt create mode 100644 out/Tables/table7.xls create mode 100644 out/Tables/table8.txt create mode 100644 out/Tables/table8.xls create mode 100644 out/Tables/tablea1.csv create mode 100644 out/Tables/tablea10.txt create mode 100644 out/Tables/tablea10.xls create mode 100644 out/Tables/tablea3.txt create mode 100644 out/Tables/tablea3.xls create mode 100644 out/Tablestable2.txt create mode 100644 out/Tablestable2.xls create mode 100644 out/Tablestable3a.txt create mode 100644 out/Tablestable3a.xls create mode 100644 out/Tablestable3b.txt create mode 100644 out/Tablestable3b.xls create mode 100644 out/Tablestable4.txt create mode 100644 out/Tablestable4.xls create mode 100644 out/Tablestable5.txt create mode 100644 out/Tablestable5.xls create mode 100644 out/Tablestable9.txt create mode 100644 out/Tablestable9.xls create mode 100644 out/Tablestablea2.txt create mode 100644 out/Tablestablea2.xls create mode 100644 out/Tablestablea4.txt create mode 100644 out/Tablestablea4.xls create mode 100644 out/Tablestablea5.txt create mode 100644 out/Tablestablea5.xls create mode 100644 out/Tablestablea6.txt create mode 100644 out/Tablestablea6.xls create mode 100644 out/Tablestablea7.txt create mode 100644 out/Tablestablea7.xls create mode 100644 out/Tablestablea9.txt create mode 100644 out/Tablestablea9.xls diff --git a/out/Graphsfig1.png b/out/Graphsfig1.png new file mode 100644 index 0000000000000000000000000000000000000000..29245f494fc8b933fc37e2f60c07a6cc5d1c4087 GIT binary patch literal 136270 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 XKH&V$@@SW#e(=n`@@=^Ce)h4Ky9R^( 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%0D0_ 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 literal 0 HcmV?d00001 diff --git a/out/Graphsfig2.png b/out/Graphsfig2.png new file mode 100644 index 0000000000000000000000000000000000000000..6274b197b7b1d9bdb486a20e6d2c3a9f251abaef GIT binary patch literal 59927 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 W`JvmG8LY?PKLr^T>3m6($NvZL81`8J literal 0 HcmV?d00001 diff --git a/out/Graphsfig3.png b/out/Graphsfig3.png new file mode 100644 index 0000000000000000000000000000000000000000..659b09923cd76851168fe88fc2528091d3ec0b35 GIT binary patch literal 109605 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 BrKtb_ literal 0 HcmV?d00001 diff --git a/out/Graphsfig5.png b/out/Graphsfig5.png new file mode 100644 index 0000000000000000000000000000000000000000..534c720abf21fa47139ec5f7db4caf29e95a88b7 GIT binary patch literal 113624 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 (a}KR%iv#E zUrZ*MTv=6XH&N*R>NZ=RY0B**c|nbR^*w7PqVekVilGWwBNIH7UiDZx}a_Zjn# zk5)$BL9*1aR=V0sG0XHNlusIEce@Lth&uMP+P?l&O`eK z2O~su6dG#3nagzfJe|l59RnF0X9tJLMm8Gn7I}vlzJ)8+Uox-c z-(+AuBczAId)4>0XelrbjV&ysFWW^+rSQ;#k3?e|hJ-r%?bRmeo$qh=E8i|Rom`(- z=mpXuqd2P20MCn7C9w}LGh5AludC7h#te#nf9U*3@y253Oy^zamCwSR4~uF+n|jU( zjGaw_ij}QQy7;+FR}!iO1~|XmDfQD#;2H_Q*zfpT8xvX?&ERLN^-Rd4A(@VV(GS0I z5Dk-A?JzPQP#N0r)ltctMTcx?c=&w@#Q5?@KvM;1NTKMgR+3|k5FJH{Jt+Dttm+yH zh1LvXv2^@M3#@8vEb8~||H#52Yi{Q=G%ssQy1-_(komsxsE|*2B;+gfvDlw-`1Y6- zt_f-4o|#-nq0a(|{1@NMK)i$|im6hFq$)Ch;r8gx1l6YL_@KH3F{mB8QpNLpZLe^hy`f!m3RF~O3jy6Y}8*D1yuWMs@{rySQG=xxMEo1#Q z*w|0rfa^BcgW+2@CEBGfOH<;feP5GY~<1MYemmKHDi> z>+vG~IT4XL=1@=(X+XPyDLzh7NrCq1V2xr5$*Tb458Iz8Hvjgysa_i1u`K5|Wd6xY zE!Hvo46gdAUl!FEAL6h{9>@p!WM5rEAqld(+#Fm43IaGm7WXil7ZHHPNgbA@xZ+zu z!=Ra%2ac{7eJarmN$qvL?$v8L_lfoMf+gzm>&?@0`Gch8wtE9?3$od7xxQFQFBLg? z+FOv_nC=4#yrg={8LidbUrC$R3$c^Tq1T&50lI%|Mu%>qS68H>vYE@n{S8Q!O<^sX z+>kDau5#|&SeJ#Oo5{HAyn__`j$b}rjBbvOn#KPttuG_LJ~K^CE!hibPJ|6QZ1q%j z4sCAmI`xw}d5Bj?Ul1oUV*b#fVeD5<2erbK3lvlgxuTIUzz)EU@Gn=ewb`HT5F_&M zN-2~!g&9>4a=(;Px-Ba04On_dX7EY)h4Am+TX7hUFFd>i)dT@1omZBx23Oj-z(_Ni zOqh|fK@%hX=N-jN0&3car(UosEr{{^!~`}b76!%>qu6=GpzaNAX3#huyb)^tqX&b} z!}jP<#s><)RFSJhZl>8-HvaF+!}gVz`kxv`1&_pe-_CsK zOLnIp8sYqARB)jC(YRE1MkPkQZYFwTOa+b%n&!>Oz)<~9iJLWwp9V*H)DV;91E_h$ zxK-UhCG9-E+;Txc_xif-&5uajXQ+|8hX^G*(q@ifWY-e^?jw~+U*@x5mAQ=)XH|4nPr(I`mh6A``F zF8C-Tfe5+E85jfFn_nNBj;|sZ{TulCMWE@6sb^?uvz5~cmja#*bjf)(M69alM$W9p zyJd+xG}NG4el!b9B>Cg|^oQVZCsQRnRew#bUUDw^!F^zvuYb9(bK|hlwU{!pn?YER z${!4TTGjDGt4q6-*YCu0Axv~V%Uy?$yDl97ycvGaB^%?YhF>`-wY)jLe-u@0Ji9o~nO?fP_|Tw=wOt(U18YRm#skU^ArI zAPKWzLx4~fW7M?pL79zIz)SW|IV@b%S?v>!{x|cZIo6 z)(y^e5;Zk;czwQXaAsdn8>E7m&FPA^YraUOFaS^?B`BYe2qdoc$Ugu-mASIlyk5s^ zz^Lur(XT8=r%+FtdvGe4N?XqeL|yqldANmRS}6ZXu$PhP`!6G81^qP$hzGf;2~@Wh zE0tf8H}Hg3SK8X6-I%uxMyZT_zP@*cb3}3{ zIyOg&C#0v|eVM=kkdEBnsL4$Z>aH&vLz8%GYQ(QS&l+KDh)+Sm#nwFq5C3!l3kNIbS4<{gsd@&n+eq8ptHn+TM zvka*HQaOy?->xma?F^Iat@=dlI|HyyxepXk@^*k<$)u77hadl6CWn(GP$+9UU@5?T zOaP_}`$C2sO}D+ zoa4}bm=VwD@UYKe{oJu`Y9Dfuq<@uMIO#MX;maDQea_~8yLE}RDdt;IzSaa?KpJ7u zeck!*XE?eX+1K(e6!EkeB=#mUUE{mxctyuPmWYs!Bk-cWiO?f3uiXFpxAmo5Vho;w zn&nG%ZY&}iNKb_mdVm&w`S=C5YaZG8SAcq*A3OI~yi`m!Y?c8ktlE0?pQ<_SFHr4b zt|Hu@U-w4Leg)0*e}~k>6>ngpg52KPR*5VvR`j&FDz%4S0=@jC|BzVlNY; zXG$xQRunPK?9XT+Y+VIRz;L$eYdU&*MEEzDxyk)c4vg)`_<<+oPa)ML~i#MBSL{0#Rk?_y-|A zKEhX?H#V4*$oiEbwdQZ6om+sX>2TCy<6G=>ystZ8&-Xyln|=i~s%p6c6C5xb&>WX} z9&7z~p;rERIQCa8p=kar2`gtbDpCbBp+!U1XRK|on^6z6wKxd1!XE6^7kJ*_MGA(l zSfmIa7=-&3G2Y=U2yCXt|k!Pf0h1GC=emjG3Nc_~p z9H4kz>}N_cy1Me|#RH?Df9K}9uP149W;rJDu8vT>QFm^t%o;Wfemj+f_8Yqlq8>X; zP|5uPgYM^5-sty$*;ZsxYF#U!aebsWka(%T^$1UdRcl<_yld#nyDw|&P0y9|MALG ztR7;OB1);Tg9BR~;q|$BYeb~64T(C}NsA79zb;4MnlCnklwvFci(kIa8i-=7?0gX3 zSkJ3v}j?q4BOzI^xD8wy7>8-77Ta{M5+P=Fx zJjP=m7G!=6ao`jKg`|H6%U zGpAi5hCDG<@y;9Bel#y{XJ%?(GM5J;`Kp}*j?DK8o349 zs$1x09wNTQC>vdnAhDmeY0IlMLhFkzR5;KneMVEzHS6}oUa7G{r*a;Qr;hjl_udE) z$$nsYp$6U^HsS(CcW@MyA25=$=>l{JT9g$o76gwdC6Pz`39ADOGGL;eB@2q=jaOVS z8NZ$BrNL$~V1-IMPYZC5m_V98jfsTB!(nF5>@OkQ01tKvSpRHvB^5fV7KY=rPJ$BS zy;>YK1_=E*T)pPw-@nPsSA!R9b{nC^ze6P$HqQU{ZX8RF;! zwGR|S%da3;rzy&rc`gDwra#9D)tuzfZ@UH2eSP8}S}QobK7wsQ;cjS1v(F;Cm@85nHhBtjhU^A5EVi6%_NPUAjNan-zmDrW>V{; z>AZ1AA)tCxJIddb3A^vYt%hEs(Ha;T+f0>rIm`g}PVcp@;JumBz_T$yziebgnxQXj z7tn8({dVvBdSEBnIQ!bK9A2~V6Fi{Z%zNQJ-`@)XS6S)542R5zb|!j4U(CvFspDPW z{dCBqF{FMdljxTK^rJ4^wV&uHqu;4LLT(tA*fFSYjw@luij0#g!1GdsRXt(g9FjOp zXdy>8w7hmd_T41+)n1WI83~VITD(s`PDl%yxHg}00k=kN(dq?Dgdg@!45Y@LSMH0A8DA@YSsi8pghZNEZ2F&(EkiO}YkHbRP|17t zk}#S$Z?SLT?5*FYg+UomQF4(A z#V78jmBD4nXCMyLWy5GoS2qXS3f->*P& zK&Q?Ie>Q~NuM>jz4QFU{{B@1XDz?GH=ty8ka+y`{UJN4!jbj*;8T|n*9dt1b9>Vly z+Z8?Umy};VgUED=Jh2D6e*Y?xjo?8~3jtiyJdpn}oH!6#om&Bj%%heeTOsu%LV6^t z0f33%_n;7N!yRDWi6^G<9FV*_2=g}6c&wn*fm_3bp@G-y5x|d(-)>O?{ULZNqWD+K$W+gL9dBz^kHq6_7JPhL{P}KYg0uSOx0RNoHJl1*yXbL#86l0O zrXllgDIu06KXt@qYEB^cn~Dmn2=Dmfc!2z^>1x7@cYnJeQfvskBrafds#@^4?*6gA z%Uo*V140Q(1L9ZU%Egk({3t`#aPirdzJanEUfKjG>-Ux6IQs|RWeeT=@dfl}12Y65 zm0Nx11N;hhwhG_sd`hOW<6)kgpF%^0{+=675>8!w+F!!(nj^@23>vX=kP}5)y{nVK zyxRK($*lL*aRD=fKTAx8MKJAAyQ+y9&(dtHTy@PbMO7W?A=ZpE9%21Yk->LWaGwFt zz45UO=skc#*h-tX+egNiDt+h%pJq#SvG<~Yi7qQEn`u-u-be~7%2$jy+1@G$m7un2 z9OVn5=y<_ZKR19BE~@ZqapdKYp=F8&y4}9N`0nzZm9uYQY2l{r$M?5N)Dc}8WcUV( z^n5~-TisOy55N4OlyFQPn~3ev9Euw z&A6|r<&Oeo;`@G;ny6cg-N`(_qKeReashUDhj)Ev*y0Y0*8COe4tVPGzV$$6eC!vj zxdlK%mhN~s^R@7w?qozMcfqmT*1z#OyidsI3lW*$5x=!^=bYr;k z;ITPXbh_H%mZ19VWyBInPj{{ZRB-2_d11&{a-20-P3>3vr?20DEfB@G6)i-#gZJCV zk6-hVl<|L5^*ER*#il0#4R;;oUly7G(+qmn-x4nw!LGqT%x@KeFFncQgnN%Ievh-a z)a~JtIPp3-&4&y^9g!#^y_#kySF?atK5l*-c@a7UJ+6Zo zQQ5MV-CO5v5vpry1PM;20E(t+E z;$2()o^yWZyw4wgo)3HPd#!t|nOQT}nz`mE^J|%*5MfB|Ly#;Y1sWET@ZG-2M`4dLc`I++2v(jt&{Y zc0-zqNoLYO5sK3DN+|UFgWTdWy3WGt*q#+7;9V5AMCCmEz`hK;DhW--ZjYX3U>4?E`W&$_C*fSW&VxSzPkfJ}z z)H>wH9XP%^A1!*kL=cXs#CpWXcmAzV15mJzX;Vj*BVht>_!*td%~o6B?{BnBGN~P6 zLMnkZ`@abIE*ILH2O@cjPmgCrb!k`va(l8Pyjeamb5K{3#+H|t$Hc_+@TZZst#o~jq_7Nlro8}Zz(xuTQgUanB>=*`wrNuD~5c?;aQQ;jjFV}Rf8YqEG zb}4aCMpIk?n<9qg#E-o|$5HykTw(J7WU~^yAVL2{nwy(TV^3*Ba4 zCG$C}I*#8peJeL=Qy4^H{f-4Y;4HiK zH87NtGG9o0xSL{vjH9H(4409~L>Hn`v&obKICa2Q%SIveqo{9VHWbH6@P5L!qJ|0L z58+9ii|eJ*hv#w*C#FJ#h@Ju!<$~-4A)D!_`7~bx*4!28Rq$^VyVfv)W7srSA5CE+I`N7nvqZ)rN4gV&+i}N_e(n0GK{2MvLe%VS9CJD zHvggi{56z%Ogpu+qOYQ8T?JKu-Nou-2TBu#Pb4vmb+U|HY@ocB)cToXu;Q~beh*qhI3 zE33>AnRPfF@6(|xH{FGJ7IvVgsrl_C5lh?EZZUwe^G0!_pD`?U>f(>r+5__G`B05j zf)Qckkv#4pl|gykN+GA6ve3jKu5+(UdEXxj$|q-T*`h^TIU`TiZ`HYQT(Ep(u>{1a z%1W=VuZJ|swkaJ0BDu7BNtce|2STJoxD!%-m@f?F=(;{4e-UGNGaMiH?tF1I7IpM_ zsT!xtukrrJ%CA?GZ897CSEW%pkus9HJ`rTU_jzmzL385wRU+yOt%fcj!Z8B^IA%as zS|Lt!OcmI?4Q?QS6(+vM*D2N4y4kSHdMf$hg>(+J5dZNPq)Ouh(8P4*NQPpD-o)?j z@-gS|jZ67VJ*Ao(0Q8(1@h=qwjrLG9CO<>a z@#%y>MA`Lb*mf!E`$#Y656+vIx9dToqjc6xW$xbVS5sS}2Sc-SyBYUB@UuW<=X8+} zkC8rfsSsP>#MckcK{QFgGxgDA4NW_B=4WRcfdg`_f}GP1n}tIaiL^|tu80wrP`P%h z*qZ?R!}mU#lkfc}U};F1dx_6Tn!APq!o18^INBjXibKxSu(Ldl5?Ge<>UVj-#Q`Kc z5ecNLFrmB>wB2BQXMKOGENDkGt-h%>7zE>A3#D>5AdWA4G>^u1$P_fK4vJW z0J{{AWhPP4!`*!qUBc^ygm8dO84!ylc&R#=?Fwa=ih14A zvwYD0FfKMkqF1eM8;D8S3{L{QJz*$Zh+Ar4le|R3kPU^MP@uoMe(2euMT|}rzfE2Q z2jK7UljW#?$%}2{;X(u|_iL)~DqA78nwzVd5$fN2nl-!~21%FW9SX zaX7n4Y9|gE5850?YF@3)SH!(@m3IQiplS}>kyi71Uc`Z(Gi0mBCOw<4*S$5O9zR}r zM5p6uh|Pu2m56+eq(Cm8R7pt^fcZH2Aaxc-KX8_h!L*plWN%@nPq+ zFfoPvmpJxct^q@NY@F?s--(y2D&IOMAGm8p7&H9>iCne}a?W~1%DN&l^JQndOcCZe z`5k1qd_60hn~_Y|TqR?&ShN&t6twS%r|i~g{T|8CW6#wndQ{ADB`%vkH_%delm(`5 zsxmr+eRNz=U+t(_z1ngdm`O?bifPZ%XOvi&Z0CSLl0!%@GqEdXh-?bRG4k`4>umU` zTWBGA^);|+6d)r8^k+mV(keF+*?5Z3o}sF%3HmtK5Dn;Fa8Qw6toGEuBXm$X!B<~v zTYOvLcgJ}@Bk5j1_7l;i&qJMyhr^2pOM#`;mJWIt8EC>!UoE_&z!V4f5d17g#o(AG zHVepB7mq-&U}cQXnaE|E((Fs!W=LKR5q$N%Pj*HsT&t?b9pQ~DmNS-HlEzO0xafT6 z*q&-KExt-RlId2LT2m+_@AG})$~2qq?pC$dG&LSDKxTG4{v{JztyHQYC3MtN+6(qG#1H4zoEDa>1F{bO@7cxb}+wTK|m$^k-zHjbV^H7HEj*!lOv=a=bjj2c-d`KqY)DgsQgC`?YLqtc@ zri-OwhXw>8SqaFF#;@`hz4pc)TfMirjcwJEJYO_Q}mw(BB;TJwYGE<*R6a-%` zfG1T&FzL(srl*TP)mH9Gzi~B=>iL*|quD9awIsRHSiJqo=%LHu%wng~-ZlBtJ9pJ< z^EGvwf``-+_ZXnfB)ddFUjLjEdAQqpQ3k1O;;dM$ji%1aba+kV;s zc6mD_EFNx5RS@$l;;h@{-UE*H%jkBBXpsNCIT3ykQbwMEoPW3XU}5mP<;hqXt;GDy z{H)yjDmr7#A-DYe{0?^hB1GCJB-#Q3EftbXmse`{{tOLl35k-44?&r?h|{t0^KY~f zb9ri{PVxpLqu;j!n2-X|bVtc>13#(i!<9=8Mo3(>Ux!~_vpVnpdnXl|;qD|RX?a*% z-pb4!a$sd;Z7)>vteC00+1G!}Z2vwb^eZHiXmS?{#df)@uuEaM=crX+`Ov zLz2}0U30klJbe=F+D5f?%F}zqpnB``hjS&nVBrGqVR`L+)aM!xOfDJUX^Tg~G(
    *pL99UuM?r*(z%%ie7%^fo*hEv{MhrAA%9me1TIrTE z&F%V}FUFncBt3e=yLKVQ*i)!{3DXM`Zss+m3jzScLqh{Ev?BX)jK0V27caZDsgLfx zPWSim>8J}`&>k!!DC`0&EgSO3pM@5MS)hwAc6>vdXZ&9E3-Z?CzG@HH4Gz3Nv?bqJ zo=UY((XZNb&RQ7kJ4|@HX zEa_o6kZ6yMsN|`BPy|l{8GIlY(%_AT{}~O!?_m&?TJ_2OhHXc@#)oIsU?PsI>jqqI zq=0rZ{;p+Hp4` zt__RHJ9Iiw!Q$%aNhGhd^;c-cB5U0j?qHDPBA3&BA&0NGS`}aaBM(h{hr?lpBj9nBHlRx%$`bJh>~7#*l-P!0 z5zny6L(u=6HG6ZtKSAvFVhvWP_Z~LEO)#`?8qPWEh#+%H$rJ7ZL<{ zyQKmJnLJL98`n+S^Mu;9wU!-s%RFi^KlO;r1u~yuT}7PH!gMzuY6A zF54Pu`x>ieP!!-JVh%gf8F$A^;Fu|}9eOC9nmLC^*yR1*=bTt}Vdn0AM#SywoE z>e6D3t%k1d3^>1*jp4i{b7a^GpzP|%7u`J?z#%svu2Yp+0IvF0cCZtmBWS8Znr~9c z64oXHxFyu1YPJi*4?`?+SL!ajc_Pum}J+k-`II+p9`_Gvp;@}y-8%l|5;l_MJ3O| zQWBO97k5uQ-3FJ3R*guAh@eVYCszW>6Ev3d6qLGy8su&!M+{8HS^%KD{tR3&v-z5+ z$jFgYPFet-r^nDKB!6OL<%qbQvoEiV_SjohD4mo-IIIMb?^`5>)|c4$d_1ms0>D18 z#vw4VvQ}uE*{Sc|o^ob83^bLDDK+qv`&#SHtGtm~oN*1eG;_8VD$<$nmu&WJ5Zp^D zO?uQzqmG6_ca~R<(Wj5paa-h~ium_OA z6l)b1U~hq9cptqEHX35sku|4^s6`(xBWoGx?%Koe@bg0Bzb{2QqwFtzFm%Zwj7-$F z0I7&HzXk+rB?6_6SgQWfup|QNh=?<6*w2J%I8BTvCEB}P?Y`jpFL`_Q-P1qTqiYCaq_^~iD_ZE zx1r&3_v)P||Ck9=ts{3xi3{VFu>;BQ*K@;rkqBB2*aPSs4{}_+T^#zL_V+gudm`Vy zshfp5U>D&Ph-cZncl&b8^i`ZE;Vv3skn}AXd6#<8(KC8gfWe|6Hej?>0u52>&3#wh z%W*s%cyx-Ob#Z#U`Z^ei8AYo=<{<%XZho(rKebKsTh6&z?PlR_GbEdws$OkDk-1NU zsXA@QDw?1wC_vZfde$8&m{;3i{`8s0ZJ(;ak0TQ$vay8}dbW73`zZ*AE-k$-+gXmA zJ^q}h{2wSAUs6I-2zZHzGyve<+HiU!sQgD7=`Y8TzDka~|`l$8cvpYc*HPr;@ z;h;KBqptBwlzfG3X{zAy+>=vl6(U5Zx<&qFPN%viwWrL;CgPos`ao7CQ+8Jizc#ds z*UF>D%=N<+gaC_z`S^muu+j`l1FS?}%rsEVKtPv*ht8g5Ihd@~D79f-Z8gjjL?RyN z2*}R{_^StM2gLN`LvZ-MSDVdBFj41qNf>BvV+OKB-mmA2fVRc_oE%&}%YWY$YKnK; zqPh9z2LU))e!7&QBl@UrFX|R=j8c8fDHUS5l~LUseMSRQ%XN0TXqw=&IUB|x5_h%> zpp~SU(du=r z$oA3E*S*X4p%RxLIf6Yx>K4^TK6{v|>!!XgO>^rV#OJ<#LYy4<+jb~)X{8cz=U~w1 zx600%$bM3obvavBb?nCS{`S#%4z}~XZ5Zseuf7(SaOh>M!b5R!iOGxn3TApM8`i?` zAq2ffw3ZB4#xJTf`N&5kUvD^_#?w_dd+~y(Ob|UwITej9~A|Q1m^nT0O^%V0mayb^k@8v za?6d+J&{nO*PoJlpJ1*RI%>--@#Ud8>a7rF`Ok^E)l4cGa6>fMFZ!~#-n^0V5$;Ua z(54%T$r-r{lCvu&IjM2DwV|}nX)}MdRSrlIi4d(PCun70Vp3$4yYz<_U+yza^x8SR z?Ui+uCw-;+GZcOwj)5z~gjiqNi&YxlUT5`k#Ms~|*-8dYJRxyG4s(yNdp2EfP#c?T z_d`&8GBW@DN2`(Od!hL!ENya6_{za0;{mO8xu^4Y7m(S*Q66W8^hlLq+xwxESrd|q z){CMV*Fxm0@FH>e`M^OG0@4IKvqDEHvq^unoQ{B=lekEF&kfbBmztUabj<`;z@;Ma z4y?XDL<>5fwWbvEvVcCk?Fc~v{H=GJ8O|4ZP{iBYTe8vBd89Kudu6Po&$*S=v4vQtO4Q@(~S+XzE1#@E>o zW0@k3RjzsQ$N0yWx8C%IN>N;solet%H*Zpn_fEfF|JmT|)muKJk(y?{w!1FWma!C` z<&{-7P}&vrLB)(UwWgbvwms^k*n1}F6zGh*8qTCwR9Y2iogkZt{~F zt-#v4idqL3n#oZ|H9a;D>MnDt%eaK>;I^I}6dcrmMm-{ek%TTq4&>pkMs`;kI}FAs zOKh}U)nlY`E@SJ&rDbSnxg{leL|g!+lQdZz;=ojqtB+%T_BW_VNBdLZ`}JD8pdu2^ zAC!$?2dyK?2S`~!zWg%q9<1ju_8qPORNb{~Ob7WL9Z(@zG{Dr*)RFr`!YN5{`y(lXim*X{Z|pXx5F>y^|idMq*C;&CB6KDTqFRJcb2Kh;Q-5&qxnI6kL^7mDCM zZo0wMJhrjhU<&{du67_pR`*vf=RGWzWmk=jZvZ#TrSJvN@t0U~29vg2H=>(FQOFC@ ziUBzlm1kOnoG;*`$*xtJ0D0%-7m&bGn^)_MHD4l zpUOM06MHXu>EWp;fkE@exS{cM`*O^Sz5l%kosPmblgS}wxemwhhgb!LvIn0m{yc9T z4R~mv=oR#N?Nz3@`TgtJ&1(w5u0%XQP_|m!Y|$Tox;3g(s17GBXT5g|Ts0!w)GcLE zI!qJPi4*B4dExn|C{6;EN`(VVS40o2?9aa0w8_24n`VmVev@uN>V~1)hU#S z;!ka9kPWHsx^eJL#0C7)7emr~_~`sAiOO4I83du%osIPFuQmXHlk{{TNRhRq@*BmU zH93Y)Rk#~}1fq>FnjA?t^8J;cfHn&yMKmJ&r;uXfZs4-CaW8++ zCsJr=8h>o`C02o(i;G%MVkFMXp7o;_?*0)cED%|)h+E}j*TI8BC<#MMLw}mD-Qx*$ z6Vlh7`!0!+Ms5~g!+b8xf5jQK`caDbCHj7rT7sgYc5fm=+R&M^&~m;ls}!OpvTF(s zDx*JAl`H?D((=^>o$%+Ck?hVHoXUWmOIUyQ71|R*ZW^ERog{R+$H@o;BuA{g-`O-A zC`%qf`q4LcECCVy)_rH~Q#efbgXss@KJ_|<4-W)|<^g^!YS^4m3VG`K zVZrcY`=Yz-G%<5m!Zz<)&&Uom($GtvFaFqO;T<2zEU@#xbb38Y@$9x#^F^>8vQ#s` z{PgHs4ubM{)@&0#4gtb5*Zc|&a(7zHP-`hxr0CdK5zk%1!}~TYxbNe)fa8~F4)P@m zt~GugfonGp6$f$o03Q+;BEvj(2xDXg7V>-OeY2WnYCH+!$fkUdZGVE2hsk0-&M}fI zgCCb1+n-%#2~UEf0GoyG9d5XzZiy2dYFV~bE|z+8Gvz)_*xX!g4l-xQv@d+(**e;# zcy8XPKz&L~&eI;r*w9G1{*fY@9C?Jt9FmffTIM_aco*ytqOJ5UZkoH+#GpT50;mSV zz{Dg)KJMRf*FIdRxx-q@>aArCJkd73-Y{p(d5hrqya*3d8h|)JKjE>O3_k2t=R5nZ ztgfCOs6oisoDA*T@eME-@T=8zbtT@EzY%Ekn8@DI6D;8j`mi8IG3oBIwQ1qVxX_&X zQ+2U{(5cCG@)ZZ?6A+R73H|^qEP-I}NNs*J!doc|nfl)JT-NsQN8)K9mPoYik@yr9{pxbB8x~o@Xw!{K`E)>G>W@z_qG2_mhm+LAwj=1 zDt;F!ZV5BBdB-vz=E_(jekoDLYyQ7FQiTnH23!kMwP6!DTRh$)YJqp*CDz2N0ygK zCoXmMv$q>US}cj2a**UCCNIJ;V{ch}U3Mg`i00;I%i1^kpmg%z>n9>W+{*M2#|mY^ z#7bcB@F_n5sYQe}pN`%hMUh8CT^%3=_!Ztc+1U>c=4`lT5;@^k2W}=AO5O2p-B1Pbi~P!sZBr-tsR>4q^zv0W<-1gzOP|}1du8fOPSdg@U(TfSpG&0vf^k4FF;g`=DiAk`+zJIJ6W~YkpY4dFhgdbD z|4K)TLvpq~$D4c!KEb30dw{tub(}Hg$@WX-m0jJhgofp$h0Ex7rKP(}{kM^>^ol&W z72@|yvv&>-l*m)$|5O#hUmZMkT>{~ElG$Tq|CGEgDk`cP?xyEYUhl$5M)uMAwk9;Z zY%C2{98-8f34{GAcS9qpY#J&gwHuSd& zDrx0eDjE?3^4dO0@jpXI-+=bH4#pU!p_kK%9-f76f3_R`JlHyVM;WLkYjd#v{Z-8`-4lm7^0BLQrdJ|DATMoO~Jzkb0#VHeb#!YI(=x+Gq= zo@YPl9wksDkiHhko_{+Z6fwwtt-^Hu25NYj6OK5hVM2;_ZDP8M6iIYsU^+ek5!f`4 zvTz!o(-+^=eTZdF>Sk+IR~DYhjUsqRU!7#L0j>NZ5bMJ70EKQcU}2w5tLF1yPYjho z@~XJVv1a(5lX*U73n&o$zFBbSA&cqb`}OzWw|Ahbhu1V&EE@F{5>Qy~MMYf<(TvLL zr=Jm93>%&OTnW5fc9~=392;dUrC8;|OOCFhlIXQVso7I)(ydu=^=)Y+Mt2gRr36z^ z$!NB6a|Dn)Q9W@QykDGUDl3UobLe9;69R}8UrB_uD-0C?G(v05BV>xgkdU&u}dU}cF8pPU2K2(B-`4exoP}MErMddsIbg!tP zA}SWSH{cT0%g8m@zee$aU(rOj^V&WylB4=s%>Nf9wWX_A&~+RQwF!~~jPk=w1!CT( znVu6Zb0h_xy3aHInicjuy))4>mA#7!uNbung_zGVUJ@Y_ss%e|8q>dN_VyoLJUDRl z{qaCRNN7~}v?c4z>%3Yc6~#=kRkeQ6k5E+{0ww&U4Dn*KG=UbI9ZRA$C!a{l(xQT* zHLobk8ur$vaq@^>%~;4nkyuEK)Lc`xp-eg8v5Yz5Z;`uFhe0}WIx_d^ z_u3lS!z>vv8CeFC4w}q_5Ax#Ff~6i=zMHuUD|YjAE(Q*v@L$0YH<*{pK5Y1HIn*O! zXvV@IF-47&mO;4=AtP7muVx;}KK&F5lTI^^8`gopo2qz-6@iJc^g?YSoA95B)?DVun$unqJ%JLmP zsV%=~4E2t~rzSimYH{@%?%G|?s56{7_o`_4&+@rDJ22|lBT~rod9tyo#-|hXHO%6gB*u>FV^DXYf2XE z25UKtiVb2Fz0N0TdY!g@N~}6~WlgEg$yJE=?>B zC9D!4BO@TOkM4v;)^mxV+z2j0&pKezBI0cetcceL5-FkCv;sm%q}y5o$+>z?;S5@T zwju`+8BHA?Okr8B>dRaB*+M`0p~EEs4;f3B5HhQ=&d}i^S`ac;Z!+_UMY{$t`M0mJ z!G#dM?-U-|lATr>RAcNHKoCcelX|Ktt+lWj z-`dyEnYw46yf0E^`gf%gBM@S|xGO?ES!~$eGtXEKWs482_Rh)zb)b#{6Q&So`xcIP zjnai;KE%F3QC2=1KBoP5oy9+3Rv@8eVicsfhW(fayvPZ#=FCAEGht47d`iAhAU*ZtR1>Ho|hP00GK833%UO`rUHsc|S3^ycMB80VitXIwNv`VS>{23mwV;yqFe9WsRDm~1*J~hfc_2! z0i^}Tptfk7!a&Y4e$T$juAVYRzNyhD=I@Bo1SX|Uo3QZc4;~DuD61VW^H%(6;5*X@ zc4j>uPQ4n1^FWzUjIe1d%m1~|VFMr;xLLso?(@`D8W#G|QVqUAQ1qfF%m1)(kiGr- zu=$6Pb*878)l+;{Bs?l;VJR%>5iov;XcOYhR!poNAsBbWszXJ)_>9BeK8B^GuL719 zrQ6=L^~Ycx?&OKmuZ`wkeDe;c8RO9m zilr2Qp84xba4nVmdE zZ0H+Bw#XWZ#hdyHs}j*1Cydbrn$Ku25Vb>tdyBgli%Xbpeo;yC>LJAhHyQ-ojz3^= z5GxXJMtqh^{3T6Rdlp*#l2&7;dPaq@#M-cSRs@X;g>~02>f1Z7Ia@4IIG+>}j__Ek zzxTjFMK^XB$UEY9qF~=Z(_Qdci&cEIGVycK{|BXj3pHw4)c~^xTHTCUjE<4-#xVcV zbEn3QU159amgTE-B3JTOG`RFbpy?X0W5T8Ds~kLs(2>vT=7qz)V#45bV;rME1Y>Jj zU!oh$JJx@fs0roKpu-Vd$3-NDGcf~cNip)<(Z^}qOtY_niufx)!z@PtuL71K`?XD^K`#G~)}wv6taD=kS*Of?)BkJH|IIWB z@mto)!=^p1q!)2w_UhlrDwfHA6Q~GxK5Ra0V!2btIekiOmc^oGU!P1;q(fr)el% zdbqF`=9ion00gQeX^l-)rl-chw4vj6|7fdaxOO8zd#^9hr?>dUWRu`90PQV3 z!@qcta3^9PSXidmt26zip$YQiuIq{$=SBO&+2JX%`A6%7pT)l1efP|q4uE1j?zr3Z z2$E0<`}GJ2b^Wq+rNkdIRfU^c%&M<${PJuKRQQ>)LK{`N-|#r`X+(?E=5)2isb?5e599>p~>Uv?`lx zla~8lxX*7yz*}y^V3&7p@W;G}pJD)B>lm$$7uvXX)(>#~RL>dHf4%ncf~&hPl)_Z4 z`HtMV1<#0D;;mZf8x=l;yZ!1>u9I#Jz6FfvOs~1<+*jAQ1MEmx?=OzJaY)^tQdoR` zf!B|8U(ez#r+M!qceC`Ai`dGt5cEpj0VzldTRzTP2O_cOz+P>w==kLcUdOA1B$nps znx-5))Q-RX)~Il@=XAp5e!uM3B;wVnzYm1G*C6p(>w$_MDAJ%{!cie+DG4^DWskR3 zOq&v;)2vFpm5b%si4VN{Xxm~*Xp@Q{wm8;qCQcD`+9`!vGG(fLuXy489}O7L1Qzq& zSL9yNM?W6W(u!WL6S!Tp4Bb{(AVb)XE7OG^6?7kAWZ{zxol6(GgXKW1X*yC!^eZTK7YRn&yJ^2Ivz3+Zs0aT0mAONC zF^~Pg@{~927Jcj0&q~6p$kFL!f2fGGLbjtj*80hlKA=?Iiutd93qwR3xrEpnU2Kl5?tm<>7OS|g7z3sBgy1%<_CR$QI>L@PU1 z8IH+ATZA!ebu*xVdg%4X{_Eb4=oB23VJ1&GpYglMSfpZg`KFz!cU)q}qB2R`ldAGz z_*Q#ljYp>H_%RiArVqoFUCmYD|ohNVJtd8IXKr{f^ysWU_p-{;9j6 zP`1sxCYU?YX;Ykla`kF6fycWGvF|ulEsIq57>A1B)^cI?WfqqtwTp% zVWH&Bb<&#BYcHbPB}0mpSJh**5DG^mVp1+qwoq~1(4q?nX4?@*MJOF#qfBz6={qaS z;O_OXS7N2NVvFCLZ5MS`Mr|$IGt<*67q2A69tJfR*0(^(=uLi6H#9299{hMv$9gdF z5vSbHb5g4xf7-~OO@)-D^F_2pkm9LY%@Eh%(a+o{s+Vbxi~^3O`EVbq>EzSuHCRjp zU{%c7ywI*_vjP3vD^$P}{noR@Px5%VM~vV|Aay zL~V$~?-Am}s8$-rvpy7M7r z5zy&8OsKfB{g^3}evBp=g&j*b$kN%M?22os&-!{&CI= zaH6`Ia_@!MQiI$By2FlT#5|&P3knzDdRVR>C7PgWNTi~4rDyJc>v>565(OSNCnY~O z=KejB{{CMevIC6|M4wW&(u@e>nb^})hd&pXubUqbFAm3kz4Cqt@8Z|hEzc? zMC4~q?x%;$1d`}kriecvPEA|v+_O&O`!>Gz&*_zc@DZ+A<3!rI9b=D|^m@al;W06x zG8lb@b+Da2(y7V>RRk-PaNnv+o?;_d$tdKn4}n1_2g?>A(d7)h@)-GYqzDYIll0q> z1KU3jW>y0apj({0E|1R5@L(q~=*<1ek%|((fKGRJB`ophyU@}#rhgD)?;7wd) z5>CIyV_2EjvD?s%CWX$#lA5PEzLldn=09}L)l2haW_#%DqbjPU)p#o*ti zX9S>gn_1E!$lw}#f~uXk&Q_%ce}N6~0*t@?`-QPrv6-yhD=e81_*T=S(>;rl&ex_kAp zWXudB|Gw;9bZ-Yn(5VSMS`uh)nq?EAR`+uRnRWbrokbXQpMxj$aXHcf!+Ou;a+enl zVkU^V+am^c#3PY7{M>;H$TN4wJGe74tNqu4$&173H9pXGl0ZTU!E#el>& zFu_(|`wv~EX9ITy_yZlfU=vHOe;*M26%kbd2z>$<>LaX@BmOsCjrs|2SrBIi8()|@ zP>;K3f0BT9U_E3F((5QU4cqF+lmCV777!F|+)|Tw^uX~O4x{6XSwK*M$N7w^8$c+T z&+o;(vws4j&lJC+nT&&oe+FMQWS#jtVDL=^voY+e$m!57_!9@p16^P)sABm%rc@9T z-dKQD;v!gI)f~nLw|wx^0MA4i8e>#>BZ!V-Rb>`|#FD-trP{o%3p+&pz-8@;_5 zCu|~Hiur)b|6iod6N|uNR7una8vLl7!4nivJ^b;MXdO%cI6Q^mr}<{gDH1=q3zRd- zrl!{!@OoX66$TwY{!6^BGfEH+5~k|$x$t|(P9Drf&dA*wl5z$r?+xv?z8 z0JX)uB^-63!LxfAw$wlQ25#r%&k(oAR~7)Xe+raoge{%Z9HqKYFLP1LJO*jxO);>d zlp6ilP3jabi;FG&zW%55>?5QiF^Fo*8P07FhvO8j;;TwYY^Pga3P2Ud05H|dF6S|W zpd8EVtZ8& zL-?~z|Kp#;EC9-kH#5}9{rA6YYS$lwnk_n&`?jDVm{wnLHs-#>%n@+Xj`#6^)x z>Hjg?KhM={1ye2x#zgy%v-_Vfi0=U0gt67%Eara=LiouKOj+xW823NJ{^tuJ;{-Ox zr=wyiM#TCSvT+`UN2SOcLIobL_6E)>}|3*&au2xjG7Ts2?opEIAVbCYgLBa(IT9YUo+PTIAYGAYpZG7 zkq4+qR`t|Z!G_$vS^~vEfxtonj>Xqz(mu9xHMY_MF&`O2J3OZi>qkX@f18iUp(CJI zTwVfMDMYzilL0U5L3bz+>l*`_o@;9R@%m2qN`gvX9Lgt}TlAh;g6^A=I3hfNsYyBW z3GYsHQHxs>Dvt1xIOtKGQSU#tZ_4ycSF`I5jit0^yu!2_TkQHsz9H4EAu{mS_Y{@S z2F|Uu6l4bIjxD=I#XkP#M(Fo7u&0lv44m1(5_^=V=-U;#**MeHynW~iU@q+7ewG!p zmdGl65>U2v&>xlKG*G@{IcXN!p5ai1ZhSiM=VQ=T!~}G| z+WL|Y@)MGb_Xdl4z}YPFd%wE-!ETkE&qMOPi(Lsj{gnT$1{j1=K&YRRluG?aW&TUJ zF_?gc#HCMt_~+35M|5F`P&}Y+xH2qi|3^e607Al;U*P%I;{Ok!7k>&=gfRT8{C}kR zzlO_+LoCJ6OY`JS=m7KzAV&Rd^~9Gqs}6YYAg{5gm&Lij-f6z>AQbcQj3PsM??fG7 z|8n0Nxi*Nszoa-l1Q%!S%!LWwUd;NwwAwUmyhCTRLY(!Ifpg zKMC|}Phu<*V&+9)4G}^_{Fmgz1pizAbHuX{mC^eNhF1Ukh5!BE*iX32wK&85|Mwdd z))VCFhX1p^Ja7w8z<-YQf1Vci5qu)t$y)Y*)>nyr*@;KVdBMUO=5cf zvICAb6_3prv4O)%fnLPPEy%MgYdxPkUi+ew$`N8{4s!A?+3FYE_DbtVJ_WCSjt05f zw*WyMd2I<2haPZQ^y%A|CaLv)yu=W``8ff{sWK8;uTKU^zhGoR##29nM4U6ht#_x} z@82kA38xMFp<_IEg{vBT+}ux}v0pdu|{dxd_>S*XAs*!DfluViNG+cQB7 zMZk;&ZaYRBnpsLJy6zhXsJ%|nuycfyZRmh-6U!(Io1AYS=;g~&N^UE~-jsU-fbXA~ znByw~WN}`By_F{(c)7y@&yTR;dW8c4+y@75UhxZ>#(;>i*ADuIFji&1cG`$^PMA)X z2XJ-iHU`hoMnuyS9c4}twwzO>OYnMUdXc#O<~f<V4>)~Fw%Y(xrjR#%6eG&pk#Pri(po#9lql7J_u(0(=Qm341x~m1KDaT1 zeewAWz^AWGp7va%0j{0U`$v3IHqCn%IMQb}ioWfGpKy&#yBO$Hel*ojJ^i_ZXz3f}z^YY*umdo&$ z;Dix60k)MXiz?`1rJw6nDRsgZV2hK6_%mf-Ds8}+AG2Mhn!oPkpf!2uL)M*W3E*_@ z@XJ)iWQJ9*1=lYjqcoW7m|34~E&Licl98^L!*G(nB=mPlKAaHSm!p_aVptX` zWpX$W+Y{mV6g2>53~4_MUG zp8y6@vPvJ(S)SA}-Y7n?D=zI#j9ae^$XsJe`^>7#4f+Qzt}$U|(hrsZH8u6<1t&nt z5WitLLJK%JFcTiW5m#5h8RWR)(1%cr~vx6 z9un}jZ9QJ0&y)m{6I0^%HSd;fuc59<2o%^V(UVq8xmKPXJX#syvu_$Do&(;S`zN8+ z89V}8@B~p8;wXaS1(UFQy1ix_08s(px&O~?S701YrPEW8ojIIKQK|g4bHll^eK$#O zVb>ee&qlLEE)|qFM}&S*U?1c7mwH$cKL@YUDOWg_C8_agN()F-lLbanc0qPWI+0^(*0kBz9efYV|z1XUP{CvM^F zn*9R5yWwAOLAor#=^`Pfy4G6R`TFd^@Mb}7OYltfcMz9CmTZ-B(+xk0L^&jcuFse< zqM0Acj|24un$So((P9TSA^z_sY$m9P<|+-HkJ{*^c6H$7vz}xh$E%Rjcc{iBC_e#} ziD|2yznZE?p4fxT5ltc|2=}w9cEhOVWj0xyku4g`at^Z%fP;^aRN}MX39Ivn;zjDH z;xtod2b}c7FG&8@D4FwBP$#?tz?Sq;uMmU13EMjGY53P!!BveZ8lwuR68zbIbKv}N z2`B^SUuD>FkQ@f~RCxwla$=U=UU@<#rzKc1-sYadyol_YRR>M1dVi9hODEKJ;uR@3 zmp(CK9@Y{3nvL7wp5M-JI2d0vPs@Q=m?l)K<%Vp4Cc>(dH8i`=#ak!xsxyv}S zaQMAXVprR=#IRRO+f{hTqkOh5*tzvCtgd_a>YL9eq4@Cn~rUK`0P13a4RBrv@kVQKaP zvuY#RfGg%rtO9$>Q5Wb}ibcXfJw@OIQ2{NWPE+MVSJ)K$AFde6R;|kt^t7K%88CHp zbUnQb4DZ0*6OF_=f{vP|{!l2M0`I}3`+*Ij%b{gemq^mCEUlY+i6R0P6I{-^Igrll0t8k>*wQ9& zhzB?YLAzq0WI-UV|JorvjgFm_g)l+y7xB&|3><_PXDY=!_aZOMN_QEWL zWn#&QupbI{hEWFmUHT!2o>iKqz%GEa<*5`tCp?s1$8{nQW}4{xsjk3AWM|?UXQ4I3 zggK91X^wVzYpSxE>huJzzoz!1xlEeez<|a<#ywQv2DBMW-WPM9Dj&N33~-AxboeRn zKkE}QGLPle?GHT%_RAmKTGB-+v1~(9z7r*BhIOBRxW+Rj?b3gcTf1+Ecgx=lkWvZk z>Ior_ZE^Z$;^c2cNrvX22@fW%eLB6tV;}YRZ+F0Xh-gY*xac+Sn9F<{xeqQ~Ex72C z`YkOm7G>9c1iDkZnreHi6=*)TRs=gY8iD)WU7%e@o_6v{U(3k=OM+0wuzS_J%ZH#P;tIpLetXzv};M@4W-D?BDR=h_aHAJ#U-r6_Pze zWRtyT31vn$*(`jQssAMZqRzxZ9d7P)o#Hs(TV^vgymsz3G*^V|IIWwrTJL52nvg=mpV=70F+|6sGr z@-4pHygZJcBg*l| z-p4G!s6T=|O#E3444rJw_JVJ4UZWiuU^<9@8Am5+BEaaK(3-%$b4?X9wSump)pmktP(f&s6eDH`gKm4ndyXfHT$z_3k$@ z;}Ho(Md!!$4s;VA4p+W>BbPbDID6;7Expk|81@AvBd<+=DnWTRQIoc<-u95}S+2%! zuYGHxd8|Knq^Me9ApoWbYWn;yIcr9)T(oW&ZBSp<_`R&|@BR5v5d`@+4O|?~m^pAq?&Oc_=I(il-X>>|Z;Y^v5e*$WaWFVSg~Kc?C&H}!DLYUXf*~ch zIFOP`4CbBq=chFJuA%aBCPgVQeeboHhtcdnB@)2jRT$>ODMavg3@qC6VkOdPH6PUu z98so8=~8|8vbSr#@LFY9Ei^!eez5;hl47q8@UvBeHjeri-lR6;$}{!|Eq%2*3Vo4@ z*Sswllq(UW0?q;c2EB8T4ms~*R#Kmue(g3cYZW~53(%S9y*mI(MNQ7|TwQ`h1^^1( z3YRF%GYG92(~0_eZkre14T?y&l2MWa1)c3xU`KroVFe6-(ivT}w6>fzBwns~Jk~DD zvJtLldPnG|(Y{S}JN`vPfCvRmlbH59%7;&9K;b9e^?;0dH_>#m{B|kHfW=&dH!m$e ze|2s7wL7_{iJ{ZUDc+JPm<|twB8h-yZsk;tzVq!iILISJtyx+QS|orgO~AkxnK|(r zZ~MzTkDb*?-wKvSP+_s~xPU7SOmF4c<8&K>%t67&=3~dEs>!eBgP)R3r?mXO)_*kd z`BJ+l#L{$`^Dd>X(M@>?{Acg3zt~&Kh_%>nlLS-LCAAIH4&>ie{ zOZ;4wRUWGhXLd84x_|9@Z$TBC0w*1j|K3Z}9#iXNowgC^D%}z^83*RX2ktP-S#x$R z6YFKQT-ILSkt3Ff3DebsT%RK$Hlvb(C~Ga>K$2fEEMOSp+oiUNcJM=5d%p4*Ix=I5 z&O3z#ki75!yejPcHdwtKk_qHAYKFNdR4&g20ZgZms;8?C;ReQhJw2OYu&cwoYABkBhK~cI99lo{A0kl^?dwJVVl`n3OAn2 zzKwXFlK^+C{sT05uT#(k;!cX@@Rp+18!sd=^%2-g0SZLzmq}CHZk^FN1m8q*f^(Z` zQ2|i_r$TuNMzOYs8nJAPTzVqVaNkn9iY#9~Uw#gE=+eDt)&?1hrh>2p6a(?=4lEfy ziJJP{IAyx?V>Q5<@+&bd7IX@*5btYO56R$O-2z42!+usG!lI%SM3`CbiH~s+1I{@>JPe`YDvR+U$4o!a|nwtR-y}(q<&; zn_qaDZmOo#!pT*@9)k>*6ENJPf4u;naiWAm}n ziB&RLBZ{XB>_l^!vH*R0SrxB?1b~J0n`95_RO^tU-|LUX5YaCtMNH>X#7g1cp$Yu; zEiU|FrJePDDBVd?^N~2f)>)T}GijB@jj5>#(Md<2LRu7deF)+4h6T#~1$YUz^4ua9Pi`o7OXWuZCZy_(L8 z@%)NhVY(!W31hblmq(#5qFwk?7}`-Xy^6k%Y~}%ay*D)e{5wPs8&V! zY5Kl7PO8{1;@P8AzN zVPf@@eE9mi6zcr+E%YsL+Q#By!+LyeS*oQ1_XSHenF-r&{M^^2lW?C`$#8y3u?+i_ zX(=|iGG5>-S6W=22HxpL3QcKK)|g7A z`%G#RfyM)tHX_FQ>#jg!bAD)5$$3zPM>k6!d}Gtg*sv@>j@Rn->FB6E^8qZ~PvI&y z>qLpVP*rKvXIXqxbr&;ih;R?mEai0yVm~z8cDA|&-nKxcAwos!jedbwyneyGA|Ts2 zYpL8;Jmu2GOP!KaRE5TJlo*DiLm8f+)%Na5q3&r^n}Plydz3euXIMb-CAw~N5mves z3^{U%Uhj#G&j}IKzY@JK;_aCjZZ_n!6QnH86`t6; z;dkq!__CWOsoWj`x{H2jPfgJXG#!^rRwL1*~s>S*!Ub-{sxH{NeLw2Dz<#16P*8rt^;mT;e z>UNEmuLP2cRi2{8Ea;^Bp{-swo-ecfp7LHPw>;gCFWW%F(q|0WeEqcayNZ?rj5gKN z51|UVa`5ukjeDq5UYMM1?s)faS?%>7jBR8bgw81S;3P`;ZEgBz1$&cQZA?cU98B+G zUc`_f=WNMM%~|Z1HE^zdgN23%kkpc1K}4i`S!Oz9Mrpr)P=rT)#K=&eLU3N6bcUXl z!podjiCl^3IZN;6Ec(`Sv93CzyJq8OpVMP-${YmwX&PB21Jn z`gpMjEKVrbl(j0q&mWT}6}_T&BMddI5;;!pjVrEp8*(b+zOMx67@Tzur&1B#4K#1f zqQ+Jz=P=XyWv9F@(2Z#Egr`O>_l`r|lmJ#0j0SZLr*_N$hg!^&?_p6w2 z2$uZ2@;<8tuj5QFOiGu78)KFDmUun2xA1EJ+Zh$yyleBL8XT;GElFvh$_vvGZo_!% z+2s2Avd%rOmI*WSo0{pH??;e~_i+iFjVQYwTi&+*x9KbynKki?FZK>ePYF zewkd%*&{%S^UgfH9oqmmQ7DrCW2(#>-WlqA}zhp$|Ihmy6GMjGyw@>S`Ve4pZ$74NN=$mPQm~d znNkD&r1lTC-c$L_Vtz#Cxu@gPf%k5J%na|_38u^#ijtm+sxHb|b^&cDLi_NyyVCZW z3(eY6f57X#ovwQbgii!O;f(wwxy+Um-TejYeRR{|y$ObrhyAbOuZ)<}zioTw&LO&- zpJ?$UuqamIhh0oMh_^rB%Leg86ULy#<5wZPi@i;2YA5h}Mc>jIbTW;JNKyB#dGU5k zhCv|!`Mz&mlTMg^j4dEXq2uEN|(CI2|>={{w-q=J%@_6ZW z=5zFO1S(5c%AUNw9F>!ew;iT|tEC5x3I4%rTd2X;Gb&)s=TP`o!_7|Fj_H!XDcex$ z!Jf|#*F%f;Gk$+2x2y&Qvulrm?Ssx{L6I&Ra@s&~RQ_pNPx>)cTQ*Mqbn1)kC$8dv zff6gJz)@&AfqrI%mq04kn}X()&CRYGgE#%JOY}_!WEgktO5xGJo-ds_gpTdzK_qQ*ez*LZ4+EU-$UJX&x zRrYoXvRU?0=c+CyM|~Hp=@0Gu>N`KJaxpr|?@Cnx%n^PViP8Lwsg&U}Vd1c=SktLxQ345i||wDEpfs_NeSc#F;0n z3FAyc<`;DKd{nizEt|3jm#VS3UeZEU;gNK&=UF?!?cKT4cuVxbTwOIU2v!RTB|OMc zJz_(?_+7s`=en(P#PEE(K-QWS>wB)6itL4V*j}tTvB&+2x4_LBoMQNsZ5U2#Lv1K) zuvZUvf(GYJml**|FL6BnCE|;C6r2)ViUFoi2e#mQT;wLWU1jma+?Z?=2!_zLSN=an zvScW_FoQpx)WZARhsv5#NN}{<=FDaY+G_6}d-??{CdsBkHsH7{8#dzgXf%qH9 zubawZDBj63d@o>DVHxq?ZKo^dukVN!_e?(Bc}4Pbq-gjAwD7Ig@^4#+F)lE-D(YQBcg8P`JtJkYCI0!vq9SX{wXy)ylIc&GQ1cb+E83 z@xiWL3CgB5WvAE}@P(F4f{H~|kqDu08{17Zo>R1ilEy%rc=K?XSn{`i6l&!3X2I)K zT_P*Fc7-`(>%qrwGEVY zvgORWD9t(#n5%FS&nrAgDKSiN=5=@u?}uP91QgeeDHJDGRqX4^dWNLRWOm1k8~-S^ z%s-_Yb<;ZRt<{wJ&}2Sx zz8xr{ijQ2^Ivr-~LB8ub$LI&vbWyGOOdGg<3q31xRW6M*r_wv(G$j@zjCgApci476 zmV6UOq&WbMsW5$mvkTe9S}eJBT#XyhbSm4k1L}Zdih~aVv|HRs*!4PGy zvd&}jFk1sXSbG;OXpsr)dxw;I4#(MT-tlcnIc;Bm1#Wn&d=g)_$>RPEZZxtfCvLA- zkToxItV0BNP(>1Tr^oSTg`nO`78WOsJ_2l{M@mL%Ibhj+0NR!OedyJ>=V`O-q1ETu*>O(@cqS%W3gmTNF^2^un! zo}GB{h{k_^!?G*NJo+oT3AUCVi(0x|NEubzXsYk&TELjkIz%QGlSCOQMs#o{lu8j< zHC!`55Pfx_bLo-l}_sUA17%4rOG)c4JjvK+@<3tu>X2x0cp1W-(~)H z)Bd;9{`cJc|2o)|Z=Sz?*uDWr1sih!D3exzbSW>D$K`r5gmb=Z2s#=-z)|avyqDwO zMPaL&E*N16$mA2~;R+vLhQV)ulyT4zku3<9_2$ZJy^iB-oC$r+TEcH7m7~^#Y^fSt z5KrKy7~eK%9ME?g5IWed@V~V(#$|wXK=}cG+q3s;&EK>MEfQ$VU63EnbHsooYT-@V z5q3fnbEx8d^%&YoL|^)P;)GZg;stPcR0v+4iGC!cC!x3XK~Ko-S&2d8wSljtV^403 z6yvCD&A{@!-{|Ny0@1H)V4eKhDX0ASa74r8hx&}w-QA-$DMJhv_0q|W=jqRycBi)` z)@=stV@FpjEd~rS4tQ#eG^w1Q01;|@?%Gc%1A;E)3zWre_AzhbY)T^1T)>mi#pc0T z19dy@x|u-nGY4J1#D5MRDR!jOCFF$})nO)ZkE^BSUNleX-fVaO*6(j_1Gjj_8UzcL z0xk)da%_Cu0$K~S3CY7fplx=3@#QJdb8C_Zd+H_@I~_=22h$vm$0-6S&Pr`yJZ&nuZznJQt2Aqj+E>q4_d`VeQhMZF`G!+nMjh^b9iZBQ zj4>JR47at{y+*hQo$tDI-zEr0h044ev)w8RAVjWOX4S<&RZTxU1UmX~a6dK{7LbFn)S^LUsv+<(&#t;#V$y5p2?q zCFcti;#q<+)>F!5=yF>|h;mw5B1GLTvH*QEcc4!dszH6rwB6q9%Hn z(2UfgpuQNjYu2m&8)-rWW0?NQ8ryNh-_ZDHdvge6<|7F}kX1!}0$zR(+S%V2);;bY zdMk0~2RJY;f=bc|QYbPIza{G$+9MkQs;=Ddo-Xt$y$N(swxc7X9qddfs2xjN)2ZxR z1_|N_R1QHKX;EG~HrMv<*^TD8d*_j+M~bVdr`|^zUb8Das-iERpGk__Z1i|)gd}a* z0qD;fG!FtK$48@RP2GC3f2iE|i%_JyBPdu6+YSTEA_&-YohFhkchJY964(08^G3kf zCQ`p0WQJ6@0_cG>%AV_t2T(nv+X4xDyGsvJOzf8Y9j`a9QkLHOxHM{z{NimVm|tum zfi29y{G+8fI90h}KERZ2)wr#+gK$oTsVkc5*&E$!cYx+WC7SgKG)r_vQH%iGuBCuaaXNC;z)p=y^plw99;SaE6@^&~G($NfL^(4T+`&VDV zQ*#Ah#eRSK;1^vGzl>A>^(ko=lcsy!o4x`?s-AsPQEC^ak~R@z0jRa6`Ad6-&K1=V)ng_idcQOA00jMjO?o9)*#8t{04eOt7uJE z@<2ikbBvB`>7dj)>C*66g0~akU{JSCuF>U=1}VF;=aI37CM%HW`-htYb6 zCvL8Rl)xWAPUxu)e<~NAxvFFCn#~a&9qT(kof-}w9a#*Jfxfva;IE`pCWo_e#y|Gb zPI$DrH3sdC{U2CqPK-oN1>OAh#2}crw7_cKe`Yrvn9$!t4&#l(4c50ME}BVG$YAS1 zt(Ce%I+MZ4s7>!?+nN5L?0%%3%!YY(6#OU{O9Q$LI56miVTxU-VFT1-0aaS>fA)K= z%o<{cxq*2~s4~G$B$FO%BZR;XOVsO^O7J2S7ooLN5ejr}j%8J+u9XH;l5@0`#SvuO zjax=VQJYia5Q|~CXcVI9wHBXQ%5hl*cDQ>enS58|Q+7~{=n{FcS40MRh1e6O{daeL z;>F(|XY|$_GnAy(-t$gR5AQ%b=Gy{FD~%D$rqHb1T}3d+D8j&;tZkdI|gnh-vWNYN?x8Qg7uXs<`buj#mG*EtZC1yG(pTia<)Q`@G=GVMcH zvTce$Gc?Tq(Bg>vCGMG2v%D5f^~%8kN>XQ*h^Hg`1d9i+5rYp}h~c$CA|lS-v<;$2 ztO@f8;CQz2CA4@%TqIGvvb z3)lQOnL-c~eee~cL?*L@TGoVZ)}6NSSWm2#>!IJ^ z1=b#2t>nU>`%&4u}EwGN$r zS-pvyNfBo`jawb!fj%_e)jddQ-e*>8VW=l|C=>9z5i8m&moBS+FYu07+to7FcyaNI zG&|g0fX~}iD1JtDY~EVzMz3XYrS805SW8PJK;=R*tKUYvi}Y$>#9BCSv%GE@yB2Y@ zLC&!$q7?-v%^TMY9Is8pFDSinytpypcDcj#ceOUln2!Fn)NYeOL3?CS8Cf#3jP|Zz zuzW7pxX2#26!%K3-=d@RR=oT8@84?FzTtQBaiG}b zPBI!}RG_lL`P8tsLB=wYg!z1XGdJq5Do6QCQpH`yKLiVq3JTbny!kdClO1B7S1c8< z3)L)*60~JC8xJhK9M7z~s#bb0@?!<4^#~*RaBp4>O*P2Gz;z??Kzi7Ue4z7%;zYuH z11|Tj%1}7J`EU7hTw4u#?%=e%lD4MNyQOB{gKPc=KV4?0UU;w$Bv8LkBDjzyX#W}- z)viq_7-k%unIuTtBKq~*ltZFmNGibk#prwShJfz-}v8%d51Y^i`kLbFFbb+oKhURD(sCIySi z8^`K|ZJji$se{9q}jy*`gFbLCV4Ag7kezDOB$xr!`r<($a-nV$-Eqe3XXr zQ7nvx(l#ea&p3a^ed2et2`(c{2K#%=cSnqfR3cWTSqI2=drvVq;Zt5|87#yjuuDiR zC>7-1^MZrQW;LeO;{ItG_aXS4#rEK&VfKRHFiFzKOyrV}72oWsQ$NiU?*>_S;YH^F zl|>(to3BRICH9!=Loo-QLyiLKDxH}fg9pcV8U@+Oy}D?V!}2tAbn=d6n>PC?pK96@ z_(3nqkpr4CXqM5gR^1pWo2rE3=zECnf;T_{#HbjvV0s_(4%j(NTwv<|X=WWpd_@HH zBwF;`YT3;R^RSI?P?^pW_u7PRyNTt*Dsq^r!1miWZm7h!!UEBzoo)hkLx%-;IPoaN z5L9@9u;NC;M%OygL3MNwjJF_1Cq7BN!F-%&Yv+I-gQH>Dr26o)||Aw^m@& zs8zBoo#Toh*8wKa7W607m%IfBUaXBPRzL7rYrGI236>QpwW4XbZV>RZ;K1ocKjzrM zU$7`x`{SMONA_kMa@jhiM$MNhjoMf;oZ8ld0c=Iycu6sQPvn9Xh@tSQ`HIHM1sw;R zT2M}je4rJBu1KDrv}GVf5=@@ByvZy~iehRV-vyZxIEigt%4)@@*b{xYblq8`a_nWl zANzDEeT%di!|EH#YZEY^0&?|l2`b#8U+d=iP5P!rsiUKkGmbd7?Dv?4OdkX9|LmMN z-eTw27}1tI2Iu-Fjt9vz>RMwjC__}5F9_26Mx{y=r@u-W{-Il}*^%Rme8_YV{N|9rC& zU3jxMAG~=E)9xd}^ynme4NcTnpMUSV|IgM(jancaOLoS5W{(2ne;CQ6$FTKYH(q!O zmUV}x`=5UWlpt?b`|Jbmu{q;kuV=d>sqWXtD(io~nRYq6SxMuz$-i0<3lLKV_qAv) zt^Zmt@{ZXK@MhXy%D=ZA`!oFYI-4;9zYV?5 z+b7^?vD#0iB0=U@UtKX&di24w=P+5+ANoRtS2dM)7TT_UL9P!Ye;Y?NRlZbp(*h!Y z1vRjgJA2@nG5|ogddm`Y6`9ETcau7R6cF><-$iP*X~1THo`BTQE@z>X?-yWuC_b-2 ziKGdN-WT55<)von%>nj)1(@&`WJzysor}k{AcX)+pqI`mU^kQv)4JmYK!1qCWXk`? zxzU<+1}n1qh4mlXgJ~@BZ$q*GRbN8VMe2qO>;_fHd~se3B~0xGy_V8CLzCPb#Pxcp zkS2&uE+YX%=74|k29**>yS|)KJP*%$ z3_uHshmj75D3nCcD4vfDnkTN*^@EIaC!8^6W*Km6((s8toPks)R?>IR;d}LGOu~;g z#~I>OXwHThMby+qETL~-ko@$$>q|h#VQ+UYH-in%K&GgGfmcjCZm$L39f;sGP<89Y zLSKgR<^6qq7ABj4^jn}{jQ_o2dXT=M*;fSY!gYQ_KA5G%J&UN*7UC5j`fe&Kc)f=P zBn%!IXHckYr1Dv6jydriKRIj{5!~bP(y8)jQ3u2#fMO}oTDNE~d5iB%SR$=B@JRaFJsV2YvuPt@MatVh5fsyT#ot(*aroc)#f^!XHm*@Ff->&8VI@l z`4bX2?GgV>BqsemgV$(8S8b{T{cGFyv`hOLXwr=Zd0Le`mSCJ4;EU=fa=z@RIAQ!q zi&MNI9W2p%6(tv)TZ3XNIj_Ns;2z<~(F!;(PRTAym57q}?k6=9BFR!i}+Ql}df>ir|@4n2|} zNzkVWvX)3>o=4defpFYHA2%~ZrsiV?ljEm1rDVg2acR*C4<%>%m?z)ik%Acx4xWsuw`mllWp&tU7 zMuTmXxkHqOGt135h+1CAX32Ik`}oQ5#ol_ z8QR?ACJPc4i27~Ui&GGDC++kTrkj)HHT;iDX3!$*?yzq$7OJLI16j+OgLI=K2x6h* zuDo$hv_{khXHyu5GzG7G10zNc=cbZBckFLiL!$uQ_gV8yAg=IRJI2RZZ`kewqlE<9 zMGgbkId~kEaytr`ZC*VbsKdLDX+DJU^I_NUd2m2Lc*oQD)ICvW@vYQw=4deZWtcly zxS_$@q}dlUK!-ofeV6_Lz|Sf5!v3G9a+ zMLVDoqE@u5MhUW57|&rCS@;=aTW~uiv<21k-b&^J4dhW!G=#LuU|NFe&=@vbY5+Mn zA(m~ffwoY2A+QQhl|&S1pPr~v*J=hE%17W5(KU2xM9h^=#y8lDfwTW6G@xiEm=mh< zqFPnspcyW(2=?JV^mobPXOzH+$>HJbq(yX+4TRKv#;JOfkAia;#6!E1BMJxNcs+y5}E3%1hf<4pFyRH2W(n6g)KaO9VpCe&$f= zG22||Md-^3=U@`%NNIvq+EXYaAI-aKh23k~}Kq*u-`#1Ejn9V?%!c}aH5^YZL>kj=DLahvxsDoisy4w5LX-<`tGF0MI(1h)p^o{w?(eU5lC|jx) zmjH8Oas2d_bTt?G@;c-{@#^&Sa(rU9KD&cD+!zW3W#>15{=UeR{8h#(QTq z&6s|vQl$rwkwK~(((spNPKYD?a~G7RmV87AA3ME3MAEC5Xurd3u9X_so(&e?Yt`%dSyuwl_P)UbazMgHF(>he}Q9s#*yYY)*=s2r08v0baDIJ3XkdU@2^M z3XYq=(IuH(PklbtD{ps zppS4}pvm=Xf!<*N)o@0S8IbsH*}fWvS^|M7NcR?E2-?i(yMRKTM@>fL#fUk8aSssu?ym1UC>_hB zsc3!ITVZMUXcWdw{qJvbv#jdL_*Ad-4(6N*<|qzMfjV3s+R0M{Pw6LG_miMI z?d~Owu2{NPn4u>lqBQ7V5V;*AkZgVo!_gN5`qoB8ddHYd9*1`#z*8<<&B~O1dS@~x z=!D#60b{H<|LRJ7f0TWf8iBPLkx^#pbZvt$ix8$xvi-@vM?3{sAv^gZe~0*^n_7IxHMWuUw0 zw{SQi8;-izLu=RKj=l2}(NYTJl4!fXwJ#z}(Dz<0s5x&fKqxFbKv+H#$E!OBJ8&>u zcU=?F;o&96ll}U!ZK*8}B@F$$TcBW6rh{HGN~F=)$p@aP%c#^p6h2so?Sft5!UZUM^TI81go>fTIz8Eon{ zU@)DBOZ9jPjorV#7wtwhbht->`jgi#5QWzv=Sp^czZ7rMY#4`@v!$0IJDArlzcsw8 z-7x6rt*yZgJeTu&V)PN+cm$b_H+lO0v-r<*-yHr4*)*~V0B7Rl*wOq4tR4SJ1F<^9 zTzv8en*9Zh&#?sqXp~_y{CCUdImBvKTD1J1&=d_52U#4!y|JTxaeUkzUI`OHtr}O( z{}X3Q1;`+k%;4Nx|G~b0LasDG&~r&6ea9Q`zdq{!=RQt3&ee!NcR*?j3rICaq%Ql> z#5{xqU+h!1Hx)uUJ^)XTb1N|N9(vCWZ|w1Nxj-WP0k8qWVZrZrZsXHQ>_gH)D`10{ zg7i6_q2SL~t$1m3?9Hcx&<&q&`&1o%C&?^QC+48jY`#Pn>b8Ptkzk@8w&`nMF?zQX zf{9`jIpNwj@CZ{Xun~+{Tpo55eP`0xd~6-m`<1P@eyLjji#tCn9}g^c*p?-2IO&10V(YR zo#%V?M(D_eU+fg>t%7kb50UZ_U~KH=g8POJ;AO-z1rU5yw?9pQ_2LNipEoptT|Ka} zc4XChj;-VbBR(|G-p_qlUB{ZiXQ?1!j+g{L3CvXUzjN*x*Tcg$RM=pY%s@^mYi-!m>=UQ&_!L`p z_UY&vgcQ)}zt6Gkj>!jmvQ>Q%M#Lqk43g*vVz&$}BA5}10eA&JaDzcAR|5A!iaOW_ zMdtA?BcmnCh%OIM%UGGi(u>R~!d9Wgo})ttPWgxnxpoW!-1Cq=?q_6?U1ODXC+F!sd1vN;p^4pN(&w;%l4BiElZk1o zOnpeB1SRxla=%zj@Qu*G8V*K^)M?7;HKvd>03w-!@@H2=^zLUwO>TG#`Xdp8BdAEr z`aT-N7>;wX-*~g0v{T8|13m_ABVeVYH3OtLZgN-~^~<1J+szf_{ z5b81f_J6!vn@&$CmD_6=%Y9??MVEWIqQksfOAa2ZZP@Q_Kvp3w+i<^?2cgp$D%?=b z=JFKSvVeXvoOT9)n5`;NcMzv=mJ7Aq-o`?LA^zM8Y)eR=w08CP>JTC9; z&&gL&>IPm(xX9_2X49sH&K$K(E@-E5TlufkxgKdq{_`j)G4swxj7w7QJkyp}X&N%3 zdAIHD?;dfX2Jnk2o_QPAFk1Q#$gs{r?@I?K`7&5UM&)1)-vg5S0IHx95L()A@!=!V z5WE#{;8}V*C=t^%6}*ZWdp4jPz7wos+5f(@I}`MCdqvSbhz}oWGuhIZQ{fw~cl(Ic z5rI))F(VWZAc9&y^mD&N23!+VB2ysM1^POQkZz#mGr|+lLxU6u^GFE0kNeh`8RGUB z6(R&*+WZMKHCVj(fqP^qL+O+Hi56irx3Rd)Ddm;G<$VS0ny{CVlBvS^9{Z{1LL0ba zLG-^m$xM;dI%fhPECK0Ds|Hzq!`9N(C(l8f6l$??Zq|M`C9WH|rl+t8KZffvz5EOI z_Yt@R%Ui!!tU$0)u|C?8hWpQtSse45hEJ{=%#pPT-a{z$ym;{T)9gW=ASB|nCp^XC zzV_kHv#HxJ*``Z$&fDl$x?=2c-l~UY;rLH5^#DN$L==nQjWdF@PcjPZxx+1Fx}MO_ z_lM|vgJ46-uhrv+%GoNZ6?w8$k9TO+zG&8O+;`T@j3c60c%Zt8V&(Rs2qd)P_g^T? zxZcP1N{ciBE3M3ykO&d`+(kP$kZ6Jh_6wTx%6snroIbGmHMn}&;)*!$(jQNQ00#m% zlh1feIv%AG^vO~X6suo$E~7RI>Y7hQKo6J)pX5bwDgKt)EA{|6kRm;rVC(S-s3B!< zWvzbxKWT(HoGcuxq28iLKM*v^2H!P%d>gG;!A>^fAevRGYQWW!VAaukk|Mj+C>H#$ z4?apB^j#}%Hu1T9*MEC#Sr@XuX@QjyE-W_Q)zE4OX&^Gnhav!SG}DjmTXKDB%vUNy2OmzW?!9~CQ z4Mhc2kIbgcV)txiS*C{u_ z=Byg;BP0wNHxemzo1p2-sid!J)mX*{j^anaRMeU4cqJX9)N@9VB(^G-YaFJ?0ZW8R zep|1uw?h0(doVeZ3Fq4)kfxWGQZ2*P2s~!uuaay;0x7^|^ANBoC=Xu2t!W1OYu^7( zM+&)bD}N^R&r9}*u8nsCcMY!iG`NDs7GR#vv?=q8Gq(!1<&ElI7Vu!a@-F@8knPa} zjIejl0GX}?yde>h9XOfxjrD`BBq?gKeZ9!X0T#LN#QEHMdlwg@lSX z{4A$xUP;pY-WE|GtnvB&@xbDmPdVV|pEVym{fvX|%2QFxV_*@`OWi$z21BfnKS+&Z zVd=X^zj#LU-#>+yoiQ*t-_Ecx{MYXyf9bh`R71Gp|Ge+< z%R@rw=%mK;U(5e_St>NNNMR8eclfu<20SK&V~Nt^2J=5I`xaLDr1h%Ye-?gt0r%*; zcjd?He9r&#vdAjW#4sFx$Uke%c7zZ0yld(j_CGEw46Af@IY;=n#h{@ZBOglW>xaw# zxa<>HrCm^7_@DPZe)$t6e5l7azw7?8TTb+x5qfPas6wzDQA_PeVYF}ua)0-F6cM7w|cH^q9yIA?;P~f$g4zp64cuw_>9)W&_Xi^v6Vpx5->E$m2TE4p4MSBF;!IkAc$dJy z6x|X?ntcG^mD3`FkYFayulI-%P8xR=6t;BaBX|%Stol1pdE0rra?tc0^wm^g(=E;I52%lq$5= z_!ZgzEeAdUdedp&rxVvc4cUI>ubh63PCD|{Yjf6i>2`5#^q7Gg6yqw$e5Z$F%0J}! z6rJW2`^Ht^dPTB4mjtmD12?WoNHY;PBBZKQY1Rq`w_x%a_9{)F2*SHTZ53GDG{cea zBD@HTz$3vi{SxpH&}_ElzC z^TrmxZ=V!~f4_D7_Q|eW*I+D%T*de5M;qN5)D`iKj?QbeQ2d5_n|O(xpKA^vJd~rk zYEYfPlWrh@9^y*c&$vd>Ep2N$boPd1Vg?LBd)Z#*$_i#5C zww5^M+Ui`G`BqgQJY;f?#F(O2)tCNcA5lS@-BA3x+T zL+;+~bmdbOQ@(p5Uaszdh z2~6@aFy;pXb$3gUKil8oUB=fjSul8Zd~gpyJa>?gdaihQ`iQB`K=Q}tyciW*AoLtk znw~MCG@EGk6tHR$%j(ro`wHv-HuqH)`5K zOS(kwG-mpoWqtpA$em-anANPFvAor`&T-zf_9 zgWoS*6W+6M#NT3zc$qJ=v(_I<)~h<8y==EQ`knD8>fdKXf{ISLHUVE z4YO_GjfIwYCv-y=i~I-gm&Tue%@a>ZR3vI(Tdv-)4dZy$q?dm56%{u_KJ=?w>Fi+| zCRK!uDEte`l@nQ#>xpzmCQ-RKVo~5voyb^{yQ*{b3fDk-q?L_)7pOXPFW2PBfwg}k zH|w2+_i=E*>zrlba~Lgl&6uRHu2R-XpXmYNi62On7O35aq^);4povF=<2@w!Is*wk z=!qcLO!?Lla5540k-VXs%JCjHf-Gq1WWLYg!!>gjTO8tcM(wX;vknO7FPS2NccM2B zXV)qONc0gl<3q7q4ojDlh%Z&+%)|6Rr#p^;WRs=2eZ3Ng1*rOguOuKR^w3EXCWH92 z5edbGd>M4&M`=>M@D2i148&~w(F_;0^4TtW!0@pgL4M!eb!v%(Z(vmSfK7n|w8P`e z&MbEMY|q#)pRGw&AcBqb*5l9FMTXX$&dtMEkaf6TGYWL;s%xbiRN)E4K1yKROISz7JYd;A9Th-Wn9G%H$Zc&-qfmKH|G`V(k*&7^Y4_kv4` zA($629VNK|KX66Hp8R$7>@7^!$K8$RA#H>wXcCLXrw+;*aeT_rfu*SlehPC7D^v|`0NC_&7H)a51{q6Vd oN??uuyY2tG?f>uZ_8EV)(?+SneFW_iC*U7t`73gdWy}KqFL4#8jsO4v literal 0 HcmV?d00001 diff --git a/out/Graphsfig5a.gph b/out/Graphsfig5a.gph new file mode 100644 index 0000000000000000000000000000000000000000..06281dea0f6bc0248e9006c2c12442ad964381aa GIT binary patch literal 16034 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 bf{numX|ed<*m2OG1_3CKOp=MSH?e# literal 0 HcmV?d00001 diff --git a/out/Graphsfig5b.gph b/out/Graphsfig5b.gph new file mode 100644 index 0000000000000000000000000000000000000000..fd13b00613c862ce27f4f1426598bac7a5879591 GIT binary patch literal 15975 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

    {QC%Jxy|b)z;>28T}m^@mKI*ITOEUY~7c8Lvh+ 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 P1Uv-m6IS(jpM-w{bmor2 literal 0 HcmV?d00001 diff --git a/out/Graphsfig7.png b/out/Graphsfig7.png new file mode 100644 index 0000000000000000000000000000000000000000..db10644275c41ec16176c9529d30b5c088b31ed1 GIT binary patch literal 127862 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

    (_83 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

    I$--jVa(=_#}U3M&fu;H~PcXH;M)LSm+- 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 literal 0 HcmV?d00001 diff --git a/out/Graphsfiga2.gph b/out/Graphsfiga2.gph new file mode 100644 index 0000000000000000000000000000000000000000..bde356928849901cfb91cb3b7c2505317280b93f GIT binary patch literal 7767 zcmeHM&5t8T6}O0lkPj&0z<~oQEN!;En(c9WW@pA`GcnO-Lx4m`vwVms=_z-Y?M~X= zPIt}Ny^3HFi6R6D5JCt6Vi6$z0gfDU;K(tD9CDZgM-I71it>BaUGDDL_Qy1rJ;ajj zU%h&--h1`+-s?V*T=Kh~FYdkA@8DzgI~M->-}27I^WXk@pH+YQO=3P$B1iq^jju4r z=W!hHspvB~59d4?M|?K1$J96CQ_oLyhvE*WQy#dQ#Egj-%Mc<{#-+4nD4926woO_( z9rp4oJ1mi&^o4QSx*Lf%&P3oOt?O;J(A0aOnBnpyZWE6$#vmF_=*NcD zZnGhe=AJ7j#?4-@&1QZmBQf^Ez?kxA>;=Z~=?=JsgPGehmrYm`Iq|5^AAhWxG->MD)9kcmPlPv~$kz3y>GPrR6|t~|n&v2srd%rewF7g1Osq1Q z36pdNXHyY*PSc!v0a#$WIpqsN-9td(dYtHn*>0LMM`BU(#^JKzV8zB^1k=#AlvpG#bz2`|(E~XV=qFL!1l0LEp#W zlUdbkJRas`Q<7PA_&Cf^Zi71Sd2@SojZWP5>^bK(+Uj}ps_4UKswKWUDA6zOq5b~X zhz5Zffp-BOfZAaA84x(d&qD&g!jGbSsKMtT@qknrBnoQdNQ3Wd@RsKJIe;4HkDBr~ z4gLwB#Q&wizjfDt0F=`AH26Sw{a1tk0Vwg$KAYLo)Zp^~s_P2?g8>>}1W-1ANrNxz zt`k;(rBr zK$O1&3<&%Kpz$Mo8x4KYE^pE-;-QULjp(N$dpXLh%t1%_y<450gD6i?IL#^8PL^C4 zS#CiIRxz_ca<^jWQbwvZ96G(xeuv#gQgotJAM2h}H&n~S7bc>mREQ13g#rfiy+CBJ zoU_Ff?pF4+8I9wFvxHotd?tR`dIf>UwCxx9%q%50W+X;U(+j{TnUQCx7V+mzGZ1r{ z6*AMvCMk6_%QB5qGaSD5x=5}gp+$~kQT~$4Tjqi5JkEBd7G10qq2wAn=hE7fNfvh67^Rnp?71f=c1*QFm9?Z< z4|BsniFmWq-o;-P@5Uh=U(j%*D=rTZ3AmN@U}p!RVnsS{(+;8R8BPRtKARZ{#V5pQ zB2$)y9)n5%hHXvzI;kQ$NbaPtIh_C;57z2|zr}j_@k`4`I(aEd_vubr$HiE8eZ)!! z5eF`!!UOv-x7LDB5lSp$uZ^269j@w@vAOS!gQ*Cl@m%rZ$Rs8qCJqL*S}O-(xR$8e zEu6tC2%{u&1a=yq8$pQ5S2fc**hoZNF{-|+f>6>Dn6y`1TZ)CmrAg;{hfS&V1`2qp z$xG)5mf0joB`->}aK35EhAK4-0-O?ix;3%WdOfB!*|6?=Ei%Jc9~jkM=Nf0$jZ+ z{99(KfaVAH)AE>}wpLc}bb^_FqP1a|(lfD3f-1XMt-tV?=8~XZy2w(tUwNNqa&1Nr zWpMOqN{n-4TONYa`l}mvY91S+ZcY8ETpj)0qJF=o|C!uM{d5slN3N3leogl?xf<$A z-piWaXL4%~Zplws)6Yz9t)h}g!ZR&Z~sGl`;jF z9u4Mtk?LK3R0Fk>8n79owm}47oWZj-1Ih(s#$sqh)HV|-UFf>q}P8$ f)h_@+!pl3G-v1H#|9JzL4W;!y^7gM)c=+}Skss}X literal 0 HcmV?d00001 diff --git a/out/Graphsfiga2.png b/out/Graphsfiga2.png new file mode 100644 index 0000000000000000000000000000000000000000..b20f9a582b7a23ec07718bd20d46d83cc8e80984 GIT binary patch literal 48464 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 U{Y1R*A^1m5`leLAr169Q1rYycw*UYD literal 0 HcmV?d00001 diff --git a/out/Graphsfiga3.gph b/out/Graphsfiga3.gph new file mode 100644 index 0000000000000000000000000000000000000000..7f43b632266f03187f8c4fde322a38345ca3ca2e GIT binary patch literal 44953 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 AqW}N^ literal 0 HcmV?d00001 diff --git a/out/Graphsfiga4a.gph b/out/Graphsfiga4a.gph new file mode 100644 index 0000000000000000000000000000000000000000..12214d6643f75b8764375c009a350d394e1e364f GIT binary patch literal 30718 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 BG<*O6 literal 0 HcmV?d00001 diff --git a/out/Graphsfiga5.gph b/out/Graphsfiga5.gph new file mode 100644 index 0000000000000000000000000000000000000000..f5b4100584ca1f0bd2f988d37250dc858b8d8b28 GIT binary patch literal 20438 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 literal 0 HcmV?d00001 diff --git a/out/Graphsfiga5.png b/out/Graphsfiga5.png new file mode 100644 index 0000000000000000000000000000000000000000..9db74341e5baf406a80807f836da495b8224739e GIT binary patch literal 126012 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 j&v`oVv;QxLef1Y}0AhAvnp$ihi literal 0 HcmV?d00001 diff --git a/out/Graphsfige1.gph b/out/Graphsfige1.gph new file mode 100644 index 0000000000000000000000000000000000000000..39d65d5e0f72756952e31baa7163c9170db5a948 GIT binary patch literal 221913 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�lp)4g8^T~ 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 literal 0 HcmV?d00001 diff --git a/out/Tables/table1a.csv b/out/Tables/table1a.csv new file mode 100644 index 0000000..1e1091f --- /dev/null +++ b/out/Tables/table1a.csv @@ -0,0 +1,16 @@ +="",="(1)",="",="",="",="",="" +="",="",="",="",="",="",="" +="",="mu_1",="mu_2",="b",="se",="N_1",="N_2" +="st_female1",="0.76",="0.76",="0.00",="0.03",="314",="305" +="st_age1",="12.67",="12.41",="0.27",="0.14",="230",="231" +="ses_index",="-0.03",="0.04",="-0.07",="0.14",="314",="305" +="d_sch_grade4",="0.01",="0.01",="-0.00",="0.01",="305",="299" +="d_sch_grade5",="0.01",="0.02",="-0.01",="0.01",="305",="299" +="d_sch_grade6",="0.27",="0.30",="-0.04",="0.04",="305",="299" +="d_sch_grade7",="0.26",="0.26",="0.00",="0.04",="305",="299" +="d_sch_grade8",="0.30",="0.28",="0.02",="0.04",="305",="299" +="d_sch_grade9",="0.15",="0.13",="0.02",="0.03",="305",="299" +="m_theta_mle",="-0.01",="0.01",="-0.02",="0.08",="313",="304" +="h_theta_mle",="0.05",="-0.05",="0.10",="0.08",="312",="305" +="in_r2",="0.85",="0.90",="-0.05",="0.03",="314",="305" +="N",="619",="",="",="",="",="" diff --git a/out/Tables/table1b.csv b/out/Tables/table1b.csv new file mode 100644 index 0000000..15bd592 --- /dev/null +++ b/out/Tables/table1b.csv @@ -0,0 +1,15 @@ +="",="(1)",="",="",="",="",="" +="",="",="",="",="",="",="" +="",="mu_1",="mu_2",="b",="se",="N_1",="N_2" +="st_female1",="0.77",="0.76",="0.01",="0.04",="266",="273" +="st_age1",="12.61",="12.37",="0.24",="0.16",="196",="203" +="ses_index",="-0.17",="0.03",="-0.19",="0.14",="266",="273" +="d_sch_grade4",="0.01",="0.01",="-0.00",="0.01",="258",="269" +="d_sch_grade5",="0.01",="0.02",="-0.01",="0.01",="258",="269" +="d_sch_grade6",="0.28",="0.30",="-0.02",="0.04",="258",="269" +="d_sch_grade7",="0.26",="0.26",="-0.00",="0.04",="258",="269" +="d_sch_grade8",="0.30",="0.28",="0.02",="0.04",="258",="269" +="d_sch_grade9",="0.14",="0.12",="0.02",="0.03",="258",="269" +="m_theta_mle",="-0.03",="-0.00",="-0.03",="0.09",="265",="272" +="h_theta_mle",="0.05",="-0.07",="0.12",="0.08",="266",="273" +="N",="539",="",="",="",="",="" diff --git a/out/Tables/table6.txt b/out/Tables/table6.txt new file mode 100644 index 0000000..b97ae2f --- /dev/null +++ b/out/Tables/table6.txt @@ -0,0 +1,15 @@ + (1) (2) (3) (4) +VARIABLES LABELS Math: At or above grade level Math: Below grade level Hindi: At or above grade level Hindi: Below grade level + +treat Treatment 0.0089 0.081 0.063 0.050 + (0.032) (0.013) (0.027) (0.014) +m_theta_mle1 m_theta_mle1 0.047 0.099 + (0.022) (0.0069) +h_theta_mle1 h_theta_mle1 0.13 0.13 + (0.016) (0.0068) +Constant Constant 0.31 0.49 0.45 0.58 + (0.022) (0.0089) (0.019) (0.0100) + +Observations 291 511 292 513 +R-squared 0.029 0.346 0.250 0.399 +Robust standard errors in parentheses diff --git a/out/Tables/table6.xls b/out/Tables/table6.xls new file mode 100644 index 0000000..8b3b68a --- /dev/null +++ b/out/Tables/table6.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)VARIABLESMath: At or above grade levelMath: Below grade levelHindi: At or above grade levelHindi: Below grade levelTreatment0.00890.0810.0630.050(0.032)(0.013)(0.027)(0.014)m_theta_mle10.0470.099(0.022)(0.0069)h_theta_mle10.130.13(0.016)(0.0068)Constant0.310.490.450.58(0.022)(0.0089)(0.019)(0.0100)Observations291511292513R-squared0.0290.3460.2500.399
    FalseFalse
    \ No newline at end of file diff --git a/out/Tables/table7.txt b/out/Tables/table7.txt new file mode 100644 index 0000000..ee4ca2c --- /dev/null +++ b/out/Tables/table7.txt @@ -0,0 +1,16 @@ + (1) (2) (3) (4) (5) (6) +VARIABLES LABELS z_hindi z_math z_science z_social z_english z_aggregate + +treat Treatment 0.196 0.059 0.077 0.108 0.081 0.100 + (0.088) (0.076) (0.092) (0.110) (0.105) (0.080) +h_theta_mle1 Baseline Hindi score 0.487 0.292 0.414 0.305 0.336 + (0.092) (0.064) (0.096) (0.067) (0.058) +m_theta_mle1 Baseline math score 0.303 0.097 0.262 0.120 0.167 + (0.041) (0.036) (0.058) (0.052) (0.039) +Constant Constant 1.006 0.142 0.931 1.062 1.487 0.977 + (1.103) (0.423) (0.347) (0.724) (0.740) (0.600) + +Observations 597 596 595 594 597 597 +R-squared 0.190 0.073 0.121 0.177 0.144 0.210 +Number of strata 19 19 19 19 19 19 +Robust standard errors in parentheses diff --git a/out/Tables/table7.xls b/out/Tables/table7.xls new file mode 100644 index 0000000..dc6d817 --- /dev/null +++ b/out/Tables/table7.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)(5)(6)VARIABLESz_hindiz_mathz_sciencez_socialz_englishz_aggregateTreatment0.1960.0590.0770.1080.0810.100(0.088)(0.076)(0.092)(0.110)(0.105)(0.080)Baseline Hindi score0.4870.2920.4140.3050.336(0.092)(0.064)(0.096)(0.067)(0.058)Baseline math score0.3030.0970.2620.1200.167(0.041)(0.036)(0.058)(0.052)(0.039)Constant1.0060.1420.9311.0621.4870.977(1.103)(0.423)(0.347)(0.724)(0.740)(0.600)Observations597596595594597597R-squared0.1900.0730.1210.1770.1440.210Number of strata191919191919
    FalseFalse
    \ No newline at end of file diff --git a/out/Tables/table8.txt b/out/Tables/table8.txt new file mode 100644 index 0000000..86d5f1f --- /dev/null +++ b/out/Tables/table8.txt @@ -0,0 +1,32 @@ + (1) (2) (3) (4) (5) (6) +VARIABLES LABELS z_hindi z_math z_science z_social z_english z_aggregate + +treat Treatment 0.058 -0.40 -0.15 -0.17 0.14 -0.052 + (0.14) (0.11) (0.16) (0.16) (0.11) (0.099) +terc_t2h Treatment*Tercile 2 (Hindi) 0.11 0.31 0.15 -0.30 0.063 + (0.23) (0.18) (0.24) (0.14) (0.16) +terc_t3h Treatment*Tercile 3 (Hindi) 0.29 0.36 0.65 0.14 0.38 + (0.18) (0.19) (0.24) (0.15) (0.13) +d_h_terc2 terc_hindi1== 2.0000 -0.35 -0.39 -0.61 0.14 -0.29 + (0.27) (0.18) (0.29) (0.17) (0.19) +d_h_terc3 terc_hindi1== 3.0000 -0.23 -0.32 -1.02 0.096 -0.37 + (0.31) (0.21) (0.38) (0.20) (0.21) +h_theta_mle1 Baseline Hindi score 0.53 0.35 0.67 0.25 0.40 + (0.17) (0.083) (0.19) (0.11) (0.10) +terc_t2m Treatment*Tercile 2 (Math) 0.55 + (0.20) +terc_t3m Treatment*Tercile 3 (Math) 0.82 + (0.27) +d_m_terc2 terc_math1== 2.0000 -0.27 + (0.23) +d_m_terc3 terc_math1== 3.0000 -0.48 + (0.21) +m_theta_mle1 Baseline math score 0.33 0.096 0.27 0.11 0.16 + (0.072) (0.033) (0.058) (0.051) (0.039) +Constant Constant 1.28 0.47 1.27 1.76 1.29 1.24 + (1.09) (0.40) (0.39) (0.76) (0.74) (0.60) + +Observations 597 596 595 594 597 597 +R-squared 0.201 0.098 0.132 0.203 0.155 0.226 +Number of strata 19 19 19 19 19 19 +Robust standard errors in parentheses diff --git a/out/Tables/table8.xls b/out/Tables/table8.xls new file mode 100644 index 0000000..63214a1 --- /dev/null +++ b/out/Tables/table8.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)(5)(6)VARIABLESz_hindiz_mathz_sciencez_socialz_englishz_aggregateTreatment0.058-0.40-0.15-0.170.14-0.052(0.14)(0.11)(0.16)(0.16)(0.11)(0.099)Treatment*Tercile 2 (Hindi)0.110.310.15-0.300.063(0.23)(0.18)(0.24)(0.14)(0.16)Treatment*Tercile 3 (Hindi)0.290.360.650.140.38(0.18)(0.19)(0.24)(0.15)(0.13)terc_hindi1== 2.0000-0.35-0.39-0.610.14-0.29(0.27)(0.18)(0.29)(0.17)(0.19)terc_hindi1== 3.0000-0.23-0.32-1.020.096-0.37(0.31)(0.21)(0.38)(0.20)(0.21)Baseline Hindi score0.530.350.670.250.40(0.17)(0.083)(0.19)(0.11)(0.10)Treatment*Tercile 2 (Math)0.55(0.20)Treatment*Tercile 3 (Math)0.82(0.27)terc_math1== 2.0000-0.27(0.23)terc_math1== 3.0000-0.48(0.21)Baseline math score0.330.0960.270.110.16(0.072)(0.033)(0.058)(0.051)(0.039)Constant1.280.471.271.761.291.24(1.09)(0.40)(0.39)(0.76)(0.74)(0.60)Observations597596595594597597R-squared0.2010.0980.1320.2030.1550.226Number of strata191919191919
    FalseFalse
    \ No newline at end of file diff --git a/out/Tables/tablea1.csv b/out/Tables/tablea1.csv new file mode 100644 index 0000000..1b8f420 --- /dev/null +++ b/out/Tables/tablea1.csv @@ -0,0 +1,9 @@ +="",="(1)",="",="",="",="",="" +="",="",="",="",="",="",="" +="",="mu_1",="mu_2",="b",="se",="N_1",="N_2" +="z_math",="0.13",="-0.01",="0.14",="0.05",="409",="4067" +="z_hindi",="0.16",="-0.02",="0.17",="0.05",="409",="4067" +="z_science",="0.09",="-0.01",="0.10",="0.05",="409",="4067" +="z_social",="0.13",="-0.01",="0.15",="0.05",="409",="4067" +="z_english",="0.14",="-0.01",="0.15",="0.05",="409",="4067" +="N",="4476",="",="",="",="",="" diff --git a/out/Tables/tablea10.txt b/out/Tables/tablea10.txt new file mode 100644 index 0000000..47b2f24 --- /dev/null +++ b/out/Tables/tablea10.txt @@ -0,0 +1,14 @@ + (1) (2) (3) (4) (5) +VARIABLES LABELS math_ hindi_ english_ science_ soc_sci_ + +post post 0.019 0.018 0.026 0.018 0.014 + (0.011) (0.0096) (0.0098) (0.0080) (0.0071) +post_treat post_treat 0.013 -0.010 -0.0039 0.0017 -0.0056 + (0.016) (0.012) (0.013) (0.012) (0.0086) +Constant Constant 0.21 0.13 0.18 0.14 0.098 + (0.0053) (0.0040) (0.0044) (0.0041) (0.0029) + +Observations 3,735 3,735 3,735 3,735 3,735 +R-squared 0.009 0.004 0.010 0.007 0.005 +Number of id 415 415 415 415 415 +Robust standard errors in parentheses diff --git a/out/Tables/tablea10.xls b/out/Tables/tablea10.xls new file mode 100644 index 0000000..3857173 --- /dev/null +++ b/out/Tables/tablea10.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)(5)VARIABLESmath_hindi_english_science_soc_sci_post0.0190.0180.0260.0180.014(0.011)(0.0096)(0.0098)(0.0080)(0.0071)post_treat0.013-0.010-0.00390.0017-0.0056(0.016)(0.012)(0.013)(0.012)(0.0086)Constant0.210.130.180.140.098(0.0053)(0.0040)(0.0044)(0.0041)(0.0029)Observations3,7353,7353,7353,7353,735R-squared0.0090.0040.0100.0070.005Number of id415415415415415
    FalseFalse
    \ No newline at end of file diff --git a/out/Tables/tablea3.txt b/out/Tables/tablea3.txt new file mode 100644 index 0000000..a598064 --- /dev/null +++ b/out/Tables/tablea3.txt @@ -0,0 +1,31 @@ + (1) (2) (3) (4) +VARIABLES LABELS Math: At or above grade level Math: Below grade level Hindi: At or above grade level Hindi: Below grade level + +treat Treatment -0.030 0.059 0.095 0.10 + (0.054) (0.020) (0.043) (0.026) +terc_t2m Treatment*Tercile 2 (Math) 0.036 0.056 + (0.073) (0.029) +terc_t3m Treatment*Tercile 3 (Math) 0.13 0.023 + (0.080) (0.032) +d_m_terc2 terc_math_1== 2.0000 0.026 0.0085 + (0.058) (0.023) +d_m_terc3 terc_math_1== 3.0000 0.15 0.082 + (0.068) (0.028) +m_theta_mle1 m_theta_mle1 -0.015 0.069 + (0.032) (0.010) +terc_t2h Treatment*Tercile 2 (Hindi) -0.053 -0.071 + (0.065) (0.037) +terc_t3h Treatment*Tercile 3 (Hindi) -0.044 -0.079 + (0.062) (0.033) +d_h_terc2 terc_hindi_1== 2.0000 -0.011 0.092 + (0.048) (0.029) +d_h_terc3 terc_hindi_1== 3.0000 0.15 0.18 + (0.063) (0.034) +h_theta_mle1 h_theta_mle1 0.087 0.084 + (0.023) (0.011) +Constant Constant 0.24 0.45 0.39 0.49 + (0.045) (0.017) (0.041) (0.022) + +Observations 291 511 292 513 +R-squared 0.096 0.371 0.301 0.433 +Robust standard errors in parentheses diff --git a/out/Tables/tablea3.xls b/out/Tables/tablea3.xls new file mode 100644 index 0000000..d65d09e --- /dev/null +++ b/out/Tables/tablea3.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)VARIABLESMath: At or above grade levelMath: Below grade levelHindi: At or above grade levelHindi: Below grade levelTreatment-0.0300.0590.0950.10(0.054)(0.020)(0.043)(0.026)Treatment*Tercile 2 (Math)0.0360.056(0.073)(0.029)Treatment*Tercile 3 (Math)0.130.023(0.080)(0.032)terc_math_1== 2.00000.0260.0085(0.058)(0.023)terc_math_1== 3.00000.150.082(0.068)(0.028)m_theta_mle1-0.0150.069(0.032)(0.010)Treatment*Tercile 2 (Hindi)-0.053-0.071(0.065)(0.037)Treatment*Tercile 3 (Hindi)-0.044-0.079(0.062)(0.033)terc_hindi_1== 2.0000-0.0110.092(0.048)(0.029)terc_hindi_1== 3.00000.150.18(0.063)(0.034)h_theta_mle10.0870.084(0.023)(0.011)Constant0.240.450.390.49(0.045)(0.017)(0.041)(0.022)Observations291511292513R-squared0.0960.3710.3010.433
    FalseFalse
    \ No newline at end of file diff --git a/out/Tablestable2.txt b/out/Tablestable2.txt new file mode 100644 index 0000000..a10faae --- /dev/null +++ b/out/Tablestable2.txt @@ -0,0 +1,16 @@ + (1) (2) (3) (4) +VARIABLES LABELS Endline math score Endline Hindi score Endline math score Endline Hindi score + +treat Treatment 0.37 0.23 0.37 0.24 + (0.064) (0.062) (0.064) (0.071) +m_theta_mle1 Baseline score 0.58 0.57 + (0.042) (0.051) +h_theta_mle1 Baseline score 0.71 0.68 + (0.040) (0.033) +Constant Constant 0.33 0.17 0.32 0.17 + (0.044) (0.044) (0.031) (0.035) + +Observations 535 537 535 537 +R-squared 0.403 0.493 0.397 0.473 +Number of strata 19 19 +Robust standard errors in parentheses diff --git a/out/Tablestable2.xls b/out/Tablestable2.xls new file mode 100644 index 0000000..897d8ba --- /dev/null +++ b/out/Tablestable2.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)VARIABLESEndline math scoreEndline Hindi scoreEndline math scoreEndline Hindi scoreTreatment0.370.230.370.24(0.064)(0.062)(0.064)(0.071)Baseline score0.580.57(0.042)(0.051)Baseline score0.710.68(0.040)(0.033)Constant0.330.170.320.17(0.044)(0.044)(0.031)(0.035)Observations535537535537R-squared0.4030.4930.3970.473Number of strata1919
    FalseFalse
    \ No newline at end of file diff --git a/out/Tablestable3a.txt b/out/Tablestable3a.txt new file mode 100644 index 0000000..e78b75e --- /dev/null +++ b/out/Tablestable3a.txt @@ -0,0 +1,14 @@ + (1) (2) (3) (4) (5) (6) (7) +VARIABLES LABELS 2 cm_arithmetic 2 cm_word_compute 2 cm_data 2 cm_fraction 2 cm_geometry 2 cm_number 2 cm_patterns + +treat Treatment 0.078 0.072 0.042 0.071 0.15 0.15 0.11 + (0.016) (0.016) (0.021) (0.020) (0.024) (0.022) (0.028) +m_theta_mle1 1 m_theta_mle 0.13 0.11 0.082 0.093 0.052 0.068 0.099 + (0.0080) (0.010) (0.015) (0.012) (0.014) (0.012) (0.016) +Constant Constant 0.66 0.50 0.38 0.33 0.39 0.45 0.36 + (0.0079) (0.0076) (0.010) (0.010) (0.012) (0.011) (0.014) + +Observations 537 537 537 537 537 537 537 +R-squared 0.357 0.229 0.097 0.157 0.097 0.135 0.112 +Number of strata 19 19 19 19 19 19 19 +Robust standard errors in parentheses diff --git a/out/Tablestable3a.xls b/out/Tablestable3a.xls new file mode 100644 index 0000000..52491ab --- /dev/null +++ b/out/Tablestable3a.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)(5)(6)(7)VARIABLES2 cm_arithmetic2 cm_word_compute2 cm_data2 cm_fraction2 cm_geometry2 cm_number2 cm_patternsTreatment0.0780.0720.0420.0710.150.150.11(0.016)(0.016)(0.021)(0.020)(0.024)(0.022)(0.028)1 m_theta_mle0.130.110.0820.0930.0520.0680.099(0.0080)(0.010)(0.015)(0.012)(0.014)(0.012)(0.016)Constant0.660.500.380.330.390.450.36(0.0079)(0.0076)(0.010)(0.010)(0.012)(0.011)(0.014)Observations537537537537537537537R-squared0.3570.2290.0970.1570.0970.1350.112Number of strata19191919191919
    FalseFalse
    \ No newline at end of file diff --git a/out/Tablestable3b.txt b/out/Tablestable3b.txt new file mode 100644 index 0000000..edc496f --- /dev/null +++ b/out/Tablestable3b.txt @@ -0,0 +1,14 @@ + (1) (2) (3) (4) +VARIABLES LABELS 2 ch_sentence 2 ch_retrieve 2 ch_inference 2 ch_interpret + +treat Treatment 0.046 0.045 0.065 0.053 + (0.022) (0.016) (0.022) (0.015) +h_theta_mle1 1 h_theta_mle 0.13 0.14 0.15 0.067 + (0.017) (0.0075) (0.011) (0.013) +Constant Constant 0.72 0.59 0.51 0.31 + (0.011) (0.0078) (0.011) (0.0077) + +Observations 539 539 539 539 +R-squared 0.182 0.380 0.309 0.136 +Number of strata 19 19 19 19 +Robust standard errors in parentheses diff --git a/out/Tablestable3b.xls b/out/Tablestable3b.xls new file mode 100644 index 0000000..8577c81 --- /dev/null +++ b/out/Tablestable3b.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)VARIABLES2 ch_sentence2 ch_retrieve2 ch_inference2 ch_interpretTreatment0.0460.0450.0650.053(0.022)(0.016)(0.022)(0.015)1 h_theta_mle0.130.140.150.067(0.017)(0.0075)(0.011)(0.013)Constant0.720.590.510.31(0.011)(0.0078)(0.011)(0.0077)Observations539539539539R-squared0.1820.3800.3090.136Number of strata19191919
    FalseFalse
    \ No newline at end of file diff --git a/out/Tablestable4.txt b/out/Tablestable4.txt new file mode 100644 index 0000000..b375078 --- /dev/null +++ b/out/Tablestable4.txt @@ -0,0 +1,28 @@ + (1) (2) (3) (4) (5) (6) +VARIABLES LABELS Endline math score Endline Hindi score Endline math score Endline Hindi score Endline math score Endline Hindi score + +treat Treatment 0.47 0.27 0.38 0.26 0.37 0.24 + (0.14) (0.095) (0.065) (0.062) (0.064) (0.070) +st_female1 Female -0.050 0.21 + (0.14) (0.15) +treat_fem Treatment * Female -0.13 -0.046 + (0.14) (0.12) +m_theta_mle1 Baseline math score 0.57 0.57 0.53 + (0.052) (0.048) (0.076) +h_theta_mle1 Baseline Hindi score 0.68 0.65 0.70 + (0.033) (0.031) (0.047) +ses_index SES index -0.0028 0.099 + (0.035) (0.021) +treat_ses Treatment * SES index 0.023 -0.0041 + (0.050) (0.041) +treat_lmath Treatment * Baseline math score 0.081 + (0.087) +treat_lhindi Treatment * Baseline Hindi score -0.047 + (0.071) +Constant Constant 0.36 0.012 0.32 0.17 0.32 0.17 + (0.11) (0.11) (0.032) (0.031) (0.031) (0.034) + +Observations 535 537 535 537 535 537 +R-squared 0.399 0.474 0.398 0.494 0.399 0.473 +Number of strata 19 19 19 19 19 19 +Robust standard errors in parentheses diff --git a/out/Tablestable4.xls b/out/Tablestable4.xls new file mode 100644 index 0000000..40c5d20 --- /dev/null +++ b/out/Tablestable4.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)(5)(6)VARIABLESEndline math scoreEndline Hindi scoreEndline math scoreEndline Hindi scoreEndline math scoreEndline Hindi scoreTreatment0.470.270.380.260.370.24(0.14)(0.095)(0.065)(0.062)(0.064)(0.070)Female-0.0500.21(0.14)(0.15)Treatment * Female-0.13-0.046(0.14)(0.12)Baseline math score0.570.570.53(0.052)(0.048)(0.076)Baseline Hindi score0.680.650.70(0.033)(0.031)(0.047)SES index-0.00280.099(0.035)(0.021)Treatment * SES index0.023-0.0041(0.050)(0.041)Treatment * Baseline math score0.081(0.087)Treatment * Baseline Hindi score-0.047(0.071)Constant0.360.0120.320.170.320.17(0.11)(0.11)(0.032)(0.031)(0.031)(0.034)Observations535537535537535537R-squared0.3990.4740.3980.4940.3990.473Number of strata191919191919
    FalseFalse
    \ No newline at end of file diff --git a/out/Tablestable5.txt b/out/Tablestable5.txt new file mode 100644 index 0000000..b7b73be --- /dev/null +++ b/out/Tablestable5.txt @@ -0,0 +1,33 @@ + (1) (2) +VARIABLES LABELS Endline math score Endline Hindi score + +treat Treatment 0.33 0.41 + (0.12) (0.12) +terc_t2m Treatment*Tercile 2 (Math) 0.083 + (0.16) +terc_t3m Treatment*Tercile 3 (Math) 0.068 + (0.16) +d_m_terc1 terc_math1== 1.0000 0.13 + (0.098) +d_m_terc2 terc_math1== 2.0000 0.30 + (0.073) +d_m_terc3 terc_math1== 3.0000 0.53 + (0.092) +m_theta_mle1 Baseline math score 0.44 + (0.066) +terc_t2h Treatment*Tercile 2 (Hindi) -0.30 + (0.16) +terc_t3h Treatment*Tercile 3 (Hindi) -0.24 + (0.15) +d_h_terc1 terc_hindi1== 1.0000 -0.072 + (0.10) +d_h_terc2 terc_hindi1== 2.0000 0.14 + (0.068) +d_h_terc3 terc_hindi1== 3.0000 0.46 + (0.085) +h_theta_mle1 Baseline Hindi score 0.58 + (0.062) + +Observations 535 537 +R-squared 0.545 0.545 +Robust standard errors in parentheses diff --git a/out/Tablestable5.xls b/out/Tablestable5.xls new file mode 100644 index 0000000..95ba598 --- /dev/null +++ b/out/Tablestable5.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)VARIABLESEndline math scoreEndline Hindi scoreTreatment0.330.41(0.12)(0.12)Treatment*Tercile 2 (Math)0.083(0.16)Treatment*Tercile 3 (Math)0.068(0.16)terc_math1== 1.00000.13(0.098)terc_math1== 2.00000.30(0.073)terc_math1== 3.00000.53(0.092)Baseline math score0.44(0.066)Treatment*Tercile 2 (Hindi)-0.30(0.16)Treatment*Tercile 3 (Hindi)-0.24(0.15)terc_hindi1== 1.0000-0.072(0.10)terc_hindi1== 2.00000.14(0.068)terc_hindi1== 3.00000.46(0.085)Baseline Hindi score0.58(0.062)Observations535537R-squared0.5450.545
    FalseFalse
    \ No newline at end of file diff --git a/out/Tablestable9.txt b/out/Tablestable9.txt new file mode 100644 index 0000000..35b66d3 --- /dev/null +++ b/out/Tablestable9.txt @@ -0,0 +1,18 @@ + (1) (2) (3) (4) (5) (6) +VARIABLES LABELS Endline math score Endline Hindi score Endline math score Endline Hindi score Endline math score Endline Hindi score + +att_tot Total attendance (days) 0.0067 0.0043 0.0072 0.0037 0.0086 0.0030 + (0.0011) (0.0011) (0.00090) (0.00091) (0.0018) (0.0018) +m_theta_mle1 Baseline math score 0.56 0.58 0.62 + (0.038) (0.042) (0.061) +h_theta_mle1 Baseline Hindi score 0.68 0.71 0.68 + (0.036) (0.040) (0.052) +Constant Constant 0.31 0.18 0.22 0.24 + (0.041) (0.041) (0.12) (0.11) + +Observations 535 537 535 537 264 265 +R-squared 0.431 0.479 0.429 0.495 0.446 0.445 +Number of strata 19 19 +Angrist-Pischke F-statistic for weak instrument 1207 1244 +Difference-in-Sargan statistic for exogeneity (p-value) 0.14 0.92 +Robust standard errors in parentheses diff --git a/out/Tablestable9.xls b/out/Tablestable9.xls new file mode 100644 index 0000000..2d434bf --- /dev/null +++ b/out/Tablestable9.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)(5)(6)VARIABLESEndline math scoreEndline Hindi scoreEndline math scoreEndline Hindi scoreEndline math scoreEndline Hindi scoreTotal attendance (days)0.00670.00430.00720.00370.00860.0030(0.0011)(0.0011)(0.00090)(0.00091)(0.0018)(0.0018)Baseline math score0.560.580.62(0.038)(0.042)(0.061)Baseline Hindi score0.680.710.68(0.036)(0.040)(0.052)Constant0.310.180.220.24(0.041)(0.041)(0.12)(0.11)Observations535537535537264265R-squared0.4310.4790.4290.4950.4460.445Number of strata1919Angrist-Pischke F-statistic for weak instrument12071244Difference-in-Sargan statistic for exogeneity (p-value)0.140.92
    FalseFalse
    \ No newline at end of file diff --git a/out/Tablestablea2.txt b/out/Tablestablea2.txt new file mode 100644 index 0000000..16a3ae3 --- /dev/null +++ b/out/Tablestablea2.txt @@ -0,0 +1,16 @@ + (1) (2) (3) (4) +VARIABLES LABELS Endline math score Endline Hindi score Endline math score Endline Hindi score + +treat Treatment 0.38 0.23 0.38 0.23 + (0.068) (0.066) (0.069) (0.071) +m_theta_mle1 Baseline math score 0.59 0.58 + (0.045) (0.051) +h_theta_mle1 Baseline Hindi score 0.72 0.70 + (0.039) (0.031) +Constant Constant 0.33 0.20 0.33 0.19 + (0.047) (0.046) (0.034) (0.035) + +Observations 523 525 523 525 +R-squared 0.384 0.480 0.380 0.470 +Number of strata 19 19 +Robust standard errors in parentheses diff --git a/out/Tablestablea2.xls b/out/Tablestablea2.xls new file mode 100644 index 0000000..bd3425d --- /dev/null +++ b/out/Tablestablea2.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)VARIABLESEndline math scoreEndline Hindi scoreEndline math scoreEndline Hindi scoreTreatment0.380.230.380.23(0.068)(0.066)(0.069)(0.071)Baseline math score0.590.58(0.045)(0.051)Baseline Hindi score0.720.70(0.039)(0.031)Constant0.330.200.330.19(0.047)(0.046)(0.034)(0.035)Observations523525523525R-squared0.3840.4800.3800.470Number of strata1919
    FalseFalse
    \ No newline at end of file diff --git a/out/Tablestablea4.txt b/out/Tablestablea4.txt new file mode 100644 index 0000000..9b0b9d2 --- /dev/null +++ b/out/Tablestablea4.txt @@ -0,0 +1,21 @@ + (1) (2) (3) (4) +VARIABLES LABELS Total attendance (days) Total attendance (days) Total attendance (days) Total attendance (days) + +st_female1 Female 3.90 2.65 3.03 4.06 + (3.90) (3.92) (3.88) (3.88) +ses_index SES index -3.33 -3.53 -3.47 -3.21 + (1.03) (1.05) (1.05) (1.05) +st_tui_math1 Attends Math extra tuition -1.83 0.88 + (4.43) (4.55) +st_tui_hindi1 Attends Hindi extra tuition 7.10 5.13 + (4.40) (4.53) +m_theta_mle1 Baseline math score -0.99 -0.88 -0.81 + (2.17) (2.24) (2.24) +h_theta_mle1 Baseline Hindi score 3.35 3.83 5.39 + (2.12) (2.15) (2.14) +Constant Constant 46.6 47.5 45.3 43.7 + (3.40) (3.42) (3.79) (3.78) + +Observations 313 310 310 301 +R-squared 0.038 0.046 0.056 0.120 +Robust standard errors in parentheses diff --git a/out/Tablestablea4.xls b/out/Tablestablea4.xls new file mode 100644 index 0000000..82fad5c --- /dev/null +++ b/out/Tablestablea4.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)VARIABLESTotal attendance (days)Total attendance (days)Total attendance (days)Total attendance (days)Female3.902.653.034.06(3.90)(3.92)(3.88)(3.88)SES index-3.33-3.53-3.47-3.21(1.03)(1.05)(1.05)(1.05)Attends Math extra tuition-1.830.88(4.43)(4.55)Attends Hindi extra tuition7.105.13(4.40)(4.53)Baseline math score-0.99-0.88-0.81(2.17)(2.24)(2.24)Baseline Hindi score3.353.835.39(2.12)(2.15)(2.14)Constant46.647.545.343.7(3.40)(3.42)(3.79)(3.78)Observations313310310301R-squared0.0380.0460.0560.120
    FalseFalse
    \ No newline at end of file diff --git a/out/Tablestablea5.txt b/out/Tablestablea5.txt new file mode 100644 index 0000000..540812f --- /dev/null +++ b/out/Tablestablea5.txt @@ -0,0 +1,17 @@ + (1) (2) (3) (4) +VARIABLES LABELS Endline math score Endline Hindi score Endline math score Endline Hindi score + +att_tot Total attendance (days) 0.0052 0.0079 0.0097 0.0070 + (0.0054) (0.0053) (0.0072) (0.0073) +att_sq Attendance squared 0.000028 -0.000058 -0.000014 -0.000048 + (0.000073) (0.000072) (0.000083) (0.000085) +m_theta_mle1 Baseline math score 0.58 0.62 + (0.042) (0.061) +h_theta_mle1 Baseline Hindi score 0.71 0.68 + (0.040) (0.052) +Constant Constant 0.31 0.18 0.20 0.19 + (0.042) (0.042) (0.14) (0.14) + +Observations 535 537 264 265 +R-squared 0.429 0.496 0.446 0.446 +Robust standard errors in parentheses diff --git a/out/Tablestablea5.xls b/out/Tablestablea5.xls new file mode 100644 index 0000000..b71306d --- /dev/null +++ b/out/Tablestablea5.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)VARIABLESEndline math scoreEndline Hindi scoreEndline math scoreEndline Hindi scoreTotal attendance (days)0.00520.00790.00970.0070(0.0054)(0.0053)(0.0072)(0.0073)Attendance squared0.000028-0.000058-0.000014-0.000048(0.000073)(0.000072)(0.000083)(0.000085)Baseline math score0.580.62(0.042)(0.061)Baseline Hindi score0.710.68(0.040)(0.052)Constant0.310.180.200.19(0.042)(0.042)(0.14)(0.14)Observations535537264265R-squared0.4290.4960.4460.446
    FalseFalse
    \ No newline at end of file diff --git a/out/Tablestablea6.txt b/out/Tablestablea6.txt new file mode 100644 index 0000000..2b51d5f --- /dev/null +++ b/out/Tablestablea6.txt @@ -0,0 +1,20 @@ + (1) (2) (3) (4) (5) (6) +VARIABLES LABELS Endline math score Endline Hindi score Endline math score Endline Hindi score Endline math score Endline Hindi score + +att_mat_tot Days of math instruction 0.018 0.019 0.022 + (0.0029) (0.0024) (0.0047) +m_theta_mle1 Baseline math score 0.56 0.58 0.61 + (0.038) (0.041) (0.060) +att_hin_tot Days of Hindi instruction 0.012 0.011 0.0084 + (0.0031) (0.0026) (0.0050) +h_theta_mle1 Baseline Hindi score 0.68 0.71 0.68 + (0.036) (0.039) (0.052) +Constant Constant 0.31 0.18 0.22 0.24 + (0.041) (0.041) (0.11) (0.11) + +Observations 535 537 535 537 264 265 +R-squared 0.432 0.478 0.428 0.495 0.445 0.446 +Number of strata 19 19 +Angrist-Pischke F-statistic for weak instrument 1211 1093 +Difference-in-Sargan statistic for exogeneity (p-value) 0.12 0.80 +Robust standard errors in parentheses diff --git a/out/Tablestablea6.xls b/out/Tablestablea6.xls new file mode 100644 index 0000000..9044b63 --- /dev/null +++ b/out/Tablestablea6.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)(5)(6)VARIABLESEndline math scoreEndline Hindi scoreEndline math scoreEndline Hindi scoreEndline math scoreEndline Hindi scoreDays of math instruction0.0180.0190.022(0.0029)(0.0024)(0.0047)Baseline math score0.560.580.61(0.038)(0.041)(0.060)Days of Hindi instruction0.0120.0110.0084(0.0031)(0.0026)(0.0050)Baseline Hindi score0.680.710.68(0.036)(0.039)(0.052)Constant0.310.180.220.24(0.041)(0.041)(0.11)(0.11)Observations535537535537264265R-squared0.4320.4780.4280.4950.4450.446Number of strata1919Angrist-Pischke F-statistic for weak instrument12111093Difference-in-Sargan statistic for exogeneity (p-value)0.120.80
    FalseFalse
    \ No newline at end of file diff --git a/out/Tablestablea7.txt b/out/Tablestablea7.txt new file mode 100644 index 0000000..0e9651e --- /dev/null +++ b/out/Tablestablea7.txt @@ -0,0 +1,15 @@ + (1) (2) (3) (4) +VARIABLES LABELS Endline math score Endline Hindi score Endline math score Endline Hindi score + +treat Treatment 0.37 0.23 0.38 0.24 + (0.063) (0.062) (0.062) (0.061) +m_theta_mle1 Baseline math score 0.59 0.57 + (0.041) (0.038) +h_theta_mle1 Baseline Hindi score 0.71 0.68 + (0.040) (0.037) +Constant Constant 0.32 0.18 0.32 0.17 + (0.044) (0.044) (0.043) (0.042) + +Observations 535 535 535 535 +R-squared 0.405 0.487 0.454 0.535 +Robust standard errors in parentheses diff --git a/out/Tablestablea7.xls b/out/Tablestablea7.xls new file mode 100644 index 0000000..b5cf52e --- /dev/null +++ b/out/Tablestablea7.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)VARIABLESEndline math scoreEndline Hindi scoreEndline math scoreEndline Hindi scoreTreatment0.370.230.380.24(0.063)(0.062)(0.062)(0.061)Baseline math score0.590.57(0.041)(0.038)Baseline Hindi score0.710.68(0.040)(0.037)Constant0.320.180.320.17(0.044)(0.044)(0.043)(0.042)Observations535535535535R-squared0.4050.4870.4540.535
    FalseFalse
    \ No newline at end of file diff --git a/out/Tablestablea9.txt b/out/Tablestablea9.txt new file mode 100644 index 0000000..60b2634 --- /dev/null +++ b/out/Tablestablea9.txt @@ -0,0 +1,16 @@ + (1) (2) (3) (4) +VARIABLES LABELS Math: EI item Math: Non-EI item Hindi: EI item Hindi: Non-EI item + +treat Treatment 0.11 0.075 0.055 0.044 + (0.013) (0.011) (0.017) (0.011) +m_theta_mle1 m_theta_mle1 0.092 0.096 + (0.011) (0.0084) +h_theta_mle1 h_theta_mle1 0.14 0.12 + (0.0093) (0.0052) +Constant Constant 0.46 0.47 0.61 0.48 + (0.0064) (0.0055) (0.0082) (0.0056) + +Observations 537 537 539 539 +R-squared 0.226 0.358 0.308 0.416 +Number of strata 19 19 19 19 +Robust standard errors in parentheses diff --git a/out/Tablestablea9.xls b/out/Tablestablea9.xls new file mode 100644 index 0000000..e14e8af --- /dev/null +++ b/out/Tablestablea9.xls @@ -0,0 +1 @@ +FalseFalse(1)(2)(3)(4)VARIABLESMath: EI itemMath: Non-EI itemHindi: EI itemHindi: Non-EI itemTreatment0.110.0750.0550.044(0.013)(0.011)(0.017)(0.011)m_theta_mle10.0920.096(0.011)(0.0084)h_theta_mle10.140.12(0.0093)(0.0052)Constant0.460.470.610.48(0.0064)(0.0055)(0.0082)(0.0056)Observations537537539539R-squared0.2260.3580.3080.416Number of strata19191919
    FalseFalse
    \ No newline at end of file From 12803690580b4fd720a40d9f7cd789fcf4044c24 Mon Sep 17 00:00:00 2001 From: calebhf1 <62314190+calebhf1@users.noreply.github.com> Date: Wed, 25 Sep 2024 14:01:51 -0500 Subject: [PATCH 2/4] second run --- out/Graphsfig4.gph | Bin 26590 -> 26590 bytes out/Graphsfig5.png | Bin 113624 -> 114042 bytes out/Graphsfig5a.gph | Bin 16034 -> 16034 bytes out/Graphsfig5b.gph | Bin 15975 -> 15975 bytes out/Graphsfig6.png | Bin 150096 -> 150439 bytes out/Graphsfiga1.gph | Bin 378290 -> 378291 bytes out/Graphsfiga2.gph | Bin 7767 -> 7767 bytes out/Graphsfiga3.gph | Bin 44953 -> 44953 bytes out/Graphsfiga4a.gph | Bin 30718 -> 30718 bytes out/Graphsfiga4b.gph | Bin 30564 -> 30564 bytes out/Graphsfiga5.gph | Bin 20438 -> 20438 bytes out/Graphsfige1.gph | Bin 221913 -> 221913 bytes 12 files changed, 0 insertions(+), 0 deletions(-) diff --git a/out/Graphsfig4.gph b/out/Graphsfig4.gph index cfa5e6427f0be8e5e26ac6a572171165667c9cd4..47c5562f86085d64f269c9641256a46a19083400 100644 GIT binary patch delta 275 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 z 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 literal 113624 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 (a}KR%iv#E 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 diff --git a/out/Graphsfig5a.gph b/out/Graphsfig5a.gph index 06281dea0f6bc0248e9006c2c12442ad964381aa..210bc596a6d774e38520458298d88a3761965443 100644 GIT binary patch delta 2529 zcmYk8eKeH$9>B+Vt8JwhDN_bBhEN%0yo>ooWy+RTv0Sxd3~4!ODPxuyoUUG|#nbJ2 z9hvMTNu!~qVroTXm6~kc!t}b%Z9Az|_g;JJ{+{P|j$iZF=lMLJ@Ao&)8OM2)S;{Q+ zFx}MMhs*VG^CtB4hen=p?&~zIhQUULaUNWa!JK+CW1**qM?7ILCs6ZtNsggBePdyd zQ|7pq20w1)iK*jRh^3;qM~`HPwHesQT*7@64|7uxX4($STgP{}NHWkKy%g^mI!raD z)WQ2?#6pJUB0`7TFE5ZSVaH$+5sYQ?6~YG!`QtHIX9pbZB=`(VhsNpieMRd@MGKtF zvKd!ZJ%$_@sQQRm_JXKpY!oC|?X=FgIS6la`6(8dD`rwYwlxosTlvX9%>U&3NC&xu zFY&{CCJnPoCgHYxjag{cL0WTVKTL1%^NFP8Y-dq^>5|Z@yU_IWyXW<)9CHxY#Q$&c z&e%Ta2l+$Y13HaA(Yjo@sH8=qoZiz0wJk6&{+H}R1d+TVYR`yO(wa<$8frg~?EkuJ zi4$U;Ple>pB)}`#G5oL;_1c7l2xk$wCkdo0Q&k=HDmlDJ z0Y4VE1kR}-2U37~Wx(3FTjZiNz#Gk~`|b!ikOs&0GsuMedY`Yc3AitFHRyatKBNQ`{UTSCTyjUzikR=r z`^DtbNWd|x+6ieT`K={jihXJ<_*etvOc1*Cj~R`(nqpg@53A^wWRnT{y!`KXTtbba zIlSynB-vyGJK^+`Q4wO3(`_F=t!|`zxHWkBjYJbbn+qf3sLLz8y$LrPrkrUcFg)-A z_0lav<|>;e*yn;>R}Sms4diSth*FPq?~lGrvFFr+gRf2?|7Lr#K=d4Oq~0z*OiAv^ z1^ViXyI#2k}zJkSulJ6*lgD(=8ru@{NhgFP}2s~Z+#&T`F#lOxy3kRW_|W& z*dGOI-x-&_t%!}D<$LO8$o?pJdQtANi5b*FT^MDQ<{j)s(Qn?zOM6<8|E4)5)T;{( zxDK~V>u9a8KMoQ7ri5=K9H9BP-FOM2XE{cscT? z*AYTHOL;Pv?&`(A0e7DSJsaL(c-We9GK)x;n`*3mCTb9j?@LkGe_{ig3pFSoba$V zbl%mP2RC6~4DtcV#H1aQG2I#d>diRPqdQ;PHQIN;t#2t(hv=BA z8+RKRm?Cdlhq+c6U^mUV1y`H~UWIn68aE-XY!Ca(kB+!;^Gyf66mfO~?m3_F&~!(s zQQWO)YLVZ2>Vo1GpDpUF$HOi?_<+St#fAo{ov<$fL)#TjVgm7_YSzh^ZHVbQJy5PDpAec)sk;7)r4|wTF?+_sUVGdEvwp_cnd}PeO^)@Uk zz<<7N;dLY;{=EYGwOg=Xx0x`oXAvXpF9}!sWpd7mrd1)wyWzM3Y#+dE#q1H6LRvn&Y3zRC5W(>wJ&*eF5lnFCuFsQW3_-ow7SPpq4b{;9>0 z#Wn0xf5rpzf-t9<4$RK}8WQnLo2-Ke)Br+M@7%RxfMVMqiitXowR!s=H8%>scnp0l zNK5&N_>Chl7RJVkxdg{yH#62F&Yf%Pw=-4zwP>$6S-jqMiw75egea+Yh@oE62)d&^ b`Hn_7IkHTsS2TA`n4`{e_HE8(efs|avq{>@ delta 2547 zcmYk;do)yA90%|*UcE%62W2o`4V6(Q@(4SMDU~SFRdkZXq)h` zh>w@9SM!IL5vGQWnNr>(spQ!p98Gka(ieC=Zje}E$XI%!8OIf)B^~K2$qLQ=U4rpY zQT{V%cX#nHcF|9wz;HD;T7R=qd}9whW_v^!VCRlS|E#a+CU5Z&x=jD&{8R~@>0xsi zJL(Yj`B=hk{t}(!gafpiye?S1?cq!8nQunq%%8^KCuhy}&3^#XE|1>UZe^8g2Xv1| zVfcTuHir^*^JO!2GyWD|4y=c<3COIK%0_n(Q450oqg+3>%x1}9>;jyAHYRqqBKI5Y zS#sDAdH<+^`6Hc6u;U5x=5j5+*A_r~0}~d@n|+iCOCyU_SIS>&rrU^N zF97rwt{+i^A9176f&ks%55Y)~n6gYQ=xYZ@Kv{$Mb#U?Vbm-rJ!?Di?3%xRkqedK} z(`cR~ag{ggRc;YH+X)PL?<`u1izzE2A_A@X7oqn6c0%j)_g_jWOU`IDyyTIcJwV@K z?|!EKWy+k)O?{8EP-lnA`rd$X36-D8sCA!|OZKBdoGhlOsf@fU8ho_RNr-q?B7qOF zfHRO#y8AeJSuF6$=;#j5y+oP(%cjwuOUPWl&~0hhU2NK50<=T$D$CIU#r`wpDBXLVgJ$SP&AnTenL<{scl`;`DtH zeGXYV41DK)7^_+#r`+M_`mpJ0IpqL&t*23LLG zFv?ANqb~;dgsU+_5?}=0Y!y~fb**#tKYuN*pd6$!4fm6g^`pRHMDM`+R5Cvbg5~|K zd$(0m{Rl$`l?`@DpYkPHzjH{{6mTSk9l5&)9&)&||=94}K)(uO1-u70L zzvv{8eaXzFWy3YfT{Fz=PVcIre2c+;6XQfKN&*`dk;#LP$uF7&`d!LY0rn^#zVF^! zy$a0={Wz^UUZ^8VF_|USMET1r%hxbGYvJq(@MOiQthPGjyM~hUIz|_+QwJKak{y&| zqEXZZ*SN$J-7(&2@v>AHX2Ysp9ZBq-xBS#Zc|>*#ok~q{`Mdi zb^eupQJ17FK&5lb=(dg?$Wd(U5a;&B)DkpMG_q(`ARBesR^g>%$BSkk%^~wNu+8H4 zZK4X~_H>-9tZ=S$>*0rwP#p>IVU0fky$J)O%>nN}4K>208DQ9X>W#uj$V(zDo6;(g zlL5{ZzSz$VTWB3~o8atOFg6ogyL7vnnl{P{DoE?2hk?y+Oe@Th57LRnOeVLv%*}Mv z;x62A4!C@4%F+l!?j6Oh@NTqJiBO)`;P=CYj%?G0T`VIim~*Btm~fm}P8?y*S=qZ$ z$`TOG@P-6lRyZaF%3alqd`=uA zlbn38SiOz>-ysG0CHTN172AM;FWWd_nCr_-&x>e>v*$s7Ft($o*?1m$e&0Ghc^B-+ zK(*~-))#pv<$@07xb<%e@WWJ3T#C7lt?0!5Q-PPpYIlz>BKT$2Et|UG1%<%G6Z4uIG`Whpn#65fbI;KopRv3#!exl@#>UBMId6v6w zY9{P@j{)&l>Th^qKAv>EfU;bE(f9WQWS-eh<(WB@RrE{xj!__$cZ;c9E%QDX>rT#d zr2=8c zjWMIfWrJubm~LZDd-WLR*>ILuUoB%iw7!bs5LjztwX$qyV{X*TJ|Yl?2;<-ovBYa4 zeyXIcxIWZP#F~(2_aVbJn!$CuC%J3hPDH~n-qsox*aljB^x5l%(X|>PGXfp^mf#Ir zM|)>EEwLuJh{)CgUfRd%kS&3d}czhIWVBiKW`yIZ0EB+w1VYrETVn8-_SIFhByEe%P`+`x|oloLu zN3bg&sMqU?^9TomuAu5D&72fleQoI6`QD@0?|u<$D7{}oI23@ue{Zc_ag1;{$ll!_ zv&*wsjz3Hn?)UjMT7kV(#B*H?E+f1h)VI>|D|zMEHfB|!mfIk93-jq?-?bIk4GOwh z(<+q5fLWW7yDd7>JMJ`0WeGJn_q=s4?DF5M2*-mhw_m)wZh~}9tMM-x@6A=iRF*(K zJ>>Q5q^yo8r2^WdxbNHGou?<>mxAQKw+hcWTC$d1u>bi&~ zLmjqnWZCmo-DoihXw;8JGhAVC<~ zlTzTYEm6zJLMKBBzB>L_?*#?wC_#Ut&;GCkbTX8nrnnGZWua531Z%{Ry(aVM^e92y zW2!UeS0xdrqX$p|+mp$?_lmUWBq>4U!S=$oK6K8Nz(;Fp(j`KZo&bWQ%Xp#f4cIfh znE&p2Mq1TyD|`MN+40(aX7S~Zq`#j|mD97y&YC|co1PHgZ9YVHer}`Y-${obIx<&g zO?S>#wxVI>z`h55>d3KaUmRx^??5BUK}^-9@5aN)%fbh+$C3GVwwb5@#BCH+fS=cU z&r1%W-KhYPe{9g_TvP7iu>+{10z7(ZR6#H5sDPm*&S5x*MH@DP4jiUvszDz7#sK}_D`|R+$nz`rks~YIZ#0PkSn$; z9_(8Axw|X=P0@gX8p^V{vBQ&g=;xvu^nC#9xlDM3yPO-4!T-d;_zaG#V=1T2>+A4q zuJvC$z4mqY<+KpJ8Xy`?)w^Qw@vD3fGLM_0>}EX;hq>z_Ab(naU2ID^_ozQTD7S-{ zuMR}B0`!i0sV^L?r5bX`<_>NI6_0p*GZ zRR7~2D0kM??)Kw%6Ss95G{50l6lYC3MucsNFXWadvicdlgtedvO6K^jkl|zx#ZFex z+sTS?_Ic9(FGHD=lk=PA4^N%l^c_(@10t0s#uCx@gd4%e1<~>HEhB`RLF<4oyy6sL zoS2l9B7_WnJjch=$15pW$PV0*ow6-CH6TkNPEqTi;08$c-hrY`j8UG+W|!@UGzvyJ{W$KsA$wtFa6QFU{Y3`P zjVb0wG-U?A=_5RR-=a`7Y{KHbddgURbGVz3l)f+JH1F=9x$ReEU>ahc(D69+k$yX2 zz3ZDic3ZlC5)JAA7o%=ZV}URs50nn7-8W+&N`o$1KYz%4vk_+idA7Kz>F=q>T%-1{m5h= z4UH{OyV?Es1m{ml)(p_mkMT+&dDJoVw+O~bf`!oKd-Y#kyTlZGR|PBQGYH-W<#p9|i{=s-}|oN|NVH zMjo{`Qo76iC;nIeUPBUX_SzNv^Zg9b&U6=43YQ{{96{6c393=-++!-5Qd&Uin_L1&5mb;f;7FlE8Oe?Ve`MMv`ZP?T>w!j=M<( zYvX|Y@EP1qDqQ^Vr2be{1<6gy_)ObB@UEmnJ*>k;i(%ygw`bYp48cfx{Y= zQ3|X4;GnXk23po;@vc}_6056$~-uC`@ zBMQL|nb(VTaGpZoW|_I!uqZYy`K0$rE*>8_e0%x>*CiR&y|{{YTe3Q034*V2j+_&?NR$&&D&ZS|aZfL&$q z*v@q^H63?T1}S$&S=h{SXymJ-MS!j3~-NL(D0c+!EhM^LlJ7x8##fmNQ zRnU6gfp0H{FXNM-0)`IKd2VxPuAXpG=XWgs%E^&DIg~K*-FVOK0KAqGva%j#{nn1h zNeM~43+JEy4fmylk3_Vt=R|T48Ax}e1KaFr9;~Jp;9JqUcz*1}q!~VSs-P;I_qm1k zS&|<`qdIHWn!b-{$twXRTC+^chNj<2om&Z4HE`o+)clt_(`DRE5*NXd?!GiCEHb6T z?xS&PJz|PZfq1lMi!se*&peslnH|J3wZIe7e5Ssiv1Co@A#5+T=iE1>j$*lNN$?8~ zwJz$V{h6oeJdItnUXe|64+q|89HsJqc8~V&xlDV)++A`bjJt{2>Y-&l&7HM1u^zl` z12T|V8p9qiKt?v^jB~HiP8%!aYO~p>8Kuti+Ik5`1N>G0`I&ROt`mF~CE3`R2Fi7` zQ{C?n?@iD)C_G)dcZA>;*uLbBuG#F-c0DBcSbz+8kybG=9`D2m_?&GAQV#C>B<^6s wL2u4pH$L&ikS6{rH156;)$jtSd)^e!in`(%+FJj4yK}ewnx(!F&TT*Oe--)3(EtDd diff --git a/out/Graphsfig6.png b/out/Graphsfig6.png index c9186ee2274d8b022322bb8079f12caf5d65d765..913073126cbe950a15f4307f6d381cfd0ddee6d0 100644 GIT binary patch literal 150439 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 z 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

      {QC%Jxy|b)z;>28T}m^@mKI*ITOEUY~7c8Lvh+ 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 P1Uv-m6IS(jpM-w{bmor2 diff --git a/out/Graphsfiga1.gph b/out/Graphsfiga1.gph index ef806f73690be52bd5e27b33682576f58726a405..7fac729afa4f04329c3e70c9bd6214c1f2535f7d 100644 GIT binary patch literal 378291 zcmd3v1yogC_wEq{1Qfxo>+d_xtW0u4&I-H7%9NUg{FBnwEc+wf7J4i;4>K3k|Gk?;jr8CpavyZ=~PA ze!coCKMe8<4GtOdub-&%!$U*;!UFy^W*-(F*0x^zUZMII{p_pSt6M|{_6-gXs~qGX z9ugi|Ii_E5bfBZ;Rmi{p)G=p|=)lVE&TjTm(Srhp*!%Yj4he`146_gQi}vpq7+@bA zZXe~}FFZWNJ~GfhJTf54K0L_Y)!D_pnu|xy=3(Ihk$y4%=4P(|zv!IETs`dD1rE%a z=<5FOKa37m!gg`bfup8}`jedLenB~?*0itQAu2F3s=B{lNMN6SLDlOAMh%D#A6VT# zJRq=oKyXy#pn=iBVSTFw1`P7A=2~4@S3SzVS7cz+ppfV&r+{cb#gKlxzuj>0{M!u| zFMHP<#$1&-Iq?K4ZbU_^P$)xTe$j&>{X#;9sG#L|s0_wN1rN=cR>R3d`EJPX@7#ZX z7Z?^`S-Wly-eFCm14Di671sl!?VEWjZ2P$c`FlA#+y6bIo%%DMf4&P2jPkK`QY2ts z$G&&DfWWY*;OHUcDp@*(`1J`4Q3nV7J!(I+R}K~Zlph9#N9Md#e_FxC*~z)DG8jE% zV4#y?I&4sAU}UhrrBi5dSk4@KryNJzU0ht<-Cf*VJzQN~bAI9%tNz5p*`mQ{n|F(|d-y%b?Pdl>}|4h%6;{{2t*`rE4-M*lP1`5Tho8ZmM= z3JLt50Mg$+{4N>)fkXfKLM0LY1A|7+1!feR_@SoAS*xql)mEp!u32gMW0CcJVQpk& zKl)n%P0qM_T^X^&>fX!d|C)br(OzwA|6C`!Y;GwoIA2dHTgz70|9QN&cZ5aoy2Gu+ zBEL+CBR0DI^TV~;50=?kXClN!hhL-TF1OKr`jCFasQmKno7W8z zi#uG49TIP&>-)q@+rIaW_HH+0MZfVI!+QAH=q!T!3*F|#CzHDl6CQg<1o+mq(Vfrx z)u*Aonvc@+%`JLO;dcHG!E-O_2XFKJ^TCQ z+h_Bu`xUhRI6hzW1aU2EUCgS<`Bl3=4!-%as6&DX@7Tt_e~aJq_Lb~;++)!sVY%;H zOV|AQb;(ByYxYi_y>Ne(DPnE0bv3`HSnHMyFDtU+B3Eq~J56YYwXS$tICa!W+1e7Z$LZi&r5`Um=4pCjTbewpu`o>#YbubY@QtE~Ut{&R)h#MNVRt<0+% zGR)lPM8>ivtESEsyPmfQKiem-Zh80wap-8BHiv@eik8hjcb(~wSLa-NXq`=-%eJ*D zH&;C0vZ`U1Csrz#8{6&)&uTMAjJ0mzT6Tk#&SA}P(X-I9q9t5O3#vy06)8 zsp4WXJ>qvEGs#m>$4rMOz^n(WhQ2k3OsaVN%! zqx(OuUXW#>TURddh?6K(?b}~tME4RaruW`sp)G~_ae{4Tc_?u)oHXfNrwW~XEaozNVVd7`NvcfjLc~p%*c-T0gS-%jm@Kobm zsm6I!KHBF_8`N)iuyC*Z;nngJ=DH#t#@cxfsf$W22@;nQmZtU{Z>|gYa7A1C$Q7sZ zl>$WnmyJ$TZ)~o+^1gvcn;Y@LKQcg=ws^li+rnJ+rT)MUwI?4B5G%GVS*$&0rec+4 zwP&+;W`L+=(`dqksb;#AH$O!GZ`K{Bl@Am*BHl%|YGtP8d9ZP$(eyrjMa0#`J&W3! zsd-+ps@ZeTWkz2*({_qdhYex+iP3~tN>{uqZ%18Zor|(ut ziW84~7p^b;z(mEqZsl$k*IY-4k*n*?ezM9$_3y!`0Xz|kVwXfMGV^zCb z?o=H<_^+{I{N(x7E)Fo(ImK<$p5FAllEZ-UqU>wmV)LpQ>ux;WEaEOTG#);0qBzv@ zRqmc|a;f>dW!H;^*QQMpof7B0t*|4P?%<|{;#P~vSF4tpBHr8jroE2LrN*{uS&i!H zb*G7`Q7=y?x#!Z&op;@5O5hQ@ALC|-%Gc-aiu+`wavtj8Z9VMuOmW;(v%JARBNfx{ zfq5I$-#=UQT<~I2zM)2{jVcbKnw*(ESA6+0XYln}MyfBzYL3WXdis1(dGCl5HNXAR zD)}3C$|v`=o(o0Kp;s3tkNBlk{Ihp2G|;5fVlk&q<*2U4zqE^HuREN!cFMJ@E=xtS zQC!m(<9=#Cn@!Sg)&^x>S-V^qow!_fsKrmMQcD`S-6%Gs$x7ilq2d>dsXw%j`?mI( za_VDU-!iL3NYh~{3vGUAl{)k=xnn)Yr)$Kjd@1W4=X}>HwXV`*n_Q=!t`nkPy$ z{jOE&sr?JDvU#mG3hOyTIyPDSO`Z2KU)87k|Jp3-ce+^ZR_SlrO7k0(fy}jH& zYn2-N?NE_f?ydHTBU{VZp4pqNRq96TbWl`zsRZ4{&5`Vd$ z)jmD)NvrgzSD&3un2kFkdS{oKA5-^}8r#-w7Y{tFrxWuIM24B4`lxMuW|h!1dDi}% z*HLjk?sS9sO+IRsx^b&@QRiMojtOJmlBFtL$kLAT%`cvw-tpYn;<)h29g(%Cb(U7C z#hd0XzS7U`ga|u*@?67fA5_jggWgQb+w!DXGpYFM8=XFAJEfP_JYDQwd`rz!;&zMh zp+R@vtFevB`hGRd`LwXHJ<;Y<&-W_Mvu5RDDCO?sKB{v731(KX{{J(DPC7zzQWUhz*TL9o+ORQ|0o`xZy)0gD;9gm;UOX{N}Z) zjkW8Fytr}dl8Enc&F;mgS6b!F@FuBLpVVC`;?bx7-F)N*OUlq>bL$CHL_*|>>_)*`!&5T)hRV?{f ze)PoR&$P<~&O#11{PgG39pB3vi z$M3qhKhb{L)9R14N{`>ZcbMO!Z`Vch{K>V=YdlhO;bZ@^Q%1zz5c}pvy{zc-P}NYS zDXH!wKi&`yB}*-8*dRlzoUdlSs9k1g)J-vC)v3lo%^#>5+A+Y)(c;Wa@xAiE>~Zbx zt3Dqax$|A_;;AB~r(5%8N%vIznhoxHb#wDnv0=dYjgyY2scVDsml)J(SgMGRy=9hs z`L?S2uezx8$NN%6=W$g7EbgajmHs=XWmf#Gim&MMb+3_BG2+G zr6+#Brt-1B^c9~W8Mnm!%@u~9w!Et5{;h1^GF@if7W?+)7%6sHtMsFpF50bKTHF!# zljny{X?aoAbLk&Foj1O^BU0AXscbbMS*X`kg`~kyr-xnKpPbzNmcArqr zz;Q#zALx@awnnr3%II!7G1BR=c5LMdcX}J&7g-g*6wNJ82t`9T?j-gWN76<8eC>LS zD|bdHXPS;?wYSs>PZx7OY*}Syc3vp8c*>639Vhsvi$}N2o=tduNhq3ho}93}--&yo zc<;n{W1n0W${A_L)-~D1^4$}4+x75nka|@p_4M(apXGP-y({`Rv`jNizAlvdoU-)i z@vNh1VwU&b5vLB`6iV%^5L<0^WxF(SplU$b30rTeYuz2X#SCt8M`V<-J<(|S9if~P zKXv^%Ids%*VOj75H2G)b>OW?s(jR%FHR;eIwZo^=!wv5Rf#By6v^(DhiS zyMA0sHMD&^KUq!X4GlcQ6*I6SvB#KhLC6{`&{ieqIc|w8F zAG3BkLz`5TTU@XYBX*C6xP**T=t>jlZy7)CeeR z_1Df{sy5;?@*ml;dz~27`bn`CMU6Cy&t7@wRe2D#Ry@h9V3-A>BEx(SBb*OwFgwQ$)!=wB@JIc znK`h-N-?zGtdW5&b7_>b-rO_O8r~nZLZq8Lo4s^OE{$@IFnejSF|+z|QGacn4cC)% zX_Q)0zEQ%PPfwPLjrC?9%4cD$QO+QqJx`46J9>$*&Ulv6ppmggIWwHEyJptjON&KR zywBsfamK38mA7_@y3=B@NG(0*OVV*;jZ*J#mb_7X)`~@<&f(|zGIN<|lstEGw(eK_ z!$PsDnmg{ZgzMZS%&o*g|3cb&hAx5hfZXFW+o^y{^dD`66V&i>C7qnP?OZ zrENU+)aKhfaoJPT>*7}vjZ(7*CyAwlTFn!l*XKr=dFR$BHM`o=3gKIa%oU5HUQY0d z$*snbv2liNY{DF2RKR!1;H2Cdg`;D`(g%BQo-G0s=Ou3YkXxhNOS&zomTa?dmPl^- z>ckTlQx(76JG*axGJU3~{@V9e>4B!|+NF8l)wvxrL(G{x|8>W0rW!?8);)u}oR~RH zd~tl8Yx*lwjdI>Sv{Xzxb#b!jd8TfW(|?(1l>XsgZ{*Fyx(VWV(1O2y^)u5bJ*vgZ z4TG#kO%Rn$Gkt2TH`6G!u3^pjA&LIu#MIUG+J!$h(dz>;!d&J2b!g3f%N~vpWlJqu z)9T*ud6jxD-P@_?a54Vin|%{X=FuqUgIABte{AeHRJ`oc;DWYm9*t7higdkm{e<-p z(faeE2iXhqXq3M2BVOdc{60n`&3pT?`prBVr7!F(7iw~}XpAWC(a^GAVGETH&5?XB z_P-n?MqXW9dPO@6jnaPyS8`hzuqRqPig@RmI@3b6akBP^#}!sai6%CU8rh^+sF-ed zD}1wZ;V7|f+mddLtt~Z5-SzJ`$02NYq$t?peRzCxOBI8y6)e^d`5qx+Up5-MZ<3{| ztC$U=Q_I^#h`R|(7rZ@Vsp_2^6(7%M1AW!rnPn)_&pXp^4N|lJN-oe5;+gLKIc_^-ac#jxQm^8i%a`I`j@SdPsOxV zk>+!{&+IMSJ2#8%GAN&leZ=GZ16y_Q6AM4Bm@;!$K8qb~4m)~_A$=-&{-|!FYJ5w*+N-#sDy}a$>j#}8N zcJqgL=o)?T6}D+{6Yf^FReiP#`u-|7)K}EsykX{-Mz)&TYw~L5^gr?}B~>G0a-JU) z?rW>!?DlGPlID&Oo0|Mw>oVR}qnw{x+J=o!>{LhGwR22tvDQ}2x6qVht}D0I5;o7; z9SA=0+wL~2Q-$8w@e%cMo>7c@Xsh~H#6N$^qevkJkKcH4rEvj`(&N|OSQap(g%BG% zTuVJ%wt!k=I|fBx*?yspNOSm=aZ6J`jaUDiJb#ws>yNz(sQjAOs#G%gT^&*Pc>8SI zkp)!UAFBW9&8bQnF=*DvTu#dhsI~5AlejeNxhzfD$65C2}5V3Zs3+9p~$X zgVG9Ul;guk}|Y_w}#!SLN)jf33eNy<7iUe^vT|{e1O#fPcr8tzcivH*N z>-O;`8vSeiRmnm9YyDN})B4x?E8#~tD}7MEMt>z-NCy-LttFqy7p0%;eb8S?lgimb z|8xCSsR#Pk`YZWIxF|hdzeaym&I0<^`m1v9tbeV)D*adgT7OmUVfC-|SHhWchA<#) z5FZo=%_IMaBf?%ePwHdRUx{#tO^2~)}i(v|YQfqrlOmH1WeEA&6tUn#fpHP4iA zCcDa6O23c(syutpzt&#~XTpW_LR=D7WP>zGJ#=&Tagxu?;?7F?d%0+hG*&ov^bviW z`s<*s>!q>&Rcc9No&`!ub~j8YE%oz`TRbGYpKb(7YtI>3Y4twnuVyPPq1w z+6oP(OJg*zNW@6VzxEe0q&Vu$ohJFx;8AIf-dFu~bFWN;_9N`czbX%_OL5TJQoRpL z^9aArlk?Qk`>MYZZ~nFA^BT<~ZIC7jQ_=xxx529)Qf#DC;_}Xg`4VsB3+aWhC;VtF zar8QKlN1Ndqg*AdJj%S2@^bRY_L2?c2y{wouRc2|;n!i$O3B95yyK-Y!kOy9yey4m zgLoqw*K41bFd(~xDd9r%D5ncY$!9&%266r^qLhRchuf8#3cmhhumOk-4ci8sGu~9DkwZE!VHy&Hul5~Hg zMn`EL-TRSFiQlc83rqXaJsqtjOetpw7g|g6sFsj6=)R0JPWM8zANgk}&Q&knl$9)X&L3 z#1x)IQqLppQvV=)QvPaVTf#+(f?6{XU&b=$wMr6GY$2bb*Jh{=MCz=g@?VAbP!iJ zLmH!+O&X_pq-UzTv>)k!?xX0Qj`pM4PBsj!b)-qkY0@d_fX;uETci!@DfIl5Y9iHB zvP-d1@1ZzIc4~wVNcI}NW0YYh;z~!>6v^X8{`Y^ zM>?h0NLO?ZMp`4iP<^H|Fg;HstjI3ukDmF`TGAR}Pqov~c~rA0HtHXwaq6{no}{(p z3)!VJKixx+UT8nkB=JFYh}KfP)GvuQ!hmv>@{Krearu&TUZdDvE-$V#QosKBd?Mv9 zov$co2p2=OLFYt@jr=2=iF49lTuu4&gv1fWMn2Ph06n81E@>Y5OlM^}mryM+RBLok zZ0P+AX^rYGBS*XCkb z>HPqTBj#aSX+Nus3@Hv;OEze~sqeN)Hppk&O;e?K-QJCp#+qzsDfxFWqMl@f{HuMc zjI-fM%vO$=REm>IN_idlKk~U~R zT1z%ayM)!_sn;c62&<4y7E(PW{K{?KCgDf1k#;>gOq6^Xws@2Dy8zTH$Oh?!`U2H8 znnyK);&?K(vV;}+OnF4Q+H!4;q>bQ)^5^<0?mI5cBaVn)sg=!PcBfE5d zA>EV4i4W2w`9krMT{@c)Ea9`WZ{fO;t9 z8=W^coSrV#al(%@PX5L0aFF7q+C(*$a)xr6VxzUhFRdjF(HP|=>4jn=ZIJHCF5yRc zN%N>qQeC4sCC?^g=m9HYoSWF7;&63*DcSUWju#m(W_Or^E;48|j{MkbEKikqyF`G)ZR~!f(m6 z3sQZiXBm_;qyxGKqy30qI`h+gGWBVyozvdsl6nPkNg5}PNE@`4bVaclns3y9$u6DY zNH3%fx@RKJNo#aw$c#QOJ?EmnPxXLwN_CCST$D4UHNt?#sK(N{*ic_c2c$LfnR*^+ zW7V%mQV$?LDEA3J(gEQ@KGV6=P~B5~p|dUJ!T}+FmYp?qLb% zQTv2c!>GQPU%w!6{ypb!CmX3>|2+Sr8bN1}6^rH1*U=dD_@@3xBwy&butt9-&F69E{G+{-#WvH&G?^7IYFWnyz z=XBPiT%~6PbS9*nrdmR0R*H9HN%?tQs#RsF{?XX(@?KiCJpbF@0Gnx@^Y?D2(XTpl&C9Dn()E)jaXKK7CBjtjjSP{R3OVH_`wg0qBaghE9 zd(sBQ=2`Tbq$`ToP+tfa;)whstx?Vx$|YexviK57Lu7+;n)FB5Qyer#`w><&k8mbm z2rJ@}a*%wc{3RQdzg?=vO4vUtuv^j}#YTKk9ua=Gtc|7KLw$?JXupIK@@E73%m*ODKNo%ARii5QA&HlWk4dR#VQhtzKijC?J)nd{v;X-`S zJgTu&n*9QJ(TQ{b`9N+;w8Iuwk2)QT8fu6Nqi7*WP^O6o=j^E z?NQXv$u8vriObG+RnY2s!Mi`KP)Eg;hD9;H$sv9&$@lqU=TNE4F zpm}sgqP(1K*Hr4Eq}}mD>Pq(u&FpQZ-q`VAs&vk_tdJnhtI}_z^z5JJk=-dl@@HH} zBu$h0%(BjVC7(+jA1?Vq`_(yMChbT5J^5Hzx`&|sDBg{(+0t6FyQAq8DGoQ^l9GR9 zmwZ0Dv9r!d{rczm!P{Tk4BF4zskVe)*;b7VT6@$sM2a`+ll&Z*_PbbQrL>mDNPl~# z4wE!aYwNDBD8**-evA|wVQMHJWP>zbxMpREBf_3Ep1J?56bETzc=$$X9>tMs%Q9&m zX_xB3UuRq-{D>pMnKaoyPQI@tpGj+!N5n@b4`)d)gdg!nHfU_zv)K}+#0S|JZM{?a zoGM{u-6K-M-Z`m_WS4YRv36f+9_gOqATCJ4kdy)A1*ydPO=VyEKn_#en1cB^%VYC};XK zm482(Vxt=IC3c}?muy`5EdTx+)mXAYxX{`sQ;nsw1?h$ADcL3LX&zxudLgY*pC+Ga zKk8-VGo2Zzp3+)6bKQxkAmt@#jdVr4QU4&047HJVT7KS1^^b5N>?s$BH>zPYMmUpy za}K%A2=ggxO$`;jlS zA7Mp0p#6wn>X%f<>D)wmCS6glrJT0A(Ov2vq+J@Lx&eF#6YLE0rQ1D76` z&Yg8zhe{Ykg+38R>eoNdGWM*UC5=t?{C4EedF5JGlE!{bULn~yF~~z2qqQ{8Wn(de ze4(}Zy34;yb}u|x@+EU%sAPlIK0P*B!qjJo{27dgG2f(l(??B~up*xa&hwCbG4XFB z`RpE_EX^ZK7X!;X;_w*z(cxGdIGXbWfOe z3GXdEQ>FZ%I1JS(-V62vhQfup)kG9%-EF zAL*I!BmanB(lhZ!=L51!{2Ceu#YX-SM`VLArTwT55pRSG*`WI#$`2YNyM!relJ+B? zX)XCoe2}gPKblANlxkwb4)SN&o$|@|_K&{COZOio6TGB*p-RJRO1Xb$pZs^c$j1IR zNzy&%oz4{x8mV9ZJd^SH*--cA7}=%$Xe{QweD&Y{8-zWrH8dCKj6`;0XZDwLN;QIXN;;r1ii7Z@{y}53 zA7M{6$UmA#`9?K|cq83cuGUV%na;|jU5bsk?6b*CIv?z`E-j4_=VX_93Sm$C(LBQ0 zP(4$;(+gs>PIVG)6X}-+q*93EVr=epK6O9$`wlqIl{4lGYMOG>`lv?b12N z(EaEhjPyr!jW8t*(fO48qu3195alZQOuP{vG>_sStcW-Ak1(M9Xdd+d!is7WaYR^A z4iZPSAK^!1!0VqgcbQr z_!0KxGsQ+W4CQ0tobpl}gv)<}GvyZL2gN~r(D{@!PWmG*$u5o2GXTPh#wg#2OVUuw z%SO6CwMO?d6dUbFSdlM;J>f!jNzZilAsvu^q#?RrrM^nfi;p&}F6o}?DRD_-l+)x3 z;YYENUT7`hOuSJp5a*;9szYRhc%yma4wjOzr`Tw0T;A8xdvY@tT1#V9OXrb#)IH+| z(zE)qK~1DFF|xaqZ~Y4W5P#-iw9!3jtmixVGtp$DuebdFGj%CuEIsq3c*#GqYgB%k z6kCli?Ijz8U!BV#Qfv-4kC^1d`{cai~{3s6cZ)o?!5+B4H@%#L7?Zba!K(P^*lpmxk!k+viUkDdN#|Xd4 zuVzbFQ67=j$S%c;IXFZ99U{Vj_9H&X7ut_7rFe-WvTLZ;I&O55@{({NyN1>SvO%0v z&QLB8ex!S{L2E64c9rS|#YS9`4XQ&|FFu!S&|1A?9(9?hTifYwqkBMitF;+%Y; zIvITaiIl&jE5gc9|A-IL3&lphkcKGFNzb&_aiE>V5$THh8^uOr#8C@B`TwD$cxjAm z5C(*4R^~iO6rm2p5Wt>=Kvb;0!`_m$)PwG!N~< z{T9umT1WG~%#xp3QqB;UKRicEwS@FcxR5V2MjVk1(gCfdUYmYE{ykUXi2S27Fx7VA zmvl<=$S#c$E_B8u8^ka9N41V{CjTf031{+|dJpwvijA~E@zOjx!;zlJKe9n*F0xBw zq^tkt-o8rRg3{TCdIf2m?pH7Ul_k{!(h%K45O0Jj;X*!>{z#`38`+>ZNY7JK<^SWF zVk2!(E|7n;AFZVxMKzmrML9?q5LU_Ke@Z$aKFBVe1&BAwL3;j2HG*QJJR)BR14GA% zBhmq3N;W7zXdc<6*vJ>!kMu{FQa_^DXpH&{*(DuNY*cs2XG8U3C|0x|ttAX-9_0ef zBi<+nX&(7PHJf}P8gyo|1pW5#5&&2IMo@r5Z~<(>a3X(HQx% zv|yz4{?X+NbtJuP@~te5^{;tJT3f!qjdT`myJENWd@`n=sdTm=yXONYOYcFF&nM%Z z4cd>^l7B1qrAt1KNh%;=uq>;%WS92a*Y>M~6~&u-VuECsFj(E=g7h9$XnJjFE!j16 zUdeK6B%i0}3)2~?U;lhQhjc*mXukpryGi&FF2pZsh{nj5#Ln{H=%#tb4@*cGP`tzk zaY@?nt`H$%KpYVUq{&x#<@aU{)iYsF@zNM!MVu2yl$Z1GYNdQ53T?Q{%_V2ABOrzI8!|!8>C6%gKSVPkX_0x;*#(q-BW%%{`f+wVZ;%|M!k&e z(ix;dj{6bho6@DY-0@Vo8DeXt|h+onq^+Cd!Y6)>p{*g|} zXX2dfQts1!^c<7orL}|=^y1?YH}`tmo^w<^SJwQSZ%?UGinZclkXa!iC}`oHuAwBz|c> zinrC)5)yvI8~IGSqWy?p!kOYA{n37fEacCRQ!Y?$QLbJ!&n4Bc{JF;(gcZd`HG<;s zE*mXzSuL`ZG)8>f+%10&fN&vgkgjN+PsTY(M!|6b@#rtkmeEgw3cc+;Ya&XJ*9d@xutdgrZuD=5x-Q!NLO!fO_OX;Y?Qymd6Q%p ziKFimA4@j&Pg)`ILHR*zDbHz)_#jPEZqa^|qMGRbZ!d zD$l>4koF@?w>5Q>{39DQujZ5dk}p03e5L!8r!7`WHolBCk;ZPG>?8S1xVY7rE6pR0 zXf5f0?9zT@mo!AYEjuRvt_Nv|d?9`b=Ti+5BwWZppASPN?9C2YOL;_kxz@LYw3c*0 zdLiAD4k$LVQN7$r$rs`%p;|L(9_1=wMPr0B#YS9GZqZoB%oOdPb&ci`R>T|ma?E+Z zgbVQ-_I#bB4a%dnSL3AqMjEF$Xg|s$(hJ2KVB;^vMsbi08Y8=;E7A*Tt#_cAgca>a zHH0^3)L{ffO6}5MpJ1&su8r7;voFU7s9G$M_za$JOkEqvDo)h*I8|4D!G|i)$NLW!E*2T9<`lA{~ zcBz&SE@YSZAiJau(m2f{ZIC7j1FA2yAJsp?#ZZn&FLYKWjS~iRKBYK_qxl~4-&3G@ zoQZCcQC|88l$!5qvii+ znf9yJDNX9tu;y4$>H5MK)TPzCQ5hei1K|B)hl2&Xs-- zW9^5ol3n6sL~Z&1;3lj*mdfvS)Jw6IY-IU)N@IjG#Y??33rX_~jf3<|+OT^%(V*B|>-Ug+=`?Pnv^G52Nc$%SJ=(94<`FKmmg4x* zvW8@%@!D} z^>3`zEC~bRm#`=QNaN%);YT%$#z?26ANC|L${9Md&g_0x;LNPDGu_F)@oKx zlH%Rd$xMoE+Q|vhShX5erFh%Du#m>SZ>=I}_ngCKDK=V5aWqX@B-tRGX^ecP*a(;H zjRs0_3>z;0ZE(Vm#>hXiOFq-Q2Pp$3Tqriu-`#2Q`(UKW53#i+{bek$mB!4+wv>D! zyL<1*pAVxrDBd*@7bFeQJi?DOL>Lf9v>#zb^C;fVuRLoRsbBv*?=*CtQ;`-1VL-7F z22@K3Q$ul~{2+cQKWL2hqq;%&y=gANzw-8G}$2kh|4_w;Zhx< z9#Es%A!#1%M`MHw*&tkqBhnSEeRVBMhhxk=_1--b#8QpQ%m~=Y$K@1JW+#7WqdSqP65R*`=D3 zd1b70mM6QEzk~s4lI+rcG)Dc6G(_4Zjgt*JThLmC~ zJ`=w*Mmb1!sg6^vBmL1B>5BA1c|`S@c%$<(`AlPU1}1)KEzKjGNvE_Q)fdtb;YT== z4ro7$gT{zo;)86^TI#hlMma+@k?^BlOFomJ_8JJn3^<%iQJ9I;SPcpPBe%5g@&v;<9PJbg$-JX|Qyk;`(B~w3g=i6hd+tJkj# zitSwYza$&9-$94NlFy_orx!(}d4xU1OS&igmhA2$*&zQ&L!>p!d#5A}NaJLeVj~P_ zE$M*#Bdr-4FU3Ke8;U*oJV9Gj(i-WH;-H+Nd6Wyz{fkPx5zd4u#X)&a_))y)mu!+S zxcXWCeeA<)>PYjt%x^7?B?!ACf7Ta@mwYDO8`o_uVMRF8Jkm4OUD6QEBhG0a)riiW zQlvO27pR6&Um#y-9@!;r5LPrsSdn(A-e)EF8>AQ7k1!>zkxt1j@m4`sLG!0}NmqnD z;XH5eSSjAVt?EcRpxCH?&{~Rv>Llep){w3-L>N zL~Ds7I!{v0P<~9WEq@k_FrfN3=|TZXyA%iI3}H`a3q#KgGlmbAbWd^2ou6Csna;|j zXX+o6M}$4)5!E`vg|u5Xa+8$PRKsX(n{T%ytSDZJjeMrsM0JS#Lyq7+iu6ZkYN`iR zhYkhEpI0Frkk6z^(gxv7=PS}K)fXD0I!PKLO;TN>wS)n2PI*qa5a*;T8Y4|o%^|&z zHmDzw4Z@1zrF^3?(jVFV(Bz?%=fpYjOT1B@6PL7>&WY4NNaKVR&7;^Tf2p35)@Y1; zAsd9Lq5e^9gemEdbWi({f21|aY03rCAI+osXQ&O|DB`9fTh{>TR5LOD&kqIt9*;X=7UwT|vxNPpBXNzXJ!_c-JWVLWc_XQp*_2))J#XKCa*kAEOGh4)o>|g(YT5DWO{=N6e`_a-p z`<^_tYa6m3VM=4PUztvElFuiD<@bti4UUoGAU+6Z!nCHBt7NxohXaz0v?TdGuVs(Y zrFm^{pOVJN7m9=QOtF#AG)6W^rxfqgE^j1UD2{PGW=I+*tSB~GOa4{XB}%?f&d|K8 z%>$&hWdM?TX$!i6+Rxj?y3xD@KyRf-M!%$FjXKQX8-@=I&UF2zAMNEvi z-G&LZCI5(D;w{esV`)Fi57LHd%2p`{>D)M3+qA-i-&qA}7vX@fYT z+^61698oUNS(NxN)IZ{gdNS2)vP-d%4T^(!BO5eEc4;2f14A`VK9f!jy}u-mXl!e= zrPLQl_tbyMXX29T8u39orG7-(9h7`lI!_W-#3kh=)k#`Qc}d!!c#mGokbI_kK<9Sq zdBhvlCR$5elFziCp}MF2D1V7x!i9Pxt)(6i+v}=yE}_`S#^P2tB;M#AjMma~719;u z0{KVxgVd)9XFAi6o~i#Dsux2wN&baxCDlZlXFbJ9Iu}#!Q+=WH z8r3?gVN_!YKf<0cAb#m=L3$>w(OHT(GE{3+i%AER)70|_KZ=d)QthPrLSt0JD5t5u zP`s2Mw3d7!Tu4LId#KituE;LMOJ@tx5Un-TXNs3{mGYdhr+DdE6={uhMO+%{3!SfM zjB=3b3*|JOV~IE7hUe$IEnfl)q|PGNqbf%bLmdzT9c42uem9#XE7rBjGspTH1xaKPWA_CtGx`bGCs zei#%Une$TpX$2Q&C+EJ(VDylIflfJ&+J_Aa&Dq)C(kV1JEN70rle4p%tFxE0r?;z% zM~xb8?m0j4i&cN(>Fnv^?c(a~Rm080!^_((=O=*y!G6lJ%1(}!P6Pd;T|NHon;QT6 z#@{bGuy42$z~4Xq8!0uS-+0LJ#s2S+{ojXD&CSW(-NV(>)7{I%)y3V_P4W15EUr%8 zF7Dp0&Tekb&h9llUH?Ca@(&sRF!g6V-v1|Ns<}J4xp}#`db)VIdU$xccqm@~4#(Z8 zhI`J4n@0_IZ!Z^5FYo_H@i@f<2KVh3-77di&zq{<-^%>0@hDZnk%4{zF_FR1fkr0A zCPqd^akfTAzkdDf)l1Q}b3LQL!GR%0%D?{!Uw?a5*XVzSJAXs+TO&s9Mj?U!6F~ag zhu;VY9*jqYwtrvNKm|L5`A%%G%g&E5_b zjYl2Kf7;7RH_luhc7AM?~x4&65{wp4ZGRb?5Vb z^|2ZLZRPrlaiZV&jTh^sS*UA`ca?}b*E&w*Z8RZhSE7Z^anlr^WRnA>X094863qjD zmK$fG?l&Op#>&sfhl%!Q>du?h<@egh?+5D9!((O1)0p|MQs@!&=t-IC#DMeh*`Zt6@eRBqL`vRvhnH8* zqbpcsNVdoq@t`n)T}um(A5Uc2xA;f6X&o z9BTP$Z01^X-J&74gwyrf-<*$yir)E?OZFUUuG_oUO^jQ*r%3fuAtHCm`rQ{=n(KxP zGxyQ!X2Xne&Fhpm*DVj9ARg44nvzm+fN0*v|IwCgGo5qop>^U~+~_#hKSaE>^&MXF zyqU^n@}v?omWog@=St~9Q&yPi9M%jMXTEhG{`^3w@S6R7^S5X--3Xu4B4Wj&5<{+s zinMmO>kVjPruuw2_F8E3>7gRN(7rpjOa0#O?pVtx|7Rh>;riUDrteKvT$Y`vUFFFA z0piTuD60dfOm(`rgGVgA2F&Xo+h2rqY_r;Nv8k@fKAkq>ajUk;g+hf*(dxAphMVfv zl?yzw|N4?v#(zbK-8b`I%~Ri0XMUr?p-xw(xAI*WB|0y7(LdJCRMl?EGb6`xse{D# z&S#9Dy~?d>w@k6Och)?K5i5$VTh!@jZe2~!l1Cc)_vm-_#1K*c_88aGb91ZvH9Fn+ z;`GR2;@Kjlg) zfEgybEAJZ!qvf;49yt{+bfxEXxfWoe`Z8$qQRmKC@gg8S;$1y&6BVoLC$^tGW-&_S zSmW5oHu68D#n%cbHnVMfo+>o$!M11o-s$=@}X%7<^!NoT5-94iVvy^(*U zQ!W+z>wDb_bm%cw>|4KkeWr0P)juoYJ!J6iv7&pwS)%7nBX#V2%&SXlW5x+1$ALF5 zY&KGL@Os#pZ?|%f7i*rk2(J@wq#IMVnRanUt3LVCCWywHs+ezWZ=`CsX$ujQcqBo* z>Tj{Uq@$6}DQ=s#!K2m(?gmU2WjkFAwfpu0hUdU0oVnxY7KV_TZ+4qEhP@UZY#i6yI+f{Yd)wQ>$n#ru^XP{Rhnw4Z0ty zI(OMm?c90SeKc8L8^w;EEvDU#=^owar&iH(ml;t`g-_2BH+#BGY4`SrR;k$yN4z|{ z(t4h-zn^)~b>R=y#>*>N4LXO-7r}m;UfS0Eq54v7MDyN--U^jItJoVkjw|tD!xr&nP@ku{Q?j*+HpY&*H*{0rHc>abRMAJV*;=K>dX&FA z`gYoOF*){D!{cSMRW6SkjoCkBMxwa(WzOJL$)8kQO64xxd|~nqQEFK0b)%v_X_X!| zT#WseZM;haeYd*NyW}S|wxsgS4xe(}Ew;yUbm3^rdSFCOnxM}uY>u-`IuBSh?xUfklN=%(u zchB~BDhBBpO9$5&eN+Tkw}_nE`Q2|WeS?c#Y=2B_ot|e^bgp-*HkN&Gc=6TsxcFpq z;&Qu9Z?(#q;YOY7_Q};w2r+A9F1L1XRetwQs&LD}@uaY+G`Nq$=QnC>HfL(umd|}k zta5yPG^5EIb>8%I#bOR8of7U<1In&koT*iMd_ak+`78E4ElxSziSPCLwN^R56m9?P zVVl4+qO(ie`=!Kd?abE2HQRi;UoPD4ta#yeR;0~%rDA%uz`=}}ZpmV}r)K%0jF(!a z$Jh258R%hgPFQ>I{n^?5rJ4&NzV^3Ho;xR2)N<-sbo>idLzYghreubn7p^{Q4`09e zT&tX~3bzXCwaop3IH4(7YL4S`RYMKR7i?(fcu{n$H+y*7Vb4^bPi#tW6~9v@gH8RjFNvXzN7cGi`l-6sWdGvJH~OTAyv;r@nmX`_s{31B-X-6srHExM z!oM~<_E@X*-`hi`SjKj{ESy_E>0(*vvFe{=lWxa*9lb1$we7M0OyDDxk7Dau)M!@f zifG^An%#uG57pd1+R5Vmh7ni9lTOWI8(2KlD*dRV_smXZEU${#uE%bgbjwin+@r&j z2ZyIz6_!1`YaHA1K&>xDEA~&YDtJvS>6JJy{^xzQ{*71`Jbe7ZYr?5drB6Ps?`xIw zX~8cZFYgCj7bDNs-u$&*y6WHZhU3y66}cf+UHq$m%+tGSot%AjOGv}S8{*_uJIAa^ zY1+KqQ^dQ3=e{NC+!W7J&7KW(x}$1$>+7DE-Sedit9x1NUSGbYt{q@>cIb$VRN?e6 zBe4IVR27#Rd6pJ`bMKaD^DM>TsohO=Y*gWP2a@;R7SXSdJoG?ht4 z^WSe-b-&j&?MSD`+EcD=#yPc469=*v`Smcls%q$?uj{HV-gm{_?-T8Bue+>O&NPjO zmrP$?;+`-vj!Ey>G)1k&n=4v(>i+niXlR{Wd;OgYswRu=?|u5+p>#3DZry+Znu8<-Gn_*R;0Z zGDM*b1#7uj%~f;Xcl67Wsg)lJ&EEKx9yyhMp-q&@SMiID5S7vA*LHg;MYJ_d~U}uR0Z-og|dLy8c7Z z{6{?>io``Pl1Bv}6w3K!*_+m1uC{zA3e;QJ_jIUED1GaJZLsNz8V|*JufxwTR6MSZ zZO}z)cjbL3#ydS2a4r3$Q2NZ89?SiV&SeOVgK6gN1!shEK6qHN%cm{FGsM?ojsqXG zIVY4lZqun9Jy-qBt)v;9(pa+Xh9zHHe0#Sg@s zxTeE~9=WW>u}x!9$h+kO5fR({(2wF*g`$m{$zcVY-rN^0qr!f~$6OQ2{gKH4n?X-^ z+!s~C;(c;oyRNRao{%@~TGV}!CwSJ#3C=fFOi!AwsF+grzIg1vMrS!SRVZf=m#0ID zZHP`6$9nF`HSPH=p`164*Yr$$bn%{8-sMbP+lF_9a;DJ*bPH@y>z)|i{`QzTtI||H z2K$V@d*Q%c(WTX^6GeaBRr#n;xT~jKg}cJD=}*(e-O`29&uiD)@v-Z~G?7qlV)^{t z?+Zmk8>m?}4a$B}+^?lKEoa?c3sN z@$#nEf-+Q`Zx)T-|Gm_0;cK^LZQ;TXh0^nOx&3O`GW3?%Uf82yr{fQWl5dx4C2xIy zCRLOwc;v}~h)1g3D-%amS!}~Yvium?z+T^D*U#NO{RW0IHpZZrs@Ry=h9W^h7()XLJJKe-%-eqy~ z(~9%`Gk=d=9g%P-^ks@@kmVS<0-v&HCq&vh5X^j9ZZMy$^i%KgX4XHT7HEj=%OJa6%4XNNbcHtKZR zy6`|LUMMum#wA}lz6 zveCi!LOFw2wftPZ)y`w0!n1aZ$`<$_lruxq$ktH-UdKdQ(1QMTgFmP~4@&If`FzJw zG5c{^O@G}7mETcgm$Y)Ka#S=8C~GygXqJjqnoom9o44yku7`nl)`Vq=q}?w?qUAl0 zbUU5c=eKF|$&*=XUKT3e`Oc7!M@0Dj%wbPTepEH&RVuXcm!d~R#a?dB&7(gGrDlK6 zERwoQdpJiUF(oUX`>5(~p-u3e)g2FuIo%JvYFzG<8pq&{lT5c>JS3XkF*+PPTejMJovhhK&KQ*Dp=1SQrej}%w1h*S{Kn(13vD*0& z+3MQ&Gxol_uzA0zbfdt}SJ$&uUCpjzz0mH%K5?∨GWjeHO}jH?sa5o6rjT#N4Zk zmpP67tk%RApY5)0t-V(?Z+kzi)t%33?zbFT#%y7YJ;LO&gBa-gMb+-W9l1jWxh9DN zt%CE!R^HM2oXpdyhKbgmOL@A9Jhn z|6=YfprhKBz2CS%5|SXn2?QrVu;7`E+s5793GVLhB)Ge~g%G-Nhd^+5Cs=^sU$3=K z-+gY^Z+vgPd)^!4GR7I5Q+v)?RsZ^z%+;Mv&IQ|*OJ$c2^&@`h+-=yl(i?NdZ7TXi z<-`47|Iquwu;1Cv#2($EdRLe>YhKx(dR`VBTdG9rF`HGcW0zX*U+`0pN9>5(HA0GS zQV+_eDtPn#Po>R-$<+P1H?D6`^A0z0`d;amt|K`8fUkKY)~gz(WtY<~`=w**)ca!Q z?IqSJSM%eQCBOXA>+bP0Swj}OtW^g~=j_w0`fnYBtK(+)H+j5T^*PwB+_2TZbzbf4 zxIbd}!Br}E$sNg;{`jr)G})Aj*FTM4sUAjsetf9TA60xq5mU4EK_|-WTcPF`E3y0j zhCg~;TjdabvPq^DYJF2xcBF%YDP#8_)ARG)s^n<3T)8Z2z0o(=!KB^Gvbpzga~!!$ zwYoLNe?>zFlXlnG|G0Gbug#aLgK5?dE-=Qyq~+1IptP;KeOs(jH$L^~@Ky(thV#&q z&i7l^S)}^Te^s^4t-ocPFMNM~snY@#d);f-BUeY0*1I2OO}ykiah?he$e*rH0Y{V8 z7n&@3=05o4Ts5&l?J>^H9ZgzKj(y-dXnOcu^(3;->p2r0P1^jNF!okrx-xT>>1t%% zth*geTHk+KzghCTUUSvr6#Juh-~ao(e#3&#Rofb=66@Xys*u#lr1hDlKdJ_G$`+~W z&G|XyYN(S*i<|%5u+ixrMX2qUGbXfe<7CqAu%>~gO3!*lC@=pq&Av=?GJOaDQA;5m-sxdpLLG)yc;#%v^&+&*`(FyHY0z$SW+WG6`t;MzR?_K zlQx5-sn_L6)RPD`^L$8=mxr89OPe(}kFqw=a}6TZ8?U-c2EB4NY4b+*OE(5P-j7t3 z|LW(OB$bOv>(hVEG$~!B+g!DJ%DnJ}Wn4^JkKcK($<2bN=PHM@QCD+^yO^~8k?ot) zhBEEvsb)#;l#ZV7qU&AtEoofXgL!IymEUWs9dprbK2)piqL(4_Rf#IBb6Cw}v9Ft*o2SN(->@~qQdeE?(12}cyH=T}9vnZLYU^oN-M)(b?^MaTc&;kt z8b3Vjv#Uw#@mumV>M;9Qq?%ve_xXiDH%_jha~e=A&84V!7L}Kz4VN_8es4g$I*=C!O_Q&)hYc^|`zC z--8jhSFOL%SY(LvxwR&Lt+4idO!1lB4RpY7cXWOebOWA(5 zy=uMD_OtDkFwo{E+kdycY8mDQ?=`)OL>Tm2f6oC|9XQXwNon zXWL$>W)r5A3&bn!eFNLswpWU;cCWDgciSuFmiJ%r0%y{z%~G~=Y_Hn02iwoKSHhWa zA-+&72`kb;oTMJQshRaX9sS=wy|&u0(}I7m7p@kvlmkZ}vftaU$vPqHlBcAQh5Dx# zde=|LDEfJW%|(RXFW1_Oy=NVgn(b|ITj43zk=~~D%8I?&D$EcvT9>NV2w`8n^N)ld z_$$5>|5jTjF zgemcWxLe`PFX0>Ulwx`Ny!<)|vW56U*b{!VmtyobUVcS1t)pBetcqm%Ao6m`@p=L) zj1lmZ_Qt(9uIxEpfA0#RW181^AtRir9?VTJ2^|zS(s8wv{8QVcmoOzAu%g@|{y8_fA+UPAZjd;SWP}y1i_Yg^v5$G7v#*5S4rB5O8RaEmn!U3A zSuCrX|9jt}7?BR*5a}iUjmxoH;77HXWK?%4Zp4>9ZYu|rd01ww681nQf(sqCFk-aneEO zQO%)RLYUHC(o1_Or-@fo>xe^Chp3;EeTXSMi=>`M+@=0O9HM+9{?WaH?l_b)G&hkg zbl<1Bgyx(*^G}F;qgax^q?c+K*-Z7BxJH;#y{CH=*+)8vYg8i$7dnsj5`HDO9~3=> za)Ejj%{0_!)}AOQ<_+qY^J(Fwh(@V3)KVSi_vvPc|f^9{RndlW((>cbcdz> zOSlmB^xTKIOFfTbPFy2ClP#o!Y@zdrr{o*)itb>iFLeH;=r*t0SO!F0SoN|j~RPRYI$%ucHAC$i|7n6NdH%Kql zXPSp-FZo9H`Ajb%W`44d_V%w|KevZY1Gi_ZX+nVwbI_nB`+<>$zL zop%*_-~8?-bbL6`OPoh~eJ^Ad?+1_{10L5A=OumgNccf}Ne7)b?ZZ}~gKYNOI8FFl z=)*W6tFpd^urIn-IiZ8>D|I51IFI&@sOKxz9WN|@N8;p0SE2XFBL}gU{4HF+jo7=b z*g7F29fS*=cdX)FaUR){e_C^4bMJIDgp9DiG-8?1LHM;e)jG^R7bxZ*Psq;+c5%!q z_8N_4{Vwu-PQsMpOIWq+B|lF?93mZrGv!R`bZZ31Q~1c=vq{J`;LqxnWPjQpUwHtY9Mk(cBf@rCL$#eB-N%>sMk72!fPk@B2uroF@$$`9fs z)d;FDRGVlW>81IFcuyRscn~Ma7V?+$(riY!{Qe_A`B*$^hU z)@|cnWj_m052bvgd1L*_8KRC8e#CLIZ@`YM!e6RQRAVV;D5uFc+Dq}Jy~H7sQC<>X z$T#8!@t*V&ew3HAj_M@UHS&XU&?xVzR}hB?E2@c9cj=BuGa>PS<{ZK*SNano-)QC{ z{*iqR7mpO@5zZ7}@`Lz7IYT-q_en4HWa10m&xtP-bDB$NFV$0u2jv^_o^p_EA^wpL z!kIWpGY#Rlc=~x!pXpf!5jq;xA3(dBa3kQ_^EIV`1c@FW9>I-p~_(wI7>OJ{J zSkWv+_EGJm_>#@;R|7?EQJ#~1#rt-KvjUn4DW|EH(9BByZb&bm*WE~(Q`A3_?G7qtwy)2#d?Li&tU-4S zt?S?xD`xpTzLmv!-YJg>*`U1J#k0-qev<^R#=Conz3w?13HvT*JSb$Oqe1GaV%_>G zt%NPKmtG{2vd>~RvAOz3;c*{#7W`{?QNAt z&X~mAHkne3_!7>975Ph8MfbGC*ymBvSD8dE7{!X>OSp76`MZ?8Uh;$ZN7xfL$hXjd zD}q<#uTfhF7m5+tM_i+vF&az4eni^Ef%@*pnY5qw@$WT1PmOErb=tl5&u2 zru-!xl)sIG2MX+;`0p0{Bi|?ZOm-2)3l5bRps1_4<2^We7t)m)CwTb*C zoGE9ByW}rnMdy*t)I&)xao6a1dCa%Xpf?PPI@U9 zC@(1&XfM?gsyTEXVM-Vf&ct2HH^PAIquxk4LwQd4QQaUJ`AdFKZjo=KgVxcEM0q(U zbyd+riM!(ml@<4eYJq;DH#UgAA?EBP*(Ql~c{+^{&;Ds0>7Cj^e#Uk9p6Q~`EN!$; z*qq_$P+<$5SNedPIFIam_Bo}vL(qBT?}mb3#a`08qv}-QN1-z5g?*%#Y(Bi9k;Os( z_s=um_kXq;I%~4 zZ_Xdb2;T@(qwyde#PO6Ra*7xc_Qdh{sMEp^;>OS(8^k*D!*TOcv5vS)^&t1D0s=pZ z5#dan>@rN=YsqHf8s!niqhXN{!56}h;zl}1Htxk7fhom^@^@Xql6CXTa+_xs>gnx z=p`MO6Xox}QH>=XgbVF`HqA-Q7Q`2-r=*v#r*(uq@rAfXeVS~h^Qf1R%``JmJ*B-g zbKUNhP2?qUjd(?Iqy9lLGOFXwN%_2!>L1}k*i$Z0+^B|;jBqCV$QI%nok!dt9mHqq z@l?a8-c#<=tU~7z$LTz}Lr|ajYW+LW4*I`;?t@fIC>JQ^WD8+W_|bV}3!O(;5fA7* ziZAs`s^c^_5ub@y)N3iHQ(tQ)`Ui2BWK=gOMua_KO0y5)M>>eR6wCHYj*7XnY^`vC zL7(tvg1dXy%oegKp+64Ub399p976VI%5tIOSid4dMtf;pfemR4*+P50o5|lLyVv84 zuqD1{xX?j+pC6ebFbx|dKZEgjzz?x*#;7R*E3&!g+#CY_LN)1E3%pVt-pA=vaiL2J#meAPw^#g&|YuPJQjOf$TzB;+s4ReY2-)5 zq=Uj=vgNvaag)6*#QO{Zsf5iGOX4o^o@}AG5jV&_;sM!5dX4s9vXAnT;z8UXtOj2l zAaEx9$T!MC>H(i`3>PscTL@FC2b8OX3&o8vC5{shjN(FA(RozY$TzBMWDE6B!hq%j znjI+~RIjKukzV2{@qpHmjBFu4C-Q`~4i zAiWe{qkfQYWFN(dbP%R=9@Qa=8{tAa=-xy5K{C=ym=Y)HJhGYglFbwk;uYaX>!_Ym zO{`d7ewIC-x4hdw`94zIKhjSsChkHxhL#Yye|x|D9xu`n^=^;2bKY*0J=#J4_s{dh zu-_Fe_A=5-=aFo{137z>Zx^mc34cjOdr9we!kJ`7&pTPZv+$QNE$-kga)I^|&LpE4Wu1CY=pa8nE*m0p zfiNY#gca@0lVO{{h1Ojv`dV;YZ5`JVe*X8R17fAg(!gT_td#^T;>CnbwhB!jIMwC&@lK zkM@!d!k+dT%>|l~NbkT|T?9|5Mi5Vl2P7ju2tVo{B%|{Pd(uJn(K^aEsyP%l;(gA% zbp_5eD-(CgH;QGOjc#H-*y)o|$SCHdmwF0ePv_A(!r3UF$zQUMu&22FCoNMzoIXBkt0iWAr?_gAxCzt`VlhA(~IgKJv{d zhbULcW{MldgVvEBgcZe&>>~{5JX%LRfUu(4L@^?)CNJh1e z{3SmK1Bx%5M|>eaXqG3v#38bUVnjMPU9q=`I5h6AL(@nnl5}R`mLVOLHL!v)J^!7^_u*>eDZB> z;1sd<-RynBmI`SaiFM>J#m#AN53_wd=)B|=D~feSF-SLE{(d*f2tV?J>>J!HM#O{S zM)7_5v{Z~e2IL#XlJbLiMc9*lWDDV9R7Utsc{4{~MR`PABfaD==HN{EJ4A#5ok#H? zTj)H(l>DU_kzS)*Yp@}o$VnaE$_6=7x6K8gqNg?uAhh(na; z#An)@t7mEvBjOeHH}Z{S6r<{`<=>$se@R9<2m``2A%3plIK`6m5~iesI8HXxI;xW- zqZpAb3y;aqP)#bl(NH}lZjdcBhmkFWDPcf-A^fNxQErjVw3m25>l!zd?+;QuNJf4T zF2rZDk7T5Sa3SAFFU4{k%pg>EDVC&z)}dawZ_zrcb+qo=Z28QRa)x60D|ED|CB$dK zg=`@i#fWqe4`?s-+WQCO@3~Tp$Ud5ZskT#miKn!V^pcElp&65OP<+Wgs&#}j*+)4@ zIFrrPd#ERqZ^RAqm)6k?M|>vxNC(Yaq?csGtN-L~pQmhcG5b)jAdb_0^Q4fei zbcdk05vGI-*-ZQ+o|12*gZv;qPrD)i#x?my+@M?_`{+E{OFfEeHt~vbkT4*u&W!&p zctG(Wy)+9@+$aa>`5)B?@{RI{Y#|Jc$|y#}1HzPaP=3%l(o4RPEp#67k1(ZvM81)X z`V8qM9*}QTcgbd>d@+g@okx2K16oJ9KwvZ0WOX?pKH#(2}B^mif zHJkh}DkGbTrzE3Ulz2}(HR`X?y_83@henEfGI4`qM0W^^hfy97esmt$Lb0TEG)IsQ zs;6Wh#fa`@gaO%1da1^e%``{QI+BqsOOp2%?;l+{Us~{GW0{;n)}_Qnu{WrTub4&a zEZ;4jPY&qhDrO7Pd#>FS@g5}Ee0*exq4Q`j*|&WEePQ#MJ^liNr3q<;UOI1oo$mrG z^4DeJB%zluSk?Tzc#kUlekrk+^cr24KFexh^9=9q76<*`KcCMb9?&{E&woKvfgj;Q z@g)wCjBMH7NPb5*t#f*uPGCU(QamV@#Es(FdI=0DMuY)z@{N~#Z`LTE348LFWP}yP zoMJ?IIq$AnIV5iG2ilG%t8AaMjRsUW_s31aFTLAv2k6oj{G2h$rjp69HR3=|4b6L z5Kk%QH%Ru_7Sg02Vp?#sE(6;#9iVQ z#fa9C4)T}$pxRFHB^@nmJ`r`2>OJ{OSdm_`k8+j#B|cLvCf^7v@{Q^#@tMve`-r>5 zQ_2s*#jT8k$-bA7&D48n9brZD2H8w8CytX2qvsJ{NJcfAVzg=188N>QR((>w6S+V& zf_O^j(K?DRagzEV;Y_uJVovrEPswJAIq9X`r}OAJCizQy2`kDYvXA&;l&5LklZqT9 zZV(2p~M1NMkqu-29l_Vs1J~({2R;Py~!8wQ|v8%_oCR_w3+0(c_}>Q=f^1*D7PqA z%tzL6&zo6pq`Ks zroeQdGpPLx(QHKB~J9e3V#6*wbFB?SvnlNA;BI73G$>@DH<*enj!5 z8b-W&e{;IfLB3J`Qp~HIDIj9>bK+B>BWm(;5f91_+Dmy(GKvRrl5&gAo7|_0#XcTX zhbZ?+Mm3w_LD-XCk`bQ?XY!X~L@}p+PMDH!WDCWJ@H6T!*+O-k>Ja5V)h5D)<}ivS zVNbY_tZ~a=k#B^HQ&suB(^MnK50X)gh|lC3o%iM5WKj<$4qqpFW2FporrEK6u&6Jo zTFCFB2|pr#H=NGvRjKO=bCi44LUj95L&Ld2>RxKp#BOSD^#It0=mawj6#69JC^%X+Lx3SJb zcKvu8VKd=UsA!~EM=_$k!~@bx=aF9G5XEij5&63w#38bU;!8N6s4z+3LiUAy8Z5AP zJLn_wi1>1)V>+>yctCt1-V+bVH`0+m%W+`~#b{FAYGNJbDq%%3!kK)dSW<40tU-LN z*}ksPI>L(LMz$OYi4wR_e7nC~E4V>t7$u%bLC z9*`}BY5b+h76<*`KcBZH{3t&t9)t_oH@KO6RzUu)FP>XqKzT&HmhzmiC*LR+D5q&1 z)kMOI{P0P;MevVm80n>2Lb#A#iU;W>ZV<<59dUy=Nf=Olq4TKz5iUk!M0}xHnK(`u z(0odMP>kjkk>964>&OxWiFJE!_H=AhPeiu)Xs~KiC7PE3@w`@X(rSUAW zF1nkqkkMZE(em#s(|LIt-VyzL`|RmrZVwuEOX&4^c1qdT$#iM53K?NVI;y+AJz#%c zuh)Bo-do=z#qVLP`P4+{rFaZ4CI1FDVO3;_e6OQite?=4&^lDe2xsz_;&y&xWpN(G zDEp=A7JIBHMnjM96Y(Vu#RjGj>x}wAd?s$Bem>EVZw1RY7q&DUH$v>~(bvIjk3sW# ztHnCPh4zvk-)a;UIx5Hb3mI{UxJEIj7!hB{58}%epFbjJ$YzQ;`Af31h2;0w{pyv~ zWFL=B51I?4ko&4eG-Fp?2Zi9?jDwGT89yr zd4wP3KE;FT6>*LF2jv#Ui25q+C9KFd$`9fTd@VoM~*keVxPc?^ZF={i_A<7w=S!XpnE#e!z_=~7(V{&yD z>nOg&p-=F;+^Lg!iQc{0RpM8+&lA^UKBqL8HtPAg(b zevo~%*R*1?@ON)RH{sj#;}e7|Z_!}kZ{1g(LiTe@9>LwSSvLvaXfOFubF54>g6n+dDD!&_?@FN-7M|#O-TK6!vr@)1LBmUi;F5d?uPJS9#O7QQ|d_N&` zA6rA%LVEYzmY)wJKgi$Jz0L~`(K^D9I7ApwjOaYViq?_8joyTobkP6(^SsmOx_qgs z8^VBmBMhjP5T-_Pq5PouQhtz(&ZD|P_E9~}>J%e*O7S3DD897UsEl+_PobQqSP}-L zgE&MwjIN`-WQ);t6kqDebRP8?!hrIF;zs?5){!kFqq;#l$Y#n_;v{i{a+-9IeH2TN zwmn20q8?DR+Cj07&LbJ&LOKW+iV^XO_P#kUe}AT5Z}~Y7;u_UD!jx>Gen}iMs)Kx^ zdP?V!Efgb)FX^Sde)I1MZcttlPk-0AFX}kyHOd#lnd%?)X|kElBMuQyNk)EH#(1M7-2wli1c>p_g?UYY^FL%F(+K89uRjax5z%?5bY(K zNiWr$_{(F(EKhnVe+dKPBWB^T-d9QG6*Lq=WWSuO%7f4An%!k9sZHOk5*QW@#-y8%6P@7*WhgFU_&!2kD^m z2z!!IKO!0JB@C!nj8b#O=d_jm-LPwF;Cb`F(PifdHcqY zZ)cn37CPv>=&UiqX5v-8SEfie z-&o;q$C{-D56Cy_AGDYJpgKvpPx(vpAMu59m24r7(_Yd`b%WwdHIeEr*+TK9Jfgi6 zBbp~EXDB~rl#-tXBMhkiO+N20xJ!Oe&JgxATNs@gW)AHycu#&r&T|nq)2vKB zMA%avQLQ6fh`X74ZxlIAHH`Mw{&7=aMgEd+WHZ$!szYQS#t80F#6Oy;sUA=rI@nHr zUWIr-HWMd_8-z2>SHxYaFC?QnNgN_hQeC6HgaO5z@|yoH#(2%Gxb5zK{bM6PBBWGYPaZ@ zGVoviF;YV1J9~5)C zgVA29u{1MK4$}K16!ZI!{4Ms+9>_P^OW0G~=sd!na3&oTOTvoIqg#HXhd!0(k-+S-I@AW8E%E)LoGNx49|Pq?IL(M0%$edb##lRXCcRWh-c^pYQ>gSbKKj*Lnv^j4fyO4vv7rMP(< za1!THeh@cYW4DMLq`8y!lD}j#ahLLvW((?9*}ROm-rV4xk@#HdJ4@dq?cwSk`eET8x$kTed^s5BgzGuMJXOe z?V}h`Po|npddWA^L4Hu&NC(MCFRi0`V3gxzGx5~u{gPrtvMqg+h`vC)r~XSeQ!J^j zQ9OvJ)Q^a}{mz^g^CV$Kv824DI!SveFNquE@8K(tgw0eBXl|#TM{%RtM0+WgWHX&- zl=pNV->8jbcPS ziZG>EVvT_J)u@IM&J=UPg`RmB^^Ix-`9>Tfo)WLfH;pezN>%9Iu5SC@ecJae-@0$> zuz&mifB#&iZ~JiTPi5P8?A%@dIk1nuIfF6uXYIds=+Qg8 zbzl8IXDbkrFQlU;>^rDu`+QbQ1H1PNw;tU#NxtyT-K}c^L##iw9;p44uW)E+p<)G! z6f9UQq)36{AqA}erG2~3t+i!2^W{pCuV>r71&jRK|0()k|EF#1zU@2q&@BGffBqLV zx(j~;ARQX`-(C5CZ+hOs`K;E47AO>2sCcnL1&S0d^k2Rd&Q~-fv|zE&!i7Q#6)9G% zcNI-?Z+dleTyJ z*6jxL?%cP%gR_&fgM-5`KL>|De}1=YsZlwkm_z&i?YlW>|NGzY?_X9Gb@<<5&c7h} z7fBo(y0!n`0Mfr~_`62@4-ERBZ`2auf1vQ+w^%AJ_O)0A`s>-G-yapYc~>Q|{{K>O z`fqROudNm|OEqx7VC@E}uY1*R?V(aZWotCqGen&axq9{8Fkj2SlFiLYyX-%+V(3t{ zu=U2*^IQ5_t`3`MJ|AwLQsewk)p7O+$FgO7EeoPYn5X4yIIGpVp{nrFdI7Jq_*$m6 zeWi+R9&!76lA+2mAy?iA7hg-N;pfdyo)zn|`|Dt}q{{DcgU=H>9IrCj1;aU7pt4SYWD#ghP`SsdvM~rVd_@G+I>+$J{GsIgXZV?11}FxK1%g#Q2TMx=ia(4&e`8? zb?P)m`R@PW(_*8yZcCG>hu?Ot8?QE{SzBUzxVPnjtG7CQ#iMQVc9T@aA+JkH#VM zRK|&`j?Sr;RM#=+P)7AS<2)7hviiHHK1p>ymV1_OQfkRuRj*oN+G3ZJSUyz9sL~|H zCf~e2QoY-}vf|{(B$l_$SDJ$>E&e=tbcCAhQ@!_{MoBDH+pbaT+&rqky*^uI>-lv_ zzVv_ZT_2hvZQTBu%5rJN>5=z6EiI<(46B(pk5m0F(^b<#e|^5Z(o^S}I(d3sNZ1th zCE`n9who?_N<(s)XBE9Q$8Y8YHS5drzXs&;wD_GcsWqcoPinM%tO{;aZQ$uQ9+uFO zsm+fcg)dgw$EcH0pI4>Z?qQiYq`P_Nk5WZjR~)6q8wEHEg#fp{MHky3*KHDcp3N`g%!(d==WUXJ55; z>*Cv$7P(rqoUYjGUIX`4{Ztv>O706=xLV2{U976EJP_V9#Q=4u*N1{{GP~;dRXIAN zSM@;y)quD~EyA9<=zKYL_ECueDF-Y6A{8gkT<@aW*JJUPT`8UoQCsG|-}9)eizVro zQ-_j_DLbgyjbW;C;=+f8^SkKW7~q+9;9%F0>T%-=-V;7LTV6Y+H)X1Dynu)2C^bC# zU9p>cob~fkgt+Q$Kq&odu&((^pm-D^zDcZC8H1#3Z+rtOvI9ei{KdBtKD|~VvI73aHGViTVL&v|l>%QsTzAH0Tj<;pf zv`*`2xz@|g)Z4f6ogGVOt0Ohul;3sNLC18*?WSJ6BO_Gv?Q?s&u5i$KFz9&7b#pe% zRf&FO7B_6?pr6-z=ENWCcFb3E`n*25A%}yW`&l0*^?9*;p=!1<&-1TW|CqJ<*YefZ zp@D}MtJ&cr!xlIDW7cc&qpdsqiY!y7Las)d9{)CLIdf}Ky1sG0m#g2Oa=m@h`L|ii zt^G}|UFh<0r7FB{c=<{1f0+x8nW84VO68U;#~RgTaNMH21OApRpBGg>V9+|XymZb_ zmwx>;Yqc(Zb?DepPd2D)4#TSUAN$j+ad+UO0n-c4-K@NhU0RVg=}&Xl$0t>A$0K8E zdTvu?CuIM2Xx0z2Ruk(uUU4Y;db=7}bx5tYsehQYn&|41{ByIqJJnY2*mds9zMD1P zfA3;`TkiZW^&~dypH11mo3)x)Jos>?_4)Uxv=M_E)Y|;btksf1d9&W>HG8kB)$qcW zgo596Kjy^$=;5AbzZ#!5$aO(fqFL)(lNNnC>lqiN4&EKmth6anKd*f2^c~Z5j8-3) zpWF5D#8-XYhcUA!HL4e*a<i4TjkwCL*k)wZ`+*iKnHfJjMt#zvI z78UX8Ow@%YUvymjZZ z)iCb~O;F<2R^KHOo=e?Q4dBR{avp4Wmn#$4uID_+-ChYUP36 z-CcfuGT%C!#Pm5j)4uU#j;kBPP99%B`jc7f)43ML|GMCJLivg%SoZPm2gnp0}~j7sl!?9%9s@6B3YIJIM@*T55JRGllS zbLA-T-mKNm3m+`CPYpS%eDmLSnAhW-S*t@6KMx5>TlbtAx@YXR`$OY(?AyQF-#u&S zdG(@Xz7{zrzcp+1G&Y%cOz*-MRJ|kDy?V`iW6p5xN6fbxuO4q~a8X$*kBW|3{aTMv zXxn-F*0zaN!54FPaoYJx=kxoyuLoZWyrkyWzmmF|`K7sF#kT6s_!A#v9$!)}cZQvu zbMA%Ct1*XiY`VAPvg+9;NB=uFpPT!PiB;W`tR6S6XPmn8A~tKb=g;)>Mn8Bve?p}z zs&bFPap4J1b*%D*nU)5pxvF-54jR4J@u|+g*-!gBUAlTz1r9wQ^2g_ieqJWOw=3#x zyQZc(4Y*$^{bM~BZkj*7dJ=wJB~A>SJ~P)NvsTwC`R531ne2vYm+VZbo1qW&^ZJdB zJa9bzhKh~s^Ez|+2Rc@3@pY16di|EZZhPE_N)LzMRt_x-{Wa<14Rg`o@60RLcS@2o*&TJG>-Y_6 zy|0_K8RXYrw*q^2xTCfYyy><%$5oxUyV7Oj%vxXl_*S^b9s0GI@%oOsV2#_X zubY%MpSCGjdESJnca%qs9)ris+M_gE)KklwURQ3b4c7V+mLo=K`Rh|Ttnannx7C_H zuPY60aYSkJn!ooh)H0tq zc~i~J{w*Md`MlC*srce^E8P#dsrroHur={mtkP;{g}05fHQjSVEgICIcE^pEl~#*i z-!awoItmeOjhZ;6L7sUc{;v2fI0sul7c1`LTLoq23n;$EuG-j@Bz3_Eu^67V}|J;qsobYW%h|YZF4^ zRf(Vobu+gAt>fh{sGS-mm^iZ0eh|=SJw76yGzXk z-M++w8w6`d0=3lRrHc{ta{OHEn8g(@* zYsne8YEGg`OqnWdXR?!9BU>F(*7lL>kJmSylb0=HuhuoiC@aM;H5va+X>*Rp<0w=0 zz=P_gwKwkl^G)Z5*Mo$pt_cU!E^80wEJ}V{f%=^ z{IE-{vCaZ_uK!e8|1DW0SCO@YcB&p$hl|zzrL_LL?aF~X3-azz#jUf&oHM_a*1J_g zixNMNZBx$HAiXR1Tjz_ZRUwb;owum-)>)-m%x{(Z@n}`^W3Oy?eK)Cj)|qB)=pUWC z9&ZNk+_z=DYHgi;oVNeb{p}q!wn5W1YgMY9GhMf(a4>1PuR86kxAgRCHKf+Fo6TxF zn6$oH=6R}aVZp1^gZPqLlT816-I{hs4jehNLRs6^=>2CLOj?co6mWg#*`CXlb+m2J z!QIiM-D^{1zUtd1*-~X~jd@a(cQh?t^+Qch*dAYN<056H+MmNC9ZebrQ$E#O*mUgz zb<^!dT#pz>lQzeC)$X+5#_M^?+K$#|`0i-Za@BG-M^>-&bJePHbB3M`buwu)VfjKU zzVta9p*$YFs5PjMlfJjd^alCzy_ut|BXzbM+nr2W%(s4jT={d{Y;`$f#J4MNoJ`tG z)5~{I4kxGC%9;x2N9S@jX|;Xts1@*Cv42{nLIaA%BbvD$LsYH4glQugR4fk!)@6!}z z9pyhgZ{%Xqdc}yIdrMBuG+9~4gOibwE+(zdESc%;9GrWivZm_da+h69T3zeZD0!i` zXU8jR3+Va5$JM0eQDjp8cXx-4Q^%}#l4aFgbzJh+e3E>DD{W_hYVlJWj-KEOqeDC}q7u9A59}X42;N6^)m_-Bf&(YGl1LH3)MvX??I= zb>~;RTa8pP*1MI<5H~$W!@uMnv%l+bmBo4o+quupr1hZ^uQ0)f?-b&bxrSNvl^i*44O{IbfiwZN2+Nhr64!8vEhNp`asm`>DOwJ7VXJ z?k0`9CtH8*yLeb{mCkyX40!IY$M;5ug`4_C_E00Och2KM9wx1Kr`(p<`b{(uT!9^r+o^5VyY7XX9wu$h4sEAuuQ=95 zrLf+KhoGS@AeNXB+$8H=<|H~#?~JK@HEc>*Rm%EI;q{LsCT)(W zxgha#e!p^Rh4tCPf?`Q^TgG0=^mf9!3d+s;jG|({q^8T6t@#krWO?1al~h;jvy6lt zNp%d$Y+aXZPU$Kt*80q2WqeZ8=U*Gm=l=32S+R6gRmA#iq*fj;lQs+V@fw;Xd{0%i z(E1GJcSkS19u#})bi#dYRrSaEtYy<`FO$~y1KuspmMU3Q)z11%rtw2BJ&#iQS1mLD zePwmp`s~I%qqm+%`5PojGrejhmCyQ&XHOGvlQx5Nh`zh|Yx)Xmj`dkk+j-u)zx&G^ z`+22fS(RvgX5@FpTjxPUjh!?4<}<10)@MtHe0}touPnW%Y*<01j#!^Tb*t{9^RMuq z)LGm|mR32e&#KZ+_AzPw_sPQZ|kA zCcEu0Y;w8=zIyGn$$Vnh_3hpFzst%jyWHaRY+pUkZR`4W|5Z6~hp(>JCRt*>6MY%=dV!`!oZ`RUl(WTs8)KMcw3XVUJqHd&v+aknp5_S5-n zldY}t`*^O7etKSh98`1ds_7rXZl=z)edIVlllH9Oa*v)qo0q3mUN7n{yuQlMq|Gmu zBj^0gEpsTfZ}`}JNBnd@o}Dar#yuoN^&Y>W`?v>wCT)HhTXXlxRXGc*HTADFy7Svl zx4CFy(NVh=6je8}{wZ51gTIcI>yZmzLdTR)Nv+SMCztd$X?Mgon+N91_q3D>vp&0i z*w|n9SR4?l@?qUP|bzV7sa(YnG)1+2gpM_7K>u=KL)6@$S{GWC=sq5Bf z=1+I~o3uIm;H7s#r)HY|>zTW@?r#kK`72fb;QWtFtEcwsNT$_4`*oTh_A+hevX_xw ztrpv_)87?`;5Iz>%aCg@>jdN*ss(2zP*fMsr4EAb;K)e2C-kK%_{aXtqnI+C0r5}kW%lQ3 zv#7m{aMord`*lY1h;o(upgba+2~%x;wzp3$mA}PC`Jv6|_IruXMq@-aYrVo=2jxD+ zO`E;#_fl?Yvzh%m@`GwD<;;D*WG4Ibh-=!t$9^51M;K6^8?BR+A5_Q5KFU?T zli$KlHlIHlD)y4UufDbuzP+y|zmekgiw$BO>DZg+qQHf)B0tEM%Ic`#)urs0g>S?m z;_lTl?qcuj2KwhatYLaE!WJvyDRGEwA^s(vPATx~7rS5dU*i3v`VYlkiV@}8nFSSv zzmzkyj%*?P=sb$Y$J(QXA2(*mZ{Z{!JQ;CG>?QlQUym33J6@rKz<_d#IPN%8{&j8Q zBw;}7s76p8U8!|M*z8qony4?&BII8ue-*bwU`1Seo4LMNcYW|qp_k%D{3Gn&=a?;Y zJP*ievE`ZVmEu9?QGFq$q&k3s)@uQ;%;2YGXfXN8SjfBFY%9Tp?W~G1SY^*z)6(tB57dozyFg`b)i*ctti7Rum)3H_BlM19%61Mf5~R*J>mUb#Ca4q z@{ML{syW1G${DI_REH?$)B~tKQ!gXlQ~nZ9iT9-A?JxN)bPr4~MIKSE5(cq;w?vJl zy<{`pYpHKh&8B+*)e_2c%0bdgd?B2v9?%_!@|@}m&CfIoP~D~Zg=#TzoMJ>6P<(05 zAxw$m9p!nKzfy=A+bK&{AtU=} zW*|-ypJ^TOlx7g}je3gFd5E}1F`}HIJSW~0PmRvIWDC_2vW4m?J`+JjmC)TANfXiKk|d}h&V~l=4kdI{!#u?uORHnKEjl6p>@P@;x4VD*_QeY)fcJ} z!~?RK@`G@pnSt_+a)$2gq?cs0mvWGL9?e&jm&9G_74ah-L_eqALp_=1Ny;Ot#WcUr zy^QX36m#Ml^(cBSfHfQ5+a~@|F3>%XY6P7}?_fXv>9aK9BXNoV?tNVFA7>Dd&Uz?p4pH1ohXpDGHn0(n(v95mFG~#nmq}TQLMzJ@s zz!_olH#hkgK*+w9-7<^46|USDzV!}mBK&9*dPxwJLzi!`ItSeUNx8PMwzId^Ye2YyQ zDQuy9TfITPe@=SmdPE7mR7)slD3-)O;t<(P{3F@O>m`NF&5vXfx$rXjxscWEcUWLg zaiiKvF&g0%E#i^k<_2LO!V> zgA`xVvHP_A3@PR1Cyx`N9}zb;CQB-2Z>p1o0p%9;M#`BEUDk@vM3Y{M5!FP>!D*`& zi-kjocG%U zfiu+?ntdogNJggOns32pxK9JQSy!YCD}(kp7N4rdBTruA&ygi5QnI4 zkS&y3WDChsR`C(Bq}hUcGUXQCg@{8GOQTrPj7hmlGbVA3dN;+0@{;nL?r+qm347u_ zeZ zry52x4eh0TqnOhiM)zdO1qMWAMM0rH>F5yfviZAtFx42D$ zI;McSl5P&}wFkj=eX-xRf-uzzqZvxpn{+t%_`oJYAp_R$=+Hs^bB9`#G& z0nNZ>%W{Sh28+Gi*p#8X;F{hV_3`FQy(JYq#D@eKZM`~o2x9qA!_dq4H6SU06zcCqf> z$jr*VFD!FvBi7O0+h-<=XTxK1$nV5@wqUNwUdPnD^1BY6G^r$><*vUpLfG=-?ON`9bU2EZZzF@JlJ*UnQ(4zLb~5A&Ljp zVv^Bb(n}an9isDSFU5m=qrIe;>I-p*I8M1rdx=-n-zc}JKGS)lTTB(4%(^Q<$jD!+ zSL6rP7tBGZr&O;91L6VsLF*{DOm5B=`~FKDB3mdPRPT-EAjOS(E!Ahj{zH9vcOjdp zmr*WI%qfouE2>QtBl4H>h-wMpLba3Dk&OJHT0(mXEAp4}l5(146ieb7?WLMcc~13! z^pYR6j^azar#zxq(q39eIZg2}8cXtna*%jHItXX#@x=RX-Q{N+i3g;E@{;Bk(o4J| zf5{Kx2AxMZ(_UIfJfL+{>qtiU5l<<%ChTw*GhAZ5=HebYaF(Cw$y={g7qa7SX0dnq zjk!WbI@X=IEba>-ZRK|MfoXjGn(yU`iMe_P&3X zh|k*+ro;n^+l++F0)rM^MjNt^_(FTVibM#kHr>xJWOrQ)2wMo}gDu@ej0k7q3vqH? z!=1tw%FFK=Mv8S5qkvLdl!N~7pU+(zjmNON-X{CKFAK}hq@EjhOW1NY;k$?%<;P-k zabX|%Ha%pOSeK$&xUi4-M>bO)k<9Y8wa`noll0PF@{MwVxJ&s)xKQqs4zh)Ep=6h< z0t2e|V{%P4+w+BDPFUrtdsyh0ygr+dQ7p-3+Dn|IdO$ft_EC&TFU5oE75PRulOIMo zNq*3I)B~s=5%yGvs3sC8i7$jRi5H5rP`5S3kDljn0UBV@eL$JVwctvre{*l<&(P9mn_1`~n zBaYK~R1YY=lt*X_%-+<`Ne9ggg#ERtp9Eis8x(WGfO3%RGdgFJUc!p}AYPGu#4ECS zXN$7}E9#+SGvz{_0Fz0l+P`tFgI`G@Gg|M<4vrPMMK%)#G@sI}N9(A*P%op}M7U57 zpxQ(nr`)G|3e`2jh3q34&EquF5ZA~z$}N%^y+cs1p!iZ9CqC0UvX3w|Dx-QzGKx9X z2*QB!oH$N#BMwo`p>>2QS5YUMr>iCIoY{(36MK6V&L{S+{wtsGgLG6V zCGXwK4^0<3PLGv$p}QSDL|-_Vf0nSBWQ2j&j79>#15OWxErjXR8zaSD!iv_p{w^o> zj(y%$U`qbdI>MfKRl1G8#lF`Dy!s&cLfDgxV)?SM{H~40?_z{+#5Ljz#qxCR10v>> z9|Mk;HKZ5$2RexNx!d0ru_WyObjvT+5f2C#(m{O2Sb`tKd&0iec6omz{!z}5AJ_Uk z7I7oJgdeT@Sk+BnO5C9QCHsg6ggx0u*i${2(>d~gY%}FKagwka7Z5CRfBBR{hHN2R zx~xiLwy!0@Tjeu&!hqsN_?;|SK-f$t2@b_<(HFX57MbW4FVmdzw$lKH>}2mmj6QEe`s> zf1dpl_D21nnn>7FzwFyw-t)??dMTbW)bbc8INl;iezv=9rmEupk?H9ekuzSoG6>mk z?_!2@%=nf;;P>`oC2`)&91X?2o7R!dwD&^)-a^ORn+wIWjCBD?g^c`Nbk$v)SNW0r z3_*RDrvg*jOL6PmzLl_rWON?+Mp%(v@|Q53SxkQBiEJSqgbVpbaWkre?4$S+R-ZEd z6rVjJn;YeLFJeUJ&DlFc@Zi(RQ6d*8r*SXXM>gM>K3(vX{HX0HzyFG`qP@fosvBe< zafA3r+$H?T7K+h;k;g^ch*udpdYkR*J?S8<$TzY%_oNFVMr1SbnYclDMA(xbBqI)y zZ={#(qdHDGL+26Bw2oxNE9!%^j<`V>kRN0-#e>eHy~GWw8^kp_kK#eN3>{if@RV?- zy_CPiHS_~&9oa%$yT4oho-1Kbc|Pqx7Log;moOmg2?N54YOK*d_+ZO;VKd>TAB0u%n({qi@`H5HIW+^W@gP4aMuaKl2dy(2U*h<=#2=zg{wI3LmPZ9|3S1~glt*MU#ge#7&sxYgiU-+3 zd&#$g>rV(w$rjQkG@pd4$#W z2lBl;!k~P^ox)$ArbWd2u$yACi*>`k9T2iM7vy&n(0Rd&3YzV4NqQsZpuLQ2&fru` z=q3CJ`>OuFLT}CY9Yj2;4=yTjp1L4Pyst~^h^Mr-=f$qV5Auy{_MbXb*yq{#t2mF= z5wA!G#e=v@+#pOzMz~NcOAJaWd^3s_`AfNKG?sK8*-ZXUuUJL+K|IYBJVC6ZTqV5} zOTvn3SabvVclO9W;uW1owV2MMT0$65EunQ(6Uk=c0oiA?o>G21zaYN@g8ZPpdlt!= zhB!nxlg*^p_tFzl?`bc|2tV?Ja)I^|4~)i*aH0A_`9a*JJST3%`L7VUO0}J8*vL*D z%=SHx?4uZwEmX7VJc=dtTEc+pB>6$>sJ;*n2tTTI6kj@z<|e{`Y<`%0n20ac96FD< z>tEH+WFK?l2F227{!+cCy~GWQ5uNv8^8mqJs=LHp(wnK*V{smFl441Gp&66-OmQO) z(OgHf59KB4C9YAOBpp=iNC(+MwT|+LI7xkmcsj>%oropXcEX-`MgEd+)O(0)K0Wh*y-C zbRNZsWHeh)Js=$ zFr^rg4q8V#s4ox(bROA9cOj~iG!qgogek?B@|X6~-I>-=z7Z!0dpeJ51obG|Yn1oY zw4??PTbNAi0x2z#<`wwwH}Y{H)Q5~e+Zl8L#l%!iD^H`?3od|QkCouq*|hrpTE z(RtBT5pjcTp}n*&B-mN_b~yK1AtRefM)r}c!uKhHSG10JK$sFIiGRr! zw-CNje3KW95qu$A2rG&u;aooWnXrX?Bb;d+#g}T`e^Q&?E}buMA*={z%3rD*gfsDl z{2*Lt9mR-nCR+x(%g=8-x--;lUpGibHG;Td)IN$i^$N-@l0A<(BRENUM6sm)K|PA< zJ?&ljw5PBo;{y5J<{3UEQs+TbEuKiA&M|nSa`ONJe)~@{MG4uONRZ7bZl> zzn4IHPBs&MB%_?Bb)=U#PBRk4gL(zkN$MYz`{W0mN8BY|k!0BOZh?gk$r?gjX7OJd~*~C&{o8#UV!{A(H|2xiFN%8zZ1_BV_!}berz0?L_9C{XgXWSTECRP z({;E<0dZbTrdq<5R9pKC*}W0{#P8_biTEkbyS+0?yjMhe1Ha@F{?gtK(`E}D)gJcDYq!Z_n-nVOYYQQ+KmRxY7~uqS`h zY`ibdBb$knw2op)*i*h4#lBJn`TK8l9^u^aVG`jl4~6jS23OZ@+7?>)exyrQ;U5EaD|doS3rAs}LRV{b9G*kVD-ASi+YcB94~yVzoH zvG?AcvG?9P_SnUW4bQwUjG9@u$;5pBf4*~_a9zp3X79b$de*bb-t#g#3Lh0ZzFpWs zoFx5dEzP4Cr2Inpz?5BnUfP)R6@<>u4=IzK{uSNV@=87@ACbpc`nR+U{`% z;tR!U*&Ghu7T;K2DYmH25dUZ`VNZ3M`YV!as~x|z{U~Zmrpil=7CSAkG#z>X)W>Z{C< z@(bZiwvo;)x8@d@(mdLaY@-@LYsp?)V}bI4x>HtQMYvFYA)ilaa7N%l9H*RU>paqh zY6bCy>IeCa#;Asp4Dtu{0>mM&8v{)i&RSlHFC>F<9pz5Ko?@`goDzZ?&!)@gy-C01 z#H1!tLuSK~J5c(0$q%--F>NMpI z!iwU958ChqK;A!=0 zj)FtU(-jh94WF$RV@^F~&$T^`qmU6XzN=VU{gjL@4Vz@RjB6_9J&5%Zw%yG)K+Geo z;tp*V^K6wtIJbB75t!C5+eTnOd?BC5ENW%4}N`inp=L0*w}YEwAK{ zB^70zA-RMVjS*JF7q^Ye1&2uP#>S7uJd#T>LvrmO9Tj}pIr*Z%l=wpVkM!G6>YcdH zAsKO*rwSj1rI;(mC}t>DNe1P*9PYz~44P+a{-YQqK9kSM9~8foV@W@XL5fwfm+&JV zP`r_TluL-agdfSE_@x?8F-Y}|?4>v&8H6A4iu_Bpg2pJe$Ts3y^UU(!7e8{XhTuKL z7WtBD6s;w!$iEc7gaPHSebeRNUy{xgMMF|cK>oZ7< zO`6?Y_{cfyEHUr9ty#P+_*!0rGo}+`B;$v25nC*4EU)>toE38SI5wa^^vX4&+o|4Wam+Ymn4uQ*rkH|LS^R_5wv6i^o%Osz1AfA#g#0|oQSbHbi@5P7|^ zkU{&^{XyR86DJ9SKlU{d{-C%dxx_W%5ak@=IN?k(NN3^@af9R%R-`jwK)TSFt#y@R zm2e>+5r=4u;*zkkwe}FE#5Jm`WH0p*ggxa0@*C|(n9@ALWx-4NZ|eOUo{}%gM}z_C zLi5O%B$xcQJ2ZvJiG&N~#J#EZi5y0Lqufb(lI$Q}QSPL;BpFm!i7&)^>f4EvR0pa5 zqr5>_5qC)!$_KTH)d*>)wp)C5{uObcP^1Xg|tzgkM;;#Nzn~8XFpxL)_bz zSoOPj4`W$@apGLI?g#nVn&lp*5bw|QJ62EBL7LZNaG=nI#y;k|C}hkx+z@Lwnp%tV z0?8#iJm=;Y_R@Z_7sG{Z9S80bV}xnV$IFEbn%6yNIx%lo?eanf=^W(QN~|Reep=aI z>{sTwe1E?}leS_W$>`Phj*vTk@c{Au+vtrBHtkpZC;9odj=SaGgb+8#HrkJHNu6qp z;2Pmf93ovP-Y7o0mG~&+l76(7;+)pfJmMeeLf8{eX+QD@t)(&2nQ(5g^NHXe@tO1^ zZjfBEgW`jHPGh7C$t|!sRMod7i|#YTJkqa#`$pj-ib3Mq?2PY(jE$uWi8D6kUBZRrl7A_t z$-hgN*A})BrZh(T5q{Kf(0;^ms=qXkaG`qsbY?$cFZqq^pxjBl3dJ<}gM3bLL|Bo} zX&&*O@T1yD`VlUqGvzwU*@PcqMZTo?puA!0Jd#TsC!HzZcW9hd#5v(YYl&;C;#P`W zLN$u^BVW?ILKlh(ovByebuvciLL8#Fq}oGylJukcM!fefmPpt^*i)=hze^k<9uUXt z?mH~7I(p+*k%x$DB$xVZ9IGtQY+hLjENl(04!1^d%}R^6802>w@3dW_(%RAK2vN_e?|IH?I9V&KhlqKJK07# zg6bB<8`(ja60gW!%FiT&I8HiKzM?UbLHiM=WE;(+F{)d(`h)PJ-h%2h#RBa|x=>x9 z7$m+B2E<8UgYpLHLfj=^k_;N_xhILq zPXCJTYk4JIh*y*+iEFeU`Ip8h&dCm{WyCAeh1OD>8{eD~^_+AezY*6cCz1@RA7lq{ zk}xG)D1M2%WC!&_#1|SP+h~mRBMe4EPe?kGe~Hg@E~7q&@-yi|y%fo%IL{R(pKT=l z3Ok(@{SetZ?_mxR`&4TwrYSDTN49c^d`WhYT*~)kFU2a^Mr-qDKVHd_A1$wMpUb~{ zDrw9ou%~&n-<$#cgpB)lriq+$@xpvDc5+5GF*YalL~)-uXyq>Pewk;EK5{MS@@!*L zF>hS^Dq?JRn7go}$iPX;f}7@QV0Aoe4y$RDKN zp~EYU79A|FjlJaOsN1!apKVPzJK4)~GWm$OK{B=&<=?CjUvAxbEqp}!5q{;yjue=t zXum{^kl)9Au?LO=2wVNYBm+lW{1TCEdu39Iz;N{e}wAEy-Y zyEOYeiye13@EQrERf&)>n{|% zUp>&(Xo+RZE7?Xm(|$CM@FP12Kc}Qo;`s>T24V1^zENPmb5JXRDPchR5yvUEC{G?L zbxP<$W5hqoO*BS6rx>JoBdo}86I;m7?5F%p^`oGNoyo#6%PZwr!kP9XpA#;`A*umO zR__+EK(�zt!c6@Gs4y`a%96{^gs0TX2_R=9N<}fiuaaoI^5f%|lcdNCsg~Jf&Fe zHC+DP3Dp$h)zo=Mg?}l2DZh{mvW;rb@ZZi0xzke1_gE-?DK5zl%Gu;M>JP{cnnzfX ze#Cpq5tMf+=TMvzpQ-i`&Lo%cqkKR;E5$y|qxhg)M===DKz_y>`HlJw;xl1NaY^}w zbfFwe{vcfF>_WXBag8`hW27JPl>9-lPqtBwqIypFQO`i}OZkO-P8=s+(iwtyN;=bi z#4FN;>MHf)}}~=EU%QWD34QY(LCZBjgdbnwx}PnbuH!W z5%%(#C*nBiOnnLUK9v8c7oa*wKBqpLu&4MX3@Gms59o|d`%&yuY!N4kyR?@4VJi;^ zQ}Pjwk>5xzVMY0w@-D?R#RBD1sxxE<`J8kn{V4Vc7m`8oOJl?#@*Cw-%DaRq`HkX; z@-xXGtZ0mUMDr-WP+g!JPrV-bgX$&ugY2bTM?NB)={!T&Q!hYVBmAg#Q_dj{QH~`} z683~M`GYW}+CyLQ4LVPCdiC0uVh%Y3AuqXX!Kf;P?3gr#r0m-1ggwEJhSIOrzMr*0(B7aam zAlt}CWt^>Q!43(d&OLpCfwciGYg?IFg)PG&T-Obgloi-TRqm#katf_NomyYJG z{heGp28WvGIJ>&JdANI)@^JGg>E-2B+SAMY8{h8wZ%VnB_HZv-res-9k5cZQ9%aqH zF$4trYRg<)3p=@X@{jZ=^~DdRKmFkE8);}4rdg2i>jbEDli~r926q3mY5&}m;w4=@ zyxhvTd6f1nRmQ!nTUn1!ws^RDm2!70>E-6(=~lL+mxuP7|C6?S;f~MFvbLz~-}$Dv zr>lD@4=?wUUM0WHuBF|)Jj!@^mUJsws!W+OrT>Qva_wdaZWk2k6C7ai zoKD|(a>mmhIUZ&2vl7ixj<4Fc`@Jgj0m9_6dOJ7db7$;qU> z)|i&YRCL7c8EHmFt7jiS`ZOw)#9JG$a4Ma5ukGD7N3IV0H2;2=`P&!%`g5ixzlW*m zEmi;7kCL0Zmv3$KcrdESs~%yh+=f2Y^6g1(I`i{TW7eBXUNtKjrp~3?o^;-{;$mFIG{`Xbvgk&39Hw;y24^|kyux@fwraniE&l=QPV!ytl zT3(=cy(0ONn+m>5YOFJ7T(iKq5LNe=E#EDDo6J-(#h6NOf4#qDc##nG$K|&til0oT z@0ToDz4M*Rbx?!KlpDWdQ8H86Of4%#m8Gsl2+Pk zTvzX|Yxx@iYGR^pK4q>s>bl%-IC|>5TK=kJoAr4%uXogSvEY4t)61LXM>(3JlcZAF zmbZy+kj77S%vfsvHiM%nr0ATAUETXe9+>H;oH|Dasfv!K1`n!iAAWs(_g%02)Plon zitNbXXbO5)*VuG>l1G&?`m1U#&mUHKnAGIC#DCl6eH~7ef9I#J5AayAdskA^ftLfe zXN~)#z~+U1s?W8~ooh@@YHIATT&3~-`TnMyekyzURVDX_C)I6hb7R?@*mQns4Ady_=Bz1JiBQFoJdSIyFp23=>p8~pzb{Xpe@j<&pl$ITC;KKb z)$yOF5|vrIp?hc#6}UBIz>m%1*S;-wC@l1KFXfPBY4x+NNla~qudej-fam3tH0`5i zMLck9o-~QhwLQ}_jmlNMpQ?DQ$iWL&5}RuFDr_86q(ZV3b$(G7i?kona$RCm+P&T? zPf+`m`^)xM-3BlE;mU}_Ca>~Yj9r_~p3)@40F~j!A8C975}Sth3N>b^@glZtgsp{ZJ<&pT-?kR_VRXZIGGlDxim})hv zTp{abuip8_3{yV-zqfr*D}HS5nY_VIPYqY^x8Ka$(K&u?%3l**OcggmP0p6@_T$%y zOt-g9HU@2c>UKHtDCO1FZ$YPHiA+ViKG?p=|53-5e~eP6PRtH|Hb0S$^P6F@V}>sr ztvVIIUNo{#{JfaL^AG({Ym7?utMlWRO%j>3n9kg{|Dv{M$Ed}(d{%ZVp2$>X*ED56 zs9oBs^~b83-ZR7BBu=E`x3YW_hgYk|s#{a9diJ_(uk)qA+`4^x*hi^fUgv!MevQ4Z zpU;*$gN~GoQn?zp-qdHfy(z`3{o7j&Y?Sd?n<%wq`Ltek{`NXIoa6jT-0c{pnmb*t z*uR{;>4AL???o=XPc3a1rCu7c+a*pHzu!xT8TM7bk5W-Pe%d+co}I39_52YBql2SV ziJVggI_|JDUCBAtc)LU{mpKtp>Tvf9HGcgqeqLsuQw5g>M5*A@S(2ydWT(gZ#Z^&z z<0?d{q;Aa*ji_m-$Cj&0E5|AC$Evx*Cyh*<+s+g>eT^~g&Jy>2o;z0cJ-TeB^P`VO z4d*B4m;ChM#8|a)P_g{^r+qYPazD;U_h$Rku_~s*l7)rpel(7Ec&<{N>fHHAwkTEP zMd9K_-^LlWJlUc1py9_3M=Ad$3s<==iZh<=oYcETNvBR3$Ba|c{0ez_G>jdRO%D?RoV3)^!>UHDC=4MyNRmi(7C%R7(N)a z*w0v_T-v#nC#ilaZ!PZ(AB@6V;$5I1FtdbTWg z!bJh~M3R3Vcwz`r%e{)h{b2KJ_X8)~Myg98ohbMK}9hZElyb zi~s#MMlC0%4zHOkPslv=JlFU)fs^0p{H4&<^~R{>#3QEh>z}M% zpbR6&CJKEWYt(YdqF1&1jo-Xb&8U`UNay*nx*b)z4t!vjb+J14Zd8gcO=68&-O6$# zyj{}YmZ&sqQjO`JI9A{9yQGh9Om|$SYPTPeq4%2C`n;sudj`3WU9S4)Nin&v-)o~* zkA~!LeCJ2^m1@iRUvmyf`&!reWa20NHf3C;UW`sQXRzs&j!UKwv;ovo!|JX-qZCeZT|jcek=OYcyWi5_vG9&POdDmQPsI*w{7ah z7dl^(1ecptt@9=|AgXWWnZLf!eIDGkd%Cs9(qu zc0bpdfA_gQFWl*9jRp0$Dc6nfjxL(`+^FRUk2|@0gmu}j+J*IOysY|jox5#QRaxFA z!l-5yd~S@qnUfC*Vytuc0WsDvR4-;M3lVsLTwQX~F=uV#) zW6rbhwxzgsxMbBFyVR@BG0*m-j?sNIVMeWyuV(I2B?@=yc3|66ozH_a|6bZyeYXmV ze*Erm$Wx<74S(f3`$4-a(Yw{`Ngewg&;C^B)!-3!xuZtyQR}9kPrh)%6Jx}H<7&sN zOGQov?Nu%*&!$`P{IR~@w1Z1>)vd5kP3?Iq`}&5Db*#ER+Wzis;{7W1z2o_}t$3vK zuVs$oeb*h@uYPHEwD|5+kM#W#M{Zm&Z`1+xV$UJ3LmeLKu`sk{<@`fyA5`r;52%v| z9_aa{OOK{+O=%CQi*xqYx=`qWzF(!APbTL!|5Nbw((Y~;J?OrURiTeZb5wkISeg3n z`04J=d-~Y&_N9kRKXycwe7xQNapimZ+6w(|j4rVBsG8quYskx)f9Uga?@PY)&G=&~ z>!D3u-ha4jEFJg6n0#K>?Iy3|YDC!$eH>cdHEKP`jtoDYnflvt^>M-4Ax@j`=p1j8 zVqt+c&yK6`OsmJF&2q=6)zvVET?e0cJfUt6TroLI*V{(DmueYP{KB0Rs`>M!b8?@) zrSo~t!k{vb>z`DId>1b%=yA)a)y8@)e1{}nc~Vt6zF=+fF*l7L$GUqL$#$sM&Jw58 zs!H>=c|N{j)N0C%!{w$|Tz*RBUp8lN`R{KSwVYjYN0l7kmpH8^WuJAd%Hr!rt*^7o z_Pom3xu=!Wu<7S(C%dk5WIC@51JK}a`#n5Yd z%v>ztKK(<}vugL^qIb7dyK21Yo8J54i|cbj&Yx9_h7^2r$nJ_!>ra2Q>yRfpgcn6;U}y&Of?e)a`AVe%Xw2YtO6ZxiXh{<$1xV^^=vBuFd}8 z`wOb#yR?-P$DGrBUbm6SAw$dsmG^wg#_5)w)$Pq#B6fSqB^Q{DF+`ACtYI>(2vu2X+>y{qc*?h~`` z%{ip=Wk!$C7lyr8)ucZA_9V%Ez?du7S!3+=wFjS-zoz`kY`d3d++L&B|M`r3-*3;% zYpVFO)u}3_*sXKOqi}LlY|J$kyJVsJPXl%spEPv#9yI+&|A>syYVe^7OCG-3X4K9B z_U^Arwl5m3awwPQ`R{Jj@q4(gb2^7w(Q5VT^yOQhTcgMR^)#_Jer_49#(W=_r0D2n zdJO*1sB_6D?W5J!l4mAN4V$amJ38~ktEGBIt7D~_*Ud63O1C3?|BwuxL!;HKZ8Pf! zKW(8jUs}#X1B!p&rNGq*O3QT<7Ek%P#*k<=vBa?=b5hS!-p6v8cD=uSCtdGo)xK8j z6nEDZN~?KE2L04_bx^dLxpK^)==p1vR(}uYYWHH{578=l#d#GMuHU4z`1p`~MUgXJ z(JJD=rk7!Rw<|5)jvJ~x`96QNdQ#->+3XK?sB-znE05LbI#o^|t@3w{S^Y75x6gLYr(Yn<*%q2nU@xL9(`8Vubsoe#a)hFR-4MLN`E{5d8PGN zEeo$0w>jvtI^BA`{kfnEI)3?vj6HVh{U!CJ-Ul+JwQOy=Eg|3Cy{NqJAKWyf`&Fg&YcYprj?3NW zqH3Ay_<}K8ujxAP?)m$@)tN4;^1t1$Q@LNX()icRjPSzn)iNS6>t? zknE<;jq1tjR{F8VdG$W*bBwa&Aw!|T`Q)UWn$Gi3h$meTr{QwM4U4%>cC zWg7QBMViOAbp6V{>3ppHkaKEo{*Q^0kGZYuH@VxWf^~j6r`*=tzqR+cqqOt%t?CZ7 zQ{_IVw$)4=^Y+vorPbdBJ4&~0dGoBQb0O&;&%4}JTK&zvf7g&rzn@j-+9$vEF!LWu z>pQ1*OB(u1*jW|uKE>JFoBq)GGI(*9F$asCRWTz|AGzA{o+@&)zjDu1tkKk4XH=iu zX?LIda8Kv1?}G0uZXa<*rC61I%ki1_b$eg$KI8T#-x>8=l}xJ-RDPiQyvggP{rB!X ztqPpZvS{bc2TH4}1*2yUywvuzT5ZTaYs;XA`n;BQk$ZyTPAT;|=cKiT9_ew}=fl=9 z6{nn1hle_kT6W-(($2Lf`^MIpUh$M_kuBe#`5hjsX>;GH`%6277e0AX-C0tg_smpJ zbPNt=7=PkS>ys*?qD#bYE1oE=j}5BvOJK|UCse<78Q1N1d8%`5W9!HaNkUGjnky%| z?dkDUX+5D&+ssEw+&ZpOzsbCG$HAxi+IohU!|t{{uFh1RTxfgt7~SWgCwksIz3G^m zHZ0rR%^@*L>uI8j-P`-ik)z80)YM!Xw#CHrulnNWJ5C=_MRMevvL^L2rJZ|zJ2unt zN{S;YCSXR!l|IjOf6RP!Fl<+$!)oKQ++&xne5Uihr{})84ZRPkzOQDbTx9=TX}#mF z-e+UR_dBR+sJuhxHF~bJ+URq}ZF8HW2UMz|a~CR(Zdgnsxr$Db-)-aWu5xvr3D`?o)n#g}P3f_(I2}R-={~oe%9*g_kUh z8F%-Ej={E^nTMWyxJNyGUby3!GB0(1_*{+M>5ylS+E8K1A0vK!skFX*{Dy8tQv2*y zeFhZ^`1RsTJ!Ya>#3edAewV6#blJ5*MPKPY>hbn)$+%-XRm#jITK4b#O6SnQk&ma< zH}`+1d{&)drHdD7c{`*!uD|GM3s(#Gokz2kO7g-qP0)*tfn?&ue*v_9f> zwMGpt)Z40l&aiPy@S0dX_V@Yt&zg{Ni>lVTZ0W$nZwelfsb2YaIyX{{-v1>1$2F?=+^Xs8jCiNlg}Os$rMy>hjjH-^_oy0I-swCY9-j4R ziBYSSQ>hwGRbAgJt&a%rv^LYt-K*4zpZ5(?ec$W4R7yOdL)qsm)o*)i*;hFJUY*R7 z$h&0H#JvNntyDhW9qe5u&j%fY*@IuFi3(bw3O27B>lyw*z5KA)Siv{btP>-at4FgA zN4W3$ptN3~@YQ~)KHgcT*50f4qG5hB!U1{js=W-Br_; zsw%x2+$p#|PLCs}@mbe4xW7at-+jV2pW{b8j%sb66tJ%35_LRf<14wFe^gozqRtga zSGDP4HL1zz<~bI9)a?!bwcq(t!xyPGGn$;v^7f<7gDQP*R?B;Np^A!luwYmLJ8#YB zi>5W3m^uAI^)mC)+sS^g^VaJ5sMr^`vbir%&9{c+8`9OzTdTi|D|$M;^PR7@v@PzN zWTu_BmQUaMsIntR&QrOPJf1ONpPjdcRqC*7nJdirUH!6X`DOd3cHUauUpe1y*AFM> zs$2EKvh~YiugiU)9w+v7nX76(E73g8+umD?>GiIydKZ~KM=hTCbVBc7dvC4IRJ}K- z@RBNXRI2i;PQ4v#@2%DIcCK4qO@A<3b-LC$ZI8|N-dc@Xm;QAxg&uO-K7#>V2ok zWZ|t6>2fRN>2?3ioEgd|W2qWX2PX2?>guplwOdrmI$iDD^m0JxvP9lm{kWUzm(x>M zOjQNitl#nQOd@Zs4lZ=9(t2Z&DQakZCE3Rfutm~Y7%AEE?^Nv-s3iN)|s!C!VmuI)%Y(HFijB+?wq3EUdiM_QmVzoVM z%I%soN(F{~2x>7dv2I6U=Rqk({W3xwNVk3dxh;vkwc0rCa=WK*yoae`8~WU8ax1a7 zR^xwr+wxx0vqRMAmMZV*lu5j``mn^*pUVwI0*YTl(NoKy;^IBSy^*pUVwI0)W zZ#|~t7X<}DYmrU%z7T#K{=LU=33hCysh^mu4(5U>v^;v zVL)+iYo4U|pgd0cQLIvpB45%N`I30Aor$fnx^gs1jE$_{R``5tuH+)`zAyh!#O3oY zrHs}xXzh+uqos_#E5z8T%$bFLB~00cT*q5W#n{~=kwO=;?d8k@V&3G}&O(>`Sy~Di zuKoYmYHjbeSeeIZ?Befpgl#*scNJr#^O0R%VjkIh|8;<{?P=ZWV(h^mi^LeoSYPy* zz=g0PJ4lyWN`CsriGnAEZNwqs?wQJtV(o*bX-w8WBAyb5NEhN??178|zb?l&iuy~u zztQBnSW7;lcsn?`hOn1nhUSqjgdgok{&?1~zp&%{=*2=m;=!%HC&XIPZ{@kif`5Ce z2MQS!Tf}kuF^5G=6DJ7+nnyW;;^=gPokHi7Wkw2J?uOKYA@AV;uYykSdot? z-YBL?=S!QW2waFmlMwDF@&S!etWsY>IhJY^ z#WeYs@-xNTk-PT<52$~p{($&Q*pn}*9#L&1-V+ZfHxZv{E!BAP5%nNsFU2M0Fp3X4 z3sJ06U7%VPQ(>6Mbu>mgQ|+d_OFW?ZLGeK~nQ|w^CGmAbex_PRyr=jjo)Yg##-k6jMa)Ed z-xFgLtAxSvv=>E=rM09poolIXQO>4w0Ob;jbBaNdOMD@mDId@ohvJ;_3-!;`3sByr z{)KWeah!Za7?6Ld&ml~S<76*!m(H-Z_AivzC`V9lLHUn-NpVi`OL0W{QGZYP(L9Rt z_TOg^IW{P7elbS+QO`h}BtFwT;wkkYWE<5KTl*p68u^G~hT@!fPdv4?-z8lrmyj-$ zPbsFUc2lfUZ6p~qk79=U1Ipuc-%jyHb&K?)o`GVY&gaAz;s)g*!k)&+Ueb@aMrRjV zOL0jtLorA-kIp32*HNvYnry3&DF2adboL`VD2|AebT>!65Al!UmudxJPx=w2gbU3h zjuUrj9`&|VXDGi=jvyY8&J-Vn3-t^XZxl0hW+%BcMr$bsspe6CMR7^orCRa0pZtVm zsy$Sbsh^}cqFhY<3!Tg8Oh-N^u2GGmdjZVZ@ZL7@k79w&d6Xk)KYBlzxJ&j@zNeZ; zvG2R7uITH?Hp-pEHR3b%VU!QZ=hSD@S~{mtFG{gR`Vj^smvEuFPj--hDL#n1q%*}O z#czmjO5t%Q@&V;>%2(8f5ueF6sx#zs%FlFnLuUwzBZ?352iZpW5zfR(;x5G?@rp2| z{)OJxpniku5$Q*38y-@EQ04pLPoWZSA`v<^8-V$ zm{+D`oZ!_q*T-TW*>*g|1fdJX+wY6y`{yKgVzNy_F69!68S*9Zk2pj+6aQ$e-?{Qa z=hi!Oi(GPV%Uvcuz4y+@)THFeMpOLy1?!4e~GLI*OT6zxEb+obnL$ zn3OwdKbl8%i#Tp;zdWQqlfeadT8Yl+XqKl@2{ zM82Y!rrbnvMEx$|Ok?C zkEJ|Ly#;ZSY98T7d?Ef34`@H)0o4Gi6|^7mp7yg9XNpxi_mB+A8BUR>ci%{JQe#$t;6f<;=r+h_y9pxtS8`X1)1;T~qnLp=EaLCp=L;fJ1(mbl?6sva!%e(OLvnz-@ z_$!Ymi?RL_k_p?MjyNOc4G$Z<#lEvKQWKiUOG5T+zk&XBtH}D&g6;S zmc1>nBZ|wvjI@I+ss%ezNCh0cV_#65?^-9PC}SkZo@A7OuHm4nca#t2iI z_eXst_M^3=ANiMLT-`8T;GDT~a^bfLC98>f6W`0vOd=nV&ZHmt?OM9R!k5IgY`4w| ztcXLz@o6quguR3*+0nJ)9|9N08dHTXv|o$kqr_VB(cAp8u9DvfQ__WeNn^A&CRb}= z8^tu)LG%1(E)^K0%_!erC9KH56qm#y@(1N&8l$x&moT6_MElWN@(0;QYe_EU7vd0c zoMM&M60fMfQEX9urv3W286h~Cf6WUqM)p#^B0DI*U<^V&rF=yg5D&->nn$taoz%f( zsk@d};t=UV{-AtsYYdX#sMb<`ChTLH$g>OSOtp++fqYJJL|9R7A|H{x6i1Xx2p7to zG>^u}4$398marmwDK06dX^ebHT%)y=vnkFgACO$KgXWQciT4yoL65I1N)!kO06JmLY(qg+R0gdg#g zVr$4MN72K@{@7ZaL%WYnD{Aucv-QN-o}@;xcGmfcVvJ-g*n3i(7u@{iXDO46URg&A zT_U=Biv4KqteP9d+QbDWi!rieMQlo&Y`dO6#AvDGme=$el3ZF#woxn)cPZWo7m9t7LAp>Zly84VU_kkPK;dCV z3r{Ss~OKYp#OegZowpUdJ$0;sJ=cM;Ci~Y#I&r%H%yeEGU zrWDh}4Z?*mAbTfx&kz{c%3Z=Gt6edH3-OBlM)f1Mg}up6|N8v*QN(fDkMaTem*NO@ zf!>?yImw`&fv`V2;j*hX998{BYP>AQ2$5%rQU*M5DzH!X)Wb;s%3;d$t61o1Io|DHPVIh0r7x(6~dJK zL2HSVl<$duWCz7L*+Dsn@S`}QnnJmlfdQq~sUFAYD=j6;Q z#z;TvCn*<`&ctVmH(E=1h-^DMUw-~ZI_HieU$yObQs77aB~Fqri7(WHkj@kflsjpR zbS4gwT*@01Gn6+dUs0YUUsB#6u8|#-4~X~FpOSvW7s@a1DyA~o>0f_+Mzqxq%87(M z)yv4%@|;&??mcnO&>&fN!SOcvd9Zchfx5nbscd8ZKl^yf8)FWh}^?LX45UQ_nbx{c7Ei&k!_8d|O~jYsqiH zhPFZ%8l(NlHo}VJlD&lKm@@L2C(?yv5H4gJ`OQ`tq#ya0uzH^By?FMBbZ%bgsqhi) zH*WoC!Gq^>ei5-iF^y|MKhpX9s8NEaWJg1L`T19b6|E(1P~IT@h#SN|;x6Gwx{!~$ z_1h!-M!d?|E|t+b-;)f&ifkjDi~M?2_=t2SJ`*=6jtG0QgT{zMWE;sP{V0!9%+P*> zGtHwh;uY0Fnn&Cq49E`BnfyWf(OTjL@t$e``Hk!#pOY_%<|cSrb*Y$LgwN^MfswTx^d9#C!~ zoQbDo8?7Z7WE=U7{6RPq|0v&+FG&WCksXv{DG!l;=0Bin4P`{Z-No?@TIY?Vt`ksXAet^E~YYU??kdJw{%_)Ixx%H^9PPm&DE5i~|V zB45%N;X*M@@k{s-E+m6=q1;K_ARbU$5~jpc8YBJ4mt-4pm*SUjCSAzC#Cy`2dMT1Y zwvo?ijB*%ZPuxYhaF0%M$qvGWxIsRm`qBB?E)lEL{}J{yMsoL+fXQDDfF5ySm*GZQ~ z$gTf0Q23)>&(Z?t5tBEG_jPF=@s!qfI@UqhLAH_3=|=Px`Xvv3E%u{%#4D0P{vhrW zHwaT2BV5Rr<$7ckw%Ljm*-No%t1oFk(wXcXRin1BgLqoF*bp&~VwL2QF9|EkVOyHY ze`k;MBVN&dl#6LU$|ZyW%3=M20*%%+kMtuS zkuH?8X+QEM)mp-U@+8?o^C-U%4+uZXb>v^#kNPIUfONi|{%7G|$~m+jaW`F^wBFV} zCvK20ZH-^b_q3L{K|Z4WVwQFj+@-ur+$FiWJKq%h5hux)#24x@iO=LW;t=(9)ca6e zl3d~%~XNafc>=y`MQf?>giC1JV*+#X8xJLF;tP=l7?yK08 zBBql%pl7A_FX)T?dX&%KJagwm7{U}FJjiR--@}BAz`HgI| zHJ_3%Db7g-af9TNz0^CB&xsq9bBN=8>eLZ`yL2yEInmec>LT9{xHn;mxW_!#C04BM zFmk1MzlX+1M$CdFV(nOG`EOZ`%p4@%pK-lDPUu4WRXqBGkddgPyq7P#=em%wam^dC zmc~}yke`D=*pq%yN#$o{6ZW*0Fb&K1o#^W-$K(>W(b|9`{wC`)NmFAXfiumc{kGJW zpBGO4Af3ra#0}Dg*3vw;Vh+N#9YyAgG18gFNIx2@{&u+F70n|a5T?XQ;@@}E+6ddo zzv(@;3BHgngcbRcaIRMDj?jf{Bb;d-`ImCtzsXIHX8a~_A*={zieJhbgfsDl>>yld z9{GrHCS7_u%I7z3T<&eO&KopFIfA%htA6BjsudJlG_>4h4LiHrFmor;X-mrKZ-4iK^h~!k$NwBJvgGcFG6jBkH+m9`y`_0r`?*kT_0u5T+F8LB zI*(gi*xTAirR!u8^T;1G=3Xkh*pK8sT3=1*+|;;JjP1%iM_`a+{(dpGx!X12U$TSn zBVN&3^3ke8y~KNl#5K~{$-zP3Ok+nY|0d=U$6HTsCNLoGj(5o=aP}WtSjZsk$=WT$^c_qDu| z&&fxmv#o218^lwxmueKnG;t_fTr*{{)AAZIqK_E+;5JQ+jXOP0j8Q(NwUpP$UYbX7 zNqnXrj`X8>#39Omw3d1w!k+j-v065VgSW*umRE``sx!ntT1(hdou>YZlgnB>5YB$xIht`VlT@}<@Jdp6-mvGCG;pum~@Mi@{m z5H935vX^ur8O}wjd0RMUd8Pb9IFoIpbIYx{1*SBQ_9NS<2GClv*Vb5|e4y@>6<852 zlwZi_QyQERxDdxFC)zrXbfH>7e4+Y5exos}p(KO+LA?NR$m_;HlZCUESKc1dC(asc zW*Nm;kA|Z~uSfa??C}zESL|&nID@{X*`K61@t^croaxm`8ThSX#p- z87||Rig^!Wy@YLd^9>O52&=e5o5eg^Wf0Eo9eo6*^~<&q7!Y5`=P`>~nJjtK@_N8Y z{_RbnqL~E-WbdBMkA;2@+jbQgkR8O0{#Of%wS5wA7w1*dg>=qwd$HJ$;%(OJOky7S zZAr`=F^}SH?6N?k1z*c6`C~~%S!YNtVMSwv74gMw<8r|vlDo0-V=<59Qp}KC`$tCw zUv^HuC@>|yQ2rzRHk5iN?sG^+T;{35M`0=EiZO~AidB+9xh{wMa3O={*_!_-28qw) zbMgnpFXdR$k7AHwmFy+_hzAsJq#xxH;x6GwGAMqj##0PZeIt7*jz|XKN4z5cQmvpd ziY>B@xYj(g{P)F=T&p2?Pq9V5q#8wQ2`ln1#V=t%Ic(o_`S+KkGsRKK3p)h{q%-M4 zm{Lxpyha$1-w0FceJbW&A@VqJgD{|&rapF6hO8z_?X?)Eat zXB>#9qziF_a3Q&rH&Sn!E-)o~*R9zsY_k=6;wi}`u2IaiT6kUX`N>>w?@u{N|0cRG zap-n|nPM&Rh2osBCmuvzZ!BcceszD4clyLh!r+g6O@u!vE=ewNjW|R(hd53+lMK?C zI7Hkaxr7zzOc;8l$)*tZc14geh^2>MGeweFR}o`GEXJ`w^xz zk8oM=QvREI|AwdJOY#w6K)TR8@+HY7zwHi9A#x(&LOF47s(m7dk>4nHQl2C`h*y+5 zDK1F{)m7pP@t*p2;w05U>i;Nj5LU!p(uMK?afrAkYxXHRVBYTPC zgejdN$PU_%avk}SFrc`koK5+K#t17KqgqQor~a9IPI;1Y80Bor&y)`cXYvv0Li0#J z;vbz2$PV%cotcOSR0D{o6z5d)NCxFK%J;-^;sN3OaYZrFACS(Z3&jHAN3lh@gvQ86 zbRR}BLwS;PrucA+SSorSI;)Y-iIe0b;yC3JihZ(;T=Eh5l4KCq z$Va3z)gG!Tw3h53xfJKLmU^9?t|+Kr~x;=Dj|$qvuC`Gvi-U+l$jVOz(6yTlk_TJ!O8A%o_1&zVll z+f}=~kU=^JdA1U334@$vhXIUqBMflNv z#Bp2m^T{m>M4VF`QC=ggXddO4q7F@ky@Wv~uL(jwTKl5=3^9-NE8xCS_=sYVxHdcE zJ0W9Z=|bX+O?j7aA-UvVifQui(&e>oJ zy^AFhb`bUytJLojhlmHn@w)pC3#^Xb_*LW~;u^`NJ{!j>%fD?QOrN@x7P^psi3hYF z^|6$5f|tw_a;Xm^?o!<%tcYur?Btsp*AA3^$|48Wc+Ai0D+#o+DHe+d4OKZws1 zThw2XepGu%2Jw&dqufrmQI4RxMe#;<5T?W{vX}BR$smrC&XlicjAYP$geloZ^Jt9f zmaYCE{HV8}I!&=a`;jhG7bpgaFN6VclH!Q+71a;oAH@gdXVQ<(Z`51RTH+AlV(S?B zi0q)eLAnrk$(JO9#(M5aVzSe}qWfB2Nf+W3h4rBmD@2(a;l;&g5U>Go8z* z&!PNGx==4gaw*Ppg~?|dNx#BQXGK3m_Rf2lL&QGST8e3kOY)Je93o$m9VD0XJ=sgK zO19D3{MnCJvgAk0>)Yq@@19B;^9k%}9_=@0KtCbl{+($e=UlunUyPlckxh)vNj*{A zCk|S?ksDlCt1tdClH!wisL6G(wDhtX{<1 zvc~dCG6?%iRSt;#2rKdj>38VxN~1*w%WGpV`8n!#E#+rh6V6Wd@|;XQB5sh3Ek^k_ zE5w&ucU}u0k$!|F z)w@>fgj~WZ{k+m*UggIrMf@(!epk#RtWJ0G5%UOpvX|zOj5;&qXOK{ics{JI(1r2_ z#lGLgZ2|+zYZMFQH~;zz1@Bi6bTwLH+44%Zk~Mhf19iy3iQ$k8%@@kKU4iE=wWBF zaLn>bIhJsy{mAEp3vq~Qz>?LwMJ!NlB;Idzxgz{a^QeB1KZt+%=HC|FrI>l;luO`D zaw+GK3|sRM)diA4*b`4FR(lPXe|JJPg?Ke}-cjLSieJhvB!g_D+B5vO^Fr>l)bc$R zieHLLvV(Fq`HlJmvV-OkR-_;Co^k}`UCKEW=fr2KJ%lsKCHyEKP|r%SPxB}~DA!R8 zMl_J0@kV~5euMZ-m{MF)ej!~b$C5t?7dpF8uSZ-XPSP0ZM?58eQ0$X!RHLY#6Mob) zQ2bJUA)gb+$(MA7AfA%Wv>)+`bfLOR{W$rO_9I+~_rxLMAJyOQ8asPi`WDM8V`xINmN#ZW8C4bn;1HzPiL}TPPl1o@oex|%jF-@^R`IPDm*+D)hok>56eZqxg zQ2f#uaftjz`IPc5VM>0ZIHLSaG6*XgBOlQ`$}dzGsK!&TNB*FCN&X;vDc6yY2xmIa z5cbpy5Z4Gls@;@xh(nZPiIapq;Y|J@OsV!zT#_y{kMyH{h_E7m(7Be*R)hhqrP!i6 zNd6^zNe0yq;uVb%pJ^V|Bg*%LDa8@ZBfb!y347ud)eqte$sp`WKiZG5qMAZ^gLptP zs4t;2Hq}+~IgQa;>bb}tln=-@@)7xiaw44(>0W@|i=jHB`NOF~_0WLEhVTeOWHsMN z-%4Nn9RGdoNJB^ScU27Sf^*5b-mooU%sAh?jHVb&Q7l89TI+1EMbaE zM5KRMNLYAb=TP6sF5$i*Aw9YU1xFfO+zabs{%&h`e}kXf|Cz15{Cs`?$Fz>@7S_$T zN4s#}PC-8HKH=iw?^njnxk8f&Lt`DVN}qnCBW4CHvPX!))esOIsek9}7uH?>#>F`# zIMk5vtq!1z4qM^E&JjVr0r;E3&e}fyVV!ztj?lar(bB!Ob46!YAD?=@om>-~lffrCSh7|sCmCgXO~VPVUgix5`=}iYukSQ(KXc2&Drd7%^H^k z2E-#$*jdNKrLAk2U;7S*9)-*n_(nRrJG(o5vEJRayKnd42%i8$cSD4E>$Z8_^A`H^ zgdTr4p_;)z#5dgFtZAjI*Q0yaU_-YA)gpUzGPr1%ngP_YF>CZ0q)*B@_vq>y9_;I9 zHsepfH%|>VM1%!82N*&lf+NjlICuY>ncdBEw6D)7nYaA>gZpQhe}b)(d%Tu^wq7?% zutl5c63>osLx6^CxWQMqGJeZ1e)T0ezEt8%)I2n&+Kie<>(3StYUbbDh}xGkzZEr) zuc7AgSE%`gbTNDlw)o$D4LAP~gKxM`guicyA>z-j3OAS|FX1=lmL_tPd8WkbUvH3(cIf_oYQ zd?F3qBhA~z>)TQLsk2L4GZyAJ{xaK`xAoB$7IrS|>}LoG>-KjlYm@&*@5aqQaaI<(V%>NcEzqZtNLnFHQMFvOe zWd7%#v@F(4_4Nzu8lTlIr6+-aUSF7MS@1Wu{s5l&>e4T4^*7VlVD4c)7uWO!Y3>|z!0vbn#v&|=0NOXE{l;7 zd7V9+^ERsb1u9< zg3X!#uk)k3=C)7rJ-$(X{JL+E@A0MlkZ-g zBpk_|oqPIpG`p>sbI2FxUi}FE<^RNd=ior+aR11P72Q9rOgI*PxlH@sJh6xQ)K{@$ zUJo~S&*JW-@;Vnx5L&6Y*Qf6*Xy2OeA|fIxl`3YvNBog1zLRwc{PJeUqPFFp$9iRa z$LXSXUM^qjyv!|0cb!fyvYU#(j`(uh9`REXTBpL!@jq(Z*RJb28eBrdLe2f0Pe*gd z9p8i%)()Wo=F_Ix1$jM6IX5sD_!svmVHV+A zBEsLte3}GXBe1Zdgx`b-8Lcf@yU4qKnNW9l`FKaO0dD6XJ{B`C3EBAW7US6ebx!3dc_454h zUN8P~)Ycm+_b=|UzV(Lczk59`^?bfavh6nXzk9v^?)Cn*%m4B!5_|W*>W>o&1Frj` z2ea<^tuBDRwe>e|<70FCpCI#V9lZ@!er>7khFY3$y>6^uSXKreT)1*-J1M&ulFr)G5mM0=knjZ zo+ZitMd`C#8GUPUx4E!?tt|glMgQ6w8|<-^;eTAiEerp?ep_b#lY6kQuKB{Ge|fK0 zD>yVD_`i!it9Mf2R`7q>#a@u+w@>$T@ejLvd6T7m|EHTheZjxJ+S7Nj-0kT<{D1v& zua*YnpKtffH>Ur8z1=h4C;OS7p|XB#&)41jh#Xz-#XmA=x!%*Bu+yK{v3l|?VOR4_ zyLSH=9;QF^;}-vu`Nmg!?B(-Mfx+Ps+Wo!xft@_@kHdWVXpE%-eZDr)A8l(F9vqPH zU|alCFy@EVG)=yEzAXM{{r}okuJ+uW`K`9Y^}L#VU)ZAA0q z+5ygyVcJvdVPPTW0%?98DImhx{H%-Ry+7+G5dZd;^1o*hT>m?>#6O;IsUY8$KlN3A zc?A2v_8h{OZ^$RKJ?1B#6Ca?El+uT3fgfe=n;Q(@%|A!kgCotd_YKO1R36?{ofiSD>|1`mh;${ne$h zxgAZI|L6C|Bg4CVetTSdOw;^FBd+>iPQ?Fxgx1FSggO^>E^B_EJYk2gOe5u8zcTmJ yUSG7f+FTo?|NV+@QbbqO{I>|U*e<7iU8J1*RomrMYviqMmn;5}BA*|6_vA1XLxsU!;y?OupUe&eA+C$UbYprj6-&(!*4A3FcC(@^J;9&obt?D>r|8uP4 z;Fx`>(=u?Vf0MRN>)7(YIu^=gcXf$-9gDxp+xianiHHdH3G%OF>l+f(FEH4@f4EQR zfIj_|ZwB}T1r8qeukWbyLxO^Qg8lwAW*Zz5+`d7_K0*2y18i&9s#}En_YVvSt{UJQ zGB_l>YSe(hNdIb*SA+lkyVbJyi1e@O;^1r>5jn(fn62-Cz`=gu{=v3EK9Rly{QYbr zLu?~_2ZV$Swhj094GH&)unh^Yb#icYsp;sNy?JnmU${@yzq#4R&nGfFGACEt4*sFp z6P;ZC{hN`2O4yFhbzD5^IJhd`$)4^Lkd0~`+ghC>{KF$^`T7j@?>8WzRzv@YL6IS$ zwR}VT{A>9IMuZOujSLL#U(?@jh;L1&TFSaw5x#xG{Ue49j*PJPi}d;T?f!Pd(d})H0L;O8G45g0kFLKO@9!9M-`2djgF{vNd*-X}X11C(zDgoJ0mRKHuv(ZSxKzcLs( zEY#m#F&#W4$Ui*L*TOz1FgSaTt$ns5E{={)E-sGFPOeT)PTAk_iB`Yk>fl)0-O1hE z-Ob6_!`Z_v`#b)Afj-Kzs`k|^>_dGcv-9`Q7q$QOg>QCp`-g;Q2k`f|JsSo4WyhyR z^al_9SO3Hp{l7={e;-Os7kg)CcSk2TM|USzS2su3e`0a5ukDgO;_O=6#lzjPc6NgQ z|Hkr9HvUOf&VW4rPpL6D9yfQ7|3~rINBIZ#9}w9m&`+N@mArqb*)Us6UKSB5O~d_t z{G!6MD~FMZv5Aq9QH+g|(eK~C`t(tV?ci?YKh%G)k@Ek);osk0)i(O?aOZDG{&2*| z<-Y-;e|-2;GXDA6;8*|ig^CaiHuG;29SY7WG5KR1kv*iV*WE^^zphUDM4GRu3fTK;Q({i~TGdSI@T-L|$C7aguAl&@=}D;r!<(>KgKaKq6y zVu{a|t$9k@=zL8QgnfhVKYeW4ivDv(uYU2vTKA-XTd%0DOE-SY=ObKBbX<7xuC;E- z+zm$?b?{!YXYN3eE3?}4U5VB@&vjNB?MI8O%(G$QlHKpI^H*ByHdOFWG^)6A=hh8F z#L`YF(Zgb`b)&q_h>m@4bacKMEe1^79Nf#tT6b_^h*q~X{^`{2BZTYzQGVX_t#$Jk zT=(+KWAC5f5F?DAcj#WJqP5Orv#Vx|TaR@mZ;ug|i&txFp4(dYre;_1v}y3b>7T|6 zkGVgl-ac1Aw=!gsC}jI-V!p^pA|-P})S9UUbdI5gwLcHP{ko)6oCxXM&Uav|0=jBj zrg=k}1OC!1vZp1q$f;*zWS$KXvZngVm>r^(8jc`IektSJc&5n-vqjX4Ci? zLNlUm<>Pbmt81&x*=C+zV3xR(_RVHW$3OEjy*m_q7BNc<^;-Y4UD5nH^T2_k(U2FT zUi_FXY*w{-Q6e>;&OT;`_QiM2gP)9{F_r zpSo)Y6i>HkGIyRxKiPU)Sebk(E?a*N^!K_xPsCLIy3pgkm2QIFT!+nUDRo?7Z0JcrlY+Y%`xU)lKX+ zOT3%+`GIDqg~}n5nPC@-rc4)8Kd-uwH_Sqfw}91w1NkdV5tX~PIFRgQq0_}2P8_7u zMaG<*AdVgUw02RZxvu5b%36C-xaRl2#)+P#R?Y0Y&s@bo6IE{X9qU+;HM04Ls?p{; zvm2F;6f9xZTe~S*%(<5t@Xo{h5B9s`&y4#KE^2C4wmEgtDAYn z9?h%zcc$U0AD=pg3SX1VYE4JyRk6~YytHBF;$ZR1Z$%Mn?>}oFK5FXMV!&Xr_;k}; zsm6ciby;idFo?z*kL9 z)@o{|`~2~KV%q$$kG|o4B2TLiJG0EqbcdJh*ES68?(pIEhH*;4I!Q&mTqmixAP zWcZ1?)=ef&nr^CUb>R2>oo7_^7dOJ*hqq~Cs#`X)ya+T7H=5b6zX-dww0AKZQ`MKs zHHyzmPYV=Qu8o`DznVu^WnsE#^L_NaRilE%#s%+OH_pqW`qwfhveL8eVWR$*CFMgp z=h5w)Xrei0x3zWNMiJs}w?_GD7tf;`SH6Wdzx_d{y%&dw=)-Tn{JND}&C!nS&OW8P zM~gybmOMVaG`FtV0i8CY$+Wtq7Yr9WMm0>H(JQygwR_Zb(gY~QSFi&wBB}T7pF!$*i6W!r0i^an+1z&$RixnmFWQ^M3 zXQFF*c8zE;)_JncuUL@~uxQ}W$|kxvvxSN6-oL34bYP5Vd$xXOujj@pPp{kBKbX5_ ztaw%JjkoC*W3^swyHjK2(7(ouiBlKWyfnyI_r-LI_Ux7yRqO^$6y@J|msn8q&%BYB z8yk;YFj*XF{W^E=x4BfkZQ1j3amtJ-qD%aOca?VKQhmPDYU;Hb<)(=bHr{D(!vD-$ zv!Zsb`}Jpt=@GBaB)H_#?ceV#ruiop|2binsCs?=o|w-@x+TMIi6B>x{3G7X7AM>^ zD;pii9?Pz~Km4s4H9R<1^j`FGO1|Mnx;k#96aTUs)9mcr`Qq!>c|)()HBxzcyw0cs zWoIrFRrilNS?Bw2t)iKj(_Xn#dM_5ehhJNoH0rljSzFenaHvU{rD9&asuA6d|BR)r zpO$jXak)q`ifR6G!Y}O@?*d}0HX!5b`jx`yffWJ&JC(PTPN1!OWs&*-Vd!(pQ}8v&UO0P z29cULScnDh`(IUX`dy2R@c7%Vt>+fLZaxKRc2vS{m)v3SKD@6I`pW4PAoVS9&C2{lXiC7 zk{YjO&pV!XKPE23oN2VM*(a^i15(=-bLdm_xG?rEU8c&#Of{EJ&+K|(Y<@zx=MKx< z*EUnde(U_DR|gb7DT2?OI^Q_uqtDWV_G3KWLTSJ!ektd8f;t6^&DhSDTprUd6ufY5SC~ zAI^%A3xkY`2E5k}d=aZXGGEN7yZfBj-TnB@^)KFO6`l7ueWp>HF-hWinPNL#gWhQs z?mnw>Yl?2~dEt5drq$GkZ?#HK?(sMyVpG#GhqpY>P;-UeTd4jrt-Z-5O?ST(k$2=phfU?5sXR@cn=jD$UW$k`j=F!Q>Qi+r z^m&OM^L(z02a|1QJgfCYtJKq-`$zaZ{(fDwERf`BR{OD<%gll2rj3feAr8!scvac! zk;;S0(^6eVf4U*;N|#yExKX-RISs` zR@I2UCGxJkT6Xe}6cy*gWv_Y-OTQ%^Y^^l%jKwuoZ#T2N%XOP`TO2r$ZKT8%)t5Pr z+U?z1-4V7^7Y0pheMwzg@n>&`&9Co>G(zJeuIo(MA>TZi?**b zH|*azOenhCy!~p=E6?tW3vP`qewx2^G!?rB3!R_1so3NTNg|K+@26?gT&D+V^UNXwISU0r)= z`L7e1$I`?ckNu-gAHFG+^Ffv9nro{TPZNh~_?4fu{gzN_vAtc7sG-g7i1czcC!4Ii zqt5%>{nyl>F}H<9p~Qf^v+oM!T(Y3S`;0*wZwV*ULFVVi-dBBYvuJwRA?H)Y_8*ov z8XkI}#=GXh>?NM>ZVKu(Q4=h>Dn6dri3E0~h+-E|Qd zSRm=ix<{(drXNziKeN3qey01EI=%d{is`0?i%oSEQ^f3^M+R?L@I=kW#(|&rTH9R{ zm2MPFoH+BTQ24T7_{+g*^{9g>CGXZ)p+Zt)fiEz%0XdLwpgtuA3lq#9~z0Z&uttN zgZGPz-H&(KADpFX;nMB(?gex06AKpx#a4NhC6vCJzV*!DNtF|XPfGF43;Taj{fjQt zq_KC+y`s9!$tz}$zo`1HcB|{T;SPJmr&b}~qWXSSF?H6?Uhmjvx6n>0S@C(=SD~Dx zE{~Yl-#L1hh&ywtMb~cMRQ>MwHnPaH)A6E1?y$(S*T1RwnH+zUIjU2jv|Jj6&v{>&Z_cQ-QZ!s& zZ`1XpTpHypTA@kY+s{vzi_Hz@9?55JtWj#LTkn&j`;T2F@~1yfZq&qBqtv?d_1DeW ze|f2hi1m6BGr?G0TXlQ4h&!#8iqx|6z9yV7)+lv6we*dWb5<=8^^U&Cmyydvquhtu zJLDfw^5bH$riZ9dS!1G6&N=JHTEERxVzDs$HqWj1C=-p+e>1kf*--S`LNR#J%jOG? zn5ePc*?jz&_4fthikqg-rEex0g+oIV#PT6+76`ZN^CL_>a;rYqd{!xB`>^?9X~e5Z zUQxN#cpq+_WfL7YPZ$;SUN$r#x9ZFB5%-6BY@I9o;}^v5_?TOx^bhA{HIu9t&k;$j zU!Q#Hm`9`3@x8ly?tD6Pwy5>S`&QY|JQ}6OuCRJv?{?HIF>mU^H=TFn(I~ybvUgy& zle1@tuhrh^w;kJrW!@( ztyXUuVmW4#sG29ktM*1yHIBx077mX0ogk*KZO|d)iK&WxoxAsEHQG5&eDGe}e`7^6 zjZzP;E^Z#zti@Q-#t8R@hYP;vvbh%$vQ?&b? z>nHOM6K%gNd6=~*uZsQ8SW)20hbWP-;N7QMH}k5P?yeAIa;#XCDCyeRVn7jdjdCBL zNzC{1;Hx2G^tGjBS9LJgC^dFy73al%`y$2Tu=h@>v&}V%W=?sIdQxe1glJ~nq=|L1 zxyqq<=OQ<&7Kso$b}Z}BG{1$KBi{k@?1J}(i$bkFgv7S|Gq$~w`Nm;C!bJ3|CgTrG zu~1`++B7z`qIHD?f4e%Ib3-!TD8PzJJ}h?drCEqGo8;-LP$c z=1nV9ZuZ{leqv7kRv$LM%&*2#KCgL`jh+2OR`!uAy=noKlM|k#&gxmjPxNf@rDVze z1yubW+&UvTrN6H@_M%m-_Uj9%Ix;KW=}fcj{Y2%-Ya2{?R6w=6FjxP^-tT-wiC}+3?$B#oh?dmIr^{e9cvzE0+x&PSKz;kWSg}uc#$M%{MZLC$Dk3Zh7g!W?( zaX$BmZEf2^nXSau?0ft5FRfL51bnQUJ5Syw;+|E9m}BNPsy+$~cGWfc z>Md;2VkX_KYNN(mJmAOcz#wnYaO;T!^6)H(y$9Tu`GtQ&@jvh2OANLTv7ol6tg!L6ujX z10t{PyjV}9+5Jwxr75V!p?^+ZAhX(=PkjoiKAY98QabQ`JyHKe$1I!C1vSd^=OYb2 zzdc<=BZkZwoy&ejK^2!@;eVa=Hu4sme70CNKUz@5plQ|kqLs#ai#rb2iv*+R;=x%Dt}swf?Hq zcKvJpmEs^9N^jJ!(O;GNr+=-#D%{Y&)?X<$nn(W8JQ}0?Dt%DzgZ`@YU;S(SRq4O_ z*ZM2Prtnn%ef^c@DQ7PI_w`rh%%y*=ztR}-k9ew_ef0b2uQaBd;q>3vUzNU~f33d~ z_LMi$f^z29@1wsGrW70TihLo>klvItlHLdXmAF9|D1A`BMt>y@5-vYIeKqQqI}>HTo;n62g>nN%JT+0{ZXkuY@V#M`OyphJGLYm3W}sZ|T3Uzbf}p z`q%m^^)li;|-ciOjFvO%#C29+Akl-82ZOXob4>^6E_R-?yUe;v|&qvZ3} zJ{c1Bl*? zv>#zgc_W@uYy+#;mGFx&T`k4dqhoz34#KZU^jK*>!eHvDj?#X_1Iiou95Bva@|iS9 z^9Gf_EUhKpzuGuV^0{);XlX5Jkn~2Fl8%T6t*%^_d?^|>TH+Adpd2}$e<{U5c_aVs zTwExvrFggYoFL7kToTU2wb`*1rJ6%Ek$fQxNQ2wA7LjZ;m_NgyIEZV60dbAy`FhId z4eAxd1HypnDe02>G}$Gt(HP~DYAp2%+K*}-afomx{t?b(mvl~J)GH`Qo1K_U!a`7T3J%3-$#EX3=$TdmTVAT2xqEShT7;lHLrATqB=zWk)~-s;`4^n z4K#W@^jE5D#CysIjgejI-PH34Q_8tp!O~J~qIrZVjgf!EXTq8IOf{Bj9i3J3&!{8i zi1I=ADTE98Om<28)B~vZkk0GIACYoIHIaO#`f}JluTIZd{gr&7dO&9`!UgR@9ingzS=k6RPYrs1}o5;vdx#s#k=wp*@*u z7}X)dlz30R5TB_YP|cxuX^iqlHYg5?mwcffO1dN-(0PrpB3@Asr86tVLG_AiCp|+U zo>D!f`(&y^U(Skdzm@`bcd z`JnvL*^JJFR5z%9#MDohuqRAOZ)BI^r8sCmijDF{Yv~@A{G;2>LlU3HfoQgBYG}{+=b^fWP`Xy=Muu1^hP|Ovn|C&+M=~&m(G(EFZoBkmU;zY zPiG6VOZ|xSM*5)sOMQ^mk}uTbiQ||Lcy>+Pp#DMkOoRbxhUx+JMv9mEk)in@8&o3* z1A6vK@scm}oPo4T??cepmbgK7Dd&U%odqaIXak;s(wU2NN%7LXF4YJ+Pg0KPY#UR@ zM7md_I!^C1(OHG+2IZG9rP%2CJ=G2B6_j7{kIo>(HL8>J44KvvuL$QNBVI{oAJQPj zLA8@&BVTUR?kw?uYA5lTxJz848b&#yI1D}ikqzpN6dToNnn&j_L*u17M7*b*lcvdM z(i@#O2ve$S)MqGO@|k)H@sFNqeQi=w;w05N;v{L1;-z~WikECqKBy*=UBZtrpgKvt zmUKi~AneIMI>%DYA)iSf)bj`f@|pBY9H+H}3;9BIvO-FCiGPOPs}cW5=X4$?{Ai47 z)6hrb_p5C7(K9etWP9$IGoI`z@?z<^R6dU#yn4#lg^#qGwh`2G&|ilN@JHwEtl3d+tgb6tPssRm>}L9<`U|t*AXw znm4+mwPg3#Z}~H`BbIKFKJ!ko5wFm{U3OA$?EKJL@{hDY7}T2HONxVdMcg3Xzw0+& z+K+r8K7Xw(e~y-TO85~sXx^INkEQ$`PdAc$zA`%dcbVki8pUR_WxBMM@S}K%LzIu^ zzKN1AEqrYx9+2H_DeENvKAe_64@a?)7RVREkM<)zlYXba-yy|IvAzB^Sc;8wL_L5w zS*`SG$u7k~W7I21Gh~-?PFf|7Z#py6D<@B>UXd2UOSP8pqgrC<7-=i8vHaNp!jJMs z+9EzroxV+q_qn7vC|>Fx#9iX);4S+k45;Rie^kSWZ`YPe_Bm4IU8ma&Oxi_GmNBhzJ4CR;3K2#6- zgvmd9LpdUDP!FJZ>8wmSqMXyYjyO&{CCyO1B3@B1qq82>PO?k;Q7tyRZY$LY$`RS1 z`+zRXVx@XOc_R%H4=NuxA)Q~SFHk)t9ntxov_N?y3`pn1N$NdRO9($hwLj*7ka9_O ziQ|M7VL+Ou^Eiz?onBS)kNQFs+{aUn==@Cebk$P%^Jbj}%AaATXJ1r@2rIHdHHUf> z@qqB7^D{k1BJGnt=uAksP~V~&M*C5XCI1Z74BieDeWr60 z#Y^|t{1+rADs`V7Snm0Vxwn~RG-N|(gO8;$~p0wY|!%;;xpA}IyaeJ zzbN%adR9d?i1$>-DZj)6$|cnts?U@+@`Ylfvm^B=@{jCNeWuz(XCLALaftLry@&Ef z+%VKG`9e16j6@jFIgH|)Y-uqU2UE~z(CU#0p-b%^po`;mWC>u4?25~^#4 z`toG@b*XL;_GFiEA^uU0=)RlIVRjYMq%(TIa>b>wvTpCB_hM2lt4guaer8p>O8fOK zA-`X7I8=AkNd5QEy)KQ_epya>{_@@Sf@CAElzhKBtY*9v2l+=fu9iI_*&wWFzW~!@ z$!8in_EUcDO+I%nK27q4ut`AlQP1JWSbAg)o~Naut-*&tkq z2b5pJinu}X-pX$*@qpr`{iq(0W@sMyOgW;l(IuB@b8?qrqcKB!6k$NQqGanxy#c5yuHX8l$zO z1;T)MKzyP7$Sz?uaaeun{^PH+j#A&RcgR#4J8XABx-Y9fV6^l((9KR+(!5>Gr%867 zekvl(n-(B{Ce@-+oTRt0`FBg7sU-g>Ua~>HtmwL5@_EpSgAy(jo3nRmX&&KB^9cJ( zMORB$J)3w^vO!qY-&k3~uY8*((pvJ*A)%eLwn&|-x}4`k4|`8(9`S&%r+5h$$|doD z@^^u}=Lyf}O8cdqk)OX1_LSc&C;5Jmc-r}Js{G6dG@ZX! zxHe~gDK_F2%{yi@SmN%;kj)YXw3fyQQ$zJj9Dny){$1!~gE&rHBfb#!AL~M?O<*{hG_a1D57d z9jDl+Z&8gPT^h=Jnnzd>C&?~xjcN{Yjm{Q?J?V&S&{~R(a!xs-GYIjN?2-+_kMc_# zqWuUzs$s-6s#g>*ah!b4ICxH~Lr5N2moN5l?M`OfO>a|o$sLw=vmVXY2^h>#u=?J*_27caD>vtrJgaE#;E*L2JoB+Rtm4{24ylk80=e>rqm@ryP+D zLvf*eP%eqPq+hCk#6OCc&LCu$^h+EfE&QIkO5!f%^4ic;NgtG7T1#Uq$I8#g2|x0g za!ENNZcu(HAEa}tO=N@oqj^+wNDG7?VV}>ux}*tbGCI5(jbk9WbQr<{glp~6R@N^MI-_>NFPk!d{=x{yhex}OEI?`F- z;M)Z08Aanx^3Rjd7_B9rDYo7D%St_O_J-+_&%rC6OSsT}WW0Uq+N@L`op;%qIeo(?R>VbU!L2(cUv>#zlJf(Sr z3-Ouek$=&%2TIt}Ji^&A73@C3D@0o^y5)TOb5o6@vTSk1LIB1OY zL3txz2p6mE(n?GFe4#P&FV4?S!oX1f2rKFf#21S9 zSmRn!yi+^IN?fD*Om(Ab%??s*RM%3^)|KXw7HEugNj?)+v>%O8E=j*+gK|#TQyio> zL-|KGhzC^L$wr6Eha?^lPYD;w2VqM4Q5-Zz*i+4!aJY=b@yK_dB>qtx)MrQw5Kk#@RunJIqq<9LX^iR`@sDDoUSTLMq-o+1;YYquY=jlfBO7!dK(P@w$S&b*Xf39C zPkbg{C|*N3PPmW_8l(C`y|H?kol-v{?NiPv4$4u#Ev7mn_1{0gPr*=JD3|05VMX&u zTjVqCM?5gJZ&5x71M-=Cp`24}RO={S(i_D_YiW$mtdvXAAZgXmILH^OlY}4POg_^& zjI>4f$rK0SO!b90L~Cgt<(F`wUPk*F8XI9s7?2GbBh64g==l(7i)t9lm6dUOyA&_k zCGJwZw3hhd^{cUzH{z+GTBWr#M!t~G#39lQ%_E!%E8+(ELUGW3G)6vC&Iy+vx2{U} z*ffv)qd17C^sKp5^H0(}1Yz}`aMDl=NS9O-d%u@ITl;p-e(8N28f#Rds}ygc#*HQH zCs@6a-V2=idam^T$E?NqrFn5KTO=C`Y^O?N{XOKrgGKvw-fSIgI zpNIE6D$S$)#OR(|GYi%l*WkTWS8P4 zZ7n$|zh^@{r8o?o_u`4?Q6u%=KhH*JjN%}DOiz{nt`^}kpzu$L8&tz6wi;#gO8g_A zX^ePJ^@ZZ4I1JT3+5oN*H;8LzK}jBURq0>q_yM=<%oI|VM;t83=GXV^*pjc`JmXS zFOV;!BbrAz6MnQG#X&hDyHqF17s7z@VJLodcBHckVL;fEUGk5xqP0}p4P8svQ@y8o zWP{?R*yt=py@GU3ydoRKA;OR1ptXkjNBkphkS{bwc4;2f4MX)o`6ZuejC`TI5vGJa zal=rKQ~#j*58?~?Oy}{RZeyi$7{x)Dl8shA^4~?K{!92JP5dSKLiLJrL_Xg?B>(&y z-Otc|hfQik}fGW!hr6@4aJZ0M)lO;XW;X-4S4;mwG5H5rP?MLwv_J-<+e2E&6N7B}T_TQxU zacJJaI+vw+jlxHXoXiGmt=$RBmYQSRO@J-N2M?+ zA2g5rBMiuA;tOe->=IA=w0SJ~Z2YK{#24ZfVNdf2zvidrNi~AAwalyXV=rCvsSrhL#m(lp_0D6hyr!qm|Hh`Ur1 zX^hU^v>%NTH%K!S8{tgzXg{i_G>?3ywUl4lkGMvCkaVCPF{;I+bBc|8 zCSM49;u>j{;w4^D9Awwfd8Abuqd2JkkuMY*)gf9-*b~<%Z)BHx8DT~HQD3DROZ!o5 zgfrb65Z9>I5wFPZ#5-TLIiH`BFBAvWXYz%#PkbS}ggx1yI!S9u=h^X(&WV9X`AF$m zT354E5>~HW<@ZSn$Mn`=qfs zTOUYv34=DpVH`XPNlHLRQG5Lw)3&lp9e0OVxw3c#77}yv4A>q6z zzNbO^QEX&`{G%KhH zqBv+C*(F|irJt8@p}Il(AYUHj7t(&@-_5=9&l=Gf@#=bR`EL;ueumZ;vP(WwZKAcL z8R8^qA=iwD5`M%N($?O)^81|B7id4iigZah6AuWhGQQQM*t9O+wK;V}^A1i~C9S16 zXsnmjF=;L3m+A}EcH$)IjpCrbPdOr-ubJi2ZiN@tb)CAUlS>NUJ6%?mm%|9mpd%Qr}Vj=4T8MA|Q|W(!F( z&b8-DzK~touU3Uq(tb_K$mi3q<4vS_&swdP#*RB2l*Ur}my*W3J`R`0C^oX|HON~! z%ZD`yPRv=aC~t&)@QV%7S{fr8G;eSn6Kzgk2$xMBe@Qy8)3mHKMs{~?8ZOzW^R$4( z7vj~9=FSrK#GxPQ%_SRzDUJDA`${&*7vd0c_jIE;$rr+f_(C}%os)l$pJhsMkUskQ zn@V{ju2F21H(E>n(LB@c^6!XR=qmqwJmI&x>S_sR;tTPQ#yV#tOZ$;s(#*|M{iL-N z8`TY}b^pnjp?M>olD15bbDi zt5jcTEoqu~MKyxflFx?vM>!`Q5f3Qdj4M-gM(V$Re$NTvOz{$5D7N7}<@;o+&t!x4 zd-3C>#6RK?t)={uK1lntAN5s=m+TsfGp!};4UL1aB3)8FrM^HtxoB_sZ%a@QAkEMi zVL*H){|INQFN7cIjn0_F4Z@G=fuVe+oYNR#V5l!Ej>|unN_=UR=gpy)O&-gJc_#(?;=Ulcllprj?|%?GAO8{3Bm7 zecYt|Qu6q&`jaYApLK*7)~Xsw}`Qfy?GcuE)$_Q|$|C9H@Cv>)Y{ zcuJU#@|6FEG|eNdh~tC{`FtR^xuk{sPtQvErM0?lvn4H5jJYk15q^Xf>4-Q8lxPMj>c6Bmb73tc8)YgJPmu5Ao)D<)c(YrI-)oTd(sTeqx^Q6 zFj~Tta3LPd?s-m%m-6Pie4k{4e4$*D7KpplQ>Y(NY(K;7Bz+LqXpHI$^)kvYVL%+B zd6W;TYs9r)9oI?uFmx@&OTH}9{g!M{ouqmYv0r5r=4u`b>uok0lI<&!jEVG~q%u zjPgPKgLp-85KoCOR1>N0QvV=MQr^fe*&rSeejnjyxofvLBI&%tOLHlg>5FV64$-{g z1+1jLs#!fn8mn2mhGfIOXe-GV+K+tBxH?|)&un~a$;Q4erc#eTZ@1MTyR;wqM>x~G z5hLZ_Df^$S9XRBj6z}Y+m!z@%cjV7Tk$;rmyEEkXyk?x5Bw=c399>_#)y-L(er&I< z$vH-OqcQT2d?Dd{AtZqt_SZ-)r#x z=48n~Lv1`v4iz~yNU;&e$p+y}^JqWHIdP5hL0TP^_*TM&_>$K*M4CrDAf8few3d9P z{8GIltf+<&R^&7Bp14c?(OTjVttFn)TH+tgBVP!=kI|k|Z6dDyYJFeQ0`Z0Xqjp=ii5a8V}u{^kIrVqA<`C|Hz*FOopjD2y%E=_HW3Df=9jcj zu~AQ^{0<41KN~=tBwVQ0kqyF%cuMmO%@Nfc!j$w&IifMDe}oI=i2Ng8XdY>SdJplQ z*3uZoLHki`lsDo5<%2M#I!W51d4wO;I>MfOCah>4@tL?wn3B(=X}Sj^{Aexp0J2MG z2FfqtLL4Hj$S(1jxJJ1oZqRomExd!K=TMc>Vt$I@rv?BYbg%Gp6+XDjQD40-(T6kktXLo80m=cquxll zBwXn1Lp721BVHMb>CPshQoLk?d?CBEmSUs)lJ*H_(hTv6{G(n$=QYBQ?2>;pM)A@Z zaf8kWw3hs<;3K~WPB|j|l3l`?>{3l6yA&_kptXbnX^{9w`6ZuejPgshll-H5I;vMx zcgY6fLbZ-;P#mNgvOztCup$g-E%`_Dh%c0L;x6%kVk2KD4w^^%(OU9_;&?f2y!8Cw zv$>!2%(v(EzogHvIlWvc%?rFN|Lx4fc1OK(_PnF(>PgQ=>|Yj@=4A%@>T<3n8>{v{ zl6)cmD(se@dv{ydR`O+jRBj0u8Y3GtZ<4l{K{i&n$Um>)ZaPEqg)kueKA1m}FeR*L zZJa1BVM=k3e}rjfoUeod@yh$eYboAW7jjE$iMtdV<*0o47RiR8YY79|kMNr{a;Ovs ztzEXapOiP6NBfa}&-eUGikHR=#lYg;X=y*gxqq8_(manUL#45_1o?9K^Tq9kQW{4Z4LGq8{C2e)>k}TmzzEF*&{8B9;Ux+V`TNY|_)@Q1J z#0|PNs5>FLO4?oB@Gf^C`X3IQAt-x zlT+tpgX$mEd&0oDep`tfx*y?*mr z+K;qAI1{GSYpK4_el$kd6L%?I(mvI3vO$(R9`4wI@1uZ2tSIA^h@(d z3xqTAna`JgeX z&%`UjnQ9$zgVs`wpfdx-OSOdTQk|q+lBS766bGG~7VIA{afAG$e9ZLxEOMUfsIL-V zJ~n$Kt)q0aS+$29uV&dXSz2azK||SZ!|_e zQ*9#uh(p9ldR9tt5T9B$vlOzHiPiS^~*`=;sFNb==WpnP9usNJf%c&Q#>9N-_tLHoTe z*inkNT$dQh?vSK&(wK2w`R822A4F<$Vp_-DNm@I7aBr<4^T!#N%KgnG)5ev*ivW9f9JOS?bDK7T1z<7el+jk zsdzUe$5PTo z&YDPdjWEc6|GTu7Vk6!Y|L!-JfA1h^i);{gTV08l-mfK}i7&L4dKuwN_)#u@w{0WU z4dOlJm+CY5O!J5b=Mm>dcN%es2 zQXJ$9af9%qTvER@bU)%6#X)tF)>17YObHh{`_TE1@T1y9^9U=dS7evsARBa_M?H%0 zBU}j6!o9mo+9wQ1Ta-(RL$hE0+so9;$YtIFrr|%`fGAd!&Wbe~ClX zE2z&9_M~6Jh47>gBB2rzWduQs&qgE;y?`GnI-Xx;w8JJebNloV&V|( zN0<_y2~*-4#Y?r0{G*yfyrTOV(g)QX!kK)g*oZ?E2d$+svP;~coYPv0jdE$|JgU3I zd-9obNwtKuMK~KeM$bHm_cTVnP`{)x!iC;npnMQd2~*-Y^#B^{bh4CG@5wHm6N$TY z?~J&>`yZ4eLpe!#qqS5MX&&*4v_-k3d34?&yZNWtOZlLCY&ru|O{91YYS^9$*N zYBBjo&u(Zxsu6S^r+W<=BOQ@lI{T15h`XdW(hS9+@Y%w%QLtYJ|L_R^$c8?VK3@O! z^`Fg4C)?qK`(j6XZ+=VyNv=pW%_VIS-h zSL|KNzg$YB+#SlAEt>E}OK9US!csO|7RK|YZKly3%vglE50zgx-C!QP?2 zG8j25)ZaeaQQP1lLD@U|TG$5#24~N)wRdoEc5-lcaPx3-bgf<6*(LisKGEuT+#K8- zJsh1p+-p0#y1IKfXMe}vFVII>R@J_mg?*@Rq?7BveNp>gU-n#M!mBi-)_To4d#V zqj>D2`~&+Bi0l*Sr_YeENz zwL=3V|DpbajgGhdX~m@`ocvF8>V({o})*it*3a2EY2BFI0qJu$h0G zxM%bZ%gap$Dz~%`p3St>WnXpmy4&cQ=L=}@%Kwolo&EK(c4nIFaoe%q3u=lzPIfTs z6#cLH^{-}%1;ulZOFcA9tkd0%>f&dqD;r!U>QSMA^%a z_w@ZVLcI1~ywNS6rS3`pwqADa=FBOUG*ZkmjuIOlTIiO{-EcI|o1@J`gJXotiH3cj)W z%ZU-9BB-MqM$}^?&NF-BsE9V2WFaIMVv{_>A>t zDlYcdJ-<5~4-$O~B$e(x+)OvYZmxF1@_j{Xl^HB@CvV()v9+0sfu1*;W=&{WucDc* z+>U;f5@Y9XvIm->WL2qiL>(~EDxQ| zqsD9DK4?MD=z(Hz=XPtWEzP6T#T-sdf6}IXQsE$BU948!#UXigEw@(I9=yJ+jqzV$ zV((3>Yk3>yQ8DOpb!Hpy#SxR*#HO)t$1A0eJE@kw$Um|MlF zY@^-zzPueNru7j0HhBG6dns*kW#f9IghS~v--;CaGq3B6-^F)y8!b}OzRjNS%tVbN zZClufpA}+7^zzhdpAMU-cB58SIQ1zuR+R3&@0i~#6W!;J_Y;j)&KaM0I#%e)&g+)q zXQDg2WWRRE)?*G`Gh>C{{jm29JWNy_T|c?=+;Q_UBJZj;aeMNas9LS?s%M*Drenmm zzBS8NOgGjo8(Cg-FMIBo#p_tnw!G!RIs1%NUq<)Nw0(XcR%AYW-qv`kv98L(bTM=5 zy}=8DV#T60r=N%QF;@MXmS^(%A{Md2(|29$LuX^%&WR=(^XTP8?;FL62NlN_ZsX1DhJSO*Ox3Qw?`g%FC?(ROECqFg0#@*4p1%rRF@}&@I=@ zZ!^W7ZjCP9X!%>K)Qu`_U%HQNJzM;^ZS*tY(=T;iRK=k)2M(Dd8udIZxOLUtRVPE9TJaMzP^Ry1{erlDv+j!KgbF1?&5Vj98 z4m&OWsjcHyI`P%j%tl><7m7fiEw60q|I{j)t~sh@-y>@miQVb`rQW~%p;a_v75kz1 zr5%gKci-|YlIQ+V*LLrokguxgQqk~9+VGv8f5seZd=wj!mx<{Ci?+;o@?AT|yMP#! zRW_vW>J{R~vktd|W_;If-2M&k|+n-woozRnxECh4=*s%Nq&les=wZ{Q*ZEV8HBLgzE zcI!rp&)*-JzV<#SO6LyCTxyf4#=CGv#lV^U4hjDWHS9(l`l#;b`{wns($f!%9j4Da zboc$Ja(unjh&3)tj)<&DYsYz5eN?eOcu$v*G5M&_nD^OJJmG_O;EPyov%Q`3m0go4 z;--{*l-28lR?&IQ)cP&TztW1UmNyFCH2t7*_s0Dv<`=i+jq7UaR!vd+E!E z)*gFI_~maEKELaGHAii{14~@$cwB6snRiWOuJ>A{Ca(Nw_wt+53Gvzb|o zQSZ8KQq7Y>%o&}_xx+hk?SUzkZrN2kC9JCq?PvGpt;${Nvvq7L<~}XfRC{wQz1drB z&FQnmjPoU;jwYNIE;anhuU?v==E$#9jRKYXpAo0+@5J_b^F~{!{xWURj?W*p^FJ%P zI<|jMM!ZpZy4|bil_DL^iI>jjMB1#^>e#h{htp>}Cy9}6nw3k^Uul(k>ghGw-_`uQ z$nUZLS67!;YAy$P+uk~L{=8UK*S>eLi7!UB)DsmrOdgVsHWMS3f%aZA#PgU-wx_gxVkd`b~vtg<4)2OTBX_pq!jm#gZzI67O-KCtxH4)wY_)U`@>FU~Eot{2CI_;XU z=;cxS__l{y<-Ad>^1wLDLMdWdpZEo_zaFUE7`-BJy+6|a^#B~9J$ zL);7RQuS_%=c%U8L+$UV`|W(w`-)4xRAG59bHke}x72(LGCDVWRC=ngf0XV&a7e1E znc8`mmwbEgmT31p+3s2Kn_A^O6kDXjp``t{MdX{rN4`g{t2Xw2Y9eeW-w_KxY+Li7 zPl{GK51n;tH^IJbnmClT#HW|ZHPz=#Z>KfgJno9SKPKDW-f%^&b&W@szQ3~6Jz-=V zb-#1-WK~;RE9dXh^T|EYIDeAo#yb~P4VF6C_sshv_r)7RK<#^TSv-R6;>3u9+yx&q{!|uTKYP^ldJEgV%o-PV+Dpc3ea=yB@ z{@7QgQ>#7_n*FiIy02;?6dpuPKNGUh^O2amr}{Iu2@8Z$@2hWHW@p~+k=PnvX=Fm> z4MM>*=4|=U;(m|Bxf9)w_n#0ilziy#hdg(#IUSjmAQZlA{1~wCaqmYWe#y(EF@cAL z(vw%bZTt0F>qnwsgT?*N1nGoQ!yeiM=2=zyk+|S~^u@)>Cxp_EHtQm_d#oObiS`c% zrQAOyl>4Lgy;k}dolh4UyF3}U7o8PK?|D?Z+vjZ~)5W(E)j}V(JFo6nuyeuqw>8tn z-U6*YJhQkYl8zP8IG=8xukF)^V*gn8I$1u+;=OI6NL#sL#D}F1#k`p2BZenl5z5(O zhsM0HN9%_oEV}2BpCzw}guSoC&7|Oh_HQ4E))B!!W1~`3yC#FIhdkT$KvWNo^~#-c zT`2bf1twXgr9?asc?0K+p5$;-C})e)c~(_UF8@G0@m;60n4T(>URLwjuo9ah?~CKT z_vM=L;+7iki8^lak1yR5E4!VoZ`1gWP|h1VzaIXL>fRG0JKi2QZ%vwt-w>~{cP}2g zE4sCLeX`i^yF%$vRf=?XD_-fYaBKc6&(a?Eh0+^68|?bjeR7(Jt1!7@fu0Y9a*o(s zeaK6Xk9R~?Ih&JhEgq`5?7P~!?c#_#!oSQCzc~jU3gsSbN@B*#1GjIBYb7h@NeM_- z<4q|RdGJS>+rqo}w)I7dJQ7zwG!i?Ue>ZL&bW7|k;@Y^&iAO>?4_&UCwEe@`R8gi- z;?qT8kA>1#uS_0OeSPs%G1a=sq}%15sQ$$UZCul{>rL@BUvibwm!1fv9~BsEy&-7l z4bk7S+u2?tpQ@OK_o!OyqxB7OJ#YGem47`G%312g(;5L^`d=3fOb3}iOnoMlb57oP zyNH>`Qp7Hk%*_=hJy-F&clY=Dg4I(*xm+>L{ajzDHcpnDbg@%{UZsn2G=RPDa18Fs5*!>c0jYq1*DG}#=;#a``5P6hN=xR>~dc0 zi+I)KTdsF%-liT{yJD1Sk_h@xt9Yqy?}XB~>hEk3<8kz?unUWPUN`=oQ0{flta)Ph zaPk>(=k0+5JW*$n&!IHdE6<{?2UJ~6$$S}zLpu< zQkyJoMjSpVj0R7vrnUN@`rKk-#aZoNoe=w9CVjo{`#~sY(X4q3#srBIA~>)>lF{K0 zDkm*lf2r7J_i<6_d50zC3w{(zt!p0MHp0*SxJV0FG_Zc)M|JIx_-<}5b{!LQpQP3C z)qPasjUB(NjeYfFqPbsr%kjlBg>oO7=GCal)}1<$>yiJRb-|fJIp@S%+;hEOTqh3r zY}tD1RHjh+Z{d<%?+p8tC_)}&jCfl5lNy_QnV_a$izSN6eVkjGMSfB_^dqBa>K^S; zarbUi>8j^HsXi~Z4!pCr^HDLc=aJV8h!%H@js_0SwcA{&aIb!aq*7_#J!GPF6FEFMJV?lVGZY52UR*C=3iU7!hZZ0 zb>7P_#jkDm+%HiaDrQa zV8OEow}ZR86D+v9JHg%EH9(lb9Rk7K-3br~a;N*e{hjwq{r>CU_rCY8^|97jJ!fa{ zT~$v#_0;a3nWWljYhdA0@p|o#>vuCpj``b^OC^_&^&;X`gZt?%4cb(EW38}N9XL_x zaNpPQI`%_;XFU^rbhGMJe#(rwWq#_I78qT!c*;?mRL*0UTJ4+vQ)%}B(Zg<64=%P* zJt&i+z|9Xo|JGP_f6k5T>($)Djh%i}{H51SP}+Xq@RnGQ%AlELvSYKi{=-_Lj?(%feP0e1jY;n$~4@@9yR}e5q=AYn1=; z1`ZZYhxR=#)$LoeCF)?RH3RdHa=H9t-5|+q*69I_2}@Hzt;{v>3qLM?S-oM zyjN9f-*T{MXY@@MemuX_(T>@5ubq!v9W7c9eUv5clK1$zDkvadn(+LN7VW;Q$--yu z17FTjykn7d!e^T$<8zl;!H|I$3r(TD01F zQm<*!yIynDqGbCH?7Hu0(Rxq#kf3u_x6D>?b#7%YpV-Nw)#cLoDw#WGovrH5`Z?)p zh?73g|8D5WG>;fTvCt?W|Hh@2vBleIis~^xBBEzRtScx4XvqM1)1C z!AZ{iEK<_hqMa>#p4ZDV%f8=@>TlYf>fmhA?mt=&kAJbadW0%8)#rS}S4;cVp9TwyL2tv6=LSzd8)^$ zGJU(Ian*e}=k&|1Qk{9~oO`=_KP$NExLBL14e?p#sT>u@RhZJt)uQ#38cCvGH$693 zjUKyxOS&bl7VX?LIAH79E|ur12glE**mBy{qV@gqeeYDxv1pDe>H2PH=oeRu_Do@8 z?uPAW9-FP^mGgamA<#|d)wUv;GHy5$p<+iBsL|ptH$9H6-3N{OmLx*eJX&|}`+jb^ z&tC_nEbOskmfGahFT?PaZWitNbGwGCeC`#Vr98^aALo0~O~>WCO9tNo3umgfBM!V@ z_QUP(oR1h^?B=5x%4WOUAb&P@y%rW+crfvI;u-(-%w0Pp*`K@H|2-IHTs7S=UK>{p zd*iin)#5c?8&~c8XS_D9S`8YnjjPtnjMv6hJJ%VnjjMJpF7Vi1xN5p#yf&^Bo5oY)=f;)hY1(f5+_-AGVZ1i3G)DX*o@!?wV;|#6 zW13DHKR2#gUoc)9SHhn1Mzx@w`Hg*yD`85p5wFM>su`*`?TlpjU|fkCgn`xvjWx!V zYLIaGRkDr6SYup?r?j8eYmGI=m3T#3qTOE_YmBS*zMt{hxDtmbN7@<0SYupCO9)fS zCC#JQwD$-Md&X6J55stET*-#^oWc0Han+vv8?TKkaaTJF7(X|zgel=iW7>Jh*vGgM z547h8#?OtbcHS^v8&~RO#Cyt{_H4x1$G8$VsD23ps+q)UgRtSY+*6FzJ^x7bWEy+> zPX6kMs3G&LhX2Mj_v3tGY>L-dF?OO|9pOv;O@&1dc)ehi7>jvvT&#WSDSyqMS^t7A zUKf2PzGph&GxDoD*viHfXGHhL6Gq@qp$LCn+Dv!==Wab&eJOts9qK@cyhrVu2~; zvg(l20vFnkFr~Z^Pbs#}xl0KA!rhjO*qYQWBjO z@(Q1+25DZGj2FdP;{EHj1BB1nD(Ro|u~YuRFoXA0gH&&XDb*42pxUL2!j}|1hY1dm z4a!l$v#$gOlsEG4_IdfMeJI|IO~(iuluN>yxHe;WW{ZKjaV1S8UkC%L!Oa_!3mau; z%Rl8naS+!C1L7LZYg1C5H>g(-4+sO&Q>shq(`1*pMq`vq(pc&hv>$05afooHyb;c1 zm+G9xs8>*q$iH+gqePt_2S3R5uewbC@bombd7jV`JgefOTC+V9$`v35AjbcG?wNOrZh(W5uXWX;xlP1 zX&s$ae5Mu`Iih^feG1`1K9gOled+tQo$*|?G~qz827 zB3#fe=n&}@osn`y28mn}|A<30Mm(iBs0Pj6!;%f+291%HkX`a`O!i%-w3zG?|42(n zuLx(eJ()C&bciq|-jgrHXVL@G9Ez95C~stg;-GlR7wVx@m&5})uMt+nE9#+iW~Det zuSh%T84B@~^px(CNr%W6!j$454v{ZZtL5MP5_Rd^_=eDSvP)V=zL17d&IxfnPEkknTnf1h&uPd8agEL;gfrC}@qo^@6dTnRttGp3o}_rm zKkBvAD+qf!TaaDqM^tZAAJl)T57Julg?c=39P=j4N4 zi?a{aAjLu2NwJYH*NW5^JRt2PJ`;C|YouY6BZ|Z9`HyT+Z=~2rpJ^VQ!_3A@Iz+su zoKsDc&s1-8-XKg#*Qn1>yyP?W6yhH})B0X9wcsRa9dVLskm99#9Ez80P(DZ#$u8kX z7?4g*1M->bmpD#q2^aE(bTZSG#)5xl@70KZROfUa zC;VuPw5e~s{K9AQg|H$%lh0H$)RRf;sE)`6@t)qFCO(rdbWS8+=$u1+n(n(PM-&_R zN4iEB(0-(ogbS@DEg`#9M^wM0f5bK72Jw$DrTwTbDGnMVTnInn0mVz_7pg(hUF@Oo zxf{98V-7bDFJ1*NU+VX%>sMmDg1lpB18c#|z2N z_@CV1Dr_Y0^+x!-zQl5uh75kSwwHF|IkN3 zw4N>YBVUNm-;2o4(GpJyKjH?>Tk+?K$nTLy4#MY4!Stb1YbV7a}j$)%)AYTYS+K>25^*iO`77;JS_U3n25gXMJ^#I~z z&a@|lU5bOos8>+UkX_0-)hcm(-N|X82{n=QifW-(n(6{S(h{>{R9l@Y$j=54ev~(= zE#mW}DVszb`<47$Bbk*G>_@dvIj3{y%0ETKex&1t z>x~zhNM~EBkIs%+1Xh$c;vdZ;jhOn;QN%&LBs*ds6?%_09t!-(VLGjWn~ zM7*MW5T;bqRBx1X;s)VNdO&qaXJzWEgv-x`E;a}K-#_;T)bnURx}Tx^(%FafphZvl z-5bggaf5mQ#Y<;p$`R$9&UM6b;wjY(=@s#cdKsPdNIS_c?MGVdel<{N1m%cq(0xFI zMZ<+2P~NBpi3i#C9Tn#n>IQ z&d>B5iE5wfgU*D63-vA1Fxrnami#kYGlU;;lDJF$kuRaS zvnsMdyeA!}{1Oi+m!vtQ&y+Xvg<_+#BlRfqkL;2@lQz-Whj>67qI#p=LwO@^n6*p3 zkPSK`5e9S)qc}*f=zf~^qr4IJ#8b*8^+xKeq<^GCln>gE{3ETSwWKAaYi50UI_0X+ z4Z@!65-!9)$`Rdn(>W|l<~!ny-a11{F_u2$gLp6IM&cYIHrmfUM?v36bMmI6~+OYxfBZ&&7`!au^E z;w7Grb@vc)(0*p^cJvx8_9G6FT^gf$o8c27Y_vc5yJW&#QhpEkt`ci0w%opz#Jp^N z6U4nA@r8I#+@N@$`0o;S2?L6a?2--gnZ}3*RD)!LxJG%SIw$PO2H`?Hp!^b6#0`q~ zrjL{00mV!EkseUZ&^+>)aztapQZKS5tPhHf#?1C8!hmu~^GGAe7vc+P9pOhDBHblk zk$>b1)e-4E)dJ<0bc4obrK}=2Nm@d^}RFT+Ex?UVbJu zQPv5f-bVWD5TB_e|0rIvLB1?$xL5exmMI<1&TIMY1B{z8i70;}g^j|m%u zRhhNf1b!K7R1|B;zu?`q#MurhS_AvL@V*Vk2JB zyu*H71$PH`UoU*7wKPVUnyp{r_=i98ccGIF;y7`Q_(Ir|FU0%XJ+oR8=A&w$pTO_% z`i8cI^T;mcjdDab(j6Tv>~a)i2Vp>su`*e(#fZm`@#m{Ogcnk zo`L zdPVUP$I0h+k*9?YJ)7brG@EpT_9ILwHrkJJMA(zhE#+tCE2|ub2;t6$!F`tQ(8;8r23$>#(0j@e*)WR><%4ob+@<;@ z{UiQSymSU3yHvl#A*zKxla>kYQZ8fq-VpUc`K7fqwsfR?K2G?N&y-8b5pjd^OZlKW zCv74dBb87(+T8bA1d zAiKo1v=fSo`@Gu?vmHoyroO#T{;sCH-tw8p;{&C{{Y>`3#l=}5^8Ie{jG{t4`F#=^ zqqXES#kRvIz36!})=UvTcU$s8;6nS6f1j2P5;n-^OGRD_yR;vzB}~b`ER*kv-grGA zv&e^Ymz82{+|I;ejQlf;)rG5(0@HpEdEDr0ry*&c*$L z2gFmth4Mj|(tZ>NjS=>wIb#l_6CCgT;fvrO#X)_BYJvQtF^ZSQ$QR-%<&Au%{U{%V zDXslaVk3?d2J<82-^?bTNlz&bvpyGd@D|)4Olge#qr8zXRF`xXAgm}}nn$`zYiW#h zjrd2gQLiwI3)M7ni0~s{C^o{1=8+A$51`nH8)TPoHmk*?_rz!Nh2k~Kal(ac&=~0p z^~T)kwu*j4wNE*xI4DQ0H@Mjx^nd^S?m)A+P%gm7}XZtCsQ1RGwBO)h}P0P z$}izUy^QuV8yjIt7?2Gbqne?7(DNaxEz&T`Iq{0(ARB}MjnRITU-E_Qk{(cO#YTES^QvER z5N846IIX3#3h{u>FT`=u60%F$NzaGK2K6_pU&5K}QoLlBxJ&WUTH;IS?+PMs#8b1i zN^5D1d?BBSLsT;~k8mceh#TY!#X#cY%aMGJu;{A{5^L@m; z357NY8*>6DiLnmF&gwy!MwEAqXrSX=5+SAjk8k9;N@S+1oOzR=p< z4)=sz$_LpXUQukcAH_@a$mcQB<@fE0r!+&!rZjgpiY(eQg1pmlq8YAA5zEHdrhuPXk8^AT<261iX z;MoE{!iC}>ZZv8jKfgh1$rqYOwMuqrKjIbD0@)zG{`N}^q%IC4T_gyqq7wC3aWGB71(3}H&OPkg3&Gi!t5pd67eG>>vbYt8ycxR4U$fk$x+LzBU5bOSBL8TN&hmsQ;X=L;rnDceC0}S>?7KOleyL9rrZE>@inZh) zttE{$yO!$1Y@HLYNZ05rO7%s#swY2Mvz3GHrcD1T>bhG!jx4aytkgLpu^ zYBou}w?jOj*l3LTCi#gRmlQ5Pmd|I7GP6Jo1I|LHLn>lsB43_>m@3t&;vxyc8R0 zZ063sLKDen>X(GelGxOOf5a=|GwD^&TJp0(gfnRv<&v-`Oo=a)53)=1$OhFG%_H3) ztY|;-kNP>~gX)*;(iqt#|EQ*E9{EDKq`Xmm(0+t7@tN#WEfDXiwusN92V|G(oaPax z|A~K8TV&%usRi1PxJEW;jJQTTFguTMCc9MA#7W{G@ru?G4=BGBZ(O4~qIZ+-QqIll z2G!BryH;VBFd!`nPySx?8Oj^o`_X=cGv$qNCLR!`)I*6c#C!6Ew2u5EUnpLRgZM(Z zq_aiHp9vzrv>(|e?$Q~Pa!EX;F%wzEIB1-ltG)Q7#FWr(a%) zTvC3iml2;SA2g3@ns7GDEAo#pHM<{imo$;a=StZ8&8_DkhW$L(E#PRjsM3pe!aX;mIJL{~`Vl81nK6};OeJG)g zvSX)+_i<=mo?hvM-32W-3ZDms>=9!#H$D({347mAHI`QheNv6ga47~~E3DR7>*t*NQ~C^oV|{!xycs>t6>O1vlhXsq$xq#_>_ zFJVP>IWfGlEg_$&J}5^`n##YIO1@AXQ5-an>=Lg+ADtDrkZw?YkS`B>l-Q5_yS__) z*NDc5S65x+-y$ab%<2o-C7(%~Xf4$Yagu7maq2^XAMu51Yu8=*J}31B+K;fJx+I*5 z2ZU9+HaSIX)ex-O-W| zE9$?L56UlLx^jPAffe~zyl@fW3)Lm@pz@jgVlB-h%^__f-6fyRt|goswFnYE6VAjn z@{jUM93mSO2aS;p;v{JfX&BW4<(%q+e4!d7|1vrh6dEyp=vr}B@kzZ|%qvyyx|kPs zM1DV+=6QFK&oNi`>@N13kf*AsnSw=T3tz}C?Uygpaj{>;bn<-qeYCTf_q^J2F?J+4 zQjA^ckVcG!ejX^sC^oVi+NHEO%lE9-_n(ZJ%^UHQYRm1QkI)?A74;d4gEV$f;z)tt z>X;#dr^G+nkLFR%2`kcU$}iO_=?kr;nkHV6M$lUF*{pw*bE+fa0mb|7(nOns{_mgP zb3!;%yu=rZZD3P*pG^8pHfX<>KaUCi5r=3k<(KM%YM=I_zDn_uU9&jTTEgCJ9E26s zCFv>k1?tHun#;c}K|O$KhQ)PDn0W4`%!+0r-bRylJajz(>%h8I8L~b&-+|FMJ@O|J0imXE!si2BeT6TiSA-vpQI4pNM&;}#YQcTvOfg10?fH7Q@Okj@ zy@wLk5ye5+Q_avk%5Q@)!vv;;3-Mq^)6*he%3I;ZdxQ=0g>p%?K-{ICLj8zh`_(gx zs1M>Ajgh`kFQfbt2E-wnNBJOKBd#^8yGrE4>{^PKe3@taBW#dPk{*PwStxi#xg_4x zepG|R16oV9PjOIwiIbE|>H)+dIvXX_J{Jcnb9@k5RFlv zsZ-~Pz<~HnwM8{exR8cXKB#{XuP6@UDe;9gk#v{(2XT_}Ms~>t@qqCA4BzE0QuUyy z^E$6QMJ^xB^AjARc`1{4iN0!CK2eP2DH0@XJRtvw2jmNlRoT5jdtC$3RGs8)v_dM|JxzIe3h zF6I#rh^G`AttFo+zob`$6=@h@MLrYniM!+i0!05MRhYikE!$n|Duejn6}CL zMqDFpA`HytmujD4qn=Fp?bAzsHh?%uxRBP74Z@0eO7qO-h%|>VrTV2D(HQ9;;X*kg z|Hv1bN3}q`hj>qGX^i5a{U|od8}WehL70+GQf<*Z!jH6$uqU4hE1E}qChiiZ=Mr8Gv$bUp|#X|2z!cy z_(wUS{8GF$Ms{h8a!xqYIf81H;vhYsd4wPJLBfxCMR}vO6bE5X_q8-e{4?A4mv$&` zNq7%Nbwv14Z=_rjE_C)GO{D#ZS7tHYTCs&OPhK{Z1*sHYHCgaNH3|7afZg>p{ZB_2?0 zOTJJXuO^Qc&kw$OwiVBOn{Lh}KEGDr)m$;J(?$8WGY@2m3QgGaqE?j>&qngTN+IUO zc4}iwxRz`z+x1xZLjGmiA)k9Unp;!&GP|FPz=g)h2F)914KQV6Ng?@tjiPQ-g)f8w z;rGe&vA~qDqO}uLN`WcGLH-e@u@l+|42V~ykG>J{zCPz7))IFqHp)@PUK@lBvug*)2cU zLbV_AYM%I9B-t3D=7`Ub64wYT;u_T@)eLciYLNV+c&WA;Hi#DZkuRjNlwZ;k@`d=4 zf5TjBLVYIvBW_SG$u8xWazyn;`w=dL!NIoj**euF<%41i?i?WUHb%`AbxyiQd?8<` zzY+Fim&S-!r0vw>3H$D^cM1%s2B}tQjQk_J#0|oQctzZxIwIbaPEx$Y7s8o(DAgeG zg>qyzj;yw#7U|xIv>!z8r42&BJq@Tm+Fnq5yS(^5!F7~pgu!2L-CSbI?IoL@JG}y zagxpvbnizzAYM@&5qGHusaA;_X8A|)rcSZT6fS15C$3FA?=N~I;X=KU^o8Q3GY#>I z@T1tMerX=n0^v-2rt>q!LE1$4(SEd+Fd$5+ACZ5=`;OD11g~g6!jIx0Zp6gN-&;nS zLwTco&=~16@rrOJts`#GTG9wQGf=#wC1jU$l5$BkO&p>)=-f1C?`Xjd@{jT{t>jmg z@LWfImH6_x@?)`wMn01^k$=P?;v_vQr8o#vI)_ot31>QQ5Qk_jVR~-S22pR6%R9T}{nnBv_r=O}Gequk$ zN6cSsg)ihE*(FR}qc;n?WFxjgkeC-#Z@(COnmvTgPPB|LWY`V}%;wkw@wMsbC7-3Jnf^>uI&a%kwR?!%7k~D&HL|i+3 z<&jFLiKJ_UfzSPTv6f;Z-V^`sSCPMWkZOx;5O=Fx+9uwwC7+2ew3d1q;Y|2ZF8|c5 zA#{UyPx&Q%CZA~@@qqlJ+9F?w8`NtlmsFQjTU7hRp@lWB2~HCKsE)`N(kt4JFrfWv zl$Y=8dhB`sx8VT#bMbi|MoKVGV+-?M0_Tn&Dx+i2xqEuv-zc*Z|CBfG>6$~mp2*eI7~=aKFb z@5yJ%C20xO7U67mjGlQA?`e#Dp?*nYgbTgDK=~k^5~jp)>H#!X?^qh4_hgsOiNsyH zcSc;`{SV5KSx!>kXf0_X%_Ck>ZBZ_19-TMHuFvGWA|G^*O=n=zM2goe*JvJ{U#LDv zi^)HFc0>D-M$mbj?lowP>WJ*p*@x)&Mjo7UkvX?wM6)wW-+ zPQBYXI6FBzI5-UPb8z_c=XZ-18kK{KI<)KCuB(Ig-~WVv|MIGc!~YC-{sqauNb)}c zpnvn>Z;kl30kbdv&lhTiVAjh2$2?nwMZPxs&-Ck=#6KS8zj;?Bvj2a{82yu{`nBc! zrYZXO8>rp&>hqec+@nfnE>pen?m_B&@YSpDhxpnqXLPb8?!52J^1*}Ef>s+|&uigp z%k_AqIv-}8RQ>#5)nVo^$1xBc9- zB(_qCr-x>n)vVs)uzo7WtIpl@b&}Yw4jFHK(zwQ~(b0WWw{E{YdZtKXJN;$Up?ynA zFTZi5pYn`eTj=ObA6u0+tJSck^@@Hw*7U%O@U#XhzI722r&&*#3_JYs-SvwlwM z(9*}2$*s0})p+K>xc5WUt=KhtBQyKho<_~LKF=3;d1%rRs!#n|j}t%l*8OwN_I8U? z$5G06U%XHA4c_|N#*q)d?^rulZA`VM__i=_TjH;$4jsPY(I#oz397=Nn(dwPd)t~% z+7Vi;f9qG77f(_T@BEliH`YtX<#Wj@ncG~Oq6UYqj#{(V%NF7MS^ZvHqEN=NGgQE` z8ZYApdfEDyXl8xXeY>xBzFBIA9hbFk9@XAnpQ*C;__jE2+C;X= zZCUEx~niTx&%jFfGwu*ytTGh$ZYlA~4 zsjm@V1GBdG)cu=L|>EqOlugm`Gm($bc7JAUSdPJ)U4Y!R}K@F?+KmEqT_NvdC zLysSYEmGM=sgsdkR;JnJq33c(e90oMDvVIA(=59f7VcsDy?CcJFre4w?tVknufbK~ ztsx$^I?h{^fA*8FB8m=B^X|oF^Z(&)yPIx?_38R1)!fE~tAduLwcAFy>o!hiIa{^O z=FaNE^2$T^40qQtm{v0Vp12hqR43=y^&aKi^_(}U>N&JRfsV?h-IA+~-Q8{T4-B(T zUgb5s!10c1>4{2?o6orEJUDzaC~nh~&Z>Bh&q05txaoD|-rf7Dt$CQbI$?3cTD9DC z{&iT`pzY?^9;(OdilbL1`+IHQQkhRzx!6l3uJ&o`m+P*!6hqHjv-N)!(xFFhwPwqr z+Z7kO>i$*ed9S|v%08;JZ$sWuzBcH7rnNQoqbfiU-E&}7-h139XFc8w<&Wq0@EoCr9(Z5$ z=5A-*=VZZde)}4YRH@P}Xq$V0vn~6fd)DH+hwPnyag^FMwA}O|C7t!!dh%eociE(4 zRE-Dk4qW`>r1QQ>x^L$@))=c^m7f1R<54GD$M~w&921{qA7vY-#;h!xwD(viz4qfr zciXr<_XHK_`Y!ZDWhYzl%n@oqP^WyU`b<;@+Ry8p(%VVL#ghMb_h)k_srskN%;_BM zX!AQ^QJ&W`9Pq3*MSaZq_VB@3j<%2zDXrOamH+JCf0~*+Y3^H}29A1umHWo`d#_Aa z+258<)he~4ZTz5a)?U7q?rdK&Qyr=PrrgfE4m$6*-)`d7Yj%Wcwrx%i*X0g+oew;o zeC@3Db5xvP=|v6NI_N&Pnm#^$?e=+UR`~0a>$5x9!be4`Y!4IryjZqCHQkW=`M0Zo ztiuvt4Q=u2+u*=Mi`2}p;h~F~{;_KMJo(XO3%JVV-`!tUmXS zS(nX?tQRm~ty)$p$LCAGep)rnezz)Q^oS?x)isA9Rr-$pY1K5l&!c`*3(VQ1ypCO3 zo;vYQtEQ(x9gd8u;ki|n8JF$*p&9X3O|$DbUU4Y$dYkHBWl+sFDdVkL?{RZU`lV@| z9cqhr^ji0&KdfCIpH%Ukt#8Yo->IHNXZf=+>kq4@L&bs)XIPhSw@Mu`pnlCw->r*Q z#;XB&vfSx8bC0Uo;KJtE0^hA=j@t2f7vJ4I)jl;gb!ON3k#SayyWs(j9TFZ{@tuhq&-YP{mn~HdKCh|h#ue#l&H=C7>YkF9n*_^>I{NWdCk>BsF z-BylWJ1yvla_HH+V?f6**2k@qT84R#YqHYus0t}`+Irw!tR8PpzX1iS+K#HO-_ixN z>=UcwH*&)6!zcS3Q!DoO>gMwEvsLSFu?I5j9b5Xix-sPB@pU6V>)7X9@b1?IzZ1%* zblP;)JU?5t{yQ$&_zN{0PpWb*J$rwg_Q|U0ZsWD3tGB*$QVl$L{Os%$pY;7Ev}xI- z?CMi$+r-qFi!c6Y)wr8HMV4|+Z> zY@hDc|HK(p`%223+4FzUd3E8Vt=6eQXO(Zh+YWQPzqe|-JL$`y;M8@_slmHPZ@oYG zozAN^@Aq}f5^`R>D3P~$j)`xrx%<98bRmg%RIfr8RNW)jy?V}lquc#a{ng_Q^)D)0 zr4a`rSH0H9LfXvTyQX!t3c8r9v(t`OR!ze`&UroXQs5;uuillERjn_rn%3PMd*V~n z<4elr&XAL{&b`p{JNi)ejrSH`Ry|s0?|bLwbE|e1=$dHNm@z$K)SVa6S+YKVrss0R zgSYd>RlK4qbsrcL7W-6>EpMo0Nl>b*YS)*{BlkEywQ9X$-qXHLm#$t_frHNn|M7XE z*INd^x6A8py{0BR^}Am&?PDGL8`e*+o`hXjapME0PS5$sT42;9RmnelV2dO-RNEwH zO5O~4sOP-T$l3dkzq_HLXNSMeSnh$2-|D;ve#Wo3srnZ!Ug+wIdsa>FKW4R^_G@}e z)hs_{M*FBc`n+*9FYij~bX(=9{oviV>$h~QcEk*;_;BcL<{oS6D~!oKy7P)VYW$d>wx!C%ST&7} z{V=rYNYA^f<;-D+FEqVm)y^t2dPL7&RN$`a5xTmR?cD_(=O#hFnzawVs{$KVjeC^& ztj@x{BUgP#qr^{=igP^h8%8u3e+JfSrFO6{++^HR}Us)A+d<&fCZO4IQN7iwBh zoV=;#WcwbF%z9pFn7%DGr{ewKn<{+l`YmzCqLrrO72h_>+GO_)wQxZFS{*iAR)y~S z*`D8;7SN#d4Ry4ubL`b=SCpo8A6jQUe`Vcu^}5BjIpz9XQ`#A+-m}(ohv&GilGbTf zY-i&e`q;U{MZKPHxTZ=}NOUKo<(BSWlHw0%Z7Xq2wJElD==7|2l&1GNjzxSr{^F{d z6x253pG5a`pMUvz-TyJ_s@j>s?^xJ}`%3GVwT`}Onk(H^)y=a-!FR77=y7bVythZ9 zOIMWBsNJJi-+idGym?G)UE%z&D{9Wq#MhceKhnqg49L+wZJsMCSKrpzlO27mwDWGm z6kcW3uNZac{l5NZcR$f{)O!2RN>2{PsM?*9oEf?9sUGj@E}m0Mb%{~W9<@tTeBm>t z)qct!duCWu#;Ac!4|e@H<+;*yD07Y}@0)JCtbDHdA6hs3h0@NGXKwTj%~I~NT2Z4@ zl9u5wm8O5ulZHO|eCCo0Ic;qj(EgPk$N3vGU0T+;q|TH{vExF+*Sg)Pg%^(Peqqne z!LH6@tG-cMO|M%}u-Aow(dtv-qjgJ#zSZ%I`Z%FbInQV{c5A9NvBB^3{ccA0y>-0Y zMU^^dk8c|@zgOB>`BwSNRcs9|s0Ov#tjeGGgVOH70-oPb;Zpa!$~e`h+LX~Bl%{o? zPu1?@5p+(yJ`?%n#jg))aORt;!;=lsjzMSDZufRe%JuuG8XPEY?UXFM>=W-ZYFIhn zipxHHRN8&iNNdeM#S5NRl}8+SAK&Sd(#{Muj@DT@qs%Fl^icbG4IY2e<9OXY+$Yz7 zlj`mdztTIKe%3jj$M$^f)a57C+9FXeeXf1hW6P4FZol2vk1Kn7o7uTWtUm9@!S#s( zQXE$$>~(qKRIJkOkII(X@$E^cW6Jg2p~o4^d{ODsU$b6+-R+p?mZQopI6ldhTCudFF9g*;{D7H_N^$tzV9~Tibe~olV&*|9ZvLaXR)dM>fjZu!~jMC1?1` zS#e4`U+qY8a?9+Nhm^g2VTmMCSX_@%~Uzboxb*G$ez^M@B1wNF*F z_vF)E;+1y3de`x2s`t)&m7l$LXMGy4+YQcqWA?WWyVY&`;^EDID$B+6wsQL#Q^%l0;hcrn4A`N%+XF6I>zBTE>y`bv=jYk3irLQ=v(Eg|a}*ley!g*! zTa~jtN$<=4R@yno(z2jOwoaSXdHY$VYSeE%=QTd{%zD>%qnc|!)2s>kqqK8QqBjF~ z?A^RhwX&amoVNYZZG=aTuHR(!8kJ(lbl0uP94wlysg8T=E;+qQ4XXLZaR^ znC?-Ix?S&D9p~S8Jy+S=(Yka$94#9EYKtt>lh@YxV2-IuZjmwydE9HBfO zy{I`L+{vQd6Ze=}KX2YQvy}Zvoi+P5CyUl=xBPfq=}XK^bvb>+_bYFlESjG7@Ewrd z$!Vstm%{mxIh`$9U)Z~{&69LFW~fC?)QaHt&K9lS8ui%u$JTPXa{Lj|_udL;%bywf zE&HZaEZDEeG}V6It16T4J6klIQ|(XwDOTHN5L-DjOy3a+ze4F?AJW1J)@}HkK zbg^iCW>}9sB_?N>sO-msle1^LShVxY;_2SbLAk~&d#Nred)Yc?>tL!bH z$44Jmi}oC3R$~A6cZZBo$L#kcORKtCG%X3L@i5LM*=Uv1e(zFkysM7E=xpz<4S6_H zO|{?S{5WP`YuB}t?>3Y?_-BN&-$EQ-=jdk9G-p|(Wp6hY8=)H7@0sd{x>>Xy(6*ZM zt6eRJt0?=umCGPEi>9YTzvddXugg%C$$k&EW3QV<<6qY&sVn9iH&~6c->bEZ{d;Yw z^Q+z+77kQz?Duru`Q0try+QT0)vsj?=&x$o@BI#hx$8Oq_~cOLBX#RazcLwcz+_It^I=kB`Q8|@ct>@&N&8g9SmJf7J@$13^OxK?MPx~Ql2d(-fi z9v1B$!sl_L{)wJ-P*v>ruz`y`ESi?&SQL|g`{TB1tNmX0!c7l7wjym+t>wpBt7P_j z;=w6A^|6-K4h6ZUZ>a{@@11ki@ziT!WX&yw>ojbl?%D6LZ%p&FXu45$Z=D0zvo=s= z?f2qi&w1(?xTLLky1}~8!xM~r=sd&f0hxu zJ+Z#F^p>?rW|gX}qV3N-R=i7W(KP$qUmhhYl&Yc%+nrrXy>7T_lvToNK!?$wLg<-^w3MM>E!-ZO3(XH zNu9PoyKztNZP9vizWRw$O|4Q<<+VTK+1=P%&s+NgcQ<`YTVBnwKMQIz*ITcxeWj26 zywahJinBj6^1I@#V--<-$F$ygEvlLQ+0r3jA3Yx{O6@KaT0p5I_GeICtNB>8Gf1I7 zDKohbFQu~EpH-!v=%d%nlZVry%2p_$CflEBojT#8*Zz*DsglQzE~-A-pMCXpPNL_0 zVWPb`QkE>N>f4`@Ww9i&Xgy#>%?@!}yX02~?9b9J4Njuh>Xh#FJo;tNr2_5G+=fLa z(Q}?;xYN8o9Rt-E`?I+`Uz6zE@U7ZlShr4Ys!!|ed%{xr>bMxsch}{wz3f;KU)_c= zcH3dd#5DDNbxe&hpXjx{d-eYBYfCS^-2C)RU%mE?dA+;+suZ~Wzpq_eDo4S77kw?- zvs`1|Ew4K1F1+=%X!p~`nD?C_?peM3{@Xmu#&sVDO#+VmAFy{8%P3%)IUewrzKUW{n_=yM*h0yyxdnf z#e8e1>S=$*U9`Wyj=ke&rw1iGEoznhS@_gB{uX}mVBw4ZiwVEo*;Y8*0N8&~Z)m+{)T zYJJ*xZCuGe?Yv?9+_(~cS`RgTZd|o9wei}xYG(oCwQ;5WG%YcHZd|qgX1q48|J3C_ zydqz;vyZXHxN7Gx{G3gR^#W!HTrEfvESVb zGsRfk>EvQ9#pXC&{?$|BGjW&ji}t%Ee4+g)ALR4Z((YnE@}-hGD*7tzN3}(Kq5aN8 zeHXqEPw&UcbJ&Nf@;9gCv!xL^r+7b>oG5Zhbrcg2Ap9d=2tS%f{^cF{;-JAr<4U=_ z9l1dGLR>qT-c#g_^x)#phho2bk0*+;2bPys!!P3+|JhZHJzsxVj8TrL-UtKokLr@* zC5<2q$UnmL$!YnUa4DDPkA?{RNSh80+ba6PrEHhQTH+9mQQinE${Xc_)>4ir4yuJ~ z?e>eI+EkAWO<7Lc_YY^0FDVXIv?l zH>Pb6I1^9Fzn6z11*W9!W_7YvWL4oa)f?rPbeC}cvNWskneh9NeWsX494Gz}52$9` zpKKC&dsOeCuuHl|=Lm|8#z>z@6R9p~KdK`-OA)X31DU z@rvxyestcYd2ch;6S=%TaEFME))H1^mo%2ngjDCmKbl8&={!mIJy@z}z-qV@kZ5I!bOY)g?l6nvI zQ1Xw?L&ROel=dTE2xr2N&eW6->eIwsy2l~j)4Y@2>kBQR*a$ybOFB+{pY)W@^3+!e zQ{olXFZDdS?;-r?K9p*P>=IUl^XvNh_b==%>z`-MbZ<(zB)$-Sr0wJ%`9k;3)K|$a z={?m9^*riPbUr0q=(zyhpHuDA8II2P#9fMwup*u8m??|UNjghW9K=(z^XQ(5bdvHx zc8Qb3XW|BF4(TNIOX^2-e@-^2_DQpe8`P(%?^AtH&m*jef260B4|=vq+$Fn&3*BE5 zR#XdQgZ87dBWX72Dd`&JoOn-m&7K9Q4^q5zZl`-w(k8-y_(yypoT+B0*Ak}GQ|SJP zd?qcSG0GeDBjN$+2Kh(#E~GDX?xdO~yJpWI#7WwZxJDeJK1e>Bf%A4N4yJ&G`(enfdAtf*E= zpXoUv@sx0;IEcG6kLrjpAYZ7aiM!N4sQ=QlSE?h*C7ll_Ub;7+T+*`^x_2fGqrO1B zmhRsuzvLhBigHQXPCbuuM9)yDr;zT_xrEk|4eB3MGsHjQ24O`QkS0>?lh34ybYDSw zMR8EQ(OSZuI7E6%HAB7ZKdB@7oDBI#XCKlq!k%iH&gi6TG>>vl=XN^7(R~2%iug=9 zr+)cl*d=imAY7>SDPF1>;uX!KG0F$&0o4bcPboIiMA8?UM?HnKlkAeVlaA9Eaf6;I zPz@4(bk3o?5r?QBeQSDJyhmE6&tdVNVc-2b#b>c;?aKqt#eUI=XAABQzg|K-Ti$1U4<;xodl*2~Wh(pb`^lSK^{o-kPWLK;T? zk)BfCs4m@NHVV6QJR(KBl=JZ&u8Vn7RxT3zkG2^lY~9xlC+p& zBTUIZv)W0zLAd1k{y<m27k6S<^$WP>oRmpYZG58^5HnPx{ai24ZloJ8mg z`A0TLcgbfOBmYR(sE*oqUL!suO!`b3Mn01-#0~1Jq={71q(gM3q5M+3R12izxd+Pc zRrYLkQ*gXhij{%~lsD=hbdDgd5y#8@xhLv_I7ymFIVXK4&8c-(2@HrYgfnR@=_Fx) z=0|m5m-0rOB>s_h()opY@{NVT!WXJ@@|mzAzECYt-y)6^e#8wr+fr?jFVv$bHo}U| z#g_|PYzfbaR12hQlykzKdN=iCIwKJe$S&#Mk6W%lsD?D zbgm-|XpC}BSW(VN*GLlyQ>sgP7DN~jex#Fh?j&ER&Z*u=bBG6Yo+L~umxMFvAK4)7 zq+Uinl>9q;@uJW*@`cWIq(g)s#X)sR{!u?#ljDOpk5gYD9*|~JY;=aB{ir@j4`?mj z=TZIAdl+;^r#Pr)XpHXjh*va^a!K4EOljVRB#A|DBn_i@$v>)n$_L>>HmDy_|Dby& zdbUYDkLHoj)RU?IQm-ZbBW))>(|x>IK2wh9>`l5$XDK=ZPimV@XvFie^8J~6!!ru~ zyYHVX*1d`w^y8 zTZAdaOSllG#Bs_IVMRWZM$i~>lIoY@rFq1A!X?YjSdllfL0Q)>3|{ekqs4 zKUzyTlMa#3gcbQrJfIwrW)tse9{ESuQ%@$WXf5%8#>hXaEy9X8PV-1Neq@oKO(9+p zR#ZpSySsLip9`Y3qzBaZsW+O%lyXV?5msh>A^eDwR0~vFG)DDH_z})jN8}&PBcDm1 zNe`$mP(H}6*)ggk@|ki;SP`Ge7vc-`WLityrF>8gQXIq=!iD1X{j*qnKK4ht;nsxb z;&I#E#aNlg`rnVVPyOefX=|L9IE$9(d{vwoj=NdKy!ofn2pek~>=0us5{HPh55?h< zb-u9Me}-MG5V z1O_?l92WD48{`Yw2=8CWR2(l0$)j~Tq8%p$t~BaiJX%r5(eZ8)dJ;+cu!+@UGod> zE~~g#_?$byBIZ#(Xf4G-^+sc4gD@ceksc6t&Dtfdk$*HsdP-*y;sM1=zR=oF-eW{A zsbA8WhIFIMz-Vhit)t#UJ)ZgkahJx1-1Qdxqg>Kj(h{0SHBH>0cnK@QnS7?ak$>mL z+!EMRP1AmaJ@pEzBjOOvBb_9zqq7f#zbHb`@b8+30#W3)C| z)i6;D6bI=LjgdB)<*C^oPkbR8ggw;)@tIEpC z&q8^HX2;!5EqZdZG&RM2Mb=_f#l8LMTKmPke#grQ8#FIhySu_}y0W{(*s?=Yh23u( z8w;#XkCxAZC=S|>=25(>{>m#bC7eH1aT9TDey~@>aWVN)Q&@EBQ^|NH0JA=#bPX|`A!@am&@Zb9*qUEaX+iS<8N>hk`FuM-(sdx%0|Y!WZHs;Y|CHUE1$% z2M+iCH20W5l&PMNSDDggxy?`5^3DZjyrGV^9JcD=?h^%XJx{adM$B?`Ujl}Nnnjt>Z zSoxCjy>h~ZYJt{Lekn(U3+0H;j%K+*`5^yjKmWimfj!|u=bT3GqePAf1HzPQhH#-c zh%dxv>I+oUq;)BFEETwrf213ve}oJ1l;WkHM|DZPf^r^T%3Ej{@vnCC^&-FIAH}vd zZH&N=`UmBbdIgP9eyJ~zo>IbX1>=jY~`>Jeaj-nyGj@wQDKvL&?VH6(a;EKd1jGKJzpk z;vgG@X@;kxOkq0b<^tg}<&wq-7mOETTN{vA*rlA)JmLXys7;0{B5!7~r+Ktrzv0J4 z95j#eMr+e`@D}`|d4v`5rKU%Ju^;8_Lf>A3FAcMQ5V6r($_I@Rhluxt6~#svP~OM} zVM_CG4C9E7BLU&65=2|C5>2k)m_+luz9RC;n|jSDA$Aw zVlDBd&e(Ti-i@hK#aLwFNHIqE5%yGX#CwXDuqPXYAJrTALi{7%6MncK+n5O)a!vO9Qi0bzr5gJS#bT~y#l+#sKc8`O_#Im+LoNoz@m$YzR*0v zfOtjupuRx4r1KT=fUqY$pn2pU*(Lv|*HUa$ACya)M|q<!T zL2D^*gfrC<@sxZa45*ICXF6LHSa(8b1m%+Oqj@w&SoOSrROlMTMtmXs2&?pK)j%VLZ_55mVjk%;VMSb{F*^Sd&ZIAtOR_=tOf-+`h&V)CBMgWK)ECV1fPAK$(>%hN ze4%-S3+VynjporgmevyXgcaSd5})auL$yUd6VB8Z$Y;Wj{G)qBikIxtdDpC6;x5$| zX%p1~^#z(oT0+l}Xg}gOafsp|?8!gUjr+Ug@3ortJ)L;=Pgs$EWP@@}anOFmQ;Ln& zlFwAD#24Zk-D4B>RKI5HlIo4>moOj>QC}sUq_vbcij8nKn-7YOup%222WjHNq(j76 ze$u^+;(db!J?4pdUc2Sr`AOs`zZ?E%Vq>wk+Q1^>y`9sAT*SO>59E85>70s+c{zi| ziLs0Rw?!Q18yppO%Qe^`)+W9Ybui(xK3Y3@ex!J>GH77|Yr?fO@AtNvLQ81u&4hg- z4vKC2!e3%u6@Oph%aHH;MZA=A+V4Pp`L};)E!ia=P%dddikE!xpFCLPx5dc2B3|Mj zt@XY1M7(GH`oc0{qxgX2!bXh$axq4j*7(p~ehDkWp7>1o4e!`qh-5dPh)?&&B z-Oo^6(iokQNY}_NjZwU$L$e&$3jC-(sE+7-K<5qOIGwqOLv;2b9*_=E9qnEy-^V6g z$OdUAVMTnVIOyJhaH0D$st@vy_M=IvSKgv1fje0k& zCI6_-$!8j)IH*=BM}#S96LEv$rFtWuX&%`i{AeC&Hq|9zK>dh(rZK{b@=I%JjI^El z8{Ioo-zTh|Uy#3di#SA_G^@|#GxhU#rOv5@&!xyN%_Ci-x+GjkbBIHvyTo16I`WTj zCJs^k5~jpw@|k!=T1V#`ii6e?*9d!>NBJPGQI4pNC=SAz@S_}&PSVssbXuqR<cvY%e{E3+#thsUp6QIJov-rsl19+C$81d%le= zq5csDQvx~)|7afhcR1G?VVCf$+k2mwNBb2!{!sWr^LDpz70-}~8`WoZwkE`Y@{#x9 zEa4yJi1I-=6E}#HWS44-d?6bj*SdX$H}`k+2Y`5^ziYrPj3&^*GAG>m*EEhg?#Y}fn53IC|3$!GF~YKu5T zJS7b195K*ce$IpTqqPg?ju7!uehDjzgK|Xqp#DZ2BL4^%vP=1(-ZOhoK~Y=Jqs|Ci zD3`P!;X>F`T@nT~kK!dksWBF&-v zQZ9*W)Q^aN)B|WO<&wBYaS)#=AA~9SM`M&D(gVVZVk4i4_mm^@h0f!Y58^J_CI89= zJrg=aHYjg3@7)x-Mw&=xTbf6;K-@69mT;js2zxqvpT9F-#A_C3$|docctsdcPa*s$ zm$V=03-uYASA5nufeYbBc8Qaue^fJ6t90%p8x#lSl6)aOeROBAz<_KJcZq+rADwOK zJW2PVgdfF0_>p!}E~y8Y)lR~I#t2j58u?85CH$x^DPH0RokgjR+8&&!5?6u>tYcv@su#29#7A-Xf4$n?ML-N`;k6V&Z)L&jPRp*R9m!` z;w27Iub_IPwZsGJtJL?2lVq3fiKzxDmt=$bCDl1`m-ZvO6bI#!I7ED=^A+)wa3Q-? zZ#f()h`vR+r23^e2rJS_;uZCCyG9O6sFS~f7YQw?8z6sI_WpkN#dFpRrRRxwX>CM~ z^uk8;%kg6DP`LcP;_>4*3LDMlHxRyTKRZagmryLNvn64?M*~)f=k2$5M2cssDYo<# zb`v=}n;Ikk$Og@OyQiGMrTvtdV(ex6Ho}**Yfg#Sid0EqYTkyyi3FyERmJl1J0>%N zb_*L6Z}#XzVjl62)>1w^n#>eFAMT!CCCqt@e?Nf>ttI@TGSn14w|XhR>qcW{eWse} z@Gy~xgK|mv2%kJutR+nE4eJw?5UbB;l`Y{I*$w=fQ(#K*5~jo}nn(3UJ`=AN&XC`^ z_+Rav1$0%{*6$M%EJ$&R2Tza?BM@u_w^E=KD-t3n5C{n*!6{IrP~2PGin}}K;O_3h zi#r4h@9dpyB=bk_x!muK@4oTM80|h;S!>NX|MNd(uf3B5jdB&fB)*V-G)9<`KWL2j zLNQ4CQSK!C#+;ZfcrfxzIe`KB&5}d@zC+>x`H1YO_V|g=g>pOPagUNY{1S7LY7gm0 zI8!Yn{KyXSd1vp3A{Op!I4^J}?oyl+E@bbR1+D@YvW@nm{73o`293w1y-wGc5((;DzIblj;#7Xim#TMn4lJ8~+U4CixUgVPI zXKssm2QGCNw!N!&O02DMxW1T2Yp+%D5o_=ClJB~>*4nWpaW3vwaj{stwzmA+-(=h3 zruW5ubIME-V~dh)6n4;ll^X?%wZm%d6l=*|vV-Ok22PDbgp4-seMEnivx>JlF@Ch) zRG*RJeuiwL{YaN5Q{=PqmNQF;d^Np63!&cx?^I%pY$G2LrncHaJRrG*Rg%(~gg;W2 zmG`=YeN?Am!d{n`qr`sIR}K_o&prB!SQzcmPwYp$+IT9RP5w|feZ@SA{WE(kLT z^fs=$U(pusWaf5tGaYVXM%#e?$9#I}A{U+8sDKK>|QpL}}&A1Z(2m`{3#wh<$ zT_B#?x|V7b?MJpz{iQMD3*|8KImHphFX=}y?Q^xi#qgJL{k3{|WqdZS@@wp;xXqPKWFzq!TmwQ;@Is-x47{o1w(=Y)Pv-DQ8j*GaxZ@4jw{*zehZLt^Y|yF9{l!=|7?3~0?hF_6$Ts`?hlFig(j^xd5Ps8NX0d4= z=|`9n260&@*@O$(M%dFll1scN|B^pQXX09!xQPP4-BaM_nU33u`(Ltybf#D!pI2K{ zP3S@#>U*h>n3pm`Vc{dnS5ad-i+M|TH4)+4=ZytIKUz!vC9YAdQjVp#Tshq=xYi`A{F~mygQ``M3ty5y2m{KA6f=|)sVBUR8Y6!YRy2=di#Q&UYL>u{){=jTY9P*pj*=<4>idBk1!iD-0;sNC*@(1~s z@)g;Jb^v#&E>IpKoGI54E>u&98{}V#Y05*(Gi4LKBjq*nCCMcY(HP~Ih2`ZL9>qD~ z61RVYGJ0R*N^5WB?SxtdM!M!1l@6k837mlZPp z+TBo$?Mz-@^p3p(JBWEtD#_0u>6@JpGH5^YIq5?9tw`@EWb6n} zC9tv;7xEi%oa`VO#Fqq`QYUK(ZV033vtaoYLSQql1n&~f5~1Nqc|c? z686L);x74|xIwXH2X%&cN@IjQ)gFo&vX^8~ZX(+#eyOJ+9}xzWv&ol~cWEv8oMMY~ zCK<$2!k*@lKWHA+T8dw)GvqgtOMdfxa7^?~q#wmO`I2}~`_VkwkLm)&CB+Bvo;XQ- zc{s~Y`Rug>4jXdzF>Nn~wC^u1kBmPlcpnO1ilI*3mB$vi0=aAosf21GfCd!j^p3{8Z6`OJ$ z=|?h%lN1Yt3++cag7zbhQ$C>kE#ej7OnxIilRs!bs=vfF+K=)*=|}S@X2=fGnJ^_8 zi*)9VtgpZYLRp0mUH2 zIgL?oM!3*g;tSPZ@(1~xYKpD#OR+^UL-(tMGhsk{rv0d&q#Qwci2QqO<6Kcw21Vo) z_s&^-#))|m*&W3@XkALY7ta!Czr_W|h`zYQ@;}A7_c}`pi=F=O<9p_9yqk-)-F^)b zI-6e|7xU7l87cJp_1o2Atf)gHo5srAOC{$0w5+edYV3l3;@OFkkzyXLCGOG~*+%|d z{k{BM&$J)$CHW5dp08iAB!0HU0{M+FAi0DyjV+H`CNTA$RY3T6M&>tS9%1k5bV|&l z*r!}l{3rSQ%*jWDJ^AgCODSOo*-Kob+(a=*Ifv{m*RYkqg<@uV&9Y+NqiKDF9W+*O zL%5hnx=_9%dkIsrm+&LGG>AMt>&B41JswRJy|L1ScZ z;j=|W&p`7izmN>Vk9b8qC0uA8`TWL+zXbni-nvqSg}qeIX)Wb2>YJ!nCce;E=)&3N z#QBffH1>N_M z&NP-gLcVWC`HJL{->5Foeq=BCjW|SWiT5-{Ye_EYO!qw`gW{L=BTR|oG)BIpdBhEp zOYzZtXHrYzd_cUX96>po@-y{yq%)0?Kd6?G&uN~mu}@f$E;NtuBVV>_kWJJIsz)?N zxt;7Ke-L*mrfH0Hp&Ul>M%<Py11<(tgBA;ys-i5eC&CED^PgWDr(l z2l1I~qq8rH8S1mCf2Mm=;sM11jS*IKZ%R7TesupqF+3+YFkr1+p(OZlGSjWDG%EsArJLAi-)3hhT2kT1zz%AFMZ6bp2ZW7kan zF4l8r=ZIK!N;Xu- zF61}z2l;JG+e$(|TD$+iGBNLNU9-@cY$G3$&k1|l@6OH1LYGOi4~ensH(v_>7U}=H z(D~TZ>|!nHlB3HEv6l2B{t<^7_{hJVNij2E*>>>^muw@s}8$yGUpfb zHk#$n-jEE6)tUYJ2!9YaY~>aC?S)frOX8TJ*xELrxyUbsJ;g7{C127Q`HkdKT#_A> z*CD6j1=d0ebr(cjISIHqm& z2jv&y3&|z!lD+3E?G-u`rnDc)ef?DaJRR*vxrwkRoGBIvXNnK1ALL)E$%H}vIX6W7 zk_?JVT1z#V^dn4d^)KN`}KNk8f%h<}7B)sI4+cA~c+tcYtA)0AV0&!ivKWa_EO=TxJ}mxLAd2eqck-y_mv zi2NBH>L&>UieJjHn_Mo6IHI*Am;6idOY;Z=>fx|AgC3atOPG>=w3aX+o>F{}&J@2C zmxLAZnPQdlALRqmh2~KVl3dD@v>(+~ifP)9aHhB1q zGu<0d4JE%3E~E?LOnnZGkuDSqL;g4;dQtKR^~!_`?9)8LnfhYNIaC7(XX2@?^TM_Z0bRR`N zB7e|4;xp+-ydtdV{)l`|GN{)hJ4hFjOSyz{BAsJWz9%1%ZPdSzFDYje@5yhJ6A3HI z8{~7UztkrZ$0-)bN5oySgZx4L2K7=D)5HzJg*Zw6AYPHZWE){mXOT3I@+94t(Y*oj zlpvfNU$2tx?#>A_;&(FUTfYi5MOAQe3lC^-axU-ODqpZEJSsH0TfV|h zZeam|rZ9c5UBakycmFn_;lZKWcS9l~+XqDJ-!ACk?&jWF8;tJO!Q^Ju)H%FUd+XLg zPHyc(!>x0i-Q3+hJ-kbLx_f&0`1q9a_OX5^psW6!k{+czJ$y@h`FeYn^zinwe!~kt&}S@M%FN`3euC?ML@Izlrb;oAvF=@!M~A?@q>xn=*pCB?nmJbm0t zyL*=ME?L^c*WK6igDIYFJ|#Wey?op~y{(}8cxvDIziG=S-uURN#1{GfE7uhFcJnCd z>Eq$$<7M@NM@iiU@xJkPE9LIvS=z_j%iXJF>C&Z3{SO)B*2NUsx=plyXt3cqoxSng zjAwb2&f!Q?Kya7H&}fsLLlOt;sr=9B?d;yakMsA}nC)KK&eYiyW~cr4-|#O%t4enN z9qJ@Nl0cIG27o@%AwFe%GGOb+uV1JIf~`_Mo!9GLCCib~0ovi8B~KP7i*~IxIi020 z&>K_J4U17v-oN+%p=44&ZM@v^41PVfblDKSBI3jRX0z6)dB6RfrQx3uYDzQJcgFpc zmScI7_<7zPUgSl$2vufnuPXU>rnD5f)>mb_w(vz`uLyNI!G4n zQRhs@GVRoW(q+ajou9(8_j$i9Q8_m*`qr(j$~U%KBadHFSZW2$R=&HvefuO0Rpy85 zzFpZQg~hX4kZP7vyOAh)J_+1SzkUYw~VblU!eG;C*EM^J`^?C%2?}v1d#6 zB`ss>r3+N;GnbsR*_7PUa>$AbojrO-@0}K?oH|CgQRS2CxD2_nrt9_>fokr7l|{B@ zN^TkJ@KiP0lJtIs%t5M(%hP+6?j^HyE!)C;VRyTuW#0s~gO?k;!!YT3%f|Gd4q@S~vdD^P07i z>G(Nh^thhAS%_-*q{O=Yd6QXUlBQ9~Tc`FrYyE@bPwGT;uk$LYd%^;qwu zIxa~{uUgwRyqgNy6xQ#@#z`$hgYKx;#r8*pzwDtLzFk!Hlv`3uu2XL||J?6s*`$qn zsp(O7lQ&70)Ka~Nt9j>?EW>kG?W4*cF0$|JMMqt~kwwa-NLA|>b*@O;q0Lr1T9Q@R zWX{{BZR$O~eN~rV=YM~3sH5dhr#V|XH<~fAVWxg6)78Jy`3F1dzRXnZS*&k^{%U!7 zm*X*I9W8NFR+>wsPV?>iSp(Gf6Izc8%;;!o;IKr^Y2)#*|CwLa-Dh(eU%%sExtME| zxm&Y%oeiEL6;uf4N_&V$syB{`QSZm61& zJ^zgdFO%qT)Mniy_Y020l~3ouxg8EC(fPMN=zjZVe+^g1kIo2vGAD_?_SN9nkwfN< zP#ub2DH`1?i6u*~gXYJsbM}8)q?B(%eoX#VwpbV zWd-{It}K(%#~mrCA04jkN|GEHhf=ZqQ~#(~#|4(S z)qb>U;&h>W-!k^P&huS*9$(aYw0dsJVdt2^Uf21#!&Ljq-;GwIxBj$kz->EA;VqZU zRSQJziwPaAO5~c@KlxTWJ+^L?$n7#SYP34g^=!4@{;<<|pVj|(p+&)?Rp^OtQ>N-* zXKC}Mw)x!h(YxZxjaJFro9rK2-A<2vH<#wgC%zq}W)1m$SlT>xmNNOrs`T4R-2Qpi zDAoJW;%UzJ-cWiMybc;7S1bN`@Pwx z?6>AL$2)dBn0>S=^31h((bsWi&A(wC2MjrUV6+NaIB&Vz{5bQV9^vMuUQQh{j~t^W z2Nw46Y!YYIc<<*>J@t8yvFc>DIU7nQk27m=?lt1tpLOiVskBE6DBm^j%v!$c+|Sp$ z>Nn$6^+B_?movRHNA)|RGFK~;epbcbRUehFhF_+4=H97JR+u=lbMkY${!r^*Og~V0 z`&+Y?pWmKNvo>zxMD=8Gp8C}z-72A7s^zt4ToG&SY;q)YXCzcHu1w8LDq(&5n~_Dol&24@dy==R2} znvW7Ju`r54J(~!G0s~%`ROZ~EJ z{3HLeugzM{&N+J8`IyFkstv6(cM7`m%BPW=+(ByE3=k|4q3*odAMS(G7TG*B>ZKpdGf3`YW|Cwea3E>r>0g(H?ZTJ zSaYTAlU1e8{qNdkTcA$A8J?yCcA%iO7g|3 zX4|2edait_`#0H^?rl6qEm3{*rkc<@@THFPuLT<1{Ly2X+IZ%-T>a9&G*|vLS{-$K z*k^s_t57(v__>b z(6{s-MW36s`ZgiY)MLv^tW&kl+ijk7?wO8#($F%~t8`qi`i<^gaoTUs%v${o?c6m( ztGyf4rkZg(XO@1Z^KaSwuyboOY*Nqdey%m=)>D1IXs1Kf=GNV;+}6E0G=Kb4ox7el z^K^^ov_-X!=-yy))u%c)TBfPAq*s(#O)vE7^s;A9bbl1-{2*^!4U0N^u}kw+v!3X@ zs(gB8p`RaHREBXcV%Glf#H{7rfj_($oUQ*>Rr|Y6rj7PbbY49!T{fg?#%-#C*?gFDLI?n7ekl-D**mfLzE?flx!-4h zyL&qJgPK(=FsSA})!KWnI=1(&*|Xme)u~&f*Ov7A)w!9wYMd>6SND0jYY!*ndAeWK zNx!3h%z!&Oeudv3%31#20cGjE^`~3cZkx4yzoc!cfm042R9+9Z1U;yDTc20H@6{0n z7adY_nr{kwKJ70ZzdXBBE_yZgu*$Z7eW$nYZt1o;&F;L#;&Vg|^gl{|F z&~w=NW{-=Xy?InMdAew3o)gz~oM+8zQ~E*OV`_iEf`x@Vuj`zw(==e9(aYg6Qy)BRbDqQBI`Z;#um3kpDX01nh*|djm zwL>S><%8}gmkzqD+jg#m$CP)CPN^LWir(5><&wVk?6WH~!_J&i^9L4swcqZdS*u44 z?b_vy2|KNZ2j@+7Zqs>Pzns}u#yVy`qoOM2%=K5-b9!EDmT~daGONz0Cb_egc;S6k zm+QA^RgQPxomJ)Eq_61s__U5+?H?=-nI4~2`Oc(nkYVvDJ-=iw5xXVz!gDJ5>f|Qp z(33i*KLxL7TjHnl>fWd%UEB(u(0NraQ_79Q(_TZiOMGom>zpbcM zcSM~_>cEbpGj7k^uj@ChTlh26u1o6oUb}ZD&9PU{ld)G;?R!%8vI;D{`F7qhyL6pf z413#W=d{bJ_>&cBDx}(>*URFr*873SmsRY-c^*IY+p60!V9Jj{QJG`Zulvg_y!T?W z?l*gn7hY|P#;Bai-4evt2<_Js1c)9tjJil#p#u1t>3+tF81or&0^HZ@8Xgc z9kE#VQJo(;dOd6#qc(Y+95*RqmTvE`tm7}0>>i^Imuyn|+v%hA*zdS!U?%TDF>3ne zX>~&%HC0+3GVX`^75}bN!As+m)=!RIF!ASV17p(v1^Oc>g6$0rH9`Yh*1xV+&Y!x?pA$2uN4_ORLmHo3UqwD;(g=}rS-~9 zZf;69@AhTYbnTnr*Iw^Z+C5n6g9E!1-*Z_Ff0wk~?!J4Kmg};WZP@hIh|6kw<#g2- zIvr3w^Pg3}G{{uUznm5O-?HZ)G5U~dys?ZqsPCgdS ze(@#cIpp{DMUNg;TF>x$ezy00T3k|fmP~GzEAw&Pj)1t;uIZm$RBevVsQFFP6H2Sy z4OXR_W;g7j>i29;Df=lWb=y{5pF4R@*^6pw))#v29B zDDD2Jnd{Oq8`@k@Ct9qrKi%f6%ANa^Ip4rhhmXHKuO9Z<_;Amnb4trYj(sz@6r6Wn zIsIw5xZ%-x9p`t`z3Yzp?z}3vd*}W|-WQeDudT|kG3=XL=ak=_ee0)oy`;4M-~yl@?B9{ zf3>ORw{8_`pH&SvJ}m9Ee+pM80``kREu73BVM6r;oO6zGVw(k;<<+n2`;?lE1 z1yfv8TCJ^`qIQKJtDRAABVOjpz2KVC>O!-;i`%_?d0PEu|2k9F@2)GYUpuk4TFBrn zr&X3QZ&Rgva9wHrmG7&LhuaQ3t!5Q?pCskT8@k*HU4|E`_0wtPzQ+Ewz2{BkcR07@ zMpcKJY4V&_o2xrMetrC=j=|imrCK$+c1qPco9wTroo?xC^X%C^aQ&aB)akY!({X8T7rnDh+;OE|=K6hA;rmMKk$Sz` zG_w4}HJ&UB05vju%oK_vhnUa zyFJo%Y1Jz0!4lVxsI;%LF50^9k<#vo>zJMozSYVaD-|ac-jd_7(rRtHqusBaSbtbe z9-MvFhOoy<%crA@-QM-f!9yzO_@vxxH$PTdfB&@Vf~Q+g98^Ve=9;)N?GqiViHD~p zznJQvdK^48^D_S@>isAWzo{?wMQks8K&@MxXVju)PjsBSd+(lA-*3O_{bG9R`SwqB zop<&;^>}QbeX5$uH)!?`PxaXHKk2@q<)OVQ&7fHhGiN&@&y;pwF|g2+3iC(pR)K+qJO4iZnVw6k|IjS6^Zs4R zb>Y0nV{SduG1#0d>!4%zcB)5DUE7Z={aojU|E1V%4taN~wdEH6HT1XVdd?ZUwo8$; z{yS8!0mXuUJNH~^_e^7&#w9s5cDt&2Xz}F%MPKOowEOD=UU7%Fsnl6ZH0#^*h0eeI z!yZhoYwiDz`!74y>);E0?aN0!U5=N-( z_j&a?r(*`EvnZD`-Zi5wFO_zWT++oA5>xEH>)-Kef-)7 z#_CwTtnx#>vvoG9pEIr77`if6Y4;Gj{ez~D%e+xlY2jNc#POA$OPXcxIOuO7IqTnft+e~74CO8Wp*U#TkJ+cCV_#W%Vy zheT#ORATrF3sD);sc@p0mpZWSM?+=n{2* z`hh5q?eFwBa=p|i&HI~+)vDWd9v06Or?g&v`QV1zp*3-OOs5%}ZB@NH3suS;M+5RFf3Mf%8e4u3UhTC|9ZB8bVxA`Nb-$_8 z1v6A`v_Spd@I;fG^WW>S75Q7AGbM-2S1qSDJn`-8_c~UUdS9!O@4`GaI_mD+!3FL7 zwA?gra^vw?GtN`bvo5-k;(I$k?Vf!^?6d3HJ?5$=o5J!B>}=nxv77uU*<2lVE@R@PpbjT=h$uk z{@5&ay-q~-KHu8=Y4!51df*t~GD}r|Qld$mpS_=!cUQYL?^$HZOtoPAqj5b$?ftZx zQu+1(*M*g4sx)PnAAdc{-cRc-LfkgKm~wZ9>TtPZ`feNSbs4KNzU*NhIYS-q=UMmV zReL`T)7|sS4q5IzL;1Ko9oi{X5`FEoM}rDPPnxbK99X&Ush9N}*Bbj}|GHE?x&3tY zwnKD^$mU7(wdM2nxN~ymROO$!WVJ{AllW<8xxXE+*|b8oDQesL=l#MLC-Kwnr*EbC z<;0|=lT^W$Yqs7y89#5HTcsB3icD04l5~0BHZF;uR)6ht+cn5C>koBzPO0*@3pwZ* zRLyf-g;e`peP27ad+WLmx@;#@{Ll{3--LyEm9f4pvX zJK3p$YD6=Y??mdPep>y=)ji$$u2UrcY~s&UBpY+N<|8J~?St<`Wg zzHeNgzgr;2NCxev^{mD|#+7u@a+C3W<4W^1P8#1guG)FA@!7a)J)H5`xN5Ord^WDM zpLTCxeBZcg95Ox|SM8k3_-tIYI&FM5uB4w9gU0ubE8(a0ERjY5tXXC2HrSaLgk}g{BZG7LjYW=D4*|=(bnDN=T5~hTocF$z2F|OLZ zmGRlQk}lePit&Bps`Z`5XX8r#Apa7kT3$2uF|OKqqVd_d(irKY-K!aEj4SD)^=8KR zjjNW2jL*iE{7W3y?o*64##O5`#%JSt*FLA8@!7Z%E@TJ!NINq(_A#!+Q>|Va-#4xl z3l!6Y0r84rm2wzym+;e`OB%Ww*K=E){EW}Wm12f+G4Y;c5Z5S2P);PD6E5Um$`Q8m zMXSjM9>$gGf|?pDctCMTOeo{>GK$E<61|=t67TcXqTG`xw^;edG^i zbvm+6)I1s^tVln?fOOtBp_;Il){<>ItA^OL_WrvW0_TIbZi}_Y%kC3nZ_D1>V&G<6 zQ*#0LZd}Qi2eb* zTIiTqOB|vx@*81Aej|U-TJjOuL9uYkB!96r#UNo%b>V5Jl7efbi>>nrKk5ajevlo+ zHR8s$9G!*F3w+y5kt$8wFeQlvL#T)sT z@-E^0d|E-FGvW8Bu>8dn#Bt&u@ql6``SnG@Z&w>$5&BVHqdtOcqcO_QloKf~X+Mf1 z>ZOQRYlUU}0{k#o@FHd)0A#9_ygcZr997{bR z#X0eh=8;_LC+WWDR#q1g(-f=3KZ;+PM{@5RUoNnxc~qy#N2D{w0_8-?2gG~Qk8&q* zgYpK|9@3e3Pd&r^b}57}NoUHFRC}m~l77?=5qAkw+K+T0oC!bbsmUKyr-{3Ck3+nt zdAlPTiCjXq5q`9m@;KFf%BR%JQ(YxYiB}ZARP*S*hw!8OP>LCnOIQ)kcN?V>@j>^d z2DCba~qyX(1IinuAKkl9exbgTVw&XI+Jg`$X+Po` zafs?5>1-?Ssn4POLRgW`R0k<{Ql2C`Xf4G8;Y_v>H;B(vXQ;kWuR>!KZ*&$!wU+oo zYiS<&i1H9UE24Z)_r#ZrJ{I@bZNJMTdLOE_l*7nxG>>AC?&GQVpuT%F-t)fz`om!rQA+=oW_V7bf!QtNcd5oLw+L;Q9XLue6M&$+Mv@`@yxLEhLz%7Y+8GJ z<1Mk@kyPUZcl(@{fAD_QUdi#`ab3k3JgwdA_CUb?8y$|6=9luUNIrJRYmz6`-kZkF|X{zZDu?DUrcY~+B?Zc zG1h(8bFr3Uf%eOFcD`6!xkyVPgD{Qt*eB+-PvaoQh(m-a`Djzq_F}(CpP!V0hjFF& zAP&(O#RtXFn`Pe#{t+%gmX|_j;y7VI`Vq%zKk}u2SYDwE<+`&SmJ3Xurr0Ik5&m<& ze0Pw>GEN&RVzA_IJ%uim!$?2Mr{p(^%VftF3c2G`tQYo@&j+w4eD(vwn!JMQDhroMSbzHl71GWKQyis3zXN$=Y&1gZmP-DBM}csF6F;% zZRO9uQC%hMi5nEZG)6kpy$0bz_W?AIctv@GxJx|)Q{SjdUiiQO%?K4_osA@r8N@ zI)|e?PWP*18|h5-gK{VJ{8R%d=TL7;extfdeH~#yW8`zfihNFajdCJkN^wbNL4*O} zM|qO^PSS!Csg_Xc@)3&41;=fvV&rV#^^qect!Kbm&6Ui zl;$n?CY7j-l*7ng(vM=F{6V;o45~*|Kj@x`&Niv$(LBF{16oUV5LSWH7TJU;**4CridcJT z?G!Oa{w3Qwm;cMAwIqY=C7t^fmcN6p@3<5~E^*_px=IN-;y6OkQo0(4}w7p<-<8jB+A=i5s*ZVM?(@n3BDO3t>teCm#`3q%-9R8Y50p z{F1#ik9beG6j=F8_>J;2`G{gVYsHj;S7a}7gLHn}P(FvC8ud7L3tF{=}h^V@&VNa@(0Pab&TSObS7UCR>Wu0 zh4?}>nbs0_$sZJhWC!tua3Oosy`Li9kA0o1kJ;!|jqAYW$;DWuYZ*ijvNSfe=tax6 zJt=yIoyp8%-h@3lgp9e3SBSBhseFW7vcs|91R=NUsPtltbeU}S74urQ?JMrp7G5qP z^y}w3Sd0;Vb9WsR`w<3L3WSOMXzk_~mBqa2XT}Shhr7>GhF^^<;YW7#$TmW(-Q=Il zV(epFPYr!4=8?{Q|5zX}AWX>)!pd?#K*){#v4z0EwZT>~kGMg)kc_CV-Zt5B+grY8 zPF!2ja=*}z_(x-8FWE7%W289CpjeDif!ob#f zl>aENQ7jNv4NLD4XLuCTL=!r zKWHu4LGeaoB!e&@{!u<4?%FDsxJLTX80AyyL5K%rFX=*SpQITed`b0^dK$_bmAW4> z8$2xbSA%%eg_7e6WCKs(|&|K z)e4Fu;tgeqza(3+b z?4l;O$Wc$+R}}QEE$;32*54rJb=g@-$e?*eOc#aRT$NXevFTfe3%M^B{v@#4+h3jq zksY)j%_DpN{LW2aN;p5Ml}y;NIA*P|<8bC_HeuDeVqs}7V4r$K6CrnZSr3by{_o?@ zHj~^jq2t8btal!Za|^PU;ePg zc=^B#0_WRJ9}As{SKl3!XDu6&ToHVsI3jzA&uwRA6S@#531`}m-(Y6d#*Pj1t_X{Rlsr zNA?aq(?{Uft5IXYE836vM`Ogb3#Il58H7FUNB$t}TP>5%SSW{4O!vRlPUzRF&oMDZ z^^NiY#Sz&-^(b>+f02hMPm&!Zm#`upkk4r?VL!;M)k5_u6!cb zQGAfjl&`2RP~IipQ;t0~NB%4$*+w~nxJI0$+DJGP2BZu5lH?L!h|dGE78CJ7Io8&= zB>kx0pnOXCg)pFAnJ}eVOB|y5K|LYmSn}`mAzPH4{_kUt8It~%$bS?w#Ah0-T24MI zCtN5NXf64dd_=gAkEnOFl^f&_(vSAb;M`tdPqw1tx-2WE30z1&${Upb2p8fh*-JH#;*x3w`TR}!G$Mx)|9)sWU-*~wBirWYJTCB~ z`a!;=T0vvvU#bg~Ps!&rMm`m7 zYjd?uBlt)22rJ@Cy%b%=e&n}9og)QbniPH{Y@@a04;mv55$_2rvW+kxzmW{Wl;+_W z#4qVby4Y$PacJU&Yr;q55Bs4@#5{~ku!Hg`<%mfqlM5L!i+?pI?rkX#75VLuSWA3q z@aqFH@67PwVr+fM^Oi1%bKVNWs$KZ-Zfh4@FjC;V_f@Hy#6@j=|6+Cyte z2IY3bo@}H2NI&us`I2;@m?rBppH3ld{C@rtSisLNoTT+_(E$5=NeaMi8vx$ zh`WRV$?e(GQ^=saLAJ%EDJ}3LZjjEz4XQ`=?d9*$q_vcXNN3^;#V^exzR*0vfOtjz zpt?Z5r2dL{K-g10pn0Sp$tC@$){<=$ALL7#M}DI?Cp$!nL2Jox zgfqnv@sxBS3@DCBXX-6H=j{?Xf_zE%(L5R>tU6xaF7g`LMtmXs2&>$4FUbzd?Ih!>=UIUj)g!{5<`Fk&jBF$QY{idop`1v*B>jk2B!kwX&d}?Tz2rCI z71=>PBAqFZQ-4qXC9c_u75SWWru``I5(b1H=}bPN-iPK9E;NtyBfbzWRJRVqz7hG9 z<_+7BPt2qIOjr@uXpH(l!kO|5`I2PNJrm8NI3f-a*9ZgR0o4Utc|bao&uJdvOuEoK z!iDky`HkjLA4_Wqd%}wDSBcNm=TK~s&V)171=5-DBmL+ek?bY8)bH9Vm$*x@MY)M$ zf$9Ryqg+DgNVFeuoH#^w5cZ@W<&Dd$N<7=y>+LA!EsK%QDsv?%E#|ov8z{yO zXE-nHIM{f*kXxnk3b8iTna!ILpY_q&p%d1NXO+b!d72ZirFn77>WN%JWA}brC+r~G zmQQ*o=GDrOPU!OUs|~_l@;U9dv61}SKeU$Q5)a6iv>(|^x?~vIQ~1}v??quR@sHM~ zJ9=F_v%Y(1x{y((TV^5Sc!n8bj4-YHC`9;;bY8f*kl2rOrdXvoCroX%mw0L`$7vqL z7UcuNfcQd~68~PrruIu5tF&K-!|eq2l+D9j}=a`-5~2JS2Z-2yvWzL~=<#!hmw;<3(MB&Xk*oLnN2tgW{a(0_{h9CLd93 zQT-)cXf64O{6YL9ACb-(YNZ$POIQ*1#Am{5yX8l(P{WDw58 zahgY5qqUTG2?OGRtvC};$zIxzdIqwW_)IxsZ{v5ORuDG`E7G}1#(QEvx;OZr&c);p zx}TxAq%rD|D6f%R8Y6ot4~?;(EAXTEpg5xbfcg#MIQ3k_A?kgI2b6~>j#f{S&#?&? zl0mtXup&N_9dvI%xX^tW#Rus}`%#ZRYV|Y01FA7!e zTGEf=oOGr!vV&rkd_d?uZVSCs3h&mlW#Epd&or+MTL;u`sg;)v`ZoC!bj5#>o*yKdzx@yx-! zn1kRr&CBSySv>#vW^zlhw)~;*g$&wndnftqq}{M(Vr`Q4^4Sy3tN1v#(68$2A!5JW z6Xfq}CK(%R%HJ(a^GF6^O1RJ%*>->GAHufVDar`!d)2BXejc&s58v4|Z|02-VqWmU zAWP!>M;Hvt+D7O{^GLs~Mdk>(gx`%=_T&v)k)p$pAh?VnVfArm*gAJf*H7z6T$ z+m$gwKk^azgK#Ep5GP44#TMy8G9J%ODq@D@QtU6kDu1SWl(YO>bYw5_p2kQ&ia}d3 zxIJ#6ID;phDZkJ>(rK@nIwO z5&6FnF-Z6k2DFyqmoT9CpgKtYApO$Re<(1Zd4wP3Fw&WFF>#k{JKZT(=tnV4I+HFG zTf`yaDPcf;MEB(KJrCNC)=v8U7hx~?m#`u`$VcQ4s&B+0(vNT%ARiP*Ze zd7r?Ad`bHeE`&YBC1F7G$X>#Q#;7kL{}P92jAT%*BcIb+iY;3EpU5D&l*cI+NI$Ak zlyk_x) zHHGjaU($Y*U#QN|yfR}33S0<3l1rSV{6{fEu}Xa>$sjw(m!u2j)2kPH3JgdFahLc< z`%!O8{UqIo5`JU{;YYcXd`UIH*4#-L&=_G#TqB*yzl0yfCD}{dpk9>XD0tIgmH5nq z^ds)tY8zosy%~*>&Xh}tFO+v*CY>VeC7u!nRO9JPi`G)S(S8&kv>)YX@;Sv8jS+q{ zk7A3~lD)(ssudJ(w3c{4b(QKqagyZHJu$@~`I2N%y`(rN?$UlFm+T;45{HP-)L#)# z2^W$}@#bPzP1G&&CB-k0W%>Rd;#q=kP6xll_HNHQQ=GS-U$I`C zsb*QyS;%#AaIk5N^dlKG@BW%90+*0sqs7?mkRYK;&N+L8ZKY~uv1#6do=yT&!m4^z z`7eKep>x1(`Lk{` zW~~(yQT&$(|rI;a}l5NBT;t=_baHbxKup*yRUqW(ijTu|*rFu^J`NG(@f(O5}ydiu} zn9>+=lKe}tMfs)VyBR{4Us}Bvxup4-+hX21P;%!chAMH2QXQa5FA=_v_(&fn%`K-L<%n~ABO>fXb=r_ST zl^7%2$VY^!t#%L(NG@TOq;w|XkCbKQy)I!N)oGZp*X89Xv0wF-1I5^LkNzSSMtk%V z`w_1;o=RtvKh#ZMF^^*Z%pQx7Tdq_F5g!!iv>#zWSY@fWNXR80*~+ya*Z(f|yR^TC z7$fWh&vz8_nr+G>#)tL9J{R)2)(EgsKrZZUjqT<^8&Ec~0(V~DVK zZOJ#H2X33(U&t7>I7F-^8ND30h;#nBzAZ(+wr#>Wp`TNC+28MVlJC&FuUjJadp6*Z z7`xgokFcX~(X7G_vX^vm8PiDUymP|?A%oJ?#B9vd4$2b1`h-V<5vGJeT-Hf8;X<|%_B4;=67R{s|j<96cym+T;&DHh1*)fQC~x)6u@UMeK!rOZ%R_=xgV)Y#5q-qKx-#2E2v z;p3S?ZdJgAbP3++W7ArSX|jWI9mNdoN4(E@V}a0*){=jTYZR-LV<|3IPB#m#HOVUf zrZ@4RYL(=|m*fw^fN~dToE@UsoR)gYYg^a&;Hxy$#lh+r$W3RvtV&0QV^0|<6w&`MC{*9*u z_M{8R?O~D6&o5Q;RfhkK>txsB7UQ#VCEG}s!m&wh(z(VW`TiAQkg{jE&~Ni-XCZ_3 z8{BJvm`7_#M%wjLgx?6O(99Y942(Wp?d3aTzt3nQ{PuFd3^8`2;51=xpYRK!k01__ z&V*_DW+#LU+K+rrx)6RV(mM(nJHk^5tZc=F{6-unJ4goc^6#&b9pn$fl*Y(j$}hwh!k+y5erYigZ^TowgXEImD92JhIJtkc z@CWHaTyu|FBw~T&63*mbvX{mvj);?lJ#mP*OFk!VP;A*jogtpm7-3Jfhhm28B^i{P z$To^!>S@SFgaPGj@+IY6T1!5s*dm=t2Jw`zr+MTLnn$&k;+N_S`Hkd~-+Uh&6MYlu zM{!QRB;M10G>`V9xjq(BIM8bvUQJoGoBA=5C%86tz^@PMp z@+GY$Tqu{&T9QGy&=}Z!@U#0|>Nq#xyCs=v1Sjd}~pO;q2Ae^eJJA5fkoduc7n zr7_AmL(L9P7vV(LcOi2d$h-6USuvG@tH`?Nd{p+F-UPvW7L}wF0_{TLiLyYK|ZINVr%?TY*Eb6{VL&1 z7!aRnKk6qbM^GLj{~p^oSJae25jn-Za~7X*VqQdcNAV6?mlE&Avjp02altX7FD|kC zPjT+O&eFnSr~mu-o_QPZ=3;HPUqgh>=2yqXytHXX3jKclcC{EQ>d?rhu`>5kiFrRQ z>npGtyP%(Vc48~0WE){my3o9?xiSb`NEvYHwl5NCE z@>`$7b%b2PAog6Om`7`gyEI0&k$+czFMroF?MHk`zC*s}>sKs^pDnRKej^M>F5ygL z%j1>_Ouc6n5dNK!`Hh%I*t)k0vAX@( zV}U98gYqB67ReZ~&OykawS+UtC5}^k)UJ?4$fdOumlWqDgRq}tx>_M|4kNzUI%aFn zK=X)Kq#xxHTVrrUMfrXc*+#k$&ct2nr6^X(HqwQ1Z2SJ(1z&8E4uhK(Rn$gcaSJlFqar z-G5Nb5cb41s)Mz6A5e*NC-rcoU(;<51rH8g{Y{L~TEc+x5S>3$d{D1Ke4$)IxKJDs zCn=YZZL{y?6g7&@K?r+_RlB!gmgX1_kdAH)q?c}0GE;gs8wIA$oe zwhd@5@(W>4@k?^amo!FxBe@ipWC!In$`J)}9I**|;wkA&KBqiH^T@WL_VSq~;Y?$J z=QaypQmhikDb91ZlE0Ie_(FD2d{8WW)4*BecA7`_5)Z~VmA|u^=24EIoJg@sHGsIb zD90_4H%J%CYx_$c7i(AacQYrBXr_ zIPA@!2PXd#rlcROB@BqC6d$BB#V^GrVMTnVSf%_&`G9nxc@%>rm+~a-M|G8An)V}{ zDJ}_9@;T*fidDj%_M_OMwR9FlJf-|h_Xbo$$!~-U=|VVDpF?A$3&p~aKhB6=l>9-x zGT}nGiFifzk}x11P+g$DnCu{2DCbO0E8pv*cq9Iiew0s%2ZSHhGU~GlE5d~^pnOVl z$(I!SG>>qmzL;_j)d0eocxvlB@)5;3jZrMnJstHbgbU$EzNCJGat`G+l0kWrctEyM z%+Ng2nK(qgq?o1}N;#2wO!6DuN0E=nA2g5nO!^V82rIfjBA=5C>h;JD(uL$wE}@)A z=a`i5$wy=x^)KX0%Gtzw@*Cwu!iw?+`JC!6^@+rBiUsl!ahL2Me^9?cy%fbXaf5In zPLe-}S7a~QM%dF?B+a8dN%v)RZ$LaHdnsQL2ILRwu3?m^feu&&<2&()Spkdg7G`oY1&2oKpPU0Dy6PWX zoWnxHO$i@$09|z0TwR@`+5`mScU+ydeS#u7bkiK6c{8e+M+@ij&TjtxbpkrLB{<8+ zE4XxNcehAW$j51(Vwz`3&tP9;T4=a+zi4Nd4q*||kya8!gnMY)e*Drc+|T=B* zmjnjHBjW0;W8%`vEh4aOJ5#s9Rto~6ojsgAoIY9a;np>vYiN{zu&Jvl%DQ!{d>;7< ze?FnxznW0R6ciQ^X>!)I($(wMwR5PcOM+_A-8z_DG)%1k>eyH{`Uuho<(#{94u}j5 z2(+5<+4rqeLrqZ;ACCT1 z&GSpBdHx-0fnl9YUxF?EdtbsWD9jWP=^qso5N3+{+*Oe#Yvd(-#~Ksi5&Bdow{U-r zjvBi?wJ$z8K^wA0Ls&qRb(t1H@l(1QduZX{Yz+u4BD&FFkk#waCjS5}cC3NroX^)f zKcBO&lbaE^VW!rm@L%>qqx2*Y(B~6VjRpV0*6+bHUtIc$twB~Ao2)&|#{!!`W5caq zZ>qlXZ|yAgiJkiFuP~C=*#$Sn!7^?GRw?Ec_!PgH4fIs;L+jW(~wn*0LBK zmCxDJIo}VJfBYEIk){q2)^cejytVXO^Q2zoJ>258(ZIAOlMgZ7AUYsCI3O}u3wvw# z7!hgGqTJcpx=C0-kja|-v=-n?tEfVcl1V|IGU6 zue3g4-QPy%XLd$^rJV`u{#MXu76pE#MG5OPL0_zrpIH?6l@{3|=rfDHs_OsCitnuj z0ha8~Ta?dBJudhpSthRWMwEYTaksg!f2l10oiSfpV}m_LY5cd-rm^sE39Z*}W9Gk8 z)4sUo6O&}cHk@QrBCZn<-A447`pUmGNiWs{?DC-~#jglVy!gwBK`stUy!dYlf?OS$c=g}hZs?i^MYL~kZ4#`@TIGvBUvPG5 zmvBq&?A+bIz13~SoWnl3@6~U?KmDJW?;IN992pc{zP!hWl?k_npDxorTPJq2-u0C) zpU>0X!@Iag$$ZX*5`Jrb&dcRXotL#G>8jJoMRrs1#}S`y+bw=-LhIz}9RH=peeJley~!m!BHY@~`M0-r z-0@AAt9BC_Y`xpGx*(rtN#_Qp4$hwLp5E4$FFMqEAZQ)+@G9f&TgF`*3XTr&4++)p z0rHiw9)d+imC$aO1KWg@sA7t07ah@|L{LPqsYGySRAeXXeNlMp;-=tELB%~wSVaVs zhzjzz-b{B2i;mKEO4!d3?%|Ul+@rL!r$-rg&yQVaaAZIi{bt*G01@pU5)c+;Z5|UE zcB?vJ{-GiMox-(Q;h)UV4ngH`wcibG?7g^=vy0{pVcopL4zN;1BJ_S9SRRoa@D( zw*GUjCmxi2a>D%2x!z|_5&!nqA)yia=UmTvIQ_+grN6ro`Se^Z@+*%=64rf<{LfBJ z{yEqCnnw)(oa?##bFOE+a`8#B{O4Rxe=7XpiHtY_Gfv+A_7Lp9`CP9?Xn1g_FiSu8 z_*Q%}pPpoCpFca<(--{5M|=7%#@U|!#sBMvdo?s5KR?~G zo|yjsdb(#lPY$%cLzU>YJ+A;?ll8?wdTmdCWzaa@)84St-`7d>=3Bz9){}Pa{4p{@ zf9c0P{wwQ=ulCx@$FD*{BcrtQd+Q53dE;M)`SjJ8FPzY|jtmX{>}<~ZvYMvJCr5Yj zU+e$Zj&im4?ySk($>0C`y5H5U?(gsHrd$1mR|K{97UN$Ltk)^3jrHxp>e`!)*5eGh z9?lr!&qras_U4mjeX9iFZUK>z;ij-C>!I?8m!{%hBlQo}->ovfXde)1efKmf;Y2EM~a}H`_ebFh>6z*(&jA(sbJJ>lo zLVJrnA|lLMAg%8s1xGns-*qvb{Uv?_QIn%vZvVWC5dV6gb`cF>8KSkEsIR9|xqRzh77s?ZM_`)<&-t7x>KkW7KX|snm*9PhT odc{{MqAO~BW@(G(T~1Amd}7<>ihoOyk1sv^9|qxK+5i9m diff --git a/out/Graphsfiga2.gph b/out/Graphsfiga2.gph index bde356928849901cfb91cb3b7c2505317280b93f..45e72756c38a7bd7a322557efcd25f42d56988d9 100644 GIT binary patch delta 104 zcmca^bKPdc4MuhoD+2>7Q`5=!885RX8k(jWByZlqw3C@BCv|cmTleOFY_phI6U~wm t6DQB*ie*hSG*2{`{GUsd11y$oz%{v0SY)yRcRWnh+A|?O; delta 105 zcmca^bKPdc4MuijD-%mA1GCBZ885S$nI|V2S!~|Hw3B)ABi6Rb39Rg!|FO+tW;HW5 uHL#pKmn)VPsKhdD@_#N-4zO6V0oUY0VUfuO-0?8oQ@LG);HEy1Ee8NzXdyBH diff --git a/out/Graphsfiga3.gph b/out/Graphsfiga3.gph index 7f43b632266f03187f8c4fde322a38345ca3ca2e..d2ea5bd8a746574dd92b4321f55d3dacd1e317d1 100644 GIT binary patch delta 678 zcmZ9KPfHs?7>7w>(%_$lw(B7j1r=J_D$ZngXR~T7k{B#rdab4E>~8F#J+wls*n{iI zgQxZd!IKKstHOX@{RSR|UP3>B7Ow@d?>n<8(%bxYe>3kh&+bkuz0*n`Td8}_7-M6u z506t9Iq6C%LTF`UwVIZhEM{N8gP|(??y0ExT$G_ou*7s_rgOn$L3v#b-w(_d4zd`l zM-PKc2i0M*xS{^^23VG5=9%)ZB4uIQHsxoqJy}yHeRG-g#|BJwZ^3QHG86`Ha+0|v zoVP31)wdyBsG|Bk z;@}Q*>5y3E#_8U?RC2KLTy0P8{fAV6BZ+<}d{t_BVGynNxXQ_(nKK#H(q+^ zseK@Lu?ng5X5m45)c?Sv(1XF!tAbY{&^I$%@%Dc6-pqXa?d&&``_1H!bm9@8obV=d z44x$}495+87cPxDZYTYej9v*ZjlZfCHu%{H=Q>tXrW`C!K-1X4(e6OCgEDQ5u(v0U zT*bRgpr%DhPhVwq_8ggqVQ(gnKc6q9;8oWrXtjNSCj%|h;g(ev@YUJD&x6I3VR2r{ z!PCJy)?S2koNZfF&Is4{-3bx}FBu7{ZUs z(^*sfJqCvj_e&*hI9AcJ;I=^^iuECgc1j?o(#fDpo~~6ANo;XZ;z@x_f+&|BY*uMe xyCaTR8=h5vkLlOL1ROQy>2|v)qz0`9JHM?ZVmDjIQyLC`9j~_Ezq!7X+CM9-%sK!7 diff --git a/out/Graphsfiga4a.gph b/out/Graphsfiga4a.gph index 12214d6643f75b8764375c009a350d394e1e364f..443d2c46e338a877131fd8865ca921e5fb25f7c8 100644 GIT binary patch delta 392 zcmezOp7Gy%#tpJeY$jF)hE@iXm6>j^C7KwRTNrF+WWL1Al#@Eyk*#xc9Q!0jR-;6V zM3YI(m7DW8V_-6qhlg!PHO;J_JL)-~elqn3f$B1VPW1>UIPH#U3dck delta 388 zcmezOp7Gy%#tpJeY{ph5mR5$7m6>j^nHd?FB_?lXWWK~a*@>-V@&Q)X%?a!i7}?BB zEz%4uCNnZuY|i71flE$KU|%eDt zR>RJI^1*nvQv4p7u+G9ys5B3lq@ Q-{$`8x7@JsZYr+<0Q_fj7ytkO diff --git a/out/Graphsfiga4b.gph b/out/Graphsfiga4b.gph index 6d11b1a6718104420cc2af2ffc2b8c20512b6958..1b7b08efb1141b10d7aaa2645b4dccc48412347a 100644 GIT binary patch delta 409 zcmaFzj`7Jm#tj-wY$jF)hE@iX^_Xt3B^sw0r6h0WVZP4Hl#@DnBTx6{0`_D^pm>Tw zvcY5?=CaNHoXIe`$p!4|Ccov~%4TMeXpo!?mX_m3mEI$~l{L{g*~D@(H*@*sw<4&r z-I73Av!ukt$*xkdKwAt9jV&f8>WM%F4@$|woFovIB(T|CTZ9>;Dme{P707{`L8>;{ zgB2wk8ylb*1#u==(dL~&5LG6YCa9_)uHDQZRwxXzJJB53l=+#OY>5UY1{TQnKhMmE zIXxx|C=YR8OqRst#aV(tF4!eNu9!)zf~{VByl-NGp0}9+5P$<_^NXxs+^|S^QC0&0 Dtd4;L delta 411 zcmaFzj`7Jm#tj-wY{ph5mR5$7^_Xt3nWmVVm|AS+VZP2hIf$)e@b%?0eqjI5?9 zW+|qVxtYs1`*SA48XH06--@8g zcS~+%H8VCfu$=5F6$^HOVe;feJrStjK`A+)?LcR3<_}92*zB$?!pvr7WMP(srU>MQ z6w~C*0%1u4o9uy#OjAsfv6uvOD8!_lL10D3X{jb?)`49MR8%MoG{h)11zCQ6rY6XZ zmTAb=KhMku37P<{i^?T$QhE@g^lLZ-Xuq7HKrWjjne$Tjt6U0tVw3z&!v10NY97YP8mA_v8BD$>9tva{r5cz(m}W_diOE2w$K;v1B8rKI z76!=%1`0Nz#i_x`8L7Fcb_(8R20#GOZZKKFHEObeq!iTp$p(^&P}?_q=!r6J&XGzG zf;!WD@*SVz$v#fO5R;A5QcRPvn+$RdlF49)1C8qvMl&fxKGE19B?-GJAdhUm?3B(3 d^f|~AlO0^FSQA0EZmxF;~=o*B{5QhVe>k?*zczE({pAw)!8S-XErpAdT*bD*t iWAkOFbVfFaA0|7vSh0dF-CXYy#sLeu&3Al$F#!OCVq-S| diff --git a/out/Graphsfige1.gph b/out/Graphsfige1.gph index 39d65d5e0f72756952e31baa7163c9170db5a948..ceba83a928871a5caa906a1a0de9908fd5c840de 100644 GIT binary patch delta 745 zcmZvaPixdb7{*E7ovfFQMM`N4>#l!pDr6?JyUDh-76cU!TFPz_!E7?wQfx~LQZEHB z9*WT09^P}o4|V z@wAZ%a_^e;Q7Qh05Pw0-^5nHOiX29HgJ&d#UzXF~tkZ}v5d`Myp-k`E`eP>IAdrgx zs8{k6HTye(2l$ylMV-Y-;^7Yh_a{QoO87Y;OnFGp2_$YNajX%~YCiWv?$sANFZyd@ zv%k~7U4Pj0)D!D50>9pZ{YePN^KgZj-KATG*-PatFdxq%*fNo!y8>G^77JR;%&aQr zOOhp~k$G71Vi|t9lC8pZ8*j|Q9PX~c6uLLzQ$C3QJLq{WOj|Vd3f(i60iLNrli-bc z6Sp>Bck#(%7|Vkts6z1`8n4PJ#G6EOd{$Pzh^a{}Qgfx^|D2%zbKb>j2WBoauf;^6 zd)<#*?ZBo*OhNd*3k$^Liod(iCT4S7T89NEb17e~!_y1-FN|Lz*e1H2tGL2oTBbeN GxBmbEh}Z4_ delta 723 zcmZ{i&ubG=5Xae_yiG4zikr`4!`1S`)fePuDPLMIFB~hLH%I0KGH%ikkUmoJ0Zxzos(}RQI;YwM>(V zRNU`=Tc8srA^i}rMxO=PIZV)@?*i`XtH9V>^v-_^M9)9J7kD3E*3$gPW%QH9SXOQ{ zU-Z`F&EB)#&C0z%^1-af*9F+&xq1JP-p;{guI0Uzorl?r`AjR9P9xaTYLUGPPb!Eq zsmlLDdC-_NbgY+#YN=A_FIzbcxN6e1S-3>o>o86Bb@(*yd(!d-ELn)@OzPzZJenFmR{9db RQ<0i6Ppb~hsBRl}%s=Z+)aC#H From 4eb0318b76f9ce34378f51c83d1fbf946f461a90 Mon Sep 17 00:00:00 2001 From: calebhf1 <62314190+calebhf1@users.noreply.github.com> Date: Wed, 25 Sep 2024 15:04:40 -0500 Subject: [PATCH 3/4] run3 --- ado/_/_eststo.ado | 28 + ado/_/_eststo.hlp | 1 + ado/backup.trk | 367 + ado/c/cibar.ado | 497 + ado/c/cibar.sthlp | 123 + ado/c/cmogram.ado | 523 + ado/c/cmogram.hlp | 236 + ado/c/coefplot.ado | 3903 +++++++ ado/c/coefplot.sthlp | 1817 ++++ ado/e/estadd.ado | 2465 +++++ ado/e/estadd.hlp | 939 ++ ado/e/estout.ado | 4959 +++++++++ ado/e/estout.hlp | 2452 +++++ ado/e/estpost.ado | 2124 ++++ ado/e/estpost.hlp | 1524 +++ ado/e/eststo.ado | 343 + ado/e/eststo.hlp | 347 + ado/e/esttab.ado | 1337 +++ ado/e/esttab.hlp | 963 ++ ado/g/grc1leg.ado | 118 + ado/g/grc1leg.hlp | 138 + ado/i/ivreg2.ado | 6815 ++++++++++++ ado/i/ivreg2.sthlp | 1787 ++++ ado/i/ivreg210.ado | 6951 ++++++++++++ ado/i/ivreg210.sthlp | 1681 +++ ado/i/ivreg210_p.ado | 112 + ado/i/ivreg28.ado | 5652 ++++++++++ ado/i/ivreg28.hlp | 1232 +++ ado/i/ivreg28_cue.ado | 24 + ado/i/ivreg28_p.ado | 97 + ado/i/ivreg29.ado | 7576 ++++++++++++++ ado/i/ivreg29.hlp | 1508 +++ ado/i/ivreg29_cue.ado | 26 + ado/i/ivreg29_p.ado | 100 + ado/i/ivreg2_p.ado | 148 + ado/l/leebounds.ado | 961 ++ ado/l/leebounds.sthlp | 221 + ado/l/livreg2.mlib | Bin 0 -> 262968 bytes ado/o/outreg2.ado | 10482 +++++++++++++++++++ ado/o/outreg2.hlp | 1212 +++ ado/o/outreg2.pref | 3 + ado/o/outreg2_prf.ado | 3 + ado/r/ranktest.ado | 2676 +++++ ado/r/ranktest.sthlp | 939 ++ ado/r/ranktest11.ado | 981 ++ ado/r/ranktest11.sthlp | 433 + ado/r/ranktest9.ado | 1387 +++ ado/s/seeout.ado | 452 + ado/s/seeout.hlp | 59 + ado/s/shellout.ado | 79 + ado/s/shellout.hlp | 98 + ado/stata.trk | 409 + ado/x/xtivreg2.ado | 765 ++ ado/x/xtivreg2.hlp | 250 + ado/x/xtivreg2_p.ado | 95 + code/~analysis_mindspark_20180723.do.stswp | 1877 ++++ data/ado/_/_eststo.ado | 28 + data/ado/_/_eststo.hlp | 1 + data/ado/backup.trk | 334 + data/ado/c/cibar.ado | 497 + data/ado/c/cibar.sthlp | 123 + data/ado/c/cmogram.ado | 523 + data/ado/c/cmogram.hlp | 236 + data/ado/c/coefplot.ado | 3903 +++++++ data/ado/c/coefplot.sthlp | 1817 ++++ data/ado/e/estadd.ado | 2465 +++++ data/ado/e/estadd.hlp | 939 ++ data/ado/e/estout.ado | 4959 +++++++++ data/ado/e/estout.hlp | 2452 +++++ data/ado/e/estpost.ado | 2124 ++++ data/ado/e/estpost.hlp | 1524 +++ data/ado/e/eststo.ado | 343 + data/ado/e/eststo.hlp | 347 + data/ado/e/esttab.ado | 1337 +++ data/ado/e/esttab.hlp | 963 ++ data/ado/g/grc1leg.ado | 118 + data/ado/g/grc1leg.hlp | 138 + data/ado/i/ivreg2.ado | 6815 ++++++++++++ data/ado/i/ivreg2.sthlp | 1787 ++++ data/ado/i/ivreg210.ado | 6951 ++++++++++++ data/ado/i/ivreg210.sthlp | 1681 +++ data/ado/i/ivreg210_p.ado | 112 + data/ado/i/ivreg28.ado | 5652 ++++++++++ data/ado/i/ivreg28.hlp | 1232 +++ data/ado/i/ivreg28_cue.ado | 24 + data/ado/i/ivreg28_p.ado | 97 + data/ado/i/ivreg29.ado | 7576 ++++++++++++++ data/ado/i/ivreg29.hlp | 1508 +++ data/ado/i/ivreg29_cue.ado | 26 + data/ado/i/ivreg29_p.ado | 100 + data/ado/i/ivreg2_p.ado | 148 + data/ado/l/leebounds.ado | 961 ++ data/ado/l/leebounds.sthlp | 221 + data/ado/l/livreg2.mlib | Bin 0 -> 262968 bytes data/ado/r/ranktest.ado | 2676 +++++ data/ado/r/ranktest.sthlp | 939 ++ data/ado/r/ranktest11.ado | 981 ++ data/ado/r/ranktest11.sthlp | 433 + data/ado/r/ranktest9.ado | 1387 +++ data/ado/stata.trk | 367 + data/ado/x/xtivreg2.ado | 765 ++ data/ado/x/xtivreg2.hlp | 250 + data/ado/x/xtivreg2_p.ado | 95 + out/Graphsfig4.gph | Bin 26590 -> 26590 bytes out/Graphsfig5.png | Bin 114042 -> 113748 bytes out/Graphsfig5a.gph | Bin 16034 -> 16034 bytes out/Graphsfig5b.gph | Bin 15975 -> 15975 bytes out/Graphsfig6.png | Bin 150439 -> 150809 bytes out/Graphsfiga1.gph | Bin 378291 -> 378289 bytes out/Graphsfiga2.gph | Bin 7767 -> 7767 bytes out/Graphsfiga3.gph | Bin 44953 -> 44953 bytes out/Graphsfiga4a.gph | Bin 30718 -> 30718 bytes out/Graphsfiga4b.gph | Bin 30564 -> 30564 bytes out/Graphsfiga5.gph | Bin 20438 -> 20438 bytes out/Graphsfige1.gph | Bin 221913 -> 221913 bytes out/Tablestable8.xsls | 15 + 116 files changed, 150265 insertions(+) create mode 100644 ado/_/_eststo.ado create mode 100644 ado/_/_eststo.hlp create mode 100644 ado/backup.trk create mode 100644 ado/c/cibar.ado create mode 100644 ado/c/cibar.sthlp create mode 100644 ado/c/cmogram.ado create mode 100644 ado/c/cmogram.hlp create mode 100644 ado/c/coefplot.ado create mode 100644 ado/c/coefplot.sthlp create mode 100644 ado/e/estadd.ado create mode 100644 ado/e/estadd.hlp create mode 100644 ado/e/estout.ado create mode 100644 ado/e/estout.hlp create mode 100644 ado/e/estpost.ado create mode 100644 ado/e/estpost.hlp create mode 100644 ado/e/eststo.ado create mode 100644 ado/e/eststo.hlp create mode 100644 ado/e/esttab.ado create mode 100644 ado/e/esttab.hlp create mode 100644 ado/g/grc1leg.ado create mode 100644 ado/g/grc1leg.hlp create mode 100644 ado/i/ivreg2.ado create mode 100644 ado/i/ivreg2.sthlp create mode 100644 ado/i/ivreg210.ado create mode 100644 ado/i/ivreg210.sthlp create mode 100644 ado/i/ivreg210_p.ado create mode 100644 ado/i/ivreg28.ado create mode 100644 ado/i/ivreg28.hlp create mode 100644 ado/i/ivreg28_cue.ado create mode 100644 ado/i/ivreg28_p.ado create mode 100644 ado/i/ivreg29.ado create mode 100644 ado/i/ivreg29.hlp create mode 100644 ado/i/ivreg29_cue.ado create mode 100644 ado/i/ivreg29_p.ado create mode 100644 ado/i/ivreg2_p.ado create mode 100644 ado/l/leebounds.ado create mode 100644 ado/l/leebounds.sthlp create mode 100644 ado/l/livreg2.mlib create mode 100644 ado/o/outreg2.ado create mode 100644 ado/o/outreg2.hlp create mode 100644 ado/o/outreg2.pref create mode 100644 ado/o/outreg2_prf.ado create mode 100644 ado/r/ranktest.ado create mode 100644 ado/r/ranktest.sthlp create mode 100644 ado/r/ranktest11.ado create mode 100644 ado/r/ranktest11.sthlp create mode 100644 ado/r/ranktest9.ado create mode 100644 ado/s/seeout.ado create mode 100644 ado/s/seeout.hlp create mode 100644 ado/s/shellout.ado create mode 100644 ado/s/shellout.hlp create mode 100644 ado/stata.trk create mode 100644 ado/x/xtivreg2.ado create mode 100644 ado/x/xtivreg2.hlp create mode 100644 ado/x/xtivreg2_p.ado create mode 100644 code/~analysis_mindspark_20180723.do.stswp create mode 100644 data/ado/_/_eststo.ado create mode 100644 data/ado/_/_eststo.hlp create mode 100644 data/ado/backup.trk create mode 100644 data/ado/c/cibar.ado create mode 100644 data/ado/c/cibar.sthlp create mode 100644 data/ado/c/cmogram.ado create mode 100644 data/ado/c/cmogram.hlp create mode 100644 data/ado/c/coefplot.ado create mode 100644 data/ado/c/coefplot.sthlp create mode 100644 data/ado/e/estadd.ado create mode 100644 data/ado/e/estadd.hlp create mode 100644 data/ado/e/estout.ado create mode 100644 data/ado/e/estout.hlp create mode 100644 data/ado/e/estpost.ado create mode 100644 data/ado/e/estpost.hlp create mode 100644 data/ado/e/eststo.ado create mode 100644 data/ado/e/eststo.hlp create mode 100644 data/ado/e/esttab.ado create mode 100644 data/ado/e/esttab.hlp create mode 100644 data/ado/g/grc1leg.ado create mode 100644 data/ado/g/grc1leg.hlp create mode 100644 data/ado/i/ivreg2.ado create mode 100644 data/ado/i/ivreg2.sthlp create mode 100644 data/ado/i/ivreg210.ado create mode 100644 data/ado/i/ivreg210.sthlp create mode 100644 data/ado/i/ivreg210_p.ado create mode 100644 data/ado/i/ivreg28.ado create mode 100644 data/ado/i/ivreg28.hlp create mode 100644 data/ado/i/ivreg28_cue.ado create mode 100644 data/ado/i/ivreg28_p.ado create mode 100644 data/ado/i/ivreg29.ado create mode 100644 data/ado/i/ivreg29.hlp create mode 100644 data/ado/i/ivreg29_cue.ado create mode 100644 data/ado/i/ivreg29_p.ado create mode 100644 data/ado/i/ivreg2_p.ado create mode 100644 data/ado/l/leebounds.ado create mode 100644 data/ado/l/leebounds.sthlp create mode 100644 data/ado/l/livreg2.mlib create mode 100644 data/ado/r/ranktest.ado create mode 100644 data/ado/r/ranktest.sthlp create mode 100644 data/ado/r/ranktest11.ado create mode 100644 data/ado/r/ranktest11.sthlp create mode 100644 data/ado/r/ranktest9.ado create mode 100644 data/ado/stata.trk create mode 100644 data/ado/x/xtivreg2.ado create mode 100644 data/ado/x/xtivreg2.hlp create mode 100644 data/ado/x/xtivreg2_p.ado create mode 100644 out/Tablestable8.xsls diff --git a/ado/_/_eststo.ado b/ado/_/_eststo.ado new file mode 100644 index 0000000..90af09b --- /dev/null +++ b/ado/_/_eststo.ado @@ -0,0 +1,28 @@ +*! version 1.0.4 09nov2007 Ben Jann + +program define _eststo, byable(onecall) + local caller : di _caller() + version 8.2 + if "`_byvars'"!="" local by "by `_byvars'`_byrc0' : " + if inlist(`"`1'"',"clear","dir","drop") { + version `caller': `by'eststo `0' + } + else { + capt _on_colon_parse `0' + if !_rc { + local command `"`s(after)'"' + if `"`command'"'!="" { + local command `":`command'"' + } + local 0 `"`s(before)'"' + } + syntax [anything] [, Esample * ] + if `"`esample'"'=="" { + local options `"noesample `options'"' + } + if `"`options'"'!="" { + local options `", `options'"' + } + version `caller': `by'eststo `anything'`options' `command' + } +end diff --git a/ado/_/_eststo.hlp b/ado/_/_eststo.hlp new file mode 100644 index 0000000..49837ce --- /dev/null +++ b/ado/_/_eststo.hlp @@ -0,0 +1 @@ +.h eststo diff --git a/ado/backup.trk b/ado/backup.trk new file mode 100644 index 0000000..e2ba07b --- /dev/null +++ b/ado/backup.trk @@ -0,0 +1,367 @@ +* 00000009 +*! version 1.0.0 +* Do not erase or edit this file +* It is used by Stata to track the ado and help +* files you have installed. + +S http://www.stata.com/users/vwiggins +N grc1leg.pkg +D 25 Sep 2024 +U 1 +d grc1leg. Combine graphs into one graph with a common legend. +d Program by Vince Wiggins, StataCorp . +d Statalist distribution, 16 June 2003. +d +d Exactly like -graph combine- but shows a single common legend for all +d combined graphs. +d +d Distribution-Date: 02jun2010 +f g/grc1leg.ado +f g/grc1leg.hlp +e +S http://fmwww.bc.edu/repec/bocode/c +N cibar.pkg +D 25 Sep 2024 +U 2 +d 'CIBAR': module to plot bar graphs and confidence intervals over groups +d +d cibar plots bars and confidence intervals of the mean of a +d variable over at least one group. cibar aims at drawing graphs +d that resemble graphs created by graph bar varname, over(varname) +d asyvar, adding confidence intervals to the bars. In order to do +d so, cibar uses Stata's twoway bar and twoway rcap. cibar shows +d graphically the differences in the mean of a variable depending +d on the categories of other variables. +d +d KW: bar graph +d KW: graphics +d KW: confidence intervals +d KW: means +d +d Requires: Stata version 13 +d +d Distribution-Date: 20190624 +d +d Author: Alexander Staudt, N/A +d Support: email staudtlex@@live.de +d +f c/cibar.ado +f c/cibar.sthlp +e +S http://fmwww.bc.edu/repec/bocode/c +N coefplot.pkg +D 25 Sep 2024 +U 3 +d 'COEFPLOT': module to plot regression coefficients and other results +d +d coefplot plots results from estimation commands or Stata +d matrices. Results from multiple models or matrices can be +d combined in a single graph. The default behavior of coefplot is +d to draw markers for coefficients and horizontal spikes for +d confidence intervals. However, coefplot can also produce various +d other types of graphs. +d +d KW: graphics +d KW: coefficients +d KW: estimation +d +d Requires: Stata version 11 +d +d Distribution-Date: 20230225 +d +d Author: Ben Jann, University of Bern +d Support: email jann@@soz.unibe.ch +d +f c/coefplot.ado +f c/coefplot.sthlp +e +S http://fmwww.bc.edu/repec/bocode/c +N cmogram.pkg +D 25 Sep 2024 +U 4 +d 'CMOGRAM': module to plot histogram-style conditional mean or median graphs +d +d cmogram graphs the means, medians, frequencies, or proportions +d of one variable, conditional on another. Output can be further +d conditioned on a series of control variables, in which case it is +d the means or medians of the residual values that are plotted. For +d regression discontinuity and similar applications, graphs can be +d split at a particular cut point, and a by() option allows for +d sub-groups to be plotted separately. While the default output is +d similar to a histogram, there is the option of scatterplot-style +d output. +d +d KW: graphics +d KW: descriptive statistics +d KW: mean +d KW: median +d KW: frequencies +d KW: proportions +d +d Requires: Stata version 9.2 +d +d Distribution-Date: 20110911 +d +d Author: Christopher Robert, John F. Kennedy School of Government, Harvard University +d Support: email chris_robert@@hksphd.harvard.edu +d +f c/cmogram.ado +f c/cmogram.hlp +e +S http://fmwww.bc.edu/repec/bocode/e +N estout.pkg +D 25 Sep 2024 +U 5 +d 'ESTOUT': module to make regression tables +d +d estout produces a table of regression results from one or +d several models for use with spreadsheets, LaTeX, HTML, or a +d word-processor table. eststo stores a quick copy of the active +d estimation results for later tabulation. esttab is a wrapper for +d estout. It displays a pretty looking publication-style regression +d table without much typing. estadd adds additional results to the +d e()-returns for one or several models previously fitted and +d stored. This package subsumes the previously circulated esto, +d esta, estadd, and estadd_plus. An earlier version of estout is +d available as estout1. +d +d KW: estimates +d KW: LaTeX +d KW: HTML +d KW: word processor +d KW: output +d +d Requires: Stata version 8.2 +d +d Distribution-Date: 20230212 +d +d Author: Ben Jann, University of Bern +d Support: email jann@@soz.unibe.ch +d +f _/_eststo.ado +f _/_eststo.hlp +f e/estadd.ado +f e/estadd.hlp +f e/estout.ado +f e/estout.hlp +f e/eststo.ado +f e/eststo.hlp +f e/estpost.ado +f e/estpost.hlp +f e/esttab.ado +f e/esttab.hlp +e +S http://fmwww.bc.edu/repec/bocode/o +N outreg2.pkg +D 25 Sep 2024 +U 6 +d 'OUTREG2': module to arrange regression outputs into an illustrative table +d +d outreg2 provides a fast and easy way to produce an illustrative +d table of regression outputs. The regression outputs are produced +d piecemeal and are difficult to compare without some type of +d rearrangement. outreg2 automates this process by concatenating +d the successive regression outputs in a vertical format. The +d resulting table is saved to the disk in ASCII format, which can +d be read by other programs. outreg2 thus facilitates the +d convertion of regression outputs to a standard format suitable +d for inclusion in a scholarly publication. The functionality of +d outreg2 is based on the earlier package outreg, by John Luke +d Gallup. Unlike outreg, outreg2 is capable of writing LaTeX-format +d tables, as well as ASCII, MS Word and MS Excel. +d +d KW: regression +d KW: output +d KW: tables +d KW: tab-delimited output +d KW: LaTeX +d KW: Word +d KW: Excel +d +d Requires: Stata version 7 +d +d Distribution-Date: 20140817 +d +d Author: Roy Wada +d Support: email roywada@@hotmail.com +d +f o/outreg2.ado +f o/outreg2_prf.ado +f o/outreg2.hlp +f s/shellout.ado +f s/shellout.hlp +f s/seeout.ado +f s/seeout.hlp +e +S http://fmwww.bc.edu/repec/bocode/x +N xtivreg2.pkg +D 25 Sep 2024 +U 7 +d 'XTIVREG2': module to perform extended IV/2SLS, GMM and AC/HAC, LIML and k-class regression for panel data models +d +d xtivreg2 implements IV/GMM estimation of the fixed-effects and +d first-differences panel data models with possibly endogenous +d regressors. It is essentially a wrapper for ivreg2, which must +d be installed for xtivreg2 to run: ssc install ivreg2, replace). +d xtivreg2 supports all the estimation and reporting options of +d ivreg2; see help ivreg2 for full descriptions and examples. In +d particular, all the statistics available with ivreg2 +d (heteroskedastic, cluster- and autocorrelation-robust covariance +d matrix and standard errors, overidentification and orthogonality +d tests, first-stage and weak/underidentification statistics, etc.) +d are also supported by xtivreg2 and will be reported with any +d degrees-of-freedom adjustments required for a panel data +d estimation. +d +d KW: instrumental variables +d KW: panel data +d KW: fixed effects +d KW: first differences +d KW: Sargan test +d KW: robust estimation +d KW: orthogonality +d KW: GMM +d KW: Hansen's J +d KW: heteroskedastic OLS, +d +d Requires: Stata version 8.2 and ivreg2, ranktest from SSC +d +d Distribution-Date: 20200626 +d +d Author: Mark E Schaffer, Heriot-Watt University +d Support: email m.e.schaffer@@hw.ac.uk +d +f x/xtivreg2.ado +f x/xtivreg2.hlp +f x/xtivreg2_p.ado +e +S http://fmwww.bc.edu/repec/bocode/i +N ivreg2.pkg +D 25 Sep 2024 +U 8 +d 'IVREG2': module for extended instrumental variables/2SLS and GMM estimation +d +d ivreg2 provides extensions to Stata's official ivregress and +d newey. Its main capabilities: two-step feasible GMM estimation; +d continuously updated GMM estimation (CUE); LIML and k-class +d estimation; automatic output of the Hansen-Sargan or +d Anderson-Rubin statistic for overidentifying restrictions; C +d statistic test of exogeneity of subsets of instruments (orthog() +d option); kernel-based autocorrelation-consistent (AC) and +d heteroskedastic and autocorrelation-consistent (HAC) estimation, +d with user-specified choice of kernel; Cragg's "heteroskedastic +d OLS" (HOLS) estimator; default reporting of large-sample +d statistics (z and chi-squared rather than t and F); small option +d to report small-sample statistics; first-stage regression +d reported with F-test of excluded instruments and R-squared with +d included instruments "partialled-out"; enhanced Kleibergen-Paap +d and Cragg-Donald tests for weak instruments, redundancy of +d instruments, significance of endogenous regressors; two-way +d clustering of standard errors; Kiefer and Driscoll-Kraay +d standard errors. ivreg2 can also be used for ordinary least +d squares (OLS) estimation using the same command syntax as Stata's +d official regress and newey. New in this version: ivreg2 now +d supports factor variables. This is version 4.1.11 of ivreg2, +d updated from that published in Stata Journal, 5(4), requiring +d Stata 11.2 or better. Stata 8.2/9.2/10.2 users may use this +d routine, which will automatically call ivreg28, ivreg29, or +d ivreg210, respectively. These versions are now included in the +d ivreg2 package. Stata 7 users may use the Stata Journal version +d of ivreg2, accessible via net search ivreg2. +d +d KW: instrumental variables +d KW: Sargan test +d KW: robust estimation +d KW: orthogonality +d KW: GMM +d KW: Hansen's J +d KW: heteroskedastic OLS, +d +d Requires: Stata version 11.2 and ranktest from SSC +d +d Distribution-Date: 20240814 +d +d Author: Christopher F Baum, Boston College +d Support: email baum@@bc.edu +d +d Author: Mark E Schaffer, Heriot-Watt University +d Support: email m.e.schaffer@@hw.ac.uk +d +d Author: Steven Stillman, Free University of Bozen-Bolzano +d Support: email Steven.Stillman@@unibz.it +d +f i/ivreg2.ado +f i/ivreg2.sthlp +f i/ivreg2_p.ado +f l/livreg2.mlib +f i/ivreg210.ado +f i/ivreg210.sthlp +f i/ivreg210_p.ado +f i/ivreg29.ado +f i/ivreg29.hlp +f i/ivreg29_p.ado +f i/ivreg29_cue.ado +f i/ivreg28.ado +f i/ivreg28.hlp +f i/ivreg28_p.ado +f i/ivreg28_cue.ado +e +S http://fmwww.bc.edu/repec/bocode/r +N ranktest.pkg +D 25 Sep 2024 +U 9 +d 'RANKTEST': module to test the rank of a matrix +d +d ranktest implements various tests for the rank of a matrix. +d Tests of the rank of a matrix have many practical applications. +d For example, in econometrics the requirement for identification +d is the rank condition, which states that a particular matrix must +d be of full column rank. Another example from econometrics +d concerns cointegration in vector autoregressive (VAR) models; the +d Johansen trace test is a test of a rank of a particular matrix. +d The traditional test of the rank of a matrix for the standard +d (stationary) case is the Anderson (1951) canonical correlations +d test. If we denote one list of variables as Y and a second as Z, +d and we calculate the squared canonical correlations between Y and +d Z, the LM form of the Anderson test, where the null hypothesis is +d that the matrix of correlations or regression parameters B +d between Y and Z has rank(B)=r, is N times the sum of the r+1 +d largest squared canonical correlations. A large test statistic +d and rejection of the null indicates that the matrix has rank at +d least r+1. The Cragg-Donald (1993) statistic is a closely related +d Wald test for the rank of a matrix. The standard versions of +d these tests require the assumption that the covariance matrix has +d a Kronecker form; when this is not so, e.g., when disturbances +d are heteroskedastic or autocorrelated, the test statistics are no +d longer valid. ranktest implements various generalizations of +d these tests - Kleibergen-Paap, Cragg-Donald, and J-type 2-step +d GMM and CUE GMM tests - to the case of a non-Kronecker covariance +d matrix. The implementation in ranktest will calculate test +d statistics that are robust to various forms of +d heteroskedasticity, autocorrelation, and clustering. +d +d KW: matrix +d KW: rank +d KW: collinearity +d KW: cointegration +d +d Requires: Stata version 12 (version 9.2 for ranktest9, version 11 for ranktest11) +d +d Distribution-Date: 20200929 +d +d Author: Frank Kleibergen, Brown University +d Support: email Frank_Kleibergen@@brown.edu +d +d Author: Mark E Schaffer, Heriot-Watt University +d Support: email m.e.schaffer@@hw.ac.uk +d +d Author: Frank Windmeijer, University of Oxford +d Support: email frank.windmeijer@@stats.ox.ac.uk +d +f r/ranktest.ado +f r/ranktest9.ado +f r/ranktest11.ado +f r/ranktest.sthlp +f r/ranktest11.sthlp +f l/livreg2.mlib +e diff --git a/ado/c/cibar.ado b/ado/c/cibar.ado new file mode 100644 index 0000000..25afec4 --- /dev/null +++ b/ado/c/cibar.ado @@ -0,0 +1,497 @@ +* ========================================================== +* cibar: creating bargraphs with confidence-intervals +* Author: Alexander Staudt +* Version 1.1.8, 2020-12-29 +* ========================================================== +*! version 1.1.8, Alexander Staudt, 29dec2020 + +*program drop _all +program define cibar +version 13.0 +syntax anything(name=var) [if] [aw fw iw pw], [over(passthru) over1(string) over2(string) over3(string) /// + VCE(passthru) Level(cilevel) /// + NOISily /// + BAROPts(string asis) BARColor(string asis) BARGap(integer 0) Gap(integer 67) /// + CIopts(string asis) GRaphopts(string asis) /// + BARLabel(string) BLFmt(string) BLPosition(string) BLOrientation(string) BLSize(string) BLcolor(string) BLGap(real 0)] /// + + preserve + + mark touse `if' + quietly keep if touse == 1 + + * define grouping variables in one single call of "over()" via over(passthru). + * for compatibility reasons, also keep old syntax using over1() valid. + * over(passthru) however takes precedence over over1() etc. + + * test which over-option was specified + capture confirm existence `over' + scalar _rc_over = _rc + + capture confirm existence `over1' + scalar _rc_over1 = _rc + + * use over(passthru) if specified, otherwise over1(). + * if both are specified, display message that over(passthru) will be used + if _rc_over == 6 & _rc_over1 == 6 { + display as error "option {bf:over()} required" + exit 198 + } + else if _rc_over == 6 & _rc_over1 == 0 { + local bylist = "`over1' `over2' `over3'" + local overs = wordcount("`bylist'") + + local over_list = "over(`bylist')" + } + else if _rc_over == 0 & _rc_over1 == 6 { + local bylist = subinstr("`over'", "over(", "", .) + local bylist = subinstr("`bylist'", ")", "", .) + local overs = wordcount("`bylist'") + + local over_list = "`over'" + } + else { + display as result "Note: grouping variables specified via {bf:over()}, hence ignoring {bf:over1()} (and {bf:over2()}, {bf:over3()} if specified)." + + local bylist = subinstr("`over'", "over(", "", .) + local bylist = subinstr("`bylist'", ")", "", .) + local overs = wordcount("`bylist'") + + local over_list = "`over'" + } + + * make sure only up to three grouping variables are used for computations, + * discard any additionally specified grouping variables + if `overs' > 3 { + display as result "Note: cibar only supports up to three grouping variables. Any additional grouping variable will be ignored." + local bylist = word("`bylist'", 1) + " " + word("`bylist'", 2) + " " + word("`bylist'", 3) + local overs = wordcount("`bylist'") + local over_list = "over(`bylist')" + } + + * over1, over2, over3 still required for plotting. + local over1 = word("`bylist'", 1) + local over2 = word("`bylist'", 2) + local over3 = word("`bylist'", 3) + + local bg = `bargap'/100 + local gap = (`gap'/100) - 1 + + capture confirm existence `baropts' + if _rc == 6 local baropts = "fintensity(inten100)" + if _rc == 0 local baropts = "fintensity(inten100)" + " " + `"`baropts'"' + + capture confirm existence `ciopts' + if _rc == 6 local ciopts = "lcolor(gs8)" + if _rc == 0 local ciopts = "lcolor(gs8)" + " " + `"`ciopts'"' + + * set defaults for barlabels + if "`blfmt'" == "" { + local blfmt = "%9.2f" + } + + if "`blposition'" == "" { + local blposition = "n" + } + + if "`blorientation'" == "" { + local blorientation = "horizontal" + } + + if "`blsize'" == "" { + local blsize = "medsmall" + } + + if "`blcolor'" == "" { + local blcolor = "black" + } + + * add options into one local macro + local opts = `"placement("`blposition'")"' + `"orientation("`blorientation'")"' + " " + `"size("`blsize'")"' + " " + `"color("`blcolor'")"' + + * get mean and confidence intervals + *di `level' + // show numeric results + // add vce-option + capture confirm existence `noisily' + if _rc == 6 { + qui mean `var' [`weight'`exp'], `over_list' level(`level') `vce' + } + else { + mean `var' [`weight'`exp'], `over_list' level(`level') `vce' + } + + * save results in matrices + matrix define results = r(table) + matrix define mean = results[1, 1..colsof(results)]' + matrix define ll = results[5, 1..colsof(results)]' + matrix define ul = results[6, 1..colsof(results)]' + + * get mean and grouping variables + collapse (mean) mean = `var' [`weight'`exp'], by(`bylist') + + * make sure to have non-missing combinations before adding resaults from mean + foreach x in `bylist' { + qui drop if `x' == . + } + + * add mean, lower bound, upper bound to dataset + qui svmat mean + qui svmat ll + qui svmat ul + + * rename variable + qui rename ll1 lb + qui rename ul1 ub + + local mean = "mean of `var'" + + if `overs' == 2 { + capture confirm existence `over2' + if _rc == 6 { + local over2 = "`over3'" + display as txt "You specified over3() but not over2(). The value of over3() is used in over2() instead." + } + } + + forvalues x = 1/`overs' { + qui tab `over`x'' + local llevels`x' = `r(r)' + qui levelsof(`over`x''), local(levels`x') + *di "`levels`x''" + } + + forvalues x = 1/`overs' { + * Variablenkodierungen vereinheitlichen + qui gen over`x'_n = . + tokenize "`levels`x''" + forvalues y = 1/`llevels`x'' { + qui replace over`x'_n = `y' if `over`x'' == ``y'' + } + } + + forvalues x = 1/`overs' { + * over`x'_n-Variablen labeln + tokenize "`levels`x''" + forvalues y = 1/`llevels`x'' { + local ltext : label (`over`x'') ``y'' + label define vlabel`x' `y' "`ltext'", add + if `y' == `llevels`x'' label val over`x'_n vlabel`x' + } + } + + forvalues x = 1/`overs' { + qui levelsof(over`x'_n), local(levels`x'_n) + *di "`levels`x'_n'" + } + + * ====================================================== + * Bei einer over-Angabe + * ====================================================== + if `overs' == 1 { + qui keep if over1_n < . + + qui tab over1_n + qui gen g1 = over1_n + qui replace g1 = g1 * (1 + `bg') + + qui sum g1 + local smin = `r(min)' - .75 + local smax = `r(max)' + .75 + *di "smin = `smin' smax = `smax'" + + local xlabel1 = "xlabel(`smin'" + " " + `"" ""' + " " + "`smax'" + " " + `"" ""' + ", noticks)" + } + * ====================================================== + * Bei zwei over-Angaben + * ====================================================== + if `overs' == 2 { + qui keep if over1_n < . & over2_n < . + + * Hinzufügen fehlender Variablen: + *di `llevels1' + *di `llevels2' + forvalues x1 = 1/`llevels1' { + forvalues x2 = 1/`llevels2' { + qui tab mean if over1_n == `x1' & over2_n == `x2' + if `r(r)' == 0 { + local obsv = _N+1 + qui set obs `obsv' + qui replace over1_n = `x1' in `obsv' + qui replace over2_n = `x2' in `obsv' + } + } + } + sort over2_n over1_n + + * over1_bg Positionswerte der Balken anpassen (bzgl. bargap) + qui gen over1_bg = . + tokenize "`levels1_n'" + forvalues x = 1/`llevels1' { + qui replace over1_bg = over1_n + (``x'' - 1) * (`bg') if over1_n == ``x'' + } + + * g1: Werte der Balken (zur Anordnung im Graphen) + qui gen g1 = . + tokenize "`levels2_n'" + forvalues j = 1/`llevels2' { + qui replace g1 = over1_bg + (`llevels1' + 1 + `gap' + `bg') * (`j' - 1) if over2_n == ``j'' + } + + * Beschriftung der x-Achse + * 1. Beschriftungsposition sowie Abstand zwischen den Balkenblöcken bestimmen + forvalues x = 1/`llevels2' { + qui sum g1 if over2_n == `x' + local pos_`x' = `r(mean)' + local diff = `llevels2' + 1 + `gap' + `bg' + if `x' == `llevels2' { + local smin = 0 + local smax = `r(max)' + 1 + } + } + * xlabel-Option mit Beschriftung der Balkengruppen erstellen + tokenize "`levels2_n'" + forvalues j = 1/`llevels2' { + *di "j = `j'" + *di "token j = ``j''" + local g11_`j' = `pos_`j'' + + local l`j' : label (over2_n) `j' + + if `j' == 1 local xlabel1 = "xlabel(`smin'" + " " + `"" ""' + " " + "`g11_`j''" + " " + `""`l`j''""' + else if `j' < `llevels2' local xlabel1 = `"`xlabel1'"' + " " + "`g11_`j''" + " " + `""`l`j''""' + else local xlabel1 = `"`xlabel1'"' + " " + "`g11_`j''" + " " + `""`l`j''""' + " " + "`smax'" + " " + `"" ""' + " " + ", noticks)" + } + *di `"`xlabel1'"' + *macro dir + } + + * ====================================================== + * Bei 3 over-Angaben + * ====================================================== + if `overs' == 3 { + qui keep if over1_n < . & over2_n < . & over3_n < . + + * sortiere nach Gruppen + sort over3_n over2_n over1_n + + * Hinzufügen fehlender Variablen: + * Prüfe für jede mögliche Ausprägung (over1*over2*over3), ob diese vorhanden ist + * Falls Ausprägung nicht vorhanden: erstellen der Beobachtung mit "set obs" und "replace obs" etc. + * Zusätzlich Schleifen über over1, over2, over3 + * Anschließend neue Gruppe mit unterschiedlichen Ausprägungen erstellen + + forvalues x1 = 1/`llevels1' { + forvalues x2 = 1/`llevels2' { + forvalues x3 = 1/`llevels3' { + qui tab mean if over1_n == `x1' & over2_n == `x2' & over3_n == `x3' + if `r(r)' == 0 { + local obsv = _N+1 + qui set obs `obsv' + qui replace over1_n = `x1' in `obsv' + qui replace over2_n = `x2' in `obsv' + qui replace over3_n = `x3' in `obsv' + } + } + } + } + sort over3_n over2_n over1_n + + * erzeuge neue Gruppe, die die verschiedenen Ausprägungen zweier Gruppen enthält + qui egen g2 = group(over3_n over2_n) + qui tab g2 + local llg2 = `r(r)' // Anzahl Balkengruppen + qui levelsof(g2), local(lg2) + + sort g2 `over1' + + * neue Balkennummern + qui gen c = _n + qui gen over1_n2 = mod(c,`llevels1') + qui replace over1_n2 = `llevels1' if over1_n2 == 0 + + * over1_bg Positionswerte der Balken anpassen (bzgl. bargap) + qui gen over1_bg = . + tokenize "`levels1_n'" + forvalues x = 1/`llevels1' { + qui replace over1_bg = over1_n2 + (``x'' - 1) * (`bg') if over1_n2 == ``x'' + } + + * g1: Werte der Balken (zur Anordnung im Graphen) + qui gen g1 = . + *di "lg2 = `lg2'" + tokenize "`lg2'" + forvalues j = 1/`llg2' { + qui replace g1 = over1_bg + (`j' - 1) * (`llevels1' + 1 + `gap' + `bg') if g2 == ``j'' + + } + + forvalues x = 1/`llevels2' { + qui replace g1 = g1 + (-`gap' + 1) * (`x' - 1) if over3_n == `x' + } + + * Beschriftung der x-Achse + // 1. over2 + * over2: 1. Beschriftungsposition sowie Abstand zwischen den Balkenblöcken bestimmen + forvalues x = 1/`llg2' { + qui sum g1 if g2 == `x' + local diff = `llevels1' + 1 + `gap' + `bg' + local pos_`x' = `r(mean)' + if `x' == `llg2' { + local smin = 0 + local smax = `r(max)' + 1 + } + } + + * Balkengruppen (label) + * label ermitteln und für g2 erweitern + tokenize "`levels3_n'" + forvalues x1 = 1/`llevels3' { // Anzahl Hauptblöcke + tokenize "`levels2_n'" + forvalues x2 = 1/`llevels2' { // Anzahl Untergruppen pro Gruppe + + local l`x2' : label (over2_n) ``x2'' + + local y = `x2' + (`x1' - 1) * `llevels2' + local llx = "`y'" + " " + `""`l`x2''""' + + if `x1' == 1 & `x2' == 1 local vlab = `"`llx'"' + else local vlab = `"`vlab'"' + " " + `"`llx'"' + } + } + *di `"`vlab'"' + qui label define g2lab `vlab' + qui label val g2 g2lab + + * x-Werte ermitteln, für die labels auf der x-Achse erscheinen sollen. + * labels für over2-Gruppe + *di "`lg2'" + tokenize "`lg2'" + *di "lg2 = `lg2'" + forvalues x = 1/`llg2' { + local g11_`x' = `pos_`x'' + local l`x' : label (g2) ``x'' + *macro dir + if `x' == 1 local xlabel1 = "xlabel(`smin'" + " " + `"" ""' + " " + "`g11_`x''" + " " + `""`l`x''""' + else if `x' < `llg2' local xlabel1 = `"`xlabel1'"' + " " + "`g11_`x''" + " " + `""`l`x''""' + else local xlabel1 = `"`xlabel1'"' + " " + "`g11_`x''" + " " + `""`l`x''""' + " " + "`smax'" + " " + `"" ""' + " " + } + + // 2. over3 + * labels für over3-Gruppe + forvalues x1 = 1/`llevels3' { + qui tab g1 if over3_n == `x1' + local llg1 = `r(r)' + forvalues x2 = 1/`llg2' { // erstelle label-Position (x-Achse) für bestimmte over3-Ausprägung + qui sum g1 if over3_n == `x1' + } + local g12_`x1' = `r(mean)' + *di `g12_`x1'' + local l2`x1' : label (over3_n) `x1' + *di `"`l2`x1''"' + if `x1' == 1 local l_3 = "`g12_`x1''" + " " + `"`"" " " " "`l2`x1''""'"' + else local l_3 = `"`l_3'"' + " " + "`g12_`x1''" + " " + `"`"" " " " "`l2`x1''""'"' + *di `"`l_3'"' + if `x1' == `llevels3' { + local xlabel1 = `"`xlabel1'"' + " " + `"`l_3'"' + ", noticks)" + *di `"`xlabel1'"' + } + + } + } + + * ====================================================== + * Säulen erstellen + * ====================================================== + tokenize "`levels1_n'" + *di "`levels1'" + *di "`llevels1'" + qui gen rcap = "rcap lb ub g1, `ciopts'" + forvalues j = 1/`llevels1' { + qui gen bar`j' = "bar mean g1 if over1_n==`j', `baropts'" + } + * add bar colors + qui des bar*, varlist + local nbars = wordcount("`r(varlist)'") + local ncolors = wordcount("`barcolor'") + + * check if number of defined colors is larger than number of defined bars (per group) + if `ncolors' > `nbars' { + local ncolors = `nbars' + } + * add colors to bars + if `ncolors' > 0 { + qui gen bcolors = "`barcolor'" + qui split bcolors, gen(bcol) + + forvalues j = 1/`ncolors' { + qui replace bar`j' = bar`j' + "color(" + bcol`j' + ")" + } + } + + * concatenate string + qui egen bars1 = concat(bar* rcap), punct(") (") + qui replace bars1 = "(" + bars1 + ")" + local bars1 = bars1[1] + + * ====================================================== + * Bar labels hinzufügen + * ====================================================== + * prepare bar labels + qui gen bl_mean = mean + qui replace bl_mean = 0 if mean == . + + * define bar labels + qui gen mlab = "" + local n = _N + forvalues x = 1/`n' { + if bl_mean[`x'] == 0 { + local mean_mlab = "0" + local s_mean_mlab = "" + } + else { + local mean_mlab = strofreal(bl_mean[`x'] + `blgap') + local s_mean_mlab = strofreal(bl_mean[`x'], `"`blfmt'"') + } + qui replace mlab in `x' = "text(" + `"`mean_mlab'"' + " " + strofreal(g1) + " " + `"""' + `"`s_mean_mlab'"' + `"""' + ", " + `"`opts'"' + ") " + } + + * add bar labels if barlabel(on) is specified by the user + if "`barlabel'" == "on" { + local n = _N + local bltext = mlab[1] + forvalues x = 2/`n' { + local bltext = `"`bltext'"' + mlab[`x'] + } + } + + * ====================================================== + * Legendeneinträge + * ====================================================== + *local vlabel1 : value label `over1' + tokenize "`levels1_n'" + forvalues j = 1/`llevels1' { + + local l`j' : label (over1_n) `j' + + if `j' == 1 { + local legend1 = `"`j' "`l`j''""' + } + else { + local legend1 = `"`legend1'"' + " " + `"`j' "`l`j''""' + } + } + *di `"legend1 = `legend1'"' + local legende = `"legend(order(`legend1'))"' + + capture confirm existence `graphopts' + if _rc == 6 local graphopts = `"`legende' xtitle("") ytitle("`mean'") plotregion(margin(bargraph)) ylabel(, format(%9.3g))"' + if _rc == 0 local graphopts = `"`legende' xtitle("") ytitle("`mean'") plotregion(margin(bargraph)) ylabel(, format(%9.3g))"' + " " + `"`graphopts'"' + + * ====================================================== + * draw graph + * ====================================================== + *twoway (bar mean group) (rcap ub lb group), `xlabel1' `graphopts' + *di `"`bars1'"' + twoway `bars1', `xlabel1' `graphopts' `bltext' + end diff --git a/ado/c/cibar.sthlp b/ado/c/cibar.sthlp new file mode 100644 index 0000000..17e5493 --- /dev/null +++ b/ado/c/cibar.sthlp @@ -0,0 +1,123 @@ +{smcl} +{* *! version 1.1.8, Alexander Staudt, 29dec2020}{...} +{* findalias asfradohelp}{...} +{* vieweralsosee "" "--"}{...} +{* vieweralsosee "[R] help" "help help"}{...} +{viewerjumpto "Syntax" "cibar##syntax"}{...} +{viewerjumpto "Description" "cibar##description"}{...} +{* viewerjumpto "Options" "cibar##options"}{...} +{viewerjumpto "Examples" "cibar##examples"}{...} +{viewerjumpto "Remarks" "cibar##remarks"}{...} +{viewerjumpto "Author" "cibar##author"}{...} +{title:Title} + +{phang} +{bf:cibar} {hline 2} Plot bar graphs with confidence intervals. + + +{marker syntax}{...} +{title:Syntax} +{p 8 17 2} +{cmdab:cibar:} +{it:varname} [{it:{help if}}] [{it:{help weight}}], {cmd: over(}{it:varlist}{cmd:)} [{it:options}] + +{p2colreset}{...} +{p 4 6 2} + +{synoptset 20 tabbed}{...} +{synopthdr} +{synoptline} +{syntab:Main} +{synopt:{opt l:evel(#)}}set confidence level; default is 95.{p_end} +{synopt:{opt vce(:}{help vcetype}{opt ):}}{it:vcetype} may be {cmd: analytic} (the default), {cmd: cluster} {it:clustvar}, {cmd: bootstrap}, or {cmd: jackknife}.{p_end} +{synopt:{opt over1(:}{it:varname}{opt ):}}first over-variable (for compatibility with previous versions. See {help cibar##note:note}).{p_end} +{synopt:{opt over2(:}{it:varname}{opt ):}}additional over-variable.{p_end} +{synopt:{opt over3(:}{it:varname}{opt ):}}additional over-variable. over3() can't be used without specifying over2().{p_end} + +{syntab:Advanced} +{synopt:{opt barg:ap(#)}}specify gap within bargroups; default is 0.{p_end} +{synopt:{opt g:ap(#)}}specify gap between bargroups; default is 67 (i.e. 2/3 of a bar).{p_end} +{synopt:{opt barop:ts(...)}}specify the look of the bars. For more information, see {help barlook_options}.{p_end} +{synopt:{opt barc:olor(...)}}specify the color of the bars (see {help colorstyle}; RGB/CMYK/HSV values are not allowed).{p_end} +{synopt:{opt ci:opts(...)}}specify the look of the range plot (see {help twoway rcap}).{p_end} +{synopt:{opt gr:aphopts(...)}}specify additional graph options (see {help twoway_options}).{p_end} +{synopt:{opt barl:abel(...)}}specify if value of the means should be displayed; default is {it:off}.{p_end} +{synopt:{opt blf:mt(...)}}specify label display {help format}; default is %9.2f.{p_end} +{synopt:{opt blp:osition(...)}}specify label position (see {help compassdirstyle}); default is {it:n}.{p_end} +{synopt:{opt blo:rientation(...)}}specify whether label text should be horizontal or vertical (see {help orientationstyle}); default is horizontal.{p_end} +{synopt:{opt bls:ize(...)}}specify label text size (see {help textsizestyle}); default is {it:medsmall}.{p_end} +{synopt:{opt blc:olor(...)}}specify label text color (see {help colorstyle}); default is black.{p_end} +{synopt:{opt blg:ap(...)}}specify distance of barlabels from bars; default is 0.0.{p_end} +{synoptline} +{p2colreset}{...} +{p 4 6 2} +{cmd:by} is not allowed; see {help by}.{p_end} +{p 4 6 2} +{cmd: aweights, fweights, iweights,} and {cmd: pweights} are allowed; see {help weight}. + + +{marker description}{...} +{title:Description} + +{pstd} +{cmd:cibar} creates a bar plot displaying the mean of a variable and its confidence intervals, grouped over different variables. + + +{marker examples}{...} +{title:Examples} + +{phang}{cmd:. sysuse auto}{p_end} +{phang}{cmd:. cibar price, over(foreign)}{p_end} +{phang}{cmd:. cibar price, over(foreign turn)}{p_end} +{phang}{cmd:. cibar price, over(foreign turn) level(90)}{p_end} +{phang}{cmd:. cibar price, over(foreign turn) ciopts(lcolor(red)) graphopts(title("Price over 'foreign' over 'turn'") name(graph_1, replace)) }{p_end} + +{phang}Using the old syntax{p_end} +{phang}{cmd:. cibar price, over1(foreign) over2(turn) ciopts(lcolor(red)) graphopts(title("Price over 'foreign' over 'turn'") name(graph_2, replace)) }{p_end} + + +{phang}Using weights{p_end} +{phang}{cmd:. webuse total}{p_end} +{phang}{cmd:. cibar heartatk, over(sex race)}{p_end} +{phang}{cmd:. cibar heartatk, over(sex race) barcol(gs0 gs10) graphopts(ylabel(, nogrid) graphregion(color(white)))}{p_end} +{phang}{cmd:. cibar heartatk [pweight=swgt], over(sex race) graphopts(name(graph_1, replace))}{p_end} +{phang}{cmd:. cibar heartatk [pweight=swgt], over(sex race) graphopts(name(graph_2, replace)) barlabel(on) blf(%9.3f)}{p_end} + +{phang}Using the old syntax{p_end} +{phang}{cmd:. cibar heartatk [pweight=swgt], over1(sex) over2(race) graphopts(name(graph_2, replace)) barlabel(on) blf(%9.3f)}{p_end} + + +{marker note}{...} +{title:Note} + +{pstd} +{cmd:over(}{it:varlist}{cmd:)} is the preferred way to specify over-variables as of version 1.1.6. For now, {cmd:over1(}{it:varname}{cmd:)}, {cmd:over2(}{it:varname}{cmd:)}, {cmd:over3(}{it:varname}{cmd:)} remain valid alternatives. +{cmd:over(}{it:varlist}{cmd:)} takes precedence over {cmd: over1(}{it:varname}{cmd:)} when mixing old and new syntax. + +{marker remarks}{...} +{title:Remarks} + +{pstd} +{cmd: cibar} uses -graph twoway- to draw bar graphs with confidence intervals. + +{pstd} +{cmd: cibar} is designed to draw vertical bars and confidence intervals. Theoretically, {it:horizontal} bars can be specified using baropts(), +but this specification will lead to less useful graphs, as confidence intervals will still be displayed vertically. Furthermore, there will be issues concerning the x and y-axis. + +{pstd} +The option {cmd: barcolor} sets the colors for the categories of the first over-variable (see {help cibar##examples:examples}). + +{pstd} +The option {cmd: blgap} sets the distance of the barlabels from its default position. The horizontal position of the barlabels is determined by the corresponding group means and the options passed to {cmd: blposition} and {cmd: blorientation}. +To draw the bar height (group means), {cmd: cibar} uses Stata's {help added_text_options}. Hence, additional space of the barlabels from the bar needs to be defined on the same scale as the y-axis (real values). + +{pstd} For the computation of confidence intervals using weights, {cmd: cibar} uses {help mean}. + +{pstd} +The code for this .ado is inspired by a how-to of the {it:Institute for Digital Research and Education} (IDRE), that can be found at {browse "https://stats.idre.ucla.edu/stata/faq/how-can-i-make-a-bar-graph-with-error-bars/"}. + + +{marker author}{...} +{title:Author} + +{phang}Alexander Staudt, staudtlex@live.de{p_end} diff --git a/ado/c/cmogram.ado b/ado/c/cmogram.ado new file mode 100644 index 0000000..defee20 --- /dev/null +++ b/ado/c/cmogram.ado @@ -0,0 +1,523 @@ +/* + cmogram y x [ , options ] + + Draw histogram-style conditional mean or median graph. + + by Christopher Robert, Harvard Kennedy School, chris_robert@hksphd.harvard.edu + + v1.11, September 6, 2011 +*/ + +program define cmogram, rclass + syntax varlist(min=2 max=2) [if] [, Histopts(string) CONtrols(string) CONTROLvars(string) CUTpoint(string) CUTRight CI(string) MEDian LEGend COUNT FRACtion NOTEn NOTEPFX(string) NOTESFX(string) NONotes Lineat(string) TITle(string) Graphopts(string) SAVing(string) GENerate(string) BY(string) BYValues(string) BYTitle(string) SCatter LFit LFITCi QFit QFITCi LOWess LFITOpts(string) CIOpts(string) RCAPOpts(string) LOWOpts(string) GRAPHOPTS1(string) GRAPHOPTS2(string) GRAPHOPTS3(string) GRAPHOPTS4(string) LFITOPTS1(string) LFITOPTS2(string) LFITOPTS3(string) LFITOPTS4(string) RCAPOPTS1(string) RCAPOPTS2(string) RCAPOPTS3(string) RCAPOPTS4(string) LOWOPTS1(string) LOWOPTS2(string) LOWOPTS3(string) LOWOPTS4(string) TITLE1(string) TITLE2(string) TITLE3(string) TITLE4(string)] + version 9.2 + marksample marked, strok + quietly { + * initialize variables + tokenize `varlist' + local yvar "`1'" + local xvar "`2'" + local xvarLabel : variable label `xvar' + if "`xvarLabel'"=="" { + local xvarLabel="`xvar'" + } + local yvarLabel : variable label `yvar' + if "`yvarLabel'"=="" { + local yvarLabel="`yvar'" + } + if "`controls'"~="" { + local controlvars="`controls'" + local controldesc=", controlling for '`controls''" + } + else { + local controldesc="" + } + if "`median'"~="" { + local oper="median" + } + else if "`fraction'"~="" { + local oper="fraction" + } + else if "`count'"~="" { + local oper="count" + } + else if "`ci'"~="" { + local oper="confidence intervals" + } + else { + local oper="mean" + } + if "`by'"~="" { + local bydesc=", by '`by''" + } + else { + local bydesc="" + } + if "`legend'"~="" { + local legendoff="" + } + else { + local legendoff="legend(off)" + } + + * show overall output header + count if `marked' + local totcount0=r(N) + noisily disp "" + noisily disp "Plotting `oper' of `yvar', conditional on `xvar'`bydesc'`controldesc'." + noisily disp "" + noisily disp "n = `totcount0'" + noisily disp "" + + * run regression if controlling; set y axis label + if "`controlvars'"~="" { + reg `yvar' `controlvars' if `marked' + tempvar _resid + predict `_resid', resid + local yvar="`_resid'" + + if "`median'"~="" { + local ylabel="Median residual of `yvarLabel'" + } + else if "`count'"~="" { + local ylabel="Frequency" + } + else if "`fraction'"~="" { + local ylabel="Proportion" + } + else { + local ylabel="Mean residual of `yvarLabel'" + } + } + else { + if "`median'"~="" { + local ylabel="Median of `yvarLabel'" + } + else if "`count'"~="" { + local ylabel="Frequency" + } + else if "`fraction'"~="" { + local ylabel="Proportion" + } + else { + local ylabel="Mean of `yvarLabel'" + } + } + + * loop through and set up bins, potentially by sub-group + if "`by'"~="" { + if "`byvalues'"~="" { + local byvals="`byvalues'" + } + else { + levelsof `by', local(byvals) + } + } + else { + local byvals="1" + } + local miny=999999 + local maxy=-999999 + local num0=0 + local num1=1 + foreach byval of local byvals { + if "`by'"~="" { + local byif=" & `by'==`byval'" + cap: count if `marked' `byif' + if _rc~=0 { + local byif=`" & `by'=="`byval'""' + local bystg="1" + count if `marked' `byif' + } + local totcount`num0'=r(N) + if `num0'>0 { + noisily disp "" + } + noisily disp "`by'==`byval' (n = `totcount`num0'')" + noisily disp "" + } + else { + local byif="" + } + * define bins and specify their heights + forvalues right=`num0'/`num1' { + tempvar _bn`right' + gen `_bn`right''=. + if `right'==`num0' | "`cutpoint'"~="" { + tempvar _y`right' _x`right' _yh`right' _yl`right' + gen `_yh`right''=. + gen `_yl`right''=. + if "`cutpoint'"~="" { + count if `marked' & `xvar'==`cutpoint' `byif' + local atcut=r(N) + if `right'==`num0' { + twoway__histogram_gen `xvar' if `marked' & `xvar'<=`cutpoint' `byif', freq `histopts' gen(`_y`right'' `_x`right'') display + } + else { + twoway__histogram_gen `xvar' if `marked' & `xvar'>=`cutpoint' `byif', freq start(`cutpoint') `histopts' gen(`_y`right'' `_x`right'') display + * note that the left and right both include the cut-point; the bar heights will be adjusted below + } + } + else { + local atcut=0 + twoway__histogram_gen `xvar' if `marked' `byif', freq `histopts' gen(`_y`right'' `_x`right'') display + } + local nbins=r(bin) + local binstart=r(start) + local binwidth`right'=r(width) + local binleft=`binstart' + local lastmax=r(max) + + * check for and manage missing (empty) bins + replace `_x`right''=. if `_y`right''==. + count if `_x`right''<. + if r(N) < `nbins' { + * fill in missing bins + sort `_x`right'' + local binmid=(`binstart'+`binwidth`right''/2) + forvalues bn=1/`nbins' { + count if `_x`right''>(`binmid'-`binwidth`right''/2) & `_x`right''<(`binmid'+`binwidth`right''/2) + if r(N) < 1 { + replace `_x`right''=`binmid' if _n==(`nbins'+`bn') + replace `_y`right''=0 if _n==(`nbins'+`bn') + } + local binmid=(`binmid'+`binwidth`right'') + } + } + + sort `_x`right'' + replace `_bn`right''=_n + forvalues bn=1/`nbins' { + local binright=`binleft'+`binwidth`right'' + * round up for last bin, to be sure to catch boundary points + if `bn'==`nbins' { + local binright=`lastmax' + } + if "`ci'"~="" { + local sumcmd="ci" + local sumopt="level(`ci') `ciopts'" + } + else { + local sumcmd="sum" + local sumopt="d" + } + if "`cutright'"=="" { + if (`right'==`num0' & `bn'==1) | (`right'==`num1' & `bn'==1 & `atcut'==0) { + `sumcmd' `yvar' if `xvar'>=`binleft' & `xvar'<=`binright' & `marked' `byif', `sumopt' + local rangedesc="[`binleft',`binright']" + } + else { + `sumcmd' `yvar' if `xvar'>`binleft' & `xvar'<=`binright' & `marked' `byif', `sumopt' + local rangedesc="(`binleft',`binright']" + } + } + else { + if (`right'==`num1' & `bn'==`nbins') | ("`cutright'"=="" & `right'==`num0' & `bn'==`nbins') { + `sumcmd' `yvar' if `xvar'>=`binleft' & `xvar'<=`binright' & `marked' `byif', `sumopt' + local rangedesc="[`binleft',`binright']" + } + else { + `sumcmd' `yvar' if `xvar'>=`binleft' & `xvar'<`binright' & `marked' `byif', `sumopt' + local rangedesc="[`binleft',`binright')" + } + } + local rangen=r(N) + if "`median'"~="" { + local rangeydesc="median" + local rangey=r(p50) + } + else if "`count'"~="" { + local rangeydesc="count" + local rangey=r(N) + } + else if "`fraction'"~="" { + local rangeydesc="fraction" + local rangey=r(N)/`totcount`num0'' + } + else { + local rangeydesc="mean" + local rangey=r(mean) + } + if "`ci'"~="" { + local cih=r(ub) + local cil=r(lb) + replace `_y`right''=`rangey' if `_bn`right''==`bn' + replace `_yh`right''=`cih' if `_bn`right''==`bn' + replace `_yl`right''=`cil' if `_bn`right''==`bn' + if `cil'<`miny' { + local miny=`cil' + } + if `cih'>`maxy' & `cih'<. { + local maxy=`cih' + } + noisily disp "Bin #`bn': `rangedesc' (n = `rangen') (`rangeydesc' = `rangey'; CI = (`cil',`cih'))" + } + else { + replace `_y`right''=`rangey' if `_bn`right''==`bn' + if `rangey'<`miny' { + local miny=`rangey' + } + if `rangey'>`maxy' & `rangey'<. { + local maxy=`rangey' + } + noisily disp "Bin #`bn': `rangedesc' (n = `rangen') (`rangeydesc' = `rangey')" + } + + local binleft=`binright' + } + } + } + + local num0=`num0'+2 + local num1=`num1'+2 + } + + * output graph(s) and save results + return clear + local graphnames="" + local num0=0 + local num1=1 + local graphno1=1 + local graphno2=2 + local titleno=1 + foreach byval of local byvals { + if "`by'"~="" { + if "`bystg'"=="1" { + local byif=`" & `by'=="`byval'""' + } + else { + local byif=" & `by'==`byval'" + } + } + else { + local byif="" + } + * assemble code to draw (and possibly save) graph + local graphname="_graph`num0'" + local nameopts="name(`graphname')" + cap: graph drop `graphname' + if "`lineat'"=="" { + local lineopts "" + } + else { + local lineopts "xline(`lineat', lpattern(dash))" + } + * define a y axis, making it common across sub-groups + if "`by'"~="" | ("`count'"=="" & "`fraction'"=="") { + local diff=(`maxy'-`miny') + if `diff'<0.0005 { + local roundingto=0.00001 + local decimals=5 + } + else if `diff'<0.005 { + local roundingto=0.0001 + local decimals=4 + } + else if `diff'<0.05 { + local roundingto=0.001 + local decimals=3 + } + else if `diff'<0.5 { + local roundingto=0.01 + local decimals=2 + } + else if `diff'<5 { + local roundingto=0.1 + local decimals=1 + } + else { + local roundingto=1 + local decimals=0 + } + if "`count'"~="" | "`fraction'"~="" { + local floor=0 + } + else { + local floor=round(`miny'-(`maxy'-`miny')/16,`roundingto') + if `floor'<0 & `miny'>=0 { + local floor=0 + } + } + local ceil=round(`maxy',`roundingto') + local ystep=(`ceil'-`floor')/4 + local ceil=round(`maxy',`roundingto') + local bottom=min(`miny',`floor') + local top=max(`maxy',`ceil') + if "`scatter'"~="" { + local yrangeopts "ylabel(`floor'(`ystep')`ceil', format(%9.`decimals'f)) yscale(range(`bottom' `top'))" + } + else { + local yrangeopts "base(`bottom') ylabel(`floor'(`ystep')`ceil', format(%9.`decimals'f)) yscale(range(`bottom' `top'))" + } + } + else { + local yrangeopts "yscale(range(0 .)) ylabel(#7)" + } + if "`by'"~="" & "`nonotes'"=="" { + if "`noten'"~="" { + local noteopt=`"note("`notepfx'`by'=`byval', n=`totcount`num0''`notesfx'")"' + } + else { + local noteopt=`"note(`notepfx'"`by'=`byval'`notesfx'")"' + } + } + else if "`noten'"~="" & "`nonotes'"=="" { + local noteopt=`"note("`notepfx'n=`totcount`num0''`notesfx'")"' + } + else { + local noteopt="" + } + + if "`scatter'"~="" { + local gtype="scatter" + local barwid0="" + local barwid1="" + } + else { + local gtype="bar" + local barwid0="barwidth(`binwidth`num0'')" + local barwid1="barwidth(`binwidth`num1'')" + } + + * potentially add line(s) of best fit + if "`lfit'"~="" | "`lfitci'"~="" | "`qfit'"~="" | "`qfitci'"~="" { + local lfplot="" + if "`qfitci'"~="" { + local lfcmd="qfitci" + if strpos("`lfitopts'","cip") == 0 { + local lfplot="ciplot(rline)" + } + } + else if "`qfit'"~=""{ + local lfcmd="qfit" + } + else if "`lfitci'"~="" { + local lfcmd="lfitci" + if strpos("`lfitopts'","cip") == 0 { + local lfplot="ciplot(rline)" + } + } + else { + local lfcmd="lfit" + } + if "`cutpoint'"~="" { + if "`cutright'"~="" { + local lfopt1=`"|| `lfcmd' `yvar' `xvar' if `marked' & `xvar'<`cutpoint' `byif', `legendoff' range(. `cutpoint') `lfplot' `lfitopts' `lfitopts`graphno1''"' + local lfopt2=`"|| `lfcmd' `yvar' `xvar' if `marked' & `xvar'>=`cutpoint' `byif', `legendoff' range(`cutpoint' .) `lfplot' `lfitopts' `lfitopts`graphno2''"' + } + else { + local lfopt1=`"|| `lfcmd' `yvar' `xvar' if `marked' & `xvar'<=`cutpoint' `byif', `legendoff' range(. `cutpoint') `lfplot' `lfitopts' `lfitopts`graphno1''"' + local lfopt2=`"|| `lfcmd' `yvar' `xvar' if `marked' & `xvar'>`cutpoint' `byif', `legendoff' range(`cutpoint' .) `lfplot' `lfitopts' `lfitopts`graphno2''"' + } + } + else { + local lfopt1=`"|| `lfcmd' `yvar' `xvar' if `marked' `byif', `legendoff' `lfplot' `lfitopts' `lfitopts`graphno1''"' + local lfopt2="" + } + } + else { + local lfopt1="" + local lfopt2="" + } + + * potentially add lowess plot + if "`lowess'"~="" { + if "`cutpoint'"~="" { + if "`cutright'"~="" { + local lowopt1=`"|| lowess `yvar' `xvar' if `marked' & `xvar'<`cutpoint' `byif', `legendoff' `lowopts' `lowopts`graphno1''"' + local lowopt2=`"|| lowess `yvar' `xvar' if `marked' & `xvar'>=`cutpoint' `byif', `legendoff' `lowopts' `lowopts`graphno2''"' + } + else { + local lowopt1=`"|| lowess `yvar' `xvar' if `marked' & `xvar'<=`cutpoint' `byif', `legendoff' `lowopts' `lowopts`graphno1''"' + local lowopt2=`"|| lowess `yvar' `xvar' if `marked' & `xvar'>`cutpoint' `byif', `legendoff' `lowopts' `lowopts`graphno2''"' + } + } + else { + local lowopt1=`"|| lowess `yvar' `xvar' if `marked' `byif', `legendoff' `lowopts' `lowopts`graphno1''"' + local lowopt2="" + } + } + else { + local lowopt1="" + local lowopt2="" + } + + * potentially add confidence intervals + if "`ci'"~="" { + if "`cutpoint'"~="" { + local ciopt1="|| rcap `_yl`num0'' `_yh`num0'' `_x`num0'', `legendoff' `rcapopts' `rcapopts`graphno1''" + local ciopt2="|| rcap `_yl`num1'' `_yh`num1'' `_x`num1'', `legendoff' `rcapopts' `rcapopts`graphno2''" + } + else { + local ciopt1="|| rcap `_yl`num0'' `_yh`num0'' `_x`num0'', `legendoff' `rcapopts' `rcapopts`graphno1''" + local ciopt2="" + } + } + else { + local ciopt1="" + local ciopt2="" + } + + * potentially adjust title + if "`title`titleno''"~="" { + local titleval="`title`titleno''" + } + else { + local titleval="`title'" + } + + * actually draw a graph + if "`cutpoint'"~="" { + twoway `gtype' `_y`num0'' `_x`num0'', `barwid0' `yrangeopts' `graphopts' `graphopts`graphno1'' || `gtype' `_y`num1'' `_x`num1'', `barwid1' title("`titleval'") ytitle("`ylabel'") graphregion(fcolor(white)) `legendoff' `noteopt' `nameopts' `lineopts' `yrangeopts' `graphopts' `graphopts`graphno2'' `lfopt1' `lfopt2' `ciopt1' `ciopt2' `lowopt1' `lowopt2' + if "`generate'"~="" { + cap: gen `generate'x`num0'=. + cap: gen `generate'y`num0'=. + cap: gen `generate'x`num1'=. + cap: gen `generate'y`num1'=. + replace `generate'x`num0'=`_x`num0'' + replace `generate'y`num0'=`_y`num0'' + replace `generate'x`num1'=`_x`num1'' + replace `generate'y`num1'=`_y`num1'' + } + return scalar bw`num0'=`binwidth`num0'' + return scalar bw`num1'=`binwidth`num1'' + local graphno1=`graphno1'+2 + local graphno2=`graphno2'+2 + } + else { + twoway `gtype' `_y`num0'' `_x`num0'', `barwid0' title("`titleval'") ytitle("`ylabel'") graphregion(fcolor(white)) `noteopt' `nameopts' `lineopts' `yrangeopts' `graphopts' `graphopts`graphno1'' `lfopt1' `lfopt2' `ciopt1' `ciopt2' `lowopt1' `lowopt2' + if "`generate'"~="" { + cap: gen `generate'x`num0'=. + cap: gen `generate'y`num0'=. + replace `generate'x`num0'=`_x`num0'' + replace `generate'y`num0'=`_y`num0'' + } + return scalar bw`num0'=`binwidth`num0'' + local graphno1=`graphno1'+1 + local graphno2=`graphno2'+1 + } + + * optionally save a graph + local graphnames="`graphnames' `graphname'" + if "`saving'"~="" & "`by'"=="" { + graph export "`saving'", name(`graphname') replace + graph drop `graphname' + } + + local num0=`num0'+2 + local num1=`num1'+2 + local titleno=`titleno'+1 + } + + * if using by option, combine graphs together and possibly save + if "`by'"~="" { + cap: graph drop combined + graph combine `graphnames', name(combined) title("`bytitle'") + graph drop `graphnames' + if "`saving'"~="" { + graph export "`saving'", name(combined) replace + graph drop combined + } + } + } +end diff --git a/ado/c/cmogram.hlp b/ado/c/cmogram.hlp new file mode 100644 index 0000000..f5d90b3 --- /dev/null +++ b/ado/c/cmogram.hlp @@ -0,0 +1,236 @@ +{smcl} +{* *! version 1.1.1 06sep2011}{...} +{cmd:help cmogram} +{hline} + +{title:Title} + + {p 4 4 2}{hi:cmogram} {hline 2} Draw histogram-style conditional mean or median graph + +{title:Syntax} + +{p 8 17 2} +{cmd:cmogram} {it:{help varname:yvar}} {it:{help varname:xvar}} +[{it:{help if:if}}] +[{cmd:,} {it:{help cmogram##options:options}} ] + +{synoptset 20 tabbed}{...} +{synopthdr} +{synoptline} +{syntab:Main} +{synopt:{opt tit:le(...)}}title of graph{p_end} +{synopt:{opth con:trols(varlist)}}control variables for graphing residuals{p_end} +{synopt:{opt cut:point(#)}}point along {it:x} axis to split the graph{p_end} +{synopt:{opt cutr:ight}}include border observations on the right side{p_end} +{synopt:{opt ci(#)}}plot means with confidence intervals of level {it:#}{p_end} +{synopt:{opt med:ian}}plot medians rather than means{p_end} +{synopt:{opt count}}plot counts (frequencies) rather than means{p_end} +{synopt:{opt frac:tion}}plot fractions (proportions) rather than means{p_end} +{synopt:{opt l:ineat(#)}}draw one or more vertical lines at points along {it:x} axis{p_end} +{synopt:{opt sc:atter}}format as scatterplot rather than bar graph{p_end} +{synopt:{opt leg:end}}allow legend to display{p_end} +{synopt:{opt lf:it}}include line of best fit{p_end} +{synopt:{opt lfitci}}include line of best fit, with confidence interval{p_end} +{synopt:{opt qf:it}}include quadratic of best fit{p_end} +{synopt:{opt qfitci}}include quadratic of best fit, with confidence interval{p_end} +{synopt:{opt low:ess}}include local linear smooth plot{p_end} +{synopt:{opth by(varname)}}graph subgroups according to {it:varname}{p_end} +{synopt:{opt byt:itle(...)}}overall title for {it:by()} graphs{p_end} +{synopt:{opt byv:alues(...)}}optional ordered list of categories for {it:by()} graphs{p_end} +{synopt:{opt note:n}}note # observations at bottom of graph{p_end} +{synopt:{opt notepfx(...)}}prefix for note at bottom of graph{p_end} +{synopt:{opt notesfx(...)}}suffix for note at bottom of graph{p_end} +{synopt:{opt non:otes}}suppress all notes at bottom of graph{p_end} +{synopt:{opt h:istopts(options)}}control bin definition with {help histogram##continuous_opts:histogram options}{p_end} +{synopt:{opt g:raphopts(options)}}control graph output with {help twoway_options:graph options}{p_end} +{synopt:{opt lfito:pts(options)}}control line or quadratic of best fit options{p_end} +{synopt:{opt lowo:pts(options)}}control lowess plot options{p_end} +{synopt:{opt cio:pts(options)}}control {it:ci} confidence intervals with {help ci:ci options}{p_end} +{synopt:{opt rcapo:pts(options)}}control {it:ci} output with {help twoway_rcap:rcap options}{p_end} +{synopt:{opt sav:ing(filename)}}save graph to file{p_end} +{synopt:{opt gen:erate(prefix)}}save graph values in variables with given prefix; programmer's option{p_end} +{synoptline} +{p2colreset}{...} + +{title:Description} + +{pstd} +{cmd:cmogram} graphs the means, medians, frequencies, or proportions of +{it:yvar}, conditional on {it:xvar}. By default, bins are defined along the {it:x} axis +as they are by {help histogram:histogram}. Alternatively, +{help histogram##continuous_opts:histogram options} can be used to override the default +bin definitions, as in {opt histopts(bin(10))}. The exact bin definitions are always output +along with the graph(s). + +{pstd} +While the default output style is similar to a histogram, the {opt scatter} option allows for +scatterplot-style output. For regression +discontinuity and similar applications, {opt cutpoint(#)} can be used to split graphs at a +particular {it:x} value. To plot conditional means or medians of residuals, {opt controls(...)} +can be used; the plotted residuals will be after a regression of the form {it:regress yvar controls}. + +{pstd} +{opt by} allows subgroups to be plotted separately. + +{marker options} +{title:Options} + +{dlgtab:Main} + +{phang} +{opt title(...)} adds a title to the top of the graph. +Specify the graph number as the {it:#} in {opt title#(...)} to specify a title for only +one of several graphs output (e.g., using {opt by}). + +{phang} +{opth controls(varlist)} considers residuals of {it:yvar} rather than the values of {it:yvar} directly. +A regression of the form {it:regress yvar controls} is executed, then means or medians of the residuals are plotted accordingly. + +{phang} +{opt cutpoint(#)} splits the graph at the specified point along the {it:x} axis. Bins are defined along the {it:x} axis to the right and left of this cutoff, with no bin spanning the cutoff. + +{phang} +{opt cutright} includes border observations on the right side of a split graph. By default, border observations are included on the left. + +{phang} +{opt ci(#)} plots means of {it:yvar} with confidence intervals of level {it:#}. + +{phang} +{opt median} plots medians of {it:yvar} rather than means. + +{phang} +{opt count} plots counts (frequencies) of {it:yvar} rather than means. + +{phang} +{opt fraction} plots fractions (proportions) of {it:yvar} rather than means. + +{phang} +{opt lineat(#)} draws a vertical line at the specified point along the {it:x} axis. To draw multiple lines, include multiple numbers separated by spaces. + +{phang} +{opt scatter} formats output as a scatterplot rather than a bar graph. In this case, each conditional median or mean is plotted as a dot rather than a bar. + +{phang} +{opt legend} allows display of the legend; by default it is suppressed. To more fully control display of the legend, include this option as well as {opt graphopts(legend(...))}. + +{phang} +{opt lfit} plots a line of best fit on the graph. When the graph is split using {opt cutpoint}, separate lines of best fit are plotted on the left and right. + +{phang} +{opt lfitci} is the same as {opt lfit}, but with confidence intervals. + +{phang} +{opt qfit} is the same as {opt lfit}, but with a quadratic. + +{phang} +{opt qfitci} is the same as {opt qfit}, but with confidence intervals. + +{phang} +{opt lowess} plots local linear smooth ({help twoway_lowess:lowess}) plot on the graph. When the graph is split using {opt cutpoint}, separate lowess plots are plotted on the left and right. + +{phang} +{opth by(varname)} graphs subgroups separately, according to {it:varname}. Subgroups are identified in the note field below each graph. + +{phang} +{opt bytitle(...)} adds an overall title to a series of subgroup graphs, when {opt by} is used. + +{phang} +{opt byvalues(...)} specifies an ordered list of category values, when {opt by} is used. So, e.g., {opt byvalues(1 0)} will place the {it:1} graph before the {it:0} graph. By default, graphs appear in sorted order. + +{phang} +{opt noten} notes the number of observations at the bottom of the graph. + +{phang} +{opt notepfx(...)} adds a prefix to the note at the bottom of the graph. This will precede the number of observations and/or the subgroup, depending on other options. + +{phang} +{opt notesfx(...)} adds a suffix to the note at the bottom of the graph. This will follow the number of observations and/or the subgroup, depending on other options. + +{phang} +{opt nonotes} suppresses all notes at the bottom of the graph, even when using {opt by}. + +{phang} +{opt histopts(options)} controls the definition of bins with {help histogram##continuous_opts:histogram options}. +When graphs are split by {opt cutpoint}, these options govern bin definitions for each side of the graph. So, e.g., {opt histopts(bin(10))} will +define 10 bins to the left and 10 to the right. + +{phang} +{opt graphopts(options)} specifies additional {help twoway_options:graph options} to govern graph output. These options can control any aspect of the +look of the graph, including titles, labels, and styles. Specify the graph number as the {it:#} in {opt graphopts#(options)} to specify options for only +one of several graphs output. + +{phang} +{opt lfitopts(options)} specifies additional {help twoway_lfit:lfit options} to govern output of the line-of-best-fit when using {opt lfit}. +When using {opt lfitci}, specifies additional {help twoway_lfitci:lfitci options}. +When using {opt qfit}, specifies additional {help twoway_qfit:qfit options}. +When using {opt qfitci}, specifies additional {help twoway_qfitci:qfitci options}. +Specify the graph number as the {it:#} in {opt lfitopts#(options)} to specify options for only +one of several graphs output. + +{phang} +{opt lowopts(options)} specifies additional {help twoway_lowess:lowess options} to govern output of lowess plots when using {opt lowess}. +Specify the graph number as the {it:#} in {opt lowopts#(options)} to specify options for only one of several graphs output. + +{phang} +{opt ciopts(options)} specifies additional {help ci:ci options} to govern calculation of confidence intervals when using {opt ci}. + +{phang} +{opt rcapopts(options)} specifies additional {help twoway_rcap:rcap options} to govern output of confidence intervals when using {opt ci}. +Specify the graph number as the {it:#} in {opt rcapopts#(options)} to specify options for only +one of several graphs output. + +{phang} +{opt saving(filename)} exports the graph to {it:filename} and closes the graph window. This option is ideal for automating the output of graphs with .do files. + +{phang} +{opt generate(prefix)} is a programmer's option to save graphing values, as in {help twoway__histogram_gen:twoway__histogram_gen}. +Variables of the form {it:prefix}x#, where {it:#} is the graph number starting from 0, are saved with the center {it:x} value for each bin. +Variables of the form {it:prefix}y# are saved with the corresponding heights. + +{title:Saved results} + +{pstd} +{cmd:cmogram} saves the following in {cmd:r()}: + +{pstd} +Scalars: + + {cmd:r(bw#)} bin width for graph {it:#} + +{pstd} +By default, there is only one graph output by {cmd:cmogram}, so {it:#} is 0; when {opt cutpoint} is specified, there are two graphs, 0 and 1, corresponding +to the left and right sides of the graph; when {opt by} is specified, there are additional graphs. To save more details for each graph, use the +{opt generate} option. + +{title:Examples} + +{phang}{cmd:. sysuse auto} + +{phang}{cmd:. cmogram mpg weight} + +{phang}{cmd:. cmogram mpg weight, median title("Median MPG by Weight")} + +{phang}{cmd:. cmogram mpg weight, median title("Median MPG by Weight") saving("median mpg.png")} + +{phang}{cmd:. cmogram mpg weight, histopts(bin(10)) lfit scatter} + +{phang}{cmd:. cmogram mpg weight, histopts(bin(10)) lfit graphopts(note("Source: ..."))} + +{phang}{cmd:. cmogram mpg weight, histopts(bin(5)) lfit cutpoint(3250) lineat(3250)} + +{phang}{cmd:. cmogram mpg weight, histopts(bin(5)) lfit cutpoint(3250) lineat(3000 3250 3500) controls(price)} + +{phang}{cmd:. cmogram mpg weight, histopts(bin(5)) by(foreign) bytitle("Mean MPG by Type and Weight")} + + +{title:Author} + +Christopher Robert, Harvard University, chris_robert@hksphd.harvard.edu + + +{title:Also see} + +{psee} +Online: help for + {helpb histogram} +{p_end} diff --git a/ado/c/coefplot.ado b/ado/c/coefplot.ado new file mode 100644 index 0000000..bea86f5 --- /dev/null +++ b/ado/c/coefplot.ado @@ -0,0 +1,3903 @@ +*! version 1.8.6 22feb2023 Ben Jann + +program coefplot + version 11 + nobreak { + capt mata: mata drop COEFPLOT_STRUCT + capt n break _coefplot `macval(0)' + local rc = _rc + capt mata: mata drop COEFPLOT_STRUCT + exit `rc' + } +end + +program _coefplot, rclass + // get subgraphs and parse global options + parse_subgraphs `macval(0)' // returns n_subgr, subgr_#, opts + parse_globalopts `macval(opts)' // returns expanded global opts and twopts, + // subgropts0, plotopts0, modelopts0, twplotopts0 + + // backup current estimates, initialize struct + tempname ecurrent + _est hold `ecurrent', restore estsystem nullok + mata: COEFPLOT_STRUCT = coefplot_struct_init() + + // dryrun across subgraphs and plots to collect options + local i 0 + local N_plots 0 + forv j = 1/`n_subgr' { + if "`recycle'"=="" local i 0 + local firstplot_`j' = `i'+1 + parse_plots `j' `macval(subgr_`j')' // returns n_plots_j, plot_j_#, opts + if ("`recycle'"=="" & `n_subgr'>1) { + combine_plotopts, `macval(opts)' _opts0(`macval(plotopts1prev)') + local plotopts1prev `macval(plotopts)' + local opts `macval(plotopts)' `macval(options)' + } + merge_subgropts, `macval(opts)' _opts0(`subgropts0' `plotopts0' `macval(modelopts0)') + // returns subgropts, plotopts1, modelopts1, twplotopts1 + parse_subgropts `j', `subgropts' + forv k = 1/`n_plots_`j'' { + local ++i + local twplotopts1_`i' `twplotopts1_`i'' `twplotopts1' + parse_models `j' `k' `macval(plot_`j'_`k')' + // returns n_models_j_k, model_j_k_#, opts + if `n_models_`j'_`k''==1 & `"`model_`j'_`k'_1'"'=="_skip" { + if `"`opts'"'!="" { + di as err "options not allowed with _skip" + exit 198 + } + continue + } + if (`i'>`N_plots') { // get p#() from twoplotopts0 + parse_get_popt_i `i', `macval(twplotopts0)' // returns twplotopts0, plotopts + if `"`macval(plotopts)'"'!="" { + merge_plotopts, `macval(plotopts)' // to isolate the modelopts + local popt_mopts_`i' `macval(modelopts2)' + merge_plotopts, `macval(opts)' /// + _opts0(`macval(modelopts2)' `plotopts' `_opts0' `options') + // returns plotopts, modelopts2, options, _opts0 + local opts `macval(modelopts2)' `plotopts' `_opts0' `options' + } + } + else { + if `"`macval(popt_mopts_`i')'"'!="" { // add modelopts from p#() + merge_plotopts, `macval(opts)' _opts0(`macval(popt_mopts_`i')') + // returns plotopts, modelopts2, options, _opts0 + local opts `macval(modelopts2)' `plotopts' `_opts0' `options' + } + } + if ("`recycle'"=="" & `n_subgr'>1) { + combine_plotopts, `macval(opts)' _opts0(`macval(plotopts2_`i')') + local plotopts2_`i' `macval(plotopts)' + local opts `macval(plotopts)' `macval(options)' + } + merge_plotopts, `macval(opts)' _opts0(`macval(plotopts1)' `macval(modelopts1)') + // returns plotopts, modelopts2, options, _opts0 + if `"`_opts0'"'!="" error 198 + local modelopts_`j'_`k' `macval(modelopts2)' + local twplotopts_`i' `twplotopts_`i'' `options' + local plotopts_`i' `plotopts' + } + local lastplot_`j' `i' + local N_plots = max(`N_plots', `i') + } + // expand plotopts + local customoffset 0 + forv i = 1/`N_plots' { + parse_plotopts `i', `plotopts_`i'' + if `"`offset_`i''"'!="" local customoffset 1 + } + // parse cismooth + forv i = 1/`N_plots' { + local cis_`i' = `"`cismooth_`i''"'!="" + if `cis_`i'' { + if `"`cismooth_`i''"'=="cismooth" local cismooth_`i' + parse_cismooth `i', `cismooth_`i'' // returns cis_levels_i, + // cis_n_i, cis_lwidth_i, cis_intens_i, cis_color_i, cis_pstyle_i + } + else local cis_n_`i' = 0 + } + + // parse models and collect results + local i 0 + forv j = 1/`n_subgr' { + if "`recycle'"=="" local i 0 + forv k = 1/`n_plots_`j'' { + local ++i + if `n_models_`j'_`k''==1 & `"`macval(model_`j'_`k'_1)'"'=="_skip" { + continue + } + forv l = 1/`n_models_`j'_`k'' { + parse_model `macval(model_`j'_`k'_`l')' // returns model, matrix, opts + if `"`matrix'"'=="" { + if `"`model'"'=="." { + _est unhold `ecurrent' + } + else { + qui est restore `model' + } + } + collect_coefs `"`model'"' /// + "`matrix'" /// matrix mode? + "`atmode'" /// whether at() is used; will be replaced + `i' /// plot number + `j' /// subgraph number + "`cis_levels_`i''" /// + , `macval(opts)' _opts0(`macval(modelopts_`j'_`k')') + // returns equation, atmode, n_ci + // may reset mlabel_# and mlabvposition_# + local n_ci = `n_ci' - `cis_n_`i'' + if `"`matrix'"'=="" & `"`model'"'=="." { + _est hold `ecurrent', restore estsystem nullok + } + if "`n_ci_`i''"=="" local n_ci_`i' 0 + local n_ci_`i' = max(`n_ci_`i'', `n_ci') + mata: coefplot_add_label(COEFPLOT_STRUCT, "by", `j', "model", 0) + if `"`equation'"'!="" { + if `"`model'"'=="." local model `"`equation'"' + else local model `"`model'=`equation'"' + } + mata: coefplot_add_label(COEFPLOT_STRUCT, "plot", `i', "model", 0) + } + } + } + forv i = 1/`N_plots' { // expand ciopts + if `n_ci_`i''>0 { + parse_ciopts_nocilwincr `i', `ciopts_`i'' `cirecast_`i'' // returns nocilwincr_# + parse_ciopts `i' `n_ci_`i'' `ciopts_`i'' `cirecast_`i'' + } + } + mata: coefplot_set_r(COEFPLOT_STRUCT) // returns r, N_ci, N_aux, mlbllen + local mlbllen = max(1, min(c(maxstrvarlen), `mlbllen')) + if `r'==0 { + di as txt "(nothing to plot)" + exit + } + + // cleanup and and arrange + if `"`horizontal'`vertical'"'=="" { + if `atmode' local vertical vertical + else local horizontal horizontal + } + if `"`horizontal'"'!="" { + local xaxis y + local yaxis x + local offdir "-" + local reverse yscale(reverse) + local plotregion plotregion(margin(t=0 b=0)) + } + else { // vertical + local xaxis x + local yaxis y + local offdir "+" + local plotregion plotregion(margin(l=0 r=0)) + } + if `atmode' { + if "`bycoefs'"!="" { + di as err "at() and bycoefs not both allowed" + exit 198 + } + local grid `"`grid'`gridopts'"' + foreach opt in order coeflabels eqlabels relocate headings /// + groups grid { + if `"``opt''"'!="" { + di as err "at() and `opt'() not both allowed" + exit 198 + } + } + mata: coefplot_add_eq_and_grp(COEFPLOT_STRUCT) + local reverse + local plotregion + local meqs 0 + } + else { + if `"`eqstrict'"'!="" local meqs 1 + else { + mata: coefplot_multiple_eqs(COEFPLOT_STRUCT) // returns meqs + } + mata: coefplot_arrange(COEFPLOT_STRUCT) // updates local r + mata: coefplot_coeflbls(COEFPLOT_STRUCT) + coeflbls "`labels'" `"`clinteract'"' + if "`bycoefs'"!="" { + mata: coefplot_bycoefs(COEFPLOT_STRUCT) // returns n_subgr + local meqs 0 + } + mata: coefplot_catvals(COEFPLOT_STRUCT) + // modifies C.at; sets C.eq, C.grp; returns groups + mata: coefplot_headings(COEFPLOT_STRUCT) + // modifies C.at; returns hlbls + } + + // save results to variables + if `"`generate'"'=="" { + if (_N > `r') & "`nodrop'"=="" { + preserve + qui keep in 1/`r' // remove extra observations to speed up + } + else if (_N < `r') { + preserve + qui set obs `r' + } + } + else { + if (_N < `r') { + di as txt "need to create additional observations; " _c + di as txt "press break to abort" + more + set obs `r' + } + } + tempname by plot at mlbl mlpos b V se t df pval eq grp + qui gen `by' = . + qui gen `plot' = . + qui gen `at' = . + qui gen str`mlbllen' `mlbl' = "" + qui gen `mlpos' = . + qui gen `b' = . + qui gen `V' = . + qui gen `se' = . + qui gen `t' = . + qui gen `df' = . + qui gen `pval' = . + if `"`format'"'!="" { + format `format' `b' `V' `se' `t' `pval' + } + qui gen `eq' = . + qui gen `grp' = . + forv i = 1/`N_ci' { + tempname ll`i' ul`i' + qui gen `ll`i'' = . + qui gen `ul`i'' = . + if `"`format'"'!="" { + format `format' `ll`i'' `ul`i'' + } + } + forv i = 1/`N_aux' { + tempname aux`i' + qui gen `aux`i'' = . + if `"`format'"'!="" { + format `format' `aux`i'' + } + } + if `"`generate'"'!="" { + preserve + local returnvars + local i 0 + foreach v in by plot at mlbl mlpos b V se t df pval { + local ++i + local varl: word `i' of /// + "subgraph ID" /// + "plot ID" /// + "plot position (category axis)" /// + "marker label" /// + "marker label position" /// + "coefficient" /// + "variance" /// + "standard error" /// + "t or z statistic" /// + "degrees of freedom" /// + "p-value" + if "`replace'"!="" { + capt confirm new variable `generate'`v', exact + if _rc { + drop `generate'`v' + } + } + rename ``v'' `generate'`v' + lab var `generate'`v' `"`varl'"' + local `v' `generate'`v' + local returnvars `returnvars' `generate'`v' + } + forv i = 1/`N_ci' { + foreach v in ll ul { + if "`v'"=="ll" local varl "CI`i': lower limit" + else local varl "CI`i': upper limit" + if "`replace'"!="" { + capt confirm new variable `generate'`v'`i', exact + if _rc { + drop `generate'`v'`i' + } + } + rename ``v'`i'' `generate'`v'`i' + lab var `generate'`v'`i' `"`varl'"' + local `v'`i' `generate'`v'`i' + local returnvars `returnvars' `generate'`v'`i' + } + } + forv i = 1/`N_aux' { + local varl "Auxiliary variable `i'" + if "`replace'"!="" { + capt confirm new variable `generate'aux`i', exact + if _rc { + drop `generate'aux`i' + } + } + rename `aux`i'' `generate'aux`i' + lab var `generate'aux`i' `"`varl'"' + local aux`i' `generate'aux`i' + local returnvars `returnvars' `generate'aux`i' + } + } + mata: coefplot_put(COEFPLOT_STRUCT) + mata: coefplot_apply_transform(COEFPLOT_STRUCT) + qui compress `at' `df' `plot' `by' `eq' `grp' `mlpos' // not really needed + // get labels + set_by_and_plot_labels `plot' `by' + if `"`plotlabels'"'!="" { + set_labels "`plot'" "`N_plots'" `"`plotlabels'"' + } + if `"`pltrunc'`plwrap'"'!="" { + truncwrap_vlabels "`plot'" "`N_plots'" "`pltrunc'" /// + "`plwrap'" "`plbreak'" + } + if "`bycoefs'"=="" { + if `"`bylabels'"'!="" { + set_labels "`by'" "`n_subgr'" `"`bylabels'"' + } + if `"`bltrunc'`blwrap'"'!="" { + truncwrap_vlabels "`by'" "`n_subgr'" "`bltrunc'" /// + "`blwrap'" "`blbreak'" + } + } + if `atmode'==0 { + if "`grid'"=="" & "`xaxis'"=="y" { + if `N_plots'>1 & `"`offsets'"'=="" local grid between + else local grid within + } + get_axis_labels `at' `eq' `grp' "`grid'" `"`groups'"' + // => returns xlabels, xgrid, xrange, eqlabels, groups + if `meqs'==0 | "`noeqlabels'"!="" local eqlabels + if `"`cltrunc'`clwrap'"'!="" { + if "`bycoefs'"=="" { + truncwrap_labels xlabels "`cltrunc'" "`clwrap'" /// + "`clbreak'" `"`xlabels'"' + } + else { + truncwrap_vlabels "`by'" "`n_subgr'" "`cltrunc'" /// + "`clwrap'" "`clbreak'" + } + } + if "`bycoefs'"!="" { + if `"`bylabels'"'!="" { + reset_xlabels `"`bylabels'"' `"`xlabels'"' + } + if `"`bltrunc'`blwrap'"'!="" { + truncwrap_labels xlabels "`bltrunc'" "`blwrap'" /// + "`blbreak'" `"`xlabels'"' + } + } + if `"`clangle'"'=="" local clangle angle(horizontal) + local xlabel `xaxis'label(`xlabels', nogrid `clangle' `clopts') + local xrange `xaxis'scale(range(`xrange')) + if !inlist("`grid'", "", "none") { + local xtick `xaxis'tick(`xgrid', notick tlstyle(none) grid `gridopts') + // note: tlstyle(none) is required to prevent by() from drawing + // the ticks + } + else local xtick + if "`eqashead'"!="" { + merge_eqlabels_hlbls `"`eqlabels'"' `"`hlbls'"' + // => returns hlbls and clears eqlabels + } + if `"`eqtrunc'`eqwrap'"'!="" { + if `"`eqlabels'"'!="" { + truncwrap_labels eqlabels "`eqtrunc'" "`eqwrap'" /// + "`eqbreak'" `"`eqlabels'"' + } + } + if `"`gtrunc'`gwrap'"'!="" { + if `"`groups'"'!="" { + truncwrap_labels groups "`gtrunc'" "`gwrap'" /// + "`gbreak'" `"`groups'"' + } + } + if `"`htrunc'`hwrap'"'!="" { + if `"`hlbls'"'!="" { + truncwrap_labels hlbls "`htrunc'" "`hwrap'" /// + "`hbreak'" `"`hlbls'"' + } + } + } + + // compute offsets + if `customoffset' { + forv i = 1/`N_plots' { + if "`offset_`i''"!="" { + qui replace `at' = `at' `offdir' `offset_`i'' if `plot'==`i' + } + } + } + else if `atmode'==0 & `"`offsets'"'=="" & `N_plots'>1 { + capt mata: coefplot_at_unique(COEFPLOT_STRUCT) // error if not true + if _rc==1 exit _rc + if _rc { + if "`recycle'"=="" | `n_subgr'==1 { + qui replace `at' = `at' - 0.5 + `plot'/(`N_plots'+1) + } + else { + forv j=1/`n_subgr' { + qui replace `at' = `at' - 0.5 + /// + (`plot'-`firstplot_`j''+1) / /// + (`lastplot_`j''-`firstplot_`j''+2) if `by'==`j' + } + } + } + } + + // inject tempvars + forv i=1/`N_plots' { + foreach opt in ifopt weightopt mlabel mlabvposition { + if `"``opt'_`i''"'!="" { + mata: coefplot_inject_temvars("`opt'_`i'", `N_ci', `N_aux') + } + } + } + + // handle string expressions in mlabel() + forv i=1/`N_plots' { + if `"`mlabel_`i''"'!="" { + if `"`mlabel_`i''"'=="mlabel(`mlbl')" continue + parse_mlabel_exp, `mlabel_`i'' // returns mlblexp + capt confirm variable `mlblexp' + if _rc==0 continue + capt replace `mlbl' = `mlblexp' if `plot'==`i' + if _rc { + di as err "invalid expression in mlabel()" + exit 198 + } + local mlabel_`i' mlabel(`mlbl') + } + } + + // compile plot + local addaxis 1 + local eqaxis 2 + local axisalt alt + if (`"`eqlabels'"'!="" & `"`groups'"'!="") | (`"`addplotbelow'"'!="") local axisalt + if `"`groups'"'!="" { + local ++eqaxis + local addaxis `addaxis' 2 + local groupsopts `xaxis'scale(axis(2) `axisalt' noline) /// + `xaxis'title("", axis(2)) /// + `xaxis'label(`groups', axis(2) noticks tlstyle(none) `gopts') + } + if `"`eqlabels'"'!="" { + local addaxis `addaxis' `eqaxis' + local eqaxisopts `xaxis'scale(axis(`eqaxis') `axisalt' noline) /// + `xaxis'title("", axis(`eqaxis')) /// + `xaxis'label(`eqlabels', axis(`eqaxis') noticks /// + tlstyle(none) `eqopts') + } + local axisalt + if "`addaxis'"!="1" { + local addaxis `xaxis'axis(`addaxis') + if `"`addplotbelow'"'!="" { + if (`"`eqlabels'"'!="")+(`"`groups'"'!="")==1 { + local axisalt `xaxis'scale(alt) + } + } + } + else local addaxis + if `"`hlbls'"'!="" { + local hlblsopts /// + `xaxis'label(`hlbls', custom add tlstyle(none) `hopts') + } + local j 0 + if `"`addplot'"'!="" { + mata: coefplot_inject_temvars("addplot", `N_ci', `N_aux') + if `"`addplotbelow'"'!="" { + capt two `addplot' ||, nodraw + if _rc==0 local j `.Graph.last_style' + capt confirm integer number `j' + if _rc local j 0 + } + } + local plots + local legendlbls + local legendorder + forv i=1/`N_plots' { + local key + if "`n_ci_`i''"=="" { + continue // plot does not exist (this can happen if _skip is + // specified together with norecycle) + } + local n_ci = `n_ci_`i'' + `cis_n_`i'' + if `n_ci'==0 & `"`cionly_`i''"'!="" { + continue // can happen if noci and cionly is specified + } + local axis + if `"`axis_`i''"'!="" { + local axis `yaxis'axis(`axis_`i'') + } + local ciplots + if (`n_ci')>0 { + get_pstyle_id `=mod(`i'-1,`pcycle')+1', `pstyle_`i'' // returns pstyle_id + forv k = 1/`n_ci' { + local lw + if `k'>`cis_n_`i'' { + local l = `k' - `cis_n_`i'' + local ciopts `ciopts_`i'_`l'' + parse_ciopts_recast_pstyle, `ciopts' + // returns cirecast, cipstyle, ciopts + if "`nocilwincr_`i''"=="" { + local lw = string(1 + log10(`l')/log10(2)) + local lw lwidth(*`lw') + } + local ciplotcmd rspike `ll`k'' `ul`k'' `at' + if (substr(`"`cirecast'"',1,2)=="pc") { // paired coordinates + local ciplotcmd `cirecast' `ll`k'' `at' `ul`k'' `at' + if `"`cirecast'"'=="pcrarrow" { + local ciplotcmd pcarrow `ul`k'' `at' `ll`k'' `at' + } + } + else if `"`cirecast'"'!="" { + local ciopts `ciopts' recast(`cirecast') + } + } + else { // cismooth + local l 0 + local cirecast + local cipstyle `cis_pstyle_`i'' + local lw: word `k' of `cis_lwidth_`i'' + local lw lwidth(*`lw') + local lcinten: word `k' of `cis_intens_`i'' + local ciopts lcolor("`cis_color_`i''*`lcinten'") `cipstyle' + local ciplotcmd rspike `ll`k'' `ul`k'' `at' + } + if `"`cipstyle'"'!="" local pstyle + else { + set_pstyle `pstyle_id' `"`cirecast'"' // returns pstyle + } + local ciplots `ciplots' /// + (`ciplotcmd' if `plot'==`i'`ifopt_`i'', `addaxis' /// + `pstyle' `lw' `axis' `ciopts' `horizontal') + } + } + if "`citop_`i''"=="" & `n_ci'>0 { + local plots `plots' `ciplots' + local j = `j' + `cis_n_`i'' + if inrange(`key_`i'', 1, `n_ci_`i'') { + local key = `j' + `key_`i'' + } + local j = `j' + `n_ci_`i'' + } + if `"`cionly_`i''"'=="" { + if `"`pstyle_`i''"'!="" local pstyle `pstyle_`i'' + else { + set_pstyle `=mod(`i'-1,`pcycle')+1' `"`recast_`i''"' // returns pstyle + } + if `"`recast_`i''"'!="" local recast recast(`recast_`i'') + else local recast + if `"`horizontal'"'=="" | inlist(`"`recast_`i''"', /// + "area", "bar", "spike", "dropline", "dot") { + local plots `plots' /// + (scatter `b' `at' /// + if `plot'==`i'`ifopt_`i''`weightopt_`i'', /// + `addaxis' `pstyle' `twplotopts0' `twplotopts1_`i'' /// + `axis' `recast' `mlabel_`i'' `mlabvposition_`i'' /// + `twplotopts_`i'' `horizontal') + } + else { + local plots `plots' /// + (scatter `at' `b' /// + if `plot'==`i'`ifopt_`i''`weightopt_`i'', /// + `addaxis' `pstyle' `twplotopts0' `twplotopts1_`i'' /// + `axis' `recast' `mlabel_`i'' `mlabvposition_`i'' /// + `twplotopts_`i'') + } + local ++j + if `key_`i''==0 { + local key `j' + } + } + local plotlab `"`: lab `plot' `i''"' + gettoken trash : plotlab, qed(hasquotes) + if `hasquotes'==0 { + local plotlab `"`"`plotlab'"'"' + } + if "`citop_`i''"!="" & `n_ci'>0 { + local plots `plots' `ciplots' + local j = `j' + `cis_n_`i'' + if inrange(`key_`i'', 1, `n_ci_`i'') { + local key = `j' + `key_`i'' + } + local j = `j' + `n_ci_`i'' + } + if "`key'"!="" { + local legendlbls `legendlbls' label(`key' `plotlab') + local legendorder `legendorder' `key' + } + } + if `"`legendorder'"'!="" { + local legendorder all order(`legendorder') + if `N_plots'==1 { + if `n_subgr'==1 & `"`legend'"'=="" { + local legendorder `legendorder' off + } + } + } + else local legendorder off + if `n_subgr'>1 { + local byopt `by', note("") + if (`N_plots'==1 & `"`bylegend'"'=="") | `"`legendorder'"'=="off" { + local byopt `byopt' legend(off) + } + local byopt by(`byopt' `bylegend' `byopts') + } + else local byopt + if `"`plots'"'=="" { + di as txt "(nothing to plot)" + exit + } + if `"`addplot'"'!="" { + if `"`addplotbelow'"'!="" { + local plots `addplot' || `plots' || + } + else { + local plots `plots' || `addplot' || + } + } + local plots two `plots', `axisalt' `groupsopts' `eqaxisopts' /// + `xlabel' `hlblsopts' `xtick' `xrange' `reverse' yti("") xti("") /// + legend(`legendlbls' `legendorder') `legend' `plotregion' `byopt' `twopts' + `plots' + + // return + if `"`generate'"'!="" { + restore, not + di as txt _n "Generated variables:" _c + describe `returnvars' + } + return local graph `plots' + return local labels `"`xlabels'"' + return local eqlabels `"`eqlabels'"' + return local groups `"`groups'"' + return local headings `"`hlbls'"' + return local legend `"`legendlbls' `legendorder'"' + return scalar n_plots = `N_plots' + return scalar n_subgr = `n_subgr' + return scalar n_ci = `N_ci' +end + +program parse_subgraphs // input: "subgr || subgr ..., opts" + local i 0 + local empty 1 + while (`"`macval(0)'"'!="") { + gettoken subgraph 0 : 0, parse("|") bind + if `"`macval(subgraph)'"'=="|" { + gettoken subgraph 0 : 0, parse("|") bind + if `"`macval(subgraph)'"'!="|" error 198 // require "||" + if `empty' { + local ++i + c_local subgr_`i' "." // use active model + } + else local empty 1 + continue + } + if `"`0'"'=="" { // get opts if last + _parse comma subgraph opts : subgraph + } + if `"`macval(subgraph)'"'!="" { // skip last if empty + local empty 0 + local ++i + c_local subgr_`i' `"`macval(subgraph)'"' + } + } + if `i'==0 { // check if empty + local i 1 + c_local subgr_1 "." // use active model + } + c_local n_subgr `i' + c_local opts `macval(opts)' +end + +program parse_globalopts + syntax [, /// + /// globalopts + HORizontal /// + VERTical /// + sort SORT2(str) /// + orderby(str) /// + order(str asis) /// + BYCoefs /// + noRECycle /// + grid(str) /// + noOFFsets /// + format(str) /// + noLABels /// + COEFLabels(str asis) /// + NOEQLABels /// + EQLabels(str asis) /// + eqstrict /// + HEADings(str asis) /// + GROUPs(str asis) /// + PLOTLabels(str asis) /// + bylabels(str asis) /// + GENerate GENerate2(name) /// + RELOCate(str asis) /// + replace /// + addplot(str asis) /// + NODROP /// + LEGend(passthru) /// + BYOPts(str asis) /// + Bname(passthru) /// so that b() is not b1title() + rename(passthru) /// + EQREName(passthru) /// + PCYCle(int 15) /// + /// twoway options not captured by _get_gropts, gettwoway + play(passthru) /// + XOVERHANGs /// + YOVERHANGs /// + fxsize(passthru) /// + fysize(passthru) /// + * /// + ] + _get_gropts, graphopts(`options') gettwoway + local twopts `s(twowayopts)' `play' `xoverhangs' `yoverhangs' `fxsize' `fysize' + local opts0 `bname' `macval(rename)' `macval(eqrename)' `s(graphopts)' + if `"`sort'`sort2'"'!="" { + parse_sort `sort2' // returns local sort + } + if `"`orderby'"'!="" { + parse_orderby `orderby', `recycle' // returns local orderby + } + if `"`generate'"'!="" & `"`generate2'"'=="" { + local generate "__" + } + else local generate `"`generate2'"' + if `"`grid'"'!="" { + parse_grid, `grid' // returns local grid, gridopts + } + if `"`coeflabels'"'!="" { + parse_coeflabels `coeflabels' + // returns coeflabels, cltrunc, clwrap, clbreak, clinteract, clangle, clopts + } + if `"`clinteract'"'=="" { + local clinteract `"" # ""' + } + parse_eqlabels "`noeqlabels'" `eqlabels' + // returns eqlabels, eqashead, eqxlab + // if eqashead=="": also eqgap, eqwrap, eqtrunc, eqbreak, eqopts + // if eqashead!="": also hoff, hgap, hwrap, htrunc, hbreak, hopts + if `"`headings'"'!="" { + if `"`eqashead'"'!="" { + di as err "eqlabels(, asheadings) and headings() not both allowed" + exit 198 + } + parse_headings `headings' // returns headings, hoff, hgap, hopts + } + else if `"`hgap'"'=="" local hgap 0 + if `"`eqashead'"'!="" { + if "`bycoefs'"!="" { + di as err "eqlabels(, asheadings) and bycoefs not both allowed" + exit 198 + } + } + if `"`groups'"'!="" { + parse_groups `groups' // returns groups, ggap, gwrap, gtrunc, gbreak, gopts + } + else local ggap 0 + if `"`plotlabels'"'!="" { + parse_plotlabels `plotlabels' // returns plotlabels, plwrap, pltrunc, plbreak + } + if `"`bylabels'"'!="" { + parse_bylabels `bylabels' // returns bylabels, blwrap, bltrunc, blbreak + } + if `"`format'"'!="" { + confirm numeric format `format' + } + if `"`horizontal'"'!="" { + if `"`vertical'"'!="" { + di as err "horizontal and vertical not both allowed" + exit 198 + } + } + if `"`addplot'"'!="" { + parse_addplot `addplot' // returns addplot, addplotbelow + } + parse_byopts, `byopts' // returns bylegend, byopts + foreach opt in /// + horizontal /// + vertical /// + sort /// + orderby /// + order /// + bycoefs /// + recycle /// + grid gridopts /// + offsets /// + format /// + labels /// + coeflabels cltrunc clwrap clbreak clinteract clangle clopts /// + noeqlabels /// + eqlabels eqashead eqxlab eqgap eqtrunc eqwrap eqbreak eqopts /// + eqstrict /// + headings hxlab hoff hgap htrunc hwrap hbreak hopts /// + groups ggap gtrunc gwrap gbreak gopts /// + plotlabels plwrap pltrunc plbreak /// + bylabels blwrap bltrunc blbreak /// + relocate /// + generate /// + replace /// + addplot addplotbelow /// + nodrop /// + legend /// + bylegend /// + byopts /// + { + c_local `opt' `"``opt''"' + } + c_local pcycle `pcycle' + c_local twopts `twopts' + merge_subgropts, `macval(opts0)' + c_local subgropts0 `subgropts' + c_local plotopts0 `plotopts1' + c_local modelopts0 `macval(modelopts1)' + c_local twplotopts0 `twplotopts1' +end + +program parse_sort + syntax [anything] [, Descending by(str) ] + if `"`anything'"'=="" { + local subgr . + local plot . + } + else { + gettoken subgr rest : anything, parse(":") + if `"`rest'"'=="" { // sort(#) + local plot `"`subgr'"' + local subgr . + } + else if `"`subgr'"'==":" { // sort(:#) + local subgr . + gettoken plot rest : rest + } + else { // sort(#:#) + gettoken colon rest : rest, parse(":") + if `"`colon'"'!=":" { + di as err "sort(): invalid syntax" + exit 198 + } + gettoken plot rest : rest + } + if `"`rest'"'!="" { + di as err "sort(): invalid syntax" + exit 198 + } + foreach t in subgr plot { + if `"``t''"'=="" local `t' . + else if `"``t''"'!="." { + capt confirm integer number ``t'' + if _rc==0 { + local rc = (``t''<=0) + } + else local rc 1 + if `rc' { + di as err "sort(): invalid syntax" + exit 198 + } + } + } + } + capt parse_sort_by, `by' + if _rc { + di as err `"sort(): '`by'' not allowed in by()"' + exit 198 + } + local descending = ("`descending'"!="") + c_local sort `"`subgr' `plot' `descending' "`by'""' +end +program parse_sort_by + syntax [, b v se t tabs df p ll ul aux * ] + local by `b' `v' `se' `t' `tabs' `df' `p' `ll' `ul' `aux' + if `: list sizeof by'>1 exit 198 + if inlist("`by'","ll", "ul", "aux") { // by(ll/ul/aux #) + if `"`options'"'=="" local by `by' 1 + else { + capt confirm integer number `options' + if _rc==0 { + local rc = (`options'<=0) + } + else local rc 1 + if `rc' exit 198 + local by `by' `options' + } + } + else if `"`options'"'!="" exit 198 + if `"`by'"'=="" local by b + c_local by `by' +end + +program parse_orderby + syntax [anything] [, norecycle ] + gettoken subgr rest : anything, parse(":") + if `"`rest'"'=="" { // orderby(#) + local plot `"`subgr'"' + local subgr 1 + } + else if `"`subgr'"'==":" { // ordeby(:#) + local subgr 1 + gettoken plot rest : rest + } + else { // orderby(#:#) + gettoken colon rest : rest, parse(":") + if `"`colon'"'!=":" { + di as err "orderby(): invalid syntax" + exit 198 + } + if "`recycle'"!="" { + di as err "orderby(): subgraph not allowed with norecycle" + exit 198 + } + gettoken plot rest : rest + } + if `"`rest'"'!="" { + di as err "orderby(): invalid syntax" + exit 198 + } + foreach t in subgr plot { + if `"``t''"'=="" local `t' 1 + else { + capt confirm integer number ``t'' + if _rc==0 { + local rc = (``t''<=0) + } + else local rc 1 + if `rc' { + di as err "orderby(): invalid syntax" + exit 198 + } + } + } + if "`recycle'"!="" local subgr . + c_local orderby `subgr' `plot' +end + +program parse_grid + syntax [, Between Within None * ] + if ("`between'"!="") + ("`within'"!="") + ("`none'"!="") > 1 { + di as err "grid(): only one of between, within, and none allowed" + exit 198 + } + c_local grid `between' `within' `none' + c_local gridopts `options' +end + +program parse_coeflabels + mata: coefplot_parsecomma("coeflabels", "0", "0") + syntax [, Truncate(numlist integer max=1 >0) /// + Wrap(numlist integer max=1 >0) noBreak /// + Interaction(str asis) angle(passthru) * ] + c_local coeflabels `"`coeflabels'"' + c_local cltrunc `truncate' + c_local clwrap `wrap' + c_local clbreak `break' + c_local clinteract `"`interaction'"' + c_local clangle `angle' + c_local clopts `options' +end + +program parse_eqlabels + gettoken noeqlabels 0 : 0 + mata: st_local("0", strltrim(st_local("0"))) + mata: coefplot_parsecomma("eqlabels", "0", "0") + syntax [, LABels LABels2(str asis) /// + OFFset(real 0) ASHEADings noGap Gap2(numlist max=1) /// + Truncate(numlist integer max=1 >0) /// + Wrap(numlist integer max=1 >0) noBreak * ] + if "`labels'"!="" & `"`labels2'"'=="" { + local labels2 `"" # ""' + } + if "`gap'"!="" local gap2 0 + else if "`gap2'"=="" { + if "`noeqlabels'"!="" local gap2 0 + else local gap2 1 + } + if "`asheadings'"!="" { + c_local hoff `offset' + c_local hgap `gap2' + c_local htrunc `truncate' + c_local hwrap `wrap' + c_local hbreak `break' + c_local hopts `options' + c_local eqgap 0 + } + else { + if `offset'!=0 { + di as err "eqlabels(): offset() only allowed with asheadings" + exit 198 + } + c_local eqgap `gap2' + c_local eqtrunc `truncate' + c_local eqwrap `wrap' + c_local eqbreak `break' + c_local eqopts `options' + } + c_local eqxlab `"`labels2'"' + c_local eqlabels `"`eqlabels'"' + c_local eqashead `asheadings' +end + +program parse_headings + mata: coefplot_parsecomma("headings", "0", "0") + syntax [, OFFset(real 0) noGap Gap2(real 1) /// + Truncate(numlist integer max=1 >0) /// + Wrap(numlist integer max=1 >0) noBreak * ] + if "`gap'"!="" local gap2 0 + c_local headings `"`headings'"' + c_local hoff `offset' + c_local hgap `gap2' + c_local htrunc `truncate' + c_local hwrap `wrap' + c_local hbreak `break' + c_local hopts `options' +end + +program parse_groups + mata: coefplot_parsecomma("groups", "0", "0") + syntax [, noGap Gap2(real 1) /// + Truncate(numlist integer max=1 >0) /// + Wrap(numlist integer max=1 >0) noBreak * ] + if "`gap'"!="" local gap2 0 + c_local groups `"`groups'"' + c_local ggap `gap2' + c_local gtrunc `truncate' + c_local gwrap `wrap' + c_local gbreak `break' + c_local gopts `options' +end + +program parse_plotlabels + mata: coefplot_parsecomma("plotlabels", "0", "0") + syntax [, Truncate(numlist integer max=1 >0) /// + Wrap(numlist integer max=1 >0) noBreak ] + c_local plotlabels `"`plotlabels'"' + c_local pltrunc `truncate' + c_local plwrap `wrap' + c_local plbreak `break' +end + +program parse_bylabels + mata: coefplot_parsecomma("bylabels", "0", "0") + syntax [, Truncate(numlist integer max=1 >0) /// + Wrap(numlist integer max=1 >0) noBreak ] + c_local bylabels `"`bylabels'"' + c_local bltrunc `truncate' + c_local blwrap `wrap' + c_local blbreak `break' +end + +program parse_addplot + _parse expand addplot addplotopts : 0 , /// + common(below by() nodraw draw name() SAVing() play()) + forv i=1/`addplot_n' { + local addplot `addplot' (`addplot_`i'') + } + local addplot `addplot' `addplotopts_if' `addplotopts_in' + _parse combop addplotopts_op : addplotopts_op, option(below) opsin rightmost + parse_addplotopts, `addplotopts_op' // returns below, options + if `"`options'"'!="" { + local addplot `addplot', `options' + } + c_local addplot `addplot' + c_local addplotbelow `below' +end +program parse_addplotopts + syntax [, below by(passthru) NODRAW draw name(passthru) /// + SAVing(passthru) play(passthru) * ] + foreach opt in nodraw draw { + if `"``opt''"'!="" { + di as err "`opt' not allowed within addplot()" + exit 198 + } + } + foreach opt in by name saving play { + if `"``opt''"'!="" { + di as err "`opt'() not allowed within addplot()" + exit 198 + } + } + local options: subinstr local options "below" "", all word // to be sure + c_local below `below' + c_local options `options' +end + +program parse_byopts + syntax [, LEGend(passthru) * ] + c_local bylegend `legend' + c_local byopts `options' +end + +program merge_subgropts + merge_plotopts `macval(0)' // returns modelopts2, plotopts, options, _opts0 + _merge_subgropts, `options' + _merge_subgropts _opt0_, `_opts0' + if `"`_opt0_options'"'!="" error 198 + if `"`bylabel'"'!="" { + c_local subgropts `bylabel' + } + else { + c_local subgropts `_opt0_bylabel' + } + c_local modelopts1 `macval(modelopts2)' + c_local plotopts1 `plotopts' + c_local twplotopts1 `options' +end +program _merge_subgropts + syntax [anything] [, BYLABel(passthru) * ] + c_local `anything'bylabel `bylabel' + c_local `anything'options `options' +end + +program parse_subgropts + syntax anything [, BYLABel(str asis) ] + gettoken lbl rest : bylabel, qed(qed) // remove outer quotes + if `"`lbl'"'!="" & `"`rest'"'=="" & `qed' { + local bylabel `"`lbl'"' + } + mata: coefplot_add_label(COEFPLOT_STRUCT, "by", `anything', "bylabel", 0) +end + +program parse_plots // input: "j (plot) (plot) ..., opts" + gettoken j 0 : 0 + _parse comma 0 opts : 0 // get opts + gettoken comma opts : opts, parse(",") // strip comma + local i 0 + while (`"`macval(0)'"'!="") { + gettoken plot 0: 0, match(hasparen) + local estexpand 0 // expand wildcards? + if `"`hasparen'"'=="" { // - not if "(...)" + if strpos(`"`plot'"',"(")==0 { // - not it "mat(...)" + if strpos(`"`plot'"',"*") | strpos(`"`plot'"',"?") { + local estexpand 1 + } + } + } + if `estexpand' { + qui estimates dir `plot' + foreach plot in `r(names)' { + local ++i + c_local plot_`j'_`i' `"`macval(plot)'"' + } + } + else { + local ++i + c_local plot_`j'_`i' `"`macval(plot)'"' + } + } + if `i'==0 { // check if empty + local i 1 + c_local plot_`j'_1 "." // use active model + } + c_local n_plots_`j' `i' + c_local opts `macval(opts)' +end + +program parse_get_popt_i + gettoken i 0 : 0, parse(",") + syntax [, p`i'(str asis) * ] + c_local plotopts `macval(p`i')' + c_local twplotopts0 `macval(options)' +end + +program combine_plotopts + syntax [, _opts0(str asis) * ] + _merge_plotopts, `macval(options)' + _merge_plotopts _opt0_, `macval(_opts0)' + if `"`mlabels'"'!="" local _opt0_mlabel + if `"`mlabel'"'!="" local _opt0_mlabels + if `"`cismooths'"'!="" local _opt0_cismooth + if `"`cismooth'"'!="" local _opt0_cismooths + if `"`nokey'`key'`key2'"'!="" { + local _opt0_nokey + local _opt0_key + local _opt0_key2 + } + local 0 + foreach opt of local opts { // opts is set by _merge_plotopts + if `"``opt''"'!="" { + local 0 `0' ``opt'' + } + else { + local 0 `0' `_opt0_`opt'' + } + } + c_local plotopts `0' + c_local options `macval(options)' +end + +program merge_plotopts + merge_modelopts `macval(0)' // returns modelopts, mlabels2, options, _opts0 + _merge_plotopts, `options' + _merge_plotopts _opt0_, `_opts0' + if `"`mlabels'"'!="" local _opt0_mlabel + if `"`mlabel'"'!="" local _opt0_mlabels + if `"`mlabels'`mlabel'"'!="" local mlabels2 + if `"`cismooths'"'!="" local _opt0_cismooth + if `"`cismooth'"'!="" local _opt0_cismooths + if `"`nokey'`key'`key2'"'!="" { + local _opt0_nokey + local _opt0_key + local _opt0_key2 + } + local 0 + foreach opt of local opts { // opts is set by _merge_plotopts + if `"``opt''"'!="" { + local 0 `0' ``opt'' + } + else { + local 0 `0' `_opt0_`opt'' + } + } + c_local modelopts2 `macval(modelopts)' `mlabels2' + c_local plotopts `0' + c_local options `options' + c_local _opts0 `_opt0_options' +end + +program _merge_plotopts + syntax [anything] [, /// + LABel(passthru) /// + offset(passthru) /// + PSTYle(passthru) /// + AXis(passthru) /// + recast(passthru) /// + MLabels MLabel(passthru) /// + MLABVposition(passthru) /// + cionly /// + citop /// + CISmooths CISmooth(passthru) /// + CIOPts(passthru) /// + CIREcast(passthru) /// + IFopt(passthru) /// + Weightopt(passthru) /// + NOKEY key KEY2(passthru) /// + * ] + if `"`mlabel'"'!="" local mlabels + if `"`cismooth'"'!="" local cismooths + local opts /// + label /// + offset /// + pstyle /// + axis /// + recast /// + mlabels mlabel /// + mlabvposition /// + cionly /// + citop /// + cismooths cismooth /// + ciopts /// + cirecast /// + ifopt /// + weightopt /// + nokey key key2 + foreach opt of local opts { + c_local `anything'`opt' ``opt'' + } + c_local `anything'options `options' + c_local opts `opts' +end + +program parse_plotopts + syntax anything [, /// + LABel(str asis) /// + offset(str asis) /// + PSTYle(passthru) /// + AXis(numlist integer max=1 >0 <10) /// + recast(str) /// + MLabels MLabel(passthru) /// + MLABVposition(passthru) /// + cionly /// + citop /// + CISmooths CISmooth(str asis) /// + CIOPts(str asis) /// + CIREcast(str) /// + IFopt(str asis) /// + Weightopt(str asis) /// + NOKEY key KEY2(str) /// + ] + if `"`label'"'!="" { + gettoken lbl rest : label, qed(qed) // remove outer quotes + if `"`lbl'"'!="" & `"`rest'"'=="" & `qed' { + local label `"`lbl'"' + } + mata: coefplot_add_label(COEFPLOT_STRUCT, "plot", `anything', "label", 1) + } + if `"`mlabels'"'!="" local mlabel mlabel(@b) + if `"`cismooths'"'!="" local cismooth cismooth + if `"`cirecast'"'!="" local cirecast recast(`cirecast') + if `"`offset'"'!="" { + capt parse_offset `offset' + if _rc { + di as err `"invalid offset(): `offset'"' + exit 198 + } + } + if `"`ifopt'"'!="" local ifopt `" & (`ifopt')"' + if `"`weightopt'"'!="" local weightopt `" [aw=`weightopt']"' + local key0 0 // default + if `"`nokey'"'!="" local key0 -1 // suppress key + if `"`key'`key2'"'!="" { + if `key0'<0 { + di as err "nokey and key() not both allowed" + exit 198 + } + if `"`key2'"'!="" { + gettoken key2ci key2 : key2 + if `"`key2ci'"'!="ci" { + di as err "invalid syntax in key()" + exit 198 + } + if `"`key2'"'!="" { + capt confirm integer number `key2' + if _rc==0 { + capt assert (`key2'>0) + } + if _rc { + di as err "invalid syntax in key()" + exit 198 + } + } + else local key2 1 + local key0 `key2' + } + } + local key `key0' + foreach opt in /// + offset /// + pstyle /// + axis /// + recast /// + mlabel /// + mlabvposition /// + cionly /// + citop /// + cismooth /// + ciopts /// + cirecast /// + ifopt /// + weightopt /// + key /// + { + c_local `opt'_`anything' `"``opt''"' + } +end + +program parse_offset + local offset = `0' + local 0 `", offset(`offset')"' + syntax [, offset(numlist max=1) ] + c_local offset `offset' +end + +program parse_models // input: "j k model \ model ..., opts" + gettoken j 0 : 0 + gettoken k 0 : 0 + local i 0 + local empty 1 + while (`"`macval(0)'"'!="") { + gettoken model 0 : 0, parse("\") bind + if `"`macval(model)'"'=="\" { + if `empty' { + local ++i + c_local model_`j'_`k'_`i' "." // use active model + } + else local empty 1 + continue + } + _parse comma model opts : model + if `"`macval(0)'"'=="" { // get plotopts if last + gettoken comma plotopts : opts, parse(",") // strip comma + local opts + } + if `"`model'`macval(opts)'"'!="" { // skip last if empty + local empty 0 + if strpos(`"`model'"',"(") { // mat(...) + local ++i + c_local model_`j'_`k'_`i' `"`model'`macval(opts)'"' + } + else { + if `"`model'"'=="" local model . + foreach ename of local model { + if strpos(`"`ename'"',"*") | strpos(`"`ename'"',"?") { + qui estimates dir `ename' + local ename `"`r(names)'"' + } + foreach mm of local ename { + local ++i + c_local model_`j'_`k'_`i' `"`mm'`macval(opts)'"' + } + } + } + } + } + if `i'==0 { // check if empty + local i 1 + c_local model_`j'_`k'_1 "." // use active model + } + c_local n_models_`j'_`k' `i' + c_local opts `macval(plotopts)' +end + +program parse_model // input: "name, opts" or "matrix(name[...]), opts" + _parse comma 0 opts : 0 + gettoken comma opts : opts, parse(",") // strip comma + capt parse_model_matrix, `0' // returns model, matrix + if _rc { + gettoken model rest : 0 + if `"`rest'"'!="" { + di as err `"`rest' not allowed"' + exit 198 + } + if `"`model'"'=="" local model . + } + c_local model `"`model'"' + c_local matrix `"`matrix'"' + c_local opts `macval(opts)' +end +program parse_model_matrix + syntax, Matrix(str) + gettoken model : matrix, parse(" [") + if `"`model'"'=="" error 198 + c_local model `"`model'"' + c_local matrix `"`matrix'"' +end + +program merge_modelopts + syntax [, _opts0(str asis) * ] + _merge_modelopts, `macval(options)' + _merge_modelopts _opt0_, `macval(_opts0)' + if `"`sename'"'!="" local _opt0_vname + if `"`vname'"'!="" local _opt0_sename + if `"`asequation'"'!="" local _opt0_asequation2 + local 0 + foreach opt of local opts { // opts is set by _merge_modelopts + if `"``opt''"'!="" { + if "`opt'"=="mlabels2" { + c_local mlabels2 ``opt'' + } + else { + local 0 `macval(0)' `macval(`opt')' + } + } + else { + if "`opt'"=="mlabels2" { + c_local mlabels2 `_opt0_`opt'' + } + else { + local 0 `macval(0)' `macval(_opt0_`opt')' + } + } + } + c_local modelopts `macval(0)' + c_local options `options' + c_local _opts0 `_opt0_options' +end +program _merge_modelopts + syntax [anything] [, /// + OMITted /// + BASElevels /// + Bname(passthru) /// + ATname ATname2(passthru) /// + SWAPnames /// + keep(passthru) /// + drop(passthru) /// + rename(passthru) /// + EQREName(passthru) /// + ASEQuation ASEQuation2(passthru) /// + eform EFORM2(passthru) /// + rescale(passthru) /// + TRANSform(passthru) /// + MLABELS2(passthru) /// + noci /// + Levels(passthru) /// + CIname(passthru) /// + Vname(passthru) /// + SEname(passthru) /// + DFname(passthru) /// + citype(passthru) /// + aux(passthru) /// + * ] + if "`atname'"!="" & `"`atname2'"'=="" local atname2 "atname2(at)" + if `"`asequation2'"'!="" local asequation + if "`eform'"!="" & `"`eform2'"'=="" local eform2 "eform2(*)" + if `"`sename'"'!="" & `"`vname'"'!="" { + di as err "se() and v() not both allowed" + exit 198 + } + local opts /// + omitted /// + baselevels /// + bname /// + atname2 /// + swapnames /// + keep /// + drop /// + rename /// + eqrename /// + asequation /// + asequation2 /// + eform2 /// + rescale /// + transform /// + mlabels2 /// + ci /// + levels /// + ciname /// + vname /// + sename /// + dfname /// + citype /// + aux + foreach opt of local opts { + c_local `anything'`opt' `macval(`opt')' + } + c_local `anything'options `options' + c_local opts `opts' +end + +program collect_coefs + gettoken model 0 : 0 + gettoken matrix 0 : 0 // matrix mode? + gettoken atmode 0 : 0 // whether at() is used + gettoken i 0 : 0 // plot number + gettoken j 0 : 0 // subgraph number + gettoken cis 0 : 0 // cismooth levels + + // get options + merge_modelopts `macval(0)' // returns modelopts, mlabels2, options, _opts0 + local 0 , `macval(modelopts)' `mlabels2' `options' `_opts0' + syntax [, /// + OMITted /// + BASElevels /// + Bname(str) /// + ATname2(str) /// + SWAPnames /// + keep(str asis) /// + drop(str asis) /// + rename(str asis) /// + EQREName(str asis) /// + ASEQuation ASEQuation2(str) /// + EFORM2(str asis) /// + rescale(str asis) /// + TRANSform(str asis) /// + MLABELS2(str asis) /// + noci /// + Levels(numlist) /// + CIname(str asis) /// + Vname(str) /// + SEname(str) /// + DFname(str) /// + citype(str) /// + aux(str) /// + ] + if `"`atname2'"'!="" { + if "`atmode'"=="0" { + di as err "must specify at for all or none" + exit 198 + } + local atmode 1 + parse_at_transform `atname2' // replaces atname2, returns attransform + capt parse_at_is_matrix, `atname2' // syntax at(matrix(...)) + } + else { + if "`atmode'"=="1" { + di as err "must specify at for all or none" + exit 198 + } + local atmode 0 + } + if `"`macval(rename)'"'!="" { + parse_rename `macval(rename)' + } + if `"`macval(eqrename)'"'!="" { + parse_eqrename `macval(eqrename)' + } + if "`cis'"!="" local ci // disable noci + parse_cilevels `"`levels'"' `"`ciname'"' "`cis'" // returns levels, ciname + parse_citype, `citype' // replaces citype + if `"`matrix'"'!="" local bname `"`matrix'"' + if "`asequation'"!="" & `"`asequation2'"'=="" { + if "`model'"=="." local asequation2 "_" + else local asequation2 `"`model'"' + } + if `"`aux'"'!="" { + parse_aux `aux' // returns aux + } + // collect results + local empty 0 + local equation + mata: coefplot_keepdrop(COEFPLOT_STRUCT) // returns empty, n_ci, equation + if `empty' { + local n_ci 0 + di as txt /// + `"(`model': no coefficients found, all dropped, or none kept)"' + } + + // returns + c_local equation `equation' + c_local atmode `atmode' + c_local n_ci `n_ci' + if `"`mlabels2'"'!="" { + c_local mlabel_`i' mlabel(@mlbl) + c_local mlabvposition_`i' mlabvposition(@mlpos) + } +end + +program parse_at_transform + syntax [anything] [, Transform(str) ] + if `"`anything'"'=="" local anything at + c_local atname2 `"`anything'"' + c_local attransform `"`transform'"' +end + +program parse_at_is_matrix + syntax, Matrix(str) + c_local atname2 `"`matrix'"' + c_local atismatrix "matrix" +end + +program parse_rename + mata: coefplot_parsecomma("rename", "0", "0") + syntax [, Regex] + c_local `eq'rename `"`macval(rename)'"' + c_local `eq'renameregex `regex' +end + +program parse_eqrename + mata: coefplot_parsecomma("rename", "0", "0") + syntax [, Regex] + c_local eqrename `"`macval(rename)'"' + c_local eqrenameregex `regex' +end + +program parse_aux // remove spaces in aux() + gettoken s 0 : 0, bind + while (`"`s'"'!="") { + local s = subinstr(`"`s'"', " ", "", .) + if substr(`"`s'"', 1, 1)=="[" { + local aux `aux'`s' + } + else { + local aux `aux' `s' + } + gettoken s 0 : 0, bind + } + c_local aux `"`aux'"' +end + +program parse_citype + local citypes logit probit atanh log + syntax [, `citypes' NORMal ] + local citype `logit' `probit' `atanh' `log' `normal' + if `: list sizeof citype'>1 { + di as err "citype(): only one of logit, probit, atanh, log, and normal allowed" + exit 198 + } + local citype: list posof "`citype'" in citypes + c_local citype `citype' +end + +program parse_cilevels + args levels names cis + if "`cis'"!="" { + foreach level of local cis { + local ll `ll' `level' + local nn `"`nn'`space'"""' + local space " " + } + } + while (1) { + gettoken l levels : levels + gettoken n names : names, match(paren) + if `"`l'`n'"'=="" { + continue, break + } + if `"`n'"'=="" { + parse_cilevel, levels(`l') // returns level + local ll `ll' `level' + local nn `"`nn'`space'"""' + } + else { + capt confirm number `n' + if _rc { + gettoken empty : n + if `"`empty'"'=="" { // set default level + parse_cilevel // returns level + local ll `ll' `level' + } + else { + local ll `ll' . + } + local nn `"`nn'`space'`"`n'"'"' + } + else { + parse_cilevel, levels(`n') // returns level + local ll `ll' `level' + local nn `"`nn'`space'"""' + } + } + local space " " + } + if `"`ll'"'=="" { // set default level + parse_cilevel // returns level + local ll `level' + local nn `""""' + } + c_local levels `ll' + c_local ciname `"`nn'"' +end +program parse_cilevel + syntax [, level(cilevel) levels(numlist min=1 max=1 >0 <100) ] + if `"`levels'"'=="" { + c_local level `level' + } + else { + c_local level `levels' + } +end + +program parse_cismooth + syntax anything(name=j) [, Color(str) PSTYle(passthru) n(int 50) /// + Intensity(numlist min=2 max=2 >=0 <=100) /// + LWidth(numlist min=2 max=2 >=0 <=1000) ] + if `n'<4 { + di as err "cismooth(n()) must be >= 4" + exit 198 + } + if "`intensity'"!="" { + gettoken imin imax : intensity + } + else { + local imin = (1+3) / (ceil(`n'/2)+3) * 100 + local imax 100 + } + if "`lwidth'"!="" { + gettoken wmin wmax : lwidth + local lwidth + } + else { + local wmin 2 + local wmax 15 + } + local d = 100/`n' + local lmax = 100 - `d'/2 + forv i = 1/`n' { + if mod(`i',2)==0 { + local l = `d'/2 + (`i'/2-1)*`d' + } + else { + local l = `d'/2 + (`n'-`i'/2-.5)*`d' + } + local levels `levels' `=string(`l')' + local inten = (`imin' + (`imax'-`imin') / (ceil(`n'/2)-1) * /// + (ceil(`i'/2)-1))/100 + local intens `intens' `=string(`inten')' + local lw = 4 + (`l'-1)/(`lmax'-1) * (100-4) // if n=50 max lw is 25 + local lw = 100 / `lw' + local lw = `wmin' + (`lw'-1) / (25-1) * (`wmax'-`wmin') + local lwidth `lwidth' `=string(`lw')' + } + c_local cis_levels_`j' `levels' + c_local cis_n_`j' `n' + c_local cis_intens_`j' `intens' + c_local cis_lwidth_`j' `lwidth' + c_local cis_color_`j' `"`color'"' + c_local cis_pstyle_`j' `"`pstyle'"' +end + +program get_pstyle_id + syntax anything(name=i) [, PSTYle(str) ] + if `"`pstyle'"'=="" { + local id `i' + } + else { + local id = substr(`"`pstyle'"', 2, 2) // p##... + capt confirm number `id' + if _rc { + local id = substr(`"`pstyle'"', 2, 1) // p#... + capt confirm number `id' + } + if _rc { // invalid pstyle + local id `i' + } + } + c_local pstyle_id `id' +end + +program parse_ciopts_nocilwincr + syntax anything(name=i) [, recast(str) LWidth(str) * ] + if `"`recast'`lwidth'"'!="" { + c_local nocilwincr_`i' 1 + } +end + +program parse_ciopts_recast_pstyle + syntax [, recast(str) PSTYle(str) * ] + if `"`pstyle'"'!="" { + local options `options' pstyle(`pstyle') + } + c_local cirecast `"`recast'"' + c_local cipstyle `"`pstyle'"' + c_local ciopts `options' +end + +program set_pstyle + args i recast + if `"`recast'"'=="" { + c_local pstyle pstyle(p`i') + exit + } + if inlist(`"`recast'"', "line", "rline") /// + c_local pstyle pstyle(p`i'line) + else if inlist(`"`recast'"', "area", "rarea") /// + c_local pstyle pstyle(p`i'area) + else if inlist(`"`recast'"', "bar", "rbar") /// + c_local pstyle pstyle(p`i'bar) + else if inlist(`"`recast'"', "dot") /// + c_local pstyle pstyle(p`i'dot) + else c_local pstyle pstyle(p`i') +end + +program parse_ciopts + gettoken j 0 : 0 + gettoken n 0 : 0 + gettoken opt 0 : 0, bind + local opts + while (`"`opt'"'!="") { // get rid of possible spaces between opt and () + gettoken paren: opt, parse("(") + if `"`paren'"'=="(" { + local opts `opts'`opt' + } + else { + local opts `opts' `opt' + } + gettoken opt 0 : 0, bind + } + local ciopts `", `opts'"' + gettoken opt opts : opts, bind + local i 0 + while (`"`opt'"'!="") { + local ++i + gettoken optname optcontents : opt, parse("(") + if `"`optcontents'"'=="" { + gettoken opt opts : opts, bind + continue + } + _parse factor ciopts : ciopts, option(`optname') to(`optname'(X)) + gettoken opt opts : opts, bind + } + _parse factordot ciopts : ciopts, n(`n') + // _parse combine only works up to p20 + gettoken opt ciopts : ciopts // get rid of comma + gettoken opt ciopts : ciopts, bind // get first opt + while (`"`opt'"'!="") { + mata: coefplot_combine_ciopts() // appends opt_# or options + gettoken opt ciopts : ciopts, bind // get next opt + } + forv i=1/`n' { + c_local ciopts_`j'_`i' `opt_`i'' `options' + } +end + +program parse_mlabel_exp + syntax [ , MLabel(str asis) ] + c_local mlblexp `"`mlabel'"' +end + +program coeflbls + args labels interact + mata: coefplot_get_coefs(COEFPLOT_STRUCT) + local i 0 + foreach v of local coefs { + local ++i + if (`"`v'"'=="") continue // gap from order() + if (`"`v'"'==`"`last'"') { + mata: coefplot_add_label(COEFPLOT_STRUCT, "coef", `i', "coeflbl", 1) + continue + } + mata: coefplot_get_coeflbl(COEFPLOT_STRUCT, `i') + if `"`coeflbl'"'=="" { + if `"`labels'"'!="" { + local coeflbl `"`v'"' + } + else { + compile_xlabel, v(`v') interact(`interact') // returns coeflbl + } + } + mata: coefplot_add_label(COEFPLOT_STRUCT, "coef", `i', "coeflbl", 1) + } +end + +program compile_xlabel + syntax [, v(str) interact(str) ] + gettoken vi vrest: v, parse("#") + while (`"`vi'"') !="" { + local xlabi + if `"`vi'"'=="#" { + local xlabi `"`interact'"' + } + else if strpos(`"`vi'"',".")==0 { + capt confirm variable `vi', exact + if _rc==0 { + local xlabi: var lab `vi' + } + if `"`xlabi'"'=="" { + local xlabi `"`vi'"' + } + } + else { + gettoken li vii : vi, parse(".") + gettoken dot vii : vii, parse(".") + capt confirm variable `vii', exact + if _rc==0 & `"`vii'"'!="" { + capt confirm number `li' + if _rc { + local xlabi: var lab `vii' + if (`"`xlabi'"'=="") local xlabi `"`vii'"' + if (substr(`"`li'"',1,1)=="c") /// + local li = substr(`"`li'"',2,.) + if (`"`li'"'!="") local xlabi `"`li'.`xlabi'"' + } + else { + local viilab : value label `vii' + if `"`viilab'"'!="" { + local xlabi: label `viilab' `li' + } + else { + local viilab: var lab `vii' + if (`"`viilab'"'=="") local viilab `"`vii'"' + local xlabi `"`viilab'=`li'"' + } + } + } + if `"`xlabi'"'=="" { + local xlabi `"`vi'"' + } + } + local xlab `"`xlab'`xlabi'"' + gettoken vi vrest: vrest, parse("#") + } + c_local coeflbl `"`xlab'"' +end + +program set_by_and_plot_labels + args plot by + // plot + capt label drop `plot' + qui levelsof `plot', local(levels) + foreach l of local levels { + mata: coefplot_get_plotlbl(COEFPLOT_STRUCT, `l') // returns plotlbl + lab def `plot' `l' `"`plotlbl'"', add + } + lab val `plot' `plot', nofix + // by + capt label drop `by' + qui levelsof `by', local(levels) + foreach l of local levels { + mata: coefplot_get_bylbl(COEFPLOT_STRUCT, `l') // returns bylbl + lab def `by' `l' `"`bylbl'"', add + } + lab val `by' `by', nofix +end + +program get_axis_labels + args x eq grp grid groups + // eqlabels + qui levelsof `eq', local(levels) + local j 0 + foreach l of local levels { + local ++j + su `x' if `eq'==`l', meanonly + local pos = string(r(min) + (r(max)-r(min))/2) + local pos: list retok pos + mata: coefplot_get_eqlbl(COEFPLOT_STRUCT, `j') // returns eqlbl + local eqlabels `eqlabels' `pos' `"`eqlbl'"' + } + c_local eqlabels `"`eqlabels'"' + // groups + if `"`groups'"'!="" { + local j 0 + foreach glab of local groups { + local ++j + foreach l of local levels { // equations (from above) + su `x' if `grp'==`j' & `eq'==`l', mean + if r(N)>0 { + local pos = string(r(min) + (r(max)-r(min))/2) + local pos: list retok pos + local glbls `glbls' `pos' `"`glab'"' + } + } + } + c_local groups `glbls' + } + // ticks and xlabels + mata: coefplot_ticks_and_labels(COEFPLOT_STRUCT) + c_local xrange `xrange' + c_local xlabels `xlabels' + c_local xgrid `xgrid' +end + +program merge_eqlabels_hlbls + args eqlab hlab + gettoken lab eqlab : eqlab // skip value + gettoken lab eqlab : eqlab, quotes + while (`"`lab'"'!="") { + gettoken val hlab : hlab + local hlbls `"`hlbls'`val' `lab' "' + gettoken lab eqlab : eqlab // skip value + gettoken lab eqlab : eqlab, quotes + } + c_local hlbls `"`hlbls'"' + c_local eqlabels "" +end + +program truncwrap_vlabels + args v n trunc wrap break + forv i = 1/`n' { + local lbl: label `v' `i' + truncwrap_label lbl "`trunc'" "`wrap'" "`break'" `"`lbl'"' + // may fail if label contains compound quotes + lab def `v' `i' `"`lbl'"', modify + } +end + +program truncwrap_labels + args local trunc wrap break lbls + local labels + local skip 1 + foreach lbl of local lbls { + if `skip' { + local labels `labels' `lbl' + local skip 0 + continue + } + truncwrap_label lbl "`trunc'" "`wrap'" "`break'" `"`lbl'"' + // may fail if label contains compound quotes + local labels `labels' `"`lbl'"' + local skip 1 + } + c_local `local' `"`labels'"' +end + +program truncwrap_label + args local trunc wrap break lbl + capt mata: coefplot_lbl_is_multiline() // error if label is multiline + if _rc exit + if "`break'"!="" local break ", `break'" + if "`trunc'"!="" { + local lbl: piece 1 `trunc' of `"`lbl'"'`break' + capt truncwrap_label_check_quotes `"`lbl'"' + if _rc exit + } + if "`wrap'"!="" { + local i 0 + local space + while (1) { + local ++i + local piece: piece `i' `wrap' of `"`lbl'"'`break' + capt truncwrap_label_check_quotes `"`piece'"' + if _rc exit + if `"`piece'"'=="" { + if `i'==1 { + local newlbl `"`lbl'"' // lbl is empty + } + else if `i'==2 { // workaround for multiline label graph bug + local newlbl `"`newlbl'`space'"""' + } + continue, break + } + local newlbl `"`newlbl'`space'`"`piece'"'"' + local space " " + } + local lbl `"`newlbl'"' + } + c_local `local' `"`lbl'"' +end +program truncwrap_label_check_quotes // checks for unmatched compound quotes + syntax [anything] +end + +program set_labels + args v n lbls + local i 0 + foreach lbl of local lbls { + local ++i + if `i'>`n' continue, break + lab def `v' `i' `"`lbl'"', modify + } +end + +program reset_xlabels + args lbls xlbls + local labels + local skip 1 + foreach lbl of local xlbls { + if `skip' { + local labels `labels' `lbl' + local skip 0 + continue + } + if `"`lbls'"'!="" { + gettoken lbl lbls : lbls + } + local labels `labels' `"`lbl'"' + local skip 1 + } + c_local xlabels `"`labels'"' +end + +version 11 +mata: +mata set matastrict on + +struct coefplot_struct +{ + real scalar r, xmin + + real colvector b, V, se, t, df, pval, at, plot, by, eq, grp, mlpos + real matrix ci, aux + + string colvector coefnm, eqnm, coeflbl, eqlbl, plotlbl, bylbl, mlbl, trans +} + +struct coefplot_struct scalar coefplot_struct_init() +{ + struct coefplot_struct scalar C + + return(C) +} + +void coefplot_keepdrop(struct coefplot_struct scalar C) +{ + real scalar i, j, level, r, brow, bcol, row, col, emode, + firsteqonly, meqs, citype + real colvector b, p, at, V, se, t, df, pval, mlpos + real matrix ci, aux, tmp + string scalar model, bname, cname, rename, attrans, attmp + string rowvector keep, drop, cnames, levels, llul + string colvector eqnm, coefnm, mlbl, trans + + // get results + emode = (st_local("matrix")=="") + // - coefficients + model = st_local("model") + bname = st_local("bname") + if (bname=="") { + if (st_global("e(mi)")=="mi") bname = "b_mi" + else bname = "b" + } + coefplot_parse_input(model, "b", bname, brow, bcol) + if (emode) bname = "e(" + bname + ")" + b = st_matrix(bname) + if (b==J(0,0,.)) { + st_local("empty", "1") + return + } + coefplot_invalid_subscript(model, bname, b, brow, bcol) + b = b[brow, bcol] + if (brow<.) { + b = b' + eqnm = st_matrixcolstripe(bname)[.,1] + coefnm = st_matrixcolstripe(bname)[.,2] + } + else { + eqnm = st_matrixrowstripe(bname)[.,1] + coefnm = st_matrixrowstripe(bname)[.,2] + } + _editvalue(eqnm, "", "_") + meqs = !allof(eqnm, eqnm[1]) + r = rows(b) + // - get variances and standard errors + se = J(r,1,.) + V = J(r,1,.) + if ((cname = st_local("sename"))!="") { + coefplot_parse_cname(model, "se", cname, row, col, emode, 0, bname, brow, bcol) + tmp = st_matrix(cname) + if (coefplot_notfound(model, cname, tmp)==0) { + coefplot_invalid_subscript(model, cname, tmp, row, col) + tmp = tmp[row, col] + if (row<.) tmp = tmp' + if (coefplot_notconformable(model, cname, tmp, r, 1)==0) { + se = tmp + V = tmp:^2 + } + } + } + else if ((cname = st_local("vname"))!="") { + if (emode) cname = "e(" + cname + ")" + tmp = st_matrix(cname) + if (coefplot_notfound(model, cname, tmp)==0) { + if (coefplot_notconformable(model, cname, tmp, r, r)==0) { + V = diagonal(tmp) + se = sqrt(V) + } + } + } + else if (emode){ + if (st_global("e(mi)")=="mi") cname = "e(V_mi)" + else cname = "e(V)" + tmp = st_matrix(cname) + if (coefplot_notfound(model, cname, tmp, 1)==0) { + if (coefplot_notconformable(model, cname, tmp, r, r, 1)==0) { + V = diagonal(tmp) + se = sqrt(V) + } + } + } + // - get DFs + df = J(r,1,.) + if ((cname = st_local("dfname"))!="") { + if (strtoreal(cname)<. | cname==".") { + df = J(r, 1, strtoreal(cname)) + } + else { + coefplot_parse_input(model, "df", cname, row, col) + if (emode) cname = "e(" + cname + ")" + tmp = st_matrix(cname) + if (coefplot_notfound(model, cname, tmp)==0) { + coefplot_invalid_subscript(model, cname, tmp, row, col) + tmp = tmp[row, col] + if (row<.) tmp = tmp' + if (coefplot_notconformable(model, cname, tmp, r, 1)==0) { + df = tmp + } + } + } + } + else if (emode) { + if ((st_global("e(mi)")=="mi") & + (tmp=st_matrix("e(df_mi)")')!=J(0,0,.)) { + if (coefplot_notconformable(model, "e(df_mi)", tmp, r, 1)==0) { + df = tmp + } + } + else if (st_numscalar("e(df_r)")!=J(0,0,.)) { + df = J(r, 1, st_numscalar("e(df_r)")) + } + } + // - CIs + ci = J(r, 0, .) + if (st_local("ci")=="") { + cnames = tokens(st_local("ciname")) + levels = tokens(st_local("levels")) + citype = strtoreal(st_local("citype")) + for (j=1; j<=cols(levels); j++) { + ci = ci, J(r, 2, .) + if ((cname = strtrim(cnames[j]))!="") { + if (cols(tokens(cname))==1) { // "name" + llul = (cname+"[1]", cname+"[2]") + } + else { + if (strpos(cname, "[")==0) { // "ll ul" + llul = tokens(cname) + if (cols(llul)!=2) { + printf("{txt}(%s: invalid syntax in %s)\n", + model, "ci()") + exit(error(198)) + } + } + else { + if (strpos(cname, "]")==strlen(cname)) { // "ll ul[]" + llul = (substr(cname, 1, strpos(cname, " ")-1), + substr(cname, strpos(cname, " ")+1, .)) + } + else { // "ll[] ul[]" + llul = (substr(cname, 1, strpos(cname, "]")), + substr(cname, strpos(cname, "]")+1, .)) + } + } + } + for (i=1; i<=2; i++) { + cname = llul[i] + coefplot_parse_cname(model, "ci", cname, row, col, emode, + 0, bname, brow, bcol) + tmp = st_matrix(cname) + if (coefplot_notfound(model, cname, tmp)==0) { + coefplot_invalid_subscript(model, cname, tmp, row, col) + tmp = tmp[row, col] + if (row<.) tmp = tmp' + if (coefplot_notconformable(model, cname, tmp, r, 1)==0) { + ci[,(j*2-2+i)] = tmp + } + } + } + } + else { + level = 1 - (1 - strtoreal(levels[j])/100)/2 + tmp = J(r, 1, .) + for (i=1; i<=r; i++) { + tmp[i] = df[i]>2e17 ? invnormal(level) : + invttail(df[i], 1-level) + } + if (citype==1) { // logit + tmp = tmp :* se :/ (b:* (1 :- b)) + ci[|1,(j*2-1) \ .,(j*2)|] = + invlogit((logit(b) :- tmp, logit(b) :+ tmp)) + } + else if (citype==2) { // probit + tmp = tmp :* se :/ normalden(invnormal(b)) + ci[|1,(j*2-1) \ .,(j*2)|] = + normal((invnormal(b) :- tmp, invnormal(b) :+ tmp)) + } + else if (citype==3) { // atanh + tmp = tmp :* se :/ (1 :- b:^2) // missing if b in {-1,1} + ci[|1,(j*2-1) \ .,(j*2)|] = + tanh((atanh(b) :- tmp, atanh(b) :+ tmp)) + } + else if (citype==4) { // log + tmp = tmp :* se :/ b + ci[|1,(j*2-1) \ .,(j*2)|] = exp((ln(b) :- tmp, ln(b) :+ tmp)) + } + else { // normal + ci[|1,(j*2-1) \ .,(j*2)|] = (b :- tmp:*se, b :+ tmp:*se) + } + } + } + } + // - at + at = J(r,1,1) + cname = st_local("atname2") + if ((cname!="") & (cname!="_coef") & (cname!="_eq")) { + if ( emode & + st_global("e(cmd)")=="margins" & + (st_local("bname")=="" | st_local("bname")=="b") & + (st_numscalar("e(k_at)")!=J(0,0,.) ? + st_numscalar("e(k_at)")>0 : 0) & + (cname=="at" | strtoreal(cname)<.) + ) + { + if (cname=="at") cname = "1" + at = coefplot_get_margins_at("e", strtoreal(cname), coefnm)' + // (modifies coefnm) + } + else { + coefplot_parse_cname(model, "at", cname, row, col, emode, + st_local("atismatrix")!="", bname, brow, bcol) + tmp = st_matrix(cname) + if (coefplot_notfound(model, cname, tmp)==0) { + coefplot_invalid_subscript(model, cname, tmp, row, col) + tmp = tmp[row, col] + if (row<.) tmp = tmp' + if (coefplot_notconformable(model, cname, tmp, r, 1)==0) { + at = tmp + } + } + } + } + // - auxiliary variables + cnames = tokens(st_local("aux")) // spaces in mspec not allowed + aux = J(r, cols(cnames), .) + for (j=1; j<=cols(cnames); j++) { + cname = cnames[j] + coefplot_parse_cname(model, "aux", cname, row, col, emode, 0, bname, brow, bcol) + tmp = st_matrix(cname) + if (coefplot_notfound(model, cname, tmp)==0) { + coefplot_invalid_subscript(model, cname, tmp, row, col) + tmp = tmp[row, col] + if (row<.) tmp = tmp' + if (coefplot_notconformable(model, cname, tmp, r, 1)==0) { + aux[,j] = tmp + } + } + } + + // keep, drop, etc. + // - clear "bn" + coefnm = subinstr(coefnm,"bn.", ".") // #bn. + coefnm = subinstr(coefnm,"bno.", "o.") // #bno. + // - remove omitted + p = J(r, 1, 1) + if (st_local("omitted")=="") { + p = p :* (!strmatch(coefnm, "*o.*")) + } + else { + coefnm = substr(coefnm, 1:+2*(substr(coefnm, 1, 2):=="o."), .) // o. + coefnm = subinstr(coefnm, "o.", ".") // #o. + } + // - remove baselevels + if (st_local("baselevels")=="") { + p = p :* (!strmatch(coefnm, "*b.*")) + } + else { + coefnm = subinstr(coefnm, "b.", ".") // #b. + } + // keep + firsteqonly = 1 + keep = st_local("keep") + if (keep!="") { + keep = coefplot_parse_namelist(keep, "", "keep") + if (!allof(keep[,1], "")) firsteqonly = 0 + keep[,1] = editvalue(keep[,1],"","*") + p = p :* (rowsum(strmatch(eqnm, keep[,1]') :& + strmatch(coefnm, keep[,2]')):>0) + } + // drop + drop = st_local("drop") + if (drop!="") { + drop = coefplot_parse_namelist(drop, "", "drop") + if (!allof(drop[,1], "")) firsteqonly = 0 + drop[,1] = editvalue(drop[,1],"","*") + p = p :* (!(rowsum(strmatch(eqnm, drop[,1]') :& + strmatch(coefnm, drop[,2]')))) + } + // equation + if (firsteqonly) { + for (i=1; i<=r; i++) { // look for first nonzero equation + if (p[i]==1) { + p = p :* (eqnm:==eqnm[i]) + break + } + } + } + // apply selection + if (allof(p, 0)) { + st_local("empty", "1") + return + } + b = select(b, p) + V = select(V, p) + se = select(se, p) + df = select(df, p) + ci = select(ci, p) + eqnm = select(eqnm, p) + coefnm = select(coefnm, p) + at = select(at, p) + aux = select(aux, p) + r = rows(b) + // t and p values + t = b:/se + pval = J(r,1,.) + for (i=1; i<=r; i++) { + pval[i] = (df[i]>=. ? 1-normal(abs(t[i])) : ttail(df[i],abs(t[i])))*2 + } + + // eform + coefplot_eform(b, ci, eqnm, coefnm) + + // rescale + coefplot_rescale(b, ci, eqnm, coefnm) + + // collect transforms + trans = coefplot_collect_transforms(eqnm, coefnm) + + // collect mlabels + mlbl = J(r,1,"") + mlpos = J(r,1,.) + coefplot_mlabels(mlbl, mlpos, eqnm, coefnm) + + // rename + rename = st_local("rename") + if (rename!="") { + coefplot_rename(rename, st_local("renameregex")!="", + eqnm, coefnm) // modifies coefnm + } + + // rename equations and swap names + if (st_local("asequation2")!="") { + eqnm = J(r, 1, st_local("asequation2")) + } + rename = st_local("eqrename") + if (rename!="") { + coefplot_rename(rename, st_local("eqrenameregex")!="", + J(r, 1, ""), eqnm) // modifies eqnm + } + + // at is coef or eq + if (st_local("atname2")=="_coef") { + at = strtoreal(coefnm) + } + else if (st_local("atname2")=="_eq") { + at = strtoreal(eqnm) + } + + // apply at transform + if ((attrans=st_local("attransform"))!="") { + attmp = st_tempname() + attrans = subinstr(attrans, "@", "scalar(" + attmp + ")") + for (i=1; i<=r; i++) { + st_numscalar(attmp, at[i]) + stata("scalar " + attmp + " = " + attrans) + at[i] = st_numscalar(attmp) + } + } + + // check missings + coefplot_missing(model, b) + for (j=1; j<=cols(levels); j++) { + coefplot_cimissing(model, j, ci[|1,(j*2-1) \ .,(j*2)|]) + } + coefplot_atmissing(model, at) + + // return + if (st_local("swapnames")!="") swap(coefnm, eqnm) + st_local("n_ci", strofreal(cols(ci)/2)) + if (cols(C.ci)>cols(ci)) { + ci = ci, J(rows(ci), cols(C.ci)-cols(ci), .) + } + else if (cols(C.ci)cols(aux)) { + aux = aux, J(rows(aux), cols(C.aux)-cols(aux), .) + } + else if (cols(C.aux)rows(b)) | (col<. & col>cols(b))) { + printf("{err}%s: invalid subscript for %s\n", model, opt) + exit(503) + } +} + +void coefplot_parse_input(string scalar model, string scalar opt, + string scalar s, real scalar row, real scalar col) +{ + transmorphic t + string scalar r, c + string rowvector tokens + + t = tokeninit(" ", ("[", "]", ",")) + tokenset(t, s) + tokens = tokengetall(t) + if (cols(tokens)>6) coefplot_parse_input_error(model, opt) + if (!st_isname(tokens[1])) coefplot_parse_input_error(model, opt) + s = tokens[1] + if (cols(tokens)==1) { // "name" + row = 1; col = . + return + } + if (cols(tokens)<4) coefplot_parse_input_error(model, opt) + if (tokens[2]!="[" | tokens[cols(tokens)]!="]") + coefplot_parse_input_error(model, opt) + if (cols(tokens)==4) { // name[#] + r = tokens[3] + c = "." + } + else if ((r=tokens[3])==",") { // name[,#] + if (cols(tokens)!=5) coefplot_parse_input_error(model, opt) + r = "." + c = tokens[4] + } + else { // name[#,] or name[#,.] or name[.,#] + if (tokens[4]!=",") coefplot_parse_input_error(model, opt) + r = tokens[3] + if (cols(tokens)==5) c = "." + else c = tokens[5] + } + if (((r==".") + (c=="."))!=1) coefplot_parse_input_error(model, opt) + if (r==".") row = . + else row = coefplot_parse_input_num(model,opt, r) + if (c==".") col = . + else col = coefplot_parse_input_num(model,opt, c) +} + +real scalar coefplot_parse_input_num(string scalar model, string scalar opt, + string scalar s) +{ + real scalar num + + num = strtoreal(s) + if (missing(num)) coefplot_parse_input_error(model, opt) + return(num) +} + +void coefplot_parse_input_error(string scalar model, string scalar opt) +{ + printf("{err}%s: invalid syntax in %s()\n", model, opt) + exit(198) +} + +void coefplot_parse_cname(string scalar model, string scalar opt, + string scalar cname, real scalar row, real scalar col, real scalar emode, + real scalar atismat, string scalar bname, real scalar brow, real scalar bcol) +{ + if (emode) { + coefplot_parse_input(model, opt, cname, row, col) + if (!atismat) cname = "e(" + cname + ")" + } + else { + if (coefplot_parse_input_isposint(cname)) { + row = brow; col = bcol + if (row<.) row = strtoreal(cname) + else col = strtoreal(cname) + cname = bname + } + else coefplot_parse_input(model, opt, cname, row, col) + } +} + +real scalar coefplot_parse_input_isposint(string scalar cname) +{ + real scalar n + + n = strtoreal(cname) + return(!missing(n) & n==trunc(n) & n>0) +} + +real scalar coefplot_notfound( + string scalar model, string scalar name, real matrix e, | real scalar q) +{ + if (e==J(0,0,.)) { + if (args()<4 | q==0) { + printf("{txt}(%s: %s not found)\n", model, name) + } + return(1) + } + return(0) +} + +real scalar coefplot_notconformable( + string scalar model, string scalar name, real matrix e, + real scalar r, real scalar c, | real scalar q) +{ + if (rows(e)!=r | cols(e)!=c) { + if (args()<6 |q==0) { + printf("{txt}(%s: %s not conformable)\n", model, name) + } + return(1) + } + return(0) +} + +void coefplot_eform(real colvector b, real matrix ci, string colvector eq, + string colvector coef) +{ + real scalar i + string matrix eform + real colvector match, p + + eform = st_local("eform2") + if (eform=="") { + return + } + if (eform=="*") { + b = exp(b) + ci = exp(ci) + return + } + eform = coefplot_parse_namelist(eform, "*", "eform") + match = J(rows(b), 1, 0) + for (i=1; i<=rows(eform); i++) { + p = select(1::rows(match), strmatch(eq, eform[i,1]) :& + strmatch(coef, eform[i,2])) + if (rows(p)==0) continue + match[p] = J(rows(p), 1, 1) + } + p = select(1::rows(match), match) + if (rows(p)==0) return + b[p] = exp(b[p]) + ci[p,] = exp(ci[p,.]) +} + +void coefplot_rescale(real colvector b, real matrix ci, string colvector eq, + string colvector coef) +{ + real scalar i, j + string matrix rescale, names + real colvector c, match, p + + rescale = st_local("rescale") + if (rescale=="") { + return + } + if (strtoreal(rescale)<.) { + c = strtoreal(rescale) + } + else { + rescale = coefplot_parse_matchlist(rescale, "rescale") + c = J(rows(b), 1, 1) + match = J(rows(b), 1, 0) + for (i=1; i<=rows(rescale); i++) { + if (strtoreal(rescale[i,2])>=.) { + display("{err}rescale(): invalid value") + exit(198) + } + names = coefplot_parse_namelist(rescale[i,1], "*", "rescale") + for (j=1; j<=rows(names); j++) { + p = select(1::rows(match), strmatch(eq, names[j,1]) :& + strmatch(coef, names[j,2]) :& (match:==0)) + if (rows(p)==0) continue + c[p] = J(rows(p), 1, strtoreal(rescale[i,2])) + match[p] = J(rows(p), 1, 1) + } + } + } + b = b :* c + ci = ci :* c +} + +string colvector coefplot_collect_transforms(string colvector eq, + string colvector coef) +{ + real scalar i, j + string matrix trans, names + string colvector T + real colvector match, p + + T = J(rows(eq), 1, "") + trans = st_local("transform") + if (trans=="") { + return(T) + } + trans = coefplot_parse_matchlist(trans, "transform") + match = J(rows(eq), 1, 0) + for (i=1; i<=rows(trans); i++) { + names = coefplot_parse_namelist(trans[i,1], "*", "transform") + for (j=1; j<=rows(names); j++) { + p = select(1::rows(match), strmatch(eq, names[j,1]) :& + strmatch(coef, names[j,2]) :& (match:==0)) + if (rows(p)==0) continue + T[p] = J(rows(p), 1, trans[i,2]) + match[p] = J(rows(p), 1, 1) + } + } + return(T) +} + +void coefplot_mlabels(string colvector mlbl, real colvector mlpos, + string colvector eq, string colvector coef) +{ + real scalar i, j + string matrix mlab, names + real colvector match, p + + mlab = st_local("mlabels2") + if (mlab=="") { + return + } + mlab = coefplot_parse_matchlist(mlab, "mlabels", 2) + match = J(rows(eq), 1, 0) + for (i=1; i<=rows(mlab); i++) { + names = coefplot_parse_namelist(mlab[i,1], "*", "mlabels") + for (j=1; j<=rows(names); j++) { + p = select(1::rows(match), strmatch(eq, names[j,1]) :& + strmatch(coef, names[j,2]) :& (match:==0)) + if (rows(p)==0) continue + mlbl[p] = J(rows(p), 1, mlab[i,3]) + mlpos[p] = J(rows(p), 1, strtoreal(mlab[i,2])) + match[p] = J(rows(p), 1, 1) + } + } +} + +void coefplot_rename(string scalar rename, real scalar regex, + string colvector eq, string colvector coef) +{ + real scalar i, j, rl + real colvector p, p0, match + string matrix names + + if (regex) { + rename = coefplot_parse_matchlist(rename, "rename") + p0 = 1::rows(coef) + for (i=1; i<=rows(rename); i++) { + names = coefplot_parse_namelist(rename[i,1], "*", "rename") + for (j=1; j<=rows(names); j++) { + if (rows(p0)==0) return + match = (strmatch(eq[p0], names[j,1]) :& regexm(coef[p0], names[j,2])) + p = select(p0, match) + if (rows(p)==0) continue + coef[p] = coefplot_regexr(coef[p], names[j,2], rename[i,2]) + p0 = select(p0, match:==0) + } + } + return + } + rename = coefplot_parse_matchlist(rename, "rename") + p0 = 1::rows(coef) + for (i=1; i<=rows(rename); i++) { + // syntax: *abc for suffix rename + // abc* for prefix rename + // abc for exact rename + names = coefplot_parse_namelist(rename[i,1], "*", "rename") + for (j=1; j<=rows(names); j++) { + if (rows(p0)==0) return + if (substr(names[j,2],1,1)=="*") { + rl = strlen(names[j,2])-1 + match = strmatch(eq[p0], names[j,1]) :& + (substr(coef[p0], -rl, .):==substr(names[j,2], -rl, .)) + p = select(p0, match) + if (rows(p)==0) continue + coef[p] = substr(coef[p], 1, strlen(coef[p]) :- rl) :+ rename[i,2] + } + else if (substr(names[j,2],-1,1)=="*") { + rl = strlen(names[j,2])-1 + match = strmatch(eq[p0], names[j,1]) :& + (substr(coef[p0], 1, rl):==substr(names[j,2], 1, rl)) + p = select(p0, match) + if (rows(p)==0) continue + coef[p] = rename[i,2] :+ substr(coef[p], 1 + rl, .) + } + else { + match = strmatch(eq[p0], names[j,1]) :& (coef[p0]:==names[j,2]) + p = select(p0, match) + if (rows(p)==0) continue + coef[p] = J(rows(p), 1, rename[i,2]) + } + p0 = select(p0, match:==0) + } + } +} + +string matrix coefplot_regexr(string matrix x, string matrix y, string matrix z) +{ + string matrix res + real scalar r, R, c, C + transmorphic scalar rx, cx, ry, cy, rz, cz + + R = max((rows(x),rows(y),rows(z))) + C = max((cols(x),cols(y),cols(z))) + rx = (rows(x)==1 ? &1 : (rows(x)cols(atstats)) continue + j = atstats[pos] + p = select(1..c, strmatch(coefnm, strofreal(i) + "._at*")') + at[p] = J(1, cols(p), at0[i,j]) + } + return(at) +} + +void coefplot_missing(string scalar model, real colvector b) +{ + if (hasmissing(b)) { + printf("{txt}(%s: b missing for some coefficients)\n", model) + } +} + +void coefplot_atmissing(string scalar model, real colvector at) +{ + if (hasmissing(at)) { + if (nonmissing(at)) { + printf("{txt}(%s: 'at' missing for some coefficients)\n", model) + return + } + printf("{txt}(%s: could not determine 'at')\n", model) + } +} + +void coefplot_cimissing(string scalar model, real scalar ci, real matrix tmp) +{ + if (hasmissing(tmp)) { + if (nonmissing(tmp)) { + printf("{txt}(%s: CI%g missing for some coefficients)\n", + model, ci) + return + } + printf("{txt}(%s: could not determine CI%g)\n", model, ci) + } +} + +void coefplot_add_label(struct coefplot_struct scalar C, + string scalar name, real scalar i, string scalar lbl, real scalar force) +{ + pointer(string colvector) scalar l + + if (name=="plot") l = &C.plotlbl + else if (name=="by") l = &C.bylbl + else if (name=="coef") l = &C.coeflbl + else return + if (rows(*l)1) c = strtoreal(s[2]) + else c = 1 + s = s[1] + // get relevant data + p = p0 + if (subgr<.) { + p = select(p, C.by[p]:==subgr) + if (rows(p)==0) return("") + } + if (plot<.) { + p = select(p, C.plot[p]:==plot) + if (rows(p)==0) return("") + } + if (s=="b") v = C.b[p] + else if (s=="v") v = C.V[p] + else if (s=="se") v = C.se[p] + else if (s=="t") v = C.t[p] + else if (s=="tabs") v = abs(C.t[p]) + else if (s=="df") v = C.df[p] + else if (s=="p") v = C.pval[p] + else if (s=="ll") { + if ((c*2)>cols(C.ci)) return("") + v = C.ci[p,c*2-1] + } + else if (s=="ul") { + if ((c*2)>cols(C.ci)) return("") + v = C.ci[p,c*2] + } + else if (s=="aux") { + if (c>cols(C.aux)) return("") + v = C.aux[p,c] + } + // establish sort order (within equations) + if (desc) v = -v + eqs = C.eqnm[p] + eq = J(rows(eqs),1,1) + for (i=2; i<=rows(eq); i++) { + if (eqs[i]!=eqs[i-1]) eq[i] = eq[i-1]+1 + else eq[i] = eq[i-1] + } + p = sort((eq, v, p), 1..3)[,3] + // collect ordered names + eqs = ("`"+`"""') :+ C.eqnm[p] :+ (`"""' + "'") + coefs = ("`"+`"""') :+ C.coefnm[p] :+ (`"""' + "'") + s = eqs[1] + ": " + coefs[1] + for (i=2; i<=rows(p); i++) { + if (eqs[i]!=eqs[i-1]) s = s + " * " + eqs[i] + ":" + s = s + " " + coefs[i] + } + s = s + " *" + return(s) +} + +void coefplot_order(real colvector p0, string scalar order, + struct coefplot_struct scalar C) +{ + real scalar i, j, k + real colvector p, tag, tmp + string colvector eqs + + if (order=="") return + order = coefplot_parse_namelist(order, "", "order") + if (order[1,1]=="" & !allof(order[,1], "")) { + display("{err}inconsistent order(): " + + "specify equations for all or for none") + exit(198) + } + p = J(0,1,.) + tag = J(C.r, 1, 0) + k = 0 + // order coefficients (general) + if (order[1,1]!="") { + for (i=1; i<=rows(order); i++) { + k++ + if (order[i,2]==".") { + coefplot_appendemptyrow(C, order[i,1], tag, p0) + p = p \ C.r + continue + } + tag = tag :+ (k * strmatch(C.coefnm[p0], order[i,2]) :* !tag :* + (C.eqnm[p0]:==order[i,1])) + if (anyof(tag, k)) { + p = p \ select(p0, tag:==k) + } + } + if (anyof(tag, 0)) { + p = p \ select(p0, tag:==0) + } + swap(p,p0); return + } + // order coefficients within equations + order = order[,2]' + eqs = C.eqnm[p0[1]] + for (i=2; i<=C.r; i++) { // get equations (in right order) + if (C.eqnm[p0[i]]!=C.eqnm[p0[i-1]]) { + eqs = eqs \ C.eqnm[p0[i]] + } + } + for (j=1; j<=rows(eqs); j++) { + for (i=1; i<=cols(order); i++) { + k++ + if (order[i]==".") { + coefplot_appendemptyrow(C, eqs[j], tag, p0) + p = p \ C.r + continue + } + tag = tag :+ (k * strmatch(C.coefnm[p0], order[i]) :* !tag :* + (C.eqnm[p0]:==eqs[j])) + if (anyof(tag, k)) { + p = p \ select(p0, tag:==k) + } + } + tmp = (tag:==0):&(C.eqnm[p0]:==eqs[j]) + if (any(tmp)) { + p = p \ select(p0, tmp) + tag = tag :+ tmp + } + } + swap(p,p0); return +} + +void coefplot_appendemptyrow(struct coefplot_struct scalar C, + string scalar eq, real colvector tag, real colvector p0) +{ + C.b = C.b \ . + C.V = C.V \ . + C.se = C.se \ . + C.t = C.t \ . + C.df = C.df \ . + C.pval = C.pval \ . + C.at = C.at \ 1 + C.aux = C.aux \ J(1, cols(C.aux), .) + C.mlbl = C.mlbl \ "" + C.mlpos = C.mlpos \ . + C.plot = C.plot \ . + C.by = C.by \ . + C.ci = C.ci \ J(1, cols(C.ci), .) + C.coefnm = C.coefnm \ "" + C.eqnm = C.eqnm \ eq + C.trans = C.trans \ "" + tag = tag \ . + C.r = C.r + 1 + p0 = p0 \ C.r +} + +void coefplot_coeflbls(struct coefplot_struct scalar C) +{ + real scalar i, j, k + real colvector tag + string matrix labels, names + + C.coeflbl = J(C.r, 1, "") + tag = J(C.r, 1, 0) + labels = coefplot_parse_matchlist(st_local("coeflabels"), "coeflabels") + for (j=1; j<=rows(labels); j++) { + names = coefplot_parse_namelist(labels[j,1], "*", "coeflabels") + for (k=1; k<=rows(names); k++) { + tag = tag :+ j * strmatch(C.eqnm, names[k,1]) :* + strmatch(C.coefnm, names[k,2]) :* (tag:==0) + } + } + _editmissing(tag, 0) + for (i=1; i<=C.r; i++) { + if (tag[i] & C.plot[i]<.) { // C.plot is missing for gaps from order() + C.coeflbl[i] = labels[tag[i],2] + } + } +} + +void coefplot_multiple_eqs(struct coefplot_struct scalar C) +{ + real scalar i, meqs + string matrix eq + + eq = C.eqnm, strofreal(C.plot), strofreal(C.by) + + _sort(eq, (3,2,1)) + meqs = 0 + for (i=2; i<=rows(eq); i++) { + if (eq[i,1]!=eq[i-1,1] & eq[i,2]==eq[i-1,2] & eq[i,3]==eq[i-1,3]) { + meqs = 1 + break + } + } + if (meqs==0) { + C.eqnm = J(rows(C.eqnm), 1, "_") + } + st_local("meqs", strofreal(meqs)) +} + +void coefplot_bycoefs(struct coefplot_struct scalar C) +{ + real scalar i, j, k, meqs + real colvector p + string scalar eql + string colvector bylbl, last, eqlbls + + meqs = (st_local("meqs")!="0") & (st_local("noeqlabels")=="") + if (meqs) eqlbls = tokens(st_local("eqlabels"))' + bylbl = C.bylbl + C.bylbl = C.coeflbl + swap(C.at, C.by) + j = 0 + k = 1 + for (i=1; i<=C.r; i++) { + if (i>1) { + if (C.eqnm[i]!=C.eqnm[i-1]) k++ + } + if ((C.eqnm[i], C.coefnm[i])!=last) j++ + last = (C.eqnm[i], C.coefnm[i]) + C.by[i] = j + if (meqs) { + if (k<=rows(eqlbls)) eql = eqlbls[k] + else eql = C.eqnm[i] + C.bylbl[j] = eql + ": " + C.bylbl[i] + } + else C.bylbl[j] = C.bylbl[i] + } + C.bylbl = C.bylbl[|1 \ j|] + C.eqnm = J(C.r, 1, "_") + C.coefnm = strofreal(C.at) + C.coeflbl = J(C.r, 1, "") + for (i=1; i<=C.r; i++) { + C.coeflbl[i] = bylbl[C.at[i]] + } + C.at = J(C.r, 1, 1) + p = coefplot_niceorder(C.eqnm, C.coefnm, C.plot, C.by, C.r) + C.b = C.b[p] + C.V = C.V[p] + C.se = C.se[p] + C.t = C.t[p] + C.df = C.df[p] + C.pval = C.pval[p] + C.at = C.at[p] + C.aux = C.aux[p,] + C.mlbl = C.mlbl[p] + C.mlpos = C.mlpos[p] + C.plot = C.plot[p] + C.by = C.by[p] + C.ci = C.ci[p,] + C.coefnm = C.coefnm[p] + C.eqnm = C.eqnm[p] + C.trans = C.trans[p] + C.coeflbl = C.coeflbl[p] + st_local("n_subgr", strofreal(rows(C.bylbl))) +} + +void coefplot_catvals(struct coefplot_struct scalar C) +{ + real scalar i, j, k, e, eqgap, ggap + real colvector pos, at0 + string scalar glbls, xlab + string colvector eqs + string matrix groups, names + + // determine plot positions + for (i=2; i<=C.r; i++ ) { + C.at[i] = C.at[i-1] + + ((C.coefnm[i]!=C.coefnm[i-1]) // new coefficient + | (C.eqnm[i]!=C.eqnm[i-1]) // new equation + | (C.plot[i]==.)) // gap from order() + } + + // reposition + coefplot_relocate(C) + C.xmin = min(C.at) + + // equation numbers and labels + eqs = tokens(st_local("eqlabels"))' + xlab = st_local("eqxlab") + C.eq = J(C.r, 1, 1) + C.eqlbl = J(C.r, 1, "") + j = 1 + if (j>rows(eqs)) C.eqlbl[j] = coefplot_get_xlab(C.eqnm[1], xlab) + else C.eqlbl[j] = eqs[j] + for (i=2; i<=C.r; i++ ) { + C.eq[i] = C.eq[i-1] + if (C.eqnm[i]!=C.eqnm[i-1]) { + j++ + if (j>rows(eqs)) C.eqlbl[j] = coefplot_get_xlab(C.eqnm[i], xlab) + else C.eqlbl[j] = eqs[j] + C.eq[i] = C.eq[i] + 1 + } + } + C.eqlbl = C.eqlbl[|1,1 \ j,.|] + + // group IDs + groups = st_local("groups") + C.grp = J(C.r, 1, 0) + if (groups!="") { + groups = coefplot_parse_matchlist(groups, "groups") + eqs = uniqrows(C.eqnm) + for (e=1; e<=rows(eqs); e++) { + for (j=1; j<=rows(groups); j++) { + names = coefplot_parse_namelist(groups[j,1], "*", "groups") + for (k=1; k<=rows(names); k++) { + C.grp = C.grp :+ j * strmatch(C.eqnm, names[k,1]) :* + strmatch(C.coefnm, names[k,2]) :* (C.grp:==0) :* + (C.eqnm:==eqs[e]) :* (C.plot:<.) + } + for (i=1; i<=C.r; i++) { + pos = select(1::C.r, (C.grp:==j) :& (C.eqnm:==eqs[e])) + if (length(pos)>0) { + C.grp[|pos[1] \ pos[rows(pos)]|] = + J((pos[rows(pos)]-pos[1]+1), 1, j) + } + } + } + } + for (j=1; j<=rows(groups); j++) { + glbls = glbls + " " + "`" + `"""' + groups[j,2] + `"""' + "'" + } + st_local("groups", strtrim(glbls)) + } + + // add gaps between equations and groups + eqgap = strtoreal(st_local("eqgap")) + ggap = strtoreal(st_local("ggap")) + if (eqgap==0 & ggap==0) return + at0 = C.at + for (i=2; i<=C.r; i++ ) { + C.at[i] = C.at[i-1] + + (at0[i,1] - at0[i-1,1]) + // update downstream + (C.eqnm[i]!=C.eqnm[i-1])*eqgap + // new eq + (C.eqnm[i]==C.eqnm[i-1] & C.grp[i]!=C.grp[i-1])*ggap // new group + } +} + +string scalar coefplot_get_xlab(string scalar v, string scalar interact) +{ + if (interact=="") return(v) + stata("compile_xlabel, v(" + v + ") interact(" + interact + ")") + return(st_local("coeflbl")) +} + +void coefplot_relocate(struct coefplot_struct scalar C) +{ + real scalar i, j, k + real colvector tag, p + string matrix pos, names + + if (st_local("relocate")=="") return + + // set positions + tag = J(C.r, 1, 0) + pos = coefplot_parse_matchlist(st_local("relocate"), "relocate") + for (j=1; j<=rows(pos); j++) { + names = coefplot_parse_namelist(pos[j,1], "*", "relocate") + for (k=1; k<=rows(names); k++) { + tag = tag :+ j * strmatch(C.eqnm, names[k,1]) :* + strmatch(C.coefnm, names[k,2]) :* (tag:==0) + } + } + _editmissing(tag, 0) + p = strtoreal(pos[,2]) + for (i=1; i<=C.r; i++) { + if (tag[i] & (C.plot[i]<.)) { + C.at[i] = p[tag[i]] + } + } + + // reorder + p = order((C.at, (1::C.r)), (1,2)) + C.b = C.b[p] + C.V = C.V[p] + C.se = C.se[p] + C.t = C.t[p] + C.df = C.df[p] + C.pval = C.pval[p] + C.at = C.at[p] + C.aux = C.aux[p,] + C.mlbl = C.mlbl[p] + C.mlpos = C.mlpos[p] + C.plot = C.plot[p] + C.by = C.by[p] + C.ci = C.ci[p,] + C.coefnm = C.coefnm[p] + C.eqnm = C.eqnm[p] + C.trans = C.trans[p] + C.coeflbl = C.coeflbl[p] +} + +void coefplot_headings(struct coefplot_struct scalar C) +{ + real scalar i, j, k, off, gap, fskip + real colvector tag + string scalar hlbls + string matrix headings, names + + off = strtoreal(st_local("hoff")) + gap = strtoreal(st_local("hgap")) + + // if headings are equations + if (st_local("eqashead")!="") { + fskip = C.at[1] + j = 0 + for (i=1; i<=C.r; i++) { + if (C.eq[i]!=j) { + C.at[|i \ .|] = C.at[|i \ .|] :+ 1 :+ (gap*(i>1)) + hlbls = hlbls + " " + strofreal(C.at[i] - fskip + off) + } + j = C.eq[i] + } + st_local("hlbls", strtrim(hlbls)) + return + } + + // if headings are not equations + headings = st_local("headings") + if (headings=="") { + st_local("hlbls", "") + return + } + tag = J(C.r, 1, 0) + if (C.r>1) { + tag[|2 \ .|] = tag[|2 \ .|] :+ + (C.at[|2 \ .|]:==C.at[|1 \ C.r-1|]) + _editvalue(tag, 1, .) + } + headings = coefplot_parse_matchlist(headings, "headings") + for (j=1; j<=rows(headings); j++) { + names = coefplot_parse_namelist(headings[j,1], "*", "headings") + for (k=1; k<=rows(names); k++) { + tag = tag :+ j * strmatch(C.eqnm,names[k,1]) :* + strmatch(C.coefnm, names[k,2]) :* (tag:==0) + } + } + _editmissing(tag, 0) + for (i=1; i<=C.r; i++) { + if (tag[i] & (C.plot[i]<.)) { + C.at[|i \ .|] = C.at[|i \ .|] :+ 1 :+ (gap*(i>1)) + hlbls = hlbls + " " + strofreal(C.at[i] - 1 + off) + " " + + "`" + `"""' + headings[tag[i],2] + `"""' + "'" + } + } + st_local("hlbls", strtrim(hlbls)) +} + +string matrix coefplot_parse_matchlist(string scalar s, string scalar opt, + | real scalar nc0) +{ + real scalar c, a, b, j, i, nc + real rowvector eqpos + string rowvector stok + string matrix res + + if (args()==3) nc = nc0 + else nc = 1 + if (strtrim(s)=="") return(J(0, 1+nc, "")) + stok = _coefplot_parse_matchlist_stok(s) + c = cols(stok) + a = b = i = 1 + eqpos = select(1::c, stok':=="=")' + res = J(cols(eqpos), 1+nc, "") + for (j=1; j<=cols(eqpos); j++) { + b = eqpos[j] + if (b==a | b==c | (b+nc)>cols(stok)) { + printf("{err}%s(): invalid matchlist\n", opt) + exit(198) + } + res[i,] = (invtokens(stok[|a \ b-1|]), stok[|b+1 \ b+nc|]) + a = b + 1 + nc + i++ + } + if (a<=c) { + printf("{err}%s(): invalid matchlist\n", opt) + exit(198) + } + nc = nc + 1 + for (i=1; i<=rows(res); i++) { // strip quotes in last column + if (substr(res[i,nc], 1, 1)==`"""') { + res[i,nc] = substr(res[i,nc], 2, strlen(res[i,nc])-2) + } + else if (substr(res[i,nc], 1, 2)=="`" + `"""') { + res[i,nc] = substr(res[i,nc], 3, strlen(res[i,nc])-4) + } + } + return(res) +} + +string rowvector _coefplot_parse_matchlist_stok(string scalar s) +{ + real scalar i, c, j + string scalar tok, t0 + string rowvector pchars, stok + transmorphic t + + // Step 1: split input at blanks and equal signs while binding on quotes + // and parentheses + pchars = (" ", "=") + t = tokeninit("", pchars, (`""""', `"`""'"', "()")) + tokenset(t, s) + stok = tokengetall(t) + // Step 2: remove blanks and merge "(...)" with surrounding tokens (unless + // blank or equal sign) + c = cols(stok) + j = c + 1 + for (i=c; i; i--) { + tok = stok[i] + if (tok==" ") continue // remove blanks + if (i>1) { + if (substr(tok,1,1)=="(") { + if (!anyof(pchars, stok[i-1])) { + stok[i-1] = stok[i-1] + tok + continue + } + } + else if (tok!="=") { + if (substr(stok[i-1],-1,1)==")") { + stok[i-1] = stok[i-1] + tok + continue + } + } + } + stok[--j] = tok + } + // return result + if (j>c) return(J(1,0,"")) + return(stok[|j \ .|]) +} + +string matrix coefplot_parse_namelist(string scalar s, string scalar defeq, + string scalar opt) +{ + transmorphic t + real scalar i, c + string rowvector stok + string matrix res + + if (s=="") return(J(0,2,"")) + t = tokeninit(" ", ":") + tokenset(t, s) + stok = tokengetall(t) + c = cols(stok) + for (i=1; i<=c; i++) { // strip quotes + if (substr(stok[i], 1, 1)==`"""') { + stok[i] = substr(stok[i], 2, strlen(stok[i])-2) + } + else if (substr(stok[i], 1, 2)=="`" + `"""') { + stok[i] = substr(stok[i], 3, strlen(stok[i])-4) + } + } + res = J(0, 2, "") + for (i=1;i<=c;i++) { + if (i+1<=c) { + if (stok[i+1]==":") { + if (stok[i]==":") { + printf("{err}%s(): invalid namelist\n", opt) + exit(198) + } + if (i+2<=c) { + if (stok[i+2]==":") { + printf("{err}%s(): invalid namelist\n", opt) + exit(198) + } + if (i+3<=c) { + if (stok[i+3]==":") { // "... eq: eq: ..." + res = res \ (stok[i], "*") + i++ + continue + } + } + res = res \ (stok[i], stok[i+2]) // "... eq:name ..." + defeq = stok[i] + i = i + 2 + continue + } + res = res \ (stok[i], "*") // "... eq:" + i++ + continue + } + } + if (stok[i]==":") { + printf("{err}%s(): invalid namelist\n", opt) + exit(198) + } + res = res \ (defeq, stok[i]) + } + return(res) +} + +void coefplot_put(struct coefplot_struct scalar C) +{ + real scalar i + real rowvector vi + + st_store((1,C.r), st_local("b"), C.b) + st_store((1,C.r), st_local("V"), C.V) + st_store((1,C.r), st_local("se"), C.se) + st_store((1,C.r), st_local("t"), C.t) + st_store((1,C.r), st_local("df"), C.df) + st_store((1,C.r), st_local("pval"), C.pval) + st_store((1,C.r), st_local("at"), C.at) + st_sstore((1,C.r), st_local("mlbl"), C.mlbl) + st_store((1,C.r), st_local("mlpos"), C.mlpos) + st_store((1,C.r), st_local("plot"), C.plot) + st_store((1,C.r), st_local("by"), C.by) + st_store((1,C.r), st_local("eq"), C.eq) + st_store((1,C.r), st_local("grp"), C.grp) + vi = J(1, cols(C.ci), .) + for (i=1; i<=(cols(vi)/2); i++) { + vi[1,i*2-1] = st_varindex(st_local("ll" + strofreal(i))) + vi[1,i*2] = st_varindex(st_local("ul" + strofreal(i))) + } + st_store((1,C.r), vi, C.ci) + vi = J(1, cols(C.aux), .) + for (i=1; i<=cols(vi); i++) { + vi[1,i] = st_varindex(st_local("aux" + strofreal(i))) + } + st_store((1,C.r), vi, C.aux) +} + +void coefplot_at_unique(struct coefplot_struct scalar C) +{ + assert(rows(uniqrows((C.by,C.at)))==C.r) +} + +void coefplot_apply_transform(struct coefplot_struct scalar C) +{ + real scalar i, j, rc, x0, x1, mis + string scalar trans0, trans, trans1 + string rowvector vname + real rowvector vpos + + if (allof(C.trans[i], "")) return + vname = J(1, cols(C.ci), "") + for (j=1; j<=(cols(C.ci)/2); j++) { + vname[j*2-1] = st_local("ll"+strofreal(j)) + vname[j*2] = st_local("ul"+strofreal(j)) + } + vname = st_local("b"), vname + vpos = st_varindex(vname) + mis = 0 + for (i=1; i<=C.r; i++) { + if (C.trans[i]=="") continue + if (C.trans[i]!=trans0) trans0 = C.trans[i] + trans = _coefplot_inject_temvars(trans0, cols(C.ci), cols(C.aux)) + for (j=1; j<=cols(vname); j++) { + trans1 = subinstr(trans, "@", vname[j]) + x0 = _st_data(i, vpos[j]) + rc = _stata("replace " + vname[j] + " = " + trans1 + " in " + strofreal(i), 1) + if (rc) { + printf("{err}transform '%s' invalid\n", trans0) + exit(198) + } + x1 = _st_data(i, vpos[j]) + if (x1>=. & x1!=x0) mis = 1 + } + } + if (mis) { + display("{txt}(transform missing for some coefficients or CIs)") + } +} + +void coefplot_lbl_is_multiline() +{ + string scalar lbl + + lbl = strtrim(st_local("lbl")) + if ((substr(lbl, 1, 1)==`"""' | substr(lbl, 1, 2)==("`" + `"""'))) { + return(499) + } +} + +void coefplot_get_coefs(struct coefplot_struct scalar C) +{ + st_local("coefs", + invtokens("`" :+ `"""' :+ C.coefnm' :+ `"""' :+ "'")) +} + +void coefplot_get_coeflbl(struct coefplot_struct scalar C, real scalar i) +{ + st_local("coeflbl", C.coeflbl[i]) +} + +void coefplot_get_plotlbl(struct coefplot_struct scalar C, real scalar i) +{ + st_local("plotlbl", C.plotlbl[i]) +} + +void coefplot_get_bylbl(struct coefplot_struct scalar C, real scalar i) +{ + st_local("bylbl", C.bylbl[i]) +} + +void coefplot_get_eqlbl(struct coefplot_struct scalar C, real scalar i) +{ + st_local("eqlbl", C.eqlbl[i]) +} + +void coefplot_ticks_and_labels(struct coefplot_struct scalar C) +{ + real scalar i, between + string scalar labels, grid, space + + between = (st_local("grid")=="between") + st_local("xrange", strofreal(C.xmin-0.5) + " " + + strofreal(max(C.at)+0.5)) + if (between & C.plot[1]<.) { + if (C.xmin1) { + if ((C.eqnm[i], C.coefnm[i])==(C.eqnm[i-1], C.coefnm[i-1])) { + continue + } + if (between & C.plot[i-1]<.) { + grid = grid + space + + strofreal(C.at[i-1] + min((0.5, (C.at[i]-C.at[i-1])/2))) + } + } + if (C.plot[i]<.) { + labels = labels + space + strofreal(C.at[i]) + + " `" + `"""' + C.coeflbl[i] + `"""' + "'" + if (between==0) grid = grid + space + strofreal(C.at[i]) + else if (i>1) { + grid = grid + space + + strofreal(C.at[i] - min((0.5, (C.at[i]-C.at[i-1])/2))) + } + space = " " + } + } + st_local("xlabels", labels) + st_local("xgrid", grid) +} + +void coefplot_combine_ciopts() +{ + string scalar opt, p + + opt = st_local("opt") + p = substr(opt, 2, strpos(opt,"(")-2) // get # from "p#(...)" + if (strtoreal(p)<.) { + opt = substr(opt, 3+strlen(p), strlen(opt)-3-strlen(p)) // get contents + st_local("opt_"+p, st_local("opt_"+p) + " " + opt) + } + else { + st_local("options", st_local("options") + " " + opt) + } +} + +void coefplot_parsecomma(string scalar lhs, string scalar rhs, string scalar lin) +{ + transmorphic t + string scalar l, r, token + + t = tokeninit("", ",", (`""""', `"`""'"'), 0, 0) + tokenset(t, st_local(lin)) + while ((token = tokenget(t))!="") { + if (token==",") { + r = token + while ((token = tokenget(t))!="") { + r = r + token + } + st_local(lhs, l) + st_local(rhs, r) + return + } + l = l + token + } + st_local(lhs, l) + st_local(rhs, r) +} + +void coefplot_inject_temvars(string scalar s, real scalar nci, + real scalar naux) +{ + st_local(s, _coefplot_inject_temvars(st_local(s), nci, naux)) +} +string scalar _coefplot_inject_temvars(string scalar s, real scalar nci, + real scalar naux) +{ + real scalar i + string scalar v, vname + string rowvector nspace + + nspace = J(1, nci*2 + naux, "") + for (i=1; i<=nci; i++) { + nspace[i*2-1] = "ll" + strofreal(i) + nspace[i*2] = "ul" + strofreal(i) + } + for (i=1; i<=naux; i++) { + nspace[nci*2+i] = "aux" + strofreal(i) + } + nspace = nspace, ("b", "V", "se", "t", "df", "pval", "at", "mlbl", "mlpos", "plot", "by") + while (regexm(s,"@[Va-z]+[0-9]*")) { + v = regexs() + vname = substr(v, 2, .) + if (vname=="ll" | vname=="ul" | vname=="aux") { + vname = vname + "1" + } + if (anyof(nspace, vname)==0) { + printf("{err}%s not found\n", v) + exit(error(111)) + } + s = subinstr(s, v, st_local(vname), 1) + } + return(s) +} + +end + + + diff --git a/ado/c/coefplot.sthlp b/ado/c/coefplot.sthlp new file mode 100644 index 0000000..72069d9 --- /dev/null +++ b/ado/c/coefplot.sthlp @@ -0,0 +1,1817 @@ +{smcl} +{* *! version 1.5.2 21apr2022 Ben Jann}{...} +{vieweralsosee "[G-2] graph" "help graph"}{...} +{vieweralsosee "[R] estimates" "help estimates"}{...} +{vieweralsosee "[R] marginsplot" "help marginsplot"}{...} +{vieweralsosee "[R] margins" "help margins"}{...} +{viewerjumpto "Syntax" "coefplot##syntax"}{...} +{viewerjumpto "Description" "coefplot##description"}{...} +{viewerjumpto "Options" "coefplot##options"}{...} +{viewerjumpto "Examples" "coefplot##examples"}{...} +{viewerjumpto "Remarks" "coefplot##remarks"}{...} +{viewerjumpto "Saved results" "coefplot##saved_results"}{...} +{viewerjumpto "References" "coefplot##references"}{...} +{viewerjumpto "Author" "coefplot##author"}{...} +{viewerjumpto "History" "coefplot##history"}{...} +{hi:help coefplot}{...} +{right:{browse "http://repec.sowi.unibe.ch/stata/coefplot"}} +{right:{browse "http://github.com/benjann/coefplot"}} +{hline} + +{title:Title} + +{pstd} + {hi:coefplot} {hline 2} Plotting regression coefficients and other + results + +{marker syntax}{...} +{title:Syntax} + +{p 8 15 2} + {cmd:coefplot} {it:subgraph} [ || {it:subgraph} || ... ] + [{cmd:,} {help coefplot##globalopts:{it:globalopts}} ] + +{pstd} + where {it:subgraph} is defined as + +{p 8 16 2} + {cmd:(}{it:plot}{cmd:)} [ {cmd:(}{it:plot}{cmd:)} ... ] + [, {help coefplot##subgropts:{it:subgropts}} ] + +{pstd} + and {it:plot} is either {cmd:_skip} (to skip a plot) or + +{p 8 16 2} + {it:model} [ \ {it:model} \ ... ] + [, {help coefplot##plotopts:{it:plotopts}} ] + +{pstd} + and {it:model} is + +{p 8 16 2} + {it:namelist} [{cmd:,} {help coefplot##modelopts:{it:modelopts}} ] + +{pstd} + where {it:namelist} is a list of names of stored models + (see help {helpb estimates}; type {cmd:.} or leave blank to refer to + the active model). The {cmd:*} and {cmd:?} wildcards are allowed + in {it:namelist}; see + {help coefplot##wildcards:{it:Using wildcards in model names}}. Furthermore, + {it:model} may also be + +{p 8 16 2} + {helpb coefplot##matrix:{ul:m}atrix({it:mspec})} [{cmd:,} {help coefplot##modelopts:{it:modelopts}} ] + +{pstd} + to plot results from a matrix (see + {help coefplot##matrix:{it:Plotting results from matrices}} below). + Parentheses around {it:plot} can be omitted if {it:plot} does not contain + spaces. + +{synoptset 25 tabbed}{...} +{marker modelopts}{synopthdr:modelopts} +{synoptline} +{syntab:Main} +{synopt:{helpb coefplot##omitted:{ul:omit}ted}}include omitted + coefficients + {p_end} +{synopt:{helpb coefplot##baselevels:{ul:base}levels}}include base levels + {p_end} +{synopt:{helpb coefplot##b:b({it:mspec})}}specify source to be plotted; default is to + plot {cmd:e(b)} + {p_end} +{synopt:{helpb coefplot##at:at{sf:[}({it:spec}){sf:]}}}get plot positions from + {cmd:e(at)}, or as specified by {it:spec} + {p_end} +{synopt:{helpb coefplot##keep:keep({it:coeflist})}}keep specified coefficients + {p_end} +{synopt:{helpb coefplot##drop:drop({it:coeflist})}}drop specified coefficients + {p_end} + +{syntab:Confidence intervals} +{synopt:{helpb coefplot##noci:noci}}omit confidence intervals + {p_end} +{synopt:{helpb coefplot##levels:{ul:l}evels({it:numlist})}}set level(s) for + conficence intervals + {p_end} +{synopt:{helpb coefplot##ci:ci({it:spec})}}provide confidence intervals + {p_end} +{synopt:{helpb coefplot##v:v({it:name})}}provide variances; default is to use + {cmd:e(V)} + {p_end} +{synopt:{helpb coefplot##se:se({it:mspec})}}provide standard errors + {p_end} +{synopt:{helpb coefplot##df:df({it:spec})}}provide degrees of freedom + {p_end} +{synopt:{helpb coefplot##citype:citype({it:method})}}method to compute + confidence intervals; default is {cmd:citype(normal)} + {p_end} + +{syntab:Transform results} +{synopt:{helpb coefplot##eform:eform{sf:[}({it:coeflist}){sf:]}}}plot + exponentiated point estimates and confidence intervals + {p_end} +{synopt:{helpb coefplot##rescale:rescale({it:spec})}}rescale point estimates + and confidence intervals + {p_end} +{synopt:{helpb coefplot##transform:{ul:trans}form({it:matchlist})}}transform + point estimates and confidence intervals + {p_end} + +{syntab:Names and labels} +{synopt:{helpb coefplot##rename:rename({it:spec})}}rename coefficients + {p_end} +{synopt:{helpb coefplot##eqrename:{ul:eqren}ame({it:spec})}}rename + equations + {p_end} +{synopt:{helpb coefplot##asequation:{ul:aseq}uation{sf:[}({it:string}){sf:]}}}set equation + to model name or {it:string} + {p_end} +{synopt:{helpb coefplot##swapnames:{ul:swap}names}}swap coefficient names and + equation names + {p_end} +{synopt:{helpb coefplot##mlabels:mlabels({it:matchlist})}}add custom marker labels + {p_end} + +{syntab:Auxiliary results} +{synopt:{helpb coefplot##aux:aux({sf:{it:mspec} [{it:mspec} ...]})}}make + additional results available as {cmd:@aux1}, {cmd:@aux2}, etc. + {p_end} +{synoptline} + +{synoptset 25 tabbed}{...} +{marker plotopts}{synopthdr:plotopts} +{synoptline} +{syntab:Passthru} +{synopt:{help coefplot##modelopts:{it:modelopts}}}plot-specific model options; + see {help coefplot##place:{it:Placement of options}} + {p_end} + +{syntab:Main} +{synopt:{helpb coefplot##label:{ul:lab}el({it:string})}}label to be used for + the plot in the legend + {p_end} +{synopt:{helpb coefplot##key:key{sf:[}(ci {sf:[}#{sf:]}){sf:]}}}key + symbol to be used for the plot in the legend + {p_end} +{synopt:{helpb coefplot##nokey:nokey}}do not include the plot in the legend + {p_end} +{synopt:{helpb coefplot##pstyle:{ul:psty}le({it:pstyle})}}overall + style of the plot + {p_end} +{synopt:{helpb coefplot##axis:{ul:ax}is({it:#})}}choice of axis for the plot, {cmd:1} {ul:<} {it:#} {ul:<} {cmd:9} + {p_end} +{synopt:{helpb coefplot##offset:offset({it:#})}}provide offset for plot + positions + {p_end} +{synopt:{helpb coefplot##ifopt:if({it:exp})}}restrict the contents of the plot + {p_end} +{synopt:{helpb coefplot##weight:{ul:w}eight({it:exp})}}scale size of markers + {p_end} + +{syntab:Markers} +{synopt:{it:{help marker_options}}}change look of + markers (color, size, etc.) + {p_end} +{synopt:{helpb coefplot##mlabel:{ul:ml}abel{sf:[}({it:spec}){sf:]}}}add marker + labels + {p_end} +{synopt:{it:{help marker_label_options}}}change the look and position of marker + labels + {p_end} +{synopt:{helpb coefplot##recast:recast({it:plottype})}}plot results using + {it:plottype} + {p_end} + +{syntab:Confidence spikes} +{synopt:{helpb coefplot##cionly:cionly}}plot confidence spikes only + {p_end} +{synopt:{helpb coefplot##citop:citop}}draw confidence spikes in front + of markers + {p_end} +{synopt:{helpb coefplot##cirecast:{ul:cire}cast({it:plottype})}}shorthand for {cmd:ciopts(recast())} + {p_end} +{synopt:{helpb coefplot##ciopts:{ul:ciop}ts({it:options})}}affect rendition + of confidence spikes + {p_end} +{synopt:{helpb coefplot##cismooth:{ul:cis}mooth{sf:[}({it:options}){sf:]}}}add smoothed + confidence intervals + {p_end} +{synoptline} + +{synoptset 25 tabbed}{...} +{marker subgropts}{synopthdr:subgropts} +{synoptline} +{syntab:Passthru} +{synopt:{help coefplot##modelopts:{it:modelopts}}}subgraph-specific model + options; see {help coefplot##place:{it:Placement of options}} + {p_end} +{synopt:{help coefplot##plotopts:{it:plotopts}}}subgraph-specific plot + options; see {help coefplot##place:{it:Placement of options}} + {p_end} + +{syntab:Main} +{synopt:{helpb coefplot##bylabel:{ul:bylab}el({it:string})}}label to be used + for the subgraph + {p_end} +{synoptline} + +{synoptset 25 tabbed}{...} +{marker globalopts}{synopthdr:globalopts} +{synoptline} +{syntab:Passthru} +{synopt:{help coefplot##modelopts:{it:modelopts}}}global model options; see + {help coefplot##place:{it:Placement of options}} + {p_end} +{synopt:{help coefplot##plotopts:{it:plotopts}}}global plot options; see + {help coefplot##place:{it:Placement of options}} + {p_end} +{synopt:{help coefplot##subgropts:{it:subgropts}}}global subgraph options; + see {help coefplot##place:{it:Placement of options}} + {p_end} + +{syntab:Main} +{synopt:{helpb coefplot##horizontal:{ul:hor}izontal}}coefficient values are + on x axis; general default + {p_end} +{synopt:{helpb coefplot##vertical:{ul:vert}ical}}coefficient values are on y + axis; default with {cmd:at()} + {p_end} +{synopt:{helpb coefplot##eqstrict:eqstrict}}be strict about equations + {p_end} +{synopt:{helpb coefplot##order:order({it:coeflist})}}order coefficients + {p_end} +{synopt:{helpb coefplot##orderby:orderby({it:spec})}}order coefficients by + specific model + {p_end} +{synopt:{helpb coefplot##sort:sort{sf:[}({it:spec}){sf:]}}}sort coefficients + {p_end} +{synopt:{helpb coefplot##relocate:{ul:reloc}ate({it:spec})}}assign + specific positions to coefficients + {p_end} +{synopt:{helpb coefplot##bycoefs:{ul:byc}oefs}}arrange subgraphs by + coefficients + {p_end} +{synopt:{helpb coefplot##norecycle:{ul:norec}ycle}}increment plot styles across + subgraphs + {p_end} +{synopt:{helpb coefplot##nooffsets:{ul:nooff}sets}}do not offset plot + positions + {p_end} +{synopt:{helpb coefplot##format:format({it:format})}}set the display format for + numeric labels + {p_end} +{synopt:{helpb coefplot##pnum:p{it:#}({it:plotopts})}}options for {it:#}th plot + {p_end} + +{syntab:Labels and grid lines} +{synopt:{helpb coefplot##nolabels:{ul:nolab}els}}use variable names instead of + labels + {p_end} +{synopt:{helpb coefplot##coeflabels:{ul:coefl}abels({it:spec})}}specify + custom labels for coefficients + {p_end} +{synopt:{helpb coefplot##noeqlabels:{ul:noeql}abels}}suppress equation labels + {p_end} +{synopt:{helpb coefplot##eqlabels:{ul:eql}abels({it:spec})}}specify labels + for equations + {p_end} +{synopt:{helpb coefplot##headings:{ul:head}ings({it:spec})}}add headings between + coefficients + {p_end} +{synopt:{helpb coefplot##groups:groups({it:spec})}}add labels for groups of + coefficients + {p_end} +{synopt:{helpb coefplot##plotlabels:{ul:plotl}abels({it:spec})}}(re)set plot + labels + {p_end} +{synopt:{helpb coefplot##bylabels:bylabels({it:spec})}}(re)set subgraph + labels + {p_end} +{synopt:{helpb coefplot##grid:grid({it:options})}}affect rendition of grid lines + {p_end} + +{syntab:Save results} +{synopt:{helpb coefplot##generate:{ul:gen}erate{sf:[}({it:prefix}){sf:]}}}generate + variables containing the graph data + {p_end} +{synopt:{helpb coefplot##replace:replace}}overwrite existing variables + {p_end} + +{syntab:Add plots} +{synopt:{helpb addplot_option:addplot({it:plot})}}add other plots to the + graph + {p_end} +{synopt:{helpb coefplot##nodrop:nodrop}}do not drop observations + {p_end} + +{syntab:Y axis, X axis, Titles, Legend, Overall, By} +{synopt:{it:{help twoway_options}}}twoway options, other than {cmd:by()} + {p_end} +{synopt:{cmdab:byop:ts(}{it:{help by_option:byopts}}{cmd:)}}how subgraphs + are combined + {p_end} +{synoptline} + + +{marker description}{...} +{title:Description} + +{pstd} + {cmd:coefplot} plots results from estimation commands or Stata matrices. + Results from multiple models or matrices can be combined in a single + graph. The default behavior of {cmd:coefplot} is to draw markers for + coefficients and horizontal spikes for confidence intervals. However, + {cmd:coefplot} can also produce various other types of graphs. + + +{marker options}{...} +{title:Options} +{dlgtab:Model options} + +{marker omitted}{...} +{phang} + {cmd:omitted} includes omitted coefficients. This may be useful if a model + contains coefficients that have been dropped due to collinearity. + +{marker baselevels}{...} +{phang} + {cmd:baselevels} includes base levels of factor variables. + +{marker b}{...} +{phang} + {cmd:b(}{it:mspec}{cmd:)} specifies the source from which the point + estimates and coefficient names are to be collected. The default is to use + (the first row of) {cmd:e(b)} (or {cmd:e(b_mi)} if plotting results from + {helpb mi estimate}). {cmd:b()} is discarded in matrix mode (see + {help coefplot##matrix:{it:Plotting results from matrices}} below). + {it:mspec} may be: + +{p2colset 13 25 27 2}{...} +{p2col:{it:name}}use first row of {cmd:e(}{it:name}{cmd:)} + {p_end} +{p2col:{it:name}{cmd:[}#{cmd:,.]}}use #th row of + {cmd:e(}{it:name}{cmd:)}; may also type {it:name}{cmd:[}#{cmd:,]} + or {it:name}{cmd:[}#{cmd:]} + {p_end} +{p2col:{it:name}{cmd:[.,}#{cmd:]}}use #th column of + {cmd:e(}{it:name}{cmd:)}; may also type {it:name}{cmd:[,}#{cmd:]} + {p_end} +{p2colreset}{...} + +{marker at}{...} +{phang} + {cmd:at}[{cmd:(}{it:spec}{cmd:)}] causes plot positions to be determined + by the values in {cmd:e(at)} (or matrix {cmd:at}) or as specified by + {it:spec}. The default is to create a categorical axis with coefficients + matched by their names. However, if {cmd:at} is specified, the axis is + treated as continuous. Note that labeling options + {cmd:coeflabels()}, {cmd:eqlabels()}, {cmd:headings()}, or {cmd:groups()} + are not allowed if {cmd:at} is specified. Also not allowed with {cmd:at} + are options {cmd:bycoefs}, {cmd:order()}, and {cmd:relocate()}. + Furthermore, note that {cmd:at} has to be specified for all models or + for none. {it:spec} is + + [{it:atspec}] [{cmd:,} {opt t:ransform(exp)}] + +{pmore} + where {it:atspec} may be + +{p2colset 13 27 29 2}{...} +{p2col:{it:mspec}}as above for {helpb coefplot##b:b()} + {p_end} +{p2col:#}use #th at-dimension ({helpb margins}) or #th row/column of main matrix + {p_end} +{p2col:{opt m:atrix(mspec)}}read from matrix instead of {cmd:e()} + {p_end} +{p2col:{opt _coef}}use coefficient names as plot positions + {p_end} +{p2col:{opt _eq}}use equation names as plot positions + {p_end} +{p2colreset}{...} + +{pmore} + If {cmd:at} is specified without argument, the plot positions are taken from the first row + of {cmd:e(at)} (or matrix {cmd:at}). A special case are results from + {helpb margins} where recovering the plot positions is more + complicated. The default in this case is to use the first + at-dimension. Type, e.g., {cmd:at(2)} if multiple at-dimension were specified + with {helpb margins} and you want to use the second dimension. Furthermore, + in matrix mode (see + {help coefplot##matrix:{it:Plotting results from matrices}} below), {cmd:at(2)} + would read the plot positions from the 2nd row (or column) of the main matrix. + +{pmore} + When plotting results from {cmd:e()} it is sometimes convenient to + maintain an external matrix with the plot positions instead of + adding plot positions to each {cmd:e()}-set. In this case you can use + syntax {cmd:at(matrix(}{it:mspec}{cmd:))} to read the plot positions. Note + that the vector of plot positions must have the same length as the + coefficient vectors of the plotted models; elements are matched by position, + not by name. + +{pmore} + Furthermore, {cmd:at(_coef)} or {cmd:at(_eq)} will use the coefficient names or + the equation names as plot positions, respectively. This is useful only if + the coefficient names or the equation names are numeric. Note that you may + use {helpb coefplot##rename:rename()} and + {helpb coefplot##eqrename:eqrename()} to strip a non-numeric prefix or suffix + from coefficient names or equation names. + +{pmore} + Suboption {cmd:transform()} transforms the plot positions before creating + the graph. Within the transformation expression, use {cmd:@} as a + placeholder for the value to be transformed. For example, to take the + antilogarithm of the plot positions type {cmd:transform(exp(@))}. + +{marker keep}{...} +{phang} + {cmd:keep(}{it:coeflist}{cmd:)} specifies the coefficients to be + plotted. The default is to include all coefficients from the + first (nonzero) equation of a model (and discard further equations). + {it:coeflist} is a space-separated list of + elements such as: + +{p2colset 13 25 27 2}{...} +{p2col:{it:coef}}keep coefficient {it:coef} + {p_end} +{p2col:{it:eq}{cmd::}}keep all coefficients from equation {it:eq} + {p_end} +{p2col:{it:eq}{cmd::}{it:coef}}keep coefficient {it:coef} from equation {it:eq} + {p_end} +{p2colreset}{...} + +{pmore} + where {it:eq} and {it:coef} may contain "{cmd:*}" (any string) and + "{cmd:?}" (any nonzero character) wildcards. For example, type {cmd:keep(*:)} or + {cmd:keep(*:*)} to plot all coefficients from all equations. + +{pmore} + If {it:eq} is specified, it is applied to all subsequent + names until a new {it:eq} is specified. For example, + {cmd:keep(3:mpg price 4:weight)} will plot coefficients "{cmd:mpg}" and + "{cmd:price}" from equation "{cmd:3}" and coefficient "{cmd:weight}" from + equation "{cmd:4}". + +{marker drop}{...} +{phang} + {cmd:drop(}{it:coeflist}{cmd:)} drops the specified coefficients, where + {it:coeflist} is as above for {helpb coefplot##keep:keep()}. + +{marker noci}{...} +{phang} + {cmd:noci} omits confidence intervals. + +{marker levels}{...} +{phang} + {cmd:levels(}{it:{help numlist}}{cmd:)} sets the level(s), as percentages, + for confidence intervals. Specified values may be between 10.00 and 99.99 + and can have at most two digits after the decimal point. The default is + {cmd:levels(95)} or as set by {helpb set level}. If multiple values are + specified, multiple confidence intervals are plotted. For example, type + {cmd:levels(99.9 99 95)} to plot the 99.9%, 99%, and 95% confidence + intervals. The default is to use (logarithmically) increasing line widths + for multiple confidence intervals. This behavior is disabled as soon as + {cmd:lwidth()} or {cmd:recast()} is specified within + {helpb coefplot##ciopts:ciopts()}. + +{marker ci}{...} +{phang} + {cmd:ci(}{it:spec}{cmd:)} specifies the source from which to collect + confidence intervals. Default is to compute confidence intervals for the + levels specified in {cmd:levels()} using variances/standard errors (and, + possibly, degrees of freedom). The {cmd:ci()} option is useful to + plot confidence intervals that have been provided by the estimation + command (such as, e.g., {helpb bootstrap}). {it:spec} is + + {it:cispec} [{it:cispec} ...] + +{pmore} + where {it:cispec} is {it:name} to get the lower and upper confidence limits + from rows 1 and 2 of {cmd:e(}{it:name}{cmd:)} (or matrix {it:name}), + respectively. Alternatively, {it:cispec} may be {cmd:(}{it:mspec} + {it:mspec}{cmd:)} to identify the lower and upper confidence limits, with + {it:mspec} as above for {helpb coefplot##b:b()}. For example, after + {helpb bootstrap}, {cmd:ci(ci_bc)} would get bias-corrected confidence intervals + from rows 1 and 2 of {cmd:e(ci_bc)}. The same could be achieved by + {cmd:ci((ci_bc[1] ci_bc[2]))}. + +{pmore} + {it:cispec} may also be # for a specific confidence level as in + {helpb coefplot##levels:levels()}. Hence, you may type, e.g., + {cmd:ci(95 myci)} to plot the usual 95% confidence intervals along with + custom confidence intervals provided in {cmd:e(myci)}. Levels specified + in {cmd:ci()} take precedence over levels specified in {cmd:levels()}), + however, you may also type {cmd:""} within {cmd:ci()} to leave a + position blank an use the specified level from {cmd:levels()}. + +{pmore} + In matrix mode (see + {help coefplot##matrix:{it:Plotting results from matrices}} below), + {it:cispec} may also be {cmd:(}# #{cmd:)}. For example, {cmd:ci((2 3))} would + read the lower confidence limit from the 2nd row (or column) and + the upper confidence limit from the 3rd row (or column) of the main matrix. + +{marker v}{...} +{phang} + {cmd:v(}{it:name}{cmd:)} specifies that the variances for confidence interval + computation are to be taken from the diagonal of {cmd:e(}{it:name}{cmd:)} + (or matrix {it:name}). Default is {cmd:e(V)} (or {cmd:e(V_mi)} if plotting + results from {helpb mi estimate}). + +{marker se}{...} +{phang} + {cmd:se(}{it:mspec}{cmd:)} provides standard errors to be used for + computation of confidence intervals. Default is to compute confidence + intervals based on the variances in {cmd:e(V)} + (see {helpb coefplot##v:v()} above). {it:mspec} is as above for + {helpb coefplot##b:b()}. + In matrix mode (see + {help coefplot##matrix:{it:Plotting results from matrices}} below), you may + also specify {cmd:se(}#{cmd:)} to read the standard errors from the #th + row (or column) of the main matrix. + +{marker df}{...} +{phang} + {cmd:df(}{it:spec}{cmd:)} specifies degrees of freedom (DF) to be taken into + account for confidence interval computation. Default is to obtain DF + from scalar {cmd:e(df_r)} if defined (as in, e.g., {helpb regress}) + or, for results from {helpb mi estimate}, from matrix {cmd:e(df_mi)}. Otherwise, + no DF are taken into account. Specify {cmd:df(}{it:spec}{cmd:)} to provide + custom DF. {it:spec} may be: + +{p2colset 13 25 27 2}{...} +{p2col:#}set DF for all coefficients to # + {p_end} +{p2col:{it:mspec}}as above for {helpb coefplot##b:b()} + {p_end} +{p2colreset}{...} + +{marker citype}{...} +{phang} + {cmd:citype(}{it:method}{cmd:)} specifies the method to be used to compute the limits of + confidence intervals. {it:method} can be {cmd:normal}, {cmd:logit}, {cmd:probit}, + {cmd:atanh}, or {cmd:log}. + +{pmore} + {cmd:citype(normal)}, the default, computes confidence + limits based on untransformed coefficients and standard errors. Let {it:b} be + the point estimate, {it:se} the standard error, and {it:t} the (1-{it:a}/2) + quantile of the standard normal distribution or the t-distribution (if degrees + of freedom are available; see above), where {it:a} is 1 minus the + confidence level (e.g. {it:a}=5% for a 95% confidence interval). Then the + limits of the confidence interval are computed as + + {it:b} +/- {it:t} * {it:se} + +{pmore} + {cmd:citype(logit)} uses the logit transformation to compute the limits + of confidence intervals. This is useful if the estimates to be plotted are + proportions and the confidence limits are supposed to lie between 0 and + 1. The limits are computed as + + invlogit(logit({it:b}) +/- {it:t} * {it:se} / ({it:b} * (1 - {it:b}))) + +{pmore} + {cmd:citype(probit)} is an alternative to {cmd:citype(logit)} and computes the + limits as + + normal(invnormal({it:b}) +/- {it:t} * {it:se} / normalden(invnormal({it:b}))) + +{pmore} + {cmd:citype(atanh)} uses the inverse hyperbolic tangent to compute the + confidence intervals. This is useful for estimates that lie between -1 and + 1, such as a correlation coefficient. The limits are computed as: + + tanh(atanh({it:b}) +/- {it:t} * {it:se} / (1 - {it:b}^2)) + +{pmore} + {cmd:citype(log)} computes log-transformed confidence intervals. This is useful + for estimates that may only be positive, such as a variance estimate. The limits + are computed as: + + exp(ln({it:b}) +/- {it:t} * {it:se} / {it:b}) + +{marker eform}{...} +{phang} + {cmd:eform}[{cmd:(}{it:coeflist}{cmd:)}] causes point estimates and + confidence intervals to be exponentiated. This is useful + if you want to plot hazard ratios (HR), incidence-rate ratios (IRR), + odds ratios (OR), or relative-risk ratios (RRR). If {cmd:eform} is + specified without arguments, then all coefficients of the model are + exponentiated. To exponentiate only selected coefficients, specify + {it:coeflist} as above for {helpb coefplot##keep:keep()}. + +{marker rescale}{...} +{phang} + {cmd:rescale(}{it:spec}{cmd:)} rescales point estimates and confidence + intervals. Type {cmd:rescale(}#{cmd:)} to rescale all coefficients + by a constant factor. For example, {cmd:rescale(100)} will multiply all + coefficients by 100. Alternatively, {it:spec} may be + + {it:coeflist} {cmd:=} # [{it:coeflist} {cmd:=} # ...] + +{pmore} + with {it:coeflist} as above for {helpb coefplot##keep:keep()}. + +{marker transform}{...} +{phang} + {cmd:transform(}{it:matchlist}{cmd:)} transforms point estimates and confidence + intervals. {it:machlist} is: + + {it:coeflist} {cmd:= "}{it:{help exp}}{cmd:"} [{it:coeflist} {cmd:= "}{it:{help exp}}{cmd:"} ...] + +{pmore} + with {it:coeflist} as above for {helpb coefplot##keep:keep()}. Within the + transformation expression, use {cmd:@} as a placeholder for + the value to be transformed. For example, to take the square root of all + coefficients type {cmd:transform(* = sqrt(@))}. In addition, internal + variables may be used as explained in + {help coefplot##tempvar:Accessing internal temporary variables}. The + transformation expression must be enclosed in double quotes if it contains + spaces. If specified, {cmd:eform()} and {cmd:rescale()} are applied before applying + {cmd:transform()}. + +{marker rename}{...} +{phang} + {cmd:rename(}{it:spec}{cmd:)} renames coefficients. {it:spec} is: + + {it:coeflist} {cmd:=} {it:newname} [{it:coeflist} {cmd:=} {it:newname} ...] [{cmd:,} {cmdab:r:egex}] + +{pmore} + with {it:coeflist} as above for {helpb coefplot##keep:keep()} except that + wildcards are only allowed in equation names, and coefficient names may + be specified as {it:prefix}{cmd:*} to replace a prefix or + {cmd:*}{it:suffix} to replace a suffix. For example, + {cmd:rename(*.foreign = .cartype)} will rename coefficients such as + {cmd:0.foreign} and {cmd:1.foreign} to {cmd:0.cartype} and + {cmd:1.cartype}. {it:newname} must be enclosed in double quotes if it + contains spaces. For labeling coefficients, also see + {helpb coefplot##coeflabels:coeflabels()}. + +{pmore} + Apply option {cmd:regex} to cause coefficient specifications (but not + equation specifications) to be interpreted as + {browse "https://en.wikipedia.org/wiki/Regular_expression":regular expressions}. In this + case, {it:newname} may contain {cmd:\1}, ..., {cmd:\9} to reference back to + matched subexpressions (and {cmd:\0} for the entire match). For example, type + {cmd:rename(^AA([0-9]+)BB$ = YY\1ZZ, regex)} to rename + coefficients such as {cmd:AA123BB}, {cmd:AA0BB}, or {cmd:AA99BB} to + {cmd:YY123ZZ}, {cmd:YY0ZZ}, or {cmd:YY99ZZ}. If the leading {cmd:^} or the + tailing {cmd:$} is omitted, only the matched part of a coefficient name is + subject to substitution; the rest of the name will remain unchanged. Include + the regular expressions in quotes or compound double quotes if they contain + funny characters (such as, e.g., quotes, equal signs, or commas). + +{marker eqrename}{...} +{phang} + {cmd:eqrename(}{it:spec}{cmd:)} renames equations. {it:spec} is: + + {it:eqlist} {cmd:=} {it:newname} [{it:eqlist} {cmd:=} {it:newname} ...] [{cmd:,} {cmdab:r:egex}] + +{pmore} + where {it:eqlist} is a space separated list of equation names. Equation + names may be {it:prefix}{cmd:*} to replace a prefix or + {cmd:*}{it:suffix} to replace a suffix. For example, + {cmd:eqrename(rep78* = reprec)} will rename equations such as + {cmd:rep78_3} and {cmd:rep78_4} to {cmd:reprec_3} and + {cmd:reprec_4}. {it:newname} must be enclosed in double quotes if it + contains spaces. For labeling equations, also see + {helpb coefplot##eqlabels:eqlabels()}. + +{pmore} + Apply option {cmd:regex} to cause equation specifications to be interpreted as + {browse "https://en.wikipedia.org/wiki/Regular_expression":regular expressions}. In this + case, {it:newname} may contain {cmd:\1}, ..., {cmd:\9} to reference back to + matched subexpressions (and {cmd:\0} for the entire match). For example, type + {cmd:eqrename(^eq([0-9])0$ = Outcome_\1, regex)} to rename + equations such as {cmd:eq20} or {cmd:eq90} to + {cmd:Outcome_1} or {cmd:Outcome_9}. If the leading {cmd:^} or the + tailing {cmd:$} is omitted, only the matched part of an equation name is + subject to substitution; the rest of the name will remain unchanged. Include the regular expressions in + quotes or compound double quotes if they contain funny characters (such as, e.g., quotes, + equal signs, or commas). + +{marker asequation}{...} +{phang} + {cmd:asequation}[{cmd:(}{it:string}{cmd:)}] sets the equation name for all + included coefficients from the model to {it:string}. This is useful if you + want to assign an equation name to results that have been stored without + information on equations. If {cmd:asequation} is specified without + argument, the name of the model is used. If you apply the + {cmd:asequation()} option you may also want to specify + {helpb coefplot##eqstrict:eqstrict}. + +{marker swapnames}{...} +{phang} + {cmd:swapnames} swaps coefficient names and equation names after collecting + the model's results. The names are swapped after applying model options + such as {cmd:keep()}, {cmd:drop()}, or {cmd:rename()} but + before applying global options such as {cmd:coeflabel()}, {cmd:order()}, + or {cmd:eqlabels()}. + +{marker mlabels}{...} +{phang} + {cmd:mlabels(}{it:matchlist}{cmd:)} specifies marker labels for + selected coefficients. {it:matchlist} is: + + {it:coeflist} {cmd:=} # "{it:label}" [{it:coeflist} {cmd:=} # "{it:label}" ...] + +{pmore} + where {it:coeflist} is as above for {helpb coefplot##keep:keep()} and # is a + number 0--12 for the location of the marker label (see + {manhelpi clockposstyle G-4}). Not all of Stata's plot types + support marker labels. For example, if you use + {helpb coefplot##recast:recast(bar)} to change the plot type to + {helpb twoway_bar:bar}, no marker labels will be displayed (this has + changed with the April 6, 2022, update to Stata 17; plot type + {helpb twoway_bar:bar} now displays marker labels). + +{marker aux}{...} +{phang} + {cmd:aux(}{it:mspec} [{it:mspec} ...]{cmd:)} collects additional results + and makes them available as internal variables. {it:mspec} is as above for + {helpb coefplot##b:b()}. The internal variables + are named {cmd:@aux1}, {cmd:@aux2}, ..., and can be used within + {helpb coefplot##ifopt:if()}, + {helpb coefplot##weight:weight()}, + {helpb coefplot##transform:transform()}, + {helpb marker_label_options:mlabel()}, + {helpb marker_label_options:mlabvposition()}, and + {helpb addplot_option:addplot()} (see + {help coefplot##tempvar:Accessing internal temporary variables} + below). In matrix mode (see + {help coefplot##matrix:{it:Plotting results from matrices}} below), you may + also specify {cmd:aux(}# [# ...]{cmd:)} to read the from corresponding + rows (or column) of the main matrix. + +{dlgtab:Plot options} + +{marker label}{...} +{phang} + {cmd:label(}{it:string}{cmd:)} provides a label for the plot to be used + in the legend. Use double quotes to create multiline labels. For example, + {cmd:label("This is a" "long label")} would create a two-line label. For + text effects (bold, italics, greek letters, etc.) use SMCL tags as + described in {it:{help graph_text}}. + +{marker key}{...} +{phang} + {cmd:key}[{cmd:(ci} [{cmd:#}]{cmd:)}] determines the key symbol + to be used for the plot in the legend. {cmd:key} without argument uses + the plot's marker symbol; this is the default. {cmd:key(ci)} determines + the key symbol from the (first) confidence interval. {cmd:key(ci #)} + determines the key symbol from the #th confidence interval; this is only + useful if multiple confidence intervals are included in the plot. + +{marker nokey}{...} +{phang} + {cmd:nokey} prevents including the plot in the legend. + +{marker pstyle}{...} +{phang}{cmd:pstyle(}{it:pstyle}{cmd:)} sets the overall style of the + plot; see help {it:{help pstyle}}. {cmd:pstyle()} affects both, + coefficient markers and confidence spikes. To use a different plot style + for confidence spikes, add {cmd:pstyle()} within + {helpb coefplot##ciopts:ciopts()}. + +{marker axis}{...} +{phang}{cmd:axis(}{it:#}{cmd:)} specifies the scale axis to be used for the + plot, where {cmd:1} {ul:<} {it:#} {ul:<} {cmd:9}. The default is to place + all plots on the same scale axis. + +{marker offset}{...} +{phang} + {cmd:offset(}{it:#}{cmd:)} specifies a custom offset for the plot + positions. The default is to create automatic offsets to prevent + overlap of confidence spikes as soon as there are + multiple plots. The spacing between coefficients is one unit, so + {it:#} should usually be within -0.5 and 0.5. {it:#} may also be a scalar + expression such as, say, {cmd:1/6}. + +{marker ifopt}{...} +{phang} + {cmd:if(}{it:exp}{cmd:)} restricts the contents of the plot to coefficients + satisfying {it:exp}. The option is useful when you want to select + coefficients, e.g., based on their values, plot positions, or confidence + limits. Within {it:exp} refer to internal temporary variables as explained + in {help coefplot##tempvar:Accessing internal temporary variables} below. + For example, to include positive coefficients only, you could type + {cmd:if(@b>=0)}. Note that {cmd:if()} does not affect the rendition of the + categorical axis (unless {helpb coefplot##at:at} is specified). That is, a + complete categorical axis is created including labels for all collected + coefficients, even for the ones that have been removed from the plot by + {cmd:if()}. + +{marker weight}{...} +{phang} + {cmd:weight(}{it:exp}{cmd:)} scales the size of the markers according to + the size of the specified weights (see + {help scatter##remarks14:Weighted markers} in help {helpb scatter}). Within + {it:exp} refer to internal temporary variables as explained in + {help coefplot##tempvar:Accessing internal temporary variables} below. For + example, to scale markers according to the inverse of standard errors, you + could type {cmd:weight(1/@se)}. {cmd:weight()} has no effect if marker + labels are specified. + +{phang} + {it:marker_options} change the look of the coefficient markers (color, + size, etc.); see help {it:{help marker_options}}. + +{marker mlabel}{...} +{phang} + {cmd:mlabel}[{cmd:(}{it:spec}{cmd:)}] adds marker labels to the + plot. For adding custom labels to specific markers also see model option + {helpb coefplot##mlabels:mlabels()} above. Furthermore, note that + not all of Stata's plot types support marker labels. For example, if you use + {helpb coefplot##recast:recast(bar)} to change the plot type to + {helpb twoway_bar:bar}, no marker labels will be displayed (this has + changed with the April 6, 2022, update to Stata 17; plot type + {helpb twoway_bar:bar} now displays marker labels). + +{pmore} + The {cmd:mlabel} option can be used in three different ways: + +{pmore2} + (1) {opt mlabel} without argument adds the values of the point estimates as + marker labels. Use global option + {helpb coefplot##format:format()} to set the display format. + +{pmore2} + (2) {opth mlabel(varname)} uses the values of the specified variable + as marker labels. {it:varname} may be an internal variable (see + {help coefplot##tempvar:Accessing internal temporary variables} below). For example, + {cmd:mlabel(@b)} is equivalent to {cmd:mlabel} without argument. + +{pmore2} + (3) {opt mlabel(strexp)} sets the marker labels to the evaluation of the + specified string expression. Internal variables can be used within {it:strexp} + (see {help coefplot##tempvar:Accessing internal temporary variables} + below). For example, you can type + +{pmore3} + mlabel("p = " + string(@pval,"%9.3f")) + +{pmore2} + to display labels such as "p = 0.001" or "p = 0.127". Furthermore, + +{pmore3} + mlabel(cond(@pval<.001, "***", cond(@pval<.01, "**", cond(@pval<.05, "*", "")))) + +{pmore2} + would display significance stars. + +{phang} + {it:marker_label_options} change the look and + position of marker labels; see help {it:{help marker_label_options}}. + +{marker recast}{...} +{phang} + {cmd:recast(}{it:plottype}{cmd:)} plots the coefficients using + {it:plottype}; supported plot types are + {helpb scatter}, + {helpb line}, + {helpb twoway_connected:connected}, + {helpb twoway_area:area}, + {helpb twoway_bar:bar}, + {helpb twoway_spike:spike}, + {helpb twoway_dropline:dropline}, and + {helpb twoway_dot:dot}. The default {it:plottype} is {helpb scatter}. The + chosen plot type affects the available plot options. For example, if + the plot type is {helpb twoway_bar:bar} then {it:{help barlook_options}} + will be available. See the plot type's help file for details. + +{marker cionly}{...} +{phang} + {cmd:cionly} causes markers for point estimates to be suppressed. + +{marker citop}{...} +{phang} + {cmd:citop} specifies that confidence intervals be drawn in front of + the markers for point estimates; the default is to draw confidence intervals + behind the markers. + +{marker cirecast}{...} +{phang} + {cmd:cirecast(}{it:plottype}{cmd:)} is shorthand notation for + {helpb coefplot##ciopts:ciopts(recast())}. If both are provided, the plot types + specified in {cmd:ciopts(recast())} take precedence over the plot types + specified in {cmd:cirecast()}. + +{marker ciopts}{...} +{phang} + {cmd:ciopts(}{it:options}{cmd:)} affect the rendition of confidence + intervals. {it:options} are: + +{p2colset 13 31 33 2}{...} +{p2col:{it:{help line_options}}}change look of spikes + {p_end} +{p2col:{cmd:recast(}{it:plottype}{cmd:)}}plot the confidence intervals using + {it:plottype} + {p_end} +{p2colreset}{...} + +{pmore} + Supported plot types are + {helpb twoway_rarea:rarea}, + {helpb twoway_rbar:rbar}, + {helpb twoway_rspike:rspike}, + {helpb twoway_rcap:rcap}, + {helpb twoway_rcapsym:rcapsym}, + {helpb twoway_rscatter:rscatter}, + {helpb twoway_rline:rline}, + {helpb twoway_rconnected:rconnected}, + {helpb twoway_pcspike:pcspike}, + {helpb twoway_pcspike:pccapsym}, + {helpb twoway_pcarrow:pcarrow} (or {cmd:pcrarrow} for the reverse), + {helpb twoway_pcbarrow:pcbarrow}, and + {helpb twoway_pcscatter:pcscatter}. The default {it:plottype} is + {helpb twoway_rspike:rspike}. The chosen plot type affects the available + options within {cmd:ciopts()}. For example, if the plot type is + {helpb twoway_rbar:rbar} then {it:{help barlook_options}} will be + available. See the plot type's help file for details. + +{pmore} + If multiple confidence intervals are requested, then + {it:{help stylelists}} may be specified in the options within + {cmd:ciopts()}. For example, {cmd:recast(rspike rcap ..)} would use + {helpb twoway_rspike:rspike} for the first confidence interval and + {helpb twoway_rcap:rcap} for the remaining confidence intervals; + {cmd:lwidth(thin medium thick)} would use thin lines for the first + confidence interval, medium width lines for the second, and thick lines + for the third. + +{marker cismooth}{...} +{phang} + {cmd:cismooth}[{cmd:(}{it:options}{cmd:)}] adds smoothed confidence + intervals. {it:options} are: + +{p2colset 13 33 35 2}{...} +{p2col:{cmd:n(}{it:n}{cmd:)}}number of (equally spaced) confidence levels; + default is {cmd:n(50)}; levels are placed in steps of 100/{it:n} from 100/2{it:n} to + 100-100/2{it:n} (e.g., 1, 3, 5, ..., 99 for {it:n}=50) + {p_end} +{p2col:{cmdab:lw:idth(}{it:min max}{cmd:)}}set range of + (relative) line widths; the default is {cmd:range(2 15)} + ({it:max} is exact only for {it:n}=50) + {p_end} +{p2col:{cmdab:i:ntensity(}{it:min max}{cmd:)}}set range of + color intensities, as percentages; the default is {cmd:intensity(}{it:min} {cmd:100)} + where {it:min} is determined as 4/(ceil({it:n}/2)+3)*100 (about 14 for n=50) + {p_end} +{p2col:{cmdab:c:olor(}{help colorstyle:{it:color}}{cmd:)}}set the color (without + intensity multiplier); the default color is determined by the graph scheme + {p_end} +{p2col:{cmdab:psty:le(}{help pstyle:{it:pstyle}}{cmd:)}}set the overall style; + this mainly affects the color + {p_end} +{p2colreset}{...} + +{pmore} + The confidence intervals produced by {cmd:cismooth} are placed behind + confidence intervals requested in {helpb coefplot##levels:levels()} and + {helpb coefplot##ci:ci()}. {helpb coefplot##ciopts:ciopts()} do not + apply to them. + +{dlgtab:Subgraph options} + +{marker bylabel}{...} +{phang} + {cmd:bylabel(}{it:string}{cmd:)} provides a label for the subgraph. Use + double quotes to create multiline labels. For example, + {cmd:bylabel("This is a" "long label")} would create a two-line label. For + text effects (bold, italics, greek letters, etc.) use SMCL tags as + described in {it:{help graph_text}}. + +{pmore} + Subgraphs are implemented in terms of {helpb graph}'s {cmd:by()} option; see + {helpb coefplot##byopts:byopts()} below for options on how to combine and + render the subgraphs. + +{dlgtab:Global options} + +{marker horizontal}{...} +{phang} + {cmd:horizontal} places coefficient values on the x axis. This is the + default unless {helpb coefplot##at:at} is specified. + +{marker vertical}{...} +{phang} + {cmd:vertical} places coefficient values on the y axis. This is the + default if {helpb coefplot##at:at} is specified. + +{marker eqstrict}{...} +{phang} + {cmd:eqstrict} causes equation names to be taken into account (i.e. match coefficients by + equation names and plot equation labels) even if there is only one equation per model. + +{marker order}{...} +{phang} + {cmd:order(}{it:coeflist}{cmd:)} specifies the order of coefficients + (not allowed with {helpb coefplot##at:at}). The default is to use + the order as found in the input models (and place {cmd:_cons} last, within + equations). {it:coeflist} is a + space-separated list of elements such as: + +{p2colset 13 25 27 2}{...} +{p2col:{cmd:.}}insert a gap + {p_end} +{p2col:{it:eq}{cmd::.}}insert a gap within equation {it:eq} + {p_end} +{p2col:{it:coef}}coefficient {it:coef} + {p_end} +{p2col:{it:eq}{cmd::}}all coefficients from equation {it:eq}, in their current order + {p_end} +{p2col:{it:eq}{cmd::}{it:coef}}coefficient {it:coef} from equation {it:eq} + {p_end} +{p2colreset}{...} + +{pmore} + where {it:coef} may contain "{cmd:*}" (any string) and "{cmd:?}" + (any nonzero character) wildcards. + +{pmore} + If no equations are specified, then the requested order of coefficients + is repeated within each equation (keeping the existing order of + equations). Otherwise, the requested order is applied across equations. + Note that in the later case the first element in {cmd:order()} must be an + equation name. {it:eq} is applied to all subsequent elements until a + new {it:eq} is specified. For example, + {cmd:order(5:weight mpg * 4:turn *)} would yield the following order: + "{cmd:weight}" from equation "{cmd:5}", "{cmd:mpg}" from equation "{cmd:5}", + remaining coefficients from equation "{cmd:5}", + "{cmd:turn}" from equation "{cmd:4}", remaining coefficients from equation + "{cmd:4}", remaining equations if any. + +{marker orderby}{...} +{phang} + {cmd:orderby(}[{it:subgraph}{cmd::}][{it:plot}]{cmd:)} orders the + coefficients by a specific model. By default, the coefficients are ordered + according to how they are provided to {cmd:coefplot}, with earlier plots + and subgraphs taking precedence over later ones (and placing {cmd:_cons} + last). This means that coefficients that only appear in later models will + be placed after the coefficients that appear in earlier models. Specify the + {cmd:orderby()} option if you want to change the default behavior and + arrange the coefficients according to their order in a specific model + (and, within each equation, place the other coefficients after these coefficients, but + before {cmd:_cons}). Arguments {it:subgraph} and {it:plot} select the relevant + model. For example, {cmd:orderby(2:3)} will order coefficients according to + the model that is displayed in the third plot of the second subgraph. If one + of the arguments is omitted, it defaults to one. Hence, {cmd:orderby(3)} will + order the coefficients according to the model displayed in the third plot + of the first subgraph; {cmd:orderby(2:)} will use the model displayed in the first + plot of the second subgraph. {cmd:orderby()} will do nothing if a specified subgraph or + plot does not exist. Furthermore, note that the {it:subgraph} argument + is not allowed if the {helpb coefplot##norecycle:norecycle} option has been + specified; plots are numbered uniquely across subgraphs in this case. + +{marker sort}{...} +{phang} + {cmd:sort}[{cmd:(}{it:spec}{cmd:)}] sorts the coefficients by size. {it:spec} is + + [{it:subgraph}{cmd::}][{it:plot}] [, {cmdab:d:escending} {cmd:by(}{it:stat}{cmd:)} ] + +{pmore} + where {it:subgraph} and {it:plot}, being equal to {cmd:.} or a positive + integer, identify the subgraph and plot to be used + to establish the sort order. For example, to sort based on all values in + the second subgraph (possibly including multiple plots), type + {cmd:sort(2:)} or {cmd:sort(2:.)}; to sort based on all values in the third + plot (possibly spanning multiple subgraphs), type {cmd:sort(3)} or + {cmd:sort(.:3)}; to sort based on the values of the third plot in the + second subgraph, type {cmd:sort(2:3)}. Specifying {cmd:sort} without + argument is equivalent to {cmd:sort(.:.)}, that is, to sort based on the + values in all available subgraphs and plots. If you specify a subgraph or + plot that does not exist, {cmd:sort()} will do nothing. Furthermore, if the + {helpb coefplot##norecycle:norecycle} option is specified, the {it:subgraph} + argument can be omitted as the plots will be uniquely numbered across + subgraphs. + +{pmore} + By default, the coefficients are sorted in ascending order of the values of + the point estimates. Specify suboption {cmd:descending} to use a + descending sort order. Furthermore, use {cmd:by(}{it:stat}{cmd:)} to change + the relevant statistic, where {it:stat} may be: + +{p2colset 13 25 27 2}{...} +{p2col:{cmd:b}}sort by point estimate (the default){p_end} +{p2col:{cmd:v} (or {cmd:se})}sort by variance (or standard error){p_end} +{p2col:{cmd:t}}sort by t (or z) statistic{p_end} +{p2col:{cmd:tabs}}sort by absolute t (or z) statistic{p_end} +{p2col:{cmd:p}}sort by p-value{p_end} +{p2col:{cmd:df}}sort by degrees of freedom{p_end} +{p2col:{cmd:ll} [#]}sort by (#th) lower confidence limit; # defaults to 1{p_end} +{p2col:{cmd:ul} [#]}sort by (#th) upper confidence limit; # defaults to 1{p_end} +{p2col:{cmd:aux} [#]}sort by (#th) auxiliary variable (see the + {helpb coefplot##aux:aux()} option); # defaults to 1{p_end} +{p2colreset}{...} + +{pmore} + In case of multiple equations, coefficients will be sorted separately + within each equation, keeping the original order of equations. Use the + {helpb coefplot##order:order()} option the change the order of the equations. + +{marker relocate}{...} +{phang} + {cmd:relocate(}{it:spec}{cmd:)} assigns specific positions to the + coefficients on the category axis. {it:spec} is: + + [{it:eq}{cmd::}]{it:coef} {cmd:=} # [[{it:eq}{cmd::}]{it:coef} {cmd:=} # ...] + +{pmore} + where {it:eq} and {it:coef} may contain "{cmd:*}" (any string) and + "{cmd:?}" (any nonzero character) wildcards. If {helpb coefplot##bycoefs:bycoefs} is + specified, use numbers (1, 2, ...) instead of {it:eq} and {it:coef} + to address the elements on the categorical axis. + +{pmore}The default for {cmd:coefplot} is to place coefficients + at integer values 1, 2, 3, ... (from top to bottom in horizontal mode, + from left to right in vertical mode). The {cmd:relocate()} option gives + you the possibility to specify alternative values. If, for example, you + want to place coefficient {cmd:mpg} at value 2.5 on the category axis, you + could type {cmd:relocate(mpg = 2.5)}. If you only want to change the + order of coefficients and are fine with integer positions, then use the + {helpb coefplot##order:order()} option. Note that the specified positions + are assigned before inserting gaps between equations, headings, and + groups (see {helpb coefplot##eqlabels:eqlabels()}, + {helpb coefplot##headings:headings()}, and + {helpb coefplot##groups:groups()}). Hence, the final plot positions might + deviate from the specified positions if there are equation labels, headings, + or group labels. + +{marker bycoefs}{...} +{phang} + {cmd:bycoefs} flips subgraphs and coefficients (not allowed with + {helpb coefplot##at:at}). If {cmd:bycoefs} is specified, a + separate subgraph is produced for each coefficient. In this + case, use integer numbers (1, 2, ...) instead of coefficient names + to address the elements on the categorical axis within options + {helpb coefplot##relocate:relocate()}, + {helpb coefplot##headings:headings()}, and + {helpb coefplot##groups:groups()}. + +{marker norecycle}{...} +{phang} + {cmd:norecycle} increments plot styles across subgraphs. The default is + to start over with each new subgraph. + +{marker nooffsets}{...} +{phang} + {cmd:nooffsets} suppresses automatic offsets for plot positions. + +{marker format}{...} +{phang} + {cmd:format(}{it:format}{cmd:)} sets the display format for + coefficients. This affects the rendition of the axis and marker + labels. {it:format} may be a numeric format or a date format + (see help {helpb format}). + +{marker pnum}{...} +{phang} + {cmd:p{it:#}(}{help coefplot##plotopts:{it:plotopts}}{cmd:)} specifies + options for the {it:#}th plot. For example, type {cmd:p2(nokey)} to exclude + plot 2 from the legend (see {helpb coefplot##nokey:nokey}). Use the {cmd:p#()} + options as an alternative to specifying options directly within a plot; in + case of conflict, options specified within a plot take precedence + over options specified via {cmd:p#()}. + +{marker nolabels}{...} +{phang} + {cmd:nolabels} causes coefficient names to be used as labels instead of + variable labels or value labels. + +{marker coeflabels}{...} +{phang} + {cmd:coeflabels(}{it:spec}{cmd:)} specifies custom labels for + coefficients (not allowed with {helpb coefplot##at:at}). {it:spec} is + +{p 12 14 2} + [{it:coeflist} {cmd:=} {cmd:"}{it:label}{cmd:"} [{it:coeflist} {cmd:=} {cmd:"}{it:label}{cmd:"} ...]] + [{cmd:,} {cmdab:t:runcate(}#{cmd:)} {cmdab:w:rap(}#{cmd:)} {cmdab:nob:reak} + {cmdab:i:nteraction(}{it:string}{cmd:)} + {it:{help axis_label_options:suboptions}}] + +{pmore} + with {it:coeflist} as above for {helpb coefplot##keep:keep()}. Enclose + {it:label} in double quotes + if it contains spaces, e.g. {bind:{cmd:coeflabels(foreign = "Car Type")}}. + Enclose {it:label} in compound double quotes to create a multiline + label, e.g. {bind:{cmd:coeflabels(foreign = `""This is a" "long label""')}}; + alternatively, apply the {cmd:wrap()} option. For text effects + (bold, italics, greek letters, etc.) use SMCL tags as described in + {it:{help graph_text}}. + +{pmore} + Option {cmd:truncate(}#{cmd:)} truncates coefficient labels to + a maximum length of # characters. Option {cmd:wrap(}#{cmd:)} divides + coefficient labels into multiple lines, where each line has a maximum + length of # characters. {cmd:truncate()} and {cmd:wrap()} operate on + words. That is, they try to fill to the maximum length without breaking + in the middle of a word. However, if a word is longer than # characters, + it will be split or truncated. Specify {cmd:nobreak} to prevent + {cmd:truncate()} and {cmd:wrap()} from splitting or truncating words + that are longer than # characters. If {cmd:truncate()} and {cmd:wrap()} + are both specified, {cmd:truncate()} is applied first. + {cmdab:interaction()} specifies the string to be used as + delimiter in labels for interaction terms; the default is + {cmd:interaction(" # ")}. {it:suboptions} are axis label suboptions as + described in {it:{help axis_label_options}}. + +{pmore} + Note: Labels containing multiple lines are left unchanged by {cmd:truncate()} + and {cmd:wrap()}. Therefore, if you don't like how {cmd:wrap()} breaks a + specific label, you can provide a custom variant of it in {cmd:coeflabels()} + while still using {cmd:wrap()} for the other labels. {cmd:truncate()} + and {cmd:wrap()} may fail to process a label if it contains compound + double quotes; the label will be left unchanged in this case. + +{marker noeqlabels}{...} +{phang} + {cmd:noeqlabels} suppresses equation labels. + +{marker eqlabels}{...} +{phang} + {cmd:eqlabels(}{it:spec}{cmd:)} specifies custom labels for equations, one after + the other (not allowed with {helpb coefplot##at:at}). {it:spec} is: + +{p 12 14 2} + [{cmd:"}{it:label}{cmd:"} [{cmd:"}{it:label}{cmd:"} ...]] [{cmd:,} + {cmdab:lab:els}[{cmd:(}{it:string}{cmd:)}] + [{cmd:{ul:no}}]{cmdab:g:ap}[{cmd:(}#{cmd:)}] {cmdab:ashead:ings} + {cmdab:off:set(}#{cmd:)} {cmdab:t:runcate(}#{cmd:)} {cmdab:w:rap(}#{cmd:)} + {cmdab:nob:reak} {it:{help axis_label_options:suboptions}} ] + +{pmore} + Enclose labels in double quotes if they contain spaces, + e.g. {bind:{cmd:eqlabels("EQ one" "EQ two")}}. Enclose labels in compound + double quotes to create multiline labels, + e.g. {bind:{cmd:eqlabels(`""This is a" "long label""')}}. Alternatively, + apply the {cmd:wrap()} option. For text effects + (bold, italics, greek letters, etc.) use SMCL tags as described in + {it:{help graph_text}}. + +{pmore} + Option {cmd:label} causes the equation names to be treated as + variable names; {cmd:coefplot} will then use the corresponding variable labels + (and, depending on context, value labels) to label the equations. Specify + {cmd:label(}{it:string}{cmd:)} to set the string to be used as + delimiter in labels for interaction terms; typing {cmd:label} without argument + is equivalent to {cmd:label(" # ")}. {cmd:gap()} specifies the size of the + gap between equations. The + default is {cmd:gap(1)}. {cmd:nogap} suppresses the gap between + equations. {cmdab:asheadings} treats equation labels as headings; + see {helpb coefplot##headings:headings()}. {cmd:offset()}, only + allowed with {cmd:asheadings}, offsets the labels. {cmd:truncate()}, + {cmd:wrap()}, {cmd:nobreak}, and {it:suboptions} are as above for + {helpb coefplot##coeflabels:coeflabels()}. + +{marker headings}{...} +{phang} + {cmd:headings(}{it:spec}{cmd:)} adds headings between + coefficients (not allowed with {helpb coefplot##at:at}). {it:spec} is: + +{p 12 14 2} + {it:coeflist} {cmd:=} {cmd:"}{it:label}{cmd:"} [{it:coeflist} {cmd:=} {cmd:"}{it:label}{cmd:"} ...] + [{cmd:,} [{cmd:{ul:no}}]{cmdab:g:ap}[{cmd:(}#{cmd:)}] + {cmdab:off:set(}#{cmd:)} {cmdab:t:runcate(}#{cmd:)} + {cmdab:w:rap(}#{cmd:)} {cmdab:nob:reak} + {it:{help axis_label_options:suboptions}} ] + +{pmore} + with {it:coeflist} as above for {helpb coefplot##keep:keep()}. If + {helpb coefplot##bycoefs:bycoefs} is specified, use numbers 1, 2, + ... instead of {it:coeflist} to address the elements on the categorical + axis. Enclose {it:label} in double quotes if it contains + spaces. For example, {bind:{cmd:headings(0.foreign = "Car Type")}} will + print the heading "{cmd:Car Type}" before coefficient "{cmd:0.foreign}". + Enclose {it:label} in compound double quotes to create a multiline + label, e.g. {bind:{cmd:headings(foreign = `""This is a" "long heading""')}}. + Alternatively, apply the {cmd:wrap()} option. For text effects (bold, + italics, greek letters, etc.) use SMCL tags as + described in {it:{help graph_text}}. + +{pmore} + {cmd:gap()} and {cmdab:offset()} are as above for + {helpb coefplot##eqlabels:eqlabels()}. {cmd:truncate()}, {cmd:wrap()}, + {cmd:nobreak}, and {it:suboptions} are as above for + {helpb coefplot##coeflabels:coeflabels()}. + +{marker groups}{...} +{phang} + {cmd:groups(}{it:spec}{cmd:)} adds labels for groups of + coefficients (not allowed with {helpb coefplot##at:at}). The specified + label will be printed beside (or, in vertical mode, below) the identified + group of coefficients. {it:spec} is: + +{p 12 14 2} + {it:coeflist} {cmd:=} {cmd:"}{it:label}{cmd:"} [{it:coeflist} {cmd:=} {cmd:"}{it:label}{cmd:"} ...] + [{cmd:,} [{cmd:{ul:no}}]{cmdab:g:ap}[{cmd:(}#{cmd:)}] + {cmdab:t:runcate(}#{cmd:)} {cmdab:w:rap(}#{cmd:)} + {cmdab:nob:reak} {it:{help axis_label_options:suboptions}} ] + +{pmore} + with {it:coeflist} as above for {helpb coefplot##keep:keep()}. If + {helpb coefplot##bycoefs:bycoefs} is specified, use numbers 1, 2, + ... instead of {it:coeflist} to address the elements on the categorical + axis. Enclose {it:label} in double quotes if + it contains spaces. Enclose {it:label} in compound double quotes to create + a multiline label. Alternatively, apply the {cmd:wrap()} option. For text + effects (bold, italics, greek letters, etc.) use SMCL tags as described in + {it:{help graph_text}}. + +{pmore} + {cmd:gap()} is as above for + {helpb coefplot##eqlabels:eqlabels()}. {cmd:truncate()}, {cmd:wrap()}, + {cmd:nobreak}, and {it:suboptions} are as above for + {helpb coefplot##coeflabels:coeflabels()}. + +{marker plotlabels}{...} +{phang} + {cmd:plotlabels(}{it:spec}{cmd:)} specifies labels for the plots to be + used in the legend. Labels specified via {cmd:plotlabels()} + take precedence over labels specified in the + {helpb coefplot##label:label()} plot option. {it:spec} is: + +{p 12 14 2} + [{cmd:"}{it:label}{cmd:"} [{cmd:"}{it:label}{cmd:"} ...]] [{cmd:,} {cmdab:t:runcate(}#{cmd:)} + {cmdab:w:rap(}#{cmd:)} {cmdab:nob:reak} ] + +{pmore} + Enclose labels in double quotes if they contain spaces. Enclose labels in + compound double quotes to create multiline labels. Alternatively, + apply the {cmd:wrap()} option. For text effects + (bold, italics, greek letters, etc.) use SMCL tags as described in + {it:{help graph_text}}. Options {cmd:truncate()}, {cmd:wrap()}, and {cmd:nobreak} are as + above for {helpb coefplot##coeflabels:coeflabels()}. + +{marker bylabels}{...} +{phang} + {cmd:bylabels(}{it:spec}{cmd:)} specifies labels for the subgraphs. Labels + specified via {cmd:bylabels()} + take precedence over labels specified in the + {helpb coefplot##bylabel:bylabel()} subgraph option. {it:spec} is: + +{p 12 14 2} + [{cmd:"}{it:label}{cmd:"} [{cmd:"}{it:label}{cmd:"} ...]] [{cmd:,} {cmdab:t:runcate(}#{cmd:)} + {cmdab:w:rap(}#{cmd:)} {cmdab:nob:reak} ] + +{pmore} + Enclose labels in double quotes if they contain spaces. Enclose labels in + compound double quotes to create multiline labels. Alternatively, + apply the {cmd:wrap()} option. For text effects + (bold, italics, greek letters, etc.) use SMCL tags as described in + {it:{help graph_text}}. Options {cmd:truncate()}, {cmd:wrap()}, and {cmd:nobreak} are as + above for {helpb coefplot##coeflabels:coeflabels()}. + +{marker grid}{...} +{phang} + {cmd:grid(}{it:options}{cmd:)} affects the rendition of grid lines on the + category axis (not allowed with {helpb coefplot##at:at}). {it:options} are: + +{p 12 14 2} + { {cmdab:b:etween} | {cmdab:w:ithin} | {cmdab:n:one} } {it:{help axis_label_options:suboptions}} + +{pmore} + {cmdab:b:etween} places grid lines between coefficient labels; + {cmdab:w:ithin} places grid lines at the center of coefficient labels; + {cmdab:n:one} suppress grid lines. {it:suboptions} are axis label suboptions + as described in {it:{help axis_label_options}}. In horizontal mode, the + default is {cmd:within} for single plots and {cmd:between} for multiple + plots. In vertical mode, the default is {cmd:none}. Alternatively, use + {helpb axis_label_options:ytick()} and {helpb axis_label_options:xtick()} + to set grid lines. + +{marker generate}{...} +{phang} + {cmd:generate}[{cmd:(}{it:prefix}{cmd:)}] generates variables containing + the graph data. The variable names will be prefixed by "{cmd:__}" + or as specified by {it:prefix}. + +{marker replace}{...} +{phang} + {cmd:replace} allows {cmd:coefplot} to overwrite existing variables. + +{marker addplot}{...} +{phang} + {cmd:addplot(}{it:plot}{cmd:)} adds other plots to the graph. See help + {it:{help addplot_option}}. By default {cmd:addplot()} has access only to + the first {it:r} observations in the dataset, where {it:r} is the number of + observations used by {cmd:coefplot} to store its internal results. If the + graph does not contain multiple subgraphs and + {helpb coefplot##generate:generate()} or {helpb coefplot##nodrop:nodrop} is + specified, {cmd:addplot()} has access to all observations. + +{marker nodrop}{...} +{phang} + {cmd:nodrop} causes {cmd:coefplot} to keep all observations when generating + the graph. The default is to eliminate unused observations temporarily + to increase speed. {cmd:nodrop} may be useful in connection with the + {helpb coefplot##addplot:addplot()} option, if the graph does not contain + multiple subgraphs. {cmd:nodrop} has no effect if + {helpb coefplot##generate:generate()} is specified. + {p_end} + +{phang} + {it:twoway_options} are general twoway options, other than + {cmd:by()}, as documented in help {it:{help twoway_options}}. + +{marker byopts}{...} +{phang} + {cmd:byopts(}{it:byopts}{cmd:)} determines how subgraphs + are combined. {it:byopts} are as described in help {it:{help by_option}}. + + +{marker examples}{...} +{title:Examples} + + . {stata sysuse auto} + . {stata regress price mpg headroom trunk length turn} + . {stata coefplot, drop(_cons) xline(0)} + + . {stata regress price mpg headroom trunk length turn if foreign==0} + . {stata estimates store domestic} + . {stata regress price mpg headroom trunk length turn if foreign==1} + . {stata estimates store foreign} + . {stata coefplot domestic foreign, drop(_cons) xline(0)} + + . {stata coefplot domestic || foreign, drop(_cons) xline(0)} + + . {stata coefplot domestic || foreign, yline(0) bycoefs vertical byopts(yrescale)} + +{pstd} + For further examples see the {browse "http://repec.sowi.unibe.ch/stata/coefplot":website}, + the {browse "http://www.stata-journal.com/article.html?article=gr0059":Stata Journal article}, or the + {browse "http://ideas.repec.org/p/bss/wpaper/1.html":working paper}. + + +{marker remarks}{...} +{title:Remarks} + +{pstd} + Remarks are presented under the following headings: + + {help coefplot##wildcards:Using wildcards in model names} + {help coefplot##place:Placement of options} + {help coefplot##matrix:Plotting results from matrices} + {help coefplot##tempvar:Accessing internal temporary variables} + + +{marker wildcards}{...} +{title:Using wildcards in model names} + +{pstd} + Instead of providing distinct model names to {cmd:coefplot}, you can also + specify a name pattern containing {cmd:*} (any string) + and {cmd:?} (any nonzero character) wildcards. {cmd:coefplot} + will then plot the results from all matching + models. If a name pattern is specified as part of a plot delimited by + parentheses, the results from the matching models will be combined into the + same plot. For example, if models {cmd:est11}, {cmd:est12}, {cmd:est13}, + {cmd:est21}, {cmd:est22}, and {cmd:est23} are in + memory, typing + +{com}{...} + . coefplot (est1*, {txt:{it:opts1}}) (est2*, {txt:{it:opts2}}) +{txt}{...} + +{pstd} + is equivalent to + +{com}{...} + . coefplot (est11 est12 est13, {txt:{it:opts1}}) (est21 est22 est23, {txt:{it:opts2}}) +{txt}{...} + +{pstd} + Likewise, typing + +{com}{...} + . coefplot (est*1, {txt:{it:opts1}} \ est*2, {txt:{it:opts2}} \, {txt:{it:opts3}}) +{txt}{...} + +{pstd} + is equivalent to + +{com}{...} + . coefplot (est11 est21, {txt:{it:opts1}} \ est12 est22, {txt:{it:opts2}} \, {txt:{it:opts3}}) +{txt}{...} + +{pstd} + If a name pattern is specified without parentheses, + the matching models are treated as separate plots. For example, typing + +{com}{...} + . coefplot est1* || est2* +{txt}{...} + +{pstd} + is equivalent to + +{com}{...} + . coefplot est11 est12 est13 || est21 est22 est23 +{txt}{...} + +{pstd} + or + +{com}{...} + . coefplot (est11) (est12) (est13) || (est21) (est22) (est23) +{txt}{...} + +{pstd} + Use global options {helpb coefplot##pnum:p1()}, {helpb coefplot##pnum:p2()}, + etc. to provide specific options to the different plots in this case. For + example, typing + +{com}{...} + . coefplot est1*, p1({txt:{it:opts1}}) p2({txt:{it:opts2}}) p3({txt:{it:opts3}}) +{txt}{...} + +{pstd} + is equivalent to + +{com}{...} + . coefplot (est11, {txt:{it:opts1}}) (est12, {txt:{it:opts2}}) (est13, {txt:{it:opts3}}) +{txt}{...} + + +{marker place}{...} +{title:Placement of options} + +{pstd} + {cmd:coefplot} has four levels of options: + +{phang}(1) {help coefplot##modelopts:{it:modelopts}} are options that apply to a single + model (or matrix). They specify the information to be displayed. + +{phang}(2) {help coefplot##plotopts:{it:plotopts}} are options that apply to a single + plot, possibly containing results from multiple models. They affect + the rendition of markers and confidence intervals and provide a label + for the plot. + +{phang}(3) {help coefplot##subgropts:{it:subgropts}} are options that + apply to a single subgraph, possibly containing multiple plots. + +{phang}(4) {help coefplot##globalopts:{it:globalopts}} are options that apply + to the overall graph. + +{pstd} + The levels are nested in the sense that upper level options include all + lower level options. That is, + {help coefplot##globalopts:{it:globalopts}} includes + {help coefplot##subgropts:{it:subgropts}}, + {help coefplot##plotopts:{it:plotopts}}, and + {help coefplot##modelopts:{it:modelopts}}; + {help coefplot##subgropts:{it:subgropts}} includes + {help coefplot##plotopts:{it:plotopts}}, and + {help coefplot##modelopts:{it:modelopts}}; + {help coefplot##plotopts:{it:plotopts}} includes + {help coefplot##modelopts:{it:modelopts}}. However, upper level options + may not be specified at a lower level. + +{pstd} + If lower level options are specified at an upper level, they serve as + defaults for all included lower levels elements. For example, if you want + to draw 99% and 95% confidence intervals for all included models, + specify {cmd:levels(99 95)} as global option: + +{com}{...} + . coefplot model1 model2 model3, levels(99 95) +{txt}{...} + +{pstd} + Options specified with an individual element override the defaults set + by upper level options. For example, if you want to draw 99% and 95% + confidence intervals for model 1 and model 2 and 90% confidence intervals + for model 3, you could type: + +{com}{...} + . coefplot model1 model2 (model3, level(90)), levels(99 95) +{txt}{...} + +{pstd} + There are some fine distinctions about the placement of options and how they + are interpreted. For example, if you type + +{com}{...} + . coefplot m1, {txt:{it:opts1}} || m2, {txt:{it:opts2}} {txt:{it:opts3}} +{txt}{...} + +{pstd} + then {it:opts2} and {it:opts3} are interpreted as global options. If you + want to apply {it:opts2} only to {cmd:m2} then type + +{com}{...} + . coefplot m1, {txt:{it:opts1}} || m2, {txt:{it:opts2}} ||, {txt:{it:opts3}} +{txt}{...} + +{pstd} + Similarly, if you type + +{com}{...} + . coefplot (m1, {txt:{it:opts1}} \ m2, {txt:{it:opts2}}) +{txt}{...} + +{pstd} + then {it:opts2} will be applied to both models. To apply {it:opts2} only to + {cmd:m2} type + +{com}{...} + . coefplot (m1, {txt:{it:opts1}} \ m2, {txt:{it:opts2}} \) +{txt}{...} + +{pstd} + or, if you also want to include {it:opts3} to be applied to both models, + type + +{com}{...} + . coefplot (m1, {txt:{it:opts1}} \ m2, {txt:{it:opts2}} \, {txt:{it:opts3}}) +{txt}{...} + +{pstd} + or + +{com}{...} + . coefplot (m1, {txt:{it:opts1}} \ m2, {txt:{it:opts2}} \), {txt:{it:opts3}} +{txt}{...} + +{pstd} + In case of multiple subgraphs there is some ambiguity about where to + specify the plot options (unless global option + {helpb coefplot##norecycle:norecycle} is specified). You can provide plot + options within any of the subgraphs as plot options are collected across + subgraphs. However, in case of conflict, the plot options from the rightmost + subgraph usually take precedence over earlier plot options. In addition, + you can also use global options {helpb coefplot##pnum:p1()}, + {helpb coefplot##pnum:p2()}, etc. to provide + options for specific plots. In case of conflict, options specified within a plot take + precedence over options provided via {helpb coefplot##pnum:p1()}, + {helpb coefplot##pnum:p2()}, etc. + +{marker matrix}{...} +{title:Plotting results from matrices} + +{pstd} + Use syntax {helpb coefplot##matrix:{ul:m}atrix({it:mspec})} instead of the + name of a stored model to plot results from a matrix. {it:mspec} may be: + +{p2colset 9 21 23 2}{...} +{p2col:{it:name}}use first row of matrix {it:name} + {p_end} +{p2col:{it:name}{cmd:[}#{cmd:,.]}}use #th row of + matrix {it:name}; may also type {it:name}{cmd:[}#{cmd:,]} or + {it:name}{cmd:[}#{cmd:]} + {p_end} +{p2col:{it:name}{cmd:[.,}#{cmd:]}}use #th column of + matrix {it:name}; may also type {it:name}{cmd:[,}#{cmd:]} + {p_end} +{p2colreset}{...} + +{pstd} + If the {cmd:matrix()} syntax is used, then option {helpb coefplot##b:b()} is discarded + and names given in {helpb coefplot##at:at()}, {helpb coefplot##ci:ci()}, + {helpb coefplot##v:v()}, {helpb coefplot##se:se()}, + {helpb coefplot##df:df()}, and {helpb coefplot##aux:aux()} refer to regular + matrices instead of {cmd:e()}-matrices. The matrix name may be omitted in these + options if results are to be read from the same matrix; only the + relevant row or column numbers have to be provided in this case (whether the + numbers are interpreted as row or column numbers + depends in how {cmd:matrix()} was specified). + +{pstd} + For example, to plot medians and their confidence intervals as computed + by {helpb centile} you could type: + +{com}{...} + sysuse auto, clear + matrix C = J(3,3,.) + matrix rownames C = median ll95 ul95 + matrix colnames C = mpg trunk turn + local i 0 + foreach v of var mpg trunk turn { + local ++ i + centile `v' + matrix C[1,`i'] = r(c_1) \ r(lb_1) \ r(ub_1) + } + matrix list C + coefplot matrix(C), ci((2 3)) +{txt}{...} + +{pstd} + This is equivalent to: + +{com}{...} + coefplot matrix(C[1]), ci((C[2] C[3])) +{txt}{...} + +{pstd} + Note that a single {cmd:coefplot} command can contain both regular syntax + and {cmd:matrix()} syntax. For example, to add means to the graph above + you could type: + +{com}{...} + mean mpg trunk turn + estimates store mean + coefplot (matrix(C), ci((2 3))) (mean) +{txt}{...} + + +{marker tempvar}{...} +{title:Accessing internal temporary variables} + +{pstd} + {cmd:coefplot} maintains a number of internal variables that can be + used within + {helpb coefplot##ifopt:if()}, + {helpb coefplot##weight:weight()}, + {helpb coefplot##transform:transform()}, + {helpb marker_label_options:mlabel()}, + {helpb marker_label_options:mlabvposition()}, and + {helpb addplot_option:addplot()}. These + variables are: + +{p2colset 9 21 23 2}{...} +{p2col:{cmd:@b}}point estimates + {p_end} +{p2col:{cmd:@ll}#}lower limits of confidence interval # (may use {cmd:@ll} for {cmd:@ll1}) + {p_end} +{p2col:{cmd:@ul}#}upper limits of confidence interval # (may use {cmd:@ul} for {cmd:@ul1}) + {p_end} +{p2col:{cmd:@V}}variances + {p_end} +{p2col:{cmd:@se}}standard errors + {p_end} +{p2col:{cmd:@t}}t or z statistics, computed as @b/@se + {p_end} +{p2col:{cmd:@df}}degrees of freedom + {p_end} +{p2col:{cmd:@pval}}p-values, computed as (1-normal(|@t|))*2 or ttail(@df,|@t|)*2, depending + on whether df are available + {p_end} +{p2col:{cmd:@at}}plot positions + {p_end} +{p2col:{cmd:@plot}}plot ID (labeled) + {p_end} +{p2col:{cmd:@by}}subgraph ID (labeled) + {p_end} +{p2col:{cmd:@mlbl}}Marker labels set by {helpb coefplot##mlabels:mlabels()} (string variable) + {p_end} +{p2col:{cmd:@mlpos}}Marker label positions set by {helpb coefplot##mlabels:mlabels()} + {p_end} +{p2col:{cmd:@aux}#}auxiliary variables collected by {helpb coefplot##aux:aux()} (may use {cmd:@aux} for {cmd:@aux1}) + {p_end} +{p2colreset}{...} + +{pstd} + The internal variables can be used like other variables in the + dataset. For example, option {cmd:mlabel(@plot)} would add plot labels as marker + labels or option {cmd:addplot(line @at @b)} would draw a connecting line + through all point estimates in the graph. + + +{marker saved_results}{...} +{title:Saved results} + +{pstd} + {cmd:coefplot} returns the following macros and scalars in {cmd:r()}: + +{synoptset 20 tabbed}{...} +{p2col 5 20 24 2: Scalars}{p_end} +{synopt:{cmd:r(n_ci)}}number of confidence intervals{p_end} +{synopt:{cmd:r(n_plot)}}number of plots{p_end} +{synopt:{cmd:r(n_subgr)}}number of subgraphs{p_end} + +{synoptset 20 tabbed}{...} +{p2col 5 20 24 2: Macros}{p_end} +{synopt:{cmd:r(graph)}}copy of graph command{p_end} +{synopt:{cmd:r(labels)}}coefficient labels{p_end} +{synopt:{cmd:r(eqlabels)}}equation labels{p_end} +{synopt:{cmd:r(groups)}}group labels{p_end} +{synopt:{cmd:r(headings)}}headings{p_end} +{synopt:{cmd:r(legend)}}contents of legend option{p_end} + + +{marker author}{...} +{title:Author} + +{pstd} + Ben Jann, University of Bern, ben.jann@unibe.ch + +{pstd} + Thanks for citing this software in one of the following ways: + +{pmore} + Jann, B. (2014). Plotting regression coefficients and other + estimates. The Stata Journal 14(4): 708-737. + +{pmore} + Jann, B. (2013). Plotting regression coefficients and other estimates + in Stata. University of Bern Social Sciences Working Papers + Nr. 1. Available from + {browse "http://ideas.repec.org/p/bss/wpaper/1.html"}. + +{pmore} + Jann, B. (2013). coefplot: Stata module to plot regression coefficients + and other results. Available from + {browse "http://ideas.repec.org/c/boc/bocode/s457686.html"}. + + diff --git a/ado/e/estadd.ado b/ado/e/estadd.ado new file mode 100644 index 0000000..7f0151d --- /dev/null +++ b/ado/e/estadd.ado @@ -0,0 +1,2465 @@ +*! version 2.3.5 05feb2016 Ben Jann +* 1. estadd and helpers +* 2. estadd_local +* 3. estadd_scalar +* 4. estadd_matrix +* 5. estadd_mean +* 6. estadd_sd +* 7. estadd_beta +* 8. estadd_coxsnell +* 9. estadd_nagelkerke +* 10. estadd_ysumm +* 11. estadd_summ +* 12. estadd_vif +* 13. estadd_ebsd +* 14. estadd_expb +* 15. estadd_pcorr +* 16. estadd_lrtest +* 17. estadd_brent +* 18. estadd_fitstat +* 19. estadd_listcoef +* 20. estadd_mlogtest +* 21. estadd_prchange +* 22. estadd_prvalue +* 23. estadd_asprvalue +* 24. estadd_margins +* 99. copy of erepost.ado + +* 1. +program estadd + version 8.2 + local caller : di _caller() + capt _on_colon_parse `macval(0)' + if !_rc { + local 0 `"`s(before)'"' // cannot apply macval() here + local names `"`s(after)'"' + } + syntax anything(equalok id="subcommand") [if] [in] [fw aw iw pw] [, * ] + if regexm(`"`anything'"',"^r\((.*)\)$") { // check -estadd r(name)- + capt confirm scalar `anything' + if _rc { + capt confirm matrix `anything' + if _rc { + di as err `"`anything' not found"' + exit 111 + } + else { + local anything `"matrix `anything'"' + } + } + else { + local anything `"scalar `anything'"' + } + } + gettoken subcommand : anything + capt confirm name `subcommand' + if _rc { + di as err "invalid subcommand" + exit 198 + } + if `"`options'"'!="" local options `", `options'"' + if `"`weight'`exp'"'!="" local wgtexp `"[`weight'`exp']"' + +//expand estimates names and backup current estimates if necessary + tempname rcurrent ecurrent + capt _return drop `rcurrent' + _return hold `rcurrent' + capt noisily { + local names: list retok names + if "`names'"=="" { + local names "." + local qui + } + else local qui quietly + foreach name of local names { + if "`name'"=="." { + capt est_expand "`name'" + if _rc local enames "`enames'`name' " + else local enames "`enames'`r(names)' " + } + else { + est_expand "`name'" //=> error if estimates not found + local enames "`enames'`r(names)' " + } + } + local names: list uniq enames + if "`names'"=="." local active + else { + capt est_expand . + if _rc local active "." + else local active "`r(names)'" + if "`active'"=="." | `:list posof "`active'" in names'==0 { + local active + _est hold `ecurrent', restore estsystem nullok + } + } + } + if _rc { + _return restore `rcurrent' + exit _rc + } + _return restore `rcurrent', hold + +// cases: +// - if active estimates not stored yet and "`names'"==".": simply execute +// estadd_subcmd to active estimates +// - else if active estimates not stored yet: backup/restore active estimates +// - else if active estimates stored but not in `names': backup/restore active estimates +// - else if active estimates stored: no backup but restore at end + +//loop over estimates names and run subcommand + nobreak { + foreach m of local names { + if "`names'"!="." { + if "`m'"=="." _est unhold `ecurrent' + else { + capt confirm new var _est_`m' // fix e(sample) + if _rc qui replace _est_`m' = 0 if _est_`m' >=. + _est unhold `m' + } + } + backup_estimates_name + capt n break `qui' version `caller': /// + estadd_`macval(anything)' `if' `in' `wgtexp' `options' + local rc = _rc + restore_estimates_name + if "`names'"!="." { + if "`m'"=="." _est hold `ecurrent', restore estsystem nullok + else _est hold `m', estimates varname(_est_`m') + } + if `rc' continue, break + } + if "`active'"!="" estimates restore `active', noh + } + _return restore `rcurrent' + if `rc' { + if `rc' == 199 di as error "invalid subcommand" + exit `rc' + } +end + +program define backup_estimates_name, eclass + ereturn local _estadd_estimates_name `"`e(_estimates_name)'"' + ereturn local _estimates_name "" +end +program define restore_estimates_name, eclass + local hold `"`e(_estadd_estimates_name)'"' + ereturn local _estadd_estimates_name "" + ereturn local _estimates_name `"`hold'"' +end + +program confirm_new_ename + capture confirm existence `e(`0')' + if !_rc { + di as err "e(`0') already defined" + exit 110 + } +end + +program confirm_esample + local efun: e(functions) + if `:list posof "sample" in efun'==0 { + di as err "e(sample) information not available" + exit 498 + } +end + +program confirm_numvar + args var + local ts = index("`var'",".") + confirm numeric variable `=substr("`var'",`ts'+1,.)' +end + +program define added_macro + args name + di as txt %25s `"e(`name') : "' `""{res:`e(`name')'}""' // cannot apply macval() here +end + +program define added_scalar + args name label + di as txt %25s `"e(`name') = "' " " as res e(`name') _c + if `"`label'"'!="" { + di as txt _col(38) `"(`label')"' + } + else di "" +end + +program define added_matrix + args name label + capture { + local r = rowsof(e(`name')) + local c = colsof(e(`name')) + } + if _rc { + tempname tmp + mat `tmp' = e(`name') + local r = rowsof(`tmp') + local c = colsof(`tmp') + } + di as txt %25s `"e(`name') : "' " " /// + as res "`r' x `c'" _c + if `"`label'"'=="_rown" { + local thelabel: rownames e(`name') + local thelabel: list retok thelabel + if `r'>1 { + local thelabel: subinstr local thelabel " " ", ", all + } + di as txt _col(38) `"(`thelabel')"' + } + else if `"`label'"'!="" { + di as txt _col(38) `"(`label')"' + } + else di "" +end + +* 2. +* -estadd- subroutine: add local +program estadd_loc + estadd_local `macval(0)' +end +program estadd_loca + estadd_local `macval(0)' +end +program estadd_local, eclass + version 8.2 + syntax anything(equalok) [, Prefix(name) Replace Quietly ] + gettoken name def : anything , parse(" =:") + if "`replace'"=="" { + confirm_new_ename `prefix'`name' + } + ereturn local `prefix'`name'`macval(def)' + di _n as txt "added macro:" + added_macro `prefix'`name' +end + +* 3. +* -estadd- subroutine: add scalar +program estadd_sca + estadd_scalar `0' +end +program estadd_scal + estadd_scalar `0' +end +program estadd_scala + estadd_scalar `0' +end +program estadd_scalar, eclass + version 8.2 + syntax anything(equalok) [, Prefix(name) Replace Quietly ] + if regexm("`anything'","^r\((.*)\)$") { // estadd scalar r(name) + local name = regexs(1) + capt confirm name `name' + confirm scalar `anything' + if _rc error 198 + local equ "`anything'" + } + else { + local isname 0 + gettoken name equ0: anything, parse(" =") + capt confirm name `name' + if _rc error 198 + else if `"`equ0'"'=="" { // estadd scalar name + local isname 1 + local equ "scalar(`name')" + } + else { // estadd scalar name [=] exp + gettoken trash equ : equ0, parse(" =") + if `"`trash'"'!="=" { + local equ `"`equ0'"' + } + } + } + if "`replace'"=="" { + confirm_new_ename `prefix'`name' + } + ereturn scalar `prefix'`name' = `equ' + di _n as txt "added scalar:" + added_scalar `prefix'`name' +end + +* 4. +* -estadd- subroutine: add matrix +program estadd_mat + estadd_matrix `0' +end +program estadd_matr + estadd_matrix `0' +end +program estadd_matri + estadd_matrix `0' +end +program estadd_matrix, eclass + version 8.2 + syntax anything(equalok) [, Prefix(name) Replace Quietly ] + if regexm("`anything'","^r\((.*)\)$") { // estadd matrix r(name) + local name = regexs(1) + capt confirm name `name' + if _rc error 198 + confirm matrix `anything' + local equ "`anything'" + } + else { + local isname 0 + gettoken name equ0: anything, parse(" =") + capt confirm name `name' + if _rc error 198 + else if `"`equ0'"'=="" { // estadd matrix name + local isname 1 + local equ "`name'" + } + else { // estadd matrix name [=] exp + gettoken trash equ : equ0, parse(" =") + if `"`trash'"'!="=" { + local equ `"`equ0'"' + } + } + } + if "`replace'"=="" { + confirm_new_ename `prefix'`name' + } + tempname M + mat `M' = `equ' + ereturn matrix `prefix'`name' = `M' + di _n as txt "added matrix:" + added_matrix `prefix'`name' +end + +* 5. +* -estadd- subroutine: means of regressors +program define estadd_mean, eclass + version 8.2 + syntax [, Prefix(name) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//check e()-names + if "`replace'"=="" confirm_new_ename `prefix'mean +//use aweights with -summarize- + local wtype `e(wtype)' + if "`wtype'"=="pweight" local wtype aweight +//subpop? + local subpop "`e(subpop)'" + if "`subpop'"=="" local subpop 1 +//copy coefficients matrix and determine varnames + tempname results + mat `results' = e(b) + local vars: colnames `results' +//loop over variables: calculate -mean- + local j 0 + foreach var of local vars { + local ++j + capture confirm_numvar `var' + if _rc mat `results'[1,`j'] = .z + else { + capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop', meanonly + mat `results'[1,`j'] = cond(_rc,.,r(mean)) + } + } +//return the results + ereturn matrix `prefix'mean = `results' + di _n as txt "added matrix:" + added_matrix `prefix'mean +end + +* 6. +* -estadd- subroutine: standard deviations of regressors +program define estadd_sd, eclass + version 8.2 + syntax [, noBinary Prefix(name) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//check e()-names + if "`replace'"=="" confirm_new_ename `prefix'sd +//use aweights with -summarize- + local wtype `e(wtype)' + if "`wtype'"=="pweight" local wtype aweight +//subpop? + local subpop "`e(subpop)'" + if "`subpop'"=="" local subpop 1 +//copy coefficients matrix and determine varnames + tempname results + mat `results' = e(b) + local vars: colnames `results' +//loop over variables: calculate -mean- + local j 0 + foreach var of local vars { + local ++j + capture confirm_numvar `var' + if _rc mat `results'[1,`j'] = .z + else { + capture assert `var'==0 | `var'==1 if e(sample) & `subpop' + if _rc | "`binary'"=="" { + capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop' + mat `results'[1,`j'] = cond(_rc,.,r(sd)) + } + else mat `results'[1,`j'] = .z + } + } +//return the results + ereturn matrix `prefix'sd = `results' + di _n as txt "added matrix:" + added_matrix `prefix'sd +end + +* 7. +* -estadd- subroutine: standardized coefficients +program define estadd_beta, eclass + version 8.2 + syntax [, Prefix(name) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//check e()-names + if "`replace'"=="" confirm_new_ename `prefix'beta +//use aweights with -summarize- + local wtype `e(wtype)' + if "`wtype'"=="pweight" local wtype aweight +//subpop? + local subpop "`e(subpop)'" + if "`subpop'"=="" local subpop 1 +//copy coefficients matrix and determine varnames + tempname results sddep + mat `results' = e(b) + local vars: colnames `results' + local eqs: coleq `results', q + local depv "`e(depvar)'" +//loop over variables: calculate -beta- + local j 0 + local lastdepvar + foreach var of local vars { + local depvar: word `++j' of `eqs' + if "`depvar'"=="_" local depvar "`depv'" + capture confirm_numvar `depvar' + if _rc mat `results'[1,`j'] = .z + else { + if "`depvar'"!="`lastdepvar'" { + capt su `depvar' [`wtype'`e(wexp)'] if e(sample) & `subpop' + scalar `sddep' = cond(_rc,.,r(sd)) + } + capture confirm_numvar `var' + if _rc mat `results'[1,`j'] = .z + else { + capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop' + mat `results'[1,`j'] = cond(_rc,.,`results'[1,`j'] * r(sd) / `sddep') + } + } + local lastdepvar "`depvar'" + } +//return the results + ereturn matrix `prefix'beta = `results' + di _n as txt "added matrix:" + added_matrix `prefix'beta +end + +* 8. +* -estadd- subroutine: Cox & Snell Pseudo R-Squared +program define estadd_coxsnell, eclass + version 8.2 + syntax [, Prefix(name) Replace Quietly ] +//check e()-names + if "`replace'"=="" confirm_new_ename `prefix'coxsnell +//compute statistic + tempname results + scalar `results' = 1 - exp((e(ll_0)-e(ll))*2/e(N)) // = 1 - exp(e(ll_0)-e(ll))^(2/e(N)) +//return the results + *di as txt "Cox & Snell Pseudo R2 = " as res `results' + ereturn scalar `prefix'coxsnell = `results' + di _n as txt "added scalar:" + added_scalar `prefix'coxsnell +end + +* 9. +* -estadd- subroutine: Nagelkerke Pseudo R-Squared +program define estadd_nagelkerke, eclass + version 8.2 + syntax [, Prefix(name) Replace Quietly ] +//check e()-names + if "`replace'"=="" confirm_new_ename `prefix'nagelkerke +//compute statistic + tempname results + scalar `results' = (1 - exp((e(ll_0)-e(ll))*2/e(N))) / (1 - exp(e(ll_0)*2/e(N))) + // = (1 - exp(e(ll_0)-e(ll))^(2/e(N))) / (1 - exp(e(ll_0))^(2/e(N))) +//return the results + *di as txt "Nagelkerke Pseudo R2 = " as res `results' + ereturn scalar `prefix'nagelkerke = `results' + di _n as txt "added scalar:" + added_scalar `prefix'nagelkerke +end + +* 10. +* -estadd- subroutine: summary statistics for dependent variable +program define estadd_ysumm, eclass + version 8.2 + syntax [, MEan SUm MIn MAx RAnge sd Var cv SEMean SKewness /// + Kurtosis MEDian p1 p5 p10 p25 p50 p75 p90 p95 p99 iqr q all /// + Prefix(passthru) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//default prefix + if `"`prefix'"'=="" local prefix y + else { + local 0 ", `prefix'" + syntax [, prefix(name) ] + } +//use aweights with -summarize- + local wtype `e(wtype)' + if "`wtype'"=="pweight" local wtype aweight +//subpop? + local subpop "`e(subpop)'" + if "`subpop'"=="" local subpop 1 +//determine list of stats + tempname results + local Stats p99 p95 p90 p75 p50 p25 p10 p5 p1 kurtosis /// + skewness var sd max min sum mean + if "`all'"!="" { + local stats `Stats' + local range range + local cv cv + local semean semean + local iqr iqr + local sumtype detail + } + else { + if "`q'"!="" { + local p25 p25 + local p50 p50 + local p75 p75 + } + if "`median'"!="" local p50 p50 + foreach stat of local Stats { + if "``stat''"!="" { + local stats: list stats | stat + } + } + if "`stats'"=="" & "`range'"=="" & "`cv'"=="" & /// + "`semean'"=="" & "`iqr'"=="" local stats sd max min mean + local sumtype sum mean min max + if "`:list stats - sumtype'"=="" & "`cv'"=="" & /// + "`semean'"=="" & "`iqr'"=="" local sumtype meanonly + else { + local sumtype `sumtype' Var sd + if "`:list stats - sumtype'"=="" & "`iqr'"=="" local sumtype + else local sumtype detail + } + } + local Stats: subinstr local stats "var" "Var" + local nstats: word count `iqr' `semean' `cv' `range' `stats' + if "`replace'"=="" { + foreach stat in `iqr' `semean' `cv' `range' `stats' { + confirm_new_ename `prefix'`=lower("`stat'")' + } + } +//calculate stats + local var: word 1 of `e(depvar)' + mat `results' = J(`nstats',1,.z) + qui su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop', `sumtype' + local i 0 + if "`iqr'"!="" { + mat `results'[`++i',1] = r(p75) - r(p25) + } + if "`semean'"!="" { + mat `results'[`++i',1] = r(sd) / sqrt(r(N)) + } + if "`cv'"!="" { + mat `results'[`++i',1] = r(sd) / r(mean) + } + if "`range'"!="" { + mat `results'[`++i',1] = r(max) - r(min) + } + foreach stat of local Stats { + mat `results'[`++i',1] = r(`stat') + } +//return the results + local i 0 + di as txt _n "added scalars:" + foreach stat in `iqr' `semean' `cv' `range' `stats' { + local sname = lower("`stat'") + ereturn scalar `prefix'`sname' = `results'[`++i',1] + added_scalar `prefix'`sname' + } +end + +* 11. +* -estadd- subroutine: various summary statistics +program define estadd_summ, eclass + version 8.2 + syntax [, MEan SUm MIn MAx RAnge sd Var cv SEMean SKewness /// + Kurtosis MEDian p1 p5 p10 p25 p50 p75 p90 p95 p99 iqr q all /// + Prefix(name) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//use aweights with -summarize- + local wtype `e(wtype)' + if "`wtype'"=="pweight" local wtype aweight +//subpop? + local subpop "`e(subpop)'" + if "`subpop'"=="" local subpop 1 +//determine list of stats + tempname results results2 + local Stats p99 p95 p90 p75 p50 p25 p10 p5 p1 kurtosis /// + skewness var sd max min sum mean + if "`all'"!="" { + local stats `Stats' + local range range + local cv cv + local semean semean + local iqr iqr + local sumtype detail + } + else { + if "`q'"!="" { + local p25 p25 + local p50 p50 + local p75 p75 + } + if "`median'"!="" local p50 p50 + foreach stat of local Stats { + if "``stat''"!="" { + local stats: list stats | stat + } + } + if "`stats'"=="" & "`range'"=="" & "`cv'"=="" & /// + "`semean'"=="" & "`iqr'"=="" local stats sd max min mean + local sumtype sum mean min max + if "`:list stats - sumtype'"=="" & "`cv'"=="" & /// + "`semean'"=="" & "`iqr'"=="" local sumtype meanonly + else { + local sumtype `sumtype' Var sd + if "`:list stats - sumtype'"=="" & "`iqr'"=="" local sumtype + else local sumtype detail + } + } + local Stats: subinstr local stats "var" "Var" + local nstats: word count `iqr' `semean' `cv' `range' `stats' + if "`replace'"=="" { + foreach stat in `iqr' `semean' `cv' `range' `stats' { + confirm_new_ename `prefix'`=lower("`stat'")' + } + } +//copy coefficients matrix and determine varnames + mat `results' = e(b) + local vars: colnames `results' + if `nstats'>1 { + mat `results' = `results' \ J(`nstats'-1,colsof(`results'),.z) + } +//loop over variables: calculate stats + local j 0 + foreach var of local vars { + local ++j + capture confirm_numvar `var' + if _rc mat `results'[1,`j'] = .z + else { + capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop', `sumtype' + local i 0 + if "`iqr'"!="" { + mat `results'[`++i',`j'] = cond(_rc,.,r(p75) - r(p25)) + } + if "`semean'"!="" { + mat `results'[`++i',`j'] = cond(_rc,.,r(sd) / sqrt(r(N))) + } + if "`cv'"!="" { + mat `results'[`++i',`j'] = cond(_rc,.,r(sd) / r(mean)) + } + if "`range'"!="" { + mat `results'[`++i',`j'] = cond(_rc,.,r(max) - r(min)) + } + foreach stat of local Stats { + mat `results'[`++i',`j'] = cond(_rc,.,r(`stat')) + } + } + } +//return the results + local i 0 + di as txt _n "added matrices:" + foreach stat in `iqr' `semean' `cv' `range' `stats' { + local sname = lower("`stat'") + mat `results2' = `results'[`++i',1...] + ereturn matrix `prefix'`sname' = `results2' + added_matrix `prefix'`sname' + } +end + +* 12. +* -estadd- subroutine: variance inflation factors +program define estadd_vif, eclass + version 8.2 + local caller : di _caller() + syntax [, TOLerance SQRvif Prefix(name) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//check e()-names + if "`replace'"=="" { + confirm_new_ename `prefix'vif + if "`tolerance'"!="" confirm_new_ename `prefix'tolerance + if "`sqrvif'"!="" confirm_new_ename `prefix'sqrvif + } +//copy coefficients matrix and set to .z + tempname results results2 results3 + matrix `results' = e(b) + forv j = 1/`=colsof(`results')' { + mat `results'[1,`j'] = .z + } + if "`tolerance'"!="" mat `results2' = `results' + if "`sqrvif'"!="" mat `results3' = `results' +//compute VIF and add to results vector + capt n `quietly' version `caller': vif + if _rc { + if _rc == 301 di as err "-estadd:vif- can only be used after -regress-" + exit _rc + } + local i 0 + local name "`r(name_`++i')'" + while "`name'"!="" { + local j = colnumb(`results',"`name'") + if `j'<. { + matrix `results'[1,`j'] = r(vif_`i') + if "`tolerance'"!="" matrix `results2'[1,`j'] = 1 / r(vif_`i') + if "`sqrvif'"!="" matrix `results3'[1,`j'] = sqrt( r(vif_`i') ) + } + local name "`r(name_`++i')'" + } +//return the results + if "`sqrvif'"!="" | "`tolerance'"!="" di as txt _n "added matrices:" + else di as txt _n "added matrix:" + if "`sqrvif'"!="" { + ereturn matrix `prefix'sqrvif = `results3' + added_matrix `prefix'sqrvif + } + if "`tolerance'"!="" { + ereturn matrix `prefix'tolerance = `results2' + added_matrix `prefix'tolerance + } + ereturn matrix `prefix'vif = `results' + added_matrix `prefix'vif +end + +* 13. +* -estadd- subroutine: standardized factor change coefficients +program define estadd_ebsd, eclass + version 8.2 + syntax [, Prefix(name) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//check e()-names + if "`replace'"=="" confirm_new_ename `prefix'ebsd +//use aweights with -summarize- + local wtype `e(wtype)' + if "`wtype'"=="pweight" local wtype aweight +//subpop? + local subpop "`e(subpop)'" + if "`subpop'"=="" local subpop 1 +//copy coefficients matrix and determine varnames + tempname results + mat `results' = e(b) + local vars: colnames `results' +//loop over variables: calculate -mean- + local j 0 + foreach var of local vars { + local ++j + capture confirm_numvar `var' + if _rc mat `results'[1,`j'] = .z + else { + capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop' + mat `results'[1,`j'] = cond(_rc,.,exp( `results'[1,`j'] * r(sd))) + } + } +//return the results + ereturn matrix `prefix'ebsd = `results' + di _n as txt "added matrix:" + added_matrix `prefix'ebsd +end + +* 14. +* -estadd- subroutine: exponentiated coefficients +program define estadd_expb, eclass + version 8.2 + syntax [, noCONStant Prefix(name) Replace Quietly ] +//check e()-names + if "`replace'"=="" confirm_new_ename `prefix'expb +//copy coefficients matrix and determine names of coefficients + tempname results + mat `results' = e(b) + local coefs: colnames `results' +//loop over coefficients + local j 0 + foreach coef of local coefs { + local ++j + if `"`constant'"'!="" & `"`coef'"'=="_cons" { + mat `results'[1,`j'] = .z + } + else { + mat `results'[1,`j'] = exp(`results'[1,`j']) + } + } +//return the results + ereturn matrix `prefix'expb = `results' + di _n as txt "added matrix:" + added_matrix `prefix'expb +end + +* 15. +* -estadd- subroutine: partial and semi-partial correlations +program define estadd_pcorr, eclass + version 8.2 + syntax [, semi Prefix(name) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//check e()-names + if "`replace'"=="" { + if "`semi'"!="" confirm_new_ename `prefix'spcorr + confirm_new_ename `prefix'pcorr + } +//copy coefficients matrix and set to .z + tempname results results2 + matrix `results' = e(b) + forv j = 1/`=colsof(`results')' { + mat `results'[1,`j'] = .z + } + local eqs: coleq `results', quoted + local eq: word 1 of `eqs' + mat `results2' = `results'[1,"`eq':"] + local vars: colnames `results2' + foreach var of local vars { + capt confirm numeric var `var' + if !_rc local temp "`temp'`var' " + } + local vars "`temp'" + if "`semi'"!="" mat `results2' = `results' + else { + mat drop `results2' + local results2 + } + local depv: word 1 of `e(depvar)' +//compute statistics and add to results vector + local wtype `e(wtype)' + if inlist("`wtype'","pweight","iweight") local wtype aweight + _estadd_pcorr_compute `depv' `vars' [`wtype'`e(wexp)'] if e(sample), /// + eq(`eq') results(`results') results2(`results2') +//return the results + if "`semi'"!="" { + di as txt _n "added matrices:" + ereturn matrix `prefix'spcorr = `results2' + added_matrix `prefix'spcorr + } + else di as txt _n "added matrix:" + ereturn matrix `prefix'pcorr = `results' + added_matrix `prefix'pcorr +end +program define _estadd_pcorr_compute // based on pcorr.ado by StataCorp + // and pcorr2.ado by Richard Williams + syntax varlist(min=1) [aw fw] [if], eq(str) results(str) [ results2(str) ] + marksample touse + tempname hcurrent + _est hold `hcurrent', restore + quietly reg `varlist' [`weight'`exp'] if `touse' + if (e(N)==0 | e(N)>=.) error 2000 + local NmK = e(df_r) + local R2 = e(r2) + gettoken depv varlist: varlist + foreach var of local varlist { + quietly test `var' + if r(F)<. { + local s "1" + if _b[`var']<0 local s "-1" + local c = colnumb(`results',"`eq':`var'") + mat `results'[1,`c'] = `s' * sqrt(r(F)/(r(F)+`NmK')) + if "`results2'"!="" { + mat `results2'[1,`c'] = `s' * sqrt(r(F)*((1-`R2')/`NmK')) + } + } + } +end + +* 16. +* -estadd- subroutine: Likelihood-ratio test +program define estadd_lrtest, eclass + version 8.2 + local caller : di _caller() + syntax anything(id="model") [, Name(name) Prefix(name) Replace Quietly * ] + if "`name'"=="" local name lrtest_ +//check e()-names + if "`replace'"=="" { + confirm_new_ename `prefix'`name'p + confirm_new_ename `prefix'`name'chi2 + confirm_new_ename `prefix'`name'df + } +//compute statistics + `quietly' version `caller': lrtest `anything', `options' +//return the results + ereturn scalar `prefix'`name'p = r(p) + ereturn scalar `prefix'`name'chi2 = r(chi2) + ereturn scalar `prefix'`name'df = r(df) + di _n as txt "added scalars:" + added_scalar `prefix'`name'p + added_scalar `prefix'`name'chi2 + added_scalar `prefix'`name'df +end + +* 17. +* -estadd- subroutine: support for -brant- by Long and Freese +* (see http://www.indiana.edu/~jslsoc/spost.htm) +program define estadd_brant, eclass + version 8.2 + local caller : di _caller() + syntax [ , Prefix(name) Replace Quietly * ] + capt findfile brant.ado + if _rc { + di as error "fitstat.ado from the -spost9_ado- package by Long and Freese required" + di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"' + error 499 + } +// check names + if "`replace'"=="" { + foreach name in brant_chi2 brant_df brant_p brant { + confirm_new_ename `prefix'`name' + } + } +// compute and return the results + `quietly' version `caller': brant, `options' + di as txt _n "added scalars:" + foreach stat in chi2 df p { + ereturn scalar `prefix'brant_`stat' = r(`stat') + added_scalar `prefix'brant_`stat' + } + tempname mat + matrix `mat' = r(ivtests) + matrix `mat' = `mat'' + ereturn matrix `prefix'brant = `mat' + di as txt _n "added matrix:" + added_matrix `prefix'brant _rown +end + +* 18. +* -estadd- subroutine: support for -fitstat- by Long and Freese +* (see http://www.indiana.edu/~jslsoc/spost.htm) +program define estadd_fitstat, eclass + version 8.2 + local caller : di _caller() + syntax [ , Prefix(name) Replace Quietly Bic * ] + capt findfile fitstat.ado + if _rc { + di as error "fitstat.ado from the -spost9_ado- package by Long and Freese required" + di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"' + error 499 + } + `quietly' version `caller': fitstat, `bic' `options' + local stats: r(scalars) + local allstats /// + dev dev_df lrx2 lrx2_df lrx2_p r2_adj r2_mf r2_mfadj r2_ml /// + r2_cu r2_mz r2_ef v_ystar v_error r2_ct r2_ctadj aic aic_n /// + bic bic_p statabic stataaic n_rhs n_parm + local stats: list allstats & stats + if "`bic'"!="" { + local bic aic aic_n bic bic_p statabic stataaic + local stats: list bic & stats + } + + +// check names + if "`replace'"=="" { + foreach stat of local stats { + if inlist("`stat'", "bic", "aic") local rname `stat'0 + else local rname `stat' + confirm_new_ename `prefix'`rname' + } + } + +// return the results + di as txt _n "added scalars:" + foreach stat of local stats { + if inlist("`stat'", "bic", "aic") local rname `stat'0 + else local rname `stat' + ereturn scalar `prefix'`rname' = r(`stat') + added_scalar `prefix'`rname' + } +end + +* 19. +* -estadd- subroutine: support for -listcoef- by Long and Freese +* (see http://www.indiana.edu/~jslsoc/spost.htm) +program define estadd_listcoef, eclass + version 8.2 + local caller : di _caller() + syntax [anything] [ , Prefix(name) Replace Quietly /// + nosd gt lt ADJacent Matrix EXpand * ] + +// handle some options and look for e(sample) + if `"`matrix'"'!="" { + local matrix matrix + } + if `"`e(cmd)'"'=="slogit" & "`expand'"!="" { + di as err "-expand- option not supported" + exit 198 + } + confirm_esample + +// set some constants + local listcoef_matrices "xs ys std fact facts pct pcts" + if "`sd'"=="" local listcoef_matrices "`listcoef_matrices' sdx" + +// run listcoef + capt findfile listcoef.ado + if _rc { + di as error "-listcoef- from the -spost9_ado- package by Long and Freese required" + di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"' + error 499 + } + `quietly' version `caller': listcoef `anything' , matrix `gt' `lt' `adjacent' `options' + +// check existing e()'s + if "`replace'"=="" { + confirm_new_ename `prefix'pvalue + foreach matrix of local listcoef_matrices { + _estadd_listcoef_ChkEName b_`matrix', prefix(`prefix') + } + } + +// grab r()-results and post in e() + di as txt _n "added matrices:" + if inlist(`"`e(cmd)'"',"mlogit","mprobit") { + _estadd_listcoef_AddResToNomModl `listcoef_matrices', prefix(`prefix') `gt' `lt' `adjacent' + } + else { + foreach matrix of local listcoef_matrices { + _estadd_listcoef_AddMatToE `matrix', prefix(`prefix') + } + } +end +program define _estadd_listcoef_ChkEName + syntax name [, prefix(str) ] + capt confirm matrix r(`namelist') + if _rc exit + confirm_new_ename `prefix'`namelist' +end +program define _estadd_listcoef_AddMatToE, eclass + syntax name [, prefix(str) ] + capt confirm matrix r(b_`namelist') + if _rc exit + tempname tmp + matrix `tmp' = r(b_`namelist') + capt confirm matrix r(b2_`namelist') + if _rc==0 { + local eqnames: coleq e(b), quoted + local eqnames: list uniq eqnames + local eqname: word 1 of `eqnames' + mat coleq `tmp' = `"`eqname'"' + tempname tmp2 + matrix `tmp2' = r(b2_`namelist') + local eqname: word 2 of `eqnames' + mat coleq `tmp2' = `"`eqname'"' + mat `tmp' = `tmp' , `tmp2' + mat drop `tmp2' + } + ereturn matrix `prefix'b_`namelist' = `tmp' + added_matrix `prefix'b_`namelist' _rown +end +program define _estadd_listcoef_AddResToNomModl, eclass + syntax anything(name=listcoef_matrices) [, prefix(str) gt lt ADJacent ] + if "`lt'"=="" & "`gt'"=="" { + local lt lt + local gt gt + } + local adjacent = "`adjacent'"!="" + local lt = "`lt'"!="" + local gt = "`gt'"!="" + +// outcomes and labels + tempname outcomes + if `"`e(cmd)'"'=="mlogit" { + if c(stata_version) < 9 local type cat + else local type out + mat `outcomes' = e(`type') + local noutcomes = colsof(`outcomes') + local eqnames `"`e(eqnames)'"' + if (`:list sizeof eqnames'<`noutcomes') { + local ibase = e(ibase`type') + } + else local ibase 0 + forv i = 1/`noutcomes' { + if `i'==`ibase' { + local outcomelab`i' `"`e(baselab)'"' + } + else { + gettoken eq eqnames : eqnames + local outcomelab`i' `"`eq'"' + } + if `"`outcomelab`i''"'=="" { + local outcomelab`i': di `outcomes'[1,`i'] + } + } + } + else if `"`e(cmd)'"'=="mprobit" { + mat `outcomes' = e(outcomes)' + local noutcomes = colsof(`outcomes') + forv i = 1/`noutcomes' { + local outcomelab`i' `"`e(out`i')'"' + } + } + else { + di as err `"`e(cmd)' not supported"' + exit 499 + } + +// collect vectors + tempname stats + mat `stats' = r(b) \ r(b_z) \ r(b_z) \ r(b_p) + forv i = 1/`=colsof(`stats')' { + mat `stats'[2,`i'] = `stats'[1,`i'] / `stats'[3,`i'] + } + mat rown `stats' = "b" "se" "z" "P>|z|" + local enames "b_raw b_se b_z b_p" + foreach matrix of local listcoef_matrices { + capt confirm matrix r(b_`matrix') + if _rc continue + mat `stats' = `stats' \ r(b_`matrix') + local enames `"`enames' b_`matrix'"' + } + +// select/reorder contrasts of interest + local contrast "r(contrast)" + local ncontrast = colsof(`contrast') + tempname stats0 temp + matrix rename `stats' `stats0' + forv i = 1/`noutcomes' { + local out1 = `outcomes'[1, `i'] + local j 0 + forv j = 1/`noutcomes' { + local out2 = `outcomes'[1, `j'] + if `out1'==`out2' continue + if `adjacent' & abs(`i'-`j')>1 continue + if `lt'==0 & `out1'<`out2' continue + if `gt'==0 & `out1'>`out2' continue + forv l = 1/`ncontrast' { + if el(`contrast',1,`l')!=`out1' continue + if el(`contrast',2,`l')!=`out2' continue + mat `temp' = `stats0'[1..., `l'] + mat coleq `temp' = `"`outcomelab`i''-`outcomelab`j''"' + mat `stats' = nullmat(`stats'), `temp' + } + } + } + capt mat drop `stats0' + +// post rows to e() + local i 0 + foreach ename of local enames { + local ++i + mat `temp' = `stats'[`i', 1...] + ereturn matrix `prefix'`ename' = `temp' + added_matrix `prefix'`ename' _rown + } +end + +* 20. +* -estadd- subroutine: support for -mlogtest- by Long and Freese +* (see http://www.indiana.edu/~jslsoc/spost.htm) +program define estadd_mlogtest, eclass + version 8.2 + local caller : di _caller() + syntax [anything] [ , Prefix(name) Replace Quietly set(passthru) * ] + `quietly' version `caller': mlogtest `anything' , `set' `options' + local rmat: r(matrices) + + // check names + if `"`replace'"'=="" { + foreach m in combine lrcomb { + if `:list m in rmat'==0 continue + forv r = 1/`=rowsof(r(`m'))' { + local cat1 = el(r(`m'),`r',1) + local cat2 = el(r(`m'),`r',2) + confirm_new_ename `prefix'`m'_`cat1'_`cat2'_chi2 + confirm_new_ename `prefix'`m'_`cat1'_`cat2'_df + confirm_new_ename `prefix'`m'_`cat1'_`cat2'_p + } + } + foreach m in hausman suest smhsiao { + if `:list m in rmat'==0 continue + forv r = 1/`=rowsof(r(`m'))' { + local cat = el(r(`m'),`r',1) + confirm_new_ename `prefix'`m'_`cat'_chi2 + confirm_new_ename `prefix'`m'_`cat'_df + confirm_new_ename `prefix'`m'_`cat'_p + } + } + if `"`set'"'!="" { + foreach m in wald lrtest { + if `:list m in rmat'==0 continue + local i 0 + local r = rownumb(r(`m'),"set_`++i'") + while(`r'<.) { + confirm_new_ename `prefix'`m'_set`i'_chi2 + confirm_new_ename `prefix'`m'_set`i'_df + confirm_new_ename `prefix'`m'_set`i'_p + local r = rownumb(r(`m'),"set_`++i'") + } + } + } + foreach m in wald lrtest { + if `:list m in rmat'==0 continue + local r . + if `"`set'"'!="" local r = rownumb(r(`m'),"set_1")-1 + if `r'<1 continue + confirm_new_ename `prefix'`m' + } + } + + local di_added_scalars `"di _n as txt "added scalars:"' + // combine + foreach m in combine lrcomb { + if `:list m in rmat'==0 continue + `di_added_scalars' + local di_added_scalars + forv r = 1/`=rowsof(r(`m'))' { + local cat1 = el(r(`m'),`r',1) + local cat2 = el(r(`m'),`r',2) + eret scalar `prefix'`m'_`cat1'_`cat2'_chi2 = el(r(`m'),`r',3) + added_scalar `prefix'`m'_`cat1'_`cat2'_chi2 + eret scalar `prefix'`m'_`cat1'_`cat2'_df = el(r(`m'),`r',4) + added_scalar `prefix'`m'_`cat1'_`cat2'_df + eret scalar `prefix'`m'_`cat1'_`cat2'_p = el(r(`m'),`r',5) + added_scalar `prefix'`m'_`cat1'_`cat2'_p + } + } + // iia + foreach m in hausman suest smhsiao { + if `:list m in rmat'==0 continue + `di_added_scalars' + local di_added_scalars + if "`m'"=="smhsiao" local skip 2 + else local skip 0 + forv r = 1/`=rowsof(r(`m'))' { + local cat = el(r(`m'),`r',1) + eret scalar `prefix'`m'_`cat'_chi2 = el(r(`m'),`r',2+`skip') + added_scalar `prefix'`m'_`cat'_chi2 + eret scalar `prefix'`m'_`cat'_df = el(r(`m'),`r',3+`skip') + added_scalar `prefix'`m'_`cat'_df + eret scalar `prefix'`m'_`cat'_p = el(r(`m'),`r',4+`skip') + added_scalar `prefix'`m'_`cat'_p + } + } + + // wald/lrtest + tempname tmp + if `"`set'"'!="" { + foreach m in wald lrtest { + if `:list m in rmat'==0 continue + local i 0 + local r = rownumb(r(`m'),"set_`++i'") + if `r'>=. continue + `di_added_scalars' + local di_added_scalars + while(`r'<.) { + eret scalar `prefix'`m'_set`i'_chi2 = el(r(`m'),`r',1) + added_scalar `prefix'`m'_set`i'_chi2 + eret scalar `prefix'`m'_set`i'_df = el(r(`m'),`r',2) + added_scalar `prefix'`m'_set`i'_df + eret scalar `prefix'`m'_set`i'_p = el(r(`m'),`r',3) + added_scalar `prefix'`m'_set`i'_p + local r = rownumb(r(`m'),"set_`++i'") + } + } + } + local di_added_matrices `"di _n as txt "added matrices:"' + foreach m in wald lrtest { + if `:list m in rmat'==0 continue + local r . + if `"`set'"'!="" local r = rownumb(r(`m'),"set_1")-1 + if `r'<1 continue + `di_added_matrices' + local di_added_matrices + mat `tmp' = r(`m') + mat `tmp' = `tmp'[1..`r',1...]' + eret mat `prefix'`m' = `tmp' + added_matrix `prefix'`m' _rown + } + +end + + +* 21. +* -estadd- subroutine: support for -prchange- by Long and Freese +* (see http://www.indiana.edu/~jslsoc/spost.htm) +program define estadd_prchange + version 8.2 + local caller : di _caller() + syntax [anything] [if] [in] [ , Prefix(name) Replace Quietly /// + PAttern(str) Binary(str) Continuous(str) NOAvg Avg split SPLIT2(name) /// + adapt /// old syntax; now works as synonym for noavg + Outcome(passthru) Fromto noBAse * ] + +// handle some options + if `"`split2'"'!="" local split split + if "`split'"!="" & `"`outcome'"'!="" { + di as err "split and outcome() not both allowed" + exit 198 + } + if "`split'"!="" & `"`avg'`noavg'"'!="" { + di as err "split and avg not both allowed" + exit 198 + } + if "`avg'"!="" & `"`outcome'"'!="" { + di as err "avg and outcome not both allowed" + exit 198 + } + if "`avg'"!="" & "`noavg'"!="" { + di as err "avg and noavg not both allowed" + exit 198 + } + if `"`adapt'"'!="" local noavg noavg + if `:list sizeof binary'>1 | `:list sizeof continuous'>1 error 198 + estadd_prchange_ExpandType binary `"`binary'"' + estadd_prchange_ExpandType continuous `"`continuous'"' + if `"`binary'"'=="" local binary 2 + if `"`continuous'"'=="" local continuous 4 + if `"`pattern'"'!="" { + estadd_prchange_ExpandType pattern `"`pattern'"' + } + +// check e(sample) + confirm_esample + +// run prchange + capt findfile prchange.ado + if _rc { + di as error "-prchange- from the -spost9_ado- package by Long and Freese required" + di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"' + error 499 + } + `quietly' version `caller': prchange `anything' `if' `in', `base' `outcome' `fromto' `options' + +// determine type of model (ordinal: nomord = 1; nominal: nomord = 2) + local nomord = (r(modeltype)=="typical nomord") + if inlist(`"`e(cmd)'"',"mlogit","mprobit") local nomord = 2 + if "`avg'`noavg'"!="" { + if `nomord'==0 { + di as err "avg not allowed with this model" + exit 198 + } + } + if !`nomord' & "`split'"!="" { + di as err "split not allowed with this model" + exit 198 + } + +// determine outcome number (in prchange-returns) + if `"`outcome'"'!="" { + if `nomord' { + forv i = 1/`=colsof(r(catval))' { + if el(r(catval), 1, `i') == r(outcome) { + local outcomenum `i' + continue, break + } + } + if "`outcomenum'"=="" { // should never happen + di as err `"outcome `outcome' not found"' + exit 499 + } + } + else { + local outcomenum = colnumb(r(predval), `"`r(outcome)'"') + } + } + +// check names + if "`replace'"=="" { + if `"`outcome'"'!="" | "`split'"!="" | `nomord'==0 { + confirm_new_ename `prefix'predval + if `"`outcome'"'!="" | "`split'"!="" { + confirm_new_ename `prefix'outcome + } + } + else { + forv i = 1/`=colsof(r(catval))' { + local theoutcome: di el(r(catval),1,`i') + confirm_new_ename `prefix'predval`theoutcome' + } + } + confirm_new_ename `prefix'delta + confirm_new_ename `prefix'centered + confirm_new_ename `prefix'dc + if "`fromto'"!="" { + confirm_new_ename `prefix'dcfrom + confirm_new_ename `prefix'dcto + } + if "`nobase'"=="" { + confirm_new_ename `prefix'X + } + } + +// grab r()-results and post in e() + if "`split'"!="" { + if `"`split2'"'=="" { + local split2 `"`e(_estadd_estimates_name)'"' + if `"`split2'"'=="" { + local split2 `"`e(cmd)'"' + } + local split2 `"`split2'_"' + } + _estadd_prchange_StoreEachOutc `split2' , nomord(`nomord') /// + pattern(`pattern') binary(`binary') continuous(`continuous') /// + `base' `fromto' prefix(`prefix') + } + else { + _estadd_prchange_AddStuffToE, nomord(`nomord') outcome(`outcomenum') /// + pattern(`pattern') binary(`binary') continuous(`continuous') /// + `avg' `noavg' `base' `fromto' prefix(`prefix') + } +end +program estadd_prchange_ExpandType + args name list + foreach l of local list { + local w = length(`"`l'"') + if `"`l'"'==substr("minmax",1,max(2,`w')) local type 1 + else if `"`l'"'==substr("01",1,max(1,`w')) local type 2 + else if `"`l'"'==substr("delta",1,max(1,`w')) local type 3 + else if `"`l'"'==substr("sd",1,max(1,`w')) local type 4 + else if `"`l'"'==substr("margefct",1,max(1,`w')) local type 5 + else { + di as err `"'`l'' not allowed"' + exit 198 + } + local newlist `newlist' `type' + } + c_local `name' `newlist' +end +program define _estadd_prchange_AddStuffToE, eclass +// input add +// ========================= ======================================== +// outcome() nomord opt change changenm change# predval outcome +// no 0 - x last +// yes 0 - x x x +// no 1/2 - x all all +// yes 1/2 - x x x +// no 1/2 avg x all +// no 1/2 noavg all all +// nobase=="" => add X, SD, Min, Max +// all models => add centered, delta + syntax , nomord(str) [ pattern(passthru) binary(passthru) continuous(passthru) /// + outcome(str) NOAVG avg nobase fromto prefix(str) split ] // +// prepare predval and determine value of outcome + if `"`outcome'"'!="" { + tempname predv + mat `predv' = r(predval) + mat `predv' = `predv'[1...,`outcome'] + if `nomord' { + local theoutcome: di el(r(catval),1,`outcome') + } + else { + local theoutcome: colnames `predv' + } + } +// add scalars + di _n as txt "added scalars:" +// - predval and outcome + local cpredval = colsof(r(predval)) + if `"`outcome'"'!="" { + ereturn scalar `prefix'predval = `predv'[1,1] + added_scalar `prefix'predval `"`lab_predval'"' + ereturn scalar `prefix'outcome = `theoutcome' + added_scalar `prefix'outcome + } + else if `nomord' { // add all + forv i=1/`cpredval' { + local theoutcome: di el(r(catval),1,`i') + ereturn scalar `prefix'predval`theoutcome' = el(r(predval),1,`i') + added_scalar `prefix'predval`theoutcome' + } + } + else { // add last + ereturn scalar `prefix'predval = el(r(predval),1,`cpredval') + added_scalar `prefix'predval + } +// - delta and centered + ereturn scalar `prefix'delta = r(delta) + added_scalar `prefix'delta + ereturn scalar `prefix'centered = r(centered) + added_scalar `prefix'centered +// add matrices + di _n as txt "added matrices:" + if `nomord'==0 { + if r(modeltype)=="twoeq count" & "`test'"=="" { + local eq: coleq e(b) + local eq: word 1 of `eq' + } + _estadd_prchange_PostMat r(change), prefix(`prefix') /// + name(dc) `pattern' `binary' `continuous' `fromto' eq(`eq') + } + else { + if `"`outcome'"'=="" { + if "`avg'"!="" local nomordmat "r(changemn)" + else { + tempname nomordmat + _estadd_prchange_GatherNomChMat `nomordmat' `noavg' + } + _estadd_prchange_PostMat `nomordmat', prefix(`prefix') /// + name(dc) `pattern' `binary' `continuous' `fromto' + } + else { + if `nomord'==2 { + _estadd_prchange_GetEqnmNomModl `theoutcome' + } + if `"`split'"'!="" { + _estadd_prchange_PostMat r(change`theoutcome'), prefix(`prefix') /// + name(dc) `pattern' `binary' `continuous' `fromto' eq(`eq') + } + else { + _estadd_prchange_PostMat r(change), prefix(`prefix') /// + name(dc) `pattern' `binary' `continuous' `fromto' eq(`eq') + } + } + } + if `"`base'"'=="" { + _estadd_prchange_PostMat r(baseval), prefix(`prefix') name(X) + } + if `"`pattern'"'=="" { + _estadd_prchange_dcNote, prefix(`prefix') name(dc) `binary' `continuous' + } +end +program define _estadd_prchange_dcNote + syntax [ , prefix(str) name(str) binary(str) continuous(str) ] + local res `""{res:minmax} change" "{res:01} change" "{res:delta} change" "{res:sd} change" "{res:margefct}""' + local bres: word `binary' of `res' + local cres: word `continuous' of `res' + di _n as txt `"first row in e(dc) contains:"' + di _n `" `bres' for binary variables"' + di `" `cres' for continuous variables"' +end +program define _estadd_prchange_PostMat, eclass + syntax anything, name(str) [ Fromto eq(str) prefix(str) /// + pattern(passthru) binary(passthru) continuous(passthru) ] + capt confirm matrix `anything' + if _rc exit + tempname tmp1 + local nmlist "`name'" + matrix `tmp1' = `anything' + if `"`eq'"'!="" { + mat coleq `tmp1' = `"`eq'"' + } + if `"`pattern'`binary'`continuous'"'!="" { + tempname pattmat + _estadd_prchange_Merge `tmp1', pattmat(`pattmat') `pattern' `binary' `continuous' `fromto' + } + if "`fromto'"!="" { + local nmlist "`nmlist' `name'from `name'to" + tempname tmp tmp2 tmp3 + mat rename `tmp1' `tmp' + local r = rowsof(`tmp') + local i = 1 + while (`i'<=`r') { + if (`r'-`i')>=2 { + mat `tmp2' = nullmat(`tmp2') \ `tmp'[`i++',1...] // from + mat `tmp3' = nullmat(`tmp3') \ `tmp'[`i++',1...] // to + } + mat `tmp1' = nullmat(`tmp1') \ `tmp'[`i++',1...] + } + mat drop `tmp' + } + local i 0 + foreach nm of local nmlist { + local ++i + local rown: rown `tmp`i'' + mat rown `tmp`i'' = `rown' // fix problem with leading blanks in equations + ereturn matrix `prefix'`nm' = `tmp`i'' + added_matrix `prefix'`nm' _rown + } + if `"`pattmat'"'!="" { + ereturn matrix `prefix'pattern = `pattmat' + added_matrix `prefix'pattern + } +end +program define _estadd_prchange_Merge + syntax name(name=tmp1) [, pattmat(str) pattern(str) binary(str) continuous(str) fromto ] + tempname tmp + mat rename `tmp1' `tmp' + local r = cond("`fromto'"!="", 3, 1) + mat `tmp1' = `tmp'[1..`r',1...]*. + mat `pattmat' = `tmp'[1,1...]*. + local rtot = rowsof(`tmp') + mat rown `tmp1' = main + mat rown `pattmat' = :type + local vars: colnames `tmp1' + local eqs: coleq `tmp1', quoted + local j 0 + foreach var of local vars { + local ++j + gettoken eq eqs : eqs + if `"`eq'"'!=`"`lasteq'"' gettoken type rest : pattern + else gettoken type rest : rest + local lasteq `"`eq'"' + if `"`type'"'=="" { + capt assert `var'==0|`var'==1 if e(sample) & `var'<. + if _rc local type `continuous' + else local type `binary' + } + local ii = (`type'-1)*`r'+1 + forv i = 1/`r' { + if `r'>1 & `i'<3 & `ii'>=`rtot' { + mat `tmp1'[`i',`j'] = .z + } + else { + mat `tmp1'[`i',`j'] = `tmp'[`ii++',`j'] + } + } + mat `pattmat'[1,`j'] = `type' + } + mat `tmp1' = `tmp1' \ `tmp' +end +program define _estadd_prchange_GatherNomChMat + args mat noavg + local cmd `"`e(cmd)'"' + tempname tmpmat + if `"`noavg'"'=="" { + mat `tmpmat' = r(changemn) + mat coleq `tmpmat' = `"Avg|Chg|"' + mat `mat' = `tmpmat' + } + if `"`cmd'"'=="mlogit" { + if c(stata_version) < 9 local outcat cat + else local outcat out + local k_cat = e(k_`outcat') + local eqnames `"`e(eqnames)'"' + if `k_cat'>`:list sizeof eqnames' { // no base equation + local ibase = e(ibase`outcat') + local baselab `"`e(baselab)'"' + if `"`baselab'"'=="" { + local baselab `"`e(base`outcat')'"' + } + forv i = 1/`k_cat' { + if `i'==`ibase' { + local eq `"`"`baselab'"'"' + } + else gettoken eq eqnames : eqnames, quotes + local temp `"`temp' `eq'"' + } + local eqnames: list retok temp + } + local i 0 + foreach eq of local eqnames { + local ++i + local theoutcome: di el(e(`outcat'),1,`i') + mat `tmpmat' = r(change`theoutcome') + mat coleq `tmpmat' = `"`eq'"' + mat `mat' = nullmat(`mat'), `tmpmat' + } + } + else if `"`cmd'"'=="mprobit" { + local eqnames `"`e(outeqs)'"' + local i 0 + foreach eq of local eqnames { + local ++i + local theoutcome: di el(e(outcomes),`i',1) + mat `tmpmat' = r(change`theoutcome') + mat coleq `tmpmat' = `"`eq'"' + mat `mat' = nullmat(`mat'), `tmpmat' + } + } + else { // ordered models + local eqnames : colnames r(catval) + local i 0 + foreach eq of local eqnames { + local ++i + local theoutcome: di el(r(catval),1,`i') + mat `tmpmat' = r(change`theoutcome') + mat coleq `tmpmat' = `"`eq'"' + mat `mat' = nullmat(`mat'), `tmpmat' + } + } +end +program define _estadd_prchange_GetEqnmNomModl + args theoutcome + local cmd `"`e(cmd)'"' + if `"`cmd'"'=="mlogit" { + if c(stata_version) < 9 local outcat cat + else local outcat out + local k_cat = e(k_`outcat') + local eqnames `"`e(eqnames)'"' + local nobase = (`k_cat'>`:list sizeof eqnames') + if `nobase' { + local ibase = e(ibase`outcat') + local baselab `"`e(baselab)'"' + } + forv i = 1/`k_cat' { + if `nobase' { + if `i'==`ibase' { + local eq `"`baselab'"' + } + else gettoken eq eqnames : eqnames + } + else gettoken eq eqnames : eqnames + if el(e(`outcat'),1,`i')==`theoutcome' { + local value `"`eq'"' + continue, break + } + } + } + else if `"`cmd'"'=="mprobit" { + local eqnames `"`e(outeqs)'"' + local i 0 + foreach eq of local eqnames { + if el(e(outcomes),`++i',1)==`theoutcome' { + local value `"`eq'"' + continue, break + } + } + } + if `"`value'"'=="" local value `theoutcome' + c_local eq `"`value'"' +end +program define _estadd_prchange_StoreEachOutc // only for nomord models + syntax anything [, nomord(str) nobase fromto prefix(passthru) /// + pattern(passthru) binary(passthru) continuous(passthru) ] +// backup estimates + tempname hcurrent + _est hold `hcurrent', copy restore estsystem + if `"`nomord'"'=="2" { // backup b and V + tempname b bi V Vi + mat `b' = e(b) + mat `V' = e(V) + } +// cycle through categories + local k_kat = colsof(r(predval)) + tempname catval catvali + mat `catval' = r(catval) + forv i=1/`k_kat' { + mat `catvali' = `catval'[1...,`i'] + local catlabi: colnames `catvali' + local catnumi: di `catvali'[1,1] + if `"`nomord'"'=="2" { + _estadd_prchange_GetEqnmNomModl `catnumi' + if colnumb(`b', `"`eq':"')<. { + mat `bi' = `b'[1...,`"`eq':"'] + mat `Vi' = `V'[`"`eq':"',`"`eq':"'] + } + else { // base outcome; get first eq and set zero + local tmp : coleq `b', q + gettoken tmp : tmp + mat `bi' = `b'[1...,`"`tmp':"'] * 0 + mat `Vi' = `V'[`"`tmp':"',`"`tmp':"'] * 0 + } + mat coleq `bi' = "" + mat coleq `Vi' = "" + mat roweq `Vi' = "" + erepost b=`bi' V=`Vi' + } + `qui' _estadd_prchange_AddStuffToE, split nomord(1) outcome(`i') /// + `base' `fromto' `pattern' `binary' `continuous' `prefix' + `qui' di "" + local qui qui + _eststo `anything'`catnumi', title(`"`catlabi'"') // store without e(sample) + di as txt "results for outcome " as res `catnumi' /// + as txt " stored as " as res "`anything'`catnumi'" + } +// retore estimates + _est unhold `hcurrent' +end + +* 22. +* -estadd- subroutine: support for -prvalue- by Long and Freese +* (see http://www.indiana.edu/~jslsoc/spost.htm) +program define estadd_prvalue, eclass + version 9.2 + local caller : di _caller() + syntax [anything] [if] [in] [ , Prefix(passthru) Replace Quietly /// + LABel(str) Title(passthru) swap Diff * ] + +// post + if `"`anything'"'!="" { + gettoken post post2 : anything + if `"`post'"'!="post" { + di as err `"`post' not allowed"' + exit 198 + } + else if `"`label'"'!="" { + di as err "label() not allowed" + exit 198 + } + _estadd_prvalue_Post `post2' `if' `in', `prefix' `replace' `quietly' /// + `title' `swap' `diff' `options' + exit + } + else if `"`title'"'!="" { + di as err "title() not allowed" + exit 198 + } + else if "`swap'"!="" { + di as err "swap not allowed" + exit 198 + } + +// look for e(sample) + confirm_esample + +// run prvalue + capt findfile prvalue.ado + if _rc { + di as error "-prvalue- from the -spost9_ado- package by Long and Freese required" + di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"' + error 499 + } + `quietly' version `caller': prvalue `if' `in', `diff' `options' + +// append? + capture confirm existence `e(_estadd_prvalue)' + local append = (_rc==0) & ("`replace'"=="") + tempname prvalue prvalue_x prvalue_x2 + if `append' { + mat `prvalue' = e(_estadd_prvalue) + mat `prvalue_x' = e(_estadd_prvalue_x) + capt mat `prvalue_x2' = e(_estadd_prvalue_x2) + local ires = rowsof(`prvalue') + 1 + } + else local ires 1 + if `"`label'"'=="" { + local label "pred`ires'" + } + else { + local label = substr(`"`label'"', 1, 30) // 30 characters max + local problemchars `": . `"""'"' + foreach char of local problemchars { + local label: subinstr local label `"`char'"' "_", all + } + } + +// collect results + tempname pred + mat `pred' = r(pred) + if `"`diff'"'!="" { + _estadd_prvalue_GetRidOfD `pred' + } + _estadd_prvalue_ReshapePred `pred', label(`label') + _estadd_prvalue_AddPred `prvalue' `pred' `append' + _estadd_prvalue_AddX `prvalue_x', label(`label') + capture confirm matrix r(x2) + local hasx2 = _rc==0 + if `hasx2' { + _estadd_prvalue_AddX `prvalue_x2', label(`label') two + } + +// post in e() + di as txt _n cond(`append',"updated","added") " matrices:" + ereturn matrix _estadd_prvalue = `prvalue' + added_matrix _estadd_prvalue + ereturn matrix _estadd_prvalue_x = `prvalue_x' + added_matrix _estadd_prvalue_x + if `hasx2' { + ereturn matrix _estadd_prvalue_x2 = `prvalue_x2' + added_matrix _estadd_prvalue_x2 + } +end +program _estadd_prvalue_GetRidOfD + args pred + local coln: colnames `pred' + local firstcol: word 1 of `coln' + local nfirstcol = substr("`firstcol'",2,.) + local coln : subinstr local coln "`firstcol'" "`nfirstcol'" , word + mat coln `pred' = `coln' +end +program _estadd_prvalue_ReshapePred + syntax anything, label(str) + tempname tmp res + local r = rowsof(`anything') + forv i=1/`r' { + mat `tmp' = `anything'[`i',1...] + local nm: rownames `tmp' + mat coleq `tmp' = `"`nm'"' + mat `res' = nullmat(`res'), `tmp' + } + mat rown `res' = `"`label'"' + mat `anything' = `res' +end +program _estadd_prvalue_AddPred + args prvalue pred append + if `append' { + local coln1: colfullnames `prvalue' + local coln2: colfullnames `pred' + if `"`coln1'"'!=`"`coln2'"' { + di as err "incompatible prvalue results" + exit 498 + } + } + mat `prvalue' = nullmat(`prvalue') \ `pred' +end +program _estadd_prvalue_AddX + syntax anything, label(str) [ two ] + if "`two'"!="" local two 2 + tempname tmp + mat `tmp' = r(x`two') + mat rown `tmp' = `"`label'"' + mat `anything' = nullmat(`anything') \ `tmp' +end +program _estadd_prvalue_Post, eclass + syntax [name(name=post2)] [ , Prefix(name) Replace Quietly /// + Title(passthru) swap ] + capture confirm matrix e(_estadd_prvalue) + if _rc { + di as err "prvalue results not found" + exit 498 + } +// backup estimates + tempname hcurrent + _est hold `hcurrent', copy restore estsystem + local cmd = e(cmd) + local depvar = e(depvar) + local N = e(N) + local estname `"`e(_estadd_estimates_name)'"' + +// get results + tempname prvalue prvalue_x prvalue_x2 + mat `prvalue' = e(_estadd_prvalue) + mat `prvalue_x' = e(_estadd_prvalue_x) + capture confirm matrix e(_estadd_prvalue_x2) + local hasx2 = _rc==0 + if `hasx2' { + mat `prvalue_x2' = e(_estadd_prvalue_x2) + } + +// return prvalues + tempname tmp tmp2 b se + if "`swap'"=="" { + local eqs: coleq `prvalue', q + local eqs: list uniq eqs + foreach eq of local eqs { + mat `tmp' = `prvalue'[1...,`"`eq':"'] + mat `tmp2' = `tmp'[1...,1]' + mat coleq `tmp2' = `"`eq'"' + mat roweq `tmp2' = "" + mat `b' = nullmat(`b'), `tmp2' + mat `tmp2' = `tmp'[1...,`"`eq':SE"']' + mat coleq `tmp2' = `"`eq'"' + mat roweq `tmp2' = "" + mat `se' = nullmat(`se'), `tmp2' + } + mat drop `tmp' `tmp2' + } + else { + local r = rowsof(`prvalue') + local c = colsof(`prvalue') + local coln: colnames `prvalue' + local eqs: coleq `prvalue', q + mat coln `prvalue' = `eqs' + mat coleq `prvalue' = `coln' + local coln: list uniq coln + local ncol: list sizeof coln + local icol: list posof "SE" in coln + forv i=1/`r' { + mat `tmp' = `prvalue'[`i',1...] + local labl : rownames `tmp' + forv j=1(`ncol')`c' { + mat `tmp2' = nullmat(`tmp2'), `tmp'[1...,`j'] + } + mat coleq `tmp2' = `"`labl'"' + mat `b' = nullmat(`b'), `tmp2' + mat drop `tmp2' + forv j=`icol'(`ncol')`c' { + mat `tmp2' = nullmat(`tmp2'), `tmp'[1...,`j'] + } + mat coleq `tmp2' = `"`labl'"' + mat `se' = nullmat(`se'), `tmp2' + mat drop `tmp2' + } + mat drop `tmp' + } + ereturn post `b', obs(`N') + ereturn local model "`cmd'" + ereturn local cmd "estadd_prvalue" + ereturn local depvar "`depvar'" + di as txt _n "scalars:" + added_scalar N + di as txt _n "macros:" + added_macro depvar + added_macro cmd + added_macro model + added_macro properties + di as txt _n "matrices:" + added_matrix b "predictions" + ereturn matrix se = `se' + added_matrix se "standard errors" + local istat 0 + foreach stat in LB UB Category Cond { + local elabel: word `++istat' of "lower CI bounds" "upper CI bounds" /// + "outcome values" "conditional predictions" + if "`swap'"=="" { + foreach eq of local eqs { + local colnumb = colnumb(`prvalue',`"`eq':`stat'"') + if `colnumb'>=. continue + mat `tmp2' = `prvalue'[1...,`colnumb']' + mat coleq `tmp2' = `"`eq'"' + mat roweq `tmp2' = "" + mat `tmp' = nullmat(`tmp'), `tmp2' + } + } + else { + local icol: list posof "`stat'" in coln + if `icol'==0 continue + forv i=1/`r' { + mat `tmp2' = `prvalue'[`i',1...] + local labl : rownames `tmp2' + mat coleq `tmp2' = `"`labl'"' + forv j=`icol'(`ncol')`c' { + mat `tmp' = nullmat(`tmp'), `tmp2'[1...,`j'] + } + } + mat drop `tmp2' + } + capt confirm matrix `tmp' + if _rc==0 { + ereturn matrix `prefix'`stat' = `tmp' + added_matrix `prefix'`stat' "`elabel'" + } + } + +// return x-values + matrix `prvalue_x' = `prvalue_x'' + ereturn matrix `prefix'X = `prvalue_x' + added_matrix `prefix'X _rown + if `hasx2' { + matrix `prvalue_x2' = `prvalue_x2'' + ereturn matrix `prefix'X2 = `prvalue_x2' + added_matrix `prefix'X2 _rown + } + +// store + if "`post2'"!="" { + _eststo `estname'`post2', `title' + di as txt _n "results stored as " as res "`estname'`post2'" + } + else if `"`title'"'!="" { + estimates change ., `title' + } + +// retore estimates + if "`post2'"!="" { + _est unhold `hcurrent' + } + else { + _est unhold `hcurrent', not + } +end + +* 23. +* -estadd- subroutine: support for -asprvalue- by Long and Freese +* (see http://www.indiana.edu/~jslsoc/spost.htm) +program define estadd_asprvalue, eclass + version 9.2 + local caller : di _caller() + syntax [anything] [ , Prefix(passthru) Replace Quietly /// + LABel(str) Title(passthru) swap * ] + +// post + if `"`anything'"'!="" { + gettoken post post2 : anything + if `"`post'"'!="post" { + di as err `"`post' not allowed"' + exit 198 + } + else if `"`label'"'!="" { + di as err "label() not allowed" + exit 198 + } + _estadd_asprvalue_Post `post2' , `prefix' `replace' `quietly' /// + `title' `swap' `options' + exit + } + else if `"`title'"'!="" { + di as err "title() not allowed" + exit 198 + } + else if "`swap'"!="" { + di as err "swap not allowed" + exit 198 + } + +// look for e(sample) + confirm_esample + +// run prvalue + capt findfile asprvalue.ado + if _rc { + di as error "-asprvalue- from the -spost9_ado- package by Long and Freese required" + di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"' + error 499 + } + `quietly' version `caller': asprvalue , `options' + +// append? + capture confirm existence `e(_estadd_asprval)' + local append = (_rc==0) & ("`replace'"=="") + tempname asprval asprval_asv asprval_csv + if `append' { + mat `asprval' = e(_estadd_asprval) + capt mat `asprval_asv' = e(_estadd_asprval_asv) + capt mat `asprval_csv' = e(_estadd_asprval_csv) + local ires = rowsof(`asprval') + 1 + } + else local ires 1 + if `"`label'"'=="" { + local label "pred`ires'" + } + else { + local label = substr(`"`label'"', 1, 30) // 30 characters max + local problemchars `": . `"""'"' + foreach char of local problemchars { + local label: subinstr local label `"`char'"' "_", all + } + } + +// collect results + tempname res + mat `res' = r(p) + _estadd_asprvalue_Reshape `res', label(`label') + _estadd_asprvalue_Add `asprval' `res' `append' + capture confirm matrix r(asv) + local hasasv = _rc==0 + if `hasasv' { + mat `res' = r(asv) + _estadd_asprvalue_Reshape `res', label(`label') + _estadd_asprvalue_Add `asprval_asv' `res' `append' + } + capture confirm matrix r(csv) + local hascsv = _rc==0 + if `hascsv' { + _estadd_asprvalue_AddCsv `asprval_csv', label(`label') + } + +// post in e() + di as txt _n cond(`append',"updated","added") " matrices:" + ereturn matrix _estadd_asprval = `asprval' + added_matrix _estadd_asprval + if `hasasv' { + ereturn matrix _estadd_asprval_asv = `asprval_asv' + added_matrix _estadd_asprval_asv + } + if `hascsv' { + ereturn matrix _estadd_asprval_csv = `asprval_csv' + added_matrix _estadd_asprval_csv + } +end +program _estadd_asprvalue_Reshape + syntax anything, label(str) + tempname tmp res + local r = rowsof(`anything') + forv i=1/`r' { + mat `tmp' = `anything'[`i',1...] + local nm: rownames `tmp' + mat coleq `tmp' = `"`nm'"' + mat `res' = nullmat(`res'), `tmp' + } + mat rown `res' = `"`label'"' + mat `anything' = `res' +end +program _estadd_asprvalue_Add + args master using append + if `append' { + local coln1: colfullnames `master' + local coln2: colfullnames `using' + if `"`coln1'"'!=`"`coln2'"' { + di as err "incompatible asprvalue results" + exit 498 + } + } + mat `master' = nullmat(`master') \ `using' +end +program _estadd_asprvalue_AddCsv + syntax anything, label(str) + tempname tmp + mat `tmp' = r(csv) + mat rown `tmp' = `"`label'"' + mat `anything' = nullmat(`anything') \ `tmp' +end +program _estadd_asprvalue_Post, eclass + syntax [name(name=post2)] [ , Prefix(name) Replace Quietly /// + Title(passthru) swap ] + capture confirm matrix e(_estadd_asprval) + if _rc { + di as err "asprvalue results not found" + exit 498 + } + +// backup estimates + tempname hcurrent + _est hold `hcurrent', copy restore estsystem + local cmd = e(cmd) + local depvar = e(depvar) + local N = e(N) + local estname `"`e(_estadd_estimates_name)'"' + +// get results + tempname asprval asprval_asv asprval_csv + mat `asprval' = e(_estadd_asprval) + capture confirm matrix e(_estadd_asprval_asv) + local hasasv = _rc==0 + if `hasasv' { + mat `asprval_asv' = e(_estadd_asprval_asv) + } + capture confirm matrix e(_estadd_asprval_csv) + local hascsv = _rc==0 + if `hascsv' { + mat `asprval_csv' = e(_estadd_asprval_csv) + } + +// return predictions + tempname tmp tmp2 b + if "`swap'"=="" { + local eqs: coleq `asprval', q + local eqs: list uniq eqs + foreach eq of local eqs { + mat `tmp' = `asprval'[1...,`"`eq':"'] + mat `tmp2' = `tmp'[1...,1]' + mat coleq `tmp2' = `"`eq'"' + mat roweq `tmp2' = "" + mat `b' = nullmat(`b'), `tmp2' + } + mat drop `tmp' `tmp2' + } + else { + local r = rowsof(`asprval') + local coln: colnames `asprval' + local eqs: coleq `asprval', q + mat coln `asprval' = `eqs' + forv i=1/`r' { + mat `tmp' = `asprval'[`i',1...] + local labl : rownames `tmp' + mat coleq `tmp' = `"`labl'"' + mat `b' = nullmat(`b'), `tmp' + } + mat drop `tmp' + } + ereturn post `b', obs(`N') + ereturn local model "`cmd'" + ereturn local cmd "estadd_asprvalue" + ereturn local depvar "`depvar'" + di as txt _n "scalars:" + added_scalar N + di as txt _n "macros:" + added_macro depvar + added_macro cmd + added_macro model + added_macro properties + di as txt _n "matrices:" + added_matrix b "predictions" + +// return asv-values + if `hasasv' { + if "`swap'"=="" { + local vars: coleq `asprval_asv' + local vars: list uniq vars + local cats: colnames `asprval_asv' + local cats: list uniq cats + foreach var of local vars { + foreach cat of local cats { + mat `tmp2' = `asprval_asv'[1...,`"`var':`cat'"']' + mat coleq `tmp2' = `"`cat'"' + mat roweq `tmp2' = "" + mat `tmp' = nullmat(`tmp'), `tmp2' + } + mat rown `tmp' = `"`var'"' + mat `b' = nullmat(`b') \ `tmp' + mat drop `tmp' + } + } + else { + local r = rowsof(`asprval_asv') + local vars: coleq `asprval_asv' + local vars: list uniq vars + forv i=1/`r' { + foreach var of local vars { + mat `tmp2' = `asprval_asv'[`i',`"`var':"'] + local lbl: rownames `tmp2' + mat coleq `tmp2' = `"`lbl'"' + mat rown `tmp2' = `"`var'"' + mat `tmp' = nullmat(`tmp') \ `tmp2' + } + mat `b' = nullmat(`b') , `tmp' + mat drop `tmp' + } + } + ereturn matrix `prefix'asv = `b' + added_matrix `prefix'asv _rown + } +// return csv-values + if `hascsv' { + matrix `asprval_csv' = `asprval_csv'' + ereturn matrix `prefix'csv = `asprval_csv' + added_matrix `prefix'csv _rown + } + +// store + if "`post2'"!="" { + _eststo `estname'`post2', `title' + di as txt _n "results stored as " as res "`estname'`post2'" + } + else if `"`title'"'!="" { + estimates change ., `title' + } + +// retore estimates + if "`post2'"!="" { + _est unhold `hcurrent' + } + else { + _est unhold `hcurrent', not + } +end + +* 24. estadd_margins +program define estadd_margins, eclass + version 11.0 + local caller : di _caller() + syntax [ anything(everything equalok)] [fw aw iw pw] [, Prefix(name) Replace Quietly * ] + +// set default prefix + if "`prefix'"=="" local prefix "margins_" + +// compute and return the results + if `"`weight'`exp'"'!="" local wgtexp `"[`weight'`exp']"' + `quietly' version `caller': margins `anything' `wgtexp', `options' + +// check names + local rscalars: r(scalars) + local rmacros: r(macros) + local rmatrices: r(matrices) + local rmatrices: subinstr local rmatrices "V" "se", word + if "`replace'"=="" { + foreach nmlist in rscalars rmacros rmatrices { + foreach name of local `nmlist' { + confirm_new_ename `prefix'`name' + } + } + } + +// add results + di as txt _n "added scalars:" + foreach name of local rscalars { + ereturn scalar `prefix'`name' = r(`name') + added_scalar `prefix'`name' + } + di as txt _n "added macros:" + foreach name of local rmacros { + ereturn local `prefix'`name' `"`r(`name')'"' + added_macro `prefix'`name' + } + di as txt _n "added matrices:" + tempname tmpmat + foreach name of local rmatrices { + if "`name'"=="se" { + mat `tmpmat' = vecdiag(r(V)) + forv i = 1/`=colsof(`tmpmat')' { + mat `tmpmat'[1,`i'] = sqrt(`tmpmat'[1,`i']) + } + } + else { + mat `tmpmat' = r(`name') + } + eret matrix `prefix'`name' = `tmpmat' + added_matrix `prefix'`name' + } +end + +* 99. +* copy of erepost.ado, version 1.0.1, Ben Jann, 30jul2007 +* used by estadd_listcoef and estadd_prchange +prog erepost, eclass + version 8.2 + syntax [anything(equalok)] [, cmd(str) noEsample Esample2(varname) REName /// + Obs(passthru) Dof(passthru) PROPerties(passthru) * ] + if "`esample'"!="" & "`esample2'"!="" { + di as err "only one allowed of noesample and esample()" + exit 198 + } +// parse [b = b] [V = V] + if `"`anything'"'!="" { + tokenize `"`anything'"', parse(" =") + if `"`7'"'!="" error 198 + if `"`1'"'=="b" { + if `"`2'"'=="=" & `"`3'"'!="" { + local b `"`3'"' + confirm matrix `b' + } + else error 198 + if `"`4'"'=="V" { + if `"`5'"'=="=" & `"`6'"'!="" { + local v `"`6'"' + confirm matrix `b' + } + else error 198 + } + else if `"`4'"'!="" error 198 + } + else if `"`1'"'=="V" { + if `"`4'"'!="" error 198 + if `"`2'"'=="=" & `"`3'"'!="" { + local v `"`3'"' + confirm matrix `v' + } + else error 198 + } + else error 198 + } +//backup existing e()'s + if "`esample2'"!="" { + local sample "`esample2'" + } + else if "`esample'"=="" { + tempvar sample + gen byte `sample' = e(sample) + } + local emacros: e(macros) + if `"`properties'"'!="" { + local emacros: subinstr local emacros "properties" "", word + } + foreach emacro of local emacros { + local e_`emacro' `"`e(`emacro')'"' + } + local escalars: e(scalars) + if `"`obs'"'!="" { + local escalars: subinstr local escalars "N" "", word + } + if `"`dof'"'!="" { + local escalars: subinstr local escalars "df_r" "", word + } + foreach escalar of local escalars { + tempname e_`escalar' + scalar `e_`escalar'' = e(`escalar') + } + local ematrices: e(matrices) + if "`b'"=="" & `:list posof "b" in ematrices' { + tempname b + mat `b' = e(b) + } + if "`v'"=="" & `:list posof "V" in ematrices' { + tempname v + mat `v' = e(V) + } + local bV "b V" + local ematrices: list ematrices - bV + foreach ematrix of local ematrices { + tempname e_`ematrix' + matrix `e_`ematrix'' = e(`ematrix') + } +// rename + if "`b'"!="" & "`v'"!="" & "`rename'"!="" { + local eqnames: coleq `b', q + local vnames: colnames `b' + mat coleq `v' = `eqnames' + mat coln `v' = `vnames' + mat roweq `v' = `eqnames' + mat rown `v' = `vnames' + } +// post results + if "`esample'"=="" { + eret post `b' `v', esample(`sample') `obs' `dof' `properties' `options' + } + else { + eret post `b' `v', `obs' `dof' `properties' `options' + } + foreach emacro of local emacros { + eret local `emacro' `"`e_`emacro''"' + } + if `"`cmd'"'!="" { + eret local cmd `"`cmd'"' + } + foreach escalar of local escalars { + eret scalar `escalar' = scalar(`e_`escalar'') + } + foreach ematrix of local ematrices { + eret matrix `ematrix' = `e_`ematrix'' + } +end diff --git a/ado/e/estadd.hlp b/ado/e/estadd.hlp new file mode 100644 index 0000000..c1b389c --- /dev/null +++ b/ado/e/estadd.hlp @@ -0,0 +1,939 @@ +{smcl} +{* 01feb2017}{...} +{hi:help estadd}{right:also see: {helpb esttab}, {helpb estout}, {helpb eststo}, {helpb estpost}} +{right: {browse "http://repec.sowi.unibe.ch/stata/estout/"}} +{hline} + +{title:Title} + +{p 4 4 2}{hi:estadd} {hline 2} Add results to (stored) estimates + + +{title:Syntax} + +{p 8 15 2} +{cmd:estadd} {it:{help estadd##subcommands:subcommand}} [{cmd:,} +{it:{help estadd##opts:options}} ] [ {cmd::} {it:namelist} ] + + + where {it:namelist} is {cmd:_all} | {cmd:*} | {it:name} [{it:name} ...] + +{marker subcommands} + {it:subcommands}{col 26}description + {hline 65} + Elementary + {helpb estadd##local:{ul:loc}al} {it:name ...}{col 26}{...} +add a macro + {helpb estadd##scalar:{ul:sca}lar} {it:name} {cmd:=} {it:exp}{col 26}{...} +add a scalar + {helpb estadd##matrix:{ul:mat}rix} {it:name} {cmd:=} {it:mat}{col 26}{...} +add a matrix + {helpb estadd##rreturn:r({it:name})}{col 26}{...} +add contents of {cmd:r(}{it:name}{cmd:)} (matrix or scalar) + + Statistics for each + coefficient + {helpb estadd##beta:beta}{col 26}{...} +standardized coefficients + {helpb estadd##vif:vif}{col 26}{...} +variance inflation factors (after {cmd:regress}) + {helpb estadd##pcorr:pcorr}{col 26}{...} +partial (and semi-partial) correlations + {helpb estadd##expb:expb}{col 26}{...} +exponentiated coefficients + {helpb estadd##ebsd:ebsd}{col 26}{...} +standardized factor change coefficients + {helpb estadd##mean:mean}{col 26}{...} +means of regressors + {helpb estadd##sd:sd}{col 26}{...} +standard deviations of regressors + {helpb estadd##summ:summ}{col 26}{...} +various descriptives of the regressors + + Summary statistics + {helpb estadd##coxsnell:coxsnell}{col 26}{...} +Cox & Snell's pseudo R-squared + {helpb estadd##nagelkerke:nagelkerke}{col 26}{...} +Nagelkerke's pseudo R-squared + {helpb estadd##lrtest:lrtest} {it:model}{col 26}{...} +likelihood-ratio test + {helpb estadd##ysumm:ysumm}{col 26}{...} +descriptives of the dependent variable + + Other + {helpb estadd##margins:margins}{col 26}{...} +add results from {cmd:margins} (Stata 11 or newer) + + {help estadd##spost:SPost9} + {helpb estadd##brant:brant}{col 26}{...} +add results from {cmd:brant} (if installed) + {helpb estadd##fitstat:fitstat}{col 26}{...} +add results from {cmd:fitstat} (if installed) + {helpb estadd##listcoef:listcoef}{col 26}{...} +add results from {cmd:listcoef} (if installed) + {helpb estadd##mlogtest:mlogtest}{col 26}{...} +add results from {cmd:mlogtest} (if installed) + {helpb estadd##prchange:prchange}{col 26}{...} +add results from {cmd:prchange} (if installed) + {helpb estadd##prvalue:prvalue}{col 26}{...} +add results from {cmd:prvalue} (if installed) + {helpb estadd##asprvalue:asprvalue}{col 26}{...} +add results from {cmd:asprvalue} (if installed) + {hline 65} + +{marker opts} + {it:{help estadd##options:options}}{col 26}description + {hline 65} + {cmdab:r:eplace}{col 26}{...} +permit overwriting existing {cmd:e()}'s + {cmdab:p:refix(}{it:string}{cmd:)}{col 26}{...} +specify prefix for names of added results + {cmdab:q:uietly}{col 26}{...} +suppress output from subcommand (if any) + {it:subcmdopts}{col 26}{...} +subcommand specific options + {hline 65} + + +{title:Description} + +{p 4 4 2} +{cmd:estadd} adds additional results to the {cmd:e()}-returns of an +estimation command (see help {help estcom}, help {helpb ereturn}). If no +{it:namelist} is provided, then the results are added to the +currently active estimates (i.e. the model fit last). If these +estimates have been previously stored, the stored copy of the +estimates will also be modified. Alternatively, if {it:namelist} is +provided after the colon, results are added to all indicated sets of +stored estimates (see help {helpb estimates store} or help +{helpb eststo}). You may use the {cmd:*} and {cmd:?} +wildcards in {it:namelist}. Execution is silent if {it:namelist} is +provided. + +{p 4 4 2} +Adding additional results to the {cmd:e()}-returns is useful, for example, +if the estimates be tabulated by commands such as {helpb estout} +or {helpb esttab}. See the {help estadd##examples:Examples} section below for +illustration of the usage of {cmd:estadd}. + +{p 4 4 2}Technical note: Some of the subcommands below make use of the +information contained in {cmd:e(sample)} to determine estimation sample. +These subcommands return error if the estimates do not contain +{cmd:e(sample)}. + + +{title:Subcommands} + +{dlgtab:Elementary} +{marker local} +{p 4 8 2} +{cmd:estadd} {cmdab:loc:al} {it:name ...} + +{p 8 8 2} +adds in macro {cmd:e(}{it:name}{cmd:)} the specified contents (also +see help {helpb ereturn}). + +{marker scalar} +{p 4 8 2} +{cmd:estadd} {cmdab:sca:lar} {it:name} {cmd:=} {it:exp} + +{p 8 8 2} +adds in scalar {cmd:e(}{it:name}{cmd:)} the evaluation of {it:exp} +(also see help {helpb ereturn}). {it:name} must not be {cmd:b} or {cmd:V}. + +{p 4 8 2} +{cmd:estadd} {cmdab:sca:lar} {cmd:r(}{it:name}{cmd:)} + +{p 8 8 2} +adds in scalar {cmd:e(}{it:name}{cmd:)} the value of scalar +{cmd:r(}{it:name}{cmd:)}. {it:name} must not be {cmd:b} or {cmd:V}. + +{p 4 8 2} +{cmd:estadd} {cmdab:sca:lar} {it:name} + +{p 8 8 2} +adds in scalar {cmd:e(}{it:name}{cmd:)} the the value of scalar +{it:name}. {it:name} must not be {cmd:b} or {cmd:V}. + +{marker matrix} +{p 4 8 2} +{cmd:estadd} {cmdab:mat:rix} {it:name} {cmd:=} {it:matrix_expression} + +{p 8 8 2} +adds in matrix {cmd:e(}{it:name}{cmd:)} the evaluation of {it:matrix_expression} +(also see help {helpb matrix define}). {it:name} must not be {cmd:b} or {cmd:V}. + +{p 4 8 2} +{cmd:estadd} {cmdab:mat:rix} {cmd:r(}{it:name}{cmd:)} + +{p 8 8 2} +adds in matrix {cmd:e(}{it:name}{cmd:)} a copy of matrix +{cmd:r(}{it:name}{cmd:)}. {it:name} must not be {cmd:b} or {cmd:V}. + +{p 4 8 2} +{cmd:estadd} {cmdab:mat:rix} {it:name} + +{p 8 8 2} +adds in matrix {cmd:e(}{it:name}{cmd:)} a copy of matrix {it:name}. {it:name} +must not be {cmd:b} or {cmd:V}. + +{marker rreturn} +{p 4 8 2} +{cmd:estadd} {cmd:r(}{it:name}{cmd:)} + +{p 8 8 2} +adds in {cmd:e(}{it:name}{cmd:)} the value of scalar {cmd:r(}{it:name}{cmd:)} +or a copy of matrix {cmd:r(}{it:name}{cmd:)}, depending on the nature of +{cmd:r(}{it:name}{cmd:)}. {it:name} must not be {cmd:b} or {cmd:V}. + + +{dlgtab:Statistics for each coefficient} +{marker beta} +{p 4 8 2} +{cmd:estadd} {cmd:beta} + +{p 8 8 2} +adds in {cmd:e(beta)} the standardized beta coefficients. + +{marker vif} +{p 4 8 2} +{cmd:estadd} {cmd:vif} [{cmd:,} {cmdab:tol:erance} {cmdab:sqr:vif} ] + +{p 8 8 2} +adds in {cmd:e(vif)} the variance inflation factors (VIFs) for the +regressors (see help {helpb vif}). Note that {cmd:vif} only works +with estimates produced by {helpb regress}. {cmd:tolerance} +additionally adds the tolerances (1/VIF) in {cmd:e(tolerance)}. +{cmd:sqrvif} additionally adds the square roots of the VIFs in +{cmd:e(sqrvif)}. + +{marker pcorr} +{p 4 8 2} +{cmd:estadd} {cmd:pcorr} [{cmd:, semi} ] + +{p 8 8 2} +adds the partial correlations (see help {helpb pcorr}) and, +optionally, the semi-partial correlations between the dependent +variable and the individual regressors (see, e.g., the {cmd:pcorr2} +package from the SSC Archive). In the case of multiple-equations +models, the results are computed for the first equation only. The +partial correlations will be returned in {cmd:e(pcorr)} and, if +{cmd:semi} is specified, the semi-partial correlations will be +returned in {cmd:e(spcorr)}. + +{marker expb} +{p 4 8 2} +{cmd:estadd} {cmd:expb} [{cmd:,} {cmdab:nocons:tant} ] + +{p 8 8 2} +adds in {cmd:e(expb)} the exponentiated coefficients (see the help +{it:{help eform_option}}). {cmd:noconstant} excludes the constant +from the added results. + +{marker ebsd} +{p 4 8 2} +{cmd:estadd} {cmd:ebsd} + +{p 8 8 2} +adds in {cmd:e(ebsd)} the standardized factor change coefficients, +i.e. exp(b_jS_j), where b_j is the raw coefficient and S_j is the +standard deviation of regressor j, that are sometimes reported for +logistic regression (see Long 1997). + +{marker mean} +{p 4 8 2} +{cmd:estadd} {cmd:mean} + +{p 8 8 2} +adds in {cmd:e(mean)} the means of the regressors. + +{marker sd} +{p 4 8 2} +{cmd:estadd} {cmd:sd} [{cmd:,} {cmdab:nob:inary} ] + +{p 8 8 2} +adds in {cmd:e(sd)} the standard deviations of the regressors. +{cmd:nobinary} suppresses the computation of the standard deviation +for 0/1 variables. + +{marker summ} +{p 4 8 2} +{cmd:estadd} {cmd:summ} [{cmd:,} {it:stats} ] + +{p 8 8 2} +adds vectors of the regressors' descriptive statistics to the +estimates. The following {it:stats} are available: +{p_end} +{marker stats} + {it:stats}{col 26}description + {hline 59} + {cmdab:me:an}{col 26}mean + {cmdab:su:m}{col 26}sum + {cmdab:mi:n}{col 26}minimum + {cmdab:ma:x}{col 26}maximum + {cmdab:ra:nge}{col 26}range = max - min + {cmd:sd}{col 26}standard deviation + {cmdab:v:ar}{col 26}variance + {cmd:cv}{col 26}coefficient of variation (sd/mean) + {cmdab:sem:ean}{col 26}standard error of mean = sd/sqrt(n) + {cmdab:sk:ewness}{col 26}skewness + {cmdab:k:urtosis}{col 26}kurtosis + {cmd:p1}{col 26}1st percentile + {cmd:p5}{col 26}5th percentile + {cmd:p10}{col 26}10th percentile + {cmd:p25}{col 26}25th percentile + {cmd:p50}{col 26}50th percentile + {cmd:p75}{col 26}75th percentile + {cmd:p90}{col 26}90th percentile + {cmd:p95}{col 26}95th percentile + {cmd:p99}{col 26}99th percentile + {cmd:iqr}{col 26}interquartile range = p75 - p25 + {cmd:all}{col 26}all of the above + {cmdab:med:ian}{col 26}equivalent to specifying "{cmd:p50}" + {cmd:q}{col 26}equivalent to specifying "{cmd:p25 p50 p75}" + {hline 59} + +{p 8 8 2} +The default is {cmd:mean sd min max}. Alternatively, indicate the +desired statistics. For example, to add information on the +regressors' skewness and kurtosis, type + + {inp:. estadd summ, skewness kurtosis} + +{p 8 8 2} +The statistics names are used as the names for the returned {cmd:e()} +matrices. For example, {cmd:estadd summ, mean} will store the means +of the regressors in {cmd:e(mean)}. + + +{dlgtab:Summary statistics} +{marker coxsnell} +{p 4 8 2} +{cmd:estadd} {cmd:coxsnell} + +{p 8 8 2} +adds in {cmd:e(coxsnell)} the Cox & Snell pseudo R-squared, which is +defined as + +{p 12 12 2} +r2_coxsnell = 1 - ( L0 / L1 )^(2/N) + +{p 8 8 2} +where L0 is the likelihood of the model without regressors, L1 the +likelihood of the full model, and N is the sample size. + +{marker nagelkerke} +{p 4 8 2} +{cmd:estadd} {cmd:nagelkerke} + +{p 8 8 2} +adds in {cmd:e(nagelkerke)} the Nagelkerke pseudo R-squared (or Cragg +& Uhler pseudo R-squared), which is defined as + +{p 12 12 2} +r2_nagelkerke = r2_coxsnell / (1 - L0^(2/N)) + +{marker lrtest} +{p 4 8 2} +{cmd:estadd} {cmd:lrtest} {it:model} [{cmd:,} {cmdab:n:ame:(}{it:string}{cmd:)} +{it:{help lrtest:lrtest_options}} ] + +{p 8 8 2} +adds the results from a likelihood-ratio test, where {it:model} is +the comparison model (see help {helpb lrtest}). Added are +{cmd:e(lrtest_chi2)}, {cmd:e(lrtest_df)}, and {cmd:e(lrtest_p)}. The +names may be modified using the {cmd:name()} option. Specify +{cmd:name(}{it:myname}{cmd:)} to add {cmd:e(}{it:myname}{cmd:chi2)}, +{cmd:e(}{it:myname}{cmd:df)}, and {cmd:e(}{it:myname}{cmd:p)}. See +help {helpb lrtest} for the {it:lrtest_options}. + +{marker ysumm} +{p 4 8 2} +{cmd:estadd} {cmd:ysumm} [{cmd:,} {it:stats} ] + +{p 8 8 2} +adds descriptive statistics of the dependent variable. See the +{helpb estadd##summ:summ} subcommand above for a list of the available +{it:stats}. The default is {cmd:mean sd min max}. The default prefix +for the names of the added scalars is {cmd:y} (e.g. the mean of the +dependent variable will be returned in {cmd:e(ymean)}). Use +{cmd:estadd}'s {cmd:prefix()} option to change the prefix. If a model +has multiple dependent variables, results for the first variable will +be added. + +{dlgtab:Other} +{marker margins} +{p 4 8 2} +{cmd:estadd} {cmd:margins} [{it:marginlist}] [{it:if}] [{it:in}] [{it:weight}] [, {it:options} ] + +{p 8 8 2} +adds results from the {cmd:margins} command, which was introduced +in Stata 11. See help {helpb margins} for options. All results returned by +{cmd:margins} except {cmd:e(V)} are added using "{cmd:margins_}" as a default +prefix. For example, the margins are added in {cmd:e(margins_b)}. The +standard errors are added in {cmd:e(margins_se)}. Use the {helpb estadd##opts:prefix()} +option to change the default prefix. + +{marker spost} +{dlgtab:SPost9} + +{p 4 4 2} The following subcommands are wrappers for +commands from Long and Freese's {helpb SPost9} package (see +{browse "http://www.indiana.edu/~jslsoc/spost9.htm"}). Type + + . {net "from http://www.indiana.edu/~jslsoc/stata":net from http://www.indiana.edu/~jslsoc/stata} + +{p 4 4 2} +to obtain the {cmd:SPost9} package (spost9_ado). {cmd:SPost} for Stata 8 (spostado) is not +supported. + +{p 4 4 2}For examples on using the subcommands see +{browse "http://repec.sowi.unibe.ch/stata/estout/spost.html"}. + +{marker brant} +{p 4 8 2} +{cmd:estadd brant} [{cmd:,} {it:{help brant:brant_options}} ] + +{p 8 8 2} +applies {helpb brant} from Long and +Freese's {helpb SPost} package and adds the returned results to +{cmd:e()}. You may specify {it:brant_options} as described in +help {helpb brant}. The following results are added: + + {cmd:e(}{it:...}{cmd:)} Contents + {hline 60} + Scalars + {cmd:brant_chi2} Chi-squared of overall Brant test + {cmd:brant_df} Degrees of freedom of overall Brant test + {cmd:brant_p} P-value of overall Brant test + + Matrix + {cmd:brant} Test results for individual regressors + (rows: chi2, p LR or Wald X2 + {cmd:r2_adj} Adjusted R2 + {cmd:r2_mf} McFadden's R2 + {cmd:r2_mfadj} McFadden's Adj R2 + {cmd:r2_ml} ML (Cox-Snell) R2 + {cmd:r2_cu} Cragg-Uhler(Nagelkerke) R2 + {cmd:r2_mz} McKelvey & Zavoina's R2 + {cmd:r2_ef} Efron's R2 + {cmd:v_ystar} Variance of y* + {cmd:v_error} Variance of error + {cmd:r2_ct} Count R2 + {cmd:r2_ctadj} Adj Count R2 + {cmd:aic0} AIC + {cmd:aic_n} AIC*n + {cmd:bic0} BIC + {cmd:bic_p} BIC' + {cmd:statabic} BIC used by Stata + {cmd:stataaic} AIC used by Stata + {cmd:n_rhs} Number of rhs variables + {cmd:n_parm} Number of parameters + {hline 60} + +{marker listcoef} +{p 4 8 2} +{cmd:estadd listcoef} [{it:varlist}] [{cmd:,} {cmd:nosd} {it:{help listcoef:listcoef_options}} ] + +{p 8 8 2} +applies {helpb listcoef} from Long and +Freese's {helpb SPost} package and adds the returned results to +{cmd:e()}. You may specify {it:listcoef_options} as described in +help {helpb listcoef}. Furthermore, option {cmd:nosd} suppresses +adding the standard deviations of the variables in {cmd:e(b_sdx)}. + +{p 8 8 2}Depending on the estimation command and options, several of the +following matrices are added: + + {cmd:e(}{it:...}{cmd:)} Contents + {hline 60} + {cmd:b_xs} x-standardized coefficients + {cmd:b_ys} y-standardized coefficients + {cmd:b_std} Fully standardized coefficients + {cmd:b_fact} Factor change coefficients + {cmd:b_facts} Standardized factor change coefficients + {cmd:b_pct} Percent change coefficients + {cmd:b_pcts} Standardized percent change coefficients + {cmd:b_sdx} Standard deviation of the Xs + {hline 60} + +{p 8 8 2}For nominal models ({helpb mlogit}, {helpb mprobit}) the +original parametrization of {cmd:e(b)} may not match the contrasts +computed by {cmd:listcoef}. To be able to tabulate standardized +coefficients along with the raw coefficients for the requested +contrasts, the following additional matrices are added for +these models: + + {cmd:e(}{it:...}{cmd:)} Contents + {hline 60} + {cmd:b_raw} raw coefficients + {cmd:b_se} standard errors of raw coefficients + {cmd:b_z} z statistics + {cmd:b_p} p-values + {hline 60} + +{marker mlogtest} +{p 4 8 2} +{cmd:estadd mlogtest} [{it:varlist}] [{cmd:,} {it:{help mlogtest:mlogtest_options}} ] + +{p 8 8 2} +applies {helpb mlogtest} from Long and +Freese's {helpb SPost} package and adds the returned results to +{cmd:e()}. You may specify {it:mlogtest_options} as described in +help {helpb mlogtest}. + +{p 8 8 2}Depending on the specified options, a selection of the following +returns are added: + + {cmd:e(}{it:...}{cmd:)} Contents + {hline 60} + Scalars + {cmd:hausman_set}{it:#}{cmd:_chi2} Hausman IIA tests using {helpb hausman} + {cmd:hausman_set}{it:#}{cmd:_df} + {cmd:hausman_set}{it:#}{cmd:_p} + + {cmd:suest_set}{it:#}{cmd:_chi2} Hausman IIA tests using {helpb suest} + {cmd:suest_set}{it:#}{cmd:_df} + {cmd:suest_set}{it:#}{cmd:_p} + + {cmd:smhsiao_set}{it:#}{cmd:_chi2} Small-Hsiao IIA tests + {cmd:smhsiao_set}{it:#}{cmd:_df} + {cmd:smhsiao_set}{it:#}{cmd:_p} + + {cmd:combine_}{it:#1}{cmd:_}{it:#2}{cmd:_chi2} Wald tests for combination of outcomes + {cmd:combine_}{it:#1}{cmd:_}{it:#2}{cmd:_df} + {cmd:combine_}{it:#1}{cmd:_}{it:#2}{cmd:_p} + + {cmd:lrcomb_}{it:#1}{cmd:_}{it:#2}{cmd:_chi2} LR tests for combination of outcomes + {cmd:lrcomb_}{it:#1}{cmd:_}{it:#2}{cmd:_df} + {cmd:lrcomb_}{it:#1}{cmd:_}{it:#2}{cmd:_p} + + {cmd:wald_set}{it:#}{cmd:_chi2} Wald tests for sets of independent + {cmd:wald_set}{it:#}{cmd:_df} variables + {cmd:wald_set}{it:#}{cmd:_p} + + {cmd:lrtest_set}{it:#}{cmd:_chi2} LR tests for sets of independent + {cmd:lrtest_set}{it:#}{cmd:_df} variables + {cmd:lrtest_set}{it:#}{cmd:_p} + + Matrices + {cmd:wald} Wald tests for individual variables + (rows: chi2, df, p) + {cmd:lrtest} LR tests for individual variables + (rows: chi2, df, p) + {hline 60} + +{p 4 4 2}To address the rows of {cmd:e(wald)} and {cmd:e(lrtest)} in {helpb estout}'s +{cmd:cells()} option type the row names in brackets, for example, {cmd:wald[p]} or +{cmd:lrtest[chi2]}. + +{marker prchange} +{p 4 8 2} +{cmd:estadd prchange} [{it:varlist}] [{cmd:if} {it:exp}] [{cmd:in} {it:range}] [{cmd:,} + {cmdab:pa:ttern(}{it:typepattern}{cmd:)} {cmdab:b:inary(}{it:type}{cmd:)} {cmdab:c:ontinuous(}{it:type}{cmd:)} + [{cmd:no}]{cmdab:a:vg} {cmd:split}[{cmd:(}{it:prefix}{cmd:)}] {it:{help prchange:prchange_options}} ] + +{p 8 8 2} +applies {helpb prchange} from Long and +Freese's {helpb SPost} package and adds the returned results to +{cmd:e()}. You may specify {it:prchange_options} as described in +help {helpb prchange}. In particular, the {cmd:outcome()} option may be +used with models for count, ordered, or nominal outcomes +to request results for a specific outcome. Further options are: + +{p 8 12 2}{cmd:pattern(}{it:typepattern}{cmd:)}, {cmd:binary(}{it:type}{cmd:)}, and +{cmd:continuous(}{it:type}{cmd:)} to determine which types of discrete change +effects are added as the main results. The default is to add the 0 to 1 +change effect for binary variables and the standard deviation change effect +for continuous variables. Use {cmd:binary(}{it:type}{cmd:)} and +{cmd:continuous(}{it:type}{cmd:)} to change these defaults. Available +types are: + + {it:type} Description + {hline 48} + {cmdab:mi:nmax} minimum to maximum change effect + {cmdab:0:1} 0 to 1 change effect + {cmdab:d:elta} {cmd:delta()} change effect + {cmdab:s:d} standard deviation change effect + {cmdab:m:argefct} marginal effect (some models only) + {hline 48} + +{p 12 12 2}Use {cmd:pattern(}{it:typepattern}{cmd:)} if you want to determine the +type of the added effects individually for each regressor. For example, +{bind:{cmd:pattern(minmax sd delta)}} would add {cmd:minmax} for the first regressor, +{cmd:sd} for the second, and {cmd:delta} for the third, and then proceed +using the defaults for the remaining variables. + +{p 8 12 2}{cmd:avg} to request that only the average results over +all outcomes are added if applied to ordered +or nominal models ({helpb ologit}, {helpb oprobit}, {helpb slogit}, {helpb mlogit}, {helpb mprobit}). The +default is to add the average results as well as the individual results for +the different outcomes (unless {helpb prchange}'s {cmd:outcome()} option is +specified, in which case only results for the indicated outcome are +added). Furthermore, specify {cmd:noavg} to suppress the average results +and only add the outcome-specific results. {cmd:avg} cannot be combined with {cmd:split} +or {cmd:outcome()}. + +{p 8 12 2}{cmd:split}[{cmd:(}{it:prefix}{cmd:)}] to save +each outcome's results in a separate estimation set if applied to ordered +or nominal models ({helpb ologit}, {helpb oprobit}, {helpb slogit}, {helpb mlogit}, +{helpb mprobit}). The estimation sets are named +{it:prefix}{it:#}, where {it:#} is the value of the outcome at hand. If no +{it:prefix} is provided, the name of the estimation set followed by an +underscore is used as the prefix. If the estimation set has no name +(because it has not been stored yet) the name of the estimation command +followed by an underscore is used as the prefix (e.g. {cmd:ologit_}). The +estimation sets stored by the {cmd:split} option are intended for +tabulation only and should not be used with other post-estimation +commands. + +{p 8 8 2}Depending on model and options, several of the following matrices +and scalars are added: + + {cmd:e(}{it:...}{cmd:)} Contents + {hline 60} + Scalars + {cmd:centered} {cmd:1} if effects are centered, {cmd:0} else + {cmd:delta} Value of {cmd:delta()} + {cmd:predval}[{it:#}] Prediction(s) at the base values + {cmd:outcome} Outcome value ({cmd:outcome()}/{cmd:split} only) + + Matrices + {cmd:dc} Discrete change effects (rows: main, minmax, + 01, delta, sd [, margefct]) + {cmd:pattern} Types of effects in the main row of {cmd:e(dc)} + {cmd:X} Base values and descriptive statistics + (rows: X, SD, Min, Max) + {hline 60} + +{p 8 8 2}The {cmd:e(dc)} and {cmd:e(X)} matrices have multiple rows. The +{cmd:e(dc)} matrix contains the main results as determined by +{cmd:pattern()}, {cmd:binary()}, and {cmd:continuous()} in the first row. +The second and following rows contain the separate results for each type of +effect using the labels provided by {cmd:prchange} as row names. Type +{cmd:dc[}{it:#}{cmd:]} or {cmd:dc[}{it:rowname}{cmd:]} to address the rows +in {helpb estout}'s {cmd:cells()} option, where {it:#} is the row number +or {it:rowname} is the +row name. For example, type {cmd:dc[-+sd/2]} to address the centered +standard deviation change effects. To tabulate the main results (1st row), +simply type {cmd:dc}. {cmd:e(pattern)} indicates the types of effects +contained in the main row of {cmd:e(dc)} using numeric codes. The codes are 1 +for the minimum to maximum change effect, 2 for the 0 to 1 change effect, 3 +for the {cmd:delta()} change effect, 4 for the standard deviation change +effect, and 5 for the marginal effect. {cmd:e(X)} has four rows +containing the base values, standard deviations, minimums, and maximums. If +the {cmd:fromto} option is specified, two additional matrices, +{cmd:e(dcfrom)} and {cmd:e(dcto)} are added. + +{marker prvalue} +{p 4 8 2} +{cmd:estadd prvalue} [{cmd:if} {it:exp}] [{cmd:in} {it:range}] [{cmd:,} {cmdab:lab:el:(}{it:string}{cmd:)} +{it:{help prvalue:prvalue_options}} ] + +{p 4 8 2} +{cmd:estadd prvalue} {cmd:post} [{it:name}] [{cmd:,} {cmdab:t:itle:(}{it:string}{cmd:)} {cmd:swap} ] + +{p 8 8 2} applies {helpb prvalue} from Long and Freese's {helpb SPost} +package and adds the returned results to {cmd:e()}. The procedure is to +first collect a series of predictions by repeated calls to +{cmd:estadd prvalue} and then apply {cmd:estadd prvalue post} to prepare the results +for tabulation as in the following example: + + {com}. logit lfp k5 k618 age wc hc lwg inc + . estadd prvalue, x(inc 10) label(low inc) + . estadd prvalue, x(inc 20) label(med inc) + . estadd prvalue, x(inc 30) label(high inc) + . estadd prvalue post + . estout{txt} + +{p 8 8 2} You may specify {it:prvalue_options} with {cmd:estadd prvalue} as +described in help {helpb prvalue}. For example, use {cmd:x()} and +{cmd:rest()} to set the values of the independent variables. Use +{cmd:label()} to label the single calls. "pred#" is used as label if +{cmd:label()} is omitted, where # is the number of the call. Labels may +contain spaces but they will be trimmed to a maximum +length of 30 characters and some characters ({cmd::}, +{cmd:.}, {cmd:"}) will be replaced by underscore. The results +from the single calls are collected in matrix {cmd:e(_estadd_prvalue)} +(predictions) and matrix {cmd:e(_estadd_prvalue_x)} (x-values). Specify +{cmd:replace} to drop results from previous calls. + +{p 8 8 2} +{cmd:estadd prvalue post} posts the collected predictions in {cmd:e(b)} +so that they can be tabulated. The following results are saved: + + {cmd:e(}{it:...}{cmd:)} Contents + {hline 60} + Scalars + {cmd:N} number of observations + + Macros + {cmd:depvar} name of dependent variable + {cmd:cmd} {cmd:estadd_prvalue} + {cmd:model} model estimation command + {cmd:properties} {cmd:b} + + Matrices + {cmd:b} predictions + {cmd:se} standard errors + {cmd:LB} lower confidence interval bounds + {cmd:UB} upper confidence interval bounds + {cmd:Category} outcome values + {cmd:Cond} conditional predictions (some models only) + {cmd:X} values of predictors (for each prediction) + {cmd:X2} second equation predictors (some models only) + {hline 60} + +{p 8 8 2} {cmd:estadd prvalue post} replaces the current model unless +{it:name} is specified, in which case the results are stored under {it:name} and the model +remains active. However, if the model has a name +(because it has been stored), the name of the model is used as a prefix. +If, for example, the model has been stored as {cmd:model1}, then +{cmd:estadd prvalue post} stores its results under {cmd:model1}{it:name}. +Use {cmd:title()} to specify a title for the stored results. + +{p 8 8 2}The default for {cmd:estadd prvalue post} is to arrange +{cmd:e(b)} in a way so that predictions are grouped by outcome (i.e. outcome labels are used +as equations). Alternatively, specify {cmd:swap} to group predictions by +{cmd:prvalue} calls (i.e. to use the prediction labels as equations). + +{p 8 8 2}{cmd:e(X)} contains one row for each independent variable. To address the rows in +{helpb estout}'s {cmd:cells()} option type {cmd:X[}{it:varname}{cmd:]}, where {it:varname} is +the name of the variable of interest. {cmd:e(X2)}, if provided, is analogous to {cmd:e(X)}. + +{marker asprvalue} +{p 4 8 2} +{cmd:estadd asprvalue} [{cmd:,} {cmdab:lab:el:(}{it:string}{cmd:)} +{it:{help asprvalue:asprvalue_options}} ] + +{p 4 8 2} +{cmd:estadd asprvalue} {cmd:post} [{it:name}] [{cmd:,} {cmdab:t:itle:(}{it:string}{cmd:)} {cmd:swap} ] + +{p 8 8 2} applies {helpb asprvalue} from Long and Freese's {helpb SPost} +package and adds the returned results to {cmd:e()}. The procedure is to +first collect a series of predictions by repeated calls to +{cmd:estadd asprvalue} and then apply {cmd:estadd asprvalue post} to prepare the results +for tabulation as in the following example: + + {com}. clogit choice train bus time invc, group(id) + . estadd asprvalue, cat(train bus) label(at means) + . estadd asprvalue, cat(train bus) rest(asmean) label(at asmeans) + . estadd asprvalue post + . estout{txt} + +{p 8 8 2} You may specify {it:asprvalue_options} with {cmd:estadd asprvalue} as +described in help {helpb asprvalue}. For example, use {cmd:x()} and +{cmd:rest()} to set the values of the independent variables. Use +{cmd:label()} to label the single calls. "pred#" is used as label if +{cmd:label()} is omitted, where # is the number of the call. Labels may +contain spaces but they will be trimmed to a maximum +length of 30 characters and some characters ({cmd::}, +{cmd:.}, {cmd:"}) will be replaced by underscore. The results +from the single calls are collected in matrices {cmd:e(_estadd_asprval)} +(predictions), {cmd:e(_estadd_asprval_asv)} (values of alternative-specific +variables), and {cmd:e(_estadd_asprval_csv)} (values of case-specific +variables). Specify {cmd:replace} to drop results from previous calls. + +{p 8 8 2} +{cmd:estadd asprvalue post} posts the collected predictions in {cmd:e(b)} +so that they can be tabulated. The following results are saved: + + {cmd:e(}{it:...}{cmd:)} Contents + {hline 60} + Scalars + {cmd:N} number of observations + + Macros + {cmd:depvar} name of dependent variable + {cmd:cmd} {cmd:estadd_asprvalue} + {cmd:model} model estimation command + {cmd:properties} {cmd:b} + + Matrices + {cmd:b} predictions + {cmd:asv} alternative-specific variables (if available) + {cmd:csv} case-specific variables (if available) + {hline 60} + +{p 8 8 2} {cmd:estadd asprvalue post} replaces the current model unless +{it:name} is specified, in which case the results are stored under +{it:name} and the model remains active. However, if the model has a name +(because it has been stored), the name of the model is used as a prefix. +If, for example, the model has been stored as {cmd:model1}, then +{cmd:estadd asprvalue post} stores its results under {cmd:model1}{it:name}. +Use {cmd:title()} to specify a title for the stored results. + +{p 8 8 2}The default for {cmd:estadd asprvalue post} is to arrange +{cmd:e(b)} in a way so that predictions are grouped by outcome (i.e. outcome labels are used +as equations). Alternatively, specify {cmd:swap} to group predictions by +{cmd:prvalue} calls (i.e. to use the prediction labels as equations). + +{p 8 8 2}{cmd:e(asv)} and {cmd:e(csv)} contain one row for each variable. +To address the rows in {helpb estout}'s {cmd:cells()} option type +{cmd:asv[}{it:varname}{cmd:]} or {cmd:csv[}{it:varname}{cmd:]}, where +{it:varname} is the name of the variable of interest. + +{marker options} +{title:Options} + +{p 4 8 2} +{cmd:replace} permits {cmd:estadd} to overwrite existing {cmd:e()} +macros, scalars, or matrices. + +{p 4 8 2} +{cmd:prefix(}{it:string}{cmd:)} denotes a prefix for the names of the +added results. The default prefix is an empty string. For example, if +{cmd:prefix(}{it:string}{cmd:)} is specified, the {cmd:beta} +subcommand will return the matrix {cmd:e(}{it:string}{cmd:beta)}. + +{p 4 8 2}{cmd:quietly} suppresses the output from the called subcommand and displays only +the list of added results. Note that many of {cmd:estadd}'s subcommands do not generate +output, in which case {cmd:quietly} has no effect. + +{p 4 8 2} +{it:subcmdopts} are subcommand specific options. See the descriptions +of the subcommands above. + +{marker examples} +{title:Examples} + +{p 4 4 2}Example 1: Add {cmd:r()}-returns from other programs to the +current estimates + + {com}. sysuse auto + {txt}(1978 Automobile Data) + + {com}. quietly regress price mpg weight + {txt} + {com}. test mpg=weight + + {txt} ( 1) {res}mpg - weight = 0 + + {txt} F( 1, 71) ={res} 0.36 + {txt}{col 13}Prob > F ={res} 0.5514 + {txt} + {com}. estadd scalar p_diff = r(p) + + {txt}added scalar: + e(p_diff) = {res}.55138216 + {txt} + {com}. estout, stats(p_diff) + {res} + {txt}{hline 25} + {txt} b + {txt}{hline 25} + {txt}mpg {res} -49.51222{txt} + {txt}weight {res} 1.746559{txt} + {txt}_cons {res} 1946.069{txt} + {txt}{hline 25} + {txt}p_diff {res} .5513822{txt} + {txt}{hline 25} + + +{p 4 4 2}Example 2: Add means and standard deviations of the model's regressors +to the current estimates + + {com}. quietly logit foreign price mpg + {txt} + {com}. estadd summ, mean sd + + {txt}added matrices: + e(sd) : {res}1 x 3 + {txt}e(mean) : {res}1 x 3 + {txt} + {com}. estout, cells("mean sd") drop(_cons) + {res} + {txt}{hline 38} + {txt} mean sd + {txt}{hline 38} + {txt}price {res} 6165.257 2949.496{txt} + {txt}mpg {res} 21.2973 5.785503{txt} + {txt}{hline 38} + + +{p 4 4 2} +Example 3: Add standardized beta coefficients to stored estimates + + {com}. eststo: quietly regress price mpg + {txt}({res}est1{txt} stored) + + {com}. eststo: quietly regress price mpg foreign + {txt}({res}est2{txt} stored) + + {com}. estadd beta: * + {txt} + {com}. estout, cells(beta) drop(_cons) + {res} + {txt}{hline 38} + {txt} est1 est2 + {txt} beta beta + {txt}{hline 38} + {txt}mpg {res} -.4685967 -.5770712{txt} + {txt}foreign {res} .2757378{txt} + {txt}{hline 38} + + +{p 4 4 2}See +{browse "http://repec.sowi.unibe.ch/stata/estout/"} +for additional examples. + + +{title:Writing one's own subcommands} + +{p 4 4 2} +A program providing a new {cmd:estadd} subcommand should be called +{cmd:estadd_}{it:mysubcommand} (see help {helpb program} for advice +on defining programs). {it:mysubcommand} will be available to {cmd:estadd} as a new +{it:subcommand} after the program definition has been executed or +saved to a file called "estadd_{it:mysubcommand}.ado" in either the +current directory or somewhere else in the {cmd:adopath} +(see help {helpb sysdir}). + +{p 4 4 2} +Use the subcommands provided within "estadd.ado" as a starting +point for writing new subcommands. See +{browse "http://repec.sowi.unibe.ch/stata/estout/estadd.html#007"} +for an example. + + +{title:Author} + +{p 4 4 2} Ben Jann, Institute of Sociology, University of Bern, jann@soz.unibe.ch + + +{title:Also see} + + Manual: {hi:[R] estimates} + +{p 4 13 2}Online: help for + {helpb estimates}, + {helpb ereturn}, + {helpb program}, + {helpb esttab}, + {helpb estout}, + {helpb eststo}, + {helpb estpost} +{p_end} diff --git a/ado/e/estout.ado b/ado/e/estout.ado new file mode 100644 index 0000000..2f0743c --- /dev/null +++ b/ado/e/estout.ado @@ -0,0 +1,4959 @@ +*! version 3.31 26apr2022 Ben Jann + +program define estout, rclass + version 8.2 + return local cmdline estout `macval(0)' + syntax [anything] [using] [ , /// + Cells(string asis) /// + Drop(string asis) /// + Keep(string asis) /// + Order(string asis) /// + REName(passthru) /// + Indicate(string asis) /// + TRansform(string asis) /// + EQuations(passthru) /// + EFORM2(string) /// + Margin2(string) /// + DIscrete(string asis) /// + MEQs(string) /// + DROPPED2(string) /// + level(numlist max=1 int >=10 <=99) /// + Stats(string asis) /// + STARLevels(string asis) /// + STARKeep(string asis) /// + STARDrop(string asis) /// + VARwidth(numlist max=1 int >=0) /// + MODELwidth(numlist int >=0) /// + EXTRAcols(numlist sort) /// + BEGin(string asis) /// + DELimiter(string asis) /// + INCELLdelimiter(string asis) /// + end(string asis) /// + DMarker(string) /// + MSign(string) /// + SUBstitute(string asis) /// + INTERACTion(string asis) /// + TItle(string) /// + note(string) /// + PREHead(string asis) /// + POSTHead(string asis) /// + PREFoot(string asis) /// + POSTFoot(string asis) /// + HLinechar(string) /// + VARLabels(string asis) /// + REFcat(string asis) /// + MLabels(string asis) /// + NUMbers2(string asis) /// + COLLabels(string asis) /// + EQLabels(string asis) /// + MGRoups(string asis) /// + LABCOL2(string asis) /// + TOPfile(string) /// + BOTtomfile(string) /// + STYle(string) /// + DEFaults(string) /// + * /// + ] + MoreOptions, `options' + if "`style'"!="" local defaults "`style'" + +*Matrix mode + tempname B + MatrixMode, `anything' `rename' // resets the cells argument + // and returns r(coefs) etc. and local 'matrixmode' + if (`matrixmode'==1) { + local models `r(names)' + local nmodels = r(nmodels) + local ccols = r(ccols) + if `ccols'>0 { + mat `B' = r(coefs) + } + } + +*Parse suboptions + local elnum 0 + if `"`cells'"'!="none" { + gettoken row rest: cells, bind match(par) qed(qed) + if `"`par'"'=="(" local qed 1 + local cells + while `"`row'"'!="" { + local newrow + gettoken opt row: row, parse(" ([&") + if `"`macval(row)'"'=="" & `qed'==0 { + local row0 + gettoken trash: rest, parse("[") + if `"`trash'"'=="[" { + gettoken trash rest: rest, parse("[") + gettoken mrow rest: rest, parse("]") q + gettoken trash rest: rest, parse("]") + if `"`trash'"'!="]" { + error 198 + } + } + gettoken trash: rest, match(par) + if `"`par'"'=="(" { + gettoken opt2 rest: rest, match(par) + } + else local opt2 + } + else { + gettoken trash: row, parse("[") + if `"`trash'"'=="[" { + gettoken trash row: row, parse("[") + gettoken mrow row: row, parse("]") q + gettoken trash row: row, parse("]") + if `"`trash'"'!="]" { + error 198 + } + } + gettoken trash row0: row, match(par) + gettoken opt2: row, match(par) + } + while "`opt'"!="" { + if "`opt'"!="&" & "`opt'"!="." { + local `opt'_tname "el`++elnum'" + local ``opt'_tname'_ "`opt'" + local newrow `"`newrow' ``opt'_tname'"' + if `"`par'"'!="(" local opt2 + ParseValueSubopts ``opt'_tname' `opt', mrow(`mrow') `macval(opt2)' + local mrow + } + else { + if `"`par'"'=="(" | `"`mrow'"'!="" error 198 + local newrow `"`newrow' `opt'"' + } + if `"`par'"'!="(" { + gettoken opt row: row, parse(" ([&") + } + else { + gettoken opt row: row0, parse(" ([&") + } + gettoken trash: row, parse("[") + if `"`trash'"'=="[" { + gettoken trash row: row, parse("[") + gettoken mrow row: row, parse("]") q + gettoken trash row: row, parse("]") + if `"`trash'"'!="]" { + error 198 + } + } + gettoken trash row0: row, match(par) + gettoken opt2: row, match(par) + } + local newrow: list retok newrow + if `qed' local cells `"`cells'"`newrow'" "' + else local cells `"`cells'`newrow' "' + gettoken row rest: rest, bind match(par) qed(qed) + if `"`par'"'=="(" local qed 1 + } + local cells: list retok cells + } + if "`eform2'"!="" { + local eform "`eform2'" + local eform2 + } + if `"`transform'"'!="" { + ParseTransformSubopts `transform' + } + if "`margin2'"!="" { + local margin "`margin2'" + local margin2 + } + if `"`dropped'"'!="" local dropped "(dropped)" + if `"`macval(dropped2)'"'!="" { + local dropped `"`macval(dropped2)'"' + local dropped2 + } + if `"`macval(stats)'"'!="" { + ParseStatsSubopts `macval(stats)' + if `"`macval(statslabels)'"'!="" { + if trim(`"`statslabels'"')=="none" { + local statslabelsnone none + local statslabels + } + else { + ParseLabelsSubopts statslabels `macval(statslabels)' + } + } + } + foreach opt in mgroups mlabels eqlabels collabels varlabels { + if `"`macval(`opt')'"'!="" { + if trim(`"``opt''"')=="none" { + local `opt'none none + local `opt' + } + else { + ParseLabelsSubopts `opt' `macval(`opt')' + } + } + } + if `"`macval(numbers2)'"'!="" { + local numbers `"`macval(numbers2)'"' + local numbers2 + } + if `"`macval(indicate)'"'!="" { + ParseIndicateOpts `macval(indicate)' + } + if `"`macval(refcat)'"'!="" { + ParseRefcatOpts `macval(refcat)' + } + if `"`macval(starlevels)'"'!="" { + ParseStarlevels `macval(starlevels)' + } + if `"`macval(labcol2)'"'!="" { + ParseLabCol2 `macval(labcol2)' + } + +*Process No-Options + foreach opt in unstack eform margin dropped discrete stardetach wrap /// + legend label refcatlabel numbers lz abbrev replace append type showtabs /// + smcltags smclrules smclmidrules smcleqrules asis outfilenoteoff /// + omitted baselevels rtfencode { + if "`no`opt''"!="" local `opt' + } + +*Defaults + if "`defaults'"=="esttab" local defaults "tab" + if "`defaults'"=="" & `"`using'"'=="" local defaults "smcl" + if inlist("`defaults'", "", "smcl", "tab", "fixed", "tex", "html","mmd") { + local varwidthfactor = (1 + ("`eqlabelsmerge'"!="" & "`unstack'"=="")*.5) + if inlist("`defaults'", "", "tab") { + if `"`macval(delimiter)'"'=="" local delimiter _tab + if `"`macval(interaction)'"'=="" local interaction `"" # ""' + } + else if "`defaults'"=="smcl" { + if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor' + if "`modelwidth'"=="" local modelwidth 12 + if "`noabbrev'"=="" local abbrev abbrev + if `"`macval(delimiter)'"'=="" local delimiter `"" ""' + if "`nosmcltags'"=="" local smcltags smcltags + if "`nosmclrules'"=="" local smclrules smclrules + if "`asis'"=="" local noasis noasis + if `"`macval(interaction)'"'=="" local interaction `"" # ""' + } + else if "`defaults'"=="fixed" { + if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor' + if "`modelwidth'"=="" local modelwidth 12 + if "`noabbrev'"=="" local abbrev abbrev + if `"`macval(delimiter)'"'=="" local delimiter `"" ""' + if `"`macval(interaction)'"'=="" local interaction `"" # ""' + } + else if "`defaults'"=="tex" { + if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor' + if "`modelwidth'"=="" local modelwidth 12 + if `"`macval(delimiter)'"'=="" local delimiter & + if `"`macval(end)'"'=="" { + local end \\\ + } + if `"`macval(interaction)'"'=="" local interaction `"" $\times$ ""' + } + else if "`defaults'"=="html" { + if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor' + if "`modelwidth'"=="" local modelwidth 12 + if `"`macval(begin)'"'=="" local begin + if `"`macval(delimiter)'"'=="" local delimiter + if `"`macval(end)'"'=="" local end + if `"`macval(interaction)'"'=="" local interaction `"" # ""' + } + else if "`defaults'"=="mmd" { + if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor' + if "`modelwidth'"=="" local modelwidth 12 + if `"`macval(begin)'"'=="" local begin "| " + if `"`macval(delimiter)'"'=="" local delimiter " | " + if `"`macval(end)'"'=="" local end " |" + if `"`macval(interaction)'"'=="" local interaction `"" # ""' + } + if "`nostatslabelsfirst'"=="" local statslabelsfirst first + if "`nostatslabelslast'"=="" local statslabelslast last + if "`novarlabelsfirst'"=="" local varlabelsfirst first + if "`novarlabelslast'"=="" local varlabelslast last + if "`noeqlabelsfirst'"=="" local eqlabelsfirst first + if "`noeqlabelslast'"=="" local eqlabelslast last + if "`nolz'"=="" local lz lz + if `"`macval(discrete)'"'=="" & "`nodiscrete'"=="" { + local discrete `"" (d)" for discrete change of dummy variable from 0 to 1"' + } + if `"`macval(indicatelabels)'"'=="" local indicatelabels "Yes No" + if `"`macval(refcatlabel)'"'=="" & "`norefcatlabel'"=="" local refcatlabel "ref." + if `"`macval(incelldelimiter)'"'=="" local incelldelimiter " " + if "`noomitted'"=="" local omitted omitted + if "`nobaselevels'"=="" local baselevels baselevels + } + else { + capture findfile estout_`defaults'.def + if _rc { + di as error `"`defaults' style not available "' /// + `"(file estout_`defaults'.def not found)"' + exit 601 + } + else { + tempname file + file open `file' using `"`r(fn)'"', read text + if c(SE) local max 244 + else local max 80 + while 1 { + ReadLine `max' `file' + if `"`line'"'=="" continue, break + gettoken opt line: line + else if index(`"`opt'"',"_") { + gettoken opt0 opt1: opt, parse("_") + if `"``opt0'_tname'"'!="" { + local opt `"``opt0'_tname'`opt1'"' + } + } + if `"`macval(`opt')'"'=="" & `"`no`opt''"'=="" { + if `"`opt'"'=="cells" { + local newline + gettoken row rest: line, match(par) qed(qed) + if `"`par'"'=="(" local qed 1 + while `"`row'"'!="" { + local newrow + gettoken el row: row, parse(" &") + while `"`el'"'!="" { + if `"`el'"'!="." & `"`el'"'!="&" { + local `el'_tname "el`++elnum'" + local ``el'_tname'_ "`el'" + local newrow "`newrow' ``el'_tname'" + } + else { + local newrow "`newrow' `el'" + } + gettoken el row: row, parse(" &") + } + local newrow: list retok newrow + if `qed' local newline `"`newline'"`newrow'" "' + else local newline `"`newline'`newrow' "' + gettoken row rest: rest, match(par) qed(qed) + if `"`par'"'=="(" local qed 1 + } + local line `"`newline'"' + } + local line: list retok line + local `opt' `"`macval(line)'"' + } + } + file close `file' + } + } + if "`notype'"=="" & `"`using'"'=="" local type type + if "`smcltags'"=="" & "`noasis'"=="" local asis asis + if "`asis'"!="" local asis "_asis" + if "`smclrules'"!="" & "`nosmclmidrules'"=="" local smclmidrules smclmidrules + if "`smclmidrules'"!="" & "`nosmcleqrules'"=="" local smcleqrules smcleqrules + local haslabcol2 = (`"`macval(labcol2)'"'!="") + +*title/notes option + if `"`macval(prehead)'`macval(posthead)'`macval(prefoot)'`macval(postfoot)'"'=="" { + if `"`macval(title)'"'!="" { + local prehead `"`"`macval(title)'"'"' + } + if `"`macval(note)'"'!="" { + local postfoot `"`"`macval(note)'"'"' + } + } + +*Generate/clean-up cell contents + if `"`:list clean cells'"'=="" { + local cells b + local b_tname "b" + local b_ "b" + } + else if `"`:list clean cells'"'=="none" { + local cells + } + CellsCheck `"`cells'"' + if `:list sizeof incelldelimiter'==1 gettoken incelldelimiter: incelldelimiter + +*Special treatment of confidence intervals + if "`level'"=="" local level $S_level + if `level'<10 | `level'>99 { + di as error "level(`level') invalid" + exit 198 + } + if "`ci_tname'"!="" { + if `"`macval(`ci_tname'_label)'"'=="" { + local `ci_tname'_label "ci`level'" + } + if `"`macval(`ci_tname'_par)'"'=="" { + local `ci_tname'_par `""" , """' + } + gettoken 1 2 : `ci_tname'_par + gettoken 2 3 : 2 + gettoken 3 : 3 + local `ci_tname'_l_par `""`macval(1)'" "`macval(2)'""' + local `ci_tname'_u_par `""" "`macval(3)'""' + } + if "`ci_l_tname'"!="" { + if `"`macval(`ci_l_tname'_label)'"'=="" { + local `ci_l_tname'_label "min`level'" + } + } + if "`ci_u_tname'"!="" { + if `"`macval(`ci_u_tname'_label)'"'=="" { + local `ci_u_tname'_label "max`level'" + } + } + +*Formats + local firstv: word 1 of `values' + if "`firstv'"=="" local firstv "b" + if "``firstv'_fmt'"=="" local `firstv'_fmt %9.0g + foreach v of local values { + if "``v'_fmt'"=="" local `v'_fmt "``firstv'_fmt'" + if `"`macval(`v'_label)'"'=="" { + local `v'_label "``v'_'" + } + } + +*Check margin option / prepare discrete option / prepare dropped option + if "`margin'"!="" { + if !inlist("`margin'","margin","u","c","p") { + di as error "margin(`margin') invalid" + exit 198 + } + if `"`macval(discrete)'"'!="" { + gettoken discrete discrete2: discrete + } + } + else local discrete + local droppedison = (`"`macval(dropped)'"'!="") + +*Formats/labels/stars for statistics + if "`statsfmt'"=="" local statsfmt: word 1 of ``firstv'_fmt' + ProcessStatslayout `"`stats'"' `"`statsfmt'"' `"`statsstar'"' /// + `"`statslayout'"' `"`statspchar'"' + local stats: list uniq stats + if "`statsstar'"!="" local p " p" + else local p + +*Significance stars + local tablehasstars 0 + foreach v of local values { + local el "``v'_'" + if "``v'_star'"!="" | inlist("`el'","_star","_sigsign") { + if "``v'_pvalue'"=="" local `v'_pvalue p + local tablehasstars 1 + } + } + +*Check/define starlevels/make levelslegend + if `tablehasstars' | `"`statsstar'"'!="" { + if `"`macval(starlevels)'"'=="" /// + local starlevels "* 0.05 ** 0.01 *** 0.001" + CheckStarvals `"`macval(starlevels)'"' `"`macval(starlevelslabel)'"' /// + `"`macval(starlevelsdelimiter)'"' + } + +*Get coefficients/variances/statistics: _estout_getres +* - prepare transform/eform + if `"`transform'"'=="" { // transform() overwrites eform() + if "`eform'"!="" { + local transform "exp(@) exp(@)" + if "`eform'"!="eform" { + local transformpattern "`eform'" + } + } + } + foreach m of local transformpattern { + if !( "`m'"=="1" | "`m'"=="0" ) { + di as error "invalid pattern in transform(,pattern()) or eform()" + exit 198 + } + } +* - handle pvalue() suboption + if `tablehasstars' { + local temp + foreach v of local values { + local temp: list temp | `v'_pvalue + } + foreach v of local temp { + if `"``v'_tname'"'=="" { + local `v'_tname "el`++elnum'" + local ``v'_tname'_ "`v'" + local values: list values | `v'_tname + } + } + } +* - prepare list of results to get from e()-matrices + if "`ci_tname'"!="" { + local values: subinstr local values "`ci_tname'" "`ci_tname'_l `ci_tname'_u", word + local `ci_tname'_l_ "ci_l" + local ci_l_tname "`ci_tname'_l" + local `ci_tname'_u_ ci_u + local ci_u_tname "`ci_tname'_u" + } + foreach v of local values { + local temp = ("``v'_transpose'"!="") + local values1mrow `"`values1mrow' `"``v'_' `temp' ``v'_mrow'"'"' + } + tempname D St + if `matrixmode'==0 { +* - expand model names + if `"`anything'"'=="" { + capt est_expand $eststo + if !_rc { + local anything `"$eststo"' + } + if `'"`anything'"'!="" { + if `"`: e(scalars)'`: e(macros)'`: e(matrices)'`: e(functions)'"'!="" { + local inlist: list posof `"`e(_estimates_name)'"' in anything + if `inlist'==0 { + di as txt "(tabulating estimates stored by eststo;" /// + `" specify "." to tabulate the active results)"' + } + } + } + } + if `"`anything'"'=="" local anything "." + capt est_expand `"`anything'"' + if _rc { + if _rc==301 { // add e(cmd)="." to current estimates if undefined + if `:list posof "." in anything' & `"`e(cmd)'"'=="" { + if `"`: e(scalars)'`: e(macros)'`: e(matrices)'`: e(functions)'"'!="" { + qui estadd local cmd "." + } + } + } + est_expand `"`anything'"' + } + local models `r(names)' + // could not happen, ... + if "`models'" == "" { + exit + } +* - get results + local temp names(`models') coefs(`values1mrow') stats(`stats'`p') /// + `rename' margin(`margin') meqs(`meqs') dropped(`droppedison') level(`level') /// + transform(`transform') transformpattern(`transformpattern') /// + `omitted' `baselevels' + _estout_getres, `equations' `temp' + local ccols = r(ccols) + if `"`equations'"'=="" & "`unstack'"=="" & `ccols'>0 { // specify equations("") to deactivate + TableIsAMess + if `value' { + _estout_getres, equations(main=1) `temp' + } + } + mat `St' = r(stats) + local nmodels = r(nmodels) + local ccols = r(ccols) + if `ccols'>0 { + mat `B' = r(coefs) + } + } + else { // matrix mode + // define `St' so that code does not break + if `"`stats'"'!="" { + mat `St' = J(`:list sizeof stats',1,.z) + mat coln `St' = `models' + mat rown `St' = `stats' + } + } + return add +* - process order() option + if `"`order'"' != "" { + ExpandEqVarlist `"`order'"' `B' append + local order `"`value'"' + Order `B' `"`order'"' + } +* - process indicate() option + local nindicate 0 + foreach indi of local indicate { + local ++nindicate + ProcessIndicateGrp `nindicate' `B' `nmodels' `ccols' "`unstack'" /// + `"`macval(indicatelabels)'"' `"`macval(indi)'"' + } +* - process keep() option + if `"`keep'"' != "" { + ExpandEqVarlist `"`keep'"' `B' + DropOrKeep 1 `B' `"`value'"' + } +* - process drop() option + if `"`drop'"' != "" { + ExpandEqVarlist `"`drop'"' `B' + DropOrKeep 0 `B' `"`value'"' + } + +* - names and equations of final set + capt confirm matrix `B' + if _rc { + return local coefs "" // erase r(coefs) + return local ccols "" + local R 0 + local varlist "" + local eqlist "" + local eqs "__" + local fullvarlist "" + } + else { + tempname C + matrix `C' = `B' + RestoreEmptyEqnames `C' // replace equation name "__" by "_" + return matrix coefs = `C' // replace r(coefs) + local R = rowsof(`B') + local C = colsof(`B') + local eqlist: roweq `B', q + local eqlist: list clean eqlist + UniqEqsAndDims `"`eqlist'"' + if "`unstack'"!="" { + // unstack requires equations to be tied together + // RerrangeEqs resets B, eqlist, eqs, eqsdims + RerrangeEqs `B' `"`eqlist'"' `"`eqs'"' + } + QuotedRowNames `B' + local varlist `"`value'"' + MakeQuotedFullnames `"`varlist'"' `"`eqlist'"' + local fullvarlist `"`value'"' +* - dropped coefs + local droppedpos = `ccols' + if "`margin'"!="" { + local droppedpos `droppedpos' - 1 + } +* - 0/1-variable indicators (for marginals) + mat `D' = `B'[1...,1], J(`R',1,0) // so that row names are copied from `B' + mat `D' = `D'[1...,2] + if "`margin'"!="" { + forv i = 1/`R' { // last colum for each model contains _dummy info + forv j = `ccols'(`ccols')`C' { + if `B'[`i',`j']==1 { + mat `D'[`i',1] = 1 + } + } + } + } + } + +*Prepare element specific keep/drop + local dash + tempname tmpmat + foreach v in star `values' { + local temp `"`fullvarlist'"' + if "`unstack'"!="" { + local temp2: list uniq eqs + local `v'`dash'eqdrop: list uniq eqs + } + if `"``v'`dash'keep'"'!="" { + capt mat `tmpmat' = `B' + ExpandEqVarlist `"``v'`dash'keep'"' `tmpmat' + DropOrKeep 1 `tmpmat' `"`value'"' + capt confirm matrix `tmpmat' + if _rc local temp + else { + QuotedRowNames `tmpmat' + MakeQuotedFullnames `"`value'"' `"`: roweq `tmpmat', q'"' + local temp: list temp & value + if "`unstack'"!="" { + local value: roweq `tmpmat', q + local value: list uniq value + local temp2: list temp2 & value + } + } + } + if `"``v'`dash'drop'"'!="" { + capt mat `tmpmat' = `B' + ExpandEqVarlist `"``v'`dash'drop'"' `tmpmat' + DropOrKeep 0 `tmpmat' `"`value'"' + capt confirm matrix `tmpmat' + if _rc local temp + else { + QuotedRowNames `tmpmat' + MakeQuotedFullnames `"`value'"' `"`: roweq `tmpmat', q'"' + local temp: list temp & value + if "`unstack'"!="" { + local value: roweq `tmpmat', q + local value: list uniq value + local temp2: list temp2 & value + } + } + } + local `v'`dash'drop: list fullvarlist - temp + if "`unstack'"!="" { + local `v'`dash'eqdrop: list `v'`dash'eqdrop - temp2 + } + local dash "_" + } + capt mat drop `tmpmat' + +*Prepare unstack + if "`unstack'"!="" & `R'>0 { + local varlist: list uniq varlist + GetVarnamesFromOrder `"`order'"' + local temp: list value & varlist + local varlist: list temp | varlist + local cons _cons + if `:list cons in value'==0 { + if `:list cons in varlist' { + local varlist: list varlist - cons + local varlist: list varlist | cons + } + } + local R: word count `varlist' + local eqswide: list uniq eqs + forv i=1/`nindicate' { + ReorderEqsInIndicate `"`nmodels'"' `"`eqswide'"' /// + `"`indicate`i'eqs'"' `"`macval(indicate`i'lbls)'"' + local indicate`i'lbls `"`macval(value)'"' + } + } + else local eqswide "__" + +*Prepare coefs for tabulation + if `R'>0 { + local i 0 + foreach v of local values { + local ++i + tempname _`v' + forv j = 1/`nmodels' { + mat `_`v'' = nullmat(`_`v''), `B'[1..., (`j'-1)*`ccols'+`i'] + } + mat coln `_`v'' = `models' + mat coleq `_`v'' = `models' + if inlist("``v'_'", "t", "z") { + if `"``v'_abs'"'!="" { // absolute t-values + forv r = 1/`R' { + forv j = 1/`nmodels' { + if `_`v''[`r',`j']>=. continue + mat `_`v''[`r',`j'] = abs(`_`v''[`r',`j']) + } + } + } + } + } + } + +*Model labels + if "`nomlabelstitles'"=="" & "`label'"!="" local mlabelstitles titles + local tmp: list sizeof mlabels + local i 0 + foreach model of local models { + local ++i + if `i'<=`tmp' continue + local lab + if "`mlabelsdepvars'"!="" { + local var `"`return(m`i'_depname)'"' + if "`label'"!="" { + local temp = index(`"`var'"',".") + local temp2 = substr(`"`var'"',`temp'+1,.) + capture local lab: var l `temp2' + if _rc | `"`lab'"'=="" { + local lab `"`temp2'"' + } + local temp2 = substr(`"`var'"',1,`temp') + local lab `"`temp2'`macval(lab)'"' + } + else local lab `"`var'"' + } + else if "`mlabelstitles'"!="" { + local lab `"`return(m`i'_estimates_title)'"' + if `"`lab'"'=="" local lab "`model'" + } + else { + local lab "`model'" + } + local mlabels `"`macval(mlabels)' `"`macval(lab)'"'"' + } + if "`mlabelsnumbers'"!="" { + NumberMlabels `nmodels' `"`macval(mlabels)'"' + } + +*Equations labels + local eqconssubok = (`"`macval(eqlabels)'"'!=`""""') + local numeqs: list sizeof eqs + local temp: list sizeof eqlabels + if `temp'<`numeqs' { + forv i = `=`temp'+1'/`numeqs' { + local eq: word `i' of `eqs' + local value + if "`label'"!="" { + capture confirm variable `eq' + if !_rc { + local value: var l `eq' + } + } + if `"`value'"'=="" { + if `"`eq'"'=="__" local value "_" + else local value "`eq'" + } + local eqlabels `"`macval(eqlabels)' `"`value'"'"' + } + } + if `eqconssubok' { + if "`eqlabelsnone'"!="" & `numeqs'>1 & "`unstack'"=="" { + EqReplaceCons `"`varlist'"' `"`eqlist'"' `"`eqlabels'"' `"`macval(varlabels)'"' + if `"`macval(value)'"'!="" { + local varlabels `"`macval(value)' `macval(varlabels)'"' + } + } + } + +*Column labels + if `"`macval(collabels)'"'=="" { + forv j = 1/`ncols' { + local temp + forv i = 1/`nrows' { + local v: word `i' of `cells' + local v: word `j' of `v' + local v: subinstr local v "&" " ", all + local v: subinstr local v "." "", all + local v: list retok v + foreach vi of local v { + if `"`macval(temp)'"'!="" { + local temp `"`macval(temp)'/"' + } + local temp `"`macval(temp)'`macval(`vi'_label)'"' + } + } + local collabels `"`macval(collabels)'`"`macval(temp)'"' "' + } + } + +*Prepare refcat() + if `"`macval(refcat)'"'!="" { + PrepareRefcat `"`macval(refcat)'"' + } + +*Determine table layout + local m 1 + local starcol 0 + foreach model of local models { + local e 0 + foreach eq of local eqswide { + local stc 0 + local ++e + if "`unstack'"!="" & `R'>0 { + ModelEqCheck `B' `"`eq'"' `m' `ccols' + if !`value' continue + } + local eqsrow "`eqsrow'`e' " + local modelsrow "`modelsrow'`m' " + local k 0 + local something 0 + forv j = 1/`ncols' { + local col + local nocol 1 + local colhasstats 0 + forv i = 1/`nrows' { + local row: word `i' of `cells' + local v: word `j' of `row' + local v: subinstr local v "&" " ", all + foreach vi in `v' { + if "`vi'"=="." continue + local colhasstats 1 + if "`unstack'"!="" { + local inlist: list posof `"`eq'"' in `vi'_eqdrop + if `inlist' continue + } + if "`:word `m' of ``vi'_pattern''"=="0" { + local v: subinstr local v "`vi'" ".`vi'", word + } + else { + local nocol 0 + if `"``vi'_star'"'!="" local starcol 1 + } + } + local v: subinstr local v " " "&", all + if "`v'"=="" local v "." + local col "`col'`v' " + } + if `colhasstats'==0 local nocol 0 + if !`nocol' { + local colsrow "`colsrow'`j' " + if `++k'>1 { + local modelsrow "`modelsrow'`m' " + local eqsrow "`eqsrow'`e' " + } + if `"`: word `++stc' of `statscolstar''"'=="1" local starcol 1 + local starsrow "`starsrow'`starcol' " + local starcol 0 + Add2Vblock `"`vblock'"' "`col'" + local something 1 + } + } + if !`something' { + local col + forv i = 1/`nrows' { + local col "`col'. " + } + Add2Vblock `"`vblock'"' "`col'" + local colsrow "`colsrow'1 " + if `"`: word `++stc' of `statscolstar''"'=="1" local starcol 1 + local starsrow "`starsrow'`starcol' " + local starcol 0 + } + } + local ++m + } + CountNofEqs "`modelsrow'" "`eqsrow'" + local neqs `value' + if `"`extracols'"'!="" { + foreach row in model eq col star { + InsertAtCols `"`extracols'"' `"``row'srow'"' + local `row'srow `"`value'"' + } + foreach row of local vblock { + InsertAtCols `"`extracols'"' `"`row'"' + local nvblock `"`nvblock' `"`value'"'"' + } + local vblock: list clean nvblock + } + local ncols = `: word count `starsrow'' + 1 + `haslabcol2' + +*Modelwidth/varwidth/starwidth + if "`modelwidth'"=="" local modelwidth 0 + if "`varwidth'"=="" local varwidth 0 + local nmodelwidth: list sizeof modelwidth + local modelwidthzero: list uniq modelwidth + local modelwidthzero = ("`modelwidth'"=="0") + if "`labcol2width'"=="" local labcol2width `: word 1 of `modelwidth'' + local starwidth 0 + if `modelwidthzero'==0 { + if `tablehasstars' | `"`statsstar'"'!="" { + Starwidth `"`macval(starlevels)'"' + local starwidth `value' + } + } + if `varwidth'<2 local wrap + +* totcharwidth / hline + local totcharwidth `varwidth' + if c(stata_version)>=14 local length udstrlen + else local length length + capture { + local delwidth = `length'(`macval(delimiter)') + } + if _rc { + local delwidth = `length'(`"`macval(delimiter)'"') + } + if `haslabcol2' { + local totcharwidth = `totcharwidth' + `delwidth' + `labcol2width' + } + local j 0 + foreach i of local starsrow { + local modelwidthj: word `=1 + mod(`j++',`nmodelwidth')' of `modelwidth' + local totcharwidth = `totcharwidth' + `delwidth' + `modelwidthj' + if `i' { + if "`stardetach'"!="" { + local ++ncols + local totcharwidth = `totcharwidth' + `delwidth' + } + local totcharwidth = `totcharwidth' + `starwidth' + } + } + IsInString "@hline" `"`0'"' // sets local strcount + if `strcount' { + local hline `totcharwidth' + if `hline'>400 local hline 400 // _dup(400) is limit + if `"`macval(hlinechar)'"'=="" local hlinechar "-" + local hline: di _dup(`hline') `"`macval(hlinechar)'"' + } + else local hline + +* check begin, delimiter, end + tempfile tfile + tempname file + file open `file' using `"`tfile'"', write text + foreach opt in begin delimiter end { + capture file write `file' `macval(`opt')' + if _rc { + local `opt' `"`"`macval(`opt')'"'"' + } + } + file close `file' + +* RTF support: set macros rtfrowdef, rtfrowdefbrdrt, rtfrowdefbrdrb, rtfemptyrow + local hasrtfbrdr 0 + local rtfbrdron 0 + IsInString "@rtfrowdef" `"`begin'"' // sets local strcount + local hasrtf = `strcount' + if `hasrtf' { + MakeRtfRowdefs `"`macval(begin)'"' `"`starsrow'"' "`stardetach'" /// + `varwidth' "`modelwidth'" `haslabcol2' `labcol2width' + local varwidth 0 + local wrap + local modelwidth 0 + local nmodelwidth 1 + local modelwidthzero 1 + local starwidth 0 + local labcol2width 0 + IsInString "@rtfrowdefbrdr" `"`begin'"' // sets local strcount + if `strcount' { + local hasrtfbrdr 1 + local rtfbeginbak `"`macval(begin)'"' + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdefbrdrt'"' + local rtfbrdron 1 + } + else { + StableSubinstr begin `"`macval(begin)'"' "@rtfrowdef" `"`rtfrowdef'"' + } + } + +* set widths + if `starwidth'>0 local fmt_stw "%-`starwidth's" + if `varwidth'>0 local fmt_v "%-`varwidth's" + if `labcol2width'>0 local fmt_l2 "%~`labcol2width's" + if "`mgroupsspan'`mlabelsspan'`eqlabelsspan'`collabelsspan'"!="" { + if `modelwidthzero'==0 { + file open `file' using `"`tfile'"', write text replace + file write `file' `macval(delimiter)' + file close `file' + file open `file' using `"`tfile'"', read text + file read `file' delwidth + file close `file' + local delwidth = `length'(`"`macval(delwidth)'"') + } + else local delwidth 0 + } + local stardetachon = ("`stardetach'"!="") + if `stardetachon' { + local stardetach `"`macval(delimiter)'"' + } + +*Prepare @-Variables + local atvars2 `""`nmodels'" "`neqs'" "`totcharwidth'" `"`macval(hline)'"' `hasrtf' `"`rtfrowdefbrdrt'"' `"`rtfrowdefbrdrb'"' `"`rtfrowdef'"' `"`rtfemptyrow'"'"' + local atvars3 `"`"`macval(title)'"' `"`macval(note)'"' `"`macval(discrete)'`macval(discrete2)'"' `"`macval(starlegend)'"'"' + +*Open output file + file open `file' using `"`tfile'"', write text replace + +*Write prehead + if `"`macval(prehead)'"'!="" { + if index(`"`macval(prehead)'"',`"""')==0 { + local prehead `"`"`macval(prehead)'"'"' + } + } + foreach line of local prehead { + if "`smcltags'"!="" file write `file' "{txt}" + InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)' + file write `file' `"`macval(value)'"' _n + } + local hasheader 0 + if "`smcltags'"!="" local thesmclrule "{txt}{hline `totcharwidth'}" + else local thesmclrule "{hline `totcharwidth'}" + if "`smclrules'"!="" { + file write `file' `"`thesmclrule'"' _n + } + +*Labcol2 - title + if `haslabcol2' { + IsInString `"""' `"`macval(labcol2title)'"' // sets local strcount + if `strcount'==0 { + local labcol2chunk `"`macval(labcol2title)'"' + local labcol2rest "" + } + else { + gettoken labcol2chunk labcol2rest : labcol2title + } + } + +*Write head: Models groups + if "`mgroupsnone'"=="" & `"`macval(mgroups)'"'!="" { + local hasheader 1 + if "`smcltags'"!="" file write `file' "{txt}" + InsertAtVariables `"`macval(mgroupsbegin)'"' 2 "`ncols'" `macval(atvars2)' + local mgroupsbegin `"`macval(value)'"' + InsertAtVariables `"`macval(mgroupsend)'"' 2 "`ncols'" `macval(atvars2)' + local mgroupsend `"`macval(value)'"' + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`mgroupsreplace'"!="" { + if `"`macval(mgroupsbegin)'"'!="" local tmpbegin + if `"`macval(mgroupsend)'"'!="" local tmpend + } + MgroupsPattern "`modelsrow'" "`mgroupspattern'" + Abbrev `varwidth' `"`macval(mgroupslhs)'"' "`abbrev'" + local value: di `fmt_v' `"`macval(value)'"' + WriteBegin `"`file'"' `"`macval(mgroupsbegin)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + WriteCaption `"`file'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`mgroupspattern'" "`mgroupspattern'" /// + `"`macval(mgroups)'"' "`starsrow'" "`mgroupsspan'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" /// + `"`macval(mgroupserepeat)'"' `"`macval(mgroupsprefix)'"' /// + `"`macval(mgroupssuffix)'"' "`haslabcol2'" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(mgroupsend)'"' /// + `"`"`macval(value)'"'"' + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + gettoken labcol2chunk labcol2rest : labcol2rest + } + +*Write head: Models numbers + if `"`macval(numbers)'"'!="" { + local hasheader 1 + if "`smcltags'"!="" file write `file' "{txt}" + if `"`macval(numbers)'"'=="numbers" local numbers "( )" + file write `file' `macval(begin)' `fmt_v' (`""') + if `haslabcol2' { + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + tokenize `"`macval(numbers)'"' + numlist `"1/`nmodels'"' + WriteCaption `"`file'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`modelsrow'" "`modelsrow'" /// + "`r(numlist)'" "`starsrow'" "`mlabelsspan'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" /// + `""' `"`macval(1)'"' `"`macval(2)'"' "`haslabcol2'" + file write `file' `macval(end)' _n + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + gettoken labcol2chunk labcol2rest : labcol2rest + } + +*Write head: Models captions + if "`nomlabelsnone'"=="" & "`models'"=="." & `"`macval(mlabels)'"'=="." local mlabelsnone "none" + if "`mlabelsnone'"=="" { + local hasheader 1 + if "`smcltags'"!="" file write `file' "{txt}" + InsertAtVariables `"`macval(mlabelsbegin)'"' 2 "`ncols'" `macval(atvars2)' + local mlabelsbegin `"`macval(value)'"' + InsertAtVariables `"`macval(mlabelsend)'"' 2 "`ncols'" `macval(atvars2)'' + local mlabelsend `"`macval(value)'"' + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`mlabelsreplace'"!="" { + if `"`macval(mlabelsbegin)'"'!="" local tmpbegin + if `"`macval(mlabelsend)'"'!="" local tmpend + } + Abbrev `varwidth' `"`macval(mlabelslhs)'"' "`abbrev'" + local value: di `fmt_v' `"`macval(value)'"' + WriteBegin `"`file'"' `"`macval(mlabelsbegin)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + WriteCaption `"`file'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`modelsrow'" "`modelsrow'" /// + `"`macval(mlabels)'"' "`starsrow'" "`mlabelsspan'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" /// + `"`macval(mlabelserepeat)'"' `"`macval(mlabelsprefix)'"' /// + `"`macval(mlabelssuffix)'"' "`haslabcol2'" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(mlabelsend)'"' /// + `"`"`macval(value)'"'"' + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + gettoken labcol2chunk labcol2rest : labcol2rest + } + +*Write head: Equations captions + if "`eqlabelsnone'"=="" { + InsertAtVariables `"`macval(eqlabelsbegin)'"' 2 "`ncols'" `macval(atvars2)' + local eqlabelsbegin `"`macval(value)'"' + InsertAtVariables `"`macval(eqlabelsend)'"' 2 "`ncols'" `macval(atvars2)' + local eqlabelsend `"`macval(value)'"' + } + if `"`eqswide'"'!="__" & "`eqlabelsnone'"=="" { + local hasheader 1 + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`eqlabelsreplace'"!="" { + if `"`macval(eqlabelsbegin)'"'!="" local tmpbegin + if `"`macval(eqlabelsend)'"'!="" local tmpend + } + if "`smcltags'"!="" file write `file' "{txt}" + Abbrev `varwidth' `"`macval(eqlabelslhs)'"' "`abbrev'" + local value: di `fmt_v' `"`macval(value)'"' + WriteBegin `"`file'"' `"`macval(eqlabelsbegin)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + WriteCaption `"`file'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`eqsrow'" "`modelsrow'" /// + `"`macval(eqlabels)'"' "`starsrow'" "`eqlabelsspan'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" /// + `"`macval(eqlabelserepeat)'"' `"`macval(eqlabelsprefix)'"' /// + `"`macval(eqlabelssuffix)'"' "`haslabcol2'" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(eqlabelsend)'"' /// + `"`"`macval(value)'"'"' + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + gettoken labcol2chunk labcol2rest : labcol2rest + } + +*Write head: Columns captions + if `"`macval(collabels)'"'!="" & "`collabelsnone'"=="" { + local hasheader 1 + if "`smcltags'"!="" file write `file' "{txt}" + InsertAtVariables `"`macval(collabelsbegin)'"' 2 "`ncols'" `macval(atvars2)' + local collabelsbegin `"`macval(value)'"' + InsertAtVariables `"`macval(collabelsend)'"' 2 "`ncols'" `macval(atvars2)' + local collabelsend `"`macval(value)'"' + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`collabelsreplace'"!="" { + if `"`macval(collabelsbegin)'"'!="" local tmpbegin + if `"`macval(collabelsend)'"'!="" local tmpend + } + Abbrev `varwidth' `"`macval(collabelslhs)'"' "`abbrev'" + local value: di `fmt_v' `"`macval(value)'"' + WriteBegin `"`file'"' `"`macval(collabelsbegin)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + WriteCaption `"`file'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`colsrow'" "" `"`macval(collabels)'"' /// + "`starsrow'" "`collabelsspan'" "`abbrev'" "`modelwidth'" /// + "`delwidth'" "`starwidth'" `"`macval(collabelserepeat)'"' /// + `"`macval(collabelsprefix)'"' `"`macval(collabelssuffix)'"' "`haslabcol2'" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(collabelsend)'"' /// + `"`"`macval(value)'"'"' + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + gettoken labcol2chunk labcol2rest : labcol2rest + } + +*Write posthead + if `hasheader' & "`smclmidrules'"!="" { + file write `file' `"`thesmclrule'"' _n + } + if `"`macval(posthead)'"'!="" { + if index(`"`macval(posthead)'"',`"""')==0 { + local posthead `"`"`macval(posthead)'"'"' + } + } + foreach line of local posthead { + if "`smcltags'"!="" file write `file' "{txt}" + InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)' + file write `file' `"`macval(value)'"' _n + } + +* Create mmd alignment/divider line + if `"`defaults'"'=="mmd" { + MakeMMDdef "`varwidth'" "`haslabcol2'" "`labcol2width'" /// + "`modelwidth'" "`starsrow'" "`stardetachon'" "`starwidth'" + file write `file' `"`macval(value)'"' _n + } + +*Write body of table +*Loop over table rows + InsertAtVariables `"`macval(varlabelsbegin)'"' 2 "`ncols'" `macval(atvars2)' + local varlabelsbegin `"`macval(value)'"' + InsertAtVariables `"`macval(varlabelsend)'"' 2 "`ncols'" `macval(atvars2)' + local varlabelsend `"`macval(value)'"' + tempname first + if `"`vblock'"'!="" { + local RI = `R' + `nindicate' + local e 0 + local eqdim = `R' + `nindicate' + local weqcnt 0 + local theeqlabel + if `hasrtfbrdr' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdefbrdrt'"' + local rtfbrdron 1 + } + local varlabelsbegin0 `"`macval(varlabelsbegin)'"' + local eqlabelsbegin0 `"`macval(eqlabelsbegin)'"' + if "`eqlabelsfirst'"=="" local eqlabelsbegin0 + forv r = 1/`R' { + local varlabelsend0 `"`macval(varlabelsend)'"' + local var: word `r' of `varlist' + +*Write equation name/label + if "`unstack'"=="" { + local eqvar: word `r' of `fullvarlist' + if `"`eqs'"'!="__" { + local eqrlast `"`eqr'"' + local eqr: word `r' of `eqlist' + if `"`eqr'"'!=`"`eqrlast'"' & "`eqlabelsnone'"=="" { + local value: word `++e' of `macval(eqlabels)' + local eqdim: word `e' of `macval(eqsdims)' + local weqcnt 0 + if `e'==`numeqs' { + if "`eqlabelslast'"=="" local eqlabelsend + local eqdim = `eqdim' + `nindicate' + } + if "`eqlabelsmerge'"!="" { + local theeqlabel `"`macval(eqlabelsprefix)'`macval(value)'`macval(eqlabelssuffix)'"' + } + else { + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`eqlabelsreplace'"!="" { + if `"`macval(eqlabelsbegin0)'"'!="" local tmpbegin + if `"`macval(eqlabelsend)'"'!="" local tmpend + } + if `e'>1 & "`smcleqrules'"!="" { + file write `file' `"`thesmclrule'"' _n + } + WriteBegin `"`file'"' `"`macval(eqlabelsbegin0)'"' `"`macval(tmpbegin)'"' + if "`smcltags'"!="" file write `file' "{res}" + WriteEqrow `"`file'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' `"`macval(value)'"' "`starsrow'" /// + "`eqlabelsspan'" "`varwidth'" "`fmt_v'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" /// + `"`macval(eqlabelsprefix)'"' `"`macval(eqlabelssuffix)'"' /// + "`haslabcol2'" "`labcol2width'" "`fmt_l2'" + if "`smcltags'"!="" file write `file' "{txt}" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(eqlabelsend)'"' + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + local eqlabelsbegin0 `"`macval(eqlabelsbegin)'"' + } + } + } + } + local ++weqcnt + if `weqcnt'==1 { + if "`varlabelsfirst'"=="" local varlabelsbegin0 + } + +*Determine rows to be written + local rvblock + foreach row of local vblock { + local c 0 + local skiprow 1 + local rowhasstats 0 + foreach v of local row { + local ++c + if "`unstack'"!="" { + local eqr: word `:word `c' of `eqsrow'' of `eqs' + if `"`eqr'"'!="" local eqvar `"`eqr':`var'"' + else local eqvar "`var'" + } + local v: subinstr local v "&" " ", all + foreach vi of local v { + if "`vi'"=="." continue + if rownumb(`B',`"`eqvar'"')<. { + local rowhasstats 1 + if index("`vi'",".")==1 continue + local inlist: list posof `"`eqvar'"' in `vi'_drop + if `inlist' continue + local skiprow 0 + continue, break + } + } + if `skiprow'==0 continue, break + } + if `rowhasstats'==0 local skiprow 0 + if `"`ferest()'"'=="" & `"`rvblock'"'=="" local skiprow 0 + if `skiprow' continue + local rvblock `"`rvblock'"`row'" "' + } + local nrvblock: list sizeof rvblock + +*Insert refcat() (unless refcatbelow) + if `"`macval(refcat)'"'!="" { + local isref: list posof `"`var'"' in refcatcoefs + if `isref' { + if "`unstack'"=="" { + local temp `"`eqr'"' + if `"`temp'"'=="" local temp "__" + } + else local temp `"`eqswide'"' + GenerateRefcatRow `B' `ccols' "`var'" `"`temp'"' `"`macval(refcatlabel)'"' + local refcatrow `"`macval(value)'"' + } + } + else local isref 0 + if `isref' & `"`refcatbelow'"'=="" { + if "`smcltags'"!="" file write `file' "{txt}" + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`varlabelsreplace'"!="" { + if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin + if `"`macval(varlabelsend0)'"'!="" local tmpend + } + if "`varlabelsnone'"=="" { + local value: word `isref' of `macval(refcatnames)' + Abbrev `varwidth' `"`macval(value)'"' "`abbrev'" + } + else local value + local value: di `fmt_v' `"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"' + WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + gettoken labcol2chunk labcol2 : labcol2 + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + if "`smcltags'"!="" file write `file' "{res}" + WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' /// + `"`macval(refcatrow)'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`starsrow'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" + if "`smcltags'"!="" file write `file' "{txt}" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend0)'"' + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + local varlabelsbegin0 `"`macval(varlabelsbegin)'"' + } + +*Write variable name/label + if "`smcltags'"!="" file write `file' "{txt}" + local tmpbegin `"`macval(begin)'"' + if "`varlabelsnone'"=="" { + VarInList `"`var'"' "`unstack'" `"`eqvar'"' /// + `"`eqr'"' `"`macval(varlabelsblist)'"' + if `"`macval(value)'"'!="" { + IsInString `"""' `"`value'"' // sets local strcount + if `strcount'==0 { + local value `"`"`macval(value)'"'"' + } + InsertAtVariables `"`macval(value)'"' 2 "`ncols'" `macval(atvars2)' + WriteStrLines `"`file'"' `"`macval(value)'"' + if "`varlabelsreplace'"!="" { + local tmpbegin + local varlabelsbegin0 + } + } + if "`label'"!="" { + CompileVarl, vname(`var') interaction(`macval(interaction)') + } + else local varl `var' + VarInList `"`var'"' "`unstack'" `"`eqvar'"' /// + `"`eqr'"' `"`macval(varlabels)'"' + if `"`macval(value)'"'!="" { + local varl `"`macval(value)'"' + } + if `"`macval(discrete)'"'!="" { + local temp 0 + if "`unstack'"=="" { + if `D'[`r',1]==1 local temp 1 + } + else { + foreach eqr of local eqswide { + if `D'[rownumb(`D',`"`eqr':`var'"'),1]==1 local temp 1 + } + } + if `temp'==1 & `temp'<. { + local varl `"`macval(varl)'`macval(discrete)'"' + } + } + } + else local varl + if `hasrtfbrdr' & `r'==`RI' & !(`isref' & `"`refcatbelow'"'!="") { + if `nrvblock'==1 { + if `rtfbrdron' { + // special case: still in first physical row of table + // body; this means that the table body only has a single + // physical row => need line at top and bottom + StableSubinstr tmpbegin `"`macval(tmpbegin)'"' /* + */ "\clbrdrt\brdrw10\brdrs" /* + */ "\clbrdrt\brdrw10\brdrs\clbrdrb\brdrw10\brdrs" all + } + else { + StableSubinstr tmpbegin `"`macval(rtfbeginbak)'"' /* + */ "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"' + } + local rtfbrdron 1 + } + } + if "`varlabelsreplace'"!="" { + if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin + } + if "`wrap'"!="" & `nrvblock'>1 { + local wrap_i 1 + local value: piece `wrap_i' `varwidth' of `"`macval(theeqlabel)'`macval(varl)'"', nobreak + Abbrev `varwidth' `"`macval(value)'"' "`abbrev'" + } + else { + Abbrev `varwidth' `"`macval(theeqlabel)'`macval(varl)'"' "`abbrev'" + } + local value: di `fmt_v' `"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"' + WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + gettoken labcol2chunk labcol2 : labcol2 + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + local varlabelsbegin0 `"`macval(varlabelsbegin)'"' + +*Write table cells + if "`smcltags'"!="" file write `file' "{res}" + local newrow 0 + mat `first'=J(1,`nmodels',1) + foreach row of local rvblock { + if `hasrtfbrdr' & `r'==`RI' & !(`isref' & `"`refcatbelow'"'!="") { + if `"`ferest()'"'=="" { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"' + local rtfbrdron 1 + } + } + local c 0 + foreach v of local row { + local m: word `++c' of `modelsrow' + local unstackskipcoef 0 + if "`unstack'"!="" { + capt local eqr: word `:word `c' of `eqsrow'' of `eqs' + local rr = rownumb(`B', `"`eqr':`var'"') + if `"`eqr'"'!="" local eqvar `"`eqr':`var'"' + else local eqvar "`var'" + if `rr'>=. local unstackskipcoef 1 // local v "." + } + else local rr `r' + if `newrow' & `c'==1 { + if "`smcltags'"!="" file write `file' "{txt}" + if "`wrap'"!="" & `nrvblock'>1 { + local value + local space + while (1) { + local temp: piece `++wrap_i' `varwidth' of `"`macval(varl)'"', nobreak + if `"`macval(temp)'"'=="" continue, break + local value `"`macval(value)'`space'`macval(temp)'"' + if `wrap_i'<`nrvblock' continue, break + local space " " + } + Abbrev `varwidth' `"`macval(value)'"' "`abbrev'" + local value: di `fmt_v' `"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"' + local value `"`"`macval(value)'"'"' + } + else local value "_skip(`varwidth')" + file write `file' `macval(end)' _n `macval(begin)' `value' + if `haslabcol2' { + file write `file' `macval(delimiter)' `fmt_l2' ("") + } + if "`smcltags'"!="" file write `file' "{res}" + } + local v: subinstr local v "&" " ", all + local modelwidthj: word `=1+mod(`c'-1,`nmodelwidth')' of `modelwidth' + if `modelwidthj'>0 local fmt_m "%`modelwidthj's" + else local fmt_m + local thevalue + foreach vi of local v { + if index("`vi'",".")!=1 { + local inlist: list posof `"`eqvar'"' in `vi'_drop + if `inlist' local vi "..`vi'" + else { + local vipar: subinstr local `vi'_par "@modelwidth" "`modelwidthj'", all + } + } + if index("`vi'",".")==1 { + local value + } + else if `unstackskipcoef' { + local value `"``vi'_vacant'"' + } + else if `B'[`rr',`m'*`droppedpos']==1 & `droppedison' { + if `first'[1,`m'] { + local value `"`macval(dropped)'"' + mat `first'[1,`m']=0 + } + else local value + } + else if "``vi'_'"=="ci" { + if `_`vi'_l'[`rr',`m']>=.y local value `"``vi'_vacant'"' + else { + local format: word `r' of ``vi'_fmt' + if "`format'"=="" { + local format: word `:word count ``vi'_fmt'' of ``vi'_fmt' + } + local value = `_`vi'_l'[`rr',`m'] + local vipar: subinstr local `vi'_l_par "@modelwidth" "`modelwidthj'", all + vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' /// + `"`macval(msign)'"' `"`macval(vipar)'"' + local temp "`macval(value)'" + local value = `_`vi'_u'[`rr',`m'] + local vipar: subinstr local `vi'_u_par "@modelwidth" "`modelwidthj'", all + vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' /// + `"`macval(msign)'"' `"`macval(vipar)'"' + local value `"`macval(temp)'`macval(value)'"' + } + } + else if `_`vi''[`rr',`m']>=.y local value `"``vi'_vacant'"' + //else if `_`vi''[`rr',`m']>=. local value . + else if "``vi'_'"=="_star" { + CellStars `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m'] `"`macval(vipar)'"' + } + else if "``vi'_'"=="_sign" { + MakeSign `_`vi''[`rr',`m'] `"`macval(msign)'"' `"`macval(vipar)'"' + } + else if "``vi'_'"=="_sigsign" { + MakeSign `_`vi''[`rr',`m'] `"`macval(msign)'"' `"`macval(vipar)'"' /// + `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m'] + } + else { + local format: word `r' of ``vi'_fmt' + if "`format'"=="" { + local format: word `:word count ``vi'_fmt'' of ``vi'_fmt' + } + local value = `_`vi''[`rr',`m'] + vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' /// + `"`macval(msign)'"' `"`macval(vipar)'"' + } + local thevalue `"`macval(thevalue)'`macval(value)'"' + if !`stardetachon' & `:word `c' of `starsrow''==1 { + if `modelwidthj'>0 | `starwidth'>0 local fmt_m "%`=`modelwidthj'+`starwidth''s" + local value + if index("`vi'",".")!=1 & `"``vi'_star'"'!="" { + local inlist: list posof `"`eqvar'"' in stardrop + if !`inlist' { + Stars `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m'] + } + } + if "`ferest()'"=="" { + local value: di `fmt_stw' `"`macval(value)'"' + } + local thevalue `"`macval(thevalue)'`macval(value)'"' + } + if "`ferest()'"!="" & index("`vi'","..")!=1 { + local thevalue `"`macval(thevalue)'`macval(incelldelimiter)'"' + } + } + if `:length local thevalue'<245 { + local thevalue: di `fmt_m' `"`macval(thevalue)'"' + } + file write `file' `macval(delimiter)' `"`macval(thevalue)'"' + if `stardetachon' & `:word `c' of `starsrow''==1 { + local thevalue + foreach vi of local v { + if index("`vi'",".")!=1 { + local inlist: list posof `"`eqvar'"' in `vi'_drop + if `inlist' local vi "..`vi'" + } + if index("`vi'",".")!=1 & `"``vi'_star'"'!="" { + local inlist: list posof `"`eqvar'"' in stardrop + if `inlist' local value + else { + Stars `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m'] + } + local thevalue `"`macval(thevalue)'`macval(value)'"' + } + if "`ferest()'"!="" & index("`vi'","..")!=1 { + local thevalue `"`macval(thevalue)'`macval(incelldelimiter)'"' + } + } + if `:length local thevalue'<245 { + local thevalue: di `fmt_stw' `"`macval(thevalue)'"' + } + file write `file' `macval(stardetach)' `"`macval(thevalue)'"' + } + } + local newrow 1 + } + +*End of table row + if "`smcltags'"!="" file write `file' "{txt}" + if `weqcnt'==`eqdim' & "`varlabelslast'"=="" /// + & !(`isref' & `"`refcatbelow'"'!="") local varlabelsend0 + local tmpend `"`macval(end)'"' + if "`varlabelsreplace'"!="" { + if `"`macval(varlabelsend0)'"'!="" local tmpend + } + VarInList `"`var'"' "`unstack'" `"`eqvar'"' `"`eqr'"' /// + `"`macval(varlabelselist)'"' + if `"`macval(value)'"'!="" { + IsInString `"""' `"`value'"' // sets local strcount + if `strcount'==0 { + local value `"`"`macval(value)'"'"' + } + InsertAtVariables `"`macval(value)'"' 2 "`ncols'" `macval(atvars2)' + if "`varlabelsreplace'"!="" local varlabelsend0 + } + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend0)'"' /// + `"`macval(value)'"' +* insert refcat() (if refcatbelow) + if `isref' & `"`refcatbelow'"'!="" { + if "`smcltags'"!="" file write `file' "{txt}" + if `hasrtfbrdr' & `r'==`RI' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"' + local rtfbrdron 1 + } + if `weqcnt'==`eqdim' & "`varlabelslast'"=="" local varlabelsend0 + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`varlabelsreplace'"!="" { + if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin + if `"`macval(varlabelsend0)'"'!="" local tmpend + } + if "`varlabelsnone'"=="" { + local value: word `isref' of `macval(refcatnames)' + Abbrev `varwidth' `"`macval(value)'"' "`abbrev'" + } + else local value + local value: di `fmt_v' `"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"' + WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + gettoken labcol2chunk labcol2 : labcol2 + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + if "`smcltags'"!="" file write `file' "{res}" + WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' /// + `"`macval(refcatrow)'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`starsrow'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" + if "`smcltags'"!="" file write `file' "{txt}" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend0)'"' + } +* end insert refcat() + } + } + +*Write indicator sets + forv i=1/`nindicate' { + if `hasrtfbrdr' & `i'==`nindicate' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"' + local rtfbrdron 1 + } + if `i'==`nindicate' & "`varlabelslast'"=="" local varlabelsend + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`varlabelsreplace'"!="" { + if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin + if `"`macval(varlabelsend)'"'!="" local tmpend + } + if "`varlabelsnone'"=="" { + Abbrev `varwidth' `"`macval(indicate`i'name)'"' "`abbrev'" + } + else local value + if "`smcltags'"!="" file write `file' "{txt}" + local value: di `fmt_v' `"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"' + WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + gettoken labcol2chunk labcol2 : labcol2 + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + if "`smcltags'"!="" file write `file' "{res}" + WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' /// + `"`macval(indicate`i'lbls)'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`starsrow'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" + if "`smcltags'"!="" file write `file' "{txt}" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend)'"' + } + +*Write prefoot + if `"`macval(prefoot)'"'!="" { + if index(`"`macval(prefoot)'"',`"""')==0 { + local prefoot `"`"`macval(prefoot)'"'"' + } + } + foreach line of local prefoot { + if "`smcltags'"!="" file write `file' "{txt}" + InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)' + file write `file' `"`macval(value)'"' _n + } + if ((`"`vblock'"'!="" & `R'>0) | `nindicate'>0) & "`smclmidrules'"!="" { + if `"`macval(statsarray)'"'!="" { + file write `file' `"`thesmclrule'"' _n + } + } + +*Write foot of table (statistics) + InsertAtVariables `"`macval(statslabelsbegin)'"' 2 "`ncols'" `macval(atvars2)' + local statslabelsbegin `"`macval(value)'"' + InsertAtVariables `"`macval(statslabelsend)'"' 2 "`ncols'" `macval(atvars2)' + local statslabelsend `"`macval(value)'"' + local statslabelsbegin0 `"`macval(statslabelsbegin)'"' + local S: list sizeof statsarray + local eqr "__" + if `hasrtfbrdr' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdefbrdrt'"' + local rtfbrdron 1 + } + forv r = 1/`S' { + if `r'==`S' & `hasrtfbrdr' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"' + local rtfbrdron 1 + } + local stat: word `r' of `macval(statslabels)' + if `"`stat'"'=="" local stat: word `r' of `statsrowlbls' + if "`statslabelsnone'"!="" local stat + if "`smcltags'"!="" file write `file' "{txt}" + if `r'==1 & "`statslabelsfirst'"=="" local statslabelsbegin0 + local tmpbegin `"`macval(begin)'"' + if "`statslabelsreplace'"!="" { + if `"`macval(statslabelsbegin0)'"'!="" local tmpbegin + } + Abbrev `varwidth' `"`macval(stat)'"' "`abbrev'" + local value: di `fmt_v' `"`macval(statslabelsprefix)'`macval(value)'`macval(statslabelssuffix)'"' + WriteBegin `"`file'"' `"`macval(statslabelsbegin0)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `r'==1 & "`statslabelsfirst'"=="" { + local statslabelsbegin0 `"`macval(statslabelsbegin)'"' + } + if `haslabcol2' { + gettoken labcol2chunk labcol2 : labcol2 + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + if "`smcltags'"!="" file write `file' "{res}" + local strow: word `r' of `statsarray' + local strowlay: word `r' of `macval(statslayout)' + local strowfmt: word `r' of `statsrowfmt' + local strowstar: word `r' of `statsrowstar' + local lastm + local lasteq + local c 0 + local mpos 0 + foreach m of local modelsrow { + local ++c + local modelwidthj: word `=1+mod(`c'-1,`nmodelwidth')' of `modelwidth' + if `modelwidthj'>0 local fmt_m "%`modelwidthj's" + else local fmt_m + if "`m'"=="." { + file write `file' `macval(delimiter)' `fmt_m' (`""') + continue + } + local value + local eq: word `:word `c' of `eqsrow'' of `eqs' + if "`m'"!="`lastm'" { + local stc 0 + local hasmestats 0 + } + if "`m'"!="`lastm'" | `"`eq'"'!="`lasteq'" local stc_eq 0 + local usemestats 0 + local ++stc_eq + local stcell: word `++stc' of `strow' + local stcelllay: word `stc' of `macval(strowlay)' + local stcellfmt: word `stc' of `strowfmt' + local stcellstar: word `stc' of `strowstar' + local cellhasstat 0 + foreach stat of local stcell { + gettoken format stcellfmt: stcellfmt + local rr = rownumb(`St',`"`stat'"') + local value = `St'[`rr',`m'] + if `value'==.y { + local value `"`return(m`m'_`stat')'"' + if `"`value'"'!="" { + local cellhasstat 1 + local stcelllay: subinstr local stcelllay `"`statspchar'"' /// + `"`value'"' + } + } + else if `value'==.x { + local hasmestats 1 + } + else if `value'<.x { + local cellhasstat 1 + vFormat `value' "`format'" "`lz'" `"`macval(dmarker)'"' /// + `"`macval(msign)'"' + local stcelllay: subinstr local stcelllay `"`statspchar'"' /// + `"`macval(value)'"' + } + } + if `cellhasstat'==0 & `hasmestats' { + local stcell: word `stc_eq' of `strow' + local stcelllay: word `stc_eq' of `macval(strowlay)' + local stcellfmt: word `stc_eq' of `strowfmt' + local stcellstar: word `stc_eq' of `strowstar' + local cellhasstat 0 + foreach stat of local stcell { + gettoken format stcellfmt: stcellfmt + local rr = rownumb(`St',`"`eq':`stat'"') + if `rr'>=. local value .z + else local value = `St'[`rr',`m'] + if `value'!=.z { + local cellhasstat 1 + vFormat `value' "`format'" "`lz'" `"`macval(dmarker)'"' /// + `"`macval(msign)'"' + local stcelllay: subinstr local stcelllay `"`statspchar'"' `"`macval(value)'"' + } + } + if `cellhasstat' local usemestats 1 + } + if `cellhasstat'==0 local stcelllay + if `:length local stcelllay'<245 { + local stcelllay: di `fmt_m' `"`macval(stcelllay)'"' + } + file write `file' `macval(delimiter)' `"`macval(stcelllay)'"' + if `:word `c' of `starsrow''==1 { + if "`stcellstar'"=="1" & `cellhasstat' { + if `usemestats' { + local rr=rownumb(`St',`"`eq':p"') + } + else { + local rr=rownumb(`St',"p") + } + Stars `"`macval(starlevels)'"' `St'[`rr',`m'] + if `:length local value'<245 { + local value: di `fmt_stw' `"`macval(value)'"' + } + file write `file' `macval(stardetach)' `"`macval(value)'"' + } + else { + file write `file' `macval(stardetach)' _skip(`starwidth') + } + } + local lastm "`m'" + local lasteq `"`eq'"' + } + if `r'==`S' & "`statslabelslast'"=="" local statslabelsend + local tmpend `"`macval(end)'"' + if "`statslabelsreplace'"!="" { + if `"`macval(statslabelsend)'"'!="" local tmpend + } + if "`smcltags'"!="" file write `file' "{txt}" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(statslabelsend)'"' + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + } + +*Write postfoot + if "`smclrules'"!="" { + file write `file' `"`thesmclrule'"' _n + } + local discrete: list retok discrete + if `"`macval(postfoot)'"'!="" { + if index(`"`macval(postfoot)'"',`"""')==0 { + local postfoot `"`"`macval(postfoot)'"'"' + } + } + foreach line of local postfoot { + if "`smcltags'"!="" file write `file' "{txt}" + InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)' + file write `file' `"`macval(value)'"' _n + } + +*Write legend (starlevels, marginals) + if "`legend'"!="" { + if `"`macval(discrete2)'"'!="" { + mat `D' = `D''*`D' + if `D'[1,1]!=0 { + if "`smcltags'"!="" file write `file' "{txt}" + file write `file' `"`macval(discrete)'`macval(discrete2)'"' _n + } + } + if `"`macval(starlegend)'"'!="" { + if "`smcltags'"!="" file write `file' "{txt}" + file write `file' `"`macval(starlegend)'"' _n + } + } + +*Finish: copy tempfile to user file / type to screen + file close `file' + local rtfenc = ("`nortfencode'"=="") & (`hasrtf'!=0) & (c(stata_version)>=14) + local S: word count `macval(substitute)' + if `"`topfile'"'!="" { + confirm file `"`topfile'"' + } + if `"`bottomfile'"'!="" { + confirm file `"`bottomfile'"' + } + if `"`using'"'!="" { + tempname file2 + file open `file2' `using', write text `replace' `append' + } + if "`type'"!="" di as res "" + if `"`topfile'"'!="" { + file open `file' using `"`topfile'"', read text + file read `file' temp + while r(eof)==0 { + if `"`using'"'!="" { + file write `file2' `"`macval(temp)'"' _n + } + if "`type'"!="" { + if "`showtabs'"!="" { + local temp: subinstr local temp "`=char(9)'" "", all + } + di `asis' `"`macval(temp)'"' + } + file read `file' temp + } + file close `file' + } + file open `file' using `"`tfile'"', read text + file read `file' temp + while r(eof)==0 { + forv s = 1(2)`S' { + local from: word `s' of `macval(substitute)' + local to: word `=`s'+1' of `macval(substitute)' + if `"`macval(from)'`macval(to)'"'!="" { + local temp: subinstr local temp `"`macval(from)'"' `"`macval(to)'"', all + } + } + if `rtfenc' { + mata: estout_rtfencode("temp") + } + if `"`using'"'!="" { + file write `file2' `"`macval(temp)'"' _n + } + if "`type'"!="" { + if "`showtabs'"!="" { + local temp: subinstr local temp "`=char(9)'" "", all + } + di `asis' `"`macval(temp)'"' + } + file read `file' temp + } + file close `file' + if `"`bottomfile'"'!="" { + file open `file' using `"`bottomfile'"', read text + file read `file' temp + while r(eof)==0 { + if `"`using'"'!="" { + file write `file2' `"`macval(temp)'"' _n + } + if "`type'"!="" { + if "`showtabs'"!="" { + local temp: subinstr local temp "`=char(9)'" "", all + } + di `asis' `"`macval(temp)'"' + } + file read `file' temp + } + file close `file' + } + if `"`using'"'!="" { + file close `file2' + gettoken junk using0 : using + return local fn `using0' + if "`outfilenoteoff'"=="" { + di as txt `"(output written to {browse `using0'})"' + } + } +end + +program MoreOptions +// estout has more options than -syntax- can handle; a subroutine is used +// here (rather than a second syntax call) to preserve the 'using' macro +// from the first syntax call +// MoreOptions is intended for options without arguments only + local theoptions /// + NOOMITted OMITted /// + NOBASElevels BASElevels /// + NOEFORM eform /// + NOMargin Margin /// + NODIscrete /// + NODROPPED dropped /// + NOSTARDetach STARDetach /// + NOABbrev ABbrev /// + NOUNStack UNStack /// + NOLZ lz /// + NOLabel Label /// + NOLEgend LEgend /// + NONUMbers NUMbers /// + NOReplace Replace /// + NOAppend Append /// + NOTYpe TYpe /// + NOSHOWTABS showtabs /// + NOASIS asis /// + NOWRAP wrap /// + NOSMCLTags SMCLTags /// + NOSMCLRules SMCLRules /// + NOSMCLMIDRules SMCLMIDRules /// + NOSMCLEQRules SMCLEQRules /// + NOOUTFILENOTEOFF outfilenoteoff /// + NORTFENCODE rtfencode + syntax [, `theoptions' ] + foreach opt of local theoptions { + local opt = lower("`opt'") + c_local `opt' "``opt''" + } + c_local options +end + +program ParseValueSubopts + syntax anything [ , mrow(string asis) NOTranspose Transpose /// + NOStar Star PVALue(string) Fmt(string) Label(string) Vacant(string) /// + NOPAR par PAR2(string asis) Keep(string asis) Drop(string asis) /// + PATtern(string) NOABS abs ] + local el: word 1 of `anything' + local elname: word 2 of `anything' + CheckPattern `"`pattern'"' "`elname'" + if `"`macval(par2)'"'!="" { + local par `"`macval(par2)'"' + } + else if "`par'"!="" { + if "`elname'"=="ci" local par "[ , ]" + else if "`elname'"=="ci_l" local par `"[ """' + else if "`elname'"=="ci_u" local par `""" ]"' + else local par "( )" + } + if `"`mrow'"'!="" { + capt confirm integer number `mrow' + if _rc==0 { + if `mrow'>=1 { + if `"`macval(label)'"'=="" { + local label "`elname'[`mrow']" + } + } + else { + local mrow `""`mrow'""' + if `"`macval(label)'"'=="" { + local label `mrow' + } + } + } + else { + gettoken trash : mrow, qed(qed) + if `qed'==0 { + local mrow `"`"`mrow'"'"' + } + if `"`macval(label)'"'=="" { + local label `mrow' + } + } + } + foreach opt in transpose star par abs { + if "`no`opt''"!="" c_local no`el'_`opt' 1 + else c_local `el'_`opt' "``opt''" + } + foreach opt in mrow pvalue fmt label vacant keep drop pattern { + c_local `el'_`opt' `"`macval(`opt')'"' + } +end + +program CheckPattern + args pattern option + foreach p of local pattern { + if !( "`p'"=="1" | "`p'"=="0" ) { + di as error `""`pattern'" invalid in `option'(... pattern())"' + exit 198 + } + } +end + +program ParseStatsSubopts + syntax [anything] [ , Fmt(string) Labels(string asis) /// + NOStar Star Star2(string) LAYout(string asis) PChar(string) ] + foreach opt in fmt labels layout pchar { + c_local stats`opt' `"`macval(`opt')'"' + } + if "`nostar'"!="" c_local nostatsstar 1 + else if "`star2'"!="" { + local anything: list anything | star2 + c_local statsstar "`star2'" + } + else if "`star'"!="" { + local star2: word 1 of `anything' + c_local statsstar "`star2'" + } + c_local stats "`anything'" + c_local stats2 +end + +prog ProcessStatslayout // returns statsarray, -rowlbls, -rowfmt, -rowstar, -colstar, -layout + args stats statsfmt statsstar statslayout statspchar + local format "%9.0g" + if `"`statspchar'"'=="" { + local statspchar "@" + c_local statspchar "@" + } + local statsarray + local statsrowlbls + local statsrowfmt + local statsrowstar + local space1 + local i 0 + local wmax 0 + foreach row of local statslayout { + local statsrow + local statsrowlbl + local statsrfmt + local statsrstar + local space2 + local w = 0 + foreach cell of local row { + local ++w + local statscell + local statsclbl `"`cell'"' + local statscfmt + local statscstar 0 + local space3 + local trash: subinstr local cell `"`statspchar'"' "", all count(local cnt) + forv j=1/`cnt' { + local stat: word `++i' of `stats' + local statscell `"`statscell'`space3'`stat'"' + local statsclbl: subinstr local statsclbl `"`statspchar'"' "`stat'" + local tmp: word `i' of `statsfmt' + if `"`tmp'"'!="" local format `"`tmp'"' + local statscfmt `"`statscfmt'`space3'`format'"' + if `:list stat in statsstar' { + local statscstar 1 + local statscol_`w' 1 + } + local space3 " " + } + local statsrow `"`statsrow'`space2'"`statscell'""' + local statsrowlbl `"`statsrowlbl'`space2'`statsclbl'"' + local statsrfmt `"`statsrfmt'`space2'"`statscfmt'""' + local statsrstar "`statsrstar'`space2'`statscstar'" + local space2 " " + } + local statsarray `"`statsarray'`space1'`"`statsrow'"'"' + local statsrowlbls `"`statsrowlbls'`space1'`"`statsrowlbl'"'"' + local statsrowfmt `"`statsrowfmt'`space1'`"`statsrfmt'"'"' + local statsrowstar `"`statsrowstar'`space1'`"`statsrstar'"'"' + local space1 " " + local wmax = max(`w',`wmax') + } + while (1) { + local stat: word `++i' of `stats' + if `"`stat'"'=="" continue, break + local tmp: word `i' of `statsfmt' + if `"`tmp'"'!="" local format `"`tmp'"' + local statscstar: list stat in statsstar + if `statscstar' local statscol_1 1 + local statsarray `"`statsarray'`space1'`"`stat'"'"' + local statsrowlbls `"`statsrowlbls'`space1'`"`stat'"'"' + local statsrowfmt `"`statsrowfmt'`space1'`"`format'"'"' + local statsrowstar `"`statsrowstar'`space1'`"`statscstar'"'"' + local statslayout `"`statslayout'`space1'`statspchar'"' + local space1 " " + local wmax = max(1,`wmax') + } + local statscolstar + local space + forv w = 1/`wmax' { + if "`statscol_`w''"=="" local statscol_`w' 0 + local statscolstar "`statscolstar'`space'`statscol_`w''" + local space " " + } + c_local statsarray `"`statsarray'"' + c_local statsrowlbls `"`statsrowlbls'"' + c_local statsrowfmt `"`statsrowfmt'"' + c_local statsrowstar `"`statsrowstar'"' + c_local statscolstar `"`statscolstar'"' + c_local statslayout `"`statslayout'"' +end + +program ParseLabelsSubopts + gettoken type 0: 0 + local lblsubopts + syntax [anything] [ , NONUMbers NUMbers NOTItles TItles NODEPvars DEPvars /// + NONONE NONE NOSPAN span Prefix(string) Suffix(string) Begin(string asis) /// + End(string asis) NOReplace Replace BList(string asis) EList(string asis) /// + ERepeat(string) NOFirst First NOLast Last lhs(string) PATtern(string) /// + NOMerge Merge ] + CheckPattern `"`pattern'"' "`type'" + if "`merge'"!="" & "`nomerge'`macval(suffix)'"=="" local suffix ":" + foreach opt in begin end { + if `"`macval(`opt')'"'!="" { + if index(`"`macval(`opt')'"', `"""')==0 { + local `opt' `"`"`macval(`opt')'"'"' + } + } + } + foreach opt in prefix suffix begin end blist elist erepeat lhs pattern { + c_local `type'`opt' `"`macval(`opt')'"' + } + foreach opt in numbers titles depvars span replace none first last merge { + if "`no`opt''"!="" c_local no`type'`opt' 1 + else c_local `type'`opt' "``opt''" + } + c_local `type' `"`macval(anything)'"' +end + +program ReadLine + args max file + local end 0 + file read `file' temp1 + local temp1: subinstr local temp1 "`=char(9)'" " ", all + while r(eof)==0 { + local j 1 + local temp2 + local temp3: piece `j++' `max' of `"`macval(temp1)'"' + if `"`temp3'"'=="" | index(`"`temp3'"',"*")==1 /// + | index(`"`temp3'"',"//")==1 { + file read `file' temp1 + local temp1: subinstr local temp1 "`=char(9)'" " ", all + continue + } + while `"`temp3'"'!="" { + local comment=index(`"`macval(temp3)'"'," ///") + if `comment' { + local temp3=substr(`"`macval(temp3)'"',1,`comment') + local temp2 `"`macval(temp2)'`macval(temp3)'"' + local end 0 + continue, break + } + local comment=index(`"`macval(temp3)'"'," //") + if `comment' { + local temp3=substr(`"`macval(temp3)'"',1,`comment') + local temp2 `"`macval(temp2)'`macval(temp3)'"' + local end 1 + continue, break + } + local temp2 `"`macval(temp2)'`macval(temp3)'"' + local temp3: piece `j++' `max' of `"`macval(temp1)'"' + local end 1 + } + if `end' { + local line `"`macval(line)'`macval(temp2)'"' + continue, break + } + else { + local line `"`macval(line)'`macval(temp2)'"' + file read `file' temp1 + local temp1: subinstr local temp1 "`=char(9)'" " ", all + } + } + c_local line `"`macval(line)'"' +end + +program CellsCheck + args cells + local ncols 0 + local nrows 0 + local cells: subinstr local cells "& " "&", all + local cells: subinstr local cells " &" "&", all + local cells: subinstr local cells `"&""' `"& ""', all + local cells: subinstr local cells `""&"' `"" &"', all + foreach row of local cells { + local newrow + foreach col of local row { + local vals: subinstr local col "&" " ", all + //local vals: list vals - values + local values: list values | vals + local vals: list retok vals + local vals: subinstr local vals " " "&", all + //local newrow: list newrow | vals + local newrow `"`newrow'`vals' "' + } + local newrow: list retok newrow + if "`newrow'"!="" { + local ncols = max(`ncols',`:list sizeof newrow') + local newcells `"`newcells'"`newrow'" "' + local ++nrows + } + } + local newcells: list retok newcells + c_local cells `"`newcells'"' + c_local ncols `ncols' + c_local nrows `nrows' + local dot "." + c_local values: list values - dot +end + +program Star2Cells + args cells star + local newcells + foreach row of local cells { + local newrow + foreach col of local row { + if "`col'"=="`star'" { + local col "`col'star" + } + local newrow: list newrow | col + } + local newcells `"`newcells'"`newrow'" "' + } + local newcells: list retok newcells + c_local cells `"`newcells'"' +end + +prog ParseStarlevels + syntax [anything(equalok)] [ , Label(str) Delimiter(str) ] + c_local starlevels `"`macval(anything)'"' + c_local starlevelslabel `"`macval(label)'"' + c_local starlevelsdelimiter `"`macval(delimiter)'"' +end + +program CheckStarvals + args starlevels label del + if `"`macval(label)'"'=="" local label " p<" + if `"`macval(del)'"'=="" local del ", " + local nstar: word count `macval(starlevels)' + local nstar = `nstar'/2 + capture confirm integer number `nstar' + if _rc { + di as error "unmatched list of significance symbols and levels" + exit 198 + } + local istar 1 + forv i = 1/`nstar' { + local iistar: word `=`i'*2' of `macval(starlevels)' + confirm number `iistar' + if `iistar'>`istar' | `iistar'<=0 { + di as error "significance levels out of order or out of range (0,1]" + exit 198 + } + local istar `iistar' + local isym: word `=`i'*2-1' of `macval(starlevels)' + if `"`macval(legend)'"'!="" { + local legend `"`macval(legend)'`macval(del)'"' + } + local ilabel: subinstr local label "@" "`istar'", count(local hasat) + if `hasat'==0 { + local ilabel `"`macval(label)'`istar'"' + } + local legend `"`macval(legend)'`macval(isym)'`macval(ilabel)'"' + } + c_local starlegend `"`macval(legend)'"' +end + +program Starwidth + args starlevels + if c(stata_version)>=14 local length udstrlen + else local length length + local nstar: word count `macval(starlevels)' + forv i = 2(2)`nstar' { + local istar: word `=`i'-1' of `macval(starlevels)' + local width = max(length("`width'"),`length'(`"`macval(istar)'"')) + } + c_local value `width' +end + +// Loosely based on Mkemat from est_table.ado, but with heavy modifications +program _estout_getres, rclass + syntax, names(str) [ coefs(str asis) stats(str asis) equations(str) /// + rename(str asis) margin(str asis) meqs(str asis) /// + dropped(int 0) level(int 95) /// + transform(str asis) transformpattern(str asis) /// + omitted baselevels ] + // coefs: coef "coef O/1 #" `"coef O/1 "rowname""' etc... + + tempname bc bbc bs bbs st + + local nnames : word count `names' + local rename : subinstr local rename "," "", all + if `"`stats'"' != "" { + local stats : subinstr local stats "," "", all + confirm names `stats' + local stats : list uniq stats + local nstat : list sizeof stats + mat `bbs' = J(`nstat', `nnames', .z) + mat colnames `bbs' = `: subinstr local names "." "active", all word' + mat rownames `bbs' = `stats' + } + + if "`equations'" != "" { + MatchNames "`equations'" + local eqspec `r(eqspec)' + local eqnames `r(eqnames)' + } + + local ncoefs 0 + foreach coefn of local coefs { + local ++ncoefs + gettoken coef : coefn + local coefnms `"`coefnms' `coef'"' // use more informative label? (coefn => error in Stata 8 and 10) + } + local bVs "b se var t z p ci_l ci_u _star _sign _sigsign" + local hasbVs = `"`: list coefnms & bVs'"'!="" + local hastransform = (`"`transform'"'!="") & `hasbVs' + local getbV = cond(`hasbVs' | `dropped', "b var ", "") + + tempname hcurrent esample + local estcycle = ("`names'"!=".") + if `estcycle' { + _est hold `hcurrent', restore nullok estsystem + } + + local ni 0 + local hasbbc 0 + local ccols = `ncoefs' + ("`margin'"!="") + `dropped' + foreach name of local names { + local ++ni + local hasbc 0 + local hasmargin 0 + nobreak { + if "`name'" != "." { + local eqname `name' + *est_unhold `name' `esample' // (why preserve missings in esample?) + capt confirm new var _est_`name' // fix e(sample) if obs have been added + if _rc qui replace _est_`name' = 0 if _est_`name' >=. + _est unhold `name' + } + else { + local eqname active + if `estcycle' { + _est unhold `hcurrent' + } + } + + // get coefficients + capture noisily break { + CheckEqs `"`getbV'`coefs'"' // sets local seqmerge + GetCoefs `bc' `seqmerge' `"`getbV'`coefs'"' // sets local hasbc + if `hasbc' { + mat coln `bc' = `getbV'`coefnms' + SubstEmptyEqname `bc' // replace empty eqname "_" by "__" + } + } + local rc = _rc + + // set equation names and get marginal effects + if `hasbc' & `rc'==0 { + capture noisily break { + if `dropped' { + DroppedCoefs `bc' + } + if "`equations'"!="" { + AdjustRowEq `bc' `ni' `nnames' "`eqspec'" "`eqnames'" + } + if "`margin'"!="" & `hasbVs' { + GetMarginals `bc' "`margin'" `"`meqs'"' // resets local hasmargin + } + if `hasbVs' { + ComputeCoefs `bc' `hasmargin' `"`coefnms'"' `level' + } + if `hastransform' & `hasbVs' { + if `"`transformpattern'"'!="" { + local transformthis: word `ni' of `transformpattern' + } + else local transformthis 1 + if `"`transformthis'"'=="1" { + TransformCoefs `bc' `"`coefnms'"' `"`transform'"' + } + } + if "`getbV'"!="" { + mat `bc' = `bc'[1...,3...] // remove b and var + } + } + local rc = _rc + } + + // get stats + if `rc'==0 { + capture noisily break { + if "`stats'" != "" { + GetStats "`stats'" `bbs' `ni' + if `hasbc'>0 & inlist(`"`e(cmd)'"', "reg3", "sureg", "mvreg") { + GetEQStats "`stats'" `bbs' `ni' `bc' + } + return add + } + } + local rc = _rc + } + + local depname: word 1 of `e(depvar)' + return local m`ni'_depname "`depname'" + + local title `"`e(estimates_title)'"' + if `"`title'"'=="" local title `"`e(_estimates_title)'"' // prior to Stata 10 + return local m`ni'_estimates_title `"`title'"' + + if "`name'" != "." { + *est_hold `name' `esample' + _est hold `name', estimates varname(_est_`name') + } + else { + if `estcycle' { + _est hold `hcurrent', restore nullok estsystem + } + } + } + + if `rc' { + exit `rc' + } + + if (c(stata_version)>=11) & (`hasbc'>0) { + mata: estout_omitted_and_base() // sets local hasbc + } + + if `hasbc'>0 { + mat coleq `bc' = `eqname' + if `"`rename'"'!="" { + RenameCoefs `bc' `"`rename'"' + } + if `hasbbc' { + _estout_mat_capp `bbc' : `bbc' `bc', miss(.z) cons ts + } + else { + mat `bbc' = `bc' + if `ni'>1 { // add previous empty models + mat `bc' = (1, `bc'[1,1...]) \ ( `bc'[1...,1], J(rowsof(`bc'), colsof(`bc'), .z)) + mat `bc' = `bc'[2...,2...] + forv nj = 1/`ni' { + if `nj'==`ni' continue + local eqname: word `nj' of `names' + if `"`eqname'"'=="." { + local eqname active + } + mat coleq `bc' = `eqname' + mat `bbc' = `bc', `bbc' + } + } + } + local hasbbc 1 + } + else { + if `hasbbc' { // add empty model if bbc exists + mat `bc' = `bbc'[1...,1..`ccols'] + mat `bc' = (1, `bc'[1,1...]) \ ( `bc'[1...,1], J(rowsof(`bc'), colsof(`bc'), .z)) + mat `bc' = `bc'[2...,2...] + mat coleq `bc' = `eqname' + mat `bbc' = `bbc', `bc' + } + } + } + + if `hasbbc' { + return matrix coefs = `bbc' + return scalar ccols = `ccols' + } + else { + return scalar ccols = 0 // indicates that r(coefs) is missing + } + if "`stats'" != "" { + return matrix stats = `bbs' + } + return local names `names' + return scalar nmodels = `ni' +end + +program _estout_mat_capp + // variant of mat_capp that is robust against blanks in coefficient names + if c(stata_version)<11 { // requires Stata 11 or newer + mat_capp `0' + exit + } + syntax anything [, * ] + gettoken m1 m3 : anything, parse(":") // mat1 + gettoken m2 m3 : m3, parse(":") // : + gettoken m2 m3 : m3 // mat2 + gettoken m3 : m3 // mat3 + local hasblanks 0 + mata: estout_rown_hasblanks("hasblanks", ("`m2'", "`m3'")) + if `hasblanks'==0 { + mat_capp `0' + exit + } + mata: estout_mat_capp("`m1'", ("`m2'", "`m3'")) +end + +program DroppedCoefs // identify dropped coeffficients + args bc + tempname tmp + mat `tmp' = `bc'[1..., 1] * 0 + mat coln `tmp' = "_dropped" + local r = rowsof(`bc') + forv i = 1/`r' { + if `bc'[`i',1]==0 & `bc'[`i',2]==0 { // b=0 and var=0 + mat `tmp'[`i',1] = 1 + } + } + mat `bc' = `bc', `tmp' +end + +program RenameCoefs + args bc rename + local Stata11 = cond(c(stata_version)>=11, "version 11:", "") + tempname tmp + local eqs: roweq `bc', q + local eqs: list clean eqs + local eqs: list uniq eqs + local newnames + foreach eq of local eqs { + mat `tmp' = `bc'[`"`eq':"',1] + QuotedRowNames `tmp' + local vars `"`value'"' + local rest `"`rename'"' + while (`"`rest'"'!="") { + gettoken from rest : rest + gettoken to rest : rest + if `"`from'`to'"'=="" continue + gettoken equ x : from, parse(:) + local equ: list clean equ + if `"`equ'"'==":" { // case 1: ":varname" + local equ + local x: list clean x + } + else if `"`x'"'=="" { // case 2: "varname" + local x `"`equ'"' + local equ + } + else { // case 3. "eqname:varname" + if `"`equ'"'=="_" local equ "__" + gettoken colon x : x, parse(:) + local x: list clean x + } + if `"`x'"'=="" { + di as err "invalid rename()" + exit 198 + } + if index(`"`to'"',":") | `"`to'"'=="" { + di as err "invalid rename()" + exit 198 + } + if `"`equ'"'!="" { + if `"`equ'"'!=`"`eq'"' continue // different equation + } + local x `"`"`x'"'"' + local x: list clean x + local vars: subinstr local vars `"`x'"' `"`"`to'"'"', word + } + local newnames `"`newnames'`vars' "' + } + `Stata11' mat rown `bc' = `newnames' +end + +// Source: est_table.ado version 1.1.4 09oct2008 (unmodified) +program MatchNames, rclass + args eqspec + + local eqspec : subinstr local eqspec ":" " ", all + local eqspec0 : subinstr local eqspec "#" "" , all + + local iterm 0 + gettoken term eqspec : eqspec0 , parse(",") + while "`term'" != "" { + local ++iterm + + // term = [name =] { # | #-list } + gettoken eqname oprest: term, parse("=") + gettoken op rest : oprest, parse("=") + if trim(`"`op'"') == "=" { + confirm name `eqname' + local term `rest' + } + else { + local eqname #`iterm' + } + local eqnames `eqnames' `eqname' + + if "`eqspec'" == "" { + continue, break + } + gettoken term eqspec: eqspec , parse(",") + assert "`term'" == "," + gettoken term eqspec: eqspec , parse(",") + } + + if `"`:list dups eqnames'"' != "" { + dis as err "duplicate matched equation names" + exit 198 + } + + return local eqspec `eqspec0' + return local eqnames `eqnames' +end + +// Source: est_table.ado version 1.1.4 09oct2008 +// 02oct2013: added -version 11: matrix roweq- to support new eqnames +program AdjustRowEq + args b ni nmodel eqspec eqnames + + local beqn : roweq `b', quote + local beqn : list clean beqn + local beq : list uniq beqn + + if `"`:list beq & eqnames'"' != "" { + dis as err "option equations() invalid" + dis as err "specified equation name already occurs in model `ni'" + exit 198 + } + + local iterm 0 + gettoken term eqspec : eqspec , parse(",") + while "`term'" != "" { + // dis as txt "term:|`term'|" + local ++iterm + + // term = [name =] { # | #-list } + gettoken eqname oprest: term, parse("=") + gettoken op rest : oprest, parse("=") + if trim(`"`op'"') == "=" { + local term `rest' + } + else { + local eqname #`iterm' + } + + local nword : list sizeof term + if !inlist(`nword', 1, `nmodel') { + dis as err "option equations() invalid" + dis as err "a term should consist of either 1 or `nmodel' equation numbers" + exit 198 + } + if `nword' > 1 { + local term : word `ni' of `term' + } + + if trim("`term'") != "." { + capt confirm integer number `term' + if _rc { + dis as err "option equations() invalid" + dis as err "`term' was found, while an integer equation number was expected" + exit 198 + } + if !inrange(`term',1,`:list sizeof beq') { + dis as err "option equations() invalid" + dis as err "equation number `term' for model `ni' out of range" + exit 198 + } + if `:list posof "`eqname'" in beq' != 0 { + dis as err "impossible to name equation `eqname'" + dis as err "you should provide (another) equation name" + exit 198 + } + + local beqn : subinstr local beqn /// + `"`:word `term' of `beq''"' /// + "`eqname'" , word all + } + + if "`eqspec'" == "" { + continue, break + } + gettoken term eqspec: eqspec , parse(",") + assert "`term'" == "," + gettoken term eqspec: eqspec , parse(",") + } + if c(stata_version)>=11 { // similar to RenameCoefs + version 11: matrix roweq `b' = `beqn' + } + else { + matrix roweq `b' = `beqn' + } +end + +// Source: est_table.ado version 1.1.4 09oct2008 (modified) +// Modification: returns string scalars in r(m`ni'_name) (and sets `bbs' = .y) +program GetStats, rclass + args stats bbs ni + tempname rank st V + local escalars : e(scalars) + local emacros : e(macros) + local is 0 + foreach stat of local stats { + local ++is + if inlist("`stat'", "aic", "bic", "rank") { + if "`hasrank'" == "" { + capt mat `V' = syminv(e(V)) + local rc = _rc + if `rc' == 0 { + scalar `rank' = colsof(`V') - diag0cnt(`V') + } + else if `rc' == 111 { + scalar `rank' = 0 + } + else { + // rc<>0; show error message + mat `V' = syminv(e(V)) + } + local hasrank 1 + } + if "`stat'" == "aic" { + scalar `st' = -2*e(ll) + 2*`rank' + } + else if "`stat'" == "bic" { + scalar `st' = -2*e(ll) + log(e(N)) * `rank' + } + else if "`stat'" == "rank" { + scalar `st' = `rank' + } + } + else { + if `:list stat in escalars' > 0 { + scalar `st' = e(`stat') + } + else if "`stat'"=="p" { + if `"`e(F)'"'!="" { + scalar `st' = Ftail(e(df_m), e(df_r), e(F)) + } + else if `"`e(chi2)'"'!="" { + scalar `st' = chi2tail(e(df_m), e(chi2)) + } + else { + scalar `st' = .z + } + } + else if `:list stat in emacros' > 0 { + scalar `st' = .y + capt return local m`ni'_`stat' `"`e(`stat')'"' // name might be too long + } + else { + scalar `st' = .z + } + } + mat `bbs'[`is',`ni'] = `st' + } +end + +program GetEQStats, rclass // eq-specific stats for reg3, sureg, and mvreg (sets `bbs' = .x) + args stats bbs ni bc + return add + tempname addrow + local ic "aic bic rank" + local eqs: roweq `bc', q + local eqs: list clean eqs + local eqs: list uniq eqs + local s 0 + foreach stat of local stats { + local ++s + if inlist(`"`stat'"', "aic", "bic", "rank") continue + if `bbs'[`s',`ni']<.y continue + local e 0 + local found 0 + foreach eq of local eqs { + local ++e + if e(cmd)=="mvreg" { + if "`stat'"=="p" local value: word `e' of `e(p_F)' + else local value: word `e' of `e(`stat')' + } + else if "`stat'"=="df_m" { + local value `"`e(`stat'`e')'"' + } + else { + local value `"`e(`stat'_`e')'"' + } + capture confirm number `value' + if _rc==0 { + local found 1 + local r = rownumb(`bbs', `"`eq':`stat'"') + if `r'>=. { + mat `addrow' = J(1, colsof(`bbs'), .z) + mat rown `addrow' = `"`eq':`stat'"' + mat `bbs' = `bbs' \ `addrow' + local r = rownumb(`bbs', `"`eq':`stat'"') + } + mat `bbs'[`r',`ni'] = `value' + } + } + if `found' { + if `bbs'[`s',`ni']==.y { + capt return local m`ni'_`stat' "" + } + mat `bbs'[`s',`ni'] = .x + } + } +end + +program CheckEqs + args coefs + tempname tmp + local j 0 + local bVs "b _star _sign _sigsign" + local seqmerge 0 + local hasseqs 0 + foreach coefn in `coefs' { + local ++j + gettoken coef row : coefn + gettoken transpose row : row + gettoken row : row, q + if `"`coef'"'=="b" & `j'==1 { + capt confirm mat e(`coef') + if _rc continue + mat `tmp' = e(`coef') + local eqs: coleq `tmp', q + if `:list posof "_" in eqs'==0 { + local seqmerge 1 + } + else continue, break + } + if `:list coef in bVs' continue + capt confirm mat e(`coef') + if _rc continue + mat `tmp' = e(`coef') + if `transpose' { + mat `tmp' = `tmp'' + } + if `"`row'"'=="" local row 1 + capt confirm number `row' + if _rc { + local row = rownumb(`tmp',`row') + } + if `row'>rowsof(`tmp') continue + local eqs: coleq `tmp', q + if `:list posof "_" in eqs' { + local eqs: list uniq eqs + local eqs: list clean eqs + if `"`eqs'"'!="_" { // => contains "_" but also others + local local seqmerge 0 + continue, break + } + else local hasseqs 1 + } + else { + local seqmerge 1 + } + } + if `hasseqs'==0 local seqmerge 0 + c_local seqmerge `seqmerge' +end + +program SubstEmptyEqname // replace empty equation name "_" by "__" + args M + local eqs: roweq `M', q + if `: list posof "_" in eqs' { + local eqs: subinstr local eqs `""_""' `""__""', all + mat roweq `M' = `eqs' + } +end + +program RestoreEmptyEqnames // replace equation name "__" by "_" + args M + local eqs: roweq `M', q + if `: list posof "__" in eqs' { + local eqs: subinstr local eqs `""__""' `""_""', all + mat roweq `M' = `eqs' + } +end + +program GetCoefs + args bc seqmerge coefs + tempname tmp + local hasbc 0 + local j 0 + local bVs "b _star _sign _sigsign" + foreach coefn of local coefs { + local ++j + gettoken coef row : coefn + gettoken transpose row : row + gettoken row : row, q + local isinbVs: list coef in bVs + if `isinbVs' & `j'>2 { + if `hasbc'==0 continue + mat `bc' = `bc', J(rowsof(`bc'),1, .y) + continue + } + if `j'==2 & `"`coef'"'=="var" { + local isinbVs 1 + capt mat `tmp' = vecdiag(e(V)) + if _rc { + capt confirm mat e(se) + if _rc==0 { + mat `tmp' = e(se) + forv i = 1/`=colsof(`tmp')' { + mat `tmp'[1, `i'] = `tmp'[1, `i']^2 + } + } + } + } + else { + capt confirm mat e(`coef') + if _rc==0 { + mat `tmp' = e(`coef') + } + } + if _rc { + if `hasbc'==0 continue + mat `bc' = `bc', J(rowsof(`bc'),1, .y) + continue + } + if `isinbVs'==0 { // => not b or var + if `transpose' { + mat `tmp' = `tmp'' + } + if `"`row'"'=="" local row 1 + capt confirm number `row' + if _rc { + local row = rownumb(`tmp',`row') + } + if `row'>rowsof(`tmp') { + if `hasbc'==0 continue + mat `bc' = `bc', J(rowsof(`bc'),1, .y) + continue + } + mat `tmp' = `tmp'[`row', 1...] + } + local bcols = colsof(`tmp') + if `bcols'==0 { + if `hasbc'==0 continue + mat `bc' = `bc', J(rowsof(`bc'),1, .y) + continue + } + mat `tmp' = `tmp'' + if `seqmerge' & `isinbVs'==0 { + local eqs: roweq `tmp', q + local eqs: list uniq eqs + local eqs: list clean eqs + if `"`eqs'"'=="_" { + local seqmergejs `seqmergejs' `j' + local seqmergecoefs `"`seqmergecoefs'`"`coefn'"' "' + if `hasbc'==0 continue + mat `bc' = `bc', J(rowsof(`bc'),1, .y) + continue + } + } + if `hasbc'==0 { + mat `bc' = `tmp' + local hasbc 1 + if `j'>1 { + mat `bc' = `bc', J(`bcols',`j'-1, .y), `bc' + mat `bc' = `bc'[1...,2...] + } + } + else { + _estout_mat_capp `bc' : `bc' `tmp', miss(.y) cons ts + } + } + foreach coefn of local seqmergecoefs { + gettoken j seqmergejs : seqmergejs + gettoken coef row : coefn + gettoken transpose row : row + gettoken row : row, q + mat `tmp' = e(`coef') + if `transpose' { + mat `tmp' = `tmp'' + } + if `"`row'"'=="" local row 1 + capt confirm number `row' + if _rc { + local row = rownumb(`tmp',`row') + } + mat `tmp' = `tmp'[`row', 1...] + SEQMerge `bc' `j' `tmp' + } + c_local hasbc `hasbc' +end + +program SEQMerge + args bc j x + tempname tmp + local r = rowsof(`bc') + forv i = 1/`r' { + mat `tmp' = `bc'[`i',1...] + local v: rown `tmp' + local c = colnumb(`x', `"`v'"') + if `c'<. { + mat `bc'[`i',`j'] = `x'[1,`c'] + } + } +end + +program ComputeCoefs + args bc hasmargin coefs level + local bVs1 "b _star _sign _sigsign" + local bVs2 "se var t z p ci_l ci_u" + local c = colsof(`bc') + forv j = 3/`c' { + gettoken v coefs : coefs + if `"`v'"'=="" continue, break + if `: list v in bVs1' { + ComputeCoefs_`v' `bc' `j' `level' + continue + } + if `: list v in bVs2' { + if `hasmargin' { + ComputeCoefs_`v' `bc' `j' `level' + continue + } + capt confirm matrix e(`v') + if _rc { + ComputeCoefs_`v' `bc' `j' `level' + } + } + } +end + +program CopyColFromTo + args m from to cname + tempname tmp + mat `tmp' = `m'[1...,`from'] + mat coln `tmp' = `cname' + local c = colsof(`m') + if `to'==`c' { + mat `m' = `m'[1...,1..`c'-1], `tmp' + exit + } + mat `m' = `m'[1...,1..`to'-1], `tmp', `m'[1...,`to'+1..`c'] +end + +program ComputeCoefs_b + args bc j + CopyColFromTo `bc' 1 `j' "b" +end + +program ComputeCoefs_se + args bc j + local r = rowsof(`bc') + forv i = 1/`r' { + local var `bc'[`i',2] + local res `bc'[`i',`j'] + if `var'>=. mat `res' = `var' + else if `var'==0 mat `res' = . + else mat `res' = sqrt(`var') + } +end + +program ComputeCoefs_var + args bc j + CopyColFromTo `bc' 2 `j' "var" +end + +program ComputeCoefs_t + args bc j + local r = rowsof(`bc') + forv i = 1/`r' { + local b `bc'[`i',1] + local var `bc'[`i',2] + local res `bc'[`i',`j'] + if `b'>=. mat `res' = `b' + else if `var'>=. mat `res' = `var' + else mat `res' = `b'/sqrt(`var') + } +end + +program ComputeCoefs_z + ComputeCoefs_t `0' +end + +program ComputeCoefs_p + args bc j + local r = rowsof(`bc') + local df_r = e(df_r) + if `"`e(mi)'"'=="mi" { // get df_mi + capt confirm matrix e(df_mi) + if _rc==0 { + tempname dfmi + matrix `dfmi' = e(df_mi) + } + } + if c(stata_version)<10 local dfmax 1e12 + else local dfmax 2e17 + forv i = 1/`r' { + local b `bc'[`i',1] + local var `bc'[`i',2] + local res `bc'[`i',`j'] + if `b'>=. mat `res' = `b' + else if `var'>=. mat `res' = `var' + else if "`dfmi'"!="" { + if `dfmi'[1,`i']<=`dfmax' { + mat `res' = ttail(`dfmi'[1,`i'],abs(`b'/sqrt(`var'))) * 2 + } + else { + mat `res' = (1 - norm(abs(`b'/sqrt(`var')))) * 2 + } + } + else if `df_r'<=`dfmax' mat `res' = ttail(`df_r',abs(`b'/sqrt(`var'))) * 2 + else mat `res' = (1 - norm(abs(`b'/sqrt(`var')))) * 2 + } +end + +program ComputeCoefs_ci_l + args bc j + ComputeCoefs_ci - `0' +end + +program ComputeCoefs_ci_u + args bc j + ComputeCoefs_ci + `0' +end + +program ComputeCoefs_ci + args sign bc j level + local r = rowsof(`bc') + local df_r = e(df_r) + if `"`e(mi)'"'=="mi" { // get df_mi + capt confirm matrix e(df_mi) + if _rc==0 { + tempname dfmi + matrix `dfmi' = e(df_mi) + } + } + if c(stata_version)<10 local dfmax 1e12 + else local dfmax 2e17 + forv i = 1/`r' { + local b `bc'[`i',1] + local var `bc'[`i',2] + local res `bc'[`i',`j'] + if `b'>=. mat `res' = `b' + else if `var'>=. mat `res' = `var' + else if "`dfmi'"!="" { + if `dfmi'[1,`i']<=`dfmax' { + mat `res' = `b' `sign' /// + invttail(`dfmi'[1,`i'],(100-`level')/200) * sqrt(`var') + } + else { + mat `res' = `b' `sign' /// + invnorm(1-(100-`level')/200) * sqrt(`var') + } + } + else if `df_r'<=`dfmax' /// + mat `res' = `b' `sign' invttail(`df_r',(100-`level')/200) * sqrt(`var') + else mat `res' = `b' `sign' invnorm(1-(100-`level')/200) * sqrt(`var') + } +end + +program ComputeCoefs__star + args bc j + CopyColFromTo `bc' 1 `j' "_star" +end + +program ComputeCoefs__sign + args bc j + CopyColFromTo `bc' 1 `j' "_sign" +end + +program ComputeCoefs__sigsign + args bc j + CopyColFromTo `bc' 1 `j' "_sigsign" +end + +program GetMarginals + args bc margin meqs + tempname D dfdx + mat `D' = `bc'[1...,1]*0 + mat coln `D' = "_dummy" + local type `e(Xmfx_type)' + if "`type'"!="" { + mat `dfdx' = e(Xmfx_`type') + capture confirm matrix e(Xmfx_se_`type') + if _rc==0 { + mat `dfdx' = `dfdx' \ e(Xmfx_se_`type') + } + if "`e(Xmfx_discrete)'"=="discrete" local dummy `e(Xmfx_dummy)' + } + else if "`e(cmd)'"=="dprobit" { + mat `dfdx' = e(dfdx) \ e(se_dfdx) + local dummy `e(dummy)' + } + else if "`e(cmd)'"=="tobit" & inlist("`margin'","u","c","p") { + capture confirm matrix e(dfdx_`margin') + if _rc==0 { + mat `dfdx' = e(dfdx_`margin') \ e(se_`margin') + } + local dummy `e(dummy)' + } + else if "`e(cmd)'"=="truncreg" { + capture confirm matrix e(dfdx) + if _rc==0 { + tempname V se + mat `V' = e(V_dfdx) + forv k= 1/`=rowsof(`V')' { + mat `se' = nullmat(`se') , sqrt(`V'[`k',`k']) + } + mat `dfdx' = e(dfdx) \ `se' + } + } + capture confirm matrix `dfdx' + if _rc==0 { + QuotedRowNames `bc' + local rnames `"`value'"' + if `"`meqs'"'!="" local reqs: roweq `bc', q + local i 1 + foreach row of loc rnames { + if `"`meqs'"'!="" { + local eq: word `i' of `reqs' + } + local col = colnumb(`dfdx',"`row'") + if `col'>=. | !`:list eq in meqs' { + mat `bc'[`i',1] = .y + mat `bc'[`i',2] = .y + mat `D'[`i',1] = .y + } + else { + mat `bc'[`i',1] =`dfdx'[1,`col'] + mat `bc'[`i',2] = (`dfdx'[2,`col'])^2 + if "`:word `col' of `dummy''"=="1" mat `D'[`i',1] = 1 + } + local ++i + } + c_local hasmargin 1 + } + mat `bc' = `bc', `D' +end + +program TransformCoefs + args bc coefs transform + local c = colsof(`bc') + forv j = 3/`c' { + gettoken v coefs : coefs + if inlist("`v'", "b", "ci_l", "ci_u") { + _TransformCoefs `bc' `j' 0 "" "" `"`transform'"' + } + else if "`v'"=="se" { + _TransformCoefs `bc' `j' 1 "abs" "" `"`transform'"' + } + else if "`v'"=="var" { + _TransformCoefs `bc' `j' 1 "" "^2" `"`transform'"' + } + } +end + +program _TransformCoefs + args bc j usedf abs sq transform + local r = rowsof(`bc') + gettoken coef rest : transform + gettoken f rest : rest + gettoken df rest : rest + while `"`coef'`f'`df'"'!="" { + if `"`df'`rest'"'=="" { // last element of list may be without coef + local df `"`f'"' + local f `"`coef'"' + local coef "" + } + local trcoefs `"`trcoefs'`"`coef'"' "' + if `usedf' { + local trs `"`trs'`"`df'"' "' + } + else { + local trs `"`trs'`"`f'"' "' + } + gettoken coef rest : rest + gettoken f rest : rest + gettoken df rest : rest + } + local trs : subinstr local trs "@" "\`b'", all + forv i = 1/`r' { + gettoken coef coefrest : trcoefs + gettoken tr trrest : trs + while `"`coef'`tr'"'!="" { + MatchCoef `"`coef'"' `bc' `i' + if `match' { + if `usedf' { + local b `bc'[`i',1] + local res `bc'[`i',`j'] + if `res'<. { + mat `res' = `res' * `abs'(`tr')`sq' + } + } + else { + local b `bc'[`i',`j'] + if `b'<. { + mat `b' = (`tr') + } + } + continue, break + } + gettoken coef coefrest : coefrest + gettoken tr trrest : trrest + } + } +end + +program MatchCoef + args eqx b i + if inlist(trim(`"`eqx'"'),"","*") { + c_local match 1 + exit + } + tempname tmp + mat `tmp' = `b'[`i',1...] + local eqi: roweq `tmp' + local xi: rown `tmp' + gettoken eq x : eqx, parse(:) + local eq: list clean eq + if `"`eq'"'==":" { // case 1: ":[varname]" + local x: list clean x + local eq + } + else if `"`x'"'=="" { // case 2: "varname" + local x `"`eq'"' + local eq + } + else { // case 3. "eqname:[varname]" + if `"`eq'"'=="_" local eq "__" + gettoken colon x : x, parse(:) + local x: list clean x + } + if `"`eq'"'=="" local eq "*" + if `"`x'"'=="" local x "*" + c_local match = match(`"`eqi'"', `"`eq'"') & match(`"`xi'"', `"`x'"') +end + +program NumberMlabels + args M mlabels + forv m = 1/`M' { + local num "(`m')" + local lab: word `m' of `macval(mlabels)' + if `"`macval(lab)'"'!="" { + local lab `"`num' `macval(lab)'"' + } + else local lab `num' + local labels `"`macval(labels)'`"`macval(lab)'"' "' + } + c_local mlabels `"`macval(labels)'"' +end + +program ModelEqCheck + args B eq m ccols + tempname Bsub + local a = (`m'-1)*`ccols'+1 + local b = `a' + `ccols'-1 + mat `Bsub' = `B'["`eq':",`a'..`b'] + local R = rowsof(`Bsub') + local value 0 + forv c = 1/`ccols' { + forv r = 1/`R' { + if `Bsub'[`r',`c']<. { + local value 1 + continue, break + } + } + } + c_local value `value' +end + +program Add2Vblock + args block col + foreach v of local col { + gettoken row block: block + local row "`row' `v'" + local row: list retok row + local vblock `"`vblock'"`row'" "' + } + c_local vblock `"`vblock'"' +end + +program CountNofEqs + args ms es + local m0 0 + local e0 0 + local i 0 + local eqs 0 + foreach m of local ms { + local ++i + local e: word `i' of `es' + if `m'!=`m0' | `e'!=`e0' { + local ++eqs + } + local m0 `m' + local e0 `e' + } + c_local value `eqs' +end + +program InsertAtVariables + args value type span M E width hline rtf rtfrowdefbrdrt rtfrowdefbrdrb rtfrowdef rtfemptyrow /// + title note discrete starlegend + if `type'==1 local atvars span + else { + local atvars span M E width hline + if `rtf' local atvars `atvars' rtfrowdefbrdrt rtfrowdefbrdrb rtfrowdef rtfemptyrow + if `type'!=2 local atvars `atvars' title note discrete starlegend + } + foreach atvar of local atvars { + StableSubinstr value `"`macval(value)'"' "@`atvar'" `"`macval(`atvar')'"' all + } + c_local value `"`macval(value)'"' +end + +program Abbrev + args width value abbrev + if c(stata_version)>=14 { + local substr udsubstr + local length udstrlen + } + else { + local substr substr + local length length + } + if "`abbrev'"!="" { + if `width'>32 { + local value = `substr'(`"`macval(value)'"',1,`width') + } + else if `width'>0 { + if `length'(`"`macval(value)'"')>`width' { + local value = abbrev(`"`macval(value)'"',`width') + } + } + } + c_local value `"`macval(value)'"' +end + +program MgroupsPattern + args mrow pattern + local i 0 + local m0 0 + local j 0 + foreach m of local mrow { + if `m'>=. { + local newpattern `newpattern' . + continue + } + if `m'!=`m0' { + local p: word `++i' of `pattern' + if `i'==1 local p 1 + if "`p'"=="1" local j = `j' + 1 + } + local newpattern `newpattern' `j' + local m0 `m' + } + c_local mgroupspattern `newpattern' +end + +program WriteCaption + args file delimiter stardetach row rowtwo labels starsrow span /// + abbrev colwidth delwidth starwidth repeat prefix suffix haslabcol2 + local c 0 + local nspan 0 + local c0 = 2 + `haslabcol2' + local spanwidth -`delwidth' + local spanfmt + local ncolwidth: list sizeof colwidth + foreach r of local row { + local rtwo: word `++c' of `rowtwo' + local colwidthj: word `=1+mod(`c'-1,`ncolwidth')' of `colwidth' + if `colwidthj'>0 local colfmt "%`colwidthj's" + else local colfmt + if "`r'"=="." { + local ++c0 + file write `file' `macval(delimiter)' `colfmt' (`""') + } + else if `"`span'"'=="" { + if ( "`r'"!="`lastr'" | "`rtwo'"!="`lastrtwo'" | `"`rowtwo'"'=="" ) { + local value: word `r' of `macval(labels)' + Abbrev `colwidthj' `"`macval(value)'"' "`abbrev'" + local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"' + InsertAtVariables `"`macval(value)'"' 1 "1" + } + else local value + if `:length local value'<245 { + local value: di `colfmt' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + if `:word `c' of `starsrow''==1 { + file write `file' `macval(stardetach)' _skip(`starwidth') + } + local lastr "`r'" + local lastrtwo "`rtwo'" + } + else { + local ++nspan + local spanwidth=`spanwidth'+`colwidthj'+`delwidth' + if `:word `c' of `starsrow''==1 { + local spanwidth = `spanwidth' + `starwidth' + if `"`macval(stardetach)'"'!="" { + local ++nspan + local spanwidth = `spanwidth' + `delwidth' + } + } + local nextrtwo: word `=`c'+1' of `rowtwo' + local nextr: word `=`c'+1' of `row' + if "`r'"!="." & /// + ("`r'"!="`nextr'" | "`rtwo'"!="`nextrtwo'" | `"`rowtwo'"'=="") { + local value: word `r' of `macval(labels)' + Abbrev `spanwidth' `"`macval(value)'"' "`abbrev'" + local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"' + InsertAtVariables `"`macval(value)'"' 1 "`nspan'" + if `spanwidth'>0 local spanfmt "%-`spanwidth's" + if `:length local value'<245 { + local value: di `spanfmt' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + InsertAtVariables `"`macval(repeat)'"' 1 "`c0'-`=`c0'+`nspan'-1'" + local repeatlist `"`macval(repeatlist)'`macval(value)'"' + local c0 = `c0' + `nspan' + local nspan 0 + local spanwidth -`delwidth' + } + } + } + c_local value `"`macval(repeatlist)'"' +end + +program WriteBegin + args file pre begin post + foreach line of local pre { + file write `file' `newline' `"`macval(line)'"' + local newline _n + } + file write `file' `macval(begin)' `macval(post)' +end + +program WriteEnd + args file end post post2 + file write `file' `macval(end)' + WriteStrLines `"`file'"' `"`macval(post)'"' + WriteStrLines `"`file'"' `"`macval(post2)'"' + file write `file' _n +end + +program WriteStrLines + args file lines + foreach line of local lines { + file write `file' `newline' `"`macval(line)'"' + local newline _n + } +end + +program WriteEqrow + args file delimiter stardetach value row span vwidth fmt_v /// + abbrev mwidth delwidth starwidth prefix suffix /// + haslabcol2 labcolwidth fmt_l2 + local nspan 1 + local spanwidth `vwidth' + local spanfmt + local c 0 + local nmwidth: list sizeof mwidth + if `"`span'"'=="" { + Abbrev `vwidth' `"`macval(value)'"' "`abbrev'" + local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"' + InsertAtVariables `"`macval(value)'"' 1 "1" + if `:length local value'<245 { + local value: di `fmt_v' `"`macval(value)'"' + } + file write `file' `"`macval(value)'"' + if `haslabcol2' { + file write `file' `macval(delimiter)' `fmt_l2' ("") + } + foreach r of local row { + local mwidthj: word `=1+mod(`c++',`nmwidth')' of `mwidth' + if `mwidthj'>0 local fmt_m "%`mwidthj's" + else local fmt_m + file write `file' `macval(delimiter)' `fmt_m' ("") + if `r'==1 { + file write `file' `macval(stardetach)' _skip(`starwidth') + } + } + } + else { + if `haslabcol2' { + local ++nspan + local spanwidth = `spanwidth' + `delwidth' + `labcolwidth' + } + foreach r of local row { + local mwidthj: word `=1+mod(`c++',`nmwidth')' of `mwidth' + local ++nspan + local spanwidth = `spanwidth' + `delwidth' + `mwidthj' + if `r'==1 { + local spanwidth = `spanwidth' + `starwidth' + if `"`macval(stardetach)'"'!="" { + local ++nspan + local spanwidth = `spanwidth' + `delwidth' + } + } + } + Abbrev `spanwidth' `"`macval(value)'"' "`abbrev'" + local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"' + InsertAtVariables `"`macval(value)'"' 1 "`nspan'" + if `spanwidth'>0 local spanfmt "%-`spanwidth's" + if `:length local value'<245 { + local value: di `spanfmt' `"`macval(value)'"' + } + file write `file' `"`macval(value)'"' + } +end + +prog WriteStrRow + args file mrow eqrow neq labels delimiter stardetach starsrow /// + abbrev colwidth delwidth starwidth + local c 0 + local ncolwidth: list sizeof colwidth + foreach mnum of local mrow { + local eqnum: word `++c' of `eqrow' + local colwidthj: word `=1+mod(`c'-1,`ncolwidth')' of `colwidth' + if `colwidthj'>0 local colfmt "%`colwidthj's" + else local colfmt + if "`mnum'"=="." { + file write `file' `macval(delimiter)' `colfmt' (`""') + continue + } + if ( "`mnum'"!="`lastmnum'" | "`eqnum'"!="`lasteqnum'" ) { + local value: word `=(`mnum'-1)*`neq'+`eqnum'' of `macval(labels)' + Abbrev `colwidthj' `"`macval(value)'"' "`abbrev'" + } + else local value + if `:length local value'<245 { + local value: di `colfmt' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + if `:word `c' of `starsrow''==1 { + file write `file' `macval(stardetach)' _skip(`starwidth') + } + local lastmnum "`mnum'" + local lasteqnum "`eqnum'" + } +end + +program VarInList + args var unstack eqvar eq list + local value + local L: word count `macval(list)' + forv l = 1(2)`L' { + local lvar: word `l' of `macval(list)' + local lab: word `=`l'+1' of `macval(list)' + if "`unstack'"!="" { + if `"`var'"'==`"`lvar'"' { + local value `"`macval(lab)'"' + continue, break + } + } + else { + if substr(`"`lvar'"', 1, 2)=="_:" local lvar `"_`lvar'"' + if inlist(`"`lvar'"',`"`var'"',`"`eqvar'"',`"`eq':"') { + local value `"`macval(lab)'"' + continue, break + } + } + } + c_local value `"`macval(value)'"' +end + +program vFormat + args value fmt lz dmarker msign par + if substr(`"`fmt'"',1,1)=="a" { + SignificantDigits `fmt' `value' + } + else { + capt confirm integer number `fmt' + if !_rc { + local fmt %`=`fmt'+9'.`fmt'f + } + } + else if `"`fmt'"'=="%g" | `"`fmt'"'=="g" local fmt "%9.0g" + else if substr(`"`fmt'"',1,1)!="%" { + di as err `"`fmt': invalid format"' + exit 198 + } + local value: di `fmt' `value' + local value: list retok value + if "`lz'"=="" { + if index("`value'","0.")==1 | index("`value'","-0.") { + local value: subinstr local value "0." "." + } + } + if `"`macval(dmarker)'"'!="" { + if "`: set dp'"=="comma" local dp , + else local dp . + local val: subinstr local value "`dp'" `"`macval(dmarker)'"' + } + else local val `"`value'"' + if `"`msign'"'!="" { + if index("`value'","-")==1 { + local val: subinstr local val "-" `"`macval(msign)'"' + } + } + if `"`par'"'!="" { + tokenize `"`macval(par)'"' + local val `"`macval(1)'`macval(val)'`macval(2)'"' + } + c_local value `"`macval(val)'"' +end + +program SignificantDigits // idea stolen from outreg2.ado + args fmt value + local d = substr("`fmt'", 2, .) + if `"`d'"'=="" local d 3 + capt confirm integer number `d' + if _rc { + di as err `"`fmt': invalid format"' + exit 198 + } +// missing: format does not matter + if `value'>=. local fmt "%9.0g" +// integer: print no decimal places + else if (`value'-int(`value'))==0 { + local fmt "%12.0f" + } +// value in (-1,1): display up to 9 decimal places with d significant +// digits, then switch to e-format with d-1 decimal places + else if abs(`value')<1 { + local right = -int(log10(abs(`value'-int(`value')))) // zeros after dp + local dec = max(1,`d' + `right') + if `dec'<=9 { + local fmt "%12.`dec'f" + } + else { + local fmt "%12.`=min(9,`d'-1)'e" + } + } +// |values|>=1: display d+1 significant digits or more with at least one +// decimal place and up to nine digits before the decimal point, then +// switch to e-format + else { + local left = int(log10(abs(`value'))+1) // digits before dp + if `left'<=9 { + local fmt "%12.`=max(1,`d' - `left' + 1)'f" + } + else { + local fmt "%12.0e" // alternatively: "%12.`=min(9,`d'-1)'e" + } + } + c_local fmt "`fmt'" +end + +program Stars + args starlevels P + if inrange(`P',0,1) { + local nstar: word count `macval(starlevels)' + forv i=1(2)`nstar' { + local istarsym: word `i' of `macval(starlevels)' + local istar: word `=`i'+1' of `macval(starlevels)' + if `istar'<=`P' continue, break + local value "`macval(istarsym)'" + } + } + c_local value `"`macval(value)'"' +end + +program CellStars + args starlevels P par + Stars `"`macval(starlevels)'"' `P' + if `"`par'"'!="" { + tokenize `"`macval(par)'"' + local value `"`macval(1)'`macval(value)'`macval(2)'"' + } + c_local value `"`macval(value)'"' +end + +prog MakeSign + args value msign par starlevels P + if "`P'"!="" { + local factor = 0 + while 1 { + gettoken istar starlevels : starlevels + gettoken istar starlevels : starlevels + if `"`istar'"'=="" continue, break + if `P'<`istar' local factor = `factor' + 1 + else if `istar'==1 local factor = 1 + } + } + else local factor 1 + if `"`macval(msign)'"'=="" local msign "-" + if `value'<0 { + local val: di _dup(`factor') `"`macval(msign)'"' + } + else if `value'==0 local val: di _dup(`factor') "0" + else if `value'>0 & `value'<. local val: di _dup(`factor') "+" + else local val `value' + if `"`par'"'!="" { + tokenize `"`macval(par)'"' + local val `"`macval(1)'`macval(val)'`macval(2)'"' + } + c_local value `"`macval(val)'"' +end + +program DropOrKeep + args type b spec // type=0: drop; type=1: keep + capt confirm matrix `b' + if _rc { + exit + } + tempname res bt + local R = rowsof(`b') + forv i=1/`R' { + local hit 0 + mat `bt' = `b'[`i',1...] + foreach sp of local spec { + if rownumb(`bt', `"`sp'"')==1 { + local hit 1 + continue, break + } + } + if `hit'==`type' mat `res' = nullmat(`res') \ `bt' + } + capt mat drop `b' + capt mat rename `res' `b' +end + +program Order + args b spec + capt confirm matrix `b' + if _rc { + exit + } + tempname bt res + local eqlist: roweq `b', q + local eqlist: list uniq eqlist + mat `bt' = `b' + gettoken spi rest : spec + while `"`spi'"'!="" { + gettoken spinext rest : rest + if !index(`"`spi'"',":") { + local vars `"`vars'`"`spi'"' "' + if `"`spinext'"'!="" & !index(`"`spinext'"',":") { + local spi `"`spinext'"' + continue + } + foreach eq of local eqlist { + foreach var of local vars { + local splist `"`splist'`"`eq':`var'"' "' + } + local splist `"`splist'`"`eq':"' "' // rest + } + local vars + } + else local splist `"`spi'"' + gettoken sp splist : splist + while `"`sp'"'!="" { + local isp = rownumb(`bt', "`sp'") + if `isp' >= . { + gettoken sp splist : splist + continue + } + while `isp' < . { + mat `res' = nullmat(`res') \ `bt'[`isp',1...] + local nb = rowsof(`bt') + if `nb' == 1 { // no rows left in `bt' + capt mat drop `b' + capt mat rename `res' `b' + exit + } + if `isp' == 1 { + mat `bt' = `bt'[2...,1...] + } + else if `isp' == `nb' { + mat `bt' = `bt'[1..`=`nb'-1',1...] + } + else { + mat `bt' = `bt'[1..`=`isp'-1',1...] \ `bt'[`=`isp'+1'...,1...] + } + local isp = rownumb(`bt', "`sp'") + } + gettoken sp splist : splist + } + local spi `"`spinext'"' + } + capt mat `res' = nullmat(`res') \ `bt' + capt mat drop `b' + capt mat rename `res' `b' +end + +prog MakeQuotedFullnames + args names eqs + foreach name of local names { + gettoken eq eqs : eqs + local value `"`value'`"`eq':`name'"' "' + } + c_local value: list clean value +end + +program define QuotedRowNames + args matrix + capt confirm matrix `matrix' + if _rc { + c_local value "" + exit + } + tempname extract + if substr(`"`matrix'"',1,2)=="r(" { + local matrix0 `"`matrix'"' + tempname matrix + mat `matrix' = `matrix0' + } + local R = rowsof(`matrix') + forv r = 1/`R' { + mat `extract' = `matrix'[`r',1...] + local name: rownames `extract' + local value `"`value'`"`name'"' "' + } + c_local value: list clean value +end + +prog EqReplaceCons + args names eqlist eqlabels varlabels + local skip 0 + foreach v of local varlabels { + if `skip' { + local skip 0 + continue + } + local vlabv `"`vlabv'`"`v'"' "' + local skip 1 + } + local deqs: list dups eqlist + local deqs: list uniq deqs + local i 0 + foreach eq of local eqlist { + local ++i + if `"`eq'"'!=`"`last'"' { + gettoken eqlab eqlabels : eqlabels + } + local last `"`eq'"' + if `:list eq in deqs' | `"`eq'"'=="__" continue + local name: word `i' of `names' + local isinvlabv: list posof `"`eq':`name'"' in vlabv + if `"`name'"'=="_cons" & `isinvlabv'==0 { + local value `"`value'`space'`"`eq':`name'"' `"`eqlab'"'"' + local space " " + } + } + c_local value `"`value'"' +end + +prog UniqEqsAndDims + local n 0 + foreach el of local 1 { + if `"`macval(el)'"'!=`"`macval(last)'"' { + if `n'>0 local eqsdims "`eqsdims' `n'" + local eqs `"`macval(eqs)' `"`macval(el)'"'"' + local n 0 + } + local ++n + local last `"`macval(el)'"' + } + local eqsdims "`eqsdims' `n'" + c_local eqsdims: list clean eqsdims + c_local eqs: list clean eqs +end + +prog RerrangeEqs + args B eqlist eqs + local equ: list uniq eqlist + if `: list sizeof equ'==`: list sizeof eqs' exit // equations are in order + tempname C + foreach eq of local equ { + local i 0 + foreach eqi of local eqlist { + local ++i + if `"`eq'"'!="`eqi'" continue + mat `C' = nullmat(`C') \ `B'[`i',1...] + } + } + matrix drop `B' + matrix rename `C' `B' + local eqlist: roweq `B', q + local eqlist: list clean eqlist + UniqEqsAndDims `"`eqlist'"' + c_local eqlist `"`eqlist'"' + c_local eqs `"`eqs'"' + c_local eqsdims `"`eqsdims'"' +end + +prog InsertAtCols + args colnums row symb + if `"`symb'"'=="" local symb . + gettoken c rest : colnums + local i 0 + foreach r of local row { + local ++i + while `"`c'"'!="" { + if `c'<=`i' { + local value `"`value' `symb'"' + gettoken c rest : rest + } + else continue, break + } + local value `"`value' `"`r'"'"' + } + while `"`c'"'!="" { + local value `"`value' `symb'"' + gettoken c rest : rest + } + c_local value: list clean value +end + +prog GetVarnamesFromOrder + foreach sp of local 1 { + if index(`"`sp'"', ":") { + gettoken trash sp: sp, parse(:) + if `"`trash'"'!=":" { + gettoken trash sp: sp, parse(:) + } + } + local value `"`value'`space'`sp'"' + local space " " + } + c_local value `"`value'"' +end + +prog ParseIndicateOpts + syntax [anything(equalok)] [, Labels(str asis) ] + gettoken tok rest : anything, parse(" =") + while `"`macval(tok)'"'!="" { + if `"`macval(tok)'"'=="=" { + local anything `"`"`macval(anything)'"'"' + continue, break + } + gettoken tok rest : rest, parse(" =") + } + c_local indicate `"`macval(anything)'"' + c_local indicatelabels `"`macval(labels)'"' +end + +prog ProcessIndicateGrp + args i B nmodels ccols unstack yesno indicate + gettoken yes no : yesno + gettoken no : no + gettoken tok rest : indicate, parse(=) + while `"`macval(tok)'"'!="" { + if `"`macval(rest)'"'=="" { + local vars `"`indicate'"' + continue, break + } + if `"`macval(tok)'"'=="=" { + local vars `"`rest'"' + continue, break + } + local name `"`macval(name)'`space'`macval(tok)'"' + local space " " + gettoken tok rest : rest, parse(=) + } + if `"`macval(name)'"'=="" { + local name: word 1 of `"`vars'"' + } + ExpandEqVarlist `"`vars'"' `B' + local evars `"`value'"' + IsInModels `B' `nmodels' `ccols' "`unstack'" `"`macval(yes)'"' `"`macval(no)'"' `"`evars'"' + local lbls `"`macval(value)'"' + DropOrKeep 0 `B' `"`evars'"' + c_local indicate`i'name `"`macval(name)'"' + c_local indicate`i'lbls `"`macval(lbls)'"' + c_local indicate`i'eqs `"`eqs'"' +end + +prog IsInModels + args B nmodels ccols unstack yes no vars + capt confirm matrix `B' + if _rc { + forv i = 1/`nmodels' { + local lbls `"`macval(lbls)' `"`macval(no)'"'"' + } + c_local value `"`macval(lbls)'"' + if `"`unstack'"'!="" { + c_local eqs "__" + } + exit + } + local eqs: roweq `B', q + local eqs: list uniq eqs + tempname Bt Btt Bttt + forv j = 1/`nmodels' { + local stop 0 + mat `Bt' = `B'[1..., (`j'-1)*`ccols' + 1] + foreach eq of local eqs { + mat `Btt' = `Bt'[`"`eq':"',1] + if `"`unstack'"'!="" local stop 0 + foreach var of local vars { + if !index(`"`var'"',":") { + local var `"`eq':`var'"' + } + capt mat `Bttt' = `Btt'["`var'",1] + if _rc continue + forv i = 1/`= rowsof(`Bttt')' { + if `Bttt'[`i',1]<.z { + local lbls `"`macval(lbls)' `"`macval(yes)'"'"' + local stop 1 + continue, break + } + } + if `stop' continue, break + } + if `"`unstack'"'!="" { + if `stop'==0 { + local lbls `"`macval(lbls)' `"`macval(no)'"'"' + } + } + else if `stop' continue, break + } + if `"`unstack'"'=="" & `stop'==0 { + local lbls `"`macval(lbls)' `"`macval(no)'"'"' + } + } + c_local value `"`macval(lbls)'"' + if `"`unstack'"'!="" { + c_local eqs `"`eqs'"' + } +end + +prog ReorderEqsInIndicate + args nmodels eqs ieqs lbls + local neq: list sizeof ieqs + foreach eq of local eqs { + local i: list posof `"`eq'"' in ieqs + if `i' { + local pos `pos' `i' + } + } + forv m=1/`nmodels' { + foreach i of local pos { + local mi = (`m'-1)*`neq' + `i' + local lbl: word `mi' of `macval(lbls)' + local value `"`macval(value)'`"`macval(lbl)'"' "' + } + } + c_local value `"`macval(value)'"' +end + +prog ParseRefcatOpts + syntax [anything(equalok)] [, NOLabel Label(str) Below ] + c_local refcatbelow "`below'" + c_local norefcatlabel "`nolabel'" + c_local refcatlabel `"`macval(label)'"' + c_local refcat `"`macval(anything)'"' +end + +prog PrepareRefcat + gettoken coef rest : 1 + gettoken name rest : rest + while `"`macval(coef)'"'!="" { + local coefs `"`coefs'`"`coef'"' "' + local names `"`macval(names)'`"`macval(name)'"' "' + gettoken coef rest : rest + gettoken name rest : rest + } + c_local refcatcoefs `"`coefs'"' + c_local refcatnames `"`macval(names)'"' +end + +prog GenerateRefcatRow + args B ccols var eqs label + local models: coleq `B', q + local models: list uniq models + local col 1 + foreach model of local models { + foreach eq of local eqs { + local eqvar `"`eq':`var'"' + local row = rownumb(`B',"`eqvar'") + if `B'[`row', `col']<.z { + local value `"`macval(value)'`"`macval(label)'"' "' + } + else { + local value `"`macval(value)'`""' "' + } + } + local col = `col' + `ccols' + } + c_local value `"`macval(value)'"' +end + +prog ParseTransformSubopts + syntax anything(equalok) [, Pattern(string) ] + c_local transform `"`anything'"' + c_local transformpattern "`pattern'" +end + +prog MakeTransformList + args B transform + local R = rowsof(`B') + if `:list sizeof transform'<=2 { + gettoken f rest : transform + gettoken df : rest + forv i = 1/`R' { + local valuef `"`valuef'`f' "' + local valuedf `"`valuedf'`df' "' + } + c_local valuef: list retok valuef + c_local valuedf: list retok valuedf + exit + } + gettoken coef rest : transform + gettoken f rest : rest + gettoken df rest : rest + while (`"`coef'"'!="") { + if (`"`df'`rest'"'!="") { // last element of list may be without coef + ExpandEqVarlist `"`coef'"' `B' + local coef `"`value'"' + } + local coefs `"`coefs'`"`coef'"' "' + local fs `"`fs'`"`f'"' "' + local dfs `"`dfs'`"`df'"' "' + gettoken coef rest : rest + gettoken f rest : rest + gettoken df rest : rest + } + tempname b + local value + forv i = 1/`R' { + mat `b' = `B'[`i',1...] + local i 0 + local hit 0 + foreach coef of local coefs { + local f: word `++i' of `fs' + local df: word `i' of `dfs' + if (`"`df'`rest'"'=="") { + local valuef `"`valuef'`"`coef'"' "' // sic! (see above) + local valuedf `"`valuedf'`"`f'"' "' + local hit 1 + continue, break + } + foreach c of local coef { + if rownumb(`b', `"`c'"')==1 { + local valuef `"`valuef'`"`f'"' "' + local valuedf `"`valuedf'`"`df'"' "' + local hit 1 + continue, break + } + } + if `hit' continue, break + } + if `hit'==0 { + local valuef `"`valuef'"" "' + local valuedf `"`valuedf'"" "' + } + } + c_local valuef: list retok valuef + c_local valuedf: list retok valuedf +end + +prog TableIsAMess + local ccols = r(ccols) + local eq: roweq r(coefs), q + local eq: list uniq eq + if `: list sizeof eq'<=1 { + c_local value 0 + exit + } + tempname b bt + mat `b' = r(coefs) + gettoken eq : eq + mat `b' = `b'[`"`eq':"', 1...] + local R = rowsof(`b') + local models: coleq `b', q + local models: list uniq models + local value 0 + local i = 1 - `ccols' + foreach model of local models { + local i = `i' + `ccols' + if `i'==1 continue // skip first model + mat `bt' = `b'[1...,`i'] + local allz 1 + forv r = 1/`R' { + if `bt'[`r',1]<.z { + local allz 0 + continue, break + } + } + if `allz' { + local value 1 + continue, break + } + } + c_local value `value' +end + +prog ExpandEqVarlist + args list B append + ParseEqVarlistRelax `list' + QuotedRowNames `B' + local coefs `"`value'"' + local value + local ucoefs: list uniq coefs + capt confirm matrix `B' + if _rc==0 { + local eqs: roweq `B', q + } + else local eqs "__" + local ueqs: list uniq eqs + while `"`list'"'!="" { +// get next element + local eq0 + gettoken eqx list : list +// separate eq and x + gettoken eq x : eqx, parse(:) + local eq: list clean eq + if `"`eq'"'==":" { // case 1: ":[varname]" + local x: list clean x + local eq + } + else if `"`x'"'=="" { // case 2: "varname" + local x `"`eq'"' + local eq + } + else { // case 3. "eqname:[varname]" + local eq0 `"`eq'"' // eq specified by user + if `"`eq'"'=="_" local eq "__" + gettoken colon x : x, parse(:) + local x: list clean x + } +// match equations + local eqmatch + if `:list eq in ueqs' { // (note: evaluates to 1 if eq empty) + local eqmatch `"`eq'"' + } + else { + foreach e of local ueqs { + if match(`"`e'"', `"`eq'"') { + local eqmatch `"`eqmatch' `"`e'"'"' + } + } + if `"`eqmatch'"'=="" & "`relax'"=="" { + if !("`append'"!="" & `"`x'"'!="") { + di as err `"equation `eq0' not found"' + exit 111 + } + } + local eqmatch: list clean eqmatch + } + if `"`x'"'=="" { + foreach e of local eqmatch { + local value `"`value' `"`e':"'"' + } + continue + } +// match coefficients + local vlist +// - without equation + if `"`eq'"'=="" { + if `:list x in ucoefs' { + local value `"`value' `"`x'"'"' + continue + } + foreach coef of local ucoefs { + if match(`"`coef'"', `"`x'"') { + local vlist `"`vlist' `"`coef'"'"' + } + } + if `"`vlist'"'=="" { + if "`append'"!="" { + local appendlist `"`appendlist' `"__:`x'"'"' + local value `"`value' `"`x'"'"' + } + else if "`relax'"=="" { + di as err `"coefficient `x' not found"' + exit 111 + } + } + else { + local value `"`value' `vlist'"' + } + continue + } +// - within equations + local rest `"`eqs'"' + foreach coef of local coefs { + gettoken e rest : rest + if !`:list e in eqmatch' { + continue + } + if match(`"`coef'"', `"`x'"') { + local vlist `"`vlist' `"`e':`coef'"'"' + } + } + if `"`vlist'"'=="" { + if "`append'"!="" { + local appendlist `"`appendlist' `"`eq':`x'"'"' + local value `"`value' `"`eq':`x'"'"' + } + else if "`relax'"=="" { + di as err `"coefficient `eq0':`x' not found"' + exit 111 + } + } + else { + local value `"`value' `vlist'"' + } + } + if "`append'"!="" { + local nappend : list sizeof appendlist + if `nappend'>0 { + capt confirm matrix `B' + if _rc==0 { + tempname tmp + mat `tmp' = J(`nappend', colsof(`B'), .z) + mat rown `tmp' = `appendlist' + matrix `B' = `B' \ `tmp' + } + } + } + c_local value: list clean value +end + +program ParseEqVarlistRelax + syntax [anything] [, Relax ] + c_local list `"`anything'"' + c_local relax `relax' +end + +program IsInString //, rclass + args needle haystack + local trash: subinstr local haystack `"`needle'"' "", count(local count) + c_local strcount = `count' +end + +program MakeRtfRowdefs + args str srow sdetach vwidth mwidth haslc2 lc2width + local factor 120 + ParseRtfcmdNum `"`str'"' "trgaph" 0 + ParseRtfcmdNum `"`str'"' "trleft" 0 + if `vwidth'<=0 local vwidth 12 + if real(`"`trgaph'"')>=. local trgaph 0 + if real(`"`trleft'"')>=. local trleft 0 + local swidth = 3 + local vtwips = `vwidth'*`factor' + local stwips = `swidth'*`factor' + local ipos = `vtwips' + 2*`trgaph' + (`trleft') + local brdrt "\clbrdrt\brdrw10\brdrs" + local brdrb "\clbrdrb\brdrw10\brdrs" + local emptycell "\pard\intbl\ql\cell" + local rtfdef "\cellx`ipos'" + local rtfdefbrdrt "`brdrt'\cellx`ipos'" + local rtfdefbrdrb "`brdrb'\cellx`ipos'" + local rtfrow "`emptycell'" + if `haslc2' { + if `lc2width'<=0 local lc2width 12 + local lc2twips = `lc2width'*`factor' + local ipos = `ipos' + `lc2twips' + 2*`trgaph' + local rtfdef "`rtfdef'\cellx`ipos'" + local rtfdefbrdrt "`rtfdefbrdrt'`brdrt'\cellx`ipos'" + local rtfdefbrdrb "`rtfdefbrdrb'`brdrb'\cellx`ipos'" + local rtfrow "`rtfrow'`emptycell'" + } + local j 0 + local nmwidth: list sizeof mwidth + foreach i of local srow { + local mwidthj: word `=1 + mod(`j++',`nmwidth')' of `mwidth' + if `mwidthj'<=0 local mwidthj 12 + local mtwips = `mwidthj'*`factor' + local ipos = `ipos' + `mtwips' + 2*`trgaph' + if `i' & "`sdetach'"=="" local ipos = `ipos' + `stwips' + local rtfdef "`rtfdef'\cellx`ipos'" + local rtfdefbrdrt "`rtfdefbrdrt'`brdrt'\cellx`ipos'" + local rtfdefbrdrb "`rtfdefbrdrb'`brdrb'\cellx`ipos'" + local rtfrow "`rtfrow'`emptycell'" + if `i' & "`sdetach'"!="" { + local ipos = `ipos' + `stwips' + 2*`trgaph' + local rtfdef "`rtfdef'\cellx`ipos'" + local rtfdefbrdrt "`rtfdefbrdrt'`brdrt'\cellx`ipos'" + local rtfdefbrdrb "`rtfdefbrdrb'`brdrb'\cellx`ipos'" + local rtfrow "`rtfrow'`emptycell'" + } + } + c_local rtfrowdef "`rtfdef'" + c_local rtfrowdefbrdrt "`rtfdefbrdrt'" + c_local rtfrowdefbrdrb "`rtfdefbrdrb'" + c_local rtfemptyrow "`rtfdef'`rtfrow'" +end + +prog ParseRtfcmdNum + args str cmd default + local pos = index(`"`str'"', `"\\`cmd'"') + if `pos' { + local pos = `pos' + strlen(`"`cmd'"') + 1 + local digit = substr(`"`str'"',`pos',1) + if `"`digit'"'=="-" { + local value "`digit'" + local digit = substr(`"`str'"',`++pos',1) + } + while real(`"`digit'"')<. { + local value "`value'`digit'" + local digit = substr(`"`str'"',`++pos',1) + } + } + local value = real(`"`value'"') + if `value'>=. local value = `default' + c_local `cmd' `"`value'"' +end + +prog ParseLabCol2 + syntax [anything(equalok)] [ , Title(str asis) Width(numlist max=1 int >=0) ] + c_local labcol2 `"`macval(anything)'"' + c_local labcol2title `"`macval(title)'"' + c_local labcol2width `"`width'"' +end + +prog StableSubinstr + // use mata in stata>=9 because -:subinstr- breaks if length of + // is more than 502 characters + args new old from to all word + if c(stata_version)>=9 { + if "`all'"=="all" local cnt . + else if "`all'"=="" local cnt 1 + else error 198 + if "`word'"=="" local word str + else if "`word'"!="word" error 198 + mata: st_local("tmp", subin`word'(st_local("old"), /// + st_local("from"), st_local("to"), `cnt')) + c_local `new' `"`macval(tmp)'"' + } + else { + capt local tmp: subinstr local old `"`macval(from)'"' /// + `"`macval(to)'"', `all' `word' + if _rc==0 { + c_local `new' `"`macval(tmp)'"' + } + } +end + +prog MakeMMDdef + args varw labcol2 labcol2w modelw starsrow stardetachon starw + if "`varw'"=="0" | "`varw'"=="" local varw 1 + if "`labcol2w'"=="0" | "`labcol2w'"=="" local labcol2w 1 + if "`modelw'"=="0" | "`modelw'"=="" local modelw 1 + if "`starw'"=="0" | "`starw'"=="" local starw 1 + local varw = max(1,`varw') + local labcol2w = max(1,`labcol2w'-2) + if "`stardetachon'"=="1" local starw = max(1,`starw'-2) + else local starw = max(1,`starw') + + local mmddef `"| `:di _dup(`varw') "-"'"' + if "`labcol2'"=="1" { + local mmddef `"`mmddef' | :`:di _dup(`labcol2w') "-"':"' + } + local nmodelw: list sizeof modelw + local c 0 + foreach col of local starsrow { + local modelwj: word `=1+mod(`c++',`nmodelw')' of `modelw' + local modelwj = max(1,`modelwj'-2) + local mmddef `"`mmddef' | :`:di _dup(`modelwj') "-"'"' + if "`col'"=="1" { + if "`stardetachon'"=="1" { + local mmddef `"`mmddef': | :"' + } + local mmddef `"`mmddef'`:di _dup(`starw') "-"'"' + } + local mmddef `"`mmddef':"' + } + c_local value `"`mmddef' |"' +end + +program MatrixMode, rclass + capt syntax [, Matrix(str asis) e(str asis) r(str asis) rename(str asis) ] + if _rc | `"`matrix'`e'`r'"'=="" { + c_local matrixmode 0 + exit + } + if ((`"`matrix'"'!="") + (`"`e'"'!="") + (`"`r'"'!=""))>1 { + di as err "only one of matrix(), e(), or r() allowed" + exit 198 + } + ParseMatrixOpt `matrix'`e'`r' + if `"`e'"'!="" { + local name "e(`name')" + } + else if `"`r'"'!="" { + local name "r(`name')" + } + confirm matrix `name' + tempname bc + if "`transpose'"=="" { + mat `bc' = `name'' + } + else { + mat `bc' = `name' + } + QuotedRowNames `bc' + local rnames `"`value'"' + local eqs: roweq `bc', q + mat `bc' = `bc'' + local cols = colsof(`bc') + local cells + local space + gettoken fmti fmtrest : fmt, match(par) + gettoken rname rnames : rnames + gettoken eq eqs : eqs + forv i = 1/`cols' { + if `"`fmti'"'!="" { + local fmtopt `"f(`fmti') "' + gettoken fmti fmtrest : fmtrest, match(par) + if `"`fmti'"'=="" & `"`fmtrest'"'=="" { // recycle + gettoken fmti fmtrest : fmt, match(par) + } + } + else local fmtopt + if `"`eq'"'=="_" { + local lbl `"l(`"`rname'"')"' + } + else { + local lbl `"l(`"`eq':`rname'"')"' + } + local cells `"`cells'`space'c`i'(`fmtopt'`lbl')"' + local space " " + gettoken rname rnames : rnames + gettoken eq eqs : eqs + } + SubstEmptyEqname `bc' // replace empty eqname "_" by "__" + if `"`rename'"'!="" { + local rename : subinstr local rename "," "", all + RenameCoefs `bc' `"`rename'"' + } + return local names "`name'" + return scalar nmodels = 1 + return scalar ccols = `cols' + return matrix coefs = `bc' + c_local matrixmode 1 + c_local cells (`cells') +end + +program ParseMatrixOpt + syntax name [, Fmt(str asis) Transpose ] + c_local name `"`namelist'"' + c_local fmt `"`fmt'"' + c_local transpose `"`transpose'"' +end + +program CompileVarl + syntax [, vname(str asis) interaction(str) ] + gettoken vi vname: vname, parse("#") + while (`"`vi'"') !="" { + local xlabi + if `"`vi'"'=="#" { + local xlabi `"`macval(interaction)'"' + } + else if strpos(`"`vi'"',".")==0 { + capt confirm variable `vi', exact + if _rc==0 { + local xlabi: var lab `vi' + } + } + else { + gettoken li vii : vi, parse(".") + gettoken dot vii : vii, parse(".") + capt confirm variable `vii', exact + if _rc==0 { + capt confirm number `li' + if _rc { + local xlabi: var lab `vii' + if (`"`macval(xlabi)'"'=="") local xlabi `"`vii'"' + if substr(`"`li'"',1,1)=="c" /// + local li = substr(`"`li'"',2,.) + if (`"`li'"'!="") local xlabi `"`li'.`macval(xlabi)'"' + } + else { + local viilab : value label `vii' + if `"`viilab'"'!="" { + local xlabi: label `viilab' `li' + } + else { + local viilab: var lab `vii' + if (`"`macval(viilab)'"'=="") local viilab `"`vii'"' + local xlabi `"`macval(viilab)'=`li'"' + } + } + } + } + if `"`macval(xlabi)'"'=="" { + local xlabi `"`vi'"' + } + local xlab `"`macval(xlab)'`macval(xlabi)'"' + gettoken vi vname: vname, parse("#") + } + c_local varl `"`macval(xlab)'"' +end + +if c(stata_version)<11 exit +version 11 +mata: +mata set matastrict on + +void estout_omitted_and_base() +{ + real colvector p + real matrix bc + string matrix rstripe, cstripe + string colvector coefnm + + bc = st_matrix(st_local("bc")) + rstripe = st_matrixrowstripe(st_local("bc")) + cstripe = st_matrixcolstripe(st_local("bc")) + coefnm = rstripe[,2] + //coefnm = subinstr(coefnm,"bn.", ".") // *bn. + //coefnm = subinstr(coefnm,"bno.", "o.") // *bno. + p = J(rows(bc), 1, 1) + if (st_local("omitted")=="") { + p = p :* (!strmatch(coefnm, "*o.*")) + } + else { + coefnm = substr(coefnm, 1:+2*(substr(coefnm, 1, 2):=="o."), .) // o. + coefnm = subinstr(coefnm, "o.", ".") // *o. + } + if (st_local("baselevels")=="") { + p = p :* (!strmatch(coefnm, "*b.*")) + } + else { + coefnm = subinstr(coefnm, "b.", ".") // *b. + } + if (any(p)) { + st_matrix(st_local("bc"), select(bc, p)) + st_matrixrowstripe(st_local("bc"), select((rstripe[,1], coefnm), p)) + st_matrixcolstripe(st_local("bc"), cstripe) + st_local("hasbc", "1") + } + else { + st_local("hasbc", "0") + } +} + +void estout_rown_hasblanks(string scalar lnm, string rowvector m) +{ + real scalar j + + for (j=1;j<=2;j++) { + if (m[j]=="") return + if (any(strpos(st_matrixrowstripe(m[j])[,2], " "))) { + st_local(lnm, "1") + return + } + } +} + +void estout_mat_capp(string scalar m1, string rowvector m) +{ + real scalar i, j + string scalar key, val + string colvector rown + transmorphic A + + // replace rownames that contain blanks + A = asarray_create() + asarray_notfound(A, "") + for (j=1;j<=2;j++) { + rown = st_matrixrowstripe(m[j])[,2] + for (i=rows(rown);i;i--) { + val = rown[i] + if (strpos(val, " ")) { + key = subinstr(val, " ", "_") + asarray(A, key, val) + rown[i] = key + } + st_matrixrowstripe(m[j], (st_matrixrowstripe(m[j])[,1],rown)) + } + } + // apply mat_capp + stata("mat_capp " + st_local("0")) + // restore original names + rown = st_matrixrowstripe(m1)[,2] + for (i=rows(rown);i;i--) { + val = asarray(A, rown[i]) + if (val!="") rown[i] = val + } + st_matrixrowstripe(m1, (st_matrixrowstripe(m1)[,1], rown)) +} +end + +if c(stata_version)<14 exit +version 14 +mata: +mata set matastrict on + +void estout_rtfencode(string scalar lname) +{ // non-ASCII characters are translated to "\u#?" where # is the base 10 code + // (up to code 65535; replacement character is used for larger codes) + real scalar n, l, i, ci + real rowvector c + string scalar s, snew + string rowvector S + + s = st_local(lname) + if (isascii(s)) return + l = ustrlen(s) + snew = "" + for (n=1;n<=l;n=n+200) { + c = frombase(16, /// possible hex formats: \uhhhh or \Uhhhhhhhh + substr(tokens(subinstr(ustrtohex(s, n), "\", " ")), 2, .)) + i = length(c) + S = J(1,i,"") + for (;i;i--) { + ci = c[i] + if (ci<=127) S[i] = char(ci) + else if (ci<=32767) S[i] = "\u" + strofreal(ci) + "?" + else if (ci<=65535) S[i] = "\u" + strofreal(ci-65536) + "?" + else S[i] = "\u65533?" // unicode replacement character \ufffd + } + snew = snew + invtokens(S, "") + } + st_local(lname, snew) +} +end + diff --git a/ado/e/estout.hlp b/ado/e/estout.hlp new file mode 100644 index 0000000..7467156 --- /dev/null +++ b/ado/e/estout.hlp @@ -0,0 +1,2452 @@ +{smcl} +{* 01feb2017}{...} +{cmd:help estout}{right:also see: {helpb esttab}, {helpb eststo}, {helpb estadd}, {helpb estpost}} +{right: {browse "http://repec.sowi.unibe.ch/stata/estout/"}} +{hline} + +{title:Title} + +{p 4 4 2}{hi:estout} {hline 2} Making regression tables from stored estimates + + +{title:Table of contents} + + {help estout##syn:Syntax} + {help estout##des:Description} + {help estout##opt:Options} + {help estout##exa:Examples} + {help estout##rem:Remarks} + {help estout##ret:Saved results} + {help estout##ref:Backmatter} + +{marker syn} +{title:Syntax} + +{p 8 15 2} +{cmd:estout} [ {help estout##what:{it:what}} ] + [ {cmd:using} {it:filename} ] + [ {cmd:,} {help estout##opt0:{it:options}} ] + +{marker what} + {it:what}{col 30}description + {hline 70} + {it:namelist}{col 30}{...} +tabulate stored estimation sets; {it:namelist} is +{col 32}a name, a list of names, or {cmd:_all}; the {cmd:*} and +{col 32}{cmd:?} wildcards are allowed; a name may also be +{col 32}{cmd:.}, meaning the current (active) estimates + + {cmdab:m:atrix:(}{it:name}[{cmd:,} {it:subopts}]{cmd:)}{col 30}{...} +tabulate matrix {it:name} + {cmd:e(}{it:name}[{cmd:,} {it:subopts}]{cmd:)}{col 30}{...} +tabulate matrix {cmd:e(}{it:name}{cmd:)} + {cmd:r(}{it:name}[{cmd:,} {it:subopts}]{cmd:)}{col 30}{...} +tabulate matrix {cmd:r(}{it:name}{cmd:)} + {it:subopts}: + {helpb estout##mfmt:{ul:f}mt}{cmd:(}{it:fmtlist}{cmd:)}{col 30}{...} +set the display format(s) + {helpb estout##mtranspose:{ul:t}ranspose}{col 30}{...} +tabulate transposed matrix + {hline 70} + +{marker opt0} + {it:options}{col 38}description + {hline 70} + Parameter statistics + {helpb estout##cells:{ul:c}ells}{cmd:(}{it:elements and subopts}{cmd:)}{col 38}{...} +contents of the table cells, where +{col 40}an {it:element}'s {it:subopts} are in paren- +{col 40}theses, i.e. {it:element}[{cmd:(}{it:subopts}{cmd:)}] + {it:elements}: + {cmd:b}{col 38}raw coefficient (point estimate) + {cmd:se}{col 38}standard error + {cmd:var}{col 38}variance + {cmd:t}{col 38}t or z statistic + {cmd:z}{col 38}t or z statistic (synonym for {cmd:t}) + {cmd:p}{col 38}p-value + {cmd:ci}{col 38}confidence interval + {cmd:ci_l}{col 38}lower bound of confidence interval + {cmd:ci_u}{col 38}upper bound of confidence interval + {cmd:_star}{col 38}"significance stars" + {cmd:_sign}{col 38}sign of point estimate + {cmd:_sigsign}{col 38}sign and significance of estimate + {cmd:.}{col 38}null element (empty cell) + {cmd:&}{col 38}combine elements in single cell + {it:myel}{col 38}results from {cmd:e(}{it:myel}{cmd:)} + {it:myel}{cmd:[}{it:#}{cmd:]}{col 38}results from row {it:#} in {cmd:e(}{it:myel}{cmd:)} + {it:myel}{cmd:[}{it:rowname}{cmd:]}{col 38}results from row {it:rowname} in {cmd:e(}{it:myel}{cmd:)} + + + {it:subopts} (for each {it:element}, + except for {cmd:.} and {cmd:&}): + [{cmdab:no:}]{helpb estout##cstar:{ul:s}tar}{col 38}{...} +attach "significance stars" + {helpb estout##cfmt:{ul:f}mt}{cmd:(}{it:{help estout##fmt:fmt}} [{it:{help estout##fmt:fmt}} ...]{cmd:)}{col 38}{...} +set the display format(s) + {helpb estout##clabel:{ul:l}abel}{cmd:(}{it:string}{cmd:)}{col 38}{...} +define a label for {it:element} + {helpb estout##cpar:par}[{cmd:(}{it:l} {it:r}{cmd:)}] | {cmd:nopar}{col 38}{...} +place results in parentheses + {helpb estout##cvacant:{ul:v}acant}{cmd:(}{it:string}{cmd:)}{col 38}{...} +print {it:string} if coefficient is absent + {helpb estout##cdrop:{ul:d}rop}{cmd:(}{it:droplist}{cmd:)}{col 38}{...} +drop certain individual results + {helpb estout##ckeep:{ul:k}eep}{cmd:(}{it:keeplist}{cmd:)}{col 38}{...} +keep certain individual results + {helpb estout##cpattern:{ul:pat}tern}{cmd:(}{it:pattern}{cmd:)}{col 38}{...} +model selection + {helpb estout##cpvalue:{ul:pval}ue}{cmd:(}{it:name}{cmd:)}{col 38}{...} +set p-values for {cmd:star} (default: {cmd:p}) + [{cmd:no}]{helpb estout##cabs:abs}{col 38}{...} +use absolute t-statistics + [{cmdab:no:}]{helpb estout##ctranspose:{ul:t}ranspose}{col 38}{...} +transpose {cmd:e(}{it:myel}{cmd:)} for tabulation + + {helpb estout##drop:{ul:d}rop}{cmd:(}{it:droplist}{cmd:)}{col 38}{...} +drop individual coefficients + [{cmdab:no:}]{helpb estout##omitted:{ul:omit}ted}{col 38}{...} +include omitted coefficients + [{cmdab:no:}]{helpb estout##baselevels:{ul:base}levels}{col 38}{...} +include base levels + {helpb estout##keep:{ul:k}eep}{cmd:(}{it:keeplist}{cmd:)}{col 38}{...} +keep individual coefficients + {helpb estout##order:{ul:o}rder}{cmd:(}{it:orderlist}{cmd:)}{col 38}{...} +change order of coefficients + {helpb estout##indicate:{ul:i}ndicate}{cmd:(}{it:groups} [{cmd:,} {it:subopt}]{cmd:)}{col 38}{...} +indicate presence of parameters + {it:subopt}: {cmdab:l:abels(}{it:yes} {it:no}{cmd:)}{col 38}{...} +redefine "Yes" and "No" labels + {helpb estout##rename:{ul:ren}ame}{cmd:(}{it:old} {it:new} [{it:old} {it:new} ...]{cmd:)}{col 38}{...} +rename individual coefficients + {helpb estout##equations:{ul:eq}uations}{cmd:(}{it:eqmatchlist}{cmd:)}{col 38}{...} +match the models' equations + {helpb estout##eform:eform}[{cmd:(}{it:pattern}{cmd:)}] | {cmd:noeform}{col 38}{...} +report exponentiated coefficients + {helpb estout##transform:{ul:tr}ansform}{cmd:(}{it:list} [{cmd:,} {it:subopt}]{cmd:)}{col 38}{...} +apply transformations to coefficients + {it:subopt}: {cmdab:p:attern:(}{it:pattern}{cmd:)}]{cmd:)}{col 38}{...} +select models + {helpb estout##margin:{ul:m}argin}[{cmd:(}{cmd:u}|{cmd:c}|{cmd:p}{cmd:)}] | {cmdab:nom:argin}{col 38}{...} +report marginal effects after {helpb mfx} + {helpb estout##discrete:{ul:di}screte}{cmd:(}{it:string}{cmd:)} | {cmdab:nodi:screte}{col 38}{...} +identify 0/1 variables (if {cmd:margin}) + {helpb estout##meqs:{ul:meq}s}{cmd:(}{it:eq_list}{cmd:)}{col 38}{...} +select equations for marginal effects + {helpb estout##dropped:dropped}[{cmd:(}{it:string}{cmd:)}] | {cmd:nodropped}{col 38}{...} +indicate null coefficients as dropped + {helpb estout##level:level}{cmd:(}{it:#}{cmd:)}{col 38}{...} +set level for confidence intervals + + Summary statistics + {helpb estout##stats:{ul:s}tats}{cmd:(}{it:scalarlist}[{cmd:,} {it:subopts}]{cmd:)}{col 38}{...} +display summary statistics at the +{col 38}bottom of the table + {it:subopts}: + {helpb estout##statsfmt:{ul:f}mt}{cmd:(}{it:{help estout##fmt:fmt}} [{it:{help estout##fmt:fmt}} ...]{cmd:)}{col 38}{...} +set the display formats + {helpb estout##statslabels:{ul:l}abels}{cmd:(}{it:strlist}[{cmd:,} {col 38}{...} +label the summary statistics + {it:{help estout##lsub0:label_subopts}}]{cmd:)} + {helpb estout##statsstar:{ul:s}tar}[{cmd:(}{it:sca'list}{cmd:)}] | {cmdab:nos:tar}{col 38}{...} +denote the model significance + {helpb estout##statslayout:{ul:lay}out}{cmd:(}{it:array}{cmd:)}{col 38}{...} +arrange the summary statistics + {helpb estout##statspchar:{ul:pc}har}{cmd:(}{it:symbol}{cmd:)}{col 38}{...} +placeholder in {cmdab:layout()}; default is {cmd:@} + + Significance stars + {helpb estout##starlevels:{ul:starl}evels}{cmd:(}{it:levelslist}{cmd:)}{col 38}{...} +define thresholds and symbols, +{col 40}where '{it:levelslist}' is '{it:symbol} {it:#} +{col 40}[{it:symbol} {it:#} ...]' with {it:#} in (0,1] and +{col 40}listed in descending order + {helpb estout##stardrop:{ul:stard}rop}{cmd:(}{it:droplist}{cmd:)}{col 38}{...} +drop stars for individual coefs + {helpb estout##starkeep:{ul:stark}eep}{cmd:(}{it:keeplist}{cmd:)}{col 38}{...} +keep stars for individual coefs + [{cmdab:no:}]{helpb estout##stardetach:{ul:stard}etach}{col 38}{...} +display the stars in their own column + + Layout + {helpb estout##varwidth:{ul:var}width}{cmd:(}{it:#}{cmd:)}{col 38}{...} +set width of the table's left stub + {helpb estout##modelwidth:{ul:model}width}{cmd:(}{it:#} [{it:#} ...]{cmd:)}{col 38}{...} +set width of the results columns + [{cmdab:no:}]{helpb estout##unstack:{ul:uns}tack}{col 38}{...} +place equations from multiple- +{col 40}equation models in separate columns + {helpb estout##begin:{ul:beg}in}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify the beginning of the rows + {helpb estout##delimiter:{ul:del}imiter}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify the column delimiter + {helpb estout##end:end}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify the ending of the table rows + {helpb estout##incelldel:{ul:incell}delimiter}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify delimiter within cell + {helpb estout##dmarker:{ul:dm}arker}{cmd:(}{it:string}{cmd:)}{col 38}{...} +define the decimal marker + {helpb estout##msign:{ul:ms}ign}{cmd:(}{it:string}{cmd:)}{col 38}{...} +define the minus sign + [{cmd:no}]{helpb estout##lz:lz}{col 38}{...} +print the leading zero of fixed +{col 40}format numbers in (-1,1) + {helpb estout##extracols:{ul:extra}cols}{cmd:(}{it:numlist}{cmd:)}{col 38}{...} +add empty column to the table + {helpb estout##substitute:{ul:sub}stitute}{cmd:(}{it:subst}{cmd:)}{col 38}{...} +apply end-of-pipe substitutions, where +{col 40}'{it:subst}' is '{it:from} {it:to} [{it:from} {it:to} ... ]' + + Labeling + [{cmdab:no:}]{helpb estout##label:{ul:l}abel}{col 38}{...} +make use of variable labels + [{cmdab:no:}]{helpb estout##abbrev:{ul:ab}brev}{col 38}{...} +abbreviate long names and labels + [{cmdab:no:}]{helpb estout##wrap:wrap}{col 38}{...} +wrap long labels (if space permits) + {helpb estout##interaction:{ul:interact}ion}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify interaction operator + {helpb estout##title:{ul:ti}tle}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify a title for the table + {helpb estout##note:note}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify a note for the table + [{cmdab:no:}]{helpb estout##legend:{ul:le}gend}{col 38}{...} +add a significance symbols legend + {helpb estout##prehead:{ul:preh}ead}{cmd:(}{it:strlist}{cmd:)}{col 38}{...} +add text before the table heading + {helpb estout##prehead:{ul:posth}ead}{cmd:(}{it:strlist}{cmd:)}{col 38}{...} +add text after the table heading + {helpb estout##prehead:{ul:pref}oot}{cmd:(}{it:strlist}{cmd:)}{col 38}{...} +add text before the table footer + {helpb estout##prehead:{ul:postf}oot}{cmd:(}{it:strlist}{cmd:)}{col 38}{...} +add text after the table footer + {helpb estout##hlinechar:{ul:hl}inechar}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify look of {cmd:@hline} + {helpb estout##varlabels:{ul:varl}abels}{cmd:(}{it:matchlist}[{cmd:,} {it:sub.}]{cmd:)} {col 38}{...} +relabel the parameters + {it:subopts}: + {cmdab:bl:ist:(}{it:matchlist}{cmd:)}{col 38}{...} +assign prefixes to certain rows + {cmdab:el:ist:(}{it:matchlist}{cmd:)}{col 38}{...} +assign suffixes to certain rows + {it:{help estout##lsub0:label_subopts}} + {helpb estout##labcol2:{ul:labcol}2}{cmd:(}{it:strlist}[{cmd:,} {it:subopts}]{cmd:)} {col 38}{...} +add a second labeling column + {it:subopts}: + {cmdab:t:itle:(}{it:strlist}{cmd:)}{col 38}{...} +add column title in table header + {cmdab:w:idth:(}{it:#}{cmd:)}{col 38}{...} +set width of column + {helpb estout##refcat:{ul:ref}cat}{cmd:(}{it:matchlist}[{cmd:,} {it:subopts}]{cmd:)} {col 38}{...} +add reference category information + {it:subopts}: + {cmdab:l:abel:(}{it:string}{cmd:)} | {cmdab:nol:abel}{col 38}{...} +redefine the "ref." label + {cmdab:b:elow}{col 38}{...} +change positioning of refcat + {helpb estout##mlabels:{ul:ml}abels}{cmd:(}{it:strlist}[{cmd:,} {it:subopts}]{cmd:)}{col 38}{...} +label the models + {it:subopts}: + [{cmdab:no:}]{cmdab:dep:vars}{col 38}{...} +use the name/label of the dependent +{col 42}variable as model label + [{cmdab:no:}]{cmdab:ti:tles}{col 38}{...} +use estimates title as model label + [{cmdab:no:}]{cmdab:num:bers}{col 38}{...} +number models labels consecutively + {it:{help estout##lsub0:label_subopts}} + {helpb estout##collabels:{ul:coll}abels}{cmd:(}{it:strlist}[{cmd:,} {col 38}{...} +label the columns within models + {it:{help estout##lsub0:label_subopts}}]{cmd:)} + {helpb estout##eqlabels:{ul:eql}abels}{cmd:(}{it:strlist}[{cmd:,} {it:subopts}]{cmd:)}{col 38}{...} +label the equations + {it:subopts}: + [{cmdab:no:}]{cmdab:m:erge}{col 38}{...} +merge equation and parameter labels + {it:{help estout##lsub0:label_subopts}} + {helpb estout##mgroups:{ul:mgr}oups}{cmd:(}{it:strlist}[{cmd:,} {it:subopts}]{cmd:)}{col 38}{...} +define and label groups of models + {it:subopts}: + {cmdab:pat:tern:(}{it:pattern}{cmd:)}{col 38}{...} +define the grouping of the models + {it:{help estout##lsub0:label_subopts}} + {helpb estout##numbers:{ul:num}bers}[{cmd:(}{it:l} {it:r}{cmd:)}] | {cmdab:nonum:bers}{col 38}{...} +add a row containing model numbers + + Output + [{cmdab:no:}]{helpb estout##replace:{ul:r}eplace}{col 38}{...} +overwrite an existing file + [{cmdab:no:}]{helpb estout##append:{ul:a}ppend}{col 38}{...} +append the output to an existing file + [{cmdab:no:}]{helpb estout##type:{ul:ty}pe}{col 38}{...} +print the table in the results window + [{cmd:no}]{helpb estout##showtabs:showtabs}{col 38}{...} +display tabs as {cmd:}s + {helpb estout##topfile:{ul:top}file}{cmd:(}{it:filename}{cmd:)}{col 38}{...} +insert file contents above table + {helpb estout##topfile:{ul:bot}tomfile}{cmd:(}{it:filename}{cmd:)}{col 38}{...} +insert file contents below table + + Defaults + {helpb estout##style:{ul:sty}le}{cmd:(}{it:style}{cmd:)}{col 38}{...} +specify a style for the output table + + {it:styles}: + {cmd:smcl}{col 38}SMCL formatted table (screen default) + {cmd:tab}{col 38}tab delimited table (export default) + {cmd:fixed}{col 38}fixed format table + {cmd:tex}{col 38}table for use with LaTeX + {cmd:html}{col 38}table for use with HTML + {it:mystyle}{col 38}user defined addition + {hline 70} + +{marker lsub0} + {it:{help estout##lsub:label_subopts}}{col 38}Description + {hline 70} + [{cmd:no}]{cmd:none}{col 38}{...} +suppress the labels + {cmdab:p:refix:(}{it:string}{cmd:)}{col 38}{...} +add a common prefix + {cmdab:s:uffix:(}{it:string}{cmd:)}{col 38}{...} +add a common suffix + {cmdab:b:egin:(}{it:strlist}{cmd:)}{col 38}{...} +add an overall prefix + [{cmdab:no:}]{cmdab:f:irst}{col 38}{...} +print the first occurrence of {cmd:begin()} + {cmdab:e:nd:(}{it:strlist}{cmd:)}{col 38}{...} +add an overall suffix + [{cmdab:no:}]{cmdab:l:ast}{col 38}{...} +print the last occurrence of {cmd:end()} + {cmdab:r:eplace}{col 38}{...} +replace global {cmd:begin()}/{cmd:end()} + [{cmd:no}]{cmd:span}{col 38}{...} +span columns if appropriate + {cmdab:er:epeat:(}{it:string}{cmd:)}{col 38}{...} +add a "span" suffix + {cmd:lhs(}{it:string}{cmd:)}{col 38}{...} +label the table's left stub + {hline 70} + +{marker des} +{title:Description} + +{p 4 4 2} + {cmd:estout} assembles a table of coefficients, "significance + stars", summary statistics, standard errors, t- or z-statistics, p-values, + confidence intervals, and other statistics for one or more models + previously fitted and stored by {helpb estimates store} or {helpb eststo}. + It then displays the table in Stata's results window or writes it to a text + file specified by {cmd:using}. The default is to use {help smcl:SMCL} + formatting tags and horizontal lines to structure the table. However, + if {cmd:using} is specified, a tab-delimited table without lines + is produced. + +{p 4 4 2} + {it:namelist} provides the names of the stored estimation + sets to be tabulated. You may use the {cmd:*} and {cmd:?} wildcards in + {it:namelist}. The results estimated last may be indicated by a period + ({cmd:.}), even if they have not yet been stored. If no model is + specified, {cmd:estout} tabulates the estimation sets stored by + {cmd:eststo} (see help {helpb eststo}) or, if no such estimates are + present, the currently active estimates (i.e. the model fit last). + {cmd:estout} may be used after any estimation command that + returns its results in {cmd:e()}. + +{p 4 4 2} + See the {help estout##intro:Introduction} in the + {help estout##exa:Examples} section for an introduction on using + {cmd:estout}. See help {helpb estimates} for general information + about managing estimation results. Furthermore, see help {helpb eststo} + for an alternative to the {cmd:estimates store} command. + +{p 4 4 2} + The default for {cmd:estout} is to produce a plain + table containing point estimates. Producing a fully formatted + end-product may involve specifying many options. However, note that a + simple-to-use {cmd:estout} wrapper producing pre-formatted + publication style tables is available as {helpb esttab}. Furthermore, + use {helpb estadd} to make additional results available for + tabulation (such as the standardized coefficients or the means and + standard deviations of the regressors) and {helpb estpost} to + tabulate results from non-estimation commands such as {helpb summarize} + or {helpb tabulate}. + +{p 4 4 2} + {cmd:estout} can also be used to tabulate the contents of a Stata + matrix (see help {helpb matrix}). Type {cmd:estout marix(}{it:name}{cmd:)}, + where {it:name} is the name of the matrix, instead of providing a + {it:namelist} of stored estimation sets. See the + {help estout##ex7:examples} below. Alternatively, you may also specify + {cmd:e(}{it:name}{cmd:)} or {cmd:r(}{it:name}{cmd:)} to tabulate an + {cmd:e()}-matrix or an {cmd:r()}-matrix. The {cmd:cells()} option is + disabled if tabulating a matrix. + +{p 4 4 2} + Programms similar to {cmd:estout} include {cmd:outreg} by John Luke + Gallup, {cmd:outreg2} by Roy Wada, {cmd:modltbl} by John H. Tyler, + {cmd:mktab} by Nicholas Winter, {cmd:outtex} by Antoine Terracol, or + {cmd:est2tex} by Marc Muendler. Also see Newson (2003) for a very + appealing approach. + +{marker opt} +{title:Options} + + Contents + + {help estout##par:Parameter statistics} + {help estout##sum:Summary statistics} + {help estout##sig:Significance stars} + {help estout##lay:Layout} + {help estout##lab:Labeling} + {help estout##out:Output} + {help estout##def:Defaults} + {it:{help estout##lsub:label_subopts}} + {it:{help estout##msub:matrix_subopts}} +{marker par} +{dlgtab:Parameter statistics} +{marker cells} +{p 4 8 2} + {cmd:cells(}{it:array}{cmd:)} specifies the parameter statistics to be + reported and how they are to be arranged. The default is for cells to + report point estimates only, i.e. {cmd:cells(b)}. {cmd:cells(none)} may + be used to completely suppress the printing of parameter statistics. + Alternatively, {cmd:cells(b se)} would result in the reporting of point + estimates and standard errors. Multiple statistics are placed in + separate rows beneath one another by default. However, elements of + {it:array} that are listed in quotes or in parentheses, e.g. + {bind:{cmd:"b se"}} or {bind:{cmd:`"b se"'}} or {bind:{cmd:(b se)}}, + are placed beside one another. For example, {bind:{cmd:cells("b p" se)}} + or, equivalently, {bind:{cmd:cells((b p) se)}} would produce a + table with point estimates and p-values beside one another in first row + and standard errors in the second row beneath the point estimates. + +{p 8 8 2} + The parameter statistics available are {cmd:b} (point estimates), + {cmd:se} (standard errors), {cmd:var} (variance), {cmd:t} + (t/z-statistics), {cmd:z} (synonym for {cmd:t}), {cmd:p} (p-values), and + {cmd:ci} (confidence + intervals; to display the lower and upper bounds in separate cells use + {cmd:ci_l} and {cmd:ci_u}). Any additional parameter statistics + included in the {cmd:e()}-returns for the models can be tabulated as + well. If, for example, {cmd:e(beta)} contains the standardized + coefficients, type {cmd:cells(beta)} to tabulate them (use + {helpb estadd} to add statistics such as the standardized coefficients to the + {cmd:e()}-returns of a model). The syntax {it:name}{cmd:[}{it:#}{cmd:]} + or {it:name}{cmd:[}{it:rowname}{cmd:]} can be used to refer to specific + rows in {cmd:e(}{it:name}{cmd:)}. For example, type {cmd:cell(ci_bc[1] ci_bc[2])} + or {cmd:cell(ci_bc[ll] ci_bc[ul])} to tabulate the lower and upper + bounds of the bias-corrected confidence intervals after {helpb bootstrap}. + The default is to report the results from the first row. + Also see the {cmd:eform} and {cmd:transform()} options for more information + on the kinds of statistics that can be displayed. + +{p 8 8 2} + Further available elements in {it:array} are {cmd:_star}, + {cmd:_sign}, and {cmd:_sigsign}. {cmd:_star} causes stars denoting the + significance of the coefficients to be printed (* for p<.05, ** for p<.01, + and *** for p<.001; customizable via the {cmd:starlevels()} option below). + {cmd:_star} places the significance stars in their own cells. See the + {cmd:star} suboption below if you want to attach the stars to another + element. {cmd:_sign} prints the signs of the coefficients ("+", "-", or + "0"). {cmd:_sigsign}, a combination of {cmd:_star} and {cmd:_sign}, repeats + the signs of the coefficients where the number of repetitions reflects the + level of significance (non-significant coefficients are left empty; + however, you may set the first level to 1 in the {cmd:starlevels()} + option). + +{p 8 8 2} + Finally, {cmd:.} and {cmd:&} may be used in {it:array}. {cmd:.} inserts a + "null" element. Use this to add empty cells. For example, + {cmd:cells("b p" ". se")} would produce a table with point estimates in the + first column and p-values and standard errors beneath one another in the + second column. {cmd:&} is used to combine elements in the same cell. Use + the {helpb estout##incelldel:incelldelimiter()} option to specify the text to + be printed between the combined elements (the default is to print a + single blank). For example, in HTML, use {cmd:cell(b & se)} and + {cmd:incelldelimiter(
      )} to include point estimates and standard + errors in a single cell and insert a line break between them. + +{p 8 8 2} + A set of suboptions may be specified in parentheses for each + element named in {it:array} (except for {cmd:.} and {cmd:&}). For example, + to add significance stars to the coefficients and place the standard errors + in parentheses, specify {bind:{cmd:cells(b(star) se(par))}}. The following + suboptions are available. Use: + {p_end} +{marker cstar} +{p 12 16 2} + {cmd:star} to specify that stars denoting the significance of the + coefficients be attached to the statistic: {cmd:*} for p<.05, + {cmd:**} for p<.01, and {cmd:***} for p<.001. The symbols and the + values for the thresholds and the number of levels are fully customizable + (see the {help estout##sig:Significance stars} options). + {p_end} +{marker cfmt} +{p 12 16 2} + {cmd:fmt(}{it:{help estout##fmt:fmt}} [{it:{help estout##fmt:fmt}} ...]{cmd:)} + to specify the display format(s) of a statistic. It + defaults to {cmd:%9.0g} or the format for the first statistic in + {cmd:cells()}. If only one format is specified, it is used for all + occurrences of the statistic. For example, type + +{p 20 20 2} + {inp:. estout} {it:...}{inp:, cells("b(fmt(3)) t(fmt(2))")} + +{p 16 16 2} + to print coefficients and t-values beside one another using three + decimal places for coefficients and two decimal places for + t-values. If multiple formats are specified, the first format is + used for the first regressor in the estimates table, the second + format for the second regressor, and so on. The last format is used + for the remaining regressors if the number of regressors in the + table is greater than the number of specified formats. For + instance, type + +{p 20 20 2} + {inp:. estout} {it:...}{inp:, cells(b(fmt(3 4 2)))} + +{p 16 16 2} + to use three decimal places for the first coefficient, four decimal + places for the second, and two decimal places for all remaining + coefficients. Note that, regardless of the display format chosen, + leading and trailing blanks are removed from the numbers. White + space can be added by specifying a {cmd:modelwidth()} (see the + {help estout##lay:Layout} options). {it:{help estout##fmt:fmt}} may + be any of Stata's numerical display formats, e.g., {cmd:%9.0g} or + {cmd:%8.2f}, an integer {it:#} such as {cmd:1} or {cmd:3} to use a + fixed format with {it:#} decimal places, or {cmd:a}{it:#} such as + {cmd:a1} or {cmd:a3} to use {cmd:estout}'s adaptive display format + (see {help estout##fmt:Numerical formats} in the + {help estout##rem:Remarks} section for details). + {p_end} +{marker clabel} +{p 12 16 2} + {cmd:label(}{it:string}{cmd:)} to specify a label to appear in the + column heading. The default is the name of the statistic. + {p_end} +{marker cpar} +{p 12 16 2} + {cmd:par}[{cmd:(}{it:l} {it:r}{cmd:)}] to specify that the + statistic in question be placed in parentheses. It is also possible + to specify custom "parentheses". For example, {cmd:se(par({ }))} + would display the standard errors in curly brackets. Or, + {cmd:se(par(`"="("' `")""'))} will write parentheses in a way that + Excel can recognize. For {cmd:ci} the syntax is: + +{p 20 20 2} + {cmd:ci(par}[{cmd:(}{it:l} {it:m} {it:r}{cmd:)}]{cmd:)} + {p_end} +{marker cvacant} +{p 12 16 2} + {cmd:vacant(}{it:string}{cmd:)} to print {it:string} if a + coefficient is not in the model. The default is to leave such cells + empty. + {p_end} +{marker cdrop} +{p 12 16 2} + {cmd:drop(}{it:droplist} [{cmd:, relax}]{cmd:)} to cause certain + individual statistics to be dropped. For example, specifying + {cmd:t(drop(_cons))} suppresses the t-statistics for the constants. + {it:droplist} is specified as in the global + {helpb estout##drop:drop()} option (see below). + {p_end} +{marker ckeep} +{p 12 16 2} + {cmd:keep(}{it:keeplist} [{cmd:, relax}]{cmd:)} to cause certain + individual statistics to be kept. For example, the specification + {cmd:t(keep(mpg))} would display the t-statistics exclusively for + the variable {cmd:mpg}. {it:keeplist} is specified analogous to + {it:droplist} in {helpb estout##drop:drop()} (see below). + {p_end} +{marker cpattern} +{p 12 16 2} + {cmd:pattern(}{it:pattern}{cmd:)} to designate a pattern of models + for which the statistics are to be reported, where the {it:pattern} + consists of zeros and ones. A {cmd:1} indicates that the statistic + be printed; {cmd:0} indicates that it be suppressed. For example + {cmd:beta(pattern(1 0 1))} would result in {cmd:beta} being + reported for the first and third models, but not for the second. + {p_end} +{marker cpvalue} +{p 12 16 2} + {cmd:pvalue(}{it:name}{cmd:)} to specify the p-values used to + determine the significance stars (see {cmd:star} above). The + default is {cmd:pvalue(p)}, indicating that the standard p-values + are to be used (i.e. the p-values computed form the coefficients + vector and the variance matrix). Alternatively, specify + {cmd:pvalue(}{it:mypvalue}{cmd:)}, in which case the significance + stars will be determined from the values in + {cmd:e(}{it:mypvalue}{cmd:)}. Values outside [0,1] will be ignored. + {p_end} +{marker cabs} +{p 12 16 2} + {cmd:abs} to specify that absolute t-statistics be used instead of + regular t-statistics (relevant only if used with {cmd:t()}). + {p_end} +{marker ctranspose} +{p 12 16 2} + {cmd:transpose} to specify that {cmd:e(}{it:myel}{cmd:)} be transposed + for tabulation. + {p_end} +{marker drop} +{p 4 8 2} + {cmd:drop(}{it:droplist} [{cmd:, relax}]{cmd:)} identifies the coefficients + to be dropped from the table. A {it:droplist} comprises one or more + specifications, separated by white space. A specification can be either a + parameter name (e.g. {cmd:price}), an equation name followed by a colon + (e.g. {cmd:mean:}), or a full name (e.g. {cmd:mean:price}). You may use the + {cmd:*} and {cmd:?} wildcards in equation names and parameter names. Be sure + to refer to the matched equation names, and not to the original equation names + in the models, when using the {cmd:equations()} option to match equations. + Specify the {cmd:relax} suboption to allow {it:droplist} to contain elements + for which no match can be found. + {p_end} +{marker omitted} +{p 4 8 2} + {cmd:omitted} includes omitted coefficients (only relevant in Stata 11 or + newer). This is the default. Type {cmd:noomitted} to drop omitted + coefficients. + {p_end} +{marker baselevels} +{p 4 8 2} + {cmd:baselevels} includes base levels of factor variables (only relevant + in Stata 11 or newer). This is the default. Type {cmd:nobaselevels} to drop + base levels of factor variables. + {p_end} +{marker keep} +{p 4 8 2} + {cmd:keep(}{it:keeplist} [{cmd:, relax}]{cmd:)} selects the coefficients to + be included in the table. {it:keeplist} is specified analogous to {it:droplist} in + {helpb estout##drop:drop()} (see above). Note that {cmd:keep()} does {it:not} change the + the order of the coefficients. Use {cmd:order()} to change the order + of coefficients. + {p_end} +{marker order} +{p 4 8 2} + {cmd:order(}{it:orderlist}{cmd:)} changes the order of the + coefficients and equations within the table. {it:orderlist} is specified + analogous to {it:droplist} in {cmd:drop()} (see above). Reordering of + coefficients is performed equation by equation, unless equations are + explicitly specified. Coefficients and equations that do not appear in + {it:orderlist} are placed last (in their original order). Extra table rows + are inserted for elements in {it:orderlist} that are not found in the + table. + {p_end} +{marker indicate} +{p 4 8 2} + {cmd:indicate(}{it:groups} [{cmd:,} {cmdab:l:abels(}{it:yes} + {it:no}{cmd:)}]{cmd:)} indicates for each model (or, if {cmd:unstack} + is specified, for each equation) the presence of certain groups of + coefficients at the end of the table body. The syntax for {it:groups} + is + + "{it:group}" [ "{it:group}" {it:...} ] + +{p 8 8 2} + where a {it:group} is + + [{it:name} = ] {it:list} + +{p 8 8 2} + and {it:list} is a list of coefficient specifications as defined in + {cmd:drop()} above. The single groups should be enclosed in quotes + unless there is only one group and {it:name} is specified. Note that + {it:name} may contain spaces. + +{p 8 8 2} + For example, if some of the models contain a set of year + dummies, say {cmd:y1 y2 y3}, specify + + {com}estout{txt} {it:...}{com}, indicate(year effects = y1 y2 y3){txt} + +{p 8 8 2} + to drop the dummies from the table and add a "year effects" row + containing "Yes" for models in which {it:at least one} of the dummies + is present, and "No" for the other models. Furthermore, if some models + also contain a set of region dummies, say {cmd:reg_1} through + {cmd:reg_17}, you could type + + {com}estout{txt} {it:...}{com}, indicate("years = y1 y2 y3" "regions = reg_*"){txt} + +{p 8 8 2} + Use the {cmd:labels()} suboption to redefine the indication labels to + be printed in the table. The default is {cmd:labels(Yes No)}. Use + quotes if the labels include spaces, + e.g. {bind:{cmd:labels("in model" "not in model")}}. + {p_end} +{marker rename} +{p 4 8 2} + {cmd:rename(}{it:matchlist}{cmd:)} changes the names of individual + coefficients, where {it:matchlist} is + +{p 12 12 2} + {it:oldname} {it:newname} [{it:oldname} {it:newname} ...] + +{p 8 8 2} + {it:oldname} can be a parameter name (e.g. {cmd:price}) or a full + name including an equation specification (e.g. {cmd:mean:price}) + (abbreviation and wildcards not allowed); {it:newname} is a name without + equation specification and must not already occur in a model's equation. + {cmd:rename()} is applied before matching the models and equations and can + therefore be used to merge different coefficients across models (or + equations if {cmd:unstack} is specified) into a single table row. See the + {cmd:varlabels()} option if you are interested in relabeling coefficients + after matching models and equations. + {p_end} +{marker equations} +{p 4 8 2} + {cmd:equations(}{it:matchlist}{cmd:)} specifies how the models' equations are + to be matched. The default is to match all first equations into one equation + (named {cmd:main}, if the equations have different names) and match the remaining + equations by name. Specify {cmd:equations("")} to match all equations by + name. Alternatively, specify {it:matchlist}, which has the syntax + + {it:term} [{cmd:,} {it:term} ... ] + +{p 8 8 2} + where {it:term} is + + [{it:eqname} {cmd:=}] {it:#}{cmd::}{it:#}...{cmd::}{it:#}{col 50}(syntax 1) + + [{it:eqname} {cmd:=}] {it:#}{col 50}(syntax 2) + +{p 8 8 2} + In syntax 1, each {it:#} is a number or a period ({cmd:.}). If a number, it + specifies the position of the equation in the corresponding model; + {cmd:1:3:1} would indicate that equation 1 in the first model matches equation + 3 in the second, which matches equation 1 in the third. A period indicates + that there is no corresponding equation in the model; {cmd:1:.:1} indicates + that equation 1 in the first matches equation 1 in the third. + +{p 8 8 2} + In syntax 2, you specify just one number, say, {cmd:1} or {cmd:2}, and that + is shorthand for {cmd:1:1}...{cmd::1} or {cmd:2:2}...{cmd::2}, meaning that + equation 1 matches across all models specified or that equation 2 matches + across all models specified. + +{p 8 8 2} + {it:eqname} is used to name the matched equations. If it is suppressed, + a name such as {cmd:#1} or {cmd:#2} etc. is used, depending on the position + of the {it:term}. For example, {cmd:equations(1)} + indicates that all first equations are to be matched into one equation + named {cmd:#1}. All equations not matched by position are + matched by name. + {p_end} +{marker eform} +{p 4 8 2} + {cmd:eform}[{cmd:(}{it:pattern}{cmd:)}] displays the coefficient table in + exponentiated form. The exponent of {cmd:b} is displayed in lieu of the + untransformed coefficient; standard errors and confidence intervals are + transformed as well. Specify a {it:pattern} if the exponentiation is to be + applied only for certain models. For instance, {cmd:eform(1 0 1)} would + transform the statistics for Models 1 and 3, but not for Model 2. Note that, + unlike {cmd:regress} and {cmd:estimates table}, {cmd:estout} in + eform-mode does not suppress the display of the intercept. To drop the + intercept in eform-mode, specify {cmd:drop(_cons)}. Note: {cmd:eform} is + implemented via the {cmd:transform()} option. If both options are specified, + {cmd:transform()} takes precedence over {cmd:eform}. + {p_end} +{marker transform} +{p 4 8 2} + {cmd:transform(}{it:list} [, {cmd:pattern(}{it:pattern}{cmd:)}]{cmd:)} + displays transformed coefficients, standard errors and + confidence intervals. {it:list} may be + + {it:fx} {it:dfx} + +{p 8 8 2} + where {it:fx} is the transformation function and {it:dfx} is its first + derivative. {it:fx} is applied to coefficients and confidence + intervals, that is, {it:fx}({cmd:b}) and {it:fx}({cmd:ci}) is displayed + instead of {cmd:b} and {cmd:ci}. {it:dfx} is used to delta transform + standard errors, i.e. {cmd:se}*{it:dfx}({cmd:b}) is displayed instead + of {cmd:se}. Use {cmd:@} as a placeholder for the function's argument + in {it:fx} and {it:dfx}. For example, type + + {com}estout{txt} {it:...}{com}, transform(exp(@) exp(@)){txt} + +{p 8 8 2} + to report exponentiated results (this is equivalent to specifying + the {cmd:eform} option). + +{p 8 8 2} + Alternatively, {it:list} may be specified as + +{p 12 12 2} + {it:coefs} {it:fx} {it:dfx} [ {it:...} [{it:coefs}] {it:fx} {it:dfx} ] + +{p 8 8 2} + where {it:coefs} identifies the coefficients + to be transformed. Syntax for {it:coefs} is as explained above in the + description of the {cmd:drop()} option (however, include {it:coefs} + in quotes if it contains multiple elements). Say, a model has + two equations, {cmd:price} and {cmd:select}, and you want to + exponentiate the {cmd:price} equation but not the {cmd:select} + equation. You could then type + + {com}estout{txt} {it:...}{com}, transform(price: exp(@) exp(@)){txt} + +{p 8 8 2} + Note that omitting {it:coef} in the last transformation + specification causes the last transformation to be applied to + all remaining coefficients. + +{p 8 8 2} + Specify the {cmd:pattern()} suboption if the transformations are to be + applied only for certain models. For instance, {cmd:pattern(1 0 1)} would + apply the transformation to Models 1 and 3, but not Model 2. + {p_end} +{marker margin} +{p 4 8 2} + {cmd:margin}[{cmd:(}{cmd:u}|{cmd:c}|{cmd:p}{cmd:)}] indicates that the + marginal effects or elasticities be reported instead of the raw + coefficients. This option has an effect only if {cmd:mfx} has been + applied to a model before its results were stored (see help {helpb mfx}) or if a + {cmd:dprobit} (see help {helpb probit}), {cmd:truncreg,marginal} + (help {helpb truncreg}), or {cmd:dtobit} (Cong 2000) model is estimated. One + of the parameters {cmd:u}, {cmd:c}, or {cmd:p}, corresponding to the + unconditional, conditional, and probability marginal effects, respectively, + is required for {cmd:dtobit}. Note that the standard errors, confidence + intervals, t-statistics, and p-values are transformed as well. + +{p 8 8 2} + Using the {cmd:margin} option with multiple-equation models can be tricky. + The marginal effects of variables that are used in several equations are + printed repeatedly for each equation because the equations per se are + meaningless for {cmd:mfx}. To display the effects for certain equations only, + specify the {cmd:meqs()} option. Alternatively, use the {cmd:keep()} and + {cmd:drop()} options to eliminate redundant rows. The {cmd:equations()} + option might also be of help here. + +{p 8 8 2} + As of Stata 11, the use of {helpb mfx} is no longer suggested, since + {helpb mfx} has been superseded by {helpb margins}. Results from + {helpb margins} can directly be tabulated by {cmd:estout} as long as + the {cmd:post} option is specified with {helpb margins}. Alternatively, + you may add results from {helpb margins} to an existing + model using {helpb estadd:estadd margins} or + {helpb estpost:estpost margins}. See + {browse "http://repec.sowi.unibe.ch/stata/estout/coefficients.html#002"} for + an example on tabulating results from {helpb margins}. + {p_end} +{marker discrete} +{p 4 8 2} + {cmd:discrete(}{it:string}{cmd:)} may be used to override the default symbol and + explanatory text used to identify dummy variables when applying the + {helpb estout##margin:margin} option. The first token in {it:string} is + used as the symbol. The default is: + +{p 12 12 2} + {inp:discrete(" (d)" for discrete change of dummy variable from 0 to 1)} + +{p 8 8 2} + To display explanatory text, specify either the {cmd:legend} option or use + the {cmd:@discrete} variable (see the + {help estout##atvar:Remarks on using @-variables}). + +{p 8 8 2} + Use {cmd:nodiscrete} to disable the identification of dummy variables as + such. The default is to indicate the dummy variables unless they have been + interpreted as continuous variables in all of the models for which results are + reported (for {cmd:dprobit} and {cmd:dtobit}, however, dummy variables will + always be listed as discrete variables unless {cmd:nodiscrete} is specified). + {p_end} +{marker meqs} +{p 4 8 2} + {cmd:meqs(}{it:eq_list}{cmd:)} specifies that marginal effects requested + by the {helpb estout##margin:margin} option be printed only for the + equations in {it:eq_list}. Specifying this option does not affect how the + marginal effects are calculated. An {it:eq_list} comprises one or more equation + names (without colons) separated by white space. If you use the + {cmd:equations()} option to match equations, be sure to refer to the matched + equation names and not to the original equation names in the models. + {p_end} +{marker dropped} +{p 4 8 2} + {cmd:dropped}[{cmd:(}{it:string}{cmd:)}] causes null coefficients + (coefficients for which {cmd:e(b)} and {cmd:e(V)} is zero) to be indicated + as dropped. {it:string} specifies the text to be printed in place of + the estimates. The default text is "(dropped)". + {p_end} +{marker level} +{p 4 8 2} + {cmd:level(}{it:#}{cmd:)} assigns the confidence level, in percent, for + the confidence intervals of the coefficients (see help {help level}). + +{marker sum} +{dlgtab:Summary statistics} +{marker stats} +{p 4 8 2} + {cmd:stats(}{it:scalarlist}[{cmd:,} {it:stats_subopts}]{cmd:)} specifies + one or more scalar statistics - separated by white space - to be displayed + at the bottom of the table. The {it:scalarlist} may contain numeric + {cmd:e()}-scalars such as, e.g., {cmd:N}, {cmd:r2}, or {cmd:chi2}, but also + string {cmd:e()}-macros such as {cmd:cmd} or {cmd:depvar}. In + addition, the following statistics are available: + +{p 12 24 2} + {cmd:aic}{space 5}Akaike's information criterion{p_end} +{p 12 24 2} + {cmd:bic}{space 5}Schwarz's information criterion{p_end} +{p 12 24 2} + {cmd:rank}{space 4}rank of {cmd:e(V)}, i.e. the number of free + parameters in model{p_end} +{p 12 24 2} + {cmd:p}{space 7}the p-value of the model (overall model significance) + +{p 8 8 2} + See {bf:[R] estimates table} for details on the {cmd:aic} and {cmd:bic} statistics. + The rules for the determination of {cmd:p} are as follows (note that although + the procedure outlined below is appropriate for most models, there might be + some models for which it is not): + +{p 12 15 2} + 1) p-value provided: If the {cmd:e(p)} scalar is provided by the + estimation command, it will be interpreted as indicating the p-value + of the model. + +{p 12 15 2} + 2) F test: If {cmd:e(p)} is not provided, {cmd:estout} checks for the + presence of the {cmd:e(df_m)}, {cmd:e(df_r)}, and {cmd:e(F)} + scalars and, if they are present, the p-value of the model will be + calculated as {cmd:Ftail(df_m,df_r,F)}. This p-value corresponds to + the standard overall F test of linear regression. + +{p 12 15 2} + 3) chi2 test: Otherwise, if neither {cmd:e(p)} nor {cmd:e(F)} is + provided, {cmd:estout} checks for the presence of {cmd:e(df_m)} and + {cmd:e(chi2)} and, if they are present, calculates the p-value as + {cmd:chi2tail(df_m,chi2)}. This p-value corresponds to the + Likelihood-Ratio or Wald chi2 test. + +{p 12 15 2} + 4) If neither {cmd:e(p)}, {cmd:e(F)}, nor {cmd:e(chi2)} + is available, no p-value will be reported. + +{p 8 8 2} + Type {cmd:ereturn list} after estimating a model to see a list of + the returned {cmd:e()}-scalars and macros (see help {helpb ereturn}). Use + the {helpb estadd} command to add extra statistics and + other information to the {cmd:e()}-returns. + +{p 8 8 2} + The following {it:stats_subopts} are available. Use: + {p_end} +{marker statsfmt} +{p 12 16 2} + {cmd:fmt(}{it:{help estout##fmt:fmt}} [{it:{help estout##fmt:fmt}} {it:...}]{cmd:)} + to set the display formats for the scalars statistics in {it:scalarlist}. + {it:{help estout##fmt:fmt}} may be any of Stata's numerical display + formats, e.g., {cmd:%9.0g} or {cmd:%8.2f}, an integer {it:#} such as + {cmd:1} or {cmd:3} to use a fixed format with {it:#} decimal places, or + {cmd:a}{it:#} such as {cmd:a1} or {cmd:a3} to use {cmd:estout}'s adaptive + display format (see {help estout##fmt:Numerical formats} in the {help + estout##rem:Remarks} section for details). For example, {cmd:fmt(3 0)} + would be suitable for {cmd:stats(r2_a N)}. Note that the last specified + format is used for the remaining scalars if the list of scalars is longer + than the list of formats. Thus, only one format needs to be specified if + all scalars are to be displayed in the same format. If no format is + specified, the default format is the display format of the coefficients. + {p_end} +{marker statslabels} +{p 12 16 2} + {cmd:labels(}{it:strlist}[{cmd:,} {it:{help estout##lsub:label_subopts}}]{cmd:)} + to specify labels for rows containing the scalar statistics. If + specified, the labels are used instead of the scalar names. For example: + +{p 20 20 2} + {inp:. estout} {it:...}{inp:, stats(r2_a N, labels("Adj. R-Square" "Number of Cases"))} + +{p 16 16 2} + Note that names like {cmd:r2_a} produce an error in LaTeX because the + underscore character has a special meaning in LaTeX (to print the + underscore in LaTeX, type {cmd:\_}). Use the {cmd:label()} suboption to + rename such statistics, e.g. {cmd:stats(r2_a, labels(r2\_a))}. An alternative + approach is to use {cmd:estout}'s {cmd:substitute()} option (see the + {help estout##lay:Layout} options). + {p_end} +{marker statsstar} +{p 12 16 2} + {cmd:star}[{cmd:(}{it:scalarlist}{cmd:)}] to specify that the overall + significance of the model be denoted by stars. The stars are attached to + the scalar statistics specified in {it:scalarlist}. If + {it:scalarlist} is omitted, the stars are attached to the first + reported scalar statistic. The printing of the stars is suppressed in + empty results cells (i.e. if the scalar statistic in question is missing + for a certain model). The determination of the model significance is + based on the p-value of the model (see above). + +{p 16 16 2} + Hint: It is possible to attach the stars to different scalar statistics + within the same table. For example, specify + {cmd:stats(,star(r2_a r2_p))} + when tabulating OLS estimates and, say, probit estimates. For + the OLS models, the F test will be carried out and the significance + stars will be attached to the {cmd:r2_a}; for the probit models, the + chi2 test will be used and the stars will appear next to the + {cmd:r2_p}. + {p_end} +{marker statslayout} +{p 12 16 2} + {cmd:layout(}{it:array}{cmd:)} to rearrange the summary statistics. The default + is to print the statistics in separate rows beneath one another (in + each model's first column). The syntax for {it:array} is + + <{it:row}> [ <{it:row}> ... ] + +{p 16 16 2} + where {it:row} is + + <{it:cell}> [ <{it:cell}> ... ] + +{p 16 16 2} + and {cmd:@} is used as a placeholder for the statistics, one + after another. Rows and cells that contain blanks + have to be embraced in quotes. For example, + + {com} ... stats(chi2 df_m N, layout("@ @" @)){txt} + +{p 16 16 2} + prints for each model in row 1/column 1 the chi-squared, in + row1/column 2 the degrees of freedom, and in row 2/column 1 the number of + observations. Cells may contain multiple statistics and text other than + the placeholder symbol is printed as is (provided the cells' statistics are part + of the model). For example, + + {com} ... stats(chi2 df_m N, layout(`""@ (@)""' @)){txt} + +{p 16 16 2} + prints a cell containing "chi2 (df_m)" in the first row and the + number of observations in the second row. Note that the number of columns + in the table only depends on the {cmd:cells()} option (see above) and not + on the {cmd:layout()} suboption. If, for example, the table has two columns + per model and you specify three columns of summary statistics, the summary statistics + in the third column are not printed. + {p_end} +{marker statspchar} +{p 12 16 2} + {cmd:pchar(}{it:symbol}{cmd:)} to specify the placeholder symbol + used in {cmdab:layout()}. The default placeholder is {cmd:@}. + +{marker sig} +{dlgtab:Significance stars} +{marker starlevels} +{p 4 8 2} + {cmd:starlevels(}{it:levelslist}{cmd:)} overrides the default thresholds and + symbols for "significance stars". For instance, + {bind:{cmd:starlevels(+ 0.10 * 0.05)}} + sets the following thresholds: {cmd:+} for p<.10 and {cmd:*} for + p<.05. Note that the thresholds must lie in the (0,1] interval and must be + specified in descending order. To, for example, denote insignificant + results, type {bind:{cmd:starlevels(* 1 "" 0.05)}}. + {p_end} +{marker stardrop} +{p 4 8 2} + {cmd:stardrop(}{it:droplist} [{cmd:, relax}]{cmd:)} + identifies the coefficients for which the significance stars be + suppressed. {it:droplist} is specified as in + {helpb estout##drop:drop()} (see above). + {p_end} +{marker starkeep} +{p 4 8 2} + {cmd:starkeep(}{it:keeplist} [{cmd:, relax}]{cmd:)} selects the coefficients + for which the significance stars, if requested, be printed. {it:keeplist} + is specified analogous to {it:droplist} in + {helpb estout##drop:drop()} (see above). + {p_end} +{marker stardetach} +{p 4 8 2} + {cmd:stardetach} specifies that a delimiter be placed between the statistics + and the significance stars (i.e. that the stars are to be displayed in their + own column). + +{marker lay} +{dlgtab:Layout} +{marker varwidth} +{p 4 8 2} + {cmd:varwidth(}{it:#}{cmd:)} specifies the number of characters used to display + the names (labels) of regressors and statistics (i.e. {cmd:varwidth} + specifies the width of the table's left stub). Long names (labels) are + abbreviated (depending on the {cmd:abbrev} option) and short or empty + cells are padded out with blanks to fit the width specified by the user. + {cmd:varwidth} set to 0 means that the names are not + abbreviated and no white space is added. Specifying low values may cause + misalignment. + {p_end} +{marker modelwidth} +{p 4 8 2} + {cmd:modelwidth(}{it:#} [{it:#} ...]{cmd:)} designates the number of characters + used to display the results columns. If a non-zero {cmd:modelwidth} is + specified, model names are abbreviated if necessary (depending on the + {cmd:abbrev} option) and short or empty results cells are padded out + with blanks. In contrast, {cmd:modelwidth} does not shorten or truncate + the display of the results themselves (coefficients, t-statistics, + summary statistics, etc.) although it may add blanks if needed. + {cmd:modelwidth} set to 0 means that the model names are not + abbreviated and no white space is added. Specifying low values may + cause misalignment. Specify a list of numbers in {cmd:modelwidth()} to + assign individual widths to the different results columns (the list is + recycled if there are more columns than numbers). + +{p 8 8 2} + The purpose of {cmd:modelwidth} is to be able to construct a fixed-format + table and thus make the raw table more readable. Be aware, however, that the + added blanks may cause problems with the conversion to a table in word + processors or spreadsheets. + {p_end} +{marker unstack} +{p 4 8 2} + {cmd:unstack} specifies that the individual equations from multiple-equation + models (e.g. {cmd:mlogit}, {cmd:reg3}, {cmd:heckman}) be placed in + separate columns. The default is to place the equations below one another in a + single column. Summary statistics will be reported for each equation if + {cmd:unstack} is specified and the estimation command is either {cmd:reg3}, + {cmd:sureg}, or {cmd:mvreg} (see help {helpb reg3}, help {helpb sureg}, + help {helpb mvreg}). + {p_end} +{marker begin} +{p 4 8 2} + {cmd:begin(}{it:string}{cmd:)} specifies a string to be printed at the + beginning of every table row. It is possible to + use special functions such as {cmd:_tab} or {cmd:_skip} in + {cmd:begin()}. For more information on using such functions, see the + description of the functions in help {helpb file}. + {p_end} +{marker delimiter} +{p 4 8 2} + {cmd:delimiter(}{it:string}{cmd:)} designates the delimiter used between the + table columns. See the {cmd:begin} option above for further details. + {p_end} +{marker end} +{p 4 8 2} + {cmd:end(}{it:string}{cmd:)} specifies a string to be printed at the end of + every table row. See the {cmd:begin} option above for further details. + {p_end} +{marker incelldel} +{p 4 8 2} + {cmd:incelldelimiter(}{it:string}{cmd:)} specifies text to be printed + between parameter statistics that have been combined in a single cell + by the {cmd:&} operator. See the {helpb estout##par:cells()} option + for details. The default string is a single blank. + {p_end} +{marker dmarker} +{p 4 8 2} + {cmd:dmarker(}{it:string}{cmd:)} specifies the form of the decimal marker. The + standard decimal symbol (a period or a comma, depending on the input provided + to {cmd:set dp}; see help {help format}) is replaced by {it:string}. + {p_end} +{marker msign} +{p 4 8 2} + {cmd:msign(}{it:string}{cmd:)} determines the form of the minus sign. The + standard minus sign ({cmd:-}) is replaced by {it:string}. + {p_end} +{marker lz} +{p 4 8 2} + {cmd:lz} specifies that the leading zero of fixed format numbers in the + interval (-1,1) be printed. This is the default. Use {cmd:nolz} to advise + {cmd:estout} to omit the leading zeros (that is, to print numbers like + {cmd:0.021} or {cmd:-0.33} as {cmd:.021} and {cmd:-.33}). + {p_end} +{marker extracols} +{p 4 8 2} + {cmd:extracols(}{it:{help numlist}}{cmd:)} inserts empty table columns + at the indicated positions. For example, {cmd:extracols(1)} adds + an extra column between the left stub of the table and the first + column. + {p_end} +{marker substitute} +{p 4 8 2} + {cmd:substitute(}{it:subst_list}{cmd:)} specifies that the substitutions + specified in {it:subst_list} be applied to the estimates table after it has + been created. Specify {it:subst_list} as a list of substitution pairs, that + is: + +{p 12 12 2} + {it:from} {it:to} [{it:from} {it:to} ...] + +{p 8 8 2} + For example, specify {cmd:substitute(_ \_)} to replace the underscore + character (as in {cmd:_cons} or {cmd:F_p}) with it's LaTeX equivalent {cmd:\_}. + +{marker lab} +{dlgtab:Labeling} +{marker label} +{p 4 8 2} + {cmd:label} specifies that variable labels be displayed instead of variable + names in the left stub of the table. + {p_end} +{marker abbrev} +{p 4 8 2} + {cmd:abbrev} specifies that long names and labels be abbreviated if + a {cmd:modelwidth()} and/or a {cmd:varwidth()} is specified. + {p_end} +{marker wrap} +{p 4 8 2} + {cmd:wrap} causes long variable labels to be wrapped if space permits and + a {cmd:varwidth()} is specified. The {cmd:wrap} option is only useful if + several parameter statistics are printed beneath one another and, therefore, + white space is available beneath the labels. + {p_end} +{marker interaction} +{p 4 8 2} + {cmd:interaction(}{it:string}{cmd:)} specifies the string to be used + as delimiter for interaction terms (only relevant in Stata 11 or newer). The + default is {cmd:interaction(" # ")}. For {cmd:style(tex)} the default is + {cmd:interaction(" $\times$ ")}. + {p_end} +{marker title} +{p 4 8 2} + {cmd:title(}{it:string}{cmd:)} may be used to specify a title for the table. + The {it:string} is printed at the top of the table unless {cmd:prehead()}, + {cmd:posthead()}, {cmd:prefoot()}, or {cmd:postfoot()} is specified. In + the latter case, the variable {cmd:@title} can be used to insert the title. + {p_end} +{marker note} +{p 4 8 2} + {cmd:note(}{it:string}{cmd:)} may be used to specify a note for the table. + The {it:string} is printed at the bottom, of the table unless {cmd:prehead()}, + {cmd:posthead()}, {cmd:prefoot()}, or {cmd:postfoot()} is specified. In + the latter case, the variable {cmd:@note} can be used to insert the note. + {p_end} +{marker legend} +{p 4 8 2} + {cmd:legend} adds a legend explaining the significance symbols and + thresholds. + {p_end} +{marker prehead} +{p 4 8 2} + {cmd:prehead(}{it:strlist}{cmd:)}, {cmd:posthead(}{it:strlist}{cmd:)}, + {cmd:prefoot(}{it:strlist}{cmd:)}, and {cmd:postfoot(}{it:strlist}{cmd:)} may + be used to define lists of text lines to appear before and after the table + heading or the table footer. For example, the specification + +{p 12 12 2} + {inp:. estout} {it:...}{inp:, prehead("\S_DATE \S_TIME" "")} + +{p 8 8 2} + would add a line containing the current date and time followed by + an empty line before the table. Various substitution functions can be used + as part of the text lines specified in {it:strlist} (see the + {help estout##atvar:Remarks on using @-variables}). For example, + {cmd:@hline} plots a horizontal "line" (series of dashes, by default; see + the {cmd:hlinechar()} option) or {cmd:@M} inserts the number of models + in the table. {cmd:@M} could be used in a LaTeX table heading + as follows: + +{p 12 12 2} + {inp:. estout} {it:...}{inp:, prehead(\begin{tabular}{l*{@M}{r}})} + {p_end} +{marker hlinechar} +{p 4 8 2} + {cmd:hlinechar(}{it:string}{cmd:)} specifies the character(s) to be + used in {cmd:@hline}. The default is {cmd:hlinechar(-)}, resulting in a + dashed line. To produce a solid line, specify {cmd:hlinechar(`=char(151)')} + (Windows only; other systems may use other codes). + {p_end} +{marker varlabels} +{p 4 8 2} + {cmd:varlabels(}{it:matchlist}[{cmd:,} {it:suboptions}]{cmd:)} may be used to + relabel the regressors from the models, where {it:matchlist} is + +{p 12 12 2} + {it:name} {it:label} [{it:name} {it:label} ...] + +{p 8 8 2} + A {it:name} is a parameter name (e.g. {cmd:price}) or a full name + (e.g. {cmd:mean:price}) (abbreviation and wildcards + not allowed). For example, specify {cmd:varlabels(_cons Constant)} to replace + each occurrence of {cmd:_cons} with {cmd:Constant}. (Note that, in LaTeX, + the underscore character produces an error unless it is specified as + {cmd:\_}. Thus, names such as {cmd:_cons} should always be changed if + the estimates table is to be used with LaTeX. The {cmd:substitute()} may also be + helpful; see the {help estout##lay:Layout} options.) The {it:suboptions} are: + +{p 12 16 2} + {cmd:blist(}{it:matchlist}{cmd:)} to assign specific prefixes to + certain rows in the table body. Specify the {it:matchlist} as pairs of + regressors and prefixes, that is: + +{p 20 20 2} + {it:name} {it:prefix} [{it:name} {it:prefix} ...] + +{p 16 16 2} + A {it:name} is a parameter name (e.g. {cmd:price}), an equation name + followed by a colon (e.g. {cmd:mean:}), or a full name + (e.g. {cmd:mean:price}) (abbreviation and wildcards + not allowed). Note that equation names cannot be used if the + {cmd:unstack} option is specified. + +{p 12 16 2} + {cmd:elist(}{it:matchlist}{cmd:)} to assign specific suffixes to + certain rows in the table body (see the analogous {cmd:blist()} option + above). This option may, for example, be useful for separating + thematic blocks of variables by + adding vertical space at the end of each block. A LaTeX example: + +{p 20 20 2} + {inp:. estout} {it:...}{inp:, varlabels(,elist(price \addlinespace mpg \addlinespace))} + +{p 16 16 2} + (the macro {cmd:\addlinespace} is provided by the + {cmd:booktabs} package in LaTeX) + +{p 12 16 2} + {it:{help estout##lsub:label_subopts}}, which are + explained in their own section. + {p_end} +{marker labcol2} +{p 4 8 2} + {cmd:labcol2(}{it:strlist}[{cmd:,} {it:suboptions}]{cmd:)} adds a second column + containing additional labels for the coefficients and summary statistics. Labels + containing spaces should be embraced in double quotes ({bind:{cmd:"}{it:label 1}{cmd:"}} + {bind:{cmd:"}{it:label 2}{cmd:"}} etc.). An example would be to add a column + indicating the hypothesized directions of effects, e.g., + + {com}. estout {txt}{it:...}{com}, labcol2(+ - +/- + 0){txt} + +{p 8 8 2} + The {it:suboptions} are: + +{p 12 16 2} + {cmd:title(}{it:strlist}{cmd:)} to add text in the table header above + the column. Use double quotes to break the title into several + rows (given there are multiple header rows), i.e. specify {it:strlist} + as {bind:{cmd:"}{it:line 1}{cmd:"}} {bind:{cmd:"}{it:line 2}{cmd:"}} etc. + +{p 12 16 2} + {cmd:width(}{it:#}{cmd:)} to set the width, in number of characters, of the + column. The default is the value of {cmd:modelwidth()}. + {p_end} +{marker refcat} +{p 4 8 2} + {cmd:refcat(}{it:matchlist}[{cmd:,} {it:suboptions}]{cmd:)} may be used to + insert a row containing information on the reference category + of a categorical variable in the model. {it:matchlist} is + +{p 12 12 2} + {it:name} {it:refcat} [{it:name} {it:refcat} ...] + +{p 8 8 2} + A {it:name} is a parameter name (e.g. {cmd:_Irep78_2}) + (abbreviation and wildcards not allowed). For + example, assume that you include the categorical variable {cmd:rep78} + ("Repair Record 1978" from the auto dataset) in some of your models + using {cmd:xi} (see help {helpb xi}). Since {cmd:rep78} has five + levels, 1 through 5, {cmd:xi} will create 4 dummy variables, + {cmd:_Irep78_2} through {cmd:_Irep78_5}. You can now type + +{p 12 12 2} + {inp:. estout} {it:...}{inp:, refcat(_Irep78_2 _Irep78_1)} + +{p 8 8 2} + to add a table row containing "_Irep78_1" in the left stub and + "ref." in each column in which the {cmd:_Irep78_2} + dummy appears. The {it:suboptions} are: + +{p 12 16 2} + {cmd:label(}{it:string}{cmd:)} to specify the label that is printed + in the table columns. The default is {cmd:label(ref.)}. Type {cmd:nolabel} + to suppress the default label. + +{p 12 16 2} + {cmd:below} to position the reference category row below the specified + coefficient's row. The default is above. For example, if the 5th + category of {cmd:rep78} is used as reference category, i.e. if + {cmd:_Irep78_1} through {cmd:_Irep78_4} are included in the models, + you might want to type {cmd:refcat(_Irep78_4 _Irep78_5, below)}. + {p_end} +{marker mlabels} +{p 4 8 2} + {cmd:mlabels(}{it:strlist}[{cmd:,} {it:suboptions}]{cmd:)} determines the + model captions printed in the table heading. The default is to use the names of + the stored estimation sets (or their titles, if the {cmd:label} option is + specified and titles are available). The {it:suboptions} for use with + {cmd:mlabels} are: + +{p 12 16 2} + {cmd:depvars} to specify that the name (or label) of the (first) dependent + variable of the model be used as model label. + +{p 12 16 2} + {cmd:titles} to specify that, if available, the title of the stored + estimation set be used as the model label. Note that the {cmd:label} option + implies {cmd:titles} (unless {cmd:notitles} is specified). {cmd:depvars} + takes precedence over {cmd:titles}. + +{p 12 16 2} + {cmd:numbers} to cause the model labels to be numbered consecutively. + +{p 12 16 2} + {it:{help estout##lsub:label_subopts}}, which are explained in their own section. + {p_end} +{marker collabels} +{p 4 8 2} + {cmd:collabels(}{it:strlist}[{cmd:,} {it:{help estout##lsub:label_subopts}}]{cmd:)} + specifies labels for the columns within models or equations. The + default is to compose a label from the names or labels of the + statistics printed in the cells of that column. The {it:label_subopts} + are explained in their own section below. + {p_end} +{marker eqlabels} +{p 4 8 2} + {cmd:eqlabels(}{it:strlist}[{cmd:,} {it:suboptions}]{cmd:)} + labels the equations. The default is to use the equation names as + stored by the estimation command, or to use the variable labels if the + equation names correspond to individual variables and the {cmd:label} + option is specified. The {it:suboptions} for use with {cmd:eqlabels} + are: + +{p 12 16 2} + {cmd:merge} to merge equation labels and parameter labels instead of + printing equation labels in separate rows. Equation and parameter labels + will be separated by ":" unless another delimiter is specified via the + {cmd:suffix()} suboption (see {it:{help estout##lsub:label_subopts}}). + {cmd:merge} has no effect if {cmd:unstack} is specified. + +{p 12 16 2} + {it:{help estout##lsub:label_subopts}}, which are explained in their own + section. Note that {bind:{cmd:eqlabels(none)}} causes {cmd:_cons} to be + replaced with the equation name or label, if {cmd:_cons} is the only + parameter in an equation. This is useful, e.g., for tabulating + {cmd:ologit} or {cmd:oprobit} results in Stata 9. Specify + {bind:{cmd:eqlabels("", none)}} to not replace {cmd:_cons}. + {p_end} +{marker mgroups} +{p 4 8 2} + {cmd:mgroups(}{it:strlist}[{cmd:,} {it:suboptions}]{cmd:)} may be used to + labels groups of (consecutive) models at the top of the table heading. The + labels are placed in the first physical column of the output for the group of + models to which they apply. The {it:suboptions} for use with {cmd:mgroups} + are: + +{p 12 16 2} + {cmd:pattern(}{it:pattern}{cmd:)} to establish how the models are to be grouped. + {it:pattern} should be a list of zeros and ones, with ones indicating the + start of a new group of models. For example, + +{p 20 20 2} + {inp:. estout} {it:...}{inp:, mgroups("Group 1" "Group 2", pattern(1 0 0 1 0))} + +{p 16 16 2} + would group Models 1, 2, and 3 together and then groups Models 4 and 5 + together as well. Note that the first group will always start with the first + model regardless of whether the first token of {it:pattern} is a one or a + zero. + +{p 12 16 2} + {it:{help estout##lsub:label_subopts}}, which are explained + in their own section. In + particular, the {cmd:span} suboption might be of interest here. + {p_end} +{marker numbers} +{p 4 8 2} + {cmd:numbers}[{cmd:(}{it:l} {it:r}{cmd:)}] adds a row to the table header + displaying consecutive model numbers. The default is to + enclose the numbers in parentheses, i.e. {cmd:(1)}, {cmd:(2)}, etc. + Alternatively, specify {it:l} and {it:r} to change the tokens on the + left and right of each number. For example, {cmd:numbers("" ")")} + would result in {cmd:1)}, {cmd:2)}, etc. + +{marker out} +{dlgtab:Output} +{marker replace} +{p 4 8 2} + {cmd:replace} permits {cmd:estout} to overwrite an existing file. + {p_end} +{marker append} +{p 4 8 2} + {cmd:append} specifies that the output be appended to an existing file. It + may be used even if the file does not yet exist. + {p_end} +{marker type} +{p 4 8 2} + {cmd:type} specifies that the assembled estimates table be printed in the + results window and the log file. This is the default unless {cmd:using} is + specified. Use {cmd:notype} to suppress the display of the table. + {p_end} +{marker showtabs} +{p 4 8 2} + {cmd:showtabs} requests that tabs be displayed as {cmd:}s in both the + results window and the log file instead of in expanded form. This option does + not affect how tabs are written to the text file specified by {cmd:using}. + {p_end} +{marker topfile} +{p 4 8 2} + {cmd:topfile(}{it:filename}{cmd:)} and + {cmd:bottomfile(}{it:filename}{cmd:)} may be used to insert text before + and after the table, where the text is imported from a file on disk. Note that + {cmd:substitute()} does not apply to text inserted by {cmd:topfile()} or + {cmdab:bottomfile()}. + +{marker def} +{dlgtab:Defaults} +{marker style} +{p 4 8 2} + {cmd:style(}{it:style}{cmd:)} specifies a "style" for the output + table. {cmdab:def:aults:(}{it:style}{cmd:)} is a synonym for + {cmd:style(}{it:style}{cmd:)}. A "style" is a named combination of options + that is saved in an auxiliary file called {cmd:estout_}{it:style}{cmd:.def}. + In addition, there are five internal styles called {cmd:smcl} + (default for screen display), {cmd:tab} (export default), {cmd:fixed}, + {cmd:tex}, and {cmd:html}. The {cmd:smcl} style is suitable for displaying + the table in Stata's results window and is the default unless + {cmd:using} is specified. It includes {help smcl:SMCL} formatting tags and + horizontal lines to structure the table. The particulars of the other styles are: + + settings {col 38}styles + {col 26}{cmd:tab}{col 34}{cmd:fixed}{col 42}{cmd:tex}{col 50}{cmd:html} + {hline 47} + {cmd:begin} {col 50}{cmd:} + {cmd:delimiter} {col 26}{cmd:_tab}{col 34}{cmd:" "}{col 42}{cmd:&}{col 50}{cmd:} + {cmd:end} {col 42}{cmd:\\}{col 50}{cmd:} + {cmd:varwidth} {col 26}{cmd:0}{col 34}{cmd:12/20}*{col 42}{cmd:12/20}*{col 50}{cmd:12/20}* + {cmd:modelwidth}{col 26}{cmd:0}{col 34}{cmd:12}{col 42}{cmd:12}{col 50}{cmd:12} + {cmd:abbrev} {col 26}off{col 34}on{col 42}off{col 50}off + (* if {cmd:label} is on) + +{p 8 8 2} + {cmd:tab} is the default export style (i.e. if {cmd:using} is specified). + +{p 8 8 2} + Note that explicitly specified options take precedence + over settings provided by a style. For example, if you type + + {com}. estout, delimiter("") style(tab){txt} + +{p 8 8 2} + then the column delimiter will be set to empty string since the + {cmd:delimiter()} option overwrites the default from the {cmd:tab} + style. Similarly, specifying + {cmd:noabbrev} will turn abbreviation off if using the {cmd:fixed} + style. + +{p 8 8 2} + See {help estout##defaults:Defaults files} in the + {help estout##rem:Remarks} section to make available your own style. + +{marker lsub} +{it:{dlgtab:label_subopts}} + +{p 4 4 2} +The following suboptions may be used within the {cmd:mgroups()}, +{cmd:mlabels()}, {cmd:collabels()}, {cmd:eqlabels()}, +{cmd:varlabels()}, and {cmd:stats(, labels())} options: + +{p 4 8 2} + {cmd:none} suppresses the printing of the labels or drops the + part of the table heading to which it applies. Note that instead of + typing {bind:{it:option}{cmd:(, none)}} you may simply specify + {it:option}{cmd:(none)}. + +{p 4 8 2} + {cmd:prefix(}{it:string}{cmd:)} specifies a common prefix to be added to each + label. + +{p 4 8 2} + {cmd:suffix(}{it:string}{cmd:)} specifies a common suffix to be added to each + label. + +{p 4 8 2} + {cmd:begin(}{it:strlist}{cmd:)} specifies a prefix to be printed at the + beginning of the part of the table to which it applies. If {cmd:begin} is + specified in {cmd:varlabels()} or {cmd:stats(,labels())}, the prefix will + be repeated for each regressor or summary statistic. + +{p 4 8 2} + {cmd:first} specifies that the first occurrence of the {cmd:begin()}-prefix in + {cmd:varlabels()} or {cmd:stats(,labels())} be printed. This + is the default. Use {cmd:nofirst} to suppress the first occurrence of the + prefix. In {cmd:varlabels()}, {cmd:nofirst} applies equation-wise, i.e., the first + {cmd:begin()}-prefix in each equation is suppressed (unless {cmd:unstack} is + specified). + +{p 4 8 2} + {cmd:end(}{it:strlist}{cmd:)} specifies a suffix to be printed at the end of the + part of the table to which it applies. If {cmd:end} is specified in + {cmd:varlabels()} or {cmd:stats(,labels())}, the suffix will be repeated + for each regressor or summary statistic. + +{p 4 8 2} + {cmd:last} specifies that the last occurrence of the {cmd:end()}-suffix in + {cmd:varlabels()} or {cmd:stats(,labels())} be printed. This + is the default. Use {cmd:nolast} to suppress the last occurrence of the + suffix. In {cmd:varlabels()}, {cmd:nolast} applies equation-wise, i.e., the last + {cmd:end()}-suffix in each equation is suppressed (unless {cmd:unstack} is + specified). + +{p 4 8 2} + {cmd:replace} causes the label suboption {cmd:begin()}-prefix and {cmd:end()}-suffix + to be used instead of the global {cmd:begin()} and {cmd:end()} strings. The default + is to print both. {cmd:replace} also applies to {cmd:blist()} and {cmd:elist()} + if specified in {cmd:varlabels()}. + +{p 4 8 2} + {cmd:span} causes labels to span columns, i.e. extends the labels across + several columns, if appropriate. This suboption is relevant only for the + {cmd:mgroups()}, {cmd:mlabels()}, {cmd:eqlabels()}, and + {cmd:collabels()} options. The {cmd:@span} string returns the number of + spanned columns if it is included in the label, prefix, or suffix. A LaTeX example: + +{p 8 8 2} + {inp:. estout} {it:...}{inp:, mlabels(, span prefix(\multicolumn{@span}{c}{) suffix(}))} + +{p 4 8 2} + {cmd:erepeat(}{it:string}{cmd:)} specifies a string that is repeated for each + group of spanned columns at the very end of the row if the {cmd:span} + suboption is specified. This suboption is relevant only for the + {cmd:mgroups()}, {cmd:mlabels()}, {cmd:eqlabels()}, and + {cmd:collabels()} options. If the {cmd:@span} string is included in + {it:string} it will be replaced by the range of columns spanned. A LaTeX example: + +{p 8 8 2} + {inp:. estout} {it:...}{inp:, mlabels(, span erepeat(\cline{@span}))} + +{p 4 8 2} + {cmd:lhs(}{it:string}{cmd:)} inserts {it:string} into the otherwise empty cell + in the left stub of the row of the table heading to which it applies. This + suboption is relevant only for the {cmd:mgroups()}, {cmd:mlabels()}, + {cmd:eqlabels()}, and {cmd:collabels()} options. + +{marker msub} +{it:{dlgtab:matrix_subopts}} + +{p 4 4 2} +The following suboptions may be applied within the {cmd:matrix()}, +{cmd:e()}, or {cmd:r()} argument used to tabulate a matrix: + {p_end} +{marker mfmt} +{p 4 8 2} + {cmd:fmt(}{it:fmtlist}{cmd:)} sets the display formats for the matrix. + {it:fmtlist} contains a list of format specifications, one for each + column of the matrix. {it:fmtlist} is recycled if it supplies less + specifications than there are columns in the matrix. A format + specification may be a single {it:{help estout##fmt:fmt}} such as, + e.g., {cmd:%9.0g} or {cmd:a3} (see {help estout##fmt:Numerical formats} + in the {help estout##rem:Remarks} section for details) to be applied to + all cells in the column. Alternatively, a format specification may be + a list of {it:{help estout##fmt:fmt}}s, enclosed in double quotes, to be + used for the cells in the column one by one. The last format in the + list is used for the remaining cells if the number of cells in the + column is greater than the number of formats in the list. Also see the + {help estout##ex7:examples} below. + {p_end} +{marker mtranspose} +{p 4 8 2} + {cmd:transpose} causes the matrix to be transposed for tabulation. + +{marker exa} +{title:Examples} + + Contents + {help estout##intro:Introduction} + {help estout##ex1:Publication style table} + {help estout##ex2:t-statistics for selected variables only} + {help estout##ex3:Summary statistics only} + {help estout##ex4:Table of descriptives} + {help estout##ex5:Unstack multiple equations} + {help estout##ex7:Tabulating a matrix} + +{p 4 4 2} Please first read the {help estout##intro:Introduction}. The +other examples are more advanced and intended for users +already familiar with the basic features of +{cmd:estout}. Additional examples can be found in Jann (2005) and at +{browse "http://repec.sowi.unibe.ch/stata/estout/"}. + +{marker intro} +{dlgtab:Introduction} + +{p 4 4 2} +The full syntax of {cmd:estout} is rather complex and is to be found +above. However, consider the following basic syntax, which +includes only the most important options: + +{p 8 15 2} +{cmd:estout} [ {it:namelist} ] [ {cmd:using} {it:filename} ] [ {cmd:,} + {cmdab:c:ells:(}{it:array}{cmd:)} + {cmdab:s:tats:(}{it:scalarlist}{cmd:)} + {cmdab:sty:le:(}{it:style}{cmd:)} + {it:more_options} + ] + +{p 4 4 2} +where {it:namelist} is a list of the names of stored estimation sets (the name +list can be entered as {cmd:*} to refer to all stored estimates). The +{cmd:cells()} and {cmd:stats()} options determine the primary contents of +the table. The {cmd:style()} option determines the basic formatting of the +table. + +{p 4 4 2}{ul:Basic usage} + +{p 4 4 2} +The general procedure for using {cmd:estout} is to first store several +models using the {cmd:estimates store} or the {helpb eststo} command and then apply +{cmd:estout} to display or save a table of the estimates. By default, +{cmd:estout} displays a plain table of the coefficients of the models and +uses {help SMCL} tags and horizontal lines to structure the table: + + {com}. sysuse auto + {txt}(1978 Automobile Data) + + {com}. replace price = price / 1000 + {txt}price was {res}int{txt} now {res}float + {txt}(74 real changes made) + + {com}. replace weight = weight / 1000 + {txt}weight was {res}int{txt} now {res}float + {txt}(74 real changes made) + + {com}. quietly regress price weight mpg + {txt} + {com}. estimates store m1, title(Model 1) + {txt} + {com}. generate forXmpg = foreign * mpg + {txt} + {com}. quietly regress price weight mpg forXmpg foreign + {txt} + {com}. estimates store m2, title(Model 2) + {txt} + {com}. estout m1 m2 + {res} + {txt}{hline 38} + {txt} m1 m2 + {txt} b b + {txt}{hline 38} + {txt}weight {res} 1.746559 4.613589{txt} + {txt}mpg {res} -.0495122 .2631875{txt} + {txt}forXmpg {res} -.3072165{txt} + {txt}foreign {res} 11.24033{txt} + {txt}_cons {res} 1.946068 -14.44958{txt} + {txt}{hline 38} + +{p 4 4 2}Alternatively, if {cmd:using} is specified, {cmd:estout} writes a +raw tab-delimited table (without SMCL tags and without lines) to the +indicated file ({cmd:*} is used in the following example to indicate that +all stored models be tabulated): + + {com}. estout * using example.txt + {txt}(output written to {browse `"example.txt"'}) + + {com}. type example.txt + {res} m1 m2 + b b + weight 1.746559 4.613589 + mpg -.0495122 .2631875 + forXmpg -.3072165 + foreign 11.24033 + _cons 1.946068 -14.44958 + {txt} +{p 4 4 2} The table looks messy in the Stata results window or the Stata +log because the columns are tab-separated (note that tab characters are not +preserved in the results window or the log). However, the table would look +tidy if "example.txt" were opened, for example, in a spreadsheet program. + +{p 4 4 2}{ul:Choosing a style} + +{p 4 4 2}{cmd:estout} has a {cmd:style()} option to set the basic format of +the table. The default style for screen display is the {cmd:smcl} style. +The default export style (i.e. if {cmd:using} is specified) is the +{cmd:tab} style. (See the examples above.) Other predefined styles are +{cmd:fixed}, {cmd:tex}, and {cmd:html}, but it is also possible to define +one's own styles (see {help estout##defaults:Defaults files} in the +{help estout##rem:Remarks} section). The {cmd:tex} style, for example, modifies +the output table for use with LaTeX's tabular environment: + + {com}. estout *, style(tex) varlabels(_cons \_cons) + {res} + & m1& m2\\ + & b& b\\ + weight & 1.746559& 4.613589\\ + mpg & -.0495122& .2631875\\ + forXmpg & & -.3072165\\ + foreign & & 11.24033\\ + \_cons & 1.946068& -14.44958\\ + {txt} +{p 4 4 2} +Note that {cmd:_cons} has been replaced by its LaTeX equivalent in the example above +using the {cmd:varlabels()} option (the underscore character produces an +error in LaTeX unless it is preceded by a backslash). For more +information on the {cmd:varlabels()} option, see {cmd:estout}'s +{help estout##lab:Labeling} options. + +{p 4 4 2}{ul:The cells option} + +{p 4 4 2} +Use the {cmd:cells()} option to specify the parameter statistics to be +tabulated and how they are to be arranged. The parameter statistics +available are {cmd:b} (point estimates; the default), {cmd:se} (standard +errors), {cmd:t} (t-/z-statistics), {cmd:p} (p-values), {cmd:ci} +(confidence intervals; to display the lower and upper bounds in separate +cells use {cmd:ci_l} and {cmd:ci_u}), as well as any additional +parameter statistics included in the {cmd:e()}-returns for the models +(see {cmd:estout}'s {help estout##par:Parameter Statistics} options). For +example, {cmd:cells(b se)} results +in the reporting of point estimates and standard errors: + + {com}. estout *, cells(b se) + {res} + {txt}{hline 38} + {txt} m1 m2 + {txt} b/se b/se + {txt}{hline 38} + {txt}weight {res} 1.746559 4.613589{txt} + {res} .6413538 .7254961{txt} + {txt}mpg {res} -.0495122 .2631875{txt} + {res} .086156 .1107961{txt} + {txt}forXmpg {res} -.3072165{txt} + {res} .1085307{txt} + {txt}foreign {res} 11.24033{txt} + {res} 2.751681{txt} + {txt}_cons {res} 1.946068 -14.44958{txt} + {res} 3.59705 4.42572{txt} + {txt}{hline 38} + +{p 4 4 2} +Multiple statistics are placed in separate rows beneath one another by +default as in the example above. However, elements that are listed in +quotes or in parentheses are placed beside one another. For +example, specifying {bind:{cmd:cells("b se t p")}} or, equivalently, +{bind:{cmd:cells((b se t p))}} produces the following table: + + {com}. estout m2, cells("b se t p") + {res} + {txt}{hline 64} + {txt} m2 + {txt} b se t p + {txt}{hline 64} + {txt}weight {res} 4.613589 .7254961 6.359219 1.89e-08{txt} + {txt}mpg {res} .2631875 .1107961 2.375421 .0203122{txt} + {txt}forXmpg {res} -.3072165 .1085307 -2.830687 .0060799{txt} + {txt}foreign {res} 11.24033 2.751681 4.084896 .0001171{txt} + {txt}_cons {res} -14.44958 4.42572 -3.26491 .0017061{txt} + {txt}{hline 64} + +{p 4 4 2} +The two approaches can be combined. For example, {cmd:cells("b p" se)} +would produce a table with point estimates and standard errors beneath one +another in the first column and p-values in the top row of the second +column for each model. + +{p 4 4 2} +Note that for each statistic named in the {cmd:cells()} option a set of +suboptions may be specified in parentheses. For example, in social sciences +it is common to report standard errors or t-statistics in parentheses beneath +the coefficients and to indicate the significance of individual +coefficients with stars. Furthermore, the results are rounded. Just such a +table can be created using the following procedure: + + {com}. estout *, cells(b(star fmt(3)) t(par fmt(2))) + {res} + {txt}{hline 44} + {txt} m1 m2 + {txt} b/t b/t + {txt}{hline 44} + {txt}weight {res} 1.747** 4.614***{txt} + {res} (2.72) (6.36) {txt} + {txt}mpg {res} -0.050 0.263* {txt} + {res} (-0.57) (2.38) {txt} + {txt}forXmpg {res} -0.307** {txt} + {res} (-2.83) {txt} + {txt}foreign {res} 11.240***{txt} + {res} (4.08) {txt} + {txt}_cons {res} 1.946 -14.450** {txt} + {res} (0.54) (-3.26) {txt} + {txt}{hline 44} + +{p 4 4 2} +The {cmd:estout} default is to display {cmd:*} for p<.05, +{cmd:**} for p<.01, and {cmd:***} for p<.001. However, note that +the significance thresholds and symbols are fully customizable (see {cmd:estout}'s +{help estout##sig:Significance stars} options). + +{p 4 4 2}{ul:The stats option} + +{p 4 4 2} +Finally, use the {cmd:stats()} option to specify scalar +statistics to be displayed for each model in the table footer. The +available scalar statistics are {cmd:aic} (Akaike's information criterion), +{cmd:bic} (Schwarz's information criterion), {cmd:rank} (the rank of +{cmd:e(V)}, i.e. the number of free parameters in model), {cmd:p} (the +p-value of the model), as well as any numeric or string scalars contained in the +{cmd:e()}-returns for the models (see +{cmd:estout}'s +{help estout##sum:Summary statistics} options). For example, specify +{cmd:stats(r2 bic N)} to add the R-squared, BIC, and the number of cases: + + {com}. estout *, stats(r2 bic N) + {res} + {txt}{hline 38} + {txt} m1 m2 + {txt} b b + {txt}{hline 38} + {txt}weight {res} 1.746559 4.613589{txt} + {txt}mpg {res} -.0495122 .2631875{txt} + {txt}forXmpg {res} -.3072165{txt} + {txt}foreign {res} 11.24033{txt} + {txt}_cons {res} 1.946068 -14.44958{txt} + {txt}{hline 38} + {txt}r2 {res} .2933891 .5516277{txt} + {txt}bic {res} 356.2918 331.2406{txt} + {txt}N {res} 74 74{txt} + {txt}{hline 38} +{marker ex1} +{dlgtab:Publication style table} + + {com}. label variable foreign "Foreign car type" + {txt} + {com}. label variable forXmpg "Foreign*Mileage" + {txt} + {com}. estout *, cells(b(star fmt(%9.3f)) se(par)) /// + > stats(r2_a N, fmt(%9.3f %9.0g) labels(R-squared)) /// + > legend label collabels(none) varlabels(_cons Constant) + {res} + {txt}{hline 52} + {txt} Model 1 Model 2 + {txt}{hline 52} + {txt}Weight (lbs.) {res} 1.747** 4.614***{txt} + {res} (0.641) (0.725) {txt} + {txt}Mileage (mpg) {res} -0.050 0.263* {txt} + {res} (0.086) (0.111) {txt} + {txt}Foreign*Mileage {res} -0.307** {txt} + {res} (0.109) {txt} + {txt}Foreign car type {res} 11.240***{txt} + {res} (2.752) {txt} + {txt}Constant {res} 1.946 -14.450** {txt} + {res} (3.597) (4.426) {txt} + {txt}{hline 52} + {txt}R-squared {res} 0.273 0.526 {txt} + {txt}N {res} 74 74 {txt} + {txt}{hline 52} + {txt}* p<0.05, ** p<0.01, *** p<0.001 +{marker ex2} +{dlgtab:t-statistics for selected variables only} + + {com}. estout *, cells(b(star) t(par keep(mpg))) + {res} + {txt}{hline 44} + {txt} m1 m2 + {txt} b/t b/t + {txt}{hline 44} + {txt}weight {res} 1.746559** 4.613589***{txt} + {txt}mpg {res} -.0495122 .2631875* {txt} + {res} (-.5746806) (2.375421) {txt} + {txt}forXmpg {res} -.3072165** {txt} + {txt}foreign {res} 11.24033***{txt} + {txt}_cons {res} 1.946068 -14.44958** {txt} + {txt}{hline 44} +{marker ex3} +{dlgtab:Summary statistics only} + + {com}. estout *, cells(none) stats(r2_a bic N, star) + {res} + {txt}{hline 44} + {txt} m1 m2 + {txt}{hline 44} + {txt}r2_a {res} .2734846*** .5256351***{txt} + {txt}bic {res} 356.2918 331.2406 {txt} + {txt}N {res} 74 74 {txt} + {txt}{hline 44} +{marker ex4} +{dlgtab:Table of descriptives} + + {com}. quietly generate x = uniform() + {txt} + {com}. quietly regress x price weight mpg foreign + {txt} + {com}. estadd mean + + {txt}added matrix: + e(mean) : {res}1 x 5 + {txt} + {com}. estadd sd, nobinary + + {txt}added matrix: + e(sd) : {res}1 x 5 + {txt} + {com}. estout, cells("mean sd") stats(N) mlabels(,none) drop(_cons) + {res} + {txt}{hline 38} + {txt} mean sd + {txt}{hline 38} + {txt}price {res} 6.165257 2.949496{txt} + {txt}weight {res} 3.019459 .7771936{txt} + {txt}mpg {res} 21.2973 5.785503{txt} + {txt}foreign {res} .2972973 {txt} + {txt}{hline 38} + {txt}N {res} 74 {txt} + {txt}{hline 38} +{marker ex5} +{dlgtab:Unstack multiple equations} + + {com}. quietly sureg (price foreign weight length) /// + > (mpg displ = foreign weight) + {txt} + {com}. estout, cells(b t(par)) stats(r2 chi2 p) unstack + {res} + {txt}{hline 51} + {txt} price mpg displacement + {txt} b/t b/t b/t + {txt}{hline 51} + {txt}foreign {res} 3.57526 -1.650029 -25.6127{txt} + {res} (5.749891) (-1.565555) (-2.047999){txt} + {txt}weight {res} 5.691462 -6.587886 96.75485{txt} + {res} (6.182983) (-10.55641) (13.06594){txt} + {txt}length {res} -.0882711 {txt} + {res} (-2.809689) {txt} + {txt}_cons {res} 4.506212 41.6797 -87.23547{txt} + {res} (1.255897) (19.64914) (-3.46585){txt} + {txt}{hline 51} + {txt}r2 {res} .548808 .6627029 .8115213{txt} + {txt}chi2 {res} 89.73586 145.3912 318.6174{txt} + {txt}p {res} 2.50e-19 2.68e-32 6.50e-70{txt} + {txt}{hline 51} +{marker ex7} +{dlgtab:Tabulating a matrix} + +{p 4 4 2} + Use {cmd:estout matrix(}{it:matname}{cmd:)} to tabulate Stata matrix + {it:matname}. Example: + + {com}. set seed 123 + {txt} + {com}. matrix A = matuniform(3,2) + {txt} + {com}. matrix list A + + {txt}A[3,2] + c1 c2 + r1 {res}.91204397 .0075452 + {txt}r2 {res}.28085881 .46027868 + {txt}r3 {res}.56010592 .67319061 + {txt} + {com}. estout matrix(A) + {res} + {txt}{hline 38} + {txt} A + {txt} c1 c2 + {txt}{hline 38} + {txt}r1 {res} .912044 .0075452{txt} + {txt}r2 {res} .2808588 .4602787{txt} + {txt}r3 {res} .5601059 .6731906{txt} + {txt}{hline 38} + +{p 4 4 2} + Numeric formats for the columns can be set using the {cmd:fmt()} + suboption: + + {com}. estout matrix(A, fmt(2 3)) + {res} + {txt}{hline 38} + {txt} A + {txt} c1 c2 + {txt}{hline 38} + {txt}r1 {res} 0.91 0.008{txt} + {txt}r2 {res} 0.28 0.460{txt} + {txt}r3 {res} 0.56 0.673{txt} + {txt}{hline 38} + +{p 4 4 2} + A list of formats can be specified for each column: + + {com}. estout matrix(A, fmt("2 3 4" "4 3 2")) + {res} + {txt}{hline 38} + {txt} A + {txt} c1 c2 + {txt}{hline 38} + {txt}r1 {res} 0.91 0.0075{txt} + {txt}r2 {res} 0.281 0.460{txt} + {txt}r3 {res} 0.5601 0.67{txt} + {txt}{hline 38} +{marker rem} +{title:Remarks} + + Contents + + {help estout##fmt:Numerical formats} + {help estout##spchar:Special characters} + {help estout##atvar:Using @-variables} + {help estout##defaults:Defaults files} +{marker fmt} +{dlgtab:Numerical formats} + +{p 4 4 2} +Numerical display formats may be specified in {cmd:estout} +as follows: + +{p 5 8 2} +1. Official Stata's display formats: You may specify formats, such as +{cmd:%9.0g} or {cmd:%8.2f}. See help {help format} for a list +of available formats. {cmd:%g} or {cmd:g} may be used as a +synonym for {cmd:%9.0g}. + +{p 5 8 2} +2. Fixed format: You may specify an integer value such as {cmd:0}, +{cmd:1}, {cmd:2}, etc. to request a display format with a fixed number +of decimal places. For example, {cmd:cells(t(fmt(3)))} would display +t-statistics with three decimal places. + +{p 5 8 2} +3. Automatic format: You may specify {cmd:a1}, {cmd:a2}, ..., or +{cmd:a9} to cause {cmd:esttab} to choose a reasonable display format for +each number depending on the number's value. {cmd:a} may be used as a +synonym for {cmd:a3}. The {it:#} in +{cmd:a}{it:#} determines the minimum precision according to the +following rules: + +{p 10 12 2} +o Absolute numbers smaller than 1 are displayed with {it:#} +significant decimal places (i.e. with {it:#} decimal places ignoring +any leading zeros after the decimal point). For example, +{cmd:0.00123456} is displayed as {cmd:0.00123} if the format is +{cmd:a3}. + +{p 10 12 2} +o Absolute numbers greater than 1 are displayed with as many digits +required to retain at least one decimal place and are displayed with +a minimum of ({it:#} + 1) digits. For example, if the format is +{cmd:a3}, {cmd:1.23456} is displayed as {cmd:1.235}, {cmd:12.3456} is +displayed as {cmd:12.35}, and {cmd:1234.56} is displayed as +{cmd:1234.6}. + +{p 10 12 2} +o In any case, integers are displayed with zero decimal places, and +very large or very small absolute numbers are displayed in +exponential format. + +{marker spchar} +{dlgtab:Special characters} + +{p 4 4 2} +The {cmd:\} and {cmd:$} characters and quotation marks have +special meanings in Stata. You should therefore consider the following +instructions if you, for example, intend to specify akward delimiters or +specify special characters in labels: + +{p 6 8 2}- Strings containing unmatched quotes should be enclosed in compound double +quotes (thus, {cmd:delimiter(`"""')} results in columns +delimited by {cmd:"}, while {cmd:delimiter(")} produces an error). + +{p 6 8 2}- The backslash character is used to delay macro expansion in +Stata. Specifying {cmd:\\} in Stata 8 just results in the printing of {cmd:\}. To get +a double backslash in Stata 8 (the {cmd:\newline} command in TeX), type {cmd:\\\}. + +{p 6 8 2}- The dollar sign is used for global macro expansion in Stata. Thus, +{cmd:$x} would result in the display of the contents of global macro +{cmd:x} (or nothing, if the macro is empty). Therefore, use +{cmd:\$} to produce {cmd:$} in the output. For math mode in LaTeX I +recommend using {cmd:\(}...{cmd:\)} instead of {cmd:$}...{cmd:$}. + +{p 4 4 2} +Stata's {cmd:char()} function may also be used to specify odd characters +(see help {help strfun}). In particular, {cmd:"`=char(9)'"} +results in a tab character and {cmd:"`=char(13)'"} results +in a carriage return. For example, {bind:{cmd:delimiter(" `=char(9)' ")}} +specifies that a tab character with a leading and +a trailing blank be used as delimiter. + +{p 4 4 2} {it:Tip:} It is sometimes very useful to set the format of all cells in a +spreadsheet to "Text" before pasting the estimates table. This prevents the +spreadsheet program from trying to interpret the cells and ensures that the contents +of the table remain unchanged. + +{marker atvar} +{dlgtab:Using @-variables} + +{p 4 4 2} +{cmd:estout} features several variables that can be used within string +specifications. The following list provides an overview of these variables. + +{p 5 8 2}o{space 2}In {cmd:prehead()}, {cmd:posthead()}, {cmd:prefoot()}, + and {cmd:postfoot()}, in the {cmd:begin()} and {cmd:end()} label + suboptions, and in the {cmd:blist()} and {cmd:elist()} suboptions + in {cmd:varlabels()}: + +{p 12 16 2}{cmd:@span} to return the value of a count variable for the total number of physical + columns of the table. + +{p 12 16 2}{cmd:@M} to return the number of models in the table. + +{p 12 16 2}{cmd:@E} to return the total number columns containing separate equations. + +{p 12 16 2}{cmd:@width} to return the total width of the table (number of characters). + +{p 12 16 2}{cmd:@hline} to return a horizontal line (series of dashes, by default; + see the {cmd:hlinechar()} option). + +{p 5 8 2}o{space 2}In {cmd:prehead()}, {cmd:posthead()}, {cmd:prefoot()}, + and {cmd:postfoot()}: + +{p 12 16 2}{cmd:@title} to return the title specified with the {cmd:title()} option. + +{p 12 16 2}{cmd:@note} to return the note specified with the {cmd:note()} option. + +{p 12 16 2}{cmd:@discrete} to return the explanations provided by the + {cmd:discrete()} option (provided that the {cmd:margin} option is activated). + +{p 12 16 2}{cmd:@starlegend} to return a legend explaining the significance symbols. + +{p 5 8 2}o{space 2}In the {cmd:prefix()} and {cmd:suffix()} suboptions of {cmd:mgroups()}, + {cmd:mlabels()}, {cmd:eqlabels()}, and + {cmd:collabels()}, and in the labels specified in these options: + +{p 12 16 2}{cmd:@span} to return the number of spanned columns. + +{p 5 8 2}o{space 2}In the {cmd:erepeat()} suboption of + {cmd:mgroups()}, {cmd:mlabels()}, {cmd:eqlabels()}, and + {cmd:collabels()}: + +{p 12 16 2}{cmd:@span} to return the range of spanned columns (e.g. {cmd:2-4} if columns 2, 3 and 4 + are spanned). + +{marker defaults} +{dlgtab:Defaults files} + +{p 4 4 2}{ul:Creating new defaults files:} + +{p 4 4 2} +To make available an own set +of default options, proceed as follows: + +{p 8 11 2} +1. Download "estout_mystyle.def" from the SSC +Archive (click +{stata "copy http://fmwww.bc.edu/repec/bocode/e/estout_mystyle.def estout_mystyle.def, text":here} +to copy the file from SSC and store it in the working directory). + +{p 8 11 2} +2. Open "estout_mystyle.def" in a text editor and make the desired modifications +(click {stata "doedit estout_mystyle.def":here} to open "estout_mystyle.def" in Stata's Do-File +Editor). + +{p 8 11 2} +3. Save the file in the current directory or elsewhere +in the ado-file path as {cmd:estout_}{it:newstyle}{cmd:.def} (see help {help sysdir}). + +{p 4 4 2}To use the new options set in {cmd:estout}, then type: + + {inp:. estout} {it:...} {inp:, style(}{it:newstyle}{inp:)} + + +{p 4 4 2}{ul:Defaults files syntax:} + +{p 4 4 2} +{cmd:estout} has two main types of options, which are treated differentially +in defaults files. On the one hand, there are simple on/off options without +arguments, like {cmd:legend} or {cmd:showtabs}. To turn such an option on, +enter the option followed by the options name as an argument, i.e. add the line + + {it:option} {it:option} + +{p 4 4 2} +to the defaults file. For example, + + {inp:legend legend} + +{p 4 4 2} +specifies that a legend be printed in the table footer. Otherwise, if you want +to turn the option of, just delete or comment out the line that contains it (or +specify {it:option} without an argument). + +{p 4 4 2} +To temporarily turn off an option that has been activated in a defaults file, +specify {cmd:no}{it:option} in the command line (do not, however, use +{cmd:no}{it:option} in defaults files). For example, if the legend has been +turned on in the defaults file, but you want to suppress it in a specific call of +{cmd:estout}, type + + {inp:. estout} {it:...}{inp:, nolegend} + +{p 4 4 2} +On the other hand, there are options that take arguments, such as +{cmd:prehead(}{it:args}{cmd:)}, {cmd:delimiter(}{it:args}{cmd:)}, or +{cmd:stats(}{it:args}{cmd:,} {it:...}{cmd:)}. Such options are specified as + + {it:option} {it:args} + +{p 4 4 2} +in the defaults file (where {it:args} must not include suboptions; see +below). Specifying an option in the command line overwrites the settings from +the defaults file. However, note that a {cmd:no} form, which exists for the +first options type, is not available here. + +{p 4 4 2} +Last but not least, there are two options that reflect a combination of the first +and second types: {cmd:eform}[{cmd:(}{it:args}{cmd:)}] and +{cmd:margin}[{cmd:(}{it:args}{cmd:)}]. These options can be specified +as either + + {it:option} {it:option} + +{p 4 4 2} +or + + {it:option} {it:args} + +{p 4 4 2} +in the defaults file; the {cmd:no} form is allowed. + +{p 4 4 2} +Many {cmd:estout} options have suboptions, i.e., an option might take the +form {it:option}{cmd:(}{it:...}{cmd:,} {it:suboption}{cmd:)} or +{it:option}{cmd:(}{it:...}{cmd:,} {it:suboption}{cmd:(}{it:args}{cmd:))}. In +the defaults file, the suboptions cannot be included in the +definition of a higher-level option. Instead, they must be +specified in their own lines, as either + + {it:optionsuboption} {it:suboption} + +{p 4 4 2} +or + + {it:optionsuboption} {it:args} + +{p 4 4 2} +In the case of a two-level nesting of options, the name +used to refer to the suboption is a concatenation of the option's name and the +suboption's name, +i.e. {cmd:"}{it:optionsuboption}{cmd:"="}{it:option}{cmd:"+"}{it:suboption}{cmd:"}. For +example, the {cmd:labels()} suboption of the {cmd:stats()} option would be +set by the term {cmd:statslabels}. Analogously, the three level nesting in +the {cmd:stats()} option yields suboption names composed of three names. For +instance, the suboption called by the command + + {inp:. estout} {it:...}{inp:, stats(}{it:...}{inp:, labels(}{it:...}{inp:, prefix(}{it:args}{inp:)))} + +{p 4 4 2} +would be referred to as + + {inp:statslabelsprefix} {it:args} + +{p 4 4 2} +in the defaults file. The {cmd:cells()} option represents an exception to +this rule. It may be defined in the defaults file using +only a plain array of cells elements without suboptions, e.g. + + {inp:cells "b se" p} + +{p 4 4 2} +However, the suboptions of the cells elements may be referred to as +{it:el_suboption}, for example + + {inp:b_star star} + +{p 4 4 2} +or + + {inp:se_par [ ]} + + +{p 4 4 2}{ul:Comments in defaults files:} + +{p 4 4 2} +Be aware that the support for comments in defaults files is limited. In +particular, the {cmd:/*} and {cmd:*/} comment indicators cannot be used. +The other comment indicators work (more or less) as usual, that is: + +{p 5 8 2} + o{space 2}Empty lines and lines beginning with {cmd:*} (with or without preceding +blanks) will be ignored. + +{p 5 8 2} + o{space 2}{cmd://} preceded by one or more blanks indicates that the rest of the +line should be ignored. Lines beginning with {cmd://} (with or without preceding +blanks) will be ignored. + +{p 5 8 2} + o{space 2}{cmd:///} preceded by one or more blanks indicates that the rest of the +line should be ignored and the part of the line preceding it should be added to +the next line. In other words, {cmd:///} can be used to split commands into +two or more lines of code. + +{marker ret} +{title:Saved results} + +{p 4 4 2} +{cmd:estout} saves the following in {cmd:r()}: + +{p 4 4 2}Scalars + {p_end} +{p 6 20 2}{cmd:r(nmodels)}{space 4}number of models + {p_end} +{p 6 20 2}{cmd:r(ccols)}{space 6}number of columns per model in {cmd:r(coefs)} + {p_end} + +{p 4 4 2}Macros + {p_end} +{p 6 20 2}{cmd:r(cmdline)}{space 4}command as typed + {p_end} +{p 6 20 2}{cmd:r(names)}{space 6}names of models + {p_end} +{p 6 20 2}{cmd:r(m}{it:#}{cmd:_}{it:name}{cmd:)}{space 4}model-specific +macros where {it:#} is the model number and {it:name} is macro name + {p_end} + +{p 4 4 2}Matrices + {p_end} +{p 6 20 2}{cmd:r(coefs)}{space 6}coefficients + {p_end} +{p 6 20 2}{cmd:r(stats)}{space 6}summary statistics + {p_end} + +{marker ref} +{title:References} + +{p 4 8 2}Cong, R. (2000). sg144: Marginal effects of the tobit model. +{it:Stata Technical Bulletin} 56: 27-34. + +{p 4 8 2}Jann, B. (2005). Making regression tables from stored estimates. +{it:The Stata Journal} 5(3): 288-308. + +{p 4 8 2}Jann, B. (2007). Making regression tables simplified. +{it:The Stata Journal} 7(2): 227-244. + +{p 4 8 2}Newson, R. (2003). Confidence intervals and p-values for delivery to the end +user. {it:The Stata Journal} 3(3): 245-269. + +{marker ack} +{title:Acknowledgements} + +{p 4 4 2}I would like to thank numerous people +for their comments and suggestions. Among them +are +Joao Pedro Azevedo, +Kit Baum, +Elisabeth Coutts, +Henriette Engelhardt, +Jonathan Gardnerand, +Simone Hirschvogl, +Daniel Hoechle, +Friedrich Huebler, +Maren Kandulla, +J. Scott Long, +David Newhouse, +Clive Nicholas, +Fredrik Wallenberg, +Ian Watson, and +Vince Wiggins. + +{marker aut} +{title:Author} + + Ben Jann, Institute of Sociology, University of Bern, jann@soz.unibe.ch + +{marker als} +{title:Also see} + + Manual: {hi:[R] estimates} + + SJ: SJ5-3 st0085 (Jann 2005) + SJ7-2 st0085_1 (Jann 2007) + +{p 4 13 2}Online: help for + {helpb estimates}, + {help estcom}, + {helpb est_table:estimates table}, + {helpb ereturn}, + {help format}, + {helpb file}, + {helpb mfx}, + {helpb eststo}, + {helpb esttab}, + {helpb estadd}, + {helpb estpost} +{p_end} diff --git a/ado/e/estpost.ado b/ado/e/estpost.ado new file mode 100644 index 0000000..3488a43 --- /dev/null +++ b/ado/e/estpost.ado @@ -0,0 +1,2124 @@ +*! version 1.2.2 10feb2023 Ben Jann +* 1. estpost +* 2. estpost_summarize +* 3. estpost_tabulate +* 4. estpost_tabstat +* 5. estpost_ttest +* 6. estpost_correlate +* 7. estpost_stci (Stata 9 required) +* 8. estpost_ci +* 9. estpost_prtest +* 10. estpost__svy_tabulate +* 12. estpost_gtabstat +* 99. _erepost + +* 1. estpost +program estpost, rclass // rclass => remove r()'s left behind by subcommand + version 8.2 + local caller : di _caller() + capt syntax [, * ] + if _rc==0 { // => for bootstrap + _coef_table_header + ereturn display, `options' + exit + } + gettoken subcommand rest : 0, parse(" ,:") + capt confirm name `subcommand' + if _rc { + di as err "invalid subcommand" + exit 198 + } + + local l = length(`"`subcommand'"') + if `"`subcommand'"'==substr("summarize",1,max(2,`l')) local subcommand "summarize" + else if `"`subcommand'"'==substr("tabulate",1,max(2,`l')) local subcommand "tabulate" + else if `"`subcommand'"'==substr("correlate",1,max(3,`l')) local subcommand "correlate" + else if `"`subcommand'"'=="svy" { + _estpost_parse_svy `macval(rest)' + } + else if substr(`"`subcommand'"',1,5)=="_svy_" { + di as err "invalid subcommand" + exit 198 + } + + capt local junk: properties estpost_`subcommand' // does not work in Stata 8 + if _rc==199 { + di as err "invalid subcommand" + exit 198 + } + + version `caller': estpost_`subcommand' `macval(rest)' + //eret list +end +program _estpost_markout2 // marks out obs that are missing on *all* variables + gettoken touse varlist: 0 + if `:list sizeof varlist'>0 { + tempname touse2 + gen byte `touse2' = 0 + foreach var of local varlist { + qui replace `touse2' = 1 if !missing(`var') + } + qui replace `touse' = 0 if `touse2'==0 + } +end +program _estpost_parse_svy + version 9.2 + _on_colon_parse `0' + local 0 `"`s(after)'"' + gettoken subcommand rest : 0, parse(" ,") + local l = length(`"`subcommand'"') + if `"`subcommand'"'==substr("tabulate",1,max(2,`l')) local subcommand "tabulate" + c_local subcommand `"_svy_`subcommand'"' + c_local rest `"`s(before)' : `rest'"' +end +program _estpost_namesandlabels // used by some routines such as estpost_tabulate + version 8.2 // returns locals names, savenames, and labels + args varname values0 labels0 elabel + if `"`values0'"'=="" { // generate values: 1 2 3 ... + local i 0 + foreach label of local labels0 { + local values0 `values0' `++i' + } + } + local haslabels = "`elabel'"!="" + if `"`labels0'"'=="" & "`varname'"!="" { + local vallab: value label `varname' + } + while (1) { + gettoken value values0 : values0 + if "`value'"=="" continue, break //=> exit loop + if `"`vallab'"'!="" { + local lbl: label `vallab' `value', strict + } + else { + gettoken lbl labels0 : labels0 + } + if index("`value'",".") { + local haslabels 1 + if `"`macval(lbl)'"'=="" { + local lbl "`value'" + } + local value: subinstr local value "." "_missing_" + } + local names0 `names0' `value' + if `"`macval(lbl)'"'!="" { + local labels `"`macval(labels)'`lblspace'`value' `"`macval(lbl)'"'"' + local lblspace " " + } + if `haslabels' continue + if `"`macval(lbl)'"'=="" { + local names `"`names'`space'`value'"' + local savenames `"`savenames'`space'`value'"' + } + else { + if regexm(`"`macval(lbl)'"', `"[:."]"') local haslabels 1 + else if length(`"`macval(lbl)'"')>30 local haslabels 1 + else { + local names `"`names'`space'`"`lbl'"'"' + local lbl: subinstr local lbl " " "_", all + local savenames `"`savenames'`space'`lbl'"' + } + } + local space " " + } + if `haslabels' { + local names `names0' + local savenames `names0' + } + c_local names `"`names'"' // to be used as matrix row- or colnames + c_local savenames `"`savenames'"' // names without spaces (for matlist) + if `haslabels' { + c_local labels `"`macval(labels)'"' // label dictionary + } + else c_local labels "" +end +program _estpost_eqnamesandlabels // used by some routines such as estpost_tabulate + version 8.2 // returns locals eqnames and eqlabels + args varname values0 labels0 elabel + if `"`values0'"'=="" { // generate values: 1 2 3 ... + local i 0 + foreach label of local labels0 { + local values0 `values0' `++i' + } + } + local haslabels = "`elabel'"!="" + if `"`labels0'"'=="" & "`varname'"!="" { + local vallab: value label `varname' + } + while (1) { + gettoken value values0 : values0 + if "`value'"=="" continue, break //=> exit loop + if `"`vallab'"'!="" { + local lbl: label `vallab' `value', strict + } + else { + gettoken lbl labels0 : labels0 + } + if index("`value'",".") { + local haslabels 1 + if `"`macval(lbl)'"'=="" { + local lbl "`value'" + } + local value: subinstr local value "." "_missing_" + } + local names0 `names0' `value' + if `"`macval(lbl)'"'=="" local lbl "`value'" + local labels `"`macval(labels)'`lblspace'`"`macval(lbl)'"'"' + local lblspace " " + if `haslabels' continue + if `"`macval(lbl)'"'=="" { + local names `"`names'`space'`value'"' + } + else { + if regexm(`"`macval(lbl)'"', `"[:."]"') local haslabels 1 + else if length(`"`macval(lbl)'"')>30 local haslabels 1 + else { + local names `"`names'`space'`"`lbl'"'"' + } + } + local space " " + } + if `haslabels' { + local names `names0' + } + c_local eqnames `"`names'"' // to be used as matrix roweqs or coleqs + if `haslabels' { + c_local eqlabels `"`macval(labels)'"' // list of labels + } + else c_local eqlabels "" +end + +* 2. estpost_summarize: wrapper for -summarize- +prog estpost_summarize, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax [varlist] [if] [in] [aw fw iw] [, ESample Quietly /// + LISTwise CASEwise Detail MEANonly ] + if "`casewise'"!="" local listwise listwise + + // sample + if "`listwise'"!="" marksample touse + else { + marksample touse, nov + _estpost_markout2 `touse' `varlist' + } + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // gather results + local nvars: list sizeof varlist + tempname emptymat + mat `emptymat' = J(1, `nvars', .) + mat coln `emptymat' = `varlist' + local i 0 + local rnames "" + foreach v of local varlist { + local ++i + qui summarize `v' if `touse' [`weight'`exp'], `detail' `meanonly' + local rnamesi: r(scalars) + local rnamesi: list rnamesi - rnames + if `"`rnamesi'"'!="" { + foreach name of local rnamesi { + tempname _`name' + mat `_`name'' = `emptymat' + } + local rnames: list rnames | rnamesi + } + foreach rname of local rnames { + mat `_`rname''[1,`i'] = r(`rname') + } + } + + // display + if "`quietly'"=="" { + tempname res + local rescoln + foreach rname of local rnames { + mat `res' = nullmat(`res'), `_`rname''' + if "`rname'"=="N" { + local rescoln `rescoln' e(count) + } + else { + local rescoln `rescoln' e(`rname') + } + } + mat coln `res' = `rescoln' + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) + } + else { + matlist `res', nohalf lines(oneline) + } + mat drop `res' + } + + // post results + local b + local V + if c(stata_version)<9 { // b and V required in Stata 8 + tempname b V + mat `b' = J(1, `nvars', 0) + mat coln `b' = `varlist' + mat `V' = `b'' * `b' + } + if "`esample'"!="" local esample esample(`touse') + eret post `b' `V', obs(`N') `esample' + + eret scalar k = `nvars' + + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local subcmd "summarize" + eret local cmd "estpost" + + local nmat: list sizeof rnames + forv i=`nmat'(-1)1 { + local rname: word `i' of `rnames' + if "`rname'"=="N" { + eret matrix count = `_N' + continue + } + eret matrix `rname' = `_`rname'' + } +end + + +* 2. estpost_tabulate: wrapper for -tabulate- +prog estpost_tabulate, eclass + version 8.2 + local caller : di _caller() // not used + syntax varlist(min=1 max=2) [if] [in] [fw aw iw pw] [, * ] + if `:list sizeof varlist'==1 { + version `caller': estpost_tabulate_oneway `0' + } + else { + version `caller': estpost_tabulate_twoway `0' + } +end +prog estpost_tabulate_oneway, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax varname [if] [in] [fw aw iw] [, ESample Quietly /// + noTOTal subpop(passthru) Missing sort noLabel ELabels ] + + // sample + if "`missing'"!="" marksample touse, nov strok + else marksample touse, strok + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // handle string variables + capt confirm numeric variable `varlist' + if _rc { + tempname varname + qui encode `varlist' if `touse', generate(`varname') + } + else local varname `varlist' + + // gather results + tempname count vals + tab `varname' if `touse' [`weight'`exp'], nofreq /// + matcell(`count') matrow(`vals') `subpop' `missing' `sort' + local N = r(N) + mat `count' = `count'' + local R = r(r) + forv r = 1/`R' { + local value: di `vals'[`r',1] + local values `values' `value' + } + if "`label'"=="" { + _estpost_namesandlabels `varname' "`values'" "" "`elabels'" // sets names, savenames, labels + } + else { + _estpost_namesandlabels "" "`values'" "" "`elabels'" + } + if "`total'"=="" { + mat `count' = `count', `N' + local names `"`names' Total"' + local savenames `"`savenames' Total"' + local linesopt "lines(rowtotal)" + } + mat colname `count' = `names' + tempname percent cum + mat `percent' = `count'/`N'*100 + mat `cum' = J(1, colsof(`count'), .z) + mat colname `cum' = `names' + mat `cum'[1,1] = `count'[1,1] + forv r = 2/`R' { + mat `cum'[1,`r'] = `cum'[1,`r'-1] + `count'[1,`r'] + } + mat `cum' = `cum'/`N'*100 + + // display + if "`quietly'"=="" { + tempname res + mat `res' = `count'', `percent'', `cum'' + mat coln `res' = e(b) e(pct) e(cumpct) + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) nodotz + } + else { + mat rown `res' = `savenames' + matlist `res', nohalf `linesopt' rowtitle(`varlist') nodotz + } + mat drop `res' + if `"`macval(labels)'"'!="" { + di _n as txt "row labels saved in macro e(labels)" + } + } + + // post results + local V + if c(stata_version)<9 { // V required in Stata 8 + tempname V + mat `V' = `count'' * `count' * 0 + } + if "`esample'"!="" local esample esample(`touse') + eret post `count' `V', depname(`varlist') obs(`N') `esample' + eret scalar r = r(r) + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local labels `"`macval(labels)'"' + eret local depvar "`varlist'" + eret local subcmd "tabulate" + eret local cmd "estpost" + eret mat cumpct = `cum' + eret mat pct = `percent' +end +prog estpost_tabulate_twoway, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax varlist(min=2 max=2) [if] [in] [fw aw iw] [, ESample Quietly /// + noTOTal Missing noLabel ELabels /// + CHi2 Exact Exact2(passthru) Gamma LRchi2 Taub v All noLOg ] + local v = upper("`v'") + local qui2 "`quietly'" + local hastests = `"`chi2'`exact'`exact2'`gamma'`lrchi2'`taub'`v'`all'"'!="" + if `hastests' local nofreq nofreq + else local qui2 "quietly" + + // sample + if "`missing'"!="" marksample touse, nov strok + else marksample touse, strok + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // handle string variables + gettoken rvar cvar : varlist + gettoken cvar : cvar + foreach d in r c { + capt confirm numeric variable ``d'var' + if _rc { + tempname `d'varname + qui encode ``d'var' if `touse', generate(``d'varname') + } + else local `d'varname ``d'var' + } + + // gather results + tempname cell rvals cvals + if `hastests' { + `quietly' di "" + } + `qui2' tab `rvarname' `cvarname' if `touse' [`weight'`exp'], `nofreq' /// + matcell(`cell') matrow(`rvals') matcol(`cvals') `missing' /// + `chi2' `exact' `exact2' `gamma' `lrchi2' `taub' `v' `all' `log' + mat `cvals' = `cvals'' + local N = r(N) + tempname rtot ctot + mat `ctot' = J(1,rowsof(`cell'),1) * `cell' + mat `rtot' = `cell' * J(colsof(`cell'),1,1) + foreach d in r c { + local I = r(`d') + forv i = 1/`I' { + local value: di ``d'vals'[`i',1] + local `d'values ``d'values' `value' + } + } + if "`label'"=="" { + _estpost_namesandlabels `rvarname' "`rvalues'" "" "`elabels'" // sets names, savenames, labels + _estpost_eqnamesandlabels `cvarname' "`cvalues'" "" "`elabels'" // sets eqnames, eqlabels + } + else { + _estpost_namesandlabels "" "`rvalues'" "" "`elabels'" // sets names, savenames, labels + _estpost_eqnamesandlabels "" "`cvalues'" "" "`elabels'" // sets eqnames, eqlabels + } + local savenames0 `"`savenames'"' + local savenames + if "`total'"=="" { + mat `ctot' = `ctot', `N' + mat `cell' = (`cell', `rtot') \ `ctot' + mat `rtot' = `rtot' \ `N' + local names `"`names' Total"' + local savenames0 `"`savenames0' Total"' + local eqnames `"`eqnames' Total"' + } + mat rowname `cell' = `names' + tempname count col row tot tmp + forv i = 1/`=colsof(`cell')' { + gettoken eq eqnames : eqnames + mat `tmp' = `cell'[1...,`i'] + mat roweq `tmp' = `"`eq'"' + mat `tmp' = `tmp'' + mat `count' = nullmat(`count'), `tmp' + mat `col' = nullmat(`col'), `tmp' / `ctot'[1,`i']*100 + forv j = 1/`=colsof(`tmp')' { + mat `tmp'[1,`j'] = `tmp'[1,`j'] / `rtot'[`j',1]*100 + } + mat `row' = nullmat(`row'), `tmp' + local savenames `"`savenames' `savenames0'"' + } + mat `tot' = `count' / `N'*100 + + // display + if "`quietly'"=="" { + tempname res + mat `res' = `count'', `tot'', `col'', `row'' + mat coln `res' = e(b) e(pct) e(colpct) e(rowpct) + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) + } + else { + mat rown `res' = `savenames' + di _n as res %-12s abbrev("`cvar'",12) as txt " {c |}{space 44}" + matlist `res', twidth(12) format(%9.0g) noblank nohalf rowtitle(`rvar') + } + mat drop `res' + if `"`macval(labels)'`macval(eqlabels)'"'!="" { + di "" + if `"`macval(labels)'"'!="" { + di as txt "row labels saved in macro e(labels)" + } + if `"`macval(eqlabels)'"'!="" { + di as txt "column labels saved in macro e(eqlabels)" + } + } + } + + // post results + local V + if c(stata_version)<9 { // V required in Stata 8 + tempname V + mat `V' = `count'' * `count' * 0 + } + if "`esample'"!="" local esample esample(`touse') + eret post `count' `V', obs(`N') `esample' + local rscalars: r(scalars) + local rscalars: subinstr local rscalars "N" "", word + foreach rsc of local rscalars { + eret scalar `rsc' = r(`rsc') + } + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local labels `"`macval(labels)'"' + eret local eqlabels `"`macval(eqlabels)16jun2015'"' + eret local colvar "`cvar'" + eret local rowvar "`rvar'" + eret local subcmd "tabulate" + eret local cmd "estpost" + eret mat rowpct = `row' + eret mat colpct = `col' + eret mat pct = `tot' +end + + +* 4. estpost_tabstat: wrapper for -tabstat- +prog estpost_tabstat, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax varlist [if] [in] [aw fw] [, ESample Quietly /// + Statistics(passthru) stats(passthru) LISTwise CASEwise /// + by(varname) noTotal Missing Columns(str) ELabels ] + if "`casewise'"!="" local listwise listwise + local l = length(`"`columns'"') + if `"`columns'"'==substr("variables",1,max(1,`l')) local columns "variables" + else if `"`columns'"'==substr("statistics",1,max(1,`l')) local columns "statistics" + else if `"`columns'"'=="stats" local columns "statistics" + else if `"`columns'"'=="" { + if `:list sizeof varlist'>1 local columns "variables" + else local columns "statistics" + } + else { + di as err `"columns(`columns') invalid"' + exit 198 + } + + // sample + if "`listwise'"!="" marksample touse + else { + marksample touse, nov + _estpost_markout2 `touse' `varlist' + } + if "`by'"!="" { + capt confirm string variable `by' + local numby = (_rc!=0) + if `numby' { + tempname tmpby + qui gen `:type `by'' `tmpby' = `by' + } + else local tmpby `by' + if "`missing'"=="" markout `touse' `by', strok + local byopt "by(`tmpby')" + } + else local numby 0 + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // gather results + if "`total'"!="" & "`by'"=="" { + di as txt "nothing to post" + eret clear + exit + } + qui tabstat `varlist' if `touse' [`weight'`exp'], save /// + `statistics' `stats' `byopt' `total' `missing' columns(`columns') + tempname tmp + capt confirm matrix r(StatTot) + if _rc { + mat `tmp' = r(Stat1) + } + else { + mat `tmp' = r(StatTot) + } + if `"`columns'"'=="statistics" { + local cnames: rownames `tmp' + local cnames: subinstr local cnames "N" "count", word all + local cnames: subinstr local cnames "se(mean)" "semean", word all + local R = colsof(`tmp') + local stats "`cnames'" + local vars: colnames `tmp' + } + else { + local cnames: colnames `tmp' + local R = rowsof(`tmp') + local stats: rownames `tmp' + local stats: subinstr local stats "N" "count", word all + local stats: subinstr local stats "se(mean)" "semean", word all + local vars "`cnames'" + local cnames: subinstr local cnames "b" "_b", word all + local cnames: subinstr local cnames "V" "_V", word all + } + local j 0 + foreach cname of local cnames { + tempname _`++j' + } + local groups: r(macros) + local g: list sizeof groups + local space + local labels + forv i = 1/`g' { + local labels `"`labels'`space'`"`r(name`i')'"'"' + } + if `R'==1 { + if `numby' { + _estpost_namesandlabels "`by'" `"`labels'"' "" "`elabels'" // sets names, savenames, labels + } + else { + _estpost_namesandlabels "" "" `"`labels'"' "`elabels'" // sets names, savenames, labels + } + } + else { + if `numby' { + _estpost_eqnamesandlabels "`by'" `"`labels'"' "" "`elabels'" // sets eqnames, eqlabels + } + else { + _estpost_eqnamesandlabels "" "" `"`labels'"' "`elabels'" // sets eqnames, eqlabels + } + local names `"`eqnames'"' + local labels `"`macval(eqlabels)'"' + } + forv i = 1/`g' { + gettoken name names : names + mat `tmp' = r(Stat`i') + mat rown `tmp' = `stats' + if `"`columns'"'=="statistics" { + mat `tmp' = `tmp'' + } + if `R'==1 { + mat rown `tmp' = `"`name'"' + } + else { + mat roweq `tmp' = `"`name'"' + } + local j 0 + foreach cname of local cnames { + local ++j + mat `_`j'' = nullmat(`_`j''), `tmp'[1..., `j']' + } + } + if "`total'"=="" { + mat `tmp' = r(StatTot) + mat rown `tmp' = `stats' + if `"`columns'"'=="statistics" { + mat `tmp' = `tmp'' + } + if `g'>0 { + if `R'==1 { + mat rown `tmp' = "Total" + local savenames `"`savenames' Total"' + local rowtotal "lines(rowtotal)" + } + else { + mat roweq `tmp' = "Total" + if `"`labels'"'!="" { + local labels `"`macval(labels)' Total"' + } + } + } + local j 0 + foreach cname of local cnames { + local ++j + mat `_`j'' = nullmat(`_`j''), `tmp'[1..., `j']' + } + } + + // display + if "`quietly'"=="" { + tempname res + local rescoln + local j 0 + foreach cname of local cnames { + local ++j + mat `res' = nullmat(`res'), `_`j''' + local rescoln `rescoln' e(`cname') + } + mat coln `res' = `rescoln' + di _n as txt "Summary statistics: `stats'" + di as txt " for variables: `vars'" + if "`by'"!="" { + di as txt " by categories of: `by'" + } + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) + } + else { + if `R'==1 & `g'>0 { + mat rown `res' = `savenames' + } + matlist `res', nohalf `rowtotal' rowtitle(`by') + } + if `"`macval(labels)'"'!="" { + di _n as txt "category labels saved in macro e(labels)" + } + mat drop `res' + } + + // post results + local b + local V + if c(stata_version)<9 { // b and V required in Stata 8 + tempname b V + mat `b' = `_1' \ J(1, colsof(`_1'), 0) + mat `b' = `b'[2,1...] + mat `V' = `b'' * `b' + } + if "`esample'"!="" local esample esample(`touse') + eret post `b' `V', obs(`N') `esample' + + eret local labels `"`macval(labels)'"' + eret local byvar "`by'" + eret local vars "`vars'" + eret local stats "`stats'" + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local subcmd "tabstat" + eret local cmd "estpost" + + local nmat: list sizeof cnames + forv j=`nmat'(-1)1 { + local cname: word `j' of `cnames' + eret matrix `cname' = `_`j'' + } +end + + +* 5. estpost_ttest: wrapper for -ttest- (two-sample) +prog estpost_ttest, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax varlist(numeric) [if] [in] , by(varname) [ ESample Quietly /// + LISTwise CASEwise UNEqual Welch ] + if "`casewise'"!="" local listwise listwise + + // sample + if "`listwise'"!="" marksample touse + else { + marksample touse, nov + _estpost_markout2 `touse' `varlist' + } + markout `touse' `by', strok + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // gather results + local nvars: list sizeof varlist + tempname diff count + mat `diff' = J(1, `nvars', .) + mat coln `diff' = `varlist' + mat `count' = `diff' + local mnames se /*sd*/ t df_t p_l p p_u N_1 mu_1 /*sd_1*/ N_2 mu_2 /*sd_2*/ + foreach m of local mnames { + tempname `m' + mat ``m'' = `diff' + } + local i 0 + foreach v of local varlist { + local ++i + qui ttest `v' if `touse', by(`by') `unequal' `welch' + mat `diff'[1,`i'] = r(mu_1) - r(mu_2) + mat `count'[1,`i'] = r(N_1) + r(N_2) + foreach m of local mnames { + mat ``m''[1,`i'] = r(`m') + } + } + + // display + if "`quietly'"=="" { + tempname res + mat `res' = `diff'', `count'' + local rescoln "e(b) e(count)" + foreach m of local mnames { + mat `res' = `res', ``m''' + local rescoln `rescoln' e(`m') + } + mat coln `res' = `rescoln' + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) + } + else { + matlist `res', nohalf lines(oneline) + } + mat drop `res' + } + + // post results + local V + if c(stata_version)<9 { // V required in Stata 8 + tempname V + mat `V' = diag(vecdiag(`se'' * `se')) + } + if "`esample'"!="" local esample esample(`touse') + eret post `diff' `V', obs(`N') `esample' + + eret scalar k = `nvars' + + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local welch "`welch'" + eret local unequal "`unequal'" + eret local byvar "`by'" + eret local subcmd "ttest" + eret local cmd "estpost" + + local nmat: list sizeof mnames + forv i=`nmat'(-1)1 { + local m: word `i' of `mnames' + eret matrix `m' = ``m'' + } + eret matrix count = `count' +end + + +* 6. estpost_correlate: wrapper for -correlate- +prog estpost_correlate, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax varlist [if] [in] [aw fw iw pw] [, ESample Quietly /// + LISTwise CASEwise Matrix noHalf noLabel ELabels ELabels2(str asis) /// + Print(real 1) /*Covariance*/ Bonferroni SIDak ] + if "`casewise'"!="" local listwise listwise + if "`bonferroni'"!="" & "`sidak'"!="" { + di as err "only one of bonferroni and sidak allowed" + exit 198 + } + local pw = ("`weight'"=="pweight") + if `:list sizeof varlist'<=1 & `"`matrix'"'=="" { + di as err "too few variables specified" + exit 102 + } + if `"`matrix'"'!="" & `"`half'"'!="" local fullmatrix fullmatrix + + // sample + if "`listwise'"!="" marksample touse + else { + marksample touse, nov + _estpost_markout2 `touse' `varlist' + } + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // gather results + tempname b rho pval count + if "`bonferroni'`sidak'"!="" { + local nvars : list sizeof varlist + local k = `nvars' * (`nvars'-1) / 2 + } + foreach depvar of local varlist { + if `"`fullmatrix'"'!="" { + local indepvars `varlist' + } + else if `"`matrix'"'!="" { + local indepvars `depvar' `ferest()' + } + else { + local indepvars `ferest()' + } + foreach v of local indepvars { + qui reg `depvar' `v' [`weight'`exp'] if `touse' + local r = sqrt(e(r2)) * (-1)^(_b[`v']<0) + local n = e(N) + mat `b' = nullmat(`b'), `r' + if "`depvar'"=="`v'" { + mat `rho' = nullmat(`rho'), `r' + mat `count' = nullmat(`count'), `n' + mat `pval' = nullmat(`pval'), .z + continue + } + local p = Ftail(e(df_m), e(df_r), e(F)) + if `pw' { + qui reg `v' `depvar' [`weight'`exp'] if `touse' + local p = max(`p', Ftail(e(df_m), e(df_r), e(F))) + } + if "`bonferroni'"!="" { + local p = min(1, `k'*`p') + } + else if "`sidak'"!="" { + local p = min(1, 1 - (1-`p')^`k') + } + if `p'>`print' { + local r .z + local n .z + local p .z + } + mat `rho' = nullmat(`rho'), `r' + mat `count' = nullmat(`count'), `n' + mat `pval' = nullmat(`pval'), `p' + } + if `"`matrix'`fullmatrix'"'=="" { + local colnames `indepvars' + local depname `depvar' + continue, break + } + foreach v of local indepvars { + local colnames `"`colnames'`depvar':`v' "' + } + } + mat coln `b' = `colnames' + mat coln `rho' = `colnames' + mat coln `count' = `colnames' + mat coln `pval' = `colnames' + local vce `"`e(vce)'"' // from last -regress- call + local vcetype `"`e(vcetype)'"' + + // display + if "`quietly'"=="" { + tempname res + mat `res' = `b'', `rho'', `pval'', `count'' + mat coln `res' = e(b) e(rho) e(p) e(count) + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) nodotz + } + else { + matlist `res', nohalf lines(oneline) rowtitle(`depname') nodotz + } + mat drop `res' + } + + // post results + local V + if c(stata_version)<9 { // V required in Stata 8 + tempname V + mat `V' = `b'' * `b' * 0 + } + if "`esample'"!="" local esample esample(`touse') + eret post `b' `V', depname(`depname') obs(`N') `esample' + eret local vcetype `"`vcetype'"' + eret local vce `"`vce'"' + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local depvar `depname' + eret local subcmd "correlate" + eret local cmd "estpost" + eret matrix count = `count' + eret matrix p = `pval' + eret matrix rho = `rho' + // additional labels in case of matrix + if `"`matrix'"'=="" exit + if `"`elabels'`elabels2'"'=="" exit + gettoken lhs rhs : elabels2 + gettoken rhs : rhs + local space + local vlbls + local eqlbls + local i 0 + foreach v of local varlist { + local ++i + local num `"`lhs'`i'`rhs'"' + local eqlbls `"`eqlbls'`space'`"`num'"'"' + local space " " + local lbl + if "`label'"=="" { + local lbl: var lab `v' + } + if `"`lbl'"'=="" local lbl "`v'" + local vlbls `vlbls' `v' `"`num' `lbl'"' + } + eret local labels `"`vlbls'"' + eret local eqlabels `"`eqlbls'"' +end + + +* 7. estpost_stci: wrapper for -stci- +prog estpost_stci, eclass + version 9.2 // Stata 8 not supported because levelsof is used + local caller : di _caller() // not used + + // syntax + syntax [if] [in] [ , ESample Quietly by(varname) /// + Median Rmean Emean p(numlist >0 <100 integer max=1) /// + CCorr Level(real `c(level)') ELabels ] + local stat "p50" + if `"`p'"'!="" { + local stat `"p`p'"' + local p `"p(`p')"' + } + else if "`rmean'"!="" local stat "rmean" + else if "`emean'"!="" local stat "emean" + + // sample + marksample touse + if `"`by'"'!="" { + markout `touse' `by', strok + } + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // get results + tempname _`stat' se N_sub lb ub + if "`by'"!="" { + qui levelsof `by' if `touse', local(levels) + capt confirm string variable `by' + if _rc { + local vallab: value label `by' + if `"`vallab'"'!="" { + _estpost_namesandlabels `by' `"`levels'"' "" "`elabels'" // sets names, savenames, labels + } + else { + local names `"`levels'"' + local savenames `"`levels'"' + } + } + else { + _estpost_namesandlabels `by' "" `"`levels'"' "`elabels'" // sets names, savenames, labels + } + } + local levels `"`levels' "total""' + local names `"`names' "total""' + local savenames `"`savenames' "total""' + gettoken l rest : levels, quotes + while (`"`l'"'!="") { + if `"`rest'"'=="" local lcond + else local lcond `" & `by'==`l'"' + qui stci if `touse'`lcond', `median' `rmean' `emean' `p' `ccorr' level(`level') + mat `_`stat'' = nullmat(`_`stat''), r(`stat') + mat `se' = nullmat(`se'), r(se) + mat `N_sub' = nullmat(`N_sub'), r(N_sub) + mat `lb' = nullmat(`lb'), r(lb) + mat `ub' = nullmat(`ub'), r(ub) + gettoken l rest : rest, quotes + } + foreach m in _`stat' se N_sub lb ub { + mat coln ``m'' = `names' + } + + // display + if "`quietly'"=="" { + tempname res + mat `res' = `N_sub'', `_`stat''', `se'', `lb'', `ub'' + mat coln `res' = e(count) e(`stat') e(se) e(lb) e(ub) + di as txt "(confidence level is " `level' "%)" + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) nodotz + } + else { + mat rown `res' = `savenames' + matlist `res', nohalf lines(rowtotal) nodotz + } + mat drop `res' + if `"`labels'"'!="" { + di _n as txt "labels saved in macro e(labels)" + } + } + + // post results + local b + local V + if c(stata_version)<9 { // b and V required in Stata 8 + tempname b V + mat `b' = `_`stat'' \ J(1, colsof(`_`stat''), 0) + mat `b' = `b'[2,1...] + mat `V' = `b'' * `b' + } + if "`esample'"!="" local esample esample(`touse') + eret post `b' `V', obs(`N') `esample' + eret scalar level = `level' + + eret local ccorr `ccorr' + eret local labels `"`labels'"' + eret local subcmd "stci" + eret local cmd "estpost" + + eret matrix ub = `ub' + eret matrix lb = `lb' + eret matrix se = `se' + eret matrix `stat' = `_`stat'' + eret matrix count = `N_sub' +end + + +* 8. estpost_ci: wrapper for -ci- +prog estpost_ci, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax [varlist] [if] [in] [aw fw], [ ESample Quietly /// + LISTwise CASEwise Level(real `c(level)') /// + Binomial EXAct WAld Wilson Agresti Jeffreys /// + Poisson Exposure(varname) /// + ] + if "`casewise'"!="" local listwise listwise + if "`exposure'"!="" local exposureopt "exposure(`exposure')" + if "`binomial'"!="" & "`exact'`wald'`wilson'`agresti'`jeffreys'"=="" local exact exact + + // sample + if "`listwise'"!="" marksample touse + else { + marksample touse, nov + _estpost_markout2 `touse' `varlist' + } + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // gather results + local mnames se lb ub + tempname mean count `mnames' + local i 0 + foreach v of local varlist { + local ++i + qui ci `v' if `touse' [`weight'`exp'], level(`level') /// + `binomial' `exact' `wald' `wilson' `agresti' `jeffreys' /// + `poisson' `exposureopt' + if r(N)>=. continue + mat `mean' = nullmat(`mean'), r(mean) + mat `count' = nullmat(`count'), r(N) + foreach m of local mnames { + mat ``m'' = nullmat(``m''), r(`m') + } + local rnames "`rnames' `v'" + } + capt confirm matrix `count' + if _rc { + di as txt "nothing to post" + eret clear + exit + } + foreach m in mean count `mnames' { + mat coln ``m'' = `rnames' + } + if "`listwise'"=="" { // update sample + if colsof(`count') < `: list sizeof varlist' { + _estpost_markout2 `touse' `rnames' + qui count if `touse' + local N = r(N) + } + } + + // display + if "`quietly'"=="" { + tempname res + mat `res' = `mean'', `count'' + local rescoln "e(b) e(count)" + foreach m of local mnames { + mat `res' = `res', ``m''' + local rescoln `rescoln' e(`m') + } + mat coln `res' = `rescoln' + di as txt "(confidence level is " `level' "%)" + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) + } + else { + matlist `res', nohalf lines(oneline) + } + mat drop `res' + } + + // post results + local V + if c(stata_version)<9 { // V required in Stata 8 + tempname V + mat `V' = diag(vecdiag(`se'' * `se')) + } + if "`esample'"!="" local esample esample(`touse') + eret post `mean' `V', obs(`N') `esample' + + eret scalar k = colsof(`count') + eret scalar level = `level' + + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local exposure "`exposure'" + eret local poisson "`poisson'" + eret local binomial "`exact'`wald'`wilson'`agresti'`jeffreys'" + eret local subcmd "ci" + eret local cmd "estpost" + + local nmat: list sizeof mnames + forv i=`nmat'(-1)1 { + local m: word `i' of `mnames' + eret matrix `m' = ``m'' + } + eret matrix count = `count' +end + + +* 9. estpost_prtest: wrapper for -prtest- (two-sample) +prog estpost_prtest, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax varlist(numeric) [if] [in] , by(varname) [ ESample Quietly /// + LISTwise CASEwise ] + if "`casewise'"!="" local listwise listwise + + // sample + if "`listwise'"!="" marksample touse + else { + marksample touse, nov + _estpost_markout2 `touse' `varlist' + } + markout `touse' `by', strok + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // gather results + local nvars: list sizeof varlist + tempname diff count + mat `count' = J(1, `nvars', .) + mat coln `count' = `varlist' + mat `diff' = `count' + local mnames se se0 z p_l p p_u N_1 P_1 N_2 P_2 + foreach m of local mnames { + tempname `m' + mat ``m'' = `count' + } + local i 0 + foreach v of local varlist { + local ++i + qui prtest `v' if `touse', by(`by') + mat `count'[1,`i'] = r(N_1) + r(N_2) + mat `diff'[1,`i'] = r(P_1) - r(P_2) + mat `se'[1,`i'] = sqrt(r(P_1)*(1-r(P_1))/r(N_1) + r(P_2)*(1-r(P_2))/r(N_2)) + mat `se0'[1,`i'] = `diff'[1,`i'] / r(z) + mat `p_l'[1,`i'] = normal(r(z)) + mat `p'[1,`i'] = (1-normal(abs(r(z))))*2 + mat `p_u'[1,`i'] = 1-normal(r(z)) + foreach m in z N_1 P_1 N_2 P_2 { + mat ``m''[1,`i'] = r(`m') + } + } + + // display + if "`quietly'"=="" { + tempname res + mat `res' = `diff'', `count'' + local rescoln "e(b) e(count)" + foreach m of local mnames { + mat `res' = `res', ``m''' + local rescoln `rescoln' e(`m') + } + mat coln `res' = `rescoln' + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) + } + else { + matlist `res', nohalf lines(oneline) + } + mat drop `res' + } + + // post results + local V + if c(stata_version)<9 { // V required in Stata 8 + tempname V + mat `V' = diag(vecdiag(`se'' * `se')) + } + if "`esample'"!="" local esample esample(`touse') + eret post `diff' `V', obs(`N') `esample' + + eret scalar k = `nvars' + + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local byvar "`by'" + eret local subcmd "prtest" + eret local cmd "estpost" + + local nmat: list sizeof mnames + forv i=`nmat'(-1)1 { + local m: word `i' of `mnames' + eret matrix `m' = ``m'' + } + eret matrix count = `count' +end + + +* 10. estpost__svy_tabulate: wrapper for -svy:tabulate- +prog estpost__svy_tabulate + version 9.2 + local caller : di _caller() + _on_colon_parse `0' + local svyopts `"svyopts(`s(before)')"' + local 0 `"`s(after)'"' + syntax varlist(min=1 max=2) [if] [in] [ , * ] + if `:list sizeof varlist'==1 { + version `caller': _svy_tabulate_oneway `varlist' `if' `in', /// + `svyopts' `options' + } + else { + version `caller': _svy_tabulate_twoway `varlist' `if' `in', /// + `svyopts' `options' + } +end +prog _svy_tabulate_oneway + version 9.2 + local caller : di _caller() // not used + + // syntax + syntax varname [if] [in] [, ESample Quietly /// + svyopts(str asis) MISSing Level(cilevel) /// + noTOTal noMARGinals noLabel ELabels PROPortion PERcent /// + CELl COUnt se ci deff deft * ] + if "`marginals'"!="" local total "nototal" + else if "`total'"!="" local marginals "nomarginals" + + // run svy:tabulate + `quietly' svy `svyopts' : tabulate `varlist' `if' `in', /// + level(`level') `cell' `count' `se' `ci' `deff' `deft' /// + `missing' `marginals' `label' `proportion' `percent' `options' + if "`count'"!="" & "`cell'`se'`ci'`deff'`deft'"=="" { // => return count in e(b) + quietly svy `svyopts' : tabulate `varlist' `if' `in', count se /// + level(`level') `missing' `marginals' `label' `proportion' `percent' `options' + } + + // get labels + qui levelsof `varlist' if e(sample), `missing' local(levels) + local R : list sizeof levels + if e(r)!=`R' { + di as err "unexpected error; number of rows unequal number of levels" + exit 499 + } + capt confirm string variable `varlist' + if _rc { + if "`label'"=="" { + _estpost_namesandlabels `varlist' "`levels'" "" "`elabels'" // sets names, savenames, labels + } + else { + _estpost_namesandlabels "" "`levels'" "" "`elabels'" // sets names, savenames, labels + } + } + else { + _estpost_namesandlabels "" "" `"`levels'"' "`elabels'" // sets names, savenames, labels + } + + // collect results + tempname cell count obs b se lb ub deff deft + local N_pop = cond(e(N_subpop)<., e(N_subpop), e(N_pop)) + local N_obs = cond(e(N_sub)<., e(N_sub), e(N)) + local tval = invttail(e(df_r), (100-`level')/200) + if `tval'>=. local tval = invnormal(1 - (100-`level')/200) + mat `cell' = e(Prop)' + mat `count' = `cell' * `N_pop' + capture confirm matrix e(ObsSub) + if _rc { + mat `obs' = e(Obs)' + } + else { + mat `obs' = e(ObsSub)' + } + capture confirm matrix e(Deff) + if _rc local DEFF "" + else { + local DEFF deff + mat `deff' = e(Deff) + } + capture confirm matrix e(Deft) + if _rc local DEFT "" + else { + local DEFT deft + mat `deft' = e(Deft) + } + mat `b' = e(b) + mata: st_matrix(st_local("se"), sqrt(diagonal(st_matrix("e(V)")))') + if "`total'"=="" { + mat `cell' = `cell', 1 + mat `count' = `count', `N_pop' + mat `obs' = `obs', `N_obs' + if "`DEFF'"!="" mat `deff' = `deff', .z + if "`DEFT'"!="" mat `deft' = `deft', .z + if e(setype)=="count" { + mat `b' = `b', `N_pop' + mat `se' = `se', sqrt(el(e(V_col),1,1)) + } + else { // e(setype)=="cell" + mat `b' = `b', 1 + mat `se' = `se', 0 + } + local names `"`names' "Total""' + local savenames `"`savenames' "Total""' + local linesopt "lines(rowtotal)" + + } + if e(setype)!="count" { + mata: st_matrix( st_local("lb"), invlogit( /// + logit(st_matrix(st_local("b"))) - strtoreal(st_local("tval")) * /// + st_matrix(st_local("se")) :/ /// + (st_matrix(st_local("b")) :* (1 :- st_matrix(st_local("b")))))) + mata: st_matrix( st_local("ub"), invlogit( /// + logit(st_matrix(st_local("b"))) + strtoreal(st_local("tval")) * /// + st_matrix(st_local("se")) :/ /// + (st_matrix(st_local("b")) :* (1 :- st_matrix(st_local("b")))))) + if "`total'"=="" { + mat `lb'[1, colsof(`lb')] = .z + mat `ub'[1, colsof(`ub')] = .z + } + } + else { + mata: st_matrix( st_local("lb"), st_matrix(st_local("b")) - /// + strtoreal(st_local("tval")) * st_matrix(st_local("se")) ) + mata: st_matrix( st_local("ub"), st_matrix(st_local("b")) + /// + strtoreal(st_local("tval")) * st_matrix(st_local("se")) ) + } + foreach m in cell count obs b se lb ub `DEFF' `DEFT' { + capt mat coln ``m'' = `names' + } + if "`percent'"!="" { + mat `cell' = `cell' * 100 + if e(setype)!="count" { + mat `b' = `b' * 100 + mat `se' = `se' * 100 + mat `lb' = `lb' * 100 + mat `ub' = `ub' * 100 + } + } + + // display + if "`quietly'"=="" { + /* + tempname res + mat `res' = `b'', `se'', `lb'', `ub'', `deff'', `deft'' ///, `cell'', `count'', `obs'' + mat coln `res' = e(b) e(se) e(lb) e(ub) e(deff) e(deft) /// e(cell) e(count) e(obs) + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) nodotz + } + else { + mat rown `res' = `savenames' + matlist `res', nohalf `linesopt' rowtitle(`varlist') nodotz + } + mat drop `res' + */ + local plabel = cond("`percent'"!="","percentages","proportions") + local blabel = cond("`e(setype)'"=="count", "weighted counts", "`e(setype)' `plabel'") + di _n as txt "saved vectors:" + di as txt %20s "e(b) = " " " as res "`blabel'" + di as txt %20s "e(se) = " " " as res "standard errors of `blabel'" + di as txt %20s "e(lb) = " " " as res "lower `level'% confidence bounds for `blabel'" + di as txt %20s "e(ub) = " " " as res "upper `level'% confidence bounds for `blabel'" + if "`DEFF'"!="" /// + di as txt %20s "e(deff) = " " " as res "deff for variances of `blabel'" + if "`DEFT'"!="" /// + di as txt %20s "e(deft) = " " " as res "deft for variances of `blabel'" + di as txt %20s "e(cell) = " " " as res "cell `plabel'" + di as txt %20s "e(count) = " " " as res "weighted counts" + di as txt %20s "e(obs) = " " " as res "number of observations" + if `"`labels'"'!="" { + di _n as txt "row labels saved in macro e(labels)" + } + } + + // post results + erepost b=`b', cmd(estpost) nov `esample' + qui estadd local labels `"`labels'"' + qui estadd local subcmd "tabulate" + qui estadd scalar level = `level' + foreach m in obs count cell `DEFT' `DEFF' ub lb se { + qui estadd matrix `m' = ``m'', replace + } +end +prog _svy_tabulate_twoway + version 9.2 + local caller : di _caller() // not used + + // syntax + syntax varlist(min=1 max=2) [if] [in] [, ESample Quietly /// + svyopts(str asis) MISSing Level(cilevel) /// + noTOTal noMARGinals noLabel ELabels PROPortion PERcent /// + CELl COUnt COLumn row se ci deff deft * ] + if "`marginals'"!="" local total "nototal" + else if "`total'"!="" local marginals "nomarginals" + + // run svy:tabulate + `quietly' svy `svyopts' : tabulate `varlist' `if' `in', /// + level(`level') `cell' `count' `column' `row' `se' `ci' `deff' `deft' /// + `missing' `marginals' `label' `proportion' `percent' `options' + if `: word count `count' `column' `row''==1 & "`cell'`se'`ci'`deff'`deft'"=="" { + quietly svy `svyopts' : tabulate `varlist' `if' `in', `count' `column' `row' se /// + level(`level') `missing' `marginals' `label' `proportion' `percent' `options' + } + + // get labels + local rvar `"`e(rowvar)'"' + qui levelsof `rvar' if e(sample), `missing' local(levels) + local R : list sizeof levels + if e(r)!=`R' { + di as err "unexpected error; number of rows unequal number of rowvar levels" + exit 499 + } + capt confirm string variable `rvar' + if _rc { + if "`label'"=="" { + _estpost_namesandlabels `rvar' "`levels'" "" "`elabels'" // sets names, savenames, labels + } + else { + _estpost_namesandlabels "" "`levels'" "" "`elabels'" // sets names, savenames, labels + } + } + else { + _estpost_namesandlabels "" "" `"`levels'"' "`elabels'" // sets names, savenames, labels + } + local cvar `"`e(colvar)'"' + qui levelsof `cvar' if e(sample), `missing' local(levels) + local C : list sizeof levels + if e(c)!=`C' { + di as err "unexpected error; number of column unequal number of colvar levels" + exit 499 + } + local savenames0 `"`savenames'"' + local savenames + capt confirm string variable `cvar' + if _rc { + if "`label'"=="" { + _estpost_eqnamesandlabels `cvar' "`levels'" "" "`elabels'" // sets eqnames, eqlabels + } + else { + _estpost_eqnamesandlabels "" "`levels'" "" "`elabels'" // sets eqnames, eqlabels + } + } + else { + _estpost_eqnamesandlabels "" "" `"`levels'"' "`elabels'" // sets eqnames, eqlabels + } + + // collect results + tempname tmp cell row col count obs b se lb ub deff deft + local N_pop = cond(e(N_subpop)<., e(N_subpop), e(N_pop)) + local N_obs = cond(e(N_sub)<., e(N_sub), e(N)) + local tval = invttail(e(df_r), (100-`level')/200) + if `tval'>=. local tval = invnormal(1 - (100-`level')/200) + mat `cell' = e(Prop) // r x c matrix + mat `cell' = (`cell', `cell' * J(`C',1,1)) \ (J(1,`R',1) * `cell', 1) + mat `count' = `cell' * `N_pop' + mat `tmp' = `cell'[1..., `C'+1] + mata: st_matrix(st_local("row"), st_matrix(st_local("cell")) :/ /// + st_matrix(st_local("tmp"))) + mat `tmp' = `cell'[`R'+1, 1...] + mata: st_matrix(st_local("col"), st_matrix(st_local("cell")) :/ /// + st_matrix(st_local("tmp"))) + mat drop `tmp' + capture confirm matrix e(ObsSub) + if _rc { + mat `obs' = e(Obs) // r x c matrix + } + else { + mat `obs' = e(ObsSub) // r x c matrix + } + capt confirm matrix e(Deff) + if _rc local DEFF "" + else { + local DEFF deff + mat `deff' = e(Deff) // vector + } + capt confirm matrix e(Deft) + if _rc local DEFT "" + else { + local DEFT deft + mat `deft' = e(Deft) // vector + } + mat `b' = e(b) // vector + mata: st_matrix(st_local("se"), sqrt(diagonal(st_matrix("e(V)")))') // vector + if e(setype)=="count" local btype count + else if e(setype)=="row" local btype row + else if e(setype)=="column" local btype col + else local btype cell + foreach m in `DEFF' `DEFT' b se { // vector -> r x c matrix + forv r = 1/`R' { + local from = (`r'-1)*`C' + 1 + local to = `r'*`C' + mat `tmp' = nullmat(`tmp') \ ``m''[1, `from'..`to'] + } + mat drop ``m'' + mat rename `tmp' ``m'' + } + if "`total'"=="" { + mat `obs' = (`obs', `obs' * J(`C',1,1)) \ (J(1,`R',1) * `obs', `N_obs') + if "`DEFF'"!="" mat `deff' = (`deff', e(Deff_row)') \ (e(Deff_col), .z) + if "`DEFT'"!="" mat `deft' = (`deft', e(Deft_row)') \ (e(Deft_col), .z) + mat `b' = (`b', ``btype''[1..`R',`C'+1]) \ ``btype''[`R'+1,1...] + mata: st_matrix(st_local("se"), /// + ((st_matrix(st_local("se")), sqrt(diagonal(st_matrix("e(V_row)")))) /// + \ (sqrt(diagonal(st_matrix("e(V_col)")))', .z))) + if "`btype'"=="row" { + mat `se' = `se'[1..., 1..`C'], J(`R'+1, 1, .z) + } + else if "`btype'"=="col" { + mat `se' = `se'[1..`R', 1...] \ J(1, `C'+1, .z) + } + local names `"`names' "Total""' + local savenames0 `"`savenames0' "Total""' + local eqnames `"`eqnames' "Total""' + } + else { + mat `cell' = `cell'[1..`R', 1..`C'] + mat `count' = `count'[1..`R', 1..`C'] + mat `row' = `row'[1..`R', 1..`C'] + mat `col' = `col'[1..`R', 1..`C'] + } + if "`btype'"!="count" { + mata: st_matrix( st_local("lb"), invlogit( /// + logit(st_matrix(st_local("b"))) - strtoreal(st_local("tval")) * /// + st_matrix(st_local("se")) :/ /// + (st_matrix(st_local("b")) :* (1 :- st_matrix(st_local("b")))))) + mata: st_matrix( st_local("ub"), invlogit( /// + logit(st_matrix(st_local("b"))) + strtoreal(st_local("tval")) * /// + st_matrix(st_local("se")) :/ /// + (st_matrix(st_local("b")) :* (1 :- st_matrix(st_local("b")))))) + } + else { + mata: st_matrix( st_local("lb"), st_matrix(st_local("b")) - /// + strtoreal(st_local("tval")) * st_matrix(st_local("se")) ) + mata: st_matrix( st_local("ub"), st_matrix(st_local("b")) + /// + strtoreal(st_local("tval")) * st_matrix(st_local("se")) ) + } + if "`total'"=="" { + if "`btype'"=="row" { + mat `lb' = `lb'[1..., 1..`C'] , J(`R'+1, 1, .z) + mat `ub' = `ub'[1..., 1..`C'] , J(`R'+1, 1, .z) + } + else if "`btype'"=="col" { + mat `lb' = `lb'[1..`R', 1...] \ J(1, `C'+1, .z) + mat `ub' = `ub'[1..`R', 1...] \ J(1, `C'+1, .z) + } + else { + mat `lb'[`R'+1, `C'+1] = .z + mat `ub'[`R'+1, `C'+1] = .z + } + } + foreach m in cell count obs row col `DEFF' `DEFT' b se lb ub { // r x c matrix -> vector + mat rown ``m'' = `names' + gettoken eq rest : eqnames + forv c = 1/`=colsof(``m'')' { + mat roweq ``m'' = `"`eq'"' + mat `tmp' = nullmat(`tmp'), ``m''[1...,`c']' + gettoken eq rest : rest + } + mat drop ``m'' + mat rename `tmp' ``m'' + } + if "`percent'"!="" { + mat `cell' = `cell' * 100 + mat `col' = `col' * 100 + mat `row' = `row' * 100 + if e(setype)!="count" { + mat `b' = `b' * 100 + mat `se' = `se' * 100 + mat `lb' = `lb' * 100 + mat `ub' = `ub' * 100 + } + } + + // display + if "`quietly'"=="" { + /* + forv c = 1/`=colsof(`cell')' { + local savenames `"`savenames' `savenames0'"' + } + tempname res + mat `res' = `b'', `se'', `lb'', `ub'', `deff'', `deft'', `cell'', `row'', `col'', `count'', `obs'' + mat coln `res' = e(b) e(se) e(lb) e(ub) e(deff) e(deft) e(cell) e(row) e(col) e(count) e(obs) + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) nodotz + } + else { + mat rown `res' = `savenames' + di _n as res %-12s abbrev("`cvar'",12) as txt " {c |}{space 44}" + matlist `res', twidth(12) format(%9.0g) noblank nohalf /// + rowtitle(`rvar') nodotz + } + mat drop `res' + */ + local plabel = cond("`percent'"!="","percentages","proportions") + local blabel = cond("`e(setype)'"=="count", "weighted counts", "`e(setype)' `plabel'") + di _n as txt "saved vectors:" + di as txt %20s "e(b) = " " " as res "`blabel'" + di as txt %20s "e(se) = " " " as res "standard errors of `blabel'" + di as txt %20s "e(lb) = " " " as res "lower `level'% confidence bounds for `blabel'" + di as txt %20s "e(ub) = " " " as res "upper `level'% confidence bounds for `blabel'" + if "`DEFF'"!="" /// + di as txt %20s "e(deff) = " " " as res "deff for variances of `blabel'" + if "`DEFT'"!="" /// + di as txt %20s "e(deft) = " " " as res "deft for variances of `blabel'" + di as txt %20s "e(cell) = " " " as res "cell `plabel'" + di as txt %20s "e(row) = " " " as res "row `plabel'" + di as txt %20s "e(col) = " " " as res "column `plabel'" + di as txt %20s "e(count) = " " " as res "weighted counts" + di as txt %20s "e(obs) = " " " as res "number of observations" + if `"`labels'`eqlabels'"'!="" { + di "" + if `"`labels'"'!="" { + di as txt "row labels saved in macro e(labels)" + } + if `"`eqlabels'"'!="" { + di as txt "column labels saved in macro e(eqlabels)" + } + } + } + + // post results + erepost b=`b', cmd(estpost) nov `esample' + qui estadd local eqlabels `"`eqlabels'"' + qui estadd local labels `"`labels'"' + qui estadd local subcmd "tabulate" + qui estadd scalar level = `level' + foreach m in obs count row col cell `DEFT' `DEFF' ub lb se { + qui estadd matrix `m' = ``m'', replace + } +end + +* 11. estpost_margins: wrapper for -margins- (Stata 11) +prog estpost_margins, eclass + version 11 + local caller : di _caller() + + // syntax + _parse comma anything 0 : 0 + syntax [ , /*ESample*/ Quietly /// + post * ] + if "`post'"!="" { + di as err "post not allowed" + exit 198 + } + + // run margins + `quietly' version `caller': margins `anything', `options' + + // post results + capt postrtoe, noclear resize + if _rc<=1 { // -postrtoe- does not work, e.g., with -regress- + error _rc // _rc=1 (break) + exit + } + tempname b V + mat `b' = r(b) + mat `V' = r(V) + erepost b = `b' V = `V' /*, `esample'*/ + foreach r in `:r(scalars)' { + eret scalar `r' = r(`r') + } + foreach r in `:r(macros)' { + eret local `r' `"`r(`r')'"' + } + tempname tmp + foreach r in `:r(matrices)' { + if inlist("`r'", "b", "V") continue + mat `tmp' = r(`r') + eret matrix `r' = `tmp' + } +end + +* 12. estpost_gtabstat: wrapper for -gstats tabstat- (gtools required) +prog estpost_gtabstat, eclass + version 13.1 + local caller : di _caller() // not used + + cap gtools + if ( _rc ) { + disp as err "gtools required for estpost gtabstat" + exit 111 + } + + // syntax + syntax varlist [if] [in] [aw fw iw pw] [, ESample Quietly /// + Statistics(passthru) stats(passthru) /// + by(varname) Missing Columns(str) ELabels ] + local l = length(`"`columns'"') + if `"`columns'"'==substr("variables",1,max(1,`l')) local columns "variables" + else if `"`columns'"'==substr("statistics",1,max(1,`l')) local columns "statistics" + else if `"`columns'"'=="stats" local columns "statistics" + else if `"`columns'"'=="" { + if `:list sizeof varlist'>1 local columns "variables" + else local columns "statistics" + } + else { + di as err `"columns(`columns') invalid"' + exit 198 + } + + // sample + if "`listwise'"!="" marksample touse + else { + marksample touse, nov + _estpost_markout2 `touse' `varlist' + } + if "`by'"!="" { + capt confirm string variable `by' + local numby = (_rc!=0) + + // NOTE(mauricio): Not sure what this does. I think it's just + // a copy of the by variable so that _estpost_eqnamesandlabels + // parses the numeric input back into value labels? + // + // if `numby' { + // tempname tmpby + // qui gen `:type `by'' `tmpby' = `by' + // } + // else local tmpby `by' + // local byopt "by(`tmpby')" + + if "`missing'"=="" markout `touse' `by', strok + local byopt by(`by') + } + else local numby 0 + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + if ( `"`missing'"' == "" ) local missing nomissing + + // gather results + tempname tmp + tempname gtabstat + qui gstats tabstat `varlist' if `touse' [`weight'`exp'], mata(`gtabstat') /// + `statistics' `stats' `byopt' `missing' columns(`columns') + + mata st_local("stats", invtokens(`gtabstat'.statnames)) + mata st_local("vars", invtokens(`gtabstat'.statvars)) + mata st_local("R", strofreal(`gtabstat'.ksources)) + mata st_local("g", strofreal(`gtabstat'.kby? `gtabstat'.J: 0)) + + local stats: subinstr local stats "N" "count", word all + local stats: subinstr local stats "se(mean)" "semean", word all + + if `"`columns'"'=="statistics" { + local cnames: copy local stats + } + else { + local cnames: copy local vars + } + local cnames: subinstr local cnames "b" "_b", word all + local cnames: subinstr local cnames "V" "_V", word all + + local j 0 + foreach cname of local cnames { + tempname _`++j' + } + + local space + local labels + forv i = 1/`g' { + if `numby' { + mata st_local("name", sprintf(st_varformat(`gtabstat'.byvars[1]), `gtabstat'.getnum(`i', 1))) + } + else { + mata st_local("name", `gtabstat'.getchar(`i', 1, 0)) + } + local labels `"`labels'`space'`"`name'"'"' + } + + if `R'==1 { + if `numby' { + _estpost_namesandlabels "`by'" `"`labels'"' "" "`elabels'" // sets names, savenames, labels + } + else { + _estpost_namesandlabels "" "" `"`labels'"' "`elabels'" // sets names, savenames, labels + } + } + else { + if `numby' { + _estpost_eqnamesandlabels "`by'" `"`labels'"' "" "`elabels'" // sets eqnames, eqlabels + } + else { + _estpost_eqnamesandlabels "" "" `"`labels'"' "`elabels'" // sets eqnames, eqlabels + } + local names `"`eqnames'"' + local labels `"`macval(eqlabels)'"' + } + + tempname glabname + tempname glabstat + tempname glabvar + tempname glabmat + + forv i = 1/`g' { + mata `glabname' = `gtabstat'.getf(`i', 1, .) + mata `glabmat' = `gtabstat'.colvar? `gtabstat'.getOutputGroup(`i'): `gtabstat'.getOutputGroup(`i')' + + if `"`columns'"'=="statistics" { + mata `glabstat' = (J(`gtabstat'.kstats, 1, ""), `gtabstat'.statnames') + mata `glabvar' = (J(`gtabstat'.ksources, 1, `glabname'), `gtabstat'.statvars') + } + else { + mata `glabstat' = (J(`gtabstat'.kstats, 1, `glabname'), `gtabstat'.statnames') + mata `glabvar' = (J(`gtabstat'.ksources, 1, ""), `gtabstat'.statvars') + } + + mata st_matrix("`tmp'", `glabmat') + mata st_matrixrowstripe("`tmp'", `glabstat') + mata st_matrixcolstripe("`tmp'", `glabvar') + + if `"`columns'"'=="statistics" { + mat `tmp' = `tmp'' + if ( `R'==1 ) { + mata `glabstat' = ("", `glabname') + mata `glabvar' = (J(`gtabstat'.kstats, 1, ""), `gtabstat'.statnames') + mata st_matrixrowstripe("`tmp'", `glabstat') + mata st_matrixcolstripe("`tmp'", `glabvar') + } + } + + local j 0 + foreach cname of local cnames { + local ++j + mat `_`j'' = nullmat(`_`j''), `tmp'[1..., `j']' + } + } + + if ( `g' == 0 ) { + mata `glabmat' = `gtabstat'.colvar? `gtabstat'.output: `gtabstat'.output' + mata `glabstat' = (J(`gtabstat'.kstats, 1, ""), `gtabstat'.statnames') + mata `glabvar' = (J(`gtabstat'.ksources, 1, ""), `gtabstat'.statvars') + + mata st_matrix("`tmp'", `glabmat') + mata st_matrixrowstripe("`tmp'", `glabstat') + mata st_matrixcolstripe("`tmp'", `glabvar') + if `"`columns'"'=="statistics" { + mat `tmp' = `tmp'' + } + + local j 0 + foreach cname of local cnames { + local ++j + mat `_`j'' = nullmat(`_`j''), `tmp'[1..., `j']' + } + } + + // display + if "`quietly'"=="" { + tempname res + local rescoln + local j 0 + foreach cname of local cnames { + local ++j + mat `res' = nullmat(`res'), `_`j''' + local rescoln `rescoln' e(`cname') + } + mat coln `res' = `rescoln' + di _n as txt "Summary statistics: `stats'" + di as txt " for variables: `vars'" + if "`by'"!="" { + di as txt " by categories of: `by'" + } + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) + } + else { + if `R'==1 & `g'>0 { + mat rown `res' = `savenames' + } + matlist `res', nohalf `rowtotal' rowtitle(`by') + } + if `"`macval(labels)'"'!="" { + di _n as txt "category labels saved in macro e(labels)" + } + mat drop `res' + } + + // post results + local b + local V + if c(stata_version)<9 { // b and V required in Stata 8 + tempname b V + mat `b' = `_1' \ J(1, colsof(`_1'), 0) + mat `b' = `b'[2,1...] + mat `V' = `b'' * `b' + } + if "`esample'"!="" local esample esample(`touse') + eret post `b' `V', obs(`N') `esample' + + eret local labels `"`macval(labels)'"' + eret local byvar "`by'" + eret local vars "`vars'" + eret local stats "`stats'" + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local subcmd "tabstat" + eret local cmd "estpost" + + local nmat: list sizeof cnames + forv j=`nmat'(-1)1 { + local cname: word `j' of `cnames' + eret matrix `cname' = `_`j'' + } + + cap mata mata drop `gtabstat' + cap mata mata drop `glabname' + cap mata mata drop `glabstat' + cap mata mata drop `glabvar' + cap mata mata drop `glabmat' +end + +* 99. +* copy of erepost.ado, version 1.0.1, Ben Jann, 30jul2007 +* 14jan2009: noV option added => repost e(b) and remove e(V) if not specified +prog erepost, eclass + version 8.2 + syntax [anything(equalok)] [, NOV cmd(str) noEsample Esample2(varname) REName /// + Obs(passthru) Dof(passthru) PROPerties(passthru) * ] + if "`esample'"!="" & "`esample2'"!="" { + di as err "only one allowed of noesample and esample()" + exit 198 + } +// parse [b = b] [V = V] + if `"`anything'"'!="" { + tokenize `"`anything'"', parse(" =") + if `"`7'"'!="" error 198 + if `"`1'"'=="b" { + if `"`2'"'=="=" & `"`3'"'!="" { + local b `"`3'"' + confirm matrix `b' + } + else error 198 + if `"`4'"'=="V" { + if `"`5'"'=="=" & `"`6'"'!="" { + local v `"`6'"' + confirm matrix `b' + } + else error 198 + } + else if `"`4'"'!="" error 198 + } + else if `"`1'"'=="V" { + if `"`4'"'!="" error 198 + if `"`2'"'=="=" & `"`3'"'!="" { + local v `"`3'"' + confirm matrix `v' + } + else error 198 + } + else error 198 + } +//backup existing e()'s + if "`esample2'"!="" { + local sample "`esample2'" + } + else if "`esample'"=="" { + tempvar sample + gen byte `sample' = e(sample) + } + local emacros: e(macros) + if `"`properties'"'!="" { + local emacros: subinstr local emacros "properties" "", word + } + foreach emacro of local emacros { + local e_`emacro' `"`e(`emacro')'"' + } + local escalars: e(scalars) + if `"`obs'"'!="" { + local escalars: subinstr local escalars "N" "", word + } + if `"`dof'"'!="" { + local escalars: subinstr local escalars "df_r" "", word + } + foreach escalar of local escalars { + tempname e_`escalar' + scalar `e_`escalar'' = e(`escalar') + } + local ematrices: e(matrices) + if "`v'"=="" & "`nov'"!="" { // added 14jan2009 + local nov V + local ematrices : list ematrices - nov + } + if "`b'"=="" & `:list posof "b" in ematrices' { + tempname b + mat `b' = e(b) + } + if "`v'"=="" & `:list posof "V" in ematrices' { + tempname v + mat `v' = e(V) + } + local bV "b V" + local ematrices: list ematrices - bV + foreach ematrix of local ematrices { + tempname e_`ematrix' + matrix `e_`ematrix'' = e(`ematrix') + } +// rename + if "`b'"!="" & "`v'"!="" & "`rename'"!="" { + local eqnames: coleq `b', q + local vnames: colnames `b' + mat coleq `v' = `eqnames' + mat coln `v' = `vnames' + mat roweq `v' = `eqnames' + mat rown `v' = `vnames' + } +// post results + if "`esample'"=="" { + eret post `b' `v', esample(`sample') `obs' `dof' `properties' `options' + } + else { + eret post `b' `v', `obs' `dof' `properties' `options' + } + foreach emacro of local emacros { + eret local `emacro' `"`e_`emacro''"' + } + if `"`cmd'"'!="" { + eret local cmd `"`cmd'"' + } + foreach escalar of local escalars { + eret scalar `escalar' = scalar(`e_`escalar'') + } + foreach ematrix of local ematrices { + eret matrix `ematrix' = `e_`ematrix'' + } +end diff --git a/ado/e/estpost.hlp b/ado/e/estpost.hlp new file mode 100644 index 0000000..75e6927 --- /dev/null +++ b/ado/e/estpost.hlp @@ -0,0 +1,1524 @@ +{smcl} +{* 19may2021}{...} +{hi:help estpost}{right:also see: {helpb esttab}, {helpb estout}, {helpb eststo}, {helpb estadd}} +{right: {browse "http://repec.sowi.unibe.ch/stata/estout/"}} +{hline} + +{title:Title} + +{p 4 4 2}{hi:estpost} {hline 2} Post results from various commands in {cmd:e()} + + +{title:Syntax} + +{p 8 15 2} +{cmd:estpost} {it:{help estpost##commands:command}} [...] + +{marker commands} + {it:command}{col 26}description + {hline 79} + {helpb estpost##summarize:{ul:su}mmarize}{col 26}{...} +post summary statistics + {helpb estpost##tabstat:tabstat}{col 26}{...} +post summary statistics + {helpb estpost##gtabstat:gtabstat}{col 26}{...} +post summary statistics (using {helpb gstats tab} from {helpb gtools}) + {helpb estpost##ttest:ttest}{col 26}{...} +post two-group mean-comparison tests + {helpb estpost##prtest:prtest}{col 26}{...} +post two-group tests of proportions + {helpb estpost##tabulate:{ul:ta}bulate}{col 26}{...} +post one-way or two-way frequency table + {helpb estpost##svy_tabulate:svy: {ul:ta}bulate}{col 26}{...} +post frequency table for survey data + {helpb estpost##correlate:{ul:cor}relate}{col 26}{...} +post correlations + {helpb estpost##ci:ci}{col 26}{...} +post confidence intervals for means, + {col 26}{...} + proportions, or counts + {helpb estpost##stci:stci}{col 26}{...} +post confidence intervals for means + {col 26}{...} + and percentiles of survival time + {helpb estpost##margins:margins}{col 26}{...} +post results from {cmd:margins} (Stata 11 or newer) + {hline 79} + + +{title:Description} + +{p 4 4 2} +{cmd:estpost} posts results from various Stata commands in {cmd:e()} +so that they can be tabulated using {helpb esttab} or {helpb estout}. Type +{helpb ereturn:ereturn list} after {cmd:estpost} to list the elements saved +in {cmd:e()}. + + +{title:Commands} +{marker summarize} +{dlgtab:summarize} + +{p 4 15 2} +{cmd:estpost} {cmdab:su:mmarize} + [{it:{help varlist}}] [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:d:etail} + {cmdab:mean:only} + {cmdab:list:wise} + {cmdab:case:wise} + {cmdab:q:uietly} + {cmdab:es:ample} + ] + +{p 4 4 2} + posts summary statistics computed by {helpb summarize}. If no + {it:varlist} is specified, summary statistics are calculated for all + variables in the dataset. + +{p 4 4 2} + {cmd:aweight}s, {cmd:fweight}s, and {cmd:iweight}s are allowed + (however, {cmd:iweight}s may not be used with the {cmd:detail} option); + see {help weight}. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:detail} and {cmd:meanonly} as described in help {helpb summarize}. + +{p 8 12 2} + {cmd:listwise} to handle missing values through listwise deletion, + meaning that an observation is omitted from the estimation + sample if any of the variables in {it:varlist} is missing for that + observation. The default is to determine the used observations for + each variable separately without regard to whether other variables + are missing. {cmd:casewise} is a synonym for {cmd:listwise}. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 4 4 2}The following results vectors are saved in {cmd:e()}: + + {lalign 13:{cmd:e(count)}}number of observations + {lalign 13:{cmd:e(mean)}}mean + {lalign 13:{cmd:e(min)}}minimum + {lalign 13:{cmd:e(max)}}maximum + {lalign 13:{cmd:e(sum)}}sum of variable + {lalign 13:{cmd:e(sum_w)}}sum of the weights + {lalign 13:{cmd:e(Var)}}variance (unless {cmd:meanonly}) + {lalign 13:{cmd:e(sd)}}standard deviation (unless {cmd:meanonly}) + {lalign 13:{cmd:e(p1)}}1st percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p5)}}5th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p10)}}10th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p25)}}25th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p50)}}50th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p75)}}75th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p90)}}90th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p95)}}95th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p99)}}99th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(skewness)}}skewness ({cmd:detail} only) + {lalign 13:{cmd:e(kurtosis)}}kurtosis ({cmd:detail} only) + +{p 4 4 2} + Example: + +{* begin example summarize }{...} + {com}. sysuse auto, clear + {txt}(1978 Automobile Data) + + {com}. estpost summarize price mpg rep78 foreign + + {txt}{ralign 12:} {c |} {ralign 9:e(count)} {ralign 9:e(sum_w)} {ralign 9:e(mean)} {ralign 9:e(Var)} {ralign 9:e(sd)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 6165.257}}} {ralign 9:{res:{sf: 8699526}}} {ralign 9:{res:{sf: 2949.496}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 21.2973}}} {ralign 9:{res:{sf: 33.47205}}} {ralign 9:{res:{sf: 5.785503}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 69}}} {ralign 9:{res:{sf: 69}}} {ralign 9:{res:{sf: 3.405797}}} {ralign 9:{res:{sf: .9799659}}} {ralign 9:{res:{sf: .9899323}}} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: .2972973}}} {ralign 9:{res:{sf: .2117734}}} {ralign 9:{res:{sf: .4601885}}} + + {ralign 12:} {c |} {ralign 9:e(min)} {ralign 9:e(max)} {ralign 9:e(sum)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 3291}}} {ralign 9:{res:{sf: 15906}}} {ralign 9:{res:{sf: 456229}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 12}}} {ralign 9:{res:{sf: 41}}} {ralign 9:{res:{sf: 1576}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf: 5}}} {ralign 9:{res:{sf: 235}}} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf: 0}}} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf: 22}}} + + {com}. esttab ., cells("mean sd count") noobs + {res} + {txt}{hline 51} + {txt} (1) + {txt} + {txt} mean sd count + {txt}{hline 51} + {txt}price {res} 6165.257 2949.496 74{txt} + {txt}mpg {res} 21.2973 5.785503 74{txt} + {txt}rep78 {res} 3.405797 .9899323 69{txt} + {txt}foreign {res} .2972973 .4601885 74{txt} + {txt}{hline 51} +{* end example }{txt}{...} + +{marker tabstat} +{dlgtab:tabstat} + +{p 4 15 2} +{cmd:estpost} {cmdab:tabstat} + {it:{help varlist}} [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:s:tatistics:(}{it:{help tabstat##statname:statname}} [{it:...}]{cmd:)} + {cmdab:c:olumns:(}{cmdab:v:ariables}|{cmdab:s:tatistics:)} + {cmd:by(}{it:varname}{cmd:)} + {cmdab:not:otal} + {cmdab:m:issing} + {cmdab:list:wise} + {cmdab:case:wise} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels} + ] + +{p 4 4 2} + posts summary statistics computed by {helpb tabstat}. {cmd:aweight}s and + {cmd:fweight}s are allowed; see {help weight}. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:statistics()}, {cmd:columns()}, {cmd:by()}, {cmd:nototal}, + and {cmd:missing} as described in help {helpb tabstat}. + +{p 8 12 2} + {cmd:listwise} to handle missing values through listwise deletion, + meaning that an observation is omitted from the estimation + sample if any of the variables in {it:varlist} is missing for that + observation. The default is to determine the used observations for + each variable separately without regard to whether other variables + are missing. {cmd:casewise} is a synonym for {cmd:listwise}. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 8 12 2} + {cmd:elabels} to enforce saving the {cmd:by()} values/labels in macro + {cmd:e(labels)}. + +{p 4 4 2}A vector of results is saved in {cmd:e()} for each specified +variable or statistic, depending on {cmd:columns()}. + +{p 4 4 2} + Examples: + +{* begin example tabstat }{...} + {com}. sysuse auto, clear + {txt}(1978 Automobile Data) + + {com}. estpost tabstat price mpg rep78, listwise /// + > statistics(mean sd) + + {txt}Summary statistics: mean sd + for variables: price mpg rep78 + + {ralign 12:} {c |} {ralign 9:e(price)} {ralign 9:e(mpg)} {ralign 9:e(rep78)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11} + {ralign 12:mean} {c |} {ralign 9:{res:{sf: 6146.043}}} {ralign 9:{res:{sf: 21.28986}}} {ralign 9:{res:{sf: 3.405797}}} + {ralign 12:sd} {c |} {ralign 9:{res:{sf: 2912.44}}} {ralign 9:{res:{sf: 5.866408}}} {ralign 9:{res:{sf: .9899323}}} + + {com}. esttab ., cells("price mpg rep78") + {res} + {txt}{hline 51} + {txt} (1) + {txt} + {txt} price mpg rep78 + {txt}{hline 51} + {txt}mean {res} 6146.043 21.28986 3.405797{txt} + {txt}sd {res} 2912.44 5.866408 .9899323{txt} + {txt}{hline 51} + {txt}N {res} 69 {txt} + {txt}{hline 51} + + {com}. estpost tabstat price mpg rep78, listwise /// + > statistics(mean sd) columns(statistics) + + {txt}Summary statistics: mean sd + for variables: price mpg rep78 + + {ralign 12:} {c |} {ralign 9:e(mean)} {ralign 9:e(sd)} + {hline 13}{c +}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6146.043}}} {ralign 9:{res:{sf: 2912.44}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 21.28986}}} {ralign 9:{res:{sf: 5.866408}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 3.405797}}} {ralign 9:{res:{sf: .9899323}}} + + {com}. esttab ., cells("mean(fmt(a3)) sd") + {res} + {txt}{hline 38} + {txt} (1) + {txt} + {txt} mean sd + {txt}{hline 38} + {txt}price {res} 6146.0 2912.4{txt} + {txt}mpg {res} 21.29 5.866{txt} + {txt}rep78 {res} 3.406 0.990{txt} + {txt}{hline 38} + {txt}N {res} 69 {txt} + {txt}{hline 38} + + {com}. estpost tabstat price mpg rep78, by(foreign) /// + > statistics(mean sd) columns(statistics) listwise + + {txt}Summary statistics: mean sd + for variables: price mpg rep78 + by categories of: foreign + + {ralign 12:foreign} {c |} {ralign 9:e(mean)} {ralign 9:e(sd)} + {hline 13}{c +}{hline 11}{hline 11} + {res:{lalign 13:Domestic}}{c |}{space 11}{space 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6179.25}}} {ralign 9:{res:{sf: 3188.969}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 19.54167}}} {ralign 9:{res:{sf: 4.753312}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 3.020833}}} {ralign 9:{res:{sf: .837666}}} + {hline 13}{c +}{hline 11}{hline 11} + {res:{lalign 13:Foreign}}{c |}{space 11}{space 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6070.143}}} {ralign 9:{res:{sf: 2220.984}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 25.28571}}} {ralign 9:{res:{sf: 6.309856}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 4.285714}}} {ralign 9:{res:{sf: .7171372}}} + {hline 13}{c +}{hline 11}{hline 11} + {res:{lalign 13:Total}}{c |}{space 11}{space 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6146.043}}} {ralign 9:{res:{sf: 2912.44}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 21.28986}}} {ralign 9:{res:{sf: 5.866408}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 3.405797}}} {ralign 9:{res:{sf: .9899323}}} + + {com}. esttab ., main(mean) aux(sd) nostar unstack /// + > noobs nonote label + {res} + {txt}{hline 59} + {txt} (1) + {txt} + {txt} Domestic Foreign Total + {txt}{hline 59} + {txt}Price {res} 6179.3 6070.1 6146.0{txt} + {res} {ralign 12:{txt:(}3189.0{txt:)}} {ralign 12:{txt:(}2221.0{txt:)}} {ralign 12:{txt:(}2912.4{txt:)}}{txt} + + {txt}Mileage (mpg) {res} 19.54 25.29 21.29{txt} + {res} {ralign 12:{txt:(}4.753{txt:)}} {ralign 12:{txt:(}6.310{txt:)}} {ralign 12:{txt:(}5.866{txt:)}}{txt} + + {txt}Repair Record 1978 {res} 3.021 4.286 3.406{txt} + {res} {ralign 12:{txt:(}0.838{txt:)}} {ralign 12:{txt:(}0.717{txt:)}} {ralign 12:{txt:(}0.990{txt:)}}{txt} + {txt}{hline 59} +{* end example }{txt}{...} + +{marker gtabstat} +{dlgtab:gtabstat} + +{p 4 15 2} +{cmd:estpost} {cmdab:gtabstat} + {it:{help varlist}} [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:s:tatistics:(}{it:{help gstats tab##statname:statname}} [{it:...}]{cmd:)} + {cmdab:c:olumns:(}{cmdab:v:ariables}|{cmdab:s:tatistics:)} + {cmd:by(}{it:varname}{cmd:)} + {cmdab:m:issing} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels} + ] + +{p 4 4 2} + posts summary statistics computed by {helpb gstats tab} from + the {helpb gtools} package. {cmd:gstats tab} is a fast, by-able + alternative to {cmd:tabstat}. {cmd:aweight}s, {cmd:fweight}s, {cmd:pweight}s + and {cmd:pweight}s are allowed; see {help weight}. However, {cmd:total}, {cmd:casewise}, + and {cmd:listwise} are not allowed. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:statistics()}, {cmd:columns()}, and {cmd:by()} as described + in help {helpb gstats tab}. By default {cmd:nomissing} is passed; + use {cmd:missing} to include missing-value groups. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 8 12 2} + {cmd:elabels} to enforce saving the {cmd:by()} values/labels in macro + {cmd:e(labels)}. + +{p 4 4 2}A vector of results is saved in {cmd:e()} for each specified +variable or statistic, depending on {cmd:columns()}. + +{p 4 4 2} + Examples: + +{* begin example gtabstat }{...} + {com}. sysuse auto, clear + {txt}(1978 Automobile Data) + + {com}. estpost gtabstat price mpg rep78, /// + > statistics(mean sd) + + {txt}Summary statistics: mean sd + for variables: price mpg rep78 + + {ralign 12:} {c |} {ralign 9:e(price)} {ralign 9:e(mpg)} {ralign 9:e(rep78)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11} + {ralign 12:mean} {c |} {ralign 9:{res:{sf: 6146.043}}} {ralign 9:{res:{sf: 21.28986}}} {ralign 9:{res:{sf: 3.405797}}} + {ralign 12:sd} {c |} {ralign 9:{res:{sf: 2912.44}}} {ralign 9:{res:{sf: 5.866408}}} {ralign 9:{res:{sf: .9899323}}} + + {com}. esttab ., cells("price mpg rep78") + {res} + {txt}{hline 51} + {txt} (1) + {txt} + {txt} price mpg rep78 + {txt}{hline 51} + {txt}mean {res} 6146.043 21.28986 3.405797{txt} + {txt}sd {res} 2912.44 5.866408 .9899323{txt} + {txt}{hline 51} + {txt}N {res} 69 {txt} + {txt}{hline 51} + + {com}. estpost gtabstat price mpg rep78, /// + > statistics(mean sd) columns(statistics) + + {txt}Summary statistics: mean sd + for variables: price mpg rep78 + + {ralign 12:} {c |} {ralign 9:e(mean)} {ralign 9:e(sd)} + {hline 13}{c +}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6146.043}}} {ralign 9:{res:{sf: 2912.44}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 21.28986}}} {ralign 9:{res:{sf: 5.866408}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 3.405797}}} {ralign 9:{res:{sf: .9899323}}} + + {com}. esttab ., cells("mean(fmt(a3)) sd") + {res} + {txt}{hline 38} + {txt} (1) + {txt} + {txt} mean sd + {txt}{hline 38} + {txt}price {res} 6146.0 2912.4{txt} + {txt}mpg {res} 21.29 5.866{txt} + {txt}rep78 {res} 3.406 0.990{txt} + {txt}{hline 38} + {txt}N {res} 69 {txt} + {txt}{hline 38} + + {com}. estpost gtabstat price mpg rep78, by(foreign) /// + > statistics(mean sd) columns(statistics) + + {txt}Summary statistics: mean sd + for variables: price mpg rep78 + by categories of: foreign + + {ralign 12:foreign} {c |} {ralign 9:e(mean)} {ralign 9:e(sd)} + {hline 13}{c +}{hline 11}{hline 11} + {res:{lalign 13:Domestic}}{c |}{space 11}{space 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6179.25}}} {ralign 9:{res:{sf: 3188.969}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 19.54167}}} {ralign 9:{res:{sf: 4.753312}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 3.020833}}} {ralign 9:{res:{sf: .837666}}} + {hline 13}{c +}{hline 11}{hline 11} + {res:{lalign 13:Foreign}}{c |}{space 11}{space 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6070.143}}} {ralign 9:{res:{sf: 2220.984}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 25.28571}}} {ralign 9:{res:{sf: 6.309856}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 4.285714}}} {ralign 9:{res:{sf: .7171372}}} + {hline 13}{c +}{hline 11}{hline 11} + {res:{lalign 13:Total}}{c |}{space 11}{space 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6146.043}}} {ralign 9:{res:{sf: 2912.44}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 21.28986}}} {ralign 9:{res:{sf: 5.866408}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 3.405797}}} {ralign 9:{res:{sf: .9899323}}} + + {com}. esttab ., main(mean) aux(sd) nostar unstack /// + > noobs nonote label + {res} + {txt}{hline 59} + {txt} (1) + {txt} + {txt} Domestic Foreign Total + {txt}{hline 59} + {txt}Price {res} 6179.3 6070.1 6146.0{txt} + {res} {ralign 12:{txt:(}3189.0{txt:)}} {ralign 12:{txt:(}2221.0{txt:)}} {ralign 12:{txt:(}2912.4{txt:)}}{txt} + + {txt}Mileage (mpg) {res} 19.54 25.29 21.29{txt} + {res} {ralign 12:{txt:(}4.753{txt:)}} {ralign 12:{txt:(}6.310{txt:)}} {ralign 12:{txt:(}5.866{txt:)}}{txt} + + {txt}Repair Record 1978 {res} 3.021 4.286 3.406{txt} + {res} {ralign 12:{txt:(}0.838{txt:)}} {ralign 12:{txt:(}0.717{txt:)}} {ralign 12:{txt:(}0.990{txt:)}}{txt} + {txt}{hline 59} +{* end example }{txt}{...} + +{marker ttest} +{dlgtab:ttest} + +{p 4 15 2} +{cmd:estpost} {cmdab:ttest} + {it:{help varlist}} [{it:{help if}}] [{it:{help in}}]{cmd:,} + {cmd:by(}{it:groupvar}{cmd:)} + [ + {cmdab:une:qual} {cmdab:w:elch} + {cmdab:list:wise} + {cmdab:case:wise} + {cmdab:q:uietly} + {cmdab:es:ample} + ] + +{p 4 4 2} + posts two-group mean-comparison tests computed by {helpb ttest}. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:by()}, {cmd:unequal}, and {cmd:welch} as described in + help {helpb ttest}. + +{p 8 12 2} + {cmd:listwise} to handle missing values through listwise deletion, + meaning that an observation is omitted from the estimation + sample if any of the variables in {it:varlist} is missing for that + observation. The default is to determine the used observations for + each variable separately without regard to whether other variables + are missing. {cmd:casewise} is a synonym for {cmd:listwise}. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 4 4 2}The following results vectors are saved in {cmd:e()}: + + {lalign 13:{cmd:e(b)}}mean difference + {lalign 13:{cmd:e(count)}}number of observations + {lalign 13:{cmd:e(se)}}standard error of difference + {lalign 13:{cmd:e(t)}}t statistic + {lalign 13:{cmd:e(df_t)}}degrees of freedom + {lalign 13:{cmd:e(p_l)}}lower one-sided p-value + {lalign 13:{cmd:e(p)}}two-sided p-value + {lalign 13:{cmd:e(p_u)}}upper one-sided p-value + {lalign 13:{cmd:e(N_1)}}number of observations in group 1 + {lalign 13:{cmd:e(mu_1)}}mean in group 1 + {lalign 13:{cmd:e(N_2)}}number of observations in group 2 + {lalign 13:{cmd:e(mu_2)}}mean in group 2 + +{p 4 4 2} + Example: + +{* begin example ttest }{...} + {com}. sysuse auto, clear + {txt}(1978 Automobile Data) + + {com}. estpost ttest price mpg headroom trunk, by(foreign) + + {txt}{ralign 12:} {c |} {ralign 9:e(b)} {ralign 9:e(count)} {ralign 9:e(se)} {ralign 9:e(t)} {ralign 9:e(df_t)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf:-312.2587}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 754.4488}}} {ralign 9:{res:{sf:-.4138899}}} {ralign 9:{res:{sf: 72}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf:-4.945804}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 1.362162}}} {ralign 9:{res:{sf:-3.630848}}} {ralign 9:{res:{sf: 72}}} + {ralign 12:headroom} {c |} {ralign 9:{res:{sf: .5402098}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: .2070884}}} {ralign 9:{res:{sf: 2.608596}}} {ralign 9:{res:{sf: 72}}} + {ralign 12:trunk} {c |} {ralign 9:{res:{sf: 3.340909}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 1.022208}}} {ralign 9:{res:{sf: 3.268327}}} {ralign 9:{res:{sf: 72}}} + + {ralign 12:} {c |} {ralign 9:e(p_l)} {ralign 9:e(p)} {ralign 9:e(p_u)} {ralign 9:e(N_1)} {ralign 9:e(mu_1)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: .3400925}}} {ralign 9:{res:{sf: .6801851}}} {ralign 9:{res:{sf: .6599075}}} {ralign 9:{res:{sf: 52}}} {ralign 9:{res:{sf: 6072.423}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: .0002627}}} {ralign 9:{res:{sf: .0005254}}} {ralign 9:{res:{sf: .9997373}}} {ralign 9:{res:{sf: 52}}} {ralign 9:{res:{sf: 19.82692}}} + {ralign 12:headroom} {c |} {ralign 9:{res:{sf: .9944757}}} {ralign 9:{res:{sf: .0110486}}} {ralign 9:{res:{sf: .0055243}}} {ralign 9:{res:{sf: 52}}} {ralign 9:{res:{sf: 3.153846}}} + {ralign 12:trunk} {c |} {ralign 9:{res:{sf: .99917}}} {ralign 9:{res:{sf: .00166}}} {ralign 9:{res:{sf: .00083}}} {ralign 9:{res:{sf: 52}}} {ralign 9:{res:{sf: 14.75}}} + + {ralign 12:} {c |} {ralign 9:e(N_2)} {ralign 9:e(mu_2)} + {hline 13}{c +}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 22}}} {ralign 9:{res:{sf: 6384.682}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 22}}} {ralign 9:{res:{sf: 24.77273}}} + {ralign 12:headroom} {c |} {ralign 9:{res:{sf: 22}}} {ralign 9:{res:{sf: 2.613636}}} + {ralign 12:trunk} {c |} {ralign 9:{res:{sf: 22}}} {ralign 9:{res:{sf: 11.40909}}} + + {com}. esttab ., wide + {res} + {txt}{hline 41} + {txt} (1) + {txt} + {txt}{hline 41} + {txt}price {res} -312.3 {ralign 12:{txt:(}-0.41{txt:)}}{txt} + {txt}mpg {res} -4.946*** {ralign 12:{txt:(}-3.63{txt:)}}{txt} + {txt}headroom {res} 0.540* {ralign 12:{txt:(}2.61{txt:)}}{txt} + {txt}trunk {res} 3.341** {ralign 12:{txt:(}3.27{txt:)}}{txt} + {txt}{hline 41} + {txt}N {res} 74 {txt} + {txt}{hline 41} + {txt}t statistics in parentheses + {txt}* p<0.05, ** p<0.01, *** p<0.001 +{* end example }{txt}{...} + +{marker prtest} +{dlgtab:prtest} + +{p 4 15 2} +{cmd:estpost} {cmdab:prtest} + {it:{help varlist}} [{it:{help if}}] [{it:{help in}}]{cmd:,} + {cmd:by(}{it:groupvar}{cmd:)} + [ + {cmdab:list:wise} + {cmdab:case:wise} + {cmdab:q:uietly} + {cmdab:es:ample} + ] + +{p 4 4 2} + posts two-group tests of proportions computed by {helpb prtest}. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:by()} as described in + help {helpb prtest}. + +{p 8 12 2} + {cmd:listwise} to handle missing values through listwise deletion, + meaning that an observation is omitted from the estimation + sample if any of the variables in {it:varlist} is missing for that + observation. The default is to determine the used observations for + each variable separately without regard to whether other variables + are missing. {cmd:casewise} is a synonym for {cmd:listwise}. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 4 4 2}The following results vectors are saved in {cmd:e()}: + + {lalign 13:{cmd:e(b)}}difference in proportions + {lalign 13:{cmd:e(count)}}number of observations + {lalign 13:{cmd:e(se)}}standard error of difference + {lalign 13:{cmd:e(se0)}}standard error under Ho + {lalign 13:{cmd:e(z)}}z statistic + {lalign 13:{cmd:e(p_l)}}lower one-sided p-value + {lalign 13:{cmd:e(p)}}two-sided p-value + {lalign 13:{cmd:e(p_u)}}upper one-sided p-value + {lalign 13:{cmd:e(N_1)}}number of observations in group 1 + {lalign 13:{cmd:e(P_1)}}proportion in group 1 + {lalign 13:{cmd:e(N_2)}}number of observations in group 2 + {lalign 13:{cmd:e(P_2)}}proportion in group 2 + +{p 4 4 2} + Example: + +{* begin example prtest }{...} + {com}. webuse cure2, clear + {txt} + {com}. estpost prtest cure, by(sex) + + {txt}{ralign 12:} {c |} {ralign 9:e(b)} {ralign 9:e(count)} {ralign 9:e(se)} {ralign 9:e(se0)} {ralign 9:e(z)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:cure} {c |} {ralign 9:{res:{sf:-.0729167}}} {ralign 9:{res:{sf: 109}}} {ralign 9:{res:{sf: .0933123}}} {ralign 9:{res:{sf: .0942404}}} {ralign 9:{res:{sf:-.7737309}}} + + {ralign 12:} {c |} {ralign 9:e(p_l)} {ralign 9:e(p)} {ralign 9:e(p_u)} {ralign 9:e(N_1)} {ralign 9:e(P_1)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:cure} {c |} {ralign 9:{res:{sf: .219545}}} {ralign 9:{res:{sf: .43909}}} {ralign 9:{res:{sf: .780455}}} {ralign 9:{res:{sf: 64}}} {ralign 9:{res:{sf: .59375}}} + + {ralign 12:} {c |} {ralign 9:e(N_2)} {ralign 9:e(P_2)} + {hline 13}{c +}{hline 11}{hline 11} + {ralign 12:cure} {c |} {ralign 9:{res:{sf: 45}}} {ralign 9:{res:{sf: .6666667}}} + + {com}. esttab ., cell("b se0 z p") + {res} + {txt}{hline 64} + {txt} (1) + {txt} + {txt} b se0 z p + {txt}{hline 64} + {txt}cure {res} -.0729167 .0942404 -.7737309 .43909{txt} + {txt}{hline 64} + {txt}N {res} 109 {txt} + {txt}{hline 64} +{* end example }{txt}{...} + +{marker tabulate} +{dlgtab:tabulate} + +{p 4 4 2}One-way table: + +{p 8 15 2} +{cmd:estpost} {cmdab:ta:bulate} + {it:varname} [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:m:issing} + {cmdab:nol:abel} + {cmd:sort} + {cmd:subpop(}{it:varname}{cmd:)} + {cmdab:notot:al} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels} + ] + +{p 4 4 2}Two-way table: + +{p 8 15 2} +{cmd:estpost} {cmdab:ta:bulate} + {it:varname1} {it:varname2} [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:m:issing} + {cmdab:nol:abel} + {cmdab:ch:i2} + {cmdab:e:xact}[{cmd:(}{it:#}{cmd:)}] + {cmdab:g:amma} + {cmdab:lr:chi2} + {cmdab:t:aub} + {cmdab:v} + {cmdab:notot:al} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels} + ] + +{p 4 4 2} + {cmd:estpost tabulate} posts a one-way or two-way table + computed by {helpb tabulate}. {cmd:aweight}s, {cmd:fweight}s, + and {cmd:iweight}s are allowed; see {help weight}. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:missing}, + {cmd:nolabel}, + {cmd:sort}, + {cmd:subpop()}, + {cmd:chi2}, + {cmd:exact}, + {cmd:gamma}, + {cmd:lrchi2}, + {cmd:taub}, and + {cmd:v} + as described in help {helpb tabulate}. + +{p 8 12 2} + {cmdab:nototal} to omit row and column totals. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 8 12 2} + {cmd:elabels} to enforce saving labels in {cmd:e(labels)} and + {cmd:e(eqlabels)}. + +{p 4 4 2}The following vectors are saved in {cmd:e()}: + + {lalign 13:{cmd:e(b)}}frequency counts + {lalign 13:{cmd:e(pct)}}percent + {lalign 13:{cmd:e(cumpct)}}cumulative percent (one-way only) + {lalign 13:{cmd:e(colpct)}}column percent (two-way only) + {lalign 13:{cmd:e(rowpct)}}row percent (two-way only) + +{p 4 4 2}If two-way options such as, e.g., {cmd:chi2} or {cmd:exact} are +specified, the results of the tests added as scalars in {cmd:e()} using the +names documented in {helpb tabulate:{bind:[R] tabulate}}. + +{p 4 4 2}The value labels of the row variable are stored as names in the +saved vectors, unless +no label exceeds 30 characters or contains unsuitable characters in which case +the labels are stored in macro {cmd:e(labels)}. Type +{cmd:varlabels(`e(labels)')} in {helpb esttab} or {helpb estout} to +use the labels stored {cmd:e(labels)}. The value labels of the column variable +are stored as equation names or, alternatively, +in macro {cmd:e(eqlabels)}. Type {cmd:eqlabels(`e(eqlabels)')} in +{helpb esttab} or {helpb estout} to use the labels stored in +{cmd:e(eqlabels)}. Specify the {cmd:elabels} option to enforce saving labels +in {cmd:e(labels)} and {cmd:e(eqlabels)}. + +{p 4 4 2}Examples: + +{* begin example tabulate }{...} + {com}. sysuse auto, clear + {txt}(1978 Automobile Data) + + {com}. estpost tabulate foreign + + {txt}{ralign 12:foreign} {c |} {ralign 9:e(b)} {ralign 9:e(pct)} {ralign 9:e(cumpct)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11} + {ralign 12:Domestic} {c |} {ralign 9:{res:{sf: 52}}} {ralign 9:{res:{sf: 70.27027}}} {ralign 9:{res:{sf: 70.27027}}} + {ralign 12:Foreign} {c |} {ralign 9:{res:{sf: 22}}} {ralign 9:{res:{sf: 29.72973}}} {ralign 9:{res:{sf: 100}}} + {hline 13}{c +}{hline 11}{hline 11}{hline 11} + {ralign 12:Total} {c |} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 100}}} {ralign 9:{res:{sf:{space 9}}}} + + {com}. esttab ., cells("b pct(fmt(2)) cumpct(fmt(2))") noobs + {res} + {txt}{hline 51} + {txt} (1) + {txt} foreign + {txt} b pct cumpct + {txt}{hline 51} + {txt}Domestic {res} 52 70.27 70.27{txt} + {txt}Foreign {res} 22 29.73 100.00{txt} + {txt}Total {res} 74 100.00 {txt} + {txt}{hline 51} + + {com}. estpost tabulate rep78 foreign + + {res}foreign {txt} {c |}{space 44} + {ralign 12:rep78} {c |} {ralign 9:e(b)} {ralign 9:e(pct)} {ralign 9:e(colpct)} {ralign 9:e(rowpct)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11} + {res:{lalign 13:Domestic}}{c |}{space 11}{space 11}{space 11}{space 11} + {ralign 12:1} {c |} {ralign 9:{res:{sf: 2}}} {ralign 9:{res:{sf: 2.898551}}} {ralign 9:{res:{sf: 4.166667}}} {ralign 9:{res:{sf: 100}}} + {ralign 12:2} {c |} {ralign 9:{res:{sf: 8}}} {ralign 9:{res:{sf: 11.5942}}} {ralign 9:{res:{sf: 16.66667}}} {ralign 9:{res:{sf: 100}}} + {ralign 12:3} {c |} {ralign 9:{res:{sf: 27}}} {ralign 9:{res:{sf: 39.13043}}} {ralign 9:{res:{sf: 56.25}}} {ralign 9:{res:{sf: 90}}} + {ralign 12:4} {c |} {ralign 9:{res:{sf: 9}}} {ralign 9:{res:{sf: 13.04348}}} {ralign 9:{res:{sf: 18.75}}} {ralign 9:{res:{sf: 50}}} + {ralign 12:5} {c |} {ralign 9:{res:{sf: 2}}} {ralign 9:{res:{sf: 2.898551}}} {ralign 9:{res:{sf: 4.166667}}} {ralign 9:{res:{sf: 18.18182}}} + {ralign 12:Total} {c |} {ralign 9:{res:{sf: 48}}} {ralign 9:{res:{sf: 69.56522}}} {ralign 9:{res:{sf: 100}}} {ralign 9:{res:{sf: 69.56522}}} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11} + {res:{lalign 13:Foreign}}{c |}{space 11}{space 11}{space 11}{space 11} + {ralign 12:1} {c |} {ralign 9:{res:{sf: 0}}} {ralign 9:{res:{sf: 0}}} {ralign 9:{res:{sf: 0}}} {ralign 9:{res:{sf: 0}}} + {ralign 12:2} {c |} {ralign 9:{res:{sf: 0}}} {ralign 9:{res:{sf: 0}}} {ralign 9:{res:{sf: 0}}} {ralign 9:{res:{sf: 0}}} + {ralign 12:3} {c |} {ralign 9:{res:{sf: 3}}} {ralign 9:{res:{sf: 4.347826}}} {ralign 9:{res:{sf: 14.28571}}} {ralign 9:{res:{sf: 10}}} + {ralign 12:4} {c |} {ralign 9:{res:{sf: 9}}} {ralign 9:{res:{sf: 13.04348}}} {ralign 9:{res:{sf: 42.85714}}} {ralign 9:{res:{sf: 50}}} + {ralign 12:5} {c |} {ralign 9:{res:{sf: 9}}} {ralign 9:{res:{sf: 13.04348}}} {ralign 9:{res:{sf: 42.85714}}} {ralign 9:{res:{sf: 81.81818}}} + {ralign 12:Total} {c |} {ralign 9:{res:{sf: 21}}} {ralign 9:{res:{sf: 30.43478}}} {ralign 9:{res:{sf: 100}}} {ralign 9:{res:{sf: 30.43478}}} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11} + {res:{lalign 13:Total}}{c |}{space 11}{space 11}{space 11}{space 11} + {ralign 12:1} {c |} {ralign 9:{res:{sf: 2}}} {ralign 9:{res:{sf: 2.898551}}} {ralign 9:{res:{sf: 2.898551}}} {ralign 9:{res:{sf: 100}}} + {ralign 12:2} {c |} {ralign 9:{res:{sf: 8}}} {ralign 9:{res:{sf: 11.5942}}} {ralign 9:{res:{sf: 11.5942}}} {ralign 9:{res:{sf: 100}}} + {ralign 12:3} {c |} {ralign 9:{res:{sf: 30}}} {ralign 9:{res:{sf: 43.47826}}} {ralign 9:{res:{sf: 43.47826}}} {ralign 9:{res:{sf: 100}}} + {ralign 12:4} {c |} {ralign 9:{res:{sf: 18}}} {ralign 9:{res:{sf: 26.08696}}} {ralign 9:{res:{sf: 26.08696}}} {ralign 9:{res:{sf: 100}}} + {ralign 12:5} {c |} {ralign 9:{res:{sf: 11}}} {ralign 9:{res:{sf: 15.94203}}} {ralign 9:{res:{sf: 15.94203}}} {ralign 9:{res:{sf: 100}}} + {ralign 12:Total} {c |} {ralign 9:{res:{sf: 69}}} {ralign 9:{res:{sf: 100}}} {ralign 9:{res:{sf: 100}}} {ralign 9:{res:{sf: 100}}} + + {com}. esttab ., cell(colpct(fmt(2))) unstack noobs + {res} + {txt}{hline 51} + {txt} (1) + {txt} + {txt} Domestic Foreign Total + {txt} colpct colpct colpct + {txt}{hline 51} + {txt}1 {res} 4.17 0.00 2.90{txt} + {txt}2 {res} 16.67 0.00 11.59{txt} + {txt}3 {res} 56.25 14.29 43.48{txt} + {txt}4 {res} 18.75 42.86 26.09{txt} + {txt}5 {res} 4.17 42.86 15.94{txt} + {txt}Total {res} 100.00 100.00 100.00{txt} + {txt}{hline 51} + + {com}. esttab ., cell(colpct(fmt(2)) count(fmt(g) par keep(Total))) /// + > collabels(none) unstack noobs nonumber nomtitle /// + > eqlabels(, lhs("Repair Rec.")) /// + > varlabels(, blist(Total "{c -(}hline @width{c )-}{c -(}break{c )-}")) + {res} + {txt}{hline 51} + {txt}Repair Rec. Domestic Foreign Total + {txt}{hline 51} + {txt}1 {res} 4.17 0.00 2.90{txt} + {txt}2 {res} 16.67 0.00 11.59{txt} + {txt}3 {res} 56.25 14.29 43.48{txt} + {txt}4 {res} 18.75 42.86 26.09{txt} + {txt}5 {res} 4.17 42.86 15.94{txt} + {txt}{hline 51}{break} Total {res} 100.00 100.00 100.00{txt} + {res} {txt} + {txt}{hline 51} +{* end example }{txt}{...} + +{marker svy_tabulate} +{dlgtab:svy: tabulate} + +{p 4 4 2}One-way table: + +{p 8 15 2} +{cmd:estpost} {cmd:svy} [{it:vcetype}] [, {it:svy_options}] {cmd::} {cmdab:ta:bulate} + {it:varname} [{it:{help if}}] [{it:{help in}}] + [{cmd:,} + {cmdab:notot:al} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels} + {help svy_tabulate_oneway:{it:svy_tabulate_opts}} + ] + +{p 4 4 2}Two-way table: + +{p 8 15 2} +{cmd:estpost} {cmd:svy} [{it:vcetype}] [, {it:svy_options}] {cmd::} {cmdab:ta:bulate} + {it:varname1} {it:varname2} [{it:{help if}}] [{it:{help in}}] + [{cmd:,} + {cmdab:notot:al} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels} + {help svy_tabulate_oneway:{it:svy_tabulate_opts}} + ] + +{p 4 4 2} + {cmd:estpost svy: tabulate} posts a one-way or two-way table + for complex survey data computed by {helpb svy_tabulate:svy: tabulate}. Stata 9 or newer + is required. + +{p 4 4 2} + Options are as described in {helpb svy_tabulate_oneway:[SVY] svy: tabulate oneway} or + {helpb svy_tabulate_twoway:[SVY] svy: tabulate twoway}, respectively, and: + +{p 8 12 2} + {cmdab:nototal} to omit row and column totals (synonym for {cmd:nomarginals}). + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 8 12 2} + {cmd:elabels} to enforce saving labels in {cmd:e(labels)} and + {cmd:e(eqlabels)}. + +{p 4 4 2}{cmd:estpost svy: tabulate} posts results in {cmd:e()} (except {cmd:e(V)}) +as documented in {helpb svy_tabulate_oneway:[SVY] svy: tabulate oneway} and +{helpb svy_tabulate_twoway:[SVY] svy: tabulate twoway}, respectively, +and adds or replaces the following matrices: + + {lalign 10:{cmd:e(b)}}cell, column, or row proportions or percentages, + or weighted counts, depending on options + {lalign 10:{cmd:e(se)}}standard errors of {cmd:e(b)} + {lalign 10:{cmd:e(lb)}}lower confidence bounds for {cmd:e(b)} + {lalign 10:{cmd:e(ub)}}upper confidence bounds for {cmd:e(b)} + {lalign 10:{cmd:e(deff)}}deff for variances of {cmd:e(b)} + {lalign 10:{cmd:e(deft)}}deft for variances of {cmd:e(b)} + {lalign 10:{cmd:e(cell)}}cell proportion or percentages + {lalign 10:{cmd:e(row)}}row proportion or percentages (two-way only) + {lalign 10:{cmd:e(col)}}column proportion or percentages (two-way only) + {lalign 10:{cmd:e(count)}}weighted counts + {lalign 10:{cmd:e(obs)}}number of observations + +{p 4 4 2}The value labels of the row variable are stored as names in the +saved vectors, unless +no label exceeds 30 characters or contains unsuitable characters in which case +the labels are stored in macro {cmd:e(labels)}. Type +{cmd:varlabels(`e(labels)')} in {helpb esttab} or {helpb estout} to +use the labels stored {cmd:e(labels)}. The value labels of the column variable +are stored as equation names or, alternatively, +in macro {cmd:e(eqlabels)}. Type {cmd:eqlabels(`e(eqlabels)')} in +{helpb esttab} or {helpb estout} to use the labels stored in +{cmd:e(eqlabels)}. Specify the {cmd:elabels} option to enforce saving labels +in {cmd:e(labels)} and {cmd:e(eqlabels)}. + +{p 4 4 2}Examples: + +{* begin example svy_tabulate }{...} + {com}. webuse nhanes2b, clear + {txt} + {com}. svyset psuid [pweight=finalwgt], strata(stratid) + + {txt}pweight:{col 16}{res}finalwgt + {txt}VCE:{col 16}{res}linearized + {txt}Single unit:{col 16}{res}missing + {txt}Strata 1:{col 16}{res}stratid + {txt}SU 1:{col 16}{res}psuid + {txt}FPC 1:{col 16} + {p2colreset}{...} + + {com}. estpost svy: tabulate race + {txt}(running tabulate on estimation sample) + + {col 1}Number of strata{col 20}= {res} 31{txt}{col 48}Number of obs{col 67}= {res} 10351 + {txt}{col 1}Number of PSUs{col 20}= {res} 62{txt}{col 48}Population size{col 67}={res} 117157513 + {txt}{col 48}Design df{col 67}= {res} 31 + + {txt}{hline 10}{c TT}{hline 12} + 1=white, {c |} + 2=black, {c |} + 3=other {c |} proportions + {hline 10}{c +}{hline 12} + White {c |} {res}.8792 + {txt}Black {c |} {res}.0955 + {txt}Other {c |} {res}.0253 + {txt}{c |} + Total {c |} {res}1 + {txt}{hline 10}{c BT}{hline 12} + Key: {col 1}proportions = {res}cell proportions + + {txt}saved vectors: + e(b) = {res}cell proportions + {txt}e(se) = {res}standard errors of cell proportions + {txt}e(lb) = {res}lower 95% confidence bounds for cell proportions + {txt}e(ub) = {res}upper 95% confidence bounds for cell proportions + {txt}e(deff) = {res}deff for variances of cell proportions + {txt}e(deft) = {res}deft for variances of cell proportions + {txt}e(cell) = {res}cell proportions + {txt}e(count) = {res}weighted counts + {txt}e(obs) = {res}number of observations + {txt} + {com}. esttab ., cell("b(f(4)) se deft") + {res} + {txt}{hline 51} + {txt} (1) + {txt} + {txt} b se deft + {txt}{hline 51} + {txt}White {res} 0.8792 0.0167 5.2090{txt} + {txt}Black {res} 0.0955 0.0127 4.4130{txt} + {txt}Other {res} 0.0253 0.0105 6.8246{txt} + {txt}Total {res} 1.0000 0.0000 {txt} + {txt}{hline 51} + {txt}N {res} 10351 {txt} + {txt}{hline 51} + + {com}. estpost svy: tabulate race diabetes, row percent + {txt}(running tabulate on estimation sample) + + {col 1}Number of strata{col 20}= {res} 31{txt}{col 48}Number of obs{col 67}= {res} 10349 + {txt}{col 1}Number of PSUs{col 20}= {res} 62{txt}{col 48}Population size{col 67}={res} 117131111 + {txt}{col 48}Design df{col 67}= {res} 31 + + {txt}{hline 10}{c TT}{hline 20} + 1=white, {c |} diabetes, 1=yes, + 2=black, {c |} 0=no + 3=other {c |} 0 1 Total + {hline 10}{c +}{hline 20} + White {c |} {res}96.8 3.195 100 + {txt}Black {c |} {res}94.1 5.903 100 + {txt}Other {c |} {res}97.97 2.034 100 + {txt}{c |} + Total {c |} {res}96.58 3.425 100 + {txt}{hline 10}{c BT}{hline 20} + Key: {col 1}{res}row percentages + + {txt} Pearson: + {col 5}Uncorrected{col 19}chi2({res}2{txt}){col 35}= {res} 21.3483 + {txt}{col 5}Design-based{col 19}F({res}1.52{txt}, {res}47.26{txt}){col 35}= {res} 15.0056{col 51}{txt}P = {res}0.0000 + + {txt}saved vectors: + e(b) = {res}row percentages + {txt}e(se) = {res}standard errors of row percentages + {txt}e(lb) = {res}lower 95% confidence bounds for row percentages + {txt}e(ub) = {res}upper 95% confidence bounds for row percentages + {txt}e(deff) = {res}deff for variances of row percentages + {txt}e(deft) = {res}deft for variances of row percentages + {txt}e(cell) = {res}cell percentages + {txt}e(row) = {res}row percentages + {txt}e(col) = {res}column percentages + {txt}e(count) = {res}weighted counts + {txt}e(obs) = {res}number of observations + {txt} + {com}. esttab ., b(2) se(2) scalars(F_Pear) nostar unstack /// + > mtitle(`e(colvar)') + {res} + {txt}{hline 51} + {txt} (1) + {txt} diabetes + {txt} 0 1 Total + {txt}{hline 51} + {txt}White {res} 96.80 3.20 100.00{txt} + {res} {ralign 12:{txt:(}0.20{txt:)}} {ralign 12:{txt:(}0.20{txt:)}} {txt} + + {txt}Black {res} 94.10 5.90 100.00{txt} + {res} {ralign 12:{txt:(}0.61{txt:)}} {ralign 12:{txt:(}0.61{txt:)}} {txt} + + {txt}Other {res} 97.97 2.03 100.00{txt} + {res} {ralign 12:{txt:(}0.76{txt:)}} {ralign 12:{txt:(}0.76{txt:)}} {txt} + + {txt}Total {res} 96.58 3.42 100.00{txt} + {res} {ralign 12:{txt:(}0.18{txt:)}} {ralign 12:{txt:(}0.18{txt:)}} {txt} + {txt}{hline 51} + {txt}N {res} 10349 {txt} + {txt}F_Pear {res} 15.01 {txt} + {txt}{hline 51} + {txt}Standard errors in parentheses +{* end example }{txt}{...} + +{marker correlate} +{dlgtab:correlate} + +{p 4 15 2} +{cmd:estpost} {cmdab:cor:relate} + {it:{help varlist}} [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:m:atrix} + {cmdab:noh:alf} + {cmdab:print:(}{it:#}{cmd:)} + {cmdab:b:onferroni} + {cmdab:sid:ak} + {cmdab:list:wise} + {cmdab:case:wise} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels}[{cmd:(}{it:pfx} {it:sfx}{cmd:)}] + {cmdab:nol:abel} + ] + +{p 4 4 2} + posts the pairwise correlations between the first variable in + {it:varlist} and the remaining variables. Alternatively, if the + {cmd:matrix} option is specified, all pairwise correlations among the + variable in {it:varlist} are posted. + +{p 4 4 2} + {cmd:aweight}s, {cmd:fweight}s, + {cmd:iweight}s and {cmd:pweight}s are allowed; see {help weight}. + +{p 4 4 2} + Methods and formulas are as described in + {helpb correlate:{bind:[R] correlate}}. However, if {cmd:pweight}s + are specified, the p-values of the correlations are computed + as suggested in the Stata FAQ on + {browse "http://www.stata.com/support/faqs/stat/survey.html":"Estimating correlations with survey data"}. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:matrix} to return the (lower triangle) of the correlation + matrix of the variables in {it:varlist}. The default is to return + the pairwise correlations between the first variable in + {it:varlist} and the remaining variables. + +{p 8 12 2} + {cmd:nohalf} to return the full correlation matrix rather than just + the lower triangle. {cmd:nohalf} has no effect unless {cmd:matrix} + is specified. + +{p 8 12 2} + {cmd:print(}{it:#}{cmd:)} to suppress (leave blank) + correlation coefficients with a p-value larger than + {it:#}. {cmd:print()} only affects what is saved in + {cmd:e(rho)}, {cmd:e(p)}, and {cmd:e(count)}, but + not what is saved in {cmd:e(b)}. + +{p 8 12 2} + {cmd:bonferroni} to apply the Bonferroni adjustment to the + p-values. + +{p 8 12 2} + {cmd:sidak} to apply the Sidak adjustment to the + p-values. + +{p 8 12 2} + {cmd:listwise} to handle missing values through listwise deletion, + meaning that an observation is omitted from the estimation sample + if any of the variables in {it:varlist} is missing for that + observation. The default is to handle missing values by pairwise + deletion, i.e. all available observations are used to calculate a + pairwise correlation without regard to whether variables outside + that pair are missing. {cmd:casewise} is a synonym for + {cmd:listwise}. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 8 12 2} + {cmd:elabels}[{cmd:(}{it:pfx} {it:sfx}{cmd:)}] stores numbered labels in + {cmd:e(labels)} and {cmd:e(eqlabels)} if option {cmd:matrix} has been + specified. This is useful if you want to tabulate a correlation + matrix. See below for an example. Specify {it:pfx} and + {it:sfx} to provide a prefix and suffix for the numbers; for + example, {cmd:eqlabels([ ])} will format the numbers as + {cmd:[1]}, {cmd:[2]}, etc.; {cmd:eqlabels("" .)} will format the numbers as + {cmd:1.}, {cmd:2.}, etc. + +{p 8 12 2} + {cmd:nolabel} causes option {cmd:elabels()} to use variable names rather + than variable labels. + +{p 4 4 2}The following vectors are saved in {cmd:e()}: + + {lalign 13:{cmd:e(b)}}correlation coefficients + {lalign 13:{cmd:e(rho)}}correlation coefficients + {lalign 13:{cmd:e(p)}}p-values + {lalign 13:{cmd:e(count)}}number of observations + +{p 4 4 2}Examples: + +{* begin example correlate }{...} + {com}. sysuse auto, clear + {txt}(1978 automobile data) + + {com}. estpost correlate price mpg turn foreign, matrix elabels(( )) + + {txt}{ralign 12:} {c |} {ralign 9:e(b)} {ralign 9:e(rho)} {ralign 9:e(p)} {ralign 9:e(count)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11} + {res:{lalign 13:price}}{c |}{space 11}{space 11}{space 11}{space 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf:{space 9}}}} {ralign 9:{res:{sf: 74}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf:-.4685967}}} {ralign 9:{res:{sf:-.4685967}}} {ralign 9:{res:{sf: .0000255}}} {ralign 9:{res:{sf: 74}}} + {ralign 12:turn} {c |} {ralign 9:{res:{sf: .3096174}}} {ralign 9:{res:{sf: .3096174}}} {ralign 9:{res:{sf: .0072662}}} {ralign 9:{res:{sf: 74}}} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf: .0487195}}} {ralign 9:{res:{sf: .0487195}}} {ralign 9:{res:{sf: .6801851}}} {ralign 9:{res:{sf: 74}}} + {res:{lalign 13:mpg}}{c |}{space 11}{space 11}{space 11}{space 11} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf:{space 9}}}} {ralign 9:{res:{sf: 74}}} + {ralign 12:turn} {c |} {ralign 9:{res:{sf:-.7191863}}} {ralign 9:{res:{sf:-.7191863}}} {ralign 9:{res:{sf: 5.30e-13}}} {ralign 9:{res:{sf: 74}}} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf: .3933974}}} {ralign 9:{res:{sf: .3933974}}} {ralign 9:{res:{sf: .0005254}}} {ralign 9:{res:{sf: 74}}} + {res:{lalign 13:turn}}{c |}{space 11}{space 11}{space 11}{space 11} + {ralign 12:turn} {c |} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf:{space 9}}}} {ralign 9:{res:{sf: 74}}} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf:-.6310965}}} {ralign 9:{res:{sf:-.6310965}}} {ralign 9:{res:{sf: 1.66e-09}}} {ralign 9:{res:{sf: 74}}} + {res:{lalign 13:foreign}}{c |}{space 11}{space 11}{space 11}{space 11} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf:{space 9}}}} {ralign 9:{res:{sf: 74}}} + + {com}. esttab ., not unstack compress noobs + {res} + {txt}{hline 62} + {txt} (1) + {txt} + {txt} price mpg turn foreign + {txt}{hline 62} + {txt}price {res} 1 {txt} + {txt}mpg {res} -0.469*** 1 {txt} + {txt}turn {res} 0.310** -0.719*** 1 {txt} + {txt}foreign {res} 0.0487 0.393*** -0.631*** 1 {txt} + {txt}{hline 62} + {txt}* p<0.05, ** p<0.01, *** p<0.001 + + {com}. esttab ., not unstack compress noobs nonum nomtitle /// + > varwidth(21) varlabels(`e(labels)') eqlabels(`e(eqlabels)') + {res} + {txt}{hline 73} + {txt} (1) (2) (3) (4) + {txt}{hline 73} + {txt}(1) Price {res} 1 {txt} + {txt}(2) Mileage (mpg) {res} -0.469*** 1 {txt} + {txt}(3) Turn circle (ft.){res} 0.310** -0.719*** 1 {txt} + {txt}(4) Car origin {res} 0.0487 0.393*** -0.631*** 1 {txt} + {txt}{hline 73} + {txt}* p<0.05, ** p<0.01, *** p<0.001 + + {com}. bysort foreign: eststo: /// + > estpost correlate price turn weight rep78, listwise + + {txt}{hline 60} + -> Domestic + + {ralign 12:price} {c |} {ralign 9:e(b)} {ralign 9:e(rho)} {ralign 9:e(p)} {ralign 9:e(count)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:turn} {c |} {ralign 9:{res:{sf: .4328091}}} {ralign 9:{res:{sf: .4328091}}} {ralign 9:{res:{sf: .0021229}}} {ralign 9:{res:{sf: 48}}} + {ralign 12:weight} {c |} {ralign 9:{res:{sf: .6864719}}} {ralign 9:{res:{sf: .6864719}}} {ralign 9:{res:{sf: 7.19e-08}}} {ralign 9:{res:{sf: 48}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf:-.0193249}}} {ralign 9:{res:{sf:-.0193249}}} {ralign 9:{res:{sf: .8962741}}} {ralign 9:{res:{sf: 48}}} + ({res}est1{txt} stored) + + {hline 60} + -> Foreign + + {ralign 12:price} {c |} {ralign 9:e(b)} {ralign 9:e(rho)} {ralign 9:e(p)} {ralign 9:e(count)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:turn} {c |} {ralign 9:{res:{sf: .5102425}}} {ralign 9:{res:{sf: .5102425}}} {ralign 9:{res:{sf: .0181155}}} {ralign 9:{res:{sf: 21}}} + {ralign 12:weight} {c |} {ralign 9:{res:{sf: .8315886}}} {ralign 9:{res:{sf: .8315886}}} {ralign 9:{res:{sf: 2.99e-06}}} {ralign 9:{res:{sf: 21}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: .1797879}}} {ralign 9:{res:{sf: .1797879}}} {ralign 9:{res:{sf: .4354917}}} {ralign 9:{res:{sf: 21}}} + ({res}est2{txt} stored) + + {com}. esttab est1 est2, not mtitles + {res} + {txt}{hline 44} + {txt} (1) (2) + {txt} Domestic Foreign + {txt}{hline 44} + {txt}turn {res} 0.433** 0.510* {txt} + {txt}weight {res} 0.686*** 0.832***{txt} + {txt}rep78 {res} -0.0193 0.180 {txt} + {txt}{hline 44} + {txt}N {res} 48 21 {txt} + {txt}{hline 44} + {txt}* p<0.05, ** p<0.01, *** p<0.001 +{* end example }{txt}{...} + +{marker ci} +{dlgtab:ci} + +{p 4 15 2} +{cmd:estpost} {cmdab:ci} + [{it:{help varlist}}] [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:b:inomial} + {cmdab:p:oisson} {cmdab:e:xposure:(}{it:varname}{cmd:)} + {cmdab:ex:act} {cmdab:wa:ld} {cmdab:w:ilson} {cmdab:a:gresti} {cmdab:j:effreys} + {cmdab:l:evel:(}{it:#}{cmd:)} + {cmdab:list:wise} + {cmdab:case:wise} + {cmdab:q:uietly} + {cmdab:es:ample} + ] + +{p 4 4 2} + posts standard errors and confidence intervals computed by + {helpb ci}. {cmd:aweight}s and {cmd:fweight}s are allowed, + but {cmd:aweight}s may not be specified with options + {cmd:binomial} or {cmd:poisson}; + see {help weight}. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:binomial}, {cmd:poisson}, {cmd:exposure()}, + {cmd:exact}, {cmd:wald}, {cmd:wilson}, {cmd:agresti}, + {cmd:jeffreys}, and {cmd:level()} + as described in help {helpb ci}. + +{p 8 12 2} + {cmd:listwise} to handle missing values through listwise deletion, + meaning that an observation is omitted from the estimation + sample if any of the variables in {it:varlist} is missing for that + observation. The default is to determine the used observations for + each variable separately without regard to whether other variables + are missing. {cmd:casewise} is a synonym for {cmd:listwise}. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 4 4 2}The following results vectors are saved in {cmd:e()}: + + {lalign 13:{cmd:e(b)}}mean + {lalign 13:{cmd:e(count)}}number of observations + {lalign 13:{cmd:e(se)}}estimate of standard error + {lalign 13:{cmd:e(lb)}}lower bound of confidence interval + {lalign 13:{cmd:e(ub)}}upper bound of confidence interval + +{p 4 4 2} + Examples: + +{* begin example ci }{...} + {com}. sysuse auto, clear + {txt}(1978 Automobile Data) + + {com}. estpost ci price mpg rep78, listwise + {txt}(confidence level is 95%) + + {ralign 12:} {c |} {ralign 9:e(b)} {ralign 9:e(count)} {ralign 9:e(se)} {ralign 9:e(lb)} {ralign 9:e(ub)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6146.043}}} {ralign 9:{res:{sf: 69}}} {ralign 9:{res:{sf: 350.6166}}} {ralign 9:{res:{sf: 5446.399}}} {ralign 9:{res:{sf: 6845.688}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 21.28986}}} {ralign 9:{res:{sf: 69}}} {ralign 9:{res:{sf: .7062326}}} {ralign 9:{res:{sf: 19.88059}}} {ralign 9:{res:{sf: 22.69912}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 3.405797}}} {ralign 9:{res:{sf: 69}}} {ralign 9:{res:{sf: .1191738}}} {ralign 9:{res:{sf: 3.167989}}} {ralign 9:{res:{sf: 3.643605}}} + + {com}. esttab ., cells("b lb ub") label + {res} + {txt}{hline 59} + {txt} (1) + {txt} + {txt} b lb ub + {txt}{hline 59} + {txt}Price {res} 6146.043 5446.399 6845.688{txt} + {txt}Mileage (mpg) {res} 21.28986 19.88059 22.69912{txt} + {txt}Repair Record 1978 {res} 3.405797 3.167989 3.643605{txt} + {txt}{hline 59} + {txt}Observations {res} 69 {txt} + {txt}{hline 59} + + {com}. eststo exact: estpost ci foreign, binomial exact + {txt}(confidence level is 95%) + + {ralign 12:} {c |} {ralign 9:e(b)} {ralign 9:e(count)} {ralign 9:e(se)} {ralign 9:e(lb)} {ralign 9:e(ub)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf: .2972973}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: .0531331}}} {ralign 9:{res:{sf: .196584}}} {ralign 9:{res:{sf: .4148353}}} + + {com}. eststo agresti: estpost ci foreign, binomial agresti + {txt}(confidence level is 95%) + + {ralign 12:} {c |} {ralign 9:e(b)} {ralign 9:e(count)} {ralign 9:e(se)} {ralign 9:e(lb)} {ralign 9:e(ub)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf: .2972973}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: .0531331}}} {ralign 9:{res:{sf: .204807}}} {ralign 9:{res:{sf: .4097942}}} + + {com}. esttab exact agresti, cells(lb ub) mtitles + {res} + {txt}{hline 38} + {txt} (1) (2) + {txt} exact agresti + {txt} lb/ub lb/ub + {txt}{hline 38} + {txt}foreign {res} .196584 .204807{txt} + {res} .4148353 .4097942{txt} + {txt}{hline 38} + {txt}N {res} 74 74{txt} + {txt}{hline 38} +{* end example }{txt}{...} + +{marker stci} +{dlgtab:stci} + +{p 4 15 2} +{cmd:estpost} {cmd:stci} + [{it:{help if}}] [{it:{help in}}] + [{cmd:,} + {cmd:by(}{it:groupvar}{cmd:)} + {cmdab:m:edian} + {cmdab:r:mean} + {cmdab:e:mean} + {cmd:p(}{it:#}{cmd:)} + {cmdab:cc:orr} + {cmdab:l:evel:(}{it:#}{cmd:)} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels} + ] + +{p 4 4 2} + posts confidence intervals for means + and percentiles of survival time computed by {helpb stci}. Stata 9 or + newer is required. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:by(}{it:groupvar}{cmd:)} + to report separate summaries for each group defined by + {it:groupvar}, along with an overall total. + +{p 8 12 2} + {cmd:median}, + {cmd:rmean}, + {cmd:emean}, + {cmd:p()}, + {cmd:ccorr}, and + {cmd:level()} + as described in help {helpb stci}. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 8 12 2} + {cmd:elabels} to enforce saving {cmd:by()} labels in {cmd:e(labels)}. + +{p 4 4 2}The following vectors are saved in {cmd:e()}: + + {lalign 13:{cmd:e(count)}}number of subjects + {lalign 13:{cmd:e(p50)}}median (if {cmd:median} specified; the default) + {lalign 13:{cmd:e(p}{it:#}{cmd:)}}#th percentile (if {cmd:p(}{it:#}{cmd:)} specified) + {lalign 13:{cmd:e(rmean)}}restricted mean (if {cmd:rmean} specified) + {lalign 13:{cmd:e(emean)}}extended mean (if {cmd:emean} specified) + {lalign 13:{cmd:e(se)}}standard error + {lalign 13:{cmd:e(lb)}}lower bound of CI + {lalign 13:{cmd:e(ub)}}upper bound of CI + +{p 4 4 2} + Examples: + +{* begin example stci }{...} + {com}. webuse page2, clear + {txt} + {com}. estpost stci + {txt}(confidence level is 95%) + + {ralign 12:} {c |} {ralign 9:e(count)} {ralign 9:e(p50)} {ralign 9:e(se)} {ralign 9:e(lb)} {ralign 9:e(ub)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:total} {c |} {ralign 9:{res:{sf: 40}}} {ralign 9:{res:{sf: 232}}} {ralign 9:{res:{sf: 2.562933}}} {ralign 9:{res:{sf: 213}}} {ralign 9:{res:{sf: 239}}} + + {com}. esttab ., cell("count p50 se lb ub") noobs compress + {res} + {txt}{hline 60} + {txt} (1) + {txt} + {txt} count p50 se lb ub + {txt}{hline 60} + {txt}total {res} 40 232 2.562933 213 239{txt} + {txt}{hline 60} + + {com}. estpost stci, by(group) + {txt}(confidence level is 95%) + + {ralign 12:} {c |} {ralign 9:e(count)} {ralign 9:e(p50)} {ralign 9:e(se)} {ralign 9:e(lb)} {ralign 9:e(ub)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:1} {c |} {ralign 9:{res:{sf: 19}}} {ralign 9:{res:{sf: 216}}} {ralign 9:{res:{sf: 5.171042}}} {ralign 9:{res:{sf: 190}}} {ralign 9:{res:{sf: 234}}} + {ralign 12:2} {c |} {ralign 9:{res:{sf: 21}}} {ralign 9:{res:{sf: 233}}} {ralign 9:{res:{sf: 2.179595}}} {ralign 9:{res:{sf: 232}}} {ralign 9:{res:{sf: 280}}} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:total} {c |} {ralign 9:{res:{sf: 40}}} {ralign 9:{res:{sf: 232}}} {ralign 9:{res:{sf: 2.562933}}} {ralign 9:{res:{sf: 213}}} {ralign 9:{res:{sf: 239}}} + + {com}. esttab ., cell("count p50 se lb ub") noobs compress + {res} + {txt}{hline 60} + {txt} (1) + {txt} + {txt} count p50 se lb ub + {txt}{hline 60} + {txt}1 {res} 19 216 5.171042 190 234{txt} + {txt}2 {res} 21 233 2.179595 232 280{txt} + {txt}total {res} 40 232 2.562933 213 239{txt} + {txt}{hline 60} +{* end example }{txt}{...} + +{marker margins} +{dlgtab:margins} + +{p 4 15 2} +{cmd:estpost} {cmd:margins} + [{it:{help fvvarlist:marginlist}}] [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:q:uietly} + {it:{help margins:margins_opions}} + ] + +{p 4 4 2} + posts results from the {helpb margins} command, that was introduced in + Stata 11. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {it:margins_opions} as described in help {helpb margins} (except {cmd:post}). + +{p 4 4 2}{cmd:estpost margins} replaces the current {cmd:e(b)} and +{cmd:e(V)} with {cmd:r(b)} and {cmd:r(V)} from {helpb margins} and +also copies all other matrixes, scalars, and macros from {helpb margins} into +{cmd:e()} (possibly replacing identically named existing entries). + +{p 4 4 2} + Examples: + +{* begin example margins }{...} + {com}. sysuse auto, clear + {txt}(1978 Automobile Data) + + {com}. quietly logit foreign price mpg weight + {txt} + {com}. estpost margins, dydx(*) quietly + {txt} + {com}. esttab ., cell("b se") pr2 + {res} + {txt}{hline 38} + {txt} (1) + {txt} foreign + {txt} b se + {txt}{hline 38} + {txt}price {res} .0000686 .0000136{txt} + {txt}mpg {res} -.0089607 .006596{txt} + {txt}weight {res} -.0005069 .000055{txt} + {txt}{hline 38} + {txt}N {res} 74 {txt} + {txt}pseudo R-sq {res} 0.619 {txt} + {txt}{hline 38} +{* end example }{txt}{...} + + +{title:Author} + +{p 4 4 2} Ben Jann, Institute of Sociology, University of Bern, jann@soz.unibe.ch + +{p 4 4 2} {cmd:estpost gtabstat} has been contributed by Mauricio Caceres Bravo. + + +{title:Also see} + + Manual: {hi:[R] estimates} + +{p 4 13 2}Online: help for + {helpb estimates}, + {helpb estout}, + {helpb esttab}, + {helpb eststo}, + {helpb estadd} +{p_end} diff --git a/ado/e/eststo.ado b/ado/e/eststo.ado new file mode 100644 index 0000000..a0dea68 --- /dev/null +++ b/ado/e/eststo.ado @@ -0,0 +1,343 @@ +*! version 1.1.0 05nov2008 Ben Jann + +program define eststo, byable(onecall) + version 8.2 + local caller : di _caller() +// --- eststo clear --- + if `"`1'"'=="clear" { + if `"`0'"'!="clear" { + di as err "invalid syntax" + exit 198 + } + if "`_byvars'"!="" error 190 + _eststo_clear + exit + } +// --- update globals --- + _eststo_cleanglobal +// --- eststo dir --- + if `"`1'"'=="dir" { + if `"`0'"'!="dir" { + di as err "invalid syntax" + exit 198 + } + if "`_byvars'"!="" error 190 + _eststo_dir + exit + } +// --- eststo drop --- + if `"`1'"'=="drop" { + if "`_byvars'"!="" error 190 + _eststo_`0' + exit + } +// --- eststo store (no by) --- + if "`_byvars'"=="" { + version `caller': _eststo_store `0' + exit + } +// --- eststo store (by) --- +// - check sorting + local sortedby : sortedby + local i 0 + foreach byvar of local _byvars { + local sortedbyi : word `++i' of `sortedby' + if "`byvar'"!="`sortedbyi'" error 5 + } +// - parse command on if qualified + capt _on_colon_parse `0' + if _rc error 190 + if `"`s(after)'"'=="" error 190 + local estcom `"`s(after)'"' + local 0 `"`s(before)'"' + if substr(trim(`"`estcom'"'),1,3)=="svy" { + di as err "svy commands not allowed with by ...: eststo:" + exit 190 + } + AddBygrpToIfqualifier `estcom' +// - parse syntax of _eststo_store call in order to determine +// whether title() or missing was specified (note that +// -estimates change- cannot be used to set the titles since +// it does not work with -noesample-) + TitleAndMissing `0' +// - generate byindex + tempname _byindex + qui egen long `_byindex' = group(`_byvars'), label `missing' + qui su `_byindex', meanonly + if r(N)==0 error 2000 + local Nby = r(max) +// - loop over bygroups + forv i = 1/`Nby' { + local ibylab: label (`_byindex') `i' + di as txt _n "{hline}" + di as txt `"-> `ibylab'"' // could be improved + if `titleopt'==0 local ibytitle + else if `titleopt'==1 local ibytitle `" title(`ibylab')"' + else if `titleopt'==2 local ibytitle `", title(`ibylab')"' + capture noisily { + version `caller': _eststo_store `0'`ibytitle' : `estcmd' + } + if _rc { + if "`_byrc0'"=="" error _rc + } + } +end + +prog TitleAndMissing + capt syntax [anything] , Title(string) [ MISsing * ] + if _rc==0 { + c_local titleopt 0 + c_local missing "`missing'" + } + else { + syntax [anything] [ , MISsing * ] + if `"`missing'`options'"'!="" c_local titleopt 1 + else c_local titleopt 2 + c_local missing "`missing'" + } +end + +program AddBygrpToIfqualifier + syntax anything(equalok) [if/] [in] [using] [fw aw pw iw] [, * ] + local estcom `"`macval(anything)' if (\`_byindex'==\`i')"' + if `"`macval(if)'"'!="" { + local estcom `"`macval(estcom)' & (`macval(if)')"' + } + if `"`macval(in)'"'!="" { + local estcom `"`macval(estcom)' `macval(in)'"' + } + if `"`macval(using)'"'!="" { + local estcom `"`macval(estcom)' `macval(using)'"' + } + if `"`macval(weight)'"'!="" { + local estcom `"`macval(estcom)' [`macval(weight)'`macval(exp)']"' + } + if `"`macval(options)'"'!="" { + local estcom `"`macval(estcom)', `macval(options)'"' + } + c_local estcmd `"`macval(estcom)'"' +end + +program define _eststo_clear + local names $eststo + foreach name of local names { + capt estimates drop `name' + } + global eststo + global eststo_counter +end + +program define _eststo_dir + if `"$eststo"'!="" { + estimates dir $eststo + } +end + +program define _eststo_cleanglobal + local enames $eststo + if `"`enames'"'!="" { + tempname hcurrent + _return hold `hcurrent' + qui _estimates dir + local snames `r(names)' + _return restore `hcurrent' + } + local names: list enames & snames + global eststo `names' + if "`names'"=="" global eststo_counter +end + +program define _eststo_drop + local droplist `0' + if `"`droplist'"'=="" { + di as error "someting required" + exit 198 + } + local names $eststo + foreach item of local droplist { + capt confirm integer number `item' + if _rc { + local dropname `item' + } + else { + if `item'<1 { + di as error "`item' not allowed" + exit 198 + } + local dropname est`item' + } + local found 0 + foreach name in `names' { + if match("`name'",`"`dropname'"') { + local found 1 + estimates drop `name' + local names: list names - name + di as txt "(" as res "`name'" as txt " dropped)" + } + } + if `found'==0 { + di as txt "(no matches found for " as res `"`dropname'"' as txt ")" + } + } + global eststo `names' +end + + +program define _eststo_store, eclass + local caller : di _caller() + capt _on_colon_parse `0' + if !_rc { + local command `"`s(after)'"' + local 0 `"`s(before)'"' + } + syntax [name] [, /// + Title(passthru) /// + Prefix(name) /// + Refresh Refresh2(numlist integer max=1 >0) /// + ADDscalars(string asis) /// + noEsample /// + noCopy /// + MISsing svy /// doesn't do anything + ] + if `"`prefix'"'=="" local prefix "est" + +// get previous eststo names and counter + local names $eststo + local counter $eststo_counter + if `"`counter'"'=="" local counter 0 + +// if name provided; set refresh on if name already in list + if "`namelist'"!="" { + if "`refresh2'"!="" { + di as error "refresh() not allowed" + exit 198 + } + local name `namelist' + if `:list name in names' local refresh refresh + else { + if "`refresh'"!="" { + di as txt "(" as res "`name'" as txt " not found)" + } + local refresh + } + if "`refresh'"=="" local ++counter + } +// if no name provided + else { + if "`refresh2'"!="" local refresh refresh + if "`refresh'"!="" { +// refresh2 not provided => refresh last (if available) + if "`refresh2'"=="" { + if "`names'"=="" { + di as txt "(nothing to refresh)" + local refresh + } + else local name: word `:list sizeof names' of `names' + } +// refresh2 provided => check availability + else { + if `:list posof "`prefix'`refresh2'" in names' { + local name `prefix'`refresh2' + } + else { + di as txt "(" as res "`prefix'`refresh2'" as txt " not found)" + local refresh + } + } + } + if "`refresh'"=="" local ++counter +// set default name + if "`name'"=="" local name `prefix'`counter' + } + +// run estimation command if provided + if `"`command'"'!="" { + version `caller': `command' + } + +// add scalars to e() + if `"`addscalars'"'!="" { + capt ParseAddscalars `addscalars' + if _rc { + di as err `"addscalars() invalid"' + exit 198 + } + if "`replace'"=="" { + local elist `: e(scalars)' `: e(macros)' `: e(matrices)' `: e(functions)' + } + local forbidden b V sample + while (1) { + gettoken lhs rest: rest + if `:list lhs in forbidden' { + di as err `"`lhs' not allowed in addscalars()"' + exit 198 + } + if "`replace'"=="" { + if `:list lhs in elist' { + di as err `"e(`lhs') already defined"' + exit 110 + } + } + gettoken rhs rest: rest, bind + capt eret scalar `lhs' = `rhs' + if _rc { + di as err `"addscalars() invalid"' + exit 198 + } + capture local result = e(`lhs') + di as txt "(e(" as res `"`lhs'"' as txt ") = " /// + as res `result' as txt " added)" + if `"`rest'"'=="" continue, break + } + } +// add e(cmd) if missing + if `"`e(cmd)'"'=="" { + if `"`: e(scalars)'`: e(macros)'`: e(matrices)'`: e(functions)'"'!="" { + eret local cmd "." + } + } + +// store estimates with e(sample) + estimates store `name' , `copy' `title' + +// remove e(sample) if -noesample- specified + if "`esample'"!="" { + capt confirm new var _est_`name' + if _rc { + tempname hcurrent + _est hold `hcurrent', restore estsystem nullok + qui replace _est_`name' = . in 1 + _est unhold `name' + capt confirm new var _est_`name' + if _rc qui drop _est_`name' + else { + di as error "somethings wrong; please contact author of -eststo- " /// + "(see e-mail in help {help eststo})" + exit 498 + } + _est hold `name', estimates varname(_est_`name') + // varname() only needed so that _est hold does not return error + // if variable `name' exists + } + } + +// report + if "`refresh'"=="" { + global eststo `names' `name' + global eststo_counter `counter' + if `"`namelist'"'=="" { + di as txt "(" as res "`name'" as txt " stored)" + } + } + else { + if `"`namelist'"'=="" { + di as txt "(" as res "`name'" as txt " refreshed)" + } + } +end + +program ParseAddscalars + syntax anything [ , Replace ] + c_local rest `"`anything'"' + c_local replace `replace' +end diff --git a/ado/e/eststo.hlp b/ado/e/eststo.hlp new file mode 100644 index 0000000..c2c5a2c --- /dev/null +++ b/ado/e/eststo.hlp @@ -0,0 +1,347 @@ +{smcl} +{* 01feb2017}{...} +{hi:help eststo}{right:also see: {helpb esttab}, {helpb estout}, {helpb estadd}, {helpb estpost}} +{right: {browse "http://repec.sowi.unibe.ch/stata/estout/"}} +{hline} + +{title:Title} + +{p 4 4 2}{hi:eststo} {hline 2} Store estimates + + +{title:Syntax}{smcl} + +{p 8 15 2} +[{cmd:_}]{cmd:eststo} [{it:name}] +[{cmd:,} {it:{help eststo##options:options}} ] +[ {cmd::} {it:{help estimation_command}} ] + +{p 8 15 2} +[{cmd:_}]{cmd:eststo dir} + +{p 8 15 2} +[{cmd:_}]{cmd:eststo drop} {{it:#}|{it:name}} [ {{it:#}|{it:name}} ... ] + +{p 8 15 2} +[{cmd:_}]{cmd:eststo clear} + +{marker options} + {it:options}{col 23}description + {hline 56} + [{ul:{cmd:no}}]{cmdab:e:sample}{col 23}{...} +do not/do store {cmd:e(sample)} + {cmdab:t:itle:(}{it:string}{cmd:)}{col 23}{...} +specify a title for the stored set + {cmdab:p:refix:(}{it:prefix}{cmd:)}{col 23}{...} +specify a name prefix; default is {cmd:est} + {cmdab:add:scalars(}{it:...}{cmd:)}{col 23}{...} +add scalar statistics + {cmdab:r:efresh}[{cmd:(}{it:#}{cmd:)}]{col 23}{...} +overwrite a previously stored set + {cmdab:noc:opy}{col 23}{...} +clear {cmd:e()} after storing the set + {cmdab:mis:sing}{col 23}{...} +use missing values in the {cmd:by} groups + {hline 56} + +{p 4 4 2} +{cmd:by} is allowed with {cmd:eststo} if {cmd:eststo} +is used as a prefix command, i.e. specify + + {cmd:by} {it:...} {cmd::} {cmd:eststo} {it:...} {cmd::} {it:estimation_command} + +{p 4 4 2} +to apply {it:estimation_command} to each {cmd:by} group and store an estimation +set for each group; see help {help by}. Note that the implementation of {cmd:by} +with {cmd:eststo} requires {it:estimation_command} +to follow {help language:standard Stata syntax} and +allow the {it:{help if}} qualifier. Do not use the +{bind:{cmd:by} {it:...}{cmd:: eststo:}} construct with +{cmd:svy} commands. + + +{title:Description} + +{p 4 4 2} +{cmd:eststo} stores a copy of the active estimation results for later +tabulation. If {it:name} is provided, the estimation set is stored +under {it:name}. If {it:name} is not provided, the estimation set is +stored under {cmd:est}{it:#}, where {it:#} is a counter for the +number of stored estimation sets. + +{p 4 4 2} +{cmd:eststo} may be used in two ways: Either after fitting a model as +in + + {com}. regress y x + . eststo{txt} + +{p 4 4 2} +or as a prefix command (see help {help prefix}): + + {com}. eststo: regress y x{txt} + +{p 4 4 2} +{cmd:_eststo} is a variant on {cmd:eststo} that, by default, does not +store the estimation sample information contained in {cmd:e(sample)}. +Essentially, {cmd:_eststo} is a shortcut to {cmd:eststo, noesample}. + +{p 4 4 2} +{cmd:eststo dir} displays a list of the stored estimates. + +{p 4 4 2} +{cmd:eststo drop} drops estimation sets stored by {cmd:eststo}. If {it:name} is +provided, the estimation set stored under {it:name} +is dropped (if {cmd:*} or {cmd:?} wildcards are used {it:name}, +all matching sets are dropped). Alternatively, if {it:#} is provided, +the estimation set stored as {cmd:est}{it:#} is dropped. + +{p 4 4 2} +{cmd:eststo clear} drops all estimation sets stored by {cmd:eststo} (and clears +{cmd:eststo}'s global macros). + +{p 4 4 2} +{cmd:eststo} is an alternative to official Stata's +{helpb estimates store}. The main differences are: + +{p 8 12 2} +{space 1}o{space 2}{cmd:eststo} does not require the user to specify a +name for the stored estimation set. + +{p 8 12 2} +{space 1}o{space 2}{cmd:eststo} may be used as a prefix command (see +help {help prefix}). + +{p 8 12 2} +{space 1}o{space 2}{cmd:eststo} provides the possibility to store +estimates without the {cmd:e(sample)} function (either specify the +{cmd:noesample} option or use the {cmd:_eststo} command). Omitting +{cmd:e(sample)} saves memory and also speeds up tabulation programs +such as {helpb estimates table}, {helpb estout} or {helpb esttab}. +{hi:Warning:} Some post-estimation commands may not work with +estimation sets that do not contain the {cmd:e(sample)}. + +{p 8 12 2} +{space 1}o{space 2}{cmd:eststo} can add additional scalar statistics to +be stored with the estimation set. + + +{title:Options} +{marker esample} +{p 4 8 2} +{cmd:esample} causes the information in {cmd:e(sample)} to be stored +with the estimates. This is the default in {cmd:eststo}. Type +{cmd:noesample} or use the {cmd:_eststo} command to omit the +{cmd:e(sample)}. Note that some post-estimation commands may not be +working correctly with estimation sets that have been stored without +{cmd:e(sample)}. + +{p 4 8 2} +{cmd:title(}{it:string}{cmd:)} specifies a title for the stored +estimation set. +{p_end} +{marker addscalars} +{p 4 8 2} +{cmd:addscalars(}{it:name exp} [{it:...}] [{cmd:,} {cmdab:r:eplace}]{cmd:)} +may be used to add additional results to the {cmd:e()}-scalars of the +estimation set before storing it. Specify the names and values of the +scalars in pairs. For example, {cmd:addscalars(one 1 two 2)} would +add {cmd:e(one)} = {cmd:1} and {cmd:e(two)} = {cmd:2}. See below for +an example. The {cmd:replace} suboption permits overwriting existing +{cmd:e()}-returns. Not allowed as names are "b", "V", or "sample". +See {helpb estadd} for a more sophisticated tool to add additional +results to {cmd:e()}-returns. + +{p 4 8 2} +{cmd:prefix(}{it:prefix}{cmd:)} specifies a custom prefix for the +automatic names of the stored estimation sets. The default prefix +is {cmd:est}. + +{p 4 8 2} +{cmd:refresh}[{cmd:(}{it:#}{cmd:)}] may be used to overwrite a +previously stored estimation set instead of storing the estimates +under a new name. {cmd:refresh}, specified without argument, will +overwrite the last saved set. Alternatively, +{cmd:refresh(}{it:#}{cmd:)} will overwrite the set named +{cmd:est}{it:#} if it exists. If {it:name} is provided to {cmd:eststo}, +existing sets of the same name will always be overwritten whether or +not {cmd:refresh} is specified. {cmd:refresh()} with argument is not +allowed in this case. + +{p 4 8 2} +{cmd:nocopy} specifies that after the estimation set has been stored, +it no longer be available as the active estimation set. + +{p 4 8 2} +{cmd:missing} is for use of {cmd:eststo} with the {cmd:by} prefix command and +causes missing values to be treated like any other values in the {cmd:by} +variables. The default is to discard observations with missing values in the +{cmd:by} variables. + + +{title:Examples} + +{p 4 4 2} +Applying {cmd:eststo} after fiting a model to store the model's results, +as in the following example: + + {com}. sysuse auto + {txt}(1978 Automobile Data) + + {com}. quietly regress price weight + {txt} + {com}. eststo model1 + {txt} + {com}. quietly regress turn weight foreign + {txt} + {com}. eststo model2 + {txt} + {com}. estout + {res} + {txt}{hline 38} + {txt} model1 model2 + {txt} b b + {txt}{hline 38} + {txt}weight {res} 2.044063 .0042183{txt} + {txt}foreign {res} -1.809802{txt} + {txt}_cons {res} -6.707353 27.44963{txt} + {txt}{hline 38} + + +{p 4 4 2} +Applying {cmd:eststo} as a prefix commmand to fit and store a model in one step: + + {com}. eststo model1: quietly regress price weight + {txt} + {com}. eststo model2: quietly regress turn weight foreign + {txt} + {com}. estout + {res} + {txt}{hline 38} + {txt} model1 model2 + {txt} b b + {txt}{hline 38} + {txt}weight {res} 2.044063 .0042183{txt} + {txt}foreign {res} -1.809802{txt} + {txt}_cons {res} -6.707353 27.44963{txt} + {txt}{hline 38} + + +{p 4 4 2} +Using {cmd:eststo} with automatic names: + + {com}. eststo clear + {txt} + {com}. eststo: quietly regress price weight + {txt}({res}est1{txt} stored) + + {com}. eststo: quietly regress turn weight foreign + {txt}({res}est2{txt} stored) + + {com}. estout + {res} + {txt}{hline 38} + {txt} est1 est2 + {txt} b b + {txt}{hline 38} + {txt}weight {res} 2.044063 .0042183{txt} + {txt}foreign {res} -1.809802{txt} + {txt}_cons {res} -6.707353 27.44963{txt} + {txt}{hline 38} + + +{p 4 4 2} +Adding ancillary statistics: + + {com}. eststo clear + {txt} + {com}. quietly regress price weight mpg + {txt} + {com}. test weight = mpg + + {txt} ( 1) {res}weight - mpg = 0 + + {txt} F( 1, 71) ={res} 0.36 + {txt}{col 13}Prob > F ={res} 0.5514 + {txt} + {com}. eststo, add(p_diff r(p)) + {txt}(e({res}p_diff{txt}) = {res}.55138216{txt} added) + ({res}est1{txt} stored) + + {com}. estout, stat(p_diff) + {res} + {txt}{hline 25} + {txt} est1 + {txt} b + {txt}{hline 25} + {txt}weight {res} 1.746559{txt} + {txt}mpg {res} -49.51222{txt} + {txt}_cons {res} 1946.069{txt} + {txt}{hline 25} + {txt}p_diff {res} .5513822{txt} + {txt}{hline 25} + + +{p 4 4 2} +Using the {cmd:by} prefix to store subbroup models: + + {com}. eststo clear + {txt} + {com}. quietly by foreign: eststo: quietly reg price weight mpg + {txt} + {com}. esttab, label nodepvar nonumber + {res} + {txt}{hline 52} + {txt} Domestic Foreign + {txt}{hline 52} + {txt}Weight (lbs.) {res} 4.415*** 5.156***{txt} + {res} {ralign 12:{txt:(}4.66{txt:)}} {ralign 12:{txt:(}5.85{txt:)}} {txt} + + {txt}Mileage (mpg) {res} 237.7 -19.78 {txt} + {res} {ralign 12:{txt:(}1.71{txt:)}} {ralign 12:{txt:(}-0.34{txt:)}} {txt} + + {txt}Constant {res} -13285.4* -5065.8 {txt} + {res} {ralign 12:{txt:(}-2.32{txt:)}} {ralign 12:{txt:(}-1.58{txt:)}} {txt} + {txt}{hline 52} + {txt}Observations {res} 52 22 {txt} + {txt}{hline 52} + {txt}t statistics in parentheses + {txt}* p<0.05, ** p<0.01, *** p<0.001 + + +{title:Returned results} + +{p 4 4 2} +The name under which an estimation set is stored, is added to the set in +{cmd:e(_estimates_name)}. + +{p 4 4 2} +In addition, {cmd:eststo} maintains two global macros. {cmd:$eststo} contains a list +of the names of the stored estimation sets. {cmd:$eststo_counter} +contains the count of stored estimation sets. + + +{title:Acknowledgements} + +{p 4 4 2} +Bill Gould suggested to make {cmd:eststo} "byable". + + +{title:Author} + +{p 4 4 2} +Ben Jann, Institute of Sociology, University of Bern, jann@soz.unibe.ch + + +{title:Also see} + + Manual: {hi:[R] estimates} + +{p 4 13 2}Online: help for + {helpb estimates}, + {helpb esttab}, + {helpb estout}, + {helpb estadd}, + {helpb estpost} +{p_end} + diff --git a/ado/e/esttab.ado b/ado/e/esttab.ado new file mode 100644 index 0000000..bc57b4f --- /dev/null +++ b/ado/e/esttab.ado @@ -0,0 +1,1337 @@ +*! version 2.1.1 10jun2022 Ben Jann +*! wrapper for estout + +program define esttab + version 8.2 + local caller : di _caller() + +// mode specific defaults + local cdate "`c(current_date)'" + local ctime "`c(current_time)'" +// - fixed + local fixed_open0 `""% `cdate' `ctime'""' + local fixed_close0 `""""' + local fixed_open `""' + local fixed_close `""' + local fixed_caption `""@title""' + local fixed_open2 `""' + local fixed_close2 `""' + local fixed_toprule `""@hline""' + local fixed_midrule `""@hline""' + local fixed_bottomrule `""@hline""' + local fixed_topgap `""""' + local fixed_midgap `""""' + local fixed_bottomgap `""""' + local fixed_eqrule `"begin(@hline "")"' + local fixed_ssl `"N R-sq "adj. R-sq" "pseudo R-sq" AIC BIC"' + local fixed_lsl `"Observations R-squared "Adjusted R-squared" "Pseudo R-squared" AIC BIC"' + local fixed_starlevels `"* 0.05 ** 0.01 *** 0.001"' + local fixed_starlevlab `""' + local fixed_begin `""' + local fixed_delimiter `"" ""' + local fixed_end `""' + local fixed_incelldel `"" ""' + local fixed_varwidth `"\`= cond("\`label'"=="", 12, 20)'"' + local fixed_modelwidth `"12"' + local fixed_abbrev `"abbrev"' + local fixed_substitute `""' + local fixed_interaction `"" # ""' + local fixed_tstatlab `"t statistics"' + local fixed_zstatlab `"z statistics"' + local fixed_pvallab `"p-values"' + local fixed_cilab `"\`level'% confidence intervals"' +// - smcl + local smcl_open0 `"{smcl} "{* % `cdate' `ctime'}{...}""' + local smcl_close0 `""""' + local smcl_open `""' + local smcl_close `""' + local smcl_caption `""@title""' + local smcl_open2 `""' + local smcl_close2 `""' + local smcl_toprule `""{hline @width}""' + local smcl_midrule `""{hline @width}""' + local smcl_bottomrule `""{hline @width}""' + local smcl_topgap `""""' + local smcl_midgap `""""' + local smcl_bottomgap `""""' + local smcl_eqrule `"begin("{hline @width}" "")"' + local smcl_ssl `"`macval(fixed_ssl)'"' + local smcl_lsl `"`macval(fixed_lsl)'"' + local smcl_starlevels `"`macval(fixed_starlevels)'"' + local smcl_starlevlab `""' + local smcl_begin `""' + local smcl_delimiter `"" ""' + local smcl_end `""' + local smcl_incelldel `"" ""' + local smcl_varwidth `"`macval(fixed_varwidth)'"' + local smcl_modelwidth `"`macval(fixed_modelwidth)'"' + local smcl_abbrev `"`macval(fixed_abbrev)'"' + local smcl_substitute `""' + local smcl_interaction `"" # ""' + local smcl_tstatlab `"`macval(fixed_tstatlab)'"' + local smcl_zstatlab `"`macval(fixed_zstatlab)'"' + local smcl_pvallab `"`macval(fixed_pvallab)'"' + local smcl_cilab `"`macval(fixed_cilab)'"' +// - tab + local tab_open0 `"`macval(fixed_open0)'"' + local tab_close0 `""""' + local tab_open `""' + local tab_close `""' + local tab_caption `""@title""' + local tab_open2 `""' + local tab_close2 `""' + local tab_topgap `""""' + local tab_midgap `""""' + local tab_bottomgap `""""' + local tab_ssl `"`macval(fixed_ssl)'"' + local tab_lsl `"`macval(fixed_lsl)'"' + local tab_starlevels `"`macval(fixed_starlevels)'"' + local tab_starlevlab `""' + local tab_begin `""' + local tab_delimiter `"_tab"' + local tab_end `""' + local tab_incelldel `"" ""' + local tab_varwidth `""' + local tab_modelwidth `""' + local tab_abbrev `""' + local tab_substitute `""' + local tab_interaction `"" # ""' + local tab_tstatlab `"`macval(fixed_tstatlab)'"' + local tab_zstatlab `"`macval(fixed_zstatlab)'"' + local tab_pvallab `"`macval(fixed_pvallab)'"' + local tab_cilab `"`macval(fixed_cilab)'"' +// - csv + local csv_open0 `"`"\`csvlhs'% `cdate' `ctime'""'"' + local csv_close0 `""""' + local csv_open `""' + local csv_close `""' + local csv_caption `"`"\`csvlhs'@title""'"' + local csv_open2 `""' + local csv_close2 `""' + local csv_topgap `""""' + local csv_midgap `""""' + local csv_bottomgap `""""' + local csv_ssl `"`macval(fixed_ssl)'"' + local csv_lsl `"`macval(fixed_lsl)'"' + local csv_starlevels `"`macval(fixed_starlevels)'"' + local csv_starlevlab `""' + local csv_begin `"`"\`csvlhs'"'"' + local csv_delimiter `"`"",\`csvlhs'"'"' + local scsv_delimiter `"`"";\`csvlhs'"'"' + local csv_end `"`"""'"' + local csv_incelldel `"" ""' + local csv_varwidth `""' + local csv_modelwidth `""' + local csv_abbrev `""' + local csv_substitute `""' + local csv_interaction `"" # ""' + local csv_tstatlab `"`macval(fixed_tstatlab)'"' + local csv_zstatlab `"`macval(fixed_zstatlab)'"' + local csv_pvallab `"`macval(fixed_pvallab)'"' + local csv_cilab `"`macval(fixed_cilab)'"' +// - rtf + local rtf_open0 `""' + local rtf_close0 `""' + local rtf_ct `"\yr`=year(d(`cdate'))'\mo`=month(d(`cdate'))'\dy`=day(d(`cdate'))'\hr`=substr("`ctime'",1,2)'\min`=substr("`ctime'",4,2)'"' + local rtf_fonttbl "\f0\fnil Times New Roman;" + local rtf_open_l1 `"`"{\rtf1`=cond("`c(os)'"=="MacOSX", "\mac", "\ansi")'\deff0 {\fonttbl\`rtf_fonttbl'}"'"' + local rtf_open_l2 `" `"{\info {\author .}{\company .}{\title .}{\creatim`rtf_ct'}}"'"' + local rtf_open_l3 `" `"\deflang1033\plain\fs24"'"' + local rtf_open_l4 `" `"{\footer\pard\qc\plain\f0\fs24\chpgn\par}"'"' + local rtf_open `"\`rtf_open_l1'`rtf_open_l2'`rtf_open_l3'`rtf_open_l4'"' + local rtf_close `""{\pard \par}" "}""' + local rtf_caption `"`"{\pard\keepn\ql @title\par}"'"' + local rtf_open2 `""{""' + local rtf_close2 `""}""' + local rtf_toprule `""' + local rtf_midrule `""' + local rtf_bottomrule `""' + local rtf_topgap `""' + local rtf_midgap `"{\trowd\trgaph108\trleft-108@rtfemptyrow\row}"' + local rtf_bottomgap `""' + local rtf_eqrule `"begin("{\trowd\trgaph108\trleft-108@rtfrowdefbrdrt\pard\intbl\ql {") replace"' + local rtf_ssl `""{\i N}" "{\i R}{\super 2}" "adj. {\i R}{\super 2}" "pseudo {\i R}{\super 2}" "{\i AIC}" "{\i BIC}""' + local rtf_lsl `"Observations "{\i R}{\super 2}" "Adjusted {\i R}{\super 2}" "Pseudo {\i R}{\super 2}" "{\i AIC}" "{\i BIC}""' + local rtf_starlevels `""{\super *}" 0.05 "{\super **}" 0.01 "{\super ***}" 0.001"' + local rtf_starlevlab `", label(" {\i p} < ")"' + local rtf_rowdef `"\`=cond("\`lines'"=="", "@rtfrowdef", "@rtfrowdefbrdr")'"' + local rtf_begin `"{\trowd\trgaph108\trleft-108\`rtf_rowdef'\pard\intbl\ql {"' + local rtf_delimiter `"}\cell \pard\intbl\q\`=cond(`"\`alignment'"'!="", `"\`alignment'"', "c")' {"' + local rtf_end `"}\cell\row}"' + local rtf_incelldel `""\line ""' + local rtf_varwidth `"\`= cond("\`label'"=="", 12, 20)'"' + local rtf_modelwidth `"12"' + local rtf_abbrev `""' + local rtf_substitute `""' + local rtf_interaction `"" # ""' + local rtf_tstatlab `"{\i t} statistics"' + local rtf_zstatlab `"{\i z} statistics"' + local rtf_pvallab `"{\i p}-values"' + local rtf_cilab `"\`level'% confidence intervals"' +// - html + local html_open0 `" "`=cond(`"\`macval(title)'"'=="","estimates table, created `cdate' `ctime'","@title")'" """' + local html_close0 `""" """' + local html_open `"`""'"' + local html_close `""
      ""' + local html_caption `""@title""' + local html_open2 `""' + local html_close2 `""' + local html_toprule `""


      ""' + local html_midrule `""
      ""' + local html_bottomrule `""
      ""' + local html_topgap `""' + local html_midgap `"" ""' + local html_bottomgap `""' + local html_eqrule `"begin("
      " "")"' + local html_ssl `"N R2 "adj. R2" "pseudo R2" AIC BIC"' + local html_lsl `"Observations R2 "Adjusted R2" "Pseudo R2" AIC BIC"' + local html_starlevels `"* 0.05 ** 0.01 *** 0.001"' + local html_starlevlab `", label(" p < ")"' + local html_begin `""' + local html_delimiter `""' + local html_end `""' + local html_incelldel `"
      "' + local html_varwidth `"\`= cond("\`label'"=="", 12, 20)'"' + local html_modelwidth `"12"' + local html_abbrev `""' + local html_substitute `""' + local html_interaction `"" # ""' + local html_tstatlab `"t statistics"' + local html_zstatlab `"z statistics"' + local html_pvallab `"p-values"' + local html_cilab `"\`level'% confidence intervals"' +// - tex + local tex_open0 `""% `cdate' `ctime'" `"\documentclass\`texclass'"' \`texpkgs' \`=cond("\`longtable'"!="","\usepackage{longtable}","")' \begin{document} """' + local tex_close0 `""" \end{document} """' + local tex_open `"`"\`=cond("\`longtable'"=="", "\begin{table}[htbp]\centering", "{")'"'"' + local tex_close `"`"\`=cond("\`longtable'"=="", "\end{table}", "}")'"'"' + local tex_caption `"\caption{@title}"' + local tex_open2 `"\`=cond("\`longtable'"!="", "\begin{longtable}", "\begin{tabular" + cond("\`width'"=="", "}", "*}{\`width'}"))'"' + local tex_close2 `"`"\`=cond("\`longtable'"!="", "\end{longtable}", "\end{tabular" + cond("\`width'"=="", "}", "*}"))'"'"' + local tex_toprule `"`"\`="\hline\hline" + cond("\`longtable'"!="", "\endfirsthead\hline\endhead\hline\endfoot\endlastfoot", "")'"'"' + local tex_midrule `""\hline""' + local tex_bottomrule `""\hline\hline""' + local tex_topgap `""' + local tex_midgap `"[1em]"' // `"\\\"' + local tex_bottomgap `""' + local tex_eqrule `"begin("\hline" "")"' + local tex_ssl `"\(N\) \(R^{2}\) "adj. \(R^{2}\)" "pseudo \(R^{2}\)" \textit{AIC} \textit{BIC}"' + local tex_lsl `"Observations \(R^{2}\) "Adjusted \(R^{2}\)" "Pseudo \(R^{2}\)" \textit{AIC} \textit{BIC}"' + local tex_starlevels `"\sym{*} 0.05 \sym{**} 0.01 \sym{***} 0.001"' + local tex_starlevlab `", label(" \(p<@\)")"' + local tex_begin `""' + local tex_delimiter `"&"' + local tex_end `"\\\"' + local tex_incelldel `"" ""' + local tex_varwidth `"\`= cond("\`label'"=="", 12, 20)'"' + local tex_modelwidth `"12"' + local tex_abbrev `""' + local tex_tstatlab `"\textit{t} statistics"' + local tex_zstatlab `"\textit{z} statistics"' + local tex_pvallab `"\textit{p}-values"' + local tex_cilab `"\`level'\% confidence intervals"' + local tex_substitute `"_ \_ "\_cons " \_cons"' + local tex_interaction `"" $\times$ ""' +// - booktabs + local booktabs_open0 `""% `cdate' `ctime'" `"\documentclass\`texclass'"' \`texpkgs' \usepackage{booktabs} \`=cond("\`longtable'"!="","\usepackage{longtable}","")' \begin{document} """' + local booktabs_close0 `"`macval(tex_close0)'"' + local booktabs_open `"`macval(tex_open)'"' + local booktabs_close `"`macval(tex_close)'"' + local booktabs_caption `"`macval(tex_caption)'"' + local booktabs_open2 `"`macval(tex_open2)'"' + local booktabs_close2 `"`macval(tex_close2)'"' + local booktabs_toprule `"`"\`="\toprule" + cond("\`longtable'"!="", "\endfirsthead\midrule\endhead\midrule\endfoot\endlastfoot", "")'"'"' + local booktabs_midrule `""\midrule""' + local booktabs_bottomrule `""\bottomrule""' + local booktabs_topgap `"`macval(tex_topgap)'"' + local booktabs_midgap `"\addlinespace"' + local booktabs_bottomgap `"`macval(tex_bottomgap)'"' + local booktabs_eqrule `"begin("\midrule" "")"' + local booktabs_ssl `"`macval(tex_ssl)'"' + local booktabs_lsl `"`macval(tex_lsl)'"' + local booktabs_starlevels `"`macval(tex_starlevels)'"' + local booktabs_starlevlab `"`macval(tex_starlevlab)'"' + local booktabs_begin `"`macval(tex_begin)'"' + local booktabs_delimiter `"`macval(tex_delimiter)'"' + local booktabs_end `"`macval(tex_end)'"' + local booktabs_incelldel `"`macval(tex_incelldel)'"' + local booktabs_varwidth `"`macval(tex_varwidth)'"' + local booktabs_modelwidth `"`macval(tex_modelwidth)'"' + local booktabs_abbrev `"`macval(tex_abbrev)'"' + local booktabs_tstatlab `"`macval(tex_tstatlab)'"' + local booktabs_zstatlab `"`macval(tex_zstatlab)'"' + local booktabs_pvallab `"`macval(tex_pvallab)'"' + local booktabs_cilab `"`macval(tex_cilab)'"' + local booktabs_substitute `"`macval(tex_substitute)'"' + local booktabs_interaction `"`macval(tex_interaction)'"' +// - mmd + local mmd_open0 `""' + local mmd_close0 `""' + local mmd_open `""""' + local mmd_close `""""' + local mmd_caption `""@title" """' + local mmd_open2 `""' + local mmd_close2 `""' + local mmd_toprule `""' + local mmd_midrule `""' + local mmd_bottomrule `""' + local mmd_topgap `""' + local mmd_midgap `""' + local mmd_bottomgap `""' + local mmd_eqrule `""' + local mmd_ssl `"*N* *R*2 "adj. *R*2" "pseudo *R*2" *AIC* *BIC*"' + local mmd_lsl `"Observations *R*2 "Adjusted *R*2" "Pseudo *R*2" *AIC* *BIC*"' + local mmd_starlevels `"\* 0.05 \*\* 0.01 \*\*\* 0.001"' + local mmd_starlevlab `", label(" *p* < ")"' + local mmd_begin `"| "' + local mmd_delimiter `" | "' + local mmd_end `" |"' + local mmd_incelldel `" "' + local mmd_varwidth `"\`= cond("\`label'"=="", 12, 20)'"' + local mmd_modelwidth `"12"' + local mmd_abbrev `""' + local mmd_substitute `"_ \_ "\_cons " \_cons"' + local mmd_interaction `"" # ""' + local mmd_tstatlab `"*t* statistics"' + local mmd_zstatlab `"*z* statistics"' + local mmd_pvallab `"*p*-values"' + local mmd_cilab `"\`level'\% confidence intervals"' +// syntax + syntax [anything] [using] [ , /// + /// coefficients and t-stats, se, etc. + b Bfmt(string) /// + noT Tfmt(string) /// + z Zfmt(string) /// + se SEfmt(string) /// + p Pfmt(string) /// + ci CIfmt(string) /// + BEta BEtafmt(string) /// + main(string) /// syntax: name format + aux(string) /// syntax: name format + abs /// absolute t-values + wide /// + NOSTAr STAR STAR2(string asis) /// + staraux /// + NOCONstant CONstant /// + COEFlabels(string asis) /// + /// summary statistics + noOBS obslast /// + r2 R2fmt(string) ar2 AR2fmt(string) pr2 PR2fmt(string) /// + aic AICfmt(string) bic BICfmt(string) /// + SCAlars(string asis) /// syntax: "name1 [label1]" "name2 [label2]" etc. + sfmt(string) /// + /// layout + NOMTItles MTItles MTItles2(string asis) /// + NOGAPs GAPs /// + NOLInes LInes /// + ADDNotes(string asis) /// + COMpress /// + plain /// + smcl FIXed tab csv SCsv rtf HTMl tex BOOKTabs md mmd /// + Fragment /// + page PAGE2(str) /// + STANDalone STANDalone2(str asis) /// + ALIGNment(str asis) /// + width(str asis) /// + fonttbl(str) /// + /// other + Noisily /// + * ] + _more_syntax , `macval(options)' + _estout_options , `macval(options)' + +// matrix mode + MatrixMode, `anything' + +// syntax consistency etc + gettoken chunk using0: using + if `"`macval(star2)'"'!="" local star star + foreach opt in constant gaps lines star abbrev depvars numbers parentheses /// + notes mtitles type outfilenoteoff float { + NotBothAllowed "``opt''" `no`opt'' + } + NotBothAllowed "`staraux'" `nostar' + if `"`macval(mtitles2)'"'!="" NotBothAllowed "mtitles" `nomtitles' + if `"`standalone2'"'!="" local standalone standalone + if "`standalone'"!="" { + if `"`standalone2'"'=="" local standalone2 "[varwidth]" + else if `"`standalone2'"'==`""""' local standalone2 + else local standalone2 `"[`standalone2']"' + local page page + } + if `"`page2'"'!="" local page page + NotBothAllowed "`fragment'" `page' + if `"`pfmt'"'!="" local p p + if `"`zfmt'"'!="" local z z + if `"`sefmt'"'!="" local se se + if `"`cifmt'"'!="" local ci ci + if `"`betafmt'"'!="" local beta beta + if "`level'"=="" local level $S_level + if ((("`margin'"!="" | `"`margin2'"'!="") & "`nomargin'"=="") | /// + ("`beta'"!="") | ("`eform'"!="" & "`noeform'"=="")) /// + & "`constant'"=="" local noconstant noconstant + if `"`r2fmt'"'!="" local r2 r2 + if `"`ar2fmt'"'!="" local ar2 ar2 + if `"`pr2fmt'"'!="" local pr2 pr2 + if `"`aicfmt'"'!="" local aic aic + if `"`bicfmt'"'!="" local bic bic + if "`type'"=="" & `"`using'"'!="" local notype notype + local nocellsopt = `"`macval(cells)'"'=="" + if `"`width'"'!="" & `"`longtable'"'!="" { + di as err "width() and longtable not both allowed" + exit 198 + } + +// format modes + local mode `smcl' `fixed' `tab' `csv' `scsv' `rtf' `html' `tex' `booktabs' `md' `mmd' + if `:list sizeof mode'>1 { + di as err "only one allowed of smcl, fixed, tab, csv, scsv, rtf, html, tex, booktabs, md, or mmd" + exit 198 + } + if `"`using'"'!="" { + _getfilename `"`using0'"' + local fn `"`r(filename)'"' + _getfilesuffix `"`fn'"' + local suffix `"`r(suffix)'"' + } + if "`mode'"=="" { + if `"`using'"'!="" { + if inlist(`"`suffix'"', ".html", ".htm") local mode html + else if `"`suffix'"'==".tex" local mode tex + else if `"`suffix'"'==".csv" local mode csv + else if `"`suffix'"'==".rtf" local mode rtf + else if `"`suffix'"'==".smcl" local mode smcl + else if `"`suffix'"'== ".md" local mode md + else if `"`suffix'"'== ".mmd" local mode mmd + else local mode fixed + } + else local mode smcl + } + else { + if "`mode'"=="scsv" { + local csv_delimiter `"`macval(`mode'_delimiter)'"' + local mode "csv" + } + } + if `"`using'"'!="" & `"`suffix'"'=="" { + if inlist("`mode'","fixed","tab") local suffix ".txt" + else if inlist("`mode'","csv","scsv") local suffix ".csv" + else if "`mode'"=="rtf" local suffix ".rtf" + else if "`mode'"=="html" local suffix ".html" + else if inlist("`mode'","tex","booktabs") local suffix ".tex" + else if "`mode'"=="smcl" local suffix ".smcl" + else if "`mode'"=="md" local suffix ".md" + else if "`mode'"=="mmd" local suffix ".mmd" + local using `"using `"`fn'`suffix'"'"' + local using0 `" `"`fn'`suffix'"'"' + } + if "`mode'"=="md" local mode "mmd" // ! + if "`mode'"=="smcl" local smcltags smcltags + local mode0 `mode' + if "`mode0'"=="booktabs" local mode0 tex + else if "`mode0'"=="csv" { + if "`plain'"=="" local csvlhs `"=""' + else local csvlhs `"""' + } + if "`compress'"!="" { + if "``mode'_modelwidth'"!="" { + local `mode'_modelwidth = ``mode'_modelwidth' - 3 + } + if "``mode'_varwidth'"!="" { + local `mode'_varwidth = ``mode'_varwidth' - cond("`label'"!="", 4, 2) + } + } + if `"`modelwidth'"'=="" { + if `nocellsopt' & `"``mode'_modelwidth'"'!="" & "`ci'"!="" { + local modelwidth = 2*``mode'_modelwidth' - 2 + if "`wide'"!="" local modelwidth "``mode'_modelwidth' `modelwidth'" + } + else { + local modelwidth "``mode'_modelwidth'" + } + } + if `"`varwidth'"'=="" { + local varwidth "``mode'_varwidth'" + } + if "`plain'"=="" & `matrixmode'==0 { + foreach opt in star depvars numbers parentheses notes { + SwitchOnIfEmpty `opt' `no`opt'' + } + if "`wide'"=="" & ("`t'"=="" | "`z'`se'`p'`ci'`aux'"!="") & `nocellsopt'==1 /// + SwitchOnIfEmpty gaps `nogaps' + } + if "`plain'"=="" { + SwitchOnIfEmpty lines `nolines' + } + if `"`lines'"'!="" { + SwitchOnIfEmpty eqlines `noeqlines' + } + if inlist("`mode0'", "tab", "csv") { + local lines + local eqlines + } + if "`notes'"!="" & "`nolegend'"=="" & `nocellsopt'==1 & `matrixmode'==0 local legend legend + if "`plain'"!="" { + if "`bfmt'"=="" local bfmt %9.0g + if "`tfmt'"=="" local tfmt `bfmt' + if "`zfmt'"=="" local zfmt `bfmt' + if "`sefmt'"=="" local sefmt `bfmt' + if "`pfmt'"=="" local pfmt `bfmt' + if "`cifmt'"=="" local cifmt `bfmt' + if "`betafmt'"=="" local betafmt `bfmt' + } + //if "`nomtitles'"!="" local depvars + //else if "`depvars'"=="" local mtitles mtitles + +// prepare append for rtf, tex, and html + local outfilenoteoff2 "`outfilenoteoff'" + if "`outfilenoteoff2'"=="" local outfilenoteoff2 "`nooutfilenoteoff'" + if `"`using'"'!="" & "`append'"!="" & /// + (("`mode0'"=="rtf" & "`fragment'"=="") | /// + ("`page'"!="" & inlist("`mode0'", "tex", "html"))) { + capture confirm file `using0' + if _rc==0 { + tempfile appendfile + if "`mode'"=="rtf" local `mode'_open + else local `mode'_open0 + local append + if "`outfilenoteoff2'"=="" local outfilenoteoff2 outfilenoteoff + } + } + +// cells() option + if "`notes'"!="" { + if ("`margin'"!="" | `"`margin2'"'!="") & "`nomargin'"=="" /// + local thenote "`thenote'Marginal effects" + if "`eform'"!="" & "`noeform'"=="" /// + local thenote "`thenote'Exponentiated coefficients" + } + if "`bfmt'"=="" local bfmt a3 + if `nocellsopt' & `matrixmode'==0 { + if "`star'"!="" & "`staraux'"=="" local bstar star + if "`beta'"!="" { + if "`main'"!="" { + di as err "beta() and main() not allowed both" + exit 198 + } + if "`betafmt'"=="" local betafmt 3 + local cells fmt(`betafmt') `bstar' + local cells beta(`cells') + if "`notes'"!="" { + if `"`thenote'"'!="" local thenote "`thenote'; " + local thenote "`thenote'Standardized beta coefficients" + } + } + else if "`main'"!="" { + tokenize "`main'" + if "`2'"=="" local 2 "`bfmt'" + local cells fmt(`2') `bstar' + local cells `1'(`cells') + if "`notes'"!="" { + if `"`thenote'"'!="" local thenote "`thenote'; " + local thenote "`thenote'`1' coefficients" + } + } + else { + local cells fmt(`bfmt') `bstar' + local cells b(`cells') + } + if "`t'"=="" | "`z'`se'`p'`ci'`aux'"!="" { + if "`onecell'"!="" { + local cells `cells' & + } +// parse aux option + tokenize "`aux'" + local auxname `1' + local auxfmt `2' +// type of auxiliary statistic + local aux `z' `se' `p' `ci' `auxname' + if `"`aux'"'=="" local aux t + else { + if `:list sizeof aux'>1 { + di as err "only one allowed of z, se, p, ci, and aux()" + exit 198 + } + } + if !inlist(`"`aux'"', "t", "z") local abs +// parentheses/brackets + if "`parentheses'"!="" | "`brackets'"!="" { + if `"`aux'"'=="ci" { + local brackets brackets + if "`mode'"!="smcl" | "`onecell'"!="" local paren par + else local paren `"par("{ralign @modelwidth:{txt:[}" "{txt:,}" "{txt:]}}")"' + } + else if "`brackets'"!="" { + if "`mode'"!="smcl" | "`onecell'"!="" local paren "par([ ])" + else local paren `"par("{ralign @modelwidth:{txt:[}" "{txt:]}}")"' + } + else { + if "`mode'"!="smcl" | "`onecell'"!="" local paren par + else local paren `"par("{ralign @modelwidth:{txt:(}" "{txt:)}}")"' + } + } +// compose note + if "`notes'"!="" { + if `"`thenote'"'!="" local thenote "`thenote'; " + if `"`auxname'"'!="" { + local thenote `"`macval(thenote)'`auxname'"' + } + else if inlist(`"`aux'"', "t", "z") { + if "`abs'"!="" local thenote `"`macval(thenote)'Absolute "' + local thenote `"`macval(thenote)'``mode'_`aux'statlab'"' + } + else if `"`aux'"'=="se" { + local thenote `"`macval(thenote)'Standard errors"' + } + else if `"`aux'"'=="p" { + local thenote `"`macval(thenote)'``mode'_pvallab'"' + } + else if `"`aux'"'=="ci" { + local thenote `"`macval(thenote)'``mode'_cilab'"' + } + if "`parentheses'"=="" { + if "`wide'"=="" local thenote `"`macval(thenote)' in second row"' + else local thenote `"`macval(thenote)' in second column"' + } + else if "`brackets'"!="" { + local thenote `"`macval(thenote)' in brackets"' + } + else local thenote `"`macval(thenote)' in parentheses"' + } +// formats + if "`tfmt'"=="" local tfmt 2 + if "`zfmt'"=="" local zfmt 2 + if "`sefmt'"=="" local sefmt `bfmt' + if "`pfmt'"=="" local pfmt 3 + if "`cifmt'"=="" local cifmt `bfmt' + if `"`auxfmt'"'=="" local auxfmt `bfmt' + if `"`auxname'"'=="" { + local auxfmt ``aux'fmt' + } +// stars + if "`staraux'"!="" local staraux star +// put together + local temp fmt(`auxfmt') `paren' `abs' `staraux' + local cells `cells' `aux'(`temp') + } + if "`wide'"!="" local cells cells(`"`cells'"') + else local cells cells(`cells') + } + +// stats() option + if `"`macval(stats)'"'=="" & `matrixmode'==0 { + if `"`sfmt'"'=="" local sfmt `bfmt' + if `"`r2fmt'"'=="" local r2fmt = cond("`plain'"!="", "`bfmt'", "3") + if `"`ar2fmt'"'=="" local ar2fmt = cond("`plain'"!="", "`bfmt'", "3") + if `"`pr2fmt'"'=="" local pr2fmt = cond("`plain'"!="", "`bfmt'", "3") + if `"`aicfmt'"'=="" local aicfmt `bfmt' + if `"`bicfmt'"'=="" local bicfmt `bfmt' + if "`label'"=="" { + local stalabs `"``mode'_ssl'"' + } + else { + local stalabs `"``mode'_lsl'"' + } + gettoken obslab stalabs: stalabs + if "`obs'"=="" & "`obslast'"=="" { + local sta N + local stalab `"`"`macval(obslab)'"'"' + local stafmt %18.0g + } + local i 0 + foreach s in r2 ar2 pr2 aic bic { + local ++i + if "``s''"!="" { + local sta `sta' `:word `i' of r2 r2_a r2_p aic bic' + local chunk: word `i' of `macval(stalabs)' + local stalab `"`macval(stalab)' `"`macval(chunk)'"'"' + local stafmt `stafmt' ``s'fmt' + } + } + local i 0 + CheckScalarOpt `macval(scalars)' + foreach addstat of local scalars { + local ++i + gettoken addstatname addstatlabel: addstat + local addstatlabel = substr(`"`macval(addstatlabel)'"',2,.) + if `: list posof `"`addstatname'"' in sta' continue + if `"`addstatname'"'=="N" & "`obs'"=="" & "`obslast'"!="" continue + if trim(`"`macval(addstatlabel)'"')=="" local addstatlabel `addstatname' + local addstatfmt: word `i' of `sfmt' + if `"`addstatfmt'"'=="" { + local addstatfmt: word `: list sizeof sfmt' of `sfmt' + } + local sta `sta' `addstatname' + local stalab `"`macval(stalab)' `"`macval(addstatlabel)'"'"' + local stafmt `stafmt' `addstatfmt' + } + if "`obs'"=="" & "`obslast'"!="" { + local sta `sta' N + local stalab `"`macval(stalab)' `"`macval(obslab)'"'"' + local stafmt `stafmt' %18.0g + } + if "`sta'"!="" { + local stats stats(`sta', fmt(`stafmt') labels(`macval(stalab)')) + } + } + +// table header + if `"`macval(mlabels)'"'=="" { + if "`mode0'"=="tex" local mspan " span prefix(\multicolumn{@span}{c}{) suffix(})" + if `"`depvars'"'!="" { + local mlabels `"mlabels(, depvar`mspan')"' + } + if `"`nomtitles'"'!="" local mlabels `"mlabels(none)"' + if "`mtitles'"!="" { + local mlabels `"mlabels(, titles`mspan')"' + } + if `"`macval(mtitles2)'"'!="" { + local mlabels `"mlabels(`macval(mtitles2)', titles`mspan')"' + } + } + if `"`macval(collabels)'"'=="" & `nocellsopt' & `matrixmode'==0 & "`plain'"=="" { + local collabels `"collabels(none)"' + } + if "`mode0'"=="tex" & "`numbers'"!="" { + local numbers "numbers(\multicolumn{@span}{c}{( )})" + } + +// pre-/posthead, pre-/postfoot, gaps and lines +// - complete note + if `"`macval(thenote)'"'!="" { + local thenote `"`"`macval(thenote)'"'"' + } + if `"`macval(note)'"'!="" { + local thenote `""@note""' + } + if `"`macval(addnotes)'"'!="" { + if index(`"`macval(addnotes)'"', `"""')==0 { + local addnotes `"`"`macval(addnotes)'"'"' + } + local thenote `"`macval(thenote)' `macval(addnotes)'"' + } + if "`legend'"!="" { + if ("`margin'"!="" | `"`margin2'"'!="") & /// + "`nomargin'"=="" & "`nodiscrete'"=="" { + local thenote `"`macval(thenote)' "@discrete""' + } + if "`star'"!="" | `nocellsopt'==0 { + local thenote `"`macval(thenote)' "@starlegend""' + } + } +// - mode specific settings + if "`star'"!="" { + if `"`macval(star2)'"'!="" { + FormatStarSym "`mode0'" `"`macval(star2)'"' + local `mode'_starlevels `"`macval(star2)'"' + } + if `"`macval(starlevels)'"'=="" { + local starlevels `"starlevels(`macval(`mode'_starlevels)'`macval(`mode'_starlevlab)')"' + } + } + foreach opt in begin delimiter end substitute interaction { + if `"`macval(`opt')'"'=="" & `"``mode'_`opt''"'!="" { + local `opt' `"`opt'(``mode'_`opt'')"' + } + } + if "`onecell'"!="" { + if `"`macval(incelldelimiter)'"'=="" { + local incelldelimiter `"incelldelimiter(``mode'_incelldel')"' + } + } + if "`noabbrev'`abbrev'"=="" { + local abbrev ``mode'_abbrev' + } + if `"`fragment'"'=="" { + if `"`fonttbl'"'!="" { + local rtf_fonttbl `"`fonttbl'"' + } + if "`page'"!="" { + local texclass "{article}" + if "`standalone'"!="" local texclass "`standalone2'{standalone}" + else local texclass "{article}" + if `"`page2'"'!="" { + local texpkgs `""\usepackage{`page2'}""' + } + local opening `"``mode'_open0'"' + } + if "`mode0'"=="tex" { + if (`"`macval(title)'"'!="" | "`float'"!="") & "`nofloat'"=="" { + local opening `"`macval(opening)' ``mode'_open'"' + } + else if "`star'"!="" { + local opening `"`macval(opening)' "{""' + } + if "`star'"!="" { + local opening `"`macval(opening)' "\def\sym#1{\ifmmode^{#1}\else\(^{#1}\)\fi}""' + } + if `"`macval(title)'"'!="" & "`longtable'"=="" { + local opening `"`macval(opening)' `"``mode'_caption'"'"' + } + } + else { + local opening `"`macval(opening)' ``mode'_open'"' + if `"`macval(title)'"'!="" { + local opening `"`macval(opening)' ``mode'_caption'"' + } + } + if "`mode0'"=="tex" { + if `"`labcol2'"'!="" local lstubtex "lc" + else local lstubtex "l" + if `"`width'"'!="" local extracolsep "@{\hskip\tabcolsep\extracolsep\fill}" + if `matrixmode' { + if `"`macval(alignment)'"'!="" { + local opening `"`macval(opening)' `"``mode'_open2'{`extracolsep'`lstubtex'`macval(alignment)'}"'"' + } + else { + MakeTeXColspecMat, `anything' + local opening `"`macval(opening)' `"``mode'_open2'{`extracolsep'`lstubtex'`value'}"'"' + } + } + else { + if `"`macval(alignment)'"'!="" { + local opening `"`macval(opening)' `"``mode'_open2'{`extracolsep'`lstubtex'*{@E}{`macval(alignment)'}}"'"' + } + else { + if `nocellsopt' { + MakeTeXColspec "`wide'" "`not'" "`star'" "`stardetach'" "`staraux'" + } + else { + MakeTeXColspecAlt, `cells' + } + local opening `"`macval(opening)' `"``mode'_open2'{`extracolsep'`lstubtex'*{@E}{`value'}}"'"' + } + } + if "`longtable'"!="" { + if `"`macval(title)'"'!="" { + local opening `"`macval(opening)' `"``mode'_caption'\\\"'"' + } + } + } + else { + local opening `"`macval(opening)' ``mode'_open2'"' + } + if "`mode0'"=="html" { + local brr + foreach chunk of local thenote { + local closing `"`macval(closing)' `"`brr'`macval(chunk)'"'"' + local brr "
      " + } + if `"`macval(closing)'"'!="" { + local closing `""" `macval(closing)' """' + } + } + else if "`mode0'"=="tex" { + foreach chunk of local thenote { + local closing `"`macval(closing)' `"\multicolumn{@span}{l}{\footnotesize `macval(chunk)'}\\\"'"' + } + } + else if "`mode0'"=="csv" { + foreach chunk of local thenote { + local closing `"`macval(closing)' `"`csvlhs'`macval(chunk)'""'"' + } + } + else if "`mode0'"=="rtf" { + foreach chunk of local thenote { + local closing `"`macval(closing)' `"{\pard\ql\fs20 `macval(chunk)'\par}"'"' + } + } + else if "`mode0'"=="mmd" { + local n_chunks: list sizeof thenote + if `n_chunks' { + local closing `"`macval(closing)' """' + local i 0 + foreach chunk of local thenote { + local ++i + if `i'<`n_chunks' { + local chunk `"`macval(chunk)'
      "' + } + local closing `"`macval(closing)' `"`macval(chunk)'"'"' + } + } + } + else { + local closing `"`macval(thenote)'"' + } + local closing `"`macval(closing)' ``mode'_close2'"' + if "`mode0'"=="tex" { + if (`"`macval(title)'"'!="" | "`float'"!="") & "`nofloat'"=="" { + local closing `"`macval(closing)' ``mode'_close'"' + } + else if "`star'"!="" { + local closing `"`macval(closing)' "}""' + } + } + else { + local closing `"`macval(closing)' ``mode'_close'"' + } + if "`page'`standalone'"!="" { + local closing `"`macval(closing)' ``mode'_close0'"' + } + local toprule `"``mode'_toprule'"' + local bottomrule `"``mode'_bottomrule'"' + local topgap `"``mode'_topgap'"' + local bottomgap `"``mode'_bottomgap'"' + } + local midrule `"``mode'_midrule'"' + local midgap `"``mode'_midgap'"' + local eqrule `"``mode'_eqrule'"' +// - compose prehead() + if `"`macval(prehead)'"'=="" { + if `"`lines'"'!="" { + local opening `"`macval(opening)' `macval(toprule)'"' + } + else if `"`gaps'"'!="" { + local opening `"`macval(opening)' `macval(topgap)'"' + } + SaveRetok `macval(opening)' + local opening `"`macval(value)'"' + if `"`macval(opening)'"'!="" { + local prehead `"prehead(`macval(opening)')"' + } + } +// - compose posthead() + if `"`macval(posthead)'"'=="" { + if `"`lines'"'!="" { + local posthead `"posthead(`macval(midrule)')"' + } + else if `"`gaps'"'!="" { + local posthead `"posthead(`macval(midgap)')"' + } + } +// - compose prefoot() + if `"`macval(prefoot)'"'=="" & `"`macval(stats)'"'!="" { + if `"`lines'"'!="" { + local prefoot `"prefoot(`macval(midrule)')"' + } + else if `"`gaps'"'!="" { + local prefoot `"prefoot(`macval(midgap)')"' + } + if `"`cells'"'=="cells(none)" local prefoot + } +// - compose postfoot() + if `"`macval(postfoot)'"'=="" { + if `"`lines'"'!="" { + local closing `"`macval(bottomrule)' `macval(closing)'"' + } + else if `"`gaps'"'!="" { + local closing `"`macval(bottomgap)' `macval(closing)'"' + } + SaveRetok `macval(closing)' + local closing `"`macval(value)'"' + if `"`macval(closing)'"'!="" { + local postfoot postfoot(`macval(closing)') + } + } +// - varlabels + if `"`macval(varlabels)'"'=="" { + if `"`gaps'"'!="" { + local varl `", end("" `macval(midgap)') nolast"' + } + if "`label'"!="" { + local varl `"_cons Constant`macval(varl)'"' + } + if `"`macval(coeflabels)'"'!="" { + local varl `"`macval(coeflabels)' `macval(varl)'"' + } + if trim(`"`macval(varl)'"')!="" { + local varlabels varlabels(`macval(varl)') + } + } +// - equation labels + if ("`eqlines'"!="" | `"`gaps'"'!="") & "`unstack'"=="" { + if trim(`"`eqlabels'"')!="none" { + ParseEqLabels `macval(eqlabels)' + if `eqlabelsok' { + _parse comma eqllhs eqlrhs : eqlabels + if `"`eqlrhs'"'=="" local eqlabelscomma ", " + else local eqlabelscomma " " + if "`eqlines'"!=""{ + local eqlabels `"`macval(eqlabels)'`eqlabelscomma'`macval(eqrule)' nofirst"' + } + else if `"`gaps'"'!="" { + local eqlabels `"`macval(eqlabels)'`eqlabelscomma'begin(`macval(midgap)' "") nofirst"' + } + } + } + } + if `"`macval(eqlabels)'"'!="" { + local eqlabels `"eqlabels(`macval(eqlabels)')"' + } + +// noconstant option + if `"`drop'"'=="" { + if "`noconstant'"!="" { + local drop drop(_cons, relax) + } + } + +// compute beta coefficients (run estadd to add e(beta)) + if "`beta'"!="" { + local estnames `"`anything'"' + if `"`estnames'"'=="" { + capt est_expand $eststo + if !_rc { + local estnames `"$eststo"' + } + } + version `caller': estadd beta, replace: `estnames' + } + +// use tempfile for new table + if `"`appendfile'"'!="" { + local using `"using `"`appendfile'"'"' + } + +// execute estout + if `"`varwidth'"'!="" local varwidth `"varwidth(`varwidth')"' + if `"`modelwidth'"'!="" local modelwidth `"modelwidth(`modelwidth')"' + if `"`style'"'=="" { + if "`mode'"=="mmd" local style "style(mmd)" + else local style "style(esttab)" + } + CleanEstoutCmd `anything' `using' , /// + `macval(cells)' `drop' `nomargin' `margin' `margin2' `noeform' `eform' /// + `nodiscrete' `macval(stats)' `stardetach' `macval(starlevels)' /// + `varwidth' `modelwidth' `noabbrev' `abbrev' `unstack' `macval(begin)' /// + `macval(delimiter)' `macval(end)' `macval(incelldelimiter)' `smcltags' /// + `macval(title)' `macval(prehead)' `macval(posthead)' `macval(prefoot)' /// + `macval(postfoot)' `label' `macval(varlabels)' `macval(mlabels)' `nonumbers' /// + `numbers' `macval(collabels)' `macval(eqlabels)' `macval(mgroups)' /// + `macval(note)' `macval(labcol2)' `macval(substitute)' `macval(interaction)' /// + `append' `notype'`type' `outfilenoteoff2' level(`level') `style' /// + `macval(options)' + if "`noisily'"!="" { + gettoken chunk rest: cmd, parse(",") + di as txt _asis `"`chunk'"' _c + gettoken chunk rest: rest, bind + while `"`macval(chunk)'"'!="" { + di as txt _asis `" `macval(chunk)'"' + gettoken chunk rest: rest, bind + } + } + `macval(cmd)' + +// insert new table into existing document (tex, html, rtf) + if `"`appendfile'"'!="" { + local enddoctex "\end{document}" + local enddochtml "" + local enddocrtf "}" + local enddoc "`enddoc`mode0''" + tempname fh + file open `fh' using `using0', read write + file seek `fh' query + local loc = r(loc) + file read `fh' line + while r(eof)==0 { + if `"`line'"'=="`enddoc'" { + if "`mode'"=="rtf" { + file seek `fh' query + local loc0 = r(loc) + file read `fh' line + if r(eof)==0 { + local loc = `loc0' + continue + } + } + continue, break + } + file seek `fh' query + local loc = r(loc) + file read `fh' line + } + file seek `fh' `loc' + tempname new + file open `new' `using', read + file read `new' line + while r(eof)==0 { + file write `fh' `"`macval(line)'"' _n + file read `new' line + } + file close `fh' + file close `new' + if "`outfilenoteoff'"=="" { + di as txt `"(output written to {browse `using0'})"' + } + } +end + +program _more_syntax +// using subroutine (rather than second syntax call) to preserve 'using' + local theoptions /// + NODEPvars DEPvars /// + NOPArentheses PArentheses /// + BRackets /// + NONOTEs NOTEs /// without s in helpfile + LONGtable /// + NOFLOAT float /// + ONEcell /// + NOEQLInes /// + NOOUTFILENOTEOFF outfilenoteoff + syntax [, `theoptions' * ] + foreach opt of local theoptions { + local opt = lower("`opt'") + c_local `opt' "``opt''" + } + c_local options `"`macval(options)'"' +end + +program _estout_options + syntax [, /// + Cells(passthru) /// + Drop(passthru) /// + /// Keep(string asis) /// + /// Order(string asis) /// + /// REName(passthru) /// + /// Indicate(string asis) /// + /// TRansform(string asis) /// + /// EQuations(passthru) /// + NOEFORM eform ///EFORM2(string) /// + NOMargin Margin Margin2(passthru) /// + NODIscrete /// DIscrete(string asis) /// + /// MEQs(string) /// + /// NODROPPED dropped DROPPED2(string) /// + level(numlist max=1 int >=10 <=99) /// + Stats(passthru) /// + STARLevels(passthru) /// + /// NOSTARDetach /// + STARDetach /// + /// STARKeep(string asis) /// + /// STARDrop(string asis) /// + VARwidth(str) /// + MODELwidth(str) /// + NOABbrev ABbrev /// + /// NOUNStack + UNStack /// + BEGin(passthru) /// + DELimiter(passthru) /// + INCELLdelimiter(passthru) /// + end(passthru) /// + /// DMarker(string) /// + /// MSign(string) /// + /// NOLZ lz /// + SUBstitute(passthru) /// + INTERACTion(passthru) /// + TItle(passthru) /// + NOLEgend LEgend /// + PREHead(passthru) /// + POSTHead(passthru) /// + PREFoot(passthru) /// + POSTFoot(passthru) /// + /// HLinechar(string) /// + /// NOLabel + Label /// + VARLabels(passthru) /// + /// REFcat(string asis) /// + MLabels(passthru) /// + NONUMbers NUMbers ///NUMbers2(string asis) /// + COLLabels(passthru) /// + EQLabels(string asis) /// + MGRoups(passthru) /// + LABCOL2(passthru) /// + /// NOReplace Replace /// + /// NOAppend + Append /// + NOTYpe TYpe /// + /// NOSHOWTABS showtabs /// + /// TOPfile(string) /// + /// BOTtomfile(string) /// + STYle(passthru) /// + /// DEFaults(string) /// + /// NOASIS asis /// + /// NOWRAP wrap /// + /// NOSMCLTAGS smcltags /// + /// NOSMCLRules SMCLRules /// + /// NOSMCLMIDRules SMCLMIDRules /// + /// NOSMCLEQRules SMCLEQRules /// + note(passthru) /// + * ] + foreach opt in /// + cells drop noeform eform nomargin margin margin2 nodiscrete /// + level stats starlevels stardetach varwidth modelwidth unstack /// + noabbrev abbrev begin delimiter incelldelimiter end substitute /// + interaction title nolegend legend prehead posthead prefoot postfoot /// + label varlabels mlabels labcol2 nonumbers numbers collabels eqlabels /// + mgroups append notype type style note options { + c_local `opt' `"`macval(`opt')'"' + } +end + +program MatrixMode + capt syntax [, Matrix(str asis) e(str asis) r(str asis) ] + if _rc | `"`matrix'`e'`r'"'=="" { + c_local matrixmode 0 + exit + } + c_local matrixmode 1 +end + +prog NotBothAllowed + args opt1 opt2 + if `"`opt1'"'!="" { + if `"`opt2'"'!="" { + di as err `"options `opt1' and `opt2' not both allowed"' + exit 198 + } + } +end + +prog SwitchOnIfEmpty + args opt1 opt2 + if `"`opt2'"'=="" { + c_local `opt1' `opt1' + } +end + +prog _getfilesuffix, rclass // based on official _getfilename.ado + version 8 + gettoken filename rest : 0 + if `"`rest'"' != "" { + exit 198 + } + local hassuffix 0 + gettoken word rest : filename, parse(".") + while `"`rest'"' != "" { + local hassuffix 1 + gettoken word rest : rest, parse(".") + } + if `"`word'"'=="." { + di as err `"incomplete filename; ends in ."' + exit 198 + } + if index(`"`word'"',"/") | index(`"`word'"',"\") local hassuffix 0 + if `hassuffix' return local suffix `".`word'"' + else return local suffix "" +end + +prog FormatStarSym + args mode list + if inlist("`mode'","rtf","html","tex") { + if "`mode'"=="rtf" { + local prefix "{\super " + local suffix "}" + } + else if "`mode'"=="html" { + local prefix "" + local suffix "" + } + else if "`mode'"=="tex" { + local prefix "\sym{" + local suffix "}" + } + local odd 1 + foreach l of local list { + if `odd' { + local l `"`"`prefix'`macval(l)'`suffix'"'"' + local odd 0 + } + else local odd 1 + local newlist `"`macval(newlist)'`space'`macval(l)'"' + local space " " + } + c_local star2 `"`macval(newlist)'"' + } + //else do noting +end + +prog CheckScalarOpt + capt syntax [anything] + if _rc error 198 +end + +program MakeTeXColspecMat + capt syntax [, Matrix(str asis) e(str asis) r(str asis) ] + ParseMatrixOpt `matrix'`e'`r' + if `"`e'"'!="" local name "e(`name')" + else if `"`r'"'!="" local name "r(`name')" + confirm matrix `name' + tempname bc + mat `bc' = `name' + if "`transpose'"=="" local cols = colsof(`bc') + else local cols = rowsof(`bc') + c_local value "*{`cols'}{c}" +end +program ParseMatrixOpt + syntax name [, Fmt(str asis) Transpose ] + c_local name `"`namelist'"' + c_local fmt `"`fmt'"' + c_local transpose `"`transpose'"' +end + +prog MakeTeXColspec + args wide not star detach aux + if "`star'"!="" & "`detach'"!="" & "`aux'"=="" local value "r@{}l" + else local value "c" + if "`wide'"!="" & "`not'"=="" { + if "`star'"!="" & "`detach'"!="" & "`aux'"!="" local value "`value'r@{}l" + else local value "`value'c" + } + c_local value "`value'" +end + +prog MakeTeXColspecAlt + syntax, cells(string asis) + local count 1 + while `count' { + local cells: subinstr local cells ") (" ")_(", all // preserve space in ") (" + local cells: subinstr local cells "] (" "]_(", all // preserve space in ") [" + local cells: subinstr local cells " (" "(", all count(local count) + } + local cells: subinstr local cells ")_(" ") (", all // restore space in ") (" + local cells: subinstr local cells "]_(" "] (", all // restore space in ") [" + local count 1 + while `count' { + local cells: subinstr local cells " [" "[", all count(local count) + } + local count 1 + while `count' { + local cells: subinstr local cells " &" "&", all count(local count) + } + local count 1 + while `count' { + local cells: subinstr local cells "& " "&", all count(local count) + } + local count 1 + while `"`macval(cells)'"'!="" { + gettoken row cells : cells, match(par) + local size 0 + gettoken chunk row : row, bind + while `"`macval(chunk)'"'!="" { + local ++size + gettoken chunk row : row, bind + } + local count = max(`count',`size') + } + c_local value: di _dup(`count') "c" +end + +prog SaveRetok + gettoken chunk 0: 0, q + local value `"`macval(chunk)'"' + gettoken chunk 0: 0, q + while `"`macval(chunk)'"'!="" { + local value `"`macval(value)' `macval(chunk)'"' + gettoken chunk 0: 0, q + } + c_local value `"`macval(value)'"' +end + +prog CleanEstoutCmd + syntax [anything] [using] [ , * ] + local cmd estout + if `"`macval(anything)'"'!="" { + local cmd `"`macval(cmd)' `macval(anything)'"' + } + if `"`macval(using)'"'!="" { + local cmd `"`macval(cmd)' `macval(using)'"' + } + if `"`macval(options)'"'!="" { + local cmd `"`macval(cmd)', `macval(options)'"' + } + c_local cmd `"`macval(cmd)'"' +end + +prog ParseEqLabels + syntax [anything] [, Begin(passthru) NOReplace Replace NOFirst First * ] + c_local eqlabelsok = `"`begin'`noreplace'`replace'`nofirst'`first'"'=="" +end diff --git a/ado/e/esttab.hlp b/ado/e/esttab.hlp new file mode 100644 index 0000000..26e4748 --- /dev/null +++ b/ado/e/esttab.hlp @@ -0,0 +1,963 @@ +{smcl} +{* 10jun2022}{...} +{hi:help esttab}{right:also see: {helpb estout}, {helpb eststo}, {helpb estadd}, {helpb estpost}} +{right: {browse "http://repec.sowi.unibe.ch/stata/estout/"}} +{hline} + +{title:Title} + +{p 4 4 2}{hi:esttab} {hline 2} Display formatted regression table + + +{title:Table of contents} + + {help esttab##syn:Syntax} + {help esttab##des:Description} + {help esttab##opt:Options} + {help esttab##exa:Examples} + {help esttab##aut:Backmatter} + +{marker syn} +{title:Syntax} + +{p 8 15 2} +{cmd:esttab} [ {it:namelist} ] [ {cmd:using} {it:filename} ] [ {cmd:,} +{it:options} ] + + +{p 4 4 2}where {it:namelist} is a name, a list of names, or {cmd:_all}. The +{cmd:*} and {cmd:?} wildcards are allowed in {it:namelist}. A name may also be {cmd:.}, +meaning the current (active) estimates. + + + {it:options}{col 26}description + {hline 70} + {help esttab##main:Main} + {cmd:b(}{it:{help esttab##fmt:fmt}}{cmd:)}{col 26}{...} +specify format for point estimates + {cmd:beta}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}]{col 26}{...} +display beta coefficients instead of point est's + {cmd:main(}{it:name} [{it:{help esttab##fmt:fmt}}]{cmd:)}{col 26}{...} +display contents of {cmd:e(}{it:name}{cmd:)} instead of point e's + {cmd:t(}{it:{help esttab##fmt:fmt}}{cmd:)}{col 26}{...} +specify format for t-statistics + {cmd:abs}{col 26}{...} +use absolute value of t-statistics + {cmd:not}{col 26}{...} +suppress t-statistics + {cmd:z}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}]{col 26}{...} +display z-statistics (affects label only) + {cmd:se}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}]{col 26}{...} +display standard errors instead of t-statistics + {cmd:p}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}]{col 26}{...} +display p-values instead of t-statistics + {cmd:ci}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}]{col 26}{...} +display confidence intervals instead of t-stat's + {cmd:aux(}{it:name} [{it:{help esttab##fmt:fmt}}]{cmd:)}{col 26}{...} +display contents of {cmd:e(}{it:name}{cmd:)} instead of t-stat's + [{ul:{cmd:no}}]{cmdab:con:stant}{col 26}{...} +do not/do report the intercept + + {help esttab##stars:Significance stars} + [{cmd:no}]{cmd:star}[{cmd:(}{it:list}{cmd:)}]{col 26}{...} +do not/do report significance stars + {cmd:staraux}{col 26}{...} +attach stars to t-stat's instead of point est's + + {help esttab##stat:Summary statistics} + {cmd:r2}|{cmd:ar2}|{cmd:pr2}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}]{col 26}{...} +display (adjusted, pseudo) R-squared + {cmd:aic}|{cmd:bic}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}]{col 26}{...} +display Akaike's or Schwarz's information crit. + {cmdab:sca:lars:(}{it:list}{cmd:)}{col 26}{...} +display any other scalars contained in {cmd:e()} + {cmd:sfmt(}{it:{help esttab##fmt:fmt}} [{it:...}]{cmd:)}{col 26}{...} +set format(s) for {cmd:scalars()} + {cmd:noobs}{col 26}{...} +do not display the number of observations + {cmd:obslast}{col 26}{...} +place the number of observations last + + {help esttab##layout:Layout} + {cmd:wide}{col 26}{...} +place point est's and t-stat's beside one another + {cmdab:one:cell}{col 26}{...} +combine point est's and t-stat's in a single cell + [{ul:{cmd:no}}]{cmdab:pa:rentheses}{col 26}{...} +do not/do print parentheses around t-statistics + {cmdab:br:ackets}{col 26}{...} +use brackets instead of parentheses + [{ul:{cmd:no}}]{cmdab:gap:s}{col 26}{...} +suppress/add vertical spacing + [{ul:{cmd:no}}]{cmdab:li:nes}{col 26}{...} +suppress/add horizontal lines + {cmdab:noeqli:nes}{col 26}{...} +suppress lines between equations + {cmd:compress}{col 26}{...} +reduce horizontal spacing + {cmd:plain}{col 26}{...} +produce a minimally formatted table + + {help esttab##label:Labeling} + {cmdab:l:abel}{col 26}{...} +make use of variable labels + {cmdab:interact:ion:(}{it:str}{cmd:)}{col 26}{...} +specify interaction operator + {cmdab:ti:tle:(}{it:string}{cmd:)}{col 26}{...} +specify a title for the table + {cmdab:mti:tles}[{cmd:(}{it:list}{cmd:)}]{col 26}{...} +specify model titles to appear in table header + {cmdab:nomti:tles}{col 26}{...} +disable model titles + [{ul:{cmd:no}}]{cmdab:dep:vars}{col 26}{...} +do not/do use dependent variables as model titles + [{ul:{cmd:no}}]{cmdab:num:bers}{col 26}{...} +do not/do print model numbers in table header + {cmdab:coef:labels:(}{it:list}{cmd:)}{col 26}{...} +specify labels for coefficients + [{ul:{cmd:no}}]{cmdab:note:s}{col 26}{...} +suppress/add notes in the table footer + {cmdab:addn:otes:(}{it:list}{cmd:)}{col 26}{...} +add lines at the end of the table + + {help esttab##format:Document format} + {cmd:smcl} | {cmdab:fix:ed} | {cmd:tab} | {cmd:csv} | {cmdab:sc:sv} | {cmd:rtf} | {cmdab:htm:l} | {cmd:tex} | {cmdab:bookt:abs} | {cmdab:md} + {col 26}{...} +set the document format ({cmd:smcl} is the default) + {cmdab:f:ragment}{col 26}{...} +suppress table opening and closing (LaTeX, HTML) + [{cmd:no}]{cmd:float}{col 26}{...} +whether to use a float environment or not (LaTeX) + {cmd:page}[{cmd:(}{it:packages}{cmd:)}]{col 26}{...} +add page opening and closing (LaTeX, HTML) + {cmdab:stand:alone}[{cmd:(}{it:opts}{cmd:)}]{col 26}{...} +use class {cmd:standalone} rather than {cmd:article} (LaTeX) + {cmdab:align:ment(}{it:string}{cmd:)}{col 26}{...} +set alignment within columns (LaTeX, HTML, RTF) + {cmdab:width(}{it:string}{cmd:)}{col 26}{...} +set width of table (LaTeX, HTML) + {cmdab:long:table}{col 26}{...} +multi-page table (LaTeX) + {cmd:fonttbl(}{it:string}{cmd:)}{col 26}{...} +set custom font table (RTF) + {cmd:nortfencode}{col 26}{...} +do not escape non-ASCII characters (RTF) + + {help esttab##output:Output} + {cmdab:r:eplace}{col 26}{...} +overwrite an existing file + {cmdab:a:ppend}{col 26}{...} +append the output to an existing file + {cmdab:ty:pe}{col 26}{...} +force printing the table in the results window + {cmdab:n:oisily}{col 26}{...} +display the executed {helpb estout} command + + {help esttab##advanced:Advanced} + {cmdab:d:rop:(}{it:list}{cmd:)}{col 26}{...} +drop individual coefficients + {cmdab:noomit:ted}{col 26}{...} +drop omitted coefficients + {cmdab:nobase:levels}{col 26}{...} +drop base levels of factor variables + {cmdab:k:eep:(}{it:list}{cmd:)}{col 26}{...} +keep individual coefficients + {cmdab:o:rder:(}{it:list}{cmd:)}{col 26}{...} +change order of coefficients + {cmdab:eq:uations:(}{it:list}{cmd:)}{col 26}{...} +match the models' equations + {cmd:eform}{col 26}{...} +report exponentiated coefficients + {cmdab:uns:tack}{col 26}{...} +place multiple equations in separate columns + {it:estout_options}{col 26}{...} +any other {helpb estout} options + {hline 70} + +{marker des} +{title:Description} + +{p 4 4 2} +{cmd:esttab} is a wrapper for {helpb estout}. It produces a +pretty-looking publication-style regression table from stored +estimates without much typing. The compiled table is displayed in the +Stata results window or, optionally, written to a text file specified +by {cmd:using} {it:filename}. If {it:filename} is specified without +suffix, a default suffix is added depending on the specified document +format (".smcl" for {cmd:smcl}, ".txt" for {cmd:fixed} and {cmd:tab}, ".csv" for {cmd:csv} +and {cmd:scsv}, ".rtf" for {cmd:rft}, ".html" for {cmd:html}, +".tex" for {cmd:tex} and {cmd:booktabs}, ".md" for {cmd:md}). + +{p 4 4 2} +{it:namelist} provides the names of the stored estimation sets to be +tabulated. You may use the {cmd:*} and {cmd:?} wildcards in +{it:namelist}. If {it:namelist} is omitted, {cmd:esttab} tabulates the +estimation sets stored by {cmd:eststo} (see help {helpb eststo}) +or, if no such estimates are present, the currently active +estimates (i.e. the model fit last). + +{p 4 4 2} +See help {helpb estimates} for information about storing estimation +results. An alternative to the {cmd:estimates store} command is +provided by {helpb eststo}. + +{p 4 4 2} +{cmd:esttab} can also be used to tabulate a Stata matrix applying syntax +{bind:{cmd:esttab} {cmdab:m:atrix:(}{it:name}{cmd:)}}, where {it:name} +is the name of the matrix. Furthermore, an {cmd:e()}-matrix or {cmd:r()}-matrix +can be tabulated specifying {cmd:esttab e(}{it:name}{cmd:)} or +{cmd:esttab r(}{it:name}{cmd:)}. Most options under the headings +'Main', 'Significance stars', and 'Summary statistics' are irrelevant +in this case. See help {helpb estout} for further details on tabulating matrices. + +{marker opt} +{title:Options} +{marker main} +{dlgtab:Main} + +{p 4 8 2} +{cmd:b(}{it:{help esttab##fmt:fmt}}{cmd:)} sets the numerical display format +for the point estimates. The default format is {cmd:a3}. (See +{help esttab##fmt:Numerical formats} below for details on available +formats.) + +{p 4 8 2} +{cmd:beta}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] requests that +standardized beta coefficients be displayed in place of the raw point +estimates and, optionally, sets the display format (the default is to +print three decimal places). Note that {cmd:beta} causes the +intercept to be dropped from the table (unless {cmd:constant} is +specified).{p_end} +{marker main} +{p 4 8 2} +{cmd:main(}{it:name} [{it:{help esttab##fmt:fmt}}]{cmd:)} requests that +the statistics stored in {cmd:e(}{it:name}{cmd:)} be displayed in +place of the point estimates and, optionally, sets the display format +(the default is to use the display format for point estimates). For +example, {cmd:e(}{it:name}{cmd:)} may contain statistics added by +{cmd:estadd} (see help {helpb estadd}). + +{p 4 8 2} +{cmd:t(}{it:{help esttab##fmt:fmt}}{cmd:)} sets the display format for +t-statistics. The default is to display two decimal places. + +{p 4 8 2} +{cmd:abs} causes absolute values of t-statistics to be reported. + +{p 4 8 2} +{cmd:not} suppresses the printing of t-statistics. + +{p 4 8 2} +{cmd:z}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] requests that +z-statistics be displayed. z-statistics are the same as t-statistics. Hence, +specifying {cmd:z} does not change the table contents, it only changes the +label. + +{p 4 8 2} +{cmd:se}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] requests that +standard errors be displayed in place of t-statistics and, +optionally, sets the display format (the default is to use the +display format for point estimates). + +{p 4 8 2} +{cmd:p}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] requests that +p-values be displayed in place of t-statistics and, optionally, sets +the display format (the default is to print three decimal places) + +{p 4 8 2} +{cmd:ci}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] requests that +confidence intervals be displayed in place of t-statistics and, +optionally, sets the display format (the default is to use the +display format for point estimates). {cmd:level(}{it:#}{cmd:)} +assigns the confidence level, in percent. The default is +{cmd:level(95)} or as set by {helpb set level}.{p_end} +{marker aux} +{p 4 8 2} +{cmd:aux(}{it:name} [{it:{help esttab##fmt:fmt}}]{cmd:)} requests that +the statistics stored in {cmd:e(}{it:name}{cmd:)} be displayed in +place of t-statistics and, optionally, sets the display format (the +default is to use the display format for point estimates). For +example, {cmd:e(}{it:name}{cmd:)} may contain statistics added by +{cmd:estadd} (see help {helpb estadd}, if installed). + +{p 4 8 2} +{cmd:noconstant} causes the intercept be dropped from the table. +Specify {cmd:constant} to include the constant in situations where it +is dropped by default. + +{marker stars} +{dlgtab:Significance stars} + +{p 4 8 2} +{cmd:star}[{cmd:(}{it:symbol} {it:level} [{it:...}]{cmd:)}] causes +stars denoting the significance of the coefficients to be printed +next to the point estimates. This is the default. Type {cmd:nostar} +to suppress the stars. The default symbols and thresholds are: +{cmd:*} for p<.05, {cmd:**} for p<.01, and {cmd:***} for p<.001. +Alternatively, for example, type {bind:{cmd:star(+ 0.10 * 0.05)}} to +set the following thresholds: {cmd:+} for p<.10 and {cmd:*} for +p<.05. Note that the thresholds must lie in the (0,1] interval and +must be specified in descending order. + +{p 4 8 2} +{cmd:staraux} causes the significance stars be printed next to the +t-statistics (or standard errors, etc.) instead of the point estimates. + +{marker stat} +{dlgtab:Summary statistics} + +{p 4 8 2} +{cmd:r2}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}], +{cmd:ar2}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}], and +{cmd:pr2}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] +include the R-squared, the adjusted R-squared, and the +pseudo-R-squared in the table footer and, optionally, set the +corresponding display formats (the default is to display three +decimal places). + +{p 4 8 2} +{cmd:aic}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] and +{cmd:bic}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] +include Akaike's and Schwarz's information criterion in the table +footer and, optionally, set the corresponding display formats (the +default is to use the display format for point estimates).{p_end} +{marker scalars} +{p 4 8 2} +{cmd:scalars(}{it:list}{cmd:)} may be used to add other +{cmd:e()}-scalars to the table footer (type {cmd:ereturn list} to +display a list of available {cmd:e()}-scalars after fitting a model; +see help {helpb ereturn}). For example, {cmd:scalars(df_m)} would +report the model degrees of freedom for each model. {it:list} may be +a simple list of names of {cmd:e()}-scalars, e.g. + + {com}. esttab, scalars(ll_0 ll chi2){txt} + +{p 8 8 2} +or, alternatively, a list of quoted name-label pairs, e.g. + + {com}. esttab, scalars({bind:"ll Log lik."} {bind:"chi2 Chi-squared"}){txt} + +{p 4 8 2} +{cmd:sfmt(}{it:{help esttab##fmt:fmt}} [{it:...}]{cmd:)} sets the +display format(s) for the statistics specified in {cmd:scalars()} +(the default is to use the display format for point estimates). If +{cmd:sfmt()} contains less elements than {cmd:scalars()}, the last +specified format is used for the remaining scalars. That is, only one +format needs to be specified if the same format be used for all +scalars. + +{p 4 8 2} +{cmd:noobs} suppresses displaying information on the number of +observations. The default is to report the number of observations for +each model in the table footer. + +{p 4 8 2} +{cmd:obslast} displays the number of observations in the last row of +the table footer. The default is to use the first row. + +{marker layout} +{dlgtab:Layout} +{marker wide} +{p 4 8 2} +{cmd:wide} causes point estimates and t-statistics (or standard errors, +etc.) to be printed beside one another instead of beneath one another. +{p_end} +{marker onecell} +{p 4 8 2} +{cmd:onecell} causes point estimates and t-statistics (or standard errors, +etc.) to be combined in a single table cell. This option is useful primarily +in {cmd:rtf} or {cmd:html} mode. In these modes a line break is +inserted between the two statistics. The benefit from using {cmd:onecell} +in {cmd:rtf} or {cmd:html} mode is that long coefficients labels do not +derange the table layout. The default for other modes is to insert +a blank between the statistics. Use {cmd:estout}'s +{helpb estout##incelldel:incelldelimiter()} option to change this. + +{p 4 8 2} +{cmd:parentheses} encloses t-statistics (or standard errors, etc.) in +parentheses. This is the default. Specify {cmd:noparentheses} to +suppress the parentheses. + +{p 4 8 2} +{cmd:brackets} uses square brackets, [], instead of parentheses. Note +that brackets are the default for confidence intervals. + +{p 4 8 2} +{cmd:gaps} adds empty rows (or, more generally, additional vertical +space) between coefficients to increase readability (empty rows are +also inserted between the table's header, body, and footer, unless +{cmd:lines} is activated). This is the default unless {cmd:wide} or +{cmd:not} is specified. Type {cmd:nogaps} to suppress the extra +spacing. + +{p 4 8 2} +{cmd:lines} adds horizontal lines to the table separating the table's +header, body, and footer and, in the case of multiple +equation models, the equations. This is the default. Specify {cmd:nolines} +to suppress the lines. Lines are always suppressed in the {cmd:tab} +and {cmd:csv} modes. + +{p 4 8 2} +{cmd:noeqlines} suppresses the horizontal lines between equations +in the case of multiple equation models.{p_end} +{marker compress} +{p 4 8 2} +{cmd:compress} reduces the amount of horizontal spacing (so that more +models fit on screen without line breaking). The option has no effect +in the {cmd:tab} and {cmd:csv} modes. Furthermore, note that in the +TeX and HTML modes the {cmd:compress} option only changes the +arrangement the table's code, but not the look of the compiled +end-product. In {cmd:rtf}, however, {cmd:compress} changes the look +of the formatted table.{p_end} +{marker plain} +{p 4 8 2} +{cmd:plain} produces a minimally formatted table. It is a shorthand +to specifying {cmd:nostar}, {cmd:nodepvars}, {cmd:nonumbers}, +{cmd:noparentheses}, {cmd:nogaps}, {cmd:nolines} and {cmd:nonotes} +and setting all formats to {cmd:%9.0g}. Note that the disabled +options can be switched on again. For example, type + + {com}. esttab, plain star{txt} + +{p 8 8 2} +to produce a plain table including significance stars. + +{marker label} +{dlgtab:Labeling} + +{p 4 8 2} +{cmd:label} specifies that variable labels be used instead of +variable names (and estimation set titles be used instead of +estimation set names). Furthermore, {cmd:label} prints "Constant" +instead of "_cons". + +{p 4 8 2} +{cmd:interaction(}{it:string}{cmd:)} specifies the string to be used +as delimiter for interaction terms (only relevant in Stata 11 or newer). The +default is {cmd:interaction(" # ")}. For {cmd:tex} and {cmd:booktabs} the +default is {cmd:interaction(" $\times$ ")}. +{p_end} +{marker title} +{p 4 8 2} +{cmd:title(}{it:string}{cmd:)} may be used to provide a title for the +table. If specified, {it:string} is printed at the top of the table. +Note that specifying a title causes the table to be set up as a +floating object in LaTeX mode (unless the {cmd:nofloat} option +is specified). You may want to set a label for +referencing in this case. For example, if you type +{cmd:title(...\label{tab1})}, then "\ref{tab1}" could be used in the +LaTeX document to point to the table. + +{p 4 8 2} +{cmd:mtitles}, without argument, specifies that for each model the title +(or, if empty, the name) of the stored estimation set be printed as the model's +title in the table header. If {cmd:mtitles} is omitted, the default is to +use name or label of the dependent variable as the model's title (see the +{cmd:depvar} option). Alternatively, use {cmd:mtitles(}{it:list}{cmd:)} +specifies a list of model titles. Enclose the titles +in double quotes if they contain spaces, +e.g. {bind:{cmd:mtitles("Model 1" "Model 2")}}. + +{p 4 8 2} +{cmd:nomtitles} suppresses printing of model titles. + +{p 4 8 2} +{cmd:depvars} prints the name (or label) of the (first) dependent +variable of a model as the model's title in the table header. This is +the default. Specify {cmd:nodepvars} to use the names of +the stored estimation sets as titles. + +{p 4 8 2} +{cmd:numbers} includes a row containing consecutive model numbers in +the table header. This is the default. Specify {cmd:nonumbers} to +suppress printing the model numbers. + +{p 4 8 2} +{cmd:coeflabels(}{it:name} {it:label} [...]{cmd:)} specifies labels +for the coefficients. Specify names and labels in pairs and, if +necessary, enclose labels in double quotes, +e.g. {cmd:coeflabels(mpg Milage rep78 {bind:"Repair Record"})}. + +{p 4 8 2} +{cmd:notes} prints notes at the end of the table explaining the +significance symbols and the type of displayed statistics. This is +the default. Specify {cmd:nonotes} to suppress the notes. + +{p 4 8 2} +{cmd:addnotes(}{it:list}{cmd:)} may be used to add further lines of +text at the bottom of the table. Lines containing blanks must be +enclosed in double quotes, +e.g. {cmd:addnotes({bind:"Line 1"} {bind:"Line 2"})}. + +{marker format} +{dlgtab:Document format} + +{p 4 8 2} +{cmd:smcl}, {cmd:fixed}, {cmd:tab}, {cmd:csv}, {cmd:scsv}, {cmd:rtf}, +{cmd:html}, {cmd:tex}, {cmd:booktabs}, and {cmd:md} choose the table's basic +output format. The default format is {cmd:smcl} unless +{cmd:using} is specified, in which case the default format +depends on the filename's suffix ({cmd:smcl} for ".smcl", {cmd:csv} +for ".csv", {cmd:rtf} for ".rtf", +{cmd:html} for ".htm" or ".html", {cmd:tex} for ".tex", {cmd:md} for ".md" or ".mmd", +and {cmd:fixed} for all other filenames). To override the default behavior, specify one of the +following format options. + +{p 8 8 2} +{cmd:smcl} produces a {help SMCL} formatted table to be displayed in the +Stata results window or the Stata viewer. + +{p 8 8 2} +{cmd:fixed} produces a fixed-format ASCII table. This is suitable, +for example, if the table be displayed in a text editor. + +{p 8 8 2} +{cmd:tab} produces a tab-delimited ASCII table. +{p_end} +{marker csv} +{p 8 8 2} +{cmd:csv} produces a CSV ({ul:C}omma {ul:S}eparated {ul:V}alue +format) table for use with Microsoft Excel. Delimiter is a comma. In +order to prevent Excel from interpreting the contents of the table +cells, they are enclosed double quotes preceded by an equal sign +(i.e. ="..."). However, if the {cmd:plain} option is specified, the +table cells are enclosed in double quotes without the leading equal +sign. The first method is appropriate if you want to preserve the +table's formatting. The second method is appropriate if you want to +use the table's contents for further computations in Excel. +{p_end} +{marker scsv} +{p 8 8 2} +{cmd:scsv} is a variant on the CSV format that uses a semicolon as +the delimiter. This is appropriate for some non-English versions of +Excel (e.g. the German version). +{p_end} +{marker rtf} +{p 8 8 2} +{cmd:rtf} produces a Rich Text Format table for use with word +processors. + +{p 8 8 2} +{cmd:html} produces a simple HTML formatted table. + +{p 8 8 2} +{cmd:tex} produces a LaTeX formatted table. +{p_end} +{marker booktabs} +{p 8 8 2} +{cmd:booktabs} produces a LaTeX formatted table for use with LaTeX's +{it:booktabs} package. + +{p 8 8 2} +{cmd:md} produces a Markdown formatted table. Native +{browse "http://daringfireball.net/projects/markdown/":Markdown} has no specific +support for tables, but for example {browse "http://github.github.com/gfm/":GitHub Flavored Markdown} +and {browse "http://fletcherpenney.net/multimarkdown/":MultiMarkdown} do. Option {cmd:mmd} +can be used as a synonym for {cmd:md} (the default file suffix will be ".mmd" in this case). +{p_end} +{marker fragment} +{p 4 8 2} +{cmd:fragment} causes the table's opening and closing specifications +to be suppressed. This is relevant primarily in LaTeX and HTML mode. + +{p 4 8 2} +{cmd:float} causes the table to be set up as a floating object in LaTeX mode +(table environment). Providing a {cmd:title()} implies {cmd:float}. Specify +{cmd:nofloat} to omit the float environment in this case (this is useful, e.g., +for LyX users). + +{p 4 8 2} +{cmd:page}[{cmd:(}{it:packages}{cmd:)}] adds opening and closing code +to define a whole LaTeX or HTML document. The default is to produce a +raw table that can then be included into an existing LaTeX or HTML +document. Specifying {it:packages} in parentheses causes +{cmd:\usepackage{c -(}}{it:packages}{cmd:{c )-}} to be added to the +preamble of the LaTeX document (note that the {it:booktabs} package +is automatically loaded if {cmd:booktabs} is specified). + +{p 4 8 2} +{cmd:standalone}[{cmd:(}{it:opts}{cmd:)}] implies {cmd:page} +and uses {cmd:\documentclass[}{it:opts}{cmd:]{c -(}standlone{c )-}} +instead of {cmd:\documentclass{c -(}article{c )-}} in the LaTeX header (see +{browse "http://ctan.org/pkg/standalone"}). The default for {it:opts} +is {cmd:varwidth}; type {cmd:standalone("")} to suppress {cmd:[}{it:opts}{cmd:]}. + +{p 4 8 2} +{cmd:alignment(}{it:string}{cmd:)} may be used to specify the +alignment of the models' columns in LaTeX, HTML, or RTF mode. + +{p 8 8 2} +In LaTeX mode {it:string} should be a LaTeX column specifier. The +default is to center the columns. To produce right-aligned columns, +for example, type {cmd:alignment(r)}. If the table contains multiple +columns per model/equation, the alignment specification should define +all columns. For example, if the {cmd:wide} option is specified, you +could type {cmd:alignment(cr)} to, say, center the point estimates +and right-align the t-statistics. Note that more sophisticated column +definitions are often needed to produce appealing results. In +particular, LaTeX's {it:dcolumn} package proves useful to align +columns on the decimal point. + +{p 8 8 2} +In HTML mode {it:string} should be a HTML alignment specifier. The +default is to omit alignment specification, which results in left +aligned columns. To center the columns in HTML, for example, specify +{cmd:alignment(center)}. Other than in LaTeX mode, the same alignment +is used for all columns if the table contains multiple columns per +model/equation in the HTML mode. + +{p 8 8 2} +In RTF mode {it:string} should be one of {cmd:l}, {cmd:c}, {cmd:r}, +and {cmd:j}. The default is to center the columns. To produce +right-aligned columns, for example, type {cmd:alignment(r)}. The same +alignment is used for all columns if the table contains multiple +columns per model/equation in the RTF mode. + +{p 8 8 2} +Note that {cmd:alignment()} does not change the alignment of the +variable names/labels in the left stub of the table. They are always +left-aligned. + +{p 4 8 2} +{cmd:width(}{it:string}{cmd:)} sets the overall width of the table in +LaTeX or HTML. {it:string} should be LaTeX or HTML literal. For +example, specify {cmd:width(\hsize)} in LaTeX or {cmd:width(100%)} in +HTML to span the whole page. The table columns will spread regularly +over the specified width. Note that in RTF mode {helpb estout}'s +{cmd:varwidth()} and {cmd:modelwidth()} options may be used to change +the width of the table columns. + +{p 4 8 2} +{cmdab:longtable} causes the {it:longtable} environment to be used in +LaTeX. Use {cmdab:longtable} for tables that are too +long to fit on a single page. {cmdab:longtable} cannot be combined +with {cmd:width()}. Make sure to load the {it:longtable} package +in the LaTeX document, i.e. include {cmd:\usepackage{longtable}} in the +document's preamble. + +{p 4 8 2} +{cmd:fonttbl(}{it:string}{cmd:)} defines a custom font table in RTF. The +default is "{cmd:\f0\fnil Times New Roman;}". For example, typing + + {com}. esttab using example.rtf, ti("\f1 The Auto Data") /// + fonttbl(\f0\fnil Times New Roman;\f1\fnil Arial;){txt} + +{p 8 8 2} +would add a title in Arial. + +{p 4 8 2} +{cmd:nortfencode} prevents the translation of non-ASCII characters in RTF +mode (a translated character is encoded as {cmd:\u}#{cmd:?}, where +# is the base 10 character code). This is only relevant in Stata 14 or newer; +no translation is applied in Stata 13 or older. + +{marker output} +{dlgtab:Output} + +{p 4 8 2} +{cmd:replace} permits {cmd:esttab} to overwrite an existing file. + +{p 4 8 2} +{cmd:append} specifies that the output be appended to an existing +file. It may be used even if the file does not yet exist. Specifying +{cmd:append} together with {cmd:page} in TeX or HTML mode causes the +new table to be inserted at the end of the body of an existing +document ({cmd:esttab} seeks a line reading "\end{document}" or +"", respectively, and starts appending from there; +contents after this line will be overwritten). In RTF mode, existing +documents are assumed to end with a line containing a single "}". + +{p 4 8 2} +{cmd:type} specifies that the assembled table be printed in the +results window and the log file. This is the default unless +{cmd:using} is specified. + +{p 4 8 2} +{cmd:noisily} displays the executed {helpb estout} command. + +{marker advanced} +{dlgtab:Advanced} + +{p 4 8 2} +{cmd:drop(}{it:droplist}{cmd:)} identifies the coefficients to be +dropped from the table. A {it:droplist} comprises one or more +specifications, separated by white space. A specification can be +either a parameter name (e.g. {cmd:price}), an equation name followed +by a colon (e.g. {cmd:mean:}), or a full name +(e.g. {cmd:mean:price}). You may use the {cmd:*} and {cmd:?} wildcards +in equation names and parameter names. Be sure to refer to the matched +equation names, and not to the original equation names in the models, +when using the {cmd:equations()} option to match equations. + +{p 4 8 2} +{cmd:noomitted} drops omitted coefficients (only relevant in Stata 11 or +newer). + +{p 4 8 2} +{cmd:nobaselevels} drops base levels of factor variables (only relevant +in Stata 11 or newer). + +{p 4 8 2} +{cmd:keep(}{it:keeplist}{cmd:)} selects the coefficients to be +included in the table. {it:keeplist} is specified analogous to +{it:droplist} in {cmd:drop()} (see above). + +{p 4 8 2} +{cmd:order(}{it:orderlist}{cmd:)} changes the order of the +coefficients and equations within the table. {it:orderlist} is +specified analogous to {it:droplist} in {cmd:drop()} (see above). +Coefficients and equations that do not appear in {it:orderlist} are +placed last (in their original order). + +{p 4 8 2} +{cmd:equations(}{it:eqmatchlist}{cmd:)} specifies how the models' +equations are to be matched. This option is passed to the internal +call of {cmd:estimates table}. See help {helpb estimates} on how to +specify this option. The most common usage is {cmd:equations(1)} to +match all the first equations in the models. + +{p 4 8 2} +{cmd:eform} displays the regression table in exponentiated form. The +exponent of a coefficient is displayed in lieu of the untransformed +coefficient; standard errors and confidence intervals are transformed +as well. Note that the intercept is dropped in eform-mode, unless +{cmd:constant} is specified. + +{p 4 8 2} +{cmd:unstack} specifies that the individual equations from +multiple-equation models (e.g. {cmd:mlogit}, {cmd:reg3}, +{cmd:heckman}) be placed in separate columns. The default is to place +the equations below one another in a single column. + +{p 4 8 2} +{it:estout_options} are any other {cmd:estout} options (see help +{helpb estout}). Note that {cmd:estout} options take precedence over +{cmd:esttab} options. For example, + +{p 8 20 2} +{cmd:cells()}{space 5}disables {cmd:b()}, {cmd:beta()}, {cmd:main()}, +{cmd:t()}, {cmd:abs}, {cmd:not}, {cmd:se()}, {cmd:p()}, {cmd:ci()}, +{cmd:aux()}, {cmd:star}, {cmd:staraux}, {cmd:wide}, {cmd:onecell}, +{cmd:parentheses}, and {cmd:brackets}, + +{p 8 20 2} +{cmd:stats()}{space 5}disables {cmd:r2()}, {cmd:ar2()}, {cmd:pr2()}, +{cmd:aic()}, {cmd:bic()}, {cmd:scalars()}, {cmd:sfmt()}, {cmd:noobs}, +and {cmd:obslast}. + +{p 8 8 2} +Other {cmd:estout} options that should be used with care are +{cmd:begin()}, {cmd:delimiter()}, {cmd:end()}, {cmd:prehead()}, +{cmd:posthead()}, {cmd:prefoot()}, {cmd:postfoot()}, {cmd:mlabels()}, +and {cmd:varlabels()}. Furthermore, note that {cmd:estout}'s {cmd:style()} +option does not have much effect because most options that would be affected +by {cmd:style()} are set explicitly by {cmd:esttab}. + +{marker fmt} +{dlgtab:Numerical formats} + +{p 4 4 2} +Numerical display formats may be specified in {cmd:esttab} as follows: + +{p 5 8 2} +1. Official Stata's display formats: You may specify formats, such as +{cmd:%9.0g} or {cmd:%8.2f}. See help {help format} for a list +of available formats. {cmd:%g} or {cmd:g} may be used as a +synonym for {cmd:%9.0g}. + +{p 5 8 2} +2. Fixed format: You may specify an integer value such as {cmd:0}, +{cmd:1}, {cmd:2}, etc. to request a display format with a fixed number +of decimal places. For example, {cmd:t(3)} would display t-statistics +with three decimal places. + +{p 5 8 2} +3. Automatic format: You may specify {cmd:a1}, {cmd:a2}, ..., or +{cmd:a9} to cause {cmd:esttab} to choose a reasonable display format for +each number depending on the number's value. {cmd:a} may be used as a +synonym for {cmd:a3}. The {it:#} in +{cmd:a}{it:#} determines the minimum precision according to the +following rules: + +{p 10 12 2} +o Absolute numbers smaller than 1 are displayed with {it:#} +significant decimal places (i.e. with {it:#} decimal places ignoring +any leading zeros after the decimal point). For example, +{cmd:0.00123456} is displayed as {cmd:0.00123} if the format is +{cmd:a3}. + +{p 10 12 2} +o Absolute numbers greater than 1 are displayed with as many digits +required to retain at least one decimal place and are displayed with +a minimum of ({it:#} + 1) digits. For example, if the format is +{cmd:a3}, {cmd:1.23456} is displayed as {cmd:1.235}, {cmd:12.3456} is +displayed as {cmd:12.35}, and {cmd:1234.56} is displayed as +{cmd:1234.6}. + +{p 10 12 2} +o In any case, integers are displayed with zero decimal places, and +very large or very small absolute numbers are displayed in +exponential format. + +{marker exa} +{title:Examples} + +{p 4 4 2} +The following examples are intended to illustrate the basic usage of +{cmd:esttab}. Additional examples can be found at +{browse "http://repec.sowi.unibe.ch/stata/estout/"}. + +{p 4 4 2} The procedure is to first fit and store some models (see {helpb eststo}) and then apply +{cmd:esttab} to these stored estimates: + + {com}. eststo clear + {txt} + {com}. sysuse auto + {txt}(1978 Automobile Data) + + {com}. eststo: quietly regress price weight mpg + {txt}({res}est1{txt} stored) + + {com}. eststo: quietly regress price weight mpg foreign + {txt}({res}est2{txt} stored) + + {com}. esttab, ar2 + {res} + {txt}{hline 44} + {txt} (1) (2) + {txt} price price + {txt}{hline 44} + {txt}weight {res} 1.747** 3.465***{txt} + {res} {ralign 12:{txt:(}2.72{txt:)}} {ralign 12:{txt:(}5.49{txt:)}} {txt} + + {txt}mpg {res} -49.51 21.85 {txt} + {res} {ralign 12:{txt:(}-0.57{txt:)}} {ralign 12:{txt:(}0.29{txt:)}} {txt} + + {txt}foreign {res} 3673.1***{txt} + {res} {ralign 12:{txt:(}5.37{txt:)}} {txt} + + {txt}_cons {res} 1946.1 -5853.7 {txt} + {res} {ralign 12:{txt:(}0.54{txt:)}} {ralign 12:{txt:(}-1.73{txt:)}} {txt} + {txt}{hline 44} + {txt}N {res} 74 74 {txt} + {txt}adj. R-sq {res} 0.273 0.478 {txt} + {txt}{hline 44} + {txt}t statistics in parentheses + {txt}* p<0.05, ** p<0.01, *** p<0.001 + + +{p 4 4 2} +The same table using labels: + + {com}. esttab, ar2 label + {res} + {txt}{hline 52} + {txt} (1) (2) + {txt} Price Price + {txt}{hline 52} + {txt}Weight (lbs.) {res} 1.747** 3.465***{txt} + {res} {ralign 12:{txt:(}2.72{txt:)}} {ralign 12:{txt:(}5.49{txt:)}} {txt} + + {txt}Mileage (mpg) {res} -49.51 21.85 {txt} + {res} {ralign 12:{txt:(}-0.57{txt:)}} {ralign 12:{txt:(}0.29{txt:)}} {txt} + + {txt}Car type {res} 3673.1***{txt} + {res} {ralign 12:{txt:(}5.37{txt:)}} {txt} + + {txt}Constant {res} 1946.1 -5853.7 {txt} + {res} {ralign 12:{txt:(}0.54{txt:)}} {ralign 12:{txt:(}-1.73{txt:)}} {txt} + {txt}{hline 52} + {txt}Observations {res} 74 74 {txt} + {txt}Adjusted R-squared {res} 0.273 0.478 {txt} + {txt}{hline 52} + {txt}t statistics in parentheses + {txt}* p<0.05, ** p<0.01, *** p<0.001 + + +{p 4 4 2} +Plain table: + + {com}. esttab, ar2 plain + {res} + {txt} est1 est2 + {txt} b/t b/t + {txt}weight {res} 1.746559 3.464706{txt} + {res} 2.723238 5.493003{txt} + {txt}mpg {res} -49.51222 21.8536{txt} + {res} -.5746808 .2944391{txt} + {txt}foreign {res} 3673.06{txt} + {res} 5.370142{txt} + {txt}_cons {res} 1946.069 -5853.696{txt} + {res} .541018 -1.733408{txt} + {txt}N {res} 74 74{txt} + {txt}adj. R-sq {res} .2734846 .4781119{txt} + + +{p 4 4 2} +Using standard errors in brackets and suppress significance stars: + + {com}. esttab, se nostar brackets + {res} + {txt}{hline 38} + {txt} (1) (2) + {txt} price price + {txt}{hline 38} + {txt}weight {res} 1.747 3.465{txt} + {res} {ralign 12:{txt:[}0.641{txt:]}} {ralign 12:{txt:[}0.631{txt:]}}{txt} + + {txt}mpg {res} -49.51 21.85{txt} + {res} {ralign 12:{txt:[}86.16{txt:]}} {ralign 12:{txt:[}74.22{txt:]}}{txt} + + {txt}foreign {res} 3673.1{txt} + {res} {ralign 12:{txt:[}684.0{txt:]}}{txt} + + {txt}_cons {res} 1946.1 -5853.7{txt} + {res} {ralign 12:{txt:[}3597.0{txt:]}} {ralign 12:{txt:[}3377.0{txt:]}}{txt} + {txt}{hline 38} + {txt}N {res} 74 74{txt} + {txt}{hline 38} + {txt}Standard errors in brackets + + +{p 4 4 2} +Printing beta coefficients: + + {com}. esttab, beta + {res} + {txt}{hline 44} + {txt} (1) (2) + {txt} price price + {txt}{hline 44} + {txt}weight {res} 0.460** 0.913***{txt} + {res} {ralign 12:{txt:(}2.72{txt:)}} {ralign 12:{txt:(}5.49{txt:)}} {txt} + + {txt}mpg {res} -0.097 0.043 {txt} + {res} {ralign 12:{txt:(}-0.57{txt:)}} {ralign 12:{txt:(}0.29{txt:)}} {txt} + + {txt}foreign {res} 0.573***{txt} + {res} {ralign 12:{txt:(}5.37{txt:)}} {txt} + {txt}{hline 44} + {txt}N {res} 74 74 {txt} + {txt}{hline 44} + {txt}Standardized beta coefficients; t statistics in parentheses + {txt}* p<0.05, ** p<0.01, *** p<0.001 + +{marker aut} +{title:Author} + +{p 4 4 2} +Ben Jann, Institute of Sociology, University of Bern, jann@soz.unibe.ch + +{marker als} +{title:Also see} + + Manual: {hi:[R] estimates} + +{p 4 13 2}Online: help for + {helpb estimates}, + {help estcom}, + {helpb estout}, + {helpb eststo}, + {helpb estadd}, + {helpb estpost} +{p_end} diff --git a/ado/g/grc1leg.ado b/ado/g/grc1leg.ado new file mode 100644 index 0000000..eed6c4a --- /dev/null +++ b/ado/g/grc1leg.ado @@ -0,0 +1,118 @@ +*! version 1.0.5 02jun2010 +program grc1leg + + syntax [anything] [, LEGendfrom(string) /// + POSition(string) RING(integer -1) SPAN /// + NAME(passthru) SAVing(string asis) * ] + + gr_setscheme , refscheme // So we can have temporary styles + + // location and alignment in cell + tempname clockpos + if ("`position'" == "") local position 6 + .`clockpos' = .clockdir.new , style(`position') + local location `.`clockpos'.relative_position' + + if `ring' > -1 { + if (`ring' == 0) { + local location "on" + local ring "" + } + else local ring "ring(`ring')" + } + else local ring "" + + if "`span'" != "" { + if "`location'" == "above" | "`location'" == "below" { + local span spancols(all) + } + else local span spanrows(all) + } + + // allow legend to be from any graph + if "`legendfrom'" != "" { + local lfrom : list posof "`legendfrom'" in anything + if `lfrom' == 0 { + di as error `"`legend_from' not found in graph name list"' + exit 198 + } + } + else local lfrom 1 // use graph 1 for legend by default + + + graph combine `anything' , `options' `name' nodraw // combine graphs + + + if "`name'" != "" { // get graph name + local 0 `", `name'"' + syntax [, name(string) ] + local 0 `"`name'"' + syntax [anything(name=name)] [, replace] + } + else local name Graph + + forvalues i = 1/`:list sizeof anything' { // turn off legends + _gm_edit .`name'.graphs[`i'].legend.draw_view.set_false + _gm_edit .`name'.graphs[`i'].legend.fill_if_undrawn.set_false + } + + + // insert overall legend + .`name'.insert (legend = .`name'.graphs[`lfrom'].legend) /// + `location' plotregion1 , `ring' `span' + _gm_log .`name'.insert (legend = .graphs[`lfrom'].legend) /// + `location' plotregion1 , `ring' `span' + + _gm_edit .`name'.legend.style.box_alignment.setstyle , /// + style(`.`clockpos'.compass2style') + _gm_edit .`name'.legend.draw_view.set_true + + // hack to maintain serset reference counts + // must pick up sersets by reference, they were + // -.copy-ied when the legend was created above + forvalues i = 1/`.`name'.legend.keys.arrnels' { + if "`.`name'.legend.keys[`i'].view.serset.isa'" != "" { + _gm_edit .`name'.legend.keys[`i'].view.serset.ref_n + 99 + + .`name'.legend.keys[`i'].view.serset.ref = /// + .`name'.graphs[`lfrom'].legend.keys[`i'].view.serset.ref + _gm_log .`name'.legend.keys[`i'].view.serset.ref = /// + .graphs[`lfrom'].legend.keys[`i'].view.serset.ref + } + if "`.`name'.legend.plotregion1.key[`i'].view.serset.isa'" != "" { + _gm_edit /// + .`name'.legend.plotregion1.key[`i'].view.serset.ref_n + 99 + + .`name'.legend.plotregion1.key[`i'].view.serset.ref = /// + .`name'.graphs[`lfrom'].legend.keys[`i'].view.serset.ref + _gm_log /// + .`name'.legend.plotregion1.key[`i'].view.serset.ref = /// + .graphs[`lfrom'].legend.keys[`i'].view.serset.ref + } + } + + gr draw `name' // redraw graph + + if `"`saving'"' != `""' { + gr_save `"`name'"' `saving' + } + + +end + + +program GetPos + gettoken pmac 0 : 0 + gettoken colon 0 : 0 + + local 0 `0' + if `"`0'"' == `""' { + c_local `pmac' below + exit + } + + local 0 ", `0'" + syntax [ , Above Below Leftof Rightof ] + + c_local `pmac' `above' `below' `leftof' `rightof' +end diff --git a/ado/g/grc1leg.hlp b/ado/g/grc1leg.hlp new file mode 100644 index 0000000..67a14b9 --- /dev/null +++ b/ado/g/grc1leg.hlp @@ -0,0 +1,138 @@ +{smcl} +{* 20dec2002}{...} +{hline} +help for {hi:grc1leg}{right:personal distribution} +{hline} + +{title:Combine multiple graphs into one with a single common legend} + +{p 8 23} +{cmd:grc1leg} +{it:name} +[{it:name} ...] +[{cmd:,} +{it:{help graph_combine:combine_options}} +{it:legend_options} +] + +{p 4 4 2} +where {it:name} is + + {it:name}{col 40}description + {hline 65} + {it:simplename}{...} +{col 40}name of graph in memory + {it:name}{cmd:.gph}{...} +{col 40}name of graph stored on disk + {cmd:"}{it:name}{cmd:"}{...} +{col 40}name of graph stored on disk + {hline 65} + See {help graph_combine} for full details on syntax and options. + +{p 4 4 2} +and where {it:legend_options} are + + {it:legend_options}{col 40}description + {hline 69} +{col 9}{...} +{col 9}{...} +{cmdab:leg:endfrom:(}{it:name}{cmd:)}{...} +{col 40}graph from which to take legend +{...} +{col 9}{...} +{cmdab:pos:ition:(}{it:{help clockpos}}{cmd:)}{...} +{col 40}where legend appears +{...} +{col 9}{...} +{cmd:ring(}{it:{help ringpos}}{cmd:)}{...} +{col 40}where legend appears (detail) +{...} +{col 9}{...} +{cmd:span}{...} +{col 40}"centering" of legend + {hline 69} +{p 8 8 2} +See +{hi:Where legends appear} under {hi:Remarks} below and see +{hi:Positioning of titles} in help +{it:{help title_options}} +for definitions of {it:clockpos} and {it:ringpos}. + + +{title:Description} + +{p 4 4 2} +{cmd:graph} {cmd:combine} arrays separately drawn graphs into one graph and +shows a single common legend taken from one of the graphs. + + +{title:Options} + +{p 4 8 2} +{cmd:legendfrom(}{it:name}{cmd:)} specifies the graph from which the legend for + the combined graphs is to be taken, the default is the first graph in the + list. The argument {it:name} must match one of the names from the list of + graph names specified. + +{p 4 8 2} +{cmd:position(}{it:clockpos}{cmd:)} and +{cmd:ring(}{it:ringpos}{cmd:)} + override the default location of the legend, which is usually centered + below the plot region. {cmd:position()} specifies a direction {it:(sic)} + according to the hours on the dial of a 12-hour clock, and {cmd:ring()} + specifies the distance from the plot region. + +{p 8 8 2} + {cmd:ring(0)} is defined as being inside the plot region itself and allows you + to place the legend inside the plot. {cmd:ring(}{it:k}{cmd:)}, {it:k}>0, + specifies positions outside the plot region; the larger the {cmd:ring()} + value, the farther away from the plot region is the legend. {cmd:ring()} + values may be integers or nonintegers and are treated ordinally. + +{p 8 8 2} + {cmd:position(12)} puts the legend directly above the plot region + (assuming {cmd:ring()}>0), {cmd:position(3)} directly to the right + of the plot region, and so on. + +{p 8 8 2} + See + {hi:Where legends appear} under {hi:Remarks} below and see + {hi:Positioning of titles} in + {it:{help title_options}} for more information on + the {cmd:position()} and {cmd:ring()} suboptions. + +{p 4 8 2} +{cmd:span} specifies that the legend is to be placed in an area spanning the + entire width (or height) of the graph rather than an area spanning the + plot region. + This affects whether the legend is centered with respect to the plot + region or the entire graph. + See {hi:Spanning} in + {it:{help title_options}} for more information on {cmd:span}. + +{p 4 8 2} +{it:combine_options} specify how the graphs are combined, titling the combined + graphs, and other common graph options. See + {help graph_combine} for details. + + +{title:Remarks} + + +{p 4 4 2} +{cmd:grc1leg} is the same as {cmd:graph combine} except that it displays a +single common legend for all of the combined graphs. This legend is one of +the legends from the graphs being combined, . Otherwise, {cmd:grc1leg} is +exactly like {cmd:graph combine}, see {help graph_combine} for further +remarks. + +{title:Also see} + +{p 4 13 2} +Online: help for +{help graph_combine}; +{help graph_use}; +{help graph_save}, +{it:{help saving_option}}; +{help gph_files} +{p_end} diff --git a/ado/i/ivreg2.ado b/ado/i/ivreg2.ado new file mode 100644 index 0000000..9aa223d --- /dev/null +++ b/ado/i/ivreg2.ado @@ -0,0 +1,6815 @@ +*! ivreg2 4.1.12 14aug2024 +*! authors cfb & mes +*! see end of file for version comments + +* Variable naming: +* lhs = LHS endogenous +* endo = X1, RHS endogenous (instrumented) = #K1 +* inexog = X2 = Z2 = included exogenous (instruments) = #K2 = #L2 +* exexog = Z1 = excluded exogenous (instruments) = #L1 +* iv = {inexog exexog} = all instruments +* rhs = {endo inexog} = RHS regressors +* no 0 or 1 at end of varlist means original varlist but after expansion of FV and TS vars +* 0 at the end of the name means the varlist after duplicates removed and collinearities/omitteds marked +* 1 means the same as 0 but after omitted vars dropped and extraneous FV operators "o", "b" and "n" removed. +* 0, 1 etc. also apply to _ct variables that are counts of these varlists +* dofminus is large-sample adjustment (e.g., #fixed effects) +* sdofminus is small-sample adjustment (e.g., #partialled-out regressors) + +if c(version) < 12 & c(version) >= 9 { +* livreg2 Mata library. +* Ensure Mata library is indexed if new install. +* Not needed for Stata 12+ since ssc.ado does this when installing. + capture mata: mata drop m_calckw() + capture mata: mata drop m_omega() + capture mata: mata drop ms_vcvorthog() + capture mata: mata drop s_vkernel() + capture mata: mata drop s_cdsy() + mata: mata mlib index +} + +********************************************************************************* +***************************** PARENT IVREG2 ************************************* +****************** FORKS TO EXTERNAL IVREG2S IF CALLER < 11 ********************* +********************************************************************************* + +* Parent program, forks to versions as appropriate after version call +* Requires byable(onecall) +program define ivreg2, eclass byable(onecall) /* properties(svyj) */ sortpreserve + local lversion 04.1.12 + +* local to store Stata version of calling program + local caller = _caller() + +* Minimum of version 8 required for parent program (earliest ivreg2 is ivreg28) + version 8 + +* Replay = no arguments before comma + if replay() { +* Call to ivreg2 will either be for version, in which case there should be no other arguments, +* or a postestimation call, in which case control should pass to main program. + syntax [, VERsion * ] + if "`version'"~="" & "`options'"=="" { +* Call to ivreg2 is for version + di in gr "`lversion'" + ereturn clear + ereturn local version `lversion' + exit + } + else if "`version'"~="" & "`options'"~="" { +* Improper use of version option +di as err "invalid syntax - cannot combine version with other options" + exit 198 + } + else { +* Postestimation call, so put `options' macro (i.e. *) back into `0' macro with preceding comma + local 0 `", `options'"' + } + } + +* replay can't be combined with by + if replay() & _by() { +di as err "invalid syntax - cannot use by with replay" + exit 601 + } + +* Handling of by. ivreg2x programs are byable(recall), so must set prefix for them. + if _by() { + local BY `"by `_byvars'`_byrc0':"' + } + +* If calling version is < 11, pass control to earlier version +* Note that this means calls from version 11.0 will not go to legacy version +* but will fail requirement of version 11.2 in main code. + if `caller' < 11 { + local ver = round(`caller') + local ivreg2cmd ivreg2`ver' +* If replay, change e(cmd) macro to name of legacy ivreg2 before calling it, then change back +* Note by not allowed with replay; caught above so prefix not needed here. + if replay() { + ereturn local cmd "`ivreg2cmd'" + `ivreg2cmd' `0' + ereturn local cmd "ivreg2" + + } + else { +* If not replay, call legacy ivreg2 and then add macros + `BY' `ivreg2cmd' `0' + ereturn local cmd "ivreg2" + ereturn local ivreg2cmd "`ivreg2cmd'" + ereturn local version `lversion' + ereturn local predict ivreg2_p + } + exit + } + +// Version is 11 or above. +// Pass control to current estimation program ivreg211. + if replay() { + ivreg211 `0' + } +// If not replay, call ivreg211 and then add macros + else { + // use to separate main args from options + syntax [anything] [if] [in] [aw fw pw iw] [, * ] + // append caller(.) to options + `BY' ivreg211 `anything' `if' `in' [`weight' `exp'], `options' caller(`caller') +// `BY' ivreg211 `0' + ereturn local cmd "ivreg2" + ereturn local ivreg2cmd "ivreg2" + ereturn local version `lversion' + ereturn local predict ivreg2_p + ereturn local cmdline ivreg2 `0' // `0' rather than `*' in case of any "s in string + } + +end +********************************************************************************* +*************************** END PARENT IVREG2 *********************************** +********************************************************************************* + + +********************* EXIT IF STATA VERSION < 11 ******************************** + +* When do file is loaded, exit here if Stata version calling program is < 11. +* Prevents loading of rest of program file (could cause earlier Statas to crash). + +if c(stata_version) < 11 { + exit +} + +******************** END EXIT IF STATA VERSION < 11 ***************************** + + +********************************************************************************* +***************** BEGIN MAIN IVREG2 ESTIMATION CODE ***************************** +********************************************************************************* + +* Main estimation program +program define ivreg211, eclass byable(recall) sortpreserve + version 11.2 + + local ivreg2cmd "ivreg211" // actual command name + local ivreg2name "ivreg2" // name used in command line and for default naming of equations etc. + + if replay() { + syntax [, /// + FIRST FFIRST RF SFIRST /// + dropfirst droprf dropsfirst /// + Level(integer $S_level) /// + NOHEader NOFOoter /// + EForm(string) PLUS /// + NOOMITTED vsquish noemptycells /// + baselevels allbaselevels /// + VERsion /// + caller(real 0) /// + ] + if "`version'" != "" & "`first'`ffirst'`rf'`noheader'`nofooter'`dropfirst'`droprf'`eform'`plus'" != "" { + di as err "option version not allowed" + error 198 + } + if "`version'" != "" { + di in gr "`lversion'" + ereturn clear + ereturn local version `lversion' + exit + } + if `"`e(cmd)'"' != "ivreg2" { + error 301 + } +// Set display options + local dispopt eform(`eform') `noomitted' `vsquish' `noemptycells' `baselevels' `allbaselevels' + +// On replay, set flag so saved eqns aren't dropped + if "`e(firsteqs)'" != "" & "`dropfirst'" == "" { + local savefirst "savefirst" + } + if "`e(rfeq)'" != "" & "`droprf'" == "" { + local saverf "saverf" + } + if "`e(sfirsteq)'" != "" & "`dropsfirst'" == "" { + local savesfirst "savesfirst" + } +// On replay, re-display collinearities and duplicates messages + DispCollinDups + } + else { +// MAIN CODE BLOCK + +// Start parsing + syntax [anything(name=0)] [if] [in] [aw fw pw iw/] [, /// + NOID NOCOLLIN /// + FIRST FFIRST SAVEFIRST SAVEFPrefix(name) /// + RF SAVERF SAVERFPrefix(name) /// + SFIRST SAVESFIRST SAVESFPrefix(name) /// + SMall NOConstant /// + Robust CLuster(varlist) kiefer dkraay(integer 0) /// + BW(string) kernel(string) center /// + GMM GMM2s CUE /// + LIML COVIV FULLER(real 0) Kclass(real 0) /// + ORTHOG(string) ENDOGtest(string) REDundant(string) /// + PARTIAL(string) FWL(string) /// + Level(integer $S_level) /// + NOHEader NOFOoter NOOUTput /// + bvclean NOOMITTED omitted vsquish noemptycells /// + baselevels allbaselevels /// + title(string) subtitle(string) /// + DEPname(string) EForm(string) PLUS /// + Tvar(varname) Ivar(varname) /// + B0(string) SMATRIX(string) WMATRIX(string) /// + sw psd0 psda useqr /// + dofminus(integer 0) sdofminus(integer 0) /// + NOPARTIALSMALL /// + fvall fvsep /// + caller(real 0) /// + ] + +// Confirm ranktest is installed (necessary component). + checkversion_ranktest `caller' + local ranktestcmd `r(ranktestcmd)' + +// Parse after clearing any sreturn macros (can be left behind in Stata 11) + sreturn clear + ivparse `0', ivreg2name(`ivreg2name') /// needed for some options + partial(`partial') /// + fwl(`fwl') /// legacy option + orthog(`orthog') /// + endogtest(`endogtest') /// + redundant(`redundant') /// + depname(`depname') /// + `robust' /// + cluster(`cluster') /// + bw(`bw') /// + kernel(`kernel') /// + dkraay(`dkraay') /// + `center' /// + `kiefer' /// + `sw' /// + `noconstant' /// + tvar(`tvar') /// + ivar(`ivar') /// + `gmm2s' /// + `gmm' /// legacy option, produces error message + `cue' /// + `liml' /// + fuller(`fuller') /// + kclass(`kclass') /// + b0(`b0') /// + wmatrix(`wmatrix') /// + `noid' /// + `savefirst' /// + savefprefix(`savefprefix') /// + `saverf' /// + saverfprefix(`saverfprefix') /// + `savesfirst' /// + savesfprefix(`savesfprefix') /// + dofminus(`dofminus') /// + `psd0' /// + `psda' /// + `nocollin' /// + `useqr' /// + `bvclean' /// + eform(`eform') /// + `noomitted' /// + `vsquish' /// + `noemptycells' /// + `baselevels' /// + `allbaselevels' + +// varlists are unexpanded; may be empty + local lhs `s(lhs)' + local depname `s(depname)' + local endo `s(endo)' + local inexog `s(inexog)' + local exexog `s(exexog)' + local partial `s(partial)' + local cons =s(cons) + local partialcons =s(partialcons) + local tvar `s(tvar)' + local ivar `s(ivar)' + local tdelta `s(tdelta)' + local tsops =s(tsops) + local fvops =s(fvops) + local robust `s(robust)' + local cluster `s(cluster)' + local bw =`s(bw)' // arrives as string but return now as number + local bwopt `s(bwopt)' + local kernel `s(kernel)' // also used as flag for HAC estimation + local center =`s(center)' // arrives as string but now boolean + local kclassopt `s(kclassopt)' + local fulleropt `s(fulleropt)' + local liml `s(liml)' + local noid `s(noid)' // can also be triggered by b0(.) option + local useqr =`s(useqr)' // arrives as string but now boolean; nocollin=>useqr + local savefirst `s(savefirst)' + local savefprefix `s(savefprefix)' + local saverf `s(saverf)' + local saverfprefix `s(saverfprefix)' + local savesfirst `s(savesfirst)' + local savesfprefix `s(savesfprefix)' + local psd `s(psd)' // triggered by psd0 or psda + local dofmopt `s(dofmopt)' + local bvclean =`s(bvclean)' // arrives as string but return now as boolean + local dispopt `s(dispopt)' + +// Can now tsset; sortpreserve will restore sort after exit + if `tsops' | "`kernel'"~="" { + cap tsset // restores sort if tsset or xtset but sort disrupted + if _rc>0 { + tsset `ivar' `tvar' + } + } + +*********************************************************** + +// Weights +// fweight and aweight accepted as is +// iweight not allowed with robust or gmm and requires a trap below when used with summarize +// pweight is equivalent to aweight + robust +// Since we subsequently work with wvar, tsrevar of weight vars in weight `exp' not needed. + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + qui gen double `wvar'=`exp' + } + if "`weight'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "fweight" & "`sw'" != "" { + di in red "fweights currently not supported with -sw- option" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`gmm2s'`kernel'" !="" { + di in red "iweights not allowed with robust or gmm" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + qui gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + qui gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + +******************************************************************************** +// markout sample +// include `tvar' to limit sample to where tvar is available, but only if TS operators used + marksample touse + if `tsops' { + markout `touse' `lhs' `inexog' `exexog' `endo' `cluster' `tvar', strok + } + else { + markout `touse' `lhs' `inexog' `exexog' `endo' `cluster', strok + } + +******************************************************************************** +// weight factor and sample size +// Every time a weight is used, must multiply by scalar wf ("weight factor") +// wf=1 for no weights, fw and iw, wf = scalar that normalizes sum to be N if aw or pw + + sum `wvar' if `touse' `wtexp', meanonly +// Weight statement + if "`weight'" ~= "" { +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + if "`weight'"=="" | "`weight'"=="fweight" | "`weight'"=="iweight" { +// Effective number of observations is sum of weight variable. +// If weight is "", weight var must be column of ones and N is number of rows + local wf=1 + local N=r(sum_w) + } + else if "`weight'"=="aweight" | "`weight'"=="pweight" { + local wf=r(N)/r(sum_w) + local N=r(N) + } + else { +// Should never reach here +di as err "ivreg2 error - misspecified weights" + exit 198 + } + if `N'==0 { +di as err "no observations" + exit 2000 + } + +*************************************************************** +// Time-series data +// tindex used by Mata code so that ts operators work correctly + + tempvar tindex + qui gen `tindex'=1 if `touse' + qui replace `tindex'=sum(`tindex') if `touse' + + if `tsops' | "`kernel'"~="" { +// Report gaps in data + tsreport if `touse', panel + if `r(N_gaps)' != 0 { +di as text "Warning: time variable " as res "`tvar'" as text " has " /// + as res "`r(N_gaps)'" as text " gap(s) in relevant range" + } +// Set local macro T and check that bw < (T-1) + sum `tvar' if `touse', meanonly + local T = r(max)-r(min) + 1 + local T1 = `T' - 1 + if (`bw' > (`T1'/`tdelta')) { +di as err "invalid bandwidth in option bw() - cannot exceed timespan of data" + exit 198 + } + } + +// kiefer VCV = kernel(tru) bw(T) and no robust with tsset data + if "`kiefer'" ~= "" { + local bw =`T' + } + +*********** Column of ones for constant set up here ************** + + if "`noconstant'"=="" { +// If macro not created, automatically omitted. + tempvar ones + qui gen byte `ones' = 1 if `touse' + } + +************* Varlists, FV varlists, duplicates ***************** +// Varlists come in 4 versions, e.g., for inexog: +// (a) inexog = full list of original expanded vnames; may have duplicates +// (b) inexog0 = as with inexog with duplicates removed but RETAINING base/omitted/etc. varnames +// (c) inexog1 = as with inexog0 but WITHOUT base/omitted/etc. +// (d) fv_inexog1 = corresponding list with temp vars minus base/omitted/etc., duplicates, collinearities etc. +// Varlists (c) and (d) are definitive, i.e., have the variables actually used in the estimation. + +// Create consistent expanded varlists. +// "Consistent" means base vars for FVs must be consistent +// hence default rhs=endo+inexog is expanded as one. +// fvall: overrides, endo+inexog+exexog expanded as one +// fvsep: overrides, endo, inexog and exexog expanded separately +// NB: expanding endo+inexog+exexog is dangerous because +// fvexpand can zap a list in case of overlap +// e.g. fvexpand mpg + i(1/4).rep78 + i5.rep78 +// => mpg 1b.rep78 2.rep78 3.rep78 4.rep78 5.rep78 +// but fvexpand mpg + i.rep78 + i5.rep78 +// => mpg 5.rep78 + + CheckDupsCollin, /// + lhs(`lhs') /// + endo(`endo') /// + inexog(`inexog') /// + exexog(`exexog') /// + partial(`partial') /// + orthog(`orthog') /// + endogtest(`endogtest') /// + redundant(`redundant') /// + touse(`touse') /// + wvar(`wvar') /// + wf(`wf') /// + `noconstant' /// + `nocollin' /// + `fvall' /// + `fvsep' + +// Replace basic varlists and create "0" versions of varlists + foreach vl in lhs endo inexog exexog partial orthog endogtest redundant { + local `vl' `s(`vl')' + local `vl'0 `s(`vl'0)' + } + local dups `s(dups)' + local collin `s(collin)' + local ecollin `s(ecollin)' + +// Create "1" and fv versions of varlists + foreach vl in lhs endo inexog exexog partial orthog endogtest redundant { + foreach var of local `vl'0 { // var-by-var so that fvrevar doesn't decide on base etc. + _ms_parse_parts `var' + if ~`r(omit)' { // create temp var only if not omitted + fvrevar `var' if `touse' + local `vl'1 ``vl'1' `var' + local fv_`vl'1 `fv_`vl'1' `r(varlist)' + } + } + local `vl'1 : list retokenize `vl'1 + local fv_`vl'1 : list retokenize fv_`vl'1 + } + +// Check that LHS expanded to a single variable + local wrongvars_ct : word count `lhs' + if `wrongvars_ct' > 1 { +di as err "multiple dependent variables specified: `lhs'" + error 198 + } + +// Check that option varlists are compatible with main varlists +// orthog() + local wrongvars : list orthog1 - inexog1 + local wrongvars : list wrongvars - exexog1 + local wrongvars_ct : word count `wrongvars' + if `wrongvars_ct' { +di as err "Error: `wrongvars' listed in orthog() but does not appear as exogenous." + error 198 + } +// endog() + local wrongvars : list endogtest1 - endo1 + local wrongvars_ct : word count `wrongvars' + if `wrongvars_ct' { +di as err "Error: `wrongvars' listed in endog() but does not appear as endogenous." + error 198 + } +// redundant() + local wrongvars : list redundant1 - exexog1 + local wrongvars_ct : word count `wrongvars' + if `wrongvars_ct' { +di as err "Error: `wrongvars' listed in redundant() but does not appear as exogenous." + error 198 + } + +// And create allnames macros + local allnames `lhs' `endo' `inexog' `exexog' + local allnames0 `lhs0' `endo0' `inexog0' `exexog0' + local allnames1 `lhs1' `endo1' `inexog1' `exexog1' + local fv_allnames1 `fv_lhs1' `fv_endo1' `fv_inexog1' `fv_exexog1' + + +// *************** Partial-out block ************** // + +// `partial' has all to be partialled out except for constant + if "`partial1'" != "" | `partialcons'==1 { + preserve + +// Remove partial0 from inexog0. +// Remove partial1 from inexog1. + local inexog0 : list inexog0 - partial0 + local inexog1 : list inexog1 - partial1 + local fv_inexog1 : list fv_inexog1 - fv_partial1 + +// Check that cluster, weight, tvar or ivar variables won't be transformed +// Use allnames1 (expanded varlist) + if "`cluster'"~="" { + local pvarcheck : list cluster in allnames1 + if `pvarcheck' { +di in r "Error: cannot use cluster variable `cluster' as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } + if "`tvar'"~="" { + local pvarcheck : list tvar in allnames1 + if `pvarcheck' { +di in r "Error: cannot use time variable `tvar' as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } + if "`ivar'"~="" { + local pvarcheck : list ivar in allnames1 + if `pvarcheck' { +di in r "Error: cannot use panel variable `ivar' as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } + if "`wtexp'"~="" { + tokenize `exp', parse("*/()+-^&|~") + local wvartokens `*' + local nwvarnames : list allnames1 - wvartokens + local wvarnames : list allnames1 - nwvarnames + if "`wvarnames'"~="" { +di in r "Error: cannot use weight variables as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } +// Partial out +// But first replace everything with doubles + recast double `fv_lhs1' `fv_endo1' `fv_inexog1' `fv_exexog1' `fv_partial1' + mata: s_partial ("`fv_lhs1'", /// + "`fv_endo1'", /// + "`fv_inexog1'", /// + "`fv_exexog1'", /// + "`fv_partial1'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + `cons') + + local partial_ct : word count `partial1' +// Constant is partialled out, unless nocons already specified in the first place + capture drop `ones' + local ones "" + if "`noconstant'" == "" { +// partial_ct used for small-sample adjustment to regression F-stat + local partial_ct = `partial_ct' + 1 + local noconstant "noconstant" + local cons 0 + } + } + else { +// Set count of partial vars to zero if option not used + local partial_ct 0 + local partialcons 0 + } +// Add partial_ct to small dof adjustment sdofminus + if "`nopartialsmall'"=="" { + local sdofminus = `sdofminus'+`partial_ct' + } + +********************************************* + + local rhs0 `endo0' `inexog0' // needed for display of omitted/base/etc. + local rhs1 `endo1' `inexog1' + local insts1 `exexog1' `inexog1' + local fv_insts1 `fv_exexog1' `fv_inexog1' + local fv_rhs1 `fv_endo1' `fv_inexog1' + local rhs0_ct : word count `rhs0' // needed for display of omitted/base/etc. + local rhs1_ct : word count `fv_rhs1' + local iv1_ct : word count `fv_insts1' + local endo1_ct : word count `fv_endo1' + local exex1_ct : word count `fv_exexog1' + local endoexex1_c : word count `fv_endo1' `fv_exexog1' + local inexog1_ct : word count `fv_inexog1' + +// Counts modified to include constant if appropriate + local rhs1_ct = `rhs1_ct' + `cons' + local rhs0_ct = `rhs0_ct' + `cons' // needed for display of omitted/base/etc. + local iv1_ct = `iv1_ct' + `cons' + +// Column/row names for matrices b, V, S, etc. + local cnb0 `endo0' `inexog0' // including omitted + local cnb1 `endo1' `inexog1' // excluding omitted + local cnZ0 `exexog0' `inexog0' // excluding omitted + local cnZ1 `exexog1' `inexog1' // excluding omitted + if `cons' { + local cnb0 "`cnb0' _cons" + local cnb1 "`cnb1' _cons" + local cnZ0 "`cnZ0' _cons" + local cnZ1 "`cnZ1' _cons" + } + +********************************************* +// Remaining checks: variable counts, col/row names of b0, smatrix, wmatrix + CheckMisc, /// + rhs1_ct(`rhs1_ct') /// + iv1_ct(`iv1_ct') /// + bvector(`b0') /// + smatrix(`smatrix') /// + wmatrix(`wmatrix') /// + cnb1(`cnb1') /// + cnZ1(`cnZ1') + + if "`b0'"~="" { + tempname b0 // so we can overwrite without changing original user matrix + mat `b0' = r(b0) + } + if "`smatrix'"~="" { + tempname S0 + mat `S0' = r(S0) + } + if "`wmatrix'"~="" { + tempname wmatrix // so we can overwrite without changing original user matrix + mat `wmatrix' = r(W0) + } + +*************** Commonly used matrices **************** + tempname YY yy yyc + tempname XX X1X1 X2X2 X1Z X1Z1 XZ Xy + tempname ZZ Z1Z1 Z2Z2 Z1Z2 Z1X2 Zy ZY Z2y Z2Y + tempname XXinv X2X2inv ZZinv XPZXinv + tempname rankxx rankzz condxx condzz + +// use fv_ varlists + mata: s_crossprods ("`fv_lhs1'", /// + "`fv_endo1'", /// + "`fv_inexog1' `ones'", /// + "`fv_exexog1'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N') + mat `XX' =r(XX) + mat `X1X1' =r(X1X1) + mat `X1Z' =r(X1Z) + mat `ZZ' =r(ZZ) + mat `Z2Z2' =r(Z2Z2) + mat `Z1Z2' =r(Z1Z2) + mat `XZ' =r(XZ) + mat `Xy' =r(Xy) + mat `Zy' =r(Zy) + mat `YY' =r(YY) + scalar `yy' =r(yy) + scalar `yyc' =r(yyc) + mat `ZY' =r(ZY) + mat `Z2y' =r(Z2y) + mat `Z2Y' =r(Z2Y) + mat `XXinv' =r(XXinv) + mat `ZZinv' =r(ZZinv) + mat `XPZXinv' =r(XPZXinv) + scalar `condxx' =r(condxx) + scalar `condzz' =r(condzz) + + scalar `rankzz' = rowsof(`ZZinv') - diag0cnt(`ZZinv') + scalar `rankxx' = rowsof(`XXinv') - diag0cnt(`XXinv') + local overid = `rankzz' - `rankxx' + +********** CLUSTER SETUP ********************************************** + +* Mata code requires data are sorted on (1) the first var cluster if there +* is only one cluster var; (2) on the 3rd and then 1st if two-way clustering, +* unless (3) two-way clustering is combined with kernel option, in which case +* the data are tsset and sorted on panel id (first cluster variable) and time +* id (second cluster variable). +* Second cluster var is optional and requires an identifier numbered 1..N_clust2, +* unless combined with kernel option, in which case it's the time variable. +* Third cluster var is the intersection of 1 and 2, unless combined with kernel +* opt, in which case it's unnecessary. +* Sorting on "cluster3 cluster1" means that in Mata, panelsetup works for +* both, since cluster1 nests cluster3. +* Note that it is possible to cluster on time but not panel, in which case +* cluster1 is time, cluster2 is empty and data are sorted on panel-time. +* Note also that if data are sorted here but happen to be tsset, will need +* to be re-tsset after estimation code concludes. + + +// No cluster options or only 1-way clustering +// but for Mata and other purposes, set N_clust vars =0 + local N_clust=0 + local N_clust1=0 + local N_clust2=0 + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`kernel'"~="" { +* kernel requires either that cluster1 is time var and cluster2 is empty +* or that cluster1 is panel var and cluster2 is time var. +* Either way, data must be tsset and sorted for panel data. + if "`cluster2'"~="" { +* Allow backwards order + if "`cluster1'"=="`tvar'" & "`cluster2'"=="`ivar'" { + local cluster1 "`2'" + local cluster2 "`1'" + } + if "`cluster1'"~="`ivar'" | "`cluster2'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset panel & time vars." +di as err " tsset panel var=`ivar'; tsset time var=`tvar'; cluster vars=`cluster1',`cluster2'" + exit 198 + } + } + else { + if "`cluster1'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset time variable." +di as err " tsset time var=`tvar'; cluster var=`cluster1'" + exit 198 + } + } + } +* Simple way to get quick count of 1st cluster variable without disrupting sort +* clusterid1 is numbered 1.._Nclust1. + tempvar clusterid1 + qui egen `clusterid1'=group(`cluster1') if `touse' + sum `clusterid1' if `touse', meanonly + if "`cluster2'"=="" { + local N_clust=r(max) + local N_clust1=`N_clust' + if "`kernel'"=="" { +* Single level of clustering and no kernel-robust, so sort on single cluster var. +* kernel-robust already sorted via tsset. + sort `cluster1' + } + } + else { + local N_clust1=r(max) + if "`kernel'"=="" { + tempvar clusterid2 clusterid3 +* New cluster id vars are numbered 1..N_clust2 and 1..N_clust3 + qui egen `clusterid2'=group(`cluster2') if `touse' + qui egen `clusterid3'=group(`cluster1' `cluster2') if `touse' +* Two levels of clustering and no kernel-robust, so sort on cluster3/nested in/cluster1 +* kernel-robust already sorted via tsset. + sort `clusterid3' `cluster1' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) + } + else { +* Need to create this only to count the number of clusters + tempvar clusterid2 + qui egen `clusterid2'=group(`cluster2') if `touse' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) +* Now replace with original variable + local clusterid2 `cluster2' + } + + local N_clust=min(`N_clust1',`N_clust2') + + } // end 2-way cluster block + } // end cluster block + + +************************************************************************************************ + + tempname b W S V beta lambda j jp rss mss rmse sigmasq rankV rankS + tempname arubin arubinp arubin_lin arubin_linp + tempname r2 r2_a r2u r2c F Fp Fdf2 ivest + + tempvar resid + qui gen double `resid'=. + +******************************************************************************************* +* LIML +******************************************************************************************* + + if "`liml'`kclassopt'"~="" { + + mata: s_liml( "`ZZ'", /// + "`XX'", /// + "`XZ'", /// + "`Zy'", /// + "`Z2Z2'", /// + "`YY'", /// + "`ZY'", /// + "`Z2Y'", /// + "`Xy'", /// + "`ZZinv'", /// + "`fv_lhs1'", /// + "`fv_lhs1' `fv_endo1'", /// + "`resid'", /// + "`fv_endo1' `fv_inexog1' `ones'", /// + "`fv_endo1'", /// + "`fv_exexog1' `fv_inexog1' `ones'", /// + "`fv_exexog1'", /// + "`fv_inexog1' `ones'", /// + `fuller', /// + `kclass', /// + "`coviv'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + "`robust'", /// + "`clusterid1'", /// + "`clusterid2'", /// + "`clusterid3'", /// + `bw', /// + "`kernel'", /// + "`sw'", /// + "`psd'", /// + "`ivar'", /// + "`tvar'", /// + "`tindex'", /// + `tdelta', /// + `center', /// + `dofminus', /// + `useqr') + + mat `b'=r(beta) + mat `S'=r(S) + mat `V'=r(V) + scalar `lambda'=r(lambda) + local kclass=r(kclass) + scalar `j'=r(j) + scalar `rss'=r(rss) + scalar `sigmasq'=r(sigmasq) + scalar `rankV'=r(rankV) + scalar `rankS'=r(rankS) + + scalar `arubin'=(`N'-`dofminus')*ln(`lambda') + scalar `arubin_lin'=(`N'-`dofminus')*(`lambda'-1) + +// collinearities can cause LIML to generate (spurious) OLS results + if "`nocollin'"~="" & `kclass'<1e-8 { +di as err "warning: k=1 in LIML estimation; results equivalent to OLS;" +di as err " may be caused by collinearities" + } + } + +******************************************************************************************* +* OLS, IV and 2SGMM. Also enter to get CUE starting values. +************************************************************************************************ + + if "`liml'`kclassopt'`b0'"=="" { + +* Call to s_gmm1s to do 1st-step GMM. +* If W or S supplied, calculates GMM beta and residuals +* If none of the above supplied, calculates GMM beta using default IV weighting matrix and residuals +* Block not entered if b0 is provided. + +* 1-step GMM is efficient and V/J/Sargan can be returned if: +* - estimator is IV, W is known and S can be calculated from 1st-step residuals +* - S is provided (and W is NOT) so W=inv(S) and beta can be calculated using W +* 1-step GMM is inefficient if: +* - non-iid VCE is requested +* - W is provided + + local effic1s = ( /// + "`gmm2s'`robust'`cluster'`kernel'"=="" /// + | ("`smatrix'"~="" & "`wmatrix'"=="") /// + ) + +// use fv_ varlists + mata: s_gmm1s( "`ZZ'", /// + "`XX'", /// + "`XZ'", /// + "`Zy'", /// + "`ZZinv'", /// + "`fv_lhs1'", /// + "`resid'", /// + "`fv_endo1' `fv_inexog1' `ones'", /// + "`fv_exexog1' `fv_inexog1' `ones'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + "`wmatrix'", /// + "`S0'", /// + `dofminus', /// + `effic1s', /// + `overid', /// + `useqr') + mat `b'=r(beta) + mat `W'=r(W) + +* If 1st-step is efficient, save remaining results and we're done + if `effic1s' { + mat `V'=r(V) + mat `S'=r(S) + scalar `j'=r(j) + scalar `rss'=r(rss) + scalar `sigmasq'=r(sigmasq) + scalar `rankV'=r(rankV) + scalar `rankS'=r(rankS) + } + else { +* ...we're not done - do inefficient or 2-step efficient GMM + +* Pick up matrix left by s_gmm1s(.) + tempname QXZ_W_QZX + mat `QXZ_W_QZX'=r(QXZ_W_QZX) + +* Block calls s_omega to get cov matrix of orthog conditions, if not supplied + if "`smatrix'"~="" { + mat `S'=`S0' + } + else { + +* NB: xtivreg2 calls ivreg2 with data sorted on ivar and optionally tvar. +* Stock-Watson adjustment -sw- assumes data are sorted on ivar. Checked at start of ivreg2. + +* call abw code if bw() is defined and bw(auto) selected + if `bw' != 0 { + if `bw' == -1 { + tempvar abwtouse + gen byte `abwtouse' = (`resid' < .) + abw `resid' `exexog1' `inexog1' `abwtouse', /* + */ tindex(`tindex') nobs(`N') tobs(`T') noconstant kernel(`kernel') + local bw `r(abw)' + local bwopt "bw(`bw')" + local bwchoice "`r(bwchoice)'" + } + } +* S covariance matrix of orthogonality conditions +// use fv_ varlists + mata: s_omega( "`ZZ'", /// + "`resid'", /// + "`fv_exexog1' `fv_inexog1' `ones'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + "`robust'", /// + "`clusterid1'", /// + "`clusterid2'", /// + "`clusterid3'", /// + `bw', /// + "`kernel'", /// + "`sw'", /// + "`psd'", /// + "`ivar'", /// + "`tvar'", /// + "`tindex'", /// + `tdelta', /// + `center', /// + `dofminus') + mat `S'=r(S) + } + +* By this point: `b' has 1st-step inefficient beta +* `resid' has resids from the above beta +* `S' has vcv of orthog conditions using either `resid' or user-supplied `S0' +* `QXZ_W_QZX' was calculated in s_gmm1s(.) for use in s_iegmm(.) + +* Inefficient IV. S, W and b were already calculated above. + if "`gmm2s'"=="" & "`robust'`cluster'`kernel'"~="" { + mata: s_iegmm( "`ZZ'", /// + "`XX'", /// + "`XZ'", /// + "`Zy'", /// + "`QXZ_W_QZX'", /// + "`fv_lhs1'", /// + "`resid'", /// + "`fv_endo1' `fv_inexog1' `ones'", /// + "`fv_exexog1' `fv_inexog1' `ones'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + "`W'", /// + "`S'", /// + "`b'", /// + `dofminus', /// + `overid', /// + `useqr') + } + +* 2-step efficient GMM. S calculated above, b and W will be updated. + if "`gmm2s'"~="" { + mata: s_egmm( "`ZZ'", /// + "`XX'", /// + "`XZ'", /// + "`Zy'", /// + "`ZZinv'", /// + "`fv_lhs1'", /// + "`resid'", /// + "`fv_endo1' `fv_inexog1' `ones'", /// + "`fv_exexog1' `fv_inexog1' `ones'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + "`S'", /// + `dofminus', /// + `overid', /// + `useqr') + mat `b'=r(beta) + mat `W'=r(W) + } + + mat `V'=r(V) + scalar `j'=r(j) + scalar `rss'=r(rss) + scalar `sigmasq'=r(sigmasq) + scalar `rankV'=r(rankV) + scalar `rankS'=r(rankS) + } +* Finished with non-CUE/LIML block + } + +*************************************************************************************** +* Block for cue gmm +******************************************************************************************* + if "`cue'`b0'" != "" { + +* s_gmmcue is passed initial b from IV/2-step GMM block above +* OR user-supplied b0 for evaluation of CUE obj function at b0 + mata: s_gmmcue( "`ZZ'", /// + "`XZ'", /// + "`fv_lhs1'", /// + "`resid'", /// + "`fv_endo1' `fv_inexog1' `ones'", /// + "`fv_exexog1' `fv_inexog1' `ones'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + "`robust'", /// + "`clusterid1'", /// + "`clusterid2'", /// + "`clusterid3'", /// + `bw', /// + "`kernel'", /// + "`sw'", /// + "`psd'", /// + "`ivar'", /// + "`tvar'", /// + "`tindex'", /// + `tdelta', /// + "`b'", /// + "`b0'", /// + `center', /// + `dofminus', /// + `useqr') + + mat `b'=r(beta) + mat `S'=r(S) + mat `W'=r(W) + mat `V'=r(V) + scalar `j'=r(j) + scalar `rss'=r(rss) + scalar `sigmasq'=r(sigmasq) + scalar `rankV'=r(rankV) + scalar `rankS'=r(rankS) + + } + +**************************************************************** +* Done with estimation blocks +**************************************************************** + + mat colnames `b' = `cnb1' + mat colnames `V' = `cnb1' + mat rownames `V' = `cnb1' + mat colnames `S' = `cnZ1' + mat rownames `S' = `cnZ1' +* No W matrix for LIML or kclass + capture mat colnames `W' = `cnZ1' + capture mat rownames `W' = `cnZ1' + +******************************************************************************************* +* RSS, counts, dofs, F-stat, small-sample corrections +******************************************************************************************* + +// rankxx = rhs1_ct except if nocollin +// rankzz = iv1_ct except if nocollin +// nocollin means count may exceed rank (because of dropped vars), so rank #s foolproof + scalar `rmse'=sqrt(`sigmasq') + if "`noconstant'"=="" { + scalar `mss'=`yyc' - `rss' + } + else { + scalar `mss'=`yy' - `rss' + } + + local Fdf1 = `rankxx' - `cons' + local df_m = `rankxx' - `cons' + (`sdofminus'-`partialcons') + +* Residual dof + if "`cluster'"=="" { +* Use int(`N') because of non-integer N with iweights, and also because of +* possible numeric imprecision with N returned by above. + local df_r = int(`N') - `rankxx' - `dofminus' - `sdofminus' + } + else { +* To match Stata, subtract 1 + local df_r = `N_clust' - 1 + } + +* Sargan-Hansen J dof and p-value +* df=0 doesn't guarantee j=0 since can be call to get value of CUE obj fn + local jdf = `rankzz' - `rankxx' + if `jdf' == 0 & "`b0'"=="" { + scalar `j' = 0 + } + else { + scalar `jp' = chiprob(`jdf',`j') + } + if "`liml'"~="" { + scalar `arubinp' = chiprob(`jdf',`arubin') + scalar `arubin_linp' = chiprob(`jdf',`arubin_lin') + } + +* Small sample corrections for var-cov matrix. +* If robust, the finite sample correction is N/(N-K), and with no small +* we change this to 1 (a la Davidson & MacKinnon 1993, p. 554, HC0). +* If cluster, the finite sample correction is (N-1)/(N-K)*M/(M-1), and with no small +* we change this to 1 (a la Wooldridge 2002, p. 193), where M=number of clusters. + + if "`small'" != "" { + if "`cluster'"=="" { + matrix `V'=`V'*(`N'-`dofminus')/(`N'-`rankxx'-`dofminus'-`sdofminus') + } + else { + matrix `V'=`V'*(`N'-1)/(`N'-`rankxx'-`sdofminus') /// + * `N_clust'/(`N_clust'-1) + } + scalar `sigmasq'=`rss'/(`N'-`rankxx'-`dofminus'-`sdofminus') + scalar `rmse'=sqrt(`sigmasq') + } + + scalar `r2u'=1-`rss'/`yy' + scalar `r2c'=1-`rss'/`yyc' + if "`noconstant'"=="" { + scalar `r2'=`r2c' + scalar `r2_a'=1-(1-`r2')*(`N'-1)/(`N'-`rankxx'-`dofminus'-`sdofminus') + } + else { + scalar `r2'=`r2u' + scalar `r2_a'=1-(1-`r2')*`N'/(`N'-`rankxx'-`dofminus'-`sdofminus') + } +* `N' is rounded down to nearest integer if iweights are used. +* If aw, pw or fw, should already be integer but use round in case of numerical imprecision. + local N=int(`N') + +* Fstat +* To get it to match Stata's, must post separately with dofs and then do F stat by hand +* in case weights generate non-integer obs and dofs +* Create copies so they can be posted + tempname FB FV + mat `FB'=`b' + mat `FV'=`V' + capture ereturn post `FB' `FV' +* If the cov matrix wasn't positive definite, the post fails with error code 506 + local rc = _rc + if `rc' != 506 { +* Strip out omitted/base/etc. vars from RHS list + ivreg2_fvstrip `rhs1', dropomit + capture test `r(varlist)' + if "`small'" == "" { + if "`cluster'"=="" { + capture scalar `F' = r(chi2)/`Fdf1' * `df_r'/(`N'-`dofminus') + } + else { +* sdofminus used here so that F-stat matches test stat from regression with no partial and small + capture scalar `F' = r(chi2)/`Fdf1' * /// + (`N_clust'-1)/`N_clust' * /// + (`N'-`rankxx'-`sdofminus')/(`N'-1) + } + } + else { + capture scalar `F' = r(chi2)/`Fdf1' + } + capture scalar `Fp'=Ftail(`Fdf1',`df_r',`F') + capture scalar `Fdf2'=`df_r' + } + +* If j==. or vcv wasn't full rank, then vcv problems and F is meaningless + if `j' == . | `rc'==506 { + scalar `F' = . + scalar `Fp' = . + } + +* End of counts, dofs, F-stat, small sample corrections + +******************************************************************************************** +* Reduced form and first stage regression options +******************************************************************************************* +* Relies on proper count of (non-collinear) IVs generated earlier. +* Note that nocons option + constant in instrument list means first-stage +* regressions are reported with nocons option. First-stage F-stat therefore +* correctly includes the constant as an explanatory variable. + + if "`sfirst'`savesfirst'`rf'`saverf'`first'`ffirst'`savefirst'" != "" & (`endo1_ct' > 0) { + +* Restore original order if changed for mata code above + capture tsset + + local sdofmopt = "sdofminus(`sdofminus')" +// Need to create Stata placeholders for Mata code so that Stata time-series operators can work on them +// fres1 is Nx1 +// endo1_hat is NxK1 +// fsresall is Nx(K1+1) (used for full system) + tempname fsres1 + qui gen double `fsres1'=. + local fsresall `fsres1' + foreach x of local fv_endo1 { + tempname fsres + qui gen double `fsres'=. + local fsresall "`fsresall' `fsres'" + } + +// mata code requires sorting on cluster 3 / cluster 1 (if 2-way) or cluster 1 (if one-way) + if "`cluster'"!="" { + sort `clusterid3' `cluster1' + } + mata: s_ffirst( "`ZZ'", /// + "`XX'", /// + "`XZ'", /// + "`ZY'", /// + "`ZZinv'", /// + "`XXinv'", /// + "`XPZXinv'", /// + "`Z2Z2'", /// + "`Z1Z2'", /// + "`Z2y'", /// + "`fsres1'", /// Nx1 + "`fsresall'", /// Nx(K1+1) + "`fv_lhs1'", /// + "`fv_endo1'", /// + "`fv_inexog1' `ones'", /// + "`fv_exexog1'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + `N_clust', /// + "`robust'", /// + "`clusterid1'", /// + "`clusterid2'", /// + "`clusterid3'", /// + `bw', /// + "`kernel'", /// + "`sw'", /// + "`psd'", /// + "`ivar'", /// + "`tvar'", /// + "`tindex'", /// + `tdelta', /// + `center', /// + `dofminus', /// + `sdofminus') + + tempname firstmat firstb firstv firsts + mat `firstmat' = r(firstmat) + mat rowname `firstmat' = rmse sheapr2 pr2 F df df_r pvalue /// + SWF SWFdf1 SWFdf2 SWFp SWchi2 SWchi2p SWr2 /// + APF APFdf1 APFdf2 APFp APchi2 APchi2p APr2 + mat colname `firstmat' = `endo1' + mat `firstb' = r(b) + mat `firstv' = r(V) + mat `firsts' = r(S) + local archi2 =r(archi2) + local archi2p =r(archi2p) + local arf =r(arf) + local arfp =r(arfp) + local ardf =r(ardf) + local ardf_r =r(ardf_r) + local sstat =r(sstat) + local sstatdf =r(sstatdf) + local sstatp =r(sstatp) + local rmse_rf =r(rmse_rf) + +* Restore original order if changed for mata code above + capture tsset +// System of first-stage/reduced form eqns + if "`sfirst'`savesfirst'" ~= "" { + PostFirstRF if `touse', /// + bmat(`firstb') /// + vmat(`firstv') /// + smat(`firsts') /// + firstmat(`firstmat') /// + lhs1(`lhs1') /// + endo1(`endo1') /// + znames0(`cnZ0') /// + znames1(`cnZ1') /// + bvclean(`bvclean') /// + fvops(`fvops') /// + partial_ct(`partial_ct') /// + `robust' /// + cluster(`cluster') /// + cluster1(`cluster1') /// + cluster2(`cluster2') /// + nc(`N_clust') /// + nc1(`N_clust1') /// + nc2(`N_clust2') /// + kernel(`kernel') /// + bw(`bw') /// + ivar(`ivar') /// + tvar(`tvar') /// + obs(`N') /// + iv1_ct(`iv1_ct') /// + cons(`cons') /// + partialcons(`partialcons') /// + dofminus(`dofminus') /// + sdofminus(`sdofminus') + local sfirsteq "`savesfprefix'sfirst_`lhs1'" + local sfirsteq : subinstr local sfirsteq "." "_" + capture est store `sfirsteq', title("System of first-stage/reduced form regressions") + if _rc > 0 { +di +di in ye "Unable to store system of first-stage reduced form regressions." +di + } + } + +// RF regression + if "`rf'`saverf'" ~= "" { + PostFirstRF if `touse', /// + rf /// extract RF regression as saved result + rmse_rf(`rmse_rf') /// provide RMSE for posting + bmat(`firstb') /// + vmat(`firstv') /// + smat(`firsts') /// + firstmat(`firstmat') /// + lhs1(`lhs1') /// + endo1(`endo1') /// + znames0(`cnZ0') /// + znames1(`cnZ1') /// + bvclean(`bvclean') /// + fvops(`fvops') /// + partial_ct(`partial_ct') /// + `robust' /// + cluster(`cluster') /// + cluster1(`cluster1') /// + cluster2(`cluster2') /// + nc(`N_clust') /// + nc1(`N_clust1') /// + nc2(`N_clust2') /// + kernel(`kernel') /// + bw(`bw') /// + ivar(`ivar') /// + tvar(`tvar') /// + obs(`N') /// + iv1_ct(`iv1_ct') /// + cons(`cons') /// + partialcons(`partialcons') /// + dofminus(`dofminus') /// + sdofminus(`sdofminus') + local rfeq "`saverfprefix'`lhs1'" + local rfeq : subinstr local rfeq "." "_" + capture est store `rfeq', title("Reduced-form regression: `lhs'") + if _rc > 0 { +di +di in ye "Unable to store reduced form regression of `lhs1'." +di + } + } + +// Individual first-stage equations + if "`first'`savefirst'" ~= "" { + foreach vn in `endo1' { + + PostFirstRF if `touse', /// + first(`vn') /// extract first-stage regression + bmat(`firstb') /// + vmat(`firstv') /// + smat(`firsts') /// + firstmat(`firstmat') /// + lhs1(`lhs1') /// + endo1(`endo1') /// + znames0(`cnZ0') /// + znames1(`cnZ1') /// + bvclean(`bvclean') /// + fvops(`fvops') /// + partial_ct(`partial_ct') /// + `robust' /// + cluster(`cluster') /// + cluster1(`cluster1') /// + cluster2(`cluster2') /// + nc(`N_clust') /// + nc1(`N_clust1') /// + nc2(`N_clust2') /// + kernel(`kernel') /// + bw(`bw') /// + ivar(`ivar') /// + tvar(`tvar') /// + obs(`N') /// + iv1_ct(`iv1_ct') /// + cons(`cons') /// + partialcons(`partialcons') /// + dofminus(`dofminus') /// + sdofminus(`sdofminus') + local eqname "`savefprefix'`vn'" + local eqname : subinstr local eqname "." "_" + capture est store `eqname', title("First-stage regression: `vn'") + if _rc == 0 { + local firsteqs "`firsteqs' `eqname'" + } + else { +di +di in ye "Unable to store first-stage regression of `vn'." +di + } + } + } + } +* End of RF and first-stage regression code + +******************************************************************************************* +* Re-tsset if necessary +************************************************************************************************ + + capture tsset + +******************************************************************************************* +* orthog option: C statistic (difference of Sargan statistics) +******************************************************************************************* +* Requires j dof from above + if "`orthog'"!="" { + tempname cj cstat cstatp +* Initialize cstat + scalar `cstat' = 0 +* Remove orthog from inexog and put in endo +* Remove orthog from exexog + local cexexog1 : list fv_exexog1 - fv_orthog1 + local cinexog1 : list fv_inexog1 - fv_orthog1 + local cendo1 : list fv_inexog1 - cinexog1 + local cendo1 `fv_endo1' `cendo1' + local clist_ct : word count `orthog1' + +* If robust, HAC/AC or GMM (but not LIML or IV), create optimal weighting matrix to pass to ivreg2 +* by extracting the submatrix from the full S and then inverting. +* This guarantees the C stat will be non-negative. See Hayashi (2000), p. 220. +* Calculate C statistic with recursive call to ivreg2 +* Collinearities may cause problems, hence -capture-. +* smatrix works generally, including homoskedastic case with Sargan stat + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } +* clopt is omitted because it requires calculation of numbers of clusters, which is done +* only when S matrix is calculated +* S matrix has final varnames, but need to call ivreg2 with temp vars +* so must rename cols/rows of S + tempname fv_S + mat `fv_S'=`S' + if `cons' { + mat colnames `fv_S' = `fv_exexog1' `fv_inexog1' _cons + mat rownames `fv_S' = `fv_exexog1' `fv_inexog1' _cons + } + else { + mat colnames `fv_S' = `fv_exexog1' `fv_inexog1' + mat rownames `fv_S' = `fv_exexog1' `fv_inexog1' + } + capture `ivreg2cmd' `fv_lhs1' /// + `cinexog1' /// + (`cendo1'=`cexexog1') /// + if `touse' /// + `wtexp', /// + `noconstant' /// + `options' /// + `small' /// + `robust' /// + `gmm2s' /// + `bwopt' /// + `kernopt' /// + `dofmopt' /// + `sw' /// + `psd' /// + smatrix("`fv_S'") /// + noid /// + nocollin + local rc = _rc + if `rc' == 481 { + scalar `cstat' = 0 + local cstatdf = 0 + } + else { + scalar `cj'=e(j) + local cjdf=e(jdf) + scalar `cstat' = `j' - `cj' + local cstatdf = `jdf' - `cjdf' + } + _estimates unhold `ivest' + scalar `cstatp'= chiprob(`cstatdf',`cstat') +* Collinearities may cause C-stat dof to differ from the number of variables in orthog() +* If so, set cstat=0 + if `cstatdf' != `clist_ct' { + scalar `cstat' = 0 + } + } +* End of orthog block + +******************************************************************************************* +* Endog option +******************************************************************************************* +* Uses recursive call with orthog + if "`endogtest'"!="" { + tempname estat estatp +* Initialize estat + scalar `estat' = 0 +* Remove endogtest vars from endo and put in inexog + local eendo1 : list fv_endo1 - fv_endogtest1 + local einexog1 `fv_inexog1' `fv_endogtest1' + local elist_ct : word count `endogtest1' + +* Recursive call to ivreg2 using orthog option to obtain endogeneity test statistic +* Collinearities may cause problems, hence -capture-. + capture { + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + capture `ivreg2cmd' `fv_lhs1' /// + `einexog1' /// + (`eendo1'=`fv_exexog1') /// + if `touse' /// + `wtexp', /// + `noconstant' /// + `robust' /// + `clopt' /// + `gmm2s' /// + `liml' /// + `bwopt' /// + `kernopt' /// + `small' /// + `dofmopt' /// + `sw' /// + `psd' /// + `options' /// + orthog(`fv_endogtest1') /// + noid /// + nocollin + local rc = _rc + if `rc' == 481 { + scalar `estat' = 0 + local estatdf = 0 + } + else { + scalar `estat'=e(cstat) + local estatdf=e(cstatdf) + scalar `estatp'=e(cstatp) + } + _estimates unhold `ivest' +* Collinearities may cause endog stat dof to differ from the number of variables in endog() +* If so, set estat=0 + if `estatdf' != `elist_ct' { + scalar `estat' = 0 + } + } +* End of endogeneity test block + } + +******************************************************************************************* +* Rank identification and redundancy block +******************************************************************************************* + if `endo1_ct' > 0 & "`noid'"=="" { + +// id=underidentification statistic, wid=weak identification statistic + tempname idrkstat widrkstat iddf idp + tempname ccf cdf rkf cceval cdeval cd + tempname idstat widstat + +// UNDERIDENTIFICATION +// Anderson canon corr underidentification statistic if homo, rk stat if not +// Need only id stat for testing full rank=(#cols-1) +// ranktest can exit with error if not full rank +// May not exit with error if e.g. ranktest (x y) (x w), +// i.e. collinearity across lists, so need to catch that. +// If no collinearity, can use iv1_ct and rhs1_ct etc. + cap `ranktestcmd' /// + (`fv_endo1') /// + (`fv_exexog1') /// + `wtexp' /// + if `touse', /// + partial(`fv_inexog1') /// + full /// + `noconstant' /// + `robust' /// + `clopt' /// + `bwopt' /// + `kernopt' +// Returned in e(.) macro: + local rkcmd `r(ranktestcmd)' + +// Canonical correlations returned in r(ccorr), sorted in descending order. +// If largest = 1, collinearities so enter error block. + local rkerror = _rc>0 | r(chi2)==. + if ~`rkerror' { + local rkerror = el(r(ccorr),1,1)==1 + } + if `rkerror' { +di as err "warning: -ranktest- error in calculating underidentification test statistics;" +di as err " may be caused by collinearities" + scalar `idstat' = . + local iddf = . + scalar `idp' = . + scalar `cd' = . + scalar `cdf' = . + } + else { + if "`cluster'"=="" { + scalar `idstat'=r(chi2)/r(N)*(`N'-`dofminus') + } + else { +// No dofminus adjustment needed for cluster-robust + scalar `idstat'=r(chi2) + } + mat `cceval'=r(ccorr) + mat `cdeval' = J(1,`endo1_ct',.) + forval i=1/`endo1_ct' { + mat `cceval'[1,`i'] = (`cceval'[1,`i'])^2 + mat `cdeval'[1,`i'] = `cceval'[1,`i'] / (1 - `cceval'[1,`i']) + } + local iddf = `iv1_ct' - (`rhs1_ct'-1) + scalar `idp' = chiprob(`iddf',`idstat') +// Cragg-Donald F statistic. +// Under homoskedasticity, Wald cd eigenvalue = cc/(1-cc) Anderson canon corr eigenvalue. + scalar `cd'=`cdeval'[1,`endo1_ct'] + scalar `cdf'=`cd'*(`N'-`sdofminus'-`iv1_ct'-`dofminus')/`exex1_ct' + } // end underidentification stat + +// WEAK IDENTIFICATION +// Weak id statistic is Cragg-Donald F stat, rk Wald F stat if not +// ranktest exits with error if not full rank so can use iv1_ct and rhs1_ct etc. + if "`robust'`cluster'`kernel'"=="" { + scalar `widstat'=`cdf' + } + else { +// Need only test of full rank + cap `ranktestcmd' /// + (`fv_endo1') /// + (`fv_exexog1') /// + `wtexp' /// + if `touse', /// + partial(`fv_inexog1') /// + full /// + wald /// + `noconstant' /// + `robust' /// + `clopt' /// + `bwopt' /// + `kernopt' +// Canonical correlations returned in r(ccorr), sorted in descending order. +// If largest = 1, collinearities so enter error block. + local rkerror = _rc>0 | r(chi2)==. + if ~`rkerror' { + local rkerror = el(r(ccorr),1,1)==1 + } + if `rkerror' { +di as err "warning: -ranktest- error in calculating weak identification test statistics;" +di as err " may be caused by collinearities" + scalar `rkf' = . + scalar `widstat' = . + } + else { +// sdofminus used here so that F-stat matches test stat from regression with no partial + if "`cluster'"=="" { + scalar `rkf'=r(chi2)/r(N)*(`N'-`iv1_ct'-`sdofminus'-`dofminus')/`exex1_ct' + } + else { + scalar `rkf' = r(chi2)/(`N'-1) * /// + (`N'-`iv1_ct'-`sdofminus') * /// + (`N_clust'-1)/`N_clust' / /// + `exex1_ct' + } + scalar `widstat'=`rkf' + } + } // end weak-identification stat + } // end under- and weak-identification stats + +* LM redundancy test + if `endo1_ct' > 0 & "`redundant'" ~= "" & "`noid'"=="" { +* Use K-P rk statistics and LM version of test +* Statistic is the rank of the matrix of Z_1B*X_2, where Z_1B are the possibly redundant +* instruments and X_1 are the endogenous regressors; both have X_2 (exogenous regressors) +* and Z_1A (maintained excluded instruments) partialled out. LM test of rank is +* is numerically equivalent to estimation of set of RF regressions and performing +* standard LM test of possibly redundant instruments. + + local rexexog1 : list fv_exexog1 - fv_redundant1 + local redlist_ct : word count `redundant1' +* LM version requires only -nullrank- rk statistics so would not need -all- option + tempname rkmatrix + qui `ranktestcmd' /// + (`fv_endo1') /// + (`fv_redundant1') /// + `wtexp' /// + if `touse', /// + partial(`fv_inexog1' `rexexog1') /// + null /// + `noconstant' /// + `robust' /// + `clopt' /// + `bwopt' /// + `kernopt' + mat `rkmatrix'=r(rkmatrix) + tempname redstat redp +* dof adjustment needed because it doesn't use the adjusted S + if "`cluster'"=="" { + scalar `redstat' = `rkmatrix'[1,1]/r(N)*(`N'-`dofminus') + } + else { +* No dofminus adjustment needed for cluster-robust + scalar `redstat' = `rkmatrix'[1,1] + } + local reddf = `endo1_ct'*`redlist_ct' + scalar `redp' = chiprob(`reddf',`redstat') + } + +* End of identification stats block + +******************************************************************************************* +* Error-checking block +******************************************************************************************* + +* Check if adequate number of observations + if `N' <= `iv1_ct' { +di in r "Error: number of observations must be greater than number of instruments" +di in r " including constant." + error 2001 + } + +* Check if robust VCV matrix is of full rank + if ("`gmm2s'`robust'`cluster'`kernel'" != "") & (`rankS' < `iv1_ct') { +* Robust covariance matrix not of full rank means either a singleton dummy or too few +* clusters (in which case the indiv SEs are OK but no F stat or 2-step GMM is possible), +* or there are too many AC/HAC-lags, or the HAC covariance estimator +* isn't positive definite (possible with truncated and Tukey-Hanning kernels) +* or nocollin option has been used. +* Previous versions of ivreg2 exited if 2-step GMM but beta and VCV may be OK. +* Continue but J, F, and C stat (if present) all possibly meaningless. +* Set j = missing so that problem can be reported in output. + scalar `j' = . + if "`orthog'"!="" { + scalar `cstat' = . + } + if "`endogtest'"!="" { + scalar `estat' = . + } + } + +* End of error-checking block + +********************************************************************************************** +* Post and display results. +******************************************************************************************* + +// rankV = rhs1_ct except if nocollin +// rankS = iv1_ct except if nocollin +// nocollin means count may exceed rank (because of dropped vars), so rank #s foolproof + +// Add back in omitted vars from "0" varlists unless bvclean requested +// or unless there are no omitted regressors that need adding back in. + if ~`bvclean' & (`rhs0_ct' > `rhs1_ct') { + AddOmitted, bmat(`b') vmat(`V') cnb0(`cnb0') cnb1(`cnb1') + mat `b' = r(b) + mat `V' = r(V) +// build fv info (base, empty, etc.) unless there was partialling out + if `fvops' & ~`partial_ct' { + local bfv "buildfvinfo" + } + } + +******************************************************************************************* + +// restore data if preserved for partial option + if `partial_ct' { + restore + } + + if "`small'"!="" { + local NminusK = `N'-`rankxx'-`sdofminus' + capture ereturn post `b' `V', dep(`depname') obs(`N') esample(`touse') dof(`NminusK') `bfv' + } + else { + capture ereturn post `b' `V', dep(`depname') obs(`N') esample(`touse') `bfv' + } + + local rc = _rc + if `rc' == 504 { +di in red "Error: estimated variance-covariance matrix has missing values" + exit 504 + } + if `rc' == 506 { +di in red "Error: estimated variance-covariance matrix not positive-definite" + exit 506 + } + if `rc' > 0 { +di in red "Error: estimation failed - could not post estimation results" + exit `rc' + } + + local mok =1 // default - margins OK + local mok = `mok' & ~`partial_ct' // but not if partialling out + local mok = `mok' & ~(`fvops' & `bvclean') // nor if there are FVs and the base vars are not in e(b) + if `mok' & `endo1_ct' { // margins can be used, endog regressors + ereturn local marginsnotok "Residuals SCores" // same as official -ivregress- + ereturn local marginsok "XB default" + } + else if `mok' & ~`endo1_ct' { // margins can be used, no endog regressors + ereturn local marginsok "XB default" // same as official -regress' + } + else { // don't allow margins + ereturn local marginsnotok "Residuals SCores XB default" + } + +// Original varlists without removed duplicates, collinears, etc. +// "0" varlists after removing duplicates and reclassifying vars, and including omitteds, FV base vars, etc. +// "1" varlists without omitted, FV base vars, and partialled-out vars + ereturn local ecollin `ecollin' + ereturn local collin `collin' + ereturn local dups `dups' + ereturn local partial1 `partial1' + ereturn local partial `partial' + ereturn local inexog1 `inexog1' + ereturn local inexog0 `inexog0' + ereturn local inexog `inexog' + ereturn local exexog1 `exexog1' + ereturn local exexog0 `exexog0' + ereturn local exexog `exexog' + ereturn local insts1 `exexog1' `inexog1' + ereturn local insts0 `exexog0' `inexog0' + ereturn local insts `exexog' `inexog' + ereturn local instd1 `endo1' + ereturn local instd0 `endo0' + ereturn local instd `endo' + ereturn local depvar1 `lhs1' + ereturn local depvar0 `lhs0' + ereturn local depvar `lhs' + + ereturn scalar inexog_ct =`inexog1_ct' + ereturn scalar exexog_ct =`exex1_ct' + ereturn scalar endog_ct =`endo1_ct' + ereturn scalar partial_ct =`partial_ct' + + if "`smatrix'" == "" { + ereturn matrix S `S' + } + else { + ereturn matrix S `S0' // it's a copy so original won't be zapped + } + +* No weighting matrix defined for LIML and kclass + if "`wmatrix'"=="" & "`liml'`kclassopt'"=="" { + ereturn matrix W `W' + } + else if "`liml'`kclassopt'"=="" { + ereturn matrix W `wmatrix' // it's a copy so original won't be zapped + } + + if "`kernel'"!="" { + ereturn local kernel "`kernel'" + ereturn scalar bw=`bw' + ereturn local tvar "`tvar'" + if "`ivar'" ~= "" { + ereturn local ivar "`ivar'" + } + if "`bwchoice'" ~= "" { + ereturn local bwchoice "`bwchoice'" + } + } + + if "`small'"!="" { + ereturn scalar df_r=`df_r' + ereturn local small "small" + } + if "`nopartialsmall'"=="" { + ereturn local partialsmall "small" + } + + + if "`robust'" != "" { + local vce "robust" + } + if "`cluster1'" != "" { + if "`cluster2'"=="" { + local vce "`vce' cluster" + } + else { + local vce "`vce' two-way cluster" + } + } + if "`kernel'" != "" { + if "`robust'" != "" { + local vce "`vce' hac" + } + else { + local vce "`vce' ac" + } + local vce "`vce' `kernel' bw=`bw'" + } + if "`sw'" != "" { + local vce "`vce' sw" + } + if "`psd'" != "" { + local vce "`vce' `psd'" + } + local vce : list clean vce + local vce = lower("`vce'") + ereturn local vce `vce' + + if "`cluster'"!="" { + ereturn scalar N_clust=`N_clust' + ereturn local clustvar `cluster' + } + if "`cluster2'"!="" { + ereturn scalar N_clust1=`N_clust1' + ereturn scalar N_clust2=`N_clust2' + ereturn local clustvar1 `cluster1' + ereturn local clustvar2 `cluster2' + } + + if "`robust'`cluster'" != "" { + ereturn local vcetype "Robust" + } + + ereturn scalar df_m=`df_m' + ereturn scalar sdofminus=`sdofminus' + ereturn scalar dofminus=`dofminus' + ereturn scalar center=`center' + ereturn scalar r2=`r2' + ereturn scalar rmse=`rmse' + ereturn scalar rss=`rss' + ereturn scalar mss=`mss' + ereturn scalar r2_a=`r2_a' + ereturn scalar F=`F' + ereturn scalar Fp=`Fp' + ereturn scalar Fdf1=`Fdf1' + ereturn scalar Fdf2=`Fdf2' + ereturn scalar yy=`yy' + ereturn scalar yyc=`yyc' + ereturn scalar r2u=`r2u' + ereturn scalar r2c=`r2c' + ereturn scalar condzz=`condzz' + ereturn scalar condxx=`condxx' + ereturn scalar rankzz=`rankzz' + ereturn scalar rankxx=`rankxx' + ereturn scalar rankS=`rankS' + ereturn scalar rankV=`rankV' + ereturn scalar ll = -0.5 * (`N'*ln(2*_pi) + `N'*ln(`rss'/`N') + `N') + +* Always save J. Also save as Sargan if homoskedastic; save A-R if LIML. + ereturn scalar j=`j' + ereturn scalar jdf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar jp=`jp' + } + if ("`robust'`cluster'"=="") { + ereturn scalar sargan=`j' + ereturn scalar sargandf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar sarganp=`jp' + } + } + if "`liml'"!="" { + ereturn scalar arubin=`arubin' + ereturn scalar arubin_lin=`arubin_lin' + if `j' != 0 & `j' != . { + ereturn scalar arubinp=`arubinp' + ereturn scalar arubin_linp=`arubin_linp' + } + ereturn scalar arubindf=`jdf' + } + + if "`orthog'"!="" { + ereturn scalar cstat=`cstat' + if `cstat'!=0 & `cstat' != . { + ereturn scalar cstatp=`cstatp' + ereturn scalar cstatdf=`cstatdf' + ereturn local clist `orthog1' + } + } + + if "`endogtest'"!="" { + ereturn scalar estat=`estat' + if `estat'!=0 & `estat' != . { + ereturn scalar estatp=`estatp' + ereturn scalar estatdf=`estatdf' + ereturn local elist `endogtest1' + } + } + + if `endo1_ct' > 0 & "`noid'"=="" { + ereturn scalar idstat=`idstat' + ereturn scalar iddf=`iddf' + ereturn scalar idp=`idp' + ereturn scalar cd=`cd' + ereturn scalar widstat=`widstat' + ereturn scalar cdf=`cdf' + capture ereturn matrix ccev=`cceval' + capture ereturn matrix cdev `cdeval' + capture ereturn scalar rkf=`rkf' + } + + if "`redundant'"!="" & "`noid'"=="" { + ereturn scalar redstat=`redstat' + ereturn scalar redp=`redp' + ereturn scalar reddf=`reddf' + ereturn local redlist `redundant1' + } + + if "`first'`ffirst'`savefirst'`sfirst'`savesfirst'" != "" & `endo1_ct'>0 { +// Capture here because firstmat may be empty if mvs encountered in 1st stage regressions + capture ereturn matrix first `firstmat' + ereturn scalar arf=`arf' + ereturn scalar arfp=`arfp' + ereturn scalar archi2=`archi2' + ereturn scalar archi2p=`archi2p' + ereturn scalar ardf=`ardf' + ereturn scalar ardf_r=`ardf_r' + ereturn scalar sstat=`sstat' + ereturn scalar sstatp=`sstatp' + ereturn scalar sstatdf=`sstatdf' + } +// not saved if empty + ereturn local firsteqs `firsteqs' + ereturn local rfeq `rfeq' + ereturn local sfirsteq `sfirsteq' + + if "`liml'"!="" { + ereturn local model "liml" + ereturn scalar kclass=`kclass' + ereturn scalar lambda=`lambda' + if `fuller' > 0 & `fuller' < . { + ereturn scalar fuller=`fuller' + } + } + else if "`kclassopt'" != "" { + ereturn local model "kclass" + ereturn scalar kclass=`kclass' + } + else if "`gmm2s'`cue'`b0'`wmatrix'"=="" { + if "`endo1'" == "" { + ereturn local model "ols" + } + else { + ereturn local model "iv" + } + } + else if "`cue'`b0'"~="" { + ereturn local model "cue" + } + else if "`gmm2s'"~="" { + ereturn local model "gmm2s" + } + else if "`wmatrix'"~="" { + ereturn local model "gmmw" + } + else { +* Should never enter here + ereturn local model "unknown" + } + + if "`weight'" != "" { + ereturn local wexp "=`exp'" + ereturn local wtype `weight' + } + ereturn local cmd `ivreg2cmd' + ereturn local ranktestcmd `rkcmd' + ereturn local version `lversion' + ereturn scalar nocollin =("`nocollin'"~="") + ereturn scalar partialcons =`partialcons' + ereturn scalar cons =`cons' + + ereturn local predict "`ivreg2cmd'_p" + + if "`e(model)'"=="gmm2s" & "`wmatrix'"=="" { + local title2 "2-Step GMM estimation" + } + else if "`e(model)'"=="gmm2s" & "`wmatrix'"~="" { + local title2 "2-Step GMM estimation with user-supplied first-step weighting matrix" + } + else if "`e(model)'"=="gmmw" { + local title2 "GMM estimation with user-supplied weighting matrix" + } + else if "`e(model)'"=="cue" & "`b0'"=="" { + local title2 "CUE estimation" + } + else if "`e(model)'"=="cue" & "`b0'"~="" { + local title2 "CUE evaluated at user-supplied parameter vector" + } + else if "`e(model)'"=="ols" { + local title2 "OLS estimation" + } + else if "`e(model)'"=="iv" { + local title2 "IV (2SLS) estimation" + } + else if "`e(model)'"=="liml" { + local title2 "LIML estimation" + } + else if "`e(model)'"=="kclass" { + local title2 "k-class estimation" + } + else { +* Should never reach here + local title2 "unknown estimation" + } + if "`e(vcetype)'" == "Robust" { + local hacsubtitle1 "heteroskedasticity" + } + if "`e(kernel)'"!="" & "`e(clustvar)'"=="" { + local hacsubtitle3 "autocorrelation" + } + if "`kiefer'"!="" { + local hacsubtitle3 "within-cluster autocorrelation (Kiefer)" + } + if "`e(clustvar)'"!="" { + if "`e(clustvar2)'"=="" { + local hacsubtitle3 "clustering on `e(clustvar)'" + } + else { + local hacsubtitle3 "clustering on `e(clustvar1)' and `e(clustvar2)'" + } + if "`e(kernel)'" != "" { + local hacsubtitle4 "and kernel-robust to common correlated disturbances (Driscoll-Kraay)" + } + } + if "`hacsubtitle1'"~="" & "`hacsubtitle3'" ~= "" { + local hacsubtitle2 " and " + } + if "`title'"=="" { + ereturn local title "`title1'`title2'" + } + else { + ereturn local title "`title'" + } + if "`subtitle'"~="" { + ereturn local subtitle "`subtitle'" + } + local hacsubtitle "`hacsubtitle1'`hacsubtitle2'`hacsubtitle3'" + if "`b0'"~="" { + ereturn local hacsubtitleB "Estimates based on supplied parameter vector" + } + else if "`hacsubtitle'"~="" & "`gmm2s'`cue'"~="" { + ereturn local hacsubtitleB "Estimates efficient for arbitrary `hacsubtitle'" + } + else if "`wmatrix'"~="" { + ereturn local hacsubtitleB "Efficiency of estimates dependent on weighting matrix" + } + else { + ereturn local hacsubtitleB "Estimates efficient for homoskedasticity only" + } + if "`hacsubtitle'"~="" { + ereturn local hacsubtitleV "Statistics robust to `hacsubtitle'" + } + else { + ereturn local hacsubtitleV "Statistics consistent for homoskedasticity only" + } + if "`hacsubtitle4'"~="" { + ereturn local hacsubtitleV2 "`hacsubtitle4'" + } + if "`sw'"~="" { + ereturn local hacsubtitleV "Stock-Watson heteroskedastic-robust statistics (BETA VERSION)" + } + } + +******************************************************************************************* +* Display results unless ivreg2 called just to generate stats or nooutput option + + if "`nooutput'" == "" { + +// Display supplementary first-stage/RF results + if "`savesfirst'`saverf'`savefirst'" != "" { + DispStored `"`savesfirst'"' `"`saverf'"' `"`savefirst'"' + } + if "`rf'" != "" { + local eqname "`e(rfeq)'" + tempname ivest + _estimates hold `ivest', copy + capture estimates restore `eqname' + if _rc != 0 { +di +di in ye "Unable to display stored reduced form estimation." +di + } + else { + DispSFirst "rf" `"`plus'"' `"`level'"' `"`nofooter'"' `"`ivreg2name'"' "`dispopt'" + } + _estimates unhold `ivest' + } + if "`first'" != "" { + DispFirst `"`ivreg2name'"' + } + if "`sfirst'"!="" { + local eqname "`e(sfirsteq)'" + tempname ivest + _estimates hold `ivest', copy + capture estimates restore `eqname' + if _rc != 0 { +di +di in ye "Unable to display stored first-stage/reduced form estimations." +di + } + else { + DispSFirst "sfirst" `"`plus'"' `"`level'"' `"`nofooter'"' `"`ivreg2name'"' "`dispopt'" + } + _estimates unhold `ivest' + } + if "`first'`ffirst'`sfirst'" != "" { + DispFFirst `"`ivreg2name'"' + } + +// Display main output. Can be standard ivreg2, or first-stage-type results + if "`e(model)'"=="first" | "`e(model)'"=="rf" | "`e(model)'"=="sfirst" { + DispSFirst "`e(model)'" `"`plus'"' `"`level'"' `"`nofooter'"' `"`ivreg2name'"' "`dispopt'" + } + else { + DispMain `"`noheader'"' `"`plus'"' `"`level'"' `"`nofooter'"' `"`ivreg2name'"' "`dispopt'" + } + } + +// Drop first stage estimations unless explicitly saved or if replay + if "`savefirst'" == "" { + local firsteqs "`e(firsteqs)'" + foreach eqname of local firsteqs { + capture estimates drop `eqname' + } + ereturn local firsteqs + } +// Drop reduced form estimation unless explicitly saved or if replay + if "`saverf'" == "" { + local eqname "`e(rfeq)'" + capture estimates drop `eqname' + ereturn local rfeq + } +// Drop first stage/reduced form estimation unless explicitly saved or if replay + if "`savesfirst'" == "" { + local eqname "`e(sfirsteq)'" + capture estimates drop `eqname' + ereturn local sfirsteq + } + +end + +******************************************************************************************* +* SUBROUTINES +******************************************************************************************* + +// ************* Display system of or single first-stage and/or RF estimations ************ // + +program define DispSFirst, eclass + args model plus level nofooter helpfile dispopt + version 11.2 + +di + if "`model'"=="first" { +di in gr "First-stage regression of `e(depvar)':" + } + else if "`model'"=="rf" { + local strlen = length("`e(depvar)'")+25 +di in gr "Reduced-form regression: `e(depvar)'" +di in smcl in gr "{hline `strlen'}" + } + else if "`model'"=="sfirst" { +di in gr "System of first-stage/reduced-form regressions:" +di in smcl in gr "{hline 47}" + } + +// Display coefficients etc. +// Header info + if "`e(hacsubtitleV)'" ~= "" { +di in gr _n "`e(hacsubtitleV)'" + } + if "`e(hacsubtitleV2)'" ~= "" { +di in gr "`e(hacsubtitleV2)'" + } +di in gr "Number of obs = " _col(31) in ye %8.0f e(N) + if "`e(kernel)'"!="" { +di in gr " kernel=`e(kernel)'; bandwidth=" `e(bw)' + if "`e(bwchoice)'"!="" { +di in gr " `e(bwchoice)'" + } +di in gr " time variable (t): " in ye e(tvar) + if "`e(ivar)'" != "" { +di in gr " group variable (i): " in ye e(ivar) + } + } + if "`e(clustvar)'"!="" { + if "`e(clustvar2)'"=="" { + local N_clust `e(N_clust)' + local clustvar `e(clustvar)' + } + else { + local N_clust `e(N_clust1)' + local clustvar `e(clustvar1)' + } +di in gr "Number of clusters (`clustvar') = " _col(33) in ye %6.0f `N_clust' + } + if "`e(clustvar2)'"!="" { +di in gr "Number of clusters (" "`e(clustvar2)'" ") = " _col(33) in ye %6.0f e(N_clust2) + } + +// Unfortunate but necessary hack here: to suppress message about cluster adjustment of +// standard error, clear e(clustvar) and then reset it after display + local cluster `e(clustvar)' + ereturn local clustvar + +// Display output + ereturn display, `plus' level(`level') `dispopt' + ereturn local clustvar `cluster' + +end + +// ************* Display main estimation outpout ************** // + +program define DispMain, eclass + args noheader plus level nofooter helpfile dispopt + version 11.2 +* Prepare for problem resulting from rank(S) being insufficient +* Results from insuff number of clusters, too many lags in HAC, +* to calculate robust S matrix, HAC matrix not PD, singleton dummy, +* and indicated by missing value for j stat +* Macro `rprob' is either 1 (problem) or 0 (no problem) + capture local rprob ("`e(j)'"==".") + + if "`noheader'"=="" { + if "`e(title)'" ~= "" { +di in gr _n "`e(title)'" + local tlen=length("`e(title)'") +di in gr "{hline `tlen'}" + } + if "`e(subtitle)'" ~= "" { +di in gr "`e(subtitle)'" + } + if "`e(model)'"=="liml" | "`e(model)'"=="kclass" { +di in gr "k =" %7.5f `e(kclass)' + } + if "`e(model)'"=="liml" { +di in gr "lambda =" %7.5f `e(lambda)' + } + if e(fuller) > 0 & e(fuller) < . { +di in gr "Fuller parameter=" %-5.0f `e(fuller)' + } + if "`e(hacsubtitleB)'" ~= "" { +di in gr _n "`e(hacsubtitleB)'" _c + } + if "`e(hacsubtitleV)'" ~= "" { +di in gr _n "`e(hacsubtitleV)'" + } + if "`e(hacsubtitleV2)'" ~= "" { +di in gr "`e(hacsubtitleV2)'" + } + if "`e(kernel)'"!="" { +di in gr " kernel=`e(kernel)'; bandwidth=" `e(bw)' + if "`e(bwchoice)'"!="" { +di in gr " `e(bwchoice)'" + } +di in gr " time variable (t): " in ye e(tvar) + if "`e(ivar)'" != "" { +di in gr " group variable (i): " in ye e(ivar) + } + } + di + if "`e(clustvar)'"!="" { + if "`e(clustvar2)'"=="" { + local N_clust `e(N_clust)' + local clustvar `e(clustvar)' + } + else { + local N_clust `e(N_clust1)' + local clustvar `e(clustvar1)' + } +di in gr "Number of clusters (`clustvar') = " _col(33) in ye %6.0f `N_clust' _continue + } +di in gr _col(55) "Number of obs = " in ye %8.0f e(N) + if "`e(clustvar2)'"!="" { +di in gr "Number of clusters (" "`e(clustvar2)'" ") = " _col(33) in ye %6.0f e(N_clust2) _continue + } +di in gr _c _col(55) "F(" %3.0f e(Fdf1) "," %6.0f e(Fdf2) ") = " + if e(F) < 99999 { +di in ye %8.2f e(F) + } + else { +di in ye %8.2e e(F) + } +di in gr _col(55) "Prob > F = " in ye %8.4f e(Fp) + +di in gr "Total (centered) SS = " in ye %12.0g e(yyc) _continue +di in gr _col(55) "Centered R2 = " in ye %8.4f e(r2c) +di in gr "Total (uncentered) SS = " in ye %12.0g e(yy) _continue +di in gr _col(55) "Uncentered R2 = " in ye %8.4f e(r2u) +di in gr "Residual SS = " in ye %12.0g e(rss) _continue +di in gr _col(55) "Root MSE = " in ye %8.4g e(rmse) +di + } + +* Display coefficients etc. +* Unfortunate but necessary hack here: to suppress message about cluster adjustment of +* standard error, clear e(clustvar) and then reset it after display + local cluster `e(clustvar)' + ereturn local clustvar + ereturn display, `plus' level(`level') `dispopt' + ereturn local clustvar `cluster' + +* Display 1st footer with identification stats +* Footer not displayed if -nofooter- option or if pure OLS, i.e., model="ols" and Sargan-Hansen=0 + if ~("`nofooter'"~="" | (e(model)=="ols" & (e(sargan)==0 | e(j)==0))) { + +* Under ID test + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##idtest:Underidentification test}" + if "`e(vcetype)'`e(kernel)'"=="" { +di in gr _c " (Anderson canon. corr. LM statistic):" + } + else { +di in gr _c " (Kleibergen-Paap rk LM statistic):" + } +di in ye _col(71) %8.3f e(idstat) +di in gr _col(52) "Chi-sq(" in ye e(iddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(idp) +* IV redundancy statistic + if "`e(redlist)'"!="" { +di in gr "-redundant- option:" +di in smcl _c "{help `helpfile'##redtest:IV redundancy test}" +di in gr _c " (LM test of redundancy of specified instruments):" +di in ye _col(71) %8.3f e(redstat) +di in gr _col(52) "Chi-sq(" in ye e(reddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(redp) +di in gr "Instruments tested: " _c + Disp `e(redlist)', _col(23) + } +di in smcl in gr "{hline 78}" + } +* Report Cragg-Donald statistic + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##widtest:Weak identification test}" +di in gr " (Cragg-Donald Wald F statistic):" in ye _col(71) %8.3f e(cdf) + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr " (Kleibergen-Paap rk Wald F statistic):" in ye _col(71) %8.3f e(widstat) + } +di in gr _c "Stock-Yogo weak ID test critical values:" + Disp_cdsy, model(`e(model)') k2(`e(exexog_ct)') nendog(`e(endog_ct)') fuller("`e(fuller)'") col1(42) col2(73) + if `r(cdmissing)' { + di in gr _col(64) "" + } + else { + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." + } + } + di in smcl in gr "{hline 78}" + } + +* Report either (a) Sargan-Hansen-C stats, or (b) robust covariance matrix problem +* e(model)="gmmw" means user-supplied weighting matrix and Hansen J using 2nd-step resids reported + if `rprob' == 0 { +* Display overid statistic + if "`e(vcetype)'" == "Robust" | "`e(model)'" == "gmmw" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } + else { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } +di in ye _col(71) %8.3f e(j) + if e(jdf) { +di in gr _col(52) "Chi-sq(" in ye e(jdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(jp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + +* Display orthog option: C statistic (difference of Sargan statistics) + if e(cstat) != . { +* If C-stat = 0 then warn, otherwise output + if e(cstat) > 0 { +di in gr "-orthog- option:" + if "`e(vcetype)'" == "Robust" { +di in gr _c "Hansen J statistic (eqn. excluding suspect orthog. conditions): " + } + else { +di in gr _c "Sargan statistic (eqn. excluding suspect orthogonality conditions):" + } +di in ye _col(71) %8.3f e(j)-e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(jdf)-e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f chiprob(e(jdf)-e(cstatdf),e(j)-e(cstat)) +di in smcl _c "{help `helpfile'##ctest:C statistic}" +di in gr _c " (exogeneity/orthogonality of suspect instruments): " +di in ye _col(71) %8.3f e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f e(cstatp) +di in gr "Instruments tested: " _c + Disp `e(clist)', _col(23) + } + if e(cstat) == 0 { +di in gr _n "Collinearity/identification problems in eqn. excl. suspect orthog. conditions:" +di in gr " C statistic not calculated for -orthog- option" + } + } + } + else { +* Problem exists with robust VCV - notify and list possible causes +di in r "Warning: estimated covariance matrix of moment conditions not of full rank." + if e(j)==. { +di in r " overidentification statistic not reported, and standard errors and" + } +di in r " model tests should be interpreted with caution." +di in r "Possible causes:" + if e(nocollin) { +di in r " collinearities in regressors or instruments (with -nocollin- option)" + } + if "`e(N_clust)'" != "" { +di in r " number of clusters insufficient to calculate robust covariance matrix" + } + if "`e(kernel)'" != "" { +di in r " covariance matrix of moment conditions not positive definite" +di in r " covariance matrix uses too many lags" + } +di in r " singleton dummy variable (dummy with one 1 and N-1 0s or vice versa)" +di in r in smcl _c "{help `helpfile'##partial:partial}" +di in r " option may address problem." + } + +* Display endog option: endogeneity test statistic + if e(estat) != . { +* If stat = 0 then warn, otherwise output + if e(estat) > 0 { +di in gr "-endog- option:" +di in smcl _c "{help `helpfile'##endogtest:Endogeneity test}" +di in gr _c " of endogenous regressors: " +di in ye _col(71) %8.3f e(estat) +di in gr _col(52) "Chi-sq(" in ye e(estatdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(estatp) +di in gr "Regressors tested: " _c + Disp `e(elist)', _col(23) + } + if e(estat) == 0 { +di in gr _n "Collinearity/identification problems in restricted equation:" +di in gr " Endogeneity test statistic not calculated for -endog- option" + } + } + + di in smcl in gr "{hline 78}" +* Display AR overid statistic if LIML and not robust + if "`e(model)'" == "liml" & "`e(vcetype)'" ~= "Robust" & "`e(kernel)'" == "" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (LR test of excluded instruments):" + } +di in ye _col(72) %7.3f e(arubin) + if e(arubindf) { +di in gr _col(52) "Chi-sq(" in ye e(arubindf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(arubinp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + di in smcl in gr "{hline 78}" + } + } + +* Display 2nd footer with variable lists + if "`nofooter'"=="" { + +* Warn about dropped instruments if any +* Can happen with nocollin option and rank(S) < cols(S) + if colsof(e(S)) > e(rankzz) { +di in gr "Collinearities detected among instruments: " _c +di in gr colsof(e(S))-e(rankzz) " instrument(s) dropped" + } + + if "`e(collin)'`e(dups)'" != "" | e(partial_ct) { +* If collinearities, duplicates or partial, abbreviated varlists saved with a 1 at the end + local one "1" + } + if e(endog_ct) { + di in gr "Instrumented:" _c + Disp `e(instd`one')', _col(23) + } + if e(inexog_ct) { + di in gr "Included instruments:" _c + Disp `e(inexog`one')', _col(23) + } + if e(exexog_ct) { + di in gr "Excluded instruments:" _c + Disp `e(exexog`one')', _col(23) + } + if e(partial_ct) { + if e(partialcons) { + local partial "`e(partial`one')' _cons" + } + else { + local partial "`e(partial`one')'" + } +di in smcl _c "{help `helpfile'##partial:Partialled-out}" + di in gr ":" _c + Disp `partial', _col(23) + if "`e(partialsmall)'"=="" { +di in gr _col(23) "nb: total SS, model F and R2s are after partialling-out;" +di in gr _col(23) " any {help `helpfile'##s_small:small-sample adjustments} do not include" +di in gr _col(23) " partialled-out variables in regressor count K" + } + else { +di in gr _col(23) "nb: total SS, model F and R2s are after partialling-out;" +di in gr _col(23) " any {help `helpfile'##s_small:small-sample adjustments} include partialled-out" +di in gr _col(23) " variables in regressor count K" + } + } + if "`e(dups)'" != "" { + di in gr "Duplicates:" _c + Disp `e(dups)', _col(23) + } + if "`e(collin)'" != "" { + di in gr "Dropped collinear:" _c + Disp `e(collin)', _col(23) + } + if "`e(ecollin)'" != "" { + di in gr "Reclassified as exog:" _c + Disp `e(ecollin)', _col(23) + } + di in smcl in gr "{hline 78}" + } +end + +************************************************************************************** + +// ************ Display collinearity and duplicates warning messages ************ // + +program define DispCollinDups + version 11.2 + if "`e(dups)'" != "" { +di in gr "Warning - duplicate variables detected" +di in gr "Duplicates:" _c + Disp `e(dups)', _col(16) + } + if "`e(collin)'" != "" { +di in gr "Warning - collinearities detected" +di in gr "Vars dropped:" _c + Disp `e(collin)', _col(16) + } +end + +// ************* Display all first-stage estimations ************ // + +program define DispFirst + version 11.2 + args helpfile + tempname firstmat ivest sheapr2 pr2 F df df_r pvalue + tempname SWF SWFdf1 SWFdf2 SWFp SWr2 + + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display first-stage estimates; macro e(first) is missing" + exit + } +di in gr _newline "First-stage regressions" +di in smcl in gr "{hline 23}" +di + local endo1 : colnames(`firstmat') + local nrvars : word count `endo1' + local firsteqs "`e(firsteqs)'" + local nreqs : word count `firsteqs' + if `nreqs' < `nrvars' { +di in ye "Unable to display all first-stage regressions." +di in ye "There may be insufficient room to store results using -estimates store-," +di in ye "or names of endogenous regressors may be too long to store the results." +di in ye "Try dropping one or more estimation results using -estimates drop-," +di in ye "using the -savefprefix- option, or using shorter variable names." +di + } + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + foreach eqname of local firsteqs { + _estimates hold `ivest' + capture estimates restore `eqname' + if _rc != 0 { +di +di in ye "Unable to list stored estimation `eqname'." +di in ye "There may be insufficient room to store results using -estimates store-," +di in ye "or names of endogenous regressors may be too long to store the results." +di in ye "Try dropping one or more estimation results using -estimates drop-," +di in ye "using the -savefprefix- option, or using shorter variable names." +di + } + else { + local vn "`e(depvar)'" + estimates replay `eqname', noheader + mat `sheapr2' =`firstmat'["sheapr2","`vn'"] + mat `pr2' =`firstmat'["pr2","`vn'"] + mat `F' =`firstmat'["F","`vn'"] + mat `df' =`firstmat'["df","`vn'"] + mat `df_r' =`firstmat'["df_r","`vn'"] + mat `pvalue' =`firstmat'["pvalue","`vn'"] + mat `SWF' =`firstmat'["SWF","`vn'"] + mat `SWFdf1' =`firstmat'["SWFdf1","`vn'"] + mat `SWFdf2' =`firstmat'["SWFdf2","`vn'"] + mat `SWFp' =`firstmat'["SWFp","`vn'"] + mat `SWr2' =`firstmat'["SWr2","`vn'"] + +di in gr "F test of excluded instruments:" +di in gr " F(" %3.0f `df'[1,1] "," %6.0f `df_r'[1,1] ") = " in ye %8.2f `F'[1,1] +di in gr " Prob > F = " in ye %8.4f `pvalue'[1,1] + +di in smcl "{help `helpfile'##swstats:Sanderson-Windmeijer multivariate F test of excluded instruments:}" +di in gr " F(" %3.0f `SWFdf1'[1,1] "," %6.0f `SWFdf2'[1,1] ") = " in ye %8.2f `SWF'[1,1] +di in gr " Prob > F = " in ye %8.4f `SWFp'[1,1] + +di + } + _estimates unhold `ivest' + } +end + +// ************* Display list of stored first-stage and RF estimations ************ // + +program define DispStored + args savesfirst saverf savefirst + version 11.2 + + if "`savesfirst'" != "" { + local eqlist "`e(sfirsteq)'" + } + if "`saverf'" != "" { + local eqlist "`eqlist' `e(rfeq)'" + } + if "`savefirst'" != "" { + local eqlist "`eqlist' `e(firsteqs)'" + } + local eqlist : list retokenize eqlist + +di in gr _newline "Stored estimation results" +di in smcl in gr "{hline 25}" _c + capture estimates dir `eqlist' + if "`eqlist'" != "" & _rc == 0 { +// Estimates exist and can be listed + estimates dir `eqlist' + } + else if "`eqlist'" != "" & _rc != 0 { +di +di in ye "Unable to list stored estimations." +di + } +end + +// ************* Display summary first-stage and ID test results ************ // + +program define DispFFirst + version 11.2 + args helpfile + tempname firstmat + tempname sheapr2 pr2 F df df_r pvalue + tempname SWF SWFdf1 SWFdf2 SWFp SWchi2 SWchi2p SWr2 + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display summary of first-stage estimates; macro e(first) is missing" + exit + } + local endo : colnames(`firstmat') + local nrvars : word count `endo' + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + local efirsteqs "`e(firsteqs)'" + + mat `df' =`firstmat'["df",1] + mat `df_r' =`firstmat'["df_r",1] + mat `SWFdf1' =`firstmat'["SWFdf1",1] + mat `SWFdf2' =`firstmat'["SWFdf2",1] + +di +di in gr _newline "Summary results for first-stage regressions" +di in smcl in gr "{hline 43}" +di + +di _c in smcl _col(44) "{help `helpfile'##swstats:(Underid)}" +di in smcl _col(65) "{help `helpfile'##swstats:(Weak id)}" + +di _c in gr "Variable |" +di _c in smcl _col(16) "{help `helpfile'##swstats:F}" in gr "(" +di _c in ye _col(17) %3.0f `df'[1,1] in gr "," in ye %6.0f `df_r'[1,1] in gr ") P-val" +di _c in gr _col(37) "|" +di _c in smcl _col(39) "{help `helpfile'##swstats:SW Chi-sq}" in gr "(" +di _c in ye %3.0f `SWFdf1'[1,1] in gr ") P-val" +di _c in gr _col(60) "|" +di _c in smcl _col(62) "{help `helpfile'##swstats:SW F}" in gr "(" +di in ye _col(67) %3.0f `SWFdf1'[1,1] in gr "," in ye %6.0f `SWFdf2'[1,1] in gr ")" + + local i = 1 + foreach vn of local endo { + + mat `sheapr2' =`firstmat'["sheapr2","`vn'"] + mat `pr2' =`firstmat'["pr2","`vn'"] + mat `F' =`firstmat'["F","`vn'"] + mat `df' =`firstmat'["df","`vn'"] + mat `df_r' =`firstmat'["df_r","`vn'"] + mat `pvalue' =`firstmat'["pvalue","`vn'"] + mat `SWF' =`firstmat'["SWF","`vn'"] + mat `SWFdf1' =`firstmat'["SWFdf1","`vn'"] + mat `SWFdf2' =`firstmat'["SWFdf2","`vn'"] + mat `SWFp' =`firstmat'["SWFp","`vn'"] + mat `SWchi2' =`firstmat'["SWchi2","`vn'"] + mat `SWchi2p' =`firstmat'["SWchi2p","`vn'"] + mat `SWr2' =`firstmat'["SWr2","`vn'"] + + local vnlen : length local vn + if `vnlen' > 12 { + local vn : piece 1 12 of "`vn'" + } +di _c in y %-12s "`vn'" _col(14) in gr "|" _col(18) in y %8.2f `F'[1,1] +di _c _col(28) in y %8.4f `pvalue'[1,1] +di _c _col(37) in g "|" _col(42) in y %8.2f `SWchi2'[1,1] _col(51) in y %8.4f `SWchi2p'[1,1] +di _col(60) in g "|" _col(65) in y %8.2f `SWF'[1,1] + local i = `i' + 1 + } +di + + if "`robust'`cluster'" != "" { + if "`cluster'" != "" { + local rtype "cluster-robust" + } + else if "`kernel'" != "" { + local rtype "heteroskedasticity and autocorrelation-robust" + } + else { + local rtype "heteroskedasticity-robust" + } + } + else if "`kernel'" != "" { + local rtype "autocorrelation-robust" + } + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: first-stage test statistics `rtype'" +di + } + + local k2 = `SWFdf1'[1,1] +di in gr "Stock-Yogo weak ID F test critical values for single endogenous regressor:" + Disp_cdsy, model(`e(model)') k2(`e(exexog_ct)') nendog(1) fuller("`e(fuller)'") col1(36) col2(67) + if `r(cdmissing)' { + di in gr _col(64) "" + } + else { + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(model)'"=="iv" & "`e(vcetype)'`e(kernel)'"=="" { +di in gr "NB: Critical values are for Sanderson-Windmeijer F statistic." + } + else { +di in gr "NB: Critical values are for i.i.d. errors only." + } +di + } + +* Check that SW chi-sq and F denominator are correct and = underid test dof + if e(iddf)~=`SWFdf1'[1,1] { +di in red "Warning: Error in calculating first-stage id statistics above;" +di in red " dof of SW statistics is " `SWFdf1'[1,1] ", should be L-(K-1)=`e(iddf)'." + } + + tempname iddf idstat idp widstat cdf rkf + scalar `iddf'=e(iddf) + scalar `idstat'=e(idstat) + scalar `idp'=e(idp) + scalar `widstat'=e(widstat) + scalar `cdf'=e(cdf) + capture scalar `rkf'=e(rkf) +di in smcl "{help `helpfile'##idtest:Underidentification test}" +di in gr "Ho: matrix of reduced form coefficients has rank=K1-1 (underidentified)" +di in gr "Ha: matrix has rank=K1 (identified)" + if "`robust'`kernel'"=="" { +di in ye "Anderson canon. corr. LM statistic" _c + } + else { +di in ye "Kleibergen-Paap rk LM statistic" _c + } +di in gr _col(42) "Chi-sq(" in ye `iddf' in gr ")=" %-7.2f in ye `idstat' /* + */ _col(61) in gr "P-val=" %6.4f in ye `idp' + +di +di in smcl "{help `helpfile'##widtest:Weak identification test}" +di in gr "Ho: equation is weakly identified" +di in ye "Cragg-Donald Wald F statistic" _col(65) %8.2f `cdf' + if "`robust'`kernel'"~="" { +di in ye "Kleibergen-Paap Wald rk F statistic" _col(65) %8.2f `rkf' + } +di + +di in gr "Stock-Yogo weak ID test critical values for K1=`e(endog_ct)' and L1=`e(exexog_ct)':" + Disp_cdsy, model(`e(model)') k2(`e(exexog_ct)') nendog(`e(endog_ct)') fuller("`e(fuller)'") col1(36) col2(67) + if `r(cdmissing)' { + di in gr _col(64) "" + } + else { + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." + } + } +di + + tempname arf arfp archi2 archi2p ardf ardf_r + tempname sstat sstatp sstatdf +di in smcl "{help `helpfile'##wirobust:Weak-instrument-robust inference}" +di in gr "Tests of joint significance of endogenous regressors B1 in main equation" +di in gr "Ho: B1=0 and orthogonality conditions are valid" +* Needs to be small so that adjusted dof is reflected in F stat + scalar `arf'=e(arf) + scalar `arfp'=e(arfp) + scalar `archi2'=e(archi2) + scalar `archi2p'=e(archi2p) + scalar `ardf'=e(ardf) + scalar `ardf_r'=e(ardf_r) + scalar `sstat'=e(sstat) + scalar `sstatp'=e(sstatp) + scalar `sstatdf'=e(sstatdf) +di in ye _c "Anderson-Rubin Wald test" +di in gr _col(36) "F(" in ye `ardf' in gr "," in ye `ardf_r' in gr ")=" /* + */ _col(49) in ye %7.2f `arf' _col(61) in gr "P-val=" in ye %6.4f `arfp' +di in ye _c "Anderson-Rubin Wald test" +di in gr _col(36) "Chi-sq(" in ye `ardf' in gr ")=" /* + */ _col(49) in ye %7.2f `archi2' _col(61) in gr "P-val=" in ye %6.4f `archi2p' +di in ye _c "Stock-Wright LM S statistic" +di in gr _col(36) "Chi-sq(" in ye `sstatdf' in gr ")=" /* + */ _col(49) in ye %7.2f `sstat' _col(61) in gr "P-val=" in ye %6.4f `sstatp' +di + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: Underidentification, weak identification and weak-identification-robust" +di in gr " test statistics `rtype'" +di + } + + if "`cluster'" != "" & "`e(clustvar2)'"=="" { +di in gr "Number of clusters N_clust = " in ye %10.0f e(N_clust) + } + else if "`e(clustvar2)'" ~= "" { +di in gr "Number of clusters (1) N_clust1 = " in ye %10.0f e(N_clust1) +di in gr "Number of clusters (2) N_clust2 = " in ye %10.0f e(N_clust2) + } +di in gr "Number of observations N = " in ye %10.0f e(N) +di in gr "Number of regressors K = " in ye %10.0f e(rankxx) +di in gr "Number of endogenous regressors K1 = " in ye %10.0f e(endog_ct) +di in gr "Number of instruments L = " in ye %10.0f e(rankzz) +di in gr "Number of excluded instruments L1 = " in ye %10.0f e(ardf) + if "`e(partial)'" != "" { +di in gr "Number of partialled-out regressors/IVs = " in ye %10.0f e(partial_ct) +di in gr "NB: K & L do not included partialled-out variables" + } + +end + +// ************* Post first-stage and/or RF estimations ************ // + +program define PostFirstRF, eclass + version 11.2 + syntax [if] /// + [ , /// + first(string) /// can be fv + rf /// omit first(.) and rf => post system of eqns + rmse_rf(real 0) /// + bmat(name) /// + vmat(name) /// + smat(name) /// + firstmat(name) /// + lhs1(string) /// can be fv + endo1(string) /// + znames0(string) /// + znames1(string) /// + bvclean(integer 0) /// + fvops(integer 0) /// + partial_ct(integer 0) /// + robust /// + cluster(string) /// + cluster1(string) /// + cluster2(string) /// + nc(integer 0) /// + nc1(integer 0) /// + nc2(integer 0) /// + kernel(string) /// + bw(real 0) /// + ivar(name) /// + tvar(name) /// + obs(integer 0) /// + iv1_ct(integer 0) /// + cons(integer 0) /// + partialcons(integer 0) /// + dofminus(integer 0) /// + sdofminus(integer 0) /// + ] + +// renaming/copying + local N = `obs' + local N_clust = `nc' + local N_clust1 = `nc1' + local N_clust2 = `nc2' + tempname b V S + mat `b' = `bmat' + mat `V' = `vmat' + mat `S' = `smat' + + marksample touse + + mat colname `b' = `lhs1' `endo1' + mat rowname `b' = `znames1' + mat `b' = vec(`b') + mat `b' = `b'' + mat colname `V' = `: colfullnames `b'' + mat rowname `V' = `: colfullnames `b'' + mat colname `S' = `: colfullnames `b'' + mat rowname `S' = `: colfullnames `b'' + + if "`cluster'"=="" { + matrix `V'=`V'*(`N'-`dofminus')/(`N'-`iv1_ct'-`dofminus'-`sdofminus') + } + else { + matrix `V'=`V'*(`N'-1)/(`N'-`iv1_ct'-`sdofminus') /// + * `N_clust'/(`N_clust'-1) + } + +// If RF or first-stage estimation required, extract it +// also set macros for model and depvar + if "`rf'`first'"~="" { + if "`rf'"~="" { // RF + local vnum = 0 + local model rf + local depvar `lhs1' + local rmse = `rmse_rf' + } + else { // first-stage + local vnum : list posof "`first'" in endo1 + local vnum = `vnum' + local model first + local depvar `first' + local rmse = el(`firstmat', rownumb(`firstmat',"rmse"), colnumb(`firstmat',"`first'")) + } + local c0 = 1 + `vnum'*`iv1_ct' + local c1 = (`vnum'+1)*`iv1_ct' + mat `b' = `b'[1,`c0'..`c1'] + mat `V' = `V'[`c0'..`c1',`c0'..`c1'] + mat `S' = `S'[`c0'..`c1',`c0'..`c1'] + mat coleq `b' = "" + mat coleq `V' = "" + mat roweq `V' = "" + mat coleq `S' = "" + mat roweq `S' = "" + } + else { + local model sfirst + local eqlist `lhs1' `endo1' + } + +// reinsert omitteds etc. unless requested not to +// eqlist empty unless first-stage/rf system + if ~`bvclean' { + AddOmitted, bmat(`b') vmat(`V') cnb0(`znames0') cnb1(`znames1') eqlist(`eqlist') + mat `b' = r(b) + mat `V' = r(V) +// build fv info (base, empty, etc.) unless there was partialling out + if `fvops' & ~`partial_ct' { + local bfv "buildfvinfo" + } + } + + local dof = `N' - `iv1_ct' - `dofminus' - `sdofminus' + ereturn post `b' `V', obs(`obs') esample(`touse') dof(`dof') depname(`depvar') `bfv' + +// saved RF/first-stage equation scalars + if "`rf'`first'"~="" { + ereturn scalar rmse = `rmse' + ereturn scalar df_r = `dof' + ereturn scalar df_m = `iv1_ct' - `cons' + `sdofminus' - `partialcons' + } + ereturn scalar k_eq = `: word count `endo1'' + ereturn local cmd ivreg2 + ereturn local model `model' + ereturn matrix S `S' + + if "`kernel'"!="" { + ereturn local kernel "`kernel'" + ereturn scalar bw=`bw' + ereturn local tvar "`tvar'" + if "`ivar'" ~= "" { + ereturn local ivar "`ivar'" + } + } + + if "`robust'" != "" { + local vce "robust" + } + if "`cluster1'" != "" { + if "`cluster2'"=="" { + local vce "`vce' cluster" + } + else { + local vce "`vce' two-way cluster" + } + } + if "`kernel'" != "" { + if "`robust'" != "" { + local vce "`vce' hac" + } + else { + local vce "`vce' ac" + } + local vce "`vce' `kernel' bw=`bw'" + } + + local vce : list clean vce + local vce = lower("`vce'") + ereturn local vce `vce' + + if "`cluster'"!="" { + ereturn scalar N_clust=`N_clust' + ereturn local clustvar `cluster' + } + if "`cluster2'"!="" { + ereturn scalar N_clust1=`N_clust1' + ereturn scalar N_clust2=`N_clust2' + ereturn local clustvar1 `cluster1' + ereturn local clustvar2 `cluster2' + } + + if "`robust'`cluster'" != "" { + ereturn local vcetype "Robust" + } + +// Assemble output titles + if "`e(vcetype)'" == "Robust" { + local hacsubtitle1 "heteroskedasticity" + } + if "`e(kernel)'"!="" & "`e(clustvar)'"=="" { + local hacsubtitle3 "autocorrelation" + } + if "`kiefer'"!="" { + local hacsubtitle3 "within-cluster autocorrelation (Kiefer)" + } + if "`e(clustvar)'"!="" { + if "`e(clustvar2)'"=="" { + local hacsubtitle3 "clustering on `e(clustvar)'" + } + else { + local hacsubtitle3 "clustering on `e(clustvar1)' and `e(clustvar2)'" + } + if "`e(kernel)'" != "" { + local hacsubtitle4 "and kernel-robust to common correlated disturbances (Driscoll-Kraay)" + } + } + if "`hacsubtitle1'"~="" & "`hacsubtitle3'" ~= "" { + local hacsubtitle2 " and " + } + local hacsubtitle "`hacsubtitle1'`hacsubtitle2'`hacsubtitle3'" + if "`hacsubtitle'"~="" { + ereturn local hacsubtitleV "Statistics robust to `hacsubtitle'" + } + else { + ereturn local hacsubtitleV "Statistics consistent for homoskedasticity only" + } + if "`hacsubtitle4'"~="" { + ereturn local hacsubtitleV2 "`hacsubtitle4'" + } + if "`sw'"~="" { + ereturn local hacsubtitleV "Stock-Watson heteroskedastic-robust statistics (BETA VERSION)" + } + +end + + + +************************************************************************************** +program define IsStop, sclass + /* sic, must do tests one-at-a-time, + * 0, may be very large */ + version 11.2 + if `"`0'"' == "[" { + sret local stop 1 + exit + } + if `"`0'"' == "," { + sret local stop 1 + exit + } + if `"`0'"' == "if" { + sret local stop 1 + exit + } +* per official ivreg 5.1.3 + if substr(`"`0'"',1,3) == "if(" { + sret local stop 1 + exit + } + if `"`0'"' == "in" { + sret local stop 1 + exit + } + if `"`0'"' == "" { + sret local stop 1 + exit + } + else sret local stop 0 +end + +// ************* Display list of variables ************ // + +program define Disp + version 11.2 + syntax [anything] [, _col(integer 15) ] + local maxlen = 80-`_col' + local len = 0 + local first = 1 + foreach vn in `anything' { +* Don't display if base or omitted variable + _ms_parse_parts `vn' + if ~`r(omit)' { + local vnlen : length local vn + if `len'+`vnlen' > `maxlen' { + di + local first = 1 + local len = `vnlen' + } + else { + local len = `len'+`vnlen'+1 + } + if `first' { + local first = 0 + di in gr _col(`_col') "`vn'" _c + } + else { + di in gr " `vn'" _c + } + } + } +* Finish with a newline + di +end + +// *********** Display Cragg-Donald/Stock-Yogo critical values etc. ******** // + +program define Disp_cdsy, rclass + version 11.2 + syntax , col1(integer) col2(integer) model(string) k2(integer) nendog(integer) [ fuller(string) ] + local cdmissing=1 + if "`model'"=="iv" | "`model'"=="gmm2s" | "`model'"=="gmmw" { + cdsy, type(ivbias5) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') " 5% maximal IV relative bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "10% maximal IV relative bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "20% maximal IV relative bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "30% maximal IV relative bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "10% maximal IV size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "15% maximal IV size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "20% maximal IV size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "25% maximal IV size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`model'"=="liml" & "`fuller'"=="") | "`model'"=="cue" { + cdsy, type(limlsize10) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "10% maximal LIML size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "15% maximal LIML size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "20% maximal LIML size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "25% maximal LIML size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`model'"=="liml" & "`fuller'"~="") { + cdsy, type(fullrel5) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') " 5% maximal Fuller rel. bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "10% maximal Fuller rel. bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "20% maximal Fuller rel. bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "30% maximal Fuller rel. bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') " 5% Fuller maximum bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "10% Fuller maximum bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "20% Fuller maximum bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "30% Fuller maximum bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + return scalar cdmissing =`cdmissing' +end + +program define cdsy, rclass + version 11.2 + syntax , type(string) k2(integer) nendog(integer) + +* type() can be ivbias5 (k2<=100, nendog<=3) +* ivbias10 (ditto) +* ivbias20 (ditto) +* ivbias30 (ditto) +* ivsize10 (k2<=100, nendog<=2) +* ivsize15 (ditto) +* ivsize20 (ditto) +* ivsize25 (ditto) +* fullrel5 (ditto) +* fullrel10 (ditto) +* fullrel20 (ditto) +* fullrel30 (ditto) +* fullmax5 (ditto) +* fullmax10 (ditto) +* fullmax20 (ditto) +* fullmax30 (ditto) +* limlsize10 (ditto) +* limlsize15 (ditto) +* limlsize20 (ditto) +* limlsize25 (ditto) + + tempname temp cv + +* Initialize critical value as MV + scalar `cv'=. + + if "`type'"=="ivbias5" { + mata: s_cdsy("`temp'", 1) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias10" { + mata: s_cdsy("`temp'", 2) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias20" { + mata: s_cdsy("`temp'", 3) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias30" { + mata: s_cdsy("`temp'", 4) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + if "`type'"=="ivsize10" { + mata: s_cdsy("`temp'", 5) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize15" { + mata: s_cdsy("`temp'", 6) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize20" { + mata: s_cdsy("`temp'", 7) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize25" { + mata: s_cdsy("`temp'", 8) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel5" { + mata: s_cdsy("`temp'", 9) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel10" { + mata: s_cdsy("`temp'", 10) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel20" { + mata: s_cdsy("`temp'", 11) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel30" { + mata: s_cdsy("`temp'", 12) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax5" { + mata: s_cdsy("`temp'", 13) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax10" { + mata: s_cdsy("`temp'", 14) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax20" { + mata: s_cdsy("`temp'", 15) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax30" { + mata: s_cdsy("`temp'", 16) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize10" { + mata: s_cdsy("`temp'", 17) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize15" { + mata: s_cdsy("`temp'", 18) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize20" { + mata: s_cdsy("`temp'", 19) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize25" { + mata: s_cdsy("`temp'", 20) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + return scalar cv=`cv' +end + +// ***************************** Parse ivreg2 arguments **************** // + +program define ivparse, sclass + version 11.2 + syntax [anything(name=0)] /// + [ , /// + ivreg2name(name) /// + partial(string) /// as string because may have nonvariable in list + fwl(string) /// legacy option + orthog(varlist fv ts) /// + endogtest(varlist fv ts) /// + redundant(varlist fv ts) /// + depname(string) /// + robust /// + cluster(varlist fv ts) /// + bw(string) /// as string because may have noninteger option "auto" + kernel(string) /// + dkraay(integer 0) /// + sw /// + kiefer /// + center /// + NOCONSTANT /// + tvar(varname) /// + ivar(varname) /// + gmm2s /// + gmm /// + cue /// + liml /// + fuller(real 0) /// + kclass(real 0) /// + b0(string) /// + wmatrix(string) /// + NOID /// + savefirst /// + savefprefix(name) /// + saverf /// + saverfprefix(name) /// + savesfirst /// + savesfprefix(name) /// + psd0 /// + psda /// + dofminus(integer 0) /// + NOCOLLIN /// + useqr /// + bvclean /// + eform(string) /// + NOOMITTED /// + vsquish /// + noemptycells /// + baselevels /// + allbaselevels /// + ] + +// TS and FV opts based on option varlists + local tsops = ("`s(tsops)'"=="true") + local fvops = ("`s(fvops)'"=="true") +// useful boolean + local cons =("`noconstant'"=="") + + local n 0 + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + while `s(stop)'==0 { + if "`paren'"=="(" { + local ++n + if `n'>1 { +di as err `"syntax is "(all instrumented variables = instrument variables)""' + exit 198 + } + gettoken p lhs : lhs, parse(" =") + while "`p'"!="=" { + if "`p'"=="" { +di as err `"syntax is "(all instrumented variables = instrument variables)""' +di as er `"the equal sign "=" is required"' + exit 198 + } + local endo `endo' `p' + gettoken p lhs : lhs, parse(" =") + } + local exexog `lhs' + } + else { + local inexog `inexog' `lhs' + } + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + } +// lhs attached to front of inexog + gettoken lhs inexog : inexog + local endo : list retokenize endo + local inexog : list retokenize inexog + local exexog : list retokenize exexog +// If depname not provided (default) name is lhs variable + if "`depname'"=="" { + local depname `lhs' + } + +// partial, including legacy FWL option + local partial `partial' `fwl' +// Need to nonvars "_cons" from list if present +// Also set `partialcons' local to 0/1 +// Need word option so that varnames with cons in them aren't zapped + local partial : subinstr local partial "_cons" "", all count(local partialcons) word + local partial : list retokenize partial + if "`partial'"=="_all" { + local partial `inexog' + } +// constant always partialled out if present in regression and other inexog are being partialled out +// (incompatibilities caught in error-check section below) + if "`partial'"~="" { + local partialcons = (`cons' | `partialcons') + } + +// detect if TS or FV operators used in main varlists +// clear any extraneous sreturn macros first + sreturn clear + local 0 `lhs' `inexog' `endo' `exexog' `partial' + syntax varlist(fv ts) + local tsops = ("`s(tsops)'"=="true") | `tsops' + local fvops = ("`s(fvops)'"=="true") | `fvops' + +// TS operators not allowed with cluster, ivar or tvar. Captured in -syntax-. + if "`tvar'" == "" { + local tvar `_dta[_TStvar]' + } + if "`ivar'" == "" { + local ivar `_dta[_TSpanel]' + } + if "`_dta[_TSdelta]'" == "" { + local tdelta 1 + } + else { // use evaluator since _dta[_TSdelta] can + local tdelta = `_dta[_TSdelta]' // be stored as e.g. +1.0000000000000X+000 + } + + sreturn local lhs `lhs' + sreturn local depname `depname' + sreturn local endo `endo' + sreturn local inexog `inexog' + sreturn local exexog `exexog' + sreturn local partial `partial' + sreturn local cons =`cons' + sreturn local partialcons =`partialcons' + sreturn local tsops =`tsops' + sreturn local fvops =`fvops' + sreturn local tvar `tvar' + sreturn local ivar `ivar' + sreturn local tdelta `tdelta' + sreturn local noid `noid' // can be overriden below + sreturn local liml `liml' // can be overriden below + +//convert to boolean + sreturn local useqr =("`useqr'" ~= "") + +// Cluster and SW imply robust + if "`cluster'`sw'"~="" { + local robust "robust" + } + +// HAC estimation. + +// First dkraay(bw): special case of HAC with clustering +// on time-series var in a panel + kernel-robust + if `dkraay' { + if "`bw'" == "" { + local bw `dkraay' + } + if "`cluster'" == "" { + local cluster `tvar' + } + } +// If bw is omitted, default `bw' is 0. +// bw(.) can be number or "auto" hence arrives as string, but is returned as number +// bw=-1 returned if "auto" +// If bw or kernel supplied, check/set `kernel'. +// Macro `kernel' is also used for indicating HAC in use. +// If bw or kernel not supplied, set bw=0 + if "`bw'" == "" & "`kernel'" == "" { + local bw 0 + } + else { +// Check it's a valid kernel and replace with unabbreviated kernel name; check bw. +// s_vkernel is in livreg2 mlib. + mata: s_vkernel("`kernel'", "`bw'", "`ivar'") + local kernel `r(kernel)' + local bw `r(bw)' // = -1 if bw(auto) option chosen + local tsops = 1 + } +// kiefer = kernel(tru) bw(T) and no robust + if "`kiefer'" ~= "" & "`kernel'" == "" { + local kernel "Truncated" + } + +// Done parsing VCE opts + sreturn local bw `bw' + sreturn local kernel `kernel' + sreturn local robust `robust' + sreturn local cluster `cluster' + if `bw' { + sreturn local bwopt "bw(`bw')" + sreturn local kernopt "kernel(`kernel')" + } +// center arrives as string but is returned as boolean + sreturn local center =("`center'"=="center") + +// Fuller implies LIML + if `fuller' != 0 { + sreturn local liml "liml" + sreturn local fulleropt "fuller(`fuller')" + } + + if `kclass' != 0 { + sreturn local kclassopt "kclass(`kclass')" + } + +// b0 implies noid. + if "`b0'" ~= "" { + sreturn local noid "noid" + } + +// save first, rf + if "`savefprefix'" != "" { // savefprefix implies savefirst + local savefirst "savefirst" + } + else { // default savefprefix is _ivreg2_ + local savefprefix "_`ivreg2name'_" + } + sreturn local savefirst `savefirst' + sreturn local savefprefix `savefprefix' + if "`saverfprefix'" != "" { // saverfprefix implies saverf + local saverf "saverf" + } + else { // default saverfprefix is _ivreg2_ + local saverfprefix "_`ivreg2name'_" + } + sreturn local saverf `saverf' + sreturn local saverfprefix `saverfprefix' + if "`savesfprefix'" != "" { // savesfprefix implies savesfirst + local savesfirst "savesfirst" + } + else { // default saverfprefix is _ivreg2_ + local savesfprefix "_`ivreg2name'_" + } + sreturn local savesfirst `savesfirst' + sreturn local savesfprefix `savesfprefix' + +// Macro psd has either psd0, psda or is empty + sreturn local psd "`psd0'`psda'" + +// dofminus + if `dofminus' { + sreturn local dofmopt dofminus(`dofminus') + } + +// display options + local dispopt eform(`eform') `vsquish' `noomitted' `noemptycells' `baselevels' `allbaselevels' +// now boolean - indicates that omitted and/or base vars should NOT be added to VCV +// automatically triggered by partial + local bvclean = wordcount("`bvclean'") | wordcount("`partial'") | `partialcons' + sreturn local bvclean `bvclean' + sreturn local dispopt `dispopt' + +// ************ ERROR CHECKS ************* // + + if `partialcons' & ~`cons' { +di in r "Error: _cons listed in partial() but equation specifies -noconstant-." + exit 198 + } + if `partialcons' > 1 { +// Just in case of multiple _cons +di in r "Error: _cons listed more than once in partial()." + exit 198 + } + +// User-supplied tvar and ivar checked if consistent with tsset. + if "`tvar'"!="`_dta[_TStvar]'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } + if "`ivar'"!="`_dta[_TSpanel]'" { +di as err "invalid ivar() option - data already -xtset-" + exit 5 + } + +// dkraay + if `dkraay' { + if "`ivar'" == "" | "`tvar'" == "" { +di as err "invalid use of dkraay option - must use tsset panel data" + exit 5 + } + if "`dkraay'" ~= "`bw'" { +di as err "cannot use dkraay(.) and bw(.) options together" + exit 198 + } + if "`cluster'" ~= "`tvar'" { +di as err "invalid use of dkraay option - must cluster on `tvar' (or omit cluster option)" + exit 198 + } + } + +// kiefer VCV = kernel(tru) bw(T) and no robust with tsset data + if "`kiefer'" ~= "" { + if "`ivar'" == "" | "`tvar'" == "" { +di as err "invalid use of kiefer option - must use tsset panel data" + exit 5 + } + if "`robust'" ~= "" { +di as err "incompatible options: kiefer and robust" + exit 198 + } + if "`kernel'" ~= "" & "`kernel'" ~= "Truncated" { +di as err "incompatible options: kiefer and kernel(`kernel')" + exit 198 + } + if (`bw'~=0) { +di as err "incompatible options: kiefer and bw" + exit 198 + } + } + +// sw=Stock-Watson robust SEs + if "`sw'" ~= "" & "`cluster'" ~= "" { +di as err "Stock-Watson robust SEs not supported with -cluster- option" + exit 198 + } + if "`sw'" ~= "" & "`kernel'" ~= "" { +di as err "Stock-Watson robust SEs not supported with -kernel- option" + exit 198 + } + if "`sw'" ~= "" & "`ivar'"=="" { +di as err "Must -xtset- or -tsset- data or specify -ivar- with -sw- option" + exit 198 + } + +// LIML/kclass incompatibilities + if "`liml'`kclassopt'" != "" { + if "`gmm2s'`cue'" != "" { +di as err "GMM estimation not available with LIML or k-class estimators" + exit 198 + } + if `fuller' < 0 { +di as err "invalid Fuller option" + exit 198 + } + if "`liml'" != "" & "`kclassopt'" != "" { +di as err "cannot use liml and kclass options together" + exit 198 + } + if `kclass' < 0 { +di as err "invalid k-class option" + exit 198 + } + } + + if "`gmm2s'" != "" & "`cue'" != "" { +di as err "incompatible options: 2-step efficient gmm and cue gmm" + exit 198 + } + + if "`gmm2s'`cue'" != "" & "`exexog'" == "" { +di as err "option `gmm2s'`cue' invalid: no excluded instruments specified" + exit 102 + } + +// Legacy gmm option + if "`gmm'" ~= "" { +di as err "-gmm- is no longer a supported option; use -gmm2s- with the appropriate option" +di as res " gmm = gmm2s robust" +di as res " gmm robust = gmm2s robust" +di as res " gmm bw() = gmm2s bw()" +di as res " gmm robust bw() = gmm2s robust bw()" +di as res " gmm cluster() = gmm2s cluster()" + exit 198 + } + +// b0 incompatible options. + if "`b0'" ~= "" & "`gmm2s'`cue'`liml'`wmatrix'" ~= "" { +di as err "incompatible options: -b0- and `gmm2s' `cue' `liml' `wmatrix'" + exit 198 + } + if "`b0'" ~= "" & `kclass' ~= 0 { +di as err "incompatible options: -b0- and kclass(`kclass')" + exit 198 + } + + if "`psd0'"~="" & "`psda'"~="" { +di as err "cannot use psd0 and psda options together" + exit 198 + } +end + +// *************** Check varlists for for duplicates and collinearities ***************** // + +program define CheckDupsCollin, sclass + version 11.2 + syntax /// + [ , /// + lhs(string) /// + endo(string) /// + inexog(string) /// + exexog(string) /// + partial(string) /// + orthog(string) /// + endogtest(string) /// + redundant(string) /// + touse(string) /// + wvar(string) /// + wf(real 0) /// + NOCONSTANT /// + NOCOLLIN /// + fvall /// + fvsep /// + ] + + if "`fvall'`fvsep'"=="" { // default, expand RHS and exexog separately + local rhs `endo' `inexog' + foreach vl in lhs rhs exexog { + fvexpand ``vl'' if `touse' + local `vl' `r(varlist)' + } + local allvars `rhs' `exexog' + } + else if "`fvall'"~="" { // expand all 3 varlists as one + fvexpand `lhs' if `touse' + local lhs `r(varlist)' + fvexpand `endo' `inexog' `exexog' if `touse' + local allvars `r(varlist)' + } + else if "`fvsep'"~="" { // expand 3 varlists separately + foreach vl in lhs endo inexog exexog { + fvexpand ``vl'' if `touse' + local `vl' `r(varlist)' + } + local allvars `endo' `inexog' `exexog' + } + else { // shouldn't reach here +di as err "internal ivreg2 err: CheckDupsCollin" + exit 198 + } + +// Create dictionary: `allvars' is list with b/n/o etc., sallvars is stripped version +// NB: lhs is not in dictionary and won't need to recreate it + ivreg2_fvstrip `allvars' + local sallvars `r(varlist)' + +// Create consistent expanded varlists +// (1) expand; (2) strip (since base etc. may be wrong); (3) recreate using dictionary +// NB: matchnames will return unmatched original name if not found in 2nd arg varlist + foreach vl in endo inexog exexog partial orthog endogtest redundant { + fvexpand ``vl'' if `touse' + ivreg2_fvstrip `r(varlist)' + local stripped `r(varlist)' // create stripped version of varlist + matchnames "`stripped'" "`sallvars'" "`allvars'" // match using dictionary + local `vl' `r(names)' // new consistent varlist with correct b/n/o etc. + } + +// Check for duplicates of variables +// (1) inexog > endo +// (2) inexog > exexog +// (3) endo + exexog = inexog, as if it were "perfectly predicted" + local lhs0 `lhs' // create here + local dupsen1 : list dups endo + local dupsin1 : list dups inexog + local dupsex1 : list dups exexog + foreach vl in endo inexog exexog partial orthog endogtest redundant { + local `vl'0 : list uniq `vl' + } +// Remove inexog from endo + local dupsen2 : list endo0 & inexog0 + local endo0 : list endo0 - inexog0 +// Remove inexog from exexog + local dupsex2 : list exexog0 & inexog0 + local exexog0 : list exexog0 - inexog0 +// Remove endo from exexog + local dupsex3 : list exexog0 & endo0 + local exexog0 : list exexog0 - endo0 + local dups "`dupsen1' `dupsex1' `dupsin1' `dupsen2' `dupsex2' `dupsex3'" + local dups : list uniq dups + +// Collinearity checks + +// Need variable counts for "0" varlists +// These do NOT include the constant + local endo0_ct : word count `endo0' + local inexog0_ct : word count `inexog0' + local rhs0_ct : word count `inexog0' `exexog0' + local exexog0_ct : word count `exexog' + + if "`nocollin'" == "" { + +// Needed for ivreg2_rmcollright2 + tempvar normwt + qui gen double `normwt' = `wf' * `wvar' if `touse' + +// Simple case: no endogenous regressors, only included and excluded exogenous + if `endo0_ct'==0 { +// Call ivreg2_rmcollright2 on "0" versions of inexog and exexog +// noexpand since already expanded and don't want inconsistant expansion +// newonly since don't want base vars in collinear list + qui ivreg2_rmcollright2 `inexog0' `exexog0' if `touse', /// + normwt(`normwt') `noconstant' noexpand newonly +// ivreg2_rmcollright2 returns fulll varlist with omitteds marked as omitted, +// so just need to separate the inexog and exexog lists + if `r(k_omitted)' { + local collin `collin' `r(omitted)' + local inexog0 "" + local exexog0 "" + local nvarlist `r(varlist)' + local i 1 + while `i' <= `rhs0_ct' { + local nvar : word `i' of `nvarlist' + if `i' <= `inexog0_ct' { + local inexog0 `inexog0' `nvar' // first batch go into inexog0 + } + else { + local exexog0 `exexog0' `nvar' // remainder go into exexog0 + } + local ++i + } + local inexog0 : list retokenize inexog0 + local exexog0 : list retokenize exexog0 + } + } +// Not-simple case: endogenous regressors + else { + +// 1st pass through - remove intra-endo collinears + qui ivreg2_rmcollright2 `endo0' if `touse', /// + normwt(`normwt') `noconstant' noexpand newonly +// ivreg2_rmcollright2 returns fulll varlist with omitteds marked as omitted, +// so just need to separate the inexog and exexog lists + if `r(k_omitted)' { + local collin `collin' `r(omitted)' + local endo0 `r(varlist)' + } + +// 2nd pass through - good enough unless endog appear as colllinear +// noexpand since already expanded and don't want inconsistent expansion +// newonly since don't want base vars in collinear list + qui ivreg2_rmcollright2 `inexog0' `exexog0' `endo0' if `touse', /// + normwt(`normwt') `noconstant' noexpand newonly + if `r(k_omitted)' { +// Check if any endo are in the collinears. +// If yes, reclassify as inexog, then +// 3rd pass through - and then proceed to process inexog and exexog as above + local ecollin `r(omitted)' + local ecollin : list ecollin - inexog0 + local ecollin : list ecollin - exexog0 + if wordcount("`ecollin'") { +// Collinears in endo, so reclassify as inexog, redo counts and call ivreg2_rmcollright2 again + local endo0 : list endo0 - ecollin + local inexog0 `ecollin' `inexog0' + local inexog0 : list retokenize inexog0 + local endo0_ct : word count `endo0' + local inexog0_ct : word count `inexog0' + local rhs0_ct : word count `inexog0' `exexog0' +// noexpand since already expanded and don't want inconsistant expansion +// newonly since don't want base vars in collinear list + qui ivreg2_rmcollright2 `inexog0' `exexog0' `endo0' if `touse', /// + normwt(`normwt') `noconstant' noexpand newonly + } +// Collinears in inexog or exexog + local collin `collin' `r(omitted)' + local inexog0 "" + local exexog0 "" + local nvarlist `r(varlist)' + local i 1 + while `i' <= `rhs0_ct' { + local nvar : word `i' of `nvarlist' + if `i' <= `inexog0_ct' { + local inexog0 `inexog0' `nvar' + } + else { + local exexog0 `exexog0' `nvar' + } + local ++i + } + local inexog0 : list retokenize inexog0 + local exexog0 : list retokenize exexog0 + } + } + +// Collinearity and duplicates warning messages, if necessary + if "`dups'" != "" { +di in gr "Warning - duplicate variables detected" +di in gr "Duplicates:" _c + Disp `dups', _col(21) + } + if "`ecollin'" != "" { +di in gr "Warning - endogenous variable(s) collinear with instruments" +di in gr "Vars now exogenous:" _c + Disp `ecollin', _col(21) + } + if "`collin'" != "" { +di in gr "Warning - collinearities detected" +di in gr "Vars dropped:" _c + Disp `collin', _col(21) + } + } + +// Last step: process partial0 so that names with o/b/n etc. match inexog0 + if wordcount("`partial0'") { + ivreg2_fvstrip `inexog0' if `touse' + local sinexog0 `r(varlist)' // for inexog dictionary + ivreg2_fvstrip `partial0' if `touse' + local spartial0 `r(varlist)' // for partial dictionary + matchnames "`spartial0'" "`sinexog0'" "`inexog0'" // match using dictionary + local partial0 `r(names)' // new partial0 with matches + local partialcheck : list partial0 - inexog0 // unmatched are still in partial0 + if ("`partialcheck'"~="") { // so catch them +di in r "Error: `partialcheck' listed in partial() but not in list of regressors." + error 198 + } + } +// Completed duplicates and collinearity checks + + foreach vl in lhs endo inexog exexog partial orthog endogtest redundant { + sreturn local `vl' ``vl'' + sreturn local `vl'0 ``vl'0' + } + sreturn local dups `dups' + sreturn local collin `collin' + sreturn local ecollin `ecollin' + +end + +// ******************* Misc error checks *************************** // + +program define CheckMisc, rclass + version 11.2 + syntax /// + [ , /// + rhs1_ct(integer 0) /// + iv1_ct(integer 0) /// + bvector(name) /// + smatrix(name) /// + wmatrix(name) /// + cnb1(string) /// + cnZ1(string) /// + ] + +// Check variable counts + if `rhs1_ct' == 0 { +di as err "error: no regressors specified" + exit 102 + } + if `rhs1_ct' > `iv1_ct' { +di as err "equation not identified; must have at least as many instruments" +di as err "not in the regression as there are instrumented variables" + exit 481 + } + +// Check user-supplied b vector + if "`bvector'" != "" { + tempname b0 +// Rearrange/select columns to mat IV matrix + cap matsort `bvector' "`cnb1'" + matrix `b0'=r(sorted) + local scols = colsof(`b0') + local bcols : word count `cnb1' + if _rc ~= 0 | (`scols'~=`bcols') { +di as err "-b0- option error: supplied b0 columns do not match regressor list" +exit 198 + } + return mat b0 = `b0' + } + +// Check user-supplied S matrix + if "`smatrix'" != "" { + tempname S0 +// Check that smatrix is indeed a matrix + cap mat S0 = `smatrix' + if _rc ~= 0 { +di as err "invalid matrix `smatrix' in smatrix option" +exit _rc + } +// Rearrange/select columns to mat IV matrix + cap matsort `smatrix' "`cnZ1'" + matrix `S0'=r(sorted) + local srows = rowsof(`S0') + local scols = colsof(`S0') + local zcols : word count `cnZ1' + if _rc ~= 0 | (`srows'~=`zcols') | (`scols'~=`zcols') { +di as err "-smatrix- option error: supplied matrix columns/rows do not match IV list" +exit 198 + } + if issymmetric(`S0')==0 { +di as err "-smatrix- option error: supplied matrix is not symmetric" +exit 198 + } + return mat S0 = `S0' + } + +// Check user-supplied W matrix + if "`wmatrix'" != "" { + tempname W0 +// Check that wmatrix is indeed a matrix + cap mat W0 = `wmatrix' + if _rc ~= 0 { +di as err "invalid matrix `wmatrix' in wmatrix option" +exit _rc + } +// Rearrange/select columns to mat IV matrix + cap matsort `wmatrix' "`cnZ1'" + matrix `W0'=r(sorted) + local srows = rowsof(`W0') + local scols = colsof(`W0') + local zcols : word count `cnZ1' + if _rc ~= 0 | (`srows'~=`zcols') | (`scols'~=`zcols') { +di as err "-wmatrix- option error: supplied matrix columns/rows do not match IV list" +exit 198 + } + if issymmetric(`W0')==0 { +di as err "-smatrix- option error: supplied matrix is not symmetric" +exit 198 + } + return mat W0 = `W0' + } +end + + +******************************************************************************* +************************* misc utilities ************************************** +******************************************************************************* + +// internal version of ivreg2_fvstrip 1.01 ms 24march2015 +// takes varlist with possible FVs and strips out b/n/o notation +// returns results in r(varnames) +// optionally also omits omittable FVs +// expand calls fvexpand either on full varlist +// or (with onebyone option) on elements of varlist + +program define ivreg2_fvstrip, rclass + version 11.2 + syntax [anything] [if] , [ dropomit expand onebyone NOIsily ] + if "`expand'"~="" { // force call to fvexpand + if "`onebyone'"=="" { + fvexpand `anything' `if' // single call to fvexpand + local anything `r(varlist)' + } + else { + foreach vn of local anything { + fvexpand `vn' `if' // call fvexpand on items one-by-one + local newlist `newlist' `r(varlist)' + } + local anything : list clean newlist + } + } + foreach vn of local anything { // loop through varnames + if "`dropomit'"~="" { // check & include only if + _ms_parse_parts `vn' // not omitted (b. or o.) + if ~`r(omit)' { + local unstripped `unstripped' `vn' // add to list only if not omitted + } + } + else { // add varname to list even if + local unstripped `unstripped' `vn' // could be omitted (b. or o.) + } + } +// Now create list with b/n/o stripped out + foreach vn of local unstripped { + local svn "" // initialize + _ms_parse_parts `vn' + if "`r(type)'"=="variable" & "`r(op)'"=="" { // simplest case - no change + local svn `vn' + } + else if "`r(type)'"=="variable" & "`r(op)'"=="o" { // next simplest case - o.varname => varname + local svn `r(name)' + } + else if "`r(type)'"=="variable" { // has other operators so strip o but leave . + local op `r(op)' + local op : subinstr local op "o" "", all + local svn `op'.`r(name)' + } + else if "`r(type)'"=="factor" { // simple factor variable + local op `r(op)' + local op : subinstr local op "b" "", all + local op : subinstr local op "n" "", all + local op : subinstr local op "o" "", all + local svn `op'.`r(name)' // operator + . + varname + } + else if"`r(type)'"=="interaction" { // multiple variables + forvalues i=1/`r(k_names)' { + local op `r(op`i')' + local op : subinstr local op "b" "", all + local op : subinstr local op "n" "", all + local op : subinstr local op "o" "", all + local opv `op'.`r(name`i')' // operator + . + varname + if `i'==1 { + local svn `opv' + } + else { + local svn `svn'#`opv' + } + } + } + else if "`r(type)'"=="product" { + di as err "ivreg2_fvstrip error - type=product for `vn'" + exit 198 + } + else if "`r(type)'"=="error" { + di as err "ivreg2_fvstrip error - type=error for `vn'" + exit 198 + } + else { + di as err "ivreg2_fvstrip error - unknown type for `vn'" + exit 198 + } + local stripped `stripped' `svn' + } + local stripped : list retokenize stripped // clean any extra spaces + + if "`noisily'"~="" { // for debugging etc. +di as result "`stripped'" + } + + return local varlist `stripped' // return results in r(varlist) +end + +// **************** Add omitted vars to b and V matrices ****************** // + +program define AddOmitted, rclass + version 11.2 + syntax /// + [ , /// + bmat(name) /// + vmat(name) /// + cnb0(string) /// + cnb1(string) /// + eqlist(string) /// if empty, single-equation b and V + ] + + tempname newb newV + local eq_ct =max(1,wordcount("`eqlist'")) + local rhs0_ct : word count `cnb0' + local rhs1_ct : word count `cnb1' + + foreach vn in `cnb1' { + local cnum : list posof "`vn'" in cnb0 + local cnumlist "`cnumlist' `cnum'" + } +// cnumlist is the list of columns in the single-equation new big matrix in which +// the non-zero entries from the reduced matrix (bmat or vmat) will appear. +// E.g., if newb will be [mpg o.mpg2 _cons] then cnum = [1 3]. + + mata: s_AddOmitted( /// + "`bmat'", /// + "`vmat'", /// + "`cnumlist'", /// + `eq_ct', /// + `rhs0_ct', /// + `rhs1_ct') + mat `newb' = r(b) + mat `newV' = r(V) + + if `eq_ct'==1 { + local allnames `cnb0' // simple single-eqn case + } + else { + foreach eqname in `eqlist' { + foreach vname in `cnb0' { + local allnames "`allnames' `eqname':`vname'" + } + } + } + mat colnames `newb' = `allnames' + mat rownames `newb' = y1 + mat colnames `newV' = `allnames' + mat rownames `newV' = `allnames' + + return matrix b =`newb' + return matrix V =`newV' +end + +// ************* More misc utilities ************** // + +program define matsort, rclass + version 11.2 + args bvmat names + tempname m1 m2 + foreach vn in `names' { + mat `m1'=nullmat(`m1'), `bvmat'[1...,"`vn'"] + } + if rowsof(`m1')>1 { + foreach vn in `names' { + mat `m2'=nullmat(`m2') \ `m1'["`vn'",1...] + } + return matrix sorted =`m2' + } + else { + return matrix sorted =`m1' + } +end + + +program define matchnames, rclass + version 11.2 + args varnames namelist1 namelist2 + + local k1 : word count `namelist1' + local k2 : word count `namelist2' + + if `k1' ~= `k2' { + di as err "namelist error" + exit 198 + } + foreach vn in `varnames' { + local i : list posof `"`vn'"' in namelist1 + if `i' > 0 { + local newname : word `i' of `namelist2' + } + else { +* Keep old name if not found in list + local newname "`vn'" + } + local names "`names' `newname'" + } + local names : list clean names + return local names "`names'" +end + + +program define checkversion_ranktest, rclass + version 11.2 + args caller + +* Check that -ranktest- is installed + capture ranktest, version + if _rc != 0 { +di as err "Error: must have ranktest version 01.3.02 or greater installed" +di as err "To install, from within Stata type " _c +di in smcl "{stata ssc install ranktest :ssc install ranktest}" + exit 601 + } + local vernum "`r(version)'" + if ("`vernum'" < "01.3.02") | ("`vernum'" > "09.9.99") { +di as err "Error: must have ranktest version 01.3.02 or greater installed" +di as err "Currently installed version is `vernum'" +di as err "To update, from within Stata type " _c +di in smcl "{stata ssc install ranktest, replace :ssc install ranktest, replace}" + exit 601 + } + +* Minimum Stata version required for ranktest ver 2.0 or higher is Stata 16. +* If calling version is <16 then forks to ranktest ver 1.4 (aka ranktest11). + if `caller' >= 16 { + return local ranktestcmd version `caller': ranktest + } + else { + return local ranktestcmd version 11.2: ranktest + } +end + +// ************ Replacement _rmcollright with tweaks ****************** // + +program define ivreg2_rmcollright2, rclass + version 11.2 + syntax [ anything ] /// anything so that FVs aren't reordered + [if] [in] /// + [, /// + NORMWT(varname) /// + NOCONStant /// + NOEXPAND /// + newonly /// + lindep /// + ] + +// Empty varlist, leave early + if "`anything'"=="" { + return scalar k_omitted =0 + exit + } + + marksample touse + markout `touse' `anything' + + local cons = ("`noconstant'"=="") + local expand = ("`noexpand'"=="") + local newonly = ("`newonly'"~="") + local forcedrop = ("`forcedrop'"~="") + local lindep = ("`lindep'"~="") + local 0 `anything' + sreturn clear // clear any extraneous sreturn macros + syntax varlist(ts fv) + local tsops = ("`s(tsops)'"=="true") + local fvops = ("`s(fvops)'"=="true") + + if `tsops' | `fvops' { + if `expand' { + fvexpand `anything' if `touse' + local anything `r(varlist)' + fvrevar `anything' if `touse' + local fv_anything `r(varlist)' + } + else { +// already expanded and in set order +// loop through fvrevar so that it doesn't rebase or reorder + foreach var in `anything' { + fvrevar `var' if `touse' + local fv_anything `fv_anything' `r(varlist)' + } + } + } + else { + local fv_anything `anything' + } + + tempname wname + if "`normwt'"=="" { + qui gen byte `wname'=1 if `touse' + } + else { + qui gen double `wname' = `normwt' if `touse' + } + + mata: s_rmcoll2("`fv_anything'", "`anything'", "`wname'", "`touse'", `cons', `lindep') + + foreach var in `r(omitted)' { + di as text "note: `var' omitted because of collinearity" + } + + local omitted "`r(omitted)'" // has all omitted, both newly and previously omitted + local k_omitted =r(k_omitted) // but newly omitted not marked with omit operator o + if `lindep' { + tempname lindepmat + mat `lindepmat' = r(lindep) + mat rownames `lindepmat' = `anything' + mat colnames `lindepmat' = `anything' + } + +// Modern Stata version, add omitted notation to newly-missing vars + if `k_omitted' { + foreach var in `omitted' { + _ms_parse_parts `var' // check if already omitted + if r(omit) { // already omitted + local alreadyomitted `alreadyomitted' `var' + } + else { // not already omitted + ivreg2_rmc2_ms_put_omit `var' // add omitted omit operator o and replace in main varlist + local ovar `s(ospec)' + local anything : subinstr local anything "`var'" "`ovar'", word + } + } + if `newonly' { // omitted list should contain only newly omitted + local omitted : list omitted - alreadyomitted + local k_omitted : word count `omitted' + } + } + +// Return results + return scalar k_omitted =`k_omitted' + return local omitted `omitted' + return local varlist `anything' + if `lindep' { + return mat lindep `lindepmat' + } + +end + +// Used by ivreg2_rmcollright2 +// taken from later Stata - not available in Stata 11 +// version 1.0.0 28apr2011 +program ivreg2_rmc2_ms_put_omit, sclass + version 11.2 // added by MS + args vn + _ms_parse_parts `vn' + if r(type) =="variable" { + local name `r(name)' + local ovar o.`name' + } + if r(type) == "factor" { + if !r(base) { + local name `r(name)' + if "`r(ts_op)'" != "" { + local name `r(ts_op)'.`name' + } + local ovar `r(level)'o.`name' + } + else { + local ovar `vn' + } + } + else if r(type) == "interaction" { + local k = r(k_names) + + forval i = 1/`k' { + local name = r(name`i') + if "`r(ts_op`i')'" != "" { + local name `r(ts_op`i')'.`name' + } + if "`r(level`i')'" != "" { + if r(base`i') { + local name `r(level`i')'b.`name' + } + else { + local name `r(level`i')'o.`name' + } + } + else { + local name o.`name' + } + local spec `spec'`sharp'`name' + local sharp "#" + } + local ovar `spec' + + } + _msparse `ovar' + sreturn local ospec `r(stripe)' +end + + +******************************************************************************* +**************** SUBROUTINES FOR KERNEL-ROBUST ******************************** +******************************************************************************* + +// abw wants a varlist of [ eps | Z | touse] +// where Z includes all instruments, included and excluded, with constant if +// present as the last column; eps are a suitable set of residuals; and touse +// marks the observations in the data matrix used to generate the residuals +// (e.g. e(sample) of the appropriate model). +// The Noconstant option indicates that no constant term exists in the Z matrix. +// kern is the name of the HAC kernel. -ivregress- only provides definitions +// for Bartlett (default), Parzen, quadratic spectral. + +// returns the optimal bandwidth as local abw + +// abw 1.0.1 CFB 30jun2007 +// 1.0.1 : redefine kernel names (3 instances) to match ivreg2 +// 1.1.0 : pass nobs and tobs to s_abw; abw bug fix and also handles gaps in data correctly + +// not allowing fv operators, and tsrevar doesn't like them +// included fv and replaced tsrevar with fvrevar + +prog def abw, rclass + version 11.2 + syntax varlist(ts fv), [ tindex(varname) nobs(integer 0) tobs(integer 0) NOConstant Kernel(string)] +// validate kernel + if "`kernel'" == "" { + local kernel = "Bartlett" + } +// cfb B102 + if !inlist("`kernel'", "Bartlett", "Parzen", "Quadratic Spectral") { + di as err "Error: kernel `kernel' not compatible with bw(auto)" + return scalar abw = 1 + return local bwchoice "Kernel `kernel' not compatible with bw(auto); bw=1 (default)" + exit + } + else { +// set constant + local cons 1 + if "`noconstant'" != "" { + local cons 0 + } +// deal with ts ops ** using fvrevar ** +// tsrevar `varlist' + fvrevar `varlist' + local varlist1 `r(varlist)' + mata: s_abw("`varlist1'", "`tindex'", `nobs', `tobs', `cons', "`kernel'") + return scalar abw = `abw' + return local bwchoice "Automatic bw selection according to Newey-West (1994)" + } +end + + +******************************************************************************* +************** END SUBROUTINES FOR KERNEL-ROBUST ****************************** +******************************************************************************* + +******************************************************************************* +*************************** BEGIN MATA CODE *********************************** +******************************************************************************* + +// capture in case calling under version < 11.2 +capture version 11.2 + +mata: + +// For reference: +// struct ms_vcvorthog { +// string scalar ename, Znames, touse, weight, wvarname +// string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel +// string scalar sw, psd, ivarname, tvarname, tindexname +// real scalar wf, N, bw, tdelta, dofminus +// real scalar center +// real matrix ZZ +// pointer matrix e +// pointer matrix Z +// pointer matrix wvar +// } + + +void s_abw (string scalar Zulist, + string scalar tindexname, + real scalar nobs, + real scalar tobs, + real scalar cons, + string scalar kernel + ) +{ + +// nobs = number of observations = number of data points available = rows(uZ) +// tobs = time span of data = t_N - t_1 + 1 +// nobs = tobs if no gaps in data +// nobs < tobs if there are gaps +// nobs used below when calculating means, e.g., covariances in sigmahat. +// tobs used below when time span of data is needed, e.g., mstar. + + string rowvector Zunames, tov + string scalar v, v2 + real matrix uZ + real rowvector h + real scalar lenzu, abw + +// access the Stata variables in Zulist, honoring touse stored as last column + Zunames = tokens(Zulist) + lenzu=cols(Zunames)-1 + v = Zunames[|1\lenzu|] + v2 = Zunames[lenzu+1] + st_view(uZ,.,v,v2) + tnow=st_data(., tindexname) + +// assume constant in last col of uZ if it exists +// account for eps as the first column of uZ + if (cons) { + nrows1=cols(uZ)-2 + nrows2=1 + } + else { + nrows1=cols(uZ)-1 + nrows2=0 + } +// [R] ivregress p.42: referencing Newey-West 1994 REStud 61(4):631-653 +// define h indicator rowvector + h = J(nrows1,1,1) \ J(nrows2,1,0) + +// calc mstar per p.43 +// Hannan (1971, 296) & Priestley (1981, 58) per Newey-West p. 633 +// corrected per Alistair Hall msg to Brian Poi 17jul2008 +// T = rows(uZ) +// oneT = 1/T + expo = 2/9 + q = 1 +// cgamma = 1.4117 + cgamma = 1.1447 + if(kernel == "Parzen") { + expo = 4/25 + q = 2 + cgamma = 2.6614 + } +// cfb B102 + if(kernel == "Quadratic Spectral") { + expo = 2/25 + q = 2 + cgamma = 1.3221 + } +// per Newey-West p.639, Anderson (1971), Priestley (1981) may provide +// guidance on setting expo for other kernels +// mstar = trunc(20 *(T/100)^expo) +// use time span of data (not number of obs) + mstar = trunc(20 *(tobs/100)^expo) + +// calc uZ matrix + u = uZ[.,1] + Z = uZ[|1,2 \.,.|] + +// calc f vector: (u_i Z_i) * h + f = (u :* Z) * h + +// approach allows for gaps in time series + sigmahat = J(mstar+1,1,0) + for(j=0;j<=mstar;j++) { + lsj = "L"+strofreal(j) + tlag=st_data(., lsj+"."+tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix + // now calculate autocovariance; divide by nobs + sigmahat[j+1] = quadcross(f[tmatrix[.,1],.], f[tmatrix[.,2],.]) / nobs + } + +// calc shat(q), shat(0) + shatq = 0 + shat0 = sigmahat[1] + for(j=1;j<=mstar;j++) { + shatq = shatq + 2 * sigmahat[j+1] * j^q + shat0 = shat0 + 2 * sigmahat[j+1] + } + +// calc gammahat + expon = 1/(2*q+1) + gammahat = cgamma*( (shatq/shat0)^2 )^expon +// use time span of data tobs (not number of obs T) + m = gammahat * tobs^expon + +// calc opt lag + if(kernel == "Bartlett" | kernel == "Parzen") { + optlag = min((trunc(m),mstar)) + } + else if(kernel == "Quadratic Spectral") { + optlag = min((m,mstar)) + } + +// if optlag is the optimal lag to be used, we need to add one to +// specify bandwidth in ivreg2 terms + abw = optlag + 1 + st_local("abw",strofreal(abw)) +} // end program s_abw + + +// *********** s_rmcoll2 (replacement for Stata _rmcollright etc. ********** + +void s_rmcoll2( string scalar fv_vnames, + string scalar vnames, + string scalar wname, + string scalar touse, + scalar cons, + scalar lindep) +{ + st_view(X=., ., tokens(fv_vnames), touse) + st_view(w=., ., tokens(wname), touse) + st_view(mtouse=., ., tokens(touse), touse) + + if (cons) { + Xmean=mean(X,w) + XX=quadcrossdev(X,Xmean, w, X,Xmean) + } + else { + XX=quadcross(X, w, X) + } + + XXinv=invsym(XX, range(1,cols(X),1)) + + st_numscalar("r(k_omitted)", diag0cnt(XXinv)) + if (lindep) { + st_matrix("r(lindep)", XX*XXinv) + } + smat = (diagonal(XXinv) :== 0)' + vl=tokens(vnames) + vl_drop = select(vl, smat) + vl_keep = select(vl, (1 :- smat)) + + if (cols(vl_keep)>0) { + st_global("r(varlist)", invtokens(vl_keep)) + } + if (cols(vl_drop)>0) { + st_global("r(omitted)", invtokens(vl_drop)) + } +} // end program s_rmcoll2 + + +// ************** Add omitted Mata utility ************************ + +void s_AddOmitted( string scalar bname, + string scalar vname, + string scalar cnumlist, + scalar eq_ct, + scalar rhs0_ct, + scalar rhs1_ct) + +{ + b = st_matrix(bname) + V = st_matrix(vname) + cn = strtoreal(tokens(cnumlist)) +// cnumlist is the list of columns in the single-equation new big matrix in which +// the non-zero entries from the reduced matrix (bmat or vmat) will appear. +// E.g., if newb will be [mpg o.mpg2 _cons] then cnum = [1 3]. + col_ct = eq_ct * rhs0_ct + + newb = J(1,col_ct,0) + newV = J(col_ct,col_ct,0) + +// Code needs to accommodate multi-equation case. Since all equations will have +// same reduced and full list of vars, in the same order, can do this with Kronecker +// products etc. Second term below is basically the offset for each equation. + cn = (J(1,eq_ct,1) # cn) + ((range(0,eq_ct-1,1)' # J(1,rhs1_ct,1) ) * rhs0_ct) + +// Insert the values from the reduced matrices into the right places in the big matrices. + newb[1, cn] = b + newV[cn, cn] = V + + st_matrix("r(b)", newb) + st_matrix("r(V)", newV) + +} + + +// ************** Partial out ************************************* + +void s_partial( string scalar yname, + string scalar X1names, + string scalar X2names, + string scalar Z1names, + string scalar Pnames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + scalar cons) + +{ + +// All varnames should be basic form, no FV or TS operators etc. +// y = dep var +// X1 = endog regressors +// X2 = exog regressors = included IVs +// Z1 = excluded instruments +// Z2 = included IVs = X2 +// PZ = variables to partial out +// cons = 0 or 1 + + ytoken=tokens(yname) + X1tokens=tokens(X1names) + X2tokens=tokens(X2names) + Z1tokens=tokens(Z1names) + Ptokens=tokens(Pnames) + Ytokens = (ytoken, X1tokens, X2tokens, Z1tokens) + + st_view(wvar, ., st_tsrevar(wvarname), touse) + st_view(Y, ., Ytokens, touse) + st_view(P, ., Ptokens, touse) + L = cols(P) + + if (cons & L>0) { // Vars to partial out including constant + Ymeans = mean(Y,wf*wvar) + Pmeans = mean(P,wf*wvar) + PY = quadcrossdev(P, Pmeans, wf*wvar, Y, Ymeans) + PP = quadcrossdev(P, Pmeans, wf*wvar, P, Pmeans) + } + else if (!cons & L>0) { // Vars to partial out NOT including constant + PY = quadcross(P, wf*wvar, Y) + PP = quadcross(P, wf*wvar, P) + } + else { // Only constant to partial out = demean + Ymeans = mean(Y,wf*wvar) + } + +// Partial-out coeffs. Default Cholesky; use QR if not full rank and collinearities present. +// Not necessary if no vars other than constant + if (L>0) { + b = cholqrsolve(PP, PY) + } +// Replace with residuals + if (cons & L>0) { // Vars to partial out including constant + Y[.,.] = (Y :- Ymeans) - (P :- Pmeans)*b + } + else if (!cons & L>0) { // Vars to partial out NOT including constant + Y[.,.] = Y - P*b + } + else { // Only constant to partial out = demean + Y[.,.] = (Y :- Ymeans) + } + +} // end program s_partial + + + +// ************** Common cross-products ************************************* + +void s_crossprods( string scalar yname, + string scalar X1names, + string scalar X2names, + string scalar Z1names, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N) + +{ + +// y = dep var +// X1 = endog regressors +// X2 = exog regressors = included IVs +// Z1 = excluded instruments +// Z2 = included IVs = X2 + + ytoken=tokens(yname) + X1tokens=tokens(X1names) + X2tokens=tokens(X2names) + Z1tokens=tokens(Z1names) + + Xtokens = (X1tokens, X2tokens) + Ztokens = (Z1tokens, X2tokens) + + K1=cols(X1tokens) + K2=cols(X2tokens) + K=K1+K2 + L1=cols(Z1tokens) + L2=cols(X2tokens) + L=L1+L2 + + st_view(wvar, ., st_tsrevar(wvarname), touse) + st_view(A, ., st_tsrevar((ytoken, Xtokens, Z1tokens)), touse) + + AA = quadcross(A, wf*wvar, A) + + if (K>0) { + XX = AA[(2::K+1),(2..K+1)] + Xy = AA[(2::K+1),1] + } + if (K1>0) { + X1X1 = AA[(2::K1+1),(2..K1+1)] + } + + if (L1 > 0) { + Z1Z1 = AA[(K+2::rows(AA)),(K+2..rows(AA))] + } + + if (L2 > 0) { + Z2Z2 = AA[(K1+2::K+1), (K1+2::K+1)] + Z2y = AA[(K1+2::K+1), 1] + } + + if ((L1>0) & (L2>0)) { + Z2Z1 = AA[(K1+2::K+1), (K+2::rows(AA))] + ZZ2 = Z2Z1, Z2Z2 + ZZ1 = Z1Z1, Z2Z1' + ZZ = ZZ1 \ ZZ2 + } + else if (L1>0) { + ZZ = Z1Z1 + } + else { +// L1=0 + ZZ = Z2Z2 + ZZ2 = Z2Z2 + } + + if ((K1>0) & (L1>0)) { // K1>0, L1>0 + X1Z1 = AA[(2::K1+1), (K+2::rows(AA))] + } + + if ((K1>0) & (L2>0)) { + X1Z2 = AA[(2::K1+1), (K1+2::K+1)] + if (L1>0) { // K1>0, L1>0, L2>0 + X1Z = X1Z1, X1Z2 + XZ = X1Z \ ZZ2 + } + else { // K1>0, L1=0, L2>0 + XZ = X1Z2 \ ZZ2 + X1Z = X1Z2 + } + } + else if (K1>0) { // K1>0, L2=0 + XZ = X1Z1 + X1Z= X1Z1 + } + else if (L1>0) { // K1=0, L2>0 + XZ = AA[(2::K+1),(K+2..rows(AA))], AA[(2::K+1),(2..K+1)] + } + else { // K1=0, L2=0 + XZ = ZZ + } + + if ((L1>0) & (L2>0)) { + Zy = AA[(K+2::rows(AA)), 1] \ AA[(K1+2::K+1), 1] + ZY = AA[(K+2::rows(AA)), (1..K1+1)] \ AA[(K1+2::K+1), (1..K1+1)] + Z2Y = AA[(K1+2::K+1), (1..K1+1)] + } + else if (L1>0) { + Zy = AA[(K+2::rows(AA)), 1] + ZY = AA[(K+2::rows(AA)), (1..K1+1)] + } + else if (L2>0) { + Zy = AA[(K1+2::K+1), 1] + ZY = AA[(K1+2::K+1), (1..K1+1)] + Z2Y = ZY + } +// Zy, ZY, Z2Y not created if L1=L2=0 + + YY = AA[(1::K1+1), (1..K1+1)] + yy = AA[1,1] + st_subview(y, A, ., 1) + ym = sum(wf*wvar:*y)/N + yyc = quadcrossdev(y, ym, wf*wvar, y, ym) + + XXinv = invsym(XX) + if (Xtokens==Ztokens) { + ZZinv = XXinv + XPZXinv = XXinv + } + else { + ZZinv = invsym(ZZ) + XPZX = makesymmetric(XZ*ZZinv*XZ') + XPZXinv=invsym(XPZX) + } + +// condition numbers + condxx=cond(XX) + condzz=cond(ZZ) + + st_matrix("r(XX)", XX) + st_matrix("r(X1X1)", X1X1) + st_matrix("r(X1Z)", X1Z) + st_matrix("r(ZZ)", ZZ) + st_matrix("r(Z2Z2)", Z2Z2) + st_matrix("r(Z1Z2)", Z2Z1') + st_matrix("r(Z2y)",Z2y) + st_matrix("r(XZ)", XZ) + st_matrix("r(Xy)", Xy) + st_matrix("r(Zy)", Zy) + st_numscalar("r(yy)", yy) + st_numscalar("r(yyc)", yyc) + st_matrix("r(YY)", YY) + st_matrix("r(ZY)", ZY) + st_matrix("r(Z2Y)", Z2Y) + st_matrix("r(XXinv)", XXinv) + st_matrix("r(ZZinv)", ZZinv) + st_matrix("r(XPZXinv)", XPZXinv) + st_numscalar("r(condxx)",condxx) + st_numscalar("r(condzz)",condzz) + +} // end program s_crossprods + + +// *************** 1st step GMM ******************** // +// Can be either efficient or inefficient. +// Can be IV or other 1-step GMM estimator. + +void s_gmm1s( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar ZZinvmatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar Wmatrix, + string scalar Smatrix, + scalar dofminus, + scalar efficient, // flag to indicate that 1st-step GMM is efficient + scalar overid, // not guaranteed to be right if nocollin option used! + scalar useqr) // flag to force use of QR instead of Cholesky solver +{ + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + ZZ = st_matrix(ZZmatrix) + XX = st_matrix(XXmatrix) + XZ = st_matrix(XZmatrix) + Zy = st_matrix(Zymatrix) + ZZinv = st_matrix(ZZinvmatrix) + + QZZ = ZZ / N + QXX = XX / N + QXZ = XZ / N + QZy = Zy / N + QZZinv = ZZinv*N + + useqr = (diag0cnt(QZZinv)>0) | useqr + +// Weighting matrix supplied (and inefficient GMM) + if (Wmatrix~="") { + W = st_matrix(Wmatrix) + useqr = (diag0cnt(W)>0) | useqr + } +// Var-cov matrix of orthog conditions supplied + if (Smatrix~="") { + omega=st_matrix(Smatrix) + useqr = (diag0cnt(omega)>0) | useqr + } + + if (efficient) { // Efficient 1-step GMM block: OLS, IV or provided S + if ((Xtokens==Ztokens) & (Smatrix=="")) { // OLS + + beta = cholqrsolve(QZZ, QZy, useqr) + beta = beta' + e[.,.] = y - X * beta' // update residuals + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + omega = sigmasq * QZZ + W = 1/sigmasq * QZZinv + V = 1/N * sigmasq * QZZinv + rankS = rows(omega) - diag0cnt(QZZinv) // inv(omega) is proportional to inv(QZZ) + rankV = rows(V) - diag0cnt(V) // inv(V) is proportional to inv(QZZ) + } + else if (Smatrix=="") { // IV + aux1 = cholqrsolve(QZZ, QXZ', useqr) + aux2 = cholqrsolve(QZZ, QZy, useqr) + aux3 = makesymmetric(QXZ * aux1) + beta = cholqrsolve(aux3, QXZ * aux2, useqr) + beta = beta' + e[.,.] = y - X * beta' // update residuals + ee = quadcross(e, wf*wvar, e) + sigmasq = ee/(N-dofminus) + omega = sigmasq * QZZ + W = 1/sigmasq * QZZinv + V = 1/N * sigmasq * invsym(aux3) + rankS = rows(omega) - diag0cnt(QZZinv) // inv(omega) is proportional to inv(QZZ) + rankV = rows(V) - diag0cnt(V) // V is proportional to inv(aux3) + } + else { // efficient GMM with provided S (=omega) + aux1 = cholqrsolve(omega, QXZ', useqr) + aux2 = cholqrsolve(omega, QZy, useqr) + aux3 = makesymmetric(QXZ * aux1) + beta = cholqrsolve(aux3, QXZ * aux2, useqr) + beta = beta' + e[.,.] = y - X * beta' // update residuals + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + W = invsym(omega) + V = 1/N * invsym(aux3) // Normalize by N + rankS = rows(omega) - diag0cnt(W) // since W=inv(omega) + rankV = rows(V) - diag0cnt(V) // since V is prop to inv(aux3) + } + if (overid) { // J if overidentified + Ze = quadcross(Z, wf*wvar, e) + gbar = Ze / N + aux4 = cholqrsolve(omega, gbar, useqr) + j = N * gbar' * aux4 + } + else { + j=0 + } + st_matrix("r(beta)", beta) + st_matrix("r(V)", V) + st_matrix("r(S)", omega) + st_matrix("r(W)", W) + st_numscalar("r(rss)", ee) + st_numscalar("r(j)", j) + st_numscalar("r(sigmasq)", sigmasq) + st_numscalar("r(rankS)", rankS) + st_numscalar("r(rankV)", rankV) + } + else { // inefficient 1st-step GMM; don't need V, S, j etc. + if ((Xtokens==Ztokens) & (Wmatrix=="")) { // OLS + beta = cholqrsolve(QZZ, QZy, useqr) + beta = beta' + e[.,.] = y - X * beta' // update residuals + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + W = 1/sigmasq * QZZinv + QXZ_W_QZX = 1/sigmasq * QZZ // b/c W incorporates sigma^2 + } + else if (Wmatrix=="") { // IV + aux1 = cholqrsolve(QZZ, QXZ', useqr) + aux2 = cholqrsolve(QZZ, QZy, useqr) + aux3 = makesymmetric(QXZ * aux1) + beta = cholqrsolve(aux3, QXZ * aux2, useqr) + beta = beta' + e[.,.] = y - X * beta' // update residuals + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + W = 1/sigmasq * QZZinv + QXZ_W_QZX = 1/sigmasq * aux3 // b/c IV weighting matrix incorporates sigma^2 + } + else { // some other 1st step inefficient GMM with provided W + QXZ_W_QZX = QXZ * W * QXZ' + _makesymmetric(QXZ_W_QZX) + beta = cholqrsolve(QXZ_W_QZX, QXZ * W * QZy, useqr) + beta = beta' + e[.,.] = y - X * beta' // update residuals + } + st_matrix("r(QXZ_W_QZX)", QXZ_W_QZX) + st_matrix("r(beta)", beta) + st_matrix("r(W)",W) // always return W + } + +} // end program s_gmm1s + + +// *************** efficient GMM ******************** // +// Uses inverse of provided S matrix as weighting matrix. +// IV won't be done here but code would work for it as a special case. + +void s_egmm( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar ZZinvmatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar Smatrix, // always provided + scalar dofminus, + scalar overid, // not guaranteed to be right if -nocollin- used! + scalar useqr) +{ + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + ZZ = st_matrix(ZZmatrix) + XX = st_matrix(XXmatrix) + XZ = st_matrix(XZmatrix) + Zy = st_matrix(Zymatrix) + ZZinv = st_matrix(ZZinvmatrix) + + QZZ = ZZ / N + QXX = XX / N + QXZ = XZ / N + QZy = Zy / N + QZZinv = ZZinv*N + +// Var-cov matrix of orthog conditions supplied + omega=st_matrix(Smatrix) + W = invsym(omega) // Efficient GMM weighting matrix + rankS = rows(omega) - diag0cnt(W) // since W=inv(omega) + + if (rankS cols(X)) { + Ze = quadcross(Z, wf*wvar, e) + gbar = Ze / N + aux4 = cholqrsolve(omega, gbar, useqr) + j = N * gbar' * aux4 + } + else { + j=0 + } + + st_matrix("r(beta)", beta) + st_matrix("r(V)", V) + st_matrix("r(W)", W) + st_numscalar("r(rss)", ee) + st_numscalar("r(j)", j) + st_numscalar("r(sigmasq)", sigmasq) + st_numscalar("r(rankV)",rankV) + st_numscalar("r(rankS)",rankS) + +} // end program s_egmm + +// *************** inefficient GMM ******************** // + +void s_iegmm( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar QXZ_W_QZXmatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar Wmatrix, + string scalar Smatrix, + string scalar bname, + scalar dofminus, + scalar overid, + scalar useqr) +{ + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + QZZ = st_matrix(ZZmatrix) / N + QXX = st_matrix(XXmatrix) / N + QXZ = st_matrix(XZmatrix) / N + QZy = st_matrix(Zymatrix) / N + QXZ_W_QZX = st_matrix(QXZ_W_QZXmatrix) + + useqr = (diag0cnt(QXZ_W_QZX)>0) | useqr + +// beta is supplied + beta = st_matrix(bname) + +// Inefficient weighting matrix supplied + W = st_matrix(Wmatrix) + +// Var-cov matrix of orthog conditions supplied + omega=st_matrix(Smatrix) + +// Residuals are supplied + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + +// Calculate V and J. + +// V +// The GMM estimator is "root-N consistent", and technically we do +// inference on sqrt(N)*beta. By convention we work with beta, so we adjust +// the var-cov matrix instead: + aux5 = cholqrsolve(QXZ_W_QZX, QXZ * W, useqr) + V = 1/N * aux5 * omega * aux5' + _makesymmetric(V) + +// alternative +// QXZ_W_QZXinv=invsym(QXZ_W_QZX) +// V = 1/N * QXZ_W_QZXinv * QXZ * W * omega * W * QXZ' * QXZ_W_QZXinv + + rankV = rows(V) - diag0cnt(invsym(V)) // need explicitly to calc rank + rankS = rows(omega) - diag0cnt(invsym(omega)) // need explicitly to calc rank + +// J if overidentified + if (overid) { +// Note that J requires efficient GMM residuals, which means do 2-step GMM to get them. +// QXZ_W2s_QZX = QXZ * W2s * QXZ' +// _makesymmetric(QXZ_W2s_QZX) +// QXZ_W2s_QZXinv=invsym(QXZ_W2s_QZX) +// beta2s = (QXZ_W2s_QZXinv * QXZ * W2s * QZy) + aux1 = cholqrsolve(omega, QXZ', useqr) + aux2 = cholqrsolve(omega, QZy, useqr) + aux3s = makesymmetric(QXZ * aux1) + beta2s = cholqrsolve(aux3s, QXZ * aux2, useqr) + beta2s = beta2s' + e2s = y - X * beta2s' + Ze2s = quadcross(Z, wf*wvar, e2s) + gbar = Ze2s / N + aux4 = cholqrsolve(omega, gbar, useqr) + j = N * gbar' * aux4 + } + else { + j=0 + } + + st_matrix("r(V)", V) + st_numscalar("r(j)", j) + st_numscalar("r(rss)", ee) + st_numscalar("r(sigmasq)", sigmasq) + st_numscalar("r(rankV)",rankV) + st_numscalar("r(rankS)",rankS) + +} // end program s_iegmm + +// *************** LIML ******************** // + +void s_liml( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar Z2Z2matrix, + string scalar YYmatrix, + string scalar ZYmatrix, + string scalar Z2Ymatrix, + string scalar Xymatrix, + string scalar ZZinvmatrix, + string scalar yname, + string scalar Ynames, + string scalar ename, + string scalar Xnames, + string scalar X1names, + string scalar Znames, + string scalar Z1names, + string scalar Z2names, + scalar fuller, + scalar kclass, + string scalar coviv, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + scalar center, + scalar dofminus, + scalar useqr) + +{ + struct ms_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.center = center + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + + +// X1 = endog regressors +// X2 = exog regressors = included IVs +// Z1 = excluded instruments +// Z2 = included IVs = X2 + + Ytokens=tokens(Ynames) + Ztokens=tokens(Znames) + Z1tokens=tokens(Z1names) + Z2tokens=tokens(Z2names) + Xtokens=tokens(Xnames) + X1tokens=tokens(X1names) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + + vcvo.e = &e + vcvo.Z = &Z + vcvo.wvar = &wvar + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + QZZ = st_matrix(ZZmatrix) / N + QXX = st_matrix(XXmatrix) / N + QXZ = st_matrix(XZmatrix) / N + QZy = st_matrix(Zymatrix) / N + QZ2Z2 = st_matrix(Z2Z2matrix) / N + QYY = st_matrix(YYmatrix) / N + QZY = st_matrix(ZYmatrix) / N + QZ2Y = st_matrix(Z2Ymatrix) / N + QXy = st_matrix(Xymatrix) / N + QZZinv = st_matrix(ZZinvmatrix)*N + + useqr = (diag0cnt(QZZ)>0) | useqr + +// kclass=0 => LIML or Fuller LIML so calculate lambda + if (kclass == 0) { + aux1 = cholqrsolve(QZZ, QZY, useqr) + QWW = QYY - QZY'*aux1 + _makesymmetric(QWW) + if (cols(Z2tokens) > 0) { + aux2 = cholqrsolve(QZ2Z2, QZ2Y, useqr) + QWW1 = QYY - QZ2Y'*aux2 + _makesymmetric(QWW1) + } + else { +// Special case of no exogenous regressors + QWW1 = QYY + } + M=matpowersym(QWW, -0.5) + Eval=symeigenvalues(M*QWW1*M) + lambda=rowmin(Eval) + } + +// Exactly identified but might not be exactly 1, so make it so + if (cols(Z)==cols(X)) { + lambda=1 + } + + if (fuller > (N-cols(Z))) { +printf("\n{error:Error: invalid choice of Fuller LIML parameter.}\n") + exit(error(3351)) + } + else if (fuller > 0) { + k = lambda - fuller/(N-cols(Z)) + } + else if (kclass > 0) { + k = kclass + } + else { + k = lambda + } + + aux3 = cholqrsolve(QZZ, QXZ', useqr) + QXhXh=(1-k)*QXX + k*QXZ*aux3 + _makesymmetric(QXhXh) + aux4 = cholqrsolve(QZZ, QZy, useqr) + aux5 = cholqrsolve(QXhXh, QXZ, useqr) + aux6 = cholqrsolve(QXhXh, QXy, useqr) + beta = aux6*(1-k) + k*aux5*aux4 + beta = beta' + + e[.,.] = y - X * beta' + ee = quadcross(e, wf*wvar, e) + sigmasq = ee /(N-dofminus) + + omega = m_omega(vcvo) + + QXhXhinv=invsym(QXhXh) + + if ((robust=="") & (clustvarname=="") & (kernel=="")) { +// Efficient LIML + if (coviv=="") { +// Note dof correction is already in sigmasq + V = 1/N * sigmasq * QXhXhinv + rankV = rows(V) - diag0cnt(V) // since V is proportional to inv(QXhXh) + } + else { + aux7 = makesymmetric(QXZ * aux3) + V = 1/N * sigmasq * invsym(aux7) + rankV = rows(V) - diag0cnt(V) // since V is proportional to inv(aux7) + } + rankS = rows(omega) - diag0cnt(invsym(omega)) + if (cols(Z)>cols(X)) { + Ze = quadcross(Z, wf*wvar, e) + gbar = Ze / N + aux8 = cholqrsolve(omega, gbar, useqr) + j = N * gbar' * aux8 + } + else { + j=0 + } + } + else { +// Inefficient LIML + if (coviv=="") { + aux9 = cholqrsolve(QZZ, aux5', useqr) + V = 1/N * aux9' * omega * aux9 + _makesymmetric(V) + rankV = rows(V) - diag0cnt(invsym(V)) // need explicitly to calc rank + rankS = rows(omega) - diag0cnt(invsym(omega)) // need explicitly to calc rank + } + else { + aux10 = QXZ * aux3 + _makesymmetric(aux10) + aux11 = cholqrsolve(aux10, aux3', useqr) + V = 1/N * aux11 * omega * aux11' + _makesymmetric(V) + rankV = rows(V) - diag0cnt(invsym(V)) // need explicitly to calc rank + rankS = rows(omega) - diag0cnt(invsym(omega)) // need explicitly to calc rank + } + if (cols(Z)>cols(X)) { + aux12 = cholqrsolve(omega, QXZ', useqr) + aux13 = cholqrsolve(omega, QZy, useqr) + aux14 = makesymmetric(QXZ * aux12) + beta2s = cholqrsolve(aux14, QXZ * aux13, useqr) + beta2s = beta2s' + e2s = y - X * beta2s' + Ze2s = quadcross(Z, wf*wvar, e2s) + gbar = Ze2s / N + aux15 = cholqrsolve(omega, gbar, useqr) + j = N * gbar' * aux15 + } + else { + j=0 + } + } + _makesymmetric(V) + + st_matrix("r(beta)", beta) + st_matrix("r(S)", omega) + st_matrix("r(V)", V) + st_numscalar("r(lambda)", lambda) + st_numscalar("r(kclass)", k) + st_numscalar("r(j)", j) + st_numscalar("r(rss)", ee) + st_numscalar("r(sigmasq)", sigmasq) + st_numscalar("r(rankV)",rankV) + st_numscalar("r(rankS)",rankS) + +} // end program s_liml + + +// *************** CUE ******************** // + +void s_gmmcue( string scalar ZZmatrix, + string scalar XZmatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + string scalar bname, + string scalar b0name, + scalar center, + scalar dofminus, + scalar useqr) + +{ + + struct ms_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.center = center + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Pointers to views + vcvo.e = &e + vcvo.Z = &Z + vcvo.wvar = &wvar + py = &y + pX = &X + + if (b0name=="") { + +// CUE beta not supplied, so calculate/optimize + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + +// CUE is preceded by IV or 2-step GMM to get starting values. +// Stata convention is that parameter vectors are row vectors, and optimizers +// require this, so must conform to this in what follows. + + beta_init = st_matrix(bname) + +// What follows is how to set out an optimization in Stata. First, initialize +// the optimization structure in the variable S. Then tell Mata where the +// objective function is, that it's a minimization, that it's a "d0" type of +// objective function (no analytical derivatives or Hessians), and that the +// initial values for the parameter vector are in beta_init. Finally, optimize. + S = optimize_init() + + optimize_init_evaluator(S, &m_cuecrit()) + optimize_init_which(S, "min") + optimize_init_evaluatortype(S, "d0") + optimize_init_params(S, beta_init) +// CUE objective function takes 3 extra arguments: y, X and the structure with omega details + optimize_init_argument(S, 1, py) + optimize_init_argument(S, 2, pX) + optimize_init_argument(S, 3, vcvo) + optimize_init_argument(S, 4, useqr) + + beta = optimize(S) + +// The last evaluation of the GMM objective function is J. + j = optimize_result_value(S) + +// Call m_omega one last time to get CUE weighting matrix. + e[.,.] = y - X * beta' + omega = m_omega(vcvo) + } + else { +// CUE beta supplied, so obtain maximized GMM obj function at b0 + beta = st_matrix(b0name) + e[.,.] = y - X * beta' + omega = m_omega(vcvo) +// W = invsym(omega) + gbar = 1/N * quadcross(Z, wf*wvar, e) + j = N * gbar' * cholsolve(omega, gbar, useqr) +// j = N * gbar' * W * gbar + } + +// Bits and pieces + QXZ = st_matrix(XZmatrix)/N + + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + +// QXZ_W_QZX = QXZ * W * QXZ' +// _makesymmetric(QXZ_W_QZX) +// QXZ_W_QZXinv=invsym(QXZ_W_QZX) +// V = 1/N * QXZ_W_QZXinv + aux1 = cholsolve(omega, QXZ') + if (aux1[1,1]==.) { // omega not full rank; W=inv(omega) dubious, exit with error +errprintf("\nError: estimated covariance matrix of moment conditions not of full rank,") +errprintf("\n and optimal GMM weighting matrix not unique.") +errprintf("\nPossible causes:") +errprintf("\n collinearities in instruments (if -nocollin- option was used)") +errprintf("\n singleton dummy variable (dummy with one 1 and N-1 0s or vice versa)") +errprintf("\n {help ivreg2##partial:partial} option may address problem.\n") + exit(506) + } + aux3 = makesymmetric(QXZ * aux1) + V = 1/N * invsym(aux3) + if (diag0cnt(V)) { // V not full rank, likely caused by collinearities; + // b dubious, exit with error +errprintf("\nError: estimated variance matrix of b not of full rank, and CUE estimates") +errprintf("\n unreliable; may be caused by collinearities\n") + exit(506) + } + W = invsym(omega) + + st_matrix("r(beta)", beta) + st_matrix("r(S)", omega) + st_matrix("r(W)", W) + st_matrix("r(V)", V) + st_numscalar("r(j)", j) + st_numscalar("r(rss)", ee) + st_numscalar("r(sigmasq)", sigmasq) + +} // end program s_gmmcue + +// CUE evaluator function. +// Handles only d0-type optimization; todo, g and H are just ignored. +// beta is the parameter set over which we optimize, and +// J is the objective function to minimize. + +void m_cuecrit(todo, beta, pointer py, pointer pX, struct ms_vcvorthog scalar vcvo, useqr, j, g, H) +{ + *vcvo.e[.,.] = *py - *pX * beta' + + omega = m_omega(vcvo) + +// Calculate gbar=Z'*e/N + gbar = 1/vcvo.N * quadcross(*vcvo.Z, vcvo.wf*(*vcvo.wvar), *vcvo.e) + aux1 = cholqrsolve(omega, gbar, useqr) + j = vcvo.N * gbar' * aux1 + +// old method +// W = invsym(omega) +// j = vcvo.N * gbar' * W * gbar + +} // end program CUE criterion function + + +// ************** ffirst-stage stats ************************************* + +void s_ffirst( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar ZYmatrix, + string scalar ZZinvmatrix, + string scalar XXinvmatrix, + string scalar XPZXinvmatrix, + string scalar X2X2matrix, + string scalar Z1X2matrix, + string scalar X2ymatrix, + string scalar ename, // Nx1 + string scalar ematnames, // Nx(K1+1) + string scalar yname, + string scalar X1names, + string scalar X2names, + string scalar Z1names, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + scalar N_clust, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + scalar center, + scalar dofminus, + scalar sdofminus) + +{ + + struct ms_vcvorthog scalar vcvo + + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.center = center + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + +// X1 = endog regressors +// X2 = exog regressors = included IVs +// Z1 = excluded instruments +// Z2 = included IVs = X2 + + Xnames = invtokens( (X1names, X2names), " ") + Znames = invtokens( (Z1names, X2names), " ") + + st_view(y, ., st_tsrevar(tokens(yname)), touse) + st_view(X1, ., st_tsrevar(tokens(X1names)), touse) + st_view(Z1, ., st_tsrevar(tokens(Z1names)), touse) + st_view(X, ., st_tsrevar(tokens(Xnames)), touse) + st_view(Z, ., st_tsrevar(tokens(Znames)), touse) + st_view(e, ., ename, touse) + st_view(emat, ., tokens(ematnames), touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + + vcvo.wvar = &wvar + vcvo.Z = &Z + vcvo.Znames = Znames + vcvo.ZZ = st_matrix(ZZmatrix) + + if ("X2names"~="") { + st_view(X2, ., st_tsrevar(tokens(X2names)), touse) + } + + K1=cols(X1) + K2=cols(X2) + K=K1+K2 + L1=cols(Z1) + L2=cols(X2) + L=L1+L2 + df = L1 + df_r = N-L + + ZZinv = st_matrix(ZZinvmatrix) + XXinv = st_matrix(XXinvmatrix) + XPZXinv = st_matrix(XPZXinvmatrix) + QZZ = st_matrix(ZZmatrix) / N + QXX = st_matrix(XXmatrix) / N + QZX = st_matrix(XZmatrix)' / N + QZY = st_matrix(ZYmatrix) / N + QZZinv = ZZinv*N + QXXinv = XXinv*N + QX2X2 = st_matrix(X2X2matrix) / N + QZ1X2 = st_matrix(Z1X2matrix) / N + QX2y = st_matrix(X2ymatrix) / N + + sheaall = (diagonal(XXinv) :/ diagonal(XPZXinv)) // (X1, X2) in column vector + sheaall = (sheaall[(1::K1), 1 ])' // Just X1 in row vector + +// Full system of reduced form (col 1) and first-stage regressions + bz = cholsolve(QZZ, QZY) + Yhat = Z*bz + Xhat = Yhat[.,(2..(K1+1))], X2 +// VCV for full system + eall = (y, X1) - Yhat + ee = quadcross(eall, wf*wvar, eall) +// sigmas have large-sample dofminus correction incorporated but no small dof corrections + sigmasqall = ee / (N-dofminus) +// rmses have small dof corrections + rmseall = sqrt( ee / (N-L-dofminus-sdofminus) ) +// V has all the classical VCVs in block diagonals + V = sigmasqall # ZZinv +// For Wald test of excluded instruments + R = I(L1) , J(L1, L2, 0) +// For AP and SW stats + QXhXh = quadcross(Xhat, wf*wvar, Xhat) / N + QXhX1 = quadcross(Xhat, wf*wvar, X1 ) / N + +// VCV for system of first-stage eqns +// Can be robust; even if not, has correct off-block-diagonal covariances + vcvo.ename = ematnames + vcvo.e = &emat + emat[.,.] = eall + omegar = m_omega(vcvo) + Vr = makesymmetric(I(K1+1)#QZZinv * omegar * I(K1+1)#QZZinv) / N + +// AR statistics from RF (first column) + Rb = bz[ (1::L1), 1 ] + RVR = Vr[| 1,1 \ L1, L1 |] + ARWald = Rb' * cholsolve(RVR, Rb) + ARF = ARWald + ARdf = L1 + if (clustvarname=="") { + ARdf2 = (N-dofminus-L-sdofminus) + ARF = ARWald / (N-dofminus) * ARdf2 / ARdf + } + else { + ARdf2 = N_clust - 1 + ARF = ARWald / (N-1) * (N-L-sdofminus) /(N_clust) * ARdf2 / ARdf + } + ARFp = Ftail(ARdf, ARdf2, ARF) + ARchi2 = ARWald + ARchi2p = chi2tail(ARdf, ARchi2) + +// Stock-Wright LM S statistic +// Equivalent to J stat for model with coeff on endog=0 and with inexog partialled out +// = LM version of AR stat (matches weakiv) + if (K2>0) { + by = cholsolve(QX2X2, QX2y) + e[.,.] = y-X2*by + } + else { + e[.,.] = y + } +// initialize residual for VCV calc to be single Nx1 vector + vcvo.e = &e + vcvo.ename = ename +// get VCV and sstat=J + omega = m_omega(vcvo) + gbar = 1/N * quadcross(Z, wf*wvar, e) + sstat = N * gbar' * cholsolve(omega, gbar) + sstatdf = L1 + sstatp = chi2tail(sstatdf, sstat) + +// Prepare to loop over X1s for F, SW and AP stats +// initialize matrix to save first-stage results + firstmat=J(21,0,0) +// initialize residual for VCV calc to be single Nx1 vector + vcvo.e = &e + vcvo.ename = ename + + for (i=1; i<=K1; i++) { + +// RMSEs for first stage start in SECOND row/column (first has RF) + rmse = rmseall[i+1,i+1] +// Shea partial R2 + shea = sheaall[1,i] +// first-stage coeffs for ith X1. +// (nb: first column is reduced form eqn for y) + b=bz[., (i+1)] +// Classical Wald stat (chi2 here); also yields partial R2 +// Since r is an L1 x 1 zero vector, can use Rb instead of (Rb-r) + Rb = b[ (1::L1), . ] + RVR = V[| 1+i*L,1+i*L \ i*L+L1, i*L+L1 |] + Wald = Rb' * cholsolve(RVR, Rb) +// Wald stat has dofminus correction in it via sigmasq, +// so remove it to calculate partial R2 + pr2 = (Wald/(N-dofminus)) / (1 + (Wald/(N-dofminus))) + +// Robustify F stat if necessary. + if ((robust~="") | (clustvarname~="") | (kernel~="") | (sw~="")) { + RVR = Vr[| 1+i*L,1+i*L \ i*L+L1, i*L+L1 |] + Wald = Rb' * cholsolve(RVR, Rb) + } +// small dof adjustment is effectively additional L2, e.g., partialled-out regressors + df = L1 + if (clustvarname=="") { + df_r = (N-dofminus-L-sdofminus) + F = Wald / (N-dofminus) * df_r / df + } + else { + df_r = N_clust - 1 + F = Wald / (N-1) * (N-L-sdofminus) * (N_clust - 1) / N_clust / df + } + pvalue = Ftail(df, df_r, F) + +// If #endog=1, AP=SW=standard F stat + if (K1==1) { + Fdf1 = df + Fdf2 = df_r + SWF = F + SWFp = pvalue + SWchi2 = Wald + SWchi2p = chi2tail(Fdf1, SWchi2) + SWr2 = pr2 + APF = SWF + APFp = SWFp + APchi2 = SWchi2 + APchi2p = SWchi2p + APr2 = SWr2 + } + else { + +// Angrist-Pischke and Sanderson-Windmeijer stats etc. +// select matrix needed for both; will select all but the endog regressor of interest + selmat=J(1,K,1) + selmat[1,i]=0 // don't select endog regressor of interest + +// AP +// QXhXh is crossproduct of X1hats (fitted Xs) plus Z2s +// QXhX1 is crossproduct with X1s +// QXhXhi and QXhX1i remove the row/col for the endog regressor of interest + QXhXhi = select(select(QXhXh,selmat)', selmat) + QXhX1i = select(QXhX1[.,i], selmat') +// 1st step - in effect, 2nd stage of 2SLS using FITTED X1hats, and then get residuals e1 + b1=cholsolve(QXhXhi, QXhX1i) + QXhXhinv = invsym(QXhXhi) // Need this for V + b1=QXhXhinv*QXhX1i + e1 = X1[.,i] - select(Xhat,selmat)*b1 +// 2nd step - regress e1 on all Zs and test excluded ones + QZe1 = quadcross(Z, wf*wvar, e1 ) / N + b2=cholsolve(QZZ, QZe1) + APe2 = e1 - Z*b2 + ee = quadcross(APe2, wf*wvar, APe2) + sigmasq2 = ee / (N-dofminus) +// Classical V + Vi = sigmasq2 * QZZinv / N + APRb=b2[ (1::L1), .] + APRVR = Vi[ (1::L1), (1..L1) ] + APWald = APRb' * cholsolve(APRVR, APRb) +// Wald stat has dofminus correction in it via sigmasq, +// so remove it to calculate partial R2 + APr2 = (APWald/(N-dofminus)) / (1 + (APWald/(N-dofminus))) + +// Now SW stat +// Uses same 2SLS coeffs as AP but resids use ACTUAL X1 (not fitted X1) + e1 = X1[.,i] - select(X,selmat)*b1 +// next step - regress e on all Zs and test excluded ones + QZe1 = quadcross(Z, wf*wvar, e1 ) / N + b2=cholsolve(QZZ, QZe1) + SWe2 = e1 - Z*b2 + ee = quadcross(SWe2, wf*wvar, SWe2) + sigmasq2 = ee / (N-dofminus) + Vi = sigmasq2 * QZZinv / N + SWRb=b2[ (1::L1), .] + SWRVR = Vi[ (1::L1), (1..L1) ] + SWWald = SWRb' * cholsolve(SWRVR, SWRb) +// Wald stat has dofminus correction in it via sigmasq, +// so remove it to calculate partial R2 + SWr2 = (SWWald/(N-dofminus)) / (1 + (SWWald/(N-dofminus))) + +// Having calculated AP and SW R-sq based on non-robust Wald, now get robust Wald if needed. + if ((robust~="") | (clustvarname~="") | (kernel~="") | (sw~="")) { + e[.,1]=APe2 + omega=m_omega(vcvo) + Vi = makesymmetric(QZZinv * omega * QZZinv) / N + APRVR = Vi[ (1::L1), (1..L1) ] + APWald = APRb' * cholsolve(APRVR, APRb) // re-use APRb + e[.,1]=SWe2 + omega=m_omega(vcvo) + Vi = makesymmetric(QZZinv * omega * QZZinv) / N + SWRVR = Vi[ (1::L1), (1..L1) ] + SWWald = SWRb' * cholsolve(SWRVR, SWRb) // re-use SWRb + } + +// small dof adjustment is effectively additional L2, e.g., partialled-out regressors + Fdf1 = (L1-K1+1) + if (clustvarname=="") { + Fdf2 = (N-dofminus-L-sdofminus) + APF = APWald / (N-dofminus) * Fdf2 / Fdf1 + SWF = SWWald / (N-dofminus) * Fdf2 / Fdf1 + } + else { + Fdf2 = N_clust - 1 + APF = APWald / (N-1) * (N-L-sdofminus) * (N_clust - 1) / N_clust / Fdf1 + SWF = SWWald / (N-1) * (N-L-sdofminus) * (N_clust - 1) / N_clust / Fdf1 + } + APFp = Ftail(Fdf1, Fdf2, APF) + APchi2 = APWald + APchi2p = chi2tail(Fdf1, APchi2) + SWFp = Ftail(Fdf1, Fdf2, SWF) + SWchi2 = SWWald + SWchi2p = chi2tail(Fdf1, SWchi2) + } + +// Assemble results + firstmat = firstmat , /// + (rmse \ shea \ pr2 \ F \ df \ df_r \ pvalue /// + \ SWF \ Fdf1 \ Fdf2 \ SWFp \ SWchi2 \ SWchi2p \ SWr2 /// + \ APF \ Fdf1 \ Fdf2 \ APFp \ APchi2 \ APchi2p \ APr2) + } // end of loop for an X1 variable + + st_numscalar("r(rmse_rf)", rmseall[1,1]) + st_matrix("r(firstmat)", firstmat) + st_matrix("r(b)", bz) + st_matrix("r(V)", Vr) + st_matrix("r(S)", omegar) + st_numscalar("r(archi2)", ARchi2) + st_numscalar("r(archi2p)", ARchi2p) + st_numscalar("r(arf)", ARF) + st_numscalar("r(arfp)", ARFp) + st_numscalar("r(ardf)", ARdf) + st_numscalar("r(ardf_r)", ARdf2) + st_numscalar("r(sstat)",sstat) + st_numscalar("r(sstatp)",sstatp) + st_numscalar("r(sstatdf)",sstatdf) + +} // end program s_ffirst + +// ********************************************************************** + +void s_omega( + string scalar ZZmatrix, + string scalar ename, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + scalar center, + scalar dofminus) +{ + + struct ms_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.center = center + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + + st_view(Z, ., st_tsrevar(tokens(Znames)), touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + st_view(e, ., vcvo.ename, touse) + + vcvo.e = &e + vcvo.Z = &Z + vcvo.wvar = &wvar + + ZZ = st_matrix(ZZmatrix) + + S=m_omega(vcvo) + + st_matrix("r(S)", S) +} // end of s_omega program + + +// Mata utility for sequential use of solvers +// Default is cholesky; +// if that fails, use QR; +// if overridden, use QR. + +function cholqrsolve ( numeric matrix A, + numeric matrix B, + | real scalar useqr) +{ + if (args()==2) useqr = 0 + + real matrix C + + if (!useqr) { + C = cholsolve(A, B) + if (C[1,1]==.) { + C = qrsolve(A, B) + } + } + else { + C = qrsolve(A, B) + } + + return(C) + +} + +end // end Mata section + +exit // exit before loading comments + +********************************** VERSION COMMENTS ********************************** +* Initial version cloned from official ivreg version 5.0.9 19Dec2001 +* 1.0.2: add logic for reg3. Sargan test +* 1.0.3: add prunelist to ensure that count of excluded exogeneous is correct +* 1.0.4: revise option to exog(), allow included exog to be specified as well +* 1.0.5: switch from reg3 to regress, many options and output changes +* 1.0.6: fixed treatment of nocons in Sargan and C-stat, and corrected problems +* relating to use of nocons combined with a constant as an IV +* 1.0.7: first option reports F-test of excluded exogenous; prunelist bug fix +* 1.0.8: dropped prunelist and switched to housekeeping of variable lists +* 1.0.9: added collinearity checks; C-stat calculated with recursive call; +* added ffirst option to report only F-test of excluded exogenous +* from 1st stage regressions +* 1.0.10: 1st stage regressions also report partial R2 of excluded exogenous +* 1.0.11: complete rewrite of collinearity approach - no longer uses calls to +* _rmcoll, does not track specific variables dropped; prunelist removed +* 1.0.12: reorganised display code and saved results to enable -replay()- +* 1.0.13: -robust- and -cluster- now imply -small- +* 1.0.14: fixed hascons bug; removed ivreg predict fn (it didn't work); allowed +* robust and cluster with z stats and correct dofs +* 1.0.15: implemented robust Sargan stat; changed to only F-stat, removed chi-sq; +* removed exog option (only orthog works) +* 1.0.16: added clusterised Sargan stat; robust Sargan handles collinearities; +* predict now works with standard SE options plus resids; fixed orthog() +* so it accepts time series operators etc. +* 1.0.17: fixed handling of weights. fw, aw, pw & iw all accepted. +* 1.0.18: fixed bug in robust Sargan code relating to time series variables. +* 1.0.19: fixed bugs in reporting ranks of X'X and Z'Z +* fixed bug in reporting presence of constant +* 1.0.20: added GMM option and replaced robust Sargan with (equivalent) J; +* added saved statistics of 1st stage regressions +* 1.0.21: added Cragg HOLS estimator, including allowing empty endog list; +* -regress- syntax now not allowed; revised code searching for "_cons" +* 1.0.22: modified cluster output message; fixed bug in replay for Sargan/Hansen stat; +* exactly identified Sargan/Hansen now exactly zero and p-value not saved as e(); +* cluster multiplier changed to 1 (from buggy multiplier), in keeping with +* eg Wooldridge 2002 p. 193. +* 1.0.23: fixed orthog option to prevent abort when restricted equation is underid. +* 1.0.24: fixed bug if 1st stage regressions yielded missing values for saving in e(). +* 1.0.25: Added Shea version of partial R2 +* 1.0.26: Replaced Shea algorithm with Godfrey algorithm +* 1.0.27: Main call to regress is OLS form if OLS or HOLS is specified; error variance +* in Sargan and C statistics use small-sample adjustment if -small- option is +* specified; dfn of S matrix now correctly divided by sample size +* 1.0.28: HAC covariance estimation implemented +* Symmetrize all matrices before calling syminv +* Added hack to catch F stats that ought to be missing but actually have a +* huge-but-not-missing value +* Fixed dof of F-stat - was using rank of ZZ, should have used rank of XX (couldn't use df_r +* because it isn't always saved. This is because saving df_r triggers small stats +* (t and F) even when -post- is called without dof() option, hence df_r saved only +* with -small- option and hence a separate saved macro Fdf2 is needed. +* Added rankS to saved macros +* Fixed trap for "no regressors specified" +* Added trap to catch gmm option with no excluded instruments +* Allow OLS syntax (no endog or excluded IVs specified) +* Fixed error messages and traps for rank-deficient robust cov matrix; includes +* singleton dummy possibility +* Capture error if posting estimated VCV that isn't pos def and report slightly +* more informative error message +* Checks 3 variable lists (endo, inexog, exexog) separately for collinearities +* Added AC (autocorrelation-consistent but conditionally-homoskedastic) option +* Sargan no longer has small-sample correction if -small- option +* robust, cluster, AC, HAC all passed on to first-stage F-stat +* bw must be < T +* 1.0.29 -orthog- also displays Hansen-Sargan of unrestricted equation +* Fixed collinearity check to include nocons as well as hascons +* Fixed small bug in Godfrey-Shea code - macros were global rather than local +* Fixed larger bug in Godfrey-Shea code - was using mixture of sigma-squares from IV and OLS +* with and without small-sample corrections +* Added liml and kclass +* 1.0.30 Changed order of insts macro to match saved matrices S and W +* 2.0.00 Collinearities no longer -qui- +* List of instruments tested in -orthog- option prettified +* 2.0.01 Fixed handling of nocons with no included exogenous, including LIML code +* 2.0.02 Allow C-test if unrestricted equation is just-identified. Implemented by +* saving Hansen-Sargan dof as = 0 in e() if just-identified. +* 2.0.03 Added score() option per latest revision to official ivreg +* 2.0.04 Changed score() option to pscore() per new official ivreg +* 2.0.05 Fixed est hold bug in first-stage regressions +* Fixed F-stat finite sample adjustment with cluster option to match official Stata +* Fixed F-stat so that it works with hascons (collinearity with constant is removed) +* Fixed bug in F-stat code - wasn't handling failed posting of vcv +* No longer allows/ignores nonsense options +* 2.0.06 Modified lsStop to sync with official ivreg 5.1.3 +* 2.0.07a Working version of CUE option +* Added sortpreserve, ivar and tvar options +* Fixed smalls bug in calculation of T for AC/HAC - wasn't using the last ob +* in QS kernel, and didn't take account of possible dropped observations +* 2.0.07b Fixed macro bug that truncated long varlists +* 2.0.07c Added dof option. +* Changed display of RMSE so that more digits are displayed (was %8.1g) +* Fixed small bug where cstat was local macro and should have been scalar +* Fixed bug where C stat failed with cluster. NB: wmatrix option and cluster are not compatible! +* 2.0.7d Fixed bug in dof option +* 2.1.0 Added first-stage identification, weak instruments, and redundancy stats +* 2.1.01 Tidying up cue option checks, reporting of cue in output header, etc. +* 2.1.02 Used Poskitt-Skeels (2002) result that C-D eval = cceval / (1-cceval) +* 2.1.03 Added saved lists of separate included and excluded exogenous IVs +* 2.1.04 Added Anderson-Rubin test of signif of endog regressors +* 2.1.05 Fix minor bugs relating to cluster and new first-stage stats +* 2.1.06 Fix bug in cue: capture estimates hold without corresponding capture on estimates unhold +* 2.1.07 Minor fix to ereturn local wexp, promote to version 8.2 +* 2.1.08 Added dofminus option, removed dof option. Added A-R test p-values to e(). +* Minor bug fix to A-R chi2 test - was N chi2, should have been N-L chi2. +* Changed output to remove potentially misleading refs to N-L etc. +* Bug fix to rhs count - sometimes regressors could have exact zero coeffs +* Bug fix related to cluster - if user omitted -robust-, orthog would use Sargan and not J +* Changed output of Shea R2 to make clearer that F and p-values do not refer to it +* Improved handling of collinearites to check across inexog, exexog and endo lists +* Total weight statement moved to follow summ command +* Added traps to catch errors if no room to save temporary estimations with _est hold +* Added -savefirst- option. Removed -hascons-, now synonymous with -nocons-. +* 2.1.09 Fixes to dof option with cluster so it no longer mimics incorrect areg behavior +* Local ivreg2cmd to allow testing under name ivreg2 +* If wmatrix supplied, used (previously not used if non-robust sargan stat generated) +* Allowed OLS using (=) syntax (empty endo and exexog lists) +* Clarified error message when S matrix is not of full rank +* cdchi2p, ardf, ardf_r added to saved macros +* first and ffirst replay() options; DispFirst and DispFFirst separately codes 1st stage output +* Added savefprefix, macro with saved first-stage equation names. +* Added version option. +* Added check for duplicate variables to collinearity checks +* Rewrote/simplified Godfrey-Shea partial r2 code +* 2.1.10 Added NOOUTput option +* Fixed rf bug so that first does not trigger unnecessary saved rf +* Fixed cue bug - was not starting with robust 2-step gmm if robust/cluster +* 2.1.11 Dropped incorrect/misleading dofminus adjustments in first-stage output summary +* 2.1.12 Collinearity check now checks across inexog/exexog/endog simultaneously +* 2.1.13 Added check to catch failed first-stage regressions +* Fixed misleading failed C-stat message +* 2.1.14 Fixed mishandling of missing values in AC (non-robust) block +* 2.1.15 Fixed bug in RF - was ignoring weights +* Added -endog- option +* Save W matrix for all cases; ensured copy is posted with wmatrix option so original isn't zapped +* Fixed cue bug - with robust, was entering IV block and overwriting correct VCV +* 2.1.16 Added -fwl- option +* Saved S is now robust cov matrix of orthog conditions if robust, whereas W is possibly non-robust +* weighting matrix used by estmator. inv(S)=W if estimator is efficient GMM. +* Removed pscore option (dropped by official ivreg). +* Fixed bug where -post- would fail because of missing values in vcv +* Remove hascons as synonym for nocons +* OLS now outputs 2nd footer with variable lists +* 2.1.17 Reorganization of code +* Added ll() macro +* Fixed N bug where weights meant a non-integer ob count that was rounded down +* Fixed -fwl- option so it correctly handles weights (must include when partialling-out) +* smatrix option takes over from wmatrix option. Consistent treatment of both. +* Saved smatrix and wmatrix now differ in case of inefficient GMM. +* Added title() and subtitle() options. +* b0 option returns a value for the Sargan/J stat even if exactly id'd. +* (Useful for S-stat = value of GMM objective function.) +* HAC and AC now allowed with LIML and k-class. +* Collinearity improvements: bug fixed because collinearity was mistakenly checked across +* inexog/exexog/endog simultaneously; endog predicted exactly by IVs => reclassified as inexog; +* _rmcollright enforces inexog>endo>exexog priority for collinearities, if Stata 9.2 or later. +* K-class, LIML now report Sargan and J. C-stat based on Sargan/J. LIML reports AR if homosked. +* nb: can always easily get a C-stat for LIML based on diff of two AR stats. +* Always save Sargan-Hansen as e(j); also save as e(sargan) if homoskedastic. +* Added Stock-Watson robust SEs options sw() +* 2.1.18 Added Cragg-Donald-Stock-Yogo weak ID statistic critical values to main output +* Save exexog_ct, inexog_ct and endog_ct as macros +* Stock-Watson robust SEs now assume ivar is group variable +* Option -sw- is standard SW. Option -swpsd- is PSD version a la page 6 point 10. +* Added -noid- option. Suppresses all first-stage and identification statistics. +* Internal calls to ivreg2 use noid option. +* Added hyperlinks to ivreg2.hlp and helpfile argument to display routines to enable this. +* 2.1.19 Added matrix rearrangement and checks for smatrix and wmatrix options +* Recursive calls to cstat simplified - no matrix rearrangement or separate robust/nonrobust needed +* Reintroduced weak ID stats to ffirst output +* Added robust ID stats to ffirst output for case of single endogenous regressor +* Fixed obscure bug in reporting 1st stage partial r2 - would report zero if no included exogenous vars +* Removed "HOLS" in main output (misleading if, e.g., estimation is AC but not HAC) +* Removed "ML" in main output if no endogenous regressors - now all ML is labelled LIML +* model=gmm is now model=gmm2s; wmatrix estimation is model=gmm +* wmatrix relates to gmm estimator; smatrix relates to gmm var-cov matrix; b0 behavior equiv to wmatrix +* b0 option implies nooutput and noid options +* Added nocollin option to skip collinearity checks +* Fixed minor display bug in ffirst output for endog vars with varnames > 12 characters +* Fixed bug in saved rf and first-stage results for vars with long varnames; uses permname +* Fixed bug in model df - had counted RHS, now calculates rank(V) since latter may be rank-deficient +* Rank of V now saved as macro rankV +* fwl() now allows partialling-out of just constant with _cons +* Added Stock-Wright S statistic (but adds overhead - calls preserve) +* Properties now include svyj. +* Noted only: fwl bug doesn't allow time-series operators. +* 2.1.20 Fixed Stock-Wright S stat bug - didn't allow time-series operators +* 2.1.21 Fixed Stock-Wright S stat to allow for no exog regressors cases +* 2.2.00 CUE partials out exog regressors, estimates endog coeffs, then exog regressors separately - faster +* gmm2s becomes standard option, gmm supported as legacy option +* 2.2.01 Added explanatory messages if gmm2s used. +* States if estimates efficient for/stats consistent for het, AC, etc. +* Fixed small bug that prevented "{help `helpfile'##fwl:fwl}" from displaying when -capture-d. +* Error message in footer about insuff rank of S changed to warning message with more informative message. +* Fixed bug in CUE with weights. +* 2.2.02 Removed CUE partialling-out; still available with fwl +* smatrix and wmatrix become documented options. e(model)="gmmw" means GMM with arbitrary W +* 2.2.03 Fixed bug in AC with aweights; was weighting zi'zi but not ei'ei. +* 2.2.04 Added abw code for bw(), removed properties(svyj) +* 2.2.05 Fixed bug in AC; need to clear variable vt1 at start of loop +* If iweights, N (#obs with precision) rounded to nearest integer to mimic official Stata treatment +* and therefore don't need N scalar at all - will be same as N +* Saves fwl_ct as macro. +* -ffirst- output, weak id stat, etc. now adjust for number of partialled-out variables. +* Related changes: df_m, df_r include adjustments for partialled-out variables. +* Option nofwlsmall introduced - suppresses above adjustments. Undocumented in ivreg2.hlp. +* Replaced ID tests based on canon corr with Kleibergen-Paap rk-based stats if not homoskedastic +* Replaced LR ID test stats with LM test stats. +* Checks that -ranktest- is installed. +* 2.2.06 Fixed bug with missing F df when cue called; updated required version of ranktest +* 2.2.07 Modified redundancy test statistic to match standard regression-based LM tests +* Change name of -fwl- option to -partial-. +* Use of b0 means e(model)=CUE. Added informative b0 option titles. b0 generates output but noid. +* Removed check for integer bandwidth if auto option used. +* 2.2.08 Add -nocollin- to internal calls and to -ivreg2_cue- to speed performance. +* 2.2.09 Per msg from Brian Poi, Alastair Hall verifies that Newey-West cited constant of 1.1447 +* is correct. Corrected mata abw() function. Require -ranktest- 1.1.03. +* 2.2.10 Added Angrist-Pischke multivariate f stats. Rewrite of first and ffirst output. +* Added Cragg-Donald to weak ID output even when non-iid. +* Fixed small bug in non-robust HAC code whereby extra obs could be used even if dep var missing. +* (required addition of L`tau'.(`s1resid') in creation of second touse variable) +* Fixed bugs that zapped varnames with "_cons" in them +* Changed tvar and ivar setup so that data must be tsset or xtset. +* Fixed bug in redundancy test stat when called by xtivreg2+cluster - no dofminus adj needed in this case +* Changed reporting so that gaps between panels are not reported as such. +* Added check that weight variable is not transformed by partialling out. +* Changed Stock-Wright S statistic so that it uses straight partialling-out of exog regressors +* (had been, in effect, doing 2SGMM partialling-out) +* Fixed bug where dropped collinear endogenous didn't get a warning or listing +* Removed N*CDEV Wald chi-sq statistic from ffirst output (LM stat enough) +* 3.0.00 Fully rewritten and Mata-ized code. Require min Stata 10.1 and ranktest 1.2.00. +* Mata support for Stock-Watson SEs for fixed effects estimator; doesn't support fweights. +* Changed handling of iweights yielding non-integer N so that (unlike official -regress-) all calcs +* for RMSE etc. use non-integer N and N is rounded down only at the end. +* Added support for Thompson/Cameron-Gelbach-Miller 2-level cluster-robust vcvs. +* 3.0.01 Now exits more gracefully if no regressors survive after collinearity checks +* 3.0.02 -capture- instead of -qui- before reduced form to suppress not-full-rank error warning +* Modified Stock-Wright code to partial out all incl Xs first, to reduce possibility of not-full-rank +* omega and missing sstat. Added check within Stock-Wright code to catch not-full-rank omega. +* Fixed bug where detailed first-stage stats with cluster were disrupted if data had been tsset +* using a different variables. +* Fixed bug that didn't allow regression on just a constant. +* Added trap for no observations. +* Added trap for auto bw with panel data - not allowed. +* 3.0.03 Fixed bug in m_omega that always used Stock-Watson spectral decomp to create invertible shat +* instead of only when (undocumented) spsd option is called. +* Fixed bug where, if matsize too small, exited with wrong error (mistakenly detected as collinearities) +* Removed inefficient call to -ranktest- that unnecessarily requested stats for all ranks, not just full. +* 3.0.04 Fixed coding error in m_omega for cluster+kernel. Was *vcvo.e[tmatrix[.,1]], should have been (*vcvo.e)[tmatrix[.,1]]. +* Fixed bug whereby clusters defined by strings were not handled correctly. +* Updated ranktest version check +* 3.0.05 Added check to catch unwanted transformations of time or panel variables by partial option. +* 3.0.06 Fixed partial bug - partialcons macro saved =0 unless _cons explicitly in partial() varlist +* 3.0.07 kclass was defaulting to LIML - fixed. +* Renamed spsd option to psda (a=abs) following Stock-Watson 2008. Added psd0 option following Politis 2007. +* Fixed bug that would prevent RF and first-stage with cluster and TS operators if cluster code changed sort order. +* Modified action if S matrix is not full rank and 2-step GMM chosen. Now continue but report problem in footer +* and do not report J stat etc. +* 3.0.08 Fixed cluster+bw; was not using all observations of all panel units if panel was unbalanced. +* Fixed inconsequential bug in m_omega that caused kernel loop to be entered (with no impact) even if kernel=="" +* Fixed small bug that compared bw to T instead of (correctly) to T/delta when checking that bw can't be too long. +* Added dkraay option = cluster on t var + kernel-robust +* Added kiefer option = truncated kernel, bw=T (max), and no robust +* Fixed minor reporting bug that reported time-series gaps in entire panel dataset rather than just portion touse-d. +* Recoded bw and kernel checks into subroutine vkernel. Allow non-integer bandwidth within check as in ranktest. +* 3.1.01 First ivreg2 version with accompanying Mata library (shared with -ranktest-). Mata library includes +* struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Fixed bug in 2-way cluster code (now in m_omega in Mata library) - would crash if K>1 (relevant for -ranktest- only). +* 3.1.02 Converted cdsy to Mata code and moved to Mata library. Standardized spelling/caps/etc. of QS as "Quadratic Spectral". +* 3.1.03 Improved partialling out in s_sstat and s_ffirst: replaced qrsolve with invsym. +* 3.1.04 Fixed minor bug in s_crossprod - would crash with L1=0 K1>0, and also with K=0 +* 3.1.05 Fixed minor bug in orthog - wasn't saving est results if eqn w/o suspect instruments did not execute properly +* Fixed minor bug in s_cccollin() - didn't catch perverse case of K1>0 (endog regressors) and L1=0 (no excl IVs) +* 3.1.06 Spelling fix for Danielle kernel, correct error check for bw vs T-1 +* 3.1.07 Fixed bug that would prevent save of e(sample) when partialling out just a constant +* 3.1.08 01Jan14. Fixed reporting bug with 2-way clustering and kernel-robust that would give wrong count for 2nd cluster variable. +* 3.1.09 13July14. _rmcollright under version control has serious bug for v10 and earlier. Replaced with canon corr approach. +* Fixed obscure bug in estimation sample - was not using obs when tsset tvar is missing, even if TS operators not used. +* Fixed bug in auto bw code so now ivreg2 and ivregress agree. Also, ivreg2 auto bw code handles gaps in TS correctly. +* 4.0.00 25Jan15. Promote to require Stata version 11.2 +* Rewrite of s_gmm1s, s_iegmm, s_egmm etc. to use matrix solvers rather than inversion. +* rankS and rankV now calculated along with estimators; rankS now always saved. +* Returned to use of _rmcollright to detect collinearities since bug was in Stata 10's _rmcollright and now not relevant. +* Added reporting of collinearities and duplicates in replay mode. +* Rewrite of legacy support for previous ivreg2x version. Main program calls ivreg2x depending on _caller(). +* Estimation and replay moved to ivreg211 subroutine above. +* 4.0.01 8Feb15. Fixed bug in default name and command used used for saved first and RF equations +* Fixed bug in saved command line (was ivreg211, should be ivreg2). +* 4.0.02 9Feb15. Changed forced exit at Stata <11 before continuing loading to forced exit pre-Mata code at Stata <9. +* 4.1.00 Substantial rewrite to allow factor variables. Now also accepts TS ops as well as FV ops in partial varlist. +* Rewrite included code for dropped/collinear/reclassified. +* Saved RF and 1st-stage estimations have "if e(sample)" instead of "if `touse'" in e(cmdline). +* Rewrite of s_gmm1s etc. to use qrsolve if weighting matrix not full rank or cholsolve fails +* Fixed bug in display subroutines that would display hyperlink to wrong (nonexistent) help file. +* 4.1.01 15Jun15. Fixed bug that did not allow dropped variables to be in partial(.) varlist. +* Major rewrite of parsing code and collinearity/dropped/reclassified code. +* Added support for display options noomitted, vsquish, noemptycells, baselevels, allbaselevels. +* Changed from _rmcoll/_rmcollright/_rmcoll2list to internal ivreg2_rmcollright2 +* Changed failure of ranktest to obtain id stats to non-fatal so that estimation proceeds. +* Removed recount via _rmcoll if noid option specified +* Added partial(_all) option. +* Improved checks of smatrix, wmatrix, b0 options +* Rewrite of first-stage and reduced form code; rewrite of replay(.) functionality +* Added option for displaying system of first-stage/reduced form eqns. +* Replaced AP first-stage test stats with SW (Sanderson-Windmeijer) first-stage stats +* Corrected S LM stat option; now calcuated in effect as J stat for case of no endog (i.e. b=0) +* with inexog partialled out i.e. LM version of AR stat; now matches weakiv +* Undocumented FV-related options: fvsep (expand endo, inexog, exexog separately) fvall (expand together) +* 4.1.02 17Jun15. Fixed bug in collinearity check - was ignoring weights. +* More informative error message if invalid matrix provided to smatrix(.) or wmatrix(.) options. +* Caught error if depvar was FV or TS var that expanded to >1 variable. +* 4.1.03 18Jun15. Fixed bug with robust + rf option. +* 4.1.04 18Jun15. Fixed bug in AR stat with dofminus option + cluster (was subtracting dof, shouldn't). +* 4.1.05 18Jun15. Added rmse, df_m, df_r to saved RF and first-stage equation results. +* 4.1.06 4July15. Replaced mvreg with Mata code for partialling out (big speed gains with many vars). +* Rewrote AddOmitted to avoid inefficient loop; replaced with Mata subscripting. +* Failure of id stats because of collinearities triggers error message only; estimation continues. +* Calculation of dofs etc. uses rankS and rankV instead of iv1_ct and rhs1_ct; +* counts are therefore correct even in presence of collinearities and use of nocollin option. +* nocollin options triggers use of QR instead of default Cholesky. +* rankxx and rankzz now based on diag0cnt of (XX)^-1 and (ZZ)^-1. +* CUE fails if either S or V not full rank; can happen if nocollin option used. +* Added undocumented useqr option to force use of QR instead of Cholesky. +* Misc other code tweaks to make results more robust to nocollin option. +* 4.1.07 12July15. Fixed bugs in calculation of rank(V) (had miscounted in some cases if omega not full rank) +* Changed calc of dofs etc. from rankS and rankV to rankzz and rankxx (had miscounted in some cases etc.). +* Restored warning message for all exog regressors case if S not full rank. +* 4.1.08 27July15. Replaced wordcount(.) function with word count macro in AddOmitted; +* AddOmitted called only if any omitted regressors to add. +* Added center option for centering moments. +* 4.1.09 20Aug15. Expanded error message for failure to save first-stage estimations (var name too long). +* Fixed bug when weighting used with new partial-out code (see 4.1.06 4July15). +* Tweaked code so that if called under Stata version < 11, main ivreg2.ado is exited immediately after +* loading parent ivreg2 program. Removed automatic use of QR solver when nocollin option used. +* Added saved condition numbers for XX and ZZ. +* e(cmdline) now saves original string including any "s (i.e., saves `0' instead of `*'). +* 4.1.10 Fixed bug with posting first-stage results if sort had been disrupted by Mata code. +* Fixed bug which mean endog(.) and orthog(.) varlists weren't saved or displayed. +* 4.1.11 22Nov19. Added caller(.) option to ivreg211 subroutine to pass version of parent Stata _caller(.). +* Local macro with this parent Stata version is `caller'. +* Changed calls to ranktest so that if parent Stata is less than version 16, +* ranktest is called under version control as version 11.2: ranktest ..., +* otherwise it is called as version `caller': ranktest ... . +* Added macro e(ranktestcmd); will be ranktest, or ranktest11, or .... +* 4.1.12 14aug2024 Found that abw did not work with FVs. Allowed FVs, substtuted +* fvrevar for tsrevar in the abw routine. diff --git a/ado/i/ivreg2.sthlp b/ado/i/ivreg2.sthlp new file mode 100644 index 0000000..3ec39f5 --- /dev/null +++ b/ado/i/ivreg2.sthlp @@ -0,0 +1,1787 @@ +{smcl} +{* 30July2015}{...} +{hline} +help for {hi:ivreg2} +{hline} + +{title:Extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression} + +{p 4}Full syntax + +{p 8 14}{cmd:ivreg2} {it:depvar} [{it:varlist1}] +{cmd:(}{it:varlist2}{cmd:=}{it:varlist_iv}{cmd:)} [{it:weight}] +[{cmd:if} {it:exp}] [{cmd:in} {it:range}] +{bind:[{cmd:,} {cmd:gmm2s}} +{cmd:bw(}{it:#}{cmd:)} +{cmd:kernel(}{it:string}{cmd:)} +{cmd:dkraay(}{it:integer}{cmd:)} +{cmd:kiefer} +{cmd:liml} +{cmd:fuller(}{it:#}{cmd:)} +{cmd:kclass(}{it:#}{cmd:)} +{cmd:coviv} +{cmd:cue} +{cmd:b0}{cmd:(}{it:matrix}{cmd:)} +{cmdab:r:obust} +{cmdab:cl:uster}{cmd:(}{it:varlist}{cmd:)} +{cmd:orthog(}{it:varlist_ex}{cmd:)} +{cmd:endog(}{it:varlist_en}{cmd:)} +{cmdab:red:undant(}{it:varlist_ex}{cmd:)} +{cmd:partial(}{it:varlist}{cmd:)} +{cmdab:sm:all} +{cmdab:noc:onstant} +{cmd:center} +{cmd:smatrix}{cmd:(}{it:matrix}{cmd:)} +{cmd:wmatrix}{cmd:(}{it:matrix}{cmd:)} +{cmd:first} {cmd:ffirst} {cmd:savefirst} {cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:sfirst} {cmd:savesfirst} {cmdab:savesfp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:rf} {cmd:saverf} {cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:nocollin} {cmd:noid} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmd:bvclean} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{bind:{cmd:plus} ]} + +{p 4}Replay syntax + +{p 8 14}{cmd:ivreg2} +{bind:[{cmd:,} {cmd:first}} {cmd:sfirst} +{cmd:ffirst} {cmd:rf} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{cmd:plus} ]} + +{p 4}Version syntax + +{p 8 14}{cmd:ivreg2}, {cmd:version} + +{p}{cmd:ivreg2} is compatible with Stata version 8 or later. +The most-up-to-date implementation of {cmd:ivreg2} requires +Stata version 11 or later. +If {cmd:ivreg2} is called under earlier versions of Stata, +it will run a legacy version {cmd:ivreg2x}. +See below under {help ivreg2##s_versions:Running ivreg2 under earlier versions of Stata} +for details. + +{p}{cmd:ivreg2} may be used with time-series or panel data, +in which case the data must be {cmd:tsset} +before using {cmd:ivreg2}; see help {help tsset}. + +{p}All {it:varlists} may contain time-series operators or factor variables; +see help {help varlist}. + +{p}{cmd:by}, {cmd:rolling}, {cmd:statsby}, {cmd:xi}, +{cmd:bootstrap} and {cmd:jackknife} are allowed; see help {help prefix}. + +{p}{cmd:aweight}s, {cmd:fweight}s, {cmd:iweight}s and {cmd:pweight}s +are allowed; see help {help weights}. + +{p}The syntax of {help predict} following {cmd:ivreg2} is + +{p 8 16}{cmd:predict} [{it:type}] {it:newvarname} [{cmd:if} {it:exp}] +[{cmd:in} {it:range}] [{cmd:,} {it:statistic}] + +{p}where {it:statistic} is + +{p 8 23}{cmd:xb}{space 11}fitted values; the default{p_end} +{p 8 23}{cmdab:r:esiduals}{space 4}residuals{p_end} +{p 8 23}{cmd:stdp}{space 9}standard error of the prediction{p_end} + +{p}These statistics are available both in and out of sample; +type "{cmd:predict} {it:...} {cmd:if e(sample)} {it:...}" +if wanted only for the estimation sample. + +{title:Contents} +{p 2}{help ivreg2##s_description:Description}{p_end} +{p 2}{help ivreg2##s_robust:Robust, cluster and 2-way cluster, AC, HAC, and cluster+HAC SEs and statistics}{p_end} +{p 2}{help ivreg2##s_gmm:GMM estimation}{p_end} +{p 2}{help ivreg2##s_liml:LIML, k-class and GMM-CUE estimation}{p_end} +{p 2}{help ivreg2##s_sumopt:Summary of robust, HAC, AC, GMM, LIML and CUE options}{p_end} +{p 2}{help ivreg2##s_overid:Testing overidentifying restrictions}{p_end} +{p 2}{help ivreg2##s_endog:Testing subsets of regressors and instruments for endogeneity}{p_end} +{p 2}{help ivreg2##s_relevance:Tests of under- and weak identification}{p_end} +{p 2}{help ivreg2##s_redundancy:Testing instrument redundancy}{p_end} +{p 2}{help ivreg2##s_first:First-stage regressions, identification, and weak-id-robust inference}{p_end} +{p 2}{help ivreg2##s_rf:Reduced form estimates}{p_end} +{p 2}{help ivreg2##s_partial:Partialling-out exogenous regressors}{p_end} +{p 2}{help ivreg2##s_ols:OLS and Heteroskedastic OLS (HOLS) estimation}{p_end} +{p 2}{help ivreg2##s_collin:Collinearities}{p_end} +{p 2}{help ivreg2##s_speed:Speed options: nocollin and noid}{p_end} +{p 2}{help ivreg2##s_small:Small sample corrections}{p_end} +{p 2}{help ivreg2##s_options:Options summary}{p_end} +{p 2}{help ivreg2##s_versions:Running ivreg2 under earlier versions of Stata}{p_end} +{p 2}{help ivreg2##s_macros:Remarks and saved results}{p_end} +{p 2}{help ivreg2##s_examples:Examples}{p_end} +{p 2}{help ivreg2##s_refs:References}{p_end} +{p 2}{help ivreg2##s_acknow:Acknowledgements}{p_end} +{p 2}{help ivreg2##s_citation:Authors}{p_end} +{p 2}{help ivreg2##s_citation:Citation of ivreg2}{p_end} + +{marker s_description}{title:Description} + +{p}{cmd:ivreg2} implements a range of single-equation estimation methods +for the linear regression model: OLS, instrumental +variables (IV, also known as two-stage least squares, 2SLS), +the generalized method of moments (GMM), +limited-information maximum likelihood (LIML), and k-class estimators. +In the language of IV/GMM, {it:varlist1} are the exogenous +regressors or "included instruments", +{it:varlist_iv} are the exogenous variables excluded +from the regression or "excluded instruments", +and {it:varlist2} the endogenous regressors that are being "instrumented". + +{p}{cmd:ivreg2} will also estimate linear regression models using +robust (heteroskedastic-consistent), +autocorrelation-consistent (AC), +heteroskedastic and autocorrelation-consistent (HAC) +and cluster-robust variance estimates. + +{p}{cmd:ivreg2} is an alternative to Stata's official {cmd:ivregress}. +Its features include: +two-step feasible GMM estimation ({cmd:gmm2s} option) +and continuously-updated GMM estimation ({cmd:cue} option); +LIML and k-class estimation; +automatic output of overidentification and underidentification test statistics; +C statistic test of exogeneity of subsets of instruments +({cmd:orthog()} option); +endogeneity tests of endogenous regressors +({cmd:endog()} option); +test of instrument redundancy +({cmd:redundant()} option); +kernel-based autocorrelation-consistent (AC) +and heteroskedastic and autocorrelation consistent (HAC) standard errors +and covariance estimation ({cmd:bw(}{it:#}{cmd:)} option), +with user-specified choice of kernel ({cmd:kernel()} option); +two-level {cmd:cluster}-robust standard errors and statistics; +default reporting of large-sample statistics +(z and chi-squared rather than t and F); +{cmd:small} option to report small-sample statistics; +first-stage regressions reported with various tests and statistics for +identification and instrument relevance; +{cmd:ffirst} option to report only these identification statistics +and not the first-stage regression results themselves. +{cmd:ivreg2} can also be used for ordinary least squares (OLS) estimation +using the same command syntax as official {cmd:regress} and {cmd:newey}. + +{marker s_robust}{dlgtab:Robust, cluster and 2-level cluster, AC, HAC, and cluster+HAC SEs and statistics} + +{p}The standard errors and test statistics reported by {cmd:ivreg2} can be made consistent +to a variety of violations of the assumption of i.i.d. errors. +When these options are combined with +either the {cmd:gmm2s} or {cmd:cue} options (see below), +the parameter estimators reported are also efficient +in the presence of the same violation of i.i.d. errors. + +{p}The options for SEs and statistics are:{break} +{bind:(1) {cmd:robust}} causes {cmd:ivreg2} to report SEs and statistics that are +robust to the presence of arbitrary heteroskedasticity.{break} +{bind:(2) {cmd:cluster}({it:varname})} SEs and statistics are robust to both +arbitrary heteroskedasticity and arbitrary intra-group correlation, +where {it:varname} identifies the group. +See the relevant Stata manual entries on obtaining robust covariance estimates +for further details.{break} +{bind:(3) {cmd:cluster}({it:varname1 varname2})} provides 2-way clustered SEs +and statistics (Cameron et al. 2006, Thompson 2009) +that are robust to arbitrary heteroskedasticity and intra-group correlation +with respect to 2 non-nested categories defined by {it:varname1} and {it:varname2}. +See below for a detailed description.{break} +{bind:(4) {cmd:bw(}{it:#}{cmd:)}} requests AC SEs and statistics that are +robust to arbitrary autocorrelation.{break} +{bind:(5) {cmd:bw(}{it:#}{cmd:)}} combined with {cmd:robust} +requests HAC SEs and statistics that are +robust to both arbitrary heteroskedasticity and arbitrary autocorrelation.{break} +{bind:(6) {cmd:bw(}{it:#}{cmd:)}} combined with {cmd:cluster}({it:varname}) +is allowed with either 1- or 2-level clustering if the data are panel data +that are {cmd:tsset} on the time variable {it:varname}. +Following Driscoll and Kray (1998), +the SEs and statistics reported will be robust to disturbances +that are common to panel units and that are persistent, i.e., autocorrelated.{break} +{bind:(7) {cmd:dkraay(}{it:#}{cmd:)}} is a shortcut for the Driscoll-Kraay SEs +for panel data in (6). +It is equivalent to clustering on the {cmd:tsset} time variable +and the bandwidth supplied as {it:#}. +The default kernel Bartlett kernel can be overridden with the {cmd:kernel} option.{break} +{bind:(8) {cmd:kiefer}} implements SEs and statistics for panel data +that are robust to arbitrary intra-group autocorrelation +(but {it:not} heteroskedasticity) as per Kiefer (1980). +It is equivalent to to specifying the truncated kernel with {cmd:kernel(tru)} +and {cmd:bw(}{it:#}{cmd:)} where {it:#} is the full length of the panel. + +{p}Details: + +{p}{cmd:cluster}({it:varname1 varname2}) provides 2-way cluster-robust SEs +and statistics as proposed by Cameron, Gelbach and Miller (2006) and Thompson (2009). +"Two-way cluster-robust" means the SEs and statistics +are robust to arbitrary within-group correlation in two distinct non-nested categories +defined by {it:varname1} and {it:varname2}. +A typical application would be panel data where one "category" is the panel +and the other "category" is time; +the resulting SEs are robust +to arbitrary within-panel autocorrelation (clustering on panel id) +and to arbitrary contemporaneous cross-panel correlation (clustering on time). +There is no point in using 2-way cluster-robust SEs if the categories are nested, +because the resulting SEs are equivalent to clustering on the larger category. +{it:varname1} and {it:varname2} do not have to +uniquely identify observations. +The order of {it:varname1} and {it:varname2} does not matter for the results, +but processing may be faster if the category with the larger number of categories +(typically the panel dimension) is listed first. + +{p}Cameron, Gelbach and Miller (2006) show how this approach can accommodate +multi-way clustering, where the number of different non-nested categories is arbitary. +Their Stata command {cmd:cgmreg} implements 2-way and multi-way clustering +for OLS estimation. +The two-way clustered variance-covariance estimator +is calculated using 3 different VCEs: one clustered on {it:varname1}, +the second clustered on {it:varname2}, and the third clustered on the +intersection of {it:varname1} and {it:varname2}. +Cameron et al. (2006, pp. 8-9) discuss two possible small-sample adjustments +using the number of clusters in each category. +{cmd:cgmreg} uses one method (adjusting the 3 VCEs separately based on +the number of clusters in the categories VCE clusters on); +{cmd:ivreg2} uses the second (adjusting the final 2-way cluster-robust VCE +using the smaller of the two numbers of clusters). +For this reason, {cmd:ivreg2} and {cmd:cgmreg} will produce slightly different SEs. +See also {help ivreg2##s_small:small sample corrections} below. + +{p}{cmd:ivreg2} allows a variety of options for kernel-based HAC and AC estimation. +The {cmd:bw(}{it:#}{cmd:)} option sets the bandwidth used in the estimation +and {cmd:kernel(}{it:string}{cmd:)} is the kernel used; +the default kernel is the Bartlett kernel, +also known in econometrics as Newey-West (see help {help newey}). +The full list of kernels available is (abbreviations in parentheses): +Bartlett (bar); Truncated (tru); Parzen (par); Tukey-Hanning (thann); +Tukey-Hamming (thamm); Daniell (dan); Tent (ten); and Quadratic-Spectral (qua or qs). +When using the Bartlett, Parzen, or Quadratic spectral kernels, the automatic +bandwidth selection procedure of Newey and West (1994) can be chosen +by specifying {cmd:bw(}{it:auto}{cmd:)}. +{cmd:ivreg2} can also be used for kernel-based estimation +with panel data, i.e., a cross-section of time series. +Before using {cmd:ivreg2} for kernel-based estimation +of time series or panel data, +the data must be {cmd:tsset}; see help {help tsset}. + +{p}Following Driscoll and Kraay (1998), +{cmd:bw(}{it:#}{cmd:)} combined with {cmd:cluster}({it:varname}) +and applied to panel data produces SEs that are +robust to arbitary common autocorrelated disturbances. +The data must be {cmd:tsset} with the time variable specified as {it:varname}. +Driscoll-Kraay SEs also can be specified using the {cmd:dkraay(}{it:#}{cmd:)}} option, +where {it:#} is the bandwidth. +The default Bartlett kernel can be overridden with the {cmd:kernel} option. +Note that the Driscoll-Kraay variance-covariance estimator is a large-T estimator, +i.e., the panel should have a long-ish time-series dimension. + +{p}Used with 2-way clustering as per Thompson (2009), +{cmd:bw(}{it:#}{cmd:)} combined with {cmd:cluster}({it:varname}) +provides SEs and statistics that are robust +to autocorrelated within-panel disturbances (clustering on panel id) +and to autocorrelated across-panel disturbances (clustering on time +combined with kernel-based HAC). +The approach proposed by Thompson (2009) can be implemented in {cmd:ivreg2} +by choosing the truncated kernel {cmd:kernel(}{it:tru}{cmd:)} +and {cmd:bw(}{it:#}{cmd:)}, where the researcher knows or assumes +that the common autocorrelated disturbances can be ignored after {it:#} periods. + +{p}{cmd:Important:} Users should be aware of the asymptotic requirements +for the consistency of the chosen VCE. +In particular: consistency of the 1-way cluster-robust VCE requires +the number of clusters to go off to infinity; +consistency of the 2-way cluster-robust VCE requires the numbers of +clusters in both categories to go off to infinity; +consistency of kernel-robust VCEs requires the numbers of +observations in the time dimension to go off to infinity. +See Angrist and Pischke (2009), Cameron et al. (2006) and Thompson (2009) +for detailed discussions of the performance of the cluster-robust VCE +when the numbers of clusters is small. + +{marker s_gmm}{dlgtab:GMM estimation} + +{p}When combined with the above options, the {cmd:gmm2s} option generates +efficient estimates of the coefficients as well as consistent +estimates of the standard errors. +The {cmd:gmm2s} option implements the two-step efficient +generalized method of moments (GMM) estimator. +The efficient GMM estimator minimizes the GMM criterion function +J=N*g'*W*g, where N is the sample size, +g are the orthogonality or moment conditions +(specifying that all the exogenous variables, or instruments, +in the equation are uncorrelated with the error term) +and W is a weighting matrix. +In two-step efficient GMM, the efficient or optimal weighting matrix +is the inverse of an estimate of the covariance matrix of orthogonality conditions. +The efficiency gains of this estimator relative to the +traditional IV/2SLS estimator derive from the use of the optimal +weighting matrix, the overidentifying restrictions of the model, +and the relaxation of the i.i.d. assumption. +For an exactly-identified model, +the efficient GMM and traditional IV/2SLS estimators coincide, +and under the assumptions of conditional homoskedasticity and independence, +the efficient GMM estimator is the traditional IV/2SLS estimator. +For further details, see Hayashi (2000), pp. 206-13 and 226-27. + +{p}The {cmd:center} option specifies that the moments in the GMM weighting matrix +are centered so that they have mean zero. +There is some evidence that the use of centered moments leads to better +finite-sample performance; see e.g. Hall (2005), pp. 131-8 and 145-8. + +{p}The {cmd:wmatrix} option allows the user to specify a weighting matrix +rather than computing the optimal weighting matrix. +Estimation with the {cmd:wmatrix} option yields a possibly inefficient GMM estimator. +{cmd:ivreg2} will use this inefficient estimator as the first-step GMM estimator +in two-step efficient GMM when combined with the {cmd:gmm2s} option; +otherwise, {cmd:ivreg2} reports the regression results +using this inefficient GMM estimator. + +{p}The {cmd:smatrix} option allows the user to directly +specify the matrix S, the covariance matrix of orthogonality conditions. +{cmd:ivreg2} will use this matrix in the calculation of the variance-covariance +matrix of the estimator, the J statistic, +and, if the {cmd:gmm2s} option is specified, +the two-step efficient GMM coefficients. +The {cmd:smatrix} can be useful for guaranteeing a positive test statistic +in user-specified "GMM-distance tests" (see {help ivreg2##s_endog:below}). +For further details, see Hayashi (2000), pp. 220-24. + +{marker s_liml}{dlgtab:LIML, k-class and GMM-CUE estimation} + +{marker liml}{p} Maximum-likelihood estimation of a single equation of this form +(endogenous RHS variables and excluded instruments) +is known as limited-information maximum likelihood or LIML. +The overidentifying restrictions test +reported after LIML estimation is the Anderson-Rubin (1950) overidentification +statistic in a homoskedastic context. +LIML, OLS and IV/2SLS are examples of k-class estimators. +LIML is a k-class estimator with k=the LIML eigenvalue lambda; +2SLS is a k-class estimator with k=1; +OLS is a k-class esimator with k=0. +Estimators based on other values of k have been proposed. +Fuller's modified LIML (available with the {cmd:fuller(}{it:#}{cmd:)} option) +sets k = lambda - alpha/(N-L), where lambda is the LIML eigenvalue, +L = number of instruments (L1 excluded and L2 included), +and the Fuller parameter alpha is a user-specified positive constant. +Nagar's bias-adjusted 2SLS estimator can be obtained with the +{cmd:kclass(}{it:#}{cmd:)} option by setting +k = 1 + (L-K)/N, where L-K = number of overidentifying restrictions, +K = number of regressors (K1 endogenous and K2=L2 exogenous) +and N = the sample size. +For a discussion of LIML and k-class estimators, +see Davidson and MacKinnon (1993, pp. 644-51). + +{p} The GMM generalization of the LIML estimator +to the case of possibly heteroskedastic +and autocorrelated disturbances +is the "continuously-updated" GMM estimator or CUE +of Hansen, Heaton and Yaron (1996). +The CUE estimator directly maximizes the GMM objective function +J=N*g'*W(b_cue)*g, where W(b_cue) is an optimal weighting matrix +that depends on the estimated coefficients b_cue. +{cmd:cue}, combined with {cmd:robust}, {cmd:cluster}, and/or {cmd:bw}, +generates coefficient estimates that are efficient in the presence +of the corresponding deviations from homoskedasticity. +Specifying {cmd:cue} with no other options +is equivalent to the combination of the options {cmd:liml} and {cmd:coviv}. +The CUE estimator requires numerical optimization methods, +and the implementation here uses Mata's {cmd:optimize} routine. +The starting values are either IV or two-step efficient GMM +coefficient estimates. +If the user wants to evaluate the CUE objective function at +an arbitrary user-defined coefficient vector instead of having {cmd:ivreg2} +find the coefficient vector that minimizes the objective function, +the {cmd:b0(}{it:matrix}{cmd:)} option can be used. +The value of the CUE objective function at {cmd:b0} +is the Sargan or Hansen J statistic reported in the output. + +{marker s_sumopt}{dlgtab:Summary of robust, HAC, AC, GMM, LIML and CUE options} + + + +Estimator {col 20}No VCE option specificed {col 65}VCE option + option {col 60}{cmd:robust}, {cmd:cluster}, {cmd:bw}, {cmd:kernel} +{hline} +(none){col 15}IV/2SLS{col 60}IV/2SLS with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:liml}{col 15}LIML{col 60}LIML with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:gmm2s}{col 15}IV/2SLS{col 60}Two-step GMM with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:cue}{col 15}LIML{col 60}CUE GMM with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:kclass}{col 15}k-class estimator{col 60}k-class estimator with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:wmatrix}{col 15}Possibly inefficient GMM{col 60}Ineff GMM with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:gmm2s} + {col 15}Two-step GMM{col 60}Two-step GMM with +{cmd:wmatrix}{col 15}with user-specified first step{col 60}robust SEs +{col 15}SEs consistent under homoskedasticity + + +{p}With the {cmd:bw} or {cmd:bw} and {cmd:kernel} VCE options, +SEs are autocorrelation-robust (AC). +Combining the {cmd:robust} option with {cmd:bw}, SEs are heteroskedasticity- and +autocorrelation-robust (HAC). + +{p}For further details, see Hayashi (2000), pp. 206-13 and 226-27 +(on GMM estimation), Wooldridge (2002), p. 193 (on cluster-robust GMM), +and Hayashi (2000), pp. 406-10 or Cushing and McGarvey (1999) +(on kernel-based covariance estimation). + +{marker s_overid}{marker overidtests}{dlgtab:Testing overidentifying restrictions} + +{p}The Sargan-Hansen test is a test of overidentifying restrictions. +The joint null hypothesis is that the instruments are valid +instruments, i.e., uncorrelated with the error term, +and that the excluded instruments are correctly excluded from the estimated equation. +Under the null, the test statistic is distributed as chi-squared +in the number of (L-K) overidentifying restrictions. +A rejection casts doubt on the validity of the instruments. +For the efficient GMM estimator, the test statistic is +Hansen's J statistic, the minimized value of the GMM criterion function. +For the 2SLS estimator, the test statistic is Sargan's statistic, +typically calculated as N*R-squared from a regression of the IV residuals +on the full set of instruments. +Under the assumption of conditional homoskedasticity, +Hansen's J statistic becomes Sargan's statistic. +The J statistic is consistent in the presence of heteroskedasticity +and (for HAC-consistent estimation) autocorrelation; +Sargan's statistic is consistent if the disturbance is homoskedastic +and (for AC-consistent estimation) if it is also autocorrelated. +With {cmd:robust}, {cmd:bw} and/or {cmd:cluster}, +Hansen's J statistic is reported. +In the latter case the statistic allows observations +to be correlated within groups. +For further discussion see e.g. Hayashi (2000, pp. 227-8, 407, 417). + +{p}The Sargan statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg2} by the command {cmd:overid}. +The features of {cmd:ivreg2} that are unavailable in {cmd:overid} +are the J statistic and the C statistic; +the {cmd:overid} options unavailable in {cmd:ivreg2} +are various small-sample and pseudo-F versions of Sargan's statistic +and its close relative, Basmann's statistic. +See help {help overid} (if installed). + +{marker s_endog}{dlgtab:Testing subsets of regressors and instruments for endogeneity} + +{marker ctest}{p}The C statistic +(also known as a "GMM distance" +or "difference-in-Sargan" statistic) +implemented using the {cmd:orthog} option, +allows a test of a subset of the orthogonality conditions, i.e., +it is a test of the exogeneity of one or more instruments. +It is defined as +the difference of the Sargan-Hansen statistic +of the equation with the smaller set of instruments +(valid under both the null and alternative hypotheses) +and the equation with the full set of instruments, +i.e., including the instruments whose validity is suspect. +Under the null hypothesis that +both the smaller set of instruments +and the additional, suspect instruments are valid, +the C statistic is distributed as chi-squared +in the number of instruments tested. +Note that failure to reject the null hypothesis +requires that the full set of orthogonality conditions be valid; +the C statistic and the Sargan-Hansen test statistics +for the equations with both the smaller and full set of instruments +should all be small. +The instruments tested may be either excluded or included exogenous variables. +If excluded exogenous variables are being tested, +the equation that does not use these orthogonality conditions +omits the suspect instruments from the excluded instruments. +If included exogenous variables are being tested, +the equation that does not use these orthogonality conditions +treats the suspect instruments as included endogenous variables. +To guarantee that the C statistic is non-negative in finite samples, +the estimated covariance matrix of the full set orthogonality conditions +is used to calculate both Sargan-Hansen statistics +(in the case of simple IV/2SLS, this amounts to using the MSE +from the unrestricted equation to calculate both Sargan statistics). +If estimation is by LIML, the C statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For further discussion, see Hayashi (2000), pp. 218-22 and pp. 232-34. + +{marker endogtest}{p}Endogeneity tests of one or more endogenous regressors +can implemented using the {cmd:endog} option. +Under the null hypothesis that the specified endogenous regressors +can actually be treated as exogenous, the test statistic is distributed +as chi-squared with degrees of freedom equal to the number of regressors tested. +The endogeneity test implemented by {cmd:ivreg2}, is, like the C statistic, +defined as the difference of two Sargan-Hansen statistics: +one for the equation with the smaller set of instruments, +where the suspect regressor(s) are treated as endogenous, +and one for the equation with the larger set of instruments, +where the suspect regressors are treated as exogenous. +Also like the C statistic, the estimated covariance matrix used +guarantees a non-negative test statistic. +Under conditional homoskedasticity, +this endogeneity test statistic is numerically equal to +a Hausman test statistic; see Hayashi (2000, pp. 233-34). +The endogeneity test statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg2} by the command {cmd:ivendog}. +Unlike the Durbin-Wu-Hausman tests reported by {cmd:ivendog}, +the {cmd:endog} option of {cmd:ivreg2} can report test statistics +that are robust to various violations of conditional homoskedasticity; +the {cmd:ivendog} option unavailable in {cmd:ivreg2} +is the Wu-Hausman F-test version of the endogeneity test. +See help {help ivendog} (if installed). + +{marker s_relevance}{dlgtab:Tests of under- and weak identification} + +{marker idtest}{p}{cmd:ivreg2} automatically reports tests of +both underidentification and weak identification. +The underidentification test is an LM test of whether the equation is identified, +i.e., that the excluded instruments are "relevant", +meaning correlated with the endogenous regressors. +The test is essentially the test of the rank of a matrix: +under the null hypothesis that the equation is underidentified, +the matrix of reduced form coefficients on the L1 excluded instruments +has rank=K1-1 where K1=number of endogenous regressors. +Under the null, +the statistic is distributed as chi-squared +with degrees of freedom=(L1-K1+1). +A rejection of the null indicates that the matrix is full column rank, +i.e., the model is identified. + +{p}For a test of whether a particular endogenous regressor alone is identified, +see the discussion {help ivreg2##swstats:below} of the +Sanderson-Windmeijer (2015) and Angrist-Pischke (2009) procedures. + +{p}When errors are assumed to be i.i.d., +{cmd:ivreg2} automatically reports an LM version of +the Anderson (1951) canonical correlations test. +Denoting the minimum eigenvalue of the canonical correlations as CCEV, +the smallest canonical correlation between the K1 endogenous regressors +and the L1 excluded instruments +(after partialling out the K2=L2 exogenous regressors) +is sqrt(CCEV), +and the Anderson LM test statistic is N*CCEV, +i.e., N times the square of the smallest canonical correlation. +With the {cmd:first} or {cmd:ffirst} options, +{cmd:ivreg2} also reports the closely-related +Cragg-Donald (1993) Wald test statistic. +Again assuming i.i.d. errors, +and denoting the minimum eigenvalue of the Cragg-Donald statistic as CDEV, +CDEV=CCEV/(1-CCEV), +and the Cragg-Donald Wald statistic is N*CDEV. +Like the Anderson LM statistic, the Cragg-Donald Wald statistic +is distributed as chi-squred with (L1-K1+1) degrees of freedom. +Note that a result of rejection of the null +should be treated with caution, +because weak instrument problems may still be present. +See Hall et al. (1996) for a discussion of this test, +and below for discussion of testing for the presence of weak instruments. + +{p}When the i.i.d. assumption is dropped +and {cmd:ivreg2} reports heteroskedastic, AC, HAC +or cluster-robust statistics, +the Anderson LM and Cragg-Donald Wald statistics are no longer valid. +In these cases, {cmd:ivreg2} reports the LM and Wald versions +of the Kleibergen-Paap (2006) rk statistic, +also distributed as chi-squared with (L1-K1+1) degrees of freedom. +The rk statistic can be seen as a generalization of these tests +to the case of non-i.i.d. errors; +see Kleibergen and Paap (2006) for discussion, +and Kleibergen and Schaffer (2007) for a Stata implementation, {cmd:ranktest}. +{cmd:ivreg2} requires {cmd:ranktest} to be installed, +and will prompt the user to install it if necessary. +If {cmd:ivreg2} is invoked with the {cmd:robust} option, +the rk underidentification test statistics will be heteroskedastic-robust, +and similarly with {cmd:bw} and {cmd:cluster}. + +{marker widtest}{p}"Weak identification" arises when the excluded instruments are correlated +with the endogenous regressors, but only weakly. +Estimators can perform poorly when instruments are weak, +and different estimators are more robust to weak instruments (e.g., LIML) +than others (e.g., IV); +see, e.g., Stock and Yogo (2002, 2005) for further discussion. +When errors are assumed to be i.i.d., +the test for weak identification automatically reported +by {cmd:ivreg2} is an F version of the Cragg-Donald Wald statistic, (N-L)/L1*CDEV, +where L is the number of instruments and L1 is the number of excluded instruments. +Stock and Yogo (2005) have compiled critical values +for the Cragg-Donald F statistic for +several different estimators (IV, LIML, Fuller-LIML), +several different definitions of "perform poorly" (based on bias and test size), +and a range of configurations (up to 100 excluded instruments +and up to 2 or 3 endogenous regressors, +depending on the estimator). +{cmd:ivreg2} will report the Stock-Yogo critical values +if these are available; +missing values mean that the critical values +haven't been tabulated or aren't applicable. +See Stock and Yogo (2002, 2005) for details. + +{p}When the i.i.d. assumption is dropped +and {cmd:ivreg2} is invoked with the {cmd:robust}, {cmd:bw} or {cmd:cluster} options, +the Cragg-Donald-based weak instruments test is no longer valid. +{cmd:ivreg2} instead reports a correspondingly-robust +Kleibergen-Paap Wald rk F statistic. +The degrees of freedom adjustment for the rk statistic is (N-L)/L1, +as with the Cragg-Donald F statistic, +except in the cluster-robust case, +when the adjustment is N/(N-1) * (N_clust-1)/N_clust, +following the standard Stata small-sample adjustment for cluster-robust. In the case of two-way clustering, N_clust is the minimum of N_clust1 and N_clust2. +The critical values reported by {cmd:ivreg2} for the Kleibergen-Paap statistic +are the Stock-Yogo critical values for the Cragg-Donald i.i.d. case. +The critical values reported with 2-step GMM +are the Stock-Yogo IV critical values, +and the critical values reported with CUE +are the LIML critical values. + +{marker s_redundancy}{dlgtab:Testing instrument redundancy} + +{marker redtest}{p}The {cmd:redundant} option allows a test of +whether a subset of excluded instruments is "redundant". +Excluded instruments are redundant if the asymptotic efficiency +of the estimation is not improved by using them. +Breusch et al. (1999) show that the condition for the redundancy of a set of instruments +can be stated in several equivalent ways: +e.g., in the reduced form regressions of the endogenous regressors +on the full set of instruments, +the redundant instruments have statistically insignificant coefficients; +or the partial correlations between the endogenous regressors +and the instruments in question are zero. +{cmd:ivreg2} uses a formulation based on testing the rank +of the matrix cross-product between the endogenous regressors +and the possibly-redundant instruments after both have +all other instruments partialled-out; +{cmd:ranktest} is used to test whether the matrix has zero rank. +The test statistic is an LM test +and numerically equivalent to a regression-based LM test. +Under the null that the specified instruments are redundant, +the statistic is distributed as chi-squared +with degrees of freedom=(#endogenous regressors)*(#instruments tested). +Rejection of the null indicates that +the instruments are not redundant. +When the i.i.d. assumption is dropped +and {cmd:ivreg2} reports heteroskedastic, AC, HAC +or cluster-robust statistics, +the redundancy test statistic is similarly robust. +See Baum et al. (2007) for further discussion. + +{p}Calculation and reporting of all underidentification +and weak identification statistics +can be supressed with the {cmd:noid} option. + +{marker s_first}{dlgtab:First-stage regressions, identification, and weak-id-robust inference} + +{p}The {cmd:first}, {cmd:sfirst} and {cmd:ffirst} options report +various first-stage results and identification statistics. +The {cmd:first} option reports the individual first-stage regressions separately. +The {cmd:sfirst} option reports all the first-stage regressions jointly +in a single estimation table along with the reduced form equation +for the dependent variable (see {help ivreg2##s_rf:below}); +the output is similar in appearance and usage (e.g., in testing) +as that generated by Stata's {cmd:mvreg}. + +{marker swstats}{p}Tests of both underidentification and weak identification are reported +for each endogenous regressor separately, +using the method of Sanderson-Windmeijer (2015) +(a modification and improvement of the described by +Angrist and Pischke (2009), pp. 217-18, and implemented +in previous versions of {cmd:ivreg2}; +the AP test statistics remain available in the {cmd:e(first) matrix}). + +{p}The Sanderson-Windmeijer (SW) first-stage chi-squared and F statistics +are tests of underidentification and weak identification, respectively, +of individual endogenous regressors. +They are constructed by "partialling-out" linear projections of the +remaining endogenous regressors. +The SW chi-squared Wald statistic is distributed as chi2(L1-K1+1)) +under the null that the particular endogenous regressor +in question is unidentified. +In the special case of a single endogenous regressor, +the SW statistic reported is identical to underidentification statistics reported +in the {cmd:ffirst} output, +namely the Cragg-Donald Wald statistic (if i.i.d.) +or the Kleibergen-Paap rk Wald statistic (if robust, cluster-robust, AC or HAC +statistics have been requested); +see {help ivreg2##idtest:above}. +The SW first-stage F statistic is the F form of the same test statistic. +It can be used as a diagnostic for whether a particular endogenous regressor +is "weakly identified" (see {help ivreg2##widtest:above}). +For further details and discussion, see Sanderson and Windmeijer (2015). + +{p}The first-stage results are always reported with small-sample statistics, +to be consistent with the recommended use of the first-stage F-test as a diagnostic. +If the estimated equation is reported with robust standard errors, +the first-stage F-test is also robust. + +{p}A full set of first-stage statistics for each of the K1 endogenous regressors +is saved in the matrix e(first). +These include (a) the SW and AP F and chi-squared statistics; (b) the "partial R-squared" +(squared partial correlation) corresponding to the SW and SP statistics; +(c) Shea's (1997) partial R-squared measure (closely related to the SW and AP statistics, +but not amenable to formal testing); (d) the simple F and partial R-squared +statistics for each of the first-stage equations, +with no adjustments if there is more than one endogenous regressor. +In the special case of a single endogenous regressor, +these F statistics and partial R-squareds are identical. + +{marker wirobust}{p}The first-stage output also includes +two statistics that provide weak-instrument robust inference +for testing the significance of the endogenous regressors in the structural equation being estimated. +The first statistic is the Anderson-Rubin (1949) test +(not to be confused with the Anderson-Rubin overidentification test for LIML estimation; +see {help ivreg2##s_liml:above}). +The second is the closely related Stock-Wright (2000) S statistic. +The null hypothesis tested in both cases is that +the coefficients of the endogenous regressors in the structural equation are jointly equal to zero, +and, in addition, that the overidentifying restrictions are valid. +Both tests are robust to the presence of weak instruments. +The tests are equivalent to estimating the reduced form of the equation +(with the full set of instruments as regressors) +and testing that the coefficients of the excluded instruments are jointly equal to zero. +In the form reported by {cmd:ivreg2},the Anderson-Rubin statistic is a Wald test +and the Stock-Wright S statistic is an LM test. +Both statistics are distributed as chi-squared with L1 degrees of freedom, +where L1=number of excluded instruments. +The traditional F-stat version of the Anderson-Rubin test is also reported. +See Stock and Watson (2000), Dufour (2003), Chernozhukov and Hansen (2005) and Kleibergen (2007) +for further discussion. +For related alternative test statistics that are also robust to weak instruments, +see {help condivreg} and {help weakiv}, +and the corresponding discussions +in Moreira and Poi (2003) and Mikusheva and Poi (2006), +and in Finlay and Magnusson (2009), respectively. + +{p}The {cmd:savefirst} option requests that the individual first-stage regressions +be saved for later access using the {cmd:estimates} command. +If saved, they can also be displayed using {cmd:first} or {cmd:ffirst} and the {cmd:ivreg2} replay syntax. +The regressions are saved with the prefix "_ivreg2_", +unless the user specifies an alternative prefix with the +{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} option. +The {cmd:savesfirst} and {cmdab:savesfp:refix}{cmd:(}{it:prefix}{cmd:)} options +work similarly for the {cmd:sfirst} option if the user wishes to save +the first-stage and reduced form estimations as a single estimated system. + +{marker s_rf}{dlgtab:Reduced form estimates} + +{p}The {cmd:rf} option requests that the reduced form estimation of the equation be displayed. +The {cmd:saverf} option requests that the reduced form estimation is saved +for later access using the {cmd:estimates} command. +If saved, it can also be displayed using the {cmd:rf} and the {cmd:ivreg2} replay syntax. +The regression is saved with the prefix "_ivreg2_", +unless the user specifies an alternative prefix with the +{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} option. + +{marker s_partial}{dlgtab:Partialling-out exogenous regressors} + +{marker partial}{p}The {cmd:partial(}{it:varlist}{cmd:)} option requests that +the exogenous regressors in {it:varlist} are "partialled out" +from all the other variables (other regressors and excluded instruments) in the estimation. +If the equation includes a constant, it is also automatically partialled out as well. +The coefficients corresponding to the regressors in {it:varlist} are not calculated. +By the Frisch-Waugh-Lovell (FWL) theorem, in IV, +two-step GMM and LIML estimation the coefficients for the remaining regressors +are the same as those that would be obtained if the variables were not partialled out. +(NB: this does not hold for CUE or GMM iterated more than two steps.) +The {cmd:partial} option is most useful when using {cmd:cluster} +and #clusters < (#exogenous regressors + #excluded instruments). +In these circumstances, +the covariance matrix of orthogonality conditions S is not of full rank, +and efficient GMM and overidentification tests are infeasible +since the optimal weighting matrix W = {bind:S^-1} +cannot be calculated. +The problem can be addressed by using {cmd:partial} +to partial out enough exogenous regressors for S to have full rank. +A similar problem arises when the regressors include a variable that is a singleton dummy, +i.e., a variable with one 1 and N-1 zeros or vice versa, +if a robust covariance matrix is requested. +The singleton dummy causes the robust covariance matrix estimator +to be less than full rank. +In this case, partialling-out the variable with the singleton dummy solves the problem. +Specifying {cmd:partial(_cons)} will cause just the constant to be partialled-out, +i.e., the equation will be estimated in deviations-from-means form. +When {cmd:ivreg2} is invoked with {cmd:partial}, +it reports test statistics with the same small-sample adjustments +as if estimating without {cmd:partial}, +with the exception of the information in the output header +(the model F, R-sqs and total sums-of-squares +refer to the model after the variables are partialled-out). +Note that after estimation using the {cmd:partial} option, +the post-estimation {cmd:predict} can be used only to generate residuals. + +{marker s_ols}{dlgtab:OLS and Heteroskedastic OLS (HOLS) estimation} + +{p}{cmd:ivreg2} also allows straightforward OLS estimation +by using the same syntax as {cmd:regress}, i.e., +{it:ivreg2 depvar varlist1}. +This can be useful if the user wishes to use one of the +features of {cmd:ivreg2} in OLS regression, e.g., AC or +HAC standard errors. + +{p}If the list of endogenous variables {it:varlist2} is empty +but the list of excluded instruments {it:varlist_iv} is not, +and the option {cmd:gmm2s} is specified, +{cmd:ivreg2} calculates Cragg's "heteroskedastic OLS" (HOLS) estimator, +an estimator that is more efficient than OLS +in the presence of heteroskedasticity of unknown form +(see Davidson and MacKinnon (1993), pp. 599-600). +If the option {cmd:bw(}{it:#}{cmd:)} is specified, +the HOLS estimator is efficient in the presence of +arbitrary autocorrelation; +if both {cmd:bw(}{it:#}{cmd:)} and {cmd:robust} are specified +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and autocorrelation; +and if {cmd:cluster(}{it:varlist}{cmd:)} is used, +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and within-group correlation. +The efficiency gains of HOLS derive from the orthogonality conditions +of the excluded instruments listed in {it:varlist_iv}. +If no endogenous variables are specified and {cmd:gmm2s} is not specified, +{cmd:ivreg2} reports standard OLS coefficients. +The Sargan-Hansen statistic reported +when the list of endogenous variables {it:varlist2} is empty +is a Lagrange multiplier (LM) test +of the hypothesis that the excluded instruments {it:varlist_iv} are +correctly excluded from the restricted model. +If the estimation is LIML, the LM statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For more on LM tests, see e.g. Wooldridge (2002), pp. 58-60. +Note that because the approach of the HOLS estimator +has applications beyond heteroskedastic disturbances, +and to avoid confusion concerning the robustness of the estimates, +the estimators presented above as "HOLS" +are described in the output of {cmd:ivreg2} +as "2-Step GMM", "CUE", etc., as appropriate. + +{marker s_collin}{dlgtab:Collinearities} + +{p}{cmd:ivreg2} checks the lists of included instruments, +excluded instruments, and endogenous regressors +for collinearities and duplicates. If an endogenous regressor is +collinear with the instruments, it is reclassified as exogenous. If any +endogenous regressors are collinear with each other, some are dropped. +If there are any collinearities among the instruments, some are dropped; +excluded instruments are dropped before included instruments. +If any variables are dropped, a list of their names are saved +in the macros {cmd:e(collin)} and/or {cmd:e(dups)}. + +{p}Starting with {cmd:ivreg2} v4.1, +the Stata 11+ convention is followed and +omitted variables are reported in the regression output +and saved in the {cmd:e(b)} and {cmd:e(V)} macros. +These omitted variables, as well as other omitted variables +(e.g., empty factor variables) can be suppressed +by use of the {cmd:bvclean} option. +The Stata display options +{cmd:noomitted}, {cmd:vsquish}, {cmd:noemptycells}, {cmd:baselevels} and {cmd:allbaselevels} +are also supported; see {helpb ereturn##display_options:ereturn}. +Variable lists with collinear variables, duplicates marked with Stata's "o." operator, +and factor variable base variables +are saved in macros with a "0" appended to the corresponding macro names; +lists with these variables removed are saved in macros with a "1" appended. + +{p}Collinearity checks can be supressed with the {cmd:nocollin} option. + +{marker s_speed}{dlgtab:Speed options: nocollin and noid} + +{p}Two options are available for speeding execution. +{cmd:nocollin} specifies that the collinearity checks not be performed. +{cmd:noid} suspends calculation and reporting of +the underidentification and weak identification statistics +in the main output. + +{marker s_small}{dlgtab:Small sample corrections} + +{p}Mean square error = sqrt(RSS/(N-K)) if {cmd:small}, = sqrt(RSS/N) otherwise. + +{p}If {cmd:robust} is chosen, the finite sample adjustment +(see {hi:[R] regress}) to the robust variance-covariance matrix +qc = N/(N-K) if {cmd:small}, qc = 1 otherwise. + +{p}If {cmd:cluster} is chosen, the finite sample adjustment +qc = (N-1)/(N-K)*M/(M-1) if {cmd:small}, where M=number of clusters, +qc = 1 otherwise. +If 2-way clustering is used, M=min(M1,M2), +where M1=number of clusters in group 1 +and M2=number of clusters in group 2. + +{p}If the {cmd:partial(}{it:varlist}{cmd:)} option is used, +the partialled-out exogenous regressors are included in K. + +{p}The Sargan and C (difference-in-Sargan) statistics use +error variance = RSS/N, i.e., there is no small sample correction. + +{p}A full discussion of these computations and related topics +can be found in Baum, Schaffer, and Stillman (2003) and Baum, Schaffer and +Stillman (2007). Some features of the program postdate the former article and are described in the latter paper. +Some features, such as two-way clustering, postdate the latter article as well. + + +{marker s_options}{title:Options summary} + +{p 0 4}{cmd:gmm2s} requests the two-step efficient GMM estimator. +If no endogenous variables are specified, the estimator is Cragg's HOLS estimator. + +{p 0 4}{cmd:liml} requests the limited-information maximum likelihood estimator. + +{p 0 4}{cmd:fuller(}{it:#}{cmd:)} specifies that Fuller's modified LIML estimator +is calculated using the user-supplied Fuller parameter alpha, +a non-negative number. +Alpha=1 has been suggested as a good choice. + +{p 0 4}{cmd:kclass(}{it:#}{cmd:)} specifies that a general k-class estimator is calculated +using the user-supplied #, a non-negative number. + +{p 0 4}{cmd:coviv} specifies that the matrix used to calculate the +covariance matrix for the LIML or k-class estimator +is based on the 2SLS matrix, i.e., with k=1. +In this case the covariance matrix will differ from that calculated for the 2SLS +estimator only because the estimate of the error variance will differ. +The default is for the covariance matrix to be based on the LIML or k-class matrix. + +{p 0 4}{cmd:cue} requests the GMM continuously-updated estimator (CUE). + +{p 0 4}{cmd:b0(}{it:matrix}{cmd:)} specifies that the J statistic +(i.e., the value of the CUE objective function) +should be calculated for an arbitrary coefficient vector {cmd:b0}. +That vector must be provided as a matrix with appropriate row and column names. +Under- and weak-identification statistics are not reported +in the output. + +{p 0 4}{cmd:robust} specifies that the Eicker/Huber/White/sandwich estimator of +variance is to be used in place of the traditional calculation. {cmd:robust} +combined with {cmd:cluster()} further allows residuals which are not +independent within cluster (although they must be independent between +clusters). See {hi:[U] Obtaining robust variance estimates}. + +{p 0 4}{cmd:cluster}{cmd:(}{it:varlist}{cmd:)} specifies that the observations +are independent across groups (clusters) but not necessarily independent +within groups. +With 1-way clustering, {cmd:cluster}{cmd:(}{it:varname}{cmd:)} +specifies to which group each observation +belongs; e.g., {cmd:cluster(personid)} in data with repeated observations on +individuals. +With 2-way clustering, {cmd:cluster}{cmd:(}{it:varname1 varname2}{cmd:)} +specifies the two (non-nested) groups to which each observation belongs. +Specifying {cmd:cluster()} implies {cmd:robust}. + +{p 0 4}{cmd:bw(}{it:#}{cmd:)} impements AC or HAC covariance estimation +with bandwidth equal to {it:#}, where {it:#} is an integer greater than zero. +Specifying {cmd:robust} implements HAC covariance estimation; +omitting it implements AC covariance estimation. +If the Bartlett (default), Parzen or Quadratic Spectral kernels are selected, +the value {cmd:auto} may be given (rather than an integer) +to invoke Newey and West's (1994) automatic bandwidth selection procedure. + +{p 0 4}{cmd:kernel(}{it:string)}{cmd:)} specifies the kernel +to be used for AC and HAC covariance estimation; +the default kernel is Bartlett (also known in econometrics +as Newey-West). +The full list of kernels available is (abbreviations in parentheses): +Bartlett (bar); Truncated (tru); Parzen (par); Tukey-Hanning (thann); +Tukey-Hamming (thamm); Daniell (dan); Tent (ten); and Quadratic-Spectral (qua or qs). + +{p 4 4}Note: in the cases of the Bartlett, Parzen, +and Tukey-Hanning/Hamming kernels, the number of lags used +to construct the kernel estimate equals the bandwidth minus one. +Stata's official {cmd:newey} implements +HAC standard errors based on the Bartlett kernel, +and requires the user to specify +the maximum number of lags used and not the bandwidth; +see help {help newey}. +If these kernels are used with {cmd:bw(1)}, +no lags are used and {cmd:ivreg2} will report the usual +Eicker/Huber/White/sandwich variance estimates. + +{p 0 4}{cmd:center} specifies that the moments used to construct +the efficient GMM weighting matrix are centered. +If used with an inefficient 1-step estimator, +the estimated coefficients and their standard errors are unaffected but +centered moments will be used in the reported Hansen J statistic. + +{p 0 4}{cmd:wmatrix(}{it:matrix}{cmd:)} specifies a user-supplied weighting matrix +in place of the computed optimal weighting matrix. +The matrix must be positive definite. +The user-supplied matrix must have the same row and column names +as the instrument variables in the regression model (or a subset thereof). + +{p 0 4}{cmd:smatrix(}{it:matrix}{cmd:)} specifies a user-supplied covariance matrix +of the orthogonality conditions to be used in calculating the covariance matrix of the estimator. +The matrix must be positive definite. +The user-supplied matrix must have the same row and column names +as the instrument variables in the regression model (or a subset thereof). + +{p 0 4}{cmd:orthog}{cmd:(}{it:varlist_ex}{cmd:)} requests that a C-statistic +be calculated as a test of the exogeneity of the instruments in {it:varlist_ex}. +These may be either included or excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instruments must still be identified. + +{p 0 4}{cmd:endog}{cmd:(}{it:varlist_en}{cmd:)} requests that a C-statistic +be calculated as a test of the endogeneity +of the endogenous regressors in {it:varlist_en}. + +{p 0 4}{cmd:redundant}{cmd:(}{it:varlist_ex}{cmd:)} requests an LM test +of the redundancy of the instruments in {it:varlist_ex}. +These must be excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instrumenst must still be identified. + +{p 0 4}{cmd:small} requests that small-sample statistics (F and t-statistics) +be reported instead of large-sample statistics (chi-squared and z-statistics). +Large-sample statistics are the default. +The exception is the statistic for the significance of the regression, +which is always reported as a small-sample F statistic. + +{p 0 4}{cmd:noconstant} suppresses the constant term (intercept) in the +regression. If {cmd:noconstant} is specified, the constant term is excluded +from both the final regression and the first-stage regression. To include a +constant in the first-stage when {cmd:noconstant} is specified, explicitly +include a variable containing all 1's in {it:varlist_iv}. + +{p 0 4}{cmd:first} requests that the full first-stage regression results be displayed, +along with the associated diagnostic and identification statistics. + +{p 0 4}{cmd:sfirst} requests that the first-stage and reduced form regressions +are reported as a single system of equations (i.e., in a single regression output table). + +{p 0 4}{cmd:ffirst} requests the first-stage diagnostic and identification statistics. +The results are saved in various e() macros. + +{p 0 4}{cmd:nocollin} suppresses the checks for collinearities +and duplicate variables. + +{p 0 4}{cmd:noid} suppresses the calculation and reporting +of underidentification and weak identification statistics. + +{p 0 4}{cmd:savefirst} requests that the first-stage regressions results +are saved for later access using the {cmd:estimates} command. +The names under which the first-stage regressions are saved +are the names of the endogenous regressors prefixed by "_ivreg2_". +If these use Stata's time-series operators, +the "." is replaced by a "_". + +{p 0 4}{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the first-stage regression results be saved using the user-specified prefix +instead of the default "_ivreg2_". + +{p 0 4}{cmd:rf} requests that the reduced-form estimation of the equation +be displayed. + +{p 0 4}{cmd:saverf} requests that the reduced-form estimation of the equation +be saved for later access using the {cmd:estimates} command. +The estimation is stored under the name of the dependent variable +prefixed by "_ivreg2_". +If this uses Stata's time-series operators, +the "." is replaced by a "_". + +{p 0 4}{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the reduced-form estimation be saved using the user-specified prefix +instead of the default "_ivreg2_". + +{p 0 4}{cmd:sfirst} requests that the first-stage and reduced form equations +are estimated and displayed as a single system of equations. + +{p 0 4}{cmd:savesfirst} requests that the system of first-stage +and reduced form estimations be saved for later access +using the {cmd:estimates} command. +The estimation is stored under the name of the dependent variable +prefixed by "_ivreg2_sfirst_". +If this uses Stata's time-series operators, +the "." is replaced by a "_". + +{p 0 4}{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the reduced-form estimation be saved using the user-specified prefix +instead of the default "_ivreg2_sfirst_". + +{p 0 4}{cmd:partial(}{it:varlist}{cmd:)} requests that +the exogenous regressors in {it:varlist} be partialled out +from the other variables in the equation. +If the equation includes a constant, +it is automatically partialled out as well. +The coefficients corresponding to the regressors in {it:varlist} +are not calculated. + +{p 0 4}{cmd:level(}{it:#}{cmd:)} specifies the confidence level, in percent, +for confidence intervals of the coefficients; see help {help level}. + +{p 0 4}{cmd:bvclean} specifies that omitted variables (including factor base variables) +are not reported in the estimation output and are not saved in the +{cmd:e(b)} and {cmd:e(V)} macros. + +{p 0 4}{cmd:noheader}, {cmd:eform()}, {cmd:depname()} and {cmd:plus} +are for ado-file writers; see {hi:[R] ivreg} and {hi:[R] regress}. + +{p 0 4}{cmd:nofooter} suppresses the display of the footer containing +identification and overidentification statistics, +exogeneity and endogeneity tests, +lists of endogenous variables and instruments, etc. + +{p 0 4}{cmd:version} causes {cmd:ivreg2} to display its current version number +and to leave it in the macro {cmd:e(version)}. +It cannot be used with any other options. +and will clear any existing {cmd:e()} saved results. + + +{marker s_versions}{title:Running ivreg2 under earlier versions of Stata} + +{p}The most-up-to-date implementation of {cmd:ivreg2} requires Stata version 11 or later. +If {cmd:ivreg2} is called under earlier versions of Stata, +it will automatically run a legacy version {cmd:ivreg2x}, +where "x" denotes the required Stata version. +These versions of {cmd:ivreg2} - {cmd:ivreg28}, {cmd:ivreg29} and {cmd:ivreg210} - +are self-contained and require a minimum of Stata version 8/9/10, respectively. +"Self-contained" means these legacy versions (unlike the main up-to-date {cmd:ivreg2} code) +do not require access to any external Mata library or user-written Stata routines. +These legacy versions are installed with the {cmd:ivreg2} package, +can also be called directly from the Stata command line or in do files, +and come with their own help files. + +{p}For example, if a user has Stata 8 installed and calls {cmd:ivreg2}, +it will invoke the legacy version {cmd:ivreg28}. +If a user has a later version of Stata +but wants to run the Stata 8 legacy version of {cmd:ivreg2}, +s/he can estimate either calling {cmd:ivreg28} directly +or by calling {cmd:ivreg2} under version control (i.e., "{cmd:version 8: ivreg2}"). +To see what options are/aren't available with this particular legacy version, +the user can see {helpb help ivreg28}. + + +{marker s_macros}{title:Remarks and saved results} + +{p}{cmd:ivreg2} does not report an ANOVA table. +Instead, it reports the RSS and both the centered and uncentered TSS. +It also reports both the centered and uncentered R-squared. +NB: the TSS and R-squared reported by official {cmd:ivreg} is centered +if a constant is included in the regression, and uncentered otherwise. + + +{p}{cmd:ivreg2} saves the following results in {cmd:e()}: + +Scalars +{col 4}{cmd:e(N)}{col 18}Number of observations +{col 4}{cmd:e(yy)}{col 18}Total sum of squares (SS), uncentered (y'y) +{col 4}{cmd:e(yyc)}{col 18}Total SS, centered (y'y - ((1'y)^2)/n) +{col 4}{cmd:e(rss)}{col 18}Residual SS +{col 4}{cmd:e(mss)}{col 18}Model SS =yyc-rss if the eqn has a constant, =yy-rss otherwise +{col 4}{cmd:e(df_m)}{col 18}Model degrees of freedom +{col 4}{cmd:e(df_r)}{col 18}Residual degrees of freedom +{col 4}{cmd:e(r2u)}{col 18}Uncentered R-squared, 1-rss/yy +{col 4}{cmd:e(r2c)}{col 18}Centered R-squared, 1-rss/yyc +{col 4}{cmd:e(r2)}{col 18}Centered R-squared if the eqn has a constant, uncentered otherwise +{col 4}{cmd:e(r2_a)}{col 18}Adjusted R-squared +{col 4}{cmd:e(ll)}{col 18}Log likelihood +{col 4}{cmd:e(rankxx)}{col 18}Rank of the matrix of observations on rhs variables=K +{col 4}{cmd:e(rankzz)}{col 18}Rank of the matrix of observations on instruments=L +{col 4}{cmd:e(rankV)}{col 18}Rank of covariance matrix V of coefficients +{col 4}{cmd:e(rankS)}{col 18}Rank of covariance matrix S of orthogonality conditions +{col 4}{cmd:e(rmse)}{col 18}root mean square error=sqrt(rss/(N-K)) if -small-, =sqrt(rss/N) if not +{col 4}{cmd:e(F)}{col 18}F statistic +{col 4}{cmd:e(N_clust)}{col 18}Number of clusters (or min(N_clust1,N_clust2) if 2-way clustering) +{col 4}{cmd:e(N_clust1)}{col 18}Number of clusters in dimension 1 (if 2-way clustering) +{col 4}{cmd:e(N_clust2)}{col 18}Number of clusters in dimension 2 (if 2-way clustering) +{col 4}{cmd:e(bw)}{col 18}Bandwidth +{col 4}{cmd:e(lambda)}{col 18}LIML eigenvalue +{col 4}{cmd:e(kclass)}{col 18}k in k-class estimation +{col 4}{cmd:e(fuller)}{col 18}Fuller parameter alpha +{col 4}{cmd:e(sargan)}{col 18}Sargan statistic +{col 4}{cmd:e(sarganp)}{col 18}p-value of Sargan statistic +{col 4}{cmd:e(sargandf)}{col 18}dof of Sargan statistic = degree of overidentification = L-K +{col 4}{cmd:e(j)}{col 18}Hansen J statistic +{col 4}{cmd:e(jp)}{col 18}p-value of Hansen J statistic +{col 4}{cmd:e(jdf)}{col 18}dof of Hansen J statistic = degree of overidentification = L-K +{col 4}{cmd:e(arubin)}{col 18}Anderson-Rubin overidentification LR statistic N*ln(lambda) +{col 4}{cmd:e(arubinp)}{col 18}p-value of Anderson-Rubin overidentification LR statistic +{col 4}{cmd:e(arubin_lin)}{col 18}Anderson-Rubin linearized overidentification statistic N*(lambda-1) +{col 4}{cmd:e(arubin_linp)}{col 18}p-value of Anderson-Rubin linearized overidentification statistic +{col 4}{cmd:e(arubindf)}{col 18}dof of A-R overid statistic = degree of overidentification = L-K +{col 4}{cmd:e(idstat)}{col 18}LM test statistic for underidentification (Anderson or Kleibergen-Paap) +{col 4}{cmd:e(idp)}{col 18}p-value of underidentification LM statistic +{col 4}{cmd:e(iddf)}{col 18}dof of underidentification LM statistic +{col 4}{cmd:e(widstat)}{col 18}F statistic for weak identification (Cragg-Donald or Kleibergen-Paap) +{col 4}{cmd:e(arf)}{col 18}Anderson-Rubin F-test of significance of endogenous regressors +{col 4}{cmd:e(arfp)}{col 18}p-value of Anderson-Rubin F-test of endogenous regressors +{col 4}{cmd:e(archi2)}{col 18}Anderson-Rubin chi-sq test of significance of endogenous regressors +{col 4}{cmd:e(archi2p)}{col 18}p-value of Anderson-Rubin chi-sq test of endogenous regressors +{col 4}{cmd:e(ardf)}{col 18}degrees of freedom of Anderson-Rubin tests of endogenous regressors +{col 4}{cmd:e(ardf_r)}{col 18}denominator degrees of freedom of AR F-test of endogenous regressors +{col 4}{cmd:e(redstat)}{col 18}LM statistic for instrument redundancy +{col 4}{cmd:e(redp)}{col 18}p-value of LM statistic for instrument redundancy +{col 4}{cmd:e(reddf)}{col 18}dof of LM statistic for instrument redundancy +{col 4}{cmd:e(cstat)}{col 18}GMM distance test statistic of exogeneity +{col 4}{cmd:e(cstatp)}{col 18}p-value of GMM distance test statistic of exogeneity +{col 4}{cmd:e(cstatdf)}{col 18}Degrees of freedom of GMM distance test statistic of exogeneity +{col 4}{cmd:e(estat)}{col 18}GMM distance test statistic of endogeneity +{col 4}{cmd:e(estatp)}{col 18}p-value of GMM distance test statistic of endogeneity +{col 4}{cmd:e(estatdf)}{col 18}Degrees of freedom of GMM distance test statistic of endogeneity +{col 4}{cmd:e(cons)}{col 18}1 when equation has a Stata-supplied constant; 0 otherwise +{col 4}{cmd:e(center)}{col 18}1 when moments are mean-centered; 0 otherwise +{col 4}{cmd:e(partialcons)}{col 18}as above but prior to partialling-out (see {cmd:e(partial)}) +{col 4}{cmd:e(partial_ct)}{col 18}Number of partialled-out variables (see {cmd:e(partial)}) + +Macros +{col 4}{cmd:e(cmd)}{col 18}ivreg2 +{col 4}{cmd:e(cmdline)}{col 18}Command line invoking ivreg2 +{col 4}{cmd:e(ivreg2cmd)}{col 18}Version of ivreg2 (ivreg2, ivreg28, ivreg29, etc.) +{col 4}{cmd:e(version)}{col 18}Version number of ivreg2 +{col 4}{cmd:e(model)}{col 18}ols, iv, gmm, liml, or kclass +{col 4}{cmd:e(depvar)}{col 18}Name of dependent variable +{col 4}{cmd:e(instd)}{col 18}Instrumented (RHS endogenous) variables +{col 4}{cmd:e(insts)}{col 18}Instruments +{col 4}{cmd:e(inexog)}{col 18}Included instruments (regressors) +{col 4}{cmd:e(exexog)}{col 18}Excluded instruments +{col 4}{cmd:e(collin)}{col 18}Variables dropped because of collinearities +{col 4}{cmd:e(dups)}{col 18}Duplicate variables +{col 4}{cmd:e(ecollin)}{col 18}Endogenous variables reclassified as exogenous because of +{col 20}collinearities with instruments +{col 4}{cmd:e(clist)}{col 18}Instruments tested for orthogonality +{col 4}{cmd:e(redlist)}{col 18}Instruments tested for redundancy +{col 4}{cmd:e(partial)}{col 18}Partialled-out exogenous regressors +{col 4}{cmd:e(small)}{col 18}small +{col 4}{cmd:e(wtype)}{col 18}weight type +{col 4}{cmd:e(wexp)}{col 18}weight expression +{col 4}{cmd:e(clustvar)}{col 18}Name of cluster variable +{col 4}{cmd:e(vcetype)}{col 18}Covariance estimation method +{col 4}{cmd:e(kernel)}{col 18}Kernel +{col 4}{cmd:e(tvar)}{col 18}Time variable +{col 4}{cmd:e(ivar)}{col 18}Panel variable +{col 4}{cmd:e(firsteqs)}{col 18}Names of stored first-stage equations +{col 4}{cmd:e(rfeq)}{col 18}Name of stored reduced form equation +{col 4}{cmd:e(sfirsteq)}{col 18}Name of stored system of first-stage and reduced form equations +{col 4}{cmd:e(predict)}{col 18}Program used to implement predict + +Matrices +{col 4}{cmd:e(b)}{col 18}Coefficient vector +{col 4}{cmd:e(V)}{col 18}Variance-covariance matrix of the estimators +{col 4}{cmd:e(S)}{col 18}Covariance matrix of orthogonality conditions +{col 4}{cmd:e(W)}{col 18}GMM weighting matrix (=inverse of S if efficient GMM estimator) +{col 4}{cmd:e(first)}{col 18}First-stage regression results +{col 4}{cmd:e(ccev)}{col 18}Eigenvalues corresponding to the Anderson canonical correlations test +{col 4}{cmd:e(cdev)}{col 18}Eigenvalues corresponding to the Cragg-Donald test + +Functions +{col 4}{cmd:e(sample)}{col 18}Marks estimation sample + + + +{marker s_examples}{title:Examples} + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta" : . use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta }{p_end} +{p 8 12}(Wages of Very Young Men, Zvi Griliches, J.Pol.Ec. 1976) + +{col 0}(Instrumental variables. Examples follow Hayashi 2000, p. 255.) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt)} + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), small ffirst" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), small ffirst} + +{col 0}(Testing for the presence of heteroskedasticity in IV/GMM estimation) + +{p 8 12}{stata "ivhettest, fitlev" : . ivhettest, fitlev} + +{col 0}(Two-step GMM efficient in the presence of arbitrary heteroskedasticity) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s robust" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s robust} + +{p 0}(GMM with user-specified first-step weighting matrix or matrix of orthogonality conditions) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), robust" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), robust} + +{p 8 12}{stata "predict double uhat if e(sample), resid" : . predict double uhat if e(sample), resid} + +{p 8 12}{stata "mat accum S = `e(insts)' [iw=uhat^2]" : . mat accum S = `e(insts)' [iw=uhat^2]} + +{p 8 12}{stata "mat S = 1/`e(N)' * S" : . mat S = 1/`e(N)' * S} + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s robust smatrix(S)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s robust smatrix(S)} + +{p 8 12}{stata "mat W = invsym(S)" : . mat W = invsym(S)} + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s robust wmatrix(W)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s robust wmatrix(W)} + +{p 0}(Equivalence of J statistic and Wald tests of included regressors, irrespective of instrument choice (Ahn, 1997)) + +{p 8 12}{stata "ivreg2 lw (iq=med kww age), gmm2s" : . ivreg2 lw (iq=med kww age), gmm2s} + +{p 8 12}{stata "mat S0 = e(S)" : . mat S0 = e(S)} + +{p 8 12}{stata "qui ivreg2 lw (iq=kww) med age, gmm2s smatrix(S0)" : . qui ivreg2 lw (iq=kww) med age, gmm2s smatrix(S0)} + +{p 8 12}{stata "test med age" : . test med age} + +{p 8 12}{stata "qui ivreg2 lw (iq=med) kww age, gmm2s smatrix(S0)" : . qui ivreg2 lw (iq=med) kww age, gmm2s smatrix(S0)} + +{p 8 12}{stata "test kww age" : . test kww age} + +{p 8 12}{stata "qui ivreg2 lw (iq=age) med kww, gmm2s smatrix(S0)" : . qui ivreg2 lw (iq=age) med kww, gmm2s smatrix(S0)} + +{p 8 12}{stata "test med kww" : . test med kww} + +{p 0}(Continuously-updated GMM (CUE) efficient in the presence of arbitrary heteroskedasticity. NB: may require 30+ iterations.) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), cue robust" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), cue robust} + +{col 0}(Sargan-Basmann tests of overidentifying restrictions for IV estimation) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt)} + +{p 8 12}{stata "overid, all" : . overid, all} + +{col 0}(Tests of exogeneity and endogeneity) + +{col 0}(Test the exogeneity of one regressor) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s orthog(s)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s orthog(s)} + +{col 0}(Test the exogeneity of two excluded instruments) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s orthog(age mrt)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s orthog(age mrt)} + +{col 0}(Frisch-Waugh-Lovell (FWL): equivalence of estimations with and without partialling-out) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns i.year (iq=kww age), cluster(year)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age), cluster(year)} + +{p 8 12}{stata "ivreg2 lw s expr tenure rns i.year (iq=kww age), cluster(year) partial(i.year)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age), cluster(year) partial(i.year)} + +{col 0}({cmd:partial()}: efficient GMM with #clusters<#instruments feasible after partialling-out) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns i.year (iq=kww age), cluster(year) partial(i.year) gmm2s" : . ivreg2 lw s expr tenure rns smsa (iq=med kww age), cluster(year) partial(i.year) gmm2s} + +{col 0}(Examples following Wooldridge 2002, pp.59, 61) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta" : . use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta } + +{col 0}(Equivalence of DWH endogeneity test when regressor is endogenous...) + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6)" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6)} + +{p 8 12}{stata "ivendog educ" :. ivendog educ} + +{col 0}(... endogeneity test using the {cmd:endog} option) + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), endog(educ)" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), endog(educ)} + +{col 0}(...and C-test of exogeneity when regressor is exogenous, using the {cmd:orthog} option) + +{p 8 12}{stata "ivreg2 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)" : . ivreg2 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)} + +{col 0}(Heteroskedastic Ordinary Least Squares, HOLS) + +{p 8 12}{stata "ivreg2 lwage exper expersq educ (=age kidslt6 kidsge6), gmm2s" : . ivreg2 lwage exper expersq educ (=age kidslt6 kidsge6), gmm2s} + +{col 0}(Equivalence of Cragg-Donald Wald F statistic and F-test from first-stage regression +{col 0}in special case of single endogenous regressor. Also illustrates {cmd:first}, {cmd:sfirst} +{col 0}and {cmd:savefirst} options.) + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), first sfirst savefirst" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), first sfirst savefirst} + +{p 8 12}{stata "di e(widstat)" : . di e(widstat)} + +{p 8 12}{stata "estimates restore _ivreg2_educ" : . estimates restore _ivreg2_educ} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Equivalence of Kleibergen-Paap robust rk Wald F statistic and F-test from first-stage +{col 0}regression in special case of single endogenous regressor.) + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust savefirst" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust savefirst} + +{p 8 12}{stata "di e(widstat)" : . di e(widstat)} + +{p 8 12}{stata "estimates restore _ivreg2_educ" : . estimates restore _ivreg2_educ} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Equivalence of Kleibergen-Paap robust rk LM statistic for identification and LM test +{col 0}of joint significance of excluded instruments in first-stage regression in special +{col 0}case of single endogenous regressor. Also illustrates use of {cmd:ivreg2} to perform an +{col 0}LM test in OLS estimation.) + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust} + +{p 8 12}{stata "di e(idstat)" : . di e(idstat)} + +{p 8 12}{stata "ivreg2 educ exper expersq (=age kidslt6 kidsge6) if e(sample), robust" : . ivreg2 educ exper expersq (=age kidslt6 kidsge6) if e(sample), robust} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(Equivalence of an LM test of an excluded instrument for redundancy and an LM test of +{col 0}significance from first-stage regression in special case of single endogenous regressor.) + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust redundant(age)" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust redundant(age)} + +{p 8 12}{stata "di e(redstat)" : . di e(redstat)} + +{p 8 12}{stata "ivreg2 educ exper expersq kidslt6 kidsge6 (=age) if e(sample), robust" : . ivreg2 educ exper expersq kidslt6 kidsge6 (=age) if e(sample), robust} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(Weak-instrument robust inference: Anderson-Rubin Wald F and chi-sq and +{col 0}Stock-Wright S statistics. Also illusrates use of {cmd:saverf} option.) + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust ffirst saverf" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust ffirst saverf} + +{p 8 12}{stata "di e(arf)" : . di e(arf)} + +{p 8 12}{stata "di e(archi2)" : . di e(archi2)} + +{p 8 12}{stata "di e(sstat)" : . di e(sstat)} + +{col 0}(Obtaining the Anderson-Rubin Wald F statistic from the reduced-form estimation) + +{p 8 12}{stata "estimates restore _ivreg2_lwage" : . estimates restore _ivreg2_lwage} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Obtaining the Anderson-Rubin Wald chi-sq statistic from the reduced-form estimation. +{col 0}Use {cmd:ivreg2} without {cmd:small} to obtain large-sample test statistic.) + +{p 8 12}{stata "ivreg2 lwage exper expersq age kidslt6 kidsge6, robust" : . ivreg2 lwage exper expersq age kidslt6 kidsge6, robust} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(chi2)" : . di r(chi2)} + +{col 0}(Obtaining the Stock-Wright S statistic as the value of the GMM CUE objective function. +{col 0}Also illustrates use of {cmd:b0} option. Coefficients on included exogenous regressors +{col 0}are OLS coefficients, which is equivalent to partialling them out before obtaining +{col 0}the value of the CUE objective function.) + +{p 8 12}{stata "mat b = 0" : . mat b = 0} + +{p 8 12}{stata "mat colnames b = educ" : . mat colnames b = educ} + +{p 8 12}{stata "qui ivreg2 lwage exper expersq" : . qui ivreg2 lwage exper expersq} + +{p 8 12}{stata "mat b = b, e(b)" : . mat b = b, e(b)} + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust b0(b)" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust b0(b)} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(LIML and k-class estimation using Klein data) + +{col 9}{stata "webuse klein" :. webuse klein} +{col 9}{stata "tsset yr" :. tsset yr} + +{col 0}(LIML estimates of Klein's consumption function) + +{p 8 12}{stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml" :. ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml} + +{col 0}(Equivalence of LIML and CUE+homoskedasticity+independence) + +{p 8 12}{stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml coviv" :. ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml coviv} + +{p 8 12}{stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), cue" :. ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), cue} + +{col 0}(Fuller's modified LIML with alpha=1) + +{p 8 12}{stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), fuller(1)" :. ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), fuller(1)} + +{col 0}(k-class estimation with Nagar's bias-adjusted IV, k=1+(L-K)/N=1+4/21=1.19) + +{p 8 12}{stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), kclass(1.19)" :. ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), kclass(1.19)} + +{col 0}(Kernel-based covariance estimation using time-series data) + +{col 9}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta" :. use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta} +{col 9}{stata "tsset year, yearly" :. tsset year, yearly} + +{col 0}(Autocorrelation-consistent (AC) inference in an OLS Regression) + +{p 8 12}{stata "ivreg2 cinf unem, bw(3)" :. ivreg2 cinf unem, bw(3)} + +{p 8 12}{stata "ivreg2 cinf unem, kernel(qs) bw(auto)" :. ivreg2 cinf unem, kernel(qs) bw(auto)} + +{col 0}(Heteroskedastic and autocorrelation-consistent (HAC) inference in an OLS regression) + +{p 8 12}{stata "ivreg2 cinf unem, bw(3) kernel(bartlett) robust small" :. ivreg2 cinf unem, bw(3) kernel(bartlett) robust small} + +{p 8 12}{stata "newey cinf unem, lag(2)" :. newey cinf unem, lag(2)} + +{col 0}(AC and HAC in IV and GMM estimation) + +{p 8 12}{stata "ivreg2 cinf (unem = l(1/3).unem), bw(3)" :. ivreg2 cinf (unem = l(1/3).unem), bw(3)} + +{p 8 12}{stata "ivreg2 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(thann)" :. ivreg2 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(thann)} + +{p 8 12}{stata "ivreg2 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(qs) robust orthog(l1.unem)" :. ivreg2 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(qs) robust orthog(l1.unem)} + +{col 0}(Examples using Large N, Small T Panel Data) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta" : . use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta }{p_end} +{p 8 12}{stata "tsset id year" :. tsset id year} + +{col 0}(Two-step effic. GMM in the presence of arbitrary heteroskedasticity and autocorrelation) + +{p 8 12}{stata "ivreg2 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm2s cluster(id)": . ivreg2 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm2s cluster(id)} + +{col 0}(Kiefer (1980) SEs - robust to arbitrary serial correlation but not heteroskedasticity) + +{p 8 12}{stata "ivreg2 n w k, kiefer": . ivreg2 n w k, kiefer} + +{p 8 12}{stata "ivreg2 n w k, bw(8) kernel(tru)": . ivreg2 n w k, bw(8) kernel(tru)} + +{col 0}(Equivalence of cluster-robust and kernel-robust with truncated kernel and max bandwidth) + +{p 8 12}{stata "ivreg2 n w k, cluster(id)": . ivreg2 n w k, cluster(id)} + +{p 8 12}{stata "ivreg2 n w k, bw(8) kernel(tru) robust": . ivreg2 n w k, bw(8) kernel(tru) robust} + +{col 0}(Examples using factor variables) + +{p 8 12}{stata "sysuse auto" : . sysuse auto }{p_end} + +{p 8 12}{stata "ivreg2 price i.foreign i.rep78": . ivreg2 price i.foreign i.rep78} + +{p 8 12}{stata "ivreg2 price i.rep78 (foreign = weight turn trunk)": . ivreg2 price i.rep78 (foreign = weight turn trunk) } + +{p 8 12}{stata "ivreg2 price i.rep78 (c.mpg#c.mpg = weight length turn)": . ivreg2 price i.rep78 (c.mpg#c.mpg = weight length turn)} + +{col 0}(Examples using Small N, Large T Panel Data. NB: T is actually not very large - only +{col 0}20 - so results should be interpreted with caution) + +{p 8 12}{stata "webuse grunfeld" : . webuse grunfeld }{p_end} +{p 8 12}{stata "tsset" : . tsset }{p_end} + +{col 0}(Autocorrelation-consistent (AC) inference) + +{p 8 12}{stata "ivreg2 invest mvalue kstock, bw(1) kernel(tru)": . ivreg2 invest mvalue kstock, bw(1) kernel(tru)} + +{col 0}(Heteroskedastic and autocorrelation-consistent (HAC) inference) + +{p 8 12}{stata "ivreg2 invest mvalue kstock, robust bw(1) kernel(tru)": . ivreg2 invest mvalue kstock, robust bw(1) kernel(tru)} + +{col 0}(HAC inference, SEs also robust to disturbances correlated across panels) + +{p 8 12}{stata "ivreg2 invest mvalue kstock, robust cluster(year) bw(1) kernel(tru)": . ivreg2 invest mvalue kstock, robust cluster(year) bw(1) kernel(tru)} + +{col 0}(Equivalence of Driscoll-Kraay SEs as implemented by {cmd:ivreg2} and {cmd:xtscc}) +{col 0}(See Hoeschle (2007) for discussion of {cmd:xtscc}) + +{p 8 12}{stata "ivreg2 invest mvalue kstock, dkraay(2) small": . ivreg2 invest mvalue kstock, dkraay(2) small} + +{p 8 12}{stata "ivreg2 invest mvalue kstock, cluster(year) bw(2) small": . ivreg2 invest mvalue kstock, cluster(year) bw(2) small} + +{p 8 12}{stata "xtscc invest mvalue kstock, lag(1)": . xtscc invest mvalue kstock, lag(1)} + +{col 0}(Examples using Large N, Large T Panel Data. NB: T is again not very large - only +{col 0}20 - so results should be interpreted with caution) + +{p 8 12}{stata "webuse nlswork" : . webuse nlswork }{p_end} +{p 8 12}{stata "tsset" : . tsset }{p_end} + +{col 0}(One-way cluster-robust: SEs robust to arbitrary heteroskedasticity and within-panel +{col 0}autocorrelation) + +{p 8 12}{stata "ivreg2 ln_w grade age ttl_exp tenure, cluster(idcode)": . ivreg2 ln_w grade age ttl_exp tenure, cluster(idcode) }{p_end} + +{col 0}(Two-way cluster-robust: SEs robust to arbitrary heteroskedasticity and within-panel +{col 0}autocorrelation, and contemporaneous cross-panel correlation, i.e., the cross-panel +{col 0}correlation is not autocorrelated) + +{p 8 12}{stata "ivreg2 ln_w grade age ttl_exp tenure, cluster(idcode year)": . ivreg2 ln_w grade age ttl_exp tenure, cluster(idcode year) }{p_end} + +{col 0}(Two-way cluster-robust: SEs robust to arbitrary heteroskedasticity and within-panel +{col 0}autocorrelation and cross-panel autocorrelated disturbances that disappear after 2 lags) + +{p 8 12}{stata "ivreg2 ln_w grade age ttl_exp tenure, cluster(idcode year) bw(2) kernel(tru) ": . ivreg2 ln_w grade age ttl_exp tenure, cluster(idcode year) bw(2) kernel(tru) }{p_end} + + + +{marker s_refs}{title:References} + +{p 0 4}Ahn, Seung C. 1997. Orthogonality tests in linear models. Oxford Bulletin +of Economics and Statistics, Vol. 59, pp. 183-186. + +{p 0 4}Anderson, T.W. 1951. Estimating linear restrictions on regression coefficients +for multivariate normal distributions. Annals of Mathematical Statistics, Vol. 22, pp. 327-51. + +{p 0 4}Anderson, T. W. and H. Rubin. 1949. Estimation of the parameters of a single equation +in a complete system of stochastic equations. Annals of Mathematical Statistics, Vol. 20, +pp. 46-63. + +{p 0 4}Anderson, T. W. and H. Rubin. 1950. The asymptotic properties of estimates of the parameters of a single +equation in a complete system of stochastic equations. Annals of Mathematical Statistics, +Vol. 21, pp. 570-82. + +{p 0 4}Angrist, J.D. and Pischke, J.-S. 2009. Mostly Harmless Econometrics: An Empiricist's Companion. +Princeton: Princeton University Press. + +{p 0 4}Baum, C.F., Schaffer, M.E., and Stillman, S. 2003. Instrumental Variables and GMM: +Estimation and Testing. The Stata Journal, Vol. 3, No. 1, pp. 1-31. +{browse "http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html":http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html}. +Working paper version: Boston College Department of Economics Working Paper No. 545. +{browse "http://ideas.repec.org/p/boc/bocoec/545.html":http://ideas.repec.org/p/boc/bocoec/545.html}. +Citations in {browse "http://scholar.google.com/scholar?oi=bibs&hl=en&cites=9432785573549481148":published work}. + +{p 0 4}Baum, C. F., Schaffer, M.E., and Stillman, S. 2007. Enhanced routines for instrumental variables/GMM estimation and testing. +The Stata Journal, Vol. 7, No. 4, pp. 465-506. +{browse "http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html":http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html}. +Working paper version: Boston College Department of Economics Working Paper No. 667. +{browse "http://ideas.repec.org/p/boc/bocoec/667.html":http://ideas.repec.org/p/boc/bocoec/667.html}. +Citations in {browse "http://scholar.google.com/scholar?oi=bibs&hl=en&cites=1691909976816211536":published work}. + +{p 0 4}Breusch, T., Qian, H., Schmidt, P. and Wyhowski, D. 1999. +Redundancy of moment conditions. +Journal of Econometrics, Vol. 9, pp. 89-111. + +{p 0 4}Cameron, A.C., Gelbach, J.B. and Miller, D.L. 2006. +Robust Inference with Multi-Way Clustering. +NBER Technical Working paper 327. +{browse "http://www.nber.org/papers/t0327":http://www.nber.org/papers/t0327}. +Forthcoming in the Journal of Business and Economic Statistics. +{cmd:cgmreg} is available at +{browse "http://www.econ.ucdavis.edu/faculty/dlmiller/statafiles":http://www.econ.ucdavis.edu/faculty/dlmiller/statafiles}. + +{p 0 4}Chernozhukov, V. and Hansen, C. 2005. The Reduced Form: +A Simple Approach to Inference with Weak Instruments. +Working paper, University of Chicago, Graduate School of Business. + +{p 0 4}Cragg, J.G. and Donald, S.G. 1993. Testing Identfiability and Specification in +Instrumental Variables Models. Econometric Theory, Vol. 9, pp. 222-240. + +{p 0 4}Cushing, M.J. and McGarvey, M.G. 1999. Covariance Matrix Estimation. +In L. Matyas (ed.), Generalized Methods of Moments Estimation. +Cambridge: Cambridge University Press. + +{p 0 4}Davidson, R. and MacKinnon, J. 1993. Estimation and Inference in Econometrics. +1993. New York: Oxford University Press. + +{p 0 4}Driscoll, J.C. and Kraay, A. 1998. Consistent Covariance Matrix Estimation With Spatially Dependent Panel Data. +Review of Economics and Statistics. Vol. 80, No. 4, pp. 549-560. + +{p 0 4}Dufour, J.M. 2003. Identification, Weak Instruments and Statistical Inference +in Econometrics. Canadian Journal of Economics, Vol. 36, No. 4, pp. 767-808. +Working paper version: CIRANO Working Paper 2003s-49. +{browse "http://www.cirano.qc.ca/pdf/publication/2003s-49.pdf":http://www.cirano.qc.ca/pdf/publication/2003s-49.pdf}. + +{p 0 4}Finlay, K., and Magnusson, L.M. 2009. Implementing Weak-Instrument Robust Tests +for a General Class of Instrumental-Variables Models. +The Stata Journal, Vol. 9, No. 3, pp. 398-421. +{browse "http://www.stata-journal.com/article.html?article=st0171":http://www.stata-journal.com/article.html?article=st0171}. + +{p 0 4}Hall, A.R. Generalized Method of Moments. 2005. Oxford: Oxford University Press. + +{p 0 4}Hall, A.R., Rudebusch, G.D. and Wilcox, D.W. 1996. Judging Instrument Relevance in +Instrumental Variables Estimation. International Economic Review, Vol. 37, No. 2, pp. 283-298. + +{p 0 4}Hayashi, F. Econometrics. 2000. Princeton: Princeton University Press. + +{p 0 4}Hansen, L.P., Heaton, J., and Yaron, A. 1996. Finite Sample Properties +of Some Alternative GMM Estimators. Journal of Business and Economic Statistics, Vol. 14, No. 3, pp. 262-280. + +{p 0 4}Hoechle, D. 2007. Robust Standard Errors for Panel Regressions with Crossñsectional Dependence. +Stata Journal, Vol. 7, No. 3, pp. 281-312. +{browse "http://www.stata-journal.com/article.html?article=st0128":http://www.stata-journal.com/article.html?article=st0128}. + +{p 0 4}Kiefer, N.M. 1980. Estimation of Fixed Effect Models for Time Series of Cross-Sections with +Arbitrary Intertemporal Covariance. Journal of Econometrics, Vol. 14, No. 2, pp. 195-202. + +{p 0 4}Kleibergen, F. 2007. Generalizing Weak Instrument Robust Statistics Towards Multiple Parameters, Unrestricted Covariance Matrices and Identification Statistics. Journal of Econometrics, forthcoming. + +{p 0 4}Kleibergen, F. and Paap, R. 2006. Generalized Reduced Rank Tests Using the Singular Value Decomposition. +Journal of Econometrics, Vol. 133, pp. 97-126. + +{p 0 4}Kleibergen, F. and Schaffer, M.E. 2007. ranktest: Stata module for testing the rank +of a matrix using the Kleibergen-Paap rk statistic. +{browse "http://ideas.repec.org/c/boc/bocode/s456865.html":http://ideas.repec.org/c/boc/bocode/s456865.html}. + +{p 0 4}Mikusheva, A. and Poi, B.P. 2006. +Tests and Confidence Sets with Correct Size When Instruments are Potentially Weak. The Stata Journal, Vol. 6, No. 3, pp. 335-347. + +{p 0 4}Moreira, M.J. and Poi, B.P. 2003. Implementing Tests with the Correct Size in the Simultaneous Equations Model. The Stata Journal, Vol. 3, No. 1, pp. 57-70. + +{p 0 4}Newey, W.K. and K.D. West, 1994. Automatic Lag Selection in Covariance Matrix Estimation. Review of Economic Studies, Vol. 61, No. 4, pp. 631-653. + +{p 0 4}Sanderson, E. and F. Windmeijer, 2015. A Weak Instrument F-Test in Linear IV Models with Multiple Endogenous Variables. +Journal of Econometrics (forthcoming). +Working paper version: University of Bristol Discussion Paper 14/644. +{browse "http://ideas.repec.org/p/bri/uobdis/14-644.html":http://ideas.repec.org/p/bri/uobdis/14-644.html}. + +{p 0 4}Shea, J. 1997. Instrument Relevance in Multivariate Linear Models: A Simple Measure. +Review of Economics and Statistics, Vol. 49, No. 2, pp. 348-352. + +{p 0 4}Stock, J.H. and Wright, J.H. 2000. GMM with Weak Identification. +Econometrica, Vol. 68, No. 5, September, pp. 1055-1096. + +{p 0 4}Stock, J.H. and Yogo, M. 2005. Testing for Weak Instruments in Linear IV Regression. In D.W.K. Andrews and J.H. Stock, eds. Identification and Inference for Econometric Models: Essays in Honor of Thomas Rothenberg. Cambridge: Cambridge University Press, 2005, pp. 80Ò108. +Working paper version: NBER Technical Working Paper 284. +{browse "http://www.nber.org/papers/T0284":http://www.nber.org/papers/T0284}. + +{p 0 4}Thompson, S.B. 2009. Simple Formulas for Standard Errors that Cluster by Both Firm and Time. +{browse "http://ssrn.com/abstract=914002":http://ssrn.com/abstract=914002}. + +{p 0 4}Wooldridge, J.M. 2002. Econometric Analysis of Cross Section and Panel Data. Cambridge, MA: MIT Press. + + +{marker s_acknow}{title:Acknowledgements} + +{p}We would like to thanks various colleagues who helped us along the way, including +David Drukker, +Frank Kleibergen, +Austin Nichols, +Brian Poi, +Vince Wiggins, +and, not least, the users of {cmd:ivreg2} +who have provided suggestions, +spotted bugs, +and helped test the package. +We are also grateful to Jim Stock and Moto Yogo for permission to reproduce +their critical values for the Cragg-Donald statistic. + +{marker s_citation}{title:Citation of ivreg2} + +{p}{cmd:ivreg2} is not an official Stata command. It is a free contribution +to the research community, like a paper. Please cite it as such: {p_end} + +{phang}Baum, C.F., Schaffer, M.E., Stillman, S. 2010. +ivreg2: Stata module for extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression. +{browse "http://ideas.repec.org/c/boc/bocode/s425401.html":http://ideas.repec.org/c/boc/bocode/s425401.html}{p_end} + +{title:Authors} + + Christopher F Baum, Boston College, USA + baum@bc.edu + + Mark E Schaffer, Heriot-Watt University, UK + m.e.schaffer@hw.ac.uk + + Steven Stillman, Motu Economic and Public Policy Research + stillman@motu.org.nz + + +{title:Also see} + +{p 1 14}Articles:{it:Stata Journal}, volume 3, number 1: {browse "http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html":st0030}{p_end} +{p 10 14}{it:Stata Journal}, volume 7, number 4: {browse "http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html":st0030_3}{p_end} + +{p 1 14}Manual: {hi:[U] 23 Estimation and post-estimation commands}{p_end} +{p 10 14}{hi:[U] 29 Overview of model estimation in Stata}{p_end} +{p 10 14}{hi:[R] ivreg}{p_end} + +{p 1 10}On-line: help for {help ivregress}, {help ivreg}, {help newey}; +{help overid}, {help ivendog}, {help ivhettest}, {help ivreset}, +{help xtivreg2}, {help xtoverid}, {help ranktest}, +{help condivreg} (if installed); +{help weakiv} (if installed); +{help cgmreg} (if installed); +{help xtscc} (if installed); +{help est}, {help postest}; +{help regress}{p_end} diff --git a/ado/i/ivreg210.ado b/ado/i/ivreg210.ado new file mode 100644 index 0000000..e3f0fd0 --- /dev/null +++ b/ado/i/ivreg210.ado @@ -0,0 +1,6951 @@ +*! ivreg210 3.1.10 19Jan2015 +*! authors cfb & mes +*! see end of file for version comments + +* Variable naming: +* lhs = LHS endogenous +* endo = X1, RHS endogenous (instrumented) = #K1 +* inexog = X2 = Z2 = included exogenous (instruments) = #K2 = #L2 +* exexog = Z1 = excluded exogenous (instruments) = #L1 +* iv = {inexog exexog} = all instruments +* rhs = {endo inexog} = RHS regressors +* 1 at the end of the name means the varlist after duplicates and collinearities removed +* ..1_ct at the end means a straight count of the list +* .._ct at the end means ..1_ct with any additional detected cnts removed +* dofminus is large-sample adjustment (e.g., #fixed effects) +* sdofminus is small-sample adjustment (e.g., #partialled-out regressors) + +*************************************** START **************************************** +********************************* livreg2.mlib CODE ********************************** +* Code from: +* livreg2 1.1.07 13july2014 +* authors cfb & mes +* compiled in Stata 9.2 +* Mata library for ivreg2 and ranktest. +* Introduced with ivreg2 v 3.1.01 and ranktest v 1.3.01. +* Imported into ivreg210 so that ivreg210 is free-standing. +* See end of file for version notes. + +version 9.2 +mata: + +// ********* struct ms_ivreg210_vcvorthog - shared by ivreg2 and ranktest ******************* // +struct ms_ivreg210_vcvorthog { + string scalar ename, Znames, touse, weight, wvarname + string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel + string scalar sw, psd, ivarname, tvarname, tindexname + real scalar wf, N, bw, tdelta, dofminus + real matrix ZZ + pointer matrix e + pointer matrix Z + pointer matrix wvar +} + +// ********* s_ivreg210_vkernel - shared by ivreg2 and ranktest ******************* // +// Program checks whether kernel and bw choices are valid. +// s_ivreg210_vkernel is called from Stata. +// Arguments are the kernel name (req), bandwidth (req) and ivar name (opt). +// All 3 are strings. +// Returns results in r() macros. +// r(kernel) - name of kernel (string) +// r(bw) - bandwidth (scalar) + +void s_ivreg210_vkernel( string scalar kernel, + string scalar bwstring, + string scalar ivar + ) +{ + +// Check bandwidth + if (bwstring=="auto") { + bw=-1 + } + else { + bw=strtoreal(bwstring) + if (bw==.) { + printf("{err}bandwidth option bw() required for HAC-robust estimation\n") + exit(102) + } + if (bw<=0) { + printf("{err}invalid bandwidth in option bw() - must be real > 0\n") + exit(198) + } + } + +// Check ivar + if (bwstring=="auto" & ivar~="") { + printf("{err}Automatic bandwidth selection not available for panel data\n") + exit(198) + } + +// Check kernel +// Valid kernel list is abbrev, full name, whether special case if bw=1 +// First in list is default kernel = Barlett + vklist = ( ("", "bartlett", "0") + \ ("bar", "bartlett", "0") + \ ("bartlett", "bartlett", "0") + \ ("par", "parzen", "0") + \ ("parzen", "parzen", "0") + \ ("tru", "truncated", "1") + \ ("truncated", "truncated", "1") + \ ("thann", "tukey-hanning", "0") + \ ("tukey-hanning", "tukey-hanning", "0") + \ ("thamm", "tukey-hamming", "0") + \ ("tukey-hamming", "tukey-hamming", "0") + \ ("qua", "quadratic spectral", "1") + \ ("qs", "quadratic spectral", "1") + \ ("quadratic-spectral", "quadratic spectral", "1") + \ ("quadratic spectral", "quadratic spectral", "1") + \ ("dan", "danielle", "1") + \ ("danielle", "danielle", "1") + \ ("ten", "tent", "1") + \ ("tent", "tent", "1") + ) + kname=strltrim(strlower(kernel)) + pos = (vklist[.,1] :== kname) + +// Exit with error if not in list + if (sum(pos)==0) { + printf("{err}invalid kernel\n") + exit(198) + } + + vkname=strproper(select(vklist[.,2],pos)) + st_global("r(kernel)", vkname) + st_numscalar("r(bw)",bw) + +// Warn if kernel is type where bw=1 means no lags are used + if (bw==1 & select(vklist[.,3],pos)=="0") { + printf("{result}Note: kernel=%s", vkname) + printf("{result} and bw=1 implies zero lags used. Standard errors and\n") + printf("{result} test statistics are not autocorrelation-consistent.\n") + } +} // end of program s_ivreg210_vkernel + +// ********* m_ivreg210_omega - shared by ivreg2 and ranktest ********************* // + +// NB: ivreg2 always calls m_ivreg210_omega with e as column vector, i.e., K=1 // +// ranktest can call m_ivreg210_omega with e as matrix, i.e., K>=1 // + +real matrix m_ivreg210_omega(struct ms_ivreg210_vcvorthog scalar vcvo) +{ + if (vcvo.clustvarname~="") { + st_view(clustvar, ., vcvo.clustvarname, vcvo.touse) + info = panelsetup(clustvar, 1) + N_clust=rows(info) + if (vcvo.clustvarname2~="") { + st_view(clustvar2, ., vcvo.clustvarname2, vcvo.touse) + if (vcvo.kernel=="") { + st_view(clustvar3, ., vcvo.clustvarname3, vcvo.touse) // needed only if not panel tsset + } + } + } + + if (vcvo.kernel~="") { + st_view(t, ., st_tsrevar(vcvo.tvarname), vcvo.touse) + T=max(t)-min(t)+1 + } + + if ((vcvo.kernel=="Bartlett") | (vcvo.kernel=="Parzen") | (vcvo.kernel=="Truncated") /// + | (vcvo.kernel=="Tukey-Hanning")| (vcvo.kernel=="Tukey-Hamming")) { + window="lag" + } + else if ((vcvo.kernel=="Quadratic Spectral") | (vcvo.kernel=="Danielle") | (vcvo.kernel=="Tent")) { + window="spectral" + } + else if (vcvo.kernel~="") { +// Should never reach this point +printf("\n{error:Error: invalid kernel}\n") + exit(error(3351)) + } + + L=cols(*vcvo.Z) + K=cols(*vcvo.e) // ivreg2 always calls with K=1; ranktest may call with K>=1. + +// Covariance matrices +// shat * 1/N is same as estimated S matrix of orthog conditions + +// Block for homoskedastic and AC. dof correction if any incorporated into sigma estimates. + if ((vcvo.robust=="") & (vcvo.clustvarname=="")) { +// ZZ is already calculated as an external + ee = quadcross(*vcvo.e, vcvo.wf*(*vcvo.wvar), *vcvo.e) + sigma2=ee/(vcvo.N-vcvo.dofminus) + shat=sigma2#vcvo.ZZ + if (vcvo.kernel~="") { + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + tnow=st_data(., vcvo.tindexname) + for (tau=1; tau<=TAU; tau++) { + kw = m_ivreg210_calckw(tau, vcvo.bw, vcvo.kernel) + if (kw~=0) { // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + lstau = "L"+strofreal(tau) + tlag=st_data(., lstau+"."+vcvo.tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix +// if no lags exist, tmatrix has zero rows. + if (rows(tmatrix)>0) { +// col 1 of tmatrix has row numbers of all rows of data with this time period that have a corresponding lag +// col 2 of tmatrix has row numbers of all rows of data with lag tau that have a corresponding ob this time period. +// Should never happen that fweights or iweights make it here, +// but if they did the next line would be sqrt(wvari)*sqrt(wvari1) [with no wf since not needed for fw or iw] + wv = (*vcvo.wvar)[tmatrix[.,1]] /// + :* (*vcvo.wvar)[tmatrix[.,2]]*(vcvo.wf^2) // inner weighting matrix for quadcross + sigmahat = quadcross((*vcvo.e)[tmatrix[.,1],.], wv ,(*vcvo.e)[tmatrix[.,2],.]) /// + / (vcvo.N-vcvo.dofminus) // large dof correction + ZZhat = quadcross((*vcvo.Z)[tmatrix[.,1],.], wv, (*vcvo.Z)[tmatrix[.,2],.]) + ghat = sigmahat#ZZhat + shat=shat+kw*(ghat+ghat') + } + } // end non-zero kernel weight block + } // end tau loop + } // end kernel code +// Note large dof correction (if there is one) has already been incorporated + shat=shat/vcvo.N + } // end homoskedastic, AC code + +// Block for robust HC and HAC but not Stock-Watson and single clustering. +// Need to enter for double-clustering if one cluster is time. + if ( (vcvo.robust~="") & (vcvo.sw=="") & ((vcvo.clustvarname=="") /// + | ((vcvo.clustvarname2~="") & (vcvo.kernel~=""))) ) { + if (K==1) { // simple/fast where e is a column vector + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { + wv = (*vcvo.e:^2) :* *vcvo.wvar + } + else { + wv = (*vcvo.e :* *vcvo.wvar * vcvo.wf):^2 // wf needed for aweights and pweights + } + shat=quadcross(*vcvo.Z, wv, *vcvo.Z) // basic Eicker-Huber-White-sandwich-robust vce + } + else { // e is a matrix so must loop + shat=J(L*K,L*K,0) + for (i=1; i<=rows(*vcvo.e); i++) { + eZi=((*vcvo.e)[i,.])#((*vcvo.Z)[i,.]) + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { +// wvar is a column vector. wf not needed for fw and iw (=1 by dfn so redundant). + shat=shat+quadcross(eZi,eZi)*((*vcvo.wvar)[i]) + } + else { + shat=shat+quadcross(eZi,eZi)*((*vcvo.wvar)[i] * vcvo.wf)^2 // **** ADDED *vcvo.wf + } + } + } + if (vcvo.kernel~="") { +// Spectral windows require looping through all T-1 autocovariances + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + tnow=st_data(., vcvo.tindexname) + for (tau=1; tau<=TAU; tau++) { + kw = m_ivreg210_calckw(tau, vcvo.bw, vcvo.kernel) + if (kw~=0) { // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + lstau = "L"+strofreal(tau) + tlag=st_data(., lstau+"."+vcvo.tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix + +// col 1 of tmatrix has row numbers of all rows of data with this time period that have a corresponding lag +// col 2 of tmatrix has row numbers of all rows of data with lag tau that have a corresponding ob this time period. +// if no lags exist, tmatrix has zero rows + if (rows(tmatrix)>0) { + if (K==1) { // simple/fast where e is a column vector +// wv is inner weighting matrix for quadcross + wv = (*vcvo.e)[tmatrix[.,1]] :* (*vcvo.e)[tmatrix[.,2]] /// + :* (*vcvo.wvar)[tmatrix[.,1]] :* (*vcvo.wvar)[tmatrix[.,2]] * (vcvo.wf^2) + ghat = quadcross((*vcvo.Z)[tmatrix[.,1],.], wv, (*vcvo.Z)[tmatrix[.,2],.]) + } + else { // e is a matrix so must loop + ghat=J(L*K,L*K,0) + for (i=1; i<=rows(tmatrix); i++) { + wvari =(*vcvo.wvar)[tmatrix[i,1]] + wvari1=(*vcvo.wvar)[tmatrix[i,2]] + ei =(*vcvo.e)[tmatrix[i,1],.] + ei1 =(*vcvo.e)[tmatrix[i,2],.] + Zi =(*vcvo.Z)[tmatrix[i,1],.] + Zi1 =(*vcvo.Z)[tmatrix[i,2],.] + eZi =ei#Zi + eZi1=ei1#Zi1 +// Should never happen that fweights or iweights make it here, but if they did +// the next line would be ghat=ghat+eZi'*eZi1*sqrt(wvari)*sqrt(wvari1) +// [without *vcvo.wf since wf=1 for fw and iw] + ghat=ghat+quadcross(eZi,eZi1)*wvari*wvari1 * (vcvo.wf^2) // ADDED * (vcvo.wf^2) + } + } + shat=shat+kw*(ghat+ghat') + } // end non-zero-obs accumulation block + } // end non-zero kernel weight block + } // end tau loop + } // end kernel code +// Incorporate large dof correction if there is one + shat=shat/(vcvo.N-vcvo.dofminus) + } // end HC/HAC code + + if (vcvo.clustvarname~="") { +// Block for cluster-robust +// 2-level clustering: S = S(level 1) + S(level 2) - S(level 3 = intersection of levels 1 & 2) +// Prepare shat3 if 2-level clustering + if (vcvo.clustvarname2~="") { + if (vcvo.kernel~="") { // second cluster variable is time + // shat3 was already calculated above as shat + shat3=shat*(vcvo.N-vcvo.dofminus) + } + else { // calculate shat3 + // data were sorted on clustvar3-clustvar1 so + // clustvar3 is nested in clustvar1 and Mata panel functions + // work for both. + info3 = panelsetup(clustvar3, 1) + if (rows(info3)==rows(*vcvo.e)) { // intersection of levels 1 & 2 are all single obs + // so no need to loop through row by row + if (K==1) { // simple/fast where e is a column vector + wv = (*vcvo.e :* *vcvo.wvar * vcvo.wf):^2 + shat3=quadcross(*vcvo.Z, wv, *vcvo.Z) // basic Eicker-Huber-White-sandwich-robust vce + } + else { // e is a matrix so must loop + shat3=J(L*K,L*K,0) + for (i=1; i<=rows(*vcvo.e); i++) { + eZi=((*vcvo.e)[i,.])#((*vcvo.Z)[i,.]) + shat3=shat3+quadcross(eZi,eZi)*((*vcvo.wvar)[i] * vcvo.wf)^2 // **** ADDED *vcvo.wf + } + } + } + else { // intersection of levels 1 & 2 includes some groups of obs + N_clust3=rows(info3) + shat3=J(L*K,L*K,0) + for (i=1; i<=N_clust3; i++) { + esub=panelsubmatrix(*vcvo.e,i,info3) + Zsub=panelsubmatrix(*vcvo.Z,i,info3) + wsub=panelsubmatrix(*vcvo.wvar,i,info3) + wv = esub :* wsub * vcvo.wf + if (K==1) { // simple/fast where e is a column vector + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ = J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.] * vcvo.wf // **** ADDED *vcvo.wf + } + } + shat3=shat3+quadcross(eZ,eZ) + } + } + } + } + +// 1st level of clustering, no kernel-robust +// Entered unless 1-level clustering and kernel-robust + if (!((vcvo.kernel~="") & (vcvo.clustvarname2==""))) { + shat=J(L*K,L*K,0) + for (i=1; i<=N_clust; i++) { // loop through clusters, adding Z'ee'Z + // for indiv cluster in each loop + esub=panelsubmatrix(*vcvo.e,i,info) + Zsub=panelsubmatrix(*vcvo.Z,i,info) + wsub=panelsubmatrix(*vcvo.wvar,i,info) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat=shat+quadcross(eZ,eZ) + } // end loop through clusters + } + +// 2-level clustering, no kernel-robust + if ((vcvo.clustvarname2~="") & (vcvo.kernel=="")) { + imax=max(clustvar2) // clustvar2 is numbered 1..N_clust2 + shat2=J(L*K,L*K,0) + for (i=1; i<=imax; i++) { // loop through clusters, adding Z'ee'Z + // for indiv cluster in each loop + svar=(clustvar2:==i) // mimics panelsubmatrix but doesn't require sorted data + esub=select(*vcvo.e,svar) // it is, however, noticably slower. + Zsub=select(*vcvo.Z,svar) + wsub=select(*vcvo.wvar,svar) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat2=shat2+quadcross(eZ,eZ) + } + } + +// 1st level of cluster, kernel-robust OR +// 2-level clustering, kernel-robust and time is 2nd cluster variable + if (vcvo.kernel~="") { + shat2=J(L*K,L*K,0) +// First, standard cluster-robust, i.e., no lags. + i=min(t) + while (i<=max(t)) { // loop through all T clusters, adding Z'ee'Z + // for indiv cluster in each loop + eZ=J(1,L*K,0) + svar=(t:==i) // select obs with t=i + if (colsum(svar)>0) { // there are obs with t=i + esub=select(*vcvo.e,svar) + Zsub=select(*vcvo.Z,svar) + wsub=select(*vcvo.wvar,svar) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { +// MISSING LINE IS NEXT + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat2=shat2+quadcross(eZ,eZ) + } + i=i+vcvo.tdelta + } // end i loop through all T clusters + +// Spectral windows require looping through all T-1 autocovariances + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + + for (tau=1; tau<=TAU; tau++) { + kw = m_ivreg210_calckw(tau, vcvo.bw, vcvo.kernel) // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + if (kw~=0) { + i=min(t)+tau*vcvo.tdelta // Loop through all possible ts (time clusters) + while (i<=max(t)) { // Start at earliest possible t + svar=t[.,]:==i // svar is current, svar1 is tau-th lag + svar1=t[.,]:==(i-tau*vcvo.tdelta) // tau*vcvo.tdelta is usually just tau + if ((colsum(svar)>0) // there are current & lagged obs + & (colsum(svar1)>0)) { + wv = select((*vcvo.e),svar) :* select((*vcvo.wvar),svar) * vcvo.wf + wv1 = select((*vcvo.e),svar1) :* select((*vcvo.wvar),svar1) * vcvo.wf + Zsub =select((*vcvo.Z),svar) + Zsub1=select((*vcvo.Z),svar1) + if (K==1) { // simple/fast, e is column vector + eZsub = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + eZsub1= quadcross(1, wv1, Zsub1) // equivalent to colsum(wv :* Zsub) + } + else { + eZsub=J(1,L*K,0) + for (j=1; j<=rows(Zsub); j++) { + wvj =wv[j,.] + Zj =Zsub[j,.] + eZsub=eZsub+(wvj#Zj) + } + eZsub1=J(1,L*K,0) + for (j=1; j<=rows(Zsub1); j++) { + wv1j =wv1[j,.] + Z1j =Zsub1[j,.] + eZsub1=eZsub1+(wv1j#Z1j) + } + } + ghat=quadcross(eZsub,eZsub1) + shat2=shat2+kw*(ghat+ghat') + } + i=i+vcvo.tdelta + } + } // end non-zero kernel weight block + } // end tau loop + +// If 1-level clustering, shat2 just calculated above is actually the desired shat + if (vcvo.clustvarname2=="") { + shat=shat2 + } + } + +// 2-level clustering, completion +// Cameron-Gelbach-Miller/Thompson method: +// Add 2 cluster variance matrices and subtract 3rd + if (vcvo.clustvarname2~="") { + shat = shat+shat2-shat3 + } + +// Note no dof correction required for cluster-robust + shat=shat/vcvo.N + } // end cluster-robust code + + if (vcvo.sw~="") { +// Stock-Watson adjustment. Calculate Bhat in their equation (6). Also need T=panel length. +// They define for balanced panels. Since T is not constant for unbalanced panels, need +// to incorporate panel-varying 1/T, 1/(T-1) and 1/(T-2) as weights in summation. + + st_view(ivar, ., st_tsrevar(vcvo.ivarname), vcvo.touse) + info_ivar = panelsetup(ivar, 1) + + shat=J(L*K,L*K,0) + bhat=J(L*K,L*K,0) + N_panels=0 + for (i=1; i<=rows(info_ivar); i++) { + esub=panelsubmatrix(*vcvo.e,i,info_ivar) + Zsub=panelsubmatrix(*vcvo.Z,i,info_ivar) + wsub=panelsubmatrix(*vcvo.wvar,i,info_ivar) + Tsub=rows(esub) + if (Tsub>2) { // SW cov estimator defined only for T>2 + N_panels=N_panels+1 + sigmahatsub=J(K,K,0) + ZZsub=J(L*K,L*K,0) + shatsub=J(L*K,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZi=esub[j,1]#Zsub[j,.] + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { + shatsub=shatsub+quadcross(eZi,eZi)*wsub[j]*vcvo.wf + sigmahatsub=sigmahatsub + quadcross(esub[j,1],esub[j,1])*wsub[j]*vcvo.wf + ZZsub=ZZsub+quadcross(Zsub[j,.],Zsub[j,.])*wsub[j]*vcvo.wf + } + else { + shatsub=shatsub+quadcross(eZi,eZi)*((wsub[j]*vcvo.wf)^2) + sigmahatsub=sigmahatsub + quadcross(esub[j,1],esub[j,1])*((wsub[j]*vcvo.wf)^2) + ZZsub=ZZsub+quadcross(Zsub[j,.],Zsub[j,.])*((wsub[j]*vcvo.wf)^2) + } + } // end loop through j obs of panel i + shat=shat + shatsub*(Tsub-1)/(Tsub-2) + bhat=bhat + ZZsub/Tsub#sigmahatsub/(Tsub-1)/(Tsub-2) + } + } // end loop through i panels + +// Note that Stock-Watson incorporate an N-n-k degrees of freedom correction in their eqn 4 +// for what we call shat. We use only an N-n degrees of freedom correction, i.e., we ignore +// the k regressors. This is because this is an estimate of S, the VCV of orthogonality conditions, +// independently of its use to obtain an estimate of the variance of beta. Makes no diff aysmptotically. +// Ignore dofminus correction since this is explicitly handled here. +// Use number of valid panels in denominator (SW cov estimator defined only for panels with T>2). + shat=shat/(vcvo.N-N_panels) + bhat=bhat/N_panels + shat=shat-bhat + } // end Stock-Watson block + + _makesymmetric(shat) + +// shat may not be positive-definite. Use spectral decomposition to obtain an invertable version. +// Extract Eigenvector and Eigenvalues, replace EVs, and reassemble shat. +// psda option: Stock-Watson 2008 Econometrica, Remark 8, say replace neg EVs with abs(EVs). +// psd0 option: Politis (2007) says replace neg EVs with zeros. + if (vcvo.psd~="") { + symeigensystem(shat,Evec,Eval) + if (vcvo.psd=="psda") { + Eval = abs(Eval) + } + else { + Eval = Eval + (abs(Eval) - Eval)/2 + } + shat = Evec*diag(Eval)*Evec' + _makesymmetric(shat) + } + + return(shat) + +} // end of program m_ivreg210_omega + +// *********************************************************************** // +// ********* m_ivreg210_calckw - shared by ivreg2 and ranktest ********************* // +// *********************************************************************** // + +real scalar m_ivreg210_calckw( real scalar tau, + real scalar bw, + string scalar kernel) + { + karg = tau / bw + if (kernel=="Truncated") { + kw=1 + } + if (kernel=="Bartlett") { + kw=(1-karg) + } + if (kernel=="Parzen") { + if (karg <= 0.5) { + kw = 1-6*karg^2+6*karg^3 + } + else { + kw = 2*(1-karg)^3 + } + } + if (kernel=="Tukey-Hanning") { + kw=0.5+0.5*cos(pi()*karg) + } + if (kernel=="Tukey-Hamming") { + kw=0.54+0.46*cos(pi()*karg) + } + if (kernel=="Tent") { + kw=2*(1-cos(tau*karg)) / (karg^2) + } + if (kernel=="Danielle") { + kw=sin(pi()*karg) / (pi()*karg) + } + if (kernel=="Quadratic Spectral") { + kw=25/(12*pi()^2*karg^2) /* + */ * ( sin(6*pi()*karg/5)/(6*pi()*karg/5) /* + */ - cos(6*pi()*karg/5) ) + } + return(kw) + } // end kw + +// *********************************************************************** // +// ********* END CODE SHARED BY ivreg2 AND ranktest ******************** // +// *********************************************************************** // + +// cdsy: used by ivreg2 + +void s_ivreg210_cdsy( string scalar temp, scalar choice) +{ +string scalar s_ivbias5, s_ivbias10, s_ivbias20, s_ivbias30 +string scalar s_ivsize10, s_ivsize15, s_ivsize20, s_ivsize25 +string scalar s_fullrel5, s_fullrel10, s_fullrel20, s_fullrel30 +string scalar s_fullmax5, s_fullmax10, s_fullmax20, s_fullmax30 +string scalar s_limlsize10, s_limlsize15, s_limlsize20, s_limlsize25 + +s_ivbias5 = +". , . , . \ . , . , . \ 13.91 , . , . \ 16.85 , 11.04 , . \ 18.37 , 13.97 , 9.53 \ 19.28 , 15.72 , 12.20 \ 19.86 , 16.88 , 13.95 \ 20.25 , 17.70 , 15.18 \ 20.53 , 18.30 , 16.10 \ 20.74 , 18.76 , 16.80 \ 20.90 , 19.12 , 17.35 \ 21.01 , 19.40 , 17.80 \ 21.10 , 19.64 , 18.17 \ 21.18 , 19.83 , 18.47 \ 21.23 , 19.98 , 18.73 \ 21.28 , 20.12 , 18.94 \ 21.31 , 20.23 , 19.13 \ 21.34 , 20.33 , 19.29 \ 21.36 , 20.41 , 19.44 \ 21.38 , 20.48 , 19.56 \ 21.39 , 20.54 , 19.67 \ 21.40 , 20.60 , 19.77 \ 21.41 , 20.65 , 19.86 \ 21.41 , 20.69 , 19.94 \ 21.42 , 20.73 , 20.01 \ 21.42 , 20.76 , 20.07 \ 21.42 , 20.79 , 20.13 \ 21.42 , 20.82 , 20.18 \ 21.42 , 20.84 , 20.23 \ 21.42 , 20.86 , 20.27 \ 21.41 , 20.88 , 20.31 \ 21.41 , 20.90 , 20.35 \ 21.41 , 20.91 , 20.38 \ 21.40 , 20.93 , 20.41 \ 21.40 , 20.94 , 20.44 \ 21.39 , 20.95 , 20.47 \ 21.39 , 20.96 , 20.49 \ 21.38 , 20.97 , 20.51 \ 21.38 , 20.98 , 20.54 \ 21.37 , 20.99 , 20.56 \ 21.37 , 20.99 , 20.57 \ 21.36 , 21.00 , 20.59 \ 21.35 , 21.00 , 20.61 \ 21.35 , 21.01 , 20.62 \ 21.34 , 21.01 , 20.64 \ 21.34 , 21.02 , 20.65 \ 21.33 , 21.02 , 20.66 \ 21.32 , 21.02 , 20.67 \ 21.32 , 21.03 , 20.68 \ 21.31 , 21.03 , 20.69 \ 21.31 , 21.03 , 20.70 \ 21.30 , 21.03 , 20.71 \ 21.30 , 21.03 , 20.72 \ 21.29 , 21.03 , 20.73 \ 21.28 , 21.03 , 20.73 \ 21.28 , 21.04 , 20.74 \ 21.27 , 21.04 , 20.75 \ 21.27 , 21.04 , 20.75 \ 21.26 , 21.04 , 20.76 \ 21.26 , 21.04 , 20.76 \ 21.25 , 21.04 , 20.77 \ 21.24 , 21.04 , 20.77 \ 21.24 , 21.04 , 20.78 \ 21.23 , 21.04 , 20.78 \ 21.23 , 21.03 , 20.79 \ 21.22 , 21.03 , 20.79 \ 21.22 , 21.03 , 20.79 \ 21.21 , 21.03 , 20.80 \ 21.21 , 21.03 , 20.80 \ 21.20 , 21.03 , 20.80 \ 21.20 , 21.03 , 20.80 \ 21.19 , 21.03 , 20.81 \ 21.19 , 21.03 , 20.81 \ 21.18 , 21.03 , 20.81 \ 21.18 , 21.02 , 20.81 \ 21.17 , 21.02 , 20.82 \ 21.17 , 21.02 , 20.82 \ 21.16 , 21.02 , 20.82 \ 21.16 , 21.02 , 20.82 \ 21.15 , 21.02 , 20.82 \ 21.15 , 21.02 , 20.82 \ 21.15 , 21.02 , 20.83 \ 21.14 , 21.01 , 20.83 \ 21.14 , 21.01 , 20.83 \ 21.13 , 21.01 , 20.83 \ 21.13 , 21.01 , 20.83 \ 21.12 , 21.01 , 20.84 \ 21.12 , 21.01 , 20.84 \ 21.11 , 21.01 , 20.84 \ 21.11 , 21.01 , 20.84 \ 21.10 , 21.00 , 20.84 \ 21.10 , 21.00 , 20.84 \ 21.09 , 21.00 , 20.85 \ 21.09 , 21.00 , 20.85 \ 21.08 , 21.00 , 20.85 \ 21.08 , 21.00 , 20.85 \ 21.07 , 21.00 , 20.85 \ 21.07 , 20.99 , 20.86 \ 21.06 , 20.99 , 20.86 \ 21.06 , 20.99 , 20.86 \" +ivbias5 = strtoreal(colshape(colshape(tokens(s_ivbias5), 2)[.,1], 3)) + +s_ivbias10 = +". , . , . \ . , . , . \ 9.08 , . , . \ 10.27 , 7.56 , . \ 10.83 , 8.78 , 6.61 \ 11.12 , 9.48 , 7.77 \ 11.29 , 9.92 , 8.5 \ 11.39 , 10.22 , 9.01 \ 11.46 , 10.43 , 9.37 \ 11.49 , 10.58 , 9.64 \ 11.51 , 10.69 , 9.85 \ 11.52 , 10.78 , 10.01 \ 11.52 , 10.84 , 10.14 \ 11.52 , 10.89 , 10.25 \ 11.51 , 10.93 , 10.33 \ 11.5 , 10.96 , 10.41 \ 11.49 , 10.99 , 10.47 \ 11.48 , 11 , 10.52 \ 11.46 , 11.02 , 10.56 \ 11.45 , 11.03 , 10.6 \ 11.44 , 11.04 , 10.63 \ 11.42 , 11.05 , 10.65 \ 11.41 , 11.05 , 10.68 \ 11.4 , 11.05 , 10.7 \ 11.38 , 11.06 , 10.71 \ 11.37 , 11.06 , 10.73 \ 11.36 , 11.06 , 10.74 \ 11.34 , 11.05 , 10.75 \ 11.33 , 11.05 , 10.76 \ 11.32 , 11.05 , 10.77 \ 11.3 , 11.05 , 10.78 \ 11.29 , 11.05 , 10.79 \ 11.28 , 11.04 , 10.79 \ 11.27 , 11.04 , 10.8 \ 11.26 , 11.04 , 10.8 \ 11.25 , 11.03 , 10.8 \ 11.24 , 11.03 , 10.81 \ 11.23 , 11.02 , 10.81 \ 11.22 , 11.02 , 10.81 \ 11.21 , 11.02 , 10.81 \ 11.2 , 11.01 , 10.81 \ 11.19 , 11.01 , 10.81 \ 11.18 , 11 , 10.81 \ 11.17 , 11 , 10.81 \ 11.16 , 10.99 , 10.81 \ 11.15 , 10.99 , 10.81 \ 11.14 , 10.98 , 10.81 \ 11.13 , 10.98 , 10.81 \ 11.13 , 10.98 , 10.81 \ 11.12 , 10.97 , 10.81 \ 11.11 , 10.97 , 10.81 \ 11.1 , 10.96 , 10.81 \ 11.1 , 10.96 , 10.81 \ 11.09 , 10.95 , 10.81 \ 11.08 , 10.95 , 10.81 \ 11.07 , 10.94 , 10.8 \ 11.07 , 10.94 , 10.8 \ 11.06 , 10.94 , 10.8 \ 11.05 , 10.93 , 10.8 \ 11.05 , 10.93 , 10.8 \ 11.04 , 10.92 , 10.8 \ 11.03 , 10.92 , 10.79 \ 11.03 , 10.92 , 10.79 \ 11.02 , 10.91 , 10.79 \ 11.02 , 10.91 , 10.79 \ 11.01 , 10.9 , 10.79 \ 11 , 10.9 , 10.79 \ 11 , 10.9 , 10.78 \ 10.99 , 10.89 , 10.78 \ 10.99 , 10.89 , 10.78 \ 10.98 , 10.89 , 10.78 \ 10.98 , 10.88 , 10.78 \ 10.97 , 10.88 , 10.77 \ 10.97 , 10.88 , 10.77 \ 10.96 , 10.87 , 10.77 \ 10.96 , 10.87 , 10.77 \ 10.95 , 10.86 , 10.77 \ 10.95 , 10.86 , 10.76 \ 10.94 , 10.86 , 10.76 \ 10.94 , 10.85 , 10.76 \ 10.93 , 10.85 , 10.76 \ 10.93 , 10.85 , 10.76 \ 10.92 , 10.84 , 10.75 \ 10.92 , 10.84 , 10.75 \ 10.91 , 10.84 , 10.75 \ 10.91 , 10.84 , 10.75 \ 10.91 , 10.83 , 10.75 \ 10.9 , 10.83 , 10.74 \ 10.9 , 10.83 , 10.74 \ 10.89 , 10.82 , 10.74 \ 10.89 , 10.82 , 10.74 \ 10.89 , 10.82 , 10.74 \ 10.88 , 10.81 , 10.74 \ 10.88 , 10.81 , 10.73 \ 10.87 , 10.81 , 10.73 \ 10.87 , 10.81 , 10.73 \ 10.87 , 10.8 , 10.73 \ 10.86 , 10.8 , 10.73 \ 10.86 , 10.8 , 10.72 \ 10.86 , 10.8 , 10.72 \" +ivbias10 = strtoreal(colshape(colshape(tokens(s_ivbias10), 2)[.,1], 3)) + +s_ivbias20 = +" . , . , . \ . , . , . \ 6.46 , . , . \ 6.71 , 5.57 , . \ 6.77 , 5.91 , 4.99 \ 6.76 , 6.08 , 5.35 \ 6.73 , 6.16 , 5.56 \ 6.69 , 6.20 , 5.69 \ 6.65 , 6.22 , 5.78 \ 6.61 , 6.23 , 5.83 \ 6.56 , 6.23 , 5.87 \ 6.53 , 6.22 , 5.90 \ 6.49 , 6.21 , 5.92 \ 6.45 , 6.20 , 5.93 \ 6.42 , 6.19 , 5.94 \ 6.39 , 6.17 , 5.94 \ 6.36 , 6.16 , 5.94 \ 6.33 , 6.14 , 5.94 \ 6.31 , 6.13 , 5.94 \ 6.28 , 6.11 , 5.93 \ 6.26 , 6.10 , 5.93 \ 6.24 , 6.08 , 5.92 \ 6.22 , 6.07 , 5.92 \ 6.20 , 6.06 , 5.91 \ 6.18 , 6.05 , 5.90 \ 6.16 , 6.03 , 5.90 \ 6.14 , 6.02 , 5.89 \ 6.13 , 6.01 , 5.88 \ 6.11 , 6.00 , 5.88 \ 6.09 , 5.99 , 5.87 \ 6.08 , 5.98 , 5.87 \ 6.07 , 5.97 , 5.86 \ 6.05 , 5.96 , 5.85 \ 6.04 , 5.95 , 5.85 \ 6.03 , 5.94 , 5.84 \ 6.01 , 5.93 , 5.83 \ 6.00 , 5.92 , 5.83 \ 5.99 , 5.91 , 5.82 \ 5.98 , 5.90 , 5.82 \ 5.97 , 5.89 , 5.81 \ 5.96 , 5.89 , 5.80 \ 5.95 , 5.88 , 5.80 \ 5.94 , 5.87 , 5.79 \ 5.93 , 5.86 , 5.79 \ 5.92 , 5.86 , 5.78 \ 5.91 , 5.85 , 5.78 \ 5.91 , 5.84 , 5.77 \ 5.90 , 5.83 , 5.77 \ 5.89 , 5.83 , 5.76 \ 5.88 , 5.82 , 5.76 \ 5.87 , 5.82 , 5.75 \ 5.87 , 5.81 , 5.75 \ 5.86 , 5.80 , 5.74 \ 5.85 , 5.80 , 5.74 \ 5.85 , 5.79 , 5.73 \ 5.84 , 5.79 , 5.73 \ 5.83 , 5.78 , 5.72 \ 5.83 , 5.78 , 5.72 \ 5.82 , 5.77 , 5.72 \ 5.81 , 5.77 , 5.71 \ 5.81 , 5.76 , 5.71 \ 5.80 , 5.76 , 5.70 \ 5.80 , 5.75 , 5.70 \ 5.79 , 5.75 , 5.70 \ 5.78 , 5.74 , 5.69 \ 5.78 , 5.74 , 5.69 \ 5.77 , 5.73 , 5.68 \ 5.77 , 5.73 , 5.68 \ 5.76 , 5.72 , 5.68 \ 5.76 , 5.72 , 5.67 \ 5.75 , 5.72 , 5.67 \ 5.75 , 5.71 , 5.67 \ 5.75 , 5.71 , 5.66 \ 5.74 , 5.70 , 5.66 \ 5.74 , 5.70 , 5.66 \ 5.73 , 5.70 , 5.65 \ 5.73 , 5.69 , 5.65 \ 5.72 , 5.69 , 5.65 \ 5.72 , 5.68 , 5.65 \ 5.71 , 5.68 , 5.64 \ 5.71 , 5.68 , 5.64 \ 5.71 , 5.67 , 5.64 \ 5.70 , 5.67 , 5.63 \ 5.70 , 5.67 , 5.63 \ 5.70 , 5.66 , 5.63 \ 5.69 , 5.66 , 5.62 \ 5.69 , 5.66 , 5.62 \ 5.68 , 5.65 , 5.62 \ 5.68 , 5.65 , 5.62 \ 5.68 , 5.65 , 5.61 \ 5.67 , 5.65 , 5.61 \ 5.67 , 5.64 , 5.61 \ 5.67 , 5.64 , 5.61 \ 5.66 , 5.64 , 5.60 \ 5.66 , 5.63 , 5.60 \ 5.66 , 5.63 , 5.60 \ 5.65 , 5.63 , 5.60 \ 5.65 , 5.63 , 5.59 \ 5.65 , 5.62 , 5.59 \ 5.65 , 5.62 , 5.59 \" +ivbias20 = strtoreal(colshape(colshape(tokens(s_ivbias20), 2)[.,1], 3)) + +s_ivbias30 = +" . , . , . \ . , . , . \ 5.39 , . , . \ 5.34 , 4.73 , . \ 5.25 , 4.79 , 4.30 \ 5.15 , 4.78 , 4.40 \ 5.07 , 4.76 , 4.44 \ 4.99 , 4.73 , 4.46 \ 4.92 , 4.69 , 4.46 \ 4.86 , 4.66 , 4.45 \ 4.80 , 4.62 , 4.44 \ 4.75 , 4.59 , 4.42 \ 4.71 , 4.56 , 4.41 \ 4.67 , 4.53 , 4.39 \ 4.63 , 4.50 , 4.37 \ 4.59 , 4.48 , 4.36 \ 4.56 , 4.45 , 4.34 \ 4.53 , 4.43 , 4.32 \ 4.51 , 4.41 , 4.31 \ 4.48 , 4.39 , 4.29 \ 4.46 , 4.37 , 4.28 \ 4.43 , 4.35 , 4.27 \ 4.41 , 4.33 , 4.25 \ 4.39 , 4.32 , 4.24 \ 4.37 , 4.30 , 4.23 \ 4.35 , 4.29 , 4.21 \ 4.34 , 4.27 , 4.20 \ 4.32 , 4.26 , 4.19 \ 4.31 , 4.24 , 4.18 \ 4.29 , 4.23 , 4.17 \ 4.28 , 4.22 , 4.16 \ 4.26 , 4.21 , 4.15 \ 4.25 , 4.20 , 4.14 \ 4.24 , 4.19 , 4.13 \ 4.23 , 4.18 , 4.13 \ 4.22 , 4.17 , 4.12 \ 4.20 , 4.16 , 4.11 \ 4.19 , 4.15 , 4.10 \ 4.18 , 4.14 , 4.09 \ 4.17 , 4.13 , 4.09 \ 4.16 , 4.12 , 4.08 \ 4.15 , 4.11 , 4.07 \ 4.15 , 4.11 , 4.07 \ 4.14 , 4.10 , 4.06 \ 4.13 , 4.09 , 4.05 \ 4.12 , 4.08 , 4.05 \ 4.11 , 4.08 , 4.04 \ 4.11 , 4.07 , 4.03 \ 4.10 , 4.06 , 4.03 \ 4.09 , 4.06 , 4.02 \ 4.08 , 4.05 , 4.02 \ 4.08 , 4.05 , 4.01 \ 4.07 , 4.04 , 4.01 \ 4.06 , 4.03 , 4.00 \ 4.06 , 4.03 , 4.00 \ 4.05 , 4.02 , 3.99 \ 4.05 , 4.02 , 3.99 \ 4.04 , 4.01 , 3.98 \ 4.04 , 4.01 , 3.98 \ 4.03 , 4.00 , 3.97 \ 4.02 , 4.00 , 3.97 \ 4.02 , 3.99 , 3.96 \ 4.01 , 3.99 , 3.96 \ 4.01 , 3.98 , 3.96 \ 4.00 , 3.98 , 3.95 \ 4.00 , 3.97 , 3.95 \ 3.99 , 3.97 , 3.94 \ 3.99 , 3.97 , 3.94 \ 3.99 , 3.96 , 3.94 \ 3.98 , 3.96 , 3.93 \ 3.98 , 3.95 , 3.93 \ 3.97 , 3.95 , 3.93 \ 3.97 , 3.95 , 3.92 \ 3.96 , 3.94 , 3.92 \ 3.96 , 3.94 , 3.92 \ 3.96 , 3.93 , 3.91 \ 3.95 , 3.93 , 3.91 \ 3.95 , 3.93 , 3.91 \ 3.95 , 3.92 , 3.90 \ 3.94 , 3.92 , 3.90 \ 3.94 , 3.92 , 3.90 \ 3.93 , 3.91 , 3.89 \ 3.93 , 3.91 , 3.89 \ 3.93 , 3.91 , 3.89 \ 3.92 , 3.91 , 3.89 \ 3.92 , 3.90 , 3.88 \ 3.92 , 3.90 , 3.88 \ 3.91 , 3.90 , 3.88 \ 3.91 , 3.89 , 3.87 \ 3.91 , 3.89 , 3.87 \ 3.91 , 3.89 , 3.87 \ 3.90 , 3.89 , 3.87 \ 3.90 , 3.88 , 3.86 \ 3.90 , 3.88 , 3.86 \ 3.89 , 3.88 , 3.86 \ 3.89 , 3.87 , 3.86 \ 3.89 , 3.87 , 3.85 \ 3.89 , 3.87 , 3.85 \ 3.88 , 3.87 , 3.85 \ 3.88 , 3.86 , 3.85 \" +ivbias30 = strtoreal(colshape(colshape(tokens(s_ivbias30), 2)[.,1], 3)) + + +s_ivsize10 = +"16.38 , . \ 19.93 , 7.03 \ 22.3 , 13.43 \ 24.58 , 16.87 \ 26.87 , 19.45 \ 29.18 , 21.68 \ 31.5 , 23.72 \ 33.84 , 25.64 \ 36.19 , 27.51 \ 38.54 , 29.32 \ 40.9 , 31.11 \ 43.27 , 32.88 \ 45.64 , 34.62 \ 48.01 , 36.36 \ 50.39 , 38.08 \ 52.77 , 39.8 \ 55.15 , 41.51 \ 57.53 , 43.22 \ 59.92 , 44.92 \ 62.3 , 46.62 \ 64.69 , 48.31 \ 67.07 , 50.01 \ 69.46 , 51.7 \ 71.85 , 53.39 \ 74.24 , 55.07 \ 76.62 , 56.76 \ 79.01 , 58.45 \ 81.4 , 60.13 \ 83.79 , 61.82 \ 86.17 , 63.51 \ 88.56 , 65.19 \ 90.95 , 66.88 \ 93.33 , 68.56 \ 95.72 , 70.25 \ 98.11 , 71.94 \ 100.5 , 73.62 \ 102.88 , 75.31 \ 105.27 , 76.99 \ 107.66 , 78.68 \ 110.04 , 80.37 \ 112.43 , 82.05 \ 114.82 , 83.74 \ 117.21 , 85.42 \ 119.59 , 87.11 \ 121.98 , 88.8 \ 124.37 , 90.48 \ 126.75 , 92.17 \ 129.14 , 93.85 \ 131.53 , 95.54 \ 133.92 , 97.23 \ 136.3 , 98.91 \ 138.69 , 100.6 \ 141.08 , 102.29 \ 143.47 , 103.97 \ 145.85 , 105.66 \ 148.24 , 107.34 \ 150.63 , 109.03 \ 153.01 , 110.72 \ 155.4 , 112.4 \ 157.79 , 114.09 \ 160.18 , 115.77 \ 162.56 , 117.46 \ 164.95 , 119.15 \ 167.34 , 120.83 \ 169.72 , 122.52 \ 172.11 , 124.2 \ 174.5 , 125.89 \ 176.89 , 127.58 \ 179.27 , 129.26 \ 181.66 , 130.95 \ 184.05 , 132.63 \ 186.44 , 134.32 \ 188.82 , 136.01 \ 191.21 , 137.69 \ 193.6 , 139.38 \ 195.98 , 141.07 \ 198.37 , 142.75 \ 200.76 , 144.44 \ 203.15 , 146.12 \ 205.53 , 147.81 \ 207.92 , 149.5 \ 210.31 , 151.18 \ 212.69 , 152.87 \ 215.08 , 154.55 \ 217.47 , 156.24 \ 219.86 , 157.93 \ 222.24 , 159.61 \ 224.63 , 161.3 \ 227.02 , 162.98 \ 229.41 , 164.67 \ 231.79 , 166.36 \ 234.18 , 168.04 \ 236.57 , 169.73 \ 238.95 , 171.41 \ 241.34 , 173.1 \ 243.73 , 174.79 \ 246.12 , 176.47 \ 248.5 , 178.16 \ 250.89 , 179.84 \ 253.28 , 181.53 \" +ivsize10 = strtoreal(colshape(colshape(tokens(s_ivsize10), 2)[.,1], 2)) + +s_ivsize15 = + "8.96 , . \ 11.59 , 4.58 \ 12.83 , 8.18 \ 13.96 , 9.93 \ 15.09 , 11.22 \ 16.23 , 12.33 \ 17.38 , 13.34 \ 18.54 , 14.31 \ 19.71 , 15.24 \ 20.88 , 16.16 \ 22.06 , 17.06 \ 23.24 , 17.95 \ 24.42 , 18.84 \ 25.61 , 19.72 \ 26.80 , 20.60 \ 27.99 , 21.48 \ 29.19 , 22.35 \ 30.38 , 23.22 \ 31.58 , 24.09 \ 32.77 , 24.96 \ 33.97 , 25.82 \ 35.17 , 26.69 \ 36.37 , 27.56 \ 37.57 , 28.42 \ 38.77 , 29.29 \ 39.97 , 30.15 \ 41.17 , 31.02 \ 42.37 , 31.88 \ 43.57 , 32.74 \ 44.78 , 33.61 \ 45.98 , 34.47 \ 47.18 , 35.33 \ 48.38 , 36.19 \ 49.59 , 37.06 \ 50.79 , 37.92 \ 51.99 , 38.78 \ 53.19 , 39.64 \ 54.40 , 40.50 \ 55.60 , 41.37 \ 56.80 , 42.23 \ 58.01 , 43.09 \ 59.21 , 43.95 \ 60.41 , 44.81 \ 61.61 , 45.68 \ 62.82 , 46.54 \ 64.02 , 47.40 \ 65.22 , 48.26 \ 66.42 , 49.12 \ 67.63 , 49.99 \ 68.83 , 50.85 \ 70.03 , 51.71 \ 71.24 , 52.57 \ 72.44 , 53.43 \ 73.64 , 54.30 \ 74.84 , 55.16 \ 76.05 , 56.02 \ 77.25 , 56.88 \ 78.45 , 57.74 \ 79.66 , 58.61 \ 80.86 , 59.47 \ 82.06 , 60.33 \ 83.26 , 61.19 \ 84.47 , 62.05 \ 85.67 , 62.92 \ 86.87 , 63.78 \ 88.07 , 64.64 \ 89.28 , 65.50 \ 90.48 , 66.36 \ 91.68 , 67.22 \ 92.89 , 68.09 \ 94.09 , 68.95 \ 95.29 , 69.81 \ 96.49 , 70.67 \ 97.70 , 71.53 \ 98.90 , 72.40 \ 100.10 , 73.26 \ 101.30 , 74.12 \ 102.51 , 74.98 \ 103.71 , 75.84 \ 104.91 , 76.71 \ 106.12 , 77.57 \ 107.32 , 78.43 \ 108.52 , 79.29 \ 109.72 , 80.15 \ 110.93 , 81.02 \ 112.13 , 81.88 \ 113.33 , 82.74 \ 114.53 , 83.60 \ 115.74 , 84.46 \ 116.94 , 85.33 \ 118.14 , 86.19 \ 119.35 , 87.05 \ 120.55 , 87.91 \ 121.75 , 88.77 \ 122.95 , 89.64 \ 124.16 , 90.50 \ 125.36 , 91.36 \ 126.56 , 92.22 \ 127.76 , 93.08 \ 128.97 , 93.95 \" +ivsize15 = strtoreal(colshape(colshape(tokens(s_ivsize15), 2)[.,1], 2)) + +s_ivsize20 = + " 6.66 , . \ 8.75 , 3.95 \ 9.54 , 6.40 \ 10.26 , 7.54 \ 10.98 , 8.38 \ 11.72 , 9.10 \ 12.48 , 9.77 \ 13.24 , 10.41 \ 14.01 , 11.03 \ 14.78 , 11.65 \ 15.56 , 12.25 \ 16.35 , 12.86 \ 17.14 , 13.45 \ 17.93 , 14.05 \ 18.72 , 14.65 \ 19.51 , 15.24 \ 20.31 , 15.83 \ 21.10 , 16.42 \ 21.90 , 17.02 \ 22.70 , 17.61 \ 23.50 , 18.20 \ 24.30 , 18.79 \ 25.10 , 19.38 \ 25.90 , 19.97 \ 26.71 , 20.56 \ 27.51 , 21.15 \ 28.31 , 21.74 \ 29.12 , 22.33 \ 29.92 , 22.92 \ 30.72 , 23.51 \ 31.53 , 24.10 \ 32.33 , 24.69 \ 33.14 , 25.28 \ 33.94 , 25.87 \ 34.75 , 26.46 \ 35.55 , 27.05 \ 36.36 , 27.64 \ 37.17 , 28.23 \ 37.97 , 28.82 \ 38.78 , 29.41 \ 39.58 , 30.00 \ 40.39 , 30.59 \ 41.20 , 31.18 \ 42.00 , 31.77 \ 42.81 , 32.36 \ 43.62 , 32.95 \ 44.42 , 33.54 \ 45.23 , 34.13 \ 46.03 , 34.72 \ 46.84 , 35.31 \ 47.65 , 35.90 \ 48.45 , 36.49 \ 49.26 , 37.08 \ 50.06 , 37.67 \ 50.87 , 38.26 \ 51.68 , 38.85 \ 52.48 , 39.44 \ 53.29 , 40.02 \ 54.09 , 40.61 \ 54.90 , 41.20 \ 55.71 , 41.79 \ 56.51 , 42.38 \ 57.32 , 42.97 \ 58.13 , 43.56 \ 58.93 , 44.15 \ 59.74 , 44.74 \ 60.54 , 45.33 \ 61.35 , 45.92 \ 62.16 , 46.51 \ 62.96 , 47.10 \ 63.77 , 47.69 \ 64.57 , 48.28 \ 65.38 , 48.87 \ 66.19 , 49.46 \ 66.99 , 50.05 \ 67.80 , 50.64 \ 68.60 , 51.23 \ 69.41 , 51.82 \ 70.22 , 52.41 \ 71.02 , 53.00 \ 71.83 , 53.59 \ 72.64 , 54.18 \ 73.44 , 54.77 \ 74.25 , 55.36 \ 75.05 , 55.95 \ 75.86 , 56.54 \ 76.67 , 57.13 \ 77.47 , 57.72 \ 78.28 , 58.31 \ 79.08 , 58.90 \ 79.89 , 59.49 \ 80.70 , 60.08 \ 81.50 , 60.67 \ 82.31 , 61.26 \ 83.12 , 61.85 \ 83.92 , 62.44 \ 84.73 , 63.03 \ 85.53 , 63.62 \ 86.34 , 64.21 \ 87.15 , 64.80 \" +ivsize20 = strtoreal(colshape(colshape(tokens(s_ivsize20), 2)[.,1], 2)) + +s_ivsize25 = + " 5.53 , . \ 7.25 , 3.63 \ 7.80 , 5.45 \ 8.31 , 6.28 \ 8.84 , 6.89 \ 9.38 , 7.42 \ 9.93 , 7.91 \ 10.50 , 8.39 \ 11.07 , 8.85 \ 11.65 , 9.31 \ 12.23 , 9.77 \ 12.82 , 10.22 \ 13.41 , 10.68 \ 14.00 , 11.13 \ 14.60 , 11.58 \ 15.19 , 12.03 \ 15.79 , 12.49 \ 16.39 , 12.94 \ 16.99 , 13.39 \ 17.60 , 13.84 \ 18.20 , 14.29 \ 18.80 , 14.74 \ 19.41 , 15.19 \ 20.01 , 15.64 \ 20.61 , 16.10 \ 21.22 , 16.55 \ 21.83 , 17.00 \ 22.43 , 17.45 \ 23.04 , 17.90 \ 23.65 , 18.35 \ 24.25 , 18.81 \ 24.86 , 19.26 \ 25.47 , 19.71 \ 26.08 , 20.16 \ 26.68 , 20.61 \ 27.29 , 21.06 \ 27.90 , 21.52 \ 28.51 , 21.97 \ 29.12 , 22.42 \ 29.73 , 22.87 \ 30.33 , 23.32 \ 30.94 , 23.78 \ 31.55 , 24.23 \ 32.16 , 24.68 \ 32.77 , 25.13 \ 33.38 , 25.58 \ 33.99 , 26.04 \ 34.60 , 26.49 \ 35.21 , 26.94 \ 35.82 , 27.39 \ 36.43 , 27.85 \ 37.04 , 28.30 \ 37.65 , 28.75 \ 38.25 , 29.20 \ 38.86 , 29.66 \ 39.47 , 30.11 \ 40.08 , 30.56 \ 40.69 , 31.01 \ 41.30 , 31.47 \ 41.91 , 31.92 \ 42.52 , 32.37 \ 43.13 , 32.82 \ 43.74 , 33.27 \ 44.35 , 33.73 \ 44.96 , 34.18 \ 45.57 , 34.63 \ 46.18 , 35.08 \ 46.78 , 35.54 \ 47.39 , 35.99 \ 48.00 , 36.44 \ 48.61 , 36.89 \ 49.22 , 37.35 \ 49.83 , 37.80 \ 50.44 , 38.25 \ 51.05 , 38.70 \ 51.66 , 39.16 \ 52.27 , 39.61 \ 52.88 , 40.06 \ 53.49 , 40.51 \ 54.10 , 40.96 \ 54.71 , 41.42 \ 55.32 , 41.87 \ 55.92 , 42.32 \ 56.53 , 42.77 \ 57.14 , 43.23 \ 57.75 , 43.68 \ 58.36 , 44.13 \ 58.97 , 44.58 \ 59.58 , 45.04 \ 60.19 , 45.49 \ 60.80 , 45.94 \ 61.41 , 46.39 \ 62.02 , 46.85 \ 62.63 , 47.30 \ 63.24 , 47.75 \ 63.85 , 48.20 \ 64.45 , 48.65 \ 65.06 , 49.11 \ 65.67 , 49.56 \ 66.28 , 50.01 \" +ivsize25 = strtoreal(colshape(colshape(tokens(s_ivsize25), 2)[.,1], 2)) + + +s_fullrel5 = +" 24.09 , . \ 13.46 , 15.50 \ 9.61 , 10.83 \ 7.63 , 8.53 \ 6.42 , 7.16 \ 5.61 , 6.24 \ 5.02 , 5.59 \ 4.58 , 5.10 \ 4.23 , 4.71 \ 3.96 , 4.41 \ 3.73 , 4.15 \ 3.54 , 3.94 \ 3.38 , 3.76 \ 3.24 , 3.60 \ 3.12 , 3.47 \ 3.01 , 3.35 \ 2.92 , 3.24 \ 2.84 , 3.15 \ 2.76 , 3.06 \ 2.69 , 2.98 \ 2.63 , 2.91 \ 2.58 , 2.85 \ 2.52 , 2.79 \ 2.48 , 2.73 \ 2.43 , 2.68 \ 2.39 , 2.63 \ 2.36 , 2.59 \ 2.32 , 2.55 \ 2.29 , 2.51 \ 2.26 , 2.47 \ 2.23 , 2.44 \ 2.20 , 2.41 \ 2.18 , 2.37 \ 2.16 , 2.35 \ 2.13 , 2.32 \ 2.11 , 2.29 \ 2.09 , 2.27 \ 2.07 , 2.24 \ 2.05 , 2.22 \ 2.04 , 2.20 \ 2.02 , 2.18 \ 2.00 , 2.16 \ 1.99 , 2.14 \ 1.97 , 2.12 \ 1.96 , 2.10 \ 1.94 , 2.09 \ 1.93 , 2.07 \ 1.92 , 2.05 \ 1.91 , 2.04 \ 1.89 , 2.02 \ 1.88 , 2.01 \ 1.87 , 2.00 \ 1.86 , 1.98 \ 1.85 , 1.97 \ 1.84 , 1.96 \ 1.83 , 1.95 \ 1.82 , 1.94 \ 1.81 , 1.92 \ 1.80 , 1.91 \ 1.79 , 1.90 \ 1.79 , 1.89 \ 1.78 , 1.88 \ 1.77 , 1.87 \ 1.76 , 1.87 \ 1.75 , 1.86 \ 1.75 , 1.85 \ 1.74 , 1.84 \ 1.73 , 1.83 \ 1.72 , 1.83 \ 1.72 , 1.82 \ 1.71 , 1.81 \ 1.70 , 1.80 \ 1.70 , 1.80 \ 1.69 , 1.79 \ 1.68 , 1.79 \ 1.68 , 1.78 \ 1.67 , 1.77 \ 1.67 , 1.77 \ 1.66 , 1.76 \ 1.65 , 1.76 \ 1.65 , 1.75 \ 1.64 , 1.75 \ 1.64 , 1.74 \ 1.63 , 1.74 \ 1.63 , 1.73 \ 1.62 , 1.73 \ 1.61 , 1.73 \ 1.61 , 1.72 \ 1.60 , 1.72 \ 1.60 , 1.71 \ 1.59 , 1.71 \ 1.59 , 1.71 \ 1.58 , 1.71 \ 1.58 , 1.70 \ 1.57 , 1.70 \ 1.57 , 1.70 \ 1.56 , 1.69 \ 1.56 , 1.69 \ 1.55 , 1.69 \ 1.55 , 1.69 )" +fullrel5 = strtoreal(colshape(colshape(tokens(s_fullrel5), 2)[.,1], 2)) + +s_fullrel10 = + " 19.36 , . \ 10.89 , 12.55 \ 7.90 , 8.96 \ 6.37 , 7.15 \ 5.44 , 6.07 \ 4.81 , 5.34 \ 4.35 , 4.82 \ 4.01 , 4.43 \ 3.74 , 4.12 \ 3.52 , 3.87 \ 3.34 , 3.67 \ 3.19 , 3.49 \ 3.06 , 3.35 \ 2.95 , 3.22 \ 2.85 , 3.11 \ 2.76 , 3.01 \ 2.69 , 2.92 \ 2.62 , 2.84 \ 2.56 , 2.77 \ 2.50 , 2.71 \ 2.45 , 2.65 \ 2.40 , 2.60 \ 2.36 , 2.55 \ 2.32 , 2.50 \ 2.28 , 2.46 \ 2.24 , 2.42 \ 2.21 , 2.38 \ 2.18 , 2.35 \ 2.15 , 2.31 \ 2.12 , 2.28 \ 2.10 , 2.25 \ 2.07 , 2.23 \ 2.05 , 2.20 \ 2.03 , 2.17 \ 2.01 , 2.15 \ 1.99 , 2.13 \ 1.97 , 2.11 \ 1.95 , 2.09 \ 1.93 , 2.07 \ 1.92 , 2.05 \ 1.90 , 2.03 \ 1.88 , 2.01 \ 1.87 , 2.00 \ 1.86 , 1.98 \ 1.84 , 1.96 \ 1.83 , 1.95 \ 1.82 , 1.93 \ 1.81 , 1.92 \ 1.79 , 1.91 \ 1.78 , 1.89 \ 1.77 , 1.88 \ 1.76 , 1.87 \ 1.75 , 1.86 \ 1.74 , 1.85 \ 1.73 , 1.84 \ 1.72 , 1.83 \ 1.71 , 1.82 \ 1.70 , 1.81 \ 1.70 , 1.80 \ 1.69 , 1.79 \ 1.68 , 1.78 \ 1.67 , 1.77 \ 1.67 , 1.76 \ 1.66 , 1.75 \ 1.65 , 1.75 \ 1.64 , 1.74 \ 1.64 , 1.73 \ 1.63 , 1.72 \ 1.63 , 1.72 \ 1.62 , 1.71 \ 1.61 , 1.70 \ 1.61 , 1.70 \ 1.60 , 1.69 \ 1.60 , 1.68 \ 1.59 , 1.68 \ 1.59 , 1.67 \ 1.58 , 1.67 \ 1.58 , 1.66 \ 1.57 , 1.66 \ 1.57 , 1.65 \ 1.56 , 1.65 \ 1.56 , 1.64 \ 1.56 , 1.64 \ 1.55 , 1.63 \ 1.55 , 1.63 \ 1.54 , 1.62 \ 1.54 , 1.62 \ 1.54 , 1.62 \ 1.53 , 1.61 \ 1.53 , 1.61 \ 1.53 , 1.61 \ 1.52 , 1.60 \ 1.52 , 1.60 \ 1.52 , 1.60 \ 1.52 , 1.59 \ 1.51 , 1.59 \ 1.51 , 1.59 \ 1.51 , 1.59 \ 1.51 , 1.58 \ 1.50 , 1.58 )" +fullrel10 = strtoreal(colshape(colshape(tokens(s_fullrel10), 2)[.,1], 2)) + +s_fullrel20 = +" 15.64 , . \ 9.00 , 9.72 \ 6.61 , 7.18 \ 5.38 , 5.85 \ 4.62 , 5.04 \ 4.11 , 4.48 \ 3.75 , 4.08 \ 3.47 , 3.77 \ 3.25 , 3.53 \ 3.07 , 3.33 \ 2.92 , 3.17 \ 2.80 , 3.04 \ 2.70 , 2.92 \ 2.61 , 2.82 \ 2.53 , 2.73 \ 2.46 , 2.65 \ 2.39 , 2.58 \ 2.34 , 2.52 \ 2.29 , 2.46 \ 2.24 , 2.41 \ 2.20 , 2.36 \ 2.16 , 2.32 \ 2.13 , 2.28 \ 2.10 , 2.24 \ 2.06 , 2.21 \ 2.04 , 2.18 \ 2.01 , 2.15 \ 1.99 , 2.12 \ 1.96 , 2.09 \ 1.94 , 2.07 \ 1.92 , 2.04 \ 1.90 , 2.02 \ 1.88 , 2.00 \ 1.87 , 1.98 \ 1.85 , 1.96 \ 1.83 , 1.94 \ 1.82 , 1.93 \ 1.80 , 1.91 \ 1.79 , 1.89 \ 1.78 , 1.88 \ 1.76 , 1.86 \ 1.75 , 1.85 \ 1.74 , 1.84 \ 1.73 , 1.82 \ 1.72 , 1.81 \ 1.71 , 1.80 \ 1.70 , 1.79 \ 1.69 , 1.78 \ 1.68 , 1.77 \ 1.67 , 1.76 \ 1.66 , 1.75 \ 1.65 , 1.74 \ 1.65 , 1.73 \ 1.64 , 1.72 \ 1.63 , 1.71 \ 1.62 , 1.70 \ 1.62 , 1.69 \ 1.61 , 1.68 \ 1.60 , 1.68 \ 1.60 , 1.67 \ 1.59 , 1.66 \ 1.58 , 1.65 \ 1.58 , 1.65 \ 1.57 , 1.64 \ 1.57 , 1.63 \ 1.56 , 1.63 \ 1.56 , 1.62 \ 1.55 , 1.62 \ 1.55 , 1.61 \ 1.54 , 1.60 \ 1.54 , 1.60 \ 1.53 , 1.59 \ 1.53 , 1.59 \ 1.52 , 1.58 \ 1.52 , 1.58 \ 1.51 , 1.57 \ 1.51 , 1.57 \ 1.51 , 1.56 \ 1.50 , 1.56 \ 1.50 , 1.56 \ 1.49 , 1.55 \ 1.49 , 1.55 \ 1.49 , 1.54 \ 1.48 , 1.54 \ 1.48 , 1.54 \ 1.48 , 1.53 \ 1.47 , 1.53 \ 1.47 , 1.53 \ 1.47 , 1.52 \ 1.46 , 1.52 \ 1.46 , 1.52 \ 1.46 , 1.51 \ 1.46 , 1.51 \ 1.45 , 1.51 \ 1.45 , 1.50 \ 1.45 , 1.50 \ 1.45 , 1.50 \ 1.44 , 1.50 \ 1.44 , 1.49 \ 1.44 , 1.49 )" +fullrel20 = strtoreal(colshape(colshape(tokens(s_fullrel20), 2)[.,1], 2)) + +s_fullrel30 = + " 12.71 , . \ 7.49 , 8.03 \ 5.60 , 6.15 \ 4.63 , 5.10 \ 4.03 , 4.44 \ 3.63 , 3.98 \ 3.33 , 3.65 \ 3.11 , 3.39 \ 2.93 , 3.19 \ 2.79 , 3.02 \ 2.67 , 2.88 \ 2.57 , 2.77 \ 2.48 , 2.67 \ 2.41 , 2.58 \ 2.34 , 2.51 \ 2.28 , 2.44 \ 2.23 , 2.38 \ 2.18 , 2.33 \ 2.14 , 2.28 \ 2.10 , 2.23 \ 2.07 , 2.19 \ 2.04 , 2.16 \ 2.01 , 2.12 \ 1.98 , 2.09 \ 1.95 , 2.06 \ 1.93 , 2.03 \ 1.90 , 2.01 \ 1.88 , 1.98 \ 1.86 , 1.96 \ 1.84 , 1.94 \ 1.83 , 1.92 \ 1.81 , 1.90 \ 1.79 , 1.88 \ 1.78 , 1.87 \ 1.76 , 1.85 \ 1.75 , 1.83 \ 1.74 , 1.82 \ 1.72 , 1.80 \ 1.71 , 1.79 \ 1.70 , 1.78 \ 1.69 , 1.77 \ 1.68 , 1.75 \ 1.67 , 1.74 \ 1.66 , 1.73 \ 1.65 , 1.72 \ 1.64 , 1.71 \ 1.63 , 1.70 \ 1.62 , 1.69 \ 1.61 , 1.68 \ 1.60 , 1.67 \ 1.60 , 1.66 \ 1.59 , 1.66 \ 1.58 , 1.65 \ 1.57 , 1.64 \ 1.57 , 1.63 \ 1.56 , 1.63 \ 1.55 , 1.62 \ 1.55 , 1.61 \ 1.54 , 1.61 \ 1.54 , 1.60 \ 1.53 , 1.59 \ 1.53 , 1.59 \ 1.52 , 1.58 \ 1.51 , 1.57 \ 1.51 , 1.57 \ 1.50 , 1.56 \ 1.50 , 1.56 \ 1.50 , 1.55 \ 1.49 , 1.55 \ 1.49 , 1.54 \ 1.48 , 1.54 \ 1.48 , 1.53 \ 1.47 , 1.53 \ 1.47 , 1.52 \ 1.47 , 1.52 \ 1.46 , 1.52 \ 1.46 , 1.51 \ 1.46 , 1.51 \ 1.45 , 1.50 \ 1.45 , 1.50 \ 1.45 , 1.50 \ 1.44 , 1.49 \ 1.44 , 1.49 \ 1.44 , 1.48 \ 1.43 , 1.48 \ 1.43 , 1.48 \ 1.43 , 1.47 \ 1.43 , 1.47 \ 1.42 , 1.47 \ 1.42 , 1.47 \ 1.42 , 1.46 \ 1.42 , 1.46 \ 1.41 , 1.46 \ 1.41 , 1.45 \ 1.41 , 1.45 \ 1.41 , 1.45 \ 1.41 , 1.45 \ 1.40 , 1.44 \ 1.40 , 1.44 \ 1.40 , 1.44 \" +fullrel30 = strtoreal(colshape(colshape(tokens(s_fullrel30), 2)[.,1], 2)) + + +s_fullmax5 = + " 23.81 , . \ 12.38 , 14.19 \ 8.66 , 10.00 \ 6.81 , 7.88 \ 5.71 , 6.60 \ 4.98 , 5.74 \ 4.45 , 5.13 \ 4.06 , 4.66 \ 3.76 , 4.30 \ 3.51 , 4.01 \ 3.31 , 3.77 \ 3.15 , 3.57 \ 3.00 , 3.41 \ 2.88 , 3.26 \ 2.78 , 3.13 \ 2.69 , 3.02 \ 2.61 , 2.92 \ 2.53 , 2.84 \ 2.47 , 2.76 \ 2.41 , 2.69 \ 2.36 , 2.62 \ 2.31 , 2.56 \ 2.27 , 2.51 \ 2.23 , 2.46 \ 2.19 , 2.42 \ 2.15 , 2.37 \ 2.12 , 2.33 \ 2.09 , 2.30 \ 2.07 , 2.26 \ 2.04 , 2.23 \ 2.02 , 2.20 \ 1.99 , 2.17 \ 1.97 , 2.14 \ 1.95 , 2.12 \ 1.93 , 2.10 \ 1.91 , 2.07 \ 1.90 , 2.05 \ 1.88 , 2.03 \ 1.87 , 2.01 \ 1.85 , 1.99 \ 1.84 , 1.98 \ 1.82 , 1.96 \ 1.81 , 1.94 \ 1.80 , 1.93 \ 1.79 , 1.91 \ 1.78 , 1.90 \ 1.76 , 1.88 \ 1.75 , 1.87 \ 1.74 , 1.86 \ 1.73 , 1.85 \ 1.73 , 1.83 \ 1.72 , 1.82 \ 1.71 , 1.81 \ 1.70 , 1.80 \ 1.69 , 1.79 \ 1.68 , 1.78 \ 1.68 , 1.77 \ 1.67 , 1.76 \ 1.66 , 1.75 \ 1.65 , 1.74 \ 1.65 , 1.74 \ 1.64 , 1.73 \ 1.63 , 1.72 \ 1.63 , 1.71 \ 1.62 , 1.70 \ 1.62 , 1.70 \ 1.61 , 1.69 \ 1.60 , 1.68 \ 1.60 , 1.68 \ 1.59 , 1.67 \ 1.59 , 1.66 \ 1.58 , 1.66 \ 1.58 , 1.65 \ 1.57 , 1.64 \ 1.57 , 1.64 \ 1.56 , 1.63 \ 1.56 , 1.63 \ 1.55 , 1.62 \ 1.55 , 1.62 \ 1.54 , 1.61 \ 1.54 , 1.61 \ 1.53 , 1.60 \ 1.53 , 1.60 \ 1.53 , 1.59 \ 1.52 , 1.59 \ 1.52 , 1.58 \ 1.51 , 1.58 \ 1.51 , 1.57 \ 1.50 , 1.57 \ 1.50 , 1.57 \ 1.50 , 1.56 \ 1.49 , 1.56 \ 1.49 , 1.55 \ 1.49 , 1.55 \ 1.48 , 1.55 \ 1.48 , 1.54 \ 1.47 , 1.54 \ 1.47 , 1.54 \ 1.47 , 1.53 \ 1.46 , 1.53 )" +fullmax5 = strtoreal(colshape(colshape(tokens(s_fullmax5), 2)[.,1], 2)) + +s_fullmax10 = +" 19.40 , . \ 10.14 , 11.92 \ 7.18 , 8.39 \ 5.72 , 6.64 \ 4.85 , 5.60 \ 4.27 , 4.90 \ 3.86 , 4.40 \ 3.55 , 4.03 \ 3.31 , 3.73 \ 3.12 , 3.50 \ 2.96 , 3.31 \ 2.83 , 3.15 \ 2.71 , 3.01 \ 2.62 , 2.89 \ 2.53 , 2.79 \ 2.46 , 2.70 \ 2.39 , 2.62 \ 2.33 , 2.55 \ 2.28 , 2.49 \ 2.23 , 2.43 \ 2.19 , 2.38 \ 2.15 , 2.33 \ 2.11 , 2.29 \ 2.08 , 2.25 \ 2.05 , 2.21 \ 2.02 , 2.18 \ 1.99 , 2.14 \ 1.97 , 2.11 \ 1.94 , 2.08 \ 1.92 , 2.06 \ 1.90 , 2.03 \ 1.88 , 2.01 \ 1.86 , 1.99 \ 1.85 , 1.97 \ 1.83 , 1.95 \ 1.81 , 1.93 \ 1.80 , 1.91 \ 1.79 , 1.89 \ 1.77 , 1.88 \ 1.76 , 1.86 \ 1.75 , 1.85 \ 1.74 , 1.83 \ 1.72 , 1.82 \ 1.71 , 1.81 \ 1.70 , 1.80 \ 1.69 , 1.78 \ 1.68 , 1.77 \ 1.67 , 1.76 \ 1.66 , 1.75 \ 1.66 , 1.74 \ 1.65 , 1.73 \ 1.64 , 1.72 \ 1.63 , 1.71 \ 1.62 , 1.70 \ 1.62 , 1.69 \ 1.61 , 1.69 \ 1.60 , 1.68 \ 1.60 , 1.67 \ 1.59 , 1.66 \ 1.58 , 1.65 \ 1.58 , 1.65 \ 1.57 , 1.64 \ 1.57 , 1.63 \ 1.56 , 1.63 \ 1.55 , 1.62 \ 1.55 , 1.61 \ 1.54 , 1.61 \ 1.54 , 1.60 \ 1.53 , 1.60 \ 1.53 , 1.59 \ 1.52 , 1.59 \ 1.52 , 1.58 \ 1.52 , 1.58 \ 1.51 , 1.57 \ 1.51 , 1.57 \ 1.50 , 1.56 \ 1.50 , 1.56 \ 1.49 , 1.55 \ 1.49 , 1.55 \ 1.49 , 1.54 \ 1.48 , 1.54 \ 1.48 , 1.53 \ 1.48 , 1.53 \ 1.47 , 1.53 \ 1.47 , 1.52 \ 1.46 , 1.52 \ 1.46 , 1.51 \ 1.46 , 1.51 \ 1.45 , 1.51 \ 1.45 , 1.50 \ 1.45 , 1.50 \ 1.44 , 1.50 \ 1.44 , 1.49 \ 1.44 , 1.49 \ 1.44 , 1.49 \ 1.43 , 1.48 \ 1.43 , 1.48 \ 1.43 , 1.48 \ 1.42 , 1.48 \ 1.42 , 1.47 )" +fullmax10 = strtoreal(colshape(colshape(tokens(s_fullmax10), 2)[.,1], 2)) + +s_fullmax20 = +" 15.39 , . \ 8.16 , 9.41 \ 5.87 , 6.79 \ 4.75 , 5.47 \ 4.08 , 4.66 \ 3.64 , 4.13 \ 3.32 , 3.74 \ 3.08 , 3.45 \ 2.89 , 3.22 \ 2.74 , 3.03 \ 2.62 , 2.88 \ 2.51 , 2.76 \ 2.42 , 2.65 \ 2.35 , 2.56 \ 2.28 , 2.48 \ 2.22 , 2.40 \ 2.17 , 2.34 \ 2.12 , 2.28 \ 2.08 , 2.23 \ 2.04 , 2.19 \ 2.01 , 2.15 \ 1.98 , 2.11 \ 1.95 , 2.07 \ 1.92 , 2.04 \ 1.89 , 2.01 \ 1.87 , 1.98 \ 1.85 , 1.96 \ 1.83 , 1.93 \ 1.81 , 1.91 \ 1.79 , 1.89 \ 1.77 , 1.87 \ 1.76 , 1.85 \ 1.74 , 1.83 \ 1.73 , 1.82 \ 1.72 , 1.80 \ 1.70 , 1.79 \ 1.69 , 1.77 \ 1.68 , 1.76 \ 1.67 , 1.74 \ 1.66 , 1.73 \ 1.65 , 1.72 \ 1.64 , 1.71 \ 1.63 , 1.70 \ 1.62 , 1.69 \ 1.61 , 1.68 \ 1.60 , 1.67 \ 1.59 , 1.66 \ 1.58 , 1.65 \ 1.58 , 1.64 \ 1.57 , 1.63 \ 1.56 , 1.62 \ 1.56 , 1.62 \ 1.55 , 1.61 \ 1.54 , 1.60 \ 1.54 , 1.59 \ 1.53 , 1.59 \ 1.52 , 1.58 \ 1.52 , 1.57 \ 1.51 , 1.57 \ 1.51 , 1.56 \ 1.50 , 1.56 \ 1.50 , 1.55 \ 1.49 , 1.54 \ 1.49 , 1.54 \ 1.48 , 1.53 \ 1.48 , 1.53 \ 1.47 , 1.52 \ 1.47 , 1.52 \ 1.47 , 1.51 \ 1.46 , 1.51 \ 1.46 , 1.51 \ 1.45 , 1.50 \ 1.45 , 1.50 \ 1.45 , 1.49 \ 1.44 , 1.49 \ 1.44 , 1.48 \ 1.44 , 1.48 \ 1.43 , 1.48 \ 1.43 , 1.47 \ 1.43 , 1.47 \ 1.42 , 1.46 \ 1.42 , 1.46 \ 1.42 , 1.46 \ 1.41 , 1.45 \ 1.41 , 1.45 \ 1.41 , 1.45 \ 1.40 , 1.44 \ 1.40 , 1.44 \ 1.40 , 1.44 \ 1.40 , 1.44 \ 1.39 , 1.43 \ 1.39 , 1.43 \ 1.39 , 1.43 \ 1.39 , 1.42 \ 1.38 , 1.42 \ 1.38 , 1.42 \ 1.38 , 1.42 \ 1.38 , 1.41 \ 1.37 , 1.41 \ 1.37 , 1.41 )" +fullmax20 = strtoreal(colshape(colshape(tokens(s_fullmax20), 2)[.,1], 2)) + +s_fullmax30 = + " 12.76 , . \ 6.97 , 8.01 \ 5.11 , 5.88 \ 4.19 , 4.78 \ 3.64 , 4.12 \ 3.27 , 3.67 \ 3.00 , 3.35 \ 2.80 , 3.10 \ 2.64 , 2.91 \ 2.52 , 2.76 \ 2.41 , 2.63 \ 2.33 , 2.52 \ 2.25 , 2.43 \ 2.19 , 2.35 \ 2.13 , 2.29 \ 2.08 , 2.22 \ 2.04 , 2.17 \ 2.00 , 2.12 \ 1.96 , 2.08 \ 1.93 , 2.04 \ 1.90 , 2.01 \ 1.87 , 1.97 \ 1.84 , 1.94 \ 1.82 , 1.92 \ 1.80 , 1.89 \ 1.78 , 1.87 \ 1.76 , 1.84 \ 1.74 , 1.82 \ 1.73 , 1.80 \ 1.71 , 1.79 \ 1.70 , 1.77 \ 1.68 , 1.75 \ 1.67 , 1.74 \ 1.66 , 1.72 \ 1.64 , 1.71 \ 1.63 , 1.70 \ 1.62 , 1.68 \ 1.61 , 1.67 \ 1.60 , 1.66 \ 1.59 , 1.65 \ 1.58 , 1.64 \ 1.57 , 1.63 \ 1.57 , 1.62 \ 1.56 , 1.61 \ 1.55 , 1.60 \ 1.54 , 1.59 \ 1.54 , 1.59 \ 1.53 , 1.58 \ 1.52 , 1.57 \ 1.52 , 1.56 \ 1.51 , 1.56 \ 1.50 , 1.55 \ 1.50 , 1.54 \ 1.49 , 1.54 \ 1.49 , 1.53 \ 1.48 , 1.53 \ 1.48 , 1.52 \ 1.47 , 1.51 \ 1.47 , 1.51 \ 1.46 , 1.50 \ 1.46 , 1.50 \ 1.45 , 1.49 \ 1.45 , 1.49 \ 1.44 , 1.48 \ 1.44 , 1.48 \ 1.44 , 1.47 \ 1.43 , 1.47 \ 1.43 , 1.47 \ 1.42 , 1.46 \ 1.42 , 1.46 \ 1.42 , 1.45 \ 1.41 , 1.45 \ 1.41 , 1.45 \ 1.41 , 1.44 \ 1.40 , 1.44 \ 1.40 , 1.44 \ 1.40 , 1.43 \ 1.39 , 1.43 \ 1.39 , 1.43 \ 1.39 , 1.42 \ 1.39 , 1.42 \ 1.38 , 1.42 \ 1.38 , 1.41 \ 1.38 , 1.41 \ 1.37 , 1.41 \ 1.37 , 1.40 \ 1.37 , 1.40 \ 1.37 , 1.40 \ 1.36 , 1.40 \ 1.36 , 1.39 \ 1.36 , 1.39 \ 1.36 , 1.39 \ 1.36 , 1.38 \ 1.35 , 1.38 \ 1.35 , 1.38 \ 1.35 , 1.38 \ 1.35 , 1.37 \ 1.34 , 1.37 \ 1.34 , 1.37 \ 1.34 , 1.37 )" +fullmax30 = strtoreal(colshape(colshape(tokens(s_fullmax30), 2)[.,1], 2)) + + +s_limlsize10 = + " 16.38 , . \ 8.68 , 7.03 \ 6.46 , 5.44 \ 5.44 , 4.72 \ 4.84 , 4.32 \ 4.45 , 4.06 \ 4.18 , 3.90 \ 3.97 , 3.78 \ 3.81 , 3.70 \ 3.68 , 3.64 \ 3.58 , 3.60 \ 3.50 , 3.58 \ 3.42 , 3.56 \ 3.36 , 3.55 \ 3.31 , 3.54 \ 3.27 , 3.55 \ 3.24 , 3.55 \ 3.20 , 3.56 \ 3.18 , 3.57 \ 3.21 , 3.58 \ 3.39 , 3.59 \ 3.57 , 3.60 \ 3.68 , 3.62 \ 3.75 , 3.64 \ 3.79 , 3.65 \ 3.82 , 3.67 \ 3.85 , 3.74 \ 3.86 , 3.87 \ 3.87 , 4.02 \ 3.88 , 4.12 \ 3.89 , 4.19 \ 3.89 , 4.24 \ 3.90 , 4.27 \ 3.90 , 4.31 \ 3.90 , 4.33 \ 3.90 , 4.36 \ 3.90 , 4.38 \ 3.90 , 4.39 \ 3.90 , 4.41 \ 3.90 , 4.43 \ 3.90 , 4.44 \ 3.90 , 4.45 \ 3.90 , 4.47 \ 3.90 , 4.48 \ 3.90 , 4.49 \ 3.90 , 4.50 \ 3.90 , 4.51 \ 3.90 , 4.52 \ 3.90 , 4.53 \ 3.90 , 4.54 \ 3.90 , 4.55 \ 3.90 , 4.56 \ 3.90 , 4.56 \ 3.90 , 4.57 \ 3.90 , 4.58 \ 3.90 , 4.59 \ 3.90 , 4.59 \ 3.90 , 4.60 \ 3.90 , 4.61 \ 3.90 , 4.61 \ 3.90 , 4.62 \ 3.90 , 4.62 \ 3.90 , 4.63 \ 3.90 , 4.63 \ 3.89 , 4.64 \ 3.89 , 4.64 \ 3.89 , 4.64 \ 3.89 , 4.65 \ 3.89 , 4.65 \ 3.89 , 4.65 \ 3.89 , 4.66 \ 3.89 , 4.66 \ 3.89 , 4.66 \ 3.89 , 4.66 \ 3.88 , 4.66 \ 3.88 , 4.66 \ 3.88 , 4.66 \ 3.88 , 4.66 \ 3.88 , 4.66 \ 3.88 , 4.66 \ 3.88 , 4.66 \ 3.87 , 4.66 \ 3.87 , 4.66 \ 3.87 , 4.66 \ 3.87 , 4.66 \ 3.87 , 4.66 \ 3.86 , 4.65 \ 3.86 , 4.65 \ 3.86 , 4.65 \ 3.86 , 4.64 \ 3.85 , 4.64 \ 3.85 , 4.64 \ 3.85 , 4.63 \ 3.85 , 4.63 \ 3.84 , 4.62 \ 3.84 , 4.62 \ 3.84 , 4.61 \ 3.84 , 4.60 \ 3.83 , 4.60 \ 3.83 , 4.59 )" +limlsize10 = strtoreal(colshape(colshape(tokens(s_limlsize10), 2)[.,1], 2)) + +s_limlsize15 = + " 8.96 , . \ 5.33 , 4.58 \ 4.36 , 3.81 \ 3.87 , 3.39 \ 3.56 , 3.13 \ 3.34 , 2.95 \ 3.18 , 2.83 \ 3.04 , 2.73 \ 2.93 , 2.66 \ 2.84 , 2.60 \ 2.76 , 2.55 \ 2.69 , 2.52 \ 2.63 , 2.48 \ 2.57 , 2.46 \ 2.52 , 2.44 \ 2.48 , 2.42 \ 2.44 , 2.41 \ 2.41 , 2.40 \ 2.37 , 2.39 \ 2.34 , 2.38 \ 2.32 , 2.38 \ 2.29 , 2.37 \ 2.27 , 2.37 \ 2.25 , 2.37 \ 2.24 , 2.37 \ 2.22 , 2.38 \ 2.21 , 2.38 \ 2.20 , 2.38 \ 2.19 , 2.39 \ 2.18 , 2.39 \ 2.19 , 2.40 \ 2.22 , 2.41 \ 2.33 , 2.42 \ 2.40 , 2.42 \ 2.45 , 2.43 \ 2.48 , 2.44 \ 2.50 , 2.45 \ 2.52 , 2.54 \ 2.53 , 2.55 \ 2.54 , 2.66 \ 2.55 , 2.73 \ 2.56 , 2.78 \ 2.57 , 2.82 \ 2.57 , 2.85 \ 2.58 , 2.87 \ 2.58 , 2.89 \ 2.58 , 2.91 \ 2.59 , 2.92 \ 2.59 , 2.93 \ 2.59 , 2.94 \ 2.59 , 2.95 \ 2.59 , 2.96 \ 2.60 , 2.97 \ 2.60 , 2.98 \ 2.60 , 2.98 \ 2.60 , 2.99 \ 2.60 , 2.99 \ 2.60 , 3.00 \ 2.60 , 3.00 \ 2.60 , 3.01 \ 2.60 , 3.01 \ 2.60 , 3.02 \ 2.61 , 3.02 \ 2.61 , 3.02 \ 2.61 , 3.03 \ 2.61 , 3.03 \ 2.61 , 3.03 \ 2.61 , 3.03 \ 2.61 , 3.04 \ 2.61 , 3.04 \ 2.61 , 3.04 \ 2.60 , 3.04 \ 2.60 , 3.04 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.59 , 3.05 \ 2.59 , 3.05 \ 2.59 , 3.05 \ 2.59 , 3.05 \ 2.59 , 3.05 \ 2.59 , 3.04 \ 2.58 , 3.04 \ 2.58 , 3.04 \ 2.58 , 3.04 \ 2.58 , 3.04 \ 2.58 , 3.03 \ 2.57 , 3.03 \ 2.57 , 3.03 \ 2.57 , 3.03 \ 2.57 , 3.02 \ 2.56 , 3.02 \ 2.56 , 3.02 )" +limlsize15 = strtoreal(colshape(colshape(tokens(s_limlsize15), 2)[.,1], 2)) + +s_limlsize20 = + " 6.66 , . \ 4.42 , 3.95 \ 3.69 , 3.32 \ 3.30 , 2.99 \ 3.05 , 2.78 \ 2.87 , 2.63 \ 2.73 , 2.52 \ 2.63 , 2.43 \ 2.54 , 2.36 \ 2.46 , 2.30 \ 2.40 , 2.25 \ 2.34 , 2.21 \ 2.29 , 2.17 \ 2.25 , 2.14 \ 2.21 , 2.11 \ 2.18 , 2.09 \ 2.14 , 2.07 \ 2.11 , 2.05 \ 2.09 , 2.03 \ 2.06 , 2.02 \ 2.04 , 2.01 \ 2.02 , 1.99 \ 2.00 , 1.98 \ 1.98 , 1.98 \ 1.96 , 1.97 \ 1.95 , 1.96 \ 1.93 , 1.96 \ 1.92 , 1.95 \ 1.90 , 1.95 \ 1.89 , 1.95 \ 1.88 , 1.94 \ 1.87 , 1.94 \ 1.86 , 1.94 \ 1.85 , 1.94 \ 1.84 , 1.94 \ 1.83 , 1.94 \ 1.82 , 1.94 \ 1.81 , 1.95 \ 1.81 , 1.95 \ 1.80 , 1.95 \ 1.79 , 1.95 \ 1.79 , 1.96 \ 1.78 , 1.96 \ 1.78 , 1.97 \ 1.80 , 1.97 \ 1.87 , 1.98 \ 1.92 , 1.98 \ 1.95 , 1.99 \ 1.97 , 2.00 \ 1.99 , 2.00 \ 2.00 , 2.01 \ 2.01 , 2.09 \ 2.02 , 2.11 \ 2.03 , 2.18 \ 2.04 , 2.23 \ 2.04 , 2.27 \ 2.05 , 2.29 \ 2.05 , 2.31 \ 2.06 , 2.33 \ 2.06 , 2.34 \ 2.07 , 2.35 \ 2.07 , 2.36 \ 2.07 , 2.37 \ 2.08 , 2.38 \ 2.08 , 2.39 \ 2.08 , 2.39 \ 2.08 , 2.40 \ 2.09 , 2.40 \ 2.09 , 2.41 \ 2.09 , 2.41 \ 2.09 , 2.41 \ 2.09 , 2.42 \ 2.09 , 2.42 \ 2.09 , 2.42 \ 2.09 , 2.43 \ 2.10 , 2.43 \ 2.10 , 2.43 \ 2.10 , 2.43 \ 2.10 , 2.44 \ 2.10 , 2.44 \ 2.10 , 2.44 \ 2.10 , 2.44 \ 2.10 , 2.44 \ 2.09 , 2.44 \ 2.09 , 2.44 \ 2.09 , 2.45 \ 2.09 , 2.45 \ 2.09 , 2.45 \ 2.09 , 2.45 \ 2.09 , 2.45 \ 2.09 , 2.45 \ 2.09 , 2.45 \ 2.08 , 2.45 \ 2.08 , 2.45 \ 2.08 , 2.45 \ 2.08 , 2.45 \ 2.08 , 2.45 \ 2.07 , 2.44 \ 2.07 , 2.44 \ 2.07 , 2.44 )" +limlsize20 = strtoreal(colshape(colshape(tokens(s_limlsize20), 2)[.,1], 2)) + +s_limlsize25 = + " 5.53 , . \ 3.92 , 3.63 \ 3.32 , 3.09 \ 2.98 , 2.79 \ 2.77 , 2.60 \ 2.61 , 2.46 \ 2.49 , 2.35 \ 2.39 , 2.27 \ 2.32 , 2.20 \ 2.25 , 2.14 \ 2.19 , 2.09 \ 2.14 , 2.05 \ 2.10 , 2.02 \ 2.06 , 1.99 \ 2.03 , 1.96 \ 2.00 , 1.93 \ 1.97 , 1.91 \ 1.94 , 1.89 \ 1.92 , 1.87 \ 1.90 , 1.86 \ 1.88 , 1.84 \ 1.86 , 1.83 \ 1.84 , 1.81 \ 1.83 , 1.80 \ 1.81 , 1.79 \ 1.80 , 1.78 \ 1.78 , 1.77 \ 1.77 , 1.77 \ 1.76 , 1.76 \ 1.75 , 1.75 \ 1.74 , 1.75 \ 1.73 , 1.74 \ 1.72 , 1.73 \ 1.71 , 1.73 \ 1.70 , 1.73 \ 1.69 , 1.72 \ 1.68 , 1.72 \ 1.67 , 1.71 \ 1.67 , 1.71 \ 1.66 , 1.71 \ 1.65 , 1.71 \ 1.65 , 1.71 \ 1.64 , 1.70 \ 1.63 , 1.70 \ 1.63 , 1.70 \ 1.62 , 1.70 \ 1.62 , 1.70 \ 1.61 , 1.70 \ 1.61 , 1.70 \ 1.61 , 1.70 \ 1.60 , 1.70 \ 1.60 , 1.70 \ 1.59 , 1.70 \ 1.59 , 1.70 \ 1.59 , 1.70 \ 1.58 , 1.70 \ 1.58 , 1.71 \ 1.58 , 1.71 \ 1.57 , 1.71 \ 1.59 , 1.71 \ 1.60 , 1.71 \ 1.63 , 1.72 \ 1.65 , 1.72 \ 1.67 , 1.72 \ 1.69 , 1.72 \ 1.70 , 1.76 \ 1.71 , 1.81 \ 1.72 , 1.87 \ 1.73 , 1.91 \ 1.74 , 1.94 \ 1.74 , 1.96 \ 1.75 , 1.98 \ 1.75 , 1.99 \ 1.76 , 2.01 \ 1.76 , 2.02 \ 1.77 , 2.03 \ 1.77 , 2.04 \ 1.78 , 2.04 \ 1.78 , 2.05 \ 1.78 , 2.06 \ 1.79 , 2.06 \ 1.79 , 2.07 \ 1.79 , 2.07 \ 1.79 , 2.08 \ 1.80 , 2.08 \ 1.80 , 2.09 \ 1.80 , 2.09 \ 1.80 , 2.09 \ 1.80 , 2.09 \ 1.80 , 2.10 \ 1.80 , 2.10 \ 1.80 , 2.10 \ 1.80 , 2.10 \ 1.80 , 2.10 \ 1.80 , 2.11 \ 1.80 , 2.11 \ 1.80 , 2.11 \ 1.80 , 2.11 \ 1.80 , 2.11 \ 1.80 , 2.11 )" +limlsize25 = strtoreal(colshape(colshape(tokens(s_limlsize25), 2)[.,1], 2)) + +if (choice == 1) { + st_matrix(temp, ivbias5) +} else if (choice == 2) { + st_matrix(temp, ivbias10) +} else if (choice == 3) { + st_matrix(temp, ivbias20) +} else if (choice == 4) { + st_matrix(temp, ivbias30) +} else if (choice == 5) { + st_matrix(temp, ivsize10) +} else if (choice == 6) { + st_matrix(temp, ivsize15) +} else if (choice == 7) { + st_matrix(temp, ivsize20) +} else if (choice == 8) { + st_matrix(temp, ivsize25) +} else if (choice == 9) { + st_matrix(temp, fullrel5) +} else if (choice == 10) { + st_matrix(temp, fullrel10) +} else if (choice == 11) { + st_matrix(temp, fullrel20) +} else if (choice == 12) { + st_matrix(temp, fullrel30) +} else if (choice == 13) { + st_matrix(temp, fullmax5) +} else if (choice == 14) { + st_matrix(temp, fullmax10) +} else if (choice == 15) { + st_matrix(temp, fullmax20) +} else if (choice == 16) { + st_matrix(temp, fullmax30) +} else if (choice == 17) { + st_matrix(temp, limlsize10) +} else if (choice == 18) { + st_matrix(temp, limlsize15) +} else if (choice == 19) { + st_matrix(temp, limlsize20) +} else if (choice == 20) { + st_matrix(temp, limlsize25) +} +} // end of program cdsy + +end + + +****************************************** END *************************************** +*********************************** livreg2.mlib CODE ******************************** + +***************************************** START ************************************** +*********************************** ranktest.ado CODE ******************************** +* Code from: +* ranktest 1.3.04 24aug2014 +* author mes, based on code by fk +* Imported into ivreg210 so that ivreg210 is free-standing. +* See end of file for version notes. + +program define ivreg210_ranktest, rclass sortpreserve + version 9.2 + local lversion 01.3.04 + + if substr("`1'",1,1)== "," { + if "`2'"=="version" { + di in ye "`lversion'" + return local version `lversion' + exit + } + else { +di as err "invalid syntax" + exit 198 + } + } + +* If varlist 1 or varlist 2 have a single element, parentheses optional + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local y `s(varlist)' + local K : word count `y' + local 0 `"`s(rest)'"' + sret clear + } + else { + local y `1' + local K 1 + mac shift 1 + local 0 `"`*'"' + } + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local z `s(varlist)' + local L : word count `z' + local 0 `"`s(rest)'"' + sret clear + } + else { + local z `1' + local K 1 + mac shift 1 +* Need to reinsert comma before options (if any) for -syntax- command to work + local 0 `", `*'"' + } + +* Option version ignored here if varlists were provided + syntax [if] [in] [aw fw pw iw/] [, partial(varlist ts) fwl(varlist ts) /* + */ NOConstant wald ALLrank NULLrank FULLrank ROBust cluster(varlist) /* + */ BW(string) kernel(string) Tvar(varname) Ivar(varname) sw psd version /* + */ dofminus(integer 0) ] + + local partial "`partial' `fwl'" + + if "`noconstant'"=="" { + tempvar one + gen byte `one' = 1 + local partial "`partial' `one'" + } + + if "`wald'"~="" { + local LMWald "Wald" + } + else { + local LMWald "LM" + } + + local optct : word count `allrank' `nullrank' `fullrank' + if `optct' > 1 { +di as err "Incompatible options: `allrank' `nullrank' `fullrank'" + error 198 + } + else if `optct' == 0 { +* Default + local allrank "allrank" + } + +* Note that by tsrevar-ing here, subsequent disruption to the sort doesn't matter +* for TS operators. + tsrevar `y' + local vl1 `r(varlist)' + tsrevar `z' + local vl2 `r(varlist)' + tsrevar `partial' + local partial `r(varlist)' + + foreach vn of varlist `vl1' { + tempvar tv + qui gen double `tv' = . + local tempvl1 "`tempvl1' `tv'" + } + foreach vn of varlist `vl2' { + tempvar tv + qui gen double `tv' = . + local tempvl2 "`tempvl2' `tv'" + } + + marksample touse + markout `touse' `vl1' `vl2' `partial' `cluster', strok + +* Stock-Watson and cluster imply robust. + if "`sw'`cluster'" ~= "" { + local robust "robust" + } + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + if "`fsqrt(wf)*(wvar^0.5):*'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "fweight" & "`sw'" != "" { + di in red "fweights currently not supported with -sw- option" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`bw'" !="" { + di in red "iweights not allowed with robust, cluster, AC or HAC" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + + +* Every time a weight is used, must multiply by scalar wf ("weight factor") +* wf=1 for no weights, fw and iw, wf = scalar that normalizes sum to be N if aw or pw + sum `wvar' if `touse' `wtexp', meanonly +* Weight statement + if "`weight'" ~= "" { +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + if "`weight'"=="" | "`weight'"=="fweight" | "`weight'"=="iweight" { +* If weight is "", weight var must be column of ones and N is number of rows. +* With fw and iw, effective number of observations is sum of weight variable. + local wf=1 + local N=r(sum_w) + } + else if "`weight'"=="aweight" | "`weight'"=="pweight" { +* With aw and pw, N is number of obs, unadjusted. + local wf=r(N)/r(sum_w) + local N=r(N) + } + else { +* Should never reach here +di as err "ivreg210_ranktest error - misspecified weights" + exit 198 + } + +* HAC estimation. +* If bw is omitted, default `bw' is empty string. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. + if "`bw'" == "" & "`kernel'" == "" { + local bw=0 + } + else { +* Need tvar for markout with time-series stuff +* Data must be tsset for time-series operators in code to work +* User-supplied tvar checked if consistent with tsset + capture tsset + if "`r(timevar)'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } +* If no panel data, ivar will still be empty + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already -tsset-" + exit 5 + } + local tdelta `r(tdelta)' + tsreport if `touse', panel + if `r(N_gaps)' != 0 { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + +* Check it's a valid kernel and replace with unabbreviated kernel name; check bw. +* Automatic kernel selection allowed by ivreg2 but not ranktest so must trap. +* s_ivreg210_vkernel is in livreg2 mlib. + if "`bw'"=="auto" { +di as err "invalid bandwidth in option bw() - must be real > 0" + exit 198 + } + mata: s_ivreg210_vkernel("`kernel'", "`bw'", "`ivar'") + local kernel `r(kernel)' + local bw = `r(bw)' + } + +* tdelta missing if version 9 or if not tsset + if "`tdelta'"=="" { + local tdelta=1 + } + + if "`sw'"~="" { + capture xtset + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already tsset or xtset" + exit 5 + } +* Exit with error if ivar is neither supplied nor tsset nor xtset + if "`ivar'"=="" { +di as err "Must -xtset- or -tsset- data or specify -ivar- with -sw- option" + exit 198 + } + qui describe, short varlist + local sortlist "`r(sortlist)'" + tokenize `sortlist' + if "`ivar'"~="`1'" { +di as err "Error - dataset must be sorted on panel var with -sw- option" + exit 198 + } + } + +* Create variable used for getting lags etc. in Mata + tempvar tindex + qui gen `tindex'=1 if `touse' + qui replace `tindex'=sum(`tindex') if `touse' + +********** CLUSTER SETUP ********************************************** + +* Mata code requires data are sorted on (1) the first var cluster if there +* is only one cluster var; (2) on the 3rd and then 1st if two-way clustering, +* unless (3) two-way clustering is combined with kernel option, in which case +* the data are tsset and sorted on panel id (first cluster variable) and time +* id (second cluster variable). +* Second cluster var is optional and requires an identifier numbered 1..N_clust2, +* unless combined with kernel option, in which case it's the time variable. +* Third cluster var is the intersection of 1 and 2, unless combined with kernel +* opt, in which case it's unnecessary. +* Sorting on "cluster3 cluster1" means that in Mata, panelsetup works for +* both, since cluster1 nests cluster3. +* Note that it is possible to cluster on time but not panel, in which case +* cluster1 is time, cluster2 is empty and data are sorted on panel-time. +* Note also that if no kernel-robust, sorting will disrupt any tsset-ing, +* but data are tsrevar-ed earlier to avoid any problems. + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`kernel'"~="" { +* kernel requires either that cluster1 is time var and cluster2 is empty +* or that cluster1 is panel var and cluster2 is time var. +* Either way, data must be tsset and sorted for panel data. + if "`cluster2'"~="" { +* Allow backwards order + if "`cluster1'"=="`tvar'" & "`cluster2'"=="`ivar'" { + local cluster1 "`2'" + local cluster2 "`1'" + } + if "`cluster1'"~="`ivar'" | "`cluster2'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset panel & time vars." +di as err " tsset panel var=`ivar'; tsset time var=`tvar'; cluster vars=`cluster1',`cluster2'" + exit 198 + } + } + else { + if "`cluster1'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset time variable." +di as err " tsset time var=`tvar'; cluster var=`cluster1'" + exit 198 + } + } + } +* Simple way to get quick count of 1st cluster variable without disrupting sort +* clusterid1 is numbered 1.._Nclust1. + tempvar clusterid1 + qui egen `clusterid1'=group(`cluster1') if `touse' + sum `clusterid1' if `touse', meanonly + if "`cluster2'"=="" { + local N_clust=r(max) + local N_clust1=. + local N_clust2=. + if "`kernel'"=="" { +* Single level of clustering and no kernel-robust, so sort on single cluster var. +* kernel-robust already sorted via tsset. + sort `cluster1' + } + } + else { + local N_clust1=r(max) + if "`kernel'"=="" { + tempvar clusterid2 clusterid3 +* New cluster id vars are numbered 1..N_clust2 and 1..N_clust3 + qui egen `clusterid2'=group(`cluster2') if `touse' + qui egen `clusterid3'=group(`cluster1' `cluster2') if `touse' +* Two levels of clustering and no kernel-robust, so sort on cluster3/nested in/cluster1 +* kernel-robust already sorted via tsset. + sort `clusterid3' `cluster1' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) + } + else { +* Need to create this only to count the number of clusters + tempvar clusterid2 + qui egen `clusterid2'=group(`cluster2') if `touse' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) +* Now replace with original variable + local clusterid2 `cluster2' + } + local N_clust=min(`N_clust1',`N_clust2') + } + } + +************************************************************************************************ + +* Note that bw is passed as a value, not as a string + mata: ivreg210_rkstat( "`vl1'", /* + */ "`vl2'", /* + */ "`partial'", /* + */ "`wvar'", /* + */ "`weight'", /* + */ `wf', /* + */ `N', /* + */ "`touse'", /* + */ "`LMWald'", /* + */ "`allrank'", /* + */ "`nullrank'", /* + */ "`fullrank'", /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`tvar'", /* + */ "`ivar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ `dofminus', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`tempvl1'", /* + */ "`tempvl2'") + + tempname rkmatrix chi2 df df_r p rank ccorr eval + mat `rkmatrix'=r(rkmatrix) + mat `ccorr'=r(ccorr) + mat `eval'=r(eval) + mat colnames `rkmatrix' = "rk" "df" "p" "rank" "eval" "ccorr" + +di +di "Kleibergen-Paap rk `LMWald' test of rank of matrix" + if "`robust'"~="" & "`kernel'"~= "" & "`cluster'"=="" { +di " Test statistic robust to heteroskedasticity and autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`kernel'"~="" & "`cluster'"=="" { +di " Test statistic robust to autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`cluster'"~="" { +di " Test statistic robust to heteroskedasticity and clustering on `cluster'" + if "`kernel'"~="" { +di " and kernel-robust to common correlated disturbances" +di " Kernel: `kernel' Bandwidth: `bw'" + } + } + else if "`robust'"~="" { +di " Test statistic robust to heteroskedasticity" + } + else if "`LMWald'"=="LM" { +di " Test assumes homoskedasticity (Anderson canonical correlations test)" + } + else { +di " Test assumes homoskedasticity (Cragg-Donald test)" + } + + local numtests = rowsof(`rkmatrix') + forvalues i=1(1)`numtests' { +di "Test of rank=" %3.0f `rkmatrix'[`i',4] " rk=" %8.2f `rkmatrix'[`i',1] /* + */ " Chi-sq(" %3.0f `rkmatrix'[`i',2] ") pvalue=" %8.6f `rkmatrix'[`i',3] + } + scalar `chi2' = `rkmatrix'[`numtests',1] + scalar `p' = `rkmatrix'[`numtests',3] + scalar `df' = `rkmatrix'[`numtests',2] + scalar `rank' = `rkmatrix'[`numtests',4] + local N `r(N)' + return scalar df = `df' + return scalar chi2 = `chi2' + return scalar p = `p' + return scalar rank = `rank' + if "`cluster'"~="" { + return scalar N_clust = `N_clust' + } + if "`cluster2'"~="" { + return scalar N_clust1 = `N_clust1' + return scalar N_clust2 = `N_clust2' + } + return scalar N = `N' + return matrix rkmatrix `rkmatrix' + return matrix ccorr `ccorr' + return matrix eval `eval' + + tempname S V Omega + if `K' > 1 { + foreach en of local y { +* Remove "." from equation name + local en1 : subinstr local en "." "_", all + foreach vn of local z { + local cn "`cn' `en1':`vn'" + } + } + } + else { + foreach vn of local z { + local cn "`cn' `vn'" + } + } + mat `V'=r(V) + matrix colnames `V' = `cn' + matrix rownames `V' = `cn' + return matrix V `V' + mat `S'=r(S) + matrix colnames `S' = `cn' + matrix rownames `S' = `cn' + return matrix S `S' +end + +* Adopted from -canon- +program define GetVarlist, sclass + sret clear + gettoken open 0 : 0, parse("(") + if `"`open'"' != "(" { + error 198 + } + gettoken next 0 : 0, parse(")") + while `"`next'"' != ")" { + if `"`next'"'=="" { + error 198 + } + local list `list'`next' + gettoken next 0 : 0, parse(")") + } + sret local rest `"`0'"' + tokenize `list' + local 0 `*' + sret local varlist "`0'" +end + + +******************************************************************************* +*************************** BEGIN MATA CODE *********************************** +******************************************************************************* + + + +version 9.2 +mata: + +// ********* MATA CODE SHARED BY ivreg2 AND ranktest *************** // +// ********* 1. struct ms_ivreg210_vcvorthog *************** // +// ********* 2. m_ivreg210_omega *************** // +// ********* 3. m_ivreg210_calckw *************** // +// ********* 4. s_ivreg210_vkernel *************** // +// *********************************************************************** // + +// For reference: +// struct ms_ivreg210_vcvorthog { +// string scalar ename, Znames, touse, weight, wvarname +// string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel +// string scalar sw, psd, ivarname, tvarname, tindexname +// real scalar wf, N, bw, tdelta, dofminus +// real matrix ZZ +// pointer matrix e +// pointer matrix Z +// pointer matrix wvar +// } + +void ivreg210_rkstat( string scalar vl1, + string scalar vl2, + string scalar partial, + string scalar wvarname, + string scalar weight, + scalar wf, + scalar N, + string scalar touse, + string scalar LMWald, + string scalar allrank, + string scalar nullrank, + string scalar fullrank, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + bw, + string scalar tvarname, + string scalar ivarname, + string scalar tindexname, + tdelta, + dofminus, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar tempvl1, + string scalar tempvl2) +{ + +// tempx, tempy and tempz are the Stata names of temporary variables that will be changed by rkstat + if (partial~="") { + tempx=tokens(partial) + } + tempy=tokens(tempvl1) + tempz=tokens(tempvl2) + + st_view(y=.,.,tokens(vl1),touse) + st_view(z=.,.,tokens(vl2),touse) + st_view(yhat=.,.,tempy,touse) + st_view(zhat=.,.,tempz,touse) + st_view(mtouse=.,.,tokens(touse),touse) + st_view(wvar=.,.,tokens(wvarname),touse) + noweight=(st_vartype(wvarname)=="byte") + +// Note that we now use wf*wvar instead of wvar +// because wvar is raw weighting variable and +// wf*wvar normalizes so that sum(wf*wvar)=N. + +// Partial out the X variables +// Note that this is entered if there is a constant, +// i.e., variables are centered + if (partial~="") { + st_view(x=.,.,tempx,touse) + xx = quadcross(x, wf*wvar, x) + xy = quadcross(x, wf*wvar, y) + xz = quadcross(x, wf*wvar, z) + + by = invsym(xx)*xy + bz = invsym(xx)*xz + + yhat[.,.] = y-x*by + zhat[.,.] = z-x*bz + } + else { + yhat[.,.] = y + zhat[.,.] = z + } + K=cols(y) + L=cols(z) + + zhzh = quadcross(zhat, wf*wvar, zhat) + zhyh = quadcross(zhat, wf*wvar, yhat) + yhyh = quadcross(yhat, wf*wvar, yhat) + + pihat = invsym(zhzh)*zhyh +// rzhat is F in paper (p. 103) +// iryhat is G in paper (p. 103) + ryhat=cholesky(yhyh) + rzhat=cholesky(zhzh) + iryhat=luinv(ryhat') + irzhat=luinv(rzhat') + that=rzhat'*pihat*iryhat + +// cc is canonical correlations. Squared cc is eigenvalues. + fullsvd(that, ut, cc, vt) + vt=vt' + vecth=vec(that) + ev = cc:^2 +// S matrix in paper (p. 100). Not used in code below. +// smat=fullsdiag(cc, rows(that)-cols(that)) + + if (abs(1-cc[1,1])<1e-10) { +printf("\n{text:Warning: collinearities detected between (varlist1) and (varlist2)}\n") + } + if ((missing(ryhat)>0) | (missing(iryhat)>0) | (missing(rzhat)>0) | (missing(irzhat)>0)) { +printf("\n{error:Error: non-positive-definite matrix. May be caused by collinearities.}\n") + exit(error(3351)) + } + +// If Wald, yhat is residuals + if (LMWald=="Wald") { + yhat[.,.]=yhat-zhat*pihat + yhyh = quadcross(yhat, wvar, yhat) + } + +// Covariance matrices +// vhat is W in paper (eqn below equation 17, p. 103) +// shat is V in paper (eqn below eqn 15, p. 103) + +// ************************************************************************************* // +// shat calculated using struct and programs m_ivreg210_omega, m_ivreg210_calckw shared with ivreg2 // + + struct ms_ivreg210_vcvorthog scalar vcvo + + + vcvo.ename = tempy // ivreg2 has = ename // + vcvo.Znames = tempz // ivreg2 has = Znames // + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = zhzh // ivreg2 has = st_matrix(ZZmatrix) // + + vcvo.e = &yhat // ivreg2 has = &e // + vcvo.Z = &zhat // ivreg2 has = &Z // + vcvo.wvar = &wvar + + shat=m_ivreg210_omega(vcvo) + +// *************************************************************************************** + +// Finally, calcluate vhat + if ((LMWald=="LM") & (kernel=="") & (robust=="") & (clustvarname=="")) { +// Homoskedastic, iid LM case means vcv is identity matrix +// Generates canonical correlation stats. Default. + vhat=I(L*K,L*K)/N + } + else { + vhat=(iryhat'#irzhat')*shat*(iryhat'#irzhat')' * N + _makesymmetric(vhat) + } + +// ready to start collecting test stats + if (allrank~="") { + firstrank=1 + lastrank=min((K,L)) + } + else if (nullrank~="") { + firstrank=1 + lastrank=1 + } + else if (fullrank~="") { + firstrank=min((K,L)) + lastrank=min((K,L)) + } + else { +// should never reach this point +printf("ivreg210_ranktest error\n") + exit + } + + rkmatrix=J(lastrank-firstrank+1,6,.) + for (i=firstrank; i<=lastrank; i++) { + + if (i>1) { + u12=ut[(1::i-1),(i..L)] + v12=vt[(1::i-1),(i..K)] + } + u22=ut[(i::L),(i..L)] + v22=vt[(i::K),(i..K)] + + symeigensystem(u22*u22', evec, eval) + u22v=evec + u22d=diag(eval) + u22h=u22v*(u22d:^0.5)*u22v' + + symeigensystem(v22*v22', evec, eval) + v22v=evec + v22d=diag(eval) + v22h=v22v*(v22d:^0.5)*v22v' + + if (i>1) { + aq=(u12 \ u22)*luinv(u22)*u22h + bq=v22h*luinv(v22')*(v12 \ v22)' + } + else { + aq=u22*luinv(u22)*u22h + bq=v22h*luinv(v22')*v22' + } + +// lab is lambda_q in paper (eqn below equation 21, p. 104) +// vlab is omega_q in paper (eqn 19 in paper, p. 104) + lab=(bq#aq')*vecth + vlab=(bq#aq')*vhat*(bq#aq')' + +// Symmetrize if numerical inaccuracy means it isn't + _makesymmetric(vlab) + vlabinv=invsym(vlab) +// rk stat Assumption 2: vlab (omega_q in paper) is nonsingular. Detected by a zero on the diagonal, +// since when returning a generalized inverse, Stata/Mata choose the generalized inverse that +// sets entire column(s)/row(s) to zeros. +// Save df and rank even if test stat not available. + df=(L-i+1)*(K-i+1) + rkmatrix[i-firstrank+1,2]=df + rkmatrix[i-firstrank+1,4]=i-1 + if (diag0cnt(vlabinv)>0) { +printf("\n{text:Warning: covariance matrix omega_%f}", i-1) +printf("{text: not full rank; test of rank %f}", i-1) +printf("{text: unavailable}\n") + } +// Note not multiplying by N - already incorporated in vhat. + else { + rk=lab'*vlabinv*lab + pvalue=chi2tail(df, rk) + rkmatrix[i-firstrank+1,1]=rk + rkmatrix[i-firstrank+1,3]=pvalue + } +// end of test loop + } + +// insert squared (=eigenvalues if canon corr) and unsquared canon correlations + for (i=firstrank; i<=lastrank; i++) { + rkmatrix[i-firstrank+1,6]=cc[i-firstrank+1,1] + rkmatrix[i-firstrank+1,5]=ev[i-firstrank+1,1] + } + st_matrix("r(rkmatrix)", rkmatrix) + st_matrix("r(ccorr)", cc') + st_matrix("r(eval)",ev') +// Save V matrix as in paper, without factor of 1/N + vhat=N*vhat*wf + st_matrix("r(V)", vhat) +// Save S matrix as in ivreg2, with factor of 1/N + st_matrix("r(S)", shat) + st_numscalar("r(N)", N) + if (clustvarname~="") { + st_numscalar("r(N_clust)", N_clust) + } + if (clustvarname2~="") { + st_numscalar("r(N_clust2)", N_clust2) + } +// end of program +} + + +end + +****************************************** END *************************************** +*********************************** ranktest.ado CODE ******************************** + + +program define ivreg210, eclass byable(recall) /* properties(svyj) */ sortpreserve + version 10.1 + local lversion 03.1.10 + + local ivreg2_cmd "ivreg210" + local ranktest_cmd "ivreg210_ranktest" + + if replay() { + syntax [, FIRST FFIRST RF Level(integer $S_level) NOHEader NOFOoter dropfirst droprf /* + */ EForm(string) PLUS VERsion] + if "`version'" != "" & "`first'`ffirst'`rf'`noheader'`nofooter'`dropfirst'`droprf'`eform'`plus'" != "" { + di as err "option version not allowed" + error 198 + } + if "`version'" != "" { + di in gr "`lversion'" + ereturn clear + ereturn local version `lversion' + exit + } + if `"`e(cmd)'"' != "`ivreg2_cmd'" { + error 301 + } + if "`e(firsteqs)'" != "" & "`dropfirst'" == "" { +* On replay, set flag so saved eqns aren't dropped + local savefirst "savefirst" + } + if "`e(rfeq)'" != "" & "`droprf'" == "" { +* On replay, set flag so saved eqns aren't dropped + local saverf "saverf" + } + } + else { + local cmdline "`ivreg2_cmd' `*'" + + syntax [anything(name=0)] [if] [in] [aw fw pw iw/] [, /* + */ FIRST FFIRST NOID NOCOLLIN SAVEFIRST SAVEFPrefix(name) /* + */ SMall Robust CLuster(varlist) kiefer dkraay(integer 0) /* + */ GMM GMM2s CUE ORTHOG(string) ENDOGtest(string) /* + */ PARTIAL(string) FWL(string) NOConstant Level(integer $S_level) /* + */ NOHEader NOFOoter NOOUTput title(string) subtitle(string) /* + */ DEPname(string) EForm(string) PLUS /* + */ BW(string) kernel(string) Tvar(varname) Ivar(varname)/* + */ LIML COVIV FULLER(real 0) Kclass(real 0) /* + */ REDundant(string) RF SAVERF SAVERFPrefix(name) /* + */ B0(string) SMATRIX(string) WMATRIX(string) sw psd0 psda /* + */ dofminus(integer 0) sdofminus(integer 0) NOPARTIALSMALL ] + + local n 0 + + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + if `s(stop)' { + error 198 + } + while `s(stop)'==0 { + if "`paren'"=="(" { + local n = `n' + 1 + if `n'>1 { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +exit 198 + } + gettoken p lhs : lhs, parse(" =") + while "`p'"!="=" { + if "`p'"=="" { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +di in red `"the equal sign "=" is required"' +exit 198 + } + local endo `endo' `p' + gettoken p lhs : lhs, parse(" =") + } +* To enable Cragg HOLS estimator, allow for empty endo list + local temp_ct : word count `endo' + if `temp_ct' > 0 { + tsunab endo : `endo' + } +* To enable OLS estimator with (=) syntax, allow for empty exexog list + local temp_ct : word count `lhs' + if `temp_ct' > 0 { + tsunab exexog : `lhs' + } + } + else { + local inexog `inexog' `lhs' + } + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + } + local 0 `"`lhs' `0'"' + + tsunab inexog : `inexog' + tokenize `inexog' + local lhs "`1'" + local 1 " " + local inexog `*' + + if "`gmm2s'`cue'" != "" & "`exexog'" == "" { + di in red "option `gmm2s'`cue' invalid: no excluded instruments specified" + exit 102 + } + +/* DISABLED IN IVREG210 - RANKTEST IS INTERNAL +* Check that -ranktest- is installed + capture `ranktest_cmd', version + if _rc != 0 { +di as err "Error: must have ranktest version `ranktestversion' or greater installed" +di as err "To install, from within Stata type " _c +di in smcl "{stata ssc install ranktest :ssc install ranktest}" + exit 601 + } + local vernum "`r(version)'" + if ("`vernum'" < "`ranktestversion'") | ("`vernum'" > "09.9.99") { +di as err "Error: must have ranktest version `ranktestversion' or greater installed" +di as err "Currently installed version is `vernum'" +di as err "To update, from within Stata type " _c +di in smcl "{stata ssc install ranktest, replace :ssc install ranktest, replace}" + exit 601 + } +*/ + +* Process options + +* Legacy gmm option + if "`gmm'" ~= "" { +di in ye "-gmm- is no longer a supported option; use -gmm2s- with the appropriate option" +di in ye " gmm = gmm2s robust" +di in ye " gmm robust = gmm2s robust" +di in ye " gmm bw() = gmm2s bw()" +di in ye " gmm robust bw() = gmm2s robust bw()" +di in ye " gmm cluster() = gmm2s cluster()" + local gmm2s "gmm2s" + if "`robust'`cluster'`bw'"=="" { +* 2-step efficient gmm with arbitrary heteroskedasticity + local robust "robust" + } + } + +* partial, including legacy FWL option + local partial "`partial' `fwl'" + local partial : list retokenize partial +* Need word option so that varnames with cons in them aren't zapped + local partial : subinstr local partial "_cons" "", all count(local partialcons) word + if `partialcons' > 0 & "`noconstant'"~="" { +di in r "Error: _cons listed in partial() but equation specifies -noconstant-." + error 198 + } + else if "`noconstant'"~="" { + local partialcons 0 + } + else if `partialcons' > 1 { +* Just in case of multiple _cons +di in r "Error: _cons listed more than once in partial()." + error 198 + } + else if "`partial'" ~= "" { + local partialcons 1 + } + + if `fuller' != 0 { + local fulleropt "fuller(`fuller')" + } + if `kclass' != 0 { + local kclassopt "kclass(`kclass')" + } + +* Fuller implies LIML + if "`liml'" == "" & `fuller' != 0 { + local liml "liml" + } + +* b0 implies noid. Also check for incompatible options. + if "`b0'" ~= "" { + local noid "noid" + local b0opts "`gmm2s'`cue'`liml'`wmatrix'`kclassopt'" + if "`b0opts'" != "" { +* ...with spaces + local b0opts "`gmm2s' `cue' `liml' `wmatrix' `kclassopt'" + local b0opts : list retokenize b0opts +di as err "incompatible options: -b0- and `b0opts'" + exit 198 + } + } + + if "`gmm2s'" != "" & "`cue'" != "" { +di as err "incompatible options: 2-step efficient gmm and cue gmm" + exit 198 + } + +* savefprefix implies savefirst + if "`savefprefix'" != "" & "`savefirst'" == "" { + local savefirst "savefirst" + } + +* default savefprefix is _ivreg2_ + if "`savefprefix'" == "" { + local savefprefix "_`ivreg2_cmd'_" + } + +* saverfprefix implies saverf + if "`saverfprefix'" != "" & "`saverf'" == "" { + local saverf "saverf" + } + +* default saverfprefix is _ivreg2_ + if "`saverfprefix'" == "" { + local saverfprefix "_`ivreg2_cmd'_" + } + +* LIML/kclass incompatibilities + if "`liml'`kclassopt'" != "" { + if "`gmm2s'`cue'" != "" { +di as err "GMM estimation not available with LIML or k-class estimators" + exit 198 + } + if `fuller' < 0 { +di as err "invalid Fuller option" + exit 198 + } + if "`liml'" != "" & "`kclassopt'" != "" { +di as err "cannot use liml and kclass options together" + exit 198 + } +* Process kclass string + if `kclass' < 0 { +di as err "invalid k-class option" + exit 198 + } + } + + if "`cluster'`sw'"~="" { +* Cluster and SW imply robust + local robust "robust" + } + + if "`psd0'"~="" & "`psda'"~="" { +di as err "cannot use psd0 and psda options together" + exit 198 + } +* Macro psd has either psd0, psda or is empty + local psd "`psd0'`psda'" + +******************* Prepare for TS data ******************* + + if "`orthog'`endogtest'`redundant'`partial'" != "" { + capture tsunab orthog : `orthog' + capture tsunab endogtest : `endogtest' + capture tsunab redundant : `redundant' + capture tsunab partial : `partial' + } + +* TS operators not allowed with cluster, ivar or tvar. Captured in -syntax-. + +* Set flag for use of time-series variables. Will be =1 if a TS operator is used, =0 otherwise. + tsunab vnames : `lhs' `inexog' `exexog' `endo' + local vnames : subinstr local vnames "." ".", count(local tsused) + +* Routines below will call tsrevar or, from within Mata, st_tsrevar. +* This will create temporary variables according to how the data are tsset now. +* tsrevar remembers the temp vars created between calls, so we create +* them all now. `exp' is weight variable. + + tsrevar `lhs' `inexog' `exexog' `endo' + +* If kernel-robust, data must be tsset. +* Later code maintains tsset-ing for kernel-robust, but can change sort +* order for cluster if not kernel-robust, which would make ts operators +* fail subsequently, so a later call to -tsset- is needed to restore -tsset-ing. +* -sortpreserve- should take care of the rest following exit of ivreg2. +* User-supplied tvar and ivar checked if consistent with tsset. + + capture tsset + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } +* If no panel data, ivar will still be empty + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already -tsset-" + exit 5 + } + if "`r(tdelta)'" != "" { + local tdelta = `r(tdelta)' + } + else { + local tdelta=1 + } + +*********************************************************** + +* dkraay(bw) = clustering on time-series var in a panel + kernel-robust +* Default is zero + if `dkraay' ~= 0 { + if "`ivar'" == "" | "`tvar'" == "" { +di as err "invalid use of dkraay option - must use tsset panel data" + exit 198 + } + local bw "`dkraay'" + if "`cluster'" == "" { + local cluster "`tvar'" + } + else if "`cluster'" ~= "`tvar'" { +di as err "invalid use of dkraay option - must cluster on `tvar' (or omit cluster option)" + exit 198 + } + } + +*********************************************************** + +* HAC estimation. +* If bw is omitted, default `bw' is 0. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. +* If bw or kernel not supplied, set bw=0 so from here on, bw is real. + if "`bw'" == "" & "`kernel'" == "" { + local bw=0 + } + else { +* Check it's a valid kernel and replace with unabbreviated kernel name; check bw. +* s_ivreg210_vkernel is in livreg2 mlib. + mata: s_ivreg210_vkernel("`kernel'", "`bw'", "`ivar'") + local kernel `r(kernel)' + local bw = `r(bw)' +* And force tsused flag to 1 + local tsused = 1 + } + +*********************************************************** + +* Weights +* fweight and aweight accepted as is +* iweight not allowed with robust or gmm and requires a trap below when used with summarize +* pweight is equivalent to aweight + robust +* but in HAC case, robust implied by `kernel' rather than `robust' +* Since we subsequently work with wvar, tsrevar of weight vars in weight `exp' not needed. + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + qui gen double `wvar'=`exp' + } + if "`weight'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "fweight" & "`sw'" != "" { + di in red "fweights currently not supported with -sw- option" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`gmm2s'`kernel'" !="" { + di in red "iweights not allowed with robust or gmm" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + qui gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + qui gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + + if `dofminus' > 0 { + local dofmopt "dofminus(`dofminus')" + } +* Stock-Watson robust SEs. + if "`sw'" ~= "" { + if "`cluster'" ~= "" { +di as err "Stock-Watson robust SEs not supported with -cluster- option" + exit 198 + } + if "`kernel'" ~= "" { +di as err "Stock-Watson robust SEs not supported with -kernel- option" + exit 198 + } + capture xtset + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already tsset or xtset" + exit 5 + } +* Exit with error if ivar is neither supplied nor tsset nor xtset + if "`ivar'"=="" { +di as err "Must -xtset- or -tsset- data or specify -ivar- with -sw- option" + exit 198 + } + qui describe, short varlist + local sortlist "`r(sortlist)'" + tokenize `sortlist' + if "`ivar'"~="`1'" { +di as err "Error - dataset must be sorted on panel var with -sw- option" + exit 198 + } + } + +******************************************************************************** + + marksample touse + markout `touse' `lhs' `inexog' `exexog' `endo' `cluster', strok +* Limit sample to where tvar is available, but only if TS operators used + if `tsused' { + markout `touse' `tvar' + } + +******************************************************************************** + +* Every time a weight is used, must multiply by scalar wf ("weight factor") +* wf=1 for no weights, fw and iw, wf = scalar that normalizes sum to be N if aw or pw + sum `wvar' if `touse' `wtexp', meanonly +* Weight statement + if "`weight'" ~= "" { +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + if "`weight'"=="" | "`weight'"=="fweight" | "`weight'"=="iweight" { +* Effective number of observations is sum of weight variable. +* If weight is "", weight var must be column of ones and N is number of rows + local wf=1 + local N=r(sum_w) + } + else if "`weight'"=="aweight" | "`weight'"=="pweight" { + local wf=r(N)/r(sum_w) + local N=r(N) + } + else { +* Should never reach here +di as err "ivreg2 error - misspecified weights" + exit 198 + } + + if `N'==0 { +di as err "no observations" + exit 2000 + } + +******************************************************************************** +* If kernel-robust, confirm tsset and check for gaps + if `bw' != 0 { +* Data must be tsset for time-series operators in code to work + capture tsset + if "`r(timevar)'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + tsreport if `touse', panel + if `r(N_gaps)' != 0 { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + } + +******************************************************************************** + + tempvar tindex + qui gen `tindex'=1 if `touse' + qui replace `tindex'=sum(`tindex') if `touse' + +* Set local macro T and check that bw < (T-1) +* Also make sure only used sample is checked + if "`tvar'" ~= "" { + sum `tvar' if `touse', meanonly + local T = r(max)-r(min) + 1 + local T1 = `T' - 1 + if (`bw' > (`T1'/`tdelta')) & (`bw' ~= -1) { +di as err "invalid bandwidth in option bw() - cannot exceed timespan of data" + exit 198 + } + } + +* kiefer VCV = kernel(tru) bw(T) and no robust with tsset data + if "`kiefer'" ~= "" { + if "`ivar'" == "" | "`tvar'" == "" { +di as err "invalid use of kiefer option - must use tsset panel data" + exit 198 + } + if "`robust'" ~= "" { +di as err "incompatible options: kiefer and robust" + exit 198 + } + if "`kernel'" ~= "" & "`kernel'" ~= "Truncated" { +di as err "incompatible options: kiefer and bw/kernel" + exit 198 + } + if (`bw'~=0) & (`bw' ~= `T'/`tdelta') { +di as err "incompatible options: kiefer and bw" + exit 198 + } + local kernel "Truncated" + local bw=`T' + } + +*********** Column of ones for constant set up here ************** + + if "`noconstant'"=="" { +* If macro not created, automatically omitted. + tempvar ones + qui gen byte `ones' = 1 if `touse' + } + +************* Duplicates ***************** + + if "`noconstant'" != "" { + local rmcnocons "nocons" + } + +* Check for duplicates of variables +* To mimic official ivreg, in the case of duplicates, +* (1) inexog > endo +* (2) inexog > exexog +* (3) endo + exexog = inexog, as if it were "perfectly predicted" + local dupsen1 : list dups endo + local endo1 : list uniq endo + local dupsex1 : list dups exexog + local exexog1 : list uniq exexog + local dupsin1 : list dups inexog + local inexog1 : list uniq inexog +* Remove inexog from endo + local dupsen2 : list endo1 & inexog1 + local endo1 : list endo1 - inexog1 +* Remove inexog from exexog + local dupsex2 : list exexog1 & inexog1 + local exexog1 : list exexog1 - inexog1 +* Remove endo from exexog + local dupsex3 : list exexog1 & endo1 + local exexog1 : list exexog1 - endo1 + local dups "`dupsen1' `dupsex1' `dupsin1' `dupsen2' `dupsex2' `dupsex3'" + local dups : list uniq dups + + +*********** Collinearities ************************* + +* Also define full set of tempnames for matrices; some used now, some used later + tempname YY yy yyc + tempname XX X1X1 X2X2 X1Z X1Z1 XZ Xy + tempname ZZ Z1Z1 Z2Z2 Z1Z2 Z1X2 Zy ZY Z2y Z2Y + tempname XXinv X2X2inv ZZinv XPZXinv + + if "`nocollin'" == "" { + tempname ccmat + +* Collinearities check using canonical correlations approach +* First, check endo and drop or reclassify as exog regressor + local endo1_ct : word count `endo1' + if `endo1_ct' > 0 { + local Alist "`endo1'" + local Blist "`inexog1' `ones' `exexog1'" + + mata: s_cc_crossprods ("`Alist'", /* + */ "`Blist'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf') + + mat `X1X1'=r(AA) + mat `ZZ'=r(BB) + mat `ZZinv'=r(BBinv) + mat `X1Z'=r(AB) + +* Eigenvalue=1 => included endog is really included exogenous +* Eigenvalue=0 => included endog collinear with other included endog +* Corresponding column names give name of variable + mata: s_cc_collin ( "`ZZ'", /* + */ "`X1X1'", /* + */ "`X1Z'", /* + */ "`ZZinv'") + mat `ccmat'=r(ccmat) + +* Loop through endo1 to find eigenvalues=0 or 1 + local i=1 + foreach vn of varlist `endo1' { + if round(`ccmat'[`i',`i'],10e-7)==0 { +* Collinear with another endog, so remove from endog list + local endo1 : list endo1-vn + local ncollin "`ncollin' `vn'" + } + if round(`ccmat'[`i',`i'],10e-7)==1 { +* Collinear with exogenous, so remove from endog and add to inexog + local endo1 : list endo1-vn + local inexog1 "`inexog1' `vn'" + local ecollin "`ecollin' `vn'" + } + local i=`i'+1 + } + } + +* Check inexog and exexog separately + local inexog1_ct : word count `inexog1' `ones' + if `inexog1_ct' > 1 { + qui _rmcoll `inexog1' if `touse' `wtexp', `noconstant' + local todrop "`r(varlist)'" + local todrop : list inexog1-todrop + local inexog1 "`r(varlist)'" + local collin "`collin' `todrop'" + } + local exexog1_ct : word count `exexog1' + if `exexog1_ct' > 1 { + qui _rmcoll `exexog1' if `touse' `wtexp', nocons + local todrop "`r(varlist)'" + local todrop : list exexog1-todrop + local exexog1 "`r(varlist)'" + local collin "`collin' `todrop'" + } + +* Check exexog vs. inexeg and drop from former if collinear +* Eigenvalue=1 => exexog is collinear with included exogenous + local exexog1_ct : word count `exexog1' + local inexog1_ct : word count `inexog1' `ones' + if `exexog1_ct' > 0 & `inexog1_ct' > 0 { + local Alist "`exexog1'" + local Blist "`inexog1' `ones'" + + mata: s_cc_crossprods ("`Alist'", /* + */ "`Blist'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf') + + mat `Z1Z1'=r(AA) + mat `X2X2'=r(BB) + mat `X2X2inv'=r(BBinv) + mat `Z1X2'=r(AB) + + mata: s_cc_collin ( "`X2X2'", /* + */ "`Z1Z1'", /* + */ "`Z1X2'", /* + */ "`X2X2inv'") + mat `ccmat'=r(ccmat) + +* Loop through exexog1 to find eigenvalues=1 + local i=1 + foreach vn of varlist `exexog1' { + if round(`ccmat'[`i',`i'],10e-7)==1 { +* Excluded exog collinear with included exog, so remove from exexog list + local exexog1 : list exexog1-vn + local collin "`collin' `vn'" + } + local i=`i'+1 + } + } + +* Some collinearities involving inexog/exog wont' be caught by method above, +* so call _rmcoll to catch any remaining ones. + capture _rmcoll `inexog1' `exexog1' if `touse' `wtexp', `rmcnocons' + if _rc == 908 { +di as err "matsize too small" + exit 908 + } + if r(k_omitted) > 0 { + local allinex "`inexog1' `exexog1'" + local noncollin "`r(varlist)'" + local inexcollin : list allinex - noncollin + local inexog1 : list inexog1 - inexcollin + local exexog1 : list exexog1 - inexcollin + local collin "`collin' `inexcollin'" + } + +* Finally, add dropped endogenous to collinear list, trimming down to "" if empty + local collin "`collin' `ncollin'" + local collin : list clean collin + +* Collinearity and duplicates warning messages, if necessary + if "`dups'" != "" { +di in gr "Warning - duplicate variables detected" +di in gr "Duplicates:" _c + Disp `dups', _col(21) + } + if "`ecollin'" != "" { +di in gr "Warning - endogenous variable(s) collinear with instruments" +di in gr "Vars now exogenous:" _c + Disp `ecollin', _col(21) + } + if "`collin'" != "" { +di in gr "Warning - collinearities detected" +di in gr "Vars dropped:" _c + Disp `collin', _col(21) + } + } + + +**** End of collinearities block ************ + +**** Partial-out block ****************** + +* `partial' has all to be partialled out except for constant + if "`partial'" != "" | `partialcons'==1 { + preserve + local partialdrop : list inexog - inexog1 + local partial1 : list partial - partialdrop + local partialcheck : list partial1 - inexog1 + if ("`partialcheck'"~="") { +di in r "Error: `partialcheck' listed in partial() but not in list of regressors." + error 198 + } + local inexog1 : list inexog1 - partial1 +* Check that cluster, weight, tvar or ivar variables won't be transformed + local allvars "`lhs' `inexog' `endo' `exexog'" + if "`cluster'"~="" { + local pvarcheck : list cluster in allvars + if `pvarcheck' { +di in r "Error: cannot use cluster variable `cluster' as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } + if "`tvar'"~="" { + local pvarcheck : list tvar in allvars + if `pvarcheck' { +di in r "Error: cannot use time variable `tvar' as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } + if "`ivar'"~="" { + local pvarcheck : list ivar in allvars + if `pvarcheck' { +di in r "Error: cannot use panel variable `ivar' as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } + if "`wtexp'"~="" { + tokenize `exp', parse("*/()+-^&|~") + local wvartokens `*' + local nwvarnames : list allvars - wvartokens + local wvarnames : list allvars - nwvarnames + if "`wvarnames'"~="" { +di in r "Error: cannot use weight variables as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } +* Constant is partialled out, unless nocons already specified in the first place + capture drop `ones' + local ones "" + tempname partial_resid + foreach var of varlist `lhs' `inexog1' `endo1' `exexog1' { + qui regress `var' `partial1' if `touse' `wtexp', `noconstant' + qui predict double `partial_resid' if `touse', resid + qui replace `var' = `partial_resid' + drop `partial_resid' + } + local partial_ct : word count `partial1' + if "`noconstant'" == "" { +* partial_ct used for small-sample adjustment to regression F-stat + local partial_ct = `partial_ct' + 1 + local noconstant "noconstant" + } + } + else { +* Set count of partial vars to zero if option not used + local partial_ct 0 + local partialcons 0 + } +* Add partial_ct to small dof adjustment sdofminus + if "`nopartialsmall'"=="" { + local sdofminus = `sdofminus'+`partial_ct' + } + +********************************************* + + local insts1 `inexog1' `exexog1' + local rhs1 `endo1' `inexog1' + local iv1_ct : word count `insts1' + local rhs1_ct : word count `rhs1' + local endo1_ct : word count `endo1' + local exex1_ct : word count `exexog1' + local endoexex1_ct : word count `endo1' `exexog1' + local inexog1_ct : word count `inexog1' + + if "`noconstant'" == "" { + local cons 1 + } + else { + local cons 0 + } + +* Counts modified to include constant if appropriate + local iv1_ct = `iv1_ct' + `cons' + local rhs1_ct = `rhs1_ct' + `cons' + + if `rhs1_ct' == 0 { + di in red "error: no regressors specified" + exit 102 + } + + if "`nocollin'" == "" { +* If collinearity check has been done, iv_ct=iv1_ct and rhs_ct=rhs1_ct + local iv_ct = `iv1_ct' + local rhs_ct = `rhs1_ct' + } + else { +* If no full collinearity check, still need to do careful count of Xs and Zs. + qui _rmcoll `endo1' `inexog1', `noconstant' + local rhs_ct : word count `r(varlist)' + qui _rmcoll `exexog1' `inexog1', `noconstant' + local iv_ct : word count `r(varlist)' + local iv_ct = `iv_ct' + `cons' + local rhs_ct = `rhs_ct' + `cons' + } + + if `rhs1_ct' > `iv1_ct' { + di in red "equation not identified; must have at " /* + */ "least as many instruments not in" + di in red "the regression as there are " /* + */ "instrumented variables" + exit 481 + } + + if `bw' != 0 { + local bwopt "bw(`bw')" + } + if "`kernel'"!="" { + local kernopt "kernel(`kernel')" + } +* If depname not provided (default) name is lhs variable + if "`depname'"=="" { + local depname `lhs' + } + +*************** Commonly used matrices (reprise) ************ + + mata: s_crossprods ("`lhs'", /* + */ "`endo1'", /* + */ "`inexog1' `ones'", /* + */ "`exexog1'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N') + mat `XX'=r(XX) + mat `X1X1'=r(X1X1) + mat `X1Z'=r(X1Z) + mat `ZZ'=r(ZZ) + mat `Z2Z2'=r(Z2Z2) + mat `Z1Z2'=r(Z1Z2) + mat `XZ'=r(XZ) + mat `Xy'=r(Xy) + mat `Zy'=r(Zy) + mat `YY'=r(YY) + scalar `yy'=r(yy) + scalar `yyc'=r(yyc) + mat `ZY'=r(ZY) + mat `Z2y'=r(Z2y) + mat `Z2Y'=r(Z2Y) + mat `XXinv'=r(XXinv) + mat `ZZinv'=r(ZZinv) + mat `XPZXinv'=r(XPZXinv) + + +********** CLUSTER SETUP ********************************************** + +* Mata code requires data are sorted on (1) the first var cluster if there +* is only one cluster var; (2) on the 3rd and then 1st if two-way clustering, +* unless (3) two-way clustering is combined with kernel option, in which case +* the data are tsset and sorted on panel id (first cluster variable) and time +* id (second cluster variable). +* Second cluster var is optional and requires an identifier numbered 1..N_clust2, +* unless combined with kernel option, in which case it's the time variable. +* Third cluster var is the intersection of 1 and 2, unless combined with kernel +* opt, in which case it's unnecessary. +* Sorting on "cluster3 cluster1" means that in Mata, panelsetup works for +* both, since cluster1 nests cluster3. +* Note that it is possible to cluster on time but not panel, in which case +* cluster1 is time, cluster2 is empty and data are sorted on panel-time. +* Note also that if data are sorted here but happen to be tsset, will need +* to be re-tsset after estimation code concludes. + + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`kernel'"~="" { +* kernel requires either that cluster1 is time var and cluster2 is empty +* or that cluster1 is panel var and cluster2 is time var. +* Either way, data must be tsset and sorted for panel data. + if "`cluster2'"~="" { +* Allow backwards order + if "`cluster1'"=="`tvar'" & "`cluster2'"=="`ivar'" { + local cluster1 "`2'" + local cluster2 "`1'" + } + if "`cluster1'"~="`ivar'" | "`cluster2'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset panel & time vars." +di as err " tsset panel var=`ivar'; tsset time var=`tvar'; cluster vars=`cluster1',`cluster2'" + exit 198 + } + } + else { + if "`cluster1'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset time variable." +di as err " tsset time var=`tvar'; cluster var=`cluster1'" + exit 198 + } + } + } +* Simple way to get quick count of 1st cluster variable without disrupting sort +* clusterid1 is numbered 1.._Nclust1. + tempvar clusterid1 + qui egen `clusterid1'=group(`cluster1') if `touse' + sum `clusterid1' if `touse', meanonly + if "`cluster2'"=="" { + local N_clust=r(max) + local N_clust1=. + local N_clust2=. + if "`kernel'"=="" { +* Single level of clustering and no kernel-robust, so sort on single cluster var. +* kernel-robust already sorted via tsset. + sort `cluster1' + } + } + else { + local N_clust1=r(max) + if "`kernel'"=="" { + tempvar clusterid2 clusterid3 +* New cluster id vars are numbered 1..N_clust2 and 1..N_clust3 + qui egen `clusterid2'=group(`cluster2') if `touse' + qui egen `clusterid3'=group(`cluster1' `cluster2') if `touse' +* Two levels of clustering and no kernel-robust, so sort on cluster3/nested in/cluster1 +* kernel-robust already sorted via tsset. + sort `clusterid3' `cluster1' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) + } + else { +* Need to create this only to count the number of clusters + tempvar clusterid2 + qui egen `clusterid2'=group(`cluster2') if `touse' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) +* Now replace with original variable + local clusterid2 `cluster2' + } + local N_clust=min(`N_clust1',`N_clust2') + } + } + else { +* No cluster options but for Mata purposes, set N_clust=0 + local N_clust=0 + } + +************************************************************************************************ + + tempname b W S V beta lambda j jp rss mss rmse sigmasq rankV rankS + tempname arubin arubinp arubin_lin arubin_linp + tempname r2 r2_a r2u r2c F Fp Fdf2 ivest + + local cnb "`endo1' `inexog1'" + local cnZ "`exexog1' `inexog1'" + if "`noconstant'"=="" { + local cnb "`cnb' _cons" + local cnZ "`cnZ' _cons" + } + + tempvar resid + qui gen double `resid'=. + +******************************************************************************************* +* LIML +******************************************************************************************* + + if "`liml'`kclassopt'"~="" { + + mata: s_liml( "`ZZ'", /* + */ "`XX'", /* + */ "`XZ'", /* + */ "`Zy'", /* + */ "`Z2Z2'", /* + */ "`YY'", /* + */ "`ZY'", /* + */ "`Z2Y'", /* + */ "`Xy'", /* + */ "`ZZinv'", /* + */ "`lhs'", /* + */ "`lhs' `endo1'", /* + */ "`resid'", /* + */ "`endo1' `inexog1' `ones'", /* + */ "`endo1'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`exexog1'", /* + */ "`inexog1' `ones'", /* + */ `fuller', /* + */ `kclass', /* + */ "`coviv'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`ivar'", /* + */ "`tvar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ `dofminus') + + mat `b'=r(beta) + mat `S'=r(S) + mat `V'=r(V) + scalar `lambda'=r(lambda) + local kclass=r(kclass) + scalar `j'=r(j) + scalar `rss'=r(rss) + scalar `sigmasq'=r(sigmasq) + + scalar `arubin'=(`N'-`dofminus')*ln(`lambda') + scalar `arubin_lin'=(`N'-`dofminus')*(`lambda'-1) + + } + +******************************************************************************************* +* OLS, IV and 2SGMM. Also enter to get CUE starting values. +************************************************************************************************ + if "`liml'`kclassopt'`b0'"=="" { +* Check user-supplied S matrix + if "`smatrix'" != "" { + tempname S0 + matrix `S0'=`smatrix' +* Rearrange/select columns to mat IV matrix + capture matsort `S0' "`cnZ'" + local srows = rowsof(`S0') + local scols = colsof(`S0') + local zcols : word count `cnZ' + if _rc ~= 0 | (`srows'~=`zcols') | (`scols'~=`zcols') { +di as err "-smatrix- option error: supplied matrix columns/rows do not match IV list" +exit 198 + } + if issymmetric(`S0')==0 { +di as err "-smatrix- option error: supplied matrix is not symmetric" +exit 198 + } + } + +* First call to s_gmm. +* If W or S supplied, calculates GMM beta and residuals +* If b0 supplied, calculates residuals +* If none of the above supplied, calculates GMM beta using default IV weighting matrix and residuals + + mata: s_gmm1s( "`ZZ'", /* + */ "`XX'", /* + */ "`XZ'", /* + */ "`Zy'", /* + */ "`ZZinv'", /* + */ "`lhs'", /* + */ "`resid'", /* + */ "`endo1' `inexog1' `ones'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`wmatrix'", /* + */ "`S0'", /* + */ `dofminus') + + mat `b'=r(beta) + mat `W'=r(W) + +* Block calls s_omega to get cov matrix of orthog conditions, if not supplied + if "`smatrix'"~="" { + mat `S'=`S0' + } + else { + +* NB: xtivreg2 calls ivreg2 with data sorted on ivar and optionally tvar. +* Stock-Watson adjustment -sw- assumes data are sorted on ivar. Checked at start of ivreg2. + +* call abw code if bw() is defined and bw(auto) selected + if `bw' != 0 { + if `bw' == -1 { + tempvar abwtouse + gen byte `abwtouse' = (`resid' < .) + abw `resid' `exexog1' `inexog1' `abwtouse', /* + */ tindex(`tindex') nobs(`N') tobs(`T') noconstant kernel(`kernel') + local bw `r(abw)' + local bwopt "bw(`bw')" + local bwchoice "`r(bwchoice)'" + } + } +* S covariance matrix of orthogonality conditions +// cfb B102 +// loc klc = cond("`kernel'" == "Quadratic-Spectral", "Quadratic spectral", "`kernel'") + mata: s_omega( "`ZZ'", /* + */ "`resid'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`ivar'", /* + */ "`tvar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ `dofminus') + mat `S'=r(S) + } + +* By this point: `b' has 1st step beta +* `resid' has resids from the above beta +* `S' has vcv of orthog conditions using either `resid' or user-supplied `S0' + +* Efficient IV. S calculated above. W replaced here. + if "`gmm2s'`robust'`cluster'`kernel'"=="" { + mata: s_egmm( "`ZZ'", /* + */ "`XX'", /* + */ "`XZ'", /* + */ "`Zy'", /* + */ "`ZZinv'", /* + */ "`lhs'", /* + */ "`resid'", /* + */ "`endo1' `inexog1' `ones'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`S'", /* + */ `dofminus') + mat `W'=r(W) + } + +* Inefficient IV. S, W and b calculated above. + if "`gmm2s'"=="" & "`robust'`cluster'`kernel'"~="" { + mata: s_iegmm( "`ZZ'", /* + */ "`XX'", /* + */ "`XZ'", /* + */ "`Zy'", /* + */ "`lhs'", /* + */ "`resid'", /* + */ "`endo1' `inexog1' `ones'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`W'", /* + */ "`S'", /* + */ "`b'", /* + */ `dofminus') + } +* 2-step efficient GMM. S calculated above, b and W are empty. + if "`gmm2s'"~="" { + mata: s_egmm( "`ZZ'", /* + */ "`XX'", /* + */ "`XZ'", /* + */ "`Zy'", /* + */ "`ZZinv'", /* + */ "`lhs'", /* + */ "`resid'", /* + */ "`endo1' `inexog1' `ones'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`S'", /* + */ `dofminus') + mat `b'=r(beta) + mat `W'=r(W) + } + + mat `V'=r(V) + scalar `j'=r(j) + scalar `rss'=r(rss) + scalar `sigmasq'=r(sigmasq) + +* Finished with non-CUE/LIML block + } +*************************************************************************************** +* Block for cue gmm +******************************************************************************************* + if "`cue'`b0'" != "" { + +* s_gmmcue is passed initial b from IV/2-step GMM block above +* OR user-supplied b0 for evaluation of CUE obj function at b0 + mata: s_gmmcue( "`ZZ'", /* + */ "`XZ'", /* + */ "`lhs'", /* + */ "`resid'", /* + */ "`endo1' `inexog1' `ones'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`ivar'", /* + */ "`tvar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ "`b'", /* + */ "`b0'", /* + */ `dofminus') + + mat `b'=r(beta) + mat `S'=r(S) + mat `W'=r(W) + mat `V'=r(V) + scalar `j'=r(j) + scalar `rss'=r(rss) + scalar `sigmasq'=r(sigmasq) + + } + +**************************************************************** +* Done with estimation blocks +**************************************************************** + + mat colnames `b' = `cnb' + mat colnames `V' = `cnb' + mat rownames `V' = `cnb' + mat colnames `S' = `cnZ' + mat rownames `S' = `cnZ' +* No W matrix for LIML or kclass + capture mat colnames `W' = `cnZ' + capture mat rownames `W' = `cnZ' + tempname tempmat + mat `tempmat'=syminv(`V') + scalar `rankV'=rowsof(`tempmat') - diag0cnt(`tempmat') + mat `tempmat'=syminv(`S') + scalar `rankS'=rowsof(`tempmat') - diag0cnt(`tempmat') + +******************************************************************************************* +* RSS, counts, dofs, F-stat, small-sample corrections +******************************************************************************************* + + scalar `rmse'=sqrt(`sigmasq') + if "`noconstant'"=="" { + scalar `mss'=`yyc' - `rss' + } + else { + scalar `mss'=`yy' - `rss' + } + + local Fdf1 = `rhs_ct' - `cons' + local df_m = `rhs_ct' - `cons' + (`sdofminus'-`partialcons') + +* Residual dof + if "`cluster'"=="" { +* Use int(`N') because of non-integer N with iweights, and also because of +* possible numeric imprecision with N returned by above. + local df_r = int(`N') - `rhs_ct' - `dofminus' - `sdofminus' + } + else { +* To match Stata, subtract 1 + local df_r = `N_clust' - 1 + } + +* Sargan-Hansen J dof and p-value +* df=0 doesn't guarantee j=0 since can be call to get value of CUE obj fn + local jdf = `iv_ct' - `rhs_ct' + if `jdf' == 0 & "`b0'"=="" { + scalar `j' = 0 + } + else { + scalar `jp' = chiprob(`jdf',`j') + } + if "`liml'"~="" { + scalar `arubinp' = chiprob(`jdf',`arubin') + scalar `arubin_linp' = chiprob(`jdf',`arubin_lin') + } + +* Small sample corrections for var-cov matrix. +* If robust, the finite sample correction is N/(N-K), and with no small +* we change this to 1 (a la Davidson & MacKinnon 1993, p. 554, HC0). +* If cluster, the finite sample correction is (N-1)/(N-K)*M/(M-1), and with no small +* we change this to 1 (a la Wooldridge 2002, p. 193), where M=number of clusters. + + if "`small'" != "" { + if "`cluster'"=="" { + matrix `V'=`V'*(`N'-`dofminus')/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + } + else { + matrix `V'=`V'*(`N'-1)/(`N'-`rhs_ct'-`sdofminus') /* + */ * `N_clust'/(`N_clust'-1) + } + scalar `sigmasq'=`rss'/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + scalar `rmse'=sqrt(`sigmasq') + } + + scalar `r2u'=1-`rss'/`yy' + scalar `r2c'=1-`rss'/`yyc' + if "`noconstant'"=="" { + scalar `r2'=`r2c' + scalar `r2_a'=1-(1-`r2')*(`N'-1)/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + } + else { + scalar `r2'=`r2u' + scalar `r2_a'=1-(1-`r2')*`N'/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + } +* `N' is rounded down to nearest integer if iweights are used. +* If aw, pw or fw, should already be integer but use round in case of numerical imprecision. + local N=int(`N') + +* Fstat +* To get it to match Stata's, must post separately with dofs and then do F stat by hand +* in case weights generate non-integer obs and dofs +* Create copies so they can be posted + tempname FB FV + mat `FB'=`b' + mat `FV'=`V' + capture ereturn post `FB' `FV' +* If the cov matrix wasn't positive definite, the post fails with error code 506 + local rc = _rc + if `rc' != 506 { + local Frhs1 `rhs1' + capture test `Frhs1' + if "`small'" == "" { + if "`cluster'"=="" { + capture scalar `F' = r(chi2)/`Fdf1' * `df_r'/(`N'-`dofminus') + } + else { + capture scalar `F' = r(chi2)/`Fdf1' * /* +* sdofminus used here so that F-stat matches test stat from regression with no partial and small + */ (`N_clust'-1)/`N_clust' * (`N'-`rhs_ct'-`sdofminus')/(`N'-1) + } + } + else { + capture scalar `F' = r(chi2)/`Fdf1' + } + capture scalar `Fp'=Ftail(`Fdf1',`df_r',`F') + capture scalar `Fdf2'=`df_r' + } + +* If j==. or vcv wasn't full rank, then vcv problems and F is meaningless + if `j' == . | `rc'==506 { + scalar `F' = . + scalar `Fp' = . + } + +* End of counts, dofs, F-stat, small sample corrections + +******************************************************************************************** +* Reduced form and first stage regression options +******************************************************************************************* +* Relies on proper count of (non-collinear) IVs generated earlier. +* Note that nocons option + constant in instrument list means first-stage +* regressions are reported with nocons option. First-stage F-stat therefore +* correctly includes the constant as an explanatory variable. + + if "`rf'`saverf'`first'`ffirst'`savefirst'" != "" & (`endo1_ct' > 0) & "`noid'"=="" { +* Restore original order if changed for mata code above + capture tsset +* Reduced form needed for AR first-stage test stat. Also estimated if requested. + tempname archi2 archi2p arf arfp ardf ardf_r sstat sstatp sstatdf + doRF "`lhs'" "`inexog1'" "`exexog1'" /* + */ `touse' `"`wtexp'"' `"`noconstant'"' `"`robust'"' /* + */ `"`clopt'"' `"`bwopt'"' `"`kernopt'"' /* + */ `"`saverfprefix'"' /* + */ "`dofminus'" "`sdofminus'" `"`sw'"' `"`psd'"' "`ivreg2_cmd'" + scalar `archi2'=r(archi2) + scalar `archi2p'=r(archi2p) + scalar `arf'=r(arf) + scalar `arfp'=r(arfp) + scalar `ardf'=r(ardf) + scalar `ardf_r'=r(ardf_r) + local rfeq "`r(rfeq)'" +* Drop saved rf results if needed only for first-stage estimations + if "`rf'`saverf'" == "" { + capture estimates drop `rfeq' + } +* Stock-Wright S statistic. Equiv to J LM test of exexog. +* Note that Z2==X2 so Z2Z2 is X2X2 and Z2y is X2y + tempname swresid + qui gen double `swresid'=. + +* mata code requires sorting on cluster 3 / cluster 1 (if 2-way) or cluster 1 (if one-way) + if "`cluster'"!="" { + sort `clusterid3' `cluster1' + } + mata: s_sstat( "`Z2Z2'", /* + */ "`Z1Z2'", /* + */ "`Z2y'", /* + */ "`lhs'", /* + */ "`swresid'", /* + */ "`inexog1' `ones'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`exexog1'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`ivar'", /* + */ "`tvar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ `dofminus' /* + */ ) + + scalar `sstat'=r(j) + scalar `sstatdf'=`ardf' + scalar `sstatp'=chiprob(`sstatdf',`sstat') + } + + if "`first'`ffirst'`savefirst'" != "" & (`endo1_ct' > 0) { +* Restore original order if changed for mata code above + capture tsset + + if `iv1_ct' > `iv_ct' { +di +di in gr "Warning: collinearities detected among instruments" +di in gr "1st stage tests of excluded exogenous variables may be incorrect" + } + local sdofmopt = "sdofminus(`sdofminus')" + if "`first'`savefirst'" ~= "" { + doFirst "`endo1'" "`inexog1'" "`exexog1'" /* + */ `touse' `"`wtexp'"' `"`noconstant'"' `"`robust'"' /* + */ `"`clopt'"' `"`bwopt'"' `"`kernopt'"' /* + */ `"`savefprefix'"' `"`dofmopt'"' `"`sdofmopt'"' /* + */ `"`sw'"' `"`psd'"' "`ivreg2_cmd'" + local firsteqs "`r(firsteqs)'" + } + +* Need to create Stata placeholders for Mata code so that Stata time-series operators can work on them + tempname firstmat + tempname fsresid + qui gen double `fsresid'=. + tsrevar `endo1' + local ts_endo1 "`r(varlist)'" + foreach x of local ts_endo1 { + tempname `x'_hat + qui gen double ``x'_hat' = . + local endo1_hat "`endo1_hat' ``x'_hat'" + } + +* mata code requires sorting on cluster 3 / cluster 1 (if 2-way) or cluster 1 (if one-way) + if "`cluster'"!="" { + sort `clusterid3' `cluster1' + } + mata: s_ffirst( "`ZZ'", /* + */ "`XX'", /* + */ "`XZ'", /* + */ "`ZZinv'", /* + */ "`XXinv'", /* + */ "`XPZXinv'", /* + */ "`fsresid'", /* + */ "`endo1'", /* + */ "`endo1_hat'", /* + */ "`inexog1' `ones'", /* + */ "`exexog1'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ `N_clust', /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`ivar'", /* + */ "`tvar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ `dofminus', /* + */ `sdofminus') + + mat `firstmat' = r(firstmat) + mat rowname `firstmat' = sheapr2 pr2 F df df_r pvalue APF APFdf1 APFdf2 APFp APchi2 APchi2p APr2 + mat colname `firstmat' = `endo1' + + } +* End of first-stage regression code + +******************************************************************************************* +* Re-tsset if necessary +************************************************************************************************ + + capture tsset + +******************************************************************************************* +* orthog option: C statistic (difference of Sargan statistics) +******************************************************************************************* +* Requires j dof from above + if "`orthog'"!="" { + tempname cj cstat cstatp +* Initialize cstat + scalar `cstat' = 0 +* Each variable listed must be in instrument list. +* To avoid overwriting, use cendo, cinexog1, cexexog, cendo_ct, cex_ct + local cendo1 "`endo1'" + local cinexog1 "`inexog1'" + local cexexog1 "`exexog1'" + local cinsts1 "`insts1'" + local crhs1 "`rhs1'" + local clist1 "`orthog'" + local clist_ct : word count `clist1' + +* Check to see if c-stat vars are in original list of all ivs +* cinexog1 and cexexog1 are after c-stat exog list vars have been removed +* cendo1 is endo1 after included exog being tested has been added + foreach x of local clist1 { + local llex_ct : word count `cexexog1' + local cexexog1 : list cexexog1 - x + local cex1_ct : word count `cexexog1' + local ok = `llex_ct' - `cex1_ct' + if (`ok'==0) { +* Not in excluded, check included and add to endog list if it appears + local llin_ct : word count `cinexog1' + local cinexog1 : list cinexog1 - x + local cin1_ct : word count `cinexog1' + local ok = `llin_ct' - `cin1_ct' + if (`ok'==0) { +* Not in either list +di in r "Error: `x' listed in orthog() but does not appear as exogenous." + error 198 + } + else { + local cendo1 "`cendo1' `x'" + } + } + } + +* If robust, HAC/AC or GMM (but not LIML or IV), create optimal weighting matrix to pass to ivreg2 +* by extracting the submatrix from the full S and then inverting. +* This guarantees the C stat will be non-negative. See Hayashi (2000), p. 220. +* Calculate C statistic with recursive call to ivreg2 +* Collinearities may cause problems, hence -capture-. +* smatrix works generally, including homoskedastic case with Sargan stat + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + if "`kernel'" != "" { + local bwopt "bw(`bw')" + local kernopt "kernel(`kernel')" + } +* clopt is omitted because it requires calculation of numbers of clusters, which is done +* only when S matrix is calculated + capture `ivreg2_cmd' `lhs' `cinexog1' /* + */ (`cendo1'=`cexexog1') /* + */ if `touse' `wtexp', `noconstant' /* + */ `options' `small' `robust' /* + */ `gmm2s' `bwopt' `kernopt' `dofmopt' `sw' `psd' /* + */ smatrix("`S'") noid nocollin + local rc = _rc + if `rc' == 481 { + scalar `cstat' = 0 + local cstatdf = 0 + } + else { + scalar `cj'=e(j) + local cjdf=e(jdf) + scalar `cstat' = `j' - `cj' + local cstatdf = `jdf' - `cjdf' + } + _estimates unhold `ivest' + scalar `cstatp'= chiprob(`cstatdf',`cstat') +* Collinearities may cause C-stat dof to differ from the number of variables in orthog() +* If so, set cstat=0 + if `cstatdf' != `clist_ct' { + scalar `cstat' = 0 + } + } +* End of orthog block + +******************************************************************************************* +* Endog option +******************************************************************************************* +* Uses recursive call with orthog + if "`endogtest'"!="" { + tempname estat estatp +* Initialize estat + scalar `estat' = 0 +* Each variable to test must be in endo list. +* To avoid overwriting, use eendo, einexog1, etc. + local eendo1 "`endo1'" + local einexog1 "`inexog1'" + local einsts1 "`insts1'" + local elist1 "`endogtest'" + local elist_ct : word count `elist1' +* Check to see if endog test vars are in original endo1 list of endogeneous variables +* eendo1 and einexog1 are after endog test vars have been removed from endo and added to inexog + foreach x of local elist1 { + local llendo_ct : word count `eendo1' + local eendo1 : list eendo1 - x + local eendo1_ct : word count `eendo1' + local ok = `llendo_ct' - `eendo1_ct' + if (`ok'==0) { +* Not in endogenous list +di in r "Error: `x' listed in endog() but does not appear as endogenous." + error 198 + } + else { + local einexog1 "`einexog1' `x'" + } + } +* Recursive call to ivreg2 using orthog option to obtain endogeneity test statistic +* Collinearities may cause problems, hence -capture-. + capture { + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + capture `ivreg2_cmd' `lhs' `einexog1' /* + */ (`eendo1'=`exexog1') if `touse' /* + */ `wtexp', `noconstant' `robust' `clopt' /* + */ `gmm2s' `liml' `bwopt' `kernopt' /* + */ `small' `dofmopt' `sw' `psd' `options' /* + */ orthog(`elist1') noid nocollin + local rc = _rc + if `rc' == 481 { + scalar `estat' = 0 + local estatdf = 0 + } + else { + scalar `estat'=e(cstat) + local estatdf=e(cstatdf) + scalar `estatp'=e(cstatp) + } + _estimates unhold `ivest' +* Collinearities may cause endog stat dof to differ from the number of variables in endog() +* If so, set estat=0 + if `estatdf' != `elist_ct' { + scalar `estat' = 0 + } + } +* End of endogeneity test block + } + +******************************************************************************************* +* Rank identification and redundancy block +******************************************************************************************* + if `endo1_ct' > 0 & "`noid'"=="" { + +* id=underidentification statistic, wid=weak identification statistic + tempname idrkstat widrkstat iddf idp + tempname ccf cdf rkf cceval cdeval cd cc + tempname idstat widstat + +* Anderson canon corr underidentification statistic if homo, rk stat if not +* Need only id stat for testing full rank=(#cols-1) + qui `ranktest_cmd' (`endo1') (`exexog1') `wtexp' if `touse', partial(`inexog1') full /* + */ `noconstant' `robust' `clopt' `bwopt' `kernopt' + if "`cluster'"=="" { + scalar `idstat'=r(chi2)/r(N)*(`N'-`dofminus') + } + else { +* No dofminus adjustment needed for cluster-robust + scalar `idstat'=r(chi2) + } + mat `cceval'=r(ccorr) + mat `cdeval' = J(1,`endo1_ct',.) + forval i=1/`endo1_ct' { + mat `cceval'[1,`i'] = (`cceval'[1,`i'])^2 + mat `cdeval'[1,`i'] = `cceval'[1,`i'] / (1 - `cceval'[1,`i']) + } + local iddf = `iv_ct' - (`rhs_ct'-1) + scalar `idp' = chiprob(`iddf',`idstat') +* Cragg-Donald F statistic. +* Under homoskedasticity, Wald cd eigenvalue = cc/(1-cc) Anderson canon corr eigenvalue. + scalar `cd'=`cdeval'[1,`endo1_ct'] + scalar `cdf'=`cd'*(`N'-`sdofminus'-`iv_ct'-`dofminus')/`exex1_ct' + +* Weak id statistic is Cragg-Donald F stat, rk Wald F stat if not + if "`robust'`cluster'`kernel'"=="" { + scalar `widstat'=`cdf' + } + else { +* Need only test of full rank + qui `ranktest_cmd' (`endo1') (`exexog1') `wtexp' if `touse', partial(`inexog1') full wald /* + */ `noconstant' `robust' `clopt' `bwopt' `kernopt' +* sdofminus used here so that F-stat matches test stat from regression with no partial + if "`cluster'"=="" { + scalar `rkf'=r(chi2)/r(N)*(`N'-`iv_ct'-`sdofminus'-`dofminus')/`exex1_ct' + } + else { + scalar `rkf'=r(chi2)/(`N'-1) /* + */ *(`N'-`iv_ct'-`sdofminus') /* + */ *(`N_clust'-1)/`N_clust' /`exex1_ct' + } + scalar `widstat'=`rkf' + } + } + +* LM redundancy test + if `endo1_ct' > 0 & "`redundant'" ~= "" & "`noid'"=="" { +* Use K-P rk statistics and LM version of test +* Statistic is the rank of the matrix of Z_1B*X_2, where Z_1B are the possibly redundant +* instruments and X_1 are the endogenous regressors; both have X_2 (exogenous regressors) +* and Z_1A (maintained excluded instruments) partialled out. LM test of rank is +* is numerically equivalent to estimation of set of RF regressions and performing +* standard LM test of possibly redundant instruments. + + local redlist1 "`redundant'" + local rexexog1 : list exexog1 - redlist1 + local notlisted : list redlist1 - exexog1 + if "`notlisted'" ~= "" { +di in r "Error: `notlisted' listed in redundant() but does not appear as excluded instrument." + error 198 + } + local rexexog1_ct : word count `rexexog1' + if `rexexog1_ct' < `endo1_ct' { +di in r "Error: specification with redundant() option is unidentified (fails rank condition)" + error 198 + } +* LM version requires only -nullrank- rk statistics so would not need -all- option + tempname rkmatrix + qui `ranktest_cmd' (`endo1') (`redlist1') `wtexp' if `touse', partial(`inexog1' `rexexog1') null /* + */ `noconstant' `robust' `clopt' `bwopt' `kernopt' + mat `rkmatrix'=r(rkmatrix) + tempname redstat redp + local redlist_ct : word count `redlist1' +* dof adjustment needed because it doesn't use the adjusted S + if "`cluster'"=="" { + scalar `redstat' = `rkmatrix'[1,1]/r(N)*(`N'-`dofminus') + } + else { +* No dofminus adjustment needed for cluster-robust + scalar `redstat' = `rkmatrix'[1,1] + } + local reddf = `endo1_ct'*`redlist_ct' + scalar `redp' = chiprob(`reddf',`redstat') + } + +* End of identification stats block + +******************************************************************************************* +* Error-checking block +******************************************************************************************* + +* Check if adequate number of observations + if `N' <= `iv_ct' { +di in r "Error: number of observations must be greater than number of instruments" +di in r " including constant." + error 2001 + } + +* Check if robust VCV matrix is of full rank + if ("`gmm2s'`robust'`cluster'`kernel'" != "") & (`rankS' < `iv_ct') { +* Robust covariance matrix not of full rank means either a singleton dummy or too few +* clusters (in which case the indiv SEs are OK but no F stat or 2-step GMM is possible), +* or there are too many AC/HAC-lags, or the HAC covariance estimator +* isn't positive definite (possible with truncated and Tukey-Hanning kernels) +* Previous versions of ivreg2 exited if 2-step GMM but beta and VCV may be OK. +* Continue but J, F, and C stat (if present) all meaningless. +* Must set Sargan-Hansen j = missing so that problem can be reported in output. + scalar `j' = . + if "`orthog'"!="" { + scalar `cstat' = . + } + if "`endogtest'"!="" { + scalar `estat' = . + } + } + +* End of error-checking block + +********************************************************************************************** +* Post and display results. +******************************************************************************************* + +* restore data if preserved for partial option + if `partial_ct' { + restore + } + + if "`small'"!="" { + local NminusK = `N'-`rhs_ct'-`sdofminus' + capture ereturn post `b' `V', dep(`depname') obs(`N') esample(`touse') /* + */ dof(`NminusK') + } + else { + capture ereturn post `b' `V', dep(`depname') obs(`N') esample(`touse') + } + local rc = _rc + if `rc' == 504 { +di in red "Error: estimated variance-covariance matrix has missing values" + exit 504 + } + if `rc' == 506 { +di in red "Error: estimated variance-covariance matrix not positive-definite" + exit 506 + } + if `rc' > 0 { +di in red "Error: estimation failed - could not post estimation results" + exit `rc' + } + + ereturn local instd `endo' + local insts : colnames `S' +* Stata convention is to exclude constant from instrument list +* Need word option so that varnames with "_cons" in them aren't zapped + local insts : subinstr local insts "_cons" "", word + ereturn local insts `insts' + ereturn local inexog `inexog' + ereturn local exexog `exexog' + ereturn local partial `partial' + ereturn scalar inexog_ct=`inexog1_ct' + ereturn scalar exexog_ct=`exex1_ct' + ereturn scalar endog_ct =`endo1_ct' + ereturn scalar partial_ct =`partial_ct' + if "`collin'`ecollin'`dups'" != "" | `partial_ct' > 0 { + ereturn local collin `collin' + ereturn local ecollin `ecollin' + ereturn local dups `dups' + ereturn local instd1 `endo1' + ereturn local inexog1 `inexog1' + ereturn local exexog1 `exexog1' + ereturn local partial1 `partial1' + } + + if "`smatrix'" == "" { + ereturn matrix S `S' + } + else { +* Create a copy so posting doesn't zap the original + tempname Scopy + mat `Scopy'=`smatrix' + ereturn matrix S `Scopy' + } + +* No weighting matrix defined for LIML and kclass + if "`wmatrix'"=="" & "`liml'`kclassopt'"=="" { + ereturn matrix W `W' + } + else if "`liml'`kclassopt'"=="" { +* Create a copy so posting doesn't zap the original + tempname Wcopy + mat `Wcopy'=`wmatrix' + ereturn matrix W `Wcopy' + } + + if "`kernel'"!="" { + ereturn local kernel "`kernel'" + ereturn scalar bw=`bw' + ereturn local tvar "`tvar'" + if "`ivar'" ~= "" { + ereturn local ivar "`ivar'" + } + if "`bwchoice'" ~= "" { + ereturn local bwchoice "`bwchoice'" + } + } + + if "`small'"!="" { + ereturn scalar df_r=`df_r' + ereturn local small "small" + } + if "`nopartialsmall'"=="" { + ereturn local partialsmall "small" + } + + + if "`robust'" != "" { + local vce "robust" + } + if "`cluster1'" != "" { + if "`cluster2'"=="" { + local vce "`vce' cluster" + } + else { + local vce "`vce' two-way cluster" + } + } + if "`kernel'" != "" { + if "`robust'" != "" { + local vce "`vce' hac" + } + else { + local vce "`vce' ac" + } + local vce "`vce' `kernel' bw=`bw'" + } + if "`sw'" != "" { + local vce "`vce' sw" + } + if "`psd'" != "" { + local vce "`vce' `psd'" + } + local vce : list clean vce + local vce = lower("`vce'") + ereturn local vce `vce' + + if "`cluster'"!="" { + ereturn scalar N_clust=`N_clust' + ereturn local clustvar `cluster' + } + if "`cluster2'"!="" { + ereturn scalar N_clust1=`N_clust1' + ereturn scalar N_clust2=`N_clust2' + ereturn local clustvar1 `cluster1' + ereturn local clustvar2 `cluster2' + } + + if "`robust'`cluster'" != "" { + ereturn local vcetype "Robust" + } + + ereturn scalar df_m=`df_m' + ereturn scalar sdofminus=`sdofminus' + ereturn scalar dofminus=`dofminus' + ereturn scalar r2=`r2' + ereturn scalar rmse=`rmse' + ereturn scalar rss=`rss' + ereturn scalar mss=`mss' + ereturn scalar r2_a=`r2_a' + ereturn scalar F=`F' + ereturn scalar Fp=`Fp' + ereturn scalar Fdf1=`Fdf1' + ereturn scalar Fdf2=`Fdf2' + ereturn scalar yy=`yy' + ereturn scalar yyc=`yyc' + ereturn scalar r2u=`r2u' + ereturn scalar r2c=`r2c' + ereturn scalar rankzz=`iv_ct' + ereturn scalar rankxx=`rhs_ct' + if "`gmm2s'`robust'`cluster'`kernel'" != "" { + ereturn scalar rankS=`rankS' + } + ereturn scalar rankV=`rankV' + ereturn scalar ll = -0.5 * (`N'*ln(2*_pi) + `N'*ln(`rss'/`N') + `N') + +* Always save J. Also save as Sargan if homoskedastic; save A-R if LIML. + ereturn scalar j=`j' + ereturn scalar jdf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar jp=`jp' + } + if ("`robust'`cluster'"=="") { + ereturn scalar sargan=`j' + ereturn scalar sargandf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar sarganp=`jp' + } + } + if "`liml'"!="" { + ereturn scalar arubin=`arubin' + ereturn scalar arubin_lin=`arubin_lin' + if `j' != 0 & `j' != . { + ereturn scalar arubinp=`arubinp' + ereturn scalar arubin_linp=`arubin_linp' + } + ereturn scalar arubindf=`jdf' + } + + if "`orthog'"!="" { + ereturn scalar cstat=`cstat' + if `cstat'!=0 & `cstat' != . { + ereturn scalar cstatp=`cstatp' + ereturn scalar cstatdf=`cstatdf' + ereturn local clist `clist1' + } + } + + if "`endogtest'"!="" { + ereturn scalar estat=`estat' + if `estat'!=0 & `estat' != . { + ereturn scalar estatp=`estatp' + ereturn scalar estatdf=`estatdf' + ereturn local elist `elist1' + } + } + + if `endo1_ct' > 0 & "`noid'"=="" { + ereturn scalar idstat=`idstat' + ereturn scalar iddf=`iddf' + ereturn scalar idp=`idp' + ereturn scalar cd=`cd' + ereturn scalar widstat=`widstat' + ereturn scalar cdf=`cdf' + capture ereturn matrix ccev=`cceval' + capture ereturn matrix cdev `cdeval' + capture ereturn scalar rkf=`rkf' + } + + if "`redundant'"!="" & "`noid'"=="" { + ereturn scalar redstat=`redstat' + ereturn scalar redp=`redp' + ereturn scalar reddf=`reddf' + ereturn local redlist `redlist1' + } + + if "`first'`ffirst'`savefirst'" != "" & `endo1_ct'>0 & "`noid'"=="" { +* Capture here because firstmat empty if mvs encountered in 1st stage regressions + capture ereturn matrix first `firstmat' + ereturn scalar arf=`arf' + ereturn scalar arfp=`arfp' + ereturn scalar archi2=`archi2' + ereturn scalar archi2p=`archi2p' + ereturn scalar ardf=`ardf' + ereturn scalar ardf_r=`ardf_r' + ereturn scalar sstat=`sstat' + ereturn scalar sstatp=`sstatp' + ereturn scalar sstatdf=`sstatdf' + ereturn local firsteqs `firsteqs' + } + if "`rf'`saverf'" != "" & `endo1_ct'>0 { + ereturn local rfeq `rfeq' + } + + ereturn local depvar `lhs' + + if "`liml'"!="" { + ereturn local model "liml" + ereturn scalar kclass=`kclass' + ereturn scalar lambda=`lambda' + if `fuller' > 0 & `fuller' < . { + ereturn scalar fuller=`fuller' + } + } + else if "`kclassopt'" != "" { + ereturn local model "kclass" + ereturn scalar kclass=`kclass' + } + else if "`gmm2s'`cue'`b0'`wmatrix'"=="" { + if "`endo1'" == "" { + ereturn local model "ols" + } + else { + ereturn local model "iv" + } + } + else if "`cue'`b0'"~="" { + ereturn local model "cue" + } + else if "`gmm2s'"~="" { + ereturn local model "gmm2s" + } + else if "`wmatrix'"~="" { + ereturn local model "gmmw" + } + else { +* Should never enter here + ereturn local model "unknown" + } + + if "`weight'" != "" { + ereturn local wexp "=`exp'" + ereturn local wtype `weight' + } + ereturn local cmd `ivreg2_cmd' + ereturn local cmdline `cmdline' + ereturn local version `lversion' + ereturn scalar cons=`cons' + ereturn scalar partialcons=`partialcons' + + ereturn local predict "`ivreg2_cmd'_p" + + if "`e(model)'"=="gmm2s" & "`wmatrix'"=="" { + local title2 "2-Step GMM estimation" + } + else if "`e(model)'"=="gmm2s" & "`wmatrix'"~="" { + local title2 "2-Step GMM estimation with user-supplied first-step weighting matrix" + } + else if "`e(model)'"=="gmmw" { + local title2 "GMM estimation with user-supplied weighting matrix" + } + else if "`e(model)'"=="cue" & "`b0'"=="" { + local title2 "CUE estimation" + } + else if "`e(model)'"=="cue" & "`b0'"~="" { + local title2 "CUE evaluated at user-supplied parameter vector" + } + else if "`e(model)'"=="ols" { + local title2 "OLS estimation" + } + else if "`e(model)'"=="iv" { + local title2 "IV (2SLS) estimation" + } + else if "`e(model)'"=="liml" { + local title2 "LIML estimation" + } + else if "`e(model)'"=="kclass" { + local title2 "k-class estimation" + } + else { +* Should never reach here + local title2 "unknown estimation" + } + if "`e(vcetype)'" == "Robust" { + local hacsubtitle1 "heteroskedasticity" + } + if "`e(kernel)'"!="" & "`e(clustvar)'"=="" { + local hacsubtitle3 "autocorrelation" + } + if "`kiefer'"!="" { + local hacsubtitle3 "within-cluster autocorrelation (Kiefer)" + } + if "`e(clustvar)'"!="" { + if "`e(clustvar2)'"=="" { + local hacsubtitle3 "clustering on `e(clustvar)'" + } + else { + local hacsubtitle3 "clustering on `e(clustvar1)' and `e(clustvar2)'" + } + if "`e(kernel)'" != "" { + local hacsubtitle4 "and kernel-robust to common correlated disturbances (Driscoll-Kraay)" + } + } + if "`hacsubtitle1'"~="" & "`hacsubtitle3'" ~= "" { + local hacsubtitle2 " and " + } + if "`title'"=="" { + ereturn local title "`title1'`title2'" + } + else { + ereturn local title "`title'" + } + if "`subtitle'"~="" { + ereturn local subtitle "`subtitle'" + } + local hacsubtitle "`hacsubtitle1'`hacsubtitle2'`hacsubtitle3'" + if "`b0'"~="" { + ereturn local hacsubtitleB "Estimates based on supplied parameter vector" + } + else if "`hacsubtitle'"~="" & "`gmm2s'`cue'"~="" { + ereturn local hacsubtitleB "Estimates efficient for arbitrary `hacsubtitle'" + } + else if "`wmatrix'"~="" { + ereturn local hacsubtitleB "Efficiency of estimates dependent on weighting matrix" + } + else { + ereturn local hacsubtitleB "Estimates efficient for homoskedasticity only" + } + if "`hacsubtitle'"~="" { + ereturn local hacsubtitleV "Statistics robust to `hacsubtitle'" + } + else { + ereturn local hacsubtitleV "Statistics consistent for homoskedasticity only" + } + if "`hacsubtitle4'"~="" { + ereturn local hacsubtitleV2 "`hacsubtitle4'" + } + if "`sw'"~="" { + ereturn local hacsubtitleV "Stock-Watson heteroskedastic-robust statistics (BETA VERSION)" + } + } + +******************************************************************************************* +* Display results unless ivreg2 called just to generate stats or nooutput option + + if "`nooutput'" == "" { + if "`savefirst'`saverf'" != "" { + DispStored `"`saverf'"' `"`savefirst'"' `"`ivreg2_cmd'"' + } + if "`rf'" != "" { + DispRF + } + if "`first'" != "" { + DispFirst `"`ivreg2_cmd'"' + } + if "`first'`ffirst'" != "" { + DispFFirst `"`ivreg2_cmd'"' + } + if "`eform'"!="" { + local efopt "eform(`eform')" + } + DispMain `"`noheader'"' `"`plus'"' `"`efopt'"' `"`level'"' `"`nofooter'"' `"`ivreg2_cmd'"' + } + +* Drop first stage estimations unless explicitly saved or if replay + if "`savefirst'" == "" { + local firsteqs "`e(firsteqs)'" + foreach eqname of local firsteqs { + capture estimates drop `eqname' + } + ereturn local firsteqs + } + +* Drop reduced form estimation unless explicitly saved or if replay + if "`saverf'" == "" { + local eqname "`e(rfeq)'" + capture estimates drop `eqname' + ereturn local rfeq + } + +end + +******************************************************************************************* +* SUBROUTINES +******************************************************************************************* + +program define DispMain, eclass + args noheader plus efopt level nofooter helpfile + version 8.2 +* Prepare for problem resulting from rank(S) being insufficient +* Results from insuff number of clusters, too many lags in HAC, +* to calculate robust S matrix, HAC matrix not PD, singleton dummy, +* and indicated by missing value for j stat +* Macro `rprob' is either 1 (problem) or 0 (no problem) + capture local rprob ("`e(j)'"==".") + + if "`noheader'"=="" { + if "`e(title)'" ~= "" { +di in gr _n "`e(title)'" + local tlen=length("`e(title)'") +di in gr "{hline `tlen'}" + } + if "`e(subtitle)'" ~= "" { +di in gr "`e(subtitle)'" + } + if "`e(model)'"=="liml" | "`e(model)'"=="kclass" { +di in gr "k =" %7.5f `e(kclass)' + } + if "`e(model)'"=="liml" { +di in gr "lambda =" %7.5f `e(lambda)' + } + if e(fuller) > 0 & e(fuller) < . { +di in gr "Fuller parameter=" %-5.0f `e(fuller)' + } + if "`e(hacsubtitleB)'" ~= "" { +di in gr _n "`e(hacsubtitleB)'" _c + } + if "`e(hacsubtitleV)'" ~= "" { +di in gr _n "`e(hacsubtitleV)'" + } + if "`e(hacsubtitleV2)'" ~= "" { +di in gr "`e(hacsubtitleV2)'" + } + if "`e(kernel)'"!="" { +di in gr " kernel=`e(kernel)'; bandwidth=" `e(bw)' + if "`e(bwchoice)'"!="" { +di in gr " `e(bwchoice)'" + } +di in gr " time variable (t): " in ye e(tvar) + if "`e(ivar)'" != "" { +di in gr " group variable (i): " in ye e(ivar) + } + } + di + if "`e(clustvar)'"!="" { + if "`e(clustvar2)'"=="" { + local N_clust `e(N_clust)' + local clustvar `e(clustvar)' + } + else { + local N_clust `e(N_clust1)' + local clustvar `e(clustvar1)' + } +di in gr "Number of clusters (`clustvar') = " _col(33) in ye %6.0f `N_clust' _continue + } +di in gr _col(55) "Number of obs = " in ye %8.0f e(N) + if "`e(clustvar2)'"!="" { +di in gr "Number of clusters (" "`e(clustvar2)'" ") = " _col(33) in ye %6.0f e(N_clust2) _continue + } +di in gr _c _col(55) "F(" %3.0f e(Fdf1) "," %6.0f e(Fdf2) ") = " + if e(F) < 99999 { +di in ye %8.2f e(F) + } + else { +di in ye %8.2e e(F) + } +di in gr _col(55) "Prob > F = " in ye %8.4f e(Fp) + +di in gr "Total (centered) SS = " in ye %12.0g e(yyc) _continue +di in gr _col(55) "Centered R2 = " in ye %8.4f e(r2c) +di in gr "Total (uncentered) SS = " in ye %12.0g e(yy) _continue +di in gr _col(55) "Uncentered R2 = " in ye %8.4f e(r2u) +di in gr "Residual SS = " in ye %12.0g e(rss) _continue +di in gr _col(55) "Root MSE = " in ye %8.4g e(rmse) +di + } + +* Display coefficients etc. +* Unfortunate but necessary hack here: to suppress message about cluster adjustment of +* standard error, clear e(clustvar) and then reset it after display + local cluster `e(clustvar)' + ereturn local clustvar + ereturn display, `plus' `efopt' level(`level') + ereturn local clustvar `cluster' + +* Display 1st footer with identification stats +* Footer not displayed if -nofooter- option or if pure OLS, i.e., model="ols" and Sargan-Hansen=0 + if ~("`nofooter'"~="" | (e(model)=="ols" & (e(sargan)==0 | e(j)==0))) { + +* Under ID test + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##idtest:Underidentification test}" + if "`e(vcetype)'`e(kernel)'"=="" { +di in gr _c " (Anderson canon. corr. LM statistic):" + } + else { +di in gr _c " (Kleibergen-Paap rk LM statistic):" + } +di in ye _col(71) %8.3f e(idstat) +di in gr _col(52) "Chi-sq(" in ye e(iddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(idp) +* IV redundancy statistic + if "`e(redlist)'"!="" { +di in gr "-redundant- option:" +di in smcl _c "{help `helpfile'##redtest:IV redundancy test}" +di in gr _c " (LM test of redundancy of specified instruments):" +di in ye _col(71) %8.3f e(redstat) +di in gr _col(52) "Chi-sq(" in ye e(reddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(redp) +di in gr "Instruments tested: " _c + Disp `e(redlist)', _col(23) + } +di in smcl in gr "{hline 78}" + } +* Report Cragg-Donald statistic + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##widtest:Weak identification test}" +di in gr " (Cragg-Donald Wald F statistic):" in ye _col(71) %8.3f e(cdf) + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr " (Kleibergen-Paap rk Wald F statistic):" in ye _col(71) %8.3f e(widstat) + } +di in gr _c "Stock-Yogo weak ID test critical values:" + local cdmissing=1 + if "`e(model)'"=="iv" | "`e(model)'"=="gmm2s" | "`e(model)'"=="gmmw" { + cdsy, type(ivbias5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "15% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "25% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)==.) | "`e(model)'"=="cue" { + cdsy, type(limlsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "15% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "25% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)<.) { + cdsy, type(fullrel5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + if `cdmissing' { + di in gr _col(64) "" + } + else { + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." + } + } + di in smcl in gr "{hline 78}" + } + +* Report either (a) Sargan-Hansen-C stats, or (b) robust covariance matrix problem +* e(model)="gmmw" means user-supplied weighting matrix and Hansen J using 2nd-step resids reported + if `rprob' == 0 { +* Display overid statistic + if "`e(vcetype)'" == "Robust" | "`e(model)'" == "gmmw" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } + else { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } +di in ye _col(71) %8.3f e(j) + if e(rankxx) < e(rankzz) { +di in gr _col(52) "Chi-sq(" in ye e(jdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(jp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + +* Display orthog option: C statistic (difference of Sargan statistics) + if e(cstat) != . { +* If C-stat = 0 then warn, otherwise output + if e(cstat) > 0 { +di in gr "-orthog- option:" + if "`e(vcetype)'" == "Robust" { +di in gr _c "Hansen J statistic (eqn. excluding suspect orthog. conditions): " + } + else { +di in gr _c "Sargan statistic (eqn. excluding suspect orthogonality conditions):" + } +di in ye _col(71) %8.3f e(j)-e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(jdf)-e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f chiprob(e(jdf)-e(cstatdf),e(j)-e(cstat)) +di in smcl _c "{help `helpfile'##ctest:C statistic}" +di in gr _c " (exogeneity/orthogonality of suspect instruments): " +di in ye _col(71) %8.3f e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f e(cstatp) +di in gr "Instruments tested: " _c + Disp `e(clist)', _col(23) + } + if e(cstat) == 0 { +di in gr _n "Collinearity/identification problems in eqn. excl. suspect orthog. conditions:" +di in gr " C statistic not calculated for -orthog- option" + } + } + } + else { +* Problem exists with robust VCV - notify and list possible causes +di in r "Warning: estimated covariance matrix of moment conditions not of full rank." + if e(rankxx) < e(rankzz) { +di in r " overidentification statistic not reported, and standard errors and" + } +di in r " model tests should be interpreted with caution." +di in r "Possible causes:" + if "`e(N_clust)'" != "" { +di in r " number of clusters insufficient to calculate robust covariance matrix" + } + if "`e(kernel)'" != "" { +di in r " covariance matrix of moment conditions not positive definite" +di in r " covariance matrix uses too many lags" + } +di in r " singleton dummy variable (dummy with one 1 and N-1 0s or vice versa)" +di in r in smcl _c "{help `helpfile'##partial:partial}" +di in r " option may address problem." + } + +* Display endog option: endogeneity test statistic + if e(estat) != . { +* If stat = 0 then warn, otherwise output + if e(estat) > 0 { +di in gr "-endog- option:" +di in smcl _c "{help `helpfile'##endogtest:Endogeneity test}" +di in gr _c " of endogenous regressors: " +di in ye _col(71) %8.3f e(estat) +di in gr _col(52) "Chi-sq(" in ye e(estatdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(estatp) +di in gr "Regressors tested: " _c + Disp `e(elist)', _col(23) + } + if e(estat) == 0 { +di in gr _n "Collinearity/identification problems in restricted equation:" +di in gr " Endogeneity test statistic not calculated for -endog- option" + } + } + + di in smcl in gr "{hline 78}" +* Display AR overid statistic if LIML and not robust + if "`e(model)'" == "liml" & "`e(vcetype)'" ~= "Robust" & "`e(kernel)'" == "" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (LR test of excluded instruments):" + } +di in ye _col(72) %7.3f e(arubin) + if e(rankxx) < e(rankzz) { +di in gr _col(52) "Chi-sq(" in ye e(arubindf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(arubinp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + di in smcl in gr "{hline 78}" + } + } + +* Display 2nd footer with variable lists + if "`nofooter'"=="" { + +* Warn about dropped instruments if any +* (Re-)calculate number of user-supplied instruments + local iv1_ct : word count `e(insts)' + local iv1_ct = `iv1_ct' + `e(cons)' + + if `iv1_ct' > e(rankzz) { +di in gr "Collinearities detected among instruments: " _c +di in gr `iv1_ct'-e(rankzz) " instrument(s) dropped" + } + + if "`e(collin)'`e(dups)'" != "" | `e(partial_ct)'>0 { +* If collinearities, duplicates or partial, abbreviated varlists saved with a 1 at the end + local one "1" + } + if "`e(instd)'" != "" { + di in gr "Instrumented:" _c + Disp `e(instd`one')', _col(23) + } + if "`e(inexog)'" != "" { + di in gr "Included instruments:" _c + Disp `e(inexog`one')', _col(23) + } + if "`e(exexog)'" != "" { + di in gr "Excluded instruments:" _c + Disp `e(exexog`one')', _col(23) + } + if `e(partial_ct)' > 0 { + if e(partialcons) { + local partial "`e(partial`one')' _cons" + } + else { + local partial "`e(partial`one')'" + } +di in smcl _c "{help `helpfile'##partial:Partialled-out}" + di in gr ":" _c + Disp `partial', _col(23) + if "`e(partialsmall)'"=="" { +di in gr _col(23) "nb: small-sample adjustments do not account for" +di in gr _col(23) " partialled-out variables" + } + else { +di in gr _col(23) "nb: small-sample adjustments account for" +di in gr _col(23) " partialled-out variables" + } + } + if "`e(dups)'" != "" { + di in gr "Duplicates:" _c + Disp `e(dups)', _col(23) + } + if "`e(collin)'" != "" { + di in gr "Dropped collinear:" _c + Disp `e(collin)', _col(23) + } + if "`e(ecollin)'" != "" { + di in gr "Reclassified as exog:" _c + Disp `e(ecollin)', _col(23) + } + di in smcl in gr "{hline 78}" + } +end + +************************************************************************************** + +program define DispRF + version 8.2 + local eqname "`e(rfeq)'" + local depvar "`e(depvar)'" + local strlen : length local depvar + local strlen = `strlen'+25 +di +di in gr "Reduced-form regression: `e(depvar)'" +di in smcl in gr "{hline `strlen'}" + capture estimates replay `eqname' + if "`eqname'"=="" | _rc != 0 { +di in ye "Unable to display reduced-form regression of `e(depvar)'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + else { + estimates replay `eqname', noheader +di + } +end + +program define DispFirst + version 8.2 + args helpfile + tempname firstmat ivest sheapr2 pr2 F df df_r pvalue APF APFdf1 APFdf2 APFp APr2 + + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display first-stage estimates; macro e(first) is missing" + exit + } +di in gr _newline "First-stage regressions" +di in smcl in gr "{hline 23}" +di + local endo1 : colnames(`firstmat') + local nrvars : word count `endo1' + local firsteqs "`e(firsteqs)'" + local nreqs : word count `firsteqs' + if `nreqs' < `nrvars' { +di in ye "Unable to display all first-stage regressions." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + foreach eqname of local firsteqs { + _estimates hold `ivest' + capture estimates restore `eqname' + if _rc != 0 { +di +di in ye "Unable to list stored estimation `eqname'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + else { + local vn "`e(depvar)'" +di in gr "First-stage regression of `vn':" + estimates replay `eqname', noheader + mat `sheapr2' =`firstmat'["sheapr2","`vn'"] + mat `pr2' =`firstmat'["pr2","`vn'"] + mat `F' =`firstmat'["F","`vn'"] + mat `df' =`firstmat'["df","`vn'"] + mat `df_r' =`firstmat'["df_r","`vn'"] + mat `pvalue' =`firstmat'["pvalue","`vn'"] + mat `APF' =`firstmat'["APF","`vn'"] + mat `APFdf1' =`firstmat'["APFdf1","`vn'"] + mat `APFdf2' =`firstmat'["APFdf2","`vn'"] + mat `APFp' =`firstmat'["APFp","`vn'"] + mat `APr2' =`firstmat'["APr2","`vn'"] + +di in gr "F test of excluded instruments:" +di in gr " F(" %3.0f `df'[1,1] "," %6.0f `df_r'[1,1] ") = " in ye %8.2f `F'[1,1] +di in gr " Prob > F = " in ye %8.4f `pvalue'[1,1] + +di in smcl "{help `helpfile'##apstats:Angrist-Pischke multivariate F test of excluded instruments:}" +di in gr " F(" %3.0f `APFdf1'[1,1] "," %6.0f `APFdf2'[1,1] ") = " in ye %8.2f `APF'[1,1] +di in gr " Prob > F = " in ye %8.4f `APFp'[1,1] + +di + } + _estimates unhold `ivest' + } +end + +program define DispStored + args saverf savefirst helpfile + version 8.2 + if "`saverf'" != "" { + local eqlist "`e(rfeq)'" + } + if "`savefirst'" != "" { + local eqlist "`eqlist' `e(firsteqs)'" + } + local eqlist : list retokenize eqlist +di in gr _newline "Stored estimation results" +di in smcl in gr "{hline 25}" _c + capture estimates dir `eqlist' + if "`eqlist'" != "" & _rc == 0 { +* Estimates exist and can be listed + estimates dir `eqlist' + } + else if "`eqlist'" != "" & _rc != 0 { +di +di in ye "Unable to list stored estimations." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } +end + +program define DispFFirst + version 8.2 + args helpfile + tempname firstmat + tempname sheapr2 pr2 F df df_r pvalue APF APFdf1 APFdf2 APFp APchi2 APchi2p APr2 + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display summary of first-stage estimates; macro e(first) is missing" + exit + } + local endo : colnames(`firstmat') + local nrvars : word count `endo' + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + local efirsteqs "`e(firsteqs)'" + + mat `df' =`firstmat'["df",1] + mat `df_r' =`firstmat'["df_r",1] + mat `APFdf1' =`firstmat'["APFdf1",1] + mat `APFdf2' =`firstmat'["APFdf2",1] + +di +di in gr _newline "Summary results for first-stage regressions" +di in smcl in gr "{hline 43}" +di + +di _c in smcl _col(44) "{help `helpfile'##apstats:(Underid)}" +di in smcl _col(65) "{help `helpfile'##apstats:(Weak id)}" + +di _c in gr "Variable |" +di _c in smcl _col(16) "{help `helpfile'##apstats:F}" in gr "(" +di _c in ye _col(17) %3.0f `df'[1,1] in gr "," in ye %6.0f `df_r'[1,1] in gr ") P-val" +di _c in gr _col(37) "|" +di _c in smcl _col(39) "{help `helpfile'##apstats:AP Chi-sq}" in gr "(" +di _c in ye %3.0f `APFdf1'[1,1] in gr ") P-val" +di _c in gr _col(60) "|" +di _c in smcl _col(62) "{help `helpfile'##apstats:AP F}" in gr "(" +di in ye _col(67) %3.0f `APFdf1'[1,1] in gr "," in ye %6.0f `APFdf2'[1,1] in gr ")" + + local i = 1 + foreach vn of local endo { + + mat `sheapr2' =`firstmat'["sheapr2","`vn'"] + mat `pr2' =`firstmat'["pr2","`vn'"] + mat `F' =`firstmat'["F","`vn'"] + mat `df' =`firstmat'["df","`vn'"] + mat `df_r' =`firstmat'["df_r","`vn'"] + mat `pvalue' =`firstmat'["pvalue","`vn'"] + mat `APF' =`firstmat'["APF","`vn'"] + mat `APFdf1' =`firstmat'["APFdf1","`vn'"] + mat `APFdf2' =`firstmat'["APFdf2","`vn'"] + mat `APFp' =`firstmat'["APFp","`vn'"] + mat `APchi2' =`firstmat'["APchi2","`vn'"] + mat `APchi2p' =`firstmat'["APchi2p","`vn'"] + mat `APr2' =`firstmat'["APr2","`vn'"] + + local vnlen : length local vn + if `vnlen' > 12 { + local vn : piece 1 12 of "`vn'" + } +di _c in y %-12s "`vn'" _col(14) in gr "|" _col(18) in y %8.2f `F'[1,1] +di _c _col(28) in y %8.4f `pvalue'[1,1] +di _c _col(37) in g "|" _col(42) in y %8.2f `APchi2'[1,1] _col(51) in y %8.4f `APchi2p'[1,1] +di _col(60) in g "|" _col(65) in y %8.2f `APF'[1,1] + local i = `i' + 1 + } +di + + if "`robust'`cluster'" != "" { + if "`cluster'" != "" { + local rtype "cluster-robust" + } + else if "`kernel'" != "" { + local rtype "heteroskedasticity and autocorrelation-robust" + } + else { + local rtype "heteroskedasticity-robust" + } + } + else if "`kernel'" != "" { + local rtype "autocorrelation-robust" + } + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: first-stage test statistics `rtype'" +di + } + + local k2 = `APFdf1'[1,1] +di in gr "Stock-Yogo weak ID test critical values for single endogenous regressor:" + local cdmissing=1 + if "`e(model)'"=="iv" | "`e(model)'"=="gmm2s" | "`e(model)'"=="gmmw" { + cdsy, type(ivbias5) k2(`e(exexog_ct)') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(37) "5% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)==.) | "`e(model)'"=="cue" { + cdsy, type(limlsize10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)<.) { + cdsy, type(fullrel5) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(43) "5% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "30% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." +di + } + else { +di + } + +* Check that AP chi-sq and F denominator are correct and = underid test dof + if e(iddf)~=`APFdf1'[1,1] { +di in red "Warning: Error in calculating first-stage id statistics above;" +di in red " dof of AP statistics is " `APFdf1'[1,1] ", should be L-(K-1)=`e(iddf)'." + } + + tempname iddf idstat idp widstat cdf rkf + scalar `iddf'=e(iddf) + scalar `idstat'=e(idstat) + scalar `idp'=e(idp) + scalar `widstat'=e(widstat) + scalar `cdf'=e(cdf) + capture scalar `rkf'=e(rkf) +di in smcl "{help `helpfile'##idtest:Underidentification test}" +di in gr "Ho: matrix of reduced form coefficients has rank=K1-1 (underidentified)" +di in gr "Ha: matrix has rank=K1 (identified)" + if "`robust'`kernel'"=="" { +di in ye "Anderson canon. corr. LM statistic" _c + } + else { +di in ye "Kleibergen-Paap rk LM statistic" _c + } +di in gr _col(42) "Chi-sq(" in ye `iddf' in gr ")=" %-7.2f in ye `idstat' /* + */ _col(61) in gr "P-val=" %6.4f in ye `idp' + +di +di in smcl "{help `helpfile'##widtest:Weak identification test}" +di in gr "Ho: equation is weakly identified" +di in ye "Cragg-Donald Wald F statistic" _col(65) %8.2f `cdf' + if "`robust'`kernel'"~="" { +di in ye "Kleibergen-Paap Wald rk F statistic" _col(65) %8.2f `rkf' + } +di + +di in gr "Stock-Yogo weak ID test critical values for K1=`e(endog_ct)' and L1=`e(exexog_ct)':" + local cdmissing=1 + if "`e(model)'"=="iv" | "`e(model)'"=="gmm2s" | "`e(model)'"=="gmmw" { + cdsy, type(ivbias5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(37) "5% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)==.) | "`e(model)'"=="cue" { + cdsy, type(limlsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)<.) { + cdsy, type(fullrel5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "30% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + if `cdmissing' { + di in gr _col(64) "" + } + else { + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." + } + di + } + + tempname arf arfp archi2 archi2p ardf ardf_r + tempname sstat sstatp sstatdf +di in smcl "{help `helpfile'##wirobust:Weak-instrument-robust inference}" +di in gr "Tests of joint significance of endogenous regressors B1 in main equation" +di in gr "Ho: B1=0 and orthogonality conditions are valid" +* Needs to be small so that adjusted dof is reflected in F stat + scalar `arf'=e(arf) + scalar `arfp'=e(arfp) + scalar `archi2'=e(archi2) + scalar `archi2p'=e(archi2p) + scalar `ardf'=e(ardf) + scalar `ardf_r'=e(ardf_r) + scalar `sstat'=e(sstat) + scalar `sstatp'=e(sstatp) + scalar `sstatdf'=e(sstatdf) +di in ye _c "Anderson-Rubin Wald test" +di in gr _col(36) "F(" in ye `ardf' in gr "," in ye `ardf_r' in gr ")=" /* + */ _col(49) in ye %7.2f `arf' _col(61) in gr "P-val=" in ye %6.4f `arfp' +di in ye _c "Anderson-Rubin Wald test" +di in gr _col(36) "Chi-sq(" in ye `ardf' in gr ")=" /* + */ _col(49) in ye %7.2f `archi2' _col(61) in gr "P-val=" in ye %6.4f `archi2p' +di in ye _c "Stock-Wright LM S statistic" +di in gr _col(36) "Chi-sq(" in ye `sstatdf' in gr ")=" /* + */ _col(49) in ye %7.2f `sstat' _col(61) in gr "P-val=" in ye %6.4f `sstatp' +di + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: Underidentification, weak identification and weak-identification-robust" +di in gr " test statistics `rtype'" +di + } + + if "`cluster'" != "" & "`e(clustvar2)'"=="" { +di in gr "Number of clusters N_clust = " in ye %10.0f e(N_clust) + } + else if "`e(clustvar2)'" ~= "" { +di in gr "Number of clusters (1) N_clust1 = " in ye %10.0f e(N_clust1) +di in gr "Number of clusters (2) N_clust2 = " in ye %10.0f e(N_clust2) + } +di in gr "Number of observations N = " in ye %10.0f e(N) +di in gr "Number of regressors K = " in ye %10.0f e(rankxx) +di in gr "Number of endogenous regressors K1 = " in ye %10.0f e(endog_ct) +di in gr "Number of instruments L = " in ye %10.0f e(rankzz) +di in gr "Number of excluded instruments L1 = " in ye %10.0f e(ardf) + if "`e(partial)'" != "" { +di in gr "Number of partialled-out regressors/IVs = " in ye %10.0f e(partial_ct) +di in gr "NB: K & L do not included partialled-out variables" + } + +end + +* Performs first-stage regressions + +program define doFirst, rclass + version 8.2 + args endo /* variable list (including depvar) + */ inexog /* list of included exogenous + */ exexog /* list of excluded exogenous + */ touse /* touse sample + */ wtexp /* full weight expression w/ [] + */ noconstant /* + */ robust /* + */ clopt /* + */ bwopt /* + */ kernopt /* + */ savefprefix /* + */ dofmopt /* + */ sdofmopt /* + */ sw /* + */ psd /* + */ ivreg2_cmd + + + local i 1 + foreach x of local endo { + capture `ivreg2_cmd' `x' `inexog' `exexog' `wtexp' /* + */ if `touse', `noconstant' `robust' `clopt' `bwopt' `kernopt' /* + */ `dofmopt' `sdofmopt' `sw' `psd' small nocollin + if _rc ~= 0 { +* First-stage regression failed +di in ye "Unable to estimate first-stage regression of `x'" + if _rc == 506 { +di in ye " var-cov matrix of first-stage regression of `x' not positive-definite" + } + } + else { +* First-stage regression successful +* Check if there is enough room to save results; leave one free. Allow for overwriting. +* Max is 20-1=19 for Stata 9.0 and earlier, 300-1=299 for Stata 9.1+ + local maxest=299 + local vn "`x'" + local plen : length local savefprefix + local vlen : length local vn + if `plen'+`vlen' > 27 { + local vlen=27-`plen' + local vn : permname `vn', length(`vlen') +* Must create a variable so that permname doesn't reuse it + gen `vn'=0 + local dropvn "`dropvn' `vn'" + } + local eqname "`savefprefix'`vn'" + local eqname : subinstr local eqname "." "_" + qui estimates dir + local est_list "`r(names)'" + local est_list : list est_list - eqname + local est_ct : word count `est_list' + if `est_ct' < `maxest' { + capture est store `eqname', title("First-stage regression: `x'") + if _rc == 0 { + local firsteqs "`firsteqs' `eqname'" + } + } + else { +di +di in ye "Unable to store first-stage regression of `x'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + } + } + return local firsteqs "`firsteqs'" +end + +program define doRF, rclass + version 8.2 + args lhs /* + */ inexog /* list of included exogenous + */ exexog /* list of excluded exogenous + */ touse /* touse sample + */ weight /* full weight expression w/ [] + */ nocons /* + */ robust /* + */ clopt /* + */ bwopt /* + */ kernopt /* + */ saverfprefix /* + */ dofminus /* + */ sdofminus /* + */ sw /* + */ psd /* + */ ivreg2_cmd + +* Anderson-Rubin test of signif of endog regressors (Bo=0) +* In case ivreg2 called with adjusted dof, first stage should adjust dof as well + tempname arf arfp archi2 archi2p ardf ardf_r tempest + capture _estimates hold `tempest' + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } +* Needs to be small so that adjusted dof is reflected in F stat +* capture to prevent not-full-rank error warning + capture `ivreg2_cmd' `lhs' `inexog' `exexog' `weight' if `touse', /* + */ small `nocons' dofminus(`dofminus') sdofminus(`sdofminus') /* + */ `robust' `clopt' `bwopt' `kernopt' `sw' `psd' nocollin + if _rc != 0 { +di as err "Error: reduced form estimation failed" + exit 498 + } + + qui test `exexog' + scalar `arf'=r(F) + scalar `arfp'=r(p) + scalar `ardf'=r(df) + scalar `ardf_r'=r(df_r) + if "`clopt'"=="" { + scalar `archi2'=`arf'*`ardf'*(e(N)-`dofminus')/(e(N)-e(rankxx)-`dofminus'-`sdofminus') + } + else { + scalar `archi2'=`arf'*`ardf'*min(e(N_clust), e(N_clust2))/r(df_r)*(e(N)-1)/(e(N)-e(rankxx)-`sdofminus') + } + scalar `archi2p'=chiprob(`ardf',`archi2') + +* Check if there is enough room to save results; leave one free. Allow for overwriting. +* Max is 20-1=19 for Stata 9.0 and earlier, 300-1=299 for Stata 9.1+ + local maxest=299 + local vn "`lhs'" + local plen : length local saverfprefix + local vlen : length local lhs + if `plen'+`vlen' > 27 { + local vlen=27-`plen' + local vn : permname `vn', length(`vlen') + } + local eqname "`saverfprefix'`vn'" + local eqname : subinstr local eqname "." "_" + qui estimates dir + local est_list "`r(names)'" + local est_list : list est_list - eqname + local est_ct : word count `est_list' + if `est_ct' < `maxest' { + capture est store `eqname', title("Reduced-form regression: `lhs'") + return local rfeq "`eqname'" + } + else { +di +di in ye "Unable to store reduced-form regression of `lhs'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + _estimates unhold `tempest' + return scalar arf=`arf' + return scalar arfp=`arfp' + return scalar ardf=`ardf' + return scalar ardf_r=`ardf_r' + return scalar archi2=`archi2' + return scalar archi2p=`archi2p' +end + +************************************************************************************** +program define IsStop, sclass + /* sic, must do tests one-at-a-time, + * 0, may be very large */ + version 8.2 + if `"`0'"' == "[" { + sret local stop 1 + exit + } + if `"`0'"' == "," { + sret local stop 1 + exit + } + if `"`0'"' == "if" { + sret local stop 1 + exit + } +* per official ivreg 5.1.3 + if substr(`"`0'"',1,3) == "if(" { + sret local stop 1 + exit + } + if `"`0'"' == "in" { + sret local stop 1 + exit + } + if `"`0'"' == "" { + sret local stop 1 + exit + } + else sret local stop 0 +end + +program define Disp + version 8.2 + syntax [anything] [, _col(integer 15) ] + local len = 80-`_col'+1 + local piece : piece 1 `len' of `"`anything'"' + local i 1 + while "`piece'" != "" { + di in gr _col(`_col') "`first'`piece'" + local i = `i' + 1 + local piece : piece `i' `len' of `"`anything'"' + } + if `i'==1 { + di + } +end + +program define matsort + version 8.2 + args vmat names + tempname hold + foreach vn in `names' { + mat `hold'=nullmat(`hold'), `vmat'[1...,"`vn'"] + } + mat `vmat'=`hold' + mat drop `hold' + foreach vn in `names' { + mat `hold'=nullmat(`hold') \ `vmat'["`vn'",1...] + } + mat `vmat'=`hold' +end + +program define cdsy, rclass + version 8.2 + syntax , type(string) k2(integer) nendog(integer) + +* type() can be ivbias5 (k2<=100, nendog<=3) +* ivbias10 (ditto) +* ivbias20 (ditto) +* ivbias30 (ditto) +* ivsize10 (k2<=100, nendog<=2) +* ivsize15 (ditto) +* ivsize20 (ditto) +* ivsize25 (ditto) +* fullrel5 (ditto) +* fullrel10 (ditto) +* fullrel20 (ditto) +* fullrel30 (ditto) +* fullmax5 (ditto) +* fullmax10 (ditto) +* fullmax20 (ditto) +* fullmax30 (ditto) +* limlsize10 (ditto) +* limlsize15 (ditto) +* limlsize20 (ditto) +* limlsize25 (ditto) + + tempname temp cv + +* Initialize critical value as MV + scalar `cv'=. + + if "`type'"=="ivbias5" { + mata: s_ivreg210_cdsy("`temp'", 1) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias10" { + mata: s_ivreg210_cdsy("`temp'", 2) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias20" { + mata: s_ivreg210_cdsy("`temp'", 3) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias30" { + mata: s_ivreg210_cdsy("`temp'", 4) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + if "`type'"=="ivsize10" { + mata: s_ivreg210_cdsy("`temp'", 5) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize15" { + mata: s_ivreg210_cdsy("`temp'", 6) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize20" { + mata: s_ivreg210_cdsy("`temp'", 7) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize25" { + mata: s_ivreg210_cdsy("`temp'", 8) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel5" { + mata: s_ivreg210_cdsy("`temp'", 9) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel10" { + mata: s_ivreg210_cdsy("`temp'", 10) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel20" { + mata: s_ivreg210_cdsy("`temp'", 11) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel30" { + mata: s_ivreg210_cdsy("`temp'", 12) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax5" { + mata: s_ivreg210_cdsy("`temp'", 13) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax10" { + mata: s_ivreg210_cdsy("`temp'", 14) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax20" { + mata: s_ivreg210_cdsy("`temp'", 15) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax30" { + mata: s_ivreg210_cdsy("`temp'", 16) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize10" { + mata: s_ivreg210_cdsy("`temp'", 17) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize15" { + mata: s_ivreg210_cdsy("`temp'", 18) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize20" { + mata: s_ivreg210_cdsy("`temp'", 19) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize25" { + mata: s_ivreg210_cdsy("`temp'", 20) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + return scalar cv=`cv' +end + +******************************************************************************* +**************** SUBROUTINES FOR KERNEL-ROBUST ******************************** +******************************************************************************* + +// capt prog drop abw +// abw wants a varlist of [ eps | Z | touse] +// where Z includes all instruments, included and excluded, with constant if +// present as the last column; eps are a suitable set of residuals; and touse +// marks the observations in the data matrix used to generate the residuals +// (e.g. e(sample) of the appropriate model). +// The Noconstant option indicates that no constant term exists in the Z matrix. +// kern is the name of the HAC kernel. -ivregress- only provides definitions +// for Bartlett (default), Parzen, quadratic spectral. + +// returns the optimal bandwidth as local abw + +// abw 1.0.1 CFB 30jun2007 +// 1.0.1 : redefine kernel names (3 instances) to match ivreg2 +// 1.1.0 : pass nobs and tobs to s_abw; abw bug fix and also handles gaps in data correctly + +prog def abw, rclass + version 9.2 + syntax varlist(ts), [ tindex(varname) nobs(integer 0) tobs(integer 0) NOConstant Kernel(string)] +// validate kernel + if "`kernel'" == "" { + local kernel = "Bartlett" + } +// cfb B102 + if !inlist("`kernel'", "Bartlett", "Parzen", "Quadratic Spectral") { + di as err "Error: kernel `kernel' not compatible with bw(auto)" + return scalar abw = 1 + return local bwchoice "Kernel `kernel' not compatible with bw(auto); bw=1 (default)" + exit + } + else { +// set constant + local cons 1 + if "`noconstant'" != "" { + local cons 0 + } +// deal with ts ops + tsrevar `varlist' + local varlist1 `r(varlist)' + mata: s_abw("`varlist1'", "`tindex'", `nobs', `tobs', `cons', "`kernel'") + return scalar abw = `abw' + return local bwchoice "Automatic bw selection according to Newey-West (1994)" + } +end + + +******************************************************************************* +************** END SUBROUTINES FOR KERNEL-ROBUST ****************************** +******************************************************************************* + + + +******************************************************************************* +*************************** BEGIN MATA CODE *********************************** +******************************************************************************* + +version 10.1 +mata: + +// For reference: +// struct ms_ivreg210_vcvorthog { +// string scalar ename, Znames, touse, weight, wvarname +// string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel +// string scalar sw, psd, ivarname, tvarname, tindexname +// real scalar wf, N, bw, tdelta, dofminus +// real matrix ZZ +// pointer matrix e +// pointer matrix Z +// pointer matrix wvar +// } + + +void s_abw (string scalar Zulist, + string scalar tindexname, + real scalar nobs, + real scalar tobs, + real scalar cons, + string scalar kernel + ) +{ + +// nobs = number of observations = number of data points available = rows(uZ) +// tobs = time span of data = t_N - t_1 + 1 +// nobs = tobs if no gaps in data +// nobs < tobs if there are gaps +// nobs used below when calculating means, e.g., covariances in sigmahat. +// tobs used below when time span of data is needed, e.g., mstar. + + string rowvector Zunames, tov + string scalar v, v2 + real matrix uZ + real rowvector h + real scalar lenzu, abw + +// access the Stata variables in Zulist, honoring touse stored as last column + Zunames = tokens(Zulist) + lenzu=cols(Zunames)-1 + v = Zunames[|1\lenzu|] + v2 = Zunames[lenzu+1] + st_view(uZ,.,v,v2) + tnow=st_data(., tindexname) + +// assume constant in last col of uZ if it exists +// account for eps as the first column of uZ + if (cons) { + nrows1=cols(uZ)-2 + nrows2=1 + } + else { + nrows1=cols(uZ)-1 + nrows2=0 + } +// [R] ivregress p.42: referencing Newey-West 1994 REStud 61(4):631-653 +// define h indicator rowvector + h = J(nrows1,1,1) \ J(nrows2,1,0) + +// calc mstar per p.43 +// Hannan (1971, 296) & Priestley (1981, 58) per Newey-West p. 633 +// corrected per Alistair Hall msg to Brian Poi 17jul2008 +// T = rows(uZ) +// oneT = 1/T + expo = 2/9 + q = 1 +// cgamma = 1.4117 + cgamma = 1.1447 + if(kernel == "Parzen") { + expo = 4/25 + q = 2 + cgamma = 2.6614 + } +// cfb B102 + if(kernel == "Quadratic Spectral") { + expo = 2/25 + q = 2 + cgamma = 1.3221 + } +// per Newey-West p.639, Anderson (1971), Priestley (1981) may provide +// guidance on setting expo for other kernels +// mstar = trunc(20 *(T/100)^expo) +// use time span of data (not number of obs) + mstar = trunc(20 *(tobs/100)^expo) + +// calc uZ matrix + u = uZ[.,1] + Z = uZ[|1,2 \.,.|] + +// calc f vector: (u_i Z_i) * h + f = (u :* Z) * h + +// calc sigmahat vector +// sigmahat = J(mstar+1,1,oneT) +// for(j=0;j<=mstar;j++) { +// for(i=j+1;i<=T;i++) { +// sigmahat[j+1] = sigmahat[j+1] + f[i]*f[i-j] +// } +// } + +// sigmahat vector following _iv_hacbw_select.mata logic +// sigmahat = J(mstar+1,1,0) +// for(j=0;j<=mstar;j++) { +// for(i=j+1;i<=nobs;i++) { // sum through nobs = number of datapoints available +// sigmahat[j+1] = sigmahat[j+1] + f[i]*f[i-j] +// } +// sigmahat[j+1] = sigmahat[j+1] / nobs +// } + +// alt approach that allows for gaps in time series + sigmahat = J(mstar+1,1,0) + for(j=0;j<=mstar;j++) { + lsj = "L"+strofreal(j) + tlag=st_data(., lsj+"."+tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix + // now calculate autocovariance; divide by nobs + sigmahat[j+1] = quadcross(f[tmatrix[.,1],.], f[tmatrix[.,2],.]) / nobs + } + +// calc shat(q), shat(0) + shatq = 0 + shat0 = sigmahat[1] + for(j=1;j<=mstar;j++) { + shatq = shatq + 2 * sigmahat[j+1] * j^q + shat0 = shat0 + 2 * sigmahat[j+1] + } + +// calc gammahat + expon = 1/(2*q+1) + gammahat = cgamma*( (shatq/shat0)^2 )^expon +// m = gammahat * T^expon +// use time span of data (not number of obs) + m = gammahat * tobs^expon + +// calc opt lag + if(kernel == "Bartlett" | kernel == "Parzen") { + optlag = min((trunc(m),mstar)) + } + else if(kernel == "Quadratic Spectral") { + optlag = min((m,mstar)) + } + +// if optlag is the optimal lag to be used, we need to add one to +// specify bandwidth in ivreg2 terms + abw = optlag + 1 + st_local("abw",strofreal(abw)) +} // end program s_abw + + +// ************** Common cross-products ************************************* + +void s_crossprods( string scalar yname, + string scalar X1names, + string scalar X2names, + string scalar Z1names, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N) + +{ + +// y = dep var +// X1 = endog regressors +// X2 = exog regressors = included IVs +// Z1 = excluded instruments +// Z2 = included IVs = X2 + + ytoken=tokens(yname) + X1tokens=tokens(X1names) + X2tokens=tokens(X2names) + Z1tokens=tokens(Z1names) + + Xtokens = (X1tokens, X2tokens) + Ztokens = (Z1tokens, X2tokens) + + K1=cols(X1tokens) + K2=cols(X2tokens) + K=K1+K2 + L1=cols(Z1tokens) + L2=cols(X2tokens) + L=L1+L2 + + st_view(wvar, ., st_tsrevar(wvarname), touse) + st_view(A, ., st_tsrevar((ytoken, Xtokens, Z1tokens)), touse) + + AA = quadcross(A, wf*wvar, A) + + if (K>0) { + XX = AA[(2::K+1),(2..K+1)] + Xy = AA[(2::K+1),1] + } + if (K1>0) { + X1X1 = AA[(2::K1+1),(2..K1+1)] + } + + if (L1 > 0) { + Z1Z1 = AA[(K+2::rows(AA)),(K+2..rows(AA))] + } + + if (L2 > 0) { + Z2Z2 = AA[(K1+2::K+1), (K1+2::K+1)] + Z2y = AA[(K1+2::K+1), 1] + } + + if ((L1>0) & (L2>0)) { + Z2Z1 = AA[(K1+2::K+1), (K+2::rows(AA))] + ZZ2 = Z2Z1, Z2Z2 + ZZ1 = Z1Z1, Z2Z1' + ZZ = ZZ1 \ ZZ2 + } + else if (L1>0) { + ZZ = Z1Z1 + } + else { +// L1=0 + ZZ = Z2Z2 + ZZ2 = Z2Z2 + } + + if ((K1>0) & (L1>0)) { // K1>0, L1>0 + X1Z1 = AA[(2::K1+1), (K+2::rows(AA))] + } + + if ((K1>0) & (L2>0)) { + X1Z2 = AA[(2::K1+1), (K1+2::K+1)] + if (L1>0) { // K1>0, L1>0, L2>0 + X1Z = X1Z1, X1Z2 + XZ = X1Z \ ZZ2 + } + else { // K1>0, L1=0, L2>0 + XZ = X1Z2 \ ZZ2 + X1Z = X1Z2 + } + } + else if (K1>0) { // K1>0, L2=0 + XZ = X1Z1 + X1Z= X1Z1 + } + else if (L1>0) { // K1=0, L2>0 + XZ = AA[(2::K+1),(K+2..rows(AA))], AA[(2::K+1),(2..K+1)] + } + else { // K1=0, L2=0 + XZ = ZZ + } + + if ((L1>0) & (L2>0)) { + Zy = AA[(K+2::rows(AA)), 1] \ AA[(K1+2::K+1), 1] + ZY = AA[(K+2::rows(AA)), (1..K1+1)] \ AA[(K1+2::K+1), (1..K1+1)] + Z2Y = AA[(K1+2::K+1), (1..K1+1)] + } + else if (L1>0) { + Zy = AA[(K+2::rows(AA)), 1] + ZY = AA[(K+2::rows(AA)), (1..K1+1)] + } + else if (L2>0) { + Zy = AA[(K1+2::K+1), 1] + ZY = AA[(K1+2::K+1), (1..K1+1)] + Z2Y = ZY + } +// Zy, ZY, Z2Y not created if L1=L2=0 + + YY = AA[(1::K1+1), (1..K1+1)] + yy = AA[1,1] + st_subview(y, A, ., 1) + ym = sum(wf*wvar:*y)/N + yyc = quadcrossdev(y, ym, wf*wvar, y, ym) + + XXinv = invsym(XX) + if (Xtokens==Ztokens) { + ZZinv = XXinv + XPZXinv = XXinv + } + else { + ZZinv = invsym(ZZ) + XPZX = makesymmetric(XZ*ZZinv*XZ') + XPZXinv=invsym(XPZX) + } + + st_matrix("r(XX)", XX) + st_matrix("r(X1X1)", X1X1) + st_matrix("r(X1Z)", X1Z) + st_matrix("r(ZZ)", ZZ) + st_matrix("r(Z2Z2)", Z2Z2) + st_matrix("r(Z1Z2)", Z2Z1') + st_matrix("r(Z2y)",Z2y) + st_matrix("r(XZ)", XZ) + st_matrix("r(Xy)", Xy) + st_matrix("r(Zy)", Zy) + st_numscalar("r(yy)", yy) + st_numscalar("r(yyc)", yyc) + st_matrix("r(YY)", YY) + st_matrix("r(ZY)", ZY) + st_matrix("r(Z2Y)", Z2Y) + st_matrix("r(XXinv)", XXinv) + st_matrix("r(ZZinv)", ZZinv) + st_matrix("r(XPZXinv)", XPZXinv) + +} // end program s_crossprods + +// ************** Cross-products needed for collinearity checks ************************************* + +void s_cc_crossprods( string scalar Anames, + string scalar Bnames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf) + +{ + + Atokens=tokens(Anames) + Btokens=tokens(Bnames) + + a=cols(Atokens) + b=cols(Btokens) + + st_view(wvar, ., st_tsrevar(wvarname), touse) + st_view(ABvars, ., st_tsrevar((Atokens, Btokens)), touse) + + M = quadcross(ABvars, wf*wvar, ABvars) + + if (a>0) { + AA = M[(1::a),(1::a)] + } + if (b>0) { + BB = M[(a+1::a+b),(a+1::a+b)] + BBinv = invsym(BB) + } + if ((a>0) & (b>0)) { + AB = M[(1::a),(a+1::a+b)] + } + + + st_matrix("r(AA)", AA) + st_matrix("r(BB)", BB) + st_matrix("r(AB)", AB) + st_matrix("r(BBinv)", BBinv) + +} // end program s_cc_crossprods + +// *************** 1st step GMM ******************** // + +void s_gmm1s( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar ZZinvmatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar Wmatrix, + string scalar Smatrix, + scalar dofminus) +{ + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + ZZ = st_matrix(ZZmatrix) + XX = st_matrix(XXmatrix) + XZ = st_matrix(XZmatrix) + Zy = st_matrix(Zymatrix) + ZZinv = st_matrix(ZZinvmatrix) + + QZZ = ZZ / N + QXX = XX / N + QXZ = XZ / N + QZy = Zy / N + QZZinv = ZZinv*N + +// Weighting matrix supplied + if (Wmatrix~="") { + W = st_matrix(Wmatrix) + } +// Var-cov matrix of orthog conditions supplied + else if (Smatrix~="") { + omega=st_matrix(Smatrix) + W = invsym(omega) + } +// No weighting matrix supplied, default to IV weighting matrix + else { + W = QZZinv + IVflag=1 + } + + if ((Xtokens==Ztokens) & (IVflag==1)) { + beta = QZZinv*QZy // OLS + } + else { + QXZ_W_QZX = QXZ * W * QXZ' + _makesymmetric(QXZ_W_QZX) + QXZ_W_QZXinv=invsym(QXZ_W_QZX) + beta = (QXZ_W_QZXinv * QXZ * W * QZy) + } + beta = beta' + + e[.,.] = y - X * beta' + +// If default weighting matrix, normalize by sigma^2 for standard IV reporting purposes + if (IVflag==1) { + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + W = W/sigmasq + } + + st_matrix("r(beta)", beta) + st_matrix("r(W)",W) + +} // end program s_gmm1s + + +// *************** efficient GMM ******************** // + +void s_egmm( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar ZZinvmatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar Smatrix, + scalar dofminus) +{ + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + ZZ = st_matrix(ZZmatrix) + XX = st_matrix(XXmatrix) + XZ = st_matrix(XZmatrix) + Zy = st_matrix(Zymatrix) + ZZinv = st_matrix(ZZinvmatrix) + + QZZ = ZZ / N + QXX = XX / N + QXZ = XZ / N + QZy = Zy / N + QZZinv = ZZinv*N + +// Var-cov matrix of orthog conditions supplied + if (Smatrix~="") { + omega=st_matrix(Smatrix) + W = invsym(omega) + } +// No weighting matrix supplied, default to IV weighting matrix + else { + W = QZZinv + IVflag=1 + } + + QXZ_W_QZX = QXZ * W * QXZ' + _makesymmetric(QXZ_W_QZX) + QXZ_W_QZXinv=invsym(QXZ_W_QZX) + + beta = (QXZ_W_QZXinv * QXZ * W * QZy) + beta = beta' + + e[.,.] = y - X * beta' + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + +// If default weighting matrix, need to normalize by sigma^2 + if (IVflag==1) { + W = W/sigmasq + } + +// Sandwich var-cov matrix (no finite-sample correction) +// Reduces to classical var-cov matrix if omega is not robust form. +// But the GMM estimator is "root-N consistent", and technically we do +// inference on sqrt(N)*beta. By convention we work with beta, so we adjust +// the var-cov matrix instead: + V = 1/N * QXZ_W_QZXinv + +// J if overidentified + if (cols(Z) > cols(X)) { + Ze = quadcross(Z, wf*wvar, e) + gbar = Ze / N + j = N * gbar' * W * gbar + } + else { + j=0 + } + + st_matrix("r(beta)", beta) + st_matrix("r(V)", V) + st_matrix("r(W)", W) + st_numscalar("r(rss)", ee) + st_numscalar("r(j)", j) + st_numscalar("r(sigmasq)", sigmasq) + +} // end program s_egmm + +// *************** inefficient GMM ******************** // + +void s_iegmm( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar Wmatrix, + string scalar Smatrix, + string scalar bname, + scalar dofminus) +{ + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + QZZ = st_matrix(ZZmatrix) / N + QXX = st_matrix(XXmatrix) / N + QXZ = st_matrix(XZmatrix) / N + QZy = st_matrix(Zymatrix) / N + +// beta is supplied + beta = st_matrix(bname) + +// Weighting matrix supplied + W = st_matrix(Wmatrix) + +// Var-cov matrix of orthog conditions supplied + omega=st_matrix(Smatrix) + +// Residuals are supplied + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + + QXZ_W_QZX = QXZ * W * QXZ' + _makesymmetric(QXZ_W_QZX) + QXZ_W_QZXinv=invsym(QXZ_W_QZX) + +// Calculate V and J. + +// V +// The GMM estimator is "root-N consistent", and technically we do +// inference on sqrt(N)*beta. By convention we work with beta, so we adjust +// the var-cov matrix instead: + V = 1/N * QXZ_W_QZXinv * QXZ * W * omega * W * QXZ' * QXZ_W_QZXinv + _makesymmetric(V) + +// J if overidentified + if (cols(Z) > cols(X)) { +// Note that J requires efficient GMM residuals, which means do 2-step GMM to get them. + W2s = invsym(omega) + QXZ_W2s_QZX = QXZ * W2s * QXZ' + _makesymmetric(QXZ_W2s_QZX) + QXZ_W2s_QZXinv=invsym(QXZ_W2s_QZX) + beta2s = (QXZ_W2s_QZXinv * QXZ * W2s * QZy) + beta2s = beta2s' + e2s = y - X * beta2s' + Ze2s = quadcross(Z, wf*wvar, e2s) + gbar = Ze2s / N + j = N * gbar' * W2s * gbar + } + else { + j=0 + } + + st_matrix("r(V)", V) + st_numscalar("r(j)", j) + st_numscalar("r(rss)", ee) + st_numscalar("r(sigmasq)", sigmasq) + +} // end program s_iegmm + +// *************** LIML ******************** // + +void s_liml( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar Z2Z2matrix, + string scalar YYmatrix, + string scalar ZYmatrix, + string scalar Z2Ymatrix, + string scalar Xymatrix, + string scalar ZZinvmatrix, + string scalar yname, + string scalar Ynames, + string scalar ename, + string scalar Xnames, + string scalar X1names, + string scalar Znames, + string scalar Z1names, + string scalar Z2names, + scalar fuller, + scalar kclass, + string scalar coviv, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + scalar dofminus) + +{ + struct ms_ivreg210_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + + +// X1 = endog regressors +// X2 = exog regressors = included IVs +// Z1 = excluded instruments +// Z2 = included IVs = X2 + + Ytokens=tokens(Ynames) + Ztokens=tokens(Znames) + Z1tokens=tokens(Z1names) + Z2tokens=tokens(Z2names) + Xtokens=tokens(Xnames) + X1tokens=tokens(X1names) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + + vcvo.e = &e + vcvo.Z = &Z + vcvo.wvar = &wvar + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + QZZ = st_matrix(ZZmatrix) / N + QXX = st_matrix(XXmatrix) / N + QXZ = st_matrix(XZmatrix) / N + QZy = st_matrix(Zymatrix) / N + QZ2Z2 = st_matrix(Z2Z2matrix) / N + QYY = st_matrix(YYmatrix) / N + QZY = st_matrix(ZYmatrix) / N + QZ2Y = st_matrix(Z2Ymatrix) / N + QXy = st_matrix(Xymatrix) / N + QZZinv = st_matrix(ZZinvmatrix)*N + +// kclass=0 => LIML or Fuller LIML so calculate lambda + if (kclass == 0) { + QWW = QYY - QZY'*QZZinv*QZY + _makesymmetric(QWW) + if (cols(Z2tokens) > 0) { + QZ2Z2inv = invsym(QZ2Z2) + QWW1 = QYY - QZ2Y'*QZ2Z2inv*QZ2Y + _makesymmetric(QWW1) + } + else { +// Special case of no exogenous regressors + QWW1 = QYY + } + M=matpowersym(QWW, -0.5) + Eval=symeigenvalues(M*QWW1*M) + lambda=rowmin(Eval) + } + +// Exactly identified but might not be exactly 1, so make it so + if (cols(Z)==cols(X)) { + lambda=1 + } + + if (fuller > (N-cols(Z))) { +printf("\n{error:Error: invalid choice of Fuller LIML parameter.}\n") + exit(error(3351)) + } + else if (fuller > 0) { + k = lambda - fuller/(N-cols(Z)) + } + else if (kclass > 0) { + k = kclass + } + else { + k = lambda + } + QXhXh=(1-k)*QXX + k*QXZ*QZZinv*QXZ' + _makesymmetric(QXhXh) + QXhXhinv=invsym(QXhXh) + beta = QXy'*QXhXhinv*(1-k) + k*QZy'*QZZinv*QXZ'*QXhXhinv + + e[.,.] = y - X * beta' + ee = quadcross(e, wf*wvar, e) + sigmasq = ee /(N-dofminus) + + S = m_ivreg210_omega(vcvo) + Sinv = invsym(S) + + if ((robust=="") & (clustvarname=="") & (kernel=="")) { +// Efficient LIML + if (coviv=="") { +// Note dof correction is already in sigmasq, and the N reverses the division by N to get the Q version above. + V=sigmasq*QXhXhinv/N + } + else { + QXPZXinv=invsym(makesymmetric(QXZ*QZZinv*QXZ')) + V=sigmasq*QXPZXinv/N + } + if (cols(Z)>cols(X)) { + Ze = quadcross(Z, wf*wvar, e) + gbar = Ze / N + j = N * gbar' * Sinv * gbar + } + else { + j=0 + } + } + else { + if (coviv=="") { + V=QXhXhinv*QXZ*QZZinv*S*QZZinv*QXZ'*QXhXhinv/N + } + else { + QXPZXinv=invsym(makesymmetric(QXZ*QZZinv*QXZ')) + V=QXPZXinv*QXZ*QZZinv*S*QZZinv*QXZ'*QXPZXinv/N + } + if (cols(Z)>cols(X)) { + QXZ_Sinv_QZX = QXZ * Sinv * QXZ' + _makesymmetric(QXZ_Sinv_QZX) + QXZ_Sinv_QZXinv=invsym(QXZ_Sinv_QZX) + beta2s = (QXZ_Sinv_QZXinv * QXZ * Sinv * QZy) + beta2s = beta2s' + e2s = y - X * beta2s' + Ze2s = quadcross(Z, wf*wvar, e2s) + gbar = Ze2s / N + j = N * gbar' * Sinv * gbar + } + else { + j=0 + } + } + _makesymmetric(V) + + st_matrix("r(beta)", beta) + st_matrix("r(S)",S) + st_matrix("r(V)",V) + st_numscalar("r(lambda)", lambda) + st_numscalar("r(kclass)", k) + st_numscalar("r(j)", j) + st_numscalar("r(rss)", ee) + st_numscalar("r(sigmasq)", sigmasq) + +} // end program s_liml + + +// *************** CUE ******************** // + +void s_gmmcue( string scalar ZZmatrix, + string scalar XZmatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + string scalar bname, + string scalar b0name, + scalar dofminus) + +{ + + struct ms_ivreg210_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Pointers to views + vcvo.e = &e + vcvo.Z = &Z + vcvo.wvar = &wvar + py = &y + pX = &X + + if (b0name=="") { + +// CUE beta not supplied, so calculate/optimize + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + +// CUE is preceded by IV or 2-step GMM to get starting values. +// Stata convention is that parameter vectors are row vectors, and optimizers +// require this, so must conform to this in what follows. + + beta_init = st_matrix(bname) + +// What follows is how to set out an optimization in Stata. First, initialize +// the optimization structure in the variable S. Then tell Mata where the +// objective function is, that it's a minimization, that it's a "d0" type of +// objective function (no analytical derivatives or Hessians), and that the +// initial values for the parameter vector are in beta_iv. Finally, optimize. + S = optimize_init() + + optimize_init_evaluator(S, &m_cuecrit()) + optimize_init_which(S, "min") + optimize_init_evaluatortype(S, "d0") + optimize_init_params(S, beta_init) +// CUE objective function takes 3 extra arguments: y, X and the structure with omega details + optimize_init_argument(S, 1, py) + optimize_init_argument(S, 2, pX) + optimize_init_argument(S, 3, vcvo) + + beta = optimize(S) + +// The last evaluation of the GMM objective function is J. + j = optimize_result_value(S) +// Call m_ivreg210_omega one last time to get CUE weighting matrix. + e[.,.] = y - X * beta' + omega = m_ivreg210_omega(vcvo) + W = invsym(omega) + } + else { +// CUE beta supplied, so obtain maximized GMM obj function at b0 + beta = st_matrix(b0name) + e[.,.] = y - X * beta' + omega = m_ivreg210_omega(vcvo) + W = invsym(omega) + gbar = 1/N * quadcross(Z, wf*wvar, e) + j = N * gbar' * W * gbar + } + +// Bits and pieces + QXZ = st_matrix(XZmatrix)/N + + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + + QXZ_W_QZX = QXZ * W * QXZ' + _makesymmetric(QXZ_W_QZX) + QXZ_W_QZXinv=invsym(QXZ_W_QZX) + V = 1/N * QXZ_W_QZXinv + + st_matrix("r(beta)", beta) + st_matrix("r(S)", omega) + st_matrix("r(W)", W) + st_matrix("r(V)", V) + st_numscalar("r(j)", j) + st_numscalar("r(rss)", ee) + st_numscalar("r(sigmasq)", sigmasq) + +} // end program s_gmmcue + +// CUE evaluator function. +// Handles only d0-type optimization; todo, g and H are just ignored. +// beta is the parameter set over which we optimize, and +// J is the objective function to minimize. + +void m_cuecrit(todo, beta, pointer py, pointer pX, struct ms_ivreg210_vcvorthog scalar vcvo, j, g, H) +{ + *vcvo.e[.,.] = *py - *pX * beta' + + omega = m_ivreg210_omega(vcvo) + W = invsym(omega) + +// Calculate gbar=Z'*e/N + gbar = 1/vcvo.N * quadcross(*vcvo.Z, vcvo.wf*(*vcvo.wvar), *vcvo.e) + j = vcvo.N * gbar' * W * gbar + +} // end program CUE criterion function + +// *************** Stock-Wright S statistic ******************** // + +void s_sstat( string scalar X2X2matrix, + string scalar Z1X2matrix, + string scalar X2ymatrix, + string scalar yname, + string scalar ename, + string scalar X2names, + string scalar Znames, + string scalar Z1names, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + scalar dofminus) + +{ + + struct ms_ivreg210_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + + st_view(X2, ., st_tsrevar(tokens(X2names)), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., vcvo.ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Strategy is to partial out X2 (=Z2) from Z1 and from y +// For omega to work with partialled-out Z1, must set up a copy that can be changed. + Z1=st_data( ., st_tsrevar(tokens(Z1names)), touse) + + + X2X2 = st_matrix(X2X2matrix) + Z1X2 = st_matrix(Z1X2matrix) + X2y = st_matrix(X2ymatrix) + + if (cols(tokens(X2names))>0) { +// The X2s are exogenous so we partial them out of y in one step - simple OLS +// Same with Z1 + QX2X2 = X2X2 / N + QX2y = X2y / N + QX2Z1 = Z1X2' / N + +// y=XB => X'y=X'XB + by = invsym(QX2X2)*QX2y + e[.,.] = y-X2*by + bZ1 = invsym(QX2X2)*QX2Z1 + Z1[.,.] = Z1 - X2*bZ1 + } + else { + e[.,.] = y + } + +// And tell m_ivreg210_omega that ZZ is the cross-product of the partialled-out Zs + Z1Z1matrix = quadcross(Z1, wf*wvar, Z1) + + vcvo.e = &e + vcvo.Z = &Z1 + vcvo.Znames = Z1names + vcvo.wvar = &wvar + vcvo.ZZ = Z1Z1matrix + + omega = m_ivreg210_omega(vcvo) + + W = invsym(omega) + +// If zeros on diag, not full rank and can't calculate the statistic + if (diag0cnt(W)==0) { + Ze = quadcross(Z1, wf*wvar, e) + gbar = Ze / N + j = N * gbar' * W * gbar + st_numscalar("r(j)", j) + } + +} // end program s_sstat + +// ************** Canonical correlations utility for collinearity check ************************************* + +void s_cc_collin( string scalar ZZmatrix, + string scalar X1X1matrix, + string scalar X1Zmatrix, + string scalar ZZinvmatrix) + +{ + + ZZ = st_matrix(ZZmatrix) + X1X1 = st_matrix(X1X1matrix) + X1Z = st_matrix(X1Zmatrix) + X1X1inv = invsym(X1X1) + ZZinv = st_matrix(ZZinvmatrix) + X1PZX1 = makesymmetric(X1Z*ZZinv*X1Z') + X1PZX1inv = invsym(X1PZX1) + + ccmat = X1X1inv*X1PZX1 + st_matrix("r(ccmat)", ccmat) + +} // end program s_cc_collin + +// ************** ffirst-stage stats ************************************* + +void s_ffirst( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar ZZinvmatrix, + string scalar XXinvmatrix, + string scalar XPZXinvmatrix, + string scalar ename, + string scalar X1names, + string scalar X1hatnames, + string scalar X2names, + string scalar Z1names, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + scalar N_clust, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + scalar dofminus, + scalar sdofminus) + + +{ + + struct ms_ivreg210_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + +// X1 = endog regressors +// X2 = exog regressors = included IVs +// Z1 = excluded instruments +// Z2 = included IVs = X2 + + Xnames = invtokens( (X1names, X2names), " ") + Znames = invtokens( (Z1names, X2names), " ") + + st_view(X1, ., st_tsrevar(tokens(X1names)), touse) + st_view(X1hat, ., st_tsrevar(tokens(X1hatnames)), touse) + st_view(Z1, ., st_tsrevar(tokens(Z1names)), touse) + st_view(X, ., st_tsrevar(tokens(Xnames)), touse) + st_view(Z, ., st_tsrevar(tokens(Znames)), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + + vcvo.e = &e + vcvo.Z = &Z + vcvo.wvar = &wvar + + if ("X2names"~="") { + st_view(X2, ., st_tsrevar(tokens(X2names)), touse) + } + + K1=cols(X1) + K2=cols(X2) + K=K1+K2 + L1=cols(Z1) + L2=cols(X2) + L=L1+L2 + df = L1 + df_r = N-L + + ZZinv = st_matrix(ZZinvmatrix) + XXinv = st_matrix(XXinvmatrix) + XPZXinv = st_matrix(XPZXinvmatrix) + QZZ = st_matrix(ZZmatrix) / N + QXX = st_matrix(XXmatrix) / N + QZX = st_matrix(XZmatrix)' / N + QZZinv = ZZinv*N + QXXinv = XXinv*N + + shea = (diagonal(XXinv) :/ diagonal(XPZXinv)) // (X1, X2) in column vector + shea = (shea[(1::K1), 1 ])' // Just X1 in row vector + +// First-stage regressions + bz = invsym(QZZ)*QZX +// Drop 0s/1s = coefficients for "predicting" X2 (=Z2) + bz = bz[., (1..K1)] +// VCV + X1hat[.,.] = Z*bz + eall = X1 - X1hat + eeall = quadcross(eall, wf*wvar, eall) +// sigmas have large-sample dofminus correction incorporated but no small dof corrections + sigmasqall = eeall / (N-dofminus) +// V has all the classical VCVs in block diagonals + V = sigmasqall # ZZinv +// For Wald test of excluded instruments + R = I(L1) , J(L1, L2, 0) +// For AP F stats. Augment exogenous Z with X1hats. +// Create using new view to save memory + st_view(ZX1hat, ., st_tsrevar((tokens(Znames), tokens(X1hatnames))), touse) + QZhZh = quadcross(ZX1hat, wf*wvar, ZX1hat) / N + QZhX1 = quadcross(ZX1hat, wf*wvar, X1 ) / N +// matrix to save first-stage results + firstmat=J(12,0,0) + +// F and AP F stats loop over X1s + for (i=1; i<=K1; i++) { +// first-stage coeffs and residuals for ith X1. + b=bz[., i] + e[.,.] = eall[.,i] + +// Classical Wald F stat; also generates partial R2 +// Since r is an L1 x 1 zero vector, can use Rb instead of (Rb-r) +// Vi=V[| 1+(i-1)*L,1+(i-1)*L \ i*L, i*L |] +// Rb = R*b +// Wald = Rb' * invsym(R*Vi*R') * Rb +// Above is written out properly but amounts to the same thing as: + Rb = b[ (1::L1), . ] + RVR = V[| 1+(i-1)*L,1+(i-1)*L \ (i-1)*L+L1, (i-1)*L+L1 |] + Wald = Rb' * invsym(RVR) * Rb +// Wald stat has dofminus correction in it via sigmasq, +// so remove it to calculate partial R2 + pr2 = (Wald/(N-dofminus)) / (1 + (Wald/(N-dofminus))) + +// Robustify F stat if necessary. + if ((robust~="") | (clustvarname~="") | (kernel~="") | (sw~="")) { +// Z and ZZ changed later in loop, so here reset +// in order that m_ivreg210_omega is passed the right ones. +// vcvo.Z is a pointer so automatically updated. + st_view(Z, ., st_tsrevar(tokens(Znames)), touse) + vcvo.ZZ = st_matrix(ZZmatrix) + omega=m_ivreg210_omega(vcvo) +// omega incorporates large dofminus adjustment + Vi = makesymmetric(QZZinv * omega * QZZinv) / N + RVR = Vi[ (1::L1), (1..L1) ] + Wald = Rb' * invsym(RVR) * Rb + } +// small dof adjustment is effectively additional L2, e.g., partialled-out regressors + df = L1 + if (clustvarname=="") { + df_r = (N-dofminus-L-sdofminus) + F = Wald / (N-dofminus) * df_r / df + } + else { + df_r = N_clust - 1 + F = Wald / (N-1) * (N-L-sdofminus) * (N_clust - 1) / N_clust / df + } + pvalue = Ftail(df, df_r, F) + +// Angrist-Pischke F stat etc. +// selmat is selection matrix for choosing Z1s, X2s and X1hats. +// Entries are col numbers of QZhZh. +// keepmat is for invsym - if linear dependencies, must keep X2 and X1hat. +// Entries are col numbers of selmat = col numbers of SELECTED QZhZh cols. + keepmat=J(1,0,.) + selmat=J(1,0,.) + for (j=1; j<=(L+K1); j++) { + if (j~=(L+i)) { // L+i is position of endog i for which we want AP F + selmat = (selmat, j) + } + if ( (j>L1) & (j~=(L+i)) ) { // Must keep all X2s and the (not-i) X1hats + keepmat = (keepmat, cols(selmat)) + } + } +// QZhZh is crossproduct of all Zs plus X1hats +// QZhZhi has all the Zs plus the right X1hats + QZhZhi = QZhZh[ selmat', selmat ] + QZhX1i = QZhX1 [ selmat', i ] +// Can't use qrsolve as in b = qrsolve(QZhZhi,QZhX1i), since we +// need to be able to control which cols get dropped, including +// cases of perverse collinearities. Must keep X2 and X1hat. + QZhZhinv = invsym(QZhZhi, keepmat) + b = QZhZhinv*QZhX1i + + e[.,.] = X1[.,i] - (Z, X1hat)[., selmat]*b + ee = quadcross(e, wf*wvar, e) + sigmasq = ee / (N-dofminus) + Vi = sigmasq * QZhZhinv / N + Rb=b[ (1::L1), .] + RVR = Vi[ (1::L1), (1..L1) ] + Wald = Rb' * invsym(RVR) * Rb + +// Wald stat has dofminus correction in it via sigmasq, +// so remove it to calculate partial R2 + APr2 = (Wald/(N-dofminus)) / (1 + (Wald/(N-dofminus))) + +// Having calculated AP R-sq based on non-robust AP Wald, now get robust AP Wald if needed. + if ((robust~="") | (clustvarname~="") | (kernel~="") | (sw~="")) { +// Reset Z and ZZ so that m_ivreg210_omega is passed the right variables. +// vcvo.Z is a pointer so automatically updated. + Zhtokens = (tokens(Znames), tokens(X1hatnames)) + st_view(Z, ., st_tsrevar(Zhtokens[1, selmat]), touse) + vcvo.ZZ = quadcross(Z, wf*wvar, Z) + omega=m_ivreg210_omega(vcvo) + Vi = makesymmetric(QZhZhinv * omega * QZhZhinv) / N + } + RVR = Vi[ (1::L1), (1..L1) ] + Wald = Rb' * invsym(RVR) * Rb + +// small dof adjustment is effectively additional L2, e.g., partialled-out regressors + APFdf1 = (L1-K1+1) + if (clustvarname=="") { + APFdf2 = (N-dofminus-L-sdofminus) + APF = Wald / (N-dofminus) * APFdf2 / APFdf1 + } + else { + APFdf2 = N_clust - 1 + APF = Wald / (N-1) * (N-L-sdofminus) * (N_clust - 1) / N_clust / APFdf1 + } + APFp = Ftail(APFdf1, APFdf2, APF) + APchi2 = Wald + APchi2p = chi2tail(APFdf1, APchi2) +// Assemble results + firstmat = firstmat , (pr2 \ F \ df \ df_r \ pvalue \ APF \ APFdf1 \ APFdf2 \ APFp \ APchi2 \ APchi2p \ APr2) + } // end of loop for an X1 variable + + firstmat = shea \ firstmat // append shea partial r2 + st_matrix("r(firstmat)", firstmat) + +} // end program s_ffirst + +// ********************************************************************** + +void s_omega( + string scalar ZZmatrix, + string scalar ename, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + scalar dofminus) +{ + + struct ms_ivreg210_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + + st_view(Z, ., st_tsrevar(tokens(Znames)), touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + st_view(e, ., vcvo.ename, touse) + + vcvo.e = &e + vcvo.Z = &Z + vcvo.wvar = &wvar + + ZZ = st_matrix(ZZmatrix) + + S=m_ivreg210_omega(vcvo) + + st_matrix("r(S)", S) +} // end of s_omega program + +end + + +exit + +********************************** VERSION COMMENTS ********************************** +* Initial version cloned from official ivreg version 5.0.9 19Dec2001 +* 1.0.2: add logic for reg3. Sargan test +* 1.0.3: add prunelist to ensure that count of excluded exogeneous is correct +* 1.0.4: revise option to exog(), allow included exog to be specified as well +* 1.0.5: switch from reg3 to regress, many options and output changes +* 1.0.6: fixed treatment of nocons in Sargan and C-stat, and corrected problems +* relating to use of nocons combined with a constant as an IV +* 1.0.7: first option reports F-test of excluded exogenous; prunelist bug fix +* 1.0.8: dropped prunelist and switched to housekeeping of variable lists +* 1.0.9: added collinearity checks; C-stat calculated with recursive call; +* added ffirst option to report only F-test of excluded exogenous +* from 1st stage regressions +* 1.0.10: 1st stage regressions also report partial R2 of excluded exogenous +* 1.0.11: complete rewrite of collinearity approach - no longer uses calls to +* _rmcoll, does not track specific variables dropped; prunelist removed +* 1.0.12: reorganised display code and saved results to enable -replay()- +* 1.0.13: -robust- and -cluster- now imply -small- +* 1.0.14: fixed hascons bug; removed ivreg predict fn (it didn't work); allowed +* robust and cluster with z stats and correct dofs +* 1.0.15: implemented robust Sargan stat; changed to only F-stat, removed chi-sq; +* removed exog option (only orthog works) +* 1.0.16: added clusterised Sargan stat; robust Sargan handles collinearities; +* predict now works with standard SE options plus resids; fixed orthog() +* so it accepts time series operators etc. +* 1.0.17: fixed handling of weights. fw, aw, pw & iw all accepted. +* 1.0.18: fixed bug in robust Sargan code relating to time series variables. +* 1.0.19: fixed bugs in reporting ranks of X'X and Z'Z +* fixed bug in reporting presence of constant +* 1.0.20: added GMM option and replaced robust Sargan with (equivalent) J; +* added saved statistics of 1st stage regressions +* 1.0.21: added Cragg HOLS estimator, including allowing empty endog list; +* -regress- syntax now not allowed; revised code searching for "_cons" +* 1.0.22: modified cluster output message; fixed bug in replay for Sargan/Hansen stat; +* exactly identified Sargan/Hansen now exactly zero and p-value not saved as e(); +* cluster multiplier changed to 1 (from buggy multiplier), in keeping with +* eg Wooldridge 2002 p. 193. +* 1.0.23: fixed orthog option to prevent abort when restricted equation is underid. +* 1.0.24: fixed bug if 1st stage regressions yielded missing values for saving in e(). +* 1.0.25: Added Shea version of partial R2 +* 1.0.26: Replaced Shea algorithm with Godfrey algorithm +* 1.0.27: Main call to regress is OLS form if OLS or HOLS is specified; error variance +* in Sargan and C statistics use small-sample adjustment if -small- option is +* specified; dfn of S matrix now correctly divided by sample size +* 1.0.28: HAC covariance estimation implemented +* Symmetrize all matrices before calling syminv +* Added hack to catch F stats that ought to be missing but actually have a +* huge-but-not-missing value +* Fixed dof of F-stat - was using rank of ZZ, should have used rank of XX (couldn't use df_r +* because it isn't always saved. This is because saving df_r triggers small stats +* (t and F) even when -post- is called without dof() option, hence df_r saved only +* with -small- option and hence a separate saved macro Fdf2 is needed. +* Added rankS to saved macros +* Fixed trap for "no regressors specified" +* Added trap to catch gmm option with no excluded instruments +* Allow OLS syntax (no endog or excluded IVs specified) +* Fixed error messages and traps for rank-deficient robust cov matrix; includes +* singleton dummy possibility +* Capture error if posting estimated VCV that isn't pos def and report slightly +* more informative error message +* Checks 3 variable lists (endo, inexog, exexog) separately for collinearities +* Added AC (autocorrelation-consistent but conditionally-homoskedastic) option +* Sargan no longer has small-sample correction if -small- option +* robust, cluster, AC, HAC all passed on to first-stage F-stat +* bw must be < T +* 1.0.29 -orthog- also displays Hansen-Sargan of unrestricted equation +* Fixed collinearity check to include nocons as well as hascons +* Fixed small bug in Godfrey-Shea code - macros were global rather than local +* Fixed larger bug in Godfrey-Shea code - was using mixture of sigma-squares from IV and OLS +* with and without small-sample corrections +* Added liml and kclass +* 1.0.30 Changed order of insts macro to match saved matrices S and W +* 2.0.00 Collinearities no longer -qui- +* List of instruments tested in -orthog- option prettified +* 2.0.01 Fixed handling of nocons with no included exogenous, including LIML code +* 2.0.02 Allow C-test if unrestricted equation is just-identified. Implemented by +* saving Hansen-Sargan dof as = 0 in e() if just-identified. +* 2.0.03 Added score() option per latest revision to official ivreg +* 2.0.04 Changed score() option to pscore() per new official ivreg +* 2.0.05 Fixed est hold bug in first-stage regressions +* Fixed F-stat finite sample adjustment with cluster option to match official Stata +* Fixed F-stat so that it works with hascons (collinearity with constant is removed) +* Fixed bug in F-stat code - wasn't handling failed posting of vcv +* No longer allows/ignores nonsense options +* 2.0.06 Modified lsStop to sync with official ivreg 5.1.3 +* 2.0.07a Working version of CUE option +* Added sortpreserve, ivar and tvar options +* Fixed smalls bug in calculation of T for AC/HAC - wasn't using the last ob +* in QS kernel, and didn't take account of possible dropped observations +* 2.0.07b Fixed macro bug that truncated long varlists +* 2.0.07c Added dof option. +* Changed display of RMSE so that more digits are displayed (was %8.1g) +* Fixed small bug where cstat was local macro and should have been scalar +* Fixed bug where C stat failed with cluster. NB: wmatrix option and cluster are not compatible! +* 2.0.7d Fixed bug in dof option +* 2.1.0 Added first-stage identification, weak instruments, and redundancy stats +* 2.1.01 Tidying up cue option checks, reporting of cue in output header, etc. +* 2.1.02 Used Poskitt-Skeels (2002) result that C-D eval = cceval / (1-cceval) +* 2.1.03 Added saved lists of separate included and excluded exogenous IVs +* 2.1.04 Added Anderson-Rubin test of signif of endog regressors +* 2.1.05 Fix minor bugs relating to cluster and new first-stage stats +* 2.1.06 Fix bug in cue: capture estimates hold without corresponding capture on estimates unhold +* 2.1.07 Minor fix to ereturn local wexp, promote to version 8.2 +* 2.1.08 Added dofminus option, removed dof option. Added A-R test p-values to e(). +* Minor bug fix to A-R chi2 test - was N chi2, should have been N-L chi2. +* Changed output to remove potentially misleading refs to N-L etc. +* Bug fix to rhs count - sometimes regressors could have exact zero coeffs +* Bug fix related to cluster - if user omitted -robust-, orthog would use Sargan and not J +* Changed output of Shea R2 to make clearer that F and p-values do not refer to it +* Improved handling of collinearites to check across inexog, exexog and endo lists +* Total weight statement moved to follow summ command +* Added traps to catch errors if no room to save temporary estimations with _est hold +* Added -savefirst- option. Removed -hascons-, now synonymous with -nocons-. +* 2.1.09 Fixes to dof option with cluster so it no longer mimics incorrect areg behavior +* Local ivreg2_cmd to allow testing under name ivreg2 +* If wmatrix supplied, used (previously not used if non-robust sargan stat generated) +* Allowed OLS using (=) syntax (empty endo and exexog lists) +* Clarified error message when S matrix is not of full rank +* cdchi2p, ardf, ardf_r added to saved macros +* first and ffirst replay() options; DispFirst and DispFFirst separately codes 1st stage output +* Added savefprefix, macro with saved first-stage equation names. +* Added version option. +* Added check for duplicate variables to collinearity checks +* Rewrote/simplified Godfrey-Shea partial r2 code +* 2.1.10 Added NOOUTput option +* Fixed rf bug so that first does not trigger unnecessary saved rf +* Fixed cue bug - was not starting with robust 2-step gmm if robust/cluster +* 2.1.11 Dropped incorrect/misleading dofminus adjustments in first-stage output summary +* 2.1.12 Collinearity check now checks across inexog/exexog/endog simultaneously +* 2.1.13 Added check to catch failed first-stage regressions +* Fixed misleading failed C-stat message +* 2.1.14 Fixed mishandling of missing values in AC (non-robust) block +* 2.1.15 Fixed bug in RF - was ignoring weights +* Added -endog- option +* Save W matrix for all cases; ensured copy is posted with wmatrix option so original isn't zapped +* Fixed cue bug - with robust, was entering IV block and overwriting correct VCV +* 2.1.16 Added -fwl- option +* Saved S is now robust cov matrix of orthog conditions if robust, whereas W is possibly non-robust +* weighting matrix used by estmator. inv(S)=W if estimator is efficient GMM. +* Removed pscore option (dropped by official ivreg). +* Fixed bug where -post- would fail because of missing values in vcv +* Remove hascons as synonym for nocons +* OLS now outputs 2nd footer with variable lists +* 2.1.17 Reorganization of code +* Added ll() macro +* Fixed N bug where weights meant a non-integer ob count that was rounded down +* Fixed -fwl- option so it correctly handles weights (must include when partialling-out) +* smatrix option takes over from wmatrix option. Consistent treatment of both. +* Saved smatrix and wmatrix now differ in case of inefficient GMM. +* Added title() and subtitle() options. +* b0 option returns a value for the Sargan/J stat even if exactly id'd. +* (Useful for S-stat = value of GMM objective function.) +* HAC and AC now allowed with LIML and k-class. +* Collinearity improvements: bug fixed because collinearity was mistakenly checked across +* inexog/exexog/endog simultaneously; endog predicted exactly by IVs => reclassified as inexog; +* _rmcollright enforces inexog>endo>exexog priority for collinearities, if Stata 9.2 or later. +* K-class, LIML now report Sargan and J. C-stat based on Sargan/J. LIML reports AR if homosked. +* nb: can always easily get a C-stat for LIML based on diff of two AR stats. +* Always save Sargan-Hansen as e(j); also save as e(sargan) if homoskedastic. +* Added Stock-Watson robust SEs options sw() +* 2.1.18 Added Cragg-Donald-Stock-Yogo weak ID statistic critical values to main output +* Save exexog_ct, inexog_ct and endog_ct as macros +* Stock-Watson robust SEs now assume ivar is group variable +* Option -sw- is standard SW. Option -swpsd- is PSD version a la page 6 point 10. +* Added -noid- option. Suppresses all first-stage and identification statistics. +* Internal calls to ivreg2 use noid option. +* Added hyperlinks to ivreg2.hlp and helpfile argument to display routines to enable this. +* 2.1.19 Added matrix rearrangement and checks for smatrix and wmatrix options +* Recursive calls to cstat simplified - no matrix rearrangement or separate robust/nonrobust needed +* Reintroduced weak ID stats to ffirst output +* Added robust ID stats to ffirst output for case of single endogenous regressor +* Fixed obscure bug in reporting 1st stage partial r2 - would report zero if no included exogenous vars +* Removed "HOLS" in main output (misleading if, e.g., estimation is AC but not HAC) +* Removed "ML" in main output if no endogenous regressors - now all ML is labelled LIML +* model=gmm is now model=gmm2s; wmatrix estimation is model=gmm +* wmatrix relates to gmm estimator; smatrix relates to gmm var-cov matrix; b0 behavior equiv to wmatrix +* b0 option implies nooutput and noid options +* Added nocollin option to skip collinearity checks +* Fixed minor display bug in ffirst output for endog vars with varnames > 12 characters +* Fixed bug in saved rf and first-stage results for vars with long varnames; uses permname +* Fixed bug in model df - had counted RHS, now calculates rank(V) since latter may be rank-deficient +* Rank of V now saved as macro rankV +* fwl() now allows partialling-out of just constant with _cons +* Added Stock-Wright S statistic (but adds overhead - calls preserve) +* Properties now include svyj. +* Noted only: fwl bug doesn't allow time-series operators. +* 2.1.20 Fixed Stock-Wright S stat bug - didn't allow time-series operators +* 2.1.21 Fixed Stock-Wright S stat to allow for no exog regressors cases +* 2.2.00 CUE partials out exog regressors, estimates endog coeffs, then exog regressors separately - faster +* gmm2s becomes standard option, gmm supported as legacy option +* 2.2.01 Added explanatory messages if gmm2s used. +* States if estimates efficient for/stats consistent for het, AC, etc. +* Fixed small bug that prevented "{help `helpfile'##fwl:fwl}" from displaying when -capture-d. +* Error message in footer about insuff rank of S changed to warning message with more informative message. +* Fixed bug in CUE with weights. +* 2.2.02 Removed CUE partialling-out; still available with fwl +* smatrix and wmatrix become documented options. e(model)="gmmw" means GMM with arbitrary W +* 2.2.03 Fixed bug in AC with aweights; was weighting zi'zi but not ei'ei. +* 2.2.04 Added abw code for bw(), removed properties(svyj) +* 2.2.05 Fixed bug in AC; need to clear variable vt1 at start of loop +* If iweights, N (#obs with precision) rounded to nearest integer to mimic official Stata treatment +* and therefore don't need N scalar at all - will be same as N +* Saves fwl_ct as macro. +* -ffirst- output, weak id stat, etc. now adjust for number of partialled-out variables. +* Related changes: df_m, df_r include adjustments for partialled-out variables. +* Option nofwlsmall introduced - suppresses above adjustments. Undocumented in ivreg2.hlp. +* Replaced ID tests based on canon corr with Kleibergen-Paap rk-based stats if not homoskedastic +* Replaced LR ID test stats with LM test stats. +* Checks that -ranktest- is installed. +* 2.2.06 Fixed bug with missing F df when cue called; updated required version of ranktest +* 2.2.07 Modified redundancy test statistic to match standard regression-based LM tests +* Change name of -fwl- option to -partial-. +* Use of b0 means e(model)=CUE. Added informative b0 option titles. b0 generates output but noid. +* Removed check for integer bandwidth if auto option used. +* 2.2.08 Add -nocollin- to internal calls and to -ivreg2_cue- to speed performance. +* 2.2.09 Per msg from Brian Poi, Alastair Hall verifies that Newey-West cited constant of 1.1447 +* is correct. Corrected mata abw() function. Require -ranktest- 1.1.03. +* 2.2.10 Added Angrist-Pischke multivariate f stats. Rewrite of first and ffirst output. +* Added Cragg-Donald to weak ID output even when non-iid. +* Fixed small bug in non-robust HAC code whereby extra obs could be used even if dep var missing. +* (required addition of L`tau'.(`s1resid') in creation of second touse variable) +* Fixed bugs that zapped varnames with "_cons" in them +* Changed tvar and ivar setup so that data must be tsset or xtset. +* Fixed bug in redundancy test stat when called by xtivreg2+cluster - no dofminus adj needed in this case +* Changed reporting so that gaps between panels are not reported as such. +* Added check that weight variable is not transformed by partialling out. +* Changed Stock-Wright S statistic so that it uses straight partialling-out of exog regressors +* (had been, in effect, doing 2SGMM partialling-out) +* Fixed bug where dropped collinear endogenous didn't get a warning or listing +* Removed N*CDEV Wald chi-sq statistic from ffirst output (LM stat enough) +* 3.0.00 Fully rewritten and Mata-ized code. Require min Stata 10.1 and ranktest 1.2.00. +* Mata support for Stock-Watson SEs for fixed effects estimator; doesn't support fweights. +* Changed handling of iweights yielding non-integer N so that (unlike official -regress-) all calcs +* for RMSE etc. use non-integer N and N is rounded down only at the end. +* Added support for Thompson/Cameron-Gelbach-Miller 2-level cluster-robust vcvs. +* 3.0.01 Now exits more gracefully if no regressors survive after collinearity checks +* 3.0.02 -capture- instead of -qui- before reduced form to suppress not-full-rank error warning +* Modified Stock-Wright code to partial out all incl Xs first, to reduce possibility of not-full-rank +* omega and missing sstat. Added check within Stock-Wright code to catch not-full-rank omega. +* Fixed bug where detailed first-stage stats with cluster were disrupted if data had been tsset +* using a different variables. +* Fixed bug that didn't allow regression on just a constant. +* Added trap for no observations. +* Added trap for auto bw with panel data - not allowed. +* 3.0.03 Fixed bug in m_ivreg210_omega that always used Stock-Watson spectral decomp to create invertible shat +* instead of only when (undocumented) spsd option is called. +* Fixed bug where, if matsize too small, exited with wrong error (mistakenly detected as collinearities) +* Removed inefficient call to -ranktest- that unnecessarily requested stats for all ranks, not just full. +* 3.0.04 Fixed coding error in m_ivreg210_omega for cluster+kernel. Was *vcvo.e[tmatrix[.,1]], should have been (*vcvo.e)[tmatrix[.,1]]. +* Fixed bug whereby clusters defined by strings were not handled correctly. +* Updated ranktest version check +* 3.0.05 Added check to catch unwanted transformations of time or panel variables by partial option. +* 3.0.06 Fixed partial bug - partialcons macro saved =0 unless _cons explicitly in partial() varlist +* 3.0.07 kclass was defaulting to LIML - fixed. +* Renamed spsd option to psda (a=abs) following Stock-Watson 2008. Added psd0 option following Politis 2007. +* Fixed bug that would prevent RF and first-stage with cluster and TS operators if cluster code changed sort order. +* Modified action if S matrix is not full rank and 2-step GMM chosen. Now continue but report problem in footer +* and do not report J stat etc. +* 3.0.08 Fixed cluster+bw; was not using all observations of all panel units if panel was unbalanced. +* Fixed inconsequential bug in m_ivreg210_omega that caused kernel loop to be entered (with no impact) even if kernel=="" +* Fixed small bug that compared bw to T instead of (correctly) to T/delta when checking that bw can't be too long. +* Added dkraay option = cluster on t var + kernel-robust +* Added kiefer option = truncated kernel, bw=T (max), and no robust +* Fixed minor reporting bug that reported time-series gaps in entire panel dataset rather than just portion touse-d. +* Recoded bw and kernel checks into subroutine vkernel. Allow non-integer bandwidth within check as in ranktest. +* 3.1.01 First ivreg2 version with accompanying Mata library (shared with -ranktest-). Mata library includes +* struct ms_ivreg210_vcvorthog, m_ivreg210_omega, m_ivreg210_calckw, s_ivreg210_vkernel. +* Fixed bug in 2-way cluster code (now in m_ivreg210_omega in Mata library) - would crash if K>1 (relevant for -ranktest- only). +* 3.1.02 Converted cdsy to Mata code and moved to Mata library. Standardized spelling/caps/etc. of QS as "Quadratic Spectral". +* 3.1.03 Improved partialling out in s_sstat and s_ffirst: replaced qrsolve with invsym. +* 3.1.04 Fixed minor bug in s_crossprod - would crash with L1=0 K1>0, and also with K=0 +* 3.1.05 Fixed minor bug in orthog - wasn't saving est results if eqn w/o suspect instruments did not execute properly +* Fixed minor bug in s_cccollin() - didn't catch perverse case of K1>0 (endog regressors) and L1=0 (no excl IVs) +* 3.1.06 Spelling fix for Danielle kernel, correct error check for bw vs T-1 +* 3.1.07 Fixed bug that would prevent save of e(sample) when partialling out just a constant +* 3.1.08 01Jan14. Fixed reporting bug with 2-way clustering and kernel-robust that would give wrong count for 2nd cluster variable. +* 3.1.09 13July14. _rmcollright under version control has serious bug for v10 and earlier. Replaced with canon corr approach. +* Fixed obscure bug in estimation sample - was not using obs when tsset tvar is missing, even if TS operators not used. +* Fixed bug in auto bw code so now ivreg2 and ivregress agree. Also, ivreg2 auto bw code handles gaps in TS correctly. +* 3.1.10 17Jan15. First ivreg210. Mata library and ranktest now internal with names incorporating "_ivreg210_". +* Fixed bug in collinearity code - was not detecting some collinearities in joint inexog/exog list, +* so added extra call to _rmcoll to catch any remaining ones. + +* Version notes for imported version of ranktest: +* 1.0.00 First distributed version +* 1.0.01 With iweights, rkstat truncates N to mimic official Stata treatment of noninteger iweights +* Added warning if shat/vhat/vlab not of full rank. +* 1.0.02 Added NULLrank option +* Added eq names to saved V and S matrices +* 1.0.03 Added error catching for collinearities between varlists +* Not saving S matrix; V matrix now as in paper (without 1/N factor) +* Statistic, p-value etc set to missing if vcv not of full rank (Assumpt 2 in paper fails) +* 1.0.04 Fixed touse bug - was treating missings as touse-able +* Change some cross-products in robust loops to quadcross +* 1.0.05 Fixed bug with col/row names and ts operators. Added eval to saved matrices. +* 1.1.00 First ssc-ideas version. Added version 9.2 prior to Mata compiled section. +* 1.1.01 Allow non-integer bandwidth +* 1.1.02 Changed calc of yhat, zhat and pihat to avoid needlessly large intermediate matrices +* and to use more accurate qrsolve instead of inverted X'X. +* 1.1.03 Fixed touse bug that didn't catch missing cluster variable +* Fixed cluster bug - data needed to be sorted by cluster for Mata panel functions to work properly +* 1.2.00 Changed reporting so that gaps between panels are not reported as such. +* Added support for tdelta in tsset data. +* Changed tvar and ivar setup so that data must be tsset or xtset. +* Removed unnecessary loops through panel data with spectral kernels +* shat vcv now also saved. +* Added support for Thompson/Cameron-Gelbach-Miller 2-level cluster-robust vcvv +* Added support for Stock-Watson vcv - but requires data to have FEs partialled out, & doesn't support fweights +* Removed mimicking of Stata mistake of truncated N with iweights to nearest integer +* Fixed small bug with quadratic kernel (wasn't using negative weights) +* Optimised code dealing with time-series data +* 1.2.01 Fixed bug that always used Stock-Watson spectral decomp to create invertible shat +* instead of only when (undocumented) spsd option is called. +* 1.2.02 Fixed bug that did not allow string cluster variables +* 1.2.03 Fixed bug in code for cluster+kernel robust (typo in imported code from ivreg2=>crash) +* 1.2.04 Replaced code for S with ivreg2 code modified to support e matrix (cols > 1) +* Code block (m_omega, m_calckw, struct definition) now shared by ranktest and ivreg2. +* Renamed spsd option to psd following ivreg2 3.0.07 +* Added wf ("weight factor") and statement about sum of weights, as in ivreg2 +* Added dofminus option, as in ivreg2 +* Fixed minor reporting bug - was reporting gaps in entire panel, not just touse-d portion +* Recoded kernel & bw checks to use shared ivreg2 subroutine vkernel +* 1.2.05 Fixed weighting bug introduced in 1.2.04. All weights were affected. +* Was result of incompatibility of code shared with ivreg2. +* 1.3.01 First ranktest version with accompanying Mata library (shared with -ivreg2-). +* Mata library includes struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Fixed bug in 2-way cluster code (now in m_omega in Mata library) - would crash if K>1. +* 1.3.02 Improved partialling out and matrix inversion - switched from qrsolve to invsym. +* Use _makesymmetric() instead of symmetrizing by hand. +* 1.3.03 01Jan14. Fixed reporting bug with 2-way clustering and kernel-robust that would give +* wrong count for 2nd cluster variable. +* 1.3.04 24Aug14. Fixed bug in markout - would include obs where some vars were missing + +* Version notes for imported version of Mata library +* 1.1.01 First version of library. +* Contains struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Compiled in Stata 9.2 for compatibility with ranktest 1.3.01 (a 9.2 program). +* 1.1.02 Add routine cdsy. Standardized spelling/caps/etc. of QS as "Quadratic Spectral" +* 1.1.03 Corrected spelling of "Danielle" kernel in m_omega() +* 1.1.04 Fixed weighting bugs in robust and cluster code of m_omega where K>1 +* 1.1.05 Added whichlivreg2(.) to aid in version control +* 1.1.06 Fixed remaining weighting bug (see 1.1.04) in 2-way clustering when interection +* of clustering levels is groups +* 1.1.07 Fixed HAC bug that crashed m_omega(.) when there were no obs for a particular lag diff --git a/ado/i/ivreg210.sthlp b/ado/i/ivreg210.sthlp new file mode 100644 index 0000000..82e3449 --- /dev/null +++ b/ado/i/ivreg210.sthlp @@ -0,0 +1,1681 @@ +{smcl} +{* 12Sept2011}{...} +{hline} +help for {hi:ivreg210} +{hline} + +{title:Extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression} + +{p 4}Full syntax + +{p 8 14}{cmd:ivreg210} {it:depvar} [{it:varlist1}] +{cmd:(}{it:varlist2}{cmd:=}{it:varlist_iv}{cmd:)} [{it:weight}] +[{cmd:if} {it:exp}] [{cmd:in} {it:range}] +{bind:[{cmd:,} {cmd:gmm2s}} +{cmd:bw(}{it:#}{cmd:)} +{cmd:kernel(}{it:string}{cmd:)} +{cmd:dkraay(}{it:integer}{cmd:)} +{cmd:kiefer} +{cmd:liml} +{cmd:fuller(}{it:#}{cmd:)} +{cmd:kclass(}{it:#}{cmd:)} +{cmd:coviv} +{cmd:cue} +{cmd:b0}{cmd:(}{it:matrix}{cmd:)} +{cmdab:r:obust} +{cmdab:cl:uster}{cmd:(}{it:varlist}{cmd:)} +{cmd:orthog(}{it:varlist_ex}{cmd:)} +{cmd:endog(}{it:varlist_en}{cmd:)} +{cmdab:red:undant(}{it:varlist_ex}{cmd:)} +{cmd:partial(}{it:varlist}{cmd:)} +{cmdab:sm:all} +{cmdab:noc:onstant} {cmdab:h}ascons +{cmd:smatrix}{cmd:(}{it:matrix}{cmd:)} +{cmd:wmatrix}{cmd:(}{it:matrix}{cmd:)} +{cmd:first} {cmd:ffirst} {cmd:savefirst} {cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:rf} {cmd:saverf} {cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:nocollin} {cmd:noid} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{bind:{cmd:plus} ]} + +{p 4}Replay syntax + +{p 8 14}{cmd:ivreg210} +{bind:[{cmd:,} {cmd:first}} +{cmd:ffirst} {cmd:rf} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{cmd:plus} ]} + +{p 4}Version syntax + +{p 8 14}{cmd:ivreg210}, {cmd:version} + +{p}{cmd:ivreg210} is compatible with Stata version 10.1 or later. + +{p}{cmd:ivreg210} may be used with time-series or panel data, +in which case the data must be {cmd:tsset} +before using {cmd:ivreg210}; see help {help tsset}. + +{p}All {it:varlists} may contain time-series operators, +but factor variables are not currently supported; +see help {help varlist}. + +{p}{cmd:by}, {cmd:rolling}, {cmd:statsby}, {cmd:xi}, +{cmd:bootstrap} and {cmd:jackknife} are allowed; see help {help prefix}. + +{p}{cmd:aweight}s, {cmd:fweight}s, {cmd:iweight}s and {cmd:pweight}s +are allowed; see help {help weights}. + +{p}The syntax of {help predict} following {cmd:ivreg210} is + +{p 8 16}{cmd:predict} [{it:type}] {it:newvarname} [{cmd:if} {it:exp}] +[{cmd:in} {it:range}] [{cmd:,} {it:statistic}] + +{p}where {it:statistic} is + +{p 8 23}{cmd:xb}{space 11}fitted values; the default{p_end} +{p 8 23}{cmdab:r:esiduals}{space 4}residuals{p_end} +{p 8 23}{cmd:stdp}{space 9}standard error of the prediction{p_end} + +{p}These statistics are available both in and out of sample; +type "{cmd:predict} {it:...} {cmd:if e(sample)} {it:...}" +if wanted only for the estimation sample. + +{title:Contents} +{p 2}{help ivreg2##s_description:Description}{p_end} +{p 2}{help ivreg2##s_robust:Robust, cluster and 2-way cluster, AC, HAC, and cluster+HAC SEs and statistics}{p_end} +{p 2}{help ivreg2##s_gmm:GMM estimation}{p_end} +{p 2}{help ivreg2##s_liml:LIML, k-class and GMM-CUE estimation}{p_end} +{p 2}{help ivreg2##s_sumopt:Summary of robust, HAC, AC, GMM, LIML and CUE options}{p_end} +{p 2}{help ivreg2##s_overid:Testing overidentifying restrictions}{p_end} +{p 2}{help ivreg2##s_endog:Testing subsets of regressors and instruments for endogeneity}{p_end} +{p 2}{help ivreg2##s_relevance:Tests of under- and weak identification}{p_end} +{p 2}{help ivreg2##s_redundancy:Testing instrument redundancy}{p_end} +{p 2}{help ivreg2##s_first:First-stage regressions, identification, and weak-id-robust inference}{p_end} +{p 2}{help ivreg2##s_rf:Reduced form estimates}{p_end} +{p 2}{help ivreg2##s_partial:Partialling-out exogenous regressors}{p_end} +{p 2}{help ivreg2##s_ols:OLS and Heteroskedastic OLS (HOLS) estimation}{p_end} +{p 2}{help ivreg2##s_collin:Collinearities}{p_end} +{p 2}{help ivreg2##s_speed:Speed options: nocollin and noid}{p_end} +{p 2}{help ivreg2##s_small:Small sample corrections}{p_end} +{p 2}{help ivreg2##s_options:Options summary}{p_end} +{p 2}{help ivreg2##s_macros:Remarks and saved results}{p_end} +{p 2}{help ivreg2##s_examples:Examples}{p_end} +{p 2}{help ivreg2##s_refs:References}{p_end} +{p 2}{help ivreg2##s_acknow:Acknowledgements}{p_end} +{p 2}{help ivreg2##s_citation:Authors}{p_end} +{p 2}{help ivreg2##s_citation:Citation of ivreg210}{p_end} + +{marker s_description}{title:Description} + +{p}{cmd:ivreg210} implements a range of single-equation estimation methods +for the linear regression model: OLS, instrumental +variables (IV, also known as two-stage least squares, 2SLS), +the generalized method of moments (GMM), +limited-information maximum likelihood (LIML), and k-class estimators. +In the language of IV/GMM, {it:varlist1} are the exogenous +regressors or "included instruments", +{it:varlist_iv} are the exogenous variables excluded +from the regression or "excluded instruments", +and {it:varlist2} the endogenous regressors that are being "instrumented". + +{p}{cmd:ivreg210} will also estimate linear regression models using +robust (heteroskedastic-consistent), +autocorrelation-consistent (AC), +heteroskedastic and autocorrelation-consistent (HAC) +and cluster-robust variance estimates. + +{p}{cmd:ivreg210} is an alternative to Stata's official {cmd:ivregress}. +Its features include: +two-step feasible GMM estimation ({cmd:gmm2s} option) +and continuously-updated GMM estimation ({cmd:cue} option); +LIML and k-class estimation; +automatic output of overidentification and underidentification test statistics; +C statistic test of exogeneity of subsets of instruments +({cmd:orthog()} option); +endogeneity tests of endogenous regressors +({cmd:endog()} option); +test of instrument redundancy +({cmd:redundant()} option); +kernel-based autocorrelation-consistent (AC) +and heteroskedastic and autocorrelation consistent (HAC) standard errors +and covariance estimation ({cmd:bw(}{it:#}{cmd:)} option), +with user-specified choice of kernel ({cmd:kernel()} option); +two-level {cmd:cluster}-robust standard errors and statistics; +default reporting of large-sample statistics +(z and chi-squared rather than t and F); +{cmd:small} option to report small-sample statistics; +first-stage regressions reported with various tests and statistics for +identification and instrument relevance; +{cmd:ffirst} option to report only these identification statistics +and not the first-stage regression results themselves. +{cmd:ivreg210} can also be used for ordinary least squares (OLS) estimation +using the same command syntax as official {cmd:regress} and {cmd:newey}. + +{marker s_robust}{dlgtab:Robust, cluster and 2-level cluster, AC, HAC, and cluster+HAC SEs and statistics} + +{p}The standard errors and test statistics reported by {cmd:ivreg210} can be made consistent +to a variety of violations of the assumption of i.i.d. errors. +When these options are combined with +either the {cmd:gmm2s} or {cmd:cue} options (see below), +the parameter estimators reported are also efficient +in the presence of the same violation of i.i.d. errors. + +{p}The options for SEs and statistics are:{break} +{bind:(1) {cmd:robust}} causes {cmd:ivreg210} to report SEs and statistics that are +robust to the presence of arbitrary heteroskedasticity.{break} +{bind:(2) {cmd:cluster}({it:varname})} SEs and statistics are robust to both +arbitrary heteroskedasticity and arbitrary intra-group correlation, +where {it:varname} identifies the group. +See the relevant Stata manual entries on obtaining robust covariance estimates +for further details.{break} +{bind:(3) {cmd:cluster}({it:varname1 varname2})} provides 2-way clustered SEs +and statistics (Cameron et al. 2006, Thompson 2009) +that are robust to arbitrary heteroskedasticity and intra-group correlation +with respect to 2 non-nested categories defined by {it:varname1} and {it:varname2}. +See below for a detailed description.{break} +{bind:(4) {cmd:bw(}{it:#}{cmd:)}} requests AC SEs and statistics that are +robust to arbitrary autocorrelation.{break} +{bind:(5) {cmd:bw(}{it:#}{cmd:)}} combined with {cmd:robust} +requests HAC SEs and statistics that are +robust to both arbitrary heteroskedasticity and arbitrary autocorrelation.{break} +{bind:(6) {cmd:bw(}{it:#}{cmd:)}} combined with {cmd:cluster}({it:varname}) +is allowed with either 1- or 2-level clustering if the data are panel data +that are {cmd:tsset} on the time variable {it:varname}. +Following Driscoll and Kray (1998), +the SEs and statistics reported will be robust to disturbances +that are common to panel units and that are persistent, i.e., autocorrelated.{break} +{bind:(7) {cmd:dkraay(}{it:#}{cmd:)}} is a shortcut for the Driscoll-Kraay SEs +for panel data in (6). +It is equivalent to clustering on the {cmd:tsset} time variable +and the bandwidth supplied as {it:#}. +The default kernel Bartlett kernel can be overridden with the {cmd:kernel} option.{break} +{bind:(8) {cmd:kiefer}} implements SEs and statistics for panel data +that are robust to arbitrary intra-group autocorrelation +(but {it:not} heteroskedasticity) as per Kiefer (1980). +It is equivalent to to specifying the truncated kernel with {cmd:kernel(tru)} +and {cmd:bw(}{it:#}{cmd:)} where {it:#} is the full length of the panel. + +{p}Details: + +{p}{cmd:cluster}({it:varname1 varname2}) provides 2-way cluster-robust SEs +and statistics as proposed by Cameron, Gelbach and Miller (2006) and Thompson (2009). +"Two-way cluster-robust" means the SEs and statistics +are robust to arbitrary within-group correlation in two distinct non-nested categories +defined by {it:varname1} and {it:varname2}. +A typical application would be panel data where one "category" is the panel +and the other "category" is time; +the resulting SEs are robust +to arbitrary within-panel autocorrelation (clustering on panel id) +and to arbitrary contemporaneous cross-panel correlation (clustering on time). +There is no point in using 2-way cluster-robust SEs if the categories are nested, +because the resulting SEs are equivalent to clustering on the larger category. +{it:varname1} and {it:varname2} do not have to +uniquely identify observations. +The order of {it:varname1} and {it:varname2} does not matter for the results, +but processing may be faster if the category with the larger number of categories +(typically the panel dimension) is listed first. + +{p}Cameron, Gelbach and Miller (2006) show how this approach can accommodate +multi-way clustering, where the number of different non-nested categories is arbitary. +Their Stata command {cmd:cgmreg} implements 2-way and multi-way clustering +for OLS estimation. +The two-way clustered variance-covariance estimator +is calculated using 3 different VCEs: one clustered on {it:varname1}, +the second clustered on {it:varname2}, and the third clustered on the +intersection of {it:varname1} and {it:varname2}. +Cameron et al. (2006, pp. 8-9) discuss two possible small-sample adjustments +using the number of clusters in each category. +{cmd:cgmreg} uses one method (adjusting the 3 VCEs separately based on +the number of clusters in the categories VCE clusters on); +{cmd:ivreg210} uses the second (adjusting the final 2-way cluster-robust VCE +using the smaller of the two numbers of clusters). +For this reason, {cmd:ivreg210} and {cmd:cgmreg} will produce slightly different SEs. +See also {help ivreg2##s_small:small sample corrections} below. + +{p}{cmd:ivreg210} allows a variety of options for kernel-based HAC and AC estimation. +The {cmd:bw(}{it:#}{cmd:)} option sets the bandwidth used in the estimation +and {cmd:kernel(}{it:string}{cmd:)} is the kernel used; +the default kernel is the Bartlett kernel, +also known in econometrics as Newey-West (see help {help newey}). +The full list of kernels available is (abbreviations in parentheses): +Bartlett (bar); Truncated (tru); Parzen (par); Tukey-Hanning (thann); +Tukey-Hamming (thamm); Daniell (dan); Tent (ten); and Quadratic-Spectral (qua or qs). +When using the Bartlett, Parzen, or Quadratic spectral kernels, the automatic +bandwidth selection procedure of Newey and West (1994) can be chosen +by specifying {cmd:bw(}{it:auto}{cmd:)}. +{cmd:ivreg210} can also be used for kernel-based estimation +with panel data, i.e., a cross-section of time series. +Before using {cmd:ivreg210} for kernel-based estimation +of time series or panel data, +the data must be {cmd:tsset}; see help {help tsset}. + +{p}Following Driscoll and Kraay (1998), +{cmd:bw(}{it:#}{cmd:)} combined with {cmd:cluster}({it:varname}) +and applied to panel data produces SEs that are +robust to arbitary common autocorrelated disturbances. +The data must be {cmd:tsset} with the time variable specified as {it:varname}. +Driscoll-Kraay SEs also can be specified using the {cmd:dkraay(}{it:#}{cmd:)}} option, +where {it:#} is the bandwidth. +The default Bartlett kernel can be overridden with the {cmd:kernel} option. +Note that the Driscoll-Kraay variance-covariance estimator is a large-T estimator, +i.e., the panel should have a long-ish time-series dimension. + +{p}Used with 2-way clustering as per Thompson (2009), +{cmd:bw(}{it:#}{cmd:)} combined with {cmd:cluster}({it:varname}) +provides SEs and statistics that are robust +to autocorrelated within-panel disturbances (clustering on panel id) +and to autocorrelated across-panel disturbances (clustering on time +combined with kernel-based HAC). +The approach proposed by Thompson (2009) can be implemented in {cmd:ivreg210} +by choosing the truncated kernel {cmd:kernel(}{it:tru}{cmd:)} +and {cmd:bw(}{it:#}{cmd:)}, where the researcher knows or assumes +that the common autocorrelated disturbances can be ignored after {it:#} periods. + +{p}{cmd:Important:} Users should be aware of the asymptotic requirements +for the consistency of the chosen VCE. +In particular: consistency of the 1-way cluster-robust VCE requires +the number of clusters to go off to infinity; +consistency of the 2-way cluster-robust VCE requires the numbers of +clusters in both categories to go off to infinity; +consistency of kernel-robust VCEs requires the numbers of +observations in the time dimension to go off to infinity. +See Angrist and Pischke (2009), Cameron et al. (2006) and Thompson (2009) +for detailed discussions of the performance of the cluster-robust VCE +when the numbers of clusters is small. + +{marker s_gmm}{dlgtab:GMM estimation} + +{p}When combined with the above options, the {cmd:gmm2s} option generates +efficient estimates of the coefficients as well as consistent +estimates of the standard errors. +The {cmd:gmm2s} option implements the two-step efficient +generalized method of moments (GMM) estimator. +The efficient GMM estimator minimizes the GMM criterion function +J=N*g'*W*g, where N is the sample size, +g are the orthogonality or moment conditions +(specifying that all the exogenous variables, or instruments, +in the equation are uncorrelated with the error term) +and W is a weighting matrix. +In two-step efficient GMM, the efficient or optimal weighting matrix +is the inverse of an estimate of the covariance matrix of orthogonality conditions. +The efficiency gains of this estimator relative to the +traditional IV/2SLS estimator derive from the use of the optimal +weighting matrix, the overidentifying restrictions of the model, +and the relaxation of the i.i.d. assumption. +For an exactly-identified model, +the efficient GMM and traditional IV/2SLS estimators coincide, +and under the assumptions of conditional homoskedasticity and independence, +the efficient GMM estimator is the traditional IV/2SLS estimator. +For further details, see Hayashi (2000), pp. 206-13 and 226-27. + +{p}The {cmd:wmatrix} option allows the user to specify a weighting matrix +rather than computing the optimal weighting matrix. +Estimation with the {cmd:wmatrix} option yields a possibly inefficient GMM estimator. +{cmd:ivreg210} will use this inefficient estimator as the first-step GMM estimator +in two-step efficient GMM when combined with the {cmd:gmm2s} option; +otherwise, {cmd:ivreg210} reports the regression results +using this inefficient GMM estimator. + +{p}The {cmd:smatrix} option allows the user to directly +specify the matrix S, the covariance matrix of orthogonality conditions. +{cmd:ivreg210} will use this matrix in the calculation of the variance-covariance +matrix of the estimator, the J statistic, +and, if the {cmd:gmm2s} option is specified, +the two-step efficient GMM coefficients. +The {cmd:smatrix} can be useful for guaranteeing a positive test statistic +in user-specified "GMM-distance tests" (see {help ivreg2##s_endog:below}). +For further details, see Hayashi (2000), pp. 220-24. + +{marker s_liml}{dlgtab:LIML, k-class and GMM-CUE estimation} + +{marker liml}{p} Maximum-likelihood estimation of a single equation of this form +(endogenous RHS variables and excluded instruments) +is known as limited-information maximum likelihood or LIML. +The overidentifying restrictions test +reported after LIML estimation is the Anderson-Rubin (1950) overidentification +statistic in a homoskedastic context. +LIML, OLS and IV/2SLS are examples of k-class estimators. +LIML is a k-class estimator with k=the LIML eigenvalue lambda; +2SLS is a k-class estimator with k=1; +OLS is a k-class esimator with k=0. +Estimators based on other values of k have been proposed. +Fuller's modified LIML (available with the {cmd:fuller(}{it:#}{cmd:)} option) +sets k = lambda - alpha/(N-L), where lambda is the LIML eigenvalue, +L = number of instruments (L1 excluded and L2 included), +and the Fuller parameter alpha is a user-specified positive constant. +Nagar's bias-adjusted 2SLS estimator can be obtained with the +{cmd:kclass(}{it:#}{cmd:)} option by setting +k = 1 + (L-K)/N, where L-K = number of overidentifying restrictions, +K = number of regressors (K1 endogenous and K2=L2 exogenous) +and N = the sample size. +For a discussion of LIML and k-class estimators, +see Davidson and MacKinnon (1993, pp. 644-51). + +{p} The GMM generalization of the LIML estimator +to the case of possibly heteroskedastic +and autocorrelated disturbances +is the "continuously-updated" GMM estimator or CUE +of Hansen, Heaton and Yaron (1996). +The CUE estimator directly maximizes the GMM objective function +J=N*g'*W(b_cue)*g, where W(b_cue) is an optimal weighting matrix +that depends on the estimated coefficients b_cue. +{cmd:cue}, combined with {cmd:robust}, {cmd:cluster}, and/or {cmd:bw}, +generates coefficient estimates that are efficient in the presence +of the corresponding deviations from homoskedasticity. +Specifying {cmd:cue} with no other options +is equivalent to the combination of the options {cmd:liml} and {cmd:coviv}. +The CUE estimator requires numerical optimization methods, +and the implementation here uses Mata's {cmd:optimize} routine. +The starting values are either IV or two-step efficient GMM +coefficient estimates. +If the user wants to evaluate the CUE objective function at +an arbitrary user-defined coefficient vector instead of having {cmd:ivreg210} +find the coefficient vector that minimizes the objective function, +the {cmd:b0(}{it:matrix}{cmd:)} option can be used. +The value of the CUE objective function at {cmd:b0} +is the Sargan or Hansen J statistic reported in the output. + +{marker s_sumopt}{dlgtab:Summary of robust, HAC, AC, GMM, LIML and CUE options} + + + +Estimator {col 20}No VCE option specificed {col 65}VCE option + option {col 60}{cmd:robust}, {cmd:cluster}, {cmd:bw}, {cmd:kernel} +{hline} +(none){col 15}IV/2SLS{col 60}IV/2SLS with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:liml}{col 15}LIML{col 60}LIML with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:gmm2s}{col 15}IV/2SLS{col 60}Two-step GMM with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:cue}{col 15}LIML{col 60}CUE GMM with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:kclass}{col 15}k-class estimator{col 60}k-class estimator with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:wmatrix}{col 15}Possibly inefficient GMM{col 60}Ineff GMM with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:gmm2s} + {col 15}Two-step GMM{col 60}Two-step GMM with +{cmd:wmatrix}{col 15}with user-specified first step{col 60}robust SEs +{col 15}SEs consistent under homoskedasticity + + +{p}With the {cmd:bw} or {cmd:bw} and {cmd:kernel} VCE options, +SEs are autocorrelation-robust (AC). +Combining the {cmd:robust} option with {cmd:bw}, SEs are heteroskedasticity- and +autocorrelation-robust (HAC). + +{p}For further details, see Hayashi (2000), pp. 206-13 and 226-27 +(on GMM estimation), Wooldridge (2002), p. 193 (on cluster-robust GMM), +and Hayashi (2000), pp. 406-10 or Cushing and McGarvey (1999) +(on kernel-based covariance estimation). + +{marker s_overid}{marker overidtests}{dlgtab:Testing overidentifying restrictions} + +{p}The Sargan-Hansen test is a test of overidentifying restrictions. +The joint null hypothesis is that the instruments are valid +instruments, i.e., uncorrelated with the error term, +and that the excluded instruments are correctly excluded from the estimated equation. +Under the null, the test statistic is distributed as chi-squared +in the number of (L-K) overidentifying restrictions. +A rejection casts doubt on the validity of the instruments. +For the efficient GMM estimator, the test statistic is +Hansen's J statistic, the minimized value of the GMM criterion function. +For the 2SLS estimator, the test statistic is Sargan's statistic, +typically calculated as N*R-squared from a regression of the IV residuals +on the full set of instruments. +Under the assumption of conditional homoskedasticity, +Hansen's J statistic becomes Sargan's statistic. +The J statistic is consistent in the presence of heteroskedasticity +and (for HAC-consistent estimation) autocorrelation; +Sargan's statistic is consistent if the disturbance is homoskedastic +and (for AC-consistent estimation) if it is also autocorrelated. +With {cmd:robust}, {cmd:bw} and/or {cmd:cluster}, +Hansen's J statistic is reported. +In the latter case the statistic allows observations +to be correlated within groups. +For further discussion see e.g. Hayashi (2000, pp. 227-8, 407, 417). + +{p}The Sargan statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg210} by the command {cmd:overid}. +The features of {cmd:ivreg210} that are unavailable in {cmd:overid} +are the J statistic and the C statistic; +the {cmd:overid} options unavailable in {cmd:ivreg210} +are various small-sample and pseudo-F versions of Sargan's statistic +and its close relative, Basmann's statistic. +See help {help overid} (if installed). + +{marker s_endog}{dlgtab:Testing subsets of regressors and instruments for endogeneity} + +{marker ctest}{p}The C statistic +(also known as a "GMM distance" +or "difference-in-Sargan" statistic) +implemented using the {cmd:orthog} option, +allows a test of a subset of the orthogonality conditions, i.e., +it is a test of the exogeneity of one or more instruments. +It is defined as +the difference of the Sargan-Hansen statistic +of the equation with the smaller set of instruments +(valid under both the null and alternative hypotheses) +and the equation with the full set of instruments, +i.e., including the instruments whose validity is suspect. +Under the null hypothesis that +both the smaller set of instruments +and the additional, suspect instruments are valid, +the C statistic is distributed as chi-squared +in the number of instruments tested. +Note that failure to reject the null hypothesis +requires that the full set of orthogonality conditions be valid; +the C statistic and the Sargan-Hansen test statistics +for the equations with both the smaller and full set of instruments +should all be small. +The instruments tested may be either excluded or included exogenous variables. +If excluded exogenous variables are being tested, +the equation that does not use these orthogonality conditions +omits the suspect instruments from the excluded instruments. +If included exogenous variables are being tested, +the equation that does not use these orthogonality conditions +treats the suspect instruments as included endogenous variables. +To guarantee that the C statistic is non-negative in finite samples, +the estimated covariance matrix of the full set orthogonality conditions +is used to calculate both Sargan-Hansen statistics +(in the case of simple IV/2SLS, this amounts to using the MSE +from the unrestricted equation to calculate both Sargan statistics). +If estimation is by LIML, the C statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For further discussion, see Hayashi (2000), pp. 218-22 and pp. 232-34. + +{marker endogtest}{p}Endogeneity tests of one or more endogenous regressors +can implemented using the {cmd:endog} option. +Under the null hypothesis that the specified endogenous regressors +can actually be treated as exogenous, the test statistic is distributed +as chi-squared with degrees of freedom equal to the number of regressors tested. +The endogeneity test implemented by {cmd:ivreg210}, is, like the C statistic, +defined as the difference of two Sargan-Hansen statistics: +one for the equation with the smaller set of instruments, +where the suspect regressor(s) are treated as endogenous, +and one for the equation with the larger set of instruments, +where the suspect regressors are treated as exogenous. +Also like the C statistic, the estimated covariance matrix used +guarantees a non-negative test statistic. +Under conditional homoskedasticity, +this endogeneity test statistic is numerically equal to +a Hausman test statistic; see Hayashi (2000, pp. 233-34). +The endogeneity test statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg210} by the command {cmd:ivendog}. +Unlike the Durbin-Wu-Hausman tests reported by {cmd:ivendog}, +the {cmd:endog} option of {cmd:ivreg210} can report test statistics +that are robust to various violations of conditional homoskedasticity; +the {cmd:ivendog} option unavailable in {cmd:ivreg210} +is the Wu-Hausman F-test version of the endogeneity test. +See help {help ivendog} (if installed). + +{marker s_relevance}{dlgtab:Tests of under- and weak identification} + +{marker idtest}{p}{cmd:ivreg210} automatically reports tests of +both underidentification and weak identification. +The underidentification test is an LM test of whether the equation is identified, +i.e., that the excluded instruments are "relevant", +meaning correlated with the endogenous regressors. +The test is essentially the test of the rank of a matrix: +under the null hypothesis that the equation is underidentified, +the matrix of reduced form coefficients on the L1 excluded instruments +has rank=K1-1 where K1=number of endogenous regressors. +Under the null, +the statistic is distributed as chi-squared +with degrees of freedom=(L1-K1+1). +A rejection of the null indicates that the matrix is full column rank, +i.e., the model is identified. + +{p}For a test of whether a particular endogenous regressor alone is identified, +see the discussion {help ivreg2##apstats:below} of the Angrist-Pischke (2009) procedure. + +{p}When errors are assumed to be i.i.d., +{cmd:ivreg210} automatically reports an LM version of +the Anderson (1951) canonical correlations test. +Denoting the minimum eigenvalue of the canonical correlations as CCEV, +the smallest canonical correlation between the K1 endogenous regressors +and the L1 excluded instruments +(after partialling out the K2=L2 exogenous regressors) +is sqrt(CCEV), +and the Anderson LM test statistic is N*CCEV, +i.e., N times the square of the smallest canonical correlation. +With the {cmd:first} or {cmd:ffirst} options, +{cmd:ivreg210} also reports the closely-related +Cragg-Donald (1993) Wald test statistic. +Again assuming i.i.d. errors, +and denoting the minimum eigenvalue of the Cragg-Donald statistic as CDEV, +CDEV=CCEV/(1-CCEV), +and the Cragg-Donald Wald statistic is N*CDEV. +Like the Anderson LM statistic, the Cragg-Donald Wald statistic +is distributed as chi-squred with (L1-K1+1) degrees of freedom. +Note that a result of rejection of the null +should be treated with caution, +because weak instrument problems may still be present. +See Hall et al. (1996) for a discussion of this test, +and below for discussion of testing for the presence of weak instruments. + +{p}When the i.i.d. assumption is dropped +and {cmd:ivreg210} reports heteroskedastic, AC, HAC +or cluster-robust statistics, +the Anderson LM and Cragg-Donald Wald statistics are no longer valid. +In these cases, {cmd:ivreg210} reports the LM and Wald versions +of the Kleibergen-Paap (2006) rk statistic, +also distributed as chi-squared with (L1-K1+1) degrees of freedom. +The rk statistic can be seen as a generalization of these tests +to the case of non-i.i.d. errors; +see Kleibergen and Paap (2006) for discussion, +and Kleibergen and Schaffer (2007) for a Stata implementation, {cmd:ranktest}. +{cmd:ivreg210} requires {cmd:ranktest} to be installed, +and will prompt the user to install it if necessary. +If {cmd:ivreg210} is invoked with the {cmd:robust} option, +the rk underidentification test statistics will be heteroskedastic-robust, +and similarly with {cmd:bw} and {cmd:cluster}. + +{marker widtest}{p}"Weak identification" arises when the excluded instruments are correlated +with the endogenous regressors, but only weakly. +Estimators can perform poorly when instruments are weak, +and different estimators are more robust to weak instruments (e.g., LIML) +than others (e.g., IV); +see, e.g., Stock and Yogo (2002, 2005) for further discussion. +When errors are assumed to be i.i.d., +the test for weak identification automatically reported +by {cmd:ivreg210} is an F version of the Cragg-Donald Wald statistic, (N-L)/L1*CDEV, +where L is the number of instruments and L1 is the number of excluded instruments. +Stock and Yogo (2005) have compiled critical values +for the Cragg-Donald F statistic for +several different estimators (IV, LIML, Fuller-LIML), +several different definitions of "perform poorly" (based on bias and test size), +and a range of configurations (up to 100 excluded instruments +and up to 2 or 3 endogenous regressors, +depending on the estimator). +{cmd:ivreg210} will report the Stock-Yogo critical values +if these are available; +missing values mean that the critical values +haven't been tabulated or aren't applicable. +See Stock and Yogo (2002, 2005) for details. + +{p}When the i.i.d. assumption is dropped +and {cmd:ivreg210} is invoked with the {cmd:robust}, {cmd:bw} or {cmd:cluster} options, +the Cragg-Donald-based weak instruments test is no longer valid. +{cmd:ivreg210} instead reports a correspondingly-robust +Kleibergen-Paap Wald rk F statistic. +The degrees of freedom adjustment for the rk statistic is (N-L)/L1, +as with the Cragg-Donald F statistic, +except in the cluster-robust case, +when the adjustment is N/(N-1) * (N_clust-1)/N_clust, +following the standard Stata small-sample adjustment for cluster-robust. In the case of two-way clustering, N_clust is the minimum of N_clust1 and N_clust2. +The critical values reported by {cmd:ivreg210} for the Kleibergen-Paap statistic +are the Stock-Yogo critical values for the Cragg-Donald i.i.d. case. +The critical values reported with 2-step GMM +are the Stock-Yogo IV critical values, +and the critical values reported with CUE +are the LIML critical values. + +{marker s_redundancy}{dlgtab:Testing instrument redundancy} + +{marker redtest}{p}The {cmd:redundant} option allows a test of +whether a subset of excluded instruments is "redundant". +Excluded instruments are redundant if the asymptotic efficiency +of the estimation is not improved by using them. +Breusch et al. (1999) show that the condition for the redundancy of a set of instruments +can be stated in several equivalent ways: +e.g., in the reduced form regressions of the endogenous regressors +on the full set of instruments, +the redundant instruments have statistically insignificant coefficients; +or the partial correlations between the endogenous regressors +and the instruments in question are zero. +{cmd:ivreg210} uses a formulation based on testing the rank +of the matrix cross-product between the endogenous regressors +and the possibly-redundant instruments after both have +all other instruments partialled-out; +{cmd:ranktest} is used to test whether the matrix has zero rank. +The test statistic is an LM test +and numerically equivalent to a regression-based LM test. +Under the null that the specified instruments are redundant, +the statistic is distributed as chi-squared +with degrees of freedom=(#endogenous regressors)*(#instruments tested). +Rejection of the null indicates that +the instruments are not redundant. +When the i.i.d. assumption is dropped +and {cmd:ivreg210} reports heteroskedastic, AC, HAC +or cluster-robust statistics, +the redundancy test statistic is similarly robust. +See Baum et al. (2007) for further discussion. + +{p}Calculation and reporting of all underidentification +and weak identification statistics +can be supressed with the {cmd:noid} option. + +{marker s_first}{dlgtab:First-stage regressions, identification, and weak-id-robust inference} + +{marker apstats}{p}The {cmd:first} and {cmd:ffirst} options report +various first-stage results and identification statistics. +Tests of both underidentification and weak identification are reported +for each endogenous regressor separately, +using the method described by Angrist and Pischke (2009), pp. 217-18 +(see also the note on their "Mostly Harmless Econometrics" +{browse "http://www.mostlyharmlesseconometrics.com/2009/10/multivariate-first-stage-f-not/" :blog}. + +{p}The Angrist-Pischke (AP) first-stage chi-squared and F statistics +are tests of underidentification and weak identification, respectively, +of individual endogenous regressors. +They are constructed by "partialling-out" linear projections of the +remaining endogenous regressors. +The AP chi-squared Wald statistic is distributed as chi2(L1-K1+1)) +under the null that the particular endogenous regressor +in question is unidentified. +In the special case of a single endogenous regressor, +the AP statistic reported is identical to underidentification statistics reported +in the {cmd:ffirst} output, +namely the Cragg-Donald Wald statistic (if i.i.d.) +or the Kleibergen-Paap rk Wald statistic (if robust, cluster-robust, AC or HAC +statistics have been requested); +see {help ivreg2##idtest:above}. +Note the difference in the null hypotheses if there are two or more endogenous regressors: +the AP test will fail to reject if a particular endogenous regressor is unidentified, +whereas the Anderson/Cragg-Donald/Kleibergen-Paap tests of underidentification +will fail to reject if {it:any} of the endogenous regressors is unidentified. + +{p}The AP first-stage F statistic is the F form of the same test statistic. +It can be used as a diagnostic for whether a particular endogenous regressor +is "weakly identified" (see {help ivreg2##widtest:above}). +Critical values for the AP first-stage F as a test of weak identification are not available, +but the test statistic can be compared to the Stock-Yogo (2002, 2005) critical +values for the Cragg-Donald F statistic with K1=1. + +{p}The first-stage results are always reported with small-sample statistics, +to be consistent with the recommended use of the first-stage F-test as a diagnostic. +If the estimated equation is reported with robust standard errors, +the first-stage F-test is also robust. + +{p}A full set of first-stage statistics for each of the K1 endogenous regressors +is saved in the matrix e(first). +These include (a) the AP F and chi-squared statistics; (b) the "partial R-squared" +(squared partial correlation) corresponding to the AP statistics; +(c) Shea's (1997) partial R-squared measure (closely related to the AP statistic, +but not amenable to formal testing); (d) the simple F and partial R-squared +statistics for each of the first-stage equations, +with no adjustments if there is more than one endogenous regressor. +In the special case of a single endogenous regressor, +these F statistics and partial R-squareds are identical. + +{marker wirobust}{p}The first-stage output also includes +two statistics that provide weak-instrument robust inference +for testing the significance of the endogenous regressors in the structural equation being estimated. +The first statistic is the Anderson-Rubin (1949) test +(not to be confused with the Anderson-Rubin overidentification test for LIML estimation; +see {help ivreg2##s_liml:above}). +The second is the closely related Stock-Wright (2000) S statistic. +The null hypothesis tested in both cases is that +the coefficients of the endogenous regressors in the structural equation are jointly equal to zero, +and, in addition, that the overidentifying restrictions are valid. +Both tests are robust to the presence of weak instruments. +The tests are equivalent to estimating the reduced form of the equation +(with the full set of instruments as regressors) +and testing that the coefficients of the excluded instruments are jointly equal to zero. +In the form reported by {cmd:ivreg210},the Anderson-Rubin statistic is a Wald test +and the Stock-Wright S statistic is a GMM-distance test. +Both statistics are distributed as chi-squared with L1 degrees of freedom, +where L1=number of excluded instruments. +The traditional F-stat version of the Anderson-Rubin test is also reported. +See Stock and Watson (2000), Dufour (2003), Chernozhukov and Hansen (2005) and Kleibergen (2007) +for further discussion. +For related alternative test statistics that are also robust to weak instruments, +see {help condivreg} and {help rivtest}, +and the corresponding discussions +in Moreira and Poi (2003) and Mikusheva and Poi (2006), +and in Finlay and Magnusson (2009), respectively. + +{p}The {cmd:savefirst} option requests that the individual first-stage regressions +be saved for later access using the {cmd:estimates} command. +If saved, they can also be displayed using {cmd:first} or {cmd:ffirst} and the {cmd:ivreg210} replay syntax. +The regressions are saved with the prefix "_ivreg2_", +unless the user specifies an alternative prefix with the +{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} option. + +{marker s_rf}{dlgtab:Reduced form estimates} + +{p}The {cmd:rf} option requests that the reduced form estimation of the equation be displayed. +The {cmd:saverf} option requests that the reduced form estimation is saved +for later access using the {cmd:estimates} command. +If saved, it can also be displayed using the {cmd:rf} and the {cmd:ivreg210} replay syntax. +The regression is saved with the prefix "_ivreg2_", +unless the user specifies an alternative prefix with the +{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} option. + +{marker s_partial}{dlgtab:Partialling-out exogenous regressors} + +{marker partial}{p}The {cmd:partial(}{it:varlist}{cmd:)} option requests that +the exogenous regressors in {it:varlist} are "partialled out" +from all the other variables (other regressors and excluded instruments) in the estimation. +If the equation includes a constant, it is also automatically partialled out as well. +The coefficients corresponding to the regressors in {it:varlist} are not calculated. +By the Frisch-Waugh-Lovell (FWL) theorem, in IV, +two-step GMM and LIML estimation the coefficients for the remaining regressors +are the same as those that would be obtained if the variables were not partialled out. +(NB: this does not hold for CUE or GMM iterated more than two steps.) +The {cmd:partial} option is most useful when using {cmd:cluster} +and #clusters < (#exogenous regressors + #excluded instruments). +In these circumstances, +the covariance matrix of orthogonality conditions S is not of full rank, +and efficient GMM and overidentification tests are infeasible +since the optimal weighting matrix W = {bind:S^-1} +cannot be calculated. +The problem can be addressed by using {cmd:partial} +to partial out enough exogenous regressors for S to have full rank. +A similar problem arises when the regressors include a variable that is a singleton dummy, +i.e., a variable with one 1 and N-1 zeros or vice versa, +if a robust covariance matrix is requested. +The singleton dummy causes the robust covariance matrix estimator +to be less than full rank. +In this case, partialling-out the variable with the singleton dummy solves the problem. +Specifying {cmd:partial(_cons)} will cause just the constant to be partialled-out, +i.e., the equation will be estimated in deviations-from-means form. +When {cmd:ivreg210} is invoked with {cmd:partial}, +it reports test statistics with the same small-sample adjustments +as if estimating without {cmd:partial}. +Note that after estimation using the {cmd:partial} option, +the post-estimation {cmd:predict} can be used only to generate residuals, +and that in the current implementation, +{cmd:partial} is not compatible with endogenous variables or instruments (included or excluded) +that use time-series operators. + +{marker s_ols}{dlgtab:OLS and Heteroskedastic OLS (HOLS) estimation} + +{p}{cmd:ivreg21-} also allows straightforward OLS estimation +by using the same syntax as {cmd:regress}, i.e., +{it:ivreg210 depvar varlist1}. +This can be useful if the user wishes to use one of the +features of {cmd:ivreg210} in OLS regression, e.g., AC or +HAC standard errors. + +{p}If the list of endogenous variables {it:varlist2} is empty +but the list of excluded instruments {it:varlist_iv} is not, +and the option {cmd:gmm2s} is specified, +{cmd:ivreg210} calculates Cragg's "heteroskedastic OLS" (HOLS) estimator, +an estimator that is more efficient than OLS +in the presence of heteroskedasticity of unknown form +(see Davidson and MacKinnon (1993), pp. 599-600). +If the option {cmd:bw(}{it:#}{cmd:)} is specified, +the HOLS estimator is efficient in the presence of +arbitrary autocorrelation; +if both {cmd:bw(}{it:#}{cmd:)} and {cmd:robust} are specified +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and autocorrelation; +and if {cmd:cluster(}{it:varlist}{cmd:)} is used, +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and within-group correlation. +The efficiency gains of HOLS derive from the orthogonality conditions +of the excluded instruments listed in {it:varlist_iv}. +If no endogenous variables are specified and {cmd:gmm2s} is not specified, +{cmd:ivreg210} reports standard OLS coefficients. +The Sargan-Hansen statistic reported +when the list of endogenous variables {it:varlist2} is empty +is a Lagrange multiplier (LM) test +of the hypothesis that the excluded instruments {it:varlist_iv} are +correctly excluded from the restricted model. +If the estimation is LIML, the LM statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For more on LM tests, see e.g. Wooldridge (2002), pp. 58-60. +Note that because the approach of the HOLS estimator +has applications beyond heteroskedastic disturbances, +and to avoid confusion concerning the robustness of the estimates, +the estimators presented above as "HOLS" +are described in the output of {cmd:ivreg210} +as "2-Step GMM", "CUE", etc., as appropriate. + +{marker s_collin}{dlgtab:Collinearities} + +{p}{cmd:ivreg210} checks the lists of included instruments, +excluded instruments, and endogenous regressors +for collinearities and duplicates. If an endogenous regressor is +collinear with the instruments, it is reclassified as exogenous. If any +endogenous regressors are collinear with each other, some are dropped. +If there are any collinearities among the instruments, some are dropped. +In Stata 9+, excluded instruments are dropped before included instruments. +If any variables are dropped, a list of their names are saved +in the macros {cmd:e(collin)} and/or {cmd:e(dups)}. +Lists of the included and excluded instruments +and the endogenous regressors with collinear variables and duplicates removed +are also saved in macros with "1" appended +to the corresponding macro names. + +{p}Collinearity checks can be supressed with the {cmd:nocollin} option. + +{marker s_speed}{dlgtab:Speed options: nocollin and noid} + +{p}Two options are available for speeding execution. +{cmd:nocollin} specifies that the collinearity checks not be performed. +{cmd:noid} suspends calculation and reporting of +the underidentification and weak identification statistics +in the main output. + +{marker s_small}{dlgtab:Small sample corrections} + +{p}Mean square error = sqrt(RSS/(N-K)) if {cmd:small}, = sqrt(RSS/N) otherwise. + +{p}If {cmd:robust} is chosen, the finite sample adjustment +(see {hi:[R] regress}) to the robust variance-covariance matrix +qc = N/(N-K) if {cmd:small}, qc = 1 otherwise. + +{p}If {cmd:cluster} is chosen, the finite sample adjustment +qc = (N-1)/(N-K)*M/(M-1) if {cmd:small}, where M=number of clusters, +qc = 1 otherwise. +If 2-way clustering is used, M=min(M1,M2), +where M1=number of clusters in group 1 +and M2=number of clusters in group 2. + +{p}The Sargan and C (difference-in-Sargan) statistics use +error variance = RSS/N, i.e., there is no small sample correction. + +{p}A full discussion of these computations and related topics +can be found in Baum, Schaffer, and Stillman (2003) and Baum, Schaffer and +Stillman (2007). Some features of the program postdate the former article and are described in the latter paper. +Some features, such as two-way clustering, postdate the latter article as well. + + +{marker s_options}{title:Options summary} + +{p 0 4}{cmd:gmm2s} requests the two-step efficient GMM estimator. +If no endogenous variables are specified, the estimator is Cragg's HOLS estimator. + +{p 0 4}{cmd:liml} requests the limited-information maximum likelihood estimator. + +{p 0 4}{cmd:fuller(}{it:#}{cmd:)} specifies that Fuller's modified LIML estimator +is calculated using the user-supplied Fuller parameter alpha, +a non-negative number. +Alpha=1 has been suggested as a good choice. + +{p 0 4}{cmd:kclass(}{it:#}{cmd:)} specifies that a general k-class estimator is calculated +using the user-supplied #, a non-negative number. + +{p 0 4}{cmd:coviv} specifies that the matrix used to calculate the +covariance matrix for the LIML or k-class estimator +is based on the 2SLS matrix, i.e., with k=1. +In this case the covariance matrix will differ from that calculated for the 2SLS +estimator only because the estimate of the error variance will differ. +The default is for the covariance matrix to be based on the LIML or k-class matrix. + +{p 0 4}{cmd:cue} requests the GMM continuously-updated estimator (CUE). + +{p 0 4}{cmd:b0(}{it:matrix}{cmd:)} specifies that the J statistic +(i.e., the value of the CUE objective function) +should be calculated for an arbitrary coefficient vector {cmd:b0}. +That vector must be provided as a matrix with appropriate row and column names. +Under- and weak-identification statistics are not reported +in the output. + +{p 0 4}{cmd:robust} specifies that the Eicker/Huber/White/sandwich estimator of +variance is to be used in place of the traditional calculation. {cmd:robust} +combined with {cmd:cluster()} further allows residuals which are not +independent within cluster (although they must be independent between +clusters). See {hi:[U] Obtaining robust variance estimates}. + +{p 0 4}{cmd:cluster}{cmd:(}{it:varlist}{cmd:)} specifies that the observations +are independent across groups (clusters) but not necessarily independent +within groups. +With 1-way clustering, {cmd:cluster}{cmd:(}{it:varname}{cmd:)} +specifies to which group each observation +belongs; e.g., {cmd:cluster(personid)} in data with repeated observations on +individuals. +With 2-way clustering, {cmd:cluster}{cmd:(}{it:varname1 varname2}{cmd:)} +specifies the two (non-nested) groups to which each observation belongs. +Specifying {cmd:cluster()} implies {cmd:robust}. + +{p 0 4}{cmd:bw(}{it:#}{cmd:)} impements AC or HAC covariance estimation +with bandwidth equal to {it:#}, where {it:#} is an integer greater than zero. +Specifying {cmd:robust} implements HAC covariance estimation; +omitting it implements AC covariance estimation. +If the Bartlett (default), Parzen or Quadratic Spectral kernels are selected, +the value {cmd:auto} may be given (rather than an integer) +to invoke Newey and West's (1994) automatic bandwidth selection procedure. + +{p 0 4}{cmd:kernel(}{it:string)}{cmd:)} specifies the kernel +to be used for AC and HAC covariance estimation; +the default kernel is Bartlett (also known in econometrics +as Newey-West). +The full list of kernels available is (abbreviations in parentheses): +Bartlett (bar); Truncated (tru); Parzen (par); Tukey-Hanning (thann); +Tukey-Hamming (thamm); Daniell (dan); Tent (ten); and Quadratic-Spectral (qua or qs). + +{p 4 4}Note: in the cases of the Bartlett, Parzen, +and Tukey-Hanning/Hamming kernels, the number of lags used +to construct the kernel estimate equals the bandwidth minus one. +Stata's official {cmd:newey} implements +HAC standard errors based on the Bartlett kernel, +and requires the user to specify +the maximum number of lags used and not the bandwidth; +see help {help newey}. +If these kernels are used with {cmd:bw(1)}, +no lags are used and {cmd:ivreg210} will report the usual +Eicker/Huber/White/sandwich variance estimates. + +{p 0 4}{cmd:wmatrix(}{it:matrix}{cmd:)} specifies a user-supplied weighting matrix +in place of the computed optimal weighting matrix. +The matrix must be positive definite. +The user-supplied matrix must have the same row and column names +as the instrument variables in the regression model (or a subset thereof). + +{p 0 4}{cmd:smatrix(}{it:matrix}{cmd:)} specifies a user-supplied covariance matrix +of the orthogonality conditions to be used in calculating the covariance matrix of the estimator. +The matrix must be positive definite. +The user-supplied matrix must have the same row and column names +as the instrument variables in the regression model (or a subset thereof). + +{p 0 4}{cmd:orthog}{cmd:(}{it:varlist_ex}{cmd:)} requests that a C-statistic +be calculated as a test of the exogeneity of the instruments in {it:varlist_ex}. +These may be either included or excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instruments must still be identified. + +{p 0 4}{cmd:endog}{cmd:(}{it:varlist_en}{cmd:)} requests that a C-statistic +be calculated as a test of the endogeneity +of the endogenous regressors in {it:varlist_en}. + +{p 0 4}{cmd:redundant}{cmd:(}{it:varlist_ex}{cmd:)} requests an LM test +of the redundancy of the instruments in {it:varlist_ex}. +These must be excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instrumenst must still be identified. + +{p 0 4}{cmd:small} requests that small-sample statistics (F and t-statistics) +be reported instead of large-sample statistics (chi-squared and z-statistics). +Large-sample statistics are the default. +The exception is the statistic for the significance of the regression, +which is always reported as a small-sample F statistic. + +{p 0 4}{cmd:noconstant} suppresses the constant term (intercept) in the +regression. If {cmd:noconstant} is specified, the constant term is excluded +from both the final regression and the first-stage regression. To include a +constant in the first-stage when {cmd:noconstant} is specified, explicitly +include a variable containing all 1's in {it:varlist_iv}. + +{p 0 4}{cmd:first} requests that the full first-stage regression results be displayed, +along with the associated diagnostic and identification statistics. + +{p 0 4}{cmd:ffirst} requests the first-stage diagnostic and identification statistics. +The results are saved in various e() macros. + +{p 0 4}{cmd:nocollin} suppresses the checks for collinearities +and duplicate variables. + +{p 0 4}{cmd:noid} suppresses the calculation and reporting +of underidentification and weak identification statistics. + +{p 0 4}{cmd:savefirst} requests that the first-stage regressions results +are saved for later access using the {cmd:estimates} command. +The names under which the first-stage regressions are saved +are the names of the endogenous regressors prefixed by "_ivreg2_". +If these use Stata's time-series operators, +the "." is replaced by a "_". +The maximum number of first-stage estimation results that can be saved +depends on how many other estimation results the user has already saved +and on the maximum supported by Stata. + +{p 0 4}{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the first-stage regression results be saved using the user-specified prefix +instead of the default "_ivreg2_". + +{p 0 4}{cmd:rf} requests that the reduced-form estimation of the equation +be displayed. + +{p 0 4}{cmd:saverf} requests that the reduced-form estimation of the equation +be saved for later access using the {cmd:estimates} command. +The estimation is stored under the name of the dependent variable +prefixed by "_ivreg2_". +If this uses Stata's time-series operators, +the "." is replaced by a "_". + +{p 0 4}{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the reduced-form estimation be saved using the user-specified prefix +instead of the default "_ivreg2_". + +{p 0 4}{cmd:partial(}{it:varlist}{cmd:)} requests that +the exogenous regressors in {it:varlist} be partialled out +from the other variables in the equation. +If the equation includes a constant, +it is automatically partialled out as well. +The coefficients corresponding to the regressors in {it:varlist} +are not calculated. + +{p 0 4}{cmd:level(}{it:#}{cmd:)} specifies the confidence level, in percent, +for confidence intervals of the coefficients; see help {help level}. + +{p 0 4}{cmd:noheader}, {cmd:eform()}, {cmd:depname()} and {cmd:plus} +are for ado-file writers; see {hi:[R] ivreg} and {hi:[R] regress}. + +{p 0 4}{cmd:nofooter} suppresses the display of the footer containing +identification and overidentification statistics, +exogeneity and endogeneity tests, +lists of endogenous variables and instruments, etc. + +{p 0 4}{cmd:version} causes {cmd:ivreg210} to display its current version number +and to leave it in the macro {cmd:e(version)}. +It cannot be used with any other options. +and will clear any existing {cmd:e()} saved results. + +{marker s_macros}{title:Remarks and saved results} + +{p}{cmd:ivreg210} does not report an ANOVA table. +Instead, it reports the RSS and both the centered and uncentered TSS. +It also reports both the centered and uncentered R-squared. +NB: the TSS and R-squared reported by official {cmd:ivreg} is centered +if a constant is included in the regression, and uncentered otherwise. + +{p}{cmd:ivreg210} saves the following results in {cmd:e()}: + +Scalars +{col 4}{cmd:e(N)}{col 18}Number of observations +{col 4}{cmd:e(yy)}{col 18}Total sum of squares (SS), uncentered (y'y) +{col 4}{cmd:e(yyc)}{col 18}Total SS, centered (y'y - ((1'y)^2)/n) +{col 4}{cmd:e(rss)}{col 18}Residual SS +{col 4}{cmd:e(mss)}{col 18}Model SS =yyc-rss if the eqn has a constant, =yy-rss otherwise +{col 4}{cmd:e(df_m)}{col 18}Model degrees of freedom +{col 4}{cmd:e(df_r)}{col 18}Residual degrees of freedom +{col 4}{cmd:e(r2u)}{col 18}Uncentered R-squared, 1-rss/yy +{col 4}{cmd:e(r2c)}{col 18}Centered R-squared, 1-rss/yyc +{col 4}{cmd:e(r2)}{col 18}Centered R-squared if the eqn has a constant, uncentered otherwise +{col 4}{cmd:e(r2_a)}{col 18}Adjusted R-squared +{col 4}{cmd:e(ll)}{col 18}Log likelihood +{col 4}{cmd:e(rankxx)}{col 18}Rank of the matrix of observations on rhs variables=K +{col 4}{cmd:e(rankzz)}{col 18}Rank of the matrix of observations on instruments=L +{col 4}{cmd:e(rankV)}{col 18}Rank of covariance matrix V of coefficients +{col 4}{cmd:e(rankS)}{col 18}Rank of covariance matrix S of orthogonality conditions +{col 4}{cmd:e(rmse)}{col 18}root mean square error=sqrt(rss/(N-K)) if -small-, =sqrt(rss/N) if not +{col 4}{cmd:e(F)}{col 18}F statistic +{col 4}{cmd:e(N_clust)}{col 18}Number of clusters (or min(N_clust1,N_clust2) if 2-way clustering) +{col 4}{cmd:e(N_clust1)}{col 18}Number of clusters in dimension 1 (if 2-way clustering) +{col 4}{cmd:e(N_clust2)}{col 18}Number of clusters in dimension 2 (if 2-way clustering) +{col 4}{cmd:e(bw)}{col 18}Bandwidth +{col 4}{cmd:e(lambda)}{col 18}LIML eigenvalue +{col 4}{cmd:e(kclass)}{col 18}k in k-class estimation +{col 4}{cmd:e(fuller)}{col 18}Fuller parameter alpha +{col 4}{cmd:e(sargan)}{col 18}Sargan statistic +{col 4}{cmd:e(sarganp)}{col 18}p-value of Sargan statistic +{col 4}{cmd:e(sargandf)}{col 18}dof of Sargan statistic = degree of overidentification = L-K +{col 4}{cmd:e(j)}{col 18}Hansen J statistic +{col 4}{cmd:e(jp)}{col 18}p-value of Hansen J statistic +{col 4}{cmd:e(jdf)}{col 18}dof of Hansen J statistic = degree of overidentification = L-K +{col 4}{cmd:e(arubin)}{col 18}Anderson-Rubin overidentification LR statistic N*ln(lambda) +{col 4}{cmd:e(arubinp)}{col 18}p-value of Anderson-Rubin overidentification LR statistic +{col 4}{cmd:e(arubin_lin)}{col 18}Anderson-Rubin linearized overidentification statistic N*(lambda-1) +{col 4}{cmd:e(arubin_linp)}{col 18}p-value of Anderson-Rubin linearized overidentification statistic +{col 4}{cmd:e(arubindf)}{col 18}dof of A-R overid statistic = degree of overidentification = L-K +{col 4}{cmd:e(idstat)}{col 18}LM test statistic for underidentification (Anderson or Kleibergen-Paap) +{col 4}{cmd:e(idp)}{col 18}p-value of underidentification LM statistic +{col 4}{cmd:e(iddf)}{col 18}dof of underidentification LM statistic +{col 4}{cmd:e(widstat)}{col 18}F statistic for weak identification (Cragg-Donald or Kleibergen-Paap) +{col 4}{cmd:e(arf)}{col 18}Anderson-Rubin F-test of significance of endogenous regressors +{col 4}{cmd:e(arfp)}{col 18}p-value of Anderson-Rubin F-test of endogenous regressors +{col 4}{cmd:e(archi2)}{col 18}Anderson-Rubin chi-sq test of significance of endogenous regressors +{col 4}{cmd:e(archi2p)}{col 18}p-value of Anderson-Rubin chi-sq test of endogenous regressors +{col 4}{cmd:e(ardf)}{col 18}degrees of freedom of Anderson-Rubin tests of endogenous regressors +{col 4}{cmd:e(ardf_r)}{col 18}denominator degrees of freedom of AR F-test of endogenous regressors +{col 4}{cmd:e(redstat)}{col 18}LM statistic for instrument redundancy +{col 4}{cmd:e(redp)}{col 18}p-value of LM statistic for instrument redundancy +{col 4}{cmd:e(reddf)}{col 18}dof of LM statistic for instrument redundancy +{col 4}{cmd:e(cstat)}{col 18}C-statistic +{col 4}{cmd:e(cstatp)}{col 18}p-value of C-statistic +{col 4}{cmd:e(cstatdf)}{col 18}Degrees of freedom of C-statistic +{col 4}{cmd:e(cons)}{col 18}1 when equation has a Stata-supplied constant; 0 otherwise +{col 4}{cmd:e(partialcons)}{col 18}as above but prior to partialling-out (see {cmd:e(partial)}) +{col 4}{cmd:e(partial_ct)}{col 18}Number of partialled-out variables (see {cmd:e(partial)}) + +Macros +{col 4}{cmd:e(cmd)}{col 18}ivreg210 +{col 4}{cmd:e(cmdline)}{col 18}Command line invoking ivreg210 +{col 4}{cmd:e(version)}{col 18}Version number of ivreg210 +{col 4}{cmd:e(model)}{col 18}ols, iv, gmm, liml, or kclass +{col 4}{cmd:e(depvar)}{col 18}Name of dependent variable +{col 4}{cmd:e(instd)}{col 18}Instrumented (RHS endogenous) variables +{col 4}{cmd:e(insts)}{col 18}Instruments +{col 4}{cmd:e(inexog)}{col 18}Included instruments (regressors) +{col 4}{cmd:e(exexog)}{col 18}Excluded instruments +{col 4}{cmd:e(collin)}{col 18}Variables dropped because of collinearities +{col 4}{cmd:e(dups)}{col 18}Duplicate variables +{col 4}{cmd:e(ecollin)}{col 18}Endogenous variables reclassified as exogenous because of +{col 20}collinearities with instruments +{col 4}{cmd:e(clist)}{col 18}Instruments tested for orthogonality +{col 4}{cmd:e(redlist)}{col 18}Instruments tested for redundancy +{col 4}{cmd:e(partial)}{col 18}Partialled-out exogenous regressors +{col 4}{cmd:e(small)}{col 18}small +{col 4}{cmd:e(wtype)}{col 18}weight type +{col 4}{cmd:e(wexp)}{col 18}weight expression +{col 4}{cmd:e(clustvar)}{col 18}Name of cluster variable +{col 4}{cmd:e(vcetype)}{col 18}Covariance estimation method +{col 4}{cmd:e(kernel)}{col 18}Kernel +{col 4}{cmd:e(tvar)}{col 18}Time variable +{col 4}{cmd:e(ivar)}{col 18}Panel variable +{col 4}{cmd:e(firsteqs)}{col 18}Names of stored first-stage equations +{col 4}{cmd:e(rfeq)}{col 18}Name of stored reduced-form equation +{col 4}{cmd:e(predict)}{col 18}Program used to implement predict + +Matrices +{col 4}{cmd:e(b)}{col 18}Coefficient vector +{col 4}{cmd:e(V)}{col 18}Variance-covariance matrix of the estimators +{col 4}{cmd:e(S)}{col 18}Covariance matrix of orthogonality conditions +{col 4}{cmd:e(W)}{col 18}GMM weighting matrix (=inverse of S if efficient GMM estimator) +{col 4}{cmd:e(first)}{col 18}First-stage regression results +{col 4}{cmd:e(ccev)}{col 18}Eigenvalues corresponding to the Anderson canonical correlations test +{col 4}{cmd:e(cdev)}{col 18}Eigenvalues corresponding to the Cragg-Donald test + +Functions +{col 4}{cmd:e(sample)}{col 18}Marks estimation sample + + + +{marker s_examples}{title:Examples} + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta" : . use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta }{p_end} +{p 8 12}(Wages of Very Young Men, Zvi Griliches, J.Pol.Ec. 1976) + +{p 8 12}{stata "xi i.year" : . xi i.year} + +{col 0}(Instrumental variables. Examples follow Hayashi 2000, p. 255.) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt)} + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), small ffirst" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), small ffirst} + +{col 0}(Testing for the presence of heteroskedasticity in IV/GMM estimation) + +{p 8 12}{stata "ivhettest, fitlev" : . ivhettest, fitlev} + +{col 0}(Two-step GMM efficient in the presence of arbitrary heteroskedasticity) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust} + +{p 0}(GMM with user-specified first-step weighting matrix or matrix of orthogonality conditions) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), robust" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), robust} + +{p 8 12}{stata "predict double uhat if e(sample), resid" : . predict double uhat if e(sample), resid} + +{p 8 12}{stata "mat accum S = `e(insts)' [iw=uhat^2]" : . mat accum S = `e(insts)' [iw=uhat^2]} + +{p 8 12}{stata "mat S = 1/`e(N)' * S" : . mat S = 1/`e(N)' * S} + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust smatrix(S)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust smatrix(S)} + +{p 8 12}{stata "mat W = invsym(S)" : . mat W = invsym(S)} + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust wmatrix(W)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust wmatrix(W)} + +{p 0}(Equivalence of J statistic and Wald tests of included regressors, irrespective of instrument choice (Ahn, 1997)) + +{p 8 12}{stata "ivreg210 lw (iq=med kww age), gmm2s" : . ivreg210 lw (iq=med kww age), gmm2s} + +{p 8 12}{stata "mat S0 = e(S)" : . mat S0 = e(S)} + +{p 8 12}{stata "qui ivreg210 lw (iq=kww) med age, gmm2s smatrix(S0)" : . qui ivreg210 lw (iq=kww) med age, gmm2s smatrix(S0)} + +{p 8 12}{stata "test med age" : . test med age} + +{p 8 12}{stata "qui ivreg210 lw (iq=med) kww age, gmm2s smatrix(S0)" : . qui ivreg210 lw (iq=med) kww age, gmm2s smatrix(S0)} + +{p 8 12}{stata "test kww age" : . test kww age} + +{p 8 12}{stata "qui ivreg210 lw (iq=age) med kww, gmm2s smatrix(S0)" : . qui ivreg210 lw (iq=age) med kww, gmm2s smatrix(S0)} + +{p 8 12}{stata "test med kww" : . test med kww} + +{p 0}(Continuously-updated GMM (CUE) efficient in the presence of arbitrary heteroskedasticity. NB: may require 30+ iterations.) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust} + +{col 0}(Sargan-Basmann tests of overidentifying restrictions for IV estimation) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt)} + +{p 8 12}{stata "overid, all" : . overid, all} + +{col 0}(Tests of exogeneity and endogeneity) + +{col 0}(Test the exogeneity of one regressor) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(s)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(s)} + +{col 0}(Test the exogeneity of two excluded instruments) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(age mrt)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(age mrt)} + +{col 0}(Frisch-Waugh-Lovell (FWL): equivalence of estimations with and without partialling-out) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns _I* (iq=kww age), cluster(year)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age), cluster(year)} + +{p 8 12}{stata "ivreg210 lw s expr tenure rns _I* (iq=kww age), cluster(year) partial(_I*)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age), cluster(year) partial(_I*)} + +{col 0}({cmd:partial()}: efficient GMM with #clusters<#instruments feasible after partialling-out) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns _I* (iq=kww age), cluster(year) partial(_I*) gmm2s" : . ivreg210 lw s expr tenure rns smsa (iq=med kww age), cluster(year) partial(_I*) gmm2s} + +{col 0}(Examples following Wooldridge 2002, pp.59, 61) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta" : . use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta } + +{col 0}(Equivalence of DWH endogeneity test when regressor is endogenous...) + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6)" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6)} + +{p 8 12}{stata "ivendog educ" :. ivendog educ} + +{col 0}(... endogeneity test using the {cmd:endog} option) + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), endog(educ)" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), endog(educ)} + +{col 0}(...and C-test of exogeneity when regressor is exogenous, using the {cmd:orthog} option) + +{p 8 12}{stata "ivreg210 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)" : . ivreg210 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)} + +{col 0}(Heteroskedastic Ordinary Least Squares, HOLS) + +{p 8 12}{stata "ivreg210 lwage exper expersq educ (=age kidslt6 kidsge6), gmm2s" : . ivreg210 lwage exper expersq educ (=age kidslt6 kidsge6), gmm2s} + +{col 0}(Equivalence of Cragg-Donald Wald F statistic and F-test from first-stage regression +{col 0}in special case of single endogenous regressor. Also illustrates {cmd:savefirst} option.) + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), savefirst" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), savefirst} + +{p 8 12}{stata "di e(widstat)" : . di e(widstat)} + +{p 8 12}{stata "estimates restore _ivreg2_educ" : . estimates restore _ivreg2_educ} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Equivalence of Kleibergen-Paap robust rk Wald F statistic and F-test from first-stage +{col 0}regression in special case of single endogenous regressor.) + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust savefirst" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust savefirst} + +{p 8 12}{stata "di e(widstat)" : . di e(widstat)} + +{p 8 12}{stata "estimates restore _ivreg2_educ" : . estimates restore _ivreg2_educ} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Equivalence of Kleibergen-Paap robust rk LM statistic for identification and LM test +{col 0}of joint significance of excluded instruments in first-stage regression in special +{col 0}case of single endogenous regressor. Also illustrates use of {cmd:ivreg210} to perform an +{col 0}LM test in OLS estimation.) + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust} + +{p 8 12}{stata "di e(idstat)" : . di e(idstat)} + +{p 8 12}{stata "ivreg210 educ exper expersq (=age kidslt6 kidsge6) if e(sample), robust" : . ivreg210 educ exper expersq (=age kidslt6 kidsge6) if e(sample), robust} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(Equivalence of an LM test of an excluded instrument for redundancy and an LM test of +{col 0}significance from first-stage regression in special case of single endogenous regressor.) + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust redundant(age)" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust redundant(age)} + +{p 8 12}{stata "di e(redstat)" : . di e(redstat)} + +{p 8 12}{stata "ivreg210 educ exper expersq kidslt6 kidsge6 (=age) if e(sample), robust" : . ivreg210 educ exper expersq kidslt6 kidsge6 (=age) if e(sample), robust} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(Weak-instrument robust inference: Anderson-Rubin Wald F and chi-sq and +{col 0}Stock-Wright S statistics. Also illusrates use of {cmd:saverf} option.) + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust ffirst saverf" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust ffirst saverf} + +{p 8 12}{stata "di e(arf)" : . di e(arf)} + +{p 8 12}{stata "di e(archi2)" : . di e(archi2)} + +{p 8 12}{stata "di e(sstat)" : . di e(sstat)} + +{col 0}(Obtaining the Anderson-Rubin Wald F statistic from the reduced-form estimation) + +{p 8 12}{stata "estimates restore _ivreg2_lwage" : . estimates restore _ivreg2_lwage} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Obtaining the Anderson-Rubin Wald chi-sq statistic from the reduced-form estimation. +{col 0}Use {cmd:ivreg210} without {cmd:small} to obtain large-sample test statistic.) + +{p 8 12}{stata "ivreg210 lwage exper expersq age kidslt6 kidsge6, robust" : . ivreg210 lwage exper expersq age kidslt6 kidsge6, robust} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(chi2)" : . di r(chi2)} + +{col 0}(Obtaining the Stock-Wright S statistic as the value of the GMM CUE objective function. +{col 0}Also illustrates use of {cmd:b0} option. Coefficients on included exogenous regressors +{col 0}are OLS coefficients, which is equivalent to partialling them out before obtaining +{col 0}the value of the CUE objective function.) + +{p 8 12}{stata "mat b = 0" : . mat b = 0} + +{p 8 12}{stata "mat colnames b = educ" : . mat colnames b = educ} + +{p 8 12}{stata "qui ivreg210 lwage exper expersq" : . qui ivreg210 lwage exper expersq} + +{p 8 12}{stata "mat b = b, e(b)" : . mat b = b, e(b)} + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust b0(b)" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust b0(b)} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(LIML and k-class estimation using Klein data) + +{col 9}{stata "webuse klein" :. webuse klein} +{col 9}{stata "tsset yr" :. tsset yr} + +{col 0}(LIML estimates of Klein's consumption function) + +{p 8 12}{stata "ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml" :. ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml} + +{col 0}(Equivalence of LIML and CUE+homoskedasticity+independence) + +{p 8 12}{stata "ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml coviv" :. ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml coviv} + +{p 8 12}{stata "ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), cue" :. ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), cue} + +{col 0}(Fuller's modified LIML with alpha=1) + +{p 8 12}{stata "ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), fuller(1)" :. ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), fuller(1)} + +{col 0}(k-class estimation with Nagar's bias-adjusted IV, k=1+(L-K)/N=1+4/21=1.19) + +{p 8 12}{stata "ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), kclass(1.19)" :. ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), kclass(1.19)} + +{col 0}(Kernel-based covariance estimation using time-series data) + +{col 9}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta" :. use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta} +{col 9}{stata "tsset year, yearly" :. tsset year, yearly} + +{col 0}(Autocorrelation-consistent (AC) inference in an OLS Regression) + +{p 8 12}{stata "ivreg210 cinf unem, bw(3)" :. ivreg210 cinf unem, bw(3)} + +{p 8 12}{stata "ivreg210 cinf unem, kernel(qs) bw(auto)" :. ivreg210 cinf unem, kernel(qs) bw(auto)} + +{col 0}(Heteroskedastic and autocorrelation-consistent (HAC) inference in an OLS regression) + +{p 8 12}{stata "ivreg210 cinf unem, bw(3) kernel(bartlett) robust small" :. ivreg210 cinf unem, bw(3) kernel(bartlett) robust small} + +{p 8 12}{stata "newey cinf unem, lag(2)" :. newey cinf unem, lag(2)} + +{col 0}(AC and HAC in IV and GMM estimation) + +{p 8 12}{stata "ivreg210 cinf (unem = l(1/3).unem), bw(3)" :. ivreg210 cinf (unem = l(1/3).unem), bw(3)} + +{p 8 12}{stata "ivreg210 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(thann)" :. ivreg210 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(thann)} + +{p 8 12}{stata "ivreg210 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(qs) robust orthog(l1.unem)" :. ivreg210 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(qs) robust orthog(l1.unem)} + +{col 0}(Examples using Large N, Small T Panel Data) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta" : . use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta }{p_end} +{p 8 12}{stata "tsset id year" :. tsset id year} + +{col 0}(Two-step effic. GMM in the presence of arbitrary heteroskedasticity and autocorrelation) + +{p 8 12}{stata "ivreg210 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm2s cluster(id)": . ivreg210 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm2s cluster(id)} + +{col 0}(Kiefer (1980) SEs - robust to arbitrary serial correlation but not heteroskedasticity) + +{p 8 12}{stata "ivreg210 n w k, kiefer": . ivreg210 n w k, kiefer} + +{p 8 12}{stata "ivreg210 n w k, bw(9) kernel(tru)": . ivreg210 n w k, bw(9) kernel(tru)} + +{col 0}(Equivalence of cluster-robust and kernel-robust with truncated kernel and max bandwidth) + +{p 8 12}{stata "ivreg210 n w k, cluster(id)": . ivreg210 n w k, cluster(id)} + +{p 8 12}{stata "ivreg210 n w k, bw(9) kernel(tru) robust)": . ivreg210 n w k, bw(9) kernel(tru) robust} + +{col 0}(Examples using Small N, Large T Panel Data. NB: T is actually not very large - only +{col 0}20 - so results should be interpreted with caution) + +{p 8 12}{stata "webuse grunfeld" : . webuse grunfeld }{p_end} +{p 8 12}{stata "tsset" : . tsset }{p_end} + +{col 0}(Autocorrelation-consistent (AC) inference) + +{p 8 12}{stata "ivreg210 invest mvalue kstock, bw(1) kernel(tru)": . ivreg210 invest mvalue kstock, bw(1) kernel(tru)} + +{col 0}(Heteroskedastic and autocorrelation-consistent (HAC) inference) + +{p 8 12}{stata "ivreg210 invest mvalue kstock, robust bw(1) kernel(tru)": . ivreg210 invest mvalue kstock, robust bw(1) kernel(tru)} + +{col 0}(HAC inference, SEs also robust to disturbances correlated across panels) + +{p 8 12}{stata "ivreg210 invest mvalue kstock, robust cluster(year) bw(1) kernel(tru)": . ivreg210 invest mvalue kstock, robust cluster(year) bw(1) kernel(tru)} + +{col 0}(Equivalence of Driscoll-Kraay SEs as implemented by {cmd:ivreg210} and {cmd:xtscc}) +{col 0}(See Hoeschle (2007) for discussion of {cmd:xtscc}) + +{p 8 12}{stata "ivreg210 invest mvalue kstock, dkraay(2) small": . ivreg210 invest mvalue kstock, dkraay(2) small} + +{p 8 12}{stata "ivreg210 invest mvalue kstock, cluster(year) bw(2) small": . ivreg210 invest mvalue kstock, cluster(year) bw(2) small} + +{p 8 12}{stata "xtscc invest mvalue kstock, lag(1)": . xtscc invest mvalue kstock, lag(1)} + +{col 0}(Examples using Large N, Large T Panel Data. NB: T is again not very large - only +{col 0}20 - so results should be interpreted with caution) + +{p 8 12}{stata "webuse nlswork" : . webuse nlswork }{p_end} +{p 8 12}{stata "tsset" : . tsset }{p_end} + +{col 0}(One-way cluster-robust: SEs robust to arbitrary heteroskedasticity and within-panel +{col 0}autocorrelation) + +{p 8 12}{stata "ivreg210 ln_w grade age ttl_exp tenure, cluster(idcode)": . ivreg210 ln_w grade age ttl_exp tenure, cluster(idcode) }{p_end} + +{col 0}(Two-way cluster-robust: SEs robust to arbitrary heteroskedasticity and within-panel +{col 0}autocorrelation, and contemporaneous cross-panel correlation, i.e., the cross-panel +{col 0}correlation is not autocorrelated) + +{p 8 12}{stata "ivreg210 ln_w grade age ttl_exp tenure, cluster(idcode year)": . ivreg210 ln_w grade age ttl_exp tenure, cluster(idcode year) }{p_end} + +{col 0}(Two-way cluster-robust: SEs robust to arbitrary heteroskedasticity and within-panel +{col 0}autocorrelation and cross-panel autocorrelated disturbances that disappear after 2 lags) + +{p 8 12}{stata "ivreg210 ln_w grade age ttl_exp tenure, cluster(idcode year) bw(2) kernel(tru) ": . ivreg210 ln_w grade age ttl_exp tenure, cluster(idcode year) bw(2) kernel(tru) }{p_end} + + + +{marker s_refs}{title:References} + +{p 0 4}Ahn, Seung C. 1997. Orthogonality tests in linear models. Oxford Bulletin +of Economics and Statistics, Vol. 59, pp. 183-186. + +{p 0 4}Anderson, T.W. 1951. Estimating linear restrictions on regression coefficients +for multivariate normal distributions. Annals of Mathematical Statistics, Vol. 22, pp. 327-51. + +{p 0 4}Anderson, T. W. and H. Rubin. 1949. Estimation of the parameters of a single equation +in a complete system of stochastic equations. Annals of Mathematical Statistics, Vol. 20, +pp. 46-63. + +{p 0 4}Anderson, T. W. and H. Rubin. 1950. The asymptotic properties of estimates of the parameters of a single +equation in a complete system of stochastic equations. Annals of Mathematical Statistics, +Vol. 21, pp. 570-82. + +{p 0 4}Angrist, J.D. and Pischke, J.-S. 2009. Mostly Harmless Econometrics: An Empiricist's Companion. +Princeton: Princeton University Press. + +{p 0 4}Baum, C.F., Schaffer, M.E., and Stillman, S. 2003. Instrumental Variables and GMM: +Estimation and Testing. The Stata Journal, Vol. 3, No. 1, pp. 1-31. +{browse "http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html":http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html}. +Working paper version: Boston College Department of Economics Working Paper No. 545. +{browse "http://ideas.repec.org/p/boc/bocoec/545.html":http://ideas.repec.org/p/boc/bocoec/545.html}. +Citations in {browse "http://scholar.google.com/scholar?oi=bibs&hl=en&cites=9432785573549481148":published work}. + +{p 0 4}Baum, C. F., Schaffer, M.E., and Stillman, S. 2007. Enhanced routines for instrumental variables/GMM estimation and testing. +The Stata Journal, Vol. 7, No. 4, pp. 465-506. +{browse "http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html":http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html}. +Working paper version: Boston College Department of Economics Working Paper No. 667. +{browse "http://ideas.repec.org/p/boc/bocoec/667.html":http://ideas.repec.org/p/boc/bocoec/667.html}. +Citations in {browse "http://scholar.google.com/scholar?oi=bibs&hl=en&cites=1691909976816211536":published work}. + +{p 0 4}Breusch, T., Qian, H., Schmidt, P. and Wyhowski, D. 1999. +Redundancy of moment conditions. +Journal of Econometrics, Vol. 9, pp. 89-111. + +{p 0 4}Cameron, A.C., Gelbach, J.B. and Miller, D.L. 2006. +Robust Inference with Multi-Way Clustering. +NBER Technical Working paper 327. +{browse "http://www.nber.org/papers/t0327":http://www.nber.org/papers/t0327}. +Forthcoming in the Journal of Business and Economic Statistics. +{cmd:cgmreg} is available at +{browse "http://www.econ.ucdavis.edu/faculty/dlmiller/statafiles":http://www.econ.ucdavis.edu/faculty/dlmiller/statafiles}. + +{p 0 4}Chernozhukov, V. and Hansen, C. 2005. The Reduced Form: +A Simple Approach to Inference with Weak Instruments. +Working paper, University of Chicago, Graduate School of Business. + +{p 0 4}Cragg, J.G. and Donald, S.G. 1993. Testing Identfiability and Specification in +Instrumental Variables Models. Econometric Theory, Vol. 9, pp. 222-240. + +{p 0 4}Cushing, M.J. and McGarvey, M.G. 1999. Covariance Matrix Estimation. +In L. Matyas (ed.), Generalized Methods of Moments Estimation. +Cambridge: Cambridge University Press. + +{p 0 4}Davidson, R. and MacKinnon, J. 1993. Estimation and Inference in Econometrics. +1993. New York: Oxford University Press. + +{p 0 4}Driscoll, J.C. and Kraay, A. 1998. Consistent Covariance Matrix Estimation With Spatially Dependent Panel Data. +Review of Economics and Statistics. Vol. 80, No. 4, pp. 549-560. + +{p 0 4}Dufour, J.M. 2003. Identification, Weak Instruments and Statistical Inference +in Econometrics. Canadian Journal of Economics, Vol. 36, No. 4, pp. 767-808. +Working paper version: CIRANO Working Paper 2003s-49. +{browse "http://www.cirano.qc.ca/pdf/publication/2003s-49.pdf":http://www.cirano.qc.ca/pdf/publication/2003s-49.pdf}. + +{p 0 4}Finlay, K., and Magnusson, L.M. 2009. Implementing Weak-Instrument Robust Tests +for a General Class of Instrumental-Variables Models. +The Stata Journal, Vol. 9, No. 3, pp. 398-421. +{browse "http://www.stata-journal.com/article.html?article=st0171":http://www.stata-journal.com/article.html?article=st0171}. + +{p 0 4}Hall, A.R., Rudebusch, G.D. and Wilcox, D.W. 1996. Judging Instrument Relevance in +Instrumental Variables Estimation. International Economic Review, Vol. 37, No. 2, pp. 283-298. + +{p 0 4}Hayashi, F. Econometrics. 2000. Princeton: Princeton University Press. + +{p 0 4}Hansen, L.P., Heaton, J., and Yaron, A. 1996. Finite Sample Properties +of Some Alternative GMM Estimators. Journal of Business and Economic Statistics, Vol. 14, No. 3, pp. 262-280. + +{p 0 4}Hoechle, D. 2007. Robust Standard Errors for Panel Regressions with Crossñsectional Dependence. +Stata Journal, Vol. 7, No. 3, pp. 281-312. +{browse "http://www.stata-journal.com/article.html?article=st0128":http://www.stata-journal.com/article.html?article=st0128}. + +{p 0 4}Kiefer, N.M. 1980. Estimation of Fixed Effect Models for Time Series of Cross-Sections with +Arbitrary Intertemporal Covariance. Journal of Econometrics, Vol. 14, No. 2, pp. 195-202. + +{p 0 4}Kleibergen, F. 2007. Generalizing Weak Instrument Robust Statistics Towards Multiple Parameters, Unrestricted Covariance Matrices and Identification Statistics. Journal of Econometrics, forthcoming. + +{p 0 4}Kleibergen, F. and Paap, R. 2006. Generalized Reduced Rank Tests Using the Singular Value Decomposition. +Journal of Econometrics, Vol. 133, pp. 97-126. + +{p 0 4}Kleibergen, F. and Schaffer, M.E. 2007. ranktest: Stata module for testing the rank +of a matrix using the Kleibergen-Paap rk statistic. +{browse "http://ideas.repec.org/c/boc/bocode/s456865.html":http://ideas.repec.org/c/boc/bocode/s456865.html}. + +{p 0 4}Mikusheva, A. and Poi, B.P. 2006. +Tests and Confidence Sets with Correct Size When Instruments are Potentially Weak. The Stata Journal, Vol. 6, No. 3, pp. 335-347. + +{p 0 4}Moreira, M.J. and Poi, B.P. 2003. Implementing Tests with the Correct Size in the Simultaneous Equations Model. The Stata Journal, Vol. 3, No. 1, pp. 57-70. + +{p 0 4}Newey, W.K. and K.D. West, 1994. Automatic Lag Selection in Covariance Matrix Estimation. Review of Economic Studies, Vol. 61, No. 4, pp. 631-653. + +{p 0 4}Shea, J. 1997. Instrument Relevance in Multivariate Linear Models: +A Simple Measure. +Review of Economics and Statistics, Vol. 49, No. 2, pp. 348-352. + +{p 0 4}Stock, J.H. and Wright, J.H. 2000. GMM with Weak Identification. +Econometrica, Vol. 68, No. 5, September, pp. 1055-1096. + +{p 0 4}Stock, J.H. and Yogo, M. 2005. Testing for Weak Instruments in Linear IV Regression. In D.W.K. Andrews and J.H. Stock, eds. Identification and Inference for Econometric Models: Essays in Honor of Thomas Rothenberg. Cambridge: Cambridge University Press, 2005, pp. 80Ò108. +Working paper version: NBER Technical Working Paper 284. +{browse "http://www.nber.org/papers/T0284":http://www.nber.org/papers/T0284}. + +{p 0 4}Thompson, S.B. 2009. Simple Formulas for Standard Errors that Cluster by Both Firm and Time. +{browse "http://ssrn.com/abstract=914002":http://ssrn.com/abstract=914002}. + +{p 0 4}Wooldridge, J.M. 2002. Econometric Analysis of Cross Section and Panel Data. Cambridge, MA: MIT Press. + + +{marker s_acknow}{title:Acknowledgements} + +{p}We would like to thanks various colleagues who helped us along the way, including +David Drukker, +Frank Kleibergen, +Austin Nichols, +Brian Poi, +Vince Wiggins, +and, not least, the users of {cmd:ivreg2} +who have provided suggestions, +spotted bugs, +and helped test the package. +We are also grateful to Jim Stock and Moto Yogo for permission to reproduce +their critical values for the Cragg-Donald statistic. + +{marker s_citation}{title:Citation of ivreg210} + +{p}{cmd:ivreg210} is not an official Stata command. It is a free contribution +to the research community, like a paper. Please cite it as such: {p_end} + +{phang}Baum, C.F., Schaffer, M.E., Stillman, S. 2015. +ivreg210: Stata module for extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression. +{browse "http://ideas.repec.org/c/boc/bocode/sS457955.html":http://ideas.repec.org/c/boc/bocode/sS457955.html}{p_end} + +{title:Authors} + + Christopher F Baum, Boston College, USA + baum@bc.edu + + Mark E Schaffer, Heriot-Watt University, UK + m.e.schaffer@hw.ac.uk + + Steven Stillman, Motu Economic and Public Policy Research + stillman@motu.org.nz + + +{title:Also see} + +{p 1 14}Articles:{it:Stata Journal}, volume 3, number 1: {browse "http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html":st0030}{p_end} +{p 10 14}{it:Stata Journal}, volume 7, number 4: {browse "http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html":st0030_3}{p_end} + +{p 1 14}Manual: {hi:[U] 23 Estimation and post-estimation commands}{p_end} +{p 10 14}{hi:[U] 29 Overview of model estimation in Stata}{p_end} +{p 10 14}{hi:[R] ivreg}{p_end} + +{p 1 10}On-line: help for {help ivregress}, {help ivreg}, {help newey}; +{help overid}, {help ivendog}, {help ivhettest}, {help ivreset}, +{help xtivreg2}, {help xtoverid}, {help ranktest}, +{help condivreg} (if installed); +{help rivtest} (if installed); +{help cgmreg} (if installed); +{help xtscc} (if installed); +{help est}, {help postest}; +{help regress}{p_end} diff --git a/ado/i/ivreg210_p.ado b/ado/i/ivreg210_p.ado new file mode 100644 index 0000000..0051a99 --- /dev/null +++ b/ado/i/ivreg210_p.ado @@ -0,0 +1,112 @@ +*! ivreg210_p 1.0.8 19Jan2015 +*! based on ivreg2_p 1.0.8 30Jan2011 +*! author mes +* 1.0.1: 25apr2002 original version +* 1.0.2: 28jun2005 version 8.2 +* 1.0.3: 1Aug2006 complete rewrite plus fwl option +* 1.0.4: 26Jan2007 eliminated double reporting of #MVs +* 1.0.5: 2Feb2007 small fix to allow fwl of just _cons +* 1.0.6: 19Aug2007 replacement of "fwl" with "partial" in conjuction with new ivreg2 syntax +* 1.0.7: 4Feb2010 version check update +* 1.0.8: 30Jan2011 re-introduced stdp option (hadn't been supported after fwl/partial) +* and added labelling of created residual variable + +program define ivreg210_p + version 8.2 + syntax newvarname [if] [in] , [XB Residuals stdp] + marksample touse, novarlist + +* Check ivreg2 version is compatible. +* fwl becomes partial starting in ivreg2 02.2.07 + local vernum "`e(version)'" + if ("`vernum'" < "03.0.00") | ("`vernum'" > "09.9.99") { +di as err "Error: incompatible versions of ivreg2 and ivreg2_p." +di as err "Currently installed version of ivreg2 is `vernum'" +di as err "To update, from within Stata type " _c +di in smcl "{stata ssc install ivreg2, replace :ssc install ivreg2, replace}" + exit 601 + } + + local type "`xb'`residuals'`stdp'" + + if "`type'"=="" { + local type "xb" +di in gr "(option xb assumed; fitted values)" + } + +* e(partialcons) now always exists and is 1 or 0 + if e(partial_ct) { +* partial partial-out block + if "`type'" == "residuals" { + + tempvar esample + tempname ivres + gen byte `esample' = e(sample) + +* Need to strip out time series operators + local lhs "`e(depvar)'" + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + + local rhs : colnames(e(b)) + tsrevar `rhs', substitute + local rhs_t "`r(varlist)'" + + if "`e(partial1)'" != "" { + local partial "`e(partial1)'" + } + else { + local partial "`e(partial)'" + } + tsrevar `partial', substitute + local partial_t "`r(varlist)'" + + if ~e(partialcons) { + local noconstant "noconstant" + } + + local allvars "`lhs_t' `rhs_t'" +* Partial-out block. Uses estimatation sample to get coeffs, markout sample for predict + _estimates hold `ivres', restore + foreach var of local allvars { + tempname `var'_partial + qui regress `var' `partial' if `esample', `noconstant' + qui predict double ``var'_partial' if `touse', resid + local allvars_partial "`allvars_partial' ``var'_partial'" + } + _estimates unhold `ivres' + + tokenize `allvars_partial' + local lhs_partial "`1'" + mac shift + local rhs_partial "`*'" + + tempname b + mat `b'=e(b) + mat colnames `b' = `rhs_partial' +* Use forcezero? + tempvar xb + mat score double `xb' = `b' if `touse' + gen `typlist' `varlist' = `lhs_partial' - `xb' + label var `varlist' "Residuals" + } + else { +di in red "Option `type' not supported with -partial- option" + error 198 + } + } + else if "`type'" == "residuals" { + tempname lhs lhs_t xb + local lhs "`e(depvar)'" + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + qui _predict `typlist' `xb' if `touse' + gen `typlist' `varlist'=`lhs_t'-`xb' + label var `varlist' "Residuals" + } +* Must be either xb or stdp + else { + _predict `typlist' `varlist' if `touse', `type' + } + +end diff --git a/ado/i/ivreg28.ado b/ado/i/ivreg28.ado new file mode 100644 index 0000000..f4a4732 --- /dev/null +++ b/ado/i/ivreg28.ado @@ -0,0 +1,5652 @@ +*! ivreg28 2.1.22 6July2007 +*! authors cfb & mes +*! cloned from official ivreg version 5.0.9 19Dec2001 +*! see end of file for version comments + +* Variable naming: +* lhs = LHS endogenous +* endo = RHS endogenous (instrumented) +* inexog = included exogenous (instruments) +* exexog = excluded exogenous (instruments) +* iv = {inexog exexog} = all instruments +* rhs = {endo inexog} = RHS regressors +* 1 at the end of the name means the varlist after duplicates and collinearities removed +* ..1_ct at the end means a straight count of the list +* .._ct at the end means ..1_ct with any additional detected cnts removed + +program define ivreg28, eclass byable(recall) sortpreserve + version 8.2 + local lversion 02.1.22 + local ivreg2_cmd "ivreg28" + + if replay() { + syntax [, FIRST FFIRST RF Level(integer $S_level) NOHEader NOFOoter dropfirst droprf /* + */ EForm(string) PLUS VERsion] + if "`version'" != "" & "`first'`ffirst'`rf'`noheader'`nofooter'`dropfirst'`droprf'`eform'`plus'" != "" { + di as err "option version not allowed" + error 198 + } + if "`version'" != "" { + di in gr "`lversion'" + ereturn clear + ereturn local version `lversion' + exit + } + if `"`e(cmd)'"' != "`ivreg2_cmd'" { + error 301 + } + if "`e(firsteqs)'" != "" & "`dropfirst'" == "" { +* On replay, set flag so saved eqns aren't dropped + local savefirst "savefirst" + } + if "`e(rfeq)'" != "" & "`droprf'" == "" { +* On replay, set flag so saved eqns aren't dropped + local saverf "saverf" + } + } + else { + + syntax [anything(name=0)] [if] [in] [aw fw pw iw/] [, /* + */ FIRST FFIRST NOID NOCOLLIN SAVEFIRST SAVEFPrefix(name) SMall Robust CLuster(varname) /* + */ GMM CUE CUEINIT(string) CUEOPTions(string) ORTHOG(string) ENDOGtest(string) FWL(string) /* + */ NOConstant Level(integer $S_level) Beta hc2 hc3 /* + */ NOHEader NOFOoter NOOUTput title(string) subtitle(string) /* + */ DEPname(string) EForm(string) PLUS /* + */ BW(string) kernel(string) Tvar(varname) Ivar(varname)/* + */ LIML COVIV FULLER(real 0) Kclass(string) /* + */ REDundant(string) RF SAVERF SAVERFPrefix(name) /* + */ B0(string) SMATRIX(string) WMATRIX(string) EWMATRIX(string) sw swpsd dofminus(integer 0) ] + + local n 0 + + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + if `s(stop)' { + error 198 + } + while `s(stop)'==0 { + if "`paren'"=="(" { + local n = `n' + 1 + if `n'>1 { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +exit 198 + } + gettoken p lhs : lhs, parse(" =") + while "`p'"!="=" { + if "`p'"=="" { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +di in red `"the equal sign "=" is required"' +exit 198 + } + local endo `endo' `p' + gettoken p lhs : lhs, parse(" =") + } +* To enable Cragg HOLS estimator, allow for empty endo list + local temp_ct : word count `endo' + if `temp_ct' > 0 { + tsunab endo : `endo' + } +* To enable OLS estimator with (=) syntax, allow for empty exexog list + local temp_ct : word count `lhs' + if `temp_ct' > 0 { + tsunab exexog : `lhs' + } + } + else { + local inexog `inexog' `lhs' + } + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + } + local 0 `"`lhs' `0'"' + + tsunab inexog : `inexog' + tokenize `inexog' + local lhs "`1'" + local 1 " " + local inexog `*' + + if "`gmm'`cue'" != "" & "`exexog'" == "" { + di in red "option `gmm'`cue' invalid: no excluded instruments specified" + exit 102 + } + +* Process options + +* Fuller implies LIML + if "`liml'" == "" & `fuller' != 0 { + local liml "liml" + } + +* b0 implies nooutput and noid + if "`b0'" ~= "" { + local nooutput "nooutput" + local noid "noid" + } + + if "`gmm'" != "" & "`cue'" != "" { +di as err "incompatible options: 2-step efficient gmm and cue gmm" + exit 198 + } + + if "`b0'" != "" & "`wmatrix'" != "" { +di as err "incompatible options: -b0- and -wmatrix-" + exit 198 + } + + if "`ewmatrix'" != "" { + if "`gmm'" != "" { +di as err "incompatible options: -ewmatrix- and 2-step efficient gmm" + exit 198 + } + local wmatrix "`ewmatrix'" + } + +* savefprefix implies savefirst + if "`savefprefix'" != "" & "`savefirst'" == "" { + local savefirst "savefirst" + } + +* default savefprefix is _ivreg2_ + if "`savefprefix'" == "" { + local savefprefix "_`ivreg2_cmd'_" + } + +* saverfprefix implies saverf + if "`saverfprefix'" != "" & "`saverf'" == "" { + local saverf "saverf" + } + +* default saverfprefix is _ivreg2_ + if "`saverfprefix'" == "" { + local saverfprefix "_`ivreg2_cmd'_" + } + +* LIML/kclass incompatibilities + if "`liml'`kclass'" != "" { + if "`gmm'`cue'" != "" { +di as err "GMM estimation not available with LIML or k-class estimators" + exit 198 + } + if `fuller' < 0 { +di as err "invalid Fuller option" + exit 198 + } + if "`liml'" != "" & "`kclass'" != "" { +di as err "cannot use liml and kclass options together" + exit 198 + } +* Process kclass string + tempname kclass2 + scalar `kclass2'=real("`kclass'") + if "`kclass'" != "" & (`kclass2' == . | `kclass2' < 0 ) { +di as err "invalid k-class option" + exit 198 + } + } + +* HAC estimation. +* If bw is omitted, default `bw' is empty string. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. + if "`bw'" != "" | "`kernel'" != "" { +* Need tvar only for markout with time-series stuff +* but data must be tsset for time-series operators in code to work + if "`tvar'" == "" { + local tvar "`_dta[_TStvar]'" + } + else if "`tvar'"!="`_dta[_TStvar]'" { +di as err "invalid tvar() option - data already tsset" + exit 5 + } + if "`ivar'" == "" { + local ivar "`_dta[_TSpanel]'" + } + else if "`ivar'"!="`_dta[_TSpanel]'" { +di as err "invalid ivar() option - data already tsset" + exit 5 + } + if "`tvar'" == "" & "`ivar'" != "" { +di as err "missing tvar() option with ivar() option" + exit 5 + } + if "`ivar'`tvar'"=="" { + capture tsset + } + else { + capture tsset `ivar' `tvar' + } + capture local tvar "`r(timevar)'" + capture local ivar "`r(panelvar)'" + + if "`tvar'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + tsreport if `tvar' != . + if `r(N_gaps)' != 0 & "`ivar'"=="" { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + + if "`bw'" == "" { +di as err "bandwidth option bw() required for HAC-robust estimation" + exit 102 + } + local bw real("`bw'") +* Check it's a valid bandwidth + if `bw' != int(`bw') | /* + */ `bw' == . | /* + */ `bw' <= 0 { +di as err "invalid bandwidth in option bw() - must be integer > 0" + exit 198 + } +* Convert bw macro to simple integer + local bw=`bw' + +* Check it's a valid kernel + local validkernel 0 + if lower(substr("`kernel'", 1, 3)) == "bar" | "`kernel'" == "" { +* Default kernel + local kernel "Bartlett" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Bartlett and bw=1 implies zero lags used. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 3)) == "par" { + local kernel "Parzen" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Parzen and bw=1 implies zero lags used. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 3)) == "tru" { + local kernel "Truncated" + local window "lag" + local validkernel 1 + } + if lower(substr("`kernel'", 1, 9)) == "tukey-han" | lower("`kernel'") == "thann" { + local kernel "Tukey-Hanning" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Tukey-Hanning and bw=1 implies zero lags. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 9)) == "tukey-ham" | lower("`kernel'") == "thamm" { + local kernel "Tukey-Hamming" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Tukey-Hamming and bw=1 implies zero lags. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 3)) == "qua" | lower("`kernel'") == "qs" { + local kernel "Quadratic spectral" + local window "spectral" + local validkernel 1 + } + if lower(substr("`kernel'", 1, 3)) == "dan" { + local kernel "Daniell" + local window "spectral" + local validkernel 1 + } + if lower(substr("`kernel'", 1, 3)) == "ten" { + local kernel "Tent" + local window "spectral" + local validkernel 1 + } + if ~`validkernel' { + di in red "invalid kernel" + exit 198 + } + } + + if "`kernel'" != "" & "`cluster'" != "" { +di as err "cannot use HAC kernel estimator with -cluster- option" + exit 198 + } + +* changed below from `endog' to `endogtest' 2Aug06 MES + if "`orthog'`endogtest'`redundant'`fwl'" != "" { + capture tsunab orthog : `orthog' + capture tsunab endogtest : `endogtest' + capture tsunab redundant : `redundant' + capture tsunab fwl : `fwl' + } + + if "`hc2'`hc3'" != "" { + if "`hc2'"!="" { + di in red "option `hc2' invalid" + } + else di in red "option `hc3' invalid" + exit 198 + } + + if "`beta'" != "" { + di in red "option `beta' invalid" + exit 198 + } + +* Weights +* fweight and aweight accepted as is +* iweight not allowed with robust or gmm and requires a trap below when used with summarize +* pweight is equivalent to aweight + robust +* but in HAC case, robust implied by `kernel' rather than `robust' + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + if "`weight'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`gmm'`kernel'" !="" { + di in red "iweights not allowed with robust or gmm" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + +* If no kernel (=no HAC) then gmm implies (heteroskedastic-) robust + if "`kernel'" == "" & "`gmm'" != "" { + local robust "robust" + } + if `dofminus' > 0 { + local dofmopt "dofminus(`dofminus')" + } +* Stock-Watson robust SEs. + if "`sw'`swpsd'" ~= "" { + if "`kernel'" ~= "" { +di as err "Stock-Watson robust SEs not supported with -kernel- option" + exit 198 + } + if "`cue'" ~= "" { +di as err "Stock-Watson robust SEs not supported with -cue- option" + exit 198 + } + if "`ivar'"=="" { +di as err "Must specify -ivar- with -sw- option" + exit 198 + } + } + + marksample touse + markout `touse' `lhs' `inexog' `exexog' `endo' `cluster' `tvar', strok + +* Weight statement + if "`weight'" ~= "" { + sum `wvar' if `touse' `wtexp', meanonly +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + +* Set local macro T and check that bw < T +* Also make sure only used sample is checked + if "`bw'" != "" { + sum `tvar' if `touse', meanonly + local T = r(max)-r(min)+1 + if `bw' > `T' { +di as err "invalid bandwidth in option bw() - cannot exceed timespan of data" + exit 198 + } + } + +************* Collinearities and duplicates block ***************** + + if "`noconstant'" != "" { + local rmcnocons "nocons" + } + +* Check for duplicates of variables +* To mimic official ivreg, in the case of duplicates, +* (1) inexog > endo +* (2) inexog > exexog +* (3) endo + exexog = inexog, as if it were "perfectly predicted" + local dupsen1 : list dups endo + local endo1 : list uniq endo + local dupsex1 : list dups exexog + local exexog1 : list uniq exexog + local dupsin1 : list dups inexog + local inexog1 : list uniq inexog +* Remove inexog from endo + local dupsen2 : list endo1 & inexog1 + local endo1 : list endo1 - inexog1 +* Remove inexog from exexog + local dupsex2 : list exexog1 & inexog1 + local exexog1 : list exexog1 - inexog1 +* Remove endo from exexog + local dupsex3 : list exexog1 & endo1 + local exexog1 : list exexog1 - endo1 + local dups "`dupsen1' `dupsex1' `dupsin1' `dupsen2' `dupsex2' `dupsex3'" + local dups : list uniq dups + + if "`nocollin'" == "" { +* First, collinearities check using canonical correlations approach +* Eigenvalue=1 => included endog is really included exogenous +* Eigenvalue=0 => included endog collinear with another included endog +* Corresponding column names give name of variable +* Code block stolen from below, so some repetition + local insts1 `inexog1' `exexog1' + local rhs1 `endo1' `inexog1' + local iv1_ct : word count `insts1' + local rhs1_ct : word count `rhs1' + local endo1_ct : word count `endo1' + local exex1_ct : word count `exexog1' + local endoexex1_ct : word count `endo1' `exexog1' + local inexog1_ct : word count `inexog1' + if `endo1_ct' > 0 { + tempname ccmat ccrealev ccimagev cc A XX XXinv ZZ ZZinv XZ XPZX + qui mat accum `A' = `endo1' `insts1' if `touse' `wtexp', `rmcnocons' + mat `XX' = `A'[1..`endo1_ct',1..`endo1_ct'] + mat `XXinv'=syminv(`XX') + mat `ZZ' = `A'[`endo1_ct'+1...,`endo1_ct'+1...] + mat `ZZinv'=syminv(`ZZ') + mat `XZ' = `A'[1..`endo1_ct',`endo1_ct'+1...] + mat `XPZX'=`XZ'*`ZZinv'*`XZ'' + mat `ccmat' = `XXinv'*`XPZX' + mat eigenvalues `ccrealev' `ccimagev' = `ccmat' + foreach vn of varlist `endo1' { + local i=colnumb(`ccmat',"`vn'") + if round(`ccmat'[`i',`i'],10e-7)==0 { +* Collinear with another endog, so remove from endog list + local endo1 : list endo1-vn + } + if round(`ccmat'[`i',`i'],10e-7)==1 { +* Collinear with exogenous, so remove from endog and add to inexog + local endo1 : list endo1-vn + local inexog1 "`inexog1' `vn'" + local ecollin "`ecollin' `vn'" + } + } +* Loop through endo1 to find Eigenvalues=0 or 1 + } + +* Remove collinearities. Use _rmcollright to enforce same priority as above. + capture version 9.2 + if _rc==0 { +* _rmcollright crashes if no arguments supplied + capture _rmcollright `inexog1' `exexog1' if `touse' `wtexp', `rmcnocons' + } + else { + qui _rmcoll `inexog1' `exexog1' if `touse' `wtexp', `rmcnocons' + } + version 8.2 + +* endo1 has had within-endo collinear removed, so non-colllinear list is _rmcoll result + endo1 + local ncvars `r(varlist)' `endo1' + local allvars1 `endo1' `inexog1' `exexog1' +* collin gets collinear variables to be removed + local collin : list allvars1-ncvars +* Remove collin from exexog1 + local exexog1 : list exexog1-collin +* Remove collin from inexog1 + local inexog1 : list inexog1-collin + +* Collinearity and duplicates warning messages, if necessary + if "`dups'" != "" { +di in gr "Warning - duplicate variables detected" +di in gr "Duplicates:" _c + Disp `dups', _col(21) + } + if "`ecollin'" != "" { +di in gr "Warning - endogenous variable(s) collinear with instruments" +di in gr "Vars now exogenous:" _c + Disp `ecollin', _col(21) + } + if "`collin'" != "" { +di in gr "Warning - collinearities detected" +di in gr "Vars dropped:" _c + Disp `collin', _col(21) + } + } + +**** End of collinearities block ************ + +**** Partial-out FWL block ****************** + + if "`fwl'" != "" { + preserve + local fwl : subinstr local fwl "_cons" "", all count(local fwlcons) + if `fwlcons' > 0 & "`noconstant'"~="" { +di in r "Error: _cons listed in fwl() but equation specifies -noconstant-." + error 198 + } + else if "`noconstant'"~="" { + local fwlcons 0 + } + else { +* Just in case of multiple _cons + local fwlcons 1 + } + local fwldrop : list inexog - inexog1 + local fwl1 : list fwl - fwldrop + local fwlcheck : list fwl1 - inexog1 + if ("`fwlcheck'"~="") { +di in r "Error: `fwlcheck' listed in fwl() but not in list of regressors." + error 198 + } + local inexog1 : list inexog1 - fwl1 + if "`cluster'"~="" { +* Check that cluster var won't be transformed + local allvars "`lhs' `inexog' `endo' `exexog'" + local clustvarcheck : list cluster in allvars + if `clustvarcheck' { +di in r "Error: cannot use cluster variable `cluster' as dependent variable, regressor or IV" +di in r " in combination with -fwl- option." + error 198 + } + } +* Constant is partialled out, unless nocons already specified in the first place + tempname fwl_resid + foreach var of varlist `lhs' `inexog1' `endo1' `exexog1' { + qui regress `var' `fwl1' if `touse' `wtexp', `noconstant' + qui predict double `fwl_resid' if `touse', resid + qui replace `var' = `fwl_resid' + drop `fwl_resid' + } + local fwl_ct : word count `fwl1' + if "`noconstant'" == "" { +* fwl_ct used for small-sample adjustment to regression F-stat + local fwl_ct = `fwl_ct' + 1 + local noconstant "noconstant" + } + } + else { +* Set count of fwl vars to zero if option not used + local fwl_ct 0 + } + +********************************************* + + local insts1 `inexog1' `exexog1' + local rhs1 `endo1' `inexog1' + local iv1_ct : word count `insts1' + local rhs1_ct : word count `rhs1' + local endo1_ct : word count `endo1' + local exex1_ct : word count `exexog1' + local endoexex1_ct : word count `endo1' `exexog1' + local inexog1_ct : word count `inexog1' + + if "`noconstant'" == "" { + local cons_ct 1 + } + else { + local cons_ct 0 + } + + if `rhs1_ct' > `iv1_ct' { + di in red "equation not identified; must have at " /* + */ "least as many instruments not in" + di in red "the regression as there are " /* + */ "instrumented variables" + exit 481 + } + + if `rhs1_ct' + `cons_ct' == 0 { + di in red "error: no regressors specified" + exit 102 + } + + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + if "`robust'"=="" { + local robust "robust" + } + } + if "`bw'"!="" { + local bwopt "bw(`bw')" + } + if "`kernel'"!="" { + local kernopt "kernel(`kernel')" + } +* If depname not provided (default) name is lhs variable + if "`depname'"=="" { + local depname `lhs' + } + +************************************************************************************************ +* Cross-products and basic IV coeffs, residuals and moment conditions + tempvar iota y2 yhat ivresid ivresid2 gresid gresid2 lresid lresid2 b0resid b0resid2 s1resid + tempname Nprec ysum yy yyc r2u r2c B V ivB gmmB wB lB gmmV ivest + tempname r2 r2_a ivrss lrss wbrss b0rss rss mss rmse sigmasq iv_s2 l_s2 wb_s2 b0_s2 F Fp Fdf2 + tempname S Sinv W s1Zu s2Zu b0Zu wbZu wbresid wbresid2 s1sigmasq + tempname A XZ XZa XZb Zy ZZ ZZinv XPZX XPZXinv XPZy + tempname YY Z2Z2 ZY Z2Y XXa XXb XX Xy Z2Z2inv XXinv + tempname XZWZX XZWZXinv XZWZy XZW + tempname B V B1 uZSinvZu j jp arubin arubinp tempmat + +* Generate cross-products of y, X, Z + qui matrix accum `A' = `lhs' `endo1' `exexog1' `inexog1' /* + */ if `touse' `wtexp', `noconstant' + if "`noconstant'"=="" { + matrix rownames `A' = `lhs' `endo1' `exexog1' /* + */ `inexog1' _cons + matrix colnames `A' = `lhs' `endo1' `exexog1' /* + */ `inexog1' _cons + } + else { + matrix rownames `A' = `lhs' `endo1' `exexog1' `inexog1' + matrix colnames `A' = `lhs' `endo1' `exexog1' `inexog1' + } + if `endo1_ct' > 0 { +* X'Z is [endo1 inexog1]'[exexog1 inexog1] + mat `XZ'=`A'[2..`endo1_ct'+1,`endo1_ct'+2...] +* Append portion corresponding to included exog if they (incl constant) exist + if 2+`endo1_ct'+`iv1_ct'-(`rhs1_ct'-`endo1_ct') /* + */ <= rowsof(`A') { + mat `XZ'=`XZ' \ /* + */ `A'[2+`endo1_ct'+`iv1_ct'- /* + */ (`rhs1_ct'-`endo1_ct')..., /* + */ `endo1_ct'+2...] + } +* If included exog (incl const) exist, create XX matrix in 3 steps + if `inexog1_ct' + `cons_ct' > 0 { + mat `XXa' = `A'[2..`endo1_ct'+1, 2..`endo1_ct'+1], /* + */ `A'[2..`endo1_ct'+1, `endoexex1_ct'+2...] + mat `XXb' = `A'[`endoexex1_ct'+2..., 2..`endo1_ct'+1], /* + */ `A'[`endoexex1_ct'+2..., `endoexex1_ct'+2...] + mat `XX' = `XXa' \ `XXb' + mat `Xy' = `A'[2..`endo1_ct'+1, 1] \ `A'[`endoexex1_ct'+2..., 1] + } + else { + mat `XX' = `A'[2..`endo1_ct'+1, 2..`endo1_ct'+1] + mat `Xy' = `A'[2..`endo1_ct'+1, 1] + } + } + else { +* Cragg HOLS estimator with no endogenous variables + mat `XZ'= `A'[2+`iv1_ct'-(`rhs1_ct'-`endo1_ct')..., /* + */ 2...] + mat `XX' = `A'[`endoexex1_ct'+2..., `endoexex1_ct'+2...] + mat `Xy' = `A'[`endoexex1_ct'+2..., 1] + } + + mat `XX'=(`XX'+`XX'')/2 + mat `XXinv'=syminv(`XX') + mat `Zy'=`A'[`endo1_ct'+2...,1] + mat `ZZ'=`A'[`endo1_ct'+2...,`endo1_ct'+2...] + mat `ZZ'=(`ZZ'+`ZZ'')/2 + mat `ZZinv'=syminv(`ZZ') +* diag0cnt probably superfluous since collinearity checks will catch this unless disabled + local iv_ct = rowsof(`ZZ') - diag0cnt(`ZZinv') + mat `YY'=`A'[1..`endo1_ct'+1, 1..`endo1_ct'+1] + mat `ZY' = `A'[`endo1_ct'+2..., 1..`endo1_ct'+1] + mat `XPZX'=`XZ'*`ZZinv'*`XZ'' + mat `XPZX'=(`XPZX'+`XPZX'')/2 + mat `XPZXinv'=syminv(`XPZX') + mat `XPZy'=`XZ'*`ZZinv'*`Zy' +****************************** + qui gen byte `iota'=1 + qui gen double `y2'=`lhs'^2 +* Stata summarize won't work with iweights, so must use matrix cross-product + qui matrix vecaccum `ysum' = `iota' `y2' `lhs' `wtexp' if `touse' +* Nprec is ob count from mat accum. Use this rather than `N' in calculations +* here and below because in official -regress- `N' is rounded if iweights are used. + scalar `Nprec'=`ysum'[1,3] + if "`weight'" == "iweight" { + scalar `Nprec'=round(`Nprec') + } + local N=round(`Nprec') + scalar `yy'=`ysum'[1,1] + scalar `yyc'=`yy'-`ysum'[1,2]^2/`Nprec' + +******************************************************************************************* +* First-step estimators: b0, wmatrix, LIML-kclass, IV. +* Generate residuals s1resid for used in 2SFEGMM and robust. +* User-supplied b0 provides value of CUE obj fn. + if "`b0'" != "" { + capture drop `yhat' + qui mat score double `yhat' = `b0' if `touse' + qui gen double `b0resid'=`lhs'-`yhat' + qui gen double `b0resid2'=`b0resid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `b0resid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `b0rss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `b0_s2'=`b0rss'/(`Nprec'-`dofminus') + scalar `s1sigmasq'=`b0_s2' + qui gen double `s1resid'=`b0resid' + } + else if "`wmatrix'" != "" { +* GMM with arbitrary weighting matrix provides first-step estimates + local cn : colnames(`ZZ') + matrix `W'=`wmatrix' +* Rearrange/select columns to mat IV matrix + capture matsort `W' "`cn'" + local wrows = rowsof(`W') + local wcols = colsof(`W') + local zcols = colsof(`ZZ') + if _rc ~= 0 | (`wrows'~=`zcols') | (`wcols'~=`zcols') { +di as err "-wmatrix- option error: supplied matrix columns/rows do not match IV list" +exit 198 + } + mat `XZWZX'=`XZ'*`W'*`XZ'' + mat `XZWZy'=`XZ'*`W'*`Zy' + mat `XZWZX'=(`XZWZX'+`XZWZX'')/2 + mat `XZWZXinv'=syminv(`XZWZX') + mat `XZW'=`XZ'*`W' + mat `wB'=`XZWZy''*`XZWZXinv'' + + capture drop `yhat' + qui mat score double `yhat' = `wB' if `touse' + qui gen double `wbresid'=`lhs'-`yhat' + qui gen double `wbresid2'=`wbresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `wbresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `wbrss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `wb_s2'=`wbrss'/(`Nprec'-`dofminus') + scalar `s1sigmasq'=`wb_s2' + qui gen double `s1resid'=`wbresid' + } + else if "`liml'`kclass'" != "" { +* LIML and kclass code + tempname WW WW1 Evec Eval Evaldiag target lambda lambda2 khs XhXh XhXhinv ll + if "`kclass'" == "" { +* LIML block + matrix `WW' = `YY' - `ZY''*`ZZinv'*`ZY' + if `inexog1_ct' + `cons_ct' > 0 { + mat `Z2Y' = `A'[`endoexex1_ct'+2..., 1..`endo1_ct'+1] + mat `Z2Z2' = `A'[`endoexex1_ct'+2..., `endoexex1_ct'+2...] + mat `Z2Z2'=(`Z2Z2'+`Z2Z2'')/2 + mat `Z2Z2inv' = syminv(`Z2Z2') + matrix `WW1' = `YY' - `Z2Y''*`Z2Z2inv'*`Z2Y' + } + else { +* Special case of no included exogenous (incl constant) + matrix `WW1' = `YY' + } + matrix `WW'=(`WW'+`WW'')/2 + matrix symeigen `Evec' `Eval' = `WW' + matrix `Evaldiag' = diag(`Eval') +* Replace diagonal elements of Evaldiag with the element raised to the power (-1/2) + local i 1 + while `i' <= rowsof(`Evaldiag') { +* Need to use capture because with collinearities, diag may be virtually zero +* ... but actually negative + capture matrix `Evaldiag'[`i',`i'] = /* + */ `Evaldiag'[`i',`i']^(-0.5) + local i = `i'+1 + } + matrix `target' = (`Evec'*`Evaldiag'*`Evec'') * `WW1' /* + */ * (`Evec'*`Evaldiag'*`Evec'') +* Re-use macro names + matrix `target'=(`target'+`target'')/2 + matrix symeigen `Evec' `Eval' = `target' +* Get smallest eigenvalue +* Note that collinearities can yield a nonsense eigenvalue appx = 0 +* and just-identified will yield an eigenvalue that is ALMOST exactly = 1 +* so require it to be >= 0.9999999999. + local i 1 + scalar `lambda'=. + scalar `lambda2'=. + while `i' <= colsof(`Eval') { + if (`lambda' > `Eval'[1,`i']) & (`Eval'[1,`i'] >=0.9999999999) { + scalar `lambda2' = `lambda' + scalar `lambda' = `Eval'[1,`i'] + } + local i = `i'+1 + } + if `fuller'==0 { +* Basic LIML. Macro kclass2 is the scalar. + scalar `kclass2'=`lambda' + } + else { +* Fuller LIML + if `fuller' > (`N'-`iv_ct') { +di as err "error: invalid choice of Fuller LIML parameter" + exit 198 + } + scalar `kclass2' = `lambda' - `fuller'/(`N'-`iv_ct') + } +* End of LIML block + } + mat `XhXh'=(1-`kclass2')*`XX'+`kclass2'*`XPZX' + mat `XhXh'=(`XhXh'+`XhXh'')/2 + mat `XhXhinv'=syminv(`XhXh') + mat `lB'=`Xy''*`XhXhinv'*(1-`kclass2') + `kclass2'*`Zy''*`ZZinv'*`XZ''*`XhXhinv' + capture drop `yhat' + qui mat score double `yhat'=`lB' if `touse' + qui gen double `lresid'=`lhs' - `yhat' + qui gen double `lresid2'=`lresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `lresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `lrss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `l_s2'=`lrss'/(`Nprec'-`dofminus') + scalar `s1sigmasq'=`l_s2' + qui gen double `s1resid'=`lresid' + } + else { +* IV resids are 1st-step GMM resids +* In these expressions, ignore scaling of W + mat `ivB' = `XPZy''*`XPZXinv'' + mat `XZWZX'=`XPZX' + mat `XZWZXinv'=`XPZXinv' + mat `XZW'=`XZ'*`ZZinv' + capture drop `yhat' + qui mat score double `yhat' = `ivB' if `touse' + qui gen double `ivresid'=`lhs'-`yhat' + qui gen double `ivresid2'=`ivresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `ivresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `ivrss'=`ysum'[1,1] + scalar `iv_s2'=`ivrss'/(`Nprec'-`dofminus') + scalar `s1sigmasq'=`iv_s2' + qui gen double `s1resid'=`ivresid' + } +* Orthogonality conditions using step 1 residuals + qui mat vecaccum `s1Zu'=`s1resid' `exexog1' `inexog1' /* + */ `wtexp' if `touse', `noconstant' + +******************************************************************************************* +* S covariance matrix of orthogonality conditions +******************************************************************************************* +* If user-supplied S matrix is used, use it + if "`smatrix'" != "" { + local cn : colnames(`ZZ') + matrix `S'=`smatrix' +* Rearrange/select columns to mat IV matrix + capture matsort `S' "`cn'" + local srows = rowsof(`S') + local scols = colsof(`S') + local zcols = colsof(`ZZ') + if _rc ~= 0 | (`srows'~=`zcols') | (`scols'~=`zcols') { +di as err "-smatrix- option error: supplied matrix columns/rows do not match IV list" +exit 198 + } + mat `S' = (`S' + `S'') / 2 + mat `Sinv'=syminv(`S') + local rankS = rowsof(`Sinv') - diag0cnt(`Sinv') + } + +******************************************************************************************* +* Start robust block for robust-HAC S and Sinv +* Do not enter if user supplies smatrix or if CUE + if "`robust'`cluster'" != "" & "`cue'"=="" & "`smatrix'"=="" { +* Optimal weighting matrix +* Block calculates S_0 robust matrix +* _robust has same results as +* mat accum `S'=`exexog1' `inexog1' [iweight=`ivresid'^2] if `touse' +* mat `S' = `S'*1/`Nprec' +* _robust doesn't work properly with TS variables, so must first tsrevar + tsrevar `exexog1' `inexog1' + local TSinsts1 `r(varlist)' +* Create identity matrix with matching col/row names + mat `S'=I(colsof(`s1Zu')) + if "`noconstant'"=="" { + mat colnames `S' = `TSinsts1' "_cons" + mat rownames `S' = `TSinsts1' "_cons" + } + else { + mat colnames `S' = `TSinsts1' + mat rownames `S' = `TSinsts1' + } + _robust `s1resid' `wtexp' if `touse', variance(`S') `clopt' minus(0) + if "`cluster'"!="" { + local N_clust=r(N_clust) + } + mat `S' = `S'*1/`Nprec' +* Above doesn't work properly with iweights (i.e. yield same matrix as fw), +* hence iweight trap at start + if "`kernel'" != "" { +* HAC block for S_1 onwards matrices + tempvar vt1 + qui gen double `vt1' = . + tempname tt tx kw karg ow +* Use insts with TS ops removed and with iota (constant) column + if "`noconstant'"=="" { + local insts1c "`TSinsts1' `iota'" + } + else { + local insts1c "`TSinsts1'" + } + local iv1c_ct : word count `insts1c' +* "tau=0 loop" is S_0 block above for all robust code + local tau 1 +* Spectral windows require looping through all T-1 autocovariances + if "`window'" == "spectral" { + local TAU `T'-1 +di in ye "Computing kernel ..." + } + else { + local TAU `bw' + } + if "`weight'" == "" { +* If no weights specified, define neutral ow variable and weight expression for code below + qui gen byte `ow'=1 + local wtexp `"[fweight=`wvar']"' + } + else { +* pweights and aweights + summ `wvar' if `touse', meanonly + qui gen double `ow' = `wvar'/r(mean) + } + while `tau' <= `TAU' { + capture mat drop `tt' + local i 1 + while `i' <= `iv1c_ct' { + local x : word `i' of `insts1c' +* Add lags defined with TS operators + local Lx "L`tau'.`x'" + local Ls1resid "L`tau'.`s1resid'" + local Low "L`tau'.`ow'" + qui replace `vt1' = `Lx'*`s1resid'* /* + */ `Ls1resid'*`Low'*`ow' if `touse' +* Use capture here because there may be insufficient observations, e.g., if +* the IVs include lags and tau=N-1. _rc will be 2000 in this case. + capture mat vecaccum `tx' = `vt1' `insts1c' /* + */ if `touse', nocons + if _rc == 0 { + mat `tt' = nullmat(`tt') \ `tx' + } + local i = `i'+1 + } +* bw = bandwidth, karg is argument to kernel function, kw is kernel function (weight) + scalar `karg' = `tau'/(`bw') + if "`kernel'" == "Truncated" { + scalar `kw'=1 + } + if "`kernel'" == "Bartlett" { + scalar `kw'=(1-`karg') + } + if "`kernel'" == "Parzen" { + if `karg' <= 0.5 { + scalar `kw' = 1-6*`karg'^2+6*`karg'^3 + } + else { + scalar `kw' = 2*(1-`karg')^3 + } + } + if "`kernel'" == "Tukey-Hanning" { + scalar `kw'=0.5+0.5*cos(_pi*`karg') + } + if "`kernel'" == "Tukey-Hamming" { + scalar `kw'=0.54+0.46*cos(_pi*`karg') + } + if "`kernel'" == "Tent" { + scalar `kw'=2*(1-cos(`tau'*`karg')) / (`karg'^2) + } + if "`kernel'" == "Daniell" { + scalar `kw'=sin(_pi*`karg') / (_pi*`karg') + } + if "`kernel'" == "Quadratic spectral" { + scalar `kw'=25/(12*_pi^2*`karg'^2) /* + */ * ( sin(6*_pi*`karg'/5)/(6*_pi*`karg'/5) /* + */ - cos(6*_pi*`karg'/5) ) + } +* Need -capture-s here because tt may not exist (because of insufficient observations/lags) + capture mat `tt' = (`tt'+`tt'')*`kw'*1/`Nprec' + if _rc == 0 { + mat `S' = `S' + `tt' + } + local tau = `tau'+1 + } + if "`weight'" == "" { +* If no weights specified, remove neutral weight variables + local wtexp "" + } + } +* To give S the right col/row names + mat `S'=`S'+0*diag(`s1Zu') +* Right approach is to adjust S by N/(N-dofminus) if NOT cluster +* because clustered S is already "adjusted" + if "`cluster'"=="" { + mat `S'=`S'*`Nprec'/(`Nprec'-`dofminus') + } +* Stock-Watson robust SEs. Requires `wvar' to be defined above. +* Correspondence between S-W (2006) and code below assumes ivreg2 is called on demeaned data. +* Variable ivar identifies the observational unit. +* wvar will simply be 1 for all observations unless weights are used. +* T_i is number of observations for an observational unit, extended to unbalanced data. +* SW consider only balanced data and denote this as T (constant acros units). +* s1resid is (fixed effects) residuals. SW denote this as u_tilda_hat (p. 2, eqn 4). +* s2 is, for an observational unit i, 1/(T-1) * sum of squared (fixed effects) residuals. +* This is the second term in () in the expression for B_hat in SW eqn 6, p. 3. +* mat opaccum calculates a cross-prod of the form A = X1'e1e1'X1 + X2'e2e2'X2 + ... + Xk'ekek'Xk +* ei is s from above. eiei' is a T_i x T_i matrix filled with s_i2s. Thus the cross-prod becomes +* A = s_1^2*X1'X1 + s_2^2*X2'e2e2'X2 + ... + s_k^2*Xk'Xk +* which is the form of B_hat in SW eqn 6 p. 3, except for the missing 1/N and 1/T +* In unbalanced case, 1/T isn't constant, so must incorporate the 1/T that weights the Xi'Xi into the s, +* hence the second division of s2 by T_i. +* S is SW's Sigma_hat_HR-FE, which is the fixed effects S (=Sigma_hat_HR-XS) minus 1/(T-1)*B)hat +* and then multiplied by (T-1)/(T-2). In SW, T is constant because they cover only the balanced case. +* Here, T varies across units, so we use the harmonic mean of T for T_bar. +* PSD code by CFB based on SW point 10 on p. 6. Guarantees S will be PSD. + if "`sw'`swpsd'" ~= "" { + tempname B s s2 T_i T_inv T_bar s1resid2 + qui gen double `s1resid2'=`s1resid'^2 + sort `ivar' `touse' + qui by `ivar' `touse': gen long `T_i' = sum(`wvar') if `touse' + qui by `ivar' `touse': replace `T_i' = `T_i'[_N] if `touse' & _n<_N + qui gen `T_inv' = 1/`T_i' + sum `T_inv' if `touse', meanonly + scalar `T_bar' = 1/r(mean) + qui by `ivar' `touse': gen double `s2'=sum(`s1resid2'*`wvar') if `touse' + qui by `ivar' `touse': replace `s2'=`s2'[_N] if `touse' & _n<_N + qui replace `s2' = `s2'/(`T_i'-1) + qui replace `s2' = `s2'/`T_i' + qui gen double `s' = sqrt(`s2') + qui mat opaccum `B'=`exexog1' `inexog1' `wtexp' if `touse', /* + */ group(`ivar') opvar(`s') `noconstant' + mat `B' = `B' * 1/`Nprec' + mat `S' = (`T_bar'-1)/(`T_bar'-2)*(`S' - `B'*1/(`T_bar'-1)) + if "`swpsd'" ~= "" { + mat `S'=(`S'+`S'')/2 + tempname X v + mat symeigen `X' `v' = `S' + local ncol = colsof(`S') + forv i=1/`ncol' { + mat `v'[1,`i']= abs(`v'[1,`i']) + } + mat `S' = `X' * diag(`v') * `X'' + } + } + mat `S'=(`S'+`S'')/2 + mat `Sinv'=syminv(`S') + local rankS = rowsof(`Sinv') - diag0cnt(`Sinv') + } + +* End robust-HAC S and Sinv block +************************************************************************************ +* Block for non-robust S and Sinv, including autocorrelation-consistent (AC). +* Do not enter if user supplies smatrix or if cue + + if "`robust'`cluster'`cue'`smatrix'"=="" { +* First do with S_0 (=S for simple IV) +* Step 1 sigma^2 is IV sigma^2 unless b0 or wmatrix provided + mat `S' = `s1sigmasq'*`ZZ'*(1/`Nprec') + + if "`kernel'" != "" { +* AC code for S_1 onwards matrices + tempvar vt1 + qui gen double `vt1' = . + tempname tt tx kw karg ow sigttj +* Use insts with TS ops removed and with iota (constant) column + tsrevar `exexog1' `inexog1' + local TSinsts1 `r(varlist)' + if "`noconstant'"=="" { + local insts1c "`TSinsts1' `iota'" + } + else { + local insts1c "`TSinsts1'" + } + local iv1c_ct : word count `insts1c' +* "tau=0 loop" is S_0 block above + local tau 1 +* Spectral windows require looping through all T-1 autocovariances + if "`window'" == "spectral" { + local TAU `T'-1 +di in ye "Computing kernel ..." + } + else { + local TAU `bw' + } + if "`weight'" == "" { +* If no weights specified, define neutral ow variable and wtexp for code below + qui gen byte `ow'=1 + local wtexp `"[fweight=`wvar']"' + } + else { +* pweights and aweights + summ `wvar' if `touse', meanonly + qui gen double `ow' = `wvar'/r(mean) + } + while `tau' <= `TAU' { + capture mat drop `tt' + local i 1 +* errflag signals problems that make this loop's tt invalid + local errflag 0 +* Additional marksample/markout required so that treatment of MVs is consistent across all IVs + marksample touse2 + markout `touse2' `insts1c' L`tau'.(`insts1c') + local Low "L`tau'.`ow'" + while `i' <= `iv1c_ct' { + local x : word `i' of `insts1c' +* Add lags defined with TS operators + local Lx "L`tau'.`x'" + qui replace `vt1'=. + qui replace `vt1' = `Lx'*`Low'*`ow' if `touse' & `touse2' +* Use capture here because there may be insufficient observations, e.g., if +* the IVs include lags and tau=N-1. _rc will be 2000 in this case. + capture mat vecaccum `tx' = `vt1' `insts1c' /* + */ if `touse', nocons + if _rc == 0 { + mat `tt' = nullmat(`tt') \ `tx' + } + local i = `i'+1 + } + capture mat `tt' = 1/`Nprec' * `tt' + if _rc != 0 { + local errflag = 1 + } + local Ls1resid "L`tau'.`s1resid'" +* Weights belong here as well + tempvar ivLiv + qui gen double `ivLiv' = `s1resid'*`Ls1resid'*`ow'*`Low' if `touse' + qui sum `ivLiv' if `touse', meanonly + scalar `sigttj' = r(sum)/`Nprec' + + capture mat `tt' = `sigttj' * `tt' +* bw = bandwidth, karg is argument to kernel function, kw is kernel function (weight) + scalar `karg' = `tau'/(`bw') + if "`kernel'" == "Truncated" { + scalar `kw'=1 + } + if "`kernel'" == "Bartlett" { + scalar `kw'=(1-`karg') + } + if "`kernel'" == "Parzen" { + if `karg' <= 0.5 { + scalar `kw' = 1-6*`karg'^2+6*`karg'^3 + } + else { + scalar `kw' = 2*(1-`karg')^3 + } + } + if "`kernel'" == "Tukey-Hanning" { + scalar `kw'=0.5+0.5*cos(_pi*`karg') + } + if "`kernel'" == "Tukey-Hamming" { + scalar `kw'=0.54+0.46*cos(_pi*`karg') + } + if "`kernel'" == "Tent" { + scalar `kw'=2*(1-cos(`tau'*`karg')) / (`karg'^2) + } + if "`kernel'" == "Daniell" { + scalar `kw'=sin(_pi*`karg') / (_pi*`karg') + } + if "`kernel'" == "Quadratic spectral" { + scalar `kw'=25/(12*_pi^2*`karg'^2) /* + */ * ( sin(6*_pi*`karg'/5)/(6*_pi*`karg'/5) /* + */ - cos(6*_pi*`karg'/5) ) + } + +* Need -capture-s here because tt may not exist (because of insufficient observations/lags) + capture mat `tt' = (`tt'+`tt'')*`kw' + if _rc != 0 { + local errflag = 1 + } +* Accumulate if tt is valid + if `errflag' == 0 { + capture mat `S' = `S' + `tt' + } + local tau = `tau'+1 + } + if "`weight'" == "" { +* If no weights specified, remove neutral weight variables + local wtexp "" + } + } +* End of AC code +* To give S the right col/row names + mat `S'=`S'+0*diag(`s1Zu') + mat `S'=(`S'+`S'')/2 + mat `Sinv'=syminv(`S') + local rankS = rowsof(`Sinv') - diag0cnt(`Sinv') + } + +* End of non-robust S and Sinv code (including AC) +******************************************************************************************* +* 2nd step and final coefficients +******************************************************************************************* +* User-supplied b0. CUE objective function. + if "`b0'" ~= "" { + mat `B' = `b0' + scalar `rss'=`b0rss' + scalar `sigmasq'=`b0_s2' + mat `W' = `Sinv' + } +******************************************************************************************* +* Block for gmm 2nd step to get coefficients and 2nd step residuals + +* Non-robust IV, LIML, k-class, CUE do not enter + if "`gmm'`robust'`cluster'`kernel'`wmatrix'" != "" & "`cue'"=="" & "`ewmatrix'"=="" { + mat `tempmat'=`XZ'*`Sinv'*`XZ'' + mat `tempmat'=(`tempmat'+`tempmat'')/2 + mat `B1'=syminv(`tempmat') + mat `B1'=(`B1'+`B1'')/2 + mat `gmmB'=(`B1'*`XZ'*`Sinv'*`Zy')' + + capture drop `yhat' + qui mat score double `yhat'=`gmmB' if `touse' + qui gen double `gresid'=`lhs'-`yhat' + qui gen double `gresid2'=`gresid'^2 + qui mat vecaccum `s2Zu'=`gresid' `exexog1' `inexog1' /* + */ `wtexp' if `touse', `noconstant' + } +******************************************************************************************* +* GMM with arbitrary weighting matrix + if ("`wmatrix'"~="") & ("`gmm'"=="") & ("`liml'`kclass'`cue'"=="") & "`b0'"=="" { + mat `B'=`wB' + scalar `rss'=`wbrss' + scalar `sigmasq'=`wb_s2' +* Weighting matrix wmatrix already checked and assigned to macro W + } +******************************************************************************************* +* IV coefficients + if ("`wmatrix'"=="") & ("`gmm'"=="") & ("`liml'`kclass'`cue'"=="") & "`b0'"=="" { + mat `B'=`ivB' + scalar `rss'=`ivrss' + scalar `sigmasq'=`iv_s2' +* IV weighting matrix. By convention, no small-sample adjustment (consistent with S) + mat `W' = `ZZinv'*(`Nprec'-`dofminus')/`iv_s2' + } +******************************************************************************************* +* LIML, k-class coefficients + if "`liml'`kclass'" ~= "" { + mat `B'=`lB' + scalar `rss'=`lrss' + scalar `sigmasq'=`l_s2' +* No weighting matrix. + } +******************************************************************************************* +* Efficient GMM coefficients + if "`gmm'"!="" & ("`liml'`kclass'`cue'"=="") & "`b0'"=="" { + mat `B'=`gmmB' + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `gresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `rss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `sigmasq'=`rss'/(`Nprec'-`dofminus') + mat `W'=`Sinv' + } +******************************************************************************************* +* Var-cov matrix +******************************************************************************************* +* Expressions below multipy by N because we are working with cross-products (XZ) not vcvs (Qxz) +* Efficient GMM: homoskedastic IV, 2-step FEGMM. LIML, k-class, CUE handled separately. +* No robust, cluster, kernel => must be efficient GMM +* GMM option => must be efficient GMM +* b0 => must be efficient GMM +* ewmatrix => must be efficient GMM + tempname rankV + if ("`robust'`cluster'`kernel'`liml'`kclass'`cue'`wmatrix'"=="") /* + */ | ("`gmm'"~="") /* + */ | ("`b0'"~="") /* + */ | ("`ewmatrix'"~="") { + mat `tempmat'=`XZ'*`Sinv'*`XZ'' + mat `tempmat'=(`tempmat'+`tempmat'')/2 + mat `V' = syminv(`tempmat')*`Nprec' + mat `V'=(`V'+`V'')/2 + scalar `rankV'=rowsof(`tempmat') - diag0cnt(`tempmat') + } +* Possibly inefficient GMM: robust of all sorts with no 2nd step. LIML, k-class, CUE handled separately. + else if ("`liml'`kclass'`cue'"=="") { + mat `V'=`XZWZXinv'*`XZW'*`S'* /* + */ `XZW''*`XZWZXinv'*`Nprec' + mat `V'=(`V'+`V'')/2 + mat `tempmat'=syminv(`V') + scalar `rankV'=rowsof(`tempmat') - diag0cnt(`tempmat') + } +* LIML and k-class non-robust + else if ("`liml'`kclass'" ~= "") & ("`robust'`cluster'" == "") { + if "`coviv'"== "" { +* LIML or k-class cov matrix + mat `V'=`sigmasq'*`XhXhinv' + scalar `rankV'=rowsof(`XhXh') - diag0cnt(`XhXh') + } + else { +* IV cov matrix + mat `V'=`sigmasq'*`XPZXinv' + scalar `rankV'=rowsof(`XPZXinv') - diag0cnt(`XPZXinv') + } + mat `V'=(`V'+`V'')/2 + } +* LIML and k-class robust + else if ("`liml'`kclass'" ~= "") & ("`robust'`cluster'" ~= "") { + if "`coviv'"== "" { +* Use LIML or k-class cov matrix + mat `V'=`XhXhinv'*`XZ'*`ZZinv'*`S'*`Nprec'* /* + */ `ZZinv'*`XZ''*`XhXhinv' + } + else { +* Use IV cov matrix + mat `V'=`XPZXinv'*`XZ'*`ZZinv'*`S'*`Nprec'* /* + */ `ZZinv'*`XZ''*`XPZXinv' + } + mat `V'=(`V'+`V'')/2 + mat `tempmat'=syminv(`V') + scalar `rankV'=rowsof(`tempmat') - diag0cnt(`tempmat') + } +* Model df handled here since it depends on rank of V +* CUE handled separately + if "`cue'"=="" { + if "`noconstant'"=="" { + local df_m = `rankV' - 1 + } + else { + local df_m = `rankV' + } + } +* End of VCV block +******************************************************************************** +* Sargan-Hansen-Anderson-Rubin statistics +******************************************************************************************* +* Robust requires using gmm residuals; otherwise use iv residuals. CUE handled separately. +* b0 => return value of CUE objective function. b0 is efficient GMM. + if ("`robust'`cluster'`kernel'" == "") & ("`cue'"=="") & ("`b0'`ewmatrix'"=="") { + mat `uZSinvZu'= (`s1Zu'/`Nprec')*`Sinv'*(`s1Zu''/`Nprec') + scalar `j' = `Nprec'*`uZSinvZu'[1,1] + } + if ("`robust'`cluster'`kernel'" ~= "") & ("`cue'"=="") & ("`b0'`ewmatrix'"=="") { + mat `uZSinvZu'= (`s2Zu'/`Nprec')*`Sinv'*(`s2Zu''/`Nprec') + scalar `j' = `Nprec'*`uZSinvZu'[1,1] + } + if "`b0'`ewmatrix'"~="" { + mat `uZSinvZu'= (`s1Zu'/`Nprec')*`Sinv'*(`s1Zu''/`Nprec') + scalar `j' = `Nprec'*`uZSinvZu'[1,1] + } + if "`liml'" != "" { +* Also save Anderson-Rubin overid stat if LIML +* Note dofminus is required because unlike Sargan and 2-step GMM J, doesn't derive from S + scalar `arubin'=(`Nprec'-`dofminus')*ln(`lambda') + } + +*************************************************************************************** +* Block for cue gmm +******************************************************************************************* + if "`cue'" != "" { +* Set up variables and options as globals + global IV_lhs "`lhs'" + global IV_inexog "`inexog1'" + global IV_endog "`endo1'" + global IV_exexog "`exexog1'" + global IV_wt "`wtexp'" + global IV_opt "`noconstant' `robust' `clopt' `bwopt' `kernopt' `dofmopt'" +* `gmm' not in IV_opt because cue+gmm not allowed +* Initial values use 2-step GMM if robust + if "`robust'`cluster'"~="" { + local init_opt "gmm" + } + tempname b_init temphold + capture _estimates hold `temphold', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + qui `ivreg2_cmd' $IV_lhs $IV_inexog ($IV_endog=$IV_exexog) $IV_wt /* + */ if `touse', $IV_opt `init_opt' noid +* Trap here if just-identified + if e(rankzz)>e(rankxx) { + if "`cueinit'"== "" { + mat `b_init'=e(b) + } + else { + mat `b_init'=`cueinit' + } +* Use ML for numerical optimization + ml model d0 `ivreg2_cmd'_cue ($IV_lhs = $IV_endog $IV_inexog, `noconstant') $IV_wt /* + */ if `touse', maximize init(`b_init') `cueoptions' /* + */ crittype(neg GMM obj function -J) /* + */ collinear nooutput nopreserve missing noscvars + } + else { +di in ye "Equation exactly-identified: CUE and 2-step GMM coincide" + } +* Remove equation number from column names + mat `B'=e(b) + mat colnames `B' = _: +* Last call to get vcv, j, Sinv etc. + qui `ivreg2_cmd' $IV_lhs $IV_inexog ($IV_endog=$IV_exexog) $IV_wt /* + */ if `touse', $IV_opt b0(`B') noid +* Save all results + mat `V'=e(V) + mat `S'=e(S) + mat `Sinv'=syminv(`S') + mat `W'=`Sinv' + + local rankS = e(rankS) + scalar `j'=e(j) + local df_m = e(df_m) + scalar `rankV'=e(rankV) + + if "`cluster'" != "" { + local N_clust=e(N_clust) + } + capture drop `yhat' + qui mat score double `yhat'=`B' if `touse' + qui gen double `gresid'=`lhs'-`yhat' + qui gen double `gresid2'=`gresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `gresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `rss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `sigmasq'=`rss'/(`Nprec'-`dofminus') + + macro drop IV_lhs IV_inexog IV_endog IV_exexog IV_wt IV_opt + capture _estimates unhold `temphold' + } + +******************************************************************************************* +* RSS, counts, dofs, F-stat, small-sample corrections +******************************************************************************************* + scalar `rmse'=sqrt(`sigmasq') + if "`noconstant'"=="" { + scalar `mss'=`yyc' - `rss' + } + else { + scalar `mss'=`yy' - `rss' + } + +* Counts modified to include constant if appropriate + if "`noconstant'"=="" { + local iv1_ct = `iv1_ct' + 1 + local rhs1_ct = `rhs1_ct' + 1 + } +* Correct count of rhs variables accounting for dropped collinear vars +* Count includes constant + + local rhs_ct = rowsof(`XX') - diag0cnt(`XXinv') + + if "`cluster'"=="" { +* Residual dof adjusted for dofminus + local df_r = `N' - `rhs_ct' - `dofminus' + } + else { +* To match Stata, subtract 1 (why 1 and not `rhs_ct' is a mystery) + local df_r = `N_clust' - 1 + } + +* Sargan-Hansen J dof and p-value +* df=0 doesn't guarantee j=0 since can be call to get value of CUE obj fn + local jdf = `iv_ct' - `rhs_ct' + if `jdf' == 0 & "`b0'"=="" { + scalar `j' = 0 + } + else { + scalar `jp' = chiprob(`jdf',`j') + } + if "`liml'"~="" { + scalar `arubinp' = chiprob(`jdf',`arubin') + } + +* Small sample corrections for var-cov matrix. +* If robust, the finite sample correction is N/(N-K), and with no small +* we change this to 1 (a la Davidson & MacKinnon 1993, p. 554, HC0). +* If cluster, the finite sample correction is (N-1)/(N-K)*M/(M-1), and with no small +* we change this to 1 (a la Wooldridge 2002, p. 193), where M=number of clusters. +* In the adj of the V matrix for non-small, we use Nprec instead of N because +* iweights rounds off N. Note that iweights are not allowed with robust +* but we use Nprec anyway to maintain consistency of code. + + if "`small'" != "" { + if "`cluster'"=="" { + matrix `V'=`V'*(`Nprec'-`dofminus')/(`Nprec'-`rhs_ct'-`dofminus') + } + else { + matrix `V'=`V'*(`Nprec'-1)/(`Nprec'-`rhs_ct') /* + */ * `N_clust'/(`N_clust'-1) + } + scalar `sigmasq'=`rss'/(`Nprec'-`rhs_ct'-`dofminus') + scalar `rmse'=sqrt(`sigmasq') + } + + scalar `r2u'=1-`rss'/`yy' + scalar `r2c'=1-`rss'/`yyc' + if "`noconstant'"=="" { + scalar `r2'=`r2c' + scalar `r2_a'=1-(1-`r2')*(`Nprec'-1)/(`Nprec'-`rhs_ct'-`dofminus') + } + else { + scalar `r2'=`r2u' + scalar `r2_a'=1-(1-`r2')*`Nprec'/(`Nprec'-`rhs_ct'-`dofminus') + } + +* Fstat +* To get it to match Stata's, must post separately with dofs and then do F stat by hand +* in case weights generate non-integer obs and dofs +* Create copies so they can be posted + tempname FB FV + mat `FB'=`B' + mat `FV'=`V' + capture ereturn post `FB' `FV' +* If the cov matrix wasn't positive definite, the post fails with error code 506 + local rc = _rc + if `rc' != 506 { + local Frhs1 `rhs1' + capture test `Frhs1' + if "`small'" == "" { + if "`cluster'"=="" { + capture scalar `F' = r(chi2)/`df_m' * `df_r'/(`Nprec'-`dofminus') + } + else { + capture scalar `F' = r(chi2)/`df_m' * /* +* fwl_ct used here so that F-stat matches test stat from regression with no FWL and small + */ (`N_clust'-1)/`N_clust' * (`Nprec'-`rhs_ct'-`fwl_ct')/(`Nprec'-1) + } + } + else { + capture scalar `F' = r(chi2)/`df_m' + } + capture scalar `Fp'=Ftail(`df_m',`df_r',`F') + capture scalar `Fdf2'=`df_r' + } + +* If j==. or vcv wasn't full rank, then vcv problems and F is meaningless + if `j' == . | `rc'==506 { + scalar `F' = . + scalar `Fp' = . + } + +* End of counts, dofs, F-stat, small sample corrections +******************************************************************************************* +* orthog option: C statistic (difference of Sargan statistics) +******************************************************************************************* +* Requires j dof from above + if "`orthog'"!="" { + tempname cj cstat cstatp +* Initialize cstat + scalar `cstat' = 0 +* Each variable listed must be in instrument list. +* To avoid overwriting, use cendo, cinexog1, cexexog, cendo_ct, cex_ct + local cendo1 "`endo1'" + local cinexog1 "`inexog1'" + local cexexog1 "`exexog1'" + local cinsts1 "`insts1'" + local crhs1 "`rhs1'" + local clist1 "`orthog'" + local clist_ct : word count `clist1' + +* Check to see if c-stat vars are in original list of all ivs +* cinexog1 and cexexog1 are after c-stat exog list vars have been removed +* cendo1 is endo1 after included exog being tested has been added + foreach x of local clist1 { + local llex_ct : word count `cexexog1' + Subtract cexexog1 : "`cexexog1'" "`x'" + local cex1_ct : word count `cexexog1' + local ok = `llex_ct' - `cex1_ct' + if (`ok'==0) { +* Not in excluded, check included and add to endog list if it appears + local llin_ct : word count `cinexog1' + Subtract cinexog1 : "`cinexog1'" "`x'" + local cin1_ct : word count `cinexog1' + local ok = `llin_ct' - `cin1_ct' + if (`ok'==0) { +* Not in either list +di in r "Error: `x' listed in orthog() but does not appear as exogenous." + error 198 + } + else { + local cendo1 "`cendo1' `x'" + } + } + } + +* If robust, HAC/AC or GMM (but not LIML or IV), create optimal weighting matrix to pass to ivreg2 +* by extracting the submatrix from the full S and then inverting. +* This guarantees the C stat will be non-negative. See Hayashi (2000), p. 220. +* Calculate C statistic with recursive call to ivreg2 +* Collinearities may cause problems, hence -capture-. +* smatrix works generally, including homoskedastic case with Sargan stat + capture { + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + if "`kernel'" != "" { + local bwopt "bw(`bw')" + local kernopt "kernel(`kernel')" + } +* clopt is omitted because it requires calculation of numbers of clusters, which is done +* only when S matrix is calculated + capture `ivreg2_cmd' `lhs' `cinexog1' /* + */ (`cendo1'=`cexexog1') /* + */ if `touse' `wtexp', `noconstant' /* + */ `options' `small' `robust' /* + */ `gmm' `bwopt' `kernopt' `dofmopt' `sw' `swpsd' /* + */ smatrix("`S'") noid + local rc = _rc + if `rc' == 481 { + scalar `cstat' = 0 + local cstatdf = 0 + } + else { + scalar `cj'=e(j) + local cjdf=e(jdf) + } + scalar `cstat' = `j' - `cj' + local cstatdf = `jdf' - `cjdf' + _estimates unhold `ivest' + scalar `cstatp'= chiprob(`cstatdf',`cstat') +* Collinearities may cause C-stat dof to differ from the number of variables in orthog() +* If so, set cstat=0 + if `cstatdf' != `clist_ct' { + scalar `cstat' = 0 + } + } + } +* End of orthog block + +******************************************************************************************* +* Endog option +******************************************************************************************* +* Uses recursive call with orthog + if "`endogtest'"!="" { + tempname estat estatp +* Initialize estat + scalar `estat' = 0 +* Each variable to test must be in endo list. +* To avoid overwriting, use eendo, einexog1, etc. + local eendo1 "`endo1'" + local einexog1 "`inexog1'" + local einsts1 "`insts1'" + local elist1 "`endogtest'" + local elist_ct : word count `elist1' +* Check to see if endog test vars are in original endo1 list of endogeneous variables +* eendo1 and einexog1 are after endog test vars have been removed from endo and added to inexog + foreach x of local elist1 { + local llendo_ct : word count `eendo1' + local eendo1 : list eendo1 - x + local eendo1_ct : word count `eendo1' + local ok = `llendo_ct' - `eendo1_ct' + if (`ok'==0) { +* Not in endogenous list +di in r "Error: `x' listed in endog() but does not appear as endogenous." + error 198 + } + else { + local einexog1 "`einexog1' `x'" + } + } +* Recursive call to ivreg2 using orthog option to obtain endogeneity test statistic +* Collinearities may cause problems, hence -capture-. + capture { + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + capture `ivreg2_cmd' `lhs' `einexog1' /* + */ (`eendo1'=`exexog1') if `touse' /* + */ `wtexp', `noconstant' `robust' `clopt' /* + */ `gmm' `liml' `bwopt' `kernopt' /* + */ `small' `dofmopt' `sw' `swpsd' `options' /* + */ orthog(`elist1') noid + local rc = _rc + if `rc' == 481 { + scalar `estat' = 0 + local estatdf = 0 + } + else { + scalar `estat'=e(cstat) + local estatdf=e(cstatdf) + scalar `estatp'=e(cstatp) + } + _estimates unhold `ivest' +* Collinearities may cause endog stat dof to differ from the number of variables in endog() +* If so, set estat=0 + if `estatdf' != `elist_ct' { + scalar `estat' = 0 + } + } +* End of endogeneity test block + } + +******************************************************************************************* +* Rank identification and redundancy block +******************************************************************************************* + if `endo1_ct' > 0 & "`noid'"=="" { + tempname ccmat ccrealev ccimagev cc idstat iddf idp + tempname cdchi2 cdchi2p ccf cdf cdeval cd + mat `ccmat' = `XXinv'*`XPZX' +* Need only upper LHS block, which corresponds to included endogenous + mat `ccmat' = `ccmat'[1..`endo1_ct',1..`endo1_ct'] + mat eigenvalues `ccrealev' `ccimagev' = `ccmat' +* Real eigenvalues are the squared canonical correlations +* The first reported cc is NOT necessarily the smallest (with mat symeigen the smallest is last). +* Sort so smallest is first. + vecsort `ccrealev' + scalar `cc'=`ccrealev'[1,1] +* dof adjustment needed because it doesn't use the adjusted S + scalar `idstat' = -(`Nprec'-`dofminus')*ln(1-`cc') + local iddf = `iv_ct' - (`rhs_ct'-1) + scalar `idp' = chiprob(`iddf',`idstat') +* Cragg-Donald, Anderson etc. + scalar `cd'=`cc'/(1-`cc') +* dofminus used because it doesn't use adjusted S + local ddf = `Nprec'-`iv_ct'-`dofminus' + local ndf = `exex1_ct' + scalar `cdchi2'=`cd'*(`Nprec'-`dofminus') + scalar `cdchi2p' = chiprob(`iddf',`cdchi2') + scalar `cdf' =`cd'*`ddf'/`ndf' + scalar `ccf' =`cc'*`ddf'/`ndf' +* Save evs in CD style + local evcols = colsof(`ccrealev') + mat `cdeval' = J(1,`evcols',.) + forval i=1/`evcols' { + mat `cdeval'[1,`i'] = `ccrealev'[1,`i'] / (1 - `ccrealev'[1,`i']) + } + } + +* LR redundancy test + if `endo1_ct' > 0 & "`redundant'" ~= "" & "`noid'"=="" { +* Obtain Anderson zero rank (totally unidentified) statistic for full set of instruments + tempname unidstat + scalar `unidstat'=0 + forvalues thiscol=1(1)`endo1_ct' { +* dof adjustment needed because it doesn't use the adjusted S + scalar `unidstat'=`unidstat'-(`Nprec'-`dofminus')*ln(1-`ccrealev'[1,`thiscol']) + } +* Diff between this and the stat using the irrelevant excl IVs is chi2 with dof=#endog*#tested + local redlist1 "`redundant'" +* XZcols are the Z columns, so can use for ZZ too + local rXZcols : colnames `XZ' + foreach x of local redlist1 { + local riv_ct_a : word count `rXZcols' + Subtract rXZcols : "`rXZcols'" "`x'" + local riv_ct_b : word count `rXZcols' + if `riv_ct_a' == `riv_ct_b' { +* Not in list +di in r "Error: `x' listed in redundant() but does not appear as excluded instrument." + error 198 + } + } + tempname rXZ rZZ rZZtemp rZZinv rXPZX rccmat rccrealev rccimagev runidmat runidstat + foreach cn of local rXZcols { + mat `rXZ' = nullmat(`rXZ') , `XZ'[1...,"`cn'"] + mat `rZZtemp' = nullmat(`rZZtemp') , `ZZ'[1...,"`cn'"] + } + foreach cn of local rXZcols { + mat `rZZ' = nullmat(`rZZ') \ `rZZtemp'["`cn'",1...] + } + mat `rZZ'=(`rZZ'+`rZZ'')/2 + mat `rZZinv' = syminv(`rZZ') + mat `rXPZX' = `rXZ'*`rZZinv'*`rXZ'' + mat `rccmat' = `XXinv'*`rXPZX' + mat `rccmat' = `rccmat'[1..`endo1_ct',1..`endo1_ct'] + mat eigenvalues `rccrealev' `rccimagev' = `rccmat' + scalar `runidstat'=0 + forvalues thiscol=1(1)`endo1_ct' { +* dof adjustment needed because it doesn't use the adjusted S + scalar `runidstat'=`runidstat'-(`Nprec'-`dofminus')*ln(1-`rccrealev'[1,`thiscol']) + } + tempname redstat redp + local riv_ct = rowsof(`rZZ') - diag0cnt(`rZZinv') + if `riv_ct' < `rhs_ct' { +* Not in list +di in r "Error: specification with redundant() option is unidentified (fails rank condition)" + error 198 + } + local redlist_ct=`iv_ct'-`riv_ct' + scalar `redstat' = `unidstat' - `runidstat' + local reddf = `endo1_ct'*`redlist_ct' + scalar `redp' = chiprob(`reddf',`redstat') + } + +* End of identification stats block + +******************************************************************************************* +* Error-checking block +******************************************************************************************* + +* Check if adequate number of observations + if `N' <= `iv_ct' { +di in r "Error: number of observations must be greater than number of instruments" +di in r " including constant." + error 2001 + } + +* Check if robust VCV matrix is of full rank + if "`gmm'`robust'`cluster'`kernel'" != "" { +* Robust covariance matrix not of full rank means either a singleton dummy or too few +* clusters (in which case the indiv SEs are OK but no F stat or 2-step GMM is possible), +* or there are too many AC/HAC-lags, or the HAC covariance estimator +* isn't positive definite (possible with truncated and Tukey-Hanning kernels) + if `rankS' < `iv_ct' { +* If two-step GMM then exit with error ... + if "`gmm'" != "" { +di in r "Error: estimated covariance matrix of moment conditions not of full rank;" +di in r " cannot calculate optimal weighting matrix for GMM estimation." +di in r "Possible causes:" + if "`cluster'" != "" { +di in r " number of clusters insufficient to calculate optimal weighting matrix" + } + if "`kernel'" != "" { +di in r " covariance matrix of moment conditions not positive definite" +di in r " covariance matrix uses too many lags" + } +di in r " singleton dummy variable (dummy with one 1 and N-1 0s or vice versa)" +di in r "-fwl- option may address problem. See help " _c +di in smcl "{help ivreg2}". + error 498 + } +* Estimation isn't two-step GMM so continue but J, F, and C stat (if present) all meaningless +* Must set Sargan-Hansen j = missing so that problem can be reported in output + else { + scalar `j' = . + if "`orthog'"!="" { + scalar `cstat' = . + } + if "`endogtest'"!="" { + scalar `estat' = . + } + } + } + } + +* End of error-checking block +******************************************************************************************** +* Reduced form and first stage regression options +******************************************************************************************* +* Relies on proper count of (non-collinear) IVs generated earlier. +* Note that nocons option + constant in instrument list means first-stage +* regressions are reported with nocons option. First-stage F-stat therefore +* correctly includes the constant as an explanatory variable. + + if "`rf'`saverf'`first'`ffirst'`savefirst'" != "" & (`endo1_ct' > 0) & "`noid'"=="" { +* Reduced form needed for AR first-stage test stat. Also estimated if requested. + tempname archi2 archi2p arf arfp ardf ardf_r sstat sstatp sstatdf + doRF "`lhs'" "`inexog1'" "`exexog1'" /* + */ `touse' `"`wtexp'"' `"`noconstant'"' `"`robust'"' /* + */ `"`clopt'"' `"`bwopt'"' `"`kernopt'"' /* + */ `"`saverfprefix'"' /* + */ "`dofminus'" `"`sw'"' `"`swpsd'"' "`ivreg2_cmd'" + scalar `archi2'=r(archi2) + scalar `archi2p'=r(archi2p) + scalar `arf'=r(arf) + scalar `arfp'=r(arfp) + scalar `ardf'=r(ardf) + scalar `ardf_r'=r(ardf_r) + local rfeq "`r(rfeq)'" +* Drop saved rf results if needed only for first-stage estimations + if "`rf'`saverf'" == "" { + capture estimates drop `rfeq' + } +* Stock-Wright S statistic. Equiv to J LM test of exexog. +* First block handles all cases except no exog regressors; second block uses GMM obj function, +* which works without fwl because b0 is only endog regressors. + + if `inexog1_ct' + `cons_ct' > 0 { + qui `ivreg2_cmd' `lhs' `inexog' (=`exexog') `wtexp' if `touse', /* + */ `noconstant' dofminus(`dofminus') /* + */ `robust' `clopt' `bwopt' `kernopt' `sw' `swpsd' + } + else { + tempname b1 + mat `b1'=J(1,`endo1_ct',0) + matrix colnames `b1' = `endo1' + qui `ivreg2_cmd' `lhs' (`endo1'=`exexog') `wtexp' if `touse', /* + */ b0(`b1') noconstant dofminus(`dofminus') /* + */ `robust' `clopt' `bwopt' `kernopt' `sw' `swpsd' + } + scalar `sstat'=e(j) + scalar `sstatdf'=`ardf' + scalar `sstatp'=chiprob(`sstatdf',`sstat') + } + + if "`first'`ffirst'`savefirst'" != "" & (`endo1_ct' > 0) { + +* Godfrey method of Shea partial R2 uses IV and OLS estimates without robust vcvs: +* Partial R2 = OLS V[d,d] / IV V[d,d] * IV s2 / OLS s2 +* where d,d is the diagonal element corresponding to the endog regressor +* ... but this simplifies to matrices that have already been calculated: +* = XXinv[d,d] / XPZXinv[d,d] + tempname godfrey sols siv + tempname firstmat sheapr2 pr2 pr2F pr2p + mat `godfrey' = J(1,`endo1_ct',0) + mat colnames `godfrey' = `endo1' + mat rownames `godfrey' = "sheapr2" + local i 1 + foreach var of local endo1 { + mat `sols'=`XXinv'["`var'","`var'"] + mat `siv'=`XPZXinv'["`var'","`var'"] + mat `godfrey'[1,`i'] = `sols'[1,1]/`siv'[1,1] + local i = `i'+1 + } + + if `iv1_ct' > `iv_ct' { +di +di in gr "Warning: collinearities detected among instruments" +di in gr "1st stage tests of excluded exogenous variables may be incorrect" + } + + doFirst "`endo1'" "`inexog1'" "`exexog1'" /* + */ `touse' `"`wtexp'"' `"`noconstant'"' `"`robust'"' /* + */ `"`clopt'"' `"`bwopt'"' `"`kernopt'"' /* + */ `"`savefprefix'"' /* + */ `"`dofmopt'"' `"`sw'"' `"`swpsd'"' "`ivreg2_cmd'" + + local firsteqs "`r(firsteqs)'" + capture mat `firstmat'=`godfrey' \ r(firstmat) + if _rc != 0 { +di in ye "Warning: missing values encountered; first stage regression results not saved" + } + } +* End of first-stage regression code +********************************************************************************************** +* Post and display results. +******************************************************************************************* + +* restore data if preserved for fwl option + if "`fwl'" != "" { + restore + } + +* NB: Would like to use -Nprec- in obs() in case weights generate non-integer obs +* but Stata complains. Using -Nprec- with dof() makes no difference - seems to round it + if "`small'"!="" { + local NminusK = `N'-`rhs_ct' + capture ereturn post `B' `V', dep(`depname') obs(`N') esample(`touse') /* + */ dof(`NminusK') + } + else { + capture ereturn post `B' `V', dep(`depname') obs(`N') esample(`touse') + } + local rc = _rc + if `rc' == 504 { +di in red "Error: estimated variance-covariance matrix has missing values" + exit 504 + } + if `rc' == 506 { +di in red "Error: estimated variance-covariance matrix not positive-definite" + exit 506 + } + if `rc' > 0 { +di in red "Error: estimation failed - could not post estimation results" + exit `rc' + } + +* changed next from `endo1' to `endo' 2Aug06 MES + ereturn local instd `endo' + local insts : colnames `S' + local insts : subinstr local insts "_cons" "" + ereturn local insts `insts' + ereturn local inexog `inexog' + ereturn local exexog `exexog' + ereturn local fwl `fwl' + ereturn scalar inexog_ct=`inexog1_ct' + ereturn scalar exexog_ct=`exex1_ct' + ereturn scalar endog_ct =`endo1_ct' + if "`collin'`ecollin'`dups'`fwlcons'" != "" { + ereturn local collin `collin' + ereturn local ecollin `ecollin' + ereturn local dups `dups' + ereturn local instd1 `endo1' + ereturn local inexog1 `inexog1' + ereturn local exexog1 `exexog1' + ereturn local fwl1 `fwl1' + } + + if "`smatrix'" == "" { + ereturn matrix S `S' + } + else { +* Create a copy so posting doesn't zap the original + tempname Scopy + mat `Scopy'=`smatrix' + ereturn matrix S `Scopy' + } + +* No weighting matrix defined for LIML and kclass + if "`wmatrix'"=="" & "`liml'`kclass'"=="" { + ereturn matrix W `W' + } + else if "`liml'`kclass'"=="" { +* Create a copy so posting doesn't zap the original + tempname Wcopy + mat `Wcopy'=`wmatrix' + ereturn matrix W `Wcopy' + } + + if "`kernel'"!="" { + ereturn local kernel "`kernel'" + ereturn scalar bw=`bw' + ereturn local tvar "`tvar'" + if "`ivar'" ~= "" { + ereturn local ivar "`ivar'" + } + } + + if "`small'"!="" { + ereturn scalar df_r=`df_r' + ereturn local small "small" + } + + if "`cluster'"!="" { + ereturn scalar N_clust=`N_clust' + ereturn local clustvar `cluster' + } + + if "`robust'`cluster'" != "" { + ereturn local vcetype "Robust" + } + + ereturn scalar df_m=`df_m' + ereturn scalar r2=`r2' + ereturn scalar rmse=`rmse' + ereturn scalar rss=`rss' + ereturn scalar mss=`mss' + ereturn scalar r2_a=`r2_a' + ereturn scalar F=`F' + ereturn scalar Fp=`Fp' + ereturn scalar Fdf2=`Fdf2' + ereturn scalar yy=`yy' + ereturn scalar yyc=`yyc' + ereturn scalar r2u=`r2u' + ereturn scalar r2c=`r2c' + ereturn scalar rankzz=`iv_ct' + ereturn scalar rankxx=`rhs_ct' + if "`gmm'`robust'`cluster'`kernel'" != "" { + ereturn scalar rankS=`rankS' + } + ereturn scalar rankV=`rankV' + ereturn scalar ll = -0.5 * (`Nprec'*ln(2*_pi) + `Nprec'*ln(`rss'/`Nprec') + `Nprec') + +* Always save J. Also save as Sargan if homoskedastic; save A-R if LIML. + ereturn scalar j=`j' + ereturn scalar jdf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar jp=`jp' + } + if ("`robust'`cluster'"=="") { + ereturn scalar sargan=`j' + ereturn scalar sargandf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar sarganp=`jp' + } + } + if "`liml'"!="" { + ereturn scalar arubin=`arubin' + ereturn scalar arubindf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar arubinp=`arubinp' + } + } + + if "`orthog'"!="" { + ereturn scalar cstat=`cstat' + if `cstat'!=0 & `cstat' != . { + ereturn scalar cstatp=`cstatp' + ereturn scalar cstatdf=`cstatdf' + ereturn local clist `clist1' + } + } + + if "`endogtest'"!="" { + ereturn scalar estat=`estat' + if `estat'!=0 & `estat' != . { + ereturn scalar estatp=`estatp' + ereturn scalar estatdf=`estatdf' + ereturn local elist `elist1' + } + } + + if `endo1_ct' > 0 & "`noid'"=="" { + ereturn scalar idstat=`idstat' + ereturn scalar iddf=`iddf' + ereturn scalar idp=`idp' + ereturn scalar cd=`cd' + ereturn scalar cdf=`cdf' + ereturn matrix ccev=`ccrealev' + capture ereturn matrix cdev `cdeval' + } + + if "`redundant'"!="" & "`noid'"=="" { + ereturn scalar redstat=`redstat' + ereturn scalar redp=`redp' + ereturn scalar reddf=`reddf' + ereturn local redlist `redlist1' + } + + if "`first'`ffirst'`savefirst'" != "" & `endo1_ct'>0 & "`noid'"=="" { +* Capture here because firstmat empty if mvs encountered in 1st stage regressions + capture ereturn matrix first `firstmat' + ereturn scalar cdchi2=`cdchi2' + ereturn scalar cdchi2p=`cdchi2p' + ereturn scalar arf=`arf' + ereturn scalar arfp=`arfp' + ereturn scalar archi2=`archi2' + ereturn scalar archi2p=`archi2p' + ereturn scalar ardf=`ardf' + ereturn scalar ardf_r=`ardf_r' + ereturn scalar sstat=`sstat' + ereturn scalar sstatp=`sstatp' + ereturn scalar sstatdf=`sstatdf' + ereturn local firsteqs `firsteqs' + } + if "`rf'`saverf'" != "" & `endo1_ct'>0 { + ereturn local rfeq `rfeq' + } + + ereturn local depvar `lhs' + + if "`liml'"!="" { + ereturn local model "liml" + ereturn scalar kclass=`kclass2' + ereturn scalar lambda=`lambda' + if `fuller' > 0 & `fuller' < . { + ereturn scalar fuller=`fuller' + } + } + else if "`kclass'" != "" { + ereturn local model "kclass" + ereturn scalar kclass=`kclass2' + } + else if "`gmm'`cue'`wmatrix'"=="" { + if "`endo1'" == "" { + ereturn local model "ols" + } + else { + ereturn local model "iv" + } + } + else if "`cue'"~="" { + ereturn local model "cue" + } + else if "`wmatrix'"~="" { + ereturn local model "gmm" + } + else if "`gmm'"~="" { + ereturn local model "gmm2s" + } + else { +* Should never enter here + ereturn local model "unknown" + } + + if "`weight'" != "" { + ereturn local wexp "=`exp'" + ereturn local wtype `weight' + } + ereturn local cmd `ivreg2_cmd' + ereturn local version `lversion' + if "`noconstant'"!="" { + ereturn scalar cons=0 + } + else { + ereturn scalar cons=1 + } + if `fwl_ct'>0 { + ereturn scalar fwlcons=`fwlcons' + } + ereturn local predict "`ivreg2_cmd'_p" + + if "`e(model)'"=="gmm2s" { + local title2 "2-Step GMM estimation" + } + if "`e(model)'"=="gmm" { + local title2 "GMM estimation with user-supplied weighting matrix" + } + if "`e(model)'"=="cue" { + local title2 "CUE estimation" + } + if "`e(model)'"=="ols" { + local title2 "OLS estimation" + } + if "`e(model)'"=="iv" { + local title2 "IV (2SLS) estimation" + } + if "`e(model)'"=="liml" { + local title2 "LIML estimation" + } + if "`e(model)'"=="kclass" { + local title2 "k-class estimation" + } + if "`e(vcetype)'" == "Robust" { + local hacsubtitle1 "heteroskedasticity" + } + if "`e(kernel)'"!="" { + local hacsubtitle3 "autocorrelation" + } + if "`e(clustvar)'"!="" { + local hacsubtitle3 "clustering on `e(clustvar)'" + } + if "`hacsubtitle1'"~="" & "`hacsubtitle3'" ~= "" { + local hacsubtitle2 " and " + } + if "`title'"=="" { + ereturn local title "`title1'`title2'" + } + else { + ereturn local title "`title'" + } + if "`subtitle'"~="" { + ereturn local subtitle "`subtitle'" + } + local hacsubtitle "`hacsubtitle1'`hacsubtitle2'`hacsubtitle3'" + if "`hacsubtitle'"~="" { + ereturn local hacsubtitle "Statistics robust to `hacsubtitle'" + } + if "`sw'"~="" & "`swpsd'"=="" { + ereturn local hacsubtitle "Stock-Watson heteroskedastic-robust statistics (BETA VERSION)" + } + if "`swpsd'"~="" { + ereturn local hacsubtitle "Stock-Watson psd heteroskedastic-robust statistics (BETA VERSION)" + } + } + +******************************************************************************************* +* Display results unless ivreg2 called just to generate stats or nooutput option + + if "`nooutput'" == "" { + if "`savefirst'`saverf'" != "" { + DispStored `"`saverf'"' `"`savefirst'"' `"`ivreg2_cmd'"' + } + if "`rf'" != "" { + DispRF + } + if "`first'" != "" { + DispFirst `"`ivreg2_cmd'"' + } + if "`first'`ffirst'" != "" { + DispFFirst `"`ivreg2_cmd'"' + } + if "`eform'"!="" { + local efopt "eform(`eform')" + } + DispMain `"`noheader'"' `"`plus'"' `"`efopt'"' `"`level'"' `"`nofooter'"' `"`ivreg2_cmd'"' + } + +* Drop first stage estimations unless explicitly saved or if replay + if "`savefirst'" == "" { + local firsteqs "`e(firsteqs)'" + foreach eqname of local firsteqs { + capture estimates drop `eqname' + } + ereturn local firsteqs + } + +* Drop reduced form estimation unless explicitly saved or if replay + if "`saverf'" == "" { + local eqname "`e(rfeq)'" + capture estimates drop `eqname' + ereturn local rfeq + } + +end + +******************************************************************************************* +* SUBROUTINES +******************************************************************************************* + +program define DispMain, eclass + args noheader plus efopt level nofooter helpfile + version 8.2 +* Prepare for problem resulting from rank(S) being insufficient +* Results from insuff number of clusters, too many lags in HAC, +* to calculate robust S matrix, HAC matrix not PD, singleton dummy, +* and indicated by missing value for j stat +* Macro `rprob' is either 1 (problem) or 0 (no problem) + capture local rprob ("`e(j)'"==".") + + if "`noheader'"=="" { + if "`e(title)'" ~= "" { +di in gr _n "`e(title)'" + local tlen=length("`e(title)'") +di in gr "{hline `tlen'}" + } + if "`e(subtitle)'" ~= "" { +di in gr "`e(subtitle)'" + } + if "`e(model)'"=="liml" | "`e(model)'"=="kclass" { +di in gr "k =" %7.5f `e(kclass)' + } + if "`e(model)'"=="liml" { +di in gr "lambda =" %7.5f `e(lambda)' + } + if e(fuller) > 0 & e(fuller) < . { +di in gr "Fuller parameter=" %-5.0f `e(fuller)' + } + if "`e(hacsubtitle)'" ~= "" { +di in gr _n "`e(hacsubtitle)'" + } + if "`e(kernel)'"!="" { +di in gr " kernel=`e(kernel)'; bandwidth=`e(bw)'" +di in gr " time variable (t): " in ye e(tvar) + if "`e(ivar)'" != "" { +di in gr " group variable (i): " in ye e(ivar) + } + } + di + if "`e(clustvar)'"!="" { +di in gr "Number of clusters (" "`e(clustvar)'" ") = " in ye %-4.0f e(N_clust) _continue + } + else { +di in gr " " _continue + } +di in gr _col(55) "Number of obs = " in ye %8.0f e(N) + + if "`e(clustvar)'"=="" { + local Fdf2=e(N)-e(rankxx) + } + else { + local Fdf2=e(N_clust)-1 + } + +di in gr _c _col(55) "F(" %3.0f e(df_m) "," %6.0f e(Fdf2) ") = " + if e(F) < 99999 { +di in ye %8.2f e(F) + } + else { +di in ye %8.2e e(F) + } +di in gr _col(55) "Prob > F = " in ye %8.4f e(Fp) + +di in gr "Total (centered) SS = " in ye %12.0g e(yyc) _continue +di in gr _col(55) "Centered R2 = " in ye %8.4f e(r2c) +di in gr "Total (uncentered) SS = " in ye %12.0g e(yy) _continue +di in gr _col(55) "Uncentered R2 = " in ye %8.4f e(r2u) +di in gr "Residual SS = " in ye %12.0g e(rss) _continue +di in gr _col(55) "Root MSE = " in ye %8.4g e(rmse) +di + } + +* Display coefficients etc. +* Unfortunate but necessary hack here: to suppress message about cluster adjustment of +* standard error, clear e(clustvar) and then reset it after display + local cluster `e(clustvar)' + ereturn local clustvar + ereturn display, `plus' `efopt' level(`level') + ereturn local clustvar `cluster' + +* Display 1st footer with identification stats +* Footer not displayed if -nofooter- option or if pure OLS, i.e., model="ols" and Sargan-Hansen=0 + if ~("`nofooter'"~="" | (e(model)=="ols" & (e(sargan)==0 | e(j)==0))) { + +* Report Anderson rank ID test + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##cancortest:Anderson canon. corr. LR statistic}" +di in gr _c " (underidentification test):" +di in ye _col(71) %8.3f e(idstat) +di in gr _col(52) "Chi-sq(" in ye e(iddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(idp) +* LR IV redundancy statistic + if "`e(redlist)'"!="" { +di in gr "-redundant- option:" +di in smcl _c "{help `helpfile'##redtest:LR IV redundancy test}" +di in gr _c " (redundancy of specified instruments):" +di in ye _col(71) %8.3f e(redstat) +di in gr _col(52) "Chi-sq(" in ye e(reddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(redp) +di in gr "Instruments tested: " _c + Disp `e(redlist)', _col(23) + } + if "`e(vcetype)'"=="Robust" | "`e(kernel)'"~="" { +di in gr "Test statistic(s) not robust" + } +di in smcl in gr "{hline 78}" + } +* Report Cragg-Donald statistic + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##cdtest:Cragg-Donald F statistic}" +di in gr _c " (weak identification test):" +di in ye _col(71) %8.3f e(cdf) +di in gr _c "Stock-Yogo weak ID test critical values:" + local cdmissing=1 + if "`e(model)'"=="iv" | "`e(model)'"=="gmm2s" | "`e(model)'"=="gmm" { + cdsy, type(ivbias5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "15% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "25% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)==.) | "`e(model)'"=="cue" { + cdsy, type(limlsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "15% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "25% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)<.) { + cdsy, type(fullrel5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + if `cdmissing' { + di in gr _col(64) "" + } + else { + if "`e(vcetype)'"=="Robust" | "`e(kernel)'"~="" { +di in gr "Test statistic(s) not robust" + } + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + } + di in smcl in gr "{hline 78}" + } + +* Report either (a) Sargan-Hansen-C stats, or (b) robust covariance matrix problem + if `rprob' == 0 { +* Display overid statistic + if "`e(vcetype)'" == "Robust" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } + else { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } +di in ye _col(71) %8.3f e(j) + if e(rankxx) < e(rankzz) { +di in gr _col(52) "Chi-sq(" in ye e(jdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(jp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + +* Display orthog option: C statistic (difference of Sargan statistics) + if e(cstat) != . { +* If C-stat = 0 then warn, otherwise output + if e(cstat) > 0 { +di in gr "-orthog- option:" + if "`e(vcetype)'" == "Robust" { +di in gr _c "Hansen J statistic (eqn. excluding suspect orthog. conditions): " + } + else { +di in gr _c "Sargan statistic (eqn. excluding suspect orthogonality conditions):" + } +di in ye _col(71) %8.3f e(j)-e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(jdf)-e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f chiprob(e(jdf)-e(cstatdf),e(j)-e(cstat)) +di in smcl _c "{help `helpfile'##ctest:C statistic}" +di in gr _c " (exogeneity/orthogonality of suspect instruments): " +di in ye _col(71) %8.3f e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f e(cstatp) +di in gr "Instruments tested: " _c + Disp `e(clist)', _col(23) + } + if e(cstat) == 0 { +di in gr _n "Collinearity/identification problems in eqn. excl. suspect orthog. conditions:" +di in gr " C statistic not calculated for -orthog- option" + } + } + } + else { +* Problem exists with robust VCV - notify and list possible causes +di in r "Error: estimated covariance matrix of moment conditions not of full rank;" +di in r " overidentification statistic not reported, and standard errors and" +di in r " model tests should be interpreted with caution." +di in r "Possible causes:" + if e(N_clust) < e(rankzz) { +di in r " number of clusters insufficient to calculate robust covariance matrix" + } + if "`e(kernel)'" != "" { +di in r " covariance matrix of moment conditions not positive definite" +di in r " covariance matrix uses too many lags" + } +di in r " singleton dummy variable (dummy with one 1 and N-1 0s or vice versa)" +di in smcl _c "{help `helpfile'##fwl:fwl}" +di in r " option may address problem." + } + +* Display endog option: endogeneity test statistic + if e(estat) != . { +* If stat = 0 then warn, otherwise output + if e(estat) > 0 { +di in gr "-endog- option:" +di in smcl _c "{help `helpfile'##endogtest:Endogeneity test}" +di in gr _c " of endogenous regressors: " +di in ye _col(71) %8.3f e(estat) +di in gr _col(52) "Chi-sq(" in ye e(estatdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(estatp) +di in gr "Regressors tested: " _c + Disp `e(elist)', _col(23) + } + if e(estat) == 0 { +di in gr _n "Collinearity/identification problems in restricted equation:" +di in gr " Endogeneity test statistic not calculated for -endog- option" + } + } + + di in smcl in gr "{hline 78}" +* Display AR overid statistic if LIML and not robust + if "`e(model)'" == "liml" & "`e(vcetype)'" ~= "Robust" & "`e(kernel)'" == "" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (LR test of excluded instruments):" + } +di in ye _col(72) %7.3f e(arubin) + if e(rankxx) < e(rankzz) { +di in gr _col(52) "Chi-sq(" in ye e(arubindf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(arubinp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + di in smcl in gr "{hline 78}" + } + } + +* Display 2nd footer with variable lists + if "`nofooter'"=="" { + +* Warn about dropped instruments if any +* (Re-)calculate number of user-supplied instruments + local iv1_ct : word count `e(insts)' + local iv1_ct = `iv1_ct' + `e(cons)' + + if `iv1_ct' > e(rankzz) { +di in gr "Collinearities detected among instruments: " _c +di in gr `iv1_ct'-e(rankzz) " instrument(s) dropped" + } + + if "`e(collin)'`e(dups)'`e(fwlcons)'" != "" { +* If collinearities, duplicates or fwl, abbreviated varlists saved with a 1 at the end + local one "1" + } + if "`e(instd)'" != "" { + di in gr "Instrumented:" _c + Disp `e(instd`one')', _col(23) + } + if "`e(inexog)'" != "" { + di in gr "Included instruments:" _c + Disp `e(inexog`one')', _col(23) + } + if "`e(exexog)'" != "" { + di in gr "Excluded instruments:" _c + Disp `e(exexog`one')', _col(23) + } + if "`e(fwlcons)'" != "" { + if e(fwlcons) { + local fwl "`e(fwl`one')' _cons" + } + else { + local fwl "`e(fwl`one')'" + } +di in smcl _c "{help `helpfile'##fwl:Partialled-out (FWL)}" + di in gr ":" _c + Disp `fwl', _col(23) +di in gr _col(23) "nb: variable counts and small-sample adjustments" +di in gr _col(23) "do not include partialled-out variables." + } + if "`e(dups)'" != "" { + di in gr "Duplicates:" _c + Disp `e(dups)', _col(23) + } + if "`e(collin)'" != "" { + di in gr "Dropped collinear:" _c + Disp `e(collin)', _col(23) + } + if "`e(ecollin)'" != "" { + di in gr "Reclassified as exog:" _c + Disp `e(ecollin)', _col(23) + } + di in smcl in gr "{hline 78}" + } +end + +************************************************************************************** + +program define DispRF + version 8.2 + local eqname "`e(rfeq)'" + local depvar "`e(depvar)'" + local strlen : length local depvar + local strlen = `strlen'+25 +di +di in gr "Reduced-form regression: `e(depvar)'" +di in smcl in gr "{hline `strlen'}" + capture estimates replay `eqname' + if "`eqname'"=="" | _rc != 0 { +di in ye "Unable to display reduced-form regression of `e(depvar)'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + else { + estimates replay `eqname', noheader +di + } +end + +program define DispFirst + version 8.2 + args helpfile + tempname firstmat ivest sheapr2 pr2 F df df_r pvalue + + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display first-stage estimates; macro e(first) is missing" + exit + } +di in gr _newline "First-stage regressions" +di in smcl in gr "{hline 23}" +di + local endo1 : colnames(`firstmat') + local nrvars : word count `endo1' + local firsteqs "`e(firsteqs)'" + local nreqs : word count `firsteqs' + if `nreqs' < `nrvars' { +di in ye "Unable to display all first-stage regressions." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + foreach eqname of local firsteqs { + _estimates hold `ivest' + capture estimates restore `eqname' + if _rc != 0 { +di +di in ye "Unable to list stored estimation `eqname'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + else { + local vn "`e(depvar)'" +di in gr "First-stage regression of `vn':" + estimates replay `eqname', noheader + mat `sheapr2' =`firstmat'["sheapr2","`vn'"] + mat `pr2' =`firstmat'["pr2","`vn'"] + mat `F' =`firstmat'["F","`vn'"] + mat `df' =`firstmat'["df","`vn'"] + mat `df_r' =`firstmat'["df_r","`vn'"] + mat `pvalue' =`firstmat'["pvalue","`vn'"] +di in smcl _c "{help `helpfile'##partialr2:Partial R-squared}" +di in gr " of excluded instruments: " _c +di in ye %8.4f `pr2'[1,1] +di in gr "Test of excluded instruments:" +di in gr " F(" %3.0f `df'[1,1] "," %6.0f `df_r'[1,1] ") = " in ye %8.2f `F'[1,1] +di in gr " Prob > F = " in ye %8.4f `pvalue'[1,1] +di + } + _estimates unhold `ivest' + } +end + +program define DispStored + args saverf savefirst helpfile + version 8.2 + if "`saverf'" != "" { + local eqlist "`e(rfeq)'" + } + if "`savefirst'" != "" { + local eqlist "`eqlist' `e(firsteqs)'" + } + local eqlist : list retokenize eqlist +di in gr _newline "Stored estimation results" +di in smcl in gr "{hline 25}" _c + capture estimates dir `eqlist' + if "`eqlist'" != "" & _rc == 0 { +* Estimates exist and can be listed + estimates dir `eqlist' + } + else if "`eqlist'" != "" & _rc != 0 { +di +di in ye "Unable to list stored estimations." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } +end + +program define DispFFirst + version 8.2 + args helpfile + tempname firstmat sheapr2 pr2 pr2F pr2p + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display summary of first-stage estimates; macro e(first) is missing" + exit + } + local endo : colnames(`firstmat') + local nrvars : word count `endo' + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + local efirsteqs "`e(firsteqs)'" +di +di in gr _newline "Summary results for first-stage regressions" +di in smcl in gr "{hline 43}" +di + +di in gr _c "Variable |" +di in smcl _c _col(15) "{help `helpfile'##partialr2:Shea Partial R2}" +di in gr _c _col(31) "|" +di in smcl _c _col(35) "{help `helpfile'##partialr2:Partial R2}" +di in gr _c _col(49) "|" +di in smcl _c _col(52) "{help `helpfile'##partialr2:F}" +di in gr _c _col(53) "(" +di in ye _col(54) %3.0f `firstmat'[4,1] in gr "," in ye %6.0f `firstmat'[5,1] in gr ") P-value" + local i = 1 + while `i' <= `nrvars' { + local vn : word `i' of `endo' + local vnlen : length local vn + if `vnlen' > 12 { + local vn : piece 1 12 of "`vn'" + } + scalar `sheapr2'=`firstmat'[1,`i'] + scalar `pr2'=`firstmat'[2,`i'] + scalar `pr2F'=`firstmat'[3,`i'] + scalar `pr2p'=`firstmat'[6,`i'] +di in y %-12s "`vn'" _col(13) in gr "|" _col(17) in y %8.4f `sheapr2' _col(31) in gr "|" /* + */ _col(35) in y %8.4f `pr2' _col(49) in gr "|" /* + */ _col(53) in y %8.2f `pr2F' _col(67) %8.4f `pr2p' + local i = `i' + 1 + } +di + if "`robust'`cluster'" != "" { + if "`cluster'" != "" { + local rtype "cluster-robust" + } + else if "`kernel'" != "" { + local rtype "heteroskedasticity and autocorrelation-robust" + } + else { + local rtype "heteroskedasticity-robust" + } + } + else if "`kernel'" != "" { + local rtype "autocorrelation-robust" + } + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: first-stage F-stat `rtype'" +di + } + + tempname iddf idstat idp cdchi2 cdchi2p cdf + scalar `iddf'=e(iddf) + scalar `idstat'=e(idstat) + scalar `idp'=e(idp) + scalar `cdchi2'=e(cdchi2) + scalar `cdchi2p'=e(cdchi2p) + scalar `cdf'=e(cdf) +di in smcl "{help `helpfile'##s_first:Underidentification tests}" +di in gr "Ho: matrix of reduced form coefficients has rank=K-1 (underidentified)" +di in gr "Ha: matrix has rank=K (identified)" +di in gr _col(50) "Chi-sq(" in ye `iddf' in gr ")" _col(65) "P-value" +di in ye "Anderson canon. corr. -N*ln(1-CCEV) LR stat." _col(49) %8.2f `idstat' _col(65) %7.4f `idp' +di in ye "Cragg-Donald N*CDEV statistic" _col(49) %8.2f `cdchi2' _col(65) %7.4f `cdchi2p' + if "`robust'`cluster'`kernel'" != "" & e(endog_ct)==1 { + tempname rchi2 rchi2p +* Robust chi2 recreated from robust F and dofs of non-robust C-D chi2 and F + scalar `rchi2'=`pr2F'*`cdchi2'/`cdf' + scalar `rchi2p'=chiprob(`iddf',`rchi2') +di in ye "Robust chi-square statistic" _col(49) %8.2f `rchi2' _col(65) %7.4f `rchi2p' + } +di +di in smcl "{help `helpfile'##s_first:Weak identification tests}" +di in gr "Ho: equation is weakly identified" +di in ye "Cragg-Donald (N-L)*CDEV/L1 F-statistic" _col(49) %8.2f `cdf' + if "`robust'`cluster'`kernel'" != "" & e(endog_ct)==1 { +di in ye "Robust F-statistic" _col(49) %8.2f `pr2F' + } +di in gr "See main output for Cragg-Donald weak id test critical values" +di + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: Anderson and Cragg-Donald under- and weak identification stats not robust" + if "`robust'`cluster'`kernel'" != "" & e(endog_ct)==1 { +di in gr " Robust identification stats `rtype'" + } + } +di + tempname arf arfp archi2 archi2p ardf ardf_r + tempname sstat sstatp sstatdf +di in smcl "{help `helpfile'##wirobust:Weak-instrument-robust inference}" +di in gr "Tests of joint significance of endogenous regressors B1 in main equation" +di in gr "Ho: B1=0 and overidentifying restrictions are valid" +* Needs to be small so that adjusted dof is reflected in F stat + scalar `arf'=e(arf) + scalar `arfp'=e(arfp) + scalar `archi2'=e(archi2) + scalar `archi2p'=e(archi2p) + scalar `ardf'=e(ardf) + scalar `ardf_r'=e(ardf_r) + scalar `sstat'=e(sstat) + scalar `sstatp'=e(sstatp) + scalar `sstatdf'=e(sstatdf) +di in ye _c "Anderson-Rubin test" +di in gr _col(30) "F(" in ye `ardf' in gr "," in ye `ardf_r' in gr ")=" /* + */ _col(40) in ye %-7.2f `arf' _col(50) in gr "P-val=" in ye %6.4f `arfp' +di in ye _c "Anderson-Rubin test" +di in gr _col(30) "Chi-sq(" in ye `ardf' in gr ")=" /* + */ _col(40) in ye %-7.2f `archi2' _col(50) in gr "P-val=" in ye %6.4f `archi2p' +di in ye _c "Stock-Wright S statistic" +di in gr _col(30) "Chi-sq(" in ye `sstatdf' in gr ")=" /* + */ _col(40) in ye %-7.2f `sstat' _col(50) in gr "P-val=" in ye %6.4f `sstatp' + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: Test statistics `rtype'" + } +di + if "`cluster'" != "" { +di in gr "Number of clusters N_clust = " in ye %10.0f e(N_clust) + } +di in gr "Number of observations N = " in ye %10.0f e(N) +di in gr "Number of regressors K = " in ye %10.0f e(rankxx) +di in gr "Number of instruments L = " in ye %10.0f e(rankzz) +di in gr "Number of excluded instruments L1 = " in ye %10.0f e(ardf) +di + +end + +* Performs first-stage regressions + +program define doFirst, rclass + version 8.2 + args endog /* variable list (including depvar) + */ inexog /* list of included exogenous + */ exexog /* list of excluded exogenous + */ touse /* touse sample + */ weight /* full weight expression w/ [] + */ nocons /* + */ robust /* + */ clopt /* + */ bwopt /* + */ kernopt /* + */ savefprefix /* + */ dofmopt /* + */ sw /* + */ swpsd /* + */ ivreg2_cmd + + tokenize `endog' + tempname statmat statmat1 + local i 1 + while "``i''" != "" { + capture `ivreg2_cmd' ``i'' `inexog' `exexog' `weight' /* + */ if `touse', `nocons' `robust' `clopt' `bwopt' `kernopt' `dofmopt' `sw' `swpsd' small + if _rc ~= 0 { +* First-stage regression failed +di in ye "Unable to estimate first-stage regression of ``i''" + if _rc == 506 { +di in ye " var-cov matrix of first-stage regression of ``i'' not positive-definite" + } + } + else { +* First-stage regression successful +* Check if there is enough room to save results; leave one free. Allow for overwriting. +* Max is 20-1=19 for Stata 9.0 and earlier, 300-1=299 for Stata 9.1+ + if c(stata_version) < 9.1 { + local maxest=19 + } + else { + local maxest=299 + } + local vn "``i''" + local plen : length local savefprefix + local vlen : length local vn + if `plen'+`vlen' > 27 { + local vlen=27-`plen' + local vn : permname `vn', length(`vlen') +* Must create a variable so that permname doesn't reuse it + gen `vn'=0 + local dropvn "`dropvn' `vn'" + } + local eqname "`savefprefix'`vn'" + local eqname : subinstr local eqname "." "_" + qui estimates dir + local est_list "`r(names)'" + Subtract est_list : "`est_list'" "`eqname'" + local est_ct : word count `est_list' + if `est_ct' < `maxest' { + capture est store `eqname', title("First-stage regression: ``i''") + if _rc == 0 { + local firsteqs "`firsteqs' `eqname'" + } + } + else { +di +di in ye "Unable to store first-stage regression of ``i''." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + tempname rssall rssinc pr2 F p + scalar `rssall'=e(rss) + quietly test `exexog' + scalar `F'=r(F) + scalar `p'=r(p) + local df=r(df) + local df_r=r(df_r) +* 1st stage regression without excluded exogenous +* Use regress since need only RSS and handles all cases, including perverse ones (e.g. no regressors) + qui regress ``i'' `inexog' `weight' /* + */ if `touse', `nocons' + */ if `touse', `nocons' `robust' `clopt' `bwopt' `kernopt' `dofmopt' `sw' `swpsd' small + scalar `rssinc'=e(rss) +* NB: uncentered R2 for main regression is 1-rssall/yy; for restricted is 1-rssinc/yy; +* squared semipartial correlation=(rssinc-rssall)/yy=diff of 2 R2s +* Squared partial correlation (="partialled-out R2") + scalar `pr2'=(`rssinc'-`rssall')/`rssinc' +* End of first-stage successful block + } + capture { + mat `statmat1' = (`pr2' \ `F' \ `df' \ `df_r' \ `p') + mat colname `statmat1' = ``i'' + if `i'==1 { + mat `statmat'=`statmat1' + } + else { + mat `statmat' = `statmat' , `statmat1' + } + } + local i = `i' + 1 + } +* Drop any temporarily-created permname variables + if trim("`dropvn'")~="" { + foreach vn of varlist `dropvn' { + capture drop `vn' + } + } + capture mat rowname `statmat' = pr2 F df df_r pvalue + if _rc==0 { + return matrix firstmat `statmat' + } + return local firsteqs "`firsteqs'" +end + +program define doRF, rclass + version 8.2 + args lhs /* + */ inexog /* list of included exogenous + */ exexog /* list of excluded exogenous + */ touse /* touse sample + */ weight /* full weight expression w/ [] + */ nocons /* + */ robust /* + */ clopt /* + */ bwopt /* + */ kernopt /* + */ saverfprefix /* + */ dofminus /* + */ sw /* + */ swpsd /* + */ ivreg2_cmd + +* Anderson-Rubin test of signif of endog regressors (Bo=0) +* In case ivreg2 called with adjusted dof, first stage should adjust dof as well + tempname arf arfp archi2 archi2p ardf ardf_r tempest + capture _estimates hold `tempest' + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } +* Needs to be small so that adjusted dof is reflected in F stat + qui `ivreg2_cmd' `lhs' `inexog' `exexog' `weight' if `touse', /* + */ small `nocons' dofminus(`dofminus') `robust' `clopt' `bwopt' `kernopt' `sw' `swpsd' + qui test `exexog' + scalar `arf'=r(F) + scalar `arfp'=r(p) + scalar `ardf'=r(df) + scalar `ardf_r'=r(df_r) + if "`clopt'"=="" { + scalar `archi2'=`arf'*`ardf'*(e(N)-`dofminus')/(e(N)-e(rankxx)-`dofminus') + } + else { + scalar `archi2'=`arf'*`ardf'*e(N_clust)/r(df_r)*(e(N)-1)/(e(N)-e(rankxx)) + } + scalar `archi2p'=chiprob(`ardf',`archi2') + +* Check if there is enough room to save results; leave one free. Allow for overwriting. +* Max is 20-1=19 for Stata 9.0 and earlier, 300-1=299 for Stata 9.1+ + if c(stata_version) < 9.1 { + local maxest=19 + } + else { + local maxest=299 + } + local vn "`lhs'" + local plen : length local saverfprefix + local vlen : length local lhs + if `plen'+`vlen' > 27 { + local vlen=27-`plen' + local vn : permname `vn', length(`vlen') + } + local eqname "`saverfprefix'`vn'" + local eqname : subinstr local eqname "." "_" + qui estimates dir + local est_list "`r(names)'" + Subtract est_list : "`est_list'" "`eqname'" + local est_ct : word count `est_list' + if `est_ct' < `maxest' { + capture est store `eqname', title("Reduced-form regression: `lhs'") + return local rfeq "`eqname'" + } + else { +di +di in ye "Unable to store reduced-form regression of `lhs'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + _estimates unhold `tempest' + return scalar arf=`arf' + return scalar arfp=`arfp' + return scalar ardf=`ardf' + return scalar ardf_r=`ardf_r' + return scalar archi2=`archi2' + return scalar archi2p=`archi2p' +end + +************************************************************************************** +program define IsStop, sclass + /* sic, must do tests one-at-a-time, + * 0, may be very large */ + version 8.2 + if `"`0'"' == "[" { + sret local stop 1 + exit + } + if `"`0'"' == "," { + sret local stop 1 + exit + } + if `"`0'"' == "if" { + sret local stop 1 + exit + } +* per official ivreg 5.1.3 + if substr(`"`0'"',1,3) == "if(" { + sret local stop 1 + exit + } + if `"`0'"' == "in" { + sret local stop 1 + exit + } + if `"`0'"' == "" { + sret local stop 1 + exit + } + else sret local stop 0 +end + +program define Disp + version 8.2 + syntax [anything] [, _col(integer 15) ] + local len = 80-`_col'+1 + local piece : piece 1 `len' of `"`anything'"' + local i 1 + while "`piece'" != "" { + di in gr _col(`_col') "`first'`piece'" + local i = `i' + 1 + local piece : piece `i' `len' of `"`anything'"' + } + if `i'==1 { + di + } +end + + + +* Remove all tokens in dirt from full +* Returns "cleaned" full list in cleaned + +program define Subtract /* : */ + version 8.2 + args cleaned /* macro name to hold cleaned list + */ colon /* ":" + */ full /* list to be cleaned + */ dirt /* tokens to be cleaned from full */ + + tokenize `dirt' + local i 1 + while "``i''" != "" { + local full : subinstr local full "``i''" "", word all + local i = `i' + 1 + } + + tokenize `full' /* cleans up extra spaces */ + c_local `cleaned' `*' +end + +program define vecsort /* Also clears col/row names */ + version 8.2 + args vmat + tempname hold + mat `vmat'=`vmat'+J(rowsof(`vmat'),colsof(`vmat'),0) + local lastcol = colsof(`vmat') + local i 1 + while `i' < `lastcol' { + if `vmat'[1,`i'] > `vmat'[1,`i'+1] { + scalar `hold' = `vmat'[1,`i'] + mat `vmat'[1,`i'] = `vmat'[1,`i'+1] + mat `vmat'[1,`i'+1] = `hold' + local i = 1 + } + else { + local i = `i' + 1 + } + } +end + +program define matsort + version 8.2 + args vmat names + tempname hold + foreach vn in `names' { + mat `hold'=nullmat(`hold'), `vmat'[1...,"`vn'"] + } + mat `vmat'=`hold' + mat drop `hold' + foreach vn in `names' { + mat `hold'=nullmat(`hold') \ `vmat'["`vn'",1...] + } + mat `vmat'=`hold' +end + +program define cdsy, rclass + version 8.2 + syntax , type(string) k2(integer) nendog(integer) + +* type() can be ivbias5 (k2<=100, nendog<=3) +* ivbias10 (ditto) +* ivbias20 (ditto) +* ivbias30 (ditto) +* ivsize10 (k2<=100, nendog<=2) +* ivsize15 (ditto) +* ivsize20 (ditto) +* ivsize25 (ditto) +* fullrel5 (ditto) +* fullrel10 (ditto) +* fullrel20 (ditto) +* fullrel30 (ditto) +* fullmax5 (ditto) +* fullmax10 (ditto) +* fullmax20 (ditto) +* fullmax30 (ditto) +* limlsize10 (ditto) +* limlsize15 (ditto) +* limlsize20 (ditto) +* limlsize25 (ditto) + + tempname temp cv + +* Initialize critical value as MV + scalar `cv'=. + + if "`type'"=="ivbias5" { + matrix input `temp' = ( /* + */ . , . , . \ /* + */ . , . , . \ /* + */ 13.91 , . , . \ /* + */ 16.85 , 11.04 , . \ /* + */ 18.37 , 13.97 , 9.53 \ /* + */ 19.28 , 15.72 , 12.20 \ /* + */ 19.86 , 16.88 , 13.95 \ /* + */ 20.25 , 17.70 , 15.18 \ /* + */ 20.53 , 18.30 , 16.10 \ /* + */ 20.74 , 18.76 , 16.80 \ /* + */ 20.90 , 19.12 , 17.35 \ /* + */ 21.01 , 19.40 , 17.80 \ /* + */ 21.10 , 19.64 , 18.17 \ /* + */ 21.18 , 19.83 , 18.47 \ /* + */ 21.23 , 19.98 , 18.73 \ /* + */ 21.28 , 20.12 , 18.94 \ /* + */ 21.31 , 20.23 , 19.13 \ /* + */ 21.34 , 20.33 , 19.29 \ /* + */ 21.36 , 20.41 , 19.44 \ /* + */ 21.38 , 20.48 , 19.56 \ /* + */ 21.39 , 20.54 , 19.67 \ /* + */ 21.40 , 20.60 , 19.77 \ /* + */ 21.41 , 20.65 , 19.86 \ /* + */ 21.41 , 20.69 , 19.94 \ /* + */ 21.42 , 20.73 , 20.01 \ /* + */ 21.42 , 20.76 , 20.07 \ /* + */ 21.42 , 20.79 , 20.13 \ /* + */ 21.42 , 20.82 , 20.18 \ /* + */ 21.42 , 20.84 , 20.23 \ /* + */ 21.42 , 20.86 , 20.27 \ /* + */ 21.41 , 20.88 , 20.31 \ /* + */ 21.41 , 20.90 , 20.35 \ /* + */ 21.41 , 20.91 , 20.38 \ /* + */ 21.40 , 20.93 , 20.41 \ /* + */ 21.40 , 20.94 , 20.44 \ /* + */ 21.39 , 20.95 , 20.47 \ /* + */ 21.39 , 20.96 , 20.49 \ /* + */ 21.38 , 20.97 , 20.51 \ /* + */ 21.38 , 20.98 , 20.54 \ /* + */ 21.37 , 20.99 , 20.56 \ /* + */ 21.37 , 20.99 , 20.57 \ /* + */ 21.36 , 21.00 , 20.59 \ /* + */ 21.35 , 21.00 , 20.61 \ /* + */ 21.35 , 21.01 , 20.62 \ /* + */ 21.34 , 21.01 , 20.64 \ /* + */ 21.34 , 21.02 , 20.65 \ /* + */ 21.33 , 21.02 , 20.66 \ /* + */ 21.32 , 21.02 , 20.67 \ /* + */ 21.32 , 21.03 , 20.68 \ /* + */ 21.31 , 21.03 , 20.69 \ /* + */ 21.31 , 21.03 , 20.70 \ /* + */ 21.30 , 21.03 , 20.71 \ /* + */ 21.30 , 21.03 , 20.72 \ /* + */ 21.29 , 21.03 , 20.73 \ /* + */ 21.28 , 21.03 , 20.73 \ /* + */ 21.28 , 21.04 , 20.74 \ /* + */ 21.27 , 21.04 , 20.75 \ /* + */ 21.27 , 21.04 , 20.75 \ /* + */ 21.26 , 21.04 , 20.76 \ /* + */ 21.26 , 21.04 , 20.76 \ /* + */ 21.25 , 21.04 , 20.77 \ /* + */ 21.24 , 21.04 , 20.77 \ /* + */ 21.24 , 21.04 , 20.78 \ /* + */ 21.23 , 21.04 , 20.78 \ /* + */ 21.23 , 21.03 , 20.79 \ /* + */ 21.22 , 21.03 , 20.79 \ /* + */ 21.22 , 21.03 , 20.79 \ /* + */ 21.21 , 21.03 , 20.80 \ /* + */ 21.21 , 21.03 , 20.80 \ /* + */ 21.20 , 21.03 , 20.80 \ /* + */ 21.20 , 21.03 , 20.80 \ /* + */ 21.19 , 21.03 , 20.81 \ /* + */ 21.19 , 21.03 , 20.81 \ /* + */ 21.18 , 21.03 , 20.81 \ /* + */ 21.18 , 21.02 , 20.81 \ /* + */ 21.17 , 21.02 , 20.82 \ /* + */ 21.17 , 21.02 , 20.82 \ /* + */ 21.16 , 21.02 , 20.82 \ /* + */ 21.16 , 21.02 , 20.82 \ /* + */ 21.15 , 21.02 , 20.82 \ /* + */ 21.15 , 21.02 , 20.82 \ /* + */ 21.15 , 21.02 , 20.83 \ /* + */ 21.14 , 21.01 , 20.83 \ /* + */ 21.14 , 21.01 , 20.83 \ /* + */ 21.13 , 21.01 , 20.83 \ /* + */ 21.13 , 21.01 , 20.83 \ /* + */ 21.12 , 21.01 , 20.84 \ /* + */ 21.12 , 21.01 , 20.84 \ /* + */ 21.11 , 21.01 , 20.84 \ /* + */ 21.11 , 21.01 , 20.84 \ /* + */ 21.10 , 21.00 , 20.84 \ /* + */ 21.10 , 21.00 , 20.84 \ /* + */ 21.09 , 21.00 , 20.85 \ /* + */ 21.09 , 21.00 , 20.85 \ /* + */ 21.08 , 21.00 , 20.85 \ /* + */ 21.08 , 21.00 , 20.85 \ /* + */ 21.07 , 21.00 , 20.85 \ /* + */ 21.07 , 20.99 , 20.86 \ /* + */ 21.06 , 20.99 , 20.86 \ /* + */ 21.06 , 20.99 , 20.86 ) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + + + if "`type'"=="ivbias10" { + matrix input `temp' = /* + */ (.,.,. \ /* + */ .,.,. \ /* + */ 9.08,.,. \ /* + */ 10.27,7.56,. \ /* + */ 10.83,8.78,6.61 \ /* + */ 11.12,9.48,7.77 \ /* + */ 11.29,9.92,8.5 \ /* + */ 11.39,10.22,9.01 \ /* + */ 11.46,10.43,9.37 \ /* + */ 11.49,10.58,9.64 \ /* + */ 11.51,10.69,9.85 \ /* + */ 11.52,10.78,10.01 \ /* + */ 11.52,10.84,10.14 \ /* + */ 11.52,10.89,10.25 \ /* + */ 11.51,10.93,10.33 \ /* + */ 11.5,10.96,10.41 \ /* + */ 11.49,10.99,10.47 \ /* + */ 11.48,11,10.52 \ /* + */ 11.46,11.02,10.56 \ /* + */ 11.45,11.03,10.6 \ /* + */ 11.44,11.04,10.63 \ /* + */ 11.42,11.05,10.65 \ /* + */ 11.41,11.05,10.68 \ /* + */ 11.4,11.05,10.7 \ /* + */ 11.38,11.06,10.71 \ /* + */ 11.37,11.06,10.73 \ /* + */ 11.36,11.06,10.74 \ /* + */ 11.34,11.05,10.75 \ /* + */ 11.33,11.05,10.76 \ /* + */ 11.32,11.05,10.77 \ /* + */ 11.3,11.05,10.78 \ /* + */ 11.29,11.05,10.79 \ /* + */ 11.28,11.04,10.79 \ /* + */ 11.27,11.04,10.8 \ /* + */ 11.26,11.04,10.8 \ /* + */ 11.25,11.03,10.8 \ /* + */ 11.24,11.03,10.81 \ /* + */ 11.23,11.02,10.81 \ /* + */ 11.22,11.02,10.81 \ /* + */ 11.21,11.02,10.81 \ /* + */ 11.2,11.01,10.81 \ /* + */ 11.19,11.01,10.81 \ /* + */ 11.18,11,10.81 \ /* + */ 11.17,11,10.81 \ /* + */ 11.16,10.99,10.81 \ /* + */ 11.15,10.99,10.81 \ /* + */ 11.14,10.98,10.81 \ /* + */ 11.13,10.98,10.81 \ /* + */ 11.13,10.98,10.81 \ /* + */ 11.12,10.97,10.81 \ /* + */ 11.11,10.97,10.81 \ /* + */ 11.1,10.96,10.81 \ /* + */ 11.1,10.96,10.81 \ /* + */ 11.09,10.95,10.81 \ /* + */ 11.08,10.95,10.81 \ /* + */ 11.07,10.94,10.8 \ /* + */ 11.07,10.94,10.8 \ /* + */ 11.06,10.94,10.8 \ /* + */ 11.05,10.93,10.8 \ /* + */ 11.05,10.93,10.8 \ /* + */ 11.04,10.92,10.8 \ /* + */ 11.03,10.92,10.79 \ /* + */ 11.03,10.92,10.79 \ /* + */ 11.02,10.91,10.79 \ /* + */ 11.02,10.91,10.79 \ /* + */ 11.01,10.9,10.79 \ /* + */ 11,10.9,10.79 \ /* + */ 11,10.9,10.78 \ /* + */ 10.99,10.89,10.78 \ /* + */ 10.99,10.89,10.78 \ /* + */ 10.98,10.89,10.78 \ /* + */ 10.98,10.88,10.78 \ /* + */ 10.97,10.88,10.77 \ /* + */ 10.97,10.88,10.77 \ /* + */ 10.96,10.87,10.77 \ /* + */ 10.96,10.87,10.77 \ /* + */ 10.95,10.86,10.77 \ /* + */ 10.95,10.86,10.76 \ /* + */ 10.94,10.86,10.76 \ /* + */ 10.94,10.85,10.76 \ /* + */ 10.93,10.85,10.76 \ /* + */ 10.93,10.85,10.76 \ /* + */ 10.92,10.84,10.75 \ /* + */ 10.92,10.84,10.75 \ /* + */ 10.91,10.84,10.75 \ /* + */ 10.91,10.84,10.75 \ /* + */ 10.91,10.83,10.75 \ /* + */ 10.9,10.83,10.74 \ /* + */ 10.9,10.83,10.74 \ /* + */ 10.89,10.82,10.74 \ /* + */ 10.89,10.82,10.74 \ /* + */ 10.89,10.82,10.74 \ /* + */ 10.88,10.81,10.74 \ /* + */ 10.88,10.81,10.73 \ /* + */ 10.87,10.81,10.73 \ /* + */ 10.87,10.81,10.73 \ /* + */ 10.87,10.8,10.73 \ /* + */ 10.86,10.8,10.73 \ /* + */ 10.86,10.8,10.72 \ /* + */ 10.86,10.8,10.72) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + if "`type'"=="ivbias20" { + matrix input `temp' = ( /* + */ . , . , . \ /* + */ . , . , . \ /* + */ 6.46 , . , . \ /* + */ 6.71 , 5.57 , . \ /* + */ 6.77 , 5.91 , 4.99 \ /* + */ 6.76 , 6.08 , 5.35 \ /* + */ 6.73 , 6.16 , 5.56 \ /* + */ 6.69 , 6.20 , 5.69 \ /* + */ 6.65 , 6.22 , 5.78 \ /* + */ 6.61 , 6.23 , 5.83 \ /* + */ 6.56 , 6.23 , 5.87 \ /* + */ 6.53 , 6.22 , 5.90 \ /* + */ 6.49 , 6.21 , 5.92 \ /* + */ 6.45 , 6.20 , 5.93 \ /* + */ 6.42 , 6.19 , 5.94 \ /* + */ 6.39 , 6.17 , 5.94 \ /* + */ 6.36 , 6.16 , 5.94 \ /* + */ 6.33 , 6.14 , 5.94 \ /* + */ 6.31 , 6.13 , 5.94 \ /* + */ 6.28 , 6.11 , 5.93 \ /* + */ 6.26 , 6.10 , 5.93 \ /* + */ 6.24 , 6.08 , 5.92 \ /* + */ 6.22 , 6.07 , 5.92 \ /* + */ 6.20 , 6.06 , 5.91 \ /* + */ 6.18 , 6.05 , 5.90 \ /* + */ 6.16 , 6.03 , 5.90 \ /* + */ 6.14 , 6.02 , 5.89 \ /* + */ 6.13 , 6.01 , 5.88 \ /* + */ 6.11 , 6.00 , 5.88 \ /* + */ 6.09 , 5.99 , 5.87 \ /* + */ 6.08 , 5.98 , 5.87 \ /* + */ 6.07 , 5.97 , 5.86 \ /* + */ 6.05 , 5.96 , 5.85 \ /* + */ 6.04 , 5.95 , 5.85 \ /* + */ 6.03 , 5.94 , 5.84 \ /* + */ 6.01 , 5.93 , 5.83 \ /* + */ 6.00 , 5.92 , 5.83 \ /* + */ 5.99 , 5.91 , 5.82 \ /* + */ 5.98 , 5.90 , 5.82 \ /* + */ 5.97 , 5.89 , 5.81 \ /* + */ 5.96 , 5.89 , 5.80 \ /* + */ 5.95 , 5.88 , 5.80 \ /* + */ 5.94 , 5.87 , 5.79 \ /* + */ 5.93 , 5.86 , 5.79 \ /* + */ 5.92 , 5.86 , 5.78 \ /* + */ 5.91 , 5.85 , 5.78 \ /* + */ 5.91 , 5.84 , 5.77 \ /* + */ 5.90 , 5.83 , 5.77 \ /* + */ 5.89 , 5.83 , 5.76 \ /* + */ 5.88 , 5.82 , 5.76 \ /* + */ 5.87 , 5.82 , 5.75 \ /* + */ 5.87 , 5.81 , 5.75 \ /* + */ 5.86 , 5.80 , 5.74 \ /* + */ 5.85 , 5.80 , 5.74 \ /* + */ 5.85 , 5.79 , 5.73 \ /* + */ 5.84 , 5.79 , 5.73 \ /* + */ 5.83 , 5.78 , 5.72 \ /* + */ 5.83 , 5.78 , 5.72 \ /* + */ 5.82 , 5.77 , 5.72 \ /* + */ 5.81 , 5.77 , 5.71 \ /* + */ 5.81 , 5.76 , 5.71 \ /* + */ 5.80 , 5.76 , 5.70 \ /* + */ 5.80 , 5.75 , 5.70 \ /* + */ 5.79 , 5.75 , 5.70 \ /* + */ 5.78 , 5.74 , 5.69 \ /* + */ 5.78 , 5.74 , 5.69 \ /* + */ 5.77 , 5.73 , 5.68 \ /* + */ 5.77 , 5.73 , 5.68 \ /* + */ 5.76 , 5.72 , 5.68 \ /* + */ 5.76 , 5.72 , 5.67 \ /* + */ 5.75 , 5.72 , 5.67 \ /* + */ 5.75 , 5.71 , 5.67 \ /* + */ 5.75 , 5.71 , 5.66 \ /* + */ 5.74 , 5.70 , 5.66 \ /* + */ 5.74 , 5.70 , 5.66 \ /* + */ 5.73 , 5.70 , 5.65 \ /* + */ 5.73 , 5.69 , 5.65 \ /* + */ 5.72 , 5.69 , 5.65 \ /* + */ 5.72 , 5.68 , 5.65 \ /* + */ 5.71 , 5.68 , 5.64 \ /* + */ 5.71 , 5.68 , 5.64 \ /* + */ 5.71 , 5.67 , 5.64 \ /* + */ 5.70 , 5.67 , 5.63 \ /* + */ 5.70 , 5.67 , 5.63 \ /* + */ 5.70 , 5.66 , 5.63 \ /* + */ 5.69 , 5.66 , 5.62 \ /* + */ 5.69 , 5.66 , 5.62 \ /* + */ 5.68 , 5.65 , 5.62 \ /* + */ 5.68 , 5.65 , 5.62 \ /* + */ 5.68 , 5.65 , 5.61 \ /* + */ 5.67 , 5.65 , 5.61 \ /* + */ 5.67 , 5.64 , 5.61 \ /* + */ 5.67 , 5.64 , 5.61 \ /* + */ 5.66 , 5.64 , 5.60 \ /* + */ 5.66 , 5.63 , 5.60 \ /* + */ 5.66 , 5.63 , 5.60 \ /* + */ 5.65 , 5.63 , 5.60 \ /* + */ 5.65 , 5.63 , 5.59 \ /* + */ 5.65 , 5.62 , 5.59 \ /* + */ 5.65 , 5.62 , 5.59 ) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias30" { + matrix input `temp' = ( /* + */ . , . , . \ /* + */ . , . , . \ /* + */ 5.39 , . , . \ /* + */ 5.34 , 4.73 , . \ /* + */ 5.25 , 4.79 , 4.30 \ /* + */ 5.15 , 4.78 , 4.40 \ /* + */ 5.07 , 4.76 , 4.44 \ /* + */ 4.99 , 4.73 , 4.46 \ /* + */ 4.92 , 4.69 , 4.46 \ /* + */ 4.86 , 4.66 , 4.45 \ /* + */ 4.80 , 4.62 , 4.44 \ /* + */ 4.75 , 4.59 , 4.42 \ /* + */ 4.71 , 4.56 , 4.41 \ /* + */ 4.67 , 4.53 , 4.39 \ /* + */ 4.63 , 4.50 , 4.37 \ /* + */ 4.59 , 4.48 , 4.36 \ /* + */ 4.56 , 4.45 , 4.34 \ /* + */ 4.53 , 4.43 , 4.32 \ /* + */ 4.51 , 4.41 , 4.31 \ /* + */ 4.48 , 4.39 , 4.29 \ /* + */ 4.46 , 4.37 , 4.28 \ /* + */ 4.43 , 4.35 , 4.27 \ /* + */ 4.41 , 4.33 , 4.25 \ /* + */ 4.39 , 4.32 , 4.24 \ /* + */ 4.37 , 4.30 , 4.23 \ /* + */ 4.35 , 4.29 , 4.21 \ /* + */ 4.34 , 4.27 , 4.20 \ /* + */ 4.32 , 4.26 , 4.19 \ /* + */ 4.31 , 4.24 , 4.18 \ /* + */ 4.29 , 4.23 , 4.17 \ /* + */ 4.28 , 4.22 , 4.16 \ /* + */ 4.26 , 4.21 , 4.15 \ /* + */ 4.25 , 4.20 , 4.14 \ /* + */ 4.24 , 4.19 , 4.13 \ /* + */ 4.23 , 4.18 , 4.13 \ /* + */ 4.22 , 4.17 , 4.12 \ /* + */ 4.20 , 4.16 , 4.11 \ /* + */ 4.19 , 4.15 , 4.10 \ /* + */ 4.18 , 4.14 , 4.09 \ /* + */ 4.17 , 4.13 , 4.09 \ /* + */ 4.16 , 4.12 , 4.08 \ /* + */ 4.15 , 4.11 , 4.07 \ /* + */ 4.15 , 4.11 , 4.07 \ /* + */ 4.14 , 4.10 , 4.06 \ /* + */ 4.13 , 4.09 , 4.05 \ /* + */ 4.12 , 4.08 , 4.05 \ /* + */ 4.11 , 4.08 , 4.04 \ /* + */ 4.11 , 4.07 , 4.03 \ /* + */ 4.10 , 4.06 , 4.03 \ /* + */ 4.09 , 4.06 , 4.02 \ /* + */ 4.08 , 4.05 , 4.02 \ /* + */ 4.08 , 4.05 , 4.01 \ /* + */ 4.07 , 4.04 , 4.01 \ /* + */ 4.06 , 4.03 , 4.00 \ /* + */ 4.06 , 4.03 , 4.00 \ /* + */ 4.05 , 4.02 , 3.99 \ /* + */ 4.05 , 4.02 , 3.99 \ /* + */ 4.04 , 4.01 , 3.98 \ /* + */ 4.04 , 4.01 , 3.98 \ /* + */ 4.03 , 4.00 , 3.97 \ /* + */ 4.02 , 4.00 , 3.97 \ /* + */ 4.02 , 3.99 , 3.96 \ /* + */ 4.01 , 3.99 , 3.96 \ /* + */ 4.01 , 3.98 , 3.96 \ /* + */ 4.00 , 3.98 , 3.95 \ /* + */ 4.00 , 3.97 , 3.95 \ /* + */ 3.99 , 3.97 , 3.94 \ /* + */ 3.99 , 3.97 , 3.94 \ /* + */ 3.99 , 3.96 , 3.94 \ /* + */ 3.98 , 3.96 , 3.93 \ /* + */ 3.98 , 3.95 , 3.93 \ /* + */ 3.97 , 3.95 , 3.93 \ /* + */ 3.97 , 3.95 , 3.92 \ /* + */ 3.96 , 3.94 , 3.92 \ /* + */ 3.96 , 3.94 , 3.92 \ /* + */ 3.96 , 3.93 , 3.91 \ /* + */ 3.95 , 3.93 , 3.91 \ /* + */ 3.95 , 3.93 , 3.91 \ /* + */ 3.95 , 3.92 , 3.90 \ /* + */ 3.94 , 3.92 , 3.90 \ /* + */ 3.94 , 3.92 , 3.90 \ /* + */ 3.93 , 3.91 , 3.89 \ /* + */ 3.93 , 3.91 , 3.89 \ /* + */ 3.93 , 3.91 , 3.89 \ /* + */ 3.92 , 3.91 , 3.89 \ /* + */ 3.92 , 3.90 , 3.88 \ /* + */ 3.92 , 3.90 , 3.88 \ /* + */ 3.91 , 3.90 , 3.88 \ /* + */ 3.91 , 3.89 , 3.87 \ /* + */ 3.91 , 3.89 , 3.87 \ /* + */ 3.91 , 3.89 , 3.87 \ /* + */ 3.90 , 3.89 , 3.87 \ /* + */ 3.90 , 3.88 , 3.86 \ /* + */ 3.90 , 3.88 , 3.86 \ /* + */ 3.89 , 3.88 , 3.86 \ /* + */ 3.89 , 3.87 , 3.86 \ /* + */ 3.89 , 3.87 , 3.85 \ /* + */ 3.89 , 3.87 , 3.85 \ /* + */ 3.88 , 3.87 , 3.85 \ /* + */ 3.88 , 3.86 , 3.85 ) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + if "`type'"=="ivsize10" { + matrix input `temp' = /* + */ (16.38,. \ /* + */ 19.93,7.03 \ /* + */ 22.3,13.43 \ /* + */ 24.58,16.87 \ /* + */ 26.87,19.45 \ /* + */ 29.18,21.68 \ /* + */ 31.5,23.72 \ /* + */ 33.84,25.64 \ /* + */ 36.19,27.51 \ /* + */ 38.54,29.32 \ /* + */ 40.9,31.11 \ /* + */ 43.27,32.88 \ /* + */ 45.64,34.62 \ /* + */ 48.01,36.36 \ /* + */ 50.39,38.08 \ /* + */ 52.77,39.8 \ /* + */ 55.15,41.51 \ /* + */ 57.53,43.22 \ /* + */ 59.92,44.92 \ /* + */ 62.3,46.62 \ /* + */ 64.69,48.31 \ /* + */ 67.07,50.01 \ /* + */ 69.46,51.7 \ /* + */ 71.85,53.39 \ /* + */ 74.24,55.07 \ /* + */ 76.62,56.76 \ /* + */ 79.01,58.45 \ /* + */ 81.4,60.13 \ /* + */ 83.79,61.82 \ /* + */ 86.17,63.51 \ /* + */ 88.56,65.19 \ /* + */ 90.95,66.88 \ /* + */ 93.33,68.56 \ /* + */ 95.72,70.25 \ /* + */ 98.11,71.94 \ /* + */ 100.5,73.62 \ /* + */ 102.88,75.31 \ /* + */ 105.27,76.99 \ /* + */ 107.66,78.68 \ /* + */ 110.04,80.37 \ /* + */ 112.43,82.05 \ /* + */ 114.82,83.74 \ /* + */ 117.21,85.42 \ /* + */ 119.59,87.11 \ /* + */ 121.98,88.8 \ /* + */ 124.37,90.48 \ /* + */ 126.75,92.17 \ /* + */ 129.14,93.85 \ /* + */ 131.53,95.54 \ /* + */ 133.92,97.23 \ /* + */ 136.3,98.91 \ /* + */ 138.69,100.6 \ /* + */ 141.08,102.29 \ /* + */ 143.47,103.97 \ /* + */ 145.85,105.66 \ /* + */ 148.24,107.34 \ /* + */ 150.63,109.03 \ /* + */ 153.01,110.72 \ /* + */ 155.4,112.4 \ /* + */ 157.79,114.09 \ /* + */ 160.18,115.77 \ /* + */ 162.56,117.46 \ /* + */ 164.95,119.15 \ /* + */ 167.34,120.83 \ /* + */ 169.72,122.52 \ /* + */ 172.11,124.2 \ /* + */ 174.5,125.89 \ /* + */ 176.89,127.58 \ /* + */ 179.27,129.26 \ /* + */ 181.66,130.95 \ /* + */ 184.05,132.63 \ /* + */ 186.44,134.32 \ /* + */ 188.82,136.01 \ /* + */ 191.21,137.69 \ /* + */ 193.6,139.38 \ /* + */ 195.98,141.07 \ /* + */ 198.37,142.75 \ /* + */ 200.76,144.44 \ /* + */ 203.15,146.12 \ /* + */ 205.53,147.81 \ /* + */ 207.92,149.5 \ /* + */ 210.31,151.18 \ /* + */ 212.69,152.87 \ /* + */ 215.08,154.55 \ /* + */ 217.47,156.24 \ /* + */ 219.86,157.93 \ /* + */ 222.24,159.61 \ /* + */ 224.63,161.3 \ /* + */ 227.02,162.98 \ /* + */ 229.41,164.67 \ /* + */ 231.79,166.36 \ /* + */ 234.18,168.04 \ /* + */ 236.57,169.73 \ /* + */ 238.95,171.41 \ /* + */ 241.34,173.1 \ /* + */ 243.73,174.79 \ /* + */ 246.12,176.47 \ /* + */ 248.5,178.16 \ /* + */ 250.89,179.84 \ /* + */ 253.28,181.53) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize15" { + matrix input `temp' = ( /* + */ 8.96 , . \ /* + */ 11.59 , 4.58 \ /* + */ 12.83 , 8.18 \ /* + */ 13.96 , 9.93 \ /* + */ 15.09 , 11.22 \ /* + */ 16.23 , 12.33 \ /* + */ 17.38 , 13.34 \ /* + */ 18.54 , 14.31 \ /* + */ 19.71 , 15.24 \ /* + */ 20.88 , 16.16 \ /* + */ 22.06 , 17.06 \ /* + */ 23.24 , 17.95 \ /* + */ 24.42 , 18.84 \ /* + */ 25.61 , 19.72 \ /* + */ 26.80 , 20.60 \ /* + */ 27.99 , 21.48 \ /* + */ 29.19 , 22.35 \ /* + */ 30.38 , 23.22 \ /* + */ 31.58 , 24.09 \ /* + */ 32.77 , 24.96 \ /* + */ 33.97 , 25.82 \ /* + */ 35.17 , 26.69 \ /* + */ 36.37 , 27.56 \ /* + */ 37.57 , 28.42 \ /* + */ 38.77 , 29.29 \ /* + */ 39.97 , 30.15 \ /* + */ 41.17 , 31.02 \ /* + */ 42.37 , 31.88 \ /* + */ 43.57 , 32.74 \ /* + */ 44.78 , 33.61 \ /* + */ 45.98 , 34.47 \ /* + */ 47.18 , 35.33 \ /* + */ 48.38 , 36.19 \ /* + */ 49.59 , 37.06 \ /* + */ 50.79 , 37.92 \ /* + */ 51.99 , 38.78 \ /* + */ 53.19 , 39.64 \ /* + */ 54.40 , 40.50 \ /* + */ 55.60 , 41.37 \ /* + */ 56.80 , 42.23 \ /* + */ 58.01 , 43.09 \ /* + */ 59.21 , 43.95 \ /* + */ 60.41 , 44.81 \ /* + */ 61.61 , 45.68 \ /* + */ 62.82 , 46.54 \ /* + */ 64.02 , 47.40 \ /* + */ 65.22 , 48.26 \ /* + */ 66.42 , 49.12 \ /* + */ 67.63 , 49.99 \ /* + */ 68.83 , 50.85 \ /* + */ 70.03 , 51.71 \ /* + */ 71.24 , 52.57 \ /* + */ 72.44 , 53.43 \ /* + */ 73.64 , 54.30 \ /* + */ 74.84 , 55.16 \ /* + */ 76.05 , 56.02 \ /* + */ 77.25 , 56.88 \ /* + */ 78.45 , 57.74 \ /* + */ 79.66 , 58.61 \ /* + */ 80.86 , 59.47 \ /* + */ 82.06 , 60.33 \ /* + */ 83.26 , 61.19 \ /* + */ 84.47 , 62.05 \ /* + */ 85.67 , 62.92 \ /* + */ 86.87 , 63.78 \ /* + */ 88.07 , 64.64 \ /* + */ 89.28 , 65.50 \ /* + */ 90.48 , 66.36 \ /* + */ 91.68 , 67.22 \ /* + */ 92.89 , 68.09 \ /* + */ 94.09 , 68.95 \ /* + */ 95.29 , 69.81 \ /* + */ 96.49 , 70.67 \ /* + */ 97.70 , 71.53 \ /* + */ 98.90 , 72.40 \ /* + */ 100.10 , 73.26 \ /* + */ 101.30 , 74.12 \ /* + */ 102.51 , 74.98 \ /* + */ 103.71 , 75.84 \ /* + */ 104.91 , 76.71 \ /* + */ 106.12 , 77.57 \ /* + */ 107.32 , 78.43 \ /* + */ 108.52 , 79.29 \ /* + */ 109.72 , 80.15 \ /* + */ 110.93 , 81.02 \ /* + */ 112.13 , 81.88 \ /* + */ 113.33 , 82.74 \ /* + */ 114.53 , 83.60 \ /* + */ 115.74 , 84.46 \ /* + */ 116.94 , 85.33 \ /* + */ 118.14 , 86.19 \ /* + */ 119.35 , 87.05 \ /* + */ 120.55 , 87.91 \ /* + */ 121.75 , 88.77 \ /* + */ 122.95 , 89.64 \ /* + */ 124.16 , 90.50 \ /* + */ 125.36 , 91.36 \ /* + */ 126.56 , 92.22 \ /* + */ 127.76 , 93.08 \ /* + */ 128.97 , 93.95 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize20" { + matrix input `temp' = ( /* + */ 6.66 , . \ /* + */ 8.75 , 3.95 \ /* + */ 9.54 , 6.40 \ /* + */ 10.26 , 7.54 \ /* + */ 10.98 , 8.38 \ /* + */ 11.72 , 9.10 \ /* + */ 12.48 , 9.77 \ /* + */ 13.24 , 10.41 \ /* + */ 14.01 , 11.03 \ /* + */ 14.78 , 11.65 \ /* + */ 15.56 , 12.25 \ /* + */ 16.35 , 12.86 \ /* + */ 17.14 , 13.45 \ /* + */ 17.93 , 14.05 \ /* + */ 18.72 , 14.65 \ /* + */ 19.51 , 15.24 \ /* + */ 20.31 , 15.83 \ /* + */ 21.10 , 16.42 \ /* + */ 21.90 , 17.02 \ /* + */ 22.70 , 17.61 \ /* + */ 23.50 , 18.20 \ /* + */ 24.30 , 18.79 \ /* + */ 25.10 , 19.38 \ /* + */ 25.90 , 19.97 \ /* + */ 26.71 , 20.56 \ /* + */ 27.51 , 21.15 \ /* + */ 28.31 , 21.74 \ /* + */ 29.12 , 22.33 \ /* + */ 29.92 , 22.92 \ /* + */ 30.72 , 23.51 \ /* + */ 31.53 , 24.10 \ /* + */ 32.33 , 24.69 \ /* + */ 33.14 , 25.28 \ /* + */ 33.94 , 25.87 \ /* + */ 34.75 , 26.46 \ /* + */ 35.55 , 27.05 \ /* + */ 36.36 , 27.64 \ /* + */ 37.17 , 28.23 \ /* + */ 37.97 , 28.82 \ /* + */ 38.78 , 29.41 \ /* + */ 39.58 , 30.00 \ /* + */ 40.39 , 30.59 \ /* + */ 41.20 , 31.18 \ /* + */ 42.00 , 31.77 \ /* + */ 42.81 , 32.36 \ /* + */ 43.62 , 32.95 \ /* + */ 44.42 , 33.54 \ /* + */ 45.23 , 34.13 \ /* + */ 46.03 , 34.72 \ /* + */ 46.84 , 35.31 \ /* + */ 47.65 , 35.90 \ /* + */ 48.45 , 36.49 \ /* + */ 49.26 , 37.08 \ /* + */ 50.06 , 37.67 \ /* + */ 50.87 , 38.26 \ /* + */ 51.68 , 38.85 \ /* + */ 52.48 , 39.44 \ /* + */ 53.29 , 40.02 \ /* + */ 54.09 , 40.61 \ /* + */ 54.90 , 41.20 \ /* + */ 55.71 , 41.79 \ /* + */ 56.51 , 42.38 \ /* + */ 57.32 , 42.97 \ /* + */ 58.13 , 43.56 \ /* + */ 58.93 , 44.15 \ /* + */ 59.74 , 44.74 \ /* + */ 60.54 , 45.33 \ /* + */ 61.35 , 45.92 \ /* + */ 62.16 , 46.51 \ /* + */ 62.96 , 47.10 \ /* + */ 63.77 , 47.69 \ /* + */ 64.57 , 48.28 \ /* + */ 65.38 , 48.87 \ /* + */ 66.19 , 49.46 \ /* + */ 66.99 , 50.05 \ /* + */ 67.80 , 50.64 \ /* + */ 68.60 , 51.23 \ /* + */ 69.41 , 51.82 \ /* + */ 70.22 , 52.41 \ /* + */ 71.02 , 53.00 \ /* + */ 71.83 , 53.59 \ /* + */ 72.64 , 54.18 \ /* + */ 73.44 , 54.77 \ /* + */ 74.25 , 55.36 \ /* + */ 75.05 , 55.95 \ /* + */ 75.86 , 56.54 \ /* + */ 76.67 , 57.13 \ /* + */ 77.47 , 57.72 \ /* + */ 78.28 , 58.31 \ /* + */ 79.08 , 58.90 \ /* + */ 79.89 , 59.49 \ /* + */ 80.70 , 60.08 \ /* + */ 81.50 , 60.67 \ /* + */ 82.31 , 61.26 \ /* + */ 83.12 , 61.85 \ /* + */ 83.92 , 62.44 \ /* + */ 84.73 , 63.03 \ /* + */ 85.53 , 63.62 \ /* + */ 86.34 , 64.21 \ /* + */ 87.15 , 64.80 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize25" { + matrix input `temp' = ( /* + */ 5.53 , . \ /* + */ 7.25 , 3.63 \ /* + */ 7.80 , 5.45 \ /* + */ 8.31 , 6.28 \ /* + */ 8.84 , 6.89 \ /* + */ 9.38 , 7.42 \ /* + */ 9.93 , 7.91 \ /* + */ 10.50 , 8.39 \ /* + */ 11.07 , 8.85 \ /* + */ 11.65 , 9.31 \ /* + */ 12.23 , 9.77 \ /* + */ 12.82 , 10.22 \ /* + */ 13.41 , 10.68 \ /* + */ 14.00 , 11.13 \ /* + */ 14.60 , 11.58 \ /* + */ 15.19 , 12.03 \ /* + */ 15.79 , 12.49 \ /* + */ 16.39 , 12.94 \ /* + */ 16.99 , 13.39 \ /* + */ 17.60 , 13.84 \ /* + */ 18.20 , 14.29 \ /* + */ 18.80 , 14.74 \ /* + */ 19.41 , 15.19 \ /* + */ 20.01 , 15.64 \ /* + */ 20.61 , 16.10 \ /* + */ 21.22 , 16.55 \ /* + */ 21.83 , 17.00 \ /* + */ 22.43 , 17.45 \ /* + */ 23.04 , 17.90 \ /* + */ 23.65 , 18.35 \ /* + */ 24.25 , 18.81 \ /* + */ 24.86 , 19.26 \ /* + */ 25.47 , 19.71 \ /* + */ 26.08 , 20.16 \ /* + */ 26.68 , 20.61 \ /* + */ 27.29 , 21.06 \ /* + */ 27.90 , 21.52 \ /* + */ 28.51 , 21.97 \ /* + */ 29.12 , 22.42 \ /* + */ 29.73 , 22.87 \ /* + */ 30.33 , 23.32 \ /* + */ 30.94 , 23.78 \ /* + */ 31.55 , 24.23 \ /* + */ 32.16 , 24.68 \ /* + */ 32.77 , 25.13 \ /* + */ 33.38 , 25.58 \ /* + */ 33.99 , 26.04 \ /* + */ 34.60 , 26.49 \ /* + */ 35.21 , 26.94 \ /* + */ 35.82 , 27.39 \ /* + */ 36.43 , 27.85 \ /* + */ 37.04 , 28.30 \ /* + */ 37.65 , 28.75 \ /* + */ 38.25 , 29.20 \ /* + */ 38.86 , 29.66 \ /* + */ 39.47 , 30.11 \ /* + */ 40.08 , 30.56 \ /* + */ 40.69 , 31.01 \ /* + */ 41.30 , 31.47 \ /* + */ 41.91 , 31.92 \ /* + */ 42.52 , 32.37 \ /* + */ 43.13 , 32.82 \ /* + */ 43.74 , 33.27 \ /* + */ 44.35 , 33.73 \ /* + */ 44.96 , 34.18 \ /* + */ 45.57 , 34.63 \ /* + */ 46.18 , 35.08 \ /* + */ 46.78 , 35.54 \ /* + */ 47.39 , 35.99 \ /* + */ 48.00 , 36.44 \ /* + */ 48.61 , 36.89 \ /* + */ 49.22 , 37.35 \ /* + */ 49.83 , 37.80 \ /* + */ 50.44 , 38.25 \ /* + */ 51.05 , 38.70 \ /* + */ 51.66 , 39.16 \ /* + */ 52.27 , 39.61 \ /* + */ 52.88 , 40.06 \ /* + */ 53.49 , 40.51 \ /* + */ 54.10 , 40.96 \ /* + */ 54.71 , 41.42 \ /* + */ 55.32 , 41.87 \ /* + */ 55.92 , 42.32 \ /* + */ 56.53 , 42.77 \ /* + */ 57.14 , 43.23 \ /* + */ 57.75 , 43.68 \ /* + */ 58.36 , 44.13 \ /* + */ 58.97 , 44.58 \ /* + */ 59.58 , 45.04 \ /* + */ 60.19 , 45.49 \ /* + */ 60.80 , 45.94 \ /* + */ 61.41 , 46.39 \ /* + */ 62.02 , 46.85 \ /* + */ 62.63 , 47.30 \ /* + */ 63.24 , 47.75 \ /* + */ 63.85 , 48.20 \ /* + */ 64.45 , 48.65 \ /* + */ 65.06 , 49.11 \ /* + */ 65.67 , 49.56 \ /* + */ 66.28 , 50.01 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel5" { + matrix input `temp' = ( /* + */ 24.09 , . \ /* + */ 13.46 , 15.50 \ /* + */ 9.61 , 10.83 \ /* + */ 7.63 , 8.53 \ /* + */ 6.42 , 7.16 \ /* + */ 5.61 , 6.24 \ /* + */ 5.02 , 5.59 \ /* + */ 4.58 , 5.10 \ /* + */ 4.23 , 4.71 \ /* + */ 3.96 , 4.41 \ /* + */ 3.73 , 4.15 \ /* + */ 3.54 , 3.94 \ /* + */ 3.38 , 3.76 \ /* + */ 3.24 , 3.60 \ /* + */ 3.12 , 3.47 \ /* + */ 3.01 , 3.35 \ /* + */ 2.92 , 3.24 \ /* + */ 2.84 , 3.15 \ /* + */ 2.76 , 3.06 \ /* + */ 2.69 , 2.98 \ /* + */ 2.63 , 2.91 \ /* + */ 2.58 , 2.85 \ /* + */ 2.52 , 2.79 \ /* + */ 2.48 , 2.73 \ /* + */ 2.43 , 2.68 \ /* + */ 2.39 , 2.63 \ /* + */ 2.36 , 2.59 \ /* + */ 2.32 , 2.55 \ /* + */ 2.29 , 2.51 \ /* + */ 2.26 , 2.47 \ /* + */ 2.23 , 2.44 \ /* + */ 2.20 , 2.41 \ /* + */ 2.18 , 2.37 \ /* + */ 2.16 , 2.35 \ /* + */ 2.13 , 2.32 \ /* + */ 2.11 , 2.29 \ /* + */ 2.09 , 2.27 \ /* + */ 2.07 , 2.24 \ /* + */ 2.05 , 2.22 \ /* + */ 2.04 , 2.20 \ /* + */ 2.02 , 2.18 \ /* + */ 2.00 , 2.16 \ /* + */ 1.99 , 2.14 \ /* + */ 1.97 , 2.12 \ /* + */ 1.96 , 2.10 \ /* + */ 1.94 , 2.09 \ /* + */ 1.93 , 2.07 \ /* + */ 1.92 , 2.05 \ /* + */ 1.91 , 2.04 \ /* + */ 1.89 , 2.02 \ /* + */ 1.88 , 2.01 \ /* + */ 1.87 , 2.00 \ /* + */ 1.86 , 1.98 \ /* + */ 1.85 , 1.97 \ /* + */ 1.84 , 1.96 \ /* + */ 1.83 , 1.95 \ /* + */ 1.82 , 1.94 \ /* + */ 1.81 , 1.92 \ /* + */ 1.80 , 1.91 \ /* + */ 1.79 , 1.90 \ /* + */ 1.79 , 1.89 \ /* + */ 1.78 , 1.88 \ /* + */ 1.77 , 1.87 \ /* + */ 1.76 , 1.87 \ /* + */ 1.75 , 1.86 \ /* + */ 1.75 , 1.85 \ /* + */ 1.74 , 1.84 \ /* + */ 1.73 , 1.83 \ /* + */ 1.72 , 1.83 \ /* + */ 1.72 , 1.82 \ /* + */ 1.71 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.79 \ /* + */ 1.68 , 1.79 \ /* + */ 1.68 , 1.78 \ /* + */ 1.67 , 1.77 \ /* + */ 1.67 , 1.77 \ /* + */ 1.66 , 1.76 \ /* + */ 1.65 , 1.76 \ /* + */ 1.65 , 1.75 \ /* + */ 1.64 , 1.75 \ /* + */ 1.64 , 1.74 \ /* + */ 1.63 , 1.74 \ /* + */ 1.63 , 1.73 \ /* + */ 1.62 , 1.73 \ /* + */ 1.61 , 1.73 \ /* + */ 1.61 , 1.72 \ /* + */ 1.60 , 1.72 \ /* + */ 1.60 , 1.71 \ /* + */ 1.59 , 1.71 \ /* + */ 1.59 , 1.71 \ /* + */ 1.58 , 1.71 \ /* + */ 1.58 , 1.70 \ /* + */ 1.57 , 1.70 \ /* + */ 1.57 , 1.70 \ /* + */ 1.56 , 1.69 \ /* + */ 1.56 , 1.69 \ /* + */ 1.55 , 1.69 \ /* + */ 1.55 , 1.69 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel10" { + matrix input `temp' = ( /* + */ 19.36 , . \ /* + */ 10.89 , 12.55 \ /* + */ 7.90 , 8.96 \ /* + */ 6.37 , 7.15 \ /* + */ 5.44 , 6.07 \ /* + */ 4.81 , 5.34 \ /* + */ 4.35 , 4.82 \ /* + */ 4.01 , 4.43 \ /* + */ 3.74 , 4.12 \ /* + */ 3.52 , 3.87 \ /* + */ 3.34 , 3.67 \ /* + */ 3.19 , 3.49 \ /* + */ 3.06 , 3.35 \ /* + */ 2.95 , 3.22 \ /* + */ 2.85 , 3.11 \ /* + */ 2.76 , 3.01 \ /* + */ 2.69 , 2.92 \ /* + */ 2.62 , 2.84 \ /* + */ 2.56 , 2.77 \ /* + */ 2.50 , 2.71 \ /* + */ 2.45 , 2.65 \ /* + */ 2.40 , 2.60 \ /* + */ 2.36 , 2.55 \ /* + */ 2.32 , 2.50 \ /* + */ 2.28 , 2.46 \ /* + */ 2.24 , 2.42 \ /* + */ 2.21 , 2.38 \ /* + */ 2.18 , 2.35 \ /* + */ 2.15 , 2.31 \ /* + */ 2.12 , 2.28 \ /* + */ 2.10 , 2.25 \ /* + */ 2.07 , 2.23 \ /* + */ 2.05 , 2.20 \ /* + */ 2.03 , 2.17 \ /* + */ 2.01 , 2.15 \ /* + */ 1.99 , 2.13 \ /* + */ 1.97 , 2.11 \ /* + */ 1.95 , 2.09 \ /* + */ 1.93 , 2.07 \ /* + */ 1.92 , 2.05 \ /* + */ 1.90 , 2.03 \ /* + */ 1.88 , 2.01 \ /* + */ 1.87 , 2.00 \ /* + */ 1.86 , 1.98 \ /* + */ 1.84 , 1.96 \ /* + */ 1.83 , 1.95 \ /* + */ 1.82 , 1.93 \ /* + */ 1.81 , 1.92 \ /* + */ 1.79 , 1.91 \ /* + */ 1.78 , 1.89 \ /* + */ 1.77 , 1.88 \ /* + */ 1.76 , 1.87 \ /* + */ 1.75 , 1.86 \ /* + */ 1.74 , 1.85 \ /* + */ 1.73 , 1.84 \ /* + */ 1.72 , 1.83 \ /* + */ 1.71 , 1.82 \ /* + */ 1.70 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.79 \ /* + */ 1.68 , 1.78 \ /* + */ 1.67 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.65 , 1.75 \ /* + */ 1.64 , 1.74 \ /* + */ 1.64 , 1.73 \ /* + */ 1.63 , 1.72 \ /* + */ 1.63 , 1.72 \ /* + */ 1.62 , 1.71 \ /* + */ 1.61 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.60 , 1.69 \ /* + */ 1.60 , 1.68 \ /* + */ 1.59 , 1.68 \ /* + */ 1.59 , 1.67 \ /* + */ 1.58 , 1.67 \ /* + */ 1.58 , 1.66 \ /* + */ 1.57 , 1.66 \ /* + */ 1.57 , 1.65 \ /* + */ 1.56 , 1.65 \ /* + */ 1.56 , 1.64 \ /* + */ 1.56 , 1.64 \ /* + */ 1.55 , 1.63 \ /* + */ 1.55 , 1.63 \ /* + */ 1.54 , 1.62 \ /* + */ 1.54 , 1.62 \ /* + */ 1.54 , 1.62 \ /* + */ 1.53 , 1.61 \ /* + */ 1.53 , 1.61 \ /* + */ 1.53 , 1.61 \ /* + */ 1.52 , 1.60 \ /* + */ 1.52 , 1.60 \ /* + */ 1.52 , 1.60 \ /* + */ 1.52 , 1.59 \ /* + */ 1.51 , 1.59 \ /* + */ 1.51 , 1.59 \ /* + */ 1.51 , 1.59 \ /* + */ 1.51 , 1.58 \ /* + */ 1.50 , 1.58 ) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel20" { + matrix input `temp' = ( /* + */ 15.64 , . \ /* + */ 9.00 , 9.72 \ /* + */ 6.61 , 7.18 \ /* + */ 5.38 , 5.85 \ /* + */ 4.62 , 5.04 \ /* + */ 4.11 , 4.48 \ /* + */ 3.75 , 4.08 \ /* + */ 3.47 , 3.77 \ /* + */ 3.25 , 3.53 \ /* + */ 3.07 , 3.33 \ /* + */ 2.92 , 3.17 \ /* + */ 2.80 , 3.04 \ /* + */ 2.70 , 2.92 \ /* + */ 2.61 , 2.82 \ /* + */ 2.53 , 2.73 \ /* + */ 2.46 , 2.65 \ /* + */ 2.39 , 2.58 \ /* + */ 2.34 , 2.52 \ /* + */ 2.29 , 2.46 \ /* + */ 2.24 , 2.41 \ /* + */ 2.20 , 2.36 \ /* + */ 2.16 , 2.32 \ /* + */ 2.13 , 2.28 \ /* + */ 2.10 , 2.24 \ /* + */ 2.06 , 2.21 \ /* + */ 2.04 , 2.18 \ /* + */ 2.01 , 2.15 \ /* + */ 1.99 , 2.12 \ /* + */ 1.96 , 2.09 \ /* + */ 1.94 , 2.07 \ /* + */ 1.92 , 2.04 \ /* + */ 1.90 , 2.02 \ /* + */ 1.88 , 2.00 \ /* + */ 1.87 , 1.98 \ /* + */ 1.85 , 1.96 \ /* + */ 1.83 , 1.94 \ /* + */ 1.82 , 1.93 \ /* + */ 1.80 , 1.91 \ /* + */ 1.79 , 1.89 \ /* + */ 1.78 , 1.88 \ /* + */ 1.76 , 1.86 \ /* + */ 1.75 , 1.85 \ /* + */ 1.74 , 1.84 \ /* + */ 1.73 , 1.82 \ /* + */ 1.72 , 1.81 \ /* + */ 1.71 , 1.80 \ /* + */ 1.70 , 1.79 \ /* + */ 1.69 , 1.78 \ /* + */ 1.68 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.65 , 1.74 \ /* + */ 1.65 , 1.73 \ /* + */ 1.64 , 1.72 \ /* + */ 1.63 , 1.71 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.68 \ /* + */ 1.60 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.56 , 1.62 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.54 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.44 , 1.50 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 ) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel30" { + matrix input `temp' = ( /* + */ 12.71 , . \ /* + */ 7.49 , 8.03 \ /* + */ 5.60 , 6.15 \ /* + */ 4.63 , 5.10 \ /* + */ 4.03 , 4.44 \ /* + */ 3.63 , 3.98 \ /* + */ 3.33 , 3.65 \ /* + */ 3.11 , 3.39 \ /* + */ 2.93 , 3.19 \ /* + */ 2.79 , 3.02 \ /* + */ 2.67 , 2.88 \ /* + */ 2.57 , 2.77 \ /* + */ 2.48 , 2.67 \ /* + */ 2.41 , 2.58 \ /* + */ 2.34 , 2.51 \ /* + */ 2.28 , 2.44 \ /* + */ 2.23 , 2.38 \ /* + */ 2.18 , 2.33 \ /* + */ 2.14 , 2.28 \ /* + */ 2.10 , 2.23 \ /* + */ 2.07 , 2.19 \ /* + */ 2.04 , 2.16 \ /* + */ 2.01 , 2.12 \ /* + */ 1.98 , 2.09 \ /* + */ 1.95 , 2.06 \ /* + */ 1.93 , 2.03 \ /* + */ 1.90 , 2.01 \ /* + */ 1.88 , 1.98 \ /* + */ 1.86 , 1.96 \ /* + */ 1.84 , 1.94 \ /* + */ 1.83 , 1.92 \ /* + */ 1.81 , 1.90 \ /* + */ 1.79 , 1.88 \ /* + */ 1.78 , 1.87 \ /* + */ 1.76 , 1.85 \ /* + */ 1.75 , 1.83 \ /* + */ 1.74 , 1.82 \ /* + */ 1.72 , 1.80 \ /* + */ 1.71 , 1.79 \ /* + */ 1.70 , 1.78 \ /* + */ 1.69 , 1.77 \ /* + */ 1.68 , 1.75 \ /* + */ 1.67 , 1.74 \ /* + */ 1.66 , 1.73 \ /* + */ 1.65 , 1.72 \ /* + */ 1.64 , 1.71 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.60 , 1.66 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.47 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.42 , 1.47 \ /* + */ 1.42 , 1.47 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.41 , 1.46 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax5" { + matrix input `temp' = ( /* + */ 23.81 , . \ /* + */ 12.38 , 14.19 \ /* + */ 8.66 , 10.00 \ /* + */ 6.81 , 7.88 \ /* + */ 5.71 , 6.60 \ /* + */ 4.98 , 5.74 \ /* + */ 4.45 , 5.13 \ /* + */ 4.06 , 4.66 \ /* + */ 3.76 , 4.30 \ /* + */ 3.51 , 4.01 \ /* + */ 3.31 , 3.77 \ /* + */ 3.15 , 3.57 \ /* + */ 3.00 , 3.41 \ /* + */ 2.88 , 3.26 \ /* + */ 2.78 , 3.13 \ /* + */ 2.69 , 3.02 \ /* + */ 2.61 , 2.92 \ /* + */ 2.53 , 2.84 \ /* + */ 2.47 , 2.76 \ /* + */ 2.41 , 2.69 \ /* + */ 2.36 , 2.62 \ /* + */ 2.31 , 2.56 \ /* + */ 2.27 , 2.51 \ /* + */ 2.23 , 2.46 \ /* + */ 2.19 , 2.42 \ /* + */ 2.15 , 2.37 \ /* + */ 2.12 , 2.33 \ /* + */ 2.09 , 2.30 \ /* + */ 2.07 , 2.26 \ /* + */ 2.04 , 2.23 \ /* + */ 2.02 , 2.20 \ /* + */ 1.99 , 2.17 \ /* + */ 1.97 , 2.14 \ /* + */ 1.95 , 2.12 \ /* + */ 1.93 , 2.10 \ /* + */ 1.91 , 2.07 \ /* + */ 1.90 , 2.05 \ /* + */ 1.88 , 2.03 \ /* + */ 1.87 , 2.01 \ /* + */ 1.85 , 1.99 \ /* + */ 1.84 , 1.98 \ /* + */ 1.82 , 1.96 \ /* + */ 1.81 , 1.94 \ /* + */ 1.80 , 1.93 \ /* + */ 1.79 , 1.91 \ /* + */ 1.78 , 1.90 \ /* + */ 1.76 , 1.88 \ /* + */ 1.75 , 1.87 \ /* + */ 1.74 , 1.86 \ /* + */ 1.73 , 1.85 \ /* + */ 1.73 , 1.83 \ /* + */ 1.72 , 1.82 \ /* + */ 1.71 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.79 \ /* + */ 1.68 , 1.78 \ /* + */ 1.68 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.65 , 1.74 \ /* + */ 1.65 , 1.74 \ /* + */ 1.64 , 1.73 \ /* + */ 1.63 , 1.72 \ /* + */ 1.63 , 1.71 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.70 \ /* + */ 1.61 , 1.69 \ /* + */ 1.60 , 1.68 \ /* + */ 1.60 , 1.68 \ /* + */ 1.59 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.64 \ /* + */ 1.56 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.62 \ /* + */ 1.54 , 1.61 \ /* + */ 1.54 , 1.61 \ /* + */ 1.53 , 1.60 \ /* + */ 1.53 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.50 , 1.57 \ /* + */ 1.50 , 1.57 \ /* + */ 1.50 , 1.56 \ /* + */ 1.49 , 1.56 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.48 , 1.55 \ /* + */ 1.48 , 1.54 \ /* + */ 1.47 , 1.54 \ /* + */ 1.47 , 1.54 \ /* + */ 1.47 , 1.53 \ /* + */ 1.46 , 1.53 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax10" { + matrix input `temp' = ( /* + */ 19.40 , . \ /* + */ 10.14 , 11.92 \ /* + */ 7.18 , 8.39 \ /* + */ 5.72 , 6.64 \ /* + */ 4.85 , 5.60 \ /* + */ 4.27 , 4.90 \ /* + */ 3.86 , 4.40 \ /* + */ 3.55 , 4.03 \ /* + */ 3.31 , 3.73 \ /* + */ 3.12 , 3.50 \ /* + */ 2.96 , 3.31 \ /* + */ 2.83 , 3.15 \ /* + */ 2.71 , 3.01 \ /* + */ 2.62 , 2.89 \ /* + */ 2.53 , 2.79 \ /* + */ 2.46 , 2.70 \ /* + */ 2.39 , 2.62 \ /* + */ 2.33 , 2.55 \ /* + */ 2.28 , 2.49 \ /* + */ 2.23 , 2.43 \ /* + */ 2.19 , 2.38 \ /* + */ 2.15 , 2.33 \ /* + */ 2.11 , 2.29 \ /* + */ 2.08 , 2.25 \ /* + */ 2.05 , 2.21 \ /* + */ 2.02 , 2.18 \ /* + */ 1.99 , 2.14 \ /* + */ 1.97 , 2.11 \ /* + */ 1.94 , 2.08 \ /* + */ 1.92 , 2.06 \ /* + */ 1.90 , 2.03 \ /* + */ 1.88 , 2.01 \ /* + */ 1.86 , 1.99 \ /* + */ 1.85 , 1.97 \ /* + */ 1.83 , 1.95 \ /* + */ 1.81 , 1.93 \ /* + */ 1.80 , 1.91 \ /* + */ 1.79 , 1.89 \ /* + */ 1.77 , 1.88 \ /* + */ 1.76 , 1.86 \ /* + */ 1.75 , 1.85 \ /* + */ 1.74 , 1.83 \ /* + */ 1.72 , 1.82 \ /* + */ 1.71 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.78 \ /* + */ 1.68 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.66 , 1.74 \ /* + */ 1.65 , 1.73 \ /* + */ 1.64 , 1.72 \ /* + */ 1.63 , 1.71 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.69 \ /* + */ 1.60 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.53 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.44 , 1.50 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.42 , 1.48 \ /* + */ 1.42 , 1.47 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax20" { + matrix input `temp' = ( /* + */ 15.39 , . \ /* + */ 8.16 , 9.41 \ /* + */ 5.87 , 6.79 \ /* + */ 4.75 , 5.47 \ /* + */ 4.08 , 4.66 \ /* + */ 3.64 , 4.13 \ /* + */ 3.32 , 3.74 \ /* + */ 3.08 , 3.45 \ /* + */ 2.89 , 3.22 \ /* + */ 2.74 , 3.03 \ /* + */ 2.62 , 2.88 \ /* + */ 2.51 , 2.76 \ /* + */ 2.42 , 2.65 \ /* + */ 2.35 , 2.56 \ /* + */ 2.28 , 2.48 \ /* + */ 2.22 , 2.40 \ /* + */ 2.17 , 2.34 \ /* + */ 2.12 , 2.28 \ /* + */ 2.08 , 2.23 \ /* + */ 2.04 , 2.19 \ /* + */ 2.01 , 2.15 \ /* + */ 1.98 , 2.11 \ /* + */ 1.95 , 2.07 \ /* + */ 1.92 , 2.04 \ /* + */ 1.89 , 2.01 \ /* + */ 1.87 , 1.98 \ /* + */ 1.85 , 1.96 \ /* + */ 1.83 , 1.93 \ /* + */ 1.81 , 1.91 \ /* + */ 1.79 , 1.89 \ /* + */ 1.77 , 1.87 \ /* + */ 1.76 , 1.85 \ /* + */ 1.74 , 1.83 \ /* + */ 1.73 , 1.82 \ /* + */ 1.72 , 1.80 \ /* + */ 1.70 , 1.79 \ /* + */ 1.69 , 1.77 \ /* + */ 1.68 , 1.76 \ /* + */ 1.67 , 1.74 \ /* + */ 1.66 , 1.73 \ /* + */ 1.65 , 1.72 \ /* + */ 1.64 , 1.71 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.58 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.62 \ /* + */ 1.56 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.54 , 1.59 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.52 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.47 , 1.52 \ /* + */ 1.47 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.48 \ /* + */ 1.44 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.41 \ /* + */ 1.37 , 1.41 \ /* + */ 1.37 , 1.41 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax30" { + matrix input `temp' = ( /* + */ 12.76 , . \ /* + */ 6.97 , 8.01 \ /* + */ 5.11 , 5.88 \ /* + */ 4.19 , 4.78 \ /* + */ 3.64 , 4.12 \ /* + */ 3.27 , 3.67 \ /* + */ 3.00 , 3.35 \ /* + */ 2.80 , 3.10 \ /* + */ 2.64 , 2.91 \ /* + */ 2.52 , 2.76 \ /* + */ 2.41 , 2.63 \ /* + */ 2.33 , 2.52 \ /* + */ 2.25 , 2.43 \ /* + */ 2.19 , 2.35 \ /* + */ 2.13 , 2.29 \ /* + */ 2.08 , 2.22 \ /* + */ 2.04 , 2.17 \ /* + */ 2.00 , 2.12 \ /* + */ 1.96 , 2.08 \ /* + */ 1.93 , 2.04 \ /* + */ 1.90 , 2.01 \ /* + */ 1.87 , 1.97 \ /* + */ 1.84 , 1.94 \ /* + */ 1.82 , 1.92 \ /* + */ 1.80 , 1.89 \ /* + */ 1.78 , 1.87 \ /* + */ 1.76 , 1.84 \ /* + */ 1.74 , 1.82 \ /* + */ 1.73 , 1.80 \ /* + */ 1.71 , 1.79 \ /* + */ 1.70 , 1.77 \ /* + */ 1.68 , 1.75 \ /* + */ 1.67 , 1.74 \ /* + */ 1.66 , 1.72 \ /* + */ 1.64 , 1.71 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.68 \ /* + */ 1.61 , 1.67 \ /* + */ 1.60 , 1.66 \ /* + */ 1.59 , 1.65 \ /* + */ 1.58 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.57 , 1.62 \ /* + */ 1.56 , 1.61 \ /* + */ 1.55 , 1.60 \ /* + */ 1.54 , 1.59 \ /* + */ 1.54 , 1.59 \ /* + */ 1.53 , 1.58 \ /* + */ 1.52 , 1.57 \ /* + */ 1.52 , 1.56 \ /* + */ 1.51 , 1.56 \ /* + */ 1.50 , 1.55 \ /* + */ 1.50 , 1.54 \ /* + */ 1.49 , 1.54 \ /* + */ 1.49 , 1.53 \ /* + */ 1.48 , 1.53 \ /* + */ 1.48 , 1.52 \ /* + */ 1.47 , 1.51 \ /* + */ 1.47 , 1.51 \ /* + */ 1.46 , 1.50 \ /* + */ 1.46 , 1.50 \ /* + */ 1.45 , 1.49 \ /* + */ 1.45 , 1.49 \ /* + */ 1.44 , 1.48 \ /* + */ 1.44 , 1.48 \ /* + */ 1.44 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.42 \ /* + */ 1.39 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.41 \ /* + */ 1.38 , 1.41 \ /* + */ 1.37 , 1.41 \ /* + */ 1.37 , 1.40 \ /* + */ 1.37 , 1.40 \ /* + */ 1.37 , 1.40 \ /* + */ 1.36 , 1.40 \ /* + */ 1.36 , 1.39 \ /* + */ 1.36 , 1.39 \ /* + */ 1.36 , 1.39 \ /* + */ 1.36 , 1.38 \ /* + */ 1.35 , 1.38 \ /* + */ 1.35 , 1.38 \ /* + */ 1.35 , 1.38 \ /* + */ 1.35 , 1.37 \ /* + */ 1.34 , 1.37 \ /* + */ 1.34 , 1.37 \ /* + */ 1.34 , 1.37 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize10" { + matrix input `temp' = ( /* + */ 16.38 , . \ /* + */ 8.68 , 7.03 \ /* + */ 6.46 , 5.44 \ /* + */ 5.44 , 4.72 \ /* + */ 4.84 , 4.32 \ /* + */ 4.45 , 4.06 \ /* + */ 4.18 , 3.90 \ /* + */ 3.97 , 3.78 \ /* + */ 3.81 , 3.70 \ /* + */ 3.68 , 3.64 \ /* + */ 3.58 , 3.60 \ /* + */ 3.50 , 3.58 \ /* + */ 3.42 , 3.56 \ /* + */ 3.36 , 3.55 \ /* + */ 3.31 , 3.54 \ /* + */ 3.27 , 3.55 \ /* + */ 3.24 , 3.55 \ /* + */ 3.20 , 3.56 \ /* + */ 3.18 , 3.57 \ /* + */ 3.21 , 3.58 \ /* + */ 3.39 , 3.59 \ /* + */ 3.57 , 3.60 \ /* + */ 3.68 , 3.62 \ /* + */ 3.75 , 3.64 \ /* + */ 3.79 , 3.65 \ /* + */ 3.82 , 3.67 \ /* + */ 3.85 , 3.74 \ /* + */ 3.86 , 3.87 \ /* + */ 3.87 , 4.02 \ /* + */ 3.88 , 4.12 \ /* + */ 3.89 , 4.19 \ /* + */ 3.89 , 4.24 \ /* + */ 3.90 , 4.27 \ /* + */ 3.90 , 4.31 \ /* + */ 3.90 , 4.33 \ /* + */ 3.90 , 4.36 \ /* + */ 3.90 , 4.38 \ /* + */ 3.90 , 4.39 \ /* + */ 3.90 , 4.41 \ /* + */ 3.90 , 4.43 \ /* + */ 3.90 , 4.44 \ /* + */ 3.90 , 4.45 \ /* + */ 3.90 , 4.47 \ /* + */ 3.90 , 4.48 \ /* + */ 3.90 , 4.49 \ /* + */ 3.90 , 4.50 \ /* + */ 3.90 , 4.51 \ /* + */ 3.90 , 4.52 \ /* + */ 3.90 , 4.53 \ /* + */ 3.90 , 4.54 \ /* + */ 3.90 , 4.55 \ /* + */ 3.90 , 4.56 \ /* + */ 3.90 , 4.56 \ /* + */ 3.90 , 4.57 \ /* + */ 3.90 , 4.58 \ /* + */ 3.90 , 4.59 \ /* + */ 3.90 , 4.59 \ /* + */ 3.90 , 4.60 \ /* + */ 3.90 , 4.61 \ /* + */ 3.90 , 4.61 \ /* + */ 3.90 , 4.62 \ /* + */ 3.90 , 4.62 \ /* + */ 3.90 , 4.63 \ /* + */ 3.90 , 4.63 \ /* + */ 3.89 , 4.64 \ /* + */ 3.89 , 4.64 \ /* + */ 3.89 , 4.64 \ /* + */ 3.89 , 4.65 \ /* + */ 3.89 , 4.65 \ /* + */ 3.89 , 4.65 \ /* + */ 3.89 , 4.66 \ /* + */ 3.89 , 4.66 \ /* + */ 3.89 , 4.66 \ /* + */ 3.89 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.86 , 4.65 \ /* + */ 3.86 , 4.65 \ /* + */ 3.86 , 4.65 \ /* + */ 3.86 , 4.64 \ /* + */ 3.85 , 4.64 \ /* + */ 3.85 , 4.64 \ /* + */ 3.85 , 4.63 \ /* + */ 3.85 , 4.63 \ /* + */ 3.84 , 4.62 \ /* + */ 3.84 , 4.62 \ /* + */ 3.84 , 4.61 \ /* + */ 3.84 , 4.60 \ /* + */ 3.83 , 4.60 \ /* + */ 3.83 , 4.59 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize15" { + matrix input `temp' = ( /* + */ 8.96 , . \ /* + */ 5.33 , 4.58 \ /* + */ 4.36 , 3.81 \ /* + */ 3.87 , 3.39 \ /* + */ 3.56 , 3.13 \ /* + */ 3.34 , 2.95 \ /* + */ 3.18 , 2.83 \ /* + */ 3.04 , 2.73 \ /* + */ 2.93 , 2.66 \ /* + */ 2.84 , 2.60 \ /* + */ 2.76 , 2.55 \ /* + */ 2.69 , 2.52 \ /* + */ 2.63 , 2.48 \ /* + */ 2.57 , 2.46 \ /* + */ 2.52 , 2.44 \ /* + */ 2.48 , 2.42 \ /* + */ 2.44 , 2.41 \ /* + */ 2.41 , 2.40 \ /* + */ 2.37 , 2.39 \ /* + */ 2.34 , 2.38 \ /* + */ 2.32 , 2.38 \ /* + */ 2.29 , 2.37 \ /* + */ 2.27 , 2.37 \ /* + */ 2.25 , 2.37 \ /* + */ 2.24 , 2.37 \ /* + */ 2.22 , 2.38 \ /* + */ 2.21 , 2.38 \ /* + */ 2.20 , 2.38 \ /* + */ 2.19 , 2.39 \ /* + */ 2.18 , 2.39 \ /* + */ 2.19 , 2.40 \ /* + */ 2.22 , 2.41 \ /* + */ 2.33 , 2.42 \ /* + */ 2.40 , 2.42 \ /* + */ 2.45 , 2.43 \ /* + */ 2.48 , 2.44 \ /* + */ 2.50 , 2.45 \ /* + */ 2.52 , 2.54 \ /* + */ 2.53 , 2.55 \ /* + */ 2.54 , 2.66 \ /* + */ 2.55 , 2.73 \ /* + */ 2.56 , 2.78 \ /* + */ 2.57 , 2.82 \ /* + */ 2.57 , 2.85 \ /* + */ 2.58 , 2.87 \ /* + */ 2.58 , 2.89 \ /* + */ 2.58 , 2.91 \ /* + */ 2.59 , 2.92 \ /* + */ 2.59 , 2.93 \ /* + */ 2.59 , 2.94 \ /* + */ 2.59 , 2.95 \ /* + */ 2.59 , 2.96 \ /* + */ 2.60 , 2.97 \ /* + */ 2.60 , 2.98 \ /* + */ 2.60 , 2.98 \ /* + */ 2.60 , 2.99 \ /* + */ 2.60 , 2.99 \ /* + */ 2.60 , 3.00 \ /* + */ 2.60 , 3.00 \ /* + */ 2.60 , 3.01 \ /* + */ 2.60 , 3.01 \ /* + */ 2.60 , 3.02 \ /* + */ 2.61 , 3.02 \ /* + */ 2.61 , 3.02 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.04 \ /* + */ 2.61 , 3.04 \ /* + */ 2.61 , 3.04 \ /* + */ 2.60 , 3.04 \ /* + */ 2.60 , 3.04 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.03 \ /* + */ 2.57 , 3.03 \ /* + */ 2.57 , 3.03 \ /* + */ 2.57 , 3.03 \ /* + */ 2.57 , 3.02 \ /* + */ 2.56 , 3.02 \ /* + */ 2.56 , 3.02 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize20" { + matrix input `temp' = ( /* + */ 6.66 , . \ /* + */ 4.42 , 3.95 \ /* + */ 3.69 , 3.32 \ /* + */ 3.30 , 2.99 \ /* + */ 3.05 , 2.78 \ /* + */ 2.87 , 2.63 \ /* + */ 2.73 , 2.52 \ /* + */ 2.63 , 2.43 \ /* + */ 2.54 , 2.36 \ /* + */ 2.46 , 2.30 \ /* + */ 2.40 , 2.25 \ /* + */ 2.34 , 2.21 \ /* + */ 2.29 , 2.17 \ /* + */ 2.25 , 2.14 \ /* + */ 2.21 , 2.11 \ /* + */ 2.18 , 2.09 \ /* + */ 2.14 , 2.07 \ /* + */ 2.11 , 2.05 \ /* + */ 2.09 , 2.03 \ /* + */ 2.06 , 2.02 \ /* + */ 2.04 , 2.01 \ /* + */ 2.02 , 1.99 \ /* + */ 2.00 , 1.98 \ /* + */ 1.98 , 1.98 \ /* + */ 1.96 , 1.97 \ /* + */ 1.95 , 1.96 \ /* + */ 1.93 , 1.96 \ /* + */ 1.92 , 1.95 \ /* + */ 1.90 , 1.95 \ /* + */ 1.89 , 1.95 \ /* + */ 1.88 , 1.94 \ /* + */ 1.87 , 1.94 \ /* + */ 1.86 , 1.94 \ /* + */ 1.85 , 1.94 \ /* + */ 1.84 , 1.94 \ /* + */ 1.83 , 1.94 \ /* + */ 1.82 , 1.94 \ /* + */ 1.81 , 1.95 \ /* + */ 1.81 , 1.95 \ /* + */ 1.80 , 1.95 \ /* + */ 1.79 , 1.95 \ /* + */ 1.79 , 1.96 \ /* + */ 1.78 , 1.96 \ /* + */ 1.78 , 1.97 \ /* + */ 1.80 , 1.97 \ /* + */ 1.87 , 1.98 \ /* + */ 1.92 , 1.98 \ /* + */ 1.95 , 1.99 \ /* + */ 1.97 , 2.00 \ /* + */ 1.99 , 2.00 \ /* + */ 2.00 , 2.01 \ /* + */ 2.01 , 2.09 \ /* + */ 2.02 , 2.11 \ /* + */ 2.03 , 2.18 \ /* + */ 2.04 , 2.23 \ /* + */ 2.04 , 2.27 \ /* + */ 2.05 , 2.29 \ /* + */ 2.05 , 2.31 \ /* + */ 2.06 , 2.33 \ /* + */ 2.06 , 2.34 \ /* + */ 2.07 , 2.35 \ /* + */ 2.07 , 2.36 \ /* + */ 2.07 , 2.37 \ /* + */ 2.08 , 2.38 \ /* + */ 2.08 , 2.39 \ /* + */ 2.08 , 2.39 \ /* + */ 2.08 , 2.40 \ /* + */ 2.09 , 2.40 \ /* + */ 2.09 , 2.41 \ /* + */ 2.09 , 2.41 \ /* + */ 2.09 , 2.41 \ /* + */ 2.09 , 2.42 \ /* + */ 2.09 , 2.42 \ /* + */ 2.09 , 2.42 \ /* + */ 2.09 , 2.43 \ /* + */ 2.10 , 2.43 \ /* + */ 2.10 , 2.43 \ /* + */ 2.10 , 2.43 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.09 , 2.44 \ /* + */ 2.09 , 2.44 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.07 , 2.44 \ /* + */ 2.07 , 2.44 \ /* + */ 2.07 , 2.44 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize25" { + matrix input `temp' = ( /* + */ 5.53 , . \ /* + */ 3.92 , 3.63 \ /* + */ 3.32 , 3.09 \ /* + */ 2.98 , 2.79 \ /* + */ 2.77 , 2.60 \ /* + */ 2.61 , 2.46 \ /* + */ 2.49 , 2.35 \ /* + */ 2.39 , 2.27 \ /* + */ 2.32 , 2.20 \ /* + */ 2.25 , 2.14 \ /* + */ 2.19 , 2.09 \ /* + */ 2.14 , 2.05 \ /* + */ 2.10 , 2.02 \ /* + */ 2.06 , 1.99 \ /* + */ 2.03 , 1.96 \ /* + */ 2.00 , 1.93 \ /* + */ 1.97 , 1.91 \ /* + */ 1.94 , 1.89 \ /* + */ 1.92 , 1.87 \ /* + */ 1.90 , 1.86 \ /* + */ 1.88 , 1.84 \ /* + */ 1.86 , 1.83 \ /* + */ 1.84 , 1.81 \ /* + */ 1.83 , 1.80 \ /* + */ 1.81 , 1.79 \ /* + */ 1.80 , 1.78 \ /* + */ 1.78 , 1.77 \ /* + */ 1.77 , 1.77 \ /* + */ 1.76 , 1.76 \ /* + */ 1.75 , 1.75 \ /* + */ 1.74 , 1.75 \ /* + */ 1.73 , 1.74 \ /* + */ 1.72 , 1.73 \ /* + */ 1.71 , 1.73 \ /* + */ 1.70 , 1.73 \ /* + */ 1.69 , 1.72 \ /* + */ 1.68 , 1.72 \ /* + */ 1.67 , 1.71 \ /* + */ 1.67 , 1.71 \ /* + */ 1.66 , 1.71 \ /* + */ 1.65 , 1.71 \ /* + */ 1.65 , 1.71 \ /* + */ 1.64 , 1.70 \ /* + */ 1.63 , 1.70 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.60 , 1.70 \ /* + */ 1.60 , 1.70 \ /* + */ 1.59 , 1.70 \ /* + */ 1.59 , 1.70 \ /* + */ 1.59 , 1.70 \ /* + */ 1.58 , 1.70 \ /* + */ 1.58 , 1.71 \ /* + */ 1.58 , 1.71 \ /* + */ 1.57 , 1.71 \ /* + */ 1.59 , 1.71 \ /* + */ 1.60 , 1.71 \ /* + */ 1.63 , 1.72 \ /* + */ 1.65 , 1.72 \ /* + */ 1.67 , 1.72 \ /* + */ 1.69 , 1.72 \ /* + */ 1.70 , 1.76 \ /* + */ 1.71 , 1.81 \ /* + */ 1.72 , 1.87 \ /* + */ 1.73 , 1.91 \ /* + */ 1.74 , 1.94 \ /* + */ 1.74 , 1.96 \ /* + */ 1.75 , 1.98 \ /* + */ 1.75 , 1.99 \ /* + */ 1.76 , 2.01 \ /* + */ 1.76 , 2.02 \ /* + */ 1.77 , 2.03 \ /* + */ 1.77 , 2.04 \ /* + */ 1.78 , 2.04 \ /* + */ 1.78 , 2.05 \ /* + */ 1.78 , 2.06 \ /* + */ 1.79 , 2.06 \ /* + */ 1.79 , 2.07 \ /* + */ 1.79 , 2.07 \ /* + */ 1.79 , 2.08 \ /* + */ 1.80 , 2.08 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + return scalar cv=`cv' +end + +exit + +********************************** VERSION COMMENTS ********************************** +* 1.0.2: add logic for reg3. Sargan test +* 1.0.3: add prunelist to ensure that count of excluded exogeneous is correct +* 1.0.4: revise option to exog(), allow included exog to be specified as well +* 1.0.5: switch from reg3 to regress, many options and output changes +* 1.0.6: fixed treatment of nocons in Sargan and C-stat, and corrected problems +* relating to use of nocons combined with a constant as an IV +* 1.0.7: first option reports F-test of excluded exogenous; prunelist bug fix +* 1.0.8: dropped prunelist and switched to housekeeping of variable lists +* 1.0.9: added collinearity checks; C-stat calculated with recursive call; +* added ffirst option to report only F-test of excluded exogenous +* from 1st stage regressions +* 1.0.10: 1st stage regressions also report partial R2 of excluded exogenous +* 1.0.11: complete rewrite of collinearity approach - no longer uses calls to +* _rmcoll, does not track specific variables dropped; prunelist removed +* 1.0.12: reorganised display code and saved results to enable -replay()- +* 1.0.13: -robust- and -cluster- now imply -small- +* 1.0.14: fixed hascons bug; removed ivreg predict fn (it didn't work); allowed +* robust and cluster with z stats and correct dofs +* 1.0.15: implemented robust Sargan stat; changed to only F-stat, removed chi-sq; +* removed exog option (only orthog works) +* 1.0.16: added clusterised Sargan stat; robust Sargan handles collinearities; +* predict now works with standard SE options plus resids; fixed orthog() +* so it accepts time series operators etc. +* 1.0.17: fixed handling of weights. fw, aw, pw & iw all accepted. +* 1.0.18: fixed bug in robust Sargan code relating to time series variables. +* 1.0.19: fixed bugs in reporting ranks of X'X and Z'Z +* fixed bug in reporting presence of constant +* 1.0.20: added GMM option and replaced robust Sargan with (equivalent) J; +* added saved statistics of 1st stage regressions +* 1.0.21: added Cragg HOLS estimator, including allowing empty endog list; +* -regress- syntax now not allowed; revised code searching for "_cons" +* 1.0.22: modified cluster output message; fixed bug in replay for Sargan/Hansen stat; +* exactly identified Sargan/Hansen now exactly zero and p-value not saved as e(); +* cluster multiplier changed to 1 (from buggy multiplier), in keeping with +* eg Wooldridge 2002 p. 193. +* 1.0.23: fixed orthog option to prevent abort when restricted equation is underid. +* 1.0.24: fixed bug if 1st stage regressions yielded missing values for saving in e(). +* 1.0.25: Added Shea version of partial R2 +* 1.0.26: Replaced Shea algorithm with Godfrey algorithm +* 1.0.27: Main call to regress is OLS form if OLS or HOLS is specified; error variance +* in Sargan and C statistics use small-sample adjustment if -small- option is +* specified; dfn of S matrix now correctly divided by sample size +* 1.0.28: HAC covariance estimation implemented +* Symmetrize all matrices before calling syminv +* Added hack to catch F stats that ought to be missing but actually have a +* huge-but-not-missing value +* Fixed dof of F-stat - was using rank of ZZ, should have used rank of XX (couldn't use df_r +* because it isn't always saved. This is because saving df_r triggers small stats +* (t and F) even when -post- is called without dof() option, hence df_r saved only +* with -small- option and hence a separate saved macro Fdf2 is needed. +* Added rankS to saved macros +* Fixed trap for "no regressors specified" +* Added trap to catch gmm option with no excluded instruments +* Allow OLS syntax (no endog or excluded IVs specified) +* Fixed error messages and traps for rank-deficient robust cov matrix; includes +* singleton dummy possibility +* Capture error if posting estimated VCV that isn't pos def and report slightly +* more informative error message +* Checks 3 variable lists (endo, inexog, exexog) separately for collinearities +* Added AC (autocorrelation-consistent but conditionally-homoskedastic) option +* Sargan no longer has small-sample correction if -small- option +* robust, cluster, AC, HAC all passed on to first-stage F-stat +* bw must be < T +* 1.0.29 -orthog- also displays Hansen-Sargan of unrestricted equation +* Fixed collinearity check to include nocons as well as hascons +* Fixed small bug in Godfrey-Shea code - macros were global rather than local +* Fixed larger bug in Godfrey-Shea code - was using mixture of sigma-squares from IV and OLS +* with and without small-sample corrections +* Added liml and kclass +* 1.0.30 Changed order of insts macro to match saved matrices S and W +* 2.0.00 Collinearities no longer -qui- +* List of instruments tested in -orthog- option prettified +* 2.0.01 Fixed handling of nocons with no included exogenous, including LIML code +* 2.0.02 Allow C-test if unrestricted equation is just-identified. Implemented by +* saving Hansen-Sargan dof as = 0 in e() if just-identified. +* 2.0.03 Added score() option per latest revision to official ivreg +* 2.0.04 Changed score() option to pscore() per new official ivreg +* 2.0.05 Fixed est hold bug in first-stage regressions +* Fixed F-stat finite sample adjustment with cluster option to match official Stata +* Fixed F-stat so that it works with hascons (collinearity with constant is removed) +* Fixed bug in F-stat code - wasn't handling failed posting of vcv +* No longer allows/ignores nonsense options +* 2.0.06 Modified lsStop to sync with official ivreg 5.1.3 +* 2.0.07a Working version of CUE option +* Added sortpreserve, ivar and tvar options +* Fixed smalls bug in calculation of T for AC/HAC - wasn't using the last ob +* in QS kernel, and didn't take account of possible dropped observations +* 2.0.07b Fixed macro bug that truncated long varlists +* 2.0.07c Added dof option. +* Changed display of RMSE so that more digits are displayed (was %8.1g) +* Fixed small bug where cstat was local macro and should have been scalar +* Fixed bug where C stat failed with cluster. NB: wmatrix option and cluster are not compatible! +* 2.0.7d Fixed bug in dof option +* 2.1.0 Added first-stage identification, weak instruments, and redundancy stats +* 2.1.01 Tidying up cue option checks, reporting of cue in output header, etc. +* 2.1.02 Used Poskitt-Skeels (2002) result that C-D eval = cceval / (1-cceval) +* 2.1.03 Added saved lists of separate included and excluded exogenous IVs +* 2.1.04 Added Anderson-Rubin test of signif of endog regressors +* 2.1.05 Fix minor bugs relating to cluster and new first-stage stats +* 2.1.06 Fix bug in cue: capture estimates hold without corresponding capture on estimates unhold +* 2.1.07 Minor fix to ereturn local wexp, promote to version 8.2 +* 2.1.08 Added dofminus option, removed dof option. Added A-R test p-values to e(). +* Minor bug fix to A-R chi2 test - was N chi2, should have been N-L chi2. +* Changed output to remove potentially misleading refs to N-L etc. +* Bug fix to rhs count - sometimes regressors could have exact zero coeffs +* Bug fix related to cluster - if user omitted -robust-, orthog would use Sargan and not J +* Changed output of Shea R2 to make clearer that F and p-values do not refer to it +* Improved handling of collinearites to check across inexog, exexog and endo lists +* Total weight statement moved to follow summ command +* Added traps to catch errors if no room to save temporary estimations with _est hold +* Added -savefirst- option. Removed -hascons-, now synonymous with -nocons-. +* 2.1.09 Fixes to dof option with cluster so it no longer mimics incorrect areg behavior +* Local ivreg2_cmd to allow testing under name ivreg2 +* If wmatrix supplied, used (previously not used if non-robust sargan stat generated) +* Allowed OLS using (=) syntax (empty endo and exexog lists) +* Clarified error message when S matrix is not of full rank +* cdchi2p, ardf, ardf_r added to saved macros +* first and ffirst replay() options; DispFirst and DispFFirst separately codes 1st stage output +* Added savefprefix, macro with saved first-stage equation names. +* Added version option. +* Added check for duplicate variables to collinearity checks +* Rewrote/simplified Godfrey-Shea partial r2 code +* 2.1.10 Added NOOUTput option +* Fixed rf bug so that first does not trigger unnecessary saved rf +* Fixed cue bug - was not starting with robust 2-step gmm if robust/cluster +* 2.1.11 Dropped incorrect/misleading dofminus adjustments in first-stage output summary +* 2.1.12 Collinearity check now checks across inexog/exexog/endog simultaneously +* 2.1.13 Added check to catch failed first-stage regressions +* Fixed misleading failed C-stat message +* 2.1.14 Fixed mishandling of missing values in AC (non-robust) block +* 2.1.15 Fixed bug in RF - was ignoring weights +* Added -endog- option +* Save W matrix for all cases; ensured copy is posted with wmatrix option so original isn't zapped +* Fixed cue bug - with robust, was entering IV block and overwriting correct VCV +* 2.1.16 Added -fwl- option +* Saved S is now robust cov matrix of orthog conditions if robust, whereas W is possibly non-robust +* weighting matrix used by estmator. inv(S)=W if estimator is efficient GMM. +* Removed pscore option (dropped by official ivreg). +* Fixed bug where -post- would fail because of missing values in vcv +* Remove hascons as synonym for nocons +* OLS now outputs 2nd footer with variable lists +* 2.1.17 Reorganization of code +* Added ll() macro +* Fixed N bug where weights meant a non-integer ob count that was rounded down +* Fixed -fwl- option so it correctly handles weights (must include when partialling-out) +* smatrix option takes over from wmatrix option. Consistent treatment of both. +* Saved smatrix and wmatrix now differ in case of inefficient GMM. +* Added title() and subtitle() options. +* b0 option returns a value for the Sargan/J stat even if exactly id'd. +* (Useful for S-stat = value of GMM objective function.) +* HAC and AC now allowed with LIML and k-class. +* Collinearity improvements: bug fixed because collinearity was mistakenly checked across +* inexog/exexog/endog simultaneously; endog predicted exactly by IVs => reclassified as inexog; +* _rmcollright enforces inexog>endo>exexog priority for collinearities, if Stata 9.2 or later. +* K-class, LIML now report Sargan and J. C-stat based on Sargan/J. LIML reports AR if homosked. +* nb: can always easily get a C-stat for LIML based on diff of two AR stats. +* Always save Sargan-Hansen as e(j); also save as e(sargan) if homoskedastic. +* Added Stock-Watson robust SEs options sw() +* 2.1.18 Added Cragg-Donald-Stock-Yogo weak ID statistic critical values to main output +* Save exexog_ct, inexog_ct and endog_ct as macros +* Stock-Watson robust SEs now assume ivar is group variable +* Option -sw- is standard SW. Option -swpsd- is PSD version a la page 6 point 10. +* Added -noid- option. Suppresses all first-stage and identification statistics. +* Internal calls to ivreg2 use noid option. +* Added hyperlinks to ivreg2.hlp and helpfile argument to display routines to enable this. +* 2.1.19 Added matrix rearrangement and checks for smatrix and wmatrix options +* Recursive calls to cstat simplified - no matrix rearrangement or separate robust/nonrobust needed +* Reintroduced weak ID stats to ffirst output +* Added robust ID stats to ffirst output for case of single endogenous regressor +* Fixed obscure bug in reporting 1st stage partial r2 - would report zero if no included exogenous vars +* Removed "HOLS" in main output (misleading if, e.g., estimation is AC but not HAC) +* Removed "ML" in main output if no endogenous regressors - now all ML is labelled LIML +* model=gmm is now model=gmm2s; wmatrix estimation is model=gmm +* wmatrix relates to gmm estimator; smatrix relates to gmm var-cov matrix; b0 behavior equiv to wmatrix +* b0 option implies nooutput and noid options +* Added nocollin option to skip collinearity checks +* Fixed minor display bug in ffirst output for endog vars with varnames > 12 characters +* Fixed bug in saved rf and first-stage results for vars with long varnames; uses permname +* Fixed bug in model df - had counted RHS, now calculates rank(V) since latter may be rank-deficient +* Rank of V now saved as macro rankV +* fwl() now allows partialling-out of just constant with _cons +* Added Stock-Wright S statistic (but adds overhead - calls preserve) +* Properties now include svyj. +* Noted only: fwl bug doesn't allow time-series operators. +* 2.1.20 Fixed Stock-Wright S stat bug - didn't allow time-series operators +* 2.1.21 Fixed Stock-Wright S stat to allow for no exog regressors cases +* 2.1.22 Misc fixes. Fixed bug in AC with aweights; was weighting zi'zi but not ei'ei. +* Fixed bug in AC; need to clear variable vt1 at start of loop +* If iweights, Nprec (#obs with precision) rounded to nearest integer to mimic official Stata treatment diff --git a/ado/i/ivreg28.hlp b/ado/i/ivreg28.hlp new file mode 100644 index 0000000..be2eaf6 --- /dev/null +++ b/ado/i/ivreg28.hlp @@ -0,0 +1,1232 @@ +{smcl} +{* 3feb2007}{...} +{hline} +help for {hi:ivreg28} +{hline} + +{title:Extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression} + +{p 4}Full syntax + +{p 8 14}{cmd:ivreg28} {it:depvar} [{it:varlist1}] +{cmd:(}{it:varlist2}{cmd:=}{it:varlist_iv}{cmd:)} [{it:weight}] +[{cmd:if} {it:exp}] [{cmd:in} {it:range}] +{bind:[{cmd:,} {cmd:gmm}} +{cmd:bw(}{it:#}{cmd:)} +{cmd:kernel(}{it:string}{cmd:)} +{cmd:liml} +{cmd:fuller(}{it:#}{cmd:)} +{cmd:kclass(}{it:#}{cmd:)} +{cmd:coviv} +{cmd:cue} +{cmd:cueinit}{cmd:(}{it:matrix}{cmd:)} +{cmdab:cueopt:ions}{cmd:(}{it:string}{cmd:)} +{cmdab:r:obust} +{cmdab:cl:uster}{cmd:(}{it:varname}{cmd:)} +{cmd:orthog(}{it:varlist_ex}{cmd:)} +{cmd:endog(}{it:varlist_en}{cmd:)} +{cmdab:red:undant(}{it:varlist_ex}{cmd:)} +{cmd:fwl(}{it:varlist}{cmd:)} +{cmdab:sm:all} +{cmdab:noc:onstant} {cmdab:h}ascons} +{cmd:first} {cmd:ffirst} {cmd:noid} {cmd:savefirst} {cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:rf} {cmd:saverf} {cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:nocollin} {cmd:noid} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{bind:{cmd:plus} ]} + +{p 4}Replay syntax + +{p 8 14}{cmd:ivreg28} +{bind:[{cmd:,} {cmd:first}} +{cmd:ffirst} {cmd:rf} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{cmd:plus} ]} + +{p 4}Version syntax + +{p 8 14}{cmd:ivreg28}, {cmd:version} + +{p}{cmd:ivreg28} may be used with time-series or panel data, +in which case the data must be {cmd:tsset} +before using {cmd:ivreg28}; see help {help tsset}. + +{p}All {it:varlists} may contain time-series operators; +see help {help varlist}. + +{p}{cmd:by}, {cmd:rolling}, {cmd:statsby}, {cmd:xi}, +{cmd:bootstrap} and {cmd:jackknife} are allowed; see help {help prefix}. + +{p}{cmd:aweight}s, {cmd:fweight}s, {cmd:iweight}s and {cmd:pweight}s +are allowed; see help {help weights}. + +{p}The syntax of {help predict} following {cmd:ivreg28} is + +{p 8 16}{cmd:predict} [{it:type}] {it:newvarname} [{cmd:if} {it:exp}] +[{cmd:in} {it:range}] [{cmd:,} {it:statistic}] + +{p}where {it:statistic} is + +{p 8 23}{cmd:xb}{space 11}fitted values; the default{p_end} +{p 8 23}{cmdab:r:esiduals}{space 4}residuals{p_end} +{p 8 23}{cmd:stdp}{space 9}standard error of the prediction{p_end} + +{p}These statistics are available both in and out of sample; +type "{cmd:predict} {it:...} {cmd:if e(sample)} {it:...}" +if wanted only for the estimation sample. + +{title:Contents} +{p 2}{help ivreg28##s_description:Description}{p_end} +{p 2}{help ivreg28##s_robust:Calculation of robust, AC, HAC standard errors}{p_end} +{p 2}{help ivreg28##s_gmm:GMM estimation}{p_end} +{p 2}{help ivreg28##s_liml:LIML, k-class and GMM-CUE estimation}{p_end} +{p 2}{help ivreg28##s_sumopt:Summary of robust, HAC, AC, GMM, LIML and CUE options}{p_end} +{p 2}{help ivreg28##s_overid:Testing overidentifying restrictions}{p_end} +{p 2}{help ivreg28##s_endog:Testing subsets of regressors and instruments for endogeneity}{p_end} +{p 2}{help ivreg28##s_relevance:Tests of under- and weak identification and instrument redundancy}{p_end} +{p 2}{help ivreg28##s_first:First stage regressions, identification, and weak-id-robust inference}{p_end} +{p 2}{help ivreg28##s_rf:Reduced form estimates}{p_end} +{p 2}{help ivreg28##s_fwl:Estimating the Frisch-Waugh-Lovell regression}{p_end} +{p 2}{help ivreg28##s_ols:OLS and Heteroskedastic OLS (HOLS) estimation}{p_end} +{p 2}{help ivreg28##s_collin:Collinearities}{p_end} +{p 2}{help ivreg28##s_speed:Speed options: nocollin and noid}{p_end} +{p 2}{help ivreg28##s_small:Small sample corrections}{p_end} +{p 2}{help ivreg28##s_options:Options summary}{p_end} +{p 2}{help ivreg28##s_macros:Remarks and saved results}{p_end} +{p 2}{help ivreg28##s_examples:Examples}{p_end} +{p 2}{help ivreg28##s_refs:References}{p_end} +{p 2}{help ivreg28##s_acknow:Acknowledgements}{p_end} +{p 2}{help ivreg28##s_citation:Authors}{p_end} +{p 2}{help ivreg28##s_citation:Citation of ivreg28}{p_end} + +{marker s_description}{title:Description} + +{p}{cmd:ivreg28} implements a range of single-equation estimation methods +for the linear regression model: OLS, instrumental +variables (IV, also known as two-stage least squares, 2SLS), +the generalized method of moments (GMM), +limited-information maximum likelihood (LIML), and k-class estimators. +In the language of IV/GMM, {it:varlist1} are the exogenous +regressors or "included instruments", +{it:varlist_iv} are the exogenous variables excluded +from the regression or "excluded instruments", +and {it:varlist2} the endogenous regressors that are being "instrumented". + +{p}{cmd:ivreg28} will also estimate linear regression models using +robust (heteroskedastic-consistent), +autocorrelation-consistent (AC) and +heteroskedastic and autocorrelation-consistent (HAC) variance estimates. + +{p}{cmd:ivreg28} provides extensions to Stata's official {cmd:ivreg} +and {cmd:newey}. +{cmd:ivreg28} supports the same command syntax as official {cmd:ivreg} +and (almost) all of its options. +The main extensions available are as follows: +two-step feasible GMM estimation ({cmd:gmm} option) +and continuously-updated GMM estimation ({cmd:cue} option); +LIML and k-class estimation; +automatic output overidentification and underidentification test statistics; +C statistic test of exogeneity of subsets of instruments +({cmd:orthog()} option); +endogeneity tests of endogenous regressors +({cmd:endog()} option); +test of instrument redundancy +({cmd:redundant()} option); +kernel-based autocorrelation-consistent (AC) +and heteroskedastic and autocorrelation consistent (HAC) standard errors +and covariance estimation ({cmd:bw(}{it:#}{cmd:)} option), +with user-specified choice of kernel ({cmd:kernel()} option); +default reporting of large-sample statistics +(z and chi-squared rather than t and F); +{cmd:small} option to report small-sample statistics; +first-stage regressions reported with various tests and statistics for +identification and instrument relevance; +{cmd:ffirst} option to report only these identification statistics +and not the first-stage regression results themselves; +{cmd:nofooter} option to suppress footer of regression output. +{cmd:ivreg28} can also be used for ordinary least squares (OLS) estimation +using the same command syntax as official {cmd:regress} and {cmd:newey}. + +{marker s_robust}{dlgtab:Calculation of robust, AC, HAC standard errors} + +{p}The standard errors reported by {cmd:ivreg28} can be made consistent +in the presence of a variety of violations of the assumption of i.i.d. errors: +{bind:(1) {cmd:robust}} causes {cmd:ivreg28} to report standard errors that are +robust to the presence of arbitrary heteroskedasticity; +{bind:(2) {cmd:cluster}} standard errors are robust to both +arbitrary heteroskedasticity and arbitrary intra-group correlation; +{bind:(3) {cmd:bw(}{it:#}{cmd:)}} requests AC standard errors that are +robust to arbitrary autocorrelation; +{bind:(4) {cmd:bw(}{it:#}{cmd:)}} combined with {cmd:robust} +requests HAC standard errors that are +robust to both arbitrary heteroskedasticity and arbitrary autocorrelation. + +{p}{cmd:ivreg28} allows a variety of options for kernel-based HAC and AC estimation. +The {cmd:bw(}{it:#}{cmd:)} option sets the bandwidth used in the estimation +and {cmd:kernel(}{it:string}{cmd:)} is the kernel used; +the default kernel is the Bartlett kernel, +also known in econometrics as Newey-West (see help {help newey}). +{cmd:ivreg28} can also be used for kernel-based estimation +with panel data, i.e., a cross-section of time series. +Before using {cmd:ivreg28} for kernel-based estimation +of time series or panel data, +the data must be {cmd:tsset}; see help {help tsset}. + +{marker s_gmm}{dlgtab:GMM estimation} + +{p}When combined with the above options, the {cmd:gmm} option generates +efficient estimates of the coefficients as well as consistent +estimates of the standard errors. +The {cmd:gmm} option implements the two-step efficient +generalized method of moments (GMM) estimator. +The efficient GMM estimator minimizes the GMM criterion function +J=N*g'*W*g, where N is the sample size, +g are the orthogonality or moment conditions +(specifying that all the exogenous variables, or instruments, +in the equation are uncorrelated with the error term) +and W is a weighting matrix. +In two-step efficient GMM, the efficient or optimal weighting matrix +is the inverse of an estimate of the covariance matrix of orthogonality conditions. +The efficiency gains of this estimator relative to the +traditional IV/2SLS estimator derive from the use of the optimal +weighting matrix, the overidentifying restrictions of the model, +and the relaxation of the i.i.d. assumption. +For an exactly-identified model, +the efficient GMM and traditional IV/2SLS estimators coincide, +and under the assumptions of conditional homoskedasticity and independence, +the efficient GMM estimator is the traditional IV/2SLS estimator. +For further details, see Hayashi (2000), pp. 206-13, and 226-27. + +{p}The efficient GMM estimators available with {cmd:gmm} correspond +to the above choices for consistent standard errors: +{bind:(1) used} on its own, {cmd:gmm} causes {cmd:ivreg28} to report +coefficient estimates that are efficient in presence of arbitrary heteroskedasticity; +{bind:(2) {cmd:gmm}} combined with {cmd:cluster} +generates coefficient estimates that are efficient in the presence of +arbitrary heteroskedasticity and arbitrary intra-group group correlation; +{bind:(3) {cmd:gmm}} plus {cmd:bw(}{it:#}{cmd:)} requests coefficient estimates that are +efficient in the presence of arbitrary autocorrelation; +{bind:(4) {cmd:gmm}} plus {cmd:bw(}{it:#}{cmd:)} and {cmd:robust} +generates coefficient estimates that are efficient in the presence of +both arbitrary heteroskedasticity and arbitrary autocorrelation. + +{marker s_liml}{dlgtab:LIML, k-class and GMM-CUE estimation} + +{marker liml}{p} Maximum-likelihood estimation of a single equation of this form +(endogenous RHS variables and excluded instruments) +is known as limited-information maximum likelihood or LIML. +The overidentifying restrictions test +reported after LIML estimation is the Anderson-Rubin (1950) overidentification +statistic in a homoskedastic context. +LIML, OLS and IV/2SLS are examples of k-class estimators. +LIML is a k-class estimator with k=the LIML eigenvalue lambda; +2SLS is a k-class estimator with k=1; +OLS is a k-class esimator with k=0. +Estimators based on other values of k have been proposed. +Fuller's modified LIML (available with the {cmd:fuller(}{it:#}{cmd:)} option) +sets k = lambda - alpha/(N-L), where lambda is the LIML eigenvalue, +L = number of instruments (included and excluded), +and the Fuller parameter alpha is a user-specified positive constant. +Nagar's bias-adjusted 2SLS estimator can be obtained with the +{cmd:kclass(}{it:#}{cmd:)} option by setting +k = 1 + (L-K)/N, where L-K = number of overidentifying restrictions +and N = the sample size. +For a discussion of LIML and k-class estimators, +see Davidson and MacKinnon (1993, pp. 644-51). + +{p} The GMM generalization of the LIML estimator +to the case of possibly heteroskedastic +and autocorrelated disturbances +is the "continuously-updated" GMM estimator or CUE +of Hansen, Heaton and Yaron (1996). +The CUE estimator directly maximizes the GMM objective function +J=N*g'*W(b_cue)*g, where W(b_cue) is an optimal weighting matrix +that depends on the estimated coefficients b_cue. +{cmd:cue} combined with {cmd:robust}, {cmd:cluster}, and/or {cmd:bw}, +generates coefficient estimates that are efficient in the presence +of the corresponding deviations from homoskedasticity. +Specifying {cmd:cue} with no other options +is equivalent to the combination of the options {cmd:liml} and {cmd:coviv}. +The CUE estimator requires numerical optimization methods, +and the implementation here uses Stata's {cmd:ml} routine. +The starting values are either IV or two-step efficient GMM +coefficient estimates; +these can be overridden with the {cmd:cueinit} option, +which takes the matrix of starting values b as its argument. +{cmd:cueoptions} passes options to Stata's {cmd:ml}; see help {help ml}. +Estimation with the {cmd:cue} option can be slow and problematic, +and it should be used with caution. + +{marker s_sumopt}{dlgtab:Summary of robust, HAC, AC, GMM, LIML and CUE options} + +{p}To summarize the robust, HAC, AC, GMM, LIML and CUE options: + +{p 4}{cmd:robust} => heteroskedastic-robust SEs{p_end} +{p 4}{cmd:gmm} => heteroskedastic-efficient two-step GMM estimator{p_end} +{p 4}{cmd:robust}+{cmd:gmm} => same as {cmd:gmm}{p_end} +{p 4}{cmd:bw} => autocorrelation-robust SEs{p_end} +{p 4}{cmd:bw}+{cmd:robust} => heteroskedastic and autocorrelation-robust SEs{p_end} +{p 4}{cmd:bw}+{cmd:gmm} => autocorrelation-efficient two-step GMM estimator{p_end} +{p 4}{cmd:bw}+{cmd:robust}+{cmd:gmm} => heteroskedastic and autocorrelation-efficient two-step GMM estimator{p_end} +{p 4}{cmd:liml} => LIML estimation with non-robust SEs{p_end} +{p 4}{cmd:liml}+{cmd:coviv} => LIML estimation with alternative non-robust SEs{p_end} +{p 4}{cmd:liml}+{cmd:robust} => LIML estimation with heteroskedastic-robust SEs{p_end} +{p 4}{cmd:cue} => same as {cmd:liml}+{cmd:coviv}{p_end} +{p 4}{cmd:cue}+{cmd:robust} => heteroskedastic-efficient continuously-updated GMM estimator{p_end} +{p 4}{cmd:cue}+{cmd:bw} => autocorrelation-efficient continuously-updated GMM estimator{p_end} +{p 4 8}{cmd:cue}+{cmd:bw}+{cmd:robust} => heteroskedastic and autocorrelation-efficient continuously updated GMM estimator{p_end} + +{p}For further details, see Hayashi (2000), pp. 206-13 and 226-27 +(on GMM estimation), Wooldridge (2002), p. 193 (on cluster-robust GMM), +and Hayashi (2000), pp. 406-10 or Cushing and McGarvey (1999) +(on kernel-based covariance estimation). + +{marker s_overid}{marker overidtests}{dlgtab:Testing overidentifying restrictions} + +{p}The Sargan-Hansen test is a test of overidentifying restrictions. +The joint null hypothesis is that the instruments are valid +instruments, i.e., uncorrelated with the error term, +and that the excluded instruments are correctly excluded from the estimated equation. +Under the null, the test statistic is distributed as chi-squared +in the number of overidentifying restrictions. +A rejection casts doubt on the validity of the instruments. +For the efficient GMM estimator, the test statistic is +Hansen's J statistic, the minimized value of the GMM criterion function. +For the 2SLS estimator, the test statistic is Sargan's statistic, +typically calculated as N*R-squared from a regression of the IV residuals +on the full set of instruments. +Under the assumption of conditional homoskedasticity, +Hansen's J statistic becomes Sargan's statistic. +The J statistic is consistent in the presence of heteroskedasticity +and (for HAC-consistent estimation) autocorrelation; +Sargan's statistic is consistent if the disturbance is homoskedastic +and (for AC-consistent estimation) if it is also autocorrelated. +With {cmd:gmm}, {cmd:robust} and/or {cmd:cluster}, +Hansen's J statistic is reported. +In the latter case the statistic allows observations +to be correlated within groups. +For further discussion see e.g. Hayashi (2000, pp. 227-8, 407, 417). + +{p}The Sargan statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg28} by the command {cmd:overid}. +The features of {cmd:ivreg28} that are unavailable in {cmd:overid} +are the J statistic and the C statistic; +the {cmd:overid} options unavailable in {cmd:ivreg28} +are various small-sample and pseudo-F versions of Sargan's statistic +and its close relative, Basmann's statistic. +See help {help overid} (if installed). + +{marker s_endog}{dlgtab:Testing subsets of regressors and instruments for endogeneity} + +{marker ctest}{p}The C statistic +(also known as a "GMM distance" +or "difference-in-Sargan" statistic) +implemented using the {cmd:orthog} option, +allows a test of a subset of the orthogonality conditions, i.e., +it is a test of the exogeneity of one or more instruments. +It is defined as +the difference of the Sargan-Hansen statistic +of the equation with the smaller set of instruments +(valid under both the null and alternative hypotheses) +and the equation with the full set of instruments, +i.e., including the instruments whose validity is suspect. +Under the null hypothesis that +both the smaller set of instruments +and the additional, suspect instruments are valid, +the C statistic is distributed as chi-squared +in the number of instruments tested. +Note that failure to reject the null hypothesis +requires that the full set of orthogonality conditions be valid; +the C statistic and the Sargan-Hansen test statistics +for the equations with both the smaller and full set of instruments +should all be small. +The instruments tested may be either excluded or included exogenous variables. +If excluded exogenous variables are being tested, +the equation that does not use these orthogonality conditions +omits the suspect instruments from the excluded instruments. +If included exogenous variables are being tested, +the equation that does not use these orthogonality conditions +treats the suspect instruments as included endogenous variables. +To guarantee that the C statistic is non-negative in finite samples, +the estimated covariance matrix of the full set orthogonality conditions +is used to calculate both Sargan-Hansen statistics +(in the case of simple IV/2SLS, this amounts to using the MSE +from the unrestricted equation to calculate both Sargan statistics). +If estimation is by LIML, the C statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For further discussion, see Hayashi (2000), pp. 218-22 and pp. 232-34. + +{marker endogtest}{p}Endogeneity tests of one or more endogenous regressors +can implemented using the {cmd:endog} option. +Under the null hypothesis that the specified endogenous regressors +can actually be treated as exogenous, the test statistic is distributed +as chi-squared with degrees of freedom equal to the number of regressors tested. +The endogeneity test implemented by {cmd:ivreg28}, is, like the C statistic, +defined as the difference of two Sargan-Hansen statistics: +one for the equation with the smaller set of instruments, +where the suspect regressor(s) are treated as endogenous, +and one for the equation with the larger set of instruments, +where the suspect regressors are treated as exogenous. +Also like the C statistic, the estimated covariance matrix used +guarantees a non-negative test statistic. +Under conditional homoskedasticity, +this endogeneity test statistic is numerically equal to +a Hausman test statistic; see Hayashi (2000, pp. 233-34). +The endogeneity test statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg28} by the command {cmd:ivendog}. +Unlike the Durbin-Wu-Hausman tests reported by {cmd:ivendog}, +the {cmd:endog} option of {cmd:ivreg28} can report test statistics +that are robust to various violations of conditional homoskedasticity; +the {cmd:ivendog} option unavailable in {cmd:ivreg28} +is the Wu-Hausman F-test version of the endogeneity test. +See help {help ivendog} (if installed). + +{marker s_relevance}{dlgtab:Tests of under- and weak identification and instrument redundancy} + +{marker cancortest}{p}{cmd:ivreg28} automatically reports tests of +both underidentification and weak identification. +The Anderson (1984) canonical correlations test is +a likelihood-ratio test of whether the equation is identified, +i.e., that the excluded instruments are "relevant", +meaning correlated with the endogenous regressors. +The null hypothesis of the test is that +the matrix of reduced form coefficients has rank=K-1 +where K=number of regressors, +i.e, that the equation is underidentified. +Under the null of underidentification, +the statistic is distributed as chi-squared +with degrees of freedom=(L-K+1) +where L=number of instruments (included+excluded). +A rejection of the null indicates that the model is identified. +{it:Important}: a result of rejection of the null +should be treated with caution, +because weak instrument problems may still be present. +See Hall et al. (1996) for a discussion of this test, +and below for discussion of testing for the presence of weak instruments. +Note: the Anderson canonical correlations test assumes the regressors are distributed +as multivariate normal. + +{marker cdtest}{p}The test for weak identification automatically reported +by {cmd:ivreg28} is based on the Cragg-Donald (1993) F statistic, +a close relative of the Anderson canonical correlations statistic. +Denoting the minimum eigenvalue of the canonical correlations as CCEV +and the minimum eigenvalue of the Cragg-Donald statistic as CDEV, +CDEV=CCEV/(1-CCEV), +the Anderson LR test statistic is -N*ln(1-CCEV) and +the Cragg-Donald F statistic is CDEV*(N-L)/L2, +where L is the number of instruments and L2 is the number of excluded instruments. +"Weak identification" arises when the excluded instruments are correlated +with the endogeous regressors, but only weakly. +Estimators can perform poorly when instruments are weak, +and different estimators are more robust to weak instruments (e.g., LIML) +than others (e.g., IV); +see, e.g., Stock and Yogo (2002, 2005) for further discussion. +Stock and Yogo (2005) have compiled critical values +for the Cragg-Donald F statistic for +several different estimators (IV, LIML, Fuller-LIML), +several different definitions of "perform poorly" (based on bias and test size), +and a range of configurations (up to 100 excluded instruments +and up to 2 or 3 endogenous regressors, +depending on the estimator). +{cmd:ivreg28} will report the Stock-Yogo critical values +if these are available; +missing values mean that the critical values +haven't been tabulated or aren't applicable. +See Stock and Yogo (2002, 2005) for details. +The critical values reported by {cmd:ivreg28} for +(2-step) GMM are the IV critical values, +and the critical values reported for CUE are the LIML +critical values. +Note that the test statistic and the critical values +assume conditional homoskedasticity and independence. +In the special case of a single endogenous regressor, +a robust test statistic for weak instruments is available +with the {cmd:first} or {cmd:ffirst} options; +see below under {help ivreg28##s_first:First stage regressions}. + +{marker redtest}{p}The {cmd:redundant} option allows a test of +whether a subset of excluded instruments is "redundant". +Excluded instruments are redundant if the asymptotic efficiency +of the estimation is not improved by using them. +The test statistic is a likelihood-ratio test +based on the canonical correlations +between the regressors and the instruments with, +and without, the instruments being tested. +Under the null that the specified instruments are redundant, +the statistic is distributed as chi-squared +with degrees of freedom=(#endogenous regressors)*(#instruments tested). +Rejection of the null indicates that +the instruments are not redundant. +See Hall and Peixe (2000) for further discussion of this test. +Note: this test assumes the regressors are distributed +as multivariate normal. + +{p}Calculation and reporting of all underidentification +and weak identification statistics +can be supressed with the {cmd:noid} option. + +{marker s_first}{dlgtab:First stage regressions, identification, and weak-id-robust inference} + +{marker partialr2}{p}The {cmd:first} and {cmd:ffirst} options report +various first-stage results and identification statistics. +Both the Anderson canonical correlations likelihood-ratio test statistic +-N*ln(1-EV) +and its close relative, +the chi-squared version of the Cragg-Donald (1993) test statistic +N*(EV/(1-EV)), are reported; +both are tests of whether the equation is identified (see {help ivreg28##s_relevance:above}). +The first-stage results also include Shea's (1997) "partial R-squared" measure +of instrument relevance that takes +intercorrelations among instruments into account, +the more common form of "partial R-squared" +(a.k.a. the "squared partial correlation" between the excluded +instruments and the endogenous regressor in question), +and the F-test of the excluded instruments +in the corresponding first-stage regression. +When the model has only one endogenous regressor, +(a) the two measures of "partial R-squared" coincide; +(b) the F-stat form of the Cragg-Donald statistic +coincides with the (non-robust) first-stage F-test +of the excluded instruments. +The two partial R-squared measures, the F statistic, +the degrees of freedom of the F statistic, +and the p-value of the F statistic for each endogenous variable +are saved in the matrix e(first). +The first-stage results are always reported with small-sample statistics, +to be consistent with the recommended use of the first-stage F-test as a diagnostic. +If the estimated equation is reported with robust standard errors, +the first-stage F-test is also robust. +Note that in the special case of only one endogenous regressor, +this provides a robust test of weak or underidentification. + +{marker wirobust}{p}The first-stage output also includes +two statistics that provide weak-instrument robust inference +for testing the significance of the endogenous regressors +in the structural equation being estimated. +The first statistic is the Anderson-Rubin (1949) test +(not to be confused with the Anderson-Rubin overidentification test for LIML estimation; +see {help ivreg28##s_liml:above}). +The second is the closely related Stock-Wright (2000) S statistic. +The null hypothesis tested in both cases +is that the coefficients of the endogenous +regressors in the structural equation are jointly equal to zero, +and, in addition, +that the overidentifying restrictions are valid. +Both tests are robust to the presence of weak instruments. +The tests are equivalent to estimating +the reduced form of the equation +(with the full set of instruments as regressors) +and testing that the coefficients of the excluded instruments +are jointly equal to zero. +In the form reported by {cmd:ivreg28}, +the Anderson-Rubin statistic is a Wald test +and the Stock-Watson statistic is a GMM-distance test. +Both statistics are distributed as chi-squared +with L2 degrees of freedom, where L2=number of excluded instruments. +The traditional F-stat version of the Anderson-Rubin test is also reported. +See Stock and Watson (2000), Dufour (2003), Chernozhukov and Hansen (2005) and Kleibergen (2007) +for further discussion. +For related alternative test statistics that are also robust to weak instruments, +see {help condivreg} and the corresponding discussion +in Moreira and Poi (2003) and Mikusheva and Poi (2006). + +{p}The {cmd:savefirst} option requests that +the individual first-stage regressions are saved +for later access using the {cmd:estimates} command. +If saved, they can also be displayed using +{cmd:first} or {cmd:ffirst} and the {cmd:ivreg28} replay syntax. +The regressions are saved with the prefix "_ivreg28_", +unless the user specifies an alternative prefix with the +{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} +option. + +{marker s_rf}{dlgtab:Reduced form estimates} + +{p}The {cmd:rf} option requests that +the reduced form estimation of the equation be displayed. +The {cmd:saverf} option requests that +the reduced form estimation is saved +for later access using the {cmd:estimates} command. +If saved, it can also be displayed using the +{cmd:rf} and the {cmd:ivreg28} replay syntax. +The regression is saved with the prefix "_ivreg28_", +unless the user specifies an alternative prefix with the +{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} +option. + +{marker s_fwl}{dlgtab:Estimating the Frisch-Waugh-Lovell regression} + +{marker fwl}{p}The {cmd:fwl(}{it:varlist}{cmd:)} option requests that +the exogenous regressors in {it:varlist} are "partialled out" +from all the other variables +(other regressors and excluded instruments) in the estimation. +If the equation includes a constant, +it is also automatically partialled out as well. +The coefficients corresponding to the regressors in {it:varlist} +are not calculated. +By the Frisch-Waugh-Lovell (FWL) theorem, +the coefficients for the remaining regressors +are the same as those that would be obtained +if the variables were not partialled out. +The {cmd:fwl} option is most useful when using {cmd:cluster} +and #clusters < (#exogenous regressors + #excluded instruments). +In these circumstances, +the covariance matrix of orthogonality conditions S is not of full rank, +and efficient GMM and overidentification tests are infeasible +since the optimal weighting matrix W = {bind:S^-1} +cannot be calculated. +The problem can be addressed by using {cmd:fwl} +to partial out enough exogenous regressors for S to have full rank. +A similar problem arises when the regressors include a variable that is a singleton dummy, +i.e., a variable with one 1 and N-1 zeros or vice versa, +if a robust covariance matrix is requested. +The singleton dummy causes the robust covariance matrix estimator to be +less than full rank. +In this case, partialling-out the variable with the singleton dummy +solves the problem. +Specifying {cmd:fwl(_cons)} will cause just the constant to be partialled-out, +i.e., the equation will be estimated in deviations-from-means form. +Note that variable counts are not adjusted for the partialled-out variables. +This means that the model degrees of freedom +do not include the partialled-out variables, +and any small-sample statistics such as t or F statistics +will be affected. +Also note that after estimation using the {cmd:fwl} option, +the post-estimation {cmd:predict} can be used only to generate residuals, +and that in the current implementation, +{cmd:fwl} is not compatible with instruments (included or excluded) +that use time-series operators. + +{marker s_ols}{dlgtab:OLS and Heteroskedastic OLS (HOLS) estimation} + +{p}{cmd:ivreg28} also allows straightforward OLS estimation +by using the same syntax as {cmd:regress}, i.e., +{it:ivreg28 depvar varlist1}. +This can be useful if the user wishes to use one of the +features of {cmd:ivreg28} in OLS regression, e.g., AC or +HAC standard errors. + +{p}If the list of endogenous variables {it:varlist2} is empty +but the list of excluded instruments {it:varlist_iv} is not, +and the option {cmd:gmm} is specified, +{cmd:ivreg28} calculates Cragg's "heteroskedastic OLS" (HOLS) estimator, +an estimator that is more efficient than OLS +in the presence of heteroskedasticity of unknown form +(see Davidson and MacKinnon (1993), pp. 599-600). +If the option {cmd:bw(}{it:#}{cmd:)} is specified, +the HOLS estimator is efficient in the presence of +arbitrary autocorrelation; +if both {cmd:bw(}{it:#}{cmd:)} and {cmd:robust} are specified +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and autocorrelation; +and if {cmd:cluster(}{it:varname}{cmd:)} is used, +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and within-group correlation. +The efficiency gains of HOLS derive from the orthogonality conditions +of the excluded instruments listed in {it:varlist_iv}. +If no endogenous variables are specified and {cmd:gmm} is not specified, +{cmd:ivreg28} reports standard OLS coefficients. +The Sargan-Hansen statistic reported +when the list of endogenous variables {it:varlist2} is empty +is a Lagrange multiplier (LM) test +of the hypothesis that the excluded instruments {it:varlist_iv} are +correctly excluded from the restricted model. +If the estimation is LIML, the LM statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For more on LM tests, see e.g. Wooldridge (2002), pp. 58-60. +Note that because the approach of the HOLS estimator +has applications beyond heteroskedastic disturbances, +and to avoid confusion concerning the robustness of the estimates, +the estimators presented above as "HOLS" +are described in the output of {cmd:ivreg28} +as "2-Step GMM", "CUE", etc., as appropriate. + +{marker s_collin}{dlgtab:Collinearities} + +{p}{cmd:ivreg28} checks the lists of included instruments, +excluded instruments, and endogenous regressors +for collinearities and duplicates. If an endogenous regressor is +collinear with the instruments, it is reclassified as exogenous. If any +endogenous regressors are collinear with each other, some are dropped. +If there are any collinearities among the instruments, some are dropped. +In Stata 9+, excluded instruments are dropped before included instruments. +If any variables are dropped, a list of their names are saved +in the macros {cmd:e(collin)} and/or {cmd:e(dups)}. +Lists of the included and excluded instruments +and the endogenous regressors with collinear variables and duplicates removed +are also saved in macros with "1" appended +to the corresponding macro names. + +{p}Collinearity checks can be supressed with the {cmd:nocollin} option. + +{marker s_speed}{dlgtab:Speed options: nocollin and noid} + +{p}Two options are available for speeding execution. +{cmd:nocollin} specifies that the collinearity checks not be performed. +{cmd:noid} suspends calculation and reporting of +the underidentification and weak identification statistics +in the main output. + +{marker s_small}{dlgtab:Small sample corrections} + +{p}Mean square error = sqrt(RSS/(N-K)) if {cmd:small}, = sqrt(RSS/N) otherwise. + +{p}If {cmd:robust} is chosen, the finite sample adjustment +(see {hi:[R] regress}) to the robust variance-covariance matrix +qc = N/(N-K) if {cmd:small}, qc = 1 otherwise. + +{p}If {cmd:cluster} is chosen, the finite sample adjustment +qc = (N-1)/(N-K)*M/(M-1) if {cmd:small}, where M=number of clusters, +qc = 1 otherwise. + +{p}The Sargan and C (difference-in-Sargan) statistics use +error variance = RSS/N, i.e., there is no small sample correction. + +{p}A full discussion of these computations and related topics +can be found in Baum, Schaffer, and Stillman (2003) and Baum, Schaffer and +Stillman (2007). Some features of the program postdate the 2003 article. + + +{marker s_options}{title:Options summary} + +{p 0 4}{cmd:gmm} requests the two-step efficient GMM estimator. +If no endogenous variables are specified, the estimator is Cragg's HOLS estimator. +See help {help ivgmm0} (if installed) for more details. + +{p 0 4}{cmd:bw(}{it:#}{cmd:)} impements AC or HAC covariance estimation +with bandwidth equal to {it:#}, where {it:#} is an integer greater than zero. +Specifying {cmd:robust} implements HAC covariance estimation; +omitting it implements AC covariance estimation. + +{p 0 4}{cmd:kernel(}{it:string)}{cmd:)} specifies the kernel +to be used for AC and HAC covariance estimation; +the default kernel is Bartlett (also known in econometrics +as Newey-West). Other kernels available are (abbreviations in parentheses): +Truncated (tru); Parzen (par); Tukey-Hanning (thann); Tukey-Hamming (thamm); +Daniell (dan); Tent (ten); and Quadratic-Spectral (qua or qs). + +{p 4 4}Note: in the cases of the Bartlett, Parzen, +and Tukey-Hanning/Hamming kernels, the number of lags used +to construct the kernel estimate equals the bandwidth minus one. +Stata's official {cmd:newey} implements +HAC standard errors based on the Bartlett kernel, +and requires the user to specify +the maximum number of lags used and not the bandwidth; +see help {help newey}. +If these kernels are used with {cmd:bw(1)}, +no lags are used and {cmd:ivreg28} will report the usual +Eicker/Huber/White/sandwich variance estimates. + +{p 0 4}{cmd:liml} requests the limited-information maximum likelihood estimator. + +{p 0 4}{cmd:fuller(}{it:#}{cmd:)} specifies that Fuller's modified LIML estimator +is calculated using the user-supplied Fuller parameter alpha, +a non-negative number. +Alpha=1 has been suggested as a good choice. + +{p 0 4}{cmd:kclass(}{it:#}{cmd:)} specifies that a general k-class estimator is calculated +using the user-supplied #, a non-negative number. + +{p 0 4}{cmd:coviv} specifies that the matrix used to calculate the +covariance matrix for the LIML or k-class estimator +is based on the 2SLS matrix, i.e., with k=1. +In this case the covariance matrix will differ from that calculated for the 2SLS +estimator only because the estimate of the error variance will differ. +The default is for the covariance matrix to be based on the LIML or k-class matrix. + +{p 0 4}{cmd:cue} requests the GMM continuously-updated estimator (CUE). + +{p 0 4}{cmd:cueinit(}{it:matrix}{cmd:)} specifies that the starting values +for the CUE estimator use those in a user-supplied matrix b. +If omitted, the default behavior is to use starting values +from IV or 2-step efficient GMM estimation. + +{p 0 4}{cmd:cueopt(}{it:string}{cmd:)} passes user-specified options +to Stata's {cmd:ml} routine; see help {help ml}. + +{p 0 4}{cmd:robust} specifies that the Eicker/Huber/White/sandwich estimator of +variance is to be used in place of the traditional calculation. {cmd:robust} +combined with {cmd:cluster()} further allows residuals which are not +independent within cluster (although they must be independent between +clusters). See {hi:[U] Obtaining robust variance estimates}. + +{p 0 4}{cmd:cluster}{cmd:(}{it:varname}{cmd:)} specifies that the observations +are independent across groups (clusters) but not necessarily independent +within groups. {it:varname} specifies to which group each observation +belongs; e.g., {cmd:cluster(personid)} in data with repeated observations on +individuals. {cmd:cluster()} can be used with {help pweight}s to produce +estimates for unstratified cluster-sampled data, but see help {help svyreg} +for a command especially designed for survey data. Specifying {cmd:cluster()} +implies {cmd:robust}. + +{p 0 4}{cmd:orthog}{cmd:(}{it:varlist_ex}{cmd:)} requests that a C-statistic +be calculated as a test of the exogeneity of the instruments in {it:varlist_ex}. +These may be either included or excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instruments must still be identified. + +{p 0 4}{cmd:endog}{cmd:(}{it:varlist_en}{cmd:)} requests that a C-statistic +be calculated as a test of the endogeneity +of the endogenous regressors in {it:varlist_en}. + +{p 0 4}{cmd:redundant}{cmd:(}{it:varlist_ex}{cmd:)} requests a likelihood-ratio test +of the redundancy of the instruments in {it:varlist_ex}. +These must be excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instrumenst must still be identified. + +{p 0 4}{cmd:small} requests that small-sample statistics (F and t-statistics) +be reported instead of large-sample statistics (chi-squared and z-statistics). +Large-sample statistics are the default. +The exception is the statistic for the significance of the regression, +which is always reported as a small-sample F statistic. + +{p 0 4}{cmd:noconstant} suppresses the constant term (intercept) in the +regression. If {cmd:noconstant} is specified, the constant term is excluded +from both the final regression and the first-stage regression. To include a +constant in the first-stage when {cmd:noconstant} is specified, explicitly +include a variable containing all 1's in {it:varlist_iv}. + +{p 0 4}{cmd:first} requests that the full first-stage regression results be displayed, +along with the associated diagnostic and identification statistics. + +{p 0 4}{cmd:ffirst} requests the first-stage diagnostic and identification statistics. +The results are saved in various e() macros. + +{p 0 4}{cmd:nocollin} suppresses the checks for collinearities +and duplicate variables. + +{p 0 4}{cmd:noid} suppresses the calculation and reporting +of underidentification and weak identification statistics. + +{p 0 4}{cmd:savefirst} requests that the first-stage regressions results +are saved for later access using the {cmd:estimates} command. +The names under which the first-stage regressions are saved +are the names of the endogenous regressors prefixed by "_ivreg28_". +If these use Stata's time-series operators, +the "." is replaced by a "_". +The maximum number of first-stage estimation results that can be saved +depends on how many other estimation results the user has already saved +and on the maximum supported by Stata (20 for Stata 8.2 and 9.0, 300 for Stata 9.1). + +{p 0 4}{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the first-stage regression results be saved using the user-specified prefix +instead of the default "_ivreg28_". + +{p 0 4}{cmd:rf} requests that the reduced-form estimation of the equation +be displayed. + +{p 0 4}{cmd:saverf} requests that the reduced-form estimation of the equation +be saved for later access using the {cmd:estimates} command. +The estimation is stored under the name of the dependent variable +prefixed by "_ivreg28_". +If this uses Stata's time-series operators, +the "." is replaced by a "_". + +{p 0 4}{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the reduced-form estimation be saved using the user-specified prefix +instead of the default "_ivreg28_". + +{p 0 4}{cmd:level(}{it:#}{cmd:)} specifies the confidence level, in percent, +for confidence intervals of the coefficients; see help {help level}. + +{p 0 4}{cmd:noheader}, {cmd:eform()}, {cmd:depname()} and {cmd:plus} +are for ado-file writers; see {hi:[R] ivreg} and {hi:[R] regress}. + +{p 0 4}{cmd:nofooter} suppresses the display of the footer containing +identification and overidentification statistics, +exogeneity and endogeneity tests, +lists of endogenous variables and instruments, etc. + +{p 0 4}{cmd:version} causes {cmd:ivreg28} to display its current version number +and to leave it in the macro {cmd:e(version)}. +It cannot be used with any other options. +and will clear any existing {cmd:e()} saved results. + +{marker s_macros}{title:Remarks and saved results} + +{p}{cmd:ivreg28} does not report an ANOVA table. +Instead, it reports the RSS and both the centered and uncentered TSS. +It also reports both the centered and uncentered R-squared. +NB: the TSS and R-squared reported by official {cmd:ivreg} is centered +if a constant is included in the regression, and uncentered otherwise. + +{p}{cmd:ivreg28} saves the following results in {cmd:e()}: + +Scalars +{col 4}{cmd:e(N)}{col 18}Number of observations +{col 4}{cmd:e(yy)}{col 18}Total sum of squares (SS), uncentered (y'y) +{col 4}{cmd:e(yyc)}{col 18}Total SS, centered (y'y - ((1'y)^2)/n) +{col 4}{cmd:e(rss)}{col 18}Residual SS +{col 4}{cmd:e(mss)}{col 18}Model SS =yyc-rss if the eqn has a constant, =yy-rss otherwise +{col 4}{cmd:e(df_m)}{col 18}Model degrees of freedom +{col 4}{cmd:e(df_r)}{col 18}Residual degrees of freedom +{col 4}{cmd:e(r2u)}{col 18}Uncentered R-squared, 1-rss/yy +{col 4}{cmd:e(r2c)}{col 18}Centered R-squared, 1-rss/yyc +{col 4}{cmd:e(r2)}{col 18}Centered R-squared if the eqn has a constant, uncentered otherwise +{col 4}{cmd:e(r2_a)}{col 18}Adjusted R-squared +{col 4}{cmd:e(ll)}{col 18}Log likelihood +{col 4}{cmd:e(rankxx)}{col 18}Rank of the matrix of observations on rhs variables=K +{col 4}{cmd:e(rankzz)}{col 18}Rank of the matrix of observations on instruments=L +{col 4}{cmd:e(rankV)}{col 18}Rank of covariance matrix V of coefficients +{col 4}{cmd:e(rankS)}{col 18}Rank of covariance matrix S of orthogonality conditions +{col 4}{cmd:e(rmse)}{col 18}root mean square error=sqrt(rss/(N-K)) if -small-, =sqrt(rss/N) otherwise +{col 4}{cmd:e(F)}{col 18}F statistic +{col 4}{cmd:e(N_clust)}{col 18}Number of clusters +{col 4}{cmd:e(bw)}{col 18}Bandwidth +{col 4}{cmd:e(lambda)}{col 18}LIML eigenvalue +{col 4}{cmd:e(kclass)}{col 18}k in k-class estimation +{col 4}{cmd:e(fuller)}{col 18}Fuller parameter alpha +{col 4}{cmd:e(sargan)}{col 18}Sargan statistic +{col 4}{cmd:e(sarganp)}{col 18}p-value of Sargan statistic +{col 4}{cmd:e(sargandf)}{col 18}dof of Sargan statistic = degree of overidentification = L-K +{col 4}{cmd:e(j)}{col 18}Hansen J statistic +{col 4}{cmd:e(jp)}{col 18}p-value of Hansen J statistic +{col 4}{cmd:e(jdf)}{col 18}dof of Hansen J statistic = degree of overidentification = L-K +{col 4}{cmd:e(arubin)}{col 18}Anderson-Rubin overidentification LR statistic +{col 4}{cmd:e(arubinp)}{col 18}p-value of Anderson-Rubin overidentification LR statistic +{col 4}{cmd:e(arubindf)}{col 18}dof of A-R overid statistic = degree of overidentification = L-K +{col 4}{cmd:e(idstat)}{col 18}Anderson canonical correlations LR statistic +{col 4}{cmd:e(idp)}{col 18}p-value of Anderson canonical correlations LR statistic +{col 4}{cmd:e(iddf)}{col 18}dof of Anderson canonical correlations LR statistic +{col 4}{cmd:e(cdf)}{col 18}Cragg-Donald F statistic +{col 4}{cmd:e(cdchi2)}{col 18}Cragg-Donald chi-sq statistic +{col 4}{cmd:e(cdchi2p)}{col 18}p-value of Cragg-Donald chi-sq statistic +{col 4}{cmd:e(arf)}{col 18}Anderson-Rubin F-test of significance of endogenous regressors +{col 4}{cmd:e(arfp)}{col 18}p-value of Anderson-Rubin F-test of endogenous regressors +{col 4}{cmd:e(archi2)}{col 18}Anderson-Rubin chi-sq test of significance of endogenous regressors +{col 4}{cmd:e(archi2p)}{col 18}p-value of Anderson-Rubin chi-sq test of endogenous regressors +{col 4}{cmd:e(ardf)}{col 18}degrees of freedom of Anderson-Rubin tests of endogenous regressors +{col 4}{cmd:e(ardf_r)}{col 18}denominator degrees of freedom of AR F-test of endogenous regressors +{col 4}{cmd:e(redstat)}{col 18}LR statistic for instrument redundancy +{col 4}{cmd:e(redp)}{col 18}p-value of LR statistic for instrument redundancy +{col 4}{cmd:e(reddf)}{col 18}dof of LR statistic for instrument redundancy +{col 4}{cmd:e(cstat)}{col 18}C-statistic +{col 4}{cmd:e(cstatp)}{col 18}p-value of C-statistic +{col 4}{cmd:e(cstatdf)}{col 18}Degrees of freedom of C-statistic +{col 4}{cmd:e(cons)}{col 18}1 when equation has a Stata-supplied constant; 0 otherwise +{col 4}{cmd:e(fwlcons)}{col 18}as above but prior to partialling-out (see {cmd:e(fwl)}) + +Macros +{col 4}{cmd:e(cmd)}{col 18}ivreg28 +{col 4}{cmd:e(version)}{col 18}Version number of ivreg28 +{col 4}{cmd:e(model)}{col 18}ols, iv, gmm, liml, or kclass +{col 4}{cmd:e(depvar)}{col 18}Name of dependent variable +{col 4}{cmd:e(instd)}{col 18}Instrumented (RHS endogenous) variables +{col 4}{cmd:e(insts)}{col 18}Instruments +{col 4}{cmd:e(inexog)}{col 18}Included instruments (regressors) +{col 4}{cmd:e(exexog)}{col 18}Excluded instruments +{col 4}{cmd:e(collin)}{col 18}Variables dropped because of collinearities +{col 4}{cmd:e(dups)}{col 18}Duplicate variables +{col 4}{cmd:e(ecollin)}{col 18}Endogenous variables reclassified as exogenous because of +{col 20}collinearities with instruments +{col 4}{cmd:e(clist)}{col 18}Instruments tested for orthogonality +{col 4}{cmd:e(redlist)}{col 18}Instruments tested for redundancy +{col 4}{cmd:e(fwl)}{col 18}Partialled-out exogenous regressors +{col 4}{cmd:e(small)}{col 18}small +{col 4}{cmd:e(wtype)}{col 18}weight type +{col 4}{cmd:e(wexp)}{col 18}weight expression +{col 4}{cmd:e(clustvar)}{col 18}Name of cluster variable +{col 4}{cmd:e(vcetype)}{col 18}Covariance estimation method +{col 4}{cmd:e(kernel)}{col 18}Kernel +{col 4}{cmd:e(tvar)}{col 18}Time variable +{col 4}{cmd:e(ivar)}{col 18}Panel variable +{col 4}{cmd:e(firsteqs)}{col 18}Names of stored first-stage equations +{col 4}{cmd:e(rfeq)}{col 18}Name of stored reduced-form equation +{col 4}{cmd:e(predict)}{col 18}Program used to implement predict + +Matrices +{col 4}{cmd:e(b)}{col 18}Coefficient vector +{col 4}{cmd:e(V)}{col 18}Variance-covariance matrix of the estimators +{col 4}{cmd:e(S)}{col 18}Covariance matrix of orthogonality conditions +{col 4}{cmd:e(W)}{col 18}GMM weighting matrix (=inverse of S if efficient GMM estimator) +{col 4}{cmd:e(first)}{col 18}First-stage regression results +{col 4}{cmd:e(ccev)}{col 18}Eigenvalues corresponding to the Anderson canonical correlations test +{col 4}{cmd:e(cdev)}{col 18}Eigenvalues corresponding to the Cragg-Donald test + +Functions +{col 4}{cmd:e(sample)}{col 18}Marks estimation sample + + + +{marker s_examples}{title:Examples} + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta" : . use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta }{p_end} +{p 8 12}(Wages of Very Young Men, Zvi Griliches, J.Pol.Ec. 1976) + +{p 8 12}{stata "xi i.year" : . xi i.year} + +{col 0}(Instrumental variables. Examples follow Hayashi 2000, p. 255.) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt)" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt)} + +{p 8 12}{stata "ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), small ffirst" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), small ffirst} + +{col 0}(Testing for the presence of heteroskedasticity in IV/GMM estimation) + +{p 8 12}{stata "ivhettest, fitlev" : . ivhettest, fitlev} + +{col 0}(Two-step GMM efficient in the presence of arbitrary heteroskedasticity) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm} + +{p 0}(Continuously-updated GMM (CUE) efficient in the presence of arbitrary heteroskedasticity. NB: may require 50+ iterations.) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust} + +{col 0}(Sargan-Basmann tests of overidentifying restrictions for IV estimation) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt)" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt)} + +{p 8 12}{stata "overid, all" : . overid, all} + +{col 0}(Tests of exogeneity and endogeneity) + +{col 0}(Test the exogeneity of 1 regressor) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm orthog(s)" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm orthog(s)} + +{col 0}(Test the exogeneity of 2 excluded instruments) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm orthog(age mrt)" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm orthog(age mrt)} + +{col 0}(Frisch-Waugh-Lovell (FWL): equivalence of estimations with and without partialling-out) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns _I* (iq=kww age), cluster(year)" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age), cluster(year)} + +{p 8 12}{stata "ivreg28 lw s expr tenure rns _I* (iq=kww age), cluster(year) fwl(_I*)" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age), cluster(year) fwl(_I*)} + +{col 0}(FWL: efficient GMM with #clusters<#instruments feasible after partialling-out) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns _I* (iq=kww age), cluster(year) fwl(_I*) gmm" : . ivreg28 lw s expr tenure rns smsa (iq=med kww age), cluster(year) fwl(_I*) gmm} + +{col 0}(Examples following Wooldridge 2002, pp.59, 61) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta" : . use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta } + +{col 0}(Test an excluded instrument for redundancy) + +{p 8 12}{stata "ivreg28 lwage exper expersq (educ=age kidslt6 kidsge6), redundant(age)" : . ivreg28 lwage exper expersq (educ=age kidslt6 kidsge6), redundant(age)} + +{col 0}(Equivalence of DWH endogeneity test when regressor is endogenous...) + +{p 8 12}{stata "ivreg28 lwage exper expersq (educ=age kidslt6 kidsge6)" : . ivreg28 lwage exper expersq (educ=age kidslt6 kidsge6)} + +{p 8 12}{stata "ivendog educ" :. ivendog educ} + +{col 0}(... endogeneity test using the {cmd:endog} option) + +{p 8 12}{stata "ivreg28 lwage exper expersq (educ=age kidslt6 kidsge6), endog(educ)" : . ivreg28 lwage exper expersq educ (educ=age kidslt6 kidsge6), endog(educ)} + +{col 0}(...and C-test of exogeneity when regressor is exogenous, using the {cmd:orthog} option) + +{p 8 12}{stata "ivreg28 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)" : . ivreg28 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)} + +{col 0}(Heteroskedastic Ordinary Least Squares, HOLS) + +{p 8 12}{stata "ivreg28 lwage exper expersq educ (=age kidslt6 kidsge6), gmm" : . ivreg28 lwage exper expersq educ (=age kidslt6 kidsge6), gmm} + +{col 0}(LIML and k-class estimation using Klein data) + +{col 9}{stata "use http://fmwww.bc.edu/repec/bocode/k/kleinI" :. use http://fmwww.bc.edu/repec/bocode/k/kleinI} + +{col 0}(LIML estimates of Klein's consumption function) + +{p 8 12}{stata "ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml" :. ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml} + +{col 0}(Equivalence of LIML and CUE+homoskedasticity+independence) + +{p 8 12}{stata "ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml coviv" :. ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml coviv} + +{p 8 12}{stata "ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), cue" :. ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), cue} + +{col 0}(Fuller's modified LIML with alpha=1) + +{p 8 12}{stata "ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), fuller(1)" :. ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), fuller(1)} + +{col 0}(k-class estimation with Nagar's bias-adjusted IV, k=1+(L-K)/N=1+4/21=1.19) + +{p 8 12}{stata "ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), kclass(1.19)" :. ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), kclass(1.19)} + +{col 0}(Kernel-based covariance estimation using time-series data) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta" :. use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta} + +{p 8 12}{stata "tsset year, yearly" :. tsset year, yearly} + +{col 0}(Autocorrelation-consistent (AC) inference in an OLS Regression) + +{p 8 12}{stata "ivreg28 cinf unem, bw(3)" :. ivreg28 cinf unem, bw(3)} + +{col 0}(Heteroskedastic and autocorrelation-consistent (HAC) inference in an OLS regression) + +{p 8 12}{stata "ivreg28 cinf unem, bw(3) kernel(bartlett) robust small" :. ivreg28 cinf unem, bw(3) kernel(bartlett) robust small} + +{p 8 12}{stata "newey cinf unem, lag(2)" :. newey cinf unem, lag(2)} + +{col 0}(AC and HAC in IV and GMM estimation) + +{p 8 12}{stata "ivreg28 cinf (unem = l(1/3).unem), bw(3)" :. ivreg28 cinf (unem = l(1/3).unem), bw(3)} + +{p 8 12}{stata "ivreg28 cinf (unem = l(1/3).unem), bw(3) gmm kernel(thann)" :. ivreg28 cinf (unem = l(1/3).unem), bw(3) gmm kernel(thann)} + +{p 8 12}{stata "ivreg28 cinf (unem = l(1/3).unem), bw(3) gmm kernel(qs) robust orthog(l1.unem)" :. ivreg28 cinf (unem = l(1/3).unem), bw(3) gmm kernel(qs) robust orthog(l1.unem)} + +{col 0}(Examples using Large N, Small T Panel Data) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta" : . use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta }{p_end} +{p 8 12}(Layard & Nickell, Unemployment in Britain, Economica 53, 1986, from Ox dist) + +{p 8 12}{stata "tsset id year" :. tsset id year} + +{col 0}(Autocorrelation-consistent inference in an IV regression) + +{p 8 12}{stata "ivreg28 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(1) kernel(tru)": . ivreg28 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(1) kernel(tru)} + +{col 0}(Two-step effic. GMM in the presence of arbitrary heteroskedasticity and autocorrelation) + +{p 8 12}{stata "ivreg28 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(2) gmm kernel(tru) robust": . ivreg28 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(2) gmm kernel(tru) robust} + +{col 0}(Two-step effic. GMM in the presence of arbitrary heterosked. and intra-group correlation) + +{p 8 12}{stata "ivreg28 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm cluster(id)": . ivreg28 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm cluster(id)} + + +{marker s_refs}{title:References} + +{p 0 4}Anderson, T.W. 1984. Introduction to Multivariate Statistical Analysis. +2d ed. New York: John Wiley & Sons. + +{p 0 4}Anderson, T. W., and H. Rubin. 1949. Estimation of the parameters of a single equation +in a complete system of stochastic equations. Annals of Mathematical Statistics, Vol. 20, +pp. 46-63. + +{p 0 4}Anderson, T. W., and H. Rubin. 1950. The asymptotic properties of estimates of the parameters of a single +equation in a complete system of stochastic equations. Annals of Mathematical Statistics, +Vol. 21, pp. 570-82. + +{p 0 4}Baum, C.F., Schaffer, M.E., and Stillman, S. 2003. Instrumental Variables and GMM: +Estimation and Testing. The Stata Journal, Vol. 3, No. 1, pp. 1-31. +Working paper version: Boston College Department of Economics Working Paper No 545. +{browse "http://ideas.repec.org/p/boc/bocoec/545.html":http://ideas.repec.org/p/boc/bocoec/545.html} + +{p 0 4}Baum, C. F., Schaffer, M. E., and Stillman, S. 2007. Enhanced routines for +instrumental variables/GMM estimation and testing. Unpublished working paper, +forthcoming. + +{p 0 4}Chernozhukov, V. and Hansen, C. 2005. The Reduced Form: +A Simple Approach to Inference with Weak Instruments. +Working paper, University of Chicago, Graduate School of Business. + +{p 0 4}Cragg, J.G. and Donald, S.G. 1993. Testing Identfiability and Specification in +Instrumental Variables Models. Econometric Theory, Vol. 9, pp. 222-240. + +{p 0 4}Cushing, M.J. and McGarvey, M.G. 1999. Covariance Matrix Estimation. +In L. Matyas (ed.), Generalized Methods of Moments Estimation. +Cambridge: Cambridge University Press. + +{p 0 4}Davidson, R. and MacKinnon, J. 1993. Estimation and Inference in Econometrics. +1993. New York: Oxford University Press. + +{p 0 4}Dufour, J.M. 2003. Identification, Weak Instruments and Statistical Inference +in Econometrics. Canadian Journal of Economics, Vol. 36, No. 4, pp. 767-808. +Working paper version: CIRANO Working Paper 2003s-49. +http://www.cirano.qc.ca/pdf/publication/2003s-49.pdf + +{p 0 4}Hall, A.R. and Peixe, F.P.M. 2000. A Consistent Method for the Selection of +Relevant Instruments. Econometric Society World Congress 2000 Contributed papers. +http://econpapers.repec.org/paper/ecmwc2000/0790.htm + +{p 0 4}Hall, A.R., Rudebusch, G.D. and Wilcox, D.W. 1996. Judging Instrument Relevance in +Instrumental Variables Estimation. International Economic Review, Vol. 37, No. 2, pp. 283-298. + +{p 0 4}Hayashi, F. Econometrics. 2000. Princeton: Princeton University Press. + +{p 0 4}Hansen, L.P., Heaton, J., and Yaron, A. 1996. Finite Sample Properties +of Some Alternative GMM Estimators. Journal of Business and Economic Statistics, +Vol. 14, No. 3, pp. 262-280. + +{p 0 4}Kleibergen, F. 2007. Generalizing Weak Instrument Robust Statistics Towards +Multiple Parameters, Unrestricted Covariance Matrices and Identification Statistics. +Journal of Econometrics, forthcoming. + +{p 0 4}Mikusheva, A. and Poi, B.P. 2006. +Tests and confidence sets with correct size when instruments are potentially weak. +The Stata Journal, Vol. 6, No. 3, pp. 335-347. + +{p 0 4}Moreira, M.J. and Poi, B.P. 2003. Implementing Tests with the Correct Size +in the Simultaneous Equations Model. The Stata Journal, Vol. 3, No. 1, pp. 57-70. + +{p 0 4}Shea, J. 1997. Instrument Relevance in Multivariate Linear Models: +A Simple Measure. +Review of Economics and Statistics, Vol. 49, No. 2, pp. 348-352. + +{p 0 4}Stock, J.H. and Wright, J.H. 2000. GMM with Weak Identification. +Econometrica, Vol. 68, No. 5, September, pp. 1055-1096. + +{p 0 4}Stock, J.H. and Yogo, M. 2005. Testing for Weak Instruments in Linear IV Regression. +In D.W.K. Andrews and J.H. Stock, eds. Identification and Inference for Econometric Models: +Essays in Honor of Thomas Rothenberg. Cambridge: Cambridge University Press, 2005, pp. 80–108. +Working paper version: NBER Technical Working Paper 284. http://www.nber.org/papers/T0284. + +{p 0 4}Wooldridge, J.M. 2002. Econometric Analysis of Cross Section and Panel Data. +Cambridge, MA: MIT Press. + + +{marker s_acknow}{title:Acknowledgements} + +{p}We would like to thanks various colleagues who helped us along the way, including +David Drukker, +Austin Nichols, +Vince Wiggins, +and, not least, the users of {cmd:ivreg28} +who have provided suggestions, +spotted bugs, +and helped test the package. +We are also grateful to Jim Stock and Moto Yogo for permission to reproduce +their critical values for the Cragg-Donald statistic. + +{marker s_citation}{title:Citation of ivreg28} + +{p}{cmd:ivreg28} is not an official Stata command. It is a free contribution +to the research community, like a paper. Please cite it as such: {p_end} + +{phang}Baum, C.F., Schaffer, M.E., Stillman, S. 2007. +ivreg28: Stata module for extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression. +{browse "http://ideas.repec.org/c/boc/bocode/s425401.html":http://ideas.repec.org/c/boc/bocode/s425401.html}{p_end} + +{title:Authors} + + Christopher F Baum, Boston College, USA + baum@bc.edu + + Mark E Schaffer, Heriot-Watt University, UK + m.e.schaffer@hw.ac.uk + + Steven Stillman, Motu Economic and Public Policy Research + stillman@motu.org.nz + + +{title:Also see} + +{p 1 14}Manual: {hi:[U] 23 Estimation and post-estimation commands},{p_end} +{p 10 14}{hi:[U] 29 Overview of model estimation in Stata},{p_end} + {hi:[R] ivreg} +{p 0 19}On-line: help for {help ivreg}, {help newey}; +{help overid}, {help ivendog}, {help ivhettest}, {help ivreset}, +{help xtivreg28}, {help xtoverid}, +{help condivreg} (if installed); +{help est}, {help postest}; +{help regress}{p_end} diff --git a/ado/i/ivreg28_cue.ado b/ado/i/ivreg28_cue.ado new file mode 100644 index 0000000..edbba74 --- /dev/null +++ b/ado/i/ivreg28_cue.ado @@ -0,0 +1,24 @@ +! 1.0.4 4feb2007 +* 1.0.1 cfb updated to v8.2 +* 1.0.2 mes fixed col and row names mismatch +* 1.0.3 added noid option to supress unnecessary identification stats +* 1.0.4 added local `ivreg2_cmd'. ref only to e(j); e(sargan) no longer needed. + +program define ivreg28_cue + version 8.2 + args todo b lnf + local ivreg2_cmd "ivreg28" + tempname b1 J +* Need to make col and rownames match + mat `b1'=`b' +* Remove equation number from col names + local vn : colfullnames `b1' + local vn : subinstr local vn "eq1" "", all + mat colnames `b1' = `vn' +* Standard row name + mat rownames `b1' = y1 + qui `ivreg2_cmd' $IV_lhs $IV_inexog ($IV_endog=$IV_exexog) $IV_wt if $ML_samp==1, b0(`b1') $IV_opt noid + scalar `J'=e(j) + scalar `lnf' = -`J' +end + diff --git a/ado/i/ivreg28_p.ado b/ado/i/ivreg28_p.ado new file mode 100644 index 0000000..63bd9df --- /dev/null +++ b/ado/i/ivreg28_p.ado @@ -0,0 +1,97 @@ +*! version 1.0.6 30Jan2011 +*! author mes +* 1.0.1: 25apr2002 original version +* 1.0.2: 28jun2005 version 8.2 +* 1.0.3: 1Aug2006 complete rewrite plus fwl option +* 1.0.4: 26Jan2007 eliminated double reporting of #MVs +* 1.0.5: 2Feb2007 small fix to allow fwl of just _cons +* 1.0.6: 30Jan2011 re-introduced stdp (had been removed with fwl) +* and added labelling of created residual variable + +program define ivreg28_p + version 8.2 + syntax newvarname [if] [in] , [XB Residuals stdp] + marksample touse, novarlist + + local type "`xb'`residuals'`stdp'" + + if "`type'"=="" { + local type "xb" +di in gr "(option xb assumed; fitted values)" + } + + if "`e(fwlcons)'" != "" { +* fwl partial-out block + if "`type'" == "residuals" { + + tempvar esample + tempname ivres + gen byte `esample' = e(sample) + +* Need to strip out time series operators + local lhs "`e(depvar)'" + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + + local rhs : colnames(e(b)) + tsrevar `rhs', substitute + local rhs_t "`r(varlist)'" + + if "`e(fwl1)'" != "" { + local fwl "`e(fwl1)'" + } + else { + local fwl "`e(fwl)'" + } + tsrevar `fwl', substitute + local fwl_t "`r(varlist)'" + + if ~e(fwlcons) { + local noconstant "noconstant" + } + + local allvars "`lhs_t' `rhs_t'" +* Partial-out block. Uses estimatation sample to get coeffs, markout sample for predict + _estimates hold `ivres', restore + foreach var of local allvars { + tempname `var'_fwl + qui regress `var' `fwl' if `esample', `noconstant' + qui predict double ``var'_fwl' if `touse', resid + local allvars_fwl "`allvars_fwl' ``var'_fwl'" + } + _estimates unhold `ivres' + + tokenize `allvars_fwl' + local lhs_fwl "`1'" + mac shift + local rhs_fwl "`*'" + + tempname b + mat `b'=e(b) + mat colnames `b' = `rhs_fwl' +* Use forcezero? + tempvar xb + mat score double `xb' = `b' if `touse' + gen `typlist' `varlist' = `lhs_fwl' - `xb' + label var `varlist' "Residuals" + } + else { +di in red "Option `type' not supported with -fwl- option" + error 198 + } + } + else if "`type'" == "residuals" { + tempname lhs lhs_t xb + local lhs "`e(depvar)'" + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + qui _predict `typlist' `xb' if `touse' + gen `typlist' `varlist'=`lhs_t'-`xb' + label var `varlist' "Residuals" + } +* Must be either xb or stdp + else { + _predict `typlist' `varlist' if `touse', `type' + } + +end diff --git a/ado/i/ivreg29.ado b/ado/i/ivreg29.ado new file mode 100644 index 0000000..5947a76 --- /dev/null +++ b/ado/i/ivreg29.ado @@ -0,0 +1,7576 @@ +*! ivreg29 2.2.14 19Jan2015 +*! authors cfb & mes +*! see end of file for version comments + +* Variable naming: +* lhs = LHS endogenous +* endo = RHS endogenous (instrumented) +* inexog = included exogenous (instruments) +* exexog = excluded exogenous (instruments) +* iv = {inexog exexog} = all instruments +* rhs = {endo inexog} = RHS regressors +* 1 at the end of the name means the varlist after duplicates and collinearities removed +* ..1_ct at the end means a straight count of the list +* .._ct at the end means ..1_ct with any additional detected cnts removed + +program define ivreg29, eclass byable(recall) /* properties(svyj) */ sortpreserve + version 9.2 + local lversion 02.2.14 + + local ivreg2_cmd "ivreg29" + + if replay() { + syntax [, FIRST FFIRST RF Level(integer $S_level) NOHEader NOFOoter dropfirst droprf /* + */ EForm(string) PLUS VERsion] + if "`version'" != "" & "`first'`ffirst'`rf'`noheader'`nofooter'`dropfirst'`droprf'`eform'`plus'" != "" { + di as err "option version not allowed" + error 198 + } + if "`version'" != "" { + di in gr "`lversion'" + ereturn clear + ereturn local version `lversion' + exit + } + if `"`e(cmd)'"' != "`ivreg2_cmd'" { + error 301 + } + if "`e(firsteqs)'" != "" & "`dropfirst'" == "" { +* On replay, set flag so saved eqns aren't dropped + local savefirst "savefirst" + } + if "`e(rfeq)'" != "" & "`droprf'" == "" { +* On replay, set flag so saved eqns aren't dropped + local saverf "saverf" + } + } + else { + local cmdline "`ivreg2_cmd' `*'" + + syntax [anything(name=0)] [if] [in] [aw fw pw iw/] [, /* + */ FIRST FFIRST NOID NOCOLLIN SAVEFIRST SAVEFPrefix(name) SMall Robust CLuster(varname) /* + */ GMM GMM2s CUE CUEINIT(string) CUEOPTions(string) ORTHOG(string) ENDOGtest(string) /* + */ PARTIAL(string) FWL(string) NOConstant Level(integer $S_level) Beta hc2 hc3 /* + */ NOHEader NOFOoter NOOUTput title(string) subtitle(string) /* + */ DEPname(string) EForm(string) PLUS /* + */ BW(string) kernel(string) Tvar(varname) Ivar(varname)/* + */ LIML COVIV FULLER(real 0) Kclass(string) /* + */ REDundant(string) RF SAVERF SAVERFPrefix(name) /* + */ B0(string) SMATRIX(string) WMATRIX(string) /* + */ dofminus(integer 0) sdofminus(integer 0) NOPARTIALSMALL ] + + local n 0 + + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + if `s(stop)' { + error 198 + } + while `s(stop)'==0 { + if "`paren'"=="(" { + local n = `n' + 1 + if `n'>1 { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +exit 198 + } + gettoken p lhs : lhs, parse(" =") + while "`p'"!="=" { + if "`p'"=="" { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +di in red `"the equal sign "=" is required"' +exit 198 + } + local endo `endo' `p' + gettoken p lhs : lhs, parse(" =") + } +* To enable Cragg HOLS estimator, allow for empty endo list + local temp_ct : word count `endo' + if `temp_ct' > 0 { + tsunab endo : `endo' + } +* To enable OLS estimator with (=) syntax, allow for empty exexog list + local temp_ct : word count `lhs' + if `temp_ct' > 0 { + tsunab exexog : `lhs' + } + } + else { + local inexog `inexog' `lhs' + } + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + } + local 0 `"`lhs' `0'"' + + tsunab inexog : `inexog' + tokenize `inexog' + local lhs "`1'" + local 1 " " + local inexog `*' + + if "`gmm2s'`cue'" != "" & "`exexog'" == "" { + di in red "option `gmm2s'`cue' invalid: no excluded instruments specified" + exit 102 + } + +/* Block disabled - ranktest code now incorporated into ivreg29. +* Check that -ranktest- is installed + capture ranktest, version + if _rc != 0 { +di as err "Error: must have ranktest version `ranktestversion' or greater installed" +di as err "To install, from within Stata type " _c +di in smcl "{stata ssc install ranktest :ssc install ranktest}" + exit 601 + } + local vernum "`r(version)'" + if ("`vernum'" < "`ranktestversion'") | ("`vernum'" > "09.9.99") { +di as err "Error: must have ranktest version `ranktestversion' or greater installed" +di as err "Currently installed version is `vernum'" +di as err "To update, from within Stata type " _c +di in smcl "{stata ssc install ranktest, replace :ssc install ranktest, replace}" + exit 601 + } +*/ + +* Process options + +* Legacy gmm option + if "`gmm'" ~= "" { +di in ye "-gmm- is no longer a supported option; use -gmm2s- with the appropriate option" +di in ye " gmm = gmm2s robust" +di in ye " gmm robust = gmm2s robust" +di in ye " gmm bw() = gmm2s bw()" +di in ye " gmm robust bw() = gmm2s robust bw()" +di in ye " gmm cluster() = gmm2s cluster()" + local gmm2s "gmm2s" + if "`robust'`cluster'`bw'"=="" { +* 2-step efficient gmm with arbitrary heteroskedasticity + local robust "robust" + } + } + +* partial, including legacy FWL option + local partial "`partial' `fwl'" + local partial : list retokenize partial +* Need word option so that varnames with cons in them aren't zapped + local partial : subinstr local partial "_cons" "", all count(local partialcons) word + if `partialcons' > 0 & "`noconstant'"~="" { +di in r "Error: _cons listed in partial() but equation specifies -noconstant-." + error 198 + } + else if "`noconstant'"~="" { + local partialcons 0 + } + else if `partialcons' > 1 { +* Just in case of multiple _cons +di in r "Error: _cons listed more than once in partial()." + error 198 + } + else if "`partial'" ~= "" { + local partialcons 1 + } + +* Fuller implies LIML + if "`liml'" == "" & `fuller' != 0 { + local liml "liml" + } + +* b0 implies noid. Also check for incompatible options. + if "`b0'" ~= "" { + local noid "noid" + local b0opts "`gmm2s'`cue'`liml'`wmatrix'`kclass'" + if "`b0opts'" != "" { +* ...with spaces + local b0opts "`gmm2s' `cue' `liml' `wmatrix' `kclass'" + local b0opts : list retokenize b0opts +di as err "incompatible options: -b0- and `b0opts'" + exit 198 + } + } + + if "`gmm2s'" != "" & "`cue'" != "" { +di as err "incompatible options: 2-step efficient gmm and cue gmm" + exit 198 + } + +* savefprefix implies savefirst + if "`savefprefix'" != "" & "`savefirst'" == "" { + local savefirst "savefirst" + } + +* default savefprefix is _ivreg2_ + if "`savefprefix'" == "" { + local savefprefix "_`ivreg2_cmd'_" + } + +* saverfprefix implies saverf + if "`saverfprefix'" != "" & "`saverf'" == "" { + local saverf "saverf" + } + +* default saverfprefix is _ivreg2_ + if "`saverfprefix'" == "" { + local saverfprefix "_`ivreg2_cmd'_" + } + +* LIML/kclass incompatibilities + if "`liml'`kclass'" != "" { + if "`gmm2s'`cue'" != "" { +di as err "GMM estimation not available with LIML or k-class estimators" + exit 198 + } + if `fuller' < 0 { +di as err "invalid Fuller option" + exit 198 + } + if "`liml'" != "" & "`kclass'" != "" { +di as err "cannot use liml and kclass options together" + exit 198 + } +* Process kclass string + tempname kclass2 + scalar `kclass2'=real("`kclass'") + if "`kclass'" != "" & (`kclass2' == . | `kclass2' < 0 ) { +di as err "invalid k-class option" + exit 198 + } + } + +* HAC estimation. +* If bw is omitted, default `bw' is empty string. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. + if "`bw'" != "" | "`kernel'" != "" { +* Need tvar only for markout with time-series stuff +* but data must be tsset for time-series operators in code to work +* User-supplied tvar not used but checked if consistent with tsset + capture tsset + if "`r(timevar)'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } + tsreport, panel + if `r(N_gaps)' != 0 { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + + if "`bw'" == "" { +di as err "bandwidth option bw() required for HAC-robust estimation" + exit 102 + } +* Check for bw(auto); flag as -1 + if lower("`bw'") == "auto" { + if "`ivar'" ~= "" { +di as err "Automatic bandwidth selection not available for panel data" + exit 198 + } + local bw=-1 + } + else { + local bw real("`bw'") +* Check it's a valid bandwidth + if `bw' != int(`bw') | /* + */ `bw' == . | /* + */ `bw' <= 0 { +di as err "invalid bandwidth in option bw() - must be integer > 0 or 'auto'" + exit 198 + } +* Convert bw macro to simple integer + local bw=`bw' + } +* Check it's a valid kernel + local validkernel 0 + if lower(substr("`kernel'", 1, 3)) == "bar" | "`kernel'" == "" { +* Default kernel + local kernel "Bartlett" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Bartlett and bw=1 implies zero lags used. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 3)) == "par" { + local kernel "Parzen" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Parzen and bw=1 implies zero lags used. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 3)) == "tru" { + local kernel "Truncated" + local window "lag" + local validkernel 1 + } + if lower(substr("`kernel'", 1, 9)) == "tukey-han" | lower("`kernel'") == "thann" { + local kernel "Tukey-Hanning" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Tukey-Hanning and bw=1 implies zero lags. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 9)) == "tukey-ham" | lower("`kernel'") == "thamm" { + local kernel "Tukey-Hamming" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Tukey-Hamming and bw=1 implies zero lags. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 3)) == "qua" | lower("`kernel'") == "qs" { + local kernel "Quadratic spectral" + local window "spectral" + local validkernel 1 + } + if lower(substr("`kernel'", 1, 3)) == "dan" { + local kernel "Daniell" + local window "spectral" + local validkernel 1 + } + if lower(substr("`kernel'", 1, 3)) == "ten" { + local kernel "Tent" + local window "spectral" + local validkernel 1 + } + if ~`validkernel' { + di in red "invalid kernel" + exit 198 + } + } + + if "`kernel'" != "" & "`cluster'" != "" { +di as err "cannot use HAC kernel estimator with -cluster- option" + exit 198 + } + + if "`orthog'`endogtest'`redundant'`partial'" != "" { + capture tsunab orthog : `orthog' + capture tsunab endogtest : `endogtest' + capture tsunab redundant : `redundant' + capture tsunab partial : `partial' + } + + if "`hc2'`hc3'" != "" { + if "`hc2'"!="" { + di in red "option `hc2' invalid" + } + else di in red "option `hc3' invalid" + exit 198 + } + + if "`beta'" != "" { + di in red "option `beta' invalid" + exit 198 + } + +* Weights +* fweight and aweight accepted as is +* iweight not allowed with robust or gmm and requires a trap below when used with summarize +* pweight is equivalent to aweight + robust +* but in HAC case, robust implied by `kernel' rather than `robust' + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + qui gen double `wvar'=`exp' + } + if "`weight'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`gmm2s'`kernel'" !="" { + di in red "iweights not allowed with robust or gmm" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + qui gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + qui gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + + if `dofminus' > 0 { + local dofmopt "dofminus(`dofminus')" + } + + marksample touse + markout `touse' `lhs' `inexog' `exexog' `endo' `cluster' `tvar', strok + +* Weight statement + if "`weight'" ~= "" { + sum `wvar' if `touse' `wtexp', meanonly +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + +* Set local macro T and check that bw < T +* Also make sure only used sample is checked + if "`bw'" != "" { + sum `tvar' if `touse', meanonly + local T = r(max)-r(min)+1 + if (`bw' > `T') & (`bw' ~= -1) { +di as err "invalid bandwidth in option bw() - cannot exceed timespan of data" + exit 198 + } + } + +************* Collinearities and duplicates block ***************** + + if "`noconstant'" != "" { + local rmcnocons "nocons" + } + +* Check for duplicates of variables +* To mimic official ivreg, in the case of duplicates, +* (1) inexog > endo +* (2) inexog > exexog +* (3) endo + exexog = inexog, as if it were "perfectly predicted" + local dupsen1 : list dups endo + local endo1 : list uniq endo + local dupsex1 : list dups exexog + local exexog1 : list uniq exexog + local dupsin1 : list dups inexog + local inexog1 : list uniq inexog +* Remove inexog from endo + local dupsen2 : list endo1 & inexog1 + local endo1 : list endo1 - inexog1 +* Remove inexog from exexog + local dupsex2 : list exexog1 & inexog1 + local exexog1 : list exexog1 - inexog1 +* Remove endo from exexog + local dupsex3 : list exexog1 & endo1 + local exexog1 : list exexog1 - endo1 + local dups "`dupsen1' `dupsex1' `dupsin1' `dupsen2' `dupsex2' `dupsex3'" + local dups : list uniq dups + + if "`nocollin'" == "" { +* First, collinearities check using canonical correlations approach +* Eigenvalue=1 => included endog is really included exogenous +* Eigenvalue=0 => included endog collinear with another included endog +* Corresponding column names give name of variable +* Code block stolen from below, so some repetition + local insts1 `inexog1' `exexog1' + local rhs1 `endo1' `inexog1' + local endo1_ct : word count `endo1' + if `endo1_ct' > 0 { + tempname ccmat ccrealev ccimagev cc A XX XXinv ZZ ZZinv XZ XPZX + qui mat accum `A' = `endo1' `insts1' if `touse' `wtexp', `rmcnocons' + mat `XX' = `A'[1..`endo1_ct',1..`endo1_ct'] + mat `XXinv'=syminv(`XX') + mat `ZZ' = `A'[`endo1_ct'+1...,`endo1_ct'+1...] + mat `ZZinv'=syminv(`ZZ') + mat `XZ' = `A'[1..`endo1_ct',`endo1_ct'+1...] + mat `XPZX'=`XZ'*`ZZinv'*`XZ'' + mat `ccmat' = `XXinv'*`XPZX' + mat eigenvalues `ccrealev' `ccimagev' = `ccmat' +* Loop through endo1 to find eigenvalues=0 or 1 + foreach vn of varlist `endo1' { + local i=colnumb(`ccmat',"`vn'") + if round(`ccmat'[`i',`i'],10e-7)==0 { +* Collinear with another endog, so remove from endog list + local endo1 : list endo1-vn + local ncollin "`ncollin' `vn'" + } + if round(`ccmat'[`i',`i'],10e-7)==1 { +* Collinear with exogenous, so remove from endog and add to inexog + local endo1 : list endo1-vn + local inexog1 "`inexog1' `vn'" + local ecollin "`ecollin' `vn'" + } + } + } + +* _rmcollright crashes if no arguments supplied + capture _rmcollright `inexog1' `exexog1' if `touse' `wtexp', `rmcnocons' + +* endo1 has had within-endo collinear removed, so non-colllinear list is _rmcoll result + endo1 + local ncvars `r(varlist)' `endo1' + local allvars1 `endo1' `inexog1' `exexog1' +* collin gets collinear variables to be removed + local collin : list allvars1-ncvars +* Remove collin from exexog1 + local exexog1 : list exexog1-collin +* Remove collin from inexog1 + local inexog1 : list inexog1-collin +* Add dropped endogenous to collinear list, trimming down to "" if empty + local collin "`collin' `ncollin'" + local collin : list clean collin + +* Collinearity and duplicates warning messages, if necessary + if "`dups'" != "" { +di in gr "Warning - duplicate variables detected" +di in gr "Duplicates:" _c + Disp `dups', _col(21) + } + if "`ecollin'" != "" { +di in gr "Warning - endogenous variable(s) collinear with instruments" +di in gr "Vars now exogenous:" _c + Disp `ecollin', _col(21) + } + if "`collin'" != "" { +di in gr "Warning - collinearities detected" +di in gr "Vars dropped:" _c + Disp `collin', _col(21) + } + } + +**** End of collinearities block ************ + +**** Partial-out block ****************** + +* `partial' has all to be partialled out except for constant + if "`partial'" != "" | `partialcons'==1 { + preserve + local partialdrop : list inexog - inexog1 + local partial1 : list partial - partialdrop + local partialcheck : list partial1 - inexog1 + if ("`partialcheck'"~="") { +di in r "Error: `partialcheck' listed in partial() but not in list of regressors." + error 198 + } + local inexog1 : list inexog1 - partial1 +* Check that cluster or weight var won't be transformed + local allvars "`lhs' `inexog' `endo' `exexog'" + if "`cluster'"~="" { + local clustvarcheck : list cluster in allvars + if `clustvarcheck' { +di in r "Error: cannot use cluster variable `cluster' as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } + if "`wtexp'"~="" { + tokenize `exp', parse("*/()+-^&|~") + local wvartokens `*' + local nwvarnames : list allvars - wvartokens + local wvarnames : list allvars - nwvarnames + if "`wvarnames'"~="" { +di in r "Error: cannot use weight variables as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } +* Constant is partialled out, unless nocons already specified in the first place + tempname partial_resid + foreach var of varlist `lhs' `inexog1' `endo1' `exexog1' { + qui regress `var' `partial1' if `touse' `wtexp', `noconstant' + qui predict double `partial_resid' if `touse', resid + qui replace `var' = `partial_resid' + drop `partial_resid' + } + local partial_ct : word count `partial1' + if "`noconstant'" == "" { +* partial_ct used for small-sample adjustment to regression F-stat + local partial_ct = `partial_ct' + 1 + local noconstant "noconstant" + } + } + else { +* Set count of partial vars to zero if option not used + local partial_ct 0 + local partialcons 0 + } +* Add partial_ct to small dof adjustment sdofminus + if "`nopartialsmall'"=="" { + local sdofminus = `sdofminus'+`partial_ct' + } + +********************************************* + + local insts1 `inexog1' `exexog1' + local rhs1 `endo1' `inexog1' + local iv1_ct : word count `insts1' + local rhs1_ct : word count `rhs1' + local endo1_ct : word count `endo1' + local exex1_ct : word count `exexog1' + local endoexex1_ct : word count `endo1' `exexog1' + local inexog1_ct : word count `inexog1' + + if "`noconstant'" == "" { + local cons 1 + } + else { + local cons 0 + } + + if `rhs1_ct' > `iv1_ct' { + di in red "equation not identified; must have at " /* + */ "least as many instruments not in" + di in red "the regression as there are " /* + */ "instrumented variables" + exit 481 + } + + if `rhs1_ct' + `cons' == 0 { + di in red "error: no regressors specified" + exit 102 + } + + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + if "`robust'"=="" { + local robust "robust" + } + } + if "`bw'"!="" { + local bwopt "bw(`bw')" + } + if "`kernel'"!="" { + local kernopt "kernel(`kernel')" + } +* If depname not provided (default) name is lhs variable + if "`depname'"=="" { + local depname `lhs' + } + +************************************************************************************************ +* Cross-products and basic IV coeffs, residuals and moment conditions + tempvar iota y2 yhat ivresid ivresid2 gresid gresid2 lresid lresid2 b0resid b0resid2 s1resid + tempname ysum yy yyc r2u r2c B V ivB gmmB wB lB gmmV ivest + tempname r2 r2_a ivrss lrss wbrss b0rss rss mss rmse sigmasq iv_s2 l_s2 wb_s2 b0_s2 F Fp Fdf2 + tempname S Sinv W s1Zu s2Zu b0Zu wbZu wbresid wbresid2 s1sigmasq + tempname A XZ XZa XZb Zy ZZ ZZinv XPZX XPZXinv XPZy + tempname YY Z2Z2 ZY Z2Y XXa XXb XX Xy Z2Z2inv XXinv + tempname XZWZX XZWZXinv XZWZy XZW + tempname B V B1 uZSinvZu j jp arubin arubinp arubin_lin arubin_linp tempmat + +* Generate cross-products of y, X, Z + qui matrix accum `A' = `lhs' `endo1' `exexog1' `inexog1' /* + */ if `touse' `wtexp', `noconstant' + if "`noconstant'"=="" { + matrix rownames `A' = `lhs' `endo1' `exexog1' /* + */ `inexog1' _cons + matrix colnames `A' = `lhs' `endo1' `exexog1' /* + */ `inexog1' _cons + } + else { + matrix rownames `A' = `lhs' `endo1' `exexog1' `inexog1' + matrix colnames `A' = `lhs' `endo1' `exexog1' `inexog1' + } + if `endo1_ct' > 0 { +* X'Z is [endo1 inexog1]'[exexog1 inexog1] + mat `XZ'=`A'[2..`endo1_ct'+1,`endo1_ct'+2...] +* Append portion corresponding to included exog if they (incl constant) exist + if 2+`endo1_ct'+`iv1_ct'-(`rhs1_ct'-`endo1_ct') /* + */ <= rowsof(`A') { + mat `XZ'=`XZ' \ /* + */ `A'[2+`endo1_ct'+`iv1_ct'- /* + */ (`rhs1_ct'-`endo1_ct')..., /* + */ `endo1_ct'+2...] + } +* If included exog (incl const) exist, create XX matrix in 3 steps + if `inexog1_ct' + `cons' > 0 { + mat `XXa' = `A'[2..`endo1_ct'+1, 2..`endo1_ct'+1], /* + */ `A'[2..`endo1_ct'+1, `endoexex1_ct'+2...] + mat `XXb' = `A'[`endoexex1_ct'+2..., 2..`endo1_ct'+1], /* + */ `A'[`endoexex1_ct'+2..., `endoexex1_ct'+2...] + mat `XX' = `XXa' \ `XXb' + mat `Xy' = `A'[2..`endo1_ct'+1, 1] \ `A'[`endoexex1_ct'+2..., 1] + } + else { + mat `XX' = `A'[2..`endo1_ct'+1, 2..`endo1_ct'+1] + mat `Xy' = `A'[2..`endo1_ct'+1, 1] + } + } + else { +* Cragg HOLS estimator with no endogenous variables + mat `XZ'= `A'[2+`iv1_ct'-(`rhs1_ct'-`endo1_ct')..., /* + */ 2...] + mat `XX' = `A'[`endoexex1_ct'+2..., `endoexex1_ct'+2...] + mat `Xy' = `A'[`endoexex1_ct'+2..., 1] + } + + mat `XX'=(`XX'+`XX'')/2 + mat `XXinv'=syminv(`XX') + mat `Zy'=`A'[`endo1_ct'+2...,1] + mat `ZZ'=`A'[`endo1_ct'+2...,`endo1_ct'+2...] + mat `ZZ'=(`ZZ'+`ZZ'')/2 + mat `ZZinv'=syminv(`ZZ') +* diag0cnt not superfluous - collinearity checks will catch but may be disabled + local iv_ct = rowsof(`ZZ') - diag0cnt(`ZZinv') + mat `YY'=`A'[1..`endo1_ct'+1, 1..`endo1_ct'+1] + mat `ZY' = `A'[`endo1_ct'+2..., 1..`endo1_ct'+1] + mat `XPZX'=`XZ'*`ZZinv'*`XZ'' + mat `XPZX'=(`XPZX'+`XPZX'')/2 + mat `XPZXinv'=syminv(`XPZX') + mat `XPZy'=`XZ'*`ZZinv'*`Zy' +****************************** + qui gen byte `iota'=1 + qui gen double `y2'=`lhs'^2 +* Stata summarize won't work with iweights, so must use matrix cross-product + qui matrix vecaccum `ysum' = `iota' `y2' `lhs' `wtexp' if `touse' +* N is ob count from mat accum. +* `N' is rounded down to nearest integer if iweights are used. +* If aw, pw or fw, should already be integer but use round in case of numerical imprecision. + if "`weight'" == "iweight" { + local N=int(`ysum'[1,3]) + } + else { + local N=round(`ysum'[1,3]) + } +* For yyc, use unrounded N to mimic official -regress- (needed in R-sq) + scalar `yy'=`ysum'[1,1] + scalar `yyc'=`yy'-`ysum'[1,2]^2/`ysum'[1,3] + +******************************************************************************************* +* First-step estimators: b0, wmatrix, LIML-kclass, IV. +* Generate residuals s1resid for used in 2SFEGMM and robust. +* User-supplied b0 provides value of CUE obj fn. + if "`b0'" != "" { + capture drop `yhat' + qui mat score double `yhat' = `b0' if `touse' + qui gen double `b0resid'=`lhs'-`yhat' + qui gen double `b0resid2'=`b0resid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `b0resid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `b0rss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `b0_s2'=`b0rss'/(`N'-`dofminus') + scalar `s1sigmasq'=`b0_s2' + qui gen double `s1resid'=`b0resid' + } + else if "`wmatrix'" != "" { +* GMM with arbitrary weighting matrix provides first-step estimates + local cn : colnames(`ZZ') + matrix `W'=`wmatrix' +* Rearrange/select columns to mat IV matrix + capture matsort `W' "`cn'" + local wrows = rowsof(`W') + local wcols = colsof(`W') + local zcols = colsof(`ZZ') + if _rc ~= 0 | (`wrows'~=`zcols') | (`wcols'~=`zcols') { +di as err "-wmatrix- option error: supplied matrix columns/rows do not match IV list" +exit 198 + } + mat `XZWZX'=`XZ'*`W'*`XZ'' + mat `XZWZy'=`XZ'*`W'*`Zy' + mat `XZWZX'=(`XZWZX'+`XZWZX'')/2 + mat `XZWZXinv'=syminv(`XZWZX') + mat `XZW'=`XZ'*`W' + mat `wB'=`XZWZy''*`XZWZXinv'' + + capture drop `yhat' + qui mat score double `yhat' = `wB' if `touse' + qui gen double `wbresid'=`lhs'-`yhat' + qui gen double `wbresid2'=`wbresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `wbresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `wbrss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `wb_s2'=`wbrss'/(`N'-`dofminus') + scalar `s1sigmasq'=`wb_s2' + qui gen double `s1resid'=`wbresid' + } + else if "`liml'`kclass'" != "" { +* LIML and kclass code + tempname WW WW1 Eval lambda khs XhXh XhXhinv ll + if "`kclass'" == "" { +* LIML block + matrix `WW' = `YY' - `ZY''*`ZZinv'*`ZY' + if `inexog1_ct' + `cons' > 0 { + mat `Z2Y' = `A'[`endoexex1_ct'+2..., 1..`endo1_ct'+1] + mat `Z2Z2' = `A'[`endoexex1_ct'+2..., `endoexex1_ct'+2...] + mat `Z2Z2'=(`Z2Z2'+`Z2Z2'')/2 + mat `Z2Z2inv' = syminv(`Z2Z2') + matrix `WW1' = `YY' - `Z2Y''*`Z2Z2inv'*`Z2Y' + } + else { +* Special case of no included exogenous (incl constant) + matrix `WW1' = `YY' + } + matrix `WW'=(`WW'+`WW'')/2 + mata: M=matpowersym(st_matrix("`WW'"), -0.5) + mata: Eval=symeigenvalues(makesymmetric(M*st_matrix("`WW1'")*M)) + mata: lambda=rowmin(Eval) + mata: st_numscalar("r(lambda)", lambda) + scalar `lambda'=r(lambda) + + if `fuller'==0 { +* Basic LIML. Macro kclass2 is the scalar. + scalar `kclass2'=`lambda' + } + else { +* Fuller LIML + if `fuller' > (`N'-`iv_ct') { +di as err "error: invalid choice of Fuller LIML parameter" + exit 198 + } + scalar `kclass2' = `lambda' - `fuller'/(`N'-`iv_ct') + } +* End of LIML block + } + mat `XhXh'=(1-`kclass2')*`XX'+`kclass2'*`XPZX' + mat `XhXh'=(`XhXh'+`XhXh'')/2 + mat `XhXhinv'=syminv(`XhXh') + mat `lB'=`Xy''*`XhXhinv'*(1-`kclass2') + `kclass2'*`Zy''*`ZZinv'*`XZ''*`XhXhinv' + capture drop `yhat' + qui mat score double `yhat'=`lB' if `touse' + qui gen double `lresid'=`lhs' - `yhat' + qui gen double `lresid2'=`lresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `lresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `lrss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `l_s2'=`lrss'/(`N'-`dofminus') + scalar `s1sigmasq'=`l_s2' + qui gen double `s1resid'=`lresid' + } + else { +* IV resids are 1st-step GMM resids +* In these expressions, ignore scaling of W + mat `ivB' = `XPZy''*`XPZXinv'' + mat `XZWZX'=`XPZX' + mat `XZWZXinv'=`XPZXinv' + mat `XZW'=`XZ'*`ZZinv' + capture drop `yhat' + qui mat score double `yhat' = `ivB' if `touse' + qui gen double `ivresid'=`lhs'-`yhat' + qui gen double `ivresid2'=`ivresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `ivresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `ivrss'=`ysum'[1,1] + scalar `iv_s2'=`ivrss'/(`N'-`dofminus') + scalar `s1sigmasq'=`iv_s2' + qui gen double `s1resid'=`ivresid' + } +* Orthogonality conditions using step 1 residuals + qui mat vecaccum `s1Zu'=`s1resid' `exexog1' `inexog1' /* + */ `wtexp' if `touse', `noconstant' + +* call abw code if bw() is defined and bw(auto) selected + if "`bw'" != "" { + if `bw' == -1 { + tempvar abwtouse + gen byte `abwtouse' = (`s1resid' < .) + abw `s1resid' `exexog1' `inexog1' `abwtouse', noconstant kernel(`kernel') + local bw `r(abw)' + local bwopt "bw(`bw')" + local bwchoice "`r(bwchoice)'" + } + } +******************************************************************************************* +* S covariance matrix of orthogonality conditions +******************************************************************************************* +* If user-supplied S matrix is used, use it + if "`smatrix'" != "" { + local cn : colnames(`ZZ') + matrix `S'=`smatrix' +* Rearrange/select columns to mat IV matrix + capture matsort `S' "`cn'" + local srows = rowsof(`S') + local scols = colsof(`S') + local zcols = colsof(`ZZ') + if _rc ~= 0 | (`srows'~=`zcols') | (`scols'~=`zcols') { +di as err "-smatrix- option error: supplied matrix columns/rows do not match IV list" +exit 198 + } + mat `S' = (`S' + `S'') / 2 + mat `Sinv'=syminv(`S') + local rankS = rowsof(`Sinv') - diag0cnt(`Sinv') + } + +******************************************************************************************* +* Start robust block for robust-HAC S and Sinv +* Do not enter if user supplies smatrix or if CUE + if "`robust'`cluster'" != "" & "`cue'"=="" & "`smatrix'"=="" { +* Optimal weighting matrix +* Block calculates S_0 robust matrix +* _robust has same results as +* mat accum `S'=`exexog1' `inexog1' [iweight=`ivresid'^2] if `touse' +* mat `S' = `S'*1/`N' +* _robust doesn't work properly with TS variables, so must first tsrevar + tsrevar `exexog1' `inexog1' + local TSinsts1 `r(varlist)' +* Create identity matrix with matching col/row names + mat `S'=I(colsof(`s1Zu')) + if "`noconstant'"=="" { + mat colnames `S' = `TSinsts1' "_cons" + mat rownames `S' = `TSinsts1' "_cons" + } + else { + mat colnames `S' = `TSinsts1' + mat rownames `S' = `TSinsts1' + } + _robust `s1resid' `wtexp' if `touse', variance(`S') `clopt' minus(0) + if "`cluster'"!="" { + local N_clust=r(N_clust) + } + mat `S' = `S'*1/`N' +* Above doesn't work properly with iweights (i.e. yield same matrix as fw), +* hence iweight trap at start + if "`kernel'" != "" { +* HAC block for S_1 onwards matrices + tempvar vt1 + qui gen double `vt1' = . + tempname tt tx kw karg ow +* Use insts with TS ops removed and with iota (constant) column + if "`noconstant'"=="" { + local insts1c "`TSinsts1' `iota'" + } + else { + local insts1c "`TSinsts1'" + } + local iv1c_ct : word count `insts1c' +* "tau=0 loop" is S_0 block above for all robust code + local tau=1 +* Spectral windows require looping through all T-1 autocovariances + if "`window'" == "spectral" { + local TAU = `T'-1 +di in ye "Computing kernel ..." + } + else { + local TAU=`bw' + } + if "`weight'" == "" { +* If no weights specified, define neutral ow variable and weight expression for code below + qui gen byte `ow'=1 + local wtexp `"[fweight=`wvar']"' + } + else { +* pweights and aweights + summ `wvar' if `touse', meanonly + qui gen double `ow' = `wvar'/r(mean) + } + while `tau' <= `TAU' { + capture mat drop `tt' + local i 1 + while `i' <= `iv1c_ct' { + local x : word `i' of `insts1c' +* Add lags defined with TS operators + local Lx "L`tau'.`x'" + local Ls1resid "L`tau'.`s1resid'" + local Low "L`tau'.`ow'" + qui replace `vt1' = `Lx'*`s1resid'* /* + */ `Ls1resid'*`Low'*`ow' if `touse' +* Use capture here because there may be insufficient observations, e.g., if +* the IVs include lags and tau=N-1. _rc will be 2000 in this case. +* Bug in vecaccum means that if there is only 1 observation it will crash with insufficient obs. +* Replace missings with zeros to head this off. + qui replace `vt1' = 0 if `vt1'==. & `touse' + capture mat vecaccum `tx' = `vt1' `insts1c' /* + */ if `touse', nocons + if _rc == 0 { + mat `tt' = nullmat(`tt') \ `tx' + } + local i = `i'+1 + } +* bw = bandwidth, karg is argument to kernel function, kw is kernel function (weight) + scalar `karg' = `tau'/(`bw') + if "`kernel'" == "Truncated" { + scalar `kw'=1 + } + if "`kernel'" == "Bartlett" { + scalar `kw'=(1-`karg') + } + if "`kernel'" == "Parzen" { + if `karg' <= 0.5 { + scalar `kw' = 1-6*`karg'^2+6*`karg'^3 + } + else { + scalar `kw' = 2*(1-`karg')^3 + } + } + if "`kernel'" == "Tukey-Hanning" { + scalar `kw'=0.5+0.5*cos(_pi*`karg') + } + if "`kernel'" == "Tukey-Hamming" { + scalar `kw'=0.54+0.46*cos(_pi*`karg') + } + if "`kernel'" == "Tent" { + scalar `kw'=2*(1-cos(`tau'*`karg')) / (`karg'^2) + } + if "`kernel'" == "Daniell" { + scalar `kw'=sin(_pi*`karg') / (_pi*`karg') + } + if "`kernel'" == "Quadratic spectral" { + scalar `kw'=25/(12*_pi^2*`karg'^2) /* + */ * ( sin(6*_pi*`karg'/5)/(6*_pi*`karg'/5) /* + */ - cos(6*_pi*`karg'/5) ) + } +* Need -capture-s here because tt may not exist (because of insufficient observations/lags) + capture mat `tt' = (`tt'+`tt'')*`kw'*1/`N' + if _rc == 0 { + mat `S' = `S' + `tt' + } + local tau = `tau'+1 + } + if "`weight'" == "" { +* If no weights specified, remove neutral weight variables + local wtexp "" + } + } +* To give S the right col/row names + mat `S'=`S'+0*diag(`s1Zu') +* Right approach is to adjust S by N/(N-dofminus) if NOT cluster +* because clustered S is already "adjusted" + if "`cluster'"=="" { + mat `S'=`S'*`N'/(`N'-`dofminus') + } + + mat `S'=(`S'+`S'')/2 + mat `Sinv'=syminv(`S') + local rankS = rowsof(`Sinv') - diag0cnt(`Sinv') + } + +* End robust-HAC S and Sinv block +************************************************************************************ +* Block for non-robust S and Sinv, including autocorrelation-consistent (AC). +* Do not enter if user supplies smatrix or if cue + + if "`robust'`cluster'`cue'`smatrix'"=="" { +* First do with S_0 (=S for simple IV) +* Step 1 sigma^2 is IV sigma^2 unless b0 or wmatrix provided + mat `S' = `s1sigmasq'*`ZZ'*(1/`N') + + if "`kernel'" != "" { +* AC code for S_1 onwards matrices + tempvar vt1 + qui gen double `vt1' = . + tempname tt tx kw karg ow sigttj +* Use insts with TS ops removed and with iota (constant) column + tsrevar `exexog1' `inexog1' + local TSinsts1 `r(varlist)' + if "`noconstant'"=="" { + local insts1c "`TSinsts1' `iota'" + } + else { + local insts1c "`TSinsts1'" + } + local iv1c_ct : word count `insts1c' +* "tau=0 loop" is S_0 block above + local tau=1 +* Spectral windows require looping through all T-1 autocovariances + if "`window'" == "spectral" { + local TAU=`T'-1 +di in ye "Computing kernel ..." + } + else { + local TAU=`bw' + } + if "`weight'" == "" { +* If no weights specified, define neutral ow variable and wtexp for code below + qui gen byte `ow'=1 + local wtexp `"[fweight=`wvar']"' + } + else { +* pweights and aweights + sum `wvar' if `touse', meanonly + qui gen double `ow' = `wvar'/r(mean) + } + while `tau' <= `TAU' { + capture mat drop `tt' + local i 1 +* errflag signals problems that make this loop's tt invalid + local errflag 0 +* Additional marksample/markout required so that treatment of MVs is consistent across all IVs and obs + marksample touse2 + markout `touse2' `insts1c' L`tau'.(`insts1c') L`tau'.(`s1resid') + + local Low "L`tau'.`ow'" + while `i' <= `iv1c_ct' { + local x : word `i' of `insts1c' +* Add lags defined with TS operators + local Lx "L`tau'.`x'" + qui replace `vt1'=. + qui replace `vt1' = `Lx'*`Low'*`ow' if `touse' & `touse2' +* Use capture here because there may be insufficient observations, e.g., if +* the IVs include lags and tau=N-1. _rc will be 2000 in this case. +* Bug in vecaccum means that if there is only 1 observation it will crash with insufficient obs. +* Replace missings with zeros to head this off. + qui replace `vt1' = 0 if `vt1'==. & `touse' + capture mat vecaccum `tx' = `vt1' `insts1c' /* + */ if `touse', nocons + + if _rc == 0 { + mat `tt' = nullmat(`tt') \ `tx' + } + local i = `i'+1 + } + + capture mat `tt' = 1/`N' * `tt' + if _rc != 0 { + local errflag = 1 + } + local Ls1resid "L`tau'.`s1resid'" + tempvar ivLiv + qui gen double `ivLiv' = `s1resid'*`Ls1resid'*`ow'*`Low' if `touse' + qui sum `ivLiv' if `touse', meanonly + scalar `sigttj' = r(sum)/(`N'-`dofminus') + capture mat `tt' = `sigttj' * `tt' +* bw = bandwidth, karg is argument to kernel function, kw is kernel function (weight) + scalar `karg' = `tau'/(`bw') + if "`kernel'" == "Truncated" { + scalar `kw'=1 + } + if "`kernel'" == "Bartlett" { + scalar `kw'=(1-`karg') + } + if "`kernel'" == "Parzen" { + if `karg' <= 0.5 { + scalar `kw' = 1-6*`karg'^2+6*`karg'^3 + } + else { + scalar `kw' = 2*(1-`karg')^3 + } + } + if "`kernel'" == "Tukey-Hanning" { + scalar `kw'=0.5+0.5*cos(_pi*`karg') + } + if "`kernel'" == "Tukey-Hamming" { + scalar `kw'=0.54+0.46*cos(_pi*`karg') + } + if "`kernel'" == "Tent" { + scalar `kw'=2*(1-cos(`tau'*`karg')) / (`karg'^2) + } + if "`kernel'" == "Daniell" { + scalar `kw'=sin(_pi*`karg') / (_pi*`karg') + } + if "`kernel'" == "Quadratic spectral" { + scalar `kw'=25/(12*_pi^2*`karg'^2) /* + */ * ( sin(6*_pi*`karg'/5)/(6*_pi*`karg'/5) /* + */ - cos(6*_pi*`karg'/5) ) + } +* Need -capture-s here because tt may not exist (because of insufficient observations/lags) + capture mat `tt' = (`tt'+`tt'')*`kw' + if _rc != 0 { + local errflag = 1 + } +* Accumulate if tt is valid + if `errflag' == 0 { + capture mat `S' = `S' + `tt' + } + local tau = `tau'+1 + } + if "`weight'" == "" { +* If no weights specified, remove neutral weight variables + local wtexp "" + } + } +* End of AC code +* To give S the right col/row names + mat `S'=`S'+0*diag(`s1Zu') + mat `S'=(`S'+`S'')/2 + mat `Sinv'=syminv(`S') + local rankS = rowsof(`Sinv') - diag0cnt(`Sinv') + } + +* End of non-robust S and Sinv code (including AC) +******************************************************************************************* +* 2nd step and final coefficients +******************************************************************************************* +* User-supplied b0. CUE objective function. + if "`b0'" ~= "" { + mat `B' = `b0' + scalar `rss'=`b0rss' + scalar `sigmasq'=`b0_s2' + mat `W' = `Sinv' + } +******************************************************************************************* +* Block for gmm 2nd step to get coefficients and 2nd step residuals + +* Non-robust IV, LIML, k-class, CUE do not enter + if "`gmm2s'`robust'`cluster'`kernel'`wmatrix'" != "" & "`cue'"=="" { + mat `tempmat'=`XZ'*`Sinv'*`XZ'' + mat `tempmat'=(`tempmat'+`tempmat'')/2 + mat `B1'=syminv(`tempmat') + mat `B1'=(`B1'+`B1'')/2 + mat `gmmB'=(`B1'*`XZ'*`Sinv'*`Zy')' + + capture drop `yhat' + qui mat score double `yhat'=`gmmB' if `touse' + qui gen double `gresid'=`lhs'-`yhat' + qui gen double `gresid2'=`gresid'^2 + qui mat vecaccum `s2Zu'=`gresid' `exexog1' `inexog1' /* + */ `wtexp' if `touse', `noconstant' + } +******************************************************************************************* +* GMM with arbitrary weighting matrix + if ("`wmatrix'"~="") & ("`gmm2s'"=="") & ("`liml'`kclass'`cue'"=="") & "`b0'"=="" { + mat `B'=`wB' + scalar `rss'=`wbrss' + scalar `sigmasq'=`wb_s2' +* Weighting matrix wmatrix already checked and assigned to macro W + } +******************************************************************************************* +* IV coefficients + if ("`wmatrix'"=="") & ("`gmm2s'"=="") & ("`liml'`kclass'`cue'"=="") & "`b0'"=="" { + mat `B'=`ivB' + scalar `rss'=`ivrss' + scalar `sigmasq'=`iv_s2' +* IV weighting matrix. By convention, no small-sample adjustment (consistent with S) +* No dofminus correction (needed in sigma^2, not ZZ) + mat `W' = `ZZinv'*`N'/`iv_s2' + } +******************************************************************************************* +* LIML, k-class coefficients + if "`liml'`kclass'" ~= "" { + mat `B'=`lB' + scalar `rss'=`lrss' + scalar `sigmasq'=`l_s2' +* No weighting matrix. + } +******************************************************************************************* +* Efficient GMM coefficients + if "`gmm2s'"!="" & ("`liml'`kclass'`cue'"=="") & "`b0'"=="" { + mat `B'=`gmmB' + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `gresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `rss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `sigmasq'=`rss'/(`N'-`dofminus') + mat `W'=`Sinv' + } +******************************************************************************************* +* Var-cov matrix +******************************************************************************************* +* Expressions below multipy by N because we are working with cross-products (XZ) not vcvs (Qxz) +* Efficient GMM: homoskedastic IV, 2-step FEGMM. LIML, k-class, CUE handled separately. +* No robust, cluster, kernel => must be efficient GMM +* GMM option => must be efficient GMM +* b0 => must be efficient GMM +* wmatrix => (possibly) inefficient GMM + tempname rankV + if ("`robust'`cluster'`kernel'`liml'`kclass'`cue'`wmatrix'"=="") /* + */ | ("`gmm2s'"~="") /* + */ | ("`b0'"~="") { + mat `tempmat'=`XZ'*`Sinv'*`XZ'' + mat `tempmat'=(`tempmat'+`tempmat'')/2 + mat `V' = syminv(`tempmat')*`N' + mat `V'=(`V'+`V'')/2 + scalar `rankV'=rowsof(`tempmat') - diag0cnt(`tempmat') + } +* Possibly inefficient GMM: robust of all sorts with no 2nd step. LIML, k-class, CUE handled separately. + else if ("`liml'`kclass'`cue'"=="") { + mat `V'=`XZWZXinv'*`XZW'*`S'* /* + */ `XZW''*`XZWZXinv'*`N' + mat `V'=(`V'+`V'')/2 + mat `tempmat'=syminv(`V') + scalar `rankV'=rowsof(`tempmat') - diag0cnt(`tempmat') + } +* LIML and k-class non-robust + else if ("`liml'`kclass'" ~= "") & ("`robust'`cluster'`kernel'" == "") { + if "`coviv'"== "" { +* LIML or k-class cov matrix + mat `V'=`sigmasq'*`XhXhinv' + scalar `rankV'=rowsof(`XhXh') - diag0cnt(`XhXh') + } + else { +* IV cov matrix + mat `V'=`sigmasq'*`XPZXinv' + scalar `rankV'=rowsof(`XPZXinv') - diag0cnt(`XPZXinv') + } + mat `V'=(`V'+`V'')/2 + } +* LIML and k-class robust + else if ("`liml'`kclass'" ~= "") & ("`robust'`cluster'`kernel'" ~= "") { + if "`coviv'"== "" { +* Use LIML or k-class cov matrix + mat `V'=`XhXhinv'*`XZ'*`ZZinv'*`S'*`N'* /* + */ `ZZinv'*`XZ''*`XhXhinv' + } + else { +* Use IV cov matrix + mat `V'=`XPZXinv'*`XZ'*`ZZinv'*`S'*`N'* /* + */ `ZZinv'*`XZ''*`XPZXinv' + } + mat `V'=(`V'+`V'')/2 + mat `tempmat'=syminv(`V') + scalar `rankV'=rowsof(`tempmat') - diag0cnt(`tempmat') + } +* End of VCV block +******************************************************************************** +* Sargan-Hansen-Anderson-Rubin statistics +******************************************************************************************* +* Robust requires using gmm residuals; otherwise use iv residuals. CUE handled separately. +* wmatrix is possibly inefficient GMM so require 2nd step residuals +* b0 => return value of CUE objective function. b0 is efficient GMM. + if ("`robust'`cluster'`kernel'`wmatrix'" == "") & ("`cue'"=="") & ("`b0'"=="") { + mat `uZSinvZu'= (`s1Zu'/`N')*`Sinv'*(`s1Zu''/`N') + scalar `j' = `N'*`uZSinvZu'[1,1] + } + if ("`robust'`cluster'`kernel'`wmatrix'" ~= "") & ("`cue'"=="") & ("`b0'"=="") { + mat `uZSinvZu'= (`s2Zu'/`N')*`Sinv'*(`s2Zu''/`N') + scalar `j' = `N'*`uZSinvZu'[1,1] + } + if "`b0'"~="" { + mat `uZSinvZu'= (`s1Zu'/`N')*`Sinv'*(`s1Zu''/`N') + scalar `j' = `N'*`uZSinvZu'[1,1] + } + if "`liml'" != "" { +* Also save Anderson-Rubin overid stat if LIML +* Note dofminus is required because unlike Sargan and 2-step GMM J, doesn't derive from S + scalar `arubin'=(`N'-`dofminus')*ln(`lambda') + scalar `arubin_lin'=(`N'-`dofminus')*(`lambda'-1) + } + +*************************************************************************************** +* Block for cue gmm +******************************************************************************************* + if "`cue'" != "" { + tempname b_init temphold + capture _estimates hold `temphold', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + if "`robust'`cluster'`bwopt'"~="" { + local init_opt "gmm2s" + } + qui `ivreg2_cmd' `lhs' `inexog1' (`endo1'=`exexog1') `wtexp' /* + */ if `touse', `robust' `clopt' `bwopt' `kernopt' `dofmopt' /* + */ `noconstant' `init_opt' noid nocollin + if e(rankzz)>e(rankxx) { + if "`cueinit'"== "" { + mat `b_init'=e(b) + } + else { + mat `b_init'=`cueinit' + } +* Use ML for numerical optimization. Always nocons since not there by user or partialled-out +* Set up variables and options as globals + global IV_lhs "`lhs'" + global IV_inexog "`inexog1'" + global IV_endog "`endo1'" + global IV_exexog "`exexog1'" + global IV_wt "`wtexp'" + global IV_opt "`noconstant' `robust' `clopt' `bwopt' `kernopt' `dofmopt'" +* `gmm2s' not in IV_opt because cue+gmm2s not allowed + ml model d0 `ivreg2_cmd'_cue (`lhs' = `endo1' `inexog1', `noconstant') `wtexp' /* + */ if `touse', maximize init(`b_init') `cueoptions' /* + */ crittype(neg GMM obj function -J) /* + */ collinear nooutput nopreserve missing noscvars + } + else { +di in ye "Equation exactly-identified: CUE and 2-step GMM coincide" + } + + mat `B'=e(b) + mat colnames `B' = _: +* Last call to get vcv, j, Sinv etc. + qui `ivreg2_cmd' `lhs' `inexog1' (`endo1'=`exexog1') `wtexp' if `touse', /* + */ `noconstant' `robust' `clopt' `bwopt' `kernopt' `dofmopt' /* + */ b0(`B') noid nocollin + +* Save all results + mat `V'=e(V) + mat `S'=e(S) + mat `Sinv'=syminv(`S') + mat `W'=`Sinv' + + local rankS = e(rankS) + scalar `j'=e(j) + local df_m = e(df_m) + scalar `rankV'=e(rankV) + + if "`cluster'" != "" { + local N_clust=e(N_clust) + } + capture drop `yhat' + qui mat score double `yhat'=`B' if `touse' + qui gen double `gresid'=`lhs'-`yhat' + qui gen double `gresid2'=`gresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `gresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `rss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `sigmasq'=`rss'/(`N'-`dofminus') + + macro drop IV_lhs IV_inexog IV_endog IV_exexog IV_wt IV_opt + capture _estimates unhold `temphold' + + } + +******************************************************************************************* +* RSS, counts, dofs, F-stat, small-sample corrections +******************************************************************************************* + + scalar `rmse'=sqrt(`sigmasq') + if "`noconstant'"=="" { + scalar `mss'=`yyc' - `rss' + } + else { + scalar `mss'=`yy' - `rss' + } + +* Counts modified to include constant if appropriate + if "`noconstant'"=="" { + local iv1_ct = `iv1_ct' + 1 + local rhs1_ct = `rhs1_ct' + 1 + } +* Correct count of rhs variables accounting for dropped collinear vars +* Count includes constant + + local rhs_ct = rowsof(`XX') - diag0cnt(`XXinv') + local Fdf1 = `rhs_ct' - `cons' +* CUE handled separately + if "`cue'"=="" { + local df_m = `rhs_ct' - `cons' + (`sdofminus'-`partialcons') + } + if "`cluster'"=="" { +* Residual dof adjusted for dofminus + local df_r = `N' - `rhs_ct' - `dofminus' - `sdofminus' + } + else { +* To match Stata, subtract 1 + local df_r = `N_clust' - 1 + } + +* Sargan-Hansen J dof and p-value +* df=0 doesn't guarantee j=0 since can be call to get value of CUE obj fn + local jdf = `iv_ct' - `rhs_ct' + if `jdf' == 0 & "`b0'"=="" { + scalar `j' = 0 + } + else { + scalar `jp' = chiprob(`jdf',`j') + } + if "`liml'"~="" { + scalar `arubinp' = chiprob(`jdf',`arubin') + scalar `arubin_linp' = chiprob(`jdf',`arubin_lin') + } + +* Small sample corrections for var-cov matrix. +* If robust, the finite sample correction is N/(N-K), and with no small +* we change this to 1 (a la Davidson & MacKinnon 1993, p. 554, HC0). +* If cluster, the finite sample correction is (N-1)/(N-K)*M/(M-1), and with no small +* we change this to 1 (a la Wooldridge 2002, p. 193), where M=number of clusters. + + if "`small'" != "" { + if "`cluster'"=="" { + matrix `V'=`V'*(`N'-`dofminus')/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + } + else { + matrix `V'=`V'*(`N'-1)/(`N'-`rhs_ct'-`sdofminus') /* + */ * `N_clust'/(`N_clust'-1) + } + scalar `sigmasq'=`rss'/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + scalar `rmse'=sqrt(`sigmasq') + } + + scalar `r2u'=1-`rss'/`yy' + scalar `r2c'=1-`rss'/`yyc' + if "`noconstant'"=="" { + scalar `r2'=`r2c' + scalar `r2_a'=1-(1-`r2')*(`N'-1)/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + } + else { + scalar `r2'=`r2u' + scalar `r2_a'=1-(1-`r2')*`N'/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + } + +* Fstat +* To get it to match Stata's, must post separately with dofs and then do F stat by hand +* in case weights generate non-integer obs and dofs +* Create copies so they can be posted + tempname FB FV + mat `FB'=`B' + mat `FV'=`V' + capture ereturn post `FB' `FV' +* If the cov matrix wasn't positive definite, the post fails with error code 506 + local rc = _rc + if `rc' != 506 { + local Frhs1 `rhs1' + capture test `Frhs1' + if "`small'" == "" { + if "`cluster'"=="" { + capture scalar `F' = r(chi2)/`Fdf1' * `df_r'/(`N'-`dofminus') + } + else { + capture scalar `F' = r(chi2)/`Fdf1' * /* +* sdofminus used here so that F-stat matches test stat from regression with no partial and small + */ (`N_clust'-1)/`N_clust' * (`N'-`rhs_ct'-`sdofminus')/(`N'-1) + } + } + else { + capture scalar `F' = r(chi2)/`Fdf1' + } + capture scalar `Fp'=Ftail(`Fdf1',`df_r',`F') + capture scalar `Fdf2'=`df_r' + } + +* If j==. or vcv wasn't full rank, then vcv problems and F is meaningless + if `j' == . | `rc'==506 { + scalar `F' = . + scalar `Fp' = . + } + +* End of counts, dofs, F-stat, small sample corrections +******************************************************************************************* +* orthog option: C statistic (difference of Sargan statistics) +******************************************************************************************* +* Requires j dof from above + if "`orthog'"!="" { + tempname cj cstat cstatp +* Initialize cstat + scalar `cstat' = 0 +* Each variable listed must be in instrument list. +* To avoid overwriting, use cendo, cinexog1, cexexog, cendo_ct, cex_ct + local cendo1 "`endo1'" + local cinexog1 "`inexog1'" + local cexexog1 "`exexog1'" + local cinsts1 "`insts1'" + local crhs1 "`rhs1'" + local clist1 "`orthog'" + local clist_ct : word count `clist1' + +* Check to see if c-stat vars are in original list of all ivs +* cinexog1 and cexexog1 are after c-stat exog list vars have been removed +* cendo1 is endo1 after included exog being tested has been added + foreach x of local clist1 { + local llex_ct : word count `cexexog1' + Subtract cexexog1 : "`cexexog1'" "`x'" + local cex1_ct : word count `cexexog1' + local ok = `llex_ct' - `cex1_ct' + if (`ok'==0) { +* Not in excluded, check included and add to endog list if it appears + local llin_ct : word count `cinexog1' + Subtract cinexog1 : "`cinexog1'" "`x'" + local cin1_ct : word count `cinexog1' + local ok = `llin_ct' - `cin1_ct' + if (`ok'==0) { +* Not in either list +di in r "Error: `x' listed in orthog() but does not appear as exogenous." + error 198 + } + else { + local cendo1 "`cendo1' `x'" + } + } + } + +* If robust, HAC/AC or GMM (but not LIML or IV), create optimal weighting matrix to pass to ivreg2 +* by extracting the submatrix from the full S and then inverting. +* This guarantees the C stat will be non-negative. See Hayashi (2000), p. 220. +* Calculate C statistic with recursive call to ivreg2 +* Collinearities may cause problems, hence -capture-. +* smatrix works generally, including homoskedastic case with Sargan stat + capture { + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + if "`kernel'" != "" { + local bwopt "bw(`bw')" + local kernopt "kernel(`kernel')" + } +* clopt is omitted because it requires calculation of numbers of clusters, which is done +* only when S matrix is calculated + capture `ivreg2_cmd' `lhs' `cinexog1' /* + */ (`cendo1'=`cexexog1') /* + */ if `touse' `wtexp', `noconstant' /* + */ `options' `small' `robust' /* + */ `gmm2s' `bwopt' `kernopt' `dofmopt' /* + */ smatrix("`S'") noid nocollin + local rc = _rc + if `rc' == 481 { + scalar `cstat' = 0 + local cstatdf = 0 + } + else { + scalar `cj'=e(j) + local cjdf=e(jdf) + } + scalar `cstat' = `j' - `cj' + local cstatdf = `jdf' - `cjdf' + _estimates unhold `ivest' + scalar `cstatp'= chiprob(`cstatdf',`cstat') +* Collinearities may cause C-stat dof to differ from the number of variables in orthog() +* If so, set cstat=0 + if `cstatdf' != `clist_ct' { + scalar `cstat' = 0 + } + } + } +* End of orthog block + +******************************************************************************************* +* Endog option +******************************************************************************************* +* Uses recursive call with orthog + if "`endogtest'"!="" { + tempname estat estatp +* Initialize estat + scalar `estat' = 0 +* Each variable to test must be in endo list. +* To avoid overwriting, use eendo, einexog1, etc. + local eendo1 "`endo1'" + local einexog1 "`inexog1'" + local einsts1 "`insts1'" + local elist1 "`endogtest'" + local elist_ct : word count `elist1' +* Check to see if endog test vars are in original endo1 list of endogeneous variables +* eendo1 and einexog1 are after endog test vars have been removed from endo and added to inexog + foreach x of local elist1 { + local llendo_ct : word count `eendo1' + local eendo1 : list eendo1 - x + local eendo1_ct : word count `eendo1' + local ok = `llendo_ct' - `eendo1_ct' + if (`ok'==0) { +* Not in endogenous list +di in r "Error: `x' listed in endog() but does not appear as endogenous." + error 198 + } + else { + local einexog1 "`einexog1' `x'" + } + } +* Recursive call to ivreg2 using orthog option to obtain endogeneity test statistic +* Collinearities may cause problems, hence -capture-. + capture { + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + capture `ivreg2_cmd' `lhs' `einexog1' /* + */ (`eendo1'=`exexog1') if `touse' /* + */ `wtexp', `noconstant' `robust' `clopt' /* + */ `gmm2s' `liml' `bwopt' `kernopt' /* + */ `small' `dofmopt' `options' /* + */ orthog(`elist1') noid nocollin + local rc = _rc + if `rc' == 481 { + scalar `estat' = 0 + local estatdf = 0 + } + else { + scalar `estat'=e(cstat) + local estatdf=e(cstatdf) + scalar `estatp'=e(cstatp) + } + _estimates unhold `ivest' +* Collinearities may cause endog stat dof to differ from the number of variables in endog() +* If so, set estat=0 + if `estatdf' != `elist_ct' { + scalar `estat' = 0 + } + } +* End of endogeneity test block + } + +******************************************************************************************* +* Rank identification and redundancy block +******************************************************************************************* + if `endo1_ct' > 0 & "`noid'"=="" { + +* id=underidentification statistic, wid=weak identification statistic + tempname rkmatrix idrkstat widrkstat iddf idp + tempname ccf cdf rkf cceval cdeval cd cc + tempname idstat widstat + +* Anderson canon corr underidentification statistic if homo, rk stat if not +* Need id stat for testing full rank=(#cols-1) but might need all rk stats for -redundant- test + if "`redundant'"=="" { + local rkopt "full" + } + else { + local rkopt "all" + } + qui ranktest (`endo1') (`exexog1') `wtexp' if `touse', partial(`inexog1') `rkopt' /* + */ `noconstant' `robust' `clopt' `bwopt' `kernopt' + mat `rkmatrix'=r(rkmatrix) + if "`cluster'"=="" { + scalar `idstat'=r(chi2)/r(N)*(`N'-`dofminus') + } + else { +* No dofminus adjustment needed for cluster-robust + scalar `idstat'=r(chi2) + } + mat `cceval'=r(ccorr) + mat `cdeval' = J(1,`endo1_ct',.) + forval i=1/`endo1_ct' { + mat `cceval'[1,`i'] = (`cceval'[1,`i'])^2 + mat `cdeval'[1,`i'] = `cceval'[1,`i'] / (1 - `cceval'[1,`i']) + } + local iddf = `iv_ct' - (`rhs_ct'-1) + scalar `idp' = chiprob(`iddf',`idstat') +* Cragg-Donald F statistic. +* Under homoskedasticity, Wald cd eigenvalue = cc/(1-cc) Anderson canon corr eigenvalue. + scalar `cd'=`cdeval'[1,`endo1_ct'] + scalar `cdf'=`cd'*(`N'-`sdofminus'-`iv_ct'-`dofminus')/`exex1_ct' + +* Weak id statistic is Cragg-Donald F stat, rk Wald F stat if not + if "`robust'`cluster'`kernel'"=="" { + scalar `widstat'=`cdf' + } + else { +* Need only test of full rank + qui ranktest (`endo1') (`exexog1') `wtexp' if `touse', partial(`inexog1') full wald /* + */ `noconstant' `robust' `clopt' `bwopt' `kernopt' +* sdofminus used here so that F-stat matches test stat from regression with no partial + if "`cluster'"=="" { + scalar `rkf'=r(chi2)/r(N)*(`N'-`iv_ct'-`sdofminus'-`dofminus')/`exex1_ct' + } + else { + scalar `rkf'=r(chi2)/(`N'-1) /* + */ *(`N'-`iv_ct'-`sdofminus') /* + */ *(`N_clust'-1)/(`N_clust')/`exex1_ct' + } + scalar `widstat'=`rkf' + } + } + +* LM redundancy test + if `endo1_ct' > 0 & "`redundant'" ~= "" & "`noid'"=="" { +* Use K-P rk statistics and LM version of test +* Statistic is the rank of the matrix of Z_1B*X_2, where Z_1B are the possibly redundant +* instruments and X_1 are the endogenous regressors; both have X_2 (exogenous regressors) +* and Z_1A (maintained excluded instruments) partialled out. LM test of rank is +* is numerically equivalent to estimation of set of RF regressions and performing +* standard LM test of possibly redundant instruments. + + local redlist1 "`redundant'" + local rexexog1 : list exexog1 - redlist1 + local notlisted : list redlist1 - exexog1 + if "`notlisted'" ~= "" { +di in r "Error: `notlisted' listed in redundant() but does not appear as excluded instrument." + error 198 + } + local rexexog1_ct : word count `rexexog1' + if `rexexog1_ct' < `endo1_ct' { +di in r "Error: specification with redundant() option is unidentified (fails rank condition)" + error 198 + } +* LM version requires only -nullrank- rk statistics so would not need -all- option + tempname rrkmatrix + qui ranktest (`endo1') (`redlist1') `wtexp' if `touse', partial(`inexog1' `rexexog1') null /* + */ `noconstant' `robust' `clopt' `bwopt' `kernopt' + mat `rrkmatrix'=r(rkmatrix) + tempname redstat redp + local redlist_ct : word count `redlist1' +* dof adjustment needed because it doesn't use the adjusted S + if "`cluster'"=="" { + scalar `redstat' = `rrkmatrix'[1,1]/r(N)*(`N'-`dofminus') + } + else { +* No dofminus adjustment needed for cluster-robust + scalar `redstat' = `rrkmatrix'[1,1] + } + local reddf = `endo1_ct'*`redlist_ct' + scalar `redp' = chiprob(`reddf',`redstat') + } + +* End of identification stats block + +******************************************************************************************* +* Error-checking block +******************************************************************************************* + +* Check if adequate number of observations + if `N' <= `iv_ct' { +di in r "Error: number of observations must be greater than number of instruments" +di in r " including constant." + error 2001 + } + +* Check if robust VCV matrix is of full rank + if "`gmm2s'`robust'`cluster'`kernel'" != "" { +* Robust covariance matrix not of full rank means either a singleton dummy or too few +* clusters (in which case the indiv SEs are OK but no F stat or 2-step GMM is possible), +* or there are too many AC/HAC-lags, or the HAC covariance estimator +* isn't positive definite (possible with truncated and Tukey-Hanning kernels) + if `rankS' < `iv_ct' { +* If two-step GMM then exit with error ... + if "`gmm2s'" != "" { +di in r "Error: estimated covariance matrix of moment conditions not of full rank;" +di in r " cannot calculate optimal weighting matrix for GMM estimation." +di in r "Possible causes:" + if "`cluster'" != "" { +di in r " number of clusters insufficient to calculate optimal weighting matrix" + } + if "`kernel'" != "" { +di in r " covariance matrix of moment conditions not positive definite" +di in r " covariance matrix uses too many lags" + } +di in r " singleton dummy variable (dummy with one 1 and N-1 0s or vice versa)" +di in r "-partial- option may address problem. See help " _c +di in smcl "{help ivreg2}". + error 498 + } +* Estimation isn't two-step GMM so continue but J, F, and C stat (if present) all meaningless +* Must set Sargan-Hansen j = missing so that problem can be reported in output + else { + scalar `j' = . + if "`orthog'"!="" { + scalar `cstat' = . + } + if "`endogtest'"!="" { + scalar `estat' = . + } + } + } + } + +* End of error-checking block +******************************************************************************************** +* Reduced form and first stage regression options +******************************************************************************************* +* Relies on proper count of (non-collinear) IVs generated earlier. +* Note that nocons option + constant in instrument list means first-stage +* regressions are reported with nocons option. First-stage F-stat therefore +* correctly includes the constant as an explanatory variable. + + if "`rf'`saverf'`first'`ffirst'`savefirst'" != "" & (`endo1_ct' > 0) & "`noid'"=="" { +* Reduced form needed for AR first-stage test stat. Also estimated if requested. + tempname archi2 archi2p arf arfp ardf ardf_r sstat sstatp sstatdf + doRF "`lhs'" "`inexog1'" "`exexog1'" /* + */ `touse' `"`wtexp'"' `"`noconstant'"' `"`robust'"' /* + */ `"`clopt'"' `"`bwopt'"' `"`kernopt'"' /* + */ `"`saverfprefix'"' /* + */ "`dofminus'" "`sdofminus'" "`ivreg2_cmd'" + scalar `archi2'=r(archi2) + scalar `archi2p'=r(archi2p) + scalar `arf'=r(arf) + scalar `arfp'=r(arfp) + scalar `ardf'=r(ardf) + scalar `ardf_r'=r(ardf_r) + local rfeq "`r(rfeq)'" +* Drop saved rf results if needed only for first-stage estimations + if "`rf'`saverf'" == "" { + capture estimates drop `rfeq' + } +* Stock-Wright S statistic. Evaluate CUE objective function at b=0. +* Included exogenous, if any, are partialled out. + tempname b1 + mat `b1'=J(1,`endo1_ct',0) + matrix colnames `b1' = `endo1' + if `inexog1_ct' > 0 { + qui `ivreg2_cmd' `lhs' `inexog1' (`endo1'=`exexog1') `wtexp' if `touse', /* + */ b0(`b1') `noconstant' dofminus(`dofminus') /* + */ `robust' `clopt' `bwopt' `kernopt' nocollin partial(`inexog1') + } + else if `cons' > 0 { + qui `ivreg2_cmd' `lhs' (`endo1'=`exexog1') `wtexp' if `touse', /* + */ b0(`b1') `noconstant' dofminus(`dofminus') /* + */ `robust' `clopt' `bwopt' `kernopt' nocollin partial(_cons) + } + else { + qui `ivreg2_cmd' `lhs' (`endo1'=`exexog1') `wtexp' if `touse', /* + */ b0(`b1') `noconstant' dofminus(`dofminus') /* + */ `robust' `clopt' `bwopt' `kernopt' nocollin + } + + scalar `sstat'=e(j) + scalar `sstatdf'=`ardf' + scalar `sstatp'=chiprob(`sstatdf',`sstat') + } + + if "`first'`ffirst'`savefirst'" != "" & (`endo1_ct' > 0) { + + if `iv1_ct' > `iv_ct' { +di +di in gr "Warning: collinearities detected among instruments" +di in gr "1st stage tests of excluded exogenous variables may be incorrect" + } + + tempname firstmat + local sdofmopt = "sdofminus(`sdofminus')" + doFirst "`endo1'" "`inexog1'" "`exexog1'" "`XXinv'" "`XPZXinv'" /* + */ `touse' `"`wtexp'"' `"`noconstant'"' `"`robust'"' /* + */ `"`clopt'"' `"`bwopt'"' `"`kernopt'"' /* + */ `"`savefprefix'"' `"`dofmopt'"' `"`sdofmopt'"' /* + */ "`ivreg2_cmd'" + + local firsteqs "`r(firsteqs)'" + capture mat `firstmat' = r(firstmat) + if _rc != 0 { +di in ye "Warning: missing values encountered; first stage regression results not saved" + } + } +* End of first-stage regression code +********************************************************************************************** +* Post and display results. +******************************************************************************************* + +* restore data if preserved for partial option + if "`partial'" != "" { + restore + } + + if "`small'"!="" { + local NminusK = `N'-`rhs_ct'-`sdofminus' + capture ereturn post `B' `V', dep(`depname') obs(`N') esample(`touse') /* + */ dof(`NminusK') + } + else { + capture ereturn post `B' `V', dep(`depname') obs(`N') esample(`touse') + } + local rc = _rc + if `rc' == 504 { +di in red "Error: estimated variance-covariance matrix has missing values" + exit 504 + } + if `rc' == 506 { +di in red "Error: estimated variance-covariance matrix not positive-definite" + exit 506 + } + if `rc' > 0 { +di in red "Error: estimation failed - could not post estimation results" + exit `rc' + } + + ereturn local instd `endo' + local insts : colnames `S' +* Stata convention is to exclude constant from instrument list +* Need word option so that varnames with "_cons" in them aren't zapped + local insts : subinstr local insts "_cons" "", word + ereturn local insts `insts' + ereturn local inexog `inexog' + ereturn local exexog `exexog' + ereturn local partial `partial' + ereturn scalar inexog_ct=`inexog1_ct' + ereturn scalar exexog_ct=`exex1_ct' + ereturn scalar endog_ct =`endo1_ct' + ereturn scalar partial_ct =`partial_ct' + if "`collin'`ecollin'`dups'" != "" | `partial_ct' > 0 { + ereturn local collin `collin' + ereturn local ecollin `ecollin' + ereturn local dups `dups' + ereturn local instd1 `endo1' + ereturn local inexog1 `inexog1' + ereturn local exexog1 `exexog1' + ereturn local partial1 `partial1' + } + + if "`smatrix'" == "" { + ereturn matrix S `S' + } + else { +* Create a copy so posting doesn't zap the original + tempname Scopy + mat `Scopy'=`smatrix' + ereturn matrix S `Scopy' + } + +* No weighting matrix defined for LIML and kclass + if "`wmatrix'"=="" & "`liml'`kclass'"=="" { + ereturn matrix W `W' + } + else if "`liml'`kclass'"=="" { +* Create a copy so posting doesn't zap the original + tempname Wcopy + mat `Wcopy'=`wmatrix' + ereturn matrix W `Wcopy' + } + + if "`kernel'"!="" { + ereturn local kernel "`kernel'" + ereturn scalar bw=`bw' + ereturn local tvar "`tvar'" + if "`ivar'" ~= "" { + ereturn local ivar "`ivar'" + } + if "`bwchoice'" ~= "" { + ereturn local bwchoice "`bwchoice'" + } + } + + if "`small'"!="" { + ereturn scalar df_r=`df_r' + ereturn local small "small" + } + if "`nopartialsmall'"=="" { + ereturn local partialsmall "small" + } + + if "`cluster'"!="" { + ereturn scalar N_clust=`N_clust' + ereturn local clustvar `cluster' + } + + if "`robust'`cluster'" != "" { + ereturn local vcetype "Robust" + } + + ereturn scalar df_m=`df_m' + ereturn scalar sdofminus =`sdofminus' + ereturn scalar dofminus=`dofminus' + ereturn scalar r2=`r2' + ereturn scalar rmse=`rmse' + ereturn scalar rss=`rss' + ereturn scalar mss=`mss' + ereturn scalar r2_a=`r2_a' + ereturn scalar F=`F' + ereturn scalar Fp=`Fp' + ereturn scalar Fdf1=`Fdf1' + ereturn scalar Fdf2=`Fdf2' + ereturn scalar yy=`yy' + ereturn scalar yyc=`yyc' + ereturn scalar r2u=`r2u' + ereturn scalar r2c=`r2c' + ereturn scalar rankzz=`iv_ct' + ereturn scalar rankxx=`rhs_ct' + if "`gmm2s'`robust'`cluster'`kernel'" != "" { + ereturn scalar rankS=`rankS' + } + ereturn scalar rankV=`rankV' + ereturn scalar ll = -0.5 * (`N'*ln(2*_pi) + `N'*ln(`rss'/`N') + `N') + +* Always save J. Also save as Sargan if homoskedastic; save A-R if LIML. + ereturn scalar j=`j' + ereturn scalar jdf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar jp=`jp' + } + if ("`robust'`cluster'"=="") { + ereturn scalar sargan=`j' + ereturn scalar sargandf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar sarganp=`jp' + } + } + if "`liml'"!="" { + ereturn scalar arubin=`arubin' + ereturn scalar arubin_lin=`arubin_lin' + if `j' != 0 & `j' != . { + ereturn scalar arubinp=`arubinp' + ereturn scalar arubin_linp=`arubin_linp' + } + ereturn scalar arubindf=`jdf' + } + + if "`orthog'"!="" { + ereturn scalar cstat=`cstat' + if `cstat'!=0 & `cstat' != . { + ereturn scalar cstatp=`cstatp' + ereturn scalar cstatdf=`cstatdf' + ereturn local clist `clist1' + } + } + + if "`endogtest'"!="" { + ereturn scalar estat=`estat' + if `estat'!=0 & `estat' != . { + ereturn scalar estatp=`estatp' + ereturn scalar estatdf=`estatdf' + ereturn local elist `elist1' + } + } + + if `endo1_ct' > 0 & "`noid'"=="" { + ereturn scalar idstat=`idstat' + ereturn scalar iddf=`iddf' + ereturn scalar idp=`idp' + ereturn scalar cd=`cd' + ereturn scalar widstat=`widstat' + ereturn scalar cdf=`cdf' + capture ereturn matrix ccev=`cceval' + capture ereturn matrix cdev `cdeval' + capture ereturn scalar rkf=`rkf' + } + + if "`redundant'"!="" & "`noid'"=="" { + ereturn scalar redstat=`redstat' + ereturn scalar redp=`redp' + ereturn scalar reddf=`reddf' + ereturn local redlist `redlist1' + } + + if "`first'`ffirst'`savefirst'" != "" & `endo1_ct'>0 & "`noid'"=="" { +* Capture here because firstmat empty if mvs encountered in 1st stage regressions + capture ereturn matrix first `firstmat' + ereturn scalar arf=`arf' + ereturn scalar arfp=`arfp' + ereturn scalar archi2=`archi2' + ereturn scalar archi2p=`archi2p' + ereturn scalar ardf=`ardf' + ereturn scalar ardf_r=`ardf_r' + ereturn scalar sstat=`sstat' + ereturn scalar sstatp=`sstatp' + ereturn scalar sstatdf=`sstatdf' + ereturn local firsteqs `firsteqs' + } + if "`rf'`saverf'" != "" & `endo1_ct'>0 { + ereturn local rfeq `rfeq' + } + + ereturn local depvar `lhs' + + if "`liml'"!="" { + ereturn local model "liml" + ereturn scalar kclass=`kclass2' + ereturn scalar lambda=`lambda' + if `fuller' > 0 & `fuller' < . { + ereturn scalar fuller=`fuller' + } + } + else if "`kclass'" != "" { + ereturn local model "kclass" + ereturn scalar kclass=`kclass2' + } + else if "`gmm2s'`cue'`b0'`wmatrix'"=="" { + if "`endo1'" == "" { + ereturn local model "ols" + } + else { + ereturn local model "iv" + } + } + else if "`cue'`b0'"~="" { + ereturn local model "cue" + } + else if "`gmm2s'"~="" { + ereturn local model "gmm2s" + } + else if "`wmatrix'"~="" { + ereturn local model "gmmw" + } + else { +* Should never enter here + ereturn local model "unknown" + } + + if "`weight'" != "" { + ereturn local wexp "=`exp'" + ereturn local wtype `weight' + } + ereturn local cmd `ivreg2_cmd' + ereturn local cmdline `cmdline' + ereturn local version `lversion' + ereturn scalar cons=`cons' + ereturn scalar partialcons=`partialcons' + + ereturn local predict "`ivreg2_cmd'_p" + + if "`e(model)'"=="gmm2s" & "`wmatrix'"=="" { + local title2 "2-Step GMM estimation" + } + else if "`e(model)'"=="gmm2s" & "`wmatrix'"~="" { + local title2 "2-Step GMM estimation with user-supplied first-step weighting matrix" + } + else if "`e(model)'"=="gmmw" { + local title2 "GMM estimation with user-supplied weighting matrix" + } + else if "`e(model)'"=="cue" & "`b0'"=="" { + local title2 "CUE estimation" + } + else if "`e(model)'"=="cue" & "`b0'"~="" { + local title2 "CUE evaluated at user-supplied parameter vector" + } + else if "`e(model)'"=="ols" { + local title2 "OLS estimation" + } + else if "`e(model)'"=="iv" { + local title2 "IV (2SLS) estimation" + } + else if "`e(model)'"=="liml" { + local title2 "LIML estimation" + } + else if "`e(model)'"=="kclass" { + local title2 "k-class estimation" + } + else { +* Should never reach here + local title2 "unknown estimation" + } + if "`e(vcetype)'" == "Robust" { + local hacsubtitle1 "heteroskedasticity" + } + if "`e(kernel)'"!="" { + local hacsubtitle3 "autocorrelation" + } + if "`e(clustvar)'"!="" { + local hacsubtitle3 "clustering on `e(clustvar)'" + } + if "`hacsubtitle1'"~="" & "`hacsubtitle3'" ~= "" { + local hacsubtitle2 " and " + } + if "`title'"=="" { + ereturn local title "`title1'`title2'" + } + else { + ereturn local title "`title'" + } + if "`subtitle'"~="" { + ereturn local subtitle "`subtitle'" + } + local hacsubtitle "`hacsubtitle1'`hacsubtitle2'`hacsubtitle3'" + if "`b0'"~="" { + ereturn local hacsubtitleB "Estimates based on supplied parameter vector" + } + else if "`hacsubtitle'"~="" & "`gmm2s'`cue'"~="" { + ereturn local hacsubtitleB "Estimates efficient for arbitrary `hacsubtitle'" + } + else if "`wmatrix'"~="" { + ereturn local hacsubtitleB "Efficiency of estimates dependent on weighting matrix" + } + else { + ereturn local hacsubtitleB "Estimates efficient for homoskedasticity only" + } + if "`hacsubtitle'"~="" { + ereturn local hacsubtitleV "Statistics robust to `hacsubtitle'" + } + else { + ereturn local hacsubtitleV "Statistics consistent for homoskedasticity only" + } + } + +******************************************************************************************* +* Display results unless ivreg2 called just to generate stats or nooutput option + + if "`nooutput'" == "" { + if "`savefirst'`saverf'" != "" { + DispStored `"`saverf'"' `"`savefirst'"' `"`ivreg2_cmd'"' + } + if "`rf'" != "" { + DispRF + } + if "`first'" != "" { + DispFirst `"`ivreg2_cmd'"' + } + if "`first'`ffirst'" != "" { + DispFFirst `"`ivreg2_cmd'"' + } + if "`eform'"!="" { + local efopt "eform(`eform')" + } + DispMain `"`noheader'"' `"`plus'"' `"`efopt'"' `"`level'"' `"`nofooter'"' `"`ivreg2_cmd'"' + } + +* Drop first stage estimations unless explicitly saved or if replay + if "`savefirst'" == "" { + local firsteqs "`e(firsteqs)'" + foreach eqname of local firsteqs { + capture estimates drop `eqname' + } + ereturn local firsteqs + } + +* Drop reduced form estimation unless explicitly saved or if replay + if "`saverf'" == "" { + local eqname "`e(rfeq)'" + capture estimates drop `eqname' + ereturn local rfeq + } + +end + +******************************************************************************************* +* SUBROUTINES +******************************************************************************************* + +program define DispMain, eclass + args noheader plus efopt level nofooter helpfile + version 8.2 +* Prepare for problem resulting from rank(S) being insufficient +* Results from insuff number of clusters, too many lags in HAC, +* to calculate robust S matrix, HAC matrix not PD, singleton dummy, +* and indicated by missing value for j stat +* Macro `rprob' is either 1 (problem) or 0 (no problem) + capture local rprob ("`e(j)'"==".") + + if "`noheader'"=="" { + if "`e(title)'" ~= "" { +di in gr _n "`e(title)'" + local tlen=length("`e(title)'") +di in gr "{hline `tlen'}" + } + if "`e(subtitle)'" ~= "" { +di in gr "`e(subtitle)'" + } + if "`e(model)'"=="liml" | "`e(model)'"=="kclass" { +di in gr "k =" %7.5f `e(kclass)' + } + if "`e(model)'"=="liml" { +di in gr "lambda =" %7.5f `e(lambda)' + } + if e(fuller) > 0 & e(fuller) < . { +di in gr "Fuller parameter=" %-5.0f `e(fuller)' + } + if "`e(hacsubtitleB)'" ~= "" { +di in gr _n "`e(hacsubtitleB)'" _c + } + if "`e(hacsubtitleV)'" ~= "" { +di in gr _n "`e(hacsubtitleV)'" + } + if "`e(kernel)'"!="" { +di in gr " kernel=`e(kernel)'; bandwidth=" %6.2g `e(bw)' + if "`e(bwchoice)'"!="" { +di in gr " `e(bwchoice)'" + } +di in gr " time variable (t): " in ye e(tvar) + if "`e(ivar)'" != "" { +di in gr " group variable (i): " in ye e(ivar) + } + } + di + if "`e(clustvar)'"!="" { +di in gr "Number of clusters (" "`e(clustvar)'" ") = " in ye %-4.0f e(N_clust) _continue + } + else { +di in gr " " _continue + } +di in gr _col(55) "Number of obs = " in ye %8.0f e(N) +di in gr _c _col(55) "F(" %3.0f e(Fdf1) "," %6.0f e(Fdf2) ") = " + if e(F) < 99999 { +di in ye %8.2f e(F) + } + else { +di in ye %8.2e e(F) + } +di in gr _col(55) "Prob > F = " in ye %8.4f e(Fp) + +di in gr "Total (centered) SS = " in ye %12.0g e(yyc) _continue +di in gr _col(55) "Centered R2 = " in ye %8.4f e(r2c) +di in gr "Total (uncentered) SS = " in ye %12.0g e(yy) _continue +di in gr _col(55) "Uncentered R2 = " in ye %8.4f e(r2u) +di in gr "Residual SS = " in ye %12.0g e(rss) _continue +di in gr _col(55) "Root MSE = " in ye %8.4g e(rmse) +di + } + +* Display coefficients etc. +* Unfortunate but necessary hack here: to suppress message about cluster adjustment of +* standard error, clear e(clustvar) and then reset it after display + local cluster `e(clustvar)' + ereturn local clustvar + ereturn display, `plus' `efopt' level(`level') + ereturn local clustvar `cluster' + +* Display 1st footer with identification stats +* Footer not displayed if -nofooter- option or if pure OLS, i.e., model="ols" and Sargan-Hansen=0 + if ~("`nofooter'"~="" | (e(model)=="ols" & (e(sargan)==0 | e(j)==0))) { + +* Under ID test + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##idtest:Underidentification test}" + if "`e(vcetype)'`e(kernel)'"=="" { +di in gr _c " (Anderson canon. corr. LM statistic):" + } + else { +di in gr _c " (Kleibergen-Paap rk LM statistic):" + } +di in ye _col(71) %8.3f e(idstat) +di in gr _col(52) "Chi-sq(" in ye e(iddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(idp) +* IV redundancy statistic + if "`e(redlist)'"!="" { +di in gr "-redundant- option:" +di in smcl _c "{help `helpfile'##redtest:IV redundancy test}" +di in gr _c " (LM test of redundancy of specified instruments):" +di in ye _col(71) %8.3f e(redstat) +di in gr _col(52) "Chi-sq(" in ye e(reddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(redp) +di in gr "Instruments tested: " _c + Disp `e(redlist)', _col(23) + } +di in smcl in gr "{hline 78}" + } +* Report Cragg-Donald statistic + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##widtest:Weak identification test}" +di in gr " (Cragg-Donald Wald F statistic):" in ye _col(71) %8.3f e(cdf) + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr " (Kleibergen-Paap rk Wald F statistic):" in ye _col(71) %8.3f e(widstat) + } +di in gr _c "Stock-Yogo weak ID test critical values:" + local cdmissing=1 + if "`e(model)'"=="iv" | "`e(model)'"=="gmm2s" | "`e(model)'"=="gmmw" { + cdsy, type(ivbias5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "15% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "25% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)==.) | "`e(model)'"=="cue" { + cdsy, type(limlsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "15% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "25% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)<.) { + cdsy, type(fullrel5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + if `cdmissing' { + di in gr _col(64) "" + } + else { + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." + } + } + di in smcl in gr "{hline 78}" + } + +* Report either (a) Sargan-Hansen-C stats, or (b) robust covariance matrix problem +* e(model)="gmmw" means user-supplied weighting matrix and Hansen J using 2nd-step resids reported + if `rprob' == 0 { +* Display overid statistic + if "`e(vcetype)'" == "Robust" | "`e(model)'" == "gmmw" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } + else { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } +di in ye _col(71) %8.3f e(j) + if e(rankxx) < e(rankzz) { +di in gr _col(52) "Chi-sq(" in ye e(jdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(jp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + +* Display orthog option: C statistic (difference of Sargan statistics) + if e(cstat) != . { +* If C-stat = 0 then warn, otherwise output + if e(cstat) > 0 { +di in gr "-orthog- option:" + if "`e(vcetype)'" == "Robust" { +di in gr _c "Hansen J statistic (eqn. excluding suspect orthog. conditions): " + } + else { +di in gr _c "Sargan statistic (eqn. excluding suspect orthogonality conditions):" + } +di in ye _col(71) %8.3f e(j)-e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(jdf)-e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f chiprob(e(jdf)-e(cstatdf),e(j)-e(cstat)) +di in smcl _c "{help `helpfile'##ctest:C statistic}" +di in gr _c " (exogeneity/orthogonality of suspect instruments): " +di in ye _col(71) %8.3f e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f e(cstatp) +di in gr "Instruments tested: " _c + Disp `e(clist)', _col(23) + } + if e(cstat) == 0 { +di in gr _n "Collinearity/identification problems in eqn. excl. suspect orthog. conditions:" +di in gr " C statistic not calculated for -orthog- option" + } + } + } + else { +* Problem exists with robust VCV - notify and list possible causes +di in r "Warning: estimated covariance matrix of moment conditions not of full rank." + if e(rankxx) < e(rankzz) { +di in r " overidentification statistic not reported, and" + } +di in r " standard errors and model tests should be interpreted with caution." +di in r "Possible causes:" + if "`e(N_clust)'" != "" { +di in r " number of clusters insufficient to calculate robust covariance matrix" + } + if "`e(kernel)'" != "" { +di in r " covariance matrix of moment conditions not positive definite" +di in r " covariance matrix uses too many lags" + } +di in r " singleton dummy variable (dummy with one 1 and N-1 0s or vice versa)" +di in r in smcl _c "{help `helpfile'##partial:partial}" +di in r " option may address problem." + } + +* Display endog option: endogeneity test statistic + if e(estat) != . { +* If stat = 0 then warn, otherwise output + if e(estat) > 0 { +di in gr "-endog- option:" +di in smcl _c "{help `helpfile'##endogtest:Endogeneity test}" +di in gr _c " of endogenous regressors: " +di in ye _col(71) %8.3f e(estat) +di in gr _col(52) "Chi-sq(" in ye e(estatdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(estatp) +di in gr "Regressors tested: " _c + Disp `e(elist)', _col(23) + } + if e(estat) == 0 { +di in gr _n "Collinearity/identification problems in restricted equation:" +di in gr " Endogeneity test statistic not calculated for -endog- option" + } + } + + di in smcl in gr "{hline 78}" +* Display AR overid statistic if LIML and not robust + if "`e(model)'" == "liml" & "`e(vcetype)'" ~= "Robust" & "`e(kernel)'" == "" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (LR test of excluded instruments):" + } +di in ye _col(72) %7.3f e(arubin) + if e(rankxx) < e(rankzz) { +di in gr _col(52) "Chi-sq(" in ye e(arubindf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(arubinp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + di in smcl in gr "{hline 78}" + } + } + +* Display 2nd footer with variable lists + if "`nofooter'"=="" { + +* Warn about dropped instruments if any +* (Re-)calculate number of user-supplied instruments + local iv1_ct : word count `e(insts)' + local iv1_ct = `iv1_ct' + `e(cons)' + + if `iv1_ct' > e(rankzz) { +di in gr "Collinearities detected among instruments: " _c +di in gr `iv1_ct'-e(rankzz) " instrument(s) dropped" + } + + if "`e(collin)'`e(dups)'" != "" | `e(partial_ct)'>0 { +* If collinearities, duplicates or partial, abbreviated varlists saved with a 1 at the end + local one "1" + } + if "`e(instd)'" != "" { + di in gr "Instrumented:" _c + Disp `e(instd`one')', _col(23) + } + if "`e(inexog)'" != "" { + di in gr "Included instruments:" _c + Disp `e(inexog`one')', _col(23) + } + if "`e(exexog)'" != "" { + di in gr "Excluded instruments:" _c + Disp `e(exexog`one')', _col(23) + } + if `e(partial_ct)' > 0 { + if e(partialcons) { + local partial "`e(partial`one')' _cons" + } + else { + local partial "`e(partial`one')'" + } +di in smcl _c "{help `helpfile'##partial:Partialled-out}" + di in gr ":" _c + Disp `partial', _col(23) + if "`e(partialsmall)'"=="" { +di in gr _col(23) "nb: small-sample adjustments do not account for" +di in gr _col(23) " partialled-out variables" + } + else { +di in gr _col(23) "nb: small-sample adjustments account for" +di in gr _col(23) " partialled-out variables" + } + } + if "`e(dups)'" != "" { + di in gr "Duplicates:" _c + Disp `e(dups)', _col(23) + } + if "`e(collin)'" != "" { + di in gr "Dropped collinear:" _c + Disp `e(collin)', _col(23) + } + if "`e(ecollin)'" != "" { + di in gr "Reclassified as exog:" _c + Disp `e(ecollin)', _col(23) + } + di in smcl in gr "{hline 78}" + } +end + +************************************************************************************** + +program define DispRF + version 8.2 + local eqname "`e(rfeq)'" + local depvar "`e(depvar)'" + local strlen : length local depvar + local strlen = `strlen'+25 +di +di in gr "Reduced-form regression: `e(depvar)'" +di in smcl in gr "{hline `strlen'}" + capture estimates replay `eqname' + if "`eqname'"=="" | _rc != 0 { +di in ye "Unable to display reduced-form regression of `e(depvar)'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + else { + estimates replay `eqname', noheader +di + } +end + +program define DispFirst + version 8.2 + args helpfile + tempname firstmat ivest sheapr2 pr2 F df df_r pvalue APF APFdf1 APFdf2 APFp APr2 + + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display first-stage estimates; macro e(first) is missing" + exit + } +di in gr _newline "First-stage regressions" +di in smcl in gr "{hline 23}" +di + local endo1 : colnames(`firstmat') + local nrvars : word count `endo1' + local firsteqs "`e(firsteqs)'" + local nreqs : word count `firsteqs' + if `nreqs' < `nrvars' { +di in ye "Unable to display all first-stage regressions." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + foreach eqname of local firsteqs { + _estimates hold `ivest' + capture estimates restore `eqname' + if _rc != 0 { +di +di in ye "Unable to list stored estimation `eqname'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + else { + local vn "`e(depvar)'" +di in gr "First-stage regression of `vn':" + estimates replay `eqname', noheader + mat `sheapr2' =`firstmat'["sheapr2","`vn'"] + mat `pr2' =`firstmat'["pr2","`vn'"] + mat `F' =`firstmat'["F","`vn'"] + mat `df' =`firstmat'["df","`vn'"] + mat `df_r' =`firstmat'["df_r","`vn'"] + mat `pvalue' =`firstmat'["pvalue","`vn'"] + mat `APF' =`firstmat'["APF","`vn'"] + mat `APFdf1' =`firstmat'["APFdf1","`vn'"] + mat `APFdf2' =`firstmat'["APFdf2","`vn'"] + mat `APFp' =`firstmat'["APFp","`vn'"] + mat `APr2' =`firstmat'["APr2","`vn'"] + +di in gr "F test of excluded instruments:" +di in gr " F(" %3.0f `df'[1,1] "," %6.0f `df_r'[1,1] ") = " in ye %8.2f `F'[1,1] +di in gr " Prob > F = " in ye %8.4f `pvalue'[1,1] + +di in smcl "{help `helpfile'##apstats:Angrist-Pischke multivariate F test of excluded instruments:}" +di in gr " F(" %3.0f `APFdf1'[1,1] "," %6.0f `APFdf2'[1,1] ") = " in ye %8.2f `APF'[1,1] +di in gr " Prob > F = " in ye %8.4f `APFp'[1,1] + +di + } + _estimates unhold `ivest' + } +end + +program define DispStored + args saverf savefirst helpfile + version 8.2 + if "`saverf'" != "" { + local eqlist "`e(rfeq)'" + } + if "`savefirst'" != "" { + local eqlist "`eqlist' `e(firsteqs)'" + } + local eqlist : list retokenize eqlist +di in gr _newline "Stored estimation results" +di in smcl in gr "{hline 25}" _c + capture estimates dir `eqlist' + if "`eqlist'" != "" & _rc == 0 { +* Estimates exist and can be listed + estimates dir `eqlist' + } + else if "`eqlist'" != "" & _rc != 0 { +di +di in ye "Unable to list stored estimations." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } +end + +program define DispFFirst + version 8.2 + args helpfile + tempname firstmat + tempname sheapr2 pr2 F df df_r pvalue APF APFdf1 APFdf2 APFp APchi2 APchi2p APr2 + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display summary of first-stage estimates; macro e(first) is missing" + exit + } + local endo : colnames(`firstmat') + local nrvars : word count `endo' + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + local efirsteqs "`e(firsteqs)'" + + mat `df' =`firstmat'["df",1] + mat `df_r' =`firstmat'["df_r",1] + mat `APFdf1' =`firstmat'["APFdf1",1] + mat `APFdf2' =`firstmat'["APFdf2",1] + +di +di in gr _newline "Summary results for first-stage regressions" +di in smcl in gr "{hline 43}" +di + +di _c in smcl _col(44) "{help `helpfile'##apstats:(Underid)}" +di in smcl _col(65) "{help `helpfile'##apstats:(Weak id)}" + +di _c in gr "Variable |" +di _c in smcl _col(16) "{help `helpfile'##apstats:F}" in gr "(" +di _c in ye _col(17) %3.0f `df'[1,1] in gr "," in ye %6.0f `df_r'[1,1] in gr ") P-val" +di _c in gr _col(37) "|" +di _c in smcl _col(39) "{help `helpfile'##apstats:AP Chi-sq}" in gr "(" +di _c in ye %3.0f `APFdf1'[1,1] in gr ") P-val" +di _c in gr _col(60) "|" +di _c in smcl _col(62) "{help `helpfile'##apstats:AP F}" in gr "(" +di in ye _col(67) %3.0f `APFdf1'[1,1] in gr "," in ye %6.0f `APFdf2'[1,1] in gr ")" + + local i = 1 + foreach vn of local endo { + + mat `sheapr2' =`firstmat'["sheapr2","`vn'"] + mat `pr2' =`firstmat'["pr2","`vn'"] + mat `F' =`firstmat'["F","`vn'"] + mat `df' =`firstmat'["df","`vn'"] + mat `df_r' =`firstmat'["df_r","`vn'"] + mat `pvalue' =`firstmat'["pvalue","`vn'"] + mat `APF' =`firstmat'["APF","`vn'"] + mat `APFdf1' =`firstmat'["APFdf1","`vn'"] + mat `APFdf2' =`firstmat'["APFdf2","`vn'"] + mat `APFp' =`firstmat'["APFp","`vn'"] + mat `APchi2' =`firstmat'["APchi2","`vn'"] + mat `APchi2p' =`firstmat'["APchi2p","`vn'"] + mat `APr2' =`firstmat'["APr2","`vn'"] + + local vnlen : length local vn + if `vnlen' > 12 { + local vn : piece 1 12 of "`vn'" + } +di _c in y %-12s "`vn'" _col(14) in gr "|" _col(18) in y %8.2f `F'[1,1] +di _c _col(28) in y %8.4f `pvalue'[1,1] +di _c _col(37) in g "|" _col(42) in y %8.2f `APchi2'[1,1] _col(51) in y %8.4f `APchi2p'[1,1] +di _col(60) in g "|" _col(65) in y %8.2f `APF'[1,1] + local i = `i' + 1 + } +di + + if "`robust'`cluster'" != "" { + if "`cluster'" != "" { + local rtype "cluster-robust" + } + else if "`kernel'" != "" { + local rtype "heteroskedasticity and autocorrelation-robust" + } + else { + local rtype "heteroskedasticity-robust" + } + } + else if "`kernel'" != "" { + local rtype "autocorrelation-robust" + } + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: first-stage test statistics `rtype'" +di + } + + local k2 = `APFdf1'[1,1] +di in gr "Stock-Yogo weak ID test critical values for single endogenous regressor:" + local cdmissing=1 + if "`e(model)'"=="iv" | "`e(model)'"=="gmm2s" | "`e(model)'"=="gmmw" { + cdsy, type(ivbias5) k2(`e(exexog_ct)') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(37) "5% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)==.) | "`e(model)'"=="cue" { + cdsy, type(limlsize10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)<.) { + cdsy, type(fullrel5) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(43) "5% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "30% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." +di + } + else { +di + } + +* Check that AP chi-sq and F denominator are correct and = underid test dof + if e(iddf)~=`APFdf1'[1,1] { +di in red "Warning: Error in calculating first-stage id statistics above;" +di in red " dof of AP statistics is " `APFdf1'[1,1] ", should be L-(K-1)=`e(iddf)'." + } + + tempname iddf idstat idp widstat cdf rkf + scalar `iddf'=e(iddf) + scalar `idstat'=e(idstat) + scalar `idp'=e(idp) + scalar `widstat'=e(widstat) + scalar `cdf'=e(cdf) + capture scalar `rkf'=e(rkf) +di in smcl "{help `helpfile'##idtest:Underidentification test}" +di in gr "Ho: matrix of reduced form coefficients has rank=K1-1 (underidentified)" +di in gr "Ha: matrix has rank=K1 (identified)" + if "`robust'`kernel'"=="" { +di in ye "Anderson canon. corr. LM statistic" _c + } + else { +di in ye "Kleibergen-Paap rk LM statistic" _c + } +di in gr _col(42) "Chi-sq(" in ye `iddf' in gr ")=" %-7.2f in ye `idstat' /* + */ _col(61) in gr "P-val=" %6.4f in ye `idp' + +di +di in smcl "{help `helpfile'##widtest:Weak identification test}" +di in gr "Ho: equation is weakly identified" +di in ye "Cragg-Donald Wald F statistic" _col(65) %8.2f `cdf' + if "`robust'`kernel'"~="" { +di in ye "Kleibergen-Paap Wald rk F statistic" _col(65) %8.2f `rkf' + } +di + +di in gr "Stock-Yogo weak ID test critical values for K1=`e(endog_ct)' and L1=`e(exexog_ct)':" + local cdmissing=1 + if "`e(model)'"=="iv" | "`e(model)'"=="gmm2s" | "`e(model)'"=="gmmw" { + cdsy, type(ivbias5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(37) "5% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)==.) | "`e(model)'"=="cue" { + cdsy, type(limlsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)<.) { + cdsy, type(fullrel5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "30% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + if `cdmissing' { + di in gr _col(64) "" + } + else { + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." + } + di + } + + tempname arf arfp archi2 archi2p ardf ardf_r + tempname sstat sstatp sstatdf +di in smcl "{help `helpfile'##wirobust:Weak-instrument-robust inference}" +di in gr "Tests of joint significance of endogenous regressors B1 in main equation" +di in gr "Ho: B1=0 and orthogonality conditions are valid" +* Needs to be small so that adjusted dof is reflected in F stat + scalar `arf'=e(arf) + scalar `arfp'=e(arfp) + scalar `archi2'=e(archi2) + scalar `archi2p'=e(archi2p) + scalar `ardf'=e(ardf) + scalar `ardf_r'=e(ardf_r) + scalar `sstat'=e(sstat) + scalar `sstatp'=e(sstatp) + scalar `sstatdf'=e(sstatdf) +di in ye _c "Anderson-Rubin Wald test" +di in gr _col(36) "F(" in ye `ardf' in gr "," in ye `ardf_r' in gr ")=" /* + */ _col(49) in ye %7.2f `arf' _col(61) in gr "P-val=" in ye %6.4f `arfp' +di in ye _c "Anderson-Rubin Wald test" +di in gr _col(36) "Chi-sq(" in ye `ardf' in gr ")=" /* + */ _col(49) in ye %7.2f `archi2' _col(61) in gr "P-val=" in ye %6.4f `archi2p' +di in ye _c "Stock-Wright LM S statistic" +di in gr _col(36) "Chi-sq(" in ye `sstatdf' in gr ")=" /* + */ _col(49) in ye %7.2f `sstat' _col(61) in gr "P-val=" in ye %6.4f `sstatp' +di + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: Underidentification, weak identification and weak-identification-robust" +di in gr " test statistics `rtype'" +di + } + + if "`cluster'" != "" { +di in gr "Number of clusters N_clust = " in ye %10.0f e(N_clust) + } +di in gr "Number of observations N = " in ye %10.0f e(N) +di in gr "Number of regressors K = " in ye %10.0f e(rankxx) +di in gr "Number of endogenous regressors K1 = " in ye %10.0f e(endog_ct) +di in gr "Number of instruments L = " in ye %10.0f e(rankzz) +di in gr "Number of excluded instruments L1 = " in ye %10.0f e(ardf) + if "`e(partial)'" != "" { +di in gr "Number of partialled-out regressors/IVs = " in ye %10.0f e(partial_ct) +di in gr "NB: K & L do not included partialled-out variables" + } + +end + +* Performs first-stage regressions + +program define doFirst, rclass + version 8.2 + args endog /* variable list (including depvar) + */ inexog /* list of included exogenous + */ exexog /* list of excluded exogenous + */ XXinv /* + */ XPZXinv /* + */ touse /* touse sample + */ weight /* full weight expression w/ [] + */ nocons /* + */ robust /* + */ clopt /* + */ bwopt /* + */ kernopt /* + */ savefprefix /* + */ dofmopt /* + */ sdofmopt /* + */ ivreg2_cmd + +* Create fitted values of endogenous regressors + local endog_hat "" + tsrevar `endog' + local ts_endog "`r(varlist)'" + foreach x of local ts_endog { + qui regress `x' `inexog' `exexog' `weight' if `touse', `nocons' + tempname `x'_hat + qui predict double ``x'_hat', xb + local endog_hat "`endog_hat' ``x'_hat'" + } +* inexog and exexog are used with partial() option so must tsrevar them + tsrevar `inexog' + local ts_inexog "`r(varlist)'" + tsrevar `exexog' + local ts_exexog "`r(varlist)'" + + tempname statmat statmat1 + local i 1 + foreach x of local endog { + capture `ivreg2_cmd' `x' `inexog' `exexog' `weight' /* + */ if `touse', `nocons' `robust' `clopt' `bwopt' `kernopt' /* + */ `dofmopt' `sdofmopt' small nocollin + if _rc ~= 0 { +* First-stage regression failed +di in ye "Unable to estimate first-stage regression of `x'" + if _rc == 506 { +di in ye " var-cov matrix of first-stage regression of `x' not positive-definite" + } + } + else { +* First-stage regression successful +* Check if there is enough room to save results; leave one free. Allow for overwriting. +* Max is 20-1=19 for Stata 9.0 and earlier, 300-1=299 for Stata 9.1+ + local maxest=299 + local vn "`x'" + local plen : length local savefprefix + local vlen : length local vn + if `plen'+`vlen' > 27 { + local vlen=27-`plen' + local vn : permname `vn', length(`vlen') +* Must create a variable so that permname doesn't reuse it + gen `vn'=0 + local dropvn "`dropvn' `vn'" + } + local eqname "`savefprefix'`vn'" + local eqname : subinstr local eqname "." "_" + qui estimates dir + local est_list "`r(names)'" + Subtract est_list : "`est_list'" "`eqname'" + local est_ct : word count `est_list' + if `est_ct' < `maxest' { + capture est store `eqname', title("First-stage regression: `x'") + if _rc == 0 { + local firsteqs "`firsteqs' `eqname'" + } + } + else { +di +di in ye "Unable to store first-stage regression of `x'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + tempname rssall rssinc pr2 F p + scalar `rssall'=e(rss) + quietly test `exexog' + scalar `F'=r(F) + scalar `p'=r(p) + local df=r(df) + local df_r=r(df_r) +* 1st stage regression without excluded exogenous +* Use regress since need only RSS and handles all cases, including perverse ones (e.g. no regressors) + qui regress `x' `inexog' `weight' if `touse', `nocons' + scalar `rssinc'=e(rss) +* NB: uncentered R2 for main regression is 1-rssall/yy; for restricted is 1-rssinc/yy; +* squared semipartial correlation=(rssinc-rssall)/yy=diff of 2 R2s +* Squared partial correlation (="partialled-out R2") + scalar `pr2'=(`rssinc'-`rssall')/`rssinc' + +* A-P multivariate F and corresponding r-sq + tempname APF APFdf1 APFdf2 APFp APchi2 APchi2p APr2 + local x_hat "`endog_hat'" + tokenize `endog_hat' + Subtract x_hat : "`x_hat'" "``i''" + tokenize `ts_endog' + local ts_x "``i''" + qui `ivreg2_cmd' `ts_x' `x_hat' `ts_inexog' `ts_exexog' `weight' /* + */ if `touse', `nocons' `robust' `clopt' `bwopt' `kernopt' /* + */ `dofmopt' `sdofmopt' small nocollin partial(`x_hat' `ts_inexog') + scalar `APF' = e(F) + scalar `APFdf1' = e(Fdf1) + scalar `APFdf2' = e(Fdf2) + scalar `APFp' = e(Fp) + if "`clopt'"=="" { + scalar `APchi2' = e(F)*e(Fdf1)/e(Fdf2)*(e(N)-e(dofminus)) + } + else { + scalar `APchi2' = e(F)*e(Fdf1)/e(Fdf2)*e(N_clust)/(e(N)-e(rankxx)-e(sdofminus))*(e(N)-1) + } + scalar `APchi2p'= chi2tail(e(Fdf1),`APchi2') + scalar `APr2' = e(r2) + +* End of first-stage successful block + } + +* Godfrey method of Shea partial R2 uses IV and OLS estimates without robust vcvs: +* Partial R2 = OLS V[d,d] / IV V[d,d] * IV s2 / OLS s2 +* where d,d is the diagonal element corresponding to the endog regressor +* ... but this simplifies to matrices that have already been calculated: +* = XXinv[d,d] / XPZXinv[d,d] + tempname sols siv + tempname sheapr2 + mat `sols'=`XXinv'["`x'","`x'"] + mat `siv'=`XPZXinv'["`x'","`x'"] + scalar `sheapr2' = `sols'[1,1]/`siv'[1,1] + + capture { + mat `statmat1' = (`sheapr2' \ `pr2' \ `F' \ `df' \ `df_r' \ `p' /* + */ \ `APF' \ `APFdf1' \ `APFdf2' \ `APFp' \ `APchi2' \ `APchi2p' \ `APr2') + mat colname `statmat1' = `x' + mat `statmat' = nullmat(`statmat') , `statmat1' + } + local i = `i' + 1 + } +* Drop any temporarily-created permname variables + if trim("`dropvn'")~="" { + foreach vn of varlist `dropvn' { + capture drop `vn' + } + } + capture mat rowname `statmat' = sheapr2 pr2 F df df_r pvalue APF APFdf1 APFdf2 APFp APchi2 APchi2p APr2 + if _rc==0 { + return matrix firstmat `statmat' + } + return local firsteqs "`firsteqs'" +end + +program define doRF, rclass + version 8.2 + args lhs /* + */ inexog /* list of included exogenous + */ exexog /* list of excluded exogenous + */ touse /* touse sample + */ weight /* full weight expression w/ [] + */ nocons /* + */ robust /* + */ clopt /* + */ bwopt /* + */ kernopt /* + */ saverfprefix /* + */ dofminus /* + */ sdofminus /* + */ ivreg2_cmd + +* Anderson-Rubin test of signif of endog regressors (Bo=0) +* In case ivreg2 called with adjusted dof, first stage should adjust dof as well + tempname arf arfp archi2 archi2p ardf ardf_r tempest + capture _estimates hold `tempest' + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } +* Needs to be small so that adjusted dof is reflected in F stat +* capture to prevent not-full-rank error warning + capture `ivreg2_cmd' `lhs' `inexog' `exexog' `weight' if `touse', /* + */ small `nocons' dofminus(`dofminus') sdofminus(`sdofminus') /* + */ `robust' `clopt' `bwopt' `kernopt' nocollin + if _rc != 0 { +di as err "Error: reduced form estimation failed" + exit 498 + } + qui test `exexog' + scalar `arf'=r(F) + scalar `arfp'=r(p) + scalar `ardf'=r(df) + scalar `ardf_r'=r(df_r) + if "`clopt'"=="" { + scalar `archi2'=`arf'*`ardf'*(e(N)-`dofminus')/(e(N)-e(rankxx)-`dofminus'-`sdofminus') + } + else { + scalar `archi2'=`arf'*`ardf'*e(N_clust)/r(df_r)*(e(N)-1)/(e(N)-e(rankxx)-`sdofminus') + } + scalar `archi2p'=chiprob(`ardf',`archi2') + +* Check if there is enough room to save results; leave one free. Allow for overwriting. +* Max is 20-1=19 for Stata 9.0 and earlier, 300-1=299 for Stata 9.1+ + local maxest=299 + local vn "`lhs'" + local plen : length local saverfprefix + local vlen : length local lhs + if `plen'+`vlen' > 27 { + local vlen=27-`plen' + local vn : permname `vn', length(`vlen') + } + local eqname "`saverfprefix'`vn'" + local eqname : subinstr local eqname "." "_" + qui estimates dir + local est_list "`r(names)'" + Subtract est_list : "`est_list'" "`eqname'" + local est_ct : word count `est_list' + if `est_ct' < `maxest' { + capture est store `eqname', title("Reduced-form regression: `lhs'") + return local rfeq "`eqname'" + } + else { +di +di in ye "Unable to store reduced-form regression of `lhs'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + _estimates unhold `tempest' + return scalar arf=`arf' + return scalar arfp=`arfp' + return scalar ardf=`ardf' + return scalar ardf_r=`ardf_r' + return scalar archi2=`archi2' + return scalar archi2p=`archi2p' +end + +************************************************************************************** +program define IsStop, sclass + /* sic, must do tests one-at-a-time, + * 0, may be very large */ + version 8.2 + if `"`0'"' == "[" { + sret local stop 1 + exit + } + if `"`0'"' == "," { + sret local stop 1 + exit + } + if `"`0'"' == "if" { + sret local stop 1 + exit + } +* per official ivreg 5.1.3 + if substr(`"`0'"',1,3) == "if(" { + sret local stop 1 + exit + } + if `"`0'"' == "in" { + sret local stop 1 + exit + } + if `"`0'"' == "" { + sret local stop 1 + exit + } + else sret local stop 0 +end + +program define Disp + version 8.2 + syntax [anything] [, _col(integer 15) ] + local len = 80-`_col'+1 + local piece : piece 1 `len' of `"`anything'"' + local i 1 + while "`piece'" != "" { + di in gr _col(`_col') "`first'`piece'" + local i = `i' + 1 + local piece : piece `i' `len' of `"`anything'"' + } + if `i'==1 { + di + } +end + + + +* Remove all tokens in dirt from full +* Returns "cleaned" full list in cleaned + +program define Subtract /* : */ + version 8.2 + args cleaned /* macro name to hold cleaned list + */ colon /* ":" + */ full /* list to be cleaned + */ dirt /* tokens to be cleaned from full */ + + tokenize `dirt' + local i 1 + while "``i''" != "" { + local full : subinstr local full "``i''" "", word all + local i = `i' + 1 + } + + tokenize `full' /* cleans up extra spaces */ + c_local `cleaned' `*' +end + +program define vecsort /* Also clears col/row names */ + version 8.2 + args vmat + tempname hold + mat `vmat'=`vmat'+J(rowsof(`vmat'),colsof(`vmat'),0) + local lastcol = colsof(`vmat') + local i 1 + while `i' < `lastcol' { + if `vmat'[1,`i'] > `vmat'[1,`i'+1] { + scalar `hold' = `vmat'[1,`i'] + mat `vmat'[1,`i'] = `vmat'[1,`i'+1] + mat `vmat'[1,`i'+1] = `hold' + local i = 1 + } + else { + local i = `i' + 1 + } + } +end + +program define matsort + version 8.2 + args vmat names + tempname hold + foreach vn in `names' { + mat `hold'=nullmat(`hold'), `vmat'[1...,"`vn'"] + } + mat `vmat'=`hold' + mat drop `hold' + foreach vn in `names' { + mat `hold'=nullmat(`hold') \ `vmat'["`vn'",1...] + } + mat `vmat'=`hold' +end + +program define cdsy, rclass + version 8.2 + syntax , type(string) k2(integer) nendog(integer) + +* type() can be ivbias5 (k2<=100, nendog<=3) +* ivbias10 (ditto) +* ivbias20 (ditto) +* ivbias30 (ditto) +* ivsize10 (k2<=100, nendog<=2) +* ivsize15 (ditto) +* ivsize20 (ditto) +* ivsize25 (ditto) +* fullrel5 (ditto) +* fullrel10 (ditto) +* fullrel20 (ditto) +* fullrel30 (ditto) +* fullmax5 (ditto) +* fullmax10 (ditto) +* fullmax20 (ditto) +* fullmax30 (ditto) +* limlsize10 (ditto) +* limlsize15 (ditto) +* limlsize20 (ditto) +* limlsize25 (ditto) + + tempname temp cv + +* Initialize critical value as MV + scalar `cv'=. + + if "`type'"=="ivbias5" { + matrix input `temp' = ( /* + */ . , . , . \ /* + */ . , . , . \ /* + */ 13.91 , . , . \ /* + */ 16.85 , 11.04 , . \ /* + */ 18.37 , 13.97 , 9.53 \ /* + */ 19.28 , 15.72 , 12.20 \ /* + */ 19.86 , 16.88 , 13.95 \ /* + */ 20.25 , 17.70 , 15.18 \ /* + */ 20.53 , 18.30 , 16.10 \ /* + */ 20.74 , 18.76 , 16.80 \ /* + */ 20.90 , 19.12 , 17.35 \ /* + */ 21.01 , 19.40 , 17.80 \ /* + */ 21.10 , 19.64 , 18.17 \ /* + */ 21.18 , 19.83 , 18.47 \ /* + */ 21.23 , 19.98 , 18.73 \ /* + */ 21.28 , 20.12 , 18.94 \ /* + */ 21.31 , 20.23 , 19.13 \ /* + */ 21.34 , 20.33 , 19.29 \ /* + */ 21.36 , 20.41 , 19.44 \ /* + */ 21.38 , 20.48 , 19.56 \ /* + */ 21.39 , 20.54 , 19.67 \ /* + */ 21.40 , 20.60 , 19.77 \ /* + */ 21.41 , 20.65 , 19.86 \ /* + */ 21.41 , 20.69 , 19.94 \ /* + */ 21.42 , 20.73 , 20.01 \ /* + */ 21.42 , 20.76 , 20.07 \ /* + */ 21.42 , 20.79 , 20.13 \ /* + */ 21.42 , 20.82 , 20.18 \ /* + */ 21.42 , 20.84 , 20.23 \ /* + */ 21.42 , 20.86 , 20.27 \ /* + */ 21.41 , 20.88 , 20.31 \ /* + */ 21.41 , 20.90 , 20.35 \ /* + */ 21.41 , 20.91 , 20.38 \ /* + */ 21.40 , 20.93 , 20.41 \ /* + */ 21.40 , 20.94 , 20.44 \ /* + */ 21.39 , 20.95 , 20.47 \ /* + */ 21.39 , 20.96 , 20.49 \ /* + */ 21.38 , 20.97 , 20.51 \ /* + */ 21.38 , 20.98 , 20.54 \ /* + */ 21.37 , 20.99 , 20.56 \ /* + */ 21.37 , 20.99 , 20.57 \ /* + */ 21.36 , 21.00 , 20.59 \ /* + */ 21.35 , 21.00 , 20.61 \ /* + */ 21.35 , 21.01 , 20.62 \ /* + */ 21.34 , 21.01 , 20.64 \ /* + */ 21.34 , 21.02 , 20.65 \ /* + */ 21.33 , 21.02 , 20.66 \ /* + */ 21.32 , 21.02 , 20.67 \ /* + */ 21.32 , 21.03 , 20.68 \ /* + */ 21.31 , 21.03 , 20.69 \ /* + */ 21.31 , 21.03 , 20.70 \ /* + */ 21.30 , 21.03 , 20.71 \ /* + */ 21.30 , 21.03 , 20.72 \ /* + */ 21.29 , 21.03 , 20.73 \ /* + */ 21.28 , 21.03 , 20.73 \ /* + */ 21.28 , 21.04 , 20.74 \ /* + */ 21.27 , 21.04 , 20.75 \ /* + */ 21.27 , 21.04 , 20.75 \ /* + */ 21.26 , 21.04 , 20.76 \ /* + */ 21.26 , 21.04 , 20.76 \ /* + */ 21.25 , 21.04 , 20.77 \ /* + */ 21.24 , 21.04 , 20.77 \ /* + */ 21.24 , 21.04 , 20.78 \ /* + */ 21.23 , 21.04 , 20.78 \ /* + */ 21.23 , 21.03 , 20.79 \ /* + */ 21.22 , 21.03 , 20.79 \ /* + */ 21.22 , 21.03 , 20.79 \ /* + */ 21.21 , 21.03 , 20.80 \ /* + */ 21.21 , 21.03 , 20.80 \ /* + */ 21.20 , 21.03 , 20.80 \ /* + */ 21.20 , 21.03 , 20.80 \ /* + */ 21.19 , 21.03 , 20.81 \ /* + */ 21.19 , 21.03 , 20.81 \ /* + */ 21.18 , 21.03 , 20.81 \ /* + */ 21.18 , 21.02 , 20.81 \ /* + */ 21.17 , 21.02 , 20.82 \ /* + */ 21.17 , 21.02 , 20.82 \ /* + */ 21.16 , 21.02 , 20.82 \ /* + */ 21.16 , 21.02 , 20.82 \ /* + */ 21.15 , 21.02 , 20.82 \ /* + */ 21.15 , 21.02 , 20.82 \ /* + */ 21.15 , 21.02 , 20.83 \ /* + */ 21.14 , 21.01 , 20.83 \ /* + */ 21.14 , 21.01 , 20.83 \ /* + */ 21.13 , 21.01 , 20.83 \ /* + */ 21.13 , 21.01 , 20.83 \ /* + */ 21.12 , 21.01 , 20.84 \ /* + */ 21.12 , 21.01 , 20.84 \ /* + */ 21.11 , 21.01 , 20.84 \ /* + */ 21.11 , 21.01 , 20.84 \ /* + */ 21.10 , 21.00 , 20.84 \ /* + */ 21.10 , 21.00 , 20.84 \ /* + */ 21.09 , 21.00 , 20.85 \ /* + */ 21.09 , 21.00 , 20.85 \ /* + */ 21.08 , 21.00 , 20.85 \ /* + */ 21.08 , 21.00 , 20.85 \ /* + */ 21.07 , 21.00 , 20.85 \ /* + */ 21.07 , 20.99 , 20.86 \ /* + */ 21.06 , 20.99 , 20.86 \ /* + */ 21.06 , 20.99 , 20.86 ) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + + + if "`type'"=="ivbias10" { + matrix input `temp' = /* + */ (.,.,. \ /* + */ .,.,. \ /* + */ 9.08,.,. \ /* + */ 10.27,7.56,. \ /* + */ 10.83,8.78,6.61 \ /* + */ 11.12,9.48,7.77 \ /* + */ 11.29,9.92,8.5 \ /* + */ 11.39,10.22,9.01 \ /* + */ 11.46,10.43,9.37 \ /* + */ 11.49,10.58,9.64 \ /* + */ 11.51,10.69,9.85 \ /* + */ 11.52,10.78,10.01 \ /* + */ 11.52,10.84,10.14 \ /* + */ 11.52,10.89,10.25 \ /* + */ 11.51,10.93,10.33 \ /* + */ 11.5,10.96,10.41 \ /* + */ 11.49,10.99,10.47 \ /* + */ 11.48,11,10.52 \ /* + */ 11.46,11.02,10.56 \ /* + */ 11.45,11.03,10.6 \ /* + */ 11.44,11.04,10.63 \ /* + */ 11.42,11.05,10.65 \ /* + */ 11.41,11.05,10.68 \ /* + */ 11.4,11.05,10.7 \ /* + */ 11.38,11.06,10.71 \ /* + */ 11.37,11.06,10.73 \ /* + */ 11.36,11.06,10.74 \ /* + */ 11.34,11.05,10.75 \ /* + */ 11.33,11.05,10.76 \ /* + */ 11.32,11.05,10.77 \ /* + */ 11.3,11.05,10.78 \ /* + */ 11.29,11.05,10.79 \ /* + */ 11.28,11.04,10.79 \ /* + */ 11.27,11.04,10.8 \ /* + */ 11.26,11.04,10.8 \ /* + */ 11.25,11.03,10.8 \ /* + */ 11.24,11.03,10.81 \ /* + */ 11.23,11.02,10.81 \ /* + */ 11.22,11.02,10.81 \ /* + */ 11.21,11.02,10.81 \ /* + */ 11.2,11.01,10.81 \ /* + */ 11.19,11.01,10.81 \ /* + */ 11.18,11,10.81 \ /* + */ 11.17,11,10.81 \ /* + */ 11.16,10.99,10.81 \ /* + */ 11.15,10.99,10.81 \ /* + */ 11.14,10.98,10.81 \ /* + */ 11.13,10.98,10.81 \ /* + */ 11.13,10.98,10.81 \ /* + */ 11.12,10.97,10.81 \ /* + */ 11.11,10.97,10.81 \ /* + */ 11.1,10.96,10.81 \ /* + */ 11.1,10.96,10.81 \ /* + */ 11.09,10.95,10.81 \ /* + */ 11.08,10.95,10.81 \ /* + */ 11.07,10.94,10.8 \ /* + */ 11.07,10.94,10.8 \ /* + */ 11.06,10.94,10.8 \ /* + */ 11.05,10.93,10.8 \ /* + */ 11.05,10.93,10.8 \ /* + */ 11.04,10.92,10.8 \ /* + */ 11.03,10.92,10.79 \ /* + */ 11.03,10.92,10.79 \ /* + */ 11.02,10.91,10.79 \ /* + */ 11.02,10.91,10.79 \ /* + */ 11.01,10.9,10.79 \ /* + */ 11,10.9,10.79 \ /* + */ 11,10.9,10.78 \ /* + */ 10.99,10.89,10.78 \ /* + */ 10.99,10.89,10.78 \ /* + */ 10.98,10.89,10.78 \ /* + */ 10.98,10.88,10.78 \ /* + */ 10.97,10.88,10.77 \ /* + */ 10.97,10.88,10.77 \ /* + */ 10.96,10.87,10.77 \ /* + */ 10.96,10.87,10.77 \ /* + */ 10.95,10.86,10.77 \ /* + */ 10.95,10.86,10.76 \ /* + */ 10.94,10.86,10.76 \ /* + */ 10.94,10.85,10.76 \ /* + */ 10.93,10.85,10.76 \ /* + */ 10.93,10.85,10.76 \ /* + */ 10.92,10.84,10.75 \ /* + */ 10.92,10.84,10.75 \ /* + */ 10.91,10.84,10.75 \ /* + */ 10.91,10.84,10.75 \ /* + */ 10.91,10.83,10.75 \ /* + */ 10.9,10.83,10.74 \ /* + */ 10.9,10.83,10.74 \ /* + */ 10.89,10.82,10.74 \ /* + */ 10.89,10.82,10.74 \ /* + */ 10.89,10.82,10.74 \ /* + */ 10.88,10.81,10.74 \ /* + */ 10.88,10.81,10.73 \ /* + */ 10.87,10.81,10.73 \ /* + */ 10.87,10.81,10.73 \ /* + */ 10.87,10.8,10.73 \ /* + */ 10.86,10.8,10.73 \ /* + */ 10.86,10.8,10.72 \ /* + */ 10.86,10.8,10.72) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + if "`type'"=="ivbias20" { + matrix input `temp' = ( /* + */ . , . , . \ /* + */ . , . , . \ /* + */ 6.46 , . , . \ /* + */ 6.71 , 5.57 , . \ /* + */ 6.77 , 5.91 , 4.99 \ /* + */ 6.76 , 6.08 , 5.35 \ /* + */ 6.73 , 6.16 , 5.56 \ /* + */ 6.69 , 6.20 , 5.69 \ /* + */ 6.65 , 6.22 , 5.78 \ /* + */ 6.61 , 6.23 , 5.83 \ /* + */ 6.56 , 6.23 , 5.87 \ /* + */ 6.53 , 6.22 , 5.90 \ /* + */ 6.49 , 6.21 , 5.92 \ /* + */ 6.45 , 6.20 , 5.93 \ /* + */ 6.42 , 6.19 , 5.94 \ /* + */ 6.39 , 6.17 , 5.94 \ /* + */ 6.36 , 6.16 , 5.94 \ /* + */ 6.33 , 6.14 , 5.94 \ /* + */ 6.31 , 6.13 , 5.94 \ /* + */ 6.28 , 6.11 , 5.93 \ /* + */ 6.26 , 6.10 , 5.93 \ /* + */ 6.24 , 6.08 , 5.92 \ /* + */ 6.22 , 6.07 , 5.92 \ /* + */ 6.20 , 6.06 , 5.91 \ /* + */ 6.18 , 6.05 , 5.90 \ /* + */ 6.16 , 6.03 , 5.90 \ /* + */ 6.14 , 6.02 , 5.89 \ /* + */ 6.13 , 6.01 , 5.88 \ /* + */ 6.11 , 6.00 , 5.88 \ /* + */ 6.09 , 5.99 , 5.87 \ /* + */ 6.08 , 5.98 , 5.87 \ /* + */ 6.07 , 5.97 , 5.86 \ /* + */ 6.05 , 5.96 , 5.85 \ /* + */ 6.04 , 5.95 , 5.85 \ /* + */ 6.03 , 5.94 , 5.84 \ /* + */ 6.01 , 5.93 , 5.83 \ /* + */ 6.00 , 5.92 , 5.83 \ /* + */ 5.99 , 5.91 , 5.82 \ /* + */ 5.98 , 5.90 , 5.82 \ /* + */ 5.97 , 5.89 , 5.81 \ /* + */ 5.96 , 5.89 , 5.80 \ /* + */ 5.95 , 5.88 , 5.80 \ /* + */ 5.94 , 5.87 , 5.79 \ /* + */ 5.93 , 5.86 , 5.79 \ /* + */ 5.92 , 5.86 , 5.78 \ /* + */ 5.91 , 5.85 , 5.78 \ /* + */ 5.91 , 5.84 , 5.77 \ /* + */ 5.90 , 5.83 , 5.77 \ /* + */ 5.89 , 5.83 , 5.76 \ /* + */ 5.88 , 5.82 , 5.76 \ /* + */ 5.87 , 5.82 , 5.75 \ /* + */ 5.87 , 5.81 , 5.75 \ /* + */ 5.86 , 5.80 , 5.74 \ /* + */ 5.85 , 5.80 , 5.74 \ /* + */ 5.85 , 5.79 , 5.73 \ /* + */ 5.84 , 5.79 , 5.73 \ /* + */ 5.83 , 5.78 , 5.72 \ /* + */ 5.83 , 5.78 , 5.72 \ /* + */ 5.82 , 5.77 , 5.72 \ /* + */ 5.81 , 5.77 , 5.71 \ /* + */ 5.81 , 5.76 , 5.71 \ /* + */ 5.80 , 5.76 , 5.70 \ /* + */ 5.80 , 5.75 , 5.70 \ /* + */ 5.79 , 5.75 , 5.70 \ /* + */ 5.78 , 5.74 , 5.69 \ /* + */ 5.78 , 5.74 , 5.69 \ /* + */ 5.77 , 5.73 , 5.68 \ /* + */ 5.77 , 5.73 , 5.68 \ /* + */ 5.76 , 5.72 , 5.68 \ /* + */ 5.76 , 5.72 , 5.67 \ /* + */ 5.75 , 5.72 , 5.67 \ /* + */ 5.75 , 5.71 , 5.67 \ /* + */ 5.75 , 5.71 , 5.66 \ /* + */ 5.74 , 5.70 , 5.66 \ /* + */ 5.74 , 5.70 , 5.66 \ /* + */ 5.73 , 5.70 , 5.65 \ /* + */ 5.73 , 5.69 , 5.65 \ /* + */ 5.72 , 5.69 , 5.65 \ /* + */ 5.72 , 5.68 , 5.65 \ /* + */ 5.71 , 5.68 , 5.64 \ /* + */ 5.71 , 5.68 , 5.64 \ /* + */ 5.71 , 5.67 , 5.64 \ /* + */ 5.70 , 5.67 , 5.63 \ /* + */ 5.70 , 5.67 , 5.63 \ /* + */ 5.70 , 5.66 , 5.63 \ /* + */ 5.69 , 5.66 , 5.62 \ /* + */ 5.69 , 5.66 , 5.62 \ /* + */ 5.68 , 5.65 , 5.62 \ /* + */ 5.68 , 5.65 , 5.62 \ /* + */ 5.68 , 5.65 , 5.61 \ /* + */ 5.67 , 5.65 , 5.61 \ /* + */ 5.67 , 5.64 , 5.61 \ /* + */ 5.67 , 5.64 , 5.61 \ /* + */ 5.66 , 5.64 , 5.60 \ /* + */ 5.66 , 5.63 , 5.60 \ /* + */ 5.66 , 5.63 , 5.60 \ /* + */ 5.65 , 5.63 , 5.60 \ /* + */ 5.65 , 5.63 , 5.59 \ /* + */ 5.65 , 5.62 , 5.59 \ /* + */ 5.65 , 5.62 , 5.59 ) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias30" { + matrix input `temp' = ( /* + */ . , . , . \ /* + */ . , . , . \ /* + */ 5.39 , . , . \ /* + */ 5.34 , 4.73 , . \ /* + */ 5.25 , 4.79 , 4.30 \ /* + */ 5.15 , 4.78 , 4.40 \ /* + */ 5.07 , 4.76 , 4.44 \ /* + */ 4.99 , 4.73 , 4.46 \ /* + */ 4.92 , 4.69 , 4.46 \ /* + */ 4.86 , 4.66 , 4.45 \ /* + */ 4.80 , 4.62 , 4.44 \ /* + */ 4.75 , 4.59 , 4.42 \ /* + */ 4.71 , 4.56 , 4.41 \ /* + */ 4.67 , 4.53 , 4.39 \ /* + */ 4.63 , 4.50 , 4.37 \ /* + */ 4.59 , 4.48 , 4.36 \ /* + */ 4.56 , 4.45 , 4.34 \ /* + */ 4.53 , 4.43 , 4.32 \ /* + */ 4.51 , 4.41 , 4.31 \ /* + */ 4.48 , 4.39 , 4.29 \ /* + */ 4.46 , 4.37 , 4.28 \ /* + */ 4.43 , 4.35 , 4.27 \ /* + */ 4.41 , 4.33 , 4.25 \ /* + */ 4.39 , 4.32 , 4.24 \ /* + */ 4.37 , 4.30 , 4.23 \ /* + */ 4.35 , 4.29 , 4.21 \ /* + */ 4.34 , 4.27 , 4.20 \ /* + */ 4.32 , 4.26 , 4.19 \ /* + */ 4.31 , 4.24 , 4.18 \ /* + */ 4.29 , 4.23 , 4.17 \ /* + */ 4.28 , 4.22 , 4.16 \ /* + */ 4.26 , 4.21 , 4.15 \ /* + */ 4.25 , 4.20 , 4.14 \ /* + */ 4.24 , 4.19 , 4.13 \ /* + */ 4.23 , 4.18 , 4.13 \ /* + */ 4.22 , 4.17 , 4.12 \ /* + */ 4.20 , 4.16 , 4.11 \ /* + */ 4.19 , 4.15 , 4.10 \ /* + */ 4.18 , 4.14 , 4.09 \ /* + */ 4.17 , 4.13 , 4.09 \ /* + */ 4.16 , 4.12 , 4.08 \ /* + */ 4.15 , 4.11 , 4.07 \ /* + */ 4.15 , 4.11 , 4.07 \ /* + */ 4.14 , 4.10 , 4.06 \ /* + */ 4.13 , 4.09 , 4.05 \ /* + */ 4.12 , 4.08 , 4.05 \ /* + */ 4.11 , 4.08 , 4.04 \ /* + */ 4.11 , 4.07 , 4.03 \ /* + */ 4.10 , 4.06 , 4.03 \ /* + */ 4.09 , 4.06 , 4.02 \ /* + */ 4.08 , 4.05 , 4.02 \ /* + */ 4.08 , 4.05 , 4.01 \ /* + */ 4.07 , 4.04 , 4.01 \ /* + */ 4.06 , 4.03 , 4.00 \ /* + */ 4.06 , 4.03 , 4.00 \ /* + */ 4.05 , 4.02 , 3.99 \ /* + */ 4.05 , 4.02 , 3.99 \ /* + */ 4.04 , 4.01 , 3.98 \ /* + */ 4.04 , 4.01 , 3.98 \ /* + */ 4.03 , 4.00 , 3.97 \ /* + */ 4.02 , 4.00 , 3.97 \ /* + */ 4.02 , 3.99 , 3.96 \ /* + */ 4.01 , 3.99 , 3.96 \ /* + */ 4.01 , 3.98 , 3.96 \ /* + */ 4.00 , 3.98 , 3.95 \ /* + */ 4.00 , 3.97 , 3.95 \ /* + */ 3.99 , 3.97 , 3.94 \ /* + */ 3.99 , 3.97 , 3.94 \ /* + */ 3.99 , 3.96 , 3.94 \ /* + */ 3.98 , 3.96 , 3.93 \ /* + */ 3.98 , 3.95 , 3.93 \ /* + */ 3.97 , 3.95 , 3.93 \ /* + */ 3.97 , 3.95 , 3.92 \ /* + */ 3.96 , 3.94 , 3.92 \ /* + */ 3.96 , 3.94 , 3.92 \ /* + */ 3.96 , 3.93 , 3.91 \ /* + */ 3.95 , 3.93 , 3.91 \ /* + */ 3.95 , 3.93 , 3.91 \ /* + */ 3.95 , 3.92 , 3.90 \ /* + */ 3.94 , 3.92 , 3.90 \ /* + */ 3.94 , 3.92 , 3.90 \ /* + */ 3.93 , 3.91 , 3.89 \ /* + */ 3.93 , 3.91 , 3.89 \ /* + */ 3.93 , 3.91 , 3.89 \ /* + */ 3.92 , 3.91 , 3.89 \ /* + */ 3.92 , 3.90 , 3.88 \ /* + */ 3.92 , 3.90 , 3.88 \ /* + */ 3.91 , 3.90 , 3.88 \ /* + */ 3.91 , 3.89 , 3.87 \ /* + */ 3.91 , 3.89 , 3.87 \ /* + */ 3.91 , 3.89 , 3.87 \ /* + */ 3.90 , 3.89 , 3.87 \ /* + */ 3.90 , 3.88 , 3.86 \ /* + */ 3.90 , 3.88 , 3.86 \ /* + */ 3.89 , 3.88 , 3.86 \ /* + */ 3.89 , 3.87 , 3.86 \ /* + */ 3.89 , 3.87 , 3.85 \ /* + */ 3.89 , 3.87 , 3.85 \ /* + */ 3.88 , 3.87 , 3.85 \ /* + */ 3.88 , 3.86 , 3.85 ) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + if "`type'"=="ivsize10" { + matrix input `temp' = /* + */ (16.38,. \ /* + */ 19.93,7.03 \ /* + */ 22.3,13.43 \ /* + */ 24.58,16.87 \ /* + */ 26.87,19.45 \ /* + */ 29.18,21.68 \ /* + */ 31.5,23.72 \ /* + */ 33.84,25.64 \ /* + */ 36.19,27.51 \ /* + */ 38.54,29.32 \ /* + */ 40.9,31.11 \ /* + */ 43.27,32.88 \ /* + */ 45.64,34.62 \ /* + */ 48.01,36.36 \ /* + */ 50.39,38.08 \ /* + */ 52.77,39.8 \ /* + */ 55.15,41.51 \ /* + */ 57.53,43.22 \ /* + */ 59.92,44.92 \ /* + */ 62.3,46.62 \ /* + */ 64.69,48.31 \ /* + */ 67.07,50.01 \ /* + */ 69.46,51.7 \ /* + */ 71.85,53.39 \ /* + */ 74.24,55.07 \ /* + */ 76.62,56.76 \ /* + */ 79.01,58.45 \ /* + */ 81.4,60.13 \ /* + */ 83.79,61.82 \ /* + */ 86.17,63.51 \ /* + */ 88.56,65.19 \ /* + */ 90.95,66.88 \ /* + */ 93.33,68.56 \ /* + */ 95.72,70.25 \ /* + */ 98.11,71.94 \ /* + */ 100.5,73.62 \ /* + */ 102.88,75.31 \ /* + */ 105.27,76.99 \ /* + */ 107.66,78.68 \ /* + */ 110.04,80.37 \ /* + */ 112.43,82.05 \ /* + */ 114.82,83.74 \ /* + */ 117.21,85.42 \ /* + */ 119.59,87.11 \ /* + */ 121.98,88.8 \ /* + */ 124.37,90.48 \ /* + */ 126.75,92.17 \ /* + */ 129.14,93.85 \ /* + */ 131.53,95.54 \ /* + */ 133.92,97.23 \ /* + */ 136.3,98.91 \ /* + */ 138.69,100.6 \ /* + */ 141.08,102.29 \ /* + */ 143.47,103.97 \ /* + */ 145.85,105.66 \ /* + */ 148.24,107.34 \ /* + */ 150.63,109.03 \ /* + */ 153.01,110.72 \ /* + */ 155.4,112.4 \ /* + */ 157.79,114.09 \ /* + */ 160.18,115.77 \ /* + */ 162.56,117.46 \ /* + */ 164.95,119.15 \ /* + */ 167.34,120.83 \ /* + */ 169.72,122.52 \ /* + */ 172.11,124.2 \ /* + */ 174.5,125.89 \ /* + */ 176.89,127.58 \ /* + */ 179.27,129.26 \ /* + */ 181.66,130.95 \ /* + */ 184.05,132.63 \ /* + */ 186.44,134.32 \ /* + */ 188.82,136.01 \ /* + */ 191.21,137.69 \ /* + */ 193.6,139.38 \ /* + */ 195.98,141.07 \ /* + */ 198.37,142.75 \ /* + */ 200.76,144.44 \ /* + */ 203.15,146.12 \ /* + */ 205.53,147.81 \ /* + */ 207.92,149.5 \ /* + */ 210.31,151.18 \ /* + */ 212.69,152.87 \ /* + */ 215.08,154.55 \ /* + */ 217.47,156.24 \ /* + */ 219.86,157.93 \ /* + */ 222.24,159.61 \ /* + */ 224.63,161.3 \ /* + */ 227.02,162.98 \ /* + */ 229.41,164.67 \ /* + */ 231.79,166.36 \ /* + */ 234.18,168.04 \ /* + */ 236.57,169.73 \ /* + */ 238.95,171.41 \ /* + */ 241.34,173.1 \ /* + */ 243.73,174.79 \ /* + */ 246.12,176.47 \ /* + */ 248.5,178.16 \ /* + */ 250.89,179.84 \ /* + */ 253.28,181.53) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize15" { + matrix input `temp' = ( /* + */ 8.96 , . \ /* + */ 11.59 , 4.58 \ /* + */ 12.83 , 8.18 \ /* + */ 13.96 , 9.93 \ /* + */ 15.09 , 11.22 \ /* + */ 16.23 , 12.33 \ /* + */ 17.38 , 13.34 \ /* + */ 18.54 , 14.31 \ /* + */ 19.71 , 15.24 \ /* + */ 20.88 , 16.16 \ /* + */ 22.06 , 17.06 \ /* + */ 23.24 , 17.95 \ /* + */ 24.42 , 18.84 \ /* + */ 25.61 , 19.72 \ /* + */ 26.80 , 20.60 \ /* + */ 27.99 , 21.48 \ /* + */ 29.19 , 22.35 \ /* + */ 30.38 , 23.22 \ /* + */ 31.58 , 24.09 \ /* + */ 32.77 , 24.96 \ /* + */ 33.97 , 25.82 \ /* + */ 35.17 , 26.69 \ /* + */ 36.37 , 27.56 \ /* + */ 37.57 , 28.42 \ /* + */ 38.77 , 29.29 \ /* + */ 39.97 , 30.15 \ /* + */ 41.17 , 31.02 \ /* + */ 42.37 , 31.88 \ /* + */ 43.57 , 32.74 \ /* + */ 44.78 , 33.61 \ /* + */ 45.98 , 34.47 \ /* + */ 47.18 , 35.33 \ /* + */ 48.38 , 36.19 \ /* + */ 49.59 , 37.06 \ /* + */ 50.79 , 37.92 \ /* + */ 51.99 , 38.78 \ /* + */ 53.19 , 39.64 \ /* + */ 54.40 , 40.50 \ /* + */ 55.60 , 41.37 \ /* + */ 56.80 , 42.23 \ /* + */ 58.01 , 43.09 \ /* + */ 59.21 , 43.95 \ /* + */ 60.41 , 44.81 \ /* + */ 61.61 , 45.68 \ /* + */ 62.82 , 46.54 \ /* + */ 64.02 , 47.40 \ /* + */ 65.22 , 48.26 \ /* + */ 66.42 , 49.12 \ /* + */ 67.63 , 49.99 \ /* + */ 68.83 , 50.85 \ /* + */ 70.03 , 51.71 \ /* + */ 71.24 , 52.57 \ /* + */ 72.44 , 53.43 \ /* + */ 73.64 , 54.30 \ /* + */ 74.84 , 55.16 \ /* + */ 76.05 , 56.02 \ /* + */ 77.25 , 56.88 \ /* + */ 78.45 , 57.74 \ /* + */ 79.66 , 58.61 \ /* + */ 80.86 , 59.47 \ /* + */ 82.06 , 60.33 \ /* + */ 83.26 , 61.19 \ /* + */ 84.47 , 62.05 \ /* + */ 85.67 , 62.92 \ /* + */ 86.87 , 63.78 \ /* + */ 88.07 , 64.64 \ /* + */ 89.28 , 65.50 \ /* + */ 90.48 , 66.36 \ /* + */ 91.68 , 67.22 \ /* + */ 92.89 , 68.09 \ /* + */ 94.09 , 68.95 \ /* + */ 95.29 , 69.81 \ /* + */ 96.49 , 70.67 \ /* + */ 97.70 , 71.53 \ /* + */ 98.90 , 72.40 \ /* + */ 100.10 , 73.26 \ /* + */ 101.30 , 74.12 \ /* + */ 102.51 , 74.98 \ /* + */ 103.71 , 75.84 \ /* + */ 104.91 , 76.71 \ /* + */ 106.12 , 77.57 \ /* + */ 107.32 , 78.43 \ /* + */ 108.52 , 79.29 \ /* + */ 109.72 , 80.15 \ /* + */ 110.93 , 81.02 \ /* + */ 112.13 , 81.88 \ /* + */ 113.33 , 82.74 \ /* + */ 114.53 , 83.60 \ /* + */ 115.74 , 84.46 \ /* + */ 116.94 , 85.33 \ /* + */ 118.14 , 86.19 \ /* + */ 119.35 , 87.05 \ /* + */ 120.55 , 87.91 \ /* + */ 121.75 , 88.77 \ /* + */ 122.95 , 89.64 \ /* + */ 124.16 , 90.50 \ /* + */ 125.36 , 91.36 \ /* + */ 126.56 , 92.22 \ /* + */ 127.76 , 93.08 \ /* + */ 128.97 , 93.95 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize20" { + matrix input `temp' = ( /* + */ 6.66 , . \ /* + */ 8.75 , 3.95 \ /* + */ 9.54 , 6.40 \ /* + */ 10.26 , 7.54 \ /* + */ 10.98 , 8.38 \ /* + */ 11.72 , 9.10 \ /* + */ 12.48 , 9.77 \ /* + */ 13.24 , 10.41 \ /* + */ 14.01 , 11.03 \ /* + */ 14.78 , 11.65 \ /* + */ 15.56 , 12.25 \ /* + */ 16.35 , 12.86 \ /* + */ 17.14 , 13.45 \ /* + */ 17.93 , 14.05 \ /* + */ 18.72 , 14.65 \ /* + */ 19.51 , 15.24 \ /* + */ 20.31 , 15.83 \ /* + */ 21.10 , 16.42 \ /* + */ 21.90 , 17.02 \ /* + */ 22.70 , 17.61 \ /* + */ 23.50 , 18.20 \ /* + */ 24.30 , 18.79 \ /* + */ 25.10 , 19.38 \ /* + */ 25.90 , 19.97 \ /* + */ 26.71 , 20.56 \ /* + */ 27.51 , 21.15 \ /* + */ 28.31 , 21.74 \ /* + */ 29.12 , 22.33 \ /* + */ 29.92 , 22.92 \ /* + */ 30.72 , 23.51 \ /* + */ 31.53 , 24.10 \ /* + */ 32.33 , 24.69 \ /* + */ 33.14 , 25.28 \ /* + */ 33.94 , 25.87 \ /* + */ 34.75 , 26.46 \ /* + */ 35.55 , 27.05 \ /* + */ 36.36 , 27.64 \ /* + */ 37.17 , 28.23 \ /* + */ 37.97 , 28.82 \ /* + */ 38.78 , 29.41 \ /* + */ 39.58 , 30.00 \ /* + */ 40.39 , 30.59 \ /* + */ 41.20 , 31.18 \ /* + */ 42.00 , 31.77 \ /* + */ 42.81 , 32.36 \ /* + */ 43.62 , 32.95 \ /* + */ 44.42 , 33.54 \ /* + */ 45.23 , 34.13 \ /* + */ 46.03 , 34.72 \ /* + */ 46.84 , 35.31 \ /* + */ 47.65 , 35.90 \ /* + */ 48.45 , 36.49 \ /* + */ 49.26 , 37.08 \ /* + */ 50.06 , 37.67 \ /* + */ 50.87 , 38.26 \ /* + */ 51.68 , 38.85 \ /* + */ 52.48 , 39.44 \ /* + */ 53.29 , 40.02 \ /* + */ 54.09 , 40.61 \ /* + */ 54.90 , 41.20 \ /* + */ 55.71 , 41.79 \ /* + */ 56.51 , 42.38 \ /* + */ 57.32 , 42.97 \ /* + */ 58.13 , 43.56 \ /* + */ 58.93 , 44.15 \ /* + */ 59.74 , 44.74 \ /* + */ 60.54 , 45.33 \ /* + */ 61.35 , 45.92 \ /* + */ 62.16 , 46.51 \ /* + */ 62.96 , 47.10 \ /* + */ 63.77 , 47.69 \ /* + */ 64.57 , 48.28 \ /* + */ 65.38 , 48.87 \ /* + */ 66.19 , 49.46 \ /* + */ 66.99 , 50.05 \ /* + */ 67.80 , 50.64 \ /* + */ 68.60 , 51.23 \ /* + */ 69.41 , 51.82 \ /* + */ 70.22 , 52.41 \ /* + */ 71.02 , 53.00 \ /* + */ 71.83 , 53.59 \ /* + */ 72.64 , 54.18 \ /* + */ 73.44 , 54.77 \ /* + */ 74.25 , 55.36 \ /* + */ 75.05 , 55.95 \ /* + */ 75.86 , 56.54 \ /* + */ 76.67 , 57.13 \ /* + */ 77.47 , 57.72 \ /* + */ 78.28 , 58.31 \ /* + */ 79.08 , 58.90 \ /* + */ 79.89 , 59.49 \ /* + */ 80.70 , 60.08 \ /* + */ 81.50 , 60.67 \ /* + */ 82.31 , 61.26 \ /* + */ 83.12 , 61.85 \ /* + */ 83.92 , 62.44 \ /* + */ 84.73 , 63.03 \ /* + */ 85.53 , 63.62 \ /* + */ 86.34 , 64.21 \ /* + */ 87.15 , 64.80 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize25" { + matrix input `temp' = ( /* + */ 5.53 , . \ /* + */ 7.25 , 3.63 \ /* + */ 7.80 , 5.45 \ /* + */ 8.31 , 6.28 \ /* + */ 8.84 , 6.89 \ /* + */ 9.38 , 7.42 \ /* + */ 9.93 , 7.91 \ /* + */ 10.50 , 8.39 \ /* + */ 11.07 , 8.85 \ /* + */ 11.65 , 9.31 \ /* + */ 12.23 , 9.77 \ /* + */ 12.82 , 10.22 \ /* + */ 13.41 , 10.68 \ /* + */ 14.00 , 11.13 \ /* + */ 14.60 , 11.58 \ /* + */ 15.19 , 12.03 \ /* + */ 15.79 , 12.49 \ /* + */ 16.39 , 12.94 \ /* + */ 16.99 , 13.39 \ /* + */ 17.60 , 13.84 \ /* + */ 18.20 , 14.29 \ /* + */ 18.80 , 14.74 \ /* + */ 19.41 , 15.19 \ /* + */ 20.01 , 15.64 \ /* + */ 20.61 , 16.10 \ /* + */ 21.22 , 16.55 \ /* + */ 21.83 , 17.00 \ /* + */ 22.43 , 17.45 \ /* + */ 23.04 , 17.90 \ /* + */ 23.65 , 18.35 \ /* + */ 24.25 , 18.81 \ /* + */ 24.86 , 19.26 \ /* + */ 25.47 , 19.71 \ /* + */ 26.08 , 20.16 \ /* + */ 26.68 , 20.61 \ /* + */ 27.29 , 21.06 \ /* + */ 27.90 , 21.52 \ /* + */ 28.51 , 21.97 \ /* + */ 29.12 , 22.42 \ /* + */ 29.73 , 22.87 \ /* + */ 30.33 , 23.32 \ /* + */ 30.94 , 23.78 \ /* + */ 31.55 , 24.23 \ /* + */ 32.16 , 24.68 \ /* + */ 32.77 , 25.13 \ /* + */ 33.38 , 25.58 \ /* + */ 33.99 , 26.04 \ /* + */ 34.60 , 26.49 \ /* + */ 35.21 , 26.94 \ /* + */ 35.82 , 27.39 \ /* + */ 36.43 , 27.85 \ /* + */ 37.04 , 28.30 \ /* + */ 37.65 , 28.75 \ /* + */ 38.25 , 29.20 \ /* + */ 38.86 , 29.66 \ /* + */ 39.47 , 30.11 \ /* + */ 40.08 , 30.56 \ /* + */ 40.69 , 31.01 \ /* + */ 41.30 , 31.47 \ /* + */ 41.91 , 31.92 \ /* + */ 42.52 , 32.37 \ /* + */ 43.13 , 32.82 \ /* + */ 43.74 , 33.27 \ /* + */ 44.35 , 33.73 \ /* + */ 44.96 , 34.18 \ /* + */ 45.57 , 34.63 \ /* + */ 46.18 , 35.08 \ /* + */ 46.78 , 35.54 \ /* + */ 47.39 , 35.99 \ /* + */ 48.00 , 36.44 \ /* + */ 48.61 , 36.89 \ /* + */ 49.22 , 37.35 \ /* + */ 49.83 , 37.80 \ /* + */ 50.44 , 38.25 \ /* + */ 51.05 , 38.70 \ /* + */ 51.66 , 39.16 \ /* + */ 52.27 , 39.61 \ /* + */ 52.88 , 40.06 \ /* + */ 53.49 , 40.51 \ /* + */ 54.10 , 40.96 \ /* + */ 54.71 , 41.42 \ /* + */ 55.32 , 41.87 \ /* + */ 55.92 , 42.32 \ /* + */ 56.53 , 42.77 \ /* + */ 57.14 , 43.23 \ /* + */ 57.75 , 43.68 \ /* + */ 58.36 , 44.13 \ /* + */ 58.97 , 44.58 \ /* + */ 59.58 , 45.04 \ /* + */ 60.19 , 45.49 \ /* + */ 60.80 , 45.94 \ /* + */ 61.41 , 46.39 \ /* + */ 62.02 , 46.85 \ /* + */ 62.63 , 47.30 \ /* + */ 63.24 , 47.75 \ /* + */ 63.85 , 48.20 \ /* + */ 64.45 , 48.65 \ /* + */ 65.06 , 49.11 \ /* + */ 65.67 , 49.56 \ /* + */ 66.28 , 50.01 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel5" { + matrix input `temp' = ( /* + */ 24.09 , . \ /* + */ 13.46 , 15.50 \ /* + */ 9.61 , 10.83 \ /* + */ 7.63 , 8.53 \ /* + */ 6.42 , 7.16 \ /* + */ 5.61 , 6.24 \ /* + */ 5.02 , 5.59 \ /* + */ 4.58 , 5.10 \ /* + */ 4.23 , 4.71 \ /* + */ 3.96 , 4.41 \ /* + */ 3.73 , 4.15 \ /* + */ 3.54 , 3.94 \ /* + */ 3.38 , 3.76 \ /* + */ 3.24 , 3.60 \ /* + */ 3.12 , 3.47 \ /* + */ 3.01 , 3.35 \ /* + */ 2.92 , 3.24 \ /* + */ 2.84 , 3.15 \ /* + */ 2.76 , 3.06 \ /* + */ 2.69 , 2.98 \ /* + */ 2.63 , 2.91 \ /* + */ 2.58 , 2.85 \ /* + */ 2.52 , 2.79 \ /* + */ 2.48 , 2.73 \ /* + */ 2.43 , 2.68 \ /* + */ 2.39 , 2.63 \ /* + */ 2.36 , 2.59 \ /* + */ 2.32 , 2.55 \ /* + */ 2.29 , 2.51 \ /* + */ 2.26 , 2.47 \ /* + */ 2.23 , 2.44 \ /* + */ 2.20 , 2.41 \ /* + */ 2.18 , 2.37 \ /* + */ 2.16 , 2.35 \ /* + */ 2.13 , 2.32 \ /* + */ 2.11 , 2.29 \ /* + */ 2.09 , 2.27 \ /* + */ 2.07 , 2.24 \ /* + */ 2.05 , 2.22 \ /* + */ 2.04 , 2.20 \ /* + */ 2.02 , 2.18 \ /* + */ 2.00 , 2.16 \ /* + */ 1.99 , 2.14 \ /* + */ 1.97 , 2.12 \ /* + */ 1.96 , 2.10 \ /* + */ 1.94 , 2.09 \ /* + */ 1.93 , 2.07 \ /* + */ 1.92 , 2.05 \ /* + */ 1.91 , 2.04 \ /* + */ 1.89 , 2.02 \ /* + */ 1.88 , 2.01 \ /* + */ 1.87 , 2.00 \ /* + */ 1.86 , 1.98 \ /* + */ 1.85 , 1.97 \ /* + */ 1.84 , 1.96 \ /* + */ 1.83 , 1.95 \ /* + */ 1.82 , 1.94 \ /* + */ 1.81 , 1.92 \ /* + */ 1.80 , 1.91 \ /* + */ 1.79 , 1.90 \ /* + */ 1.79 , 1.89 \ /* + */ 1.78 , 1.88 \ /* + */ 1.77 , 1.87 \ /* + */ 1.76 , 1.87 \ /* + */ 1.75 , 1.86 \ /* + */ 1.75 , 1.85 \ /* + */ 1.74 , 1.84 \ /* + */ 1.73 , 1.83 \ /* + */ 1.72 , 1.83 \ /* + */ 1.72 , 1.82 \ /* + */ 1.71 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.79 \ /* + */ 1.68 , 1.79 \ /* + */ 1.68 , 1.78 \ /* + */ 1.67 , 1.77 \ /* + */ 1.67 , 1.77 \ /* + */ 1.66 , 1.76 \ /* + */ 1.65 , 1.76 \ /* + */ 1.65 , 1.75 \ /* + */ 1.64 , 1.75 \ /* + */ 1.64 , 1.74 \ /* + */ 1.63 , 1.74 \ /* + */ 1.63 , 1.73 \ /* + */ 1.62 , 1.73 \ /* + */ 1.61 , 1.73 \ /* + */ 1.61 , 1.72 \ /* + */ 1.60 , 1.72 \ /* + */ 1.60 , 1.71 \ /* + */ 1.59 , 1.71 \ /* + */ 1.59 , 1.71 \ /* + */ 1.58 , 1.71 \ /* + */ 1.58 , 1.70 \ /* + */ 1.57 , 1.70 \ /* + */ 1.57 , 1.70 \ /* + */ 1.56 , 1.69 \ /* + */ 1.56 , 1.69 \ /* + */ 1.55 , 1.69 \ /* + */ 1.55 , 1.69 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel10" { + matrix input `temp' = ( /* + */ 19.36 , . \ /* + */ 10.89 , 12.55 \ /* + */ 7.90 , 8.96 \ /* + */ 6.37 , 7.15 \ /* + */ 5.44 , 6.07 \ /* + */ 4.81 , 5.34 \ /* + */ 4.35 , 4.82 \ /* + */ 4.01 , 4.43 \ /* + */ 3.74 , 4.12 \ /* + */ 3.52 , 3.87 \ /* + */ 3.34 , 3.67 \ /* + */ 3.19 , 3.49 \ /* + */ 3.06 , 3.35 \ /* + */ 2.95 , 3.22 \ /* + */ 2.85 , 3.11 \ /* + */ 2.76 , 3.01 \ /* + */ 2.69 , 2.92 \ /* + */ 2.62 , 2.84 \ /* + */ 2.56 , 2.77 \ /* + */ 2.50 , 2.71 \ /* + */ 2.45 , 2.65 \ /* + */ 2.40 , 2.60 \ /* + */ 2.36 , 2.55 \ /* + */ 2.32 , 2.50 \ /* + */ 2.28 , 2.46 \ /* + */ 2.24 , 2.42 \ /* + */ 2.21 , 2.38 \ /* + */ 2.18 , 2.35 \ /* + */ 2.15 , 2.31 \ /* + */ 2.12 , 2.28 \ /* + */ 2.10 , 2.25 \ /* + */ 2.07 , 2.23 \ /* + */ 2.05 , 2.20 \ /* + */ 2.03 , 2.17 \ /* + */ 2.01 , 2.15 \ /* + */ 1.99 , 2.13 \ /* + */ 1.97 , 2.11 \ /* + */ 1.95 , 2.09 \ /* + */ 1.93 , 2.07 \ /* + */ 1.92 , 2.05 \ /* + */ 1.90 , 2.03 \ /* + */ 1.88 , 2.01 \ /* + */ 1.87 , 2.00 \ /* + */ 1.86 , 1.98 \ /* + */ 1.84 , 1.96 \ /* + */ 1.83 , 1.95 \ /* + */ 1.82 , 1.93 \ /* + */ 1.81 , 1.92 \ /* + */ 1.79 , 1.91 \ /* + */ 1.78 , 1.89 \ /* + */ 1.77 , 1.88 \ /* + */ 1.76 , 1.87 \ /* + */ 1.75 , 1.86 \ /* + */ 1.74 , 1.85 \ /* + */ 1.73 , 1.84 \ /* + */ 1.72 , 1.83 \ /* + */ 1.71 , 1.82 \ /* + */ 1.70 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.79 \ /* + */ 1.68 , 1.78 \ /* + */ 1.67 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.65 , 1.75 \ /* + */ 1.64 , 1.74 \ /* + */ 1.64 , 1.73 \ /* + */ 1.63 , 1.72 \ /* + */ 1.63 , 1.72 \ /* + */ 1.62 , 1.71 \ /* + */ 1.61 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.60 , 1.69 \ /* + */ 1.60 , 1.68 \ /* + */ 1.59 , 1.68 \ /* + */ 1.59 , 1.67 \ /* + */ 1.58 , 1.67 \ /* + */ 1.58 , 1.66 \ /* + */ 1.57 , 1.66 \ /* + */ 1.57 , 1.65 \ /* + */ 1.56 , 1.65 \ /* + */ 1.56 , 1.64 \ /* + */ 1.56 , 1.64 \ /* + */ 1.55 , 1.63 \ /* + */ 1.55 , 1.63 \ /* + */ 1.54 , 1.62 \ /* + */ 1.54 , 1.62 \ /* + */ 1.54 , 1.62 \ /* + */ 1.53 , 1.61 \ /* + */ 1.53 , 1.61 \ /* + */ 1.53 , 1.61 \ /* + */ 1.52 , 1.60 \ /* + */ 1.52 , 1.60 \ /* + */ 1.52 , 1.60 \ /* + */ 1.52 , 1.59 \ /* + */ 1.51 , 1.59 \ /* + */ 1.51 , 1.59 \ /* + */ 1.51 , 1.59 \ /* + */ 1.51 , 1.58 \ /* + */ 1.50 , 1.58 ) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel20" { + matrix input `temp' = ( /* + */ 15.64 , . \ /* + */ 9.00 , 9.72 \ /* + */ 6.61 , 7.18 \ /* + */ 5.38 , 5.85 \ /* + */ 4.62 , 5.04 \ /* + */ 4.11 , 4.48 \ /* + */ 3.75 , 4.08 \ /* + */ 3.47 , 3.77 \ /* + */ 3.25 , 3.53 \ /* + */ 3.07 , 3.33 \ /* + */ 2.92 , 3.17 \ /* + */ 2.80 , 3.04 \ /* + */ 2.70 , 2.92 \ /* + */ 2.61 , 2.82 \ /* + */ 2.53 , 2.73 \ /* + */ 2.46 , 2.65 \ /* + */ 2.39 , 2.58 \ /* + */ 2.34 , 2.52 \ /* + */ 2.29 , 2.46 \ /* + */ 2.24 , 2.41 \ /* + */ 2.20 , 2.36 \ /* + */ 2.16 , 2.32 \ /* + */ 2.13 , 2.28 \ /* + */ 2.10 , 2.24 \ /* + */ 2.06 , 2.21 \ /* + */ 2.04 , 2.18 \ /* + */ 2.01 , 2.15 \ /* + */ 1.99 , 2.12 \ /* + */ 1.96 , 2.09 \ /* + */ 1.94 , 2.07 \ /* + */ 1.92 , 2.04 \ /* + */ 1.90 , 2.02 \ /* + */ 1.88 , 2.00 \ /* + */ 1.87 , 1.98 \ /* + */ 1.85 , 1.96 \ /* + */ 1.83 , 1.94 \ /* + */ 1.82 , 1.93 \ /* + */ 1.80 , 1.91 \ /* + */ 1.79 , 1.89 \ /* + */ 1.78 , 1.88 \ /* + */ 1.76 , 1.86 \ /* + */ 1.75 , 1.85 \ /* + */ 1.74 , 1.84 \ /* + */ 1.73 , 1.82 \ /* + */ 1.72 , 1.81 \ /* + */ 1.71 , 1.80 \ /* + */ 1.70 , 1.79 \ /* + */ 1.69 , 1.78 \ /* + */ 1.68 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.65 , 1.74 \ /* + */ 1.65 , 1.73 \ /* + */ 1.64 , 1.72 \ /* + */ 1.63 , 1.71 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.68 \ /* + */ 1.60 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.56 , 1.62 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.54 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.44 , 1.50 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 ) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel30" { + matrix input `temp' = ( /* + */ 12.71 , . \ /* + */ 7.49 , 8.03 \ /* + */ 5.60 , 6.15 \ /* + */ 4.63 , 5.10 \ /* + */ 4.03 , 4.44 \ /* + */ 3.63 , 3.98 \ /* + */ 3.33 , 3.65 \ /* + */ 3.11 , 3.39 \ /* + */ 2.93 , 3.19 \ /* + */ 2.79 , 3.02 \ /* + */ 2.67 , 2.88 \ /* + */ 2.57 , 2.77 \ /* + */ 2.48 , 2.67 \ /* + */ 2.41 , 2.58 \ /* + */ 2.34 , 2.51 \ /* + */ 2.28 , 2.44 \ /* + */ 2.23 , 2.38 \ /* + */ 2.18 , 2.33 \ /* + */ 2.14 , 2.28 \ /* + */ 2.10 , 2.23 \ /* + */ 2.07 , 2.19 \ /* + */ 2.04 , 2.16 \ /* + */ 2.01 , 2.12 \ /* + */ 1.98 , 2.09 \ /* + */ 1.95 , 2.06 \ /* + */ 1.93 , 2.03 \ /* + */ 1.90 , 2.01 \ /* + */ 1.88 , 1.98 \ /* + */ 1.86 , 1.96 \ /* + */ 1.84 , 1.94 \ /* + */ 1.83 , 1.92 \ /* + */ 1.81 , 1.90 \ /* + */ 1.79 , 1.88 \ /* + */ 1.78 , 1.87 \ /* + */ 1.76 , 1.85 \ /* + */ 1.75 , 1.83 \ /* + */ 1.74 , 1.82 \ /* + */ 1.72 , 1.80 \ /* + */ 1.71 , 1.79 \ /* + */ 1.70 , 1.78 \ /* + */ 1.69 , 1.77 \ /* + */ 1.68 , 1.75 \ /* + */ 1.67 , 1.74 \ /* + */ 1.66 , 1.73 \ /* + */ 1.65 , 1.72 \ /* + */ 1.64 , 1.71 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.60 , 1.66 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.47 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.42 , 1.47 \ /* + */ 1.42 , 1.47 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.41 , 1.46 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax5" { + matrix input `temp' = ( /* + */ 23.81 , . \ /* + */ 12.38 , 14.19 \ /* + */ 8.66 , 10.00 \ /* + */ 6.81 , 7.88 \ /* + */ 5.71 , 6.60 \ /* + */ 4.98 , 5.74 \ /* + */ 4.45 , 5.13 \ /* + */ 4.06 , 4.66 \ /* + */ 3.76 , 4.30 \ /* + */ 3.51 , 4.01 \ /* + */ 3.31 , 3.77 \ /* + */ 3.15 , 3.57 \ /* + */ 3.00 , 3.41 \ /* + */ 2.88 , 3.26 \ /* + */ 2.78 , 3.13 \ /* + */ 2.69 , 3.02 \ /* + */ 2.61 , 2.92 \ /* + */ 2.53 , 2.84 \ /* + */ 2.47 , 2.76 \ /* + */ 2.41 , 2.69 \ /* + */ 2.36 , 2.62 \ /* + */ 2.31 , 2.56 \ /* + */ 2.27 , 2.51 \ /* + */ 2.23 , 2.46 \ /* + */ 2.19 , 2.42 \ /* + */ 2.15 , 2.37 \ /* + */ 2.12 , 2.33 \ /* + */ 2.09 , 2.30 \ /* + */ 2.07 , 2.26 \ /* + */ 2.04 , 2.23 \ /* + */ 2.02 , 2.20 \ /* + */ 1.99 , 2.17 \ /* + */ 1.97 , 2.14 \ /* + */ 1.95 , 2.12 \ /* + */ 1.93 , 2.10 \ /* + */ 1.91 , 2.07 \ /* + */ 1.90 , 2.05 \ /* + */ 1.88 , 2.03 \ /* + */ 1.87 , 2.01 \ /* + */ 1.85 , 1.99 \ /* + */ 1.84 , 1.98 \ /* + */ 1.82 , 1.96 \ /* + */ 1.81 , 1.94 \ /* + */ 1.80 , 1.93 \ /* + */ 1.79 , 1.91 \ /* + */ 1.78 , 1.90 \ /* + */ 1.76 , 1.88 \ /* + */ 1.75 , 1.87 \ /* + */ 1.74 , 1.86 \ /* + */ 1.73 , 1.85 \ /* + */ 1.73 , 1.83 \ /* + */ 1.72 , 1.82 \ /* + */ 1.71 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.79 \ /* + */ 1.68 , 1.78 \ /* + */ 1.68 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.65 , 1.74 \ /* + */ 1.65 , 1.74 \ /* + */ 1.64 , 1.73 \ /* + */ 1.63 , 1.72 \ /* + */ 1.63 , 1.71 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.70 \ /* + */ 1.61 , 1.69 \ /* + */ 1.60 , 1.68 \ /* + */ 1.60 , 1.68 \ /* + */ 1.59 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.64 \ /* + */ 1.56 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.62 \ /* + */ 1.54 , 1.61 \ /* + */ 1.54 , 1.61 \ /* + */ 1.53 , 1.60 \ /* + */ 1.53 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.50 , 1.57 \ /* + */ 1.50 , 1.57 \ /* + */ 1.50 , 1.56 \ /* + */ 1.49 , 1.56 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.48 , 1.55 \ /* + */ 1.48 , 1.54 \ /* + */ 1.47 , 1.54 \ /* + */ 1.47 , 1.54 \ /* + */ 1.47 , 1.53 \ /* + */ 1.46 , 1.53 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax10" { + matrix input `temp' = ( /* + */ 19.40 , . \ /* + */ 10.14 , 11.92 \ /* + */ 7.18 , 8.39 \ /* + */ 5.72 , 6.64 \ /* + */ 4.85 , 5.60 \ /* + */ 4.27 , 4.90 \ /* + */ 3.86 , 4.40 \ /* + */ 3.55 , 4.03 \ /* + */ 3.31 , 3.73 \ /* + */ 3.12 , 3.50 \ /* + */ 2.96 , 3.31 \ /* + */ 2.83 , 3.15 \ /* + */ 2.71 , 3.01 \ /* + */ 2.62 , 2.89 \ /* + */ 2.53 , 2.79 \ /* + */ 2.46 , 2.70 \ /* + */ 2.39 , 2.62 \ /* + */ 2.33 , 2.55 \ /* + */ 2.28 , 2.49 \ /* + */ 2.23 , 2.43 \ /* + */ 2.19 , 2.38 \ /* + */ 2.15 , 2.33 \ /* + */ 2.11 , 2.29 \ /* + */ 2.08 , 2.25 \ /* + */ 2.05 , 2.21 \ /* + */ 2.02 , 2.18 \ /* + */ 1.99 , 2.14 \ /* + */ 1.97 , 2.11 \ /* + */ 1.94 , 2.08 \ /* + */ 1.92 , 2.06 \ /* + */ 1.90 , 2.03 \ /* + */ 1.88 , 2.01 \ /* + */ 1.86 , 1.99 \ /* + */ 1.85 , 1.97 \ /* + */ 1.83 , 1.95 \ /* + */ 1.81 , 1.93 \ /* + */ 1.80 , 1.91 \ /* + */ 1.79 , 1.89 \ /* + */ 1.77 , 1.88 \ /* + */ 1.76 , 1.86 \ /* + */ 1.75 , 1.85 \ /* + */ 1.74 , 1.83 \ /* + */ 1.72 , 1.82 \ /* + */ 1.71 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.78 \ /* + */ 1.68 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.66 , 1.74 \ /* + */ 1.65 , 1.73 \ /* + */ 1.64 , 1.72 \ /* + */ 1.63 , 1.71 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.69 \ /* + */ 1.60 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.53 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.44 , 1.50 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.42 , 1.48 \ /* + */ 1.42 , 1.47 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax20" { + matrix input `temp' = ( /* + */ 15.39 , . \ /* + */ 8.16 , 9.41 \ /* + */ 5.87 , 6.79 \ /* + */ 4.75 , 5.47 \ /* + */ 4.08 , 4.66 \ /* + */ 3.64 , 4.13 \ /* + */ 3.32 , 3.74 \ /* + */ 3.08 , 3.45 \ /* + */ 2.89 , 3.22 \ /* + */ 2.74 , 3.03 \ /* + */ 2.62 , 2.88 \ /* + */ 2.51 , 2.76 \ /* + */ 2.42 , 2.65 \ /* + */ 2.35 , 2.56 \ /* + */ 2.28 , 2.48 \ /* + */ 2.22 , 2.40 \ /* + */ 2.17 , 2.34 \ /* + */ 2.12 , 2.28 \ /* + */ 2.08 , 2.23 \ /* + */ 2.04 , 2.19 \ /* + */ 2.01 , 2.15 \ /* + */ 1.98 , 2.11 \ /* + */ 1.95 , 2.07 \ /* + */ 1.92 , 2.04 \ /* + */ 1.89 , 2.01 \ /* + */ 1.87 , 1.98 \ /* + */ 1.85 , 1.96 \ /* + */ 1.83 , 1.93 \ /* + */ 1.81 , 1.91 \ /* + */ 1.79 , 1.89 \ /* + */ 1.77 , 1.87 \ /* + */ 1.76 , 1.85 \ /* + */ 1.74 , 1.83 \ /* + */ 1.73 , 1.82 \ /* + */ 1.72 , 1.80 \ /* + */ 1.70 , 1.79 \ /* + */ 1.69 , 1.77 \ /* + */ 1.68 , 1.76 \ /* + */ 1.67 , 1.74 \ /* + */ 1.66 , 1.73 \ /* + */ 1.65 , 1.72 \ /* + */ 1.64 , 1.71 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.58 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.62 \ /* + */ 1.56 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.54 , 1.59 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.52 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.47 , 1.52 \ /* + */ 1.47 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.48 \ /* + */ 1.44 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.41 \ /* + */ 1.37 , 1.41 \ /* + */ 1.37 , 1.41 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax30" { + matrix input `temp' = ( /* + */ 12.76 , . \ /* + */ 6.97 , 8.01 \ /* + */ 5.11 , 5.88 \ /* + */ 4.19 , 4.78 \ /* + */ 3.64 , 4.12 \ /* + */ 3.27 , 3.67 \ /* + */ 3.00 , 3.35 \ /* + */ 2.80 , 3.10 \ /* + */ 2.64 , 2.91 \ /* + */ 2.52 , 2.76 \ /* + */ 2.41 , 2.63 \ /* + */ 2.33 , 2.52 \ /* + */ 2.25 , 2.43 \ /* + */ 2.19 , 2.35 \ /* + */ 2.13 , 2.29 \ /* + */ 2.08 , 2.22 \ /* + */ 2.04 , 2.17 \ /* + */ 2.00 , 2.12 \ /* + */ 1.96 , 2.08 \ /* + */ 1.93 , 2.04 \ /* + */ 1.90 , 2.01 \ /* + */ 1.87 , 1.97 \ /* + */ 1.84 , 1.94 \ /* + */ 1.82 , 1.92 \ /* + */ 1.80 , 1.89 \ /* + */ 1.78 , 1.87 \ /* + */ 1.76 , 1.84 \ /* + */ 1.74 , 1.82 \ /* + */ 1.73 , 1.80 \ /* + */ 1.71 , 1.79 \ /* + */ 1.70 , 1.77 \ /* + */ 1.68 , 1.75 \ /* + */ 1.67 , 1.74 \ /* + */ 1.66 , 1.72 \ /* + */ 1.64 , 1.71 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.68 \ /* + */ 1.61 , 1.67 \ /* + */ 1.60 , 1.66 \ /* + */ 1.59 , 1.65 \ /* + */ 1.58 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.57 , 1.62 \ /* + */ 1.56 , 1.61 \ /* + */ 1.55 , 1.60 \ /* + */ 1.54 , 1.59 \ /* + */ 1.54 , 1.59 \ /* + */ 1.53 , 1.58 \ /* + */ 1.52 , 1.57 \ /* + */ 1.52 , 1.56 \ /* + */ 1.51 , 1.56 \ /* + */ 1.50 , 1.55 \ /* + */ 1.50 , 1.54 \ /* + */ 1.49 , 1.54 \ /* + */ 1.49 , 1.53 \ /* + */ 1.48 , 1.53 \ /* + */ 1.48 , 1.52 \ /* + */ 1.47 , 1.51 \ /* + */ 1.47 , 1.51 \ /* + */ 1.46 , 1.50 \ /* + */ 1.46 , 1.50 \ /* + */ 1.45 , 1.49 \ /* + */ 1.45 , 1.49 \ /* + */ 1.44 , 1.48 \ /* + */ 1.44 , 1.48 \ /* + */ 1.44 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.42 \ /* + */ 1.39 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.41 \ /* + */ 1.38 , 1.41 \ /* + */ 1.37 , 1.41 \ /* + */ 1.37 , 1.40 \ /* + */ 1.37 , 1.40 \ /* + */ 1.37 , 1.40 \ /* + */ 1.36 , 1.40 \ /* + */ 1.36 , 1.39 \ /* + */ 1.36 , 1.39 \ /* + */ 1.36 , 1.39 \ /* + */ 1.36 , 1.38 \ /* + */ 1.35 , 1.38 \ /* + */ 1.35 , 1.38 \ /* + */ 1.35 , 1.38 \ /* + */ 1.35 , 1.37 \ /* + */ 1.34 , 1.37 \ /* + */ 1.34 , 1.37 \ /* + */ 1.34 , 1.37 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize10" { + matrix input `temp' = ( /* + */ 16.38 , . \ /* + */ 8.68 , 7.03 \ /* + */ 6.46 , 5.44 \ /* + */ 5.44 , 4.72 \ /* + */ 4.84 , 4.32 \ /* + */ 4.45 , 4.06 \ /* + */ 4.18 , 3.90 \ /* + */ 3.97 , 3.78 \ /* + */ 3.81 , 3.70 \ /* + */ 3.68 , 3.64 \ /* + */ 3.58 , 3.60 \ /* + */ 3.50 , 3.58 \ /* + */ 3.42 , 3.56 \ /* + */ 3.36 , 3.55 \ /* + */ 3.31 , 3.54 \ /* + */ 3.27 , 3.55 \ /* + */ 3.24 , 3.55 \ /* + */ 3.20 , 3.56 \ /* + */ 3.18 , 3.57 \ /* + */ 3.21 , 3.58 \ /* + */ 3.39 , 3.59 \ /* + */ 3.57 , 3.60 \ /* + */ 3.68 , 3.62 \ /* + */ 3.75 , 3.64 \ /* + */ 3.79 , 3.65 \ /* + */ 3.82 , 3.67 \ /* + */ 3.85 , 3.74 \ /* + */ 3.86 , 3.87 \ /* + */ 3.87 , 4.02 \ /* + */ 3.88 , 4.12 \ /* + */ 3.89 , 4.19 \ /* + */ 3.89 , 4.24 \ /* + */ 3.90 , 4.27 \ /* + */ 3.90 , 4.31 \ /* + */ 3.90 , 4.33 \ /* + */ 3.90 , 4.36 \ /* + */ 3.90 , 4.38 \ /* + */ 3.90 , 4.39 \ /* + */ 3.90 , 4.41 \ /* + */ 3.90 , 4.43 \ /* + */ 3.90 , 4.44 \ /* + */ 3.90 , 4.45 \ /* + */ 3.90 , 4.47 \ /* + */ 3.90 , 4.48 \ /* + */ 3.90 , 4.49 \ /* + */ 3.90 , 4.50 \ /* + */ 3.90 , 4.51 \ /* + */ 3.90 , 4.52 \ /* + */ 3.90 , 4.53 \ /* + */ 3.90 , 4.54 \ /* + */ 3.90 , 4.55 \ /* + */ 3.90 , 4.56 \ /* + */ 3.90 , 4.56 \ /* + */ 3.90 , 4.57 \ /* + */ 3.90 , 4.58 \ /* + */ 3.90 , 4.59 \ /* + */ 3.90 , 4.59 \ /* + */ 3.90 , 4.60 \ /* + */ 3.90 , 4.61 \ /* + */ 3.90 , 4.61 \ /* + */ 3.90 , 4.62 \ /* + */ 3.90 , 4.62 \ /* + */ 3.90 , 4.63 \ /* + */ 3.90 , 4.63 \ /* + */ 3.89 , 4.64 \ /* + */ 3.89 , 4.64 \ /* + */ 3.89 , 4.64 \ /* + */ 3.89 , 4.65 \ /* + */ 3.89 , 4.65 \ /* + */ 3.89 , 4.65 \ /* + */ 3.89 , 4.66 \ /* + */ 3.89 , 4.66 \ /* + */ 3.89 , 4.66 \ /* + */ 3.89 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.86 , 4.65 \ /* + */ 3.86 , 4.65 \ /* + */ 3.86 , 4.65 \ /* + */ 3.86 , 4.64 \ /* + */ 3.85 , 4.64 \ /* + */ 3.85 , 4.64 \ /* + */ 3.85 , 4.63 \ /* + */ 3.85 , 4.63 \ /* + */ 3.84 , 4.62 \ /* + */ 3.84 , 4.62 \ /* + */ 3.84 , 4.61 \ /* + */ 3.84 , 4.60 \ /* + */ 3.83 , 4.60 \ /* + */ 3.83 , 4.59 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize15" { + matrix input `temp' = ( /* + */ 8.96 , . \ /* + */ 5.33 , 4.58 \ /* + */ 4.36 , 3.81 \ /* + */ 3.87 , 3.39 \ /* + */ 3.56 , 3.13 \ /* + */ 3.34 , 2.95 \ /* + */ 3.18 , 2.83 \ /* + */ 3.04 , 2.73 \ /* + */ 2.93 , 2.66 \ /* + */ 2.84 , 2.60 \ /* + */ 2.76 , 2.55 \ /* + */ 2.69 , 2.52 \ /* + */ 2.63 , 2.48 \ /* + */ 2.57 , 2.46 \ /* + */ 2.52 , 2.44 \ /* + */ 2.48 , 2.42 \ /* + */ 2.44 , 2.41 \ /* + */ 2.41 , 2.40 \ /* + */ 2.37 , 2.39 \ /* + */ 2.34 , 2.38 \ /* + */ 2.32 , 2.38 \ /* + */ 2.29 , 2.37 \ /* + */ 2.27 , 2.37 \ /* + */ 2.25 , 2.37 \ /* + */ 2.24 , 2.37 \ /* + */ 2.22 , 2.38 \ /* + */ 2.21 , 2.38 \ /* + */ 2.20 , 2.38 \ /* + */ 2.19 , 2.39 \ /* + */ 2.18 , 2.39 \ /* + */ 2.19 , 2.40 \ /* + */ 2.22 , 2.41 \ /* + */ 2.33 , 2.42 \ /* + */ 2.40 , 2.42 \ /* + */ 2.45 , 2.43 \ /* + */ 2.48 , 2.44 \ /* + */ 2.50 , 2.45 \ /* + */ 2.52 , 2.54 \ /* + */ 2.53 , 2.55 \ /* + */ 2.54 , 2.66 \ /* + */ 2.55 , 2.73 \ /* + */ 2.56 , 2.78 \ /* + */ 2.57 , 2.82 \ /* + */ 2.57 , 2.85 \ /* + */ 2.58 , 2.87 \ /* + */ 2.58 , 2.89 \ /* + */ 2.58 , 2.91 \ /* + */ 2.59 , 2.92 \ /* + */ 2.59 , 2.93 \ /* + */ 2.59 , 2.94 \ /* + */ 2.59 , 2.95 \ /* + */ 2.59 , 2.96 \ /* + */ 2.60 , 2.97 \ /* + */ 2.60 , 2.98 \ /* + */ 2.60 , 2.98 \ /* + */ 2.60 , 2.99 \ /* + */ 2.60 , 2.99 \ /* + */ 2.60 , 3.00 \ /* + */ 2.60 , 3.00 \ /* + */ 2.60 , 3.01 \ /* + */ 2.60 , 3.01 \ /* + */ 2.60 , 3.02 \ /* + */ 2.61 , 3.02 \ /* + */ 2.61 , 3.02 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.04 \ /* + */ 2.61 , 3.04 \ /* + */ 2.61 , 3.04 \ /* + */ 2.60 , 3.04 \ /* + */ 2.60 , 3.04 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.03 \ /* + */ 2.57 , 3.03 \ /* + */ 2.57 , 3.03 \ /* + */ 2.57 , 3.03 \ /* + */ 2.57 , 3.02 \ /* + */ 2.56 , 3.02 \ /* + */ 2.56 , 3.02 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize20" { + matrix input `temp' = ( /* + */ 6.66 , . \ /* + */ 4.42 , 3.95 \ /* + */ 3.69 , 3.32 \ /* + */ 3.30 , 2.99 \ /* + */ 3.05 , 2.78 \ /* + */ 2.87 , 2.63 \ /* + */ 2.73 , 2.52 \ /* + */ 2.63 , 2.43 \ /* + */ 2.54 , 2.36 \ /* + */ 2.46 , 2.30 \ /* + */ 2.40 , 2.25 \ /* + */ 2.34 , 2.21 \ /* + */ 2.29 , 2.17 \ /* + */ 2.25 , 2.14 \ /* + */ 2.21 , 2.11 \ /* + */ 2.18 , 2.09 \ /* + */ 2.14 , 2.07 \ /* + */ 2.11 , 2.05 \ /* + */ 2.09 , 2.03 \ /* + */ 2.06 , 2.02 \ /* + */ 2.04 , 2.01 \ /* + */ 2.02 , 1.99 \ /* + */ 2.00 , 1.98 \ /* + */ 1.98 , 1.98 \ /* + */ 1.96 , 1.97 \ /* + */ 1.95 , 1.96 \ /* + */ 1.93 , 1.96 \ /* + */ 1.92 , 1.95 \ /* + */ 1.90 , 1.95 \ /* + */ 1.89 , 1.95 \ /* + */ 1.88 , 1.94 \ /* + */ 1.87 , 1.94 \ /* + */ 1.86 , 1.94 \ /* + */ 1.85 , 1.94 \ /* + */ 1.84 , 1.94 \ /* + */ 1.83 , 1.94 \ /* + */ 1.82 , 1.94 \ /* + */ 1.81 , 1.95 \ /* + */ 1.81 , 1.95 \ /* + */ 1.80 , 1.95 \ /* + */ 1.79 , 1.95 \ /* + */ 1.79 , 1.96 \ /* + */ 1.78 , 1.96 \ /* + */ 1.78 , 1.97 \ /* + */ 1.80 , 1.97 \ /* + */ 1.87 , 1.98 \ /* + */ 1.92 , 1.98 \ /* + */ 1.95 , 1.99 \ /* + */ 1.97 , 2.00 \ /* + */ 1.99 , 2.00 \ /* + */ 2.00 , 2.01 \ /* + */ 2.01 , 2.09 \ /* + */ 2.02 , 2.11 \ /* + */ 2.03 , 2.18 \ /* + */ 2.04 , 2.23 \ /* + */ 2.04 , 2.27 \ /* + */ 2.05 , 2.29 \ /* + */ 2.05 , 2.31 \ /* + */ 2.06 , 2.33 \ /* + */ 2.06 , 2.34 \ /* + */ 2.07 , 2.35 \ /* + */ 2.07 , 2.36 \ /* + */ 2.07 , 2.37 \ /* + */ 2.08 , 2.38 \ /* + */ 2.08 , 2.39 \ /* + */ 2.08 , 2.39 \ /* + */ 2.08 , 2.40 \ /* + */ 2.09 , 2.40 \ /* + */ 2.09 , 2.41 \ /* + */ 2.09 , 2.41 \ /* + */ 2.09 , 2.41 \ /* + */ 2.09 , 2.42 \ /* + */ 2.09 , 2.42 \ /* + */ 2.09 , 2.42 \ /* + */ 2.09 , 2.43 \ /* + */ 2.10 , 2.43 \ /* + */ 2.10 , 2.43 \ /* + */ 2.10 , 2.43 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.09 , 2.44 \ /* + */ 2.09 , 2.44 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.07 , 2.44 \ /* + */ 2.07 , 2.44 \ /* + */ 2.07 , 2.44 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize25" { + matrix input `temp' = ( /* + */ 5.53 , . \ /* + */ 3.92 , 3.63 \ /* + */ 3.32 , 3.09 \ /* + */ 2.98 , 2.79 \ /* + */ 2.77 , 2.60 \ /* + */ 2.61 , 2.46 \ /* + */ 2.49 , 2.35 \ /* + */ 2.39 , 2.27 \ /* + */ 2.32 , 2.20 \ /* + */ 2.25 , 2.14 \ /* + */ 2.19 , 2.09 \ /* + */ 2.14 , 2.05 \ /* + */ 2.10 , 2.02 \ /* + */ 2.06 , 1.99 \ /* + */ 2.03 , 1.96 \ /* + */ 2.00 , 1.93 \ /* + */ 1.97 , 1.91 \ /* + */ 1.94 , 1.89 \ /* + */ 1.92 , 1.87 \ /* + */ 1.90 , 1.86 \ /* + */ 1.88 , 1.84 \ /* + */ 1.86 , 1.83 \ /* + */ 1.84 , 1.81 \ /* + */ 1.83 , 1.80 \ /* + */ 1.81 , 1.79 \ /* + */ 1.80 , 1.78 \ /* + */ 1.78 , 1.77 \ /* + */ 1.77 , 1.77 \ /* + */ 1.76 , 1.76 \ /* + */ 1.75 , 1.75 \ /* + */ 1.74 , 1.75 \ /* + */ 1.73 , 1.74 \ /* + */ 1.72 , 1.73 \ /* + */ 1.71 , 1.73 \ /* + */ 1.70 , 1.73 \ /* + */ 1.69 , 1.72 \ /* + */ 1.68 , 1.72 \ /* + */ 1.67 , 1.71 \ /* + */ 1.67 , 1.71 \ /* + */ 1.66 , 1.71 \ /* + */ 1.65 , 1.71 \ /* + */ 1.65 , 1.71 \ /* + */ 1.64 , 1.70 \ /* + */ 1.63 , 1.70 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.60 , 1.70 \ /* + */ 1.60 , 1.70 \ /* + */ 1.59 , 1.70 \ /* + */ 1.59 , 1.70 \ /* + */ 1.59 , 1.70 \ /* + */ 1.58 , 1.70 \ /* + */ 1.58 , 1.71 \ /* + */ 1.58 , 1.71 \ /* + */ 1.57 , 1.71 \ /* + */ 1.59 , 1.71 \ /* + */ 1.60 , 1.71 \ /* + */ 1.63 , 1.72 \ /* + */ 1.65 , 1.72 \ /* + */ 1.67 , 1.72 \ /* + */ 1.69 , 1.72 \ /* + */ 1.70 , 1.76 \ /* + */ 1.71 , 1.81 \ /* + */ 1.72 , 1.87 \ /* + */ 1.73 , 1.91 \ /* + */ 1.74 , 1.94 \ /* + */ 1.74 , 1.96 \ /* + */ 1.75 , 1.98 \ /* + */ 1.75 , 1.99 \ /* + */ 1.76 , 2.01 \ /* + */ 1.76 , 2.02 \ /* + */ 1.77 , 2.03 \ /* + */ 1.77 , 2.04 \ /* + */ 1.78 , 2.04 \ /* + */ 1.78 , 2.05 \ /* + */ 1.78 , 2.06 \ /* + */ 1.79 , 2.06 \ /* + */ 1.79 , 2.07 \ /* + */ 1.79 , 2.07 \ /* + */ 1.79 , 2.08 \ /* + */ 1.80 , 2.08 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + return scalar cv=`cv' +end + +// capt prog drop abw +// abw wants a varlist of [ eps | Z | touse] +// where Z includes all instruments, included and excluded, with constant if +// present as the last column; eps are a suitable set of residuals; and touse +// marks the observations in the data matrix used to generate the residuals +// (e.g. e(sample) of the appropriate model). +// The Noconstant option indicates that no constant term exists in the Z matrix. +// kern is the name of the HAC kernel. -ivregress- only provides definitions +// for Bartlett (default), Parzen, quadratic spectral. + +// returns the optimal bandwidth as local abw + +// abw 1.0.1 CFB 30jun2007 +// 1.0.1 : redefine kernel names (3 instances) to match ivreg2 + +prog def abw, rclass + version 9.2 + syntax varlist(ts), [ NOConstant Kernel(string)] +// validate kernel + if "`kernel'" == "" { + local kernel = "Bartlett" + } + if !inlist("`kernel'","Bartlett","Parzen","Quadratic spectral") { + di as err "Error: kernel `kernel' not compatible with bw(auto)" + return scalar abw = 1 + return local bwchoice "Kernel `kernel' not compatible with bw(auto); bw=1 (default)" + exit + } + else { +// set constant + local cons 1 + if "`noconstant'" != "" { + local cons 0 + } +// deal with ts ops + tsrevar `varlist' + local varlist1 `r(varlist)' + + mata: abw("`varlist1'",`cons',"`kernel'") + return scalar abw = `abw' + return local bwchoice "Automatic bw selection according to Newey-West (1994)" + } +end + +mata: +void abw (string scalar Zulist, + real scalar cons, + string scalar kernel + ) +{ + string rowvector Zunames, tov + string scalar v, v2 + real matrix uZ + real rowvector h + real scalar lenzu, abw + +// access the Stata variables in Zulist, honoring touse stored as last column + Zunames = tokens(Zulist) + lenzu=cols(Zunames)-1 + v = Zunames[|1\lenzu|] + v2 = Zunames[lenzu+1] + st_view(uZ,.,v,v2) + +// assume constant in last col of uZ if it exists +// account for eps as the first column of uZ + if (cons) { + nrows1=cols(uZ)-2 + nrows2=1 + } + else { + nrows1=cols(uZ)-1 + nrows2=0 + } +// [R] ivregress p.42: referencing Newey-West 1994 REStud 61(4):631-653 +// define h indicator rowvector + h = J(nrows1,1,1) \ J(nrows2,1,0) + +// calc mstar per p.43 +// Hannan (1971, 296) & Priestley (1981, 58) per Newey-West p. 633 +// corrected per Alistair Hall msg to Brian Poi 17jul2008 + T = rows(uZ) + oneT = 1/T + expo = 2/9 + q = 1 +// cgamma = 1.4117 + cgamma = 1.1447 + if(kernel == "Parzen") { + expo = 4/25 + q = 2 + cgamma = 2.6614 + } + if(kernel == "Quadratic spectral") { + expo = 2/25 + q = 2 + cgamma = 1.3221 + } +// per Newey-West p.639, Anderson (1971), Priestley (1981) may provide +// guidance on setting expo for other kernels + mstar = trunc(20 *(T/100)^expo) + +// calc uZ matrix + u = uZ[.,1] + Z = uZ[|1,2 \.,.|] + +// calc f vector: (u_i Z_i) * h + f = (u :* Z) * h + +// calc sigmahat vector + sigmahat = J(mstar+1,1,oneT) + for(j=0;j<=mstar;j++) { + for(i=j+1;i<=T;i++) { + sigmahat[j+1] = sigmahat[j+1] + f[i]*f[i-j] + } + } + +// calc shat(q), shat(0) + shatq = 0 + shat0 = sigmahat[1] + for(j=1;j<=mstar;j++) { + shatq = shatq + 2 * sigmahat[j+1] * j^q + shat0 = shat0 + 2 * sigmahat[j+1] + } + +// calc gammahat + expon = 1/(2*q+1) + gammahat = cgamma*( (shatq/shat0)^2 )^expon + m = gammahat * T^expon + +// calc opt lag + if(kernel == "Bartlett" | kernel == "Parzen") { + optlag = min((trunc(m),mstar)) + } + else if(kernel == "Quadratic spectral") { + optlag = min((m,mstar)) + } + +// if optlag is the optimal lag to be used, we need to add one to +// specify bandwidth in ivreg2 terms + abw = optlag + 1 + st_local("abw",strofreal(abw)) +} +end + + +*************************************** START **************************************** +********************************* livreg2.mlib CODE ********************************** +* Code from: +* livreg2 1.1.07 13july2014 +* authors cfb & mes +* compiled in Stata 9.2 +* Mata library for ranktest. +* Used by later versions of ivreg2 but NOT by ivreg29 - only by ranktest here. +* Introduced with ivreg2 v 3.1.01 and ranktest v 1.3.01. +* Imported into ivreg29 so that ivreg29 is free-standing. +* See end of file for version notes. + +version 9.2 +mata: + +// ********* struct ms_ivreg29_vcvorthog - shared by ivreg2 and ranktest ******************* // +struct ms_ivreg29_vcvorthog { + string scalar ename, Znames, touse, weight, wvarname + string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel + string scalar sw, psd, ivarname, tvarname, tindexname + real scalar wf, N, bw, tdelta, dofminus + real matrix ZZ + pointer matrix e + pointer matrix Z + pointer matrix wvar +} + +// ********* s_ivreg29_vkernel - shared by ivreg2 and ranktest ******************* // +// Program checks whether kernel and bw choices are valid. +// s_ivreg29_vkernel is called from Stata. +// Arguments are the kernel name (req), bandwidth (req) and ivar name (opt). +// All 3 are strings. +// Returns results in r() macros. +// r(kernel) - name of kernel (string) +// r(bw) - bandwidth (scalar) + +void s_ivreg29_vkernel( string scalar kernel, + string scalar bwstring, + string scalar ivar + ) +{ + +// Check bandwidth + if (bwstring=="auto") { + bw=-1 + } + else { + bw=strtoreal(bwstring) + if (bw==.) { + printf("{err}bandwidth option bw() required for HAC-robust estimation\n") + exit(102) + } + if (bw<=0) { + printf("{err}invalid bandwidth in option bw() - must be real > 0\n") + exit(198) + } + } + +// Check ivar + if (bwstring=="auto" & ivar~="") { + printf("{err}Automatic bandwidth selection not available for panel data\n") + exit(198) + } + +// Check kernel +// Valid kernel list is abbrev, full name, whether special case if bw=1 +// First in list is default kernel = Barlett + vklist = ( ("", "bartlett", "0") + \ ("bar", "bartlett", "0") + \ ("bartlett", "bartlett", "0") + \ ("par", "parzen", "0") + \ ("parzen", "parzen", "0") + \ ("tru", "truncated", "1") + \ ("truncated", "truncated", "1") + \ ("thann", "tukey-hanning", "0") + \ ("tukey-hanning", "tukey-hanning", "0") + \ ("thamm", "tukey-hamming", "0") + \ ("tukey-hamming", "tukey-hamming", "0") + \ ("qua", "quadratic spectral", "1") + \ ("qs", "quadratic spectral", "1") + \ ("quadratic-spectral", "quadratic spectral", "1") + \ ("quadratic spectral", "quadratic spectral", "1") + \ ("dan", "danielle", "1") + \ ("danielle", "danielle", "1") + \ ("ten", "tent", "1") + \ ("tent", "tent", "1") + ) + kname=strltrim(strlower(kernel)) + pos = (vklist[.,1] :== kname) + +// Exit with error if not in list + if (sum(pos)==0) { + printf("{err}invalid kernel\n") + exit(198) + } + + vkname=strproper(select(vklist[.,2],pos)) + st_global("r(kernel)", vkname) + st_numscalar("r(bw)",bw) + +// Warn if kernel is type where bw=1 means no lags are used + if (bw==1 & select(vklist[.,3],pos)=="0") { + printf("{result}Note: kernel=%s", vkname) + printf("{result} and bw=1 implies zero lags used. Standard errors and\n") + printf("{result} test statistics are not autocorrelation-consistent.\n") + } +} // end of program s_ivreg29_vkernel + +// ********* m_ivreg29_omega - shared by ivreg2 and ranktest ********************* // + +// NB: ivreg2 always calls m_ivreg29_omega with e as column vector, i.e., K=1 // +// ranktest can call m_ivreg29_omega with e as matrix, i.e., K>=1 // + +real matrix m_ivreg29_omega(struct ms_ivreg29_vcvorthog scalar vcvo) +{ + if (vcvo.clustvarname~="") { + st_view(clustvar, ., vcvo.clustvarname, vcvo.touse) + info = panelsetup(clustvar, 1) + N_clust=rows(info) + if (vcvo.clustvarname2~="") { + st_view(clustvar2, ., vcvo.clustvarname2, vcvo.touse) + if (vcvo.kernel=="") { + st_view(clustvar3, ., vcvo.clustvarname3, vcvo.touse) // needed only if not panel tsset + } + } + } + + if (vcvo.kernel~="") { + st_view(t, ., st_tsrevar(vcvo.tvarname), vcvo.touse) + T=max(t)-min(t)+1 + } + + if ((vcvo.kernel=="Bartlett") | (vcvo.kernel=="Parzen") | (vcvo.kernel=="Truncated") /// + | (vcvo.kernel=="Tukey-Hanning")| (vcvo.kernel=="Tukey-Hamming")) { + window="lag" + } + else if ((vcvo.kernel=="Quadratic Spectral") | (vcvo.kernel=="Danielle") | (vcvo.kernel=="Tent")) { + window="spectral" + } + else if (vcvo.kernel~="") { +// Should never reach this point +printf("\n{error:Error: invalid kernel}\n") + exit(error(3351)) + } + + L=cols(*vcvo.Z) + K=cols(*vcvo.e) // ivreg2 always calls with K=1; ranktest may call with K>=1. + +// Covariance matrices +// shat * 1/N is same as estimated S matrix of orthog conditions + +// Block for homoskedastic and AC. dof correction if any incorporated into sigma estimates. + if ((vcvo.robust=="") & (vcvo.clustvarname=="")) { +// ZZ is already calculated as an external + ee = quadcross(*vcvo.e, vcvo.wf*(*vcvo.wvar), *vcvo.e) + sigma2=ee/(vcvo.N-vcvo.dofminus) + shat=sigma2#vcvo.ZZ + if (vcvo.kernel~="") { + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + tnow=st_data(., vcvo.tindexname) + for (tau=1; tau<=TAU; tau++) { + kw = m_ivreg29_calckw(tau, vcvo.bw, vcvo.kernel) + if (kw~=0) { // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + lstau = "L"+strofreal(tau) + tlag=st_data(., lstau+"."+vcvo.tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix +// if no lags exist, tmatrix has zero rows. + if (rows(tmatrix)>0) { +// col 1 of tmatrix has row numbers of all rows of data with this time period that have a corresponding lag +// col 2 of tmatrix has row numbers of all rows of data with lag tau that have a corresponding ob this time period. +// Should never happen that fweights or iweights make it here, +// but if they did the next line would be sqrt(wvari)*sqrt(wvari1) [with no wf since not needed for fw or iw] + wv = (*vcvo.wvar)[tmatrix[.,1]] /// + :* (*vcvo.wvar)[tmatrix[.,2]]*(vcvo.wf^2) // inner weighting matrix for quadcross + sigmahat = quadcross((*vcvo.e)[tmatrix[.,1],.], wv ,(*vcvo.e)[tmatrix[.,2],.]) /// + / (vcvo.N-vcvo.dofminus) // large dof correction + ZZhat = quadcross((*vcvo.Z)[tmatrix[.,1],.], wv, (*vcvo.Z)[tmatrix[.,2],.]) + ghat = sigmahat#ZZhat + shat=shat+kw*(ghat+ghat') + } + } // end non-zero kernel weight block + } // end tau loop + } // end kernel code +// Note large dof correction (if there is one) has already been incorporated + shat=shat/vcvo.N + } // end homoskedastic, AC code + +// Block for robust HC and HAC but not Stock-Watson and single clustering. +// Need to enter for double-clustering if one cluster is time. + if ( (vcvo.robust~="") & (vcvo.sw=="") & ((vcvo.clustvarname=="") /// + | ((vcvo.clustvarname2~="") & (vcvo.kernel~=""))) ) { + if (K==1) { // simple/fast where e is a column vector + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { + wv = (*vcvo.e:^2) :* *vcvo.wvar + } + else { + wv = (*vcvo.e :* *vcvo.wvar * vcvo.wf):^2 // wf needed for aweights and pweights + } + shat=quadcross(*vcvo.Z, wv, *vcvo.Z) // basic Eicker-Huber-White-sandwich-robust vce + } + else { // e is a matrix so must loop + shat=J(L*K,L*K,0) + for (i=1; i<=rows(*vcvo.e); i++) { + eZi=((*vcvo.e)[i,.])#((*vcvo.Z)[i,.]) + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { +// wvar is a column vector. wf not needed for fw and iw (=1 by dfn so redundant). + shat=shat+quadcross(eZi,eZi)*((*vcvo.wvar)[i]) + } + else { + shat=shat+quadcross(eZi,eZi)*((*vcvo.wvar)[i] * vcvo.wf)^2 // **** ADDED *vcvo.wf + } + } + } + if (vcvo.kernel~="") { +// Spectral windows require looping through all T-1 autocovariances + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + tnow=st_data(., vcvo.tindexname) + for (tau=1; tau<=TAU; tau++) { + kw = m_ivreg29_calckw(tau, vcvo.bw, vcvo.kernel) + if (kw~=0) { // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + lstau = "L"+strofreal(tau) + tlag=st_data(., lstau+"."+vcvo.tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix + +// col 1 of tmatrix has row numbers of all rows of data with this time period that have a corresponding lag +// col 2 of tmatrix has row numbers of all rows of data with lag tau that have a corresponding ob this time period. +// if no lags exist, tmatrix has zero rows + if (rows(tmatrix)>0) { + if (K==1) { // simple/fast where e is a column vector +// wv is inner weighting matrix for quadcross + wv = (*vcvo.e)[tmatrix[.,1]] :* (*vcvo.e)[tmatrix[.,2]] /// + :* (*vcvo.wvar)[tmatrix[.,1]] :* (*vcvo.wvar)[tmatrix[.,2]] * (vcvo.wf^2) + ghat = quadcross((*vcvo.Z)[tmatrix[.,1],.], wv, (*vcvo.Z)[tmatrix[.,2],.]) + } + else { // e is a matrix so must loop + ghat=J(L*K,L*K,0) + for (i=1; i<=rows(tmatrix); i++) { + wvari =(*vcvo.wvar)[tmatrix[i,1]] + wvari1=(*vcvo.wvar)[tmatrix[i,2]] + ei =(*vcvo.e)[tmatrix[i,1],.] + ei1 =(*vcvo.e)[tmatrix[i,2],.] + Zi =(*vcvo.Z)[tmatrix[i,1],.] + Zi1 =(*vcvo.Z)[tmatrix[i,2],.] + eZi =ei#Zi + eZi1=ei1#Zi1 +// Should never happen that fweights or iweights make it here, but if they did +// the next line would be ghat=ghat+eZi'*eZi1*sqrt(wvari)*sqrt(wvari1) +// [without *vcvo.wf since wf=1 for fw and iw] + ghat=ghat+quadcross(eZi,eZi1)*wvari*wvari1 * (vcvo.wf^2) // ADDED * (vcvo.wf^2) + } + } + shat=shat+kw*(ghat+ghat') + } // end non-zero-obs accumulation block + } // end non-zero kernel weight block + } // end tau loop + } // end kernel code +// Incorporate large dof correction if there is one + shat=shat/(vcvo.N-vcvo.dofminus) + } // end HC/HAC code + + if (vcvo.clustvarname~="") { +// Block for cluster-robust +// 2-level clustering: S = S(level 1) + S(level 2) - S(level 3 = intersection of levels 1 & 2) +// Prepare shat3 if 2-level clustering + if (vcvo.clustvarname2~="") { + if (vcvo.kernel~="") { // second cluster variable is time + // shat3 was already calculated above as shat + shat3=shat*(vcvo.N-vcvo.dofminus) + } + else { // calculate shat3 + // data were sorted on clustvar3-clustvar1 so + // clustvar3 is nested in clustvar1 and Mata panel functions + // work for both. + info3 = panelsetup(clustvar3, 1) + if (rows(info3)==rows(*vcvo.e)) { // intersection of levels 1 & 2 are all single obs + // so no need to loop through row by row + if (K==1) { // simple/fast where e is a column vector + wv = (*vcvo.e :* *vcvo.wvar * vcvo.wf):^2 + shat3=quadcross(*vcvo.Z, wv, *vcvo.Z) // basic Eicker-Huber-White-sandwich-robust vce + } + else { // e is a matrix so must loop + shat3=J(L*K,L*K,0) + for (i=1; i<=rows(*vcvo.e); i++) { + eZi=((*vcvo.e)[i,.])#((*vcvo.Z)[i,.]) + shat3=shat3+quadcross(eZi,eZi)*((*vcvo.wvar)[i] * vcvo.wf)^2 // **** ADDED *vcvo.wf + } + } + } + else { // intersection of levels 1 & 2 includes some groups of obs + N_clust3=rows(info3) + shat3=J(L*K,L*K,0) + for (i=1; i<=N_clust3; i++) { + esub=panelsubmatrix(*vcvo.e,i,info3) + Zsub=panelsubmatrix(*vcvo.Z,i,info3) + wsub=panelsubmatrix(*vcvo.wvar,i,info3) + wv = esub :* wsub * vcvo.wf + if (K==1) { // simple/fast where e is a column vector + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ = J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.] * vcvo.wf // **** ADDED *vcvo.wf + } + } + shat3=shat3+quadcross(eZ,eZ) + } + } + } + } + +// 1st level of clustering, no kernel-robust +// Entered unless 1-level clustering and kernel-robust + if (!((vcvo.kernel~="") & (vcvo.clustvarname2==""))) { + shat=J(L*K,L*K,0) + for (i=1; i<=N_clust; i++) { // loop through clusters, adding Z'ee'Z + // for indiv cluster in each loop + esub=panelsubmatrix(*vcvo.e,i,info) + Zsub=panelsubmatrix(*vcvo.Z,i,info) + wsub=panelsubmatrix(*vcvo.wvar,i,info) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat=shat+quadcross(eZ,eZ) + } // end loop through clusters + } + +// 2-level clustering, no kernel-robust + if ((vcvo.clustvarname2~="") & (vcvo.kernel=="")) { + imax=max(clustvar2) // clustvar2 is numbered 1..N_clust2 + shat2=J(L*K,L*K,0) + for (i=1; i<=imax; i++) { // loop through clusters, adding Z'ee'Z + // for indiv cluster in each loop + svar=(clustvar2:==i) // mimics panelsubmatrix but doesn't require sorted data + esub=select(*vcvo.e,svar) // it is, however, noticably slower. + Zsub=select(*vcvo.Z,svar) + wsub=select(*vcvo.wvar,svar) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat2=shat2+quadcross(eZ,eZ) + } + } + +// 1st level of cluster, kernel-robust OR +// 2-level clustering, kernel-robust and time is 2nd cluster variable + if (vcvo.kernel~="") { + shat2=J(L*K,L*K,0) +// First, standard cluster-robust, i.e., no lags. + i=min(t) + while (i<=max(t)) { // loop through all T clusters, adding Z'ee'Z + // for indiv cluster in each loop + eZ=J(1,L*K,0) + svar=(t:==i) // select obs with t=i + if (colsum(svar)>0) { // there are obs with t=i + esub=select(*vcvo.e,svar) + Zsub=select(*vcvo.Z,svar) + wsub=select(*vcvo.wvar,svar) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { +// MISSING LINE IS NEXT + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat2=shat2+quadcross(eZ,eZ) + } + i=i+vcvo.tdelta + } // end i loop through all T clusters + +// Spectral windows require looping through all T-1 autocovariances + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + + for (tau=1; tau<=TAU; tau++) { + kw = m_ivreg29_calckw(tau, vcvo.bw, vcvo.kernel) // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + if (kw~=0) { + i=min(t)+tau*vcvo.tdelta // Loop through all possible ts (time clusters) + while (i<=max(t)) { // Start at earliest possible t + svar=t[.,]:==i // svar is current, svar1 is tau-th lag + svar1=t[.,]:==(i-tau*vcvo.tdelta) // tau*vcvo.tdelta is usually just tau + if ((colsum(svar)>0) // there are current & lagged obs + & (colsum(svar1)>0)) { + wv = select((*vcvo.e),svar) :* select((*vcvo.wvar),svar) * vcvo.wf + wv1 = select((*vcvo.e),svar1) :* select((*vcvo.wvar),svar1) * vcvo.wf + Zsub =select((*vcvo.Z),svar) + Zsub1=select((*vcvo.Z),svar1) + if (K==1) { // simple/fast, e is column vector + eZsub = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + eZsub1= quadcross(1, wv1, Zsub1) // equivalent to colsum(wv :* Zsub) + } + else { + eZsub=J(1,L*K,0) + for (j=1; j<=rows(Zsub); j++) { + wvj =wv[j,.] + Zj =Zsub[j,.] + eZsub=eZsub+(wvj#Zj) + } + eZsub1=J(1,L*K,0) + for (j=1; j<=rows(Zsub1); j++) { + wv1j =wv1[j,.] + Z1j =Zsub1[j,.] + eZsub1=eZsub1+(wv1j#Z1j) + } + } + ghat=quadcross(eZsub,eZsub1) + shat2=shat2+kw*(ghat+ghat') + } + i=i+vcvo.tdelta + } + } // end non-zero kernel weight block + } // end tau loop + +// If 1-level clustering, shat2 just calculated above is actually the desired shat + if (vcvo.clustvarname2=="") { + shat=shat2 + } + } + +// 2-level clustering, completion +// Cameron-Gelbach-Miller/Thompson method: +// Add 2 cluster variance matrices and subtract 3rd + if (vcvo.clustvarname2~="") { + shat = shat+shat2-shat3 + } + +// Note no dof correction required for cluster-robust + shat=shat/vcvo.N + } // end cluster-robust code + + if (vcvo.sw~="") { +// Stock-Watson adjustment. Calculate Bhat in their equation (6). Also need T=panel length. +// They define for balanced panels. Since T is not constant for unbalanced panels, need +// to incorporate panel-varying 1/T, 1/(T-1) and 1/(T-2) as weights in summation. + + st_view(ivar, ., st_tsrevar(vcvo.ivarname), vcvo.touse) + info_ivar = panelsetup(ivar, 1) + + shat=J(L*K,L*K,0) + bhat=J(L*K,L*K,0) + N_panels=0 + for (i=1; i<=rows(info_ivar); i++) { + esub=panelsubmatrix(*vcvo.e,i,info_ivar) + Zsub=panelsubmatrix(*vcvo.Z,i,info_ivar) + wsub=panelsubmatrix(*vcvo.wvar,i,info_ivar) + Tsub=rows(esub) + if (Tsub>2) { // SW cov estimator defined only for T>2 + N_panels=N_panels+1 + sigmahatsub=J(K,K,0) + ZZsub=J(L*K,L*K,0) + shatsub=J(L*K,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZi=esub[j,1]#Zsub[j,.] + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { + shatsub=shatsub+quadcross(eZi,eZi)*wsub[j]*vcvo.wf + sigmahatsub=sigmahatsub + quadcross(esub[j,1],esub[j,1])*wsub[j]*vcvo.wf + ZZsub=ZZsub+quadcross(Zsub[j,.],Zsub[j,.])*wsub[j]*vcvo.wf + } + else { + shatsub=shatsub+quadcross(eZi,eZi)*((wsub[j]*vcvo.wf)^2) + sigmahatsub=sigmahatsub + quadcross(esub[j,1],esub[j,1])*((wsub[j]*vcvo.wf)^2) + ZZsub=ZZsub+quadcross(Zsub[j,.],Zsub[j,.])*((wsub[j]*vcvo.wf)^2) + } + } // end loop through j obs of panel i + shat=shat + shatsub*(Tsub-1)/(Tsub-2) + bhat=bhat + ZZsub/Tsub#sigmahatsub/(Tsub-1)/(Tsub-2) + } + } // end loop through i panels + +// Note that Stock-Watson incorporate an N-n-k degrees of freedom correction in their eqn 4 +// for what we call shat. We use only an N-n degrees of freedom correction, i.e., we ignore +// the k regressors. This is because this is an estimate of S, the VCV of orthogonality conditions, +// independently of its use to obtain an estimate of the variance of beta. Makes no diff aysmptotically. +// Ignore dofminus correction since this is explicitly handled here. +// Use number of valid panels in denominator (SW cov estimator defined only for panels with T>2). + shat=shat/(vcvo.N-N_panels) + bhat=bhat/N_panels + shat=shat-bhat + } // end Stock-Watson block + + _makesymmetric(shat) + +// shat may not be positive-definite. Use spectral decomposition to obtain an invertable version. +// Extract Eigenvector and Eigenvalues, replace EVs, and reassemble shat. +// psda option: Stock-Watson 2008 Econometrica, Remark 8, say replace neg EVs with abs(EVs). +// psd0 option: Politis (2007) says replace neg EVs with zeros. + if (vcvo.psd~="") { + symeigensystem(shat,Evec,Eval) + if (vcvo.psd=="psda") { + Eval = abs(Eval) + } + else { + Eval = Eval + (abs(Eval) - Eval)/2 + } + shat = Evec*diag(Eval)*Evec' + _makesymmetric(shat) + } + + return(shat) + +} // end of program m_ivreg29_omega + +// *********************************************************************** // +// ********* m_ivreg29_calckw - shared by ivreg2 and ranktest ********************* // +// *********************************************************************** // + +real scalar m_ivreg29_calckw( real scalar tau, + real scalar bw, + string scalar kernel) + { + karg = tau / bw + if (kernel=="Truncated") { + kw=1 + } + if (kernel=="Bartlett") { + kw=(1-karg) + } + if (kernel=="Parzen") { + if (karg <= 0.5) { + kw = 1-6*karg^2+6*karg^3 + } + else { + kw = 2*(1-karg)^3 + } + } + if (kernel=="Tukey-Hanning") { + kw=0.5+0.5*cos(pi()*karg) + } + if (kernel=="Tukey-Hamming") { + kw=0.54+0.46*cos(pi()*karg) + } + if (kernel=="Tent") { + kw=2*(1-cos(tau*karg)) / (karg^2) + } + if (kernel=="Danielle") { + kw=sin(pi()*karg) / (pi()*karg) + } + if (kernel=="Quadratic Spectral") { + kw=25/(12*pi()^2*karg^2) /* + */ * ( sin(6*pi()*karg/5)/(6*pi()*karg/5) /* + */ - cos(6*pi()*karg/5) ) + } + return(kw) + } // end kw + +// *********************************************************************** // +// ********* END CODE SHARED BY ivreg2 AND ranktest ******************** // +// *********************************************************************** // + + +end + +****************************************** END *************************************** +*********************************** livreg2.mlib CODE ******************************** + +***************************************** START ************************************** +*********************************** ranktest.ado CODE ******************************** +* Code from: +* ranktest 1.3.04 24aug2014 +* author mes, based on code by fk +* Imported into ivreg29 so that ivreg29 is free-standing. +* See end of file for version notes. + +program define ivreg29_ranktest, rclass sortpreserve + version 9.2 + local lversion 01.3.04 + + if substr("`1'",1,1)== "," { + if "`2'"=="version" { + di in ye "`lversion'" + return local version `lversion' + exit + } + else { +di as err "invalid syntax" + exit 198 + } + } + +* If varlist 1 or varlist 2 have a single element, parentheses optional + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local y `s(varlist)' + local K : word count `y' + local 0 `"`s(rest)'"' + sret clear + } + else { + local y `1' + local K 1 + mac shift 1 + local 0 `"`*'"' + } + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local z `s(varlist)' + local L : word count `z' + local 0 `"`s(rest)'"' + sret clear + } + else { + local z `1' + local K 1 + mac shift 1 +* Need to reinsert comma before options (if any) for -syntax- command to work + local 0 `", `*'"' + } + +* Option version ignored here if varlists were provided + syntax [if] [in] [aw fw pw iw/] [, partial(varlist ts) fwl(varlist ts) /* + */ NOConstant wald ALLrank NULLrank FULLrank ROBust cluster(varlist) /* + */ BW(string) kernel(string) Tvar(varname) Ivar(varname) sw psd version /* + */ dofminus(integer 0) ] + + local partial "`partial' `fwl'" + + if "`noconstant'"=="" { + tempvar one + gen byte `one' = 1 + local partial "`partial' `one'" + } + + if "`wald'"~="" { + local LMWald "Wald" + } + else { + local LMWald "LM" + } + + local optct : word count `allrank' `nullrank' `fullrank' + if `optct' > 1 { +di as err "Incompatible options: `allrank' `nullrank' `fullrank'" + error 198 + } + else if `optct' == 0 { +* Default + local allrank "allrank" + } + +* Note that by tsrevar-ing here, subsequent disruption to the sort doesn't matter +* for TS operators. + tsrevar `y' + local vl1 `r(varlist)' + tsrevar `z' + local vl2 `r(varlist)' + tsrevar `partial' + local partial `r(varlist)' + + foreach vn of varlist `vl1' { + tempvar tv + qui gen double `tv' = . + local tempvl1 "`tempvl1' `tv'" + } + foreach vn of varlist `vl2' { + tempvar tv + qui gen double `tv' = . + local tempvl2 "`tempvl2' `tv'" + } + + marksample touse + markout `touse' `vl1' `vl2' `partial' `cluster', strok + +* Stock-Watson and cluster imply robust. + if "`sw'`cluster'" ~= "" { + local robust "robust" + } + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + if "`fsqrt(wf)*(wvar^0.5):*'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "fweight" & "`sw'" != "" { + di in red "fweights currently not supported with -sw- option" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`bw'" !="" { + di in red "iweights not allowed with robust, cluster, AC or HAC" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + + +* Every time a weight is used, must multiply by scalar wf ("weight factor") +* wf=1 for no weights, fw and iw, wf = scalar that normalizes sum to be N if aw or pw + sum `wvar' if `touse' `wtexp', meanonly +* Weight statement + if "`weight'" ~= "" { +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + if "`weight'"=="" | "`weight'"=="fweight" | "`weight'"=="iweight" { +* If weight is "", weight var must be column of ones and N is number of rows. +* With fw and iw, effective number of observations is sum of weight variable. + local wf=1 + local N=r(sum_w) + } + else if "`weight'"=="aweight" | "`weight'"=="pweight" { +* With aw and pw, N is number of obs, unadjusted. + local wf=r(N)/r(sum_w) + local N=r(N) + } + else { +* Should never reach here +di as err "ivreg29_ranktest error - misspecified weights" + exit 198 + } + +* HAC estimation. +* If bw is omitted, default `bw' is empty string. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. + if "`bw'" == "" & "`kernel'" == "" { + local bw=0 + } + else { +* Need tvar for markout with time-series stuff +* Data must be tsset for time-series operators in code to work +* User-supplied tvar checked if consistent with tsset + capture tsset + if "`r(timevar)'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } +* If no panel data, ivar will still be empty + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already -tsset-" + exit 5 + } + local tdelta `r(tdelta)' + tsreport if `touse', panel + if `r(N_gaps)' != 0 { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + +* Check it's a valid kernel and replace with unabbreviated kernel name; check bw. +* Automatic kernel selection allowed by ivreg2 but not ranktest so must trap. +* s_ivreg29_vkernel is in livreg2 mlib. + if "`bw'"=="auto" { +di as err "invalid bandwidth in option bw() - must be real > 0" + exit 198 + } + mata: s_ivreg29_vkernel("`kernel'", "`bw'", "`ivar'") + local kernel `r(kernel)' + local bw = `r(bw)' + } + +* tdelta missing if version 9 or if not tsset + if "`tdelta'"=="" { + local tdelta=1 + } + + if "`sw'"~="" { + capture xtset + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already tsset or xtset" + exit 5 + } +* Exit with error if ivar is neither supplied nor tsset nor xtset + if "`ivar'"=="" { +di as err "Must -xtset- or -tsset- data or specify -ivar- with -sw- option" + exit 198 + } + qui describe, short varlist + local sortlist "`r(sortlist)'" + tokenize `sortlist' + if "`ivar'"~="`1'" { +di as err "Error - dataset must be sorted on panel var with -sw- option" + exit 198 + } + } + +* Create variable used for getting lags etc. in Mata + tempvar tindex + qui gen `tindex'=1 if `touse' + qui replace `tindex'=sum(`tindex') if `touse' + +********** CLUSTER SETUP ********************************************** + +* Mata code requires data are sorted on (1) the first var cluster if there +* is only one cluster var; (2) on the 3rd and then 1st if two-way clustering, +* unless (3) two-way clustering is combined with kernel option, in which case +* the data are tsset and sorted on panel id (first cluster variable) and time +* id (second cluster variable). +* Second cluster var is optional and requires an identifier numbered 1..N_clust2, +* unless combined with kernel option, in which case it's the time variable. +* Third cluster var is the intersection of 1 and 2, unless combined with kernel +* opt, in which case it's unnecessary. +* Sorting on "cluster3 cluster1" means that in Mata, panelsetup works for +* both, since cluster1 nests cluster3. +* Note that it is possible to cluster on time but not panel, in which case +* cluster1 is time, cluster2 is empty and data are sorted on panel-time. +* Note also that if no kernel-robust, sorting will disrupt any tsset-ing, +* but data are tsrevar-ed earlier to avoid any problems. + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`kernel'"~="" { +* kernel requires either that cluster1 is time var and cluster2 is empty +* or that cluster1 is panel var and cluster2 is time var. +* Either way, data must be tsset and sorted for panel data. + if "`cluster2'"~="" { +* Allow backwards order + if "`cluster1'"=="`tvar'" & "`cluster2'"=="`ivar'" { + local cluster1 "`2'" + local cluster2 "`1'" + } + if "`cluster1'"~="`ivar'" | "`cluster2'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset panel & time vars." +di as err " tsset panel var=`ivar'; tsset time var=`tvar'; cluster vars=`cluster1',`cluster2'" + exit 198 + } + } + else { + if "`cluster1'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset time variable." +di as err " tsset time var=`tvar'; cluster var=`cluster1'" + exit 198 + } + } + } +* Simple way to get quick count of 1st cluster variable without disrupting sort +* clusterid1 is numbered 1.._Nclust1. + tempvar clusterid1 + qui egen `clusterid1'=group(`cluster1') if `touse' + sum `clusterid1' if `touse', meanonly + if "`cluster2'"=="" { + local N_clust=r(max) + local N_clust1=. + local N_clust2=. + if "`kernel'"=="" { +* Single level of clustering and no kernel-robust, so sort on single cluster var. +* kernel-robust already sorted via tsset. + sort `cluster1' + } + } + else { + local N_clust1=r(max) + if "`kernel'"=="" { + tempvar clusterid2 clusterid3 +* New cluster id vars are numbered 1..N_clust2 and 1..N_clust3 + qui egen `clusterid2'=group(`cluster2') if `touse' + qui egen `clusterid3'=group(`cluster1' `cluster2') if `touse' +* Two levels of clustering and no kernel-robust, so sort on cluster3/nested in/cluster1 +* kernel-robust already sorted via tsset. + sort `clusterid3' `cluster1' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) + } + else { +* Need to create this only to count the number of clusters + tempvar clusterid2 + qui egen `clusterid2'=group(`cluster2') if `touse' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) +* Now replace with original variable + local clusterid2 `cluster2' + } + local N_clust=min(`N_clust1',`N_clust2') + } + } + +************************************************************************************************ + +* Note that bw is passed as a value, not as a string + mata: ivreg29_rkstat( "`vl1'", /* + */ "`vl2'", /* + */ "`partial'", /* + */ "`wvar'", /* + */ "`weight'", /* + */ `wf', /* + */ `N', /* + */ "`touse'", /* + */ "`LMWald'", /* + */ "`allrank'", /* + */ "`nullrank'", /* + */ "`fullrank'", /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`tvar'", /* + */ "`ivar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ `dofminus', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`tempvl1'", /* + */ "`tempvl2'") + + tempname rkmatrix chi2 df df_r p rank ccorr eval + mat `rkmatrix'=r(rkmatrix) + mat `ccorr'=r(ccorr) + mat `eval'=r(eval) + mat colnames `rkmatrix' = "rk" "df" "p" "rank" "eval" "ccorr" + +di +di "Kleibergen-Paap rk `LMWald' test of rank of matrix" + if "`robust'"~="" & "`kernel'"~= "" & "`cluster'"=="" { +di " Test statistic robust to heteroskedasticity and autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`kernel'"~="" & "`cluster'"=="" { +di " Test statistic robust to autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`cluster'"~="" { +di " Test statistic robust to heteroskedasticity and clustering on `cluster'" + if "`kernel'"~="" { +di " and kernel-robust to common correlated disturbances" +di " Kernel: `kernel' Bandwidth: `bw'" + } + } + else if "`robust'"~="" { +di " Test statistic robust to heteroskedasticity" + } + else if "`LMWald'"=="LM" { +di " Test assumes homoskedasticity (Anderson canonical correlations test)" + } + else { +di " Test assumes homoskedasticity (Cragg-Donald test)" + } + + local numtests = rowsof(`rkmatrix') + forvalues i=1(1)`numtests' { +di "Test of rank=" %3.0f `rkmatrix'[`i',4] " rk=" %8.2f `rkmatrix'[`i',1] /* + */ " Chi-sq(" %3.0f `rkmatrix'[`i',2] ") pvalue=" %8.6f `rkmatrix'[`i',3] + } + scalar `chi2' = `rkmatrix'[`numtests',1] + scalar `p' = `rkmatrix'[`numtests',3] + scalar `df' = `rkmatrix'[`numtests',2] + scalar `rank' = `rkmatrix'[`numtests',4] + local N `r(N)' + return scalar df = `df' + return scalar chi2 = `chi2' + return scalar p = `p' + return scalar rank = `rank' + if "`cluster'"~="" { + return scalar N_clust = `N_clust' + } + if "`cluster2'"~="" { + return scalar N_clust1 = `N_clust1' + return scalar N_clust2 = `N_clust2' + } + return scalar N = `N' + return matrix rkmatrix `rkmatrix' + return matrix ccorr `ccorr' + return matrix eval `eval' + + tempname S V Omega + if `K' > 1 { + foreach en of local y { +* Remove "." from equation name + local en1 : subinstr local en "." "_", all + foreach vn of local z { + local cn "`cn' `en1':`vn'" + } + } + } + else { + foreach vn of local z { + local cn "`cn' `vn'" + } + } + mat `V'=r(V) + matrix colnames `V' = `cn' + matrix rownames `V' = `cn' + return matrix V `V' + mat `S'=r(S) + matrix colnames `S' = `cn' + matrix rownames `S' = `cn' + return matrix S `S' +end + +* Adopted from -canon- +program define GetVarlist, sclass + sret clear + gettoken open 0 : 0, parse("(") + if `"`open'"' != "(" { + error 198 + } + gettoken next 0 : 0, parse(")") + while `"`next'"' != ")" { + if `"`next'"'=="" { + error 198 + } + local list `list'`next' + gettoken next 0 : 0, parse(")") + } + sret local rest `"`0'"' + tokenize `list' + local 0 `*' + sret local varlist "`0'" +end + + +******************************************************************************* +*************************** BEGIN MATA CODE *********************************** +******************************************************************************* + + + +version 9.2 +mata: + +void ivreg29_rkstat( string scalar vl1, + string scalar vl2, + string scalar partial, + string scalar wvarname, + string scalar weight, + scalar wf, + scalar N, + string scalar touse, + string scalar LMWald, + string scalar allrank, + string scalar nullrank, + string scalar fullrank, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + bw, + string scalar tvarname, + string scalar ivarname, + string scalar tindexname, + tdelta, + dofminus, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar tempvl1, + string scalar tempvl2) +{ + +// tempx, tempy and tempz are the Stata names of temporary variables that will be changed by rkstat + if (partial~="") { + tempx=tokens(partial) + } + tempy=tokens(tempvl1) + tempz=tokens(tempvl2) + + st_view(y=.,.,tokens(vl1),touse) + st_view(z=.,.,tokens(vl2),touse) + st_view(yhat=.,.,tempy,touse) + st_view(zhat=.,.,tempz,touse) + st_view(mtouse=.,.,tokens(touse),touse) + st_view(wvar=.,.,tokens(wvarname),touse) + noweight=(st_vartype(wvarname)=="byte") + +// Note that we now use wf*wvar instead of wvar +// because wvar is raw weighting variable and +// wf*wvar normalizes so that sum(wf*wvar)=N. + +// Partial out the X variables +// Note that this is entered if there is a constant, +// i.e., variables are centered + if (partial~="") { + st_view(x=.,.,tempx,touse) + xx = quadcross(x, wf*wvar, x) + xy = quadcross(x, wf*wvar, y) + xz = quadcross(x, wf*wvar, z) + + by = invsym(xx)*xy + bz = invsym(xx)*xz + + yhat[.,.] = y-x*by + zhat[.,.] = z-x*bz + } + else { + yhat[.,.] = y + zhat[.,.] = z + } + K=cols(y) + L=cols(z) + + zhzh = quadcross(zhat, wf*wvar, zhat) + zhyh = quadcross(zhat, wf*wvar, yhat) + yhyh = quadcross(yhat, wf*wvar, yhat) + + pihat = invsym(zhzh)*zhyh +// rzhat is F in paper (p. 103) +// iryhat is G in paper (p. 103) + ryhat=cholesky(yhyh) + rzhat=cholesky(zhzh) + iryhat=luinv(ryhat') + irzhat=luinv(rzhat') + that=rzhat'*pihat*iryhat + +// cc is canonical correlations. Squared cc is eigenvalues. + fullsvd(that, ut, cc, vt) + vt=vt' + vecth=vec(that) + ev = cc:^2 +// S matrix in paper (p. 100). Not used in code below. +// smat=fullsdiag(cc, rows(that)-cols(that)) + + if (abs(1-cc[1,1])<1e-10) { +printf("\n{text:Warning: collinearities detected between (varlist1) and (varlist2)}\n") + } + if ((missing(ryhat)>0) | (missing(iryhat)>0) | (missing(rzhat)>0) | (missing(irzhat)>0)) { +printf("\n{error:Error: non-positive-definite matrix. May be caused by collinearities.}\n") + exit(error(3351)) + } + +// If Wald, yhat is residuals + if (LMWald=="Wald") { + yhat[.,.]=yhat-zhat*pihat + yhyh = quadcross(yhat, wvar, yhat) + } + +// Covariance matrices +// vhat is W in paper (eqn below equation 17, p. 103) +// shat is V in paper (eqn below eqn 15, p. 103) + +// ************************************************************************************* // +// shat calculated using struct and programs m_ivreg29_omega, m_ivreg29_calckw shared with ivreg2 // + + struct ms_ivreg29_vcvorthog scalar vcvo + + + vcvo.ename = tempy // ivreg2 has = ename // + vcvo.Znames = tempz // ivreg2 has = Znames // + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = zhzh // ivreg2 has = st_matrix(ZZmatrix) // + + vcvo.e = &yhat // ivreg2 has = &e // + vcvo.Z = &zhat // ivreg2 has = &Z // + vcvo.wvar = &wvar + + shat=m_ivreg29_omega(vcvo) + +// *************************************************************************************** + +// Finally, calcluate vhat + if ((LMWald=="LM") & (kernel=="") & (robust=="") & (clustvarname=="")) { +// Homoskedastic, iid LM case means vcv is identity matrix +// Generates canonical correlation stats. Default. + vhat=I(L*K,L*K)/N + } + else { + vhat=(iryhat'#irzhat')*shat*(iryhat'#irzhat')' * N + _makesymmetric(vhat) + } + +// ready to start collecting test stats + if (allrank~="") { + firstrank=1 + lastrank=min((K,L)) + } + else if (nullrank~="") { + firstrank=1 + lastrank=1 + } + else if (fullrank~="") { + firstrank=min((K,L)) + lastrank=min((K,L)) + } + else { +// should never reach this point +printf("ivreg29_ranktest error\n") + exit + } + + rkmatrix=J(lastrank-firstrank+1,6,.) + for (i=firstrank; i<=lastrank; i++) { + + if (i>1) { + u12=ut[(1::i-1),(i..L)] + v12=vt[(1::i-1),(i..K)] + } + u22=ut[(i::L),(i..L)] + v22=vt[(i::K),(i..K)] + + symeigensystem(u22*u22', evec, eval) + u22v=evec + u22d=diag(eval) + u22h=u22v*(u22d:^0.5)*u22v' + + symeigensystem(v22*v22', evec, eval) + v22v=evec + v22d=diag(eval) + v22h=v22v*(v22d:^0.5)*v22v' + + if (i>1) { + aq=(u12 \ u22)*luinv(u22)*u22h + bq=v22h*luinv(v22')*(v12 \ v22)' + } + else { + aq=u22*luinv(u22)*u22h + bq=v22h*luinv(v22')*v22' + } + +// lab is lambda_q in paper (eqn below equation 21, p. 104) +// vlab is omega_q in paper (eqn 19 in paper, p. 104) + lab=(bq#aq')*vecth + vlab=(bq#aq')*vhat*(bq#aq')' + +// Symmetrize if numerical inaccuracy means it isn't + _makesymmetric(vlab) + vlabinv=invsym(vlab) +// rk stat Assumption 2: vlab (omega_q in paper) is nonsingular. Detected by a zero on the diagonal, +// since when returning a generalized inverse, Stata/Mata choose the generalized inverse that +// sets entire column(s)/row(s) to zeros. +// Save df and rank even if test stat not available. + df=(L-i+1)*(K-i+1) + rkmatrix[i-firstrank+1,2]=df + rkmatrix[i-firstrank+1,4]=i-1 + if (diag0cnt(vlabinv)>0) { +printf("\n{text:Warning: covariance matrix omega_%f}", i-1) +printf("{text: not full rank; test of rank %f}", i-1) +printf("{text: unavailable}\n") + } +// Note not multiplying by N - already incorporated in vhat. + else { + rk=lab'*vlabinv*lab + pvalue=chi2tail(df, rk) + rkmatrix[i-firstrank+1,1]=rk + rkmatrix[i-firstrank+1,3]=pvalue + } +// end of test loop + } + +// insert squared (=eigenvalues if canon corr) and unsquared canon correlations + for (i=firstrank; i<=lastrank; i++) { + rkmatrix[i-firstrank+1,6]=cc[i-firstrank+1,1] + rkmatrix[i-firstrank+1,5]=ev[i-firstrank+1,1] + } + st_matrix("r(rkmatrix)", rkmatrix) + st_matrix("r(ccorr)", cc') + st_matrix("r(eval)",ev') +// Save V matrix as in paper, without factor of 1/N + vhat=N*vhat*wf + st_matrix("r(V)", vhat) +// Save S matrix as in ivreg2, with factor of 1/N + st_matrix("r(S)", shat) + st_numscalar("r(N)", N) + if (clustvarname~="") { + st_numscalar("r(N_clust)", N_clust) + } + if (clustvarname2~="") { + st_numscalar("r(N_clust2)", N_clust2) + } +// end of program +} + + +end + +****************************************** END *************************************** +*********************************** ranktest.ado CODE ******************************** + +exit + +********************************** VERSION COMMENTS ********************************** +* Initial version cloned from official ivreg version 5.0.9 19Dec2001 +* 1.0.2: add logic for reg3. Sargan test +* 1.0.3: add prunelist to ensure that count of excluded exogeneous is correct +* 1.0.4: revise option to exog(), allow included exog to be specified as well +* 1.0.5: switch from reg3 to regress, many options and output changes +* 1.0.6: fixed treatment of nocons in Sargan and C-stat, and corrected problems +* relating to use of nocons combined with a constant as an IV +* 1.0.7: first option reports F-test of excluded exogenous; prunelist bug fix +* 1.0.8: dropped prunelist and switched to housekeeping of variable lists +* 1.0.9: added collinearity checks; C-stat calculated with recursive call; +* added ffirst option to report only F-test of excluded exogenous +* from 1st stage regressions +* 1.0.10: 1st stage regressions also report partial R2 of excluded exogenous +* 1.0.11: complete rewrite of collinearity approach - no longer uses calls to +* _rmcoll, does not track specific variables dropped; prunelist removed +* 1.0.12: reorganised display code and saved results to enable -replay()- +* 1.0.13: -robust- and -cluster- now imply -small- +* 1.0.14: fixed hascons bug; removed ivreg predict fn (it didn't work); allowed +* robust and cluster with z stats and correct dofs +* 1.0.15: implemented robust Sargan stat; changed to only F-stat, removed chi-sq; +* removed exog option (only orthog works) +* 1.0.16: added clusterised Sargan stat; robust Sargan handles collinearities; +* predict now works with standard SE options plus resids; fixed orthog() +* so it accepts time series operators etc. +* 1.0.17: fixed handling of weights. fw, aw, pw & iw all accepted. +* 1.0.18: fixed bug in robust Sargan code relating to time series variables. +* 1.0.19: fixed bugs in reporting ranks of X'X and Z'Z +* fixed bug in reporting presence of constant +* 1.0.20: added GMM option and replaced robust Sargan with (equivalent) J; +* added saved statistics of 1st stage regressions +* 1.0.21: added Cragg HOLS estimator, including allowing empty endog list; +* -regress- syntax now not allowed; revised code searching for "_cons" +* 1.0.22: modified cluster output message; fixed bug in replay for Sargan/Hansen stat; +* exactly identified Sargan/Hansen now exactly zero and p-value not saved as e(); +* cluster multiplier changed to 1 (from buggy multiplier), in keeping with +* eg Wooldridge 2002 p. 193. +* 1.0.23: fixed orthog option to prevent abort when restricted equation is underid. +* 1.0.24: fixed bug if 1st stage regressions yielded missing values for saving in e(). +* 1.0.25: Added Shea version of partial R2 +* 1.0.26: Replaced Shea algorithm with Godfrey algorithm +* 1.0.27: Main call to regress is OLS form if OLS or HOLS is specified; error variance +* in Sargan and C statistics use small-sample adjustment if -small- option is +* specified; dfn of S matrix now correctly divided by sample size +* 1.0.28: HAC covariance estimation implemented +* Symmetrize all matrices before calling syminv +* Added hack to catch F stats that ought to be missing but actually have a +* huge-but-not-missing value +* Fixed dof of F-stat - was using rank of ZZ, should have used rank of XX (couldn't use df_r +* because it isn't always saved. This is because saving df_r triggers small stats +* (t and F) even when -post- is called without dof() option, hence df_r saved only +* with -small- option and hence a separate saved macro Fdf2 is needed. +* Added rankS to saved macros +* Fixed trap for "no regressors specified" +* Added trap to catch gmm option with no excluded instruments +* Allow OLS syntax (no endog or excluded IVs specified) +* Fixed error messages and traps for rank-deficient robust cov matrix; includes +* singleton dummy possibility +* Capture error if posting estimated VCV that isn't pos def and report slightly +* more informative error message +* Checks 3 variable lists (endo, inexog, exexog) separately for collinearities +* Added AC (autocorrelation-consistent but conditionally-homoskedastic) option +* Sargan no longer has small-sample correction if -small- option +* robust, cluster, AC, HAC all passed on to first-stage F-stat +* bw must be < T +* 1.0.29 -orthog- also displays Hansen-Sargan of unrestricted equation +* Fixed collinearity check to include nocons as well as hascons +* Fixed small bug in Godfrey-Shea code - macros were global rather than local +* Fixed larger bug in Godfrey-Shea code - was using mixture of sigma-squares from IV and OLS +* with and without small-sample corrections +* Added liml and kclass +* 1.0.30 Changed order of insts macro to match saved matrices S and W +* 2.0.00 Collinearities no longer -qui- +* List of instruments tested in -orthog- option prettified +* 2.0.01 Fixed handling of nocons with no included exogenous, including LIML code +* 2.0.02 Allow C-test if unrestricted equation is just-identified. Implemented by +* saving Hansen-Sargan dof as = 0 in e() if just-identified. +* 2.0.03 Added score() option per latest revision to official ivreg +* 2.0.04 Changed score() option to pscore() per new official ivreg +* 2.0.05 Fixed est hold bug in first-stage regressions +* Fixed F-stat finite sample adjustment with cluster option to match official Stata +* Fixed F-stat so that it works with hascons (collinearity with constant is removed) +* Fixed bug in F-stat code - wasn't handling failed posting of vcv +* No longer allows/ignores nonsense options +* 2.0.06 Modified lsStop to sync with official ivreg 5.1.3 +* 2.0.07a Working version of CUE option +* Added sortpreserve, ivar and tvar options +* Fixed smalls bug in calculation of T for AC/HAC - wasn't using the last ob +* in QS kernel, and didn't take account of possible dropped observations +* 2.0.07b Fixed macro bug that truncated long varlists +* 2.0.07c Added dof option. +* Changed display of RMSE so that more digits are displayed (was %8.1g) +* Fixed small bug where cstat was local macro and should have been scalar +* Fixed bug where C stat failed with cluster. NB: wmatrix option and cluster are not compatible! +* 2.0.7d Fixed bug in dof option +* 2.1.0 Added first-stage identification, weak instruments, and redundancy stats +* 2.1.01 Tidying up cue option checks, reporting of cue in output header, etc. +* 2.1.02 Used Poskitt-Skeels (2002) result that C-D eval = cceval / (1-cceval) +* 2.1.03 Added saved lists of separate included and excluded exogenous IVs +* 2.1.04 Added Anderson-Rubin test of signif of endog regressors +* 2.1.05 Fix minor bugs relating to cluster and new first-stage stats +* 2.1.06 Fix bug in cue: capture estimates hold without corresponding capture on estimates unhold +* 2.1.07 Minor fix to ereturn local wexp, promote to version 8.2 +* 2.1.08 Added dofminus option, removed dof option. Added A-R test p-values to e(). +* Minor bug fix to A-R chi2 test - was N chi2, should have been N-L chi2. +* Changed output to remove potentially misleading refs to N-L etc. +* Bug fix to rhs count - sometimes regressors could have exact zero coeffs +* Bug fix related to cluster - if user omitted -robust-, orthog would use Sargan and not J +* Changed output of Shea R2 to make clearer that F and p-values do not refer to it +* Improved handling of collinearites to check across inexog, exexog and endo lists +* Total weight statement moved to follow summ command +* Added traps to catch errors if no room to save temporary estimations with _est hold +* Added -savefirst- option. Removed -hascons-, now synonymous with -nocons-. +* 2.1.09 Fixes to dof option with cluster so it no longer mimics incorrect areg behavior +* Local ivreg2_cmd to allow testing under name ivreg2 +* If wmatrix supplied, used (previously not used if non-robust sargan stat generated) +* Allowed OLS using (=) syntax (empty endo and exexog lists) +* Clarified error message when S matrix is not of full rank +* cdchi2p, ardf, ardf_r added to saved macros +* first and ffirst replay() options; DispFirst and DispFFirst separately codes 1st stage output +* Added savefprefix, macro with saved first-stage equation names. +* Added version option. +* Added check for duplicate variables to collinearity checks +* Rewrote/simplified Godfrey-Shea partial r2 code +* 2.1.10 Added NOOUTput option +* Fixed rf bug so that first does not trigger unnecessary saved rf +* Fixed cue bug - was not starting with robust 2-step gmm if robust/cluster +* 2.1.11 Dropped incorrect/misleading dofminus adjustments in first-stage output summary +* 2.1.12 Collinearity check now checks across inexog/exexog/endog simultaneously +* 2.1.13 Added check to catch failed first-stage regressions +* Fixed misleading failed C-stat message +* 2.1.14 Fixed mishandling of missing values in AC (non-robust) block +* 2.1.15 Fixed bug in RF - was ignoring weights +* Added -endog- option +* Save W matrix for all cases; ensured copy is posted with wmatrix option so original isn't zapped +* Fixed cue bug - with robust, was entering IV block and overwriting correct VCV +* 2.1.16 Added -fwl- option +* Saved S is now robust cov matrix of orthog conditions if robust, whereas W is possibly non-robust +* weighting matrix used by estmator. inv(S)=W if estimator is efficient GMM. +* Removed pscore option (dropped by official ivreg). +* Fixed bug where -post- would fail because of missing values in vcv +* Remove hascons as synonym for nocons +* OLS now outputs 2nd footer with variable lists +* 2.1.17 Reorganization of code +* Added ll() macro +* Fixed N bug where weights meant a non-integer ob count that was rounded down +* Fixed -fwl- option so it correctly handles weights (must include when partialling-out) +* smatrix option takes over from wmatrix option. Consistent treatment of both. +* Saved smatrix and wmatrix now differ in case of inefficient GMM. +* Added title() and subtitle() options. +* b0 option returns a value for the Sargan/J stat even if exactly id'd. +* (Useful for S-stat = value of GMM objective function.) +* HAC and AC now allowed with LIML and k-class. +* Collinearity improvements: bug fixed because collinearity was mistakenly checked across +* inexog/exexog/endog simultaneously; endog predicted exactly by IVs => reclassified as inexog; +* _rmcollright enforces inexog>endo>exexog priority for collinearities, if Stata 9.2 or later. +* K-class, LIML now report Sargan and J. C-stat based on Sargan/J. LIML reports AR if homosked. +* nb: can always easily get a C-stat for LIML based on diff of two AR stats. +* Always save Sargan-Hansen as e(j); also save as e(sargan) if homoskedastic. +* Added Stock-Watson robust SEs options sw() +* 2.1.18 Added Cragg-Donald-Stock-Yogo weak ID statistic critical values to main output +* Save exexog_ct, inexog_ct and endog_ct as macros +* Stock-Watson robust SEs now assume ivar is group variable +* Option -sw- is standard SW. Option -swpsd- is PSD version a la page 6 point 10. +* Added -noid- option. Suppresses all first-stage and identification statistics. +* Internal calls to ivreg2 use noid option. +* Added hyperlinks to ivreg2.hlp and helpfile argument to display routines to enable this. +* 2.1.19 Added matrix rearrangement and checks for smatrix and wmatrix options +* Recursive calls to cstat simplified - no matrix rearrangement or separate robust/nonrobust needed +* Reintroduced weak ID stats to ffirst output +* Added robust ID stats to ffirst output for case of single endogenous regressor +* Fixed obscure bug in reporting 1st stage partial r2 - would report zero if no included exogenous vars +* Removed "HOLS" in main output (misleading if, e.g., estimation is AC but not HAC) +* Removed "ML" in main output if no endogenous regressors - now all ML is labelled LIML +* model=gmm is now model=gmm2s; wmatrix estimation is model=gmm +* wmatrix relates to gmm estimator; smatrix relates to gmm var-cov matrix; b0 behavior equiv to wmatrix +* b0 option implies nooutput and noid options +* Added nocollin option to skip collinearity checks +* Fixed minor display bug in ffirst output for endog vars with varnames > 12 characters +* Fixed bug in saved rf and first-stage results for vars with long varnames; uses permname +* Fixed bug in model df - had counted RHS, now calculates rank(V) since latter may be rank-deficient +* Rank of V now saved as macro rankV +* fwl() now allows partialling-out of just constant with _cons +* Added Stock-Wright S statistic (but adds overhead - calls preserve) +* Properties now include svyj. +* Noted only: fwl bug doesn't allow time-series operators. +* 2.1.20 Fixed Stock-Wright S stat bug - didn't allow time-series operators +* 2.1.21 Fixed Stock-Wright S stat to allow for no exog regressors cases +* 2.2.00 CUE partials out exog regressors, estimates endog coeffs, then exog regressors separately - faster +* gmm2s becomes standard option, gmm supported as legacy option +* 2.2.01 Added explanatory messages if gmm2s used. +* States if estimates efficient for/stats consistent for het, AC, etc. +* Fixed small bug that prevented "{help `helpfile'##fwl:fwl}" from displaying when -capture-d. +* Error message in footer about insuff rank of S changed to warning message with more informative message. +* Fixed bug in CUE with weights. +* 2.2.02 Removed CUE partialling-out; still available with fwl +* smatrix and wmatrix become documented options. e(model)="gmmw" means GMM with arbitrary W +* 2.2.03 Fixed bug in AC with aweights; was weighting zi'zi but not ei'ei. +* 2.2.04 Added abw code for bw(), removed properties(svyj) +* 2.2.05 Fixed bug in AC; need to clear variable vt1 at start of loop +* If iweights, Nprec (#obs with precision) rounded to nearest integer to mimic official Stata treatment +* and therefore don't need Nprec scalar at all - will be same as N +* Saves fwl_ct as macro. +* -ffirst- output, weak id stat, etc. now adjust for number of partialled-out variables. +* Related changes: df_m, df_r include adjustments for partialled-out variables. +* Option nofwlsmall introduced - suppresses above adjustments. Undocumented in ivreg2.hlp. +* Replaced ID tests based on canon corr with Kleibergen-Paap rk-based stats if not homoskedastic +* Replaced LR ID test stats with LM test stats. +* Checks that -ranktest- is installed. +* 2.2.06 Fixed bug with missing F df when cue called; updated required version of ranktest +* 2.2.07 Modified redundancy test statistic to match standard regression-based LM tests +* Change name of -fwl- option to -partial-. +* Use of b0 means e(model)=CUE. Added informative b0 option titles. b0 generates output but noid. +* Removed check for integer bandwidth if auto option used. +* 2.2.08 Add -nocollin- to internal calls and to -ivreg2_cue- to speed performance. +* 2.2.09 Per msg from Brian Poi, Alastair Hall verifies that Newey-West cited constant of 1.1447 +* is correct. Corrected mata abw() function. Require -ranktest- 1.1.03. +* 2.2.10 Added Angrist-Pischke multivariate f stats. Rewrite of first and ffirst output. +* Added Cragg-Donald to weak ID output even when non-iid. +* Fixed small bug in non-robust HAC code whereby extra obs could be used even if dep var missing. +* (required addition of L`tau'.(`s1resid') in creation of second touse variable) +* Fixed bugs that zapped varnames with "_cons" in them +* Changed tvar and ivar setup so that data must be tsset or xtset; tvar and ivar can still be supplied +* but are only checked for consistency. +* Fixed bug in redundancy test stat when called by xtivreg2+cluster - no dofminus adj needed in this case +* Removed undocumented and unverified Stock-Watson option +* Bug in vecaccum meant that if there is only 1 observation it will crash with insufficient obs. +* Affected kernel-robust AC/HAC if there were gaps in the data. Fixed by replacing missings with zeros. +* Fixed bug in LIML with AC but not HAC that meant non-robust VCV was reported. +* Changed reporting so that gaps between panels are not reported as such. +* Changed Stock-Wright S statistic so that it uses straight partialling-out of exog regressors +* (had been, in effect, doing 2SGMM partialling-out) +* Fixed xtivreg2-related bug in AC (not HAC) where dofminus correction was not used in calc of sigmas. +* Fixed xtivreg2-related bug where IV weighting matrix didn't incorporate dofminus correction. +* Added check that weight variable is not transformed by partialling out. +* Fixed bug where dropped collinear endogenous didn't get a warning or listing +* Removed N*CDEV Wald chi-sq statistic from ffirst output (LM stat enough) +* Revised eigenvalue code of LIML with Mata version +* 2.2.11 -capture- instead of -qui- before reduced form to suppress not-full-rank error warning +* Repaired bug in Stock-Wright S stat so that it handles partialling-out consistently. +* 2.2.12 Disabled auto bandwidth selection with panel data +* 2.2.13 Fixed partial bug - partialcons macro saved =0 unless _cons explicitly in partial() varlist +* 2.2.14 Incorporated ranktest and Mata library code into ivreg29.ado - no longer needs separate installation. + +* Version notes for imported version of ranktest: +* 1.0.00 First distributed version +* 1.0.01 With iweights, rkstat truncates N to mimic official Stata treatment of noninteger iweights +* Added warning if shat/vhat/vlab not of full rank. +* 1.0.02 Added NULLrank option +* Added eq names to saved V and S matrices +* 1.0.03 Added error catching for collinearities between varlists +* Not saving S matrix; V matrix now as in paper (without 1/N factor) +* Statistic, p-value etc set to missing if vcv not of full rank (Assumpt 2 in paper fails) +* 1.0.04 Fixed touse bug - was treating missings as touse-able +* Change some cross-products in robust loops to quadcross +* 1.0.05 Fixed bug with col/row names and ts operators. Added eval to saved matrices. +* 1.1.00 First ssc-ideas version. Added version 9.2 prior to Mata compiled section. +* 1.1.01 Allow non-integer bandwidth +* 1.1.02 Changed calc of yhat, zhat and pihat to avoid needlessly large intermediate matrices +* and to use more accurate qrsolve instead of inverted X'X. +* 1.1.03 Fixed touse bug that didn't catch missing cluster variable +* Fixed cluster bug - data needed to be sorted by cluster for Mata panel functions to work properly +* 1.2.00 Changed reporting so that gaps between panels are not reported as such. +* Added support for tdelta in tsset data. +* Changed tvar and ivar setup so that data must be tsset or xtset. +* Removed unnecessary loops through panel data with spectral kernels +* shat vcv now also saved. +* Added support for Thompson/Cameron-Gelbach-Miller 2-level cluster-robust vcvv +* Added support for Stock-Watson vcv - but requires data to have FEs partialled out, & doesn't support fweights +* Removed mimicking of Stata mistake of truncated N with iweights to nearest integer +* Fixed small bug with quadratic kernel (wasn't using negative weights) +* Optimised code dealing with time-series data +* 1.2.01 Fixed bug that always used Stock-Watson spectral decomp to create invertible shat +* instead of only when (undocumented) spsd option is called. +* 1.2.02 Fixed bug that did not allow string cluster variables +* 1.2.03 Fixed bug in code for cluster+kernel robust (typo in imported code from ivreg2=>crash) +* 1.2.04 Replaced code for S with ivreg2 code modified to support e matrix (cols > 1) +* Code block (m_omega, m_calckw, struct definition) now shared by ranktest and ivreg2. +* Renamed spsd option to psd following ivreg2 3.0.07 +* Added wf ("weight factor") and statement about sum of weights, as in ivreg2 +* Added dofminus option, as in ivreg2 +* Fixed minor reporting bug - was reporting gaps in entire panel, not just touse-d portion +* Recoded kernel & bw checks to use shared ivreg2 subroutine vkernel +* 1.2.05 Fixed weighting bug introduced in 1.2.04. All weights were affected. +* Was result of incompatibility of code shared with ivreg2. +* 1.3.01 First ranktest version with accompanying Mata library (shared with -ivreg2-). +* Mata library includes struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Fixed bug in 2-way cluster code (now in m_omega in Mata library) - would crash if K>1. +* 1.3.02 Improved partialling out and matrix inversion - switched from qrsolve to invsym. +* Use _makesymmetric() instead of symmetrizing by hand. +* 1.3.03 01Jan14. Fixed reporting bug with 2-way clustering and kernel-robust that would give +* wrong count for 2nd cluster variable. +* 1.3.04 24Aug14. Fixed bug in markout - would include obs where some vars were missing + +* Version notes for imported version of Mata library +* 1.1.01 First version of library. +* Contains struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Compiled in Stata 9.2 for compatibility with ranktest 1.3.01 (a 9.2 program). +* 1.1.02 Add routine cdsy. Standardized spelling/caps/etc. of QS as "Quadratic Spectral" +* 1.1.03 Corrected spelling of "Danielle" kernel in m_omega() +* 1.1.04 Fixed weighting bugs in robust and cluster code of m_omega where K>1 +* 1.1.05 Added whichlivreg2(.) to aid in version control +* 1.1.06 Fixed remaining weighting bug (see 1.1.04) in 2-way clustering when interection +* of clustering levels is groups +* 1.1.07 Fixed HAC bug that crashed m_omega(.) when there were no obs for a particular lag diff --git a/ado/i/ivreg29.hlp b/ado/i/ivreg29.hlp new file mode 100644 index 0000000..426120d --- /dev/null +++ b/ado/i/ivreg29.hlp @@ -0,0 +1,1508 @@ +{smcl} +{* 2Jan2010}{...} +{hline} +help for {hi:ivreg29} +{hline} + +{title:Extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression} + +{p 4}Full syntax + +{p 8 14}{cmd:ivreg29} {it:depvar} [{it:varlist1}] +{cmd:(}{it:varlist2}{cmd:=}{it:varlist_iv}{cmd:)} [{it:weight}] +[{cmd:if} {it:exp}] [{cmd:in} {it:range}] +{bind:[{cmd:,} {cmd:gmm2s}} +{cmd:bw(}{it:#}{cmd:)} +{cmd:kernel(}{it:string}{cmd:)} +{cmd:liml} +{cmd:fuller(}{it:#}{cmd:)} +{cmd:kclass(}{it:#}{cmd:)} +{cmd:coviv} +{cmd:cue} +{cmd:cueinit}{cmd:(}{it:matrix}{cmd:)} +{cmdab:cueopt:ions}{cmd:(}{it:string}{cmd:)} +{cmd:b0}{cmd:(}{it:matrix}{cmd:)} +{cmdab:r:obust} +{cmdab:cl:uster}{cmd:(}{it:varname}{cmd:)} +{cmd:orthog(}{it:varlist_ex}{cmd:)} +{cmd:endog(}{it:varlist_en}{cmd:)} +{cmdab:red:undant(}{it:varlist_ex}{cmd:)} +{cmd:partial(}{it:varlist}{cmd:)} +{cmdab:sm:all} +{cmdab:noc:onstant} {cmdab:h}ascons +{cmd:smatrix}{cmd:(}{it:matrix}{cmd:)} +{cmd:wmatrix}{cmd:(}{it:matrix}{cmd:)} +{cmd:first} {cmd:ffirst} {cmd:savefirst} {cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:rf} {cmd:saverf} {cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:nocollin} {cmd:noid} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{bind:{cmd:plus} ]} + +{p 4}Replay syntax + +{p 8 14}{cmd:ivreg29} +{bind:[{cmd:,} {cmd:first}} +{cmd:ffirst} {cmd:rf} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{cmd:plus} ]} + +{p 4}Version syntax + +{p 8 14}{cmd:ivreg29}, {cmd:version} + +{p}{cmd:ivreg29} is a version of {cmd:ivreg2} compatible with Stata version 9.2 or later. +{cmd:ivreg29} is not under active development. +See the online description of {view "http://fmwww.bc.edu/RePEc/bocode/i/ivreg2.hlp" :ivreg2} +for details. + +{p}{cmd:ivreg29} may be used with time-series or panel data, +in which case the data must be {cmd:tsset} +before using {cmd:ivreg29}; see help {help tsset}. + +{p}All {it:varlists} may contain time-series operators; +see help {help varlist}. + +{p}{cmd:by}, {cmd:rolling}, {cmd:statsby}, {cmd:xi}, +{cmd:bootstrap} and {cmd:jackknife} are allowed; see help {help prefix}. + +{p}{cmd:aweight}s, {cmd:fweight}s, {cmd:iweight}s and {cmd:pweight}s +are allowed; see help {help weights}. + +{p}The syntax of {help predict} following {cmd:ivreg29} is + +{p 8 16}{cmd:predict} [{it:type}] {it:newvarname} [{cmd:if} {it:exp}] +[{cmd:in} {it:range}] [{cmd:,} {it:statistic}] + +{p}where {it:statistic} is + +{p 8 23}{cmd:xb}{space 11}fitted values; the default{p_end} +{p 8 23}{cmdab:r:esiduals}{space 4}residuals{p_end} +{p 8 23}{cmd:stdp}{space 9}standard error of the prediction{p_end} + +{p}These statistics are available both in and out of sample; +type "{cmd:predict} {it:...} {cmd:if e(sample)} {it:...}" +if wanted only for the estimation sample. + +{title:Contents} +{p 2}{help ivreg29##s_description:Description}{p_end} +{p 2}{help ivreg29##s_robust:Calculation of robust, cluster-robust, AC, HAC standard errors}{p_end} +{p 2}{help ivreg29##s_gmm:GMM estimation}{p_end} +{p 2}{help ivreg29##s_liml:LIML, k-class and GMM-CUE estimation}{p_end} +{p 2}{help ivreg29##s_sumopt:Summary of robust, HAC, AC, GMM, LIML and CUE options}{p_end} +{p 2}{help ivreg29##s_overid:Testing overidentifying restrictions}{p_end} +{p 2}{help ivreg29##s_endog:Testing subsets of regressors and instruments for endogeneity}{p_end} +{p 2}{help ivreg29##s_relevance:Tests of under- and weak identification}{p_end} +{p 2}{help ivreg29##s_redundancy:Testing instrument redundancy}{p_end} +{p 2}{help ivreg29##s_first:First-stage regressions, identification, and weak-id-robust inference}{p_end} +{p 2}{help ivreg29##s_rf:Reduced form estimates}{p_end} +{p 2}{help ivreg29##s_partial:Partialling-out exogenous regressors}{p_end} +{p 2}{help ivreg29##s_ols:OLS and Heteroskedastic OLS (HOLS) estimation}{p_end} +{p 2}{help ivreg29##s_collin:Collinearities}{p_end} +{p 2}{help ivreg29##s_speed:Speed options: nocollin and noid}{p_end} +{p 2}{help ivreg29##s_small:Small sample corrections}{p_end} +{p 2}{help ivreg29##s_options:Options summary}{p_end} +{p 2}{help ivreg29##s_macros:Remarks and saved results}{p_end} +{p 2}{help ivreg29##s_examples:Examples}{p_end} +{p 2}{help ivreg29##s_refs:References}{p_end} +{p 2}{help ivreg29##s_acknow:Acknowledgements}{p_end} +{p 2}{help ivreg29##s_citation:Authors}{p_end} +{p 2}{help ivreg29##s_citation:Citation of ivreg29}{p_end} + +{marker s_description}{title:Description} + +{p}{cmd:ivreg29} implements a range of single-equation estimation methods +for the linear regression model: OLS, instrumental +variables (IV, also known as two-stage least squares, 2SLS), +the generalized method of moments (GMM), +limited-information maximum likelihood (LIML), and k-class estimators. +In the language of IV/GMM, {it:varlist1} are the exogenous +regressors or "included instruments", +{it:varlist_iv} are the exogenous variables excluded +from the regression or "excluded instruments", +and {it:varlist2} the endogenous regressors that are being "instrumented". + +{p}{cmd:ivreg29} will also estimate linear regression models using +robust (heteroskedastic-consistent), +autocorrelation-consistent (AC), +heteroskedastic and autocorrelation-consistent (HAC) +and cluster-robust variance estimates. + +{p}{cmd:ivreg29} provides extensions to Stata's official {cmd:ivreg} +and {cmd:newey}. +{cmd:ivreg29} supports the same command syntax as official {cmd:ivreg} +and (almost) all of its options. +The main extensions available are as follows: +two-step feasible GMM estimation ({cmd:gmm2s} option) +and continuously-updated GMM estimation ({cmd:cue} option); +LIML and k-class estimation; +automatic output of overidentification and underidentification test statistics; +C statistic test of exogeneity of subsets of instruments +({cmd:orthog()} option); +endogeneity tests of endogenous regressors +({cmd:endog()} option); +test of instrument redundancy +({cmd:redundant()} option); +kernel-based autocorrelation-consistent (AC) +and heteroskedastic and autocorrelation consistent (HAC) standard errors +and covariance estimation ({cmd:bw(}{it:#}{cmd:)} option), +with user-specified choice of kernel ({cmd:kernel()} option); +default reporting of large-sample statistics +(z and chi-squared rather than t and F); +{cmd:small} option to report small-sample statistics; +first-stage regressions reported with various tests and statistics for +identification and instrument relevance; +{cmd:ffirst} option to report only these identification statistics +and not the first-stage regression results themselves; +{cmd:nofooter} option to suppress footer of regression output. +{cmd:ivreg29} can also be used for ordinary least squares (OLS) estimation +using the same command syntax as official {cmd:regress} and {cmd:newey}. + +{marker s_robust}{dlgtab:Calculation of robust, cluster-robust, AC, HAC standard errors} + +{p}The standard errors reported by {cmd:ivreg29} can be made consistent +in the presence of a variety of violations of the assumption of i.i.d. errors: +{bind:(1) {cmd:robust}} causes {cmd:ivreg29} to report standard errors that are +robust to the presence of arbitrary heteroskedasticity; +{bind:(2) {cmd:cluster}} standard errors are robust to both +arbitrary heteroskedasticity and arbitrary intra-group correlation; +{bind:(3) {cmd:bw(}{it:#}{cmd:)}} requests AC standard errors that are +robust to arbitrary autocorrelation; +{bind:(4) {cmd:bw(}{it:#}{cmd:)}} combined with {cmd:robust} +requests HAC standard errors that are +robust to both arbitrary heteroskedasticity and arbitrary autocorrelation. + +{p}{cmd:ivreg29} allows a variety of options for kernel-based HAC and AC estimation. +The {cmd:bw(}{it:#}{cmd:)} option sets the bandwidth used in the estimation +and {cmd:kernel(}{it:string}{cmd:)} is the kernel used; +the default kernel is the Bartlett kernel, +also known in econometrics as Newey-West (see help {help newey}). When +using the Bartlett, Parzen, or Quadratic spectral kernels, the automatic +bandwidth selection procedure of Newey and West (1994) can be chosen +by specifying {cmd:bw(}{it:auto}{cmd:)}. +{cmd:ivreg29} can also be used for kernel-based estimation +with panel data, i.e., a cross-section of time series. +Before using {cmd:ivreg29} for kernel-based estimation +of time series or panel data, +the data must be {cmd:tsset}; see help {help tsset}. + +{marker s_gmm}{dlgtab:GMM estimation} + +{p}When combined with the above options, the {cmd:gmm2s} option generates +efficient estimates of the coefficients as well as consistent +estimates of the standard errors. +The {cmd:gmm2s} option implements the two-step efficient +generalized method of moments (GMM) estimator. +The efficient GMM estimator minimizes the GMM criterion function +J=N*g'*W*g, where N is the sample size, +g are the orthogonality or moment conditions +(specifying that all the exogenous variables, or instruments, +in the equation are uncorrelated with the error term) +and W is a weighting matrix. +In two-step efficient GMM, the efficient or optimal weighting matrix +is the inverse of an estimate of the covariance matrix of orthogonality conditions. +The efficiency gains of this estimator relative to the +traditional IV/2SLS estimator derive from the use of the optimal +weighting matrix, the overidentifying restrictions of the model, +and the relaxation of the i.i.d. assumption. +For an exactly-identified model, +the efficient GMM and traditional IV/2SLS estimators coincide, +and under the assumptions of conditional homoskedasticity and independence, +the efficient GMM estimator is the traditional IV/2SLS estimator. +For further details, see Hayashi (2000), pp. 206-13 and 226-27. + +{p}The {cmd:wmatrix} option allows the user to specify a weighting matrix +rather than computing the optimal weighting matrix. +Estimation with the {cmd:wmatrix} option yields a possibly inefficient GMM estimator. +{cmd:ivreg29} will use this inefficient estimator as the first-step GMM estimator +in two-step efficient GMM when combined with the {cmd:gmm2s} option; +otherwise, {cmd:ivreg29} reports the regression results +using this inefficient GMM estimator. + +{p}The {cmd:smatrix} option allows the user to directly +specify the matrix S, the covariance matrix of orthogonality conditions. +{cmd:ivreg29} will use this matrix in the calculation of the variance-covariance +matrix of the estimator, the J statistic, +and, if the {cmd:gmm2s} option is specified, +the two-step efficient GMM coefficients. +The {cmd:smatrix} can be useful for guaranteeing a positive test statistic +in user-specified "GMM-distance tests" (see {help ivreg29##s_endog:below}). +For further details, see Hayashi (2000), pp. 220-24. + +{marker s_liml}{dlgtab:LIML, k-class and GMM-CUE estimation} + +{marker liml}{p} Maximum-likelihood estimation of a single equation of this form +(endogenous RHS variables and excluded instruments) +is known as limited-information maximum likelihood or LIML. +The overidentifying restrictions test +reported after LIML estimation is the Anderson-Rubin (1950) overidentification +statistic in a homoskedastic context. +LIML, OLS and IV/2SLS are examples of k-class estimators. +LIML is a k-class estimator with k=the LIML eigenvalue lambda; +2SLS is a k-class estimator with k=1; +OLS is a k-class esimator with k=0. +Estimators based on other values of k have been proposed. +Fuller's modified LIML (available with the {cmd:fuller(}{it:#}{cmd:)} option) +sets k = lambda - alpha/(N-L), where lambda is the LIML eigenvalue, +L = number of instruments (L1 excluded and L2 included), +and the Fuller parameter alpha is a user-specified positive constant. +Nagar's bias-adjusted 2SLS estimator can be obtained with the +{cmd:kclass(}{it:#}{cmd:)} option by setting +k = 1 + (L-K)/N, where L-K = number of overidentifying restrictions, +K = number of regressors (K1 endogenous and K2=L2 exogenous) +and N = the sample size. +For a discussion of LIML and k-class estimators, +see Davidson and MacKinnon (1993, pp. 644-51). + +{p} The GMM generalization of the LIML estimator +to the case of possibly heteroskedastic +and autocorrelated disturbances +is the "continuously-updated" GMM estimator or CUE +of Hansen, Heaton and Yaron (1996). +The CUE estimator directly maximizes the GMM objective function +J=N*g'*W(b_cue)*g, where W(b_cue) is an optimal weighting matrix +that depends on the estimated coefficients b_cue. +{cmd:cue} combined with {cmd:robust}, {cmd:cluster}, and/or {cmd:bw}, +generates coefficient estimates that are efficient in the presence +of the corresponding deviations from homoskedasticity. +Specifying {cmd:cue} with no other options +is equivalent to the combination of the options {cmd:liml} and {cmd:coviv}. +The CUE estimator requires numerical optimization methods, +and the implementation here uses Stata's {cmd:ml} routine. +The starting values are either IV or two-step efficient GMM +coefficient estimates; +these can be overridden with the {cmd:cueinit} option, +which takes the matrix of starting values b as its argument. +{cmd:cueoptions} passes options to Stata's {cmd:ml}; see help {help ml}. +Estimation with the {cmd:cue} option can be slow and problematic, +and it should be used with caution. +If the user wants to evaluate the CUE objective function at +an arbitrary user-defined coefficient vector instead of having {cmd:ivreg29} +find the coefficient vector that minimizes the objective function, +the {cmd:b0(}{it:matrix}{cmd:)} option can be used. +The value of the CUE objective function at {cmd:b0} +is the Sargan or Hansen J statistic reported in the output. + +{marker s_sumopt}{dlgtab:Summary of robust, HAC, AC, GMM, LIML and CUE options} + + +{col 45}VCE option +Estimator + option{col 20}(none) {col 65}{cmd:robust}, {cmd:cluster}, {cmd:bw}, {cmd:kernel} +{hline} +(none){col 20}IV/2SLS{col 65}IV/2SLS with +{col 20}SEs consistent under homoskedasticity{col 65}robust SEs + +{cmd:liml}{col 20}LIML{col 65}LIML with +{col 20}SEs consistent under homoskedasticity{col 65}robust SEs + +{cmd:gmm2s}{col 20}IV/2SLS{col 65}Two-step GMM with +{col 20}SEs consistent under homoskedasticity{col 65}robust SEs + +{cmd:cue}{col 20}LIML{col 65}CUE GMM with +{col 20}SEs consistent under homoskedasticity{col 65}robust SEs + +{cmd:kclass}{col 20}k-class estimator{col 65}k-class estimator with +{col 20}SEs consistent under homoskedasticity{col 65}robust SEs + +{cmd:wmatrix}{col 20}Possibly inefficient GMM{col 65}Ineff GMM with +{col 20}SEs consistent under homoskedasticity{col 65}robust SEs + +{cmd:gmm2s} + {col 20}Two-step GMM{col 65}two-step GMM with +{cmd:wmatrix}{col 20}with user-specified first step{col 65}robust SEs +{col 20}SEs consistent under homoskedasticity + + +{p}With the {cmd:bw} or {cmd:bw} and {cmd:kernel} VCE options, +SEs are autocorrelation-robust (AC). +Combining the {cmd:robust} option with {cmd:bw}, SEs are heteroskedasticity- and +autocorrelation-robust (HAC). + +{p}For further details, see Hayashi (2000), pp. 206-13 and 226-27 +(on GMM estimation), Wooldridge (2002), p. 193 (on cluster-robust GMM), +and Hayashi (2000), pp. 406-10 or Cushing and McGarvey (1999) +(on kernel-based covariance estimation). + +{marker s_overid}{marker overidtests}{dlgtab:Testing overidentifying restrictions} + +{p}The Sargan-Hansen test is a test of overidentifying restrictions. +The joint null hypothesis is that the instruments are valid +instruments, i.e., uncorrelated with the error term, +and that the excluded instruments are correctly excluded from the estimated equation. +Under the null, the test statistic is distributed as chi-squared +in the number of (L-K) overidentifying restrictions. +A rejection casts doubt on the validity of the instruments. +For the efficient GMM estimator, the test statistic is +Hansen's J statistic, the minimized value of the GMM criterion function. +For the 2SLS estimator, the test statistic is Sargan's statistic, +typically calculated as N*R-squared from a regression of the IV residuals +on the full set of instruments. +Under the assumption of conditional homoskedasticity, +Hansen's J statistic becomes Sargan's statistic. +The J statistic is consistent in the presence of heteroskedasticity +and (for HAC-consistent estimation) autocorrelation; +Sargan's statistic is consistent if the disturbance is homoskedastic +and (for AC-consistent estimation) if it is also autocorrelated. +With {cmd:robust}, {cmd:bw} and/or {cmd:cluster}, +Hansen's J statistic is reported. +In the latter case the statistic allows observations +to be correlated within groups. +For further discussion see e.g. Hayashi (2000, pp. 227-8, 407, 417). + +{p}The Sargan statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg29} by the command {cmd:overid}. +The features of {cmd:ivreg29} that are unavailable in {cmd:overid} +are the J statistic and the C statistic; +the {cmd:overid} options unavailable in {cmd:ivreg29} +are various small-sample and pseudo-F versions of Sargan's statistic +and its close relative, Basmann's statistic. +See help {help overid} (if installed). + +{marker s_endog}{dlgtab:Testing subsets of regressors and instruments for endogeneity} + +{marker ctest}{p}The C statistic +(also known as a "GMM distance" +or "difference-in-Sargan" statistic) +implemented using the {cmd:orthog} option, +allows a test of a subset of the orthogonality conditions, i.e., +it is a test of the exogeneity of one or more instruments. +It is defined as +the difference of the Sargan-Hansen statistic +of the equation with the smaller set of instruments +(valid under both the null and alternative hypotheses) +and the equation with the full set of instruments, +i.e., including the instruments whose validity is suspect. +Under the null hypothesis that +both the smaller set of instruments +and the additional, suspect instruments are valid, +the C statistic is distributed as chi-squared +in the number of instruments tested. +Note that failure to reject the null hypothesis +requires that the full set of orthogonality conditions be valid; +the C statistic and the Sargan-Hansen test statistics +for the equations with both the smaller and full set of instruments +should all be small. +The instruments tested may be either excluded or included exogenous variables. +If excluded exogenous variables are being tested, +the equation that does not use these orthogonality conditions +omits the suspect instruments from the excluded instruments. +If included exogenous variables are being tested, +the equation that does not use these orthogonality conditions +treats the suspect instruments as included endogenous variables. +To guarantee that the C statistic is non-negative in finite samples, +the estimated covariance matrix of the full set orthogonality conditions +is used to calculate both Sargan-Hansen statistics +(in the case of simple IV/2SLS, this amounts to using the MSE +from the unrestricted equation to calculate both Sargan statistics). +If estimation is by LIML, the C statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For further discussion, see Hayashi (2000), pp. 218-22 and pp. 232-34. + +{marker endogtest}{p}Endogeneity tests of one or more endogenous regressors +can implemented using the {cmd:endog} option. +Under the null hypothesis that the specified endogenous regressors +can actually be treated as exogenous, the test statistic is distributed +as chi-squared with degrees of freedom equal to the number of regressors tested. +The endogeneity test implemented by {cmd:ivreg29}, is, like the C statistic, +defined as the difference of two Sargan-Hansen statistics: +one for the equation with the smaller set of instruments, +where the suspect regressor(s) are treated as endogenous, +and one for the equation with the larger set of instruments, +where the suspect regressors are treated as exogenous. +Also like the C statistic, the estimated covariance matrix used +guarantees a non-negative test statistic. +Under conditional homoskedasticity, +this endogeneity test statistic is numerically equal to +a Hausman test statistic; see Hayashi (2000, pp. 233-34). +The endogeneity test statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg29} by the command {cmd:ivendog}. +Unlike the Durbin-Wu-Hausman tests reported by {cmd:ivendog}, +the {cmd:endog} option of {cmd:ivreg29} can report test statistics +that are robust to various violations of conditional homoskedasticity; +the {cmd:ivendog} option unavailable in {cmd:ivreg29} +is the Wu-Hausman F-test version of the endogeneity test. +See help {help ivendog} (if installed). + +{marker s_relevance}{dlgtab:Tests of under- and weak identification} + +{marker idtest}{p}{cmd:ivreg29} automatically reports tests of +both underidentification and weak identification. +The underidentification test is an LM test of whether the equation is identified, +i.e., that the excluded instruments are "relevant", +meaning correlated with the endogenous regressors. +The test is essentially the test of the rank of a matrix: +under the null hypothesis that the equation is underidentified, +the matrix of reduced form coefficients on the L1 excluded instruments +has rank=K1-1 where K1=number of endogenous regressors. +Under the null, +the statistic is distributed as chi-squared +with degrees of freedom=(L1-K1+1). +A rejection of the null indicates that the matrix is full column rank, +i.e., the model is identified. +When errors are assumed to be i.i.d., +{cmd:ivreg29} automatically reports an LM version of +the Anderson (1951) canonical correlations test. +Denoting the minimum eigenvalue of the canonical correlations as CCEV, +the smallest canonical correlation between the K1 endogenous regressors +and the L1 excluded instruments +(after partialling out the K2=L2 exogenous regressors) +is sqrt(CCEV), +and the Anderson LM test statistic is N*CCEV, +i.e., N times the square of the smallest canonical correlation. +With the {cmd:first} or {cmd:ffirst} options, +{cmd:ivreg29} also reports the closely-related +Cragg-Donald (1993) Wald test statistic. +Again assuming i.i.d. errors, +and denoting the minimum eigenvalue of the Cragg-Donald statistic as CDEV, +CDEV=CCEV/(1-CCEV), +and the Cragg-Donald Wald statistic is N*CDEV. +Like the Anderson LM statistic, the Cragg-Donald Wald statistic +is distributed as chi-squred with (L1-K1+1) degrees of freedom. +Note that a result of rejection of the null +should be treated with caution, +because weak instrument problems may still be present. +See Hall et al. (1996) for a discussion of this test, +and below for discussion of testing for the presence of weak instruments. + +{p}When the i.i.d. assumption is dropped +and {cmd:ivreg29} reports heteroskedastic, AC, HAC +or cluster robust statistics, +the Anderson LM and Cragg-Donald Wald statistics are no longer valid. +In these cases, {cmd:ivreg29} reports the LM and Wald versions +of the Kleibergen-Paap (2006) rk statistic, +also distributed as chi-squared with (L1-K1+1) degrees of freedom. +The rk statistic can be seen as a generalization of these tests +to the case of non-i.i.d. errors; +see Kleibergen and Paap (2006) for discussion, +and Kleibergen and Schaffer (2007) for a Stata implementation, {cmd:ranktest}. +{cmd:ivreg29} requires {cmd:ranktest} to be installed, +and will prompt the user to install it if necessary. +If {cmd:ivreg29} is invoked with the {cmd:robust} option, +the rk underidentification test statistics will be heteroskedastic-robust, +and similarly with {cmd:bw} and {cmd:cluster}. + +{marker widtest}{p}"Weak identification" arises when the excluded instruments are correlated +with the endogeous regressors, but only weakly. +Estimators can perform poorly when instruments are weak, +and different estimators are more robust to weak instruments (e.g., LIML) +than others (e.g., IV); +see, e.g., Stock and Yogo (2002, 2005) for further discussion. +When errors are assumed to be i.i.d., +the test for weak identification automatically reported +by {cmd:ivreg29} is an F version of the Cragg-Donald Wald statistic, (N-L)/L1*CDEV, +where L is the number of instruments and L1 is the number of excluded instruments. +Stock and Yogo (2005) have compiled critical values +for the Cragg-Donald F statistic for +several different estimators (IV, LIML, Fuller-LIML), +several different definitions of "perform poorly" (based on bias and test size), +and a range of configurations (up to 100 excluded instruments +and up to 2 or 3 endogenous regressors, +depending on the estimator). +{cmd:ivreg29} will report the Stock-Yogo critical values +if these are available; +missing values mean that the critical values +haven't been tabulated or aren't applicable. +See Stock and Yogo (2002, 2005) for details. + +{p}When the i.i.d. assumption is dropped +and {cmd:ivreg29} is invoked with the {cmd:robust}, {cmd:bw} or {cmd:cluster} options, +the Cragg-Donald-based weak instruments test is no longer valid. +{cmd:ivreg29} instead reports a correspondly-robust +Kleibergen-Paap Wald rk F statistic. +The degrees of freedom adjustment for the rk statistic is (N-L)/L1, +as with the Cragg-Donald F statistic, +except in the cluster-robust case, +when the adjustment is ((N-L)/L1)*((N-1)/N)*(N_clust-1)/N_clust), +following the standard Stata small-sample adjustment for cluster-robust. +The critical values reported by {cmd:ivreg29} for the Kleibergen-Paap statistic +are the Stock-Yogo critical values for the Cragg-Donald i.i.d. case. +The critical values reported with 2-step GMM +are the Stock-Yogo IV critical values, +and the critical values reported with CUE +are the LIML critical values. + +{marker s_redundancy}{dlgtab:Testing instrument redundancy} + +{marker redtest}{p}The {cmd:redundant} option allows a test of +whether a subset of excluded instruments is "redundant". +Excluded instruments are redundant if the asymptotic efficiency +of the estimation is not improved by using them. +Breusch et al. (1999) show that the condition for the redundancy of a set of instruments +can be stated in several equivalent ways: +e.g., in the reduced form regressions of the endogenous regressors +on the full set of instruments, +the redundant instruments have statistically insignificant coefficients; +or the partial correlations between the endogenous regressors +and the instruments in question are zero. +{cmd:ivreg29} uses a formulation based on testing the rank +of the matrix cross-product between the endogenous regressors +and the possibly-redundant instruments after both have +all other instruments partialled-out; +{cmd:ranktest} is used to test whether the matrix has zero rank. +The test statistic is an LM test +and numerically equivalent to a regression-based LM test. +Under the null that the specified instruments are redundant, +the statistic is distributed as chi-squared +with degrees of freedom=(#endogenous regressors)*(#instruments tested). +Rejection of the null indicates that +the instruments are not redundant. +When the i.i.d. assumption is dropped +and {cmd:ivreg29} reports heteroskedastic, AC, HAC +or cluster-robust statistics, +the redundancy test statistic is similarly robust. +See Baum et al. (2007) for further discussion. + +{p}Calculation and reporting of all underidentification +and weak identification statistics +can be supressed with the {cmd:noid} option. + +{marker s_first}{dlgtab:First-stage regressions, identification, and weak-id-robust inference} + +{marker apstats}{p}The {cmd:first} and {cmd:ffirst} options report +various first-stage results and identification statistics. +Tests of both underidentification and weak identification are reported +for each endogenous regressor separately, +using the method described by Angrist and Pischke (2009), pp. 217-18 +(see also the note on their "Mostly Harmless Econometrics" +{browse "http://www.mostlyharmlesseconometrics.com/2009/10/multivariate-first-stage-f-not/" :blog}. + +{p}The Angrist-Pischke (AP) first-stage chi-squared and F statistics +are tests of underidentification and weak identification, respectively, +of individual endogenous regressors. +They are constructed by "partialling-out" linear projections of the +remaining endogenous regressors. +The AP chi-squared Wald statistic is distributed as chi2(L1-K1+1)) +under the null that the particular endogenous regressor +in question is unidentified. +In the special case of a single endogenous regressor, +the AP statistic reported is identical to underidentification statistics reported +in the {cmd:ffirst} output, +namely the Cragg-Donald Wald statistic (if i.i.d.) +or the Kleibergen-Paap rk Wald statistic (if robust, cluster-robust, AC or HAC +statistics have been requested); +see {help ivreg29##idtest:above}. +Note the difference in the null hypotheses if there are two or more endogenous regressors: +the AP test will fail to reject if a particular endogenous regressor is unidentified, +whereas the Anderson/Cragg-Donald/Kleibergen-Paap tests of underidentification +will fail to reject if {it:any} of the endogenous regressors is unidentified. + +{p}The AP first-stage F statistic is the F form of the same test statistic. +It can be used as a diagnostic for whether a particular endogenous regressor +is "weakly identified" (see {help ivreg29##widtest:above}). +Critical values for the AP first-stage F as a test of weak identification are not available, +but the test statistic can be compared to the Stock-Yogo (2002, 2005) critical +values for the Cragg-Donald F statistic with K1=1. + +{p}The first-stage results are always reported with small-sample statistics, +to be consistent with the recommended use of the first-stage F-test as a diagnostic. +If the estimated equation is reported with robust standard errors, +the first-stage F-test is also robust. + +{p}A full set of first-stage statistics for each of the K1 endogenous regressors +is saved in the matrix e(first). +These include (a) the AP F and chi-squared statistics; (b) the "partial R-squared" +(squared partial correlation) corresponding to the AP statistics; +(c) Shea's (1997) partial R-squared measure (closely related to the AP statistic, +but not amenable to formal testing); (d) the simple F and partial R-squared +statistics for each of the first-stage equations, +with no adjustments if there is more than one endogenous regressor. +In the special case of a single endogenous regressor, +these F statistics and partial R-squareds are identical. + +{marker wirobust}{p}The first-stage output also includes +two statistics that provide weak-instrument robust inference +for testing the significance of the endogenous regressors in the structural equation being estimated. +The first statistic is the Anderson-Rubin (1949) test +(not to be confused with the Anderson-Rubin overidentification test for LIML estimation; +see {help ivreg29##s_liml:above}). +The second is the closely related Stock-Wright (2000) S statistic. +The null hypothesis tested in both cases is that +the coefficients of the endogenous regressors in the structural equation are jointly equal to zero, +and, in addition, that the overidentifying restrictions are valid. +Both tests are robust to the presence of weak instruments. +The tests are equivalent to estimating the reduced form of the equation +(with the full set of instruments as regressors) +and testing that the coefficients of the excluded instruments are jointly equal to zero. +In the form reported by {cmd:ivreg29},the Anderson-Rubin statistic is a Wald test +and the Stock-Wright S statistic is a GMM-distance test. +Both statistics are distributed as chi-squared with L1 degrees of freedom, +where L1=number of excluded instruments. +The traditional F-stat version of the Anderson-Rubin test is also reported. +See Stock and Watson (2000), Dufour (2003), Chernozhukov and Hansen (2005) and Kleibergen (2007) +for further discussion. +For related alternative test statistics that are also robust to weak instruments, +see {help condivreg} and {help rivtest}, +and the corresponding discussions +in Moreira and Poi (2003) and Mikusheva and Poi (2006), +and in Finlay and Magnusson (2009), respectively. + +{p}The {cmd:savefirst} option requests that the individual first-stage regressions +be saved for later access using the {cmd:estimates} command. +If saved, they can also be displayed using {cmd:first} or {cmd:ffirst} and the {cmd:ivreg29} replay syntax. +The regressions are saved with the prefix "_ivreg29_", +unless the user specifies an alternative prefix with the +{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} option. + +{marker s_rf}{dlgtab:Reduced form estimates} + +{p}The {cmd:rf} option requests that the reduced form estimation of the equation be displayed. +The {cmd:saverf} option requests that the reduced form estimation is saved +for later access using the {cmd:estimates} command. +If saved, it can also be displayed using the {cmd:rf} and the {cmd:ivreg29} replay syntax. +The regression is saved with the prefix "_ivreg29_", +unless the user specifies an alternative prefix with the +{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} option. + +{marker s_partial}{dlgtab:Partialling-out exogenous regressors} + +{marker partial}{p}The {cmd:partial(}{it:varlist}{cmd:)} option requests that +the exogenous regressors in {it:varlist} are "partialled out" +from all the other variables (other regressors and excluded instruments) in the estimation. +If the equation includes a constant, it is also automatically partialled out as well. +The coefficients corresponding to the regressors in {it:varlist} are not calculated. +By the Frisch-Waugh-Lovell (FWL) theorem, in IV, +two-step GMM and LIML estimation the coefficients for the remaining regressors +are the same as those that would be obtained if the variables were not partialled out. +(NB: this does not hold for CUE or GMM iterated more than two steps.) +The {cmd:partial} option is most useful when using {cmd:cluster} +and #clusters < (#exogenous regressors + #excluded instruments). +In these circumstances, +the covariance matrix of orthogonality conditions S is not of full rank, +and efficient GMM and overidentification tests are infeasible +since the optimal weighting matrix W = {bind:S^-1} +cannot be calculated. +The problem can be addressed by using {cmd:partial} +to partial out enough exogenous regressors for S to have full rank. +A similar problem arises when the regressors include a variable that is a singleton dummy, +i.e., a variable with one 1 and N-1 zeros or vice versa, +if a robust covariance matrix is requested. +The singleton dummy causes the robust covariance matrix estimator +to be less than full rank. +In this case, partialling-out the variable with the singleton dummy solves the problem. +Specifying {cmd:partial(_cons)} will cause just the constant to be partialled-out, +i.e., the equation will be estimated in deviations-from-means form. +When {cmd:ivreg29} is invoked with {cmd:partial}, +it reports test statistics with the same small-sample adjustments +as if estimating without {cmd:partial}. +Note that after estimation using the {cmd:partial} option, +the post-estimation {cmd:predict} can be used only to generate residuals, +and that in the current implementation, +{cmd:partial} is not compatible with endogenous variables or instruments (included or excluded) +that use time-series operators. + +{marker s_ols}{dlgtab:OLS and Heteroskedastic OLS (HOLS) estimation} + +{p}{cmd:ivreg29} also allows straightforward OLS estimation +by using the same syntax as {cmd:regress}, i.e., +{it:ivreg29 depvar varlist1}. +This can be useful if the user wishes to use one of the +features of {cmd:ivreg29} in OLS regression, e.g., AC or +HAC standard errors. + +{p}If the list of endogenous variables {it:varlist2} is empty +but the list of excluded instruments {it:varlist_iv} is not, +and the option {cmd:gmm2s} is specified, +{cmd:ivreg29} calculates Cragg's "heteroskedastic OLS" (HOLS) estimator, +an estimator that is more efficient than OLS +in the presence of heteroskedasticity of unknown form +(see Davidson and MacKinnon (1993), pp. 599-600). +If the option {cmd:bw(}{it:#}{cmd:)} is specified, +the HOLS estimator is efficient in the presence of +arbitrary autocorrelation; +if both {cmd:bw(}{it:#}{cmd:)} and {cmd:robust} are specified +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and autocorrelation; +and if {cmd:cluster(}{it:varname}{cmd:)} is used, +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and within-group correlation. +The efficiency gains of HOLS derive from the orthogonality conditions +of the excluded instruments listed in {it:varlist_iv}. +If no endogenous variables are specified and {cmd:gmm2s} is not specified, +{cmd:ivreg29} reports standard OLS coefficients. +The Sargan-Hansen statistic reported +when the list of endogenous variables {it:varlist2} is empty +is a Lagrange multiplier (LM) test +of the hypothesis that the excluded instruments {it:varlist_iv} are +correctly excluded from the restricted model. +If the estimation is LIML, the LM statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For more on LM tests, see e.g. Wooldridge (2002), pp. 58-60. +Note that because the approach of the HOLS estimator +has applications beyond heteroskedastic disturbances, +and to avoid confusion concerning the robustness of the estimates, +the estimators presented above as "HOLS" +are described in the output of {cmd:ivreg29} +as "2-Step GMM", "CUE", etc., as appropriate. + +{marker s_collin}{dlgtab:Collinearities} + +{p}{cmd:ivreg29} checks the lists of included instruments, +excluded instruments, and endogenous regressors +for collinearities and duplicates. If an endogenous regressor is +collinear with the instruments, it is reclassified as exogenous. If any +endogenous regressors are collinear with each other, some are dropped. +If there are any collinearities among the instruments, some are dropped. +In Stata 9+, excluded instruments are dropped before included instruments. +If any variables are dropped, a list of their names are saved +in the macros {cmd:e(collin)} and/or {cmd:e(dups)}. +Lists of the included and excluded instruments +and the endogenous regressors with collinear variables and duplicates removed +are also saved in macros with "1" appended +to the corresponding macro names. + +{p}Collinearity checks can be supressed with the {cmd:nocollin} option. + +{marker s_speed}{dlgtab:Speed options: nocollin and noid} + +{p}Two options are available for speeding execution. +{cmd:nocollin} specifies that the collinearity checks not be performed. +{cmd:noid} suspends calculation and reporting of +the underidentification and weak identification statistics +in the main output. + +{marker s_small}{dlgtab:Small sample corrections} + +{p}Mean square error = sqrt(RSS/(N-K)) if {cmd:small}, = sqrt(RSS/N) otherwise. + +{p}If {cmd:robust} is chosen, the finite sample adjustment +(see {hi:[R] regress}) to the robust variance-covariance matrix +qc = N/(N-K) if {cmd:small}, qc = 1 otherwise. + +{p}If {cmd:cluster} is chosen, the finite sample adjustment +qc = (N-1)/(N-K)*M/(M-1) if {cmd:small}, where M=number of clusters, +qc = 1 otherwise. + +{p}The Sargan and C (difference-in-Sargan) statistics use +error variance = RSS/N, i.e., there is no small sample correction. + +{p}A full discussion of these computations and related topics +can be found in Baum, Schaffer, and Stillman (2003) and Baum, Schaffer and +Stillman (2007). Some features of the program postdate the former article and are described in the latter paper. + + +{marker s_options}{title:Options summary} + +{p 0 4}{cmd:gmm2s} requests the two-step efficient GMM estimator. +If no endogenous variables are specified, the estimator is Cragg's HOLS estimator. + +{p 0 4}{cmd:liml} requests the limited-information maximum likelihood estimator. + +{p 0 4}{cmd:fuller(}{it:#}{cmd:)} specifies that Fuller's modified LIML estimator +is calculated using the user-supplied Fuller parameter alpha, +a non-negative number. +Alpha=1 has been suggested as a good choice. + +{p 0 4}{cmd:kclass(}{it:#}{cmd:)} specifies that a general k-class estimator is calculated +using the user-supplied #, a non-negative number. + +{p 0 4}{cmd:coviv} specifies that the matrix used to calculate the +covariance matrix for the LIML or k-class estimator +is based on the 2SLS matrix, i.e., with k=1. +In this case the covariance matrix will differ from that calculated for the 2SLS +estimator only because the estimate of the error variance will differ. +The default is for the covariance matrix to be based on the LIML or k-class matrix. + +{p 0 4}{cmd:cue} requests the GMM continuously-updated estimator (CUE). + +{p 0 4}{cmd:cueinit(}{it:matrix}{cmd:)} specifies that the starting values +for the CUE estimator use those in a user-supplied matrix b. +If omitted, the default behavior is to use starting values +from IV or 2-step efficient GMM estimation. + +{p 0 4}{cmd:cueopt(}{it:string}{cmd:)} passes user-specified options +to Stata's {cmd:ml} routine; see help {help ml}. + +{p 0 4}{cmd:b0(}{it:matrix}{cmd:)} specifies that the J statistic +(i.e., the value of the CUE objective function) +should be calculated for an arbitrary coefficient vector {cmd:b0}. +That vector must be provided as a matrix with appropriate row and column names. +Under- and weak-identification statistics are not reported +in the output. + +{p 0 4}{cmd:robust} specifies that the Eicker/Huber/White/sandwich estimator of +variance is to be used in place of the traditional calculation. {cmd:robust} +combined with {cmd:cluster()} further allows residuals which are not +independent within cluster (although they must be independent between +clusters). See {hi:[U] Obtaining robust variance estimates}. + +{p 0 4}{cmd:cluster}{cmd:(}{it:varname}{cmd:)} specifies that the observations +are independent across groups (clusters) but not necessarily independent +within groups. {it:varname} specifies to which group each observation +belongs; e.g., {cmd:cluster(personid)} in data with repeated observations on +individuals. {cmd:cluster()} can be used with {help pweight}s to produce +estimates for unstratified cluster-sampled data, but see help {help svyreg} +for a command especially designed for survey data. Specifying {cmd:cluster()} +implies {cmd:robust}. + +{p 0 4}{cmd:bw(}{it:#}{cmd:)} impements AC or HAC covariance estimation +with bandwidth equal to {it:#}, where {it:#} is an integer greater than zero. +Specifying {cmd:robust} implements HAC covariance estimation; +omitting it implements AC covariance estimation. +If the Bartlett (default), Parzen or Quadratic Spectral kernels are selected, +the value {cmd:auto} may be given (rather than an integer) +to invoke Newey and West's (1994) automatic bandwidth selection procedure. + +{p 0 4}{cmd:kernel(}{it:string)}{cmd:)} specifies the kernel +to be used for AC and HAC covariance estimation; +the default kernel is Bartlett (also known in econometrics +as Newey-West). Other kernels available are (abbreviations in parentheses): +Truncated (tru); Parzen (par); Tukey-Hanning (thann); Tukey-Hamming (thamm); +Daniell (dan); Tent (ten); and Quadratic-Spectral (qua or qs). + +{p 4 4}Note: in the cases of the Bartlett, Parzen, +and Tukey-Hanning/Hamming kernels, the number of lags used +to construct the kernel estimate equals the bandwidth minus one. +Stata's official {cmd:newey} implements +HAC standard errors based on the Bartlett kernel, +and requires the user to specify +the maximum number of lags used and not the bandwidth; +see help {help newey}. +If these kernels are used with {cmd:bw(1)}, +no lags are used and {cmd:ivreg29} will report the usual +Eicker/Huber/White/sandwich variance estimates. + +{p 0 4}{cmd:wmatrix(}{it:matrix}{cmd:)} specifies a user-supplied weighting matrix +in place of the computed optimal weighting matrix. +The matrix must be positive definite. +The user-supplied matrix must have the same row and column names +as the instrument variables in the regression model (or a subset thereof). + +{p 0 4}{cmd:smatrix(}{it:matrix}{cmd:)} specifies a user-supplied covariance matrix +of the orthogonality conditions to be used in calculating the covariance matrix of the estimator. +The matrix must be positive definite. +The user-supplied matrix must have the same row and column names +as the instrument variables in the regression model (or a subset thereof). + +{p 0 4}{cmd:orthog}{cmd:(}{it:varlist_ex}{cmd:)} requests that a C-statistic +be calculated as a test of the exogeneity of the instruments in {it:varlist_ex}. +These may be either included or excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instruments must still be identified. + +{p 0 4}{cmd:endog}{cmd:(}{it:varlist_en}{cmd:)} requests that a C-statistic +be calculated as a test of the endogeneity +of the endogenous regressors in {it:varlist_en}. + +{p 0 4}{cmd:redundant}{cmd:(}{it:varlist_ex}{cmd:)} requests an LM test +of the redundancy of the instruments in {it:varlist_ex}. +These must be excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instrumenst must still be identified. + +{p 0 4}{cmd:small} requests that small-sample statistics (F and t-statistics) +be reported instead of large-sample statistics (chi-squared and z-statistics). +Large-sample statistics are the default. +The exception is the statistic for the significance of the regression, +which is always reported as a small-sample F statistic. + +{p 0 4}{cmd:noconstant} suppresses the constant term (intercept) in the +regression. If {cmd:noconstant} is specified, the constant term is excluded +from both the final regression and the first-stage regression. To include a +constant in the first-stage when {cmd:noconstant} is specified, explicitly +include a variable containing all 1's in {it:varlist_iv}. + +{p 0 4}{cmd:first} requests that the full first-stage regression results be displayed, +along with the associated diagnostic and identification statistics. + +{p 0 4}{cmd:ffirst} requests the first-stage diagnostic and identification statistics. +The results are saved in various e() macros. + +{p 0 4}{cmd:nocollin} suppresses the checks for collinearities +and duplicate variables. + +{p 0 4}{cmd:noid} suppresses the calculation and reporting +of underidentification and weak identification statistics. + +{p 0 4}{cmd:savefirst} requests that the first-stage regressions results +are saved for later access using the {cmd:estimates} command. +The names under which the first-stage regressions are saved +are the names of the endogenous regressors prefixed by "_ivreg29_". +If these use Stata's time-series operators, +the "." is replaced by a "_". +The maximum number of first-stage estimation results that can be saved +depends on how many other estimation results the user has already saved +and on the maximum supported by Stata (300 for Stata 9.1). + +{p 0 4}{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the first-stage regression results be saved using the user-specified prefix +instead of the default "_ivreg29_". + +{p 0 4}{cmd:rf} requests that the reduced-form estimation of the equation +be displayed. + +{p 0 4}{cmd:saverf} requests that the reduced-form estimation of the equation +be saved for later access using the {cmd:estimates} command. +The estimation is stored under the name of the dependent variable +prefixed by "_ivreg29_". +If this uses Stata's time-series operators, +the "." is replaced by a "_". + +{p 0 4}{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the reduced-form estimation be saved using the user-specified prefix +instead of the default "_ivreg29_". + +{p 0 4}{cmd:partial(}{it:varlist}{cmd:)} requests that +the exogenous regressors in {it:varlist} be partialled out +from the other variables in the equation. +If the equation includes a constant, +it is automatically partialled out as well. +The coefficients corresponding to the regressors in {it:varlist} +are not calculated. + +{p 0 4}{cmd:level(}{it:#}{cmd:)} specifies the confidence level, in percent, +for confidence intervals of the coefficients; see help {help level}. + +{p 0 4}{cmd:noheader}, {cmd:eform()}, {cmd:depname()} and {cmd:plus} +are for ado-file writers; see {hi:[R] ivreg} and {hi:[R] regress}. + +{p 0 4}{cmd:nofooter} suppresses the display of the footer containing +identification and overidentification statistics, +exogeneity and endogeneity tests, +lists of endogenous variables and instruments, etc. + +{p 0 4}{cmd:version} causes {cmd:ivreg29} to display its current version number +and to leave it in the macro {cmd:e(version)}. +It cannot be used with any other options. +and will clear any existing {cmd:e()} saved results. + +{marker s_macros}{title:Remarks and saved results} + +{p}{cmd:ivreg29} does not report an ANOVA table. +Instead, it reports the RSS and both the centered and uncentered TSS. +It also reports both the centered and uncentered R-squared. +NB: the TSS and R-squared reported by official {cmd:ivreg} is centered +if a constant is included in the regression, and uncentered otherwise. + +{p}{cmd:ivreg29} saves the following results in {cmd:e()}: + +Scalars +{col 4}{cmd:e(N)}{col 18}Number of observations +{col 4}{cmd:e(yy)}{col 18}Total sum of squares (SS), uncentered (y'y) +{col 4}{cmd:e(yyc)}{col 18}Total SS, centered (y'y - ((1'y)^2)/n) +{col 4}{cmd:e(rss)}{col 18}Residual SS +{col 4}{cmd:e(mss)}{col 18}Model SS =yyc-rss if the eqn has a constant, =yy-rss otherwise +{col 4}{cmd:e(df_m)}{col 18}Model degrees of freedom +{col 4}{cmd:e(df_r)}{col 18}Residual degrees of freedom +{col 4}{cmd:e(r2u)}{col 18}Uncentered R-squared, 1-rss/yy +{col 4}{cmd:e(r2c)}{col 18}Centered R-squared, 1-rss/yyc +{col 4}{cmd:e(r2)}{col 18}Centered R-squared if the eqn has a constant, uncentered otherwise +{col 4}{cmd:e(r2_a)}{col 18}Adjusted R-squared +{col 4}{cmd:e(ll)}{col 18}Log likelihood +{col 4}{cmd:e(rankxx)}{col 18}Rank of the matrix of observations on rhs variables=K +{col 4}{cmd:e(rankzz)}{col 18}Rank of the matrix of observations on instruments=L +{col 4}{cmd:e(rankV)}{col 18}Rank of covariance matrix V of coefficients +{col 4}{cmd:e(rankS)}{col 18}Rank of covariance matrix S of orthogonality conditions +{col 4}{cmd:e(rmse)}{col 18}root mean square error=sqrt(rss/(N-K)) if -small-, =sqrt(rss/N) if not +{col 4}{cmd:e(F)}{col 18}F statistic +{col 4}{cmd:e(N_clust)}{col 18}Number of clusters +{col 4}{cmd:e(bw)}{col 18}Bandwidth +{col 4}{cmd:e(lambda)}{col 18}LIML eigenvalue +{col 4}{cmd:e(kclass)}{col 18}k in k-class estimation +{col 4}{cmd:e(fuller)}{col 18}Fuller parameter alpha +{col 4}{cmd:e(sargan)}{col 18}Sargan statistic +{col 4}{cmd:e(sarganp)}{col 18}p-value of Sargan statistic +{col 4}{cmd:e(sargandf)}{col 18}dof of Sargan statistic = degree of overidentification = L-K +{col 4}{cmd:e(j)}{col 18}Hansen J statistic +{col 4}{cmd:e(jp)}{col 18}p-value of Hansen J statistic +{col 4}{cmd:e(jdf)}{col 18}dof of Hansen J statistic = degree of overidentification = L-K +{col 4}{cmd:e(arubin)}{col 18}Anderson-Rubin overidentification LR statistic N*ln(lambda) +{col 4}{cmd:e(arubinp)}{col 18}p-value of Anderson-Rubin overidentification LR statistic +{col 4}{cmd:e(arubin_lin)}{col 18}Anderson-Rubin linearized overidentification statistic N*(lambda-1) +{col 4}{cmd:e(arubin_linp)}{col 18}p-value of Anderson-Rubin linearized overidentification statistic +{col 4}{cmd:e(arubindf)}{col 18}dof of A-R overid statistic = degree of overidentification = L-K +{col 4}{cmd:e(idstat)}{col 18}LM test statistic for underidentification (Anderson or Kleibergen-Paap) +{col 4}{cmd:e(idp)}{col 18}p-value of underidentification LM statistic +{col 4}{cmd:e(iddf)}{col 18}dof of underidentification LM statistic +{col 4}{cmd:e(widstat)}{col 18}F statistic for weak identification (Cragg-Donald or Kleibergen-Paap) +{col 4}{cmd:e(arf)}{col 18}Anderson-Rubin F-test of significance of endogenous regressors +{col 4}{cmd:e(arfp)}{col 18}p-value of Anderson-Rubin F-test of endogenous regressors +{col 4}{cmd:e(archi2)}{col 18}Anderson-Rubin chi-sq test of significance of endogenous regressors +{col 4}{cmd:e(archi2p)}{col 18}p-value of Anderson-Rubin chi-sq test of endogenous regressors +{col 4}{cmd:e(ardf)}{col 18}degrees of freedom of Anderson-Rubin tests of endogenous regressors +{col 4}{cmd:e(ardf_r)}{col 18}denominator degrees of freedom of AR F-test of endogenous regressors +{col 4}{cmd:e(redstat)}{col 18}LM statistic for instrument redundancy +{col 4}{cmd:e(redp)}{col 18}p-value of LM statistic for instrument redundancy +{col 4}{cmd:e(reddf)}{col 18}dof of LM statistic for instrument redundancy +{col 4}{cmd:e(cstat)}{col 18}C-statistic +{col 4}{cmd:e(cstatp)}{col 18}p-value of C-statistic +{col 4}{cmd:e(cstatdf)}{col 18}Degrees of freedom of C-statistic +{col 4}{cmd:e(cons)}{col 18}1 when equation has a Stata-supplied constant; 0 otherwise +{col 4}{cmd:e(partialcons)}{col 18}as above but prior to partialling-out (see {cmd:e(partial)}) +{col 4}{cmd:e(partial_ct)}{col 18}Number of partialled-out variables (see {cmd:e(partial)}) + +Macros +{col 4}{cmd:e(cmd)}{col 18}ivreg29 +{col 4}{cmd:e(cmdline)}{col 18}Command line invoking ivreg29 +{col 4}{cmd:e(version)}{col 18}Version number of ivreg29 +{col 4}{cmd:e(model)}{col 18}ols, iv, gmm, liml, or kclass +{col 4}{cmd:e(depvar)}{col 18}Name of dependent variable +{col 4}{cmd:e(instd)}{col 18}Instrumented (RHS endogenous) variables +{col 4}{cmd:e(insts)}{col 18}Instruments +{col 4}{cmd:e(inexog)}{col 18}Included instruments (regressors) +{col 4}{cmd:e(exexog)}{col 18}Excluded instruments +{col 4}{cmd:e(collin)}{col 18}Variables dropped because of collinearities +{col 4}{cmd:e(dups)}{col 18}Duplicate variables +{col 4}{cmd:e(ecollin)}{col 18}Endogenous variables reclassified as exogenous because of +{col 20}collinearities with instruments +{col 4}{cmd:e(clist)}{col 18}Instruments tested for orthogonality +{col 4}{cmd:e(redlist)}{col 18}Instruments tested for redundancy +{col 4}{cmd:e(partial)}{col 18}Partialled-out exogenous regressors +{col 4}{cmd:e(small)}{col 18}small +{col 4}{cmd:e(wtype)}{col 18}weight type +{col 4}{cmd:e(wexp)}{col 18}weight expression +{col 4}{cmd:e(clustvar)}{col 18}Name of cluster variable +{col 4}{cmd:e(vcetype)}{col 18}Covariance estimation method +{col 4}{cmd:e(kernel)}{col 18}Kernel +{col 4}{cmd:e(tvar)}{col 18}Time variable +{col 4}{cmd:e(ivar)}{col 18}Panel variable +{col 4}{cmd:e(firsteqs)}{col 18}Names of stored first-stage equations +{col 4}{cmd:e(rfeq)}{col 18}Name of stored reduced-form equation +{col 4}{cmd:e(predict)}{col 18}Program used to implement predict + +Matrices +{col 4}{cmd:e(b)}{col 18}Coefficient vector +{col 4}{cmd:e(V)}{col 18}Variance-covariance matrix of the estimators +{col 4}{cmd:e(S)}{col 18}Covariance matrix of orthogonality conditions +{col 4}{cmd:e(W)}{col 18}GMM weighting matrix (=inverse of S if efficient GMM estimator) +{col 4}{cmd:e(first)}{col 18}First-stage regression results +{col 4}{cmd:e(ccev)}{col 18}Eigenvalues corresponding to the Anderson canonical correlations test +{col 4}{cmd:e(cdev)}{col 18}Eigenvalues corresponding to the Cragg-Donald test + +Functions +{col 4}{cmd:e(sample)}{col 18}Marks estimation sample + + + +{marker s_examples}{title:Examples} + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta" : . use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta }{p_end} +{p 8 12}(Wages of Very Young Men, Zvi Griliches, J.Pol.Ec. 1976) + +{p 8 12}{stata "xi i.year" : . xi i.year} + +{col 0}(Instrumental variables. Examples follow Hayashi 2000, p. 255.) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt)} + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), small ffirst" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), small ffirst} + +{col 0}(Testing for the presence of heteroskedasticity in IV/GMM estimation) + +{p 8 12}{stata "ivhettest, fitlev" : . ivhettest, fitlev} + +{col 0}(Two-step GMM efficient in the presence of arbitrary heteroskedasticity) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust} + +{p 0}(GMM with user-specified first-step weighting matrix or matrix of orthogonality conditions) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), robust" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), robust} + +{p 8 12}{stata "predict double uhat if e(sample), resid" : . predict double uhat if e(sample), resid} + +{p 8 12}{stata "mat accum S = `e(insts)' [iw=uhat^2]" : . mat accum S = `e(insts)' [iw=uhat^2]} + +{p 8 12}{stata "mat S = 1/`e(N)' * S" : . mat S = 1/`e(N)' * S} + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust smatrix(S)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust smatrix(S)} + +{p 8 12}{stata "mat W = invsym(S)" : . mat W = invsym(S)} + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust wmatrix(W)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust wmatrix(W)} + +{p 0}(Equivalence of J statistic and Wald tests of included regressors, irrespective of instrument choice (Ahn, 1997)) + +{p 8 12}{stata "ivreg29 lw (iq=med kww age), gmm2s" : . ivreg29 lw (iq=med kww age), gmm2s} + +{p 8 12}{stata "mat S0 = e(S)" : . mat S0 = e(S)} + +{p 8 12}{stata "qui ivreg29 lw (iq=kww) med age, gmm2s smatrix(S0)" : . qui ivreg29 lw (iq=kww) med age, gmm2s smatrix(S0)} + +{p 8 12}{stata "test med age" : . test med age} + +{p 8 12}{stata "qui ivreg29 lw (iq=med) kww age, gmm2s smatrix(S0)" : . qui ivreg29 lw (iq=med) kww age, gmm2s smatrix(S0)} + +{p 8 12}{stata "test kww age" : . test kww age} + +{p 8 12}{stata "qui ivreg29 lw (iq=age) med kww, gmm2s smatrix(S0)" : . qui ivreg29 lw (iq=age) med kww, gmm2s smatrix(S0)} + +{p 8 12}{stata "test med kww" : . test med kww} + +{p 0}(Continuously-updated GMM (CUE) efficient in the presence of arbitrary heteroskedasticity. NB: may require 50+ iterations.) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust} + +{p 0}(Continuously-updated GMM (CUE) with ml options) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust cueopt(technique(dfp))" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust cueopt(technique(dfp))} + +{col 0}(Sargan-Basmann tests of overidentifying restrictions for IV estimation) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt)} + +{p 8 12}{stata "overid, all" : . overid, all} + +{col 0}(Tests of exogeneity and endogeneity) + +{col 0}(Test the exogeneity of one regressor) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(s)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(s)} + +{col 0}(Test the exogeneity of two excluded instruments) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(age mrt)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(age mrt)} + +{col 0}(Frisch-Waugh-Lovell (FWL): equivalence of estimations with and without partialling-out) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns _I* (iq=kww age), cluster(year)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age), cluster(year)} + +{p 8 12}{stata "ivreg29 lw s expr tenure rns _I* (iq=kww age), cluster(year) partial(_I*)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age), cluster(year) partial(_I*)} + +{col 0}({cmd:partial()}: efficient GMM with #clusters<#instruments feasible after partialling-out) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns _I* (iq=kww age), cluster(year) partial(_I*) gmm2s" : . ivreg29 lw s expr tenure rns smsa (iq=med kww age), cluster(year) partial(_I*) gmm2s} + +{col 0}(Examples following Wooldridge 2002, pp.59, 61) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta" : . use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta } + +{col 0}(Equivalence of DWH endogeneity test when regressor is endogenous...) + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6)" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6)} + +{p 8 12}{stata "ivendog educ" :. ivendog educ} + +{col 0}(... endogeneity test using the {cmd:endog} option) + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), endog(educ)" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), endog(educ)} + +{col 0}(...and C-test of exogeneity when regressor is exogenous, using the {cmd:orthog} option) + +{p 8 12}{stata "ivreg29 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)" : . ivreg29 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)} + +{col 0}(Heteroskedastic Ordinary Least Squares, HOLS) + +{p 8 12}{stata "ivreg29 lwage exper expersq educ (=age kidslt6 kidsge6), gmm2s" : . ivreg29 lwage exper expersq educ (=age kidslt6 kidsge6), gmm2s} + +{col 0}(Equivalence of Cragg-Donald Wald F statistic and F-test from first-stage regression +{col 0}in special case of single endogenous regressor. Also illustrates {cmd:savefirst} option.) + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), savefirst" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), savefirst} + +{p 8 12}{stata "di e(widstat)" : . di e(widstat)} + +{p 8 12}{stata "estimates restore _ivreg29_educ" : . estimates restore _ivreg29_educ} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Equivalence of Kleibergen-Paap robust rk Wald F statistic and F-test from first-stage +{col 0}regression in special case of single endogenous regressor.) + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust savefirst" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust savefirst} + +{p 8 12}{stata "di e(widstat)" : . di e(widstat)} + +{p 8 12}{stata "estimates restore _ivreg29_educ" : . estimates restore _ivreg29_educ} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Equivalence of Kleibergen-Paap robust rk LM statistic for identification and LM test +{col 0}of joint significance of excluded instruments in first-stage regression in special +{col 0}case of single endogenous regressor. Also illustrates use of {cmd:ivreg29} to perform an +{col 0}LM test in OLS estimation.) + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust} + +{p 8 12}{stata "di e(idstat)" : . di e(idstat)} + +{p 8 12}{stata "ivreg29 educ exper expersq (=age kidslt6 kidsge6) if e(sample), robust" : . ivreg29 educ exper expersq (=age kidslt6 kidsge6) if e(sample), robust} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(Equivalence of an LM test of an excluded instrument for redundancy and an LM test of +{col 0}significance from first-stage regression in special case of single endogenous regressor.) + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust redundant(age)" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust redundant(age)} + +{p 8 12}{stata "di e(redstat)" : . di e(redstat)} + +{p 8 12}{stata "ivreg29 educ exper expersq kidslt6 kidsge6 (=age) if e(sample), robust" : . ivreg29 educ exper expersq kidslt6 kidsge6 (=age) if e(sample), robust} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(Weak-instrument robust inference: Anderson-Rubin Wald F and chi-sq and +{col 0}Stock-Wright S statistics. Also illusrates use of {cmd:saverf} option.) + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust ffirst saverf" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust ffirst saverf} + +{p 8 12}{stata "di e(arf)" : . di e(arf)} + +{p 8 12}{stata "di e(archi2)" : . di e(archi2)} + +{p 8 12}{stata "di e(sstat)" : . di e(sstat)} + +{col 0}(Obtaining the Anderson-Rubin Wald F statistic from the reduced-form estimation) + +{p 8 12}{stata "estimates restore _ivreg29_lwage" : . estimates restore _ivreg29_lwage} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Obtaining the Anderson-Rubin Wald chi-sq statistic from the reduced-form estimation. +{col 0}Use {cmd:ivreg29} without {cmd:small} to obtain large-sample test statistic.) + +{p 8 12}{stata "ivreg29 lwage exper expersq age kidslt6 kidsge6, robust" : . ivreg29 lwage exper expersq age kidslt6 kidsge6, robust} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(chi2)" : . di r(chi2)} + +{col 0}(Obtaining the Stock-Wright S statistic as the value of the GMM CUE objective function. +{col 0}Also illustrates use of {cmd:b0} option. Coefficients on included exogenous regressors +{col 0}are OLS coefficients, which is equivalent to partialling them out before obtaining +{col 0}the value of the CUE objective function.) + +{p 8 12}{stata "mat b = 0" : . mat b = 0} + +{p 8 12}{stata "mat colnames b = educ" : . mat colnames b = educ} + +{p 8 12}{stata "qui ivreg29 lwage exper expersq" : . qui ivreg29 lwage exper expersq} + +{p 8 12}{stata "mat b = b, e(b)" : . mat b = b, e(b)} + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust b0(b)" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust b0(b)} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(LIML and k-class estimation using Klein data) + +{col 9}{stata "use http://fmwww.bc.edu/repec/bocode/k/kleinI" :. use http://fmwww.bc.edu/repec/bocode/k/kleinI} + +{col 0}(LIML estimates of Klein's consumption function) + +{p 8 12}{stata "ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml" :. ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml} + +{col 0}(Equivalence of LIML and CUE+homoskedasticity+independence) + +{p 8 12}{stata "ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml coviv" :. ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml coviv} + +{p 8 12}{stata "ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), cue" :. ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), cue} + +{col 0}(Fuller's modified LIML with alpha=1) + +{p 8 12}{stata "ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), fuller(1)" :. ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), fuller(1)} + +{col 0}(k-class estimation with Nagar's bias-adjusted IV, k=1+(L-K)/N=1+4/21=1.19) + +{p 8 12}{stata "ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), kclass(1.19)" :. ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), kclass(1.19)} + +{col 0}(Kernel-based covariance estimation using time-series data) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta" :. use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta} + +{p 8 12}{stata "tsset year, yearly" :. tsset year, yearly} + +{col 0}(Autocorrelation-consistent (AC) inference in an OLS Regression) + +{p 8 12}{stata "ivreg29 cinf unem, bw(3)" :. ivreg29 cinf unem, bw(3)} + +{p 8 12}{stata "ivreg29 cinf unem, kernel(qs) bw(auto)" :. ivreg29 cinf unem, kernel(qs) bw(auto)} + +{col 0}(Heteroskedastic and autocorrelation-consistent (HAC) inference in an OLS regression) + +{p 8 12}{stata "ivreg29 cinf unem, bw(3) kernel(bartlett) robust small" :. ivreg29 cinf unem, bw(3) kernel(bartlett) robust small} + +{p 8 12}{stata "newey cinf unem, lag(2)" :. newey cinf unem, lag(2)} + +{col 0}(AC and HAC in IV and GMM estimation) + +{p 8 12}{stata "ivreg29 cinf (unem = l(1/3).unem), bw(3)" :. ivreg29 cinf (unem = l(1/3).unem), bw(3)} + +{p 8 12}{stata "ivreg29 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(thann)" :. ivreg29 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(thann)} + +{p 8 12}{stata "ivreg29 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(qs) robust orthog(l1.unem)" :. ivreg29 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(qs) robust orthog(l1.unem)} + +{col 0}(Examples using Large N, Small T Panel Data) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta" : . use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta }{p_end} + +{p 8 12}{stata "tsset id year" :. tsset id year} + +{col 0}(Autocorrelation-consistent inference in an IV regression) + +{p 8 12}{stata "ivreg29 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(1) kernel(tru)": . ivreg29 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(1) kernel(tru)} + +{col 0}(Two-step effic. GMM in the presence of arbitrary heteroskedasticity and autocorrelation) + +{p 8 12}{stata "ivreg29 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(2) gmm2s kernel(tru) robust": . ivreg29 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(2) gmm2s kernel(tru) robust} + +{col 0}(Two-step effic. GMM in the presence of arbitrary heterosked. and intra-group correlation) + +{p 8 12}{stata "ivreg29 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm2s cluster(id)": . ivreg29 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm2s cluster(id)} + + +{marker s_refs}{title:References} + +{p 0 4}Ahn, Seung C. 1997. Orthogonality tests in linear models. Oxford Bulletin +of Economics and Statistics, Vol. 59, pp. 183-186. + +{p 0 4}Anderson, T.W. 1951. Estimating linear restrictions on regression coefficients +for multivariate normal distributions. Annals of Mathematical Statistics, Vol. 22, pp. 327-51. + +{p 0 4}Anderson, T. W. and H. Rubin. 1949. Estimation of the parameters of a single equation +in a complete system of stochastic equations. Annals of Mathematical Statistics, Vol. 20, +pp. 46-63. + +{p 0 4}Anderson, T. W. and H. Rubin. 1950. The asymptotic properties of estimates of the parameters of a single +equation in a complete system of stochastic equations. Annals of Mathematical Statistics, +Vol. 21, pp. 570-82. + +{p 0 4}Angrist, J.D. and Pischke, J.-S. 2009. Mostly Harmless Ecnometrics: An Empiricist's Companion. +Princeton: Princeton University Press. + +{p 0 4}Baum, C.F., Schaffer, M.E., and Stillman, S. 2003. Instrumental Variables and GMM: +Estimation and Testing. The Stata Journal, Vol. 3, No. 1, pp. 1-31. +{browse "http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html":http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html}. +Working paper version: Boston College Department of Economics Working Paper No. 545. +{browse "http://ideas.repec.org/p/boc/bocoec/545.html":http://ideas.repec.org/p/boc/bocoec/545.html}. + +{p 0 4}Baum, C. F., Schaffer, M.E., and Stillman, S. 2007. Enhanced routines for instrumental variables/GMM estimation and testing. +The Stata Journal, Vol. 7, No. 4, pp. 465-506. +{browse "http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html":http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html}. +Working paper version: Boston College Department of Economics Working Paper No. 667. +{browse "http://ideas.repec.org/p/boc/bocoec/667.html":http://ideas.repec.org/p/boc/bocoec/667.html}. + +{p 0 4}Breusch, T., Qian, H., Schmidt, P. and Wyhowski, D. 1999. +Redundancy of moment conditions. +Journal of Econometrics, Vol. 9, pp. 89-111. + +{p 0 4}Chernozhukov, V. and Hansen, C. 2005. The Reduced Form: +A Simple Approach to Inference with Weak Instruments. +Working paper, University of Chicago, Graduate School of Business. + +{p 0 4}Cragg, J.G. and Donald, S.G. 1993. Testing Identfiability and Specification in +Instrumental Variables Models. Econometric Theory, Vol. 9, pp. 222-240. + +{p 0 4}Cushing, M.J. and McGarvey, M.G. 1999. Covariance Matrix Estimation. +In L. Matyas (ed.), Generalized Methods of Moments Estimation. +Cambridge: Cambridge University Press. + +{p 0 4}Davidson, R. and MacKinnon, J. 1993. Estimation and Inference in Econometrics. +1993. New York: Oxford University Press. + +{p 0 4}Dufour, J.M. 2003. Identification, Weak Instruments and Statistical Inference +in Econometrics. Canadian Journal of Economics, Vol. 36, No. 4, pp. 767-808. +Working paper version: CIRANO Working Paper 2003s-49. +{browse "http://www.cirano.qc.ca/pdf/publication/2003s-49.pdf":http://www.cirano.qc.ca/pdf/publication/2003s-49.pdf}. + +{p 0 4}Finlay, K., and Magnusson, L.M. 2009. Implementing Weak-Instrument Robust Tests +for a General Class of Instrumental-Variables Models. + +{p 0 4}Hall, A.R., Rudebusch, G.D. and Wilcox, D.W. 1996. Judging Instrument Relevance in +Instrumental Variables Estimation. International Economic Review, Vol. 37, No. 2, pp. 283-298. +The Stata Journal, Vol. 9, No. 3, pp. 398-421. +{browse "http://www.stata-journal.com/article.html?article=st0171":http://www.stata-journal.com/article.html?article=st0171}. + +{p 0 4}Hayashi, F. Econometrics. 2000. Princeton: Princeton University Press. + +{p 0 4}Hansen, L.P., Heaton, J., and Yaron, A. 1996. Finite Sample Properties +of Some Alternative GMM Estimators. Journal of Business and Economic Statistics, Vol. 14, No. 3, pp. 262-280. + +{p 0 4}Kleibergen, F. 2007. Generalizing Weak Instrument Robust Statistics Towards Multiple Parameters, Unrestricted Covariance Matrices and Identification Statistics. Journal of Econometrics, forthcoming. + +{p 0 4}Kleibergen, F. and Paap, R. 2006. Generalized Reduced Rank Tests Using the Singular Value Decomposition. +Journal of Econometrics, Vol. 133, pp. 97-126. + +{p 0 4}Kleibergen, F. and Schaffer, M.E. 2007. ranktest: Stata module for testing the rank +of a matrix using the Kleibergen-Paap rk statistic. +{browse "http://ideas.repec.org/c/boc/bocode/s456865.html":http://ideas.repec.org/c/boc/bocode/s456865.html}. + +{p 0 4}Mikusheva, A. and Poi, B.P. 2006. +Tests and Confidence Sets with Correct Size When Instruments are Potentially Weak. The Stata Journal, Vol. 6, No. 3, pp. 335-347. + +{p 0 4}Moreira, M.J. and Poi, B.P. 2003. Implementing Tests with the Correct Size in the Simultaneous Equations Model. The Stata Journal, Vol. 3, No. 1, pp. 57-70. + +{p 0 4}Newey, W.K. and K.D. West, 1994. Automatic Lag Selection in Covariance Matrix Estimation. Review of Economic Studies, Vol. 61, No. 4, pp. 631-653. + +{p 0 4}Shea, J. 1997. Instrument Relevance in Multivariate Linear Models: +A Simple Measure. +Review of Economics and Statistics, Vol. 49, No. 2, pp. 348-352. + +{p 0 4}Stock, J.H. and Wright, J.H. 2000. GMM with Weak Identification. +Econometrica, Vol. 68, No. 5, September, pp. 1055-1096. + +{p 0 4}Stock, J.H. and Yogo, M. 2005. Testing for Weak Instruments in Linear IV Regression. In D.W.K. Andrews and J.H. Stock, eds. Identification and Inference for Econometric Models: Essays in Honor of Thomas Rothenberg. Cambridge: Cambridge University Press, 2005, pp. 80–108. +Working paper version: NBER Technical Working Paper 284. +{browse "http://www.nber.org/papers/T0284":http://www.nber.org/papers/T0284}. + +{p 0 4}Wooldridge, J.M. 2002. Econometric Analysis of Cross Section and Panel Data. Cambridge, MA: MIT Press. + + +{marker s_acknow}{title:Acknowledgements} + +{p}We would like to thanks various colleagues who helped us along the way, including +David Drukker, +Frank Kleibergen, +Austin Nichols, +Brian Poi, +Vince Wiggins, +and, not least, the users of {cmd:ivreg29} +who have provided suggestions, +spotted bugs, +and helped test the package. +We are also grateful to Jim Stock and Moto Yogo for permission to reproduce +their critical values for the Cragg-Donald statistic. + +{marker s_citation}{title:Citation of ivreg29} + +{p}{cmd:ivreg29} is not an official Stata command. It is a free contribution +to the research community, like a paper. Please cite it as such: {p_end} + +{phang}Baum, C.F., Schaffer, M.E., Stillman, S. 2010. +ivreg29: Stata module for extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression. +{browse "http://ideas.repec.org/c/boc/bocode/s425401.html":http://ideas.repec.org/c/boc/bocode/s425401.html}{p_end} + +{title:Authors} + + Christopher F Baum, Boston College, USA + baum@bc.edu + + Mark E Schaffer, Heriot-Watt University, UK + m.e.schaffer@hw.ac.uk + + Steven Stillman, Motu Economic and Public Policy Research + stillman@motu.org.nz + + +{title:Also see} + +{p 1 14}Articles:{it:Stata Journal}, volume 3, number 1: {browse "http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html":st0030}{p_end} +{p 10 14}{it:Stata Journal}, volume 7, number 4: {browse "http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html":st0030_3}{p_end} + +{p 1 14}Manual: {hi:[U] 23 Estimation and post-estimation commands}{p_end} +{p 10 14}{hi:[U] 29 Overview of model estimation in Stata}{p_end} +{p 10 14}{hi:[R] ivreg}{p_end} + +{p 1 10}On-line: help for {help ivregress}, {help ivreg}, {help newey}; +{help overid}, {help ivendog}, {help ivhettest}, {help ivreset}, +{help xtivreg2}, {help xtoverid}, {help ranktest}, +{help condivreg} (if installed); +{help rivtest} (if installed); +{help est}, {help postest}; +{help regress}{p_end} diff --git a/ado/i/ivreg29_cue.ado b/ado/i/ivreg29_cue.ado new file mode 100644 index 0000000..a7908a2 --- /dev/null +++ b/ado/i/ivreg29_cue.ado @@ -0,0 +1,26 @@ +! 1.0.6 13Nov2009 +* 1.0.1 cfb updated to v8.2 +* 1.0.2 mes fixed col and row names mismatch +* 1.0.3 added noid option to supress unnecessary identification stats +* 1.0.4 added local `ivreg2_cmd'. ref only to e(j); e(sargan) no longer needed. +* 1.0.5 added nocollin option to supress unnecessary checks for collinearity +* 1.0.6 slight rewrite of ivreg2_cue to ivreg29_cue + +program define ivreg29_cue + version 8.2 + args todo b lnf + local ivreg2_cmd "ivreg29" + tempname b1 J +* Need to make col and rownames match + mat `b1'=`b' +* Remove equation number from col names + local vn : colfullnames `b1' + local vn : subinstr local vn "eq1" "", all + mat colnames `b1' = `vn' +* Standard row name + mat rownames `b1' = y1 + qui `ivreg2_cmd' $IV_lhs $IV_inexog ($IV_endog=$IV_exexog) $IV_wt if $ML_samp==1, b0(`b1') $IV_opt noid nocollin + scalar `J'=e(j) + scalar `lnf' = -`J' +end + diff --git a/ado/i/ivreg29_p.ado b/ado/i/ivreg29_p.ado new file mode 100644 index 0000000..b5b9678 --- /dev/null +++ b/ado/i/ivreg29_p.ado @@ -0,0 +1,100 @@ +*! ivreg29_p 1.0.8 30Jan2011 +*! author mes +* 1.0.1: 25apr2002 original version +* 1.0.2: 28jun2005 version 8.2 +* 1.0.3: 1Aug2006 complete rewrite plus fwl option +* 1.0.4: 26Jan2007 eliminated double reporting of #MVs +* 1.0.5: 2Feb2007 small fix to allow fwl of just _cons +* 1.0.6: 19Aug2007 replacement of "fwl" with "partial" in conjuction with new ivreg2 syntax +* 1.0.7: 13Nov2009 slight rewrite of ivreg2_p to ivreg29_p +* 1.0.8: 30Jan2011 re-introduced stdp option (hadn't been supported after fwl/partial) +* and added labelling of created residual variable + +program define ivreg29_p + version 8.2 + syntax newvarname [if] [in] , [XB Residuals stdp] + marksample touse, novarlist + + local type "`xb'`residuals'`stdp'" + + if "`type'"=="" { + local type "xb" +di in gr "(option xb assumed; fitted values)" + } + +* e(partialcons) now always exists and is 1 or 0 + if e(partial_ct) { +* partial partial-out block + if "`type'" == "residuals" { + + tempvar esample + tempname ivres + gen byte `esample' = e(sample) + +* Need to strip out time series operators + local lhs "`e(depvar)'" + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + + local rhs : colnames(e(b)) + tsrevar `rhs', substitute + local rhs_t "`r(varlist)'" + + if "`e(partial1)'" != "" { + local partial "`e(partial1)'" + } + else { + local partial "`e(partial)'" + } + tsrevar `partial', substitute + local partial_t "`r(varlist)'" + + if ~e(partialcons) { + local noconstant "noconstant" + } + + local allvars "`lhs_t' `rhs_t'" +* Partial-out block. Uses estimatation sample to get coeffs, markout sample for predict + _estimates hold `ivres', restore + foreach var of local allvars { + tempname `var'_partial + qui regress `var' `partial' if `esample', `noconstant' + qui predict double ``var'_partial' if `touse', resid + local allvars_partial "`allvars_partial' ``var'_partial'" + } + _estimates unhold `ivres' + + tokenize `allvars_partial' + local lhs_partial "`1'" + mac shift + local rhs_partial "`*'" + + tempname b + mat `b'=e(b) + mat colnames `b' = `rhs_partial' +* Use forcezero? + tempvar xb + mat score double `xb' = `b' if `touse' + gen `typlist' `varlist' = `lhs_partial' - `xb' + label var `varlist' "Residuals" + } + else { +di in red "Option `type' not supported with -partial- option" + error 198 + } + } + else if "`type'" == "residuals" { + tempname lhs lhs_t xb + local lhs "`e(depvar)'" + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + qui _predict `typlist' `xb' if `touse' + gen `typlist' `varlist'=`lhs_t'-`xb' + label var `varlist' "Residuals" + } +* Must be either xb or stdp + else { + _predict `typlist' `varlist' if `touse', `type' + } + +end diff --git a/ado/i/ivreg2_p.ado b/ado/i/ivreg2_p.ado new file mode 100644 index 0000000..8114cf9 --- /dev/null +++ b/ado/i/ivreg2_p.ado @@ -0,0 +1,148 @@ +*! ivreg2_p 1.0.10 30jul2023 +*! author mes +* 1.0.1: 25apr2002 original version +* 1.0.2: 28jun2005 version 8.2 +* 1.0.3: 1Aug2006 complete rewrite plus fwl option +* 1.0.4: 26Jan2007 eliminated double reporting of #MVs +* 1.0.5: 2Feb2007 small fix to allow fwl of just _cons +* 1.0.6: 19Aug2007 replacement of "fwl" with "partial" in conjuction with new ivreg2 syntax +* 1.0.7: 4Feb2010 version check update +* 1.0.8: 30Jan2011 re-introduced stdp option (hadn't been supported after fwl/partial) +* and added labelling of created residual variable +* 1.0.9: 25Jan2015 Rewrite to accommodate new ivreg2 with legacy support; +* passes control to matching ivreg2x_p predict program. +* 1.0.10:30Jul2023 Change version of ivreg211_p to 11.2, tsrevar->fvrevar to handle FVs (cfb0) + +program define ivreg2_p + +* Minimum of version 8 required (earliest ivreg2 is ivreg28) + version 8 + +* If estimation used current ivreg2, pass control to ivreg211 subroutine below. +* If estimation used legacy ivreg2x, pass control to earlier version. + + if "`e(ivreg2cmd)'"=="ivreg2" { + ivreg211_p `0' + } + else if "`e(ivreg2cmd)'"=="ivreg210" { + ivreg210_p `0' + } + else if "`e(ivreg2cmd)'"=="ivreg29" { + ivreg29_p `0' + } + else if "`e(ivreg2cmd)'"=="ivreg28" { + ivreg28_p `0' + } + else { +di as err "Error - ivreg2 estimation missing e(ivreg2cmd) macro" + exit 601 + } + +end + + +* Main/current predict program: upgrade to v11.2 for FV handling +program define ivreg211_p +// version 8.2 + version 11.2 + syntax newvarname [if] [in] , [XB Residuals stdp] + marksample touse, novarlist + +* Check ivreg2 version is compatible. +* fwl becomes partial starting in ivreg2 02.2.07 + local vernum "`e(version)'" + if ("`vernum'" < "03.0.00") | ("`vernum'" > "09.9.99") { +di as err "Error: incompatible versions of ivreg2 and ivreg2_p." +di as err "Currently installed version of ivreg2 is `vernum'" +di as err "To update, from within Stata type " _c +di in smcl "{stata ssc install ivreg2, replace :ssc install ivreg2, replace}" + exit 601 + } + + local type "`xb'`residuals'`stdp'" + + if "`type'"=="" { + local type "xb" +di in gr "(option xb assumed; fitted values)" + } + +* e(partialcons) now always exists and is 1 or 0 + if e(partial_ct) { +* partial partial-out block + if "`type'" == "residuals" { + + tempvar esample + tempname ivres + gen byte `esample' = e(sample) + +* Need to strip out time series operators *** and FVs *** + local lhs "`e(depvar)'" +// tsrevar `lhs', substitute + fvrevar `lhs', substitute + local lhs_t "`r(varlist)'" + + local rhs : colnames(e(b)) +// tsrevar `rhs', substitute + fvrevar `rhs', substitute + local rhs_t "`r(varlist)'" + + if "`e(partial1)'" != "" { + local partial "`e(partial1)'" + } + else { + local partial "`e(partial)'" + } +// tsrevar `partial', substitute + fvrevar `partial', substitute + local partial_t "`r(varlist)'" + + if ~e(partialcons) { + local noconstant "noconstant" + } + + local allvars "`lhs_t' `rhs_t'" +* Partial-out block. Uses estimatation sample to get coeffs, markout sample for predict + _estimates hold `ivres', restore + foreach var of local allvars { + tempname `var'_partial + qui regress `var' `partial' if `esample', `noconstant' + qui predict double ``var'_partial' if `touse', resid + local allvars_partial "`allvars_partial' ``var'_partial'" + } + _estimates unhold `ivres' + + tokenize `allvars_partial' + local lhs_partial "`1'" + mac shift + local rhs_partial "`*'" + + tempname b + mat `b'=e(b) + mat colnames `b' = `rhs_partial' +* Use forcezero? + tempvar xb + mat score double `xb' = `b' if `touse' + gen `typlist' `varlist' = `lhs_partial' - `xb' + label var `varlist' "Residuals" + } + else { +di in red "Option `type' not supported with -partial- option" + error 198 + } + } + else if "`type'" == "residuals" { + tempname lhs lhs_t xb + local lhs "`e(depvar)'" +// tsrevar `lhs', substitute + fvrevar `lhs', substitute + local lhs_t "`r(varlist)'" + qui _predict `typlist' `xb' if `touse' + gen `typlist' `varlist'=`lhs_t'-`xb' + label var `varlist' "Residuals" + } +* Must be either xb or stdp + else { + _predict `typlist' `varlist' if `touse', `type' + } + +end diff --git a/ado/l/leebounds.ado b/ado/l/leebounds.ado new file mode 100644 index 0000000..852875b --- /dev/null +++ b/ado/l/leebounds.ado @@ -0,0 +1,961 @@ +******************************************************************************************************************************** +** LEE (2009) TREATMENT EFFECT BOUNDS ****************************************************************************************** +******************************************************************************************************************************** + +*! version 1.5 2013-07-17 ht +*! author Harald Tauchmann +*! Lee (2009) Treatment Effect Bounds + +capture program drop leebounds +program leebounds, eclass +version 11.1 +if !replay() { + quietly { + local cmd "leebounds" + local cmdline "`cmd' `*'" + syntax varlist(min=2 max=2) [if] [in] [pweight fweight iweight/], [SELect(varname)] [TIGht(varlist)] [CIEffect] [VCE(string asis)] [LEVel(real 10)] + ** TOKENIZE VARLIST ** + tokenize `varlist' + local yy "`1'" + local tr "`2'" + ** MANAGE MORE ** + local moreold `c(more)' + set more off + ** MANGE LEVEL ** + local clevel = `c(level)' + if `level' >= 50 & `level' < 100 { + local level = round(`level',0.01) + set level `level' + } + else { + set level `clevel' + local level = `clevel' + } + ** MANAGE IF ** + if "`if'" == "" { + local if2 = "if" + } + else { + local if2 = "`if' & " + } + ** TEMPORARY NAMES ** + tempvar __tempsel __tempt __cesamp __esamp __zz __wwsc __wwusc __tempid + tempname __selcat __res __resV __bb __bsq __mis __Vtest __csize __mcsize __micsize __macsize + tempfile __bsfile + ** CHECK and GENERATE SELECTION INDICATOR ** + if "`select'" != "" { + if "`weight'" == "" { + sum `select' `if2' `yy'<. + } + else { + sum `select' `if2' `yy'<. & `exp' >=0 & `exp' <. [iw=`exp'] + } + local cssel = r(sum) + tab `select' `if' `in', matrow(`__selcat') + if r(r) == 1 { + display as error "no variation in selection indicator `select'" + exit 109 + } + if r(r) > 2 | `__selcat'[1,1] !=0 | `__selcat'[2,1] !=1 | `cssel' == 0 { + display as error "selection indicator `select' incorrectly specified" + exit 109 + } + gen `__tempsel' = `select' `in' `if2' (`select' == 1 | `select' == 0) + local ss "`__tempsel'" + } + else { + gen `__tempsel' = `yy' <. `in' `if' + local ss "`__tempsel'" + if "`weight'" == "" { + sum `__tempsel' `in' `if' + } + else { + sum `__tempsel' `in' `if2' `exp' >=0 & `exp' <. [iw=`exp'] + } + if r(mean) == 1 { + display as error "all observations selected" + exit 109 + } + if r(mean) == 0 { + display as error "no observations selected" + exit 2000 + } + } + ** GENERATE DUMMY WEIGHTS ** + if "`exp'" == "" { + local exp "1" + local dw "pw" + } + else { + local dw "`weight'" + } + ** CHECK TREATMENT INDICATOR ** + egen `__tempt' = group(`tr') `in' `if' + replace `__tempt' = `__tempt'-1 + tab `__tempt' + if r(r) != 2 { + display as error "treatment indicator `tr' not binary" + exit 149 + } + ** CHECK SPECIFICATION OF OPTION VCE ** + if "`vce'" == "" { + local reps = 0 + } + else { + tokenize `"`vce'"', parse(",") + if "`4'" != "" { + di as error "option vce() incorrectly specified" + exit 198 + } + local 1 : list retokenize 1 + local 2 : list retokenize 2 + local 3 : list retokenize 3 + if "`1'" == "analytic" | "`1'" == "analyti" | "`1'" == "analyt" | "`1'" == "analy" | "`1'" == "anal" | "`1'" == "ana" { + local reps = 0 + } + else { + if "`1'" == "bootstrap" | "`1'" == "bootstra" | "`1'" == "bootstr" | "`1'" == "bootst" | "`1'" == "boots" | "`1'" == "boot" { + if "`2'" == "" & "`3'" == "" { + local reps = 50 + local dots "dots" + } + else { + if "`2'" == "," & ("`3'" == "dots" | "`3'" == "nodots" ) { + local reps = 50 + local dots "dots" + if "`3'" == "nodots" { + local dots "" + } + } + else { + if "`2'" == "," & "`3'" != "" { + local dots "dots" + local cdot "nodots" + local cdot2 : list cdot in 3 + if `cdot2' == 1 { + local dots "" + local 3 : list 3 - cdot + local 3 : list retokenize 3 + } + local cdot "dots" + local cdot2 : list cdot in 3 + if `cdot2' == 1 { + local dots "dots" + local 3 : list 3 - cdot + local 3 : list retokenize 3 + } + tokenize `"`3'"', parse("(") + if ("`2'" == "(") & ("`1'" == "reps" | "`1'" == "rep" |"`1'" == "re" |"`1'" == "r") { + tokenize `"`3'"', parse(")") + local rr = real("`1'") + if `rr' <. & `rr' > 1 & `rr'-floor(`rr') == 0 { + local reps = `1' + } + else { + di as error "suboption reps() incorrectly specified; must be integer > 1" + exit 126 + } + if "`3'" != "" { + di as error "only suboptions reps() and nodots allowed for vce(bootstrap)" + exit 198 + } + } + else { + di as error "only suboption reps() and nodots allowed for vce(bootstrap)" + exit 198 + } + } + else { + di as error "suboption reps() incorrectly specified" + exit 198 + } + } + } + } + else { + di as error "option vce() incorrectly specified; only vce(analytic) and vce(bootstrap) allowed" + exit 198 + } + } + } + ** SELECT RELEVANT SAMPLE FOR TIGHTENED BOUNDS ** + if "`tight'" != "" { + gen `__cesamp' = 1 `in' `if' + if "`select'" == "" { + gen `__esamp' = (`yy' !=. | (`yy' ==. & `ss' == 0)) & (`__tempt' == 1 | `__tempt' == 0) & (`ss' == 1 | `ss' == 0) & `__cesamp' == 1 + } + else { + gen `__esamp' = (`yy' !=. | (`yy' ==. & `ss' == 0)) & (`__tempt' == 1 | `__tempt' == 0) & (`ss' == 1 | `ss' == 0) & (`__tempsel' == 1 | `__tempsel' == 0) & `__cesamp' == 1 + } + ** GENERATE WEIGHTS ** + gen `__wwusc' = `exp' + replace `__esamp' = 0 if `__wwusc' >=. | `__wwusc' < 0 + preserve + keep if `__esamp' == 1 + ** RESCALE WEIGHTS + sum `__wwusc' + local wsumusc = r(sum) + gen `__wwsc' = `__wwusc'/r(mean) + sum `__wwsc' + ** WEIGHT CORRECTION FACTOR + if "`weight'" == "fweight" | "`weight'" == "iweight" { + local wcf = `wsumusc'/r(sum) + } + else { + local wcf = 1 + } + sum `ss' [iweight = `__wwsc'] + local samps = round(`wcf'*r(sum_w)) + local nsel = round(`wcf'*r(mean)*r(sum_w),1) + ** RE-CHECK TREATMENT INDICATOR ** + mean `ss' [pweight = `__wwsc'], over(`__tempt') + if _b[0] == 0 { + display as error "no information on `yy' for control group" + exit 2000 + } + if _b[1] == 0 { + display as error "no information on `yy' for treatment group" + exit 2000 + } + if _b[0] == _b[1] { + noisily: display as result "selection proportion exactly equal for both groups, no bounds computed" + exit 498 + } + if _b[0] > _b[1] { + replace `__tempt' = (`__tempt'-1)^2 + local trimmed "control" + } + else { + local trimmed "treatment" + } + ** CREATE CELLS ** + unab tight : `tight' + egen `__zz' = group(`tight') + ** CHECK CELL SIZE ** + tab `__zz' `__tempt' [iweight = `__wwsc'], matcell(`__csize') + mata: st_numscalar("`__mcsize'", min(st_matrix("`__csize'"))) + if `__mcsize' <= 0 { + display as error "cells without variation in treatment; change varlist specified by tight()" + restore + exit 2000 + } + mean `ss' [pweight = `__wwsc'], over(`__tempt' `__zz') + mat `__csize' = e(b) + mata: st_numscalar("`__micsize'", min(st_matrix("`__csize'"))) + if `__micsize' <= 0 { + display as error "cells without information on `yy' for one group; change varlist specified by tight()" + restore + exit 2000 + } + ** CHECK FOR HOMOGENEOUS SELECTION DIRECTION ACROSS CELLS ** + mat `__csize' = `__csize'[1,1..colsof(`__csize')/2]- `__csize'[1,1+colsof(`__csize')/2..colsof(`__csize')] + mata: st_numscalar("`__micsize'", min(st_matrix("`__csize'"))) + mata: st_numscalar("`__macsize'", max(st_matrix("`__csize'"))) + if `__micsize' < 0 & `__macsize' > 0 { + display as error "warning: heterogenous selection direction across cells; thightening may fail" + local cellsel "hetero" + } + else { + local cellsel "homo" + } + ** CALCULATE TIGHTENED LEE-BOUNDs + leetbound `yy' `__tempt' `ss' `__zz' `trimmed' `__wwusc' + mat `__res' = e(b) + mat `__resV' = e(V)/`wcf' + local otrim = e(trim) + local ocells = e(cells) + local cno : colfullnames `__res' + ** BOOTSTRAPPING ** + if `reps' > 1 { + keep `yy' `__tempt' `ss' `__zz' `__wwusc' + gen `__tempid' = _n + save `__bsfile' + local count = 0 + forvalues rr = 1/`reps' { + wbsample `__tempid' `__wwusc' `__tempt' `__bsfile' `exp' + capture leetbound `yy' `__tempt' `ss' `__zz' `trimmed' __tempw + mat `__mis' = matmissing(e(b)) + local mis = `__mis'[1,1] + local cnb : colfullnames e(b) + if _rc != 0 | `mis' != 0 | "`cnb'" != "`cno'" { + if "`dots'" == "dots" { + if `rr' == 1 { + noisily: display "" + } + if `rr'/50 == round(`rr'/50) | `rr' == `reps' { + noisily: display as error "x" as text " `rr'" + } + else { + noisily: display as error "x" _continue + } + } + if `rr' < `reps' { + continue + } + else { + local finalerror "finalerror" + } + } + if "`dots'" == "dots" & "finalerror" != "`finalerror'" { + if `rr' == 1 { + noisily: display "" + } + if `rr'/50 == round(`rr'/50) | `rr' == `reps' { + noisily: display as text ". `rr'" + } + else { + noisily: display as text "." _continue + } + } + if "finalerror" != "`finalerror'" { + local count = `count'+1 + if `count' == 1 { + mat `__bb' = e(b) + mat `__bsq' = e(b)'*e(b) + } + else { + mat `__bb' = `__bb' + e(b) + mat `__bsq' = `__bsq'+ e(b)'*e(b) + } + } + if `rr' == `reps' { + if `count' > 1 { + mat `__bb' = `__bb'/`count' + mat `__bsq' = `__bsq'/(`count'-1) + mat `__resV' = `__bsq' - `__bb''*`__bb'*(`count'/(`count'-1)) + mat `__resV' = `__resV'/`wcf' + } + else { + mat `__resV' = J(2,2,0) + mat colnames `__resV' = `cno' + mat rownames `__resV' = `cno' + } + } + } + } + restore + mat coleq `__res' = `tr' + mat coleq `__resV' = `tr' + mat roweq `__resV' = `tr' + ereturn post `__res' `__resV', depname(`yy') properties(b V) esample(`__esamp') + } + ** SELECT RELEVANT SAMPLE FOR SIMPLE BOUNDS ** + else { + gen `__cesamp' = 1 `if' `in' + if "`select'" == "" { + gen `__esamp' = (`yy' !=. | (`yy' ==. & `ss' == 0)) & (`__tempt' == 1 | `__tempt' == 0) & (`ss' == 1 | `ss' == 0) & `__cesamp' == 1 + } + else { + gen `__esamp' = (`yy' !=. | (`yy' ==. & `ss' == 0)) & (`__tempt' == 1 | `__tempt' == 0) & (`ss' == 1 | `ss' == 0) & (`__tempsel' == 1 | `__tempsel' == 0) & `__cesamp' == 1 + } + gen `__wwusc' = `exp' + ** GENERATE WEIGHTS ** + replace `__esamp' = 0 if `__wwusc' >=. | `__wwusc' < 0 + preserve + keep if `__esamp' == 1 + ** RESCALE WEIGHTS + sum `__wwusc' + local wsumusc = r(sum) + gen `__wwsc' = `__wwusc'/r(mean) + sum `__wwsc' + ** WEIGHT CORRECTION FACTOR + if "`weight'" == "fweight" | "`weight'" == "iweight" { + local wcf = `wsumusc'/r(sum) + } + else { + local wcf = 1 + } + sum `ss' [iweight = `__wwsc'] + local samps = round(`wcf'*r(sum_w)) + local nsel = round(`wcf'*r(mean)*r(sum_w)) + ** RE-CHECK TREATMENT INDICATOR ** + mean `ss' [pweight = `__wwsc'], over(`__tempt') + if _b[0] == 0 { + display as error "no information on `yy' for control group" + exit 2000 + } + if _b[1] == 0 { + display as error "no information on `yy' for treatment group" + exit 2000 + } + if _b[0] == _b[1] { + noisily: display as result "selection proportion exactly equal for both groups, no bounds computed" + exit 498 + } + if _b[0] > _b[1] { + replace `__tempt' = (`__tempt'-1)^2 + local trimmed "control" + } + else { + local trimmed "treatment" + } + ** CALCULATE SIMPLE LEE-BOUNDs + leesbound `yy' `__tempt' `ss' `trimmed' `__wwusc' + mat `__res' = e(b) + mat `__resV' = e(V)/`wcf' + local otrim = e(trim) + local cno : colfullnames `__res' + ** BOOTSTRAPPING ** + if `reps' > 1 { + keep `yy' `__tempt' `ss' `__wwusc' + gen `__tempid' = _n + save `__bsfile' + local count = 0 + forvalues rr = 1/`reps' { + wbsample `__tempid' `__wwusc' `__tempt' `__bsfile' `exp' + capture leesbound `yy' `__tempt' `ss' `trimmed' __tempw + mat `__mis' = matmissing(e(b)) + local mis = `__mis'[1,1] + local cnb : colfullnames e(b) + if _rc != 0 | `mis' != 0 | "`cnb'" != "`cno'" { + if "`dots'" == "dots" { + if `rr' == 1 { + noisily: display "" + } + if `rr'/50 == round(`rr'/50) | `rr' == `reps' { + noisily: display as error "x" as text " `rr'" + } + else { + noisily: display as error "x" _continue + } + } + if `rr' < `reps' { + continue + } + else { + local finalerror "finalerror" + } + } + if "`dots'" == "dots" & "finalerror" != "`finalerror'" { + if `rr' == 1 { + noisily: display "" + } + if `rr'/50 == round(`rr'/50) | `rr' == `reps' { + noisily: display as text ". `rr'" + } + else { + noisily: display as text "." _continue + } + } + if "finalerror" != "`finalerror'" { + local count = `count'+1 + if `count' == 1 { + mat `__bb' = e(b) + mat `__bsq' = e(b)'*e(b) + } + else { + mat `__bb' = `__bb' + e(b) + mat `__bsq' = `__bsq'+ e(b)'*e(b) + } + } + if `rr' == `reps' { + if `count' > 1 { + mat `__bb' = `__bb'/`count' + mat `__bsq' = `__bsq'/(`count'-1) + mat `__resV' = `__bsq' - `__bb''*`__bb'*(`count'/(`count'-1)) + mat `__resV' = `__resV'/`wcf' + } + else { + mat `__resV' = J(2,2,0) + mat colnames `__resV' = `cno' + mat rownames `__resV' = `cno' + } + } + } + } + restore + mat coleq `__res' = `tr' + mat coleq `__resV' = `tr' + mat roweq `__resV' = `tr' + ereturn post `__res' `__resV', depname(`yy') properties(b V) esample(`__esamp') + } + ** POST RESULTS ** + ereturn scalar N = `samps' + ereturn scalar Nsel = `nsel' + if "`tight'" != "" { + ereturn scalar cells = `ocells' + } + ereturn scalar trim = `otrim' + ereturn scalar level = `c(level)' + if "`weight'" != "" { + ereturn local wexp "= `exp'" + ereturn local wtype "`weight'" + } + ereturn local trimmed "`trimmed'" + ereturn local treatment "`tr'" + if "`select'" != "" { + ereturn local select "`select'" + } + ereturn local covariates "`tight'" + if "`tight'" != "" { + ereturn local cellsel "`cellsel'" + } + if `reps' > 1 { + ereturn scalar N_reps = `count' + ereturn local vcetype "Bootstrap" + ereturn local vce "bootstrap" + } + if `reps' == 0 { + ereturn local vce "analytic" + } + ereturn local title "Lee (2009) treatment effect bounds" + ereturn local cmdline `cmdline' + ereturn local cmd `cmd' + capture mat `__Vtest' = inv(e(V)) + if "`cieffect'" == "cieffect" { + if _rc == 0 { + leebci + ereturn scalar cilower = cilower + ereturn scalar ciupper = ciupper + scalar drop ciupper cilower + } + else { + ereturn local cilower "." + ereturn local ciupper "." + } + } + } + set level `clevel' + set more `moreold' + } + else { + if "`e(cmd)'" != "leebounds" { + error 301 + } + else { + syntax, [LEVel(real `e(level)')] + } + } + ** DISPLAY RESULTS ** + if "`e(covariates)'" != "" { + display _newline as text "Tightened Lee (2009) treatment effect bounds" + display _newline as text "Number of obs." _skip(20) as text " = " as result `e(N)' + display as text "Number of selected obs." _skip(11) as text " = " as result `e(Nsel)' + display as text "Number of cells" _skip(19) as text " = " as result `e(cells)' + display as text "Overall trimming porportion" _skip(7) as text " = " as result %-06.4f `e(trim)' + } + else { + display _newline as text "Lee (2009) treatment effect bounds" + display _newline as text "Number of obs." _skip(20) as text " = " as result `e(N)' + display as text "Number of selected obs." _skip(11) as text " = " as result `e(Nsel)' + display as text "Trimming porportion" _skip(15) as text " = " as result %-06.4f `e(trim)' + } + if "`e(cilower)'" != "" | "`e(ciupper)'" != "" { + if `e(cilower)' > 0 { + local psk "_skip(1)" + } + display as text "Effect `e(level)'% conf. interval" _skip(9) as text " : [" `psk' as result %-06.4f `e(cilower)' _skip(2) as result %-06.4f `e(ciupper)' as text "]" + } + display "" + ereturn display, level(`level') +end + +***************************************************************************** +** Compute Tightened Lee (2009) Bounds ************************************** +capture program drop leetbound +program leetbound, eclass +version 11.2 +args yy tt ss zz cc ww + tempvar __esamp __ysq __st __sit __group __wws + tempname __res __resV __ctst __vres __instfreq + ** Rescale Weights + gen `__wws' = `ww' + sum `__wws' + replace `__wws' = `__wws'/r(mean) + gen `__ysq' = (`yy')^2 + ** Cells ** + capture drop _instcat* + tab `zz', g(_instcat) + local ncat = r(r) + ** Overall Trimmed Means & Number of Trimmed Observations + mean `ss' [pweight = `__wws'], over(`tt') + local trim = 100*(_b[1]-_b[0])/_b[1] + local qtrim = `trim'/100 + local otrim = `qtrim' + _pctile `yy' if `ss' == 1 & `tt' == 1 [pweight = `__wws'], percentiles(`trim') + local uth = r(r1) + sum `__wws' if `ss' == 1 & `tt' == 1 & `yy' == `uth' + if r(sum) == 0 { + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' >= `uth' [iweight = `__wws'] + local tubov = r(mean) + } + else { + local neth = r(sum) + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' > `uth' [iweight = `__wws'] + local nbth = r(sum_w) + local sbth = r(sum) + sum `__wws' if `ss' == 1 & `tt' == 1 & `yy' !=. + local ntall = r(sum) + local stie = (`ntall'*(1-`qtrim')-`nbth')/`neth' + local tubov = (`sbth'+`stie'*`neth'*`uth')/(`nbth'+`stie'*`neth') + } + local itrim = 100-`trim' + _pctile `yy' if `ss' == 1 & `tt' == 1 [pweight = `__wws'], percentiles(`itrim') + local lth = r(r1) + sum `__wws' if `ss' == 1 & `tt' == 1 & `yy' == `lth' + if r(sum) == 0 { + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' <= `lth' [iweight = `__wws'] + local lubov = r(mean) + } + else { + local neth = r(sum) + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' < `lth' [iweight = `__wws'] + local nbth = r(sum_w) + local sbth = r(sum) + sum `__wws' if `ss' == 1 & `tt' == 1 & `yy' !=. + local ntall = r(sum) + local stie = (`ntall'*(1-`qtrim')-`nbth')/`neth' + local lubov = (`sbth'+`stie'*`neth'*`lth')/(`nbth'+`stie'*`neth') + } + ** BY CELL ** + forvalues instv = 1/`ncat' { + tab `ss' `tt' if _instcat`instv' == 1 [iweight = `__wws'], matcell(`__ctst') + local nall = r(N) + mat `__ctst' = `__ctst'/`nall' + local est = `__ctst'[2,2] + local esnt = `__ctst'[2,1] + local et = `__ctst'[1,2]+`__ctst'[2,2] + local oddsc = `__ctst'[1,1]/`__ctst'[2,1] + local oddst = `__ctst'[1,2]/`__ctst'[2,2] + ** Estimate Cell's Weight + sum `yy' if `ss' == 1 & `tt' == 0 & _instcat`instv' == 1 [iweight = `__wws'] + local __instfreql = r(sum_w) + local __instfrequ = r(sum_w) + ** Trimming Proportion + mean `ss' if _instcat`instv' == 1 [pweight = `__wws'], over(`tt') + local trim = 100*(_b[1]-_b[0])/_b[1] + local qtrim = `trim'/100 + if `trim' > 0 & `trim' < 100 { + _pctile `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 [iweight = `__wws'], percentiles(`trim') + local uth = r(r1) + } + else { + sum `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 [iweight = `__wws'] + if `trim' <= 0 { + local uth = r(min) + } + if `trim' >= 100 { + local uth = r(max) + } + } + sum `__wws' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' == `uth' + if r(sum) == 0 { + sum `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' >= `uth' [iweight = `__wws'] + local tub`instv' = r(mean) + ** Analytic Variance + local vp = (1-`qtrim')^2*(`oddst'/(`et'*`nall')+`oddsc'/((1-`et')*`nall')) + local vb1 = r(Var)/r(sum_w) + local vb2 = (`uth'-`tub`instv'')^2*((`qtrim')/(1-`qtrim'))/(`est'*`nall') + local vb3 = ((`uth'-`tub`instv'')/(1-`qtrim'))^2*`vp' + local vub`instv' = `vb1'+`vb2'+`vb3' + } + else { + local neth = r(sum) + sum `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' > `uth' [iweight = `__wws'] + local nbth = r(sum_w) + local sbth = r(sum) + sum `__wws' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' !=. + local ntall = r(sum) + local stie = (`ntall'*(1-`qtrim')-`nbth')/`neth' + local tub`instv' = (`sbth'+`stie'*`neth'*`uth')/(`nbth'+`stie'*`neth') + ** Analytic Variance + sum `__ysq' if `ss' == 1 & `tt' == 1 & `yy' > `uth' & _instcat`instv' == 1 [iweight = `__wws'] + local vp = (1-`qtrim')^2*(`oddst'/(`et'*`nall')+`oddsc'/((1-`et')*`nall')) + local vb1 = ((r(sum)+`stie'*`neth'*(`uth')^2)/(`nbth'+`stie'*`neth')-(`tub`instv'')^2)/(`nbth'+`stie'*`neth') + local vb2 = (`uth'-`tub`instv'')^2*(`qtrim')/((1-`qtrim')*`est'*`nall') + local vb3 = ((`uth'-`tub`instv'')/(1-`qtrim'))^2*`vp' + local vub`instv' = `vb1'+`vb2'+`vb3' + } + local itrim = 100-`trim' + if `itrim' > 0 & `itrim' < 100 { + _pctile `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 [pweight = `__wws'], percentiles(`itrim') + local lth = r(r1) + } + else { + sum `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 [iweight = `__wws'] + if `itrim' <= 0 { + local lth = r(min) + } + if `itrim' >= 100 { + local lth = r(max) + } + } + sum `__wws' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' == `lth' + if r(sum) == 0 { + sum `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' <= `lth' [iweight = `__wws'] + local lub`instv' = r(mean) + ** Analytic Variance + local vp = (1-`qtrim')^2*(`oddst'/(`et'*`nall')+`oddsc'/((1-`et')*`nall')) + local vb1 = r(Var)/r(sum_w) + local vb2 = (`lth'-`lub`instv'')^2*((`qtrim')/(1-`qtrim'))/(`est'*`nall') + local vb3 = ((`lth'-`lub`instv'')/(1-`qtrim'))^2*`vp' + local vlb`instv' = `vb1'+`vb2'+`vb3' + } + else { + local neth = r(sum) + sum `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' < `lth' [iweight = `__wws'] + local nbth = r(sum_w) + local sbth = r(sum) + sum `__wws' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' !=. + local ntall = r(sum) + local stie = (`ntall'*(1-`qtrim')-`nbth')/`neth' + local lub`instv' = (`sbth'+`stie'*`neth'*`lth')/(`nbth'+`stie'*`neth') + ** Analytic Variance + sum `__ysq' if `ss' == 1 & `tt' == 1 & `yy' < `lth' & _instcat`instv' == 1 [iweight = `__wws'] + local vp = (1-`qtrim')^2*(`oddst'/(`et'*`nall')+`oddsc'/((1-`et')*`nall')) + local vb1 = ((r(sum)+`stie'*`neth'*(`lth')^2)/(`nbth'+`stie'*`neth')-(`lub`instv'')^2)/(`nbth'+`stie'*`neth') + local vb2 = (`lth'-`lub`instv'')^2*(`qtrim')/((1-`qtrim')*`est'*`nall') + local vb3 = ((`lth'-`lub`instv'')/(1-`qtrim'))^2*`vp' + local vlb`instv' = `vb1'+`vb2'+`vb3' + } + ** Weighted Sum ** + if `instv' == 1 { + local uwsum = `__instfrequ' + local lwsum = `__instfreql' + local ubttreat = `__instfrequ'*`tub`instv'' + local lbttreat = `__instfreql'*`lub`instv'' + local ubttreat_sq = `__instfrequ'*(`tub`instv'')^2 + local lbttreat_sq = `__instfreql'*(`lub`instv'')^2 + local vub = (`__instfrequ')^2*(`vub`instv'') + local vlb = (`__instfreql')^2*(`vlb`instv'') + } + else { + local uwsum = `uwsum'+`__instfrequ' + local lwsum = `lwsum'+`__instfreql' + local ubttreat = `ubttreat'+`__instfrequ'*`tub`instv'' + local lbttreat = `lbttreat'+`__instfreql'*`lub`instv'' + local ubttreat_sq = `ubttreat_sq'+`__instfrequ'*(`tub`instv'')^2 + local lbttreat_sq = `lbttreat_sq'+`__instfreql'*(`lub`instv'')^2 + local vub = `vub'+(`__instfrequ')^2*(`vub`instv'') + local vlb = `vlb'+(`__instfreql')^2*(`vlb`instv'') + } + if `instv' == `ncat' { + sum `yy' if `tt' == 0 & `ss' == 1 [iweight = `__wws'] + local vc = r(Var)/r(sum_w) + local vub = `vub'/(`uwsum')^2+((`ubttreat_sq'/`uwsum')-(`ubttreat'/`uwsum')^2)/`ntall'+`vc' + local vlb = `vlb'/(`lwsum')^2+((`lbttreat_sq'/`lwsum')-(`lbttreat'/`lwsum')^2)/`ntall'+`vc' + local ubttreat = `ubttreat'/`uwsum'-r(mean) + local lbttreat = `lbttreat'/`lwsum'-r(mean) + } + } + if "`cc'" != "control" { + matrix `__res' = (`lbttreat', `ubttreat') + } + else { + matrix `__res' = -1*(`ubttreat', `lbttreat') + } + local varmis = matmissing(`__res') + if `varmis' == 1 { + display as error "cannot compute tightened bounds; change varlist specified by tight()" + capture restore + exit 2000 + } + matrix colnames `__res' = `tt':lower `tt':upper + local cn : colfullnames `__res' + if "`cc'" != "control" { + matrix `__vres' = (`vlb',`vub') + } + else { + matrix `__vres' = (`vub',`vlb') + } + matrix `__resV' = diag(`__vres') + local varmis = matmissing(`__resV') + if `varmis' == 1 { + matrix `__resV' = J(2,2,0) + display as error "warning: cannot compute analytic variance; change varlist specified by tight()" + } + matrix colnames `__resV' = `cn' + matrix rownames `__resV' = `cn' + ereturn post `__res' `__resV', depname(`yy') properties(b V) + ereturn scalar cells = `ncat' + ereturn scalar trim = `otrim' +end + +***************************************************************** +** Basic Lee (2005) Bounds ************************************** +capture program drop leesbound +program leesbound, eclass +version 11.2 +args yy tt ss cc ww + tempvar __esamp __ysq __st __sit __wws + tempname __res __resV __ctst __vres + ** RESCALING WEIGHTS ** + gen `__wws' = `ww' + sum `__wws' + replace `__wws' = `__wws'/r(mean) + gen `__ysq' = (`yy')^2 + tab `ss' `tt' [iweight = `__wws'], matcell(`__ctst') + local nall = r(N) + mat `__ctst' = `__ctst'/`nall' + local est = `__ctst'[2,2] + local esnt = `__ctst'[2,1] + local et = `__ctst'[1,2]+`__ctst'[2,2] + local oddsc = `__ctst'[1,1]/`__ctst'[2,1] + local oddst = `__ctst'[1,2]/`__ctst'[2,2] + mean `ss' [pweight = `ww'], over(`tt') + local trim = 100*(_b[1]-_b[0])/_b[1] + local qtrim = `trim'/100 + local nall = round(`nall') + _pctile `yy' if `ss' == 1 & `tt' == 1 [pweight = `__wws'], percentiles(`trim') + local uth = r(r1) + sum `__wws' if `ss' == 1 & `tt' == 1 & `yy' == `uth' + if r(sum) == 0 { + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' >= `uth' [iweight = `__wws'] + local tub = r(mean) + ** Analytic Variance + local vp = (1-`qtrim')^2*(`oddst'/`et'+`oddsc'/(1-`et')) + local vb1 = r(Var)/r(sum_w) + local vb2 = (`uth'-`tub')^2*(`qtrim')*(`est'*(1-`qtrim'))^-1 + local vb3 = ((`uth'-`tub')/(1-`qtrim'))^2*`vp' + sum `yy' if `ss' == 1 & `tt' == 0 + local vc = r(Var)/`esnt' + local vub = `vb1'+(`vb2'+`vb3'+`vc')/`nall' + } + else { + local neth = r(sum) + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' > `uth' [iweight = `__wws'] + local nbth = r(sum_w) + local sbth = r(sum) + sum `__wws' if `ss' == 1 & `tt' == 1& `yy' !=. + local ntall = r(sum) + local stie = (`ntall'*(1-`qtrim')-`nbth')/`neth' + local tub = (`sbth'+`stie'*`neth'*`uth')/(`nbth'+`stie'*`neth') + ** Analytic Variance + local vp = (1-`qtrim')^2*(`oddst'/`et'+`oddsc'/(1-`et')) + sum `__ysq' if `ss' == 1 & `tt' == 1 & `yy' > `uth' [iweight = `__wws'] + local vb1 = ((r(sum)+`stie'*`neth'*(`uth')^2)/(`nbth'+`stie'*`neth')-(`tub')^2)/(`nbth'+`stie'*`neth') + local vb2 = (`uth'-`tub')^2*(`qtrim')*(`est'*(1-`qtrim'))^-1 + local vb3 = ((`uth'-`tub')/(1-`qtrim'))^2*`vp' + sum `yy' if `ss' == 1 & `tt' == 0 [iweight = `__wws'] + local vc = r(Var)/`esnt' + local vub = `vb1'+(`vb2'+`vb3'+`vc')/`nall' + } + sum `yy' if `ss' == 1 & `tt' == 0 [iweight = `__wws'] + local ubtreat = `tub'-r(mean) + local itrim = 100-`trim' + _pctile `yy' if `ss' == 1 & `tt' == 1 [pweight = `__wws'], percentiles(`itrim') + local lth = r(r1) + sum `__wws' if `ss' == 1 & `tt' == 1 & `yy' == `lth' + if r(sum) == 0 { + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' <= `lth' [iweight = `__wws'] + local lub = r(mean) + ** Analytic Variance + local vp = (1-`qtrim')^2*(`oddst'/`et'+`oddsc'/(1-`et')) + local vb1 = r(Var)/r(sum_w) + local vb2 = (`lth'-`lub')^2*(`qtrim')*(`est'*(1-`qtrim'))^-1 + local vb3 = ((`lth'-`lub')/(1-`qtrim'))^2*`vp' + sum `yy' if `ss' == 1 & `tt' == 0 [iweight = `__wws'] + local vc = r(Var)/`esnt' + local vlb = `vb1'+(`vb2'+`vb3'+`vc')/`nall' + } + else { + local neth = r(sum) + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' < `lth' [iweight = `__wws'] + local nbth = r(sum_w) + local sbth = r(sum) + sum `__wws' if `ss' == 1 & `tt' == 1 & `yy' !=. + local ntall = r(sum) + local stie = (`ntall'*(1-`qtrim')-`nbth')/`neth' + local lub = (`sbth'+`stie'*`neth'*`lth')/(`nbth'+`stie'*`neth') + ** Analytic Variance + local vp = (1-`qtrim')^2*(`oddst'/`et'+`oddsc'/(1-`et')) + sum `__ysq' if `ss' == 1 & `tt' == 1 & `yy' < `lth' [iweight = `__wws'] + local vb1 = ((r(sum)+`stie'*`neth'*(`lth')^2)/(`nbth'+`stie'*`neth')-(`lub')^2)/(`nbth'+`stie'*`neth') + local vb2 = (`lth'-`lub')^2*(`qtrim')*(`est'*(1-`qtrim'))^-1 + local vb3 = ((`lth'-`lub')/(1-`qtrim'))^2*`vp' + sum `yy' if `tt' == 0 & `ss' == 1 [iweight = `__wws'] + local vc = r(Var)/`esnt' + local vlb = `vb1'+(`vb2'+`vb3'+`vc')/`nall' + } + sum `yy' if `ss' == 1 & `tt' == 0 [iweight = `__wws'] + local lbtreat = `lub'-r(mean) + if "`cc'" != "control" { + matrix `__res' = (`lbtreat' , `ubtreat') + } + else { + matrix `__res' = -1*(`ubtreat', `lbtreat') + } + local varmis = matmissing(`__res') + if `varmis' == 1 { + display as error "cannot compute bounds" + capture restore + exit 2000 + } + matrix colnames `__res' = `tt':lower `tt':upper + local cn : colfullnames `__res' + if "`cc'" != "control" { + matrix `__vres' = (`vlb',`vub') + } + else { + matrix `__vres' = (`vub',`vlb') + } + matrix `__resV' = diag(`__vres') + local varmis = matmissing(`__resV') + if `varmis' == 1 { + matrix `__resV' = J(2,2,0) + display as error "warning: cannot compute analytic variance" + } + matrix colnames `__resV' = `cn' + matrix rownames `__resV' = `cn' + ereturn post `__res' `__resV', depname(`yy') properties(b V) + ereturn scalar trim = `qtrim' +end + +********************************************************************** +** Confidence Intervals for Bounds *********************************** +capture program drop leebci +program leebci, rclass +version 11.2 + local cs = invnormal(1-(100-`c(level)')/100) + local ce = invnormal(1-(100-`c(level)')/200) + local qd = 10^15 + forvalues cc = `cs'(0.001)`ce' { + local qdn = ((normal(`cc'+(_b[upper]-_b[lower])/max(_se[lower], _se[upper]))-normal(-`cc')) - (1-(100-`c(level)')/100))^2 + if `qdn' < `qd' { + local qd = `qdn' + local cnn = `cc' + } + } + scalar cilower = _b[lower]-_se[lower]*`cnn' + scalar ciupper = _b[upper]+_se[upper]*`cnn' +end + +********************************************************************* +** Weighted Bootstrap *********************************************** +capture program drop wbsample +program wbsample, nclass +version 11.1 + args id ww gg ff wexp + ** TEMPORARY NAMES ** + tempvar __ww2 __repl __fww0 __fww1 + if "`wexp'" == "1" { + capture drop __tempw + gen __tempw =. + bsample, strata(`gg') weight(__tempw) + } + else { + sum `ww' if `ww' > 0 + gen `__ww2' = floor(`ww'/r(min)) + replace `__ww2' = `__ww2'+ rbinomial(1,(`ww'/r(min))-floor(`ww'/r(min))) if (`ww'/r(min))-floor(`ww'/r(min)) != 0 + keep `id' `__ww2' `gg' + expand `__ww2', gen(`__repl') + sort `id' `__repl' + capture drop `__fww0' __tempw `__fww1' + gen `__fww0' =. + sum `__repl' if `gg' == 0 + local on = round((1-r(mean))*r(N)) + bsample `on' if `gg' == 0 & `__ww2' > 0 & `__ww2' <., weight(`__fww0') + by `id', sort: egen __tempw = total(`__fww0') + capture drop `__fww0' + gen `__fww0' =. + sum `__repl' if `gg' == 1 + local on = round((1-r(mean))*r(N)) + bsample `on' if `gg' == 1 & `__ww2' > 0 & `__ww2' <., weight(`__fww0') + by `id', sort: egen `__fww1' = total(`__fww0') + replace __tempw = __tempw+`__fww1' + keep if `__repl' == 0 + keep `id' __tempw + sort `id' + merge 1:1 `id' using `ff' + } +end diff --git a/ado/l/leebounds.sthlp b/ado/l/leebounds.sthlp new file mode 100644 index 0000000..c0e49f6 --- /dev/null +++ b/ado/l/leebounds.sthlp @@ -0,0 +1,221 @@ +{smcl} +{* *! version 1.0 3mar2011}{...} +{cmd:help orderalpha} +{hline} + +{title:Title} + +{p2colset 5 20 22 2}{...} +{phang} +{bf:leebounds} {hline 2} Lee (2009) treatment effect bounds{p_end} +{p2colreset}{...} + +{title:Syntax} + +{p 8 17 2} +{cmd:leebounds} +{it:{help varname:depvar}} {it:{help varname:treatvar}} {ifin} {weight}, [{cmd:}{it:{help leebounds##options:options}}] + + +{synoptset 28 tabbed}{...} +{marker Outcome_and_treatment}{...} +{synopthdr :Outcome and treatment} +{synoptline} +{syntab :Model} +{synopt :{it:{help varname:depvar}}}dependent variable{p_end} +{synopt :{it:{help varname:treatvar}}}binary treatment indicator{p_end} + +{synoptset 28 tabbed}{...} +{synopthdr :options} +{synoptline} +{syntab :Main} +{synopt :{opth {ul on}sel{ul off}ect(varname)}}selection indicator {p_end} +{synopt :{opth {ul on}tig{ul off}ht(varlist)}}covariats for tightened bounds {p_end} +{synopt :{opt cie:ffect}}compute confidence interval for treatment effect {p_end} + +{syntab :SE/Bootstrap} +{space 6}{cmd:vce(}{ul on}{it:ana}{ul off}{it:lytic}|{help bootstrap:{ul on}{it:boot}{ul off}{it:strap}}{cmd:)} {space 3} compute analytic or bootstrapped standard errors; {opt vce(analytic)} is the default. + +{syntab :Reporting} +{synopt :{opt lev:el(#)}}set confidence level; default is {opt level(95)}{p_end} +{synoptline} +{p2colreset}{...} +{p 4 6 2} +{opt pweights} (default), {opt fweights}, and {opt iweights} are allowed, {opt aweights} are not allowed; see {help weight}. Observations with negative weight are skipped for any weight type.{p_end} +{p 4 6 2}{cmd:bootstrap} is allowed, {cmd:by} and {cmd:svy} are not allowed; see {help prefix}.{p_end} + + + +{title:Description} + +{pstd} +{cmd:leebounds} computes treatment effect bounds for samples with non-random sample selection/attrition as proposed by Lee (2009). The lower and upper bound, +respectively, correspond to extreme assumptions about the missing information that are consistent with the observed data. As opposed to parametric +approaches to correcting for sample selection bias, such as the classical Heckman (1979) estimator, Lee (2009) bounds rest on very few assumptions, i.e. random assignment +of treatment and monotonicity. Monotonicity means that the treatment status affects selection in just one direction. That is, receiving a treatment makes selection either +more or less likely for any observation. In technical terms, the approach rests on a trimming procedure. Either from below or from above, the group (treatment, control) +that suffers less from sample attrition is trimmed at the quantile of the outcome variable that corresponds to the share of 'excess observations' in this group. Calculating +group differentials in mean outcome yields the lower and the upper bound, respectively, for the treatment effect depending on whether trimming is from below or above. +{cmd:leebounds} assumes that it is unknown, a priori, which group (treatment, control) is subject to the higher selection probability and estimates this from data +(see Lee, 2009:1090). + + +{title:Outcome and treatment} + +{dlgtab:Model} + +{phang} +{opt depvar} specifies the outcome variable. + +{phang} +{opt treatvar} specifies a binary variable, indicating receipt of treatment. Estimating the effect of {it:treatvar} +on {it: depvar} is subject of the empirical analysis. The lager value of {it:treatvar} is assumed to indicate treatment. + + +{marker options}{...} +{title:Options} + +{dlgtab:Main} + + +{phang} +{opt select(varname)} specifies a binary selection indicator. {it:treatvar} my only take the value zero or unity. If no selction indicator {it:varname} is specified, any observation with non-missing +information on {it:depvar} is assumed to be selected while all observations with missing information on {it:depvar} are assumed to be not selected. + +{phang} +{opt tight(varlist)} specifies a list of covariates for computing tightened bounds. With {opt tight()} specified, the sample is splitted into into cells defined by +the covariates in {it:varlist}. Trimmed means are calculated separately for each cell, where the trimming proportion is specific to each cell. Finally, a weighted average of trimmed means is calculated. +Continuous variables may, hence, not enter {it:varlist} without afore being converted to categorical variables. Specifying to many cells by including numerous +variables in {it:varlist}, or by including variables that take numerous different values, will cause error. + +{phang} +{opt cieffect} requests calculation of a confidence interval for the treatment effect. Note that this interval is narrower than the conjunction +of confidence intervals for the estimated bounds (see Lee, 2009:1089; Imbens and Manski, 2004). This interval captures both, uncertainty +about the bias due to non-random sample attrition and uncertainty because of sampling error. + +{dlgtab:SE/Bootstrap} + +{phang} +{opt vce(analytic|bootstrap)} specifies whether analytic or bootstrapped standard errors are calculated for estimated bounds. {it:analytic} +is the default. {it:bootstrap} allows for the suboptions {opt r:eps(#)} and {opt nodots}; see {help bootstrap:bootstrap}. For {opt vce(analytic)} +the covariance for the estimated lower and upper bound is not computed. If this covariance is of relevance, one should choose {opt vce(bootstrap)}. +Instead of specifying {opt vce(bootstrap)} one may alternatively use the {help prefix:prefix} command {cmd:bootstrap}, which allows for numerous additional options. +Yet {cmd:leebounds}' internal bootstrapping routine is much faster than the prefix command, allows for sampling weights by +performing a weighted bootstrap, and makes the option {opt cieffect} use bootstrapped standard errors, too. + +{dlgtab:Reporting} + +{phang} +{opt level(#)}; see {helpb estimation options##level():[R] estimation options}. One may change the reported confidence level by retyping +{cmd:leebounds} without arguments and only specifying the option {opt level(#)}. However, this affects only the confidence interval for the +bounds, but not for the confidence interval requested with {opt cieffect}. + + +{title:Examples} + +{pstd}Basic syntax{p_end} +{phang2}{cmd:. leebounds wage training}{p_end} + +{pstd}Tightened Lee bounds with weighted bootstrap and treatment effect-confidence interval{p_end} +{phang2}{cmd:. leebounds wage training [pw=1/prob], select(wageinfo) tight(female immigrant) cieffect vce(boot, reps(250) nodots)}{p_end} + + +{title:Saved results} + +{pstd} +{cmd:leebounds} saves the following in {cmd:e()}: + +{synoptset 20 tabbed}{...} +{p2col 5 20 24 2: Scalars}{p_end} +{synopt:{cmd:e(N)}}number of observations{p_end} +{synopt:{cmd:e(Nsel)}}number of selected observations{p_end} +{synopt:{cmd:e(trim)}}(overall) trimming proportion{p_end} +{synopt:{cmd:e(cells)}}number of cells (only saved for {opt tight()}){p_end} +{synopt:{cmd:e(cilower)}}lower bound of treatment effect-confidence interval (only saved for {opt cieffect}){p_end} +{synopt:{cmd:e(ciupper)}}upper bound of treatment effect-confidence interval (only saved for {opt cieffect}){p_end} +{synopt:{cmd:e(level)}}confidence level{p_end} +{synopt:{cmd:e(N_reps)}}number of bootstrap repetitions (only saved for {opt vce(bootstrap)}){p_end} + +{synoptset 20 tabbed}{...} +{p2col 5 20 24 2: Macros}{p_end} +{synopt:{cmd:e(cmd)}}{cmd:leebounds}{p_end} +{synopt:{cmd:e(cmdline)}}command as typed{p_end} +{synopt:{cmd:e(title)}}{cmd:Lee (2009) treatment effect bounds}{p_end} +{synopt:{cmd:e(vce)}}either {opt analytic} or {opt bootstrap}{p_end} +{synopt:{cmd:e(vcetype)}}{cmd:Bootstrap} for {opt vce(bootstrap)}{p_end} +{synopt:{cmd:e(depvar)}}{it:depvar}{p_end} +{synopt:{cmd:e(treatment)}}{it:treatvar}{p_end} +{synopt:{cmd:e(select)}}{it:varname} (only saved for {opt select()}){p_end} +{synopt:{cmd:e(cellsel)}}cell-specific selection pattern, either {opt homo}, or {opt hetero} (only saved for {opt tight()}){p_end} +{synopt:{cmd:e(covariates)}}{it:varlist} (only saved for {opt tight()}){p_end} +{synopt:{cmd:e(trimmed)}}either {opt treatment} or {opt control}{p_end} +{synopt:{cmd:e(wtype)}}either {opt pweight}, {opt fweight}, or {opt iweight} (only saved if weights are specified){p_end} +{synopt:{cmd:e(wexp)}}= {it: exp} (only saved if weights are specified){p_end} +{synopt:{cmd:e(properties)}}{opt b V}{p_end} + +{synoptset 20 tabbed}{...} +{p2col 5 20 24 2: Matrices}{p_end} +{synopt:{cmd:e(b)}}{it:1x2} vector of estimated treatment effect bounds ({it:colnames} are of the form {it: treatvar:lower} and {it: treatvar:upper}){p_end} +{synopt:{cmd:e(V)}}{it:2x2} variance-covariance matrix for estimated treatment effect bounds (covariance set to zero for {opt vce(analytic)}){p_end} + +{synoptset 20 tabbed}{...} +{p2col 5 20 24 2: Functions}{p_end} +{synopt:{cmd:e(sample)}}marks estimation sample{p_end} +{p2colreset}{...} + + +{title:References} + +{pstd} +Heckman, J.J. (1979). Sample Selection Bias as a Specification Error. {it: Econometrica} 47, 153–161. + +{pstd} +Imbens, G.W. and C.F. Manski (2004). Confidence Intervals for Partially Identified Parameters. {it: Econometrica} 72, +1845–1857. + +{pstd} +Lee, D.S. (2009). Training, Wages, and Sample Selection: Estimating Sharp Bounds on Treatment +Effects. {it: Review of Economic Studies} 76, 1071–1102. + + +{title:Also see} + +{psee} +Manual: {manlink R heckman} + +{psee} +{space 2}Help: {manhelp heckman R:heckman}{break} + +{psee} +Online: {helpb bpbounds}, {helpb bpboundsi}, {helpb mhbounds}{p_end} + + +{title:Author} + +{psee} +Harald Tauchmann{p_end} +{psee} +Rheinisch-Westfälisches Institut für Wirtschaftsforschung (RWI){p_end} +{psee} +Essen, Germany{p_end} +{psee} +E-mail: harald.tauchmann@rwi-essen.de +{p_end} + + +{title:Disclaimer} + +{pstd} This software is provided "as is" without warranty of any kind, either expressed or implied. The entire risk as to the quality and +performance of the program is with you. Should the program prove defective, you assume the cost of all necessary servicing, repair or +correction. In no event will the copyright holders or their employers, or any other party who may modify and/or redistribute this software, +be liable to you for damages, including any general, special, incidental or consequential damages arising out of the use or inability to +use the program. +{p_end} + + +{title:Acknowledgements} + +{pstd} +This work has been supported in part by the Collaborative Research Center "Statistical Modelling of +Nonlinear Dynamic Processes" (SFB 823) of the German Research Foundation (DFG). +{p_end} diff --git a/ado/l/livreg2.mlib b/ado/l/livreg2.mlib new file mode 100644 index 0000000000000000000000000000000000000000..457ac3338bb1d37dfb13c0144707ea1f5141d00b GIT binary patch literal 262968 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 Ym~|!H-mhkz=)*DV)NeTJz@2sf3q55wGynhq literal 0 HcmV?d00001 diff --git a/ado/o/outreg2.ado b/ado/o/outreg2.ado new file mode 100644 index 0000000..217dc73 --- /dev/null +++ b/ado/o/outreg2.ado @@ -0,0 +1,10482 @@ +*! outreg2 2.3.2 17aug2014 by roywada@hotmail.com +*! based on outreg 3.0.6/4.0.0 by john_gallup@alum.swarthmore.edu + +prog define outreg2, by(onecall) sortpreserve + versionSet + version `version' + +tempname coefActive +cap _estimates hold `coefActive', restore copy nullok /* capture for prior to Stata 8.2 */ + +local behind `"`0'"' +local 0 "" +gettoken front behind: behind, parse(" ,") +local 0 "" +local done 0 +while `"`front'"'~="" & `done'==0 { + if `"`front'"'=="using" { + + gettoken rest behind: behind, parse(" ,") + * strip off quotes + gettoken first second: rest, parse(" ") + cap local rest: list clean local(rest) + + * take off colon at the end + local goldfish "" + if index(`"`rest'"',":")~=0 { + local end=substr(`"`rest'"',length(`"`rest'"'),length(`"`rest'"')) + if "`end'"==":" { + local rest=substr(`"`rest'"',1,`=length(`"`rest'"')-1') + local goldfish " : " + } + } + * colon reattached with a space at the end + * .txt attached here for seeout working with _pref.ado + local rabbit `"""' + if index(`"`rest'"', ".")==0 { + local using `"`rabbit'`rest'.txt`rabbit'`goldfish'"' + } + else { + local using `"`rabbit'`rest'`rabbit'`goldfish'"' + } + local 0 `"`0' using `using' `behind'"' + local done 1 + } + else { + local 0 `"`0' `front'"' + gettoken front behind: behind, parse(" ,") + } +} + +gettoken first second : 0, parse(":") `bind' match(par) quotes +local 0 `"`first'"' +while `"`first'"'~=":" & `"`first'"'~="" { + gettoken first second : second, parse(":") `bind' match(par) quotes +} +if `"`0'"'==":" { + * colon only when shorthand combined with prefix + local 0 +} +else { + local _0 `"`0'"' +} + +*** check for conflicts here due to drop(`_byvars') +syntax [anything] [using] [if] [in] [pweight fweight aweight iweight] [, drop(str) keep(str) * ] +if "`drop'"~="" & "`keep'"~="" { + di in red "cannot specify both {opt keep( )} and {opt drop( )}" + exit 198 +} +if "`drop'"~="" & "`varlist'"~="" { + di in red "cannot specify both {it:varlist} and {opt drop( )}" + exit 198 +} + +*** shorthand syntax if [using] is missing +syntax [anything] [using] [if] [in] [pweight fweight aweight iweight] [, SEEout REPLACE NOSEEOUT NOREPLACE CROSStab AGAIN * CDOUT] + +*** bys( ): by(onecall) indicated by `_byvars' only + +* goes with `second' +if `"`second'"'~="" { + local _colon ":" +} + +if "`_byvars'"~="" { + bys `_byvars' : outreg2_by `0' `_colon' `second' +} +else if "`crosstab'"~="" { + outreg2_by `0' `_colon' `second' +} +else { + * regular stuff + if `"`using'"'~="" { + * both prefix full syntax and regular non-prefix usage + * `second' could contain " " only + version `version' : `second' + _outreg2 `0' + } + else { + * prefix shorthand synatx + syntax [anything] [, REPLACE SEEout APpend cdout] + + version `version' : `second' + + *** read the set preference if not out of date + + * NOTE: `0' is written over below + + cap quietly findfile outreg2.pref + if _rc~=0 & "`Version7'"~="" { + * create it if missing + findfile outreg2.ado + local place=substr(`"`r(fn)'"',1,`=length(`"`r(fn)'"')-11') + + tempname myplace + cap file open `myplace' using `"`place'outreg2.pref"', write text replace + cap file write `myplace' "" _n + cap file write `myplace' "" _n + cap file write `myplace' "" + cap file close `myplace' + } + + tempname myfile + cap file open `myfile' using `"`r(fn)'"', read text + cap file read `myfile' date + cap file read `myfile' pref + cap file read `myfile' options + cap file close `myfile' + + * fix _comma + local _comma "" + if `"`macval(options)'"'~="" | "`replace'"~="" | "`seeout'"~="" | "`cdout'"~="" { + local _comma "," + } + + if "`date'"== "`c(current_date)'" { + local seecommand "outreg2" + local precommand "_outreg2" + foreach var in anything macval(pref) _comma macval(options) replace seeout cdout { + if `"``var''"'~="" { + if `"``var''"'=="," { + local seecommand `"`seecommand'``var''"' + local precommand `"`precommand'``var''"' + } + else { + local seecommand `"`seecommand' ``var''"' + local precommand `"`precommand' ``var''"' + } + } + } + *local cl `"{stata `"`seecommand'"': `seecommand'}"' + *di as txt `"`cl'"' + di in white `" `seecommand'"' + `precommand' + } + else { + di in red "must specify the full syntax (the last preference has expired)" + exit 100 + } + } +} + + +*** saving the current preferences +if `"`using'"'=="" { + local _0 `"`seecommand'"' +} + +local 0 `"`_0'"' + +* take out sum/crosstab and +* take out [if] [in] [pweight fweight aweight iweight] +* take out non-user specified options: replace/noreplace seeout/noseeout +syntax [anything] [using] [if] [in] [pweight fweight aweight iweight] [, REPLACE NOREPLACE SUM SUM2(str) CROSStab SEEout /* + */ NOSEEOUT CTTOP CTBOT CDOUT *] + +local pref `"`using'"' + +* NOTE: `0' has been overwritten long ago + + cap quietly findfile outreg2.pref + if _rc~=0 & "`Version7'"~="" { + * create it if missing + findfile outreg2.ado + local place=substr(`"`r(fn)'"',1,`=length(`"`r(fn)'"')-11') + + tempname myplace + cap file open `myplace' using `"`place'outreg2.pref"', write text replace + cap file write `myplace' "" _n + cap file write `myplace' "" _n + cap file write `myplace' "" + cap file close `myplace' + } + +cap quietly findfile outreg2.pref +tempname myfile + +* capture for write protected files +cap file open `myfile' using `"`r(fn)'"', write text replace +cap file write `myfile' `"`c(current_date)'"' _n +cap file write `myfile' `"`pref'"' _n +cap file write `myfile' `"`options'"' +cap file close `myfile' + +*** display clickables +foreach var in dta tex word excel xmlsave { + if `"`cl_`var''"'~="" { + noi di as txt `"`cl_`var''"' + } +} + +*** cdout thing +if "`cdout'"=="cdout" { + qui _cdout, +} + +noi _cdout, cont noopen + +foreach var in see { + if `"`cl_`var''"'~="" { + noi di as txt `"`cl_`var''"' + } +} + +* restoring the currently active estimate here +cap _estimates unhold `coefActive' + +*** run requested +*if `"`c_request'"'~="" { +* di " " +* di in white `". `c_request'"' +* `c_request' +*} + +end /* end of outreg2 */ + + +******************************************************************************************** + + +prog define outreg2_by, by(recall, nohead) + versionSet + version `version' + +preserve + +gettoken first second : 0, parse(":") `bind' match(par) quotes +local 0 `"`first'"' +while `"`first'"'~=":" & `"`first'"'~="" { + gettoken first second : second, parse(":") `bind' match(par) quotes + +} + +if `"`0'"'==":" { + * colon only when shorthand combined with prefix + local 0 +} +else { + local _0 `"`0'"' +} + +*** shorthand syntax if [using] is missing +syntax [anything] [using] [if] [in] [pweight fweight aweight iweight] [, SEEout REPLACE NOSEEOUT NOREPLACE CROSStab AGAIN * ] + +*** bys( ) clean up: touse, ctitle/cctop, replace/noreplace, seeout/noseeout +if `=_by()'==1 { + + marksample touse + + * generate column heading when -by- specified + if `"`cttop'"'~="" { + local cc=1 + + tokenize `_byvars' + while "``cc''"~="" { + + * should there be `touse' here? + qui summarize ``cc'' if `_byindex' == `=_byindex()' & `touse', meanonly + if r(N)<. { + local actual`cc' =r(mean) + } + else { + local actual`cc' =. + } + + * place cttop in there + local _comma + if `cc'~=1 { + local _comma "," + } + + local cttop "`cttop'`_comma' ``cc'' `actual`cc'' " + *local cttop "`cttop'`_comma' ``cc'', `actual`cc'' " + local cc=`cc'+1 + } + } + else { + local cc=1 + local cttop "" + + tokenize `_byvars' + while "``cc''"~="" { + + * should there be `touse' here? + qui summarize ``cc'' if `_byindex' == `=_byindex()' & `touse', meanonly + if `r(N)'<. { + local actual`cc' =r(mean) + } + else { + local actual`cc' =. + } + + * place cttop in there + local _comma + if `cc'~=1 { + local _comma "," + } + + local cttop "`cttop'`_comma' ``cc'' `actual`cc'' " + *local cttop "`cttop'`_comma' ``cc'', `actual`cc'' " + local cc=`cc'+1 + } + } + + * lazy + qui keep if `touse'==1 + + local 0 `0' cttop(`cttop') + + * drop bys( ) from ctitles + if "`drop'"=="" { + local drop `"`_byvars'"' + local 0 `0' drop(`drop') + } + + * replace first when -by- specified + if `=_byindex()'==1 { + local noreplace "" + } + else { + local noreplace "noreplace" + } + + * seeout last when -by- specified + if `=_bylastcall()'==0 { + local noseeout "noseeout" + } + else { + local noseeout "" + } + + + * pass an embedded indicator to the second runs + if "`again'"=="" { + local again "again" + } + + * simplify by dropping them + drop `touse' `_byindex' +} + +* this will include the outputs from bys( ) routine above: +local 0 `0' `noreplace' `noseeout' + +* for multiple tabs +local names `"`anything'"' +if "`crosstab'"=="crosstab" & `"`names'"'=="" { + noi di in red "varlist required for {opt crosstab} option" + exit 100 +} + +* separate the first variable from the rest, which are for the bys( ) +gettoken first rest : names, parse(" ") +if "`crosstab'"=="crosstab" & "`first'"~="" & "`rest'"~="" { + cap drop _fillin + cap fillin `rest' + if "`replace'"=="replace" { + + } + *local 0 `first' `if' `in' [`weight'`exp'] `using', `seeout' `replace' `crosstab' nonotes `options' cttop(`cttop') ctbot(`ctbot') + local 0 `first' `using', `seeout' `replace' `crosstab' nonotes `options' cttop(`cttop') ctbot(`ctbot') + + if `"`second'"'=="" { + qui bys `rest' : outreg2_by `0' + } + else { + noi bys `rest' : outreg2_by `0' : `second' + } +} +else { + * single tabs or no crosstab at all + if (`"`second'"'=="" | `"`second'"'==" ") & `"`using'"'~="" { + * non-prefix + _outreg2 `0' + } + else { + version `version' : `second' + _outreg2 `0' + } +} /* no crosstab */ + + +*** pass it forward +foreach var in dta tex word excel xmlsave see { + c_local cl_`var' `"`cl_`var''"' +} + +end /* end of outreg2_by */ + + +******************************************************************************************** + + +prog define _outreg2 + * write formatted regression output to file + + versionSet + version `version' + +syntax [anything] using [if] [in] [pweight fweight aweight iweight] [, /* +*/ eqdrop(str) eqkeep(str) drop(str) keep(str) ADDvar(str) eqmatch(str) /* +*/ INDDrop(str) indyes(str) indno(str) /* +*/ matrix(str) eb(str) ev(str) noNOBS noOBS /* +*/ COEfastr APpend REPLACE NOREPLACE SEEout NOSEEOUT CDOUT /* +*/ EQuationsA(passthru) Onecol LONG wide SIDEway COMma Quote noNOTes /* +*/ ADDNote(passthru) STats(str asis) stnum(str asis) ststr(str asis) /* +*/ noSE TSTAT Pvalue CI BEta /* +*/ Level(integer $S_level) /* +*/ noPAren PARenthesis(str asis) BRacket BRacketA(str) CTTOP(str) *] + +local usingTemp `"`using'"' +local ifTemp `"`if'"' +local inTemp `"`in'"' +local weightTemp `"`weight'"' +local expTemp `"`exp'"' + +local cttop1 `"`cttop'"' +local cttop + +local drop1 `"`drop'"' +local drop + +* cascading options: +local 0 `", `options'"' +syntax [, noASter 2aster ALPHA(passthru) SYMbol(passthru) 10pct /* +*/ LABel LABelA(str asis) TItle(passthru) CTitle(str) CTBOT(str) /* +*/ EXCEL EXCEL1(str) xmlsave TEX TEX1(passthru) WORD DTA DTAa(str asis) TEXT XPosea(str) /* +*/ ASTERisk(passthru) /* +*/ noCONs noNI noR2 ADJr2 E(str) /* +*/ ADDStat(passthru) ADDText(str) /* +*/ EForm MFX Margin1 Margin2(str) /* +*/ SUM SUM2(str) CROSStab TAB3(str) /* +*/ sortcol(str) sortvar(str) groupvar(str) /* +*/ CTTOP(str) drop(str) /* +*/ again leave(str) /* +*/ pivot slow(int 1) raw *] + +* cascading options: +local 0 `", `options'"' +syntax [, DEC(numlist int >=0 <=11 max=1) FMT(str) /* +*/ BDec(numlist int >=0 <=11) BFmt(str asis) /* +*/ SDec(numlist int >=0 <=11) SFmt(str asis) /* +*/ Tdec(numlist int >=0 <=11 max=1) TFmt(str asis) /* +*/ PDec(numlist int >=0 <=11 max=1) PFmt(str asis) /* +*/ CDec(numlist int >=0 <=11 max=1) CFmt(str asis) /* +*/ ADec(numlist int >=0 <=11 max=1) AFmt(str asis) /* +*/ RDec(numlist int >=0 <=11 max=1) RFmt(str asis) /* +*/ AUTO(integer 3) LESS(integer 0) NOAUTO DECMark(str asis) /* +*/ POLicy0(str asis) skip NOOMITted NOBAse noDEPVARshow ] + +local using `"`usingTemp'"' +local using `"`usingTemp'"' +local if `"`ifTemp'"' +local in `"`inTemp'"' +local weight `"`weightTemp'"' +local exp `"`expTemp'"' + +* consolidate twice-mentioned options by double bys( ) +if `"`cttop'"'=="" { + local cttop `"`cttop1'"' +} +else if `"`cttop1'"'~="" { + local cttop `"`cttop1', `cttop'"' +} + +if `"`drop'"'=="" { + local drop `"`drop1'"' +} +else if `"`drop1'"'~="" { + local drop `"`drop1', `drop'"' +} + +* name of 1st column containing variable names +local VARIABLES "VARIABLES" +local VARIABLES1 "VARIABLES" + +*** a partial list of original macro names +* neq is the number of equation +* numi is e(N_g), the xt number of groups +* noNI is user request to not to report xt number of groups +* ivar is the e(ivar), the id for xt + +*** the original ctitle +local ctitle0 `"`ctitle'"' + +*** replace/noreplace seeout/noseeout +if "`noreplace'"=="noreplace" { + local replace "" + local noreplace "" +} +if "`noseeout'"=="noseeout" { + local seeout "" + local noseeout "" +} + +*** default warnings +if "`replace'"=="replace" & "`append'"=="append" { + di in green "replaced when both {opt replace} and {opt append} chosen" + local replace "replace" + local append "" +} + +*** set default options +if "`replace'"=="" & "`append'"=="" { + local append "append" +} + +*** betaco option into beta +if "`betaco'"=="betaco" { + local beta "beta" { +} + +*** no observation +if "`nobs'"=="nonobs" { + * recycling the original outreg option + local obs "noobs" + local nobs "" +} +* casewise and raw +if "`raw'"=="raw" & "`casewise'"=="casewise" { + noi di in red "cannot choose {opt case:wise} and {opt raw} at the same time" + exit 198 +} + +*** separate the varist from the estimates names +local open=index("`anything'","[") +local close=index("`anything'","]") + +if `open'~=0 & `close'~=0 { + local estimates=trim(substr("`anything'",`open'+1,`close'-`open'-1)) + local temp1=trim(substr("`anything'",1,`open'-1)) + local temp2=trim(substr("`anything'",`close'+1,length("`anything'"))) + local varlist=trim("`temp1' `temp2'") +} +else { + local varlist "`anything'" +} + +*** pre-clean +if "`varlist'"~="" { + fvtsunab `varlist' + local varlist "`fvtsunab_list'" + macroUnique `varlist', names(varlist) number(tt) /* should be another name */ +} + +*** varlist, keep, drop, eqkeep, eqdrop +if "`varlist'"~="" & "`keep'"~="" { + di in yellow "{opt keep( )} supersedes {opt varlist} when both specified" +} + +*** pre-clean +if "`varlist'"=="" & "`keep'"~="" { + local varlist `keep' +} + +if "`eqdrop'"~="" & "`eqkeep'"~="" { + di in red "cannot specify both {opt eqkeep( )} and {opt eqdrop( )}" + exit 198 +} + +*** parse addstats new location 1 of 2 +*** parse addstat to convert possible r(), e(), and s() macros to numbers +* (to avoid conflicts with r-class commands used in this program) +if `"`addstat'"'!="" { + _addstat_parse, addstat(`addstat') adec(`adec') afmt(`afmt') auto(`auto') less(`less') `noauto' decmark(`decmark') + local addstat "addstat(`addstat')" +} + +*** preclean drop & keep +*if "`drop'"~="_all" | "`drop'"~="*"{ +* stop +*} + +* if _tab3 was accomodated +* one by one to accomodate MISSING from _tab3 +if "`drop'"~="" { + fvtsunab `drop', onebyone + local drop "`fvtsunab_list'" + macroUnique `drop', names(drop) /* should be dropList */ +} + +if "`keep'"~="" { + fvtsunab `keep', onebyone + macroUnique `fvtsunab_list', names(keepList) +} + +if "`sortvar'"~="" { +/* gettoken first second: sortvar, parse(" ") + local sortvar + while `"`first'"'~="" { + cap tsunab temp : `sortvar' + if !_rc { + local sortvar `"`sortvar' `temp'"' + } + gettoken first second: second, parse(" ") + } +*/ + tokenize `sortvar' + local num 1 + local collect "" + while "``num''"~="" { + cap tsunab temp : ``num'' + if !_rc { + local collect "`collect' `temp'" + } + else { + local collect "`collect' ``num''" + } + local num=`num'+1 + } + local sortvar "`collect'" + macroUnique `sortvar', names(sortvar) +} +if "`sortvar'"~="" & "`groupvar'"~="" { + noi di in red "cannot choose both {opt sortvar} and {opt groupvar}" + exit 198 +} +if "`groupvar'"~="" { + tokenize `groupvar' + local num 1 + local collect "" + while "``num''"~="" { + cap tsunab temp : ``num'' + if !_rc { + local collect "`collect' `temp'" + } + else { + local collect "`collect' ``num''" + } + local num=`num'+1 + } + local groupvar "`collect'" + macroUnique `groupvar', names(groupvar) +} + +* unambiguate the names of stored estimates (wildcards) +if "`estimates'"~="" { + local collect "" + foreach var in `estimates' { + local temp "_est_`var'" + local collect "`collect' `temp'" + } + unab estimates : `collect' + local collect "" + foreach var in `estimates' { + local temp=substr("`var'",6,length("`var'")-4) + local collect "`collect'`temp' " + } + local estimates=trim("`collect'") +} + +* or use est_expand + + +tempname estnameUnique +* a place holding name to the current estimates that has no name entered into the outreg + +if "`estimates'"=="" { + local estStored 0 + local estimates="`estnameUnique'" +} +else { + if "`Version7'"=="" { + * it is version 7 + noi di in red "version 7 cannot specify stored estimates: " in white "`estimates'" + exit 198 + } + local estStored 1 + macroUnique `estimates', names(estimates) +} + +*** checking sum and crosstab +local check1 `=("`crosstab'"~="" | "`tab3'"~="")' +local check2 `=("`sum'"~="" | "`sum2'"~="")' +local check3 `=("`mfx'"~="")' +local checks=`check1'+`check2'+`check3' + +if `checks'>=2 { + di in yel "cannot specify more than one of {opt sum}, {opt crosstab}, or {opt mfx} options" + exit 198 +} + + +if "`sum'"=="sum" & "`sum2'"=="" { + local sum2 "regress" +} + +if "`sum'"=="" { + * omit by default + *local noomitted noomitted + local nobase nobase +} + + +*** assign e(sample) if it exists +cap confirm matrix e(b) +local ifList `"`if'"' +if _rc==0 & "`raw'"~="raw" { + if `"`ifList'"'=="" { + local ifList if e(sample) + } + else { + local ifList `if' & e(sample) + } +} + + +*** assign weights if it exists, but override it if user specified +if `"`weight'`exp'"'=="" { + if `"`e(wexp)'"'~="" & `"`e(wtype)'"'~="" { + local weight `e(wtype)' `e(wexp)' + } +} + + +*** pweight not compatible with sum option +if `"`weight'"'=="pweight" & "`sum'"=="sum" { + noi di in red "cannot use pweight with sum option" + exit 198 +} + +*** handle policy 1 of 3 +if "`policy0'"~="" { + fvunab policyList: `policy0' + local cc: word count `policyList' + if ("`label'"~="" | "`labelA'"~="") { + local com + forval num=1/`cc' { + local tt : word `num' of `policy0' + + cap local thisname : var lab `tt' + cap local thisname = subinstr(`"`thisname'"',"(","[",.) + cap local thisname = subinstr(`"`thisname'"',")","]",.) + cap local thisname = subinstr(`"`thisname'"',","," ",.) + cap local thisname = subinstr(`"`thisname'"',":"," ",.) + cap local thisname = subinstr(`"`thisname'"',`"""'," ",.) + + if `"`thisname'"' =="" { + local thisname `"`tt'"' + } + + if "`ctbot'"~="" { + local ctbot `"`ctbot', `thisname'"' + } + else { + local ctbot `"`ctbot'`com' `thisname'"' + local com , + } + } + } + else { + local com + forval num=1/`cc' { + local tt : word `num' of `policy0' + if "`ctbot'"~="" { + local ctbot `"`ctbot', `tt'"' + } + else { + local ctbot `"`ctbot'`comma' `tt'"' + local com , + } + } + } +} + +*** get crosstab +if "`crosstab'"=="crosstab" { + qui _tab3 `varlist' `if' `in' [`weight'`exp'] + local eretrun eretrun + + local ebnames "e(freq)" + local eVnames "e(percent)" + local r2 "nor2" + local sortcol "name" + local obs "noobs" + if `"`addstat'"'=="" { + local addstat `"addstat("Total", e(total))"' + } + else { + gettoken part rest: addstat, parse(" (") + gettoken part rest: rest, parse(" (") /* strip off "addstat(" */ + local addstat `"addstat("Total", e(total), `rest'"' + } + + * augment (usually has bys( ) variables in them) + if `e(total)'==0 { + local drop `"MISSING `drop'"' + } + + if `"`ctitle0'"'=="" { + local ctitle `"`varlist'"' + } + + local VARIABLES `"`varlist'"' + local notes "nonotes" + + local varlist "" +} +else if "`sum2'"~="" { + local eretrun eretrun + local r2 "nor2" + + * allowable: log regress noindep detail + optionSyntax, valid(log regress noindep detail) name(sum2) nameShow(sum( )) content(`sum2') + + if "`noindep'"=="noindep" & "`detail'"=="" { + local regress "regress" + } + + if "`log'"=="log" & "`detail'"=="detail" { + di in red "cannot use both {opt log} and {opt detail} for {opt sum( )} option" + exit 198 + } + if "`log'"=="log" { + + * always raw because e(sample) might be empty for version 11 + noi _sum2 `if' `in' [`weight'`exp'], `log' raw + + local r2 "nor2" + local notes "nonotes" + local aster "noaster" + local stats "coef" + local obs "noobs" + if `"`ctitle0'"'=="" { + local ctitle `"`cttop', \`depvar'"' + } + di + } + if "`detail'"=="detail" { + * always raw because e(sample) might be empty for version 11 + noi _sum2 `if' `in' [`weight'`exp'], `detail' raw + + local r2 "nor2" + local notes "nonotes" + local aster "noaster" + local stats "coef" + local obs "noobs" + if `"`ctitle0'"'=="" { + local ctitle `"`cttop', \`depvar'"' + } + di + } + if "`regress'"=="regress" { +******************** take off the number in the front for reg3 dependent variables 2price 3price etc +******************** unab, tsuab + + if "`e(depvar)'"~="" | "`e(depvar)'"~="." { + local sumVar1 `e(depvar)' + } + + * borrowed from below (for multiple equations) + * workaround for 8.0: e(b) must be converted to a regular matrix to get at it + tempname tempMatrix + mat `tempMatrix'=e(b) + local sumVar2: colnames `tempMatrix' + + * workaround for 8.0: e(b) must be converted to a regular matrix to get at it + local eqlist: coleq `tempMatrix' + + if "`Version7'"~="" { + local eqlist: list clean local(eqlist) + local eqlist: list uniq local(eqlist) + } + else { + * probably needed for the first character + local temp=index("`eqlist'","_") + if `temp'==1 { + local eqlist=subinstr("`eqlist'", "_", "", .) + } + * also make unique + macroUnique `eqlist', names(eqlist7) number(eqcount7) + local eqlist `eqlist7' + } + + * counting the number of equation + local eqcount: word count `eqlist' + * local eqcount : list sizeof eqlist + + * redundant subtractions + *local minus "_cons" + *local sumVar2: list sumVar2 - minus + * do it by hand: + tokenize `sumVar2' + local num 1 + local sumVar2 "" + + if "`sumomit'"=="" { + while "``num''"~="" { + gettoken one two: `num', parse(".") + if "``num''"~="_cons" & "`one'"~="o" { + local sumVar2 "`sumVar2' ``num''" + } + else if "``num''"~="_cons" { + local two=substr("`two'",2,.) + local sumVar2 "`sumVar2' `two'" + } + local num=`num'+1 + } + } + else { + * manually take out o. prefix as well if requested (NOT IMPLEMENTED) + while "``num''"~="" { + gettoken one two: `num', parse(".") + if "``num''"~="_cons" & "`one'"~="o" { + local sumVar2 "`sumVar2' ``num''" + } + local num=`num'+1 + } + } + + + if "`noindep'"=="noindep" { + noi _sum2 `sumVar2' `if' `in' [`weight'`exp'], `raw' + } + else { + noi _sum2 `sumVar1' `sumVar2' `if' `in' [`weight'`exp'], `raw' + } + + if 1<`eqcount' & `eqcount'<. { + noi di in yel "Check your results; -sum- option not meant for multiple equation model" + } + } + + local ebnames "e(mean)" + local eVnames "e(Var)" + + if `"`ctitle'"'=="" { + if `"`cttop'"'=="" { + local cttop `"mean, (sd)"' + if `"`if'"'~="" { + gettoken first second: if, parse(" ") + local cttop `"`cttop', `second'"' + } + if `"`in'"'~="" { + local cttop `"`cttop', `in'"' + } + } + else { + local cttop `"`cttop', mean, (sd)"' + if `"`if'"'~="" { + gettoken first second: if, parse(" ") + local cttop `"`cttop', `second'"' + } + if `"`in'"'~="" { + local cttop `"`cttop', `in'"' + } + } + } + + loca sum_N + local r2 "nor2" + local notes "nonotes" + local aster "noaster" + local sortcol "later" +} +else { + +if "`matrix'"~="" { + * old and outdated, replaced with eb and ev options below + *** matrix names + local ebnames "`matrix'" + local eVnames "e(V)" + + if "`stats'"=="" { + local stats "coef" + } + if "`r2'"=="" { + local r2 "nor2" + } + if "`aster'"=="" { + local aster "noaster" + } + if "`notes'"=="" { + local notes "nonotes" + } + if "`ctitle'"=="" { + local ctitle "`matrix'" + } + if "`obs'"=="" { + local obs "noobs" + } + if "`e(N)'"~="" { + local obs + } +} +else { + *** ereturn matrix names + local ebnames "e(b)" + local eVnames "e(V)" + local eretrun eretrun + + if "`mfx'"~="mfx" { + cap confirm matrix e(b) + if _rc & "`Version7'"~="" & "`sum2'"=="" { + if "`varlist'"~="" { + local eretrun + local raw raw + + *di in red "matrix e(b) not found; run/post a regression first" + *exit 111 + + * sets e(sample) + *eretSet `varlist' + } + else { + * it does not exist + di in red "matrix e(b) not found; run/post a regression, or specify varlist for non-regression outputs" + exit 111 + } + } + } + else { + * mfx option + if "`Version7'"~="" { + + local stop 1 + + cap confirm matrix e(Xmfx_dydx) + if _rc==0 { + local ebnames e(Xmfx_dydx) + local eVnames e(Xmfx_se_dydx) + local stop 0 + local mfx_ct mfx dydx + } + cap confirm matrix e(Xmfx_eyex) + if _rc==0 { + local ebnames e(Xmfx_eyex) + local eVnames e(Xmfx_se_eyex) + local stop 0 + local mfx_ct mfx eyex + } + cap confirm matrix e(Xmfx_eydx) + if _rc==0 { + local ebnames e(Xmfx_eydx) + local eVnames e(Xmfx_se_eydx) + local stop 0 + local mfx_ct mfx eydx + } + cap confirm matrix e(Xmfx_dyex) + if _rc==0 { + local ebnames e(Xmfx_dyex) + local eVnames e(Xmfx_se_dyex) + local stop 0 + local mfx_ct mfx dyex + } + + if `stop'==1 { + noi di in red "run {cmd mfx} first" + exit 111 + } + + local eXnames e(Xmfx_X) + } + else { + local ebnames e(Xmfx_eyex) + local eVnames e(Xmfx_se_eyex)" + } + if "`ctitle'"=="" { + if "`ctbot'"=="" { + local ctbot `"`mfx_ct'"' + } + else { + local ctbot `"`mfx_ct', `ctbot'"' + } + } + } + +} +} + + +* noSE: because se indicates stn.err, convert noSE into something else +if "`se'"=="nose" { + local se_skip "se_skip" +} + + +* stats( ) is not compatible with two-column options +if "`stats'"~="" { + if "`se'"=="nose" { + di in red "cannot specify both {opt st:ats( )} and {opt nose} options" + exit 198 + } + if "`ci'"=="ci" { + di in red "cannot specify both {opt st:ats( )} and {opt ci} options" + exit 198 + } + if "`tstat'"=="tstat" { + di in red "cannot specify both {opt st:ats( )} and {opt tstat} options" + exit 198 + } + if "`pvalue'"=="pvalue" { + di in red "cannot specify both {opt st:ats( )} and {opt p:value} options" + exit 198 + } + if "`beta'"=="beta" { + di in red "cannot specify both {opt st:ats( )} and {opt be:ta} options" + exit 198 + } +} + +* keep out depvar +if "`se'"=="nose" | "`ci'"=="ci" | "`tstat'"=="tstat" | "`pvalue'"=="pvalue" | "`beta'"=="beta" { + local depvarshow nodepvarshow +} + +if `"`eb'"'~="" | `"`ev'"'~="" { + * replacement for matrix option + local eretrun eretrun + + if `"`eb'"'~="" { + local ebnames "`eb'" + } + if `"`ev'"'~="" { + local eVnames "`ev'" + } + if "`stats'"=="" { + local stats "coef se" + } + if "`r2'"=="" { + local r2 "nor2" + } + if "`aster'"=="" { + local aster "noaster" + } + if "`notes'"=="" { + local notes "nonotes" + } + if "`ctitle'"=="" { + local ctitle "`eb'" + } + if "`obs'"=="" { + local obs "noobs" + } + if "`e(N)'"~="" { + local obs + } +} + + +* always se instead of tstat +if "`tstat'"~="tstat" & "`pvalue'"~="pvalue" & "`ci'"~="ci" & "`beta'"~="beta" { + if "`stats'"=="" { + local se "se" + } +} +else { + local se "" +} + +if "`parenthesis'"=="" & "`paren'"~="noparen" { + if "`ci'"~="" { + local parenthesis "ci" + } + if "`pvalue'"~="" { + local parenthesis "pval" + } + if "`tstat'"~="" { + local parenthesis "tstat" + } + if "`beta'"~="" { + local parenthesis "beta" + } + if "`se'"=="se" { + local parenthesis "se" + } +} + +*** clean up file name, enclose .txt if no file type is specified +*** else take care of user-specified extension names for excel xmlsave word tex dta files +local rest "`using'" +* strip off "using" +gettoken part rest: rest, parse(" ") +* strip off quotes +gettoken first second: rest, parse(" ") +cap local rest: list clean local(rest) + +local rabbit `"""' +if index(`"`using'"', ".")==0 { + local file = `"`rabbit'`first'.txt`rabbit'"' + local using = `"using `file'"' +} +else { + local file = `"`rabbit'`first'`rabbit'"' + local using = `"using `file'"' + + * strip off quotes and extension + gettoken first second: file, parse(" ") + local temp = `"`first'"' + + local next_dot = index(`"`temp'"',".") + local next_strip = substr(`"`temp'"',1,`=`next_dot'-1') + local strippedname = substr(`"`temp'"',1,`=`next_dot'-1') + + * check for more dots + local change 0 + while `change'==0 { + local temp = substr(`"`temp'"',`=`next_dot'+1',.) + if index(`"`temp'"', ".")~=0 { + local next_dot = index(`"`temp'"',".") + local next_strip = substr(`"`temp'"',1,`=`next_dot'-1') + local strippedname = `"`strippedname'.`next_strip'"' + } + else { + * no change + local last_strip = `"`temp'"' + local change 1 + } + } + + *** check for manual rtf doc docx xlm xls xlsx csv extensions + if `"`last_strip'"'=="rtf" | `"`last_strip'"'=="doc" | `"`last_strip'"'=="docx" { + local word "word" + + local file = `"`rabbit'`strippedname'.txt`rabbit'"' + local using = `"using `file'"' + local wordFile "`last_strip'" + } + if `"`last_strip'"'=="xls" | `"`last_strip'"'=="xlsx" | `"`last_strip'"'=="xml" | `"`last_strip'"'=="xlm" | `"`last_strip'"'=="csv" { + if "`xmlsave'"=="" { + local excel "excel" + } + + local file = `"`rabbit'`strippedname'.txt`rabbit'"' + local using = `"using `file'"' + local excelFile "`last_strip'" + } + if `"`last_strip'"'=="tex" { + if `"`tex1'"'=="" { + local tex "tex" + } + + local file = `"`rabbit'`strippedname'.txt`rabbit'"' + local using = `"using `file'"' + local texFile "`last_strip'" + } +} + +* put excel in +if `"`excel1'"'~="" { + local excel "excel" +} + +*** confirm the output file existance, to be adjusted later +cap confirm file `file' +if !_rc { + * it exists + local fileExist 1 +} +else { + local fileExist 0 +} + +*** mainfile +* cleaning the user provided inputs + +if "`long'"=="long" & "`onecol'"=="onecol" { + di in yellow "{opt long} implies {opt o:necol} (no need to specify both)" +} +if "`long'"=="long" & "`onecol'"~="onecol" { + local onecol "onecol" +} + +if ("`tstat'"!="")+("`pvalue'"!="")+("`ci'"!="")+("`beta'"!="")>1 { + di in red "choose only one of tstat, pvalue, ci, or beta" + exit 198 +} + +if `level'<10 | `level'>99 { + di in red "level() invalid" + exit 198 +} + +if `"`paren'"'=="noparen" & `"`parenthesis'"'~="" { + di in red "cannot choose both {opt nopa:ren} and {opt paren:thesis()} option" + exit 198 +} +if `"`paren'"'=="noparen" & `"`bracketA'"'~="" { + di in red "cannot choose both {opt nopa:ren} and {opt br:acket()} option" + exit 198 +} +if `"`bracket'"'~="" & `"`bracketA'"'~="" { + di in red "cannot choose both {opt br:acket} and {opt br:acket()} option" + exit 198 +} + +if "`symbol'"=="" & "`sigsymb'"~= "" { + local symbol "`sigsymb'" +} +if `"`10pct'"'~="" & "`sigsymb'"~="" { + di in red "cannot choose both {opt 10pct} and {opt sigsymb( )}" + exit 198 +} + +if `"`10pct'"'~="" & "`symbol'"~="" { + di in red "cannot choose both {opt 10pct} and {opt symbol( )}" + exit 198 +} +if `"`10pct'"'~="" & "`symbol'"=="" { + local symbol `"symbol(**, *, +)"' +} +if "`aster'"=="noaster" & ("`asterisk'"~="" | "`symbol'"!="") { + if "`asterisk'"~="" { + di in red "cannot choose both {opt noaster} and {opt asterisk( )}" + } + else { + di in red "cannot choose both {opt noaster} and {opt symbol( )}" + } + exit 198 +} + +if (`"`addnote'"'!="" & "`append'"=="append" & `fileExist'==1) { + di in yellow "warning: addnote ignored in appended columns" +} + +*** LaTeX options +local tex = ("`tex'"!="") +if "`tex1'"!="" { + if `tex' { + di in red "may not specify both {opt tex} and {opt tex()} options" + exit 198 + } + local tex 1 + + gettoken part rest: tex1, parse(" (") + gettoken texopts zilch: rest, parse(" (") match(parns) /* strip off "tex1()" */ +} + +_texout_parse, `texopts' + +* insert nopretty +local check=index(`"`tex1'"',"nopretty") +if `check'==0 { + local check=index(`"`tex1'"',"pretty") + if `check'==0 { + * neither + local texopts "nopretty `texopts'" + } +} + + +*** label options +if "`label'"=="label" & "`labelA'"~="" { + di in red "cannot specify both {opt lab:el} and {opt lab:el()} options" + exit 198 +} +if "`labelA'"~="" { + * pre-clean + optionSyntax, valid(insert upper lower proper) name(labelA) nameShow(label( )) content(`labelA') + local labelOption `"`optionList'"' + if "`proper'"~="" & "`upper'"~="" { + noi di in red "cannot specify together: label(proper upper)" + exit 198 + } + if "`proper'"~="" & "`lower'"~="" { + noi di in red "cannot specify together: label(proper lower)" + exit 198 + } + if "`lower'"~="" & "`upper'"~="" { + noi di in red "cannot specify together: label(lower upper)" + exit 198 + } +} + +*** equationsA options +if "`equationsA'"~="" { + gettoken part rest: equationsA, parse(" (") + gettoken equationsOption zilch: rest, parse(" (") match(parns) /* strip off "label()" */ + local equationsOption=trim("`equationsOption'") + + if "`equationsOption'"~="auto" { + di in red "cannot specify any option other than {opt auto} for {opt eq:uation( )}" + exit 198 + } + else if "`equationsOption'"~="auto" { + *local label "label" + } +} + + +if (`"`addstat'"'=="" & "`adec'"!="" & "`e'"=="" ) { + di in red "cannot choose adec option without addstat option" + exit 198 +} +if "`adec'"=="" { + * disabled + *local dec 3 + *local adec = `dec' +} + +if "`quote'"!="quote" { + local quote "noquote" +} + +tempname df_r + +if "`margin1'"~="" | "`margin2'"~="" { + if "`mfx'"=="mfx" { + di in red "cannot specify both {opt mfx} and {opt margin} options" + exit 198 + } + + local margin = "margin" + if "`margin2'"~="" { + local margucp "margucp(_`margin2')" + scalar `df_r' = . + if "`margin1'"~="" { + di in red "may not specify both margin and margin()" + exit 198 + } + } + else { + if "`e(cmd)''"=="tobit" { + di in red "dtobit requires margin({u|c|p}) after dtobit command" + exit 198 + } + } +} + + +*** titlefile needs set out here +tempfile titlefile + +*** logistic reports coeffients in exponentiated form (odds ratios) +if "`cmd'"=="logistic" { + local eform "eform" + + * report no cons + if "`eform'"=="eform" { + local cons "nocons" + } +} + +* force them long +if "`e(cmd)'"=="oprobit" | "`e(cmd)'"=="ologit" { + local long long + local onecol onecol +} + +if "`wide'"=="wide" { + local long + local onecol +} + +*** stats( ) option cleanup : dealing with rows/stats to be reported per variable/coeff +local statsValid "eqname varname label label_pr label_up label_low test001 test01 test05 test10 coef se tstat pval ci aster blank beta ci_low ci_high N sum_w mean Var sd skewness kurtosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99 cv range iqr semean median count covar corr pwcorr spearman pcorr semipcorr pcorrpval tau_a tau_b" + +* level coef_eform se_eform coef_beta se_beta" + +local asterAsked 0 +local betaAsked "" + +/* +if `"`estats'"'~="" { + * the names of the available stats in e(matrices) + local ematrices "" + local var: e(matrices) + + *noi di in yellow "`var'" + + tokenize `var' + local i=1 + while "``i''"~="" { + *** di "e(``i'')" _col(25) "`e(``i'')'" + local ematrices="`ematrices'``i'' " + local i=`i'+1 + } +} +*/ + +if "`se_skip'"=="se_skip" { + local statsMany 1 + local statsList "coef" +} +else if `"`stats'"'~="" { + * take out commas + gettoken one two: stats, `bind' parse(", ") + gettoken comma rest: two, `bind' parse(", ") + if "`comma'"=="," { + local two `"`rest'"' + } + local tempList `"`one'"' + while `"`two'"'~="" & `"`two'"'~=" " { + gettoken one two: two, `bind' parse(", ") + gettoken comma rest: two, `bind' parse(", ") + if "`comma'"=="," { + local two `"`rest'"' + } + local tempList `"`tempList' `one'"' + } + local stats `"`tempList'"' + local tempList + + local matList + + + * need to count using -gettoken, bind- instead of merely -local statsMany : word count `stats'- + + local num=0 + local statsMany 0 + local two `"`stats'"' + + while `"`two'"'~="" & `"`two'"'~=" " { + local num=`num'+1 + local statsMany=`statsMany'+1 + + gettoken one two: two, `bind' parse(", ") + gettoken comma rest: two, `bind' parse(", ") + if "`comma'"=="," { + local two `"`rest'"' + } + + local stats`num' `"`one'"' + + * it must be one of the list + local test 0 + foreach var in `statsValid' { + if "`var'"=="`stats`num''" & `test'==0 { + local test 1 + } + + * checking if aster/beta specified + if "`stats`num''"=="aster" { + local asterAsked 1 + } + if "`stats`num''"=="beta" { + local betaAsked "betaAsked" + } + } + if `test'==0 { + * not on the list of valid ones + capture confirm matrix `stats`num'' + if !_rc { + * matrix exists + local matList `"`matList' `stats`num''"' + } + else { + * send it to parser + cap _stats_parse, `stats`num'' + if _rc~=0 { + noi di in white "`stats`num''" in red " is not a valid stats, str( ), cmd( ), e( ), mat( ), etc. for {opt stats( )}" + exit 198 + } + } + } + + * okay to add: + local statsList "`statsList' `stats`num''" + } +} +else { + local statsMany 2 + + if "`ci'"=="ci" { + if "`eform'"=="eform" { + local statsList "coefEform ciEform" + } + else { + local statsList "coef ci" + } + } + else if "`beta'"=="beta" { + local statsList "coef beta" + } + + * regular: tstat, pval, or se + else if "`eform'"=="eform" { + local statsList "coefEform seEform" + + if "`tstat'"=="tstat" { + local statsList "coefEform tstat" + } + else if "`pvalue'"=="pvalue" { + local statsList "coefEform pval" + } + } + else { + local statsList "coef se" + + if "`tstat'"=="tstat" { + local statsList "coef tstat" + } + else if "`pvalue'"=="pvalue" { + local statsList "coef pval" + } + } +} + +* when stats(aster) specified, aster( ) should not be attached to coef unless asked +if `asterAsked'==1 & "`asterisk'"=="" { + * the encased blank will trigger the parsing codes in makeFile + local asterisk " " +} + + +* update when eform specified +if "`eform'"=="eform" { + * blank at end + local statsList "`statsList' " + local statsList : subinstr local statsList "coef " "coefEform ", all + local statsList : subinstr local statsList "ci " "ciEform ", all + local statsList : subinstr local statsList "se " "seEform ", all + + local statsList : subinstr local statsList "ci_high " "ci_highEform ", all + local statsList : subinstr local statsList "ci_low " "ci_lowEform ", all +} + +* parenthesis locations moved to makeFile + +* check that nothing appears in parenthesis( ) does not appear in stats( ) +macroMinus `parenthesis', names(temp) subtract(`statsList' `stats') +if "`temp'"~="" & "`stats'"~="" { + noi di in red "`temp' appears in parenthesis( ) but not in stats( )" + exit 198 +} + +* clean up matList +if `"`matList'"'~="" { + tokenize `matList' + local rnum 1 + local num 1 + while `"``num''"'~="" { + * take off the parenthesis crap + local temp + local temp = substr(`"``num''"',1,2) + if "`temp'"=="r(" { + * r( ) matrix + local content = substr(`"``num''"',3,length("``num''")-3) + * not currently accepting + di in red "r-class matrix " in white "``num''" in red " not accepted by {opt stats( )}" + exit 198 + local rnum=`rnum'+1 + } + *if "`temp'"=="e(" { + * * r( ) matrix + * local content = substr(`"``num''"',3,length("``num''")-3) + * * not currently accepting + * di in red "e-class matrix " in white "``num''" in red " not accepted by {opt stats( )}" + * exit 198 + * local rnum=`rnum'+1 + *} + local num=`num'+1 + } +} + +*** expand statsList and statsMany according to vector/nonvec matrices + +* these two are collected, but not used here +local vectorList +local nonvecList + +if "`matList'"~="" { + tempname matdown + foreach matname in `matList' { + mat `matdown'=`matname' /* NOT transposed */ + local temp= colsof(`matdown') + + if `temp'==1 { + * it's a vector + local vectorList "`vectorList' `matname'" + } + else { + * it's a non-vector matrix + local cc= colsof(`matdown') + local temp0 : colnames(`matdown') + local temp + foreach var in `temp0' { + local temp "`temp' `matname'_`var'" + } + local nonvecList "`nonvecList' `temp'" + + * add the empty space at end + local statsList =`"`statsList' "' + local statsList =subinstr("`statsList'"," `matname' "," `temp' ",.) + local statsMany `=`statsMany'+`cc'-1' + } + } +} + +*** run each estimates consecutively +local estmax: word count `estimates' +forval estnum=1/`estmax' { + local estname: word `estnum' of `estimates' + if "`estimates'"~="`estnameUnique'" { + qui estimates restore `estname' + } + * to avoid overwriting after the first time, append from the second time around (1 of 3) + if `estnum'==2 & "`replace'"=="replace" { + local append "append" + local replace "" + } + + * the names of the available stats in e( ) + local result "scalars" + * took out macros from the local result + local elist="" + foreach var in `result' { + local var: e(`var') + tokenize `var' + local i=1 + while "``i''"~="" { + *** di "e(``i'')" _col(25) "`e(``i'')'" + local elist="`elist'``i'' " + local i=`i'+1 + } + } + macroUnique `elist', names(elist) + + * take out N (because it is always reported) + local subtract "N" + *cap local elist : list elist - subtract + macroMinus `elist', names(elist) subtract(`subtract') + + * r2 option + * save the original for the first run and restore prior to each subsequent run + if `estnum'==1 { + local r2Save `"`r2'"' + } + else { + local r2 `"`r2Save'"' + } + + *** e(all) option + * save the original for the first run and restore prior to each subsequent run + if `estnum'==1 { + local addstatSave `"`addstat'"' + } + else { + local addstat `"`addstatSave'"' + } + + *** dealing with e( ) option: put it through addstat( ) + * local = expression restricts the length + * requires a work-around to avoid subinstr/substr functions + + * looking for "all" anywhere + if "`Version7'"=="" { + local position=index("`e'","all") + } + else { + local position: list posof "all" in e + } + + if `"`addstat'"'~="" { + if "`e'"~="" { + local e: subinstr local e "," " ",all + macroUnique `e', names(e) + + if `position'~=0 { + local count: word count `elist' + local addstat=substr("`addstat'",1,length("`addstat'")-1) + forval num=1/`count' { + local wordtemp: word `num' of `elist' + local addstat "`addstat',`wordtemp',e(`wordtemp')" + } + } + else { /* other than all */ + local count: word count `e' + local addstat=substr("`addstat'",1,length("`addstat'")-1) + forval num=1/`count' { + local wordtemp: word `num' of `e' + local addstat "`addstat',`wordtemp',e(`wordtemp')" + } + } + local addstat "`addstat')" + } + } + + * if addstat was previously empty + else if "`addstat'"=="" { + if "`e'"~="" { + local e: subinstr local e "," " ",all + macroUnique `e', names(e) + if `position'~=0 { + local count: word count `elist' + local addstat "addstat(" + forval num=1/`count' { + local wordtemp: word `num' of `elist' + local addstat "`addstat'`wordtemp',e(`wordtemp')" + if `num'<`count' { + local addstat "`addstat'," + } + } + } + else { + local count: word count `e' + local addstat "addstat(" + forval num=1/`count' { + local wordtemp: word `num' of `e' + local addstat "`addstat'`wordtemp',e(`wordtemp')" + if `num'<`count' { + local addstat "`addstat'," + } + } + } + local addstat "`addstat')" + } + } + + *** dealing with single/multiple equations + *** also dealing with non-vector matrices, i.e. multiple columns + + tempname regN rsq numi r2mat b vc b_alone convert + + if "`eretrun'"=="" { + scalar `df_r'=. + } + else { + * getting equation names + tempname mainMatrix + mat `mainMatrix'=`ebnames' + + * workaround for 8.0: e(b) must be converted to a regular matrix to get at it + local eqlist: coleq `mainMatrix' + + if "`Version7'"~="" { + local eqlist: list clean local(eqlist) + local eqlist: list uniq local(eqlist) + } + else { + * probably needed for the first character + local temp=index("`eqlist'","_") + if `temp'==1 { + local eqlist=subinstr("`eqlist'", "_", "", .) + } + * also make unique + macroUnique `eqlist', names(eqlist7) number(eqcount7) + local eqlist `eqlist7' + } + + * counting before eqkeep/eqdrop + local eqcount_original: word count `eqlist' + + * drop some of multiple equations: 1 of 2 + + if "`eqdrop'"~="" { + * may not be a variable + cap tsunab eqdrop : `eqdrop' + *cap local eqlist : list eqlist - eqdrop + macroMinus `eqlist', names(eqlist) subtract(`eqdrop') + macroUnique `eqlist', names(eqlist) + } + + if "`eqkeep'"~="" { + * may not be a variable + cap tsunab eqkeep : `eqkeep' + local eqlist `"`eqkeep'"' + macroUnique `eqlist', names(eqlist) + } + + * counting the number of equation + local eqcount: word count `eqlist' + * local eqcount : list sizeof eqlist + + if "`Version7'"=="" { + local eqcount `eqcount7' + } + + * 0 if it is multiple equations; 1 if it is a single + *if 1<`eqcount' & `eqcount'<. { + if 1<`eqcount_original' & `eqcount_original'<. { + local univar=0 + } + else { + local univar=1 + } + + **** snipped portion moved here from above + * for svy commands with subpop(), N_sub is # of obs used for estimation + local cmd = e(cmd) + + local svy = substr("`cmd'",1,3) + if "`svy'"=="svy" & e(N_sub) != . { + scalar `regN' = e(N_sub) + } + else { + if "`sum2'"=="" { + scalar `regN' = e(N) + } + else { + scalar `regN' = e(sum_N) + } + } + + *** set up the usual stuff + scalar `df_r' = e(df_r) + local depvar = e(depvar) + if "`depvar'"=="." { + local depvar + } + + mat `b'=`ebnames' + mat `vc'=`eVnames' + + if "`mfx'"=="mfx" { + mat `vc' = `vc'' * `vc' + } + + local bcols=colsof(`b') /* cols of b */ + local bocols=`bcols' /* cols of b only, w/o other stats */ + + * the work around for xtmixed + if "`e(N_g)'"=="matrix" { + mat `convert'=e(N_g) + scalar `numi'=`convert'[1,1] + } + else { + scalar `numi' = e(N_g) + } + + local robust = e(vcetype) + if "`robust'"=="." { + local robust "none" + } + local ivar = e(ivar) + * equals one if true + capture local fracpol = (e(fp_cmd)=="fracpoly") + } /* eretrun */ + + * parse addstat old location 2 of 2 + * run again to handle e(all) + if `"`addstat'"'!="" { + _addstat_parse, addstat(`addstat') adec(`adec') afmt(`afmt') auto(`auto') less(`less') `noauto' decmark(`decmark') + } + + if "`eretrun'"=="" { + local univar 0 + local neq 1 + } + else { + * usual eret results + + *** to deal with eq(auto) + if `univar'==0 & "`equationsOption'"=="auto" { + * this means run once, as if it was a single equation + local univar 1 + } + + /* + *** to deal with eq(auto) + if `univar'==0 & "`equationsOption'"=="auto" { + + forval count=1/`eqcount' { + + local temp_eqname: word `count' of `eqlist' + tempname temp_eq + mat `temp_eq' = `b'[.,"`temp_eqname':"] + + local these: coleq `temp_eq' + + + * remove roweq for explicit varlist + mat colnames `temp_eq' = _: + + local names: colnames `temp_eq' + *noi di "colnames `colnames'" + *local bocols = colsof(`b_eq') + } + } + */ + + if "`crosstab'"=="" & "`sum2'"=="" { + *** ad hoc fixes for various multi-equation models + if "`cmd'"=="mvreg" | "`cmd'"=="sureg" | "`cmd'"=="reg3" { + local univar = 0 /* multivariate regression (multiple equations) */ + if "`onecol'" != "onecol" { + mat `r2mat' = `ebnames' /* get column labels */ + local neq = e(k_eq) + local depvar = "`eqlist'" + if "`cmd'"=="mvreg" { + local r2list = e(r2) + } + local eq = 1 + while `eq' <= `neq' { + if "`cmd'"=="mvreg" { + local r2str: word `eq' of `r2list' + scalar `rsq' = real("`r2str'") + } + else { + scalar `rsq' = e(r2_`eq') + } + mat `r2mat'[1,`eq'] = `rsq' + local eq = `eq' + 1 + } + } + else { + /* if onecol */ + local r2 = "nor2" + scalar `rsq' = . + } + } /* `rsq' after `r2list' to avoid type mismatch */ + + else if "`adjr2'"=="adjr2" { + scalar `rsq' = e(r2_a) + if `rsq' == . { + di in red "Adjusted R-squared (e(r2_a)) not defined; cannot use adjr2 option" + exit 198 + } + } + else { + scalar `rsq' = e(r2) + } + + if ("`cmd'"=="intreg" | "`cmd'"=="svyintrg" | "`cmd'"=="xtintreg") { + local depvar : word 1 of `depvar' /* 2 depvars listed */ + } + + * nolabels for anova and fracpoly + *if ("`cmd'"=="anova" | `fracpol' | "`cmd'"=="nl") { + if ("`cmd'"=="anova" | `fracpol' ) { + /* e(fp_cmd)!=. means fracpoly */ + local cons "nocons" + } + + *** margin or dprobit: substitute marginal effects into b and vc + else if ("`cmd'"=="dprobit" | "`margin'"=="margin") { + if "`cmd'"=="dlogit2" | "`cmd'"=="dprobit2" | "`cmd'"=="dmlogit2" { + di in yellow "warning: margin option not needed" + } + else { + marginal2, b(`b') vc(`vc') `se' `margucp' + local bcols = colsof(`b') /* cols of b */ + local bocols = `bcols' /* cols of b only, w/o other stats */ + if "`cmd'"=="dprobit" { + local cons "nocons" + } + } + } + } /* not crosstab or sum */ + + *** to handle single or multiple equations + local neq = `eqcount' + local eqlist "`eqlist'" + if "`onecol'"=="onecol" | `univar'==1 { + if "`depvar'"=="" { + local depvar: rowname `ebnames' + *local depvar: word 1 of `depvar' + } + } + } /* eretrun */ + + local ctitleList `"`ctitle'"' + + *** the column title: + * save the original ctitle for the first run and restore prior to each subsequent run + if `estnum'==1 { + local ctitleSave `"`ctitleList'"' + } + else { + local ctitleList `"`ctitleSave'"' + } + + local cttop_comma `"`cttop',"' + + *** label for depvar (for ctitle reporting) + local ct_depvar + if "`depvar'"~="" { + local ct_depvar `depvar' + if "`label'"=="label" { + cap local ct_depvar : var label `depvar' + if `"`ct_depvar'"'=="" { + local ct_depvar `depvar' + } + } + } + + + *** clean up column titles + * from current, non-stored estimates + if (`univar'==1 | "`onecol'"=="onecol") & `estStored'==0 { + if `"`ctitle0'"'=="" & `"`ctitleList'"'=="" { + if `"`cttop'"'~="" { + local ctitleList `"`cttop'"' + } + if `"`cttop'"'~="" & "`sum'"=="" & "`sum2'"=="" & "`crosstab'"=="" & "`tab3'"=="" { + local ctitleList `"`cttop_comma' `ct_depvar'"' + } + + if `"`cttop'"'=="" & "`sum'"=="" & "`sum2'"=="" & "`crosstab'"=="" & "`tab3'"=="" & "`onecol'"=="" { + if "`sideway'"=="sideway" { + local count: word count `statsList' + if `count'>=1 & `count'<. & "`ctitle0'"=="" { + local temp: word 1 of `statsList' + local ctitleList `"`ct_depvar', `temp'"' + forval num=2/`count' { + local temp: word `num' of `statsList' + local ctitleList `"`ctitleList'; `temp'"' + } + } + else { + local ctitleList `"`ct_depvar'"' + } + } + else { + * not a sideway + local ctitleList `"`ct_depvar'"' + } + } + } + } + else { + if `"`ctitle0'"'=="" & `estStored'==0 { + if "`eqname'"~="" { + * sometimes multiple depvar, i.e. reg3 + local count: word count `depvar' + if `count'>=1 & `count'<. & "`ctitle0'"=="" { + local temp: word 1 of `depvar' + local ctitleList `"`eqname', `temp'"' + forval num=2/`count' { + +*** needs to be label of depvar + local temp: word `num' of `depvar' + local ctitleList `"`ctitleList' ; `eqname', `temp'"' + } + } + } + else { + * sometimes multiple depvar, i.e. reg3 + local count: word count `depvar' + if `count'>=1 & `count'<. { + local temp: word 1 of `depvar' + local ctitleList `"`ctitleList' `temp'"' + forval num=2/`count' { + local temp: word `num' of `depvar' + local ctitleList `"`ctitleList' ; `temp'"' + } + } + } + } + else if `"`ctitle0'"'=="" { + * when from stored estimates + local ctitleList=`"`estname', `ct_depvar'"' + if `"`eqname'"'~="" { + local ctitleList=`"`estname', `eqname', `ct_depvar'"' + } + } + } + + if `"ctitleList'"'=="" { + local ctitleList `"`ct_depvar'"' + } + + *** when `ebnames' includes extra statistics (which don't have variable labels) + capture mat `b_alone' = `b'[1,"`depvar':"] + + if _rc==0 { + local bocols = colsof(`b_alone') + } + else if ("`cmd'"=="ologit" | "`cmd'"=="oprobit") { + local bocols = e(df_m) + mat `b_alone' = `b'[1,1..`bocols'] + } + else if ("`cmd'"=="cnreg" | ("`cmd'"=="tobit" & "`margin'"~="margin")) { + local bocols = `bocols'-1 /* last element of `ebnames' is not est coef */ + mat `b_alone' = `b'[1,1..`bocols'] + } + else if ("`cmd'"=="intreg" | "`cmd'"=="svyintrg") { + mat `b_alone' = `b'[1,"model:"] + local bocols = colsof(`b_alone') + } + else if ("`cmd'"=="truncreg") { + mat `b_alone' = `b'[1,"eq1:"] + local bocols = colsof(`b_alone') + } + + * keep these here for sideway option + if "`statsListKeep'"=="" { + local statsListKeep "`statsList'" + local statsManyKeep "`statsMany'" + } + if "`ctitleListKeep'"=="" { + local ctitleListKeep "`ctitleList'" + } + + + if "`Version7'"=="" { + local eqlist "`eqlist7'" + } + + *** fix for xtpoisson and version 11 probit etc + if "`wide'"~="wide" & ("`e(cmd)'"=="xtpoisson" | "`e(cmd)'"=="oprobit" | "`e(cmd)'"=="ologit" | `eqcount'==1) { + local eqsingle eqsingle + } + if (`eqcount'==1) { + local eqsingle eqsingle + } + + * dependent variable + if "`sum2'"~="" { + local depvarshow nodepvarshow + } + + *** create table with makeFile and append to existing table + * NOTE: makeFile command is rclass + qui { + + * work around for weighted margins + local makeFile_wt `weight'`exp' + if "`e(cmd)'"=="margins" { + local makeFile_wt + } + + cap preserve + + *** make univariate regression table (single equation or single column) + if `univar'==1 | "`onecol'"=="onecol" | "`eqsingle'"=="eqsingle" { + + * changing the equation name of univariate case for housekeeping purposes + if `univar'==1 & "`onecol'"=="onecol" { + * attach equation marker for onecol output; it sorts better + * cap in case it already exists + cap mat colnames `b'= "`depvar':" + } + + *** sideway single equation + + if "`sideway'"=="sideway" { + local sidewayRun "`statsManyKeep'" + local statsMany 1 + } + else { + local sidewayRun 1 + } + + forval sidewayWave=1/`sidewayRun' { + if "`sideway'"=="sideway" { + * must do it by hand to handle cmd( ) - but "ad hoc" fix inside makeFile + *local var: word `sidewayWave' of `statsListKeep' + local statsTwo `"`statsListKeep'"' + forval temp=1/`sidewayWave' { + gettoken one statsTwo : statsTwo, `bind' + } + local var `"`one'"' + local statsList `"`var'"' + + * parsing ctitleList contents (1.1 of 2), parsing by ";" + local ctitleTwo `"`ctitleListKeep'"' + + forval temp=1/`=`sidewayWave'*2-1' { + gettoken one ctitleTwo: ctitleTwo, `bind' parse(";") + + } + local ctitleList `"`one'"' + + if "`onecol'"~="" { + if `sidewayRun'==1 { + *local ctitleList `"`cttop_comma' Freq, (Percent)"' + } + else { + if `sidewayWave'==1 { + local ctitleList `" `ctitleList', `var'"' + } + else { + local ctitleList `" `var'"' + } + } + } + if "`crosstab'"=="crosstab" { + if `sidewayRun'==1 { + local ctitleList `"`cttop_comma' Freq, (Percent)"' + } + else { + if `sidewayWave'==1 { + local ctitleList `"`cttop_comma' Freq"' + } + else { + local ctitleList `"`cttop_comma' Percent"' + } + } + } + else if `"`ctitleList'"'=="" & `"`cttop'"'~="" { + if `sidewayWave'==1 { + local ctitleList `"`cttop_comma' `depvar', `var'"' + } + else { + local ctitleList `"`var'"' + } + } + else if `"`ctitleList'"'=="" { + if `sidewayWave'==1 { + local ctitleList "`depvar', `var'" + } + else { + local ctitleList `"`var'"' + } + } + if `"`ctitleList'"'=="" { + local ctitleList `"`ctitleListKeep'"' + } + } + else { + * not sideway + if "`crosstab'"=="crosstab" { + local ctitleList `"`cttop_comma' Freq, (Percent)"' + } + } + + * cover all eventuality + if `"`ctitleList'"'=="" { + local ctitleList `"`depvar'"' + } + + * to avoid overwriting after the first time, append from the second time around (2 of 3) + if `sidewayWave'==2 & "`replace'"=="replace" { + local append "append" + local replace "" + } + + if "`Version7'"=="" { + * it is version 7 + * b(`b') instead of b(`b_eq'), vc(`vc') instead of vc(`vc_eq') + makeFile `varlist' `ifList' `in' [`makeFile_wt'], equationsOption(`equationsOption') keep(`keepList') drop(`drop') eqmatch(`eqmatch') /* + */ eqkeep(`eqkeep') eqdrop(`eqdrop') eqlist(`eqlist') /* + */ `betaAsked' statsMany(`statsMany') statsList(`statsList') `se_skip' `beta' level(`level') /* + */ dec(`dec') fmt(`fmt') bdec(`bdec') bfmt(`bfmt') sdec(`sdec') sfmt(`sfmt') /* + */ tdec(`tdec') pdec(`pdec') /* + */ rdec(`rdec') adec(`adec') /* + */ `paren' parenthesis(`parenthesis') `bracket' /* + */ bracketA(`bracketA') `aster' `symbol' `cons' `eform' `obs' `ni' `r2' `adjr2' /* + */ ctitleList(`ctitleList') auto(`auto') `noauto' /* + */ addstat(`addstat') addtext(`addtext') `notes' /* + */ `addnote' `append' regN(`regN') df_r(`df_r') rsq(`rsq') numi(`numi') ivar(`ivar') depvar(`depvar') /* + */ robust(`robust') borows(`bocols') b(`b') vc(`vc') /* + */ univar(`univar') `onecol' estname(`estname') estnameUnique(`estnameUnique') /* + */ fileExist(`fileExist') less(`less') alpha(`alpha') asterisk(`asterisk') `2aster' /* + */ variables(`VARIABLES') matList(`matList') leave(`leave') sidewayWave(`sidewayWave') `wide' + * taken out: `se' `pvalue' `ci' `tstat' + } + else { + * b(`b') instead of b(`b_eq'), vc(`vc') instead of vc(`vc_eq') + makeFile `varlist' `ifList' `in' [`makeFile_wt'], equationsOption(`equationsOption') keep(`keepList') drop(`drop') eqmatch(`eqmatch') /* + */ inddrop(`inddrop') indyes(`indyes') indno(`indno') /* + */ eqkeep(`eqkeep') eqdrop(`eqdrop') eqlist(`eqlist') /* + */ `betaAsked' statsMany(`statsMany') statsList(`statsList') `se_skip' `beta' level(`level') /* + */ dec(`dec') fmt(`fmt') bdec(`bdec') bfmt(`bfmt') sdec(`sdec') sfmt(`sfmt') /* + */ tdec(`tdec') tfmt(`tfmt') pdec(`pdec') pfmt(`pfmt') /* + */ rdec(`rdec') rfmt(`rfmt') adec(`adec') /* + */ `paren' parenthesis(`parenthesis') `bracket' /* + */ bracketA(`bracketA') `aster' `symbol' `cons' `eform' `obs' `ni' `r2' `adjr2' /* + */ ctitleList(`ctitleList') auto(`auto') `noauto' /* + */ addstat(`addstat') addtext(`addtext') `notes' /* + */ `addnote' `append' regN(`regN') df_r(`df_r') rsq(`rsq') numi(`numi') ivar(`ivar') depvar(`depvar') /* + */ robust(`robust') borows(`bocols') b(`b') vc(`vc') /* + */ univar(`univar') `onecol' estname(`estname') estnameUnique(`estnameUnique') /* + */ fileExist(`fileExist') less(`less') alpha(`alpha') asterisk(`asterisk') `2aster' /* + */ variables(`VARIABLES') matList(`matList') leave(`leave') sidewayWave(`sidewayWave') `wide' decmark(`decmark') /* + */ `eqsingle' stnum(`stnum') ststr(`ststr') `eretrun' ctbot(`ctbot') /* + */ policy0(`policy0') `noomitted' `nobase' `skip' addvar(`addvar') depvarshow(`depvarshow') + * taken out: `se' `pvalue' `ci' `tstat' + } + + *if "`append'"~="append" { + if "`append'"~="append" & `sidewayWave'==1 { + * replace + outsheet2 report reportCol `using', nonames `quote' `comma' replace slow(`slow') + local fileExist 1 + } + + else { + *** appending + * confirm the existence of the output file + local rest "`using'" + * strip off "using" + gettoken part rest: rest, parse(" ") + if `fileExist'==1 { + appendFile `using', titlefile(`"`titlefile'"') /* + */`sideway' `onecol' sortcol(`sortcol') sortvar(`sortvar') groupvar(`groupvar') `quote' `comma' slow(`slow') + + outsheet2 v* reportCol `using', nonames `quote' `comma' replace slow(`slow') + *drop v* + } + else { + * does not exist and therefore needs to be created + outsheet2 report reportCol `using', nonames `quote' `comma' replace slow(`slow') + local fileExist 1 + } + } + restore, preserve + } /* sideway single equation */ + } + + *** make multiple equation regression table (wide format) + else { + + tempname b_eq vc_eq + + * getting the depvar list from eqlist + local eq = 1 + while `eq' <= `neq' { + + local eqname: word `eq' of `eqlist' + local depvar: word `eq' of `eqlist' + + if `eq'==1 { + if `estStored'==1 & "`estname'"~="" { + if `"`ctitle0'"'=="" & `eq'==1 { + local ctitleList "`estname', `depvar'" + } + } + else if `"`ctitle0'"'=="" { + if `"`cttop'"'~="" { + local ctitleList "`cttop_comma' `depvar'" + } + else { + local ctitleList "`depvar'" + } + } + } + else if `"`ctitle0'"'=="" { + * subsequent columns + if `estStored'==1 & "`estname'"~="" { + local ctitleList ", `depvar'" + } + else { + local ctitleList "`depvar'" + } + } + + *** r2mat doesn't exist for mlogit ="capture", the rest for non-eretrun + capture scalar `rsq' = `r2mat'[1,`eq'] + cap mat `b_eq' = `b'[.,"`eqname':"] + + * remove roweq from b_eq for explicit varlist + cap matrix colnames `b_eq' = _: + cap mat `vc_eq' = `vc'["`eqname':","`eqname':"] + cap local bocols = colsof(`b_eq') + + *** sideway multiple equation + + if "`sideway'"=="sideway" { + local sidewayRun "`statsManyKeep'" + local statsMany 1 + } + else { + local sidewayRun 1 + } + + forval sidewayWave=1/`sidewayRun' { + if "`sideway'"=="sideway" { + * must do it by hand to handle cmd( ) - but "ad hoc" fix inside makeFile + *local var: word `sidewayWave' of `statsListKeep' + local statsTwo `"`statsListKeep'"' + forval temp=1/`sidewayWave' { + gettoken one statsTwo : statsTwo, `bind' + } + local var `"`one'"' + local statsList "`var'" + + + * parsing ctitleList contents (1.2 of 2), parsing by ";" + local ctitleTwo `"`ctitleListKeep'"' + forval temp=1/`=`sidewayWave'*2-1' { + gettoken one ctitleTwo: ctitleTwo, `bind' parse(";") + } + local ctitleList1 `"`ctitleList', `one'"' + + + local ctitleList1 `"`ctitleList'"' + if `"`ctitleList1'"'=="" { + local ctitleList1 "`var'" + } + } + else { + local ctitleList1 `"`ctitleList'"' + } + + * to avoid overwriting after the first time, append from the second time around (3 of 3) + if `sidewayWave'==2 & "`replace'"=="replace" { + local append "append" + local replace "" + } + + if `eq'>1 & `sidewayWave'>1 { + local addstat "" + } + + if `eq' == 1 & "`append'"!="append" & `sidewayWave'==1 { + local apptmp "" + } + else { + local apptmp "append" + } + + * cover all eventuality + if `"`ctitleList'"'=="" { + local ctitleList `"`depvar'"' + } + + if "`Version7'"=="" { + * it is version 7 + makeFile `varlist' `ifList' `in' [`makeFile_wt'], equationsOption(`equationsOption') keep(`keepList') drop(`drop') eqmatch(`eqmatch') /* + */ eqkeep(`eqkeep') eqdrop(`eqdrop') eqlist(`eqlist') /* + */ `betaAsked' statsMany(`statsMany') statsList(`statsList') `se_skip' `beta' level(`level') /* + */ dec(`dec') fmt(`fmt') bdec(`bdec') bfmt(`bfmt') sdec(`sdec') sfmt(`sfmt') /* + */ tdec(`tdec') pdec(`pdec') /* + */ rdec(`rdec') adec(`adec') /* + */ `paren' parenthesis(`parenthesis') `bracket' /* + */ bracketA(`bracketA') `aster' `symbol' `cons' `eform' `obs' `ni' `r2' `adjr2' /* + */ ctitleList(`ctitleList1') auto(`auto') `noauto' /* + */ addstat(`addstat') addtext(`addtext') `notes' /* + */ `addnote' `apptmp' regN(`regN') df_r(`df_r') rsq(`rsq') numi(`numi') ivar(`ivar') depvar(`depvar') /* + */ robust(`robust') borows(`bocols') b(`b_eq') vc(`vc_eq') /* + */ univar(`univar') `onecol' estname(`estname') estnameUnique(`estnameUnique') /* + */ fileExist(`fileExist') less(`less') alpha(`alpha') asterisk(`asterisk') `2aster' /* + */ variables(`VARIABLES') matList(`matList') leave(`leave') sidewayWave(`sidewayWave') `wide' + * taken out: `se' `pvalue' `ci' `tstat' + } + else { + makeFile `varlist' `ifList' `in' [`makeFile_wt'], equationsOption(`equationsOption') keep(`keepList') drop(`drop') eqmatch(`eqmatch') /* + */ inddrop(`inddrop') indyes(`indyes') indno(`indno') /* + */ eqkeep(`eqkeep') eqdrop(`eqdrop') eqlist(`eqlist') /* + */ `betaAsked' statsMany(`statsMany') statsList(`statsList') `se_skip' `beta' level(`level') /* + */ dec(`dec') fmt(`fmt') bdec(`bdec') bfmt(`bfmt') sdec(`sdec') sfmt(`sfmt') /* + */ tdec(`tdec') tfmt(`tfmt') pdec(`pdec') pfmt(`pfmt') /* + */ rdec(`rdec') rfmt(`rfmt') adec(`adec') /* + */ `paren' parenthesis(`parenthesis') `bracket' /* + */ bracketA(`bracketA') `aster' `symbol' `cons' `eform' `obs' `ni' `r2' `adjr2' /* + */ ctitleList(`ctitleList1') auto(`auto') `noauto' /* + */ addstat(`addstat') addtext(`addtext') `notes' /* + */ `addnote' `apptmp' regN(`regN') df_r(`df_r') rsq(`rsq') numi(`numi') ivar(`ivar') depvar(`depvar') /* + */ robust(`robust') borows(`bocols') b(`b_eq') vc(`vc_eq') /* + */ univar(`univar') `onecol' estname(`estname') estnameUnique(`estnameUnique') /* + */ fileExist(`fileExist') less(`less') alpha(`alpha') asterisk(`asterisk') `2aster' /* + */ variables(`VARIABLES') matList(`matList') leave(`leave') sidewayWave(`sidewayWave') decmark(`decmark') /* + */ `eqsingle' stnum(`stnum') ststr(`ststr') `eretrun' ctbot(`ctbot') `wide' /* + */ policy0(`policy0') `noomitted' `nobase' `skip' addvar(`addvar') depvarshow(`depvarshow') + * taken out: `se' `pvalue' `ci' `tstat' + } + + * create new file: replace and the first equation + if `eq' == 1 & "`append'"!="append" & `sidewayWave'==1 { + outsheet2 report reportCol `using', nonames `quote' `comma' `replace' slow(`slow') + local fileExist 1 + } + * appending here: another estimates or another equation + else { + * confirm the existence of the output file + local rest "`using'" + * strip off "using" + gettoken part rest: rest, parse(" ") + if `fileExist'==1 { + * it exists: keep on appending even if it's the first equation + appendFile `using', titlefile(`"`titlefile'"') `sideway' /* + */ `onecol' sortcol(`sortcol') sortvar(`sortvar') groupvar(`groupvar') `quote' `comma' slow(`slow') + outsheet2 v* reportCol `using', nonames `quote' `comma' replace slow(`slow') + *drop v* + } + else { + * does not exist and specified append: need to be created for the first equation only + *if `eq' == 1 & "`append'"=="append" { + if `eq' == 1 & "`append'"=="append" & `sidewayWave'==1 { + outsheet2 report reportCol `using', nonames `quote' `comma' `replace' slow(`slow') + local fileExist 1 + } + } + } + + restore, preserve + } /* sideway multiple equation */ + + local eq = `eq' + 1 + + *restore, preserve /* to access var labels after first equation */ + } + } + } /* for quietly */ +} /* run each estimates consecutively */ + +quietly { + *** pre-generate labels + if "`label'"~="" | "`labelA'"~="" { + local varname_list `varname_list1' `varname_list2' + macroUnique `varname_list', names(varname_list) + + tempname labelsave + tempfile label_file + file open `labelsave' using `label_file', write replace + foreach var in `varname_list' { + if `"`var'"'~="_cons" & `"`var'"'~="Constant" { + fvts_label `var' + file write `labelsave' `"`var'"' _tab `"`fvts_label_list'"' _n + } + } + + * constant here + file write `labelsave' `"_cons"' _tab `"Constant"' _n + file write `labelsave' `"Constant"' _tab `"Constant"' _n + + file close `labelsave' + insheet using `label_file', clear + } + + + *** clean the files to be prepared for output + if "`pivot'"=="pivot" { + + *** pivot and xpose here + _strxpose `using', `quote' `comma' title(`title') titlefile(`"`titlefile'"') `label' /* + */ labelOption(`labelOption') + * c_locals titleWide headRow bottomRow + } + else { + + cleanFile `using', `quote' `comma' title(`title') titlefile(`"`titlefile'"') `label' /* + */ labelOption(`labelOption') slow(`slow') label_file(`label_file') + * c_locals titleWide headRow bottomRow + } + + *** preparing for outputs and seeout + ren v1 coef + cap ren v0 eq + + unab vlist : v* + local count: word count `vlist' + forval num=1/`count' { + local vname: word `num' of `vlist' + ren `vname' v`num' + } + + * number of columns + describe, short + local numcol = `r(k)' + + tempvar blanks rowmiss + gen int `blanks' = (trim(v1)=="") + + foreach var of varlist v* { + replace `blanks' = `blanks' & (trim(`var')=="") + } + + replace `blanks'=0 if coef==`"`VARIABLES'"' | coef[_n-1]==`"`VARIABLES'"' + + * fix blanks==1 for groupvar( ) + count if `blanks'==1 + local rN=`r(N)'+1 + forval num=1/`rN' { + replace `blanks'=0 if `blanks'[_n+1]==0 & `blanks'==1 + } + + * headBorder & bottomBorder + local headBorder=`headRow'+`titleWide' + local bottomBorder=`bottomRow'+`titleWide' /* add eqAdded later */ + + *** making alternative output files + if "`long'"=="long" | "`excel'"=="excel" | "`xmlsave'"=="xmlsave" |"`word'"=="word" | `tex'==1 | "`dta'"=="dta" | "`dtaa'"~="" | "`text'"=="text" | "`pivot'"=="pivot" { + + if "`text'"=="text" | ("`long'"=="long" & "`onecol'"=="onecol") { + local dot=index(`"`using'"',".") + if `dot'~=0 { + local before=substr(`"`using'"',1,`dot'-1) + local after=substr(`"`using'"',`dot'+1,length(`"`using'"')) + + *local usingLong=`"`before'_long.`after'"' + local usingLong=`"`before'_exact.`after'"' + } + } + + local eq_exist + capture confirm variable eq + *if _rc~=0 & "`long'"=="long" { + * noi di in yellow "equation not detected; {opt long} may not be needed" + *} + + *** convert the data into long format (insert the equation names if they exist) + if _rc==0 & "`long'"=="long" & "`onecol'"=="onecol" { + * a routine to insert equation names into coefficient column + count if `blanks'==0 & eq~="" & eq~="EQUATION" + + gen float id5=_n + local _firstN=_N + set obs `=_N+`r(N)'' + local times 1 + forval num=2/`_firstN' { + if eq[`num']~="" & eq[`num']~="EQUATION" { + replace id5=`num'-.5 in `=`_firstN'+`times'' + local times=`times'+1 + } + } + * eqAdded here: + local bottomBorder=`bottomBorder'+`r(N)' + count if `blanks'==0 & eq~="" & eq~="EQUATION" + local _firstN=_N + set obs `=_N+`r(N)'' + local times 1 + forval num=2/`_firstN' { + if eq[`num']~="" & eq[`num']~="EQUATION" { + replace id5=`num'-.75 in `=`_firstN'+`times'' + replace coef=eq[`num'] in `=`_firstN'+`times'' + local times=`times'+1 + } + } + + sort id5 + + drop eq id5 `blanks' + + * change `bottomBorder' by the number of equations inserted + local bottomBorder=`bottomBorder'+`r(N)' + + * v names + unab vlist : * + local count: word count `vlist' + forval num=1/`count' { + local vname: word `num' of `vlist' + ren `vname' c`num' + } + forval num=1/`count' { + local vname: word `num' of `vlist' + ren c`num' v`num' + } + + if "`text'"=="text" { + outsheet2 v* `usingLong', nonames `quote' `comma' replace slow(`slow') + } + + } /* long format */ + + else { + drop `blanks' + + * v names + unab vlist : * + local count: word count `vlist' + forval num=1/`count' { + local vname: word `num' of `vlist' + ren `vname' c`num' + } + forval num=1/`count' { + local vname: word `num' of `vlist' + ren c`num' v`num' + } + } + + *** label replacement + if "`label'"=="label" { + if ("`long'"~="long" & "`onecol'"~="onecol") | ("`long'"=="long" & "`onecol'"=="onecol") { + replace v2=v1 if v2=="" + drop v1 + describe, short + forval num=1/`r(k)' { + ren v`=`num'+1' v`num' + } + + * change LABELS to VARIABLES in 1/3 + replace v1=`"`VARIABLES'"' if v1=="LABELS" + } + else if "`long'"~="long" & "`onecol'"=="onecol" { + replace v3=v2 if v3=="" + drop v2 + describe, short + forval num=2/`r(k)' { + ren v`=`num'+1' v`num' + } + + * change LABELS to VARIABLES + replace v2=`"`VARIABLES'"' if v2=="LABELS" + } + + * create new text file + * do it for _long file as well + if "`text'"=="text" { + + } + } + + *** Pivot thing + *if "`pivot'"=="pivot" { + * * produce verbatim text + * + *} + + + tempfile outing outing1 + save `"`outing1'"' + save `"`outing'"' + + local e_headBorder `headBorder' + local e_bottomBorder `bottomBorder' + + *** Transpose thing + if "`xposea'"~="" { + _xposea_parse, `xposea' + if "`whole'"=="whole" { + _strxpose, clear force + local num 1 + foreach var of varlist _all { + ren `var' v`num' + local num=`num'+1 + } + + local N=_N + if `N'<=2 { + * insert if too small + *gen temp=_n + set obs `=`N'+1' + *replace temp= 0 in `N' + *sort temp + *drop temp + + local N=_N + local e_headBorder 1 + local e_bottomBorder 2 + } + else { + local N=_N + local e_headBorder 1 + local e_bottomBorder `N' + } + } + save `"`outing1'"', replace + } + + use `"`outing'"', clear + + *** Text thing + if "`text'"=="text" & "`label'"=="label" { + * produce verbatim text + outsheet2 v* `usingLong', nonames `quote' `comma' replace slow(`slow') + } + + *** LaTeX thing + if `tex' { + + * make certain `1' is not `using' (another context) + + _texout v* using `"`strippedname'"', texFile(`texFile') titleWide(`titleWide') headBorder(`headBorder') bottomBorder(`bottomBorder') `texopts' replace + + if `"`texFile'"'=="" { + local endName "tex" + } + else { + local endName "`texFile'" + } + + local usingTerm `"`strippedname'.`endName'"' + + c_local cl_tex `"{stata `"shellout using `"`usingTerm'"'"':`usingTerm'}"' + *noi di as txt `"`cl_tex'"' + } + + *** Word rtf file thing + if "`word'"=="word" { + use `"`outing'"',clear + + * there must be varlist to avoid error + *out2rtf2 v* `using', titleWide(`titleWide') headBorder(`headBorder') bottomBorder(`bottomBorder') replace nopretty + out2rtf2 v* using `"`strippedname'"', wordFile(`wordFile') titleWide(`titleWide') /* + */ headBorder(`headBorder') bottomBorder(`bottomBorder') replace nopretty + local temp `r(documentname)' + + * strip off "using" and quotes + gettoken part rest: temp, parse(" ") + gettoken usingTerm second: rest, parse(" ") + + *local cl `"{stata shell winexec cmd /c tommy.rtf & exit `usingTerm' & EXIT :`usingTerm' }"' + * these work but leaves the window open + *local cl `"{stata winexec cmd /c "`usingTerm'" & EXIT :`usingTerm'}"' + *local cl `"{stata shell "`usingTerm'" & EXIT :`usingTerm'}"' + *local cl `"{stata shell cmd /c "`usingTerm'" & EXIT :`usingTerm'}"' + + c_local cl_word `"{stata `"shellout using `"`usingTerm'"'"':`usingTerm'}"' + *noi di as txt `"`cl_word'"' + } + + *** Excel xml file thing + if "`excel'"=="excel" { + use `"`outing1'"',clear + + *xmlsave `"`strippedname'.xml"',doctype(excel) replace legible + _xmlout using `"`strippedname'"', excelFile(`excelFile') nonames titleWide(`titleWide') /* + */ headBorder(`e_headBorder') bottomBorder(`e_bottomBorder') outreg2 `insert' excel1(`excel1') + + if `"`excelFile'"'=="" { + local endName "xml" + } + else { + local endName "`excelFile'" + } + + local usingTerm `"`strippedname'.`endName'"' + + *c_local cl_excel `"{stata `"shellout using `"`usingTerm'"'"':`usingTerm'}"' + c_local cl_excel `"{browse `"`usingTerm'"'}"' + *noi di as txt `"`cl_excel'"' + } + + *** xmlsave xml file thing + if "`xmlsave'"=="xmlsave" { + use `"`outing1'"',clear + + xmlsave `"`strippedname'_xmlsave.xml"',doctype(excel) replace legible + *_xmlout using `"`strippedname'"', excelFile(`excelFile') nonames titleWide(`titleWide') /* + * */ headBorder(`e_headBorder') bottomBorder(`e_bottomBorder') outreg2 `insert' + + if `"`excelFile'"'=="" { + local endName "xml" + } + else { + local endName "`excelFile'" + } + + local usingTerm `"`strippedname'.`endName'"' + + *c_local cl_excel `"{stata `"shellout using `"`usingTerm'"'"':`usingTerm'}"' + c_local cl_xmlsave `"{browse `"`usingTerm'"'}"' + *noi di as txt `"`cl_excel'"' + } + + *** Stata dta file thing + if "`dta'"=="dta" | "`dtaa'"~="" { + use `"`outing1'"',clear + if "`dtaa'"~="" { + if "`dtaa'"=="saveold" { + saveold "`strippedname'_dta", replace + } + else { + noi di in red "`dtaa' is not a vaild sub-option for {opt dta( )}" + exit 198 + } + } + else { + save "`strippedname'_dta", replace + } + *c_local cl_dta `"{stata "`strippedname'_dta.dta":dta}"' + *c_local cl_dta `"{stata `"seeout using "`strippedname'_dta", dta"':dta}"' + } + } /* output files */ +} /* quietly */ + +* re-clean to get each options returned +optionSyntax, valid(insert upper lower proper) name(labelA) nameShow(label( )) content(`labelOption') + +*** see the output +if "`label'"=="label" | "`insert'"=="insert" { + if "`seeout'"=="seeout" { + if "`label'"=="label" { + seeing `using', label + } + else { + seeing `using', label(`insert') + } + } + if "`label'"=="label" { + c_local cl_see `"{stata `"seeout using `file', label"':seeout}"' + } + else { + c_local cl_see `"{stata `"seeout using `file', label(`insert')"':seeout}"' + } + *di as txt `"`cl'"' +} +else { + if "`seeout'"=="seeout" { + seeing `using' + } + c_local cl_see `"{stata `"seeout using `file'"':seeout}"' + *di as txt `"`cl'"' +} + + +*** pass up the requested +if `"`c_request'"'~="" { + c_local c_request `"`c_request'"' +} + +end /* end of _outreg2 */ + + +******************************************************************************************** + + +prog define appendFile +* previously appfile2 + + versionSet + version `version' + +* append regression results to pre-existing file + +syntax using/, titlefile(str) [sideway onecol sortcol(str) sortvar(str) groupvar(str) /* + */ noQUOte comma slow(numlist)] + +*** take out VARIABLES as the column heading and restore later +*local VARIABLES2 "`variables'" + +* first name is the VARIABLES +local content +local num 1 +local N=_N +while `"`content'"'=="" & `num'<=`N' { + local content=report[`num'] + local num=`num'+1 +} +local VARIABLES2 `"`content'"' +replace report = "" if report==`"`VARIABLES2'"' & rowtype2==-1 + + +* column number rows +* pre-create Vorder here +gen Vorder2=0 if rowtype2==0 +while Vorder2[1]==. { + replace Vorder2=Vorder2[_n+1]-1 if rowtype2==-1 +} +egen min=min(Vorder2) +replace Vorder2=-99 if Vorder2==min +drop min + +* Constant is now done as eqOrder0 + .5 +*replace Vorder2=2 if report=="Constant" /* ok because equation names would still be attached if present */ + +* orders bottom row, Observations, r2, and else +replace Vorder2=3.8 if rowtype2>=2 +replace Vorder2=Vorder2[_n-1]+.0001 if Vorder2>=3.8 & rowtype2==3 +replace Vorder2=2 if rowtype2==2 +replace Vorder2=3.5 if report=="Observations" +replace Vorder2=3.6 if report=="R-squared" + +replace Vorder2=1 if Vorder2==. & (Vorder2[_n-1]<1 | Vorder2[_n-1]==1) +replace Vorder2=2.5 if report=="" & (Vorder2[_n-1]==2 | Vorder2[_n-1]==2.5) + + +* genderate eq_order2 (handles Constant within each equation) +local N=_N +gen eq_order2=0 in 3/`N' if eqname~="" +replace eq_order2=1 in 3/`N' if eqname[_n]~=eqname[_n-1] & eqname~="" +replace eq_order2=eq_order2+eq_order2[_n-1] if eq_order2+eq_order2[_n-1]~=. + + +* sortvar within appendFile 1 of 2 +* generating order within each coefficient, use sortvar( ) if available +gen Vorder2_0=. +local maxnum 1 +if "`sortvar'"~="" { + tokenize `policy0' `sortvar' + local num 1 + while "``num''"~="" { + replace Vorder2_0=`num' if varname=="``num''" + local num=`num'+1 + } + if `num'>`maxnum' { + local maxnum `num' + } +} + +* the evil twin of sortvar that will insert blanks/groups as well as order the existing variables +if "`groupvar'"~="" { + * stats rows per variable + count if report~="" & rowtype2==1 + local nom `r(N)' + count if rowtype2==1 + if `nom'~=0 { + local rN=`r(N)' + *local many=int(round(`rN'/`nom')) + local many=int(round(`rN'/`nom',1)) + } + else { + local many 2 + } + + * eqnames for multiple equation + tab eqname if rowtype2==1 + local rr=`r(r)' + local tempList + local orderlist + if `rr'> 0 { + * get eq names + + gen str5 temp="" + replace temp=eqname if eqname~=eqname[_n-1] & rowtype2==1 + sort temp + local N=_N + forval num=1/`rr' { + local content=temp[`N'-`num'+1] + local tempList="`tempList' `content'" + local content=eq_order2[`N'-`num'+1] + local orderlist="`orderlist' `content'" + } + drop temp + sort mrgrow + local times `rr' + } + else { + * it's a single equation, run it once + local times 1 + } + + tokenize `policy0' `groupvar' + forval kk=1/`times' { + local order: word `kk' of `orderlist' + local temp: word `kk' of `tempList' + + local num 1 + local count0 0 + while "``num''"~="" & "``num''"~=" " { + replace Vorder2_0=`num' if varname=="``num''" & eqname=="`temp'" + count if Vorder2_0~=. & eqname=="`temp'" + if `r(N)'==`count0' { + forval cc=1/`many' { + * insert this many blank var + local N=_N + set obs `=`N'+1' + local N=_N + if `cc'==1 { + replace report="``num''" in `N' + } + replace varname="``num''" in `N' + replace rowtype2=1 in `N' + replace Vorder2=1 in `N' + replace Vorder2_0=`num' in `N' + + * for multiple equation only + if `rr'>0 { + if `cc'==1 { + replace report="`temp':" + report in `N' + } + replace eq_order2=`order' in `N' + replace eqname="`temp'" in `N' + } + } + } + count if Vorder2_0~=. & eqname=="`temp'" + local count0 `r(N)' + local num=`num'+1 + } + if `num'>`maxnum' { + local maxnum `num' + } + } +} + + +* own column to handle sortvar (to handle in mutliple equation) +gen sortvarCol2=Vorder2_0 + +gen temp=_n +replace Vorder2_0 = temp+`maxnum' if Vorder2==1 & report~="" & Vorder2_0==. +replace Vorder2_0 = Vorder2_0[_n-1] if Vorder2_0==. & Vorder2==1 +drop temp + +replace sortvarCol2=Vorder2_0 if sortvarCol2~=. + +gen double Vorder2_1 = Vorder2_0 if Vorder2==1 & report~="" +replace Vorder2_1 = Vorder2_1[_n-1]+.01 if Vorder2_1==. & Vorder2==1 + +* for groupvar( ) above +sort Vorder2 eq_order2 Vorder2_1 mrgrow +replace mrgrow=_n + +gen str8 mergeOn = "" +replace mergeOn = report /* room for "!" at end */ + +gen str8 varsml="" +replace varsml = trim(mergeOn) + +* fill the spaces between the names +local N=_N + +replace mergeOn = mergeOn[_n-1]+"!" if varsml=="" +replace mergeOn = "bottomRow" if rowtype2==2 +replace mergeOn = "topRow" if rowtype2==0 +replace mergeOn = "_000" if rowtype2==-1 +gen varnum = Vorder2 if Vorder2<1 + +* add "!" to variable name to make it sort after previous variable name +* will cause bug if both "varname" and "varname!" already exist + +count if (varsml=="" | (varsml[_n+1]=="" & _n!=_N)) +local ncoeff2 = r(N) /* number of estimated coefficients in file 2 */ +local N2 = _N /* number of lines in file 2 */ +gen Vord2 = _n /* ordering variable for file 2 */ + +ren varname VarName2 +ren eqname eqName2 + +drop varsml + +* eqname vs eqName2 +keep report reportCol mergeOn varnum Vord2 Vorder2 Vorder2_0 Vorder2_1 VarName2 eqName2 eq_order2 rowtype2 sortvarCol2 + +tempfile mergeVarFile mergeEqFile +gen str8 mergeVar="" +gen str8 mergeEq="" + +*** get all constant rows 1 of 2 +gen constant2=0 +replace constant2=1 if (report=="Constant" | report=="_cons" | VarName2=="Constant" | VarName2=="_cons") +replace constant2=1 if mergeOn==mergeOn[_n-1]+"!" & constant2[_n-1]==1 + +* two sorting/merging mechanism +local N=_N +count if eqName2=="" | eqName2=="EQUATION" +if `N'==`r(N)' { + * single equation + local usingSingle 1 + replace mergeVar=mergeOn + + sort mergeVar varnum + save `"`mergeVarFile'"', replace +} +else { + * multiple equations + local usingSingle 0 + replace mergeEq=mergeOn + + replace mergeVar = mergeOn + replace mergeVar = VarName2 if VarName2~="" & Vorder2==1 + replace mergeVar = "Constant" if VarName2=="_cons" & Vorder2==1 + replace mergeVar = mergeVar[_n-1]+"!" if mergeVar==mergeVar[_n-1] & mergeVar~="" & Vorder2==1 + + sort mergeVar varnum + save `"`mergeVarFile'"', replace + + sort mergeEq varnum + save `"`mergeEqFile'"', replace +} + + +*** prepare the original file for merging + +if "`Version7'"=="" { + * it is version 7 + insheet2 using `"`using'"', nonames clear slow(`slow') +} +else { + * requires 8 or above + _chewfile using `"`using'"', semiclear + local num 1 + foreach var of varlist _all { + ren `var' v`num' + local num=`num'+1 + } +} + +if "`sideway'"=="sideway" { + * if sideway, need to split eqname and varname, no label or title here + cleanFile using `"`using'"', `quote' `comma' notitle slow(`slow') + + * get ride of v0 in case of equation + insheet2 using `"`using'"', nonames clear slow(`slow') +} + +*** save equation column if it exists before dropping it +local exists_eq=0 +count if v1=="EQUATION" +if `r(N)'~=0 { + gen str8 v0="" + replace v0=v1 + local exists_eq=1 + drop v1 + * count v0 as well + describe, short + forval num=2/`r(k)' { + ren v`num' v`=`num'-1' + } +} + +*** strip labels columns +count if v2=="LABELS" +if `r(N)'~=0 { + drop v2 + * count v0 as well + * cap is added to avoid the last column v0 being misnamed + describe, short + forval num=2/`r(k)' { + cap ren v`=`num'+1' v`num' + } +} + +*** save title first one only, before stripping coef columns +cap save `"`titlefile'"' + +*** must drop title first +if `exists_eq'==1 { + if v0[1]~="" { + * there may be a title + while v0[1]~="" & v2=="" { + drop in 1 + } + } +} +if v1[1]~="" { + * there may be a title + while v1[1]~="" & v2=="" { + drop in 1 + } +} + + +*local VARIABLES "`variables'" +* first name is the VARIABLES +local content +local num 1 +local N=_N +while `"`content'"'=="" & `num'<=`N' { + local content=v1[`num'] + local num=`num'+1 +} +local VARIABLES1 `"`content'"' + + +*** drop titles and establish the top row +*egen `rowmiss'=rowmiss(_all) +* rowmiss option not available in 8.2 or 8.0, do it by hand +gen rowmiss=0 +foreach var of varlist v* { + replace rowmiss=rowmiss+1 if `var'~="" +} + +* rowmiss will not catch if ctitles are blank for the first column (1), count down from the top (already done for VARIABLES1) +*replace rowmiss=1 if v1[_n-1]~="VARIABLES" +replace rowmiss=1 if v1[_n-1]~=`"`VARIABLES1'"' + +* NOTE: "VARIABLES" is no longer taken off; it merely gets written over in the same spot later on +while v1[1]~="" & rowmiss==1 { + drop in 1 +} + +*** finish cleaning the equation columns + +gen str8 VarName1="" +gen str8 eqName1="" + +gen rowtype1=-1 +replace rowtype1=0 if rowmiss==0 +replace rowtype1=999 if rowmiss[_n-1]==0 | rowtype1[_n-1]==999 +replace rowtype1=. if rowtype1==999 +drop rowmiss + +*** establish the bottom row +local N=_N +local num = `N' +local temp=v1[`num'] +while `"`temp'"'~="" & `num'>=1 { + * keep counting until empty + local num=`num'-1 + local temp=v1[`num'] +} +else { + * already empty + local num=`num'-1 +} + +local num=`num' + 1 +replace rowtype1= 1 if rowtype1==. +replace rowtype1= 2 if _n==`num' +replace rowtype1= 3 if _n>`num' + +if "`exists_eq'"=="1" { + *** Strip the equation names and slap it back onto the variable column + local N=_N + order v0 + + replace v0=v0[_n-1] if v0=="" & v0[_n-1]~="" & rowtype1==1 + gen eq_order1=0 if rowtype1==1 + replace eq_order1=1 if v0[_n]~=v0[_n-1] & v0~="" & rowtype1==1 + replace eq_order1=1 if v0[_n]~=v0[_n-1] & v0~="" & rowtype1==1 + + replace eq_order1=eq_order1+eq_order1[_n-1] if eq_order1+eq_order1[_n-1]~=. + + replace eqName1=v0 + replace VarName1=v1 + replace VarName1=VarName1[_n-1] if VarName1=="" & VarName1[_n-1]~="" & rowtype1==1 + replace v1=v0 + ":" + v1 if v0~="" & v1~="" & rowtype1==1 + + drop v0 +} + +* not needed, replaced with colonSplit +/*else if "`sideway'"=="sideway" & "`onecol'"=="onecol" { + * special case for sideway and onecol + * because sideway loops internally, EQUATION and LABELS columns does not exist + * eqname and varname are still joined, they need to separated + * v1 is as it should be + + *** borrowed from: + *** clean up equation names, title, label + gen id1=_n + gen str8 equation="" + gen str8 variable="" + + local N=_N + forval num=1/`N' { + local name=trim(v1[`num']) + local column=index("`name'",":") + if `column'~=0 { + local equation=trim(substr("`name'",1,`column'-1)) + local variable=trim(substr("`name'",`column'+1,length("`name'"))) + replace equation="`equation'" in `num' + replace variable="`variable'" in `num' + } + } + replace equation=equation[_n-1] if equation=="" & equation[_n-1]~="" & rowtype1~=2 + + replace eqName1=equation if equation~="" + replace VarName1=variable if variable~="" + drop equation variable id1 + + local N=_N + gen eq_order1=0 in 3/`N' if eqName1~="" + replace eq_order1=1 in 3/`N' if eqName1[_n]~=eqName1[_n-1] & eqName1~="" + replace eq_order1=eq_order1+eq_order1[_n-1] if eq_order1+eq_order1[_n-1]~=. +} +*/ +else { + *** eq names not present + gen eq_order1=1 + replace eq_order1=. if rowtype1==2 +} + +*** take out COEFFICIENT/VARIABLES as the column heading and restore later +replace v1 = "" if rowtype1==-1 + +* getting the characteristics +describe, short +*local numcol = `r(k)' /* number of columns already in file 1 */ + +* subtract 4 to account for eq_order1, VarName1, eqName1, rowtype1 +local numcol = `r(k)'-4 /* number of columns already in file 1 */ + +gen str8 mergeOn = "" +replace mergeOn=v1 +local titleWide = (v1[1]!="") + +* `titleWide' is assumed to be zero +local frstrow = 1 + `titleWide' /* first non-title row */ + +gen long Vord1 = _n +gen str8 v2plus = "" +replace v2plus=trim(v2) + +local col = 3 +if `col'<=`numcol' { + replace v2plus = v2plus + trim(v`col') + local col = `col'+1 +} + +gen topoff=1 if v1~="" +replace topoff=1 if topoff[_n-1]==1 +replace topoff=sum(topoff) +count if (topoff==0 | (v1=="" & v2plus!="") | (v1[_n+1]=="" & (v2plus[_n+1]!=""|_n==1) & _n!=_N)) +drop topoff + +local ncoeff1 = r(N) + +gen str8 varsml="" +replace varsml = trim(mergeOn) + +summ Vord1 if Vord1>`ncoeff1' & v2plus!="" /* v2plus for addstat */ +local endsta1 = r(max) /* calc last row of statistics before notes */ + +if `endsta1'==. { + local endsta1 = `ncoeff1' +} + +replace mergeOn = mergeOn[_n-1]+"!" if varsml=="" +replace mergeOn = "bottomRow" if rowtype1==2 +replace mergeOn = "topRow" if rowtype1==0 +replace mergeOn = "_000" if rowtype1==-1 + +* pre-create Vorder here +*gen Vorder1 = _n/100 if rowtype1==-1 +*replace Vorder1 = .99 if rowtype1==0 +gen Vorder1=0 if rowtype1==0 + +local mm 1 +while Vorder1[1]==. & `mm'<100 { + local mm=`mm'+1 + replace Vorder1=Vorder1[_n+1]-1 if rowtype1==-1 +} + +egen min=min(Vorder1) +replace Vorder1=-99 if Vorder1==min +drop min + +gen varnum = Vorder1 if Vorder1<1 + +* Constant is now done as eqOrder0 + .5 +*replace Vorder1=2 if v1=="Constant" /* ok because equation names would still be attached if present */ + +* orders bottom row, Observations, r2, and else +replace Vorder1=3.7 if rowtype1>=2 +replace Vorder1=Vorder1[_n-1]+.0001 if Vorder1>=3.7 & rowtype1==3 +replace Vorder1=2 if rowtype1==2 +replace Vorder1=3.5 if v1=="Observations" +replace Vorder1=3.6 if v1=="R-squared" + +replace Vorder1=1 if Vorder1==. & (Vorder1[_n-1]<1 | Vorder1[_n-1]==1) +* a fix for addstat sorting Jan 2009 +*replace Vorder1=4 if v2=="" & Vorder1==3.5 +replace Vorder1=4 if v2=="" & v2plus=="" & Vorder1>3.5 + +* Constant is now done as eqOrder0 + .5 +*replace Vorder1=2.5 if v1=="" & (Vorder1[_n-1]==2 | Vorder1[_n-1]==2.5) + +* sortvar within appendFile 2 of 2 +* generating order within each coefficient, use sortvar( ) if available +gen Vorder1_0=. +local maxnum 1 +if "`sortvar'"~="" { + tokenize `policy0' `sortvar' + local num 1 + while "``num''"~="" { + replace Vorder1_0=`num' if v1=="``num''" | VarName1=="``num''" & Vorder1==1 + local num=`num'+1 + } + if `num'>`maxnum' { + local maxnum `num' + } +} + +* the evil twin of sortvar that will insert blanks/groups as well as order the existing variables +if "`groupvar'"~="" { + * stats rows per variable + count if v1~="" & rowtype1==1 + local nom `r(N)' + count if rowtype1==1 + if `nom'~=0 { + local many=int(round(`r(N)'/`nom'),1) + } + else { + local many 2 + } + + * eqnames for multiple equation + tab eqName1 if rowtype1==1 + local rr=`r(r)' + local tempList + local orderlist + if `rr'> 0 { + * get eq names + + gen str5 temp="" + replace temp=eqname if eqname~=eqname[_n-1] & rowtype1==1 + sort temp + local N=_N + forval num=1/`rr' { + local content=temp[`N'-`num'+1] + local tempList="`tempList' `content'" + local content=eq_order1[`N'-`num'+1] + local orderlist="`orderlist' `content'" + } + drop temp + sort Vord1 + local times `rr' + } + else { + * it's a single equation, run it once + local times 1 + } + + tokenize `policy0' `groupvar' + forval kk=1/`times' { + local order: word `kk' of `orderlist' + local temp: word `kk' of `tempList' + + local num 1 + local count0 0 + while "``num''"~="" { + replace Vorder1_0=`num' if (v1=="``num''" | VarName1=="``num''" ) & eqName1=="`temp'" + count if Vorder1_0~=. & eqName1=="`temp'" + if `r(N)'==`count0' { + forval cc=1/`many' { + * insert this many blank var + local N=_N + set obs `=`N'+1' + local N=_N + if `cc'==1 { + replace v1="``num''" in `N' + } + replace VarName1="``num''" in `N' + replace rowtype1=1 in `N' + replace Vorder1=1 in `N' + replace Vorder1_0=`num' in `N' + + * for multiple equation only + if `rr'>0 { + if `cc'==1 { + replace v1="`temp':" + v1 in `N' + } + replace eq_order1=`order' in `N' + replace eqname="`temp'" in `N' + } + } + } + count if Vorder1_0~=. & eqName1=="`temp'" + local count0 `r(N)' + local num=`num'+1 + } + if `num'>`maxnum' { + local maxnum `num' + } + } +} + + +*** for labels generation 2 of 2 +local varname_list2 +forval num=1/`=_N' { + cap local this=v1[`num'] + cap local place=rowtype1[`num'] + if `place'==1 { + local varname_list2 `"`varname_list2' `this'"' + } +} +macroUnique `varname_list2', names(varname_list2) +if "`varname_list2'"~="" { + c_local varname_list2 `varname_list2' +} + + +* must be filled: +replace mergeOn=v1 if Vord1==. +replace mergeOn=mergeOn[_n-1]+"!" if Vord1==. & mergeOn=="" + +* own column to handle sortvar (to handle in mutliple equation) +gen sortvarCol1=Vorder1_0 + +gen temp=_n +replace Vorder1_0 = temp+`maxnum' if Vorder1==1 & varsml~="" & Vorder1_0==. +replace Vorder1_0 = Vorder1_0[_n-1] if Vorder1_0==. & Vorder1==1 +drop temp + +replace sortvarCol1=Vorder1_0 if Vorder1_0<`maxnum' + +gen double Vorder1_1 =Vorder1_0 if Vorder1==1 & v1~="" +replace Vorder1_1=Vorder1_1[_n-1]+.01 if Vorder1_1==. & Vorder1==1 + +* for groupvar( ) above +sort Vorder1 eq_order1 Vorder1_1 Vord1 +replace Vord1=_n + +drop varsml + +*** get all constant rows 2 of 2 +gen constant1=0 +replace constant1=1 if (v1=="Constant" | v1=="_cons" | VarName1=="Constant" | VarName1=="_cons") +replace constant1=1 if mergeOn==mergeOn[_n-1]+"!" & constant1[_n-1]==1 + +*** merging the two files +* two sorting/merging mechanism +local N=_N +count if eqName1=="" & eqName1=="EQUATION" +local rN=`r(N)' +if `N'==`rN' & `usingSingle'==1 { + * single equation in both files + gen str8 mergeVar="" + replace mergeVar = mergeOn + sort mergeVar varnum + + merge mergeVar varnum using `"`mergeVarFile'"' + drop mergeEq mergeVar +} +else if `N'~=`rN' & `usingSingle'==1 { + * this one's multiple merged to earlier single + + gen str8 mergeVar="" + replace mergeVar = mergeOn + replace mergeVar = VarName1 if VarName1~="" & Vorder1==1 + replace mergeVar = "Constant" if VarName1=="_cons" & Vorder1==1 + replace mergeVar = mergeVar[_n-1]+"!" if mergeVar==mergeVar[_n-1] & mergeVar~="" & Vorder1==1 + sort mergeVar varnum + + merge mergeVar varnum using `"`mergeVarFile'"' + drop mergeEq mergeVar +} +else if `N'==`rN' & `usingSingle'==0 { + * this one's multiple merged to earlier single + gen str8 mergeVar="" + replace mergeVar = mergeOn + replace mergeVar = VarName1 if VarName1~="" & Vorder1==1 + replace mergeVar = "Constant" if VarName1=="_cons" & Vorder1==1 + replace mergeVar = mergeVar[_n-1]+"!" if mergeVar==mergeVar[_n-1] & mergeVar~="" & Vorder1==1 + sort mergeVar varnum + + merge mergeVar varnum using `"`mergeVarFile'"' + drop mergeEq mergeVar +} +else { + * both files are multiple equations + ren mergeOn mergeEq + sort mergeEq varnum + + merge mergeEq varnum using `"`mergeEqFile'"' + drop mergeEq mergeVar +} + +*** clean up and sort the merged files +* Vorder2 has the information for the top 0.01-0.03 +* but Vorder1 has the bottom notes +gen Vorder=Vorder2 +replace Vorder=Vorder1 if Vorder==. | (Vorder1>3.5 & Vorder1<4) + +gen byte merge2 = _merge==2 + +* Notes and defintions: +* Vorder2 _n for master file +* Vorder1 _n for using file + +* Vorder2_0 identifier for each coefficient (using _n for the top most stats) +* Vorder2_1 added 0.01 consequtively to bysort Vorder2_0 + +* Vorder1_0 identifier for each coefficient (using _n for the top most stats) +* Vorder1_1 added 0.01 consequtively to bysort Vorder1_0 + +*** this fills up the potential gaps in Vord1 and Vord2 if the number of stats( ) per coefficient is different +*order eq_order* Vorder Vord1 Vord2 Vord* + +sort eq_order2 Vorder2_1 +replace Vord1=Vord1[_n-1]+.01 if (Vorder2_0==Vorder2_0[_n-1] & Vorder2_0~=.) & (Vord1==. & Vord1[_n-1]~=.) & Vorder==1 + +sort eq_order1 Vorder1_1 +replace Vord2=Vord2[_n-1]+.01 if (Vorder1_0==Vorder1_0[_n-1] & Vorder1_0~=.) & (Vord2==. & Vord2[_n-1]~=.) & Vorder==1 + +* it's off by 1; replace them all +replace Vorder2_1=Vord2 if Vorder==1 +replace Vorder1_1=Vord1 if Vorder==1 + +*** new sorting rules +*** June 2008 Version +gen str8 eqName0="" +replace eqName0=eqName2 +replace eqName0=eqName1 if eqName0=="" & eqName1~="" + +sort eqName0 Vorder1_1 +gen eq_order0=. +gen eq_temp=1 if eqName0[_n]~=eqName0[_n-1] & Vorder1_1~=. + +************ sort to the existing column? +sort eq_temp Vorder1_1 + +gen constant=constant1 +replace constant=constant2 if constant==. +replace constant=constant2 if constant2==1 +drop constant1 constant2 + +local count 0 + +************* needs beter levelsof code +if "`exists_eq'"=="1" | ("`sideway'"=="sideway" & "`onecol'"=="onecol") { + count if eq_temp==1 + if r(N)~=0 { + forval num=1/`=r(N)' { + local temp=eqName0[`num'] + + * collecting names + *local eqOrderList "`temp' `eqOrderList'" + replace eq_order0=`num' if eqName0=="`temp'" + } + replace eq_order0=eq_order0+.5 if constant==1 + } +} +else { + * pushes _cons toward the bottom + replace eq_order0=1 + replace eq_order0=eq_order0+.5 if constant==1 +} + + +count if Vorder2_0>=1 & Vorder2_0<. +local countV2=r(N) + +count if Vorder1_0>=1 & Vorder1_0<. +local countV1=r(N) + +*** sort( ) takes "name later" +* sort according to varname for _tab3 +if "`sortcol'"=="name" { + * do this by replacing these: + sort mergeOn + replace Vorder2_1=_n if Vorder==1 + replace Vorder1_1=_n if Vorder==1 +} + +* consolidate sortvarCol info +gen sortvarCol=sortvarCol1 +replace sortvarCol=sortvarCol2 if sortvarCol==. + + +* temporary fix for Partha Deb: Aug 2008 version +if `countV2'>`countV1' | "`sortcol'"=="later" { + sort Vorder eq_order0 sortvarCol Vorder2_1 Vorder1_1 merge2 Vord2 Vord1 +} +else { + sort Vorder eq_order0 sortvarCol Vorder1_1 Vorder2_1 merge2 Vord1 Vord2 +} + + + +*** fill in if it was a single equation combining with a multiple equation +count if eqName0~="EQUATION" & eqName0~="" +if `r(N)'>0 { + replace report = "SINGLE:"+report if Vorder==1 & eqName0=="" & report~="" + replace v1 = "SINGLE:"+v1 if Vorder==1 & eqName0=="" & v1~="" +} + +replace v1 = report if v1=="" & report!="" +*drop report mergeOn varsml Vorder Vord1 Vord2 merge2 _merge v2plus +drop report mergeOn varnum Vorder Vord1 Vord2 merge2 _merge v2plus Vorder1* Vorder2* eq* *Name* +cap drop sort* +cap drop group* + +* add the head column numbers +if (`numcol'==2) { + replace v2 = "(1)" if _n==`frstrow' + replace reportCol = "(2)" if _n==`frstrow' +} +else { + replace reportCol = "(" + string(`numcol') + ")" if _n==`frstrow' +} + +*** restore COEFFICIENT and 0 head +replace v1=`"`VARIABLES2'"' if rowtype1[_n+1]==0 +replace v1=`"`VARIABLES2'"' if rowtype1==0 & v1[_n-1]~=`"`VARIABLES2'"' + +drop rowtype1 rowtype2 constant + +c_local VARIABLES `"`VARIABLES2'"' + +* also c_local varname_list2 above + +end /* appendFile */ + + +******************************************************************************************** + + +prog define marginal2 + versionSet + version `version' + +* put marginal effects (dfdx) into b and vc matrices + +syntax , b(str) vc(str) [se margucp(str)] + +tempname dfdx se_dfdx new_vc dfdx_b2 +capture mat `dfdx' = e(dfdx`margucp') +if _rc==0 { + local cnam_b : colnames `dfdx' + local cnam_1 : word 1 of `cnam_b' +} +if _rc!=0 { + if "`cnam_1'"=="c1" { + di in yellow `"Update dprobit ado file: type "help update" in Stata"' + } + else { + di in yellow "{opt margin} option invalid: no marginal effects matrix e(dfdx`margucp') exists" + } + exit +} + +/* create matrix of diagonals for vc */ +if "`se'"=="se" { + if e(cmd)=="dprobit" | e(cmd)=="tobit" { + if e(cmd)=="dprobit" { + local margucp "_dfdx" + } + mat `se_dfdx' = e(se`margucp') + mat `vc' = diag(`se_dfdx') + mat `vc' = `vc' * `vc' + } + else { + mat `vc' = e(V_dfdx) + } + mat colnames `vc' = `cnam_b' +} +else { + /* if t or p stats reported then trick `cv' into giving the right t stat */ + local coldfdx = colsof(`dfdx') + mat `new_vc' = J(`coldfdx',`coldfdx',0) + local i = 1 + while `i' <= `coldfdx' { + scalar `dfdx_b2' = (el(`dfdx',1,`i')/el(`b',1,`i'))^2 + mat `new_vc'[`i',`i'] = `dfdx_b2'*`vc'[`i',`i'] + local i = `i'+1 + } + mat colnames `new_vc' = `cnam_b' + mat `vc' = `new_vc' +} +mat `b' = `dfdx' +end + + +******************************************************************************************** + + +prog define partxtl2, rclass + versionSet + version `version' + + +*** parse text list to find number of text elements and return them + local ntxt = 0 + gettoken part rest: 1, parse(" (") + gettoken part rest: rest, parse(" (") /* strip off "option(" */ + while `"`rest'"' != "" { + local ntxt = `ntxt'+1 + gettoken part rest: rest, parse(",)") + return local txt`ntxt' `"`part'"' + gettoken part rest: rest, parse(",)") /* strip off "," or "(" */ + } + return local numtxt `ntxt' +end + + +******************************************************************************************** + + +*** this one avoids stripping the wrong parenthesis +prog define partxtl3, rclass + versionSet + version `version' + + +*** parse text list to find number of text elements and return them + local ntxt = 0 + + * CANNOT use these functions because of string length limitation + *local begin = index(`"`1'"',`"("') + *local length : length local 1 + *local rest=substr(`"`1'"',`begin'+1,`length'-`begin'-1) + + local rest `"`1'"' + + gettoken part rest: 1, parse(" (") + gettoken part rest: rest, parse(" (") /* strip off "option(" */ + while `"`rest'"' != "" { + local ntxt = `ntxt'+1 + gettoken part rest: rest, parse(",") + return local txt`ntxt' `"`part'"' + local last_part `"`part'"' + gettoken part rest: rest, parse(",") + } + + * fix the last one by stripping the ending parenthesis + gettoken part last_part: last_part, parse(")") + + * takes off too much + if "`last_part'"=="))" { + local part `"`part')"' + } + return local txt`ntxt' `"`part'"' + + return local numtxt `ntxt' +end + + +******************************************************************************************** + + +prog define makeFile +* previously coeftxt2 + versionSet + version `version' + +if `a_version'>=11 { + local fv fv +} + +* getting the coefficient name, values, and t-statistics +syntax [varlist(default=none ts `fv')] [if] [in] [pw aw fw iw] , /* +*/ variables(str) [equationsOption(str) /* +*/ keep(str) drop(str) ADDvar(str) eqmatch(str) /* +*/ inddrop(str) indyes(str) indno(str) /* +*/ eqkeep(str) eqdrop(str) /* +*/ eqlist(str) betaAsked /* +*/ statsMany(integer 2) statsList(str asis) se_skip /* +*/ BEta Level(integer $S_level) /* +*/ DEC(numlist) FMT(str) /* +*/ BDec(numlist) BFmt(str) /* +*/ SDec(numlist) SFmt(str) /* +*/ Tdec(numlist) TFmt(str) /* +*/ PDec(numlist) PFmt(str) /* +*/ CDec(numlist) CFmt(str) /* +*/ ADec(numlist) /* +*/ RDec(numlist) RFmt(str) /* +*/ noASter SYMbol(passthru) noCONs EForm noobs noNI /* +*/ noR2 ADJr2 ctitleList(str) ctbot(str) /* +*/ POLICY0(str asis) skip *] + +local varlistTemp `"`varlist'"' +local ifTemp `"`if'"' +local inTemp `"`in'"' +local weightTemp `"`weight'"' +local expTemp `"`exp'"' + +* cascading options: +local 0 `", `options'"' +syntax [, ADDStat(passthru) ADDText(passthru) noNOTes /* +*/ AUTO(integer 3) LESS(integer 0) NOAUTO DECMark(str asis) /* +*/ noPAren parenthesis(str asis) BRacket BRacketA(passthru) /* +*/ ADDNote(passthru) APpend regN(str) df_r(str) rsq(str) /* +*/ numi(str) ivar(str) depvar(str) robust(str) /* +*/ BOROWS(str) b(str) vc(str) /* +*/ univar(str) Onecol estname(str) /* +*/ estnameUnique(str) fileExist(integer 1) /* +*/ ALPHA(str) asterisk(passthru) 2aster /* +*/ matList(str) leave(str) sidewayWave(integer 1) eqsingle /* +*/ stnum(str asis) ststr(str asis) eretrun wide NOOMITTED NOBASE DEPVARshow(str) ] + +* options taken out: SE Pvalue CI Tstat + +local varlist `"`varlistTemp'"' +local if `"`ifTemp'"' +local in `"`inTemp'"' +local weight `"`weightTemp'"' +local exp `"`expTemp'"' + +local VARIABLES "`variables'" + +tempvar b_fvts_type b_coefficient b_st_err +tempname b_alone vc_alon b_xtra vc_xtra + +* avoid re-transposing them later by giving distinct names +tempname b_transpose vc_diag_transpose + +if "`skip'"=="skip" { + drop _all + cap drop in 1/`=_N' + set obs 4 + + gen report="" + gen eqname="" + gen varname ="" + gen mrgrow=_n + gen reportCol="" + gen rowtype2=. + keep report eqname varname mrgrow reportCol rowtype2 + replace report="VARIABLES" in 2 + replace reportCol="(1)" in 1 + + replace rowtype2=-1 in 1/2 + replace rowtype2=0 in 3 + *replace rowtype2=1 in 4/5 + replace rowtype2=2 in 4 + *replace rowtype2=3 in 5 + *replace report="Notes" in 6 + + exit +} + +if "`eretrun'"~="" { + mat `b_transpose' = `b'' + mat `vc_diag_transpose' = vecdiag(`vc') + mat `vc_diag_transpose' = `vc_diag_transpose'' + + local brows = rowsof(`b_transpose') + + *** xt options + if (`numi'!=. & "`ni'"!="noni") { + if `"`iname'"'=="" { + local iname "`ivar'" + } + if `"`iname'"'=="." { + local iname "groups" + } + } +} + + +* populate with values from e(b) and e(V), or from varlist +tempvar report firstCol secondCol varKeepDrop betcoef + +*** fill in variables names column +gen str5 `report' = "" +gen str5 `firstCol' = "" +gen str5 `secondCol' = "" + +if "`eretrun'"~="" { + local Names : rowfullnames(`b_transpose') + local Rows = rowsof(`b_transpose') +} +else { + _explicit `varlist' + local Names `varlist' + local Rows: word count `varlist' +} + + +* extender making sure the obs > columns & obs > `Rows' +local N=_N +if `Rows'>`N'+1 & `Rows'<. { + set obs `=`Rows'+1' +} +if `N'<1 { + cap set obs 1 + cap set obs 11 +} + +* extender +local N=_N +version 7: describe, short +if `r(k)'>`N'+1 & `r(k)'<. { + set obs `r(k)' +} + + +forval num=1/`Rows' { + local temp : word `num' of `Names' + + tokenize "`temp'", parse(":") + + if "`2'"==":" { + replace `firstCol' = "`1'" in `num' + replace `secondCol' = "`3'" in `num' + } + else { + replace `secondCol' = "`temp'" in `num' + replace `report' = "`temp'" in `num' + } +} +replace `report' = "Constant" if `firstCol'=="" & `secondCol'=="_cons" +replace `report' = `firstCol' + ":" + `secondCol' if `firstCol'~="" +replace `report' = `firstCol' + ":Constant" if `firstCol'~="" & `secondCol'=="_cons" + +gen double `b_coefficient' =. +gen double `b_st_err' =. + +if "`eretrun'"~="" { + replace `b_coefficient' = matrix(`b_transpose'[_n, 1]) in 1/`brows' + replace `b_st_err' = matrix(`vc_diag_transpose'[_n, 1]) in 1/`brows' + replace `b_st_err' = sqrt(`b_st_err') +} + +gen `betcoef'=. +if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" | "`leave'"~="" { + * always e(sample) for beta coefficient + sum `depvar' if e(sample) [`weight'`exp'] + local betaSD `r(sd)' + + forval num=1/`Rows' { + local temp=`secondCol'[`num'] + cap sum `temp' if e(sample) [`weight'`exp'] + replace `betcoef' = r(sd)/`betaSD' * `b_coefficient' if `num'==_n & `secondCol'~="_cons" + } + replace `betcoef' = . if `secondCol'=="_cons" + + if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" { + * set nocons + *local cons "nocons" + } +} + +*** marksample, version 11 decouples of e(b) from e(sample) +if "`varlist'"=="" & "`casewise'"=="casewise" { + noi di in red "{it:varlist} needs to be specified for use with {opt case:wise}" + exit 198 +} + +tempvar touse +mark `touse' `if' `in' [`weight'`exp'] + +/* +count if e(sample) +if `r(N)'==0 { + if "`raw'"=="raw" { + mark `touse' `if' `in' [`weight'`exp'] + } + else { + noi di in red "zero e(sample) count; run a regression or specify {opt raw} or {opt case:wise}" + exit 198 + } +} +else { + cap confirm matrix e(b) + if _rc==0 { + * always esample restricted + if `"`if'"'~="" { + mark `touse' `if' & e(sample) `in' [`weight'`exp'] + } + else { + mark `touse' if e(sample) `in' [`weight'`exp'] + } + } + else if "`raw'"=="raw" | "`casewise'"=="casewise" { + mark `touse' `if' `in' [`weight'`exp'] + } + else { + noi di in red "e(b) missing; post e-return matrices, run a regression, or specify {opt raw} or {opt case:wise}" + exit 198 + } +} +*/ + +* may not always be e(b), may be margins +if "`eretrun'"=="" & "`depvar'"=="" { + gettoken depvar junk: varlist, `bind' +} + +if `"`e(cmd)'"'=="margins" { + if `"`ctitleList'"'=="" | `"`ctitleList'"'=="." { + local temp "`e(predict_label)'" + *local temp = substr("`temp'",4,length(`"`temp'"')-1) + *local temp = substr("`temp'",1,length(`"`temp'"')-1) + local ctitleList `"margins, `temp'"' + if `"`e(derivatives)'"'~="" { + local ctitleList `"`e(derivatives)', `temp'"' + } + } +} + +*** addvar +tempvar makelag eq_order var_order + +* do not add depvar unless requested +local addvarList "`addvar'" +if ((`"`statsList'"'~="coef se" & `"`statsList'"'~=" coef se" & "`depvar'"~="" & "`depvar'"~=".") & "`depvarshow'"~="nodepvarshow" & "`e(cmd)'"~="margins") | "`depvarshow'"=="depvarshow" { + local addvarList "`depvar' `addvar'" +} + +if "`addvarList'"~="" { + local tempCC -10 + local tempKK -10 + + gen `eq_order'=1 if `report'~="" & `firstCol'~=`firstCol'[_n-1] + replace `eq_order'=0 if `report'~="" & `eq_order'==. + replace `eq_order'=sum(`eq_order') if `report'~="" + qui sum `eq_order', meanonly + if `r(mean)'==0 { + replace `eq_order'=`eq_order'+1 /* single equation */ + } + + gen `var_order'=1 if `report'~="" & `firstCol'~=`firstCol'[_n-1] + replace `var_order'=`var_order'[_n-1]+1 if `var_order'==. & `report'~="" + qui sum `var_order', meanonly + if "`r(mean)'"=="" { + replace `var_order'=_n if `report'~="" /* single equation */ + } + + * reverse + local addvarList1 + foreach temp in `addvarList' { + local addvarList1 "`temp' `addvarList1'" + + } + + foreach this in `addvarList1' { + * down by 1 to insert + foreach var in `report' `firstCol' `secondCol' `b_coefficient' `b_st_err' `betcoef' `eq_order' `var_order' { + gen `makelag'=`var'[_n-1] + replace `var'=`makelag' + cap drop `makelag' + } + replace `secondCol'="`this'" in 1 + replace `report'="`this'" in 1 + + * unfinished for multiple eq + count if `firstCol'~="" + if `r(N)'~=0 { + replace `report'=`report'+":"+`report' in 1 + replace `firstCol'="`this'" in 1 + * match to existing + qui sum `eq_order' if `firstCol'=="`this'" , meanonly + if "`r(mean)'"~="" { + replace `eq_order'=`r(mean)' in 1 /* multi */ + replace `var_order'=`tempCC' in 1 /* multi */ + local tempCC=`tempCC'+0.01 + } + * new vars + levelsof `firstCol' if `eq_order'==. + foreach temp in `r(levels)' { + replace `eq_order'=`tempKK' if `firstCol'==`"`temp'"' /* multiple */ + local tempKK=`tempKK'+0.01 + } + } + else { + replace `eq_order'=1 in 1 /* single */ + replace `var_order'=`tempCC' in 1 /* single */ + local tempCC=`tempCC'+0.01 + } + } + sort `eq_order' `var_order' + cap drop `eq_order' `var_order' +} + +*** combine addvar here +local varlist `varlist' `addvarList' +macroUnique `varlist' `addvarList', names(varlist) + +*** pre-clean (again) +if "`varlist'"~="" { + if `a_version'>=11 { + cap fvunab temp : `anything' + cap fvexpand `temp' + cap local varlist `r(varlist)' + } + else { + tsunab varlist : `varlist' + } + macroUnique `varlist', names(varlist) +} + + +*** extra stats + +******************* all of these may not work well with -long- and multiple equations; problems with reg3 depvar names +count if `secondCol'~="" +local varMany=`r(N)' + +if `varMany'>0 & `varMany'<. { + + local depvarTot 0 + cap local depvarTot: word count `depvar' + if `depvarTot'==. | `depvarTot'==0 { + local depvarTot 1 + } + + * needs to be lowered + *local temp=lower(`"`statsList'"') + local temp + foreach var in `statsList' { + local lowered=lower(`"`var'"') + local temp `"`temp' `lowered'"' + } + + _stats_check, `temp' + + *** summary from stats( ) here + if "`sumAsked'"~="" { + local tempL0 + + if "`sumAsked'"=="regular" { + * summary + local sumList "N sum_w mean Var sd min max sum" + local detail + } + + if "`sumAsked'"=="detail" { + * detail + local sumList "N sum_w mean Var sd skewness kurtosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99" + local detail detail + } + + if "`sumAsked'"=="extra" { + * detail & extra + local extraList "cv range iqr semean median count" + local sumList "N sum_w mean Var sd skewness kurtosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99 `extraList'" + local detail detail + } + + tempvar `sumList' + foreach stuff in `sumList' { + gen ``stuff'' = . + } + + forval num=1/`varMany' { + local content=`secondCol'[`num'] + cap summarize `content' if `touse' [`weight'`exp'], `detail' + if _rc==101 { + noi di in red "pweight not allowed" + exit 101 + } + if _rc==0 & `r(N)'>0 & `r(N)'<. { + foreach stuff in `sumList' { + if "`stuff'"~="cv" & "`stuff'"~="range" & "`stuff'"~="iqr" & "`stuff'"~="semean" & "`stuff'"~="median" & "`stuff'"~="count" { + cap replace ``stuff'' = `r(`stuff')' in `num' + local tempL0 "`tempL0' ``stuff''" + } + else { + * extra + foreach tt in `extraList' { + local `tt'0 + } + cap local cv0 `=`r(sd)'/`r(mean)'' + cap local range0 `=`r(max)'-`r(min)'' + cap local iqr0 `=`r(p75)'-`r(p25)'' + cap local semean0 `=`r(sd)'/(`r(N)'^.5)' + cap local median0 `r(p50)' + cap local count0 `r(N)' + cap replace ``stuff'' = ``stuff'0' in `num' + local tempL0 "`tempL0' ``stuff''" + } + } + } + } + } + + +local tempL1 + +*** stats( ) correlations +forval wave=1/`depvarTot' { + local depvarUse: word `wave' of `depvar' + foreach cmd in corr pwcorr spearman { + if "``cmd'Asked'"=="`cmd'" { + tempvar `cmd' + gen ``cmd'' = . + forval num=1/`varMany' { + local content=`secondCol'[`num'] +*********************** if no depvar, then use the varlist + cap `cmd' `depvarUse' `content' if `touse' [`weight'`exp'] + if _rc==0 { + cap replace ``cmd'' = `r(rho)' in `num' + } + } + local tempL1 "`tempL1' ``cmd''" + } + } +} + + + +*** independent commands at the bottom 1 (numerical) +forval wave=1/`depvarTot' { + local depvarUse: word `wave' of `depvar' + foreach cmd in covar pcorr semipcorr pcorrpval tau_a tau_b { + if "``cmd'Asked'"=="`cmd'" { + tempvar `cmd' + gen ``cmd'' = . + forval num=1/`varMany' { + local content=`secondCol'[`num'] +*********************** if no depvar, then use the varlist + cap `cmd' `depvarUse' `content' if `touse' [`weight'`exp'] + if _rc==0 { + cap replace ``cmd'' = `r(`cmd')' in `num' + } + } + local tempL1 "`tempL1' ``cmd''" + } + } +} + + +*** independent commands at the bottom 2 (str) +forval wave=1/`depvarTot' { + local depvarUse: word `wave' of `depvar' + foreach cmd in label label_pr label_up label_low { + if "``cmd'Asked'"=="`cmd'" { + tempvar `cmd' + gen str7 ``cmd'' = "" + forval num=1/`varMany' { + local content=`secondCol'[`num'] +*********************** if no depvar, then use the varlist + + * workaround for label only + if "`cmd'"=="label" { + cap label0 `depvarUse' `content' if `touse' [`weight'`exp'] + } + else { + cap `cmd' `depvarUse' `content' if `touse' [`weight'`exp'] + } + + if _rc==0 { + replace ``cmd'' = `"`r(`cmd')'"' in `num' + } + else { + ******** not proper/upper/lower applied + if "`content'"=="_cons" { + replace ``cmd'' = `"Constant"' in `num' + } + } + } + local tempL1 "`tempL1' ``cmd''" + } + } +} + + *** stats( ) cmd( ) + * take out cmd( ) from statsList and replace with cmd1 cmd2 ... + * also run the cmd( ) and get r( ) back out + + * `regVal1' `regVal2' ... tempvar name for the column containing the values + * cmd1 cmd2 ... name that appears in statsList and the column variable names + * cmd1 cmd2 ... also contain what each cmd are + + local tempL2 + local cmdList + + local tempList + local num 0 + local cc 0 + + local one + local two `statsList' + + while `"`two'"'~="" & `"`two'"'~=" " { + local num=`num'+1 + + gettoken one two: two, `bind' + + * if okay to add: + local check=substr(trim("`one'"),1,4) + if `"`check'"'=="cmd(" { + + * it's a cmd( ) + local cc=`cc'+1 + local cmd`cc'=`"`one'"' + + tempvar regVal`cc' + gen str7 `regVal`cc'' = "" + + * separate reporting from cmd requested inside: cmd( r( ) cmd) + gettoken reporting cmd: one, `bind' parse("(") + gettoken reporting cmd: cmd, `bind' parse("(") + gettoken reporting cmd: cmd, `bind' parse(":") + gettoken colon cmd: cmd, `bind' parse(":") + + local cmd=substr("`cmd'",1,length("`cmd'")-1) + gettoken cmd suboption: cmd , parse(",") + + local reg`cc'=`"`cmd'"' + + forval num=1/`varMany' { + local content=`secondCol'[`num'] + + ************************* disable varlist + ********************** if no depvar, then use the varlist + + cap `cmd' `depvar' `content' if `touse' [`weight'`exp'] `suboption' + if _rc==0 { + cap replace `regVal`cc'' = `"``reporting''"' in `num' + } + } + local cmdList "`cmdList' cmd`cc'" + local tempL2 "`tempL2' `regVal`cc''" + local tempList "`tempList' cmd`cc'" + } + else { + local tempList "`tempList' `one'" + } + } + local statsList `"`tempList'"' + + + + *** stats( ) str( ) + * take out str( ) from statsList and replace with str1 str2 ... + + * `strVal1' `strVal2' ... tempvar name for the column containing the values + * string1 string2 ... name that appears in statsList and the column variable names + * string1 string2 ... also contain what each strings are + + local tempL3 + local strList + + local tempList + local num 0 + local cc 0 + + local one + local two `statsList' + + while `"`two'"'~="" & `"`two'"'~=" " { + local num=`num'+1 + + gettoken one two: two, `bind' + + * if okay to add: + local check=substr(trim("`one'"),1,4) + if `"`check'"'=="str(" { + + * it's a str( ) + local cc=`cc'+1 + local string`cc'=`"`one'"' + + tempvar strVal`cc' + gen str7 `strVal`cc'' = "" + + * separate reporting from str requested inside: str( r( ) str) + gettoken junk str: one, `bind' parse("(") + gettoken junk str: str, `bind' parse("(") + local str=substr("`str'",1,length("`str'")-1) + + forval num=1/`varMany' { + local content=`secondCol'[`num'] + replace `strVal`cc'' = `"`str'"' in `num' + } + local strList "`strList' string`cc'" + local tempL3 "`tempL3' `strVal`cc''" + local tempList "`tempList' string`cc'" + } + else { + local tempList "`tempList' `one'" + } + } + local statsList `"`tempList'"' + + /* + *** stats( ) e( ) + * take out e( ) from statsList and replace with e1 e2 ... + + * `strVal1' `strVal2' ... tempvar name for the column containing the values + * string1 string2 ... name that appears in statsList and the column variable names + * string1 string2 ... also contain what each strings are + + local tempL4 + local eList + + local tempList + local num 0 + local cc 0 + + local one + local two `statsList' + + while `"`two'"'~="" & `"`two'"'~=" " { + local num=`num'+1 + + gettoken one two: two, `bind' + + * if okay to add: + local check=substr(trim("`one'"),1,4) + if `"`check'"'=="e(" { + + * it's a e( ) + local cc=`cc'+1 + local string`cc'=`"`one'"' + + tempvar eVal`cc' + gen str7 `eVal`cc'' = "" + + * separate reporting from e requested inside: e( r( ) e) + gettoken junk str: one, `bind' parse("(") + gettoken junk str: str, `bind' parse("(") + local str=substr("`str'",1,length("`str'")-1) + + forval num=1/`varMany' { + local content=`secondCol'[`num'] + replace `strVal`cc'' = `"`str'"' in `num' + } + local strList "`strList' string`cc'" + local tempL3 "`tempL3' `strVal`cc''" + local tempList "`tempList' string`cc'" + } + else { + local tempList "`tempList' `one'" + } + } + local statsList `"`tempList'"' + */ + +} + + +* inddrop last right before dropping the main data +* because easier than to pass the arguments to after dropping them + +local inddropList `inddrop' + +************************** needs to be unambiguated +if "`inddrop'"~="" { + if "`indno'"=="" { + local indno "No" + } + if "`indyes'"=="" { + local indyes "Yes" + } + + * any must be present + noi di in red "`addstat'" + * first phrase + local two `inddropList' + while `"`two'"'~="" & `"`two'"'~=" " { + + gettoken one two: two, `bind' parse(",") + local one=trim(`"`one'"') + local two=trim(`"`two'"') + + if `"`one'"'=="," { + gettoken one two: two, `bind' parse(",") + local one=trim(`"`one'"') + local two=trim(`"`two'"') + } + + unab one1: `one' + local N0=_N + foreach var in `one1' { + drop if `secondCol'=="`var'" & `secondCol'~="" + } + local N=_N + if `N0'>`N' { + * indicate Yes + if `"`addstat'"'!="" { + * take off + gettoken junk addstat: addstat, `bind' parse(" (") + gettoken junk addstat: addstat, `bind' parse(" (") + local addstat `"addstat(`"`one' included"', `indyes',`addstat'"' + } + else { + local addstat `"addstat(`"`one' included"', `indyes')"' + } + } + else { + * indicate No + if `"`addstat'"'!="" { + * take off + gettoken junk addstat: addstat, `bind' parse(" (") + gettoken junk addstat: addstat, `bind' parse(" (") + local addstat `"addstat(`"`one' included"', `indno',`addstat'"' + } + else { + local addstat `"addstat(`"`one' included"', `indno')"' + } + } + + } +} + +*** handle policy 2 of 3 +if "`policy0'"~="" { + fvunab policyList: `policy0' +} + + +*** handle fvts 1 of 2 +gen str7 `b_fvts_type' ="" +local this this +local cc 1 +while `"`this'"'~="" { + cap local this=`secondCol'[`cc'] + cap fvts_label `this' + replace `b_fvts_type'="`basesuffix'" in `cc' + *replace varlabel = `"`fvts_label_list'"' in `cc' + local ++cc +} + +*** get rid of original data & rename +keep `report' `b_fvts_type' `b_coefficient' `b_st_err' `betcoef' `firstCol' `secondCol' `tempL0' `tempL1' `tempL2' `tempL3' + +ren `b_fvts_type' fvts_type +ren `b_coefficient' coef +ren `b_st_err' se +ren `report' report +ren `betcoef' beta + +ren `firstCol' eqname +ren `secondCol' varname +keep if varname~="" + + +*** make unique +gen n0=_n +bys eqname varname coef: gen n=_n +keep if n==1 +sort n0 +drop n n0 + + +*** for labels generation 1 of 2 +local varname_list1 +forval num=1/`=_N' { + cap local this=varname[`num'] + local varname_list1 `"`varname_list1' `this'"' +} +macroUnique `varname_list1', names(varname_list1) +if "`varname_list1'"~="" { + c_local varname_list1 `varname_list1' +} + + +* special case +if "`wide'"~="wide" & ("`e(cmd)'"=="xtpoisson" | "`e(cmd)'"=="oprobit" | "`e(cmd)'"=="ologit") { + replace report=varname + replace report="Constant " + eqname if varname=="_cons" + replace eqname="" +} +else if "`eqsingle'"=="eqsingle" { + * treat as single equation (xtpoisson version 11 probit etc) + replace report=varname + replace report="Constant" if varname=="_cons" + replace eqname="" +} + + +if `varMany'>0 & `varMany'<. { + if "`sumAsked'"~="" { + foreach var in `sumList' { + ren ``var'' `var' + } + } + foreach var in label label_pr label_up label_low { + if "``var'Asked'"~="" { + ren ``var'' `var' + } + } + foreach var in covar corr pwcorr spearman pcorr semipcorr pcorrpval tau_a tau_b { + if "``var'Asked'"~="" { + ren ``var'' `var' + } + } + local cc 1 + foreach var in `cmdList' { + ren `regVal`cc'' cmd`cc' + local cc=`cc'+1 + } + local cc 1 + foreach var in `strList' { + ren `strVal`cc'' string`cc' + local cc=`cc'+1 + } +} + + +*** continue keep/drop here +if "`keep'"~="" { + local varlist "`keep'" +} + +* varlist +if "`varlist'"~="" { + gen str5 `varKeepDrop'="" + + * add the constant unless "nocons" is chosen + if "`cons'"~="nocons" { + local varlist "`varlist' _cons" + } + + local count: word count `varlist' + forval num=1/`count' { + local temp : word `num' of `varlist' + replace `varKeepDrop'="`temp'" if "`temp'"==varname + } + + count if `varKeepDrop'=="" & varname~="" + local brows=`brows'-r(N) + local borows=`borows'-r(N) + drop if `varKeepDrop'=="" & varname~="" + drop `varKeepDrop' +} + +* drop +if "`drop'"~="" { + gen str5 `varKeepDrop'="" + + local count: word count `drop' + forval num=1/`count' { + local temp : word `num' of `drop' + replace `varKeepDrop'="`temp'" if "`temp'"==varname + } + + count if `varKeepDrop'~="" + local brows=`brows'-r(N) + local borows=`borows'-r(N) + + drop if `varKeepDrop'~="" + drop `varKeepDrop' +} + +if "`cons'"=="nocons" { + gen count=1 if varname=="_cons" + count if count==1 + local brows=`brows'-r(N) + local borows=`borows'-r(N) + drop if count==1 + drop count +} + + +* drop some of multiple equations: 2 of 2 +* (in case only one equation kept but `b' was passed thru inputed instead of `b_eq') + +************* technically this should be fixed (get the eqname non-empty, and use indicator if multi-equation called for) +if "`eqdrop'"~="" & "`long'"=="long" { + gen str5 `varKeepDrop'="" + + local count: word count `eqdrop' + forval num=1/`count' { + local temp : word `num' of `eqdrop' + replace `varKeepDrop'="`temp'" if "`temp'"==eqname + } + + count if `varKeepDrop'~="" + local brows=`brows'-r(N) + local borows=`borows'-r(N) + + drop if `varKeepDrop'~="" + drop `varKeepDrop' +} + +if "`noomitted'"=="noomitted" { + drop if fvts_type=="o" +} +if "`nobase'"=="nobase" { + drop if fvts_type=="b" +} + +************* technically this should be fixed (get the eqname non-empty, and use indicator if multi-equation called for) +if "`eqkeep'"~="" & "`long'"=="long" { + gen str5 `varKeepDrop'="" + + local count: word count `eqkeep' + forval num=1/`count' { + local temp : word `num' of `eqkeep' + replace `varKeepDrop'="`temp'" if "`temp'"==eqname + } + + count if `varKeepDrop'~="" + local brows=`brows'-r(N) + local borows=`borows'-r(N) + + keep if `varKeepDrop'~="" + drop `varKeepDrop' +} + +* reset brows after dropping +count if report~="" +local brows = `r(N)' + + +/* +matrix matrix1=level' + +*** enhancing with outside matrix +*** fill in variables names column +tempname matrix1 first1 second1 + +*gen str5 `matrix1' = "" +*gen str5 `first1' = "" +*gen str5 `second1' = "" + +*local Names : rowfullnames(`b_transpose') +*local Rows = rowsof(`b_transpose') + +gen str5 matrix1 = "" +gen str5 first1 = "" +gen str5 second1 = "" +gen str5 varname1 = "" +local Names : rowfullnames(matrix1) +local Rows = rowsof(matrix1) + +forval num=1/`Rows' { + local temp : word `num' of `Names' + + tokenize "`temp'", parse(":") + + if "`2'"==":" { + replace first1 = "`1'" in `num' + replace second1 = "`3'" in `num' + } + else { + replace second1 = "`temp'" in `num' + replace varname1 = "`temp'" in `num' + } +} +replace varname1 = "Constant" if first=="" & second=="_cons" +replace varname1 = first + ":" + second if first~="" +replace varname1 = first + ":Constant" if first~="" & second=="_cons" + +gen double b = matrix(matrix1[_n, 1]) in 1/`brows' +gen double s = matrix(matrix1[_n, 1]) in 1/`brows' +replace s = sqrt(s) +*/ + +/* +*** rename variables for forced row matching +if `"`samevar'"'~="" { + gettoken first second: samevar, parse(",") +} +*/ + + +*** obtain the statistics of interest + +* tstat +gen double tstat = (coef/se) + +* T_alpha for the Ci +if `df_r'==. { + gen double T_alpha = invnorm( 1-(1-`level' /100)/2 ) +} +else { + * replacement for invt( ) function under version 6 + * note the absolute sign: invttail is flipped from invnorm + gen double T_alpha = abs(invttail(`df_r', (1-`level' /100)/2)) +} + +* ci +gen double ci_low=coef-T_alpha*se +gen double ci_high=coef+T_alpha*se + + * exponentiate beta and st_err + gen double coefEform = exp(coef) + gen double seEform = coefEform * se + gen double ci_lowEform = exp(coef - seEform * T_alpha / coefEform) + gen double ci_highEform = exp(coef + seEform * T_alpha / coefEform) + +* pval +if `df_r'==. { + gen double pval = 2*(1-normprob(abs(tstat))) +} +else { + gen double pval = tprob(`df_r', abs(tstat)) +} + + +* calculate asterisks for t-stats (or standard errors) +local titleWide=0 +if "`append'"=="append" & `fileExist'==1 { + local appottl = 1 +} +else { + local appottl = `titleWide' +} + +* either an appended column (not the first regression) or has a title +* i.e. need an extra line above the coefficients +* added a second extra line above the coefficients: place 1 of 2 +gen mrgrow = 2*_n + 1 + `appottl' + 1 + +*** dealing with the asterisks +if "`aster'"!="noaster" { + + if "`alpha'"~="" { + * parse ALPHA + partxtl2 `"`alpha'"' + local alphaCount = r(numtxt) + local num=1 + while `num'<=`alphaCount' { + local alpha`num' `r(txt`num')' + capture confirm number `alpha`num'' + if _rc!=0 { + noi di in red `"`alpha`num'' found where number expected in {opt alpha()} option"' + exit 7 + } + local num = `num'+1 + } + } + else { + if "`2aster'"=="2aster" { + local alpha1=.01 + local alpha2=.05 + local alphaCount=2 + } + else { + local alpha1=.01 + local alpha2=.05 + local alpha3=.10 + local alphaCount=3 + } + } + + if `"`symbol'"'!="" { + * parse SYMBOL + partxtl2 `"`symbol'"' + local symbolCount = r(numtxt) + local num=1 + while `num'<=`symbolCount' { + local symbol`num' `r(txt`num')' + capture confirm number `symbol`num'' + if _rc==0{ + noi di in red `"`symbol`num'' found where non-number expected in {opt sym:bol()}"' + exit 7 + } + local num = `num'+1 + } + } + else { + *** assume 2aster when only two alpha was given + if "`2aster'"=="2aster" | `alphaCount'==2 { + * 1 and 5 % + local symbol1 "**" + local symbol2 "*" + local symbolCount=2 + } + else { + * 1, 5, and 10% + local symbol1 "***" + local symbol2 "**" + local symbol3 "*" + local symbolCount=3 + } + * when only SYMBOL was given + if "`alpha'"=="" { + + } + } + + if "`alpha'"~="" & `"`symbol'"'~="" { + if `symbolCount'~=`alphaCount' { + di in red "{opt alpha()} and {opt sym:bol()} must have the same number of elements" + exit 198 + } + } + + if "`alpha'"=="" & `"`symbol'"'~="" { + if `symbolCount'>=4 { + di in red "{opt alpha()} must be specified when more than 3 symbols are specified with {opt sym:bol()}" + exit 198 + } + } + + if "`alpha'"~="" & `"`symbol'"'=="" { + local symbolCount=`alphaCount' + if `alphaCount'>=4 { + di in red "{opt sym:bol()} must be specified when more than 3 levels are specified with {opt alpha()}" + exit 198 + } + } + + * fix the leading zero + local num=1 + while `num'<=`alphaCount' { + if index(trim("`alpha`num''"),".")==1 { + local alpha`num'="0`alpha`num''" + } + local num=`num'+1 + } + + * creating the notes for the alpha significance + local astrtxt `"`symbol1' p<`alpha1'"' + local num=2 + while `num'<=`symbolCount' { + local astrtxt `"`astrtxt', `symbol`num'' p<`alpha`num''"' + local num=`num'+1 + } + + * assign the SYMBOL + gen str12 astrix = `"`symbol1'"' if (abs(pval)<`alpha1' & abs(pval)!=.) + + local num=2 + while `num'<=`symbolCount' { + replace astrix = `"`symbol`num''"' if astrix=="" & (abs(pval)<`alpha`num'' & abs(pval)!=.) + local num=`num'+1 + } +} +else { + gen str2 astrix = "" +} + + + +* add in matrix/vectors names if provided in stats( ) +* the values are to be autodigit later +* splits matList into vectorList and nonvecList + +local vectorList +local nonvecList + + +if "`matList'"~="" { + tempname matdown + foreach matname in `matList' { + mat `matdown'=`matname' /* NOT transposed */ + local temp= colsof(`matdown') + + * pre-save + count if eqname~="" + local masterEqExist=`r(N)' + + tempfile masterMultiFile masterSingleFile + + * original file is single equations + sort varname + save `"`masterSingleFile'"', replace + + * original file is multiple equations + sort eqname varname + save `"`masterMultiFile'"', replace + + * empties + drop * + + cap gen str5 report = "" + cap gen str5 eqname = "" + cap gen str5 varname= "" + + if `temp'==1 { + * it's a vector + local vectorList "`vectorList' `matname'" + + *** borrowed from: *** fill in variables names column + + local Names : rowfullnames(`matdown') + local Rows = rowsof(`matdown') + set obs `Rows' + + forval num=1/`Rows' { + local temp : word `num' of `Names' + + tokenize "`temp'", parse(":") + + if "`2'"==":" { + replace eqname = "`1'" in `num' + replace varname= "`3'" in `num' + } + else { + replace varname= "`temp'" in `num' + replace report = "`temp'" in `num' + } + } + replace varname= "_cons" if varname=="Constant" + + replace report = "Constant" if eqname=="" & varname=="_cons" + replace report = eqname + ":" + varname if eqname~="" + replace report = eqname + ":Constant" if eqname~="" & varname=="_cons" + + svmat double `matdown', name(`matname') + + * take off 1's that's been slapped on + cap ren `matname'1 `matname' + } + else { + * it's a non-vector matrix + local cc= colsof(`matdown') + local temp0 : colnames(`matdown') + local temp + foreach var in `temp0' { + local temp "`temp' `matname'_`var'" + } + local nonvecList "`nonvecList' `temp'" + + *** borrowed from: *** fill in variables names column + + local Names : rowfullnames(`matdown') + local Rows = rowsof(`matdown') + set obs `Rows' + + forval num=1/`Rows' { + local temp : word `num' of `Names' + + tokenize "`temp'", parse(":") + + if "`2'"==":" { + replace eqname = "`1'" in `num' + replace varname= "`3'" in `num' + } + else { + replace varname= "`temp'" in `num' + replace report = "`temp'" in `num' + } + } + replace varname= "_cons" if varname=="Constant" + + replace report = "Constant" if eqname=="" & varname=="_cons" + replace report = eqname + ":" + varname if eqname~="" + replace report = eqname + ":Constant" if eqname~="" & varname=="_cons" + + svmat double `matdown', name(col) + + * make it unique name + foreach var in `temp0' { + ren `var' `matname'_`var' + } + + * take off 1's that's been slapped on + *cap ren `matname'1 `matname' + } + + count if eqname~="" + local usingEqExist=`r(N)' + + * slap back to the original master files + if `masterEqExist'==0 | `usingEqExist'==0 { + * at least one single equation + sort varname + merge varname using `"`masterSingleFile'"' + } + else { + * both are multiple equations + sort eqname varname + merge eqname varname using `"`masterMultiFile'"' + } + sort mrgrow + cap drop _m + } + + tempvar order constCol + gen `order'=_n + gen `constCol'=0 + replace `constCol'=1 if varname=="_cons" + sort `constCol' `order' + drop `constCol' `order' + + * slap on SINGLE if only some are missing equation names + local N=_N + count if eqname=="" + if `r(N)'~=`N' { + replace report="SINGLE:"+varname if eqname=="" + replace eqname="SINGLE" if eqname=="" + } + + * update + count if mrgrow==. + local brows=`brows'+`r(N)' + replace mrgrow = 2*_n + 1 + `appottl' + 1 + sort eqname varname +} + + +* leave matrices if user-provided suffix available +if "`leave'"~="" { + count if varname~="" + local rN=r(N) + loca name + forval num=1/`rN' { + local temp=report[`num'] + local name "`name' `temp'" + } + + foreach var in ci_highEform ci_lowEform seEform beta coefEform ci_high ci_low pval tstat se coef { +****************************** Val must come off due to renaming + mkmat `var'Val in 1/`rN', matrix(`var'`leave') + mat colnames `var'`leave'=`var'`leave' + mat rownames `var'`leave'=`name' + } +} + + +*** putting together +* list of current column names other than user specified matrix: +* coef se report (beta) tstat T_alpha ci_low ci_high pval mrgrow astrix + + +gen str12 reportCol = "" + +* first prepare ancillary stats (tstat | se | ci | pvalue | beta) + +foreach var in varname coef coefEform beta /* + */ pval tstat se seEform /* + */ ci ciEform ci_low ci_lowEform ci_high ci_highEform /* + */ aster blank { + gen str12 `var'String = "" +} + +if `varMany'>0 & `varMany'<. & "`sumAsked'"~="" { + foreach var in `sumList' { + gen str12 `var'String = "" + } +} +foreach var in covar corr pwcorr spearman pcorr semipcorr pcorrpval tau_a tau_b { + if `varMany'>0 & `varMany'<. & "``var'Asked'"~="" { + gen str12 `var'String = "" + } +} +foreach var in eqname label label_pr label_up label_low test001 test01 test05 test10 { + if `varMany'>0 & `varMany'<. & "``var'Asked'"~="" { + gen str12 `var'String = "" + } +} + +if `varMany'>0 & `varMany'<. { + foreach var in `cmdList' { + gen str12 `var'String = "" + } + foreach var in `strList' { + gen str12 `var'String = "" + } +} + +*** string +replace varnameString=report + +foreach var in eqname varname label label_pr label_up label_low { + if `varMany'>0 & `varMany'<. & "``var'Asked'"~="" { + replace `var'String = `var' + } +} + + +*** string that needs numericals + foreach cmd in test001 { + if "``cmd'Asked'"=="`cmd'" { + gen str7 `cmd' = "" + local temp_p=subinstr("`cmd'","test","",.) + replace `cmd'="+" if coef<. & pval<. + replace `cmd'="-" if coef<0 & pval<. + replace `cmd'="?" if pval>`temp_p'/1000 & pval<. + * get it reported + replace `cmd'String=`cmd' + } + } + foreach cmd in test01 test05 test10 { + if "``cmd'Asked'"=="`cmd'" { + gen str7 `cmd' = "" + local temp_p=subinstr("`cmd'","test","",.) + replace `cmd'="+" if coef<. & pval<. + replace `cmd'="-" if coef<0 & pval<. + replace `cmd'="?" if pval>`temp_p'/100 & pval<. + * get it reported + replace `cmd'String=`cmd' + } + } + +local N=_N +* autodigit matrix columns +if `"`vectorList'"'~="" { + foreach var in `vectorList' { + gen str12 `var'String = "" + } + + * autoformat all user-defined matrices + foreach name in `vectorList' { + autogen `name', replace(`name'String) auto(`auto') less(`less') fmt(`fmt') width(12) decmark(`decmark') + } +} +if `"`nonvecList'"'~="" { + foreach var in `nonvecList' { + gen str12 `var'String = "" + } + + * autoformat all user-defined matrices + foreach name in `nonvecList' { + autogen `name', replace(`name'String) auto(`auto') less(`less') fmt(`fmt') width(12) decmark(`decmark') + } +} + +replace asterString = astrix if astrix~="" + + +/* not effective b/c drop/keep done above, yet tstat is not define up there +*** set nocons if Constant row is empty +tempvar test1 test2 +gen `test1'=. +foreach var in `statsList' { + * capture 'cause might not exist + cap replace `test1'=1 if `var'~=. +} +gen `test2'=1 if `test1'==. & varname=="_cons" +qui summarize `test2', meanonly + if _rc==101 { + noi di in red "pweight not allowed" + exit 101 + } + +if `r(N)'>0 { + local cons nocons +} +drop `test1' `test2' +*/ + + +*** decimals and formats (old) + +/* * parse bfmt + local fmttxt "e f g fc gc" + partxtl2 `"`bfmt'"' + local bfmtcnt = r(numtxt) + local b = 1 + while `b'<=`bfmtcnt' { + local bfmt`b' `r(txt`b')' + if index("`fmttxt'","`bfmt`b''")==0 { + di in red `"bfmt element "`bfmt`b''" is not a valid number format (f,fc,e,g or gc)"' + exit 198 + } + local b = `b'+1 + } + + *** fill in bdec(#) & bfmt(txt) + local b = 1 + while `b'<=_N { + local bdec`b' : word `b' of `bdec' + if "`bdec`b''"=="" { + local bdec`b' = `prvbdec' + } + local prvbdec "`bdec`b''" + local b = `b'+1 + } + * bfmt1 is already set above + local b = `bfmtcnt'+1 + while `b'<=_N { + local b_1 = `b'-1 + local bfmt`b' "`bfmt`b_1''" + local b = `b'+1 + } +*/ + +*** could possibly be empty +local N=_N +if `N'==0 { + set obs 1 +} + +*** ad hoc eqmatch codes +if "`eqmatch'"~="" { + while "`eqmatch'"~="" { + local eqmatch=trim(`"`eqmatch'"') + gettoken one eqmatch: eqmatch + gettoken two eqmatch: eqmatch + _eqmatch `one' `two' + } +} + +*** stnum( ) transformations of stats( ) contents +if `"`stnum'"'~="" { + gettoken one two: stnum, parse(,) + while `"`one'"'~="" { + if `"`one'"'~="," { + `one' + } + gettoken one two: two, parse(,) + } +} + +*** decimals and formats + +* originals +foreach thing in dec sdec bdec tdec pdec cdec rdec fmt sfmt bfmt tfmt pfmt cfmt rfmt { + local `thing'0 ``thing'' +} + +* decimlas +if "`dec'"=="" { + foreach stuff in dec sdec bdec tdec pdec cdec rdec { + if "``stuff''"=="" { + local `stuff' 3 + } + } +} +else { + foreach stuff in bdec sdec tdec pdec cdec rdec { + if "``stuff''"=="" { + local `stuff' `dec' + } + } +} + +* formats +if "`fmt'"=="" { + foreach stuff in fmt sfmt bfmt tfmt pfmt cfmt rfmt { + if "``stuff''"=="" { + local `stuff' fc + } + } +} +else { + foreach stuff in bfmt sfmt tfmt pfmt cfmt rfmt { + if "``stuff''"=="" { + local `stuff' `fmt' + } + } +} + +* disable autofmt if dec or bdec given +if "`dec0'"~="" | "`bdec0'"~="" { + local noauto noauto +} + +*** for the (parenthesis) numbers + local N=_N + if "`tdec0'"=="" & "`noauto'"~="noauto" { + autogen tstat, replace(tstatString) auto(`auto') less(`less') fmt(`tfmt') width(12) decmark(`decmark') + + + /* use autodigits + forval num=1/`N' { + autodigits2 tstat[`num'] `auto' `less' + replace tstatString = string(tstat,"%12.`r(valstr)'") in `num' + + *autofmt, input(`=tstat[`num']') auto(`auto') less(`less') + *replace tstatString = `"`r(output1)'"' in `num' + } + */ + } + else { + fmtgen tstat, replace(tstatString) dec(`tdec') fmt(`tfmt') width(12) decmark(`decmark') + } + + if "`sdec0'"=="" & "`noauto'"~="noauto" { + autogen se, replace(seString) auto(`auto') less(`less') fmt(`sfmt') width(12) decmark(`decmark') + autogen seEform, replace(seEformString) auto(`auto') less(`less') fmt(`sfmt') width(12) decmark(`decmark') + } + else { + fmtgen se, replace(seString ) dec(`sdec') fmt(`sfmt') width(12) decmark(`decmark') + fmtgen seEform, replace(seEformString ) dec(`sdec') fmt(`sfmt') width(12) decmark(`decmark') + } + + if "`pdec0'"=="" & "`noauto'"~="noauto" { + autogen pval, replace(pvalString) auto(`auto') less(`less') fmt(`pfmt') width(12) decmark(`decmark') + } + else { + fmtgen pval, replace(pvalString ) dec(`pdec') fmt(`pfmt') width(12) decmark(`decmark') + } + + if "`cdec0'"=="" & "`noauto'"~="noauto" { + autogen ci_low, replace(ci_lowString) auto(`auto') less(`less') fmt(`cfmt') width(12) decmark(`decmark') + autogen ci_high, replace(ci_highString) auto(`auto') less(`less') fmt(`cfmt') width(12) decmark(`decmark') + replace ciString = ci_lowString + " - " + ci_highString + + autogen ci_lowEform, replace(ci_lowEformString) auto(`auto') less(`less') fmt(`cfmt') width(12) decmark(`decmark') + autogen ci_highEform, replace(ci_highEformString) auto(`auto') less(`less') fmt(`cfmt') width(12) decmark(`decmark') + replace ciEformString = ci_lowEformString + " - " + ci_highEformString + } + else { + fmtgen ci_low, replace(ci_lowString) dec(`cdec') fmt(`cfmt') width(12) decmark(`decmark') + fmtgen ci_high, replace(ci_highString) dec(`cdec') fmt(`cfmt') width(12) decmark(`decmark') + replace ciString = ci_lowString + " - " + ci_highString + + fmtgen ci_lowEform, replace(ci_lowEformString) dec(`cdec') fmt(`cfmt') width(12) decmark(`decmark') + fmtgen ci_highEform, replace(ci_highEformString) dec(`cdec') fmt(`cfmt') width(12) decmark(`decmark') + replace ciEformString = ci_lowEformString + " - " + ci_highEformString + } + + if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" { + fmtgen beta, replace(betaString) dec(`cdec') fmt(`cfmt') width(12) decmark(`decmark') + } + + *** prepare coefSring + if "`bdec0'"=="" & "`noauto'"~="noauto" { + autogen coef, replace(coefString) auto(`auto') less(`less') fmt(`bfmt') width(12) decmark(`decmark') + autogen coefEform, replace(coefEformString) auto(`auto') less(`less') fmt(`bfmt') width(12) decmark(`decmark') + + * beta here (with coef) + if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" { + autogen beta, replace(betaString) auto(`auto') less(`less') fmt(`bfmt') width(12) decmark(`decmark') + + } + } + else { + + fmtgen coef, replace(coefString) dec(`bdec') fmt(`bfmt') width(12) decmark(`decmark') + fmtgen coefEform, replace(coefEformString) dec(`bdec') fmt(`bfmt') width(12) decmark(`decmark') + + * beta here (with coef) + if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" { + fmtgen beta, replace(betaString) dec(`bdec') fmt(`bfmt') width(12) decmark(`decmark') + } + } + +local N=_N +if `varMany'>0 & `varMany'<. & "`sumAsked'"~="" { + + *** digits and formats for sumAsked: + if "`dec0'"=="" & "`noauto'"~="noauto" { + foreach var in `sumList' { + autogen `var', replace(`var'String) auto(`auto') less(`less') fmt(`fmt') width(12) decmark(`decmark') + } + else { + fmtgen `var', replace(`var'String) dec(`dec') fmt(`fmt') width(12) decmark(`decmark') + } + } +} +foreach var in covar corr pwcorr spearman pcorr semipcorr pcorrpval tau_a tau_b { + if `varMany'>0 & `varMany'<. & "``var'Asked'"~="" { + + *** digits and formats for stats( ) correlations: + if "`dec0'"=="" & "`noauto'"~="noauto" { + autogen `var', replace(`var'String) auto(`auto') less(`less') fmt(`fmt') width(12) decmark(`decmark') + } + else { + fmtgen `var', replace(`var'String) dec(`dec') fmt(`fmt') width(12) decmark(`decmark') + } + } +} +if `varMany'>0 & `varMany'<. { + foreach var in `cmdList' { + *** digits and formats for stats( ) cmd( ): + if "`dec0'"=="" & "`noauto'"~="noauto" { + autogen `var', replace(`var'String) auto(`auto') less(`less') fmt(`fmt') width(12) decmark(`decmark') + } + else { + fmtgen `var', replace(`var'String) dec(`dec') fmt(`fmt') width(12) decmark(`decmark') + } + } + foreach var in `strList' { + *** digits and formats for stats( ) str( ): + if "`dec0'"=="" & "`noauto'"~="noauto" { + autogen `var', replace(`var'String) auto(`auto') less(`less') fmt(`fmt') width(12) decmark(`decmark') + } + else { + fmtgen `var', replace(`var'String) dec(`dec') fmt(`fmt') width(12) decmark(`decmark') + } + } + foreach var in `sigList' { + *** digits and formats for stats( ) sig( ): + if "`dec0'"=="" & "`noauto'"~="noauto" { + autogen `var', replace(`var'String) auto(`auto') less(`less') fmt(`fmt') width(12) decmark(`decmark') + } + else { + fmtgen `var', replace(`var'String) dec(`dec') fmt(`fmt') width(12) decmark(`decmark') + } + } +} + +order report eq* var* + +*** ststr( ) transformations of stats( ) contents +if `"`ststr'"'~="" { + * convert non-string into string of the same name if possible + local strList + foreach var of varlist *String { + local temp=substr("`var'",1,length(trim("`var'"))-6) + cap confirm string variable `temp, exact + if _rc~=0 { + * not a string + tempvar `temp'numer + cap gen ``temp'numer'=`temp' + cap tostring `temp', replace force + cap replace `temp'=`temp'String + if _rc==0 { + local tempvarList `"`tempvarList' `temp'numer"' + } + } + } + + gettoken one two: ststr, parse(,) + while `"`one'"'~="" { + if `"`one'"'~="," { + `one' + } + gettoken one two: two, parse(,) + } + + * convert back to numeral format if available + foreach var in `tempvarList' { + local temp=substr("`var'",1,length(trim("`var'"))-5) + cap replace `temp'String=`temp' + * work around for varabbrev on + cap confirm variable `temp', exact + if _rc==0 { + drop `temp' + } + cap gen `temp'=`temp'numer + } +} + +*** handle fvts 2 of 2 +* ad hoc fix for zeros - may have trouble with summary and tabulations + foreach thing in coef coefEform beta pval tstat se seEform ci ciEform ci_low ci_lowEform ci_high ci_highEform { + cap replace `thing'String="-" if coef==0 & se==0 & (fvts_type=="o"| fvts_type=="b") + *cap replace `thing'String="base" if coef==0 & se==0 & (fvts_type=="b") + *cap replace `thing'String="omitted" if coef==0 & se==0 & (fvts_type=="o") + } + + + * slap parenthesis for non-blank, even rows (as in parity) + * do not work well with sideway + * this might be violated by -sideway- but -cap replace- prevents error + if `"`bracketA'"'=="" & `"`bracket'"'=="" & `"`parenthesis'"'=="" & "`paren'"~="noparen" { + gettoken one two: statsList + local odd 1 + while `"`two'"'~="" { + if `odd'==0 { + local parenthesis "`parenthesis' `one'" + local odd 1 + } + else { + local odd 0 + } + gettoken one two: two + } + if `odd'==0 { + local parenthesis "`parenthesis' `one'" + local odd 1 + } + else { + local odd 0 + } + } + +************ ad hoc fix +* take out Eform and put it back in +local parenthesis `"`parenthesis' "' +local parenthesis : subinstr local parenthesis "Eform " " ", all +local parenthesis =trim("`parenthesis'") + +if `"`paren'"'~="noparen" { + if `"`bracketA'"'=="" & `"`bracket'"'=="" & `"`parenthesis'"'=="" { + local parenthesis "se" + } + + if `"`parenthesis'"'~="" { + * other possible valid: level coef_eform se_eform coef_beta se_beta + * also added: seEform, etc + optionSyntax, valid(eqname varname label label_pr label_up label_low test001 test01 test05 test10 coef se tstat pval ci aster blank beta ci_low ci_high N sum_w mean Var /* + */ sd skewness kurtosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99 cv range iqr semean median count corr covar pwcorr spearman /* + */ pcorr semipcorr pcorrpval tau_a tau_b `cmdList' `strList' `matList') /* + */ name(parenthesis) nameShow(paren:thesis( )) content(`parenthesis') passthru noreturn + local parenList `"`optionList'"' + local parenPerCoef `optionCount' + } + + * update when eform specified + if "`eform'"=="eform" { + local parenList "`parenList' " + * may be redundant + local parenList : subinstr local parenList "coef " "coefEform ", all + local parenList : subinstr local parenList "ci " "ciEform ", all + local parenList : subinstr local parenList "se " "seEform ", all + + local parenList : subinstr local parenList "ci_high " "ci_highEform ", all + local parenList : subinstr local parenList "ci_low " "ci_lowEform ", all + } + + if `"`bracketA'"'~="" { + *** bracketA( ) option cleanup + * other possible valid: level coef_eform se_eform coef_beta se_beta + optionSyntax, valid(eqname varname label label_pr label_up label_low test001 test01 test05 test10 coef se tstat pval ci aster blank beta ci_low ci_high N sum_w mean Var /* + */ sd skewness kurtosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99 cv range iqr semean median count covar corr pwcorr spearman /* + */ pcorr semipcorr pcorrpval tau_a tau_b `cmdList' `strList' `matList' ) /* + */ name(bracketA) nameShow(br:acket( )) content(`bracketA') passthru noreturn + local bracketList `"`optionList'"' + local bracketPerCoef `optionCount' + } + + * update when eform specified + if "`eform'"=="eform" { + local bracketList "`bracketList' " + * may be redundant + local bracketList : subinstr local bracketList "coef " "coefEform ", all + local bracketList : subinstr local bracketList "ci " "ciEform ", all + local bracketList : subinstr local bracketList "se " "seEform ", all + } + + if "`bracket'"=="bracket" & "`parenthesis'"=="" { + replace tstatString = "[" + tstatString + "]" if tstatString ~="" + replace pvalString = "[" + pvalString + "]" if pvalString ~="" + replace ciString = "[" + ciString + "]" if ciString ~="" + replace ciEformString = "[" + ciEformString + "]" if ciEformString ~="" + + replace ci_lowString = "[" + ci_lowString + "]" if ci_lowString ~="" + replace ci_highString = "[" + ci_highString + "]" if ci_highString ~="" + replace ci_lowEformString = "[" + ci_lowEformString + "]" if ci_lowEformString ~="" + replace ci_highEformString = "[" + ci_highEformString + "]" if ci_highEformString ~="" + + replace betaString= "[" + betaString+ "]" if betaString ~="" + replace seString = "[" + seString + "]" if seString ~="" + replace seEformString = "[" + seEformString + "]" if seEformString ~="" + replace betaString= "[" + betaString+ "]" if betaString ~="" + } + else if "`bracket'"=="bracket" & "`parenthesis'"~="" { + local num 1 + while `num'<=`parenPerCoef' { + local temp : word `num' of `parenList' + replace `temp'String = "[" + `temp'String + "]" if `temp'String ~="" + local num=`num'+1 + } + } + else { + if "`parenthesis'"~="" { + local num 1 + while `num'<=`parenPerCoef' { + local temp : word `num' of `parenList' + cap replace `temp'String = "(" + `temp'String + ")" if `temp'String ~="" + local num=`num'+1 + } + } + if "`bracketA'"~="" { + local num 1 + while `num'<=`bracketPerCoef' { + local temp : word `num' of `bracketList' + cap replace `temp'String = "[" + `temp'String + "]" if `temp'String ~="" + local num=`num'+1 + } + } + } +} /* if `"`paren'"'~="noparen" */ + +* when no coefficient/cons are present (prevent subid from going undefined) +local N=_N +if `N'==0 { + set obs 1 +} + +gen id=_n +expand `statsMany' +bys id: gen subid=_n + +replace report = "" if subid~=1 /* no variable names next to tstats */ +if `"`asterisk'"'~="" { + + *** asterisk( ) option cleanup + local asterValid "coef se tstat pval ci blank beta ci_low ci_high" + * no aster here + * level coef_eform se_eform coef_beta se_beta" + + * take comma out + local asterisk : subinstr local asterisk "asterisk(" " ", all + local asterisk : subinstr local asterisk ")" " ", all + local asterisk : subinstr local asterisk "," " ", all + + local asterPerCoef : word count `asterisk' + local num=1 + local asterList "" + + while `num'<=`asterPerCoef' { + local aster`num' : word `num' of `asterisk' + + * it must be one of the list + local test 0 + foreach var in `asterValid' { + if "`var'"=="`aster`num''" & `test'==0 { + local test 1 + } + } + * no longer test for asterValid + * if `test'==0 { + * noi di in red "{opt `aster`num''} is neither a valid option or matrix for {opt aster:isk( )}" + * exit 198 + * } + local asterList "`asterList' `aster`num''" + local num=`num'+1 + } +} +* update when eform specified +if "`eform'"=="eform" { + local asterList "`asterList' " + local asterList : subinstr local asterList "coef " "coefEform ", all + local asterList : subinstr local asterList "ci " "ciEform ", all + local asterList : subinstr local asterList "se " "seEform ", all + + local asterList : subinstr local asterList "ci_high " "ci_highEform ", all + local asterList : subinstr local asterList "ci_low " "ci_lowEform ", all +} + +*** combining them into one column + +if "`asterisk'" == "" { + forval num=1/`statsMany' { + local var : word `num' of `statsList' + replace reportCol=`var'String if subid==`num' + + * attach asterString + replace reportCol=`var'String + asterString if subid==`num' & ("`var'"=="coef" | "`var'"=="coefEform") + } +} +else { + forval num=1/`statsMany' { + local var : word `num' of `statsList' + replace reportCol=`var'String if subid==`num' + + * attach asterString + forval nn=1/`asterPerCoef' { + replace reportCol=`var'String + asterString if subid==`num' & ("`var'"=="`aster`nn''" | "`var'"=="`aster`nn''Eform") + } + } +} + +* drops vector/matrices as well: +keep report eqname varname mrgrow reportCol + +local num=mrgrow[1]-2 +replace mrgrow=`num'+_n + +* first find number of new rows for addstat() +if `"`addstat'"'!="" { + partxtl3 `"`addstat'"' + local naddst = int((real(r(numtxt))+1)/2) + + local n = 1 + while `n'<=`naddst' { + local t = (`n'-1)*2+1 + local astnam`n' `r(txt`t')' + local t = `t'+1 + local astval`n' `r(txt`t')' /* pair: stat name & value */ + local n = `n'+1 + } +} +else { + local naddst=0 +} + +* find number of new rows for addnote() +if (`"`addnote'"'!="" & "`append'"!="append") | (`"`addnote'"'!="" & `fileExist'==0) { + partxtl2 `"`addnote'"' + local naddnt = r(numtxt) + local n = 1 + while `n'<=`naddnt' { + local anote`n' `r(txt`n')' + local n = `n'+1 + } +} +else { + local naddnt=0 +} + +* calculate total number of rows in table +* added a second extra line above the coefficients: place 2 of 2 +*local coefrow = 2*`brows'+1+`appottl' + 1 +local coefrow = `statsMany'*`brows'+1+`appottl' + 1 +*local totrows = `coefrow' + ("`nobs'"!="nonobs") + (`numi'!=.) + ("`r2'"!="nor2"&`rsq'!=.&`df_r'!=.) + `naddst' + ("`notes'"!="nonotes"&"`append'"!="append")*(1+("`aster'"!="noaster")) + `naddnt' +cap local totrows = 2 + 20 + `coefrow' + ("`nobs'"!="nonobs") + (`numi'!=.) + ("`r2'"!="nor2") + `naddst' + ("`notes'"!="nonotes"&"`append'"!="append")*(1+("`aster'"!="noaster")) + `naddnt' + ("`notes'"!="nonotes" & `fileExist'==0)*(1+("`aster'"!="noaster")) +* 2 added for the top and bottom row (empty), 20 added for the heck of it +* totrows calculation is apparently no longer accurate when no file exists; merely add 20, drop the extra row at the end + +* cap here because could be lower due to drop/nocons +cap set obs `totrows' +if _rc~=0 { + local N20=_N+20 + set obs `N20' +} + +* insert the top row (empty), rowtype2==0 +local N=_N +set obs `=`N'+1' +local N=_N +replace mrgrow = 1 in `N' + +gen rowtype2=0 in `N' + +local N=_N + +*** always add the head column numbers +if "`append'"=="append" & `fileExist'==1 { + replace mrgrow = 0.001 in `=`N'-2' + replace reportCol = "(1)" in `=`N'-2' +} +else { + replace mrgrow = 0.001 in `=`N'-2' + replace reportCol = "(1)" in `=`N'-2' + * add one back to make up for it + local coefrow = `coefrow'+1 +} + +local coefrow = `coefrow'-1 + +if "`eretrun'"=="" & `"`ctitleList'"'=="" { + * because they are empty: + local comma + foreach var in `statsList' { + local ctitleList `"`ctitleList'`comma'`var'"' + local comma "," + } + local comma +} + +if "`eretrun'"=="" { + local obs noobs +} + +* there must be at least one ctitleList +if `"`ctitleList'"'=="" { + local ctitleList " " +} + +*** ad hoc fix for ctitleList, which is assigned by the main program from stats( ) contents +********* ctitleList needs to fixed for -sideway- and str( ) or cmd( ) invoked +if `"`cmd1'"'==`"`ctitleList'"' & "`statsMany'"=="1" { + local ctitleList `"`reg1'"' +} +if `"`string1'"'==`"`ctitleList'"' & "`statsMany'"=="1" { + local ctitleList "string" +} + +* add to the end +if `"`ctbot'"'~="" { + local ctitleList `"`ctitleList', `ctbot'"' +} + +* parsing ctitleList contents (2 of 2), counts the first and the last comma and the consecutive commas +local rest `"`ctitleList'"' +local count 0 +while `"`rest'"'~="" { + gettoken first rest: rest, parse(",") + if `"`first'"'=="," & `count'==0 { + local count=`count'+1 + local txt`count' + } + if `"`first'"'~="," { + local count=`count'+1 + local txt`count' `"`first'"' + } + if `"`first'"'=="," & `"`previous'"'=="," { + local count=`count'+1 + local txt`count' + } + local previous `"`first'"' +} +if `"`first'"'=="," & `count'~=0 { + local count=`count'+1 + local txt`count' +} + +local numtxt `count' + +* adding more rows for ctitles +if `numtxt'>0 { + set obs `=`N'+`numtxt'' + local N=_N + forval num=1/`numtxt' { + replace mrgrow = `num'/100 in `=`N'-`num'+1' + + * insert ctitles + replace reportCol=`"`txt`num''"' in `=`N'-`num'+1' + + replace rowtype2=-1 in `=`N'-`num'+1' + local coefrow = `coefrow'+1 + } +} + +sort mrgrow +replace mrgrow = _n + +* the bottom row (empty), rowtype2==2 +local coefrow = `coefrow'+1 + +replace rowtype2=-1 if rowtype2[_n+1]==0 | rowtype2[_n+1]==-1 + +replace rowtype2=1 if _n<`coefrow' & rowtype2==. +replace rowtype2=2 if _n==`coefrow' +replace rowtype2=3 if _n>`coefrow' + +* only if it's not sideway runons +if `sidewayWave'==1 { + + * number of observations + if "`obs'"!="noobs" { + local coefrow = `coefrow'+1 + replace report = "Observations" if _n==`coefrow' + *replace reportCol = string(`regN') if _n==`coefrow' + cap replace reportCol = string(`regN',"%12.0fc") if _n==`coefrow' + } + + if "`eretrun'"~="" { + if (`numi'!=. & "`ni'"!="noni") { + local coefrow = `coefrow'+1 + replace report = "Number of " + rtrim(`"`iname'"') if _n==`coefrow' + *replace reportCol = string(`numi') if _n==`coefrow' + cap replace reportCol = string(`numi',"%12.0fc") if _n==`coefrow' + } + + * scalar crap, no rsq if it's a dot + if "`r2'"~="nor2" { + if `=`rsq''==. { + local r2 "nor2" + } + } + + if "`r2'"!="nor2" { + /* if df_r=., not true r2 */ + local coefrow = `coefrow'+1 + replace reportCol = string(`rsq',"%12.`rdec'`rfmt'") if _n==`coefrow' + if `"`decmark'"'~="" { + replace reportCol = subinstr(reportCol,".",`"`decmark'"',.) if _n==`coefrow' + } + replace report = "R-squared" if _n==`coefrow' + if "`adjr2'"=="adjr2" { + replace report = "Adjusted " + report if _n==`coefrow' + } + } + } /* eretrun */ + + *** addtext here + if `"`addtext'"'!="" { + partxtl2 `"`addtext'"' + local temp = int((real(r(numtxt))+1)/2) + + local n = 1 + while `n'<=`temp' { + local t = (`n'-1)*2+1 + local textName`n' `r(txt`t')' + local t = `t'+1 + local textValue`n' `r(txt`t')' /* pair: stat name & value */ + local n = `n'+1 + } + + local i 1 + while `i'<=`temp' { + * increase + local coefrow = `coefrow'+1 + local N=_N + set obs `=`N'+1' + + if `"`textValue`i''"'!="" { + replace reportCol = "`textValue`i''" if _n==`coefrow' + } + replace report = trim(`"`textName`i''"') if _n==`coefrow' + local i = `i'+1 + } + + * cleanup counting + replace mrgrow=_n + } + + *** addstat here + if `"`addstat'"'!="" { + local i 1 + local adeccnt : word count `adec' + while `i'<=`naddst' { + local coefrow = `coefrow'+1 + local aadec : word `i' of `adec' + if "`aadec'"=="" { + local aadec `prvadec' + } + if `"`astval`i''"'!="" { + replace reportCol = "`astval`i''" if _n==`coefrow' + if `"`decmark'"'~="" { + replace reportCol = subinstr(reportCol,".",`"`decmark'"',.) if _n==`coefrow' + } + } + replace report = trim(`"`astnam`i''"') if _n==`coefrow' + local i = `i'+1 + local prvadec `aadec' + } + } +} + + +local parenList=trim(`"`parenList'"') + +if "`eretrun'"~="" & ("`notes'"!="nonotes" & "`append'"!="append") | ("`notes'"!="nonotes" & `fileExist'==0) { + if "`bracket'"=="bracket" | "`bracketA'" ~= "" { + local par_bra "brackets" + } + else { + local par_bra "parentheses" + } + + * notes + if "`statsList'"=="coef pval" { + local statxt "p-values" + } + else if "`statsList'"=="coef se" { + local statxt "Standard errors" + } + else if "`statsList'"=="coef pi" { + local statxt "`level'% confidence intervals" + } + else if "`beta'"=="beta" { + local statxt "Normalized beta coefficients" + } + else if "`parenList'"=="se" { + local statxt "Standard errors" + } + else if "`parenList'"=="tstat" { + if `df_r'!=. { + local t_or_z "t" + } + else { + local t_or_z "z" + } + local statxt "`t_or_z'-statistics" + } + else { + local statxt `"`parenList'"' + } + + if "`robust'"=="Robust" { + local statxt = "Robust " + lower("`statxt'") + } + + * actually inserting + if ("`parenList'"~="" | "`bracketList'"~="" ) & "`statsList'"~="coef" { + if `"`paren'"'~="noparen" { + local coefrow = `coefrow'+1 + replace report = "`statxt' in `par_bra'" if _n==`coefrow' + } + } + if "`aster'"!="noaster" { + local coefrow = `coefrow'+1 + replace report = "`astrtxt'" if _n==`coefrow' + } +} + +if (`"`addnote'"'!="" & "`append'"!="append") | (`"`addnote'"'!="" & `fileExist'==0) { + local i 1 + while `i'<=`naddnt' { + local coefrow = `coefrow'+1 + replace report = `"`anote`i''"' if _n==`coefrow' + local i = `i'+1 + } +} + +* attach the column name +replace report=`"`VARIABLES'"' if rowtype2[_n+1]==0 +replace report=`"`VARIABLES'"' if rowtype2==0 & report[_n-1]~=`"`VARIABLES'"' + + +*** drop the extra rows at the end, if still exist, unless it is the bottom row +local N=_N +local temp=report[`N'] +local check=rowtype2[`N'] +while "`temp'"=="" & `check'>2 { + drop in `N' + local N=_N + local temp=report[`N'] + local check=rowtype2[`N'] +} + +*** handle equationsA(auto) +if "`equationsOption'"=="auto" { + + *******************************cap set unabbr off + local N=_N + forval num=1/`N' { + local temp=eqname[`num'] + if "`temp'"~="" { + * check if this variable exists + cap summarize `temp', meanonly + if _rc==101 { + noi di in red "pweight not allowed" + exit 101 + } + if _rc~=0 { + count if eqname=="`temp'" + local thisMany=r(N)/`statsMany' + if `thisMany'>1 & `thisMany'<. { + replace report ="Constant" if eqname=="`temp'" & varname=="_cons" & report~="" + replace report =varname if eqname=="`temp'" & varname~="_cons" & report~="" + replace eqname="" if eqname=="`temp'" + } + else { + replace report =eqname if eqname=="`temp'" & varname=="_cons" & report~="" + replace eqname="" if eqname=="`temp'" + } + } + } + } +} + +*** handle policy 3 of 3 +if "`policy0'"~="" { + local cc: word count `policyList' + if `cc'>0 & `cc'<. { + if `cc'==1 { + replace report="Policy" if report=="`policyList'" + replace varname="Policy" if varname=="`policyList'" + } + else { + local num 1 + foreach var in `policyList' { + replace report="Policy `num'" if report=="`var'" + replace varname="Policy `num'" if varname=="`var'" + local ++num + } + } + } +} + + + +qui replace reportCol="" if (reportCol=="(-)" | reportCol=="[-]" | reportCol=="(omitted)" | reportCol=="[omitted]" | reportCol=="(base)" | reportCol=="[base]") & rowtype2==1 + +* also c_local varname_list1 above + +end /* makeFile */ + + +******************************************************************************************** + + +prog define seeing + versionSet + version `version' + +quietly { + + * syntax using/[, Clear] + syntax using [, LABel LABelA(str) ] + + preserve + + insheet2 `using', nonames clear + describe, short + + + * number of columns + local numcol = `r(k)' + + tempvar blanks rowmiss + count if v1=="EQUATION" + if `r(N)'~=0 { + local eqPlace 1 + local varPlace 2 + count if v3=="LABELS" + if `r(N)'~=0 { + local labPlace 3 + local num=4 + } + else { + local labPlace 0 + local num=3 + } + } + else { + local eqPlace 0 + local varPlace 1 + + count if v2=="LABELS" + if `r(N)'~=0 { + local labPlace 2 + local num=3 + } + else { + local labPlace 0 + local num=2 + } + } + + gen int `blanks' = (trim(v`num')=="") + forvalues col = `num'/`numcol' { + replace `blanks' = `blanks' & (trim(v`col')=="") + } + + + * title rows + local titleWide = 0 + if v1[1]~="" | v2[1]~="" { + * there may be a title + if `labPlace'==0 & `varPlace'==1 { + while v1[`=`titleWide'+1']~="" & v2[`=`titleWide'+1']=="" { + local titleWide = `titleWide'+1 + } + } + if `labPlace'==0 & `varPlace'==2 { + while v2[`=`titleWide'+1']~="" & v3[`=`titleWide'+1']=="" { + local titleWide = `titleWide'+1 + } + } + if `labPlace'~=0 & `varPlace'==1 { + while v1[`=`titleWide'+1']~="" & v3[`=`titleWide'+1']=="" { + local titleWide = `titleWide'+1 + } + } + if `labPlace'~=0 & `varPlace'==2 { + while v2[`=`titleWide'+1']~="" & v4[`=`titleWide'+1']=="" { + local titleWide = `titleWide'+1 + } + } + } + + *local VARIABLES "VARIABLES" + * first name AFTER titles is the VARIABLES + local content + local num=`titleWide'+1 + local N=_N + while `"`content'"'=="" & `num'<=`N' { + local content=v`varPlace'[`num'] + local num=`num'+1 + } + local VARIABLES `"`content'"' + + replace `blanks'=0 if v1==`"`VARIABLES'"' | v1[_n-1]==`"`VARIABLES'"' | v2==`"`VARIABLES'"' | v2[_n-1]==`"`VARIABLES'"' + + + * getting bottomBorder (the bottom border), count up + gen rowmiss=0 + foreach var of varlist v* { + replace rowmiss=rowmiss+1 if `var'~="" + } + local N=_N + local content 1 + local num 0 + while `content'==1 & `num'<`N' { + local content rowmiss[`=`N'-`num''] + local num=`num'+1 + } + * do not have to add to titleWide + local bottomRow = `N'-`num'+1 + local bottomBorder=`bottomRow' + + * getting halfway to headBorder (the top border), count down + local content + local num=`titleWide'+1 + local N=_N + while `"`content'"'=="" & `num'<=`N' { + local content=v`varPlace'[`num'] + local num=`num'+1 + } + * do not have to add to titleWide + local headRow `num' + local headBorder=`headRow' + + drop rowmiss + + + * avoid counting space within each statistics row as missing + replace `blanks'=0 if `blanks'[_n+1]==0 & `blanks'==1 & _n >`titleWide' + + + * statistics rows + *count if `blanks'==0 + *local bottomBorder = `r(N)'+`titleWide' + + + * move the notes and titles to the top of a new column + gen str5 Notes_Titles="" + format Notes_Titles %-20s + count if v1=="EQUATION" + if `r(N)'==0 { + * EQUATION column does not exist + if `titleWide'>0 { + forval num=1/`titleWide' { + replace Notes_Titles=v1[`num'] in `num' + replace v1="" in `num' + } + } + + local one = 1 + local legend = v1[`bottomBorder'+`one'] + + + local place 1 + *while "`legend'"~="" { + local N=_N + while `place' <= `N' { + local place=`bottomBorder'+`one' + local legend = v1[`place'] + replace Notes_Titles="`legend'" in `=`one'+`titleWide'+1' + if "`legend'"~="" { + replace v1="" in `place' + } + local one = `one'+1 + } + + * insert label changes here, minus 2 from c(k) for `blanks' & Notes_Titles column + if "`label'"=="label" { + *if ("`long'"~="long" & "`onecol'"~="onecol") | ("`long'"=="long" & "`onecol'"=="onecol") { + replace v2=v1 if v2=="" + drop v1 + describe, short + forval num=1/`=`r(k)'-2' { + ren v`=`num'+1' v`num' + } + + * change LABELS to VARIABLES + replace v1=`"`VARIABLES'"' if v1=="LABELS" + *} + local label_adjust "-1" + } + + * change the string length + gen str5 temp="" + replace temp=v1 + drop v1 + ren temp v1 + order v1 + * format + foreach var of varlist v1 { + local _format= "`: format `var''" + local _widths=substr("`_format'",2,length(trim("`_format'"))-2) + format `var' %-`_widths's + } + } + else { + * equation column exists + if `titleWide'>0 { + forval num=1/`titleWide' { + replace Notes_Titles=v2[`num'] in `num' + replace v2="" in `num' + } + } + + local one = 1 + local legend = v2[`bottomBorder'+`one'] + while "`legend'"~="" { + local place=`bottomBorder'+`one' + local legend = v2[`place'] + replace Notes_Titles="`legend'" in `=`one'+`titleWide'+1' + if "`legend'"~="" { + replace v2="" in `place' + } + local one = `one'+1 + } + + * insert label changes here, minus 2 from c(k) for `blanks' & Notes_Titles column + if "`label'"=="label" { + *else if "`long'"~="long" & "`onecol'"=="onecol" { + replace v3=v2 if v3=="" + drop v2 + describe, short + forval num=2/`=`r(k)'-2' { + ren v`=`num'+1' v`num' + } + + * change LABELS to VARIABLES + replace v2=`"`VARIABLES'"' if v2=="LABELS" + *} + local label_adjust "-1" + } + + + * change the string length + gen str5 temp="" + replace temp=v2 + drop v2 + ren temp v2 + order v1 v2 + * format + foreach var of varlist v1 v2 { + local _format= "`: format `var''" + local _widths=substr("`_format'",2,length(trim("`_format'"))-2) + format `var' %-`_widths's + } + } + + * clean up + *egen `rowmiss'=rowmiss(_all) + * rowmiss option not available in 8.2 or 8.0, do it by hand + + gen `rowmiss'=0 + foreach var of varlist _all { + if "`var'"~="`rowmiss'" & "`var'"~="`blanks'" { + replace `rowmiss'=1+`rowmiss' if `var'=="" + } + } + + *drop if `rowmiss'==`numcol'+1 + + * adjust to handle label column droppings + *drop if `rowmiss'==`numcol'+1 & `blanks'==1 + + * fix blanks==1 for groupvar( ) + count if `blanks'==1 + local rN=`r(N)'+1 + forval num=1/`rN' { + replace `blanks'=0 if `blanks'[_n+1]==0 & `blanks'==1 + } + + drop if `rowmiss'==`numcol'+1 `label_adjust' & `blanks'==1 + drop `blanks' `rowmiss' + + browse + + if "`Version7'"=="" { + * it is version 7 + } + else if `Version7'>=11.0 { + noi di in yel "Hit Enter to continue" _request(c_request) + if `"$c_request"'~="" { + c_local c_request $c_request + global c_request + } + } +} +end /* end of seeing */ + + +******************************************************************************************** + + +* 02nov2009 to handle strings +* 15dec2009 to decmark( ) added +prog define fmtgen + + syntax [varlist(default=none)] [in], replace(str asis) fmt(str asis) [dec(int 3) auto(int 3) less(int 0) /* + */ width(int 12) gen(str asis) decmark(str asis)] + +if "`varlist'"~="" { + local varname `varlist' + replace `replace' = string(`varname',"%12.`dec'`fmt'") `in' + + if "`decmark'"~="" { + replace `replace' = subinstr(`replace',".",`"`decmark'"',.) `in' + } +} + +end + + +******************************************************************************************** + + +* 02nov2009 to handle strings and variables in addition to numbers +* 09nov2009 also accomodates various user-specified formats, including e +* 15dec2009 to decmark( ) added + +prog define autogen + versionSet + version `version' + + syntax [varlist(default=none)] [in], replace(str asis) [dec(int 3) fmt(str asis) auto(int 3) less(int 0) /* + */ width(int 12) gen(str asis) decmark(str asis)] + +if "`fmt'"=="" { + local fmt f +} + +if "`varlist'"~="" { + local varname `varlist' + + if "`in'"~="" { + gettoken junk begin: in, parse(" ") + gettoken begin end: begin, parse("/") + gettoken slash end: end, parse("/") + } + else { + local begin 1 + local end=_N + local in "in 1/`=_N'" + } + + cap confirm numeric var `varname' + + if _rc==0 { + tempvar whole times left aadec aadecString valstr format + *gen `whole'=1 if round((`varname' - int(`varname')),0.0000000001)==0 + *gen `whole'=1 if float(`varname') - int(`varname')==0 + gen `whole'=1 if round(`varname' - int(round(`varname',0.0000000001)),0.0000000001)==0 + replace `whole'=0 if `whole'==. + + * digits that need to be moved if it were only decimals: take the ceiling of log 10 of absolute value of decimals + gen `times'=abs(int(ln(abs(`varname'-int(`varname')))/ln(10)-1)) if `whole'==0 + + * the whole number: take the ceiling of log 10 of absolute value + gen `left'=int(ln(abs(`varname'))/ln(10)+1) if `whole'==0 + + * assign the fixed decimal values into aadec + gen `aadec'=0 if `whole'==1 + + * reduce the left by one if more than zero to accept one extra digit + replace `aadec'=`auto'-`left'+1 if .>`left' & `left'>0 & `left'<=`auto' & `whole'==0 + replace `aadec'=`auto'-`left'-1 if .>`left' & `left'>0 & `left'>`auto' & `whole'==0 + + * else + replace `aadec'=`times'+`auto'-1 if (.<=`left' | `left'<=0) & `whole'==0 + + * needs to between 0 and 11 + replace `aadec'=`aadec'-`less' + replace `aadec'=0 if `aadec'<0 + + gen str12 `aadecString'=string(`aadec') + gen str12 `valstr'="" + + replace `valstr'=`aadecString'+"`fmt'" if `aadec'<7 & `aadec'~=. + if "`fmt'"=="e" { + replace `valstr'="`=`auto'-0'e" + } + + replace `valstr'="`=`auto'-1'e" if `aadec'>=7 & `aadec'~=. + + * make it exponential if too big or too negative (small) + replace `valstr' = "`=`auto'+0'e" if `varname'>1000000 & `varname'<. + replace `valstr' = "`=`auto'+0'e" if `varname'<-1000000 & `varname'<. + + gen str12 `format'= "%`width'." + `valstr' if `valstr'~="" + + forval num=`begin'/`end' { + local content=`format'[`num'] + replace `replace' = string(`varname',"`content'") in `num' + } + } + else { + * string variable, do it old-fashioned way + replace `replace'=`varname' + forval num=`begin'/`end' { + capture confirm number `=`varname'[`num']' + if _rc==0 { + autofmt, input(`=`varname'[`num']') dec(`auto') less(`less') + if "`=`varname'[`num']'"~="" { + replace `replace' = string(`=`varname'[`num']',"%`width'.`r(deci1)'`fmt'") if _n==`num' & "`r(deci1)'"~="." + } + /* + autodigits2 `=`varname'[`num']' `auto' `less' + if "`=`varname'[`num']'"~="" { + replace `replace' = string(`=`varname'[`num']',"%`width'.`r(valstr)'") if _n==`num' & "`r(valstr)'"~="." + } + */ + *autodigits2 tstat[`num'] `auto' `less' + *replace tstatString = string(tstat,"%12.`r(valstr)'") in `num' + } + } + } +} +else { + * not a variable + +} + +if "`decmark'"~="" { + replace `replace' = subinstr(`replace',".",`"`decmark'"',.) `in' +} + + +end + + +******************************************************************************************** + + +* 03nov2009 integer check upgraded to handle more indeterminancy coming from string numerals +* 15dec2009 to decmark( ) added + +prog define autodigits2, rclass + versionSet + version `version' + +* getting the significant digits +args input auto less decmark + +if `input'~=. { + local times=0 + local left=0 + + * integer checked by modified mod function + *if round((`input' - int(`input')),0.0000000001)==0 { + if round(`input' - int(round(`input',0.0000000001)),0.0000000001)==0 { + local whole=1 + } + else { + local whole=0 + * non-interger + if `input'<. { + + * digits that need to be moved if it were only decimals: take the ceiling of log 10 of absolute value of decimals + local times=abs(int(ln(abs(`input'-int(`input')))/ln(10)-1)) + + * the whole number: take the ceiling of log 10 of absolute value + local left=int(ln(abs(`input'))/ln(10)+1) + } + } + + + * assign the fixed decimal values into aadec + if `whole'==1 { + local aadec=0 + } + else if .>`left' & `left'>0 { + * reduce the left by one if more than zero to accept one extra digit + if `left'<=`auto' { + local aadec=`auto'-`left'+1 + } + else { + local aadec=0 + } + } + else { + local aadec=`times'+`auto'-1 + } + + if "`less'"=="" { + * needs to between 0 and 11 + if `aadec'<0 { + local aadec=0 + } + *if `aadec'<11 { + if `aadec'<7 { + * use fixed + local valstr "`aadec'f" + } + else { + * use exponential + local valstr "`=`auto'-1'e" + } + } + else { + * needs to between 0 and 11 + local aadec=`aadec'-`less' + if `aadec'<0 { + local aadec=0 + } + *if `aadec'<10 { + if `aadec'<7 { + * use fixed + local valstr "`aadec'f" + } + else { + * use exponential + local valstr "`=`auto'-1'e" + } + } + + * make it exponential if too big + if `input'>1000000 & `input'<. { + local valstr "`=`auto'-0'e" + } + + * make it exponential if too negative (small) + if `input'<-1000000 & `input'<. { + local valstr "`=`auto'-0'e" + } + + if "`decmark'"~="" { + local valstr : subinstr local valstr "." `"`decmark'"', all + } + return scalar value=`aadec' + return local valstr="`valstr'" +} +else { + * it is a missing value + return scalar value=. + return local valstr="missing" +} +end + + +******************************************************************************************** + +* ripped from autofmt on 09nov2009 +* autofmt 1.0.1 03nov2009 roywada@hotmail.com +* automatic formating of a significant number of digits +* 15dec2009 to decmark( ) added + +prog define autofmt, rclass +version 7.0 + +syntax, input(str) [dec(integer 3) less(integer 0) parse(str) strict] +* parse( ) takes only one character; " " is always included as a parse + +if `"`parse'"'=="" { + local parse " " +} + +local rest `"`input'"' +local count 0 + +if "`rest'"~="" { + * handles the possibility the first token is empty + gettoken first rest: rest, parse("`parse'") + local first=trim(`"`first'"') + if `"`first'"'==`"`parse'"' { + local count=`count'+1 + local input`count' "" + } + else { + local count=`count'+1 + local input`count' `"`first'"' + } +} +while "`rest'"~="" { + gettoken first rest: rest, parse("`parse'") + local first=trim(`"`first'"') + if `"`first'"'~=`"`parse'"' { + local count=`count'+1 + local input`count' `"`first'"' + } +} + +if `count'==0 { + * input( ) was left empty + exit +} + +if "`strict'"=="strict" { + local one 0 +} +else { + local one 1 +} + + +*** run as many times + +forval num=1/`count' { + + * confirm a number + capture confirm number `input`num'' + local rc=_rc + + * run if not missing and is a number + if "`input`num''"~="." & "`input`num''"~="" & `rc'==0 { + local times=0 + local left=0 + + * integer checked by modified mod function + *if round((`input`num'' - int(`input`num'')),0.0000000001)==0 { + if round(`input' - int(round(`input',0.0000000001)),0.0000000001)==0 { + local whole=1 + } + else { + local whole=0 + * non-interger + if `input`num''<. { + + * digits that need to be moved if it were only decimals: take the ceiling of log 10 of absolute value of decimals + local times=abs(int(ln(abs(`input`num''-int(`input`num'')))/ln(10)-1)) + + * the whole number: take the ceiling of log 10 of absolute value + local left=int(ln(abs(`input`num''))/ln(10)+1) + } + } + + + * assign the fixed decimal values into aadec + if `whole'==1 { + local aadec=0 + } + else if .>`left' & `left'>0 { + * reduce the left by one if more than zero to accept one extra digit + if `left'<=`dec' { + local aadec=`dec'-`left'+`one' + } + else { + local aadec=0 + } + } + else { + local aadec=`times'+`dec'-1 + } + + if "`less'"=="" { + * needs to between 0 and 11 + if `aadec'<0 { + local aadec=0 + } + *if `aadec'<11 { + if `aadec'<7 { + * use fixed + local fmt "`aadec'f" + } + else { + * use exponential + local fmt "`=`dec'-1'e" + } + } + else { + * needs to between 0 and 11 + local aadec=`aadec'-`less' + if `aadec'<0 { + local aadec=0 + } + *if `aadec'<10 { + if `aadec'<7 { + * use fixed + local fmt "`aadec'f" + } + else { + * use exponential + local fmt "`=`dec'-1'e" + } + } + + * make it exponential if too big + if `input`num''>1000000 & `input`num''<. { + local fmt "`=`dec'-0'e" + } + + * make it exponential if too negative (small) + if `input`num''<-1000000 & `input`num''<. { + local fmt "`=`dec'-0'e" + } + + local fmt`num' `fmt' + local aadec`num' `aadec' + + local output`num'=string(`input`num'',"%12.`fmt'") + + if "`decmark'"~="" { + local valstr : subinstr local aadec "." `"`decmark'"', all + } + return scalar deci`num'=`aadec' + return local fmt`num'="`fmt'" + return local input`num'="`input`num''" + + return local output`num'=`"`output`num''"' + + } + else { + * it is a missing value, empty, or non-number + local output`num'=trim(`"`input`num''"') + + return scalar deci`num'=. + return local fmt`num'="." + if "`input`num''"=="" { + * return a dot when empty + return local input`num'="." + } + else { + return local input`num'="`input`num''" + } + + return local output`num'=`"`output`num''"' + + } +} +end + + +******************************************************************************************** + + +prog define _texout, sortpreserve +* based on out2tex version 0.9 4oct01 by john_gallup@alum.swarthmore.edu +* 2013 04 set version 8 and moved versionSet to bottom + + version 8 + + * add one if only one v* column exists + unab list: v* + local count: word count `list' + if `count'==1 { + gen str v2="" + order v* + } + if `count'==0 { + exit + } + + syntax varlist using/, titleWide(int) headBorder(int) bottomBorder(int) /* + */ [texFile(str) TOtrows(int 0) Landscape Fragment NOPRetty PRetty /* + */ Fontsize(numlist integer max=1 >=10 <=12) noBorder Cellborder /* + */ Appendpage noPAgenum a4 a5 b5 LETter LEGal EXecutive replace ] + if `totrows'==0 { + local totrows = _N + } + local numcols : word count `varlist' + gettoken varname statvars : varlist + local fast 1 + + if "`pretty'"=="pretty" { + local pretty "" + } + else { + local pretty "NOT PRETTY AT ALL" + } + + local colhead1 = `titleWide' + 1 + local strow1 = `headBorder' + 1 + + * insert $<$ to be handled in LaTeX conversion + local N=_N + forval num=`bottomBorder'/`N' { + local temp=v1[`num'] + tokenize `"`temp'"', parse (" <") + local count 1 + local newTex "" + local noSpace 0 + while `"``count''"'~="" { + if `"``count''"'=="<" { + local `count' "$<$" + local newTex `"`newTex'``count''"' + local noSpace 1 + } + else { + if `noSpace'~=1 { + local newTex `"`newTex' ``count''"' + } + else { + local newTex `"`newTex'``count''"' + local noSpace 0 + } + } + local count=`count'+1 + } + replace v1=`"`newTex'"' in `num' + } + + *** replace if equation column present + count if v1=="EQUATION" + if `r(N)'~=0 { + tempvar myvar + * use v2 instead + replace v1 = v2 in `=`bottomBorder'+1'/`totrows' + replace v2 = "" in `=`bottomBorder'+1'/`totrows' + + * change the string length + gen str5 `myvar' ="" + replace `myvar' =v2 + drop v2 + ren `myvar' v2 + order v1 v2 + } + + /* if file extension specified in `"`using'"', replace it with ".tex" for output + local next_dot = index(`"`using'"', ".") + if `next_dot' { + local using = substr("`using'",1,`=`next_dot'-1') + } + */ + + if `"`texFile'"'=="" { + local endName "tex" + } + else { + local endName "`texFile'" + } + + local using `"using "`using'.`endName'""' + local fsize = ("`fontsize'" != "") + if `fsize' { + local fontsize "`fontsize'pt" + } + local lscp = ("`landscape'" != "") + if (`lscp' & `fsize') { + local landscape ",landscape" + } + local pretty = ("`pretty'" == "") + local cborder = ("`cellborder'" != "") + local noborder = ("`border'" != "") + local nopagen = ("`pagenum'" != "") + local nofrag = ("`fragment'" == "") + + if `cborder' & `noborder' { + di in red "may not specify both cellborder and noborder options" + exit 198 + } + + local nopt : word count `a4' `a5' `b5' `letter' `legal' `executive' + if `nopt' > 1 { + di in red "choose only one of a4, a5, b5, letter, legal, executive" + exit 198 + } + local pagesize "`a4'`a5'`b5'`letter'`legal'`executive'" + if "`pagesize'"=="" | "`letter'"!="" { + local pwidth "8.5in" + local pheight "11in" + } + else if "`legal'"!="" { + local pwidth "8.5in" + local pheight "14in" + } + else if "`executive'"!="" { + local pwidth "7.25in" + local pheight "10.5in" + } + else if "`a4'"!="" { + local pwidth "210mm" + local pheight "297mm" + } + else if "`a5'"!="" { + local pwidth "148mm" + local pheight "210mm" + } + else if "`b5'"!="" { + local pwidth "176mm" + local pheight "250mm" + } + if `lscp' { + local temp "`pwidth'" + local pwidth "`pheight'" + local pheight "`temp'" + } + if "`pagesize'"!="" { + local pagesize "`pagesize'paper" + if (`lscp' | `fsize') { + local pagesize ",`pagesize'" + } + } + if `cborder' & `noborder' { + di in red "may not specify both cellborder and noborder options" + exit 198 + } + + quietly { + tempvar has_eqn st2_row last_st pad0 pad1 pad2_n padN order + + * replace % with \%, and _ with \_ if <2 $'s (i.e. not an inline equation: $...$ + * has_eqn indicates that varname has 2+ $'s + + gen byte `has_eqn' = index(`varname',"$") + + * make sure there are 2+ "$" in varname + replace `has_eqn' = index(substr(`varname',`has_eqn'+1,.),"$")>0 if `has_eqn'>0 + replace `varname'= subinstr(`varname',"_", "\_", .) if !`has_eqn' + replace `varname'= subinstr(`varname',"%", "\%", .) + replace `varname'= subinstr(`varname',"#", "\#", .) + + if `pretty' { + replace `varname'= subinword(`varname',"R-squared", "\$R^2$", 1) in `strow1'/`bottomBorder' + replace `varname'= subinstr(`varname'," t stat", " \em t \em stat", 1) in `bottomBorder'/`totrows' + replace `varname'= subinstr(`varname'," z stat", " \em z \em stat", 1) in `bottomBorder'/`totrows' + } + + foreach svar of local statvars { /* make replacements for column headings rows of statvars */ + replace `has_eqn' = index(`svar',"$") in `colhead1'/`headBorder' + replace `has_eqn' = index(substr(`svar',`has_eqn'+1,.),"$")>0 in `colhead1'/`headBorder' if `has_eqn'>0 + replace `svar'= subinstr(`svar',"_", "\_", .) in `colhead1'/`headBorder' if !`has_eqn' + replace `svar'= subinstr(`svar',"%", "\%", .) in `colhead1'/`headBorder' + replace `svar'= subinstr(`svar',"#", "\#", .) in `colhead1'/`headBorder' + + /* replace <, >, {, }, | with $<$, $>$, \{, \}, and $|$ in stats rows */ + /* which can be used as brackets by outstat */ + replace `svar'= subinstr(`svar',"<", "$<$", .) in `strow1'/`bottomBorder' + replace `svar'= subinstr(`svar',">", "$>$", .) in `strow1'/`bottomBorder' + replace `svar'= subinstr(`svar',"{", "\{", .) in `strow1'/`bottomBorder' + replace `svar'= subinstr(`svar',"}", "\}", .) in `strow1'/`bottomBorder' + replace `svar'= subinstr(`svar',"|", "$|$", .) in `strow1'/`bottomBorder' + + replace `svar'= subinstr(`svar',"_", "\_", .) in `strow1'/`bottomBorder' + replace `svar'= subinstr(`svar',"%", "\$", .) in `strow1'/`bottomBorder' + replace `svar'= subinstr(`svar',"#", "\#", .) in `strow1'/`bottomBorder' + } + + if `pretty' { /* make title fonts large; notes & t stats small */ + local blarge "\begin{large}" + local elarge "\end{large}" + local bfnsize "\begin{footnotesize}" + local efnsize "\end{footnotesize}" + } + if `cborder' { + local vline "|" + } + gen str20 `pad0' = "" + gen str20 `padN' = "" + if `titleWide' { + replace `pad0' = "\multicolumn{`numcols'}{`vline'c`vline'}{`blarge'" in 1 / `titleWide' + replace `padN' = "`elarge'} \\\" in 1 / `titleWide' + } + if `bottomBorder' < `totrows' { + local noterow1 = `bottomBorder' + 1 + replace `pad0' = "\multicolumn{`numcols'}{`vline'c`vline'}{`bfnsize'" in `noterow1' / l + replace `padN' = "`efnsize'} \\\" in `noterow1' / l + } + + gen str3 `pad1' = " & " in `colhead1' / `bottomBorder' + if `numcols' > 2 { + gen str3 `pad2_n' = `pad1' + } + if `pretty' { /* make stats 2-N small font */ + local strow1 = `headBorder' + 1 + gen byte `st2_row' = 0 + replace `st2_row' = (trim(`varname') == "") in `strow1' / `bottomBorder' /* only stats 2+ */ + gen byte `last_st' = (`st2_row' & `varname'[_n+1] != "") /* last stats row */ + if !`cborder' { + replace `pad0' = "\vspace{4pt}" if `last_st' + } + replace `pad1' = `pad1' + "`bfnsize'" if `st2_row' + if `numcols' > 2 { + replace `pad2_n' = "`efnsize'" + `pad2_n' + "`bfnsize'" if `st2_row' + } + replace `padN' = "`efnsize'" if `st2_row' + } + + replace `padN' = `padN' + " \\\" in `colhead1' / `bottomBorder' + if `cborder' { + replace `padN' = `padN' + " \hline" + } + else { + if !`noborder' { + if `headBorder' { + if `titleWide' { + replace `padN' = `padN' + " \hline" in `titleWide' + } + replace `padN' = `padN' + " \hline" in `headBorder' + } + replace `padN' = `padN' + " \hline" in `bottomBorder' + } + } + + local vlist "`pad0' `varname' `pad1'" + tokenize `statvars' + local ncols_1 = `numcols' - 1 + local ncols_2 = `ncols_1' - 1 + forvalues v = 1/`ncols_2' { + local vlist "`vlist' ``v'' `pad2_n'" + } + local vlist "`vlist' ``ncols_1'' `padN'" + + local texheadfootrows = `nofrag' + `pretty' + 1 /* in both headers and footers */ + local texheadrow = 2 * `nofrag' + `nopagen' + `texheadfootrows' + local texfootrow = `texheadfootrows' + local newtotrows = `totrows' + `texheadrow' + `texfootrow' + if `newtotrows' > _N { + local oldN = _N + set obs `newtotrows' + } + else { + local oldN = 0 + } + gen long `order' = _n + `texheadrow' in 1 / `totrows' + local newtexhrow1 = `totrows' + 1 + local newtexhrowN = `totrows' + `texheadrow' + replace `order' = _n - `totrows' in `newtexhrow1' / `newtexhrowN' + sort `order' + + + * insert TeX header lines + local ccc : display _dup(`ncols_1') "`vline'c" + if `nofrag' { + replace `pad0' = "\documentclass[`fontsize'`landscape'`pagesize']{article}" in 1 + replace `pad0' = "\setlength{\pdfpagewidth}{`pwidth'} \setlength{\pdfpageheight}{`pheight'}" in 2 + replace `pad0' = "\begin{document}" in 3 + replace `pad0' = "\end{document}" in `newtotrows' + } + if `nopagen' { + local row = `texheadrow' - 1 - `pretty' + replace `pad0' = "\thispagestyle{empty}" in `row' + } + if `pretty' { + local row = `texheadrow' - 1 + replace `pad0' = "\begin{center}" in `row' + local row = `newtotrows' - `texfootrow' + 2 + replace `pad0' = "\end{center}" in `row' + } + local row = `texheadrow' + replace `pad0' = "\begin{tabular}{`vline'l`ccc'`vline'}" in `row' + if (!`titleWide' | `cborder') & !`noborder' { + replace `pad0' = `pad0' + " \hline" in `row' + } + local row = `newtotrows' - `texfootrow' + 1 + replace `pad0' = "\end{tabular}" in `row' + + outfile `vlist' `using' in 1/`newtotrows', `replace' runtogether + + * delete new rows created for TeX table, if any + if `oldN' { + keep in 1/`totrows' + } + } /* quietly */ + + versionSet + version `version' + +end /* end _texout */ + + +******************************************************************************************** + + +prog define out2rtf2, sortpreserve rclass + + versionSet + version `version' + +* based on version 0.9 4oct01 by john_gallup@alum.swarthmore.edu + syntax varlist using/, titleWide(int) headBorder(int) bottomBorder(int) /* + */ [wordFile(str) TOtrows(int 0) Landscape Fragment noPRetty /* + */ Fontsize(numlist max=1 >0) noBorder Cellborder /* + */ Appendpage PAgesize(str) /* + */ Lmargin(numlist max=1 >=0.5) Rmargin(numlist max=1 >=0.5) /* + */ Tmargin(numlist max=1 >=0.5) Bmargin(numlist max=1 >=0.5) /* + */ replace] + if `totrows'==0 { + local totrows = _N + } + local numcols : word count `varlist' + gettoken varname statvars : varlist + local fast 1 + + local colhead1 = `titleWide' + 1 + local strow1 = `headBorder' + 1 + + + *** replace if equation column present + local hack 0 + count if v1=="EQUATION" + if `r(N)'~=0 { + * use v2 instead + replace v1 = v2 in `=`bottomBorder'+1'/`totrows' + replace v2 = "" in `=`bottomBorder'+1'/`totrows' + + * change the string length + gen str5 myvar ="" + replace myvar =v2 + drop v2 + ren myvar v2 + order v1 v2 + + local hack 1 + } + + /* if file extension specified in `using', replace it with ".rtf" for output + local next_dot = index("`using'", ".") + if `next_dot' { + local using = substr("`using'",1,`=`next_dot'-1') + } + */ + + if `"`wordFile'"'=="" { + local endName "rtf" + } + else { + local endName "`wordFile'" + } + + local using `"using "`using'.`endName'""' + return local documentname `"`using'"' + + if "`fontsize'" == "" { + local fontsize "12" + } + + local lscp = ("`landscape'" != "") + local pretty = ("`pretty'" == "") + local cborder = ("`cellborder'" != "") + local noborder = ("`border'" != "") + local stdborder = (!`noborder' & !`cborder') + local nopagen = ("`pagenum'" != "") + local nofrag = ("`fragment'" == "") + + + if `cborder' & !`noborder' { + di in red "may not specify both cellborder and noborder options" + exit 198 + } + + * reformat "R-squared" and italicize "t" or "z" + if `pretty' { + quietly { + replace `varname'= subinword(`varname',"R-squared", "{\i R{\super 2}}", 1) in `strow1'/`bottomBorder' + replace `varname'= subinstr(`varname'," t stat", " {\i t} stat", 1) in `bottomBorder'/`totrows' + replace `varname'= subinstr(`varname'," z stat", " {\i z} stat", 1) in `bottomBorder'/`totrows' + } + } + + * font sizes in points*2 + local font2 = int(`fontsize'*2) + if `pretty' { + /* make title fonts large; notes & t stats small */ + local fslarge = "\fs" + string(int(`font2' * 1.2)) + local fsmed = "\fs" + string(`font2') + local fssmall = "\fs" + string(int(`font2' * 0.8)) + local sa0 "\sa0" /* put space after t stats rows */ + local gapsize = int(`fontsize'*0.4*20) /* 40% of point size converted to twips */ + local sa_gap "\sa`gapsize'" + } + else { + local fs0 = "\fs" + string(`font2') + } + + local onecolhead = (`headBorder' - `titleWide' == 1) + /* onecolhead = true if only one row of column headings */ + if `stdborder' { + if !`onecolhead' { + * runs here + *local trbrdrt "\clbrdrt\brdrs" /* table top is overlined */ + *local trbrdrt "\trbrdrt\brdrs" /* table top is overlined */ + + local clbrdr_uo "\clbrdrt\brdrs" /* cells are overlined */ + local clbrdr_ul "\clbrdrb\brdrs" /* cells are underlined */ + } + else { + /* cells are over- and underlined */ + local clbrdr_ul "\clbrdrt\brdrs\clbrdrb\brdrs" + + } + local trbrdrb "\trbrdrb\brdrs" + } + if `cborder' { + /* if !cborder then clbrdr is blank */ + local clbrdr "\clbrdrt\brdrs\clbrdrb\brdrs\clbrdrl\brdrs\clbrdrr\brdrs" + } + + * figure out max str widths to make cell boundaries + * cell width in twips = (max str width) * (pt size) * 12 + * (12 found by trial and error) + local twipconst = int(`fontsize' * 12 ) + tempvar newvarname + qui gen str80 `newvarname' = `varname' in `strow1'/`bottomBorder' + + local newvarlist "`newvarname' `statvars'" + qui compress `newvarlist' + local cellpos = 0 + foreach avar of local newvarlist { + local strwidth : type `avar' + local strwidth = subinstr("`strwidth'", "str", "", .) + local strwidth = `strwidth' + 1 /* add buffer */ + local cellpos = `cellpos' + `strwidth'*`twipconst' + + * hacking + if `hack'==1 & "`avar'"=="`newvarname'" & `cellpos'<1350 { + local cellpos=1350 + } + local clwidths "`clwidths'`clbrdr'\cellx`cellpos'" + + * put in underline at bottom of header in clwidth_ul + local clwidth_ul "`clwidth_ul'`clbrdr_ul'\cellx`cellpos'" + + * put in overline + local clwidth_ol "`clwidth_ol'`clbrdr_uo'\cellx`cellpos'" + } + + if `stdborder' { + if `onecolhead' { + local clwidth1 "`clwidth_ul'" + } + else { + local clwidth1 "`clwidths'" + local clwidth2 "`clwidth_ul'" + } + local clwidth3 "`clwidths'" + } + else{ + local clwidth1 "`clwidths'" + } + + * statistics row formatting + tempvar prettyfmt + qui gen str12 `prettyfmt' = "" /* empty unless `pretty' */ + if `pretty' { + * make stats 2-N small font + tempvar st2_row last_st + quietly { + gen byte `st2_row' = 0 + replace `st2_row' = (trim(`varname') == "") in `strow1' / `bottomBorder' /* only stats 2+ */ + gen byte `last_st' = (`st2_row' & `varname'[_n+1] != "") /* last stats row */ + replace `prettyfmt' = "`sa0'" in `strow1' / `bottomBorder' + replace `prettyfmt' = "`sa_gap'" if `last_st' in `strow1' / `bottomBorder' + replace `prettyfmt' = `prettyfmt' + "`fsmed'" if !`st2_row' in `strow1' / `bottomBorder' + replace `prettyfmt' = `prettyfmt' + "`fssmall'" if `st2_row' in `strow1' / `bottomBorder' + } + } + + * create macros with file write contents + + forvalues row = `colhead1'/`bottomBorder' { + local svarfmt`row' `"(`prettyfmt'[`row']) "\ql " (`varname'[`row']) "\cell""' + foreach avar of local statvars { + local svarfmt`row' `"`svarfmt`row''"\qc " (`avar'[`row']) "\cell""' + } + local svarfmt`row' `"`svarfmt`row''"\row" _n"' + } + + * write file + tempname rtfile + cap file open `rtfile' `using', write `replace' + if _rc==608 { + noi di in red `"file `using' is read-only; cannot be modified or erased"' + noi di in red `"The file needs to be closed if being used by another software such as Word."' + exit 608 + } + + file write `rtfile' "{\rtf1`fs0'" _n /* change if not roman: \deff0{\fonttbl{\f0\froman}} */ + + * title + if `titleWide' { + file write `rtfile' "\pard\qc`fslarge'" _n + forvalues row = 1/`titleWide' { + file write `rtfile' (`varname'[`row']) "\par" _n + } + } + + * The top line + file write `rtfile' "\trowd\trgaph75\trleft-75\intbl\trqc`fsmed'`trbrdrt'`clwidth_ol'" _n + *file write `rtfile' "\trowd\trgaph75\trleft-75\intbl\trqc`fsmed'`trbrdrt'`clwidth1'" _n + + local headBorder_1 = `headBorder' - 1 + * write header rows 1 to N-1 + + forvalues row = `colhead1'/`headBorder_1' { + file write `rtfile' `svarfmt`row'' + * turn off the overlining the first time it's run + file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`clwidth3'" _n + } + file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`clwidth2'" _n + + * write last header row + file write `rtfile' `svarfmt`headBorder'' + + local bottomBorder_1 = `bottomBorder' - 1 + /* turn off cell underlining */ + file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`clwidth3'" _n + + * table contents + forvalues row = `strow1'/`bottomBorder_1' { + file write `rtfile' `svarfmt`row'' + } + + if `stdborder' { + /* write last row */ + *file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`trbrdrb'`clwidths'" _n + * make it underline + file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`trbrdrb'`clwidth_ul'" _n + file write `rtfile' `svarfmt`bottomBorder'' + } + + /* write notes rows */ + if `bottomBorder' < `totrows' { + local noterow1 = `bottomBorder' + 1 + file write `rtfile' "\pard\qc`fssmall'" _n + forvalues row = `noterow1'/`totrows' { + file write `rtfile' (`varname'[`row']) "\par" _n + } + } + + * write closing curly bracket + file write `rtfile' "}" +end /* end out2rtf2 */ + + + +******************************************************************************************** + + +prog define _xmlout + versionSet + version `version' + +* 02 08 2011 title/notes no longer gets truncated in excel display with outreg2 option +* wider first column +* 03 30 font Calibri +* fontsize 10 +* colwidth + +* emulates the output produced by xmlsave: +* xmlsave myfile, replace doctype(excel) legible + +syntax using/ [, excelFile(str) LEGible noNAMes titleWide(integer 0) /* + */ headBorder(integer 10) bottomBorder(integer 10) outreg2 labeloption(str) insert excel1(str)] + +if `"`excel1'"'~="" { + * excel specific options + _excel_parse, `excel1' +} + + +* the c_locals returned: +if "`excelfont'"=="" { + local excelfont Calibri +} +if "`excelfontsize'"=="" { + local excelfontsize 10 +} +* leave excelcolwidth alone +if "`excelcellnumeric'"=="numeric" { + local defaultcellstyle Number +} +else { + local defaultcellstyle String +} + + +* assumes all columns are string; if numbers, then the format needs to be checked + +*local legible legible + +if "`legible'"=="legible" { + local _n "_n" +} + +tempname source saving + +if `"`excelFile'"'=="" { + local endName "xml" +} +else { + local endName "`excelFile'" +} + +local save `"`using'.`endName'"' + +*file open `source' using `"`using'"', read +cap file open `saving' using `"`save'"', write text replace + +if _rc==608 { + noi di in red `"file `save' is read-only; cannot be modified or erased"' + noi di in red `"The file needs to be closed if being used by another software such as Excel."' + exit 608 +} + +*file write `saving' `"`macval(line)'"' +file write `saving' `""' `_n' +file write `saving' `""' `_n' +file write `saving' `""' `_n' +file write `saving' `""' `_n' +file write `saving' `""' `_n' +file write `saving' `""' `_n' +file write `saving' `""' `_n' +file write `saving' `""' `_n' +file write `saving' `""' `_n' +file write `saving' `""' `_n' +file write `saving' `""' `_n' +file write `saving' `""' `_n' +file write `saving' `"False"' `_n' +file write `saving' `"False"' `_n' +file write `saving' `""' `_n' +file write `saving' `""' `_n' + +* styles +file write `saving' `""' `_n' + +* bold & (center) +local temp=`excelfontsize'+2 /* extra size for title */ +file write `saving' `""' `_n' + +* top border & center +file write `saving' `""' `_n' + +* http://www.devguru.com/technologies/html/quickref/color_chart.html +* http://www.w3schools.com/HTML/html_colornames.asp +* http://msdn.microsoft.com/en-us/library/aa140066(v=office.10).aspx + +* main body (no border) & center +file write `saving' `""' `_n' + +* bottom border & center +file write `saving' `""' `_n' + +* goldfish (no border, left-justified) +file write `saving' `""' `_n' + +* top border +file write `saving' `""' `_n' + +* main body (no border) +file write `saving' `""' `_n' + +* bottom border & center +file write `saving' `""' `_n' + +file write `saving' `""' `_n' +file write `saving' `""' `_n' +file write `saving' `""' `_n' +file write `saving' `""' `_n' + +* set up file size +qui describe, short + +local N=_N +local tableN `N' + +if "`names'"~="nonames" { + * add one if variable names are to be inserted + local tableN=`N'+1 +} +else { + * add one for the look + local tableN=`N'+1 +} + +file write `saving' `""' `_n' + +*** column length (assume at least 2 columns) +local temp1 58 +local temp2 58 + +if `"`outreg2'"'=="outreg2" & `version'>=10 { + local column1 v1 + local column2 v2 + if `version'>=11 { + qui ds_util + local column1: word 1 of `r(varlist)' + local column2: word 2 of `r(varlist)' + } + + * note getting the correct size by excluding the notes and titles + tempvar getsize + gen `getsize'= `column1' in `headBorder'/`bottomBorder' + + *local tempformat1: format `column1' + local tempformat1: format `getsize' + cap drop `getsize' + + local tempsize=trim(substr("`tempformat1'",2,length(`"`tempformat1'"')-2)) + if `tempsize'>10 { + local temp1=int(`tempsize'*6) + } + else { + local temp1 100 + } + + * usually not necessary since variable names are not this long + if `tempsize'>40 { + local temp1=`temp1'-int(`tempsize'*.2) + } + if `tempsize'>60 { + local temp1 220 + } + + if "`insert'"~="" { + local tempformat2: format `column2' + local tempsize=trim(substr("`tempformat2'",2,length(`"`tempformat2'"')-2)) + if `tempsize'>10 { + local temp2=int(`tempsize'*3.6) + } + else { + local temp2 58 + } + if `tempsize'>40 { + local temp2=`temp2'-int(`tempsize'*.2) + } + if `tempsize'>60 { + local temp2 220 + } + } + else { + local temp2 58 + } +} + +dsCol + + +if "`excelcolwidth'"=="" { + forval num=1/`ck' { + local temp : word `num' of `temp1' `temp2' 58 + if "`temp'"~="" { + file write `saving' `""' `_n' + local lasttemp `temp' + } + else { + file write `saving' `""' `_n' + } + } +} +else { + * user specified values + forval num=1/`ck' { + local temp : word `num' of `excelcolwidth' + if "`temp'"~="" { + file write `saving' `""' `_n' + local lasttemp `temp' + } + else { + file write `saving' `""' `_n' + } + } +} + + +* should be tostring and format here if dealing with numbers + + ds8 + + * write the variable names at the top or empty row + if "`names'"~="nonames" { + file write `saving' `""' `_n' + foreach var in `dsVarlist' { + if "`Version7'"~="" { + file write `saving' `"`macval(var)'"' _n + } + else { + local celltype String + capture confirm number `macval(var)' + if _rc==0 { + local celltype `defaultcellstyle' + } + file write `saving' `"`macval(var)'"' `_n' + } + } + file write `saving' `""' `_n' + } + else { + file write `saving' `""' `_n' + file write `saving' `""' `_n' + } + + +* title +local count `titleWide' +local total 1 +while `count'~=0 { + *xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`total') n(`N') style(`" ss:StyleID="s1""') style1(`" ss:StyleID="s1""') + xmlstack, saving(`saving') dsVarlist(v1) num(`total') n(`N') style(`" ss:StyleID="s1""') style1(`" ss:StyleID="s1""') defaultcellstyle(`defaultcellstyle') + local count=`count'-1 + local total=`total'+1 +} + +* top border +local count=`total' +forval num=`count'/`count' { + xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s21""') style1(`" ss:StyleID="s31""') defaultcellstyle(`defaultcellstyle') + local total=`total'+1 +} + +* ctitle +local count=`total' +forval num=`count'/`headBorder' { + xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s22""') style1(`" ss:StyleID="s32""') defaultcellstyle(`defaultcellstyle') + local total=`total'+1 +} + +* top border (closes ctitle) +local count=`total' +forval num=`count'/`count' { + xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s21""') style1(`" ss:StyleID="s31""') defaultcellstyle(`defaultcellstyle') + local total=`total'+1 +} + +* body +local count=`total' +forval num=`count'/`=`bottomBorder'-1' { + xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s22""') style1(`" ss:StyleID="s32""') defaultcellstyle(`defaultcellstyle') + local total=`total'+1 +} + +* bottom border (closes body) +local count=`total' +forval num=`count'/`count' { + xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s23""') style1(`" ss:StyleID="s33""') defaultcellstyle(`defaultcellstyle') + local total=`total'+1 +} + +* goldfish +if `N'>`total' { + local count=`total' + forval num=`count'/`N' { + *xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s24""') style1(`" ss:StyleID="s24""') + xmlstack, saving(`saving') dsVarlist(v1) num(`num') n(`N') style(`" ss:StyleID="s24""') style1(`" ss:StyleID="s24""') defaultcellstyle(`defaultcellstyle') + local total=`total'+1 + } +} + +/* +forval num=1/`N' { + + file write `saving' `""' `_n' + + *foreach var in `=r(varlist)' { + foreach var in `dsVarlist' { + + *local stuff `=`var'[`num']' + local stuff=`var' in `num' + + local stuff : subinstr local stuff "<" "<", all + local stuff : subinstr local stuff ">" ">", all + + * the main body + if "`Version7'"~="" { + file write `saving' `"`macval(stuff)'"' `_n' + } + else { + local celltype String + *local tempstuff: subinstr local stuff "," "" + capture confirm number `stuff' + if _rc==0 { + local celltype `defaultcellstyle' + } + file write `saving' `"`stuff'"' `_n' + } + } + file write `saving' `""' `_n' +} +*/ + +file write `saving' `"
      "' `_n' +file write `saving' `""' `_n' +file write `saving' `"False"' `_n' +file write `saving' `"False"' `_n' +file write `saving' `""' `_n' +file write `saving' `"
      "' `_n' +file write `saving' `"
      "' `_n' + +* close out with the last line +*file write `saving' _n +*file close `source' + +file close `saving' + +end /* _xmlout */ + + +******************************************************************************************** + + +prog define xmlstack + +syntax, saving(str) dsVarlist(str) num(numlist) n(numlist) style(str) style1(str) defaultcellstyle(str) + +local N `n' + +*forval num=1/`N' { + + file write `saving' `""' `_n' + + local count 0 + + *foreach var in `=r(varlist)' { + foreach var in `dsVarlist' { + + if `count'==0 { + local STYLE `"`style1'"' + } + else { + local STYLE `"`style'"' + } + + *local stuff `=`var'[`num']' + local stuff=`var' in `num' + + local stuff : subinstr local stuff "<" "<", all + local stuff : subinstr local stuff ">" ">", all + + * the main body + if "`Version7'"~="" { + file write `saving' `"`macval(stuff)'"' `_n' + } + else { + local celltype String + *local tempstuff: subinstr local stuff "," "" + capture confirm number `stuff' + if _rc==0 { + local celltype `defaultcellstyle' + } + file write `saving' `"`stuff'"' `_n' + } + + local count=`count'+1 + } + file write `saving' `""' `_n' +*} + +end /* xmlstack */ + + +******************************************************************************************** + + +prog define dsCol + * gets you the number of columns like cret does for version 8 + * alternatively use -describe, short- and r(k) + + version 7.0 + cap local ck `c(k)' + + if "`ck'"=="" { + local ck 0 + foreach var of varlist _all { + local ck=`ck'+1 + } + } + c_local ck `ck' +end + + +******************************************************************************************** + + +prog define ds8 + * get you the list of variable like -ds- does for version 8 + version 7.0 + qui ds + if "`r(varlist)'"=="" { + local dsVarlist "" + foreach var of varlist _all { + local dsVarlist "`dsVarlist' `var'" + } + c_local dsVarlist `dsVarlist' + } + else { + c_local dsVarlist `r(varlist)' + } +end + + +******************************************************************************************** + + +prog define _tab3, eclass + * get you tabulations + versionSet + version `version' + +syntax varlist /* + */ [if] [in] [using] [, /* + */ APpend REPLACE esample drop(str) /* + */ DISplay log regress] + + +qui { + +if "`drop'"~="" { + ds `drop' + local drop `r(varlist)' + *cap local varlist: list varlist - drop + macroMinus `varlist', names(varlist) subtract(`drop') +} + +* checking the height +local varCount: word count `varlist' +if `=`varCount'*100'>=`=_N' { + preserve + set obs `=`varCount'*100+2' +} + + + +if `=_by()'==1 { + * eliminate -by- variables from varlist + local drop `_byvars' + *cap local varlist: list varlist - drop + macroMinus `varlist', names(varlist) subtract(`drop') +} + +*marksample touse +*marksample alluse, noby + +tempvar touse alluse + +mark `touse' `if' `in' [`weight'`exp'] +mark `alluse' `if' `in' [`weight'`exp'], noby + +** restricting to e(sample) +if "`noesample'"=="noesample" { + replace `touse'=0 if e(sample)~=1 + replace `alluse'=0 if e(sample)~=1 +} + +tempvar stacker name label frequency percent cumulative total +tempname val_mat freq_mat ebmat eVmat + +gen `stacker'=. +gen str5 `name'="" +gen `label'=. +gen `frequency'=. +gen `percent'=. +gen `cumulative'=. +gen `total'=. + +local varname "" + +noi tabulate `varlist' [`weight'`exp'] if `touse', matrow(`val_mat') matcell(`freq_mat') + +if r(N)~=0 { + noi tabulate `varlist' [`weight'`exp'] if `touse', matrow(`val_mat') matcell(`freq_mat') + + local stuff `r(r)' + forval row=1/`stuff' { + *replace `name' = "r`row'" in `row' + + local content = `val_mat'[`row',1] + replace `label' =`content' in `row' + + replace `name' = string(`val_mat'[`row',1]) in `row' + local varname "`varname' `content'" + + local content = `freq_mat'[`row',1] + replace `frequency' =`content' in `row' + } + replace `total'=sum(`frequency') + qui summarize `varlist', meanonly + if _rc==101 { + noi di in red "pweight not allowed" + exit 101 + } + replace `percent'=100*`frequency'/`r(N)' + replace `cumulative'=sum(`percent') if `label'~=. +} + +*mat list `val_mat' +*mat list `freq_mat' + + local colVarname "" + foreach col in obs mean sd min max { + foreach var in `varname' { + local colVarname "`colVarname' `col':`var'" + } + } + + count if `name'~="" + + replace `stacker'=`label' + forval num=1/`=r(N)' { + replace `stacker'=`frequency'[`num'] in `=r(N)+`num'' + replace `stacker'=`percent'[`num'] in `=r(N)*2+`num'' + replace `stacker'=`cumulative'[`num'] in `=r(N)*3+`num'' + } + + if "`display'"=="display" { + noi tabulate `varlist' [`weight'`exp'] if `touse' +} +if `=_by()'==1 { + * generate column heading when -by- specified + local cc=1 + local ctitleList "" + + tokenize `_byvars' + while "``cc''"~="" { + + * should there be `touse' here? + qui summarize ``cc'' if `_byindex' == `=_byindex()' & `touse' + if _rc==101 { + noi di in red "pweight not allowed" + exit 101 + } + if r(N)<. { + local actual`cc' =r(mean) + } + else { + local actual`cc' =. + } + + * place ctitle in there + local ctitleList "`ctitleList' ``cc'' `actual`cc'' " + local cc=`cc'+1 + } + + * replace last if -by- specified + if `=_byindex()'~=1 & "`replace'"=="replace" { + local replace "" + } +} + +count if `stacker'~=. + +if r(N)>0 { + * recycling name: they exist in variables and matrix + + if "`log'"=="log" { + + + + mkmat `stacker' in 1/`=r(N)', matrix(`ebmat') + mkmat `empty' in 1/`=r(N)', matrix(`eVmat') + + mat rownames `ebmat'=`colVarname' + mat rownames `eVmat'=`colVarname' + + mat colnames `ebmat'=y1 + mat colnames `eVmat'=y1 + + mat `ebmat'=`ebmat'' + mat `eVmat'=(`eVmat'*`eVmat'') + } + else { + count if `name'~="" + + * `=r(N)' gets wiped out in version 7 + local rN=r(N) + + mkmat `frequency' in 1/`rN', matrix(`ebmat') + mkmat `percent' in 1/`rN', matrix(`eVmat') + + mat rownames `ebmat'=`varname' + mat rownames `eVmat'=`varname' + + mat colnames `ebmat'=y1 + mat colnames `eVmat'=y1 + + mat `ebmat'=`ebmat'' + mat `eVmat'=(`eVmat'*`eVmat'') + } + + if "`replace'"=="replace" { + if "`Version7'"=="" { + est mat freq `ebmat' + est mat percent `eVmat' + + count if `touse'==1 + est scalar total = `total'[_N] + } + else { + eret clear + *eret mat b=`ebmat' + *eret mat V=`eVmat' + + eret post b V + if `"`if'"'~="" { + eret local depvar `"`if'"' + } + else { + eret local depvar `"Tabulate"' + } + eret local cmd "tab3" + + count if `touse'==1 + eret scalar total = `total'[_N] + } + } + else { + if "`Version7'"=="" { + est mat freq `ebmat' + est mat percent `eVmat' + + count if `touse'==1 + est scalar total = `total'[_N] + } + else { + eret mat freq=`ebmat' + eret mat percent=`eVmat' + + count if `touse'==1 + eret scalar total = `total'[_N] + } + } +} +else { + * no observation + if "`Version7'"=="" { + mat def `ebmat'=(0) + mat def `eVmat'=(0) + mat colnames `ebmat'="MISSING" + mat colnames `eVmat'="MISSING" + est mat freq `ebmat' + est mat percent `eVmat' + est scalar total=0 + } + else { + mat def `ebmat'=(0) + mat def `eVmat'=(0) + mat colnames `ebmat'="MISSING" + mat colnames `eVmat'="MISSING" + eret mat freq=`ebmat' + eret mat percent=`eVmat' + eret scalar total=0 + } +} +} /* qui */ +noi di + +end /* _tab3 */ + + +******************************************************************************************** + + +* Jan2009 by roywada@hotmail.com +* 24mar2010 content( ) is no longer required + +prog define optionSyntax + * cleans the options within parenthetical options of the form -option( )- + * clean c_locals of those content names as if they were the options + + * valid: allowed contents in parenthesis + * name: name of the option + * content: actual user input into the option + * passthru: if it was passtru rather than string + * nameShow: mesaage to user when invalid + + syntax, valid(str) name(str) nameShow(str) [content(str) PASSthru NORETURN] + + if "`content'"=="" { + local content + } + + * take comma out + if "`passthru'"=="passthru" { + local content : subinstr local content "`name'(" " ", all + local content : subinstr local content ")" " ", all + local content : subinstr local content "," " ", all + } + else { + * just string + local content : subinstr local content "," " ", all + } + + local thisMany : word count `content' + local num=1 + local optionList "" + + while `num'<=`thisMany' { + local option`num' : word `num' of `content' + + * it must be one of the list + local test 0 + foreach var in `valid' { + if "`var'"=="`option`num''" & `test'==0 { + local test 1 + } + } + + if `test'==0 { + noi di in white "`option`num''" in red " is not a valid option or matrix for {opt `nameShow'}" + exit 198 + } + local optionList "`optionList' `option`num''" + local num=`num'+1 + } + + if "`noreturn'"~="noreturn" { + foreach var in `valid' { + * clears the c_locals + c_local `var' "" + } + + foreach var in `optionList' { + * inserts the c_locals + c_local `var' "`var'" + } + } + + c_local optionList `"`optionList'"' + c_local optionCount : word count `optionList' + +end + + +******************************************************************************************** + + +* sum2 1.0.0 Jan2009 by roywada@hotmail.com +* sum2 1.0.1 21oct2009 : gets the entire varlist if no e(b) exists +* raw option +* sum2 1.0.2 28apr2014 : factor variables +* sum2 1.0.3 20may2014 : summarize baselevels + +prog define _sum2, eclass +*prog define sum2, eclass by(recall) sortpreserve + versionSet + version `version' + +if `a_version'>=11 { + local fv fv +} + +syntax [varlist(ts `fv')] [using] [if] [in] [pweight fweight aweight iweight] [, /* + */ APpend REPLACE esample drop(str) /* + */ noDISplay log REGress DETail NODEPendent raw] + +fvtsunab `varlist' +local varlist `fvtsunab_list' + +local varlist `varlist' +local _0 `"`0'"' + + +qui { + +if "`log'"=="log" & "`detail'"=="detail" { + noi di in red "cannot choose both {opt det:ail} and {opt log}" + exit 198 +} + +if "`log'"~="log" & "`detail'"~="detail" { + local regress "regress" +} + + +/* not needed for _sum2, which exists within outreg2 + +if "`regress'"=="regress" { + * check for prior sum2, replace + foreach var in eqlist { + if "`e(cmd)'"=="sum2, log" { + if "`Version7"~="" { + *eret list + } + else { + *est list + } + noi di in red "no regression detected; already replaced with summary" + exit 198 + } + } + + *** replace varlist with e(b) names + regList `_0' + + local varlist `r(varlist)' + local eqlist `r(eqlist)' + + local varnum `r(varnum)' + local eqcount `r(eqcount)' +} +else { + local varnum: word count `varlist' + local eqcount 0 + +} + +local varlist `"`eqlist' `varlist'"' +*/ + + +* take tempvars out +tsunab stuff : __00* + +macroMinus `varlist', names(varlist) subtract(`stuff') +local varnum: word count `varlist' + +* extender +local N=_N +version 7: describe, short +if `r(k)'>`N'+1 & `r(k)'<. { + set obs `r(k)' +} + + +if "`drop'"~="" { + ds `drop' + local drop `r(varlist)' + *cap local varlist: list varlist - drop + macroMinus `varlist', names(varlist) subtract(`drop') +} + + + +if `=_by()'==1 { + * eliminate -by- variables from varlist + local drop `_byvars' + *cap local varlist: list varlist - drop + macroMinus `varlist', names(varlist) subtract(`drop') +} + + +*marksample touse +*marksample alluse, noby +*tempvar touse alluse + +tempvar touse +*mark `alluse' `if' `in', noby + +cap confirm matrix e(b) +if _rc | "`raw'"=="raw" { + mark `touse' `if' `in' [`weight'`exp'] +} +else { + * always esample restricted + if `"`if'"'~="" { + mark `touse' `if' & e(sample) `in' [`weight'`exp'] + } + else { + mark `touse' if e(sample) `in' [`weight'`exp'] + } +} + +count if `touse'==1 +if `r(N)'==0 { + noi di in red "no observation left; check your if/in conditionals" + exit 198 +} + +*** must take out string variables prior to marking them +local stringList "" +local noobsList "" +local anyObs 0 + +foreach var in `varlist' { + local var0 `var' + if `a_version'>=11 { + fvts_label `var' + if `"`basesuffix'"'=="b" { + local var `basevalue'.`baseonly' + } + } + noi summarize `var' if `touse' [`weight'`exp'], meanonly + + if _rc==101 { + noi di in red "pweight not allowed" + exit 101 + } + if r(N)==0 { + local minus "`var'" + *cap local varlist: list varlist - minus + macroMinus `varlist', names(varlist) subtract(`minus') + + if "`Version7'"=="" { + local varlist=subinstr("`varlist'","`minus'","",.) + } + + local type: type `var' + local check= substr("`type'",1,3) + + * display later + if "`check'"=="str" { + *noi di in yellow "`var' is string, not included" + local stringList "`stringList' `var'" + } + else { + *noi di in yellow "`var' has no observation, not included" + local noobsList "`noobsList' `var'" + } + } + else { + local anyObs 1 + } + local varnum: word count `varlist' +} + +tempvar name N mean sd min max zeros +tempname ebmat eVmat +tempvar sum_w Var skewness kurtosis sum p1 p5 p10 p25 p50 p75 p90 p95 p99 + +local varname "" + + + +foreach var in `varlist' { + local var0 `var' + if `a_version'>=11 { + fvts_label `var' + if `"`basesuffix'"'=="b" { + local var `basevalue'.`baseonly' + } + } + qui summarize `var' if `touse' [`weight'`exp'], `detail' + if _rc==101 { + noi di in red "pweight not allowed" + exit 101 + } + if r(N)~=0 { + * put in the non-cleaned original name in var0 + local varname "`varname' `var0'" + local row=`row'+1 + + foreach var in mean sd N min max { + mat ``var'' = nullmat(``var'') \ r(`var') + } + mat `zeros' = nullmat(`zeros') \ 0 + } + if "`detail'"=="detail" & r(N)~=0 { + foreach var in sum_w Var skewness kurtosis sum p1 p5 p10 p25 p50 p75 p90 p95 p99 { + mat ``var'' = nullmat(``var'') \ r(`var') + } + } +} + +* rename them +if "`regress'"=="regress" { + foreach var in mean sd N min max { + mat rownames ``var''=`varname' + mat colnames ``var''=`var' + } +} +if "`log'"=="log" { + foreach var in N mean sd min max { + mat rownames ``var''=`varname' + mat roweq ``var''=`var' + mat colnames ``var''=`var' + } +} +if "`detail'"=="detail" { + foreach var in N mean sd min max sum_w Var skewness kurtosis sum p1 p5 p10 p25 p50 p75 p90 p95 p99 { + mat rownames ``var''=`varname' + mat roweq ``var''=`var' + mat colnames ``var''=`var' + } +} + +if "`display'"~="nodisplay" & `anyObs'==1 { + noi summarize `varlist' if `touse' [`weight'`exp'], `detail' +} + +if `=_by()'==1 { + * generate column heading when -by- specified + local cc=1 + local ctitleList "" + + tokenize `_byvars' + while "``cc''"~="" { + + * should there be `touse' here? + qui summarize ``cc'' if `_byindex' == `=_byindex()' & `touse' + if r(N)<. { + local actual`cc' =r(mean) + } + else { + local actual`cc' =. + } + + * place ctitle in there + local ctitleList "`ctitleList' ``cc'' `actual`cc'' " + local cc=`cc'+1 + } + + * replace last if -by- specified + if `=_byindex()'~=1 & "`replace'"=="replace" { + local replace "" + } +} + + * exporting temp matrices + if "`regress'"=="regress" { + mat `ebmat' = `mean' + mat `eVmat' = `sd' + + mat `ebmat'=`ebmat'' + mat `eVmat'=(`eVmat'*`eVmat'') + } + else if "`log'"=="log" { + foreach var in N mean sd min max { + mat `ebmat' = nullmat(`ebmat') \ ``var'' + mat `eVmat' = nullmat(`eVmat') \ `zeros' + } + + * rename eVmat after ebmat + local colnames: colnames `ebmat' + local roweq: roweq `ebmat' + local rownames: rownames `ebmat' + + mat colnames `eVmat'=`colnames' + mat roweq `eVmat'=`roweq' + mat rownames `eVmat'=`rownames' + + mat `ebmat'=`ebmat'' + mat `eVmat'=(`eVmat'*`eVmat'') + } + else if "`detail'"=="detail" { + foreach var in N mean sd min max sum_w Var skewness kurtosis sum p1 p5 p10 p25 p50 p75 p90 p95 p99 { + mat `ebmat' = nullmat(`ebmat') \ ``var'' + mat `eVmat' = nullmat(`eVmat') \ `zeros' + } + + * rename eVmat after ebmat + local colnames: colnames `ebmat' + local roweq: roweq `ebmat' + local rownames: rownames `ebmat' + + mat colnames `eVmat'=`colnames' + mat roweq `eVmat'=`roweq' + mat rownames `eVmat'=`rownames' + + mat `ebmat'=`ebmat'' + mat `eVmat'=(`eVmat'*`eVmat'') + } + + if "`replace'"=="replace" { + if "`Version7'"=="" { + est mat mean `ebmat' + est mat Var `eVmat' + + count if `touse'==1 + est scalar N = r(N) + } + else { + eret clear + mat b=`ebmat' + mat V=`eVmat' + mat list b + eret post b V + if `"`if'"'~="" { + gettoken first second: if, parse(" ") + eret local depvar `"`second'"' + } + else { + eret local depvar `"Summary"' + } + eret local cmd "sum2, log" + + if "`regress'"=="regress" { + count if `touse'==1 + eret scalar N = r(N) + } + } + } + else { + if "`Version7'"=="" { + est mat mean `ebmat' + est mat Var `eVmat' + + if "`regress'"=="regress" { + count if `touse'==1 + est scalar sum_N = r(N) + } + } + else { + eret mat mean=`ebmat' + eret mat Var=`eVmat' + + if "`regress'"=="regress" { + count if `touse'==1 + eret scalar sum_N = r(N) + } + } + } + +/* +else { + if `=_by()'==1 { + noi di in yellow "no observations when variable = something" + } + else { + * `=_by()'~=1, not running by( ) + *noi di in red "no observations" + error 2000 + } +} +*/ + +noi di +if `"`stringList'"'~="" { + noi di in yellow "Following variable is string, not included: " + foreach var in `stringList' { + noi di in yellow "`var' " _c + } + di +} +if `"`noobsList'"'~="" { + noi di in yellow "Following variable has no observation, not included: " + foreach var in `noobsList' { + noi di in yellow "`var' " _c + } + di +} + +} /* qui */ +end /* sum2 */ + + +******************************************************************************************** + + +* regList Jan2009 by roywada@hotmail.com +* regList Jun2009 by roywada@hotmail.com verion 7 added +* 28mar2010 [pw aw fw iw] added but ignored + +prog define regList, rclass +* get the name of equations and variables used in e(b) + versionSet + version `version' + + * [if] [in] ignored: + syntax [varlist(default=none)] [if] [in] [pw aw fw iw] [, NODEPendent *] + + * separate potential equation names from variable names + tempname b b_transpose + mat `b'=e(b) + mat `b_transpose' = `b'' + local varnames : rownames(`b_transpose') + +if "`nodependent'"~="nodependent" { + * indep variables, but the equations names are actually dep variables + * plus the dep var + local eqlist "`e(depvar)' `eqlist'" + macroUnique `eqlist', names(eqlist) number(eqcount) + +/* not reliable because not always a dependent variable, i.e. sqreg slaps on q10, q20, etc. + * take off numbers from the front (reg3 sometimes slaps them on) + foreach v in `eqlist' { + local first = substr(`"`v'"',1,1) + local test + cap local test = `first' * 1 + if "`test'"=="`first'" { + * a number + local wanted = substr(`"`v'"',2,.) + local collect "`collect' `wanted'" + } + else { + local collect "`collect' `v'" + } + } + local eqlist `collect' + macroUnique `eqlist', names(eqlist) number(eqcount) + + * repeat + foreach v in `eqlist' { + local first = substr(`"`v'"',1,1) + local test + cap local test = `first' * 1 + if "`test'"=="`first'" { + * a number + local wanted = substr(`"`v'"',2,.) + local collect "`collect' `wanted'" + } + else { + local collect "`collect' `v'" + } + } + local eqlist `collect' +*/ + + macroUnique `eqlist', names(eqlist) number(eqcount) +} + macroUnique `eqlist', names(eqlist) number(eqcount) + macroMinus `varnames', names(varlist) number(varnum) subtract(_cons) + macroUnique `varlist', names(varlist) number(varnum) + + return local eqlist `eqlist' + return local eqcount `eqcount' + return local varlist `varlist' + return local varnum `varnum' + +end /* regList */ + + +******************************************************************************************** + + +* macroUnique Jan2009 by roywada@hotmail.com +* macroUnique Jun2009 by roywada@hotmail.com version 7 added +* 2014 07 02 version 13 update + +prog define macroUnique + +* gets you unique macro names & number of them (both c_locals) +* could be empty + +syntax [anything], names(str) [number(str)] + +if `c(stata_version)'<10.1 { + version 7.0 + local collect "" + * just holding the place until the loop + local temp1: word 1 of `anything' + local temp2: word 2 of `anything' + + local total: word count `anything' + local cc 1 + local same "" + while "`temp1'"~="" { + local temp1: word `cc' of `anything' + local same "" + *di "try `temp1' at `cc'" + local kk=`cc'+1 + local temp2: word `kk' of `anything' + while "`temp2'"~="" & "`same'"=="" { + if "`temp1'"=="`temp2'" { + *di "`cc' is same as `kk'" + local same same + } + else { + local kk=`kk'+1 + } + local temp2: word `kk' of `anything' + } + if "`temp1'"~="" & "`temp2'"=="" & "`same'"~="same" { + *di "accept `temp1' at `cc' before " _c + local collect "`collect' `temp1'" + } + *di "reject `temp1' at `cc'" + local cc=`cc'+1 + } + + c_local `names' `collect' + if "`number'"~="" { + c_local `number' : word count `collect' + } +} +else { + c_local `names' : list uniq anything + if "`number'"~="" { + c_local `number' : word count `:list uniq anything' + } +} +end + + +******************************************************************************************** + + +* macroMinus Jan2009 by roywada@hotmail.com +* macroMinus Jun2009 by roywada@hotmail.com version 7 added +prog define macroMinus + +version 7.0 + +* gets you macro names subtracted & number of them (both c_locals) +* could be empty + +syntax [anything], names(str) [number(str asis) subtract(str)] + local collect "" + * just holding until the loop + local temp1: word 1 of `anything' + local temp2: word 1 of `subtract' + + local total: word count `anything' + local cc 1 + local same "" + while "`temp1'"~="" { + local temp1: word `cc' of `anything' + local same "" + *di "try `temp1' at `cc'" + local kk=1 + local temp2: word `kk' of `subtract' + while "`temp2'"~="" & "`same'"=="" { + if "`temp1'"=="`temp2'" { + *di "`temp1' is same as `temp2'" + local same same + } + else { + local kk=`kk'+1 + } + local temp2: word `kk' of `subtract' + } + if "`temp1'"~="" & "`temp2'"=="" & "`same'"~="same" { + *di "accept `temp1' at `cc' before " _c + local collect "`collect' `temp1'" + } + *di "reject `temp1' at `cc'" + local cc=`cc'+1 + } + + c_local `names' `collect' + if "`number'"~="" { + c_local `number' : word count `collect' + } + +end + + +******************************************************************************************** + + +* Jun2009 version 7 added +* 23mar2010 labelA(insert upper lower proper) + +prog define cleanFile +* split possible eqnames from varnames +* gets labels +* get titles +* c_locals titleWide headRow bottomRow + + versionSet + version `version' + +syntax using [, noQUOte comma title(str) label labelOption(str) /* + */ titlefile(str) NOTITLE slow(numlist) label_file(str)] + + * get c_locals returned from labelOption + optionSyntax, valid(insert upper lower proper) name(labelA) nameShow(label( )) content(`labelOption') + + *** get the label names + if "`label'"=="label" | "`insert'"=="insert" { + + tempfile labelfile + + /* old label file generationd + * extender making sure the obs > columns + local N=_N + describe, short + if `r(k)'>`N'+1 & `r(k)'<. { + set obs `r(k)' + } + + gen str8 var1="" + gen str8 labels="" + unab varlist_all : * + cap unab subtract: _est_* + *cap local varlist_only : list varlist_all - subtract + macroMinus `varlist_all', names(varlist_only) subtract(`subtract') + local count=1 + foreach var in `varlist_only' { + local lab "" + cap local lab: var label `var' + local lab=trim("`lab'") + if "`lab'"~="" { + replace var1="`var'" in `count' + replace labels="`lab'" in `count' + local count=`count'+1 + } + } + keep var1 labels + + + drop if var1=="" + + * indicate no label contained + local N=_N + if `N'==0 { + local emptyLabel=1 + } + else { + local emptyLabel=0 + } + + * add constant + local newN=_N+1 + set obs `newN' + + local N=_N + replace labels="Constant" in `N' + replace var1="Constant" in `N' + + * letter cases + if "`upper'"=="upper" { + replace labels=upper(labels) + } + if "`lower'"=="lower" { + replace labels=lower(labels) + } + if "`proper'"=="proper" { + replace labels=proper(labels) + } + */ + + insheet using `label_file', clear + ren v1 var1 + ren v2 labels + + save `"`labelfile'"' + } + + + + *** clean up equation names, title, label + insheet2 `using', nonames clear slow(`slow') + tempvar id1 id2 id3 id4 + + + *** bottom row (the bottom border), count up + gen rowmiss=0 + foreach var of varlist v* { + replace rowmiss=rowmiss+1 if `var'~="" + } + local N=_N + local content 1 + local num 0 + while `content'==1 & `num'<`N' { + local content rowmiss[`=`N'-`num''] + local num=`num'+1 + } + * add titleWide and eqAdded later to get bottomBorder + local bottomRow = `N'-`num'+1 + + + *** head row (the head border), count down + local content + local num 1 + local N=_N + while `"`content'"'=="" & `num'<=`N' { + local content=v1[`num'] + local num=`num'+1 + } + * add titleWide later to get headBorder + local headRow=`num'-1 + drop rowmiss + + + gen id1=_n + gen str8 equation="" + gen str8 variable="" + + * find the top & bottom empty row + gen rowmiss=0 + foreach var of varlist v* { + replace rowmiss=rowmiss+1 if `var'~="" + } + + + * take care if colon (:) that may appears in the notes by limiting the search to the above + local N=_N + local stuff=rowmiss[`N'] + local cc 0 + while `stuff'~=0 { + local stuff=rowmiss[`N'-`cc'] + local cc=`cc'+1 + } + + ********** this should be made faster in version 10 + forval num=1/`=`N'-`cc'' { + local name=trim(v1[`num']) + local column=index("`name'",":") + if `column'~=0 { + local equation=trim(substr("`name'",1,`column'-1)) + local variable=trim(substr("`name'",`column'+1,length("`name'"))) + replace equation="`equation'" in `num' + replace variable="`variable'" in `num' + } + } + + replace equation=equation[_n-1] if equation=="" & equation[_n-1]~="" & rowmiss~=0 + *replace equation=equation[_n-1] if equation=="" & equation[_n-1]~="" & v1~="Observations" + + * needs a workaround for blank inserted by user + gen str8 temp="" + replace temp=equation + replace temp=temp[_n-1] if temp[_n-1]~="" & temp[_n-1]~="." & temp=="" + gen str8 top="1" if temp[_n]~=temp[_n-1] & temp[_n]~="" + drop temp + + + * now only the top empty row + replace rowmiss=0 if rowmiss[_n-1]==0 + + count if equation~="" + if `r(N)'~=0 { + * move equation names, instead of inserting them + count if v1=="EQUATION" + if `r(N)'==0 { + gen str8 v0="" + replace v0=equation + replace v0="EQUATION" in `headRow' + order v0 + replace v1=variable if variable~="" + } + else { + replace v1=equation + replace v1="EQUATION" in `headRow' + } + } + drop rowmiss + + * strips the redundant equation names + * must be undone at the insheet that recall this file in appendFile + + count if equation~="" + if `r(N)'~=0 { + *** for one column option + replace v0="" if top=="" & v0~="EQUATION" + } + + drop id1 equation variable top + outsheet2 `using', nonames `quote' `comma' replace slow(`slow') + + + + + + *** clean up labels + if "`label'"=="label" | "`insert'"=="insert" { + + ren v1 var1 + gen `id2'=_n + + * skip merging process if no label was contained + *if `emptyLabel'==1 { + * gen str8 labels="" + *} + *else { + joinby var1 using `"`labelfile'"', unmatched(master) + drop _merge + *} + + sort `id2' + drop `id2' + order var1 labels + cap order v0 var1 labels + + replace labels="LABELS" in `headRow' + ren var1 v1 + } + + + + + + *** (re)attaches titles + if "`notitle'"=="" { + if `"`title'"'=="" { + * NOTE: v0- saved here + tempfile appending + tempvar tomato potato + gen `tomato' =_n+10000 + save `"`appending'"',replace + + *** Clean up titles + * just coef, no label, no equation + cap confirm file `"`titlefile'"' + if !_rc { + use `"`titlefile'"',clear + + *gen `id3'=1 if v1=="VARIABLES" + *gen `id3'=1 if v1==`"`VARIABLES1'"' + * find the top empty row + gen rowmiss=0 + foreach var of varlist v* { + replace rowmiss=rowmiss+1 if `var'~="" + } + replace rowmiss=0 if rowmiss[_n-1]==0 + + gen `id3'=1 if rowmiss[_n+1]==0 + replace `id3'=1 if `id3'[_n-1]==1 + + drop rowmiss + drop if `id3'==1 + keep if v1~="" + + local N=_N + if `N'~=0 { + keep v1 + gen `potato'=_n + local titleWide=_N + joinby v1 using `"`appending'"', unmatched(both) + sort `potato' `tomato' + drop _merge `potato' `tomato' + aorder + } + else { + use `"`appending'"',replace + drop `tomato' + } + } + cap drop `tomato' + + * reorder again + cap order v1 labels + cap order v0 v1 labels + } + else { + * parse title + partxtl2 `"`title'"' + local titleWide = `r(numtxt)' + local t = 1 + while `t'<=`titleWide' { + local titl`t' `r(txt`t')' + local t = `t'+1 + } + + local oldN=_N + set obs `=`r(numtxt)'+_N' + gen `id4'=_n+10000 + forval num=1/`r(numtxt)' { + replace v1="`r(txt`num')'" in `=`oldN'+`num'' + replace `id4'=`num' in `=`oldN'+`num'' + } + sort `id4' + drop `id4' + } + + if "`titleWide'"=="" { + local titleWide=0 + } + } + + * problem spot + outsheet2 `using', nonames `quote' `comma' replace slow(`slow') + + c_local bottomRow `bottomRow' + c_local headRow `headRow' + c_local titleWide `titleWide' + +end /* cleanFile */ + + +******************************************************************************************** + + +* chewfile version 1.0.1 17Aug2009 by roywada@hotmail.com +* borrowed on 17Aug2009 +prog define _chewfile +version 8.0 + +syntax using/, [save(str) begin(numlist max=1) end(str) clear parse(str) replace semiclear] + +if `"`parse'"'=="" { + local parse `"`=char(9)'"' +} + +if "`begin'"=="" { + local begin 1 +} + +if "`end'"=="" { + local end . +} + +if "`clear'"=="" & `"`save'"'=="" { + if "`semiclear'"=="" { + noi di in red "must specify {opt clear} or {opt save( )} + exit 198 + } +} + +if "`semiclear'"=="semiclear" { + qui drop * + qui set obs 0 +} +else if "`clear'"=="clear" { + clear + qui set obs 0 +} + +if `"`save'"'=="" { + tempfile dump + local save `dump' +} + +tempname fh outout +local linenum = 0 +file open `fh' using `"`using'"', read + +qui file open `outout' using `"`save'"', write `replace' + +file read `fh' line + +while r(eof)==0 { + local linenum = `linenum' + 1 + local addedRow 0 + if `linenum'>=`begin' & `linenum'<=`end' { + if `addedRow'==0 { + qui set obs `=`=_N'+1' + } + + *display %4.0f `linenum' _asis `"`macval(line)'"' + file write `outout' `"`macval(line)'"' _n + + if "`clear'"=="clear" | "`semiclear'"=="semiclear" { + tokenize `"`macval(line)'"', parse(`"`parse'"') + local num 1 + local colnum 1 + while "``num''"~="" { + local needOneMore 0 + if `"``num''"'~=`"`parse'"' { + cap gen str3 var`colnum'="" + cap replace var`colnum'="``num''" in `linenum' + if _rc~=0 { + qui set obs `=`=_N'+1' + cap replace var`colnum'="``num''" in `linenum' + local addedRow 1 + } + *local colnum=`colnum'+1 + } + else { + cap gen str3 var`colnum'="" + local colnum=`colnum'+1 + } + local num=`num'+1 + } + } + } + file read `fh' line +} + +file close `fh' +file close `outout' +end + + +******************************************************************************************** + + +* cdout 1.0.1 Apr2009 by roywada@hotmail.com +* opens the current directory for your viewing pleasure + +* the following disabled 14oct2009: cap winexec cmd /c start . +* modified on 21oct2009: +* displays "dir" instead of cdout or the folder location +* cont option +* modified on 23mar2001 un-disabled: cap winexec cmd /c start . +* 04apr2011 for version 8 (original cdout needs this fix) + +prog define _cdout +cap version 7.0 + +syntax, [cont NOOPEN] + +if "`cont'"=="cont" { + local _c "_c" +} + +if "`noopen'"~="noopen" { + cap winexec cmd /c start . + cap !start cmd /c start . +} + +if _rc~=0 { + * version 6 or earlier + di `"{stata `"cdout"':dir}"' `_c' +} +else { + * invisible to Stata 7 + local Version7 + local Version7 `c(stata_version)' + + * for version 8 + c_local version 8.0 + + + if "`Version7'"=="" { + * it is version 7 or earlier + di `"{stata `"cdout"':dir}"' `_c' + } + else if `Version7'>=8.0 { + version 8.0 + di `"{browse `"`c(pwd)'"' :dir}"' `_c' + } +} + +if "`cont'"=="cont" { + di in white `" : "' _c +} + +end + + +******************************************************************************************** + + +*** parse various options + +* oct2009 +* parse tex( ) options +prog define _texout_parse + version 7 + syntax, [FRagment NOPRetty PRetty Landscape] + c_local texopts "`fragment' `nopretty' `pretty' `landscape'" +end + + +* 20may2010 +* parse xposea( ) options +prog define _xposea_parse + version 7 + syntax, [WHole] + c_local whole `whole' +end + + +******************************************************************************************** + +* mar2011 +* parse excel( ) options +prog define _excel_parse + version 7 + syntax, [font(str) FONTSize(int 10) COLWidth(numlist) NUMeric] + c_local excelfont "`font'" + c_local excelfontsize "`fontsize'" + c_local excelcolwidth "`colwidth'" + c_local excelcellnumeric "`numeric'" +end + + +******************************************************************************************** + +* oct2009 +* parse stats( ) options +prog define _stats_check + + * note: it will not prevent illegal options from entering (dumped into * `options') & allows multiple entry to be handled + * note: must be all lower case + + version 7 + + syntax, [eqname varname label label_pr label_up label_low test001 test01 test05 test10 coef se tstat pval ci aster blank beta ci_low ci_high /* + */ n sum_w mean var sd SKEWness KURTosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99 cv range iqr semean median count covar corr pwcorr spearman pcorr semipcorr pcorrpval tau_a tau_b *] + + c_local sumAsked "" + if `"`n'`sum_w'`mean'`var'`sd'`min'`max'`sum'"'~="" { + c_local sumAsked regular + } + if `"`skewness'`kurtosis'`p1'`p5'`p10'`p25'`p50'`p75'`p90'`p95'`p99'`range'`cv'`semean'`median'`count'"'~="" { + c_local sumAsked detail + } + if `"`cv'`range'`iqr'`semean'`median'`count'"'~="" { + c_local sumAsked extra + } + + foreach var in covar corr pwcorr spearman pcorr semipcorr pcorrpval tau_a tau_b { + c_local `var'Asked "" + if `"``var''"'~="" { + c_local `var'Asked `var' + } + } + + foreach var in eqname varname label label_pr label_up label_low test001 test01 test05 test10 { + c_local `var'Asked "" + if `"``var''"'~="" { + c_local `var'Asked `var' + } + } +end + + +******************************************************************************************** + + +* oct2009 +* 05apr2010 added mat( ) and e( ) +* parse cmd( ), str( ), and r( ) from the contents of stats( ) option +prog define _stats_parse + + version 7 + + syntax, [cmd(str asis) str(str asis) r(str asis) Mat(str asis) e(str asis)] + +end + + +******************************************************************************************** + + +* 03nov2009 +* 28jan2010 for version 11 fv +* 04apr2011 for version 8 + +prog define versionSet + * sends back the version as c_local + version 7.0 + + * invisible to Stata 7 + cap local Version7 `c(stata_version)' + c_local Version7 `Version7' + + * a_version is the actual version number with a floor of 7 + if "`Version7'"=="" { + * it is version 7 + c_local version 7 + c_local a_version 7 + } + else { + c_local a_version `Version7' + + * for version 8 + c_local version 8.0 + + if `Version7'>=8.2 { + * version 8.2 + c_local version 8.2 + } + if `Version7'>=10.1 { + * version 10.1 or higher + c_local version `Version7' + } + } + + if "`Version7'"=="" { + c_local bind "" + } + else { + c_local bind "bind" + } +end + + +******************************************************************************************** + + +* 15nov2009 +* not used +prog define eretSet, eclass + versionSet + version `version' + + syntax varlist + cap reg `varlist' + if _rc==0 { + marksample touse + tempname ebmat eVmat + + mat `ebmat'=e(b) + mat `eVmat'=e(V) + + gettoken depvar rest: varlist + + if "`Version7'"=="" { + est mat b `ebmat' + est mat V `eVmat' + + count if `touse'==1 + est scalar N = r(N) + } + else { + tempvar sample + local N=e(N) + local depvar=e(depvar) + gen `sample'=e(sample) + eret clear + eret post `ebmat' `eVmat', e(`sample') + eret local depvar `"`depvar'"' + eret scalar N = `N' + } + } +end + + +******************************************************************************************** + + +* cloned 20nov2009 +* pcorr2 version 1.1 +* Adapted by Richard Williams from pcorr2 version 2.2.8 08sep2000 +* Last Modified 14Feb2004 +prog define pcorr, rclass + version 6 + syntax varlist(min=2) [pweight fweight aweight iweight] [if] [in] + marksample touse + gettoken dep indep: varlist + regList + * will be redundant + macroMinus `r(varlist)', names(temp) subtract(`dep' `indep') + local weight "[`weight'`exp']" + quietly reg `dep' `indep' `temp' `weight' if `touse' + if (e(N)==0 | e(N)==.) { error 2000 } + local NmK = e(df_r) + quietly test `indep' + local s "1" + if (_b[`indep']<0) { local s "-1" } + ret scalar pcorr=`=`s'*sqrt(r(F)/(r(F)+`NmK'))' + ret scalar semipcorr=`=`s'*sqrt(r(F)* ((1-e(r2))/`NmK'))' + *ret scalar pcorr2=`=(r(F)/(r(F)+`NmK'))' + *ret scalar semipcorr2=`=(r(F)* ((1-e(r2))/`NmK'))' + ret scalar pcorrpval=`=tprob(`NmK',sqrt(r(F)))' +end + +prog define semipcorr, rclass + version 6 + syntax varlist(min=2) [aw fw] [if] [in] + marksample touse + gettoken dep indep: varlist + regList + * will be redundant + macroMinus `r(varlist)', names(temp) subtract(`dep' `indep') + local weight "[`weight'`exp']" + qui reg `dep' `indep' `temp' `weight' if `touse' + if (e(N)==0 | e(N)==.) { error 2000 } + local NmK = e(df_r) + quietly test `indep' + local s "1" + if (_b[`indep']<0) { local s "-1" } + ret scalar pcorr=`=`s'*sqrt(r(F)/(r(F)+`NmK'))' + ret scalar semipcorr=`=`s'*sqrt(r(F)* ((1-e(r2))/`NmK'))' + *ret scalar pcorr2=`=(r(F)/(r(F)+`NmK'))' + *ret scalar semipcorr2=`=(r(F)* ((1-e(r2))/`NmK'))' + ret scalar pcorrpval=`=tprob(`NmK',sqrt(r(F)))' +end + +prog define pcorrpval, rclass + version 6 + syntax varlist(min=2) [aw fw] [if] [in] + marksample touse + gettoken dep indep: varlist + regList + * will be redundant + macroMinus `r(varlist)', names(temp) subtract(`dep' `indep') + local weight "[`weight'`exp']" + quietly reg `dep' `indep' `temp' `weight' if `touse' + if (e(N)==0 | e(N)==.) { error 2000 } + local NmK = e(df_r) + quietly test `indep' + local s "1" + if (_b[`indep']<0) { local s "-1" } + ret scalar pcorr=`=`s'*sqrt(r(F)/(r(F)+`NmK'))' + ret scalar semipcorr=`=`s'*sqrt(r(F)* ((1-e(r2))/`NmK'))' + *ret scalar pcorr2=`=(r(F)/(r(F)+`NmK'))' + *ret scalar semipcorr2=`=(r(F)* ((1-e(r2))/`NmK'))' + ret scalar pcorrpval=`=tprob(`NmK',sqrt(r(F)))' +end + + +******************************************************************************************** + + +* 27nov2009 +prog define tau_a, rclass + version 6 + * weight ignored + syntax varlist(min=2) [pw aw fw iw] [if] [in] + marksample touse + gettoken dep indep: varlist + ktau `dep' `indep' + ret scalar tau_a=`r(tau_a)' +end + +prog define tau_b, rclass + version 6 + * weight ignored + syntax varlist(min=2) [pw aw fw iw] [if] [in] + marksample touse + gettoken dep indep: varlist + ktau `dep' `indep' + ret scalar tau_b=`r(tau_b)' +end + + +******************************************************************************************** + + +* 29mar2010 +*************** cap to avoid constant, could use equation name as the label for constant +prog define label0, rclass /* cannot be named label */ + * weight ignored, no need for touse + syntax varlist(min=2) [pw aw fw iw] [if] [in] + gettoken dep indep: varlist + cap local temp : var label `indep' + ret local label=`"`temp'"' +end + +prog define label_pr, rclass + * weight ignored, no need for touse + syntax varlist(min=2) [pw aw fw iw] [if] [in] + gettoken dep indep: varlist + cap local temp : var label `indep' + local temp=proper(`"`temp'"') + ret local label_pr=`"`temp'"' +end + +prog define label_up, rclass + * weight ignored, no need for touse + syntax varlist(min=2) [pw aw fw iw] [if] [in] + gettoken dep indep: varlist + cap local temp : var label `indep' + local temp=upper(`"`temp'"') + ret local label_up=`"`temp'"' +end + +prog define label_low, rclass + * weight ignored, no need for touse + syntax varlist(min=2) [pw aw fw iw] [if] [in] + gettoken dep indep: varlist + cap local temp : var label `indep' + local temp=lower(`"`temp'"') + ret local label_low=`"`temp'"' +end + + +******************************************************************************************** + + +* 21nov2009 +* concatenate variables into one string variable +prog define concat + version 7 + syntax, input(str) + givetoken, input(`input') clocal(concat) parse(",") + local num 1 + tempvar temp1 + while "`concat`num''"~="" { + givetoken, input(`concat`=`num'+1'') clocal(varname) parse("+") + local nn 1 + while "`varname`nn''"~="" { + *di `"`varname`nn''"' + *di `"`varname`=`nn'+1''"' + cap gen str7 `temp1'="" + cap replace `temp1'=string(`varname`nn'') + if _rc==0 { + move `temp1' `varname`nn'' + drop `varname`nn'' + ren `temp1' `varname`nn'' + } + local nn=`nn'+1 + } + *di + gen str7 `concat`num''="" + replace `concat`num''=`concat`=`num'+1'' + local num=`num'+2 + } +end + + +******************************************************************************************** + + +* 21nov2009 +* gettoken-based parser +prog define givetoken + * parse will take only one character + version 7 + syntax, input(str) clocal(str) [parse(str)] + local num 1 + if `"`parse'"'=="" { + local parse " " + gettoken one two : input, parse("`parse'") + c_local `clocal'`num' `"`one'"' + while `"`two'"'~="" { + local num=`num'+1 + *gettoken one two : two, parse("`parse'") + gettoken one two : two, parse("`parse'") + c_local `clocal'`num' `"`one'"' + } + } + else { + gettoken one two : input, parse("`parse'") + c_local `clocal'`num' `"`one'"' + while `"`two'"'~="" { + local num=`num'+1 + gettoken one two : two, parse("`parse'") + gettoken one two : two, parse("`parse'") + c_local `clocal'`num' `"`one'"' + } + } +end + + +******************************************************************************************** + + +* 25nov2009 calculates covariance +prog define covar, rclass + syntax varlist(max=2) [if] + gettoken dep indep : varlist + qui summarize `dep' `if' + local sdy `r(sd)' + qui summarize `indep' `if' + local sdx `r(sd)' + corr `dep' `indep' `if' + *c_local covar `=`r(rho)'*`sdy'*`sdx'' + ret local covar `=`r(rho)'*`sdy'*`sdx'' +end + + +******************************************************************************************** + + +* 16may2010 borrowed from regdis.ado +* 04apr2011 minor changes for version 7 + +prog define _explicit + cap syntax varlist(default=none ts fv) + if _rc~=0 { + * yes I know this is a workaround + cap syntax varlist(default=none ts) + if _rc~=0 { + * version 7 + c_local _varlist `0' + } + } + else { + syntax varlist(default=none ts fv) + _rmcoll `varlist' + } + c_local _varlist `varlist' +end + + +******************************************************************************************** + + +program def _thisthat + +end + + + +******************************************************************************************** + + +* 25july2010 +prog define _eqmatch +syntax anything + gettoken one two: anything + local one=trim("`one'") + local two=trim("`two'") + *split varname, parse(":") gen(_varname) + split report, parse(":") gen(_temp) + replace eqname="`one'" if eqname=="`two'" + replace report=eqname+":"+_temp2 + cap drop _temp1 + cap drop _temp2 +end + + + + +******************************************************************************************** + + +* 27july2011 +* handles the non-existant or non-accessible files + +prog define outsheet2 + + syntax [anything] using, [slow(int 1) *] + + /* wait 1000 ms = 1 second before trying again */ + + cap outsheet `anything' `using', `options' + + + if _rc~=0 { + sleep 250 + cap outsheet `anything' `using', `options' + } + if _rc~=0 { + sleep 250 + cap outsheet `anything' `using', `options' + } + if _rc~=0 { + sleep 250 + cap outsheet `anything' `using', `options' + } + if _rc~=0 { + sleep `=250+`slow'' + outsheet `anything' `using', `options' + } +end + + +prog define insheet2 + + syntax [anything] using, [slow(int 1) *] + + /* wait 1000 ms = 1 second before trying again */ + + cap insheet `anything' `using', `options' + + + if _rc~=0 { + sleep 250 + cap insheet `anything' `using', `options' + } + if _rc~=0 { + sleep 250 + cap insheet `anything' `using', `options' + } + if _rc~=0 { + sleep 250 + cap insheet `anything' `using', `options' + } + if _rc~=0 { + sleep `=250+`slow'' + insheet `anything' `using', `options' + } +end + + + + +* 27apr2014 +* handles the mess created by fvunab tsunab unab + +prog define fvtsunab + syntax [anything], [onebyone poundsign] + * onebyone does it by each tokens + * poundsign will parse by # also + + versionSet + version `version' + + if "`onebyone'"~="" { + * one by one version + if `a_version'>=11 { + foreach var in `anything' { + cap fvunab temp : `var' + cap fvexpand `temp' + local tempList "`tempList' `r(varlist)'" + } + } + else { + foreach var in `anything' { + cap tsunab temp : `var' + local tempList "`tempList' `temp'" + } + } + } + else { + * together + if `a_version'>=11 { + cap fvunab temp : `anything' + cap fvexpand `temp' + cap local tempList `r(varlist)' + } + else { + foreach var in `anything' { + cap tsunab tempList : `anything' + } + } + } + + c_local fvtsunab_list `tempList' + + * separate by poundsign (#) if need be + if "`poundsign'"=="poundsign" & index("`tempList'","#")~=0 { + local rest `"`tempList'"' + local num 1 + gettoken first rest: rest, parse("#") + local pounded_list "`first'" + + while "`rest'"~="" { + local num=`num'+1 + gettoken second rest: rest, parse("#") + gettoken second rest: rest, parse("#") + + local pounded_list "`pounded_list' `second'" + } + c_local fvtsunab_list `pounded_list' + } + +end + + + + +* 2014 04 28 +* determine fv, ts, base, omitted, and extract labels +prog fvts_label + cap version 12 + syntax anything + + fvtsunab `anything', poundsign + + local candidate `fvtsunab_list' + gettoken first rest: candidate, parse(".") + gettoken second rest: rest, parse(".") + gettoken third rest: rest, parse(".") + + if "`first'"~="" & "`second'"=="" { + cap confirm new variable `first' + if _rc==110 { + * first is regular varname and exists + cap local varlabel: var label `first' + cap local varlabel=trim("`varlabel'") + if "`varlabel'"=="" { + local varlabel =trim("`first'") + } + local output `"`varlabel'"' + } + } + else if "`first'"~="" & "`second'"=="." & "`third'"~="" & "`rest'"=="" { + + cap confirm new variable `third' + if _rc==110 { + * third is a regular varname and exists + cap local varlabel: var label `third' + cap local varlabel=trim("`varlabel'") + if "`varlabel'"=="" { + local varlabel =trim("`third'") + } + + local end + + * handle what is in first + cap confirm number `first' + if _rc==0 { + * first is regular number + local end + } + else { + * first is fv + if "`first'"=="co" { + local base_or_omitted "continuous omitted" + } + else { + * separate number and suffix + local bare=substr("`first'",1,length("`first'")-1) + local basesuffix=substr("`first'",length("`first'"),length("`first'")) + + cap confirm number `bare' + if _rc==0 { + if "`basesuffix'"=="o" { + local base_or_omitted omitted + } + else if "`basesuffix'"=="b" { + local base_or_omitted base + } + else if "`basesuffix'"=="n" { + * 1b 0b etc (not 1bn or 0bn) - not tested + local bare=substr("`first'",1,length("`first'")-2) + local basesuffix=substr("`first'",length("`first'")-1,length("`first'")) + local base_or_omitted base + } + } + local end `", `base_or_omitted'"' + } + } + * time series + * lagged, etc + + cap local varlabelname : value label `third' + cap local labelofvalue : label `varlabelname' `first' + + if `"`labelofvalue'"'=="" & "`bare'"~="" { + local output `"`varlabel' = `bare'`end'"' + } + else if `"`labelofvalue'"'=="" { + local output `"`varlabel' = `first'`end'"' + } + else if "`first'"~="" { + local output `"`varlabel' = `first', `labelofvalue'`end'"' + } + else { + local output `"`varlabel' = `bare', `labelofvalue'`end'"' + } + } + } + c_local basevalue `"`bare'"' + c_local basesuffix `"`basesuffix'"' + c_local baseonly `"`third'"' + c_local fvts_label_list `"`output'"' +end /* fvts_label */ + + + +* 2014 04 28 +* double parse addstat contents +prog _addstat_parse + cap version 12 + syntax, addstat(str asis) [ADec(numlist int >=0 <=11 max=1) AFmt(str asis) AUTO(integer 3) LESS(integer 0) NOAUTO DECMark(str asis)] + + local afmt_value `afmt' + if "`afmt'"=="" { + local afmt_value fc + } + *** PRE-PARSE with autodigit disabled because r( ) needs to be evaluated before r-class autodigit + local newadd="" + + gettoken part rest: addstat, parse(" (") + gettoken part rest: rest, parse(" (") /* strip off "addstat(" */ + local i = 1 + while `"`rest'"' != "" { + gettoken name rest : rest, parse(",") quote + if `"`name'"'=="" { + di in red "empty strings not allowed in addstat() option" + exit 6 + } + gettoken acomma rest : rest, parse(",") + gettoken valstr rest : rest, parse(",") + if `"`rest'"' == "" { /* strip off trailing parenthesis */ + local valstr = substr(`"`valstr'"',1,length(`"`valstr'"')-1) + local comma2 "" + } + else { + gettoken comma2 rest: rest, parse(",") + } + + * creating e(p) if missing + if ("`valstr'"=="e(p)" | trim("`valstr'")=="e(p)") & "`e(p)'"=="" { + if "`e(df_m)'"~="" & "`e(df_r)'"~="" & "`e(F)'"~="" { + local valstr = Ftail(`e(df_m)',`e(df_r)',`e(F)') + } + else if "`e(df_m)'"~="" & "`e(chi2)'"~="" { + local valstr = chi2tail(`e(df_m)',`e(chi2)') + } + * update if xtreg, fe is messing with it + if "`e(df_m)'"~="" & "`e(df_b)'"~="" & "`e(F)'"~="" { + local valstr = Ftail(`e(df_b)',`e(df_r)',`e(F)') + } + else if "`e(df_b)'"~="" & "`e(chi2)'"~="" { + local valstr = chi2tail(`e(df_b)',`e(chi2)') + } + } + + local value=`valstr' + capture confirm number `value' + + if _rc==0 { + * it's a number + + local value = `valstr' + + local count: word count `adec' + local aadec : word `i' of `adec' + + * runs only if the user defined adec is absent for that number + * now runs only if adec is present at all + if "`adec'"=="" { + * auto-digits: auto( ), cannot check for decmark (decimal separator) because comma is used for parsing *autodigits2 `value' `auto' + * needs to be less than 11 + *local valstr = string(`value',"%12.`r(valstr)'") + local valstr = string(`value') + if "`valstr'"=="" { + local valstr . + } + local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"' + } + else { + * using previous ones if no other option + if "`aadec'"=="" { + local aadec `prvadec' + if "`prvadec'"=="" { + local aadec 2 + } + } + local valstr = string(`value',"%12.`aadec'`afmt_value'") + local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"' + local prvadec = `aadec' + } + } + else { + * it's a non-number + local index=index(`"`valstr'"',"e(") + if `index'~=0 { + if `"``valstr''"'=="" { + * put a dot in there + local value `"`valstr'"' + local newadd `"`newadd'`name'`acomma'.`comma2'"' + noi di in yel `"check {stata eret list} for the existence of `valstr'"' + } + else { + * passthru `valstr' + local value `"`valstr'"' + local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"' + } + } + else { + * evaluate ``valstr'' + local value `"`valstr'"' + local newadd `"`newadd'`name'`acomma'``valstr''`comma2'"' + } + } + + local i = `i'+1 + } + local addstat `"`newadd'"' + + + if "`adec'"=="" { + *** do it again with autodigit enabled + local addstat `"addstat(`addstat')"' + + local newadd="" + gettoken part rest: addstat, parse(" (") + gettoken part rest: rest, parse(" (") /* strip off "addstat(" */ + local i = 1 + while `"`rest'"' != "" { + gettoken name rest : rest, parse(",") quote + if `"`name'"'=="" { + di in red "empty strings not allowed in addstat() option" + exit 6 + } + gettoken acomma rest : rest, parse(",") + gettoken valstr rest : rest, parse(",") + if `"`rest'"' == "" { /* strip off trailing parenthesis */ + local valstr = substr(`"`valstr'"',1,length(`"`valstr'"')-1) + local comma2 "" + } + else { + gettoken comma2 rest: rest, parse(",") + } + + * creating e(p) if missing + if ("`valstr'"=="e(p)" | trim("`valstr'")=="e(p)") & "`e(p)'"=="" { + if "`e(df_m)'"~="" & "`e(df_r)'"~="" & "`e(F)'"~="" { + local valstr = Ftail(`e(df_m)',`e(df_r)',`e(F)') + } + else if "`e(df_m)'"~="" & "`e(chi2)'"~="" { + local valstr = chi2tail(`e(df_m)',`e(chi2)') + } + * update if xtreg, fe is messing with it + if "`e(df_m)'"~="" & "`e(df_b)'"~="" & "`e(F)'"~="" { + local valstr = Ftail(`e(df_b)',`e(df_r)',`e(F)') + } + else if "`e(df_b)'"~="" & "`e(chi2)'"~="" { + local valstr = chi2tail(`e(df_b)',`e(chi2)') + } + } + + *local value = `valstr' + *capture confirm number `value' + *if _rc!=0 { + * * di in red `"`valstr' found where number expected in addstat() option"' + * * exit 7 + *} + + local value=`valstr' + capture confirm number `value' + + if _rc==0 { + * it's a number + + local value = `valstr' + + local count: word count `adec' + local aadec : word `i' of `adec' + + * runs only if the user defined adec is absent for that number + *if `i'>`count' & `i'<. { + * now runs only if adec is present at all + + if "`adec'"=="" { + * auto-digits: auto( ), cannot check for decmark (decimal separator) because comma is used for parsing + + ****** different than above + autodigits2 `value' `auto' `less' + * needs to be less than 11 + if "`afmt'"~="" { + local valstr = string(`value',"%12.`r(value)'`afmt_value'") + } + else { + local valstr = string(`value',"%12.`r(valstr)'") + } + + + if "`valstr'"=="" { + local valstr . + } + local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"' + } + else { + * using previous ones if no other option + if "`aadec'"=="" { + local aadec `prvadec' + if "`prvadec'"=="" { + local aadec 2 + } + } + local valstr = string(`value',"%12.`aadec'`afmt_value'") + local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"' + local prvadec = `aadec' + } + } + else { + * it's a non-number + local index=index(`"`valstr'"',"e(") + if `index'~=0 { + if `"``valstr''"'=="" { + * put a dot in there + local value `"`valstr'"' + local newadd `"`newadd'`name'`acomma'.`comma2'"' + noi di in yel `"`valstr' does not exist; check {stata eret list}"' + } + else { + * passthru `valstr' + local value `"`valstr'"' + local newadd `"`newadd'`name'`acomma'``valstr''`comma2'"' + } + } + else { + * evaluate ``valstr'' + local value `"`valstr'"' + local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"' + } + } + + local i = `i'+1 + } + local addstat `"`newadd'"' + } + c_local addstat `"`addstat'"' +end +exit + + diff --git a/ado/o/outreg2.hlp b/ado/o/outreg2.hlp new file mode 100644 index 0000000..37df5e3 --- /dev/null +++ b/ado/o/outreg2.hlp @@ -0,0 +1,1212 @@ +{smcl} +{* 17aug2014}{...} +{helpb outreg2} + +{hline} + +{title:Titles & related stuffs} + +{p2colset 5 16 22 2}{...} +{p2col :{hi: outreg2} {hline 2}}Arrange regression, summary, and tabulation into an illustrative table{p_end} +{p2colset 5 15 20 2}{...} +{p2col :{hi: {help seeout}} {hline 2}}Opens a tab-delimited table in the data browser{p_end} +{p2colset 5 17 23 2}{...} +{p2col :{hi: {help shellout}} {hline 2}}Opens documents and their programs from inside Stata{p_end} + +{p2colset 5 15 21 2}{...} +{p2col :{hi: {help logout}} {hline 2}}Converts log or ASCII files into various output formats{p_end} +{p2colset 5 14 20 2}{...} +{p2col :{hi: {help mkest}} {hline 2}}Convert variables to estimates matrix{p_end} + +{title:Examples} + + {help outreg2##s_0:0. Basic game plan} + {help outreg2##s_1:1. Prefix and -bys:-} {help outreg2##s_11:11. Marginal Effects} + {help outreg2##s_2:2. Running loops} {help outreg2##s_12:12. Word or Excel files} + {help outreg2##s_3:3. Stored estimates} {help outreg2##s_13:13. TeX files} + {help outreg2##s_4:4. Shorthand} {help outreg2##s_14:14. Adding column titles or notes} + {help outreg2##s_5:5. Decimal places} {help outreg2##s_15:15. n-way cross-tabulation} + {help outreg2##s_6:6. Sideway display} {help outreg2##s_16:16. Group summary table} + {help outreg2##s_7:7. Summary tables} {help outreg2##s_17:17. Fixed effects or legends} + {help outreg2##s_8:8. Drop/keep/order variables} {help outreg2##s_18:18. Stats transformation/manipulation} + {help outreg2##s_9:9. Adding r( ) e( ) scalars} {help outreg2##s_19:19. Matching policy variables} + {help outreg2##s_10:10. Odds ratios and rrr} {help outreg2##s_20:20. Insert r-class cmd( ) outputs} + +{p 4 4 6}{help outreg2##s_FAQ:Frequently asked questions}{p_end} +{p 4 4 6}{help outreg2##s_Terms:Terms of Use}{p_end} + +{p2colreset}{...} + +{hline} + +{marker s_Description} +{title:Description} + +{p 4 4 6} +{cmd:outreg2} provides a fast and easy way to produce an illustrative table +of regression outputs. The regression outputs are produced piecemeal and are +difficult to compare without some type of rearrangement. {cmd:outreg2} +automates this process by concatenating the successive regression ouputs in a +vertical format. The resulting table is saved to the disk in ASCII +format, which can be read by other programs. + +{p 4 4 6} +{cmd:outreg2} thus facilitates the convertion of regression outputs to a standard +format suitable for inclusion in a scholarly publication. The functionality of outreg2 +is based on the earlier package {help cmd:outreg}, by John Gallup. {help outreg2##s_Differences:Unlike} +{cmd:outreg}, {cmd:outreg2} is capable of writing LaTeX-format tables, as well as ASCII, MS Word +and MS Excel. + +{p 4 4 6} +{cmd:outreg2} can report any regression output, provided it conforms to +{it:the} {it:usual} {it:convention} for {help ereturn:ereturn list}. This includes +most regression commands in Stata 7 or later. {cmd:outreg2} will report the latest regression output +by default, or the list of {help estimates:stored estimates}. The ancillary statistics from from stored +{help return} can also be accessed using {opt e( )} or {opt adds:tat( )}. + +{p 4 4 6} +{cmd:outreg2} will also report the usual statistics such as standard error with the asterisks for the levels of +significance (1%, 5%, and 10%), t-statistics, p-values, the number of observations, +R-squareds, and the number of groups in a panel estimation. Standarized beta +coefficients, exponentially transformed coefficients (i.e. odds/risk ratios +or hazard rate). The user can add their own column titles with {opt ct:itle} and {opt addn:ote} options. + +{p 4 4 6} +An immediate access to the produced table is provided in the browser view with +{opt see} option. {cmd:outreg2} also comes with automatically formatted number of +significant digits, which avoids the awkward displays assoicated with the fixed +format. + + +{hline} + +{marker s_Syntax} +{title:Syntax} + +{synopt: Full syntax:}{p_end} + +{p 6 8 6} +{cmdab:outreg2} [{varlist}] {cmd:[}{help estimates:{it:estlist}}{cmd:]} +{helpb using} {it:filename} [{cmd:,} {it:options}] [{cmd::} {help estimation commands:{it:command}}] {p_end} + +{synopt: Shorthand:}{p_end} + +{p 6 8 6} +{cmdab:outreg2} [{varlist}] {cmd:[}{help estimates:{it:estlist}}{cmd:]} +[{cmd:,} replace seeout] +[{cmd::} {help estimation commands:{it:command}}] {p_end} + +{p 4 4 6} +where {it:command} takes one of {help estimation commands}. The shorthand works +only after a full syntax has been invoked.{p_end} + +{p 4 6 2} +Note that {it:filename} must be enclosed within double quotes if it contains embedded spaces.{p_end} + + +{marker s_Options} +{title:Options} + +{dlgtab:Main} + +{phang}{opt replace} create a new file or overwrite the existing file.{p_end} + +{phang}{opt see:out} display the regression table in the browser.{p_end} + +{phang}{opt skip} skips a column (adds an empty column).{p_end} + +{phang}{opt lab:el} replace variable names with variable labels, also see stats(label){p_end} + +{phang}{opt lab:el( )} takes the following options for label:{p_end} + +{p 8} {cmd:insert} - insert labels next to variable names{p_end} +{p 8} {cmd:proper} - proper cases (capitalize the first letter){p_end} +{p 8} {cmd:upper} - all upper cases{p_end} +{p 8} {cmd:lower} - all lower cases{p_end} + +{phang}{opt side:way} specify sideway display (with standard error next to coefficient). Use {opt paren( )} +or {opt noparen} to control the location of parentheses.{p_end} + +{phang}{opt long} interweave the equation names into the same column +with the variable names column, the default is usually wide. Also specify {opt text} if you want a converted text as well. {p_end} + +{phang}{opt o:necol} specify one column to display multiple equations; the default is usually wide.{p_end} + +{phang}{opt wide} forces wide format with multiple columns, rarely required.{p_end} + + +{dlgtab:Output Files} + +{phang}{opt dta} produces Stata file. A suffix "_dta" is added to the file name to prevent the possible loss of main data.{p_end} + +{phang}{cmd:dta(saveold)} produces in older Stata file format, as in {help saveold}.{p_end} + +{phang}{opt word} produces rich text file (rft) compatible with {cmd:MS Word}. The file conversion can be +specified at any time (you should do it with the last appedning). The existing file must not be open for +it to be written over.{p_end} + +{phang}{opt excel} specifies an xml, xls, xlm, or cvs file compatible with a standard spreadsheet +like {cmd:MS Excel}. Any existing file with the same name must be closed to have it +replaced with a new file.{p_end} + +{phang}{opt tex} produces TeX output for a TeX typesetting program such as Scientific Word.{p_end} + +{phang}{cmd:tex( )} takes the following options for tex:{p_end} + +{p 8} {cmd:{ul:frag}}ment - a TeX fragment for inclusion in a document{p_end} +{p 8} {cmd:{ul:pr}}etty - with some italics and varying font sizes{p_end} +{p 8} {cmd:{ul:land}}scape - horizontally{p_end} + +{phang}{opt text} produces plain text file exactly. {opt long} or {opt label} will +sometimes cause the main output text file to be different from what might be +expected. Use this option to obtain exactly specified text file.{p_end} + +{phang}{opt quote} specifies quotation marks to encase each observation. See the {opt noquote} +option in {help outsheet} for more details (all the output of {cmd:outreg2} comes +from string variables). {opt quote} may cause problems appending tables together. {p_end} + +{phang}{opt comma} specifies that the ASCII file output be separated by commas +rather than by tabs. This can cause problems if any of the user-defined text has +commas in it (such as variable labels, {opt ct:itle}, {opt adds:tat}, or +{opt addn:ote}). If that is the case, consider using {opt quote} as well. {p_end} + + +{dlgtab:Statistics for each variable (main table)} + +{phang}{opt st:ats(stats)} contains statistics to be reported per variable, the default is +{cmd:stats(coef se)}, space or comma separated, restricted to the estimation sample (single equation), will appear +in the order specified by the user: + +{p 8 8 12}coef se tstat pval ci ci_low ci_high beta +{help summ:N} sum_w mean Var sd sum min max skewness kurtosis +p1 p5 p10 p25 p50 p75 p90 p95 p99 +{help tabstat:range} iqr cv semean median count +{help corr} covar {help pcorr} {help pcorr2:semipcorr} pcorrpval +{help spearman} tau_a tau_b{p_end} + +{p 8 8 12}eqname varname aster label label_pr label_up label_low blank{p_end} + +{p 8 12 12}str({it:str}) where {it:str} is any string or numeric expression{p_end} +{p 17 17 12}internally stored and recalled as string1, string2, etc.{p_end} + +{p 8 12 12}cmd({it:macro}: {it:cmd}) where {it:macro} is to be produced by {help outreg2##s_20:{it:cmd}}{p_end} +{p 24 24 12}internally stored and recalled as cmd1, cmd2, etc.{p_end} + +{phang}{opt stnum(commands)} applies Stata or user-defined {help outreg2##s_18:commands} to {it:numerical} forms of the {cmd:stats( )}, +use this option for mathematical/numeric operations, comma delimited, use quotes when there is a comma within a command, +usually limited to stats specified in {cmd:stats( )}, also see {cmd:ststr( )} below for string operations{p_end} + +{phang}{opt ststr(commands)} applies Stata or user-defined {help outreg2##s_18:commands} to {it:string} forms of the {cmd:stats( )}, +use this option to attach symbols or concatenate, comma delimited, use compound quotes if there is a comma in the command, +usually limited to stats specified in {cmd:stats( )}, also see {cmd:stnum( )} above{p_end} + +{phang}{opt ef:orm} specifies coefficients to be reported. This corresponds to {opt or} option for +{help logit}, {help clogit}, and {help glogit} estimation, {opt irr} for {help poisson} estimation, {opt rrr} +for {help mlogit}, {opt hr} for {help cox} and {help stcox} hazard models, and +{opt eform} for {help xtgee}. The default form of {help stcox} is the hazard rate form; use the {opt eform} to report it. {p_end} + +{phang}{opt l:evel(integer)} specifies the confidence level, in percent, for +confidence intervals. The default is {opt level(95)} or as set by {help set level}, +does not affect the significance levels of asterisks. {p_end} + + +{p 4 8 8}{ul:Short-cut for auxillary statistics}{p_end} + +{phang}{opt nose} specifies coefficients reported without std. errors{p_end} + +{phang}{opt tstat} displays t-statistics under the coefficent{p_end} + +{phang}{opt pvalue} displays p-values under the coefficent{p_end} + +{phang}{opt ci} displays conf. intervals under the coefficent{p_end} + +{phang}{opt be:ta} displays normalized beta coefficients (see the beta option of {help regress}){p_end} + + +{dlgtab:Significance} + +{phang}{opt alpha(numlist)} specifies the levels of significance, separated by comma +from the most significant to the least signficiant. Example: {opt alpha(0.001, 0.01, 0.05)}. Up to 3 are automatically +assigned asterisks. If more than 3 levels are defined, then the symbols must be specified with {opt sym:bol(text)}. {p_end} + +{phang}{opt sym:bol(text)} specifies symbols for the levels of significance from the most significant +to the least significant, the default {opt sym:bol(***, **, *)}. The significance levels of 0.01, +0.05, and 0.10 will be automatically assigned in that order. If more than 3 symbols are assigned, then the +same number of levels of significance must be specified using {opt alpha( )}.{p_end} + +{phang}{opt aster:isk( )} specifies asterisks to be placed next to them; default {cmd:stats(coef)}.{p_end} + +{phang}{opt noas:ter} no asterisks denoting statistical significance +levels be reported. {p_end} + +{phang}{opt 2aster} specifies ** for 1% and * for 5% {p_end} + +{phang}{opt 10pct} equivalent to {opt sym:bol(**, *, +)}{p_end} + + +{dlgtab:Decimals and Formats} + +{phang}{opt auto(integer)} the number of automatically formatted decimals, the default is {cmd:auto(3)}, +i.e. three significant digits not counting the ones (i.e. the digit to the left of the decimal point). +This means 1.234 and 0.123 might be displayed, while 12.345 or 0.1234 will be trimmed. A probable integer +is reported without decimals. A very large or small number will be displayed in +exponential format. Specify {opt dec( )} or {opt bd:ec( )} to disable it. {p_end} + +{phang}{opt less(integer)} specifies how many less significant digits to be +displayed for the auxiliary (non-coefficient) statistics. The default is {cmd:less(0)}, meaning no less.{p_end} + +{phang}{opt decm:ark( )} contains the decimal marker; default {opt decm:ark(.)}{p_end} + + +{phang}{ul:fixed decimals & formats}{p_end} + + {opt dec(#)} or {opt fmt(type)} for everything, default {cmd:dec(3)} and {cmd:fmt(fc)} + +{p 8}where # is fixed decimals between 0 and 11, {p_end} +{p 8}and {it:type} is one of the following:{p_end} + + e exponential + f fixed + fc fixed with commas for thousands + g general + gc general with commas for thousands + + Use the following only if you want them different from {opt dec(#)} or {opt fmt(type)}: + + {opt bd:ec(#)} or {opt bf:mt(type)} for coefficient only + {opt sd:ec(#)} or {opt sf:mt(type)} for standard error + {opt td:ec(#)} or {opt tf:mt(type)} for t-statistics + {opt pd:ec(#)} or {opt pf:mt(type)} for p-value + {opt cd:ec(#)} or {opt cf:mt(type)} for conf. interval + {opt rd:ec(#)} or {opt rf:mt(type)} for r-square + {opt ad:ec(#)} or {opt af:mt(type)} for addstat( ) contents + +{dlgtab:Titles and notes} + +{phang}{opt ti:tle(list)} titles for your table; comma separated; use quotes for commas within a title. +Titles can be added at any time. To erase your title, encase a space between quotes like this: title(" "){p_end} + +{phang}{opt ct:itle(list)} column titles; comma separated for each additonal row; semi-colon for each additional column; +use quotes if comma is part of title. Example: ctitle("Wage, Participation","Wage: Participation"). To specify empty column title, specify +ctitle(" ").{p_end} + +{phang}{opt cttop(list)} place additonal column titles on the top; comma separated, use quotes for multiple column titles.{p_end} + +{phang}{opt addn:ote(list)} add your own notes at the bottom. Must be specified in the first {cmd:outreg2} +call when regression results are appended together. A blank line can be inserted by including "" as a note.{p_end} + +{phang}{opt nonot:es} specifies that notes and legends explaining the standard errors, asterisks, etc., not be included.{p_end} + + +{dlgtab:Parenthesis and brackets} + +{phang}{opt par:en(stats)} specifies parenthesis ( ) to be placed around the same list as stats( ).{p_end} + +{phang}{opt nopa:ren} specifies no parentheses be placed around standard +errors, t-statistics, standard errors, etc. {p_end} + +{phang}{opt br:acket} specifies square brackets [ ] be used rather than +parentheses ( ) around standard errors, t-statistics, etc. {p_end} + +{phang}{opt br:acket(stats)} specifies square brackets [ ] to be placed around the same list as stats( ).{p_end} + + +{dlgtab:Statistics for each regression (at bottom)} + +{phang}{opt e(scalars)} reports {help ereturn:e-class scalars} at the bottom of the table. +They may be requested individually, as in {cmd:e(N ll r2)}, or for all, by specifying {cmd:e(all)}. +The reported e-class statistics are automatically formated by auto-digits, unless {opt ade:c} +has been specified for it. {p_end} + +{phang}{opt adds:tat(name, stats, ..)} access {help ereturns:e-class}, {help return:r-class}, {help sreturn:s-class} +scalar statistics, or just plain numbers in new rows below the R-squared (if shown). Comma separted. +The user must specify both a name and a value for the statistic. See {help outreg2##s_9:example}.{p_end} + +{phang}{opt addtext(name, text, ..)} specifies user-added text (including +numbers) to be displayed in new lines below the R-squared (if shown). Unlike {opt adds:tat}, +{opt addt:ext} will not format numbers nor try to interpret any e-class text (such as e(N) or e(title)). {p_end} + +{phang}{opt ad:jr2} specifies that the adjusted R-squared be reported rather than the regular R-squared +when available.{p_end} + +{phang}{opt nocon:s} specifies that the intercept (constant) be not reported. + +{phang}{opt noni} specifies that the number of groups in a panel data regression +not be reported (e.g. the number of groups specified by the i( ) variable in {help xtreg}).{p_end} + +{phang}{opt nor:2} specifies that no R-squared (or adjusted R-squared) be reported.{p_end} + +{phang}{opt noobs} specifies no number of observations is to be reported.{p_end} + + + +{dlgtab:Equations and Variables} + +{phang}{opt depvar} Include depdendent variable.{p_end} + +{phang}{opt nodepvar} Attempt to drop depdendent variable.{p_end} + +{phang}{opt policy(varlist)} {help outreg2##s_19:Match policy variables across regressions}.{p_end} + +{phang}{opt drop(varlist)} Drop these variables. Do not include the dependent variable in this list.{p_end} + +{phang}{opt keep(varlist)} Keep and report these variables. {p_end} + +{phang}{opt eqdrop(eqlist)} Drop these equations from the table {p_end} + +{phang}{opt eqkeep(eqlist)} Keep and report these equations. {p_end} + +{phang}{opt sortvar(varlist)} Sort and order variables; non-existent variable names are ignored.{p_end} + +{phang}{opt groupvar(names)} Sort and order variable; non-existent names are inserted as super-rows or row-heading.{p_end} + + + +{dlgtab:Marginal effects} + +{phang}{opt mfx} reports marginal effects as computed by {help mfx}. It will reported marginal +effects instead of estiamted coefficients. {p_end} + +{phang}{opt m:argin(u|c|p)} the unconditional, conditional, and probability marginal +effects for {help truncreg}, {net_d:marginal} from STB 52, or {net_d:dtobit} from STB 56. +One of u, c, or p is required after {net_d:dtobit}, corresponding to the unconditional, +conditional, and probability marginal effects, respectively. It is not necessary to specify +{opt margin} after {help dprobit}, {net_d:dlogit2}, {net_d:dprobit2}, or {net_d:dmlogit2}.{p_end} + + +{dlgtab:Summary Statistics} + +{phang}{opt sum} summary be reported after a regression command, restricted to the estimation sample, i.e. e(sample)==1, +unless no regress exists or {opt raw} option specified. This is the same as {cmd:stats(mean sd)}.{p_end} + +{phang}{opt raw} do not restrict the sample to e(sample) or perform casewise dropping. Currently works only with sum. +The number of observation reported is the maximum.{p_end} + +{phang}{cmd:sum(log)} summary table just like the one from log file. Default is raw (no casewise dropping). +Use eqdrop( ) or eqkeep( ) to get what you want.{p_end} + +{phang}{cmd:sum(detail)} detailed summary table. Default is raw (no casewise dropping). +Use eqdrop( ) or eqkeep( ) to get what you want.{p_end} + + +{dlgtab:Tabulations} + +{phang}{opt cross:tab} n-way cross-tabulation. Varlist is required. The first +variable must be counting numbers, i.e. 0, 1, 2, etc., and the rest must be non-strings. See {help outreg2##s_15:example} below. {p_end} + + +{dlgtab:Laptop/External/Network Drives} + +{phang}{opt slow(#)} specifies # of milli-second delay. Specify slow(100) or larger if you are getting +"could not be openend r(603)" error; it's probably either (1) your storage device is running too slow, or +(2) you don't have write-access, in which case you need to change working directory +with {help cd}.{p_end} + + +{hline} + +{marker s_0} +{title:Example 0. Basic game plan} + + +{p 4 4 6}You should specify the current directory where all the files will be stored. Alternatively, you +can specify the complete pathway from within {cmd:outreg2}, but you need to +encase it with quotations marks. {cmd:Either way, you must have write-access to that folder.} Otherwise you get r(603) error.{p_end} + +{p 4 10 8}cd "C:\Users\yourname\Documents\" /* or whatever your directory may be */{p_end} +{p 4 10 8}{stata sysuse auto,clear}{p_end} +{p 4 10 8}{stata regress mpg foreign weight headroom trunk length turn displacement}{p_end} +{p 4 10 8}{stata outreg2 using myfile, replace cttop(full)}{p_end} +{p 4 10 8}{stata regress mpg foreign weight headroom}{p_end} +{p 4 10 8}{stata outreg2 using myfile, see word excel tex dta}{p_end} + +{p 4 4 6}You can immedicately see the changes. The variable "weight" loses some of its significance +in the full specification. The estimated effect of weight can be shown to be downward-biased from +-0.00420 to -0.00647 by omitting a number of covariates. This is an easy way to check for +collinearity and misspecification.{p_end} + +{p 4 4 6}You can use {cmd:e( )} or {cmd:addstat( )} option to augment the standard +regression results with other e-class statistics (scalar only). {cmd:addstat} can handle +r-class and s-class results as well, if they exist. The following codes are equivalent +excpet in appearance.{p_end} + +{p 4 10 8}{stata outreg2 using myfile, e(r2 ll)}{p_end} +{p 4 10 8}{stata outreg2 using myfile, addstat(R-squared by hand, e(r2), Log Lik, e(ll))}{p_end} + +{p 4 4 6}If you want to see everything available in the e-class, do it like this:{p_end} + +{p 4 10 8}{stata outreg2 using myfile, e(all)}{p_end} + + +{marker s_1} +{title:Example 1. Prefix and -bys:-} + + +{p 4 4 6}{cmd:outreg2} can be used in as a prefix.{p_end} + +{p 4 10 8}{stata sysuse auto, clear}{p_end} +{p 4 10 8}{stata "outreg2 using myfile, replace ti(Car stuff): reg price mpg weight turn"}{p_end} +{p 4 10 8}{stata "outreg2 using myfile, see excel: reg price mpg weight turn if price > 6100"}{p_end} + +{p 4 8 8}It is also byable with -bys:- prefix.{p_end} + +{p 4 10 8}{stata "bys foreign: outreg2 using myfile, side replace see: reg rep78 head weight gear length turn [aw=mpg]"}{p_end} + + +{marker s_2} +{title:Example 2. Running loops} + + +{p 4 4 6}Because this involves a loop, you must copy and paste into a do-file: + +{p 4 4 6}sysuse auto,clear{p_end} +{p 4 4 6}cap erase myfile.txt{p_end} +{p 4 4 6}forval num=1/5 {{p_end} +{p 8 8 6}regress mpg weight headroom if rep78==`num'{p_end} +{p 8 8 6}outreg2 using myfile{p_end} +{p 4 4 6}}{p_end} +{p 4 4 6}seeout{p_end} + + +{p 4 4 6}Alternatively, make use of macro{p_end} + +{p 4 4 6}local replace replace{p_end} +{p 4 4 6}forval num=1/5 {{p_end} +{p 8 8 6}regress mpg weight headroom if rep78==`num'{p_end} +{p 8 8 6}outreg2 using myfile, `replace' {p_end} +{p 8 8 6}local replace{p_end} +{p 4 4 6}}{p_end} + +{marker s_3} +{title:Example 3. Stored estimates} + + +{p 4 4 6}You can automatically recall the stored estimates by specifying them from +within {cmd:outreg2}. To distinguish them from the varlist, place the estlist +within a pair of {cmd:[}square brackets{cmd:]}.{p_end} + +{p 4 10 8}{stata sysuse auto,clear}{p_end} +{p 4 10 8}{stata regress mpg foreign weight headroom trunk length turn displacement}{p_end} + +{p 4 10 8}{stata est store Full}{p_end} +{p 4 10 8}{stata regress mpg foreign weight headroom}{p_end} + +{p 4 10 8}{stata est store Restricted1}{p_end} +{p 4 10 8}{stata regress mpg foreign weight}{p_end} + +{p 4 10 8}{stata est store Restricted2}{p_end} +{p 4 10 8}{stata outreg2 [Full Restricted1 Restricted2] using myfile, replace see}{p_end} + +{p 4 4 6}{cmd:outreg2} will take the stored estimates as wildcards (*). Try this: + +{p 4 10 8}{stata outreg2 [*] using myfile, see replace}{p_end} +{p 4 10 8}{stata outreg2 [R*] using myfile, see replace}{p_end} + +{p 4 4 6}The varlist may be combined with the estlist. The varlist will take the +wildcards as well, provided they exist in the estlist.{p_end} + +{p 4 10 8}{stata outreg2 foreign weight [*] using myfile, see replace}{p_end} + +{p 4 4 6}If you are specifying the varlist, you must make certain the desired varlist +exists in all the stored estiamtes. Since not all equations may contain the +specified varlist, it is usually a poor idea to combine the one column option +with the varlist.{p_end} + + +{marker s_4} +{title:Example 4. Shorthand} + + +{p 4 4 6}{cmd:outreg2} will remeber the last set of options you specified until the end of +the day. The stored command will expire at mid-night to prevent the possible +loss of finished table by inadvertantly writing over a finished file. The +following shorthand should be tried separately.{p_end} + +{p 4 10 8}{stata outreg2}{p_end} +{p 4 10 8}{stata outreg2, replace}{p_end} +{p 4 10 8}{stata outreg2, seeout}{p_end} + +{p 4 4 6}The following two options are excluded from the stored command: +seeout and replace. These two must be specified each time you invoke {cmd:outreg2} +through the shorthand. To change the stored options, you must invoke the full +syntax with the specified using file (i.e. outreg2 using myfile, etc). The varlist +and the stored estimates names are not stored with the command.{p_end} + +{p 4 4 6}For someone who is in a hurry, {cmd:outreg2} will take the following syntax, provided +the desired options have been stored by invoking them in the full syntax. The +varlist and/or the estlist are still allowed under this syntax. This +pre-command syntax is made available for the benefit of iterative users.{p_end} + +{p 4 10 8}{stata "outreg2 : reg mpg foreign weight headroom"}{p_end} +{p 4 10 8}{stata "outreg2, replace : reg mpg foreign weight headroom"}{p_end} +{p 4 10 8}{stata outreg2}{p_end} +{p 4 10 8}{stata seeout}{p_end} + + +{marker s_5} +{title:Example 5. Decimal places} + + +{p 4 4 6}By default the regression coefficients are shown with auto-digits, +but a user may wish to specify their own number of decimals places. We could use +the option dec(5) to display 5 decimal places for all statistics or bdec(5) +for just the coefficient, sdec(5) just for standard error, etc.{p_end} + +{p 4 10 8}{stata outreg2 using myfile, replace auto(4)}{p_end} +{p 4 10 8}{stata outreg2 using myfile, dec(5)}{p_end} +{p 4 10 8}{stata outreg2 using myfile, bdec(5) bfmt(f) sdec(7) sfmt(e) see}{p_end} + + +{marker s_6} +{title:Example 6. Sideway display} + +{p 4 4 6}Medical journals often requires the displays to go sideways. Use {opt side:way} to make this +happen. {opt side:way} is compatible with {opt st:ats( )}. + +{p 4 10 8}{stata outreg2 using myfile, sideway stats(coef aster se) noparen dec(3) replace}{p_end} + +{p 4 4 6}Note the above code is equivalent to building the table one column at a time like this:{p_end} + +{p 4 10 8}{stata outreg2 using myfile, stats(coef) replace noparen dec(3)}{p_end} +{p 4 10 8}{stata outreg2 using myfile, stats(aster) noparen dec(3)}{p_end} +{p 4 10 8}{stata outreg2 using myfile, stats(se) noparen dec(3)}{p_end} + +{p 4 4 6}Some journals often prefer t-statistics to standard errors +and don't use asterisks to denote statistical significance. Some people use brackets. The +title( ) option requires quotation marks when it contains a comma. Note that {opt dec} decimal +option apply to both the coefficients and the standard errors.{p_end} + +{p 4 10 8}{stata regress mpg foreign weight}{p_end} +{p 4 10 8}{stata outreg2 using myfile, tstat bracket noaster title("No standard errors!")}{p_end} +{p 4 10 8}{stata seeout}{p_end} + + +{marker s_7} +{title:Example 7. Summary tables} + +{p 4 4 6}Use {opt sum} to place summary statistics into a table. The sample mean and the standard +deviation for the sample used in the earlier regression will be automatically displayed. + +{p 4 6 6}* After estimation{p_end} +{p 4 10 8}{stata sysuse auto, clear}{p_end} +{p 4 10 8}{stata reg mpg price rep weight length}{p_end} +{p 4 10 8}{stata outreg2 using myfile, sum replace}{p_end} +{p 4 10 8}{stata outreg2 using myfile, see}{p_end} + +{p 4 6 6}* Regular summary table{p_end} +{p 4 6 6}* note: version 11 and above requires clear* to prevent mismatch between e(b) and e(sample){p_end} +{p 4 10 8}{stata clear*}{p_end} +{p 4 10 8}{stata sysuse auto, clear}{p_end} +{p 4 10 8}{stata outreg2 using myfile, sum(log) replace eqdrop(N mean) see}{p_end} +{p 4 10 8}{stata outreg2 using myfile, sum(detail) replace eqkeep(N max min) see}{p_end} +{p 4 10 8}{stata outreg2 using myfile, sum(detail) replace see}{p_end} + + +{marker s_8} +{title:Example 8. Drop/keep/order variables} + + +{p 4 4 6}Specifying a varlist can be convenient to limit the output +table to only the essential coefficients. For example, we may want to control for +the influence of dummy variables, but not report their estimated coefficients.{p_end} + +{p 4 10 8}{stata sysuse auto, clear}{p_end} +{p 4 10 8}{stata tab rep78, gen(repair)}{p_end} +{p 4 10 8}{stata regress mpg foreign weight repair1-repair4}{p_end} +{p 4 10 8}{stata outreg2 weight foreign using myfile, drop(repair*)}{p_end} + +{p 4 4 6}Alternatively, {opt keep( )} and {opt drop( )} can be used to control the displayed +variables. Use {opt nocons} to drop constants. + +{p 4 10 8}{stata outreg2 using myfile, drop(repair*) replace}{p_end} +{p 4 10 8}{stata outreg2 using myfile, keep(mpg foreign)}{p_end} +{p 4 10 8}{stata outreg2 using myfile, nocons}{p_end} +{p 4 10 8}{stata seeout}{p_end} + +{p 4 4 6}There are several ways to order variables in the output. The first is +to order them when running regression. The second way is to specify varlist +from within {cmd:outreg2}. Or you might try {opt sortvar( )} or {opt groupvar( )}.{p_end} + +{p 4 6 6}* single equation{p_end} +{p 4 10 8}{stata reg mpg rep78 head trunk weight}{p_end} +{p 4 10 8}{stata outreg2 using myfile, replace sortvar(trunk turn)}{p_end} +{p 4 10 8}{stata reg mpg rep78 head weight turn disp gear}{p_end} +{p 4 10 8}{stata outreg2 using myfile, sortvar(trunk turn) see}{p_end} + +{p 4 6 6}* multiple equations{p_end} +{p 4 10 8}{stata reg3 (mpg rep78 head trunk weight) (head trunk weight rep78 gear)}{p_end} +{p 4 10 8}{stata outreg2 using myfile, replace long}{p_end} +{p 4 10 8}{stata reg3 (mpg rep78 head weight turn disp ) (mpg rep78 head trunk weight gear)}{p_end} +{p 4 10 8}{stata outreg2 using myfile, sortvar(trunk turn) see long}{p_end} + +{p 4 6 6}* groupvar( ) will create super-rows{p_end} +{p 4 10 8}{stata reg mpg rep78 head trunk weight}{p_end} +{p 4 10 8}{stata outreg2 using myfile, replace}{p_end} +{p 4 10 8}{stata reg mpg rep78 head weight turn disp gear}{p_end} +{p 4 10 8}{stata outreg2 using myfile, groupvar(Group1 trunk turn head weight Group2) see}{p_end} + + +{marker s_9} +{title:Example 9. Adding r( ) e( ) scalars} + + +{p 4 4 6}Additional statistics may be added with {opt adds:tat( )} or {opt addt:ext( )}. Values stored in +macros r( ), e( ), or s( ) can be included directly. You can see what values are available by typing +{cmd:ereturn list} or {cmd:return list}.{p_end} + +{p 4 4 6}To test the equality of two of the estimated coefficients and report the results in the table, note +that {cmd:test} will sometimes return chi-squared, then you would instead use {opt addstat(chi-square test, r(chi2))}: +{p_end} + +{p 4 10 8}{stata reg mpg foreign weight length}{p_end} +{p 4 10 8}{stata test foreign length}{p_end} +{p 4 10 8}{stata `"outreg2 using myfile, adds(F-test, r(F), Prob > F, `r(p)') replace"'}{p_end} +{p 4 10 8}{stata seeout} {p_end} + +{p 4 4 6}To add results of lincom postestimation command to a table:{p_end} + +{p 4 10 8}{stata sysuse auto, clear}{p_end} +{p 4 10 8}{stata reg price mpg rep78 head}{p_end} +{p 4 10 8}{stata lincom mpg + rep}{p_end} +{p 4 10 8}{stata local tstat=r(estimate)/r(se)}{p_end} +{p 4 10 8}{stata local pval = tprob(r(df), abs(`tstat'))}{p_end} +{p 4 10 8}{stata outreg2 using "myfile", adds(joint, r(estimate), t-stat, `tstat', p-val,`pval') replace see}{p_end} + +{p 4 4 6}In some cases it is better to save the value of a previously calculated +statistic in a local macro and then put that into {opt adds:tat( )}:{p_end} + +{p 4 10 8}{stata regress mpg rep78 headroom}{p_end} +{p 4 10 8}{stata test rep78}{p_end} +{p 4 10 8}{stata local F1 = r(F)}{p_end} +{p 4 10 8}{stata test headroom}{p_end} +{p 4 10 8}{stata outreg2 using 2test, addstat(Test1 F, `F1', Test2 F, `r(F)')}{p_end} + +{p 4 4 6}If it is missing, {cmd:outreg2} will automatically calculate e(p), which is presumably +the F-test or chi-square-test of significance of a regression.{p_end} + +{p 4 10 8}{stata outreg2 using myfile, addstat(F test, e(p))}{p_end} + +{p 4 4 6}Another example would be to report a pseudo R-squared +after a logit estimation, which {cmd:outreg2} does not otherwise report.{p_end} + +{p 4 10 8}{stata logit foreign price trunk weight}{p_end} +{p 4 10 8}{stata outreg2 using myfile, addstat(Pseudo R-squared, `e(r2_p)')}{p_end} + + +{marker s_10} +{title:Example 10. Odds ratios and exponentials} + + +{p 4 4 6}Odds ratios are exponential transformations of coefficients. As noted above, +there is no way of knowing after an estimation command if the +user chose to report the exponentiated form of coefficients. The user must +choose the {opt eform} option in {cmd:outreg2} to get the same form of the coefficients +displayed by the estimation into the {cmd:outreg2} table.{p_end} + +{p 4 4 6}For duration models, the exponential form is known as the hazard ratio. For +other models it is known as odds ratio, relative risk ratio, or incidence rate +ratio.{p_end} + +{p 4 10 8}{stata sysuse auto,clear}{p_end} +{p 4 10 8}{stata logit foreign price mpg rep78, or}{p_end} +{p 4 10 8}{stata outreg2 using myfile, replace cti(raw)}{p_end} +{p 4 10 8}{stata outreg2 using myfile, eform cti(odds ratio) see}{p_end} + +{p 4 6 6}* Alternatively:{p_end} +{p 4 8 6}{stata outreg2 using myfile, stnum(replace coef=exp(coef), replace se=coef*se) cti(odds ratio) see}{p_end} + +{p 4 4 6}Note that coef was first transformed, then used to calculate se in the example above.{p_end} + + +{marker s_11} +{title:Example 11. Marginal Effects} + +{p 4 4 6}{opt mfx} option can be used to report marginal effects after {help mfx} command +has been applied.{p_end} +{p 4 10 8}{stata sysuse auto, clear}{p_end} +{p 4 10 8}{stata logit foreign mpg rep78 head}{p_end} +{p 4 10 8}{stata mfx compute}{p_end} +{p 4 10 8}{stata outreg2 using myfile, replace}{p_end} +{p 4 10 8}{stata outreg2 using myfile, mfx ctitle(mfx) see}{p_end} + +{p 4 4 6}{cmd:margins} will report it as well.{p_end} +{p 4 10 8}{stata sysuse auto, clear}{p_end} +{p 4 10 8}{stata logit foreign mpg rep78 head}{p_end} +{p 4 10 8}{stata margins, dydx(_all) post}{p_end} +{p 4 10 8}{stata outreg2 using myfile, ctitle(margins) see}{p_end} + +{p 4 4 6}For multiple outcomes, you may want to use {cmd:mfx2} by Ricahrd Williams or +{search margeff} by Tamas Bartus. They are both available from {help ssc}. {p_end} + +{p 4 4 6}{cmd:margeff} example:{p_end} +{p 4 10 8}{stata sysuse auto, clear}{p_end} +{p 4 10 8}{stata mlogit rep turn mpg price}{p_end} +{p 4 10 8}{stata margeff, at(mean) replace}{p_end} +{p 4 10 8}{stata outreg2 using myfile, cttop(margeff) see replace}{p_end} + +{p 4 4 6}{cmd:mfx2} runs a little slower:{p_end} +{p 4 10 8}{stata sysuse auto, clear}{p_end} +{p 4 10 8}{stata mlogit rep turn mpg price}{p_end} +{p 4 10 8}{stata mfx2, replace}{p_end} +{p 4 10 8}{stata outreg2 using myfile, long cttop(mfx2) see replace}{p_end} + +{p 4 4 6}The marginal effects reported by {search dprobit}, {net_d:dlogit2}, {net_d:dprobit2}, +and {search dmlogit2} are automatically reported by {cmd:outreg2}.{p_end} + +{p 4 4 6}Because {net_d:truncreg}, {net_d:marginal}, and {net_d:dtobit} report +both regression coefficients and marginal effects, the user must specify the +{opt margin} option for {cmd:outreg2} report the marginal effects.{p_end} + +{p 4 4 6}{search dtobit}, on the other hand, calculates three different marginal effects. +The user must specify which marginal effect, the unconditional, conditional, +or the probability uncensored, to be reported. Note that "version 6" must be set for +{cmd:dtobit} to work.{p_end} + +{p 4 10 8}{stata `"version 6: tobit mpg trunk weight, ll(17)"'}{p_end} +{p 4 10 8}{stata `"version 6: dtobit"'}{p_end} +{p 4 10 8}{stata outreg2 using myfile, margin(u) ctitle(Unconditional) nor2 replace}{p_end} +{p 4 10 8}{stata outreg2 using myfile, margin(c) ctitle(Conditional) nor2}{p_end} +{p 4 10 8}{stata outreg2 using myfile, margin(p) ctitle(Probability) nor2 see}{p_end} + + +{marker s_12} +{title:Example 12. Word or Excel files} + +{p 4 4 6} +Use {opt word} or {opt excel} for automatic generation of Word/Excel files: + +{p 4 10 8}{stata reg price mpg rep78 headroom trunk weight}{p_end} +{p 4 10 8}{stata outreg2 using myfile, word excel replace}{p_end} + +{p 4 4 6} +Follow these directions for manual conversions from .txt files: + +{p 4 4 6} +In {cmd:MS Word}, open or insert the file created by {cmd:outreg2}. Select the estimation text that +is in columns (not the notes at the bottom of the table or the title at the top, if any), and choose +Table, Convert Text to Table. + +{p 4 4 6}To shift the table within {cmd:MS Word}, highlight the entire table, choose Table +Properties (go the top menu, drag down on the Table option), and then click the alignment as +Left instead of Center. + +{p 4 4 6} +In {cmd:Excel}, open the file created by {cmd:outreg2} and follow the default choices +in the Text Import Wizard (if you do not see the file, choose All Files as the File Type). +Prevent the conversion of the parenthesis into a negative number (an accounting convention) +by doing the following: 1. import it as "Delimited", 2. choose Tab as the Delimiters, and +3. Choose "Text" as Column data format after Highlighting all the columns by shift-down, right-clicking. + +{p 4 4 6}To export the .xml table to a word processor, you should separately copy the table and the notes +at the bottom of the table (prevents the notes from taking up too much space). You +can avoid this problem by opening the .txt file manually from inside {cmd:MS Excel}, +as detailed earlier, or copy and paste the notes into another cells in +{cmd:MS Excel}, which will cause them to be displayed properly. + +{p 4 4 6}To get rid of "green tabs" in Excel: From inisde Excel, Tools > Options > Error Checking. +When you get there, uncheck "Number stored as text". No more green triangles. + +{p 4 4 6} +You can also use {cmd:{browse "http://www.stata.com/support/faqs/data/convert2.html":Stat/Transfer}} +if you have one. Choose ASCII-Delimited as the input file and choose {cmd:Excel} +as the output file. You will need to adjust the column widths from inside +{cmd:Excel}. + + +{marker s_13} +{title:Example 13. TeX files} + +{p 4 4 6} +{cmd:LaTeX} compatible table can be created with {opt tex} option. With the use +of free conversion software, such as MiKTeX, you can create Adobe PDF files of +the finished tables directly within Stata by invoking a shell command. + +{p 4 10 8}{stata regress mpg foreign weight}{p_end} +{p 4 10 8}{stata outreg2 using myfile, tex replace}{p_end} + +{p 4 4 6}Free TeX-to-PDF conversion software are available, such as the MiKTeX (www.miktek.org) for +Windows or teTeX (www.tug.org/teTeX/) for Unix/Linux. They can be invoked with a shell command:{p_end} + +{p 4 10 8}{stata !texify -p -c -b --run-viewer myfile.tex} {using MiKTeX on Windows){p_end} +{p 4 10 8}{stata !pdflatex myfile} (using teTeX on Linux){p_end} + +{p 4 4 6}{cmd:outreg2} cannot append TeX format tables to one another, so regressions must be +appended in ASCII form until the last regression, which is appended with the +{opt tex} option.{_end} + +{p 4 4 6}The base font point size of tex in a TeX table can be specified with the {opt tex( )} +parameter. TeX only allows font sizes of 10 and 11 points besides the default +of 12 point. The {opt texfrag} option creates a TeX fragment for inclusion in a larger +TeX document. For example, a TeX fragment table from the first regression above could be created with + +{p 4 10 8}{stata outreg2 using myfile, tex(frag)}{p_end} + +{p 4 4 6}and then be included in the following TeX document with the \input{myfile} +command:{p_end} + + \documentclass[10pt]{article} + \begin{document} + ... text before inclusion of table myfile.tex ... + \input{myfile} + ... text after inclusion of table myfile.tex ... + \end{document} + +{p 4 4 6}Technical Note: Non-alphanumeric characters often have special meaning +in TeX, namely _, %, #, $, &, ~, ^^, \, {, }. To print them like any other +character, include a \ in front of the character. {cmd:outreg2} automatically does this for +the first two, _ and %. You can include the other characters in titles, +variable labels, or notes if you preceed them with with a \ in the Stata text. +The exception is \ itself; \ must be replaced with $\backslash$ to render +properly in TeX. + +{p 4 4 6}In addition, in TeX the characters <, >, and | will only appear as themselves +in math mode, so they must be written as $<$, $>$, and $|$.{p_end} + +{p 4 4 6}TeX codes can be inserted into {cmd:outeg2} titles, variable labels, and added +notes. This requires understanding TeX formatting codes. The example below +creates a Greek letter chi with a squared exponent for a chi-squared test +statistic.{p_end} + +{p 4 10 8}{stata outreg2 using myfile, addstat($\chi^2$, 22.1) tex}{p_end} + +{p 4 4 6}Note that outreg2 will automatically convert < or > but not chi^2.{p_end} + +{p 4 10 8}{stata `"outreg2 using myfile, addstat(LR $\chi^2$, e(chi2), Prob < $\chi^2$, e(p)) tex"'}{p_end} + +{p 4 4 6}{cmd:outreg2} automatically converts _ to \_, except +when it finds two $'s in the text, in which case it assumes the _ is a +subscript designator in a TeX inline equation. That means that if you want to +add text that includes an inline equation, but you really want the _ to appear +as such in the TeX table, you must replace it with a \_.{p_end} + +{p 4 4 6}Stata will interpret $ immediately followed by a letter as a global macro. To +get Stata to output a literal $, insert an escape character "\" like this: \$. +R-squared, for example, must be "\$R^2$" rather than "$R^2$" because $R would be evaluated +as the value of global macro R.{p_end} + +{p 4 4 6}Putting a literal "$" in TeX output can be confusing: to get "$US" in the TeX +output, for example, one needs "\$US" in the TeX input file, which requires +"\\\$US" in Stata text, because Stata resolves "\\" into "\" and "\$" into "$".{p_end} + +{p 4 4 6}A final quirk: you cannot use the results of the Stata macro $S_FN in {cmd:outreg2} +text for a TeX table if you use Microsoft Windows. $S_FN returns the path name +for the current data file which in Windows includes \ characters which will +prevent the TeX table from rendering properly.{p_end} + + +{marker s_14} +{title:Example 14. Adding column titles or notes} + + +{p 4 4 6}You can add a column title "Base case (mpg)" to distinguish this regression from a +second regression. No quotation marks are required around the column title because +it does not contain commas. Use {opt cttop( )} to add additional column title to the default column titles.{p_end} + +{p 4 10 8}{stata outreg2 using myfile, replace ctitle(Base case (mpg))}{p_end} +{p 4 10 8}{stata outreg2 using myfile, cttop(On top)}{p_end} + +{p 4 4 6}You can add explanatory note at the bottom of a column using the {opt addn:ote} option. +Note that since the text in {opt addn:ote} does not contain parentheses or commas +it does not need quotation marks.{p_end} + +{p 4 10 8}{stata outreg2 using myfile, addnote(Dummy variables not shown)} {p_end} + +{p 4 4 6}{opt addnote} for inserting a blank line, followed by the time the program was run (from the +built-in Stata functions $S_TIME and $S_DATE), and the dataset used by the +estimation (from the Stata function $S_FN).{p_end} + +{p 4 10 8}{stata regress mpg foreign weight length}{p_end} +{p 4 10 8}{stata `"outreg2 using myfile, addn("", "Time $S_TIME, $S_DATE", Data from $S_FN) replace"'} {p_end} + + +{marker s_15} +{title:Example 15. n-way cross-tabulation} + +{p 4 4 6}n-way tabulation likes of which are also produced by tab3way or table. It will take about a minute to run.{p_end} + +{p 4 6 6}* Prepare data{p_end} +{p 4 10 8}{stata sysuse auto, clear}{p_end} +{p 4 10 8}{stata egen mileage=cut(mpg), group(10)}{p_end} +{p 4 10 8}{stata egen paid=cut(price), group(3)}{p_end} +{p 4 10 8}{stata egen heavy=cut(weight), group(3)}{p_end} + +{p 4 6 6}* 3-way cross-tabulation sideway{p_end} +{p 4 10 8}{stata outreg2 mileage paid heavy using myfile, see replace cross side}{p_end} + +{p 4 6 6}* 5-way cross-tabulation without percentage{p_end} +{p 4 10 8}{stata outreg2 mileage paid foreign rep78 heavy using myfile, see replace cross stats(coef)}{p_end} + + +{marker s_16} +{title:Example 16. Group summary table} + +{p 4 10 8}{stata sysuse auto, clear}{p_end} +{p 4 10 8}{stata gen white=cond(uniform( )>.5,1,0)}{p_end} +{p 4 10 8}{stata gen black=cond(white==1,0,1)}{p_end} +{p 4 10 8}{stata gen male=cond(uniform( )>.5,1,0)}{p_end} +{p 4 10 8}{stata gen female=cond(male==1,0,1)}{p_end} + +{p 4 8 8}* do it with -bys:-{p_end} +{p 4 10 8}{stata `"bys male black: outreg2 using myfile, sum(log) eqkeep(mean N) drop(white female male black) excel replace"'}{p_end} + +{p 4 8 8}* do it by hand{p_end} +{p 4 10 8}{stata outreg2 using myfile if white==1 & male==1, sum(log) eqkeep(mean N) cttop(white, male) drop(white male female) excel replace}{p_end} +{p 4 10 8}{stata outreg2 using myfile if white==1 & female==1, sum(log) eqkeep(mean N) cttop( , female) drop(white male female) excel}{p_end} +{p 4 10 8}{stata outreg2 using myfile if white==1, sum(log) eqkeep(mean N) cttop( , total) drop(white male female) excel}{p_end} +{p 4 10 8}{stata outreg2 using myfile if black==1 & male==1, sum(log) eqkeep(mean N) cttop(black, male) drop(white male female) excel}{p_end} +{p 4 10 8}{stata outreg2 using myfile if black==1 & female==1, sum(log) eqkeep(mean N) cttop( , female) drop(white male female) excel}{p_end} +{p 4 10 8}{stata outreg2 using myfile if black==1, sum(log) eqkeep(mean N) cttop( , total) drop(white male female) excel}{p_end} + + +{marker s_17} +{title:Example 17. Fixed effects or legends} + +{p 4 4 6}Two-way fixed-effects estimation with dummy indicators:{p_end} + +{p 4 6 6}* set up data{p_end} +{p 4 10 8}{stata sysuse auto, clear}{p_end} +{p 4 10 8}{stata ren rep78 state}{p_end} +{p 4 10 8}{stata ren turn id}{p_end} +{p 4 10 8}{stata keep id price mpg weight state}{p_end} +{p 4 10 8}{stata tab state, gen(ST)}{p_end} + +{p 4 6 6}* regress and report{p_end} +{p 4 10 8}{stata xtreg price mpg weight ST*, fe i(id)}{p_end} +{p 4 10 8}{stata outreg2 using myfile, replace drop(ST*) addtext(State FE, YES, Year FE, YES)}{p_end} +{p 4 10 8}{stata xtreg price mpg weight ST*, fe i(id)}{p_end} +{p 4 10 8}{stata outreg2 using myfile, drop(ST*) addtext(State FE, NO, Year FE, YES)}{p_end} +{p 4 10 8}{stata reg price mpg weight ST*}{p_end} +{p 4 10 8}{stata outreg2 using myfile, drop(ST*) addtext(State FE, NO, Year FE, NO)}{p_end} + +{p 4 6 6}* legend{p_end} +{p 4 10 8}{stata outreg2 using myfile, st(str(Coef) str(Stn Err) str(Spearman)) noparen ct(Legend) replace}{p_end} +{p 4 10 8}{stata outreg2 using myfile, st(coef se spearman blank)}{p_end} + + +{marker s_19} +{title:Example 19. Matching policy variables across regressions} + +{p 4 10 8}The following matches the variables of interest as "Policy" and their names in the column title.{p_end} + +{p 4 10 8}sysuse auto, clear{p_end} +{p 4 10 8}local replace replace{p_end} +{p 4 10 8}foreach var in length turn displacement {{p_end} +{p 4 10 8}reg price weight gear_ratio foreign `var'{p_end} +{p 8 10 8} outreg2 using this, `replace' policy(`var') sortvar(Policy) {p_end} +{p 8 10 8} local replace {p_end} +{p 4 10 8}}{p_end} + + +{marker s_18} +{title:Example 18. Stats transformation/manipulation} + +{p 4 4 6}The contents of {cmd:stats( )} can be manipuated with standard Stata commands.{p_end} + +{p 4 4 6}Use {opt stnum( )} to work with {it:numerical} forms.{p_end} + +{p 4 4 8}* multiply by 100{p_end} +{p 4 10 8}{stata sysuse auto, clear}{p_end} +{p 4 10 8}{stata reg mpg price weight}{p_end} +{p 4 10 8}{stata outreg2 using myfile, replace}{p_end} +{p 4 10 8}{stata outreg2 using myfile, stats(coef se) stnum(replace coef=coef*100, replace se=se*100)}{p_end} + +{p 4 4 8}* exponentiate both coef and se{p_end} +{p 4 10 8}{stata outreg2 using myfile, stats(coef se) stnum(replace coef=exp(coef), replace se=coef*se)}{p_end} + +{p 4 4 8}* absolute value of t-statistics{p_end} +{p 4 10 8}{stata outreg2 using myfile, stats(coef tstat) stnum(replace tstat=abs(tstat))}{p_end} + + +{p 4 4 6}Use {opt ststr( )} to apply {it:string} operations.{p_end} + +{p 4 4 8}* add dollar-sign ($) for the mean of price{p_end} +{p 4 10 8}{stata reg mpg price weight}{p_end} +{p 4 10 8}{stata outreg2 using myfile, stats(mean) ststr(replace mean="$"+mean if varname=="price") replace}{p_end} + +{p 4 4 8}* add "max" to maximum and "min" to minimum{p_end} +{p 4 10 8}{stata outreg2 using myfile, stats(max min) ststr(replace max="max "+max if max~="", replace min="min "+min if min~="")}{p_end} + + +{p 4 4 6}Use {opt stnum( )} and {opt ststr( )} together.{p_end} + +{p 4 4 8}* multiply by 100 and add percent (%) sign{p_end} +{p 4 10 8}{stata outreg2 using myfile, stats(mean) stnum(replace mean=mean*100) ststr(replace mean=mean+" %" if mean~="")}{p_end} + +{p 4 6 6}* You can automate this process by writing your own programs and inserting them like this:{p_end} + +{p 4 10 8}prog drop _all{p_end} +{p 4 10 8}prog define percent{p_end} +{p 8 12 10} replace mean=mean*100{p_end} +{p 4 10 8}end{p_end} + +{p 4 10 8}prog define symbol{p_end} +{p 8 12 10} replace mean=mean+" %" if mean~=""{p_end} +{p 4 10 8}end{p_end} + +{p 4 10 8}outreg2 using myfile, stats(mean) stnum(percent) ststr(symbol){p_end} + + +{p 4 4 8}* To manipuate string based on numerical content, generate a numerical copy in stnum( ):{p_end} +{p 4 10 8}{stata outreg2 using myfile, stats(mean) stnum(gen temp=mean) ststr(replace mean="Positive" if temp>0)}{p_end} + + +{p 4 4 8}* To concatenate (currently works only with major statistics, i.e. coef, se, tstat, etc.:{p_end} +{p 4 10 8}{stata outreg2 using myfile, stats(coef) ststr(replace coef=coef+" "+se) noaster}{p_end} + + +{marker s_20} +{title:Example 20. Insert r-class cmd( ) outputs} + +{p 4 4 6}You can insert output from r-class command in the table body through cmd( : ) sub-option. Indep and dependent +variables will be fed to them.{p_end} + +{p 4 6 6}* outputs Kendall's tau-a and tau-b{p_end} +{p 4 4 6}sysuse auto, clear{p_end} +{p 4 4 6}reg rep78 headroom length turn gear_ratio{p_end} +{p 4 10 8}outreg2 using myfile, replace stats(corr, spearman, cmd(r(tau_a): ktau), /*{p_end} +{p 12 12 8}*/cmd(r(tau_b): ktau)){p_end} + +{p 4 6 6}* double-check{p_end} +{p 4 4 6}ktau rep78 headroom{p_end} +{p 4 4 6}ret list{p_end} + + +{p 4 4 6}{ul:Write and insert your own r-class output} + +{p 4 4 6}You can write your own r-class program and insert their outputs. A scalar should be returned +on two inputs: independent variable and dependent variable. It needs to accept [if] syntax. +c_local programs will work, too, but there might be a conflict.{p_end} + +{p 4 6 6}* r-class program that calculates coefficient of variation{p_end} +{p 4 4 6}cap prog drop coefvar{p_end} +{p 4 4 6}prog define coefvar, rclass{p_end} +{p 8 8 8}syntax varlist(max=2) [if]{p_end} +{p 8 8 8}gettoken dep indep : varlist{p_end} +{p 8 8 8}qui sum `indep' `if'{p_end} +{p 8 8 8}local variation=`r(sd)'/`r(mean)'*100{p_end} +{p 8 8 8}ret scalar variation=`variation'{p_end} +{p 4 4 6}end{p_end} + +{p 4 6 6}* test your r-class program{p_end} +{p 4 4 6}sysuse auto, clear{p_end} +{p 4 4 6}reg rep78 headroom length turn gear_ratio{p_end} +{p 4 4 6}coefvar rep78 headroom if e(sample){p_end} +{p 4 4 6}ret list{p_end} + +{p 4 6 6}* run them{p_end} +{p 4 4 6}sysuse auto, clear{p_end} +{p 4 4 6}reg rep78 headroom length turn gear_ratio{p_end} +{p 4 4 6}outreg2 using myfile, replace stats(coef, se, sd, cmd(r(variation): coefvar)){p_end} + + +{p 4 6 6}* return c_local instead of r-class scalar{p_end} +{p 4 4 6}cap prog drop coefvar2{p_end} +{p 4 4 6}prog define coefvar2{p_end} +{p 8 8 8}syntax varlist(max=2) [if], [proportion]{p_end} +{p 8 8 8}gettoken dep indep : varlist{p_end} +{p 8 8 8}qui sum `indep' `if'{p_end} +{p 8 8 8}local hundred 100{p_end} +{p 8 8 8}if "`proportion'"=="proportion" {{p_end} +{p 12 12 8}local hundred 1{p_end} +{p 8 8 8}}{p_end} +{p 8 8 8}local variation=`r(sd)'/`r(mean)'*`hundred'{p_end} +{p 8 8 8} c_local variation=`variation'{p_end} +{p 4 4 6}end{p_end} + +{p 4 6 6}* run them{p_end} +{p 4 4 6}sysuse auto, clear{p_end} +{p 4 4 6}reg rep78 headroom length turn gear_ratio{p_end} +{p 4 4 6}outreg2 using myfile, stats(coef, se, sd, cmd(variation: coefvar2, proportion)){p_end} + + +{title:Send one to the e-mail address below} + +{p 4 4 6}Programs like these can made into a sub-option for inclusion the future versions. +Please note that it should be something of interest to other people.{p_end} + + +{hline} + + +{title:How to report a possible error} + +{p 4 4 6}1. it's best if you send an example using -sysuse- or -webuse- data{p_end} +{p 4 4 6}2. create a trace log file containing the error{p_end} +{p 4 4 6}3. Send them to whoever wrote the thing and ask nicely.{p_end} + + cap log close + log using mylog.txt, text replace + which outreg2 /* or whatever command you are dealing with */ + cret list + sysuse auto, clear /* or whatever data you are using */ + reg rep78 trunk turn foreign /* or whatever you are doing */ + set trace on + outreg2 using myfile, replace /* or whatever that gets you the error */ + log close + + +{hline} + +{marker s_FAQ} +{title:Frequently asked questions} + +{p 4 7 8}Q: Why isn't adoupdate working with {helpb outreg2}?{p_end} +{p 4 7 8}A: Stata will refuse to update a package if it is incorrectly dated, i.e., backdated at the SSC. +This has been fixed. To force it to update, you would had to uninstall first (scc uninstall outreg2).{p_end} + +{p 4 7 8}Q: How do I report the first-stage from {helpb ivregress}?{p_end} +{p 4 7 8}A: This has been the most frequently asked question with outreg2. What had been requested was a full +compatibility with the rest of Stata, i.e., factor variables, post estimation commands, etc. This was impletemented +for the first time by {helpb ivregress2}, which was the first to extend the official version in about 5 or 6 years.{p_end} + +{p 4 7 8}Q: What error is "could not be openend r(603)"?{p_end} +{p 4 7 8}A: That usually comes up if you don't have write-acces to the folder. Use -cd- to change the pathway.{p_end} + +{p 4 7 8}Q: Should I use LaTeX?{p_end} +{p 4 7 8}A: You are probably better off with Word/Adobe conversion to pdf. Most people do it that way. +LaTeX is great if you actually write lots of equations or white papers - only a small percentage of Stata users do that.{p_end} + +{p 4 7 8}Q: Can I use Stata with Excel? Windows? {p_end} +{p 4 7 8}A: Virutally all empirical researchers use Excel. Stata grew up with PC. Microsoft Office is currently the +defacto standard in academia. I am not sure why this was an issue.{p_end} + + +{marker s_Terms} +{title:Terms of use} + +{p 4 4 6}In my experience economists, particularily health economists, are very generous with their time +and resources. We often share codes and data sets, some of which are very rare and valuable. We do this out of +a sense of professional obligation or desire to help facilitate research. We don't do this to provide material to someone +with a long history of shifting through existing programs, claiming something is not needed after he extracted +seomthing from it. The program is free to use but may not be republished under false pretense. That is not a part +of acceptable use.{p_end} + + +{title:Author} + +{p 4 4 6}Roy Wada{p_end} +{p 4 4 6}roywada@hotmail.com{p_end} + + +{title:Acknowledgements} + +{p 4 4 6}outreg2 is based on the earlier works by John Luke Gallup john_gallup@alum.swarthmore.edu{p_end} +{p 4 4 6}codes from pcorr2 by Richard Williams have been incorporated for stats( ) suboption.{p_end} + + +{title:Also see} + +{p 3}STB: sg97 (STB-46, STB-49, STB-58){p_end} +{p}Manual: {bf:[U] Estimation and post-estimation commands}{p_end} +{p 9}{bf:[U] Overview of model estimation}{p_end} +{p 9}{bf:[R] Estimation commands}{p_end} + +{p }Online: {help est}, {help postfile}, {help outfile}, {help outsheet}, {help save}, +{search modltbl}, {search desrep} {p_end} + +{s6hlp} +{smcl} + + + + diff --git a/ado/o/outreg2.pref b/ado/o/outreg2.pref new file mode 100644 index 0000000..af05344 --- /dev/null +++ b/ado/o/outreg2.pref @@ -0,0 +1,3 @@ +25 Sep 2024 +using `"/Users/calebhf/Desktop/code/disrupting-educ-2/out/Tablestable8.xsls"' +label less(1) noaster \ No newline at end of file diff --git a/ado/o/outreg2_prf.ado b/ado/o/outreg2_prf.ado new file mode 100644 index 0000000..8e5c15a --- /dev/null +++ b/ado/o/outreg2_prf.ado @@ -0,0 +1,3 @@ +24 Oct 2005 +using "test.txt" +eform one less(2) diff --git a/ado/r/ranktest.ado b/ado/r/ranktest.ado new file mode 100644 index 0000000..53ccc3d --- /dev/null +++ b/ado/r/ranktest.ado @@ -0,0 +1,2676 @@ +*! ranktest 2.0.04 21sept2020 +*! authors mes & fw; KP stat based on code by fk +*! see end of file for version comments + +program define ranktest, rclass sortpreserve + + local lversion 02.0.04 + + if _caller() < 11 { + ranktest9 `0' + return add // otherwise all the ranktest9 results are zapped + return local ranktestcmd ranktest9 + return local cmd ranktest + return local version `lversion' + exit + } + else if _caller() < 13 { + ranktest11 `0' + return add // otherwise all the ranktest11 results are zapped + return local ranktestcmd ranktest11 + return local cmd ranktest + return local version `lversion' + exit + } + + version 13.1 + + if substr("`1'",1,1)== "," { + if "`2'"=="version" { + di in ye "`lversion'" + return local version `lversion' + exit + } + else { + di as err "ranktest error: invalid syntax" + exit 198 + } + } + + // If varlist 1 or varlist 2 have a single element, parentheses optional + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local y `s(varlist)' + local 0 `"`s(rest)'"' + sret clear + } + else { + local y `1' + mac shift 1 + local 0 `"`*'"' + } + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local z `s(varlist)' + local 0 `"`s(rest)'"' + sret clear + } + else { + local z `1' + mac shift 1 + // Need to reinsert comma before options (if any) for -syntax- command to work + local 0 `", `*'"' + } + + // y and z macros created, now ready to parse options + + // Option version ignored here if varlists were provided + syntax [if] [in] [aw fw pw iw/] /// + [, /// + partial(varlist ts fv) /// + NOConstant /// + center /// + wald /// + KP /// default + NOSVD /// override default use of SVD algorithm with KP + JGMM2s /// + Jcue /// + j2lr /// + j2l /// + LR /// for iid case only + small /// small-sample adjustment + jtol(real 1e-10) /// tolerance for change in J; Mata's default for vtol=1e-7 + btol(real 1e-5) /// tolerance for change in beta; Mata's default for ptol=1e-6 + binit(string) /// + NODOTS /// no dots for iterated cue; interchangable with notrace + tracelevel(string) /// trace level for numerical cue; "nodots" >= "none" + NOITERate /// + NOCOMBiter /// + NOCOLLIN /// + NOIID /// force use of robust code + ALLrank /// default + NULLrank /// + FULLrank /// + rr(integer 0) /// rank reduction + NOEVORDER /// overrides default of evorder for jcue and j2lr + NOSTD /// override default behaviour to standardize + kc(real 1e-08) /// adj if var(pihat) singular + maxiter(integer 100) /// + ROBust /// + cluster(varlist) /// + BW(string) /// + kernel(string) /// + Tvar(varname) /// + Ivar(varname) /// + h(name) /// xtabond2-related + hvar(varname) /// xtabond2-related + NOHMAT /// xtabond2-related - force ignore of h + sw /// + psd0 /// + psda /// + version /// + dofminus(integer 0) /// + ] + + + ******************** options *********************** + + // allow lower-case for string options + foreach opt in binit { + local `opt' =strlower("``opt''") + } + + // set flags based on options + local jflag ="`jcue'`j2l'`j2lr'`jgmm2s'"~="" + local jcueflag ="`jcue'"~="" + local j2lflag ="`j2l'"~="" + local j2lrflag ="`j2lr'"~="" + local jgmm2sflag ="`jgmm2s'"~="" + local kpflag ="`kp'"~="" | "`jcue'`j2l'`j2lr'`jgmm2s'"=="" + // h(.) is matrix used for first-step in xtabond2 estimation; relevant only for jgmm2s + local hflag ="`h'`hvar'"~="" & "`nohmat'"=="" + // use SVD for KP unless user specifies nosvd + local svdflag ="`nosvd'"=="" & `kpflag' + local consflag ="`noconstant'"=="" + local evorderflag ="`noevorder'"=="" + // non-invariant tests do not reorder + // nb: j2l and j2lr are invariant for fullrank (rr=1) + if `jgmm2sflag' { + local evorderflag = 0 + } + local stdflag ="`nostd'"=="" + local dotsflag =("`nodots'"=="") + if (`dotsflag'==0) & "`tracelevel'"=="" { + local tracelevel "none" + } + local allrankflag ="`allrank'"~="" + local nullrankflag ="`nullrank'"~="" + local fullrankflag ="`fullrank'"~="" + local iterateflag ="`noiterate'"=="" + local combiterflag ="`nocombiter'"=="" + local collinflag ="`nocollin'"=="" + local centerflag ="`center'"~="" + local smallflag ="`small'"~="" + local LMflag ="`wald'"=="" + local LRflag ="`lr'"~="" + // flag=1 if LIML as EV problem is ever required + local limlflag = `j2lflag' | `j2lrflag' | `svdflag' | "`binit'"=="liml" + + if "`nullrank'`fullrank'`allrank'" == "" { + // default + local allrankflag 1 + } + + // check options + // only 1 stat allowed + local statcount = `kpflag' + `jcueflag' + `j2lflag' + `j2lrflag' + `jgmm2sflag' + if `statcount'>1 { + di as err "ranktest error: incompatible options - `kp' `jcue' `j2l' `j2lr' `jgmm2s'" + exit 198 + } + // incompatible stats + if `LRflag' & ~`LMflag' { + di as err "ranktest error: incompatible options - wald and lr" + exit 198 + } + if "`binit'"~="" & "`binit'"~="liml" & "`binit'"~="2sls" { + di as err "ranktest error: unrecognized option binit(`binit')" + exit 198 + } + if `limlflag' & `hflag' { + di as err "ranktest error: H matrix option h(.) not supported when LIML obtained as an EV solution" + exit 198 + } + + local optct : word count `allrank' `nullrank' `fullrank' + if `optct' > 1 { + di as err "ranktest error: incompatible options `allrank' `nullrank' `fullrank'" + error 198 + } + else if `optct' == 0 { + // Default + local allrank "allrank" + } + + local optct : word count `psd0' `psda' + if `optct' > 1 { + di as err "ranktest error: incompatible options `psd0' `psda'" + error 198 + } + local psd "`psd0' `psda'" + local psd : list retokenize psd + + *********************** end options section ************************ + + marksample touse + markout `touse' `y' `z' `partial' `cluster', strok + + // Note that y or z could be e.g. "y1-y3", so they need to be unab-ed. + // fvunab ylist : `y' + fvexpand `y' if `touse' + local ylist `r(varlist)' + // fvunab zlist : `z' + fvexpand `z' if `touse' + local zlist `r(varlist)' + if "`ylist'"=="" | "`zlist'"=="" { + di as err "ranktest error: missing varlist" + exit 100 + } + if "`partial'"~="" { + // fvunab xlist : `partial' + fvexpand `partial' if `touse' + local xlist `r(varlist)' + } + + // Create tempvars; "rv" for "revar". Note that by revar-ing here, + // subsequent disruption to the sort doesn't matter for TS operators. + fvrevar `ylist' + local rvylist `r(varlist)' + fvrevar `zlist' + local rvzlist `r(varlist)' + fvrevar `xlist' + local rvxlist `r(varlist)' + + // Having created fvrevar tempvars, now remove factor variable base vars from y and z lists. + // Means they won't be reported as dropped collinear variables later. + cap _fv_check_depvar `ylist' + if _rc>0 { + fvstrip `ylist' if `touse', dropomit + local newylist `r(varlist)' + matchnames "`newylist'" "`ylist'" "`rvylist'" + // now replace + local rvylist `r(names)' + local ylist `newylist' + } + cap _fv_check_depvar `zlist' + if _rc>0 { + fvstrip `zlist' if `touse', dropomit + local newzlist `r(varlist)' + matchnames "`newzlist'" "`zlist'" "`rvzlist'" + // now replace + local rvzlist `r(names)' + local zlist `newzlist' + } + + // Stock-Watson and cluster imply robust. + if "`sw'`cluster'" ~= "" { + local robust "robust" + } + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + if "`fsqrt(wf)*(wvar^0.5):*'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "fweight" & "`sw'" != "" { + di in red "fweights currently not supported with -sw- option" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`bw'" !="" { + di in red "iweights not allowed with robust, cluster, AC or HAC" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { + // If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + + // Every time a weight is used, must multiply by scalar wf ("weight factor") + // wf=1 for no weights, fw and iw, wf = scalar that normalizes sum to be N if aw or pw + sum `wvar' if `touse' `wtexp', meanonly + // Weight statement + if "`weight'" ~= "" { + di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + if "`weight'"=="" | "`weight'"=="fweight" | "`weight'"=="iweight" { + // If weight is "", weight var must be column of ones and N is number of rows. + // With fw and iw, effective number of observations is sum of weight variable. + local wf=1 + local N=r(sum_w) + } + else if "`weight'"=="aweight" | "`weight'"=="pweight" { + // With aw and pw, N is number of obs, unadjusted. + local wf=r(N)/r(sum_w) + local N=r(N) + } + else { + // Should never reach here + di as err "ranktest error: misspecified weights" + exit 198 + } +****************************** last flag set here ******************************************************* + // ... since robust macro can be changed by weights + local iidflag = "`robust'`cluster'`kernel'`bw'"=="" & "`noiid'"=="" + + // update other flags based on iidflag + // unchanged: jgmm2sflag, LMflag, LRflag + if `iidflag' { + local svdflag = 0 + local kpflag = 0 + local jcueflag = 0 + local j2lrflag = 0 + local j2lflag = 0 + } + + if `LRflag' & ~`iidflag' { + di as err "LR option not available for robust tests" + exit 198 + } +****************************** last flag set here ******************************************************* + +* HAC estimation. +* If bw is omitted, default `bw' is empty string. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. + if "`bw'" == "" & "`kernel'" == "" { + local bw=0 + } + else { +* Need tvar for markout with time-series stuff +* Data must be tsset for time-series operators in code to work +* User-supplied tvar checked if consistent with tsset + capture tsset + if "`r(timevar)'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } +* If no panel data, ivar will still be empty + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already -tsset-" + exit 5 + } + local tdelta `r(tdelta)' + if "`ivar'"=="" { + qui tsreport if `touse' + } + else { + qui tsreport if `touse', panel + } + if `r(N_gaps)' != 0 { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + +* Check it's a valid kernel and replace with unabbreviated kernel name; check bw. +* Automatic kernel selection allowed by ivreg2 but not ranktest so must trap. +* s_vkernel is in livreg2 mlib. + if "`bw'"=="auto" { +di as err "invalid bandwidth in option bw() - must be real > 0" + exit 198 + } + mata: s_vkernel("`kernel'", "`bw'", "`ivar'") + local kernel `r(kernel)' + local bw = `r(bw)' + } + +* tdelta missing if version 9 or if not tsset + if "`tdelta'"=="" { + local tdelta=1 + } + + if "`sw'"~="" { + capture xtset + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already tsset or xtset" + exit 5 + } +* Exit with error if ivar is neither supplied nor tsset nor xtset + if "`ivar'"=="" { +di as err "Must -xtset- or -tsset- data or specify -ivar- with -sw- option" + exit 198 + } + qui describe, short varlist + local sortlist "`r(sortlist)'" + tokenize `sortlist' + if "`ivar'"~="`1'" { +di as err "Error - dataset must be sorted on panel var with -sw- option" + exit 198 + } + } + +* Create variable used for getting lags etc. in Mata + tempvar tindex + qui gen `tindex'=1 if `touse' + qui replace `tindex'=sum(`tindex') if `touse' + +********** CLUSTER SETUP ********************************************** + +* Mata code requires data are sorted on (1) the first var cluster if there +* is only one cluster var; (2) on the 3rd and then 1st if two-way clustering, +* unless (3) two-way clustering is combined with kernel option, in which case +* the data are tsset and sorted on panel id (first cluster variable) and time +* id (second cluster variable). +* Second cluster var is optional and requires an identifier numbered 1..N_clust2, +* unless combined with kernel option, in which case it's the time variable. +* Third cluster var is the intersection of 1 and 2, unless combined with kernel +* opt, in which case it's unnecessary. +* Sorting on "cluster3 cluster1" means that in Mata, panelsetup works for +* both, since cluster1 nests cluster3. +* Note that it is possible to cluster on time but not panel, in which case +* cluster1 is time, cluster2 is empty and data are sorted on panel-time. +* Note also that if data are sorted here but happen to be tsset, will need +* to be re-tsset after estimation code concludes. + + +// No cluster options or only 1-way clustering +// but for Mata and other purposes, set N_clust vars =0 + local N_clust=0 + local N_clust1=0 + local N_clust2=0 + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`kernel'"~="" { +* kernel requires either that cluster1 is time var and cluster2 is empty +* or that cluster1 is panel var and cluster2 is time var. +* Either way, data must be tsset and sorted for panel data. + if "`cluster2'"~="" { +* Allow backwards order + if "`cluster1'"=="`tvar'" & "`cluster2'"=="`ivar'" { + local cluster1 "`2'" + local cluster2 "`1'" + } + if "`cluster1'"~="`ivar'" | "`cluster2'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset panel & time vars." +di as err " tsset panel var=`ivar'; tsset time var=`tvar'; cluster vars=`cluster1',`cluster2'" + exit 198 + } + } + else { + if "`cluster1'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset time variable." +di as err " tsset time var=`tvar'; cluster var=`cluster1'" + exit 198 + } + } + } +* Simple way to get quick count of 1st cluster variable without disrupting sort +* clusterid1 is numbered 1.._Nclust1. + tempvar clusterid1 + qui egen `clusterid1'=group(`cluster1') if `touse' + sum `clusterid1' if `touse', meanonly + if "`cluster2'"=="" { + local N_clust=r(max) + local N_clust1=`N_clust' + if "`kernel'"=="" { +* Single level of clustering and no kernel-robust, so sort on single cluster var. +* kernel-robust already sorted via tsset. + sort `cluster1' + } + } + else { + local N_clust1=r(max) + if "`kernel'"=="" { + tempvar clusterid2 clusterid3 +* New cluster id vars are numbered 1..N_clust2 and 1..N_clust3 + qui egen `clusterid2'=group(`cluster2') if `touse' + qui egen `clusterid3'=group(`cluster1' `cluster2') if `touse' +* Two levels of clustering and no kernel-robust, so sort on cluster3/nested in/cluster1 +* kernel-robust already sorted via tsset. + sort `clusterid3' `cluster1' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) + } + else { +* Need to create this only to count the number of clusters + tempvar clusterid2 + qui egen `clusterid2'=group(`cluster2') if `touse' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) +* Now replace with original variable + local clusterid2 `cluster2' + } + + local N_clust=min(`N_clust1',`N_clust2') + + } // end 2-way cluster block + } // end cluster block + +****************************** TEST SUBROUTINE ********************************************************** +* Note that bw is passed as a value, not as a string + + mata: s_jstat( /// + "`ylist'", /// original varnames + "`zlist'", /// + "`xlist'", /// + "`rvylist'", /// tempvars for FV or TS operators + "`rvzlist'", /// created using fvrevar + "`rvxlist'", /// + "`wvar'", /// + "`weight'", /// + `wf', /// + `N', /// + `consflag', /// + "`touse'", /// + `iidflag', /// + `LMflag', /// + `LRflag', /// + `kpflag', /// + `svdflag', /// + `jcueflag', /// + `jgmm2sflag', /// + `j2lrflag', /// + `j2lflag', /// + `evorderflag', /// + `stdflag', /// + `dotsflag', /// + "`tracelevel'", /// + `jtol', /// + `btol', /// + "`binit'", /// + `maxiter', /// + `iterateflag', /// + `combiterflag', /// + `collinflag', /// + `kc', /// + "`allrank'", /// + "`nullrank'", /// + "`fullrank'", /// + `rr', /// + "`robust'", /// + "`clusterid1'", /// + "`clusterid2'", /// + "`clusterid3'", /// + `bw', /// + "`tvar'", /// + "`ivar'", /// + "`tindex'", /// + `tdelta', /// + `centerflag', /// + `smallflag', /// + `dofminus', /// + "`kernel'", /// + "`sw'", /// + "`psd'", /// + `hflag', /// + "`h'", /// + "`hvar'" /// + ) + + tempname rkmatrix chi2 df df_r p rank ccorr eval b b0 K1 K2 K3 V S + mat `rkmatrix' = r(rkmatrix) + mat `ccorr' = r(ccorr) + mat `eval' = r(eval) + mat colnames `rkmatrix' = "rk" "df" "p" "rank" "eval" "ccorr" + local ynocollin `r(ynocollin)' + local znocollin `r(znocollin)' + local ycollin `r(ycollin)' + local zcollin `r(zcollin)' + mat `b' = r(b) + mat `b0' = r(b0) + mat `V' = r(V) + mat `S' = r(S) + local depvar `r(depvar)' + local endog `r(endog)' + local exexog `r(exexog)' + scalar `K3' = r(K3) + scalar `K2' = r(K2) + scalar `K1' = r(K1) + +*************************** REPORT RESULTS **************************** + + // report output + di + + // messages saved for later posting in r(.) macros + + // LM (default) or Wald + if `LRflag' { + local testtype "LR" + } + else if `LMflag' { + local testtype "LM" + } + else { + local testtype "Wald" + } + + // iid cases + if `iidflag' { + if `jgmm2sflag' { + local testdesc "2SLS-based (`testtype' version)" + di as text _c "`testdesc'" + } + else if `LRflag' { + local testdesc "Anderson canonical correlations LR" + di in smcl _c "{help ranktest##CCiid:`testdesc'}" + } + else if `LMflag' { + local testdesc "Anderson canonical correlations LM" + di in smcl _c "{help ranktest##CCiid:`testdesc'}" + } + else { + local testdesc "Cragg-Donald Wald" + di in smcl _c "{help ranktest##CDiid:`testdesc'}" + } + } + // non-iid cases + else { + if `kpflag' { + local testdesc "Kleibergen-Paap robust LIML-based (`testtype' version)" + di in smcl _c "{help ranktest##KProbust:`testdesc'}" + } + else if `jcueflag' { + local testdesc "Cragg-Donald robust CUE-based (`testtype' version)" + di in smcl _c "{help ranktest##CDrobust:`testdesc'}" + } + else if `j2lrflag' { + local testdesc "Windmeijer robust J2LR LIML-based (`testtype' version)" + di in smcl _c "{help ranktest##CDrobust:`testdesc'}" + } + else if `j2lflag' { + local testdesc "Windmeijer robust J2L LIML-based (`testtype' version)" + di in smcl _c "{help ranktest##CDrobust:`testdesc'}" + } + else if `jgmm2sflag' { + local testdesc "2-step-GMM-based (`testtype' version)" + di in smcl _c "{help ranktest##CDrobust:`testdesc'}" + } + else { + local testdesc "(internal ranktest error - test name not indicated)" + } + } + // complete the sentence + di as text " test of rank of matrix" + + if "`robust'"~="" & "`kernel'"~= "" & "`cluster'"=="" { + local vcedesc1 " Test statistic robust to heteroskedasticity and autocorrelation" + local vcedesc2 " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`kernel'"~="" & "`cluster'"=="" { + local vcedesc1 " Test statistic robust to autocorrelation" + local vcedesc2 " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`cluster'"~="" { + local vcedesc1 " Test statistic robust to heteroskedasticity and clustering on `cluster'" + if "`kernel'"~="" { + local vcedesc2 " and kernel-robust to common correlated disturbances" + local vcedesc3 " Kernel: `kernel' Bandwidth: `bw'" + } + } + else if "`robust'"~="" { + local vcedesc1 " Test statistic robust to heteroskedasticity" + } + else { + local vcedesc1 " Test consistent for homoskedasticity only" + } + + di as text "`vcedesc1'" + if "`vcedesc2'"~="" { + di as text "`vcedesc2'" + } + if "`vcedesc3'"~="" { + di as text "`vcedesc3'" + } + + local numtests = rowsof(`rkmatrix') + forvalues i=1(1)`numtests' { + di as text "Test of rank=" as res %3.0f `rkmatrix'[`i',4] as text " rk=" as res %8.2f `rkmatrix'[`i',1] /* + */ as text " Chi-sq(" as res %3.0f `rkmatrix'[`i',2] as text ") p-value=" as res %6.4f `rkmatrix'[`i',3] + } + scalar `chi2' = `rkmatrix'[`numtests',1] + scalar `p' = `rkmatrix'[`numtests',3] + scalar `df' = `rkmatrix'[`numtests',2] + scalar `rank' = `rkmatrix'[`numtests',4] + local N `r(N)' + return scalar cons = `consflag' + return scalar df = `df' + return scalar chi2 = `chi2' + return scalar p = `p' + return scalar rank = `rank' + return scalar K3 = `K3' + return scalar K1 = `K1' + return scalar K2 = `K2' + if "`cluster'"~="" { + return scalar N_clust = `N_clust' + } + if "`cluster2'"~="" { + return scalar N_clust1 = `N_clust1' + return scalar N_clust2 = `N_clust2' + } + return scalar N = `N' + return matrix rkmatrix `rkmatrix' + return matrix ccorr `ccorr' + return matrix eval `eval' + if `rr' { + return scalar rr = `rr' + } + + tempname Omega + if `K1' > 1 { + // use ynocollin and znocollin (instead of y and z), in case any collinearities dropped + foreach en of local ynocollin { + // Remove "." from equation name + local en1 : subinstr local en "." "_", all + foreach vn of local znocollin { + local cn "`cn' `en1':`vn'" + } + } + } + else { + foreach vn of local znocollin { + local cn "`cn' `vn'" + } + } + + if `b'[1,1] ~= . { + return matrix b0 `b0' + return matrix b `b' + return matrix V `V' + return matrix S `S' + return local depvar `depvar' + return local endog `endog' + return local exexog `exexog' + } + else if `kpflag' | `iidflag' { + return matrix V `V' + return matrix S `S' + } + else { + return matrix S `S' + } + return local collin `ycollin' `zcollin' + return local partial `xlist' + // return local varlist3 `xlist' + return local varlist2 `zlist' + return local varlist1 `ylist' + + return local vcedesc3 `vcedesc3' + return local vcedesc2 `vcedesc2' + return local vcedesc1 `vcedesc1' + return local testdesc `testdesc' + + local method `kp' `jcue' `j2l' `j2lr' `jgmm2s' + local method : list clean method + + return local small `small' + return local testtype `testtype' + return local method `method' + return local ranktestcmd ranktest + return local cmd ranktest + return local version `lversion' +end + + +// internal version of fvstrip 1.01 ms 24march2015 +// takes varlist with possible FVs and strips out b/n/o notation +// returns results in r(varnames) +// optionally also omits omittable FVs +// expand calls fvexpand either on full varlist +// or (with onebyone option) on elements of varlist +program define fvstrip, rclass + version 11.2 + syntax [anything] [if] , [ dropomit expand onebyone NOIsily ] + if "`expand'"~="" { // force call to fvexpand + if "`onebyone'"=="" { + fvexpand `anything' `if' // single call to fvexpand + local anything `r(varlist)' + } + else { + foreach vn of local anything { + fvexpand `vn' `if' // call fvexpand on items one-by-one + local newlist `newlist' `r(varlist)' + } + local anything : list clean newlist + } + } + foreach vn of local anything { // loop through varnames + if "`dropomit'"~="" { // check & include only if + _ms_parse_parts `vn' // not omitted (b. or o.) + if ~`r(omit)' { + local unstripped `unstripped' `vn' // add to list only if not omitted + } + } + else { // add varname to list even if + local unstripped `unstripped' `vn' // could be omitted (b. or o.) + } + } +// Now create list with b/n/o stripped out + foreach vn of local unstripped { + local svn "" // initialize + _ms_parse_parts `vn' + if "`r(type)'"=="variable" & "`r(op)'"=="" { // simplest case - no change + local svn `vn' + } + else if "`r(type)'"=="variable" & "`r(op)'"=="o" { // next simplest case - o.varname => varname + local svn `r(name)' + } + else if "`r(type)'"=="variable" { // has other operators so strip o but leave . + local op `r(op)' + local op : subinstr local op "o" "", all + local svn `op'.`r(name)' + } + else if "`r(type)'"=="factor" { // simple factor variable + local op `r(op)' + local op : subinstr local op "b" "", all + local op : subinstr local op "n" "", all + local op : subinstr local op "o" "", all + local svn `op'.`r(name)' // operator + . + varname + } + else if"`r(type)'"=="interaction" { // multiple variables + forvalues i=1/`r(k_names)' { + local op `r(op`i')' + local op : subinstr local op "b" "", all + local op : subinstr local op "n" "", all + local op : subinstr local op "o" "", all + local opv `op'.`r(name`i')' // operator + . + varname + if `i'==1 { + local svn `opv' + } + else { + local svn `svn'#`opv' + } + } + } + else if "`r(type)'"=="product" { + di as err "fvstrip error - type=product for `vn'" + exit 198 + } + else if "`r(type)'"=="error" { + di as err "fvstrip error - type=error for `vn'" + exit 198 + } + else { + di as err "fvstrip error - unknown type for `vn'" + exit 198 + } + local stripped `stripped' `svn' + } + local stripped : list retokenize stripped // clean any extra spaces + + if "`noisily'"~="" { // for debugging etc. +di as result "`stripped'" + } + + return local varlist `stripped' // return results in r(varlist) +end + + +// Internal version of matchnames +// Sample syntax: +// matchnames "`varlist'" "`list1'" "`list2'" +// takes list in `varlist', looks up in `list1', returns entries in `list2', called r(names) +program define matchnames, rclass + version 11.2 + args varnames namelist1 namelist2 + + local k1 : word count `namelist1' + local k2 : word count `namelist2' + + if `k1' ~= `k2' { + di as err "namelist error" + exit 198 + } + foreach vn in `varnames' { + local i : list posof `"`vn'"' in namelist1 + if `i' > 0 { + local newname : word `i' of `namelist2' + } + else { +* Keep old name if not found in list + local newname "`vn'" + } + local names "`names' `newname'" + } + local names : list clean names + return local names "`names'" +end + +* Adopted from -canon- +program define GetVarlist, sclass + version 11.2 + sret clear + gettoken open 0 : 0, parse("(") + if `"`open'"' != "(" { + error 198 + } + gettoken next 0 : 0, parse(")") + while `"`next'"' != ")" { + if `"`next'"'=="" { + error 198 + } + local list `list'`next' + gettoken next 0 : 0, parse(")") + } + sret local rest `"`0'"' + tokenize `list' + local 0 `*' + sret local varlist "`0'" +end + +********************* EXIT IF STATA VERSION < 13 ******************************** + +* When do file is loaded, exit here if Stata version calling program is < 12. +* Prevents loading of rest of program file (would cause e.g. Stata 10 to crash at Mata). + +if c(stata_version) < 13 { + exit +} + +******************** END EXIT IF STATA VERSION < 13 ***************************** + +******************************************************************************* +*************************** BEGIN MATA CODE *********************************** +******************************************************************************* + +version 13.1 +mata: + +// ********* MATA CODE SHARED BY ivreg2 AND ranktest *************** // +// ********* 1. struct ms_vcvorthog *************** // +// ********* 2. m_omega *************** // +// ********* 3. m_calckw *************** // +// ********* 4. s_vkernel *************** // +// *********************************************************************** // + +// For reference: +// struct ms_vcvorthog { +// string scalar ename, Znames, touse, weight, wvarname +// string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel +// string scalar sw, psd, ivarname, tvarname, tindexname +// real scalar wf, N, bw, tdelta, dofminus +// real scalar center +// real matrix ZZ +// pointer matrix e +// pointer matrix Z +// pointer matrix wvar +// } + +struct ms_jresult { + real scalar j + real matrix beta + real matrix beta0 + real scalar pvalue + real scalar df + real matrix V + real matrix S +} + +struct ms_jargs { + pointer matrix pvy1 + pointer matrix pvy2 + pointer matrix py1 + pointer matrix py2 + pointer matrix pz + pointer matrix pz_kron + real scalar K1 + real scalar K2 + real scalar ii + real scalar kk + real matrix Qzz + real matrix Qzz_kron + real matrix Qzy1 + real matrix Qzy2 + real scalar N + real scalar Nminus + real scalar hflag + real matrix Hmat + real matrix hvar + real matrix info + real matrix sigma2 + real scalar btol + real scalar jtol + real scalar maxiter + string scalar tracelevel + real scalar dotsflag +} + +void s_jstat( + string scalar ylist, // tokens with original varnames + string scalar zlist, // can include TS or FV operators + string scalar xlist, // X = to be partialled-out + string scalar rvylist, // TS or FV vars replaced with temps + string scalar rvzlist, // using fvrevar + string scalar rvxlist, + string scalar wvarname, + string scalar weight, + scalar wf, + scalar N, + scalar cons, + string scalar touse, + scalar iidflag, + scalar LMflag, + scalar LRflag, + scalar kpflag, + scalar svdflag, + scalar jcueflag, + scalar jgmm2sflag, + scalar j2lrflag, + scalar j2lflag, + scalar evorderflag, + scalar stdflag, + scalar dotsflag, + string scalar tracelevel, + scalar jtol, + scalar btol, + string scalar binit, + scalar maxiter, + scalar iterateflag, + scalar combiterflag, + scalar collinflag, + scalar kc, + string scalar allrank, + string scalar nullrank, + string scalar fullrank, + scalar rr, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + bw, + string scalar tvarname, + string scalar ivarname, + string scalar tindexname, + tdelta, + scalar centerflag, + scalar smallflag, + dofminus, + string scalar kernel, + string scalar sw, + string scalar psd, + scalar hflag, + string scalar hname, + string scalar hvarname + ) +{ + + // tokens with original variable names + ytokens=tokens(ylist) + ztokens=tokens(zlist) + xtokens=tokens(xlist) + + // tokens with names of variables to use + // TS or FV variables replaced with temps using fvrevar + rvytokens=tokens(rvylist) + rvztokens=tokens(rvzlist) + rvxtokens=tokens(rvxlist) + + // create views on original data for Y, Z and X, as well as touse and weight var + st_view(ynopartial=.,.,rvytokens,touse) + st_view(znopartial=.,.,rvztokens,touse) + if (partial~="") { + st_view(x=.,.,rvxtokens,touse) + } + st_view(mtouse=.,.,tokens(touse),touse) + st_view(wvar=.,.,tokens(wvarname),touse) + noweight=(st_vartype(wvarname)=="byte") + + // Partial out the X variables. + // Result is y and z after transformation. + // y and z are data matrices created in Mata, not views on Stata data. + // Note that this includes demeaning if there is a constant, + // i.e., variables are centered. + // Note that we use wf*wvar instead of wvar + // because wvar is raw weighting variable and + // wf*wvar normalizes so that sum(wf*wvar)=N. + P = cols(x) // count of vars to be partialled out (excluding constant) + if (cons & P>0) { // Vars to partial out including constant + ymeans = mean(ynopartial,wf*wvar) + zmeans = mean(znopartial,wf*wvar) + xmeans = mean(x,wf*wvar) + Qxy = quadcrossdev(x, xmeans, wf*wvar, ynopartial, ymeans)*1/N + Qxz = quadcrossdev(x, xmeans, wf*wvar, znopartial, zmeans)*1/N + Qxx = quadcrossdev(x, xmeans, wf*wvar, x, xmeans)*1/N + } + else if (!cons & P>0) { // Vars to partial out NOT including constant + Qxy = quadcross(x, wf*wvar, ynopartial)*1/N + Qxz = quadcross(x, wf*wvar, znopartial)*1/N + Qxx = quadcross(x, wf*wvar, x)*1/N + } + else { // Only constant to partial out = demean + ymeans = mean(ynopartial,wf*wvar) + zmeans = mean(znopartial,wf*wvar) + } + // Partial-out coeffs. Default Cholesky; use QR if not full rank and collinearities present. + // Not necessary if no vars other than constant. + rankxx = 0 + if (P>0) { + by = cholqrsolve(Qxx, Qxy, rankxx) // also updates rankxx with rank of (demeaned) X'X + bz = cholqrsolve(Qxx, Qxz) + } + // Replace with residuals + if (cons & P>0) { // Vars to partial out including constant + y = (ynopartial :- ymeans) - (x :- xmeans)*by + z = (znopartial :- zmeans) - (x :- xmeans)*bz + } + else if (!cons & P>0) { // Vars to partial out NOT including constant + y = ynopartial - x*by + z = znopartial - x*bz + } + else if (cons) { // Only constant to partial out = demean + y = (ynopartial :- ymeans) + z = (znopartial :- zmeans) + } + else { // no transformations required + y = ynopartial + z = znopartial + } + + // standardize here + // nb - variance formula uses N-1 + if (stdflag) { + sy = sqrt(diagonal(quadvariance(y))) + sy = sy+(sy:==0) + sz = sqrt(diagonal(quadvariance(z))) + sz = sz+(sz:==0) + + y = y :/ (sy') + z = z :/ (sz') + } + + yy = quadcross(y, wf*wvar, y) // may need this for vcvo + Qyy = yy * 1/N + iQyy = invsym(Qyy) + + // check for collinearities and adjust if necessary + if (diag0cnt(iQyy) & collinflag) { + yvarkeep = selectindex(diagonal(iQyy)') + yvardrop = selectindex(diagonal(iQyy)':==0) + ykeeptokens = ytokens[yvarkeep] + ydroptokens = ytokens[yvardrop] + printf("collinearities detected - dropping %s\n",invtokens(ydroptokens)) + y = y[.,yvarkeep] + Qyy = Qyy[yvarkeep',yvarkeep] + iQyy = iQyy[yvarkeep',yvarkeep] + if (stdflag) { + sy = sy[yvarkeep'] + } + } + else { + ykeeptokens = ytokens + } + zz = quadcross(z, wf*wvar, z) // need this for vcvo + Qzz = zz * 1/N + iQzz = invsym(Qzz) + // check for collinearities and adjust if necessary + if (diag0cnt(iQzz) & collinflag) { + zvarkeep = selectindex(diagonal(iQzz)') + zvardrop = selectindex(diagonal(iQzz)':==0) + zkeeptokens = ztokens[zvarkeep] + zdroptokens = ztokens[zvardrop] + printf("collinearities detected - dropping %s\n",invtokens(zdroptokens)) + z = z[.,zvarkeep] + zz = zz[zvarkeep',zvarkeep] + Qzz = Qzz[zvarkeep',zvarkeep] + iQzz = iQzz[zvarkeep',zvarkeep] + if (stdflag) { + sz = sz[zvarkeep'] + } + } + else { + zkeeptokens = ztokens + } + + // Check for collinearities within [Y Z]. + // Allowed if e.g. Y includes exogenous vars and therefore they appear in Z as well. + // Minimum rank is #zeros in the inverse of the combined cross-product matrix. + // If no collinearities, minrank = 0. + if (collinflag) { + yzzy = quadcross((y,z), wf*wvar, (y,z)) + Qyzzy = yzzy * 1/N + iQyzzy = invsym(Qyzzy) + minrank = diag0cnt(iQyzzy) + if (minrank>0) { + yzvarcollin = selectindex(diagonal(iQyzzy)':==0) + yzexogtokens = (ykeeptokens, zkeeptokens)[yzvarcollin] + printf("{txt}collinearities detected between varlists, including: %s\n",invtokens(yzexogtokens)) + printf("{txt}implies minimum matrix rank = %f\n",minrank) + } + } + else { + minrank = 0 + } + + // minrank > 0 supported for iid, jcue, jgmm2s, and kp+svd + // not supported for non-iid case with j2l, j2lr and kp+nosvd + if ((minrank>0) & !(iidflag)) { + if ( /// + (j2lflag) | /// + (j2lrflag) | /// + ((kpflag) & !(svdflag)) /// + ) { + printf("{err}exogenous variables in matrix not supported with options j2l, j2lr and kp+nosvd\n") + exit(198) + } + } + + // Now that collinearities are removed, check if cols(Y)>cols(Z) and switch if yes. + // switchflag = 1 if z and y are switched, =0 otherwise + if (cols(z) >= cols(y)) { + // standard case + switchflag=0 + py=&y + pz=&z + } + else { + // switch y and z + switchflag=1 + py=&z + pz=&y + // memory reqs small so no need to use pointers + y_zz = zz + y_Qzz = Qzz + y_iQzz = iQzz + y_sz = sz + y_zkeeptokens = zkeeptokens + y_zdroptokens = zdroptokens + zz = yy + Qzz = Qyy + iQzz = iQyy + sz = sy + zkeeptokens = ykeeptokens + zdroptokens = ydroptokens + yy = y_zz + Qyy = y_Qzz + iQyy = y_iQzz + sy = y_sz + ykeeptokens = y_zkeeptokens + ydroptokens = y_zdroptokens + } + K1=cols(*py) // count of vars in first varlist + K2=cols(*pz) // count of vars in second varlist + + maxrank=min((K1,K2)) // max possible rank (should be K1) + if (maxrank!=K1) { + printf("{err}internal ranktest error: maxrank does not match K1\n") + exit(3000) + } + if (minrank==maxrank) { + printf("{err}internal ranktest error: minrank=maxrank; may be caused by collinearities\n") + exit(3000) + } + K3=rankxx+cons // number of partialled-out vars including constant + + // Now that Z and Y are decided... + Qzy = quadcross(*pz, wf*wvar, *py) * 1/N + // Initialize ehat column vector for later use; don't use N since that may be fweighted. + ehat = J(rows(y),K1,0) + + // special treatment for xtabond2-type first-step H matrix + // first check if special treatment is necessary - if H is identity matrix, can ignore + if (hflag) { + Hmat = st_matrix(hname) + if (Hmat==I(rows(Hmat))) { + // reset hflag since special treatment no longer needed + hflag=0 + } + } + + if (hflag) { + // ivar is panel identifier + // hvar has row/col index for Hmat matrix + // note that data should be sorted on ivar but need not be sorted on tvar + st_view(ivar=.,.,ivarname,touse) + st_view(hvar=.,.,hvarname,touse) + info = panelsetup(ivar, 1) + zHz = makesymmetric(hcross(*pz,*pz,Hmat,hvar,wvar,info)) + QzHz = zHz * 1/N + iQzHz = invsym(QzHz) + // "G" is inverse of H + // not in use until SVD/LIML/KP support is added for hmat option + // yGy = makesymmetric(hcross(*py,*py,Hmat,hvar,wvar,info,"invert")) + // QyGy = yGy * 1/N + // iQyGy = invsym(QyGy) + } + + // Needed for KP or for reporting canonical corr + if ((kpflag) | (iidflag)) { + rQyy = cholesky(Qyy) + rQzz = cholesky(Qzz) + irQyy = luinv(rQyy') + irQzz = luinv(rQzz') + } + // not in use until SVD/LIML/KP support is added for hmat option + // else if ((svdflag) & (hflag)) { + // zHz = makesymmetric(hcross(*pz,*pz,Hmat,hvar,wvar,info)) + // yGy = makesymmetric(hcross(*py,*py,Hmat,hvar,wvar,info,"invert")) + // rQyy = cholesky(yGy*1/N) + // rQzz = cholesky(zHz*1/N) + // irQyy = luinv(rQyy') + // irQzz = luinv(rQzz') + //} + + // eigenvalues and reordering + // If iid and canonical correlations, no reordering needed. Use m_evorder to get eigenvalues. + // If iid and jgmm2s, no reordering needed. Use m_evorder to get eigenvalues. + // If SVD (KP, robust), no reordering. Use SVD to get eigenvalues. + // In all other cases, reorder. Use m_evorder. + if (iidflag & !jgmm2sflag) { + // override evorder setting + evorderflag = 0 + } + if (svdflag) { + // override evorder setting + evorderflag = 0 + } + + if (svdflag==0) { + // KP using SVD handled separately + // note that currently hflag=1 implies svdflag=0 and KP enters here + // need phil to get liml coefs + // also need canonical correlations and/or for ordering by eigenvalue + // m_evorder uses symeigensystem(.) and places values in args + // ind has the ordering + eval = . + ccorr = . + ind = . + phil = . + if (hflag) { + m_evorder(Qyy,iQyy,QzHz,iQzHz,Qzy,eval,ccorr,ind,phil) + } + else { + m_evorder(Qyy,iQyy,Qzz,iQzz,Qzy,eval,ccorr,ind,phil) + } + + // order all objects with y by eigenvalue + if (evorderflag) { + (*py)[.,.] = (*py)[.,ind] + Qzy[.,.] = Qzy[.,ind] + Qyy[.,.] = Qyy[ind,ind] + iQyy[.,.] = iQyy[ind,ind] + phil = phil[ind,.] + if (stdflag) { + sy = sy[ind,1] + } + } + } + else { + // default ind = (1, 2, 3) so selection does nothing + ind = runningsum(J(rows(Qyy),1,1))' + } + + // initialize struct used for getting vcv of moment conditions + // only thing that changes in each use is vcvo.e, the NxK matrix for resids + struct ms_vcvorthog scalar vcvo + vcvo.touse = touse + vcvo.center = centerflag + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = zz + vcvo.Z = pz // pz is pointer to z + vcvo.wvar = &wvar + + // what if pihat is rank-deficient? + // below uses QR if Cholesky fails + pihat = cholqrsolve(Qzz, Qzy) + if (LMflag) { + vhat = *py + } + else { + vhat = *py-(*pz)*pihat + } + vecpi = vec(pihat) + zz_kron = I(K1) # zz + Qzz_kron = I(K1) # Qzz + + // small-sample correction in final calculation of statistic + if ((!smallflag) | (LRflag)) { + // never any small-sample correction for LR + Nminus = N + } + else if ((smallflag) & (LMflag)) { + // LM subtracts number of exogenous regressors + Nminus = N - K3 + } + else if ((smallflag) & (!LMflag)) { + // Wald subtracts number of instruments including exogenous regressors + Nminus = N - K3 - max((K2,K1)) + } + else { + printf("{err}internal ranktest error in small-sample adjustment\n") + exit(3000) + } + + // obtain VCV y matrix as "residuals" + vcvo.e = &vhat + shat0 = m_omega(vcvo) // called ome0 in FW code; FW does not normalise by N. + ishat0 = invsym(shat0) + + // needed only for cue and j2lr + if ((jcueflag) | (j2lrflag)) { + ivarpi0 = makesymmetric(Qzz_kron*ishat0*Qzz_kron) + if (diag0cnt(ishat0) & (jcueflag) & (iterateflag)) { + // not full rank, add kc*I; default kc=1e-08 + printf("{txt}\nwarning - var(pihat) singular; adjusting by %-7.1e*I(K2)\n",kc) + ishat0kc = cholinv(shat0+kc*I(cols(shat0))) + // use adjusted shat0 to get ivarpi0 + ivarpi0kc = makesymmetric(Qzz_kron*ishat0kc*Qzz_kron) + } + else { + // no adjustment to shat0 needed + // note that by using z'z/N, ivarpi0 doesn't explode as N gets big + ivarpi0kc = ivarpi0 + } + } + + // needed only for KP statistic using SVD + // eigenvalues and canonical correlations also obtained here + if (svdflag) { + kpthat = rQzz' * pihat * irQyy + // note that fullsvd inserts vt = v' into the 4th argument + fullsvd(kpthat, kpu, kpcc, kpvt) + ccorr = kpcc' + eval = ccorr:^2 + } + + if ((kpflag) | (iidflag)) { + // KP variance + kpvar = (irQyy'#irQzz')*shat0*(irQyy'#irQzz')' + _makesymmetric(kpvar) + if ((LMflag==0) & (iidflag)) { + // Homoskedastic iid Wald case means vcv has block-diag identity matrix structure. + // Enforce this by setting ~0 entries to 0. + kpvar = kpvar :* (J(K1,K1,1)#I(K2)) + } + else if (iidflag) { + // Homoskedastic iid LM case means vcv is identity matrix. + kpvar = I(rows(kpvar)) + } + } + + // for collecting test stats + if (rr>0) { + firstrank=maxrank-rr + lastrank=maxrank-rr + // check that rr is legal; must be >=1 and <= min(K1,K2). minrank is > 0 if Y and Z share (exogenous) variables + if ( (rr<1) | (rr>maxrank) ) { + printf("{err}error: rank reduction rr(.) option must lie in range 1 <= rr <= min(K1,K2)\n") + exit(198) + } + if (minrank>firstrank) { + printf("{err}error: rank reduction rr(.) option inconsistent with specified included exogenous variables\n") + exit(198) + } + } + else if (allrank~="") { + firstrank=minrank + lastrank=maxrank-1 + } + else if (nullrank~="") { + firstrank=minrank + lastrank=0 + } + else if (fullrank~="") { + firstrank=maxrank-1 + lastrank=maxrank-1 + } + else { + // should never reach this point + printf("ranktest error\n") + exit + } + // set rr if rr not supplied (so rr=0) and if a single rank reduction test is in effect requested + if (rr==0) { + if (firstrank==lastrank) { + rr = maxrank-firstrank + } + } + // where results will go; rkrow tracks the row + rkmatrix=J(lastrank-firstrank+1,6,.) + rkrow = 1 + struct ms_jresult scalar r + // save beta if (1) using J and not SVD or canonical correlations; + // (2) only one rank reduction being tested; + // (3) beta is calculated in the non-iid code + betaflag = 0 + if ((jcueflag==1) | (jgmm2sflag==1) | ((kpflag) & !(svdflag))) { + if ((firstrank==lastrank) & (firstrank>0)) { + betaflag = 1 + } + } + + //************ BEGIN TESTS *****************// + + if (iidflag & !jgmm2sflag) { + // block for iid case and canonical-correlations-based tests + // requires only eigenvalues to get LM, Wald and LR versions + // works for Anderson LM and LR, CD Wald, LIML-based but not IV-based tests + + // transformed eigenvalues + evalt = eval :/ (1 :- eval) + // test is based on sum of minimum EVs or sum of log(1-EV) + // so create a single complete vector of running sums and from that a vector of test stats + // note that dofminus also needs to be used (since m_omega and shat are not used) + if (LRflag) { + // LR uses original EVs + lrsum = -runningsum(ln(1:-sort(eval',1)')) + jrow = (Nminus-dofminus)*lrsum + } + else if (LMflag) { + // LM uses original EVs + jrow = (Nminus-dofminus)*runningsum(sort(eval',1)') + } + else { + // Wald uses transformed EVs + jrow = (Nminus-dofminus)*runningsum(sort(evalt',1)') + } + jrow = sort(jrow',-1)' + + for (ii=firstrank+1; ii<=lastrank+1; ii++) { + + rrank = diag0cnt(iQzz)*(K1-ii+1) + if (rrank) { + printf("{txt}warning - rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,ii-1) + } + + j = jrow[ii] + df = (K2-ii+1)*(K1-ii+1) + pvalue = chi2tail(df,j) + rkmatrix[rkrow,1] = j + rkmatrix[rkrow,2] = df + rkmatrix[rkrow,3] = pvalue + rkmatrix[rkrow,4] = ii-1 + rkmatrix[rkrow,5] = eval[ii] + rkmatrix[rkrow,6] = ccorr[ii] + rkrow++ + } + } + + else { + // block for robust and jgmm2s-based tests + + // initialize struct with arguments for j subroutines + struct ms_jargs scalar jargs + jargs.K1 = K1 + jargs.K2 = K2 + jargs.Qzz = Qzz + jargs.pz = pz + jargs.N = N + jargs.Nminus = Nminus + jargs.btol = btol + jargs.jtol = jtol + jargs.tracelevel = tracelevel + jargs.maxiter = maxiter + jargs.dotsflag = dotsflag + jargs.hflag = hflag + if (hflag) { + jargs.Hmat = Hmat + jargs.hvar = hvar + jargs.info = info + } + + // test H0:rank=0; works for all stats + if (firstrank==0) { + + // get J + eit = vec(Y=*py) + z_kron = I(K1) # (*pz) + // need to stack weights + // need W=wvar to avoid "view found where array required" error + gbar = quadcross(z_kron, wf*(J(K1,1,1) # (W=wvar)), eit) * 1/N + j = gbar' * ishat0 * gbar * Nminus + + rrank = diag0cnt(ishat0) + if (rrank) { + printf("{txt}\nwarning - avar rank reduction=%f in test of rank=0; adjusting df of test\n",rrank) + } + + // store results in row 1 of rkmatrix + df = K2*K1 - rrank + pvalue = chi2tail(df,j) + rkmatrix[rkrow,1] = j + rkmatrix[rkrow,2] = df + rkmatrix[rkrow,3] = pvalue + rkmatrix[rkrow,4] = 0 // H0:rank=0 + rkmatrix[rkrow,5] = eval[rkrow] + rkmatrix[rkrow,6] = ccorr[rkrow] + rkrow++ // increment row counter for next time through the loop + + firstrank=1 // increment firstrank so loops below starts in the right place + + } + + // test ranks in reverse order + // blocks for: iid, iterated CUE, numeric CUE, j2lr, j2l and 2-step GMM + for (kk=firstrank; kk<=lastrank; kk++) { + // loops through endogenous variables including dep var; index called rr in FW code + // loops in reverse, collecting tests of rank=1 up to rank=K1-1 + // naming: + // y is all endog after partialling; doesn't change; #cols=K1; called xx in FW code + // z is all IVs after partialling; doesn't change; #cols=K2; called z in FW code + // y1 is cols 1 to ii of y; loop through; called y in FW code + // y2 is cols ii+1 to K1 of y; loop through; called x in FW code + // ii is cols of y1; called rr in FW code + // kk is cols of y2; called kx in FW code + + ii = K1 - kk + // submatrices + vy1 = vhat[.,(1..ii)] + vy2 = vhat[|1,(ii+1) \ .,.|] + y1 = (*py)[.,(1..ii)] + y2 = (*py)[|1,(ii+1) \ .,.|] + Qzy1 = Qzy[|1,1 \ .,ii|] + Qzy2 = Qzy[|1,(ii+1) \ .,.|] + // z_kron called zz in FW code + z_kron = I(ii) # (*pz) + // zz_kron = quadcross(z_kron, z_kron) + // expression for zz_kron is zz'zz in FW code + Qzz_kron = I(ii) # Qzz + + // prepare pointers; pointer to z already exists + pvy1 = &vy1 + pvy2 = &vy2 + py1 = &y1 + py2 = &y2 + pz_kron = &z_kron + + // don't need to initialize e, just need to make conformable + vcvo.e = &ehat[.,(1..ii)] + + // update struct with args for j subroutines + jargs.pvy1 = pvy1 + jargs.pvy2 = pvy2 + jargs.py1 = py1 + jargs.py2 = py2 + jargs.pz_kron = pz_kron + jargs.Qzz_kron = Qzz_kron + jargs.Qzy1 = Qzy1 + jargs.Qzy2 = Qzy2 + jargs.ii = ii + jargs.kk = kk + + if (iidflag) { // iid J stat is LIML or Sargan/IV + if (binit=="liml") { + b0 = -phil[ii+1::K1,1::ii]*luinv(phil[1::ii,1::ii]) + } + else { + // initial b0 = 2sls + b0 = invsym(Qzy2' * iQzz * Qzy2) * Qzy2' * iQzz * Qzy1 + } + r = m_jiid(jargs,vcvo,b0) + } + else if ((kpflag) & (svdflag)) { // KP and SVD algorithm + // note we call with kpv = kpvt' + // nb: SVD not yet supported with Hmat + r = m_svd(jargs,kpthat,kpu,kpvt',kpvar) + } + else if (kpflag) { // KP using J-type algorithm + // nb: LIML not yet supported with Hmat + bliml = -phil[ii+1::K1,1::ii]*luinv(phil[1::ii,1::ii]) + r = m_kp(jargs,vcvo,bliml) + } + else if ((jcueflag) & (iterateflag)) { // J CUE using iterative algorithm + if (binit=="liml") { + // initial b0 = liml + b0 = -phil[ii+1::K1,1::ii]*luinv(phil[1::ii,1::ii]) + } + else if (hflag) { + // initial b0 = 2sls with Hmat matrix + b0 = invsym(Qzy2' * iQzHz * Qzy2) * Qzy2' * iQzHz * Qzy1 + } + else { + // initial b0 = 2sls + b0 = invsym(Qzy2' * iQzz * Qzy2) * Qzy2' * iQzz * Qzy1 + } + // iterated CUE uses possibly-adjusted ivarpi0kc + r = m_jcueiter(jargs,vcvo,ivarpi0kc,vecpi,b0) + // finish off with call to numerical maximizer + if (combiterflag) { + printf("{txt}Switching to numerical maximization...") + b0 = r.beta + r = m_jcuenum(jargs,vcvo,b0) + } + } + else if (jcueflag) { // J CUE using numerical maximization + if (binit=="liml") { + // initial b0 = liml + b0 = -phil[ii+1::K1,1::ii]*luinv(phil[1::ii,1::ii]) + } + else if (hflag) { + // initial b0 = 2sls with Hmat matrix + b0 = invsym(Qzy2' * iQzHz * Qzy2) * Qzy2' * iQzHz * Qzy1 + } + else { + // initial b0 = 2sls + b0 = invsym(Qzy2' * iQzz * Qzy2) * Qzy2' * iQzz * Qzy1 + } + r = m_jcuenum(jargs,vcvo,b0) + } + else if (j2lflag) { // J2L + bliml = -phil[ii+1::K1,1::ii]*luinv(phil[1::ii,1::ii]) + r = m_j2l(jargs,vcvo,bliml) + } + else if (j2lrflag) { // J2LR = iterated cue with b0=liml and maxiter=1 + bliml = -phil[ii+1::K1,1::ii]*luinv(phil[1::ii,1::ii]) + jargs.maxiter = 1 + r = m_jcueiter(jargs,vcvo,ivarpi0kc,vecpi,bliml) + } + else { // J from 2-step GMM + if (hflag) { + biv = invsym(Qzy2' * iQzHz * Qzy2) * Qzy2' * iQzHz * Qzy1 + } + else { + biv = invsym(Qzy2' * iQzz * Qzy2) * Qzy2' * iQzz * Qzy1 + } + r = m_jgmm2s(jargs,vcvo,biv) + } + + // store stats in appropriate row of rkmatrix + rkmatrix[rkrow,1] = r.j + rkmatrix[rkrow,2] = r.df + rkmatrix[rkrow,3] = r.pvalue + rkmatrix[rkrow,4] = kk // H0:rank=kk + rkmatrix[rkrow,5] = eval[kk+1] + rkmatrix[rkrow,6] = ccorr[kk+1] + rkrow++ // increment row counter for next time through the loop + + } + + } + + // single test of rank reduction and using J so beta exists + if (betaflag) { + + // betas from last test of rank + beta0 = r.beta0 + beta = r.beta + V = r.V + S = r.S + + // if standardization is used, need to unstandardize coefs, V and S + if (stdflag) { + sy1 = (J(rr,K1-rr,1) :* sy[1..rr,1])' + sy2 = J(K1-rr,rr,1) :* sy[(rr+1)..K1,1] + sy1_sy2 = sy1 :/ sy2 + beta0 = beta0 :* sy1_sy2 + beta = beta :* sy1_sy2 + V = V :* (vec(sy1_sy2) * vec(sy1_sy2)') + _makesymmetric(V) + S = S :* (((sy[1..rr,1]) # sz)*((sy[1..rr,1]) # sz)') + _makesymmetric(S) + } + + // for labelling beta if EV ordering has been used + if (evorderflag) { + // selection indexes (row vectors) + ind1 = ind[1,1..rr] + ind2 = ind[1,(rr+1)..K1] + } + else { + // selection indexes (row vectors): e.g. (1, 2, 3) and (4, 5, 6) + ind1 = runningsum(J(rr,1,1))' + ind2 = runningsum(J(K1-rr,1,1))' :+ rr + } + + // label beta vector/matrix + // here, depvar and endog are vectors + depvar = ykeeptokens[.,ind1] + endog = ykeeptokens[.,ind2] + // Stata standard is coef vectors (will transpose below) + beta = vec(beta) + beta0 = vec(beta0) + if (cols(depvar)==1) { + // single equation, no eqn stripe needed + bstripe = J(cols(endog),1,""), endog' + sstripe = J(cols(zkeeptokens),1,""), zkeeptokens' + } + else { + bstripe = J(0,2,"") + sstripe = J(0,2,"") + for (kk=1;kk<=cols(depvar);kk++) { + for (ll=1;ll<=cols(endog);ll++) { + bstripe = bstripe \ ( invtokens(depvar[1,kk]), invtokens(endog[1,ll])) + } + for (ll=1;ll<=cols(zkeeptokens);ll++) { + sstripe = sstripe \ ( invtokens(depvar[1,kk]), invtokens(zkeeptokens[1,ll])) + } + } + } + // now make them into tokens so they can be saved as Stata macros + depvar = invtokens(depvar) + endog = invtokens(endog) + exexog = invtokens(zkeeptokens) + } + else if ((kpflag) | (iidflag)) { + V = kpvar + S = shat0 + if (stdflag) { + S = S :* ((sy # sz)*(sy # sz)') + _makesymmetric(S) + } + // evorder may have changed order of y + ylist = ykeeptokens[.,ind] + if (cols(depvar)==1) { + // single equation, no eqn stripe needed + sstripe = J(cols(zkeeptokens),1,""), zkeeptokens' + } + else { + sstripe = J(0,2,"") + for (kk=1;kk<=cols(ylist);kk++) { + for (ll=1;ll<=cols(zkeeptokens);ll++) { + sstripe = sstripe \ ( invtokens(ylist[1,kk]), invtokens(zkeeptokens[1,ll])) + } + } + } + } + + + // return results to Stata + st_matrix("r(rkmatrix)", rkmatrix) + st_matrix("r(ccorr)", ccorr) + st_matrix("r(eval)", eval) + st_numscalar("r(N)", N) + if (clustvarname~="") { + st_numscalar("r(N_clust)", N_clust) + } + if (clustvarname2~="") { + st_numscalar("r(N_clust2)", N_clust2) + } + + // beta vector/matrix + // return as Stata-style row vector if vector, and transpose if matrix + if (betaflag) { + st_matrix("r(b0)", beta0') + st_matrix("r(b)", beta') + st_matrix("r(V)", V) + st_matrix("r(S)", S) + st_matrixcolstripe("r(b0)", bstripe) + st_matrixcolstripe("r(b)", bstripe) + st_matrixrowstripe("r(b0)", ("", "y1")) + st_matrixrowstripe("r(b)", ("", "y1")) + st_matrixrowstripe("r(V)", bstripe) + st_matrixcolstripe("r(V)", bstripe) + st_matrixrowstripe("r(S)", sstripe) + st_matrixcolstripe("r(S)", sstripe) + st_global("r(depvar)", depvar) + st_global("r(endog)", endog) + st_global("r(exexog)", exexog) + } + else if ((kpflag) | (iidflag)) { + st_matrix("r(V)", V) + st_matrix("r(S)", S) + st_matrixrowstripe("r(V)", sstripe) + st_matrixcolstripe("r(V)", sstripe) + st_matrixrowstripe("r(S)", sstripe) + st_matrixcolstripe("r(S)", sstripe) + } +// else { +// st_matrix("r(S)", S) +// st_matrixrowstripe("r(S)", sstripe) +// st_matrixcolstripe("r(S)", sstripe) +// } + st_numscalar("r(K3)",K3) + if (switchflag) { + // rank(varlist1) > rank(varlist2) so we switched them to z and y above. + st_numscalar("r(K1)",K2) + st_numscalar("r(K2)",K1) + // these have had any collinearities removed + st_global("r(ynocollin)",invtokens(zkeeptokens)) + st_global("r(znocollin)",invtokens(ykeeptokens)) + // dropped because of collinearities + if (cols(zdroptokens)>0) { + st_global("r(ycollin)",invtokens(zdroptokens)) + } + if (cols(ydroptokens)>0) { + st_global("r(zcollin)",invtokens(ydroptokens)) + } + } + else { + st_numscalar("r(K1)",K1) + st_numscalar("r(K2)",K2) + // these have had any collinearities removed + st_global("r(ynocollin)",invtokens(ykeeptokens)) + st_global("r(znocollin)",invtokens(zkeeptokens)) + // dropped because of collinearities + if (cols(ydroptokens)>0) { + st_global("r(ycollin)",invtokens(ydroptokens)) + } + if (cols(zdroptokens)>0) { + st_global("r(zcollin)",invtokens(zdroptokens)) + } + } + + +} // end of s_jstat program + + +// ordering by eigenvalues +function m_evorder( + numeric matrix Qyy, + numeric matrix iQyy, + numeric matrix Qzz, + numeric matrix iQzz, + numeric matrix Qzy, + numeric matrix eval, // result placed in var + numeric matrix ccorr, // result placed in var + numeric matrix ind, // result placed in var + numeric matrix phil // result placed in var + ) +{ + + K1 =cols(Qyy) + irQyy = matpowersym(Qyy,-0.5) + + if (irQyy[1,1]==.) { + printf("{err}error - missings in matrix square root - may be caused by collinearities\n") + exit(error(3351)) + } + + matl = irQyy*Qzy'*iQzz*Qzy*irQyy + vl = . // need to create var first + symeigensystem(matl,vl,eval) + phil = irQyy*vl + ccorr = eval:^(0.5) + + // reorder + phil = phil[.,K1::1] + phils = abs(phil) + + ii = . + ww = . + ind = J(1,K1,0) + + for (jj=1;jj<=K1;jj++) { + maxindex(phils[.,jj],1,ii,ww) + ind[1,jj] = ii + phils[ii,.] = J(1,K1,0) + } + +} + + +// returns structure with 2-step GMM results +struct ms_jresult scalar m_jgmm2s( struct ms_jargs scalar jargs, + struct ms_vcvorthog scalar vcvo, + numeric matrix biv) +{ + + struct ms_jresult scalar r + + r.beta0 = biv // in saved results + + // ishat based on IV residuals + (*vcvo.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2)*biv + shat = m_omega(vcvo) + ishat = invsym(shat) + + Qzy2_kron = I(jargs.ii) # jargs.Qzy2 + + bgmm = invsym(Qzy2_kron'*ishat*Qzy2_kron) * Qzy2_kron'*ishat*vec(jargs.Qzy1) + bgmm = rowshape(bgmm',rows(biv'))' + + // j based on 2-step GMM beta and first-step (IV) shat + (*vcvo.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2)*bgmm + eit = vec((*jargs.py1) - (*jargs.py2)*bgmm) + // need to stack weights + gbar = quadcross(*jargs.pz_kron, vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))), eit) * 1/jargs.N + j = gbar' * ishat * gbar * jargs.Nminus + rrank = diag0cnt(ishat) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + df = (jargs.K2-jargs.kk)*jargs.ii - rrank + pvalue = chi2tail(df,j) + + r.j = j + r.beta = bgmm + r.pvalue = pvalue + r.df = df + tkron = I(jargs.ii) # jargs.Qzy2 + r.V = invsym(tkron' * invsym(shat) * tkron) * 1/jargs.N + r.S = shat + + return(r) +} + +// returns structure with kp-liml results +struct ms_jresult scalar m_kp( struct ms_jargs scalar jargs, + struct ms_vcvorthog scalar vcvo, + numeric matrix bliml + ) +{ + + struct ms_jresult scalar r + struct ms_vcvorthog scalar vcvo_kp + + r.beta0 = bliml // in saved results + + + // ul are liml residuals + ul = (*jargs.py1) - (*jargs.py2)*bliml + aux1 = cholinv(quadcross(ul,vcvo.wf*(*vcvo.wvar),ul)) + aux2 = quadcross(ul,vcvo.wf*(*vcvo.wvar),*jargs.pz) + muz = (*jargs.pz)-ul*aux1*aux2 + y2l = (*jargs.pz)*cholsolve(quadcross(muz,vcvo.wf*(*vcvo.wvar),muz),quadcross(muz,vcvo.wf*(*vcvo.wvar),(*jargs.py2))) + aux3 = quadcross(y2l,vcvo.wf*(*vcvo.wvar),(*jargs.pz)[.,jargs.kk+1::jargs.K2]) + my2lz2 = (*jargs.pz)[.,jargs.kk+1::jargs.K2]-y2l*cholinv(quadcross(y2l,vcvo.wf*(*vcvo.wvar),y2l))*aux3 + my2lz2_kron = I(jargs.ii) # my2lz2 + + + // shat based on liml residuals for VCV + (*vcvo.e)[.,(1..jargs.ii)] = ul + shat_liml = m_omega(vcvo) + + // shat based on liml residuals for KP-J; Z and ZZ are overwritten so need to create new ms_vcvorthog + vcvo_kp = vcvo + (*vcvo_kp.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2)*bliml + vcvo_kp.Z = &my2lz2 + vcvo_kp.ZZ = quadcross(my2lz2, vcvo_kp.wf*(*vcvo_kp.wvar), my2lz2) + shat = m_omega(vcvo_kp) + ishat = invsym(shat) + eit = vec(ul) + gbar = quadcross(my2lz2_kron, vcvo_kp.wf*(J(jargs.ii,1,1) # (W=(*vcvo_kp.wvar))), eit) * 1/jargs.N + j = gbar' * ishat * gbar * jargs.Nminus + rrank = diag0cnt(ishat) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + df = (jargs.K2-jargs.kk)*jargs.ii - rrank + pvalue = chi2tail(df,j) + + r.j = j + r.beta = bliml + r.pvalue = pvalue + r.df = df + + tkron = I(jargs.ii) # jargs.Qzy2 + r.V = invsym(tkron' * invsym(shat_liml) * tkron) * 1/jargs.N + r.S = shat_liml + + return(r) +} + +// returns structure with kp using SVD; no beta returned +struct ms_jresult scalar m_svd( struct ms_jargs scalar jargs, + matrix that, + matrix u, + matrix v, + matrix vhat) +{ + struct ms_jresult scalar r + + vecthat = vec(that) + + u12 = u[(1::jargs.kk),(jargs.kk+1..jargs.K2)] + v12 = v[(1::jargs.kk),(jargs.kk+1..jargs.K1)] + u22 = u[(jargs.kk+1::jargs.K2),(jargs.kk+1..jargs.K2)] + v22 = v[(jargs.kk+1::jargs.K1),(jargs.kk+1..jargs.K1)] + + symeigensystem(u22*u22', evec, eval) + // if rank deficiency probs, evals can be negative, so zero out + if (sum(eval :< 0)>0) { + printf("{txt}warning - negative eigenvalues encountered in SVD algorithm in test of rank=%f\n",jargs.kk) + eval = (eval :>= 0) :* eval + } + u22v = evec + u22d = diag(eval) + u22h = u22v*(u22d:^0.5)*u22v' + + symeigensystem(v22*v22', evec, eval) + // if rank deficiency probs, evals can be negative, so zero out + if (sum(eval :< 0)>0) { + printf("{txt}warning - negative eigenvalues encountered in SVD algorithm in test of rank=%f\n",jargs.kk) + eval = (eval :>= 0) :* eval + } + v22v = evec + v22d = diag(eval) + v22h = v22v*(v22d:^0.5)*v22v' + + // luqrinv - use LU inversion; if fails because singular, use QR + aq = (u12 \ u22)*luqrinv(u22)*u22h + bq = v22h*luqrinv(v22')*(v12 \ v22)' + + lab = (bq#aq')*vecthat + vlab = (bq#aq')*vhat*(bq#aq')' + _makesymmetric(vlab) + vlabinv = invsym(vlab) + + rrank = diag0cnt(vlabinv) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + r.j = lab'*vlabinv*lab*jargs.Nminus + r.df = (jargs.K2-jargs.kk)*jargs.ii - rrank + r.pvalue = chi2tail(r.df,r.j) + + return(r) +} + +// returns structure with j2l results +struct ms_jresult scalar m_j2l( struct ms_jargs scalar jargs, + struct ms_vcvorthog scalar vcvo, + numeric matrix bliml) +{ + + struct ms_jresult scalar r + + r.beta0 = bliml // in saved results + + // ul are liml residuals + ul = (*jargs.py1) - (*jargs.py2)*bliml + // can cause numerical problems...? + aux1 = cholinv(quadcross(ul,vcvo.wf*(*vcvo.wvar),ul)) + aux2 = quadcross(ul,vcvo.wf*(*vcvo.wvar),*jargs.pz) + muz = (*jargs.pz)-ul*aux1*aux2 + y2l = (*jargs.pz)*cholsolve(quadcross(muz,vcvo.wf*(*vcvo.wvar),muz),quadcross(muz,vcvo.wf*(*vcvo.wvar),(*jargs.py2))) + Qzy2l = quadcross(*jargs.pz,vcvo.wf*(*vcvo.wvar),y2l) * 1/jargs.N + Qzy2l_kron = I(jargs.ii) # Qzy2l + y2_kron = I(jargs.ii) # (*jargs.py2) + + // ishat based on liml residuals + (*vcvo.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2)*bliml + shat = m_omega(vcvo) + ishat = invsym(shat) + + // calc b2l; note shat is based on liml residuals + inst = (*jargs.pz_kron)*ishat*Qzy2l_kron + // need to stack weights + aux3 = quadcross(inst,vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))),y2_kron) + aux4 = quadcross(inst,vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))),vec(*jargs.py1)) + b2l = luinv(aux3)*aux4 + b2l = rowshape(b2l,jargs.ii) + b2l = b2l' + + // resids, ishat and j based on b2l + (*vcvo.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2)*b2l + shat = m_omega(vcvo) + ishat = invsym(shat) + eit = vec((*jargs.py1) - (*jargs.py2)*b2l) + // need to stack weights + gbar = quadcross(*jargs.pz_kron, vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))), eit) * 1/jargs.N + j = gbar' * ishat * gbar * jargs.Nminus + + rrank = diag0cnt(ishat) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + df = (jargs.K2-jargs.kk)*jargs.ii - rrank + pvalue = chi2tail(df,j) + + r.j = j + r.beta = b2l + r.pvalue = pvalue + r.df = df + return(r) +} + + +// returns structure with iid results +struct ms_jresult scalar m_jiid( struct ms_jargs scalar jargs, + struct ms_vcvorthog scalar vcvo, + real matrix b0 + ) +{ + + struct ms_jresult scalar r + + // b0 is expected to be the 2SLS beta + // b0 = LIML yields same results as canonical correlations etc. + + (*vcvo.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2) * b0 + shat = m_omega(vcvo) + ishat = invsym(shat) + eit = vec((*jargs.py1) - (*jargs.py2) * b0) + // need to stack weights + gbar = quadcross( *jargs.pz_kron, /// + vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))), /// + eit) /// + * 1/jargs.N + j = gbar' * ishat * gbar * jargs.Nminus + + rrank = diag0cnt(ishat) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + df = (jargs.K2-jargs.kk)*jargs.ii - rrank + pvalue = chi2tail(df,j) + + r.j = j + r.beta0 = b0 + r.beta = b0 + r.pvalue = pvalue + r.df = df + + tkron = I(jargs.ii) # jargs.Qzy2 + r.V = invsym(tkron' * invsym(shat) * tkron) * 1/jargs.N + r.S = shat + + return(r) +} + + +// returns structure with iterated J CUE results +struct ms_jresult scalar m_jcueiter( struct ms_jargs scalar jargs, + struct ms_vcvorthog scalar vcvo, + real matrix ivarpi0, + real matrix vecpi, + numeric matrix binit) +{ + + struct ms_jresult scalar r + + // iterated CUE message, but only if we are iterating + if ((jargs.dotsflag) & (jargs.maxiter>1)) { + printf("\n") + dotscmd = "_dots 0 0, title(Calculating iterated CUE J for test of rank=" + strofreal(jargs.kk) + ")" + stata(dotscmd) + } + else if (jargs.maxiter>1) { + printf("\n{txt}Calculating CUE J for test of rank=%f",jargs.kk) + } + + // initialize + bit = binit + r.beta0 = binit // in saved results + (*vcvo.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2) * bit + shat = m_omega(vcvo) // FW doesn't normalise by N (equiv to multiplies by N) + ishat = invsym(shat) // w2 in FW code + eit = vec((*jargs.py1) - (*jargs.py2) * bit) + gbar = quadcross(*jargs.pz_kron, vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))), eit) * 1/jargs.N + jcue = gbar' * ishat * gbar * jargs.Nminus + + i=0 + + // do...while + do { + + jprev=jcue + bprev=bit + + i=i+1 + + // output dots only if we are iterating + if ((jargs.dotsflag) & (jargs.maxiter>1)) { + dotscmd = "_dots " + strofreal(i) + " 0" + stata(dotscmd) + } + + // get new bit for next time through loop + dd = (bit' \ I(jargs.kk)) # I(jargs.K2) + // pih = invsym(dd'*ivarpi0*dd)*dd'*ivarpi0*vecpi + pih = cholinv(dd'*ivarpi0*dd)*dd'*ivarpi0*vecpi + // equivalent is rowshape(pih,(K1-ii)) + pih = colshape(pih,jargs.K2) + pih = pih' + inst = (*jargs.pz_kron)*ishat*jargs.Qzz_kron*(I(jargs.ii)#pih) + insty1 = quadcross(inst,vec((*jargs.py1):*(vcvo.wf*(*vcvo.wvar)))) + // equivalent to + // = quadcross(inst,vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))),vec((*jargs.py1))) + insty2 = quadcross(inst,I(jargs.ii)#((*jargs.py2):*(vcvo.wf*(*vcvo.wvar)))) + // nonsymmetric matrix so can't use cholinv or invsym + // is rank deficiency a potential issue? if so, use qrinv or pinv? + // bit = luinv(insty2)*insty1 + bit = qrinv(insty2)*insty1 + bit = rowshape(bit,jargs.ii) + bit = bit' + + // ishat and jcue based on resids from current bit + // at first iteration, will be resids from binit (2sls or liml) + // note that jcue=N*gbar(ehat)'ishat(ehat)gbar(ehat) uses same resid throughout + // usual 2-step GMM uses initial resids in ishat(ehat) + // ehat[.,(1..ii)] = y1 - y2*bit + // vcvo.e = &ehat[.,(1..ii)] + + (*vcvo.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2) * bit + shat = m_omega(vcvo) // FW doesn't normalise by N (equiv to multiplies by N) + ishat = invsym(shat) // w2 in FW code + eit = vec((*jargs.py1) - (*jargs.py2) * bit) + // need to stack weights + gbar = quadcross(*jargs.pz_kron, vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))), eit) * 1/jargs.N + jcue = gbar' * ishat * gbar * jargs.N + + // change in jcue; should be negative unless algo is starting to veer off + jcha = jcue-jprev + // can hit problem if shat rank deficient, bit has missings, veers off, etc. + // if jcha >=0 or jcha==., algo will exit + if (jcha>0) { + jcue = jprev + bit = bprev + } + if (jcue==.) { + jcue = jprev + jcha = . + } + if (jcue==0) { + jcue = . + } + + // printf("{txt}iteration %f, jcha=%f, J=%f\n",i,jcha,jcue) + + } while ((jcha < -jargs.jtol) & (i < jargs.maxiter)) + + // message output only if we are iterating + if ((i1)) { + printf("\n{txt}convergence after %f iterations\n",i) + } + else if (jargs.maxiter>1) { + printf("\n{txt}no convergence after max %f iterations; del(jcue)=%g\n",i,jcha) + } + + // used as diagnostic at end of loop + // note that this is based on the updated bit; works better as a diagnostic that way + bcha = vec(bit-bprev)'vec(bit-bprev) + + // warning messages only if we are iterating + if ((jargs.maxiter>1) & ((bcha>jargs.btol) | (jcha>0))) { + printf("warning: possible convergence failure\n") + if (bcha>1e-10) { + printf(" del(b)'del(b)=%g\n",bcha) + } + if (jcha>0) { + printf(" del(jcue)=%g; positive at last iteration\n",jcha) + } + else { + printf(" del(jcue)=%g\n",jcha) + } + if (hasmissing(bit)) { + printf(" last iteration of b has missing values\n") + } + if (diag0cnt(ishat)) { + printf(" last iteration of avar of moments not full rank\n") + } + } + // behavior if we are not iterating: j missing if obj fn increased + if ((maxiter==1) & (jcha>0)) { + printf("warning: del(jcue)=%g; positive after single iteration\n",jcha) + jcue = . + } + + rrank = diag0cnt(ishat) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + df = (jargs.K2-jargs.kk)*jargs.ii - rrank + pvalue = chi2tail(df,jcue) + + r.j = jcue + r.beta = bit + r.pvalue = pvalue + r.df = df + r.S = shat + tkron = I(jargs.ii) # jargs.Qzy2 + r.V = invsym(tkron' * invsym(shat) * tkron) * 1/jargs.N + r.S = shat + + return(r) +} + + +// returns structure with numerical J CUE results +struct ms_jresult scalar m_jcuenum( struct ms_jargs scalar jargs, + struct ms_vcvorthog scalar vcvo, + numeric matrix binit) +{ + + struct ms_jresult scalar r + + r.beta0 = binit // in saved results + + b0 = rowshape(binit,1) + + // What follows is how to set out an optimization in Stata. First, initialize + // the optimization structure in the variable S. Then tell Mata where the + // objective function is, that it's a minimization, that it's a "d0" type of + // objective function (no analytical derivatives or Hessians), and that the + // initial values for the parameter vector are in b0. Finally, optimize. + + S = optimize_init() + + // see later in file for m_cuecrit(.) function + optimize_init_evaluator(S, &m_cuecrit()) + optimize_init_which(S, "min") + optimize_init_evaluatortype(S, "d0") + optimize_init_params(S, b0) + optimize_init_conv_maxiter(S, jargs.maxiter) + if (jargs.tracelevel~="") { + optimize_init_tracelevel(S, jargs.tracelevel) + } + optimize_init_conv_ptol(S,jargs.btol) + optimize_init_conv_vtol(S,jargs.jtol) + // CUE objective function takes 2 extra arguments = struct with args and struct with vcvo + optimize_init_argument(S, 1, jargs) + optimize_init_argument(S, 2, vcvo) + + printf("\n{txt}Calculating CUE J using numerical maximization for test of rank=%f\n",jargs.kk) + + beta = optimize(S) // Stata convention is row vector orientation + + // the last evaluation of the GMM objective function is J. + jcue = optimize_result_value(S) + + shat = m_omega(vcvo) + ishat = invsym(shat) + rrank = diag0cnt(ishat) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + df = (jargs.K2-jargs.kk)*jargs.ii - rrank + pvalue = chi2tail(df,jcue) + + r.j = jcue + r.beta = rowshape(beta,rows(binit)) // put into correct r x c dim + r.pvalue = pvalue + r.df = df + r.S = shat + + tkron = I(jargs.ii) # jargs.Qzy2 + r.V = invsym(tkron' * invsym(shat) * tkron) * 1/jargs.N + r.S = shat + + return(r) +} + +// CUE evaluator function. +// Handles only d0-type optimization; todo, g and H are just ignored. +// beta is the parameter set over which we optimize, and +// J is the objective function to minimize. + +void m_cuecrit(todo, beta, struct ms_jargs scalar jargs, struct ms_vcvorthog scalar vcvo, j, g, H) +{ + + ii = cols(*jargs.py1) + + // beta arrives as a rowvector so must reshape it first + b = rowshape(beta, cols(*jargs.py2)) + + *vcvo.e[.,.] = (*jargs.pvy1) - (*jargs.pvy2) * b + + shat = m_omega(vcvo) + ishat = invsym(shat) + + eit = vec((*jargs.py1) - (*jargs.py2) * b) + // need to stack weights + gbar = quadcross(*jargs.pz_kron, vcvo.wf*(J(ii,1,1) # (W=(*vcvo.wvar))), eit) * 1/vcvo.N + j = gbar' * ishat * gbar * jargs.Nminus + +} // end program CUE criterion function + + +// returns structure with numerical J LIML results +// not currently in use +struct ms_jresult scalar m_jlimlnum( struct ms_jargs scalar jargs, + struct ms_vcvorthog scalar vcvo, + numeric matrix binit) +{ + + struct ms_jresult scalar r + + r.beta0 = binit // in saved results + + b0 = rowshape(binit,1) + + S = optimize_init() + + optimize_init_evaluator(S, &m_limlcrit()) + optimize_init_which(S, "min") + optimize_init_evaluatortype(S, "d0") + optimize_init_params(S, b0) + optimize_init_conv_maxiter(S, jargs.maxiter) + if (jargs.tracelevel~="") { + optimize_init_tracelevel(S, jargs.tracelevel) + } + optimize_init_conv_ptol(S,jargs.btol) + optimize_init_conv_vtol(S,jargs.jtol) + // LIML objective function takes 2 extra arguments + optimize_init_argument(S, 1, jargs) + optimize_init_argument(S, 2, vcvo) + + printf("\n{txt}Calculating LIML J using numerical maximization for test of rank=%f\n",jargs.kk) + + beta = optimize(S) // Stata convention is row vector orientation + + // the last evaluation of the GMM objective function is J. + jliml = optimize_result_value(S) + + shat = m_omega(vcvo) + ishat = invsym(shat) + rrank = diag0cnt(ishat) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + df = (jargs.K2-jargs.kk)*jargs.ii - rrank + pvalue = chi2tail(df,jliml) + + r.j = jliml + r.beta = beta' // our convention is column vector orientation + r.pvalue = pvalue + r.df = df + return(r) +} + +void m_limlcrit(todo, beta, struct ms_jargs scalar jargs, struct ms_vcvorthog scalar vcvo, j, g, H) +{ + ii = cols(*jargs.py1) + + // beta arrives as a rowvector so must reshape it first + b = rowshape(beta, cols(*jargs.py2)) + + *vcvo.e[.,.] = (*jargs.pvy1) - (*jargs.pvy2) * b + + // LIML support for H-mat not yet available + // if (jargs.hflag) { + // sigma2 = hcross(*vcvo.e[.,.],*vcvo.e[.,.],jargs.Hmat,jargs.hvar,*vcvo.wvar,jargs.info,"invert") + // } + sigma2 = quadcross(*vcvo.e[.,.], vcvo.wf*(*vcvo.wvar), *vcvo.e[.,.]) * 1/vcvo.N + jargs.sigma2 = sigma2 + + _makesymmetric(sigma2) + shat = sigma2#(jargs.Qzz) + ishat = invsym(shat) + eit = vec((*jargs.py1) - (*jargs.py2) * b) + // need to stack weights + gbar = quadcross(*jargs.pz_kron, vcvo.wf*(J(ii,1,1) # (W=(*vcvo.wvar))), eit) * 1/vcvo.N + + j = gbar' * ishat * gbar * jargs.Nminus + + +} // end program CUE criterion function + +function hcross( numeric matrix A, + numeric matrix B, + numeric matrix Hmat, + numeric matrix hvar, + numeric matrix wvar, + numeric matrix info, + | string scalar invertH) +{ + + if (args()==6) { + invertflag=0 + } + else if (invertH=="invert") { + invertflag=1 + } + else { + printf("{err}internal ranktest error - invalid argument provided to hcross(.)\n") + exit(3000) + } + + npanel = rows(info) + AHB = J(cols(A),cols(B),0) + for (i=1; i<=npanel; i++) { + Apanel = panelsubmatrix(A,i,info) + Bpanel = panelsubmatrix(B,i,info) + hpanel = panelsubmatrix(hvar,i,info) + wpanel = panelsubmatrix(wvar,i,info) + H = Hmat[hpanel,hpanel] + if (invertflag) { + H = invsym(H) + } + AHB = AHB + Apanel' * H * diag(wpanel) * Bpanel + } + + return(AHB) +} + + + +// Mata utility for sequential use of inverters of square matrices +// Default is LU; +// if that fails, use QR. +function luqrinv ( numeric matrix A, + | real scalar r) +{ + return_rank = (args()==2) + + real matrix C + + C = luinv(A) + if ((C[1,1]==.) & (return_rank)) { + C = qrinv(A, r) + } + else if (C[1,1]==.) { + C = qrinv(A) + } + else if (return_rank) { + r = cols(A) + } + + return(C) + +} + +// Mata utility for sequential use of solvers +// Default is cholesky; +// if that fails, use QR. +function cholqrsolve ( numeric matrix A, + numeric matrix B, + | real scalar r) +{ + return_rank = (args()==3) + + real matrix C + + C = cholsolve(A, B) + if ((C[1,1]==.) & (return_rank)) { + C = qrsolve(A, B, r) + } + else if (C[1,1]==.) { + C = qrsolve(A, B) + } + else if (return_rank) { + r = cols(A) + } + + return(C) + +} + +end + +* Version notes +* 2.0.01 Complete rewrite. See version notes for ranktest11 for notes on previous versions. +* Main new feature: Cragg-Donald GMM CUE-based J statistic and iterative algorithm. +* Misc new options: rr(.) for test of H0: rank=(K1-rr) +* small for small-sample statistics +* added standardization; override with nostd option +* lr for LR version of Anderson canonical correlations test +* 2.0.02 (21 Nov 2019) Added e(ranktestcmd) = ranktest for main program. +* 2.0.03 (14 Jun 2020) Final version for v2 release. +* Branches to ranktest11 if _caller is version 12 or 11. +* 2.0.04 (21 Sep 2020) Added check for perverse case where minrank=maxrank. diff --git a/ado/r/ranktest.sthlp b/ado/r/ranktest.sthlp new file mode 100644 index 0000000..f41965e --- /dev/null +++ b/ado/r/ranktest.sthlp @@ -0,0 +1,939 @@ +{smcl} +{* *! version 1.0.0 25jun2020}{...} +{vieweralsosee "[if installed] underid" "help underid"}{...} +{viewerjumpto "Syntax" "ranktest##syntax"}{...} +{viewerjumpto "Description" "ranktest##description"}{...} +{viewerjumpto "Tests" "ranktest##tests"}{...} +{viewerjumpto "Notes on numerical methods" "ranktest##numerical"}{...} +{viewerjumpto "Examples" "ranktest##examples"}{...} +{viewerjumpto "Stored results" "ranktest##results"}{...} +{viewerjumpto "References" "ranktest##references"}{...} +{title:Title} + +{p2colset 5 22 24 2}{...} +{p2col :{manlink R ranktest} {hline 2}}Module for testing the rank of a matrix{p_end} +{p2colreset}{...} + +{pstd} +Note: {cmd:ranktest} was substantially rewritten and expanded starting with version 2.0.02, +and the version of Stata required was raised to Stata 12. +To run the previous version of {cmd:ranktest}, +either use version control ({bind:{it:version 11: ranktest ...}}) +or call {cmd:ranktest11} (included in the {cmd:ranktest} package). + +{title:Contents} + +{p 4}{help ranktest##syntax:Syntax}{p_end} +{p 4}{help ranktest##description:Description}{p_end} +{p 4}{help ranktest##summary:Tests (summary)}{p_end} +{p 4}{help ranktest##tests:Tests (detail)}{p_end} +{p 4}{help ranktest##numerical:Notes on numerical methods and options}{p_end} +{p 4}{help ranktest##examples:Examples}{p_end} +{p 4}{help ranktest##replication:Replication: Manresa et al. (2017)}{p_end} +{p 4}{help ranktest##results:Stored results}{p_end} +{p 4}{help ranktest##references:References}{p_end} + +{marker syntax}{...} +{title:Syntax} + +{p 8 14 2} +{cmd:ranktest} +[{it:{help ranktest##weight:weight}}] +{cmd:(}{it:varlist1}{cmd:)} +{cmd:(}{it:varlist2}{cmd:)} +[{it:weight}] +{ifin} +[{cmd:,} {it:options}] + +{synoptset 22}{...} + +{p2col 3 4 4 2:iid test options}{p_end} +{synopt :{opt lr}}report Anderson likelihood ratio statistic instead of default Anderson LM statistic{p_end} +{synopt :{opt wald}}report Cragg-Donald Wald statistic instead of default Anderson LM statistic{p_end} + +{p2col 3 4 4 2:robust test options}{p_end} +{synopt :{opt kp}}(default robust test) Kleibergen-Paap LIML-based statistic{p_end} +{synopt :{opt jcue}}Cragg-Donald CUE-based J statistic{p_end} +{synopt :{opt jgmm2s}}use 2-step efficient GMM instead of GMM CUE to obtain J statistic{p_end} +{synopt :{opt wald}}report Wald instead of default LM statistic{p_end} + +{p2col 3 4 4 2:Main options}{p_end} +{synopt :{opt partial(varlist3)}}partial out the variables in {it:varlist3} from {it:varlist1} and {it:varlist2}{p_end} +{synopt :{cmdab:noc:onstant}}suppress the constant term (intercept) in the list of partialled-out variables{p_end} +{synopt :{cmdab:all:rank}}(default) report test statistics for rank=0, rank=1, ..., rank=(K1-1) where K1=min(#varlist1,#varlist2){p_end} +{synopt :{opt rr(integer)}}report only the test statistic for H0: rank=(K1-rr){p_end} +{synopt :{cmdab:full:rank}}report only the test statistic for H0: rank=(K1-1); equivalent to specifying {opt rr(1)}{p_end} +{synopt :{cmdab:null:rank}}report only the test statistic for H0: rank=0; equivalent to specifying {opt rr(K1)}{p_end} +{synopt :{opt small}}use a small-sample adjustment: instead of N, for LM-type tests use N-K3, and for Wald-type tests use N-K2-K3, +where K2=max(#varlist1,#varlist2) and K3=#varlist3{p_end} + +{p2col 3 4 4 2:VCE options}{p_end} +{synopt :{cmdab:rob:ust}}report tests that are robust to arbitrary heteroskedasticity{p_end} +{synopt :{opt cluster(varlist)}}report tets that are robust to heteroskedasticity and within-cluster correlation; 2-way clustering is supported{p_end} +{synopt :{opt bw(#)}}report tests that are autocorrelation-consistent (AC) +or (with the {opt robust} option) heteroskedasticity- and autocorrelation-consistent (HAC), +with bandwidth equal to #{p_end} +{synopt :{opt kernel(string)}}specifies the kernel to be used for AC and HAC covariance estimation (default=Bartlett a.k.a. Newey-West){p_end} +{synopt :{opt center}}specifies that the moments in the robust VCE are centered so that they have mean zero{p_end} + +{p2col 3 4 4 2:Iterative algorithm and numerical optimization options for CUE J statistic}{p_end} +{synopt :{opt jtol(real)}}(default=1e-10) tolerance for change in J in iterative algorithm when calculating the CUE J statistic{p_end} +{synopt :{opt btol(real)}}(default=1e-5) tolerance for change in beta in iterative algorithm when calculating the CUE J statistic{p_end} +{synopt :{opt binit(estimator)}}(default=2sls) initial beta when calculating the CUE J statistic; can be {opt liml} or {opt 2sls}{p_end} +{synopt :{opt nodots}}do not display dots when iterating to obtain the CUE J statistic{p_end} +{synopt :{cmdab:NOITER:ate}}do not use iterative algorithm; use only numerical optimization (default=use both){p_end} +{synopt :{cmdab:NOCOMB:iter}}do not use numerical optimization; use only iterative algorithm (default=use both){p_end} +{synopt :{opt maxiter(real)}}(default=100) maximum number of iterations in iterative algorithm{p_end} +{synopt :{opt noevorder}}override default behavior of reordering the variables in {it:varlist1} by eigenvalues{p_end} +{synopt :{opt nosvd}}(KP test only) use LIML residuals algorithm instead of default SVD algorithm to obtain KP statistic{p_end} + +{p2col 3 4 4 2:Other options}{p_end} +{synopt :{opt nostd}}override the default behavior of standardizing variables to unit variance{p_end} +{synopt :{opt version}}display the current version number of {opt ranktest}; cannot be used with other options{p_end} + + +{pstd} +{cmd:ranktest} requires the Stata module {cmd:avar}; click {stata ssc install avar :here} to install +or type "ssc install avar" from inside Stata. +{cmd:ranktest} allows all robust covariance estimators supported by {cmd:avar}; +see {help avar:help avar} for details. + +{pstd} +All varlists may contain time-series operators or factor variables; see {stata "help varlist"}. + +{pstd} +{cmd:aweight}s, {cmd:fweight}s, {cmd:iweight}s and {cmd:pweight}s +are allowed; see help {help weights}. + + +{marker description}{...} +{title:Description} + +{pstd} +{cmd:ranktest} implements tests for the rank of a matrix. +Tests of the rank of a matrix have many practical applications. +For example, in econometrics the requirement for identification is the rank condition, +which states that a particular matrix must be of full column rank. +Another example from econometrics concerns +cointegration in vector autoregressive (VAR) models; +the Johansen trace test is a test of a rank of a particular matrix. + +{pstd} +Denote one list of K1 variables as Y and a second list of K2 variables as Z, +and assume here and below that {bind:K1 <= K2 < N}. +The null hypothesis of the tests implemented by {cmd:ranktest} +is that the matrix of correlations or regression parameters B between Y and Z has rank(B)=K1-rr, +where rr denotes the reduction in rank. +A large test statistic and rejection of the null +indicates that the matrix B has rank at least K1-rr+1. +The most commonly employed choice is rr=1, +in which case the null is that rank(B)=K1-1 (B is rank deficient) +and rejection of the null indicates rank(B)=K1 (B is full column rank). + +{pstd} +The traditional test of the rank of a matrix for the standard iid case +is the Anderson (1951) canonical correlations test. +If we calculate the squared {help canon:canonical correlations} between Y and Z, +the LM form of the Anderson test +is N times the sum of the rr smallest squared canonical correlations. +Anderson's test also has a likelihood ratio version (see below). +The Cragg-Donald (1993, 1997) statistic for the iid case is essentially +a Wald version of Anderson's test. +Both the Anderson and Cragg-Donald tests require the iid assumption, +i.e., that the covariance matrix has a Kronecker form. +When this is not so, +e.g., when disturbances are heteroskedastic or autocorrelated, +the test statistics are no longer valid. + +{pstd} +In the non-iid case, {cmd:ranktest} will report tests +that are robust to various forms of +heteroskedasticity, autocorrelation, and clustering. +The default is to report the Kleibergen-Paap (2006) test. +An alterative is to report a robust form of the Cragg-Donald (1993, 1997) test. +Windmeijer (2018) shows that the Cragg-Donald test can be interpreted, +and is implemented in {cmd:ranktest} as, a Hansen-Sargan J statistic +when estimating using GMM and the CUE (continuously-updated) estimator. +The robust form of the Cragg-Donald test is specifed by the {opt jcue} option. +All of these tests are discussed in more detail below. + +{pstd} +The rank test is applied to Y and Z, +where Y={it:varlist1} and Z={it:varlist2}. +Optionally, a third set of variables X={it:varlist3} +can be partialled-out of Y and Z +with the {opt partial(varlist3)} option. +A constant is automatically partialled out, +unless the user specifies the {opt nocons} option. +The null hypothesis is H0: rank(B)=K1-rr, +a rank reduction of rr. +Rejection of the null indicates that the matrix +has at least rank=K1-rr+1. +The test statistic is distributed as chi-squared +with degrees of freedom = (K1-(K1-rr))*(K2-(K2-rr)), +where K1 is the number of Y variables, +K2 is the number of Z variables, +and rr is the rank reduction being tested in H0. +For example, +to test if the matrix is full column rank K1 where K1<=K2, +the null would be H0:rank(B)=K1-1 (a rank reduction of 1) +and the degrees of freedom of the test +would be {bind:(K1-(K1-1))*(K2-(K1-1)} = (K2-K1+1). +The default behavior of {cmd:ranktest} is to perform all possible tests of rank; +the {cmdab:full:rank} option causes only the test of whether the matrix is full rank +(H0:rank(B)=K1-1) to be reported; +the {cmdab:null:rank} option causes only the test of whether the matrix is zero rank +(H0:rank(B)=0) to be reported; +the {opt rr(integer)} option allows the user to test for the specified order of rank reduction. + +{pstd}Note that {cmd:ranktest} separately checks the data matrices Y and X for collinearities +and if necessary drops collinear variables. +Also note that if the number of variables in {it:varlist1} +is greater than the number of variables in {it:varlist2}, +{cmd:ranktest} will use {it:varlist2} for Y and {it:varlist1} for Z. +However, the macros {opt r(K1)} and {opt r(K2)} set by {cmd:ranktest} +always refer to the number of variables in {it:varlist1} and {it:varlist2}, respectively, +after any collinear variables are dropped. + +{pstd}With the exception of the LR version of Anderson's canonical correlation test, +all the tests reported by {cmd:ranktest} are score (Lagrange multiplier, LM) tests. +The distinction between the "LM" and "Wald" versions of the tests +lies only in the type of residual used to construct an estimate of the variance. +See {help "ranktest##examples":below} for examples illustrating this point +and Windmeijer (2018) for explanation and discussion. + +{pstd}The default behavior of {cmd:ranktest} is to report LM versions of the tests; +the {opt wald} option will cause it to report Wald versions. +In the iid case only, the {opt lr} option will report the LR version of the Anderson test. +Specifying {opt robust}, {opt bw(#)} (where # is the bandwidth) or {opt cluster(varname)} +will generate an rk statistic that is robust to +heteroskedasticity, autocorrelation or within-group clustering; +{opt robust} combined with {opt bw(#)} will generate a +heteroskedasticity and autocorrelation-consistent (HAC) statistic. +The implementation of an autocorrelation-consistent statistic +and the options available for various kernels +follow that in {help ivreg2}; +for more details, see Baum et al. (2007) or {help help ivreg2} if installed. +If none of the above options is specified, +{cmd:ranktest} defaults to reporting the +LM version of the Anderson (1951) canonical correlations test, +or, if {opt wald} is specified, the Cragg-Donald (1993, 1997) Wald test. + +{pstd}It is useful to note that in the special case of K1=1 +(there is a single variable Y) and H0:rank=0, +all these tests reduce to statistics that are available from OLS estimation. +The iid version of the Cragg-Donald statistic can be calculated +by regressing the single Y on Z and X and testing the joint significance of Z +using a standard Wald test +and the traditional non-robust covariance estimator. +The Anderson LM statistic can be obtained by calculating an LM test +of the same joint hypothesis. +Also in the K1=1 case, the robust KP and CD statistics coincide, +and can be calculated using OLS and the desired robust covariance estimator. +If K1>1, test statistics for H0:rank=0 reported by {cmd:ranktest} +can be reproduced by testing the joint significance of the Z variables +across the K1 equations for the Y variables; +see the {help "ranktest##examples":examples} below. + +{pstd}In certain settings the user may specify that some variables appear +in {it:both} Y ({it:varlist1}) and Z ({it:varlist2}). +In the iid case, and in the cases of the tests using KP and J using 2-step GMM, +the test statistics thus obtained will be identical +to when these shared variable are instead partialled-out from Y and Z. +The results will differ, however, in the non-robust case with tests based on the CUE GMM estimator. +The intuition can be seen by recognizing that these variables +correspond to exogenous regressors in a linear IV estimation. +In an equation estimated by CUE GMM, +the orthogonality conditions corresponding to the excluded instruments +also contribute to the estimation of the coefficients on the included exogenous regressors, +and hence estimation using CUE yields result different from when they are partialled-out. +The replication below using the paper by Manresa et al. (2017) +provides an example of the use of this feature. + + +{marker summary}{...} +{title:Test statistics (summary)} + +{pstd}Note: {opt robust} below applies to all tests employing +a "robust" covariance estimator (heteroskedastic-robust, HAC, cluster-robust etc.). + +{p2col 5 25 26 0: {it:Options}} +Test +{p_end} + +{p2col 5 25 26 0: {cmd:(none)}} +Anderson canonical correlations test, LM version. Assumes iid. +{p_end} + +{p2col 5 25 26 0: {opt lr}} +Anderson canonical correlations test, LR version. Assumes iid. +{p_end} + +{p2col 5 25 26 0: {opt wald}} +Cragg-Donald test, iid version. +{p_end} + +{p2col 5 25 26 0: {opt robust}} +Kleibergen-Paap LIML-based robust statistic, LM version. +Same as specifying {opt robust kp}. +{p_end} + +{p2col 5 25 26 0: {opt robust wald}} +Kleibergen-Paap LIML-based robust statistic, Wald version. +Same as specifying {opt robust kp wald}. +{p_end} + +{p2col 5 25 26 0: {opt robust jcue}} +Cragg-Donald robust CUE-based statistic, LM version. +{p_end} + +{p2col 5 25 26 0: {opt robust jcue wald}} +Cragg-Donald robust CUE-based statistic, Wald version. +{p_end} + + +{marker tests}{...} +{title:Test statistics (detail)} + +{pstd}Denote by Y and Z two lists of variables, with K1 and K2 columns respectively. +By convention, K1 <= K2. +For simplicity we assume no collinearities exist within Y and Z. +An optional third set of variables X has already been partialled out of Y and Z; +the default behavior of {cmd:ranktest} is to center Y and Z (partial out a constant). +Rank tests are tests of the rank of the matrix E(Z_i'Y_i), +where Z_i and Y_i correspond to rows of the data matrices Z and Y. +E(Z_i'Y_i) is full rank if rank(E(Z_i'Y_i))=K1. + +{pstd} +Rank tests can also be presented in terms of linear regression. +Write the system of linear equations as {bind:Y = Z*B + V}. +The K2xK1 matrix of regression coefficients B +is defined as inv(E(Z_i'Z_i))*E(Z_i'Y_i), +and the OLS estimate of B is Bhat=inv(Z'Z))*Z'Y. +(In the context of instrumental variable estimation, +this is the set of first-stage equations.) +Rank tests are tests of the rank of the matrix B. + +{pstd} +A test of whether B is full rank is a test of the null hypothesis H0:rank(B)=K1-1, +a rank reduction of 1; +rejection indicates B is full rank. +A test of whether B is null rank is a test of the null hypothesis H0:rank(B)=0, +a rank reduction of K1. +If K1=1 so that there is a single Y variable, only a single test is available, H0:rank(B)=0; +rejection indicates rejection of null rank in favor of full rank. +In the K1=1 case the rank test is equivalent to a test of +the significance of the variables Z in an OLS regression of Y on Z (and X); +see the {help "ranktest##examples":examples} below. + +{marker CCiid}{...} +{bf:Anderson canonical correlations test} + +{pstd}Denote by ev_1 < ev_2 < ... < ev_K +the eigenvalues of (Y'*P_z*Y)*inv(Y'Y) where P_z is the projection matrix Z*inv(Z'Z)*Z', +after partialling out X and ordering the eigenvalues from smallest to largest. +The eigenvalues correspond to the squared {help canon:canonical correlations} between Y and Z (Anderson 1951). +The LM version of Anderson's canonical correlations test is + + rk = N sum_p ev_p, p=1...rr + +{pstd}where rr denotes the reduction in rank. +A test of whether B is full rank is obtained from rr=1 (i.e., using the smallest eigenvalue); +a test of whether it is null rank is obtained from rr=K1 (i.e., using the sum of all the eigenvalues). + +{pstd}The likelihood-ratio version of Anderson's test is + + rk = -N sum_p ln(1-ev_p), p=1...rr + +{marker CDiid}{...} +{bf:Cragg-Donald rank test (iid version)} + +{pstd}In the iid case, the Cragg-Donald (1993, 1997) test is essentially a Wald version of Anderson's test: + + rk = N sum_p ev_p/(1-ev_p), p=1...rr + +{marker KProbust}{...} +{bf:Kleibergen-Paap (LIML-based) rank test} + +{pstd}Denote by Bhat the OLS estimator of B. +The Kleibergen-Paap (2006) test of the rank of B +is derived from applying the singular value decomposition (SVD) +to a normalized version of Bhat. +Kleibergen-Paap (2006) show that +the KP test statistic can be interpreted as +Anderson's canonical correlations test generalized to the non-iid case +(a non-Kronecker covariance matrix). +Windmeijer (2018) shows that the KP test statistic +can also be interpreted as a LIML-based robust score test. +He also shows that it can be obtained from an artificial regression +using the residuals from LIML estimation(s); +the LIML residuals are obtained from estimations +where the Y variables are partitioned into +some that are treated as dependent (LHS) variables +and the remainder are endogenous (RHS) regressors. +The default is for {cmd:ranktest} to use the SVD algorithm; +the {opt nosvd} option means {cmd:ranktest} uses the LIML residuals method. +Because it is a robust score test, +the test is invariant to how the Y variables are partitioned +when the LIML residuals method is used. +See the {help "ranktest##examples":examples} below. + +{marker CDrobust}{...} +{bf:Cragg-Donald (CUE-based) rank test (robust version)} + +{pstd}Cragg-Donald (1993, 1997) present a test for the rank of B for the non-iid case +that is based on the Generalized Method of Moments (GMM). +Windmeijer (2018) shows that their test statistic +is equal to a J statistic from a regression estimated using +GMM CUE (the continuously-updated GMM estimator), +where the Y variables are partitioned into +some that are treated as dependent (LHS) variables +and the remainder are endogenous (RHS) regressors. +Because it is a robust score test, +the test is invariant to how the Y variables are partitioned. +See the {help "ranktest##examples":examples} below. +The robust CD statistic is obtained from {cmd:ranktest} using the option {opt jcue} +in order to distinguish it from the CD statistic for the iid case +presented in the same 1993 paper. +(NB: 2-step efficient GMM can be used instead of GMM CUE with the {opt jgmm2s} option. +For more on variants of J- and LIML-based test statistics, see Windmeijer (2018).) + +{marker numerical}{...} +{title:Notes on numerical methods and options} + +{pstd}To help with numerical stability, +by default all variables are standardized to have unit variance +prior to calculation of the test statistics. +This can be turned off with the {opt nostd} option. +Returned results such as coefficient vectors and covariances +are unstandardized after estimation, +so this option affects only the numerical optimization and not the reported results. +In addition, prior to the calculation of the CUE-based tests, +the Y variables are reordered according to eigenvalues. +This can be turned off with the {opt noevorder} option. + +{pstd}The default behavior of {cmd:ranktest} +is to use the iterative algorithm of Windmeijer (2018) for the GMM CUE estimator +until convergence (according to either {opt btol(real)} or {opt jtol(real)}), +followed by numerical minimization using Mata's {opt optimize(.)} +until convergence (again according to either {opt btol(real)} or {opt jtol(real)}). +The {opt nocombiter} option causes {cmd:ranktest} to rely only on the iterative algorithm; +the {opt noiterate} option causes it to rely only on numerical minimization. +Note that the CUE objective function is not guaranteed to have a unique minimum, +and hence the algorithm may converge to a local minimum; +see below for an example. + +{pstd} +The coefficients for the GMM regression +behind the J-based test statistics (CUE and 2-step GMM) +for the test of the highest rank reported by {cmd:ranktest} +are saved in the macro {opt r(b)}. +The macro {opt r(b0)} has the initial coefficient vector used in the algorithm. +To obtain the coefficients and variance-covariance matrix +corresponding to a CUE or 2-step GMM estimation, +use the {opt noevorder} option and in {cmd:(}{it:varlist1}{cmd:)} +specify the dependent variable(s) followed by the endogenous regressors. +See the example(s) below. + +{pstd} +The GMM CUE estimator corresponding to the LM form of the CUE-based J statistic +is not invariant to the partialling out +of the variables in X (including the constant). +The intuition is that the projection coefficients +used to partial out X are OLS coefficients, +whereas in a full CUE specification in which X are explicit exogenous regressors, +the orthogonality conditions in Z are also used when estimating the coefficients on X. +The test statistic corresponding to a full CUE specification +can be obtained by including the exogenous regressors including the constant +in both Y ({it:varlist1}) and Z ({it:varlist2}). +See the example below. +(NB: the Wald form of the CUE-based J statistic is invariant to partialling-out.) + + +{marker s_macros}{title:Stored results} + +{pstd}{cmd:ranktest} stores the following results in {cmd:r()}: + +{synoptset 19 tabbed}{...} +{p2col 5 19 23 2: scalars}{p_end} +{synopt:{cmd:r(N)}}Number of observations{p_end} +{synopt:{cmd:r(N_clust)}}Number of clusters{p_end} +{synopt:{cmd:r(K1)}}Rank of Y matrix (number of non-collinear variables in {it:varlist1}){p_end} +{synopt:{cmd:r(K2)}}Rank of Z matrix (number of non-collinear variables in {it:varlist2}){p_end} +{synopt:{cmd:r(K3)}}Rank of X matrix ({it:varlist3}, +number of partialled-out non-collinear variables including the constant){p_end} +{synopt:{cmd:r(chi2)}}rk statistic for highest rank tested{p_end} +{synopt:{cmd:r(p)}}p-value of rk statistic{p_end} +{synopt:{cmd:r(rdf)}}dof of rk statistic{p_end} +{synopt:{cmd:r(rank)}}Rank of matrix under H0 for highest rank tested{p_end} +{synopt:{cmd:r(cons)}}=1 if constant present, =0 if not{p_end} + +{synoptset 19 tabbed}{...} +{p2col 5 19 23 2: macros}{p_end} +{synopt:{cmd:r(version)}}Version number of {cmd:ranktest}{p_end} +{synopt:{cmd:r(varlist1)}}First (Y) varlist provided to {cmd:ranktest}{p_end} +{synopt:{cmd:r(varlist2)}}Second (Z) varlist provided to {cmd:ranktest}{p_end} +{synopt:{cmd:r(partial)}}Third (X) varlist of partialled-out variables (not including the constant){p_end} +{synopt:{cmd:r(collin)}}Dropped collinear variables in Y and/or Z{p_end} +{synopt:{cmd:r(testtype)}}LR, LM or Wald{p_end} +{synopt:{cmd:r(method)}}kp, jcue, jgmm2s, etc.{p_end} + +{synoptset 19 tabbed}{...} +{p2col 5 19 23 2: matrices}{p_end} +{synopt:{cmd:r(rkmarix)}}Saved results of rank tests{p_end} +{synopt:{cmd:r(ccorr)}}Matrix of canonical correlations{p_end} +{synopt:{cmd:r(eval)}}Matrix of eigenvalues (=squared canonical correlations){p_end} +{p2col 5 19 23 2: (CUE- and 2-step GMM-based tests of a single order of rank reduction only)}{p_end} +{synopt:{cmd:r(b)}}Coefficient vector from CUE or 2-step GMM estimation{p_end} +{synopt:{cmd:r(b0)}}Initial coefficient vector for CUE or 2-step GMM estimation{p_end} +{synopt:{cmd:r(V)}}Covariance matrix of CUE or 2-step GMM estimator{p_end} +{synopt:{cmd:r(S)}}Covariance matrix of orthogonality conditions{p_end} +{p2col 5 19 23 2: (Canonical correlations or KP-based tests only)}{p_end} +{synopt:{cmd:r(S)}}Covariance matrix (asymptotic variance of Z'V){p_end} +{synopt:{cmd:r(V)}}Covariance matrix (Omega in Kleibergen-Paap (2006){p_end} + + +{marker examples}{title:Examples} + +{col 0}{bf:Tests for underidentification of Klein consumption equation.} + +{pstd} +Underidentification means endogenous regressors (profits wagetot) are not identified +by the excluded instruments (govt taxnetx year wagegovt capital1 L.totinc) after +partialling-out the included instruments (L.totinc _cons). +Test is equivalent to testing whether the matrix of reduced form coefficients for the endogenous regressors +is full rank (K1=2) vs. less than full rank (K1=1). +The test for underidentification should not be confused with a test for "weak identification"; + +{phang2}. {stata "webuse klein, clear"}{p_end} +{phang2}. {stata "tsset yr"}{p_end} + +{pstd} +Klein consumption equation - for reference. + +{phang2}. {stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc)"}{p_end} + +{pstd} +IID case, LM => Anderson canonical correlations test; test all ranks. +H0 of rank=1 can be rejected, suggesting the model is identified. + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits)"}{p_end} + +{pstd} +IID case, Wald => Cragg-Donald (1993, 1997) test; test all ranks. +H0 of rank=1 can be rejected, suggesting model is identified. + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald"}{p_end} + +{pstd} +Heteroskedastic-robust Kleibergen-Paap LIML-based LM statistic, test for full rank only. +H0 of rank=1 now cannot be rejected, suggesting model may be underidentified. + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) full robust"}{p_end} + +{pstd} +Heteroskedastic-robust Cragg-Donald CUE-based LM statistic, test for full rank only. +H0 of rank=1 now cannot be rejected, suggesting model may be underidentified. + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) full robust jcue"}{p_end} + +{pstd} +Heteroskedastic and autocorrelation robust, Cragg-Donald CUE-based LM statistic, test for full rank only. + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) full robust bw(2) jcue"}{p_end} + + +{bf:Testing for reduced rank in VAR models.} + +{pstd} +Relationship of Johansen trace statistic and Anderson canonical correlations statistic. +Former is an LR test, {cmd:ranktest} reports LM version of latter, +but based on the same eigenvalues. +Note that the p-values reported by {cmd:ranktest} (unlike those reported by {cmd:vecrank}) +are not valid in this application because they are for the standard stationary case. + +{phang2}. {stata "vecrank consump profits wagetot, lags(1)"}{p_end} + +{phang2}. {stata "ranktest (d.consump d.profits d.wagetot) (L1.consump L1.profits L1.wagetot), lr"}{p_end} +{phang2}. {stata "mat list r(eval)"}{p_end} + +{pstd} +HAC (heteroskedastic- and autocorrelation-consistent) tests for reduced rank in a VAR model. +The Kleibergen-Paap robust test statistics reported by {cmd:ranktest} below +use a Barlett (Newey-West) kernel with bandwidth=3. +Kleibergen-Paap (2006) show that the distribution of the KP statistic +is the same as that of the Johansen trace statistic +and hence the critical values reported in the output of {cmd:vecrank} can be used +(and not the p-values in the {cmd:ranktest} output). + +{phang2}. {stata "ranktest (d.consump d.profits d.wagetot) (L1.consump L1.profits L1.wagetot), rob bw(3)"}{p_end} + + +{col 0}{bf:Equivalences between rk statistic and other test statistics} + +{pstd} +Examples use the Klein consumption equation, +shown immediately below for reference. +Stata variables Lprofits, Ltotinc and esample also created here. +These are used in the Mata examples below. + +{phang2}. {stata "webuse klein, clear"}{p_end} +{phang2}. {stata "tsset yr"}{p_end} +{phang2}. {stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc)"}{p_end} +{phang2}. {stata "gen byte esample=e(sample)"}{p_end} +{phang2}. {stata "gen Lprofits=L.profits"}{p_end} +{phang2}. {stata "gen Ltotinc=L.totinc"}{p_end} + +{pstd} +Equivalence of {cmd:ranktest} LM statistic and canonical correlations in the iid case. + +{phang2}. {stata "canon (profits wagetot) (govt taxnetx year wagegovt)"}{p_end} +{phang2}. {stata "mat list e(ccorr)"}{p_end} + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt)"}{p_end} +{phang2}. {stata "mat list r(rkmatrix)"}{p_end} + +{pstd} +Illustration of LM version vs Wald version of rk statistic in the iid case. +In the non-robust iid case, the Anderson and Cragg-Donald statistics can be obtained +as Sargan and Basmann J statistics from LIML estimation, respectively. +{cmd:ivreg2} is used instead of {cmd:regress} +in order to obtain a test statistic without a small-sample adjustment. + +{pstd} +LM (Anderson, Sargan) version: + +{phang2}. {stata "qui ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) liml"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} +{phang2}. {stata "cap drop ehat"}{p_end} +{phang2}. {stata "predict double ehat, r"}{p_end} +{phang2}. {stata "qui ivreg2 ehat L.profits govt taxnetx year wagegovt capital1 L.totinc"}{p_end} +{phang2}(as an LM NR2 test statistic:){p_end} +{phang2}. {stata "di e(N)*e(r2)"}{p_end} + +{phang2}. {stata "ranktest (consump profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rr(1)"}{p_end} + +{pstd} +Wald (Cragg-Donald, Basmann) version: + +{phang2}. {stata "qui ivreg2 ehat L.profits govt taxnetx year wagegovt capital1 L.totinc"}{p_end} +{phang2}. {stata "test govt taxnetx year wagegovt capital1 L.totinc"}{p_end} + +{phang2}. {stata "ranktest (consump profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rr(1) wald"}{p_end} + +{pstd} +Equality of Cragg-Donald CUE-based robust rk statistic for rank reduction=1 +and J test statistic from GMM CUE estimation. + +{phang2}. {stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob cue"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} +{phang2}. {stata "ranktest (consump profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob jcue rr(1)"}{p_end} +{phang2}. {stata "di r(chi2)"}{p_end} + +{pstd} +Using {opt ranktest} as a GMM CUE estimator. +Use {opt noevorder} to control which is the dependent variable and which are the endogenous regressors. +Use the {opt rr(1)} option to specify that there is a single dependent variable (single-equation CUE estimation). +Use a HAC-covariance estimator. +NB: results differ slightly because of differences in numerical optimization. + +{phang2}. {stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob bw(3) cue"}{p_end} +{phang2}. {stata "mat list e(b)"}{p_end} +{phang2}. {stata "mat list e(V)"}{p_end} +{phang2}. {stata "ranktest (consump profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob bw(3) jcue rr(1) noevorder"}{p_end} +{phang2}. {stata "mat list r(b)"}{p_end} +{phang2}. {stata "mat list r(V)"}{p_end} + +{pstd} +Invariance of the Cragg-Donald CUE-based robust test statistic: +switch wagetot and consump +so that wagetot is the dependent variable (was an endogenous regressor) +and consump is an endogenous regressor (was the dependent variable), +and the same J statistic is obtained. + +{phang2}. {stata "qui ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob cue"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} +{phang2}. {stata "qui ivreg2 wagetot L.profits (profits consump = govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob cue"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} + +{pstd} +CUE coefficients when partialling out vs not partialling out: +include the exogenous regressor L.profits and a constant in Y and X. +Also use the {opt noevorder} and {opt nocons} options. +Note this refers to the LM form of the CUE-based J test; +the Wald form is invariant to partialling out + +{phang2}. {stata "qui ranktest (consump profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob jcue rr(1) noevorder"}{p_end} +{phang2}. {stata "mat list r(b)"}{p_end} +{phang2}. {stata "qui ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob cue"}{p_end} +{phang2}. {stata "mat list e(b)"}{p_end} + +{phang2}. {stata "gen byte one=1"}{p_end} +{phang2}. {stata "qui ranktest (consump profits wagetot L.profits one) (govt taxnetx year wagegovt capital1 L.totinc L.profits one), rob jcue rr(1) noevorder nocons"}{p_end} +{phang2}. {stata "mat list r(b)"}{p_end} +{phang2}. {stata "qui ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), rob cue"}{p_end} +{phang2}. {stata "mat list e(b)"}{p_end} + +{pstd} +Kleibergen-Paap LIML-based robust score test for rank reduction=1 +as a J test in an artificial regression +using LIML residuals and a subset of the fitted values of Y. +Denoting profits as Y1 and wagetot as Y2, +the LIML residuals are obtained from a LIML estimation +with Y1 as the dependent variable and Y2 as the endogenous regressor. +First create LIML residuals and then create the fitted values of the subset of Y in Mata. +(NB: The Stata variables Lprofits, Ltotinc and esample were created above.) +The J statistic reported by {cmd:ivreg2} is an LM-type test +of the significance of the excluded instruments +with the LIML residuals as the dependent variable, +the fitted Y2 as an additional exogenous regressor, +and an arbitrary subset of instruments +(dropping one instrument since dim(Y2)=1). + +{pstd} +First calculated the fitted values of the endogenous Y2 (wagetot): + +{phang2}. {stata "qui ivreg2 profits L.profits (wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml"}{p_end} +{phang2}. {stata "cap drop ehat"}{p_end} +{phang2}. {stata "predict double ehat, r"}{p_end} +{phang2}. {stata "putmata Y=(wagetot) Z=(govt taxnetx year wagegovt capital1 Ltotinc) U=(ehat Lprofits 1) yr if esample, replace"}{p_end} +{phang2}. {stata "mata: Ztilde = Z - U*invsym(U'U)*U'Z"}{p_end} +{phang2}. {stata "mata: Yhat = Ztilde*invsym(Ztilde'Ztilde)*Ztilde'Y"}{p_end} +{phang2}. {stata "getmata (wagetothat)=Yhat, id(yr) replace"}{p_end} + +{pstd} +Now show the J statistic is identical to the {cmd:ranktest} LM version of the robust KP test statistic; L.totinc is the omitted instrument: + +{phang2}. {stata "qui ivreg2 ehat wagetothat L.profits (=govt taxnetx year wagegovt capital1), rob"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rr(1) rob"}{p_end} + +{pstd} +LM version vs Wald version of the robust KP test statistic in an artificial regression. +LM version is obtained as above with Z variables as excluded instruments. +Wald version is obtained as a Wald test using OLS with the Z variables as regressors. +L.totinc is the dropped instrument. +{cmd:ivreg2} is used instead of {cmd:regress} to perform OLS +in order that no small-sample adjustments are applied and a chi-sq statistic is reported by {cmd:test}. + +{phang2}. {stata "qui ivreg2 ehat wagetothat L.profits (=govt taxnetx year wagegovt capital1), rob"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rr(1) rob"}{p_end} + +{phang2}. {stata "qui ivreg2 ehat wagetothat govt taxnetx year wagegovt capital1 L.profits, rob"}{p_end} +{phang2}. {stata "test govt taxnetx year wagegovt capital1"}{p_end} +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rr(1) rob wald"}{p_end} + +{pstd} +Invariance of the Kleibergen-Paap LIML-based robust score test: +reverse Y1 and Y2 (profits and wagetot) and the same statistic is obtained: + +{phang2}. {stata "qui ivreg2 profits L.profits (wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml"}{p_end} +{phang2}. {stata "cap drop ehat"}{p_end} +{phang2}. {stata "predict double ehat, r"}{p_end} +{phang2}. {stata "putmata Y=(profits) U=(ehat Lprofits 1) yr if esample, replace"}{p_end} +{phang2}. {stata "mata: Ztilde = Z - U*invsym(U'U)*U'Z"}{p_end} +{phang2}. {stata "mata: Yhat = Ztilde*invsym(Ztilde'Ztilde)*Ztilde'Y"}{p_end} +{phang2}. {stata "getmata (profitshat)=Yhat, id(yr) replace"}{p_end} + +{phang2}. {stata "qui ivreg2 ehat profitshat L.profits (=govt taxnetx year wagegovt capital1), rob"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} + +{pstd} +Invariance: drop govt (or any other instrument) instead of L.totinc and the same statistic is obtained: + +{phang2}. {stata "qui ivreg2 ehat profitshat L.profits (=taxnetx year wagegovt capital1 L.totinc), rob"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} + +{pstd} +Invariance: drop taxnetx (or any other instrument) instead of L.totinc and the same statistic is obtained: + +{phang2}. {stata "qui ivreg2 ehat profitshat govt year wagegovt capital1 L.totinc L.profits, rob"}{p_end} +{phang2}. {stata "test govt year wagegovt capital1 L.totinc"}{p_end} + +{pstd} +Equality of robust rk statistic and Wald test from OLS regression in special case of single regressor. +Note that this is a test of H0:rank=0 and so applies to both the robust KP and robust CD tests. + +{phang2}. {stata "qui ivreg2 profits govt taxnetx year wagegovt capital1 L.totinc L.profits, robust"}{p_end} +{phang2}. {stata "test govt taxnetx year wagegovt capital1 L.totinc"}{p_end} + +{phang2}. {stata "ranktest (profits) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald robust"}{p_end} + +{pstd} +Equality of rk statistic of null rank and Wald test from OLS regressions and a +Kronecker covariance matrix (independent and homoskedastic equations). +To show equality, estimate the equations using {cmd:reg3} specifying that all regressors are exogenous, +and then test joint significance of Z variables in both regressions. +L.profits is the partialled-out variable and is not tested. + +{phang2}. {stata "global e1 (profits govt taxnetx year wagegovt capital1 L.totinc L.profits)"}{p_end} +{phang2}. {stata "global e2 (wagetot govt taxnetx year wagegovt capital1 L.totinc L.profits)"}{p_end} +{phang2}. {stata "reg3 $e1 $e2, allexog"}{p_end} +{phang2}. {stata "qui test [profits]govt [profits]taxnetx [profits]year [profits]wagegovt [profits]capital1 [profits]L.totinc"}{p_end} +{phang2}. {stata "test [wagetot]govt [wagetot]taxnetx [wagetot]year [wagetot]wagegovt [wagetot]capital1 [wagetot]L.totinc, accum"}{p_end} + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald null "}{p_end} + +{pstd} +Equality of rk statistic of null rank and Wald test from OLS regressions and {cmd:suest}. +To show equality, use {cmd:suest} to test joint significance of Z variables in both regressions. +L.profits is the partialled-out variable and is not tested. +Note that {cmd:suest} introduces a finite sample adjustment of (N-1)/N. + +{phang2}. {stata "qui regress profits govt taxnetx year wagegovt capital1 L.totinc L.profits"}{p_end} +{phang2}. {stata "est store e1"}{p_end} +{phang2}. {stata "qui regress wagetot govt taxnetx year wagegovt capital1 L.totinc L.profits"}{p_end} +{phang2}. {stata "est store e2"}{p_end} +{phang2}. {stata "qui suest e1 e2"}{p_end} +{phang2}. {stata "qui test [e1_mean]govt [e1_mean]taxnetx [e1_mean]year [e1_mean]wagegovt [e1_mean]capital1 [e1_mean]L.totinc"}{p_end} +{phang2}. {stata "test [e2_mean]govt [e2_mean]taxnetx [e2_mean]year [e2_mean]wagegovt [e2_mean]capital1 [e2_mean]L.totinc, accum"}{p_end} +{phang2}. {stata "di r(chi2)*e(N)/(e(N)-1)"}{p_end} + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald null robust"}{p_end} + +{pstd} +The test for a rank reduction of 2 (rank=1) +is the Arellano-Hansen-Sentana (2012) I test for underidentification: + +{phang2}. {stata "ranktest (consump profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) robust bw(2) jcue rr(2)"}{p_end} + + +{marker replication}{title:Replication: Manresa et al. (2017)} + +{bf:Testing for reduced rank in an asset pricing model.} + +{pstd} +Manresa et al. (2017) present an application using Yogo's (2006) data +with 3 observable risk factors +and quarterly returns on the Fama-French cross-section of 25 portfolios +for the period 1951-2001. +GMM CUE J-based tests below of rank 1, 2, and 3 correspond to +sets of stochastic discount factors (SDFs) of dimension 3, 2 and 1, respectively +and replicate the results they present in their Table 1. +A vector of ones (i.e., a constant) is explicitly included along with the 3 risk factors. +Note that in the last specification the vector of ones is included in {it:both} the Y and Z varlists. +Tests use a heteroskedastic- and autocorrelation-consistent VCE +with centered moments and a Bartlett kernel with bandwidth=2. +The {opt noevorder} option is used when replicating the coefficients +in order to control which variables are treated as dependent variables/endogenous regressors +in the underlying CUE GMM estimations. +The rejection of rank=1 (dimension=3) +and the failure to reject rank=2 (dimension=2) +at conventional levels +suggest the admissible SDFs lie in a two-dimensional subspace +(Manresa et al. 2017, p. 16). +The fact that the null of zero means of the SDFs is not rejected (p=0.494) +suggests the model is completely overspecified, +where "overspecified" means the model has "at least one non-zero SDF which is uncorrelated +with the excess returns on the vector of test assets" (Manresa et al. 2017, p. 1). + +{pstd} +Note that although the first estimation replicates the Manresa et al. results, +the resulting test statistic for rank=1 (dimension 3) is actually a local minimum. +The second estimation uses the default initial 2SLS beta +instead of the optional LIML beta +and achieves a smaller value for the rank=1 test in this case. + +{phang2}. {stata `"import excel "https://www.dropbox.com/s/roxp36yyzjw93kb/fr.xls?dl=1", first clear"'}{p_end} +{phang2}. {stata "gen int t = _n"}{p_end} +{phang2}. {stata "tsset t"}{p_end} +{phang2}. {stata "gen byte one = 1"}{p_end} + +{pstd}Replicate J statistics reported in "Criterion" row of Table 1 of Manresa et al. (2017):{p_end} +{phang2}. {stata "ranktest (one f1-f3) (r1-r25), jcue noconstant rob bw(2) center nodots binit(liml)"}{p_end} + +{pstd}Test statistic for rank=1 is smaller than that reported in Table 1 of Manresa et al. (2017):{p_end} +{phang2}. {stata "ranktest (one f1-f3) (r1-r25), jcue noconstant rob bw(2) center nodots"}{p_end} + +{pstd}Replicate coefficients #1 and #2 in first column in "Two-dimensional Set" of Table 1:{p_end} +{phang2}. {stata "qui ranktest (one f3 f1 f2) (r1-r25), jcue rr(2) noconstant rob bw(2) center noevorder"}{p_end} +{phang2}. {stata "mat b_cf1f2 = r(b)"}{p_end} +{phang2}. {stata "mat b_cf1f2 = b_cf1f2[1,1..2]"}{p_end} +{phang2}. {stata "mat list b_cf1f2"}{p_end} + +{pstd}Replicate coefficients #1 and #3 in second column in "Two-dimensional Set" of Table 1:{p_end} +{phang2}. {stata "qui ranktest (one f2 f1 f3) (r1-r25), jcue rr(2) noconstant rob bw(2) center noevorder"}{p_end} +{phang2}. {stata "mat b_cf1f3 = r(b)"}{p_end} +{phang2}. {stata "mat b_cf1f3 = b_cf1f3[1,1..2]"}{p_end} +{phang2}. {stata "mat list b_cf1f3"}{p_end} + +{pstd}Replicate all 4 p-values in third column in "Two-dimensional Set" of Table 1,:{p_end} +{pstd}First obtain and save J statistic for full model.{p_end} +{phang2}. {stata "qui ranktest (one f3 f1 f2) (r1-r25), jcue rr(2) noconstant rob bw(2) center"}{p_end} +{phang2}. {stata "scalar jfull = r(chi2)"}{p_end} +{pstd}Report p-values from GMM distance tests for f1, f2, f3 and c_i (means of SDFs):{p_end} +{phang2}. {stata "qui ranktest (one f2 f3) (r1-r25), jcue rr(2) noconstant rob bw(2) center"}{p_end} +{phang2}. {stata "di chi2tail(2,r(chi2)-jfull)"}{p_end} +{phang2}. {stata "qui ranktest (one f1 f3) (r1-r25), jcue rr(2) noconstant rob bw(2) center"}{p_end} +{phang2}. {stata "di chi2tail(2,r(chi2)-jfull)"}{p_end} +{phang2}. {stata "qui ranktest (one f1 f2) (r1-r25), jcue rr(2) noconstant rob bw(2) center"}{p_end} +{phang2}. {stata "di chi2tail(2,r(chi2)-jfull)"}{p_end} +{phang2}. {stata "qui ranktest (one f1 f2 f3) (one r1-r25), jcue rr(2) noconstant rob bw(2) center"}{p_end} +{phang2}. {stata "di chi2tail(2,r(chi2)-jfull)"}{p_end} + + +{marker s_refs}{title:References} + +{p 0 4}Anderson, T.W. 1951. Estimating linear restrictions on regression coefficients +for multivariate normal distributions. Annals of Mathematical Statistics, Vol. 22, pp. 327-51. + +{p 0 4}Arellano, M., Hansen, L.P., and Sentana, E. 2012. +Underidentification? Journal of Econometrics, Vol. 170, pp. 256-280. + +{p 0 4}Cragg, J.G. and Donald, S.G. 1993. Testing Identfiability and Specification in +Instrumental Variables Models. Econometric Theory, Vol. 9, pp. 222-240. + +{p 0 4}Cragg, J.G. and Donald, S.G. 1997. Inferring the Rank of a Matrix. +Journal of Econometrics, Vol. 76, pp. 223-250. + +{p 0 4}Kleibergen, F. and Paap, R. 2006. Generalized Reduced Rank Tests Using the Singular Value Decomposition. +Journal of Econometrics, Vol. 133, pp. 97-126. + +{p 0 4}Manresa, E., F. Penaranda and E. Sentana. 2017. +Empirical evaluation of overspecified asset pricing models. +{browse "https://ideas.repec.org/p/cmf/wpaper/wp2017_1711.html":CEMFI Working Papers 1711, CEMFI, Madrid}, +and {browse "https://ideas.repec.org/p/cpr/ceprdp/12085.html":CEPR Discussion Paper Series No. DP12085, CEPR, London}. + +{p 0 4}Windmeijer, F. 2018. Testing Over- and Underidentification in Linear Models, +with Applications to Dynamic Panel Data and Asset-Pricing Models. +{browse "https://ideas.repec.org/p/bri/uobdis/18-696.html":Bristol Economics Discussion Papers 18/696}. + +{p 0 4}Yogo, M. 2006. A consumption-based explanation of expected stock returns. +Journal of Finance, Vol. 61, pp. 539-580. + + +{marker s_acknow}{title:Acknowledgements} + +{p}We would like to thank Kit Baum and Austin Nichols for helpful suggestions and feedback +on the original version of {opt ranktest}. + + +{marker s_citation}{title:Citation of ranktest} + +{p}{cmd:ranktest} is not an official Stata command. It is a free contribution +to the research community, like a paper. Please cite it as such: {p_end} + +{phang}Kleibergen, F., Schaffer, M.E. 2020, Windmeijer, F. +ranktest: module for testing the rank of a matrix +{browse "http://ideas.repec.org/c/boc/bocode/s456865.html":http://ideas.repec.org/c/boc/bocode/s456865.html}{p_end} + + +{title:Authors} + + Frank Kleibergen, University of Amsterdam, Netherlands + F.R.Kleibergen@uva.nl + + Mark E Schaffer, Heriot-Watt University, UK + m.e.schaffer@hw.ac.uk + + Frank Windmeijer, Oxford University, UK + frank.windmeijer@stats.ox.ac.uk + + +{title:Also see} + +{p 1 14}Manual: {hi:[R] canon}{p_end} + +{p 1 10}On-line: help for {help canon}, {help vecrank}, {help avar}, {help ivreg2} (if installed){p_end} diff --git a/ado/r/ranktest11.ado b/ado/r/ranktest11.ado new file mode 100644 index 0000000..9a0b073 --- /dev/null +++ b/ado/r/ranktest11.ado @@ -0,0 +1,981 @@ +*! ranktest11 1.4.01 based on ranktest 1.4.01 of 18aug2015 +*! author mes, based on code by fk +*! see end of file for version comments + +if c(version) < 12 { +* ranktest uses livreg2 Mata library. +* Ensure Mata library is indexed if new install. +* Not needed for Stata 12+ since ssc.ado does this when installing. + capture mata: mata drop m_calckw() + capture mata: mata drop m_omega() + capture mata: mata drop ms_vcvorthog() + capture mata: mata drop s_vkernel() + mata: mata mlib index +} + +program define ranktest11, rclass sortpreserve + + local lversion 01.4.01 + + if _caller() < 11 { + ranktest9 `0' + return add // otherwise all the ranktest9 results are zapped + return local ranktestcmd ranktest9 + return local cmd ranktest + return local version `lversion' + exit + } + version 11.2 + + if substr("`1'",1,1)== "," { + if "`2'"=="version" { + di in ye "`lversion'" + return local version `lversion' + exit + } + else { +di as err "invalid syntax" + exit 198 + } + } + +* If varlist 1 or varlist 2 have a single element, parentheses optional + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local y `s(varlist)' + local 0 `"`s(rest)'"' + sret clear + } + else { + local y `1' + mac shift 1 + local 0 `"`*'"' + } + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local z `s(varlist)' + local 0 `"`s(rest)'"' + sret clear + } + else { + local z `1' + mac shift 1 +* Need to reinsert comma before options (if any) for -syntax- command to work + local 0 `", `*'"' + } + +// Note that y or z could be a varlist, e.g., "y1-y3", so they need to be unab-ed. + tsunab y : `y' + local K : word count `y' + tsunab z : `z' + local L : word count `z' + +* Option version ignored here if varlists were provided + syntax [if] [in] [aw fw pw iw/] /// + [, /// + partial(varlist ts) /// + fwl(varlist ts) /// + NOConstant /// + wald /// + ALLrank /// + NULLrank /// + FULLrank /// + ROBust /// + cluster(varlist) /// + BW(string) /// + kernel(string) /// + Tvar(varname) /// + Ivar(varname) /// + sw /// + psd0 /// + psda /// + version /// + dofminus(integer 0) /// + ] + + local partial "`partial' `fwl'" + local partial : list retokenize partial + + local cons = ("`noconstant'"=="") + + if "`wald'"~="" { + local LMWald "Wald" + } + else { + local LMWald "LM" + } + + local optct : word count `allrank' `nullrank' `fullrank' + if `optct' > 1 { +di as err "Incompatible options: `allrank' `nullrank' `fullrank'" + error 198 + } + else if `optct' == 0 { +* Default + local allrank "allrank" + } + + local optct : word count `psd0' `psda' + if `optct' > 1 { +di as err "Incompatible options: `psd0' `psda'" + error 198 + } + local psd "`psd0' `psda'" + local psd : list retokenize psd + +* Note that by tsrevar-ing here, subsequent disruption to the sort doesn't matter +* for TS operators. + tsrevar `y' + local vl1 `r(varlist)' + tsrevar `z' + local vl2 `r(varlist)' + tsrevar `partial' + local partial `r(varlist)' + + foreach vn of varlist `vl1' { + tempvar tv + qui gen double `tv' = . + local tempvl1 "`tempvl1' `tv'" + } + foreach vn of varlist `vl2' { + tempvar tv + qui gen double `tv' = . + local tempvl2 "`tempvl2' `tv'" + } + + marksample touse + markout `touse' `vl1' `vl2' `partial' `cluster', strok + +* Stock-Watson and cluster imply robust. + if "`sw'`cluster'" ~= "" { + local robust "robust" + } + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + if "`fsqrt(wf)*(wvar^0.5):*'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "fweight" & "`sw'" != "" { + di in red "fweights currently not supported with -sw- option" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`bw'" !="" { + di in red "iweights not allowed with robust, cluster, AC or HAC" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + + +* Every time a weight is used, must multiply by scalar wf ("weight factor") +* wf=1 for no weights, fw and iw, wf = scalar that normalizes sum to be N if aw or pw + sum `wvar' if `touse' `wtexp', meanonly +* Weight statement + if "`weight'" ~= "" { +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + if "`weight'"=="" | "`weight'"=="fweight" | "`weight'"=="iweight" { +* If weight is "", weight var must be column of ones and N is number of rows. +* With fw and iw, effective number of observations is sum of weight variable. + local wf=1 + local N=r(sum_w) + } + else if "`weight'"=="aweight" | "`weight'"=="pweight" { +* With aw and pw, N is number of obs, unadjusted. + local wf=r(N)/r(sum_w) + local N=r(N) + } + else { +* Should never reach here +di as err "ranktest error - misspecified weights" + exit 198 + } + +* HAC estimation. +* If bw is omitted, default `bw' is empty string. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. + if "`bw'" == "" & "`kernel'" == "" { + local bw=0 + } + else { +* Need tvar for markout with time-series stuff +* Data must be tsset for time-series operators in code to work +* User-supplied tvar checked if consistent with tsset + capture tsset + if "`r(timevar)'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } +* If no panel data, ivar will still be empty + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already -tsset-" + exit 5 + } + local tdelta `r(tdelta)' + tsreport if `touse', panel + if `r(N_gaps)' != 0 { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + +* Check it's a valid kernel and replace with unabbreviated kernel name; check bw. +* Automatic kernel selection allowed by ivreg2 but not ranktest so must trap. +* s_vkernel is in livreg2 mlib. + if "`bw'"=="auto" { +di as err "invalid bandwidth in option bw() - must be real > 0" + exit 198 + } + mata: s_vkernel("`kernel'", "`bw'", "`ivar'") + local kernel `r(kernel)' + local bw = `r(bw)' + } + +* tdelta missing if version 9 or if not tsset + if "`tdelta'"=="" { + local tdelta=1 + } + + if "`sw'"~="" { + capture xtset + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already tsset or xtset" + exit 5 + } +* Exit with error if ivar is neither supplied nor tsset nor xtset + if "`ivar'"=="" { +di as err "Must -xtset- or -tsset- data or specify -ivar- with -sw- option" + exit 198 + } + qui describe, short varlist + local sortlist "`r(sortlist)'" + tokenize `sortlist' + if "`ivar'"~="`1'" { +di as err "Error - dataset must be sorted on panel var with -sw- option" + exit 198 + } + } + +* Create variable used for getting lags etc. in Mata + tempvar tindex + qui gen `tindex'=1 if `touse' + qui replace `tindex'=sum(`tindex') if `touse' + +********** CLUSTER SETUP ********************************************** + +* Mata code requires data are sorted on (1) the first var cluster if there +* is only one cluster var; (2) on the 3rd and then 1st if two-way clustering, +* unless (3) two-way clustering is combined with kernel option, in which case +* the data are tsset and sorted on panel id (first cluster variable) and time +* id (second cluster variable). +* Second cluster var is optional and requires an identifier numbered 1..N_clust2, +* unless combined with kernel option, in which case it's the time variable. +* Third cluster var is the intersection of 1 and 2, unless combined with kernel +* opt, in which case it's unnecessary. +* Sorting on "cluster3 cluster1" means that in Mata, panelsetup works for +* both, since cluster1 nests cluster3. +* Note that it is possible to cluster on time but not panel, in which case +* cluster1 is time, cluster2 is empty and data are sorted on panel-time. +* Note also that if data are sorted here but happen to be tsset, will need +* to be re-tsset after estimation code concludes. + + +// No cluster options or only 1-way clustering +// but for Mata and other purposes, set N_clust vars =0 + local N_clust=0 + local N_clust1=0 + local N_clust2=0 + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`kernel'"~="" { +* kernel requires either that cluster1 is time var and cluster2 is empty +* or that cluster1 is panel var and cluster2 is time var. +* Either way, data must be tsset and sorted for panel data. + if "`cluster2'"~="" { +* Allow backwards order + if "`cluster1'"=="`tvar'" & "`cluster2'"=="`ivar'" { + local cluster1 "`2'" + local cluster2 "`1'" + } + if "`cluster1'"~="`ivar'" | "`cluster2'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset panel & time vars." +di as err " tsset panel var=`ivar'; tsset time var=`tvar'; cluster vars=`cluster1',`cluster2'" + exit 198 + } + } + else { + if "`cluster1'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset time variable." +di as err " tsset time var=`tvar'; cluster var=`cluster1'" + exit 198 + } + } + } +* Simple way to get quick count of 1st cluster variable without disrupting sort +* clusterid1 is numbered 1.._Nclust1. + tempvar clusterid1 + qui egen `clusterid1'=group(`cluster1') if `touse' + sum `clusterid1' if `touse', meanonly + if "`cluster2'"=="" { + local N_clust=r(max) + local N_clust1=`N_clust' + if "`kernel'"=="" { +* Single level of clustering and no kernel-robust, so sort on single cluster var. +* kernel-robust already sorted via tsset. + sort `cluster1' + } + } + else { + local N_clust1=r(max) + if "`kernel'"=="" { + tempvar clusterid2 clusterid3 +* New cluster id vars are numbered 1..N_clust2 and 1..N_clust3 + qui egen `clusterid2'=group(`cluster2') if `touse' + qui egen `clusterid3'=group(`cluster1' `cluster2') if `touse' +* Two levels of clustering and no kernel-robust, so sort on cluster3/nested in/cluster1 +* kernel-robust already sorted via tsset. + sort `clusterid3' `cluster1' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) + } + else { +* Need to create this only to count the number of clusters + tempvar clusterid2 + qui egen `clusterid2'=group(`cluster2') if `touse' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) +* Now replace with original variable + local clusterid2 `cluster2' + } + + local N_clust=min(`N_clust1',`N_clust2') + + } // end 2-way cluster block + } // end cluster block + +************************************************************************************************ + +* Note that bw is passed as a value, not as a string + mata: s_rkstat( /// + "`vl1'", /// + "`vl2'", /// + "`partial'", /// + "`wvar'", /// + "`weight'", /// + `wf', /// + `N', /// + `cons', /// + "`touse'", /// + "`LMWald'", /// + "`allrank'", /// + "`nullrank'", /// + "`fullrank'", /// + "`robust'", /// + "`clusterid1'", /// + "`clusterid2'", /// + "`clusterid3'", /// + `bw', /// + "`tvar'", /// + "`ivar'", /// + "`tindex'", /// + `tdelta', /// + `dofminus', /// + "`kernel'", /// + "`sw'", /// + "`psd'", /// + "`tempvl1'", /// + "`tempvl2'" /// + ) + + tempname rkmatrix chi2 df df_r p rank ccorr eval + mat `rkmatrix'=r(rkmatrix) + mat `ccorr'=r(ccorr) + mat `eval'=r(eval) + mat colnames `rkmatrix' = "rk" "df" "p" "rank" "eval" "ccorr" + +di +di "Kleibergen-Paap rk `LMWald' test of rank of matrix" + if "`robust'"~="" & "`kernel'"~= "" & "`cluster'"=="" { +di " Test statistic robust to heteroskedasticity and autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`kernel'"~="" & "`cluster'"=="" { +di " Test statistic robust to autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`cluster'"~="" { +di " Test statistic robust to heteroskedasticity and clustering on `cluster'" + if "`kernel'"~="" { +di " and kernel-robust to common correlated disturbances" +di " Kernel: `kernel' Bandwidth: `bw'" + } + } + else if "`robust'"~="" { +di " Test statistic robust to heteroskedasticity" + } + else if "`LMWald'"=="LM" { +di " Test assumes homoskedasticity (Anderson canonical correlations test)" + } + else { +di " Test assumes homoskedasticity (Cragg-Donald test)" + } + + local numtests = rowsof(`rkmatrix') + forvalues i=1(1)`numtests' { +di "Test of rank=" %3.0f `rkmatrix'[`i',4] " rk=" %8.2f `rkmatrix'[`i',1] /* + */ " Chi-sq(" %3.0f `rkmatrix'[`i',2] ") pvalue=" %8.6f `rkmatrix'[`i',3] + } + scalar `chi2' = `rkmatrix'[`numtests',1] + scalar `p' = `rkmatrix'[`numtests',3] + scalar `df' = `rkmatrix'[`numtests',2] + scalar `rank' = `rkmatrix'[`numtests',4] + local N `r(N)' + return scalar df = `df' + return scalar chi2 = `chi2' + return scalar p = `p' + return scalar rank = `rank' + if "`cluster'"~="" { + return scalar N_clust = `N_clust' + } + if "`cluster2'"~="" { + return scalar N_clust1 = `N_clust1' + return scalar N_clust2 = `N_clust2' + } + return scalar N = `N' + return matrix rkmatrix `rkmatrix' + return matrix ccorr `ccorr' + return matrix eval `eval' + + tempname S V Omega + if `K' > 1 { + foreach en of local y { +* Remove "." from equation name + local en1 : subinstr local en "." "_", all + foreach vn of local z { + local cn "`cn' `en1':`vn'" + } + } + } + else { + foreach vn of local z { + local cn "`cn' `vn'" + } + } + + mat `V'=r(V) + matrix colnames `V' = `cn' + matrix rownames `V' = `cn' + return matrix V `V' + mat `S'=r(S) + matrix colnames `S' = `cn' + matrix rownames `S' = `cn' + return matrix S `S' + + return local cmd "ranktest11" + return local version `lversion' +end + +* Adopted from -canon- +program define GetVarlist, sclass + version 11.2 + sret clear + gettoken open 0 : 0, parse("(") + if `"`open'"' != "(" { + error 198 + } + gettoken next 0 : 0, parse(")") + while `"`next'"' != ")" { + if `"`next'"'=="" { + error 198 + } + local list `list'`next' + gettoken next 0 : 0, parse(")") + } + sret local rest `"`0'"' + tokenize `list' + local 0 `*' + sret local varlist "`0'" +end + +********************* EXIT IF STATA VERSION < 11 ******************************** + +* When do file is loaded, exit here if Stata version calling program is < 11. +* Prevents loading of rest of program file (would cause e.g. Stata 10 to crash at Mata). + +if c(stata_version) < 11 { + exit +} + +******************** END EXIT IF STATA VERSION < 9 ***************************** + +******************************************************************************* +*************************** BEGIN MATA CODE *********************************** +******************************************************************************* + +version 11.2 +mata: + +// ********* MATA CODE SHARED BY ivreg2 AND ranktest *************** // +// ********* 1. struct ms_vcvorthog *************** // +// ********* 2. m_omega *************** // +// ********* 3. m_calckw *************** // +// ********* 4. s_vkernel *************** // +// *********************************************************************** // + +// For reference: +// struct ms_vcvorthog { +// string scalar ename, Znames, touse, weight, wvarname +// string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel +// string scalar sw, psd, ivarname, tvarname, tindexname +// real scalar wf, N, bw, tdelta, dofminus +// real scalar center +// real matrix ZZ +// pointer matrix e +// pointer matrix Z +// pointer matrix wvar +// } + +void s_rkstat( string scalar vl1, + string scalar vl2, + string scalar partial, + string scalar wvarname, + string scalar weight, + scalar wf, + scalar N, + scalar cons, + string scalar touse, + string scalar LMWald, + string scalar allrank, + string scalar nullrank, + string scalar fullrank, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + bw, + string scalar tvarname, + string scalar ivarname, + string scalar tindexname, + tdelta, + dofminus, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar tempvl1, + string scalar tempvl2) +{ + +// iid flag used below + iid = ((kernel=="") & (robust=="") & (clustvarname=="")) + +// tempx, tempy and tempz are the Stata names of temporary variables that will be changed by s_rkstat + tempy=tokens(tempvl1) + tempz=tokens(tempvl2) + tempx=tokens(partial) + + st_view(y=.,.,tokens(vl1),touse) + st_view(z=.,.,tokens(vl2),touse) + st_view(yhat=.,.,tempy,touse) + st_view(zhat=.,.,tempz,touse) + if (partial~="") { + st_view(x=.,.,tempx,touse) + } + st_view(mtouse=.,.,tokens(touse),touse) + st_view(wvar=.,.,tokens(wvarname),touse) + noweight=(st_vartype(wvarname)=="byte") + + K=cols(y) // count of vars in first varlist + L=cols(z) // count of vars in second varlist + P=cols(x) // count of vars to be partialled out (excluding constant) + +// Note that we now use wf*wvar instead of wvar +// because wvar is raw weighting variable and +// wf*wvar normalizes so that sum(wf*wvar)=N. + +// Partial out the X variables. +// Note that this includes demeaning if there is a constant, +// i.e., variables are centered. + if (cons & P>0) { // Vars to partial out including constant + ymeans = mean(y,wf*wvar) + zmeans = mean(z,wf*wvar) + xmeans = mean(x,wf*wvar) + xy = quadcrossdev(x, xmeans, wf*wvar, y, ymeans) + xz = quadcrossdev(x, xmeans, wf*wvar, z, zmeans) + xx = quadcrossdev(x, xmeans, wf*wvar, x, xmeans) + } + else if (!cons & P>0) { // Vars to partial out NOT including constant + xy = quadcross(x, wf*wvar, y) + xz = quadcross(x, wf*wvar, z) + xx = quadcross(x, wf*wvar, x) + } + else { // Only constant to partial out = demean + ymeans = mean(y,wf*wvar) + zmeans = mean(z,wf*wvar) + } +// Partial-out coeffs. Default Cholesky; use QR if not full rank and collinearities present. +// Not necessary if no vars other than constant + if (P>0) { + by = cholqrsolve(xx, xy) + bz = cholqrsolve(xx, xz) + } +// Replace with residuals + if (cons & P>0) { // Vars to partial out including constant + yhat[.,.] = (y :- ymeans) - (x :- xmeans)*by + zhat[.,.] = (z :- zmeans) - (x :- xmeans)*bz + } + else if (!cons & P>0) { // Vars to partial out NOT including constant + yhat[.,.] = y - x*by + zhat[.,.] = z - x*bz + } + else if (cons) { // Only constant to partial out = demean + yhat[.,.] = (y :- ymeans) + zhat[.,.] = (z :- zmeans) + } + else { // no transformations required + yhat[.,.] = y + zhat[.,.] = z + } + + zhzh = quadcross(zhat, wf*wvar, zhat) + zhyh = quadcross(zhat, wf*wvar, yhat) + yhyh = quadcross(yhat, wf*wvar, yhat) + +// pihat = invsym(zhzh)*zhyh + pihat = cholqrsolve(zhzh, zhyh) + +// rzhat is F in paper (p. 103) +// iryhat is G in paper (p. 103) + ryhat=cholesky(yhyh) + rzhat=cholesky(zhzh) + iryhat=luinv(ryhat') + irzhat=luinv(rzhat') + that=rzhat'*pihat*iryhat + +// cc is canonical correlations. Squared cc is eigenvalues. + fullsvd(that, ut, cc, vt) + vt=vt' + vecth=vec(that) + ev = cc:^2 +// S matrix in paper (p. 100). Not used in code below. +// smat=fullsdiag(cc, rows(that)-cols(that)) + + if (abs(1-cc[1,1])<1e-10) { +printf("\n{text:Warning: collinearities detected between (varlist1) and (varlist2)}\n") + } + if ((missing(ryhat)>0) | (missing(iryhat)>0) | (missing(rzhat)>0) | (missing(irzhat)>0)) { +printf("\n{error:Error: non-positive-definite matrix. May be caused by collinearities.}\n") + exit(error(3351)) + } + +// If Wald, yhat is residuals + if (LMWald=="Wald") { + yhat[.,.]=yhat-zhat*pihat + yhyh = quadcross(yhat, wvar, yhat) + } + +// Covariance matrices +// vhat is W in paper (eqn below equation 17, p. 103) +// shat is V in paper (eqn below eqn 15, p. 103) + +// ************************************************************************************* // +// shat calculated using struct and programs m_omega, m_calckw shared with ivreg2 // + + struct ms_vcvorthog scalar vcvo + + + vcvo.ename = tempy // ivreg2 has = ename // + vcvo.Znames = tempz // ivreg2 has = Znames // + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = zhzh // ivreg2 has = st_matrix(ZZmatrix) // + + vcvo.e = &yhat // ivreg2 has = &e // + vcvo.Z = &zhat // ivreg2 has = &Z // + vcvo.wvar = &wvar + + shat=m_omega(vcvo) + +// *************************************************************************************** + +// prepare to start collecting test stats + if (allrank~="") { + firstrank=1 + lastrank=min((K,L)) + } + else if (nullrank~="") { + firstrank=1 + lastrank=1 + } + else if (fullrank~="") { + firstrank=min((K,L)) + lastrank=min((K,L)) + } + else { +// should never reach this point +printf("ranktest error\n") + exit + } + +// where results will go + rkmatrix=J(lastrank-firstrank+1,6,.) + +// *************************************************************************************** +// Calculate vector of canonical correlations test statistics. +// All we need if iid case. + rkvec = ev // Initialize vector with individual eigenvalues. + if (LMWald~="LM") { // LM is sum of min evals, Wald is sum of eval/(1-eval) + rkvec = rkvec :/ (1 :- rkvec) + } + for (i=(rows(rkvec)-1); i>=1; i--) { // Now loop through and sum the eigenvalues. + rkvec[i,1] = rkvec[i+1,1] + rkvec[i,1] + } + rkvec = N*rkvec // Multiply by N to get the test statistics. + +// *************************************************************************************** + +// Finally, calcluate vhat + if ((LMWald=="LM") & (iid)) { +// Homoskedastic, iid LM case means vcv is identity matrix +// Generates canonical correlation stats. Default. + vhat=I(L*K,L*K)/N + } + else { + vhat=(iryhat'#irzhat')*shat*(iryhat'#irzhat')' * N + _makesymmetric(vhat) +// Homoskedastic iid Wald case means vcv has block-diag identity matrix structure. +// Enforce this by setting ~0 entries to 0. If iid, vhat not used in calcs, for reporting only. + if ((LMWald=="Wald") & (iid)) { + vhat = vhat :* (J(K,K,1)#I(L)) + } + } + +// *************************************************************************************** +// Loop through ranks and collect test stats, dfs, p-values, ranks, evs and ev^2 (=ccs) + + for (i=firstrank; i<=lastrank; i++) { + if (iid) { // iid case = canonical correlations test + rk = rkvec[i,1] + } + else { // non-iid case + if (i>1) { + u12=ut[(1::i-1),(i..L)] + v12=vt[(1::i-1),(i..K)] + } + u22=ut[(i::L),(i..L)] + v22=vt[(i::K),(i..K)] + + symeigensystem(u22*u22', evec, eval) + u22v=evec + u22d=diag(eval) + u22h=u22v*(u22d:^0.5)*u22v' + + symeigensystem(v22*v22', evec, eval) + v22v=evec + v22d=diag(eval) + v22h=v22v*(v22d:^0.5)*v22v' + + if (i>1) { + aq=(u12 \ u22)*luinv(u22)*u22h + bq=v22h*luinv(v22')*(v12 \ v22)' + } + else { + aq=u22*luinv(u22)*u22h + bq=v22h*luinv(v22')*v22' + } + +// lab is lambda_q in paper (eqn below equation 21, p. 104) +// vlab is omega_q in paper (eqn 19 in paper, p. 104) + lab=(bq#aq')*vecth + vlab=(bq#aq')*vhat*(bq#aq')' + +// Symmetrize if numerical inaccuracy means it isn't + _makesymmetric(vlab) + vlabinv=invsym(vlab) +// rk stat Assumption 2: vlab (omega_q in paper) is nonsingular. Detected by a zero on the diagonal, +// since when returning a generalized inverse, Stata/Mata choose the generalized inverse that +// sets entire column(s)/row(s) to zeros. + if (diag0cnt(vlabinv)>0) { + rk = . +printf("\n{text:Warning: covariance matrix omega_%f}", i-1) +printf("{text: not full rank; test of rank %f}", i-1) +printf("{text: unavailable}\n") + } +// Note not multiplying by N - already incorporated in vhat. + else { + rk=lab'*vlabinv*lab + } + } // end non-iid case +// at this point rk has value of test stat +// fill out rest of row of rkmatrix +// save df, rank, etc. even if test stat not available. + df=(L-i+1)*(K-i+1) + pvalue=chi2tail(df, rk) + rkmatrix[i-firstrank+1,1]=rk + rkmatrix[i-firstrank+1,2]=df + rkmatrix[i-firstrank+1,3]=pvalue + rkmatrix[i-firstrank+1,4]=i-1 + rkmatrix[i-firstrank+1,5]=ev[i-firstrank+1,1] + rkmatrix[i-firstrank+1,6]=cc[i-firstrank+1,1] +// end of test loop + } + +// *************************************************************************************** +// Finish up and return results + + st_matrix("r(rkmatrix)", rkmatrix) + st_matrix("r(ccorr)", cc') + st_matrix("r(eval)",ev') +// Save V matrix as in paper, without factor of 1/N + vhat=N*vhat*wf + st_matrix("r(V)", vhat) +// Save S matrix as in ivreg2, with factor of 1/N + st_matrix("r(S)", shat) + st_numscalar("r(N)", N) + if (clustvarname~="") { + st_numscalar("r(N_clust)", N_clust) + } + if (clustvarname2~="") { + st_numscalar("r(N_clust2)", N_clust2) + } +// end of program +} + +// Mata utility for sequential use of solvers +// Default is cholesky; +// if that fails, use QR; +// if overridden, use QR. + +function cholqrsolve ( numeric matrix A, + numeric matrix B, + | real scalar useqr) +{ + if (args()==2) useqr = 0 + + real matrix C + + if (!useqr) { + C = cholsolve(A, B) + if (C[1,1]==.) { + C = qrsolve(A, B) + } + } + else { + C = qrsolve(A, B) + } + + return(C) + +} + +end + +* Version notes +* 1.0.00 First distributed version +* 1.0.01 With iweights, rkstat truncates N to mimic official Stata treatment of noninteger iweights +* Added warning if shat/vhat/vlab not of full rank. +* 1.0.02 Added NULLrank option +* Added eq names to saved V and S matrices +* 1.0.03 Added error catching for collinearities between varlists +* Not saving S matrix; V matrix now as in paper (without 1/N factor) +* Statistic, p-value etc set to missing if vcv not of full rank (Assumpt 2 in paper fails) +* 1.0.04 Fixed touse bug - was treating missings as touse-able +* Change some cross-products in robust loops to quadcross +* 1.0.05 Fixed bug with col/row names and ts operators. Added eval to saved matrices. +* 1.1.00 First ssc-ideas version. Added version 9.2 prior to Mata compiled section. +* 1.1.01 Allow non-integer bandwidth +* 1.1.02 Changed calc of yhat, zhat and pihat to avoid needlessly large intermediate matrices +* and to use more accurate qrsolve instead of inverted X'X. +* 1.1.03 Fixed touse bug that didn't catch missing cluster variable +* Fixed cluster bug - data needed to be sorted by cluster for Mata panel functions to work properly +* 1.2.00 Changed reporting so that gaps between panels are not reported as such. +* Added support for tdelta in tsset data. +* Changed tvar and ivar setup so that data must be tsset or xtset. +* Removed unnecessary loops through panel data with spectral kernels +* shat vcv now also saved. +* Added support for Thompson/Cameron-Gelbach-Miller 2-level cluster-robust vcvv +* Added support for Stock-Watson vcv - but requires data to have FEs partialled out, & doesn't support fweights +* Removed mimicking of Stata mistake of truncated N with iweights to nearest integer +* Fixed small bug with quadratic kernel (wasn't using negative weights) +* Optimised code dealing with time-series data +* 1.2.01 Fixed bug that always used Stock-Watson spectral decomp to create invertible shat +* instead of only when (undocumented) spsd option is called. +* 1.2.02 Fixed bug that did not allow string cluster variables +* 1.2.03 Fixed bug in code for cluster+kernel robust (typo in imported code from ivreg2=>crash) +* 1.2.04 Replaced code for S with ivreg2 code modified to support e matrix (cols > 1) +* Code block (m_omega, m_calckw, struct definition) now shared by ranktest and ivreg2. +* Renamed spsd option to psd following ivreg2 3.0.07 +* Added wf ("weight factor") and statement about sum of weights, as in ivreg2 +* Added dofminus option, as in ivreg2 +* Fixed minor reporting bug - was reporting gaps in entire panel, not just touse-d portion +* Recoded kernel & bw checks to use shared ivreg2 subroutine vkernel +* 1.2.05 Fixed weighting bug introduced in 1.2.04. All weights were affected. +* Was result of incompatibility of code shared with ivreg2. +* 1.3.01 First ranktest version with accompanying Mata library (shared with -ivreg2-). +* Mata library includes struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Fixed bug in 2-way cluster code (now in m_omega in Mata library) - would crash if K>1. +* 1.3.02 Improved partialling out and matrix inversion - switched from qrsolve to invsym. +* Use _makesymmetric() instead of symmetrizing by hand. +* 1.3.03 01Jan14. Fixed reporting bug with 2-way clustering and kernel-robust that would give +* wrong count for 2nd cluster variable. +* 1.3.04 24Aug14. Fixed bug in markout - would include obs where some vars were missing +* 1.3.05 22Jan15. Promotion to version 11.2; forks to ranktest9 if version<=10; requires +* capture before "version 11.2" in Mata section since must load before forking. +* Renamed subroutine rkstat to s_rkstat. +* 1.4.01 16Aug15. Pass cons flag to Mata code. Added cholqrsolve() utility (use qr if chol fails). +* Partial code rewritten to use centering and cholqrsolve. pihat uses cholqrsolve. +* Separate code for iid and non-iid cases (faster, more accurate for iid case). +* Fixed bug in naming rows/cols of saved V and S matrices (wasn't unab-ing the varlists). +* Updated undocumented psd options psd0 and psda. Tweaked cluster count code to match ivreg2. +* Added r(version) and r(cmd) macros. diff --git a/ado/r/ranktest11.sthlp b/ado/r/ranktest11.sthlp new file mode 100644 index 0000000..e915c92 --- /dev/null +++ b/ado/r/ranktest11.sthlp @@ -0,0 +1,433 @@ +{smcl} +{* 9dec2018}{...} +{hline} +help for {hi:ranktest11} +{hline} + +{title:ranktest11: module for testing the rank of a matrix using the Kleibergen-Paap rk statistic} + +{p 4}Full syntax + +{p 8 14}{cmd:ranktest11} +{cmd:(}{it:varlist1}{cmd:)} +{cmd:(}{it:varlist2}{cmd:)} +[{it:weight}] +[{cmd:if} {it:exp}] [{cmd:in} {it:range}] +{bind:[{cmd:, {cmd:partial(}{it:varlist3}{cmd:)}}} +{cmd:wald} +{cmdab:all:rank} +{cmdab:full:rank} +{cmdab:null:rank} +{cmdab:r:obust} +{cmd:bw(}{it:#}{cmd:)} +{cmd:kernel(}{it:string}{cmd:)} +{cmdab:cl:uster}{cmd:(}{it:varlist}{cmd:)} +{bind:{cmdab:noc:onstant} ]} + +{p 4}Version syntax + +{p 8 14}{cmd:ranktest11}, {cmd:version} + +{p}{cmd:ranktest11} is a version of {cmd:ranktest} that works with Stata 11 or earlier. +The current version of {cmd:ranktest} has more features and reports a wider range of tests; +to install it, type or click on {stata "ssc install ranktest"}. + +{p}{cmd:ranktest11} may be used with time-series or panel data, +in which case the data must be {cmd:tsset} +before using {cmd:ranktest11}; see help {help tsset}. + +{p}All {it:varlists} may contain time-series operators; +see help {help varlist}. +If {cmd:(}{it:varlist1}{cmd:)} or {cmd:(}{it:varlist1}{cmd:)} contain a single variable, +the parentheses {cmd:()} may be omitted. + +{p}{cmd:aweight}s, {cmd:fweight}s, {cmd:iweight}s and {cmd:pweight}s +are allowed; see help {help weights}. + +{p}{cmd:ranktest11} is an r-class program. + +{title:Contents} +{p 2}{help ranktest11##s_description:Description}{p_end} +{p 2}{help ranktest11##s_examples:Options}{p_end} +{p 2}{help ranktest11##s_examples:Examples}{p_end} +{p 2}{help ranktest11##s_refs:References}{p_end} +{p 2}{help ranktest11##s_acknow:Acknowledgements}{p_end} +{p 2}{help ranktest11##s_citation:Authors}{p_end} +{p 2}{help ranktest11##s_citation:Citation of ranktest11}{p_end} + +{marker s_description}{title:Description} + +{p}{cmd:ranktest11} implements the Kleibergen-Paap (2006) +rk test for the rank of a matrix. +Tests of the rank of a matrix have many practical applications. +For example, in econometrics the requirement for identification +is the rank condition, +which states that a particular matrix must be of full column rank. +Another example from econometrics concerns +cointegration in vector autoregressive (VAR) models; +the Johansen trace test is a test of a rank of a particular matrix. +The traditional test of the rank of a matrix for the standard (stationary) case +is the Anderson (1951) canonical correlations test. +If we denote one list of variables as Y and a second as Z, +and we calculate the squared canonical correlations between Y and Z, +the LM form of the Anderson test, +where the null hypothesis is that +the matrix of correlations or regression parameters B between Y and Z has rank(B)=r, +is N times the sum of the r+1 largest squared canonical correlations. +A large test statistic and +rejection of the null indicates that the matrix has rank at least r+1. +The Cragg-Donald (1993) statistic is a closely related Wald test +for the rank of a matrix. +Both the Anderson and Cragg-Donald tests require the assumption +that the covariance matrix has a Kronecker form; +when this is not so, +e.g., when disturbances are heteroskedastic or autocorrelated, +the test statistics are no longer valid. + +{p}The Kleibergen-Paap (2006) rk statistic is a generalization +of the Anderson canonical correlation rank test +to the case of a non-Kronecker covariance matrix. +The implementation in {cmd:ranktest11} +will calculate rk statistics that are robust to various forms of +heteroskedasticity, autocorrelation, and clustering. +For a full discussion of the test statistic +and its relationship other test statistics for the rank of a matrix, +see Kleibergen-Paap (2006). + +{p}The text is applied to Y and Z, +where Y={it:varlist1} and Z={it:varlist2}. +Optionally, a third set of variables X={it:varlist3} +can be partialled-out of Y and Z +with the {cmd:partial()} option. +A constant is automatically partialled out, +unless the user specifies the {cmd:nocons} option. +To test if a matrix is rank r+1, +the null hypothesis is Ho: rank(B)=r. +Rejection of the null indicates that the matrix +has at least rank=r+1. +In the standard (stationary) case, +the test statistic is distributed as chi-squared +with degrees of freedom = (K-r)*(L-r), +where K is the number of Y variables, +L is the number of Z variables, +and r is the rank being tested in Ho. +For example, +to test if the matrix is full column rank K where K1 the test statistics for rank=0 reported by {cmd:ranktest11} +can be reproduced by testing the joint significance of the Z variables +across the K equations for the Y variables. +See the examples below. + +{marker s_options}{title:Options summary} + +{p 0 4}{cmd:partial(}{it:varlist3}{cmd:)} +requests that the variables in {cmd:(}{it:varlist3}{cmd:)} +are partialled out of the variables in +{cmd:(}{it:varlist1}{cmd:)} and {cmd:(}{it:varlist2}{cmd:)}. +A constant is automatically partialled out as well, +unless the option {cmd:noconstant} is specified. + +{p 0 4}{cmd:wald} requests the Wald instead of the LM version of the test. +The LM version is the default. + +{p 0 4}{cmdab:all:rank} requests that test statistics +for rank=0, rank=1, ..., rank=(#cols-1) be reported, +where (#cols-1) is the number of columns +of the smaller of the two matrices (varlists). +{cmdab:all:rank} is the default. + +{p 0 4}{cmdab:full:rank} requests that only the test statistic +for Ho: rank=(#cols-1) be reported, +where (#cols-1) is the number of columns +of the smaller of the two matrices (varlists). +Rejection of the null indicates that the matrix +is of full column rank. + +{p 0 4}{cmdab:null:rank} requests that only the test statistic +for Ho: rank=0 be reported. +Rejection of the null indicates that the matrix has at least rank=1. + +{p 0 4}{cmd:robust} specifies that the Eicker/Huber/White/sandwich +heteroskedastic-robust estimator of variance is to be used. +The reported rk statistic will be robust to heteroskedasticity. + +{p 0 4}{cmd:cluster}{cmd:(}{it:varlist}{cmd:)} specifies that +observations are independent across groups (clusters) +but not necessarily independent within groups. +{it:varname} specifies to which group each observation belongs. +Specifying {cmd:cluster()} implies {cmd:robust}, +i.e., the reported rk statistic will be robust to both +heteroskedasticity and within-cluster correlation. +If {cmd:ivreg2} version 3.0 or later is installed, 2-way clustering is supported; +see help {help ivreg2} for details. + +{p 0 4}{cmd:bw(}{it:#}{cmd:)} impements +autocorrelation-consistent (AC) +or heteroskedasticity- and autocorrelation-consistent (HAC) +covariance estimation with bandwidth equal to {it:#}, +where {it:#} is an integer greater than zero. +Specifying {cmd:robust} together with {cmd:bw(}{it:#}{cmd:)} +implements HAC covariance estimation; +omitting {cmd:robust} implements AC covariance estimation. + +{p 0 4}{cmd:kernel(}{it:string)}{cmd:)} specifies the kernel +to be used for AC and HAC covariance estimation; +the default kernel is Bartlett +(also known in econometrics as Newey-West). +Kernels available are (abbreviations in parentheses): +Bartlett (bar); Truncated (tru); Parzen (par); Tukey-Hanning (thann); Tukey-Hamming (thamm); +Daniell (dan); Tent (ten); and Quadratic-Spectral (qua or qs). +Note that for some kernels (bar, par, thann and thamm) +the bandwidth must be at least 2 +to obtain an autocorrelation-consistent estimator. + +{p 0 4}{cmd:noconstant} suppresses the constant term (intercept) in the +list of partialled-out variables. + +{p 0 4}{cmd:version} causes {cmd:ranktest11} to display its current version number +and to leave it in the macro {cmd:s(version)}. +It cannot be used with any other options. + +{marker s_macros}{title:Saved results} + +{p}{cmd:ranktest11} saves the following results in {cmd:r()}: + +Scalars +{col 4}{cmd:r(N)}{col 18}Number of observations +{col 4}{cmd:r(N_clust)}{col 18}Number of clusters +{col 4}{cmd:r(chi2)}{col 18}rk statistic for highest rank tested +{col 4}{cmd:r(p)}{col 18}p-value of rk statistic +{col 4}{cmd:r(rdf)}{col 18}dof of rk statistic +{col 4}{cmd:r(rank)}{col 18}Rank of matrix under Ho for highest rank tested + +Macros +{col 4}{cmd:r(version)}{col 18}Version number of {cmd:ranktest11} + +Matrices +{col 4}{cmd:r(rkmarix)}{col 18}Saved results of rank tests +{col 4}{cmd:r(ccorr)}{col 18}Matrix of canonical correlations +{col 4}{cmd:r(eval)}{col 18}Matrix of eigenvalues (=squared canonical correlations) +{col 4}{cmd:r(V)}{col 18}Covariance matrix (W in Kleibergen-Paap (2006), p. 103) + +{marker s_examples}{title:Examples} + +{col 0}{bf:Tests for underidentification of Klein consumption equation.} + +{col 0}(Underidentification means endogenous regressors (profits wagetot) are not identified +{col 0}by the excluded instruments (govt taxnetx year wagegovt capital1 L.totinc) after +{col 0}partialling-out the included instruments (L.totinc _cons). Test is equivalent to +{col 0}testing whether the matrix of reduced form coefficients for the endogenous regressors +{col 0}is full rank (#cols=2) vs. less than full rank (#cols=1). The test for underidentification +{col 0}should not be confused with a test for "weak identification"; see e.g. Stock and Yogo (2005) +{col 0}or Baum et al. (2007).) + +{col 9}{stata "webuse klein, clear" :. webuse klein, clear} + +{col 9}{stata "tsset yr" :. tsset yr} + +{col 0}(Klein consumption equation - for reference) + +{p 8 12}{stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc)" :. ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc)} + +{col 0}(Homoskedasticity, LM => Anderson canonical correlations test; test all ranks. Ho of +{col 0}rank=1 can be rejected, suggesting the model is identified.) + +{p 8 12}{stata "ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits)" :. ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits)} + +{col 0}(Homoskedasticity, Wald => Cragg-Donald (1993) test; test all ranks. Ho of rank=1 can +{col 0}be rejected, suggesting model is identified.) + +{p 8 12}{stata "ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald" :. ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald} + +{col 0}(Heteroskedastic robust, LM statistic, test for full rank only. Ho of rank=1 now +{col 0}cannot be rejected, suggesting model may be underidentified.) + +{p 8 12}{stata "ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) full robust" :. ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) full robust} + +{col 0}(Heteroskedastic and autocorrelation robust, LM statistic, test for null rank only) + +{p 8 12}{stata "ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) null robust bw(2)":. ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) null robust bw(2)} + +{col 0}{bf:Testing for reduced rank in VAR models.} + +{col 0}(Relationship of Johansen trace statistic and Anderson canonical correlations statistic. +{col 0}Former is an LR test, {cmd:ranktest11} reports LM version of latter, but based on the same +{col 0}eigenvalues. Note that the p-values reported by {cmd:ranktest11} are not valid in this application +{col 0}because they are for the standard stationary case.) + +{p 8 12}{stata "vecrank consump profits wagetot, lags(1)" :. vecrank consump profits wagetot, lags(1)} + +{p 8 12}{stata "ranktest11 (d.consump d.profits d.wagetot) (L1.consump L1.profits L1.wagetot)" :. ranktest11 (d.consump d.profits d.wagetot) (L1.consump L1.profits L1.wagetot)} + +{p 8 12}{stata "mat eval=r(eval)" :. mat eval=r(eval)} + +{p 8 12}{stata "mat list eval" :. mat list eval} + +{col 0}({cmd:vecrank} LR trace statistic for maximum rank=0 vs. {cmd:ranktest11} LM canonical correlations +{col 0}statistic for same. Both statistics calculated using the same eigenvalues.) + +{p 8 12}{stata "di -r(N)*(ln(1-eval[1,1]) + ln(1-eval[1,2]) + ln(1-eval[1,3]))" :. di -r(N)*(ln(1-eval[1,1]) + ln(1-eval[1,2]) + ln(1-eval[1,3]))} + +{p 8 12}{stata "di r(N)*(eval[1,1] + eval[1,2] + eval[1,3])" :. di r(N)*(eval[1,1] + eval[1,2] + eval[1,3])} + +{col 0}{bf:Equalities between rk statistic and other test statistics} + +{col 0}(Equivalence of rk statistic and canonical correlations under homoskedasticity) + +{p 8 12}{stata "canon (profits wagetot) (govt taxnetx year wagegovt)" :. canon (profits wagetot) (govt taxnetx year wagegovt)} + +{p 8 12}{stata "mat list e(ccorr)" :. mat list e(ccorr)} + +{p 8 12}{stata "ranktest11 (profits wagetot) (govt taxnetx year wagegovt)" :. ranktest11 (profits wagetot) (govt taxnetx year wagegovt)} + +{p 8 12}{stata "mat list r(rkmatrix)" :. mat list r(rkmatrix)} + +{col 0}(Equality of rk statistic and Wald test from OLS regression in special case +{col 0} of single regressor) + +{p 8 12}{stata "ranktest11 (profits) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald robust" :. ranktest11 (profits) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald robust} + +{p 8 12}{stata "regress profits govt taxnetx year wagegovt capital1 L.totinc L.profits, robust" :. regress profits govt taxnetx year wagegovt capital1 L.totinc L.profits, robust} + +{p 8 12}{stata "testparm govt taxnetx year wagegovt capital1 L.totinc" :. testparm govt taxnetx year wagegovt capital1 L.totinc} + +{p 8 12}{stata "di r(F)*r(df)*e(N)/e(df_r)" :. di r(F)*r(df)*e(N)/e(df_r)} + +{col 0}(Equality of rk statistic and LM test from OLS regression in special case +{col 0} of single regressor. Generate a group variable to illustrate {cmd:cluster}) + +{p 8 12}{stata "gen clustvar = round(yr/2)" :. gen clustvar = round(yr/2)} + +{p 8 12}{stata "ranktest11 (profits) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) cluster(clustvar)" :. ranktest11 (profits) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) cluster(clustvar)} + +{p 8 12}{stata "ivreg2 profits L.profits (=govt taxnetx year wagegovt capital1 L.totinc), cluster(clustvar)" :. ivreg2 profits L.profits (=govt taxnetx year wagegovt capital1 L.totinc), cluster(clustvar)} + +{p 8 12}{stata "di e(j)" :. di e(j)} + +{col 0}(Equality of rk statistic of null rank and Wald test from OLS regressions and a +{col 0}Kronecker covariance matrix (independent and homoskedastic equations). To show equality, +{col 0}estimate the equations using {cmd:reg3} specifying that all regressors are exogenous, +{col 0}and then test joint significance of Z variables in both regressions. L.profits is the +{col 0}partialled-out variable and is not tested.) + +{p 8 12}{stata "ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald null ":. ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald null} + +{p 8 12}{stata "global e1 (profits govt taxnetx year wagegovt capital1 L.totinc L.profits)" :. global e1 (profits govt taxnetx year wagegovt capital1 L.totinc L.profits)} + +{p 8 12}{stata "global e2 (wagetot govt taxnetx year wagegovt capital1 L.totinc L.profits)" :. global e2 (wagetot govt taxnetx year wagegovt capital1 L.totinc L.profits)} + +{p 8 12}{stata "reg3 $e1 $e2, allexog" :. reg3 $e1 $e2, allexog} + +{p 8 12}{stata "qui test [profits]govt [profits]taxnetx [profits]year [profits]wagegovt [profits]capital1 [profits]L.totinc": . qui test [profits]govt [profits]taxnetx [profits]year [profits]wagegovt [profits]capital1 [profits]L.totinc} + +{p 8 12}{stata "test [wagetot]govt [wagetot]taxnetx [wagetot]year [wagetot]wagegovt [wagetot]capital1 [wagetot]L.totinc, accum": . test [wagetot]govt [wagetot]taxnetx [wagetot]year [wagetot]wagegovt [wagetot]capital1 [wagetot]L.totinc, accum} + +{col 0}(Equality of rk statistic of null rank and Wald test from OLS regressions and {cmd:suest}. +{col 0}To show equality, use {cmd:suest} to test joint significance of Z variables in both +{col 0}regressions. L.profits is the partialled-out variable and is not tested. Note that +{col 0}{cmd:suest} introduces a finite sample adjustment of (N-1)/N.) + +{p 8 12}{stata "ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald null robust":. ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald null robust} + +{p 8 12}{stata "di r(chi2)*(r(N)-1)/r(N)": . di r(chi2)*(r(N)-1)/r(N)} + +{p 8 12}{stata "qui regress profits govt taxnetx year wagegovt capital1 L.totinc L.profits":. qui regress profits govt taxnetx year wagegovt capital1 L.totinc L.profits} + +{p 8 12}{stata "est store e1": . est store e1} + +{p 8 12}{stata "qui regress wagetot govt taxnetx year wagegovt capital1 L.totinc L.profits":. qui regress wagetot govt taxnetx year wagegovt capital1 L.totinc L.profits} + +{p 8 12}{stata "est store e2": . est store e2} + +{p 8 12}{stata "qui suest e1 e2": . qui suest e1 e2} + +{p 8 12}{stata "qui test [e1_mean]govt [e1_mean]taxnetx [e1_mean]year [e1_mean]wagegovt [e1_mean]capital1 [e1_mean]L.totinc": . qui test [e1_mean]govt [e1_mean]taxnetx [e1_mean]year [e1_mean]wagegovt [e1_mean]capital1 [e1_mean]L.totinc} + +{p 8 12}{stata "test [e2_mean]govt [e2_mean]taxnetx [e2_mean]year [e2_mean]wagegovt [e2_mean]capital1 [e2_mean]L.totinc, accum": . test [e2_mean]govt [e2_mean]taxnetx [e2_mean]year [e2_mean]wagegovt [e2_mean]capital1 [e2_mean]L.totinc, accum} + + +{marker s_refs}{title:References} + +{p 0 4}Anderson, T.W. 1951. Estimating linear restrictions on regression coefficients +for multivariate normal distributions. Annals of Mathematical Statistics, Vol. 22, pp. 327-51. + +{p 0 4}Anderson, T.W. 1984. Introduction to Multivariate Statistical Analysis. +2d ed. New York: John Wiley & Sons. + +{p 0 4}Baum, C. F., Schaffer, M.E., and Stillman, S. 2007. Enhanced routines for instrumental variables/GMM estimation and testing. Boston College Department of Economics Working Paper No. 667. +{browse "http://ideas.repec.org/p/boc/bocoec/667.html":http://ideas.repec.org/p/boc/bocoec/667.html} + +{p 0 4}Cragg, J.G. and Donald, S.G. 1993. Testing Identfiability and Specification in +Instrumental Variables Models. Econometric Theory, Vol. 9, pp. 222-240. + +{p 0 4}Kleibergen, F. and Paap, R. 2006. Generalized Reduced Rank Tests Using the Singular Value Decomposition. +Journal of Econometrics, Vol. 133, pp. 97-126. + +{p 0 4}Stock, J.H. and Yogo, M. 2005. Testing for Weak Instruments in Linear IV Regression. In D.W.K. Andrews and J.H. Stock, eds. Identification and Inference for Econometric Models: Essays in Honor of Thomas Rothenberg. Cambridge: Cambridge University Press, 2005, pp. 80–108. +Working paper version: NBER Technical Working Paper 284. +{browse "http://www.nber.org/papers/T0284":http://www.nber.org/papers/T0284}. + +{marker s_acknow}{title:Acknowledgements} + +{p}We would like to thank Kit Baum and Austin Nichols for helpful suggestions and feedback. + +{marker s_citation}{title:Citation of ranktest11} + +{p}{cmd:ranktest11} is not an official Stata command. It is a free contribution +to the research community, like a paper. Please cite it as such: {p_end} + +{phang}Kleibergen, F., Schaffer, M.E. 2010. +ranktest11: module for testing the rank of a matrix using the Kleibergen-Paap rk statistic +{browse "http://ideas.repec.org/c/boc/bocode/s456865.html":http://ideas.repec.org/c/boc/bocode/s456865.html}{p_end} + +{title:Authors} + + Frank Kleibergen, Brown University, US + Frank_Kleibergen@brown.edu + + Mark E Schaffer, Heriot-Watt University, UK + m.e.schaffer@hw.ac.uk + +{title:Also see} + +{p 1 14}Manual: {hi:[R] canon}{p_end} + +{p 1 10}On-line: help for {help canon}, {help vecrank}, {help ivreg2} (if installed){p_end} diff --git a/ado/r/ranktest9.ado b/ado/r/ranktest9.ado new file mode 100644 index 0000000..9014e1b --- /dev/null +++ b/ado/r/ranktest9.ado @@ -0,0 +1,1387 @@ +*! ranktest9 1.3.06 18Aug2015 +*! based on ranktest 1.3.04 and livreg2 Mata library 1.1.07 +*! author mes, based on code by fk +*! see end of file for version comments + +program define ranktest9, rclass sortpreserve + version 9.2 + local lversion 01.3.05 + + if substr("`1'",1,1)== "," { + if "`2'"=="version" { + di in ye "`lversion'" + return local version `lversion' + exit + } + else { +di as err "invalid syntax" + exit 198 + } + } + +* If varlist 1 or varlist 2 have a single element, parentheses optional + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local y `s(varlist)' + local K : word count `y' + local 0 `"`s(rest)'"' + sret clear + } + else { + local y `1' + local K 1 + mac shift 1 + local 0 `"`*'"' + } + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local z `s(varlist)' + local L : word count `z' + local 0 `"`s(rest)'"' + sret clear + } + else { + local z `1' + local K 1 + mac shift 1 +* Need to reinsert comma before options (if any) for -syntax- command to work + local 0 `", `*'"' + } + +* Option version ignored here if varlists were provided + syntax [if] [in] [aw fw pw iw/] [, partial(varlist ts) fwl(varlist ts) /* + */ NOConstant wald ALLrank NULLrank FULLrank ROBust cluster(varlist) /* + */ BW(string) kernel(string) Tvar(varname) Ivar(varname) sw psd version /* + */ dofminus(integer 0) ] + + local partial "`partial' `fwl'" + + if "`noconstant'"=="" { + tempvar one + gen byte `one' = 1 + local partial "`partial' `one'" + } + + if "`wald'"~="" { + local LMWald "Wald" + } + else { + local LMWald "LM" + } + + local optct : word count `allrank' `nullrank' `fullrank' + if `optct' > 1 { +di as err "Incompatible options: `allrank' `nullrank' `fullrank'" + error 198 + } + else if `optct' == 0 { +* Default + local allrank "allrank" + } + +* Note that by tsrevar-ing here, subsequent disruption to the sort doesn't matter +* for TS operators. + tsrevar `y' + local vl1 `r(varlist)' + tsrevar `z' + local vl2 `r(varlist)' + tsrevar `partial' + local partial `r(varlist)' + + foreach vn of varlist `vl1' { + tempvar tv + qui gen double `tv' = . + local tempvl1 "`tempvl1' `tv'" + } + foreach vn of varlist `vl2' { + tempvar tv + qui gen double `tv' = . + local tempvl2 "`tempvl2' `tv'" + } + + marksample touse + markout `touse' `vl1' `vl2' `partial' `cluster', strok + +* Stock-Watson and cluster imply robust. + if "`sw'`cluster'" ~= "" { + local robust "robust" + } + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + if "`fsqrt(wf)*(wvar^0.5):*'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "fweight" & "`sw'" != "" { + di in red "fweights currently not supported with -sw- option" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`bw'" !="" { + di in red "iweights not allowed with robust, cluster, AC or HAC" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + + +* Every time a weight is used, must multiply by scalar wf ("weight factor") +* wf=1 for no weights, fw and iw, wf = scalar that normalizes sum to be N if aw or pw + sum `wvar' if `touse' `wtexp', meanonly +* Weight statement + if "`weight'" ~= "" { +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + if "`weight'"=="" | "`weight'"=="fweight" | "`weight'"=="iweight" { +* If weight is "", weight var must be column of ones and N is number of rows. +* With fw and iw, effective number of observations is sum of weight variable. + local wf=1 + local N=r(sum_w) + } + else if "`weight'"=="aweight" | "`weight'"=="pweight" { +* With aw and pw, N is number of obs, unadjusted. + local wf=r(N)/r(sum_w) + local N=r(N) + } + else { +* Should never reach here +di as err "ranktest error - misspecified weights" + exit 198 + } + +* HAC estimation. +* If bw is omitted, default `bw' is empty string. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. + if "`bw'" == "" & "`kernel'" == "" { + local bw=0 + } + else { +* Need tvar for markout with time-series stuff +* Data must be tsset for time-series operators in code to work +* User-supplied tvar checked if consistent with tsset + capture tsset + if "`r(timevar)'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } +* If no panel data, ivar will still be empty + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already -tsset-" + exit 5 + } + local tdelta `r(tdelta)' + tsreport if `touse', panel + if `r(N_gaps)' != 0 { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + +* Check it's a valid kernel and replace with unabbreviated kernel name; check bw. +* Automatic kernel selection allowed by ivreg2 but not ranktest so must trap. +* s_vkernel is in livreg2 mlib. + if "`bw'"=="auto" { +di as err "invalid bandwidth in option bw() - must be real > 0" + exit 198 + } + mata: s_ranktest9_vkernel("`kernel'", "`bw'", "`ivar'") + local kernel `r(kernel)' + local bw = `r(bw)' + } + +* tdelta missing if version 9 or if not tsset + if "`tdelta'"=="" { + local tdelta=1 + } + + if "`sw'"~="" { + capture xtset + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already tsset or xtset" + exit 5 + } +* Exit with error if ivar is neither supplied nor tsset nor xtset + if "`ivar'"=="" { +di as err "Must -xtset- or -tsset- data or specify -ivar- with -sw- option" + exit 198 + } + qui describe, short varlist + local sortlist "`r(sortlist)'" + tokenize `sortlist' + if "`ivar'"~="`1'" { +di as err "Error - dataset must be sorted on panel var with -sw- option" + exit 198 + } + } + +* Create variable used for getting lags etc. in Mata + tempvar tindex + qui gen `tindex'=1 if `touse' + qui replace `tindex'=sum(`tindex') if `touse' + +********** CLUSTER SETUP ********************************************** + +* Mata code requires data are sorted on (1) the first var cluster if there +* is only one cluster var; (2) on the 3rd and then 1st if two-way clustering, +* unless (3) two-way clustering is combined with kernel option, in which case +* the data are tsset and sorted on panel id (first cluster variable) and time +* id (second cluster variable). +* Second cluster var is optional and requires an identifier numbered 1..N_clust2, +* unless combined with kernel option, in which case it's the time variable. +* Third cluster var is the intersection of 1 and 2, unless combined with kernel +* opt, in which case it's unnecessary. +* Sorting on "cluster3 cluster1" means that in Mata, panelsetup works for +* both, since cluster1 nests cluster3. +* Note that it is possible to cluster on time but not panel, in which case +* cluster1 is time, cluster2 is empty and data are sorted on panel-time. +* Note also that if no kernel-robust, sorting will disrupt any tsset-ing, +* but data are tsrevar-ed earlier to avoid any problems. + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`kernel'"~="" { +* kernel requires either that cluster1 is time var and cluster2 is empty +* or that cluster1 is panel var and cluster2 is time var. +* Either way, data must be tsset and sorted for panel data. + if "`cluster2'"~="" { +* Allow backwards order + if "`cluster1'"=="`tvar'" & "`cluster2'"=="`ivar'" { + local cluster1 "`2'" + local cluster2 "`1'" + } + if "`cluster1'"~="`ivar'" | "`cluster2'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset panel & time vars." +di as err " tsset panel var=`ivar'; tsset time var=`tvar'; cluster vars=`cluster1',`cluster2'" + exit 198 + } + } + else { + if "`cluster1'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset time variable." +di as err " tsset time var=`tvar'; cluster var=`cluster1'" + exit 198 + } + } + } +* Simple way to get quick count of 1st cluster variable without disrupting sort +* clusterid1 is numbered 1.._Nclust1. + tempvar clusterid1 + qui egen `clusterid1'=group(`cluster1') if `touse' + sum `clusterid1' if `touse', meanonly + if "`cluster2'"=="" { + local N_clust=r(max) + local N_clust1=. + local N_clust2=. + if "`kernel'"=="" { +* Single level of clustering and no kernel-robust, so sort on single cluster var. +* kernel-robust already sorted via tsset. + sort `cluster1' + } + } + else { + local N_clust1=r(max) + if "`kernel'"=="" { + tempvar clusterid2 clusterid3 +* New cluster id vars are numbered 1..N_clust2 and 1..N_clust3 + qui egen `clusterid2'=group(`cluster2') if `touse' + qui egen `clusterid3'=group(`cluster1' `cluster2') if `touse' +* Two levels of clustering and no kernel-robust, so sort on cluster3/nested in/cluster1 +* kernel-robust already sorted via tsset. + sort `clusterid3' `cluster1' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) + } + else { +* Need to create this only to count the number of clusters + tempvar clusterid2 + qui egen `clusterid2'=group(`cluster2') if `touse' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) +* Now replace with original variable + local clusterid2 `cluster2' + } + local N_clust=min(`N_clust1',`N_clust2') + } + } + +************************************************************************************************ + +* Note that bw is passed as a value, not as a string + mata: s_ranktest9_rkstat( "`vl1'", /* + */ "`vl2'", /* + */ "`partial'", /* + */ "`wvar'", /* + */ "`weight'", /* + */ `wf', /* + */ `N', /* + */ "`touse'", /* + */ "`LMWald'", /* + */ "`allrank'", /* + */ "`nullrank'", /* + */ "`fullrank'", /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`tvar'", /* + */ "`ivar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ `dofminus', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`tempvl1'", /* + */ "`tempvl2'") + + tempname rkmatrix chi2 df df_r p rank ccorr eval + mat `rkmatrix'=r(rkmatrix) + mat `ccorr'=r(ccorr) + mat `eval'=r(eval) + mat colnames `rkmatrix' = "rk" "df" "p" "rank" "eval" "ccorr" + +di +di "Kleibergen-Paap rk `LMWald' test of rank of matrix" + if "`robust'"~="" & "`kernel'"~= "" & "`cluster'"=="" { +di " Test statistic robust to heteroskedasticity and autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`kernel'"~="" & "`cluster'"=="" { +di " Test statistic robust to autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`cluster'"~="" { +di " Test statistic robust to heteroskedasticity and clustering on `cluster'" + if "`kernel'"~="" { +di " and kernel-robust to common correlated disturbances" +di " Kernel: `kernel' Bandwidth: `bw'" + } + } + else if "`robust'"~="" { +di " Test statistic robust to heteroskedasticity" + } + else if "`LMWald'"=="LM" { +di " Test assumes homoskedasticity (Anderson canonical correlations test)" + } + else { +di " Test assumes homoskedasticity (Cragg-Donald test)" + } + + local numtests = rowsof(`rkmatrix') + forvalues i=1(1)`numtests' { +di "Test of rank=" %3.0f `rkmatrix'[`i',4] " rk=" %8.2f `rkmatrix'[`i',1] /* + */ " Chi-sq(" %3.0f `rkmatrix'[`i',2] ") pvalue=" %8.6f `rkmatrix'[`i',3] + } + scalar `chi2' = `rkmatrix'[`numtests',1] + scalar `p' = `rkmatrix'[`numtests',3] + scalar `df' = `rkmatrix'[`numtests',2] + scalar `rank' = `rkmatrix'[`numtests',4] + local N `r(N)' + return scalar df = `df' + return scalar chi2 = `chi2' + return scalar p = `p' + return scalar rank = `rank' + if "`cluster'"~="" { + return scalar N_clust = `N_clust' + } + if "`cluster2'"~="" { + return scalar N_clust1 = `N_clust1' + return scalar N_clust2 = `N_clust2' + } + return scalar N = `N' + return matrix rkmatrix `rkmatrix' + return matrix ccorr `ccorr' + return matrix eval `eval' + + tempname S V Omega + if `K' > 1 { + foreach en of local y { +* Remove "." from equation name + local en1 : subinstr local en "." "_", all + foreach vn of local z { + local cn "`cn' `en1':`vn'" + } + } + } + else { + foreach vn of local z { + local cn "`cn' `vn'" + } + } + mat `V'=r(V) + matrix colnames `V' = `cn' + matrix rownames `V' = `cn' + return matrix V `V' + mat `S'=r(S) + matrix colnames `S' = `cn' + matrix rownames `S' = `cn' + return matrix S `S' + + return local cmd "ranktest9" + return local version `lversion' +end + +* Adopted from -canon- +program define GetVarlist, sclass + sret clear + gettoken open 0 : 0, parse("(") + if `"`open'"' != "(" { + error 198 + } + gettoken next 0 : 0, parse(")") + while `"`next'"' != ")" { + if `"`next'"'=="" { + error 198 + } + local list `list'`next' + gettoken next 0 : 0, parse(")") + } + sret local rest `"`0'"' + tokenize `list' + local 0 `*' + sret local varlist "`0'" +end + + +******************************************************************************* +*************************** BEGIN MATA CODE *********************************** +******************************************************************************* + +version 9.2 +mata: + +// ********* struct ms_ranktest9_vcvorthog ******************* // +struct ms_ranktest9_vcvorthog { + string scalar ename, Znames, touse, weight, wvarname + string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel + string scalar sw, psd, ivarname, tvarname, tindexname + real scalar wf, N, bw, tdelta, dofminus + real matrix ZZ + pointer matrix e + pointer matrix Z + pointer matrix wvar +} + + +void s_ranktest9_rkstat( string scalar vl1, + string scalar vl2, + string scalar partial, + string scalar wvarname, + string scalar weight, + scalar wf, + scalar N, + string scalar touse, + string scalar LMWald, + string scalar allrank, + string scalar nullrank, + string scalar fullrank, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + bw, + string scalar tvarname, + string scalar ivarname, + string scalar tindexname, + tdelta, + dofminus, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar tempvl1, + string scalar tempvl2) +{ + +// tempx, tempy and tempz are the Stata names of temporary variables that will be changed by rkstat + if (partial~="") { + tempx=tokens(partial) + } + tempy=tokens(tempvl1) + tempz=tokens(tempvl2) + + st_view(y=.,.,tokens(vl1),touse) + st_view(z=.,.,tokens(vl2),touse) + st_view(yhat=.,.,tempy,touse) + st_view(zhat=.,.,tempz,touse) + st_view(mtouse=.,.,tokens(touse),touse) + st_view(wvar=.,.,tokens(wvarname),touse) + noweight=(st_vartype(wvarname)=="byte") + +// Note that we now use wf*wvar instead of wvar +// because wvar is raw weighting variable and +// wf*wvar normalizes so that sum(wf*wvar)=N. + +// Partial out the X variables +// Note that this is entered if there is a constant, +// i.e., variables are centered + if (partial~="") { + st_view(x=.,.,tempx,touse) + xx = quadcross(x, wf*wvar, x) + xy = quadcross(x, wf*wvar, y) + xz = quadcross(x, wf*wvar, z) + + by = invsym(xx)*xy + bz = invsym(xx)*xz + + yhat[.,.] = y-x*by + zhat[.,.] = z-x*bz + } + else { + yhat[.,.] = y + zhat[.,.] = z + } + K=cols(y) + L=cols(z) + + zhzh = quadcross(zhat, wf*wvar, zhat) + zhyh = quadcross(zhat, wf*wvar, yhat) + yhyh = quadcross(yhat, wf*wvar, yhat) + + pihat = invsym(zhzh)*zhyh +// rzhat is F in paper (p. 103) +// iryhat is G in paper (p. 103) + ryhat=cholesky(yhyh) + rzhat=cholesky(zhzh) + iryhat=luinv(ryhat') + irzhat=luinv(rzhat') + that=rzhat'*pihat*iryhat + +// cc is canonical correlations. Squared cc is eigenvalues. + fullsvd(that, ut, cc, vt) + vt=vt' + vecth=vec(that) + ev = cc:^2 +// S matrix in paper (p. 100). Not used in code below. +// smat=fullsdiag(cc, rows(that)-cols(that)) + + if (abs(1-cc[1,1])<1e-10) { +printf("\n{text:Warning: collinearities detected between (varlist1) and (varlist2)}\n") + } + if ((missing(ryhat)>0) | (missing(iryhat)>0) | (missing(rzhat)>0) | (missing(irzhat)>0)) { +printf("\n{error:Error: non-positive-definite matrix. May be caused by collinearities.}\n") + exit(error(3351)) + } + +// If Wald, yhat is residuals + if (LMWald=="Wald") { + yhat[.,.]=yhat-zhat*pihat + yhyh = quadcross(yhat, wvar, yhat) + } + +// Covariance matrices +// vhat is W in paper (eqn below equation 17, p. 103) +// shat is V in paper (eqn below eqn 15, p. 103) + +// ************************************************************************************* // +// shat calculated using struct and programs m_omega, m_calckw shared with ivreg2 // + + struct ms_ranktest9_vcvorthog scalar vcvo + + + vcvo.ename = tempy // ivreg2 has = ename // + vcvo.Znames = tempz // ivreg2 has = Znames // + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = zhzh // ivreg2 has = st_matrix(ZZmatrix) // + + vcvo.e = &yhat // ivreg2 has = &e // + vcvo.Z = &zhat // ivreg2 has = &Z // + vcvo.wvar = &wvar + + shat=m_ranktest9_omega(vcvo) + +// *************************************************************************************** + +// Finally, calcluate vhat + if ((LMWald=="LM") & (kernel=="") & (robust=="") & (clustvarname=="")) { +// Homoskedastic, iid LM case means vcv is identity matrix +// Generates canonical correlation stats. Default. + vhat=I(L*K,L*K)/N + } + else { + vhat=(iryhat'#irzhat')*shat*(iryhat'#irzhat')' * N + _makesymmetric(vhat) + } + +// ready to start collecting test stats + if (allrank~="") { + firstrank=1 + lastrank=min((K,L)) + } + else if (nullrank~="") { + firstrank=1 + lastrank=1 + } + else if (fullrank~="") { + firstrank=min((K,L)) + lastrank=min((K,L)) + } + else { +// should never reach this point +printf("ranktest error\n") + exit + } + + rkmatrix=J(lastrank-firstrank+1,6,.) + for (i=firstrank; i<=lastrank; i++) { + + if (i>1) { + u12=ut[(1::i-1),(i..L)] + v12=vt[(1::i-1),(i..K)] + } + u22=ut[(i::L),(i..L)] + v22=vt[(i::K),(i..K)] + + symeigensystem(u22*u22', evec, eval) + u22v=evec + u22d=diag(eval) + u22h=u22v*(u22d:^0.5)*u22v' + + symeigensystem(v22*v22', evec, eval) + v22v=evec + v22d=diag(eval) + v22h=v22v*(v22d:^0.5)*v22v' + + if (i>1) { + aq=(u12 \ u22)*luinv(u22)*u22h + bq=v22h*luinv(v22')*(v12 \ v22)' + } + else { + aq=u22*luinv(u22)*u22h + bq=v22h*luinv(v22')*v22' + } + +// lab is lambda_q in paper (eqn below equation 21, p. 104) +// vlab is omega_q in paper (eqn 19 in paper, p. 104) + lab=(bq#aq')*vecth + vlab=(bq#aq')*vhat*(bq#aq')' + +// Symmetrize if numerical inaccuracy means it isn't + _makesymmetric(vlab) + vlabinv=invsym(vlab) +// rk stat Assumption 2: vlab (omega_q in paper) is nonsingular. Detected by a zero on the diagonal, +// since when returning a generalized inverse, Stata/Mata choose the generalized inverse that +// sets entire column(s)/row(s) to zeros. +// Save df and rank even if test stat not available. + df=(L-i+1)*(K-i+1) + rkmatrix[i-firstrank+1,2]=df + rkmatrix[i-firstrank+1,4]=i-1 + if (diag0cnt(vlabinv)>0) { +printf("\n{text:Warning: covariance matrix omega_%f}", i-1) +printf("{text: not full rank; test of rank %f}", i-1) +printf("{text: unavailable}\n") + } +// Note not multiplying by N - already incorporated in vhat. + else { + rk=lab'*vlabinv*lab + pvalue=chi2tail(df, rk) + rkmatrix[i-firstrank+1,1]=rk + rkmatrix[i-firstrank+1,3]=pvalue + } +// end of test loop + } + +// insert squared (=eigenvalues if canon corr) and unsquared canon correlations + for (i=firstrank; i<=lastrank; i++) { + rkmatrix[i-firstrank+1,6]=cc[i-firstrank+1,1] + rkmatrix[i-firstrank+1,5]=ev[i-firstrank+1,1] + } + st_matrix("r(rkmatrix)", rkmatrix) + st_matrix("r(ccorr)", cc') + st_matrix("r(eval)",ev') +// Save V matrix as in paper, without factor of 1/N + vhat=N*vhat*wf + st_matrix("r(V)", vhat) +// Save S matrix as in ivreg2, with factor of 1/N + st_matrix("r(S)", shat) + st_numscalar("r(N)", N) + if (clustvarname~="") { + st_numscalar("r(N_clust)", N_clust) + } + if (clustvarname2~="") { + st_numscalar("r(N_clust2)", N_clust2) + } +// end of program +} + +// *********************************************************************** // +// **************** SUPPORT CODE (prev in livreg2.mlib ******************* // +// *********************************************************************** // + + +// ************************* s_ranktest9_vkernel ***************************** // +// Program checks whether kernel and bw choices are valid. +// s_ranktest9_vkernel is called from Stata. +// Arguments are the kernel name (req), bandwidth (req) and ivar name (opt). +// All 3 are strings. +// Returns results in r() macros. +// r(kernel) - name of kernel (string) +// r(bw) - bandwidth (scalar) + +void s_ranktest9_vkernel( string scalar kernel, + string scalar bwstring, + string scalar ivar + ) +{ + +// Check bandwidth + if (bwstring=="auto") { + bw=-1 + } + else { + bw=strtoreal(bwstring) + if (bw==.) { + printf("{err}bandwidth option bw() required for HAC-robust estimation\n") + exit(102) + } + if (bw<=0) { + printf("{err}invalid bandwidth in option bw() - must be real > 0\n") + exit(198) + } + } + +// Check ivar + if (bwstring=="auto" & ivar~="") { + printf("{err}Automatic bandwidth selection not available for panel data\n") + exit(198) + } + +// Check kernel +// Valid kernel list is abbrev, full name, whether special case if bw=1 +// First in list is default kernel = Barlett + vklist = ( ("", "bartlett", "0") + \ ("bar", "bartlett", "0") + \ ("bartlett", "bartlett", "0") + \ ("par", "parzen", "0") + \ ("parzen", "parzen", "0") + \ ("tru", "truncated", "1") + \ ("truncated", "truncated", "1") + \ ("thann", "tukey-hanning", "0") + \ ("tukey-hanning", "tukey-hanning", "0") + \ ("thamm", "tukey-hamming", "0") + \ ("tukey-hamming", "tukey-hamming", "0") + \ ("qua", "quadratic spectral", "1") + \ ("qs", "quadratic spectral", "1") + \ ("quadratic-spectral", "quadratic spectral", "1") + \ ("quadratic spectral", "quadratic spectral", "1") + \ ("dan", "danielle", "1") + \ ("danielle", "danielle", "1") + \ ("ten", "tent", "1") + \ ("tent", "tent", "1") + ) + kname=strltrim(strlower(kernel)) + pos = (vklist[.,1] :== kname) + +// Exit with error if not in list + if (sum(pos)==0) { + printf("{err}invalid kernel\n") + exit(198) + } + + vkname=strproper(select(vklist[.,2],pos)) + st_global("r(kernel)", vkname) + st_numscalar("r(bw)",bw) + +// Warn if kernel is type where bw=1 means no lags are used + if (bw==1 & select(vklist[.,3],pos)=="0") { + printf("{result}Note: kernel=%s", vkname) + printf("{result} and bw=1 implies zero lags used. Standard errors and\n") + printf("{result} test statistics are not autocorrelation-consistent.\n") + } +} // end of program s_ranktest9_vkernel + + +// ************************ m_ranktest9_omega ************************************** // + +real matrix m_ranktest9_omega(struct ms_ranktest9_vcvorthog scalar vcvo) +{ + if (vcvo.clustvarname~="") { + st_view(clustvar, ., vcvo.clustvarname, vcvo.touse) + info = panelsetup(clustvar, 1) + N_clust=rows(info) + if (vcvo.clustvarname2~="") { + st_view(clustvar2, ., vcvo.clustvarname2, vcvo.touse) + if (vcvo.kernel=="") { + st_view(clustvar3, ., vcvo.clustvarname3, vcvo.touse) // needed only if not panel tsset + } + } + } + + if (vcvo.kernel~="") { + st_view(t, ., st_tsrevar(vcvo.tvarname), vcvo.touse) + T=max(t)-min(t)+1 + } + + if ((vcvo.kernel=="Bartlett") | (vcvo.kernel=="Parzen") | (vcvo.kernel=="Truncated") /// + | (vcvo.kernel=="Tukey-Hanning")| (vcvo.kernel=="Tukey-Hamming")) { + window="lag" + } + else if ((vcvo.kernel=="Quadratic Spectral") | (vcvo.kernel=="Danielle") | (vcvo.kernel=="Tent")) { + window="spectral" + } + else if (vcvo.kernel~="") { +// Should never reach this point +printf("\n{error:Error: invalid kernel}\n") + exit(error(3351)) + } + + L=cols(*vcvo.Z) + K=cols(*vcvo.e) // ivreg2 always calls with K=1; ranktest may call with K>=1. + +// Covariance matrices +// shat * 1/N is same as estimated S matrix of orthog conditions + +// Block for homoskedastic and AC. dof correction if any incorporated into sigma estimates. + if ((vcvo.robust=="") & (vcvo.clustvarname=="")) { +// ZZ is already calculated as an external + ee = quadcross(*vcvo.e, vcvo.wf*(*vcvo.wvar), *vcvo.e) + sigma2=ee/(vcvo.N-vcvo.dofminus) + shat=sigma2#vcvo.ZZ + if (vcvo.kernel~="") { + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + tnow=st_data(., vcvo.tindexname) + for (tau=1; tau<=TAU; tau++) { + kw = m_ranktest9_calckw(tau, vcvo.bw, vcvo.kernel) + if (kw~=0) { // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + lstau = "L"+strofreal(tau) + tlag=st_data(., lstau+"."+vcvo.tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix +// if no lags exist, tmatrix has zero rows. + if (rows(tmatrix)>0) { +// col 1 of tmatrix has row numbers of all rows of data with this time period that have a corresponding lag +// col 2 of tmatrix has row numbers of all rows of data with lag tau that have a corresponding ob this time period. +// Should never happen that fweights or iweights make it here, +// but if they did the next line would be sqrt(wvari)*sqrt(wvari1) [with no wf since not needed for fw or iw] + wv = (*vcvo.wvar)[tmatrix[.,1]] /// + :* (*vcvo.wvar)[tmatrix[.,2]]*(vcvo.wf^2) // inner weighting matrix for quadcross + sigmahat = quadcross((*vcvo.e)[tmatrix[.,1],.], wv ,(*vcvo.e)[tmatrix[.,2],.]) /// + / (vcvo.N-vcvo.dofminus) // large dof correction + ZZhat = quadcross((*vcvo.Z)[tmatrix[.,1],.], wv, (*vcvo.Z)[tmatrix[.,2],.]) + ghat = sigmahat#ZZhat + shat=shat+kw*(ghat+ghat') + } + } // end non-zero kernel weight block + } // end tau loop + } // end kernel code +// Note large dof correction (if there is one) has already been incorporated + shat=shat/vcvo.N + } // end homoskedastic, AC code + +// Block for robust HC and HAC but not Stock-Watson and single clustering. +// Need to enter for double-clustering if one cluster is time. + if ( (vcvo.robust~="") & (vcvo.sw=="") & ((vcvo.clustvarname=="") /// + | ((vcvo.clustvarname2~="") & (vcvo.kernel~=""))) ) { + if (K==1) { // simple/fast where e is a column vector + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { + wv = (*vcvo.e:^2) :* *vcvo.wvar + } + else { + wv = (*vcvo.e :* *vcvo.wvar * vcvo.wf):^2 // wf needed for aweights and pweights + } + shat=quadcross(*vcvo.Z, wv, *vcvo.Z) // basic Eicker-Huber-White-sandwich-robust vce + } + else { // e is a matrix so must loop + shat=J(L*K,L*K,0) + for (i=1; i<=rows(*vcvo.e); i++) { + eZi=((*vcvo.e)[i,.])#((*vcvo.Z)[i,.]) + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { +// wvar is a column vector. wf not needed for fw and iw (=1 by dfn so redundant). + shat=shat+quadcross(eZi,eZi)*((*vcvo.wvar)[i]) + } + else { + shat=shat+quadcross(eZi,eZi)*((*vcvo.wvar)[i] * vcvo.wf)^2 // **** ADDED *vcvo.wf + } + } + } + if (vcvo.kernel~="") { +// Spectral windows require looping through all T-1 autocovariances + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + tnow=st_data(., vcvo.tindexname) + for (tau=1; tau<=TAU; tau++) { + kw = m_ranktest9_calckw(tau, vcvo.bw, vcvo.kernel) + if (kw~=0) { // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + lstau = "L"+strofreal(tau) + tlag=st_data(., lstau+"."+vcvo.tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix + +// col 1 of tmatrix has row numbers of all rows of data with this time period that have a corresponding lag +// col 2 of tmatrix has row numbers of all rows of data with lag tau that have a corresponding ob this time period. +// if no lags exist, tmatrix has zero rows + if (rows(tmatrix)>0) { + if (K==1) { // simple/fast where e is a column vector +// wv is inner weighting matrix for quadcross + wv = (*vcvo.e)[tmatrix[.,1]] :* (*vcvo.e)[tmatrix[.,2]] /// + :* (*vcvo.wvar)[tmatrix[.,1]] :* (*vcvo.wvar)[tmatrix[.,2]] * (vcvo.wf^2) + ghat = quadcross((*vcvo.Z)[tmatrix[.,1],.], wv, (*vcvo.Z)[tmatrix[.,2],.]) + } + else { // e is a matrix so must loop + ghat=J(L*K,L*K,0) + for (i=1; i<=rows(tmatrix); i++) { + wvari =(*vcvo.wvar)[tmatrix[i,1]] + wvari1=(*vcvo.wvar)[tmatrix[i,2]] + ei =(*vcvo.e)[tmatrix[i,1],.] + ei1 =(*vcvo.e)[tmatrix[i,2],.] + Zi =(*vcvo.Z)[tmatrix[i,1],.] + Zi1 =(*vcvo.Z)[tmatrix[i,2],.] + eZi =ei#Zi + eZi1=ei1#Zi1 +// Should never happen that fweights or iweights make it here, but if they did +// the next line would be ghat=ghat+eZi'*eZi1*sqrt(wvari)*sqrt(wvari1) +// [without *vcvo.wf since wf=1 for fw and iw] + ghat=ghat+quadcross(eZi,eZi1)*wvari*wvari1 * (vcvo.wf^2) // ADDED * (vcvo.wf^2) + } + } + shat=shat+kw*(ghat+ghat') + } // end non-zero-obs accumulation block + } // end non-zero kernel weight block + } // end tau loop + } // end kernel code +// Incorporate large dof correction if there is one + shat=shat/(vcvo.N-vcvo.dofminus) + } // end HC/HAC code + + if (vcvo.clustvarname~="") { +// Block for cluster-robust +// 2-level clustering: S = S(level 1) + S(level 2) - S(level 3 = intersection of levels 1 & 2) +// Prepare shat3 if 2-level clustering + if (vcvo.clustvarname2~="") { + if (vcvo.kernel~="") { // second cluster variable is time + // shat3 was already calculated above as shat + shat3=shat*(vcvo.N-vcvo.dofminus) + } + else { // calculate shat3 + // data were sorted on clustvar3-clustvar1 so + // clustvar3 is nested in clustvar1 and Mata panel functions + // work for both. + info3 = panelsetup(clustvar3, 1) + if (rows(info3)==rows(*vcvo.e)) { // intersection of levels 1 & 2 are all single obs + // so no need to loop through row by row + if (K==1) { // simple/fast where e is a column vector + wv = (*vcvo.e :* *vcvo.wvar * vcvo.wf):^2 + shat3=quadcross(*vcvo.Z, wv, *vcvo.Z) // basic Eicker-Huber-White-sandwich-robust vce + } + else { // e is a matrix so must loop + shat3=J(L*K,L*K,0) + for (i=1; i<=rows(*vcvo.e); i++) { + eZi=((*vcvo.e)[i,.])#((*vcvo.Z)[i,.]) + shat3=shat3+quadcross(eZi,eZi)*((*vcvo.wvar)[i] * vcvo.wf)^2 // **** ADDED *vcvo.wf + } + } + } + else { // intersection of levels 1 & 2 includes some groups of obs + N_clust3=rows(info3) + shat3=J(L*K,L*K,0) + for (i=1; i<=N_clust3; i++) { + esub=panelsubmatrix(*vcvo.e,i,info3) + Zsub=panelsubmatrix(*vcvo.Z,i,info3) + wsub=panelsubmatrix(*vcvo.wvar,i,info3) + wv = esub :* wsub * vcvo.wf + if (K==1) { // simple/fast where e is a column vector + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ = J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.] * vcvo.wf // **** ADDED *vcvo.wf + } + } + shat3=shat3+quadcross(eZ,eZ) + } + } + } + } + +// 1st level of clustering, no kernel-robust +// Entered unless 1-level clustering and kernel-robust + if (!((vcvo.kernel~="") & (vcvo.clustvarname2==""))) { + shat=J(L*K,L*K,0) + for (i=1; i<=N_clust; i++) { // loop through clusters, adding Z'ee'Z + // for indiv cluster in each loop + esub=panelsubmatrix(*vcvo.e,i,info) + Zsub=panelsubmatrix(*vcvo.Z,i,info) + wsub=panelsubmatrix(*vcvo.wvar,i,info) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat=shat+quadcross(eZ,eZ) + } // end loop through clusters + } + +// 2-level clustering, no kernel-robust + if ((vcvo.clustvarname2~="") & (vcvo.kernel=="")) { + imax=max(clustvar2) // clustvar2 is numbered 1..N_clust2 + shat2=J(L*K,L*K,0) + for (i=1; i<=imax; i++) { // loop through clusters, adding Z'ee'Z + // for indiv cluster in each loop + svar=(clustvar2:==i) // mimics panelsubmatrix but doesn't require sorted data + esub=select(*vcvo.e,svar) // it is, however, noticably slower. + Zsub=select(*vcvo.Z,svar) + wsub=select(*vcvo.wvar,svar) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat2=shat2+quadcross(eZ,eZ) + } + } + +// 1st level of cluster, kernel-robust OR +// 2-level clustering, kernel-robust and time is 2nd cluster variable + if (vcvo.kernel~="") { + shat2=J(L*K,L*K,0) +// First, standard cluster-robust, i.e., no lags. + i=min(t) + while (i<=max(t)) { // loop through all T clusters, adding Z'ee'Z + // for indiv cluster in each loop + eZ=J(1,L*K,0) + svar=(t:==i) // select obs with t=i + if (colsum(svar)>0) { // there are obs with t=i + esub=select(*vcvo.e,svar) + Zsub=select(*vcvo.Z,svar) + wsub=select(*vcvo.wvar,svar) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { +// MISSING LINE IS NEXT + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat2=shat2+quadcross(eZ,eZ) + } + i=i+vcvo.tdelta + } // end i loop through all T clusters + +// Spectral windows require looping through all T-1 autocovariances + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + + for (tau=1; tau<=TAU; tau++) { + kw = m_ranktest9_calckw(tau, vcvo.bw, vcvo.kernel) // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + if (kw~=0) { + i=min(t)+tau*vcvo.tdelta // Loop through all possible ts (time clusters) + while (i<=max(t)) { // Start at earliest possible t + svar=t[.,]:==i // svar is current, svar1 is tau-th lag + svar1=t[.,]:==(i-tau*vcvo.tdelta) // tau*vcvo.tdelta is usually just tau + if ((colsum(svar)>0) // there are current & lagged obs + & (colsum(svar1)>0)) { + wv = select((*vcvo.e),svar) :* select((*vcvo.wvar),svar) * vcvo.wf + wv1 = select((*vcvo.e),svar1) :* select((*vcvo.wvar),svar1) * vcvo.wf + Zsub =select((*vcvo.Z),svar) + Zsub1=select((*vcvo.Z),svar1) + if (K==1) { // simple/fast, e is column vector + eZsub = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + eZsub1= quadcross(1, wv1, Zsub1) // equivalent to colsum(wv :* Zsub) + } + else { + eZsub=J(1,L*K,0) + for (j=1; j<=rows(Zsub); j++) { + wvj =wv[j,.] + Zj =Zsub[j,.] + eZsub=eZsub+(wvj#Zj) + } + eZsub1=J(1,L*K,0) + for (j=1; j<=rows(Zsub1); j++) { + wv1j =wv1[j,.] + Z1j =Zsub1[j,.] + eZsub1=eZsub1+(wv1j#Z1j) + } + } + ghat=quadcross(eZsub,eZsub1) + shat2=shat2+kw*(ghat+ghat') + } + i=i+vcvo.tdelta + } + } // end non-zero kernel weight block + } // end tau loop + +// If 1-level clustering, shat2 just calculated above is actually the desired shat + if (vcvo.clustvarname2=="") { + shat=shat2 + } + } + +// 2-level clustering, completion +// Cameron-Gelbach-Miller/Thompson method: +// Add 2 cluster variance matrices and subtract 3rd + if (vcvo.clustvarname2~="") { + shat = shat+shat2-shat3 + } + +// Note no dof correction required for cluster-robust + shat=shat/vcvo.N + } // end cluster-robust code + + if (vcvo.sw~="") { +// Stock-Watson adjustment. Calculate Bhat in their equation (6). Also need T=panel length. +// They define for balanced panels. Since T is not constant for unbalanced panels, need +// to incorporate panel-varying 1/T, 1/(T-1) and 1/(T-2) as weights in summation. + + st_view(ivar, ., st_tsrevar(vcvo.ivarname), vcvo.touse) + info_ivar = panelsetup(ivar, 1) + + shat=J(L*K,L*K,0) + bhat=J(L*K,L*K,0) + N_panels=0 + for (i=1; i<=rows(info_ivar); i++) { + esub=panelsubmatrix(*vcvo.e,i,info_ivar) + Zsub=panelsubmatrix(*vcvo.Z,i,info_ivar) + wsub=panelsubmatrix(*vcvo.wvar,i,info_ivar) + Tsub=rows(esub) + if (Tsub>2) { // SW cov estimator defined only for T>2 + N_panels=N_panels+1 + sigmahatsub=J(K,K,0) + ZZsub=J(L*K,L*K,0) + shatsub=J(L*K,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZi=esub[j,1]#Zsub[j,.] + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { + shatsub=shatsub+quadcross(eZi,eZi)*wsub[j]*vcvo.wf + sigmahatsub=sigmahatsub + quadcross(esub[j,1],esub[j,1])*wsub[j]*vcvo.wf + ZZsub=ZZsub+quadcross(Zsub[j,.],Zsub[j,.])*wsub[j]*vcvo.wf + } + else { + shatsub=shatsub+quadcross(eZi,eZi)*((wsub[j]*vcvo.wf)^2) + sigmahatsub=sigmahatsub + quadcross(esub[j,1],esub[j,1])*((wsub[j]*vcvo.wf)^2) + ZZsub=ZZsub+quadcross(Zsub[j,.],Zsub[j,.])*((wsub[j]*vcvo.wf)^2) + } + } // end loop through j obs of panel i + shat=shat + shatsub*(Tsub-1)/(Tsub-2) + bhat=bhat + ZZsub/Tsub#sigmahatsub/(Tsub-1)/(Tsub-2) + } + } // end loop through i panels + +// Note that Stock-Watson incorporate an N-n-k degrees of freedom correction in their eqn 4 +// for what we call shat. We use only an N-n degrees of freedom correction, i.e., we ignore +// the k regressors. This is because this is an estimate of S, the VCV of orthogonality conditions, +// independently of its use to obtain an estimate of the variance of beta. Makes no diff aysmptotically. +// Ignore dofminus correction since this is explicitly handled here. +// Use number of valid panels in denominator (SW cov estimator defined only for panels with T>2). + shat=shat/(vcvo.N-N_panels) + bhat=bhat/N_panels + shat=shat-bhat + } // end Stock-Watson block + + _makesymmetric(shat) + +// shat may not be positive-definite. Use spectral decomposition to obtain an invertable version. +// Extract Eigenvector and Eigenvalues, replace EVs, and reassemble shat. +// psda option: Stock-Watson 2008 Econometrica, Remark 8, say replace neg EVs with abs(EVs). +// psd0 option: Politis (2007) says replace neg EVs with zeros. + if (vcvo.psd~="") { + symeigensystem(shat,Evec,Eval) + if (vcvo.psd=="psda") { + Eval = abs(Eval) + } + else { + Eval = Eval + (abs(Eval) - Eval)/2 + } + shat = Evec*diag(Eval)*Evec' + _makesymmetric(shat) + } + + return(shat) + +} // end of program m_ranktest9_omega + +// *********************************************************************** // +// *********************************************************************** // + +real scalar m_ranktest9_calckw( real scalar tau, + real scalar bw, + string scalar kernel) + { + karg = tau / bw + if (kernel=="Truncated") { + kw=1 + } + if (kernel=="Bartlett") { + kw=(1-karg) + } + if (kernel=="Parzen") { + if (karg <= 0.5) { + kw = 1-6*karg^2+6*karg^3 + } + else { + kw = 2*(1-karg)^3 + } + } + if (kernel=="Tukey-Hanning") { + kw=0.5+0.5*cos(pi()*karg) + } + if (kernel=="Tukey-Hamming") { + kw=0.54+0.46*cos(pi()*karg) + } + if (kernel=="Tent") { + kw=2*(1-cos(tau*karg)) / (karg^2) + } + if (kernel=="Danielle") { + kw=sin(pi()*karg) / (pi()*karg) + } + if (kernel=="Quadratic Spectral") { + kw=25/(12*pi()^2*karg^2) /* + */ * ( sin(6*pi()*karg/5)/(6*pi()*karg/5) /* + */ - cos(6*pi()*karg/5) ) + } + return(kw) + } // end kw + +// *********************************************************************** // +// *********************************************************************** // + + +end + +* Version notes +* 1.0.00 First distributed version +* 1.0.01 With iweights, rkstat truncates N to mimic official Stata treatment of noninteger iweights +* Added warning if shat/vhat/vlab not of full rank. +* 1.0.02 Added NULLrank option +* Added eq names to saved V and S matrices +* 1.0.03 Added error catching for collinearities between varlists +* Not saving S matrix; V matrix now as in paper (without 1/N factor) +* Statistic, p-value etc set to missing if vcv not of full rank (Assumpt 2 in paper fails) +* 1.0.04 Fixed touse bug - was treating missings as touse-able +* Change some cross-products in robust loops to quadcross +* 1.0.05 Fixed bug with col/row names and ts operators. Added eval to saved matrices. +* 1.1.00 First ssc-ideas version. Added version 9.2 prior to Mata compiled section. +* 1.1.01 Allow non-integer bandwidth +* 1.1.02 Changed calc of yhat, zhat and pihat to avoid needlessly large intermediate matrices +* and to use more accurate qrsolve instead of inverted X'X. +* 1.1.03 Fixed touse bug that didn't catch missing cluster variable +* Fixed cluster bug - data needed to be sorted by cluster for Mata panel functions to work properly +* 1.2.00 Changed reporting so that gaps between panels are not reported as such. +* Added support for tdelta in tsset data. +* Changed tvar and ivar setup so that data must be tsset or xtset. +* Removed unnecessary loops through panel data with spectral kernels +* shat vcv now also saved. +* Added support for Thompson/Cameron-Gelbach-Miller 2-level cluster-robust vcvv +* Added support for Stock-Watson vcv - but requires data to have FEs partialled out, & doesn't support fweights +* Removed mimicking of Stata mistake of truncated N with iweights to nearest integer +* Fixed small bug with quadratic kernel (wasn't using negative weights) +* Optimised code dealing with time-series data +* 1.2.01 Fixed bug that always used Stock-Watson spectral decomp to create invertible shat +* instead of only when (undocumented) spsd option is called. +* 1.2.02 Fixed bug that did not allow string cluster variables +* 1.2.03 Fixed bug in code for cluster+kernel robust (typo in imported code from ivreg2=>crash) +* 1.2.04 Replaced code for S with ivreg2 code modified to support e matrix (cols > 1) +* Code block (m_omega, m_calckw, struct definition) now shared by ranktest and ivreg2. +* Renamed spsd option to psd following ivreg2 3.0.07 +* Added wf ("weight factor") and statement about sum of weights, as in ivreg2 +* Added dofminus option, as in ivreg2 +* Fixed minor reporting bug - was reporting gaps in entire panel, not just touse-d portion +* Recoded kernel & bw checks to use shared ivreg2 subroutine vkernel +* 1.2.05 Fixed weighting bug introduced in 1.2.04. All weights were affected. +* Was result of incompatibility of code shared with ivreg2. +* 1.3.01 First ranktest version with accompanying Mata library (shared with -ivreg2-). +* Mata library includes struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Fixed bug in 2-way cluster code (now in m_omega in Mata library) - would crash if K>1. +* 1.3.02 Improved partialling out and matrix inversion - switched from qrsolve to invsym. +* Use _makesymmetric() instead of symmetrizing by hand. +* 1.3.03 01Jan14. Fixed reporting bug with 2-way clustering and kernel-robust that would give +* wrong count for 2nd cluster variable. +* 1.3.04 24Aug14. Fixed bug in markout - would include obs where some vars were missing +* 1.3.05 22Jan15. First version of ranktest9. Mata library now internal with names incorporating "_ranktest9_". +* 1.3.06 18Aug15. Added r(cmd) and r(version) macros. + +* Version notes for imported version of Mata library +* 1.1.01 First version of library. +* Contains struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Compiled in Stata 9.2 for compatibility with ranktest 1.3.01 (a 9.2 program). +* 1.1.02 Add routine cdsy. Standardized spelling/caps/etc. of QS as "Quadratic Spectral" +* 1.1.03 Corrected spelling of "Danielle" kernel in m_omega() +* 1.1.04 Fixed weighting bugs in robust and cluster code of m_omega where K>1 +* 1.1.05 Added whichlivreg2(.) to aid in version control +* 1.1.06 Fixed remaining weighting bug (see 1.1.04) in 2-way clustering when interection +* of clustering levels is groups +* 1.1.07 Fixed HAC bug that crashed m_omega(.) when there were no obs for a particular lag diff --git a/ado/s/seeout.ado b/ado/s/seeout.ado new file mode 100644 index 0000000..2f7b242 --- /dev/null +++ b/ado/s/seeout.ado @@ -0,0 +1,452 @@ +*! seeout version 1.2.3 21oct2009 by roywada@hotmail.com +*! (to accompany -outreg2-) + +program define seeout +version 7.0 + +syntax [using] [,LABel LABelA(passthru) ] + +if `"`using'"'~="" { + *** clean up file name, attach .txt if no file type is specified + local rest "`using'" + * strip off "using" + gettoken part rest: rest, parse(" ") + * strip off quotes + gettoken first second: rest, parse(" ") + cap local rest: list clean local(rest) + + local rabbit `"""' + if index(`"`using'"', ".")==0 { + local file = `"`rabbit'`first'.txt`rabbit'"' + local using = `"using `file'"' + } + else { + local file = `"`rabbit'`first'`rabbit'"' + local using = `"using `file'"' + } + + *** seeout the output + *local cl `"{stata `"seeout `pref'"': seeout `pref'}"' + *di as txt `"`cl'"' + seeing `using', `label' +} + +else { + *** read the set preference if not out of date + + * NOTE: `0' is written over below + cap quietly findfile outreg2.pref + tempname myfile + cap file open `myfile' using `"`r(fn)'"', read text + cap file read `myfile' date + cap file read `myfile' pref + cap file read `myfile' options + cap file close `myfile' + + if "`date'"== "`c(current_date)'" { + *** seeout the output + + if index(`"`options'"', "label")~=1 & index(`"`options'"', `"label("')==0 { + tokenize `"`options'"' + local count: word count `options' + if `count'~=0 { + local test 0 + forval num=1/`count' { + if `"``num''"'=="label" { + local label label + } + } + } + } + } /* ? */ + gettoken first file: pref + + *** codes recycled from outreg2: + * strip off quotes and extension + gettoken first second: file, parse(" ") + local temp = `"`first'"' + + local next_dot = index(`"`temp'"',".") + local next_strip = substr(`"`temp'"',1,`=`next_dot'-1') + local strippedname = substr(`"`temp'"',1,`=`next_dot'-1') + + * check for more dots + local change 0 + while `change'==0 { + local temp = substr(`"`temp'"',`=`next_dot'+1',.) + if index(`"`temp'"', ".")~=0 { + local next_dot = index(`"`temp'"',".") + local next_strip = substr(`"`temp'"',1,`=`next_dot'-1') + local strippedname = `"`strippedname'.`next_strip'"' + } + else { + * no change + local last_strip = `"`temp'"' + local change 1 + } + } + + *** check for manual rtf doc xlm xls csv extensions + if `"`last_strip'"'=="rtf" | `"`last_strip'"'=="doc" { + local word "word" + + local file = `"`rabbit'`strippedname'.txt`rabbit'"' + local using = `"using `file'"' + local wordFile "`last_strip'" + } + if `"`last_strip'"'=="xls" | `"`last_strip'"'=="xml" | `"`last_strip'"'=="xlm" | `"`last_strip'"'=="csv" { + local excel "excel" + + local file = `"`rabbit'`strippedname'.txt`rabbit'"' + local using = `"using `file'"' + local excelFile "`last_strip'" + } + if `"`last_strip'"'=="tex" { + if `"`tex1'"'=="" { + local tex "tex" + } + + local file = `"`rabbit'`strippedname'.txt`rabbit'"' + local using = `"using `file'"' + local texFile "`last_strip'" + } + + + if `"`last_strip'"'=="txt" { + seeing `pref', `label' + } + else { + if "`using'"=="" { + di in red "must specify using file" + exit 198 + } + seeing using `using', `label' + * similar to the other one except the clickable text + *local cl `"{stata `"seeout `pref'"': seeout `pref'}"' + *di as txt `"`cl'"' + } + else { + di in red "must specify the filename (the last preference has expired)" + exit 100 + } +} +end + + + +*********************** + + +program define seeing +version 7.0 + +* invisible to Stata 7 +local Version7 "" +cap local Version7 `c(stata_version)' + +if "`Version7'"=="" { + * it is version 7 + *noi di in yel "limited functions under Stata 7" +} +else if `Version7'>=8.2 { + version 8.2 +} + +quietly{ + * syntax using/[, Clear] + syntax using [, LABel LABelA(string) ] + + preserve + + insheet `using', nonames clear + describe, short + + + * number of columns + local numcol = `r(k)' + + tempvar blanks rowmiss + count if v1=="EQUATION" + if `r(N)'~=0 { + local eqPlace 1 + local varPlace 2 + count if v3=="LABELS" + if `r(N)'~=0 { + local labPlace 3 + local num=4 + } + else { + local labPlace 0 + local num=3 + } + } + else { + local eqPlace 0 + local varPlace 1 + + count if v2=="LABELS" + if `r(N)'~=0 { + local labPlace 2 + local num=3 + } + else { + local labPlace 0 + local num=2 + } + } + + gen int `blanks' = (trim(v`num')=="") + forvalues col = `num'/`numcol' { + replace `blanks' = `blanks' & (trim(v`col')=="") + } + + + * title rows + local titleWide = 0 + if v1[1]~="" | v2[1]~="" { + * there may be a title + if `labPlace'==0 & `varPlace'==1 { + while v1[`=`titleWide'+1']~="" & v2[`=`titleWide'+1']=="" { + local titleWide = `titleWide'+1 + } + } + if `labPlace'==0 & `varPlace'==2 { + while v2[`=`titleWide'+1']~="" & v3[`=`titleWide'+1']=="" { + local titleWide = `titleWide'+1 + } + } + if `labPlace'~=0 & `varPlace'==1 { + while v1[`=`titleWide'+1']~="" & v3[`=`titleWide'+1']=="" { + local titleWide = `titleWide'+1 + } + } + if `labPlace'~=0 & `varPlace'==2 { + while v2[`=`titleWide'+1']~="" & v4[`=`titleWide'+1']=="" { + local titleWide = `titleWide'+1 + } + } + } + + *local VARIABLES "VARIABLES" + * first name AFTER titles is the VARIABLES + local content + local num=`titleWide'+1 + local N=_N + while `"`content'"'=="" & `num'<=`N' { + local content=v`varPlace'[`num'] + local num=`num'+1 + } + local VARIABLES `"`content'"' + + replace `blanks'=0 if v1==`"`VARIABLES'"' | v1[_n-1]==`"`VARIABLES'"' | v2==`"`VARIABLES'"' | v2[_n-1]==`"`VARIABLES'"' + + + * getting bottomBorder (the bottom border), count up + gen rowmiss=0 + foreach var of varlist v* { + replace rowmiss=rowmiss+1 if `var'~="" + } + local N=_N + local content 1 + local num 0 + while `content'==1 & `num'<`N' { + local content rowmiss[`=`N'-`num''] + local num=`num'+1 + } + * do not have to add to titleWide + local bottomRow = `N'-`num'+1 + local bottomBorder=`bottomRow' + + * getting halfway to headBorder (the top border), count down + local content + local num=`titleWide'+1 + local N=_N + while `"`content'"'=="" & `num'<=`N' { + local content=v`varPlace'[`num'] + local num=`num'+1 + } + * do not have to add to titleWide + local headRow `num' + local headBorder=`headRow' + + drop rowmiss + + + * avoid counting space within each statistics row as missing + replace `blanks'=0 if `blanks'[_n+1]==0 & `blanks'==1 & _n >`titleWide' + + + * statistics rows + *count if `blanks'==0 + *local bottomBorder = `r(N)'+`titleWide' + + + * move the notes and titles to the top of a new column + gen str5 Notes_Titles="" + format Notes_Titles %-20s + count if v1=="EQUATION" + if `r(N)'==0 { + * EQUATION column does not exist + if `titleWide'>0 { + forval num=1/`titleWide' { + replace Notes_Titles=v1[`num'] in `num' + replace v1="" in `num' + } + } + + local one = 1 + local legend = v1[`bottomBorder'+`one'] + + + local place 1 + *while "`legend'"~="" { + local N=_N + while `place' <= `N' { + local place=`bottomBorder'+`one' + local legend = v1[`place'] + replace Notes_Titles="`legend'" in `=`one'+`titleWide'+1' + if "`legend'"~="" { + replace v1="" in `place' + } + local one = `one'+1 + } + + * insert label changes here, minus 2 from c(k) for `blanks' & Notes_Titles column + if "`label'"=="label" { + *if ("`long'"~="long" & "`onecol'"~="onecol") | ("`long'"=="long" & "`onecol'"=="onecol") { + replace v2=v1 if v2=="" + drop v1 + describe, short + forval num=1/`=`r(k)'-2' { + ren v`=`num'+1' v`num' + } + + * change LABELS to VARIABLES + replace v1=`"`VARIABLES'"' if v1=="LABELS" + *} + local label_adjust "-1" + } + + * change the string length + gen str5 temp="" + replace temp=v1 + drop v1 + ren temp v1 + order v1 + * format + foreach var of varlist v1 { + local _format= "`: format `var''" + local _widths=substr("`_format'",2,length(trim("`_format'"))-2) + format `var' %-`_widths's + } + } + else { + * equation column exists + if `titleWide'>0 { + forval num=1/`titleWide' { + replace Notes_Titles=v2[`num'] in `num' + replace v2="" in `num' + } + } + + local one = 1 + local legend = v2[`bottomBorder'+`one'] + while "`legend'"~="" { + local place=`bottomBorder'+`one' + local legend = v2[`place'] + replace Notes_Titles="`legend'" in `=`one'+`titleWide'+1' + if "`legend'"~="" { + replace v2="" in `place' + } + local one = `one'+1 + } + + * insert label changes here, minus 2 from c(k) for `blanks' & Notes_Titles column + if "`label'"=="label" { + *else if "`long'"~="long" & "`onecol'"=="onecol" { + replace v3=v2 if v3=="" + drop v2 + describe, short + forval num=2/`=`r(k)'-2' { + ren v`=`num'+1' v`num' + } + + * change LABELS to VARIABLES + replace v2=`"`VARIABLES'"' if v2=="LABELS" + *} + local label_adjust "-1" + } + + + * change the string length + gen str5 temp="" + replace temp=v2 + drop v2 + ren temp v2 + order v1 v2 + * format + foreach var of varlist v1 v2 { + local _format= "`: format `var''" + local _widths=substr("`_format'",2,length(trim("`_format'"))-2) + format `var' %-`_widths's + } + } + + * clean up + *egen `rowmiss'=rowmiss(_all) + * rowmiss option not available in 8.2 or 8.0, do it by hand + + gen `rowmiss'=0 + foreach var of varlist _all { + if "`var'"~="`rowmiss'" & "`var'"~="`blanks'" { + replace `rowmiss'=1+`rowmiss' if `var'=="" + } + } + + *drop if `rowmiss'==`numcol'+1 + + * adjust to handle label column droppings + *drop if `rowmiss'==`numcol'+1 & `blanks'==1 + + * fix blanks==1 for groupvar( ) + count if `blanks'==1 + local rN=`r(N)'+1 + forval num=1/`rN' { + replace `blanks'=0 if `blanks'[_n+1]==0 & `blanks'==1 + } + + drop if `rowmiss'==`numcol'+1 `label_adjust' & `blanks'==1 + drop `blanks' `rowmiss' + + browse + + if "`Version7'"=="" { + * it is version 7 + } + else if `Version7'>=11.0 { + noi di in yel "Hit Enter to continue" _request(junk) + } + + *restore, preserve +} +end /* end of seeing */ + +exit + + + +* versions +1.1 replaced rowmiss option in egen, which is not available in 8.2 +1.1.1 disabled -restore, preserve- as redundant waste of time + fixed seeing/seeout: handles blank space in stat(aster) + label does not show + no longer produces a seeout blue text whenever a seeout blue text was clicked +1.1.2 the shorthand form of seeout hides label +1.1.3 the shorthand form of seeout hides label: `label' is actually read from outreg2_pref.ado +1.2.0 down to version 7.0; -describe, short- instead of c(k) + if `"`using'"'~="": needed the compound quotes + VARIABLES is flexibly named +1.2.1 Apr2009 handles xls, doc, etc, that was left attached to file names in pref_ado +1.2.2 04Aug2009 a fix for asynchronoous data browser in -seeing- for version 11 +1.2.3 21oct2009 outreg2_pref should have been replaced with outreg2.pref earlier + diff --git a/ado/s/seeout.hlp b/ado/s/seeout.hlp new file mode 100644 index 0000000..70b3eb9 --- /dev/null +++ b/ado/s/seeout.hlp @@ -0,0 +1,59 @@ +{smcl} +{* Oct 2005}{...} +{cmd:help seeout} +{hline} + +{title:Title} + +{p2colset 5 16 22 2}{...} +{p2col :{hi: seeout} {hline 2}}Opens tab-delimited {helpb outreg2} table in the data browser {p_end} +{p2colreset}{...} + + +{title:Syntax} + +{p 4 8 2} +{cmdab:seeout} [,using {it:filename}] {p_end} + +{pstd} +where a {it:filename} is a document to be opened. A minimum of two tabl-delimited columns +are required for a document to be opened. {p_end} + + +{title:Description} + +{pstd}{cmd:seeout} will open a tab-delimited file created by {helpb outreg2} in the Stata data +browser. It is designed to provide a fast access to the regression table without first having to +convert the document into another format. {cmd:seeout} thus increasing the utility of such tables +in iterative research. + +{pstd}If {cmd:seeout} is invoked immediately following an {helpb outreg2} command, then it is not +necessary to specify the using {it:filename}. It will be automatically opened. + +{pstd}If no extension is provided, then .txt is assumed. + + +{title:Examples} + +{phang}{cmd:seeout using mytable} {p_end} +{phang}{cmd:seeout using "c:\myfolder\mypaper.txt"} {p_end} + +{phang}{cmd:outreg2 using mytable} {p_end} +{phang}{cmd:seeout} {p_end} + + +{title:Author} + + Roy Wada + roywada@hotmail.com + + + + + + + + + + + diff --git a/ado/s/shellout.ado b/ado/s/shellout.ado new file mode 100644 index 0000000..425e077 --- /dev/null +++ b/ado/s/shellout.ado @@ -0,0 +1,79 @@ +*! shellout 1.4 04Aug2008 +*! by roywada@hotmail.com +*! originally written to accompany -outreg2- +* +* version history +* 1.0 Oct2005 beta +* 1.1 Nov2007 opens an application without document name +* opens a document with or without "using" +* 1.2 Jan2008 cd option +* 1.3 Aug2008 version 7.0 +* 1.4 04Aug2008 version 7.0 fiddling (was 1.3 Aug2008); fiddling with non-.txt suffix being recognized + +program define shellout +version 7.0 + +syntax [anything] [using/] [,cd] + +* does the shelling +if "`c(os)'"=="Windows" | "$S_MACH"=="PC" { + if "`using'"~="" { + winexec cmd /c start "" "`using'" + } + else { + if "`cd'"~="cd" { + cap winexec `anything' + if _rc==193 { + winexec cmd /c start "" "`anything'" + } + if _rc==601 { + noi di in yel "Cannot find `anything'. Make sure typed the name correctly." + } + } + else { + winexec cmd /c cd `c(pwd)'\ & `anything' + } + } +} +else { + * invisible to Stata 7 + local Version7 "" + cap local Version7 `c(stata_version)' + + if "`Version7'"=="" { + * stata 7 + } + else { + * non-PC systems + di "{opt shellout} probably will not work with `c(os)'" + shell `using' + } +} +end + + +/* Old codes +* shellout +* version 1.0 +* October 2005 +* by roywada@hotmail.com +* +* (to accompany -outreg2-) +* + + +program define shelling +version 8.2 +syntax using/ +* does the shelling +*if c(machine_type)=="PC" { +if "`c(os)'"=="Windows" { + winexec cmd /c start "" "`using'" +} +else { + di "{opt shellout} probably will not work with `c(os)'" + shell `using' +} +end + + diff --git a/ado/s/shellout.hlp b/ado/s/shellout.hlp new file mode 100644 index 0000000..3ec3311 --- /dev/null +++ b/ado/s/shellout.hlp @@ -0,0 +1,98 @@ +{smcl} +{* Nov2005}{...} +{cmd:help shellout} +{hline} + +{title:Title} + +{p2colset 5 17 22 2}{...} +{p2col :{hi: shellout} {hline 2}}Opens documents and their programs from inside Stata. {p_end} +{p2colreset}{...} + + +{title:Multiple Syntax} + +{p 4 8 2} +{cmdab:shellout} {it:application} [, cd] {p_end} +{pstd} +where {it:application} is the name of a software application to be opened. {p_end} + +{p 4 8 2} +{cmdab:shellout} [using] {it:filename} [, cd] {p_end} +{pstd} +where {it:filename} takes the form of a document with a known extension, such as .doc, +.do, .dta, .txt, .xls, .xml, etc. {p_end} + + +{title:Options} +{pstd}{opt cd} should not be used, except to tell Stata that the program +in question is located in the current directory. {p_end} + + +{title:Description} + +{pstd}{cmd:shellout} opens a document from inside Stata without having to specify the exact +file path of the program. It also opens an application with or without specifying a file +document to be opened. + +{pstd}{cmd:shellout} is a {help shell} wrapper designed for Windows XP/NT. Unlike {help shell}, implements a nested DOS command. The DOS Window is told to close itself. + +{pstd}{cmd:shellout} was originally written to accompany {helpb outreg2} for automatic opening +of non-Stata documents. + + +{title:Examples} + +{phang}{cmd:shellout} wsestata.exe {p_end} +{phang}{cmd:shellout} using myfile.xml {p_end} +{phang}{cmd:shellout} using "c:\myfolder\myfile.doc" {p_end} +{phang}{cmd:shellout} myfile.xml {p_end} +{phang}{cmd:shellout} me.do {p_end} + +{pstd}The first line will open another Stata executable. {p_end} +{pstd}The second line will open a document named myfile.xml in Excel. {p_end} +{pstd}The third line will open a document named myfile.doc in Word. {p_end} +{pstd}The fourth line will do the same thing without invoking the "using" syntax. {p_end} +{pstd}The fifth line is the equivalent of -do me- in another Stata executable, or was it -run me-.... {p_end} + + +{title:Parameters} + +{pstd}A parameter is any value passed into a batch script. {cmd:shellout} will work with +parameters in the following examples (assuming you have Stata SE) {p_end} + +{phang}{cmd:shellout} shellout wsestata.exe shellout wsestata.exe shellout wsestata.exe {p_end} +{phang}{cmd:shellout} wsestata di "Bite Me" {p_end} +{phang}{cmd:shellout} notepad "Bite Me" {p_end} + +{pstd}The first line will open three Stata executables in a daisy-chain. {p_end} +{pstd}The second line will open a Stata executable with a "Bite Me" message. {p_end} +{pstd}The third line will open a (new) notepad file called "Bite Me". {p_end} + + +{title:Advanced Parameters} + +{pstd}You can save a batch of parameters in a file and invoke it under {cmd:shellout} +much like calling upon a do-file. Learn some DOS commands if you want to implement it. {p_end} + + +{title:Author} + + Roy Wada + roywada@hotmail.com + + +{title:Also see} + +{p 9}{bf:[D] Shell} {p_end} + + + + + + + + + + + diff --git a/ado/stata.trk b/ado/stata.trk new file mode 100644 index 0000000..a6c9e78 --- /dev/null +++ b/ado/stata.trk @@ -0,0 +1,409 @@ +* 00000010 +*! version 1.0.0 +* Do not erase or edit this file +* It is used by Stata to track the ado and help +* files you have installed. + +S http://www.stata.com/users/vwiggins +N grc1leg.pkg +D 25 Sep 2024 +U 1 +d grc1leg. Combine graphs into one graph with a common legend. +d Program by Vince Wiggins, StataCorp . +d Statalist distribution, 16 June 2003. +d +d Exactly like -graph combine- but shows a single common legend for all +d combined graphs. +d +d Distribution-Date: 02jun2010 +f g/grc1leg.ado +f g/grc1leg.hlp +e +S http://fmwww.bc.edu/repec/bocode/c +N cibar.pkg +D 25 Sep 2024 +U 2 +d 'CIBAR': module to plot bar graphs and confidence intervals over groups +d +d cibar plots bars and confidence intervals of the mean of a +d variable over at least one group. cibar aims at drawing graphs +d that resemble graphs created by graph bar varname, over(varname) +d asyvar, adding confidence intervals to the bars. In order to do +d so, cibar uses Stata's twoway bar and twoway rcap. cibar shows +d graphically the differences in the mean of a variable depending +d on the categories of other variables. +d +d KW: bar graph +d KW: graphics +d KW: confidence intervals +d KW: means +d +d Requires: Stata version 13 +d +d Distribution-Date: 20190624 +d +d Author: Alexander Staudt, N/A +d Support: email staudtlex@@live.de +d +f c/cibar.ado +f c/cibar.sthlp +e +S http://fmwww.bc.edu/repec/bocode/c +N coefplot.pkg +D 25 Sep 2024 +U 3 +d 'COEFPLOT': module to plot regression coefficients and other results +d +d coefplot plots results from estimation commands or Stata +d matrices. Results from multiple models or matrices can be +d combined in a single graph. The default behavior of coefplot is +d to draw markers for coefficients and horizontal spikes for +d confidence intervals. However, coefplot can also produce various +d other types of graphs. +d +d KW: graphics +d KW: coefficients +d KW: estimation +d +d Requires: Stata version 11 +d +d Distribution-Date: 20230225 +d +d Author: Ben Jann, University of Bern +d Support: email jann@@soz.unibe.ch +d +f c/coefplot.ado +f c/coefplot.sthlp +e +S http://fmwww.bc.edu/repec/bocode/c +N cmogram.pkg +D 25 Sep 2024 +U 4 +d 'CMOGRAM': module to plot histogram-style conditional mean or median graphs +d +d cmogram graphs the means, medians, frequencies, or proportions +d of one variable, conditional on another. Output can be further +d conditioned on a series of control variables, in which case it is +d the means or medians of the residual values that are plotted. For +d regression discontinuity and similar applications, graphs can be +d split at a particular cut point, and a by() option allows for +d sub-groups to be plotted separately. While the default output is +d similar to a histogram, there is the option of scatterplot-style +d output. +d +d KW: graphics +d KW: descriptive statistics +d KW: mean +d KW: median +d KW: frequencies +d KW: proportions +d +d Requires: Stata version 9.2 +d +d Distribution-Date: 20110911 +d +d Author: Christopher Robert, John F. Kennedy School of Government, Harvard University +d Support: email chris_robert@@hksphd.harvard.edu +d +f c/cmogram.ado +f c/cmogram.hlp +e +S http://fmwww.bc.edu/repec/bocode/e +N estout.pkg +D 25 Sep 2024 +U 5 +d 'ESTOUT': module to make regression tables +d +d estout produces a table of regression results from one or +d several models for use with spreadsheets, LaTeX, HTML, or a +d word-processor table. eststo stores a quick copy of the active +d estimation results for later tabulation. esttab is a wrapper for +d estout. It displays a pretty looking publication-style regression +d table without much typing. estadd adds additional results to the +d e()-returns for one or several models previously fitted and +d stored. This package subsumes the previously circulated esto, +d esta, estadd, and estadd_plus. An earlier version of estout is +d available as estout1. +d +d KW: estimates +d KW: LaTeX +d KW: HTML +d KW: word processor +d KW: output +d +d Requires: Stata version 8.2 +d +d Distribution-Date: 20230212 +d +d Author: Ben Jann, University of Bern +d Support: email jann@@soz.unibe.ch +d +f _/_eststo.ado +f _/_eststo.hlp +f e/estadd.ado +f e/estadd.hlp +f e/estout.ado +f e/estout.hlp +f e/eststo.ado +f e/eststo.hlp +f e/estpost.ado +f e/estpost.hlp +f e/esttab.ado +f e/esttab.hlp +e +S http://fmwww.bc.edu/repec/bocode/o +N outreg2.pkg +D 25 Sep 2024 +U 6 +d 'OUTREG2': module to arrange regression outputs into an illustrative table +d +d outreg2 provides a fast and easy way to produce an illustrative +d table of regression outputs. The regression outputs are produced +d piecemeal and are difficult to compare without some type of +d rearrangement. outreg2 automates this process by concatenating +d the successive regression outputs in a vertical format. The +d resulting table is saved to the disk in ASCII format, which can +d be read by other programs. outreg2 thus facilitates the +d convertion of regression outputs to a standard format suitable +d for inclusion in a scholarly publication. The functionality of +d outreg2 is based on the earlier package outreg, by John Luke +d Gallup. Unlike outreg, outreg2 is capable of writing LaTeX-format +d tables, as well as ASCII, MS Word and MS Excel. +d +d KW: regression +d KW: output +d KW: tables +d KW: tab-delimited output +d KW: LaTeX +d KW: Word +d KW: Excel +d +d Requires: Stata version 7 +d +d Distribution-Date: 20140817 +d +d Author: Roy Wada +d Support: email roywada@@hotmail.com +d +f o/outreg2.ado +f o/outreg2_prf.ado +f o/outreg2.hlp +f s/shellout.ado +f s/shellout.hlp +f s/seeout.ado +f s/seeout.hlp +e +S http://fmwww.bc.edu/repec/bocode/x +N xtivreg2.pkg +D 25 Sep 2024 +U 7 +d 'XTIVREG2': module to perform extended IV/2SLS, GMM and AC/HAC, LIML and k-class regression for panel data models +d +d xtivreg2 implements IV/GMM estimation of the fixed-effects and +d first-differences panel data models with possibly endogenous +d regressors. It is essentially a wrapper for ivreg2, which must +d be installed for xtivreg2 to run: ssc install ivreg2, replace). +d xtivreg2 supports all the estimation and reporting options of +d ivreg2; see help ivreg2 for full descriptions and examples. In +d particular, all the statistics available with ivreg2 +d (heteroskedastic, cluster- and autocorrelation-robust covariance +d matrix and standard errors, overidentification and orthogonality +d tests, first-stage and weak/underidentification statistics, etc.) +d are also supported by xtivreg2 and will be reported with any +d degrees-of-freedom adjustments required for a panel data +d estimation. +d +d KW: instrumental variables +d KW: panel data +d KW: fixed effects +d KW: first differences +d KW: Sargan test +d KW: robust estimation +d KW: orthogonality +d KW: GMM +d KW: Hansen's J +d KW: heteroskedastic OLS, +d +d Requires: Stata version 8.2 and ivreg2, ranktest from SSC +d +d Distribution-Date: 20200626 +d +d Author: Mark E Schaffer, Heriot-Watt University +d Support: email m.e.schaffer@@hw.ac.uk +d +f x/xtivreg2.ado +f x/xtivreg2.hlp +f x/xtivreg2_p.ado +e +S http://fmwww.bc.edu/repec/bocode/i +N ivreg2.pkg +D 25 Sep 2024 +U 8 +d 'IVREG2': module for extended instrumental variables/2SLS and GMM estimation +d +d ivreg2 provides extensions to Stata's official ivregress and +d newey. Its main capabilities: two-step feasible GMM estimation; +d continuously updated GMM estimation (CUE); LIML and k-class +d estimation; automatic output of the Hansen-Sargan or +d Anderson-Rubin statistic for overidentifying restrictions; C +d statistic test of exogeneity of subsets of instruments (orthog() +d option); kernel-based autocorrelation-consistent (AC) and +d heteroskedastic and autocorrelation-consistent (HAC) estimation, +d with user-specified choice of kernel; Cragg's "heteroskedastic +d OLS" (HOLS) estimator; default reporting of large-sample +d statistics (z and chi-squared rather than t and F); small option +d to report small-sample statistics; first-stage regression +d reported with F-test of excluded instruments and R-squared with +d included instruments "partialled-out"; enhanced Kleibergen-Paap +d and Cragg-Donald tests for weak instruments, redundancy of +d instruments, significance of endogenous regressors; two-way +d clustering of standard errors; Kiefer and Driscoll-Kraay +d standard errors. ivreg2 can also be used for ordinary least +d squares (OLS) estimation using the same command syntax as Stata's +d official regress and newey. New in this version: ivreg2 now +d supports factor variables. This is version 4.1.11 of ivreg2, +d updated from that published in Stata Journal, 5(4), requiring +d Stata 11.2 or better. Stata 8.2/9.2/10.2 users may use this +d routine, which will automatically call ivreg28, ivreg29, or +d ivreg210, respectively. These versions are now included in the +d ivreg2 package. Stata 7 users may use the Stata Journal version +d of ivreg2, accessible via net search ivreg2. +d +d KW: instrumental variables +d KW: Sargan test +d KW: robust estimation +d KW: orthogonality +d KW: GMM +d KW: Hansen's J +d KW: heteroskedastic OLS, +d +d Requires: Stata version 11.2 and ranktest from SSC +d +d Distribution-Date: 20240814 +d +d Author: Christopher F Baum, Boston College +d Support: email baum@@bc.edu +d +d Author: Mark E Schaffer, Heriot-Watt University +d Support: email m.e.schaffer@@hw.ac.uk +d +d Author: Steven Stillman, Free University of Bozen-Bolzano +d Support: email Steven.Stillman@@unibz.it +d +f i/ivreg2.ado +f i/ivreg2.sthlp +f i/ivreg2_p.ado +f l/livreg2.mlib +f i/ivreg210.ado +f i/ivreg210.sthlp +f i/ivreg210_p.ado +f i/ivreg29.ado +f i/ivreg29.hlp +f i/ivreg29_p.ado +f i/ivreg29_cue.ado +f i/ivreg28.ado +f i/ivreg28.hlp +f i/ivreg28_p.ado +f i/ivreg28_cue.ado +e +S http://fmwww.bc.edu/repec/bocode/r +N ranktest.pkg +D 25 Sep 2024 +U 9 +d 'RANKTEST': module to test the rank of a matrix +d +d ranktest implements various tests for the rank of a matrix. +d Tests of the rank of a matrix have many practical applications. +d For example, in econometrics the requirement for identification +d is the rank condition, which states that a particular matrix must +d be of full column rank. Another example from econometrics +d concerns cointegration in vector autoregressive (VAR) models; the +d Johansen trace test is a test of a rank of a particular matrix. +d The traditional test of the rank of a matrix for the standard +d (stationary) case is the Anderson (1951) canonical correlations +d test. If we denote one list of variables as Y and a second as Z, +d and we calculate the squared canonical correlations between Y and +d Z, the LM form of the Anderson test, where the null hypothesis is +d that the matrix of correlations or regression parameters B +d between Y and Z has rank(B)=r, is N times the sum of the r+1 +d largest squared canonical correlations. A large test statistic +d and rejection of the null indicates that the matrix has rank at +d least r+1. The Cragg-Donald (1993) statistic is a closely related +d Wald test for the rank of a matrix. The standard versions of +d these tests require the assumption that the covariance matrix has +d a Kronecker form; when this is not so, e.g., when disturbances +d are heteroskedastic or autocorrelated, the test statistics are no +d longer valid. ranktest implements various generalizations of +d these tests - Kleibergen-Paap, Cragg-Donald, and J-type 2-step +d GMM and CUE GMM tests - to the case of a non-Kronecker covariance +d matrix. The implementation in ranktest will calculate test +d statistics that are robust to various forms of +d heteroskedasticity, autocorrelation, and clustering. +d +d KW: matrix +d KW: rank +d KW: collinearity +d KW: cointegration +d +d Requires: Stata version 12 (version 9.2 for ranktest9, version 11 for ranktest11) +d +d Distribution-Date: 20200929 +d +d Author: Frank Kleibergen, Brown University +d Support: email Frank_Kleibergen@@brown.edu +d +d Author: Mark E Schaffer, Heriot-Watt University +d Support: email m.e.schaffer@@hw.ac.uk +d +d Author: Frank Windmeijer, University of Oxford +d Support: email frank.windmeijer@@stats.ox.ac.uk +d +f r/ranktest.ado +f r/ranktest9.ado +f r/ranktest11.ado +f r/ranktest.sthlp +f r/ranktest11.sthlp +f l/livreg2.mlib +e +S http://fmwww.bc.edu/repec/bocode/l +N leebounds.pkg +D 25 Sep 2024 +U 10 +d 'LEEBOUNDS': module for estimating Lee (2009) treatment effect bounds +d +d leebounds computes treatment effect bounds for samples with +d non-random sample selection/attrition as proposed by Lee (Review +d of Economic Studies, 2009). The lower and upper bound, +d respectively, correspond to extreme assumptions about the missing +d information that are consistent with the observed data. As +d opposed to parametric approaches to correcting for sample +d selection bias, such as the classical Heckman (1979) estimator, +d Lee (2009) bounds rest on very few assumptions, i.e. random +d assignment of treatment and monotonicity. Monotonicity means that +d the treatment status affects selection in just one direction. +d That is, receiving a treatment makes selection either more or +d less likely for any observation. In technical terms, the approach +d rests on a trimming procedure. Either from below or from +d above, the group (treatment, control) that suffers less from +d sample attrition is trimmed at the quantile of the outcome +d variable that corresponds to the share of 'excess observations' +d in this group. Calculating group differentials in mean outcome +d yields the lower and the upper bound, respectively, for the +d treatment effect depending on whether trimming is from below or +d above. leebounds assumes that it is unknown, a priori, which +d group (treatment, control) is subject to the higher selection +d probability and estimates this from data (see Lee, 2009:1090). d +d KW: sample selection bias +d KW: attrition bias +d KW: random assignment +d +d Requires: Stata version 11 +d +d Distribution-Date: 20130725 +d +d Author: Harald Tauchmann , University of Erlangen-Nuremberg, Germany +d Support: email harald.tauchmann@@fau.de +d +f l/leebounds.ado +f l/leebounds.sthlp +e diff --git a/ado/x/xtivreg2.ado b/ado/x/xtivreg2.ado new file mode 100644 index 0000000..3bcefa0 --- /dev/null +++ b/ado/x/xtivreg2.ado @@ -0,0 +1,765 @@ +*! xtivreg2 1.0.17 19Feb2015 +*! author mes +* 01.0.02 - Wasn't rewriting collinear/dups macro lists for time-series operators +* Fixed version bug. Added cmd to saved locals. +* 01.0.03 - Update to match ivreg2 2.1.15 including endog option +* 01.0.04 - Fixed bug in reporting obs numbers with weights; now ob numbers weighted for fw and iw only +* 01.0.05 - Added support for ivreg28 +* 01.0.06 - Fixed replay bug +* 01.0.07 - Added cmdline macro +* 01.0.08 - Tweaked checks for v8 vs >8, ivreg2 vs ivreg28 +* 01.0.09 - Fixed annoying bug in FD that reversed order of variables +* 01.0.10 - Fixed bug that didn't allow partial() with FE and time series operators. +* NB: FD and partial with TS operators not feasible; would require substantial rewrite of FD +* block or rewrite of ivreg2 code +* allowed 2-level clustering as supported by ivreg2 +* 01.0.11 - Fixed bug in reporting of e(df_m) with cluster - counted FEs but shouldn't have (vcv, F etc. were OK) +* 01.0.12 - Added check for demeaning of time variable. +* 01.0.13 - Fixed bug that didn't allow saved/displayed first-stage results for endog vars with TS operator +* Also made similar changes relating to RF results and to use of TS-prefixed var as dep var in main eq. +* 01.0.14 - Changed call to ivreg2 from qui to noi with nooutput option so that ivreg2 reports collinearities, errors, etc. +* Added qui to gen of weight var to suppress msg about missings created. +* Added nooutput option. Added check for ivreg210. Consolidated code for checking which ivreg2 installed. +* 01.0.15 - Added version control to call to ivreg2 so that call is under original calling version +* rather than version set locally by xtivreg2. +* 01.0.16 - Fixed bug in first-stage display connected to version control. +* 01.0.17 - Fixed bug (partial vs fwl) that would not allow running under Stata 8 or with ivreg28 +* Ensured correct support for 2-step GMM ("gmm" in ivreg28, "gmm2s" in ivreg29 onwards) + +program define xtivreg2, eclass byable(recall) + version 8.2 + local lversion 01.0.17 + +* Needed for call to ivreg2 + local ver = _caller() + local ver : di %6.1f `ver' + +* ivreg28 called option "fwl"; ivreg29 and onwards calls it "partial" + if `ver' < 9 { + local partialopt "fwl" + } + else { + local partialopt "partial" + } + +* Before replay() or estimation blocks, set ivreg2 command + tempname regest + capture _estimates hold `regest', restore +* Look for latest installed version of ivreg2 +* Start with ivreg2 + local ivreg2_cmd "ivreg2" + capture `ivreg2_cmd', version + if _rc != 0 { +* No ivreg2, check for ivreg210 + local ivreg2_cmd "ivreg210" + capture `ivreg2_cmd', version + if _rc != 0 { +* No ivreg210, check for ivreg29 + local ivreg2_cmd "ivreg29" + capture `ivreg2_cmd', version + if _rc != 0 { +* No ivreg29, check for ivreg28 + local ivreg2_cmd "ivreg28" + capture `ivreg2_cmd', version + } + } + } +* Done checking for an ivreg2, confirm found or not + if _rc != 0 { +* 4 strikes and you're out. +di as err "Error - must have ivreg2/ivreg28/ivreg29/ivreg210 version 2.1.15 or greater installed" + exit 601 + } + local vernum "`e(version)'" + capture _estimates unhold `regest' + if ("`vernum'" < "02.1.15") | ("`vernum'" > "09.9.99") { +di as err "Error - must have ivreg2/ivreg28/ivreg29/ivreg210 version 2.1.15 or greater installed" + exit 601 + } +* Macro `ivreg2_cmd' now set with appropriate ivreg2 command. + +* replay() previous results + if replay() { + syntax [, FIRST FFIRST rf Level(integer $S_level) NOHEader NOFOoter NOOUTput /* + */ EForm(string) PLUS VERsion] + + if "`version'" != "" & "`first'`ffirst'`rf'`noheader'`nofooter'`eform'`plus'" != "" { + di as err "option version not allowed" + error 198 + } + if "`version'" != "" { + di in gr "`lversion'" + ereturn clear + ereturn local version `lversion' + ereturn local cmd "xtivreg2" + exit + } + if `"`e(cmd)'"' != "xtivreg2" { + error 301 + } +* End replay block + } + else { +* Start estimation block + local cmdline "xtivreg2 `*'" + + syntax [anything(name=0)] [if] [in] [aw fw pw iw/] , [ fe fd /* + */ Ivar(varname) Tvar(varname) first ffirst rf /* + */ savefirst SAVEFPrefix(name) saverf SAVERFPrefix(name) CLuster(varlist) /* + */ orthog(string) ENDOGtest(string) REDundant(string) PARTIAL(string) /* + */ BW(string) SKIPCOLL NOHEader NOFOoter NOOUTput GMM GMM2s * ] + +* Option called gmm in ivreg28, gmm2s in ivreg29 onwards + if "`gmm'`gmm2s'" ~= "" { + if `ver' < 9 { + local gmm2s "gmm" + } + else { + local gmm2s "gmm2s" + } + } + + if ("`fe'"=="" & "`fd'"=="") | ("`fe'"~="" & "`fd'"~="") { +di as err "error - must specify either fe or fd option" + error 198 + } + + if "`bw'"=="auto" { +di as err "error - automatic bandwidth selection not supported by -xtivreg2-" + error 198 + } + +* Also catches inconsistencies between i/tvar and tsset variables + xt_iis `ivar' + local ivar "`s(ivar)'" + + capture tsset + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } + if "`tvar'"!="" | "`fd'"!="" { + xt_tis `tvar' + local tvar "`s(timevar)'" + } + + if "`skipcoll'"=="" { + qui _rmcoll `varlist' + local retlist `r(varlist)' `ivar' + qui _rmcoll `retlist' + if "`r(varlist)'" ~= "`retlist'" { + di as err "independent variables " _c + di as err "are collinear with the panel variable" _c + di as err " `ivar'" + exit 198 + } + } + + local n 0 + + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + if `s(stop)' { + error 198 + } + while `s(stop)'==0 { + if "`paren'"=="(" { + local n = `n' + 1 + if `n'>1 { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +exit 198 + } + gettoken p lhs : lhs, parse(" =") + while "`p'"!="=" { + if "`p'"=="" { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +di in red `"the equal sign "=" is required"' +exit 198 + } + local endo `endo' `p' + gettoken p lhs : lhs, parse(" =") + } +* To enable Cragg HOLS estimator, allow for empty endo list + if "`endo'" != "" { + tsunab endo : `endo' + } +* To enable OLS estimator with (=) syntax, allow for empty exexog list + if "`lhs'" != "" { + tsunab exexog : `lhs' + } + } + else { + local inexog `inexog' `lhs' + } + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + } + local 0 `"`lhs' `0'"' + + tsunab inexog : `inexog' + tokenize `inexog' + local lhs "`1'" + local 1 " " + local inexog `*' + + if "`gmm'`gmm2s'" != "" & "`exexog'" == "" { +di as err "option -gmm- invalid: no excluded instruments specified" + exit 102 + } + +* If first requested, also needs to request savefirst or savefprefix and set drop flag + if "`first'" != "" & "`savefirst'`savefprefix'" == "" { + local savefirst "savefirst" + local dropfirst "dropfirst" + } + if "`savefirst'" != "" & "`savefprefix'" == "" { + local savefprefix "_xtivreg2_" + } + +* If rf requested, also needs to request saverf or saverfprefix and set drop flag + if "`rf'" != "" & "`saverf'`saverfprefix'" == "" { + local saverf "saverf" + local droprf "droprf" + } + if "`saverf'" != "" & "`saverfprefix'" == "" { + local saverfprefix "_xtivreg2_" + } + + tempvar wvar + if "`weight'" !="" { + local wtexp `"[`weight'=`exp']"' + qui gen double `wvar'=`exp' + } + else { + qui gen long `wvar'=1 + } + +* Begin estimation blocks + if "`fd'" ~= "" { + local lhs_fd "d.`lhs'" + foreach vn of local inexog { + local inexog_fd "`inexog_fd' d.`vn'" + } + foreach vn of local exexog { + local exexog_fd "`exexog_fd' d.`vn'" + } + foreach vn of local endo { + local endo_fd "`endo_fd' d.`vn'" + } + foreach vn of local orthog { + local orthog_fd "`orthog_fd' d.`vn'" + } + foreach vn of local endogtest { + local endogtest_fd "`endogtest_fd' d.`vn'" + } + foreach vn of local redundant { + local redundant_fd "`redundant_fd' d.`vn'" + } +* Do this even though ivreg2 currently won't accept TS operators with partial() + foreach vn of local partial { + local partial_fd "`partial_fd' d.`vn'" + } + +* Use nooutput option to get collinearity etc. messages +* Ensures that these are reported before any fatal ivreg2 error that might occur +* Called under version control using calling version + version `ver' : `ivreg2_cmd' `lhs_fd' `inexog_fd' (`endo_fd' = `exexog_fd') `wtexp' `if', /* + */ `first' `ffirst' `rf' /* + */ savefprefix(`savefprefix') saverfprefix(`saverfprefix') /* + */ cluster(`cluster') orthog(`orthog_fd') endog(`endogtest_fd') /* + */ redundant(`redundant_fd') `partialopt'(`partial_fd') tvar(`tvar') bw(`bw') `options' /* + */ `gmm2s' nooutput + preserve + tempvar touse + qui gen `touse'=e(sample) + tempname T_i + + sort `ivar' `touse' +* Only iw and fw use weighted observation counts + if "`weight'" == "iweight" | "`weight'" == "fweight" { + qui by `ivar' `touse': gen long `T_i' = sum(`wvar') if `touse' + } + else { + qui by `ivar' `touse': gen long `T_i' = _N if `touse' + } + qui by `ivar' `touse': replace `T_i' = . if _n~=_N + qui count if `T_i' < . + ereturn scalar N_g=r(N) + + tempname g_min g_avg g_max + qui by `ivar' `touse' : replace `T_i'=`T_i'[_N] if `touse' & _n<_N +* Only iw and fw report weighted observation counts + if "`weight'" == "iweight" | "`weight'" == "fweight" { + sum `T_i' `wtexp', meanonly + ereturn scalar g_avg = r(sum_w)/e(N_g) + } + else { + sum `T_i', meanonly + ereturn scalar g_avg = r(N)/e(N_g) + } + + ereturn scalar g_min = r(min) + ereturn scalar g_max = r(max) + + ereturn scalar df_b=e(df_m) + ereturn scalar sigma_e=e(rmse) +* ereturn scalar singleton=`singleton' + ereturn local xtmodel "fd" + ereturn local version `lversion' + ereturn local predict "xtivreg2_p" + ereturn local ivar "`ivar'" + ereturn local tvar "`tvar'" + + restore +* End FD block + } + else { +* Must be fixed effects + marksample touse + markout `touse' `lhs' `inexog' `exexog' `endo' `cluster' `tvar', strok + +* Catch weird bug if ivar is used as a regressor + local allvars "`lhs' `inexog' `endo' `exexog'" + local allvars : subinstr local allvars "`ivar'" "`ivar'", all word count(local ivar_ct) + if `ivar_ct'>0 { +di as err "Error - cannot use tsset panel variable `ivar' as dependent variable, regressor or IV." + exit 198 + } +* Don't allow tvar to be used as a regressor either - too dangerous + if "`tvar'"~="" { + local allvars "`lhs' `inexog' `endo' `exexog'" + local allvars : subinstr local allvars "`tvar'" "`tvar'", all word count(local tvar_ct) + if `tvar_ct'>0 { +di as err "Error - cannot use tsset time variable `tvar' as dependent variable, regressor or IV." +di as err "Create a new variable equal to `tvar' and use it instead." + exit 198 + } + } + + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + tsrevar `inexog', substitute + local inexog_t "`r(varlist)'" + tsrevar `endo', substitute + local endo_t "`r(varlist)'" + tsrevar `exexog', substitute + local exexog_t "`r(varlist)'" + tsrevar `orthog', substitute + local orthog_t "`r(varlist)'" + tsrevar `endogtest', substitute + local endogtest_t "`r(varlist)'" + tsrevar `redundant', substitute + local redundant_t "`r(varlist)'" + tsrevar `partial', substitute + local partial_t "`r(varlist)'" + +* preserve here, prior to first sort + preserve + + tempvar T_i + sort `ivar' `touse' +* Catch singletons. Must use unweighted data + qui by `ivar' `touse': gen long `T_i' = _N if _n==_N & `touse' + qui count if `T_i' == 1 + local singleton=r(N) + if `singleton' > 0 { +di in ye "Warning - singleton groups detected. " `singleton' " observation(s) not used." + } + qui replace `touse'=0 if `T_i'==1 + drop `T_i' + +* Catch clustvar-ivar inconsistencies + if "`cluster'"!="" { +* Allow for 2-way clustering + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`cluster1'" ~= "`ivar'" & "`cluster2'" ~= "`ivar'" { + tempvar ic_ct + sort `ivar' `cluster1' `touse' + qui by `ivar' `cluster1' `touse': gen long `ic_ct' = 1 if _n==_N & `touse' + sort `ivar' `touse' + qui by `ivar' `touse': replace `ic_ct'=sum(`ic_ct') if `touse' + qui count if `ic_ct' > 1 & `ic_ct' < . + if r(N)>1 & r(N)<. & "`cluster2'"=="" { +di as err "cluster option not supported if a panel spans more than one cluster" + exit 198 + } + else if r(N)>1 & r(N)<. & "`cluster2'"~="" { +* Need to check second cluster var if it exists + drop `ic_ct' + sort `ivar' `cluster2' `touse' + qui by `ivar' `cluster2' `touse': gen long `ic_ct' = 1 if _n==_N & `touse' + sort `ivar' `touse' + qui by `ivar' `touse': replace `ic_ct'=sum(`ic_ct') if `touse' + qui count if `ic_ct' > 1 & `ic_ct' < . + if r(N)>1 & r(N)<. { +di as err "cluster option not supported if a panel spans more than one cluster" + exit 198 + } + } + } + } + + sort `ivar' `touse' +* Only iw and fw use weighted observation counts + if "`weight'" == "iweight" | "`weight'" == "fweight" { + qui by `ivar' `touse': gen long `T_i' = sum(`wvar') if `touse' + } + else { + qui by `ivar' `touse': gen long `T_i' = _N if `touse' + } + qui by `ivar' `touse': replace `T_i' = . if _n~=_N + qui count if `T_i' < . + local N_g=r(N) + local dofminus=`N_g' + local allvars "`lhs_t' `inexog_t' `endo_t' `exexog_t'" + foreach var of local allvars { + tempvar `var'_m +* To get weighted means + qui by `ivar' `touse' : gen double ``var'_m'=sum(`var'*`wvar')/sum(`wvar') if `touse' + qui by `ivar' `touse' : replace ``var'_m'=``var'_m'[_N] if `touse' & _n<_N +* This guarantees that the demeaned variables are doubles + qui by `ivar' `touse' : replace ``var'_m'=`var'-``var'_m'[_N] if `touse' + drop `var' + rename ``var'_m' `var' + } +* Use nooutput option to get collinearity etc. messages +* Ensures that these are reported before any fatal ivreg2 error that might occur + version `ver' : `ivreg2_cmd' `lhs_t' `inexog_t' (`endo_t' = `exexog_t') `wtexp' if `touse', /* + */ dofminus(`dofminus') nocons `first' `ffirst' `rf' /* + */ savefprefix(`savefprefix') saverfprefix(`saverfprefix') /* + */ cluster(`cluster') orthog(`orthog_t') endog(`endogtest_t') /* + */ redundant(`redundant_t') `partialopt'(`partial_t') tvar(`tvar') bw(`bw') `options' /* + */ `gmm2s' nooutput + + ereturn scalar N_g = `N_g' + qui by `ivar' `touse' : replace `T_i'=`T_i'[_N] if `touse' & _n<_N +* Only iw and fw report weighted observation counts + if "`weight'" == "iweight" | "`weight'" == "fweight" { + sum `T_i' `wtexp', meanonly + ereturn scalar g_avg = r(sum_w)/e(N_g) + } + else { + sum `T_i', meanonly + ereturn scalar g_avg = r(N)/e(N_g) + } + ereturn scalar g_min = r(min) + ereturn scalar g_max = r(max) +* Will need these for first/rf option + tempname g_min g_avg g_max + scalar `g_min'=e(g_min) + scalar `g_avg'=e(g_avg) + scalar `g_max'=e(g_max) + restore + +* Replace any time series locals with original time series names + tempname b V S W firstmat + +* First replace ts locals in saved first and/or rf results, if any + if "`first'`savefirst'`rf'`saverf'" ~= "" { + local eqlist "`e(rfeq)' `e(firsteqs)'" +* In case estimates names have changed, we will be saving under new names. + local rrfeq "`e(rfeq)'" + local rfirsteqs "`e(firsteqs)'" + foreach eqname of local eqlist { + _estimates hold `regest', restore + capture estimates restore `eqname' + if _rc == 0 { +* In case estimates name has changed, e.g., dep var of first-stage regression, +* we will want to re-save under a replace new name, reqname + estimates drop `eqname' + local reqname "`eqname'" + mat `b' =e(b) + mat `V' =e(V) + mat `S' =e(S) + local cnames : colnames `b' + local cnamesS : colnames `S' + local vnames "`lhs' `endo' `inexog' `exexog'" + local vnames_t "`lhs_t' `endo_t' `inexog_t' `exexog_t'" +* Macros to be fixed + local finsts "`e(insts)'" + local finexog "`e(inexog)'" + local fdv "`e(depvar)'" + foreach vn of local vnames { + tokenize `vnames_t' + local vn_t `1' + mac shift + local vnames_t `*' + local cnames : subinstr local cnames "`vn_t'" "`vn'" + local cnamesS : subinstr local cnamesS "`vn_t'" "`vn'" +* Macro varlists + local finsts : subinstr local finsts "`vn_t'" "`vn'" + local finexog : subinstr local finexog "`vn_t'" "`vn'" + local fdv : subinstr local fdv "`vn_t'" "`vn'" +* Titles. TS ops not allowed so change . to _ + local reqname : subinstr local reqname "`vn_t'" "`vn'" + local reqname : subinstr local reqname "." "_" + } +* Change in list of equation names + local rrfeq : subinstr local rrfeq "`eqname'" "`reqname'" + local rfirsteqs : subinstr local rfirsteqs "`eqname'" "`reqname'" + mat colnames `b' =`cnames' + mat colnames `V' =`cnames' + mat rownames `V' =`cnames' + mat colnames `S' =`cnamesS' + mat rownames `S' =`cnamesS' + ereturn post `b' `V', depname(`fdv') noclear + ereturn matrix S `S' + ereturn local insts `finsts' + ereturn local inexog `finexog' + ereturn scalar N_g=`N_g' + ereturn scalar df_a=`N_g' + ereturn scalar df_b=e(df_m) + if "`cluster'"=="" { + ereturn scalar df_m=`N_g'+e(df_b) + } + else { + ereturn scalar df_m=e(df_b) + } + ereturn scalar sigma_e=e(rmse) + ereturn local xtmodel "fe" + ereturn local version `lversion' + ereturn local predict "xtivreg2_p" + ereturn local ivar "`ivar'" + ereturn local tvar "`tvar'" + ereturn scalar g_min = `g_min' + ereturn scalar g_avg = `g_avg' + ereturn scalar g_max = `g_max' + ereturn local cmd "xtivreg2" + local eqtitle "`e(_estimates_title)'" + capture est store `reqname', title(`eqtitle') + } + _estimates unhold `regest' + } + } +* Now fix main results + mat `b' =e(b) + mat `V' =e(V) + mat `S' =e(S) + mat `W' =e(W) + mat `firstmat'=e(first) +* Matrix column names to be changed + local cnames : colnames `b' + local cnamesS : colnames `S' + local cnamesW : colnames `W' + local cnamesf : colnames `firstmat' +* Full list of names to change + local vnames "`lhs' `inexog' `endo' `exexog'" + local vnames_t "`lhs_t' `inexog_t' `endo_t' `exexog_t'" +* Macros to be fixed + local insts "`e(insts)'" + local inexog "`e(inexog)'" + local instd "`e(instd)'" + local exexog "`e(exexog)'" + local depvar "`e(depvar)'" + local clist "`e(clist)'" + local elist "`e(elist)'" + local redlist "`e(redlist)'" + local partial "`e(partial)'" +* If any collinear or duplicates + local collin "`e(collin)'" + local dups "`e(dups)'" + local insts1 "`e(insts1)'" + local inexog1 "`e(inexog1)'" + local instd1 "`e(instd1)'" + local exexog1 "`e(exexog1)'" + local partial1 "`e(partial1)'" + foreach vn of local vnames { + tokenize `vnames_t' + local vn_t `1' + mac shift + local vnames_t `*' + local cnames : subinstr local cnames "`vn_t'" "`vn'" + local cnamesS : subinstr local cnamesS "`vn_t'" "`vn'" + local cnamesW : subinstr local cnamesW "`vn_t'" "`vn'" + local cnamesf : subinstr local cnamesf "`vn_t'" "`vn'" +* Macro varlists + local insts : subinstr local insts "`vn_t'" "`vn'" + local inexog : subinstr local inexog "`vn_t'" "`vn'" + local instd : subinstr local instd "`vn_t'" "`vn'" + local exexog : subinstr local exexog "`vn_t'" "`vn'" + local partial : subinstr local partial "`vn_t'" "`vn'" + local depvar : subinstr local depvar "`vn_t'" "`vn'" + local clist : subinstr local clist "`vn_t'" "`vn'" + local elist : subinstr local elist "`vn_t'" "`vn'" + local redlist : subinstr local redlist "`vn_t'" "`vn'" + local collin : subinstr local collin "`vn_t'" "`vn'" + local dups : subinstr local dups "`vn_t'" "`vn'" + local insts1 : subinstr local insts1 "`vn_t'" "`vn'" + local inexog1 : subinstr local inexog1 "`vn_t'" "`vn'" + local instd1 : subinstr local instd1 "`vn_t'" "`vn'" + local exexog1 : subinstr local exexog1 "`vn_t'" "`vn'" + local partial1: subinstr local partial1 "`vn_t'" "`vn'" + } + mat colnames `b' =`cnames' + mat colnames `V' =`cnames' + mat rownames `V' =`cnames' + mat colnames `S' =`cnamesS' + mat rownames `S' =`cnamesS' + mat colnames `W' =`cnamesW' + mat rownames `W' =`cnamesW' + mat colnames `firstmat'=`cnamesf' + + ereturn post `b' `V', dep(`depvar') esample(`touse') noclear + ereturn matrix S `S' + if ~matmissing(`W') { + ereturn matrix W `W' + } + if ~matmissing(`firstmat') { + ereturn matrix first `firstmat' + } + ereturn local insts `insts' + ereturn local inexog `inexog' + ereturn local instd `instd' + ereturn local exexog `exexog' + ereturn local partial `partial' + ereturn local collin `collin' + ereturn local dups `dups' + ereturn local insts1 `insts1' + ereturn local inexog1 `inexog1' + ereturn local instd1 `instd1' + ereturn local exexog1 `exexog1' + ereturn local partial1 `partial1' + ereturn local depvar `depvar' + ereturn local clist `clist' + ereturn local elist `elist' + ereturn local redlist `redlist' + ereturn scalar N_g=`N_g' + ereturn scalar df_b=e(df_m) + ereturn scalar df_a=e(N_g) + if "`cluster'"=="" { + ereturn scalar df_m=e(N_g)+e(df_b) + } + else { +* FEs with cluster don't use up degrees of freedom as incidental parameters + ereturn scalar df_m=e(df_b) + } + ereturn scalar sigma_e=e(rmse) + ereturn scalar singleton=`singleton' + ereturn local xtmodel "fe" + ereturn local version `lversion' + ereturn local predict "xtivreg2_p" + ereturn local ivar "`ivar'" + ereturn local tvar "`tvar'" + if "`first'`savefirst'`rf'`saverf'" ~= "" { + ereturn local rfeq `rrfeq' + ereturn local firsteqs `rfirsteqs' + } +* End fixed effects block + } + +* End estimation block + } + + if "`noheader'`nooutput'"=="" { + if "`e(xtmodel)'"=="fd" { + di in gr _newline "FIRST DIFFERENCES ESTIMATION" + di in gr "{hline 28}" + } + else { + di in gr _newline "FIXED EFFECTS ESTIMATION" + di in gr "{hline 24}" + } + di in gr "Number of groups = " in ye %9.0g e(N_g) /* + */ _col(49) in gr "Obs per group: min" _col(68) "=" /* + */ _col(70) in ye %9.0g e(g_min) + di in gr _col(64) in gr "avg" _col(68) "=" /* + */ _col(70) in ye %9.1f e(g_avg) + di in gr _col(64) in gr "max" _col(68) "=" /* + */ _col(70) in ye %9.0g e(g_max) + } + + ereturn local cmd "`ivreg2_cmd'" + ereturn local cmdline "`cmdline'" + if "`eform'"!="" { + local efopt "eform(`eform')" + } + if "`level'"!="" { + local levopt "level(`level')" + } + if "`nooutput'"=="" { + if "`e(xtmodel)'"=="fd" { + version `ver' : `ivreg2_cmd', `first' `ffirst' `rf' `noheader' `nofooter' `plus' `levopt' `efopt' `dropfirst' `droprf' + } + else { +* ivreg2 F stat looks in df_m, not df_b, for F dof + local temp_df_m = e(df_m) + ereturn scalar df_m=e(df_b) + version `ver' : `ivreg2_cmd', `first' `ffirst' `rf' `noheader' `nofooter' `plus' `levopt' `efopt' `dropfirst' `droprf' + ereturn scalar df_m=`temp_df_m' + } + } + if "`dropfirst'" != "" { + local firsteqs "`e(firsteqs)'" + foreach eqname of local firsteqs { + capture estimates drop `eqname' + } + ereturn local firsteqs + } + if "`droprf'" != "" { + local eqname "`e(rfeq)'" + capture estimates drop `eqname' + ereturn local rfeq + } + ereturn local cmd "xtivreg2" +* End display block + +end + +********************************************************************** + +* Taken from ivreg2 +program define Disp + version 8.2 + syntax [anything] [, _col(integer 15) ] + local len = 80-`_col'+1 + local piece : piece 1 `len' of `"`anything'"' + local i 1 + while "`piece'" != "" { + di in gr _col(`_col') "`first'`piece'" + local i = `i' + 1 + local piece : piece `i' `len' of `"`anything'"' + } + if `i'==1 { + di + } +end + +program define IsStop, sclass + /* sic, must do tests one-at-a-time, + * 0, may be very large */ + if `"`0'"' == "[" { + sret local stop 1 + exit + } + if `"`0'"' == "," { + sret local stop 1 + exit + } + if `"`0'"' == "if" { + sret local stop 1 + exit + } +* per official ivreg 5.1.3 + if substr(`"`0'"',1,3) == "if(" { + sret local stop 1 + exit + } + if `"`0'"' == "in" { + sret local stop 1 + exit + } + if `"`0'"' == "" { + sret local stop 1 + exit + } + else sret local stop 0 +end + +exit diff --git a/ado/x/xtivreg2.hlp b/ado/x/xtivreg2.hlp new file mode 100644 index 0000000..6aafa0e --- /dev/null +++ b/ado/x/xtivreg2.hlp @@ -0,0 +1,250 @@ +{smcl} +{* 5 Feb 2010}{...} +{hline} +help for {hi:xtivreg2} +{hline} + +{title:Extended IV/2SLS, GMM and AC/HAC, LIML and k-class regression for panel data models} + +{p 4}Full syntax, fixed effects and first differences models + +{p 8 14}{cmd:xtivreg2} {it:depvar} [{it:varlist1}] +{cmd:(}{it:varlist2}{cmd:=}{it:varlist_iv}{cmd:)} [{it:weight}] +[{cmd:if} {it:exp}] +{bind:[{cmd:in} {it:range}] {cmd:, {{cmd:fe} | {cmd:fd}}} } +{bind:[{cmdab:i:var(}{it:varname}{cmd:)} {cmdab:t:var(}{it:varname}{cmd:)}} +{cmd:gmm} +{cmd:bw(}{it:#}{cmd:)} +{cmd:kernel(}{it:string}{cmd:)} +{cmd:liml} +{cmd:fuller(}{it:#}{cmd:)} +{cmd:kclass(}{it:#}{cmd:)} +{cmd:coviv} +{cmd:cue} +{cmd:cueinit}{cmd:(}{it:matrix}{cmd:)} +{cmdab:cueopt:ions}{cmd:(}{it:string}{cmd:)} +{cmdab:r:obust} +{cmdab:cl:uster}{cmd:(}{it:varlist}{cmd:)} +{cmd:orthog(}{it:varlist_ex}{cmd:)} +{cmd:endog(}{it:varlist_en}{cmd:)} +{cmdab:red:undant(}{it:varlist_ex}{cmd:)} +{cmd:fwl(}{it:varlist}{cmd:)} +{cmdab:sm:all} +{cmdab:noc:onstant} +{cmd:first} {cmd:ffirst} {cmd:savefirst} {cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:rf} {cmd:saverf} {cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:nocollin} {cmd:noid} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{bind:{cmd:plus} ]} + +{p 4}Replay syntax + +{p 8 14}{cmd:xtivreg2} +{bind:[{cmd:,} {cmd:first}} +{cmd:ffirst} {cmd:rf} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{cmd:plus} ]} + +{p 4}Version syntax + +{p 8 14}{cmd:xtivreg2}, {cmd:version} + + +{p}{cmd:xtivreg2} may be used with time-series or panel data, +in which case the data can be {cmd:tsset} +before using {cmd:xtivreg2}; see help {help tsset}. + +{p}All {it:varlists} may contain time-series operators; +see help {help varlist}. + +{p}{cmd:aweight}s, {cmd:fweight}s, {cmd:iweight}s and {cmd:pweight}s +are allowed; see help {help weights}. + +{p}The syntax of {help predict} following {cmd:xtivreg2} is + +{p 8 16}{cmd:predict} [{it:type}] {it:newvarname} [{cmd:if} {it:exp}] +[{cmd:in} {it:range}] [{cmd:,} {it:statistic}] + +{p}For the fixed-effects estimator, {it:statistic} is + +{p 8 23}{cmd:e}{space 11}v_it, the idiosyncratic component of the error term{p_end} + +{p}and is available only for the estimation sample. + +{p}For the first-differences estimator, {it:statistic} is + +{p 8 23}{cmd:e}{space 11}v_it - v_it-1, the first-differenced idiosyncratic component{p_end} +{p 8 23}{cmd:xb}{space 10}(X_it - X_it-1)*b_hat, the fitted values{p_end} + +{p}and are available in and out of sample. +Use {cmd:e(sample)} if wanted only for the estimation sample. + + +{title:Description} + +{p}{cmd:xtivreg2} implements IV/GMM estimation +of the fixed-effects and first-differences panel data models +with possibly endogenous regressors. +It is essentially a wrapper for {cmd:ivreg2}, +which must be installed for {cmd:xtivreg2} to run +(version 2.1.11 or above of {cmd:ivreg2} is required for Stata 9; +Stata 8.2 requires {cmd:ivreg28}). +{cmd:xtivreg2} supports all the estimation and reporting +options of {cmd:ivreg2}; +see help {help ivreg2} for full descriptions and examples. +In particular, all the statistics available with {cmd:ivreg2} +(heteroskedastic, cluster- and +autocorrelation-robust covariance matrix and standard errors, +overidentification and orthogonality tests, +first-stage and weak/underidentification statistics, etc.) +are also supported by {cmd:xtivreg2} and will be reported +with any degrees-of-freedom adjustments +required for a panel data estimation. + +{p}The degrees-of-freedom adjustments depend on +whether the estimation is fixed-effects or first-differences, +and whether it uses the {cmd:cluster} option. + +{p}For fixed-effects estimation without {cmd:cluster}, +the covariance matrix +and regression statistics +(identification and overidentification statistics, +first-stage regressions and tests, etc.) +are adjusted for the number of fixed effects N_g. +With large-sample statistics, +the covariance matrix has the adjustment (N-N_g); +with small-sample statistics, +the adjustment is (N-N_g-K), +where K is the number of regressors. + +{p}For fixed-effects estimation with {cmd:cluster}, +{cmd:xtivreg2} makes {it:no} degrees-of-freedom adjustment +for the number of fixed effects. +This follows the formulation of a cluster-robust covariance matrix +for the fixed-effects model as originally proposed by Arellano (1987); +see, e.g., Wooldridge (2002), p. 275. +Stata's official {cmd:xtivreg}, {cmd:xtreg} and {cmd:areg} +(as of version 9.1, October 2005), +by contrast, use the (N-N_g-K) adjustment, +which is somewhat conservative in this context. +{it:However}, the approach used by {cmd:xtivreg2} +requires that no panel overlaps more than one cluster. +That is, either the panel variable is identical to the cluster variable, +or panels are uniquely assigned to clusters. +If any panel is contained in more than one cluster, +the {cmd:xtivreg2} approach is invalid, and it will exit with an error. + +{p}First-differences estimation makes +no degrees-of-freedom adjustment, +irrespective of whether {cmd:cluster} is used. + +{p}Other features of {cmd:xtivreg2} +and differences vs. official {cmd:xtivreg}: + +{p 3 3}{cmd:xtivreg2} supports only the fixed effects +and the first-differences panel models; +the option {cmd:fe} or {cmd:fd} is required. +GLS random effects is not supported. + +{p 3 3}{cmd:xtivreg2} does not estimate or report a constant +with the fixed effects model {cmd:fe}. + +{p 3 3}If {cmd:ivreg2} version 3.0 or later is installed, +{cmd:xtivreg2} supports 2-way clustering; +see help {help ivreg2} for details. + +{p 3 3}First-differences estimation with {cmd:xtivreg2} +yields estimates identical to {cmd:ivreg2} when the latter +is supplied with all variables +expressed in first-differences. + +{p 3 3}{cmd:xtivreg2} allows use of time series operators. + +{p 3 3}For fixed-effects estimation, +the data must either be {cmd:tsset}, +the panel id variable set with {cmd:iis}, +or the panel id variable supplied to {cmd:xtivreg2} +with the {cmd:ivar} option. +For first-differences estimation, +the data must be {cmd:tsset}. + +{p 3 3}{cmd:xtivreg2} supports all types of weights. + +{p 3 3}The R-squared reported by {cmd:xtivreg2} +for the fixed-effects estimation +is the "within R-squared" obtained by estimating +the equation in mean-deviation form. + +{p 3 3}{cmd:xtivreg2} supports simple fixed effects +and first-differences estimation +with no endogeneous variables, +i.e., {cmd:(}{it:varlist2}{cmd:=}{it:varlist_iv}{cmd:)} +can be omitted. + + +{title:Examples} + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta" : . use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta }{p_end} +{p 8 12}(Layard & Nickell, Unemployment in Britain, Economica 53, 1986, from Ox dist) + +{p 8 12}{stata "tsset id year" :. tsset id year} + +{col 0}({cmd:xtivreg} vs. {cmd:xtivreg2}, fixed effects) + +{p 8 12}{stata "xtivreg2 ys k (n=l2.n l3.n), fe small" : . xtivreg2 ys k (n=l2.n l3.n), fe small} + +{p 8 12}{stata "xtivreg ys k (n=l2.n l3.n), fe small" : . xtivreg ys k (n=l2.n l3.n), fe small} + +{col 0}({cmd:xtivreg2} vs. {cmd:ivreg2} vs. {cmd:xtivreg}, first-differences) + +{p 8 12}{stata "xtivreg2 ys k (n=l.n l2.n), fd small first" : . xtivreg2 ys k (n=l.n l2.n), fd small first} + +{p 8 12}{stata "ivreg2 d.ys d.k (d.n=ld.n l2d.n), small first" : . ivreg2 d.ys d.k (d.n=ld.n ld2.n), small first} + +{p 8 12}{stata "xtivreg ys k (n=l.n l2.n), fd small" : . xtivreg ys k (n=l.n l2.n), fd small} + + +{title:Citation of xtivreg2} + +{p}{cmd:xtivreg2} is not an official Stata command. It is a free contribution +to the research community, like a paper. Please cite it as such: {p_end} + +{phang}Schaffer, M.E., 2010. +xtivreg2: Stata module to perform extended IV/2SLS, GMM and AC/HAC, LIML and k-class regression +for panel data models. +{browse "http://ideas.repec.org/c/boc/bocode/s456501.html":http://ideas.repec.org/c/boc/bocode/s456501.html}{p_end} + + +{title:References} + +{p 0 4}Arellano, M. 1987. Computing Robust Standard Errors for Within-Groups Estimators. +Oxford Bulletin of Economics and Statistics, Vol. 49, pp. 431-34. + +{p 0 4}Baum, C.F., Schaffer, M.E., and Stillman, S. 2003. Instrumental Variables and GMM: +Estimation and Testing. The Stata Journal, Vol. 3, No. 1, pp. 1-31. +Unpublished working paper version: +Boston College Department of Economics Working Paper No 545. http://fmwww.bc.edu/ec-p/WP545.pdf + +{p 0 4}Wooldridge, J.M. 2002. Econometric Analysis of Cross Section and Panel Data. +Cambridge, MA: MIT Press. + + +{title:Author} + + Mark E Schaffer, Heriot-Watt University, UK + m.e.schaffer@hw.ac.uk + + +{title:Also see} + +{p 0 19}On-line: help for {help ivreg2}, {help overid}, {help ivendog}, {help ivhettest}, +{help ivreset}, {help xtoverid}, {help condivreg} (if installed) +{p_end} diff --git a/ado/x/xtivreg2_p.ado b/ado/x/xtivreg2_p.ado new file mode 100644 index 0000000..9ce5880 --- /dev/null +++ b/ado/x/xtivreg2_p.ado @@ -0,0 +1,95 @@ +*! xtivreg2_p version 1.0.3 5July2012 +program define xtivreg2_p, sortpreserve + version 8.2 + syntax newvarname [if] [in] , [E XB U UE XBU] + +* Does not currently support previous estimation using fwl or partial + if "`e(fwlcons)'" != "" | (e(partial_ct)>0 & e(partial_ct)<.) { +di in r "predict not supported after xtivreg2 with partialling-out option" + error 499 + } + +* Uses [if] [in] as well as limiting to e(sample) + tempname touse esample + mark `touse' `if' `in' + +* Sorting disturbs existing sort if xtset so sort only when actually needed + qui xtset + local notxtset = ("`r(panelvar)'" == "" | "`r(timevar)'" == "") + + if "`e(xtmodel)'"=="fd" { + if `notxtset' { + sort `e(ivar)' `e(tvar)' + } + + if "`u'`ue'`xbu'" != "" { + di as err "`u'`ue'`xbu' not supported for fd model" + exit 198 + } + if "`xb'" ~= "" { + markout `touse' + _predict `typlist' `varlist' if `touse' + } + else { +* Default to e + tempname xb + markout `touse' + qui _predict double `xb' if `touse' + gen `typlist' `varlist'=d.`e(depvar)'-`xb' if `touse' + } + } + else if "`e(xtmodel)'"=="fe" { + + if "`xb'`u'`ue'`xbu'" != "" { + di as err "`xb'`u'`ue'`xbu' not currently supported by -xtivreg2-" + exit 198 + } + + qui if "`e'"!="" { + gen byte `esample' = e(sample) + markout `touse' `esample' + if `notxtset' { + sort `e(ivar)' `e(tvar)' + } +* Need to strip out time series operators + local lhs "`e(depvar)'" + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + local rhs : colnames(e(b)) + tsrevar `rhs', substitute + local rhs_t "`r(varlist)'" + + sort `e(ivar)' `esample' + local allvars "`lhs_t' `rhs_t'" +* Demeaning block. Uses entire estimatation sample + foreach var of local allvars { + tempname `var'_m `var'_dm + by `e(ivar)' `esample' : gen double ``var'_m'=sum(`var')/_N if `esample' + by `e(ivar)' `esample' : replace ``var'_m'=``var'_m'[_N] if `esample' & _n<_N + sum `var' if `esample', meanonly + by `e(ivar)' `esample' : gen double ``var'_dm'=`var'-``var'_m'[_N] if `esample' + local allvars_dm "`allvars_dm' ``var'_dm'" + } + + tokenize `allvars_dm' + local lhs_dm "`1'" + mac shift + local rhs_dm "`*'" + + sort `e(ivar)' `e(tvar)' + tempname b + mat `b'=e(b) + mat colnames `b' = `rhs_dm' + + tempvar fitted + mat score double `fitted' = `b' if `touse' + gen `typlist' `varlist'= `lhs_dm' - `fitted' + } + } + +end + +* Version notes +* 1.0.1 Fixed sort bug - forcing sort would disturb ts operators if tsset +* 1.0.2 Changed trap for partialling-out so that fwl (old) or partial (new) are trapped +* 1.0.3 Changed calls from tsset to xtset to accommodate panels with no time-series dimension diff --git a/code/~analysis_mindspark_20180723.do.stswp b/code/~analysis_mindspark_20180723.do.stswp new file mode 100644 index 0000000..d1226b9 --- /dev/null +++ b/code/~analysis_mindspark_20180723.do.stswp @@ -0,0 +1,1877 @@ +// ****************** ANALYZE MINDSPARK DATA ****************** // + +/// authors: abhijeet singh & alejandro ganimian + +/// date: june 18, 2018 + +/// objectives: + + /// tables + + * 1. sample descriptives and balance on observables + * 2. intent-to-treat effects in a regression framework + * 3. treatment effect by specific competence assessed + * 4. heterogeneity in treatment effect by sex, ses and baseline score + * 5. heterogeneity in treatment effect by within-grade terciles + * 6. treatment effect on items linked to grade levels + * 7. treatment effect on school exams + * 8. dose-response of mindspark attendance + + * a1. comparing pre-program exam results of study participants and non-participants + * a2. itt estimates with within-grade normalized test scores + * a3. heterogeneous effects on school tests, by terciles of baseline achievement + * a4. heterogeneous effects on independent tests, by terciles of baseline achievement + * a5. correlates of attendance + * a6. quadratic dose-response relationship + * a7. dose-response of subject-specific mindspark attendance + * a8. itt estimates with inverse probability weighting + * a9. lee bounds estimates of ITT effects + * a10. itt estimates, by source of test item + * a11. treatment effect on take-up of other private tutoring + + /// figures + + * 1. assessed levels of student achievement vs. current grade enrolled in school + * 2. mean difference in test scores between lottery winners and losers + * 3. non-parametric investigation of treatment effects by baseline percentiles + * 4. dose response relationship + * 5. precise customization of instruction by the mindspark cal program + * 6. dynamic updating and individualization of content in mindspark + + * a1. comparing pre-program achievement of study participants and non-participants + * a2. distribution of take-up among lottery-winners + * a3. growth in achievement in treatment and control groups + * a4. comparison of mindspark initial assessment of grade-level of student achievement with (independent) baseline test scores + * a5. distribution of questions administered by mindspark cal system + * a6. composition of group instruction batches in mindspark centers + * a7. learning trajectories of individual students in the treatment group + + * d1. distribution of raw percentage correct scores + * d2. distribution of irt scores, by round and treatment status + * d3. item characteristic curves: hindi + * d4. item characteristic curves: math + +// ************************************************* // + +clear all +set more off +set seed 12345 +version 13.1 + +global establishglobals "1" +global gentables "1" +global gengraphs "1" +global plotmathiccs "0" +*ajg: takes a long time to run +global plothindiiccs "0" +*ajg: takes a long time to run + +// ****************** ESTABLISH GLOBALS ****************** // + +if $establishglobals==1 { + +/// directory globals + + if c(username) == "ab.4351" { + global research /Users/ab.4351/Dropbox/ + global projects ${research}Projects_in_pipeline/ + global mindspark ${projects}Mindspark/ + } + + if c(username) == "alejandroganimian" { + global research /Users/alejandroganimian/Dropbox/1_Research/ + global projects ${research}Projects/Ongoing/ + global ms ${projects}Mindspark_Study/ + } + + if c(username) == "calebhf" { + global ms /Users/calebhf/Desktop/code/disrupting-educ-2/ + global data ${ms}data/ + } +/// folder globals + + global bl ${data} + global el ${data} + global sc ${data} + global hh ${data} + + global graphs ${ms}out/Graphs + global tables ${ms}out/Tables + +/// subfolder globals + + global bl_temp ${data} + global bl_clean ${data} + + global el_temp ${data} + global el_clean ${data} + + global ms_temp ${data} + global ms_clean ${data} + + global sc_temp ${data} + global sc_clean ${data} + + global hh_temp ${data} + global hh_clean ${data} + + *Create local ado file library + sysdir set PLUS "${ms}ado" + + adopath ++ PLUS + adopath ++ BASE + +} +// ****************** GENERATE TABLES ****************** // +net from http://www.stata.com/ +net cd users +net cd vwiggins +net install grc1leg + + + +if $gentables==1 { + +/// table 1: sample descriptives and balance on observables + + /// load j-pal data long + + use ${el_clean}ms_blel_jpal_long, clear + + /// create table + + estpost ttest st_female st_age ses d_sch_grade* m_theta_mle /// + h_theta_mle in_r2 if round==1, by(control) + esttab . using "$tables/table1a.csv", replace wide nostar /// + cells(" mu_1 (fmt(2)) mu_2 (fmt(2)) b(fmt(2)) se(fmt(2)) N_1(fmt(0)) N_2(fmt(0))") + + /// create table w/only those present at endline + + estpost ttest st_female st_age ses d_sch_grade* m_theta_mle /// + h_theta_mle if round==1 & in_r2==1, by(control) + esttab . using "$tables/table1b.csv", replace nostar /// + cells(" mu_1 (fmt(2)) mu_2 (fmt(2)) b(fmt(2)) se(fmt(2)) N_1(fmt(0)) N_2(fmt(0))") + +/// table 2: intent-to-treat effects in a regression framework + + /// load j-pal data wide + + use ${el_clean}ms_blel_jpal_wide, clear + + /// relabel vars + + lab var m_theta_mle1 "Baseline score" + lab var h_theta_mle1 "Baseline score" + + /// run regressions + + reg m_theta_mle2 treat m_theta_mle1, robust + outreg2 using ${tables}table2.xls, label less(1) replace noaster + + reg h_theta_mle2 treat h_theta_mle1, robust + outreg2 using ${tables}table2.xls, label less(1) append noaster + + xtreg m_theta_mle2 treat m_theta_mle1, robust i(strata) fe + outreg2 using ${tables}table2.xls, label less(1) append noaster + + xtreg h_theta_mle2 treat h_theta_mle1, robust i(strata) fe + outreg2 using ${tables}table2.xls, label less(1) append noaster + +/// table 3: treatment effect by specific competence assessed + + /// table 3a: math + + /// load j-pal data long + + use ${el_clean}ms_blel_jpal_long, clear + + /// merge with % correct data + + merge 1:1 st_id round using ${el_clean}ms_blel_forirt, /// + keep(master match) keepus(cm*) nogen + + /// keep key vars + + keep st_id round strata cm* m_theta_mle h_theta_mle treat + + /// reshape wide + + reshape wide h_theta* m_theta* cm*, i(st_id strata) j(round) + + /// run regressions + + xtreg cm_arithmetic2 treat m_theta_mle1, robust i(strata) fe + outreg2 using ${tables}table3a.xls, label less(1) replace noaster + + foreach v in cm_word_compute2 cm_data2 cm_fraction2 cm_geometry2 /// + cm_number2 cm_patterns2 { + xtreg `v' treat m_theta_mle1, robust i(strata) fe + outreg2 using ${tables}table3a.xls, label less(1) append noaster + } + + /// table 3b: hindi + + /// load j-pal data long + + use ${el_clean}ms_blel_jpal_long, clear + + /// merge with % correct data + + merge 1:1 st_id round using ${el_clean}ms_blel_forirt, /// + keep(master match) keepus(ch*) nogen + + /// keep key vars + + keep st_id round strata ch* m_theta_mle h_theta_mle treat + + /// reshape wide + + reshape wide h_theta* m_theta* ch*, i(st_id strata) j(round) + + xtreg ch_sentence2 treat h_theta_mle1, robust i(strata) fe + outreg2 using ${tables}table3b.xls, label less(1) replace noaster + + foreach v in ch_retrieve2 ch_inference2 ch_interpret2 { + xtreg `v' treat h_theta_mle1, robust i(strata) fe + outreg2 using ${tables}table3b.xls, label less(1) append noaster + } + +/// table 4: heterogeneity in treatment effect by sex, ses and baseline score + + /// load j-pal data wide + + use ${el_clean}ms_blel_jpal_wide, clear + + /// gen interactions + + gen treat_fem=treat*st_fe + gen treat_ses=treat*ses + gen treat_lmath=treat*m_theta_mle1 + *ajg: 2 students w/o endline math scores + gen treat_lhindi=treat*h_theta_mle1 + *ajg: 2 students w/o endline hindi scores + + /// label interactions + + lab var treat_fem "Treatment * Female" + lab var treat_ses "Treatment * SES index" + lab var treat_lmath "Treatment * Baseline math score" + lab var treat_lhindi "Treatment * Baseline Hindi score" + + /// run regressions + + xtreg m_theta_mle2 treat st_fe treat_fem m_theta_mle1, robust i(strata) fe + outreg2 using ${tables}table4.xls, label less(1) replace noaster + + xtreg h_theta_mle2 treat st_fe treat_fem h_theta_mle1, robust i(strata) fe + outreg2 using ${tables}table4.xls, label less(1) append noaster + + xtreg m_theta_mle2 treat ses treat_ses m_theta_mle1, robust i(strata) fe + outreg2 using ${tables}table4.xls, label less(1) append noaster + + xtreg h_theta_mle2 treat ses treat_ses h_theta_mle1, robust i(strata) fe + outreg2 using ${tables}table4.xls, label less(1) append noaster + + xtreg m_theta_mle2 treat treat_lmath m_theta_mle1, robust i(strata) fe + outreg2 using ${tables}table4.xls, label less(1) append noaster + + xtreg h_theta_mle2 treat treat_lhind h_theta_mle1, robust i(strata) fe + outreg2 using ${tables}table4.xls, label less(1) append noaster + +/// table 5: heterogeneity in treatment effect by within-grade terciles + + /// load j-pal data wide + + use ${el_clean}ms_blel_jpal_wide, clear + + /// gen tercile dummies + + tab terc_math, gen(d_m_terc) + tab terc_hind,gen(d_h_terc) + + /// gen and label interactions with treat dummies + + forval i = 1/3{ + foreach j in m h { + gen terc_t`i'`j' = d_`j'_terc`i'*treat + } + lab var terc_t`i'm "Treatment*Tercile `i' (Math)" + lab var terc_t`i'h "Treatment*Tercile `i' (Hindi)" + } + + /// save tempfile + + tempfile tfile1 + save `tfile1' + + /// run regressions + + shell rm ${tables}table5.xls + + reg m_theta_mle2 treat terc_t2m terc_t3m d_m_terc1 d_m_terc2 /// + d_m_terc3 m_theta_mle1, nocons robust + outreg2 using ${tables}table5.xls, label less(1) replace noaster + + reg h_theta_mle2 treat terc_t2h terc_t3h d_h_terc1 d_h_terc2 /// + d_h_terc3 h_theta_mle1, nocons robust + outreg2 using ${tables}table5.xls, label less(1) append noaster + +/// table 6: treatment effect on items linked to grade levels + + /// load j-pal data long + + use ${el_clean}ms_blel_jpal_long, clear + + /// merge with % correct data + + merge 1:1 st_id round using ${el_clean}ms_blel_forirt, /// + keep(master match) keepus(m_at m_below h_at h_below) nogen + + /// copy baseline scores to round 2 + + foreach s in m h { + g `s'_theta1=`s'_theta_mle if round==1 + bys st_id: egen `s'_theta_mle1=min(`s'_theta1) + } + + /// copy terciles to round 2 + + foreach s in math hindi { + bys st_id: egen terc_`s'_1=min(terc_`s'1) + drop terc_`s'1 + } + *ajg: this won't be used until table a.3 + + /// drop baseline obs + + drop if round==1 + + /// save tempfile + + tempfile tfile2 + save `tfile2' + + /// run regressions + + reg m_at treat m_theta_mle1 if st_grade~=., robust + outreg2 using "$tables/table6.xls", noas replace label less(1) + + reg m_below_grade treat m_theta_mle1 if st_grade~=., robust + outreg2 using "$tables/table6.xls", noas append label less(1) + + reg h_at treat h_theta_mle1 if st_grade~=., robust + outreg2 using "$tables/table6.xls", noas append label less(1) + + reg h_below_g treat h_theta_mle1 if st_grade~=., robust + outreg2 using "$tables/table6.xls", noas append label less(1) + +/// table 7: treatment effect on school exams + + /// load school results + + use ${sc_clean}sc_results, clear + rename school schoolid + + /// keep 2015-2016 school year + + keep if year=="2015-16" + + /// group by school-by-class combination + + egen group=group(schoolid class) + + /// standardize scores within each class + + foreach s in math science social { + bys group: egen mean_`s'_c=mean(`s'_term2_sa2) if treat==0 + bys group: egen sd_`s'_c = sd(`s'_term2_sa2) if treat==0 + bys group: egen mean_`s' = min(mean_`s'_c) + bys group: egen sd_`s' = min(sd_`s'_c) + gen z_`s'=(`s'_term2_sa2 - mean_`s')/sd_`s' + } + + bys group: egen mean_hindi_c=mean(lang2_term2_sa2) if treat==0 + bys group: egen sd_hindi_c = sd(lang2_term2_sa2) if treat==0 + bys group: egen mean_hindi = min(mean_hindi_c) + bys group: egen sd_hindi = min(sd_hindi_c) + gen z_hindi=(lang2_term2_sa2 - mean_hindi)/sd_hindi + + bys group: egen mean_english_c=mean(lang1_term2_sa2) if treat==0 + bys group: egen sd_english_c = sd(lang1_term2_sa2) if treat==0 + bys group: egen mean_english = min(mean_english_c) + bys group: egen sd_english = min(sd_english_c) + gen z_english=(lang1_term2_sa2 - mean_english)/sd_english + + egen z_aggregate=rowmean(z_math z_hindi z_science z_social z_english) + + /// drop students without treatment group + + drop if treat==. + + /// rename child id + +// ren childid st_id + + /// keep key vars + + keep st_id-schoolid z_* finalresult group + + /// merge with j-pal data wide + + mer 1:m st_id using ${el_clean}ms_blel_jpal_wide + + /// save tempfile + + tempfile tfile3 + save `tfile3' + + /// run regressions + + xtreg z_hindi treat h_theta_mle1 i.schoolid i.class_m, i(strata) fe robust + outreg2 using "$tables/table7.xls", label dec(3) /// + replace keep(treat h_theta_mle1) noaster + + xtreg z_math treat m_theta_mle1 i.schoolid i.class_m, i(strata) fe robust + outreg2 using "$tables/table7.xls", label dec(3) /// + append keep(treat m_theta_mle1) noaster + + xtreg z_science treat m_theta_mle1 h_theta_mle1 i.schoolid i.class_m, i(strata) fe robust + outreg2 using "$tables/table7.xls", label dec(3) /// + append keep(treat h_theta_mle1 m_theta_mle1) noaster + + xtreg z_social treat m_theta_mle1 h_theta_mle1 i.schoolid i.class_m, i(strata) fe robust + outreg2 using "$tables/table7.xls", label dec(3) /// + append keep(treat h_theta_mle1 m_theta_mle1) noaster + + xtreg z_english treat m_theta_mle1 h_theta_mle1 i.schoolid i.class_m, i(strata) fe robust + outreg2 using "$tables/table7.xls", label dec(3) /// + append keep(treat h_theta_mle1 m_theta_mle1) noaster + + xtreg z_aggregate treat m_theta_mle1 h_theta_mle1 i.schoolid i.class_m, i(strata) fe robust + outreg2 using "$tables/table7.xls", label dec(3) /// + append keep(treat h_theta_mle1 m_theta_mle1) noaster + +/// table 8: heterogeneous effects on school tests, by terciles of baseline achievement + + /// load previously-saved temp dataset + + use `tfile3', clear + + /// gen tercile dummies + + tab terc_math, gen(d_m_terc) + tab terc_hind, gen(d_h_terc) + + /// gen and label interactions with treat dummies + + forval i = 1/3{ + foreach j in m h { + gen terc_t`i'`j' = d_`j'_terc`i'*treat + } + lab var terc_t`i'm "Treatment*Tercile `i' (Math)" + lab var terc_t`i'h "Treatment*Tercile `i' (Hindi)" + } + + /// run regressions + + xtreg z_hindi treat terc_t2h terc_t3h d_h_terc2 /// + d_h_terc3 h_theta_mle1 i.schoolid i.class_, i(strata) fe robust + outreg2 using "$tables/table8.xls", label less(1) replace keep(treat terc_t2h terc_t3h d_h_terc2 /// + d_h_terc3 h_theta_mle1) noaster + + test treat=0 + test treat + terc_t2h=0 + test treat + terc_t3h=0 + + xtreg z_math treat terc_t2m terc_t3m d_m_terc2 /// + d_m_terc3 m_theta_mle1 i.schoolid i.class_, i(strata) fe robust + outreg2 using "$tables/table8.xls", label less(1) append keep(treat terc_t2m terc_t3m d_m_terc2 /// + d_m_terc3 m_theta_mle1) noaster + + test treat = 0 + test treat + terc_t2m=0 + test treat + terc_t3m=0 + + xtreg z_science treat terc_t2h terc_t3h d_h_terc2 /// + d_h_terc3 h_theta_mle1 m_theta_mle1 i.schoolid i.class_, i(strata) fe robust + outreg2 using "$tables/table8.xls", label less(1) append keep(treat terc_t2h terc_t3h d_h_terc2 /// + d_h_terc3 h_theta_mle1 m_theta_mle1) noaster + test treat=0 + test treat + terc_t2h=0 + test treat + terc_t3h=0 + + xtreg z_social treat terc_t2h terc_t3h d_h_terc2 /// + d_h_terc3 h_theta_mle1 m_theta_mle1 i.schoolid i.class_, i(strata) fe robust + outreg2 using "$tables/table8.xls", label less(1) append keep(treat terc_t2h terc_t3h d_h_terc2 /// + d_h_terc3 h_theta_mle1 m_theta_mle1) noaster + test treat=0 + test treat + terc_t2h=0 + test treat + terc_t3h=0 + + xtreg z_eng treat terc_t2h terc_t3h d_h_terc2 /// + d_h_terc3 h_theta_mle1 m_theta_mle1 i.schoolid i.class_, i(strata) fe robust + outreg2 using "$tables/table8.xls", label less(1) append keep(treat terc_t2h terc_t3h d_h_terc2 /// + d_h_terc3 h_theta_mle1 m_theta_mle1) noaster + test treat=0 + test treat + terc_t2h=0 + test treat + terc_t3h=0 + + + xtreg z_aggreg treat terc_t2h terc_t3h d_h_terc2 /// + d_h_terc3 h_theta_mle1 m_theta_mle1 i.schoolid i.class_, i(strata) fe robust + outreg2 using "$tables/table8.xls", label less(1) append keep(treat terc_t2h terc_t3h d_h_terc2 /// + d_h_terc3 h_theta_mle1 m_theta_mle1) noaster + test treat + terc_t2h=0 + test treat + terc_t3h=0 + +/// table 9: dose-response of mindspark attendance + + /// load sgi data + + use ${ms_clean}ms_ei, clear + + /// drop duplicates + + duplicates drop st_id, force + /* ajg: multiple obs per st_id due to individual attendance data, + dropping here because i only need aggregate attendance data */ + + /// keep key vars + + keep st_id att_tot + + /// merge with j-pal data wide + + mer 1:1 st_id using ${el_clean}ms_blel_jpal_wide + + /// impute 0 attendance for control children + + replace att_tot=0 if treat==0 + + /// save tempfile + + tempfile tfile4 + save `tfile4' + + /// run regressions + + xtivreg2 m_theta_mle2 (att_tot=treat) m_theta_mle1, robust /// + i(strata) fe endog(att_tot) + outreg2 using ${tables}table9.xls, label less(1) /// + replace adds(Angrist-Pischke F-statistic for weak instrument, /// + e(widstat), Difference-in-Sargan statistic for exogeneity /// + (p-value), e(estat p)) noaster + + xtivreg2 h_theta_mle2 (att_tot=treat) h_theta_mle1, robust /// + i(strata) fe endog(att_tot) + outreg2 using ${tables}table9.xls, label less(1) append /// + adds(Angrist-Pischke F-statistic for weak instrument, /// + e(widstat), Difference-in-Sargan statistic for exogeneity /// + (p-value), e(estat p)) noaster + + reg m_theta_mle2 att_tot m_theta_mle1, robust + outreg2 using ${tables}table9.xls, label less(1) append noaster + + reg h_theta_mle2 att_tot h_theta_mle1, robust + outreg2 using ${tables}table9.xls, label less(1) append noaster + + reg m_theta_mle2 att_tot m_theta_mle1 if treat==1, robust + outreg2 using ${tables}table9.xls, label less(1) append noaster + + reg h_theta_mle2 att_tot h_theta_mle1 if treat==1, robust + outreg2 using ${tables}table9.xls, label less(1) append noaster + +/// table a.1: comparing pre-program achievement of study participants and non-participants + + /// load school results + + use ${sc_clean}sc_results, clear + + /// gen dummy for non-rct students + + g nonrct=(treat==.) + + /// keep 2014-2015 school year + + keep if year=="2014-15" + + /// group by school-by-class combination + + egen group=group(school class) + + /// standardize scores within each class + + foreach s in math science social { + bys group: egen mean_`s'_c=mean(`s'_ovrall_tot) + bys group: egen sd_`s'_c = sd(`s'_ovrall_tot) + bys group: egen mean_`s' = min(mean_`s'_c) + bys group: egen sd_`s' = min(sd_`s'_c) + gen z_`s'=(`s'_ovrall_tot - mean_`s')/sd_`s' + } + + bys group: egen mean_hindi_c=mean(lang2_ovrall_tot) + bys group: egen sd_hindi_c = sd(lang2_ovrall_tot) + bys group: egen mean_hindi = min(mean_hindi_c) + bys group: egen sd_hindi = min(sd_hindi_c) + gen z_hindi=(lang2_ovrall_tot - mean_hindi)/sd_hindi + + bys group: egen mean_english_c=mean(lang1_ovrall_tot) + bys group: egen sd_english_c = sd(lang1_ovrall_tot) + bys group: egen mean_english = min(mean_english_c) + bys group: egen sd_english = min(sd_english_c) + gen z_english=(lang1_ovrall_tot - mean_english)/sd_english + + egen z_aggregate=rowmean(z_math z_hindi z_science z_social z_english) + + estpost ttest z_math z_hindi z_science z_social z_english, by(nonrct) + esttab . using "$tables/tablea1.csv", nostar replace wide /// + cells(" mu_1 (fmt(2)) mu_2 (fmt(2)) b(fmt(2)) se(fmt(2)) N_1(fmt(0)) N_2(fmt(0))") + +/// table a.2: itt estimates with within-grade normalized test scores + + /// load j-pal data long + + use ${el_clean}ms_blel_jpal_long, clear + + /// standardize scores within each grade + + foreach v of varlist m_theta_mle h_theta_mle { + gen sd_`v'=. + gen mean_`v'=. + forval i = 4/9{ + sum `v' if st_grade1==`i' & round==1 + gen sd_`v'_`i'=r(sd) + gen mean_`v'_`i'=r(mean) + replace sd_`v' = sd_`v'_`i' if st_grade1==`i' + replace mean_`v' = mean_`v'_`i' if st_grade1==`i' + } + replace `v'=((`v'-mean_`v')/sd_`v') + drop mean_`v' sd_`v' + } + + /// keep key vars + + keep st_female1 ses_index h_theta* m_theta* quint* terc* per* /// + st_tui_math st_tui_hindi st_tui_other st_tui_math_hrs st_id /// + round treat strata + + /// reshape wide + + reshape wide h_theta* m_theta* quint* terc* per* /// + st_tui_math st_tui_hindi st_tui_other st_tui_math_hrs, /// + i(st_id) j(round) + + /// drop unnecessary vars + + drop terc_math12 terc_hindi12 quint_math12 quint_hindi12 + + /// relabel vars + + lab var m_theta_mle1 "Baseline math score" + lab var h_theta_mle1 "Baseline Hindi score" + lab var m_theta_mle2 "Endline math score" + lab var h_theta_mle2 "Endline Hindi score" + + /// run regressions + + reg m_theta_mle2 treat m_theta_mle1, robust + outreg2 using ${tables}tablea2.xls, label less(1) replace noaster + + reg h_theta_mle2 treat h_theta_mle1, robust + outreg2 using ${tables}tablea2.xls, label less(1) append noaster + + xtreg m_theta_mle2 treat m_theta_mle1, robust i(strata) fe + outreg2 using ${tables}tablea2.xls, label less(1) append noaster + + xtreg h_theta_mle2 treat h_theta_mle1, robust i(strata) fe + outreg2 using ${tables}tablea2.xls, label less(1) append noaster + + + +/// table a.3: heterogeneous effects on independent tests, by terciles of baseline achievement + + /// load previously-saved temp dataset + + use `tfile2', clear + + /// gen tercile dummies + + tab terc_math, gen(d_m_terc) + tab terc_hind,gen(d_h_terc) + + /// gen and label interactions with treat dummies + + forval i = 1/3{ + foreach j in m h { + gen terc_t`i'`j' = d_`j'_terc`i'*treat + } + lab var terc_t`i'm "Treatment*Tercile `i' (Math)" + lab var terc_t`i'h "Treatment*Tercile `i' (Hindi)" + } + + /// run regressions + + reg m_at treat terc_t2m terc_t3m d_m_terc2 /// + d_m_terc3 m_theta_mle1 if st_grade~=., robust + outreg2 using "$tables/tablea3.xls", label less(1) replace noaster + test treat=0 + test treat + terc_t2m=0 + test treat + terc_t3m=0 + + reg m_below_grade treat terc_t2m terc_t3m d_m_terc2 /// + d_m_terc3 m_theta_mle1 if st_grade~=., robust + outreg2 using "$tables/tablea3.xls", label less(1) append noaster + test treat=0 + test treat + terc_t2m=0 + test treat + terc_t3m=0 + + reg h_at treat terc_t2h terc_t3h d_h_terc2 /// + d_h_terc3 h_theta_mle1 if st_grade~=., robust + outreg2 using "$tables/tablea3.xls", label less(1) append noaster + test treat=0 + test treat + terc_t2h=0 + test treat + terc_t3h=0 + + reg h_below treat terc_t2h terc_t3h d_h_terc2 /// + d_h_terc3 h_theta_mle1 if st_grade~=., robust + outreg2 using "$tables/tablea3.xls", label less(1) append noaster + test treat=0 + test treat + terc_t2h=0 + test treat + terc_t3h=0 + +/// table a.4: correlates of attendance + + /// load previously-saved temp dataset + + use `tfile4', clear + + /// run regressions + + reg att_tot st_female1 ses_index if treat==1, robust + outreg2 using ${tables}tablea4.xls, label less(1) replace noaster + + reg att_tot st_female1 ses_index m_theta_mle1 h_theta_mle1 /// + if treat==1, robust + outreg2 using ${tables}tablea4.xls, label less(1) append noaster + + reg att_tot st_female1 ses_index st_tui_math1 st_tui_hindi1 /// + m_theta_mle1 h_theta_mle1 if treat==1, robust + outreg2 using ${tables}tablea4.xls, label less(1) append noaster + + areg att_tot st_female1 ses_index st_tui_math1 st_tui_hindi1 /// + m_theta_mle1 h_theta_mle1 if treat==1, robust absorb(st_grade1) + outreg2 using ${tables}tablea4.xls, label less(1) append noaster + +/// table a.5: quadratic dose-response relationship + + /// gen and label attendance squared + + replace att_tot=0 if treat==0 + gen att_sq = att_tot^2 + lab var att_sq "Attendance squared" + + /// run regressions + + reg m_theta_mle2 att_tot att_sq m_theta_mle1, robust + outreg2 using ${tables}tablea5.xls, label less(1) replace noaster + + reg h_theta_mle2 att_tot att_sq h_theta_mle1, robust + outreg2 using ${tables}tablea5.xls, label less(1) append noaster + + reg m_theta_mle2 att_tot att_sq m_theta_mle1 if treat==1, robust + outreg2 using ${tables}tablea5.xls, label less(1) append noaster + + reg h_theta_mle2 att_tot att_sq h_theta_mle1 if treat==1, robust + outreg2 using ${tables}tablea5.xls, label less(1) append noaster + +/// table a.6: dose-response of subject-specific mindspark attendance + + /// load sgi data + + use ${ms_clean}ms_ei, clear + + /// gen mean attendance by date + +// bys date: egen mean_attend=mean(present) + + /// drop dates in which everyone was absent + + drop if mean==. + + /// drop duplicates + +// duplicates drop st_id, force + /* ajg: multiple obs per st_id due to individual attendance data, + dropping here because i only need aggregate attendance data */ + + /// keep key vars + +// keep ms_center att_tot* st_id att_per /// +// sgi_att_mat_tot sgi_att_hin_tot + + /// save tempfile + + tempfile tfile5 + save `tfile5' + + /// merge w/cal data + +// mer 1:1 st_id using ${ms_clean}ms_ei_cal + *ajg: 46 not matched (0 from using) +// tab att_tot if _m!=3 +// ajg: these are students with little or no attendance + + /// replace cal attendance data for these students + +// foreach v in cal_att_mat_tot cal_att_hin_tot { +// replace `v'=0 if _m!=3 +// } +// drop _m + + /// save tempfile + + tempfile tfile6 + save `tfile6' + + /// merge w/jpal data + + mer 1:1 st_id using ${el_clean}ms_blel_jpal_wide, nogen + *ajg 306 not matched (all from using) -- control students + + /// replace attendance for controls + + replace att_tot=0 if treat==0 + + /// gen days of instruction by subject + + g att_mat_tot = (cal_att_mat_tot+sgi_att_mat_tot)/2 + g att_hin_tot = (cal_att_hin_tot+sgi_att_hin_tot)/2 + + replace att_mat_tot=0 if treat==0 + replace att_hin_tot=0 if treat==0 + + /* ajg: a math/hindi day is a full instruction session across cal+sgi. + the sum of these is ~25% lower than days attended due to scheduled + instruction in english, value education, parent-teacher mtgs., etc. */ + + lab var att_mat_tot "Days of math instruction" + lab var att_hin_tot "Days of Hindi instruction" + + /// run regressions + xtivreg2 m_theta_mle2 (att_mat_tot=treat) m_theta_mle1, /// + robust i(strata) fe endog(att_mat_tot) + + outreg2 using ${tables}tablea6.xls, label less(1) replace noaster /// + adds(Angrist-Pischke F-statistic for weak instrument, /// + e(widstat), Difference-in-Sargan statistic for exogeneity (p-value), /// + e(estat p)) + + xtivreg2 h_theta_mle2 (att_hin_tot=treat) h_theta_mle1, /// + robust i(strata) fe endog(att_hin_tot) + + outreg2 using ${tables}tablea6.xls, label less(1) append noaster /// + adds(Angrist-Pischke F-statistic for weak instrument, /// + e(widstat), Difference-in-Sargan statistic for exogeneity (p-value), /// + e(estat p)) + + reg m_theta_mle2 att_mat_tot m_theta_mle1, robust + outreg2 using ${tables}tablea6.xls, label less(1) append noaster + + reg h_theta_mle2 att_hin_tot h_theta_mle1, robust + outreg2 using ${tables}tablea6.xls, label less(1) append noaster + + reg m_theta_mle2 att_mat_tot m_theta_mle1 if treat==1, robust + outreg2 using ${tables}tablea6.xls, label less(1) append noaster + + reg h_theta_mle2 att_hin_tot h_theta_mle1 if treat==1, robust + outreg2 using ${tables}tablea6.xls, label less(1) append noaster + +/// table a.7: itt estimates with inverse probability weighting + + /// load j-pal data long + + use ${el_clean}ms_blel_jpal_wide, clear + + /// gen dummy for having scores at bl and el + + gen in_el=(m_theta_mle2!=. & h_theta_mle2!=.) + lab var in_el "In endline" + + /// gen center fe + + egen ms_center_d=group(ms_center1) + + /// run regressions + + reg in_el st_fe ses_index m_theta_mle1 h_theta_mle1 i.ms_center_d + + probit in_el st_fe ses_index m_theta_mle1 h_theta_mle1 /// + i.ms_center_d, robust + predict prob + gen inv_prob=1/prob + + reg m_theta_mle2 treat m_theta_mle1 [pw=inv_prob], robust + outreg2 using ${tables}tablea7.xls, label less(1) replace noaster + + reg h_theta_mle2 treat h_theta_mle1 [pw=inv_prob], robust + outreg2 using ${tables}tablea7.xls, label less(1) append noaster + + areg m_theta_mle2 treat m_theta_mle1 [pw=inv_prob], robust /// + absorb(strata) + outreg2 using ${tables}tablea7.xls, label less(1) append noaster + + areg h_theta_mle2 treat h_theta_mle1 [pw=inv_prob], robust /// + absorb(strata) + outreg2 using ${tables}tablea7.xls, label less(1) append noaster + +/// table a.8: lee bounds estimates of ITT effects + + /// run regressions + + reg m_theta_mle2 m_theta_mle1, robust + predict m_res, res + leebounds m_res treat,vce(analytic) tight(ms_center1) cie + outreg2 using ${tables}table8.xsls, label less(1) noaster + + reg h_theta_mle2 h_theta_mle1, robust + predict h_res, res + leebounds h_res treat,vce(analytic) tight(ms_center1) cie +exit + +/// table a.9: itt estimates, by source of test item + + /// load j-pal data long + + use ${el_clean}ms_blel_jpal_long, clear + + /// merge with % correct data + + merge 1:1 st_id round using ${el_clean}ms_blel_forirt, keep(master /// + match) keepus(math_ei math_nonei hindi_ei hindi_nonei) nogen + + /// copy baseline scores to round 2 + + foreach s in m h { + g `s'_theta1=`s'_theta_mle if round==1 + bys st_id: egen `s'_theta_mle1=min(`s'_theta1) + } + + /// drop baseline obs + + drop if round==1 + + /// run regressions + + xtreg math_ei treat m_theta_mle1, robust i(strata) fe + outreg2 using ${tables}tablea9.xls, label less(1) replace noaster + + xtreg math_nonei treat m_theta_mle1, robust i(strata) fe + outreg2 using ${tables}tablea9.xls, label less(1) append noaster + + xtreg hindi_ei treat h_theta_mle1, robust i(strata) fe + outreg2 using ${tables}tablea9.xls, label less(1) append noaster + + xtreg hindi_nonei treat h_theta_mle1, robust i(strata) fe + outreg2 using ${tables}tablea9.xls, label less(1) append noaster + +/// table a.10: average itt effects on take-up of private tutoring + + /// load hh survey data + + use ${hh_clean}hh_survey, clear + + /// reshape long + + reshape long math_ hindi_ english_ science_ soc_sci_, i(st_id) j(month) + + /// drop empty obs + + drop if math_==. + + /// gen post-treat interaction + + gen post=month>3 & month~=. + gen post_treat=post*treat + + /// group student ids + + egen id=group(st_id) + + /// run regressions + + xtreg math_ post post_treat, i(id) fe robust + outreg2 using "$tables/tablea10.xls", label less(1) replace noaster + + xtreg hindi_ post post_treat, i(id) fe robust + outreg2 using "$tables/tablea10.xls", label less(1) append noaster + + xtreg english_ post post_treat, i(id) fe robust + outreg2 using "$tables/tablea10.xls", label less(1) append noaster + + xtreg science_ post post_treat, i(id) fe robust + outreg2 using "$tables/tablea10.xls", label less(1) append noaster + + xtreg soc_sci_ post post_treat, i(id) fe robust + outreg2 using "$tables/tablea10.xls", label less(1) append noaster + +} +// ****************** GENERATE GRAPHS ****************** // + +if $gengraphs==1 { + +/// fig 1: assessed levels of student achievement vs. current grade enrolled in school + + /// load ms levels data + + use ${ms_clean}ms_levels, clear + + /// plot math graph + + graph twoway (scatter mathlevel class, mcolor(gray*0.8) /// + msymbol(circle_hollow) msize(small) jitter(3)) /// + (lfitci mathlevel class, clcolor(red) lcolor(red) /// + clwidth(medthick)ciplot(rline) clpattern(solid) lpattern(dash) /// + lwidth(thin)) (function y=x, range(5.5 9.5) lcolor(navy)) /// + if class>5, xtitle (Grade enrolled in) /// + ytitle(Assessed level of student achievement) /// + title(Math) graphregion(fcolor(white) lcolor(white)) /// + legend(order(3 "Linear fit" 4 "Line of equality")) /// + name(base_actual_m, replace) + + /// plot hindi graph + + graph twoway (scatter hindilevel class, mcolor(gray*0.8) /// + msymbol(circle_hollow) msize(small) jitter(3)) /// + (lfitci hindilevel class, clcolor(red) lcolor(red) /// + clwidth(medthick)ciplot(rline) clpattern(solid) lpattern(dash) /// + lwidth(thin)) (function y=x, range(5.5 9.5) lcolor(navy)) /// + if class>5, xtitle(Grade enrolled in) /// + ytitle(Assessed level of student achievement) /// + title(Hindi) graphregion(fcolor(white) lcolor(white)) /// + legend(order(3 "Linear fit" 4 "Line of equality")) /// + name(base_actual_h, replace) + + /// combine graphs + + grc1leg base_actual_m base_actual_h, leg(base_actual_m) /// + xcommon ycommon graphregion(fcolor(white) lcolor(white)) + + /// export + + gr export ${graphs}fig1.png, replace as(png) + +/// fig 2: mean difference in test scores between lottery winners and losers + + /// load j-pal data long + + use ${el_clean}ms_blel_jpal_long, clear + + /// math + + cibar m_theta_mle, over1(treat) over2(round) barlabel(on) /// + blsize(small) gap(10) barcol(gs12 dknavy) /// + graphop(title("Mathematics") ytitle(Score) note("") /// + yscale(range(-0.1 0.8)) graphregion(fcolor(white) lcolor(white)) /// + legend(order(1 "Control" 2 "Treatment")) name(fig2a,replace)) + + /// hindi + + cibar h_theta_mle, over1(treat) over2(round) barlabel(on) /// + blsize(small) gap(10) barcol(gs12 dknavy) /// + graphop(title("Hindi") ytitle(Score) note("") /// + yscale(range(-0.1 0.6)) graphregion(fcolor(white) lcolor(white)) /// + legend(order(1 "Control" 2 "Treatment")) name(fig2b,replace)) + + /// combine graphs + + grc1leg fig2a fig2b, /// + leg(fig2a) xcommon ycommon /// + graphregion(fcolor(white) lcolor(white)) name(fig2, replace) + gr export ${graphs}fig2.png, replace as(png) + +/// fig 3: non-parametric investigation of treatment effects by baseline percentiles + + /// load j-pal data wide + + use ${el_clean}ms_blel_jpal_wide, clear + + /// gen baseline percentiles + + xtile perc_m=m_theta_mle1, nq(100) + xtile perc_h=h_theta_mle1, nq(100) + + /// math + + graph twoway (lpolyci m_theta_mle2 perc_m if treat==0, /// + bwidth(10) lcolor(red) clcolor(red) clwidth(medthick)ciplot(rline) /// + clpattern(longdash) lpattern(dash) lwidth(thin)) (lpolyci /// + m_theta_mle2 perc_m if treat==1, bwidth(10) lcolor(blue) clcolor(blue) /// + clwidth(medthick)ciplot(rline) clpattern(solid) lpattern(dash) /// + lwidth(thin)), ytitle("Endline test score (SD)") /// + xtitle("Percentile on baseline test") legend (order(2 "Control" /// + 4 "Treatment")) title("Mathematics") graphregion(fcolor(white) /// + lcolor(white)) name(fig3a,replace) + + /// hindi + + graph twoway (lpolyci h_theta_mle2 perc_h if treat==0, /// + bwidth(10) lcolor(red) clcolor(red) clwidth(medthick)ciplot(rline) /// + clpattern(longdash) lpattern(dash) lwidth(thin)) (lpolyci /// + h_theta_mle2 perc_h if treat==1, bwidth(10) lcolor(blue) clcolor(blue) /// + clwidth(medthick)ciplot(rline) clpattern(solid) lpattern(dash) /// + lwidth(thin)), ytitle("Endline test score (SD)") /// + xtitle("Percentile on baseline test") legend (order(2 "Control" 4 /// + "Treatment")) title("Hindi") graphregion(fcolor(white) /// + lcolor(white)) name(fig3b,replace) + + /// combine graphs + + grc1leg fig3a fig3b, leg(fig3a) xcommon ycommon /// + graphregion(fcolor(white) lcolor(white)) + gr export ${graphs}fig3.png, replace as(png) + +/// fig 4: growth in achievement in treatment and control groups + + /// load j-pal data wide + + use ${el_clean}ms_blel_jpal_wide, clear + + /// gen tercile dummies + + tab terc_math, gen(d_m_terc) + tab terc_hind,gen(d_h_terc) + + /// run regressions + + reg m_theta_mle2 d_m_terc* m_theta_mle1 if treat==0 & st_grade1>5, /// + nocons robust + est store control_ter_m + + reg m_theta_mle2 d_m_terc* m_theta_mle1 if treat==1 & st_grade1>5, /// + nocons robust + est store treat_ter_m + + reg h_theta_mle2 d_h_terc* h_theta_mle1 if treat==0 & st_grade1>5, /// + nocons robust + est store control_ter_h + + reg h_theta_mle2 d_h_terc* h_theta_mle1 if treat==1 & st_grade1>5, /// + nocons robust + est store treat_ter_h + + /// plot fig 4a + + coefplot (control_ter_m, label(Control) mcolor(red) /// + ciopts( lcolor(red) recast(rcap))) /// + (treat_ter_m, label(Treatment) msymbol(D) mcolor(blue) /// + ciopts(lcolor(blue) recast(rcap))), vertical drop(m_theta_mle1) /// + yline(0) xtitle(Terciles) /// + ytitle(Residualized scores) xlabel(1 "Bottom" 2 "Middle" 3 "Top") /// + title("Math") graphregion(fcolor(white) lcolor(white)) /// + name(ter_m2,replace) + + /// plot fig 4b + + coefplot (control_ter_h, label(Control) mcolor(red) /// + ciopts( lcolor(red) recast(rcap))) (treat_ter_h, label(Treatment) /// + mcolor(blue) msymbol(D) ciopts( lcolor(blue) recast(rcap))), vertical /// + drop(h_theta_mle1) yline(0) xtitle(Terciles) ciopts( recast(rcap)) /// + ytitle(Residualized scores) xlabel(1 "Bottom" 2 "Middle" 3 "Top") /// + title("Hindi") graphregion(fcolor(white) lcolor(white)) /// + name(ter_h2,replace) + + /// combine graphs + + grc1leg ter_m2 ter_h2 , ycommon graphregion(fcolor(white) lcolor(white)) + gr save ${graphs}fig4.gph, replace + gr export ${graphs}fig4.png, replace as(png) + + +/// fig 5: dose-response relationship + + /// load sgi data + + use ${ms_clean}ms_ei, clear + + /// drop duplicates + + duplicates drop st_id, force + + /// merge w/j-pal data wide + + mer 1:1 st_id using ${el_clean}ms_blel_jpal_wide, nogen + + /// replace attendance for controls + + replace att_tot=0 if treat==0 + + /// plot math graph + + cmogram m_theta_mle2 att_tot if treat==1, lfitci scatter /// + histopts(width(10)) lowess controls(m_theta_mle1) legend /// + graphopts(legend(label(1 "Binned mean") label(3 "Linear fit") /// + label(2 "95% CI") label(4 "Lowess")) /// + ytitle("Residualized test scores") title(Math) xtitle("Attendance (days)")) lowopt(bwidth(10) /// + lcolor(navy) lpattern(dash) lwidth(medthick)) + graph save ${graphs}fig5a.gph, replace + + /// plot hindi graph + + cmogram h_theta_mle2 att_tot if treat==1, lfitci scatter /// + histopts(width(10)) lowess controls(h_theta_mle1) legend /// + graphopts(legend(label(1 "Binned mean") label(3 "Linear fit") /// + label(2 "95% CI") label(4 "Lowess")) /// + ytitle("Residualized test scores") title(Hindi) xtitle("Attendance (days)")) /// + rcapopt(clpattern(dash) clwidth(thin)) lowopt(bwidth(10) /// + lcolor(navy) lpattern(dash) lwidth(medthick)) + gr save ${graphs}fig5b.gph, replace + + /// combine graphs + + grc1leg ${graphs}fig5a.gph ${graphs}fig5b.gph, xcommon /// + graphregion(fcolor(white) lcolor(white)) leg(${graphs}fig5a.gph) + gr export ${graphs}fig5.png, replace as(png) + +/// fig 6: precise customization of instruction by the mindspark cal program +/// fig 7: dynamic updating and individualization of content in Mindspark + + *ajg: doing these two figures together bc they draw on the same data + + /// load ms levels data + + use ${ms_clean}ms_levels, clear + + /// drop duplicates + + duplicates drop st_id, force + + /// merge with ms roster + +// mer 1:1 st_id using ${ms_clean}ms_roster, nogen keep(match) + + /// merge with ms math questions + + mer 1:m st_id using ${ms_clean}ms_mathqs, nogen keep(match) + + /// gen ms levels + + gen ms_q_level=1 if q_grade=="1" + + forval i = 2/8{ + replace ms_q_level = `i' if q_grade=="`i'" + } + + forval i=1/8{ + local j = `i'+ 1 + replace ms_q_level = (`i' + `j')/2 if q_grade=="`i',`j'" + } + + replace ms_q_ =2 if q_grade=="1,2,3" + replace ms_q_ =7 if q_grade=="6,7,8" + + /// re-label mathlevel + + lab var mathlevel "Math level assessed by CAL system at baseline" + + /// plot fig 6a + + twoway (scatter ms_q_le mathlevel, jitter(2) msize(tiny)) if /// + (q_date==20395) & class>5, /// + by(class, note(" ") title(Math) /// + graphregion(fcolor(white) lcolor(white))) /// + ytitle(Grade level of question administered by CAL) /// + xlabel(1 2 3 4 5 6 7 8) name(tiger_paws_m, replace) + + /// plot fig 7a + + graph twoway (lpolyci ms_q_ q_date if class==6, lcolor(red) /// + clcolor(red) clwidth(medthick)ciplot(rline) clpattern(solid) /// + lpattern(dash) lwidth(thin)) (lpolyci ms_q_ q_date if class==7, /// + lcolor(blue) clcolor(blue) clwidth(medthick)ciplot(rline) /// + clpattern(solid) lpattern(longdash) lwidth(thin)) (lpolyci ms_q_ /// + q_date if class==8, lcolor(green) clcolor(green) /// + clwidth(medthick)ciplot(rline) clpattern(solid) lpattern(shortdash) /// + lwidth(thin)) (lpolyci ms_q_ q_date if class==9, lcolor(black) /// + clcolor(black) clwidth(medthick)ciplot(rline) clpattern(solid) /// + lpattern(solid) lwidth(thin)) if q_date>20392 & q_date<20511, /// + legend(order(2 "Grade 6" 4 "Grade 7" 6 "Grade 8" 8 "Grade 9")) /// + xtitle(Date) xlabe(20393 "Nov 1" 20422 "Dec 1" 20454 "Jan1" /// + 20485 "Feb 1") graphregion(fcolor(white) lcolor(white)) /// + ytitle(Grade level of question administered by CAL) /// + title("Enrolled Grade") /// + name(ei_grade, replace) + + /// plot fig 7b + + graph twoway (lpolyci ms_q_ q_date if mathlevel==2, lcolor(red) /// + clcolor(red) clwidth(medthick)ciplot(rline) clpattern(dash) /// + lpattern(dash) lwidth(thin)) (lpolyci ms_q_ q_date if mathlevel==3, /// + lcolor(blue) clcolor(blue) clwidth(medthick)ciplot(rline) /// + clpattern(longdash) lpattern(longdash) lwidth(thin)) (lpolyci ms_q_ /// + q_date if mathlevel==4, lcolor(green) clcolor(green) /// + clwidth(medthick)ciplot(rline) clpattern(shortdash) /// + lpattern(shortdash) lwidth(thin)) (lpolyci ms_q_ q_date if /// + mathlevel==5, lcolor(black) clcolor(black) /// + clwidth(medthick)ciplot(rline) clpattern(solid) lpattern(solid) /// + lwidth(thin)) (lpolyci ms_q_ q_date if mathlevel==6, lcolor(brown) /// + clcolor(brown) clwidth(medthick)ciplot(rline) clpattern(dash_dot) /// + lpattern(dash_dot) lwidth(thin)) if q_date>20392 & /// + q_date<20511, legend(order(2 "Grade 2" 4 "Grade 3" 6 "Grade 4" /// + 8 "Grade 5" 10 "Grade 6")) xtitle(Date) xlabe(20393 "Nov 1" 20422 /// + "Dec 1" 20454 "Jan1" 20485 "Feb 1") graphregion(fcolor(white) /// + lcolor(white)) ytitle(Grade level of question administered by CAL) /// + title("Baseline achievement level") /// + name(ei_actual, replace) + + /// combine fig7a & 7b + + graph combine ei_grade ei_actual, xcommon ycommon /// + graphregion(fcolor(white) lcolor(white)) /// + name(het_qdiff, replace) title(Math) + gr export ${graphs}fig7.png, replace as(png) + + /// load ms levels data + + use ${ms_clean}ms_levels, clear + + /// drop duplicates + + duplicates drop st_id, force + + /// merge with ms roster + +// mer 1:1 st_id using ${ms_clean}ms_roster, nogen keep(match) + + /// merge with ms hindi questions + + mer 1:m st_id using ${ms_clean}ms_hindiqs, nogen keep(match) + + /// gen ms levels + + destring q_grade, g(hindi_q_level) + + /// re-label hindilevel + + lab var hindilevel "Hindi level assessed by CAL system at baseline" + + /// format date of question being attempted + + format q_date %td + + /// plot fig 6b + + twoway (scatter hindi_q_level hindilevel, /// + yscale(range(1 9)) jitter(3) msize(tiny)) if /// + (q_date==20391) & class>5, /// + by(class, note(" ") title(Math) /// + graphregion(fcolor(white) lcolor(white))) /// + ytitle(Grade level of question administered by CAL) /// + xlabel(1 2 3 4 5 6 7 8 9) name(tiger_paws_h, replace) + + /// combine fig6a & 6b + + grc1leg tiger_paws_m tiger_paws_h, leg(tiger_paws_m) /// + xcommon ycommon graphregion(fcolor(white) lcolor(white)) + gr export ${graphs}fig6.png, replace as(png) + +/// fig a.1: comparing pre-program achievement of study participants and non-participants + + /// load school results + + use ${sc_clean}sc_results, clear + rename school schoolid + + /// gen dummy for rct students + + g rct=(treat!=.) + + /// keep 2014-2015 school year + + keep if year=="2014-15" + + /// group by school-by-class combination + + egen group=group(schoolid class) + + /// standardize scores within each class + + foreach s in math science social { + bys group: egen mean_`s'_c=mean(`s'_ovrall_tot) + bys group: egen sd_`s'_c = sd(`s'_ovrall_tot) + bys group: egen mean_`s' = min(mean_`s'_c) + bys group: egen sd_`s' = min(sd_`s'_c) + gen z_`s'=(`s'_ovrall_tot - mean_`s')/sd_`s' + } + + bys group: egen mean_hindi_c=mean(lang2_ovrall_tot) + bys group: egen sd_hindi_c = sd(lang2_ovrall_tot) + bys group: egen mean_hindi = min(mean_hindi_c) + bys group: egen sd_hindi = min(sd_hindi_c) + gen z_hindi=(lang2_ovrall_tot - mean_hindi)/sd_hindi + + bys group: egen mean_english_c=mean(lang1_ovrall_tot) + bys group: egen sd_english_c = sd(lang1_ovrall_tot) + bys group: egen mean_english = min(mean_english_c) + bys group: egen sd_english = min(sd_english_c) + gen z_english=(lang1_ovrall_tot - mean_english)/sd_english + + egen z_aggregate=rowmean(z_math z_hindi z_science z_social z_english) + + /// plot fig a1a + + graph twoway (kdensity z_math, lcolor(red)) /// + (kdensity z_math if rct==1, lcolor(blue)) /// + if year=="2014-15" & z_math>-6 & z_math<6 & class>5, /// + graphregion(fcolor(white) lcolor(white)) /// + legend(order(1 "All students" 2 "RCT")) xtitle(Standardized score) /// + ytitle(Density) title(Math) name(nonRCT_m, replace) + + /// plot fig a1b + + graph twoway (kdensity z_hindi, lcolor(red)) /// + (kdensity z_hindi if rct==1, lcolor(blue)) /// + if year=="2014-15" & z_hindi>-6 & z_hindi<6 & class>5, /// + graphregion(fcolor(white) lcolor(white)) /// + legend(order(1 "All students" 2 "RCT")) xtitle(Standardized score) /// + ytitle(Density) title(Hindi) name(nonRCT_h, replace) + + /// combine graphs + + grc1leg nonRCT_m nonRCT_h, leg(nonRCT_m) graphregion(fcolor(white) /// + lcolor(white)) note(403 study children matched to school records of 2014-15) + gr save ${graphs}figa1.gph, replace + gr export ${graphs}figa1.png, replace as(png) + +/// fig a.2: distribution of take-up among lottery-winners + + /// load sgi data + + use ${ms_clean}ms_ei, clear + + /// drop duplicates + + duplicates drop st_id, force + + /// plot graph + + hist att_tot, width(1) freq xtitle(Days attended) /// + name(attend, replace) graphregion(fcolor(white) lcolor(white)) + + /// save + + gr save attend ${graphs}figa2.gph, replace + gr export ${graphs}figa2.png, as(png) replace + +/// fig a.3: comparison of Mindspark initial assessment of grade-level of student achievement with (independent) baseline test scores + + /// load ms levels data + + use ${ms_clean}ms_levels, clear + + /// drop duplicates + + duplicates drop st_id, force + + /// merge w/j-pal data wide + + mer 1:1 st_id using ${el_clean}ms_blel_jpal_wide, nogen /// + keepus(m_theta_mle1 h_theta_mle1) keep(match) + + /// calculate mean performance by level + + tabstat m_theta_mle1,by(mathlevel) stat(mean n) + tabstat h_theta_mle1,by(hindilevel) stat(mean n) + + /// plot fig a3a + + cibar m_theta_mle1, over1(mathlevel) barlabel(on) /// + graphopts(graphregion(fcolor(white) lcolor(white)) name(math_bl,replace) legend(off) /// + xtitle("Assessed grade level of achievement") xlabel(1(1)8) /// + ytitle("Baseline test score (mean)") title("Math")) /// + barcolor(gs12 gs12 gs12 gs12 gs12 gs12 gs12 gs12) /// + ciopts(lcolor(black)) + + /// plot fig a3b + + cibar h_theta_mle1 , over1(hindilevel) barlabel(on) /// + graphopts(graphregion(fcolor(white) lcolor(white)) name(hindi_bl,replace) legend(off) /// + xtitle("Assessed grade level of achievement") xlabel(1(1)8) /// + ytitle("Baseline test score (mean)") title("Hindi")) /// + barcolor(gs12 gs12 gs12 gs12 gs12 gs12 gs12 gs12) /// + ciopts(lcolor(black)) + *ajg: this generates incorrect xlabels -- correct manually + + /// combine graphs + + gr combine math_bl hindi_bl, xcommon ycommon /// + graphregion(fcolor(white) lcolor(white)) + gr save ${graphs}figa3.gph, replace + gr export ${graphs}figa3.png, replace + +/// fig a.4: distribution of questions of ms software + + /// load ms levels data + + use ${ms_clean}ms_levels, clear + + /// drop duplicates + + duplicates drop st_id, force + + /// merge with ms math questions + + mer 1:m st_id using ${ms_clean}ms_mathqs, nogen keep(match) + + /// restrict to observations before feb 5, 2016 + *ajg: endline was administered on feb 7, 2016 + + keep if q_date<20490 + *ajg: 88,480 obs dropped + + /// gen ms levels + + gen ms_q_level=1 if q_grade=="1" + + forval i = 2/8{ + replace ms_q_level = `i' if q_grade=="`i'" + } + + forval i=1/8{ + local j = `i'+ 1 + replace ms_q_level = (`i' + `j')/2 if q_grade=="`i',`j'" + } + + replace ms_q_ =2 if q_grade=="1,2,3" + replace ms_q_ =7 if q_grade=="6,7,8" + + /// re-label mathlevel + + lab var mathlevel "Math level assessed by CAL system at baseline" + + /// gen question distribution + + forval i = 1(0.5)8 { + local k = `k'+1 + gen q_`k'=ms_q_l==`i' + lab var q_`k' "Diff level `i'" + } + + /// plot fig a5a + + hist ms_q if (class>5 & class<10), by(class, title(Math) /// + note(" ")graphregion(fcolor(white) lcolor(white)) ) /// + xlab(1(1)8) xtitle(Grade level of question administered) /// + percent name(figa5a, replace) + + /// save + + gr save ${graphs}figa4a.gph, replace + gr export ${graphs}figa4a.png, replace as(png) + + /// reload ms levels data + + use ${ms_clean}ms_levels, clear + + /// drop duplicates + + duplicates drop st_id, force + + /// merge with ms hindi questions + + mer 1:m st_id using ${ms_clean}ms_hindiqs, nogen keep(match) + + /// restrict to observations before feb 5, 2016 + *ajg: endline was administered on feb 7, 2016 + + keep if q_date<20490 + *ajg: 88,480 obs dropped + + /// gen ms levels + + destring q_grade, g(hindi_q_level) + + /// re-label hindilevel + + lab var hindilevel "Hindi level assessed by CAL system at baseline" + + /// format date of question being attempted + + format q_date %td + + /// plot graph + + hist hindi_q_level if (class>5 & class<10), by(class, title(Hindi) /// + note(" ")graphregion(fcolor(white) lcolor(white)) ) /// + xlab(1(1)8) xtitle(Grade level of question administered) /// + percent name(figa5b, replace) + + /// save + + gr save ${graphs}figa4b.gph, replace + gr export ${graphs}figa4b.png, replace as(png) + +/// fig a.5: composition of group instruction batches in mindspark centers + + /// load ms batch composition + + use ${ms_clean}ms_batches, clear + + /// plot fig a5a + + gr twoway (scatter grade group if rct=="RCT", /// + mcolor(red) msymbol(oh) jitter(2))(scatter grade group if rct!="RCT", /// + mcolor(blue) msymbol(dh) jitter(2)), legend(off) ytitle("Enrolled grade") /// + graphregion(fcolor(white) lcolor(white)) xtitle (Batch) /// + title("Dispersion in grade enrolled") /// + legend(order(1 "RCT" 2 "non-RCT")) name(figa5a,replace) + + /// plot fig a5b + + gr twoway (scatter math group if rct=="RCT", mcolor(red) msymbol(oh) /// + jitter(2))(scatter math group if rct!="RCT", mcolor(blue) msymbol(dh) /// + jitter(2)) if ms_id>8680, graphregion(fcolor(white) lcolor(white)) /// + legend(off) title("Dispersion in level of achievement") xtitle (Batch) /// + ytitle("Initial achievement level assessed by CAL system") /// + name(figa5b,replace) + *ajg: only plotting non-rct children enrolled in 2015 + grc1leg figa5a figa5b, xcommon ycommon leg(figa5a) /// + graphregion(fcolor(white) lcolor(white)) + + gr save ${graphs}figa5.gph, replace + gr export ${graphs}figa5.png, replace as(png) + + +/// fig e.1 distribution of raw percentage correct scores + use ${el_clean}ms_blel_jpal_long, clear + merge 1:1 st_id round using ${el_clean}ms_blel_forirt, keep(master match) + + sort st_id round + egen id=group(st_id round) + drop if round==. + + egen round_treat=group(round treat) + lab define round_treat 1 "Control BL" 2 "Treat BL" 3 "Control EL" 4 "Treat EL" + lab val round_treat round_treat + tempfile main + save `main' + + * Proportion correct + egen rawsc_math=rowtotal(cm*) + egen rawsc_hindi=rowtotal(ch*) + + gen prop_m=rawsc_m/35 if round==2 & st_grade>7 & st_grade~=. + replace prop_m=rawsc_m/34 if round==2 & st_grade<8 + replace prop_m=rawsc_m/35 if round==1 + + gen prop_h=rawsc_h/30 + + graph twoway (kdensity prop_m if round==1, lcolor(red)) /// + (kdensity prop_m if round==2, lcolor(blue)), title(Math) ytitle(Density) /// + xtitle("Proportion Correct") graphregion(fcolor(white) lcolor(white)) /// + legend(order(1 "Baseline" 2 "Endline")) name(math_raw,replace) + + graph twoway (kdensity prop_h if round==1, lcolor(red)) /// + (kdensity prop_h if round==2, lcolor(blue)), title(Hindi) ytitle(Density) /// + xtitle("Proportion Correct") graphregion(fcolor(white) lcolor(white)) /// + legend(order(1 "Baseline" 2 "Endline")) name(hindi_raw,replace) + + grc1leg math_raw hindi_raw, xcommon ycommon leg(math_raw) graphregion(fcolor(white) lcolor(white)) + gr save ${graphs}fige1.gph, replace + gr export ${graphs}fige1.png, replace as(png) + +/// fig e2: distribution of IRT scores + + graph twoway (kdensity m_theta_mle if treat==0,lcolor(red)) /// + (kdensity m_theta_mle if treat==1,lcolor(blue)) if round==1, /// + title(Math) subtitle(Baseline) ytitle(Density) xtitle(IRT score) /// + graphregion(fcolor(white) lcolor(white)) /// + legend(order(1 "Control" 2 "Treatment")) name(m_bl,replace) + + graph twoway (kdensity m_theta_mle if treat==0,lcolor(red)) /// + (kdensity m_theta_mle if treat==1,lcolor(blue)) if round==2, /// + title(Math) subtitle(Endline) ytitle(Density) xtitle(IRT score) /// + graphregion(fcolor(white) lcolor(white)) /// + legend(order(1 "Control" 2 "Treatment")) name(m_el,replace) + + graph twoway (kdensity h_theta_mle if treat==0,lcolor(red)) /// + (kdensity h_theta_mle if treat==1,lcolor(blue)) if round==1, /// + title(Hindi) subtitle(Baseline) ytitle(Density) xtitle(IRT score) /// + graphregion(fcolor(white) lcolor(white)) /// + legend(order(1 "Control" 2 "Treatment")) name(h_bl,replace) + + graph twoway (kdensity h_theta_mle if treat==0,lcolor(red)) /// + (kdensity h_theta_mle if treat==1,lcolor(blue)) if round==2, /// + title(Hindi) subtitle(Endline) ytitle(Density) xtitle(IRT score) /// + graphregion(fcolor(white) lcolor(white)) /// + legend(order(1 "Control" 2 "Treatment")) name(h_el,replace) + + grc1leg m_bl h_bl m_el h_el, xcommon ycommon leg(m_bl) /// + graphregion(fcolor(white) lcolor(white)) + + gr save ${graphs}fige1.gph, replace + gr export ${graphs}fige1.png, replace as(png) + + +} +// ****************** PLOT MATH ICCS ****************** // + +if $plotmathiccs==1 { + + use ${el_clean}ms_blel_jpal_long, clear + merge 1:1 st_id round using ${el_clean}ms_blel_forirt, keep(master match) + + sort st_id round + egen id=group(st_id round) + drop if round==. + + egen round_treat=group(round treat) + lab define round_treat 1 "Control BL" 2 "Treat BL" 3 "Control EL" 4 "Treat EL" + lab val round_treat round_treat + + + + xtile perc_thet=m_theta_mle,nq(5) + sort perc + + by perc: egen mean_theta=mean(m_theta_mle) + + forval i=1/94{ + by perc: egen mean_maths`i'=mean(qm`i') + } + + + forval i=1/94{ + forval j=1/4{ + by perc: egen mean_maths`i'_`j'=mean(qm`i') if round_treat==`j' + } + } + + keep perc mean* round_treat + + forval i=1/94{ + ren mean_maths`i' id`i' + } + + duplicates drop perc round_treat, force + egen group_perc=group(round_treat perc) + drop if group_perc==. + reshape long id,i(group_perc) j(item) + ren id prop + ren ite id + + + merge m:1 id using ${el_temp}math_items_all_2.dta + drop _m + + cd "$graphs" + + replace c_pv1=0 if c_pv1==. + + forval i=1/38 { + local j=((`i' - 1)*20 + 1) + twoway (scatter mean_maths`i'_3 mean_theta if id==`i' & round_treat==3, /// + sort msymbol(circle) mcolor(red)msize(small)) /// + (scatter mean_maths`i'_4 mean_theta if id==`i' & round_treat==4, sort /// + msymbol(lgx) mcolor(blue)msize(small)) /// + (function c_pv1[`j'] + (1-c_pv1[`j'])/(1+exp(-1.7*a_pv1[`j']*(x-b_pv1[`j']))) /// + if id==`i', range(-5 5)), name("Item_`i'", replace) xtitle("Theta") /// + ytitle("P(X=1|Theta)") title("Item `i'") nodraw /// + legend(order(1 "Control EL" 2 "Treat EL")) graphregion(fcolor(white) lcolor(white)) /// + + } + grc1leg Item_1 Item_2 Item_3 Item_4 Item_5 Item_6 Item_7 Item_8 Item_9 Item_10 Item_11 Item_12, ycommon xcommon /// + title("Item Characteristic Curves") subtitle("Mathematics") note("Combining all grades") leg(Item_1) graphregion(fcolor(white) lcolor(white)) + graph save Graph "$graphs/fige4a.gph", replace + gr export ${graphs}fige4a.png, replace as(png) + + grc1leg Item_13 Item_14 Item_15 Item_16 Item_17 Item_18 Item_19 Item_20 Item_21 Item_22 Item_23 Item_24, ycommon xcommon /// + title("Item Characteristic Curves") subtitle("Mathematics") note("Combining all grades") leg(Item_13) graphregion(fcolor(white) lcolor(white)) + graph save Graph "$graphs/fige4b.gph", replace + gr export ${graphs}fige4b.png, replace as(png) + + grc1leg Item_25 Item_26 Item_27 Item_28 Item_29 Item_30 Item_31 Item_32 Item_33 Item_34 Item_35 Item_36 Item_37 Item_38 , ycommon xcommon /// + title("Item Characteristic Curves") subtitle("Mathematics") note("Combining all grades") leg(Item_25) graphregion(fcolor(white) lcolor(white)) + graph save Graph "$graphs/fige4c.gph", replace + gr export ${graphs}fige4c.png, replace as(png) + +} +// ****************** PLOT HINDI ICCS ****************** // + +if $plothindiiccs==1 { + + use ${el_clean}ms_blel_jpal_long, clear + merge 1:1 st_id round using ${el_clean}ms_blel_forirt, keep(master match) + + sort st_id round + egen id=group(st_id round) + drop if round==. + + egen round_treat=group(round treat) + lab define round_treat 1 "Control BL" 2 "Treat BL" 3 "Control EL" 4 "Treat EL" + lab val round_treat round_treat + + xtile perc_thet=h_theta_mle,nq(5) + sort perc + + by perc: egen mean_theta=mean(h_theta_mle) + + forval i=1/71{ + by perc: egen mean_hindi`i'=mean(qh`i') + } + + + forval i=1/71{ + forval j=1/4{ + by perc: egen mean_hindi`i'_`j'=mean(qh`i') if round_treat==`j' + } + } + + keep perc mean* round_treat + + forval i=1/71{ + ren mean_hindi`i' id`i' + } + + duplicates drop perc round_treat, force + egen group_perc=group(round_treat perc) + drop if group_perc==. + reshape long id,i(group_perc) j(item) + ren id prop + ren ite id + + merge m:1 id using ${el_temp}hindi_items_all_2.dta + drop _m + + cd "$graphs" + + replace c_pv1=0 if c_pv1==. + + forval i=1/36 { + local j=((`i' - 1)*20 + 1) + twoway (scatter mean_hindi`i'_3 mean_theta if id==`i' & round_treat==3, /// + sort msymbol(circle) mcolor(red)msize(small)) /// + (scatter mean_hindi`i'_4 mean_theta if id==`i' & round_treat==4, sort /// + msymbol(lgx) mcolor(blue)msize(small)) /// + (function c_pv1[`j'] + (1-c_pv1[`j'])/(1+exp(-1.7*a_pv1[`j']*(x-b_pv1[`j']))) /// + if id==`i', range(-5 5)), name("Item_`i'", replace) xtitle("Theta") /// + ytitle("P(X=1|Theta)") title("Item `i'") nodraw /// + legend(order(1 "Control EL" 2 "Treat EL")) graphregion(fcolor(white) lcolor(white)) /// + + } + grc1leg Item_1 Item_2 Item_3 Item_4 Item_5 Item_6 Item_7 Item_8 Item_9 Item_10 Item_11 Item_12, ycommon xcommon /// + title("Item Characteristic Curves") subtitle("Hindi") note("Combining all grades") leg(Item_1) graphregion(fcolor(white) lcolor(white)) + graph save Graph "$graphs/fige3a.gph", replace + gr export ${graphs}fige3a.png, replace as(png) + + grc1leg Item_13 Item_14 Item_15 Item_16 Item_17 Item_18 Item_19 Item_20 Item_21 Item_22 Item_23 Item_24, ycommon xcommon /// + title("Item Characteristic Curves") subtitle("Hindi") note("Combining all grades") leg(Item_13) graphregion(fcolor(white) lcolor(white)) + graph save Graph "$graphs/fige3b.gph", replace + gr export ${graphs}fige3b.png, replace as(png) + + grc1leg Item_25 Item_26 Item_27 Item_28 Item_29 Item_30 Item_31 Item_32 Item_33 Item_34 Item_35 Item_36 , ycommon xcommon /// + title("Item Characteristic Curves") subtitle("Hindi") note("Combining all grades") leg(Item_25) graphregion(fcolor(white) lcolor(white)) + graph save Graph "$graphs/fige3c.gph", replace + gr export ${graphs}fige3c.png, replace as(png) + + +} diff --git a/data/ado/_/_eststo.ado b/data/ado/_/_eststo.ado new file mode 100644 index 0000000..90af09b --- /dev/null +++ b/data/ado/_/_eststo.ado @@ -0,0 +1,28 @@ +*! version 1.0.4 09nov2007 Ben Jann + +program define _eststo, byable(onecall) + local caller : di _caller() + version 8.2 + if "`_byvars'"!="" local by "by `_byvars'`_byrc0' : " + if inlist(`"`1'"',"clear","dir","drop") { + version `caller': `by'eststo `0' + } + else { + capt _on_colon_parse `0' + if !_rc { + local command `"`s(after)'"' + if `"`command'"'!="" { + local command `":`command'"' + } + local 0 `"`s(before)'"' + } + syntax [anything] [, Esample * ] + if `"`esample'"'=="" { + local options `"noesample `options'"' + } + if `"`options'"'!="" { + local options `", `options'"' + } + version `caller': `by'eststo `anything'`options' `command' + } +end diff --git a/data/ado/_/_eststo.hlp b/data/ado/_/_eststo.hlp new file mode 100644 index 0000000..49837ce --- /dev/null +++ b/data/ado/_/_eststo.hlp @@ -0,0 +1 @@ +.h eststo diff --git a/data/ado/backup.trk b/data/ado/backup.trk new file mode 100644 index 0000000..f902888 --- /dev/null +++ b/data/ado/backup.trk @@ -0,0 +1,334 @@ +* 00000008 +*! version 1.0.0 +* Do not erase or edit this file +* It is used by Stata to track the ado and help +* files you have installed. + +S http://www.stata.com/users/vwiggins +N grc1leg.pkg +D 25 Sep 2024 +U 1 +d grc1leg. Combine graphs into one graph with a common legend. +d Program by Vince Wiggins, StataCorp . +d Statalist distribution, 16 June 2003. +d +d Exactly like -graph combine- but shows a single common legend for all +d combined graphs. +d +d Distribution-Date: 02jun2010 +f g/grc1leg.ado +f g/grc1leg.hlp +e +S http://fmwww.bc.edu/repec/bocode/e +N estout.pkg +D 25 Sep 2024 +U 2 +d 'ESTOUT': module to make regression tables +d +d estout produces a table of regression results from one or +d several models for use with spreadsheets, LaTeX, HTML, or a +d word-processor table. eststo stores a quick copy of the active +d estimation results for later tabulation. esttab is a wrapper for +d estout. It displays a pretty looking publication-style regression +d table without much typing. estadd adds additional results to the +d e()-returns for one or several models previously fitted and +d stored. This package subsumes the previously circulated esto, +d esta, estadd, and estadd_plus. An earlier version of estout is +d available as estout1. +d +d KW: estimates +d KW: LaTeX +d KW: HTML +d KW: word processor +d KW: output +d +d Requires: Stata version 8.2 +d +d Distribution-Date: 20230212 +d +d Author: Ben Jann, University of Bern +d Support: email jann@@soz.unibe.ch +d +f _/_eststo.ado +f _/_eststo.hlp +f e/estadd.ado +f e/estadd.hlp +f e/estout.ado +f e/estout.hlp +f e/eststo.ado +f e/eststo.hlp +f e/estpost.ado +f e/estpost.hlp +f e/esttab.ado +f e/esttab.hlp +e +S http://fmwww.bc.edu/repec/bocode/x +N xtivreg2.pkg +D 25 Sep 2024 +U 3 +d 'XTIVREG2': module to perform extended IV/2SLS, GMM and AC/HAC, LIML and k-class regression for panel data models +d +d xtivreg2 implements IV/GMM estimation of the fixed-effects and +d first-differences panel data models with possibly endogenous +d regressors. It is essentially a wrapper for ivreg2, which must +d be installed for xtivreg2 to run: ssc install ivreg2, replace). +d xtivreg2 supports all the estimation and reporting options of +d ivreg2; see help ivreg2 for full descriptions and examples. In +d particular, all the statistics available with ivreg2 +d (heteroskedastic, cluster- and autocorrelation-robust covariance +d matrix and standard errors, overidentification and orthogonality +d tests, first-stage and weak/underidentification statistics, etc.) +d are also supported by xtivreg2 and will be reported with any +d degrees-of-freedom adjustments required for a panel data +d estimation. +d +d KW: instrumental variables +d KW: panel data +d KW: fixed effects +d KW: first differences +d KW: Sargan test +d KW: robust estimation +d KW: orthogonality +d KW: GMM +d KW: Hansen's J +d KW: heteroskedastic OLS, +d +d Requires: Stata version 8.2 and ivreg2, ranktest from SSC +d +d Distribution-Date: 20200626 +d +d Author: Mark E Schaffer, Heriot-Watt University +d Support: email m.e.schaffer@@hw.ac.uk +d +f x/xtivreg2.ado +f x/xtivreg2.hlp +f x/xtivreg2_p.ado +e +S http://fmwww.bc.edu/repec/bocode/i +N ivreg2.pkg +D 25 Sep 2024 +U 4 +d 'IVREG2': module for extended instrumental variables/2SLS and GMM estimation +d +d ivreg2 provides extensions to Stata's official ivregress and +d newey. Its main capabilities: two-step feasible GMM estimation; +d continuously updated GMM estimation (CUE); LIML and k-class +d estimation; automatic output of the Hansen-Sargan or +d Anderson-Rubin statistic for overidentifying restrictions; C +d statistic test of exogeneity of subsets of instruments (orthog() +d option); kernel-based autocorrelation-consistent (AC) and +d heteroskedastic and autocorrelation-consistent (HAC) estimation, +d with user-specified choice of kernel; Cragg's "heteroskedastic +d OLS" (HOLS) estimator; default reporting of large-sample +d statistics (z and chi-squared rather than t and F); small option +d to report small-sample statistics; first-stage regression +d reported with F-test of excluded instruments and R-squared with +d included instruments "partialled-out"; enhanced Kleibergen-Paap +d and Cragg-Donald tests for weak instruments, redundancy of +d instruments, significance of endogenous regressors; two-way +d clustering of standard errors; Kiefer and Driscoll-Kraay +d standard errors. ivreg2 can also be used for ordinary least +d squares (OLS) estimation using the same command syntax as Stata's +d official regress and newey. New in this version: ivreg2 now +d supports factor variables. This is version 4.1.11 of ivreg2, +d updated from that published in Stata Journal, 5(4), requiring +d Stata 11.2 or better. Stata 8.2/9.2/10.2 users may use this +d routine, which will automatically call ivreg28, ivreg29, or +d ivreg210, respectively. These versions are now included in the +d ivreg2 package. Stata 7 users may use the Stata Journal version +d of ivreg2, accessible via net search ivreg2. +d +d KW: instrumental variables +d KW: Sargan test +d KW: robust estimation +d KW: orthogonality +d KW: GMM +d KW: Hansen's J +d KW: heteroskedastic OLS, +d +d Requires: Stata version 11.2 and ranktest from SSC +d +d Distribution-Date: 20240814 +d +d Author: Christopher F Baum, Boston College +d Support: email baum@@bc.edu +d +d Author: Mark E Schaffer, Heriot-Watt University +d Support: email m.e.schaffer@@hw.ac.uk +d +d Author: Steven Stillman, Free University of Bozen-Bolzano +d Support: email Steven.Stillman@@unibz.it +d +f i/ivreg2.ado +f i/ivreg2.sthlp +f i/ivreg2_p.ado +f l/livreg2.mlib +f i/ivreg210.ado +f i/ivreg210.sthlp +f i/ivreg210_p.ado +f i/ivreg29.ado +f i/ivreg29.hlp +f i/ivreg29_p.ado +f i/ivreg29_cue.ado +f i/ivreg28.ado +f i/ivreg28.hlp +f i/ivreg28_p.ado +f i/ivreg28_cue.ado +e +S http://fmwww.bc.edu/repec/bocode/r +N ranktest.pkg +D 25 Sep 2024 +U 5 +d 'RANKTEST': module to test the rank of a matrix +d +d ranktest implements various tests for the rank of a matrix. +d Tests of the rank of a matrix have many practical applications. +d For example, in econometrics the requirement for identification +d is the rank condition, which states that a particular matrix must +d be of full column rank. Another example from econometrics +d concerns cointegration in vector autoregressive (VAR) models; the +d Johansen trace test is a test of a rank of a particular matrix. +d The traditional test of the rank of a matrix for the standard +d (stationary) case is the Anderson (1951) canonical correlations +d test. If we denote one list of variables as Y and a second as Z, +d and we calculate the squared canonical correlations between Y and +d Z, the LM form of the Anderson test, where the null hypothesis is +d that the matrix of correlations or regression parameters B +d between Y and Z has rank(B)=r, is N times the sum of the r+1 +d largest squared canonical correlations. A large test statistic +d and rejection of the null indicates that the matrix has rank at +d least r+1. The Cragg-Donald (1993) statistic is a closely related +d Wald test for the rank of a matrix. The standard versions of +d these tests require the assumption that the covariance matrix has +d a Kronecker form; when this is not so, e.g., when disturbances +d are heteroskedastic or autocorrelated, the test statistics are no +d longer valid. ranktest implements various generalizations of +d these tests - Kleibergen-Paap, Cragg-Donald, and J-type 2-step +d GMM and CUE GMM tests - to the case of a non-Kronecker covariance +d matrix. The implementation in ranktest will calculate test +d statistics that are robust to various forms of +d heteroskedasticity, autocorrelation, and clustering. +d +d KW: matrix +d KW: rank +d KW: collinearity +d KW: cointegration +d +d Requires: Stata version 12 (version 9.2 for ranktest9, version 11 for ranktest11) +d +d Distribution-Date: 20200929 +d +d Author: Frank Kleibergen, Brown University +d Support: email Frank_Kleibergen@@brown.edu +d +d Author: Mark E Schaffer, Heriot-Watt University +d Support: email m.e.schaffer@@hw.ac.uk +d +d Author: Frank Windmeijer, University of Oxford +d Support: email frank.windmeijer@@stats.ox.ac.uk +d +f r/ranktest.ado +f r/ranktest9.ado +f r/ranktest11.ado +f r/ranktest.sthlp +f r/ranktest11.sthlp +f l/livreg2.mlib +e +S http://fmwww.bc.edu/repec/bocode/l +N leebounds.pkg +D 25 Sep 2024 +U 6 +d 'LEEBOUNDS': module for estimating Lee (2009) treatment effect bounds +d +d leebounds computes treatment effect bounds for samples with +d non-random sample selection/attrition as proposed by Lee (Review +d of Economic Studies, 2009). The lower and upper bound, +d respectively, correspond to extreme assumptions about the missing +d information that are consistent with the observed data. As +d opposed to parametric approaches to correcting for sample +d selection bias, such as the classical Heckman (1979) estimator, +d Lee (2009) bounds rest on very few assumptions, i.e. random +d assignment of treatment and monotonicity. Monotonicity means that +d the treatment status affects selection in just one direction. +d That is, receiving a treatment makes selection either more or +d less likely for any observation. In technical terms, the approach +d rests on a trimming procedure. Either from below or from +d above, the group (treatment, control) that suffers less from +d sample attrition is trimmed at the quantile of the outcome +d variable that corresponds to the share of 'excess observations' +d in this group. Calculating group differentials in mean outcome +d yields the lower and the upper bound, respectively, for the +d treatment effect depending on whether trimming is from below or +d above. leebounds assumes that it is unknown, a priori, which +d group (treatment, control) is subject to the higher selection +d probability and estimates this from data (see Lee, 2009:1090). d +d KW: sample selection bias +d KW: attrition bias +d KW: random assignment +d +d Requires: Stata version 11 +d +d Distribution-Date: 20130725 +d +d Author: Harald Tauchmann , University of Erlangen-Nuremberg, Germany +d Support: email harald.tauchmann@@fau.de +d +f l/leebounds.ado +f l/leebounds.sthlp +e +S http://fmwww.bc.edu/repec/bocode/c +N cibar.pkg +D 25 Sep 2024 +U 7 +d 'CIBAR': module to plot bar graphs and confidence intervals over groups +d +d cibar plots bars and confidence intervals of the mean of a +d variable over at least one group. cibar aims at drawing graphs +d that resemble graphs created by graph bar varname, over(varname) +d asyvar, adding confidence intervals to the bars. In order to do +d so, cibar uses Stata's twoway bar and twoway rcap. cibar shows +d graphically the differences in the mean of a variable depending +d on the categories of other variables. +d +d KW: bar graph +d KW: graphics +d KW: confidence intervals +d KW: means +d +d Requires: Stata version 13 +d +d Distribution-Date: 20190624 +d +d Author: Alexander Staudt, N/A +d Support: email staudtlex@@live.de +d +f c/cibar.ado +f c/cibar.sthlp +e +S http://fmwww.bc.edu/repec/bocode/c +N coefplot.pkg +D 25 Sep 2024 +U 8 +d 'COEFPLOT': module to plot regression coefficients and other results +d +d coefplot plots results from estimation commands or Stata +d matrices. Results from multiple models or matrices can be +d combined in a single graph. The default behavior of coefplot is +d to draw markers for coefficients and horizontal spikes for +d confidence intervals. However, coefplot can also produce various +d other types of graphs. +d +d KW: graphics +d KW: coefficients +d KW: estimation +d +d Requires: Stata version 11 +d +d Distribution-Date: 20230225 +d +d Author: Ben Jann, University of Bern +d Support: email jann@@soz.unibe.ch +d +f c/coefplot.ado +f c/coefplot.sthlp +e diff --git a/data/ado/c/cibar.ado b/data/ado/c/cibar.ado new file mode 100644 index 0000000..25afec4 --- /dev/null +++ b/data/ado/c/cibar.ado @@ -0,0 +1,497 @@ +* ========================================================== +* cibar: creating bargraphs with confidence-intervals +* Author: Alexander Staudt +* Version 1.1.8, 2020-12-29 +* ========================================================== +*! version 1.1.8, Alexander Staudt, 29dec2020 + +*program drop _all +program define cibar +version 13.0 +syntax anything(name=var) [if] [aw fw iw pw], [over(passthru) over1(string) over2(string) over3(string) /// + VCE(passthru) Level(cilevel) /// + NOISily /// + BAROPts(string asis) BARColor(string asis) BARGap(integer 0) Gap(integer 67) /// + CIopts(string asis) GRaphopts(string asis) /// + BARLabel(string) BLFmt(string) BLPosition(string) BLOrientation(string) BLSize(string) BLcolor(string) BLGap(real 0)] /// + + preserve + + mark touse `if' + quietly keep if touse == 1 + + * define grouping variables in one single call of "over()" via over(passthru). + * for compatibility reasons, also keep old syntax using over1() valid. + * over(passthru) however takes precedence over over1() etc. + + * test which over-option was specified + capture confirm existence `over' + scalar _rc_over = _rc + + capture confirm existence `over1' + scalar _rc_over1 = _rc + + * use over(passthru) if specified, otherwise over1(). + * if both are specified, display message that over(passthru) will be used + if _rc_over == 6 & _rc_over1 == 6 { + display as error "option {bf:over()} required" + exit 198 + } + else if _rc_over == 6 & _rc_over1 == 0 { + local bylist = "`over1' `over2' `over3'" + local overs = wordcount("`bylist'") + + local over_list = "over(`bylist')" + } + else if _rc_over == 0 & _rc_over1 == 6 { + local bylist = subinstr("`over'", "over(", "", .) + local bylist = subinstr("`bylist'", ")", "", .) + local overs = wordcount("`bylist'") + + local over_list = "`over'" + } + else { + display as result "Note: grouping variables specified via {bf:over()}, hence ignoring {bf:over1()} (and {bf:over2()}, {bf:over3()} if specified)." + + local bylist = subinstr("`over'", "over(", "", .) + local bylist = subinstr("`bylist'", ")", "", .) + local overs = wordcount("`bylist'") + + local over_list = "`over'" + } + + * make sure only up to three grouping variables are used for computations, + * discard any additionally specified grouping variables + if `overs' > 3 { + display as result "Note: cibar only supports up to three grouping variables. Any additional grouping variable will be ignored." + local bylist = word("`bylist'", 1) + " " + word("`bylist'", 2) + " " + word("`bylist'", 3) + local overs = wordcount("`bylist'") + local over_list = "over(`bylist')" + } + + * over1, over2, over3 still required for plotting. + local over1 = word("`bylist'", 1) + local over2 = word("`bylist'", 2) + local over3 = word("`bylist'", 3) + + local bg = `bargap'/100 + local gap = (`gap'/100) - 1 + + capture confirm existence `baropts' + if _rc == 6 local baropts = "fintensity(inten100)" + if _rc == 0 local baropts = "fintensity(inten100)" + " " + `"`baropts'"' + + capture confirm existence `ciopts' + if _rc == 6 local ciopts = "lcolor(gs8)" + if _rc == 0 local ciopts = "lcolor(gs8)" + " " + `"`ciopts'"' + + * set defaults for barlabels + if "`blfmt'" == "" { + local blfmt = "%9.2f" + } + + if "`blposition'" == "" { + local blposition = "n" + } + + if "`blorientation'" == "" { + local blorientation = "horizontal" + } + + if "`blsize'" == "" { + local blsize = "medsmall" + } + + if "`blcolor'" == "" { + local blcolor = "black" + } + + * add options into one local macro + local opts = `"placement("`blposition'")"' + `"orientation("`blorientation'")"' + " " + `"size("`blsize'")"' + " " + `"color("`blcolor'")"' + + * get mean and confidence intervals + *di `level' + // show numeric results + // add vce-option + capture confirm existence `noisily' + if _rc == 6 { + qui mean `var' [`weight'`exp'], `over_list' level(`level') `vce' + } + else { + mean `var' [`weight'`exp'], `over_list' level(`level') `vce' + } + + * save results in matrices + matrix define results = r(table) + matrix define mean = results[1, 1..colsof(results)]' + matrix define ll = results[5, 1..colsof(results)]' + matrix define ul = results[6, 1..colsof(results)]' + + * get mean and grouping variables + collapse (mean) mean = `var' [`weight'`exp'], by(`bylist') + + * make sure to have non-missing combinations before adding resaults from mean + foreach x in `bylist' { + qui drop if `x' == . + } + + * add mean, lower bound, upper bound to dataset + qui svmat mean + qui svmat ll + qui svmat ul + + * rename variable + qui rename ll1 lb + qui rename ul1 ub + + local mean = "mean of `var'" + + if `overs' == 2 { + capture confirm existence `over2' + if _rc == 6 { + local over2 = "`over3'" + display as txt "You specified over3() but not over2(). The value of over3() is used in over2() instead." + } + } + + forvalues x = 1/`overs' { + qui tab `over`x'' + local llevels`x' = `r(r)' + qui levelsof(`over`x''), local(levels`x') + *di "`levels`x''" + } + + forvalues x = 1/`overs' { + * Variablenkodierungen vereinheitlichen + qui gen over`x'_n = . + tokenize "`levels`x''" + forvalues y = 1/`llevels`x'' { + qui replace over`x'_n = `y' if `over`x'' == ``y'' + } + } + + forvalues x = 1/`overs' { + * over`x'_n-Variablen labeln + tokenize "`levels`x''" + forvalues y = 1/`llevels`x'' { + local ltext : label (`over`x'') ``y'' + label define vlabel`x' `y' "`ltext'", add + if `y' == `llevels`x'' label val over`x'_n vlabel`x' + } + } + + forvalues x = 1/`overs' { + qui levelsof(over`x'_n), local(levels`x'_n) + *di "`levels`x'_n'" + } + + * ====================================================== + * Bei einer over-Angabe + * ====================================================== + if `overs' == 1 { + qui keep if over1_n < . + + qui tab over1_n + qui gen g1 = over1_n + qui replace g1 = g1 * (1 + `bg') + + qui sum g1 + local smin = `r(min)' - .75 + local smax = `r(max)' + .75 + *di "smin = `smin' smax = `smax'" + + local xlabel1 = "xlabel(`smin'" + " " + `"" ""' + " " + "`smax'" + " " + `"" ""' + ", noticks)" + } + * ====================================================== + * Bei zwei over-Angaben + * ====================================================== + if `overs' == 2 { + qui keep if over1_n < . & over2_n < . + + * Hinzufügen fehlender Variablen: + *di `llevels1' + *di `llevels2' + forvalues x1 = 1/`llevels1' { + forvalues x2 = 1/`llevels2' { + qui tab mean if over1_n == `x1' & over2_n == `x2' + if `r(r)' == 0 { + local obsv = _N+1 + qui set obs `obsv' + qui replace over1_n = `x1' in `obsv' + qui replace over2_n = `x2' in `obsv' + } + } + } + sort over2_n over1_n + + * over1_bg Positionswerte der Balken anpassen (bzgl. bargap) + qui gen over1_bg = . + tokenize "`levels1_n'" + forvalues x = 1/`llevels1' { + qui replace over1_bg = over1_n + (``x'' - 1) * (`bg') if over1_n == ``x'' + } + + * g1: Werte der Balken (zur Anordnung im Graphen) + qui gen g1 = . + tokenize "`levels2_n'" + forvalues j = 1/`llevels2' { + qui replace g1 = over1_bg + (`llevels1' + 1 + `gap' + `bg') * (`j' - 1) if over2_n == ``j'' + } + + * Beschriftung der x-Achse + * 1. Beschriftungsposition sowie Abstand zwischen den Balkenblöcken bestimmen + forvalues x = 1/`llevels2' { + qui sum g1 if over2_n == `x' + local pos_`x' = `r(mean)' + local diff = `llevels2' + 1 + `gap' + `bg' + if `x' == `llevels2' { + local smin = 0 + local smax = `r(max)' + 1 + } + } + * xlabel-Option mit Beschriftung der Balkengruppen erstellen + tokenize "`levels2_n'" + forvalues j = 1/`llevels2' { + *di "j = `j'" + *di "token j = ``j''" + local g11_`j' = `pos_`j'' + + local l`j' : label (over2_n) `j' + + if `j' == 1 local xlabel1 = "xlabel(`smin'" + " " + `"" ""' + " " + "`g11_`j''" + " " + `""`l`j''""' + else if `j' < `llevels2' local xlabel1 = `"`xlabel1'"' + " " + "`g11_`j''" + " " + `""`l`j''""' + else local xlabel1 = `"`xlabel1'"' + " " + "`g11_`j''" + " " + `""`l`j''""' + " " + "`smax'" + " " + `"" ""' + " " + ", noticks)" + } + *di `"`xlabel1'"' + *macro dir + } + + * ====================================================== + * Bei 3 over-Angaben + * ====================================================== + if `overs' == 3 { + qui keep if over1_n < . & over2_n < . & over3_n < . + + * sortiere nach Gruppen + sort over3_n over2_n over1_n + + * Hinzufügen fehlender Variablen: + * Prüfe für jede mögliche Ausprägung (over1*over2*over3), ob diese vorhanden ist + * Falls Ausprägung nicht vorhanden: erstellen der Beobachtung mit "set obs" und "replace obs" etc. + * Zusätzlich Schleifen über over1, over2, over3 + * Anschließend neue Gruppe mit unterschiedlichen Ausprägungen erstellen + + forvalues x1 = 1/`llevels1' { + forvalues x2 = 1/`llevels2' { + forvalues x3 = 1/`llevels3' { + qui tab mean if over1_n == `x1' & over2_n == `x2' & over3_n == `x3' + if `r(r)' == 0 { + local obsv = _N+1 + qui set obs `obsv' + qui replace over1_n = `x1' in `obsv' + qui replace over2_n = `x2' in `obsv' + qui replace over3_n = `x3' in `obsv' + } + } + } + } + sort over3_n over2_n over1_n + + * erzeuge neue Gruppe, die die verschiedenen Ausprägungen zweier Gruppen enthält + qui egen g2 = group(over3_n over2_n) + qui tab g2 + local llg2 = `r(r)' // Anzahl Balkengruppen + qui levelsof(g2), local(lg2) + + sort g2 `over1' + + * neue Balkennummern + qui gen c = _n + qui gen over1_n2 = mod(c,`llevels1') + qui replace over1_n2 = `llevels1' if over1_n2 == 0 + + * over1_bg Positionswerte der Balken anpassen (bzgl. bargap) + qui gen over1_bg = . + tokenize "`levels1_n'" + forvalues x = 1/`llevels1' { + qui replace over1_bg = over1_n2 + (``x'' - 1) * (`bg') if over1_n2 == ``x'' + } + + * g1: Werte der Balken (zur Anordnung im Graphen) + qui gen g1 = . + *di "lg2 = `lg2'" + tokenize "`lg2'" + forvalues j = 1/`llg2' { + qui replace g1 = over1_bg + (`j' - 1) * (`llevels1' + 1 + `gap' + `bg') if g2 == ``j'' + + } + + forvalues x = 1/`llevels2' { + qui replace g1 = g1 + (-`gap' + 1) * (`x' - 1) if over3_n == `x' + } + + * Beschriftung der x-Achse + // 1. over2 + * over2: 1. Beschriftungsposition sowie Abstand zwischen den Balkenblöcken bestimmen + forvalues x = 1/`llg2' { + qui sum g1 if g2 == `x' + local diff = `llevels1' + 1 + `gap' + `bg' + local pos_`x' = `r(mean)' + if `x' == `llg2' { + local smin = 0 + local smax = `r(max)' + 1 + } + } + + * Balkengruppen (label) + * label ermitteln und für g2 erweitern + tokenize "`levels3_n'" + forvalues x1 = 1/`llevels3' { // Anzahl Hauptblöcke + tokenize "`levels2_n'" + forvalues x2 = 1/`llevels2' { // Anzahl Untergruppen pro Gruppe + + local l`x2' : label (over2_n) ``x2'' + + local y = `x2' + (`x1' - 1) * `llevels2' + local llx = "`y'" + " " + `""`l`x2''""' + + if `x1' == 1 & `x2' == 1 local vlab = `"`llx'"' + else local vlab = `"`vlab'"' + " " + `"`llx'"' + } + } + *di `"`vlab'"' + qui label define g2lab `vlab' + qui label val g2 g2lab + + * x-Werte ermitteln, für die labels auf der x-Achse erscheinen sollen. + * labels für over2-Gruppe + *di "`lg2'" + tokenize "`lg2'" + *di "lg2 = `lg2'" + forvalues x = 1/`llg2' { + local g11_`x' = `pos_`x'' + local l`x' : label (g2) ``x'' + *macro dir + if `x' == 1 local xlabel1 = "xlabel(`smin'" + " " + `"" ""' + " " + "`g11_`x''" + " " + `""`l`x''""' + else if `x' < `llg2' local xlabel1 = `"`xlabel1'"' + " " + "`g11_`x''" + " " + `""`l`x''""' + else local xlabel1 = `"`xlabel1'"' + " " + "`g11_`x''" + " " + `""`l`x''""' + " " + "`smax'" + " " + `"" ""' + " " + } + + // 2. over3 + * labels für over3-Gruppe + forvalues x1 = 1/`llevels3' { + qui tab g1 if over3_n == `x1' + local llg1 = `r(r)' + forvalues x2 = 1/`llg2' { // erstelle label-Position (x-Achse) für bestimmte over3-Ausprägung + qui sum g1 if over3_n == `x1' + } + local g12_`x1' = `r(mean)' + *di `g12_`x1'' + local l2`x1' : label (over3_n) `x1' + *di `"`l2`x1''"' + if `x1' == 1 local l_3 = "`g12_`x1''" + " " + `"`"" " " " "`l2`x1''""'"' + else local l_3 = `"`l_3'"' + " " + "`g12_`x1''" + " " + `"`"" " " " "`l2`x1''""'"' + *di `"`l_3'"' + if `x1' == `llevels3' { + local xlabel1 = `"`xlabel1'"' + " " + `"`l_3'"' + ", noticks)" + *di `"`xlabel1'"' + } + + } + } + + * ====================================================== + * Säulen erstellen + * ====================================================== + tokenize "`levels1_n'" + *di "`levels1'" + *di "`llevels1'" + qui gen rcap = "rcap lb ub g1, `ciopts'" + forvalues j = 1/`llevels1' { + qui gen bar`j' = "bar mean g1 if over1_n==`j', `baropts'" + } + * add bar colors + qui des bar*, varlist + local nbars = wordcount("`r(varlist)'") + local ncolors = wordcount("`barcolor'") + + * check if number of defined colors is larger than number of defined bars (per group) + if `ncolors' > `nbars' { + local ncolors = `nbars' + } + * add colors to bars + if `ncolors' > 0 { + qui gen bcolors = "`barcolor'" + qui split bcolors, gen(bcol) + + forvalues j = 1/`ncolors' { + qui replace bar`j' = bar`j' + "color(" + bcol`j' + ")" + } + } + + * concatenate string + qui egen bars1 = concat(bar* rcap), punct(") (") + qui replace bars1 = "(" + bars1 + ")" + local bars1 = bars1[1] + + * ====================================================== + * Bar labels hinzufügen + * ====================================================== + * prepare bar labels + qui gen bl_mean = mean + qui replace bl_mean = 0 if mean == . + + * define bar labels + qui gen mlab = "" + local n = _N + forvalues x = 1/`n' { + if bl_mean[`x'] == 0 { + local mean_mlab = "0" + local s_mean_mlab = "" + } + else { + local mean_mlab = strofreal(bl_mean[`x'] + `blgap') + local s_mean_mlab = strofreal(bl_mean[`x'], `"`blfmt'"') + } + qui replace mlab in `x' = "text(" + `"`mean_mlab'"' + " " + strofreal(g1) + " " + `"""' + `"`s_mean_mlab'"' + `"""' + ", " + `"`opts'"' + ") " + } + + * add bar labels if barlabel(on) is specified by the user + if "`barlabel'" == "on" { + local n = _N + local bltext = mlab[1] + forvalues x = 2/`n' { + local bltext = `"`bltext'"' + mlab[`x'] + } + } + + * ====================================================== + * Legendeneinträge + * ====================================================== + *local vlabel1 : value label `over1' + tokenize "`levels1_n'" + forvalues j = 1/`llevels1' { + + local l`j' : label (over1_n) `j' + + if `j' == 1 { + local legend1 = `"`j' "`l`j''""' + } + else { + local legend1 = `"`legend1'"' + " " + `"`j' "`l`j''""' + } + } + *di `"legend1 = `legend1'"' + local legende = `"legend(order(`legend1'))"' + + capture confirm existence `graphopts' + if _rc == 6 local graphopts = `"`legende' xtitle("") ytitle("`mean'") plotregion(margin(bargraph)) ylabel(, format(%9.3g))"' + if _rc == 0 local graphopts = `"`legende' xtitle("") ytitle("`mean'") plotregion(margin(bargraph)) ylabel(, format(%9.3g))"' + " " + `"`graphopts'"' + + * ====================================================== + * draw graph + * ====================================================== + *twoway (bar mean group) (rcap ub lb group), `xlabel1' `graphopts' + *di `"`bars1'"' + twoway `bars1', `xlabel1' `graphopts' `bltext' + end diff --git a/data/ado/c/cibar.sthlp b/data/ado/c/cibar.sthlp new file mode 100644 index 0000000..17e5493 --- /dev/null +++ b/data/ado/c/cibar.sthlp @@ -0,0 +1,123 @@ +{smcl} +{* *! version 1.1.8, Alexander Staudt, 29dec2020}{...} +{* findalias asfradohelp}{...} +{* vieweralsosee "" "--"}{...} +{* vieweralsosee "[R] help" "help help"}{...} +{viewerjumpto "Syntax" "cibar##syntax"}{...} +{viewerjumpto "Description" "cibar##description"}{...} +{* viewerjumpto "Options" "cibar##options"}{...} +{viewerjumpto "Examples" "cibar##examples"}{...} +{viewerjumpto "Remarks" "cibar##remarks"}{...} +{viewerjumpto "Author" "cibar##author"}{...} +{title:Title} + +{phang} +{bf:cibar} {hline 2} Plot bar graphs with confidence intervals. + + +{marker syntax}{...} +{title:Syntax} +{p 8 17 2} +{cmdab:cibar:} +{it:varname} [{it:{help if}}] [{it:{help weight}}], {cmd: over(}{it:varlist}{cmd:)} [{it:options}] + +{p2colreset}{...} +{p 4 6 2} + +{synoptset 20 tabbed}{...} +{synopthdr} +{synoptline} +{syntab:Main} +{synopt:{opt l:evel(#)}}set confidence level; default is 95.{p_end} +{synopt:{opt vce(:}{help vcetype}{opt ):}}{it:vcetype} may be {cmd: analytic} (the default), {cmd: cluster} {it:clustvar}, {cmd: bootstrap}, or {cmd: jackknife}.{p_end} +{synopt:{opt over1(:}{it:varname}{opt ):}}first over-variable (for compatibility with previous versions. See {help cibar##note:note}).{p_end} +{synopt:{opt over2(:}{it:varname}{opt ):}}additional over-variable.{p_end} +{synopt:{opt over3(:}{it:varname}{opt ):}}additional over-variable. over3() can't be used without specifying over2().{p_end} + +{syntab:Advanced} +{synopt:{opt barg:ap(#)}}specify gap within bargroups; default is 0.{p_end} +{synopt:{opt g:ap(#)}}specify gap between bargroups; default is 67 (i.e. 2/3 of a bar).{p_end} +{synopt:{opt barop:ts(...)}}specify the look of the bars. For more information, see {help barlook_options}.{p_end} +{synopt:{opt barc:olor(...)}}specify the color of the bars (see {help colorstyle}; RGB/CMYK/HSV values are not allowed).{p_end} +{synopt:{opt ci:opts(...)}}specify the look of the range plot (see {help twoway rcap}).{p_end} +{synopt:{opt gr:aphopts(...)}}specify additional graph options (see {help twoway_options}).{p_end} +{synopt:{opt barl:abel(...)}}specify if value of the means should be displayed; default is {it:off}.{p_end} +{synopt:{opt blf:mt(...)}}specify label display {help format}; default is %9.2f.{p_end} +{synopt:{opt blp:osition(...)}}specify label position (see {help compassdirstyle}); default is {it:n}.{p_end} +{synopt:{opt blo:rientation(...)}}specify whether label text should be horizontal or vertical (see {help orientationstyle}); default is horizontal.{p_end} +{synopt:{opt bls:ize(...)}}specify label text size (see {help textsizestyle}); default is {it:medsmall}.{p_end} +{synopt:{opt blc:olor(...)}}specify label text color (see {help colorstyle}); default is black.{p_end} +{synopt:{opt blg:ap(...)}}specify distance of barlabels from bars; default is 0.0.{p_end} +{synoptline} +{p2colreset}{...} +{p 4 6 2} +{cmd:by} is not allowed; see {help by}.{p_end} +{p 4 6 2} +{cmd: aweights, fweights, iweights,} and {cmd: pweights} are allowed; see {help weight}. + + +{marker description}{...} +{title:Description} + +{pstd} +{cmd:cibar} creates a bar plot displaying the mean of a variable and its confidence intervals, grouped over different variables. + + +{marker examples}{...} +{title:Examples} + +{phang}{cmd:. sysuse auto}{p_end} +{phang}{cmd:. cibar price, over(foreign)}{p_end} +{phang}{cmd:. cibar price, over(foreign turn)}{p_end} +{phang}{cmd:. cibar price, over(foreign turn) level(90)}{p_end} +{phang}{cmd:. cibar price, over(foreign turn) ciopts(lcolor(red)) graphopts(title("Price over 'foreign' over 'turn'") name(graph_1, replace)) }{p_end} + +{phang}Using the old syntax{p_end} +{phang}{cmd:. cibar price, over1(foreign) over2(turn) ciopts(lcolor(red)) graphopts(title("Price over 'foreign' over 'turn'") name(graph_2, replace)) }{p_end} + + +{phang}Using weights{p_end} +{phang}{cmd:. webuse total}{p_end} +{phang}{cmd:. cibar heartatk, over(sex race)}{p_end} +{phang}{cmd:. cibar heartatk, over(sex race) barcol(gs0 gs10) graphopts(ylabel(, nogrid) graphregion(color(white)))}{p_end} +{phang}{cmd:. cibar heartatk [pweight=swgt], over(sex race) graphopts(name(graph_1, replace))}{p_end} +{phang}{cmd:. cibar heartatk [pweight=swgt], over(sex race) graphopts(name(graph_2, replace)) barlabel(on) blf(%9.3f)}{p_end} + +{phang}Using the old syntax{p_end} +{phang}{cmd:. cibar heartatk [pweight=swgt], over1(sex) over2(race) graphopts(name(graph_2, replace)) barlabel(on) blf(%9.3f)}{p_end} + + +{marker note}{...} +{title:Note} + +{pstd} +{cmd:over(}{it:varlist}{cmd:)} is the preferred way to specify over-variables as of version 1.1.6. For now, {cmd:over1(}{it:varname}{cmd:)}, {cmd:over2(}{it:varname}{cmd:)}, {cmd:over3(}{it:varname}{cmd:)} remain valid alternatives. +{cmd:over(}{it:varlist}{cmd:)} takes precedence over {cmd: over1(}{it:varname}{cmd:)} when mixing old and new syntax. + +{marker remarks}{...} +{title:Remarks} + +{pstd} +{cmd: cibar} uses -graph twoway- to draw bar graphs with confidence intervals. + +{pstd} +{cmd: cibar} is designed to draw vertical bars and confidence intervals. Theoretically, {it:horizontal} bars can be specified using baropts(), +but this specification will lead to less useful graphs, as confidence intervals will still be displayed vertically. Furthermore, there will be issues concerning the x and y-axis. + +{pstd} +The option {cmd: barcolor} sets the colors for the categories of the first over-variable (see {help cibar##examples:examples}). + +{pstd} +The option {cmd: blgap} sets the distance of the barlabels from its default position. The horizontal position of the barlabels is determined by the corresponding group means and the options passed to {cmd: blposition} and {cmd: blorientation}. +To draw the bar height (group means), {cmd: cibar} uses Stata's {help added_text_options}. Hence, additional space of the barlabels from the bar needs to be defined on the same scale as the y-axis (real values). + +{pstd} For the computation of confidence intervals using weights, {cmd: cibar} uses {help mean}. + +{pstd} +The code for this .ado is inspired by a how-to of the {it:Institute for Digital Research and Education} (IDRE), that can be found at {browse "https://stats.idre.ucla.edu/stata/faq/how-can-i-make-a-bar-graph-with-error-bars/"}. + + +{marker author}{...} +{title:Author} + +{phang}Alexander Staudt, staudtlex@live.de{p_end} diff --git a/data/ado/c/cmogram.ado b/data/ado/c/cmogram.ado new file mode 100644 index 0000000..defee20 --- /dev/null +++ b/data/ado/c/cmogram.ado @@ -0,0 +1,523 @@ +/* + cmogram y x [ , options ] + + Draw histogram-style conditional mean or median graph. + + by Christopher Robert, Harvard Kennedy School, chris_robert@hksphd.harvard.edu + + v1.11, September 6, 2011 +*/ + +program define cmogram, rclass + syntax varlist(min=2 max=2) [if] [, Histopts(string) CONtrols(string) CONTROLvars(string) CUTpoint(string) CUTRight CI(string) MEDian LEGend COUNT FRACtion NOTEn NOTEPFX(string) NOTESFX(string) NONotes Lineat(string) TITle(string) Graphopts(string) SAVing(string) GENerate(string) BY(string) BYValues(string) BYTitle(string) SCatter LFit LFITCi QFit QFITCi LOWess LFITOpts(string) CIOpts(string) RCAPOpts(string) LOWOpts(string) GRAPHOPTS1(string) GRAPHOPTS2(string) GRAPHOPTS3(string) GRAPHOPTS4(string) LFITOPTS1(string) LFITOPTS2(string) LFITOPTS3(string) LFITOPTS4(string) RCAPOPTS1(string) RCAPOPTS2(string) RCAPOPTS3(string) RCAPOPTS4(string) LOWOPTS1(string) LOWOPTS2(string) LOWOPTS3(string) LOWOPTS4(string) TITLE1(string) TITLE2(string) TITLE3(string) TITLE4(string)] + version 9.2 + marksample marked, strok + quietly { + * initialize variables + tokenize `varlist' + local yvar "`1'" + local xvar "`2'" + local xvarLabel : variable label `xvar' + if "`xvarLabel'"=="" { + local xvarLabel="`xvar'" + } + local yvarLabel : variable label `yvar' + if "`yvarLabel'"=="" { + local yvarLabel="`yvar'" + } + if "`controls'"~="" { + local controlvars="`controls'" + local controldesc=", controlling for '`controls''" + } + else { + local controldesc="" + } + if "`median'"~="" { + local oper="median" + } + else if "`fraction'"~="" { + local oper="fraction" + } + else if "`count'"~="" { + local oper="count" + } + else if "`ci'"~="" { + local oper="confidence intervals" + } + else { + local oper="mean" + } + if "`by'"~="" { + local bydesc=", by '`by''" + } + else { + local bydesc="" + } + if "`legend'"~="" { + local legendoff="" + } + else { + local legendoff="legend(off)" + } + + * show overall output header + count if `marked' + local totcount0=r(N) + noisily disp "" + noisily disp "Plotting `oper' of `yvar', conditional on `xvar'`bydesc'`controldesc'." + noisily disp "" + noisily disp "n = `totcount0'" + noisily disp "" + + * run regression if controlling; set y axis label + if "`controlvars'"~="" { + reg `yvar' `controlvars' if `marked' + tempvar _resid + predict `_resid', resid + local yvar="`_resid'" + + if "`median'"~="" { + local ylabel="Median residual of `yvarLabel'" + } + else if "`count'"~="" { + local ylabel="Frequency" + } + else if "`fraction'"~="" { + local ylabel="Proportion" + } + else { + local ylabel="Mean residual of `yvarLabel'" + } + } + else { + if "`median'"~="" { + local ylabel="Median of `yvarLabel'" + } + else if "`count'"~="" { + local ylabel="Frequency" + } + else if "`fraction'"~="" { + local ylabel="Proportion" + } + else { + local ylabel="Mean of `yvarLabel'" + } + } + + * loop through and set up bins, potentially by sub-group + if "`by'"~="" { + if "`byvalues'"~="" { + local byvals="`byvalues'" + } + else { + levelsof `by', local(byvals) + } + } + else { + local byvals="1" + } + local miny=999999 + local maxy=-999999 + local num0=0 + local num1=1 + foreach byval of local byvals { + if "`by'"~="" { + local byif=" & `by'==`byval'" + cap: count if `marked' `byif' + if _rc~=0 { + local byif=`" & `by'=="`byval'""' + local bystg="1" + count if `marked' `byif' + } + local totcount`num0'=r(N) + if `num0'>0 { + noisily disp "" + } + noisily disp "`by'==`byval' (n = `totcount`num0'')" + noisily disp "" + } + else { + local byif="" + } + * define bins and specify their heights + forvalues right=`num0'/`num1' { + tempvar _bn`right' + gen `_bn`right''=. + if `right'==`num0' | "`cutpoint'"~="" { + tempvar _y`right' _x`right' _yh`right' _yl`right' + gen `_yh`right''=. + gen `_yl`right''=. + if "`cutpoint'"~="" { + count if `marked' & `xvar'==`cutpoint' `byif' + local atcut=r(N) + if `right'==`num0' { + twoway__histogram_gen `xvar' if `marked' & `xvar'<=`cutpoint' `byif', freq `histopts' gen(`_y`right'' `_x`right'') display + } + else { + twoway__histogram_gen `xvar' if `marked' & `xvar'>=`cutpoint' `byif', freq start(`cutpoint') `histopts' gen(`_y`right'' `_x`right'') display + * note that the left and right both include the cut-point; the bar heights will be adjusted below + } + } + else { + local atcut=0 + twoway__histogram_gen `xvar' if `marked' `byif', freq `histopts' gen(`_y`right'' `_x`right'') display + } + local nbins=r(bin) + local binstart=r(start) + local binwidth`right'=r(width) + local binleft=`binstart' + local lastmax=r(max) + + * check for and manage missing (empty) bins + replace `_x`right''=. if `_y`right''==. + count if `_x`right''<. + if r(N) < `nbins' { + * fill in missing bins + sort `_x`right'' + local binmid=(`binstart'+`binwidth`right''/2) + forvalues bn=1/`nbins' { + count if `_x`right''>(`binmid'-`binwidth`right''/2) & `_x`right''<(`binmid'+`binwidth`right''/2) + if r(N) < 1 { + replace `_x`right''=`binmid' if _n==(`nbins'+`bn') + replace `_y`right''=0 if _n==(`nbins'+`bn') + } + local binmid=(`binmid'+`binwidth`right'') + } + } + + sort `_x`right'' + replace `_bn`right''=_n + forvalues bn=1/`nbins' { + local binright=`binleft'+`binwidth`right'' + * round up for last bin, to be sure to catch boundary points + if `bn'==`nbins' { + local binright=`lastmax' + } + if "`ci'"~="" { + local sumcmd="ci" + local sumopt="level(`ci') `ciopts'" + } + else { + local sumcmd="sum" + local sumopt="d" + } + if "`cutright'"=="" { + if (`right'==`num0' & `bn'==1) | (`right'==`num1' & `bn'==1 & `atcut'==0) { + `sumcmd' `yvar' if `xvar'>=`binleft' & `xvar'<=`binright' & `marked' `byif', `sumopt' + local rangedesc="[`binleft',`binright']" + } + else { + `sumcmd' `yvar' if `xvar'>`binleft' & `xvar'<=`binright' & `marked' `byif', `sumopt' + local rangedesc="(`binleft',`binright']" + } + } + else { + if (`right'==`num1' & `bn'==`nbins') | ("`cutright'"=="" & `right'==`num0' & `bn'==`nbins') { + `sumcmd' `yvar' if `xvar'>=`binleft' & `xvar'<=`binright' & `marked' `byif', `sumopt' + local rangedesc="[`binleft',`binright']" + } + else { + `sumcmd' `yvar' if `xvar'>=`binleft' & `xvar'<`binright' & `marked' `byif', `sumopt' + local rangedesc="[`binleft',`binright')" + } + } + local rangen=r(N) + if "`median'"~="" { + local rangeydesc="median" + local rangey=r(p50) + } + else if "`count'"~="" { + local rangeydesc="count" + local rangey=r(N) + } + else if "`fraction'"~="" { + local rangeydesc="fraction" + local rangey=r(N)/`totcount`num0'' + } + else { + local rangeydesc="mean" + local rangey=r(mean) + } + if "`ci'"~="" { + local cih=r(ub) + local cil=r(lb) + replace `_y`right''=`rangey' if `_bn`right''==`bn' + replace `_yh`right''=`cih' if `_bn`right''==`bn' + replace `_yl`right''=`cil' if `_bn`right''==`bn' + if `cil'<`miny' { + local miny=`cil' + } + if `cih'>`maxy' & `cih'<. { + local maxy=`cih' + } + noisily disp "Bin #`bn': `rangedesc' (n = `rangen') (`rangeydesc' = `rangey'; CI = (`cil',`cih'))" + } + else { + replace `_y`right''=`rangey' if `_bn`right''==`bn' + if `rangey'<`miny' { + local miny=`rangey' + } + if `rangey'>`maxy' & `rangey'<. { + local maxy=`rangey' + } + noisily disp "Bin #`bn': `rangedesc' (n = `rangen') (`rangeydesc' = `rangey')" + } + + local binleft=`binright' + } + } + } + + local num0=`num0'+2 + local num1=`num1'+2 + } + + * output graph(s) and save results + return clear + local graphnames="" + local num0=0 + local num1=1 + local graphno1=1 + local graphno2=2 + local titleno=1 + foreach byval of local byvals { + if "`by'"~="" { + if "`bystg'"=="1" { + local byif=`" & `by'=="`byval'""' + } + else { + local byif=" & `by'==`byval'" + } + } + else { + local byif="" + } + * assemble code to draw (and possibly save) graph + local graphname="_graph`num0'" + local nameopts="name(`graphname')" + cap: graph drop `graphname' + if "`lineat'"=="" { + local lineopts "" + } + else { + local lineopts "xline(`lineat', lpattern(dash))" + } + * define a y axis, making it common across sub-groups + if "`by'"~="" | ("`count'"=="" & "`fraction'"=="") { + local diff=(`maxy'-`miny') + if `diff'<0.0005 { + local roundingto=0.00001 + local decimals=5 + } + else if `diff'<0.005 { + local roundingto=0.0001 + local decimals=4 + } + else if `diff'<0.05 { + local roundingto=0.001 + local decimals=3 + } + else if `diff'<0.5 { + local roundingto=0.01 + local decimals=2 + } + else if `diff'<5 { + local roundingto=0.1 + local decimals=1 + } + else { + local roundingto=1 + local decimals=0 + } + if "`count'"~="" | "`fraction'"~="" { + local floor=0 + } + else { + local floor=round(`miny'-(`maxy'-`miny')/16,`roundingto') + if `floor'<0 & `miny'>=0 { + local floor=0 + } + } + local ceil=round(`maxy',`roundingto') + local ystep=(`ceil'-`floor')/4 + local ceil=round(`maxy',`roundingto') + local bottom=min(`miny',`floor') + local top=max(`maxy',`ceil') + if "`scatter'"~="" { + local yrangeopts "ylabel(`floor'(`ystep')`ceil', format(%9.`decimals'f)) yscale(range(`bottom' `top'))" + } + else { + local yrangeopts "base(`bottom') ylabel(`floor'(`ystep')`ceil', format(%9.`decimals'f)) yscale(range(`bottom' `top'))" + } + } + else { + local yrangeopts "yscale(range(0 .)) ylabel(#7)" + } + if "`by'"~="" & "`nonotes'"=="" { + if "`noten'"~="" { + local noteopt=`"note("`notepfx'`by'=`byval', n=`totcount`num0''`notesfx'")"' + } + else { + local noteopt=`"note(`notepfx'"`by'=`byval'`notesfx'")"' + } + } + else if "`noten'"~="" & "`nonotes'"=="" { + local noteopt=`"note("`notepfx'n=`totcount`num0''`notesfx'")"' + } + else { + local noteopt="" + } + + if "`scatter'"~="" { + local gtype="scatter" + local barwid0="" + local barwid1="" + } + else { + local gtype="bar" + local barwid0="barwidth(`binwidth`num0'')" + local barwid1="barwidth(`binwidth`num1'')" + } + + * potentially add line(s) of best fit + if "`lfit'"~="" | "`lfitci'"~="" | "`qfit'"~="" | "`qfitci'"~="" { + local lfplot="" + if "`qfitci'"~="" { + local lfcmd="qfitci" + if strpos("`lfitopts'","cip") == 0 { + local lfplot="ciplot(rline)" + } + } + else if "`qfit'"~=""{ + local lfcmd="qfit" + } + else if "`lfitci'"~="" { + local lfcmd="lfitci" + if strpos("`lfitopts'","cip") == 0 { + local lfplot="ciplot(rline)" + } + } + else { + local lfcmd="lfit" + } + if "`cutpoint'"~="" { + if "`cutright'"~="" { + local lfopt1=`"|| `lfcmd' `yvar' `xvar' if `marked' & `xvar'<`cutpoint' `byif', `legendoff' range(. `cutpoint') `lfplot' `lfitopts' `lfitopts`graphno1''"' + local lfopt2=`"|| `lfcmd' `yvar' `xvar' if `marked' & `xvar'>=`cutpoint' `byif', `legendoff' range(`cutpoint' .) `lfplot' `lfitopts' `lfitopts`graphno2''"' + } + else { + local lfopt1=`"|| `lfcmd' `yvar' `xvar' if `marked' & `xvar'<=`cutpoint' `byif', `legendoff' range(. `cutpoint') `lfplot' `lfitopts' `lfitopts`graphno1''"' + local lfopt2=`"|| `lfcmd' `yvar' `xvar' if `marked' & `xvar'>`cutpoint' `byif', `legendoff' range(`cutpoint' .) `lfplot' `lfitopts' `lfitopts`graphno2''"' + } + } + else { + local lfopt1=`"|| `lfcmd' `yvar' `xvar' if `marked' `byif', `legendoff' `lfplot' `lfitopts' `lfitopts`graphno1''"' + local lfopt2="" + } + } + else { + local lfopt1="" + local lfopt2="" + } + + * potentially add lowess plot + if "`lowess'"~="" { + if "`cutpoint'"~="" { + if "`cutright'"~="" { + local lowopt1=`"|| lowess `yvar' `xvar' if `marked' & `xvar'<`cutpoint' `byif', `legendoff' `lowopts' `lowopts`graphno1''"' + local lowopt2=`"|| lowess `yvar' `xvar' if `marked' & `xvar'>=`cutpoint' `byif', `legendoff' `lowopts' `lowopts`graphno2''"' + } + else { + local lowopt1=`"|| lowess `yvar' `xvar' if `marked' & `xvar'<=`cutpoint' `byif', `legendoff' `lowopts' `lowopts`graphno1''"' + local lowopt2=`"|| lowess `yvar' `xvar' if `marked' & `xvar'>`cutpoint' `byif', `legendoff' `lowopts' `lowopts`graphno2''"' + } + } + else { + local lowopt1=`"|| lowess `yvar' `xvar' if `marked' `byif', `legendoff' `lowopts' `lowopts`graphno1''"' + local lowopt2="" + } + } + else { + local lowopt1="" + local lowopt2="" + } + + * potentially add confidence intervals + if "`ci'"~="" { + if "`cutpoint'"~="" { + local ciopt1="|| rcap `_yl`num0'' `_yh`num0'' `_x`num0'', `legendoff' `rcapopts' `rcapopts`graphno1''" + local ciopt2="|| rcap `_yl`num1'' `_yh`num1'' `_x`num1'', `legendoff' `rcapopts' `rcapopts`graphno2''" + } + else { + local ciopt1="|| rcap `_yl`num0'' `_yh`num0'' `_x`num0'', `legendoff' `rcapopts' `rcapopts`graphno1''" + local ciopt2="" + } + } + else { + local ciopt1="" + local ciopt2="" + } + + * potentially adjust title + if "`title`titleno''"~="" { + local titleval="`title`titleno''" + } + else { + local titleval="`title'" + } + + * actually draw a graph + if "`cutpoint'"~="" { + twoway `gtype' `_y`num0'' `_x`num0'', `barwid0' `yrangeopts' `graphopts' `graphopts`graphno1'' || `gtype' `_y`num1'' `_x`num1'', `barwid1' title("`titleval'") ytitle("`ylabel'") graphregion(fcolor(white)) `legendoff' `noteopt' `nameopts' `lineopts' `yrangeopts' `graphopts' `graphopts`graphno2'' `lfopt1' `lfopt2' `ciopt1' `ciopt2' `lowopt1' `lowopt2' + if "`generate'"~="" { + cap: gen `generate'x`num0'=. + cap: gen `generate'y`num0'=. + cap: gen `generate'x`num1'=. + cap: gen `generate'y`num1'=. + replace `generate'x`num0'=`_x`num0'' + replace `generate'y`num0'=`_y`num0'' + replace `generate'x`num1'=`_x`num1'' + replace `generate'y`num1'=`_y`num1'' + } + return scalar bw`num0'=`binwidth`num0'' + return scalar bw`num1'=`binwidth`num1'' + local graphno1=`graphno1'+2 + local graphno2=`graphno2'+2 + } + else { + twoway `gtype' `_y`num0'' `_x`num0'', `barwid0' title("`titleval'") ytitle("`ylabel'") graphregion(fcolor(white)) `noteopt' `nameopts' `lineopts' `yrangeopts' `graphopts' `graphopts`graphno1'' `lfopt1' `lfopt2' `ciopt1' `ciopt2' `lowopt1' `lowopt2' + if "`generate'"~="" { + cap: gen `generate'x`num0'=. + cap: gen `generate'y`num0'=. + replace `generate'x`num0'=`_x`num0'' + replace `generate'y`num0'=`_y`num0'' + } + return scalar bw`num0'=`binwidth`num0'' + local graphno1=`graphno1'+1 + local graphno2=`graphno2'+1 + } + + * optionally save a graph + local graphnames="`graphnames' `graphname'" + if "`saving'"~="" & "`by'"=="" { + graph export "`saving'", name(`graphname') replace + graph drop `graphname' + } + + local num0=`num0'+2 + local num1=`num1'+2 + local titleno=`titleno'+1 + } + + * if using by option, combine graphs together and possibly save + if "`by'"~="" { + cap: graph drop combined + graph combine `graphnames', name(combined) title("`bytitle'") + graph drop `graphnames' + if "`saving'"~="" { + graph export "`saving'", name(combined) replace + graph drop combined + } + } + } +end diff --git a/data/ado/c/cmogram.hlp b/data/ado/c/cmogram.hlp new file mode 100644 index 0000000..f5d90b3 --- /dev/null +++ b/data/ado/c/cmogram.hlp @@ -0,0 +1,236 @@ +{smcl} +{* *! version 1.1.1 06sep2011}{...} +{cmd:help cmogram} +{hline} + +{title:Title} + + {p 4 4 2}{hi:cmogram} {hline 2} Draw histogram-style conditional mean or median graph + +{title:Syntax} + +{p 8 17 2} +{cmd:cmogram} {it:{help varname:yvar}} {it:{help varname:xvar}} +[{it:{help if:if}}] +[{cmd:,} {it:{help cmogram##options:options}} ] + +{synoptset 20 tabbed}{...} +{synopthdr} +{synoptline} +{syntab:Main} +{synopt:{opt tit:le(...)}}title of graph{p_end} +{synopt:{opth con:trols(varlist)}}control variables for graphing residuals{p_end} +{synopt:{opt cut:point(#)}}point along {it:x} axis to split the graph{p_end} +{synopt:{opt cutr:ight}}include border observations on the right side{p_end} +{synopt:{opt ci(#)}}plot means with confidence intervals of level {it:#}{p_end} +{synopt:{opt med:ian}}plot medians rather than means{p_end} +{synopt:{opt count}}plot counts (frequencies) rather than means{p_end} +{synopt:{opt frac:tion}}plot fractions (proportions) rather than means{p_end} +{synopt:{opt l:ineat(#)}}draw one or more vertical lines at points along {it:x} axis{p_end} +{synopt:{opt sc:atter}}format as scatterplot rather than bar graph{p_end} +{synopt:{opt leg:end}}allow legend to display{p_end} +{synopt:{opt lf:it}}include line of best fit{p_end} +{synopt:{opt lfitci}}include line of best fit, with confidence interval{p_end} +{synopt:{opt qf:it}}include quadratic of best fit{p_end} +{synopt:{opt qfitci}}include quadratic of best fit, with confidence interval{p_end} +{synopt:{opt low:ess}}include local linear smooth plot{p_end} +{synopt:{opth by(varname)}}graph subgroups according to {it:varname}{p_end} +{synopt:{opt byt:itle(...)}}overall title for {it:by()} graphs{p_end} +{synopt:{opt byv:alues(...)}}optional ordered list of categories for {it:by()} graphs{p_end} +{synopt:{opt note:n}}note # observations at bottom of graph{p_end} +{synopt:{opt notepfx(...)}}prefix for note at bottom of graph{p_end} +{synopt:{opt notesfx(...)}}suffix for note at bottom of graph{p_end} +{synopt:{opt non:otes}}suppress all notes at bottom of graph{p_end} +{synopt:{opt h:istopts(options)}}control bin definition with {help histogram##continuous_opts:histogram options}{p_end} +{synopt:{opt g:raphopts(options)}}control graph output with {help twoway_options:graph options}{p_end} +{synopt:{opt lfito:pts(options)}}control line or quadratic of best fit options{p_end} +{synopt:{opt lowo:pts(options)}}control lowess plot options{p_end} +{synopt:{opt cio:pts(options)}}control {it:ci} confidence intervals with {help ci:ci options}{p_end} +{synopt:{opt rcapo:pts(options)}}control {it:ci} output with {help twoway_rcap:rcap options}{p_end} +{synopt:{opt sav:ing(filename)}}save graph to file{p_end} +{synopt:{opt gen:erate(prefix)}}save graph values in variables with given prefix; programmer's option{p_end} +{synoptline} +{p2colreset}{...} + +{title:Description} + +{pstd} +{cmd:cmogram} graphs the means, medians, frequencies, or proportions of +{it:yvar}, conditional on {it:xvar}. By default, bins are defined along the {it:x} axis +as they are by {help histogram:histogram}. Alternatively, +{help histogram##continuous_opts:histogram options} can be used to override the default +bin definitions, as in {opt histopts(bin(10))}. The exact bin definitions are always output +along with the graph(s). + +{pstd} +While the default output style is similar to a histogram, the {opt scatter} option allows for +scatterplot-style output. For regression +discontinuity and similar applications, {opt cutpoint(#)} can be used to split graphs at a +particular {it:x} value. To plot conditional means or medians of residuals, {opt controls(...)} +can be used; the plotted residuals will be after a regression of the form {it:regress yvar controls}. + +{pstd} +{opt by} allows subgroups to be plotted separately. + +{marker options} +{title:Options} + +{dlgtab:Main} + +{phang} +{opt title(...)} adds a title to the top of the graph. +Specify the graph number as the {it:#} in {opt title#(...)} to specify a title for only +one of several graphs output (e.g., using {opt by}). + +{phang} +{opth controls(varlist)} considers residuals of {it:yvar} rather than the values of {it:yvar} directly. +A regression of the form {it:regress yvar controls} is executed, then means or medians of the residuals are plotted accordingly. + +{phang} +{opt cutpoint(#)} splits the graph at the specified point along the {it:x} axis. Bins are defined along the {it:x} axis to the right and left of this cutoff, with no bin spanning the cutoff. + +{phang} +{opt cutright} includes border observations on the right side of a split graph. By default, border observations are included on the left. + +{phang} +{opt ci(#)} plots means of {it:yvar} with confidence intervals of level {it:#}. + +{phang} +{opt median} plots medians of {it:yvar} rather than means. + +{phang} +{opt count} plots counts (frequencies) of {it:yvar} rather than means. + +{phang} +{opt fraction} plots fractions (proportions) of {it:yvar} rather than means. + +{phang} +{opt lineat(#)} draws a vertical line at the specified point along the {it:x} axis. To draw multiple lines, include multiple numbers separated by spaces. + +{phang} +{opt scatter} formats output as a scatterplot rather than a bar graph. In this case, each conditional median or mean is plotted as a dot rather than a bar. + +{phang} +{opt legend} allows display of the legend; by default it is suppressed. To more fully control display of the legend, include this option as well as {opt graphopts(legend(...))}. + +{phang} +{opt lfit} plots a line of best fit on the graph. When the graph is split using {opt cutpoint}, separate lines of best fit are plotted on the left and right. + +{phang} +{opt lfitci} is the same as {opt lfit}, but with confidence intervals. + +{phang} +{opt qfit} is the same as {opt lfit}, but with a quadratic. + +{phang} +{opt qfitci} is the same as {opt qfit}, but with confidence intervals. + +{phang} +{opt lowess} plots local linear smooth ({help twoway_lowess:lowess}) plot on the graph. When the graph is split using {opt cutpoint}, separate lowess plots are plotted on the left and right. + +{phang} +{opth by(varname)} graphs subgroups separately, according to {it:varname}. Subgroups are identified in the note field below each graph. + +{phang} +{opt bytitle(...)} adds an overall title to a series of subgroup graphs, when {opt by} is used. + +{phang} +{opt byvalues(...)} specifies an ordered list of category values, when {opt by} is used. So, e.g., {opt byvalues(1 0)} will place the {it:1} graph before the {it:0} graph. By default, graphs appear in sorted order. + +{phang} +{opt noten} notes the number of observations at the bottom of the graph. + +{phang} +{opt notepfx(...)} adds a prefix to the note at the bottom of the graph. This will precede the number of observations and/or the subgroup, depending on other options. + +{phang} +{opt notesfx(...)} adds a suffix to the note at the bottom of the graph. This will follow the number of observations and/or the subgroup, depending on other options. + +{phang} +{opt nonotes} suppresses all notes at the bottom of the graph, even when using {opt by}. + +{phang} +{opt histopts(options)} controls the definition of bins with {help histogram##continuous_opts:histogram options}. +When graphs are split by {opt cutpoint}, these options govern bin definitions for each side of the graph. So, e.g., {opt histopts(bin(10))} will +define 10 bins to the left and 10 to the right. + +{phang} +{opt graphopts(options)} specifies additional {help twoway_options:graph options} to govern graph output. These options can control any aspect of the +look of the graph, including titles, labels, and styles. Specify the graph number as the {it:#} in {opt graphopts#(options)} to specify options for only +one of several graphs output. + +{phang} +{opt lfitopts(options)} specifies additional {help twoway_lfit:lfit options} to govern output of the line-of-best-fit when using {opt lfit}. +When using {opt lfitci}, specifies additional {help twoway_lfitci:lfitci options}. +When using {opt qfit}, specifies additional {help twoway_qfit:qfit options}. +When using {opt qfitci}, specifies additional {help twoway_qfitci:qfitci options}. +Specify the graph number as the {it:#} in {opt lfitopts#(options)} to specify options for only +one of several graphs output. + +{phang} +{opt lowopts(options)} specifies additional {help twoway_lowess:lowess options} to govern output of lowess plots when using {opt lowess}. +Specify the graph number as the {it:#} in {opt lowopts#(options)} to specify options for only one of several graphs output. + +{phang} +{opt ciopts(options)} specifies additional {help ci:ci options} to govern calculation of confidence intervals when using {opt ci}. + +{phang} +{opt rcapopts(options)} specifies additional {help twoway_rcap:rcap options} to govern output of confidence intervals when using {opt ci}. +Specify the graph number as the {it:#} in {opt rcapopts#(options)} to specify options for only +one of several graphs output. + +{phang} +{opt saving(filename)} exports the graph to {it:filename} and closes the graph window. This option is ideal for automating the output of graphs with .do files. + +{phang} +{opt generate(prefix)} is a programmer's option to save graphing values, as in {help twoway__histogram_gen:twoway__histogram_gen}. +Variables of the form {it:prefix}x#, where {it:#} is the graph number starting from 0, are saved with the center {it:x} value for each bin. +Variables of the form {it:prefix}y# are saved with the corresponding heights. + +{title:Saved results} + +{pstd} +{cmd:cmogram} saves the following in {cmd:r()}: + +{pstd} +Scalars: + + {cmd:r(bw#)} bin width for graph {it:#} + +{pstd} +By default, there is only one graph output by {cmd:cmogram}, so {it:#} is 0; when {opt cutpoint} is specified, there are two graphs, 0 and 1, corresponding +to the left and right sides of the graph; when {opt by} is specified, there are additional graphs. To save more details for each graph, use the +{opt generate} option. + +{title:Examples} + +{phang}{cmd:. sysuse auto} + +{phang}{cmd:. cmogram mpg weight} + +{phang}{cmd:. cmogram mpg weight, median title("Median MPG by Weight")} + +{phang}{cmd:. cmogram mpg weight, median title("Median MPG by Weight") saving("median mpg.png")} + +{phang}{cmd:. cmogram mpg weight, histopts(bin(10)) lfit scatter} + +{phang}{cmd:. cmogram mpg weight, histopts(bin(10)) lfit graphopts(note("Source: ..."))} + +{phang}{cmd:. cmogram mpg weight, histopts(bin(5)) lfit cutpoint(3250) lineat(3250)} + +{phang}{cmd:. cmogram mpg weight, histopts(bin(5)) lfit cutpoint(3250) lineat(3000 3250 3500) controls(price)} + +{phang}{cmd:. cmogram mpg weight, histopts(bin(5)) by(foreign) bytitle("Mean MPG by Type and Weight")} + + +{title:Author} + +Christopher Robert, Harvard University, chris_robert@hksphd.harvard.edu + + +{title:Also see} + +{psee} +Online: help for + {helpb histogram} +{p_end} diff --git a/data/ado/c/coefplot.ado b/data/ado/c/coefplot.ado new file mode 100644 index 0000000..bea86f5 --- /dev/null +++ b/data/ado/c/coefplot.ado @@ -0,0 +1,3903 @@ +*! version 1.8.6 22feb2023 Ben Jann + +program coefplot + version 11 + nobreak { + capt mata: mata drop COEFPLOT_STRUCT + capt n break _coefplot `macval(0)' + local rc = _rc + capt mata: mata drop COEFPLOT_STRUCT + exit `rc' + } +end + +program _coefplot, rclass + // get subgraphs and parse global options + parse_subgraphs `macval(0)' // returns n_subgr, subgr_#, opts + parse_globalopts `macval(opts)' // returns expanded global opts and twopts, + // subgropts0, plotopts0, modelopts0, twplotopts0 + + // backup current estimates, initialize struct + tempname ecurrent + _est hold `ecurrent', restore estsystem nullok + mata: COEFPLOT_STRUCT = coefplot_struct_init() + + // dryrun across subgraphs and plots to collect options + local i 0 + local N_plots 0 + forv j = 1/`n_subgr' { + if "`recycle'"=="" local i 0 + local firstplot_`j' = `i'+1 + parse_plots `j' `macval(subgr_`j')' // returns n_plots_j, plot_j_#, opts + if ("`recycle'"=="" & `n_subgr'>1) { + combine_plotopts, `macval(opts)' _opts0(`macval(plotopts1prev)') + local plotopts1prev `macval(plotopts)' + local opts `macval(plotopts)' `macval(options)' + } + merge_subgropts, `macval(opts)' _opts0(`subgropts0' `plotopts0' `macval(modelopts0)') + // returns subgropts, plotopts1, modelopts1, twplotopts1 + parse_subgropts `j', `subgropts' + forv k = 1/`n_plots_`j'' { + local ++i + local twplotopts1_`i' `twplotopts1_`i'' `twplotopts1' + parse_models `j' `k' `macval(plot_`j'_`k')' + // returns n_models_j_k, model_j_k_#, opts + if `n_models_`j'_`k''==1 & `"`model_`j'_`k'_1'"'=="_skip" { + if `"`opts'"'!="" { + di as err "options not allowed with _skip" + exit 198 + } + continue + } + if (`i'>`N_plots') { // get p#() from twoplotopts0 + parse_get_popt_i `i', `macval(twplotopts0)' // returns twplotopts0, plotopts + if `"`macval(plotopts)'"'!="" { + merge_plotopts, `macval(plotopts)' // to isolate the modelopts + local popt_mopts_`i' `macval(modelopts2)' + merge_plotopts, `macval(opts)' /// + _opts0(`macval(modelopts2)' `plotopts' `_opts0' `options') + // returns plotopts, modelopts2, options, _opts0 + local opts `macval(modelopts2)' `plotopts' `_opts0' `options' + } + } + else { + if `"`macval(popt_mopts_`i')'"'!="" { // add modelopts from p#() + merge_plotopts, `macval(opts)' _opts0(`macval(popt_mopts_`i')') + // returns plotopts, modelopts2, options, _opts0 + local opts `macval(modelopts2)' `plotopts' `_opts0' `options' + } + } + if ("`recycle'"=="" & `n_subgr'>1) { + combine_plotopts, `macval(opts)' _opts0(`macval(plotopts2_`i')') + local plotopts2_`i' `macval(plotopts)' + local opts `macval(plotopts)' `macval(options)' + } + merge_plotopts, `macval(opts)' _opts0(`macval(plotopts1)' `macval(modelopts1)') + // returns plotopts, modelopts2, options, _opts0 + if `"`_opts0'"'!="" error 198 + local modelopts_`j'_`k' `macval(modelopts2)' + local twplotopts_`i' `twplotopts_`i'' `options' + local plotopts_`i' `plotopts' + } + local lastplot_`j' `i' + local N_plots = max(`N_plots', `i') + } + // expand plotopts + local customoffset 0 + forv i = 1/`N_plots' { + parse_plotopts `i', `plotopts_`i'' + if `"`offset_`i''"'!="" local customoffset 1 + } + // parse cismooth + forv i = 1/`N_plots' { + local cis_`i' = `"`cismooth_`i''"'!="" + if `cis_`i'' { + if `"`cismooth_`i''"'=="cismooth" local cismooth_`i' + parse_cismooth `i', `cismooth_`i'' // returns cis_levels_i, + // cis_n_i, cis_lwidth_i, cis_intens_i, cis_color_i, cis_pstyle_i + } + else local cis_n_`i' = 0 + } + + // parse models and collect results + local i 0 + forv j = 1/`n_subgr' { + if "`recycle'"=="" local i 0 + forv k = 1/`n_plots_`j'' { + local ++i + if `n_models_`j'_`k''==1 & `"`macval(model_`j'_`k'_1)'"'=="_skip" { + continue + } + forv l = 1/`n_models_`j'_`k'' { + parse_model `macval(model_`j'_`k'_`l')' // returns model, matrix, opts + if `"`matrix'"'=="" { + if `"`model'"'=="." { + _est unhold `ecurrent' + } + else { + qui est restore `model' + } + } + collect_coefs `"`model'"' /// + "`matrix'" /// matrix mode? + "`atmode'" /// whether at() is used; will be replaced + `i' /// plot number + `j' /// subgraph number + "`cis_levels_`i''" /// + , `macval(opts)' _opts0(`macval(modelopts_`j'_`k')') + // returns equation, atmode, n_ci + // may reset mlabel_# and mlabvposition_# + local n_ci = `n_ci' - `cis_n_`i'' + if `"`matrix'"'=="" & `"`model'"'=="." { + _est hold `ecurrent', restore estsystem nullok + } + if "`n_ci_`i''"=="" local n_ci_`i' 0 + local n_ci_`i' = max(`n_ci_`i'', `n_ci') + mata: coefplot_add_label(COEFPLOT_STRUCT, "by", `j', "model", 0) + if `"`equation'"'!="" { + if `"`model'"'=="." local model `"`equation'"' + else local model `"`model'=`equation'"' + } + mata: coefplot_add_label(COEFPLOT_STRUCT, "plot", `i', "model", 0) + } + } + } + forv i = 1/`N_plots' { // expand ciopts + if `n_ci_`i''>0 { + parse_ciopts_nocilwincr `i', `ciopts_`i'' `cirecast_`i'' // returns nocilwincr_# + parse_ciopts `i' `n_ci_`i'' `ciopts_`i'' `cirecast_`i'' + } + } + mata: coefplot_set_r(COEFPLOT_STRUCT) // returns r, N_ci, N_aux, mlbllen + local mlbllen = max(1, min(c(maxstrvarlen), `mlbllen')) + if `r'==0 { + di as txt "(nothing to plot)" + exit + } + + // cleanup and and arrange + if `"`horizontal'`vertical'"'=="" { + if `atmode' local vertical vertical + else local horizontal horizontal + } + if `"`horizontal'"'!="" { + local xaxis y + local yaxis x + local offdir "-" + local reverse yscale(reverse) + local plotregion plotregion(margin(t=0 b=0)) + } + else { // vertical + local xaxis x + local yaxis y + local offdir "+" + local plotregion plotregion(margin(l=0 r=0)) + } + if `atmode' { + if "`bycoefs'"!="" { + di as err "at() and bycoefs not both allowed" + exit 198 + } + local grid `"`grid'`gridopts'"' + foreach opt in order coeflabels eqlabels relocate headings /// + groups grid { + if `"``opt''"'!="" { + di as err "at() and `opt'() not both allowed" + exit 198 + } + } + mata: coefplot_add_eq_and_grp(COEFPLOT_STRUCT) + local reverse + local plotregion + local meqs 0 + } + else { + if `"`eqstrict'"'!="" local meqs 1 + else { + mata: coefplot_multiple_eqs(COEFPLOT_STRUCT) // returns meqs + } + mata: coefplot_arrange(COEFPLOT_STRUCT) // updates local r + mata: coefplot_coeflbls(COEFPLOT_STRUCT) + coeflbls "`labels'" `"`clinteract'"' + if "`bycoefs'"!="" { + mata: coefplot_bycoefs(COEFPLOT_STRUCT) // returns n_subgr + local meqs 0 + } + mata: coefplot_catvals(COEFPLOT_STRUCT) + // modifies C.at; sets C.eq, C.grp; returns groups + mata: coefplot_headings(COEFPLOT_STRUCT) + // modifies C.at; returns hlbls + } + + // save results to variables + if `"`generate'"'=="" { + if (_N > `r') & "`nodrop'"=="" { + preserve + qui keep in 1/`r' // remove extra observations to speed up + } + else if (_N < `r') { + preserve + qui set obs `r' + } + } + else { + if (_N < `r') { + di as txt "need to create additional observations; " _c + di as txt "press break to abort" + more + set obs `r' + } + } + tempname by plot at mlbl mlpos b V se t df pval eq grp + qui gen `by' = . + qui gen `plot' = . + qui gen `at' = . + qui gen str`mlbllen' `mlbl' = "" + qui gen `mlpos' = . + qui gen `b' = . + qui gen `V' = . + qui gen `se' = . + qui gen `t' = . + qui gen `df' = . + qui gen `pval' = . + if `"`format'"'!="" { + format `format' `b' `V' `se' `t' `pval' + } + qui gen `eq' = . + qui gen `grp' = . + forv i = 1/`N_ci' { + tempname ll`i' ul`i' + qui gen `ll`i'' = . + qui gen `ul`i'' = . + if `"`format'"'!="" { + format `format' `ll`i'' `ul`i'' + } + } + forv i = 1/`N_aux' { + tempname aux`i' + qui gen `aux`i'' = . + if `"`format'"'!="" { + format `format' `aux`i'' + } + } + if `"`generate'"'!="" { + preserve + local returnvars + local i 0 + foreach v in by plot at mlbl mlpos b V se t df pval { + local ++i + local varl: word `i' of /// + "subgraph ID" /// + "plot ID" /// + "plot position (category axis)" /// + "marker label" /// + "marker label position" /// + "coefficient" /// + "variance" /// + "standard error" /// + "t or z statistic" /// + "degrees of freedom" /// + "p-value" + if "`replace'"!="" { + capt confirm new variable `generate'`v', exact + if _rc { + drop `generate'`v' + } + } + rename ``v'' `generate'`v' + lab var `generate'`v' `"`varl'"' + local `v' `generate'`v' + local returnvars `returnvars' `generate'`v' + } + forv i = 1/`N_ci' { + foreach v in ll ul { + if "`v'"=="ll" local varl "CI`i': lower limit" + else local varl "CI`i': upper limit" + if "`replace'"!="" { + capt confirm new variable `generate'`v'`i', exact + if _rc { + drop `generate'`v'`i' + } + } + rename ``v'`i'' `generate'`v'`i' + lab var `generate'`v'`i' `"`varl'"' + local `v'`i' `generate'`v'`i' + local returnvars `returnvars' `generate'`v'`i' + } + } + forv i = 1/`N_aux' { + local varl "Auxiliary variable `i'" + if "`replace'"!="" { + capt confirm new variable `generate'aux`i', exact + if _rc { + drop `generate'aux`i' + } + } + rename `aux`i'' `generate'aux`i' + lab var `generate'aux`i' `"`varl'"' + local aux`i' `generate'aux`i' + local returnvars `returnvars' `generate'aux`i' + } + } + mata: coefplot_put(COEFPLOT_STRUCT) + mata: coefplot_apply_transform(COEFPLOT_STRUCT) + qui compress `at' `df' `plot' `by' `eq' `grp' `mlpos' // not really needed + // get labels + set_by_and_plot_labels `plot' `by' + if `"`plotlabels'"'!="" { + set_labels "`plot'" "`N_plots'" `"`plotlabels'"' + } + if `"`pltrunc'`plwrap'"'!="" { + truncwrap_vlabels "`plot'" "`N_plots'" "`pltrunc'" /// + "`plwrap'" "`plbreak'" + } + if "`bycoefs'"=="" { + if `"`bylabels'"'!="" { + set_labels "`by'" "`n_subgr'" `"`bylabels'"' + } + if `"`bltrunc'`blwrap'"'!="" { + truncwrap_vlabels "`by'" "`n_subgr'" "`bltrunc'" /// + "`blwrap'" "`blbreak'" + } + } + if `atmode'==0 { + if "`grid'"=="" & "`xaxis'"=="y" { + if `N_plots'>1 & `"`offsets'"'=="" local grid between + else local grid within + } + get_axis_labels `at' `eq' `grp' "`grid'" `"`groups'"' + // => returns xlabels, xgrid, xrange, eqlabels, groups + if `meqs'==0 | "`noeqlabels'"!="" local eqlabels + if `"`cltrunc'`clwrap'"'!="" { + if "`bycoefs'"=="" { + truncwrap_labels xlabels "`cltrunc'" "`clwrap'" /// + "`clbreak'" `"`xlabels'"' + } + else { + truncwrap_vlabels "`by'" "`n_subgr'" "`cltrunc'" /// + "`clwrap'" "`clbreak'" + } + } + if "`bycoefs'"!="" { + if `"`bylabels'"'!="" { + reset_xlabels `"`bylabels'"' `"`xlabels'"' + } + if `"`bltrunc'`blwrap'"'!="" { + truncwrap_labels xlabels "`bltrunc'" "`blwrap'" /// + "`blbreak'" `"`xlabels'"' + } + } + if `"`clangle'"'=="" local clangle angle(horizontal) + local xlabel `xaxis'label(`xlabels', nogrid `clangle' `clopts') + local xrange `xaxis'scale(range(`xrange')) + if !inlist("`grid'", "", "none") { + local xtick `xaxis'tick(`xgrid', notick tlstyle(none) grid `gridopts') + // note: tlstyle(none) is required to prevent by() from drawing + // the ticks + } + else local xtick + if "`eqashead'"!="" { + merge_eqlabels_hlbls `"`eqlabels'"' `"`hlbls'"' + // => returns hlbls and clears eqlabels + } + if `"`eqtrunc'`eqwrap'"'!="" { + if `"`eqlabels'"'!="" { + truncwrap_labels eqlabels "`eqtrunc'" "`eqwrap'" /// + "`eqbreak'" `"`eqlabels'"' + } + } + if `"`gtrunc'`gwrap'"'!="" { + if `"`groups'"'!="" { + truncwrap_labels groups "`gtrunc'" "`gwrap'" /// + "`gbreak'" `"`groups'"' + } + } + if `"`htrunc'`hwrap'"'!="" { + if `"`hlbls'"'!="" { + truncwrap_labels hlbls "`htrunc'" "`hwrap'" /// + "`hbreak'" `"`hlbls'"' + } + } + } + + // compute offsets + if `customoffset' { + forv i = 1/`N_plots' { + if "`offset_`i''"!="" { + qui replace `at' = `at' `offdir' `offset_`i'' if `plot'==`i' + } + } + } + else if `atmode'==0 & `"`offsets'"'=="" & `N_plots'>1 { + capt mata: coefplot_at_unique(COEFPLOT_STRUCT) // error if not true + if _rc==1 exit _rc + if _rc { + if "`recycle'"=="" | `n_subgr'==1 { + qui replace `at' = `at' - 0.5 + `plot'/(`N_plots'+1) + } + else { + forv j=1/`n_subgr' { + qui replace `at' = `at' - 0.5 + /// + (`plot'-`firstplot_`j''+1) / /// + (`lastplot_`j''-`firstplot_`j''+2) if `by'==`j' + } + } + } + } + + // inject tempvars + forv i=1/`N_plots' { + foreach opt in ifopt weightopt mlabel mlabvposition { + if `"``opt'_`i''"'!="" { + mata: coefplot_inject_temvars("`opt'_`i'", `N_ci', `N_aux') + } + } + } + + // handle string expressions in mlabel() + forv i=1/`N_plots' { + if `"`mlabel_`i''"'!="" { + if `"`mlabel_`i''"'=="mlabel(`mlbl')" continue + parse_mlabel_exp, `mlabel_`i'' // returns mlblexp + capt confirm variable `mlblexp' + if _rc==0 continue + capt replace `mlbl' = `mlblexp' if `plot'==`i' + if _rc { + di as err "invalid expression in mlabel()" + exit 198 + } + local mlabel_`i' mlabel(`mlbl') + } + } + + // compile plot + local addaxis 1 + local eqaxis 2 + local axisalt alt + if (`"`eqlabels'"'!="" & `"`groups'"'!="") | (`"`addplotbelow'"'!="") local axisalt + if `"`groups'"'!="" { + local ++eqaxis + local addaxis `addaxis' 2 + local groupsopts `xaxis'scale(axis(2) `axisalt' noline) /// + `xaxis'title("", axis(2)) /// + `xaxis'label(`groups', axis(2) noticks tlstyle(none) `gopts') + } + if `"`eqlabels'"'!="" { + local addaxis `addaxis' `eqaxis' + local eqaxisopts `xaxis'scale(axis(`eqaxis') `axisalt' noline) /// + `xaxis'title("", axis(`eqaxis')) /// + `xaxis'label(`eqlabels', axis(`eqaxis') noticks /// + tlstyle(none) `eqopts') + } + local axisalt + if "`addaxis'"!="1" { + local addaxis `xaxis'axis(`addaxis') + if `"`addplotbelow'"'!="" { + if (`"`eqlabels'"'!="")+(`"`groups'"'!="")==1 { + local axisalt `xaxis'scale(alt) + } + } + } + else local addaxis + if `"`hlbls'"'!="" { + local hlblsopts /// + `xaxis'label(`hlbls', custom add tlstyle(none) `hopts') + } + local j 0 + if `"`addplot'"'!="" { + mata: coefplot_inject_temvars("addplot", `N_ci', `N_aux') + if `"`addplotbelow'"'!="" { + capt two `addplot' ||, nodraw + if _rc==0 local j `.Graph.last_style' + capt confirm integer number `j' + if _rc local j 0 + } + } + local plots + local legendlbls + local legendorder + forv i=1/`N_plots' { + local key + if "`n_ci_`i''"=="" { + continue // plot does not exist (this can happen if _skip is + // specified together with norecycle) + } + local n_ci = `n_ci_`i'' + `cis_n_`i'' + if `n_ci'==0 & `"`cionly_`i''"'!="" { + continue // can happen if noci and cionly is specified + } + local axis + if `"`axis_`i''"'!="" { + local axis `yaxis'axis(`axis_`i'') + } + local ciplots + if (`n_ci')>0 { + get_pstyle_id `=mod(`i'-1,`pcycle')+1', `pstyle_`i'' // returns pstyle_id + forv k = 1/`n_ci' { + local lw + if `k'>`cis_n_`i'' { + local l = `k' - `cis_n_`i'' + local ciopts `ciopts_`i'_`l'' + parse_ciopts_recast_pstyle, `ciopts' + // returns cirecast, cipstyle, ciopts + if "`nocilwincr_`i''"=="" { + local lw = string(1 + log10(`l')/log10(2)) + local lw lwidth(*`lw') + } + local ciplotcmd rspike `ll`k'' `ul`k'' `at' + if (substr(`"`cirecast'"',1,2)=="pc") { // paired coordinates + local ciplotcmd `cirecast' `ll`k'' `at' `ul`k'' `at' + if `"`cirecast'"'=="pcrarrow" { + local ciplotcmd pcarrow `ul`k'' `at' `ll`k'' `at' + } + } + else if `"`cirecast'"'!="" { + local ciopts `ciopts' recast(`cirecast') + } + } + else { // cismooth + local l 0 + local cirecast + local cipstyle `cis_pstyle_`i'' + local lw: word `k' of `cis_lwidth_`i'' + local lw lwidth(*`lw') + local lcinten: word `k' of `cis_intens_`i'' + local ciopts lcolor("`cis_color_`i''*`lcinten'") `cipstyle' + local ciplotcmd rspike `ll`k'' `ul`k'' `at' + } + if `"`cipstyle'"'!="" local pstyle + else { + set_pstyle `pstyle_id' `"`cirecast'"' // returns pstyle + } + local ciplots `ciplots' /// + (`ciplotcmd' if `plot'==`i'`ifopt_`i'', `addaxis' /// + `pstyle' `lw' `axis' `ciopts' `horizontal') + } + } + if "`citop_`i''"=="" & `n_ci'>0 { + local plots `plots' `ciplots' + local j = `j' + `cis_n_`i'' + if inrange(`key_`i'', 1, `n_ci_`i'') { + local key = `j' + `key_`i'' + } + local j = `j' + `n_ci_`i'' + } + if `"`cionly_`i''"'=="" { + if `"`pstyle_`i''"'!="" local pstyle `pstyle_`i'' + else { + set_pstyle `=mod(`i'-1,`pcycle')+1' `"`recast_`i''"' // returns pstyle + } + if `"`recast_`i''"'!="" local recast recast(`recast_`i'') + else local recast + if `"`horizontal'"'=="" | inlist(`"`recast_`i''"', /// + "area", "bar", "spike", "dropline", "dot") { + local plots `plots' /// + (scatter `b' `at' /// + if `plot'==`i'`ifopt_`i''`weightopt_`i'', /// + `addaxis' `pstyle' `twplotopts0' `twplotopts1_`i'' /// + `axis' `recast' `mlabel_`i'' `mlabvposition_`i'' /// + `twplotopts_`i'' `horizontal') + } + else { + local plots `plots' /// + (scatter `at' `b' /// + if `plot'==`i'`ifopt_`i''`weightopt_`i'', /// + `addaxis' `pstyle' `twplotopts0' `twplotopts1_`i'' /// + `axis' `recast' `mlabel_`i'' `mlabvposition_`i'' /// + `twplotopts_`i'') + } + local ++j + if `key_`i''==0 { + local key `j' + } + } + local plotlab `"`: lab `plot' `i''"' + gettoken trash : plotlab, qed(hasquotes) + if `hasquotes'==0 { + local plotlab `"`"`plotlab'"'"' + } + if "`citop_`i''"!="" & `n_ci'>0 { + local plots `plots' `ciplots' + local j = `j' + `cis_n_`i'' + if inrange(`key_`i'', 1, `n_ci_`i'') { + local key = `j' + `key_`i'' + } + local j = `j' + `n_ci_`i'' + } + if "`key'"!="" { + local legendlbls `legendlbls' label(`key' `plotlab') + local legendorder `legendorder' `key' + } + } + if `"`legendorder'"'!="" { + local legendorder all order(`legendorder') + if `N_plots'==1 { + if `n_subgr'==1 & `"`legend'"'=="" { + local legendorder `legendorder' off + } + } + } + else local legendorder off + if `n_subgr'>1 { + local byopt `by', note("") + if (`N_plots'==1 & `"`bylegend'"'=="") | `"`legendorder'"'=="off" { + local byopt `byopt' legend(off) + } + local byopt by(`byopt' `bylegend' `byopts') + } + else local byopt + if `"`plots'"'=="" { + di as txt "(nothing to plot)" + exit + } + if `"`addplot'"'!="" { + if `"`addplotbelow'"'!="" { + local plots `addplot' || `plots' || + } + else { + local plots `plots' || `addplot' || + } + } + local plots two `plots', `axisalt' `groupsopts' `eqaxisopts' /// + `xlabel' `hlblsopts' `xtick' `xrange' `reverse' yti("") xti("") /// + legend(`legendlbls' `legendorder') `legend' `plotregion' `byopt' `twopts' + `plots' + + // return + if `"`generate'"'!="" { + restore, not + di as txt _n "Generated variables:" _c + describe `returnvars' + } + return local graph `plots' + return local labels `"`xlabels'"' + return local eqlabels `"`eqlabels'"' + return local groups `"`groups'"' + return local headings `"`hlbls'"' + return local legend `"`legendlbls' `legendorder'"' + return scalar n_plots = `N_plots' + return scalar n_subgr = `n_subgr' + return scalar n_ci = `N_ci' +end + +program parse_subgraphs // input: "subgr || subgr ..., opts" + local i 0 + local empty 1 + while (`"`macval(0)'"'!="") { + gettoken subgraph 0 : 0, parse("|") bind + if `"`macval(subgraph)'"'=="|" { + gettoken subgraph 0 : 0, parse("|") bind + if `"`macval(subgraph)'"'!="|" error 198 // require "||" + if `empty' { + local ++i + c_local subgr_`i' "." // use active model + } + else local empty 1 + continue + } + if `"`0'"'=="" { // get opts if last + _parse comma subgraph opts : subgraph + } + if `"`macval(subgraph)'"'!="" { // skip last if empty + local empty 0 + local ++i + c_local subgr_`i' `"`macval(subgraph)'"' + } + } + if `i'==0 { // check if empty + local i 1 + c_local subgr_1 "." // use active model + } + c_local n_subgr `i' + c_local opts `macval(opts)' +end + +program parse_globalopts + syntax [, /// + /// globalopts + HORizontal /// + VERTical /// + sort SORT2(str) /// + orderby(str) /// + order(str asis) /// + BYCoefs /// + noRECycle /// + grid(str) /// + noOFFsets /// + format(str) /// + noLABels /// + COEFLabels(str asis) /// + NOEQLABels /// + EQLabels(str asis) /// + eqstrict /// + HEADings(str asis) /// + GROUPs(str asis) /// + PLOTLabels(str asis) /// + bylabels(str asis) /// + GENerate GENerate2(name) /// + RELOCate(str asis) /// + replace /// + addplot(str asis) /// + NODROP /// + LEGend(passthru) /// + BYOPts(str asis) /// + Bname(passthru) /// so that b() is not b1title() + rename(passthru) /// + EQREName(passthru) /// + PCYCle(int 15) /// + /// twoway options not captured by _get_gropts, gettwoway + play(passthru) /// + XOVERHANGs /// + YOVERHANGs /// + fxsize(passthru) /// + fysize(passthru) /// + * /// + ] + _get_gropts, graphopts(`options') gettwoway + local twopts `s(twowayopts)' `play' `xoverhangs' `yoverhangs' `fxsize' `fysize' + local opts0 `bname' `macval(rename)' `macval(eqrename)' `s(graphopts)' + if `"`sort'`sort2'"'!="" { + parse_sort `sort2' // returns local sort + } + if `"`orderby'"'!="" { + parse_orderby `orderby', `recycle' // returns local orderby + } + if `"`generate'"'!="" & `"`generate2'"'=="" { + local generate "__" + } + else local generate `"`generate2'"' + if `"`grid'"'!="" { + parse_grid, `grid' // returns local grid, gridopts + } + if `"`coeflabels'"'!="" { + parse_coeflabels `coeflabels' + // returns coeflabels, cltrunc, clwrap, clbreak, clinteract, clangle, clopts + } + if `"`clinteract'"'=="" { + local clinteract `"" # ""' + } + parse_eqlabels "`noeqlabels'" `eqlabels' + // returns eqlabels, eqashead, eqxlab + // if eqashead=="": also eqgap, eqwrap, eqtrunc, eqbreak, eqopts + // if eqashead!="": also hoff, hgap, hwrap, htrunc, hbreak, hopts + if `"`headings'"'!="" { + if `"`eqashead'"'!="" { + di as err "eqlabels(, asheadings) and headings() not both allowed" + exit 198 + } + parse_headings `headings' // returns headings, hoff, hgap, hopts + } + else if `"`hgap'"'=="" local hgap 0 + if `"`eqashead'"'!="" { + if "`bycoefs'"!="" { + di as err "eqlabels(, asheadings) and bycoefs not both allowed" + exit 198 + } + } + if `"`groups'"'!="" { + parse_groups `groups' // returns groups, ggap, gwrap, gtrunc, gbreak, gopts + } + else local ggap 0 + if `"`plotlabels'"'!="" { + parse_plotlabels `plotlabels' // returns plotlabels, plwrap, pltrunc, plbreak + } + if `"`bylabels'"'!="" { + parse_bylabels `bylabels' // returns bylabels, blwrap, bltrunc, blbreak + } + if `"`format'"'!="" { + confirm numeric format `format' + } + if `"`horizontal'"'!="" { + if `"`vertical'"'!="" { + di as err "horizontal and vertical not both allowed" + exit 198 + } + } + if `"`addplot'"'!="" { + parse_addplot `addplot' // returns addplot, addplotbelow + } + parse_byopts, `byopts' // returns bylegend, byopts + foreach opt in /// + horizontal /// + vertical /// + sort /// + orderby /// + order /// + bycoefs /// + recycle /// + grid gridopts /// + offsets /// + format /// + labels /// + coeflabels cltrunc clwrap clbreak clinteract clangle clopts /// + noeqlabels /// + eqlabels eqashead eqxlab eqgap eqtrunc eqwrap eqbreak eqopts /// + eqstrict /// + headings hxlab hoff hgap htrunc hwrap hbreak hopts /// + groups ggap gtrunc gwrap gbreak gopts /// + plotlabels plwrap pltrunc plbreak /// + bylabels blwrap bltrunc blbreak /// + relocate /// + generate /// + replace /// + addplot addplotbelow /// + nodrop /// + legend /// + bylegend /// + byopts /// + { + c_local `opt' `"``opt''"' + } + c_local pcycle `pcycle' + c_local twopts `twopts' + merge_subgropts, `macval(opts0)' + c_local subgropts0 `subgropts' + c_local plotopts0 `plotopts1' + c_local modelopts0 `macval(modelopts1)' + c_local twplotopts0 `twplotopts1' +end + +program parse_sort + syntax [anything] [, Descending by(str) ] + if `"`anything'"'=="" { + local subgr . + local plot . + } + else { + gettoken subgr rest : anything, parse(":") + if `"`rest'"'=="" { // sort(#) + local plot `"`subgr'"' + local subgr . + } + else if `"`subgr'"'==":" { // sort(:#) + local subgr . + gettoken plot rest : rest + } + else { // sort(#:#) + gettoken colon rest : rest, parse(":") + if `"`colon'"'!=":" { + di as err "sort(): invalid syntax" + exit 198 + } + gettoken plot rest : rest + } + if `"`rest'"'!="" { + di as err "sort(): invalid syntax" + exit 198 + } + foreach t in subgr plot { + if `"``t''"'=="" local `t' . + else if `"``t''"'!="." { + capt confirm integer number ``t'' + if _rc==0 { + local rc = (``t''<=0) + } + else local rc 1 + if `rc' { + di as err "sort(): invalid syntax" + exit 198 + } + } + } + } + capt parse_sort_by, `by' + if _rc { + di as err `"sort(): '`by'' not allowed in by()"' + exit 198 + } + local descending = ("`descending'"!="") + c_local sort `"`subgr' `plot' `descending' "`by'""' +end +program parse_sort_by + syntax [, b v se t tabs df p ll ul aux * ] + local by `b' `v' `se' `t' `tabs' `df' `p' `ll' `ul' `aux' + if `: list sizeof by'>1 exit 198 + if inlist("`by'","ll", "ul", "aux") { // by(ll/ul/aux #) + if `"`options'"'=="" local by `by' 1 + else { + capt confirm integer number `options' + if _rc==0 { + local rc = (`options'<=0) + } + else local rc 1 + if `rc' exit 198 + local by `by' `options' + } + } + else if `"`options'"'!="" exit 198 + if `"`by'"'=="" local by b + c_local by `by' +end + +program parse_orderby + syntax [anything] [, norecycle ] + gettoken subgr rest : anything, parse(":") + if `"`rest'"'=="" { // orderby(#) + local plot `"`subgr'"' + local subgr 1 + } + else if `"`subgr'"'==":" { // ordeby(:#) + local subgr 1 + gettoken plot rest : rest + } + else { // orderby(#:#) + gettoken colon rest : rest, parse(":") + if `"`colon'"'!=":" { + di as err "orderby(): invalid syntax" + exit 198 + } + if "`recycle'"!="" { + di as err "orderby(): subgraph not allowed with norecycle" + exit 198 + } + gettoken plot rest : rest + } + if `"`rest'"'!="" { + di as err "orderby(): invalid syntax" + exit 198 + } + foreach t in subgr plot { + if `"``t''"'=="" local `t' 1 + else { + capt confirm integer number ``t'' + if _rc==0 { + local rc = (``t''<=0) + } + else local rc 1 + if `rc' { + di as err "orderby(): invalid syntax" + exit 198 + } + } + } + if "`recycle'"!="" local subgr . + c_local orderby `subgr' `plot' +end + +program parse_grid + syntax [, Between Within None * ] + if ("`between'"!="") + ("`within'"!="") + ("`none'"!="") > 1 { + di as err "grid(): only one of between, within, and none allowed" + exit 198 + } + c_local grid `between' `within' `none' + c_local gridopts `options' +end + +program parse_coeflabels + mata: coefplot_parsecomma("coeflabels", "0", "0") + syntax [, Truncate(numlist integer max=1 >0) /// + Wrap(numlist integer max=1 >0) noBreak /// + Interaction(str asis) angle(passthru) * ] + c_local coeflabels `"`coeflabels'"' + c_local cltrunc `truncate' + c_local clwrap `wrap' + c_local clbreak `break' + c_local clinteract `"`interaction'"' + c_local clangle `angle' + c_local clopts `options' +end + +program parse_eqlabels + gettoken noeqlabels 0 : 0 + mata: st_local("0", strltrim(st_local("0"))) + mata: coefplot_parsecomma("eqlabels", "0", "0") + syntax [, LABels LABels2(str asis) /// + OFFset(real 0) ASHEADings noGap Gap2(numlist max=1) /// + Truncate(numlist integer max=1 >0) /// + Wrap(numlist integer max=1 >0) noBreak * ] + if "`labels'"!="" & `"`labels2'"'=="" { + local labels2 `"" # ""' + } + if "`gap'"!="" local gap2 0 + else if "`gap2'"=="" { + if "`noeqlabels'"!="" local gap2 0 + else local gap2 1 + } + if "`asheadings'"!="" { + c_local hoff `offset' + c_local hgap `gap2' + c_local htrunc `truncate' + c_local hwrap `wrap' + c_local hbreak `break' + c_local hopts `options' + c_local eqgap 0 + } + else { + if `offset'!=0 { + di as err "eqlabels(): offset() only allowed with asheadings" + exit 198 + } + c_local eqgap `gap2' + c_local eqtrunc `truncate' + c_local eqwrap `wrap' + c_local eqbreak `break' + c_local eqopts `options' + } + c_local eqxlab `"`labels2'"' + c_local eqlabels `"`eqlabels'"' + c_local eqashead `asheadings' +end + +program parse_headings + mata: coefplot_parsecomma("headings", "0", "0") + syntax [, OFFset(real 0) noGap Gap2(real 1) /// + Truncate(numlist integer max=1 >0) /// + Wrap(numlist integer max=1 >0) noBreak * ] + if "`gap'"!="" local gap2 0 + c_local headings `"`headings'"' + c_local hoff `offset' + c_local hgap `gap2' + c_local htrunc `truncate' + c_local hwrap `wrap' + c_local hbreak `break' + c_local hopts `options' +end + +program parse_groups + mata: coefplot_parsecomma("groups", "0", "0") + syntax [, noGap Gap2(real 1) /// + Truncate(numlist integer max=1 >0) /// + Wrap(numlist integer max=1 >0) noBreak * ] + if "`gap'"!="" local gap2 0 + c_local groups `"`groups'"' + c_local ggap `gap2' + c_local gtrunc `truncate' + c_local gwrap `wrap' + c_local gbreak `break' + c_local gopts `options' +end + +program parse_plotlabels + mata: coefplot_parsecomma("plotlabels", "0", "0") + syntax [, Truncate(numlist integer max=1 >0) /// + Wrap(numlist integer max=1 >0) noBreak ] + c_local plotlabels `"`plotlabels'"' + c_local pltrunc `truncate' + c_local plwrap `wrap' + c_local plbreak `break' +end + +program parse_bylabels + mata: coefplot_parsecomma("bylabels", "0", "0") + syntax [, Truncate(numlist integer max=1 >0) /// + Wrap(numlist integer max=1 >0) noBreak ] + c_local bylabels `"`bylabels'"' + c_local bltrunc `truncate' + c_local blwrap `wrap' + c_local blbreak `break' +end + +program parse_addplot + _parse expand addplot addplotopts : 0 , /// + common(below by() nodraw draw name() SAVing() play()) + forv i=1/`addplot_n' { + local addplot `addplot' (`addplot_`i'') + } + local addplot `addplot' `addplotopts_if' `addplotopts_in' + _parse combop addplotopts_op : addplotopts_op, option(below) opsin rightmost + parse_addplotopts, `addplotopts_op' // returns below, options + if `"`options'"'!="" { + local addplot `addplot', `options' + } + c_local addplot `addplot' + c_local addplotbelow `below' +end +program parse_addplotopts + syntax [, below by(passthru) NODRAW draw name(passthru) /// + SAVing(passthru) play(passthru) * ] + foreach opt in nodraw draw { + if `"``opt''"'!="" { + di as err "`opt' not allowed within addplot()" + exit 198 + } + } + foreach opt in by name saving play { + if `"``opt''"'!="" { + di as err "`opt'() not allowed within addplot()" + exit 198 + } + } + local options: subinstr local options "below" "", all word // to be sure + c_local below `below' + c_local options `options' +end + +program parse_byopts + syntax [, LEGend(passthru) * ] + c_local bylegend `legend' + c_local byopts `options' +end + +program merge_subgropts + merge_plotopts `macval(0)' // returns modelopts2, plotopts, options, _opts0 + _merge_subgropts, `options' + _merge_subgropts _opt0_, `_opts0' + if `"`_opt0_options'"'!="" error 198 + if `"`bylabel'"'!="" { + c_local subgropts `bylabel' + } + else { + c_local subgropts `_opt0_bylabel' + } + c_local modelopts1 `macval(modelopts2)' + c_local plotopts1 `plotopts' + c_local twplotopts1 `options' +end +program _merge_subgropts + syntax [anything] [, BYLABel(passthru) * ] + c_local `anything'bylabel `bylabel' + c_local `anything'options `options' +end + +program parse_subgropts + syntax anything [, BYLABel(str asis) ] + gettoken lbl rest : bylabel, qed(qed) // remove outer quotes + if `"`lbl'"'!="" & `"`rest'"'=="" & `qed' { + local bylabel `"`lbl'"' + } + mata: coefplot_add_label(COEFPLOT_STRUCT, "by", `anything', "bylabel", 0) +end + +program parse_plots // input: "j (plot) (plot) ..., opts" + gettoken j 0 : 0 + _parse comma 0 opts : 0 // get opts + gettoken comma opts : opts, parse(",") // strip comma + local i 0 + while (`"`macval(0)'"'!="") { + gettoken plot 0: 0, match(hasparen) + local estexpand 0 // expand wildcards? + if `"`hasparen'"'=="" { // - not if "(...)" + if strpos(`"`plot'"',"(")==0 { // - not it "mat(...)" + if strpos(`"`plot'"',"*") | strpos(`"`plot'"',"?") { + local estexpand 1 + } + } + } + if `estexpand' { + qui estimates dir `plot' + foreach plot in `r(names)' { + local ++i + c_local plot_`j'_`i' `"`macval(plot)'"' + } + } + else { + local ++i + c_local plot_`j'_`i' `"`macval(plot)'"' + } + } + if `i'==0 { // check if empty + local i 1 + c_local plot_`j'_1 "." // use active model + } + c_local n_plots_`j' `i' + c_local opts `macval(opts)' +end + +program parse_get_popt_i + gettoken i 0 : 0, parse(",") + syntax [, p`i'(str asis) * ] + c_local plotopts `macval(p`i')' + c_local twplotopts0 `macval(options)' +end + +program combine_plotopts + syntax [, _opts0(str asis) * ] + _merge_plotopts, `macval(options)' + _merge_plotopts _opt0_, `macval(_opts0)' + if `"`mlabels'"'!="" local _opt0_mlabel + if `"`mlabel'"'!="" local _opt0_mlabels + if `"`cismooths'"'!="" local _opt0_cismooth + if `"`cismooth'"'!="" local _opt0_cismooths + if `"`nokey'`key'`key2'"'!="" { + local _opt0_nokey + local _opt0_key + local _opt0_key2 + } + local 0 + foreach opt of local opts { // opts is set by _merge_plotopts + if `"``opt''"'!="" { + local 0 `0' ``opt'' + } + else { + local 0 `0' `_opt0_`opt'' + } + } + c_local plotopts `0' + c_local options `macval(options)' +end + +program merge_plotopts + merge_modelopts `macval(0)' // returns modelopts, mlabels2, options, _opts0 + _merge_plotopts, `options' + _merge_plotopts _opt0_, `_opts0' + if `"`mlabels'"'!="" local _opt0_mlabel + if `"`mlabel'"'!="" local _opt0_mlabels + if `"`mlabels'`mlabel'"'!="" local mlabels2 + if `"`cismooths'"'!="" local _opt0_cismooth + if `"`cismooth'"'!="" local _opt0_cismooths + if `"`nokey'`key'`key2'"'!="" { + local _opt0_nokey + local _opt0_key + local _opt0_key2 + } + local 0 + foreach opt of local opts { // opts is set by _merge_plotopts + if `"``opt''"'!="" { + local 0 `0' ``opt'' + } + else { + local 0 `0' `_opt0_`opt'' + } + } + c_local modelopts2 `macval(modelopts)' `mlabels2' + c_local plotopts `0' + c_local options `options' + c_local _opts0 `_opt0_options' +end + +program _merge_plotopts + syntax [anything] [, /// + LABel(passthru) /// + offset(passthru) /// + PSTYle(passthru) /// + AXis(passthru) /// + recast(passthru) /// + MLabels MLabel(passthru) /// + MLABVposition(passthru) /// + cionly /// + citop /// + CISmooths CISmooth(passthru) /// + CIOPts(passthru) /// + CIREcast(passthru) /// + IFopt(passthru) /// + Weightopt(passthru) /// + NOKEY key KEY2(passthru) /// + * ] + if `"`mlabel'"'!="" local mlabels + if `"`cismooth'"'!="" local cismooths + local opts /// + label /// + offset /// + pstyle /// + axis /// + recast /// + mlabels mlabel /// + mlabvposition /// + cionly /// + citop /// + cismooths cismooth /// + ciopts /// + cirecast /// + ifopt /// + weightopt /// + nokey key key2 + foreach opt of local opts { + c_local `anything'`opt' ``opt'' + } + c_local `anything'options `options' + c_local opts `opts' +end + +program parse_plotopts + syntax anything [, /// + LABel(str asis) /// + offset(str asis) /// + PSTYle(passthru) /// + AXis(numlist integer max=1 >0 <10) /// + recast(str) /// + MLabels MLabel(passthru) /// + MLABVposition(passthru) /// + cionly /// + citop /// + CISmooths CISmooth(str asis) /// + CIOPts(str asis) /// + CIREcast(str) /// + IFopt(str asis) /// + Weightopt(str asis) /// + NOKEY key KEY2(str) /// + ] + if `"`label'"'!="" { + gettoken lbl rest : label, qed(qed) // remove outer quotes + if `"`lbl'"'!="" & `"`rest'"'=="" & `qed' { + local label `"`lbl'"' + } + mata: coefplot_add_label(COEFPLOT_STRUCT, "plot", `anything', "label", 1) + } + if `"`mlabels'"'!="" local mlabel mlabel(@b) + if `"`cismooths'"'!="" local cismooth cismooth + if `"`cirecast'"'!="" local cirecast recast(`cirecast') + if `"`offset'"'!="" { + capt parse_offset `offset' + if _rc { + di as err `"invalid offset(): `offset'"' + exit 198 + } + } + if `"`ifopt'"'!="" local ifopt `" & (`ifopt')"' + if `"`weightopt'"'!="" local weightopt `" [aw=`weightopt']"' + local key0 0 // default + if `"`nokey'"'!="" local key0 -1 // suppress key + if `"`key'`key2'"'!="" { + if `key0'<0 { + di as err "nokey and key() not both allowed" + exit 198 + } + if `"`key2'"'!="" { + gettoken key2ci key2 : key2 + if `"`key2ci'"'!="ci" { + di as err "invalid syntax in key()" + exit 198 + } + if `"`key2'"'!="" { + capt confirm integer number `key2' + if _rc==0 { + capt assert (`key2'>0) + } + if _rc { + di as err "invalid syntax in key()" + exit 198 + } + } + else local key2 1 + local key0 `key2' + } + } + local key `key0' + foreach opt in /// + offset /// + pstyle /// + axis /// + recast /// + mlabel /// + mlabvposition /// + cionly /// + citop /// + cismooth /// + ciopts /// + cirecast /// + ifopt /// + weightopt /// + key /// + { + c_local `opt'_`anything' `"``opt''"' + } +end + +program parse_offset + local offset = `0' + local 0 `", offset(`offset')"' + syntax [, offset(numlist max=1) ] + c_local offset `offset' +end + +program parse_models // input: "j k model \ model ..., opts" + gettoken j 0 : 0 + gettoken k 0 : 0 + local i 0 + local empty 1 + while (`"`macval(0)'"'!="") { + gettoken model 0 : 0, parse("\") bind + if `"`macval(model)'"'=="\" { + if `empty' { + local ++i + c_local model_`j'_`k'_`i' "." // use active model + } + else local empty 1 + continue + } + _parse comma model opts : model + if `"`macval(0)'"'=="" { // get plotopts if last + gettoken comma plotopts : opts, parse(",") // strip comma + local opts + } + if `"`model'`macval(opts)'"'!="" { // skip last if empty + local empty 0 + if strpos(`"`model'"',"(") { // mat(...) + local ++i + c_local model_`j'_`k'_`i' `"`model'`macval(opts)'"' + } + else { + if `"`model'"'=="" local model . + foreach ename of local model { + if strpos(`"`ename'"',"*") | strpos(`"`ename'"',"?") { + qui estimates dir `ename' + local ename `"`r(names)'"' + } + foreach mm of local ename { + local ++i + c_local model_`j'_`k'_`i' `"`mm'`macval(opts)'"' + } + } + } + } + } + if `i'==0 { // check if empty + local i 1 + c_local model_`j'_`k'_1 "." // use active model + } + c_local n_models_`j'_`k' `i' + c_local opts `macval(plotopts)' +end + +program parse_model // input: "name, opts" or "matrix(name[...]), opts" + _parse comma 0 opts : 0 + gettoken comma opts : opts, parse(",") // strip comma + capt parse_model_matrix, `0' // returns model, matrix + if _rc { + gettoken model rest : 0 + if `"`rest'"'!="" { + di as err `"`rest' not allowed"' + exit 198 + } + if `"`model'"'=="" local model . + } + c_local model `"`model'"' + c_local matrix `"`matrix'"' + c_local opts `macval(opts)' +end +program parse_model_matrix + syntax, Matrix(str) + gettoken model : matrix, parse(" [") + if `"`model'"'=="" error 198 + c_local model `"`model'"' + c_local matrix `"`matrix'"' +end + +program merge_modelopts + syntax [, _opts0(str asis) * ] + _merge_modelopts, `macval(options)' + _merge_modelopts _opt0_, `macval(_opts0)' + if `"`sename'"'!="" local _opt0_vname + if `"`vname'"'!="" local _opt0_sename + if `"`asequation'"'!="" local _opt0_asequation2 + local 0 + foreach opt of local opts { // opts is set by _merge_modelopts + if `"``opt''"'!="" { + if "`opt'"=="mlabels2" { + c_local mlabels2 ``opt'' + } + else { + local 0 `macval(0)' `macval(`opt')' + } + } + else { + if "`opt'"=="mlabels2" { + c_local mlabels2 `_opt0_`opt'' + } + else { + local 0 `macval(0)' `macval(_opt0_`opt')' + } + } + } + c_local modelopts `macval(0)' + c_local options `options' + c_local _opts0 `_opt0_options' +end +program _merge_modelopts + syntax [anything] [, /// + OMITted /// + BASElevels /// + Bname(passthru) /// + ATname ATname2(passthru) /// + SWAPnames /// + keep(passthru) /// + drop(passthru) /// + rename(passthru) /// + EQREName(passthru) /// + ASEQuation ASEQuation2(passthru) /// + eform EFORM2(passthru) /// + rescale(passthru) /// + TRANSform(passthru) /// + MLABELS2(passthru) /// + noci /// + Levels(passthru) /// + CIname(passthru) /// + Vname(passthru) /// + SEname(passthru) /// + DFname(passthru) /// + citype(passthru) /// + aux(passthru) /// + * ] + if "`atname'"!="" & `"`atname2'"'=="" local atname2 "atname2(at)" + if `"`asequation2'"'!="" local asequation + if "`eform'"!="" & `"`eform2'"'=="" local eform2 "eform2(*)" + if `"`sename'"'!="" & `"`vname'"'!="" { + di as err "se() and v() not both allowed" + exit 198 + } + local opts /// + omitted /// + baselevels /// + bname /// + atname2 /// + swapnames /// + keep /// + drop /// + rename /// + eqrename /// + asequation /// + asequation2 /// + eform2 /// + rescale /// + transform /// + mlabels2 /// + ci /// + levels /// + ciname /// + vname /// + sename /// + dfname /// + citype /// + aux + foreach opt of local opts { + c_local `anything'`opt' `macval(`opt')' + } + c_local `anything'options `options' + c_local opts `opts' +end + +program collect_coefs + gettoken model 0 : 0 + gettoken matrix 0 : 0 // matrix mode? + gettoken atmode 0 : 0 // whether at() is used + gettoken i 0 : 0 // plot number + gettoken j 0 : 0 // subgraph number + gettoken cis 0 : 0 // cismooth levels + + // get options + merge_modelopts `macval(0)' // returns modelopts, mlabels2, options, _opts0 + local 0 , `macval(modelopts)' `mlabels2' `options' `_opts0' + syntax [, /// + OMITted /// + BASElevels /// + Bname(str) /// + ATname2(str) /// + SWAPnames /// + keep(str asis) /// + drop(str asis) /// + rename(str asis) /// + EQREName(str asis) /// + ASEQuation ASEQuation2(str) /// + EFORM2(str asis) /// + rescale(str asis) /// + TRANSform(str asis) /// + MLABELS2(str asis) /// + noci /// + Levels(numlist) /// + CIname(str asis) /// + Vname(str) /// + SEname(str) /// + DFname(str) /// + citype(str) /// + aux(str) /// + ] + if `"`atname2'"'!="" { + if "`atmode'"=="0" { + di as err "must specify at for all or none" + exit 198 + } + local atmode 1 + parse_at_transform `atname2' // replaces atname2, returns attransform + capt parse_at_is_matrix, `atname2' // syntax at(matrix(...)) + } + else { + if "`atmode'"=="1" { + di as err "must specify at for all or none" + exit 198 + } + local atmode 0 + } + if `"`macval(rename)'"'!="" { + parse_rename `macval(rename)' + } + if `"`macval(eqrename)'"'!="" { + parse_eqrename `macval(eqrename)' + } + if "`cis'"!="" local ci // disable noci + parse_cilevels `"`levels'"' `"`ciname'"' "`cis'" // returns levels, ciname + parse_citype, `citype' // replaces citype + if `"`matrix'"'!="" local bname `"`matrix'"' + if "`asequation'"!="" & `"`asequation2'"'=="" { + if "`model'"=="." local asequation2 "_" + else local asequation2 `"`model'"' + } + if `"`aux'"'!="" { + parse_aux `aux' // returns aux + } + // collect results + local empty 0 + local equation + mata: coefplot_keepdrop(COEFPLOT_STRUCT) // returns empty, n_ci, equation + if `empty' { + local n_ci 0 + di as txt /// + `"(`model': no coefficients found, all dropped, or none kept)"' + } + + // returns + c_local equation `equation' + c_local atmode `atmode' + c_local n_ci `n_ci' + if `"`mlabels2'"'!="" { + c_local mlabel_`i' mlabel(@mlbl) + c_local mlabvposition_`i' mlabvposition(@mlpos) + } +end + +program parse_at_transform + syntax [anything] [, Transform(str) ] + if `"`anything'"'=="" local anything at + c_local atname2 `"`anything'"' + c_local attransform `"`transform'"' +end + +program parse_at_is_matrix + syntax, Matrix(str) + c_local atname2 `"`matrix'"' + c_local atismatrix "matrix" +end + +program parse_rename + mata: coefplot_parsecomma("rename", "0", "0") + syntax [, Regex] + c_local `eq'rename `"`macval(rename)'"' + c_local `eq'renameregex `regex' +end + +program parse_eqrename + mata: coefplot_parsecomma("rename", "0", "0") + syntax [, Regex] + c_local eqrename `"`macval(rename)'"' + c_local eqrenameregex `regex' +end + +program parse_aux // remove spaces in aux() + gettoken s 0 : 0, bind + while (`"`s'"'!="") { + local s = subinstr(`"`s'"', " ", "", .) + if substr(`"`s'"', 1, 1)=="[" { + local aux `aux'`s' + } + else { + local aux `aux' `s' + } + gettoken s 0 : 0, bind + } + c_local aux `"`aux'"' +end + +program parse_citype + local citypes logit probit atanh log + syntax [, `citypes' NORMal ] + local citype `logit' `probit' `atanh' `log' `normal' + if `: list sizeof citype'>1 { + di as err "citype(): only one of logit, probit, atanh, log, and normal allowed" + exit 198 + } + local citype: list posof "`citype'" in citypes + c_local citype `citype' +end + +program parse_cilevels + args levels names cis + if "`cis'"!="" { + foreach level of local cis { + local ll `ll' `level' + local nn `"`nn'`space'"""' + local space " " + } + } + while (1) { + gettoken l levels : levels + gettoken n names : names, match(paren) + if `"`l'`n'"'=="" { + continue, break + } + if `"`n'"'=="" { + parse_cilevel, levels(`l') // returns level + local ll `ll' `level' + local nn `"`nn'`space'"""' + } + else { + capt confirm number `n' + if _rc { + gettoken empty : n + if `"`empty'"'=="" { // set default level + parse_cilevel // returns level + local ll `ll' `level' + } + else { + local ll `ll' . + } + local nn `"`nn'`space'`"`n'"'"' + } + else { + parse_cilevel, levels(`n') // returns level + local ll `ll' `level' + local nn `"`nn'`space'"""' + } + } + local space " " + } + if `"`ll'"'=="" { // set default level + parse_cilevel // returns level + local ll `level' + local nn `""""' + } + c_local levels `ll' + c_local ciname `"`nn'"' +end +program parse_cilevel + syntax [, level(cilevel) levels(numlist min=1 max=1 >0 <100) ] + if `"`levels'"'=="" { + c_local level `level' + } + else { + c_local level `levels' + } +end + +program parse_cismooth + syntax anything(name=j) [, Color(str) PSTYle(passthru) n(int 50) /// + Intensity(numlist min=2 max=2 >=0 <=100) /// + LWidth(numlist min=2 max=2 >=0 <=1000) ] + if `n'<4 { + di as err "cismooth(n()) must be >= 4" + exit 198 + } + if "`intensity'"!="" { + gettoken imin imax : intensity + } + else { + local imin = (1+3) / (ceil(`n'/2)+3) * 100 + local imax 100 + } + if "`lwidth'"!="" { + gettoken wmin wmax : lwidth + local lwidth + } + else { + local wmin 2 + local wmax 15 + } + local d = 100/`n' + local lmax = 100 - `d'/2 + forv i = 1/`n' { + if mod(`i',2)==0 { + local l = `d'/2 + (`i'/2-1)*`d' + } + else { + local l = `d'/2 + (`n'-`i'/2-.5)*`d' + } + local levels `levels' `=string(`l')' + local inten = (`imin' + (`imax'-`imin') / (ceil(`n'/2)-1) * /// + (ceil(`i'/2)-1))/100 + local intens `intens' `=string(`inten')' + local lw = 4 + (`l'-1)/(`lmax'-1) * (100-4) // if n=50 max lw is 25 + local lw = 100 / `lw' + local lw = `wmin' + (`lw'-1) / (25-1) * (`wmax'-`wmin') + local lwidth `lwidth' `=string(`lw')' + } + c_local cis_levels_`j' `levels' + c_local cis_n_`j' `n' + c_local cis_intens_`j' `intens' + c_local cis_lwidth_`j' `lwidth' + c_local cis_color_`j' `"`color'"' + c_local cis_pstyle_`j' `"`pstyle'"' +end + +program get_pstyle_id + syntax anything(name=i) [, PSTYle(str) ] + if `"`pstyle'"'=="" { + local id `i' + } + else { + local id = substr(`"`pstyle'"', 2, 2) // p##... + capt confirm number `id' + if _rc { + local id = substr(`"`pstyle'"', 2, 1) // p#... + capt confirm number `id' + } + if _rc { // invalid pstyle + local id `i' + } + } + c_local pstyle_id `id' +end + +program parse_ciopts_nocilwincr + syntax anything(name=i) [, recast(str) LWidth(str) * ] + if `"`recast'`lwidth'"'!="" { + c_local nocilwincr_`i' 1 + } +end + +program parse_ciopts_recast_pstyle + syntax [, recast(str) PSTYle(str) * ] + if `"`pstyle'"'!="" { + local options `options' pstyle(`pstyle') + } + c_local cirecast `"`recast'"' + c_local cipstyle `"`pstyle'"' + c_local ciopts `options' +end + +program set_pstyle + args i recast + if `"`recast'"'=="" { + c_local pstyle pstyle(p`i') + exit + } + if inlist(`"`recast'"', "line", "rline") /// + c_local pstyle pstyle(p`i'line) + else if inlist(`"`recast'"', "area", "rarea") /// + c_local pstyle pstyle(p`i'area) + else if inlist(`"`recast'"', "bar", "rbar") /// + c_local pstyle pstyle(p`i'bar) + else if inlist(`"`recast'"', "dot") /// + c_local pstyle pstyle(p`i'dot) + else c_local pstyle pstyle(p`i') +end + +program parse_ciopts + gettoken j 0 : 0 + gettoken n 0 : 0 + gettoken opt 0 : 0, bind + local opts + while (`"`opt'"'!="") { // get rid of possible spaces between opt and () + gettoken paren: opt, parse("(") + if `"`paren'"'=="(" { + local opts `opts'`opt' + } + else { + local opts `opts' `opt' + } + gettoken opt 0 : 0, bind + } + local ciopts `", `opts'"' + gettoken opt opts : opts, bind + local i 0 + while (`"`opt'"'!="") { + local ++i + gettoken optname optcontents : opt, parse("(") + if `"`optcontents'"'=="" { + gettoken opt opts : opts, bind + continue + } + _parse factor ciopts : ciopts, option(`optname') to(`optname'(X)) + gettoken opt opts : opts, bind + } + _parse factordot ciopts : ciopts, n(`n') + // _parse combine only works up to p20 + gettoken opt ciopts : ciopts // get rid of comma + gettoken opt ciopts : ciopts, bind // get first opt + while (`"`opt'"'!="") { + mata: coefplot_combine_ciopts() // appends opt_# or options + gettoken opt ciopts : ciopts, bind // get next opt + } + forv i=1/`n' { + c_local ciopts_`j'_`i' `opt_`i'' `options' + } +end + +program parse_mlabel_exp + syntax [ , MLabel(str asis) ] + c_local mlblexp `"`mlabel'"' +end + +program coeflbls + args labels interact + mata: coefplot_get_coefs(COEFPLOT_STRUCT) + local i 0 + foreach v of local coefs { + local ++i + if (`"`v'"'=="") continue // gap from order() + if (`"`v'"'==`"`last'"') { + mata: coefplot_add_label(COEFPLOT_STRUCT, "coef", `i', "coeflbl", 1) + continue + } + mata: coefplot_get_coeflbl(COEFPLOT_STRUCT, `i') + if `"`coeflbl'"'=="" { + if `"`labels'"'!="" { + local coeflbl `"`v'"' + } + else { + compile_xlabel, v(`v') interact(`interact') // returns coeflbl + } + } + mata: coefplot_add_label(COEFPLOT_STRUCT, "coef", `i', "coeflbl", 1) + } +end + +program compile_xlabel + syntax [, v(str) interact(str) ] + gettoken vi vrest: v, parse("#") + while (`"`vi'"') !="" { + local xlabi + if `"`vi'"'=="#" { + local xlabi `"`interact'"' + } + else if strpos(`"`vi'"',".")==0 { + capt confirm variable `vi', exact + if _rc==0 { + local xlabi: var lab `vi' + } + if `"`xlabi'"'=="" { + local xlabi `"`vi'"' + } + } + else { + gettoken li vii : vi, parse(".") + gettoken dot vii : vii, parse(".") + capt confirm variable `vii', exact + if _rc==0 & `"`vii'"'!="" { + capt confirm number `li' + if _rc { + local xlabi: var lab `vii' + if (`"`xlabi'"'=="") local xlabi `"`vii'"' + if (substr(`"`li'"',1,1)=="c") /// + local li = substr(`"`li'"',2,.) + if (`"`li'"'!="") local xlabi `"`li'.`xlabi'"' + } + else { + local viilab : value label `vii' + if `"`viilab'"'!="" { + local xlabi: label `viilab' `li' + } + else { + local viilab: var lab `vii' + if (`"`viilab'"'=="") local viilab `"`vii'"' + local xlabi `"`viilab'=`li'"' + } + } + } + if `"`xlabi'"'=="" { + local xlabi `"`vi'"' + } + } + local xlab `"`xlab'`xlabi'"' + gettoken vi vrest: vrest, parse("#") + } + c_local coeflbl `"`xlab'"' +end + +program set_by_and_plot_labels + args plot by + // plot + capt label drop `plot' + qui levelsof `plot', local(levels) + foreach l of local levels { + mata: coefplot_get_plotlbl(COEFPLOT_STRUCT, `l') // returns plotlbl + lab def `plot' `l' `"`plotlbl'"', add + } + lab val `plot' `plot', nofix + // by + capt label drop `by' + qui levelsof `by', local(levels) + foreach l of local levels { + mata: coefplot_get_bylbl(COEFPLOT_STRUCT, `l') // returns bylbl + lab def `by' `l' `"`bylbl'"', add + } + lab val `by' `by', nofix +end + +program get_axis_labels + args x eq grp grid groups + // eqlabels + qui levelsof `eq', local(levels) + local j 0 + foreach l of local levels { + local ++j + su `x' if `eq'==`l', meanonly + local pos = string(r(min) + (r(max)-r(min))/2) + local pos: list retok pos + mata: coefplot_get_eqlbl(COEFPLOT_STRUCT, `j') // returns eqlbl + local eqlabels `eqlabels' `pos' `"`eqlbl'"' + } + c_local eqlabels `"`eqlabels'"' + // groups + if `"`groups'"'!="" { + local j 0 + foreach glab of local groups { + local ++j + foreach l of local levels { // equations (from above) + su `x' if `grp'==`j' & `eq'==`l', mean + if r(N)>0 { + local pos = string(r(min) + (r(max)-r(min))/2) + local pos: list retok pos + local glbls `glbls' `pos' `"`glab'"' + } + } + } + c_local groups `glbls' + } + // ticks and xlabels + mata: coefplot_ticks_and_labels(COEFPLOT_STRUCT) + c_local xrange `xrange' + c_local xlabels `xlabels' + c_local xgrid `xgrid' +end + +program merge_eqlabels_hlbls + args eqlab hlab + gettoken lab eqlab : eqlab // skip value + gettoken lab eqlab : eqlab, quotes + while (`"`lab'"'!="") { + gettoken val hlab : hlab + local hlbls `"`hlbls'`val' `lab' "' + gettoken lab eqlab : eqlab // skip value + gettoken lab eqlab : eqlab, quotes + } + c_local hlbls `"`hlbls'"' + c_local eqlabels "" +end + +program truncwrap_vlabels + args v n trunc wrap break + forv i = 1/`n' { + local lbl: label `v' `i' + truncwrap_label lbl "`trunc'" "`wrap'" "`break'" `"`lbl'"' + // may fail if label contains compound quotes + lab def `v' `i' `"`lbl'"', modify + } +end + +program truncwrap_labels + args local trunc wrap break lbls + local labels + local skip 1 + foreach lbl of local lbls { + if `skip' { + local labels `labels' `lbl' + local skip 0 + continue + } + truncwrap_label lbl "`trunc'" "`wrap'" "`break'" `"`lbl'"' + // may fail if label contains compound quotes + local labels `labels' `"`lbl'"' + local skip 1 + } + c_local `local' `"`labels'"' +end + +program truncwrap_label + args local trunc wrap break lbl + capt mata: coefplot_lbl_is_multiline() // error if label is multiline + if _rc exit + if "`break'"!="" local break ", `break'" + if "`trunc'"!="" { + local lbl: piece 1 `trunc' of `"`lbl'"'`break' + capt truncwrap_label_check_quotes `"`lbl'"' + if _rc exit + } + if "`wrap'"!="" { + local i 0 + local space + while (1) { + local ++i + local piece: piece `i' `wrap' of `"`lbl'"'`break' + capt truncwrap_label_check_quotes `"`piece'"' + if _rc exit + if `"`piece'"'=="" { + if `i'==1 { + local newlbl `"`lbl'"' // lbl is empty + } + else if `i'==2 { // workaround for multiline label graph bug + local newlbl `"`newlbl'`space'"""' + } + continue, break + } + local newlbl `"`newlbl'`space'`"`piece'"'"' + local space " " + } + local lbl `"`newlbl'"' + } + c_local `local' `"`lbl'"' +end +program truncwrap_label_check_quotes // checks for unmatched compound quotes + syntax [anything] +end + +program set_labels + args v n lbls + local i 0 + foreach lbl of local lbls { + local ++i + if `i'>`n' continue, break + lab def `v' `i' `"`lbl'"', modify + } +end + +program reset_xlabels + args lbls xlbls + local labels + local skip 1 + foreach lbl of local xlbls { + if `skip' { + local labels `labels' `lbl' + local skip 0 + continue + } + if `"`lbls'"'!="" { + gettoken lbl lbls : lbls + } + local labels `labels' `"`lbl'"' + local skip 1 + } + c_local xlabels `"`labels'"' +end + +version 11 +mata: +mata set matastrict on + +struct coefplot_struct +{ + real scalar r, xmin + + real colvector b, V, se, t, df, pval, at, plot, by, eq, grp, mlpos + real matrix ci, aux + + string colvector coefnm, eqnm, coeflbl, eqlbl, plotlbl, bylbl, mlbl, trans +} + +struct coefplot_struct scalar coefplot_struct_init() +{ + struct coefplot_struct scalar C + + return(C) +} + +void coefplot_keepdrop(struct coefplot_struct scalar C) +{ + real scalar i, j, level, r, brow, bcol, row, col, emode, + firsteqonly, meqs, citype + real colvector b, p, at, V, se, t, df, pval, mlpos + real matrix ci, aux, tmp + string scalar model, bname, cname, rename, attrans, attmp + string rowvector keep, drop, cnames, levels, llul + string colvector eqnm, coefnm, mlbl, trans + + // get results + emode = (st_local("matrix")=="") + // - coefficients + model = st_local("model") + bname = st_local("bname") + if (bname=="") { + if (st_global("e(mi)")=="mi") bname = "b_mi" + else bname = "b" + } + coefplot_parse_input(model, "b", bname, brow, bcol) + if (emode) bname = "e(" + bname + ")" + b = st_matrix(bname) + if (b==J(0,0,.)) { + st_local("empty", "1") + return + } + coefplot_invalid_subscript(model, bname, b, brow, bcol) + b = b[brow, bcol] + if (brow<.) { + b = b' + eqnm = st_matrixcolstripe(bname)[.,1] + coefnm = st_matrixcolstripe(bname)[.,2] + } + else { + eqnm = st_matrixrowstripe(bname)[.,1] + coefnm = st_matrixrowstripe(bname)[.,2] + } + _editvalue(eqnm, "", "_") + meqs = !allof(eqnm, eqnm[1]) + r = rows(b) + // - get variances and standard errors + se = J(r,1,.) + V = J(r,1,.) + if ((cname = st_local("sename"))!="") { + coefplot_parse_cname(model, "se", cname, row, col, emode, 0, bname, brow, bcol) + tmp = st_matrix(cname) + if (coefplot_notfound(model, cname, tmp)==0) { + coefplot_invalid_subscript(model, cname, tmp, row, col) + tmp = tmp[row, col] + if (row<.) tmp = tmp' + if (coefplot_notconformable(model, cname, tmp, r, 1)==0) { + se = tmp + V = tmp:^2 + } + } + } + else if ((cname = st_local("vname"))!="") { + if (emode) cname = "e(" + cname + ")" + tmp = st_matrix(cname) + if (coefplot_notfound(model, cname, tmp)==0) { + if (coefplot_notconformable(model, cname, tmp, r, r)==0) { + V = diagonal(tmp) + se = sqrt(V) + } + } + } + else if (emode){ + if (st_global("e(mi)")=="mi") cname = "e(V_mi)" + else cname = "e(V)" + tmp = st_matrix(cname) + if (coefplot_notfound(model, cname, tmp, 1)==0) { + if (coefplot_notconformable(model, cname, tmp, r, r, 1)==0) { + V = diagonal(tmp) + se = sqrt(V) + } + } + } + // - get DFs + df = J(r,1,.) + if ((cname = st_local("dfname"))!="") { + if (strtoreal(cname)<. | cname==".") { + df = J(r, 1, strtoreal(cname)) + } + else { + coefplot_parse_input(model, "df", cname, row, col) + if (emode) cname = "e(" + cname + ")" + tmp = st_matrix(cname) + if (coefplot_notfound(model, cname, tmp)==0) { + coefplot_invalid_subscript(model, cname, tmp, row, col) + tmp = tmp[row, col] + if (row<.) tmp = tmp' + if (coefplot_notconformable(model, cname, tmp, r, 1)==0) { + df = tmp + } + } + } + } + else if (emode) { + if ((st_global("e(mi)")=="mi") & + (tmp=st_matrix("e(df_mi)")')!=J(0,0,.)) { + if (coefplot_notconformable(model, "e(df_mi)", tmp, r, 1)==0) { + df = tmp + } + } + else if (st_numscalar("e(df_r)")!=J(0,0,.)) { + df = J(r, 1, st_numscalar("e(df_r)")) + } + } + // - CIs + ci = J(r, 0, .) + if (st_local("ci")=="") { + cnames = tokens(st_local("ciname")) + levels = tokens(st_local("levels")) + citype = strtoreal(st_local("citype")) + for (j=1; j<=cols(levels); j++) { + ci = ci, J(r, 2, .) + if ((cname = strtrim(cnames[j]))!="") { + if (cols(tokens(cname))==1) { // "name" + llul = (cname+"[1]", cname+"[2]") + } + else { + if (strpos(cname, "[")==0) { // "ll ul" + llul = tokens(cname) + if (cols(llul)!=2) { + printf("{txt}(%s: invalid syntax in %s)\n", + model, "ci()") + exit(error(198)) + } + } + else { + if (strpos(cname, "]")==strlen(cname)) { // "ll ul[]" + llul = (substr(cname, 1, strpos(cname, " ")-1), + substr(cname, strpos(cname, " ")+1, .)) + } + else { // "ll[] ul[]" + llul = (substr(cname, 1, strpos(cname, "]")), + substr(cname, strpos(cname, "]")+1, .)) + } + } + } + for (i=1; i<=2; i++) { + cname = llul[i] + coefplot_parse_cname(model, "ci", cname, row, col, emode, + 0, bname, brow, bcol) + tmp = st_matrix(cname) + if (coefplot_notfound(model, cname, tmp)==0) { + coefplot_invalid_subscript(model, cname, tmp, row, col) + tmp = tmp[row, col] + if (row<.) tmp = tmp' + if (coefplot_notconformable(model, cname, tmp, r, 1)==0) { + ci[,(j*2-2+i)] = tmp + } + } + } + } + else { + level = 1 - (1 - strtoreal(levels[j])/100)/2 + tmp = J(r, 1, .) + for (i=1; i<=r; i++) { + tmp[i] = df[i]>2e17 ? invnormal(level) : + invttail(df[i], 1-level) + } + if (citype==1) { // logit + tmp = tmp :* se :/ (b:* (1 :- b)) + ci[|1,(j*2-1) \ .,(j*2)|] = + invlogit((logit(b) :- tmp, logit(b) :+ tmp)) + } + else if (citype==2) { // probit + tmp = tmp :* se :/ normalden(invnormal(b)) + ci[|1,(j*2-1) \ .,(j*2)|] = + normal((invnormal(b) :- tmp, invnormal(b) :+ tmp)) + } + else if (citype==3) { // atanh + tmp = tmp :* se :/ (1 :- b:^2) // missing if b in {-1,1} + ci[|1,(j*2-1) \ .,(j*2)|] = + tanh((atanh(b) :- tmp, atanh(b) :+ tmp)) + } + else if (citype==4) { // log + tmp = tmp :* se :/ b + ci[|1,(j*2-1) \ .,(j*2)|] = exp((ln(b) :- tmp, ln(b) :+ tmp)) + } + else { // normal + ci[|1,(j*2-1) \ .,(j*2)|] = (b :- tmp:*se, b :+ tmp:*se) + } + } + } + } + // - at + at = J(r,1,1) + cname = st_local("atname2") + if ((cname!="") & (cname!="_coef") & (cname!="_eq")) { + if ( emode & + st_global("e(cmd)")=="margins" & + (st_local("bname")=="" | st_local("bname")=="b") & + (st_numscalar("e(k_at)")!=J(0,0,.) ? + st_numscalar("e(k_at)")>0 : 0) & + (cname=="at" | strtoreal(cname)<.) + ) + { + if (cname=="at") cname = "1" + at = coefplot_get_margins_at("e", strtoreal(cname), coefnm)' + // (modifies coefnm) + } + else { + coefplot_parse_cname(model, "at", cname, row, col, emode, + st_local("atismatrix")!="", bname, brow, bcol) + tmp = st_matrix(cname) + if (coefplot_notfound(model, cname, tmp)==0) { + coefplot_invalid_subscript(model, cname, tmp, row, col) + tmp = tmp[row, col] + if (row<.) tmp = tmp' + if (coefplot_notconformable(model, cname, tmp, r, 1)==0) { + at = tmp + } + } + } + } + // - auxiliary variables + cnames = tokens(st_local("aux")) // spaces in mspec not allowed + aux = J(r, cols(cnames), .) + for (j=1; j<=cols(cnames); j++) { + cname = cnames[j] + coefplot_parse_cname(model, "aux", cname, row, col, emode, 0, bname, brow, bcol) + tmp = st_matrix(cname) + if (coefplot_notfound(model, cname, tmp)==0) { + coefplot_invalid_subscript(model, cname, tmp, row, col) + tmp = tmp[row, col] + if (row<.) tmp = tmp' + if (coefplot_notconformable(model, cname, tmp, r, 1)==0) { + aux[,j] = tmp + } + } + } + + // keep, drop, etc. + // - clear "bn" + coefnm = subinstr(coefnm,"bn.", ".") // #bn. + coefnm = subinstr(coefnm,"bno.", "o.") // #bno. + // - remove omitted + p = J(r, 1, 1) + if (st_local("omitted")=="") { + p = p :* (!strmatch(coefnm, "*o.*")) + } + else { + coefnm = substr(coefnm, 1:+2*(substr(coefnm, 1, 2):=="o."), .) // o. + coefnm = subinstr(coefnm, "o.", ".") // #o. + } + // - remove baselevels + if (st_local("baselevels")=="") { + p = p :* (!strmatch(coefnm, "*b.*")) + } + else { + coefnm = subinstr(coefnm, "b.", ".") // #b. + } + // keep + firsteqonly = 1 + keep = st_local("keep") + if (keep!="") { + keep = coefplot_parse_namelist(keep, "", "keep") + if (!allof(keep[,1], "")) firsteqonly = 0 + keep[,1] = editvalue(keep[,1],"","*") + p = p :* (rowsum(strmatch(eqnm, keep[,1]') :& + strmatch(coefnm, keep[,2]')):>0) + } + // drop + drop = st_local("drop") + if (drop!="") { + drop = coefplot_parse_namelist(drop, "", "drop") + if (!allof(drop[,1], "")) firsteqonly = 0 + drop[,1] = editvalue(drop[,1],"","*") + p = p :* (!(rowsum(strmatch(eqnm, drop[,1]') :& + strmatch(coefnm, drop[,2]')))) + } + // equation + if (firsteqonly) { + for (i=1; i<=r; i++) { // look for first nonzero equation + if (p[i]==1) { + p = p :* (eqnm:==eqnm[i]) + break + } + } + } + // apply selection + if (allof(p, 0)) { + st_local("empty", "1") + return + } + b = select(b, p) + V = select(V, p) + se = select(se, p) + df = select(df, p) + ci = select(ci, p) + eqnm = select(eqnm, p) + coefnm = select(coefnm, p) + at = select(at, p) + aux = select(aux, p) + r = rows(b) + // t and p values + t = b:/se + pval = J(r,1,.) + for (i=1; i<=r; i++) { + pval[i] = (df[i]>=. ? 1-normal(abs(t[i])) : ttail(df[i],abs(t[i])))*2 + } + + // eform + coefplot_eform(b, ci, eqnm, coefnm) + + // rescale + coefplot_rescale(b, ci, eqnm, coefnm) + + // collect transforms + trans = coefplot_collect_transforms(eqnm, coefnm) + + // collect mlabels + mlbl = J(r,1,"") + mlpos = J(r,1,.) + coefplot_mlabels(mlbl, mlpos, eqnm, coefnm) + + // rename + rename = st_local("rename") + if (rename!="") { + coefplot_rename(rename, st_local("renameregex")!="", + eqnm, coefnm) // modifies coefnm + } + + // rename equations and swap names + if (st_local("asequation2")!="") { + eqnm = J(r, 1, st_local("asequation2")) + } + rename = st_local("eqrename") + if (rename!="") { + coefplot_rename(rename, st_local("eqrenameregex")!="", + J(r, 1, ""), eqnm) // modifies eqnm + } + + // at is coef or eq + if (st_local("atname2")=="_coef") { + at = strtoreal(coefnm) + } + else if (st_local("atname2")=="_eq") { + at = strtoreal(eqnm) + } + + // apply at transform + if ((attrans=st_local("attransform"))!="") { + attmp = st_tempname() + attrans = subinstr(attrans, "@", "scalar(" + attmp + ")") + for (i=1; i<=r; i++) { + st_numscalar(attmp, at[i]) + stata("scalar " + attmp + " = " + attrans) + at[i] = st_numscalar(attmp) + } + } + + // check missings + coefplot_missing(model, b) + for (j=1; j<=cols(levels); j++) { + coefplot_cimissing(model, j, ci[|1,(j*2-1) \ .,(j*2)|]) + } + coefplot_atmissing(model, at) + + // return + if (st_local("swapnames")!="") swap(coefnm, eqnm) + st_local("n_ci", strofreal(cols(ci)/2)) + if (cols(C.ci)>cols(ci)) { + ci = ci, J(rows(ci), cols(C.ci)-cols(ci), .) + } + else if (cols(C.ci)cols(aux)) { + aux = aux, J(rows(aux), cols(C.aux)-cols(aux), .) + } + else if (cols(C.aux)rows(b)) | (col<. & col>cols(b))) { + printf("{err}%s: invalid subscript for %s\n", model, opt) + exit(503) + } +} + +void coefplot_parse_input(string scalar model, string scalar opt, + string scalar s, real scalar row, real scalar col) +{ + transmorphic t + string scalar r, c + string rowvector tokens + + t = tokeninit(" ", ("[", "]", ",")) + tokenset(t, s) + tokens = tokengetall(t) + if (cols(tokens)>6) coefplot_parse_input_error(model, opt) + if (!st_isname(tokens[1])) coefplot_parse_input_error(model, opt) + s = tokens[1] + if (cols(tokens)==1) { // "name" + row = 1; col = . + return + } + if (cols(tokens)<4) coefplot_parse_input_error(model, opt) + if (tokens[2]!="[" | tokens[cols(tokens)]!="]") + coefplot_parse_input_error(model, opt) + if (cols(tokens)==4) { // name[#] + r = tokens[3] + c = "." + } + else if ((r=tokens[3])==",") { // name[,#] + if (cols(tokens)!=5) coefplot_parse_input_error(model, opt) + r = "." + c = tokens[4] + } + else { // name[#,] or name[#,.] or name[.,#] + if (tokens[4]!=",") coefplot_parse_input_error(model, opt) + r = tokens[3] + if (cols(tokens)==5) c = "." + else c = tokens[5] + } + if (((r==".") + (c=="."))!=1) coefplot_parse_input_error(model, opt) + if (r==".") row = . + else row = coefplot_parse_input_num(model,opt, r) + if (c==".") col = . + else col = coefplot_parse_input_num(model,opt, c) +} + +real scalar coefplot_parse_input_num(string scalar model, string scalar opt, + string scalar s) +{ + real scalar num + + num = strtoreal(s) + if (missing(num)) coefplot_parse_input_error(model, opt) + return(num) +} + +void coefplot_parse_input_error(string scalar model, string scalar opt) +{ + printf("{err}%s: invalid syntax in %s()\n", model, opt) + exit(198) +} + +void coefplot_parse_cname(string scalar model, string scalar opt, + string scalar cname, real scalar row, real scalar col, real scalar emode, + real scalar atismat, string scalar bname, real scalar brow, real scalar bcol) +{ + if (emode) { + coefplot_parse_input(model, opt, cname, row, col) + if (!atismat) cname = "e(" + cname + ")" + } + else { + if (coefplot_parse_input_isposint(cname)) { + row = brow; col = bcol + if (row<.) row = strtoreal(cname) + else col = strtoreal(cname) + cname = bname + } + else coefplot_parse_input(model, opt, cname, row, col) + } +} + +real scalar coefplot_parse_input_isposint(string scalar cname) +{ + real scalar n + + n = strtoreal(cname) + return(!missing(n) & n==trunc(n) & n>0) +} + +real scalar coefplot_notfound( + string scalar model, string scalar name, real matrix e, | real scalar q) +{ + if (e==J(0,0,.)) { + if (args()<4 | q==0) { + printf("{txt}(%s: %s not found)\n", model, name) + } + return(1) + } + return(0) +} + +real scalar coefplot_notconformable( + string scalar model, string scalar name, real matrix e, + real scalar r, real scalar c, | real scalar q) +{ + if (rows(e)!=r | cols(e)!=c) { + if (args()<6 |q==0) { + printf("{txt}(%s: %s not conformable)\n", model, name) + } + return(1) + } + return(0) +} + +void coefplot_eform(real colvector b, real matrix ci, string colvector eq, + string colvector coef) +{ + real scalar i + string matrix eform + real colvector match, p + + eform = st_local("eform2") + if (eform=="") { + return + } + if (eform=="*") { + b = exp(b) + ci = exp(ci) + return + } + eform = coefplot_parse_namelist(eform, "*", "eform") + match = J(rows(b), 1, 0) + for (i=1; i<=rows(eform); i++) { + p = select(1::rows(match), strmatch(eq, eform[i,1]) :& + strmatch(coef, eform[i,2])) + if (rows(p)==0) continue + match[p] = J(rows(p), 1, 1) + } + p = select(1::rows(match), match) + if (rows(p)==0) return + b[p] = exp(b[p]) + ci[p,] = exp(ci[p,.]) +} + +void coefplot_rescale(real colvector b, real matrix ci, string colvector eq, + string colvector coef) +{ + real scalar i, j + string matrix rescale, names + real colvector c, match, p + + rescale = st_local("rescale") + if (rescale=="") { + return + } + if (strtoreal(rescale)<.) { + c = strtoreal(rescale) + } + else { + rescale = coefplot_parse_matchlist(rescale, "rescale") + c = J(rows(b), 1, 1) + match = J(rows(b), 1, 0) + for (i=1; i<=rows(rescale); i++) { + if (strtoreal(rescale[i,2])>=.) { + display("{err}rescale(): invalid value") + exit(198) + } + names = coefplot_parse_namelist(rescale[i,1], "*", "rescale") + for (j=1; j<=rows(names); j++) { + p = select(1::rows(match), strmatch(eq, names[j,1]) :& + strmatch(coef, names[j,2]) :& (match:==0)) + if (rows(p)==0) continue + c[p] = J(rows(p), 1, strtoreal(rescale[i,2])) + match[p] = J(rows(p), 1, 1) + } + } + } + b = b :* c + ci = ci :* c +} + +string colvector coefplot_collect_transforms(string colvector eq, + string colvector coef) +{ + real scalar i, j + string matrix trans, names + string colvector T + real colvector match, p + + T = J(rows(eq), 1, "") + trans = st_local("transform") + if (trans=="") { + return(T) + } + trans = coefplot_parse_matchlist(trans, "transform") + match = J(rows(eq), 1, 0) + for (i=1; i<=rows(trans); i++) { + names = coefplot_parse_namelist(trans[i,1], "*", "transform") + for (j=1; j<=rows(names); j++) { + p = select(1::rows(match), strmatch(eq, names[j,1]) :& + strmatch(coef, names[j,2]) :& (match:==0)) + if (rows(p)==0) continue + T[p] = J(rows(p), 1, trans[i,2]) + match[p] = J(rows(p), 1, 1) + } + } + return(T) +} + +void coefplot_mlabels(string colvector mlbl, real colvector mlpos, + string colvector eq, string colvector coef) +{ + real scalar i, j + string matrix mlab, names + real colvector match, p + + mlab = st_local("mlabels2") + if (mlab=="") { + return + } + mlab = coefplot_parse_matchlist(mlab, "mlabels", 2) + match = J(rows(eq), 1, 0) + for (i=1; i<=rows(mlab); i++) { + names = coefplot_parse_namelist(mlab[i,1], "*", "mlabels") + for (j=1; j<=rows(names); j++) { + p = select(1::rows(match), strmatch(eq, names[j,1]) :& + strmatch(coef, names[j,2]) :& (match:==0)) + if (rows(p)==0) continue + mlbl[p] = J(rows(p), 1, mlab[i,3]) + mlpos[p] = J(rows(p), 1, strtoreal(mlab[i,2])) + match[p] = J(rows(p), 1, 1) + } + } +} + +void coefplot_rename(string scalar rename, real scalar regex, + string colvector eq, string colvector coef) +{ + real scalar i, j, rl + real colvector p, p0, match + string matrix names + + if (regex) { + rename = coefplot_parse_matchlist(rename, "rename") + p0 = 1::rows(coef) + for (i=1; i<=rows(rename); i++) { + names = coefplot_parse_namelist(rename[i,1], "*", "rename") + for (j=1; j<=rows(names); j++) { + if (rows(p0)==0) return + match = (strmatch(eq[p0], names[j,1]) :& regexm(coef[p0], names[j,2])) + p = select(p0, match) + if (rows(p)==0) continue + coef[p] = coefplot_regexr(coef[p], names[j,2], rename[i,2]) + p0 = select(p0, match:==0) + } + } + return + } + rename = coefplot_parse_matchlist(rename, "rename") + p0 = 1::rows(coef) + for (i=1; i<=rows(rename); i++) { + // syntax: *abc for suffix rename + // abc* for prefix rename + // abc for exact rename + names = coefplot_parse_namelist(rename[i,1], "*", "rename") + for (j=1; j<=rows(names); j++) { + if (rows(p0)==0) return + if (substr(names[j,2],1,1)=="*") { + rl = strlen(names[j,2])-1 + match = strmatch(eq[p0], names[j,1]) :& + (substr(coef[p0], -rl, .):==substr(names[j,2], -rl, .)) + p = select(p0, match) + if (rows(p)==0) continue + coef[p] = substr(coef[p], 1, strlen(coef[p]) :- rl) :+ rename[i,2] + } + else if (substr(names[j,2],-1,1)=="*") { + rl = strlen(names[j,2])-1 + match = strmatch(eq[p0], names[j,1]) :& + (substr(coef[p0], 1, rl):==substr(names[j,2], 1, rl)) + p = select(p0, match) + if (rows(p)==0) continue + coef[p] = rename[i,2] :+ substr(coef[p], 1 + rl, .) + } + else { + match = strmatch(eq[p0], names[j,1]) :& (coef[p0]:==names[j,2]) + p = select(p0, match) + if (rows(p)==0) continue + coef[p] = J(rows(p), 1, rename[i,2]) + } + p0 = select(p0, match:==0) + } + } +} + +string matrix coefplot_regexr(string matrix x, string matrix y, string matrix z) +{ + string matrix res + real scalar r, R, c, C + transmorphic scalar rx, cx, ry, cy, rz, cz + + R = max((rows(x),rows(y),rows(z))) + C = max((cols(x),cols(y),cols(z))) + rx = (rows(x)==1 ? &1 : (rows(x)cols(atstats)) continue + j = atstats[pos] + p = select(1..c, strmatch(coefnm, strofreal(i) + "._at*")') + at[p] = J(1, cols(p), at0[i,j]) + } + return(at) +} + +void coefplot_missing(string scalar model, real colvector b) +{ + if (hasmissing(b)) { + printf("{txt}(%s: b missing for some coefficients)\n", model) + } +} + +void coefplot_atmissing(string scalar model, real colvector at) +{ + if (hasmissing(at)) { + if (nonmissing(at)) { + printf("{txt}(%s: 'at' missing for some coefficients)\n", model) + return + } + printf("{txt}(%s: could not determine 'at')\n", model) + } +} + +void coefplot_cimissing(string scalar model, real scalar ci, real matrix tmp) +{ + if (hasmissing(tmp)) { + if (nonmissing(tmp)) { + printf("{txt}(%s: CI%g missing for some coefficients)\n", + model, ci) + return + } + printf("{txt}(%s: could not determine CI%g)\n", model, ci) + } +} + +void coefplot_add_label(struct coefplot_struct scalar C, + string scalar name, real scalar i, string scalar lbl, real scalar force) +{ + pointer(string colvector) scalar l + + if (name=="plot") l = &C.plotlbl + else if (name=="by") l = &C.bylbl + else if (name=="coef") l = &C.coeflbl + else return + if (rows(*l)1) c = strtoreal(s[2]) + else c = 1 + s = s[1] + // get relevant data + p = p0 + if (subgr<.) { + p = select(p, C.by[p]:==subgr) + if (rows(p)==0) return("") + } + if (plot<.) { + p = select(p, C.plot[p]:==plot) + if (rows(p)==0) return("") + } + if (s=="b") v = C.b[p] + else if (s=="v") v = C.V[p] + else if (s=="se") v = C.se[p] + else if (s=="t") v = C.t[p] + else if (s=="tabs") v = abs(C.t[p]) + else if (s=="df") v = C.df[p] + else if (s=="p") v = C.pval[p] + else if (s=="ll") { + if ((c*2)>cols(C.ci)) return("") + v = C.ci[p,c*2-1] + } + else if (s=="ul") { + if ((c*2)>cols(C.ci)) return("") + v = C.ci[p,c*2] + } + else if (s=="aux") { + if (c>cols(C.aux)) return("") + v = C.aux[p,c] + } + // establish sort order (within equations) + if (desc) v = -v + eqs = C.eqnm[p] + eq = J(rows(eqs),1,1) + for (i=2; i<=rows(eq); i++) { + if (eqs[i]!=eqs[i-1]) eq[i] = eq[i-1]+1 + else eq[i] = eq[i-1] + } + p = sort((eq, v, p), 1..3)[,3] + // collect ordered names + eqs = ("`"+`"""') :+ C.eqnm[p] :+ (`"""' + "'") + coefs = ("`"+`"""') :+ C.coefnm[p] :+ (`"""' + "'") + s = eqs[1] + ": " + coefs[1] + for (i=2; i<=rows(p); i++) { + if (eqs[i]!=eqs[i-1]) s = s + " * " + eqs[i] + ":" + s = s + " " + coefs[i] + } + s = s + " *" + return(s) +} + +void coefplot_order(real colvector p0, string scalar order, + struct coefplot_struct scalar C) +{ + real scalar i, j, k + real colvector p, tag, tmp + string colvector eqs + + if (order=="") return + order = coefplot_parse_namelist(order, "", "order") + if (order[1,1]=="" & !allof(order[,1], "")) { + display("{err}inconsistent order(): " + + "specify equations for all or for none") + exit(198) + } + p = J(0,1,.) + tag = J(C.r, 1, 0) + k = 0 + // order coefficients (general) + if (order[1,1]!="") { + for (i=1; i<=rows(order); i++) { + k++ + if (order[i,2]==".") { + coefplot_appendemptyrow(C, order[i,1], tag, p0) + p = p \ C.r + continue + } + tag = tag :+ (k * strmatch(C.coefnm[p0], order[i,2]) :* !tag :* + (C.eqnm[p0]:==order[i,1])) + if (anyof(tag, k)) { + p = p \ select(p0, tag:==k) + } + } + if (anyof(tag, 0)) { + p = p \ select(p0, tag:==0) + } + swap(p,p0); return + } + // order coefficients within equations + order = order[,2]' + eqs = C.eqnm[p0[1]] + for (i=2; i<=C.r; i++) { // get equations (in right order) + if (C.eqnm[p0[i]]!=C.eqnm[p0[i-1]]) { + eqs = eqs \ C.eqnm[p0[i]] + } + } + for (j=1; j<=rows(eqs); j++) { + for (i=1; i<=cols(order); i++) { + k++ + if (order[i]==".") { + coefplot_appendemptyrow(C, eqs[j], tag, p0) + p = p \ C.r + continue + } + tag = tag :+ (k * strmatch(C.coefnm[p0], order[i]) :* !tag :* + (C.eqnm[p0]:==eqs[j])) + if (anyof(tag, k)) { + p = p \ select(p0, tag:==k) + } + } + tmp = (tag:==0):&(C.eqnm[p0]:==eqs[j]) + if (any(tmp)) { + p = p \ select(p0, tmp) + tag = tag :+ tmp + } + } + swap(p,p0); return +} + +void coefplot_appendemptyrow(struct coefplot_struct scalar C, + string scalar eq, real colvector tag, real colvector p0) +{ + C.b = C.b \ . + C.V = C.V \ . + C.se = C.se \ . + C.t = C.t \ . + C.df = C.df \ . + C.pval = C.pval \ . + C.at = C.at \ 1 + C.aux = C.aux \ J(1, cols(C.aux), .) + C.mlbl = C.mlbl \ "" + C.mlpos = C.mlpos \ . + C.plot = C.plot \ . + C.by = C.by \ . + C.ci = C.ci \ J(1, cols(C.ci), .) + C.coefnm = C.coefnm \ "" + C.eqnm = C.eqnm \ eq + C.trans = C.trans \ "" + tag = tag \ . + C.r = C.r + 1 + p0 = p0 \ C.r +} + +void coefplot_coeflbls(struct coefplot_struct scalar C) +{ + real scalar i, j, k + real colvector tag + string matrix labels, names + + C.coeflbl = J(C.r, 1, "") + tag = J(C.r, 1, 0) + labels = coefplot_parse_matchlist(st_local("coeflabels"), "coeflabels") + for (j=1; j<=rows(labels); j++) { + names = coefplot_parse_namelist(labels[j,1], "*", "coeflabels") + for (k=1; k<=rows(names); k++) { + tag = tag :+ j * strmatch(C.eqnm, names[k,1]) :* + strmatch(C.coefnm, names[k,2]) :* (tag:==0) + } + } + _editmissing(tag, 0) + for (i=1; i<=C.r; i++) { + if (tag[i] & C.plot[i]<.) { // C.plot is missing for gaps from order() + C.coeflbl[i] = labels[tag[i],2] + } + } +} + +void coefplot_multiple_eqs(struct coefplot_struct scalar C) +{ + real scalar i, meqs + string matrix eq + + eq = C.eqnm, strofreal(C.plot), strofreal(C.by) + + _sort(eq, (3,2,1)) + meqs = 0 + for (i=2; i<=rows(eq); i++) { + if (eq[i,1]!=eq[i-1,1] & eq[i,2]==eq[i-1,2] & eq[i,3]==eq[i-1,3]) { + meqs = 1 + break + } + } + if (meqs==0) { + C.eqnm = J(rows(C.eqnm), 1, "_") + } + st_local("meqs", strofreal(meqs)) +} + +void coefplot_bycoefs(struct coefplot_struct scalar C) +{ + real scalar i, j, k, meqs + real colvector p + string scalar eql + string colvector bylbl, last, eqlbls + + meqs = (st_local("meqs")!="0") & (st_local("noeqlabels")=="") + if (meqs) eqlbls = tokens(st_local("eqlabels"))' + bylbl = C.bylbl + C.bylbl = C.coeflbl + swap(C.at, C.by) + j = 0 + k = 1 + for (i=1; i<=C.r; i++) { + if (i>1) { + if (C.eqnm[i]!=C.eqnm[i-1]) k++ + } + if ((C.eqnm[i], C.coefnm[i])!=last) j++ + last = (C.eqnm[i], C.coefnm[i]) + C.by[i] = j + if (meqs) { + if (k<=rows(eqlbls)) eql = eqlbls[k] + else eql = C.eqnm[i] + C.bylbl[j] = eql + ": " + C.bylbl[i] + } + else C.bylbl[j] = C.bylbl[i] + } + C.bylbl = C.bylbl[|1 \ j|] + C.eqnm = J(C.r, 1, "_") + C.coefnm = strofreal(C.at) + C.coeflbl = J(C.r, 1, "") + for (i=1; i<=C.r; i++) { + C.coeflbl[i] = bylbl[C.at[i]] + } + C.at = J(C.r, 1, 1) + p = coefplot_niceorder(C.eqnm, C.coefnm, C.plot, C.by, C.r) + C.b = C.b[p] + C.V = C.V[p] + C.se = C.se[p] + C.t = C.t[p] + C.df = C.df[p] + C.pval = C.pval[p] + C.at = C.at[p] + C.aux = C.aux[p,] + C.mlbl = C.mlbl[p] + C.mlpos = C.mlpos[p] + C.plot = C.plot[p] + C.by = C.by[p] + C.ci = C.ci[p,] + C.coefnm = C.coefnm[p] + C.eqnm = C.eqnm[p] + C.trans = C.trans[p] + C.coeflbl = C.coeflbl[p] + st_local("n_subgr", strofreal(rows(C.bylbl))) +} + +void coefplot_catvals(struct coefplot_struct scalar C) +{ + real scalar i, j, k, e, eqgap, ggap + real colvector pos, at0 + string scalar glbls, xlab + string colvector eqs + string matrix groups, names + + // determine plot positions + for (i=2; i<=C.r; i++ ) { + C.at[i] = C.at[i-1] + + ((C.coefnm[i]!=C.coefnm[i-1]) // new coefficient + | (C.eqnm[i]!=C.eqnm[i-1]) // new equation + | (C.plot[i]==.)) // gap from order() + } + + // reposition + coefplot_relocate(C) + C.xmin = min(C.at) + + // equation numbers and labels + eqs = tokens(st_local("eqlabels"))' + xlab = st_local("eqxlab") + C.eq = J(C.r, 1, 1) + C.eqlbl = J(C.r, 1, "") + j = 1 + if (j>rows(eqs)) C.eqlbl[j] = coefplot_get_xlab(C.eqnm[1], xlab) + else C.eqlbl[j] = eqs[j] + for (i=2; i<=C.r; i++ ) { + C.eq[i] = C.eq[i-1] + if (C.eqnm[i]!=C.eqnm[i-1]) { + j++ + if (j>rows(eqs)) C.eqlbl[j] = coefplot_get_xlab(C.eqnm[i], xlab) + else C.eqlbl[j] = eqs[j] + C.eq[i] = C.eq[i] + 1 + } + } + C.eqlbl = C.eqlbl[|1,1 \ j,.|] + + // group IDs + groups = st_local("groups") + C.grp = J(C.r, 1, 0) + if (groups!="") { + groups = coefplot_parse_matchlist(groups, "groups") + eqs = uniqrows(C.eqnm) + for (e=1; e<=rows(eqs); e++) { + for (j=1; j<=rows(groups); j++) { + names = coefplot_parse_namelist(groups[j,1], "*", "groups") + for (k=1; k<=rows(names); k++) { + C.grp = C.grp :+ j * strmatch(C.eqnm, names[k,1]) :* + strmatch(C.coefnm, names[k,2]) :* (C.grp:==0) :* + (C.eqnm:==eqs[e]) :* (C.plot:<.) + } + for (i=1; i<=C.r; i++) { + pos = select(1::C.r, (C.grp:==j) :& (C.eqnm:==eqs[e])) + if (length(pos)>0) { + C.grp[|pos[1] \ pos[rows(pos)]|] = + J((pos[rows(pos)]-pos[1]+1), 1, j) + } + } + } + } + for (j=1; j<=rows(groups); j++) { + glbls = glbls + " " + "`" + `"""' + groups[j,2] + `"""' + "'" + } + st_local("groups", strtrim(glbls)) + } + + // add gaps between equations and groups + eqgap = strtoreal(st_local("eqgap")) + ggap = strtoreal(st_local("ggap")) + if (eqgap==0 & ggap==0) return + at0 = C.at + for (i=2; i<=C.r; i++ ) { + C.at[i] = C.at[i-1] + + (at0[i,1] - at0[i-1,1]) + // update downstream + (C.eqnm[i]!=C.eqnm[i-1])*eqgap + // new eq + (C.eqnm[i]==C.eqnm[i-1] & C.grp[i]!=C.grp[i-1])*ggap // new group + } +} + +string scalar coefplot_get_xlab(string scalar v, string scalar interact) +{ + if (interact=="") return(v) + stata("compile_xlabel, v(" + v + ") interact(" + interact + ")") + return(st_local("coeflbl")) +} + +void coefplot_relocate(struct coefplot_struct scalar C) +{ + real scalar i, j, k + real colvector tag, p + string matrix pos, names + + if (st_local("relocate")=="") return + + // set positions + tag = J(C.r, 1, 0) + pos = coefplot_parse_matchlist(st_local("relocate"), "relocate") + for (j=1; j<=rows(pos); j++) { + names = coefplot_parse_namelist(pos[j,1], "*", "relocate") + for (k=1; k<=rows(names); k++) { + tag = tag :+ j * strmatch(C.eqnm, names[k,1]) :* + strmatch(C.coefnm, names[k,2]) :* (tag:==0) + } + } + _editmissing(tag, 0) + p = strtoreal(pos[,2]) + for (i=1; i<=C.r; i++) { + if (tag[i] & (C.plot[i]<.)) { + C.at[i] = p[tag[i]] + } + } + + // reorder + p = order((C.at, (1::C.r)), (1,2)) + C.b = C.b[p] + C.V = C.V[p] + C.se = C.se[p] + C.t = C.t[p] + C.df = C.df[p] + C.pval = C.pval[p] + C.at = C.at[p] + C.aux = C.aux[p,] + C.mlbl = C.mlbl[p] + C.mlpos = C.mlpos[p] + C.plot = C.plot[p] + C.by = C.by[p] + C.ci = C.ci[p,] + C.coefnm = C.coefnm[p] + C.eqnm = C.eqnm[p] + C.trans = C.trans[p] + C.coeflbl = C.coeflbl[p] +} + +void coefplot_headings(struct coefplot_struct scalar C) +{ + real scalar i, j, k, off, gap, fskip + real colvector tag + string scalar hlbls + string matrix headings, names + + off = strtoreal(st_local("hoff")) + gap = strtoreal(st_local("hgap")) + + // if headings are equations + if (st_local("eqashead")!="") { + fskip = C.at[1] + j = 0 + for (i=1; i<=C.r; i++) { + if (C.eq[i]!=j) { + C.at[|i \ .|] = C.at[|i \ .|] :+ 1 :+ (gap*(i>1)) + hlbls = hlbls + " " + strofreal(C.at[i] - fskip + off) + } + j = C.eq[i] + } + st_local("hlbls", strtrim(hlbls)) + return + } + + // if headings are not equations + headings = st_local("headings") + if (headings=="") { + st_local("hlbls", "") + return + } + tag = J(C.r, 1, 0) + if (C.r>1) { + tag[|2 \ .|] = tag[|2 \ .|] :+ + (C.at[|2 \ .|]:==C.at[|1 \ C.r-1|]) + _editvalue(tag, 1, .) + } + headings = coefplot_parse_matchlist(headings, "headings") + for (j=1; j<=rows(headings); j++) { + names = coefplot_parse_namelist(headings[j,1], "*", "headings") + for (k=1; k<=rows(names); k++) { + tag = tag :+ j * strmatch(C.eqnm,names[k,1]) :* + strmatch(C.coefnm, names[k,2]) :* (tag:==0) + } + } + _editmissing(tag, 0) + for (i=1; i<=C.r; i++) { + if (tag[i] & (C.plot[i]<.)) { + C.at[|i \ .|] = C.at[|i \ .|] :+ 1 :+ (gap*(i>1)) + hlbls = hlbls + " " + strofreal(C.at[i] - 1 + off) + " " + + "`" + `"""' + headings[tag[i],2] + `"""' + "'" + } + } + st_local("hlbls", strtrim(hlbls)) +} + +string matrix coefplot_parse_matchlist(string scalar s, string scalar opt, + | real scalar nc0) +{ + real scalar c, a, b, j, i, nc + real rowvector eqpos + string rowvector stok + string matrix res + + if (args()==3) nc = nc0 + else nc = 1 + if (strtrim(s)=="") return(J(0, 1+nc, "")) + stok = _coefplot_parse_matchlist_stok(s) + c = cols(stok) + a = b = i = 1 + eqpos = select(1::c, stok':=="=")' + res = J(cols(eqpos), 1+nc, "") + for (j=1; j<=cols(eqpos); j++) { + b = eqpos[j] + if (b==a | b==c | (b+nc)>cols(stok)) { + printf("{err}%s(): invalid matchlist\n", opt) + exit(198) + } + res[i,] = (invtokens(stok[|a \ b-1|]), stok[|b+1 \ b+nc|]) + a = b + 1 + nc + i++ + } + if (a<=c) { + printf("{err}%s(): invalid matchlist\n", opt) + exit(198) + } + nc = nc + 1 + for (i=1; i<=rows(res); i++) { // strip quotes in last column + if (substr(res[i,nc], 1, 1)==`"""') { + res[i,nc] = substr(res[i,nc], 2, strlen(res[i,nc])-2) + } + else if (substr(res[i,nc], 1, 2)=="`" + `"""') { + res[i,nc] = substr(res[i,nc], 3, strlen(res[i,nc])-4) + } + } + return(res) +} + +string rowvector _coefplot_parse_matchlist_stok(string scalar s) +{ + real scalar i, c, j + string scalar tok, t0 + string rowvector pchars, stok + transmorphic t + + // Step 1: split input at blanks and equal signs while binding on quotes + // and parentheses + pchars = (" ", "=") + t = tokeninit("", pchars, (`""""', `"`""'"', "()")) + tokenset(t, s) + stok = tokengetall(t) + // Step 2: remove blanks and merge "(...)" with surrounding tokens (unless + // blank or equal sign) + c = cols(stok) + j = c + 1 + for (i=c; i; i--) { + tok = stok[i] + if (tok==" ") continue // remove blanks + if (i>1) { + if (substr(tok,1,1)=="(") { + if (!anyof(pchars, stok[i-1])) { + stok[i-1] = stok[i-1] + tok + continue + } + } + else if (tok!="=") { + if (substr(stok[i-1],-1,1)==")") { + stok[i-1] = stok[i-1] + tok + continue + } + } + } + stok[--j] = tok + } + // return result + if (j>c) return(J(1,0,"")) + return(stok[|j \ .|]) +} + +string matrix coefplot_parse_namelist(string scalar s, string scalar defeq, + string scalar opt) +{ + transmorphic t + real scalar i, c + string rowvector stok + string matrix res + + if (s=="") return(J(0,2,"")) + t = tokeninit(" ", ":") + tokenset(t, s) + stok = tokengetall(t) + c = cols(stok) + for (i=1; i<=c; i++) { // strip quotes + if (substr(stok[i], 1, 1)==`"""') { + stok[i] = substr(stok[i], 2, strlen(stok[i])-2) + } + else if (substr(stok[i], 1, 2)=="`" + `"""') { + stok[i] = substr(stok[i], 3, strlen(stok[i])-4) + } + } + res = J(0, 2, "") + for (i=1;i<=c;i++) { + if (i+1<=c) { + if (stok[i+1]==":") { + if (stok[i]==":") { + printf("{err}%s(): invalid namelist\n", opt) + exit(198) + } + if (i+2<=c) { + if (stok[i+2]==":") { + printf("{err}%s(): invalid namelist\n", opt) + exit(198) + } + if (i+3<=c) { + if (stok[i+3]==":") { // "... eq: eq: ..." + res = res \ (stok[i], "*") + i++ + continue + } + } + res = res \ (stok[i], stok[i+2]) // "... eq:name ..." + defeq = stok[i] + i = i + 2 + continue + } + res = res \ (stok[i], "*") // "... eq:" + i++ + continue + } + } + if (stok[i]==":") { + printf("{err}%s(): invalid namelist\n", opt) + exit(198) + } + res = res \ (defeq, stok[i]) + } + return(res) +} + +void coefplot_put(struct coefplot_struct scalar C) +{ + real scalar i + real rowvector vi + + st_store((1,C.r), st_local("b"), C.b) + st_store((1,C.r), st_local("V"), C.V) + st_store((1,C.r), st_local("se"), C.se) + st_store((1,C.r), st_local("t"), C.t) + st_store((1,C.r), st_local("df"), C.df) + st_store((1,C.r), st_local("pval"), C.pval) + st_store((1,C.r), st_local("at"), C.at) + st_sstore((1,C.r), st_local("mlbl"), C.mlbl) + st_store((1,C.r), st_local("mlpos"), C.mlpos) + st_store((1,C.r), st_local("plot"), C.plot) + st_store((1,C.r), st_local("by"), C.by) + st_store((1,C.r), st_local("eq"), C.eq) + st_store((1,C.r), st_local("grp"), C.grp) + vi = J(1, cols(C.ci), .) + for (i=1; i<=(cols(vi)/2); i++) { + vi[1,i*2-1] = st_varindex(st_local("ll" + strofreal(i))) + vi[1,i*2] = st_varindex(st_local("ul" + strofreal(i))) + } + st_store((1,C.r), vi, C.ci) + vi = J(1, cols(C.aux), .) + for (i=1; i<=cols(vi); i++) { + vi[1,i] = st_varindex(st_local("aux" + strofreal(i))) + } + st_store((1,C.r), vi, C.aux) +} + +void coefplot_at_unique(struct coefplot_struct scalar C) +{ + assert(rows(uniqrows((C.by,C.at)))==C.r) +} + +void coefplot_apply_transform(struct coefplot_struct scalar C) +{ + real scalar i, j, rc, x0, x1, mis + string scalar trans0, trans, trans1 + string rowvector vname + real rowvector vpos + + if (allof(C.trans[i], "")) return + vname = J(1, cols(C.ci), "") + for (j=1; j<=(cols(C.ci)/2); j++) { + vname[j*2-1] = st_local("ll"+strofreal(j)) + vname[j*2] = st_local("ul"+strofreal(j)) + } + vname = st_local("b"), vname + vpos = st_varindex(vname) + mis = 0 + for (i=1; i<=C.r; i++) { + if (C.trans[i]=="") continue + if (C.trans[i]!=trans0) trans0 = C.trans[i] + trans = _coefplot_inject_temvars(trans0, cols(C.ci), cols(C.aux)) + for (j=1; j<=cols(vname); j++) { + trans1 = subinstr(trans, "@", vname[j]) + x0 = _st_data(i, vpos[j]) + rc = _stata("replace " + vname[j] + " = " + trans1 + " in " + strofreal(i), 1) + if (rc) { + printf("{err}transform '%s' invalid\n", trans0) + exit(198) + } + x1 = _st_data(i, vpos[j]) + if (x1>=. & x1!=x0) mis = 1 + } + } + if (mis) { + display("{txt}(transform missing for some coefficients or CIs)") + } +} + +void coefplot_lbl_is_multiline() +{ + string scalar lbl + + lbl = strtrim(st_local("lbl")) + if ((substr(lbl, 1, 1)==`"""' | substr(lbl, 1, 2)==("`" + `"""'))) { + return(499) + } +} + +void coefplot_get_coefs(struct coefplot_struct scalar C) +{ + st_local("coefs", + invtokens("`" :+ `"""' :+ C.coefnm' :+ `"""' :+ "'")) +} + +void coefplot_get_coeflbl(struct coefplot_struct scalar C, real scalar i) +{ + st_local("coeflbl", C.coeflbl[i]) +} + +void coefplot_get_plotlbl(struct coefplot_struct scalar C, real scalar i) +{ + st_local("plotlbl", C.plotlbl[i]) +} + +void coefplot_get_bylbl(struct coefplot_struct scalar C, real scalar i) +{ + st_local("bylbl", C.bylbl[i]) +} + +void coefplot_get_eqlbl(struct coefplot_struct scalar C, real scalar i) +{ + st_local("eqlbl", C.eqlbl[i]) +} + +void coefplot_ticks_and_labels(struct coefplot_struct scalar C) +{ + real scalar i, between + string scalar labels, grid, space + + between = (st_local("grid")=="between") + st_local("xrange", strofreal(C.xmin-0.5) + " " + + strofreal(max(C.at)+0.5)) + if (between & C.plot[1]<.) { + if (C.xmin1) { + if ((C.eqnm[i], C.coefnm[i])==(C.eqnm[i-1], C.coefnm[i-1])) { + continue + } + if (between & C.plot[i-1]<.) { + grid = grid + space + + strofreal(C.at[i-1] + min((0.5, (C.at[i]-C.at[i-1])/2))) + } + } + if (C.plot[i]<.) { + labels = labels + space + strofreal(C.at[i]) + + " `" + `"""' + C.coeflbl[i] + `"""' + "'" + if (between==0) grid = grid + space + strofreal(C.at[i]) + else if (i>1) { + grid = grid + space + + strofreal(C.at[i] - min((0.5, (C.at[i]-C.at[i-1])/2))) + } + space = " " + } + } + st_local("xlabels", labels) + st_local("xgrid", grid) +} + +void coefplot_combine_ciopts() +{ + string scalar opt, p + + opt = st_local("opt") + p = substr(opt, 2, strpos(opt,"(")-2) // get # from "p#(...)" + if (strtoreal(p)<.) { + opt = substr(opt, 3+strlen(p), strlen(opt)-3-strlen(p)) // get contents + st_local("opt_"+p, st_local("opt_"+p) + " " + opt) + } + else { + st_local("options", st_local("options") + " " + opt) + } +} + +void coefplot_parsecomma(string scalar lhs, string scalar rhs, string scalar lin) +{ + transmorphic t + string scalar l, r, token + + t = tokeninit("", ",", (`""""', `"`""'"'), 0, 0) + tokenset(t, st_local(lin)) + while ((token = tokenget(t))!="") { + if (token==",") { + r = token + while ((token = tokenget(t))!="") { + r = r + token + } + st_local(lhs, l) + st_local(rhs, r) + return + } + l = l + token + } + st_local(lhs, l) + st_local(rhs, r) +} + +void coefplot_inject_temvars(string scalar s, real scalar nci, + real scalar naux) +{ + st_local(s, _coefplot_inject_temvars(st_local(s), nci, naux)) +} +string scalar _coefplot_inject_temvars(string scalar s, real scalar nci, + real scalar naux) +{ + real scalar i + string scalar v, vname + string rowvector nspace + + nspace = J(1, nci*2 + naux, "") + for (i=1; i<=nci; i++) { + nspace[i*2-1] = "ll" + strofreal(i) + nspace[i*2] = "ul" + strofreal(i) + } + for (i=1; i<=naux; i++) { + nspace[nci*2+i] = "aux" + strofreal(i) + } + nspace = nspace, ("b", "V", "se", "t", "df", "pval", "at", "mlbl", "mlpos", "plot", "by") + while (regexm(s,"@[Va-z]+[0-9]*")) { + v = regexs() + vname = substr(v, 2, .) + if (vname=="ll" | vname=="ul" | vname=="aux") { + vname = vname + "1" + } + if (anyof(nspace, vname)==0) { + printf("{err}%s not found\n", v) + exit(error(111)) + } + s = subinstr(s, v, st_local(vname), 1) + } + return(s) +} + +end + + + diff --git a/data/ado/c/coefplot.sthlp b/data/ado/c/coefplot.sthlp new file mode 100644 index 0000000..72069d9 --- /dev/null +++ b/data/ado/c/coefplot.sthlp @@ -0,0 +1,1817 @@ +{smcl} +{* *! version 1.5.2 21apr2022 Ben Jann}{...} +{vieweralsosee "[G-2] graph" "help graph"}{...} +{vieweralsosee "[R] estimates" "help estimates"}{...} +{vieweralsosee "[R] marginsplot" "help marginsplot"}{...} +{vieweralsosee "[R] margins" "help margins"}{...} +{viewerjumpto "Syntax" "coefplot##syntax"}{...} +{viewerjumpto "Description" "coefplot##description"}{...} +{viewerjumpto "Options" "coefplot##options"}{...} +{viewerjumpto "Examples" "coefplot##examples"}{...} +{viewerjumpto "Remarks" "coefplot##remarks"}{...} +{viewerjumpto "Saved results" "coefplot##saved_results"}{...} +{viewerjumpto "References" "coefplot##references"}{...} +{viewerjumpto "Author" "coefplot##author"}{...} +{viewerjumpto "History" "coefplot##history"}{...} +{hi:help coefplot}{...} +{right:{browse "http://repec.sowi.unibe.ch/stata/coefplot"}} +{right:{browse "http://github.com/benjann/coefplot"}} +{hline} + +{title:Title} + +{pstd} + {hi:coefplot} {hline 2} Plotting regression coefficients and other + results + +{marker syntax}{...} +{title:Syntax} + +{p 8 15 2} + {cmd:coefplot} {it:subgraph} [ || {it:subgraph} || ... ] + [{cmd:,} {help coefplot##globalopts:{it:globalopts}} ] + +{pstd} + where {it:subgraph} is defined as + +{p 8 16 2} + {cmd:(}{it:plot}{cmd:)} [ {cmd:(}{it:plot}{cmd:)} ... ] + [, {help coefplot##subgropts:{it:subgropts}} ] + +{pstd} + and {it:plot} is either {cmd:_skip} (to skip a plot) or + +{p 8 16 2} + {it:model} [ \ {it:model} \ ... ] + [, {help coefplot##plotopts:{it:plotopts}} ] + +{pstd} + and {it:model} is + +{p 8 16 2} + {it:namelist} [{cmd:,} {help coefplot##modelopts:{it:modelopts}} ] + +{pstd} + where {it:namelist} is a list of names of stored models + (see help {helpb estimates}; type {cmd:.} or leave blank to refer to + the active model). The {cmd:*} and {cmd:?} wildcards are allowed + in {it:namelist}; see + {help coefplot##wildcards:{it:Using wildcards in model names}}. Furthermore, + {it:model} may also be + +{p 8 16 2} + {helpb coefplot##matrix:{ul:m}atrix({it:mspec})} [{cmd:,} {help coefplot##modelopts:{it:modelopts}} ] + +{pstd} + to plot results from a matrix (see + {help coefplot##matrix:{it:Plotting results from matrices}} below). + Parentheses around {it:plot} can be omitted if {it:plot} does not contain + spaces. + +{synoptset 25 tabbed}{...} +{marker modelopts}{synopthdr:modelopts} +{synoptline} +{syntab:Main} +{synopt:{helpb coefplot##omitted:{ul:omit}ted}}include omitted + coefficients + {p_end} +{synopt:{helpb coefplot##baselevels:{ul:base}levels}}include base levels + {p_end} +{synopt:{helpb coefplot##b:b({it:mspec})}}specify source to be plotted; default is to + plot {cmd:e(b)} + {p_end} +{synopt:{helpb coefplot##at:at{sf:[}({it:spec}){sf:]}}}get plot positions from + {cmd:e(at)}, or as specified by {it:spec} + {p_end} +{synopt:{helpb coefplot##keep:keep({it:coeflist})}}keep specified coefficients + {p_end} +{synopt:{helpb coefplot##drop:drop({it:coeflist})}}drop specified coefficients + {p_end} + +{syntab:Confidence intervals} +{synopt:{helpb coefplot##noci:noci}}omit confidence intervals + {p_end} +{synopt:{helpb coefplot##levels:{ul:l}evels({it:numlist})}}set level(s) for + conficence intervals + {p_end} +{synopt:{helpb coefplot##ci:ci({it:spec})}}provide confidence intervals + {p_end} +{synopt:{helpb coefplot##v:v({it:name})}}provide variances; default is to use + {cmd:e(V)} + {p_end} +{synopt:{helpb coefplot##se:se({it:mspec})}}provide standard errors + {p_end} +{synopt:{helpb coefplot##df:df({it:spec})}}provide degrees of freedom + {p_end} +{synopt:{helpb coefplot##citype:citype({it:method})}}method to compute + confidence intervals; default is {cmd:citype(normal)} + {p_end} + +{syntab:Transform results} +{synopt:{helpb coefplot##eform:eform{sf:[}({it:coeflist}){sf:]}}}plot + exponentiated point estimates and confidence intervals + {p_end} +{synopt:{helpb coefplot##rescale:rescale({it:spec})}}rescale point estimates + and confidence intervals + {p_end} +{synopt:{helpb coefplot##transform:{ul:trans}form({it:matchlist})}}transform + point estimates and confidence intervals + {p_end} + +{syntab:Names and labels} +{synopt:{helpb coefplot##rename:rename({it:spec})}}rename coefficients + {p_end} +{synopt:{helpb coefplot##eqrename:{ul:eqren}ame({it:spec})}}rename + equations + {p_end} +{synopt:{helpb coefplot##asequation:{ul:aseq}uation{sf:[}({it:string}){sf:]}}}set equation + to model name or {it:string} + {p_end} +{synopt:{helpb coefplot##swapnames:{ul:swap}names}}swap coefficient names and + equation names + {p_end} +{synopt:{helpb coefplot##mlabels:mlabels({it:matchlist})}}add custom marker labels + {p_end} + +{syntab:Auxiliary results} +{synopt:{helpb coefplot##aux:aux({sf:{it:mspec} [{it:mspec} ...]})}}make + additional results available as {cmd:@aux1}, {cmd:@aux2}, etc. + {p_end} +{synoptline} + +{synoptset 25 tabbed}{...} +{marker plotopts}{synopthdr:plotopts} +{synoptline} +{syntab:Passthru} +{synopt:{help coefplot##modelopts:{it:modelopts}}}plot-specific model options; + see {help coefplot##place:{it:Placement of options}} + {p_end} + +{syntab:Main} +{synopt:{helpb coefplot##label:{ul:lab}el({it:string})}}label to be used for + the plot in the legend + {p_end} +{synopt:{helpb coefplot##key:key{sf:[}(ci {sf:[}#{sf:]}){sf:]}}}key + symbol to be used for the plot in the legend + {p_end} +{synopt:{helpb coefplot##nokey:nokey}}do not include the plot in the legend + {p_end} +{synopt:{helpb coefplot##pstyle:{ul:psty}le({it:pstyle})}}overall + style of the plot + {p_end} +{synopt:{helpb coefplot##axis:{ul:ax}is({it:#})}}choice of axis for the plot, {cmd:1} {ul:<} {it:#} {ul:<} {cmd:9} + {p_end} +{synopt:{helpb coefplot##offset:offset({it:#})}}provide offset for plot + positions + {p_end} +{synopt:{helpb coefplot##ifopt:if({it:exp})}}restrict the contents of the plot + {p_end} +{synopt:{helpb coefplot##weight:{ul:w}eight({it:exp})}}scale size of markers + {p_end} + +{syntab:Markers} +{synopt:{it:{help marker_options}}}change look of + markers (color, size, etc.) + {p_end} +{synopt:{helpb coefplot##mlabel:{ul:ml}abel{sf:[}({it:spec}){sf:]}}}add marker + labels + {p_end} +{synopt:{it:{help marker_label_options}}}change the look and position of marker + labels + {p_end} +{synopt:{helpb coefplot##recast:recast({it:plottype})}}plot results using + {it:plottype} + {p_end} + +{syntab:Confidence spikes} +{synopt:{helpb coefplot##cionly:cionly}}plot confidence spikes only + {p_end} +{synopt:{helpb coefplot##citop:citop}}draw confidence spikes in front + of markers + {p_end} +{synopt:{helpb coefplot##cirecast:{ul:cire}cast({it:plottype})}}shorthand for {cmd:ciopts(recast())} + {p_end} +{synopt:{helpb coefplot##ciopts:{ul:ciop}ts({it:options})}}affect rendition + of confidence spikes + {p_end} +{synopt:{helpb coefplot##cismooth:{ul:cis}mooth{sf:[}({it:options}){sf:]}}}add smoothed + confidence intervals + {p_end} +{synoptline} + +{synoptset 25 tabbed}{...} +{marker subgropts}{synopthdr:subgropts} +{synoptline} +{syntab:Passthru} +{synopt:{help coefplot##modelopts:{it:modelopts}}}subgraph-specific model + options; see {help coefplot##place:{it:Placement of options}} + {p_end} +{synopt:{help coefplot##plotopts:{it:plotopts}}}subgraph-specific plot + options; see {help coefplot##place:{it:Placement of options}} + {p_end} + +{syntab:Main} +{synopt:{helpb coefplot##bylabel:{ul:bylab}el({it:string})}}label to be used + for the subgraph + {p_end} +{synoptline} + +{synoptset 25 tabbed}{...} +{marker globalopts}{synopthdr:globalopts} +{synoptline} +{syntab:Passthru} +{synopt:{help coefplot##modelopts:{it:modelopts}}}global model options; see + {help coefplot##place:{it:Placement of options}} + {p_end} +{synopt:{help coefplot##plotopts:{it:plotopts}}}global plot options; see + {help coefplot##place:{it:Placement of options}} + {p_end} +{synopt:{help coefplot##subgropts:{it:subgropts}}}global subgraph options; + see {help coefplot##place:{it:Placement of options}} + {p_end} + +{syntab:Main} +{synopt:{helpb coefplot##horizontal:{ul:hor}izontal}}coefficient values are + on x axis; general default + {p_end} +{synopt:{helpb coefplot##vertical:{ul:vert}ical}}coefficient values are on y + axis; default with {cmd:at()} + {p_end} +{synopt:{helpb coefplot##eqstrict:eqstrict}}be strict about equations + {p_end} +{synopt:{helpb coefplot##order:order({it:coeflist})}}order coefficients + {p_end} +{synopt:{helpb coefplot##orderby:orderby({it:spec})}}order coefficients by + specific model + {p_end} +{synopt:{helpb coefplot##sort:sort{sf:[}({it:spec}){sf:]}}}sort coefficients + {p_end} +{synopt:{helpb coefplot##relocate:{ul:reloc}ate({it:spec})}}assign + specific positions to coefficients + {p_end} +{synopt:{helpb coefplot##bycoefs:{ul:byc}oefs}}arrange subgraphs by + coefficients + {p_end} +{synopt:{helpb coefplot##norecycle:{ul:norec}ycle}}increment plot styles across + subgraphs + {p_end} +{synopt:{helpb coefplot##nooffsets:{ul:nooff}sets}}do not offset plot + positions + {p_end} +{synopt:{helpb coefplot##format:format({it:format})}}set the display format for + numeric labels + {p_end} +{synopt:{helpb coefplot##pnum:p{it:#}({it:plotopts})}}options for {it:#}th plot + {p_end} + +{syntab:Labels and grid lines} +{synopt:{helpb coefplot##nolabels:{ul:nolab}els}}use variable names instead of + labels + {p_end} +{synopt:{helpb coefplot##coeflabels:{ul:coefl}abels({it:spec})}}specify + custom labels for coefficients + {p_end} +{synopt:{helpb coefplot##noeqlabels:{ul:noeql}abels}}suppress equation labels + {p_end} +{synopt:{helpb coefplot##eqlabels:{ul:eql}abels({it:spec})}}specify labels + for equations + {p_end} +{synopt:{helpb coefplot##headings:{ul:head}ings({it:spec})}}add headings between + coefficients + {p_end} +{synopt:{helpb coefplot##groups:groups({it:spec})}}add labels for groups of + coefficients + {p_end} +{synopt:{helpb coefplot##plotlabels:{ul:plotl}abels({it:spec})}}(re)set plot + labels + {p_end} +{synopt:{helpb coefplot##bylabels:bylabels({it:spec})}}(re)set subgraph + labels + {p_end} +{synopt:{helpb coefplot##grid:grid({it:options})}}affect rendition of grid lines + {p_end} + +{syntab:Save results} +{synopt:{helpb coefplot##generate:{ul:gen}erate{sf:[}({it:prefix}){sf:]}}}generate + variables containing the graph data + {p_end} +{synopt:{helpb coefplot##replace:replace}}overwrite existing variables + {p_end} + +{syntab:Add plots} +{synopt:{helpb addplot_option:addplot({it:plot})}}add other plots to the + graph + {p_end} +{synopt:{helpb coefplot##nodrop:nodrop}}do not drop observations + {p_end} + +{syntab:Y axis, X axis, Titles, Legend, Overall, By} +{synopt:{it:{help twoway_options}}}twoway options, other than {cmd:by()} + {p_end} +{synopt:{cmdab:byop:ts(}{it:{help by_option:byopts}}{cmd:)}}how subgraphs + are combined + {p_end} +{synoptline} + + +{marker description}{...} +{title:Description} + +{pstd} + {cmd:coefplot} plots results from estimation commands or Stata matrices. + Results from multiple models or matrices can be combined in a single + graph. The default behavior of {cmd:coefplot} is to draw markers for + coefficients and horizontal spikes for confidence intervals. However, + {cmd:coefplot} can also produce various other types of graphs. + + +{marker options}{...} +{title:Options} +{dlgtab:Model options} + +{marker omitted}{...} +{phang} + {cmd:omitted} includes omitted coefficients. This may be useful if a model + contains coefficients that have been dropped due to collinearity. + +{marker baselevels}{...} +{phang} + {cmd:baselevels} includes base levels of factor variables. + +{marker b}{...} +{phang} + {cmd:b(}{it:mspec}{cmd:)} specifies the source from which the point + estimates and coefficient names are to be collected. The default is to use + (the first row of) {cmd:e(b)} (or {cmd:e(b_mi)} if plotting results from + {helpb mi estimate}). {cmd:b()} is discarded in matrix mode (see + {help coefplot##matrix:{it:Plotting results from matrices}} below). + {it:mspec} may be: + +{p2colset 13 25 27 2}{...} +{p2col:{it:name}}use first row of {cmd:e(}{it:name}{cmd:)} + {p_end} +{p2col:{it:name}{cmd:[}#{cmd:,.]}}use #th row of + {cmd:e(}{it:name}{cmd:)}; may also type {it:name}{cmd:[}#{cmd:,]} + or {it:name}{cmd:[}#{cmd:]} + {p_end} +{p2col:{it:name}{cmd:[.,}#{cmd:]}}use #th column of + {cmd:e(}{it:name}{cmd:)}; may also type {it:name}{cmd:[,}#{cmd:]} + {p_end} +{p2colreset}{...} + +{marker at}{...} +{phang} + {cmd:at}[{cmd:(}{it:spec}{cmd:)}] causes plot positions to be determined + by the values in {cmd:e(at)} (or matrix {cmd:at}) or as specified by + {it:spec}. The default is to create a categorical axis with coefficients + matched by their names. However, if {cmd:at} is specified, the axis is + treated as continuous. Note that labeling options + {cmd:coeflabels()}, {cmd:eqlabels()}, {cmd:headings()}, or {cmd:groups()} + are not allowed if {cmd:at} is specified. Also not allowed with {cmd:at} + are options {cmd:bycoefs}, {cmd:order()}, and {cmd:relocate()}. + Furthermore, note that {cmd:at} has to be specified for all models or + for none. {it:spec} is + + [{it:atspec}] [{cmd:,} {opt t:ransform(exp)}] + +{pmore} + where {it:atspec} may be + +{p2colset 13 27 29 2}{...} +{p2col:{it:mspec}}as above for {helpb coefplot##b:b()} + {p_end} +{p2col:#}use #th at-dimension ({helpb margins}) or #th row/column of main matrix + {p_end} +{p2col:{opt m:atrix(mspec)}}read from matrix instead of {cmd:e()} + {p_end} +{p2col:{opt _coef}}use coefficient names as plot positions + {p_end} +{p2col:{opt _eq}}use equation names as plot positions + {p_end} +{p2colreset}{...} + +{pmore} + If {cmd:at} is specified without argument, the plot positions are taken from the first row + of {cmd:e(at)} (or matrix {cmd:at}). A special case are results from + {helpb margins} where recovering the plot positions is more + complicated. The default in this case is to use the first + at-dimension. Type, e.g., {cmd:at(2)} if multiple at-dimension were specified + with {helpb margins} and you want to use the second dimension. Furthermore, + in matrix mode (see + {help coefplot##matrix:{it:Plotting results from matrices}} below), {cmd:at(2)} + would read the plot positions from the 2nd row (or column) of the main matrix. + +{pmore} + When plotting results from {cmd:e()} it is sometimes convenient to + maintain an external matrix with the plot positions instead of + adding plot positions to each {cmd:e()}-set. In this case you can use + syntax {cmd:at(matrix(}{it:mspec}{cmd:))} to read the plot positions. Note + that the vector of plot positions must have the same length as the + coefficient vectors of the plotted models; elements are matched by position, + not by name. + +{pmore} + Furthermore, {cmd:at(_coef)} or {cmd:at(_eq)} will use the coefficient names or + the equation names as plot positions, respectively. This is useful only if + the coefficient names or the equation names are numeric. Note that you may + use {helpb coefplot##rename:rename()} and + {helpb coefplot##eqrename:eqrename()} to strip a non-numeric prefix or suffix + from coefficient names or equation names. + +{pmore} + Suboption {cmd:transform()} transforms the plot positions before creating + the graph. Within the transformation expression, use {cmd:@} as a + placeholder for the value to be transformed. For example, to take the + antilogarithm of the plot positions type {cmd:transform(exp(@))}. + +{marker keep}{...} +{phang} + {cmd:keep(}{it:coeflist}{cmd:)} specifies the coefficients to be + plotted. The default is to include all coefficients from the + first (nonzero) equation of a model (and discard further equations). + {it:coeflist} is a space-separated list of + elements such as: + +{p2colset 13 25 27 2}{...} +{p2col:{it:coef}}keep coefficient {it:coef} + {p_end} +{p2col:{it:eq}{cmd::}}keep all coefficients from equation {it:eq} + {p_end} +{p2col:{it:eq}{cmd::}{it:coef}}keep coefficient {it:coef} from equation {it:eq} + {p_end} +{p2colreset}{...} + +{pmore} + where {it:eq} and {it:coef} may contain "{cmd:*}" (any string) and + "{cmd:?}" (any nonzero character) wildcards. For example, type {cmd:keep(*:)} or + {cmd:keep(*:*)} to plot all coefficients from all equations. + +{pmore} + If {it:eq} is specified, it is applied to all subsequent + names until a new {it:eq} is specified. For example, + {cmd:keep(3:mpg price 4:weight)} will plot coefficients "{cmd:mpg}" and + "{cmd:price}" from equation "{cmd:3}" and coefficient "{cmd:weight}" from + equation "{cmd:4}". + +{marker drop}{...} +{phang} + {cmd:drop(}{it:coeflist}{cmd:)} drops the specified coefficients, where + {it:coeflist} is as above for {helpb coefplot##keep:keep()}. + +{marker noci}{...} +{phang} + {cmd:noci} omits confidence intervals. + +{marker levels}{...} +{phang} + {cmd:levels(}{it:{help numlist}}{cmd:)} sets the level(s), as percentages, + for confidence intervals. Specified values may be between 10.00 and 99.99 + and can have at most two digits after the decimal point. The default is + {cmd:levels(95)} or as set by {helpb set level}. If multiple values are + specified, multiple confidence intervals are plotted. For example, type + {cmd:levels(99.9 99 95)} to plot the 99.9%, 99%, and 95% confidence + intervals. The default is to use (logarithmically) increasing line widths + for multiple confidence intervals. This behavior is disabled as soon as + {cmd:lwidth()} or {cmd:recast()} is specified within + {helpb coefplot##ciopts:ciopts()}. + +{marker ci}{...} +{phang} + {cmd:ci(}{it:spec}{cmd:)} specifies the source from which to collect + confidence intervals. Default is to compute confidence intervals for the + levels specified in {cmd:levels()} using variances/standard errors (and, + possibly, degrees of freedom). The {cmd:ci()} option is useful to + plot confidence intervals that have been provided by the estimation + command (such as, e.g., {helpb bootstrap}). {it:spec} is + + {it:cispec} [{it:cispec} ...] + +{pmore} + where {it:cispec} is {it:name} to get the lower and upper confidence limits + from rows 1 and 2 of {cmd:e(}{it:name}{cmd:)} (or matrix {it:name}), + respectively. Alternatively, {it:cispec} may be {cmd:(}{it:mspec} + {it:mspec}{cmd:)} to identify the lower and upper confidence limits, with + {it:mspec} as above for {helpb coefplot##b:b()}. For example, after + {helpb bootstrap}, {cmd:ci(ci_bc)} would get bias-corrected confidence intervals + from rows 1 and 2 of {cmd:e(ci_bc)}. The same could be achieved by + {cmd:ci((ci_bc[1] ci_bc[2]))}. + +{pmore} + {it:cispec} may also be # for a specific confidence level as in + {helpb coefplot##levels:levels()}. Hence, you may type, e.g., + {cmd:ci(95 myci)} to plot the usual 95% confidence intervals along with + custom confidence intervals provided in {cmd:e(myci)}. Levels specified + in {cmd:ci()} take precedence over levels specified in {cmd:levels()}), + however, you may also type {cmd:""} within {cmd:ci()} to leave a + position blank an use the specified level from {cmd:levels()}. + +{pmore} + In matrix mode (see + {help coefplot##matrix:{it:Plotting results from matrices}} below), + {it:cispec} may also be {cmd:(}# #{cmd:)}. For example, {cmd:ci((2 3))} would + read the lower confidence limit from the 2nd row (or column) and + the upper confidence limit from the 3rd row (or column) of the main matrix. + +{marker v}{...} +{phang} + {cmd:v(}{it:name}{cmd:)} specifies that the variances for confidence interval + computation are to be taken from the diagonal of {cmd:e(}{it:name}{cmd:)} + (or matrix {it:name}). Default is {cmd:e(V)} (or {cmd:e(V_mi)} if plotting + results from {helpb mi estimate}). + +{marker se}{...} +{phang} + {cmd:se(}{it:mspec}{cmd:)} provides standard errors to be used for + computation of confidence intervals. Default is to compute confidence + intervals based on the variances in {cmd:e(V)} + (see {helpb coefplot##v:v()} above). {it:mspec} is as above for + {helpb coefplot##b:b()}. + In matrix mode (see + {help coefplot##matrix:{it:Plotting results from matrices}} below), you may + also specify {cmd:se(}#{cmd:)} to read the standard errors from the #th + row (or column) of the main matrix. + +{marker df}{...} +{phang} + {cmd:df(}{it:spec}{cmd:)} specifies degrees of freedom (DF) to be taken into + account for confidence interval computation. Default is to obtain DF + from scalar {cmd:e(df_r)} if defined (as in, e.g., {helpb regress}) + or, for results from {helpb mi estimate}, from matrix {cmd:e(df_mi)}. Otherwise, + no DF are taken into account. Specify {cmd:df(}{it:spec}{cmd:)} to provide + custom DF. {it:spec} may be: + +{p2colset 13 25 27 2}{...} +{p2col:#}set DF for all coefficients to # + {p_end} +{p2col:{it:mspec}}as above for {helpb coefplot##b:b()} + {p_end} +{p2colreset}{...} + +{marker citype}{...} +{phang} + {cmd:citype(}{it:method}{cmd:)} specifies the method to be used to compute the limits of + confidence intervals. {it:method} can be {cmd:normal}, {cmd:logit}, {cmd:probit}, + {cmd:atanh}, or {cmd:log}. + +{pmore} + {cmd:citype(normal)}, the default, computes confidence + limits based on untransformed coefficients and standard errors. Let {it:b} be + the point estimate, {it:se} the standard error, and {it:t} the (1-{it:a}/2) + quantile of the standard normal distribution or the t-distribution (if degrees + of freedom are available; see above), where {it:a} is 1 minus the + confidence level (e.g. {it:a}=5% for a 95% confidence interval). Then the + limits of the confidence interval are computed as + + {it:b} +/- {it:t} * {it:se} + +{pmore} + {cmd:citype(logit)} uses the logit transformation to compute the limits + of confidence intervals. This is useful if the estimates to be plotted are + proportions and the confidence limits are supposed to lie between 0 and + 1. The limits are computed as + + invlogit(logit({it:b}) +/- {it:t} * {it:se} / ({it:b} * (1 - {it:b}))) + +{pmore} + {cmd:citype(probit)} is an alternative to {cmd:citype(logit)} and computes the + limits as + + normal(invnormal({it:b}) +/- {it:t} * {it:se} / normalden(invnormal({it:b}))) + +{pmore} + {cmd:citype(atanh)} uses the inverse hyperbolic tangent to compute the + confidence intervals. This is useful for estimates that lie between -1 and + 1, such as a correlation coefficient. The limits are computed as: + + tanh(atanh({it:b}) +/- {it:t} * {it:se} / (1 - {it:b}^2)) + +{pmore} + {cmd:citype(log)} computes log-transformed confidence intervals. This is useful + for estimates that may only be positive, such as a variance estimate. The limits + are computed as: + + exp(ln({it:b}) +/- {it:t} * {it:se} / {it:b}) + +{marker eform}{...} +{phang} + {cmd:eform}[{cmd:(}{it:coeflist}{cmd:)}] causes point estimates and + confidence intervals to be exponentiated. This is useful + if you want to plot hazard ratios (HR), incidence-rate ratios (IRR), + odds ratios (OR), or relative-risk ratios (RRR). If {cmd:eform} is + specified without arguments, then all coefficients of the model are + exponentiated. To exponentiate only selected coefficients, specify + {it:coeflist} as above for {helpb coefplot##keep:keep()}. + +{marker rescale}{...} +{phang} + {cmd:rescale(}{it:spec}{cmd:)} rescales point estimates and confidence + intervals. Type {cmd:rescale(}#{cmd:)} to rescale all coefficients + by a constant factor. For example, {cmd:rescale(100)} will multiply all + coefficients by 100. Alternatively, {it:spec} may be + + {it:coeflist} {cmd:=} # [{it:coeflist} {cmd:=} # ...] + +{pmore} + with {it:coeflist} as above for {helpb coefplot##keep:keep()}. + +{marker transform}{...} +{phang} + {cmd:transform(}{it:matchlist}{cmd:)} transforms point estimates and confidence + intervals. {it:machlist} is: + + {it:coeflist} {cmd:= "}{it:{help exp}}{cmd:"} [{it:coeflist} {cmd:= "}{it:{help exp}}{cmd:"} ...] + +{pmore} + with {it:coeflist} as above for {helpb coefplot##keep:keep()}. Within the + transformation expression, use {cmd:@} as a placeholder for + the value to be transformed. For example, to take the square root of all + coefficients type {cmd:transform(* = sqrt(@))}. In addition, internal + variables may be used as explained in + {help coefplot##tempvar:Accessing internal temporary variables}. The + transformation expression must be enclosed in double quotes if it contains + spaces. If specified, {cmd:eform()} and {cmd:rescale()} are applied before applying + {cmd:transform()}. + +{marker rename}{...} +{phang} + {cmd:rename(}{it:spec}{cmd:)} renames coefficients. {it:spec} is: + + {it:coeflist} {cmd:=} {it:newname} [{it:coeflist} {cmd:=} {it:newname} ...] [{cmd:,} {cmdab:r:egex}] + +{pmore} + with {it:coeflist} as above for {helpb coefplot##keep:keep()} except that + wildcards are only allowed in equation names, and coefficient names may + be specified as {it:prefix}{cmd:*} to replace a prefix or + {cmd:*}{it:suffix} to replace a suffix. For example, + {cmd:rename(*.foreign = .cartype)} will rename coefficients such as + {cmd:0.foreign} and {cmd:1.foreign} to {cmd:0.cartype} and + {cmd:1.cartype}. {it:newname} must be enclosed in double quotes if it + contains spaces. For labeling coefficients, also see + {helpb coefplot##coeflabels:coeflabels()}. + +{pmore} + Apply option {cmd:regex} to cause coefficient specifications (but not + equation specifications) to be interpreted as + {browse "https://en.wikipedia.org/wiki/Regular_expression":regular expressions}. In this + case, {it:newname} may contain {cmd:\1}, ..., {cmd:\9} to reference back to + matched subexpressions (and {cmd:\0} for the entire match). For example, type + {cmd:rename(^AA([0-9]+)BB$ = YY\1ZZ, regex)} to rename + coefficients such as {cmd:AA123BB}, {cmd:AA0BB}, or {cmd:AA99BB} to + {cmd:YY123ZZ}, {cmd:YY0ZZ}, or {cmd:YY99ZZ}. If the leading {cmd:^} or the + tailing {cmd:$} is omitted, only the matched part of a coefficient name is + subject to substitution; the rest of the name will remain unchanged. Include + the regular expressions in quotes or compound double quotes if they contain + funny characters (such as, e.g., quotes, equal signs, or commas). + +{marker eqrename}{...} +{phang} + {cmd:eqrename(}{it:spec}{cmd:)} renames equations. {it:spec} is: + + {it:eqlist} {cmd:=} {it:newname} [{it:eqlist} {cmd:=} {it:newname} ...] [{cmd:,} {cmdab:r:egex}] + +{pmore} + where {it:eqlist} is a space separated list of equation names. Equation + names may be {it:prefix}{cmd:*} to replace a prefix or + {cmd:*}{it:suffix} to replace a suffix. For example, + {cmd:eqrename(rep78* = reprec)} will rename equations such as + {cmd:rep78_3} and {cmd:rep78_4} to {cmd:reprec_3} and + {cmd:reprec_4}. {it:newname} must be enclosed in double quotes if it + contains spaces. For labeling equations, also see + {helpb coefplot##eqlabels:eqlabels()}. + +{pmore} + Apply option {cmd:regex} to cause equation specifications to be interpreted as + {browse "https://en.wikipedia.org/wiki/Regular_expression":regular expressions}. In this + case, {it:newname} may contain {cmd:\1}, ..., {cmd:\9} to reference back to + matched subexpressions (and {cmd:\0} for the entire match). For example, type + {cmd:eqrename(^eq([0-9])0$ = Outcome_\1, regex)} to rename + equations such as {cmd:eq20} or {cmd:eq90} to + {cmd:Outcome_1} or {cmd:Outcome_9}. If the leading {cmd:^} or the + tailing {cmd:$} is omitted, only the matched part of an equation name is + subject to substitution; the rest of the name will remain unchanged. Include the regular expressions in + quotes or compound double quotes if they contain funny characters (such as, e.g., quotes, + equal signs, or commas). + +{marker asequation}{...} +{phang} + {cmd:asequation}[{cmd:(}{it:string}{cmd:)}] sets the equation name for all + included coefficients from the model to {it:string}. This is useful if you + want to assign an equation name to results that have been stored without + information on equations. If {cmd:asequation} is specified without + argument, the name of the model is used. If you apply the + {cmd:asequation()} option you may also want to specify + {helpb coefplot##eqstrict:eqstrict}. + +{marker swapnames}{...} +{phang} + {cmd:swapnames} swaps coefficient names and equation names after collecting + the model's results. The names are swapped after applying model options + such as {cmd:keep()}, {cmd:drop()}, or {cmd:rename()} but + before applying global options such as {cmd:coeflabel()}, {cmd:order()}, + or {cmd:eqlabels()}. + +{marker mlabels}{...} +{phang} + {cmd:mlabels(}{it:matchlist}{cmd:)} specifies marker labels for + selected coefficients. {it:matchlist} is: + + {it:coeflist} {cmd:=} # "{it:label}" [{it:coeflist} {cmd:=} # "{it:label}" ...] + +{pmore} + where {it:coeflist} is as above for {helpb coefplot##keep:keep()} and # is a + number 0--12 for the location of the marker label (see + {manhelpi clockposstyle G-4}). Not all of Stata's plot types + support marker labels. For example, if you use + {helpb coefplot##recast:recast(bar)} to change the plot type to + {helpb twoway_bar:bar}, no marker labels will be displayed (this has + changed with the April 6, 2022, update to Stata 17; plot type + {helpb twoway_bar:bar} now displays marker labels). + +{marker aux}{...} +{phang} + {cmd:aux(}{it:mspec} [{it:mspec} ...]{cmd:)} collects additional results + and makes them available as internal variables. {it:mspec} is as above for + {helpb coefplot##b:b()}. The internal variables + are named {cmd:@aux1}, {cmd:@aux2}, ..., and can be used within + {helpb coefplot##ifopt:if()}, + {helpb coefplot##weight:weight()}, + {helpb coefplot##transform:transform()}, + {helpb marker_label_options:mlabel()}, + {helpb marker_label_options:mlabvposition()}, and + {helpb addplot_option:addplot()} (see + {help coefplot##tempvar:Accessing internal temporary variables} + below). In matrix mode (see + {help coefplot##matrix:{it:Plotting results from matrices}} below), you may + also specify {cmd:aux(}# [# ...]{cmd:)} to read the from corresponding + rows (or column) of the main matrix. + +{dlgtab:Plot options} + +{marker label}{...} +{phang} + {cmd:label(}{it:string}{cmd:)} provides a label for the plot to be used + in the legend. Use double quotes to create multiline labels. For example, + {cmd:label("This is a" "long label")} would create a two-line label. For + text effects (bold, italics, greek letters, etc.) use SMCL tags as + described in {it:{help graph_text}}. + +{marker key}{...} +{phang} + {cmd:key}[{cmd:(ci} [{cmd:#}]{cmd:)}] determines the key symbol + to be used for the plot in the legend. {cmd:key} without argument uses + the plot's marker symbol; this is the default. {cmd:key(ci)} determines + the key symbol from the (first) confidence interval. {cmd:key(ci #)} + determines the key symbol from the #th confidence interval; this is only + useful if multiple confidence intervals are included in the plot. + +{marker nokey}{...} +{phang} + {cmd:nokey} prevents including the plot in the legend. + +{marker pstyle}{...} +{phang}{cmd:pstyle(}{it:pstyle}{cmd:)} sets the overall style of the + plot; see help {it:{help pstyle}}. {cmd:pstyle()} affects both, + coefficient markers and confidence spikes. To use a different plot style + for confidence spikes, add {cmd:pstyle()} within + {helpb coefplot##ciopts:ciopts()}. + +{marker axis}{...} +{phang}{cmd:axis(}{it:#}{cmd:)} specifies the scale axis to be used for the + plot, where {cmd:1} {ul:<} {it:#} {ul:<} {cmd:9}. The default is to place + all plots on the same scale axis. + +{marker offset}{...} +{phang} + {cmd:offset(}{it:#}{cmd:)} specifies a custom offset for the plot + positions. The default is to create automatic offsets to prevent + overlap of confidence spikes as soon as there are + multiple plots. The spacing between coefficients is one unit, so + {it:#} should usually be within -0.5 and 0.5. {it:#} may also be a scalar + expression such as, say, {cmd:1/6}. + +{marker ifopt}{...} +{phang} + {cmd:if(}{it:exp}{cmd:)} restricts the contents of the plot to coefficients + satisfying {it:exp}. The option is useful when you want to select + coefficients, e.g., based on their values, plot positions, or confidence + limits. Within {it:exp} refer to internal temporary variables as explained + in {help coefplot##tempvar:Accessing internal temporary variables} below. + For example, to include positive coefficients only, you could type + {cmd:if(@b>=0)}. Note that {cmd:if()} does not affect the rendition of the + categorical axis (unless {helpb coefplot##at:at} is specified). That is, a + complete categorical axis is created including labels for all collected + coefficients, even for the ones that have been removed from the plot by + {cmd:if()}. + +{marker weight}{...} +{phang} + {cmd:weight(}{it:exp}{cmd:)} scales the size of the markers according to + the size of the specified weights (see + {help scatter##remarks14:Weighted markers} in help {helpb scatter}). Within + {it:exp} refer to internal temporary variables as explained in + {help coefplot##tempvar:Accessing internal temporary variables} below. For + example, to scale markers according to the inverse of standard errors, you + could type {cmd:weight(1/@se)}. {cmd:weight()} has no effect if marker + labels are specified. + +{phang} + {it:marker_options} change the look of the coefficient markers (color, + size, etc.); see help {it:{help marker_options}}. + +{marker mlabel}{...} +{phang} + {cmd:mlabel}[{cmd:(}{it:spec}{cmd:)}] adds marker labels to the + plot. For adding custom labels to specific markers also see model option + {helpb coefplot##mlabels:mlabels()} above. Furthermore, note that + not all of Stata's plot types support marker labels. For example, if you use + {helpb coefplot##recast:recast(bar)} to change the plot type to + {helpb twoway_bar:bar}, no marker labels will be displayed (this has + changed with the April 6, 2022, update to Stata 17; plot type + {helpb twoway_bar:bar} now displays marker labels). + +{pmore} + The {cmd:mlabel} option can be used in three different ways: + +{pmore2} + (1) {opt mlabel} without argument adds the values of the point estimates as + marker labels. Use global option + {helpb coefplot##format:format()} to set the display format. + +{pmore2} + (2) {opth mlabel(varname)} uses the values of the specified variable + as marker labels. {it:varname} may be an internal variable (see + {help coefplot##tempvar:Accessing internal temporary variables} below). For example, + {cmd:mlabel(@b)} is equivalent to {cmd:mlabel} without argument. + +{pmore2} + (3) {opt mlabel(strexp)} sets the marker labels to the evaluation of the + specified string expression. Internal variables can be used within {it:strexp} + (see {help coefplot##tempvar:Accessing internal temporary variables} + below). For example, you can type + +{pmore3} + mlabel("p = " + string(@pval,"%9.3f")) + +{pmore2} + to display labels such as "p = 0.001" or "p = 0.127". Furthermore, + +{pmore3} + mlabel(cond(@pval<.001, "***", cond(@pval<.01, "**", cond(@pval<.05, "*", "")))) + +{pmore2} + would display significance stars. + +{phang} + {it:marker_label_options} change the look and + position of marker labels; see help {it:{help marker_label_options}}. + +{marker recast}{...} +{phang} + {cmd:recast(}{it:plottype}{cmd:)} plots the coefficients using + {it:plottype}; supported plot types are + {helpb scatter}, + {helpb line}, + {helpb twoway_connected:connected}, + {helpb twoway_area:area}, + {helpb twoway_bar:bar}, + {helpb twoway_spike:spike}, + {helpb twoway_dropline:dropline}, and + {helpb twoway_dot:dot}. The default {it:plottype} is {helpb scatter}. The + chosen plot type affects the available plot options. For example, if + the plot type is {helpb twoway_bar:bar} then {it:{help barlook_options}} + will be available. See the plot type's help file for details. + +{marker cionly}{...} +{phang} + {cmd:cionly} causes markers for point estimates to be suppressed. + +{marker citop}{...} +{phang} + {cmd:citop} specifies that confidence intervals be drawn in front of + the markers for point estimates; the default is to draw confidence intervals + behind the markers. + +{marker cirecast}{...} +{phang} + {cmd:cirecast(}{it:plottype}{cmd:)} is shorthand notation for + {helpb coefplot##ciopts:ciopts(recast())}. If both are provided, the plot types + specified in {cmd:ciopts(recast())} take precedence over the plot types + specified in {cmd:cirecast()}. + +{marker ciopts}{...} +{phang} + {cmd:ciopts(}{it:options}{cmd:)} affect the rendition of confidence + intervals. {it:options} are: + +{p2colset 13 31 33 2}{...} +{p2col:{it:{help line_options}}}change look of spikes + {p_end} +{p2col:{cmd:recast(}{it:plottype}{cmd:)}}plot the confidence intervals using + {it:plottype} + {p_end} +{p2colreset}{...} + +{pmore} + Supported plot types are + {helpb twoway_rarea:rarea}, + {helpb twoway_rbar:rbar}, + {helpb twoway_rspike:rspike}, + {helpb twoway_rcap:rcap}, + {helpb twoway_rcapsym:rcapsym}, + {helpb twoway_rscatter:rscatter}, + {helpb twoway_rline:rline}, + {helpb twoway_rconnected:rconnected}, + {helpb twoway_pcspike:pcspike}, + {helpb twoway_pcspike:pccapsym}, + {helpb twoway_pcarrow:pcarrow} (or {cmd:pcrarrow} for the reverse), + {helpb twoway_pcbarrow:pcbarrow}, and + {helpb twoway_pcscatter:pcscatter}. The default {it:plottype} is + {helpb twoway_rspike:rspike}. The chosen plot type affects the available + options within {cmd:ciopts()}. For example, if the plot type is + {helpb twoway_rbar:rbar} then {it:{help barlook_options}} will be + available. See the plot type's help file for details. + +{pmore} + If multiple confidence intervals are requested, then + {it:{help stylelists}} may be specified in the options within + {cmd:ciopts()}. For example, {cmd:recast(rspike rcap ..)} would use + {helpb twoway_rspike:rspike} for the first confidence interval and + {helpb twoway_rcap:rcap} for the remaining confidence intervals; + {cmd:lwidth(thin medium thick)} would use thin lines for the first + confidence interval, medium width lines for the second, and thick lines + for the third. + +{marker cismooth}{...} +{phang} + {cmd:cismooth}[{cmd:(}{it:options}{cmd:)}] adds smoothed confidence + intervals. {it:options} are: + +{p2colset 13 33 35 2}{...} +{p2col:{cmd:n(}{it:n}{cmd:)}}number of (equally spaced) confidence levels; + default is {cmd:n(50)}; levels are placed in steps of 100/{it:n} from 100/2{it:n} to + 100-100/2{it:n} (e.g., 1, 3, 5, ..., 99 for {it:n}=50) + {p_end} +{p2col:{cmdab:lw:idth(}{it:min max}{cmd:)}}set range of + (relative) line widths; the default is {cmd:range(2 15)} + ({it:max} is exact only for {it:n}=50) + {p_end} +{p2col:{cmdab:i:ntensity(}{it:min max}{cmd:)}}set range of + color intensities, as percentages; the default is {cmd:intensity(}{it:min} {cmd:100)} + where {it:min} is determined as 4/(ceil({it:n}/2)+3)*100 (about 14 for n=50) + {p_end} +{p2col:{cmdab:c:olor(}{help colorstyle:{it:color}}{cmd:)}}set the color (without + intensity multiplier); the default color is determined by the graph scheme + {p_end} +{p2col:{cmdab:psty:le(}{help pstyle:{it:pstyle}}{cmd:)}}set the overall style; + this mainly affects the color + {p_end} +{p2colreset}{...} + +{pmore} + The confidence intervals produced by {cmd:cismooth} are placed behind + confidence intervals requested in {helpb coefplot##levels:levels()} and + {helpb coefplot##ci:ci()}. {helpb coefplot##ciopts:ciopts()} do not + apply to them. + +{dlgtab:Subgraph options} + +{marker bylabel}{...} +{phang} + {cmd:bylabel(}{it:string}{cmd:)} provides a label for the subgraph. Use + double quotes to create multiline labels. For example, + {cmd:bylabel("This is a" "long label")} would create a two-line label. For + text effects (bold, italics, greek letters, etc.) use SMCL tags as + described in {it:{help graph_text}}. + +{pmore} + Subgraphs are implemented in terms of {helpb graph}'s {cmd:by()} option; see + {helpb coefplot##byopts:byopts()} below for options on how to combine and + render the subgraphs. + +{dlgtab:Global options} + +{marker horizontal}{...} +{phang} + {cmd:horizontal} places coefficient values on the x axis. This is the + default unless {helpb coefplot##at:at} is specified. + +{marker vertical}{...} +{phang} + {cmd:vertical} places coefficient values on the y axis. This is the + default if {helpb coefplot##at:at} is specified. + +{marker eqstrict}{...} +{phang} + {cmd:eqstrict} causes equation names to be taken into account (i.e. match coefficients by + equation names and plot equation labels) even if there is only one equation per model. + +{marker order}{...} +{phang} + {cmd:order(}{it:coeflist}{cmd:)} specifies the order of coefficients + (not allowed with {helpb coefplot##at:at}). The default is to use + the order as found in the input models (and place {cmd:_cons} last, within + equations). {it:coeflist} is a + space-separated list of elements such as: + +{p2colset 13 25 27 2}{...} +{p2col:{cmd:.}}insert a gap + {p_end} +{p2col:{it:eq}{cmd::.}}insert a gap within equation {it:eq} + {p_end} +{p2col:{it:coef}}coefficient {it:coef} + {p_end} +{p2col:{it:eq}{cmd::}}all coefficients from equation {it:eq}, in their current order + {p_end} +{p2col:{it:eq}{cmd::}{it:coef}}coefficient {it:coef} from equation {it:eq} + {p_end} +{p2colreset}{...} + +{pmore} + where {it:coef} may contain "{cmd:*}" (any string) and "{cmd:?}" + (any nonzero character) wildcards. + +{pmore} + If no equations are specified, then the requested order of coefficients + is repeated within each equation (keeping the existing order of + equations). Otherwise, the requested order is applied across equations. + Note that in the later case the first element in {cmd:order()} must be an + equation name. {it:eq} is applied to all subsequent elements until a + new {it:eq} is specified. For example, + {cmd:order(5:weight mpg * 4:turn *)} would yield the following order: + "{cmd:weight}" from equation "{cmd:5}", "{cmd:mpg}" from equation "{cmd:5}", + remaining coefficients from equation "{cmd:5}", + "{cmd:turn}" from equation "{cmd:4}", remaining coefficients from equation + "{cmd:4}", remaining equations if any. + +{marker orderby}{...} +{phang} + {cmd:orderby(}[{it:subgraph}{cmd::}][{it:plot}]{cmd:)} orders the + coefficients by a specific model. By default, the coefficients are ordered + according to how they are provided to {cmd:coefplot}, with earlier plots + and subgraphs taking precedence over later ones (and placing {cmd:_cons} + last). This means that coefficients that only appear in later models will + be placed after the coefficients that appear in earlier models. Specify the + {cmd:orderby()} option if you want to change the default behavior and + arrange the coefficients according to their order in a specific model + (and, within each equation, place the other coefficients after these coefficients, but + before {cmd:_cons}). Arguments {it:subgraph} and {it:plot} select the relevant + model. For example, {cmd:orderby(2:3)} will order coefficients according to + the model that is displayed in the third plot of the second subgraph. If one + of the arguments is omitted, it defaults to one. Hence, {cmd:orderby(3)} will + order the coefficients according to the model displayed in the third plot + of the first subgraph; {cmd:orderby(2:)} will use the model displayed in the first + plot of the second subgraph. {cmd:orderby()} will do nothing if a specified subgraph or + plot does not exist. Furthermore, note that the {it:subgraph} argument + is not allowed if the {helpb coefplot##norecycle:norecycle} option has been + specified; plots are numbered uniquely across subgraphs in this case. + +{marker sort}{...} +{phang} + {cmd:sort}[{cmd:(}{it:spec}{cmd:)}] sorts the coefficients by size. {it:spec} is + + [{it:subgraph}{cmd::}][{it:plot}] [, {cmdab:d:escending} {cmd:by(}{it:stat}{cmd:)} ] + +{pmore} + where {it:subgraph} and {it:plot}, being equal to {cmd:.} or a positive + integer, identify the subgraph and plot to be used + to establish the sort order. For example, to sort based on all values in + the second subgraph (possibly including multiple plots), type + {cmd:sort(2:)} or {cmd:sort(2:.)}; to sort based on all values in the third + plot (possibly spanning multiple subgraphs), type {cmd:sort(3)} or + {cmd:sort(.:3)}; to sort based on the values of the third plot in the + second subgraph, type {cmd:sort(2:3)}. Specifying {cmd:sort} without + argument is equivalent to {cmd:sort(.:.)}, that is, to sort based on the + values in all available subgraphs and plots. If you specify a subgraph or + plot that does not exist, {cmd:sort()} will do nothing. Furthermore, if the + {helpb coefplot##norecycle:norecycle} option is specified, the {it:subgraph} + argument can be omitted as the plots will be uniquely numbered across + subgraphs. + +{pmore} + By default, the coefficients are sorted in ascending order of the values of + the point estimates. Specify suboption {cmd:descending} to use a + descending sort order. Furthermore, use {cmd:by(}{it:stat}{cmd:)} to change + the relevant statistic, where {it:stat} may be: + +{p2colset 13 25 27 2}{...} +{p2col:{cmd:b}}sort by point estimate (the default){p_end} +{p2col:{cmd:v} (or {cmd:se})}sort by variance (or standard error){p_end} +{p2col:{cmd:t}}sort by t (or z) statistic{p_end} +{p2col:{cmd:tabs}}sort by absolute t (or z) statistic{p_end} +{p2col:{cmd:p}}sort by p-value{p_end} +{p2col:{cmd:df}}sort by degrees of freedom{p_end} +{p2col:{cmd:ll} [#]}sort by (#th) lower confidence limit; # defaults to 1{p_end} +{p2col:{cmd:ul} [#]}sort by (#th) upper confidence limit; # defaults to 1{p_end} +{p2col:{cmd:aux} [#]}sort by (#th) auxiliary variable (see the + {helpb coefplot##aux:aux()} option); # defaults to 1{p_end} +{p2colreset}{...} + +{pmore} + In case of multiple equations, coefficients will be sorted separately + within each equation, keeping the original order of equations. Use the + {helpb coefplot##order:order()} option the change the order of the equations. + +{marker relocate}{...} +{phang} + {cmd:relocate(}{it:spec}{cmd:)} assigns specific positions to the + coefficients on the category axis. {it:spec} is: + + [{it:eq}{cmd::}]{it:coef} {cmd:=} # [[{it:eq}{cmd::}]{it:coef} {cmd:=} # ...] + +{pmore} + where {it:eq} and {it:coef} may contain "{cmd:*}" (any string) and + "{cmd:?}" (any nonzero character) wildcards. If {helpb coefplot##bycoefs:bycoefs} is + specified, use numbers (1, 2, ...) instead of {it:eq} and {it:coef} + to address the elements on the categorical axis. + +{pmore}The default for {cmd:coefplot} is to place coefficients + at integer values 1, 2, 3, ... (from top to bottom in horizontal mode, + from left to right in vertical mode). The {cmd:relocate()} option gives + you the possibility to specify alternative values. If, for example, you + want to place coefficient {cmd:mpg} at value 2.5 on the category axis, you + could type {cmd:relocate(mpg = 2.5)}. If you only want to change the + order of coefficients and are fine with integer positions, then use the + {helpb coefplot##order:order()} option. Note that the specified positions + are assigned before inserting gaps between equations, headings, and + groups (see {helpb coefplot##eqlabels:eqlabels()}, + {helpb coefplot##headings:headings()}, and + {helpb coefplot##groups:groups()}). Hence, the final plot positions might + deviate from the specified positions if there are equation labels, headings, + or group labels. + +{marker bycoefs}{...} +{phang} + {cmd:bycoefs} flips subgraphs and coefficients (not allowed with + {helpb coefplot##at:at}). If {cmd:bycoefs} is specified, a + separate subgraph is produced for each coefficient. In this + case, use integer numbers (1, 2, ...) instead of coefficient names + to address the elements on the categorical axis within options + {helpb coefplot##relocate:relocate()}, + {helpb coefplot##headings:headings()}, and + {helpb coefplot##groups:groups()}. + +{marker norecycle}{...} +{phang} + {cmd:norecycle} increments plot styles across subgraphs. The default is + to start over with each new subgraph. + +{marker nooffsets}{...} +{phang} + {cmd:nooffsets} suppresses automatic offsets for plot positions. + +{marker format}{...} +{phang} + {cmd:format(}{it:format}{cmd:)} sets the display format for + coefficients. This affects the rendition of the axis and marker + labels. {it:format} may be a numeric format or a date format + (see help {helpb format}). + +{marker pnum}{...} +{phang} + {cmd:p{it:#}(}{help coefplot##plotopts:{it:plotopts}}{cmd:)} specifies + options for the {it:#}th plot. For example, type {cmd:p2(nokey)} to exclude + plot 2 from the legend (see {helpb coefplot##nokey:nokey}). Use the {cmd:p#()} + options as an alternative to specifying options directly within a plot; in + case of conflict, options specified within a plot take precedence + over options specified via {cmd:p#()}. + +{marker nolabels}{...} +{phang} + {cmd:nolabels} causes coefficient names to be used as labels instead of + variable labels or value labels. + +{marker coeflabels}{...} +{phang} + {cmd:coeflabels(}{it:spec}{cmd:)} specifies custom labels for + coefficients (not allowed with {helpb coefplot##at:at}). {it:spec} is + +{p 12 14 2} + [{it:coeflist} {cmd:=} {cmd:"}{it:label}{cmd:"} [{it:coeflist} {cmd:=} {cmd:"}{it:label}{cmd:"} ...]] + [{cmd:,} {cmdab:t:runcate(}#{cmd:)} {cmdab:w:rap(}#{cmd:)} {cmdab:nob:reak} + {cmdab:i:nteraction(}{it:string}{cmd:)} + {it:{help axis_label_options:suboptions}}] + +{pmore} + with {it:coeflist} as above for {helpb coefplot##keep:keep()}. Enclose + {it:label} in double quotes + if it contains spaces, e.g. {bind:{cmd:coeflabels(foreign = "Car Type")}}. + Enclose {it:label} in compound double quotes to create a multiline + label, e.g. {bind:{cmd:coeflabels(foreign = `""This is a" "long label""')}}; + alternatively, apply the {cmd:wrap()} option. For text effects + (bold, italics, greek letters, etc.) use SMCL tags as described in + {it:{help graph_text}}. + +{pmore} + Option {cmd:truncate(}#{cmd:)} truncates coefficient labels to + a maximum length of # characters. Option {cmd:wrap(}#{cmd:)} divides + coefficient labels into multiple lines, where each line has a maximum + length of # characters. {cmd:truncate()} and {cmd:wrap()} operate on + words. That is, they try to fill to the maximum length without breaking + in the middle of a word. However, if a word is longer than # characters, + it will be split or truncated. Specify {cmd:nobreak} to prevent + {cmd:truncate()} and {cmd:wrap()} from splitting or truncating words + that are longer than # characters. If {cmd:truncate()} and {cmd:wrap()} + are both specified, {cmd:truncate()} is applied first. + {cmdab:interaction()} specifies the string to be used as + delimiter in labels for interaction terms; the default is + {cmd:interaction(" # ")}. {it:suboptions} are axis label suboptions as + described in {it:{help axis_label_options}}. + +{pmore} + Note: Labels containing multiple lines are left unchanged by {cmd:truncate()} + and {cmd:wrap()}. Therefore, if you don't like how {cmd:wrap()} breaks a + specific label, you can provide a custom variant of it in {cmd:coeflabels()} + while still using {cmd:wrap()} for the other labels. {cmd:truncate()} + and {cmd:wrap()} may fail to process a label if it contains compound + double quotes; the label will be left unchanged in this case. + +{marker noeqlabels}{...} +{phang} + {cmd:noeqlabels} suppresses equation labels. + +{marker eqlabels}{...} +{phang} + {cmd:eqlabels(}{it:spec}{cmd:)} specifies custom labels for equations, one after + the other (not allowed with {helpb coefplot##at:at}). {it:spec} is: + +{p 12 14 2} + [{cmd:"}{it:label}{cmd:"} [{cmd:"}{it:label}{cmd:"} ...]] [{cmd:,} + {cmdab:lab:els}[{cmd:(}{it:string}{cmd:)}] + [{cmd:{ul:no}}]{cmdab:g:ap}[{cmd:(}#{cmd:)}] {cmdab:ashead:ings} + {cmdab:off:set(}#{cmd:)} {cmdab:t:runcate(}#{cmd:)} {cmdab:w:rap(}#{cmd:)} + {cmdab:nob:reak} {it:{help axis_label_options:suboptions}} ] + +{pmore} + Enclose labels in double quotes if they contain spaces, + e.g. {bind:{cmd:eqlabels("EQ one" "EQ two")}}. Enclose labels in compound + double quotes to create multiline labels, + e.g. {bind:{cmd:eqlabels(`""This is a" "long label""')}}. Alternatively, + apply the {cmd:wrap()} option. For text effects + (bold, italics, greek letters, etc.) use SMCL tags as described in + {it:{help graph_text}}. + +{pmore} + Option {cmd:label} causes the equation names to be treated as + variable names; {cmd:coefplot} will then use the corresponding variable labels + (and, depending on context, value labels) to label the equations. Specify + {cmd:label(}{it:string}{cmd:)} to set the string to be used as + delimiter in labels for interaction terms; typing {cmd:label} without argument + is equivalent to {cmd:label(" # ")}. {cmd:gap()} specifies the size of the + gap between equations. The + default is {cmd:gap(1)}. {cmd:nogap} suppresses the gap between + equations. {cmdab:asheadings} treats equation labels as headings; + see {helpb coefplot##headings:headings()}. {cmd:offset()}, only + allowed with {cmd:asheadings}, offsets the labels. {cmd:truncate()}, + {cmd:wrap()}, {cmd:nobreak}, and {it:suboptions} are as above for + {helpb coefplot##coeflabels:coeflabels()}. + +{marker headings}{...} +{phang} + {cmd:headings(}{it:spec}{cmd:)} adds headings between + coefficients (not allowed with {helpb coefplot##at:at}). {it:spec} is: + +{p 12 14 2} + {it:coeflist} {cmd:=} {cmd:"}{it:label}{cmd:"} [{it:coeflist} {cmd:=} {cmd:"}{it:label}{cmd:"} ...] + [{cmd:,} [{cmd:{ul:no}}]{cmdab:g:ap}[{cmd:(}#{cmd:)}] + {cmdab:off:set(}#{cmd:)} {cmdab:t:runcate(}#{cmd:)} + {cmdab:w:rap(}#{cmd:)} {cmdab:nob:reak} + {it:{help axis_label_options:suboptions}} ] + +{pmore} + with {it:coeflist} as above for {helpb coefplot##keep:keep()}. If + {helpb coefplot##bycoefs:bycoefs} is specified, use numbers 1, 2, + ... instead of {it:coeflist} to address the elements on the categorical + axis. Enclose {it:label} in double quotes if it contains + spaces. For example, {bind:{cmd:headings(0.foreign = "Car Type")}} will + print the heading "{cmd:Car Type}" before coefficient "{cmd:0.foreign}". + Enclose {it:label} in compound double quotes to create a multiline + label, e.g. {bind:{cmd:headings(foreign = `""This is a" "long heading""')}}. + Alternatively, apply the {cmd:wrap()} option. For text effects (bold, + italics, greek letters, etc.) use SMCL tags as + described in {it:{help graph_text}}. + +{pmore} + {cmd:gap()} and {cmdab:offset()} are as above for + {helpb coefplot##eqlabels:eqlabels()}. {cmd:truncate()}, {cmd:wrap()}, + {cmd:nobreak}, and {it:suboptions} are as above for + {helpb coefplot##coeflabels:coeflabels()}. + +{marker groups}{...} +{phang} + {cmd:groups(}{it:spec}{cmd:)} adds labels for groups of + coefficients (not allowed with {helpb coefplot##at:at}). The specified + label will be printed beside (or, in vertical mode, below) the identified + group of coefficients. {it:spec} is: + +{p 12 14 2} + {it:coeflist} {cmd:=} {cmd:"}{it:label}{cmd:"} [{it:coeflist} {cmd:=} {cmd:"}{it:label}{cmd:"} ...] + [{cmd:,} [{cmd:{ul:no}}]{cmdab:g:ap}[{cmd:(}#{cmd:)}] + {cmdab:t:runcate(}#{cmd:)} {cmdab:w:rap(}#{cmd:)} + {cmdab:nob:reak} {it:{help axis_label_options:suboptions}} ] + +{pmore} + with {it:coeflist} as above for {helpb coefplot##keep:keep()}. If + {helpb coefplot##bycoefs:bycoefs} is specified, use numbers 1, 2, + ... instead of {it:coeflist} to address the elements on the categorical + axis. Enclose {it:label} in double quotes if + it contains spaces. Enclose {it:label} in compound double quotes to create + a multiline label. Alternatively, apply the {cmd:wrap()} option. For text + effects (bold, italics, greek letters, etc.) use SMCL tags as described in + {it:{help graph_text}}. + +{pmore} + {cmd:gap()} is as above for + {helpb coefplot##eqlabels:eqlabels()}. {cmd:truncate()}, {cmd:wrap()}, + {cmd:nobreak}, and {it:suboptions} are as above for + {helpb coefplot##coeflabels:coeflabels()}. + +{marker plotlabels}{...} +{phang} + {cmd:plotlabels(}{it:spec}{cmd:)} specifies labels for the plots to be + used in the legend. Labels specified via {cmd:plotlabels()} + take precedence over labels specified in the + {helpb coefplot##label:label()} plot option. {it:spec} is: + +{p 12 14 2} + [{cmd:"}{it:label}{cmd:"} [{cmd:"}{it:label}{cmd:"} ...]] [{cmd:,} {cmdab:t:runcate(}#{cmd:)} + {cmdab:w:rap(}#{cmd:)} {cmdab:nob:reak} ] + +{pmore} + Enclose labels in double quotes if they contain spaces. Enclose labels in + compound double quotes to create multiline labels. Alternatively, + apply the {cmd:wrap()} option. For text effects + (bold, italics, greek letters, etc.) use SMCL tags as described in + {it:{help graph_text}}. Options {cmd:truncate()}, {cmd:wrap()}, and {cmd:nobreak} are as + above for {helpb coefplot##coeflabels:coeflabels()}. + +{marker bylabels}{...} +{phang} + {cmd:bylabels(}{it:spec}{cmd:)} specifies labels for the subgraphs. Labels + specified via {cmd:bylabels()} + take precedence over labels specified in the + {helpb coefplot##bylabel:bylabel()} subgraph option. {it:spec} is: + +{p 12 14 2} + [{cmd:"}{it:label}{cmd:"} [{cmd:"}{it:label}{cmd:"} ...]] [{cmd:,} {cmdab:t:runcate(}#{cmd:)} + {cmdab:w:rap(}#{cmd:)} {cmdab:nob:reak} ] + +{pmore} + Enclose labels in double quotes if they contain spaces. Enclose labels in + compound double quotes to create multiline labels. Alternatively, + apply the {cmd:wrap()} option. For text effects + (bold, italics, greek letters, etc.) use SMCL tags as described in + {it:{help graph_text}}. Options {cmd:truncate()}, {cmd:wrap()}, and {cmd:nobreak} are as + above for {helpb coefplot##coeflabels:coeflabels()}. + +{marker grid}{...} +{phang} + {cmd:grid(}{it:options}{cmd:)} affects the rendition of grid lines on the + category axis (not allowed with {helpb coefplot##at:at}). {it:options} are: + +{p 12 14 2} + { {cmdab:b:etween} | {cmdab:w:ithin} | {cmdab:n:one} } {it:{help axis_label_options:suboptions}} + +{pmore} + {cmdab:b:etween} places grid lines between coefficient labels; + {cmdab:w:ithin} places grid lines at the center of coefficient labels; + {cmdab:n:one} suppress grid lines. {it:suboptions} are axis label suboptions + as described in {it:{help axis_label_options}}. In horizontal mode, the + default is {cmd:within} for single plots and {cmd:between} for multiple + plots. In vertical mode, the default is {cmd:none}. Alternatively, use + {helpb axis_label_options:ytick()} and {helpb axis_label_options:xtick()} + to set grid lines. + +{marker generate}{...} +{phang} + {cmd:generate}[{cmd:(}{it:prefix}{cmd:)}] generates variables containing + the graph data. The variable names will be prefixed by "{cmd:__}" + or as specified by {it:prefix}. + +{marker replace}{...} +{phang} + {cmd:replace} allows {cmd:coefplot} to overwrite existing variables. + +{marker addplot}{...} +{phang} + {cmd:addplot(}{it:plot}{cmd:)} adds other plots to the graph. See help + {it:{help addplot_option}}. By default {cmd:addplot()} has access only to + the first {it:r} observations in the dataset, where {it:r} is the number of + observations used by {cmd:coefplot} to store its internal results. If the + graph does not contain multiple subgraphs and + {helpb coefplot##generate:generate()} or {helpb coefplot##nodrop:nodrop} is + specified, {cmd:addplot()} has access to all observations. + +{marker nodrop}{...} +{phang} + {cmd:nodrop} causes {cmd:coefplot} to keep all observations when generating + the graph. The default is to eliminate unused observations temporarily + to increase speed. {cmd:nodrop} may be useful in connection with the + {helpb coefplot##addplot:addplot()} option, if the graph does not contain + multiple subgraphs. {cmd:nodrop} has no effect if + {helpb coefplot##generate:generate()} is specified. + {p_end} + +{phang} + {it:twoway_options} are general twoway options, other than + {cmd:by()}, as documented in help {it:{help twoway_options}}. + +{marker byopts}{...} +{phang} + {cmd:byopts(}{it:byopts}{cmd:)} determines how subgraphs + are combined. {it:byopts} are as described in help {it:{help by_option}}. + + +{marker examples}{...} +{title:Examples} + + . {stata sysuse auto} + . {stata regress price mpg headroom trunk length turn} + . {stata coefplot, drop(_cons) xline(0)} + + . {stata regress price mpg headroom trunk length turn if foreign==0} + . {stata estimates store domestic} + . {stata regress price mpg headroom trunk length turn if foreign==1} + . {stata estimates store foreign} + . {stata coefplot domestic foreign, drop(_cons) xline(0)} + + . {stata coefplot domestic || foreign, drop(_cons) xline(0)} + + . {stata coefplot domestic || foreign, yline(0) bycoefs vertical byopts(yrescale)} + +{pstd} + For further examples see the {browse "http://repec.sowi.unibe.ch/stata/coefplot":website}, + the {browse "http://www.stata-journal.com/article.html?article=gr0059":Stata Journal article}, or the + {browse "http://ideas.repec.org/p/bss/wpaper/1.html":working paper}. + + +{marker remarks}{...} +{title:Remarks} + +{pstd} + Remarks are presented under the following headings: + + {help coefplot##wildcards:Using wildcards in model names} + {help coefplot##place:Placement of options} + {help coefplot##matrix:Plotting results from matrices} + {help coefplot##tempvar:Accessing internal temporary variables} + + +{marker wildcards}{...} +{title:Using wildcards in model names} + +{pstd} + Instead of providing distinct model names to {cmd:coefplot}, you can also + specify a name pattern containing {cmd:*} (any string) + and {cmd:?} (any nonzero character) wildcards. {cmd:coefplot} + will then plot the results from all matching + models. If a name pattern is specified as part of a plot delimited by + parentheses, the results from the matching models will be combined into the + same plot. For example, if models {cmd:est11}, {cmd:est12}, {cmd:est13}, + {cmd:est21}, {cmd:est22}, and {cmd:est23} are in + memory, typing + +{com}{...} + . coefplot (est1*, {txt:{it:opts1}}) (est2*, {txt:{it:opts2}}) +{txt}{...} + +{pstd} + is equivalent to + +{com}{...} + . coefplot (est11 est12 est13, {txt:{it:opts1}}) (est21 est22 est23, {txt:{it:opts2}}) +{txt}{...} + +{pstd} + Likewise, typing + +{com}{...} + . coefplot (est*1, {txt:{it:opts1}} \ est*2, {txt:{it:opts2}} \, {txt:{it:opts3}}) +{txt}{...} + +{pstd} + is equivalent to + +{com}{...} + . coefplot (est11 est21, {txt:{it:opts1}} \ est12 est22, {txt:{it:opts2}} \, {txt:{it:opts3}}) +{txt}{...} + +{pstd} + If a name pattern is specified without parentheses, + the matching models are treated as separate plots. For example, typing + +{com}{...} + . coefplot est1* || est2* +{txt}{...} + +{pstd} + is equivalent to + +{com}{...} + . coefplot est11 est12 est13 || est21 est22 est23 +{txt}{...} + +{pstd} + or + +{com}{...} + . coefplot (est11) (est12) (est13) || (est21) (est22) (est23) +{txt}{...} + +{pstd} + Use global options {helpb coefplot##pnum:p1()}, {helpb coefplot##pnum:p2()}, + etc. to provide specific options to the different plots in this case. For + example, typing + +{com}{...} + . coefplot est1*, p1({txt:{it:opts1}}) p2({txt:{it:opts2}}) p3({txt:{it:opts3}}) +{txt}{...} + +{pstd} + is equivalent to + +{com}{...} + . coefplot (est11, {txt:{it:opts1}}) (est12, {txt:{it:opts2}}) (est13, {txt:{it:opts3}}) +{txt}{...} + + +{marker place}{...} +{title:Placement of options} + +{pstd} + {cmd:coefplot} has four levels of options: + +{phang}(1) {help coefplot##modelopts:{it:modelopts}} are options that apply to a single + model (or matrix). They specify the information to be displayed. + +{phang}(2) {help coefplot##plotopts:{it:plotopts}} are options that apply to a single + plot, possibly containing results from multiple models. They affect + the rendition of markers and confidence intervals and provide a label + for the plot. + +{phang}(3) {help coefplot##subgropts:{it:subgropts}} are options that + apply to a single subgraph, possibly containing multiple plots. + +{phang}(4) {help coefplot##globalopts:{it:globalopts}} are options that apply + to the overall graph. + +{pstd} + The levels are nested in the sense that upper level options include all + lower level options. That is, + {help coefplot##globalopts:{it:globalopts}} includes + {help coefplot##subgropts:{it:subgropts}}, + {help coefplot##plotopts:{it:plotopts}}, and + {help coefplot##modelopts:{it:modelopts}}; + {help coefplot##subgropts:{it:subgropts}} includes + {help coefplot##plotopts:{it:plotopts}}, and + {help coefplot##modelopts:{it:modelopts}}; + {help coefplot##plotopts:{it:plotopts}} includes + {help coefplot##modelopts:{it:modelopts}}. However, upper level options + may not be specified at a lower level. + +{pstd} + If lower level options are specified at an upper level, they serve as + defaults for all included lower levels elements. For example, if you want + to draw 99% and 95% confidence intervals for all included models, + specify {cmd:levels(99 95)} as global option: + +{com}{...} + . coefplot model1 model2 model3, levels(99 95) +{txt}{...} + +{pstd} + Options specified with an individual element override the defaults set + by upper level options. For example, if you want to draw 99% and 95% + confidence intervals for model 1 and model 2 and 90% confidence intervals + for model 3, you could type: + +{com}{...} + . coefplot model1 model2 (model3, level(90)), levels(99 95) +{txt}{...} + +{pstd} + There are some fine distinctions about the placement of options and how they + are interpreted. For example, if you type + +{com}{...} + . coefplot m1, {txt:{it:opts1}} || m2, {txt:{it:opts2}} {txt:{it:opts3}} +{txt}{...} + +{pstd} + then {it:opts2} and {it:opts3} are interpreted as global options. If you + want to apply {it:opts2} only to {cmd:m2} then type + +{com}{...} + . coefplot m1, {txt:{it:opts1}} || m2, {txt:{it:opts2}} ||, {txt:{it:opts3}} +{txt}{...} + +{pstd} + Similarly, if you type + +{com}{...} + . coefplot (m1, {txt:{it:opts1}} \ m2, {txt:{it:opts2}}) +{txt}{...} + +{pstd} + then {it:opts2} will be applied to both models. To apply {it:opts2} only to + {cmd:m2} type + +{com}{...} + . coefplot (m1, {txt:{it:opts1}} \ m2, {txt:{it:opts2}} \) +{txt}{...} + +{pstd} + or, if you also want to include {it:opts3} to be applied to both models, + type + +{com}{...} + . coefplot (m1, {txt:{it:opts1}} \ m2, {txt:{it:opts2}} \, {txt:{it:opts3}}) +{txt}{...} + +{pstd} + or + +{com}{...} + . coefplot (m1, {txt:{it:opts1}} \ m2, {txt:{it:opts2}} \), {txt:{it:opts3}} +{txt}{...} + +{pstd} + In case of multiple subgraphs there is some ambiguity about where to + specify the plot options (unless global option + {helpb coefplot##norecycle:norecycle} is specified). You can provide plot + options within any of the subgraphs as plot options are collected across + subgraphs. However, in case of conflict, the plot options from the rightmost + subgraph usually take precedence over earlier plot options. In addition, + you can also use global options {helpb coefplot##pnum:p1()}, + {helpb coefplot##pnum:p2()}, etc. to provide + options for specific plots. In case of conflict, options specified within a plot take + precedence over options provided via {helpb coefplot##pnum:p1()}, + {helpb coefplot##pnum:p2()}, etc. + +{marker matrix}{...} +{title:Plotting results from matrices} + +{pstd} + Use syntax {helpb coefplot##matrix:{ul:m}atrix({it:mspec})} instead of the + name of a stored model to plot results from a matrix. {it:mspec} may be: + +{p2colset 9 21 23 2}{...} +{p2col:{it:name}}use first row of matrix {it:name} + {p_end} +{p2col:{it:name}{cmd:[}#{cmd:,.]}}use #th row of + matrix {it:name}; may also type {it:name}{cmd:[}#{cmd:,]} or + {it:name}{cmd:[}#{cmd:]} + {p_end} +{p2col:{it:name}{cmd:[.,}#{cmd:]}}use #th column of + matrix {it:name}; may also type {it:name}{cmd:[,}#{cmd:]} + {p_end} +{p2colreset}{...} + +{pstd} + If the {cmd:matrix()} syntax is used, then option {helpb coefplot##b:b()} is discarded + and names given in {helpb coefplot##at:at()}, {helpb coefplot##ci:ci()}, + {helpb coefplot##v:v()}, {helpb coefplot##se:se()}, + {helpb coefplot##df:df()}, and {helpb coefplot##aux:aux()} refer to regular + matrices instead of {cmd:e()}-matrices. The matrix name may be omitted in these + options if results are to be read from the same matrix; only the + relevant row or column numbers have to be provided in this case (whether the + numbers are interpreted as row or column numbers + depends in how {cmd:matrix()} was specified). + +{pstd} + For example, to plot medians and their confidence intervals as computed + by {helpb centile} you could type: + +{com}{...} + sysuse auto, clear + matrix C = J(3,3,.) + matrix rownames C = median ll95 ul95 + matrix colnames C = mpg trunk turn + local i 0 + foreach v of var mpg trunk turn { + local ++ i + centile `v' + matrix C[1,`i'] = r(c_1) \ r(lb_1) \ r(ub_1) + } + matrix list C + coefplot matrix(C), ci((2 3)) +{txt}{...} + +{pstd} + This is equivalent to: + +{com}{...} + coefplot matrix(C[1]), ci((C[2] C[3])) +{txt}{...} + +{pstd} + Note that a single {cmd:coefplot} command can contain both regular syntax + and {cmd:matrix()} syntax. For example, to add means to the graph above + you could type: + +{com}{...} + mean mpg trunk turn + estimates store mean + coefplot (matrix(C), ci((2 3))) (mean) +{txt}{...} + + +{marker tempvar}{...} +{title:Accessing internal temporary variables} + +{pstd} + {cmd:coefplot} maintains a number of internal variables that can be + used within + {helpb coefplot##ifopt:if()}, + {helpb coefplot##weight:weight()}, + {helpb coefplot##transform:transform()}, + {helpb marker_label_options:mlabel()}, + {helpb marker_label_options:mlabvposition()}, and + {helpb addplot_option:addplot()}. These + variables are: + +{p2colset 9 21 23 2}{...} +{p2col:{cmd:@b}}point estimates + {p_end} +{p2col:{cmd:@ll}#}lower limits of confidence interval # (may use {cmd:@ll} for {cmd:@ll1}) + {p_end} +{p2col:{cmd:@ul}#}upper limits of confidence interval # (may use {cmd:@ul} for {cmd:@ul1}) + {p_end} +{p2col:{cmd:@V}}variances + {p_end} +{p2col:{cmd:@se}}standard errors + {p_end} +{p2col:{cmd:@t}}t or z statistics, computed as @b/@se + {p_end} +{p2col:{cmd:@df}}degrees of freedom + {p_end} +{p2col:{cmd:@pval}}p-values, computed as (1-normal(|@t|))*2 or ttail(@df,|@t|)*2, depending + on whether df are available + {p_end} +{p2col:{cmd:@at}}plot positions + {p_end} +{p2col:{cmd:@plot}}plot ID (labeled) + {p_end} +{p2col:{cmd:@by}}subgraph ID (labeled) + {p_end} +{p2col:{cmd:@mlbl}}Marker labels set by {helpb coefplot##mlabels:mlabels()} (string variable) + {p_end} +{p2col:{cmd:@mlpos}}Marker label positions set by {helpb coefplot##mlabels:mlabels()} + {p_end} +{p2col:{cmd:@aux}#}auxiliary variables collected by {helpb coefplot##aux:aux()} (may use {cmd:@aux} for {cmd:@aux1}) + {p_end} +{p2colreset}{...} + +{pstd} + The internal variables can be used like other variables in the + dataset. For example, option {cmd:mlabel(@plot)} would add plot labels as marker + labels or option {cmd:addplot(line @at @b)} would draw a connecting line + through all point estimates in the graph. + + +{marker saved_results}{...} +{title:Saved results} + +{pstd} + {cmd:coefplot} returns the following macros and scalars in {cmd:r()}: + +{synoptset 20 tabbed}{...} +{p2col 5 20 24 2: Scalars}{p_end} +{synopt:{cmd:r(n_ci)}}number of confidence intervals{p_end} +{synopt:{cmd:r(n_plot)}}number of plots{p_end} +{synopt:{cmd:r(n_subgr)}}number of subgraphs{p_end} + +{synoptset 20 tabbed}{...} +{p2col 5 20 24 2: Macros}{p_end} +{synopt:{cmd:r(graph)}}copy of graph command{p_end} +{synopt:{cmd:r(labels)}}coefficient labels{p_end} +{synopt:{cmd:r(eqlabels)}}equation labels{p_end} +{synopt:{cmd:r(groups)}}group labels{p_end} +{synopt:{cmd:r(headings)}}headings{p_end} +{synopt:{cmd:r(legend)}}contents of legend option{p_end} + + +{marker author}{...} +{title:Author} + +{pstd} + Ben Jann, University of Bern, ben.jann@unibe.ch + +{pstd} + Thanks for citing this software in one of the following ways: + +{pmore} + Jann, B. (2014). Plotting regression coefficients and other + estimates. The Stata Journal 14(4): 708-737. + +{pmore} + Jann, B. (2013). Plotting regression coefficients and other estimates + in Stata. University of Bern Social Sciences Working Papers + Nr. 1. Available from + {browse "http://ideas.repec.org/p/bss/wpaper/1.html"}. + +{pmore} + Jann, B. (2013). coefplot: Stata module to plot regression coefficients + and other results. Available from + {browse "http://ideas.repec.org/c/boc/bocode/s457686.html"}. + + diff --git a/data/ado/e/estadd.ado b/data/ado/e/estadd.ado new file mode 100644 index 0000000..7f0151d --- /dev/null +++ b/data/ado/e/estadd.ado @@ -0,0 +1,2465 @@ +*! version 2.3.5 05feb2016 Ben Jann +* 1. estadd and helpers +* 2. estadd_local +* 3. estadd_scalar +* 4. estadd_matrix +* 5. estadd_mean +* 6. estadd_sd +* 7. estadd_beta +* 8. estadd_coxsnell +* 9. estadd_nagelkerke +* 10. estadd_ysumm +* 11. estadd_summ +* 12. estadd_vif +* 13. estadd_ebsd +* 14. estadd_expb +* 15. estadd_pcorr +* 16. estadd_lrtest +* 17. estadd_brent +* 18. estadd_fitstat +* 19. estadd_listcoef +* 20. estadd_mlogtest +* 21. estadd_prchange +* 22. estadd_prvalue +* 23. estadd_asprvalue +* 24. estadd_margins +* 99. copy of erepost.ado + +* 1. +program estadd + version 8.2 + local caller : di _caller() + capt _on_colon_parse `macval(0)' + if !_rc { + local 0 `"`s(before)'"' // cannot apply macval() here + local names `"`s(after)'"' + } + syntax anything(equalok id="subcommand") [if] [in] [fw aw iw pw] [, * ] + if regexm(`"`anything'"',"^r\((.*)\)$") { // check -estadd r(name)- + capt confirm scalar `anything' + if _rc { + capt confirm matrix `anything' + if _rc { + di as err `"`anything' not found"' + exit 111 + } + else { + local anything `"matrix `anything'"' + } + } + else { + local anything `"scalar `anything'"' + } + } + gettoken subcommand : anything + capt confirm name `subcommand' + if _rc { + di as err "invalid subcommand" + exit 198 + } + if `"`options'"'!="" local options `", `options'"' + if `"`weight'`exp'"'!="" local wgtexp `"[`weight'`exp']"' + +//expand estimates names and backup current estimates if necessary + tempname rcurrent ecurrent + capt _return drop `rcurrent' + _return hold `rcurrent' + capt noisily { + local names: list retok names + if "`names'"=="" { + local names "." + local qui + } + else local qui quietly + foreach name of local names { + if "`name'"=="." { + capt est_expand "`name'" + if _rc local enames "`enames'`name' " + else local enames "`enames'`r(names)' " + } + else { + est_expand "`name'" //=> error if estimates not found + local enames "`enames'`r(names)' " + } + } + local names: list uniq enames + if "`names'"=="." local active + else { + capt est_expand . + if _rc local active "." + else local active "`r(names)'" + if "`active'"=="." | `:list posof "`active'" in names'==0 { + local active + _est hold `ecurrent', restore estsystem nullok + } + } + } + if _rc { + _return restore `rcurrent' + exit _rc + } + _return restore `rcurrent', hold + +// cases: +// - if active estimates not stored yet and "`names'"==".": simply execute +// estadd_subcmd to active estimates +// - else if active estimates not stored yet: backup/restore active estimates +// - else if active estimates stored but not in `names': backup/restore active estimates +// - else if active estimates stored: no backup but restore at end + +//loop over estimates names and run subcommand + nobreak { + foreach m of local names { + if "`names'"!="." { + if "`m'"=="." _est unhold `ecurrent' + else { + capt confirm new var _est_`m' // fix e(sample) + if _rc qui replace _est_`m' = 0 if _est_`m' >=. + _est unhold `m' + } + } + backup_estimates_name + capt n break `qui' version `caller': /// + estadd_`macval(anything)' `if' `in' `wgtexp' `options' + local rc = _rc + restore_estimates_name + if "`names'"!="." { + if "`m'"=="." _est hold `ecurrent', restore estsystem nullok + else _est hold `m', estimates varname(_est_`m') + } + if `rc' continue, break + } + if "`active'"!="" estimates restore `active', noh + } + _return restore `rcurrent' + if `rc' { + if `rc' == 199 di as error "invalid subcommand" + exit `rc' + } +end + +program define backup_estimates_name, eclass + ereturn local _estadd_estimates_name `"`e(_estimates_name)'"' + ereturn local _estimates_name "" +end +program define restore_estimates_name, eclass + local hold `"`e(_estadd_estimates_name)'"' + ereturn local _estadd_estimates_name "" + ereturn local _estimates_name `"`hold'"' +end + +program confirm_new_ename + capture confirm existence `e(`0')' + if !_rc { + di as err "e(`0') already defined" + exit 110 + } +end + +program confirm_esample + local efun: e(functions) + if `:list posof "sample" in efun'==0 { + di as err "e(sample) information not available" + exit 498 + } +end + +program confirm_numvar + args var + local ts = index("`var'",".") + confirm numeric variable `=substr("`var'",`ts'+1,.)' +end + +program define added_macro + args name + di as txt %25s `"e(`name') : "' `""{res:`e(`name')'}""' // cannot apply macval() here +end + +program define added_scalar + args name label + di as txt %25s `"e(`name') = "' " " as res e(`name') _c + if `"`label'"'!="" { + di as txt _col(38) `"(`label')"' + } + else di "" +end + +program define added_matrix + args name label + capture { + local r = rowsof(e(`name')) + local c = colsof(e(`name')) + } + if _rc { + tempname tmp + mat `tmp' = e(`name') + local r = rowsof(`tmp') + local c = colsof(`tmp') + } + di as txt %25s `"e(`name') : "' " " /// + as res "`r' x `c'" _c + if `"`label'"'=="_rown" { + local thelabel: rownames e(`name') + local thelabel: list retok thelabel + if `r'>1 { + local thelabel: subinstr local thelabel " " ", ", all + } + di as txt _col(38) `"(`thelabel')"' + } + else if `"`label'"'!="" { + di as txt _col(38) `"(`label')"' + } + else di "" +end + +* 2. +* -estadd- subroutine: add local +program estadd_loc + estadd_local `macval(0)' +end +program estadd_loca + estadd_local `macval(0)' +end +program estadd_local, eclass + version 8.2 + syntax anything(equalok) [, Prefix(name) Replace Quietly ] + gettoken name def : anything , parse(" =:") + if "`replace'"=="" { + confirm_new_ename `prefix'`name' + } + ereturn local `prefix'`name'`macval(def)' + di _n as txt "added macro:" + added_macro `prefix'`name' +end + +* 3. +* -estadd- subroutine: add scalar +program estadd_sca + estadd_scalar `0' +end +program estadd_scal + estadd_scalar `0' +end +program estadd_scala + estadd_scalar `0' +end +program estadd_scalar, eclass + version 8.2 + syntax anything(equalok) [, Prefix(name) Replace Quietly ] + if regexm("`anything'","^r\((.*)\)$") { // estadd scalar r(name) + local name = regexs(1) + capt confirm name `name' + confirm scalar `anything' + if _rc error 198 + local equ "`anything'" + } + else { + local isname 0 + gettoken name equ0: anything, parse(" =") + capt confirm name `name' + if _rc error 198 + else if `"`equ0'"'=="" { // estadd scalar name + local isname 1 + local equ "scalar(`name')" + } + else { // estadd scalar name [=] exp + gettoken trash equ : equ0, parse(" =") + if `"`trash'"'!="=" { + local equ `"`equ0'"' + } + } + } + if "`replace'"=="" { + confirm_new_ename `prefix'`name' + } + ereturn scalar `prefix'`name' = `equ' + di _n as txt "added scalar:" + added_scalar `prefix'`name' +end + +* 4. +* -estadd- subroutine: add matrix +program estadd_mat + estadd_matrix `0' +end +program estadd_matr + estadd_matrix `0' +end +program estadd_matri + estadd_matrix `0' +end +program estadd_matrix, eclass + version 8.2 + syntax anything(equalok) [, Prefix(name) Replace Quietly ] + if regexm("`anything'","^r\((.*)\)$") { // estadd matrix r(name) + local name = regexs(1) + capt confirm name `name' + if _rc error 198 + confirm matrix `anything' + local equ "`anything'" + } + else { + local isname 0 + gettoken name equ0: anything, parse(" =") + capt confirm name `name' + if _rc error 198 + else if `"`equ0'"'=="" { // estadd matrix name + local isname 1 + local equ "`name'" + } + else { // estadd matrix name [=] exp + gettoken trash equ : equ0, parse(" =") + if `"`trash'"'!="=" { + local equ `"`equ0'"' + } + } + } + if "`replace'"=="" { + confirm_new_ename `prefix'`name' + } + tempname M + mat `M' = `equ' + ereturn matrix `prefix'`name' = `M' + di _n as txt "added matrix:" + added_matrix `prefix'`name' +end + +* 5. +* -estadd- subroutine: means of regressors +program define estadd_mean, eclass + version 8.2 + syntax [, Prefix(name) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//check e()-names + if "`replace'"=="" confirm_new_ename `prefix'mean +//use aweights with -summarize- + local wtype `e(wtype)' + if "`wtype'"=="pweight" local wtype aweight +//subpop? + local subpop "`e(subpop)'" + if "`subpop'"=="" local subpop 1 +//copy coefficients matrix and determine varnames + tempname results + mat `results' = e(b) + local vars: colnames `results' +//loop over variables: calculate -mean- + local j 0 + foreach var of local vars { + local ++j + capture confirm_numvar `var' + if _rc mat `results'[1,`j'] = .z + else { + capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop', meanonly + mat `results'[1,`j'] = cond(_rc,.,r(mean)) + } + } +//return the results + ereturn matrix `prefix'mean = `results' + di _n as txt "added matrix:" + added_matrix `prefix'mean +end + +* 6. +* -estadd- subroutine: standard deviations of regressors +program define estadd_sd, eclass + version 8.2 + syntax [, noBinary Prefix(name) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//check e()-names + if "`replace'"=="" confirm_new_ename `prefix'sd +//use aweights with -summarize- + local wtype `e(wtype)' + if "`wtype'"=="pweight" local wtype aweight +//subpop? + local subpop "`e(subpop)'" + if "`subpop'"=="" local subpop 1 +//copy coefficients matrix and determine varnames + tempname results + mat `results' = e(b) + local vars: colnames `results' +//loop over variables: calculate -mean- + local j 0 + foreach var of local vars { + local ++j + capture confirm_numvar `var' + if _rc mat `results'[1,`j'] = .z + else { + capture assert `var'==0 | `var'==1 if e(sample) & `subpop' + if _rc | "`binary'"=="" { + capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop' + mat `results'[1,`j'] = cond(_rc,.,r(sd)) + } + else mat `results'[1,`j'] = .z + } + } +//return the results + ereturn matrix `prefix'sd = `results' + di _n as txt "added matrix:" + added_matrix `prefix'sd +end + +* 7. +* -estadd- subroutine: standardized coefficients +program define estadd_beta, eclass + version 8.2 + syntax [, Prefix(name) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//check e()-names + if "`replace'"=="" confirm_new_ename `prefix'beta +//use aweights with -summarize- + local wtype `e(wtype)' + if "`wtype'"=="pweight" local wtype aweight +//subpop? + local subpop "`e(subpop)'" + if "`subpop'"=="" local subpop 1 +//copy coefficients matrix and determine varnames + tempname results sddep + mat `results' = e(b) + local vars: colnames `results' + local eqs: coleq `results', q + local depv "`e(depvar)'" +//loop over variables: calculate -beta- + local j 0 + local lastdepvar + foreach var of local vars { + local depvar: word `++j' of `eqs' + if "`depvar'"=="_" local depvar "`depv'" + capture confirm_numvar `depvar' + if _rc mat `results'[1,`j'] = .z + else { + if "`depvar'"!="`lastdepvar'" { + capt su `depvar' [`wtype'`e(wexp)'] if e(sample) & `subpop' + scalar `sddep' = cond(_rc,.,r(sd)) + } + capture confirm_numvar `var' + if _rc mat `results'[1,`j'] = .z + else { + capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop' + mat `results'[1,`j'] = cond(_rc,.,`results'[1,`j'] * r(sd) / `sddep') + } + } + local lastdepvar "`depvar'" + } +//return the results + ereturn matrix `prefix'beta = `results' + di _n as txt "added matrix:" + added_matrix `prefix'beta +end + +* 8. +* -estadd- subroutine: Cox & Snell Pseudo R-Squared +program define estadd_coxsnell, eclass + version 8.2 + syntax [, Prefix(name) Replace Quietly ] +//check e()-names + if "`replace'"=="" confirm_new_ename `prefix'coxsnell +//compute statistic + tempname results + scalar `results' = 1 - exp((e(ll_0)-e(ll))*2/e(N)) // = 1 - exp(e(ll_0)-e(ll))^(2/e(N)) +//return the results + *di as txt "Cox & Snell Pseudo R2 = " as res `results' + ereturn scalar `prefix'coxsnell = `results' + di _n as txt "added scalar:" + added_scalar `prefix'coxsnell +end + +* 9. +* -estadd- subroutine: Nagelkerke Pseudo R-Squared +program define estadd_nagelkerke, eclass + version 8.2 + syntax [, Prefix(name) Replace Quietly ] +//check e()-names + if "`replace'"=="" confirm_new_ename `prefix'nagelkerke +//compute statistic + tempname results + scalar `results' = (1 - exp((e(ll_0)-e(ll))*2/e(N))) / (1 - exp(e(ll_0)*2/e(N))) + // = (1 - exp(e(ll_0)-e(ll))^(2/e(N))) / (1 - exp(e(ll_0))^(2/e(N))) +//return the results + *di as txt "Nagelkerke Pseudo R2 = " as res `results' + ereturn scalar `prefix'nagelkerke = `results' + di _n as txt "added scalar:" + added_scalar `prefix'nagelkerke +end + +* 10. +* -estadd- subroutine: summary statistics for dependent variable +program define estadd_ysumm, eclass + version 8.2 + syntax [, MEan SUm MIn MAx RAnge sd Var cv SEMean SKewness /// + Kurtosis MEDian p1 p5 p10 p25 p50 p75 p90 p95 p99 iqr q all /// + Prefix(passthru) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//default prefix + if `"`prefix'"'=="" local prefix y + else { + local 0 ", `prefix'" + syntax [, prefix(name) ] + } +//use aweights with -summarize- + local wtype `e(wtype)' + if "`wtype'"=="pweight" local wtype aweight +//subpop? + local subpop "`e(subpop)'" + if "`subpop'"=="" local subpop 1 +//determine list of stats + tempname results + local Stats p99 p95 p90 p75 p50 p25 p10 p5 p1 kurtosis /// + skewness var sd max min sum mean + if "`all'"!="" { + local stats `Stats' + local range range + local cv cv + local semean semean + local iqr iqr + local sumtype detail + } + else { + if "`q'"!="" { + local p25 p25 + local p50 p50 + local p75 p75 + } + if "`median'"!="" local p50 p50 + foreach stat of local Stats { + if "``stat''"!="" { + local stats: list stats | stat + } + } + if "`stats'"=="" & "`range'"=="" & "`cv'"=="" & /// + "`semean'"=="" & "`iqr'"=="" local stats sd max min mean + local sumtype sum mean min max + if "`:list stats - sumtype'"=="" & "`cv'"=="" & /// + "`semean'"=="" & "`iqr'"=="" local sumtype meanonly + else { + local sumtype `sumtype' Var sd + if "`:list stats - sumtype'"=="" & "`iqr'"=="" local sumtype + else local sumtype detail + } + } + local Stats: subinstr local stats "var" "Var" + local nstats: word count `iqr' `semean' `cv' `range' `stats' + if "`replace'"=="" { + foreach stat in `iqr' `semean' `cv' `range' `stats' { + confirm_new_ename `prefix'`=lower("`stat'")' + } + } +//calculate stats + local var: word 1 of `e(depvar)' + mat `results' = J(`nstats',1,.z) + qui su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop', `sumtype' + local i 0 + if "`iqr'"!="" { + mat `results'[`++i',1] = r(p75) - r(p25) + } + if "`semean'"!="" { + mat `results'[`++i',1] = r(sd) / sqrt(r(N)) + } + if "`cv'"!="" { + mat `results'[`++i',1] = r(sd) / r(mean) + } + if "`range'"!="" { + mat `results'[`++i',1] = r(max) - r(min) + } + foreach stat of local Stats { + mat `results'[`++i',1] = r(`stat') + } +//return the results + local i 0 + di as txt _n "added scalars:" + foreach stat in `iqr' `semean' `cv' `range' `stats' { + local sname = lower("`stat'") + ereturn scalar `prefix'`sname' = `results'[`++i',1] + added_scalar `prefix'`sname' + } +end + +* 11. +* -estadd- subroutine: various summary statistics +program define estadd_summ, eclass + version 8.2 + syntax [, MEan SUm MIn MAx RAnge sd Var cv SEMean SKewness /// + Kurtosis MEDian p1 p5 p10 p25 p50 p75 p90 p95 p99 iqr q all /// + Prefix(name) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//use aweights with -summarize- + local wtype `e(wtype)' + if "`wtype'"=="pweight" local wtype aweight +//subpop? + local subpop "`e(subpop)'" + if "`subpop'"=="" local subpop 1 +//determine list of stats + tempname results results2 + local Stats p99 p95 p90 p75 p50 p25 p10 p5 p1 kurtosis /// + skewness var sd max min sum mean + if "`all'"!="" { + local stats `Stats' + local range range + local cv cv + local semean semean + local iqr iqr + local sumtype detail + } + else { + if "`q'"!="" { + local p25 p25 + local p50 p50 + local p75 p75 + } + if "`median'"!="" local p50 p50 + foreach stat of local Stats { + if "``stat''"!="" { + local stats: list stats | stat + } + } + if "`stats'"=="" & "`range'"=="" & "`cv'"=="" & /// + "`semean'"=="" & "`iqr'"=="" local stats sd max min mean + local sumtype sum mean min max + if "`:list stats - sumtype'"=="" & "`cv'"=="" & /// + "`semean'"=="" & "`iqr'"=="" local sumtype meanonly + else { + local sumtype `sumtype' Var sd + if "`:list stats - sumtype'"=="" & "`iqr'"=="" local sumtype + else local sumtype detail + } + } + local Stats: subinstr local stats "var" "Var" + local nstats: word count `iqr' `semean' `cv' `range' `stats' + if "`replace'"=="" { + foreach stat in `iqr' `semean' `cv' `range' `stats' { + confirm_new_ename `prefix'`=lower("`stat'")' + } + } +//copy coefficients matrix and determine varnames + mat `results' = e(b) + local vars: colnames `results' + if `nstats'>1 { + mat `results' = `results' \ J(`nstats'-1,colsof(`results'),.z) + } +//loop over variables: calculate stats + local j 0 + foreach var of local vars { + local ++j + capture confirm_numvar `var' + if _rc mat `results'[1,`j'] = .z + else { + capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop', `sumtype' + local i 0 + if "`iqr'"!="" { + mat `results'[`++i',`j'] = cond(_rc,.,r(p75) - r(p25)) + } + if "`semean'"!="" { + mat `results'[`++i',`j'] = cond(_rc,.,r(sd) / sqrt(r(N))) + } + if "`cv'"!="" { + mat `results'[`++i',`j'] = cond(_rc,.,r(sd) / r(mean)) + } + if "`range'"!="" { + mat `results'[`++i',`j'] = cond(_rc,.,r(max) - r(min)) + } + foreach stat of local Stats { + mat `results'[`++i',`j'] = cond(_rc,.,r(`stat')) + } + } + } +//return the results + local i 0 + di as txt _n "added matrices:" + foreach stat in `iqr' `semean' `cv' `range' `stats' { + local sname = lower("`stat'") + mat `results2' = `results'[`++i',1...] + ereturn matrix `prefix'`sname' = `results2' + added_matrix `prefix'`sname' + } +end + +* 12. +* -estadd- subroutine: variance inflation factors +program define estadd_vif, eclass + version 8.2 + local caller : di _caller() + syntax [, TOLerance SQRvif Prefix(name) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//check e()-names + if "`replace'"=="" { + confirm_new_ename `prefix'vif + if "`tolerance'"!="" confirm_new_ename `prefix'tolerance + if "`sqrvif'"!="" confirm_new_ename `prefix'sqrvif + } +//copy coefficients matrix and set to .z + tempname results results2 results3 + matrix `results' = e(b) + forv j = 1/`=colsof(`results')' { + mat `results'[1,`j'] = .z + } + if "`tolerance'"!="" mat `results2' = `results' + if "`sqrvif'"!="" mat `results3' = `results' +//compute VIF and add to results vector + capt n `quietly' version `caller': vif + if _rc { + if _rc == 301 di as err "-estadd:vif- can only be used after -regress-" + exit _rc + } + local i 0 + local name "`r(name_`++i')'" + while "`name'"!="" { + local j = colnumb(`results',"`name'") + if `j'<. { + matrix `results'[1,`j'] = r(vif_`i') + if "`tolerance'"!="" matrix `results2'[1,`j'] = 1 / r(vif_`i') + if "`sqrvif'"!="" matrix `results3'[1,`j'] = sqrt( r(vif_`i') ) + } + local name "`r(name_`++i')'" + } +//return the results + if "`sqrvif'"!="" | "`tolerance'"!="" di as txt _n "added matrices:" + else di as txt _n "added matrix:" + if "`sqrvif'"!="" { + ereturn matrix `prefix'sqrvif = `results3' + added_matrix `prefix'sqrvif + } + if "`tolerance'"!="" { + ereturn matrix `prefix'tolerance = `results2' + added_matrix `prefix'tolerance + } + ereturn matrix `prefix'vif = `results' + added_matrix `prefix'vif +end + +* 13. +* -estadd- subroutine: standardized factor change coefficients +program define estadd_ebsd, eclass + version 8.2 + syntax [, Prefix(name) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//check e()-names + if "`replace'"=="" confirm_new_ename `prefix'ebsd +//use aweights with -summarize- + local wtype `e(wtype)' + if "`wtype'"=="pweight" local wtype aweight +//subpop? + local subpop "`e(subpop)'" + if "`subpop'"=="" local subpop 1 +//copy coefficients matrix and determine varnames + tempname results + mat `results' = e(b) + local vars: colnames `results' +//loop over variables: calculate -mean- + local j 0 + foreach var of local vars { + local ++j + capture confirm_numvar `var' + if _rc mat `results'[1,`j'] = .z + else { + capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop' + mat `results'[1,`j'] = cond(_rc,.,exp( `results'[1,`j'] * r(sd))) + } + } +//return the results + ereturn matrix `prefix'ebsd = `results' + di _n as txt "added matrix:" + added_matrix `prefix'ebsd +end + +* 14. +* -estadd- subroutine: exponentiated coefficients +program define estadd_expb, eclass + version 8.2 + syntax [, noCONStant Prefix(name) Replace Quietly ] +//check e()-names + if "`replace'"=="" confirm_new_ename `prefix'expb +//copy coefficients matrix and determine names of coefficients + tempname results + mat `results' = e(b) + local coefs: colnames `results' +//loop over coefficients + local j 0 + foreach coef of local coefs { + local ++j + if `"`constant'"'!="" & `"`coef'"'=="_cons" { + mat `results'[1,`j'] = .z + } + else { + mat `results'[1,`j'] = exp(`results'[1,`j']) + } + } +//return the results + ereturn matrix `prefix'expb = `results' + di _n as txt "added matrix:" + added_matrix `prefix'expb +end + +* 15. +* -estadd- subroutine: partial and semi-partial correlations +program define estadd_pcorr, eclass + version 8.2 + syntax [, semi Prefix(name) Replace Quietly ] +//check availability of e(sample) + confirm_esample +//check e()-names + if "`replace'"=="" { + if "`semi'"!="" confirm_new_ename `prefix'spcorr + confirm_new_ename `prefix'pcorr + } +//copy coefficients matrix and set to .z + tempname results results2 + matrix `results' = e(b) + forv j = 1/`=colsof(`results')' { + mat `results'[1,`j'] = .z + } + local eqs: coleq `results', quoted + local eq: word 1 of `eqs' + mat `results2' = `results'[1,"`eq':"] + local vars: colnames `results2' + foreach var of local vars { + capt confirm numeric var `var' + if !_rc local temp "`temp'`var' " + } + local vars "`temp'" + if "`semi'"!="" mat `results2' = `results' + else { + mat drop `results2' + local results2 + } + local depv: word 1 of `e(depvar)' +//compute statistics and add to results vector + local wtype `e(wtype)' + if inlist("`wtype'","pweight","iweight") local wtype aweight + _estadd_pcorr_compute `depv' `vars' [`wtype'`e(wexp)'] if e(sample), /// + eq(`eq') results(`results') results2(`results2') +//return the results + if "`semi'"!="" { + di as txt _n "added matrices:" + ereturn matrix `prefix'spcorr = `results2' + added_matrix `prefix'spcorr + } + else di as txt _n "added matrix:" + ereturn matrix `prefix'pcorr = `results' + added_matrix `prefix'pcorr +end +program define _estadd_pcorr_compute // based on pcorr.ado by StataCorp + // and pcorr2.ado by Richard Williams + syntax varlist(min=1) [aw fw] [if], eq(str) results(str) [ results2(str) ] + marksample touse + tempname hcurrent + _est hold `hcurrent', restore + quietly reg `varlist' [`weight'`exp'] if `touse' + if (e(N)==0 | e(N)>=.) error 2000 + local NmK = e(df_r) + local R2 = e(r2) + gettoken depv varlist: varlist + foreach var of local varlist { + quietly test `var' + if r(F)<. { + local s "1" + if _b[`var']<0 local s "-1" + local c = colnumb(`results',"`eq':`var'") + mat `results'[1,`c'] = `s' * sqrt(r(F)/(r(F)+`NmK')) + if "`results2'"!="" { + mat `results2'[1,`c'] = `s' * sqrt(r(F)*((1-`R2')/`NmK')) + } + } + } +end + +* 16. +* -estadd- subroutine: Likelihood-ratio test +program define estadd_lrtest, eclass + version 8.2 + local caller : di _caller() + syntax anything(id="model") [, Name(name) Prefix(name) Replace Quietly * ] + if "`name'"=="" local name lrtest_ +//check e()-names + if "`replace'"=="" { + confirm_new_ename `prefix'`name'p + confirm_new_ename `prefix'`name'chi2 + confirm_new_ename `prefix'`name'df + } +//compute statistics + `quietly' version `caller': lrtest `anything', `options' +//return the results + ereturn scalar `prefix'`name'p = r(p) + ereturn scalar `prefix'`name'chi2 = r(chi2) + ereturn scalar `prefix'`name'df = r(df) + di _n as txt "added scalars:" + added_scalar `prefix'`name'p + added_scalar `prefix'`name'chi2 + added_scalar `prefix'`name'df +end + +* 17. +* -estadd- subroutine: support for -brant- by Long and Freese +* (see http://www.indiana.edu/~jslsoc/spost.htm) +program define estadd_brant, eclass + version 8.2 + local caller : di _caller() + syntax [ , Prefix(name) Replace Quietly * ] + capt findfile brant.ado + if _rc { + di as error "fitstat.ado from the -spost9_ado- package by Long and Freese required" + di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"' + error 499 + } +// check names + if "`replace'"=="" { + foreach name in brant_chi2 brant_df brant_p brant { + confirm_new_ename `prefix'`name' + } + } +// compute and return the results + `quietly' version `caller': brant, `options' + di as txt _n "added scalars:" + foreach stat in chi2 df p { + ereturn scalar `prefix'brant_`stat' = r(`stat') + added_scalar `prefix'brant_`stat' + } + tempname mat + matrix `mat' = r(ivtests) + matrix `mat' = `mat'' + ereturn matrix `prefix'brant = `mat' + di as txt _n "added matrix:" + added_matrix `prefix'brant _rown +end + +* 18. +* -estadd- subroutine: support for -fitstat- by Long and Freese +* (see http://www.indiana.edu/~jslsoc/spost.htm) +program define estadd_fitstat, eclass + version 8.2 + local caller : di _caller() + syntax [ , Prefix(name) Replace Quietly Bic * ] + capt findfile fitstat.ado + if _rc { + di as error "fitstat.ado from the -spost9_ado- package by Long and Freese required" + di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"' + error 499 + } + `quietly' version `caller': fitstat, `bic' `options' + local stats: r(scalars) + local allstats /// + dev dev_df lrx2 lrx2_df lrx2_p r2_adj r2_mf r2_mfadj r2_ml /// + r2_cu r2_mz r2_ef v_ystar v_error r2_ct r2_ctadj aic aic_n /// + bic bic_p statabic stataaic n_rhs n_parm + local stats: list allstats & stats + if "`bic'"!="" { + local bic aic aic_n bic bic_p statabic stataaic + local stats: list bic & stats + } + + +// check names + if "`replace'"=="" { + foreach stat of local stats { + if inlist("`stat'", "bic", "aic") local rname `stat'0 + else local rname `stat' + confirm_new_ename `prefix'`rname' + } + } + +// return the results + di as txt _n "added scalars:" + foreach stat of local stats { + if inlist("`stat'", "bic", "aic") local rname `stat'0 + else local rname `stat' + ereturn scalar `prefix'`rname' = r(`stat') + added_scalar `prefix'`rname' + } +end + +* 19. +* -estadd- subroutine: support for -listcoef- by Long and Freese +* (see http://www.indiana.edu/~jslsoc/spost.htm) +program define estadd_listcoef, eclass + version 8.2 + local caller : di _caller() + syntax [anything] [ , Prefix(name) Replace Quietly /// + nosd gt lt ADJacent Matrix EXpand * ] + +// handle some options and look for e(sample) + if `"`matrix'"'!="" { + local matrix matrix + } + if `"`e(cmd)'"'=="slogit" & "`expand'"!="" { + di as err "-expand- option not supported" + exit 198 + } + confirm_esample + +// set some constants + local listcoef_matrices "xs ys std fact facts pct pcts" + if "`sd'"=="" local listcoef_matrices "`listcoef_matrices' sdx" + +// run listcoef + capt findfile listcoef.ado + if _rc { + di as error "-listcoef- from the -spost9_ado- package by Long and Freese required" + di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"' + error 499 + } + `quietly' version `caller': listcoef `anything' , matrix `gt' `lt' `adjacent' `options' + +// check existing e()'s + if "`replace'"=="" { + confirm_new_ename `prefix'pvalue + foreach matrix of local listcoef_matrices { + _estadd_listcoef_ChkEName b_`matrix', prefix(`prefix') + } + } + +// grab r()-results and post in e() + di as txt _n "added matrices:" + if inlist(`"`e(cmd)'"',"mlogit","mprobit") { + _estadd_listcoef_AddResToNomModl `listcoef_matrices', prefix(`prefix') `gt' `lt' `adjacent' + } + else { + foreach matrix of local listcoef_matrices { + _estadd_listcoef_AddMatToE `matrix', prefix(`prefix') + } + } +end +program define _estadd_listcoef_ChkEName + syntax name [, prefix(str) ] + capt confirm matrix r(`namelist') + if _rc exit + confirm_new_ename `prefix'`namelist' +end +program define _estadd_listcoef_AddMatToE, eclass + syntax name [, prefix(str) ] + capt confirm matrix r(b_`namelist') + if _rc exit + tempname tmp + matrix `tmp' = r(b_`namelist') + capt confirm matrix r(b2_`namelist') + if _rc==0 { + local eqnames: coleq e(b), quoted + local eqnames: list uniq eqnames + local eqname: word 1 of `eqnames' + mat coleq `tmp' = `"`eqname'"' + tempname tmp2 + matrix `tmp2' = r(b2_`namelist') + local eqname: word 2 of `eqnames' + mat coleq `tmp2' = `"`eqname'"' + mat `tmp' = `tmp' , `tmp2' + mat drop `tmp2' + } + ereturn matrix `prefix'b_`namelist' = `tmp' + added_matrix `prefix'b_`namelist' _rown +end +program define _estadd_listcoef_AddResToNomModl, eclass + syntax anything(name=listcoef_matrices) [, prefix(str) gt lt ADJacent ] + if "`lt'"=="" & "`gt'"=="" { + local lt lt + local gt gt + } + local adjacent = "`adjacent'"!="" + local lt = "`lt'"!="" + local gt = "`gt'"!="" + +// outcomes and labels + tempname outcomes + if `"`e(cmd)'"'=="mlogit" { + if c(stata_version) < 9 local type cat + else local type out + mat `outcomes' = e(`type') + local noutcomes = colsof(`outcomes') + local eqnames `"`e(eqnames)'"' + if (`:list sizeof eqnames'<`noutcomes') { + local ibase = e(ibase`type') + } + else local ibase 0 + forv i = 1/`noutcomes' { + if `i'==`ibase' { + local outcomelab`i' `"`e(baselab)'"' + } + else { + gettoken eq eqnames : eqnames + local outcomelab`i' `"`eq'"' + } + if `"`outcomelab`i''"'=="" { + local outcomelab`i': di `outcomes'[1,`i'] + } + } + } + else if `"`e(cmd)'"'=="mprobit" { + mat `outcomes' = e(outcomes)' + local noutcomes = colsof(`outcomes') + forv i = 1/`noutcomes' { + local outcomelab`i' `"`e(out`i')'"' + } + } + else { + di as err `"`e(cmd)' not supported"' + exit 499 + } + +// collect vectors + tempname stats + mat `stats' = r(b) \ r(b_z) \ r(b_z) \ r(b_p) + forv i = 1/`=colsof(`stats')' { + mat `stats'[2,`i'] = `stats'[1,`i'] / `stats'[3,`i'] + } + mat rown `stats' = "b" "se" "z" "P>|z|" + local enames "b_raw b_se b_z b_p" + foreach matrix of local listcoef_matrices { + capt confirm matrix r(b_`matrix') + if _rc continue + mat `stats' = `stats' \ r(b_`matrix') + local enames `"`enames' b_`matrix'"' + } + +// select/reorder contrasts of interest + local contrast "r(contrast)" + local ncontrast = colsof(`contrast') + tempname stats0 temp + matrix rename `stats' `stats0' + forv i = 1/`noutcomes' { + local out1 = `outcomes'[1, `i'] + local j 0 + forv j = 1/`noutcomes' { + local out2 = `outcomes'[1, `j'] + if `out1'==`out2' continue + if `adjacent' & abs(`i'-`j')>1 continue + if `lt'==0 & `out1'<`out2' continue + if `gt'==0 & `out1'>`out2' continue + forv l = 1/`ncontrast' { + if el(`contrast',1,`l')!=`out1' continue + if el(`contrast',2,`l')!=`out2' continue + mat `temp' = `stats0'[1..., `l'] + mat coleq `temp' = `"`outcomelab`i''-`outcomelab`j''"' + mat `stats' = nullmat(`stats'), `temp' + } + } + } + capt mat drop `stats0' + +// post rows to e() + local i 0 + foreach ename of local enames { + local ++i + mat `temp' = `stats'[`i', 1...] + ereturn matrix `prefix'`ename' = `temp' + added_matrix `prefix'`ename' _rown + } +end + +* 20. +* -estadd- subroutine: support for -mlogtest- by Long and Freese +* (see http://www.indiana.edu/~jslsoc/spost.htm) +program define estadd_mlogtest, eclass + version 8.2 + local caller : di _caller() + syntax [anything] [ , Prefix(name) Replace Quietly set(passthru) * ] + `quietly' version `caller': mlogtest `anything' , `set' `options' + local rmat: r(matrices) + + // check names + if `"`replace'"'=="" { + foreach m in combine lrcomb { + if `:list m in rmat'==0 continue + forv r = 1/`=rowsof(r(`m'))' { + local cat1 = el(r(`m'),`r',1) + local cat2 = el(r(`m'),`r',2) + confirm_new_ename `prefix'`m'_`cat1'_`cat2'_chi2 + confirm_new_ename `prefix'`m'_`cat1'_`cat2'_df + confirm_new_ename `prefix'`m'_`cat1'_`cat2'_p + } + } + foreach m in hausman suest smhsiao { + if `:list m in rmat'==0 continue + forv r = 1/`=rowsof(r(`m'))' { + local cat = el(r(`m'),`r',1) + confirm_new_ename `prefix'`m'_`cat'_chi2 + confirm_new_ename `prefix'`m'_`cat'_df + confirm_new_ename `prefix'`m'_`cat'_p + } + } + if `"`set'"'!="" { + foreach m in wald lrtest { + if `:list m in rmat'==0 continue + local i 0 + local r = rownumb(r(`m'),"set_`++i'") + while(`r'<.) { + confirm_new_ename `prefix'`m'_set`i'_chi2 + confirm_new_ename `prefix'`m'_set`i'_df + confirm_new_ename `prefix'`m'_set`i'_p + local r = rownumb(r(`m'),"set_`++i'") + } + } + } + foreach m in wald lrtest { + if `:list m in rmat'==0 continue + local r . + if `"`set'"'!="" local r = rownumb(r(`m'),"set_1")-1 + if `r'<1 continue + confirm_new_ename `prefix'`m' + } + } + + local di_added_scalars `"di _n as txt "added scalars:"' + // combine + foreach m in combine lrcomb { + if `:list m in rmat'==0 continue + `di_added_scalars' + local di_added_scalars + forv r = 1/`=rowsof(r(`m'))' { + local cat1 = el(r(`m'),`r',1) + local cat2 = el(r(`m'),`r',2) + eret scalar `prefix'`m'_`cat1'_`cat2'_chi2 = el(r(`m'),`r',3) + added_scalar `prefix'`m'_`cat1'_`cat2'_chi2 + eret scalar `prefix'`m'_`cat1'_`cat2'_df = el(r(`m'),`r',4) + added_scalar `prefix'`m'_`cat1'_`cat2'_df + eret scalar `prefix'`m'_`cat1'_`cat2'_p = el(r(`m'),`r',5) + added_scalar `prefix'`m'_`cat1'_`cat2'_p + } + } + // iia + foreach m in hausman suest smhsiao { + if `:list m in rmat'==0 continue + `di_added_scalars' + local di_added_scalars + if "`m'"=="smhsiao" local skip 2 + else local skip 0 + forv r = 1/`=rowsof(r(`m'))' { + local cat = el(r(`m'),`r',1) + eret scalar `prefix'`m'_`cat'_chi2 = el(r(`m'),`r',2+`skip') + added_scalar `prefix'`m'_`cat'_chi2 + eret scalar `prefix'`m'_`cat'_df = el(r(`m'),`r',3+`skip') + added_scalar `prefix'`m'_`cat'_df + eret scalar `prefix'`m'_`cat'_p = el(r(`m'),`r',4+`skip') + added_scalar `prefix'`m'_`cat'_p + } + } + + // wald/lrtest + tempname tmp + if `"`set'"'!="" { + foreach m in wald lrtest { + if `:list m in rmat'==0 continue + local i 0 + local r = rownumb(r(`m'),"set_`++i'") + if `r'>=. continue + `di_added_scalars' + local di_added_scalars + while(`r'<.) { + eret scalar `prefix'`m'_set`i'_chi2 = el(r(`m'),`r',1) + added_scalar `prefix'`m'_set`i'_chi2 + eret scalar `prefix'`m'_set`i'_df = el(r(`m'),`r',2) + added_scalar `prefix'`m'_set`i'_df + eret scalar `prefix'`m'_set`i'_p = el(r(`m'),`r',3) + added_scalar `prefix'`m'_set`i'_p + local r = rownumb(r(`m'),"set_`++i'") + } + } + } + local di_added_matrices `"di _n as txt "added matrices:"' + foreach m in wald lrtest { + if `:list m in rmat'==0 continue + local r . + if `"`set'"'!="" local r = rownumb(r(`m'),"set_1")-1 + if `r'<1 continue + `di_added_matrices' + local di_added_matrices + mat `tmp' = r(`m') + mat `tmp' = `tmp'[1..`r',1...]' + eret mat `prefix'`m' = `tmp' + added_matrix `prefix'`m' _rown + } + +end + + +* 21. +* -estadd- subroutine: support for -prchange- by Long and Freese +* (see http://www.indiana.edu/~jslsoc/spost.htm) +program define estadd_prchange + version 8.2 + local caller : di _caller() + syntax [anything] [if] [in] [ , Prefix(name) Replace Quietly /// + PAttern(str) Binary(str) Continuous(str) NOAvg Avg split SPLIT2(name) /// + adapt /// old syntax; now works as synonym for noavg + Outcome(passthru) Fromto noBAse * ] + +// handle some options + if `"`split2'"'!="" local split split + if "`split'"!="" & `"`outcome'"'!="" { + di as err "split and outcome() not both allowed" + exit 198 + } + if "`split'"!="" & `"`avg'`noavg'"'!="" { + di as err "split and avg not both allowed" + exit 198 + } + if "`avg'"!="" & `"`outcome'"'!="" { + di as err "avg and outcome not both allowed" + exit 198 + } + if "`avg'"!="" & "`noavg'"!="" { + di as err "avg and noavg not both allowed" + exit 198 + } + if `"`adapt'"'!="" local noavg noavg + if `:list sizeof binary'>1 | `:list sizeof continuous'>1 error 198 + estadd_prchange_ExpandType binary `"`binary'"' + estadd_prchange_ExpandType continuous `"`continuous'"' + if `"`binary'"'=="" local binary 2 + if `"`continuous'"'=="" local continuous 4 + if `"`pattern'"'!="" { + estadd_prchange_ExpandType pattern `"`pattern'"' + } + +// check e(sample) + confirm_esample + +// run prchange + capt findfile prchange.ado + if _rc { + di as error "-prchange- from the -spost9_ado- package by Long and Freese required" + di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"' + error 499 + } + `quietly' version `caller': prchange `anything' `if' `in', `base' `outcome' `fromto' `options' + +// determine type of model (ordinal: nomord = 1; nominal: nomord = 2) + local nomord = (r(modeltype)=="typical nomord") + if inlist(`"`e(cmd)'"',"mlogit","mprobit") local nomord = 2 + if "`avg'`noavg'"!="" { + if `nomord'==0 { + di as err "avg not allowed with this model" + exit 198 + } + } + if !`nomord' & "`split'"!="" { + di as err "split not allowed with this model" + exit 198 + } + +// determine outcome number (in prchange-returns) + if `"`outcome'"'!="" { + if `nomord' { + forv i = 1/`=colsof(r(catval))' { + if el(r(catval), 1, `i') == r(outcome) { + local outcomenum `i' + continue, break + } + } + if "`outcomenum'"=="" { // should never happen + di as err `"outcome `outcome' not found"' + exit 499 + } + } + else { + local outcomenum = colnumb(r(predval), `"`r(outcome)'"') + } + } + +// check names + if "`replace'"=="" { + if `"`outcome'"'!="" | "`split'"!="" | `nomord'==0 { + confirm_new_ename `prefix'predval + if `"`outcome'"'!="" | "`split'"!="" { + confirm_new_ename `prefix'outcome + } + } + else { + forv i = 1/`=colsof(r(catval))' { + local theoutcome: di el(r(catval),1,`i') + confirm_new_ename `prefix'predval`theoutcome' + } + } + confirm_new_ename `prefix'delta + confirm_new_ename `prefix'centered + confirm_new_ename `prefix'dc + if "`fromto'"!="" { + confirm_new_ename `prefix'dcfrom + confirm_new_ename `prefix'dcto + } + if "`nobase'"=="" { + confirm_new_ename `prefix'X + } + } + +// grab r()-results and post in e() + if "`split'"!="" { + if `"`split2'"'=="" { + local split2 `"`e(_estadd_estimates_name)'"' + if `"`split2'"'=="" { + local split2 `"`e(cmd)'"' + } + local split2 `"`split2'_"' + } + _estadd_prchange_StoreEachOutc `split2' , nomord(`nomord') /// + pattern(`pattern') binary(`binary') continuous(`continuous') /// + `base' `fromto' prefix(`prefix') + } + else { + _estadd_prchange_AddStuffToE, nomord(`nomord') outcome(`outcomenum') /// + pattern(`pattern') binary(`binary') continuous(`continuous') /// + `avg' `noavg' `base' `fromto' prefix(`prefix') + } +end +program estadd_prchange_ExpandType + args name list + foreach l of local list { + local w = length(`"`l'"') + if `"`l'"'==substr("minmax",1,max(2,`w')) local type 1 + else if `"`l'"'==substr("01",1,max(1,`w')) local type 2 + else if `"`l'"'==substr("delta",1,max(1,`w')) local type 3 + else if `"`l'"'==substr("sd",1,max(1,`w')) local type 4 + else if `"`l'"'==substr("margefct",1,max(1,`w')) local type 5 + else { + di as err `"'`l'' not allowed"' + exit 198 + } + local newlist `newlist' `type' + } + c_local `name' `newlist' +end +program define _estadd_prchange_AddStuffToE, eclass +// input add +// ========================= ======================================== +// outcome() nomord opt change changenm change# predval outcome +// no 0 - x last +// yes 0 - x x x +// no 1/2 - x all all +// yes 1/2 - x x x +// no 1/2 avg x all +// no 1/2 noavg all all +// nobase=="" => add X, SD, Min, Max +// all models => add centered, delta + syntax , nomord(str) [ pattern(passthru) binary(passthru) continuous(passthru) /// + outcome(str) NOAVG avg nobase fromto prefix(str) split ] // +// prepare predval and determine value of outcome + if `"`outcome'"'!="" { + tempname predv + mat `predv' = r(predval) + mat `predv' = `predv'[1...,`outcome'] + if `nomord' { + local theoutcome: di el(r(catval),1,`outcome') + } + else { + local theoutcome: colnames `predv' + } + } +// add scalars + di _n as txt "added scalars:" +// - predval and outcome + local cpredval = colsof(r(predval)) + if `"`outcome'"'!="" { + ereturn scalar `prefix'predval = `predv'[1,1] + added_scalar `prefix'predval `"`lab_predval'"' + ereturn scalar `prefix'outcome = `theoutcome' + added_scalar `prefix'outcome + } + else if `nomord' { // add all + forv i=1/`cpredval' { + local theoutcome: di el(r(catval),1,`i') + ereturn scalar `prefix'predval`theoutcome' = el(r(predval),1,`i') + added_scalar `prefix'predval`theoutcome' + } + } + else { // add last + ereturn scalar `prefix'predval = el(r(predval),1,`cpredval') + added_scalar `prefix'predval + } +// - delta and centered + ereturn scalar `prefix'delta = r(delta) + added_scalar `prefix'delta + ereturn scalar `prefix'centered = r(centered) + added_scalar `prefix'centered +// add matrices + di _n as txt "added matrices:" + if `nomord'==0 { + if r(modeltype)=="twoeq count" & "`test'"=="" { + local eq: coleq e(b) + local eq: word 1 of `eq' + } + _estadd_prchange_PostMat r(change), prefix(`prefix') /// + name(dc) `pattern' `binary' `continuous' `fromto' eq(`eq') + } + else { + if `"`outcome'"'=="" { + if "`avg'"!="" local nomordmat "r(changemn)" + else { + tempname nomordmat + _estadd_prchange_GatherNomChMat `nomordmat' `noavg' + } + _estadd_prchange_PostMat `nomordmat', prefix(`prefix') /// + name(dc) `pattern' `binary' `continuous' `fromto' + } + else { + if `nomord'==2 { + _estadd_prchange_GetEqnmNomModl `theoutcome' + } + if `"`split'"'!="" { + _estadd_prchange_PostMat r(change`theoutcome'), prefix(`prefix') /// + name(dc) `pattern' `binary' `continuous' `fromto' eq(`eq') + } + else { + _estadd_prchange_PostMat r(change), prefix(`prefix') /// + name(dc) `pattern' `binary' `continuous' `fromto' eq(`eq') + } + } + } + if `"`base'"'=="" { + _estadd_prchange_PostMat r(baseval), prefix(`prefix') name(X) + } + if `"`pattern'"'=="" { + _estadd_prchange_dcNote, prefix(`prefix') name(dc) `binary' `continuous' + } +end +program define _estadd_prchange_dcNote + syntax [ , prefix(str) name(str) binary(str) continuous(str) ] + local res `""{res:minmax} change" "{res:01} change" "{res:delta} change" "{res:sd} change" "{res:margefct}""' + local bres: word `binary' of `res' + local cres: word `continuous' of `res' + di _n as txt `"first row in e(dc) contains:"' + di _n `" `bres' for binary variables"' + di `" `cres' for continuous variables"' +end +program define _estadd_prchange_PostMat, eclass + syntax anything, name(str) [ Fromto eq(str) prefix(str) /// + pattern(passthru) binary(passthru) continuous(passthru) ] + capt confirm matrix `anything' + if _rc exit + tempname tmp1 + local nmlist "`name'" + matrix `tmp1' = `anything' + if `"`eq'"'!="" { + mat coleq `tmp1' = `"`eq'"' + } + if `"`pattern'`binary'`continuous'"'!="" { + tempname pattmat + _estadd_prchange_Merge `tmp1', pattmat(`pattmat') `pattern' `binary' `continuous' `fromto' + } + if "`fromto'"!="" { + local nmlist "`nmlist' `name'from `name'to" + tempname tmp tmp2 tmp3 + mat rename `tmp1' `tmp' + local r = rowsof(`tmp') + local i = 1 + while (`i'<=`r') { + if (`r'-`i')>=2 { + mat `tmp2' = nullmat(`tmp2') \ `tmp'[`i++',1...] // from + mat `tmp3' = nullmat(`tmp3') \ `tmp'[`i++',1...] // to + } + mat `tmp1' = nullmat(`tmp1') \ `tmp'[`i++',1...] + } + mat drop `tmp' + } + local i 0 + foreach nm of local nmlist { + local ++i + local rown: rown `tmp`i'' + mat rown `tmp`i'' = `rown' // fix problem with leading blanks in equations + ereturn matrix `prefix'`nm' = `tmp`i'' + added_matrix `prefix'`nm' _rown + } + if `"`pattmat'"'!="" { + ereturn matrix `prefix'pattern = `pattmat' + added_matrix `prefix'pattern + } +end +program define _estadd_prchange_Merge + syntax name(name=tmp1) [, pattmat(str) pattern(str) binary(str) continuous(str) fromto ] + tempname tmp + mat rename `tmp1' `tmp' + local r = cond("`fromto'"!="", 3, 1) + mat `tmp1' = `tmp'[1..`r',1...]*. + mat `pattmat' = `tmp'[1,1...]*. + local rtot = rowsof(`tmp') + mat rown `tmp1' = main + mat rown `pattmat' = :type + local vars: colnames `tmp1' + local eqs: coleq `tmp1', quoted + local j 0 + foreach var of local vars { + local ++j + gettoken eq eqs : eqs + if `"`eq'"'!=`"`lasteq'"' gettoken type rest : pattern + else gettoken type rest : rest + local lasteq `"`eq'"' + if `"`type'"'=="" { + capt assert `var'==0|`var'==1 if e(sample) & `var'<. + if _rc local type `continuous' + else local type `binary' + } + local ii = (`type'-1)*`r'+1 + forv i = 1/`r' { + if `r'>1 & `i'<3 & `ii'>=`rtot' { + mat `tmp1'[`i',`j'] = .z + } + else { + mat `tmp1'[`i',`j'] = `tmp'[`ii++',`j'] + } + } + mat `pattmat'[1,`j'] = `type' + } + mat `tmp1' = `tmp1' \ `tmp' +end +program define _estadd_prchange_GatherNomChMat + args mat noavg + local cmd `"`e(cmd)'"' + tempname tmpmat + if `"`noavg'"'=="" { + mat `tmpmat' = r(changemn) + mat coleq `tmpmat' = `"Avg|Chg|"' + mat `mat' = `tmpmat' + } + if `"`cmd'"'=="mlogit" { + if c(stata_version) < 9 local outcat cat + else local outcat out + local k_cat = e(k_`outcat') + local eqnames `"`e(eqnames)'"' + if `k_cat'>`:list sizeof eqnames' { // no base equation + local ibase = e(ibase`outcat') + local baselab `"`e(baselab)'"' + if `"`baselab'"'=="" { + local baselab `"`e(base`outcat')'"' + } + forv i = 1/`k_cat' { + if `i'==`ibase' { + local eq `"`"`baselab'"'"' + } + else gettoken eq eqnames : eqnames, quotes + local temp `"`temp' `eq'"' + } + local eqnames: list retok temp + } + local i 0 + foreach eq of local eqnames { + local ++i + local theoutcome: di el(e(`outcat'),1,`i') + mat `tmpmat' = r(change`theoutcome') + mat coleq `tmpmat' = `"`eq'"' + mat `mat' = nullmat(`mat'), `tmpmat' + } + } + else if `"`cmd'"'=="mprobit" { + local eqnames `"`e(outeqs)'"' + local i 0 + foreach eq of local eqnames { + local ++i + local theoutcome: di el(e(outcomes),`i',1) + mat `tmpmat' = r(change`theoutcome') + mat coleq `tmpmat' = `"`eq'"' + mat `mat' = nullmat(`mat'), `tmpmat' + } + } + else { // ordered models + local eqnames : colnames r(catval) + local i 0 + foreach eq of local eqnames { + local ++i + local theoutcome: di el(r(catval),1,`i') + mat `tmpmat' = r(change`theoutcome') + mat coleq `tmpmat' = `"`eq'"' + mat `mat' = nullmat(`mat'), `tmpmat' + } + } +end +program define _estadd_prchange_GetEqnmNomModl + args theoutcome + local cmd `"`e(cmd)'"' + if `"`cmd'"'=="mlogit" { + if c(stata_version) < 9 local outcat cat + else local outcat out + local k_cat = e(k_`outcat') + local eqnames `"`e(eqnames)'"' + local nobase = (`k_cat'>`:list sizeof eqnames') + if `nobase' { + local ibase = e(ibase`outcat') + local baselab `"`e(baselab)'"' + } + forv i = 1/`k_cat' { + if `nobase' { + if `i'==`ibase' { + local eq `"`baselab'"' + } + else gettoken eq eqnames : eqnames + } + else gettoken eq eqnames : eqnames + if el(e(`outcat'),1,`i')==`theoutcome' { + local value `"`eq'"' + continue, break + } + } + } + else if `"`cmd'"'=="mprobit" { + local eqnames `"`e(outeqs)'"' + local i 0 + foreach eq of local eqnames { + if el(e(outcomes),`++i',1)==`theoutcome' { + local value `"`eq'"' + continue, break + } + } + } + if `"`value'"'=="" local value `theoutcome' + c_local eq `"`value'"' +end +program define _estadd_prchange_StoreEachOutc // only for nomord models + syntax anything [, nomord(str) nobase fromto prefix(passthru) /// + pattern(passthru) binary(passthru) continuous(passthru) ] +// backup estimates + tempname hcurrent + _est hold `hcurrent', copy restore estsystem + if `"`nomord'"'=="2" { // backup b and V + tempname b bi V Vi + mat `b' = e(b) + mat `V' = e(V) + } +// cycle through categories + local k_kat = colsof(r(predval)) + tempname catval catvali + mat `catval' = r(catval) + forv i=1/`k_kat' { + mat `catvali' = `catval'[1...,`i'] + local catlabi: colnames `catvali' + local catnumi: di `catvali'[1,1] + if `"`nomord'"'=="2" { + _estadd_prchange_GetEqnmNomModl `catnumi' + if colnumb(`b', `"`eq':"')<. { + mat `bi' = `b'[1...,`"`eq':"'] + mat `Vi' = `V'[`"`eq':"',`"`eq':"'] + } + else { // base outcome; get first eq and set zero + local tmp : coleq `b', q + gettoken tmp : tmp + mat `bi' = `b'[1...,`"`tmp':"'] * 0 + mat `Vi' = `V'[`"`tmp':"',`"`tmp':"'] * 0 + } + mat coleq `bi' = "" + mat coleq `Vi' = "" + mat roweq `Vi' = "" + erepost b=`bi' V=`Vi' + } + `qui' _estadd_prchange_AddStuffToE, split nomord(1) outcome(`i') /// + `base' `fromto' `pattern' `binary' `continuous' `prefix' + `qui' di "" + local qui qui + _eststo `anything'`catnumi', title(`"`catlabi'"') // store without e(sample) + di as txt "results for outcome " as res `catnumi' /// + as txt " stored as " as res "`anything'`catnumi'" + } +// retore estimates + _est unhold `hcurrent' +end + +* 22. +* -estadd- subroutine: support for -prvalue- by Long and Freese +* (see http://www.indiana.edu/~jslsoc/spost.htm) +program define estadd_prvalue, eclass + version 9.2 + local caller : di _caller() + syntax [anything] [if] [in] [ , Prefix(passthru) Replace Quietly /// + LABel(str) Title(passthru) swap Diff * ] + +// post + if `"`anything'"'!="" { + gettoken post post2 : anything + if `"`post'"'!="post" { + di as err `"`post' not allowed"' + exit 198 + } + else if `"`label'"'!="" { + di as err "label() not allowed" + exit 198 + } + _estadd_prvalue_Post `post2' `if' `in', `prefix' `replace' `quietly' /// + `title' `swap' `diff' `options' + exit + } + else if `"`title'"'!="" { + di as err "title() not allowed" + exit 198 + } + else if "`swap'"!="" { + di as err "swap not allowed" + exit 198 + } + +// look for e(sample) + confirm_esample + +// run prvalue + capt findfile prvalue.ado + if _rc { + di as error "-prvalue- from the -spost9_ado- package by Long and Freese required" + di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"' + error 499 + } + `quietly' version `caller': prvalue `if' `in', `diff' `options' + +// append? + capture confirm existence `e(_estadd_prvalue)' + local append = (_rc==0) & ("`replace'"=="") + tempname prvalue prvalue_x prvalue_x2 + if `append' { + mat `prvalue' = e(_estadd_prvalue) + mat `prvalue_x' = e(_estadd_prvalue_x) + capt mat `prvalue_x2' = e(_estadd_prvalue_x2) + local ires = rowsof(`prvalue') + 1 + } + else local ires 1 + if `"`label'"'=="" { + local label "pred`ires'" + } + else { + local label = substr(`"`label'"', 1, 30) // 30 characters max + local problemchars `": . `"""'"' + foreach char of local problemchars { + local label: subinstr local label `"`char'"' "_", all + } + } + +// collect results + tempname pred + mat `pred' = r(pred) + if `"`diff'"'!="" { + _estadd_prvalue_GetRidOfD `pred' + } + _estadd_prvalue_ReshapePred `pred', label(`label') + _estadd_prvalue_AddPred `prvalue' `pred' `append' + _estadd_prvalue_AddX `prvalue_x', label(`label') + capture confirm matrix r(x2) + local hasx2 = _rc==0 + if `hasx2' { + _estadd_prvalue_AddX `prvalue_x2', label(`label') two + } + +// post in e() + di as txt _n cond(`append',"updated","added") " matrices:" + ereturn matrix _estadd_prvalue = `prvalue' + added_matrix _estadd_prvalue + ereturn matrix _estadd_prvalue_x = `prvalue_x' + added_matrix _estadd_prvalue_x + if `hasx2' { + ereturn matrix _estadd_prvalue_x2 = `prvalue_x2' + added_matrix _estadd_prvalue_x2 + } +end +program _estadd_prvalue_GetRidOfD + args pred + local coln: colnames `pred' + local firstcol: word 1 of `coln' + local nfirstcol = substr("`firstcol'",2,.) + local coln : subinstr local coln "`firstcol'" "`nfirstcol'" , word + mat coln `pred' = `coln' +end +program _estadd_prvalue_ReshapePred + syntax anything, label(str) + tempname tmp res + local r = rowsof(`anything') + forv i=1/`r' { + mat `tmp' = `anything'[`i',1...] + local nm: rownames `tmp' + mat coleq `tmp' = `"`nm'"' + mat `res' = nullmat(`res'), `tmp' + } + mat rown `res' = `"`label'"' + mat `anything' = `res' +end +program _estadd_prvalue_AddPred + args prvalue pred append + if `append' { + local coln1: colfullnames `prvalue' + local coln2: colfullnames `pred' + if `"`coln1'"'!=`"`coln2'"' { + di as err "incompatible prvalue results" + exit 498 + } + } + mat `prvalue' = nullmat(`prvalue') \ `pred' +end +program _estadd_prvalue_AddX + syntax anything, label(str) [ two ] + if "`two'"!="" local two 2 + tempname tmp + mat `tmp' = r(x`two') + mat rown `tmp' = `"`label'"' + mat `anything' = nullmat(`anything') \ `tmp' +end +program _estadd_prvalue_Post, eclass + syntax [name(name=post2)] [ , Prefix(name) Replace Quietly /// + Title(passthru) swap ] + capture confirm matrix e(_estadd_prvalue) + if _rc { + di as err "prvalue results not found" + exit 498 + } +// backup estimates + tempname hcurrent + _est hold `hcurrent', copy restore estsystem + local cmd = e(cmd) + local depvar = e(depvar) + local N = e(N) + local estname `"`e(_estadd_estimates_name)'"' + +// get results + tempname prvalue prvalue_x prvalue_x2 + mat `prvalue' = e(_estadd_prvalue) + mat `prvalue_x' = e(_estadd_prvalue_x) + capture confirm matrix e(_estadd_prvalue_x2) + local hasx2 = _rc==0 + if `hasx2' { + mat `prvalue_x2' = e(_estadd_prvalue_x2) + } + +// return prvalues + tempname tmp tmp2 b se + if "`swap'"=="" { + local eqs: coleq `prvalue', q + local eqs: list uniq eqs + foreach eq of local eqs { + mat `tmp' = `prvalue'[1...,`"`eq':"'] + mat `tmp2' = `tmp'[1...,1]' + mat coleq `tmp2' = `"`eq'"' + mat roweq `tmp2' = "" + mat `b' = nullmat(`b'), `tmp2' + mat `tmp2' = `tmp'[1...,`"`eq':SE"']' + mat coleq `tmp2' = `"`eq'"' + mat roweq `tmp2' = "" + mat `se' = nullmat(`se'), `tmp2' + } + mat drop `tmp' `tmp2' + } + else { + local r = rowsof(`prvalue') + local c = colsof(`prvalue') + local coln: colnames `prvalue' + local eqs: coleq `prvalue', q + mat coln `prvalue' = `eqs' + mat coleq `prvalue' = `coln' + local coln: list uniq coln + local ncol: list sizeof coln + local icol: list posof "SE" in coln + forv i=1/`r' { + mat `tmp' = `prvalue'[`i',1...] + local labl : rownames `tmp' + forv j=1(`ncol')`c' { + mat `tmp2' = nullmat(`tmp2'), `tmp'[1...,`j'] + } + mat coleq `tmp2' = `"`labl'"' + mat `b' = nullmat(`b'), `tmp2' + mat drop `tmp2' + forv j=`icol'(`ncol')`c' { + mat `tmp2' = nullmat(`tmp2'), `tmp'[1...,`j'] + } + mat coleq `tmp2' = `"`labl'"' + mat `se' = nullmat(`se'), `tmp2' + mat drop `tmp2' + } + mat drop `tmp' + } + ereturn post `b', obs(`N') + ereturn local model "`cmd'" + ereturn local cmd "estadd_prvalue" + ereturn local depvar "`depvar'" + di as txt _n "scalars:" + added_scalar N + di as txt _n "macros:" + added_macro depvar + added_macro cmd + added_macro model + added_macro properties + di as txt _n "matrices:" + added_matrix b "predictions" + ereturn matrix se = `se' + added_matrix se "standard errors" + local istat 0 + foreach stat in LB UB Category Cond { + local elabel: word `++istat' of "lower CI bounds" "upper CI bounds" /// + "outcome values" "conditional predictions" + if "`swap'"=="" { + foreach eq of local eqs { + local colnumb = colnumb(`prvalue',`"`eq':`stat'"') + if `colnumb'>=. continue + mat `tmp2' = `prvalue'[1...,`colnumb']' + mat coleq `tmp2' = `"`eq'"' + mat roweq `tmp2' = "" + mat `tmp' = nullmat(`tmp'), `tmp2' + } + } + else { + local icol: list posof "`stat'" in coln + if `icol'==0 continue + forv i=1/`r' { + mat `tmp2' = `prvalue'[`i',1...] + local labl : rownames `tmp2' + mat coleq `tmp2' = `"`labl'"' + forv j=`icol'(`ncol')`c' { + mat `tmp' = nullmat(`tmp'), `tmp2'[1...,`j'] + } + } + mat drop `tmp2' + } + capt confirm matrix `tmp' + if _rc==0 { + ereturn matrix `prefix'`stat' = `tmp' + added_matrix `prefix'`stat' "`elabel'" + } + } + +// return x-values + matrix `prvalue_x' = `prvalue_x'' + ereturn matrix `prefix'X = `prvalue_x' + added_matrix `prefix'X _rown + if `hasx2' { + matrix `prvalue_x2' = `prvalue_x2'' + ereturn matrix `prefix'X2 = `prvalue_x2' + added_matrix `prefix'X2 _rown + } + +// store + if "`post2'"!="" { + _eststo `estname'`post2', `title' + di as txt _n "results stored as " as res "`estname'`post2'" + } + else if `"`title'"'!="" { + estimates change ., `title' + } + +// retore estimates + if "`post2'"!="" { + _est unhold `hcurrent' + } + else { + _est unhold `hcurrent', not + } +end + +* 23. +* -estadd- subroutine: support for -asprvalue- by Long and Freese +* (see http://www.indiana.edu/~jslsoc/spost.htm) +program define estadd_asprvalue, eclass + version 9.2 + local caller : di _caller() + syntax [anything] [ , Prefix(passthru) Replace Quietly /// + LABel(str) Title(passthru) swap * ] + +// post + if `"`anything'"'!="" { + gettoken post post2 : anything + if `"`post'"'!="post" { + di as err `"`post' not allowed"' + exit 198 + } + else if `"`label'"'!="" { + di as err "label() not allowed" + exit 198 + } + _estadd_asprvalue_Post `post2' , `prefix' `replace' `quietly' /// + `title' `swap' `options' + exit + } + else if `"`title'"'!="" { + di as err "title() not allowed" + exit 198 + } + else if "`swap'"!="" { + di as err "swap not allowed" + exit 198 + } + +// look for e(sample) + confirm_esample + +// run prvalue + capt findfile asprvalue.ado + if _rc { + di as error "-asprvalue- from the -spost9_ado- package by Long and Freese required" + di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"' + error 499 + } + `quietly' version `caller': asprvalue , `options' + +// append? + capture confirm existence `e(_estadd_asprval)' + local append = (_rc==0) & ("`replace'"=="") + tempname asprval asprval_asv asprval_csv + if `append' { + mat `asprval' = e(_estadd_asprval) + capt mat `asprval_asv' = e(_estadd_asprval_asv) + capt mat `asprval_csv' = e(_estadd_asprval_csv) + local ires = rowsof(`asprval') + 1 + } + else local ires 1 + if `"`label'"'=="" { + local label "pred`ires'" + } + else { + local label = substr(`"`label'"', 1, 30) // 30 characters max + local problemchars `": . `"""'"' + foreach char of local problemchars { + local label: subinstr local label `"`char'"' "_", all + } + } + +// collect results + tempname res + mat `res' = r(p) + _estadd_asprvalue_Reshape `res', label(`label') + _estadd_asprvalue_Add `asprval' `res' `append' + capture confirm matrix r(asv) + local hasasv = _rc==0 + if `hasasv' { + mat `res' = r(asv) + _estadd_asprvalue_Reshape `res', label(`label') + _estadd_asprvalue_Add `asprval_asv' `res' `append' + } + capture confirm matrix r(csv) + local hascsv = _rc==0 + if `hascsv' { + _estadd_asprvalue_AddCsv `asprval_csv', label(`label') + } + +// post in e() + di as txt _n cond(`append',"updated","added") " matrices:" + ereturn matrix _estadd_asprval = `asprval' + added_matrix _estadd_asprval + if `hasasv' { + ereturn matrix _estadd_asprval_asv = `asprval_asv' + added_matrix _estadd_asprval_asv + } + if `hascsv' { + ereturn matrix _estadd_asprval_csv = `asprval_csv' + added_matrix _estadd_asprval_csv + } +end +program _estadd_asprvalue_Reshape + syntax anything, label(str) + tempname tmp res + local r = rowsof(`anything') + forv i=1/`r' { + mat `tmp' = `anything'[`i',1...] + local nm: rownames `tmp' + mat coleq `tmp' = `"`nm'"' + mat `res' = nullmat(`res'), `tmp' + } + mat rown `res' = `"`label'"' + mat `anything' = `res' +end +program _estadd_asprvalue_Add + args master using append + if `append' { + local coln1: colfullnames `master' + local coln2: colfullnames `using' + if `"`coln1'"'!=`"`coln2'"' { + di as err "incompatible asprvalue results" + exit 498 + } + } + mat `master' = nullmat(`master') \ `using' +end +program _estadd_asprvalue_AddCsv + syntax anything, label(str) + tempname tmp + mat `tmp' = r(csv) + mat rown `tmp' = `"`label'"' + mat `anything' = nullmat(`anything') \ `tmp' +end +program _estadd_asprvalue_Post, eclass + syntax [name(name=post2)] [ , Prefix(name) Replace Quietly /// + Title(passthru) swap ] + capture confirm matrix e(_estadd_asprval) + if _rc { + di as err "asprvalue results not found" + exit 498 + } + +// backup estimates + tempname hcurrent + _est hold `hcurrent', copy restore estsystem + local cmd = e(cmd) + local depvar = e(depvar) + local N = e(N) + local estname `"`e(_estadd_estimates_name)'"' + +// get results + tempname asprval asprval_asv asprval_csv + mat `asprval' = e(_estadd_asprval) + capture confirm matrix e(_estadd_asprval_asv) + local hasasv = _rc==0 + if `hasasv' { + mat `asprval_asv' = e(_estadd_asprval_asv) + } + capture confirm matrix e(_estadd_asprval_csv) + local hascsv = _rc==0 + if `hascsv' { + mat `asprval_csv' = e(_estadd_asprval_csv) + } + +// return predictions + tempname tmp tmp2 b + if "`swap'"=="" { + local eqs: coleq `asprval', q + local eqs: list uniq eqs + foreach eq of local eqs { + mat `tmp' = `asprval'[1...,`"`eq':"'] + mat `tmp2' = `tmp'[1...,1]' + mat coleq `tmp2' = `"`eq'"' + mat roweq `tmp2' = "" + mat `b' = nullmat(`b'), `tmp2' + } + mat drop `tmp' `tmp2' + } + else { + local r = rowsof(`asprval') + local coln: colnames `asprval' + local eqs: coleq `asprval', q + mat coln `asprval' = `eqs' + forv i=1/`r' { + mat `tmp' = `asprval'[`i',1...] + local labl : rownames `tmp' + mat coleq `tmp' = `"`labl'"' + mat `b' = nullmat(`b'), `tmp' + } + mat drop `tmp' + } + ereturn post `b', obs(`N') + ereturn local model "`cmd'" + ereturn local cmd "estadd_asprvalue" + ereturn local depvar "`depvar'" + di as txt _n "scalars:" + added_scalar N + di as txt _n "macros:" + added_macro depvar + added_macro cmd + added_macro model + added_macro properties + di as txt _n "matrices:" + added_matrix b "predictions" + +// return asv-values + if `hasasv' { + if "`swap'"=="" { + local vars: coleq `asprval_asv' + local vars: list uniq vars + local cats: colnames `asprval_asv' + local cats: list uniq cats + foreach var of local vars { + foreach cat of local cats { + mat `tmp2' = `asprval_asv'[1...,`"`var':`cat'"']' + mat coleq `tmp2' = `"`cat'"' + mat roweq `tmp2' = "" + mat `tmp' = nullmat(`tmp'), `tmp2' + } + mat rown `tmp' = `"`var'"' + mat `b' = nullmat(`b') \ `tmp' + mat drop `tmp' + } + } + else { + local r = rowsof(`asprval_asv') + local vars: coleq `asprval_asv' + local vars: list uniq vars + forv i=1/`r' { + foreach var of local vars { + mat `tmp2' = `asprval_asv'[`i',`"`var':"'] + local lbl: rownames `tmp2' + mat coleq `tmp2' = `"`lbl'"' + mat rown `tmp2' = `"`var'"' + mat `tmp' = nullmat(`tmp') \ `tmp2' + } + mat `b' = nullmat(`b') , `tmp' + mat drop `tmp' + } + } + ereturn matrix `prefix'asv = `b' + added_matrix `prefix'asv _rown + } +// return csv-values + if `hascsv' { + matrix `asprval_csv' = `asprval_csv'' + ereturn matrix `prefix'csv = `asprval_csv' + added_matrix `prefix'csv _rown + } + +// store + if "`post2'"!="" { + _eststo `estname'`post2', `title' + di as txt _n "results stored as " as res "`estname'`post2'" + } + else if `"`title'"'!="" { + estimates change ., `title' + } + +// retore estimates + if "`post2'"!="" { + _est unhold `hcurrent' + } + else { + _est unhold `hcurrent', not + } +end + +* 24. estadd_margins +program define estadd_margins, eclass + version 11.0 + local caller : di _caller() + syntax [ anything(everything equalok)] [fw aw iw pw] [, Prefix(name) Replace Quietly * ] + +// set default prefix + if "`prefix'"=="" local prefix "margins_" + +// compute and return the results + if `"`weight'`exp'"'!="" local wgtexp `"[`weight'`exp']"' + `quietly' version `caller': margins `anything' `wgtexp', `options' + +// check names + local rscalars: r(scalars) + local rmacros: r(macros) + local rmatrices: r(matrices) + local rmatrices: subinstr local rmatrices "V" "se", word + if "`replace'"=="" { + foreach nmlist in rscalars rmacros rmatrices { + foreach name of local `nmlist' { + confirm_new_ename `prefix'`name' + } + } + } + +// add results + di as txt _n "added scalars:" + foreach name of local rscalars { + ereturn scalar `prefix'`name' = r(`name') + added_scalar `prefix'`name' + } + di as txt _n "added macros:" + foreach name of local rmacros { + ereturn local `prefix'`name' `"`r(`name')'"' + added_macro `prefix'`name' + } + di as txt _n "added matrices:" + tempname tmpmat + foreach name of local rmatrices { + if "`name'"=="se" { + mat `tmpmat' = vecdiag(r(V)) + forv i = 1/`=colsof(`tmpmat')' { + mat `tmpmat'[1,`i'] = sqrt(`tmpmat'[1,`i']) + } + } + else { + mat `tmpmat' = r(`name') + } + eret matrix `prefix'`name' = `tmpmat' + added_matrix `prefix'`name' + } +end + +* 99. +* copy of erepost.ado, version 1.0.1, Ben Jann, 30jul2007 +* used by estadd_listcoef and estadd_prchange +prog erepost, eclass + version 8.2 + syntax [anything(equalok)] [, cmd(str) noEsample Esample2(varname) REName /// + Obs(passthru) Dof(passthru) PROPerties(passthru) * ] + if "`esample'"!="" & "`esample2'"!="" { + di as err "only one allowed of noesample and esample()" + exit 198 + } +// parse [b = b] [V = V] + if `"`anything'"'!="" { + tokenize `"`anything'"', parse(" =") + if `"`7'"'!="" error 198 + if `"`1'"'=="b" { + if `"`2'"'=="=" & `"`3'"'!="" { + local b `"`3'"' + confirm matrix `b' + } + else error 198 + if `"`4'"'=="V" { + if `"`5'"'=="=" & `"`6'"'!="" { + local v `"`6'"' + confirm matrix `b' + } + else error 198 + } + else if `"`4'"'!="" error 198 + } + else if `"`1'"'=="V" { + if `"`4'"'!="" error 198 + if `"`2'"'=="=" & `"`3'"'!="" { + local v `"`3'"' + confirm matrix `v' + } + else error 198 + } + else error 198 + } +//backup existing e()'s + if "`esample2'"!="" { + local sample "`esample2'" + } + else if "`esample'"=="" { + tempvar sample + gen byte `sample' = e(sample) + } + local emacros: e(macros) + if `"`properties'"'!="" { + local emacros: subinstr local emacros "properties" "", word + } + foreach emacro of local emacros { + local e_`emacro' `"`e(`emacro')'"' + } + local escalars: e(scalars) + if `"`obs'"'!="" { + local escalars: subinstr local escalars "N" "", word + } + if `"`dof'"'!="" { + local escalars: subinstr local escalars "df_r" "", word + } + foreach escalar of local escalars { + tempname e_`escalar' + scalar `e_`escalar'' = e(`escalar') + } + local ematrices: e(matrices) + if "`b'"=="" & `:list posof "b" in ematrices' { + tempname b + mat `b' = e(b) + } + if "`v'"=="" & `:list posof "V" in ematrices' { + tempname v + mat `v' = e(V) + } + local bV "b V" + local ematrices: list ematrices - bV + foreach ematrix of local ematrices { + tempname e_`ematrix' + matrix `e_`ematrix'' = e(`ematrix') + } +// rename + if "`b'"!="" & "`v'"!="" & "`rename'"!="" { + local eqnames: coleq `b', q + local vnames: colnames `b' + mat coleq `v' = `eqnames' + mat coln `v' = `vnames' + mat roweq `v' = `eqnames' + mat rown `v' = `vnames' + } +// post results + if "`esample'"=="" { + eret post `b' `v', esample(`sample') `obs' `dof' `properties' `options' + } + else { + eret post `b' `v', `obs' `dof' `properties' `options' + } + foreach emacro of local emacros { + eret local `emacro' `"`e_`emacro''"' + } + if `"`cmd'"'!="" { + eret local cmd `"`cmd'"' + } + foreach escalar of local escalars { + eret scalar `escalar' = scalar(`e_`escalar'') + } + foreach ematrix of local ematrices { + eret matrix `ematrix' = `e_`ematrix'' + } +end diff --git a/data/ado/e/estadd.hlp b/data/ado/e/estadd.hlp new file mode 100644 index 0000000..c1b389c --- /dev/null +++ b/data/ado/e/estadd.hlp @@ -0,0 +1,939 @@ +{smcl} +{* 01feb2017}{...} +{hi:help estadd}{right:also see: {helpb esttab}, {helpb estout}, {helpb eststo}, {helpb estpost}} +{right: {browse "http://repec.sowi.unibe.ch/stata/estout/"}} +{hline} + +{title:Title} + +{p 4 4 2}{hi:estadd} {hline 2} Add results to (stored) estimates + + +{title:Syntax} + +{p 8 15 2} +{cmd:estadd} {it:{help estadd##subcommands:subcommand}} [{cmd:,} +{it:{help estadd##opts:options}} ] [ {cmd::} {it:namelist} ] + + + where {it:namelist} is {cmd:_all} | {cmd:*} | {it:name} [{it:name} ...] + +{marker subcommands} + {it:subcommands}{col 26}description + {hline 65} + Elementary + {helpb estadd##local:{ul:loc}al} {it:name ...}{col 26}{...} +add a macro + {helpb estadd##scalar:{ul:sca}lar} {it:name} {cmd:=} {it:exp}{col 26}{...} +add a scalar + {helpb estadd##matrix:{ul:mat}rix} {it:name} {cmd:=} {it:mat}{col 26}{...} +add a matrix + {helpb estadd##rreturn:r({it:name})}{col 26}{...} +add contents of {cmd:r(}{it:name}{cmd:)} (matrix or scalar) + + Statistics for each + coefficient + {helpb estadd##beta:beta}{col 26}{...} +standardized coefficients + {helpb estadd##vif:vif}{col 26}{...} +variance inflation factors (after {cmd:regress}) + {helpb estadd##pcorr:pcorr}{col 26}{...} +partial (and semi-partial) correlations + {helpb estadd##expb:expb}{col 26}{...} +exponentiated coefficients + {helpb estadd##ebsd:ebsd}{col 26}{...} +standardized factor change coefficients + {helpb estadd##mean:mean}{col 26}{...} +means of regressors + {helpb estadd##sd:sd}{col 26}{...} +standard deviations of regressors + {helpb estadd##summ:summ}{col 26}{...} +various descriptives of the regressors + + Summary statistics + {helpb estadd##coxsnell:coxsnell}{col 26}{...} +Cox & Snell's pseudo R-squared + {helpb estadd##nagelkerke:nagelkerke}{col 26}{...} +Nagelkerke's pseudo R-squared + {helpb estadd##lrtest:lrtest} {it:model}{col 26}{...} +likelihood-ratio test + {helpb estadd##ysumm:ysumm}{col 26}{...} +descriptives of the dependent variable + + Other + {helpb estadd##margins:margins}{col 26}{...} +add results from {cmd:margins} (Stata 11 or newer) + + {help estadd##spost:SPost9} + {helpb estadd##brant:brant}{col 26}{...} +add results from {cmd:brant} (if installed) + {helpb estadd##fitstat:fitstat}{col 26}{...} +add results from {cmd:fitstat} (if installed) + {helpb estadd##listcoef:listcoef}{col 26}{...} +add results from {cmd:listcoef} (if installed) + {helpb estadd##mlogtest:mlogtest}{col 26}{...} +add results from {cmd:mlogtest} (if installed) + {helpb estadd##prchange:prchange}{col 26}{...} +add results from {cmd:prchange} (if installed) + {helpb estadd##prvalue:prvalue}{col 26}{...} +add results from {cmd:prvalue} (if installed) + {helpb estadd##asprvalue:asprvalue}{col 26}{...} +add results from {cmd:asprvalue} (if installed) + {hline 65} + +{marker opts} + {it:{help estadd##options:options}}{col 26}description + {hline 65} + {cmdab:r:eplace}{col 26}{...} +permit overwriting existing {cmd:e()}'s + {cmdab:p:refix(}{it:string}{cmd:)}{col 26}{...} +specify prefix for names of added results + {cmdab:q:uietly}{col 26}{...} +suppress output from subcommand (if any) + {it:subcmdopts}{col 26}{...} +subcommand specific options + {hline 65} + + +{title:Description} + +{p 4 4 2} +{cmd:estadd} adds additional results to the {cmd:e()}-returns of an +estimation command (see help {help estcom}, help {helpb ereturn}). If no +{it:namelist} is provided, then the results are added to the +currently active estimates (i.e. the model fit last). If these +estimates have been previously stored, the stored copy of the +estimates will also be modified. Alternatively, if {it:namelist} is +provided after the colon, results are added to all indicated sets of +stored estimates (see help {helpb estimates store} or help +{helpb eststo}). You may use the {cmd:*} and {cmd:?} +wildcards in {it:namelist}. Execution is silent if {it:namelist} is +provided. + +{p 4 4 2} +Adding additional results to the {cmd:e()}-returns is useful, for example, +if the estimates be tabulated by commands such as {helpb estout} +or {helpb esttab}. See the {help estadd##examples:Examples} section below for +illustration of the usage of {cmd:estadd}. + +{p 4 4 2}Technical note: Some of the subcommands below make use of the +information contained in {cmd:e(sample)} to determine estimation sample. +These subcommands return error if the estimates do not contain +{cmd:e(sample)}. + + +{title:Subcommands} + +{dlgtab:Elementary} +{marker local} +{p 4 8 2} +{cmd:estadd} {cmdab:loc:al} {it:name ...} + +{p 8 8 2} +adds in macro {cmd:e(}{it:name}{cmd:)} the specified contents (also +see help {helpb ereturn}). + +{marker scalar} +{p 4 8 2} +{cmd:estadd} {cmdab:sca:lar} {it:name} {cmd:=} {it:exp} + +{p 8 8 2} +adds in scalar {cmd:e(}{it:name}{cmd:)} the evaluation of {it:exp} +(also see help {helpb ereturn}). {it:name} must not be {cmd:b} or {cmd:V}. + +{p 4 8 2} +{cmd:estadd} {cmdab:sca:lar} {cmd:r(}{it:name}{cmd:)} + +{p 8 8 2} +adds in scalar {cmd:e(}{it:name}{cmd:)} the value of scalar +{cmd:r(}{it:name}{cmd:)}. {it:name} must not be {cmd:b} or {cmd:V}. + +{p 4 8 2} +{cmd:estadd} {cmdab:sca:lar} {it:name} + +{p 8 8 2} +adds in scalar {cmd:e(}{it:name}{cmd:)} the the value of scalar +{it:name}. {it:name} must not be {cmd:b} or {cmd:V}. + +{marker matrix} +{p 4 8 2} +{cmd:estadd} {cmdab:mat:rix} {it:name} {cmd:=} {it:matrix_expression} + +{p 8 8 2} +adds in matrix {cmd:e(}{it:name}{cmd:)} the evaluation of {it:matrix_expression} +(also see help {helpb matrix define}). {it:name} must not be {cmd:b} or {cmd:V}. + +{p 4 8 2} +{cmd:estadd} {cmdab:mat:rix} {cmd:r(}{it:name}{cmd:)} + +{p 8 8 2} +adds in matrix {cmd:e(}{it:name}{cmd:)} a copy of matrix +{cmd:r(}{it:name}{cmd:)}. {it:name} must not be {cmd:b} or {cmd:V}. + +{p 4 8 2} +{cmd:estadd} {cmdab:mat:rix} {it:name} + +{p 8 8 2} +adds in matrix {cmd:e(}{it:name}{cmd:)} a copy of matrix {it:name}. {it:name} +must not be {cmd:b} or {cmd:V}. + +{marker rreturn} +{p 4 8 2} +{cmd:estadd} {cmd:r(}{it:name}{cmd:)} + +{p 8 8 2} +adds in {cmd:e(}{it:name}{cmd:)} the value of scalar {cmd:r(}{it:name}{cmd:)} +or a copy of matrix {cmd:r(}{it:name}{cmd:)}, depending on the nature of +{cmd:r(}{it:name}{cmd:)}. {it:name} must not be {cmd:b} or {cmd:V}. + + +{dlgtab:Statistics for each coefficient} +{marker beta} +{p 4 8 2} +{cmd:estadd} {cmd:beta} + +{p 8 8 2} +adds in {cmd:e(beta)} the standardized beta coefficients. + +{marker vif} +{p 4 8 2} +{cmd:estadd} {cmd:vif} [{cmd:,} {cmdab:tol:erance} {cmdab:sqr:vif} ] + +{p 8 8 2} +adds in {cmd:e(vif)} the variance inflation factors (VIFs) for the +regressors (see help {helpb vif}). Note that {cmd:vif} only works +with estimates produced by {helpb regress}. {cmd:tolerance} +additionally adds the tolerances (1/VIF) in {cmd:e(tolerance)}. +{cmd:sqrvif} additionally adds the square roots of the VIFs in +{cmd:e(sqrvif)}. + +{marker pcorr} +{p 4 8 2} +{cmd:estadd} {cmd:pcorr} [{cmd:, semi} ] + +{p 8 8 2} +adds the partial correlations (see help {helpb pcorr}) and, +optionally, the semi-partial correlations between the dependent +variable and the individual regressors (see, e.g., the {cmd:pcorr2} +package from the SSC Archive). In the case of multiple-equations +models, the results are computed for the first equation only. The +partial correlations will be returned in {cmd:e(pcorr)} and, if +{cmd:semi} is specified, the semi-partial correlations will be +returned in {cmd:e(spcorr)}. + +{marker expb} +{p 4 8 2} +{cmd:estadd} {cmd:expb} [{cmd:,} {cmdab:nocons:tant} ] + +{p 8 8 2} +adds in {cmd:e(expb)} the exponentiated coefficients (see the help +{it:{help eform_option}}). {cmd:noconstant} excludes the constant +from the added results. + +{marker ebsd} +{p 4 8 2} +{cmd:estadd} {cmd:ebsd} + +{p 8 8 2} +adds in {cmd:e(ebsd)} the standardized factor change coefficients, +i.e. exp(b_jS_j), where b_j is the raw coefficient and S_j is the +standard deviation of regressor j, that are sometimes reported for +logistic regression (see Long 1997). + +{marker mean} +{p 4 8 2} +{cmd:estadd} {cmd:mean} + +{p 8 8 2} +adds in {cmd:e(mean)} the means of the regressors. + +{marker sd} +{p 4 8 2} +{cmd:estadd} {cmd:sd} [{cmd:,} {cmdab:nob:inary} ] + +{p 8 8 2} +adds in {cmd:e(sd)} the standard deviations of the regressors. +{cmd:nobinary} suppresses the computation of the standard deviation +for 0/1 variables. + +{marker summ} +{p 4 8 2} +{cmd:estadd} {cmd:summ} [{cmd:,} {it:stats} ] + +{p 8 8 2} +adds vectors of the regressors' descriptive statistics to the +estimates. The following {it:stats} are available: +{p_end} +{marker stats} + {it:stats}{col 26}description + {hline 59} + {cmdab:me:an}{col 26}mean + {cmdab:su:m}{col 26}sum + {cmdab:mi:n}{col 26}minimum + {cmdab:ma:x}{col 26}maximum + {cmdab:ra:nge}{col 26}range = max - min + {cmd:sd}{col 26}standard deviation + {cmdab:v:ar}{col 26}variance + {cmd:cv}{col 26}coefficient of variation (sd/mean) + {cmdab:sem:ean}{col 26}standard error of mean = sd/sqrt(n) + {cmdab:sk:ewness}{col 26}skewness + {cmdab:k:urtosis}{col 26}kurtosis + {cmd:p1}{col 26}1st percentile + {cmd:p5}{col 26}5th percentile + {cmd:p10}{col 26}10th percentile + {cmd:p25}{col 26}25th percentile + {cmd:p50}{col 26}50th percentile + {cmd:p75}{col 26}75th percentile + {cmd:p90}{col 26}90th percentile + {cmd:p95}{col 26}95th percentile + {cmd:p99}{col 26}99th percentile + {cmd:iqr}{col 26}interquartile range = p75 - p25 + {cmd:all}{col 26}all of the above + {cmdab:med:ian}{col 26}equivalent to specifying "{cmd:p50}" + {cmd:q}{col 26}equivalent to specifying "{cmd:p25 p50 p75}" + {hline 59} + +{p 8 8 2} +The default is {cmd:mean sd min max}. Alternatively, indicate the +desired statistics. For example, to add information on the +regressors' skewness and kurtosis, type + + {inp:. estadd summ, skewness kurtosis} + +{p 8 8 2} +The statistics names are used as the names for the returned {cmd:e()} +matrices. For example, {cmd:estadd summ, mean} will store the means +of the regressors in {cmd:e(mean)}. + + +{dlgtab:Summary statistics} +{marker coxsnell} +{p 4 8 2} +{cmd:estadd} {cmd:coxsnell} + +{p 8 8 2} +adds in {cmd:e(coxsnell)} the Cox & Snell pseudo R-squared, which is +defined as + +{p 12 12 2} +r2_coxsnell = 1 - ( L0 / L1 )^(2/N) + +{p 8 8 2} +where L0 is the likelihood of the model without regressors, L1 the +likelihood of the full model, and N is the sample size. + +{marker nagelkerke} +{p 4 8 2} +{cmd:estadd} {cmd:nagelkerke} + +{p 8 8 2} +adds in {cmd:e(nagelkerke)} the Nagelkerke pseudo R-squared (or Cragg +& Uhler pseudo R-squared), which is defined as + +{p 12 12 2} +r2_nagelkerke = r2_coxsnell / (1 - L0^(2/N)) + +{marker lrtest} +{p 4 8 2} +{cmd:estadd} {cmd:lrtest} {it:model} [{cmd:,} {cmdab:n:ame:(}{it:string}{cmd:)} +{it:{help lrtest:lrtest_options}} ] + +{p 8 8 2} +adds the results from a likelihood-ratio test, where {it:model} is +the comparison model (see help {helpb lrtest}). Added are +{cmd:e(lrtest_chi2)}, {cmd:e(lrtest_df)}, and {cmd:e(lrtest_p)}. The +names may be modified using the {cmd:name()} option. Specify +{cmd:name(}{it:myname}{cmd:)} to add {cmd:e(}{it:myname}{cmd:chi2)}, +{cmd:e(}{it:myname}{cmd:df)}, and {cmd:e(}{it:myname}{cmd:p)}. See +help {helpb lrtest} for the {it:lrtest_options}. + +{marker ysumm} +{p 4 8 2} +{cmd:estadd} {cmd:ysumm} [{cmd:,} {it:stats} ] + +{p 8 8 2} +adds descriptive statistics of the dependent variable. See the +{helpb estadd##summ:summ} subcommand above for a list of the available +{it:stats}. The default is {cmd:mean sd min max}. The default prefix +for the names of the added scalars is {cmd:y} (e.g. the mean of the +dependent variable will be returned in {cmd:e(ymean)}). Use +{cmd:estadd}'s {cmd:prefix()} option to change the prefix. If a model +has multiple dependent variables, results for the first variable will +be added. + +{dlgtab:Other} +{marker margins} +{p 4 8 2} +{cmd:estadd} {cmd:margins} [{it:marginlist}] [{it:if}] [{it:in}] [{it:weight}] [, {it:options} ] + +{p 8 8 2} +adds results from the {cmd:margins} command, which was introduced +in Stata 11. See help {helpb margins} for options. All results returned by +{cmd:margins} except {cmd:e(V)} are added using "{cmd:margins_}" as a default +prefix. For example, the margins are added in {cmd:e(margins_b)}. The +standard errors are added in {cmd:e(margins_se)}. Use the {helpb estadd##opts:prefix()} +option to change the default prefix. + +{marker spost} +{dlgtab:SPost9} + +{p 4 4 2} The following subcommands are wrappers for +commands from Long and Freese's {helpb SPost9} package (see +{browse "http://www.indiana.edu/~jslsoc/spost9.htm"}). Type + + . {net "from http://www.indiana.edu/~jslsoc/stata":net from http://www.indiana.edu/~jslsoc/stata} + +{p 4 4 2} +to obtain the {cmd:SPost9} package (spost9_ado). {cmd:SPost} for Stata 8 (spostado) is not +supported. + +{p 4 4 2}For examples on using the subcommands see +{browse "http://repec.sowi.unibe.ch/stata/estout/spost.html"}. + +{marker brant} +{p 4 8 2} +{cmd:estadd brant} [{cmd:,} {it:{help brant:brant_options}} ] + +{p 8 8 2} +applies {helpb brant} from Long and +Freese's {helpb SPost} package and adds the returned results to +{cmd:e()}. You may specify {it:brant_options} as described in +help {helpb brant}. The following results are added: + + {cmd:e(}{it:...}{cmd:)} Contents + {hline 60} + Scalars + {cmd:brant_chi2} Chi-squared of overall Brant test + {cmd:brant_df} Degrees of freedom of overall Brant test + {cmd:brant_p} P-value of overall Brant test + + Matrix + {cmd:brant} Test results for individual regressors + (rows: chi2, p LR or Wald X2 + {cmd:r2_adj} Adjusted R2 + {cmd:r2_mf} McFadden's R2 + {cmd:r2_mfadj} McFadden's Adj R2 + {cmd:r2_ml} ML (Cox-Snell) R2 + {cmd:r2_cu} Cragg-Uhler(Nagelkerke) R2 + {cmd:r2_mz} McKelvey & Zavoina's R2 + {cmd:r2_ef} Efron's R2 + {cmd:v_ystar} Variance of y* + {cmd:v_error} Variance of error + {cmd:r2_ct} Count R2 + {cmd:r2_ctadj} Adj Count R2 + {cmd:aic0} AIC + {cmd:aic_n} AIC*n + {cmd:bic0} BIC + {cmd:bic_p} BIC' + {cmd:statabic} BIC used by Stata + {cmd:stataaic} AIC used by Stata + {cmd:n_rhs} Number of rhs variables + {cmd:n_parm} Number of parameters + {hline 60} + +{marker listcoef} +{p 4 8 2} +{cmd:estadd listcoef} [{it:varlist}] [{cmd:,} {cmd:nosd} {it:{help listcoef:listcoef_options}} ] + +{p 8 8 2} +applies {helpb listcoef} from Long and +Freese's {helpb SPost} package and adds the returned results to +{cmd:e()}. You may specify {it:listcoef_options} as described in +help {helpb listcoef}. Furthermore, option {cmd:nosd} suppresses +adding the standard deviations of the variables in {cmd:e(b_sdx)}. + +{p 8 8 2}Depending on the estimation command and options, several of the +following matrices are added: + + {cmd:e(}{it:...}{cmd:)} Contents + {hline 60} + {cmd:b_xs} x-standardized coefficients + {cmd:b_ys} y-standardized coefficients + {cmd:b_std} Fully standardized coefficients + {cmd:b_fact} Factor change coefficients + {cmd:b_facts} Standardized factor change coefficients + {cmd:b_pct} Percent change coefficients + {cmd:b_pcts} Standardized percent change coefficients + {cmd:b_sdx} Standard deviation of the Xs + {hline 60} + +{p 8 8 2}For nominal models ({helpb mlogit}, {helpb mprobit}) the +original parametrization of {cmd:e(b)} may not match the contrasts +computed by {cmd:listcoef}. To be able to tabulate standardized +coefficients along with the raw coefficients for the requested +contrasts, the following additional matrices are added for +these models: + + {cmd:e(}{it:...}{cmd:)} Contents + {hline 60} + {cmd:b_raw} raw coefficients + {cmd:b_se} standard errors of raw coefficients + {cmd:b_z} z statistics + {cmd:b_p} p-values + {hline 60} + +{marker mlogtest} +{p 4 8 2} +{cmd:estadd mlogtest} [{it:varlist}] [{cmd:,} {it:{help mlogtest:mlogtest_options}} ] + +{p 8 8 2} +applies {helpb mlogtest} from Long and +Freese's {helpb SPost} package and adds the returned results to +{cmd:e()}. You may specify {it:mlogtest_options} as described in +help {helpb mlogtest}. + +{p 8 8 2}Depending on the specified options, a selection of the following +returns are added: + + {cmd:e(}{it:...}{cmd:)} Contents + {hline 60} + Scalars + {cmd:hausman_set}{it:#}{cmd:_chi2} Hausman IIA tests using {helpb hausman} + {cmd:hausman_set}{it:#}{cmd:_df} + {cmd:hausman_set}{it:#}{cmd:_p} + + {cmd:suest_set}{it:#}{cmd:_chi2} Hausman IIA tests using {helpb suest} + {cmd:suest_set}{it:#}{cmd:_df} + {cmd:suest_set}{it:#}{cmd:_p} + + {cmd:smhsiao_set}{it:#}{cmd:_chi2} Small-Hsiao IIA tests + {cmd:smhsiao_set}{it:#}{cmd:_df} + {cmd:smhsiao_set}{it:#}{cmd:_p} + + {cmd:combine_}{it:#1}{cmd:_}{it:#2}{cmd:_chi2} Wald tests for combination of outcomes + {cmd:combine_}{it:#1}{cmd:_}{it:#2}{cmd:_df} + {cmd:combine_}{it:#1}{cmd:_}{it:#2}{cmd:_p} + + {cmd:lrcomb_}{it:#1}{cmd:_}{it:#2}{cmd:_chi2} LR tests for combination of outcomes + {cmd:lrcomb_}{it:#1}{cmd:_}{it:#2}{cmd:_df} + {cmd:lrcomb_}{it:#1}{cmd:_}{it:#2}{cmd:_p} + + {cmd:wald_set}{it:#}{cmd:_chi2} Wald tests for sets of independent + {cmd:wald_set}{it:#}{cmd:_df} variables + {cmd:wald_set}{it:#}{cmd:_p} + + {cmd:lrtest_set}{it:#}{cmd:_chi2} LR tests for sets of independent + {cmd:lrtest_set}{it:#}{cmd:_df} variables + {cmd:lrtest_set}{it:#}{cmd:_p} + + Matrices + {cmd:wald} Wald tests for individual variables + (rows: chi2, df, p) + {cmd:lrtest} LR tests for individual variables + (rows: chi2, df, p) + {hline 60} + +{p 4 4 2}To address the rows of {cmd:e(wald)} and {cmd:e(lrtest)} in {helpb estout}'s +{cmd:cells()} option type the row names in brackets, for example, {cmd:wald[p]} or +{cmd:lrtest[chi2]}. + +{marker prchange} +{p 4 8 2} +{cmd:estadd prchange} [{it:varlist}] [{cmd:if} {it:exp}] [{cmd:in} {it:range}] [{cmd:,} + {cmdab:pa:ttern(}{it:typepattern}{cmd:)} {cmdab:b:inary(}{it:type}{cmd:)} {cmdab:c:ontinuous(}{it:type}{cmd:)} + [{cmd:no}]{cmdab:a:vg} {cmd:split}[{cmd:(}{it:prefix}{cmd:)}] {it:{help prchange:prchange_options}} ] + +{p 8 8 2} +applies {helpb prchange} from Long and +Freese's {helpb SPost} package and adds the returned results to +{cmd:e()}. You may specify {it:prchange_options} as described in +help {helpb prchange}. In particular, the {cmd:outcome()} option may be +used with models for count, ordered, or nominal outcomes +to request results for a specific outcome. Further options are: + +{p 8 12 2}{cmd:pattern(}{it:typepattern}{cmd:)}, {cmd:binary(}{it:type}{cmd:)}, and +{cmd:continuous(}{it:type}{cmd:)} to determine which types of discrete change +effects are added as the main results. The default is to add the 0 to 1 +change effect for binary variables and the standard deviation change effect +for continuous variables. Use {cmd:binary(}{it:type}{cmd:)} and +{cmd:continuous(}{it:type}{cmd:)} to change these defaults. Available +types are: + + {it:type} Description + {hline 48} + {cmdab:mi:nmax} minimum to maximum change effect + {cmdab:0:1} 0 to 1 change effect + {cmdab:d:elta} {cmd:delta()} change effect + {cmdab:s:d} standard deviation change effect + {cmdab:m:argefct} marginal effect (some models only) + {hline 48} + +{p 12 12 2}Use {cmd:pattern(}{it:typepattern}{cmd:)} if you want to determine the +type of the added effects individually for each regressor. For example, +{bind:{cmd:pattern(minmax sd delta)}} would add {cmd:minmax} for the first regressor, +{cmd:sd} for the second, and {cmd:delta} for the third, and then proceed +using the defaults for the remaining variables. + +{p 8 12 2}{cmd:avg} to request that only the average results over +all outcomes are added if applied to ordered +or nominal models ({helpb ologit}, {helpb oprobit}, {helpb slogit}, {helpb mlogit}, {helpb mprobit}). The +default is to add the average results as well as the individual results for +the different outcomes (unless {helpb prchange}'s {cmd:outcome()} option is +specified, in which case only results for the indicated outcome are +added). Furthermore, specify {cmd:noavg} to suppress the average results +and only add the outcome-specific results. {cmd:avg} cannot be combined with {cmd:split} +or {cmd:outcome()}. + +{p 8 12 2}{cmd:split}[{cmd:(}{it:prefix}{cmd:)}] to save +each outcome's results in a separate estimation set if applied to ordered +or nominal models ({helpb ologit}, {helpb oprobit}, {helpb slogit}, {helpb mlogit}, +{helpb mprobit}). The estimation sets are named +{it:prefix}{it:#}, where {it:#} is the value of the outcome at hand. If no +{it:prefix} is provided, the name of the estimation set followed by an +underscore is used as the prefix. If the estimation set has no name +(because it has not been stored yet) the name of the estimation command +followed by an underscore is used as the prefix (e.g. {cmd:ologit_}). The +estimation sets stored by the {cmd:split} option are intended for +tabulation only and should not be used with other post-estimation +commands. + +{p 8 8 2}Depending on model and options, several of the following matrices +and scalars are added: + + {cmd:e(}{it:...}{cmd:)} Contents + {hline 60} + Scalars + {cmd:centered} {cmd:1} if effects are centered, {cmd:0} else + {cmd:delta} Value of {cmd:delta()} + {cmd:predval}[{it:#}] Prediction(s) at the base values + {cmd:outcome} Outcome value ({cmd:outcome()}/{cmd:split} only) + + Matrices + {cmd:dc} Discrete change effects (rows: main, minmax, + 01, delta, sd [, margefct]) + {cmd:pattern} Types of effects in the main row of {cmd:e(dc)} + {cmd:X} Base values and descriptive statistics + (rows: X, SD, Min, Max) + {hline 60} + +{p 8 8 2}The {cmd:e(dc)} and {cmd:e(X)} matrices have multiple rows. The +{cmd:e(dc)} matrix contains the main results as determined by +{cmd:pattern()}, {cmd:binary()}, and {cmd:continuous()} in the first row. +The second and following rows contain the separate results for each type of +effect using the labels provided by {cmd:prchange} as row names. Type +{cmd:dc[}{it:#}{cmd:]} or {cmd:dc[}{it:rowname}{cmd:]} to address the rows +in {helpb estout}'s {cmd:cells()} option, where {it:#} is the row number +or {it:rowname} is the +row name. For example, type {cmd:dc[-+sd/2]} to address the centered +standard deviation change effects. To tabulate the main results (1st row), +simply type {cmd:dc}. {cmd:e(pattern)} indicates the types of effects +contained in the main row of {cmd:e(dc)} using numeric codes. The codes are 1 +for the minimum to maximum change effect, 2 for the 0 to 1 change effect, 3 +for the {cmd:delta()} change effect, 4 for the standard deviation change +effect, and 5 for the marginal effect. {cmd:e(X)} has four rows +containing the base values, standard deviations, minimums, and maximums. If +the {cmd:fromto} option is specified, two additional matrices, +{cmd:e(dcfrom)} and {cmd:e(dcto)} are added. + +{marker prvalue} +{p 4 8 2} +{cmd:estadd prvalue} [{cmd:if} {it:exp}] [{cmd:in} {it:range}] [{cmd:,} {cmdab:lab:el:(}{it:string}{cmd:)} +{it:{help prvalue:prvalue_options}} ] + +{p 4 8 2} +{cmd:estadd prvalue} {cmd:post} [{it:name}] [{cmd:,} {cmdab:t:itle:(}{it:string}{cmd:)} {cmd:swap} ] + +{p 8 8 2} applies {helpb prvalue} from Long and Freese's {helpb SPost} +package and adds the returned results to {cmd:e()}. The procedure is to +first collect a series of predictions by repeated calls to +{cmd:estadd prvalue} and then apply {cmd:estadd prvalue post} to prepare the results +for tabulation as in the following example: + + {com}. logit lfp k5 k618 age wc hc lwg inc + . estadd prvalue, x(inc 10) label(low inc) + . estadd prvalue, x(inc 20) label(med inc) + . estadd prvalue, x(inc 30) label(high inc) + . estadd prvalue post + . estout{txt} + +{p 8 8 2} You may specify {it:prvalue_options} with {cmd:estadd prvalue} as +described in help {helpb prvalue}. For example, use {cmd:x()} and +{cmd:rest()} to set the values of the independent variables. Use +{cmd:label()} to label the single calls. "pred#" is used as label if +{cmd:label()} is omitted, where # is the number of the call. Labels may +contain spaces but they will be trimmed to a maximum +length of 30 characters and some characters ({cmd::}, +{cmd:.}, {cmd:"}) will be replaced by underscore. The results +from the single calls are collected in matrix {cmd:e(_estadd_prvalue)} +(predictions) and matrix {cmd:e(_estadd_prvalue_x)} (x-values). Specify +{cmd:replace} to drop results from previous calls. + +{p 8 8 2} +{cmd:estadd prvalue post} posts the collected predictions in {cmd:e(b)} +so that they can be tabulated. The following results are saved: + + {cmd:e(}{it:...}{cmd:)} Contents + {hline 60} + Scalars + {cmd:N} number of observations + + Macros + {cmd:depvar} name of dependent variable + {cmd:cmd} {cmd:estadd_prvalue} + {cmd:model} model estimation command + {cmd:properties} {cmd:b} + + Matrices + {cmd:b} predictions + {cmd:se} standard errors + {cmd:LB} lower confidence interval bounds + {cmd:UB} upper confidence interval bounds + {cmd:Category} outcome values + {cmd:Cond} conditional predictions (some models only) + {cmd:X} values of predictors (for each prediction) + {cmd:X2} second equation predictors (some models only) + {hline 60} + +{p 8 8 2} {cmd:estadd prvalue post} replaces the current model unless +{it:name} is specified, in which case the results are stored under {it:name} and the model +remains active. However, if the model has a name +(because it has been stored), the name of the model is used as a prefix. +If, for example, the model has been stored as {cmd:model1}, then +{cmd:estadd prvalue post} stores its results under {cmd:model1}{it:name}. +Use {cmd:title()} to specify a title for the stored results. + +{p 8 8 2}The default for {cmd:estadd prvalue post} is to arrange +{cmd:e(b)} in a way so that predictions are grouped by outcome (i.e. outcome labels are used +as equations). Alternatively, specify {cmd:swap} to group predictions by +{cmd:prvalue} calls (i.e. to use the prediction labels as equations). + +{p 8 8 2}{cmd:e(X)} contains one row for each independent variable. To address the rows in +{helpb estout}'s {cmd:cells()} option type {cmd:X[}{it:varname}{cmd:]}, where {it:varname} is +the name of the variable of interest. {cmd:e(X2)}, if provided, is analogous to {cmd:e(X)}. + +{marker asprvalue} +{p 4 8 2} +{cmd:estadd asprvalue} [{cmd:,} {cmdab:lab:el:(}{it:string}{cmd:)} +{it:{help asprvalue:asprvalue_options}} ] + +{p 4 8 2} +{cmd:estadd asprvalue} {cmd:post} [{it:name}] [{cmd:,} {cmdab:t:itle:(}{it:string}{cmd:)} {cmd:swap} ] + +{p 8 8 2} applies {helpb asprvalue} from Long and Freese's {helpb SPost} +package and adds the returned results to {cmd:e()}. The procedure is to +first collect a series of predictions by repeated calls to +{cmd:estadd asprvalue} and then apply {cmd:estadd asprvalue post} to prepare the results +for tabulation as in the following example: + + {com}. clogit choice train bus time invc, group(id) + . estadd asprvalue, cat(train bus) label(at means) + . estadd asprvalue, cat(train bus) rest(asmean) label(at asmeans) + . estadd asprvalue post + . estout{txt} + +{p 8 8 2} You may specify {it:asprvalue_options} with {cmd:estadd asprvalue} as +described in help {helpb asprvalue}. For example, use {cmd:x()} and +{cmd:rest()} to set the values of the independent variables. Use +{cmd:label()} to label the single calls. "pred#" is used as label if +{cmd:label()} is omitted, where # is the number of the call. Labels may +contain spaces but they will be trimmed to a maximum +length of 30 characters and some characters ({cmd::}, +{cmd:.}, {cmd:"}) will be replaced by underscore. The results +from the single calls are collected in matrices {cmd:e(_estadd_asprval)} +(predictions), {cmd:e(_estadd_asprval_asv)} (values of alternative-specific +variables), and {cmd:e(_estadd_asprval_csv)} (values of case-specific +variables). Specify {cmd:replace} to drop results from previous calls. + +{p 8 8 2} +{cmd:estadd asprvalue post} posts the collected predictions in {cmd:e(b)} +so that they can be tabulated. The following results are saved: + + {cmd:e(}{it:...}{cmd:)} Contents + {hline 60} + Scalars + {cmd:N} number of observations + + Macros + {cmd:depvar} name of dependent variable + {cmd:cmd} {cmd:estadd_asprvalue} + {cmd:model} model estimation command + {cmd:properties} {cmd:b} + + Matrices + {cmd:b} predictions + {cmd:asv} alternative-specific variables (if available) + {cmd:csv} case-specific variables (if available) + {hline 60} + +{p 8 8 2} {cmd:estadd asprvalue post} replaces the current model unless +{it:name} is specified, in which case the results are stored under +{it:name} and the model remains active. However, if the model has a name +(because it has been stored), the name of the model is used as a prefix. +If, for example, the model has been stored as {cmd:model1}, then +{cmd:estadd asprvalue post} stores its results under {cmd:model1}{it:name}. +Use {cmd:title()} to specify a title for the stored results. + +{p 8 8 2}The default for {cmd:estadd asprvalue post} is to arrange +{cmd:e(b)} in a way so that predictions are grouped by outcome (i.e. outcome labels are used +as equations). Alternatively, specify {cmd:swap} to group predictions by +{cmd:prvalue} calls (i.e. to use the prediction labels as equations). + +{p 8 8 2}{cmd:e(asv)} and {cmd:e(csv)} contain one row for each variable. +To address the rows in {helpb estout}'s {cmd:cells()} option type +{cmd:asv[}{it:varname}{cmd:]} or {cmd:csv[}{it:varname}{cmd:]}, where +{it:varname} is the name of the variable of interest. + +{marker options} +{title:Options} + +{p 4 8 2} +{cmd:replace} permits {cmd:estadd} to overwrite existing {cmd:e()} +macros, scalars, or matrices. + +{p 4 8 2} +{cmd:prefix(}{it:string}{cmd:)} denotes a prefix for the names of the +added results. The default prefix is an empty string. For example, if +{cmd:prefix(}{it:string}{cmd:)} is specified, the {cmd:beta} +subcommand will return the matrix {cmd:e(}{it:string}{cmd:beta)}. + +{p 4 8 2}{cmd:quietly} suppresses the output from the called subcommand and displays only +the list of added results. Note that many of {cmd:estadd}'s subcommands do not generate +output, in which case {cmd:quietly} has no effect. + +{p 4 8 2} +{it:subcmdopts} are subcommand specific options. See the descriptions +of the subcommands above. + +{marker examples} +{title:Examples} + +{p 4 4 2}Example 1: Add {cmd:r()}-returns from other programs to the +current estimates + + {com}. sysuse auto + {txt}(1978 Automobile Data) + + {com}. quietly regress price mpg weight + {txt} + {com}. test mpg=weight + + {txt} ( 1) {res}mpg - weight = 0 + + {txt} F( 1, 71) ={res} 0.36 + {txt}{col 13}Prob > F ={res} 0.5514 + {txt} + {com}. estadd scalar p_diff = r(p) + + {txt}added scalar: + e(p_diff) = {res}.55138216 + {txt} + {com}. estout, stats(p_diff) + {res} + {txt}{hline 25} + {txt} b + {txt}{hline 25} + {txt}mpg {res} -49.51222{txt} + {txt}weight {res} 1.746559{txt} + {txt}_cons {res} 1946.069{txt} + {txt}{hline 25} + {txt}p_diff {res} .5513822{txt} + {txt}{hline 25} + + +{p 4 4 2}Example 2: Add means and standard deviations of the model's regressors +to the current estimates + + {com}. quietly logit foreign price mpg + {txt} + {com}. estadd summ, mean sd + + {txt}added matrices: + e(sd) : {res}1 x 3 + {txt}e(mean) : {res}1 x 3 + {txt} + {com}. estout, cells("mean sd") drop(_cons) + {res} + {txt}{hline 38} + {txt} mean sd + {txt}{hline 38} + {txt}price {res} 6165.257 2949.496{txt} + {txt}mpg {res} 21.2973 5.785503{txt} + {txt}{hline 38} + + +{p 4 4 2} +Example 3: Add standardized beta coefficients to stored estimates + + {com}. eststo: quietly regress price mpg + {txt}({res}est1{txt} stored) + + {com}. eststo: quietly regress price mpg foreign + {txt}({res}est2{txt} stored) + + {com}. estadd beta: * + {txt} + {com}. estout, cells(beta) drop(_cons) + {res} + {txt}{hline 38} + {txt} est1 est2 + {txt} beta beta + {txt}{hline 38} + {txt}mpg {res} -.4685967 -.5770712{txt} + {txt}foreign {res} .2757378{txt} + {txt}{hline 38} + + +{p 4 4 2}See +{browse "http://repec.sowi.unibe.ch/stata/estout/"} +for additional examples. + + +{title:Writing one's own subcommands} + +{p 4 4 2} +A program providing a new {cmd:estadd} subcommand should be called +{cmd:estadd_}{it:mysubcommand} (see help {helpb program} for advice +on defining programs). {it:mysubcommand} will be available to {cmd:estadd} as a new +{it:subcommand} after the program definition has been executed or +saved to a file called "estadd_{it:mysubcommand}.ado" in either the +current directory or somewhere else in the {cmd:adopath} +(see help {helpb sysdir}). + +{p 4 4 2} +Use the subcommands provided within "estadd.ado" as a starting +point for writing new subcommands. See +{browse "http://repec.sowi.unibe.ch/stata/estout/estadd.html#007"} +for an example. + + +{title:Author} + +{p 4 4 2} Ben Jann, Institute of Sociology, University of Bern, jann@soz.unibe.ch + + +{title:Also see} + + Manual: {hi:[R] estimates} + +{p 4 13 2}Online: help for + {helpb estimates}, + {helpb ereturn}, + {helpb program}, + {helpb esttab}, + {helpb estout}, + {helpb eststo}, + {helpb estpost} +{p_end} diff --git a/data/ado/e/estout.ado b/data/ado/e/estout.ado new file mode 100644 index 0000000..2f0743c --- /dev/null +++ b/data/ado/e/estout.ado @@ -0,0 +1,4959 @@ +*! version 3.31 26apr2022 Ben Jann + +program define estout, rclass + version 8.2 + return local cmdline estout `macval(0)' + syntax [anything] [using] [ , /// + Cells(string asis) /// + Drop(string asis) /// + Keep(string asis) /// + Order(string asis) /// + REName(passthru) /// + Indicate(string asis) /// + TRansform(string asis) /// + EQuations(passthru) /// + EFORM2(string) /// + Margin2(string) /// + DIscrete(string asis) /// + MEQs(string) /// + DROPPED2(string) /// + level(numlist max=1 int >=10 <=99) /// + Stats(string asis) /// + STARLevels(string asis) /// + STARKeep(string asis) /// + STARDrop(string asis) /// + VARwidth(numlist max=1 int >=0) /// + MODELwidth(numlist int >=0) /// + EXTRAcols(numlist sort) /// + BEGin(string asis) /// + DELimiter(string asis) /// + INCELLdelimiter(string asis) /// + end(string asis) /// + DMarker(string) /// + MSign(string) /// + SUBstitute(string asis) /// + INTERACTion(string asis) /// + TItle(string) /// + note(string) /// + PREHead(string asis) /// + POSTHead(string asis) /// + PREFoot(string asis) /// + POSTFoot(string asis) /// + HLinechar(string) /// + VARLabels(string asis) /// + REFcat(string asis) /// + MLabels(string asis) /// + NUMbers2(string asis) /// + COLLabels(string asis) /// + EQLabels(string asis) /// + MGRoups(string asis) /// + LABCOL2(string asis) /// + TOPfile(string) /// + BOTtomfile(string) /// + STYle(string) /// + DEFaults(string) /// + * /// + ] + MoreOptions, `options' + if "`style'"!="" local defaults "`style'" + +*Matrix mode + tempname B + MatrixMode, `anything' `rename' // resets the cells argument + // and returns r(coefs) etc. and local 'matrixmode' + if (`matrixmode'==1) { + local models `r(names)' + local nmodels = r(nmodels) + local ccols = r(ccols) + if `ccols'>0 { + mat `B' = r(coefs) + } + } + +*Parse suboptions + local elnum 0 + if `"`cells'"'!="none" { + gettoken row rest: cells, bind match(par) qed(qed) + if `"`par'"'=="(" local qed 1 + local cells + while `"`row'"'!="" { + local newrow + gettoken opt row: row, parse(" ([&") + if `"`macval(row)'"'=="" & `qed'==0 { + local row0 + gettoken trash: rest, parse("[") + if `"`trash'"'=="[" { + gettoken trash rest: rest, parse("[") + gettoken mrow rest: rest, parse("]") q + gettoken trash rest: rest, parse("]") + if `"`trash'"'!="]" { + error 198 + } + } + gettoken trash: rest, match(par) + if `"`par'"'=="(" { + gettoken opt2 rest: rest, match(par) + } + else local opt2 + } + else { + gettoken trash: row, parse("[") + if `"`trash'"'=="[" { + gettoken trash row: row, parse("[") + gettoken mrow row: row, parse("]") q + gettoken trash row: row, parse("]") + if `"`trash'"'!="]" { + error 198 + } + } + gettoken trash row0: row, match(par) + gettoken opt2: row, match(par) + } + while "`opt'"!="" { + if "`opt'"!="&" & "`opt'"!="." { + local `opt'_tname "el`++elnum'" + local ``opt'_tname'_ "`opt'" + local newrow `"`newrow' ``opt'_tname'"' + if `"`par'"'!="(" local opt2 + ParseValueSubopts ``opt'_tname' `opt', mrow(`mrow') `macval(opt2)' + local mrow + } + else { + if `"`par'"'=="(" | `"`mrow'"'!="" error 198 + local newrow `"`newrow' `opt'"' + } + if `"`par'"'!="(" { + gettoken opt row: row, parse(" ([&") + } + else { + gettoken opt row: row0, parse(" ([&") + } + gettoken trash: row, parse("[") + if `"`trash'"'=="[" { + gettoken trash row: row, parse("[") + gettoken mrow row: row, parse("]") q + gettoken trash row: row, parse("]") + if `"`trash'"'!="]" { + error 198 + } + } + gettoken trash row0: row, match(par) + gettoken opt2: row, match(par) + } + local newrow: list retok newrow + if `qed' local cells `"`cells'"`newrow'" "' + else local cells `"`cells'`newrow' "' + gettoken row rest: rest, bind match(par) qed(qed) + if `"`par'"'=="(" local qed 1 + } + local cells: list retok cells + } + if "`eform2'"!="" { + local eform "`eform2'" + local eform2 + } + if `"`transform'"'!="" { + ParseTransformSubopts `transform' + } + if "`margin2'"!="" { + local margin "`margin2'" + local margin2 + } + if `"`dropped'"'!="" local dropped "(dropped)" + if `"`macval(dropped2)'"'!="" { + local dropped `"`macval(dropped2)'"' + local dropped2 + } + if `"`macval(stats)'"'!="" { + ParseStatsSubopts `macval(stats)' + if `"`macval(statslabels)'"'!="" { + if trim(`"`statslabels'"')=="none" { + local statslabelsnone none + local statslabels + } + else { + ParseLabelsSubopts statslabels `macval(statslabels)' + } + } + } + foreach opt in mgroups mlabels eqlabels collabels varlabels { + if `"`macval(`opt')'"'!="" { + if trim(`"``opt''"')=="none" { + local `opt'none none + local `opt' + } + else { + ParseLabelsSubopts `opt' `macval(`opt')' + } + } + } + if `"`macval(numbers2)'"'!="" { + local numbers `"`macval(numbers2)'"' + local numbers2 + } + if `"`macval(indicate)'"'!="" { + ParseIndicateOpts `macval(indicate)' + } + if `"`macval(refcat)'"'!="" { + ParseRefcatOpts `macval(refcat)' + } + if `"`macval(starlevels)'"'!="" { + ParseStarlevels `macval(starlevels)' + } + if `"`macval(labcol2)'"'!="" { + ParseLabCol2 `macval(labcol2)' + } + +*Process No-Options + foreach opt in unstack eform margin dropped discrete stardetach wrap /// + legend label refcatlabel numbers lz abbrev replace append type showtabs /// + smcltags smclrules smclmidrules smcleqrules asis outfilenoteoff /// + omitted baselevels rtfencode { + if "`no`opt''"!="" local `opt' + } + +*Defaults + if "`defaults'"=="esttab" local defaults "tab" + if "`defaults'"=="" & `"`using'"'=="" local defaults "smcl" + if inlist("`defaults'", "", "smcl", "tab", "fixed", "tex", "html","mmd") { + local varwidthfactor = (1 + ("`eqlabelsmerge'"!="" & "`unstack'"=="")*.5) + if inlist("`defaults'", "", "tab") { + if `"`macval(delimiter)'"'=="" local delimiter _tab + if `"`macval(interaction)'"'=="" local interaction `"" # ""' + } + else if "`defaults'"=="smcl" { + if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor' + if "`modelwidth'"=="" local modelwidth 12 + if "`noabbrev'"=="" local abbrev abbrev + if `"`macval(delimiter)'"'=="" local delimiter `"" ""' + if "`nosmcltags'"=="" local smcltags smcltags + if "`nosmclrules'"=="" local smclrules smclrules + if "`asis'"=="" local noasis noasis + if `"`macval(interaction)'"'=="" local interaction `"" # ""' + } + else if "`defaults'"=="fixed" { + if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor' + if "`modelwidth'"=="" local modelwidth 12 + if "`noabbrev'"=="" local abbrev abbrev + if `"`macval(delimiter)'"'=="" local delimiter `"" ""' + if `"`macval(interaction)'"'=="" local interaction `"" # ""' + } + else if "`defaults'"=="tex" { + if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor' + if "`modelwidth'"=="" local modelwidth 12 + if `"`macval(delimiter)'"'=="" local delimiter & + if `"`macval(end)'"'=="" { + local end \\\ + } + if `"`macval(interaction)'"'=="" local interaction `"" $\times$ ""' + } + else if "`defaults'"=="html" { + if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor' + if "`modelwidth'"=="" local modelwidth 12 + if `"`macval(begin)'"'=="" local begin + if `"`macval(delimiter)'"'=="" local delimiter + if `"`macval(end)'"'=="" local end + if `"`macval(interaction)'"'=="" local interaction `"" # ""' + } + else if "`defaults'"=="mmd" { + if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor' + if "`modelwidth'"=="" local modelwidth 12 + if `"`macval(begin)'"'=="" local begin "| " + if `"`macval(delimiter)'"'=="" local delimiter " | " + if `"`macval(end)'"'=="" local end " |" + if `"`macval(interaction)'"'=="" local interaction `"" # ""' + } + if "`nostatslabelsfirst'"=="" local statslabelsfirst first + if "`nostatslabelslast'"=="" local statslabelslast last + if "`novarlabelsfirst'"=="" local varlabelsfirst first + if "`novarlabelslast'"=="" local varlabelslast last + if "`noeqlabelsfirst'"=="" local eqlabelsfirst first + if "`noeqlabelslast'"=="" local eqlabelslast last + if "`nolz'"=="" local lz lz + if `"`macval(discrete)'"'=="" & "`nodiscrete'"=="" { + local discrete `"" (d)" for discrete change of dummy variable from 0 to 1"' + } + if `"`macval(indicatelabels)'"'=="" local indicatelabels "Yes No" + if `"`macval(refcatlabel)'"'=="" & "`norefcatlabel'"=="" local refcatlabel "ref." + if `"`macval(incelldelimiter)'"'=="" local incelldelimiter " " + if "`noomitted'"=="" local omitted omitted + if "`nobaselevels'"=="" local baselevels baselevels + } + else { + capture findfile estout_`defaults'.def + if _rc { + di as error `"`defaults' style not available "' /// + `"(file estout_`defaults'.def not found)"' + exit 601 + } + else { + tempname file + file open `file' using `"`r(fn)'"', read text + if c(SE) local max 244 + else local max 80 + while 1 { + ReadLine `max' `file' + if `"`line'"'=="" continue, break + gettoken opt line: line + else if index(`"`opt'"',"_") { + gettoken opt0 opt1: opt, parse("_") + if `"``opt0'_tname'"'!="" { + local opt `"``opt0'_tname'`opt1'"' + } + } + if `"`macval(`opt')'"'=="" & `"`no`opt''"'=="" { + if `"`opt'"'=="cells" { + local newline + gettoken row rest: line, match(par) qed(qed) + if `"`par'"'=="(" local qed 1 + while `"`row'"'!="" { + local newrow + gettoken el row: row, parse(" &") + while `"`el'"'!="" { + if `"`el'"'!="." & `"`el'"'!="&" { + local `el'_tname "el`++elnum'" + local ``el'_tname'_ "`el'" + local newrow "`newrow' ``el'_tname'" + } + else { + local newrow "`newrow' `el'" + } + gettoken el row: row, parse(" &") + } + local newrow: list retok newrow + if `qed' local newline `"`newline'"`newrow'" "' + else local newline `"`newline'`newrow' "' + gettoken row rest: rest, match(par) qed(qed) + if `"`par'"'=="(" local qed 1 + } + local line `"`newline'"' + } + local line: list retok line + local `opt' `"`macval(line)'"' + } + } + file close `file' + } + } + if "`notype'"=="" & `"`using'"'=="" local type type + if "`smcltags'"=="" & "`noasis'"=="" local asis asis + if "`asis'"!="" local asis "_asis" + if "`smclrules'"!="" & "`nosmclmidrules'"=="" local smclmidrules smclmidrules + if "`smclmidrules'"!="" & "`nosmcleqrules'"=="" local smcleqrules smcleqrules + local haslabcol2 = (`"`macval(labcol2)'"'!="") + +*title/notes option + if `"`macval(prehead)'`macval(posthead)'`macval(prefoot)'`macval(postfoot)'"'=="" { + if `"`macval(title)'"'!="" { + local prehead `"`"`macval(title)'"'"' + } + if `"`macval(note)'"'!="" { + local postfoot `"`"`macval(note)'"'"' + } + } + +*Generate/clean-up cell contents + if `"`:list clean cells'"'=="" { + local cells b + local b_tname "b" + local b_ "b" + } + else if `"`:list clean cells'"'=="none" { + local cells + } + CellsCheck `"`cells'"' + if `:list sizeof incelldelimiter'==1 gettoken incelldelimiter: incelldelimiter + +*Special treatment of confidence intervals + if "`level'"=="" local level $S_level + if `level'<10 | `level'>99 { + di as error "level(`level') invalid" + exit 198 + } + if "`ci_tname'"!="" { + if `"`macval(`ci_tname'_label)'"'=="" { + local `ci_tname'_label "ci`level'" + } + if `"`macval(`ci_tname'_par)'"'=="" { + local `ci_tname'_par `""" , """' + } + gettoken 1 2 : `ci_tname'_par + gettoken 2 3 : 2 + gettoken 3 : 3 + local `ci_tname'_l_par `""`macval(1)'" "`macval(2)'""' + local `ci_tname'_u_par `""" "`macval(3)'""' + } + if "`ci_l_tname'"!="" { + if `"`macval(`ci_l_tname'_label)'"'=="" { + local `ci_l_tname'_label "min`level'" + } + } + if "`ci_u_tname'"!="" { + if `"`macval(`ci_u_tname'_label)'"'=="" { + local `ci_u_tname'_label "max`level'" + } + } + +*Formats + local firstv: word 1 of `values' + if "`firstv'"=="" local firstv "b" + if "``firstv'_fmt'"=="" local `firstv'_fmt %9.0g + foreach v of local values { + if "``v'_fmt'"=="" local `v'_fmt "``firstv'_fmt'" + if `"`macval(`v'_label)'"'=="" { + local `v'_label "``v'_'" + } + } + +*Check margin option / prepare discrete option / prepare dropped option + if "`margin'"!="" { + if !inlist("`margin'","margin","u","c","p") { + di as error "margin(`margin') invalid" + exit 198 + } + if `"`macval(discrete)'"'!="" { + gettoken discrete discrete2: discrete + } + } + else local discrete + local droppedison = (`"`macval(dropped)'"'!="") + +*Formats/labels/stars for statistics + if "`statsfmt'"=="" local statsfmt: word 1 of ``firstv'_fmt' + ProcessStatslayout `"`stats'"' `"`statsfmt'"' `"`statsstar'"' /// + `"`statslayout'"' `"`statspchar'"' + local stats: list uniq stats + if "`statsstar'"!="" local p " p" + else local p + +*Significance stars + local tablehasstars 0 + foreach v of local values { + local el "``v'_'" + if "``v'_star'"!="" | inlist("`el'","_star","_sigsign") { + if "``v'_pvalue'"=="" local `v'_pvalue p + local tablehasstars 1 + } + } + +*Check/define starlevels/make levelslegend + if `tablehasstars' | `"`statsstar'"'!="" { + if `"`macval(starlevels)'"'=="" /// + local starlevels "* 0.05 ** 0.01 *** 0.001" + CheckStarvals `"`macval(starlevels)'"' `"`macval(starlevelslabel)'"' /// + `"`macval(starlevelsdelimiter)'"' + } + +*Get coefficients/variances/statistics: _estout_getres +* - prepare transform/eform + if `"`transform'"'=="" { // transform() overwrites eform() + if "`eform'"!="" { + local transform "exp(@) exp(@)" + if "`eform'"!="eform" { + local transformpattern "`eform'" + } + } + } + foreach m of local transformpattern { + if !( "`m'"=="1" | "`m'"=="0" ) { + di as error "invalid pattern in transform(,pattern()) or eform()" + exit 198 + } + } +* - handle pvalue() suboption + if `tablehasstars' { + local temp + foreach v of local values { + local temp: list temp | `v'_pvalue + } + foreach v of local temp { + if `"``v'_tname'"'=="" { + local `v'_tname "el`++elnum'" + local ``v'_tname'_ "`v'" + local values: list values | `v'_tname + } + } + } +* - prepare list of results to get from e()-matrices + if "`ci_tname'"!="" { + local values: subinstr local values "`ci_tname'" "`ci_tname'_l `ci_tname'_u", word + local `ci_tname'_l_ "ci_l" + local ci_l_tname "`ci_tname'_l" + local `ci_tname'_u_ ci_u + local ci_u_tname "`ci_tname'_u" + } + foreach v of local values { + local temp = ("``v'_transpose'"!="") + local values1mrow `"`values1mrow' `"``v'_' `temp' ``v'_mrow'"'"' + } + tempname D St + if `matrixmode'==0 { +* - expand model names + if `"`anything'"'=="" { + capt est_expand $eststo + if !_rc { + local anything `"$eststo"' + } + if `'"`anything'"'!="" { + if `"`: e(scalars)'`: e(macros)'`: e(matrices)'`: e(functions)'"'!="" { + local inlist: list posof `"`e(_estimates_name)'"' in anything + if `inlist'==0 { + di as txt "(tabulating estimates stored by eststo;" /// + `" specify "." to tabulate the active results)"' + } + } + } + } + if `"`anything'"'=="" local anything "." + capt est_expand `"`anything'"' + if _rc { + if _rc==301 { // add e(cmd)="." to current estimates if undefined + if `:list posof "." in anything' & `"`e(cmd)'"'=="" { + if `"`: e(scalars)'`: e(macros)'`: e(matrices)'`: e(functions)'"'!="" { + qui estadd local cmd "." + } + } + } + est_expand `"`anything'"' + } + local models `r(names)' + // could not happen, ... + if "`models'" == "" { + exit + } +* - get results + local temp names(`models') coefs(`values1mrow') stats(`stats'`p') /// + `rename' margin(`margin') meqs(`meqs') dropped(`droppedison') level(`level') /// + transform(`transform') transformpattern(`transformpattern') /// + `omitted' `baselevels' + _estout_getres, `equations' `temp' + local ccols = r(ccols) + if `"`equations'"'=="" & "`unstack'"=="" & `ccols'>0 { // specify equations("") to deactivate + TableIsAMess + if `value' { + _estout_getres, equations(main=1) `temp' + } + } + mat `St' = r(stats) + local nmodels = r(nmodels) + local ccols = r(ccols) + if `ccols'>0 { + mat `B' = r(coefs) + } + } + else { // matrix mode + // define `St' so that code does not break + if `"`stats'"'!="" { + mat `St' = J(`:list sizeof stats',1,.z) + mat coln `St' = `models' + mat rown `St' = `stats' + } + } + return add +* - process order() option + if `"`order'"' != "" { + ExpandEqVarlist `"`order'"' `B' append + local order `"`value'"' + Order `B' `"`order'"' + } +* - process indicate() option + local nindicate 0 + foreach indi of local indicate { + local ++nindicate + ProcessIndicateGrp `nindicate' `B' `nmodels' `ccols' "`unstack'" /// + `"`macval(indicatelabels)'"' `"`macval(indi)'"' + } +* - process keep() option + if `"`keep'"' != "" { + ExpandEqVarlist `"`keep'"' `B' + DropOrKeep 1 `B' `"`value'"' + } +* - process drop() option + if `"`drop'"' != "" { + ExpandEqVarlist `"`drop'"' `B' + DropOrKeep 0 `B' `"`value'"' + } + +* - names and equations of final set + capt confirm matrix `B' + if _rc { + return local coefs "" // erase r(coefs) + return local ccols "" + local R 0 + local varlist "" + local eqlist "" + local eqs "__" + local fullvarlist "" + } + else { + tempname C + matrix `C' = `B' + RestoreEmptyEqnames `C' // replace equation name "__" by "_" + return matrix coefs = `C' // replace r(coefs) + local R = rowsof(`B') + local C = colsof(`B') + local eqlist: roweq `B', q + local eqlist: list clean eqlist + UniqEqsAndDims `"`eqlist'"' + if "`unstack'"!="" { + // unstack requires equations to be tied together + // RerrangeEqs resets B, eqlist, eqs, eqsdims + RerrangeEqs `B' `"`eqlist'"' `"`eqs'"' + } + QuotedRowNames `B' + local varlist `"`value'"' + MakeQuotedFullnames `"`varlist'"' `"`eqlist'"' + local fullvarlist `"`value'"' +* - dropped coefs + local droppedpos = `ccols' + if "`margin'"!="" { + local droppedpos `droppedpos' - 1 + } +* - 0/1-variable indicators (for marginals) + mat `D' = `B'[1...,1], J(`R',1,0) // so that row names are copied from `B' + mat `D' = `D'[1...,2] + if "`margin'"!="" { + forv i = 1/`R' { // last colum for each model contains _dummy info + forv j = `ccols'(`ccols')`C' { + if `B'[`i',`j']==1 { + mat `D'[`i',1] = 1 + } + } + } + } + } + +*Prepare element specific keep/drop + local dash + tempname tmpmat + foreach v in star `values' { + local temp `"`fullvarlist'"' + if "`unstack'"!="" { + local temp2: list uniq eqs + local `v'`dash'eqdrop: list uniq eqs + } + if `"``v'`dash'keep'"'!="" { + capt mat `tmpmat' = `B' + ExpandEqVarlist `"``v'`dash'keep'"' `tmpmat' + DropOrKeep 1 `tmpmat' `"`value'"' + capt confirm matrix `tmpmat' + if _rc local temp + else { + QuotedRowNames `tmpmat' + MakeQuotedFullnames `"`value'"' `"`: roweq `tmpmat', q'"' + local temp: list temp & value + if "`unstack'"!="" { + local value: roweq `tmpmat', q + local value: list uniq value + local temp2: list temp2 & value + } + } + } + if `"``v'`dash'drop'"'!="" { + capt mat `tmpmat' = `B' + ExpandEqVarlist `"``v'`dash'drop'"' `tmpmat' + DropOrKeep 0 `tmpmat' `"`value'"' + capt confirm matrix `tmpmat' + if _rc local temp + else { + QuotedRowNames `tmpmat' + MakeQuotedFullnames `"`value'"' `"`: roweq `tmpmat', q'"' + local temp: list temp & value + if "`unstack'"!="" { + local value: roweq `tmpmat', q + local value: list uniq value + local temp2: list temp2 & value + } + } + } + local `v'`dash'drop: list fullvarlist - temp + if "`unstack'"!="" { + local `v'`dash'eqdrop: list `v'`dash'eqdrop - temp2 + } + local dash "_" + } + capt mat drop `tmpmat' + +*Prepare unstack + if "`unstack'"!="" & `R'>0 { + local varlist: list uniq varlist + GetVarnamesFromOrder `"`order'"' + local temp: list value & varlist + local varlist: list temp | varlist + local cons _cons + if `:list cons in value'==0 { + if `:list cons in varlist' { + local varlist: list varlist - cons + local varlist: list varlist | cons + } + } + local R: word count `varlist' + local eqswide: list uniq eqs + forv i=1/`nindicate' { + ReorderEqsInIndicate `"`nmodels'"' `"`eqswide'"' /// + `"`indicate`i'eqs'"' `"`macval(indicate`i'lbls)'"' + local indicate`i'lbls `"`macval(value)'"' + } + } + else local eqswide "__" + +*Prepare coefs for tabulation + if `R'>0 { + local i 0 + foreach v of local values { + local ++i + tempname _`v' + forv j = 1/`nmodels' { + mat `_`v'' = nullmat(`_`v''), `B'[1..., (`j'-1)*`ccols'+`i'] + } + mat coln `_`v'' = `models' + mat coleq `_`v'' = `models' + if inlist("``v'_'", "t", "z") { + if `"``v'_abs'"'!="" { // absolute t-values + forv r = 1/`R' { + forv j = 1/`nmodels' { + if `_`v''[`r',`j']>=. continue + mat `_`v''[`r',`j'] = abs(`_`v''[`r',`j']) + } + } + } + } + } + } + +*Model labels + if "`nomlabelstitles'"=="" & "`label'"!="" local mlabelstitles titles + local tmp: list sizeof mlabels + local i 0 + foreach model of local models { + local ++i + if `i'<=`tmp' continue + local lab + if "`mlabelsdepvars'"!="" { + local var `"`return(m`i'_depname)'"' + if "`label'"!="" { + local temp = index(`"`var'"',".") + local temp2 = substr(`"`var'"',`temp'+1,.) + capture local lab: var l `temp2' + if _rc | `"`lab'"'=="" { + local lab `"`temp2'"' + } + local temp2 = substr(`"`var'"',1,`temp') + local lab `"`temp2'`macval(lab)'"' + } + else local lab `"`var'"' + } + else if "`mlabelstitles'"!="" { + local lab `"`return(m`i'_estimates_title)'"' + if `"`lab'"'=="" local lab "`model'" + } + else { + local lab "`model'" + } + local mlabels `"`macval(mlabels)' `"`macval(lab)'"'"' + } + if "`mlabelsnumbers'"!="" { + NumberMlabels `nmodels' `"`macval(mlabels)'"' + } + +*Equations labels + local eqconssubok = (`"`macval(eqlabels)'"'!=`""""') + local numeqs: list sizeof eqs + local temp: list sizeof eqlabels + if `temp'<`numeqs' { + forv i = `=`temp'+1'/`numeqs' { + local eq: word `i' of `eqs' + local value + if "`label'"!="" { + capture confirm variable `eq' + if !_rc { + local value: var l `eq' + } + } + if `"`value'"'=="" { + if `"`eq'"'=="__" local value "_" + else local value "`eq'" + } + local eqlabels `"`macval(eqlabels)' `"`value'"'"' + } + } + if `eqconssubok' { + if "`eqlabelsnone'"!="" & `numeqs'>1 & "`unstack'"=="" { + EqReplaceCons `"`varlist'"' `"`eqlist'"' `"`eqlabels'"' `"`macval(varlabels)'"' + if `"`macval(value)'"'!="" { + local varlabels `"`macval(value)' `macval(varlabels)'"' + } + } + } + +*Column labels + if `"`macval(collabels)'"'=="" { + forv j = 1/`ncols' { + local temp + forv i = 1/`nrows' { + local v: word `i' of `cells' + local v: word `j' of `v' + local v: subinstr local v "&" " ", all + local v: subinstr local v "." "", all + local v: list retok v + foreach vi of local v { + if `"`macval(temp)'"'!="" { + local temp `"`macval(temp)'/"' + } + local temp `"`macval(temp)'`macval(`vi'_label)'"' + } + } + local collabels `"`macval(collabels)'`"`macval(temp)'"' "' + } + } + +*Prepare refcat() + if `"`macval(refcat)'"'!="" { + PrepareRefcat `"`macval(refcat)'"' + } + +*Determine table layout + local m 1 + local starcol 0 + foreach model of local models { + local e 0 + foreach eq of local eqswide { + local stc 0 + local ++e + if "`unstack'"!="" & `R'>0 { + ModelEqCheck `B' `"`eq'"' `m' `ccols' + if !`value' continue + } + local eqsrow "`eqsrow'`e' " + local modelsrow "`modelsrow'`m' " + local k 0 + local something 0 + forv j = 1/`ncols' { + local col + local nocol 1 + local colhasstats 0 + forv i = 1/`nrows' { + local row: word `i' of `cells' + local v: word `j' of `row' + local v: subinstr local v "&" " ", all + foreach vi in `v' { + if "`vi'"=="." continue + local colhasstats 1 + if "`unstack'"!="" { + local inlist: list posof `"`eq'"' in `vi'_eqdrop + if `inlist' continue + } + if "`:word `m' of ``vi'_pattern''"=="0" { + local v: subinstr local v "`vi'" ".`vi'", word + } + else { + local nocol 0 + if `"``vi'_star'"'!="" local starcol 1 + } + } + local v: subinstr local v " " "&", all + if "`v'"=="" local v "." + local col "`col'`v' " + } + if `colhasstats'==0 local nocol 0 + if !`nocol' { + local colsrow "`colsrow'`j' " + if `++k'>1 { + local modelsrow "`modelsrow'`m' " + local eqsrow "`eqsrow'`e' " + } + if `"`: word `++stc' of `statscolstar''"'=="1" local starcol 1 + local starsrow "`starsrow'`starcol' " + local starcol 0 + Add2Vblock `"`vblock'"' "`col'" + local something 1 + } + } + if !`something' { + local col + forv i = 1/`nrows' { + local col "`col'. " + } + Add2Vblock `"`vblock'"' "`col'" + local colsrow "`colsrow'1 " + if `"`: word `++stc' of `statscolstar''"'=="1" local starcol 1 + local starsrow "`starsrow'`starcol' " + local starcol 0 + } + } + local ++m + } + CountNofEqs "`modelsrow'" "`eqsrow'" + local neqs `value' + if `"`extracols'"'!="" { + foreach row in model eq col star { + InsertAtCols `"`extracols'"' `"``row'srow'"' + local `row'srow `"`value'"' + } + foreach row of local vblock { + InsertAtCols `"`extracols'"' `"`row'"' + local nvblock `"`nvblock' `"`value'"'"' + } + local vblock: list clean nvblock + } + local ncols = `: word count `starsrow'' + 1 + `haslabcol2' + +*Modelwidth/varwidth/starwidth + if "`modelwidth'"=="" local modelwidth 0 + if "`varwidth'"=="" local varwidth 0 + local nmodelwidth: list sizeof modelwidth + local modelwidthzero: list uniq modelwidth + local modelwidthzero = ("`modelwidth'"=="0") + if "`labcol2width'"=="" local labcol2width `: word 1 of `modelwidth'' + local starwidth 0 + if `modelwidthzero'==0 { + if `tablehasstars' | `"`statsstar'"'!="" { + Starwidth `"`macval(starlevels)'"' + local starwidth `value' + } + } + if `varwidth'<2 local wrap + +* totcharwidth / hline + local totcharwidth `varwidth' + if c(stata_version)>=14 local length udstrlen + else local length length + capture { + local delwidth = `length'(`macval(delimiter)') + } + if _rc { + local delwidth = `length'(`"`macval(delimiter)'"') + } + if `haslabcol2' { + local totcharwidth = `totcharwidth' + `delwidth' + `labcol2width' + } + local j 0 + foreach i of local starsrow { + local modelwidthj: word `=1 + mod(`j++',`nmodelwidth')' of `modelwidth' + local totcharwidth = `totcharwidth' + `delwidth' + `modelwidthj' + if `i' { + if "`stardetach'"!="" { + local ++ncols + local totcharwidth = `totcharwidth' + `delwidth' + } + local totcharwidth = `totcharwidth' + `starwidth' + } + } + IsInString "@hline" `"`0'"' // sets local strcount + if `strcount' { + local hline `totcharwidth' + if `hline'>400 local hline 400 // _dup(400) is limit + if `"`macval(hlinechar)'"'=="" local hlinechar "-" + local hline: di _dup(`hline') `"`macval(hlinechar)'"' + } + else local hline + +* check begin, delimiter, end + tempfile tfile + tempname file + file open `file' using `"`tfile'"', write text + foreach opt in begin delimiter end { + capture file write `file' `macval(`opt')' + if _rc { + local `opt' `"`"`macval(`opt')'"'"' + } + } + file close `file' + +* RTF support: set macros rtfrowdef, rtfrowdefbrdrt, rtfrowdefbrdrb, rtfemptyrow + local hasrtfbrdr 0 + local rtfbrdron 0 + IsInString "@rtfrowdef" `"`begin'"' // sets local strcount + local hasrtf = `strcount' + if `hasrtf' { + MakeRtfRowdefs `"`macval(begin)'"' `"`starsrow'"' "`stardetach'" /// + `varwidth' "`modelwidth'" `haslabcol2' `labcol2width' + local varwidth 0 + local wrap + local modelwidth 0 + local nmodelwidth 1 + local modelwidthzero 1 + local starwidth 0 + local labcol2width 0 + IsInString "@rtfrowdefbrdr" `"`begin'"' // sets local strcount + if `strcount' { + local hasrtfbrdr 1 + local rtfbeginbak `"`macval(begin)'"' + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdefbrdrt'"' + local rtfbrdron 1 + } + else { + StableSubinstr begin `"`macval(begin)'"' "@rtfrowdef" `"`rtfrowdef'"' + } + } + +* set widths + if `starwidth'>0 local fmt_stw "%-`starwidth's" + if `varwidth'>0 local fmt_v "%-`varwidth's" + if `labcol2width'>0 local fmt_l2 "%~`labcol2width's" + if "`mgroupsspan'`mlabelsspan'`eqlabelsspan'`collabelsspan'"!="" { + if `modelwidthzero'==0 { + file open `file' using `"`tfile'"', write text replace + file write `file' `macval(delimiter)' + file close `file' + file open `file' using `"`tfile'"', read text + file read `file' delwidth + file close `file' + local delwidth = `length'(`"`macval(delwidth)'"') + } + else local delwidth 0 + } + local stardetachon = ("`stardetach'"!="") + if `stardetachon' { + local stardetach `"`macval(delimiter)'"' + } + +*Prepare @-Variables + local atvars2 `""`nmodels'" "`neqs'" "`totcharwidth'" `"`macval(hline)'"' `hasrtf' `"`rtfrowdefbrdrt'"' `"`rtfrowdefbrdrb'"' `"`rtfrowdef'"' `"`rtfemptyrow'"'"' + local atvars3 `"`"`macval(title)'"' `"`macval(note)'"' `"`macval(discrete)'`macval(discrete2)'"' `"`macval(starlegend)'"'"' + +*Open output file + file open `file' using `"`tfile'"', write text replace + +*Write prehead + if `"`macval(prehead)'"'!="" { + if index(`"`macval(prehead)'"',`"""')==0 { + local prehead `"`"`macval(prehead)'"'"' + } + } + foreach line of local prehead { + if "`smcltags'"!="" file write `file' "{txt}" + InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)' + file write `file' `"`macval(value)'"' _n + } + local hasheader 0 + if "`smcltags'"!="" local thesmclrule "{txt}{hline `totcharwidth'}" + else local thesmclrule "{hline `totcharwidth'}" + if "`smclrules'"!="" { + file write `file' `"`thesmclrule'"' _n + } + +*Labcol2 - title + if `haslabcol2' { + IsInString `"""' `"`macval(labcol2title)'"' // sets local strcount + if `strcount'==0 { + local labcol2chunk `"`macval(labcol2title)'"' + local labcol2rest "" + } + else { + gettoken labcol2chunk labcol2rest : labcol2title + } + } + +*Write head: Models groups + if "`mgroupsnone'"=="" & `"`macval(mgroups)'"'!="" { + local hasheader 1 + if "`smcltags'"!="" file write `file' "{txt}" + InsertAtVariables `"`macval(mgroupsbegin)'"' 2 "`ncols'" `macval(atvars2)' + local mgroupsbegin `"`macval(value)'"' + InsertAtVariables `"`macval(mgroupsend)'"' 2 "`ncols'" `macval(atvars2)' + local mgroupsend `"`macval(value)'"' + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`mgroupsreplace'"!="" { + if `"`macval(mgroupsbegin)'"'!="" local tmpbegin + if `"`macval(mgroupsend)'"'!="" local tmpend + } + MgroupsPattern "`modelsrow'" "`mgroupspattern'" + Abbrev `varwidth' `"`macval(mgroupslhs)'"' "`abbrev'" + local value: di `fmt_v' `"`macval(value)'"' + WriteBegin `"`file'"' `"`macval(mgroupsbegin)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + WriteCaption `"`file'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`mgroupspattern'" "`mgroupspattern'" /// + `"`macval(mgroups)'"' "`starsrow'" "`mgroupsspan'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" /// + `"`macval(mgroupserepeat)'"' `"`macval(mgroupsprefix)'"' /// + `"`macval(mgroupssuffix)'"' "`haslabcol2'" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(mgroupsend)'"' /// + `"`"`macval(value)'"'"' + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + gettoken labcol2chunk labcol2rest : labcol2rest + } + +*Write head: Models numbers + if `"`macval(numbers)'"'!="" { + local hasheader 1 + if "`smcltags'"!="" file write `file' "{txt}" + if `"`macval(numbers)'"'=="numbers" local numbers "( )" + file write `file' `macval(begin)' `fmt_v' (`""') + if `haslabcol2' { + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + tokenize `"`macval(numbers)'"' + numlist `"1/`nmodels'"' + WriteCaption `"`file'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`modelsrow'" "`modelsrow'" /// + "`r(numlist)'" "`starsrow'" "`mlabelsspan'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" /// + `""' `"`macval(1)'"' `"`macval(2)'"' "`haslabcol2'" + file write `file' `macval(end)' _n + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + gettoken labcol2chunk labcol2rest : labcol2rest + } + +*Write head: Models captions + if "`nomlabelsnone'"=="" & "`models'"=="." & `"`macval(mlabels)'"'=="." local mlabelsnone "none" + if "`mlabelsnone'"=="" { + local hasheader 1 + if "`smcltags'"!="" file write `file' "{txt}" + InsertAtVariables `"`macval(mlabelsbegin)'"' 2 "`ncols'" `macval(atvars2)' + local mlabelsbegin `"`macval(value)'"' + InsertAtVariables `"`macval(mlabelsend)'"' 2 "`ncols'" `macval(atvars2)'' + local mlabelsend `"`macval(value)'"' + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`mlabelsreplace'"!="" { + if `"`macval(mlabelsbegin)'"'!="" local tmpbegin + if `"`macval(mlabelsend)'"'!="" local tmpend + } + Abbrev `varwidth' `"`macval(mlabelslhs)'"' "`abbrev'" + local value: di `fmt_v' `"`macval(value)'"' + WriteBegin `"`file'"' `"`macval(mlabelsbegin)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + WriteCaption `"`file'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`modelsrow'" "`modelsrow'" /// + `"`macval(mlabels)'"' "`starsrow'" "`mlabelsspan'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" /// + `"`macval(mlabelserepeat)'"' `"`macval(mlabelsprefix)'"' /// + `"`macval(mlabelssuffix)'"' "`haslabcol2'" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(mlabelsend)'"' /// + `"`"`macval(value)'"'"' + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + gettoken labcol2chunk labcol2rest : labcol2rest + } + +*Write head: Equations captions + if "`eqlabelsnone'"=="" { + InsertAtVariables `"`macval(eqlabelsbegin)'"' 2 "`ncols'" `macval(atvars2)' + local eqlabelsbegin `"`macval(value)'"' + InsertAtVariables `"`macval(eqlabelsend)'"' 2 "`ncols'" `macval(atvars2)' + local eqlabelsend `"`macval(value)'"' + } + if `"`eqswide'"'!="__" & "`eqlabelsnone'"=="" { + local hasheader 1 + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`eqlabelsreplace'"!="" { + if `"`macval(eqlabelsbegin)'"'!="" local tmpbegin + if `"`macval(eqlabelsend)'"'!="" local tmpend + } + if "`smcltags'"!="" file write `file' "{txt}" + Abbrev `varwidth' `"`macval(eqlabelslhs)'"' "`abbrev'" + local value: di `fmt_v' `"`macval(value)'"' + WriteBegin `"`file'"' `"`macval(eqlabelsbegin)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + WriteCaption `"`file'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`eqsrow'" "`modelsrow'" /// + `"`macval(eqlabels)'"' "`starsrow'" "`eqlabelsspan'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" /// + `"`macval(eqlabelserepeat)'"' `"`macval(eqlabelsprefix)'"' /// + `"`macval(eqlabelssuffix)'"' "`haslabcol2'" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(eqlabelsend)'"' /// + `"`"`macval(value)'"'"' + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + gettoken labcol2chunk labcol2rest : labcol2rest + } + +*Write head: Columns captions + if `"`macval(collabels)'"'!="" & "`collabelsnone'"=="" { + local hasheader 1 + if "`smcltags'"!="" file write `file' "{txt}" + InsertAtVariables `"`macval(collabelsbegin)'"' 2 "`ncols'" `macval(atvars2)' + local collabelsbegin `"`macval(value)'"' + InsertAtVariables `"`macval(collabelsend)'"' 2 "`ncols'" `macval(atvars2)' + local collabelsend `"`macval(value)'"' + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`collabelsreplace'"!="" { + if `"`macval(collabelsbegin)'"'!="" local tmpbegin + if `"`macval(collabelsend)'"'!="" local tmpend + } + Abbrev `varwidth' `"`macval(collabelslhs)'"' "`abbrev'" + local value: di `fmt_v' `"`macval(value)'"' + WriteBegin `"`file'"' `"`macval(collabelsbegin)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + WriteCaption `"`file'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`colsrow'" "" `"`macval(collabels)'"' /// + "`starsrow'" "`collabelsspan'" "`abbrev'" "`modelwidth'" /// + "`delwidth'" "`starwidth'" `"`macval(collabelserepeat)'"' /// + `"`macval(collabelsprefix)'"' `"`macval(collabelssuffix)'"' "`haslabcol2'" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(collabelsend)'"' /// + `"`"`macval(value)'"'"' + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + gettoken labcol2chunk labcol2rest : labcol2rest + } + +*Write posthead + if `hasheader' & "`smclmidrules'"!="" { + file write `file' `"`thesmclrule'"' _n + } + if `"`macval(posthead)'"'!="" { + if index(`"`macval(posthead)'"',`"""')==0 { + local posthead `"`"`macval(posthead)'"'"' + } + } + foreach line of local posthead { + if "`smcltags'"!="" file write `file' "{txt}" + InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)' + file write `file' `"`macval(value)'"' _n + } + +* Create mmd alignment/divider line + if `"`defaults'"'=="mmd" { + MakeMMDdef "`varwidth'" "`haslabcol2'" "`labcol2width'" /// + "`modelwidth'" "`starsrow'" "`stardetachon'" "`starwidth'" + file write `file' `"`macval(value)'"' _n + } + +*Write body of table +*Loop over table rows + InsertAtVariables `"`macval(varlabelsbegin)'"' 2 "`ncols'" `macval(atvars2)' + local varlabelsbegin `"`macval(value)'"' + InsertAtVariables `"`macval(varlabelsend)'"' 2 "`ncols'" `macval(atvars2)' + local varlabelsend `"`macval(value)'"' + tempname first + if `"`vblock'"'!="" { + local RI = `R' + `nindicate' + local e 0 + local eqdim = `R' + `nindicate' + local weqcnt 0 + local theeqlabel + if `hasrtfbrdr' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdefbrdrt'"' + local rtfbrdron 1 + } + local varlabelsbegin0 `"`macval(varlabelsbegin)'"' + local eqlabelsbegin0 `"`macval(eqlabelsbegin)'"' + if "`eqlabelsfirst'"=="" local eqlabelsbegin0 + forv r = 1/`R' { + local varlabelsend0 `"`macval(varlabelsend)'"' + local var: word `r' of `varlist' + +*Write equation name/label + if "`unstack'"=="" { + local eqvar: word `r' of `fullvarlist' + if `"`eqs'"'!="__" { + local eqrlast `"`eqr'"' + local eqr: word `r' of `eqlist' + if `"`eqr'"'!=`"`eqrlast'"' & "`eqlabelsnone'"=="" { + local value: word `++e' of `macval(eqlabels)' + local eqdim: word `e' of `macval(eqsdims)' + local weqcnt 0 + if `e'==`numeqs' { + if "`eqlabelslast'"=="" local eqlabelsend + local eqdim = `eqdim' + `nindicate' + } + if "`eqlabelsmerge'"!="" { + local theeqlabel `"`macval(eqlabelsprefix)'`macval(value)'`macval(eqlabelssuffix)'"' + } + else { + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`eqlabelsreplace'"!="" { + if `"`macval(eqlabelsbegin0)'"'!="" local tmpbegin + if `"`macval(eqlabelsend)'"'!="" local tmpend + } + if `e'>1 & "`smcleqrules'"!="" { + file write `file' `"`thesmclrule'"' _n + } + WriteBegin `"`file'"' `"`macval(eqlabelsbegin0)'"' `"`macval(tmpbegin)'"' + if "`smcltags'"!="" file write `file' "{res}" + WriteEqrow `"`file'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' `"`macval(value)'"' "`starsrow'" /// + "`eqlabelsspan'" "`varwidth'" "`fmt_v'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" /// + `"`macval(eqlabelsprefix)'"' `"`macval(eqlabelssuffix)'"' /// + "`haslabcol2'" "`labcol2width'" "`fmt_l2'" + if "`smcltags'"!="" file write `file' "{txt}" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(eqlabelsend)'"' + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + local eqlabelsbegin0 `"`macval(eqlabelsbegin)'"' + } + } + } + } + local ++weqcnt + if `weqcnt'==1 { + if "`varlabelsfirst'"=="" local varlabelsbegin0 + } + +*Determine rows to be written + local rvblock + foreach row of local vblock { + local c 0 + local skiprow 1 + local rowhasstats 0 + foreach v of local row { + local ++c + if "`unstack'"!="" { + local eqr: word `:word `c' of `eqsrow'' of `eqs' + if `"`eqr'"'!="" local eqvar `"`eqr':`var'"' + else local eqvar "`var'" + } + local v: subinstr local v "&" " ", all + foreach vi of local v { + if "`vi'"=="." continue + if rownumb(`B',`"`eqvar'"')<. { + local rowhasstats 1 + if index("`vi'",".")==1 continue + local inlist: list posof `"`eqvar'"' in `vi'_drop + if `inlist' continue + local skiprow 0 + continue, break + } + } + if `skiprow'==0 continue, break + } + if `rowhasstats'==0 local skiprow 0 + if `"`ferest()'"'=="" & `"`rvblock'"'=="" local skiprow 0 + if `skiprow' continue + local rvblock `"`rvblock'"`row'" "' + } + local nrvblock: list sizeof rvblock + +*Insert refcat() (unless refcatbelow) + if `"`macval(refcat)'"'!="" { + local isref: list posof `"`var'"' in refcatcoefs + if `isref' { + if "`unstack'"=="" { + local temp `"`eqr'"' + if `"`temp'"'=="" local temp "__" + } + else local temp `"`eqswide'"' + GenerateRefcatRow `B' `ccols' "`var'" `"`temp'"' `"`macval(refcatlabel)'"' + local refcatrow `"`macval(value)'"' + } + } + else local isref 0 + if `isref' & `"`refcatbelow'"'=="" { + if "`smcltags'"!="" file write `file' "{txt}" + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`varlabelsreplace'"!="" { + if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin + if `"`macval(varlabelsend0)'"'!="" local tmpend + } + if "`varlabelsnone'"=="" { + local value: word `isref' of `macval(refcatnames)' + Abbrev `varwidth' `"`macval(value)'"' "`abbrev'" + } + else local value + local value: di `fmt_v' `"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"' + WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + gettoken labcol2chunk labcol2 : labcol2 + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + if "`smcltags'"!="" file write `file' "{res}" + WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' /// + `"`macval(refcatrow)'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`starsrow'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" + if "`smcltags'"!="" file write `file' "{txt}" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend0)'"' + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + local varlabelsbegin0 `"`macval(varlabelsbegin)'"' + } + +*Write variable name/label + if "`smcltags'"!="" file write `file' "{txt}" + local tmpbegin `"`macval(begin)'"' + if "`varlabelsnone'"=="" { + VarInList `"`var'"' "`unstack'" `"`eqvar'"' /// + `"`eqr'"' `"`macval(varlabelsblist)'"' + if `"`macval(value)'"'!="" { + IsInString `"""' `"`value'"' // sets local strcount + if `strcount'==0 { + local value `"`"`macval(value)'"'"' + } + InsertAtVariables `"`macval(value)'"' 2 "`ncols'" `macval(atvars2)' + WriteStrLines `"`file'"' `"`macval(value)'"' + if "`varlabelsreplace'"!="" { + local tmpbegin + local varlabelsbegin0 + } + } + if "`label'"!="" { + CompileVarl, vname(`var') interaction(`macval(interaction)') + } + else local varl `var' + VarInList `"`var'"' "`unstack'" `"`eqvar'"' /// + `"`eqr'"' `"`macval(varlabels)'"' + if `"`macval(value)'"'!="" { + local varl `"`macval(value)'"' + } + if `"`macval(discrete)'"'!="" { + local temp 0 + if "`unstack'"=="" { + if `D'[`r',1]==1 local temp 1 + } + else { + foreach eqr of local eqswide { + if `D'[rownumb(`D',`"`eqr':`var'"'),1]==1 local temp 1 + } + } + if `temp'==1 & `temp'<. { + local varl `"`macval(varl)'`macval(discrete)'"' + } + } + } + else local varl + if `hasrtfbrdr' & `r'==`RI' & !(`isref' & `"`refcatbelow'"'!="") { + if `nrvblock'==1 { + if `rtfbrdron' { + // special case: still in first physical row of table + // body; this means that the table body only has a single + // physical row => need line at top and bottom + StableSubinstr tmpbegin `"`macval(tmpbegin)'"' /* + */ "\clbrdrt\brdrw10\brdrs" /* + */ "\clbrdrt\brdrw10\brdrs\clbrdrb\brdrw10\brdrs" all + } + else { + StableSubinstr tmpbegin `"`macval(rtfbeginbak)'"' /* + */ "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"' + } + local rtfbrdron 1 + } + } + if "`varlabelsreplace'"!="" { + if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin + } + if "`wrap'"!="" & `nrvblock'>1 { + local wrap_i 1 + local value: piece `wrap_i' `varwidth' of `"`macval(theeqlabel)'`macval(varl)'"', nobreak + Abbrev `varwidth' `"`macval(value)'"' "`abbrev'" + } + else { + Abbrev `varwidth' `"`macval(theeqlabel)'`macval(varl)'"' "`abbrev'" + } + local value: di `fmt_v' `"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"' + WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + gettoken labcol2chunk labcol2 : labcol2 + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + local varlabelsbegin0 `"`macval(varlabelsbegin)'"' + +*Write table cells + if "`smcltags'"!="" file write `file' "{res}" + local newrow 0 + mat `first'=J(1,`nmodels',1) + foreach row of local rvblock { + if `hasrtfbrdr' & `r'==`RI' & !(`isref' & `"`refcatbelow'"'!="") { + if `"`ferest()'"'=="" { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"' + local rtfbrdron 1 + } + } + local c 0 + foreach v of local row { + local m: word `++c' of `modelsrow' + local unstackskipcoef 0 + if "`unstack'"!="" { + capt local eqr: word `:word `c' of `eqsrow'' of `eqs' + local rr = rownumb(`B', `"`eqr':`var'"') + if `"`eqr'"'!="" local eqvar `"`eqr':`var'"' + else local eqvar "`var'" + if `rr'>=. local unstackskipcoef 1 // local v "." + } + else local rr `r' + if `newrow' & `c'==1 { + if "`smcltags'"!="" file write `file' "{txt}" + if "`wrap'"!="" & `nrvblock'>1 { + local value + local space + while (1) { + local temp: piece `++wrap_i' `varwidth' of `"`macval(varl)'"', nobreak + if `"`macval(temp)'"'=="" continue, break + local value `"`macval(value)'`space'`macval(temp)'"' + if `wrap_i'<`nrvblock' continue, break + local space " " + } + Abbrev `varwidth' `"`macval(value)'"' "`abbrev'" + local value: di `fmt_v' `"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"' + local value `"`"`macval(value)'"'"' + } + else local value "_skip(`varwidth')" + file write `file' `macval(end)' _n `macval(begin)' `value' + if `haslabcol2' { + file write `file' `macval(delimiter)' `fmt_l2' ("") + } + if "`smcltags'"!="" file write `file' "{res}" + } + local v: subinstr local v "&" " ", all + local modelwidthj: word `=1+mod(`c'-1,`nmodelwidth')' of `modelwidth' + if `modelwidthj'>0 local fmt_m "%`modelwidthj's" + else local fmt_m + local thevalue + foreach vi of local v { + if index("`vi'",".")!=1 { + local inlist: list posof `"`eqvar'"' in `vi'_drop + if `inlist' local vi "..`vi'" + else { + local vipar: subinstr local `vi'_par "@modelwidth" "`modelwidthj'", all + } + } + if index("`vi'",".")==1 { + local value + } + else if `unstackskipcoef' { + local value `"``vi'_vacant'"' + } + else if `B'[`rr',`m'*`droppedpos']==1 & `droppedison' { + if `first'[1,`m'] { + local value `"`macval(dropped)'"' + mat `first'[1,`m']=0 + } + else local value + } + else if "``vi'_'"=="ci" { + if `_`vi'_l'[`rr',`m']>=.y local value `"``vi'_vacant'"' + else { + local format: word `r' of ``vi'_fmt' + if "`format'"=="" { + local format: word `:word count ``vi'_fmt'' of ``vi'_fmt' + } + local value = `_`vi'_l'[`rr',`m'] + local vipar: subinstr local `vi'_l_par "@modelwidth" "`modelwidthj'", all + vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' /// + `"`macval(msign)'"' `"`macval(vipar)'"' + local temp "`macval(value)'" + local value = `_`vi'_u'[`rr',`m'] + local vipar: subinstr local `vi'_u_par "@modelwidth" "`modelwidthj'", all + vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' /// + `"`macval(msign)'"' `"`macval(vipar)'"' + local value `"`macval(temp)'`macval(value)'"' + } + } + else if `_`vi''[`rr',`m']>=.y local value `"``vi'_vacant'"' + //else if `_`vi''[`rr',`m']>=. local value . + else if "``vi'_'"=="_star" { + CellStars `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m'] `"`macval(vipar)'"' + } + else if "``vi'_'"=="_sign" { + MakeSign `_`vi''[`rr',`m'] `"`macval(msign)'"' `"`macval(vipar)'"' + } + else if "``vi'_'"=="_sigsign" { + MakeSign `_`vi''[`rr',`m'] `"`macval(msign)'"' `"`macval(vipar)'"' /// + `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m'] + } + else { + local format: word `r' of ``vi'_fmt' + if "`format'"=="" { + local format: word `:word count ``vi'_fmt'' of ``vi'_fmt' + } + local value = `_`vi''[`rr',`m'] + vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' /// + `"`macval(msign)'"' `"`macval(vipar)'"' + } + local thevalue `"`macval(thevalue)'`macval(value)'"' + if !`stardetachon' & `:word `c' of `starsrow''==1 { + if `modelwidthj'>0 | `starwidth'>0 local fmt_m "%`=`modelwidthj'+`starwidth''s" + local value + if index("`vi'",".")!=1 & `"``vi'_star'"'!="" { + local inlist: list posof `"`eqvar'"' in stardrop + if !`inlist' { + Stars `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m'] + } + } + if "`ferest()'"=="" { + local value: di `fmt_stw' `"`macval(value)'"' + } + local thevalue `"`macval(thevalue)'`macval(value)'"' + } + if "`ferest()'"!="" & index("`vi'","..")!=1 { + local thevalue `"`macval(thevalue)'`macval(incelldelimiter)'"' + } + } + if `:length local thevalue'<245 { + local thevalue: di `fmt_m' `"`macval(thevalue)'"' + } + file write `file' `macval(delimiter)' `"`macval(thevalue)'"' + if `stardetachon' & `:word `c' of `starsrow''==1 { + local thevalue + foreach vi of local v { + if index("`vi'",".")!=1 { + local inlist: list posof `"`eqvar'"' in `vi'_drop + if `inlist' local vi "..`vi'" + } + if index("`vi'",".")!=1 & `"``vi'_star'"'!="" { + local inlist: list posof `"`eqvar'"' in stardrop + if `inlist' local value + else { + Stars `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m'] + } + local thevalue `"`macval(thevalue)'`macval(value)'"' + } + if "`ferest()'"!="" & index("`vi'","..")!=1 { + local thevalue `"`macval(thevalue)'`macval(incelldelimiter)'"' + } + } + if `:length local thevalue'<245 { + local thevalue: di `fmt_stw' `"`macval(thevalue)'"' + } + file write `file' `macval(stardetach)' `"`macval(thevalue)'"' + } + } + local newrow 1 + } + +*End of table row + if "`smcltags'"!="" file write `file' "{txt}" + if `weqcnt'==`eqdim' & "`varlabelslast'"=="" /// + & !(`isref' & `"`refcatbelow'"'!="") local varlabelsend0 + local tmpend `"`macval(end)'"' + if "`varlabelsreplace'"!="" { + if `"`macval(varlabelsend0)'"'!="" local tmpend + } + VarInList `"`var'"' "`unstack'" `"`eqvar'"' `"`eqr'"' /// + `"`macval(varlabelselist)'"' + if `"`macval(value)'"'!="" { + IsInString `"""' `"`value'"' // sets local strcount + if `strcount'==0 { + local value `"`"`macval(value)'"'"' + } + InsertAtVariables `"`macval(value)'"' 2 "`ncols'" `macval(atvars2)' + if "`varlabelsreplace'"!="" local varlabelsend0 + } + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend0)'"' /// + `"`macval(value)'"' +* insert refcat() (if refcatbelow) + if `isref' & `"`refcatbelow'"'!="" { + if "`smcltags'"!="" file write `file' "{txt}" + if `hasrtfbrdr' & `r'==`RI' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"' + local rtfbrdron 1 + } + if `weqcnt'==`eqdim' & "`varlabelslast'"=="" local varlabelsend0 + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`varlabelsreplace'"!="" { + if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin + if `"`macval(varlabelsend0)'"'!="" local tmpend + } + if "`varlabelsnone'"=="" { + local value: word `isref' of `macval(refcatnames)' + Abbrev `varwidth' `"`macval(value)'"' "`abbrev'" + } + else local value + local value: di `fmt_v' `"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"' + WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + gettoken labcol2chunk labcol2 : labcol2 + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + if "`smcltags'"!="" file write `file' "{res}" + WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' /// + `"`macval(refcatrow)'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`starsrow'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" + if "`smcltags'"!="" file write `file' "{txt}" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend0)'"' + } +* end insert refcat() + } + } + +*Write indicator sets + forv i=1/`nindicate' { + if `hasrtfbrdr' & `i'==`nindicate' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"' + local rtfbrdron 1 + } + if `i'==`nindicate' & "`varlabelslast'"=="" local varlabelsend + local tmpbegin `"`macval(begin)'"' + local tmpend `"`macval(end)'"' + if "`varlabelsreplace'"!="" { + if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin + if `"`macval(varlabelsend)'"'!="" local tmpend + } + if "`varlabelsnone'"=="" { + Abbrev `varwidth' `"`macval(indicate`i'name)'"' "`abbrev'" + } + else local value + if "`smcltags'"!="" file write `file' "{txt}" + local value: di `fmt_v' `"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"' + WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `haslabcol2' { + gettoken labcol2chunk labcol2 : labcol2 + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + if "`smcltags'"!="" file write `file' "{res}" + WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' /// + `"`macval(indicate`i'lbls)'"' `"`macval(delimiter)'"' /// + `"`macval(stardetach)'"' "`starsrow'" "`abbrev'" /// + "`modelwidth'" "`delwidth'" "`starwidth'" + if "`smcltags'"!="" file write `file' "{txt}" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend)'"' + } + +*Write prefoot + if `"`macval(prefoot)'"'!="" { + if index(`"`macval(prefoot)'"',`"""')==0 { + local prefoot `"`"`macval(prefoot)'"'"' + } + } + foreach line of local prefoot { + if "`smcltags'"!="" file write `file' "{txt}" + InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)' + file write `file' `"`macval(value)'"' _n + } + if ((`"`vblock'"'!="" & `R'>0) | `nindicate'>0) & "`smclmidrules'"!="" { + if `"`macval(statsarray)'"'!="" { + file write `file' `"`thesmclrule'"' _n + } + } + +*Write foot of table (statistics) + InsertAtVariables `"`macval(statslabelsbegin)'"' 2 "`ncols'" `macval(atvars2)' + local statslabelsbegin `"`macval(value)'"' + InsertAtVariables `"`macval(statslabelsend)'"' 2 "`ncols'" `macval(atvars2)' + local statslabelsend `"`macval(value)'"' + local statslabelsbegin0 `"`macval(statslabelsbegin)'"' + local S: list sizeof statsarray + local eqr "__" + if `hasrtfbrdr' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdefbrdrt'"' + local rtfbrdron 1 + } + forv r = 1/`S' { + if `r'==`S' & `hasrtfbrdr' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"' + local rtfbrdron 1 + } + local stat: word `r' of `macval(statslabels)' + if `"`stat'"'=="" local stat: word `r' of `statsrowlbls' + if "`statslabelsnone'"!="" local stat + if "`smcltags'"!="" file write `file' "{txt}" + if `r'==1 & "`statslabelsfirst'"=="" local statslabelsbegin0 + local tmpbegin `"`macval(begin)'"' + if "`statslabelsreplace'"!="" { + if `"`macval(statslabelsbegin0)'"'!="" local tmpbegin + } + Abbrev `varwidth' `"`macval(stat)'"' "`abbrev'" + local value: di `fmt_v' `"`macval(statslabelsprefix)'`macval(value)'`macval(statslabelssuffix)'"' + WriteBegin `"`file'"' `"`macval(statslabelsbegin0)'"' `"`macval(tmpbegin)'"' /// + `"`"`macval(value)'"'"' + if `r'==1 & "`statslabelsfirst'"=="" { + local statslabelsbegin0 `"`macval(statslabelsbegin)'"' + } + if `haslabcol2' { + gettoken labcol2chunk labcol2 : labcol2 + Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" + if `:length local value'<245 { + local value: di `fmt_l2' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + } + if "`smcltags'"!="" file write `file' "{res}" + local strow: word `r' of `statsarray' + local strowlay: word `r' of `macval(statslayout)' + local strowfmt: word `r' of `statsrowfmt' + local strowstar: word `r' of `statsrowstar' + local lastm + local lasteq + local c 0 + local mpos 0 + foreach m of local modelsrow { + local ++c + local modelwidthj: word `=1+mod(`c'-1,`nmodelwidth')' of `modelwidth' + if `modelwidthj'>0 local fmt_m "%`modelwidthj's" + else local fmt_m + if "`m'"=="." { + file write `file' `macval(delimiter)' `fmt_m' (`""') + continue + } + local value + local eq: word `:word `c' of `eqsrow'' of `eqs' + if "`m'"!="`lastm'" { + local stc 0 + local hasmestats 0 + } + if "`m'"!="`lastm'" | `"`eq'"'!="`lasteq'" local stc_eq 0 + local usemestats 0 + local ++stc_eq + local stcell: word `++stc' of `strow' + local stcelllay: word `stc' of `macval(strowlay)' + local stcellfmt: word `stc' of `strowfmt' + local stcellstar: word `stc' of `strowstar' + local cellhasstat 0 + foreach stat of local stcell { + gettoken format stcellfmt: stcellfmt + local rr = rownumb(`St',`"`stat'"') + local value = `St'[`rr',`m'] + if `value'==.y { + local value `"`return(m`m'_`stat')'"' + if `"`value'"'!="" { + local cellhasstat 1 + local stcelllay: subinstr local stcelllay `"`statspchar'"' /// + `"`value'"' + } + } + else if `value'==.x { + local hasmestats 1 + } + else if `value'<.x { + local cellhasstat 1 + vFormat `value' "`format'" "`lz'" `"`macval(dmarker)'"' /// + `"`macval(msign)'"' + local stcelllay: subinstr local stcelllay `"`statspchar'"' /// + `"`macval(value)'"' + } + } + if `cellhasstat'==0 & `hasmestats' { + local stcell: word `stc_eq' of `strow' + local stcelllay: word `stc_eq' of `macval(strowlay)' + local stcellfmt: word `stc_eq' of `strowfmt' + local stcellstar: word `stc_eq' of `strowstar' + local cellhasstat 0 + foreach stat of local stcell { + gettoken format stcellfmt: stcellfmt + local rr = rownumb(`St',`"`eq':`stat'"') + if `rr'>=. local value .z + else local value = `St'[`rr',`m'] + if `value'!=.z { + local cellhasstat 1 + vFormat `value' "`format'" "`lz'" `"`macval(dmarker)'"' /// + `"`macval(msign)'"' + local stcelllay: subinstr local stcelllay `"`statspchar'"' `"`macval(value)'"' + } + } + if `cellhasstat' local usemestats 1 + } + if `cellhasstat'==0 local stcelllay + if `:length local stcelllay'<245 { + local stcelllay: di `fmt_m' `"`macval(stcelllay)'"' + } + file write `file' `macval(delimiter)' `"`macval(stcelllay)'"' + if `:word `c' of `starsrow''==1 { + if "`stcellstar'"=="1" & `cellhasstat' { + if `usemestats' { + local rr=rownumb(`St',`"`eq':p"') + } + else { + local rr=rownumb(`St',"p") + } + Stars `"`macval(starlevels)'"' `St'[`rr',`m'] + if `:length local value'<245 { + local value: di `fmt_stw' `"`macval(value)'"' + } + file write `file' `macval(stardetach)' `"`macval(value)'"' + } + else { + file write `file' `macval(stardetach)' _skip(`starwidth') + } + } + local lastm "`m'" + local lasteq `"`eq'"' + } + if `r'==`S' & "`statslabelslast'"=="" local statslabelsend + local tmpend `"`macval(end)'"' + if "`statslabelsreplace'"!="" { + if `"`macval(statslabelsend)'"'!="" local tmpend + } + if "`smcltags'"!="" file write `file' "{txt}" + WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(statslabelsend)'"' + if `hasrtfbrdr' & `rtfbrdron' { + StableSubinstr begin `"`macval(rtfbeginbak)'"' "@rtfrowdefbrdr" `"`rtfrowdef'"' + local rtfbrdron 0 + } + } + +*Write postfoot + if "`smclrules'"!="" { + file write `file' `"`thesmclrule'"' _n + } + local discrete: list retok discrete + if `"`macval(postfoot)'"'!="" { + if index(`"`macval(postfoot)'"',`"""')==0 { + local postfoot `"`"`macval(postfoot)'"'"' + } + } + foreach line of local postfoot { + if "`smcltags'"!="" file write `file' "{txt}" + InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)' + file write `file' `"`macval(value)'"' _n + } + +*Write legend (starlevels, marginals) + if "`legend'"!="" { + if `"`macval(discrete2)'"'!="" { + mat `D' = `D''*`D' + if `D'[1,1]!=0 { + if "`smcltags'"!="" file write `file' "{txt}" + file write `file' `"`macval(discrete)'`macval(discrete2)'"' _n + } + } + if `"`macval(starlegend)'"'!="" { + if "`smcltags'"!="" file write `file' "{txt}" + file write `file' `"`macval(starlegend)'"' _n + } + } + +*Finish: copy tempfile to user file / type to screen + file close `file' + local rtfenc = ("`nortfencode'"=="") & (`hasrtf'!=0) & (c(stata_version)>=14) + local S: word count `macval(substitute)' + if `"`topfile'"'!="" { + confirm file `"`topfile'"' + } + if `"`bottomfile'"'!="" { + confirm file `"`bottomfile'"' + } + if `"`using'"'!="" { + tempname file2 + file open `file2' `using', write text `replace' `append' + } + if "`type'"!="" di as res "" + if `"`topfile'"'!="" { + file open `file' using `"`topfile'"', read text + file read `file' temp + while r(eof)==0 { + if `"`using'"'!="" { + file write `file2' `"`macval(temp)'"' _n + } + if "`type'"!="" { + if "`showtabs'"!="" { + local temp: subinstr local temp "`=char(9)'" "", all + } + di `asis' `"`macval(temp)'"' + } + file read `file' temp + } + file close `file' + } + file open `file' using `"`tfile'"', read text + file read `file' temp + while r(eof)==0 { + forv s = 1(2)`S' { + local from: word `s' of `macval(substitute)' + local to: word `=`s'+1' of `macval(substitute)' + if `"`macval(from)'`macval(to)'"'!="" { + local temp: subinstr local temp `"`macval(from)'"' `"`macval(to)'"', all + } + } + if `rtfenc' { + mata: estout_rtfencode("temp") + } + if `"`using'"'!="" { + file write `file2' `"`macval(temp)'"' _n + } + if "`type'"!="" { + if "`showtabs'"!="" { + local temp: subinstr local temp "`=char(9)'" "", all + } + di `asis' `"`macval(temp)'"' + } + file read `file' temp + } + file close `file' + if `"`bottomfile'"'!="" { + file open `file' using `"`bottomfile'"', read text + file read `file' temp + while r(eof)==0 { + if `"`using'"'!="" { + file write `file2' `"`macval(temp)'"' _n + } + if "`type'"!="" { + if "`showtabs'"!="" { + local temp: subinstr local temp "`=char(9)'" "", all + } + di `asis' `"`macval(temp)'"' + } + file read `file' temp + } + file close `file' + } + if `"`using'"'!="" { + file close `file2' + gettoken junk using0 : using + return local fn `using0' + if "`outfilenoteoff'"=="" { + di as txt `"(output written to {browse `using0'})"' + } + } +end + +program MoreOptions +// estout has more options than -syntax- can handle; a subroutine is used +// here (rather than a second syntax call) to preserve the 'using' macro +// from the first syntax call +// MoreOptions is intended for options without arguments only + local theoptions /// + NOOMITted OMITted /// + NOBASElevels BASElevels /// + NOEFORM eform /// + NOMargin Margin /// + NODIscrete /// + NODROPPED dropped /// + NOSTARDetach STARDetach /// + NOABbrev ABbrev /// + NOUNStack UNStack /// + NOLZ lz /// + NOLabel Label /// + NOLEgend LEgend /// + NONUMbers NUMbers /// + NOReplace Replace /// + NOAppend Append /// + NOTYpe TYpe /// + NOSHOWTABS showtabs /// + NOASIS asis /// + NOWRAP wrap /// + NOSMCLTags SMCLTags /// + NOSMCLRules SMCLRules /// + NOSMCLMIDRules SMCLMIDRules /// + NOSMCLEQRules SMCLEQRules /// + NOOUTFILENOTEOFF outfilenoteoff /// + NORTFENCODE rtfencode + syntax [, `theoptions' ] + foreach opt of local theoptions { + local opt = lower("`opt'") + c_local `opt' "``opt''" + } + c_local options +end + +program ParseValueSubopts + syntax anything [ , mrow(string asis) NOTranspose Transpose /// + NOStar Star PVALue(string) Fmt(string) Label(string) Vacant(string) /// + NOPAR par PAR2(string asis) Keep(string asis) Drop(string asis) /// + PATtern(string) NOABS abs ] + local el: word 1 of `anything' + local elname: word 2 of `anything' + CheckPattern `"`pattern'"' "`elname'" + if `"`macval(par2)'"'!="" { + local par `"`macval(par2)'"' + } + else if "`par'"!="" { + if "`elname'"=="ci" local par "[ , ]" + else if "`elname'"=="ci_l" local par `"[ """' + else if "`elname'"=="ci_u" local par `""" ]"' + else local par "( )" + } + if `"`mrow'"'!="" { + capt confirm integer number `mrow' + if _rc==0 { + if `mrow'>=1 { + if `"`macval(label)'"'=="" { + local label "`elname'[`mrow']" + } + } + else { + local mrow `""`mrow'""' + if `"`macval(label)'"'=="" { + local label `mrow' + } + } + } + else { + gettoken trash : mrow, qed(qed) + if `qed'==0 { + local mrow `"`"`mrow'"'"' + } + if `"`macval(label)'"'=="" { + local label `mrow' + } + } + } + foreach opt in transpose star par abs { + if "`no`opt''"!="" c_local no`el'_`opt' 1 + else c_local `el'_`opt' "``opt''" + } + foreach opt in mrow pvalue fmt label vacant keep drop pattern { + c_local `el'_`opt' `"`macval(`opt')'"' + } +end + +program CheckPattern + args pattern option + foreach p of local pattern { + if !( "`p'"=="1" | "`p'"=="0" ) { + di as error `""`pattern'" invalid in `option'(... pattern())"' + exit 198 + } + } +end + +program ParseStatsSubopts + syntax [anything] [ , Fmt(string) Labels(string asis) /// + NOStar Star Star2(string) LAYout(string asis) PChar(string) ] + foreach opt in fmt labels layout pchar { + c_local stats`opt' `"`macval(`opt')'"' + } + if "`nostar'"!="" c_local nostatsstar 1 + else if "`star2'"!="" { + local anything: list anything | star2 + c_local statsstar "`star2'" + } + else if "`star'"!="" { + local star2: word 1 of `anything' + c_local statsstar "`star2'" + } + c_local stats "`anything'" + c_local stats2 +end + +prog ProcessStatslayout // returns statsarray, -rowlbls, -rowfmt, -rowstar, -colstar, -layout + args stats statsfmt statsstar statslayout statspchar + local format "%9.0g" + if `"`statspchar'"'=="" { + local statspchar "@" + c_local statspchar "@" + } + local statsarray + local statsrowlbls + local statsrowfmt + local statsrowstar + local space1 + local i 0 + local wmax 0 + foreach row of local statslayout { + local statsrow + local statsrowlbl + local statsrfmt + local statsrstar + local space2 + local w = 0 + foreach cell of local row { + local ++w + local statscell + local statsclbl `"`cell'"' + local statscfmt + local statscstar 0 + local space3 + local trash: subinstr local cell `"`statspchar'"' "", all count(local cnt) + forv j=1/`cnt' { + local stat: word `++i' of `stats' + local statscell `"`statscell'`space3'`stat'"' + local statsclbl: subinstr local statsclbl `"`statspchar'"' "`stat'" + local tmp: word `i' of `statsfmt' + if `"`tmp'"'!="" local format `"`tmp'"' + local statscfmt `"`statscfmt'`space3'`format'"' + if `:list stat in statsstar' { + local statscstar 1 + local statscol_`w' 1 + } + local space3 " " + } + local statsrow `"`statsrow'`space2'"`statscell'""' + local statsrowlbl `"`statsrowlbl'`space2'`statsclbl'"' + local statsrfmt `"`statsrfmt'`space2'"`statscfmt'""' + local statsrstar "`statsrstar'`space2'`statscstar'" + local space2 " " + } + local statsarray `"`statsarray'`space1'`"`statsrow'"'"' + local statsrowlbls `"`statsrowlbls'`space1'`"`statsrowlbl'"'"' + local statsrowfmt `"`statsrowfmt'`space1'`"`statsrfmt'"'"' + local statsrowstar `"`statsrowstar'`space1'`"`statsrstar'"'"' + local space1 " " + local wmax = max(`w',`wmax') + } + while (1) { + local stat: word `++i' of `stats' + if `"`stat'"'=="" continue, break + local tmp: word `i' of `statsfmt' + if `"`tmp'"'!="" local format `"`tmp'"' + local statscstar: list stat in statsstar + if `statscstar' local statscol_1 1 + local statsarray `"`statsarray'`space1'`"`stat'"'"' + local statsrowlbls `"`statsrowlbls'`space1'`"`stat'"'"' + local statsrowfmt `"`statsrowfmt'`space1'`"`format'"'"' + local statsrowstar `"`statsrowstar'`space1'`"`statscstar'"'"' + local statslayout `"`statslayout'`space1'`statspchar'"' + local space1 " " + local wmax = max(1,`wmax') + } + local statscolstar + local space + forv w = 1/`wmax' { + if "`statscol_`w''"=="" local statscol_`w' 0 + local statscolstar "`statscolstar'`space'`statscol_`w''" + local space " " + } + c_local statsarray `"`statsarray'"' + c_local statsrowlbls `"`statsrowlbls'"' + c_local statsrowfmt `"`statsrowfmt'"' + c_local statsrowstar `"`statsrowstar'"' + c_local statscolstar `"`statscolstar'"' + c_local statslayout `"`statslayout'"' +end + +program ParseLabelsSubopts + gettoken type 0: 0 + local lblsubopts + syntax [anything] [ , NONUMbers NUMbers NOTItles TItles NODEPvars DEPvars /// + NONONE NONE NOSPAN span Prefix(string) Suffix(string) Begin(string asis) /// + End(string asis) NOReplace Replace BList(string asis) EList(string asis) /// + ERepeat(string) NOFirst First NOLast Last lhs(string) PATtern(string) /// + NOMerge Merge ] + CheckPattern `"`pattern'"' "`type'" + if "`merge'"!="" & "`nomerge'`macval(suffix)'"=="" local suffix ":" + foreach opt in begin end { + if `"`macval(`opt')'"'!="" { + if index(`"`macval(`opt')'"', `"""')==0 { + local `opt' `"`"`macval(`opt')'"'"' + } + } + } + foreach opt in prefix suffix begin end blist elist erepeat lhs pattern { + c_local `type'`opt' `"`macval(`opt')'"' + } + foreach opt in numbers titles depvars span replace none first last merge { + if "`no`opt''"!="" c_local no`type'`opt' 1 + else c_local `type'`opt' "``opt''" + } + c_local `type' `"`macval(anything)'"' +end + +program ReadLine + args max file + local end 0 + file read `file' temp1 + local temp1: subinstr local temp1 "`=char(9)'" " ", all + while r(eof)==0 { + local j 1 + local temp2 + local temp3: piece `j++' `max' of `"`macval(temp1)'"' + if `"`temp3'"'=="" | index(`"`temp3'"',"*")==1 /// + | index(`"`temp3'"',"//")==1 { + file read `file' temp1 + local temp1: subinstr local temp1 "`=char(9)'" " ", all + continue + } + while `"`temp3'"'!="" { + local comment=index(`"`macval(temp3)'"'," ///") + if `comment' { + local temp3=substr(`"`macval(temp3)'"',1,`comment') + local temp2 `"`macval(temp2)'`macval(temp3)'"' + local end 0 + continue, break + } + local comment=index(`"`macval(temp3)'"'," //") + if `comment' { + local temp3=substr(`"`macval(temp3)'"',1,`comment') + local temp2 `"`macval(temp2)'`macval(temp3)'"' + local end 1 + continue, break + } + local temp2 `"`macval(temp2)'`macval(temp3)'"' + local temp3: piece `j++' `max' of `"`macval(temp1)'"' + local end 1 + } + if `end' { + local line `"`macval(line)'`macval(temp2)'"' + continue, break + } + else { + local line `"`macval(line)'`macval(temp2)'"' + file read `file' temp1 + local temp1: subinstr local temp1 "`=char(9)'" " ", all + } + } + c_local line `"`macval(line)'"' +end + +program CellsCheck + args cells + local ncols 0 + local nrows 0 + local cells: subinstr local cells "& " "&", all + local cells: subinstr local cells " &" "&", all + local cells: subinstr local cells `"&""' `"& ""', all + local cells: subinstr local cells `""&"' `"" &"', all + foreach row of local cells { + local newrow + foreach col of local row { + local vals: subinstr local col "&" " ", all + //local vals: list vals - values + local values: list values | vals + local vals: list retok vals + local vals: subinstr local vals " " "&", all + //local newrow: list newrow | vals + local newrow `"`newrow'`vals' "' + } + local newrow: list retok newrow + if "`newrow'"!="" { + local ncols = max(`ncols',`:list sizeof newrow') + local newcells `"`newcells'"`newrow'" "' + local ++nrows + } + } + local newcells: list retok newcells + c_local cells `"`newcells'"' + c_local ncols `ncols' + c_local nrows `nrows' + local dot "." + c_local values: list values - dot +end + +program Star2Cells + args cells star + local newcells + foreach row of local cells { + local newrow + foreach col of local row { + if "`col'"=="`star'" { + local col "`col'star" + } + local newrow: list newrow | col + } + local newcells `"`newcells'"`newrow'" "' + } + local newcells: list retok newcells + c_local cells `"`newcells'"' +end + +prog ParseStarlevels + syntax [anything(equalok)] [ , Label(str) Delimiter(str) ] + c_local starlevels `"`macval(anything)'"' + c_local starlevelslabel `"`macval(label)'"' + c_local starlevelsdelimiter `"`macval(delimiter)'"' +end + +program CheckStarvals + args starlevels label del + if `"`macval(label)'"'=="" local label " p<" + if `"`macval(del)'"'=="" local del ", " + local nstar: word count `macval(starlevels)' + local nstar = `nstar'/2 + capture confirm integer number `nstar' + if _rc { + di as error "unmatched list of significance symbols and levels" + exit 198 + } + local istar 1 + forv i = 1/`nstar' { + local iistar: word `=`i'*2' of `macval(starlevels)' + confirm number `iistar' + if `iistar'>`istar' | `iistar'<=0 { + di as error "significance levels out of order or out of range (0,1]" + exit 198 + } + local istar `iistar' + local isym: word `=`i'*2-1' of `macval(starlevels)' + if `"`macval(legend)'"'!="" { + local legend `"`macval(legend)'`macval(del)'"' + } + local ilabel: subinstr local label "@" "`istar'", count(local hasat) + if `hasat'==0 { + local ilabel `"`macval(label)'`istar'"' + } + local legend `"`macval(legend)'`macval(isym)'`macval(ilabel)'"' + } + c_local starlegend `"`macval(legend)'"' +end + +program Starwidth + args starlevels + if c(stata_version)>=14 local length udstrlen + else local length length + local nstar: word count `macval(starlevels)' + forv i = 2(2)`nstar' { + local istar: word `=`i'-1' of `macval(starlevels)' + local width = max(length("`width'"),`length'(`"`macval(istar)'"')) + } + c_local value `width' +end + +// Loosely based on Mkemat from est_table.ado, but with heavy modifications +program _estout_getres, rclass + syntax, names(str) [ coefs(str asis) stats(str asis) equations(str) /// + rename(str asis) margin(str asis) meqs(str asis) /// + dropped(int 0) level(int 95) /// + transform(str asis) transformpattern(str asis) /// + omitted baselevels ] + // coefs: coef "coef O/1 #" `"coef O/1 "rowname""' etc... + + tempname bc bbc bs bbs st + + local nnames : word count `names' + local rename : subinstr local rename "," "", all + if `"`stats'"' != "" { + local stats : subinstr local stats "," "", all + confirm names `stats' + local stats : list uniq stats + local nstat : list sizeof stats + mat `bbs' = J(`nstat', `nnames', .z) + mat colnames `bbs' = `: subinstr local names "." "active", all word' + mat rownames `bbs' = `stats' + } + + if "`equations'" != "" { + MatchNames "`equations'" + local eqspec `r(eqspec)' + local eqnames `r(eqnames)' + } + + local ncoefs 0 + foreach coefn of local coefs { + local ++ncoefs + gettoken coef : coefn + local coefnms `"`coefnms' `coef'"' // use more informative label? (coefn => error in Stata 8 and 10) + } + local bVs "b se var t z p ci_l ci_u _star _sign _sigsign" + local hasbVs = `"`: list coefnms & bVs'"'!="" + local hastransform = (`"`transform'"'!="") & `hasbVs' + local getbV = cond(`hasbVs' | `dropped', "b var ", "") + + tempname hcurrent esample + local estcycle = ("`names'"!=".") + if `estcycle' { + _est hold `hcurrent', restore nullok estsystem + } + + local ni 0 + local hasbbc 0 + local ccols = `ncoefs' + ("`margin'"!="") + `dropped' + foreach name of local names { + local ++ni + local hasbc 0 + local hasmargin 0 + nobreak { + if "`name'" != "." { + local eqname `name' + *est_unhold `name' `esample' // (why preserve missings in esample?) + capt confirm new var _est_`name' // fix e(sample) if obs have been added + if _rc qui replace _est_`name' = 0 if _est_`name' >=. + _est unhold `name' + } + else { + local eqname active + if `estcycle' { + _est unhold `hcurrent' + } + } + + // get coefficients + capture noisily break { + CheckEqs `"`getbV'`coefs'"' // sets local seqmerge + GetCoefs `bc' `seqmerge' `"`getbV'`coefs'"' // sets local hasbc + if `hasbc' { + mat coln `bc' = `getbV'`coefnms' + SubstEmptyEqname `bc' // replace empty eqname "_" by "__" + } + } + local rc = _rc + + // set equation names and get marginal effects + if `hasbc' & `rc'==0 { + capture noisily break { + if `dropped' { + DroppedCoefs `bc' + } + if "`equations'"!="" { + AdjustRowEq `bc' `ni' `nnames' "`eqspec'" "`eqnames'" + } + if "`margin'"!="" & `hasbVs' { + GetMarginals `bc' "`margin'" `"`meqs'"' // resets local hasmargin + } + if `hasbVs' { + ComputeCoefs `bc' `hasmargin' `"`coefnms'"' `level' + } + if `hastransform' & `hasbVs' { + if `"`transformpattern'"'!="" { + local transformthis: word `ni' of `transformpattern' + } + else local transformthis 1 + if `"`transformthis'"'=="1" { + TransformCoefs `bc' `"`coefnms'"' `"`transform'"' + } + } + if "`getbV'"!="" { + mat `bc' = `bc'[1...,3...] // remove b and var + } + } + local rc = _rc + } + + // get stats + if `rc'==0 { + capture noisily break { + if "`stats'" != "" { + GetStats "`stats'" `bbs' `ni' + if `hasbc'>0 & inlist(`"`e(cmd)'"', "reg3", "sureg", "mvreg") { + GetEQStats "`stats'" `bbs' `ni' `bc' + } + return add + } + } + local rc = _rc + } + + local depname: word 1 of `e(depvar)' + return local m`ni'_depname "`depname'" + + local title `"`e(estimates_title)'"' + if `"`title'"'=="" local title `"`e(_estimates_title)'"' // prior to Stata 10 + return local m`ni'_estimates_title `"`title'"' + + if "`name'" != "." { + *est_hold `name' `esample' + _est hold `name', estimates varname(_est_`name') + } + else { + if `estcycle' { + _est hold `hcurrent', restore nullok estsystem + } + } + } + + if `rc' { + exit `rc' + } + + if (c(stata_version)>=11) & (`hasbc'>0) { + mata: estout_omitted_and_base() // sets local hasbc + } + + if `hasbc'>0 { + mat coleq `bc' = `eqname' + if `"`rename'"'!="" { + RenameCoefs `bc' `"`rename'"' + } + if `hasbbc' { + _estout_mat_capp `bbc' : `bbc' `bc', miss(.z) cons ts + } + else { + mat `bbc' = `bc' + if `ni'>1 { // add previous empty models + mat `bc' = (1, `bc'[1,1...]) \ ( `bc'[1...,1], J(rowsof(`bc'), colsof(`bc'), .z)) + mat `bc' = `bc'[2...,2...] + forv nj = 1/`ni' { + if `nj'==`ni' continue + local eqname: word `nj' of `names' + if `"`eqname'"'=="." { + local eqname active + } + mat coleq `bc' = `eqname' + mat `bbc' = `bc', `bbc' + } + } + } + local hasbbc 1 + } + else { + if `hasbbc' { // add empty model if bbc exists + mat `bc' = `bbc'[1...,1..`ccols'] + mat `bc' = (1, `bc'[1,1...]) \ ( `bc'[1...,1], J(rowsof(`bc'), colsof(`bc'), .z)) + mat `bc' = `bc'[2...,2...] + mat coleq `bc' = `eqname' + mat `bbc' = `bbc', `bc' + } + } + } + + if `hasbbc' { + return matrix coefs = `bbc' + return scalar ccols = `ccols' + } + else { + return scalar ccols = 0 // indicates that r(coefs) is missing + } + if "`stats'" != "" { + return matrix stats = `bbs' + } + return local names `names' + return scalar nmodels = `ni' +end + +program _estout_mat_capp + // variant of mat_capp that is robust against blanks in coefficient names + if c(stata_version)<11 { // requires Stata 11 or newer + mat_capp `0' + exit + } + syntax anything [, * ] + gettoken m1 m3 : anything, parse(":") // mat1 + gettoken m2 m3 : m3, parse(":") // : + gettoken m2 m3 : m3 // mat2 + gettoken m3 : m3 // mat3 + local hasblanks 0 + mata: estout_rown_hasblanks("hasblanks", ("`m2'", "`m3'")) + if `hasblanks'==0 { + mat_capp `0' + exit + } + mata: estout_mat_capp("`m1'", ("`m2'", "`m3'")) +end + +program DroppedCoefs // identify dropped coeffficients + args bc + tempname tmp + mat `tmp' = `bc'[1..., 1] * 0 + mat coln `tmp' = "_dropped" + local r = rowsof(`bc') + forv i = 1/`r' { + if `bc'[`i',1]==0 & `bc'[`i',2]==0 { // b=0 and var=0 + mat `tmp'[`i',1] = 1 + } + } + mat `bc' = `bc', `tmp' +end + +program RenameCoefs + args bc rename + local Stata11 = cond(c(stata_version)>=11, "version 11:", "") + tempname tmp + local eqs: roweq `bc', q + local eqs: list clean eqs + local eqs: list uniq eqs + local newnames + foreach eq of local eqs { + mat `tmp' = `bc'[`"`eq':"',1] + QuotedRowNames `tmp' + local vars `"`value'"' + local rest `"`rename'"' + while (`"`rest'"'!="") { + gettoken from rest : rest + gettoken to rest : rest + if `"`from'`to'"'=="" continue + gettoken equ x : from, parse(:) + local equ: list clean equ + if `"`equ'"'==":" { // case 1: ":varname" + local equ + local x: list clean x + } + else if `"`x'"'=="" { // case 2: "varname" + local x `"`equ'"' + local equ + } + else { // case 3. "eqname:varname" + if `"`equ'"'=="_" local equ "__" + gettoken colon x : x, parse(:) + local x: list clean x + } + if `"`x'"'=="" { + di as err "invalid rename()" + exit 198 + } + if index(`"`to'"',":") | `"`to'"'=="" { + di as err "invalid rename()" + exit 198 + } + if `"`equ'"'!="" { + if `"`equ'"'!=`"`eq'"' continue // different equation + } + local x `"`"`x'"'"' + local x: list clean x + local vars: subinstr local vars `"`x'"' `"`"`to'"'"', word + } + local newnames `"`newnames'`vars' "' + } + `Stata11' mat rown `bc' = `newnames' +end + +// Source: est_table.ado version 1.1.4 09oct2008 (unmodified) +program MatchNames, rclass + args eqspec + + local eqspec : subinstr local eqspec ":" " ", all + local eqspec0 : subinstr local eqspec "#" "" , all + + local iterm 0 + gettoken term eqspec : eqspec0 , parse(",") + while "`term'" != "" { + local ++iterm + + // term = [name =] { # | #-list } + gettoken eqname oprest: term, parse("=") + gettoken op rest : oprest, parse("=") + if trim(`"`op'"') == "=" { + confirm name `eqname' + local term `rest' + } + else { + local eqname #`iterm' + } + local eqnames `eqnames' `eqname' + + if "`eqspec'" == "" { + continue, break + } + gettoken term eqspec: eqspec , parse(",") + assert "`term'" == "," + gettoken term eqspec: eqspec , parse(",") + } + + if `"`:list dups eqnames'"' != "" { + dis as err "duplicate matched equation names" + exit 198 + } + + return local eqspec `eqspec0' + return local eqnames `eqnames' +end + +// Source: est_table.ado version 1.1.4 09oct2008 +// 02oct2013: added -version 11: matrix roweq- to support new eqnames +program AdjustRowEq + args b ni nmodel eqspec eqnames + + local beqn : roweq `b', quote + local beqn : list clean beqn + local beq : list uniq beqn + + if `"`:list beq & eqnames'"' != "" { + dis as err "option equations() invalid" + dis as err "specified equation name already occurs in model `ni'" + exit 198 + } + + local iterm 0 + gettoken term eqspec : eqspec , parse(",") + while "`term'" != "" { + // dis as txt "term:|`term'|" + local ++iterm + + // term = [name =] { # | #-list } + gettoken eqname oprest: term, parse("=") + gettoken op rest : oprest, parse("=") + if trim(`"`op'"') == "=" { + local term `rest' + } + else { + local eqname #`iterm' + } + + local nword : list sizeof term + if !inlist(`nword', 1, `nmodel') { + dis as err "option equations() invalid" + dis as err "a term should consist of either 1 or `nmodel' equation numbers" + exit 198 + } + if `nword' > 1 { + local term : word `ni' of `term' + } + + if trim("`term'") != "." { + capt confirm integer number `term' + if _rc { + dis as err "option equations() invalid" + dis as err "`term' was found, while an integer equation number was expected" + exit 198 + } + if !inrange(`term',1,`:list sizeof beq') { + dis as err "option equations() invalid" + dis as err "equation number `term' for model `ni' out of range" + exit 198 + } + if `:list posof "`eqname'" in beq' != 0 { + dis as err "impossible to name equation `eqname'" + dis as err "you should provide (another) equation name" + exit 198 + } + + local beqn : subinstr local beqn /// + `"`:word `term' of `beq''"' /// + "`eqname'" , word all + } + + if "`eqspec'" == "" { + continue, break + } + gettoken term eqspec: eqspec , parse(",") + assert "`term'" == "," + gettoken term eqspec: eqspec , parse(",") + } + if c(stata_version)>=11 { // similar to RenameCoefs + version 11: matrix roweq `b' = `beqn' + } + else { + matrix roweq `b' = `beqn' + } +end + +// Source: est_table.ado version 1.1.4 09oct2008 (modified) +// Modification: returns string scalars in r(m`ni'_name) (and sets `bbs' = .y) +program GetStats, rclass + args stats bbs ni + tempname rank st V + local escalars : e(scalars) + local emacros : e(macros) + local is 0 + foreach stat of local stats { + local ++is + if inlist("`stat'", "aic", "bic", "rank") { + if "`hasrank'" == "" { + capt mat `V' = syminv(e(V)) + local rc = _rc + if `rc' == 0 { + scalar `rank' = colsof(`V') - diag0cnt(`V') + } + else if `rc' == 111 { + scalar `rank' = 0 + } + else { + // rc<>0; show error message + mat `V' = syminv(e(V)) + } + local hasrank 1 + } + if "`stat'" == "aic" { + scalar `st' = -2*e(ll) + 2*`rank' + } + else if "`stat'" == "bic" { + scalar `st' = -2*e(ll) + log(e(N)) * `rank' + } + else if "`stat'" == "rank" { + scalar `st' = `rank' + } + } + else { + if `:list stat in escalars' > 0 { + scalar `st' = e(`stat') + } + else if "`stat'"=="p" { + if `"`e(F)'"'!="" { + scalar `st' = Ftail(e(df_m), e(df_r), e(F)) + } + else if `"`e(chi2)'"'!="" { + scalar `st' = chi2tail(e(df_m), e(chi2)) + } + else { + scalar `st' = .z + } + } + else if `:list stat in emacros' > 0 { + scalar `st' = .y + capt return local m`ni'_`stat' `"`e(`stat')'"' // name might be too long + } + else { + scalar `st' = .z + } + } + mat `bbs'[`is',`ni'] = `st' + } +end + +program GetEQStats, rclass // eq-specific stats for reg3, sureg, and mvreg (sets `bbs' = .x) + args stats bbs ni bc + return add + tempname addrow + local ic "aic bic rank" + local eqs: roweq `bc', q + local eqs: list clean eqs + local eqs: list uniq eqs + local s 0 + foreach stat of local stats { + local ++s + if inlist(`"`stat'"', "aic", "bic", "rank") continue + if `bbs'[`s',`ni']<.y continue + local e 0 + local found 0 + foreach eq of local eqs { + local ++e + if e(cmd)=="mvreg" { + if "`stat'"=="p" local value: word `e' of `e(p_F)' + else local value: word `e' of `e(`stat')' + } + else if "`stat'"=="df_m" { + local value `"`e(`stat'`e')'"' + } + else { + local value `"`e(`stat'_`e')'"' + } + capture confirm number `value' + if _rc==0 { + local found 1 + local r = rownumb(`bbs', `"`eq':`stat'"') + if `r'>=. { + mat `addrow' = J(1, colsof(`bbs'), .z) + mat rown `addrow' = `"`eq':`stat'"' + mat `bbs' = `bbs' \ `addrow' + local r = rownumb(`bbs', `"`eq':`stat'"') + } + mat `bbs'[`r',`ni'] = `value' + } + } + if `found' { + if `bbs'[`s',`ni']==.y { + capt return local m`ni'_`stat' "" + } + mat `bbs'[`s',`ni'] = .x + } + } +end + +program CheckEqs + args coefs + tempname tmp + local j 0 + local bVs "b _star _sign _sigsign" + local seqmerge 0 + local hasseqs 0 + foreach coefn in `coefs' { + local ++j + gettoken coef row : coefn + gettoken transpose row : row + gettoken row : row, q + if `"`coef'"'=="b" & `j'==1 { + capt confirm mat e(`coef') + if _rc continue + mat `tmp' = e(`coef') + local eqs: coleq `tmp', q + if `:list posof "_" in eqs'==0 { + local seqmerge 1 + } + else continue, break + } + if `:list coef in bVs' continue + capt confirm mat e(`coef') + if _rc continue + mat `tmp' = e(`coef') + if `transpose' { + mat `tmp' = `tmp'' + } + if `"`row'"'=="" local row 1 + capt confirm number `row' + if _rc { + local row = rownumb(`tmp',`row') + } + if `row'>rowsof(`tmp') continue + local eqs: coleq `tmp', q + if `:list posof "_" in eqs' { + local eqs: list uniq eqs + local eqs: list clean eqs + if `"`eqs'"'!="_" { // => contains "_" but also others + local local seqmerge 0 + continue, break + } + else local hasseqs 1 + } + else { + local seqmerge 1 + } + } + if `hasseqs'==0 local seqmerge 0 + c_local seqmerge `seqmerge' +end + +program SubstEmptyEqname // replace empty equation name "_" by "__" + args M + local eqs: roweq `M', q + if `: list posof "_" in eqs' { + local eqs: subinstr local eqs `""_""' `""__""', all + mat roweq `M' = `eqs' + } +end + +program RestoreEmptyEqnames // replace equation name "__" by "_" + args M + local eqs: roweq `M', q + if `: list posof "__" in eqs' { + local eqs: subinstr local eqs `""__""' `""_""', all + mat roweq `M' = `eqs' + } +end + +program GetCoefs + args bc seqmerge coefs + tempname tmp + local hasbc 0 + local j 0 + local bVs "b _star _sign _sigsign" + foreach coefn of local coefs { + local ++j + gettoken coef row : coefn + gettoken transpose row : row + gettoken row : row, q + local isinbVs: list coef in bVs + if `isinbVs' & `j'>2 { + if `hasbc'==0 continue + mat `bc' = `bc', J(rowsof(`bc'),1, .y) + continue + } + if `j'==2 & `"`coef'"'=="var" { + local isinbVs 1 + capt mat `tmp' = vecdiag(e(V)) + if _rc { + capt confirm mat e(se) + if _rc==0 { + mat `tmp' = e(se) + forv i = 1/`=colsof(`tmp')' { + mat `tmp'[1, `i'] = `tmp'[1, `i']^2 + } + } + } + } + else { + capt confirm mat e(`coef') + if _rc==0 { + mat `tmp' = e(`coef') + } + } + if _rc { + if `hasbc'==0 continue + mat `bc' = `bc', J(rowsof(`bc'),1, .y) + continue + } + if `isinbVs'==0 { // => not b or var + if `transpose' { + mat `tmp' = `tmp'' + } + if `"`row'"'=="" local row 1 + capt confirm number `row' + if _rc { + local row = rownumb(`tmp',`row') + } + if `row'>rowsof(`tmp') { + if `hasbc'==0 continue + mat `bc' = `bc', J(rowsof(`bc'),1, .y) + continue + } + mat `tmp' = `tmp'[`row', 1...] + } + local bcols = colsof(`tmp') + if `bcols'==0 { + if `hasbc'==0 continue + mat `bc' = `bc', J(rowsof(`bc'),1, .y) + continue + } + mat `tmp' = `tmp'' + if `seqmerge' & `isinbVs'==0 { + local eqs: roweq `tmp', q + local eqs: list uniq eqs + local eqs: list clean eqs + if `"`eqs'"'=="_" { + local seqmergejs `seqmergejs' `j' + local seqmergecoefs `"`seqmergecoefs'`"`coefn'"' "' + if `hasbc'==0 continue + mat `bc' = `bc', J(rowsof(`bc'),1, .y) + continue + } + } + if `hasbc'==0 { + mat `bc' = `tmp' + local hasbc 1 + if `j'>1 { + mat `bc' = `bc', J(`bcols',`j'-1, .y), `bc' + mat `bc' = `bc'[1...,2...] + } + } + else { + _estout_mat_capp `bc' : `bc' `tmp', miss(.y) cons ts + } + } + foreach coefn of local seqmergecoefs { + gettoken j seqmergejs : seqmergejs + gettoken coef row : coefn + gettoken transpose row : row + gettoken row : row, q + mat `tmp' = e(`coef') + if `transpose' { + mat `tmp' = `tmp'' + } + if `"`row'"'=="" local row 1 + capt confirm number `row' + if _rc { + local row = rownumb(`tmp',`row') + } + mat `tmp' = `tmp'[`row', 1...] + SEQMerge `bc' `j' `tmp' + } + c_local hasbc `hasbc' +end + +program SEQMerge + args bc j x + tempname tmp + local r = rowsof(`bc') + forv i = 1/`r' { + mat `tmp' = `bc'[`i',1...] + local v: rown `tmp' + local c = colnumb(`x', `"`v'"') + if `c'<. { + mat `bc'[`i',`j'] = `x'[1,`c'] + } + } +end + +program ComputeCoefs + args bc hasmargin coefs level + local bVs1 "b _star _sign _sigsign" + local bVs2 "se var t z p ci_l ci_u" + local c = colsof(`bc') + forv j = 3/`c' { + gettoken v coefs : coefs + if `"`v'"'=="" continue, break + if `: list v in bVs1' { + ComputeCoefs_`v' `bc' `j' `level' + continue + } + if `: list v in bVs2' { + if `hasmargin' { + ComputeCoefs_`v' `bc' `j' `level' + continue + } + capt confirm matrix e(`v') + if _rc { + ComputeCoefs_`v' `bc' `j' `level' + } + } + } +end + +program CopyColFromTo + args m from to cname + tempname tmp + mat `tmp' = `m'[1...,`from'] + mat coln `tmp' = `cname' + local c = colsof(`m') + if `to'==`c' { + mat `m' = `m'[1...,1..`c'-1], `tmp' + exit + } + mat `m' = `m'[1...,1..`to'-1], `tmp', `m'[1...,`to'+1..`c'] +end + +program ComputeCoefs_b + args bc j + CopyColFromTo `bc' 1 `j' "b" +end + +program ComputeCoefs_se + args bc j + local r = rowsof(`bc') + forv i = 1/`r' { + local var `bc'[`i',2] + local res `bc'[`i',`j'] + if `var'>=. mat `res' = `var' + else if `var'==0 mat `res' = . + else mat `res' = sqrt(`var') + } +end + +program ComputeCoefs_var + args bc j + CopyColFromTo `bc' 2 `j' "var" +end + +program ComputeCoefs_t + args bc j + local r = rowsof(`bc') + forv i = 1/`r' { + local b `bc'[`i',1] + local var `bc'[`i',2] + local res `bc'[`i',`j'] + if `b'>=. mat `res' = `b' + else if `var'>=. mat `res' = `var' + else mat `res' = `b'/sqrt(`var') + } +end + +program ComputeCoefs_z + ComputeCoefs_t `0' +end + +program ComputeCoefs_p + args bc j + local r = rowsof(`bc') + local df_r = e(df_r) + if `"`e(mi)'"'=="mi" { // get df_mi + capt confirm matrix e(df_mi) + if _rc==0 { + tempname dfmi + matrix `dfmi' = e(df_mi) + } + } + if c(stata_version)<10 local dfmax 1e12 + else local dfmax 2e17 + forv i = 1/`r' { + local b `bc'[`i',1] + local var `bc'[`i',2] + local res `bc'[`i',`j'] + if `b'>=. mat `res' = `b' + else if `var'>=. mat `res' = `var' + else if "`dfmi'"!="" { + if `dfmi'[1,`i']<=`dfmax' { + mat `res' = ttail(`dfmi'[1,`i'],abs(`b'/sqrt(`var'))) * 2 + } + else { + mat `res' = (1 - norm(abs(`b'/sqrt(`var')))) * 2 + } + } + else if `df_r'<=`dfmax' mat `res' = ttail(`df_r',abs(`b'/sqrt(`var'))) * 2 + else mat `res' = (1 - norm(abs(`b'/sqrt(`var')))) * 2 + } +end + +program ComputeCoefs_ci_l + args bc j + ComputeCoefs_ci - `0' +end + +program ComputeCoefs_ci_u + args bc j + ComputeCoefs_ci + `0' +end + +program ComputeCoefs_ci + args sign bc j level + local r = rowsof(`bc') + local df_r = e(df_r) + if `"`e(mi)'"'=="mi" { // get df_mi + capt confirm matrix e(df_mi) + if _rc==0 { + tempname dfmi + matrix `dfmi' = e(df_mi) + } + } + if c(stata_version)<10 local dfmax 1e12 + else local dfmax 2e17 + forv i = 1/`r' { + local b `bc'[`i',1] + local var `bc'[`i',2] + local res `bc'[`i',`j'] + if `b'>=. mat `res' = `b' + else if `var'>=. mat `res' = `var' + else if "`dfmi'"!="" { + if `dfmi'[1,`i']<=`dfmax' { + mat `res' = `b' `sign' /// + invttail(`dfmi'[1,`i'],(100-`level')/200) * sqrt(`var') + } + else { + mat `res' = `b' `sign' /// + invnorm(1-(100-`level')/200) * sqrt(`var') + } + } + else if `df_r'<=`dfmax' /// + mat `res' = `b' `sign' invttail(`df_r',(100-`level')/200) * sqrt(`var') + else mat `res' = `b' `sign' invnorm(1-(100-`level')/200) * sqrt(`var') + } +end + +program ComputeCoefs__star + args bc j + CopyColFromTo `bc' 1 `j' "_star" +end + +program ComputeCoefs__sign + args bc j + CopyColFromTo `bc' 1 `j' "_sign" +end + +program ComputeCoefs__sigsign + args bc j + CopyColFromTo `bc' 1 `j' "_sigsign" +end + +program GetMarginals + args bc margin meqs + tempname D dfdx + mat `D' = `bc'[1...,1]*0 + mat coln `D' = "_dummy" + local type `e(Xmfx_type)' + if "`type'"!="" { + mat `dfdx' = e(Xmfx_`type') + capture confirm matrix e(Xmfx_se_`type') + if _rc==0 { + mat `dfdx' = `dfdx' \ e(Xmfx_se_`type') + } + if "`e(Xmfx_discrete)'"=="discrete" local dummy `e(Xmfx_dummy)' + } + else if "`e(cmd)'"=="dprobit" { + mat `dfdx' = e(dfdx) \ e(se_dfdx) + local dummy `e(dummy)' + } + else if "`e(cmd)'"=="tobit" & inlist("`margin'","u","c","p") { + capture confirm matrix e(dfdx_`margin') + if _rc==0 { + mat `dfdx' = e(dfdx_`margin') \ e(se_`margin') + } + local dummy `e(dummy)' + } + else if "`e(cmd)'"=="truncreg" { + capture confirm matrix e(dfdx) + if _rc==0 { + tempname V se + mat `V' = e(V_dfdx) + forv k= 1/`=rowsof(`V')' { + mat `se' = nullmat(`se') , sqrt(`V'[`k',`k']) + } + mat `dfdx' = e(dfdx) \ `se' + } + } + capture confirm matrix `dfdx' + if _rc==0 { + QuotedRowNames `bc' + local rnames `"`value'"' + if `"`meqs'"'!="" local reqs: roweq `bc', q + local i 1 + foreach row of loc rnames { + if `"`meqs'"'!="" { + local eq: word `i' of `reqs' + } + local col = colnumb(`dfdx',"`row'") + if `col'>=. | !`:list eq in meqs' { + mat `bc'[`i',1] = .y + mat `bc'[`i',2] = .y + mat `D'[`i',1] = .y + } + else { + mat `bc'[`i',1] =`dfdx'[1,`col'] + mat `bc'[`i',2] = (`dfdx'[2,`col'])^2 + if "`:word `col' of `dummy''"=="1" mat `D'[`i',1] = 1 + } + local ++i + } + c_local hasmargin 1 + } + mat `bc' = `bc', `D' +end + +program TransformCoefs + args bc coefs transform + local c = colsof(`bc') + forv j = 3/`c' { + gettoken v coefs : coefs + if inlist("`v'", "b", "ci_l", "ci_u") { + _TransformCoefs `bc' `j' 0 "" "" `"`transform'"' + } + else if "`v'"=="se" { + _TransformCoefs `bc' `j' 1 "abs" "" `"`transform'"' + } + else if "`v'"=="var" { + _TransformCoefs `bc' `j' 1 "" "^2" `"`transform'"' + } + } +end + +program _TransformCoefs + args bc j usedf abs sq transform + local r = rowsof(`bc') + gettoken coef rest : transform + gettoken f rest : rest + gettoken df rest : rest + while `"`coef'`f'`df'"'!="" { + if `"`df'`rest'"'=="" { // last element of list may be without coef + local df `"`f'"' + local f `"`coef'"' + local coef "" + } + local trcoefs `"`trcoefs'`"`coef'"' "' + if `usedf' { + local trs `"`trs'`"`df'"' "' + } + else { + local trs `"`trs'`"`f'"' "' + } + gettoken coef rest : rest + gettoken f rest : rest + gettoken df rest : rest + } + local trs : subinstr local trs "@" "\`b'", all + forv i = 1/`r' { + gettoken coef coefrest : trcoefs + gettoken tr trrest : trs + while `"`coef'`tr'"'!="" { + MatchCoef `"`coef'"' `bc' `i' + if `match' { + if `usedf' { + local b `bc'[`i',1] + local res `bc'[`i',`j'] + if `res'<. { + mat `res' = `res' * `abs'(`tr')`sq' + } + } + else { + local b `bc'[`i',`j'] + if `b'<. { + mat `b' = (`tr') + } + } + continue, break + } + gettoken coef coefrest : coefrest + gettoken tr trrest : trrest + } + } +end + +program MatchCoef + args eqx b i + if inlist(trim(`"`eqx'"'),"","*") { + c_local match 1 + exit + } + tempname tmp + mat `tmp' = `b'[`i',1...] + local eqi: roweq `tmp' + local xi: rown `tmp' + gettoken eq x : eqx, parse(:) + local eq: list clean eq + if `"`eq'"'==":" { // case 1: ":[varname]" + local x: list clean x + local eq + } + else if `"`x'"'=="" { // case 2: "varname" + local x `"`eq'"' + local eq + } + else { // case 3. "eqname:[varname]" + if `"`eq'"'=="_" local eq "__" + gettoken colon x : x, parse(:) + local x: list clean x + } + if `"`eq'"'=="" local eq "*" + if `"`x'"'=="" local x "*" + c_local match = match(`"`eqi'"', `"`eq'"') & match(`"`xi'"', `"`x'"') +end + +program NumberMlabels + args M mlabels + forv m = 1/`M' { + local num "(`m')" + local lab: word `m' of `macval(mlabels)' + if `"`macval(lab)'"'!="" { + local lab `"`num' `macval(lab)'"' + } + else local lab `num' + local labels `"`macval(labels)'`"`macval(lab)'"' "' + } + c_local mlabels `"`macval(labels)'"' +end + +program ModelEqCheck + args B eq m ccols + tempname Bsub + local a = (`m'-1)*`ccols'+1 + local b = `a' + `ccols'-1 + mat `Bsub' = `B'["`eq':",`a'..`b'] + local R = rowsof(`Bsub') + local value 0 + forv c = 1/`ccols' { + forv r = 1/`R' { + if `Bsub'[`r',`c']<. { + local value 1 + continue, break + } + } + } + c_local value `value' +end + +program Add2Vblock + args block col + foreach v of local col { + gettoken row block: block + local row "`row' `v'" + local row: list retok row + local vblock `"`vblock'"`row'" "' + } + c_local vblock `"`vblock'"' +end + +program CountNofEqs + args ms es + local m0 0 + local e0 0 + local i 0 + local eqs 0 + foreach m of local ms { + local ++i + local e: word `i' of `es' + if `m'!=`m0' | `e'!=`e0' { + local ++eqs + } + local m0 `m' + local e0 `e' + } + c_local value `eqs' +end + +program InsertAtVariables + args value type span M E width hline rtf rtfrowdefbrdrt rtfrowdefbrdrb rtfrowdef rtfemptyrow /// + title note discrete starlegend + if `type'==1 local atvars span + else { + local atvars span M E width hline + if `rtf' local atvars `atvars' rtfrowdefbrdrt rtfrowdefbrdrb rtfrowdef rtfemptyrow + if `type'!=2 local atvars `atvars' title note discrete starlegend + } + foreach atvar of local atvars { + StableSubinstr value `"`macval(value)'"' "@`atvar'" `"`macval(`atvar')'"' all + } + c_local value `"`macval(value)'"' +end + +program Abbrev + args width value abbrev + if c(stata_version)>=14 { + local substr udsubstr + local length udstrlen + } + else { + local substr substr + local length length + } + if "`abbrev'"!="" { + if `width'>32 { + local value = `substr'(`"`macval(value)'"',1,`width') + } + else if `width'>0 { + if `length'(`"`macval(value)'"')>`width' { + local value = abbrev(`"`macval(value)'"',`width') + } + } + } + c_local value `"`macval(value)'"' +end + +program MgroupsPattern + args mrow pattern + local i 0 + local m0 0 + local j 0 + foreach m of local mrow { + if `m'>=. { + local newpattern `newpattern' . + continue + } + if `m'!=`m0' { + local p: word `++i' of `pattern' + if `i'==1 local p 1 + if "`p'"=="1" local j = `j' + 1 + } + local newpattern `newpattern' `j' + local m0 `m' + } + c_local mgroupspattern `newpattern' +end + +program WriteCaption + args file delimiter stardetach row rowtwo labels starsrow span /// + abbrev colwidth delwidth starwidth repeat prefix suffix haslabcol2 + local c 0 + local nspan 0 + local c0 = 2 + `haslabcol2' + local spanwidth -`delwidth' + local spanfmt + local ncolwidth: list sizeof colwidth + foreach r of local row { + local rtwo: word `++c' of `rowtwo' + local colwidthj: word `=1+mod(`c'-1,`ncolwidth')' of `colwidth' + if `colwidthj'>0 local colfmt "%`colwidthj's" + else local colfmt + if "`r'"=="." { + local ++c0 + file write `file' `macval(delimiter)' `colfmt' (`""') + } + else if `"`span'"'=="" { + if ( "`r'"!="`lastr'" | "`rtwo'"!="`lastrtwo'" | `"`rowtwo'"'=="" ) { + local value: word `r' of `macval(labels)' + Abbrev `colwidthj' `"`macval(value)'"' "`abbrev'" + local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"' + InsertAtVariables `"`macval(value)'"' 1 "1" + } + else local value + if `:length local value'<245 { + local value: di `colfmt' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + if `:word `c' of `starsrow''==1 { + file write `file' `macval(stardetach)' _skip(`starwidth') + } + local lastr "`r'" + local lastrtwo "`rtwo'" + } + else { + local ++nspan + local spanwidth=`spanwidth'+`colwidthj'+`delwidth' + if `:word `c' of `starsrow''==1 { + local spanwidth = `spanwidth' + `starwidth' + if `"`macval(stardetach)'"'!="" { + local ++nspan + local spanwidth = `spanwidth' + `delwidth' + } + } + local nextrtwo: word `=`c'+1' of `rowtwo' + local nextr: word `=`c'+1' of `row' + if "`r'"!="." & /// + ("`r'"!="`nextr'" | "`rtwo'"!="`nextrtwo'" | `"`rowtwo'"'=="") { + local value: word `r' of `macval(labels)' + Abbrev `spanwidth' `"`macval(value)'"' "`abbrev'" + local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"' + InsertAtVariables `"`macval(value)'"' 1 "`nspan'" + if `spanwidth'>0 local spanfmt "%-`spanwidth's" + if `:length local value'<245 { + local value: di `spanfmt' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + InsertAtVariables `"`macval(repeat)'"' 1 "`c0'-`=`c0'+`nspan'-1'" + local repeatlist `"`macval(repeatlist)'`macval(value)'"' + local c0 = `c0' + `nspan' + local nspan 0 + local spanwidth -`delwidth' + } + } + } + c_local value `"`macval(repeatlist)'"' +end + +program WriteBegin + args file pre begin post + foreach line of local pre { + file write `file' `newline' `"`macval(line)'"' + local newline _n + } + file write `file' `macval(begin)' `macval(post)' +end + +program WriteEnd + args file end post post2 + file write `file' `macval(end)' + WriteStrLines `"`file'"' `"`macval(post)'"' + WriteStrLines `"`file'"' `"`macval(post2)'"' + file write `file' _n +end + +program WriteStrLines + args file lines + foreach line of local lines { + file write `file' `newline' `"`macval(line)'"' + local newline _n + } +end + +program WriteEqrow + args file delimiter stardetach value row span vwidth fmt_v /// + abbrev mwidth delwidth starwidth prefix suffix /// + haslabcol2 labcolwidth fmt_l2 + local nspan 1 + local spanwidth `vwidth' + local spanfmt + local c 0 + local nmwidth: list sizeof mwidth + if `"`span'"'=="" { + Abbrev `vwidth' `"`macval(value)'"' "`abbrev'" + local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"' + InsertAtVariables `"`macval(value)'"' 1 "1" + if `:length local value'<245 { + local value: di `fmt_v' `"`macval(value)'"' + } + file write `file' `"`macval(value)'"' + if `haslabcol2' { + file write `file' `macval(delimiter)' `fmt_l2' ("") + } + foreach r of local row { + local mwidthj: word `=1+mod(`c++',`nmwidth')' of `mwidth' + if `mwidthj'>0 local fmt_m "%`mwidthj's" + else local fmt_m + file write `file' `macval(delimiter)' `fmt_m' ("") + if `r'==1 { + file write `file' `macval(stardetach)' _skip(`starwidth') + } + } + } + else { + if `haslabcol2' { + local ++nspan + local spanwidth = `spanwidth' + `delwidth' + `labcolwidth' + } + foreach r of local row { + local mwidthj: word `=1+mod(`c++',`nmwidth')' of `mwidth' + local ++nspan + local spanwidth = `spanwidth' + `delwidth' + `mwidthj' + if `r'==1 { + local spanwidth = `spanwidth' + `starwidth' + if `"`macval(stardetach)'"'!="" { + local ++nspan + local spanwidth = `spanwidth' + `delwidth' + } + } + } + Abbrev `spanwidth' `"`macval(value)'"' "`abbrev'" + local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"' + InsertAtVariables `"`macval(value)'"' 1 "`nspan'" + if `spanwidth'>0 local spanfmt "%-`spanwidth's" + if `:length local value'<245 { + local value: di `spanfmt' `"`macval(value)'"' + } + file write `file' `"`macval(value)'"' + } +end + +prog WriteStrRow + args file mrow eqrow neq labels delimiter stardetach starsrow /// + abbrev colwidth delwidth starwidth + local c 0 + local ncolwidth: list sizeof colwidth + foreach mnum of local mrow { + local eqnum: word `++c' of `eqrow' + local colwidthj: word `=1+mod(`c'-1,`ncolwidth')' of `colwidth' + if `colwidthj'>0 local colfmt "%`colwidthj's" + else local colfmt + if "`mnum'"=="." { + file write `file' `macval(delimiter)' `colfmt' (`""') + continue + } + if ( "`mnum'"!="`lastmnum'" | "`eqnum'"!="`lasteqnum'" ) { + local value: word `=(`mnum'-1)*`neq'+`eqnum'' of `macval(labels)' + Abbrev `colwidthj' `"`macval(value)'"' "`abbrev'" + } + else local value + if `:length local value'<245 { + local value: di `colfmt' `"`macval(value)'"' + } + file write `file' `macval(delimiter)' `"`macval(value)'"' + if `:word `c' of `starsrow''==1 { + file write `file' `macval(stardetach)' _skip(`starwidth') + } + local lastmnum "`mnum'" + local lasteqnum "`eqnum'" + } +end + +program VarInList + args var unstack eqvar eq list + local value + local L: word count `macval(list)' + forv l = 1(2)`L' { + local lvar: word `l' of `macval(list)' + local lab: word `=`l'+1' of `macval(list)' + if "`unstack'"!="" { + if `"`var'"'==`"`lvar'"' { + local value `"`macval(lab)'"' + continue, break + } + } + else { + if substr(`"`lvar'"', 1, 2)=="_:" local lvar `"_`lvar'"' + if inlist(`"`lvar'"',`"`var'"',`"`eqvar'"',`"`eq':"') { + local value `"`macval(lab)'"' + continue, break + } + } + } + c_local value `"`macval(value)'"' +end + +program vFormat + args value fmt lz dmarker msign par + if substr(`"`fmt'"',1,1)=="a" { + SignificantDigits `fmt' `value' + } + else { + capt confirm integer number `fmt' + if !_rc { + local fmt %`=`fmt'+9'.`fmt'f + } + } + else if `"`fmt'"'=="%g" | `"`fmt'"'=="g" local fmt "%9.0g" + else if substr(`"`fmt'"',1,1)!="%" { + di as err `"`fmt': invalid format"' + exit 198 + } + local value: di `fmt' `value' + local value: list retok value + if "`lz'"=="" { + if index("`value'","0.")==1 | index("`value'","-0.") { + local value: subinstr local value "0." "." + } + } + if `"`macval(dmarker)'"'!="" { + if "`: set dp'"=="comma" local dp , + else local dp . + local val: subinstr local value "`dp'" `"`macval(dmarker)'"' + } + else local val `"`value'"' + if `"`msign'"'!="" { + if index("`value'","-")==1 { + local val: subinstr local val "-" `"`macval(msign)'"' + } + } + if `"`par'"'!="" { + tokenize `"`macval(par)'"' + local val `"`macval(1)'`macval(val)'`macval(2)'"' + } + c_local value `"`macval(val)'"' +end + +program SignificantDigits // idea stolen from outreg2.ado + args fmt value + local d = substr("`fmt'", 2, .) + if `"`d'"'=="" local d 3 + capt confirm integer number `d' + if _rc { + di as err `"`fmt': invalid format"' + exit 198 + } +// missing: format does not matter + if `value'>=. local fmt "%9.0g" +// integer: print no decimal places + else if (`value'-int(`value'))==0 { + local fmt "%12.0f" + } +// value in (-1,1): display up to 9 decimal places with d significant +// digits, then switch to e-format with d-1 decimal places + else if abs(`value')<1 { + local right = -int(log10(abs(`value'-int(`value')))) // zeros after dp + local dec = max(1,`d' + `right') + if `dec'<=9 { + local fmt "%12.`dec'f" + } + else { + local fmt "%12.`=min(9,`d'-1)'e" + } + } +// |values|>=1: display d+1 significant digits or more with at least one +// decimal place and up to nine digits before the decimal point, then +// switch to e-format + else { + local left = int(log10(abs(`value'))+1) // digits before dp + if `left'<=9 { + local fmt "%12.`=max(1,`d' - `left' + 1)'f" + } + else { + local fmt "%12.0e" // alternatively: "%12.`=min(9,`d'-1)'e" + } + } + c_local fmt "`fmt'" +end + +program Stars + args starlevels P + if inrange(`P',0,1) { + local nstar: word count `macval(starlevels)' + forv i=1(2)`nstar' { + local istarsym: word `i' of `macval(starlevels)' + local istar: word `=`i'+1' of `macval(starlevels)' + if `istar'<=`P' continue, break + local value "`macval(istarsym)'" + } + } + c_local value `"`macval(value)'"' +end + +program CellStars + args starlevels P par + Stars `"`macval(starlevels)'"' `P' + if `"`par'"'!="" { + tokenize `"`macval(par)'"' + local value `"`macval(1)'`macval(value)'`macval(2)'"' + } + c_local value `"`macval(value)'"' +end + +prog MakeSign + args value msign par starlevels P + if "`P'"!="" { + local factor = 0 + while 1 { + gettoken istar starlevels : starlevels + gettoken istar starlevels : starlevels + if `"`istar'"'=="" continue, break + if `P'<`istar' local factor = `factor' + 1 + else if `istar'==1 local factor = 1 + } + } + else local factor 1 + if `"`macval(msign)'"'=="" local msign "-" + if `value'<0 { + local val: di _dup(`factor') `"`macval(msign)'"' + } + else if `value'==0 local val: di _dup(`factor') "0" + else if `value'>0 & `value'<. local val: di _dup(`factor') "+" + else local val `value' + if `"`par'"'!="" { + tokenize `"`macval(par)'"' + local val `"`macval(1)'`macval(val)'`macval(2)'"' + } + c_local value `"`macval(val)'"' +end + +program DropOrKeep + args type b spec // type=0: drop; type=1: keep + capt confirm matrix `b' + if _rc { + exit + } + tempname res bt + local R = rowsof(`b') + forv i=1/`R' { + local hit 0 + mat `bt' = `b'[`i',1...] + foreach sp of local spec { + if rownumb(`bt', `"`sp'"')==1 { + local hit 1 + continue, break + } + } + if `hit'==`type' mat `res' = nullmat(`res') \ `bt' + } + capt mat drop `b' + capt mat rename `res' `b' +end + +program Order + args b spec + capt confirm matrix `b' + if _rc { + exit + } + tempname bt res + local eqlist: roweq `b', q + local eqlist: list uniq eqlist + mat `bt' = `b' + gettoken spi rest : spec + while `"`spi'"'!="" { + gettoken spinext rest : rest + if !index(`"`spi'"',":") { + local vars `"`vars'`"`spi'"' "' + if `"`spinext'"'!="" & !index(`"`spinext'"',":") { + local spi `"`spinext'"' + continue + } + foreach eq of local eqlist { + foreach var of local vars { + local splist `"`splist'`"`eq':`var'"' "' + } + local splist `"`splist'`"`eq':"' "' // rest + } + local vars + } + else local splist `"`spi'"' + gettoken sp splist : splist + while `"`sp'"'!="" { + local isp = rownumb(`bt', "`sp'") + if `isp' >= . { + gettoken sp splist : splist + continue + } + while `isp' < . { + mat `res' = nullmat(`res') \ `bt'[`isp',1...] + local nb = rowsof(`bt') + if `nb' == 1 { // no rows left in `bt' + capt mat drop `b' + capt mat rename `res' `b' + exit + } + if `isp' == 1 { + mat `bt' = `bt'[2...,1...] + } + else if `isp' == `nb' { + mat `bt' = `bt'[1..`=`nb'-1',1...] + } + else { + mat `bt' = `bt'[1..`=`isp'-1',1...] \ `bt'[`=`isp'+1'...,1...] + } + local isp = rownumb(`bt', "`sp'") + } + gettoken sp splist : splist + } + local spi `"`spinext'"' + } + capt mat `res' = nullmat(`res') \ `bt' + capt mat drop `b' + capt mat rename `res' `b' +end + +prog MakeQuotedFullnames + args names eqs + foreach name of local names { + gettoken eq eqs : eqs + local value `"`value'`"`eq':`name'"' "' + } + c_local value: list clean value +end + +program define QuotedRowNames + args matrix + capt confirm matrix `matrix' + if _rc { + c_local value "" + exit + } + tempname extract + if substr(`"`matrix'"',1,2)=="r(" { + local matrix0 `"`matrix'"' + tempname matrix + mat `matrix' = `matrix0' + } + local R = rowsof(`matrix') + forv r = 1/`R' { + mat `extract' = `matrix'[`r',1...] + local name: rownames `extract' + local value `"`value'`"`name'"' "' + } + c_local value: list clean value +end + +prog EqReplaceCons + args names eqlist eqlabels varlabels + local skip 0 + foreach v of local varlabels { + if `skip' { + local skip 0 + continue + } + local vlabv `"`vlabv'`"`v'"' "' + local skip 1 + } + local deqs: list dups eqlist + local deqs: list uniq deqs + local i 0 + foreach eq of local eqlist { + local ++i + if `"`eq'"'!=`"`last'"' { + gettoken eqlab eqlabels : eqlabels + } + local last `"`eq'"' + if `:list eq in deqs' | `"`eq'"'=="__" continue + local name: word `i' of `names' + local isinvlabv: list posof `"`eq':`name'"' in vlabv + if `"`name'"'=="_cons" & `isinvlabv'==0 { + local value `"`value'`space'`"`eq':`name'"' `"`eqlab'"'"' + local space " " + } + } + c_local value `"`value'"' +end + +prog UniqEqsAndDims + local n 0 + foreach el of local 1 { + if `"`macval(el)'"'!=`"`macval(last)'"' { + if `n'>0 local eqsdims "`eqsdims' `n'" + local eqs `"`macval(eqs)' `"`macval(el)'"'"' + local n 0 + } + local ++n + local last `"`macval(el)'"' + } + local eqsdims "`eqsdims' `n'" + c_local eqsdims: list clean eqsdims + c_local eqs: list clean eqs +end + +prog RerrangeEqs + args B eqlist eqs + local equ: list uniq eqlist + if `: list sizeof equ'==`: list sizeof eqs' exit // equations are in order + tempname C + foreach eq of local equ { + local i 0 + foreach eqi of local eqlist { + local ++i + if `"`eq'"'!="`eqi'" continue + mat `C' = nullmat(`C') \ `B'[`i',1...] + } + } + matrix drop `B' + matrix rename `C' `B' + local eqlist: roweq `B', q + local eqlist: list clean eqlist + UniqEqsAndDims `"`eqlist'"' + c_local eqlist `"`eqlist'"' + c_local eqs `"`eqs'"' + c_local eqsdims `"`eqsdims'"' +end + +prog InsertAtCols + args colnums row symb + if `"`symb'"'=="" local symb . + gettoken c rest : colnums + local i 0 + foreach r of local row { + local ++i + while `"`c'"'!="" { + if `c'<=`i' { + local value `"`value' `symb'"' + gettoken c rest : rest + } + else continue, break + } + local value `"`value' `"`r'"'"' + } + while `"`c'"'!="" { + local value `"`value' `symb'"' + gettoken c rest : rest + } + c_local value: list clean value +end + +prog GetVarnamesFromOrder + foreach sp of local 1 { + if index(`"`sp'"', ":") { + gettoken trash sp: sp, parse(:) + if `"`trash'"'!=":" { + gettoken trash sp: sp, parse(:) + } + } + local value `"`value'`space'`sp'"' + local space " " + } + c_local value `"`value'"' +end + +prog ParseIndicateOpts + syntax [anything(equalok)] [, Labels(str asis) ] + gettoken tok rest : anything, parse(" =") + while `"`macval(tok)'"'!="" { + if `"`macval(tok)'"'=="=" { + local anything `"`"`macval(anything)'"'"' + continue, break + } + gettoken tok rest : rest, parse(" =") + } + c_local indicate `"`macval(anything)'"' + c_local indicatelabels `"`macval(labels)'"' +end + +prog ProcessIndicateGrp + args i B nmodels ccols unstack yesno indicate + gettoken yes no : yesno + gettoken no : no + gettoken tok rest : indicate, parse(=) + while `"`macval(tok)'"'!="" { + if `"`macval(rest)'"'=="" { + local vars `"`indicate'"' + continue, break + } + if `"`macval(tok)'"'=="=" { + local vars `"`rest'"' + continue, break + } + local name `"`macval(name)'`space'`macval(tok)'"' + local space " " + gettoken tok rest : rest, parse(=) + } + if `"`macval(name)'"'=="" { + local name: word 1 of `"`vars'"' + } + ExpandEqVarlist `"`vars'"' `B' + local evars `"`value'"' + IsInModels `B' `nmodels' `ccols' "`unstack'" `"`macval(yes)'"' `"`macval(no)'"' `"`evars'"' + local lbls `"`macval(value)'"' + DropOrKeep 0 `B' `"`evars'"' + c_local indicate`i'name `"`macval(name)'"' + c_local indicate`i'lbls `"`macval(lbls)'"' + c_local indicate`i'eqs `"`eqs'"' +end + +prog IsInModels + args B nmodels ccols unstack yes no vars + capt confirm matrix `B' + if _rc { + forv i = 1/`nmodels' { + local lbls `"`macval(lbls)' `"`macval(no)'"'"' + } + c_local value `"`macval(lbls)'"' + if `"`unstack'"'!="" { + c_local eqs "__" + } + exit + } + local eqs: roweq `B', q + local eqs: list uniq eqs + tempname Bt Btt Bttt + forv j = 1/`nmodels' { + local stop 0 + mat `Bt' = `B'[1..., (`j'-1)*`ccols' + 1] + foreach eq of local eqs { + mat `Btt' = `Bt'[`"`eq':"',1] + if `"`unstack'"'!="" local stop 0 + foreach var of local vars { + if !index(`"`var'"',":") { + local var `"`eq':`var'"' + } + capt mat `Bttt' = `Btt'["`var'",1] + if _rc continue + forv i = 1/`= rowsof(`Bttt')' { + if `Bttt'[`i',1]<.z { + local lbls `"`macval(lbls)' `"`macval(yes)'"'"' + local stop 1 + continue, break + } + } + if `stop' continue, break + } + if `"`unstack'"'!="" { + if `stop'==0 { + local lbls `"`macval(lbls)' `"`macval(no)'"'"' + } + } + else if `stop' continue, break + } + if `"`unstack'"'=="" & `stop'==0 { + local lbls `"`macval(lbls)' `"`macval(no)'"'"' + } + } + c_local value `"`macval(lbls)'"' + if `"`unstack'"'!="" { + c_local eqs `"`eqs'"' + } +end + +prog ReorderEqsInIndicate + args nmodels eqs ieqs lbls + local neq: list sizeof ieqs + foreach eq of local eqs { + local i: list posof `"`eq'"' in ieqs + if `i' { + local pos `pos' `i' + } + } + forv m=1/`nmodels' { + foreach i of local pos { + local mi = (`m'-1)*`neq' + `i' + local lbl: word `mi' of `macval(lbls)' + local value `"`macval(value)'`"`macval(lbl)'"' "' + } + } + c_local value `"`macval(value)'"' +end + +prog ParseRefcatOpts + syntax [anything(equalok)] [, NOLabel Label(str) Below ] + c_local refcatbelow "`below'" + c_local norefcatlabel "`nolabel'" + c_local refcatlabel `"`macval(label)'"' + c_local refcat `"`macval(anything)'"' +end + +prog PrepareRefcat + gettoken coef rest : 1 + gettoken name rest : rest + while `"`macval(coef)'"'!="" { + local coefs `"`coefs'`"`coef'"' "' + local names `"`macval(names)'`"`macval(name)'"' "' + gettoken coef rest : rest + gettoken name rest : rest + } + c_local refcatcoefs `"`coefs'"' + c_local refcatnames `"`macval(names)'"' +end + +prog GenerateRefcatRow + args B ccols var eqs label + local models: coleq `B', q + local models: list uniq models + local col 1 + foreach model of local models { + foreach eq of local eqs { + local eqvar `"`eq':`var'"' + local row = rownumb(`B',"`eqvar'") + if `B'[`row', `col']<.z { + local value `"`macval(value)'`"`macval(label)'"' "' + } + else { + local value `"`macval(value)'`""' "' + } + } + local col = `col' + `ccols' + } + c_local value `"`macval(value)'"' +end + +prog ParseTransformSubopts + syntax anything(equalok) [, Pattern(string) ] + c_local transform `"`anything'"' + c_local transformpattern "`pattern'" +end + +prog MakeTransformList + args B transform + local R = rowsof(`B') + if `:list sizeof transform'<=2 { + gettoken f rest : transform + gettoken df : rest + forv i = 1/`R' { + local valuef `"`valuef'`f' "' + local valuedf `"`valuedf'`df' "' + } + c_local valuef: list retok valuef + c_local valuedf: list retok valuedf + exit + } + gettoken coef rest : transform + gettoken f rest : rest + gettoken df rest : rest + while (`"`coef'"'!="") { + if (`"`df'`rest'"'!="") { // last element of list may be without coef + ExpandEqVarlist `"`coef'"' `B' + local coef `"`value'"' + } + local coefs `"`coefs'`"`coef'"' "' + local fs `"`fs'`"`f'"' "' + local dfs `"`dfs'`"`df'"' "' + gettoken coef rest : rest + gettoken f rest : rest + gettoken df rest : rest + } + tempname b + local value + forv i = 1/`R' { + mat `b' = `B'[`i',1...] + local i 0 + local hit 0 + foreach coef of local coefs { + local f: word `++i' of `fs' + local df: word `i' of `dfs' + if (`"`df'`rest'"'=="") { + local valuef `"`valuef'`"`coef'"' "' // sic! (see above) + local valuedf `"`valuedf'`"`f'"' "' + local hit 1 + continue, break + } + foreach c of local coef { + if rownumb(`b', `"`c'"')==1 { + local valuef `"`valuef'`"`f'"' "' + local valuedf `"`valuedf'`"`df'"' "' + local hit 1 + continue, break + } + } + if `hit' continue, break + } + if `hit'==0 { + local valuef `"`valuef'"" "' + local valuedf `"`valuedf'"" "' + } + } + c_local valuef: list retok valuef + c_local valuedf: list retok valuedf +end + +prog TableIsAMess + local ccols = r(ccols) + local eq: roweq r(coefs), q + local eq: list uniq eq + if `: list sizeof eq'<=1 { + c_local value 0 + exit + } + tempname b bt + mat `b' = r(coefs) + gettoken eq : eq + mat `b' = `b'[`"`eq':"', 1...] + local R = rowsof(`b') + local models: coleq `b', q + local models: list uniq models + local value 0 + local i = 1 - `ccols' + foreach model of local models { + local i = `i' + `ccols' + if `i'==1 continue // skip first model + mat `bt' = `b'[1...,`i'] + local allz 1 + forv r = 1/`R' { + if `bt'[`r',1]<.z { + local allz 0 + continue, break + } + } + if `allz' { + local value 1 + continue, break + } + } + c_local value `value' +end + +prog ExpandEqVarlist + args list B append + ParseEqVarlistRelax `list' + QuotedRowNames `B' + local coefs `"`value'"' + local value + local ucoefs: list uniq coefs + capt confirm matrix `B' + if _rc==0 { + local eqs: roweq `B', q + } + else local eqs "__" + local ueqs: list uniq eqs + while `"`list'"'!="" { +// get next element + local eq0 + gettoken eqx list : list +// separate eq and x + gettoken eq x : eqx, parse(:) + local eq: list clean eq + if `"`eq'"'==":" { // case 1: ":[varname]" + local x: list clean x + local eq + } + else if `"`x'"'=="" { // case 2: "varname" + local x `"`eq'"' + local eq + } + else { // case 3. "eqname:[varname]" + local eq0 `"`eq'"' // eq specified by user + if `"`eq'"'=="_" local eq "__" + gettoken colon x : x, parse(:) + local x: list clean x + } +// match equations + local eqmatch + if `:list eq in ueqs' { // (note: evaluates to 1 if eq empty) + local eqmatch `"`eq'"' + } + else { + foreach e of local ueqs { + if match(`"`e'"', `"`eq'"') { + local eqmatch `"`eqmatch' `"`e'"'"' + } + } + if `"`eqmatch'"'=="" & "`relax'"=="" { + if !("`append'"!="" & `"`x'"'!="") { + di as err `"equation `eq0' not found"' + exit 111 + } + } + local eqmatch: list clean eqmatch + } + if `"`x'"'=="" { + foreach e of local eqmatch { + local value `"`value' `"`e':"'"' + } + continue + } +// match coefficients + local vlist +// - without equation + if `"`eq'"'=="" { + if `:list x in ucoefs' { + local value `"`value' `"`x'"'"' + continue + } + foreach coef of local ucoefs { + if match(`"`coef'"', `"`x'"') { + local vlist `"`vlist' `"`coef'"'"' + } + } + if `"`vlist'"'=="" { + if "`append'"!="" { + local appendlist `"`appendlist' `"__:`x'"'"' + local value `"`value' `"`x'"'"' + } + else if "`relax'"=="" { + di as err `"coefficient `x' not found"' + exit 111 + } + } + else { + local value `"`value' `vlist'"' + } + continue + } +// - within equations + local rest `"`eqs'"' + foreach coef of local coefs { + gettoken e rest : rest + if !`:list e in eqmatch' { + continue + } + if match(`"`coef'"', `"`x'"') { + local vlist `"`vlist' `"`e':`coef'"'"' + } + } + if `"`vlist'"'=="" { + if "`append'"!="" { + local appendlist `"`appendlist' `"`eq':`x'"'"' + local value `"`value' `"`eq':`x'"'"' + } + else if "`relax'"=="" { + di as err `"coefficient `eq0':`x' not found"' + exit 111 + } + } + else { + local value `"`value' `vlist'"' + } + } + if "`append'"!="" { + local nappend : list sizeof appendlist + if `nappend'>0 { + capt confirm matrix `B' + if _rc==0 { + tempname tmp + mat `tmp' = J(`nappend', colsof(`B'), .z) + mat rown `tmp' = `appendlist' + matrix `B' = `B' \ `tmp' + } + } + } + c_local value: list clean value +end + +program ParseEqVarlistRelax + syntax [anything] [, Relax ] + c_local list `"`anything'"' + c_local relax `relax' +end + +program IsInString //, rclass + args needle haystack + local trash: subinstr local haystack `"`needle'"' "", count(local count) + c_local strcount = `count' +end + +program MakeRtfRowdefs + args str srow sdetach vwidth mwidth haslc2 lc2width + local factor 120 + ParseRtfcmdNum `"`str'"' "trgaph" 0 + ParseRtfcmdNum `"`str'"' "trleft" 0 + if `vwidth'<=0 local vwidth 12 + if real(`"`trgaph'"')>=. local trgaph 0 + if real(`"`trleft'"')>=. local trleft 0 + local swidth = 3 + local vtwips = `vwidth'*`factor' + local stwips = `swidth'*`factor' + local ipos = `vtwips' + 2*`trgaph' + (`trleft') + local brdrt "\clbrdrt\brdrw10\brdrs" + local brdrb "\clbrdrb\brdrw10\brdrs" + local emptycell "\pard\intbl\ql\cell" + local rtfdef "\cellx`ipos'" + local rtfdefbrdrt "`brdrt'\cellx`ipos'" + local rtfdefbrdrb "`brdrb'\cellx`ipos'" + local rtfrow "`emptycell'" + if `haslc2' { + if `lc2width'<=0 local lc2width 12 + local lc2twips = `lc2width'*`factor' + local ipos = `ipos' + `lc2twips' + 2*`trgaph' + local rtfdef "`rtfdef'\cellx`ipos'" + local rtfdefbrdrt "`rtfdefbrdrt'`brdrt'\cellx`ipos'" + local rtfdefbrdrb "`rtfdefbrdrb'`brdrb'\cellx`ipos'" + local rtfrow "`rtfrow'`emptycell'" + } + local j 0 + local nmwidth: list sizeof mwidth + foreach i of local srow { + local mwidthj: word `=1 + mod(`j++',`nmwidth')' of `mwidth' + if `mwidthj'<=0 local mwidthj 12 + local mtwips = `mwidthj'*`factor' + local ipos = `ipos' + `mtwips' + 2*`trgaph' + if `i' & "`sdetach'"=="" local ipos = `ipos' + `stwips' + local rtfdef "`rtfdef'\cellx`ipos'" + local rtfdefbrdrt "`rtfdefbrdrt'`brdrt'\cellx`ipos'" + local rtfdefbrdrb "`rtfdefbrdrb'`brdrb'\cellx`ipos'" + local rtfrow "`rtfrow'`emptycell'" + if `i' & "`sdetach'"!="" { + local ipos = `ipos' + `stwips' + 2*`trgaph' + local rtfdef "`rtfdef'\cellx`ipos'" + local rtfdefbrdrt "`rtfdefbrdrt'`brdrt'\cellx`ipos'" + local rtfdefbrdrb "`rtfdefbrdrb'`brdrb'\cellx`ipos'" + local rtfrow "`rtfrow'`emptycell'" + } + } + c_local rtfrowdef "`rtfdef'" + c_local rtfrowdefbrdrt "`rtfdefbrdrt'" + c_local rtfrowdefbrdrb "`rtfdefbrdrb'" + c_local rtfemptyrow "`rtfdef'`rtfrow'" +end + +prog ParseRtfcmdNum + args str cmd default + local pos = index(`"`str'"', `"\\`cmd'"') + if `pos' { + local pos = `pos' + strlen(`"`cmd'"') + 1 + local digit = substr(`"`str'"',`pos',1) + if `"`digit'"'=="-" { + local value "`digit'" + local digit = substr(`"`str'"',`++pos',1) + } + while real(`"`digit'"')<. { + local value "`value'`digit'" + local digit = substr(`"`str'"',`++pos',1) + } + } + local value = real(`"`value'"') + if `value'>=. local value = `default' + c_local `cmd' `"`value'"' +end + +prog ParseLabCol2 + syntax [anything(equalok)] [ , Title(str asis) Width(numlist max=1 int >=0) ] + c_local labcol2 `"`macval(anything)'"' + c_local labcol2title `"`macval(title)'"' + c_local labcol2width `"`width'"' +end + +prog StableSubinstr + // use mata in stata>=9 because -:subinstr- breaks if length of + // is more than 502 characters + args new old from to all word + if c(stata_version)>=9 { + if "`all'"=="all" local cnt . + else if "`all'"=="" local cnt 1 + else error 198 + if "`word'"=="" local word str + else if "`word'"!="word" error 198 + mata: st_local("tmp", subin`word'(st_local("old"), /// + st_local("from"), st_local("to"), `cnt')) + c_local `new' `"`macval(tmp)'"' + } + else { + capt local tmp: subinstr local old `"`macval(from)'"' /// + `"`macval(to)'"', `all' `word' + if _rc==0 { + c_local `new' `"`macval(tmp)'"' + } + } +end + +prog MakeMMDdef + args varw labcol2 labcol2w modelw starsrow stardetachon starw + if "`varw'"=="0" | "`varw'"=="" local varw 1 + if "`labcol2w'"=="0" | "`labcol2w'"=="" local labcol2w 1 + if "`modelw'"=="0" | "`modelw'"=="" local modelw 1 + if "`starw'"=="0" | "`starw'"=="" local starw 1 + local varw = max(1,`varw') + local labcol2w = max(1,`labcol2w'-2) + if "`stardetachon'"=="1" local starw = max(1,`starw'-2) + else local starw = max(1,`starw') + + local mmddef `"| `:di _dup(`varw') "-"'"' + if "`labcol2'"=="1" { + local mmddef `"`mmddef' | :`:di _dup(`labcol2w') "-"':"' + } + local nmodelw: list sizeof modelw + local c 0 + foreach col of local starsrow { + local modelwj: word `=1+mod(`c++',`nmodelw')' of `modelw' + local modelwj = max(1,`modelwj'-2) + local mmddef `"`mmddef' | :`:di _dup(`modelwj') "-"'"' + if "`col'"=="1" { + if "`stardetachon'"=="1" { + local mmddef `"`mmddef': | :"' + } + local mmddef `"`mmddef'`:di _dup(`starw') "-"'"' + } + local mmddef `"`mmddef':"' + } + c_local value `"`mmddef' |"' +end + +program MatrixMode, rclass + capt syntax [, Matrix(str asis) e(str asis) r(str asis) rename(str asis) ] + if _rc | `"`matrix'`e'`r'"'=="" { + c_local matrixmode 0 + exit + } + if ((`"`matrix'"'!="") + (`"`e'"'!="") + (`"`r'"'!=""))>1 { + di as err "only one of matrix(), e(), or r() allowed" + exit 198 + } + ParseMatrixOpt `matrix'`e'`r' + if `"`e'"'!="" { + local name "e(`name')" + } + else if `"`r'"'!="" { + local name "r(`name')" + } + confirm matrix `name' + tempname bc + if "`transpose'"=="" { + mat `bc' = `name'' + } + else { + mat `bc' = `name' + } + QuotedRowNames `bc' + local rnames `"`value'"' + local eqs: roweq `bc', q + mat `bc' = `bc'' + local cols = colsof(`bc') + local cells + local space + gettoken fmti fmtrest : fmt, match(par) + gettoken rname rnames : rnames + gettoken eq eqs : eqs + forv i = 1/`cols' { + if `"`fmti'"'!="" { + local fmtopt `"f(`fmti') "' + gettoken fmti fmtrest : fmtrest, match(par) + if `"`fmti'"'=="" & `"`fmtrest'"'=="" { // recycle + gettoken fmti fmtrest : fmt, match(par) + } + } + else local fmtopt + if `"`eq'"'=="_" { + local lbl `"l(`"`rname'"')"' + } + else { + local lbl `"l(`"`eq':`rname'"')"' + } + local cells `"`cells'`space'c`i'(`fmtopt'`lbl')"' + local space " " + gettoken rname rnames : rnames + gettoken eq eqs : eqs + } + SubstEmptyEqname `bc' // replace empty eqname "_" by "__" + if `"`rename'"'!="" { + local rename : subinstr local rename "," "", all + RenameCoefs `bc' `"`rename'"' + } + return local names "`name'" + return scalar nmodels = 1 + return scalar ccols = `cols' + return matrix coefs = `bc' + c_local matrixmode 1 + c_local cells (`cells') +end + +program ParseMatrixOpt + syntax name [, Fmt(str asis) Transpose ] + c_local name `"`namelist'"' + c_local fmt `"`fmt'"' + c_local transpose `"`transpose'"' +end + +program CompileVarl + syntax [, vname(str asis) interaction(str) ] + gettoken vi vname: vname, parse("#") + while (`"`vi'"') !="" { + local xlabi + if `"`vi'"'=="#" { + local xlabi `"`macval(interaction)'"' + } + else if strpos(`"`vi'"',".")==0 { + capt confirm variable `vi', exact + if _rc==0 { + local xlabi: var lab `vi' + } + } + else { + gettoken li vii : vi, parse(".") + gettoken dot vii : vii, parse(".") + capt confirm variable `vii', exact + if _rc==0 { + capt confirm number `li' + if _rc { + local xlabi: var lab `vii' + if (`"`macval(xlabi)'"'=="") local xlabi `"`vii'"' + if substr(`"`li'"',1,1)=="c" /// + local li = substr(`"`li'"',2,.) + if (`"`li'"'!="") local xlabi `"`li'.`macval(xlabi)'"' + } + else { + local viilab : value label `vii' + if `"`viilab'"'!="" { + local xlabi: label `viilab' `li' + } + else { + local viilab: var lab `vii' + if (`"`macval(viilab)'"'=="") local viilab `"`vii'"' + local xlabi `"`macval(viilab)'=`li'"' + } + } + } + } + if `"`macval(xlabi)'"'=="" { + local xlabi `"`vi'"' + } + local xlab `"`macval(xlab)'`macval(xlabi)'"' + gettoken vi vname: vname, parse("#") + } + c_local varl `"`macval(xlab)'"' +end + +if c(stata_version)<11 exit +version 11 +mata: +mata set matastrict on + +void estout_omitted_and_base() +{ + real colvector p + real matrix bc + string matrix rstripe, cstripe + string colvector coefnm + + bc = st_matrix(st_local("bc")) + rstripe = st_matrixrowstripe(st_local("bc")) + cstripe = st_matrixcolstripe(st_local("bc")) + coefnm = rstripe[,2] + //coefnm = subinstr(coefnm,"bn.", ".") // *bn. + //coefnm = subinstr(coefnm,"bno.", "o.") // *bno. + p = J(rows(bc), 1, 1) + if (st_local("omitted")=="") { + p = p :* (!strmatch(coefnm, "*o.*")) + } + else { + coefnm = substr(coefnm, 1:+2*(substr(coefnm, 1, 2):=="o."), .) // o. + coefnm = subinstr(coefnm, "o.", ".") // *o. + } + if (st_local("baselevels")=="") { + p = p :* (!strmatch(coefnm, "*b.*")) + } + else { + coefnm = subinstr(coefnm, "b.", ".") // *b. + } + if (any(p)) { + st_matrix(st_local("bc"), select(bc, p)) + st_matrixrowstripe(st_local("bc"), select((rstripe[,1], coefnm), p)) + st_matrixcolstripe(st_local("bc"), cstripe) + st_local("hasbc", "1") + } + else { + st_local("hasbc", "0") + } +} + +void estout_rown_hasblanks(string scalar lnm, string rowvector m) +{ + real scalar j + + for (j=1;j<=2;j++) { + if (m[j]=="") return + if (any(strpos(st_matrixrowstripe(m[j])[,2], " "))) { + st_local(lnm, "1") + return + } + } +} + +void estout_mat_capp(string scalar m1, string rowvector m) +{ + real scalar i, j + string scalar key, val + string colvector rown + transmorphic A + + // replace rownames that contain blanks + A = asarray_create() + asarray_notfound(A, "") + for (j=1;j<=2;j++) { + rown = st_matrixrowstripe(m[j])[,2] + for (i=rows(rown);i;i--) { + val = rown[i] + if (strpos(val, " ")) { + key = subinstr(val, " ", "_") + asarray(A, key, val) + rown[i] = key + } + st_matrixrowstripe(m[j], (st_matrixrowstripe(m[j])[,1],rown)) + } + } + // apply mat_capp + stata("mat_capp " + st_local("0")) + // restore original names + rown = st_matrixrowstripe(m1)[,2] + for (i=rows(rown);i;i--) { + val = asarray(A, rown[i]) + if (val!="") rown[i] = val + } + st_matrixrowstripe(m1, (st_matrixrowstripe(m1)[,1], rown)) +} +end + +if c(stata_version)<14 exit +version 14 +mata: +mata set matastrict on + +void estout_rtfencode(string scalar lname) +{ // non-ASCII characters are translated to "\u#?" where # is the base 10 code + // (up to code 65535; replacement character is used for larger codes) + real scalar n, l, i, ci + real rowvector c + string scalar s, snew + string rowvector S + + s = st_local(lname) + if (isascii(s)) return + l = ustrlen(s) + snew = "" + for (n=1;n<=l;n=n+200) { + c = frombase(16, /// possible hex formats: \uhhhh or \Uhhhhhhhh + substr(tokens(subinstr(ustrtohex(s, n), "\", " ")), 2, .)) + i = length(c) + S = J(1,i,"") + for (;i;i--) { + ci = c[i] + if (ci<=127) S[i] = char(ci) + else if (ci<=32767) S[i] = "\u" + strofreal(ci) + "?" + else if (ci<=65535) S[i] = "\u" + strofreal(ci-65536) + "?" + else S[i] = "\u65533?" // unicode replacement character \ufffd + } + snew = snew + invtokens(S, "") + } + st_local(lname, snew) +} +end + diff --git a/data/ado/e/estout.hlp b/data/ado/e/estout.hlp new file mode 100644 index 0000000..7467156 --- /dev/null +++ b/data/ado/e/estout.hlp @@ -0,0 +1,2452 @@ +{smcl} +{* 01feb2017}{...} +{cmd:help estout}{right:also see: {helpb esttab}, {helpb eststo}, {helpb estadd}, {helpb estpost}} +{right: {browse "http://repec.sowi.unibe.ch/stata/estout/"}} +{hline} + +{title:Title} + +{p 4 4 2}{hi:estout} {hline 2} Making regression tables from stored estimates + + +{title:Table of contents} + + {help estout##syn:Syntax} + {help estout##des:Description} + {help estout##opt:Options} + {help estout##exa:Examples} + {help estout##rem:Remarks} + {help estout##ret:Saved results} + {help estout##ref:Backmatter} + +{marker syn} +{title:Syntax} + +{p 8 15 2} +{cmd:estout} [ {help estout##what:{it:what}} ] + [ {cmd:using} {it:filename} ] + [ {cmd:,} {help estout##opt0:{it:options}} ] + +{marker what} + {it:what}{col 30}description + {hline 70} + {it:namelist}{col 30}{...} +tabulate stored estimation sets; {it:namelist} is +{col 32}a name, a list of names, or {cmd:_all}; the {cmd:*} and +{col 32}{cmd:?} wildcards are allowed; a name may also be +{col 32}{cmd:.}, meaning the current (active) estimates + + {cmdab:m:atrix:(}{it:name}[{cmd:,} {it:subopts}]{cmd:)}{col 30}{...} +tabulate matrix {it:name} + {cmd:e(}{it:name}[{cmd:,} {it:subopts}]{cmd:)}{col 30}{...} +tabulate matrix {cmd:e(}{it:name}{cmd:)} + {cmd:r(}{it:name}[{cmd:,} {it:subopts}]{cmd:)}{col 30}{...} +tabulate matrix {cmd:r(}{it:name}{cmd:)} + {it:subopts}: + {helpb estout##mfmt:{ul:f}mt}{cmd:(}{it:fmtlist}{cmd:)}{col 30}{...} +set the display format(s) + {helpb estout##mtranspose:{ul:t}ranspose}{col 30}{...} +tabulate transposed matrix + {hline 70} + +{marker opt0} + {it:options}{col 38}description + {hline 70} + Parameter statistics + {helpb estout##cells:{ul:c}ells}{cmd:(}{it:elements and subopts}{cmd:)}{col 38}{...} +contents of the table cells, where +{col 40}an {it:element}'s {it:subopts} are in paren- +{col 40}theses, i.e. {it:element}[{cmd:(}{it:subopts}{cmd:)}] + {it:elements}: + {cmd:b}{col 38}raw coefficient (point estimate) + {cmd:se}{col 38}standard error + {cmd:var}{col 38}variance + {cmd:t}{col 38}t or z statistic + {cmd:z}{col 38}t or z statistic (synonym for {cmd:t}) + {cmd:p}{col 38}p-value + {cmd:ci}{col 38}confidence interval + {cmd:ci_l}{col 38}lower bound of confidence interval + {cmd:ci_u}{col 38}upper bound of confidence interval + {cmd:_star}{col 38}"significance stars" + {cmd:_sign}{col 38}sign of point estimate + {cmd:_sigsign}{col 38}sign and significance of estimate + {cmd:.}{col 38}null element (empty cell) + {cmd:&}{col 38}combine elements in single cell + {it:myel}{col 38}results from {cmd:e(}{it:myel}{cmd:)} + {it:myel}{cmd:[}{it:#}{cmd:]}{col 38}results from row {it:#} in {cmd:e(}{it:myel}{cmd:)} + {it:myel}{cmd:[}{it:rowname}{cmd:]}{col 38}results from row {it:rowname} in {cmd:e(}{it:myel}{cmd:)} + + + {it:subopts} (for each {it:element}, + except for {cmd:.} and {cmd:&}): + [{cmdab:no:}]{helpb estout##cstar:{ul:s}tar}{col 38}{...} +attach "significance stars" + {helpb estout##cfmt:{ul:f}mt}{cmd:(}{it:{help estout##fmt:fmt}} [{it:{help estout##fmt:fmt}} ...]{cmd:)}{col 38}{...} +set the display format(s) + {helpb estout##clabel:{ul:l}abel}{cmd:(}{it:string}{cmd:)}{col 38}{...} +define a label for {it:element} + {helpb estout##cpar:par}[{cmd:(}{it:l} {it:r}{cmd:)}] | {cmd:nopar}{col 38}{...} +place results in parentheses + {helpb estout##cvacant:{ul:v}acant}{cmd:(}{it:string}{cmd:)}{col 38}{...} +print {it:string} if coefficient is absent + {helpb estout##cdrop:{ul:d}rop}{cmd:(}{it:droplist}{cmd:)}{col 38}{...} +drop certain individual results + {helpb estout##ckeep:{ul:k}eep}{cmd:(}{it:keeplist}{cmd:)}{col 38}{...} +keep certain individual results + {helpb estout##cpattern:{ul:pat}tern}{cmd:(}{it:pattern}{cmd:)}{col 38}{...} +model selection + {helpb estout##cpvalue:{ul:pval}ue}{cmd:(}{it:name}{cmd:)}{col 38}{...} +set p-values for {cmd:star} (default: {cmd:p}) + [{cmd:no}]{helpb estout##cabs:abs}{col 38}{...} +use absolute t-statistics + [{cmdab:no:}]{helpb estout##ctranspose:{ul:t}ranspose}{col 38}{...} +transpose {cmd:e(}{it:myel}{cmd:)} for tabulation + + {helpb estout##drop:{ul:d}rop}{cmd:(}{it:droplist}{cmd:)}{col 38}{...} +drop individual coefficients + [{cmdab:no:}]{helpb estout##omitted:{ul:omit}ted}{col 38}{...} +include omitted coefficients + [{cmdab:no:}]{helpb estout##baselevels:{ul:base}levels}{col 38}{...} +include base levels + {helpb estout##keep:{ul:k}eep}{cmd:(}{it:keeplist}{cmd:)}{col 38}{...} +keep individual coefficients + {helpb estout##order:{ul:o}rder}{cmd:(}{it:orderlist}{cmd:)}{col 38}{...} +change order of coefficients + {helpb estout##indicate:{ul:i}ndicate}{cmd:(}{it:groups} [{cmd:,} {it:subopt}]{cmd:)}{col 38}{...} +indicate presence of parameters + {it:subopt}: {cmdab:l:abels(}{it:yes} {it:no}{cmd:)}{col 38}{...} +redefine "Yes" and "No" labels + {helpb estout##rename:{ul:ren}ame}{cmd:(}{it:old} {it:new} [{it:old} {it:new} ...]{cmd:)}{col 38}{...} +rename individual coefficients + {helpb estout##equations:{ul:eq}uations}{cmd:(}{it:eqmatchlist}{cmd:)}{col 38}{...} +match the models' equations + {helpb estout##eform:eform}[{cmd:(}{it:pattern}{cmd:)}] | {cmd:noeform}{col 38}{...} +report exponentiated coefficients + {helpb estout##transform:{ul:tr}ansform}{cmd:(}{it:list} [{cmd:,} {it:subopt}]{cmd:)}{col 38}{...} +apply transformations to coefficients + {it:subopt}: {cmdab:p:attern:(}{it:pattern}{cmd:)}]{cmd:)}{col 38}{...} +select models + {helpb estout##margin:{ul:m}argin}[{cmd:(}{cmd:u}|{cmd:c}|{cmd:p}{cmd:)}] | {cmdab:nom:argin}{col 38}{...} +report marginal effects after {helpb mfx} + {helpb estout##discrete:{ul:di}screte}{cmd:(}{it:string}{cmd:)} | {cmdab:nodi:screte}{col 38}{...} +identify 0/1 variables (if {cmd:margin}) + {helpb estout##meqs:{ul:meq}s}{cmd:(}{it:eq_list}{cmd:)}{col 38}{...} +select equations for marginal effects + {helpb estout##dropped:dropped}[{cmd:(}{it:string}{cmd:)}] | {cmd:nodropped}{col 38}{...} +indicate null coefficients as dropped + {helpb estout##level:level}{cmd:(}{it:#}{cmd:)}{col 38}{...} +set level for confidence intervals + + Summary statistics + {helpb estout##stats:{ul:s}tats}{cmd:(}{it:scalarlist}[{cmd:,} {it:subopts}]{cmd:)}{col 38}{...} +display summary statistics at the +{col 38}bottom of the table + {it:subopts}: + {helpb estout##statsfmt:{ul:f}mt}{cmd:(}{it:{help estout##fmt:fmt}} [{it:{help estout##fmt:fmt}} ...]{cmd:)}{col 38}{...} +set the display formats + {helpb estout##statslabels:{ul:l}abels}{cmd:(}{it:strlist}[{cmd:,} {col 38}{...} +label the summary statistics + {it:{help estout##lsub0:label_subopts}}]{cmd:)} + {helpb estout##statsstar:{ul:s}tar}[{cmd:(}{it:sca'list}{cmd:)}] | {cmdab:nos:tar}{col 38}{...} +denote the model significance + {helpb estout##statslayout:{ul:lay}out}{cmd:(}{it:array}{cmd:)}{col 38}{...} +arrange the summary statistics + {helpb estout##statspchar:{ul:pc}har}{cmd:(}{it:symbol}{cmd:)}{col 38}{...} +placeholder in {cmdab:layout()}; default is {cmd:@} + + Significance stars + {helpb estout##starlevels:{ul:starl}evels}{cmd:(}{it:levelslist}{cmd:)}{col 38}{...} +define thresholds and symbols, +{col 40}where '{it:levelslist}' is '{it:symbol} {it:#} +{col 40}[{it:symbol} {it:#} ...]' with {it:#} in (0,1] and +{col 40}listed in descending order + {helpb estout##stardrop:{ul:stard}rop}{cmd:(}{it:droplist}{cmd:)}{col 38}{...} +drop stars for individual coefs + {helpb estout##starkeep:{ul:stark}eep}{cmd:(}{it:keeplist}{cmd:)}{col 38}{...} +keep stars for individual coefs + [{cmdab:no:}]{helpb estout##stardetach:{ul:stard}etach}{col 38}{...} +display the stars in their own column + + Layout + {helpb estout##varwidth:{ul:var}width}{cmd:(}{it:#}{cmd:)}{col 38}{...} +set width of the table's left stub + {helpb estout##modelwidth:{ul:model}width}{cmd:(}{it:#} [{it:#} ...]{cmd:)}{col 38}{...} +set width of the results columns + [{cmdab:no:}]{helpb estout##unstack:{ul:uns}tack}{col 38}{...} +place equations from multiple- +{col 40}equation models in separate columns + {helpb estout##begin:{ul:beg}in}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify the beginning of the rows + {helpb estout##delimiter:{ul:del}imiter}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify the column delimiter + {helpb estout##end:end}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify the ending of the table rows + {helpb estout##incelldel:{ul:incell}delimiter}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify delimiter within cell + {helpb estout##dmarker:{ul:dm}arker}{cmd:(}{it:string}{cmd:)}{col 38}{...} +define the decimal marker + {helpb estout##msign:{ul:ms}ign}{cmd:(}{it:string}{cmd:)}{col 38}{...} +define the minus sign + [{cmd:no}]{helpb estout##lz:lz}{col 38}{...} +print the leading zero of fixed +{col 40}format numbers in (-1,1) + {helpb estout##extracols:{ul:extra}cols}{cmd:(}{it:numlist}{cmd:)}{col 38}{...} +add empty column to the table + {helpb estout##substitute:{ul:sub}stitute}{cmd:(}{it:subst}{cmd:)}{col 38}{...} +apply end-of-pipe substitutions, where +{col 40}'{it:subst}' is '{it:from} {it:to} [{it:from} {it:to} ... ]' + + Labeling + [{cmdab:no:}]{helpb estout##label:{ul:l}abel}{col 38}{...} +make use of variable labels + [{cmdab:no:}]{helpb estout##abbrev:{ul:ab}brev}{col 38}{...} +abbreviate long names and labels + [{cmdab:no:}]{helpb estout##wrap:wrap}{col 38}{...} +wrap long labels (if space permits) + {helpb estout##interaction:{ul:interact}ion}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify interaction operator + {helpb estout##title:{ul:ti}tle}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify a title for the table + {helpb estout##note:note}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify a note for the table + [{cmdab:no:}]{helpb estout##legend:{ul:le}gend}{col 38}{...} +add a significance symbols legend + {helpb estout##prehead:{ul:preh}ead}{cmd:(}{it:strlist}{cmd:)}{col 38}{...} +add text before the table heading + {helpb estout##prehead:{ul:posth}ead}{cmd:(}{it:strlist}{cmd:)}{col 38}{...} +add text after the table heading + {helpb estout##prehead:{ul:pref}oot}{cmd:(}{it:strlist}{cmd:)}{col 38}{...} +add text before the table footer + {helpb estout##prehead:{ul:postf}oot}{cmd:(}{it:strlist}{cmd:)}{col 38}{...} +add text after the table footer + {helpb estout##hlinechar:{ul:hl}inechar}{cmd:(}{it:string}{cmd:)}{col 38}{...} +specify look of {cmd:@hline} + {helpb estout##varlabels:{ul:varl}abels}{cmd:(}{it:matchlist}[{cmd:,} {it:sub.}]{cmd:)} {col 38}{...} +relabel the parameters + {it:subopts}: + {cmdab:bl:ist:(}{it:matchlist}{cmd:)}{col 38}{...} +assign prefixes to certain rows + {cmdab:el:ist:(}{it:matchlist}{cmd:)}{col 38}{...} +assign suffixes to certain rows + {it:{help estout##lsub0:label_subopts}} + {helpb estout##labcol2:{ul:labcol}2}{cmd:(}{it:strlist}[{cmd:,} {it:subopts}]{cmd:)} {col 38}{...} +add a second labeling column + {it:subopts}: + {cmdab:t:itle:(}{it:strlist}{cmd:)}{col 38}{...} +add column title in table header + {cmdab:w:idth:(}{it:#}{cmd:)}{col 38}{...} +set width of column + {helpb estout##refcat:{ul:ref}cat}{cmd:(}{it:matchlist}[{cmd:,} {it:subopts}]{cmd:)} {col 38}{...} +add reference category information + {it:subopts}: + {cmdab:l:abel:(}{it:string}{cmd:)} | {cmdab:nol:abel}{col 38}{...} +redefine the "ref." label + {cmdab:b:elow}{col 38}{...} +change positioning of refcat + {helpb estout##mlabels:{ul:ml}abels}{cmd:(}{it:strlist}[{cmd:,} {it:subopts}]{cmd:)}{col 38}{...} +label the models + {it:subopts}: + [{cmdab:no:}]{cmdab:dep:vars}{col 38}{...} +use the name/label of the dependent +{col 42}variable as model label + [{cmdab:no:}]{cmdab:ti:tles}{col 38}{...} +use estimates title as model label + [{cmdab:no:}]{cmdab:num:bers}{col 38}{...} +number models labels consecutively + {it:{help estout##lsub0:label_subopts}} + {helpb estout##collabels:{ul:coll}abels}{cmd:(}{it:strlist}[{cmd:,} {col 38}{...} +label the columns within models + {it:{help estout##lsub0:label_subopts}}]{cmd:)} + {helpb estout##eqlabels:{ul:eql}abels}{cmd:(}{it:strlist}[{cmd:,} {it:subopts}]{cmd:)}{col 38}{...} +label the equations + {it:subopts}: + [{cmdab:no:}]{cmdab:m:erge}{col 38}{...} +merge equation and parameter labels + {it:{help estout##lsub0:label_subopts}} + {helpb estout##mgroups:{ul:mgr}oups}{cmd:(}{it:strlist}[{cmd:,} {it:subopts}]{cmd:)}{col 38}{...} +define and label groups of models + {it:subopts}: + {cmdab:pat:tern:(}{it:pattern}{cmd:)}{col 38}{...} +define the grouping of the models + {it:{help estout##lsub0:label_subopts}} + {helpb estout##numbers:{ul:num}bers}[{cmd:(}{it:l} {it:r}{cmd:)}] | {cmdab:nonum:bers}{col 38}{...} +add a row containing model numbers + + Output + [{cmdab:no:}]{helpb estout##replace:{ul:r}eplace}{col 38}{...} +overwrite an existing file + [{cmdab:no:}]{helpb estout##append:{ul:a}ppend}{col 38}{...} +append the output to an existing file + [{cmdab:no:}]{helpb estout##type:{ul:ty}pe}{col 38}{...} +print the table in the results window + [{cmd:no}]{helpb estout##showtabs:showtabs}{col 38}{...} +display tabs as {cmd:}s + {helpb estout##topfile:{ul:top}file}{cmd:(}{it:filename}{cmd:)}{col 38}{...} +insert file contents above table + {helpb estout##topfile:{ul:bot}tomfile}{cmd:(}{it:filename}{cmd:)}{col 38}{...} +insert file contents below table + + Defaults + {helpb estout##style:{ul:sty}le}{cmd:(}{it:style}{cmd:)}{col 38}{...} +specify a style for the output table + + {it:styles}: + {cmd:smcl}{col 38}SMCL formatted table (screen default) + {cmd:tab}{col 38}tab delimited table (export default) + {cmd:fixed}{col 38}fixed format table + {cmd:tex}{col 38}table for use with LaTeX + {cmd:html}{col 38}table for use with HTML + {it:mystyle}{col 38}user defined addition + {hline 70} + +{marker lsub0} + {it:{help estout##lsub:label_subopts}}{col 38}Description + {hline 70} + [{cmd:no}]{cmd:none}{col 38}{...} +suppress the labels + {cmdab:p:refix:(}{it:string}{cmd:)}{col 38}{...} +add a common prefix + {cmdab:s:uffix:(}{it:string}{cmd:)}{col 38}{...} +add a common suffix + {cmdab:b:egin:(}{it:strlist}{cmd:)}{col 38}{...} +add an overall prefix + [{cmdab:no:}]{cmdab:f:irst}{col 38}{...} +print the first occurrence of {cmd:begin()} + {cmdab:e:nd:(}{it:strlist}{cmd:)}{col 38}{...} +add an overall suffix + [{cmdab:no:}]{cmdab:l:ast}{col 38}{...} +print the last occurrence of {cmd:end()} + {cmdab:r:eplace}{col 38}{...} +replace global {cmd:begin()}/{cmd:end()} + [{cmd:no}]{cmd:span}{col 38}{...} +span columns if appropriate + {cmdab:er:epeat:(}{it:string}{cmd:)}{col 38}{...} +add a "span" suffix + {cmd:lhs(}{it:string}{cmd:)}{col 38}{...} +label the table's left stub + {hline 70} + +{marker des} +{title:Description} + +{p 4 4 2} + {cmd:estout} assembles a table of coefficients, "significance + stars", summary statistics, standard errors, t- or z-statistics, p-values, + confidence intervals, and other statistics for one or more models + previously fitted and stored by {helpb estimates store} or {helpb eststo}. + It then displays the table in Stata's results window or writes it to a text + file specified by {cmd:using}. The default is to use {help smcl:SMCL} + formatting tags and horizontal lines to structure the table. However, + if {cmd:using} is specified, a tab-delimited table without lines + is produced. + +{p 4 4 2} + {it:namelist} provides the names of the stored estimation + sets to be tabulated. You may use the {cmd:*} and {cmd:?} wildcards in + {it:namelist}. The results estimated last may be indicated by a period + ({cmd:.}), even if they have not yet been stored. If no model is + specified, {cmd:estout} tabulates the estimation sets stored by + {cmd:eststo} (see help {helpb eststo}) or, if no such estimates are + present, the currently active estimates (i.e. the model fit last). + {cmd:estout} may be used after any estimation command that + returns its results in {cmd:e()}. + +{p 4 4 2} + See the {help estout##intro:Introduction} in the + {help estout##exa:Examples} section for an introduction on using + {cmd:estout}. See help {helpb estimates} for general information + about managing estimation results. Furthermore, see help {helpb eststo} + for an alternative to the {cmd:estimates store} command. + +{p 4 4 2} + The default for {cmd:estout} is to produce a plain + table containing point estimates. Producing a fully formatted + end-product may involve specifying many options. However, note that a + simple-to-use {cmd:estout} wrapper producing pre-formatted + publication style tables is available as {helpb esttab}. Furthermore, + use {helpb estadd} to make additional results available for + tabulation (such as the standardized coefficients or the means and + standard deviations of the regressors) and {helpb estpost} to + tabulate results from non-estimation commands such as {helpb summarize} + or {helpb tabulate}. + +{p 4 4 2} + {cmd:estout} can also be used to tabulate the contents of a Stata + matrix (see help {helpb matrix}). Type {cmd:estout marix(}{it:name}{cmd:)}, + where {it:name} is the name of the matrix, instead of providing a + {it:namelist} of stored estimation sets. See the + {help estout##ex7:examples} below. Alternatively, you may also specify + {cmd:e(}{it:name}{cmd:)} or {cmd:r(}{it:name}{cmd:)} to tabulate an + {cmd:e()}-matrix or an {cmd:r()}-matrix. The {cmd:cells()} option is + disabled if tabulating a matrix. + +{p 4 4 2} + Programms similar to {cmd:estout} include {cmd:outreg} by John Luke + Gallup, {cmd:outreg2} by Roy Wada, {cmd:modltbl} by John H. Tyler, + {cmd:mktab} by Nicholas Winter, {cmd:outtex} by Antoine Terracol, or + {cmd:est2tex} by Marc Muendler. Also see Newson (2003) for a very + appealing approach. + +{marker opt} +{title:Options} + + Contents + + {help estout##par:Parameter statistics} + {help estout##sum:Summary statistics} + {help estout##sig:Significance stars} + {help estout##lay:Layout} + {help estout##lab:Labeling} + {help estout##out:Output} + {help estout##def:Defaults} + {it:{help estout##lsub:label_subopts}} + {it:{help estout##msub:matrix_subopts}} +{marker par} +{dlgtab:Parameter statistics} +{marker cells} +{p 4 8 2} + {cmd:cells(}{it:array}{cmd:)} specifies the parameter statistics to be + reported and how they are to be arranged. The default is for cells to + report point estimates only, i.e. {cmd:cells(b)}. {cmd:cells(none)} may + be used to completely suppress the printing of parameter statistics. + Alternatively, {cmd:cells(b se)} would result in the reporting of point + estimates and standard errors. Multiple statistics are placed in + separate rows beneath one another by default. However, elements of + {it:array} that are listed in quotes or in parentheses, e.g. + {bind:{cmd:"b se"}} or {bind:{cmd:`"b se"'}} or {bind:{cmd:(b se)}}, + are placed beside one another. For example, {bind:{cmd:cells("b p" se)}} + or, equivalently, {bind:{cmd:cells((b p) se)}} would produce a + table with point estimates and p-values beside one another in first row + and standard errors in the second row beneath the point estimates. + +{p 8 8 2} + The parameter statistics available are {cmd:b} (point estimates), + {cmd:se} (standard errors), {cmd:var} (variance), {cmd:t} + (t/z-statistics), {cmd:z} (synonym for {cmd:t}), {cmd:p} (p-values), and + {cmd:ci} (confidence + intervals; to display the lower and upper bounds in separate cells use + {cmd:ci_l} and {cmd:ci_u}). Any additional parameter statistics + included in the {cmd:e()}-returns for the models can be tabulated as + well. If, for example, {cmd:e(beta)} contains the standardized + coefficients, type {cmd:cells(beta)} to tabulate them (use + {helpb estadd} to add statistics such as the standardized coefficients to the + {cmd:e()}-returns of a model). The syntax {it:name}{cmd:[}{it:#}{cmd:]} + or {it:name}{cmd:[}{it:rowname}{cmd:]} can be used to refer to specific + rows in {cmd:e(}{it:name}{cmd:)}. For example, type {cmd:cell(ci_bc[1] ci_bc[2])} + or {cmd:cell(ci_bc[ll] ci_bc[ul])} to tabulate the lower and upper + bounds of the bias-corrected confidence intervals after {helpb bootstrap}. + The default is to report the results from the first row. + Also see the {cmd:eform} and {cmd:transform()} options for more information + on the kinds of statistics that can be displayed. + +{p 8 8 2} + Further available elements in {it:array} are {cmd:_star}, + {cmd:_sign}, and {cmd:_sigsign}. {cmd:_star} causes stars denoting the + significance of the coefficients to be printed (* for p<.05, ** for p<.01, + and *** for p<.001; customizable via the {cmd:starlevels()} option below). + {cmd:_star} places the significance stars in their own cells. See the + {cmd:star} suboption below if you want to attach the stars to another + element. {cmd:_sign} prints the signs of the coefficients ("+", "-", or + "0"). {cmd:_sigsign}, a combination of {cmd:_star} and {cmd:_sign}, repeats + the signs of the coefficients where the number of repetitions reflects the + level of significance (non-significant coefficients are left empty; + however, you may set the first level to 1 in the {cmd:starlevels()} + option). + +{p 8 8 2} + Finally, {cmd:.} and {cmd:&} may be used in {it:array}. {cmd:.} inserts a + "null" element. Use this to add empty cells. For example, + {cmd:cells("b p" ". se")} would produce a table with point estimates in the + first column and p-values and standard errors beneath one another in the + second column. {cmd:&} is used to combine elements in the same cell. Use + the {helpb estout##incelldel:incelldelimiter()} option to specify the text to + be printed between the combined elements (the default is to print a + single blank). For example, in HTML, use {cmd:cell(b & se)} and + {cmd:incelldelimiter(
      )} to include point estimates and standard + errors in a single cell and insert a line break between them. + +{p 8 8 2} + A set of suboptions may be specified in parentheses for each + element named in {it:array} (except for {cmd:.} and {cmd:&}). For example, + to add significance stars to the coefficients and place the standard errors + in parentheses, specify {bind:{cmd:cells(b(star) se(par))}}. The following + suboptions are available. Use: + {p_end} +{marker cstar} +{p 12 16 2} + {cmd:star} to specify that stars denoting the significance of the + coefficients be attached to the statistic: {cmd:*} for p<.05, + {cmd:**} for p<.01, and {cmd:***} for p<.001. The symbols and the + values for the thresholds and the number of levels are fully customizable + (see the {help estout##sig:Significance stars} options). + {p_end} +{marker cfmt} +{p 12 16 2} + {cmd:fmt(}{it:{help estout##fmt:fmt}} [{it:{help estout##fmt:fmt}} ...]{cmd:)} + to specify the display format(s) of a statistic. It + defaults to {cmd:%9.0g} or the format for the first statistic in + {cmd:cells()}. If only one format is specified, it is used for all + occurrences of the statistic. For example, type + +{p 20 20 2} + {inp:. estout} {it:...}{inp:, cells("b(fmt(3)) t(fmt(2))")} + +{p 16 16 2} + to print coefficients and t-values beside one another using three + decimal places for coefficients and two decimal places for + t-values. If multiple formats are specified, the first format is + used for the first regressor in the estimates table, the second + format for the second regressor, and so on. The last format is used + for the remaining regressors if the number of regressors in the + table is greater than the number of specified formats. For + instance, type + +{p 20 20 2} + {inp:. estout} {it:...}{inp:, cells(b(fmt(3 4 2)))} + +{p 16 16 2} + to use three decimal places for the first coefficient, four decimal + places for the second, and two decimal places for all remaining + coefficients. Note that, regardless of the display format chosen, + leading and trailing blanks are removed from the numbers. White + space can be added by specifying a {cmd:modelwidth()} (see the + {help estout##lay:Layout} options). {it:{help estout##fmt:fmt}} may + be any of Stata's numerical display formats, e.g., {cmd:%9.0g} or + {cmd:%8.2f}, an integer {it:#} such as {cmd:1} or {cmd:3} to use a + fixed format with {it:#} decimal places, or {cmd:a}{it:#} such as + {cmd:a1} or {cmd:a3} to use {cmd:estout}'s adaptive display format + (see {help estout##fmt:Numerical formats} in the + {help estout##rem:Remarks} section for details). + {p_end} +{marker clabel} +{p 12 16 2} + {cmd:label(}{it:string}{cmd:)} to specify a label to appear in the + column heading. The default is the name of the statistic. + {p_end} +{marker cpar} +{p 12 16 2} + {cmd:par}[{cmd:(}{it:l} {it:r}{cmd:)}] to specify that the + statistic in question be placed in parentheses. It is also possible + to specify custom "parentheses". For example, {cmd:se(par({ }))} + would display the standard errors in curly brackets. Or, + {cmd:se(par(`"="("' `")""'))} will write parentheses in a way that + Excel can recognize. For {cmd:ci} the syntax is: + +{p 20 20 2} + {cmd:ci(par}[{cmd:(}{it:l} {it:m} {it:r}{cmd:)}]{cmd:)} + {p_end} +{marker cvacant} +{p 12 16 2} + {cmd:vacant(}{it:string}{cmd:)} to print {it:string} if a + coefficient is not in the model. The default is to leave such cells + empty. + {p_end} +{marker cdrop} +{p 12 16 2} + {cmd:drop(}{it:droplist} [{cmd:, relax}]{cmd:)} to cause certain + individual statistics to be dropped. For example, specifying + {cmd:t(drop(_cons))} suppresses the t-statistics for the constants. + {it:droplist} is specified as in the global + {helpb estout##drop:drop()} option (see below). + {p_end} +{marker ckeep} +{p 12 16 2} + {cmd:keep(}{it:keeplist} [{cmd:, relax}]{cmd:)} to cause certain + individual statistics to be kept. For example, the specification + {cmd:t(keep(mpg))} would display the t-statistics exclusively for + the variable {cmd:mpg}. {it:keeplist} is specified analogous to + {it:droplist} in {helpb estout##drop:drop()} (see below). + {p_end} +{marker cpattern} +{p 12 16 2} + {cmd:pattern(}{it:pattern}{cmd:)} to designate a pattern of models + for which the statistics are to be reported, where the {it:pattern} + consists of zeros and ones. A {cmd:1} indicates that the statistic + be printed; {cmd:0} indicates that it be suppressed. For example + {cmd:beta(pattern(1 0 1))} would result in {cmd:beta} being + reported for the first and third models, but not for the second. + {p_end} +{marker cpvalue} +{p 12 16 2} + {cmd:pvalue(}{it:name}{cmd:)} to specify the p-values used to + determine the significance stars (see {cmd:star} above). The + default is {cmd:pvalue(p)}, indicating that the standard p-values + are to be used (i.e. the p-values computed form the coefficients + vector and the variance matrix). Alternatively, specify + {cmd:pvalue(}{it:mypvalue}{cmd:)}, in which case the significance + stars will be determined from the values in + {cmd:e(}{it:mypvalue}{cmd:)}. Values outside [0,1] will be ignored. + {p_end} +{marker cabs} +{p 12 16 2} + {cmd:abs} to specify that absolute t-statistics be used instead of + regular t-statistics (relevant only if used with {cmd:t()}). + {p_end} +{marker ctranspose} +{p 12 16 2} + {cmd:transpose} to specify that {cmd:e(}{it:myel}{cmd:)} be transposed + for tabulation. + {p_end} +{marker drop} +{p 4 8 2} + {cmd:drop(}{it:droplist} [{cmd:, relax}]{cmd:)} identifies the coefficients + to be dropped from the table. A {it:droplist} comprises one or more + specifications, separated by white space. A specification can be either a + parameter name (e.g. {cmd:price}), an equation name followed by a colon + (e.g. {cmd:mean:}), or a full name (e.g. {cmd:mean:price}). You may use the + {cmd:*} and {cmd:?} wildcards in equation names and parameter names. Be sure + to refer to the matched equation names, and not to the original equation names + in the models, when using the {cmd:equations()} option to match equations. + Specify the {cmd:relax} suboption to allow {it:droplist} to contain elements + for which no match can be found. + {p_end} +{marker omitted} +{p 4 8 2} + {cmd:omitted} includes omitted coefficients (only relevant in Stata 11 or + newer). This is the default. Type {cmd:noomitted} to drop omitted + coefficients. + {p_end} +{marker baselevels} +{p 4 8 2} + {cmd:baselevels} includes base levels of factor variables (only relevant + in Stata 11 or newer). This is the default. Type {cmd:nobaselevels} to drop + base levels of factor variables. + {p_end} +{marker keep} +{p 4 8 2} + {cmd:keep(}{it:keeplist} [{cmd:, relax}]{cmd:)} selects the coefficients to + be included in the table. {it:keeplist} is specified analogous to {it:droplist} in + {helpb estout##drop:drop()} (see above). Note that {cmd:keep()} does {it:not} change the + the order of the coefficients. Use {cmd:order()} to change the order + of coefficients. + {p_end} +{marker order} +{p 4 8 2} + {cmd:order(}{it:orderlist}{cmd:)} changes the order of the + coefficients and equations within the table. {it:orderlist} is specified + analogous to {it:droplist} in {cmd:drop()} (see above). Reordering of + coefficients is performed equation by equation, unless equations are + explicitly specified. Coefficients and equations that do not appear in + {it:orderlist} are placed last (in their original order). Extra table rows + are inserted for elements in {it:orderlist} that are not found in the + table. + {p_end} +{marker indicate} +{p 4 8 2} + {cmd:indicate(}{it:groups} [{cmd:,} {cmdab:l:abels(}{it:yes} + {it:no}{cmd:)}]{cmd:)} indicates for each model (or, if {cmd:unstack} + is specified, for each equation) the presence of certain groups of + coefficients at the end of the table body. The syntax for {it:groups} + is + + "{it:group}" [ "{it:group}" {it:...} ] + +{p 8 8 2} + where a {it:group} is + + [{it:name} = ] {it:list} + +{p 8 8 2} + and {it:list} is a list of coefficient specifications as defined in + {cmd:drop()} above. The single groups should be enclosed in quotes + unless there is only one group and {it:name} is specified. Note that + {it:name} may contain spaces. + +{p 8 8 2} + For example, if some of the models contain a set of year + dummies, say {cmd:y1 y2 y3}, specify + + {com}estout{txt} {it:...}{com}, indicate(year effects = y1 y2 y3){txt} + +{p 8 8 2} + to drop the dummies from the table and add a "year effects" row + containing "Yes" for models in which {it:at least one} of the dummies + is present, and "No" for the other models. Furthermore, if some models + also contain a set of region dummies, say {cmd:reg_1} through + {cmd:reg_17}, you could type + + {com}estout{txt} {it:...}{com}, indicate("years = y1 y2 y3" "regions = reg_*"){txt} + +{p 8 8 2} + Use the {cmd:labels()} suboption to redefine the indication labels to + be printed in the table. The default is {cmd:labels(Yes No)}. Use + quotes if the labels include spaces, + e.g. {bind:{cmd:labels("in model" "not in model")}}. + {p_end} +{marker rename} +{p 4 8 2} + {cmd:rename(}{it:matchlist}{cmd:)} changes the names of individual + coefficients, where {it:matchlist} is + +{p 12 12 2} + {it:oldname} {it:newname} [{it:oldname} {it:newname} ...] + +{p 8 8 2} + {it:oldname} can be a parameter name (e.g. {cmd:price}) or a full + name including an equation specification (e.g. {cmd:mean:price}) + (abbreviation and wildcards not allowed); {it:newname} is a name without + equation specification and must not already occur in a model's equation. + {cmd:rename()} is applied before matching the models and equations and can + therefore be used to merge different coefficients across models (or + equations if {cmd:unstack} is specified) into a single table row. See the + {cmd:varlabels()} option if you are interested in relabeling coefficients + after matching models and equations. + {p_end} +{marker equations} +{p 4 8 2} + {cmd:equations(}{it:matchlist}{cmd:)} specifies how the models' equations are + to be matched. The default is to match all first equations into one equation + (named {cmd:main}, if the equations have different names) and match the remaining + equations by name. Specify {cmd:equations("")} to match all equations by + name. Alternatively, specify {it:matchlist}, which has the syntax + + {it:term} [{cmd:,} {it:term} ... ] + +{p 8 8 2} + where {it:term} is + + [{it:eqname} {cmd:=}] {it:#}{cmd::}{it:#}...{cmd::}{it:#}{col 50}(syntax 1) + + [{it:eqname} {cmd:=}] {it:#}{col 50}(syntax 2) + +{p 8 8 2} + In syntax 1, each {it:#} is a number or a period ({cmd:.}). If a number, it + specifies the position of the equation in the corresponding model; + {cmd:1:3:1} would indicate that equation 1 in the first model matches equation + 3 in the second, which matches equation 1 in the third. A period indicates + that there is no corresponding equation in the model; {cmd:1:.:1} indicates + that equation 1 in the first matches equation 1 in the third. + +{p 8 8 2} + In syntax 2, you specify just one number, say, {cmd:1} or {cmd:2}, and that + is shorthand for {cmd:1:1}...{cmd::1} or {cmd:2:2}...{cmd::2}, meaning that + equation 1 matches across all models specified or that equation 2 matches + across all models specified. + +{p 8 8 2} + {it:eqname} is used to name the matched equations. If it is suppressed, + a name such as {cmd:#1} or {cmd:#2} etc. is used, depending on the position + of the {it:term}. For example, {cmd:equations(1)} + indicates that all first equations are to be matched into one equation + named {cmd:#1}. All equations not matched by position are + matched by name. + {p_end} +{marker eform} +{p 4 8 2} + {cmd:eform}[{cmd:(}{it:pattern}{cmd:)}] displays the coefficient table in + exponentiated form. The exponent of {cmd:b} is displayed in lieu of the + untransformed coefficient; standard errors and confidence intervals are + transformed as well. Specify a {it:pattern} if the exponentiation is to be + applied only for certain models. For instance, {cmd:eform(1 0 1)} would + transform the statistics for Models 1 and 3, but not for Model 2. Note that, + unlike {cmd:regress} and {cmd:estimates table}, {cmd:estout} in + eform-mode does not suppress the display of the intercept. To drop the + intercept in eform-mode, specify {cmd:drop(_cons)}. Note: {cmd:eform} is + implemented via the {cmd:transform()} option. If both options are specified, + {cmd:transform()} takes precedence over {cmd:eform}. + {p_end} +{marker transform} +{p 4 8 2} + {cmd:transform(}{it:list} [, {cmd:pattern(}{it:pattern}{cmd:)}]{cmd:)} + displays transformed coefficients, standard errors and + confidence intervals. {it:list} may be + + {it:fx} {it:dfx} + +{p 8 8 2} + where {it:fx} is the transformation function and {it:dfx} is its first + derivative. {it:fx} is applied to coefficients and confidence + intervals, that is, {it:fx}({cmd:b}) and {it:fx}({cmd:ci}) is displayed + instead of {cmd:b} and {cmd:ci}. {it:dfx} is used to delta transform + standard errors, i.e. {cmd:se}*{it:dfx}({cmd:b}) is displayed instead + of {cmd:se}. Use {cmd:@} as a placeholder for the function's argument + in {it:fx} and {it:dfx}. For example, type + + {com}estout{txt} {it:...}{com}, transform(exp(@) exp(@)){txt} + +{p 8 8 2} + to report exponentiated results (this is equivalent to specifying + the {cmd:eform} option). + +{p 8 8 2} + Alternatively, {it:list} may be specified as + +{p 12 12 2} + {it:coefs} {it:fx} {it:dfx} [ {it:...} [{it:coefs}] {it:fx} {it:dfx} ] + +{p 8 8 2} + where {it:coefs} identifies the coefficients + to be transformed. Syntax for {it:coefs} is as explained above in the + description of the {cmd:drop()} option (however, include {it:coefs} + in quotes if it contains multiple elements). Say, a model has + two equations, {cmd:price} and {cmd:select}, and you want to + exponentiate the {cmd:price} equation but not the {cmd:select} + equation. You could then type + + {com}estout{txt} {it:...}{com}, transform(price: exp(@) exp(@)){txt} + +{p 8 8 2} + Note that omitting {it:coef} in the last transformation + specification causes the last transformation to be applied to + all remaining coefficients. + +{p 8 8 2} + Specify the {cmd:pattern()} suboption if the transformations are to be + applied only for certain models. For instance, {cmd:pattern(1 0 1)} would + apply the transformation to Models 1 and 3, but not Model 2. + {p_end} +{marker margin} +{p 4 8 2} + {cmd:margin}[{cmd:(}{cmd:u}|{cmd:c}|{cmd:p}{cmd:)}] indicates that the + marginal effects or elasticities be reported instead of the raw + coefficients. This option has an effect only if {cmd:mfx} has been + applied to a model before its results were stored (see help {helpb mfx}) or if a + {cmd:dprobit} (see help {helpb probit}), {cmd:truncreg,marginal} + (help {helpb truncreg}), or {cmd:dtobit} (Cong 2000) model is estimated. One + of the parameters {cmd:u}, {cmd:c}, or {cmd:p}, corresponding to the + unconditional, conditional, and probability marginal effects, respectively, + is required for {cmd:dtobit}. Note that the standard errors, confidence + intervals, t-statistics, and p-values are transformed as well. + +{p 8 8 2} + Using the {cmd:margin} option with multiple-equation models can be tricky. + The marginal effects of variables that are used in several equations are + printed repeatedly for each equation because the equations per se are + meaningless for {cmd:mfx}. To display the effects for certain equations only, + specify the {cmd:meqs()} option. Alternatively, use the {cmd:keep()} and + {cmd:drop()} options to eliminate redundant rows. The {cmd:equations()} + option might also be of help here. + +{p 8 8 2} + As of Stata 11, the use of {helpb mfx} is no longer suggested, since + {helpb mfx} has been superseded by {helpb margins}. Results from + {helpb margins} can directly be tabulated by {cmd:estout} as long as + the {cmd:post} option is specified with {helpb margins}. Alternatively, + you may add results from {helpb margins} to an existing + model using {helpb estadd:estadd margins} or + {helpb estpost:estpost margins}. See + {browse "http://repec.sowi.unibe.ch/stata/estout/coefficients.html#002"} for + an example on tabulating results from {helpb margins}. + {p_end} +{marker discrete} +{p 4 8 2} + {cmd:discrete(}{it:string}{cmd:)} may be used to override the default symbol and + explanatory text used to identify dummy variables when applying the + {helpb estout##margin:margin} option. The first token in {it:string} is + used as the symbol. The default is: + +{p 12 12 2} + {inp:discrete(" (d)" for discrete change of dummy variable from 0 to 1)} + +{p 8 8 2} + To display explanatory text, specify either the {cmd:legend} option or use + the {cmd:@discrete} variable (see the + {help estout##atvar:Remarks on using @-variables}). + +{p 8 8 2} + Use {cmd:nodiscrete} to disable the identification of dummy variables as + such. The default is to indicate the dummy variables unless they have been + interpreted as continuous variables in all of the models for which results are + reported (for {cmd:dprobit} and {cmd:dtobit}, however, dummy variables will + always be listed as discrete variables unless {cmd:nodiscrete} is specified). + {p_end} +{marker meqs} +{p 4 8 2} + {cmd:meqs(}{it:eq_list}{cmd:)} specifies that marginal effects requested + by the {helpb estout##margin:margin} option be printed only for the + equations in {it:eq_list}. Specifying this option does not affect how the + marginal effects are calculated. An {it:eq_list} comprises one or more equation + names (without colons) separated by white space. If you use the + {cmd:equations()} option to match equations, be sure to refer to the matched + equation names and not to the original equation names in the models. + {p_end} +{marker dropped} +{p 4 8 2} + {cmd:dropped}[{cmd:(}{it:string}{cmd:)}] causes null coefficients + (coefficients for which {cmd:e(b)} and {cmd:e(V)} is zero) to be indicated + as dropped. {it:string} specifies the text to be printed in place of + the estimates. The default text is "(dropped)". + {p_end} +{marker level} +{p 4 8 2} + {cmd:level(}{it:#}{cmd:)} assigns the confidence level, in percent, for + the confidence intervals of the coefficients (see help {help level}). + +{marker sum} +{dlgtab:Summary statistics} +{marker stats} +{p 4 8 2} + {cmd:stats(}{it:scalarlist}[{cmd:,} {it:stats_subopts}]{cmd:)} specifies + one or more scalar statistics - separated by white space - to be displayed + at the bottom of the table. The {it:scalarlist} may contain numeric + {cmd:e()}-scalars such as, e.g., {cmd:N}, {cmd:r2}, or {cmd:chi2}, but also + string {cmd:e()}-macros such as {cmd:cmd} or {cmd:depvar}. In + addition, the following statistics are available: + +{p 12 24 2} + {cmd:aic}{space 5}Akaike's information criterion{p_end} +{p 12 24 2} + {cmd:bic}{space 5}Schwarz's information criterion{p_end} +{p 12 24 2} + {cmd:rank}{space 4}rank of {cmd:e(V)}, i.e. the number of free + parameters in model{p_end} +{p 12 24 2} + {cmd:p}{space 7}the p-value of the model (overall model significance) + +{p 8 8 2} + See {bf:[R] estimates table} for details on the {cmd:aic} and {cmd:bic} statistics. + The rules for the determination of {cmd:p} are as follows (note that although + the procedure outlined below is appropriate for most models, there might be + some models for which it is not): + +{p 12 15 2} + 1) p-value provided: If the {cmd:e(p)} scalar is provided by the + estimation command, it will be interpreted as indicating the p-value + of the model. + +{p 12 15 2} + 2) F test: If {cmd:e(p)} is not provided, {cmd:estout} checks for the + presence of the {cmd:e(df_m)}, {cmd:e(df_r)}, and {cmd:e(F)} + scalars and, if they are present, the p-value of the model will be + calculated as {cmd:Ftail(df_m,df_r,F)}. This p-value corresponds to + the standard overall F test of linear regression. + +{p 12 15 2} + 3) chi2 test: Otherwise, if neither {cmd:e(p)} nor {cmd:e(F)} is + provided, {cmd:estout} checks for the presence of {cmd:e(df_m)} and + {cmd:e(chi2)} and, if they are present, calculates the p-value as + {cmd:chi2tail(df_m,chi2)}. This p-value corresponds to the + Likelihood-Ratio or Wald chi2 test. + +{p 12 15 2} + 4) If neither {cmd:e(p)}, {cmd:e(F)}, nor {cmd:e(chi2)} + is available, no p-value will be reported. + +{p 8 8 2} + Type {cmd:ereturn list} after estimating a model to see a list of + the returned {cmd:e()}-scalars and macros (see help {helpb ereturn}). Use + the {helpb estadd} command to add extra statistics and + other information to the {cmd:e()}-returns. + +{p 8 8 2} + The following {it:stats_subopts} are available. Use: + {p_end} +{marker statsfmt} +{p 12 16 2} + {cmd:fmt(}{it:{help estout##fmt:fmt}} [{it:{help estout##fmt:fmt}} {it:...}]{cmd:)} + to set the display formats for the scalars statistics in {it:scalarlist}. + {it:{help estout##fmt:fmt}} may be any of Stata's numerical display + formats, e.g., {cmd:%9.0g} or {cmd:%8.2f}, an integer {it:#} such as + {cmd:1} or {cmd:3} to use a fixed format with {it:#} decimal places, or + {cmd:a}{it:#} such as {cmd:a1} or {cmd:a3} to use {cmd:estout}'s adaptive + display format (see {help estout##fmt:Numerical formats} in the {help + estout##rem:Remarks} section for details). For example, {cmd:fmt(3 0)} + would be suitable for {cmd:stats(r2_a N)}. Note that the last specified + format is used for the remaining scalars if the list of scalars is longer + than the list of formats. Thus, only one format needs to be specified if + all scalars are to be displayed in the same format. If no format is + specified, the default format is the display format of the coefficients. + {p_end} +{marker statslabels} +{p 12 16 2} + {cmd:labels(}{it:strlist}[{cmd:,} {it:{help estout##lsub:label_subopts}}]{cmd:)} + to specify labels for rows containing the scalar statistics. If + specified, the labels are used instead of the scalar names. For example: + +{p 20 20 2} + {inp:. estout} {it:...}{inp:, stats(r2_a N, labels("Adj. R-Square" "Number of Cases"))} + +{p 16 16 2} + Note that names like {cmd:r2_a} produce an error in LaTeX because the + underscore character has a special meaning in LaTeX (to print the + underscore in LaTeX, type {cmd:\_}). Use the {cmd:label()} suboption to + rename such statistics, e.g. {cmd:stats(r2_a, labels(r2\_a))}. An alternative + approach is to use {cmd:estout}'s {cmd:substitute()} option (see the + {help estout##lay:Layout} options). + {p_end} +{marker statsstar} +{p 12 16 2} + {cmd:star}[{cmd:(}{it:scalarlist}{cmd:)}] to specify that the overall + significance of the model be denoted by stars. The stars are attached to + the scalar statistics specified in {it:scalarlist}. If + {it:scalarlist} is omitted, the stars are attached to the first + reported scalar statistic. The printing of the stars is suppressed in + empty results cells (i.e. if the scalar statistic in question is missing + for a certain model). The determination of the model significance is + based on the p-value of the model (see above). + +{p 16 16 2} + Hint: It is possible to attach the stars to different scalar statistics + within the same table. For example, specify + {cmd:stats(,star(r2_a r2_p))} + when tabulating OLS estimates and, say, probit estimates. For + the OLS models, the F test will be carried out and the significance + stars will be attached to the {cmd:r2_a}; for the probit models, the + chi2 test will be used and the stars will appear next to the + {cmd:r2_p}. + {p_end} +{marker statslayout} +{p 12 16 2} + {cmd:layout(}{it:array}{cmd:)} to rearrange the summary statistics. The default + is to print the statistics in separate rows beneath one another (in + each model's first column). The syntax for {it:array} is + + <{it:row}> [ <{it:row}> ... ] + +{p 16 16 2} + where {it:row} is + + <{it:cell}> [ <{it:cell}> ... ] + +{p 16 16 2} + and {cmd:@} is used as a placeholder for the statistics, one + after another. Rows and cells that contain blanks + have to be embraced in quotes. For example, + + {com} ... stats(chi2 df_m N, layout("@ @" @)){txt} + +{p 16 16 2} + prints for each model in row 1/column 1 the chi-squared, in + row1/column 2 the degrees of freedom, and in row 2/column 1 the number of + observations. Cells may contain multiple statistics and text other than + the placeholder symbol is printed as is (provided the cells' statistics are part + of the model). For example, + + {com} ... stats(chi2 df_m N, layout(`""@ (@)""' @)){txt} + +{p 16 16 2} + prints a cell containing "chi2 (df_m)" in the first row and the + number of observations in the second row. Note that the number of columns + in the table only depends on the {cmd:cells()} option (see above) and not + on the {cmd:layout()} suboption. If, for example, the table has two columns + per model and you specify three columns of summary statistics, the summary statistics + in the third column are not printed. + {p_end} +{marker statspchar} +{p 12 16 2} + {cmd:pchar(}{it:symbol}{cmd:)} to specify the placeholder symbol + used in {cmdab:layout()}. The default placeholder is {cmd:@}. + +{marker sig} +{dlgtab:Significance stars} +{marker starlevels} +{p 4 8 2} + {cmd:starlevels(}{it:levelslist}{cmd:)} overrides the default thresholds and + symbols for "significance stars". For instance, + {bind:{cmd:starlevels(+ 0.10 * 0.05)}} + sets the following thresholds: {cmd:+} for p<.10 and {cmd:*} for + p<.05. Note that the thresholds must lie in the (0,1] interval and must be + specified in descending order. To, for example, denote insignificant + results, type {bind:{cmd:starlevels(* 1 "" 0.05)}}. + {p_end} +{marker stardrop} +{p 4 8 2} + {cmd:stardrop(}{it:droplist} [{cmd:, relax}]{cmd:)} + identifies the coefficients for which the significance stars be + suppressed. {it:droplist} is specified as in + {helpb estout##drop:drop()} (see above). + {p_end} +{marker starkeep} +{p 4 8 2} + {cmd:starkeep(}{it:keeplist} [{cmd:, relax}]{cmd:)} selects the coefficients + for which the significance stars, if requested, be printed. {it:keeplist} + is specified analogous to {it:droplist} in + {helpb estout##drop:drop()} (see above). + {p_end} +{marker stardetach} +{p 4 8 2} + {cmd:stardetach} specifies that a delimiter be placed between the statistics + and the significance stars (i.e. that the stars are to be displayed in their + own column). + +{marker lay} +{dlgtab:Layout} +{marker varwidth} +{p 4 8 2} + {cmd:varwidth(}{it:#}{cmd:)} specifies the number of characters used to display + the names (labels) of regressors and statistics (i.e. {cmd:varwidth} + specifies the width of the table's left stub). Long names (labels) are + abbreviated (depending on the {cmd:abbrev} option) and short or empty + cells are padded out with blanks to fit the width specified by the user. + {cmd:varwidth} set to 0 means that the names are not + abbreviated and no white space is added. Specifying low values may cause + misalignment. + {p_end} +{marker modelwidth} +{p 4 8 2} + {cmd:modelwidth(}{it:#} [{it:#} ...]{cmd:)} designates the number of characters + used to display the results columns. If a non-zero {cmd:modelwidth} is + specified, model names are abbreviated if necessary (depending on the + {cmd:abbrev} option) and short or empty results cells are padded out + with blanks. In contrast, {cmd:modelwidth} does not shorten or truncate + the display of the results themselves (coefficients, t-statistics, + summary statistics, etc.) although it may add blanks if needed. + {cmd:modelwidth} set to 0 means that the model names are not + abbreviated and no white space is added. Specifying low values may + cause misalignment. Specify a list of numbers in {cmd:modelwidth()} to + assign individual widths to the different results columns (the list is + recycled if there are more columns than numbers). + +{p 8 8 2} + The purpose of {cmd:modelwidth} is to be able to construct a fixed-format + table and thus make the raw table more readable. Be aware, however, that the + added blanks may cause problems with the conversion to a table in word + processors or spreadsheets. + {p_end} +{marker unstack} +{p 4 8 2} + {cmd:unstack} specifies that the individual equations from multiple-equation + models (e.g. {cmd:mlogit}, {cmd:reg3}, {cmd:heckman}) be placed in + separate columns. The default is to place the equations below one another in a + single column. Summary statistics will be reported for each equation if + {cmd:unstack} is specified and the estimation command is either {cmd:reg3}, + {cmd:sureg}, or {cmd:mvreg} (see help {helpb reg3}, help {helpb sureg}, + help {helpb mvreg}). + {p_end} +{marker begin} +{p 4 8 2} + {cmd:begin(}{it:string}{cmd:)} specifies a string to be printed at the + beginning of every table row. It is possible to + use special functions such as {cmd:_tab} or {cmd:_skip} in + {cmd:begin()}. For more information on using such functions, see the + description of the functions in help {helpb file}. + {p_end} +{marker delimiter} +{p 4 8 2} + {cmd:delimiter(}{it:string}{cmd:)} designates the delimiter used between the + table columns. See the {cmd:begin} option above for further details. + {p_end} +{marker end} +{p 4 8 2} + {cmd:end(}{it:string}{cmd:)} specifies a string to be printed at the end of + every table row. See the {cmd:begin} option above for further details. + {p_end} +{marker incelldel} +{p 4 8 2} + {cmd:incelldelimiter(}{it:string}{cmd:)} specifies text to be printed + between parameter statistics that have been combined in a single cell + by the {cmd:&} operator. See the {helpb estout##par:cells()} option + for details. The default string is a single blank. + {p_end} +{marker dmarker} +{p 4 8 2} + {cmd:dmarker(}{it:string}{cmd:)} specifies the form of the decimal marker. The + standard decimal symbol (a period or a comma, depending on the input provided + to {cmd:set dp}; see help {help format}) is replaced by {it:string}. + {p_end} +{marker msign} +{p 4 8 2} + {cmd:msign(}{it:string}{cmd:)} determines the form of the minus sign. The + standard minus sign ({cmd:-}) is replaced by {it:string}. + {p_end} +{marker lz} +{p 4 8 2} + {cmd:lz} specifies that the leading zero of fixed format numbers in the + interval (-1,1) be printed. This is the default. Use {cmd:nolz} to advise + {cmd:estout} to omit the leading zeros (that is, to print numbers like + {cmd:0.021} or {cmd:-0.33} as {cmd:.021} and {cmd:-.33}). + {p_end} +{marker extracols} +{p 4 8 2} + {cmd:extracols(}{it:{help numlist}}{cmd:)} inserts empty table columns + at the indicated positions. For example, {cmd:extracols(1)} adds + an extra column between the left stub of the table and the first + column. + {p_end} +{marker substitute} +{p 4 8 2} + {cmd:substitute(}{it:subst_list}{cmd:)} specifies that the substitutions + specified in {it:subst_list} be applied to the estimates table after it has + been created. Specify {it:subst_list} as a list of substitution pairs, that + is: + +{p 12 12 2} + {it:from} {it:to} [{it:from} {it:to} ...] + +{p 8 8 2} + For example, specify {cmd:substitute(_ \_)} to replace the underscore + character (as in {cmd:_cons} or {cmd:F_p}) with it's LaTeX equivalent {cmd:\_}. + +{marker lab} +{dlgtab:Labeling} +{marker label} +{p 4 8 2} + {cmd:label} specifies that variable labels be displayed instead of variable + names in the left stub of the table. + {p_end} +{marker abbrev} +{p 4 8 2} + {cmd:abbrev} specifies that long names and labels be abbreviated if + a {cmd:modelwidth()} and/or a {cmd:varwidth()} is specified. + {p_end} +{marker wrap} +{p 4 8 2} + {cmd:wrap} causes long variable labels to be wrapped if space permits and + a {cmd:varwidth()} is specified. The {cmd:wrap} option is only useful if + several parameter statistics are printed beneath one another and, therefore, + white space is available beneath the labels. + {p_end} +{marker interaction} +{p 4 8 2} + {cmd:interaction(}{it:string}{cmd:)} specifies the string to be used + as delimiter for interaction terms (only relevant in Stata 11 or newer). The + default is {cmd:interaction(" # ")}. For {cmd:style(tex)} the default is + {cmd:interaction(" $\times$ ")}. + {p_end} +{marker title} +{p 4 8 2} + {cmd:title(}{it:string}{cmd:)} may be used to specify a title for the table. + The {it:string} is printed at the top of the table unless {cmd:prehead()}, + {cmd:posthead()}, {cmd:prefoot()}, or {cmd:postfoot()} is specified. In + the latter case, the variable {cmd:@title} can be used to insert the title. + {p_end} +{marker note} +{p 4 8 2} + {cmd:note(}{it:string}{cmd:)} may be used to specify a note for the table. + The {it:string} is printed at the bottom, of the table unless {cmd:prehead()}, + {cmd:posthead()}, {cmd:prefoot()}, or {cmd:postfoot()} is specified. In + the latter case, the variable {cmd:@note} can be used to insert the note. + {p_end} +{marker legend} +{p 4 8 2} + {cmd:legend} adds a legend explaining the significance symbols and + thresholds. + {p_end} +{marker prehead} +{p 4 8 2} + {cmd:prehead(}{it:strlist}{cmd:)}, {cmd:posthead(}{it:strlist}{cmd:)}, + {cmd:prefoot(}{it:strlist}{cmd:)}, and {cmd:postfoot(}{it:strlist}{cmd:)} may + be used to define lists of text lines to appear before and after the table + heading or the table footer. For example, the specification + +{p 12 12 2} + {inp:. estout} {it:...}{inp:, prehead("\S_DATE \S_TIME" "")} + +{p 8 8 2} + would add a line containing the current date and time followed by + an empty line before the table. Various substitution functions can be used + as part of the text lines specified in {it:strlist} (see the + {help estout##atvar:Remarks on using @-variables}). For example, + {cmd:@hline} plots a horizontal "line" (series of dashes, by default; see + the {cmd:hlinechar()} option) or {cmd:@M} inserts the number of models + in the table. {cmd:@M} could be used in a LaTeX table heading + as follows: + +{p 12 12 2} + {inp:. estout} {it:...}{inp:, prehead(\begin{tabular}{l*{@M}{r}})} + {p_end} +{marker hlinechar} +{p 4 8 2} + {cmd:hlinechar(}{it:string}{cmd:)} specifies the character(s) to be + used in {cmd:@hline}. The default is {cmd:hlinechar(-)}, resulting in a + dashed line. To produce a solid line, specify {cmd:hlinechar(`=char(151)')} + (Windows only; other systems may use other codes). + {p_end} +{marker varlabels} +{p 4 8 2} + {cmd:varlabels(}{it:matchlist}[{cmd:,} {it:suboptions}]{cmd:)} may be used to + relabel the regressors from the models, where {it:matchlist} is + +{p 12 12 2} + {it:name} {it:label} [{it:name} {it:label} ...] + +{p 8 8 2} + A {it:name} is a parameter name (e.g. {cmd:price}) or a full name + (e.g. {cmd:mean:price}) (abbreviation and wildcards + not allowed). For example, specify {cmd:varlabels(_cons Constant)} to replace + each occurrence of {cmd:_cons} with {cmd:Constant}. (Note that, in LaTeX, + the underscore character produces an error unless it is specified as + {cmd:\_}. Thus, names such as {cmd:_cons} should always be changed if + the estimates table is to be used with LaTeX. The {cmd:substitute()} may also be + helpful; see the {help estout##lay:Layout} options.) The {it:suboptions} are: + +{p 12 16 2} + {cmd:blist(}{it:matchlist}{cmd:)} to assign specific prefixes to + certain rows in the table body. Specify the {it:matchlist} as pairs of + regressors and prefixes, that is: + +{p 20 20 2} + {it:name} {it:prefix} [{it:name} {it:prefix} ...] + +{p 16 16 2} + A {it:name} is a parameter name (e.g. {cmd:price}), an equation name + followed by a colon (e.g. {cmd:mean:}), or a full name + (e.g. {cmd:mean:price}) (abbreviation and wildcards + not allowed). Note that equation names cannot be used if the + {cmd:unstack} option is specified. + +{p 12 16 2} + {cmd:elist(}{it:matchlist}{cmd:)} to assign specific suffixes to + certain rows in the table body (see the analogous {cmd:blist()} option + above). This option may, for example, be useful for separating + thematic blocks of variables by + adding vertical space at the end of each block. A LaTeX example: + +{p 20 20 2} + {inp:. estout} {it:...}{inp:, varlabels(,elist(price \addlinespace mpg \addlinespace))} + +{p 16 16 2} + (the macro {cmd:\addlinespace} is provided by the + {cmd:booktabs} package in LaTeX) + +{p 12 16 2} + {it:{help estout##lsub:label_subopts}}, which are + explained in their own section. + {p_end} +{marker labcol2} +{p 4 8 2} + {cmd:labcol2(}{it:strlist}[{cmd:,} {it:suboptions}]{cmd:)} adds a second column + containing additional labels for the coefficients and summary statistics. Labels + containing spaces should be embraced in double quotes ({bind:{cmd:"}{it:label 1}{cmd:"}} + {bind:{cmd:"}{it:label 2}{cmd:"}} etc.). An example would be to add a column + indicating the hypothesized directions of effects, e.g., + + {com}. estout {txt}{it:...}{com}, labcol2(+ - +/- + 0){txt} + +{p 8 8 2} + The {it:suboptions} are: + +{p 12 16 2} + {cmd:title(}{it:strlist}{cmd:)} to add text in the table header above + the column. Use double quotes to break the title into several + rows (given there are multiple header rows), i.e. specify {it:strlist} + as {bind:{cmd:"}{it:line 1}{cmd:"}} {bind:{cmd:"}{it:line 2}{cmd:"}} etc. + +{p 12 16 2} + {cmd:width(}{it:#}{cmd:)} to set the width, in number of characters, of the + column. The default is the value of {cmd:modelwidth()}. + {p_end} +{marker refcat} +{p 4 8 2} + {cmd:refcat(}{it:matchlist}[{cmd:,} {it:suboptions}]{cmd:)} may be used to + insert a row containing information on the reference category + of a categorical variable in the model. {it:matchlist} is + +{p 12 12 2} + {it:name} {it:refcat} [{it:name} {it:refcat} ...] + +{p 8 8 2} + A {it:name} is a parameter name (e.g. {cmd:_Irep78_2}) + (abbreviation and wildcards not allowed). For + example, assume that you include the categorical variable {cmd:rep78} + ("Repair Record 1978" from the auto dataset) in some of your models + using {cmd:xi} (see help {helpb xi}). Since {cmd:rep78} has five + levels, 1 through 5, {cmd:xi} will create 4 dummy variables, + {cmd:_Irep78_2} through {cmd:_Irep78_5}. You can now type + +{p 12 12 2} + {inp:. estout} {it:...}{inp:, refcat(_Irep78_2 _Irep78_1)} + +{p 8 8 2} + to add a table row containing "_Irep78_1" in the left stub and + "ref." in each column in which the {cmd:_Irep78_2} + dummy appears. The {it:suboptions} are: + +{p 12 16 2} + {cmd:label(}{it:string}{cmd:)} to specify the label that is printed + in the table columns. The default is {cmd:label(ref.)}. Type {cmd:nolabel} + to suppress the default label. + +{p 12 16 2} + {cmd:below} to position the reference category row below the specified + coefficient's row. The default is above. For example, if the 5th + category of {cmd:rep78} is used as reference category, i.e. if + {cmd:_Irep78_1} through {cmd:_Irep78_4} are included in the models, + you might want to type {cmd:refcat(_Irep78_4 _Irep78_5, below)}. + {p_end} +{marker mlabels} +{p 4 8 2} + {cmd:mlabels(}{it:strlist}[{cmd:,} {it:suboptions}]{cmd:)} determines the + model captions printed in the table heading. The default is to use the names of + the stored estimation sets (or their titles, if the {cmd:label} option is + specified and titles are available). The {it:suboptions} for use with + {cmd:mlabels} are: + +{p 12 16 2} + {cmd:depvars} to specify that the name (or label) of the (first) dependent + variable of the model be used as model label. + +{p 12 16 2} + {cmd:titles} to specify that, if available, the title of the stored + estimation set be used as the model label. Note that the {cmd:label} option + implies {cmd:titles} (unless {cmd:notitles} is specified). {cmd:depvars} + takes precedence over {cmd:titles}. + +{p 12 16 2} + {cmd:numbers} to cause the model labels to be numbered consecutively. + +{p 12 16 2} + {it:{help estout##lsub:label_subopts}}, which are explained in their own section. + {p_end} +{marker collabels} +{p 4 8 2} + {cmd:collabels(}{it:strlist}[{cmd:,} {it:{help estout##lsub:label_subopts}}]{cmd:)} + specifies labels for the columns within models or equations. The + default is to compose a label from the names or labels of the + statistics printed in the cells of that column. The {it:label_subopts} + are explained in their own section below. + {p_end} +{marker eqlabels} +{p 4 8 2} + {cmd:eqlabels(}{it:strlist}[{cmd:,} {it:suboptions}]{cmd:)} + labels the equations. The default is to use the equation names as + stored by the estimation command, or to use the variable labels if the + equation names correspond to individual variables and the {cmd:label} + option is specified. The {it:suboptions} for use with {cmd:eqlabels} + are: + +{p 12 16 2} + {cmd:merge} to merge equation labels and parameter labels instead of + printing equation labels in separate rows. Equation and parameter labels + will be separated by ":" unless another delimiter is specified via the + {cmd:suffix()} suboption (see {it:{help estout##lsub:label_subopts}}). + {cmd:merge} has no effect if {cmd:unstack} is specified. + +{p 12 16 2} + {it:{help estout##lsub:label_subopts}}, which are explained in their own + section. Note that {bind:{cmd:eqlabels(none)}} causes {cmd:_cons} to be + replaced with the equation name or label, if {cmd:_cons} is the only + parameter in an equation. This is useful, e.g., for tabulating + {cmd:ologit} or {cmd:oprobit} results in Stata 9. Specify + {bind:{cmd:eqlabels("", none)}} to not replace {cmd:_cons}. + {p_end} +{marker mgroups} +{p 4 8 2} + {cmd:mgroups(}{it:strlist}[{cmd:,} {it:suboptions}]{cmd:)} may be used to + labels groups of (consecutive) models at the top of the table heading. The + labels are placed in the first physical column of the output for the group of + models to which they apply. The {it:suboptions} for use with {cmd:mgroups} + are: + +{p 12 16 2} + {cmd:pattern(}{it:pattern}{cmd:)} to establish how the models are to be grouped. + {it:pattern} should be a list of zeros and ones, with ones indicating the + start of a new group of models. For example, + +{p 20 20 2} + {inp:. estout} {it:...}{inp:, mgroups("Group 1" "Group 2", pattern(1 0 0 1 0))} + +{p 16 16 2} + would group Models 1, 2, and 3 together and then groups Models 4 and 5 + together as well. Note that the first group will always start with the first + model regardless of whether the first token of {it:pattern} is a one or a + zero. + +{p 12 16 2} + {it:{help estout##lsub:label_subopts}}, which are explained + in their own section. In + particular, the {cmd:span} suboption might be of interest here. + {p_end} +{marker numbers} +{p 4 8 2} + {cmd:numbers}[{cmd:(}{it:l} {it:r}{cmd:)}] adds a row to the table header + displaying consecutive model numbers. The default is to + enclose the numbers in parentheses, i.e. {cmd:(1)}, {cmd:(2)}, etc. + Alternatively, specify {it:l} and {it:r} to change the tokens on the + left and right of each number. For example, {cmd:numbers("" ")")} + would result in {cmd:1)}, {cmd:2)}, etc. + +{marker out} +{dlgtab:Output} +{marker replace} +{p 4 8 2} + {cmd:replace} permits {cmd:estout} to overwrite an existing file. + {p_end} +{marker append} +{p 4 8 2} + {cmd:append} specifies that the output be appended to an existing file. It + may be used even if the file does not yet exist. + {p_end} +{marker type} +{p 4 8 2} + {cmd:type} specifies that the assembled estimates table be printed in the + results window and the log file. This is the default unless {cmd:using} is + specified. Use {cmd:notype} to suppress the display of the table. + {p_end} +{marker showtabs} +{p 4 8 2} + {cmd:showtabs} requests that tabs be displayed as {cmd:}s in both the + results window and the log file instead of in expanded form. This option does + not affect how tabs are written to the text file specified by {cmd:using}. + {p_end} +{marker topfile} +{p 4 8 2} + {cmd:topfile(}{it:filename}{cmd:)} and + {cmd:bottomfile(}{it:filename}{cmd:)} may be used to insert text before + and after the table, where the text is imported from a file on disk. Note that + {cmd:substitute()} does not apply to text inserted by {cmd:topfile()} or + {cmdab:bottomfile()}. + +{marker def} +{dlgtab:Defaults} +{marker style} +{p 4 8 2} + {cmd:style(}{it:style}{cmd:)} specifies a "style" for the output + table. {cmdab:def:aults:(}{it:style}{cmd:)} is a synonym for + {cmd:style(}{it:style}{cmd:)}. A "style" is a named combination of options + that is saved in an auxiliary file called {cmd:estout_}{it:style}{cmd:.def}. + In addition, there are five internal styles called {cmd:smcl} + (default for screen display), {cmd:tab} (export default), {cmd:fixed}, + {cmd:tex}, and {cmd:html}. The {cmd:smcl} style is suitable for displaying + the table in Stata's results window and is the default unless + {cmd:using} is specified. It includes {help smcl:SMCL} formatting tags and + horizontal lines to structure the table. The particulars of the other styles are: + + settings {col 38}styles + {col 26}{cmd:tab}{col 34}{cmd:fixed}{col 42}{cmd:tex}{col 50}{cmd:html} + {hline 47} + {cmd:begin} {col 50}{cmd:} + {cmd:delimiter} {col 26}{cmd:_tab}{col 34}{cmd:" "}{col 42}{cmd:&}{col 50}{cmd:} + {cmd:end} {col 42}{cmd:\\}{col 50}{cmd:} + {cmd:varwidth} {col 26}{cmd:0}{col 34}{cmd:12/20}*{col 42}{cmd:12/20}*{col 50}{cmd:12/20}* + {cmd:modelwidth}{col 26}{cmd:0}{col 34}{cmd:12}{col 42}{cmd:12}{col 50}{cmd:12} + {cmd:abbrev} {col 26}off{col 34}on{col 42}off{col 50}off + (* if {cmd:label} is on) + +{p 8 8 2} + {cmd:tab} is the default export style (i.e. if {cmd:using} is specified). + +{p 8 8 2} + Note that explicitly specified options take precedence + over settings provided by a style. For example, if you type + + {com}. estout, delimiter("") style(tab){txt} + +{p 8 8 2} + then the column delimiter will be set to empty string since the + {cmd:delimiter()} option overwrites the default from the {cmd:tab} + style. Similarly, specifying + {cmd:noabbrev} will turn abbreviation off if using the {cmd:fixed} + style. + +{p 8 8 2} + See {help estout##defaults:Defaults files} in the + {help estout##rem:Remarks} section to make available your own style. + +{marker lsub} +{it:{dlgtab:label_subopts}} + +{p 4 4 2} +The following suboptions may be used within the {cmd:mgroups()}, +{cmd:mlabels()}, {cmd:collabels()}, {cmd:eqlabels()}, +{cmd:varlabels()}, and {cmd:stats(, labels())} options: + +{p 4 8 2} + {cmd:none} suppresses the printing of the labels or drops the + part of the table heading to which it applies. Note that instead of + typing {bind:{it:option}{cmd:(, none)}} you may simply specify + {it:option}{cmd:(none)}. + +{p 4 8 2} + {cmd:prefix(}{it:string}{cmd:)} specifies a common prefix to be added to each + label. + +{p 4 8 2} + {cmd:suffix(}{it:string}{cmd:)} specifies a common suffix to be added to each + label. + +{p 4 8 2} + {cmd:begin(}{it:strlist}{cmd:)} specifies a prefix to be printed at the + beginning of the part of the table to which it applies. If {cmd:begin} is + specified in {cmd:varlabels()} or {cmd:stats(,labels())}, the prefix will + be repeated for each regressor or summary statistic. + +{p 4 8 2} + {cmd:first} specifies that the first occurrence of the {cmd:begin()}-prefix in + {cmd:varlabels()} or {cmd:stats(,labels())} be printed. This + is the default. Use {cmd:nofirst} to suppress the first occurrence of the + prefix. In {cmd:varlabels()}, {cmd:nofirst} applies equation-wise, i.e., the first + {cmd:begin()}-prefix in each equation is suppressed (unless {cmd:unstack} is + specified). + +{p 4 8 2} + {cmd:end(}{it:strlist}{cmd:)} specifies a suffix to be printed at the end of the + part of the table to which it applies. If {cmd:end} is specified in + {cmd:varlabels()} or {cmd:stats(,labels())}, the suffix will be repeated + for each regressor or summary statistic. + +{p 4 8 2} + {cmd:last} specifies that the last occurrence of the {cmd:end()}-suffix in + {cmd:varlabels()} or {cmd:stats(,labels())} be printed. This + is the default. Use {cmd:nolast} to suppress the last occurrence of the + suffix. In {cmd:varlabels()}, {cmd:nolast} applies equation-wise, i.e., the last + {cmd:end()}-suffix in each equation is suppressed (unless {cmd:unstack} is + specified). + +{p 4 8 2} + {cmd:replace} causes the label suboption {cmd:begin()}-prefix and {cmd:end()}-suffix + to be used instead of the global {cmd:begin()} and {cmd:end()} strings. The default + is to print both. {cmd:replace} also applies to {cmd:blist()} and {cmd:elist()} + if specified in {cmd:varlabels()}. + +{p 4 8 2} + {cmd:span} causes labels to span columns, i.e. extends the labels across + several columns, if appropriate. This suboption is relevant only for the + {cmd:mgroups()}, {cmd:mlabels()}, {cmd:eqlabels()}, and + {cmd:collabels()} options. The {cmd:@span} string returns the number of + spanned columns if it is included in the label, prefix, or suffix. A LaTeX example: + +{p 8 8 2} + {inp:. estout} {it:...}{inp:, mlabels(, span prefix(\multicolumn{@span}{c}{) suffix(}))} + +{p 4 8 2} + {cmd:erepeat(}{it:string}{cmd:)} specifies a string that is repeated for each + group of spanned columns at the very end of the row if the {cmd:span} + suboption is specified. This suboption is relevant only for the + {cmd:mgroups()}, {cmd:mlabels()}, {cmd:eqlabels()}, and + {cmd:collabels()} options. If the {cmd:@span} string is included in + {it:string} it will be replaced by the range of columns spanned. A LaTeX example: + +{p 8 8 2} + {inp:. estout} {it:...}{inp:, mlabels(, span erepeat(\cline{@span}))} + +{p 4 8 2} + {cmd:lhs(}{it:string}{cmd:)} inserts {it:string} into the otherwise empty cell + in the left stub of the row of the table heading to which it applies. This + suboption is relevant only for the {cmd:mgroups()}, {cmd:mlabels()}, + {cmd:eqlabels()}, and {cmd:collabels()} options. + +{marker msub} +{it:{dlgtab:matrix_subopts}} + +{p 4 4 2} +The following suboptions may be applied within the {cmd:matrix()}, +{cmd:e()}, or {cmd:r()} argument used to tabulate a matrix: + {p_end} +{marker mfmt} +{p 4 8 2} + {cmd:fmt(}{it:fmtlist}{cmd:)} sets the display formats for the matrix. + {it:fmtlist} contains a list of format specifications, one for each + column of the matrix. {it:fmtlist} is recycled if it supplies less + specifications than there are columns in the matrix. A format + specification may be a single {it:{help estout##fmt:fmt}} such as, + e.g., {cmd:%9.0g} or {cmd:a3} (see {help estout##fmt:Numerical formats} + in the {help estout##rem:Remarks} section for details) to be applied to + all cells in the column. Alternatively, a format specification may be + a list of {it:{help estout##fmt:fmt}}s, enclosed in double quotes, to be + used for the cells in the column one by one. The last format in the + list is used for the remaining cells if the number of cells in the + column is greater than the number of formats in the list. Also see the + {help estout##ex7:examples} below. + {p_end} +{marker mtranspose} +{p 4 8 2} + {cmd:transpose} causes the matrix to be transposed for tabulation. + +{marker exa} +{title:Examples} + + Contents + {help estout##intro:Introduction} + {help estout##ex1:Publication style table} + {help estout##ex2:t-statistics for selected variables only} + {help estout##ex3:Summary statistics only} + {help estout##ex4:Table of descriptives} + {help estout##ex5:Unstack multiple equations} + {help estout##ex7:Tabulating a matrix} + +{p 4 4 2} Please first read the {help estout##intro:Introduction}. The +other examples are more advanced and intended for users +already familiar with the basic features of +{cmd:estout}. Additional examples can be found in Jann (2005) and at +{browse "http://repec.sowi.unibe.ch/stata/estout/"}. + +{marker intro} +{dlgtab:Introduction} + +{p 4 4 2} +The full syntax of {cmd:estout} is rather complex and is to be found +above. However, consider the following basic syntax, which +includes only the most important options: + +{p 8 15 2} +{cmd:estout} [ {it:namelist} ] [ {cmd:using} {it:filename} ] [ {cmd:,} + {cmdab:c:ells:(}{it:array}{cmd:)} + {cmdab:s:tats:(}{it:scalarlist}{cmd:)} + {cmdab:sty:le:(}{it:style}{cmd:)} + {it:more_options} + ] + +{p 4 4 2} +where {it:namelist} is a list of the names of stored estimation sets (the name +list can be entered as {cmd:*} to refer to all stored estimates). The +{cmd:cells()} and {cmd:stats()} options determine the primary contents of +the table. The {cmd:style()} option determines the basic formatting of the +table. + +{p 4 4 2}{ul:Basic usage} + +{p 4 4 2} +The general procedure for using {cmd:estout} is to first store several +models using the {cmd:estimates store} or the {helpb eststo} command and then apply +{cmd:estout} to display or save a table of the estimates. By default, +{cmd:estout} displays a plain table of the coefficients of the models and +uses {help SMCL} tags and horizontal lines to structure the table: + + {com}. sysuse auto + {txt}(1978 Automobile Data) + + {com}. replace price = price / 1000 + {txt}price was {res}int{txt} now {res}float + {txt}(74 real changes made) + + {com}. replace weight = weight / 1000 + {txt}weight was {res}int{txt} now {res}float + {txt}(74 real changes made) + + {com}. quietly regress price weight mpg + {txt} + {com}. estimates store m1, title(Model 1) + {txt} + {com}. generate forXmpg = foreign * mpg + {txt} + {com}. quietly regress price weight mpg forXmpg foreign + {txt} + {com}. estimates store m2, title(Model 2) + {txt} + {com}. estout m1 m2 + {res} + {txt}{hline 38} + {txt} m1 m2 + {txt} b b + {txt}{hline 38} + {txt}weight {res} 1.746559 4.613589{txt} + {txt}mpg {res} -.0495122 .2631875{txt} + {txt}forXmpg {res} -.3072165{txt} + {txt}foreign {res} 11.24033{txt} + {txt}_cons {res} 1.946068 -14.44958{txt} + {txt}{hline 38} + +{p 4 4 2}Alternatively, if {cmd:using} is specified, {cmd:estout} writes a +raw tab-delimited table (without SMCL tags and without lines) to the +indicated file ({cmd:*} is used in the following example to indicate that +all stored models be tabulated): + + {com}. estout * using example.txt + {txt}(output written to {browse `"example.txt"'}) + + {com}. type example.txt + {res} m1 m2 + b b + weight 1.746559 4.613589 + mpg -.0495122 .2631875 + forXmpg -.3072165 + foreign 11.24033 + _cons 1.946068 -14.44958 + {txt} +{p 4 4 2} The table looks messy in the Stata results window or the Stata +log because the columns are tab-separated (note that tab characters are not +preserved in the results window or the log). However, the table would look +tidy if "example.txt" were opened, for example, in a spreadsheet program. + +{p 4 4 2}{ul:Choosing a style} + +{p 4 4 2}{cmd:estout} has a {cmd:style()} option to set the basic format of +the table. The default style for screen display is the {cmd:smcl} style. +The default export style (i.e. if {cmd:using} is specified) is the +{cmd:tab} style. (See the examples above.) Other predefined styles are +{cmd:fixed}, {cmd:tex}, and {cmd:html}, but it is also possible to define +one's own styles (see {help estout##defaults:Defaults files} in the +{help estout##rem:Remarks} section). The {cmd:tex} style, for example, modifies +the output table for use with LaTeX's tabular environment: + + {com}. estout *, style(tex) varlabels(_cons \_cons) + {res} + & m1& m2\\ + & b& b\\ + weight & 1.746559& 4.613589\\ + mpg & -.0495122& .2631875\\ + forXmpg & & -.3072165\\ + foreign & & 11.24033\\ + \_cons & 1.946068& -14.44958\\ + {txt} +{p 4 4 2} +Note that {cmd:_cons} has been replaced by its LaTeX equivalent in the example above +using the {cmd:varlabels()} option (the underscore character produces an +error in LaTeX unless it is preceded by a backslash). For more +information on the {cmd:varlabels()} option, see {cmd:estout}'s +{help estout##lab:Labeling} options. + +{p 4 4 2}{ul:The cells option} + +{p 4 4 2} +Use the {cmd:cells()} option to specify the parameter statistics to be +tabulated and how they are to be arranged. The parameter statistics +available are {cmd:b} (point estimates; the default), {cmd:se} (standard +errors), {cmd:t} (t-/z-statistics), {cmd:p} (p-values), {cmd:ci} +(confidence intervals; to display the lower and upper bounds in separate +cells use {cmd:ci_l} and {cmd:ci_u}), as well as any additional +parameter statistics included in the {cmd:e()}-returns for the models +(see {cmd:estout}'s {help estout##par:Parameter Statistics} options). For +example, {cmd:cells(b se)} results +in the reporting of point estimates and standard errors: + + {com}. estout *, cells(b se) + {res} + {txt}{hline 38} + {txt} m1 m2 + {txt} b/se b/se + {txt}{hline 38} + {txt}weight {res} 1.746559 4.613589{txt} + {res} .6413538 .7254961{txt} + {txt}mpg {res} -.0495122 .2631875{txt} + {res} .086156 .1107961{txt} + {txt}forXmpg {res} -.3072165{txt} + {res} .1085307{txt} + {txt}foreign {res} 11.24033{txt} + {res} 2.751681{txt} + {txt}_cons {res} 1.946068 -14.44958{txt} + {res} 3.59705 4.42572{txt} + {txt}{hline 38} + +{p 4 4 2} +Multiple statistics are placed in separate rows beneath one another by +default as in the example above. However, elements that are listed in +quotes or in parentheses are placed beside one another. For +example, specifying {bind:{cmd:cells("b se t p")}} or, equivalently, +{bind:{cmd:cells((b se t p))}} produces the following table: + + {com}. estout m2, cells("b se t p") + {res} + {txt}{hline 64} + {txt} m2 + {txt} b se t p + {txt}{hline 64} + {txt}weight {res} 4.613589 .7254961 6.359219 1.89e-08{txt} + {txt}mpg {res} .2631875 .1107961 2.375421 .0203122{txt} + {txt}forXmpg {res} -.3072165 .1085307 -2.830687 .0060799{txt} + {txt}foreign {res} 11.24033 2.751681 4.084896 .0001171{txt} + {txt}_cons {res} -14.44958 4.42572 -3.26491 .0017061{txt} + {txt}{hline 64} + +{p 4 4 2} +The two approaches can be combined. For example, {cmd:cells("b p" se)} +would produce a table with point estimates and standard errors beneath one +another in the first column and p-values in the top row of the second +column for each model. + +{p 4 4 2} +Note that for each statistic named in the {cmd:cells()} option a set of +suboptions may be specified in parentheses. For example, in social sciences +it is common to report standard errors or t-statistics in parentheses beneath +the coefficients and to indicate the significance of individual +coefficients with stars. Furthermore, the results are rounded. Just such a +table can be created using the following procedure: + + {com}. estout *, cells(b(star fmt(3)) t(par fmt(2))) + {res} + {txt}{hline 44} + {txt} m1 m2 + {txt} b/t b/t + {txt}{hline 44} + {txt}weight {res} 1.747** 4.614***{txt} + {res} (2.72) (6.36) {txt} + {txt}mpg {res} -0.050 0.263* {txt} + {res} (-0.57) (2.38) {txt} + {txt}forXmpg {res} -0.307** {txt} + {res} (-2.83) {txt} + {txt}foreign {res} 11.240***{txt} + {res} (4.08) {txt} + {txt}_cons {res} 1.946 -14.450** {txt} + {res} (0.54) (-3.26) {txt} + {txt}{hline 44} + +{p 4 4 2} +The {cmd:estout} default is to display {cmd:*} for p<.05, +{cmd:**} for p<.01, and {cmd:***} for p<.001. However, note that +the significance thresholds and symbols are fully customizable (see {cmd:estout}'s +{help estout##sig:Significance stars} options). + +{p 4 4 2}{ul:The stats option} + +{p 4 4 2} +Finally, use the {cmd:stats()} option to specify scalar +statistics to be displayed for each model in the table footer. The +available scalar statistics are {cmd:aic} (Akaike's information criterion), +{cmd:bic} (Schwarz's information criterion), {cmd:rank} (the rank of +{cmd:e(V)}, i.e. the number of free parameters in model), {cmd:p} (the +p-value of the model), as well as any numeric or string scalars contained in the +{cmd:e()}-returns for the models (see +{cmd:estout}'s +{help estout##sum:Summary statistics} options). For example, specify +{cmd:stats(r2 bic N)} to add the R-squared, BIC, and the number of cases: + + {com}. estout *, stats(r2 bic N) + {res} + {txt}{hline 38} + {txt} m1 m2 + {txt} b b + {txt}{hline 38} + {txt}weight {res} 1.746559 4.613589{txt} + {txt}mpg {res} -.0495122 .2631875{txt} + {txt}forXmpg {res} -.3072165{txt} + {txt}foreign {res} 11.24033{txt} + {txt}_cons {res} 1.946068 -14.44958{txt} + {txt}{hline 38} + {txt}r2 {res} .2933891 .5516277{txt} + {txt}bic {res} 356.2918 331.2406{txt} + {txt}N {res} 74 74{txt} + {txt}{hline 38} +{marker ex1} +{dlgtab:Publication style table} + + {com}. label variable foreign "Foreign car type" + {txt} + {com}. label variable forXmpg "Foreign*Mileage" + {txt} + {com}. estout *, cells(b(star fmt(%9.3f)) se(par)) /// + > stats(r2_a N, fmt(%9.3f %9.0g) labels(R-squared)) /// + > legend label collabels(none) varlabels(_cons Constant) + {res} + {txt}{hline 52} + {txt} Model 1 Model 2 + {txt}{hline 52} + {txt}Weight (lbs.) {res} 1.747** 4.614***{txt} + {res} (0.641) (0.725) {txt} + {txt}Mileage (mpg) {res} -0.050 0.263* {txt} + {res} (0.086) (0.111) {txt} + {txt}Foreign*Mileage {res} -0.307** {txt} + {res} (0.109) {txt} + {txt}Foreign car type {res} 11.240***{txt} + {res} (2.752) {txt} + {txt}Constant {res} 1.946 -14.450** {txt} + {res} (3.597) (4.426) {txt} + {txt}{hline 52} + {txt}R-squared {res} 0.273 0.526 {txt} + {txt}N {res} 74 74 {txt} + {txt}{hline 52} + {txt}* p<0.05, ** p<0.01, *** p<0.001 +{marker ex2} +{dlgtab:t-statistics for selected variables only} + + {com}. estout *, cells(b(star) t(par keep(mpg))) + {res} + {txt}{hline 44} + {txt} m1 m2 + {txt} b/t b/t + {txt}{hline 44} + {txt}weight {res} 1.746559** 4.613589***{txt} + {txt}mpg {res} -.0495122 .2631875* {txt} + {res} (-.5746806) (2.375421) {txt} + {txt}forXmpg {res} -.3072165** {txt} + {txt}foreign {res} 11.24033***{txt} + {txt}_cons {res} 1.946068 -14.44958** {txt} + {txt}{hline 44} +{marker ex3} +{dlgtab:Summary statistics only} + + {com}. estout *, cells(none) stats(r2_a bic N, star) + {res} + {txt}{hline 44} + {txt} m1 m2 + {txt}{hline 44} + {txt}r2_a {res} .2734846*** .5256351***{txt} + {txt}bic {res} 356.2918 331.2406 {txt} + {txt}N {res} 74 74 {txt} + {txt}{hline 44} +{marker ex4} +{dlgtab:Table of descriptives} + + {com}. quietly generate x = uniform() + {txt} + {com}. quietly regress x price weight mpg foreign + {txt} + {com}. estadd mean + + {txt}added matrix: + e(mean) : {res}1 x 5 + {txt} + {com}. estadd sd, nobinary + + {txt}added matrix: + e(sd) : {res}1 x 5 + {txt} + {com}. estout, cells("mean sd") stats(N) mlabels(,none) drop(_cons) + {res} + {txt}{hline 38} + {txt} mean sd + {txt}{hline 38} + {txt}price {res} 6.165257 2.949496{txt} + {txt}weight {res} 3.019459 .7771936{txt} + {txt}mpg {res} 21.2973 5.785503{txt} + {txt}foreign {res} .2972973 {txt} + {txt}{hline 38} + {txt}N {res} 74 {txt} + {txt}{hline 38} +{marker ex5} +{dlgtab:Unstack multiple equations} + + {com}. quietly sureg (price foreign weight length) /// + > (mpg displ = foreign weight) + {txt} + {com}. estout, cells(b t(par)) stats(r2 chi2 p) unstack + {res} + {txt}{hline 51} + {txt} price mpg displacement + {txt} b/t b/t b/t + {txt}{hline 51} + {txt}foreign {res} 3.57526 -1.650029 -25.6127{txt} + {res} (5.749891) (-1.565555) (-2.047999){txt} + {txt}weight {res} 5.691462 -6.587886 96.75485{txt} + {res} (6.182983) (-10.55641) (13.06594){txt} + {txt}length {res} -.0882711 {txt} + {res} (-2.809689) {txt} + {txt}_cons {res} 4.506212 41.6797 -87.23547{txt} + {res} (1.255897) (19.64914) (-3.46585){txt} + {txt}{hline 51} + {txt}r2 {res} .548808 .6627029 .8115213{txt} + {txt}chi2 {res} 89.73586 145.3912 318.6174{txt} + {txt}p {res} 2.50e-19 2.68e-32 6.50e-70{txt} + {txt}{hline 51} +{marker ex7} +{dlgtab:Tabulating a matrix} + +{p 4 4 2} + Use {cmd:estout matrix(}{it:matname}{cmd:)} to tabulate Stata matrix + {it:matname}. Example: + + {com}. set seed 123 + {txt} + {com}. matrix A = matuniform(3,2) + {txt} + {com}. matrix list A + + {txt}A[3,2] + c1 c2 + r1 {res}.91204397 .0075452 + {txt}r2 {res}.28085881 .46027868 + {txt}r3 {res}.56010592 .67319061 + {txt} + {com}. estout matrix(A) + {res} + {txt}{hline 38} + {txt} A + {txt} c1 c2 + {txt}{hline 38} + {txt}r1 {res} .912044 .0075452{txt} + {txt}r2 {res} .2808588 .4602787{txt} + {txt}r3 {res} .5601059 .6731906{txt} + {txt}{hline 38} + +{p 4 4 2} + Numeric formats for the columns can be set using the {cmd:fmt()} + suboption: + + {com}. estout matrix(A, fmt(2 3)) + {res} + {txt}{hline 38} + {txt} A + {txt} c1 c2 + {txt}{hline 38} + {txt}r1 {res} 0.91 0.008{txt} + {txt}r2 {res} 0.28 0.460{txt} + {txt}r3 {res} 0.56 0.673{txt} + {txt}{hline 38} + +{p 4 4 2} + A list of formats can be specified for each column: + + {com}. estout matrix(A, fmt("2 3 4" "4 3 2")) + {res} + {txt}{hline 38} + {txt} A + {txt} c1 c2 + {txt}{hline 38} + {txt}r1 {res} 0.91 0.0075{txt} + {txt}r2 {res} 0.281 0.460{txt} + {txt}r3 {res} 0.5601 0.67{txt} + {txt}{hline 38} +{marker rem} +{title:Remarks} + + Contents + + {help estout##fmt:Numerical formats} + {help estout##spchar:Special characters} + {help estout##atvar:Using @-variables} + {help estout##defaults:Defaults files} +{marker fmt} +{dlgtab:Numerical formats} + +{p 4 4 2} +Numerical display formats may be specified in {cmd:estout} +as follows: + +{p 5 8 2} +1. Official Stata's display formats: You may specify formats, such as +{cmd:%9.0g} or {cmd:%8.2f}. See help {help format} for a list +of available formats. {cmd:%g} or {cmd:g} may be used as a +synonym for {cmd:%9.0g}. + +{p 5 8 2} +2. Fixed format: You may specify an integer value such as {cmd:0}, +{cmd:1}, {cmd:2}, etc. to request a display format with a fixed number +of decimal places. For example, {cmd:cells(t(fmt(3)))} would display +t-statistics with three decimal places. + +{p 5 8 2} +3. Automatic format: You may specify {cmd:a1}, {cmd:a2}, ..., or +{cmd:a9} to cause {cmd:esttab} to choose a reasonable display format for +each number depending on the number's value. {cmd:a} may be used as a +synonym for {cmd:a3}. The {it:#} in +{cmd:a}{it:#} determines the minimum precision according to the +following rules: + +{p 10 12 2} +o Absolute numbers smaller than 1 are displayed with {it:#} +significant decimal places (i.e. with {it:#} decimal places ignoring +any leading zeros after the decimal point). For example, +{cmd:0.00123456} is displayed as {cmd:0.00123} if the format is +{cmd:a3}. + +{p 10 12 2} +o Absolute numbers greater than 1 are displayed with as many digits +required to retain at least one decimal place and are displayed with +a minimum of ({it:#} + 1) digits. For example, if the format is +{cmd:a3}, {cmd:1.23456} is displayed as {cmd:1.235}, {cmd:12.3456} is +displayed as {cmd:12.35}, and {cmd:1234.56} is displayed as +{cmd:1234.6}. + +{p 10 12 2} +o In any case, integers are displayed with zero decimal places, and +very large or very small absolute numbers are displayed in +exponential format. + +{marker spchar} +{dlgtab:Special characters} + +{p 4 4 2} +The {cmd:\} and {cmd:$} characters and quotation marks have +special meanings in Stata. You should therefore consider the following +instructions if you, for example, intend to specify akward delimiters or +specify special characters in labels: + +{p 6 8 2}- Strings containing unmatched quotes should be enclosed in compound double +quotes (thus, {cmd:delimiter(`"""')} results in columns +delimited by {cmd:"}, while {cmd:delimiter(")} produces an error). + +{p 6 8 2}- The backslash character is used to delay macro expansion in +Stata. Specifying {cmd:\\} in Stata 8 just results in the printing of {cmd:\}. To get +a double backslash in Stata 8 (the {cmd:\newline} command in TeX), type {cmd:\\\}. + +{p 6 8 2}- The dollar sign is used for global macro expansion in Stata. Thus, +{cmd:$x} would result in the display of the contents of global macro +{cmd:x} (or nothing, if the macro is empty). Therefore, use +{cmd:\$} to produce {cmd:$} in the output. For math mode in LaTeX I +recommend using {cmd:\(}...{cmd:\)} instead of {cmd:$}...{cmd:$}. + +{p 4 4 2} +Stata's {cmd:char()} function may also be used to specify odd characters +(see help {help strfun}). In particular, {cmd:"`=char(9)'"} +results in a tab character and {cmd:"`=char(13)'"} results +in a carriage return. For example, {bind:{cmd:delimiter(" `=char(9)' ")}} +specifies that a tab character with a leading and +a trailing blank be used as delimiter. + +{p 4 4 2} {it:Tip:} It is sometimes very useful to set the format of all cells in a +spreadsheet to "Text" before pasting the estimates table. This prevents the +spreadsheet program from trying to interpret the cells and ensures that the contents +of the table remain unchanged. + +{marker atvar} +{dlgtab:Using @-variables} + +{p 4 4 2} +{cmd:estout} features several variables that can be used within string +specifications. The following list provides an overview of these variables. + +{p 5 8 2}o{space 2}In {cmd:prehead()}, {cmd:posthead()}, {cmd:prefoot()}, + and {cmd:postfoot()}, in the {cmd:begin()} and {cmd:end()} label + suboptions, and in the {cmd:blist()} and {cmd:elist()} suboptions + in {cmd:varlabels()}: + +{p 12 16 2}{cmd:@span} to return the value of a count variable for the total number of physical + columns of the table. + +{p 12 16 2}{cmd:@M} to return the number of models in the table. + +{p 12 16 2}{cmd:@E} to return the total number columns containing separate equations. + +{p 12 16 2}{cmd:@width} to return the total width of the table (number of characters). + +{p 12 16 2}{cmd:@hline} to return a horizontal line (series of dashes, by default; + see the {cmd:hlinechar()} option). + +{p 5 8 2}o{space 2}In {cmd:prehead()}, {cmd:posthead()}, {cmd:prefoot()}, + and {cmd:postfoot()}: + +{p 12 16 2}{cmd:@title} to return the title specified with the {cmd:title()} option. + +{p 12 16 2}{cmd:@note} to return the note specified with the {cmd:note()} option. + +{p 12 16 2}{cmd:@discrete} to return the explanations provided by the + {cmd:discrete()} option (provided that the {cmd:margin} option is activated). + +{p 12 16 2}{cmd:@starlegend} to return a legend explaining the significance symbols. + +{p 5 8 2}o{space 2}In the {cmd:prefix()} and {cmd:suffix()} suboptions of {cmd:mgroups()}, + {cmd:mlabels()}, {cmd:eqlabels()}, and + {cmd:collabels()}, and in the labels specified in these options: + +{p 12 16 2}{cmd:@span} to return the number of spanned columns. + +{p 5 8 2}o{space 2}In the {cmd:erepeat()} suboption of + {cmd:mgroups()}, {cmd:mlabels()}, {cmd:eqlabels()}, and + {cmd:collabels()}: + +{p 12 16 2}{cmd:@span} to return the range of spanned columns (e.g. {cmd:2-4} if columns 2, 3 and 4 + are spanned). + +{marker defaults} +{dlgtab:Defaults files} + +{p 4 4 2}{ul:Creating new defaults files:} + +{p 4 4 2} +To make available an own set +of default options, proceed as follows: + +{p 8 11 2} +1. Download "estout_mystyle.def" from the SSC +Archive (click +{stata "copy http://fmwww.bc.edu/repec/bocode/e/estout_mystyle.def estout_mystyle.def, text":here} +to copy the file from SSC and store it in the working directory). + +{p 8 11 2} +2. Open "estout_mystyle.def" in a text editor and make the desired modifications +(click {stata "doedit estout_mystyle.def":here} to open "estout_mystyle.def" in Stata's Do-File +Editor). + +{p 8 11 2} +3. Save the file in the current directory or elsewhere +in the ado-file path as {cmd:estout_}{it:newstyle}{cmd:.def} (see help {help sysdir}). + +{p 4 4 2}To use the new options set in {cmd:estout}, then type: + + {inp:. estout} {it:...} {inp:, style(}{it:newstyle}{inp:)} + + +{p 4 4 2}{ul:Defaults files syntax:} + +{p 4 4 2} +{cmd:estout} has two main types of options, which are treated differentially +in defaults files. On the one hand, there are simple on/off options without +arguments, like {cmd:legend} or {cmd:showtabs}. To turn such an option on, +enter the option followed by the options name as an argument, i.e. add the line + + {it:option} {it:option} + +{p 4 4 2} +to the defaults file. For example, + + {inp:legend legend} + +{p 4 4 2} +specifies that a legend be printed in the table footer. Otherwise, if you want +to turn the option of, just delete or comment out the line that contains it (or +specify {it:option} without an argument). + +{p 4 4 2} +To temporarily turn off an option that has been activated in a defaults file, +specify {cmd:no}{it:option} in the command line (do not, however, use +{cmd:no}{it:option} in defaults files). For example, if the legend has been +turned on in the defaults file, but you want to suppress it in a specific call of +{cmd:estout}, type + + {inp:. estout} {it:...}{inp:, nolegend} + +{p 4 4 2} +On the other hand, there are options that take arguments, such as +{cmd:prehead(}{it:args}{cmd:)}, {cmd:delimiter(}{it:args}{cmd:)}, or +{cmd:stats(}{it:args}{cmd:,} {it:...}{cmd:)}. Such options are specified as + + {it:option} {it:args} + +{p 4 4 2} +in the defaults file (where {it:args} must not include suboptions; see +below). Specifying an option in the command line overwrites the settings from +the defaults file. However, note that a {cmd:no} form, which exists for the +first options type, is not available here. + +{p 4 4 2} +Last but not least, there are two options that reflect a combination of the first +and second types: {cmd:eform}[{cmd:(}{it:args}{cmd:)}] and +{cmd:margin}[{cmd:(}{it:args}{cmd:)}]. These options can be specified +as either + + {it:option} {it:option} + +{p 4 4 2} +or + + {it:option} {it:args} + +{p 4 4 2} +in the defaults file; the {cmd:no} form is allowed. + +{p 4 4 2} +Many {cmd:estout} options have suboptions, i.e., an option might take the +form {it:option}{cmd:(}{it:...}{cmd:,} {it:suboption}{cmd:)} or +{it:option}{cmd:(}{it:...}{cmd:,} {it:suboption}{cmd:(}{it:args}{cmd:))}. In +the defaults file, the suboptions cannot be included in the +definition of a higher-level option. Instead, they must be +specified in their own lines, as either + + {it:optionsuboption} {it:suboption} + +{p 4 4 2} +or + + {it:optionsuboption} {it:args} + +{p 4 4 2} +In the case of a two-level nesting of options, the name +used to refer to the suboption is a concatenation of the option's name and the +suboption's name, +i.e. {cmd:"}{it:optionsuboption}{cmd:"="}{it:option}{cmd:"+"}{it:suboption}{cmd:"}. For +example, the {cmd:labels()} suboption of the {cmd:stats()} option would be +set by the term {cmd:statslabels}. Analogously, the three level nesting in +the {cmd:stats()} option yields suboption names composed of three names. For +instance, the suboption called by the command + + {inp:. estout} {it:...}{inp:, stats(}{it:...}{inp:, labels(}{it:...}{inp:, prefix(}{it:args}{inp:)))} + +{p 4 4 2} +would be referred to as + + {inp:statslabelsprefix} {it:args} + +{p 4 4 2} +in the defaults file. The {cmd:cells()} option represents an exception to +this rule. It may be defined in the defaults file using +only a plain array of cells elements without suboptions, e.g. + + {inp:cells "b se" p} + +{p 4 4 2} +However, the suboptions of the cells elements may be referred to as +{it:el_suboption}, for example + + {inp:b_star star} + +{p 4 4 2} +or + + {inp:se_par [ ]} + + +{p 4 4 2}{ul:Comments in defaults files:} + +{p 4 4 2} +Be aware that the support for comments in defaults files is limited. In +particular, the {cmd:/*} and {cmd:*/} comment indicators cannot be used. +The other comment indicators work (more or less) as usual, that is: + +{p 5 8 2} + o{space 2}Empty lines and lines beginning with {cmd:*} (with or without preceding +blanks) will be ignored. + +{p 5 8 2} + o{space 2}{cmd://} preceded by one or more blanks indicates that the rest of the +line should be ignored. Lines beginning with {cmd://} (with or without preceding +blanks) will be ignored. + +{p 5 8 2} + o{space 2}{cmd:///} preceded by one or more blanks indicates that the rest of the +line should be ignored and the part of the line preceding it should be added to +the next line. In other words, {cmd:///} can be used to split commands into +two or more lines of code. + +{marker ret} +{title:Saved results} + +{p 4 4 2} +{cmd:estout} saves the following in {cmd:r()}: + +{p 4 4 2}Scalars + {p_end} +{p 6 20 2}{cmd:r(nmodels)}{space 4}number of models + {p_end} +{p 6 20 2}{cmd:r(ccols)}{space 6}number of columns per model in {cmd:r(coefs)} + {p_end} + +{p 4 4 2}Macros + {p_end} +{p 6 20 2}{cmd:r(cmdline)}{space 4}command as typed + {p_end} +{p 6 20 2}{cmd:r(names)}{space 6}names of models + {p_end} +{p 6 20 2}{cmd:r(m}{it:#}{cmd:_}{it:name}{cmd:)}{space 4}model-specific +macros where {it:#} is the model number and {it:name} is macro name + {p_end} + +{p 4 4 2}Matrices + {p_end} +{p 6 20 2}{cmd:r(coefs)}{space 6}coefficients + {p_end} +{p 6 20 2}{cmd:r(stats)}{space 6}summary statistics + {p_end} + +{marker ref} +{title:References} + +{p 4 8 2}Cong, R. (2000). sg144: Marginal effects of the tobit model. +{it:Stata Technical Bulletin} 56: 27-34. + +{p 4 8 2}Jann, B. (2005). Making regression tables from stored estimates. +{it:The Stata Journal} 5(3): 288-308. + +{p 4 8 2}Jann, B. (2007). Making regression tables simplified. +{it:The Stata Journal} 7(2): 227-244. + +{p 4 8 2}Newson, R. (2003). Confidence intervals and p-values for delivery to the end +user. {it:The Stata Journal} 3(3): 245-269. + +{marker ack} +{title:Acknowledgements} + +{p 4 4 2}I would like to thank numerous people +for their comments and suggestions. Among them +are +Joao Pedro Azevedo, +Kit Baum, +Elisabeth Coutts, +Henriette Engelhardt, +Jonathan Gardnerand, +Simone Hirschvogl, +Daniel Hoechle, +Friedrich Huebler, +Maren Kandulla, +J. Scott Long, +David Newhouse, +Clive Nicholas, +Fredrik Wallenberg, +Ian Watson, and +Vince Wiggins. + +{marker aut} +{title:Author} + + Ben Jann, Institute of Sociology, University of Bern, jann@soz.unibe.ch + +{marker als} +{title:Also see} + + Manual: {hi:[R] estimates} + + SJ: SJ5-3 st0085 (Jann 2005) + SJ7-2 st0085_1 (Jann 2007) + +{p 4 13 2}Online: help for + {helpb estimates}, + {help estcom}, + {helpb est_table:estimates table}, + {helpb ereturn}, + {help format}, + {helpb file}, + {helpb mfx}, + {helpb eststo}, + {helpb esttab}, + {helpb estadd}, + {helpb estpost} +{p_end} diff --git a/data/ado/e/estpost.ado b/data/ado/e/estpost.ado new file mode 100644 index 0000000..3488a43 --- /dev/null +++ b/data/ado/e/estpost.ado @@ -0,0 +1,2124 @@ +*! version 1.2.2 10feb2023 Ben Jann +* 1. estpost +* 2. estpost_summarize +* 3. estpost_tabulate +* 4. estpost_tabstat +* 5. estpost_ttest +* 6. estpost_correlate +* 7. estpost_stci (Stata 9 required) +* 8. estpost_ci +* 9. estpost_prtest +* 10. estpost__svy_tabulate +* 12. estpost_gtabstat +* 99. _erepost + +* 1. estpost +program estpost, rclass // rclass => remove r()'s left behind by subcommand + version 8.2 + local caller : di _caller() + capt syntax [, * ] + if _rc==0 { // => for bootstrap + _coef_table_header + ereturn display, `options' + exit + } + gettoken subcommand rest : 0, parse(" ,:") + capt confirm name `subcommand' + if _rc { + di as err "invalid subcommand" + exit 198 + } + + local l = length(`"`subcommand'"') + if `"`subcommand'"'==substr("summarize",1,max(2,`l')) local subcommand "summarize" + else if `"`subcommand'"'==substr("tabulate",1,max(2,`l')) local subcommand "tabulate" + else if `"`subcommand'"'==substr("correlate",1,max(3,`l')) local subcommand "correlate" + else if `"`subcommand'"'=="svy" { + _estpost_parse_svy `macval(rest)' + } + else if substr(`"`subcommand'"',1,5)=="_svy_" { + di as err "invalid subcommand" + exit 198 + } + + capt local junk: properties estpost_`subcommand' // does not work in Stata 8 + if _rc==199 { + di as err "invalid subcommand" + exit 198 + } + + version `caller': estpost_`subcommand' `macval(rest)' + //eret list +end +program _estpost_markout2 // marks out obs that are missing on *all* variables + gettoken touse varlist: 0 + if `:list sizeof varlist'>0 { + tempname touse2 + gen byte `touse2' = 0 + foreach var of local varlist { + qui replace `touse2' = 1 if !missing(`var') + } + qui replace `touse' = 0 if `touse2'==0 + } +end +program _estpost_parse_svy + version 9.2 + _on_colon_parse `0' + local 0 `"`s(after)'"' + gettoken subcommand rest : 0, parse(" ,") + local l = length(`"`subcommand'"') + if `"`subcommand'"'==substr("tabulate",1,max(2,`l')) local subcommand "tabulate" + c_local subcommand `"_svy_`subcommand'"' + c_local rest `"`s(before)' : `rest'"' +end +program _estpost_namesandlabels // used by some routines such as estpost_tabulate + version 8.2 // returns locals names, savenames, and labels + args varname values0 labels0 elabel + if `"`values0'"'=="" { // generate values: 1 2 3 ... + local i 0 + foreach label of local labels0 { + local values0 `values0' `++i' + } + } + local haslabels = "`elabel'"!="" + if `"`labels0'"'=="" & "`varname'"!="" { + local vallab: value label `varname' + } + while (1) { + gettoken value values0 : values0 + if "`value'"=="" continue, break //=> exit loop + if `"`vallab'"'!="" { + local lbl: label `vallab' `value', strict + } + else { + gettoken lbl labels0 : labels0 + } + if index("`value'",".") { + local haslabels 1 + if `"`macval(lbl)'"'=="" { + local lbl "`value'" + } + local value: subinstr local value "." "_missing_" + } + local names0 `names0' `value' + if `"`macval(lbl)'"'!="" { + local labels `"`macval(labels)'`lblspace'`value' `"`macval(lbl)'"'"' + local lblspace " " + } + if `haslabels' continue + if `"`macval(lbl)'"'=="" { + local names `"`names'`space'`value'"' + local savenames `"`savenames'`space'`value'"' + } + else { + if regexm(`"`macval(lbl)'"', `"[:."]"') local haslabels 1 + else if length(`"`macval(lbl)'"')>30 local haslabels 1 + else { + local names `"`names'`space'`"`lbl'"'"' + local lbl: subinstr local lbl " " "_", all + local savenames `"`savenames'`space'`lbl'"' + } + } + local space " " + } + if `haslabels' { + local names `names0' + local savenames `names0' + } + c_local names `"`names'"' // to be used as matrix row- or colnames + c_local savenames `"`savenames'"' // names without spaces (for matlist) + if `haslabels' { + c_local labels `"`macval(labels)'"' // label dictionary + } + else c_local labels "" +end +program _estpost_eqnamesandlabels // used by some routines such as estpost_tabulate + version 8.2 // returns locals eqnames and eqlabels + args varname values0 labels0 elabel + if `"`values0'"'=="" { // generate values: 1 2 3 ... + local i 0 + foreach label of local labels0 { + local values0 `values0' `++i' + } + } + local haslabels = "`elabel'"!="" + if `"`labels0'"'=="" & "`varname'"!="" { + local vallab: value label `varname' + } + while (1) { + gettoken value values0 : values0 + if "`value'"=="" continue, break //=> exit loop + if `"`vallab'"'!="" { + local lbl: label `vallab' `value', strict + } + else { + gettoken lbl labels0 : labels0 + } + if index("`value'",".") { + local haslabels 1 + if `"`macval(lbl)'"'=="" { + local lbl "`value'" + } + local value: subinstr local value "." "_missing_" + } + local names0 `names0' `value' + if `"`macval(lbl)'"'=="" local lbl "`value'" + local labels `"`macval(labels)'`lblspace'`"`macval(lbl)'"'"' + local lblspace " " + if `haslabels' continue + if `"`macval(lbl)'"'=="" { + local names `"`names'`space'`value'"' + } + else { + if regexm(`"`macval(lbl)'"', `"[:."]"') local haslabels 1 + else if length(`"`macval(lbl)'"')>30 local haslabels 1 + else { + local names `"`names'`space'`"`lbl'"'"' + } + } + local space " " + } + if `haslabels' { + local names `names0' + } + c_local eqnames `"`names'"' // to be used as matrix roweqs or coleqs + if `haslabels' { + c_local eqlabels `"`macval(labels)'"' // list of labels + } + else c_local eqlabels "" +end + +* 2. estpost_summarize: wrapper for -summarize- +prog estpost_summarize, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax [varlist] [if] [in] [aw fw iw] [, ESample Quietly /// + LISTwise CASEwise Detail MEANonly ] + if "`casewise'"!="" local listwise listwise + + // sample + if "`listwise'"!="" marksample touse + else { + marksample touse, nov + _estpost_markout2 `touse' `varlist' + } + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // gather results + local nvars: list sizeof varlist + tempname emptymat + mat `emptymat' = J(1, `nvars', .) + mat coln `emptymat' = `varlist' + local i 0 + local rnames "" + foreach v of local varlist { + local ++i + qui summarize `v' if `touse' [`weight'`exp'], `detail' `meanonly' + local rnamesi: r(scalars) + local rnamesi: list rnamesi - rnames + if `"`rnamesi'"'!="" { + foreach name of local rnamesi { + tempname _`name' + mat `_`name'' = `emptymat' + } + local rnames: list rnames | rnamesi + } + foreach rname of local rnames { + mat `_`rname''[1,`i'] = r(`rname') + } + } + + // display + if "`quietly'"=="" { + tempname res + local rescoln + foreach rname of local rnames { + mat `res' = nullmat(`res'), `_`rname''' + if "`rname'"=="N" { + local rescoln `rescoln' e(count) + } + else { + local rescoln `rescoln' e(`rname') + } + } + mat coln `res' = `rescoln' + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) + } + else { + matlist `res', nohalf lines(oneline) + } + mat drop `res' + } + + // post results + local b + local V + if c(stata_version)<9 { // b and V required in Stata 8 + tempname b V + mat `b' = J(1, `nvars', 0) + mat coln `b' = `varlist' + mat `V' = `b'' * `b' + } + if "`esample'"!="" local esample esample(`touse') + eret post `b' `V', obs(`N') `esample' + + eret scalar k = `nvars' + + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local subcmd "summarize" + eret local cmd "estpost" + + local nmat: list sizeof rnames + forv i=`nmat'(-1)1 { + local rname: word `i' of `rnames' + if "`rname'"=="N" { + eret matrix count = `_N' + continue + } + eret matrix `rname' = `_`rname'' + } +end + + +* 2. estpost_tabulate: wrapper for -tabulate- +prog estpost_tabulate, eclass + version 8.2 + local caller : di _caller() // not used + syntax varlist(min=1 max=2) [if] [in] [fw aw iw pw] [, * ] + if `:list sizeof varlist'==1 { + version `caller': estpost_tabulate_oneway `0' + } + else { + version `caller': estpost_tabulate_twoway `0' + } +end +prog estpost_tabulate_oneway, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax varname [if] [in] [fw aw iw] [, ESample Quietly /// + noTOTal subpop(passthru) Missing sort noLabel ELabels ] + + // sample + if "`missing'"!="" marksample touse, nov strok + else marksample touse, strok + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // handle string variables + capt confirm numeric variable `varlist' + if _rc { + tempname varname + qui encode `varlist' if `touse', generate(`varname') + } + else local varname `varlist' + + // gather results + tempname count vals + tab `varname' if `touse' [`weight'`exp'], nofreq /// + matcell(`count') matrow(`vals') `subpop' `missing' `sort' + local N = r(N) + mat `count' = `count'' + local R = r(r) + forv r = 1/`R' { + local value: di `vals'[`r',1] + local values `values' `value' + } + if "`label'"=="" { + _estpost_namesandlabels `varname' "`values'" "" "`elabels'" // sets names, savenames, labels + } + else { + _estpost_namesandlabels "" "`values'" "" "`elabels'" + } + if "`total'"=="" { + mat `count' = `count', `N' + local names `"`names' Total"' + local savenames `"`savenames' Total"' + local linesopt "lines(rowtotal)" + } + mat colname `count' = `names' + tempname percent cum + mat `percent' = `count'/`N'*100 + mat `cum' = J(1, colsof(`count'), .z) + mat colname `cum' = `names' + mat `cum'[1,1] = `count'[1,1] + forv r = 2/`R' { + mat `cum'[1,`r'] = `cum'[1,`r'-1] + `count'[1,`r'] + } + mat `cum' = `cum'/`N'*100 + + // display + if "`quietly'"=="" { + tempname res + mat `res' = `count'', `percent'', `cum'' + mat coln `res' = e(b) e(pct) e(cumpct) + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) nodotz + } + else { + mat rown `res' = `savenames' + matlist `res', nohalf `linesopt' rowtitle(`varlist') nodotz + } + mat drop `res' + if `"`macval(labels)'"'!="" { + di _n as txt "row labels saved in macro e(labels)" + } + } + + // post results + local V + if c(stata_version)<9 { // V required in Stata 8 + tempname V + mat `V' = `count'' * `count' * 0 + } + if "`esample'"!="" local esample esample(`touse') + eret post `count' `V', depname(`varlist') obs(`N') `esample' + eret scalar r = r(r) + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local labels `"`macval(labels)'"' + eret local depvar "`varlist'" + eret local subcmd "tabulate" + eret local cmd "estpost" + eret mat cumpct = `cum' + eret mat pct = `percent' +end +prog estpost_tabulate_twoway, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax varlist(min=2 max=2) [if] [in] [fw aw iw] [, ESample Quietly /// + noTOTal Missing noLabel ELabels /// + CHi2 Exact Exact2(passthru) Gamma LRchi2 Taub v All noLOg ] + local v = upper("`v'") + local qui2 "`quietly'" + local hastests = `"`chi2'`exact'`exact2'`gamma'`lrchi2'`taub'`v'`all'"'!="" + if `hastests' local nofreq nofreq + else local qui2 "quietly" + + // sample + if "`missing'"!="" marksample touse, nov strok + else marksample touse, strok + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // handle string variables + gettoken rvar cvar : varlist + gettoken cvar : cvar + foreach d in r c { + capt confirm numeric variable ``d'var' + if _rc { + tempname `d'varname + qui encode ``d'var' if `touse', generate(``d'varname') + } + else local `d'varname ``d'var' + } + + // gather results + tempname cell rvals cvals + if `hastests' { + `quietly' di "" + } + `qui2' tab `rvarname' `cvarname' if `touse' [`weight'`exp'], `nofreq' /// + matcell(`cell') matrow(`rvals') matcol(`cvals') `missing' /// + `chi2' `exact' `exact2' `gamma' `lrchi2' `taub' `v' `all' `log' + mat `cvals' = `cvals'' + local N = r(N) + tempname rtot ctot + mat `ctot' = J(1,rowsof(`cell'),1) * `cell' + mat `rtot' = `cell' * J(colsof(`cell'),1,1) + foreach d in r c { + local I = r(`d') + forv i = 1/`I' { + local value: di ``d'vals'[`i',1] + local `d'values ``d'values' `value' + } + } + if "`label'"=="" { + _estpost_namesandlabels `rvarname' "`rvalues'" "" "`elabels'" // sets names, savenames, labels + _estpost_eqnamesandlabels `cvarname' "`cvalues'" "" "`elabels'" // sets eqnames, eqlabels + } + else { + _estpost_namesandlabels "" "`rvalues'" "" "`elabels'" // sets names, savenames, labels + _estpost_eqnamesandlabels "" "`cvalues'" "" "`elabels'" // sets eqnames, eqlabels + } + local savenames0 `"`savenames'"' + local savenames + if "`total'"=="" { + mat `ctot' = `ctot', `N' + mat `cell' = (`cell', `rtot') \ `ctot' + mat `rtot' = `rtot' \ `N' + local names `"`names' Total"' + local savenames0 `"`savenames0' Total"' + local eqnames `"`eqnames' Total"' + } + mat rowname `cell' = `names' + tempname count col row tot tmp + forv i = 1/`=colsof(`cell')' { + gettoken eq eqnames : eqnames + mat `tmp' = `cell'[1...,`i'] + mat roweq `tmp' = `"`eq'"' + mat `tmp' = `tmp'' + mat `count' = nullmat(`count'), `tmp' + mat `col' = nullmat(`col'), `tmp' / `ctot'[1,`i']*100 + forv j = 1/`=colsof(`tmp')' { + mat `tmp'[1,`j'] = `tmp'[1,`j'] / `rtot'[`j',1]*100 + } + mat `row' = nullmat(`row'), `tmp' + local savenames `"`savenames' `savenames0'"' + } + mat `tot' = `count' / `N'*100 + + // display + if "`quietly'"=="" { + tempname res + mat `res' = `count'', `tot'', `col'', `row'' + mat coln `res' = e(b) e(pct) e(colpct) e(rowpct) + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) + } + else { + mat rown `res' = `savenames' + di _n as res %-12s abbrev("`cvar'",12) as txt " {c |}{space 44}" + matlist `res', twidth(12) format(%9.0g) noblank nohalf rowtitle(`rvar') + } + mat drop `res' + if `"`macval(labels)'`macval(eqlabels)'"'!="" { + di "" + if `"`macval(labels)'"'!="" { + di as txt "row labels saved in macro e(labels)" + } + if `"`macval(eqlabels)'"'!="" { + di as txt "column labels saved in macro e(eqlabels)" + } + } + } + + // post results + local V + if c(stata_version)<9 { // V required in Stata 8 + tempname V + mat `V' = `count'' * `count' * 0 + } + if "`esample'"!="" local esample esample(`touse') + eret post `count' `V', obs(`N') `esample' + local rscalars: r(scalars) + local rscalars: subinstr local rscalars "N" "", word + foreach rsc of local rscalars { + eret scalar `rsc' = r(`rsc') + } + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local labels `"`macval(labels)'"' + eret local eqlabels `"`macval(eqlabels)16jun2015'"' + eret local colvar "`cvar'" + eret local rowvar "`rvar'" + eret local subcmd "tabulate" + eret local cmd "estpost" + eret mat rowpct = `row' + eret mat colpct = `col' + eret mat pct = `tot' +end + + +* 4. estpost_tabstat: wrapper for -tabstat- +prog estpost_tabstat, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax varlist [if] [in] [aw fw] [, ESample Quietly /// + Statistics(passthru) stats(passthru) LISTwise CASEwise /// + by(varname) noTotal Missing Columns(str) ELabels ] + if "`casewise'"!="" local listwise listwise + local l = length(`"`columns'"') + if `"`columns'"'==substr("variables",1,max(1,`l')) local columns "variables" + else if `"`columns'"'==substr("statistics",1,max(1,`l')) local columns "statistics" + else if `"`columns'"'=="stats" local columns "statistics" + else if `"`columns'"'=="" { + if `:list sizeof varlist'>1 local columns "variables" + else local columns "statistics" + } + else { + di as err `"columns(`columns') invalid"' + exit 198 + } + + // sample + if "`listwise'"!="" marksample touse + else { + marksample touse, nov + _estpost_markout2 `touse' `varlist' + } + if "`by'"!="" { + capt confirm string variable `by' + local numby = (_rc!=0) + if `numby' { + tempname tmpby + qui gen `:type `by'' `tmpby' = `by' + } + else local tmpby `by' + if "`missing'"=="" markout `touse' `by', strok + local byopt "by(`tmpby')" + } + else local numby 0 + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // gather results + if "`total'"!="" & "`by'"=="" { + di as txt "nothing to post" + eret clear + exit + } + qui tabstat `varlist' if `touse' [`weight'`exp'], save /// + `statistics' `stats' `byopt' `total' `missing' columns(`columns') + tempname tmp + capt confirm matrix r(StatTot) + if _rc { + mat `tmp' = r(Stat1) + } + else { + mat `tmp' = r(StatTot) + } + if `"`columns'"'=="statistics" { + local cnames: rownames `tmp' + local cnames: subinstr local cnames "N" "count", word all + local cnames: subinstr local cnames "se(mean)" "semean", word all + local R = colsof(`tmp') + local stats "`cnames'" + local vars: colnames `tmp' + } + else { + local cnames: colnames `tmp' + local R = rowsof(`tmp') + local stats: rownames `tmp' + local stats: subinstr local stats "N" "count", word all + local stats: subinstr local stats "se(mean)" "semean", word all + local vars "`cnames'" + local cnames: subinstr local cnames "b" "_b", word all + local cnames: subinstr local cnames "V" "_V", word all + } + local j 0 + foreach cname of local cnames { + tempname _`++j' + } + local groups: r(macros) + local g: list sizeof groups + local space + local labels + forv i = 1/`g' { + local labels `"`labels'`space'`"`r(name`i')'"'"' + } + if `R'==1 { + if `numby' { + _estpost_namesandlabels "`by'" `"`labels'"' "" "`elabels'" // sets names, savenames, labels + } + else { + _estpost_namesandlabels "" "" `"`labels'"' "`elabels'" // sets names, savenames, labels + } + } + else { + if `numby' { + _estpost_eqnamesandlabels "`by'" `"`labels'"' "" "`elabels'" // sets eqnames, eqlabels + } + else { + _estpost_eqnamesandlabels "" "" `"`labels'"' "`elabels'" // sets eqnames, eqlabels + } + local names `"`eqnames'"' + local labels `"`macval(eqlabels)'"' + } + forv i = 1/`g' { + gettoken name names : names + mat `tmp' = r(Stat`i') + mat rown `tmp' = `stats' + if `"`columns'"'=="statistics" { + mat `tmp' = `tmp'' + } + if `R'==1 { + mat rown `tmp' = `"`name'"' + } + else { + mat roweq `tmp' = `"`name'"' + } + local j 0 + foreach cname of local cnames { + local ++j + mat `_`j'' = nullmat(`_`j''), `tmp'[1..., `j']' + } + } + if "`total'"=="" { + mat `tmp' = r(StatTot) + mat rown `tmp' = `stats' + if `"`columns'"'=="statistics" { + mat `tmp' = `tmp'' + } + if `g'>0 { + if `R'==1 { + mat rown `tmp' = "Total" + local savenames `"`savenames' Total"' + local rowtotal "lines(rowtotal)" + } + else { + mat roweq `tmp' = "Total" + if `"`labels'"'!="" { + local labels `"`macval(labels)' Total"' + } + } + } + local j 0 + foreach cname of local cnames { + local ++j + mat `_`j'' = nullmat(`_`j''), `tmp'[1..., `j']' + } + } + + // display + if "`quietly'"=="" { + tempname res + local rescoln + local j 0 + foreach cname of local cnames { + local ++j + mat `res' = nullmat(`res'), `_`j''' + local rescoln `rescoln' e(`cname') + } + mat coln `res' = `rescoln' + di _n as txt "Summary statistics: `stats'" + di as txt " for variables: `vars'" + if "`by'"!="" { + di as txt " by categories of: `by'" + } + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) + } + else { + if `R'==1 & `g'>0 { + mat rown `res' = `savenames' + } + matlist `res', nohalf `rowtotal' rowtitle(`by') + } + if `"`macval(labels)'"'!="" { + di _n as txt "category labels saved in macro e(labels)" + } + mat drop `res' + } + + // post results + local b + local V + if c(stata_version)<9 { // b and V required in Stata 8 + tempname b V + mat `b' = `_1' \ J(1, colsof(`_1'), 0) + mat `b' = `b'[2,1...] + mat `V' = `b'' * `b' + } + if "`esample'"!="" local esample esample(`touse') + eret post `b' `V', obs(`N') `esample' + + eret local labels `"`macval(labels)'"' + eret local byvar "`by'" + eret local vars "`vars'" + eret local stats "`stats'" + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local subcmd "tabstat" + eret local cmd "estpost" + + local nmat: list sizeof cnames + forv j=`nmat'(-1)1 { + local cname: word `j' of `cnames' + eret matrix `cname' = `_`j'' + } +end + + +* 5. estpost_ttest: wrapper for -ttest- (two-sample) +prog estpost_ttest, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax varlist(numeric) [if] [in] , by(varname) [ ESample Quietly /// + LISTwise CASEwise UNEqual Welch ] + if "`casewise'"!="" local listwise listwise + + // sample + if "`listwise'"!="" marksample touse + else { + marksample touse, nov + _estpost_markout2 `touse' `varlist' + } + markout `touse' `by', strok + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // gather results + local nvars: list sizeof varlist + tempname diff count + mat `diff' = J(1, `nvars', .) + mat coln `diff' = `varlist' + mat `count' = `diff' + local mnames se /*sd*/ t df_t p_l p p_u N_1 mu_1 /*sd_1*/ N_2 mu_2 /*sd_2*/ + foreach m of local mnames { + tempname `m' + mat ``m'' = `diff' + } + local i 0 + foreach v of local varlist { + local ++i + qui ttest `v' if `touse', by(`by') `unequal' `welch' + mat `diff'[1,`i'] = r(mu_1) - r(mu_2) + mat `count'[1,`i'] = r(N_1) + r(N_2) + foreach m of local mnames { + mat ``m''[1,`i'] = r(`m') + } + } + + // display + if "`quietly'"=="" { + tempname res + mat `res' = `diff'', `count'' + local rescoln "e(b) e(count)" + foreach m of local mnames { + mat `res' = `res', ``m''' + local rescoln `rescoln' e(`m') + } + mat coln `res' = `rescoln' + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) + } + else { + matlist `res', nohalf lines(oneline) + } + mat drop `res' + } + + // post results + local V + if c(stata_version)<9 { // V required in Stata 8 + tempname V + mat `V' = diag(vecdiag(`se'' * `se')) + } + if "`esample'"!="" local esample esample(`touse') + eret post `diff' `V', obs(`N') `esample' + + eret scalar k = `nvars' + + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local welch "`welch'" + eret local unequal "`unequal'" + eret local byvar "`by'" + eret local subcmd "ttest" + eret local cmd "estpost" + + local nmat: list sizeof mnames + forv i=`nmat'(-1)1 { + local m: word `i' of `mnames' + eret matrix `m' = ``m'' + } + eret matrix count = `count' +end + + +* 6. estpost_correlate: wrapper for -correlate- +prog estpost_correlate, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax varlist [if] [in] [aw fw iw pw] [, ESample Quietly /// + LISTwise CASEwise Matrix noHalf noLabel ELabels ELabels2(str asis) /// + Print(real 1) /*Covariance*/ Bonferroni SIDak ] + if "`casewise'"!="" local listwise listwise + if "`bonferroni'"!="" & "`sidak'"!="" { + di as err "only one of bonferroni and sidak allowed" + exit 198 + } + local pw = ("`weight'"=="pweight") + if `:list sizeof varlist'<=1 & `"`matrix'"'=="" { + di as err "too few variables specified" + exit 102 + } + if `"`matrix'"'!="" & `"`half'"'!="" local fullmatrix fullmatrix + + // sample + if "`listwise'"!="" marksample touse + else { + marksample touse, nov + _estpost_markout2 `touse' `varlist' + } + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // gather results + tempname b rho pval count + if "`bonferroni'`sidak'"!="" { + local nvars : list sizeof varlist + local k = `nvars' * (`nvars'-1) / 2 + } + foreach depvar of local varlist { + if `"`fullmatrix'"'!="" { + local indepvars `varlist' + } + else if `"`matrix'"'!="" { + local indepvars `depvar' `ferest()' + } + else { + local indepvars `ferest()' + } + foreach v of local indepvars { + qui reg `depvar' `v' [`weight'`exp'] if `touse' + local r = sqrt(e(r2)) * (-1)^(_b[`v']<0) + local n = e(N) + mat `b' = nullmat(`b'), `r' + if "`depvar'"=="`v'" { + mat `rho' = nullmat(`rho'), `r' + mat `count' = nullmat(`count'), `n' + mat `pval' = nullmat(`pval'), .z + continue + } + local p = Ftail(e(df_m), e(df_r), e(F)) + if `pw' { + qui reg `v' `depvar' [`weight'`exp'] if `touse' + local p = max(`p', Ftail(e(df_m), e(df_r), e(F))) + } + if "`bonferroni'"!="" { + local p = min(1, `k'*`p') + } + else if "`sidak'"!="" { + local p = min(1, 1 - (1-`p')^`k') + } + if `p'>`print' { + local r .z + local n .z + local p .z + } + mat `rho' = nullmat(`rho'), `r' + mat `count' = nullmat(`count'), `n' + mat `pval' = nullmat(`pval'), `p' + } + if `"`matrix'`fullmatrix'"'=="" { + local colnames `indepvars' + local depname `depvar' + continue, break + } + foreach v of local indepvars { + local colnames `"`colnames'`depvar':`v' "' + } + } + mat coln `b' = `colnames' + mat coln `rho' = `colnames' + mat coln `count' = `colnames' + mat coln `pval' = `colnames' + local vce `"`e(vce)'"' // from last -regress- call + local vcetype `"`e(vcetype)'"' + + // display + if "`quietly'"=="" { + tempname res + mat `res' = `b'', `rho'', `pval'', `count'' + mat coln `res' = e(b) e(rho) e(p) e(count) + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) nodotz + } + else { + matlist `res', nohalf lines(oneline) rowtitle(`depname') nodotz + } + mat drop `res' + } + + // post results + local V + if c(stata_version)<9 { // V required in Stata 8 + tempname V + mat `V' = `b'' * `b' * 0 + } + if "`esample'"!="" local esample esample(`touse') + eret post `b' `V', depname(`depname') obs(`N') `esample' + eret local vcetype `"`vcetype'"' + eret local vce `"`vce'"' + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local depvar `depname' + eret local subcmd "correlate" + eret local cmd "estpost" + eret matrix count = `count' + eret matrix p = `pval' + eret matrix rho = `rho' + // additional labels in case of matrix + if `"`matrix'"'=="" exit + if `"`elabels'`elabels2'"'=="" exit + gettoken lhs rhs : elabels2 + gettoken rhs : rhs + local space + local vlbls + local eqlbls + local i 0 + foreach v of local varlist { + local ++i + local num `"`lhs'`i'`rhs'"' + local eqlbls `"`eqlbls'`space'`"`num'"'"' + local space " " + local lbl + if "`label'"=="" { + local lbl: var lab `v' + } + if `"`lbl'"'=="" local lbl "`v'" + local vlbls `vlbls' `v' `"`num' `lbl'"' + } + eret local labels `"`vlbls'"' + eret local eqlabels `"`eqlbls'"' +end + + +* 7. estpost_stci: wrapper for -stci- +prog estpost_stci, eclass + version 9.2 // Stata 8 not supported because levelsof is used + local caller : di _caller() // not used + + // syntax + syntax [if] [in] [ , ESample Quietly by(varname) /// + Median Rmean Emean p(numlist >0 <100 integer max=1) /// + CCorr Level(real `c(level)') ELabels ] + local stat "p50" + if `"`p'"'!="" { + local stat `"p`p'"' + local p `"p(`p')"' + } + else if "`rmean'"!="" local stat "rmean" + else if "`emean'"!="" local stat "emean" + + // sample + marksample touse + if `"`by'"'!="" { + markout `touse' `by', strok + } + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // get results + tempname _`stat' se N_sub lb ub + if "`by'"!="" { + qui levelsof `by' if `touse', local(levels) + capt confirm string variable `by' + if _rc { + local vallab: value label `by' + if `"`vallab'"'!="" { + _estpost_namesandlabels `by' `"`levels'"' "" "`elabels'" // sets names, savenames, labels + } + else { + local names `"`levels'"' + local savenames `"`levels'"' + } + } + else { + _estpost_namesandlabels `by' "" `"`levels'"' "`elabels'" // sets names, savenames, labels + } + } + local levels `"`levels' "total""' + local names `"`names' "total""' + local savenames `"`savenames' "total""' + gettoken l rest : levels, quotes + while (`"`l'"'!="") { + if `"`rest'"'=="" local lcond + else local lcond `" & `by'==`l'"' + qui stci if `touse'`lcond', `median' `rmean' `emean' `p' `ccorr' level(`level') + mat `_`stat'' = nullmat(`_`stat''), r(`stat') + mat `se' = nullmat(`se'), r(se) + mat `N_sub' = nullmat(`N_sub'), r(N_sub) + mat `lb' = nullmat(`lb'), r(lb) + mat `ub' = nullmat(`ub'), r(ub) + gettoken l rest : rest, quotes + } + foreach m in _`stat' se N_sub lb ub { + mat coln ``m'' = `names' + } + + // display + if "`quietly'"=="" { + tempname res + mat `res' = `N_sub'', `_`stat''', `se'', `lb'', `ub'' + mat coln `res' = e(count) e(`stat') e(se) e(lb) e(ub) + di as txt "(confidence level is " `level' "%)" + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) nodotz + } + else { + mat rown `res' = `savenames' + matlist `res', nohalf lines(rowtotal) nodotz + } + mat drop `res' + if `"`labels'"'!="" { + di _n as txt "labels saved in macro e(labels)" + } + } + + // post results + local b + local V + if c(stata_version)<9 { // b and V required in Stata 8 + tempname b V + mat `b' = `_`stat'' \ J(1, colsof(`_`stat''), 0) + mat `b' = `b'[2,1...] + mat `V' = `b'' * `b' + } + if "`esample'"!="" local esample esample(`touse') + eret post `b' `V', obs(`N') `esample' + eret scalar level = `level' + + eret local ccorr `ccorr' + eret local labels `"`labels'"' + eret local subcmd "stci" + eret local cmd "estpost" + + eret matrix ub = `ub' + eret matrix lb = `lb' + eret matrix se = `se' + eret matrix `stat' = `_`stat'' + eret matrix count = `N_sub' +end + + +* 8. estpost_ci: wrapper for -ci- +prog estpost_ci, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax [varlist] [if] [in] [aw fw], [ ESample Quietly /// + LISTwise CASEwise Level(real `c(level)') /// + Binomial EXAct WAld Wilson Agresti Jeffreys /// + Poisson Exposure(varname) /// + ] + if "`casewise'"!="" local listwise listwise + if "`exposure'"!="" local exposureopt "exposure(`exposure')" + if "`binomial'"!="" & "`exact'`wald'`wilson'`agresti'`jeffreys'"=="" local exact exact + + // sample + if "`listwise'"!="" marksample touse + else { + marksample touse, nov + _estpost_markout2 `touse' `varlist' + } + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // gather results + local mnames se lb ub + tempname mean count `mnames' + local i 0 + foreach v of local varlist { + local ++i + qui ci `v' if `touse' [`weight'`exp'], level(`level') /// + `binomial' `exact' `wald' `wilson' `agresti' `jeffreys' /// + `poisson' `exposureopt' + if r(N)>=. continue + mat `mean' = nullmat(`mean'), r(mean) + mat `count' = nullmat(`count'), r(N) + foreach m of local mnames { + mat ``m'' = nullmat(``m''), r(`m') + } + local rnames "`rnames' `v'" + } + capt confirm matrix `count' + if _rc { + di as txt "nothing to post" + eret clear + exit + } + foreach m in mean count `mnames' { + mat coln ``m'' = `rnames' + } + if "`listwise'"=="" { // update sample + if colsof(`count') < `: list sizeof varlist' { + _estpost_markout2 `touse' `rnames' + qui count if `touse' + local N = r(N) + } + } + + // display + if "`quietly'"=="" { + tempname res + mat `res' = `mean'', `count'' + local rescoln "e(b) e(count)" + foreach m of local mnames { + mat `res' = `res', ``m''' + local rescoln `rescoln' e(`m') + } + mat coln `res' = `rescoln' + di as txt "(confidence level is " `level' "%)" + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) + } + else { + matlist `res', nohalf lines(oneline) + } + mat drop `res' + } + + // post results + local V + if c(stata_version)<9 { // V required in Stata 8 + tempname V + mat `V' = diag(vecdiag(`se'' * `se')) + } + if "`esample'"!="" local esample esample(`touse') + eret post `mean' `V', obs(`N') `esample' + + eret scalar k = colsof(`count') + eret scalar level = `level' + + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local exposure "`exposure'" + eret local poisson "`poisson'" + eret local binomial "`exact'`wald'`wilson'`agresti'`jeffreys'" + eret local subcmd "ci" + eret local cmd "estpost" + + local nmat: list sizeof mnames + forv i=`nmat'(-1)1 { + local m: word `i' of `mnames' + eret matrix `m' = ``m'' + } + eret matrix count = `count' +end + + +* 9. estpost_prtest: wrapper for -prtest- (two-sample) +prog estpost_prtest, eclass + version 8.2 + local caller : di _caller() // not used + + // syntax + syntax varlist(numeric) [if] [in] , by(varname) [ ESample Quietly /// + LISTwise CASEwise ] + if "`casewise'"!="" local listwise listwise + + // sample + if "`listwise'"!="" marksample touse + else { + marksample touse, nov + _estpost_markout2 `touse' `varlist' + } + markout `touse' `by', strok + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + // gather results + local nvars: list sizeof varlist + tempname diff count + mat `count' = J(1, `nvars', .) + mat coln `count' = `varlist' + mat `diff' = `count' + local mnames se se0 z p_l p p_u N_1 P_1 N_2 P_2 + foreach m of local mnames { + tempname `m' + mat ``m'' = `count' + } + local i 0 + foreach v of local varlist { + local ++i + qui prtest `v' if `touse', by(`by') + mat `count'[1,`i'] = r(N_1) + r(N_2) + mat `diff'[1,`i'] = r(P_1) - r(P_2) + mat `se'[1,`i'] = sqrt(r(P_1)*(1-r(P_1))/r(N_1) + r(P_2)*(1-r(P_2))/r(N_2)) + mat `se0'[1,`i'] = `diff'[1,`i'] / r(z) + mat `p_l'[1,`i'] = normal(r(z)) + mat `p'[1,`i'] = (1-normal(abs(r(z))))*2 + mat `p_u'[1,`i'] = 1-normal(r(z)) + foreach m in z N_1 P_1 N_2 P_2 { + mat ``m''[1,`i'] = r(`m') + } + } + + // display + if "`quietly'"=="" { + tempname res + mat `res' = `diff'', `count'' + local rescoln "e(b) e(count)" + foreach m of local mnames { + mat `res' = `res', ``m''' + local rescoln `rescoln' e(`m') + } + mat coln `res' = `rescoln' + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) + } + else { + matlist `res', nohalf lines(oneline) + } + mat drop `res' + } + + // post results + local V + if c(stata_version)<9 { // V required in Stata 8 + tempname V + mat `V' = diag(vecdiag(`se'' * `se')) + } + if "`esample'"!="" local esample esample(`touse') + eret post `diff' `V', obs(`N') `esample' + + eret scalar k = `nvars' + + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local byvar "`by'" + eret local subcmd "prtest" + eret local cmd "estpost" + + local nmat: list sizeof mnames + forv i=`nmat'(-1)1 { + local m: word `i' of `mnames' + eret matrix `m' = ``m'' + } + eret matrix count = `count' +end + + +* 10. estpost__svy_tabulate: wrapper for -svy:tabulate- +prog estpost__svy_tabulate + version 9.2 + local caller : di _caller() + _on_colon_parse `0' + local svyopts `"svyopts(`s(before)')"' + local 0 `"`s(after)'"' + syntax varlist(min=1 max=2) [if] [in] [ , * ] + if `:list sizeof varlist'==1 { + version `caller': _svy_tabulate_oneway `varlist' `if' `in', /// + `svyopts' `options' + } + else { + version `caller': _svy_tabulate_twoway `varlist' `if' `in', /// + `svyopts' `options' + } +end +prog _svy_tabulate_oneway + version 9.2 + local caller : di _caller() // not used + + // syntax + syntax varname [if] [in] [, ESample Quietly /// + svyopts(str asis) MISSing Level(cilevel) /// + noTOTal noMARGinals noLabel ELabels PROPortion PERcent /// + CELl COUnt se ci deff deft * ] + if "`marginals'"!="" local total "nototal" + else if "`total'"!="" local marginals "nomarginals" + + // run svy:tabulate + `quietly' svy `svyopts' : tabulate `varlist' `if' `in', /// + level(`level') `cell' `count' `se' `ci' `deff' `deft' /// + `missing' `marginals' `label' `proportion' `percent' `options' + if "`count'"!="" & "`cell'`se'`ci'`deff'`deft'"=="" { // => return count in e(b) + quietly svy `svyopts' : tabulate `varlist' `if' `in', count se /// + level(`level') `missing' `marginals' `label' `proportion' `percent' `options' + } + + // get labels + qui levelsof `varlist' if e(sample), `missing' local(levels) + local R : list sizeof levels + if e(r)!=`R' { + di as err "unexpected error; number of rows unequal number of levels" + exit 499 + } + capt confirm string variable `varlist' + if _rc { + if "`label'"=="" { + _estpost_namesandlabels `varlist' "`levels'" "" "`elabels'" // sets names, savenames, labels + } + else { + _estpost_namesandlabels "" "`levels'" "" "`elabels'" // sets names, savenames, labels + } + } + else { + _estpost_namesandlabels "" "" `"`levels'"' "`elabels'" // sets names, savenames, labels + } + + // collect results + tempname cell count obs b se lb ub deff deft + local N_pop = cond(e(N_subpop)<., e(N_subpop), e(N_pop)) + local N_obs = cond(e(N_sub)<., e(N_sub), e(N)) + local tval = invttail(e(df_r), (100-`level')/200) + if `tval'>=. local tval = invnormal(1 - (100-`level')/200) + mat `cell' = e(Prop)' + mat `count' = `cell' * `N_pop' + capture confirm matrix e(ObsSub) + if _rc { + mat `obs' = e(Obs)' + } + else { + mat `obs' = e(ObsSub)' + } + capture confirm matrix e(Deff) + if _rc local DEFF "" + else { + local DEFF deff + mat `deff' = e(Deff) + } + capture confirm matrix e(Deft) + if _rc local DEFT "" + else { + local DEFT deft + mat `deft' = e(Deft) + } + mat `b' = e(b) + mata: st_matrix(st_local("se"), sqrt(diagonal(st_matrix("e(V)")))') + if "`total'"=="" { + mat `cell' = `cell', 1 + mat `count' = `count', `N_pop' + mat `obs' = `obs', `N_obs' + if "`DEFF'"!="" mat `deff' = `deff', .z + if "`DEFT'"!="" mat `deft' = `deft', .z + if e(setype)=="count" { + mat `b' = `b', `N_pop' + mat `se' = `se', sqrt(el(e(V_col),1,1)) + } + else { // e(setype)=="cell" + mat `b' = `b', 1 + mat `se' = `se', 0 + } + local names `"`names' "Total""' + local savenames `"`savenames' "Total""' + local linesopt "lines(rowtotal)" + + } + if e(setype)!="count" { + mata: st_matrix( st_local("lb"), invlogit( /// + logit(st_matrix(st_local("b"))) - strtoreal(st_local("tval")) * /// + st_matrix(st_local("se")) :/ /// + (st_matrix(st_local("b")) :* (1 :- st_matrix(st_local("b")))))) + mata: st_matrix( st_local("ub"), invlogit( /// + logit(st_matrix(st_local("b"))) + strtoreal(st_local("tval")) * /// + st_matrix(st_local("se")) :/ /// + (st_matrix(st_local("b")) :* (1 :- st_matrix(st_local("b")))))) + if "`total'"=="" { + mat `lb'[1, colsof(`lb')] = .z + mat `ub'[1, colsof(`ub')] = .z + } + } + else { + mata: st_matrix( st_local("lb"), st_matrix(st_local("b")) - /// + strtoreal(st_local("tval")) * st_matrix(st_local("se")) ) + mata: st_matrix( st_local("ub"), st_matrix(st_local("b")) + /// + strtoreal(st_local("tval")) * st_matrix(st_local("se")) ) + } + foreach m in cell count obs b se lb ub `DEFF' `DEFT' { + capt mat coln ``m'' = `names' + } + if "`percent'"!="" { + mat `cell' = `cell' * 100 + if e(setype)!="count" { + mat `b' = `b' * 100 + mat `se' = `se' * 100 + mat `lb' = `lb' * 100 + mat `ub' = `ub' * 100 + } + } + + // display + if "`quietly'"=="" { + /* + tempname res + mat `res' = `b'', `se'', `lb'', `ub'', `deff'', `deft'' ///, `cell'', `count'', `obs'' + mat coln `res' = e(b) e(se) e(lb) e(ub) e(deff) e(deft) /// e(cell) e(count) e(obs) + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) nodotz + } + else { + mat rown `res' = `savenames' + matlist `res', nohalf `linesopt' rowtitle(`varlist') nodotz + } + mat drop `res' + */ + local plabel = cond("`percent'"!="","percentages","proportions") + local blabel = cond("`e(setype)'"=="count", "weighted counts", "`e(setype)' `plabel'") + di _n as txt "saved vectors:" + di as txt %20s "e(b) = " " " as res "`blabel'" + di as txt %20s "e(se) = " " " as res "standard errors of `blabel'" + di as txt %20s "e(lb) = " " " as res "lower `level'% confidence bounds for `blabel'" + di as txt %20s "e(ub) = " " " as res "upper `level'% confidence bounds for `blabel'" + if "`DEFF'"!="" /// + di as txt %20s "e(deff) = " " " as res "deff for variances of `blabel'" + if "`DEFT'"!="" /// + di as txt %20s "e(deft) = " " " as res "deft for variances of `blabel'" + di as txt %20s "e(cell) = " " " as res "cell `plabel'" + di as txt %20s "e(count) = " " " as res "weighted counts" + di as txt %20s "e(obs) = " " " as res "number of observations" + if `"`labels'"'!="" { + di _n as txt "row labels saved in macro e(labels)" + } + } + + // post results + erepost b=`b', cmd(estpost) nov `esample' + qui estadd local labels `"`labels'"' + qui estadd local subcmd "tabulate" + qui estadd scalar level = `level' + foreach m in obs count cell `DEFT' `DEFF' ub lb se { + qui estadd matrix `m' = ``m'', replace + } +end +prog _svy_tabulate_twoway + version 9.2 + local caller : di _caller() // not used + + // syntax + syntax varlist(min=1 max=2) [if] [in] [, ESample Quietly /// + svyopts(str asis) MISSing Level(cilevel) /// + noTOTal noMARGinals noLabel ELabels PROPortion PERcent /// + CELl COUnt COLumn row se ci deff deft * ] + if "`marginals'"!="" local total "nototal" + else if "`total'"!="" local marginals "nomarginals" + + // run svy:tabulate + `quietly' svy `svyopts' : tabulate `varlist' `if' `in', /// + level(`level') `cell' `count' `column' `row' `se' `ci' `deff' `deft' /// + `missing' `marginals' `label' `proportion' `percent' `options' + if `: word count `count' `column' `row''==1 & "`cell'`se'`ci'`deff'`deft'"=="" { + quietly svy `svyopts' : tabulate `varlist' `if' `in', `count' `column' `row' se /// + level(`level') `missing' `marginals' `label' `proportion' `percent' `options' + } + + // get labels + local rvar `"`e(rowvar)'"' + qui levelsof `rvar' if e(sample), `missing' local(levels) + local R : list sizeof levels + if e(r)!=`R' { + di as err "unexpected error; number of rows unequal number of rowvar levels" + exit 499 + } + capt confirm string variable `rvar' + if _rc { + if "`label'"=="" { + _estpost_namesandlabels `rvar' "`levels'" "" "`elabels'" // sets names, savenames, labels + } + else { + _estpost_namesandlabels "" "`levels'" "" "`elabels'" // sets names, savenames, labels + } + } + else { + _estpost_namesandlabels "" "" `"`levels'"' "`elabels'" // sets names, savenames, labels + } + local cvar `"`e(colvar)'"' + qui levelsof `cvar' if e(sample), `missing' local(levels) + local C : list sizeof levels + if e(c)!=`C' { + di as err "unexpected error; number of column unequal number of colvar levels" + exit 499 + } + local savenames0 `"`savenames'"' + local savenames + capt confirm string variable `cvar' + if _rc { + if "`label'"=="" { + _estpost_eqnamesandlabels `cvar' "`levels'" "" "`elabels'" // sets eqnames, eqlabels + } + else { + _estpost_eqnamesandlabels "" "`levels'" "" "`elabels'" // sets eqnames, eqlabels + } + } + else { + _estpost_eqnamesandlabels "" "" `"`levels'"' "`elabels'" // sets eqnames, eqlabels + } + + // collect results + tempname tmp cell row col count obs b se lb ub deff deft + local N_pop = cond(e(N_subpop)<., e(N_subpop), e(N_pop)) + local N_obs = cond(e(N_sub)<., e(N_sub), e(N)) + local tval = invttail(e(df_r), (100-`level')/200) + if `tval'>=. local tval = invnormal(1 - (100-`level')/200) + mat `cell' = e(Prop) // r x c matrix + mat `cell' = (`cell', `cell' * J(`C',1,1)) \ (J(1,`R',1) * `cell', 1) + mat `count' = `cell' * `N_pop' + mat `tmp' = `cell'[1..., `C'+1] + mata: st_matrix(st_local("row"), st_matrix(st_local("cell")) :/ /// + st_matrix(st_local("tmp"))) + mat `tmp' = `cell'[`R'+1, 1...] + mata: st_matrix(st_local("col"), st_matrix(st_local("cell")) :/ /// + st_matrix(st_local("tmp"))) + mat drop `tmp' + capture confirm matrix e(ObsSub) + if _rc { + mat `obs' = e(Obs) // r x c matrix + } + else { + mat `obs' = e(ObsSub) // r x c matrix + } + capt confirm matrix e(Deff) + if _rc local DEFF "" + else { + local DEFF deff + mat `deff' = e(Deff) // vector + } + capt confirm matrix e(Deft) + if _rc local DEFT "" + else { + local DEFT deft + mat `deft' = e(Deft) // vector + } + mat `b' = e(b) // vector + mata: st_matrix(st_local("se"), sqrt(diagonal(st_matrix("e(V)")))') // vector + if e(setype)=="count" local btype count + else if e(setype)=="row" local btype row + else if e(setype)=="column" local btype col + else local btype cell + foreach m in `DEFF' `DEFT' b se { // vector -> r x c matrix + forv r = 1/`R' { + local from = (`r'-1)*`C' + 1 + local to = `r'*`C' + mat `tmp' = nullmat(`tmp') \ ``m''[1, `from'..`to'] + } + mat drop ``m'' + mat rename `tmp' ``m'' + } + if "`total'"=="" { + mat `obs' = (`obs', `obs' * J(`C',1,1)) \ (J(1,`R',1) * `obs', `N_obs') + if "`DEFF'"!="" mat `deff' = (`deff', e(Deff_row)') \ (e(Deff_col), .z) + if "`DEFT'"!="" mat `deft' = (`deft', e(Deft_row)') \ (e(Deft_col), .z) + mat `b' = (`b', ``btype''[1..`R',`C'+1]) \ ``btype''[`R'+1,1...] + mata: st_matrix(st_local("se"), /// + ((st_matrix(st_local("se")), sqrt(diagonal(st_matrix("e(V_row)")))) /// + \ (sqrt(diagonal(st_matrix("e(V_col)")))', .z))) + if "`btype'"=="row" { + mat `se' = `se'[1..., 1..`C'], J(`R'+1, 1, .z) + } + else if "`btype'"=="col" { + mat `se' = `se'[1..`R', 1...] \ J(1, `C'+1, .z) + } + local names `"`names' "Total""' + local savenames0 `"`savenames0' "Total""' + local eqnames `"`eqnames' "Total""' + } + else { + mat `cell' = `cell'[1..`R', 1..`C'] + mat `count' = `count'[1..`R', 1..`C'] + mat `row' = `row'[1..`R', 1..`C'] + mat `col' = `col'[1..`R', 1..`C'] + } + if "`btype'"!="count" { + mata: st_matrix( st_local("lb"), invlogit( /// + logit(st_matrix(st_local("b"))) - strtoreal(st_local("tval")) * /// + st_matrix(st_local("se")) :/ /// + (st_matrix(st_local("b")) :* (1 :- st_matrix(st_local("b")))))) + mata: st_matrix( st_local("ub"), invlogit( /// + logit(st_matrix(st_local("b"))) + strtoreal(st_local("tval")) * /// + st_matrix(st_local("se")) :/ /// + (st_matrix(st_local("b")) :* (1 :- st_matrix(st_local("b")))))) + } + else { + mata: st_matrix( st_local("lb"), st_matrix(st_local("b")) - /// + strtoreal(st_local("tval")) * st_matrix(st_local("se")) ) + mata: st_matrix( st_local("ub"), st_matrix(st_local("b")) + /// + strtoreal(st_local("tval")) * st_matrix(st_local("se")) ) + } + if "`total'"=="" { + if "`btype'"=="row" { + mat `lb' = `lb'[1..., 1..`C'] , J(`R'+1, 1, .z) + mat `ub' = `ub'[1..., 1..`C'] , J(`R'+1, 1, .z) + } + else if "`btype'"=="col" { + mat `lb' = `lb'[1..`R', 1...] \ J(1, `C'+1, .z) + mat `ub' = `ub'[1..`R', 1...] \ J(1, `C'+1, .z) + } + else { + mat `lb'[`R'+1, `C'+1] = .z + mat `ub'[`R'+1, `C'+1] = .z + } + } + foreach m in cell count obs row col `DEFF' `DEFT' b se lb ub { // r x c matrix -> vector + mat rown ``m'' = `names' + gettoken eq rest : eqnames + forv c = 1/`=colsof(``m'')' { + mat roweq ``m'' = `"`eq'"' + mat `tmp' = nullmat(`tmp'), ``m''[1...,`c']' + gettoken eq rest : rest + } + mat drop ``m'' + mat rename `tmp' ``m'' + } + if "`percent'"!="" { + mat `cell' = `cell' * 100 + mat `col' = `col' * 100 + mat `row' = `row' * 100 + if e(setype)!="count" { + mat `b' = `b' * 100 + mat `se' = `se' * 100 + mat `lb' = `lb' * 100 + mat `ub' = `ub' * 100 + } + } + + // display + if "`quietly'"=="" { + /* + forv c = 1/`=colsof(`cell')' { + local savenames `"`savenames' `savenames0'"' + } + tempname res + mat `res' = `b'', `se'', `lb'', `ub'', `deff'', `deft'', `cell'', `row'', `col'', `count'', `obs'' + mat coln `res' = e(b) e(se) e(lb) e(ub) e(deff) e(deft) e(cell) e(row) e(col) e(count) e(obs) + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) nodotz + } + else { + mat rown `res' = `savenames' + di _n as res %-12s abbrev("`cvar'",12) as txt " {c |}{space 44}" + matlist `res', twidth(12) format(%9.0g) noblank nohalf /// + rowtitle(`rvar') nodotz + } + mat drop `res' + */ + local plabel = cond("`percent'"!="","percentages","proportions") + local blabel = cond("`e(setype)'"=="count", "weighted counts", "`e(setype)' `plabel'") + di _n as txt "saved vectors:" + di as txt %20s "e(b) = " " " as res "`blabel'" + di as txt %20s "e(se) = " " " as res "standard errors of `blabel'" + di as txt %20s "e(lb) = " " " as res "lower `level'% confidence bounds for `blabel'" + di as txt %20s "e(ub) = " " " as res "upper `level'% confidence bounds for `blabel'" + if "`DEFF'"!="" /// + di as txt %20s "e(deff) = " " " as res "deff for variances of `blabel'" + if "`DEFT'"!="" /// + di as txt %20s "e(deft) = " " " as res "deft for variances of `blabel'" + di as txt %20s "e(cell) = " " " as res "cell `plabel'" + di as txt %20s "e(row) = " " " as res "row `plabel'" + di as txt %20s "e(col) = " " " as res "column `plabel'" + di as txt %20s "e(count) = " " " as res "weighted counts" + di as txt %20s "e(obs) = " " " as res "number of observations" + if `"`labels'`eqlabels'"'!="" { + di "" + if `"`labels'"'!="" { + di as txt "row labels saved in macro e(labels)" + } + if `"`eqlabels'"'!="" { + di as txt "column labels saved in macro e(eqlabels)" + } + } + } + + // post results + erepost b=`b', cmd(estpost) nov `esample' + qui estadd local eqlabels `"`eqlabels'"' + qui estadd local labels `"`labels'"' + qui estadd local subcmd "tabulate" + qui estadd scalar level = `level' + foreach m in obs count row col cell `DEFT' `DEFF' ub lb se { + qui estadd matrix `m' = ``m'', replace + } +end + +* 11. estpost_margins: wrapper for -margins- (Stata 11) +prog estpost_margins, eclass + version 11 + local caller : di _caller() + + // syntax + _parse comma anything 0 : 0 + syntax [ , /*ESample*/ Quietly /// + post * ] + if "`post'"!="" { + di as err "post not allowed" + exit 198 + } + + // run margins + `quietly' version `caller': margins `anything', `options' + + // post results + capt postrtoe, noclear resize + if _rc<=1 { // -postrtoe- does not work, e.g., with -regress- + error _rc // _rc=1 (break) + exit + } + tempname b V + mat `b' = r(b) + mat `V' = r(V) + erepost b = `b' V = `V' /*, `esample'*/ + foreach r in `:r(scalars)' { + eret scalar `r' = r(`r') + } + foreach r in `:r(macros)' { + eret local `r' `"`r(`r')'"' + } + tempname tmp + foreach r in `:r(matrices)' { + if inlist("`r'", "b", "V") continue + mat `tmp' = r(`r') + eret matrix `r' = `tmp' + } +end + +* 12. estpost_gtabstat: wrapper for -gstats tabstat- (gtools required) +prog estpost_gtabstat, eclass + version 13.1 + local caller : di _caller() // not used + + cap gtools + if ( _rc ) { + disp as err "gtools required for estpost gtabstat" + exit 111 + } + + // syntax + syntax varlist [if] [in] [aw fw iw pw] [, ESample Quietly /// + Statistics(passthru) stats(passthru) /// + by(varname) Missing Columns(str) ELabels ] + local l = length(`"`columns'"') + if `"`columns'"'==substr("variables",1,max(1,`l')) local columns "variables" + else if `"`columns'"'==substr("statistics",1,max(1,`l')) local columns "statistics" + else if `"`columns'"'=="stats" local columns "statistics" + else if `"`columns'"'=="" { + if `:list sizeof varlist'>1 local columns "variables" + else local columns "statistics" + } + else { + di as err `"columns(`columns') invalid"' + exit 198 + } + + // sample + if "`listwise'"!="" marksample touse + else { + marksample touse, nov + _estpost_markout2 `touse' `varlist' + } + if "`by'"!="" { + capt confirm string variable `by' + local numby = (_rc!=0) + + // NOTE(mauricio): Not sure what this does. I think it's just + // a copy of the by variable so that _estpost_eqnamesandlabels + // parses the numeric input back into value labels? + // + // if `numby' { + // tempname tmpby + // qui gen `:type `by'' `tmpby' = `by' + // } + // else local tmpby `by' + // local byopt "by(`tmpby')" + + if "`missing'"=="" markout `touse' `by', strok + local byopt by(`by') + } + else local numby 0 + qui count if `touse' + local N = r(N) + if `N'==0 error 2000 + + if ( `"`missing'"' == "" ) local missing nomissing + + // gather results + tempname tmp + tempname gtabstat + qui gstats tabstat `varlist' if `touse' [`weight'`exp'], mata(`gtabstat') /// + `statistics' `stats' `byopt' `missing' columns(`columns') + + mata st_local("stats", invtokens(`gtabstat'.statnames)) + mata st_local("vars", invtokens(`gtabstat'.statvars)) + mata st_local("R", strofreal(`gtabstat'.ksources)) + mata st_local("g", strofreal(`gtabstat'.kby? `gtabstat'.J: 0)) + + local stats: subinstr local stats "N" "count", word all + local stats: subinstr local stats "se(mean)" "semean", word all + + if `"`columns'"'=="statistics" { + local cnames: copy local stats + } + else { + local cnames: copy local vars + } + local cnames: subinstr local cnames "b" "_b", word all + local cnames: subinstr local cnames "V" "_V", word all + + local j 0 + foreach cname of local cnames { + tempname _`++j' + } + + local space + local labels + forv i = 1/`g' { + if `numby' { + mata st_local("name", sprintf(st_varformat(`gtabstat'.byvars[1]), `gtabstat'.getnum(`i', 1))) + } + else { + mata st_local("name", `gtabstat'.getchar(`i', 1, 0)) + } + local labels `"`labels'`space'`"`name'"'"' + } + + if `R'==1 { + if `numby' { + _estpost_namesandlabels "`by'" `"`labels'"' "" "`elabels'" // sets names, savenames, labels + } + else { + _estpost_namesandlabels "" "" `"`labels'"' "`elabels'" // sets names, savenames, labels + } + } + else { + if `numby' { + _estpost_eqnamesandlabels "`by'" `"`labels'"' "" "`elabels'" // sets eqnames, eqlabels + } + else { + _estpost_eqnamesandlabels "" "" `"`labels'"' "`elabels'" // sets eqnames, eqlabels + } + local names `"`eqnames'"' + local labels `"`macval(eqlabels)'"' + } + + tempname glabname + tempname glabstat + tempname glabvar + tempname glabmat + + forv i = 1/`g' { + mata `glabname' = `gtabstat'.getf(`i', 1, .) + mata `glabmat' = `gtabstat'.colvar? `gtabstat'.getOutputGroup(`i'): `gtabstat'.getOutputGroup(`i')' + + if `"`columns'"'=="statistics" { + mata `glabstat' = (J(`gtabstat'.kstats, 1, ""), `gtabstat'.statnames') + mata `glabvar' = (J(`gtabstat'.ksources, 1, `glabname'), `gtabstat'.statvars') + } + else { + mata `glabstat' = (J(`gtabstat'.kstats, 1, `glabname'), `gtabstat'.statnames') + mata `glabvar' = (J(`gtabstat'.ksources, 1, ""), `gtabstat'.statvars') + } + + mata st_matrix("`tmp'", `glabmat') + mata st_matrixrowstripe("`tmp'", `glabstat') + mata st_matrixcolstripe("`tmp'", `glabvar') + + if `"`columns'"'=="statistics" { + mat `tmp' = `tmp'' + if ( `R'==1 ) { + mata `glabstat' = ("", `glabname') + mata `glabvar' = (J(`gtabstat'.kstats, 1, ""), `gtabstat'.statnames') + mata st_matrixrowstripe("`tmp'", `glabstat') + mata st_matrixcolstripe("`tmp'", `glabvar') + } + } + + local j 0 + foreach cname of local cnames { + local ++j + mat `_`j'' = nullmat(`_`j''), `tmp'[1..., `j']' + } + } + + if ( `g' == 0 ) { + mata `glabmat' = `gtabstat'.colvar? `gtabstat'.output: `gtabstat'.output' + mata `glabstat' = (J(`gtabstat'.kstats, 1, ""), `gtabstat'.statnames') + mata `glabvar' = (J(`gtabstat'.ksources, 1, ""), `gtabstat'.statvars') + + mata st_matrix("`tmp'", `glabmat') + mata st_matrixrowstripe("`tmp'", `glabstat') + mata st_matrixcolstripe("`tmp'", `glabvar') + if `"`columns'"'=="statistics" { + mat `tmp' = `tmp'' + } + + local j 0 + foreach cname of local cnames { + local ++j + mat `_`j'' = nullmat(`_`j''), `tmp'[1..., `j']' + } + } + + // display + if "`quietly'"=="" { + tempname res + local rescoln + local j 0 + foreach cname of local cnames { + local ++j + mat `res' = nullmat(`res'), `_`j''' + local rescoln `rescoln' e(`cname') + } + mat coln `res' = `rescoln' + di _n as txt "Summary statistics: `stats'" + di as txt " for variables: `vars'" + if "`by'"!="" { + di as txt " by categories of: `by'" + } + if c(stata_version)<9 { + mat list `res', noheader nohalf format(%9.0g) + } + else { + if `R'==1 & `g'>0 { + mat rown `res' = `savenames' + } + matlist `res', nohalf `rowtotal' rowtitle(`by') + } + if `"`macval(labels)'"'!="" { + di _n as txt "category labels saved in macro e(labels)" + } + mat drop `res' + } + + // post results + local b + local V + if c(stata_version)<9 { // b and V required in Stata 8 + tempname b V + mat `b' = `_1' \ J(1, colsof(`_1'), 0) + mat `b' = `b'[2,1...] + mat `V' = `b'' * `b' + } + if "`esample'"!="" local esample esample(`touse') + eret post `b' `V', obs(`N') `esample' + + eret local labels `"`macval(labels)'"' + eret local byvar "`by'" + eret local vars "`vars'" + eret local stats "`stats'" + eret local wexp `"`exp'"' + eret local wtype `"`weight'"' + eret local subcmd "tabstat" + eret local cmd "estpost" + + local nmat: list sizeof cnames + forv j=`nmat'(-1)1 { + local cname: word `j' of `cnames' + eret matrix `cname' = `_`j'' + } + + cap mata mata drop `gtabstat' + cap mata mata drop `glabname' + cap mata mata drop `glabstat' + cap mata mata drop `glabvar' + cap mata mata drop `glabmat' +end + +* 99. +* copy of erepost.ado, version 1.0.1, Ben Jann, 30jul2007 +* 14jan2009: noV option added => repost e(b) and remove e(V) if not specified +prog erepost, eclass + version 8.2 + syntax [anything(equalok)] [, NOV cmd(str) noEsample Esample2(varname) REName /// + Obs(passthru) Dof(passthru) PROPerties(passthru) * ] + if "`esample'"!="" & "`esample2'"!="" { + di as err "only one allowed of noesample and esample()" + exit 198 + } +// parse [b = b] [V = V] + if `"`anything'"'!="" { + tokenize `"`anything'"', parse(" =") + if `"`7'"'!="" error 198 + if `"`1'"'=="b" { + if `"`2'"'=="=" & `"`3'"'!="" { + local b `"`3'"' + confirm matrix `b' + } + else error 198 + if `"`4'"'=="V" { + if `"`5'"'=="=" & `"`6'"'!="" { + local v `"`6'"' + confirm matrix `b' + } + else error 198 + } + else if `"`4'"'!="" error 198 + } + else if `"`1'"'=="V" { + if `"`4'"'!="" error 198 + if `"`2'"'=="=" & `"`3'"'!="" { + local v `"`3'"' + confirm matrix `v' + } + else error 198 + } + else error 198 + } +//backup existing e()'s + if "`esample2'"!="" { + local sample "`esample2'" + } + else if "`esample'"=="" { + tempvar sample + gen byte `sample' = e(sample) + } + local emacros: e(macros) + if `"`properties'"'!="" { + local emacros: subinstr local emacros "properties" "", word + } + foreach emacro of local emacros { + local e_`emacro' `"`e(`emacro')'"' + } + local escalars: e(scalars) + if `"`obs'"'!="" { + local escalars: subinstr local escalars "N" "", word + } + if `"`dof'"'!="" { + local escalars: subinstr local escalars "df_r" "", word + } + foreach escalar of local escalars { + tempname e_`escalar' + scalar `e_`escalar'' = e(`escalar') + } + local ematrices: e(matrices) + if "`v'"=="" & "`nov'"!="" { // added 14jan2009 + local nov V + local ematrices : list ematrices - nov + } + if "`b'"=="" & `:list posof "b" in ematrices' { + tempname b + mat `b' = e(b) + } + if "`v'"=="" & `:list posof "V" in ematrices' { + tempname v + mat `v' = e(V) + } + local bV "b V" + local ematrices: list ematrices - bV + foreach ematrix of local ematrices { + tempname e_`ematrix' + matrix `e_`ematrix'' = e(`ematrix') + } +// rename + if "`b'"!="" & "`v'"!="" & "`rename'"!="" { + local eqnames: coleq `b', q + local vnames: colnames `b' + mat coleq `v' = `eqnames' + mat coln `v' = `vnames' + mat roweq `v' = `eqnames' + mat rown `v' = `vnames' + } +// post results + if "`esample'"=="" { + eret post `b' `v', esample(`sample') `obs' `dof' `properties' `options' + } + else { + eret post `b' `v', `obs' `dof' `properties' `options' + } + foreach emacro of local emacros { + eret local `emacro' `"`e_`emacro''"' + } + if `"`cmd'"'!="" { + eret local cmd `"`cmd'"' + } + foreach escalar of local escalars { + eret scalar `escalar' = scalar(`e_`escalar'') + } + foreach ematrix of local ematrices { + eret matrix `ematrix' = `e_`ematrix'' + } +end diff --git a/data/ado/e/estpost.hlp b/data/ado/e/estpost.hlp new file mode 100644 index 0000000..75e6927 --- /dev/null +++ b/data/ado/e/estpost.hlp @@ -0,0 +1,1524 @@ +{smcl} +{* 19may2021}{...} +{hi:help estpost}{right:also see: {helpb esttab}, {helpb estout}, {helpb eststo}, {helpb estadd}} +{right: {browse "http://repec.sowi.unibe.ch/stata/estout/"}} +{hline} + +{title:Title} + +{p 4 4 2}{hi:estpost} {hline 2} Post results from various commands in {cmd:e()} + + +{title:Syntax} + +{p 8 15 2} +{cmd:estpost} {it:{help estpost##commands:command}} [...] + +{marker commands} + {it:command}{col 26}description + {hline 79} + {helpb estpost##summarize:{ul:su}mmarize}{col 26}{...} +post summary statistics + {helpb estpost##tabstat:tabstat}{col 26}{...} +post summary statistics + {helpb estpost##gtabstat:gtabstat}{col 26}{...} +post summary statistics (using {helpb gstats tab} from {helpb gtools}) + {helpb estpost##ttest:ttest}{col 26}{...} +post two-group mean-comparison tests + {helpb estpost##prtest:prtest}{col 26}{...} +post two-group tests of proportions + {helpb estpost##tabulate:{ul:ta}bulate}{col 26}{...} +post one-way or two-way frequency table + {helpb estpost##svy_tabulate:svy: {ul:ta}bulate}{col 26}{...} +post frequency table for survey data + {helpb estpost##correlate:{ul:cor}relate}{col 26}{...} +post correlations + {helpb estpost##ci:ci}{col 26}{...} +post confidence intervals for means, + {col 26}{...} + proportions, or counts + {helpb estpost##stci:stci}{col 26}{...} +post confidence intervals for means + {col 26}{...} + and percentiles of survival time + {helpb estpost##margins:margins}{col 26}{...} +post results from {cmd:margins} (Stata 11 or newer) + {hline 79} + + +{title:Description} + +{p 4 4 2} +{cmd:estpost} posts results from various Stata commands in {cmd:e()} +so that they can be tabulated using {helpb esttab} or {helpb estout}. Type +{helpb ereturn:ereturn list} after {cmd:estpost} to list the elements saved +in {cmd:e()}. + + +{title:Commands} +{marker summarize} +{dlgtab:summarize} + +{p 4 15 2} +{cmd:estpost} {cmdab:su:mmarize} + [{it:{help varlist}}] [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:d:etail} + {cmdab:mean:only} + {cmdab:list:wise} + {cmdab:case:wise} + {cmdab:q:uietly} + {cmdab:es:ample} + ] + +{p 4 4 2} + posts summary statistics computed by {helpb summarize}. If no + {it:varlist} is specified, summary statistics are calculated for all + variables in the dataset. + +{p 4 4 2} + {cmd:aweight}s, {cmd:fweight}s, and {cmd:iweight}s are allowed + (however, {cmd:iweight}s may not be used with the {cmd:detail} option); + see {help weight}. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:detail} and {cmd:meanonly} as described in help {helpb summarize}. + +{p 8 12 2} + {cmd:listwise} to handle missing values through listwise deletion, + meaning that an observation is omitted from the estimation + sample if any of the variables in {it:varlist} is missing for that + observation. The default is to determine the used observations for + each variable separately without regard to whether other variables + are missing. {cmd:casewise} is a synonym for {cmd:listwise}. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 4 4 2}The following results vectors are saved in {cmd:e()}: + + {lalign 13:{cmd:e(count)}}number of observations + {lalign 13:{cmd:e(mean)}}mean + {lalign 13:{cmd:e(min)}}minimum + {lalign 13:{cmd:e(max)}}maximum + {lalign 13:{cmd:e(sum)}}sum of variable + {lalign 13:{cmd:e(sum_w)}}sum of the weights + {lalign 13:{cmd:e(Var)}}variance (unless {cmd:meanonly}) + {lalign 13:{cmd:e(sd)}}standard deviation (unless {cmd:meanonly}) + {lalign 13:{cmd:e(p1)}}1st percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p5)}}5th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p10)}}10th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p25)}}25th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p50)}}50th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p75)}}75th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p90)}}90th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p95)}}95th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(p99)}}99th percentile ({cmd:detail} only) + {lalign 13:{cmd:e(skewness)}}skewness ({cmd:detail} only) + {lalign 13:{cmd:e(kurtosis)}}kurtosis ({cmd:detail} only) + +{p 4 4 2} + Example: + +{* begin example summarize }{...} + {com}. sysuse auto, clear + {txt}(1978 Automobile Data) + + {com}. estpost summarize price mpg rep78 foreign + + {txt}{ralign 12:} {c |} {ralign 9:e(count)} {ralign 9:e(sum_w)} {ralign 9:e(mean)} {ralign 9:e(Var)} {ralign 9:e(sd)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 6165.257}}} {ralign 9:{res:{sf: 8699526}}} {ralign 9:{res:{sf: 2949.496}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 21.2973}}} {ralign 9:{res:{sf: 33.47205}}} {ralign 9:{res:{sf: 5.785503}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 69}}} {ralign 9:{res:{sf: 69}}} {ralign 9:{res:{sf: 3.405797}}} {ralign 9:{res:{sf: .9799659}}} {ralign 9:{res:{sf: .9899323}}} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: .2972973}}} {ralign 9:{res:{sf: .2117734}}} {ralign 9:{res:{sf: .4601885}}} + + {ralign 12:} {c |} {ralign 9:e(min)} {ralign 9:e(max)} {ralign 9:e(sum)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 3291}}} {ralign 9:{res:{sf: 15906}}} {ralign 9:{res:{sf: 456229}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 12}}} {ralign 9:{res:{sf: 41}}} {ralign 9:{res:{sf: 1576}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf: 5}}} {ralign 9:{res:{sf: 235}}} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf: 0}}} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf: 22}}} + + {com}. esttab ., cells("mean sd count") noobs + {res} + {txt}{hline 51} + {txt} (1) + {txt} + {txt} mean sd count + {txt}{hline 51} + {txt}price {res} 6165.257 2949.496 74{txt} + {txt}mpg {res} 21.2973 5.785503 74{txt} + {txt}rep78 {res} 3.405797 .9899323 69{txt} + {txt}foreign {res} .2972973 .4601885 74{txt} + {txt}{hline 51} +{* end example }{txt}{...} + +{marker tabstat} +{dlgtab:tabstat} + +{p 4 15 2} +{cmd:estpost} {cmdab:tabstat} + {it:{help varlist}} [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:s:tatistics:(}{it:{help tabstat##statname:statname}} [{it:...}]{cmd:)} + {cmdab:c:olumns:(}{cmdab:v:ariables}|{cmdab:s:tatistics:)} + {cmd:by(}{it:varname}{cmd:)} + {cmdab:not:otal} + {cmdab:m:issing} + {cmdab:list:wise} + {cmdab:case:wise} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels} + ] + +{p 4 4 2} + posts summary statistics computed by {helpb tabstat}. {cmd:aweight}s and + {cmd:fweight}s are allowed; see {help weight}. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:statistics()}, {cmd:columns()}, {cmd:by()}, {cmd:nototal}, + and {cmd:missing} as described in help {helpb tabstat}. + +{p 8 12 2} + {cmd:listwise} to handle missing values through listwise deletion, + meaning that an observation is omitted from the estimation + sample if any of the variables in {it:varlist} is missing for that + observation. The default is to determine the used observations for + each variable separately without regard to whether other variables + are missing. {cmd:casewise} is a synonym for {cmd:listwise}. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 8 12 2} + {cmd:elabels} to enforce saving the {cmd:by()} values/labels in macro + {cmd:e(labels)}. + +{p 4 4 2}A vector of results is saved in {cmd:e()} for each specified +variable or statistic, depending on {cmd:columns()}. + +{p 4 4 2} + Examples: + +{* begin example tabstat }{...} + {com}. sysuse auto, clear + {txt}(1978 Automobile Data) + + {com}. estpost tabstat price mpg rep78, listwise /// + > statistics(mean sd) + + {txt}Summary statistics: mean sd + for variables: price mpg rep78 + + {ralign 12:} {c |} {ralign 9:e(price)} {ralign 9:e(mpg)} {ralign 9:e(rep78)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11} + {ralign 12:mean} {c |} {ralign 9:{res:{sf: 6146.043}}} {ralign 9:{res:{sf: 21.28986}}} {ralign 9:{res:{sf: 3.405797}}} + {ralign 12:sd} {c |} {ralign 9:{res:{sf: 2912.44}}} {ralign 9:{res:{sf: 5.866408}}} {ralign 9:{res:{sf: .9899323}}} + + {com}. esttab ., cells("price mpg rep78") + {res} + {txt}{hline 51} + {txt} (1) + {txt} + {txt} price mpg rep78 + {txt}{hline 51} + {txt}mean {res} 6146.043 21.28986 3.405797{txt} + {txt}sd {res} 2912.44 5.866408 .9899323{txt} + {txt}{hline 51} + {txt}N {res} 69 {txt} + {txt}{hline 51} + + {com}. estpost tabstat price mpg rep78, listwise /// + > statistics(mean sd) columns(statistics) + + {txt}Summary statistics: mean sd + for variables: price mpg rep78 + + {ralign 12:} {c |} {ralign 9:e(mean)} {ralign 9:e(sd)} + {hline 13}{c +}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6146.043}}} {ralign 9:{res:{sf: 2912.44}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 21.28986}}} {ralign 9:{res:{sf: 5.866408}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 3.405797}}} {ralign 9:{res:{sf: .9899323}}} + + {com}. esttab ., cells("mean(fmt(a3)) sd") + {res} + {txt}{hline 38} + {txt} (1) + {txt} + {txt} mean sd + {txt}{hline 38} + {txt}price {res} 6146.0 2912.4{txt} + {txt}mpg {res} 21.29 5.866{txt} + {txt}rep78 {res} 3.406 0.990{txt} + {txt}{hline 38} + {txt}N {res} 69 {txt} + {txt}{hline 38} + + {com}. estpost tabstat price mpg rep78, by(foreign) /// + > statistics(mean sd) columns(statistics) listwise + + {txt}Summary statistics: mean sd + for variables: price mpg rep78 + by categories of: foreign + + {ralign 12:foreign} {c |} {ralign 9:e(mean)} {ralign 9:e(sd)} + {hline 13}{c +}{hline 11}{hline 11} + {res:{lalign 13:Domestic}}{c |}{space 11}{space 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6179.25}}} {ralign 9:{res:{sf: 3188.969}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 19.54167}}} {ralign 9:{res:{sf: 4.753312}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 3.020833}}} {ralign 9:{res:{sf: .837666}}} + {hline 13}{c +}{hline 11}{hline 11} + {res:{lalign 13:Foreign}}{c |}{space 11}{space 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6070.143}}} {ralign 9:{res:{sf: 2220.984}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 25.28571}}} {ralign 9:{res:{sf: 6.309856}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 4.285714}}} {ralign 9:{res:{sf: .7171372}}} + {hline 13}{c +}{hline 11}{hline 11} + {res:{lalign 13:Total}}{c |}{space 11}{space 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6146.043}}} {ralign 9:{res:{sf: 2912.44}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 21.28986}}} {ralign 9:{res:{sf: 5.866408}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 3.405797}}} {ralign 9:{res:{sf: .9899323}}} + + {com}. esttab ., main(mean) aux(sd) nostar unstack /// + > noobs nonote label + {res} + {txt}{hline 59} + {txt} (1) + {txt} + {txt} Domestic Foreign Total + {txt}{hline 59} + {txt}Price {res} 6179.3 6070.1 6146.0{txt} + {res} {ralign 12:{txt:(}3189.0{txt:)}} {ralign 12:{txt:(}2221.0{txt:)}} {ralign 12:{txt:(}2912.4{txt:)}}{txt} + + {txt}Mileage (mpg) {res} 19.54 25.29 21.29{txt} + {res} {ralign 12:{txt:(}4.753{txt:)}} {ralign 12:{txt:(}6.310{txt:)}} {ralign 12:{txt:(}5.866{txt:)}}{txt} + + {txt}Repair Record 1978 {res} 3.021 4.286 3.406{txt} + {res} {ralign 12:{txt:(}0.838{txt:)}} {ralign 12:{txt:(}0.717{txt:)}} {ralign 12:{txt:(}0.990{txt:)}}{txt} + {txt}{hline 59} +{* end example }{txt}{...} + +{marker gtabstat} +{dlgtab:gtabstat} + +{p 4 15 2} +{cmd:estpost} {cmdab:gtabstat} + {it:{help varlist}} [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:s:tatistics:(}{it:{help gstats tab##statname:statname}} [{it:...}]{cmd:)} + {cmdab:c:olumns:(}{cmdab:v:ariables}|{cmdab:s:tatistics:)} + {cmd:by(}{it:varname}{cmd:)} + {cmdab:m:issing} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels} + ] + +{p 4 4 2} + posts summary statistics computed by {helpb gstats tab} from + the {helpb gtools} package. {cmd:gstats tab} is a fast, by-able + alternative to {cmd:tabstat}. {cmd:aweight}s, {cmd:fweight}s, {cmd:pweight}s + and {cmd:pweight}s are allowed; see {help weight}. However, {cmd:total}, {cmd:casewise}, + and {cmd:listwise} are not allowed. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:statistics()}, {cmd:columns()}, and {cmd:by()} as described + in help {helpb gstats tab}. By default {cmd:nomissing} is passed; + use {cmd:missing} to include missing-value groups. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 8 12 2} + {cmd:elabels} to enforce saving the {cmd:by()} values/labels in macro + {cmd:e(labels)}. + +{p 4 4 2}A vector of results is saved in {cmd:e()} for each specified +variable or statistic, depending on {cmd:columns()}. + +{p 4 4 2} + Examples: + +{* begin example gtabstat }{...} + {com}. sysuse auto, clear + {txt}(1978 Automobile Data) + + {com}. estpost gtabstat price mpg rep78, /// + > statistics(mean sd) + + {txt}Summary statistics: mean sd + for variables: price mpg rep78 + + {ralign 12:} {c |} {ralign 9:e(price)} {ralign 9:e(mpg)} {ralign 9:e(rep78)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11} + {ralign 12:mean} {c |} {ralign 9:{res:{sf: 6146.043}}} {ralign 9:{res:{sf: 21.28986}}} {ralign 9:{res:{sf: 3.405797}}} + {ralign 12:sd} {c |} {ralign 9:{res:{sf: 2912.44}}} {ralign 9:{res:{sf: 5.866408}}} {ralign 9:{res:{sf: .9899323}}} + + {com}. esttab ., cells("price mpg rep78") + {res} + {txt}{hline 51} + {txt} (1) + {txt} + {txt} price mpg rep78 + {txt}{hline 51} + {txt}mean {res} 6146.043 21.28986 3.405797{txt} + {txt}sd {res} 2912.44 5.866408 .9899323{txt} + {txt}{hline 51} + {txt}N {res} 69 {txt} + {txt}{hline 51} + + {com}. estpost gtabstat price mpg rep78, /// + > statistics(mean sd) columns(statistics) + + {txt}Summary statistics: mean sd + for variables: price mpg rep78 + + {ralign 12:} {c |} {ralign 9:e(mean)} {ralign 9:e(sd)} + {hline 13}{c +}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6146.043}}} {ralign 9:{res:{sf: 2912.44}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 21.28986}}} {ralign 9:{res:{sf: 5.866408}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 3.405797}}} {ralign 9:{res:{sf: .9899323}}} + + {com}. esttab ., cells("mean(fmt(a3)) sd") + {res} + {txt}{hline 38} + {txt} (1) + {txt} + {txt} mean sd + {txt}{hline 38} + {txt}price {res} 6146.0 2912.4{txt} + {txt}mpg {res} 21.29 5.866{txt} + {txt}rep78 {res} 3.406 0.990{txt} + {txt}{hline 38} + {txt}N {res} 69 {txt} + {txt}{hline 38} + + {com}. estpost gtabstat price mpg rep78, by(foreign) /// + > statistics(mean sd) columns(statistics) + + {txt}Summary statistics: mean sd + for variables: price mpg rep78 + by categories of: foreign + + {ralign 12:foreign} {c |} {ralign 9:e(mean)} {ralign 9:e(sd)} + {hline 13}{c +}{hline 11}{hline 11} + {res:{lalign 13:Domestic}}{c |}{space 11}{space 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6179.25}}} {ralign 9:{res:{sf: 3188.969}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 19.54167}}} {ralign 9:{res:{sf: 4.753312}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 3.020833}}} {ralign 9:{res:{sf: .837666}}} + {hline 13}{c +}{hline 11}{hline 11} + {res:{lalign 13:Foreign}}{c |}{space 11}{space 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6070.143}}} {ralign 9:{res:{sf: 2220.984}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 25.28571}}} {ralign 9:{res:{sf: 6.309856}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 4.285714}}} {ralign 9:{res:{sf: .7171372}}} + {hline 13}{c +}{hline 11}{hline 11} + {res:{lalign 13:Total}}{c |}{space 11}{space 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6146.043}}} {ralign 9:{res:{sf: 2912.44}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 21.28986}}} {ralign 9:{res:{sf: 5.866408}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 3.405797}}} {ralign 9:{res:{sf: .9899323}}} + + {com}. esttab ., main(mean) aux(sd) nostar unstack /// + > noobs nonote label + {res} + {txt}{hline 59} + {txt} (1) + {txt} + {txt} Domestic Foreign Total + {txt}{hline 59} + {txt}Price {res} 6179.3 6070.1 6146.0{txt} + {res} {ralign 12:{txt:(}3189.0{txt:)}} {ralign 12:{txt:(}2221.0{txt:)}} {ralign 12:{txt:(}2912.4{txt:)}}{txt} + + {txt}Mileage (mpg) {res} 19.54 25.29 21.29{txt} + {res} {ralign 12:{txt:(}4.753{txt:)}} {ralign 12:{txt:(}6.310{txt:)}} {ralign 12:{txt:(}5.866{txt:)}}{txt} + + {txt}Repair Record 1978 {res} 3.021 4.286 3.406{txt} + {res} {ralign 12:{txt:(}0.838{txt:)}} {ralign 12:{txt:(}0.717{txt:)}} {ralign 12:{txt:(}0.990{txt:)}}{txt} + {txt}{hline 59} +{* end example }{txt}{...} + +{marker ttest} +{dlgtab:ttest} + +{p 4 15 2} +{cmd:estpost} {cmdab:ttest} + {it:{help varlist}} [{it:{help if}}] [{it:{help in}}]{cmd:,} + {cmd:by(}{it:groupvar}{cmd:)} + [ + {cmdab:une:qual} {cmdab:w:elch} + {cmdab:list:wise} + {cmdab:case:wise} + {cmdab:q:uietly} + {cmdab:es:ample} + ] + +{p 4 4 2} + posts two-group mean-comparison tests computed by {helpb ttest}. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:by()}, {cmd:unequal}, and {cmd:welch} as described in + help {helpb ttest}. + +{p 8 12 2} + {cmd:listwise} to handle missing values through listwise deletion, + meaning that an observation is omitted from the estimation + sample if any of the variables in {it:varlist} is missing for that + observation. The default is to determine the used observations for + each variable separately without regard to whether other variables + are missing. {cmd:casewise} is a synonym for {cmd:listwise}. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 4 4 2}The following results vectors are saved in {cmd:e()}: + + {lalign 13:{cmd:e(b)}}mean difference + {lalign 13:{cmd:e(count)}}number of observations + {lalign 13:{cmd:e(se)}}standard error of difference + {lalign 13:{cmd:e(t)}}t statistic + {lalign 13:{cmd:e(df_t)}}degrees of freedom + {lalign 13:{cmd:e(p_l)}}lower one-sided p-value + {lalign 13:{cmd:e(p)}}two-sided p-value + {lalign 13:{cmd:e(p_u)}}upper one-sided p-value + {lalign 13:{cmd:e(N_1)}}number of observations in group 1 + {lalign 13:{cmd:e(mu_1)}}mean in group 1 + {lalign 13:{cmd:e(N_2)}}number of observations in group 2 + {lalign 13:{cmd:e(mu_2)}}mean in group 2 + +{p 4 4 2} + Example: + +{* begin example ttest }{...} + {com}. sysuse auto, clear + {txt}(1978 Automobile Data) + + {com}. estpost ttest price mpg headroom trunk, by(foreign) + + {txt}{ralign 12:} {c |} {ralign 9:e(b)} {ralign 9:e(count)} {ralign 9:e(se)} {ralign 9:e(t)} {ralign 9:e(df_t)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf:-312.2587}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 754.4488}}} {ralign 9:{res:{sf:-.4138899}}} {ralign 9:{res:{sf: 72}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf:-4.945804}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 1.362162}}} {ralign 9:{res:{sf:-3.630848}}} {ralign 9:{res:{sf: 72}}} + {ralign 12:headroom} {c |} {ralign 9:{res:{sf: .5402098}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: .2070884}}} {ralign 9:{res:{sf: 2.608596}}} {ralign 9:{res:{sf: 72}}} + {ralign 12:trunk} {c |} {ralign 9:{res:{sf: 3.340909}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 1.022208}}} {ralign 9:{res:{sf: 3.268327}}} {ralign 9:{res:{sf: 72}}} + + {ralign 12:} {c |} {ralign 9:e(p_l)} {ralign 9:e(p)} {ralign 9:e(p_u)} {ralign 9:e(N_1)} {ralign 9:e(mu_1)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: .3400925}}} {ralign 9:{res:{sf: .6801851}}} {ralign 9:{res:{sf: .6599075}}} {ralign 9:{res:{sf: 52}}} {ralign 9:{res:{sf: 6072.423}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: .0002627}}} {ralign 9:{res:{sf: .0005254}}} {ralign 9:{res:{sf: .9997373}}} {ralign 9:{res:{sf: 52}}} {ralign 9:{res:{sf: 19.82692}}} + {ralign 12:headroom} {c |} {ralign 9:{res:{sf: .9944757}}} {ralign 9:{res:{sf: .0110486}}} {ralign 9:{res:{sf: .0055243}}} {ralign 9:{res:{sf: 52}}} {ralign 9:{res:{sf: 3.153846}}} + {ralign 12:trunk} {c |} {ralign 9:{res:{sf: .99917}}} {ralign 9:{res:{sf: .00166}}} {ralign 9:{res:{sf: .00083}}} {ralign 9:{res:{sf: 52}}} {ralign 9:{res:{sf: 14.75}}} + + {ralign 12:} {c |} {ralign 9:e(N_2)} {ralign 9:e(mu_2)} + {hline 13}{c +}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 22}}} {ralign 9:{res:{sf: 6384.682}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 22}}} {ralign 9:{res:{sf: 24.77273}}} + {ralign 12:headroom} {c |} {ralign 9:{res:{sf: 22}}} {ralign 9:{res:{sf: 2.613636}}} + {ralign 12:trunk} {c |} {ralign 9:{res:{sf: 22}}} {ralign 9:{res:{sf: 11.40909}}} + + {com}. esttab ., wide + {res} + {txt}{hline 41} + {txt} (1) + {txt} + {txt}{hline 41} + {txt}price {res} -312.3 {ralign 12:{txt:(}-0.41{txt:)}}{txt} + {txt}mpg {res} -4.946*** {ralign 12:{txt:(}-3.63{txt:)}}{txt} + {txt}headroom {res} 0.540* {ralign 12:{txt:(}2.61{txt:)}}{txt} + {txt}trunk {res} 3.341** {ralign 12:{txt:(}3.27{txt:)}}{txt} + {txt}{hline 41} + {txt}N {res} 74 {txt} + {txt}{hline 41} + {txt}t statistics in parentheses + {txt}* p<0.05, ** p<0.01, *** p<0.001 +{* end example }{txt}{...} + +{marker prtest} +{dlgtab:prtest} + +{p 4 15 2} +{cmd:estpost} {cmdab:prtest} + {it:{help varlist}} [{it:{help if}}] [{it:{help in}}]{cmd:,} + {cmd:by(}{it:groupvar}{cmd:)} + [ + {cmdab:list:wise} + {cmdab:case:wise} + {cmdab:q:uietly} + {cmdab:es:ample} + ] + +{p 4 4 2} + posts two-group tests of proportions computed by {helpb prtest}. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:by()} as described in + help {helpb prtest}. + +{p 8 12 2} + {cmd:listwise} to handle missing values through listwise deletion, + meaning that an observation is omitted from the estimation + sample if any of the variables in {it:varlist} is missing for that + observation. The default is to determine the used observations for + each variable separately without regard to whether other variables + are missing. {cmd:casewise} is a synonym for {cmd:listwise}. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 4 4 2}The following results vectors are saved in {cmd:e()}: + + {lalign 13:{cmd:e(b)}}difference in proportions + {lalign 13:{cmd:e(count)}}number of observations + {lalign 13:{cmd:e(se)}}standard error of difference + {lalign 13:{cmd:e(se0)}}standard error under Ho + {lalign 13:{cmd:e(z)}}z statistic + {lalign 13:{cmd:e(p_l)}}lower one-sided p-value + {lalign 13:{cmd:e(p)}}two-sided p-value + {lalign 13:{cmd:e(p_u)}}upper one-sided p-value + {lalign 13:{cmd:e(N_1)}}number of observations in group 1 + {lalign 13:{cmd:e(P_1)}}proportion in group 1 + {lalign 13:{cmd:e(N_2)}}number of observations in group 2 + {lalign 13:{cmd:e(P_2)}}proportion in group 2 + +{p 4 4 2} + Example: + +{* begin example prtest }{...} + {com}. webuse cure2, clear + {txt} + {com}. estpost prtest cure, by(sex) + + {txt}{ralign 12:} {c |} {ralign 9:e(b)} {ralign 9:e(count)} {ralign 9:e(se)} {ralign 9:e(se0)} {ralign 9:e(z)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:cure} {c |} {ralign 9:{res:{sf:-.0729167}}} {ralign 9:{res:{sf: 109}}} {ralign 9:{res:{sf: .0933123}}} {ralign 9:{res:{sf: .0942404}}} {ralign 9:{res:{sf:-.7737309}}} + + {ralign 12:} {c |} {ralign 9:e(p_l)} {ralign 9:e(p)} {ralign 9:e(p_u)} {ralign 9:e(N_1)} {ralign 9:e(P_1)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:cure} {c |} {ralign 9:{res:{sf: .219545}}} {ralign 9:{res:{sf: .43909}}} {ralign 9:{res:{sf: .780455}}} {ralign 9:{res:{sf: 64}}} {ralign 9:{res:{sf: .59375}}} + + {ralign 12:} {c |} {ralign 9:e(N_2)} {ralign 9:e(P_2)} + {hline 13}{c +}{hline 11}{hline 11} + {ralign 12:cure} {c |} {ralign 9:{res:{sf: 45}}} {ralign 9:{res:{sf: .6666667}}} + + {com}. esttab ., cell("b se0 z p") + {res} + {txt}{hline 64} + {txt} (1) + {txt} + {txt} b se0 z p + {txt}{hline 64} + {txt}cure {res} -.0729167 .0942404 -.7737309 .43909{txt} + {txt}{hline 64} + {txt}N {res} 109 {txt} + {txt}{hline 64} +{* end example }{txt}{...} + +{marker tabulate} +{dlgtab:tabulate} + +{p 4 4 2}One-way table: + +{p 8 15 2} +{cmd:estpost} {cmdab:ta:bulate} + {it:varname} [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:m:issing} + {cmdab:nol:abel} + {cmd:sort} + {cmd:subpop(}{it:varname}{cmd:)} + {cmdab:notot:al} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels} + ] + +{p 4 4 2}Two-way table: + +{p 8 15 2} +{cmd:estpost} {cmdab:ta:bulate} + {it:varname1} {it:varname2} [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:m:issing} + {cmdab:nol:abel} + {cmdab:ch:i2} + {cmdab:e:xact}[{cmd:(}{it:#}{cmd:)}] + {cmdab:g:amma} + {cmdab:lr:chi2} + {cmdab:t:aub} + {cmdab:v} + {cmdab:notot:al} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels} + ] + +{p 4 4 2} + {cmd:estpost tabulate} posts a one-way or two-way table + computed by {helpb tabulate}. {cmd:aweight}s, {cmd:fweight}s, + and {cmd:iweight}s are allowed; see {help weight}. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:missing}, + {cmd:nolabel}, + {cmd:sort}, + {cmd:subpop()}, + {cmd:chi2}, + {cmd:exact}, + {cmd:gamma}, + {cmd:lrchi2}, + {cmd:taub}, and + {cmd:v} + as described in help {helpb tabulate}. + +{p 8 12 2} + {cmdab:nototal} to omit row and column totals. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 8 12 2} + {cmd:elabels} to enforce saving labels in {cmd:e(labels)} and + {cmd:e(eqlabels)}. + +{p 4 4 2}The following vectors are saved in {cmd:e()}: + + {lalign 13:{cmd:e(b)}}frequency counts + {lalign 13:{cmd:e(pct)}}percent + {lalign 13:{cmd:e(cumpct)}}cumulative percent (one-way only) + {lalign 13:{cmd:e(colpct)}}column percent (two-way only) + {lalign 13:{cmd:e(rowpct)}}row percent (two-way only) + +{p 4 4 2}If two-way options such as, e.g., {cmd:chi2} or {cmd:exact} are +specified, the results of the tests added as scalars in {cmd:e()} using the +names documented in {helpb tabulate:{bind:[R] tabulate}}. + +{p 4 4 2}The value labels of the row variable are stored as names in the +saved vectors, unless +no label exceeds 30 characters or contains unsuitable characters in which case +the labels are stored in macro {cmd:e(labels)}. Type +{cmd:varlabels(`e(labels)')} in {helpb esttab} or {helpb estout} to +use the labels stored {cmd:e(labels)}. The value labels of the column variable +are stored as equation names or, alternatively, +in macro {cmd:e(eqlabels)}. Type {cmd:eqlabels(`e(eqlabels)')} in +{helpb esttab} or {helpb estout} to use the labels stored in +{cmd:e(eqlabels)}. Specify the {cmd:elabels} option to enforce saving labels +in {cmd:e(labels)} and {cmd:e(eqlabels)}. + +{p 4 4 2}Examples: + +{* begin example tabulate }{...} + {com}. sysuse auto, clear + {txt}(1978 Automobile Data) + + {com}. estpost tabulate foreign + + {txt}{ralign 12:foreign} {c |} {ralign 9:e(b)} {ralign 9:e(pct)} {ralign 9:e(cumpct)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11} + {ralign 12:Domestic} {c |} {ralign 9:{res:{sf: 52}}} {ralign 9:{res:{sf: 70.27027}}} {ralign 9:{res:{sf: 70.27027}}} + {ralign 12:Foreign} {c |} {ralign 9:{res:{sf: 22}}} {ralign 9:{res:{sf: 29.72973}}} {ralign 9:{res:{sf: 100}}} + {hline 13}{c +}{hline 11}{hline 11}{hline 11} + {ralign 12:Total} {c |} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: 100}}} {ralign 9:{res:{sf:{space 9}}}} + + {com}. esttab ., cells("b pct(fmt(2)) cumpct(fmt(2))") noobs + {res} + {txt}{hline 51} + {txt} (1) + {txt} foreign + {txt} b pct cumpct + {txt}{hline 51} + {txt}Domestic {res} 52 70.27 70.27{txt} + {txt}Foreign {res} 22 29.73 100.00{txt} + {txt}Total {res} 74 100.00 {txt} + {txt}{hline 51} + + {com}. estpost tabulate rep78 foreign + + {res}foreign {txt} {c |}{space 44} + {ralign 12:rep78} {c |} {ralign 9:e(b)} {ralign 9:e(pct)} {ralign 9:e(colpct)} {ralign 9:e(rowpct)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11} + {res:{lalign 13:Domestic}}{c |}{space 11}{space 11}{space 11}{space 11} + {ralign 12:1} {c |} {ralign 9:{res:{sf: 2}}} {ralign 9:{res:{sf: 2.898551}}} {ralign 9:{res:{sf: 4.166667}}} {ralign 9:{res:{sf: 100}}} + {ralign 12:2} {c |} {ralign 9:{res:{sf: 8}}} {ralign 9:{res:{sf: 11.5942}}} {ralign 9:{res:{sf: 16.66667}}} {ralign 9:{res:{sf: 100}}} + {ralign 12:3} {c |} {ralign 9:{res:{sf: 27}}} {ralign 9:{res:{sf: 39.13043}}} {ralign 9:{res:{sf: 56.25}}} {ralign 9:{res:{sf: 90}}} + {ralign 12:4} {c |} {ralign 9:{res:{sf: 9}}} {ralign 9:{res:{sf: 13.04348}}} {ralign 9:{res:{sf: 18.75}}} {ralign 9:{res:{sf: 50}}} + {ralign 12:5} {c |} {ralign 9:{res:{sf: 2}}} {ralign 9:{res:{sf: 2.898551}}} {ralign 9:{res:{sf: 4.166667}}} {ralign 9:{res:{sf: 18.18182}}} + {ralign 12:Total} {c |} {ralign 9:{res:{sf: 48}}} {ralign 9:{res:{sf: 69.56522}}} {ralign 9:{res:{sf: 100}}} {ralign 9:{res:{sf: 69.56522}}} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11} + {res:{lalign 13:Foreign}}{c |}{space 11}{space 11}{space 11}{space 11} + {ralign 12:1} {c |} {ralign 9:{res:{sf: 0}}} {ralign 9:{res:{sf: 0}}} {ralign 9:{res:{sf: 0}}} {ralign 9:{res:{sf: 0}}} + {ralign 12:2} {c |} {ralign 9:{res:{sf: 0}}} {ralign 9:{res:{sf: 0}}} {ralign 9:{res:{sf: 0}}} {ralign 9:{res:{sf: 0}}} + {ralign 12:3} {c |} {ralign 9:{res:{sf: 3}}} {ralign 9:{res:{sf: 4.347826}}} {ralign 9:{res:{sf: 14.28571}}} {ralign 9:{res:{sf: 10}}} + {ralign 12:4} {c |} {ralign 9:{res:{sf: 9}}} {ralign 9:{res:{sf: 13.04348}}} {ralign 9:{res:{sf: 42.85714}}} {ralign 9:{res:{sf: 50}}} + {ralign 12:5} {c |} {ralign 9:{res:{sf: 9}}} {ralign 9:{res:{sf: 13.04348}}} {ralign 9:{res:{sf: 42.85714}}} {ralign 9:{res:{sf: 81.81818}}} + {ralign 12:Total} {c |} {ralign 9:{res:{sf: 21}}} {ralign 9:{res:{sf: 30.43478}}} {ralign 9:{res:{sf: 100}}} {ralign 9:{res:{sf: 30.43478}}} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11} + {res:{lalign 13:Total}}{c |}{space 11}{space 11}{space 11}{space 11} + {ralign 12:1} {c |} {ralign 9:{res:{sf: 2}}} {ralign 9:{res:{sf: 2.898551}}} {ralign 9:{res:{sf: 2.898551}}} {ralign 9:{res:{sf: 100}}} + {ralign 12:2} {c |} {ralign 9:{res:{sf: 8}}} {ralign 9:{res:{sf: 11.5942}}} {ralign 9:{res:{sf: 11.5942}}} {ralign 9:{res:{sf: 100}}} + {ralign 12:3} {c |} {ralign 9:{res:{sf: 30}}} {ralign 9:{res:{sf: 43.47826}}} {ralign 9:{res:{sf: 43.47826}}} {ralign 9:{res:{sf: 100}}} + {ralign 12:4} {c |} {ralign 9:{res:{sf: 18}}} {ralign 9:{res:{sf: 26.08696}}} {ralign 9:{res:{sf: 26.08696}}} {ralign 9:{res:{sf: 100}}} + {ralign 12:5} {c |} {ralign 9:{res:{sf: 11}}} {ralign 9:{res:{sf: 15.94203}}} {ralign 9:{res:{sf: 15.94203}}} {ralign 9:{res:{sf: 100}}} + {ralign 12:Total} {c |} {ralign 9:{res:{sf: 69}}} {ralign 9:{res:{sf: 100}}} {ralign 9:{res:{sf: 100}}} {ralign 9:{res:{sf: 100}}} + + {com}. esttab ., cell(colpct(fmt(2))) unstack noobs + {res} + {txt}{hline 51} + {txt} (1) + {txt} + {txt} Domestic Foreign Total + {txt} colpct colpct colpct + {txt}{hline 51} + {txt}1 {res} 4.17 0.00 2.90{txt} + {txt}2 {res} 16.67 0.00 11.59{txt} + {txt}3 {res} 56.25 14.29 43.48{txt} + {txt}4 {res} 18.75 42.86 26.09{txt} + {txt}5 {res} 4.17 42.86 15.94{txt} + {txt}Total {res} 100.00 100.00 100.00{txt} + {txt}{hline 51} + + {com}. esttab ., cell(colpct(fmt(2)) count(fmt(g) par keep(Total))) /// + > collabels(none) unstack noobs nonumber nomtitle /// + > eqlabels(, lhs("Repair Rec.")) /// + > varlabels(, blist(Total "{c -(}hline @width{c )-}{c -(}break{c )-}")) + {res} + {txt}{hline 51} + {txt}Repair Rec. Domestic Foreign Total + {txt}{hline 51} + {txt}1 {res} 4.17 0.00 2.90{txt} + {txt}2 {res} 16.67 0.00 11.59{txt} + {txt}3 {res} 56.25 14.29 43.48{txt} + {txt}4 {res} 18.75 42.86 26.09{txt} + {txt}5 {res} 4.17 42.86 15.94{txt} + {txt}{hline 51}{break} Total {res} 100.00 100.00 100.00{txt} + {res} {txt} + {txt}{hline 51} +{* end example }{txt}{...} + +{marker svy_tabulate} +{dlgtab:svy: tabulate} + +{p 4 4 2}One-way table: + +{p 8 15 2} +{cmd:estpost} {cmd:svy} [{it:vcetype}] [, {it:svy_options}] {cmd::} {cmdab:ta:bulate} + {it:varname} [{it:{help if}}] [{it:{help in}}] + [{cmd:,} + {cmdab:notot:al} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels} + {help svy_tabulate_oneway:{it:svy_tabulate_opts}} + ] + +{p 4 4 2}Two-way table: + +{p 8 15 2} +{cmd:estpost} {cmd:svy} [{it:vcetype}] [, {it:svy_options}] {cmd::} {cmdab:ta:bulate} + {it:varname1} {it:varname2} [{it:{help if}}] [{it:{help in}}] + [{cmd:,} + {cmdab:notot:al} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels} + {help svy_tabulate_oneway:{it:svy_tabulate_opts}} + ] + +{p 4 4 2} + {cmd:estpost svy: tabulate} posts a one-way or two-way table + for complex survey data computed by {helpb svy_tabulate:svy: tabulate}. Stata 9 or newer + is required. + +{p 4 4 2} + Options are as described in {helpb svy_tabulate_oneway:[SVY] svy: tabulate oneway} or + {helpb svy_tabulate_twoway:[SVY] svy: tabulate twoway}, respectively, and: + +{p 8 12 2} + {cmdab:nototal} to omit row and column totals (synonym for {cmd:nomarginals}). + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 8 12 2} + {cmd:elabels} to enforce saving labels in {cmd:e(labels)} and + {cmd:e(eqlabels)}. + +{p 4 4 2}{cmd:estpost svy: tabulate} posts results in {cmd:e()} (except {cmd:e(V)}) +as documented in {helpb svy_tabulate_oneway:[SVY] svy: tabulate oneway} and +{helpb svy_tabulate_twoway:[SVY] svy: tabulate twoway}, respectively, +and adds or replaces the following matrices: + + {lalign 10:{cmd:e(b)}}cell, column, or row proportions or percentages, + or weighted counts, depending on options + {lalign 10:{cmd:e(se)}}standard errors of {cmd:e(b)} + {lalign 10:{cmd:e(lb)}}lower confidence bounds for {cmd:e(b)} + {lalign 10:{cmd:e(ub)}}upper confidence bounds for {cmd:e(b)} + {lalign 10:{cmd:e(deff)}}deff for variances of {cmd:e(b)} + {lalign 10:{cmd:e(deft)}}deft for variances of {cmd:e(b)} + {lalign 10:{cmd:e(cell)}}cell proportion or percentages + {lalign 10:{cmd:e(row)}}row proportion or percentages (two-way only) + {lalign 10:{cmd:e(col)}}column proportion or percentages (two-way only) + {lalign 10:{cmd:e(count)}}weighted counts + {lalign 10:{cmd:e(obs)}}number of observations + +{p 4 4 2}The value labels of the row variable are stored as names in the +saved vectors, unless +no label exceeds 30 characters or contains unsuitable characters in which case +the labels are stored in macro {cmd:e(labels)}. Type +{cmd:varlabels(`e(labels)')} in {helpb esttab} or {helpb estout} to +use the labels stored {cmd:e(labels)}. The value labels of the column variable +are stored as equation names or, alternatively, +in macro {cmd:e(eqlabels)}. Type {cmd:eqlabels(`e(eqlabels)')} in +{helpb esttab} or {helpb estout} to use the labels stored in +{cmd:e(eqlabels)}. Specify the {cmd:elabels} option to enforce saving labels +in {cmd:e(labels)} and {cmd:e(eqlabels)}. + +{p 4 4 2}Examples: + +{* begin example svy_tabulate }{...} + {com}. webuse nhanes2b, clear + {txt} + {com}. svyset psuid [pweight=finalwgt], strata(stratid) + + {txt}pweight:{col 16}{res}finalwgt + {txt}VCE:{col 16}{res}linearized + {txt}Single unit:{col 16}{res}missing + {txt}Strata 1:{col 16}{res}stratid + {txt}SU 1:{col 16}{res}psuid + {txt}FPC 1:{col 16} + {p2colreset}{...} + + {com}. estpost svy: tabulate race + {txt}(running tabulate on estimation sample) + + {col 1}Number of strata{col 20}= {res} 31{txt}{col 48}Number of obs{col 67}= {res} 10351 + {txt}{col 1}Number of PSUs{col 20}= {res} 62{txt}{col 48}Population size{col 67}={res} 117157513 + {txt}{col 48}Design df{col 67}= {res} 31 + + {txt}{hline 10}{c TT}{hline 12} + 1=white, {c |} + 2=black, {c |} + 3=other {c |} proportions + {hline 10}{c +}{hline 12} + White {c |} {res}.8792 + {txt}Black {c |} {res}.0955 + {txt}Other {c |} {res}.0253 + {txt}{c |} + Total {c |} {res}1 + {txt}{hline 10}{c BT}{hline 12} + Key: {col 1}proportions = {res}cell proportions + + {txt}saved vectors: + e(b) = {res}cell proportions + {txt}e(se) = {res}standard errors of cell proportions + {txt}e(lb) = {res}lower 95% confidence bounds for cell proportions + {txt}e(ub) = {res}upper 95% confidence bounds for cell proportions + {txt}e(deff) = {res}deff for variances of cell proportions + {txt}e(deft) = {res}deft for variances of cell proportions + {txt}e(cell) = {res}cell proportions + {txt}e(count) = {res}weighted counts + {txt}e(obs) = {res}number of observations + {txt} + {com}. esttab ., cell("b(f(4)) se deft") + {res} + {txt}{hline 51} + {txt} (1) + {txt} + {txt} b se deft + {txt}{hline 51} + {txt}White {res} 0.8792 0.0167 5.2090{txt} + {txt}Black {res} 0.0955 0.0127 4.4130{txt} + {txt}Other {res} 0.0253 0.0105 6.8246{txt} + {txt}Total {res} 1.0000 0.0000 {txt} + {txt}{hline 51} + {txt}N {res} 10351 {txt} + {txt}{hline 51} + + {com}. estpost svy: tabulate race diabetes, row percent + {txt}(running tabulate on estimation sample) + + {col 1}Number of strata{col 20}= {res} 31{txt}{col 48}Number of obs{col 67}= {res} 10349 + {txt}{col 1}Number of PSUs{col 20}= {res} 62{txt}{col 48}Population size{col 67}={res} 117131111 + {txt}{col 48}Design df{col 67}= {res} 31 + + {txt}{hline 10}{c TT}{hline 20} + 1=white, {c |} diabetes, 1=yes, + 2=black, {c |} 0=no + 3=other {c |} 0 1 Total + {hline 10}{c +}{hline 20} + White {c |} {res}96.8 3.195 100 + {txt}Black {c |} {res}94.1 5.903 100 + {txt}Other {c |} {res}97.97 2.034 100 + {txt}{c |} + Total {c |} {res}96.58 3.425 100 + {txt}{hline 10}{c BT}{hline 20} + Key: {col 1}{res}row percentages + + {txt} Pearson: + {col 5}Uncorrected{col 19}chi2({res}2{txt}){col 35}= {res} 21.3483 + {txt}{col 5}Design-based{col 19}F({res}1.52{txt}, {res}47.26{txt}){col 35}= {res} 15.0056{col 51}{txt}P = {res}0.0000 + + {txt}saved vectors: + e(b) = {res}row percentages + {txt}e(se) = {res}standard errors of row percentages + {txt}e(lb) = {res}lower 95% confidence bounds for row percentages + {txt}e(ub) = {res}upper 95% confidence bounds for row percentages + {txt}e(deff) = {res}deff for variances of row percentages + {txt}e(deft) = {res}deft for variances of row percentages + {txt}e(cell) = {res}cell percentages + {txt}e(row) = {res}row percentages + {txt}e(col) = {res}column percentages + {txt}e(count) = {res}weighted counts + {txt}e(obs) = {res}number of observations + {txt} + {com}. esttab ., b(2) se(2) scalars(F_Pear) nostar unstack /// + > mtitle(`e(colvar)') + {res} + {txt}{hline 51} + {txt} (1) + {txt} diabetes + {txt} 0 1 Total + {txt}{hline 51} + {txt}White {res} 96.80 3.20 100.00{txt} + {res} {ralign 12:{txt:(}0.20{txt:)}} {ralign 12:{txt:(}0.20{txt:)}} {txt} + + {txt}Black {res} 94.10 5.90 100.00{txt} + {res} {ralign 12:{txt:(}0.61{txt:)}} {ralign 12:{txt:(}0.61{txt:)}} {txt} + + {txt}Other {res} 97.97 2.03 100.00{txt} + {res} {ralign 12:{txt:(}0.76{txt:)}} {ralign 12:{txt:(}0.76{txt:)}} {txt} + + {txt}Total {res} 96.58 3.42 100.00{txt} + {res} {ralign 12:{txt:(}0.18{txt:)}} {ralign 12:{txt:(}0.18{txt:)}} {txt} + {txt}{hline 51} + {txt}N {res} 10349 {txt} + {txt}F_Pear {res} 15.01 {txt} + {txt}{hline 51} + {txt}Standard errors in parentheses +{* end example }{txt}{...} + +{marker correlate} +{dlgtab:correlate} + +{p 4 15 2} +{cmd:estpost} {cmdab:cor:relate} + {it:{help varlist}} [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:m:atrix} + {cmdab:noh:alf} + {cmdab:print:(}{it:#}{cmd:)} + {cmdab:b:onferroni} + {cmdab:sid:ak} + {cmdab:list:wise} + {cmdab:case:wise} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels}[{cmd:(}{it:pfx} {it:sfx}{cmd:)}] + {cmdab:nol:abel} + ] + +{p 4 4 2} + posts the pairwise correlations between the first variable in + {it:varlist} and the remaining variables. Alternatively, if the + {cmd:matrix} option is specified, all pairwise correlations among the + variable in {it:varlist} are posted. + +{p 4 4 2} + {cmd:aweight}s, {cmd:fweight}s, + {cmd:iweight}s and {cmd:pweight}s are allowed; see {help weight}. + +{p 4 4 2} + Methods and formulas are as described in + {helpb correlate:{bind:[R] correlate}}. However, if {cmd:pweight}s + are specified, the p-values of the correlations are computed + as suggested in the Stata FAQ on + {browse "http://www.stata.com/support/faqs/stat/survey.html":"Estimating correlations with survey data"}. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:matrix} to return the (lower triangle) of the correlation + matrix of the variables in {it:varlist}. The default is to return + the pairwise correlations between the first variable in + {it:varlist} and the remaining variables. + +{p 8 12 2} + {cmd:nohalf} to return the full correlation matrix rather than just + the lower triangle. {cmd:nohalf} has no effect unless {cmd:matrix} + is specified. + +{p 8 12 2} + {cmd:print(}{it:#}{cmd:)} to suppress (leave blank) + correlation coefficients with a p-value larger than + {it:#}. {cmd:print()} only affects what is saved in + {cmd:e(rho)}, {cmd:e(p)}, and {cmd:e(count)}, but + not what is saved in {cmd:e(b)}. + +{p 8 12 2} + {cmd:bonferroni} to apply the Bonferroni adjustment to the + p-values. + +{p 8 12 2} + {cmd:sidak} to apply the Sidak adjustment to the + p-values. + +{p 8 12 2} + {cmd:listwise} to handle missing values through listwise deletion, + meaning that an observation is omitted from the estimation sample + if any of the variables in {it:varlist} is missing for that + observation. The default is to handle missing values by pairwise + deletion, i.e. all available observations are used to calculate a + pairwise correlation without regard to whether variables outside + that pair are missing. {cmd:casewise} is a synonym for + {cmd:listwise}. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 8 12 2} + {cmd:elabels}[{cmd:(}{it:pfx} {it:sfx}{cmd:)}] stores numbered labels in + {cmd:e(labels)} and {cmd:e(eqlabels)} if option {cmd:matrix} has been + specified. This is useful if you want to tabulate a correlation + matrix. See below for an example. Specify {it:pfx} and + {it:sfx} to provide a prefix and suffix for the numbers; for + example, {cmd:eqlabels([ ])} will format the numbers as + {cmd:[1]}, {cmd:[2]}, etc.; {cmd:eqlabels("" .)} will format the numbers as + {cmd:1.}, {cmd:2.}, etc. + +{p 8 12 2} + {cmd:nolabel} causes option {cmd:elabels()} to use variable names rather + than variable labels. + +{p 4 4 2}The following vectors are saved in {cmd:e()}: + + {lalign 13:{cmd:e(b)}}correlation coefficients + {lalign 13:{cmd:e(rho)}}correlation coefficients + {lalign 13:{cmd:e(p)}}p-values + {lalign 13:{cmd:e(count)}}number of observations + +{p 4 4 2}Examples: + +{* begin example correlate }{...} + {com}. sysuse auto, clear + {txt}(1978 automobile data) + + {com}. estpost correlate price mpg turn foreign, matrix elabels(( )) + + {txt}{ralign 12:} {c |} {ralign 9:e(b)} {ralign 9:e(rho)} {ralign 9:e(p)} {ralign 9:e(count)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11} + {res:{lalign 13:price}}{c |}{space 11}{space 11}{space 11}{space 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf:{space 9}}}} {ralign 9:{res:{sf: 74}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf:-.4685967}}} {ralign 9:{res:{sf:-.4685967}}} {ralign 9:{res:{sf: .0000255}}} {ralign 9:{res:{sf: 74}}} + {ralign 12:turn} {c |} {ralign 9:{res:{sf: .3096174}}} {ralign 9:{res:{sf: .3096174}}} {ralign 9:{res:{sf: .0072662}}} {ralign 9:{res:{sf: 74}}} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf: .0487195}}} {ralign 9:{res:{sf: .0487195}}} {ralign 9:{res:{sf: .6801851}}} {ralign 9:{res:{sf: 74}}} + {res:{lalign 13:mpg}}{c |}{space 11}{space 11}{space 11}{space 11} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf:{space 9}}}} {ralign 9:{res:{sf: 74}}} + {ralign 12:turn} {c |} {ralign 9:{res:{sf:-.7191863}}} {ralign 9:{res:{sf:-.7191863}}} {ralign 9:{res:{sf: 5.30e-13}}} {ralign 9:{res:{sf: 74}}} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf: .3933974}}} {ralign 9:{res:{sf: .3933974}}} {ralign 9:{res:{sf: .0005254}}} {ralign 9:{res:{sf: 74}}} + {res:{lalign 13:turn}}{c |}{space 11}{space 11}{space 11}{space 11} + {ralign 12:turn} {c |} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf:{space 9}}}} {ralign 9:{res:{sf: 74}}} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf:-.6310965}}} {ralign 9:{res:{sf:-.6310965}}} {ralign 9:{res:{sf: 1.66e-09}}} {ralign 9:{res:{sf: 74}}} + {res:{lalign 13:foreign}}{c |}{space 11}{space 11}{space 11}{space 11} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf: 1}}} {ralign 9:{res:{sf:{space 9}}}} {ralign 9:{res:{sf: 74}}} + + {com}. esttab ., not unstack compress noobs + {res} + {txt}{hline 62} + {txt} (1) + {txt} + {txt} price mpg turn foreign + {txt}{hline 62} + {txt}price {res} 1 {txt} + {txt}mpg {res} -0.469*** 1 {txt} + {txt}turn {res} 0.310** -0.719*** 1 {txt} + {txt}foreign {res} 0.0487 0.393*** -0.631*** 1 {txt} + {txt}{hline 62} + {txt}* p<0.05, ** p<0.01, *** p<0.001 + + {com}. esttab ., not unstack compress noobs nonum nomtitle /// + > varwidth(21) varlabels(`e(labels)') eqlabels(`e(eqlabels)') + {res} + {txt}{hline 73} + {txt} (1) (2) (3) (4) + {txt}{hline 73} + {txt}(1) Price {res} 1 {txt} + {txt}(2) Mileage (mpg) {res} -0.469*** 1 {txt} + {txt}(3) Turn circle (ft.){res} 0.310** -0.719*** 1 {txt} + {txt}(4) Car origin {res} 0.0487 0.393*** -0.631*** 1 {txt} + {txt}{hline 73} + {txt}* p<0.05, ** p<0.01, *** p<0.001 + + {com}. bysort foreign: eststo: /// + > estpost correlate price turn weight rep78, listwise + + {txt}{hline 60} + -> Domestic + + {ralign 12:price} {c |} {ralign 9:e(b)} {ralign 9:e(rho)} {ralign 9:e(p)} {ralign 9:e(count)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:turn} {c |} {ralign 9:{res:{sf: .4328091}}} {ralign 9:{res:{sf: .4328091}}} {ralign 9:{res:{sf: .0021229}}} {ralign 9:{res:{sf: 48}}} + {ralign 12:weight} {c |} {ralign 9:{res:{sf: .6864719}}} {ralign 9:{res:{sf: .6864719}}} {ralign 9:{res:{sf: 7.19e-08}}} {ralign 9:{res:{sf: 48}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf:-.0193249}}} {ralign 9:{res:{sf:-.0193249}}} {ralign 9:{res:{sf: .8962741}}} {ralign 9:{res:{sf: 48}}} + ({res}est1{txt} stored) + + {hline 60} + -> Foreign + + {ralign 12:price} {c |} {ralign 9:e(b)} {ralign 9:e(rho)} {ralign 9:e(p)} {ralign 9:e(count)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:turn} {c |} {ralign 9:{res:{sf: .5102425}}} {ralign 9:{res:{sf: .5102425}}} {ralign 9:{res:{sf: .0181155}}} {ralign 9:{res:{sf: 21}}} + {ralign 12:weight} {c |} {ralign 9:{res:{sf: .8315886}}} {ralign 9:{res:{sf: .8315886}}} {ralign 9:{res:{sf: 2.99e-06}}} {ralign 9:{res:{sf: 21}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: .1797879}}} {ralign 9:{res:{sf: .1797879}}} {ralign 9:{res:{sf: .4354917}}} {ralign 9:{res:{sf: 21}}} + ({res}est2{txt} stored) + + {com}. esttab est1 est2, not mtitles + {res} + {txt}{hline 44} + {txt} (1) (2) + {txt} Domestic Foreign + {txt}{hline 44} + {txt}turn {res} 0.433** 0.510* {txt} + {txt}weight {res} 0.686*** 0.832***{txt} + {txt}rep78 {res} -0.0193 0.180 {txt} + {txt}{hline 44} + {txt}N {res} 48 21 {txt} + {txt}{hline 44} + {txt}* p<0.05, ** p<0.01, *** p<0.001 +{* end example }{txt}{...} + +{marker ci} +{dlgtab:ci} + +{p 4 15 2} +{cmd:estpost} {cmdab:ci} + [{it:{help varlist}}] [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:b:inomial} + {cmdab:p:oisson} {cmdab:e:xposure:(}{it:varname}{cmd:)} + {cmdab:ex:act} {cmdab:wa:ld} {cmdab:w:ilson} {cmdab:a:gresti} {cmdab:j:effreys} + {cmdab:l:evel:(}{it:#}{cmd:)} + {cmdab:list:wise} + {cmdab:case:wise} + {cmdab:q:uietly} + {cmdab:es:ample} + ] + +{p 4 4 2} + posts standard errors and confidence intervals computed by + {helpb ci}. {cmd:aweight}s and {cmd:fweight}s are allowed, + but {cmd:aweight}s may not be specified with options + {cmd:binomial} or {cmd:poisson}; + see {help weight}. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:binomial}, {cmd:poisson}, {cmd:exposure()}, + {cmd:exact}, {cmd:wald}, {cmd:wilson}, {cmd:agresti}, + {cmd:jeffreys}, and {cmd:level()} + as described in help {helpb ci}. + +{p 8 12 2} + {cmd:listwise} to handle missing values through listwise deletion, + meaning that an observation is omitted from the estimation + sample if any of the variables in {it:varlist} is missing for that + observation. The default is to determine the used observations for + each variable separately without regard to whether other variables + are missing. {cmd:casewise} is a synonym for {cmd:listwise}. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 4 4 2}The following results vectors are saved in {cmd:e()}: + + {lalign 13:{cmd:e(b)}}mean + {lalign 13:{cmd:e(count)}}number of observations + {lalign 13:{cmd:e(se)}}estimate of standard error + {lalign 13:{cmd:e(lb)}}lower bound of confidence interval + {lalign 13:{cmd:e(ub)}}upper bound of confidence interval + +{p 4 4 2} + Examples: + +{* begin example ci }{...} + {com}. sysuse auto, clear + {txt}(1978 Automobile Data) + + {com}. estpost ci price mpg rep78, listwise + {txt}(confidence level is 95%) + + {ralign 12:} {c |} {ralign 9:e(b)} {ralign 9:e(count)} {ralign 9:e(se)} {ralign 9:e(lb)} {ralign 9:e(ub)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:price} {c |} {ralign 9:{res:{sf: 6146.043}}} {ralign 9:{res:{sf: 69}}} {ralign 9:{res:{sf: 350.6166}}} {ralign 9:{res:{sf: 5446.399}}} {ralign 9:{res:{sf: 6845.688}}} + {ralign 12:mpg} {c |} {ralign 9:{res:{sf: 21.28986}}} {ralign 9:{res:{sf: 69}}} {ralign 9:{res:{sf: .7062326}}} {ralign 9:{res:{sf: 19.88059}}} {ralign 9:{res:{sf: 22.69912}}} + {ralign 12:rep78} {c |} {ralign 9:{res:{sf: 3.405797}}} {ralign 9:{res:{sf: 69}}} {ralign 9:{res:{sf: .1191738}}} {ralign 9:{res:{sf: 3.167989}}} {ralign 9:{res:{sf: 3.643605}}} + + {com}. esttab ., cells("b lb ub") label + {res} + {txt}{hline 59} + {txt} (1) + {txt} + {txt} b lb ub + {txt}{hline 59} + {txt}Price {res} 6146.043 5446.399 6845.688{txt} + {txt}Mileage (mpg) {res} 21.28986 19.88059 22.69912{txt} + {txt}Repair Record 1978 {res} 3.405797 3.167989 3.643605{txt} + {txt}{hline 59} + {txt}Observations {res} 69 {txt} + {txt}{hline 59} + + {com}. eststo exact: estpost ci foreign, binomial exact + {txt}(confidence level is 95%) + + {ralign 12:} {c |} {ralign 9:e(b)} {ralign 9:e(count)} {ralign 9:e(se)} {ralign 9:e(lb)} {ralign 9:e(ub)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf: .2972973}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: .0531331}}} {ralign 9:{res:{sf: .196584}}} {ralign 9:{res:{sf: .4148353}}} + + {com}. eststo agresti: estpost ci foreign, binomial agresti + {txt}(confidence level is 95%) + + {ralign 12:} {c |} {ralign 9:e(b)} {ralign 9:e(count)} {ralign 9:e(se)} {ralign 9:e(lb)} {ralign 9:e(ub)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:foreign} {c |} {ralign 9:{res:{sf: .2972973}}} {ralign 9:{res:{sf: 74}}} {ralign 9:{res:{sf: .0531331}}} {ralign 9:{res:{sf: .204807}}} {ralign 9:{res:{sf: .4097942}}} + + {com}. esttab exact agresti, cells(lb ub) mtitles + {res} + {txt}{hline 38} + {txt} (1) (2) + {txt} exact agresti + {txt} lb/ub lb/ub + {txt}{hline 38} + {txt}foreign {res} .196584 .204807{txt} + {res} .4148353 .4097942{txt} + {txt}{hline 38} + {txt}N {res} 74 74{txt} + {txt}{hline 38} +{* end example }{txt}{...} + +{marker stci} +{dlgtab:stci} + +{p 4 15 2} +{cmd:estpost} {cmd:stci} + [{it:{help if}}] [{it:{help in}}] + [{cmd:,} + {cmd:by(}{it:groupvar}{cmd:)} + {cmdab:m:edian} + {cmdab:r:mean} + {cmdab:e:mean} + {cmd:p(}{it:#}{cmd:)} + {cmdab:cc:orr} + {cmdab:l:evel:(}{it:#}{cmd:)} + {cmdab:q:uietly} + {cmdab:es:ample} + {cmdab:el:abels} + ] + +{p 4 4 2} + posts confidence intervals for means + and percentiles of survival time computed by {helpb stci}. Stata 9 or + newer is required. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:by(}{it:groupvar}{cmd:)} + to report separate summaries for each group defined by + {it:groupvar}, along with an overall total. + +{p 8 12 2} + {cmd:median}, + {cmd:rmean}, + {cmd:emean}, + {cmd:p()}, + {cmd:ccorr}, and + {cmd:level()} + as described in help {helpb stci}. + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {cmd:esample} to mark the estimation sample in {cmd:e(sample)}. + +{p 8 12 2} + {cmd:elabels} to enforce saving {cmd:by()} labels in {cmd:e(labels)}. + +{p 4 4 2}The following vectors are saved in {cmd:e()}: + + {lalign 13:{cmd:e(count)}}number of subjects + {lalign 13:{cmd:e(p50)}}median (if {cmd:median} specified; the default) + {lalign 13:{cmd:e(p}{it:#}{cmd:)}}#th percentile (if {cmd:p(}{it:#}{cmd:)} specified) + {lalign 13:{cmd:e(rmean)}}restricted mean (if {cmd:rmean} specified) + {lalign 13:{cmd:e(emean)}}extended mean (if {cmd:emean} specified) + {lalign 13:{cmd:e(se)}}standard error + {lalign 13:{cmd:e(lb)}}lower bound of CI + {lalign 13:{cmd:e(ub)}}upper bound of CI + +{p 4 4 2} + Examples: + +{* begin example stci }{...} + {com}. webuse page2, clear + {txt} + {com}. estpost stci + {txt}(confidence level is 95%) + + {ralign 12:} {c |} {ralign 9:e(count)} {ralign 9:e(p50)} {ralign 9:e(se)} {ralign 9:e(lb)} {ralign 9:e(ub)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:total} {c |} {ralign 9:{res:{sf: 40}}} {ralign 9:{res:{sf: 232}}} {ralign 9:{res:{sf: 2.562933}}} {ralign 9:{res:{sf: 213}}} {ralign 9:{res:{sf: 239}}} + + {com}. esttab ., cell("count p50 se lb ub") noobs compress + {res} + {txt}{hline 60} + {txt} (1) + {txt} + {txt} count p50 se lb ub + {txt}{hline 60} + {txt}total {res} 40 232 2.562933 213 239{txt} + {txt}{hline 60} + + {com}. estpost stci, by(group) + {txt}(confidence level is 95%) + + {ralign 12:} {c |} {ralign 9:e(count)} {ralign 9:e(p50)} {ralign 9:e(se)} {ralign 9:e(lb)} {ralign 9:e(ub)} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:1} {c |} {ralign 9:{res:{sf: 19}}} {ralign 9:{res:{sf: 216}}} {ralign 9:{res:{sf: 5.171042}}} {ralign 9:{res:{sf: 190}}} {ralign 9:{res:{sf: 234}}} + {ralign 12:2} {c |} {ralign 9:{res:{sf: 21}}} {ralign 9:{res:{sf: 233}}} {ralign 9:{res:{sf: 2.179595}}} {ralign 9:{res:{sf: 232}}} {ralign 9:{res:{sf: 280}}} + {hline 13}{c +}{hline 11}{hline 11}{hline 11}{hline 11}{hline 11} + {ralign 12:total} {c |} {ralign 9:{res:{sf: 40}}} {ralign 9:{res:{sf: 232}}} {ralign 9:{res:{sf: 2.562933}}} {ralign 9:{res:{sf: 213}}} {ralign 9:{res:{sf: 239}}} + + {com}. esttab ., cell("count p50 se lb ub") noobs compress + {res} + {txt}{hline 60} + {txt} (1) + {txt} + {txt} count p50 se lb ub + {txt}{hline 60} + {txt}1 {res} 19 216 5.171042 190 234{txt} + {txt}2 {res} 21 233 2.179595 232 280{txt} + {txt}total {res} 40 232 2.562933 213 239{txt} + {txt}{hline 60} +{* end example }{txt}{...} + +{marker margins} +{dlgtab:margins} + +{p 4 15 2} +{cmd:estpost} {cmd:margins} + [{it:{help fvvarlist:marginlist}}] [{it:{help if}}] [{it:{help in}}] [{it:{help weight}}] + [{cmd:,} + {cmdab:q:uietly} + {it:{help margins:margins_opions}} + ] + +{p 4 4 2} + posts results from the {helpb margins} command, that was introduced in + Stata 11. + +{p 4 4 2} + Options are: + +{p 8 12 2} + {cmd:quietly} to suppress the output. + +{p 8 12 2} + {it:margins_opions} as described in help {helpb margins} (except {cmd:post}). + +{p 4 4 2}{cmd:estpost margins} replaces the current {cmd:e(b)} and +{cmd:e(V)} with {cmd:r(b)} and {cmd:r(V)} from {helpb margins} and +also copies all other matrixes, scalars, and macros from {helpb margins} into +{cmd:e()} (possibly replacing identically named existing entries). + +{p 4 4 2} + Examples: + +{* begin example margins }{...} + {com}. sysuse auto, clear + {txt}(1978 Automobile Data) + + {com}. quietly logit foreign price mpg weight + {txt} + {com}. estpost margins, dydx(*) quietly + {txt} + {com}. esttab ., cell("b se") pr2 + {res} + {txt}{hline 38} + {txt} (1) + {txt} foreign + {txt} b se + {txt}{hline 38} + {txt}price {res} .0000686 .0000136{txt} + {txt}mpg {res} -.0089607 .006596{txt} + {txt}weight {res} -.0005069 .000055{txt} + {txt}{hline 38} + {txt}N {res} 74 {txt} + {txt}pseudo R-sq {res} 0.619 {txt} + {txt}{hline 38} +{* end example }{txt}{...} + + +{title:Author} + +{p 4 4 2} Ben Jann, Institute of Sociology, University of Bern, jann@soz.unibe.ch + +{p 4 4 2} {cmd:estpost gtabstat} has been contributed by Mauricio Caceres Bravo. + + +{title:Also see} + + Manual: {hi:[R] estimates} + +{p 4 13 2}Online: help for + {helpb estimates}, + {helpb estout}, + {helpb esttab}, + {helpb eststo}, + {helpb estadd} +{p_end} diff --git a/data/ado/e/eststo.ado b/data/ado/e/eststo.ado new file mode 100644 index 0000000..a0dea68 --- /dev/null +++ b/data/ado/e/eststo.ado @@ -0,0 +1,343 @@ +*! version 1.1.0 05nov2008 Ben Jann + +program define eststo, byable(onecall) + version 8.2 + local caller : di _caller() +// --- eststo clear --- + if `"`1'"'=="clear" { + if `"`0'"'!="clear" { + di as err "invalid syntax" + exit 198 + } + if "`_byvars'"!="" error 190 + _eststo_clear + exit + } +// --- update globals --- + _eststo_cleanglobal +// --- eststo dir --- + if `"`1'"'=="dir" { + if `"`0'"'!="dir" { + di as err "invalid syntax" + exit 198 + } + if "`_byvars'"!="" error 190 + _eststo_dir + exit + } +// --- eststo drop --- + if `"`1'"'=="drop" { + if "`_byvars'"!="" error 190 + _eststo_`0' + exit + } +// --- eststo store (no by) --- + if "`_byvars'"=="" { + version `caller': _eststo_store `0' + exit + } +// --- eststo store (by) --- +// - check sorting + local sortedby : sortedby + local i 0 + foreach byvar of local _byvars { + local sortedbyi : word `++i' of `sortedby' + if "`byvar'"!="`sortedbyi'" error 5 + } +// - parse command on if qualified + capt _on_colon_parse `0' + if _rc error 190 + if `"`s(after)'"'=="" error 190 + local estcom `"`s(after)'"' + local 0 `"`s(before)'"' + if substr(trim(`"`estcom'"'),1,3)=="svy" { + di as err "svy commands not allowed with by ...: eststo:" + exit 190 + } + AddBygrpToIfqualifier `estcom' +// - parse syntax of _eststo_store call in order to determine +// whether title() or missing was specified (note that +// -estimates change- cannot be used to set the titles since +// it does not work with -noesample-) + TitleAndMissing `0' +// - generate byindex + tempname _byindex + qui egen long `_byindex' = group(`_byvars'), label `missing' + qui su `_byindex', meanonly + if r(N)==0 error 2000 + local Nby = r(max) +// - loop over bygroups + forv i = 1/`Nby' { + local ibylab: label (`_byindex') `i' + di as txt _n "{hline}" + di as txt `"-> `ibylab'"' // could be improved + if `titleopt'==0 local ibytitle + else if `titleopt'==1 local ibytitle `" title(`ibylab')"' + else if `titleopt'==2 local ibytitle `", title(`ibylab')"' + capture noisily { + version `caller': _eststo_store `0'`ibytitle' : `estcmd' + } + if _rc { + if "`_byrc0'"=="" error _rc + } + } +end + +prog TitleAndMissing + capt syntax [anything] , Title(string) [ MISsing * ] + if _rc==0 { + c_local titleopt 0 + c_local missing "`missing'" + } + else { + syntax [anything] [ , MISsing * ] + if `"`missing'`options'"'!="" c_local titleopt 1 + else c_local titleopt 2 + c_local missing "`missing'" + } +end + +program AddBygrpToIfqualifier + syntax anything(equalok) [if/] [in] [using] [fw aw pw iw] [, * ] + local estcom `"`macval(anything)' if (\`_byindex'==\`i')"' + if `"`macval(if)'"'!="" { + local estcom `"`macval(estcom)' & (`macval(if)')"' + } + if `"`macval(in)'"'!="" { + local estcom `"`macval(estcom)' `macval(in)'"' + } + if `"`macval(using)'"'!="" { + local estcom `"`macval(estcom)' `macval(using)'"' + } + if `"`macval(weight)'"'!="" { + local estcom `"`macval(estcom)' [`macval(weight)'`macval(exp)']"' + } + if `"`macval(options)'"'!="" { + local estcom `"`macval(estcom)', `macval(options)'"' + } + c_local estcmd `"`macval(estcom)'"' +end + +program define _eststo_clear + local names $eststo + foreach name of local names { + capt estimates drop `name' + } + global eststo + global eststo_counter +end + +program define _eststo_dir + if `"$eststo"'!="" { + estimates dir $eststo + } +end + +program define _eststo_cleanglobal + local enames $eststo + if `"`enames'"'!="" { + tempname hcurrent + _return hold `hcurrent' + qui _estimates dir + local snames `r(names)' + _return restore `hcurrent' + } + local names: list enames & snames + global eststo `names' + if "`names'"=="" global eststo_counter +end + +program define _eststo_drop + local droplist `0' + if `"`droplist'"'=="" { + di as error "someting required" + exit 198 + } + local names $eststo + foreach item of local droplist { + capt confirm integer number `item' + if _rc { + local dropname `item' + } + else { + if `item'<1 { + di as error "`item' not allowed" + exit 198 + } + local dropname est`item' + } + local found 0 + foreach name in `names' { + if match("`name'",`"`dropname'"') { + local found 1 + estimates drop `name' + local names: list names - name + di as txt "(" as res "`name'" as txt " dropped)" + } + } + if `found'==0 { + di as txt "(no matches found for " as res `"`dropname'"' as txt ")" + } + } + global eststo `names' +end + + +program define _eststo_store, eclass + local caller : di _caller() + capt _on_colon_parse `0' + if !_rc { + local command `"`s(after)'"' + local 0 `"`s(before)'"' + } + syntax [name] [, /// + Title(passthru) /// + Prefix(name) /// + Refresh Refresh2(numlist integer max=1 >0) /// + ADDscalars(string asis) /// + noEsample /// + noCopy /// + MISsing svy /// doesn't do anything + ] + if `"`prefix'"'=="" local prefix "est" + +// get previous eststo names and counter + local names $eststo + local counter $eststo_counter + if `"`counter'"'=="" local counter 0 + +// if name provided; set refresh on if name already in list + if "`namelist'"!="" { + if "`refresh2'"!="" { + di as error "refresh() not allowed" + exit 198 + } + local name `namelist' + if `:list name in names' local refresh refresh + else { + if "`refresh'"!="" { + di as txt "(" as res "`name'" as txt " not found)" + } + local refresh + } + if "`refresh'"=="" local ++counter + } +// if no name provided + else { + if "`refresh2'"!="" local refresh refresh + if "`refresh'"!="" { +// refresh2 not provided => refresh last (if available) + if "`refresh2'"=="" { + if "`names'"=="" { + di as txt "(nothing to refresh)" + local refresh + } + else local name: word `:list sizeof names' of `names' + } +// refresh2 provided => check availability + else { + if `:list posof "`prefix'`refresh2'" in names' { + local name `prefix'`refresh2' + } + else { + di as txt "(" as res "`prefix'`refresh2'" as txt " not found)" + local refresh + } + } + } + if "`refresh'"=="" local ++counter +// set default name + if "`name'"=="" local name `prefix'`counter' + } + +// run estimation command if provided + if `"`command'"'!="" { + version `caller': `command' + } + +// add scalars to e() + if `"`addscalars'"'!="" { + capt ParseAddscalars `addscalars' + if _rc { + di as err `"addscalars() invalid"' + exit 198 + } + if "`replace'"=="" { + local elist `: e(scalars)' `: e(macros)' `: e(matrices)' `: e(functions)' + } + local forbidden b V sample + while (1) { + gettoken lhs rest: rest + if `:list lhs in forbidden' { + di as err `"`lhs' not allowed in addscalars()"' + exit 198 + } + if "`replace'"=="" { + if `:list lhs in elist' { + di as err `"e(`lhs') already defined"' + exit 110 + } + } + gettoken rhs rest: rest, bind + capt eret scalar `lhs' = `rhs' + if _rc { + di as err `"addscalars() invalid"' + exit 198 + } + capture local result = e(`lhs') + di as txt "(e(" as res `"`lhs'"' as txt ") = " /// + as res `result' as txt " added)" + if `"`rest'"'=="" continue, break + } + } +// add e(cmd) if missing + if `"`e(cmd)'"'=="" { + if `"`: e(scalars)'`: e(macros)'`: e(matrices)'`: e(functions)'"'!="" { + eret local cmd "." + } + } + +// store estimates with e(sample) + estimates store `name' , `copy' `title' + +// remove e(sample) if -noesample- specified + if "`esample'"!="" { + capt confirm new var _est_`name' + if _rc { + tempname hcurrent + _est hold `hcurrent', restore estsystem nullok + qui replace _est_`name' = . in 1 + _est unhold `name' + capt confirm new var _est_`name' + if _rc qui drop _est_`name' + else { + di as error "somethings wrong; please contact author of -eststo- " /// + "(see e-mail in help {help eststo})" + exit 498 + } + _est hold `name', estimates varname(_est_`name') + // varname() only needed so that _est hold does not return error + // if variable `name' exists + } + } + +// report + if "`refresh'"=="" { + global eststo `names' `name' + global eststo_counter `counter' + if `"`namelist'"'=="" { + di as txt "(" as res "`name'" as txt " stored)" + } + } + else { + if `"`namelist'"'=="" { + di as txt "(" as res "`name'" as txt " refreshed)" + } + } +end + +program ParseAddscalars + syntax anything [ , Replace ] + c_local rest `"`anything'"' + c_local replace `replace' +end diff --git a/data/ado/e/eststo.hlp b/data/ado/e/eststo.hlp new file mode 100644 index 0000000..c2c5a2c --- /dev/null +++ b/data/ado/e/eststo.hlp @@ -0,0 +1,347 @@ +{smcl} +{* 01feb2017}{...} +{hi:help eststo}{right:also see: {helpb esttab}, {helpb estout}, {helpb estadd}, {helpb estpost}} +{right: {browse "http://repec.sowi.unibe.ch/stata/estout/"}} +{hline} + +{title:Title} + +{p 4 4 2}{hi:eststo} {hline 2} Store estimates + + +{title:Syntax}{smcl} + +{p 8 15 2} +[{cmd:_}]{cmd:eststo} [{it:name}] +[{cmd:,} {it:{help eststo##options:options}} ] +[ {cmd::} {it:{help estimation_command}} ] + +{p 8 15 2} +[{cmd:_}]{cmd:eststo dir} + +{p 8 15 2} +[{cmd:_}]{cmd:eststo drop} {{it:#}|{it:name}} [ {{it:#}|{it:name}} ... ] + +{p 8 15 2} +[{cmd:_}]{cmd:eststo clear} + +{marker options} + {it:options}{col 23}description + {hline 56} + [{ul:{cmd:no}}]{cmdab:e:sample}{col 23}{...} +do not/do store {cmd:e(sample)} + {cmdab:t:itle:(}{it:string}{cmd:)}{col 23}{...} +specify a title for the stored set + {cmdab:p:refix:(}{it:prefix}{cmd:)}{col 23}{...} +specify a name prefix; default is {cmd:est} + {cmdab:add:scalars(}{it:...}{cmd:)}{col 23}{...} +add scalar statistics + {cmdab:r:efresh}[{cmd:(}{it:#}{cmd:)}]{col 23}{...} +overwrite a previously stored set + {cmdab:noc:opy}{col 23}{...} +clear {cmd:e()} after storing the set + {cmdab:mis:sing}{col 23}{...} +use missing values in the {cmd:by} groups + {hline 56} + +{p 4 4 2} +{cmd:by} is allowed with {cmd:eststo} if {cmd:eststo} +is used as a prefix command, i.e. specify + + {cmd:by} {it:...} {cmd::} {cmd:eststo} {it:...} {cmd::} {it:estimation_command} + +{p 4 4 2} +to apply {it:estimation_command} to each {cmd:by} group and store an estimation +set for each group; see help {help by}. Note that the implementation of {cmd:by} +with {cmd:eststo} requires {it:estimation_command} +to follow {help language:standard Stata syntax} and +allow the {it:{help if}} qualifier. Do not use the +{bind:{cmd:by} {it:...}{cmd:: eststo:}} construct with +{cmd:svy} commands. + + +{title:Description} + +{p 4 4 2} +{cmd:eststo} stores a copy of the active estimation results for later +tabulation. If {it:name} is provided, the estimation set is stored +under {it:name}. If {it:name} is not provided, the estimation set is +stored under {cmd:est}{it:#}, where {it:#} is a counter for the +number of stored estimation sets. + +{p 4 4 2} +{cmd:eststo} may be used in two ways: Either after fitting a model as +in + + {com}. regress y x + . eststo{txt} + +{p 4 4 2} +or as a prefix command (see help {help prefix}): + + {com}. eststo: regress y x{txt} + +{p 4 4 2} +{cmd:_eststo} is a variant on {cmd:eststo} that, by default, does not +store the estimation sample information contained in {cmd:e(sample)}. +Essentially, {cmd:_eststo} is a shortcut to {cmd:eststo, noesample}. + +{p 4 4 2} +{cmd:eststo dir} displays a list of the stored estimates. + +{p 4 4 2} +{cmd:eststo drop} drops estimation sets stored by {cmd:eststo}. If {it:name} is +provided, the estimation set stored under {it:name} +is dropped (if {cmd:*} or {cmd:?} wildcards are used {it:name}, +all matching sets are dropped). Alternatively, if {it:#} is provided, +the estimation set stored as {cmd:est}{it:#} is dropped. + +{p 4 4 2} +{cmd:eststo clear} drops all estimation sets stored by {cmd:eststo} (and clears +{cmd:eststo}'s global macros). + +{p 4 4 2} +{cmd:eststo} is an alternative to official Stata's +{helpb estimates store}. The main differences are: + +{p 8 12 2} +{space 1}o{space 2}{cmd:eststo} does not require the user to specify a +name for the stored estimation set. + +{p 8 12 2} +{space 1}o{space 2}{cmd:eststo} may be used as a prefix command (see +help {help prefix}). + +{p 8 12 2} +{space 1}o{space 2}{cmd:eststo} provides the possibility to store +estimates without the {cmd:e(sample)} function (either specify the +{cmd:noesample} option or use the {cmd:_eststo} command). Omitting +{cmd:e(sample)} saves memory and also speeds up tabulation programs +such as {helpb estimates table}, {helpb estout} or {helpb esttab}. +{hi:Warning:} Some post-estimation commands may not work with +estimation sets that do not contain the {cmd:e(sample)}. + +{p 8 12 2} +{space 1}o{space 2}{cmd:eststo} can add additional scalar statistics to +be stored with the estimation set. + + +{title:Options} +{marker esample} +{p 4 8 2} +{cmd:esample} causes the information in {cmd:e(sample)} to be stored +with the estimates. This is the default in {cmd:eststo}. Type +{cmd:noesample} or use the {cmd:_eststo} command to omit the +{cmd:e(sample)}. Note that some post-estimation commands may not be +working correctly with estimation sets that have been stored without +{cmd:e(sample)}. + +{p 4 8 2} +{cmd:title(}{it:string}{cmd:)} specifies a title for the stored +estimation set. +{p_end} +{marker addscalars} +{p 4 8 2} +{cmd:addscalars(}{it:name exp} [{it:...}] [{cmd:,} {cmdab:r:eplace}]{cmd:)} +may be used to add additional results to the {cmd:e()}-scalars of the +estimation set before storing it. Specify the names and values of the +scalars in pairs. For example, {cmd:addscalars(one 1 two 2)} would +add {cmd:e(one)} = {cmd:1} and {cmd:e(two)} = {cmd:2}. See below for +an example. The {cmd:replace} suboption permits overwriting existing +{cmd:e()}-returns. Not allowed as names are "b", "V", or "sample". +See {helpb estadd} for a more sophisticated tool to add additional +results to {cmd:e()}-returns. + +{p 4 8 2} +{cmd:prefix(}{it:prefix}{cmd:)} specifies a custom prefix for the +automatic names of the stored estimation sets. The default prefix +is {cmd:est}. + +{p 4 8 2} +{cmd:refresh}[{cmd:(}{it:#}{cmd:)}] may be used to overwrite a +previously stored estimation set instead of storing the estimates +under a new name. {cmd:refresh}, specified without argument, will +overwrite the last saved set. Alternatively, +{cmd:refresh(}{it:#}{cmd:)} will overwrite the set named +{cmd:est}{it:#} if it exists. If {it:name} is provided to {cmd:eststo}, +existing sets of the same name will always be overwritten whether or +not {cmd:refresh} is specified. {cmd:refresh()} with argument is not +allowed in this case. + +{p 4 8 2} +{cmd:nocopy} specifies that after the estimation set has been stored, +it no longer be available as the active estimation set. + +{p 4 8 2} +{cmd:missing} is for use of {cmd:eststo} with the {cmd:by} prefix command and +causes missing values to be treated like any other values in the {cmd:by} +variables. The default is to discard observations with missing values in the +{cmd:by} variables. + + +{title:Examples} + +{p 4 4 2} +Applying {cmd:eststo} after fiting a model to store the model's results, +as in the following example: + + {com}. sysuse auto + {txt}(1978 Automobile Data) + + {com}. quietly regress price weight + {txt} + {com}. eststo model1 + {txt} + {com}. quietly regress turn weight foreign + {txt} + {com}. eststo model2 + {txt} + {com}. estout + {res} + {txt}{hline 38} + {txt} model1 model2 + {txt} b b + {txt}{hline 38} + {txt}weight {res} 2.044063 .0042183{txt} + {txt}foreign {res} -1.809802{txt} + {txt}_cons {res} -6.707353 27.44963{txt} + {txt}{hline 38} + + +{p 4 4 2} +Applying {cmd:eststo} as a prefix commmand to fit and store a model in one step: + + {com}. eststo model1: quietly regress price weight + {txt} + {com}. eststo model2: quietly regress turn weight foreign + {txt} + {com}. estout + {res} + {txt}{hline 38} + {txt} model1 model2 + {txt} b b + {txt}{hline 38} + {txt}weight {res} 2.044063 .0042183{txt} + {txt}foreign {res} -1.809802{txt} + {txt}_cons {res} -6.707353 27.44963{txt} + {txt}{hline 38} + + +{p 4 4 2} +Using {cmd:eststo} with automatic names: + + {com}. eststo clear + {txt} + {com}. eststo: quietly regress price weight + {txt}({res}est1{txt} stored) + + {com}. eststo: quietly regress turn weight foreign + {txt}({res}est2{txt} stored) + + {com}. estout + {res} + {txt}{hline 38} + {txt} est1 est2 + {txt} b b + {txt}{hline 38} + {txt}weight {res} 2.044063 .0042183{txt} + {txt}foreign {res} -1.809802{txt} + {txt}_cons {res} -6.707353 27.44963{txt} + {txt}{hline 38} + + +{p 4 4 2} +Adding ancillary statistics: + + {com}. eststo clear + {txt} + {com}. quietly regress price weight mpg + {txt} + {com}. test weight = mpg + + {txt} ( 1) {res}weight - mpg = 0 + + {txt} F( 1, 71) ={res} 0.36 + {txt}{col 13}Prob > F ={res} 0.5514 + {txt} + {com}. eststo, add(p_diff r(p)) + {txt}(e({res}p_diff{txt}) = {res}.55138216{txt} added) + ({res}est1{txt} stored) + + {com}. estout, stat(p_diff) + {res} + {txt}{hline 25} + {txt} est1 + {txt} b + {txt}{hline 25} + {txt}weight {res} 1.746559{txt} + {txt}mpg {res} -49.51222{txt} + {txt}_cons {res} 1946.069{txt} + {txt}{hline 25} + {txt}p_diff {res} .5513822{txt} + {txt}{hline 25} + + +{p 4 4 2} +Using the {cmd:by} prefix to store subbroup models: + + {com}. eststo clear + {txt} + {com}. quietly by foreign: eststo: quietly reg price weight mpg + {txt} + {com}. esttab, label nodepvar nonumber + {res} + {txt}{hline 52} + {txt} Domestic Foreign + {txt}{hline 52} + {txt}Weight (lbs.) {res} 4.415*** 5.156***{txt} + {res} {ralign 12:{txt:(}4.66{txt:)}} {ralign 12:{txt:(}5.85{txt:)}} {txt} + + {txt}Mileage (mpg) {res} 237.7 -19.78 {txt} + {res} {ralign 12:{txt:(}1.71{txt:)}} {ralign 12:{txt:(}-0.34{txt:)}} {txt} + + {txt}Constant {res} -13285.4* -5065.8 {txt} + {res} {ralign 12:{txt:(}-2.32{txt:)}} {ralign 12:{txt:(}-1.58{txt:)}} {txt} + {txt}{hline 52} + {txt}Observations {res} 52 22 {txt} + {txt}{hline 52} + {txt}t statistics in parentheses + {txt}* p<0.05, ** p<0.01, *** p<0.001 + + +{title:Returned results} + +{p 4 4 2} +The name under which an estimation set is stored, is added to the set in +{cmd:e(_estimates_name)}. + +{p 4 4 2} +In addition, {cmd:eststo} maintains two global macros. {cmd:$eststo} contains a list +of the names of the stored estimation sets. {cmd:$eststo_counter} +contains the count of stored estimation sets. + + +{title:Acknowledgements} + +{p 4 4 2} +Bill Gould suggested to make {cmd:eststo} "byable". + + +{title:Author} + +{p 4 4 2} +Ben Jann, Institute of Sociology, University of Bern, jann@soz.unibe.ch + + +{title:Also see} + + Manual: {hi:[R] estimates} + +{p 4 13 2}Online: help for + {helpb estimates}, + {helpb esttab}, + {helpb estout}, + {helpb estadd}, + {helpb estpost} +{p_end} + diff --git a/data/ado/e/esttab.ado b/data/ado/e/esttab.ado new file mode 100644 index 0000000..bc57b4f --- /dev/null +++ b/data/ado/e/esttab.ado @@ -0,0 +1,1337 @@ +*! version 2.1.1 10jun2022 Ben Jann +*! wrapper for estout + +program define esttab + version 8.2 + local caller : di _caller() + +// mode specific defaults + local cdate "`c(current_date)'" + local ctime "`c(current_time)'" +// - fixed + local fixed_open0 `""% `cdate' `ctime'""' + local fixed_close0 `""""' + local fixed_open `""' + local fixed_close `""' + local fixed_caption `""@title""' + local fixed_open2 `""' + local fixed_close2 `""' + local fixed_toprule `""@hline""' + local fixed_midrule `""@hline""' + local fixed_bottomrule `""@hline""' + local fixed_topgap `""""' + local fixed_midgap `""""' + local fixed_bottomgap `""""' + local fixed_eqrule `"begin(@hline "")"' + local fixed_ssl `"N R-sq "adj. R-sq" "pseudo R-sq" AIC BIC"' + local fixed_lsl `"Observations R-squared "Adjusted R-squared" "Pseudo R-squared" AIC BIC"' + local fixed_starlevels `"* 0.05 ** 0.01 *** 0.001"' + local fixed_starlevlab `""' + local fixed_begin `""' + local fixed_delimiter `"" ""' + local fixed_end `""' + local fixed_incelldel `"" ""' + local fixed_varwidth `"\`= cond("\`label'"=="", 12, 20)'"' + local fixed_modelwidth `"12"' + local fixed_abbrev `"abbrev"' + local fixed_substitute `""' + local fixed_interaction `"" # ""' + local fixed_tstatlab `"t statistics"' + local fixed_zstatlab `"z statistics"' + local fixed_pvallab `"p-values"' + local fixed_cilab `"\`level'% confidence intervals"' +// - smcl + local smcl_open0 `"{smcl} "{* % `cdate' `ctime'}{...}""' + local smcl_close0 `""""' + local smcl_open `""' + local smcl_close `""' + local smcl_caption `""@title""' + local smcl_open2 `""' + local smcl_close2 `""' + local smcl_toprule `""{hline @width}""' + local smcl_midrule `""{hline @width}""' + local smcl_bottomrule `""{hline @width}""' + local smcl_topgap `""""' + local smcl_midgap `""""' + local smcl_bottomgap `""""' + local smcl_eqrule `"begin("{hline @width}" "")"' + local smcl_ssl `"`macval(fixed_ssl)'"' + local smcl_lsl `"`macval(fixed_lsl)'"' + local smcl_starlevels `"`macval(fixed_starlevels)'"' + local smcl_starlevlab `""' + local smcl_begin `""' + local smcl_delimiter `"" ""' + local smcl_end `""' + local smcl_incelldel `"" ""' + local smcl_varwidth `"`macval(fixed_varwidth)'"' + local smcl_modelwidth `"`macval(fixed_modelwidth)'"' + local smcl_abbrev `"`macval(fixed_abbrev)'"' + local smcl_substitute `""' + local smcl_interaction `"" # ""' + local smcl_tstatlab `"`macval(fixed_tstatlab)'"' + local smcl_zstatlab `"`macval(fixed_zstatlab)'"' + local smcl_pvallab `"`macval(fixed_pvallab)'"' + local smcl_cilab `"`macval(fixed_cilab)'"' +// - tab + local tab_open0 `"`macval(fixed_open0)'"' + local tab_close0 `""""' + local tab_open `""' + local tab_close `""' + local tab_caption `""@title""' + local tab_open2 `""' + local tab_close2 `""' + local tab_topgap `""""' + local tab_midgap `""""' + local tab_bottomgap `""""' + local tab_ssl `"`macval(fixed_ssl)'"' + local tab_lsl `"`macval(fixed_lsl)'"' + local tab_starlevels `"`macval(fixed_starlevels)'"' + local tab_starlevlab `""' + local tab_begin `""' + local tab_delimiter `"_tab"' + local tab_end `""' + local tab_incelldel `"" ""' + local tab_varwidth `""' + local tab_modelwidth `""' + local tab_abbrev `""' + local tab_substitute `""' + local tab_interaction `"" # ""' + local tab_tstatlab `"`macval(fixed_tstatlab)'"' + local tab_zstatlab `"`macval(fixed_zstatlab)'"' + local tab_pvallab `"`macval(fixed_pvallab)'"' + local tab_cilab `"`macval(fixed_cilab)'"' +// - csv + local csv_open0 `"`"\`csvlhs'% `cdate' `ctime'""'"' + local csv_close0 `""""' + local csv_open `""' + local csv_close `""' + local csv_caption `"`"\`csvlhs'@title""'"' + local csv_open2 `""' + local csv_close2 `""' + local csv_topgap `""""' + local csv_midgap `""""' + local csv_bottomgap `""""' + local csv_ssl `"`macval(fixed_ssl)'"' + local csv_lsl `"`macval(fixed_lsl)'"' + local csv_starlevels `"`macval(fixed_starlevels)'"' + local csv_starlevlab `""' + local csv_begin `"`"\`csvlhs'"'"' + local csv_delimiter `"`"",\`csvlhs'"'"' + local scsv_delimiter `"`"";\`csvlhs'"'"' + local csv_end `"`"""'"' + local csv_incelldel `"" ""' + local csv_varwidth `""' + local csv_modelwidth `""' + local csv_abbrev `""' + local csv_substitute `""' + local csv_interaction `"" # ""' + local csv_tstatlab `"`macval(fixed_tstatlab)'"' + local csv_zstatlab `"`macval(fixed_zstatlab)'"' + local csv_pvallab `"`macval(fixed_pvallab)'"' + local csv_cilab `"`macval(fixed_cilab)'"' +// - rtf + local rtf_open0 `""' + local rtf_close0 `""' + local rtf_ct `"\yr`=year(d(`cdate'))'\mo`=month(d(`cdate'))'\dy`=day(d(`cdate'))'\hr`=substr("`ctime'",1,2)'\min`=substr("`ctime'",4,2)'"' + local rtf_fonttbl "\f0\fnil Times New Roman;" + local rtf_open_l1 `"`"{\rtf1`=cond("`c(os)'"=="MacOSX", "\mac", "\ansi")'\deff0 {\fonttbl\`rtf_fonttbl'}"'"' + local rtf_open_l2 `" `"{\info {\author .}{\company .}{\title .}{\creatim`rtf_ct'}}"'"' + local rtf_open_l3 `" `"\deflang1033\plain\fs24"'"' + local rtf_open_l4 `" `"{\footer\pard\qc\plain\f0\fs24\chpgn\par}"'"' + local rtf_open `"\`rtf_open_l1'`rtf_open_l2'`rtf_open_l3'`rtf_open_l4'"' + local rtf_close `""{\pard \par}" "}""' + local rtf_caption `"`"{\pard\keepn\ql @title\par}"'"' + local rtf_open2 `""{""' + local rtf_close2 `""}""' + local rtf_toprule `""' + local rtf_midrule `""' + local rtf_bottomrule `""' + local rtf_topgap `""' + local rtf_midgap `"{\trowd\trgaph108\trleft-108@rtfemptyrow\row}"' + local rtf_bottomgap `""' + local rtf_eqrule `"begin("{\trowd\trgaph108\trleft-108@rtfrowdefbrdrt\pard\intbl\ql {") replace"' + local rtf_ssl `""{\i N}" "{\i R}{\super 2}" "adj. {\i R}{\super 2}" "pseudo {\i R}{\super 2}" "{\i AIC}" "{\i BIC}""' + local rtf_lsl `"Observations "{\i R}{\super 2}" "Adjusted {\i R}{\super 2}" "Pseudo {\i R}{\super 2}" "{\i AIC}" "{\i BIC}""' + local rtf_starlevels `""{\super *}" 0.05 "{\super **}" 0.01 "{\super ***}" 0.001"' + local rtf_starlevlab `", label(" {\i p} < ")"' + local rtf_rowdef `"\`=cond("\`lines'"=="", "@rtfrowdef", "@rtfrowdefbrdr")'"' + local rtf_begin `"{\trowd\trgaph108\trleft-108\`rtf_rowdef'\pard\intbl\ql {"' + local rtf_delimiter `"}\cell \pard\intbl\q\`=cond(`"\`alignment'"'!="", `"\`alignment'"', "c")' {"' + local rtf_end `"}\cell\row}"' + local rtf_incelldel `""\line ""' + local rtf_varwidth `"\`= cond("\`label'"=="", 12, 20)'"' + local rtf_modelwidth `"12"' + local rtf_abbrev `""' + local rtf_substitute `""' + local rtf_interaction `"" # ""' + local rtf_tstatlab `"{\i t} statistics"' + local rtf_zstatlab `"{\i z} statistics"' + local rtf_pvallab `"{\i p}-values"' + local rtf_cilab `"\`level'% confidence intervals"' +// - html + local html_open0 `" "`=cond(`"\`macval(title)'"'=="","estimates table, created `cdate' `ctime'","@title")'" """' + local html_close0 `""" """' + local html_open `"`""'"' + local html_close `""
      ""' + local html_caption `""@title""' + local html_open2 `""' + local html_close2 `""' + local html_toprule `""
      ""' + local html_midrule `""
      ""' + local html_bottomrule `""
      ""' + local html_topgap `""' + local html_midgap `"" ""' + local html_bottomgap `""' + local html_eqrule `"begin("
      " "")"' + local html_ssl `"N R2 "adj. R2" "pseudo R2" AIC BIC"' + local html_lsl `"Observations R2 "Adjusted R2" "Pseudo R2" AIC BIC"' + local html_starlevels `"* 0.05 ** 0.01 *** 0.001"' + local html_starlevlab `", label(" p < ")"' + local html_begin `""' + local html_delimiter `""' + local html_end `""' + local html_incelldel `"
      "' + local html_varwidth `"\`= cond("\`label'"=="", 12, 20)'"' + local html_modelwidth `"12"' + local html_abbrev `""' + local html_substitute `""' + local html_interaction `"" # ""' + local html_tstatlab `"t statistics"' + local html_zstatlab `"z statistics"' + local html_pvallab `"p-values"' + local html_cilab `"\`level'% confidence intervals"' +// - tex + local tex_open0 `""% `cdate' `ctime'" `"\documentclass\`texclass'"' \`texpkgs' \`=cond("\`longtable'"!="","\usepackage{longtable}","")' \begin{document} """' + local tex_close0 `""" \end{document} """' + local tex_open `"`"\`=cond("\`longtable'"=="", "\begin{table}[htbp]\centering", "{")'"'"' + local tex_close `"`"\`=cond("\`longtable'"=="", "\end{table}", "}")'"'"' + local tex_caption `"\caption{@title}"' + local tex_open2 `"\`=cond("\`longtable'"!="", "\begin{longtable}", "\begin{tabular" + cond("\`width'"=="", "}", "*}{\`width'}"))'"' + local tex_close2 `"`"\`=cond("\`longtable'"!="", "\end{longtable}", "\end{tabular" + cond("\`width'"=="", "}", "*}"))'"'"' + local tex_toprule `"`"\`="\hline\hline" + cond("\`longtable'"!="", "\endfirsthead\hline\endhead\hline\endfoot\endlastfoot", "")'"'"' + local tex_midrule `""\hline""' + local tex_bottomrule `""\hline\hline""' + local tex_topgap `""' + local tex_midgap `"[1em]"' // `"\\\"' + local tex_bottomgap `""' + local tex_eqrule `"begin("\hline" "")"' + local tex_ssl `"\(N\) \(R^{2}\) "adj. \(R^{2}\)" "pseudo \(R^{2}\)" \textit{AIC} \textit{BIC}"' + local tex_lsl `"Observations \(R^{2}\) "Adjusted \(R^{2}\)" "Pseudo \(R^{2}\)" \textit{AIC} \textit{BIC}"' + local tex_starlevels `"\sym{*} 0.05 \sym{**} 0.01 \sym{***} 0.001"' + local tex_starlevlab `", label(" \(p<@\)")"' + local tex_begin `""' + local tex_delimiter `"&"' + local tex_end `"\\\"' + local tex_incelldel `"" ""' + local tex_varwidth `"\`= cond("\`label'"=="", 12, 20)'"' + local tex_modelwidth `"12"' + local tex_abbrev `""' + local tex_tstatlab `"\textit{t} statistics"' + local tex_zstatlab `"\textit{z} statistics"' + local tex_pvallab `"\textit{p}-values"' + local tex_cilab `"\`level'\% confidence intervals"' + local tex_substitute `"_ \_ "\_cons " \_cons"' + local tex_interaction `"" $\times$ ""' +// - booktabs + local booktabs_open0 `""% `cdate' `ctime'" `"\documentclass\`texclass'"' \`texpkgs' \usepackage{booktabs} \`=cond("\`longtable'"!="","\usepackage{longtable}","")' \begin{document} """' + local booktabs_close0 `"`macval(tex_close0)'"' + local booktabs_open `"`macval(tex_open)'"' + local booktabs_close `"`macval(tex_close)'"' + local booktabs_caption `"`macval(tex_caption)'"' + local booktabs_open2 `"`macval(tex_open2)'"' + local booktabs_close2 `"`macval(tex_close2)'"' + local booktabs_toprule `"`"\`="\toprule" + cond("\`longtable'"!="", "\endfirsthead\midrule\endhead\midrule\endfoot\endlastfoot", "")'"'"' + local booktabs_midrule `""\midrule""' + local booktabs_bottomrule `""\bottomrule""' + local booktabs_topgap `"`macval(tex_topgap)'"' + local booktabs_midgap `"\addlinespace"' + local booktabs_bottomgap `"`macval(tex_bottomgap)'"' + local booktabs_eqrule `"begin("\midrule" "")"' + local booktabs_ssl `"`macval(tex_ssl)'"' + local booktabs_lsl `"`macval(tex_lsl)'"' + local booktabs_starlevels `"`macval(tex_starlevels)'"' + local booktabs_starlevlab `"`macval(tex_starlevlab)'"' + local booktabs_begin `"`macval(tex_begin)'"' + local booktabs_delimiter `"`macval(tex_delimiter)'"' + local booktabs_end `"`macval(tex_end)'"' + local booktabs_incelldel `"`macval(tex_incelldel)'"' + local booktabs_varwidth `"`macval(tex_varwidth)'"' + local booktabs_modelwidth `"`macval(tex_modelwidth)'"' + local booktabs_abbrev `"`macval(tex_abbrev)'"' + local booktabs_tstatlab `"`macval(tex_tstatlab)'"' + local booktabs_zstatlab `"`macval(tex_zstatlab)'"' + local booktabs_pvallab `"`macval(tex_pvallab)'"' + local booktabs_cilab `"`macval(tex_cilab)'"' + local booktabs_substitute `"`macval(tex_substitute)'"' + local booktabs_interaction `"`macval(tex_interaction)'"' +// - mmd + local mmd_open0 `""' + local mmd_close0 `""' + local mmd_open `""""' + local mmd_close `""""' + local mmd_caption `""@title" """' + local mmd_open2 `""' + local mmd_close2 `""' + local mmd_toprule `""' + local mmd_midrule `""' + local mmd_bottomrule `""' + local mmd_topgap `""' + local mmd_midgap `""' + local mmd_bottomgap `""' + local mmd_eqrule `""' + local mmd_ssl `"*N* *R*2 "adj. *R*2" "pseudo *R*2" *AIC* *BIC*"' + local mmd_lsl `"Observations *R*2 "Adjusted *R*2" "Pseudo *R*2" *AIC* *BIC*"' + local mmd_starlevels `"\* 0.05 \*\* 0.01 \*\*\* 0.001"' + local mmd_starlevlab `", label(" *p* < ")"' + local mmd_begin `"| "' + local mmd_delimiter `" | "' + local mmd_end `" |"' + local mmd_incelldel `" "' + local mmd_varwidth `"\`= cond("\`label'"=="", 12, 20)'"' + local mmd_modelwidth `"12"' + local mmd_abbrev `""' + local mmd_substitute `"_ \_ "\_cons " \_cons"' + local mmd_interaction `"" # ""' + local mmd_tstatlab `"*t* statistics"' + local mmd_zstatlab `"*z* statistics"' + local mmd_pvallab `"*p*-values"' + local mmd_cilab `"\`level'\% confidence intervals"' +// syntax + syntax [anything] [using] [ , /// + /// coefficients and t-stats, se, etc. + b Bfmt(string) /// + noT Tfmt(string) /// + z Zfmt(string) /// + se SEfmt(string) /// + p Pfmt(string) /// + ci CIfmt(string) /// + BEta BEtafmt(string) /// + main(string) /// syntax: name format + aux(string) /// syntax: name format + abs /// absolute t-values + wide /// + NOSTAr STAR STAR2(string asis) /// + staraux /// + NOCONstant CONstant /// + COEFlabels(string asis) /// + /// summary statistics + noOBS obslast /// + r2 R2fmt(string) ar2 AR2fmt(string) pr2 PR2fmt(string) /// + aic AICfmt(string) bic BICfmt(string) /// + SCAlars(string asis) /// syntax: "name1 [label1]" "name2 [label2]" etc. + sfmt(string) /// + /// layout + NOMTItles MTItles MTItles2(string asis) /// + NOGAPs GAPs /// + NOLInes LInes /// + ADDNotes(string asis) /// + COMpress /// + plain /// + smcl FIXed tab csv SCsv rtf HTMl tex BOOKTabs md mmd /// + Fragment /// + page PAGE2(str) /// + STANDalone STANDalone2(str asis) /// + ALIGNment(str asis) /// + width(str asis) /// + fonttbl(str) /// + /// other + Noisily /// + * ] + _more_syntax , `macval(options)' + _estout_options , `macval(options)' + +// matrix mode + MatrixMode, `anything' + +// syntax consistency etc + gettoken chunk using0: using + if `"`macval(star2)'"'!="" local star star + foreach opt in constant gaps lines star abbrev depvars numbers parentheses /// + notes mtitles type outfilenoteoff float { + NotBothAllowed "``opt''" `no`opt'' + } + NotBothAllowed "`staraux'" `nostar' + if `"`macval(mtitles2)'"'!="" NotBothAllowed "mtitles" `nomtitles' + if `"`standalone2'"'!="" local standalone standalone + if "`standalone'"!="" { + if `"`standalone2'"'=="" local standalone2 "[varwidth]" + else if `"`standalone2'"'==`""""' local standalone2 + else local standalone2 `"[`standalone2']"' + local page page + } + if `"`page2'"'!="" local page page + NotBothAllowed "`fragment'" `page' + if `"`pfmt'"'!="" local p p + if `"`zfmt'"'!="" local z z + if `"`sefmt'"'!="" local se se + if `"`cifmt'"'!="" local ci ci + if `"`betafmt'"'!="" local beta beta + if "`level'"=="" local level $S_level + if ((("`margin'"!="" | `"`margin2'"'!="") & "`nomargin'"=="") | /// + ("`beta'"!="") | ("`eform'"!="" & "`noeform'"=="")) /// + & "`constant'"=="" local noconstant noconstant + if `"`r2fmt'"'!="" local r2 r2 + if `"`ar2fmt'"'!="" local ar2 ar2 + if `"`pr2fmt'"'!="" local pr2 pr2 + if `"`aicfmt'"'!="" local aic aic + if `"`bicfmt'"'!="" local bic bic + if "`type'"=="" & `"`using'"'!="" local notype notype + local nocellsopt = `"`macval(cells)'"'=="" + if `"`width'"'!="" & `"`longtable'"'!="" { + di as err "width() and longtable not both allowed" + exit 198 + } + +// format modes + local mode `smcl' `fixed' `tab' `csv' `scsv' `rtf' `html' `tex' `booktabs' `md' `mmd' + if `:list sizeof mode'>1 { + di as err "only one allowed of smcl, fixed, tab, csv, scsv, rtf, html, tex, booktabs, md, or mmd" + exit 198 + } + if `"`using'"'!="" { + _getfilename `"`using0'"' + local fn `"`r(filename)'"' + _getfilesuffix `"`fn'"' + local suffix `"`r(suffix)'"' + } + if "`mode'"=="" { + if `"`using'"'!="" { + if inlist(`"`suffix'"', ".html", ".htm") local mode html + else if `"`suffix'"'==".tex" local mode tex + else if `"`suffix'"'==".csv" local mode csv + else if `"`suffix'"'==".rtf" local mode rtf + else if `"`suffix'"'==".smcl" local mode smcl + else if `"`suffix'"'== ".md" local mode md + else if `"`suffix'"'== ".mmd" local mode mmd + else local mode fixed + } + else local mode smcl + } + else { + if "`mode'"=="scsv" { + local csv_delimiter `"`macval(`mode'_delimiter)'"' + local mode "csv" + } + } + if `"`using'"'!="" & `"`suffix'"'=="" { + if inlist("`mode'","fixed","tab") local suffix ".txt" + else if inlist("`mode'","csv","scsv") local suffix ".csv" + else if "`mode'"=="rtf" local suffix ".rtf" + else if "`mode'"=="html" local suffix ".html" + else if inlist("`mode'","tex","booktabs") local suffix ".tex" + else if "`mode'"=="smcl" local suffix ".smcl" + else if "`mode'"=="md" local suffix ".md" + else if "`mode'"=="mmd" local suffix ".mmd" + local using `"using `"`fn'`suffix'"'"' + local using0 `" `"`fn'`suffix'"'"' + } + if "`mode'"=="md" local mode "mmd" // ! + if "`mode'"=="smcl" local smcltags smcltags + local mode0 `mode' + if "`mode0'"=="booktabs" local mode0 tex + else if "`mode0'"=="csv" { + if "`plain'"=="" local csvlhs `"=""' + else local csvlhs `"""' + } + if "`compress'"!="" { + if "``mode'_modelwidth'"!="" { + local `mode'_modelwidth = ``mode'_modelwidth' - 3 + } + if "``mode'_varwidth'"!="" { + local `mode'_varwidth = ``mode'_varwidth' - cond("`label'"!="", 4, 2) + } + } + if `"`modelwidth'"'=="" { + if `nocellsopt' & `"``mode'_modelwidth'"'!="" & "`ci'"!="" { + local modelwidth = 2*``mode'_modelwidth' - 2 + if "`wide'"!="" local modelwidth "``mode'_modelwidth' `modelwidth'" + } + else { + local modelwidth "``mode'_modelwidth'" + } + } + if `"`varwidth'"'=="" { + local varwidth "``mode'_varwidth'" + } + if "`plain'"=="" & `matrixmode'==0 { + foreach opt in star depvars numbers parentheses notes { + SwitchOnIfEmpty `opt' `no`opt'' + } + if "`wide'"=="" & ("`t'"=="" | "`z'`se'`p'`ci'`aux'"!="") & `nocellsopt'==1 /// + SwitchOnIfEmpty gaps `nogaps' + } + if "`plain'"=="" { + SwitchOnIfEmpty lines `nolines' + } + if `"`lines'"'!="" { + SwitchOnIfEmpty eqlines `noeqlines' + } + if inlist("`mode0'", "tab", "csv") { + local lines + local eqlines + } + if "`notes'"!="" & "`nolegend'"=="" & `nocellsopt'==1 & `matrixmode'==0 local legend legend + if "`plain'"!="" { + if "`bfmt'"=="" local bfmt %9.0g + if "`tfmt'"=="" local tfmt `bfmt' + if "`zfmt'"=="" local zfmt `bfmt' + if "`sefmt'"=="" local sefmt `bfmt' + if "`pfmt'"=="" local pfmt `bfmt' + if "`cifmt'"=="" local cifmt `bfmt' + if "`betafmt'"=="" local betafmt `bfmt' + } + //if "`nomtitles'"!="" local depvars + //else if "`depvars'"=="" local mtitles mtitles + +// prepare append for rtf, tex, and html + local outfilenoteoff2 "`outfilenoteoff'" + if "`outfilenoteoff2'"=="" local outfilenoteoff2 "`nooutfilenoteoff'" + if `"`using'"'!="" & "`append'"!="" & /// + (("`mode0'"=="rtf" & "`fragment'"=="") | /// + ("`page'"!="" & inlist("`mode0'", "tex", "html"))) { + capture confirm file `using0' + if _rc==0 { + tempfile appendfile + if "`mode'"=="rtf" local `mode'_open + else local `mode'_open0 + local append + if "`outfilenoteoff2'"=="" local outfilenoteoff2 outfilenoteoff + } + } + +// cells() option + if "`notes'"!="" { + if ("`margin'"!="" | `"`margin2'"'!="") & "`nomargin'"=="" /// + local thenote "`thenote'Marginal effects" + if "`eform'"!="" & "`noeform'"=="" /// + local thenote "`thenote'Exponentiated coefficients" + } + if "`bfmt'"=="" local bfmt a3 + if `nocellsopt' & `matrixmode'==0 { + if "`star'"!="" & "`staraux'"=="" local bstar star + if "`beta'"!="" { + if "`main'"!="" { + di as err "beta() and main() not allowed both" + exit 198 + } + if "`betafmt'"=="" local betafmt 3 + local cells fmt(`betafmt') `bstar' + local cells beta(`cells') + if "`notes'"!="" { + if `"`thenote'"'!="" local thenote "`thenote'; " + local thenote "`thenote'Standardized beta coefficients" + } + } + else if "`main'"!="" { + tokenize "`main'" + if "`2'"=="" local 2 "`bfmt'" + local cells fmt(`2') `bstar' + local cells `1'(`cells') + if "`notes'"!="" { + if `"`thenote'"'!="" local thenote "`thenote'; " + local thenote "`thenote'`1' coefficients" + } + } + else { + local cells fmt(`bfmt') `bstar' + local cells b(`cells') + } + if "`t'"=="" | "`z'`se'`p'`ci'`aux'"!="" { + if "`onecell'"!="" { + local cells `cells' & + } +// parse aux option + tokenize "`aux'" + local auxname `1' + local auxfmt `2' +// type of auxiliary statistic + local aux `z' `se' `p' `ci' `auxname' + if `"`aux'"'=="" local aux t + else { + if `:list sizeof aux'>1 { + di as err "only one allowed of z, se, p, ci, and aux()" + exit 198 + } + } + if !inlist(`"`aux'"', "t", "z") local abs +// parentheses/brackets + if "`parentheses'"!="" | "`brackets'"!="" { + if `"`aux'"'=="ci" { + local brackets brackets + if "`mode'"!="smcl" | "`onecell'"!="" local paren par + else local paren `"par("{ralign @modelwidth:{txt:[}" "{txt:,}" "{txt:]}}")"' + } + else if "`brackets'"!="" { + if "`mode'"!="smcl" | "`onecell'"!="" local paren "par([ ])" + else local paren `"par("{ralign @modelwidth:{txt:[}" "{txt:]}}")"' + } + else { + if "`mode'"!="smcl" | "`onecell'"!="" local paren par + else local paren `"par("{ralign @modelwidth:{txt:(}" "{txt:)}}")"' + } + } +// compose note + if "`notes'"!="" { + if `"`thenote'"'!="" local thenote "`thenote'; " + if `"`auxname'"'!="" { + local thenote `"`macval(thenote)'`auxname'"' + } + else if inlist(`"`aux'"', "t", "z") { + if "`abs'"!="" local thenote `"`macval(thenote)'Absolute "' + local thenote `"`macval(thenote)'``mode'_`aux'statlab'"' + } + else if `"`aux'"'=="se" { + local thenote `"`macval(thenote)'Standard errors"' + } + else if `"`aux'"'=="p" { + local thenote `"`macval(thenote)'``mode'_pvallab'"' + } + else if `"`aux'"'=="ci" { + local thenote `"`macval(thenote)'``mode'_cilab'"' + } + if "`parentheses'"=="" { + if "`wide'"=="" local thenote `"`macval(thenote)' in second row"' + else local thenote `"`macval(thenote)' in second column"' + } + else if "`brackets'"!="" { + local thenote `"`macval(thenote)' in brackets"' + } + else local thenote `"`macval(thenote)' in parentheses"' + } +// formats + if "`tfmt'"=="" local tfmt 2 + if "`zfmt'"=="" local zfmt 2 + if "`sefmt'"=="" local sefmt `bfmt' + if "`pfmt'"=="" local pfmt 3 + if "`cifmt'"=="" local cifmt `bfmt' + if `"`auxfmt'"'=="" local auxfmt `bfmt' + if `"`auxname'"'=="" { + local auxfmt ``aux'fmt' + } +// stars + if "`staraux'"!="" local staraux star +// put together + local temp fmt(`auxfmt') `paren' `abs' `staraux' + local cells `cells' `aux'(`temp') + } + if "`wide'"!="" local cells cells(`"`cells'"') + else local cells cells(`cells') + } + +// stats() option + if `"`macval(stats)'"'=="" & `matrixmode'==0 { + if `"`sfmt'"'=="" local sfmt `bfmt' + if `"`r2fmt'"'=="" local r2fmt = cond("`plain'"!="", "`bfmt'", "3") + if `"`ar2fmt'"'=="" local ar2fmt = cond("`plain'"!="", "`bfmt'", "3") + if `"`pr2fmt'"'=="" local pr2fmt = cond("`plain'"!="", "`bfmt'", "3") + if `"`aicfmt'"'=="" local aicfmt `bfmt' + if `"`bicfmt'"'=="" local bicfmt `bfmt' + if "`label'"=="" { + local stalabs `"``mode'_ssl'"' + } + else { + local stalabs `"``mode'_lsl'"' + } + gettoken obslab stalabs: stalabs + if "`obs'"=="" & "`obslast'"=="" { + local sta N + local stalab `"`"`macval(obslab)'"'"' + local stafmt %18.0g + } + local i 0 + foreach s in r2 ar2 pr2 aic bic { + local ++i + if "``s''"!="" { + local sta `sta' `:word `i' of r2 r2_a r2_p aic bic' + local chunk: word `i' of `macval(stalabs)' + local stalab `"`macval(stalab)' `"`macval(chunk)'"'"' + local stafmt `stafmt' ``s'fmt' + } + } + local i 0 + CheckScalarOpt `macval(scalars)' + foreach addstat of local scalars { + local ++i + gettoken addstatname addstatlabel: addstat + local addstatlabel = substr(`"`macval(addstatlabel)'"',2,.) + if `: list posof `"`addstatname'"' in sta' continue + if `"`addstatname'"'=="N" & "`obs'"=="" & "`obslast'"!="" continue + if trim(`"`macval(addstatlabel)'"')=="" local addstatlabel `addstatname' + local addstatfmt: word `i' of `sfmt' + if `"`addstatfmt'"'=="" { + local addstatfmt: word `: list sizeof sfmt' of `sfmt' + } + local sta `sta' `addstatname' + local stalab `"`macval(stalab)' `"`macval(addstatlabel)'"'"' + local stafmt `stafmt' `addstatfmt' + } + if "`obs'"=="" & "`obslast'"!="" { + local sta `sta' N + local stalab `"`macval(stalab)' `"`macval(obslab)'"'"' + local stafmt `stafmt' %18.0g + } + if "`sta'"!="" { + local stats stats(`sta', fmt(`stafmt') labels(`macval(stalab)')) + } + } + +// table header + if `"`macval(mlabels)'"'=="" { + if "`mode0'"=="tex" local mspan " span prefix(\multicolumn{@span}{c}{) suffix(})" + if `"`depvars'"'!="" { + local mlabels `"mlabels(, depvar`mspan')"' + } + if `"`nomtitles'"'!="" local mlabels `"mlabels(none)"' + if "`mtitles'"!="" { + local mlabels `"mlabels(, titles`mspan')"' + } + if `"`macval(mtitles2)'"'!="" { + local mlabels `"mlabels(`macval(mtitles2)', titles`mspan')"' + } + } + if `"`macval(collabels)'"'=="" & `nocellsopt' & `matrixmode'==0 & "`plain'"=="" { + local collabels `"collabels(none)"' + } + if "`mode0'"=="tex" & "`numbers'"!="" { + local numbers "numbers(\multicolumn{@span}{c}{( )})" + } + +// pre-/posthead, pre-/postfoot, gaps and lines +// - complete note + if `"`macval(thenote)'"'!="" { + local thenote `"`"`macval(thenote)'"'"' + } + if `"`macval(note)'"'!="" { + local thenote `""@note""' + } + if `"`macval(addnotes)'"'!="" { + if index(`"`macval(addnotes)'"', `"""')==0 { + local addnotes `"`"`macval(addnotes)'"'"' + } + local thenote `"`macval(thenote)' `macval(addnotes)'"' + } + if "`legend'"!="" { + if ("`margin'"!="" | `"`margin2'"'!="") & /// + "`nomargin'"=="" & "`nodiscrete'"=="" { + local thenote `"`macval(thenote)' "@discrete""' + } + if "`star'"!="" | `nocellsopt'==0 { + local thenote `"`macval(thenote)' "@starlegend""' + } + } +// - mode specific settings + if "`star'"!="" { + if `"`macval(star2)'"'!="" { + FormatStarSym "`mode0'" `"`macval(star2)'"' + local `mode'_starlevels `"`macval(star2)'"' + } + if `"`macval(starlevels)'"'=="" { + local starlevels `"starlevels(`macval(`mode'_starlevels)'`macval(`mode'_starlevlab)')"' + } + } + foreach opt in begin delimiter end substitute interaction { + if `"`macval(`opt')'"'=="" & `"``mode'_`opt''"'!="" { + local `opt' `"`opt'(``mode'_`opt'')"' + } + } + if "`onecell'"!="" { + if `"`macval(incelldelimiter)'"'=="" { + local incelldelimiter `"incelldelimiter(``mode'_incelldel')"' + } + } + if "`noabbrev'`abbrev'"=="" { + local abbrev ``mode'_abbrev' + } + if `"`fragment'"'=="" { + if `"`fonttbl'"'!="" { + local rtf_fonttbl `"`fonttbl'"' + } + if "`page'"!="" { + local texclass "{article}" + if "`standalone'"!="" local texclass "`standalone2'{standalone}" + else local texclass "{article}" + if `"`page2'"'!="" { + local texpkgs `""\usepackage{`page2'}""' + } + local opening `"``mode'_open0'"' + } + if "`mode0'"=="tex" { + if (`"`macval(title)'"'!="" | "`float'"!="") & "`nofloat'"=="" { + local opening `"`macval(opening)' ``mode'_open'"' + } + else if "`star'"!="" { + local opening `"`macval(opening)' "{""' + } + if "`star'"!="" { + local opening `"`macval(opening)' "\def\sym#1{\ifmmode^{#1}\else\(^{#1}\)\fi}""' + } + if `"`macval(title)'"'!="" & "`longtable'"=="" { + local opening `"`macval(opening)' `"``mode'_caption'"'"' + } + } + else { + local opening `"`macval(opening)' ``mode'_open'"' + if `"`macval(title)'"'!="" { + local opening `"`macval(opening)' ``mode'_caption'"' + } + } + if "`mode0'"=="tex" { + if `"`labcol2'"'!="" local lstubtex "lc" + else local lstubtex "l" + if `"`width'"'!="" local extracolsep "@{\hskip\tabcolsep\extracolsep\fill}" + if `matrixmode' { + if `"`macval(alignment)'"'!="" { + local opening `"`macval(opening)' `"``mode'_open2'{`extracolsep'`lstubtex'`macval(alignment)'}"'"' + } + else { + MakeTeXColspecMat, `anything' + local opening `"`macval(opening)' `"``mode'_open2'{`extracolsep'`lstubtex'`value'}"'"' + } + } + else { + if `"`macval(alignment)'"'!="" { + local opening `"`macval(opening)' `"``mode'_open2'{`extracolsep'`lstubtex'*{@E}{`macval(alignment)'}}"'"' + } + else { + if `nocellsopt' { + MakeTeXColspec "`wide'" "`not'" "`star'" "`stardetach'" "`staraux'" + } + else { + MakeTeXColspecAlt, `cells' + } + local opening `"`macval(opening)' `"``mode'_open2'{`extracolsep'`lstubtex'*{@E}{`value'}}"'"' + } + } + if "`longtable'"!="" { + if `"`macval(title)'"'!="" { + local opening `"`macval(opening)' `"``mode'_caption'\\\"'"' + } + } + } + else { + local opening `"`macval(opening)' ``mode'_open2'"' + } + if "`mode0'"=="html" { + local brr + foreach chunk of local thenote { + local closing `"`macval(closing)' `"`brr'`macval(chunk)'"'"' + local brr "
      " + } + if `"`macval(closing)'"'!="" { + local closing `""" `macval(closing)' """' + } + } + else if "`mode0'"=="tex" { + foreach chunk of local thenote { + local closing `"`macval(closing)' `"\multicolumn{@span}{l}{\footnotesize `macval(chunk)'}\\\"'"' + } + } + else if "`mode0'"=="csv" { + foreach chunk of local thenote { + local closing `"`macval(closing)' `"`csvlhs'`macval(chunk)'""'"' + } + } + else if "`mode0'"=="rtf" { + foreach chunk of local thenote { + local closing `"`macval(closing)' `"{\pard\ql\fs20 `macval(chunk)'\par}"'"' + } + } + else if "`mode0'"=="mmd" { + local n_chunks: list sizeof thenote + if `n_chunks' { + local closing `"`macval(closing)' """' + local i 0 + foreach chunk of local thenote { + local ++i + if `i'<`n_chunks' { + local chunk `"`macval(chunk)'
      "' + } + local closing `"`macval(closing)' `"`macval(chunk)'"'"' + } + } + } + else { + local closing `"`macval(thenote)'"' + } + local closing `"`macval(closing)' ``mode'_close2'"' + if "`mode0'"=="tex" { + if (`"`macval(title)'"'!="" | "`float'"!="") & "`nofloat'"=="" { + local closing `"`macval(closing)' ``mode'_close'"' + } + else if "`star'"!="" { + local closing `"`macval(closing)' "}""' + } + } + else { + local closing `"`macval(closing)' ``mode'_close'"' + } + if "`page'`standalone'"!="" { + local closing `"`macval(closing)' ``mode'_close0'"' + } + local toprule `"``mode'_toprule'"' + local bottomrule `"``mode'_bottomrule'"' + local topgap `"``mode'_topgap'"' + local bottomgap `"``mode'_bottomgap'"' + } + local midrule `"``mode'_midrule'"' + local midgap `"``mode'_midgap'"' + local eqrule `"``mode'_eqrule'"' +// - compose prehead() + if `"`macval(prehead)'"'=="" { + if `"`lines'"'!="" { + local opening `"`macval(opening)' `macval(toprule)'"' + } + else if `"`gaps'"'!="" { + local opening `"`macval(opening)' `macval(topgap)'"' + } + SaveRetok `macval(opening)' + local opening `"`macval(value)'"' + if `"`macval(opening)'"'!="" { + local prehead `"prehead(`macval(opening)')"' + } + } +// - compose posthead() + if `"`macval(posthead)'"'=="" { + if `"`lines'"'!="" { + local posthead `"posthead(`macval(midrule)')"' + } + else if `"`gaps'"'!="" { + local posthead `"posthead(`macval(midgap)')"' + } + } +// - compose prefoot() + if `"`macval(prefoot)'"'=="" & `"`macval(stats)'"'!="" { + if `"`lines'"'!="" { + local prefoot `"prefoot(`macval(midrule)')"' + } + else if `"`gaps'"'!="" { + local prefoot `"prefoot(`macval(midgap)')"' + } + if `"`cells'"'=="cells(none)" local prefoot + } +// - compose postfoot() + if `"`macval(postfoot)'"'=="" { + if `"`lines'"'!="" { + local closing `"`macval(bottomrule)' `macval(closing)'"' + } + else if `"`gaps'"'!="" { + local closing `"`macval(bottomgap)' `macval(closing)'"' + } + SaveRetok `macval(closing)' + local closing `"`macval(value)'"' + if `"`macval(closing)'"'!="" { + local postfoot postfoot(`macval(closing)') + } + } +// - varlabels + if `"`macval(varlabels)'"'=="" { + if `"`gaps'"'!="" { + local varl `", end("" `macval(midgap)') nolast"' + } + if "`label'"!="" { + local varl `"_cons Constant`macval(varl)'"' + } + if `"`macval(coeflabels)'"'!="" { + local varl `"`macval(coeflabels)' `macval(varl)'"' + } + if trim(`"`macval(varl)'"')!="" { + local varlabels varlabels(`macval(varl)') + } + } +// - equation labels + if ("`eqlines'"!="" | `"`gaps'"'!="") & "`unstack'"=="" { + if trim(`"`eqlabels'"')!="none" { + ParseEqLabels `macval(eqlabels)' + if `eqlabelsok' { + _parse comma eqllhs eqlrhs : eqlabels + if `"`eqlrhs'"'=="" local eqlabelscomma ", " + else local eqlabelscomma " " + if "`eqlines'"!=""{ + local eqlabels `"`macval(eqlabels)'`eqlabelscomma'`macval(eqrule)' nofirst"' + } + else if `"`gaps'"'!="" { + local eqlabels `"`macval(eqlabels)'`eqlabelscomma'begin(`macval(midgap)' "") nofirst"' + } + } + } + } + if `"`macval(eqlabels)'"'!="" { + local eqlabels `"eqlabels(`macval(eqlabels)')"' + } + +// noconstant option + if `"`drop'"'=="" { + if "`noconstant'"!="" { + local drop drop(_cons, relax) + } + } + +// compute beta coefficients (run estadd to add e(beta)) + if "`beta'"!="" { + local estnames `"`anything'"' + if `"`estnames'"'=="" { + capt est_expand $eststo + if !_rc { + local estnames `"$eststo"' + } + } + version `caller': estadd beta, replace: `estnames' + } + +// use tempfile for new table + if `"`appendfile'"'!="" { + local using `"using `"`appendfile'"'"' + } + +// execute estout + if `"`varwidth'"'!="" local varwidth `"varwidth(`varwidth')"' + if `"`modelwidth'"'!="" local modelwidth `"modelwidth(`modelwidth')"' + if `"`style'"'=="" { + if "`mode'"=="mmd" local style "style(mmd)" + else local style "style(esttab)" + } + CleanEstoutCmd `anything' `using' , /// + `macval(cells)' `drop' `nomargin' `margin' `margin2' `noeform' `eform' /// + `nodiscrete' `macval(stats)' `stardetach' `macval(starlevels)' /// + `varwidth' `modelwidth' `noabbrev' `abbrev' `unstack' `macval(begin)' /// + `macval(delimiter)' `macval(end)' `macval(incelldelimiter)' `smcltags' /// + `macval(title)' `macval(prehead)' `macval(posthead)' `macval(prefoot)' /// + `macval(postfoot)' `label' `macval(varlabels)' `macval(mlabels)' `nonumbers' /// + `numbers' `macval(collabels)' `macval(eqlabels)' `macval(mgroups)' /// + `macval(note)' `macval(labcol2)' `macval(substitute)' `macval(interaction)' /// + `append' `notype'`type' `outfilenoteoff2' level(`level') `style' /// + `macval(options)' + if "`noisily'"!="" { + gettoken chunk rest: cmd, parse(",") + di as txt _asis `"`chunk'"' _c + gettoken chunk rest: rest, bind + while `"`macval(chunk)'"'!="" { + di as txt _asis `" `macval(chunk)'"' + gettoken chunk rest: rest, bind + } + } + `macval(cmd)' + +// insert new table into existing document (tex, html, rtf) + if `"`appendfile'"'!="" { + local enddoctex "\end{document}" + local enddochtml "" + local enddocrtf "}" + local enddoc "`enddoc`mode0''" + tempname fh + file open `fh' using `using0', read write + file seek `fh' query + local loc = r(loc) + file read `fh' line + while r(eof)==0 { + if `"`line'"'=="`enddoc'" { + if "`mode'"=="rtf" { + file seek `fh' query + local loc0 = r(loc) + file read `fh' line + if r(eof)==0 { + local loc = `loc0' + continue + } + } + continue, break + } + file seek `fh' query + local loc = r(loc) + file read `fh' line + } + file seek `fh' `loc' + tempname new + file open `new' `using', read + file read `new' line + while r(eof)==0 { + file write `fh' `"`macval(line)'"' _n + file read `new' line + } + file close `fh' + file close `new' + if "`outfilenoteoff'"=="" { + di as txt `"(output written to {browse `using0'})"' + } + } +end + +program _more_syntax +// using subroutine (rather than second syntax call) to preserve 'using' + local theoptions /// + NODEPvars DEPvars /// + NOPArentheses PArentheses /// + BRackets /// + NONOTEs NOTEs /// without s in helpfile + LONGtable /// + NOFLOAT float /// + ONEcell /// + NOEQLInes /// + NOOUTFILENOTEOFF outfilenoteoff + syntax [, `theoptions' * ] + foreach opt of local theoptions { + local opt = lower("`opt'") + c_local `opt' "``opt''" + } + c_local options `"`macval(options)'"' +end + +program _estout_options + syntax [, /// + Cells(passthru) /// + Drop(passthru) /// + /// Keep(string asis) /// + /// Order(string asis) /// + /// REName(passthru) /// + /// Indicate(string asis) /// + /// TRansform(string asis) /// + /// EQuations(passthru) /// + NOEFORM eform ///EFORM2(string) /// + NOMargin Margin Margin2(passthru) /// + NODIscrete /// DIscrete(string asis) /// + /// MEQs(string) /// + /// NODROPPED dropped DROPPED2(string) /// + level(numlist max=1 int >=10 <=99) /// + Stats(passthru) /// + STARLevels(passthru) /// + /// NOSTARDetach /// + STARDetach /// + /// STARKeep(string asis) /// + /// STARDrop(string asis) /// + VARwidth(str) /// + MODELwidth(str) /// + NOABbrev ABbrev /// + /// NOUNStack + UNStack /// + BEGin(passthru) /// + DELimiter(passthru) /// + INCELLdelimiter(passthru) /// + end(passthru) /// + /// DMarker(string) /// + /// MSign(string) /// + /// NOLZ lz /// + SUBstitute(passthru) /// + INTERACTion(passthru) /// + TItle(passthru) /// + NOLEgend LEgend /// + PREHead(passthru) /// + POSTHead(passthru) /// + PREFoot(passthru) /// + POSTFoot(passthru) /// + /// HLinechar(string) /// + /// NOLabel + Label /// + VARLabels(passthru) /// + /// REFcat(string asis) /// + MLabels(passthru) /// + NONUMbers NUMbers ///NUMbers2(string asis) /// + COLLabels(passthru) /// + EQLabels(string asis) /// + MGRoups(passthru) /// + LABCOL2(passthru) /// + /// NOReplace Replace /// + /// NOAppend + Append /// + NOTYpe TYpe /// + /// NOSHOWTABS showtabs /// + /// TOPfile(string) /// + /// BOTtomfile(string) /// + STYle(passthru) /// + /// DEFaults(string) /// + /// NOASIS asis /// + /// NOWRAP wrap /// + /// NOSMCLTAGS smcltags /// + /// NOSMCLRules SMCLRules /// + /// NOSMCLMIDRules SMCLMIDRules /// + /// NOSMCLEQRules SMCLEQRules /// + note(passthru) /// + * ] + foreach opt in /// + cells drop noeform eform nomargin margin margin2 nodiscrete /// + level stats starlevels stardetach varwidth modelwidth unstack /// + noabbrev abbrev begin delimiter incelldelimiter end substitute /// + interaction title nolegend legend prehead posthead prefoot postfoot /// + label varlabels mlabels labcol2 nonumbers numbers collabels eqlabels /// + mgroups append notype type style note options { + c_local `opt' `"`macval(`opt')'"' + } +end + +program MatrixMode + capt syntax [, Matrix(str asis) e(str asis) r(str asis) ] + if _rc | `"`matrix'`e'`r'"'=="" { + c_local matrixmode 0 + exit + } + c_local matrixmode 1 +end + +prog NotBothAllowed + args opt1 opt2 + if `"`opt1'"'!="" { + if `"`opt2'"'!="" { + di as err `"options `opt1' and `opt2' not both allowed"' + exit 198 + } + } +end + +prog SwitchOnIfEmpty + args opt1 opt2 + if `"`opt2'"'=="" { + c_local `opt1' `opt1' + } +end + +prog _getfilesuffix, rclass // based on official _getfilename.ado + version 8 + gettoken filename rest : 0 + if `"`rest'"' != "" { + exit 198 + } + local hassuffix 0 + gettoken word rest : filename, parse(".") + while `"`rest'"' != "" { + local hassuffix 1 + gettoken word rest : rest, parse(".") + } + if `"`word'"'=="." { + di as err `"incomplete filename; ends in ."' + exit 198 + } + if index(`"`word'"',"/") | index(`"`word'"',"\") local hassuffix 0 + if `hassuffix' return local suffix `".`word'"' + else return local suffix "" +end + +prog FormatStarSym + args mode list + if inlist("`mode'","rtf","html","tex") { + if "`mode'"=="rtf" { + local prefix "{\super " + local suffix "}" + } + else if "`mode'"=="html" { + local prefix "" + local suffix "" + } + else if "`mode'"=="tex" { + local prefix "\sym{" + local suffix "}" + } + local odd 1 + foreach l of local list { + if `odd' { + local l `"`"`prefix'`macval(l)'`suffix'"'"' + local odd 0 + } + else local odd 1 + local newlist `"`macval(newlist)'`space'`macval(l)'"' + local space " " + } + c_local star2 `"`macval(newlist)'"' + } + //else do noting +end + +prog CheckScalarOpt + capt syntax [anything] + if _rc error 198 +end + +program MakeTeXColspecMat + capt syntax [, Matrix(str asis) e(str asis) r(str asis) ] + ParseMatrixOpt `matrix'`e'`r' + if `"`e'"'!="" local name "e(`name')" + else if `"`r'"'!="" local name "r(`name')" + confirm matrix `name' + tempname bc + mat `bc' = `name' + if "`transpose'"=="" local cols = colsof(`bc') + else local cols = rowsof(`bc') + c_local value "*{`cols'}{c}" +end +program ParseMatrixOpt + syntax name [, Fmt(str asis) Transpose ] + c_local name `"`namelist'"' + c_local fmt `"`fmt'"' + c_local transpose `"`transpose'"' +end + +prog MakeTeXColspec + args wide not star detach aux + if "`star'"!="" & "`detach'"!="" & "`aux'"=="" local value "r@{}l" + else local value "c" + if "`wide'"!="" & "`not'"=="" { + if "`star'"!="" & "`detach'"!="" & "`aux'"!="" local value "`value'r@{}l" + else local value "`value'c" + } + c_local value "`value'" +end + +prog MakeTeXColspecAlt + syntax, cells(string asis) + local count 1 + while `count' { + local cells: subinstr local cells ") (" ")_(", all // preserve space in ") (" + local cells: subinstr local cells "] (" "]_(", all // preserve space in ") [" + local cells: subinstr local cells " (" "(", all count(local count) + } + local cells: subinstr local cells ")_(" ") (", all // restore space in ") (" + local cells: subinstr local cells "]_(" "] (", all // restore space in ") [" + local count 1 + while `count' { + local cells: subinstr local cells " [" "[", all count(local count) + } + local count 1 + while `count' { + local cells: subinstr local cells " &" "&", all count(local count) + } + local count 1 + while `count' { + local cells: subinstr local cells "& " "&", all count(local count) + } + local count 1 + while `"`macval(cells)'"'!="" { + gettoken row cells : cells, match(par) + local size 0 + gettoken chunk row : row, bind + while `"`macval(chunk)'"'!="" { + local ++size + gettoken chunk row : row, bind + } + local count = max(`count',`size') + } + c_local value: di _dup(`count') "c" +end + +prog SaveRetok + gettoken chunk 0: 0, q + local value `"`macval(chunk)'"' + gettoken chunk 0: 0, q + while `"`macval(chunk)'"'!="" { + local value `"`macval(value)' `macval(chunk)'"' + gettoken chunk 0: 0, q + } + c_local value `"`macval(value)'"' +end + +prog CleanEstoutCmd + syntax [anything] [using] [ , * ] + local cmd estout + if `"`macval(anything)'"'!="" { + local cmd `"`macval(cmd)' `macval(anything)'"' + } + if `"`macval(using)'"'!="" { + local cmd `"`macval(cmd)' `macval(using)'"' + } + if `"`macval(options)'"'!="" { + local cmd `"`macval(cmd)', `macval(options)'"' + } + c_local cmd `"`macval(cmd)'"' +end + +prog ParseEqLabels + syntax [anything] [, Begin(passthru) NOReplace Replace NOFirst First * ] + c_local eqlabelsok = `"`begin'`noreplace'`replace'`nofirst'`first'"'=="" +end diff --git a/data/ado/e/esttab.hlp b/data/ado/e/esttab.hlp new file mode 100644 index 0000000..26e4748 --- /dev/null +++ b/data/ado/e/esttab.hlp @@ -0,0 +1,963 @@ +{smcl} +{* 10jun2022}{...} +{hi:help esttab}{right:also see: {helpb estout}, {helpb eststo}, {helpb estadd}, {helpb estpost}} +{right: {browse "http://repec.sowi.unibe.ch/stata/estout/"}} +{hline} + +{title:Title} + +{p 4 4 2}{hi:esttab} {hline 2} Display formatted regression table + + +{title:Table of contents} + + {help esttab##syn:Syntax} + {help esttab##des:Description} + {help esttab##opt:Options} + {help esttab##exa:Examples} + {help esttab##aut:Backmatter} + +{marker syn} +{title:Syntax} + +{p 8 15 2} +{cmd:esttab} [ {it:namelist} ] [ {cmd:using} {it:filename} ] [ {cmd:,} +{it:options} ] + + +{p 4 4 2}where {it:namelist} is a name, a list of names, or {cmd:_all}. The +{cmd:*} and {cmd:?} wildcards are allowed in {it:namelist}. A name may also be {cmd:.}, +meaning the current (active) estimates. + + + {it:options}{col 26}description + {hline 70} + {help esttab##main:Main} + {cmd:b(}{it:{help esttab##fmt:fmt}}{cmd:)}{col 26}{...} +specify format for point estimates + {cmd:beta}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}]{col 26}{...} +display beta coefficients instead of point est's + {cmd:main(}{it:name} [{it:{help esttab##fmt:fmt}}]{cmd:)}{col 26}{...} +display contents of {cmd:e(}{it:name}{cmd:)} instead of point e's + {cmd:t(}{it:{help esttab##fmt:fmt}}{cmd:)}{col 26}{...} +specify format for t-statistics + {cmd:abs}{col 26}{...} +use absolute value of t-statistics + {cmd:not}{col 26}{...} +suppress t-statistics + {cmd:z}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}]{col 26}{...} +display z-statistics (affects label only) + {cmd:se}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}]{col 26}{...} +display standard errors instead of t-statistics + {cmd:p}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}]{col 26}{...} +display p-values instead of t-statistics + {cmd:ci}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}]{col 26}{...} +display confidence intervals instead of t-stat's + {cmd:aux(}{it:name} [{it:{help esttab##fmt:fmt}}]{cmd:)}{col 26}{...} +display contents of {cmd:e(}{it:name}{cmd:)} instead of t-stat's + [{ul:{cmd:no}}]{cmdab:con:stant}{col 26}{...} +do not/do report the intercept + + {help esttab##stars:Significance stars} + [{cmd:no}]{cmd:star}[{cmd:(}{it:list}{cmd:)}]{col 26}{...} +do not/do report significance stars + {cmd:staraux}{col 26}{...} +attach stars to t-stat's instead of point est's + + {help esttab##stat:Summary statistics} + {cmd:r2}|{cmd:ar2}|{cmd:pr2}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}]{col 26}{...} +display (adjusted, pseudo) R-squared + {cmd:aic}|{cmd:bic}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}]{col 26}{...} +display Akaike's or Schwarz's information crit. + {cmdab:sca:lars:(}{it:list}{cmd:)}{col 26}{...} +display any other scalars contained in {cmd:e()} + {cmd:sfmt(}{it:{help esttab##fmt:fmt}} [{it:...}]{cmd:)}{col 26}{...} +set format(s) for {cmd:scalars()} + {cmd:noobs}{col 26}{...} +do not display the number of observations + {cmd:obslast}{col 26}{...} +place the number of observations last + + {help esttab##layout:Layout} + {cmd:wide}{col 26}{...} +place point est's and t-stat's beside one another + {cmdab:one:cell}{col 26}{...} +combine point est's and t-stat's in a single cell + [{ul:{cmd:no}}]{cmdab:pa:rentheses}{col 26}{...} +do not/do print parentheses around t-statistics + {cmdab:br:ackets}{col 26}{...} +use brackets instead of parentheses + [{ul:{cmd:no}}]{cmdab:gap:s}{col 26}{...} +suppress/add vertical spacing + [{ul:{cmd:no}}]{cmdab:li:nes}{col 26}{...} +suppress/add horizontal lines + {cmdab:noeqli:nes}{col 26}{...} +suppress lines between equations + {cmd:compress}{col 26}{...} +reduce horizontal spacing + {cmd:plain}{col 26}{...} +produce a minimally formatted table + + {help esttab##label:Labeling} + {cmdab:l:abel}{col 26}{...} +make use of variable labels + {cmdab:interact:ion:(}{it:str}{cmd:)}{col 26}{...} +specify interaction operator + {cmdab:ti:tle:(}{it:string}{cmd:)}{col 26}{...} +specify a title for the table + {cmdab:mti:tles}[{cmd:(}{it:list}{cmd:)}]{col 26}{...} +specify model titles to appear in table header + {cmdab:nomti:tles}{col 26}{...} +disable model titles + [{ul:{cmd:no}}]{cmdab:dep:vars}{col 26}{...} +do not/do use dependent variables as model titles + [{ul:{cmd:no}}]{cmdab:num:bers}{col 26}{...} +do not/do print model numbers in table header + {cmdab:coef:labels:(}{it:list}{cmd:)}{col 26}{...} +specify labels for coefficients + [{ul:{cmd:no}}]{cmdab:note:s}{col 26}{...} +suppress/add notes in the table footer + {cmdab:addn:otes:(}{it:list}{cmd:)}{col 26}{...} +add lines at the end of the table + + {help esttab##format:Document format} + {cmd:smcl} | {cmdab:fix:ed} | {cmd:tab} | {cmd:csv} | {cmdab:sc:sv} | {cmd:rtf} | {cmdab:htm:l} | {cmd:tex} | {cmdab:bookt:abs} | {cmdab:md} + {col 26}{...} +set the document format ({cmd:smcl} is the default) + {cmdab:f:ragment}{col 26}{...} +suppress table opening and closing (LaTeX, HTML) + [{cmd:no}]{cmd:float}{col 26}{...} +whether to use a float environment or not (LaTeX) + {cmd:page}[{cmd:(}{it:packages}{cmd:)}]{col 26}{...} +add page opening and closing (LaTeX, HTML) + {cmdab:stand:alone}[{cmd:(}{it:opts}{cmd:)}]{col 26}{...} +use class {cmd:standalone} rather than {cmd:article} (LaTeX) + {cmdab:align:ment(}{it:string}{cmd:)}{col 26}{...} +set alignment within columns (LaTeX, HTML, RTF) + {cmdab:width(}{it:string}{cmd:)}{col 26}{...} +set width of table (LaTeX, HTML) + {cmdab:long:table}{col 26}{...} +multi-page table (LaTeX) + {cmd:fonttbl(}{it:string}{cmd:)}{col 26}{...} +set custom font table (RTF) + {cmd:nortfencode}{col 26}{...} +do not escape non-ASCII characters (RTF) + + {help esttab##output:Output} + {cmdab:r:eplace}{col 26}{...} +overwrite an existing file + {cmdab:a:ppend}{col 26}{...} +append the output to an existing file + {cmdab:ty:pe}{col 26}{...} +force printing the table in the results window + {cmdab:n:oisily}{col 26}{...} +display the executed {helpb estout} command + + {help esttab##advanced:Advanced} + {cmdab:d:rop:(}{it:list}{cmd:)}{col 26}{...} +drop individual coefficients + {cmdab:noomit:ted}{col 26}{...} +drop omitted coefficients + {cmdab:nobase:levels}{col 26}{...} +drop base levels of factor variables + {cmdab:k:eep:(}{it:list}{cmd:)}{col 26}{...} +keep individual coefficients + {cmdab:o:rder:(}{it:list}{cmd:)}{col 26}{...} +change order of coefficients + {cmdab:eq:uations:(}{it:list}{cmd:)}{col 26}{...} +match the models' equations + {cmd:eform}{col 26}{...} +report exponentiated coefficients + {cmdab:uns:tack}{col 26}{...} +place multiple equations in separate columns + {it:estout_options}{col 26}{...} +any other {helpb estout} options + {hline 70} + +{marker des} +{title:Description} + +{p 4 4 2} +{cmd:esttab} is a wrapper for {helpb estout}. It produces a +pretty-looking publication-style regression table from stored +estimates without much typing. The compiled table is displayed in the +Stata results window or, optionally, written to a text file specified +by {cmd:using} {it:filename}. If {it:filename} is specified without +suffix, a default suffix is added depending on the specified document +format (".smcl" for {cmd:smcl}, ".txt" for {cmd:fixed} and {cmd:tab}, ".csv" for {cmd:csv} +and {cmd:scsv}, ".rtf" for {cmd:rft}, ".html" for {cmd:html}, +".tex" for {cmd:tex} and {cmd:booktabs}, ".md" for {cmd:md}). + +{p 4 4 2} +{it:namelist} provides the names of the stored estimation sets to be +tabulated. You may use the {cmd:*} and {cmd:?} wildcards in +{it:namelist}. If {it:namelist} is omitted, {cmd:esttab} tabulates the +estimation sets stored by {cmd:eststo} (see help {helpb eststo}) +or, if no such estimates are present, the currently active +estimates (i.e. the model fit last). + +{p 4 4 2} +See help {helpb estimates} for information about storing estimation +results. An alternative to the {cmd:estimates store} command is +provided by {helpb eststo}. + +{p 4 4 2} +{cmd:esttab} can also be used to tabulate a Stata matrix applying syntax +{bind:{cmd:esttab} {cmdab:m:atrix:(}{it:name}{cmd:)}}, where {it:name} +is the name of the matrix. Furthermore, an {cmd:e()}-matrix or {cmd:r()}-matrix +can be tabulated specifying {cmd:esttab e(}{it:name}{cmd:)} or +{cmd:esttab r(}{it:name}{cmd:)}. Most options under the headings +'Main', 'Significance stars', and 'Summary statistics' are irrelevant +in this case. See help {helpb estout} for further details on tabulating matrices. + +{marker opt} +{title:Options} +{marker main} +{dlgtab:Main} + +{p 4 8 2} +{cmd:b(}{it:{help esttab##fmt:fmt}}{cmd:)} sets the numerical display format +for the point estimates. The default format is {cmd:a3}. (See +{help esttab##fmt:Numerical formats} below for details on available +formats.) + +{p 4 8 2} +{cmd:beta}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] requests that +standardized beta coefficients be displayed in place of the raw point +estimates and, optionally, sets the display format (the default is to +print three decimal places). Note that {cmd:beta} causes the +intercept to be dropped from the table (unless {cmd:constant} is +specified).{p_end} +{marker main} +{p 4 8 2} +{cmd:main(}{it:name} [{it:{help esttab##fmt:fmt}}]{cmd:)} requests that +the statistics stored in {cmd:e(}{it:name}{cmd:)} be displayed in +place of the point estimates and, optionally, sets the display format +(the default is to use the display format for point estimates). For +example, {cmd:e(}{it:name}{cmd:)} may contain statistics added by +{cmd:estadd} (see help {helpb estadd}). + +{p 4 8 2} +{cmd:t(}{it:{help esttab##fmt:fmt}}{cmd:)} sets the display format for +t-statistics. The default is to display two decimal places. + +{p 4 8 2} +{cmd:abs} causes absolute values of t-statistics to be reported. + +{p 4 8 2} +{cmd:not} suppresses the printing of t-statistics. + +{p 4 8 2} +{cmd:z}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] requests that +z-statistics be displayed. z-statistics are the same as t-statistics. Hence, +specifying {cmd:z} does not change the table contents, it only changes the +label. + +{p 4 8 2} +{cmd:se}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] requests that +standard errors be displayed in place of t-statistics and, +optionally, sets the display format (the default is to use the +display format for point estimates). + +{p 4 8 2} +{cmd:p}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] requests that +p-values be displayed in place of t-statistics and, optionally, sets +the display format (the default is to print three decimal places) + +{p 4 8 2} +{cmd:ci}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] requests that +confidence intervals be displayed in place of t-statistics and, +optionally, sets the display format (the default is to use the +display format for point estimates). {cmd:level(}{it:#}{cmd:)} +assigns the confidence level, in percent. The default is +{cmd:level(95)} or as set by {helpb set level}.{p_end} +{marker aux} +{p 4 8 2} +{cmd:aux(}{it:name} [{it:{help esttab##fmt:fmt}}]{cmd:)} requests that +the statistics stored in {cmd:e(}{it:name}{cmd:)} be displayed in +place of t-statistics and, optionally, sets the display format (the +default is to use the display format for point estimates). For +example, {cmd:e(}{it:name}{cmd:)} may contain statistics added by +{cmd:estadd} (see help {helpb estadd}, if installed). + +{p 4 8 2} +{cmd:noconstant} causes the intercept be dropped from the table. +Specify {cmd:constant} to include the constant in situations where it +is dropped by default. + +{marker stars} +{dlgtab:Significance stars} + +{p 4 8 2} +{cmd:star}[{cmd:(}{it:symbol} {it:level} [{it:...}]{cmd:)}] causes +stars denoting the significance of the coefficients to be printed +next to the point estimates. This is the default. Type {cmd:nostar} +to suppress the stars. The default symbols and thresholds are: +{cmd:*} for p<.05, {cmd:**} for p<.01, and {cmd:***} for p<.001. +Alternatively, for example, type {bind:{cmd:star(+ 0.10 * 0.05)}} to +set the following thresholds: {cmd:+} for p<.10 and {cmd:*} for +p<.05. Note that the thresholds must lie in the (0,1] interval and +must be specified in descending order. + +{p 4 8 2} +{cmd:staraux} causes the significance stars be printed next to the +t-statistics (or standard errors, etc.) instead of the point estimates. + +{marker stat} +{dlgtab:Summary statistics} + +{p 4 8 2} +{cmd:r2}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}], +{cmd:ar2}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}], and +{cmd:pr2}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] +include the R-squared, the adjusted R-squared, and the +pseudo-R-squared in the table footer and, optionally, set the +corresponding display formats (the default is to display three +decimal places). + +{p 4 8 2} +{cmd:aic}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] and +{cmd:bic}[{cmd:(}{it:{help esttab##fmt:fmt}}{cmd:)}] +include Akaike's and Schwarz's information criterion in the table +footer and, optionally, set the corresponding display formats (the +default is to use the display format for point estimates).{p_end} +{marker scalars} +{p 4 8 2} +{cmd:scalars(}{it:list}{cmd:)} may be used to add other +{cmd:e()}-scalars to the table footer (type {cmd:ereturn list} to +display a list of available {cmd:e()}-scalars after fitting a model; +see help {helpb ereturn}). For example, {cmd:scalars(df_m)} would +report the model degrees of freedom for each model. {it:list} may be +a simple list of names of {cmd:e()}-scalars, e.g. + + {com}. esttab, scalars(ll_0 ll chi2){txt} + +{p 8 8 2} +or, alternatively, a list of quoted name-label pairs, e.g. + + {com}. esttab, scalars({bind:"ll Log lik."} {bind:"chi2 Chi-squared"}){txt} + +{p 4 8 2} +{cmd:sfmt(}{it:{help esttab##fmt:fmt}} [{it:...}]{cmd:)} sets the +display format(s) for the statistics specified in {cmd:scalars()} +(the default is to use the display format for point estimates). If +{cmd:sfmt()} contains less elements than {cmd:scalars()}, the last +specified format is used for the remaining scalars. That is, only one +format needs to be specified if the same format be used for all +scalars. + +{p 4 8 2} +{cmd:noobs} suppresses displaying information on the number of +observations. The default is to report the number of observations for +each model in the table footer. + +{p 4 8 2} +{cmd:obslast} displays the number of observations in the last row of +the table footer. The default is to use the first row. + +{marker layout} +{dlgtab:Layout} +{marker wide} +{p 4 8 2} +{cmd:wide} causes point estimates and t-statistics (or standard errors, +etc.) to be printed beside one another instead of beneath one another. +{p_end} +{marker onecell} +{p 4 8 2} +{cmd:onecell} causes point estimates and t-statistics (or standard errors, +etc.) to be combined in a single table cell. This option is useful primarily +in {cmd:rtf} or {cmd:html} mode. In these modes a line break is +inserted between the two statistics. The benefit from using {cmd:onecell} +in {cmd:rtf} or {cmd:html} mode is that long coefficients labels do not +derange the table layout. The default for other modes is to insert +a blank between the statistics. Use {cmd:estout}'s +{helpb estout##incelldel:incelldelimiter()} option to change this. + +{p 4 8 2} +{cmd:parentheses} encloses t-statistics (or standard errors, etc.) in +parentheses. This is the default. Specify {cmd:noparentheses} to +suppress the parentheses. + +{p 4 8 2} +{cmd:brackets} uses square brackets, [], instead of parentheses. Note +that brackets are the default for confidence intervals. + +{p 4 8 2} +{cmd:gaps} adds empty rows (or, more generally, additional vertical +space) between coefficients to increase readability (empty rows are +also inserted between the table's header, body, and footer, unless +{cmd:lines} is activated). This is the default unless {cmd:wide} or +{cmd:not} is specified. Type {cmd:nogaps} to suppress the extra +spacing. + +{p 4 8 2} +{cmd:lines} adds horizontal lines to the table separating the table's +header, body, and footer and, in the case of multiple +equation models, the equations. This is the default. Specify {cmd:nolines} +to suppress the lines. Lines are always suppressed in the {cmd:tab} +and {cmd:csv} modes. + +{p 4 8 2} +{cmd:noeqlines} suppresses the horizontal lines between equations +in the case of multiple equation models.{p_end} +{marker compress} +{p 4 8 2} +{cmd:compress} reduces the amount of horizontal spacing (so that more +models fit on screen without line breaking). The option has no effect +in the {cmd:tab} and {cmd:csv} modes. Furthermore, note that in the +TeX and HTML modes the {cmd:compress} option only changes the +arrangement the table's code, but not the look of the compiled +end-product. In {cmd:rtf}, however, {cmd:compress} changes the look +of the formatted table.{p_end} +{marker plain} +{p 4 8 2} +{cmd:plain} produces a minimally formatted table. It is a shorthand +to specifying {cmd:nostar}, {cmd:nodepvars}, {cmd:nonumbers}, +{cmd:noparentheses}, {cmd:nogaps}, {cmd:nolines} and {cmd:nonotes} +and setting all formats to {cmd:%9.0g}. Note that the disabled +options can be switched on again. For example, type + + {com}. esttab, plain star{txt} + +{p 8 8 2} +to produce a plain table including significance stars. + +{marker label} +{dlgtab:Labeling} + +{p 4 8 2} +{cmd:label} specifies that variable labels be used instead of +variable names (and estimation set titles be used instead of +estimation set names). Furthermore, {cmd:label} prints "Constant" +instead of "_cons". + +{p 4 8 2} +{cmd:interaction(}{it:string}{cmd:)} specifies the string to be used +as delimiter for interaction terms (only relevant in Stata 11 or newer). The +default is {cmd:interaction(" # ")}. For {cmd:tex} and {cmd:booktabs} the +default is {cmd:interaction(" $\times$ ")}. +{p_end} +{marker title} +{p 4 8 2} +{cmd:title(}{it:string}{cmd:)} may be used to provide a title for the +table. If specified, {it:string} is printed at the top of the table. +Note that specifying a title causes the table to be set up as a +floating object in LaTeX mode (unless the {cmd:nofloat} option +is specified). You may want to set a label for +referencing in this case. For example, if you type +{cmd:title(...\label{tab1})}, then "\ref{tab1}" could be used in the +LaTeX document to point to the table. + +{p 4 8 2} +{cmd:mtitles}, without argument, specifies that for each model the title +(or, if empty, the name) of the stored estimation set be printed as the model's +title in the table header. If {cmd:mtitles} is omitted, the default is to +use name or label of the dependent variable as the model's title (see the +{cmd:depvar} option). Alternatively, use {cmd:mtitles(}{it:list}{cmd:)} +specifies a list of model titles. Enclose the titles +in double quotes if they contain spaces, +e.g. {bind:{cmd:mtitles("Model 1" "Model 2")}}. + +{p 4 8 2} +{cmd:nomtitles} suppresses printing of model titles. + +{p 4 8 2} +{cmd:depvars} prints the name (or label) of the (first) dependent +variable of a model as the model's title in the table header. This is +the default. Specify {cmd:nodepvars} to use the names of +the stored estimation sets as titles. + +{p 4 8 2} +{cmd:numbers} includes a row containing consecutive model numbers in +the table header. This is the default. Specify {cmd:nonumbers} to +suppress printing the model numbers. + +{p 4 8 2} +{cmd:coeflabels(}{it:name} {it:label} [...]{cmd:)} specifies labels +for the coefficients. Specify names and labels in pairs and, if +necessary, enclose labels in double quotes, +e.g. {cmd:coeflabels(mpg Milage rep78 {bind:"Repair Record"})}. + +{p 4 8 2} +{cmd:notes} prints notes at the end of the table explaining the +significance symbols and the type of displayed statistics. This is +the default. Specify {cmd:nonotes} to suppress the notes. + +{p 4 8 2} +{cmd:addnotes(}{it:list}{cmd:)} may be used to add further lines of +text at the bottom of the table. Lines containing blanks must be +enclosed in double quotes, +e.g. {cmd:addnotes({bind:"Line 1"} {bind:"Line 2"})}. + +{marker format} +{dlgtab:Document format} + +{p 4 8 2} +{cmd:smcl}, {cmd:fixed}, {cmd:tab}, {cmd:csv}, {cmd:scsv}, {cmd:rtf}, +{cmd:html}, {cmd:tex}, {cmd:booktabs}, and {cmd:md} choose the table's basic +output format. The default format is {cmd:smcl} unless +{cmd:using} is specified, in which case the default format +depends on the filename's suffix ({cmd:smcl} for ".smcl", {cmd:csv} +for ".csv", {cmd:rtf} for ".rtf", +{cmd:html} for ".htm" or ".html", {cmd:tex} for ".tex", {cmd:md} for ".md" or ".mmd", +and {cmd:fixed} for all other filenames). To override the default behavior, specify one of the +following format options. + +{p 8 8 2} +{cmd:smcl} produces a {help SMCL} formatted table to be displayed in the +Stata results window or the Stata viewer. + +{p 8 8 2} +{cmd:fixed} produces a fixed-format ASCII table. This is suitable, +for example, if the table be displayed in a text editor. + +{p 8 8 2} +{cmd:tab} produces a tab-delimited ASCII table. +{p_end} +{marker csv} +{p 8 8 2} +{cmd:csv} produces a CSV ({ul:C}omma {ul:S}eparated {ul:V}alue +format) table for use with Microsoft Excel. Delimiter is a comma. In +order to prevent Excel from interpreting the contents of the table +cells, they are enclosed double quotes preceded by an equal sign +(i.e. ="..."). However, if the {cmd:plain} option is specified, the +table cells are enclosed in double quotes without the leading equal +sign. The first method is appropriate if you want to preserve the +table's formatting. The second method is appropriate if you want to +use the table's contents for further computations in Excel. +{p_end} +{marker scsv} +{p 8 8 2} +{cmd:scsv} is a variant on the CSV format that uses a semicolon as +the delimiter. This is appropriate for some non-English versions of +Excel (e.g. the German version). +{p_end} +{marker rtf} +{p 8 8 2} +{cmd:rtf} produces a Rich Text Format table for use with word +processors. + +{p 8 8 2} +{cmd:html} produces a simple HTML formatted table. + +{p 8 8 2} +{cmd:tex} produces a LaTeX formatted table. +{p_end} +{marker booktabs} +{p 8 8 2} +{cmd:booktabs} produces a LaTeX formatted table for use with LaTeX's +{it:booktabs} package. + +{p 8 8 2} +{cmd:md} produces a Markdown formatted table. Native +{browse "http://daringfireball.net/projects/markdown/":Markdown} has no specific +support for tables, but for example {browse "http://github.github.com/gfm/":GitHub Flavored Markdown} +and {browse "http://fletcherpenney.net/multimarkdown/":MultiMarkdown} do. Option {cmd:mmd} +can be used as a synonym for {cmd:md} (the default file suffix will be ".mmd" in this case). +{p_end} +{marker fragment} +{p 4 8 2} +{cmd:fragment} causes the table's opening and closing specifications +to be suppressed. This is relevant primarily in LaTeX and HTML mode. + +{p 4 8 2} +{cmd:float} causes the table to be set up as a floating object in LaTeX mode +(table environment). Providing a {cmd:title()} implies {cmd:float}. Specify +{cmd:nofloat} to omit the float environment in this case (this is useful, e.g., +for LyX users). + +{p 4 8 2} +{cmd:page}[{cmd:(}{it:packages}{cmd:)}] adds opening and closing code +to define a whole LaTeX or HTML document. The default is to produce a +raw table that can then be included into an existing LaTeX or HTML +document. Specifying {it:packages} in parentheses causes +{cmd:\usepackage{c -(}}{it:packages}{cmd:{c )-}} to be added to the +preamble of the LaTeX document (note that the {it:booktabs} package +is automatically loaded if {cmd:booktabs} is specified). + +{p 4 8 2} +{cmd:standalone}[{cmd:(}{it:opts}{cmd:)}] implies {cmd:page} +and uses {cmd:\documentclass[}{it:opts}{cmd:]{c -(}standlone{c )-}} +instead of {cmd:\documentclass{c -(}article{c )-}} in the LaTeX header (see +{browse "http://ctan.org/pkg/standalone"}). The default for {it:opts} +is {cmd:varwidth}; type {cmd:standalone("")} to suppress {cmd:[}{it:opts}{cmd:]}. + +{p 4 8 2} +{cmd:alignment(}{it:string}{cmd:)} may be used to specify the +alignment of the models' columns in LaTeX, HTML, or RTF mode. + +{p 8 8 2} +In LaTeX mode {it:string} should be a LaTeX column specifier. The +default is to center the columns. To produce right-aligned columns, +for example, type {cmd:alignment(r)}. If the table contains multiple +columns per model/equation, the alignment specification should define +all columns. For example, if the {cmd:wide} option is specified, you +could type {cmd:alignment(cr)} to, say, center the point estimates +and right-align the t-statistics. Note that more sophisticated column +definitions are often needed to produce appealing results. In +particular, LaTeX's {it:dcolumn} package proves useful to align +columns on the decimal point. + +{p 8 8 2} +In HTML mode {it:string} should be a HTML alignment specifier. The +default is to omit alignment specification, which results in left +aligned columns. To center the columns in HTML, for example, specify +{cmd:alignment(center)}. Other than in LaTeX mode, the same alignment +is used for all columns if the table contains multiple columns per +model/equation in the HTML mode. + +{p 8 8 2} +In RTF mode {it:string} should be one of {cmd:l}, {cmd:c}, {cmd:r}, +and {cmd:j}. The default is to center the columns. To produce +right-aligned columns, for example, type {cmd:alignment(r)}. The same +alignment is used for all columns if the table contains multiple +columns per model/equation in the RTF mode. + +{p 8 8 2} +Note that {cmd:alignment()} does not change the alignment of the +variable names/labels in the left stub of the table. They are always +left-aligned. + +{p 4 8 2} +{cmd:width(}{it:string}{cmd:)} sets the overall width of the table in +LaTeX or HTML. {it:string} should be LaTeX or HTML literal. For +example, specify {cmd:width(\hsize)} in LaTeX or {cmd:width(100%)} in +HTML to span the whole page. The table columns will spread regularly +over the specified width. Note that in RTF mode {helpb estout}'s +{cmd:varwidth()} and {cmd:modelwidth()} options may be used to change +the width of the table columns. + +{p 4 8 2} +{cmdab:longtable} causes the {it:longtable} environment to be used in +LaTeX. Use {cmdab:longtable} for tables that are too +long to fit on a single page. {cmdab:longtable} cannot be combined +with {cmd:width()}. Make sure to load the {it:longtable} package +in the LaTeX document, i.e. include {cmd:\usepackage{longtable}} in the +document's preamble. + +{p 4 8 2} +{cmd:fonttbl(}{it:string}{cmd:)} defines a custom font table in RTF. The +default is "{cmd:\f0\fnil Times New Roman;}". For example, typing + + {com}. esttab using example.rtf, ti("\f1 The Auto Data") /// + fonttbl(\f0\fnil Times New Roman;\f1\fnil Arial;){txt} + +{p 8 8 2} +would add a title in Arial. + +{p 4 8 2} +{cmd:nortfencode} prevents the translation of non-ASCII characters in RTF +mode (a translated character is encoded as {cmd:\u}#{cmd:?}, where +# is the base 10 character code). This is only relevant in Stata 14 or newer; +no translation is applied in Stata 13 or older. + +{marker output} +{dlgtab:Output} + +{p 4 8 2} +{cmd:replace} permits {cmd:esttab} to overwrite an existing file. + +{p 4 8 2} +{cmd:append} specifies that the output be appended to an existing +file. It may be used even if the file does not yet exist. Specifying +{cmd:append} together with {cmd:page} in TeX or HTML mode causes the +new table to be inserted at the end of the body of an existing +document ({cmd:esttab} seeks a line reading "\end{document}" or +"", respectively, and starts appending from there; +contents after this line will be overwritten). In RTF mode, existing +documents are assumed to end with a line containing a single "}". + +{p 4 8 2} +{cmd:type} specifies that the assembled table be printed in the +results window and the log file. This is the default unless +{cmd:using} is specified. + +{p 4 8 2} +{cmd:noisily} displays the executed {helpb estout} command. + +{marker advanced} +{dlgtab:Advanced} + +{p 4 8 2} +{cmd:drop(}{it:droplist}{cmd:)} identifies the coefficients to be +dropped from the table. A {it:droplist} comprises one or more +specifications, separated by white space. A specification can be +either a parameter name (e.g. {cmd:price}), an equation name followed +by a colon (e.g. {cmd:mean:}), or a full name +(e.g. {cmd:mean:price}). You may use the {cmd:*} and {cmd:?} wildcards +in equation names and parameter names. Be sure to refer to the matched +equation names, and not to the original equation names in the models, +when using the {cmd:equations()} option to match equations. + +{p 4 8 2} +{cmd:noomitted} drops omitted coefficients (only relevant in Stata 11 or +newer). + +{p 4 8 2} +{cmd:nobaselevels} drops base levels of factor variables (only relevant +in Stata 11 or newer). + +{p 4 8 2} +{cmd:keep(}{it:keeplist}{cmd:)} selects the coefficients to be +included in the table. {it:keeplist} is specified analogous to +{it:droplist} in {cmd:drop()} (see above). + +{p 4 8 2} +{cmd:order(}{it:orderlist}{cmd:)} changes the order of the +coefficients and equations within the table. {it:orderlist} is +specified analogous to {it:droplist} in {cmd:drop()} (see above). +Coefficients and equations that do not appear in {it:orderlist} are +placed last (in their original order). + +{p 4 8 2} +{cmd:equations(}{it:eqmatchlist}{cmd:)} specifies how the models' +equations are to be matched. This option is passed to the internal +call of {cmd:estimates table}. See help {helpb estimates} on how to +specify this option. The most common usage is {cmd:equations(1)} to +match all the first equations in the models. + +{p 4 8 2} +{cmd:eform} displays the regression table in exponentiated form. The +exponent of a coefficient is displayed in lieu of the untransformed +coefficient; standard errors and confidence intervals are transformed +as well. Note that the intercept is dropped in eform-mode, unless +{cmd:constant} is specified. + +{p 4 8 2} +{cmd:unstack} specifies that the individual equations from +multiple-equation models (e.g. {cmd:mlogit}, {cmd:reg3}, +{cmd:heckman}) be placed in separate columns. The default is to place +the equations below one another in a single column. + +{p 4 8 2} +{it:estout_options} are any other {cmd:estout} options (see help +{helpb estout}). Note that {cmd:estout} options take precedence over +{cmd:esttab} options. For example, + +{p 8 20 2} +{cmd:cells()}{space 5}disables {cmd:b()}, {cmd:beta()}, {cmd:main()}, +{cmd:t()}, {cmd:abs}, {cmd:not}, {cmd:se()}, {cmd:p()}, {cmd:ci()}, +{cmd:aux()}, {cmd:star}, {cmd:staraux}, {cmd:wide}, {cmd:onecell}, +{cmd:parentheses}, and {cmd:brackets}, + +{p 8 20 2} +{cmd:stats()}{space 5}disables {cmd:r2()}, {cmd:ar2()}, {cmd:pr2()}, +{cmd:aic()}, {cmd:bic()}, {cmd:scalars()}, {cmd:sfmt()}, {cmd:noobs}, +and {cmd:obslast}. + +{p 8 8 2} +Other {cmd:estout} options that should be used with care are +{cmd:begin()}, {cmd:delimiter()}, {cmd:end()}, {cmd:prehead()}, +{cmd:posthead()}, {cmd:prefoot()}, {cmd:postfoot()}, {cmd:mlabels()}, +and {cmd:varlabels()}. Furthermore, note that {cmd:estout}'s {cmd:style()} +option does not have much effect because most options that would be affected +by {cmd:style()} are set explicitly by {cmd:esttab}. + +{marker fmt} +{dlgtab:Numerical formats} + +{p 4 4 2} +Numerical display formats may be specified in {cmd:esttab} as follows: + +{p 5 8 2} +1. Official Stata's display formats: You may specify formats, such as +{cmd:%9.0g} or {cmd:%8.2f}. See help {help format} for a list +of available formats. {cmd:%g} or {cmd:g} may be used as a +synonym for {cmd:%9.0g}. + +{p 5 8 2} +2. Fixed format: You may specify an integer value such as {cmd:0}, +{cmd:1}, {cmd:2}, etc. to request a display format with a fixed number +of decimal places. For example, {cmd:t(3)} would display t-statistics +with three decimal places. + +{p 5 8 2} +3. Automatic format: You may specify {cmd:a1}, {cmd:a2}, ..., or +{cmd:a9} to cause {cmd:esttab} to choose a reasonable display format for +each number depending on the number's value. {cmd:a} may be used as a +synonym for {cmd:a3}. The {it:#} in +{cmd:a}{it:#} determines the minimum precision according to the +following rules: + +{p 10 12 2} +o Absolute numbers smaller than 1 are displayed with {it:#} +significant decimal places (i.e. with {it:#} decimal places ignoring +any leading zeros after the decimal point). For example, +{cmd:0.00123456} is displayed as {cmd:0.00123} if the format is +{cmd:a3}. + +{p 10 12 2} +o Absolute numbers greater than 1 are displayed with as many digits +required to retain at least one decimal place and are displayed with +a minimum of ({it:#} + 1) digits. For example, if the format is +{cmd:a3}, {cmd:1.23456} is displayed as {cmd:1.235}, {cmd:12.3456} is +displayed as {cmd:12.35}, and {cmd:1234.56} is displayed as +{cmd:1234.6}. + +{p 10 12 2} +o In any case, integers are displayed with zero decimal places, and +very large or very small absolute numbers are displayed in +exponential format. + +{marker exa} +{title:Examples} + +{p 4 4 2} +The following examples are intended to illustrate the basic usage of +{cmd:esttab}. Additional examples can be found at +{browse "http://repec.sowi.unibe.ch/stata/estout/"}. + +{p 4 4 2} The procedure is to first fit and store some models (see {helpb eststo}) and then apply +{cmd:esttab} to these stored estimates: + + {com}. eststo clear + {txt} + {com}. sysuse auto + {txt}(1978 Automobile Data) + + {com}. eststo: quietly regress price weight mpg + {txt}({res}est1{txt} stored) + + {com}. eststo: quietly regress price weight mpg foreign + {txt}({res}est2{txt} stored) + + {com}. esttab, ar2 + {res} + {txt}{hline 44} + {txt} (1) (2) + {txt} price price + {txt}{hline 44} + {txt}weight {res} 1.747** 3.465***{txt} + {res} {ralign 12:{txt:(}2.72{txt:)}} {ralign 12:{txt:(}5.49{txt:)}} {txt} + + {txt}mpg {res} -49.51 21.85 {txt} + {res} {ralign 12:{txt:(}-0.57{txt:)}} {ralign 12:{txt:(}0.29{txt:)}} {txt} + + {txt}foreign {res} 3673.1***{txt} + {res} {ralign 12:{txt:(}5.37{txt:)}} {txt} + + {txt}_cons {res} 1946.1 -5853.7 {txt} + {res} {ralign 12:{txt:(}0.54{txt:)}} {ralign 12:{txt:(}-1.73{txt:)}} {txt} + {txt}{hline 44} + {txt}N {res} 74 74 {txt} + {txt}adj. R-sq {res} 0.273 0.478 {txt} + {txt}{hline 44} + {txt}t statistics in parentheses + {txt}* p<0.05, ** p<0.01, *** p<0.001 + + +{p 4 4 2} +The same table using labels: + + {com}. esttab, ar2 label + {res} + {txt}{hline 52} + {txt} (1) (2) + {txt} Price Price + {txt}{hline 52} + {txt}Weight (lbs.) {res} 1.747** 3.465***{txt} + {res} {ralign 12:{txt:(}2.72{txt:)}} {ralign 12:{txt:(}5.49{txt:)}} {txt} + + {txt}Mileage (mpg) {res} -49.51 21.85 {txt} + {res} {ralign 12:{txt:(}-0.57{txt:)}} {ralign 12:{txt:(}0.29{txt:)}} {txt} + + {txt}Car type {res} 3673.1***{txt} + {res} {ralign 12:{txt:(}5.37{txt:)}} {txt} + + {txt}Constant {res} 1946.1 -5853.7 {txt} + {res} {ralign 12:{txt:(}0.54{txt:)}} {ralign 12:{txt:(}-1.73{txt:)}} {txt} + {txt}{hline 52} + {txt}Observations {res} 74 74 {txt} + {txt}Adjusted R-squared {res} 0.273 0.478 {txt} + {txt}{hline 52} + {txt}t statistics in parentheses + {txt}* p<0.05, ** p<0.01, *** p<0.001 + + +{p 4 4 2} +Plain table: + + {com}. esttab, ar2 plain + {res} + {txt} est1 est2 + {txt} b/t b/t + {txt}weight {res} 1.746559 3.464706{txt} + {res} 2.723238 5.493003{txt} + {txt}mpg {res} -49.51222 21.8536{txt} + {res} -.5746808 .2944391{txt} + {txt}foreign {res} 3673.06{txt} + {res} 5.370142{txt} + {txt}_cons {res} 1946.069 -5853.696{txt} + {res} .541018 -1.733408{txt} + {txt}N {res} 74 74{txt} + {txt}adj. R-sq {res} .2734846 .4781119{txt} + + +{p 4 4 2} +Using standard errors in brackets and suppress significance stars: + + {com}. esttab, se nostar brackets + {res} + {txt}{hline 38} + {txt} (1) (2) + {txt} price price + {txt}{hline 38} + {txt}weight {res} 1.747 3.465{txt} + {res} {ralign 12:{txt:[}0.641{txt:]}} {ralign 12:{txt:[}0.631{txt:]}}{txt} + + {txt}mpg {res} -49.51 21.85{txt} + {res} {ralign 12:{txt:[}86.16{txt:]}} {ralign 12:{txt:[}74.22{txt:]}}{txt} + + {txt}foreign {res} 3673.1{txt} + {res} {ralign 12:{txt:[}684.0{txt:]}}{txt} + + {txt}_cons {res} 1946.1 -5853.7{txt} + {res} {ralign 12:{txt:[}3597.0{txt:]}} {ralign 12:{txt:[}3377.0{txt:]}}{txt} + {txt}{hline 38} + {txt}N {res} 74 74{txt} + {txt}{hline 38} + {txt}Standard errors in brackets + + +{p 4 4 2} +Printing beta coefficients: + + {com}. esttab, beta + {res} + {txt}{hline 44} + {txt} (1) (2) + {txt} price price + {txt}{hline 44} + {txt}weight {res} 0.460** 0.913***{txt} + {res} {ralign 12:{txt:(}2.72{txt:)}} {ralign 12:{txt:(}5.49{txt:)}} {txt} + + {txt}mpg {res} -0.097 0.043 {txt} + {res} {ralign 12:{txt:(}-0.57{txt:)}} {ralign 12:{txt:(}0.29{txt:)}} {txt} + + {txt}foreign {res} 0.573***{txt} + {res} {ralign 12:{txt:(}5.37{txt:)}} {txt} + {txt}{hline 44} + {txt}N {res} 74 74 {txt} + {txt}{hline 44} + {txt}Standardized beta coefficients; t statistics in parentheses + {txt}* p<0.05, ** p<0.01, *** p<0.001 + +{marker aut} +{title:Author} + +{p 4 4 2} +Ben Jann, Institute of Sociology, University of Bern, jann@soz.unibe.ch + +{marker als} +{title:Also see} + + Manual: {hi:[R] estimates} + +{p 4 13 2}Online: help for + {helpb estimates}, + {help estcom}, + {helpb estout}, + {helpb eststo}, + {helpb estadd}, + {helpb estpost} +{p_end} diff --git a/data/ado/g/grc1leg.ado b/data/ado/g/grc1leg.ado new file mode 100644 index 0000000..eed6c4a --- /dev/null +++ b/data/ado/g/grc1leg.ado @@ -0,0 +1,118 @@ +*! version 1.0.5 02jun2010 +program grc1leg + + syntax [anything] [, LEGendfrom(string) /// + POSition(string) RING(integer -1) SPAN /// + NAME(passthru) SAVing(string asis) * ] + + gr_setscheme , refscheme // So we can have temporary styles + + // location and alignment in cell + tempname clockpos + if ("`position'" == "") local position 6 + .`clockpos' = .clockdir.new , style(`position') + local location `.`clockpos'.relative_position' + + if `ring' > -1 { + if (`ring' == 0) { + local location "on" + local ring "" + } + else local ring "ring(`ring')" + } + else local ring "" + + if "`span'" != "" { + if "`location'" == "above" | "`location'" == "below" { + local span spancols(all) + } + else local span spanrows(all) + } + + // allow legend to be from any graph + if "`legendfrom'" != "" { + local lfrom : list posof "`legendfrom'" in anything + if `lfrom' == 0 { + di as error `"`legend_from' not found in graph name list"' + exit 198 + } + } + else local lfrom 1 // use graph 1 for legend by default + + + graph combine `anything' , `options' `name' nodraw // combine graphs + + + if "`name'" != "" { // get graph name + local 0 `", `name'"' + syntax [, name(string) ] + local 0 `"`name'"' + syntax [anything(name=name)] [, replace] + } + else local name Graph + + forvalues i = 1/`:list sizeof anything' { // turn off legends + _gm_edit .`name'.graphs[`i'].legend.draw_view.set_false + _gm_edit .`name'.graphs[`i'].legend.fill_if_undrawn.set_false + } + + + // insert overall legend + .`name'.insert (legend = .`name'.graphs[`lfrom'].legend) /// + `location' plotregion1 , `ring' `span' + _gm_log .`name'.insert (legend = .graphs[`lfrom'].legend) /// + `location' plotregion1 , `ring' `span' + + _gm_edit .`name'.legend.style.box_alignment.setstyle , /// + style(`.`clockpos'.compass2style') + _gm_edit .`name'.legend.draw_view.set_true + + // hack to maintain serset reference counts + // must pick up sersets by reference, they were + // -.copy-ied when the legend was created above + forvalues i = 1/`.`name'.legend.keys.arrnels' { + if "`.`name'.legend.keys[`i'].view.serset.isa'" != "" { + _gm_edit .`name'.legend.keys[`i'].view.serset.ref_n + 99 + + .`name'.legend.keys[`i'].view.serset.ref = /// + .`name'.graphs[`lfrom'].legend.keys[`i'].view.serset.ref + _gm_log .`name'.legend.keys[`i'].view.serset.ref = /// + .graphs[`lfrom'].legend.keys[`i'].view.serset.ref + } + if "`.`name'.legend.plotregion1.key[`i'].view.serset.isa'" != "" { + _gm_edit /// + .`name'.legend.plotregion1.key[`i'].view.serset.ref_n + 99 + + .`name'.legend.plotregion1.key[`i'].view.serset.ref = /// + .`name'.graphs[`lfrom'].legend.keys[`i'].view.serset.ref + _gm_log /// + .`name'.legend.plotregion1.key[`i'].view.serset.ref = /// + .graphs[`lfrom'].legend.keys[`i'].view.serset.ref + } + } + + gr draw `name' // redraw graph + + if `"`saving'"' != `""' { + gr_save `"`name'"' `saving' + } + + +end + + +program GetPos + gettoken pmac 0 : 0 + gettoken colon 0 : 0 + + local 0 `0' + if `"`0'"' == `""' { + c_local `pmac' below + exit + } + + local 0 ", `0'" + syntax [ , Above Below Leftof Rightof ] + + c_local `pmac' `above' `below' `leftof' `rightof' +end diff --git a/data/ado/g/grc1leg.hlp b/data/ado/g/grc1leg.hlp new file mode 100644 index 0000000..67a14b9 --- /dev/null +++ b/data/ado/g/grc1leg.hlp @@ -0,0 +1,138 @@ +{smcl} +{* 20dec2002}{...} +{hline} +help for {hi:grc1leg}{right:personal distribution} +{hline} + +{title:Combine multiple graphs into one with a single common legend} + +{p 8 23} +{cmd:grc1leg} +{it:name} +[{it:name} ...] +[{cmd:,} +{it:{help graph_combine:combine_options}} +{it:legend_options} +] + +{p 4 4 2} +where {it:name} is + + {it:name}{col 40}description + {hline 65} + {it:simplename}{...} +{col 40}name of graph in memory + {it:name}{cmd:.gph}{...} +{col 40}name of graph stored on disk + {cmd:"}{it:name}{cmd:"}{...} +{col 40}name of graph stored on disk + {hline 65} + See {help graph_combine} for full details on syntax and options. + +{p 4 4 2} +and where {it:legend_options} are + + {it:legend_options}{col 40}description + {hline 69} +{col 9}{...} +{col 9}{...} +{cmdab:leg:endfrom:(}{it:name}{cmd:)}{...} +{col 40}graph from which to take legend +{...} +{col 9}{...} +{cmdab:pos:ition:(}{it:{help clockpos}}{cmd:)}{...} +{col 40}where legend appears +{...} +{col 9}{...} +{cmd:ring(}{it:{help ringpos}}{cmd:)}{...} +{col 40}where legend appears (detail) +{...} +{col 9}{...} +{cmd:span}{...} +{col 40}"centering" of legend + {hline 69} +{p 8 8 2} +See +{hi:Where legends appear} under {hi:Remarks} below and see +{hi:Positioning of titles} in help +{it:{help title_options}} +for definitions of {it:clockpos} and {it:ringpos}. + + +{title:Description} + +{p 4 4 2} +{cmd:graph} {cmd:combine} arrays separately drawn graphs into one graph and +shows a single common legend taken from one of the graphs. + + +{title:Options} + +{p 4 8 2} +{cmd:legendfrom(}{it:name}{cmd:)} specifies the graph from which the legend for + the combined graphs is to be taken, the default is the first graph in the + list. The argument {it:name} must match one of the names from the list of + graph names specified. + +{p 4 8 2} +{cmd:position(}{it:clockpos}{cmd:)} and +{cmd:ring(}{it:ringpos}{cmd:)} + override the default location of the legend, which is usually centered + below the plot region. {cmd:position()} specifies a direction {it:(sic)} + according to the hours on the dial of a 12-hour clock, and {cmd:ring()} + specifies the distance from the plot region. + +{p 8 8 2} + {cmd:ring(0)} is defined as being inside the plot region itself and allows you + to place the legend inside the plot. {cmd:ring(}{it:k}{cmd:)}, {it:k}>0, + specifies positions outside the plot region; the larger the {cmd:ring()} + value, the farther away from the plot region is the legend. {cmd:ring()} + values may be integers or nonintegers and are treated ordinally. + +{p 8 8 2} + {cmd:position(12)} puts the legend directly above the plot region + (assuming {cmd:ring()}>0), {cmd:position(3)} directly to the right + of the plot region, and so on. + +{p 8 8 2} + See + {hi:Where legends appear} under {hi:Remarks} below and see + {hi:Positioning of titles} in + {it:{help title_options}} for more information on + the {cmd:position()} and {cmd:ring()} suboptions. + +{p 4 8 2} +{cmd:span} specifies that the legend is to be placed in an area spanning the + entire width (or height) of the graph rather than an area spanning the + plot region. + This affects whether the legend is centered with respect to the plot + region or the entire graph. + See {hi:Spanning} in + {it:{help title_options}} for more information on {cmd:span}. + +{p 4 8 2} +{it:combine_options} specify how the graphs are combined, titling the combined + graphs, and other common graph options. See + {help graph_combine} for details. + + +{title:Remarks} + + +{p 4 4 2} +{cmd:grc1leg} is the same as {cmd:graph combine} except that it displays a +single common legend for all of the combined graphs. This legend is one of +the legends from the graphs being combined, . Otherwise, {cmd:grc1leg} is +exactly like {cmd:graph combine}, see {help graph_combine} for further +remarks. + +{title:Also see} + +{p 4 13 2} +Online: help for +{help graph_combine}; +{help graph_use}; +{help graph_save}, +{it:{help saving_option}}; +{help gph_files} +{p_end} diff --git a/data/ado/i/ivreg2.ado b/data/ado/i/ivreg2.ado new file mode 100644 index 0000000..9aa223d --- /dev/null +++ b/data/ado/i/ivreg2.ado @@ -0,0 +1,6815 @@ +*! ivreg2 4.1.12 14aug2024 +*! authors cfb & mes +*! see end of file for version comments + +* Variable naming: +* lhs = LHS endogenous +* endo = X1, RHS endogenous (instrumented) = #K1 +* inexog = X2 = Z2 = included exogenous (instruments) = #K2 = #L2 +* exexog = Z1 = excluded exogenous (instruments) = #L1 +* iv = {inexog exexog} = all instruments +* rhs = {endo inexog} = RHS regressors +* no 0 or 1 at end of varlist means original varlist but after expansion of FV and TS vars +* 0 at the end of the name means the varlist after duplicates removed and collinearities/omitteds marked +* 1 means the same as 0 but after omitted vars dropped and extraneous FV operators "o", "b" and "n" removed. +* 0, 1 etc. also apply to _ct variables that are counts of these varlists +* dofminus is large-sample adjustment (e.g., #fixed effects) +* sdofminus is small-sample adjustment (e.g., #partialled-out regressors) + +if c(version) < 12 & c(version) >= 9 { +* livreg2 Mata library. +* Ensure Mata library is indexed if new install. +* Not needed for Stata 12+ since ssc.ado does this when installing. + capture mata: mata drop m_calckw() + capture mata: mata drop m_omega() + capture mata: mata drop ms_vcvorthog() + capture mata: mata drop s_vkernel() + capture mata: mata drop s_cdsy() + mata: mata mlib index +} + +********************************************************************************* +***************************** PARENT IVREG2 ************************************* +****************** FORKS TO EXTERNAL IVREG2S IF CALLER < 11 ********************* +********************************************************************************* + +* Parent program, forks to versions as appropriate after version call +* Requires byable(onecall) +program define ivreg2, eclass byable(onecall) /* properties(svyj) */ sortpreserve + local lversion 04.1.12 + +* local to store Stata version of calling program + local caller = _caller() + +* Minimum of version 8 required for parent program (earliest ivreg2 is ivreg28) + version 8 + +* Replay = no arguments before comma + if replay() { +* Call to ivreg2 will either be for version, in which case there should be no other arguments, +* or a postestimation call, in which case control should pass to main program. + syntax [, VERsion * ] + if "`version'"~="" & "`options'"=="" { +* Call to ivreg2 is for version + di in gr "`lversion'" + ereturn clear + ereturn local version `lversion' + exit + } + else if "`version'"~="" & "`options'"~="" { +* Improper use of version option +di as err "invalid syntax - cannot combine version with other options" + exit 198 + } + else { +* Postestimation call, so put `options' macro (i.e. *) back into `0' macro with preceding comma + local 0 `", `options'"' + } + } + +* replay can't be combined with by + if replay() & _by() { +di as err "invalid syntax - cannot use by with replay" + exit 601 + } + +* Handling of by. ivreg2x programs are byable(recall), so must set prefix for them. + if _by() { + local BY `"by `_byvars'`_byrc0':"' + } + +* If calling version is < 11, pass control to earlier version +* Note that this means calls from version 11.0 will not go to legacy version +* but will fail requirement of version 11.2 in main code. + if `caller' < 11 { + local ver = round(`caller') + local ivreg2cmd ivreg2`ver' +* If replay, change e(cmd) macro to name of legacy ivreg2 before calling it, then change back +* Note by not allowed with replay; caught above so prefix not needed here. + if replay() { + ereturn local cmd "`ivreg2cmd'" + `ivreg2cmd' `0' + ereturn local cmd "ivreg2" + + } + else { +* If not replay, call legacy ivreg2 and then add macros + `BY' `ivreg2cmd' `0' + ereturn local cmd "ivreg2" + ereturn local ivreg2cmd "`ivreg2cmd'" + ereturn local version `lversion' + ereturn local predict ivreg2_p + } + exit + } + +// Version is 11 or above. +// Pass control to current estimation program ivreg211. + if replay() { + ivreg211 `0' + } +// If not replay, call ivreg211 and then add macros + else { + // use to separate main args from options + syntax [anything] [if] [in] [aw fw pw iw] [, * ] + // append caller(.) to options + `BY' ivreg211 `anything' `if' `in' [`weight' `exp'], `options' caller(`caller') +// `BY' ivreg211 `0' + ereturn local cmd "ivreg2" + ereturn local ivreg2cmd "ivreg2" + ereturn local version `lversion' + ereturn local predict ivreg2_p + ereturn local cmdline ivreg2 `0' // `0' rather than `*' in case of any "s in string + } + +end +********************************************************************************* +*************************** END PARENT IVREG2 *********************************** +********************************************************************************* + + +********************* EXIT IF STATA VERSION < 11 ******************************** + +* When do file is loaded, exit here if Stata version calling program is < 11. +* Prevents loading of rest of program file (could cause earlier Statas to crash). + +if c(stata_version) < 11 { + exit +} + +******************** END EXIT IF STATA VERSION < 11 ***************************** + + +********************************************************************************* +***************** BEGIN MAIN IVREG2 ESTIMATION CODE ***************************** +********************************************************************************* + +* Main estimation program +program define ivreg211, eclass byable(recall) sortpreserve + version 11.2 + + local ivreg2cmd "ivreg211" // actual command name + local ivreg2name "ivreg2" // name used in command line and for default naming of equations etc. + + if replay() { + syntax [, /// + FIRST FFIRST RF SFIRST /// + dropfirst droprf dropsfirst /// + Level(integer $S_level) /// + NOHEader NOFOoter /// + EForm(string) PLUS /// + NOOMITTED vsquish noemptycells /// + baselevels allbaselevels /// + VERsion /// + caller(real 0) /// + ] + if "`version'" != "" & "`first'`ffirst'`rf'`noheader'`nofooter'`dropfirst'`droprf'`eform'`plus'" != "" { + di as err "option version not allowed" + error 198 + } + if "`version'" != "" { + di in gr "`lversion'" + ereturn clear + ereturn local version `lversion' + exit + } + if `"`e(cmd)'"' != "ivreg2" { + error 301 + } +// Set display options + local dispopt eform(`eform') `noomitted' `vsquish' `noemptycells' `baselevels' `allbaselevels' + +// On replay, set flag so saved eqns aren't dropped + if "`e(firsteqs)'" != "" & "`dropfirst'" == "" { + local savefirst "savefirst" + } + if "`e(rfeq)'" != "" & "`droprf'" == "" { + local saverf "saverf" + } + if "`e(sfirsteq)'" != "" & "`dropsfirst'" == "" { + local savesfirst "savesfirst" + } +// On replay, re-display collinearities and duplicates messages + DispCollinDups + } + else { +// MAIN CODE BLOCK + +// Start parsing + syntax [anything(name=0)] [if] [in] [aw fw pw iw/] [, /// + NOID NOCOLLIN /// + FIRST FFIRST SAVEFIRST SAVEFPrefix(name) /// + RF SAVERF SAVERFPrefix(name) /// + SFIRST SAVESFIRST SAVESFPrefix(name) /// + SMall NOConstant /// + Robust CLuster(varlist) kiefer dkraay(integer 0) /// + BW(string) kernel(string) center /// + GMM GMM2s CUE /// + LIML COVIV FULLER(real 0) Kclass(real 0) /// + ORTHOG(string) ENDOGtest(string) REDundant(string) /// + PARTIAL(string) FWL(string) /// + Level(integer $S_level) /// + NOHEader NOFOoter NOOUTput /// + bvclean NOOMITTED omitted vsquish noemptycells /// + baselevels allbaselevels /// + title(string) subtitle(string) /// + DEPname(string) EForm(string) PLUS /// + Tvar(varname) Ivar(varname) /// + B0(string) SMATRIX(string) WMATRIX(string) /// + sw psd0 psda useqr /// + dofminus(integer 0) sdofminus(integer 0) /// + NOPARTIALSMALL /// + fvall fvsep /// + caller(real 0) /// + ] + +// Confirm ranktest is installed (necessary component). + checkversion_ranktest `caller' + local ranktestcmd `r(ranktestcmd)' + +// Parse after clearing any sreturn macros (can be left behind in Stata 11) + sreturn clear + ivparse `0', ivreg2name(`ivreg2name') /// needed for some options + partial(`partial') /// + fwl(`fwl') /// legacy option + orthog(`orthog') /// + endogtest(`endogtest') /// + redundant(`redundant') /// + depname(`depname') /// + `robust' /// + cluster(`cluster') /// + bw(`bw') /// + kernel(`kernel') /// + dkraay(`dkraay') /// + `center' /// + `kiefer' /// + `sw' /// + `noconstant' /// + tvar(`tvar') /// + ivar(`ivar') /// + `gmm2s' /// + `gmm' /// legacy option, produces error message + `cue' /// + `liml' /// + fuller(`fuller') /// + kclass(`kclass') /// + b0(`b0') /// + wmatrix(`wmatrix') /// + `noid' /// + `savefirst' /// + savefprefix(`savefprefix') /// + `saverf' /// + saverfprefix(`saverfprefix') /// + `savesfirst' /// + savesfprefix(`savesfprefix') /// + dofminus(`dofminus') /// + `psd0' /// + `psda' /// + `nocollin' /// + `useqr' /// + `bvclean' /// + eform(`eform') /// + `noomitted' /// + `vsquish' /// + `noemptycells' /// + `baselevels' /// + `allbaselevels' + +// varlists are unexpanded; may be empty + local lhs `s(lhs)' + local depname `s(depname)' + local endo `s(endo)' + local inexog `s(inexog)' + local exexog `s(exexog)' + local partial `s(partial)' + local cons =s(cons) + local partialcons =s(partialcons) + local tvar `s(tvar)' + local ivar `s(ivar)' + local tdelta `s(tdelta)' + local tsops =s(tsops) + local fvops =s(fvops) + local robust `s(robust)' + local cluster `s(cluster)' + local bw =`s(bw)' // arrives as string but return now as number + local bwopt `s(bwopt)' + local kernel `s(kernel)' // also used as flag for HAC estimation + local center =`s(center)' // arrives as string but now boolean + local kclassopt `s(kclassopt)' + local fulleropt `s(fulleropt)' + local liml `s(liml)' + local noid `s(noid)' // can also be triggered by b0(.) option + local useqr =`s(useqr)' // arrives as string but now boolean; nocollin=>useqr + local savefirst `s(savefirst)' + local savefprefix `s(savefprefix)' + local saverf `s(saverf)' + local saverfprefix `s(saverfprefix)' + local savesfirst `s(savesfirst)' + local savesfprefix `s(savesfprefix)' + local psd `s(psd)' // triggered by psd0 or psda + local dofmopt `s(dofmopt)' + local bvclean =`s(bvclean)' // arrives as string but return now as boolean + local dispopt `s(dispopt)' + +// Can now tsset; sortpreserve will restore sort after exit + if `tsops' | "`kernel'"~="" { + cap tsset // restores sort if tsset or xtset but sort disrupted + if _rc>0 { + tsset `ivar' `tvar' + } + } + +*********************************************************** + +// Weights +// fweight and aweight accepted as is +// iweight not allowed with robust or gmm and requires a trap below when used with summarize +// pweight is equivalent to aweight + robust +// Since we subsequently work with wvar, tsrevar of weight vars in weight `exp' not needed. + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + qui gen double `wvar'=`exp' + } + if "`weight'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "fweight" & "`sw'" != "" { + di in red "fweights currently not supported with -sw- option" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`gmm2s'`kernel'" !="" { + di in red "iweights not allowed with robust or gmm" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + qui gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + qui gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + +******************************************************************************** +// markout sample +// include `tvar' to limit sample to where tvar is available, but only if TS operators used + marksample touse + if `tsops' { + markout `touse' `lhs' `inexog' `exexog' `endo' `cluster' `tvar', strok + } + else { + markout `touse' `lhs' `inexog' `exexog' `endo' `cluster', strok + } + +******************************************************************************** +// weight factor and sample size +// Every time a weight is used, must multiply by scalar wf ("weight factor") +// wf=1 for no weights, fw and iw, wf = scalar that normalizes sum to be N if aw or pw + + sum `wvar' if `touse' `wtexp', meanonly +// Weight statement + if "`weight'" ~= "" { +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + if "`weight'"=="" | "`weight'"=="fweight" | "`weight'"=="iweight" { +// Effective number of observations is sum of weight variable. +// If weight is "", weight var must be column of ones and N is number of rows + local wf=1 + local N=r(sum_w) + } + else if "`weight'"=="aweight" | "`weight'"=="pweight" { + local wf=r(N)/r(sum_w) + local N=r(N) + } + else { +// Should never reach here +di as err "ivreg2 error - misspecified weights" + exit 198 + } + if `N'==0 { +di as err "no observations" + exit 2000 + } + +*************************************************************** +// Time-series data +// tindex used by Mata code so that ts operators work correctly + + tempvar tindex + qui gen `tindex'=1 if `touse' + qui replace `tindex'=sum(`tindex') if `touse' + + if `tsops' | "`kernel'"~="" { +// Report gaps in data + tsreport if `touse', panel + if `r(N_gaps)' != 0 { +di as text "Warning: time variable " as res "`tvar'" as text " has " /// + as res "`r(N_gaps)'" as text " gap(s) in relevant range" + } +// Set local macro T and check that bw < (T-1) + sum `tvar' if `touse', meanonly + local T = r(max)-r(min) + 1 + local T1 = `T' - 1 + if (`bw' > (`T1'/`tdelta')) { +di as err "invalid bandwidth in option bw() - cannot exceed timespan of data" + exit 198 + } + } + +// kiefer VCV = kernel(tru) bw(T) and no robust with tsset data + if "`kiefer'" ~= "" { + local bw =`T' + } + +*********** Column of ones for constant set up here ************** + + if "`noconstant'"=="" { +// If macro not created, automatically omitted. + tempvar ones + qui gen byte `ones' = 1 if `touse' + } + +************* Varlists, FV varlists, duplicates ***************** +// Varlists come in 4 versions, e.g., for inexog: +// (a) inexog = full list of original expanded vnames; may have duplicates +// (b) inexog0 = as with inexog with duplicates removed but RETAINING base/omitted/etc. varnames +// (c) inexog1 = as with inexog0 but WITHOUT base/omitted/etc. +// (d) fv_inexog1 = corresponding list with temp vars minus base/omitted/etc., duplicates, collinearities etc. +// Varlists (c) and (d) are definitive, i.e., have the variables actually used in the estimation. + +// Create consistent expanded varlists. +// "Consistent" means base vars for FVs must be consistent +// hence default rhs=endo+inexog is expanded as one. +// fvall: overrides, endo+inexog+exexog expanded as one +// fvsep: overrides, endo, inexog and exexog expanded separately +// NB: expanding endo+inexog+exexog is dangerous because +// fvexpand can zap a list in case of overlap +// e.g. fvexpand mpg + i(1/4).rep78 + i5.rep78 +// => mpg 1b.rep78 2.rep78 3.rep78 4.rep78 5.rep78 +// but fvexpand mpg + i.rep78 + i5.rep78 +// => mpg 5.rep78 + + CheckDupsCollin, /// + lhs(`lhs') /// + endo(`endo') /// + inexog(`inexog') /// + exexog(`exexog') /// + partial(`partial') /// + orthog(`orthog') /// + endogtest(`endogtest') /// + redundant(`redundant') /// + touse(`touse') /// + wvar(`wvar') /// + wf(`wf') /// + `noconstant' /// + `nocollin' /// + `fvall' /// + `fvsep' + +// Replace basic varlists and create "0" versions of varlists + foreach vl in lhs endo inexog exexog partial orthog endogtest redundant { + local `vl' `s(`vl')' + local `vl'0 `s(`vl'0)' + } + local dups `s(dups)' + local collin `s(collin)' + local ecollin `s(ecollin)' + +// Create "1" and fv versions of varlists + foreach vl in lhs endo inexog exexog partial orthog endogtest redundant { + foreach var of local `vl'0 { // var-by-var so that fvrevar doesn't decide on base etc. + _ms_parse_parts `var' + if ~`r(omit)' { // create temp var only if not omitted + fvrevar `var' if `touse' + local `vl'1 ``vl'1' `var' + local fv_`vl'1 `fv_`vl'1' `r(varlist)' + } + } + local `vl'1 : list retokenize `vl'1 + local fv_`vl'1 : list retokenize fv_`vl'1 + } + +// Check that LHS expanded to a single variable + local wrongvars_ct : word count `lhs' + if `wrongvars_ct' > 1 { +di as err "multiple dependent variables specified: `lhs'" + error 198 + } + +// Check that option varlists are compatible with main varlists +// orthog() + local wrongvars : list orthog1 - inexog1 + local wrongvars : list wrongvars - exexog1 + local wrongvars_ct : word count `wrongvars' + if `wrongvars_ct' { +di as err "Error: `wrongvars' listed in orthog() but does not appear as exogenous." + error 198 + } +// endog() + local wrongvars : list endogtest1 - endo1 + local wrongvars_ct : word count `wrongvars' + if `wrongvars_ct' { +di as err "Error: `wrongvars' listed in endog() but does not appear as endogenous." + error 198 + } +// redundant() + local wrongvars : list redundant1 - exexog1 + local wrongvars_ct : word count `wrongvars' + if `wrongvars_ct' { +di as err "Error: `wrongvars' listed in redundant() but does not appear as exogenous." + error 198 + } + +// And create allnames macros + local allnames `lhs' `endo' `inexog' `exexog' + local allnames0 `lhs0' `endo0' `inexog0' `exexog0' + local allnames1 `lhs1' `endo1' `inexog1' `exexog1' + local fv_allnames1 `fv_lhs1' `fv_endo1' `fv_inexog1' `fv_exexog1' + + +// *************** Partial-out block ************** // + +// `partial' has all to be partialled out except for constant + if "`partial1'" != "" | `partialcons'==1 { + preserve + +// Remove partial0 from inexog0. +// Remove partial1 from inexog1. + local inexog0 : list inexog0 - partial0 + local inexog1 : list inexog1 - partial1 + local fv_inexog1 : list fv_inexog1 - fv_partial1 + +// Check that cluster, weight, tvar or ivar variables won't be transformed +// Use allnames1 (expanded varlist) + if "`cluster'"~="" { + local pvarcheck : list cluster in allnames1 + if `pvarcheck' { +di in r "Error: cannot use cluster variable `cluster' as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } + if "`tvar'"~="" { + local pvarcheck : list tvar in allnames1 + if `pvarcheck' { +di in r "Error: cannot use time variable `tvar' as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } + if "`ivar'"~="" { + local pvarcheck : list ivar in allnames1 + if `pvarcheck' { +di in r "Error: cannot use panel variable `ivar' as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } + if "`wtexp'"~="" { + tokenize `exp', parse("*/()+-^&|~") + local wvartokens `*' + local nwvarnames : list allnames1 - wvartokens + local wvarnames : list allnames1 - nwvarnames + if "`wvarnames'"~="" { +di in r "Error: cannot use weight variables as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } +// Partial out +// But first replace everything with doubles + recast double `fv_lhs1' `fv_endo1' `fv_inexog1' `fv_exexog1' `fv_partial1' + mata: s_partial ("`fv_lhs1'", /// + "`fv_endo1'", /// + "`fv_inexog1'", /// + "`fv_exexog1'", /// + "`fv_partial1'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + `cons') + + local partial_ct : word count `partial1' +// Constant is partialled out, unless nocons already specified in the first place + capture drop `ones' + local ones "" + if "`noconstant'" == "" { +// partial_ct used for small-sample adjustment to regression F-stat + local partial_ct = `partial_ct' + 1 + local noconstant "noconstant" + local cons 0 + } + } + else { +// Set count of partial vars to zero if option not used + local partial_ct 0 + local partialcons 0 + } +// Add partial_ct to small dof adjustment sdofminus + if "`nopartialsmall'"=="" { + local sdofminus = `sdofminus'+`partial_ct' + } + +********************************************* + + local rhs0 `endo0' `inexog0' // needed for display of omitted/base/etc. + local rhs1 `endo1' `inexog1' + local insts1 `exexog1' `inexog1' + local fv_insts1 `fv_exexog1' `fv_inexog1' + local fv_rhs1 `fv_endo1' `fv_inexog1' + local rhs0_ct : word count `rhs0' // needed for display of omitted/base/etc. + local rhs1_ct : word count `fv_rhs1' + local iv1_ct : word count `fv_insts1' + local endo1_ct : word count `fv_endo1' + local exex1_ct : word count `fv_exexog1' + local endoexex1_c : word count `fv_endo1' `fv_exexog1' + local inexog1_ct : word count `fv_inexog1' + +// Counts modified to include constant if appropriate + local rhs1_ct = `rhs1_ct' + `cons' + local rhs0_ct = `rhs0_ct' + `cons' // needed for display of omitted/base/etc. + local iv1_ct = `iv1_ct' + `cons' + +// Column/row names for matrices b, V, S, etc. + local cnb0 `endo0' `inexog0' // including omitted + local cnb1 `endo1' `inexog1' // excluding omitted + local cnZ0 `exexog0' `inexog0' // excluding omitted + local cnZ1 `exexog1' `inexog1' // excluding omitted + if `cons' { + local cnb0 "`cnb0' _cons" + local cnb1 "`cnb1' _cons" + local cnZ0 "`cnZ0' _cons" + local cnZ1 "`cnZ1' _cons" + } + +********************************************* +// Remaining checks: variable counts, col/row names of b0, smatrix, wmatrix + CheckMisc, /// + rhs1_ct(`rhs1_ct') /// + iv1_ct(`iv1_ct') /// + bvector(`b0') /// + smatrix(`smatrix') /// + wmatrix(`wmatrix') /// + cnb1(`cnb1') /// + cnZ1(`cnZ1') + + if "`b0'"~="" { + tempname b0 // so we can overwrite without changing original user matrix + mat `b0' = r(b0) + } + if "`smatrix'"~="" { + tempname S0 + mat `S0' = r(S0) + } + if "`wmatrix'"~="" { + tempname wmatrix // so we can overwrite without changing original user matrix + mat `wmatrix' = r(W0) + } + +*************** Commonly used matrices **************** + tempname YY yy yyc + tempname XX X1X1 X2X2 X1Z X1Z1 XZ Xy + tempname ZZ Z1Z1 Z2Z2 Z1Z2 Z1X2 Zy ZY Z2y Z2Y + tempname XXinv X2X2inv ZZinv XPZXinv + tempname rankxx rankzz condxx condzz + +// use fv_ varlists + mata: s_crossprods ("`fv_lhs1'", /// + "`fv_endo1'", /// + "`fv_inexog1' `ones'", /// + "`fv_exexog1'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N') + mat `XX' =r(XX) + mat `X1X1' =r(X1X1) + mat `X1Z' =r(X1Z) + mat `ZZ' =r(ZZ) + mat `Z2Z2' =r(Z2Z2) + mat `Z1Z2' =r(Z1Z2) + mat `XZ' =r(XZ) + mat `Xy' =r(Xy) + mat `Zy' =r(Zy) + mat `YY' =r(YY) + scalar `yy' =r(yy) + scalar `yyc' =r(yyc) + mat `ZY' =r(ZY) + mat `Z2y' =r(Z2y) + mat `Z2Y' =r(Z2Y) + mat `XXinv' =r(XXinv) + mat `ZZinv' =r(ZZinv) + mat `XPZXinv' =r(XPZXinv) + scalar `condxx' =r(condxx) + scalar `condzz' =r(condzz) + + scalar `rankzz' = rowsof(`ZZinv') - diag0cnt(`ZZinv') + scalar `rankxx' = rowsof(`XXinv') - diag0cnt(`XXinv') + local overid = `rankzz' - `rankxx' + +********** CLUSTER SETUP ********************************************** + +* Mata code requires data are sorted on (1) the first var cluster if there +* is only one cluster var; (2) on the 3rd and then 1st if two-way clustering, +* unless (3) two-way clustering is combined with kernel option, in which case +* the data are tsset and sorted on panel id (first cluster variable) and time +* id (second cluster variable). +* Second cluster var is optional and requires an identifier numbered 1..N_clust2, +* unless combined with kernel option, in which case it's the time variable. +* Third cluster var is the intersection of 1 and 2, unless combined with kernel +* opt, in which case it's unnecessary. +* Sorting on "cluster3 cluster1" means that in Mata, panelsetup works for +* both, since cluster1 nests cluster3. +* Note that it is possible to cluster on time but not panel, in which case +* cluster1 is time, cluster2 is empty and data are sorted on panel-time. +* Note also that if data are sorted here but happen to be tsset, will need +* to be re-tsset after estimation code concludes. + + +// No cluster options or only 1-way clustering +// but for Mata and other purposes, set N_clust vars =0 + local N_clust=0 + local N_clust1=0 + local N_clust2=0 + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`kernel'"~="" { +* kernel requires either that cluster1 is time var and cluster2 is empty +* or that cluster1 is panel var and cluster2 is time var. +* Either way, data must be tsset and sorted for panel data. + if "`cluster2'"~="" { +* Allow backwards order + if "`cluster1'"=="`tvar'" & "`cluster2'"=="`ivar'" { + local cluster1 "`2'" + local cluster2 "`1'" + } + if "`cluster1'"~="`ivar'" | "`cluster2'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset panel & time vars." +di as err " tsset panel var=`ivar'; tsset time var=`tvar'; cluster vars=`cluster1',`cluster2'" + exit 198 + } + } + else { + if "`cluster1'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset time variable." +di as err " tsset time var=`tvar'; cluster var=`cluster1'" + exit 198 + } + } + } +* Simple way to get quick count of 1st cluster variable without disrupting sort +* clusterid1 is numbered 1.._Nclust1. + tempvar clusterid1 + qui egen `clusterid1'=group(`cluster1') if `touse' + sum `clusterid1' if `touse', meanonly + if "`cluster2'"=="" { + local N_clust=r(max) + local N_clust1=`N_clust' + if "`kernel'"=="" { +* Single level of clustering and no kernel-robust, so sort on single cluster var. +* kernel-robust already sorted via tsset. + sort `cluster1' + } + } + else { + local N_clust1=r(max) + if "`kernel'"=="" { + tempvar clusterid2 clusterid3 +* New cluster id vars are numbered 1..N_clust2 and 1..N_clust3 + qui egen `clusterid2'=group(`cluster2') if `touse' + qui egen `clusterid3'=group(`cluster1' `cluster2') if `touse' +* Two levels of clustering and no kernel-robust, so sort on cluster3/nested in/cluster1 +* kernel-robust already sorted via tsset. + sort `clusterid3' `cluster1' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) + } + else { +* Need to create this only to count the number of clusters + tempvar clusterid2 + qui egen `clusterid2'=group(`cluster2') if `touse' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) +* Now replace with original variable + local clusterid2 `cluster2' + } + + local N_clust=min(`N_clust1',`N_clust2') + + } // end 2-way cluster block + } // end cluster block + + +************************************************************************************************ + + tempname b W S V beta lambda j jp rss mss rmse sigmasq rankV rankS + tempname arubin arubinp arubin_lin arubin_linp + tempname r2 r2_a r2u r2c F Fp Fdf2 ivest + + tempvar resid + qui gen double `resid'=. + +******************************************************************************************* +* LIML +******************************************************************************************* + + if "`liml'`kclassopt'"~="" { + + mata: s_liml( "`ZZ'", /// + "`XX'", /// + "`XZ'", /// + "`Zy'", /// + "`Z2Z2'", /// + "`YY'", /// + "`ZY'", /// + "`Z2Y'", /// + "`Xy'", /// + "`ZZinv'", /// + "`fv_lhs1'", /// + "`fv_lhs1' `fv_endo1'", /// + "`resid'", /// + "`fv_endo1' `fv_inexog1' `ones'", /// + "`fv_endo1'", /// + "`fv_exexog1' `fv_inexog1' `ones'", /// + "`fv_exexog1'", /// + "`fv_inexog1' `ones'", /// + `fuller', /// + `kclass', /// + "`coviv'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + "`robust'", /// + "`clusterid1'", /// + "`clusterid2'", /// + "`clusterid3'", /// + `bw', /// + "`kernel'", /// + "`sw'", /// + "`psd'", /// + "`ivar'", /// + "`tvar'", /// + "`tindex'", /// + `tdelta', /// + `center', /// + `dofminus', /// + `useqr') + + mat `b'=r(beta) + mat `S'=r(S) + mat `V'=r(V) + scalar `lambda'=r(lambda) + local kclass=r(kclass) + scalar `j'=r(j) + scalar `rss'=r(rss) + scalar `sigmasq'=r(sigmasq) + scalar `rankV'=r(rankV) + scalar `rankS'=r(rankS) + + scalar `arubin'=(`N'-`dofminus')*ln(`lambda') + scalar `arubin_lin'=(`N'-`dofminus')*(`lambda'-1) + +// collinearities can cause LIML to generate (spurious) OLS results + if "`nocollin'"~="" & `kclass'<1e-8 { +di as err "warning: k=1 in LIML estimation; results equivalent to OLS;" +di as err " may be caused by collinearities" + } + } + +******************************************************************************************* +* OLS, IV and 2SGMM. Also enter to get CUE starting values. +************************************************************************************************ + + if "`liml'`kclassopt'`b0'"=="" { + +* Call to s_gmm1s to do 1st-step GMM. +* If W or S supplied, calculates GMM beta and residuals +* If none of the above supplied, calculates GMM beta using default IV weighting matrix and residuals +* Block not entered if b0 is provided. + +* 1-step GMM is efficient and V/J/Sargan can be returned if: +* - estimator is IV, W is known and S can be calculated from 1st-step residuals +* - S is provided (and W is NOT) so W=inv(S) and beta can be calculated using W +* 1-step GMM is inefficient if: +* - non-iid VCE is requested +* - W is provided + + local effic1s = ( /// + "`gmm2s'`robust'`cluster'`kernel'"=="" /// + | ("`smatrix'"~="" & "`wmatrix'"=="") /// + ) + +// use fv_ varlists + mata: s_gmm1s( "`ZZ'", /// + "`XX'", /// + "`XZ'", /// + "`Zy'", /// + "`ZZinv'", /// + "`fv_lhs1'", /// + "`resid'", /// + "`fv_endo1' `fv_inexog1' `ones'", /// + "`fv_exexog1' `fv_inexog1' `ones'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + "`wmatrix'", /// + "`S0'", /// + `dofminus', /// + `effic1s', /// + `overid', /// + `useqr') + mat `b'=r(beta) + mat `W'=r(W) + +* If 1st-step is efficient, save remaining results and we're done + if `effic1s' { + mat `V'=r(V) + mat `S'=r(S) + scalar `j'=r(j) + scalar `rss'=r(rss) + scalar `sigmasq'=r(sigmasq) + scalar `rankV'=r(rankV) + scalar `rankS'=r(rankS) + } + else { +* ...we're not done - do inefficient or 2-step efficient GMM + +* Pick up matrix left by s_gmm1s(.) + tempname QXZ_W_QZX + mat `QXZ_W_QZX'=r(QXZ_W_QZX) + +* Block calls s_omega to get cov matrix of orthog conditions, if not supplied + if "`smatrix'"~="" { + mat `S'=`S0' + } + else { + +* NB: xtivreg2 calls ivreg2 with data sorted on ivar and optionally tvar. +* Stock-Watson adjustment -sw- assumes data are sorted on ivar. Checked at start of ivreg2. + +* call abw code if bw() is defined and bw(auto) selected + if `bw' != 0 { + if `bw' == -1 { + tempvar abwtouse + gen byte `abwtouse' = (`resid' < .) + abw `resid' `exexog1' `inexog1' `abwtouse', /* + */ tindex(`tindex') nobs(`N') tobs(`T') noconstant kernel(`kernel') + local bw `r(abw)' + local bwopt "bw(`bw')" + local bwchoice "`r(bwchoice)'" + } + } +* S covariance matrix of orthogonality conditions +// use fv_ varlists + mata: s_omega( "`ZZ'", /// + "`resid'", /// + "`fv_exexog1' `fv_inexog1' `ones'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + "`robust'", /// + "`clusterid1'", /// + "`clusterid2'", /// + "`clusterid3'", /// + `bw', /// + "`kernel'", /// + "`sw'", /// + "`psd'", /// + "`ivar'", /// + "`tvar'", /// + "`tindex'", /// + `tdelta', /// + `center', /// + `dofminus') + mat `S'=r(S) + } + +* By this point: `b' has 1st-step inefficient beta +* `resid' has resids from the above beta +* `S' has vcv of orthog conditions using either `resid' or user-supplied `S0' +* `QXZ_W_QZX' was calculated in s_gmm1s(.) for use in s_iegmm(.) + +* Inefficient IV. S, W and b were already calculated above. + if "`gmm2s'"=="" & "`robust'`cluster'`kernel'"~="" { + mata: s_iegmm( "`ZZ'", /// + "`XX'", /// + "`XZ'", /// + "`Zy'", /// + "`QXZ_W_QZX'", /// + "`fv_lhs1'", /// + "`resid'", /// + "`fv_endo1' `fv_inexog1' `ones'", /// + "`fv_exexog1' `fv_inexog1' `ones'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + "`W'", /// + "`S'", /// + "`b'", /// + `dofminus', /// + `overid', /// + `useqr') + } + +* 2-step efficient GMM. S calculated above, b and W will be updated. + if "`gmm2s'"~="" { + mata: s_egmm( "`ZZ'", /// + "`XX'", /// + "`XZ'", /// + "`Zy'", /// + "`ZZinv'", /// + "`fv_lhs1'", /// + "`resid'", /// + "`fv_endo1' `fv_inexog1' `ones'", /// + "`fv_exexog1' `fv_inexog1' `ones'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + "`S'", /// + `dofminus', /// + `overid', /// + `useqr') + mat `b'=r(beta) + mat `W'=r(W) + } + + mat `V'=r(V) + scalar `j'=r(j) + scalar `rss'=r(rss) + scalar `sigmasq'=r(sigmasq) + scalar `rankV'=r(rankV) + scalar `rankS'=r(rankS) + } +* Finished with non-CUE/LIML block + } + +*************************************************************************************** +* Block for cue gmm +******************************************************************************************* + if "`cue'`b0'" != "" { + +* s_gmmcue is passed initial b from IV/2-step GMM block above +* OR user-supplied b0 for evaluation of CUE obj function at b0 + mata: s_gmmcue( "`ZZ'", /// + "`XZ'", /// + "`fv_lhs1'", /// + "`resid'", /// + "`fv_endo1' `fv_inexog1' `ones'", /// + "`fv_exexog1' `fv_inexog1' `ones'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + "`robust'", /// + "`clusterid1'", /// + "`clusterid2'", /// + "`clusterid3'", /// + `bw', /// + "`kernel'", /// + "`sw'", /// + "`psd'", /// + "`ivar'", /// + "`tvar'", /// + "`tindex'", /// + `tdelta', /// + "`b'", /// + "`b0'", /// + `center', /// + `dofminus', /// + `useqr') + + mat `b'=r(beta) + mat `S'=r(S) + mat `W'=r(W) + mat `V'=r(V) + scalar `j'=r(j) + scalar `rss'=r(rss) + scalar `sigmasq'=r(sigmasq) + scalar `rankV'=r(rankV) + scalar `rankS'=r(rankS) + + } + +**************************************************************** +* Done with estimation blocks +**************************************************************** + + mat colnames `b' = `cnb1' + mat colnames `V' = `cnb1' + mat rownames `V' = `cnb1' + mat colnames `S' = `cnZ1' + mat rownames `S' = `cnZ1' +* No W matrix for LIML or kclass + capture mat colnames `W' = `cnZ1' + capture mat rownames `W' = `cnZ1' + +******************************************************************************************* +* RSS, counts, dofs, F-stat, small-sample corrections +******************************************************************************************* + +// rankxx = rhs1_ct except if nocollin +// rankzz = iv1_ct except if nocollin +// nocollin means count may exceed rank (because of dropped vars), so rank #s foolproof + scalar `rmse'=sqrt(`sigmasq') + if "`noconstant'"=="" { + scalar `mss'=`yyc' - `rss' + } + else { + scalar `mss'=`yy' - `rss' + } + + local Fdf1 = `rankxx' - `cons' + local df_m = `rankxx' - `cons' + (`sdofminus'-`partialcons') + +* Residual dof + if "`cluster'"=="" { +* Use int(`N') because of non-integer N with iweights, and also because of +* possible numeric imprecision with N returned by above. + local df_r = int(`N') - `rankxx' - `dofminus' - `sdofminus' + } + else { +* To match Stata, subtract 1 + local df_r = `N_clust' - 1 + } + +* Sargan-Hansen J dof and p-value +* df=0 doesn't guarantee j=0 since can be call to get value of CUE obj fn + local jdf = `rankzz' - `rankxx' + if `jdf' == 0 & "`b0'"=="" { + scalar `j' = 0 + } + else { + scalar `jp' = chiprob(`jdf',`j') + } + if "`liml'"~="" { + scalar `arubinp' = chiprob(`jdf',`arubin') + scalar `arubin_linp' = chiprob(`jdf',`arubin_lin') + } + +* Small sample corrections for var-cov matrix. +* If robust, the finite sample correction is N/(N-K), and with no small +* we change this to 1 (a la Davidson & MacKinnon 1993, p. 554, HC0). +* If cluster, the finite sample correction is (N-1)/(N-K)*M/(M-1), and with no small +* we change this to 1 (a la Wooldridge 2002, p. 193), where M=number of clusters. + + if "`small'" != "" { + if "`cluster'"=="" { + matrix `V'=`V'*(`N'-`dofminus')/(`N'-`rankxx'-`dofminus'-`sdofminus') + } + else { + matrix `V'=`V'*(`N'-1)/(`N'-`rankxx'-`sdofminus') /// + * `N_clust'/(`N_clust'-1) + } + scalar `sigmasq'=`rss'/(`N'-`rankxx'-`dofminus'-`sdofminus') + scalar `rmse'=sqrt(`sigmasq') + } + + scalar `r2u'=1-`rss'/`yy' + scalar `r2c'=1-`rss'/`yyc' + if "`noconstant'"=="" { + scalar `r2'=`r2c' + scalar `r2_a'=1-(1-`r2')*(`N'-1)/(`N'-`rankxx'-`dofminus'-`sdofminus') + } + else { + scalar `r2'=`r2u' + scalar `r2_a'=1-(1-`r2')*`N'/(`N'-`rankxx'-`dofminus'-`sdofminus') + } +* `N' is rounded down to nearest integer if iweights are used. +* If aw, pw or fw, should already be integer but use round in case of numerical imprecision. + local N=int(`N') + +* Fstat +* To get it to match Stata's, must post separately with dofs and then do F stat by hand +* in case weights generate non-integer obs and dofs +* Create copies so they can be posted + tempname FB FV + mat `FB'=`b' + mat `FV'=`V' + capture ereturn post `FB' `FV' +* If the cov matrix wasn't positive definite, the post fails with error code 506 + local rc = _rc + if `rc' != 506 { +* Strip out omitted/base/etc. vars from RHS list + ivreg2_fvstrip `rhs1', dropomit + capture test `r(varlist)' + if "`small'" == "" { + if "`cluster'"=="" { + capture scalar `F' = r(chi2)/`Fdf1' * `df_r'/(`N'-`dofminus') + } + else { +* sdofminus used here so that F-stat matches test stat from regression with no partial and small + capture scalar `F' = r(chi2)/`Fdf1' * /// + (`N_clust'-1)/`N_clust' * /// + (`N'-`rankxx'-`sdofminus')/(`N'-1) + } + } + else { + capture scalar `F' = r(chi2)/`Fdf1' + } + capture scalar `Fp'=Ftail(`Fdf1',`df_r',`F') + capture scalar `Fdf2'=`df_r' + } + +* If j==. or vcv wasn't full rank, then vcv problems and F is meaningless + if `j' == . | `rc'==506 { + scalar `F' = . + scalar `Fp' = . + } + +* End of counts, dofs, F-stat, small sample corrections + +******************************************************************************************** +* Reduced form and first stage regression options +******************************************************************************************* +* Relies on proper count of (non-collinear) IVs generated earlier. +* Note that nocons option + constant in instrument list means first-stage +* regressions are reported with nocons option. First-stage F-stat therefore +* correctly includes the constant as an explanatory variable. + + if "`sfirst'`savesfirst'`rf'`saverf'`first'`ffirst'`savefirst'" != "" & (`endo1_ct' > 0) { + +* Restore original order if changed for mata code above + capture tsset + + local sdofmopt = "sdofminus(`sdofminus')" +// Need to create Stata placeholders for Mata code so that Stata time-series operators can work on them +// fres1 is Nx1 +// endo1_hat is NxK1 +// fsresall is Nx(K1+1) (used for full system) + tempname fsres1 + qui gen double `fsres1'=. + local fsresall `fsres1' + foreach x of local fv_endo1 { + tempname fsres + qui gen double `fsres'=. + local fsresall "`fsresall' `fsres'" + } + +// mata code requires sorting on cluster 3 / cluster 1 (if 2-way) or cluster 1 (if one-way) + if "`cluster'"!="" { + sort `clusterid3' `cluster1' + } + mata: s_ffirst( "`ZZ'", /// + "`XX'", /// + "`XZ'", /// + "`ZY'", /// + "`ZZinv'", /// + "`XXinv'", /// + "`XPZXinv'", /// + "`Z2Z2'", /// + "`Z1Z2'", /// + "`Z2y'", /// + "`fsres1'", /// Nx1 + "`fsresall'", /// Nx(K1+1) + "`fv_lhs1'", /// + "`fv_endo1'", /// + "`fv_inexog1' `ones'", /// + "`fv_exexog1'", /// + "`touse'", /// + "`weight'", /// + "`wvar'", /// + `wf', /// + `N', /// + `N_clust', /// + "`robust'", /// + "`clusterid1'", /// + "`clusterid2'", /// + "`clusterid3'", /// + `bw', /// + "`kernel'", /// + "`sw'", /// + "`psd'", /// + "`ivar'", /// + "`tvar'", /// + "`tindex'", /// + `tdelta', /// + `center', /// + `dofminus', /// + `sdofminus') + + tempname firstmat firstb firstv firsts + mat `firstmat' = r(firstmat) + mat rowname `firstmat' = rmse sheapr2 pr2 F df df_r pvalue /// + SWF SWFdf1 SWFdf2 SWFp SWchi2 SWchi2p SWr2 /// + APF APFdf1 APFdf2 APFp APchi2 APchi2p APr2 + mat colname `firstmat' = `endo1' + mat `firstb' = r(b) + mat `firstv' = r(V) + mat `firsts' = r(S) + local archi2 =r(archi2) + local archi2p =r(archi2p) + local arf =r(arf) + local arfp =r(arfp) + local ardf =r(ardf) + local ardf_r =r(ardf_r) + local sstat =r(sstat) + local sstatdf =r(sstatdf) + local sstatp =r(sstatp) + local rmse_rf =r(rmse_rf) + +* Restore original order if changed for mata code above + capture tsset +// System of first-stage/reduced form eqns + if "`sfirst'`savesfirst'" ~= "" { + PostFirstRF if `touse', /// + bmat(`firstb') /// + vmat(`firstv') /// + smat(`firsts') /// + firstmat(`firstmat') /// + lhs1(`lhs1') /// + endo1(`endo1') /// + znames0(`cnZ0') /// + znames1(`cnZ1') /// + bvclean(`bvclean') /// + fvops(`fvops') /// + partial_ct(`partial_ct') /// + `robust' /// + cluster(`cluster') /// + cluster1(`cluster1') /// + cluster2(`cluster2') /// + nc(`N_clust') /// + nc1(`N_clust1') /// + nc2(`N_clust2') /// + kernel(`kernel') /// + bw(`bw') /// + ivar(`ivar') /// + tvar(`tvar') /// + obs(`N') /// + iv1_ct(`iv1_ct') /// + cons(`cons') /// + partialcons(`partialcons') /// + dofminus(`dofminus') /// + sdofminus(`sdofminus') + local sfirsteq "`savesfprefix'sfirst_`lhs1'" + local sfirsteq : subinstr local sfirsteq "." "_" + capture est store `sfirsteq', title("System of first-stage/reduced form regressions") + if _rc > 0 { +di +di in ye "Unable to store system of first-stage reduced form regressions." +di + } + } + +// RF regression + if "`rf'`saverf'" ~= "" { + PostFirstRF if `touse', /// + rf /// extract RF regression as saved result + rmse_rf(`rmse_rf') /// provide RMSE for posting + bmat(`firstb') /// + vmat(`firstv') /// + smat(`firsts') /// + firstmat(`firstmat') /// + lhs1(`lhs1') /// + endo1(`endo1') /// + znames0(`cnZ0') /// + znames1(`cnZ1') /// + bvclean(`bvclean') /// + fvops(`fvops') /// + partial_ct(`partial_ct') /// + `robust' /// + cluster(`cluster') /// + cluster1(`cluster1') /// + cluster2(`cluster2') /// + nc(`N_clust') /// + nc1(`N_clust1') /// + nc2(`N_clust2') /// + kernel(`kernel') /// + bw(`bw') /// + ivar(`ivar') /// + tvar(`tvar') /// + obs(`N') /// + iv1_ct(`iv1_ct') /// + cons(`cons') /// + partialcons(`partialcons') /// + dofminus(`dofminus') /// + sdofminus(`sdofminus') + local rfeq "`saverfprefix'`lhs1'" + local rfeq : subinstr local rfeq "." "_" + capture est store `rfeq', title("Reduced-form regression: `lhs'") + if _rc > 0 { +di +di in ye "Unable to store reduced form regression of `lhs1'." +di + } + } + +// Individual first-stage equations + if "`first'`savefirst'" ~= "" { + foreach vn in `endo1' { + + PostFirstRF if `touse', /// + first(`vn') /// extract first-stage regression + bmat(`firstb') /// + vmat(`firstv') /// + smat(`firsts') /// + firstmat(`firstmat') /// + lhs1(`lhs1') /// + endo1(`endo1') /// + znames0(`cnZ0') /// + znames1(`cnZ1') /// + bvclean(`bvclean') /// + fvops(`fvops') /// + partial_ct(`partial_ct') /// + `robust' /// + cluster(`cluster') /// + cluster1(`cluster1') /// + cluster2(`cluster2') /// + nc(`N_clust') /// + nc1(`N_clust1') /// + nc2(`N_clust2') /// + kernel(`kernel') /// + bw(`bw') /// + ivar(`ivar') /// + tvar(`tvar') /// + obs(`N') /// + iv1_ct(`iv1_ct') /// + cons(`cons') /// + partialcons(`partialcons') /// + dofminus(`dofminus') /// + sdofminus(`sdofminus') + local eqname "`savefprefix'`vn'" + local eqname : subinstr local eqname "." "_" + capture est store `eqname', title("First-stage regression: `vn'") + if _rc == 0 { + local firsteqs "`firsteqs' `eqname'" + } + else { +di +di in ye "Unable to store first-stage regression of `vn'." +di + } + } + } + } +* End of RF and first-stage regression code + +******************************************************************************************* +* Re-tsset if necessary +************************************************************************************************ + + capture tsset + +******************************************************************************************* +* orthog option: C statistic (difference of Sargan statistics) +******************************************************************************************* +* Requires j dof from above + if "`orthog'"!="" { + tempname cj cstat cstatp +* Initialize cstat + scalar `cstat' = 0 +* Remove orthog from inexog and put in endo +* Remove orthog from exexog + local cexexog1 : list fv_exexog1 - fv_orthog1 + local cinexog1 : list fv_inexog1 - fv_orthog1 + local cendo1 : list fv_inexog1 - cinexog1 + local cendo1 `fv_endo1' `cendo1' + local clist_ct : word count `orthog1' + +* If robust, HAC/AC or GMM (but not LIML or IV), create optimal weighting matrix to pass to ivreg2 +* by extracting the submatrix from the full S and then inverting. +* This guarantees the C stat will be non-negative. See Hayashi (2000), p. 220. +* Calculate C statistic with recursive call to ivreg2 +* Collinearities may cause problems, hence -capture-. +* smatrix works generally, including homoskedastic case with Sargan stat + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } +* clopt is omitted because it requires calculation of numbers of clusters, which is done +* only when S matrix is calculated +* S matrix has final varnames, but need to call ivreg2 with temp vars +* so must rename cols/rows of S + tempname fv_S + mat `fv_S'=`S' + if `cons' { + mat colnames `fv_S' = `fv_exexog1' `fv_inexog1' _cons + mat rownames `fv_S' = `fv_exexog1' `fv_inexog1' _cons + } + else { + mat colnames `fv_S' = `fv_exexog1' `fv_inexog1' + mat rownames `fv_S' = `fv_exexog1' `fv_inexog1' + } + capture `ivreg2cmd' `fv_lhs1' /// + `cinexog1' /// + (`cendo1'=`cexexog1') /// + if `touse' /// + `wtexp', /// + `noconstant' /// + `options' /// + `small' /// + `robust' /// + `gmm2s' /// + `bwopt' /// + `kernopt' /// + `dofmopt' /// + `sw' /// + `psd' /// + smatrix("`fv_S'") /// + noid /// + nocollin + local rc = _rc + if `rc' == 481 { + scalar `cstat' = 0 + local cstatdf = 0 + } + else { + scalar `cj'=e(j) + local cjdf=e(jdf) + scalar `cstat' = `j' - `cj' + local cstatdf = `jdf' - `cjdf' + } + _estimates unhold `ivest' + scalar `cstatp'= chiprob(`cstatdf',`cstat') +* Collinearities may cause C-stat dof to differ from the number of variables in orthog() +* If so, set cstat=0 + if `cstatdf' != `clist_ct' { + scalar `cstat' = 0 + } + } +* End of orthog block + +******************************************************************************************* +* Endog option +******************************************************************************************* +* Uses recursive call with orthog + if "`endogtest'"!="" { + tempname estat estatp +* Initialize estat + scalar `estat' = 0 +* Remove endogtest vars from endo and put in inexog + local eendo1 : list fv_endo1 - fv_endogtest1 + local einexog1 `fv_inexog1' `fv_endogtest1' + local elist_ct : word count `endogtest1' + +* Recursive call to ivreg2 using orthog option to obtain endogeneity test statistic +* Collinearities may cause problems, hence -capture-. + capture { + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + capture `ivreg2cmd' `fv_lhs1' /// + `einexog1' /// + (`eendo1'=`fv_exexog1') /// + if `touse' /// + `wtexp', /// + `noconstant' /// + `robust' /// + `clopt' /// + `gmm2s' /// + `liml' /// + `bwopt' /// + `kernopt' /// + `small' /// + `dofmopt' /// + `sw' /// + `psd' /// + `options' /// + orthog(`fv_endogtest1') /// + noid /// + nocollin + local rc = _rc + if `rc' == 481 { + scalar `estat' = 0 + local estatdf = 0 + } + else { + scalar `estat'=e(cstat) + local estatdf=e(cstatdf) + scalar `estatp'=e(cstatp) + } + _estimates unhold `ivest' +* Collinearities may cause endog stat dof to differ from the number of variables in endog() +* If so, set estat=0 + if `estatdf' != `elist_ct' { + scalar `estat' = 0 + } + } +* End of endogeneity test block + } + +******************************************************************************************* +* Rank identification and redundancy block +******************************************************************************************* + if `endo1_ct' > 0 & "`noid'"=="" { + +// id=underidentification statistic, wid=weak identification statistic + tempname idrkstat widrkstat iddf idp + tempname ccf cdf rkf cceval cdeval cd + tempname idstat widstat + +// UNDERIDENTIFICATION +// Anderson canon corr underidentification statistic if homo, rk stat if not +// Need only id stat for testing full rank=(#cols-1) +// ranktest can exit with error if not full rank +// May not exit with error if e.g. ranktest (x y) (x w), +// i.e. collinearity across lists, so need to catch that. +// If no collinearity, can use iv1_ct and rhs1_ct etc. + cap `ranktestcmd' /// + (`fv_endo1') /// + (`fv_exexog1') /// + `wtexp' /// + if `touse', /// + partial(`fv_inexog1') /// + full /// + `noconstant' /// + `robust' /// + `clopt' /// + `bwopt' /// + `kernopt' +// Returned in e(.) macro: + local rkcmd `r(ranktestcmd)' + +// Canonical correlations returned in r(ccorr), sorted in descending order. +// If largest = 1, collinearities so enter error block. + local rkerror = _rc>0 | r(chi2)==. + if ~`rkerror' { + local rkerror = el(r(ccorr),1,1)==1 + } + if `rkerror' { +di as err "warning: -ranktest- error in calculating underidentification test statistics;" +di as err " may be caused by collinearities" + scalar `idstat' = . + local iddf = . + scalar `idp' = . + scalar `cd' = . + scalar `cdf' = . + } + else { + if "`cluster'"=="" { + scalar `idstat'=r(chi2)/r(N)*(`N'-`dofminus') + } + else { +// No dofminus adjustment needed for cluster-robust + scalar `idstat'=r(chi2) + } + mat `cceval'=r(ccorr) + mat `cdeval' = J(1,`endo1_ct',.) + forval i=1/`endo1_ct' { + mat `cceval'[1,`i'] = (`cceval'[1,`i'])^2 + mat `cdeval'[1,`i'] = `cceval'[1,`i'] / (1 - `cceval'[1,`i']) + } + local iddf = `iv1_ct' - (`rhs1_ct'-1) + scalar `idp' = chiprob(`iddf',`idstat') +// Cragg-Donald F statistic. +// Under homoskedasticity, Wald cd eigenvalue = cc/(1-cc) Anderson canon corr eigenvalue. + scalar `cd'=`cdeval'[1,`endo1_ct'] + scalar `cdf'=`cd'*(`N'-`sdofminus'-`iv1_ct'-`dofminus')/`exex1_ct' + } // end underidentification stat + +// WEAK IDENTIFICATION +// Weak id statistic is Cragg-Donald F stat, rk Wald F stat if not +// ranktest exits with error if not full rank so can use iv1_ct and rhs1_ct etc. + if "`robust'`cluster'`kernel'"=="" { + scalar `widstat'=`cdf' + } + else { +// Need only test of full rank + cap `ranktestcmd' /// + (`fv_endo1') /// + (`fv_exexog1') /// + `wtexp' /// + if `touse', /// + partial(`fv_inexog1') /// + full /// + wald /// + `noconstant' /// + `robust' /// + `clopt' /// + `bwopt' /// + `kernopt' +// Canonical correlations returned in r(ccorr), sorted in descending order. +// If largest = 1, collinearities so enter error block. + local rkerror = _rc>0 | r(chi2)==. + if ~`rkerror' { + local rkerror = el(r(ccorr),1,1)==1 + } + if `rkerror' { +di as err "warning: -ranktest- error in calculating weak identification test statistics;" +di as err " may be caused by collinearities" + scalar `rkf' = . + scalar `widstat' = . + } + else { +// sdofminus used here so that F-stat matches test stat from regression with no partial + if "`cluster'"=="" { + scalar `rkf'=r(chi2)/r(N)*(`N'-`iv1_ct'-`sdofminus'-`dofminus')/`exex1_ct' + } + else { + scalar `rkf' = r(chi2)/(`N'-1) * /// + (`N'-`iv1_ct'-`sdofminus') * /// + (`N_clust'-1)/`N_clust' / /// + `exex1_ct' + } + scalar `widstat'=`rkf' + } + } // end weak-identification stat + } // end under- and weak-identification stats + +* LM redundancy test + if `endo1_ct' > 0 & "`redundant'" ~= "" & "`noid'"=="" { +* Use K-P rk statistics and LM version of test +* Statistic is the rank of the matrix of Z_1B*X_2, where Z_1B are the possibly redundant +* instruments and X_1 are the endogenous regressors; both have X_2 (exogenous regressors) +* and Z_1A (maintained excluded instruments) partialled out. LM test of rank is +* is numerically equivalent to estimation of set of RF regressions and performing +* standard LM test of possibly redundant instruments. + + local rexexog1 : list fv_exexog1 - fv_redundant1 + local redlist_ct : word count `redundant1' +* LM version requires only -nullrank- rk statistics so would not need -all- option + tempname rkmatrix + qui `ranktestcmd' /// + (`fv_endo1') /// + (`fv_redundant1') /// + `wtexp' /// + if `touse', /// + partial(`fv_inexog1' `rexexog1') /// + null /// + `noconstant' /// + `robust' /// + `clopt' /// + `bwopt' /// + `kernopt' + mat `rkmatrix'=r(rkmatrix) + tempname redstat redp +* dof adjustment needed because it doesn't use the adjusted S + if "`cluster'"=="" { + scalar `redstat' = `rkmatrix'[1,1]/r(N)*(`N'-`dofminus') + } + else { +* No dofminus adjustment needed for cluster-robust + scalar `redstat' = `rkmatrix'[1,1] + } + local reddf = `endo1_ct'*`redlist_ct' + scalar `redp' = chiprob(`reddf',`redstat') + } + +* End of identification stats block + +******************************************************************************************* +* Error-checking block +******************************************************************************************* + +* Check if adequate number of observations + if `N' <= `iv1_ct' { +di in r "Error: number of observations must be greater than number of instruments" +di in r " including constant." + error 2001 + } + +* Check if robust VCV matrix is of full rank + if ("`gmm2s'`robust'`cluster'`kernel'" != "") & (`rankS' < `iv1_ct') { +* Robust covariance matrix not of full rank means either a singleton dummy or too few +* clusters (in which case the indiv SEs are OK but no F stat or 2-step GMM is possible), +* or there are too many AC/HAC-lags, or the HAC covariance estimator +* isn't positive definite (possible with truncated and Tukey-Hanning kernels) +* or nocollin option has been used. +* Previous versions of ivreg2 exited if 2-step GMM but beta and VCV may be OK. +* Continue but J, F, and C stat (if present) all possibly meaningless. +* Set j = missing so that problem can be reported in output. + scalar `j' = . + if "`orthog'"!="" { + scalar `cstat' = . + } + if "`endogtest'"!="" { + scalar `estat' = . + } + } + +* End of error-checking block + +********************************************************************************************** +* Post and display results. +******************************************************************************************* + +// rankV = rhs1_ct except if nocollin +// rankS = iv1_ct except if nocollin +// nocollin means count may exceed rank (because of dropped vars), so rank #s foolproof + +// Add back in omitted vars from "0" varlists unless bvclean requested +// or unless there are no omitted regressors that need adding back in. + if ~`bvclean' & (`rhs0_ct' > `rhs1_ct') { + AddOmitted, bmat(`b') vmat(`V') cnb0(`cnb0') cnb1(`cnb1') + mat `b' = r(b) + mat `V' = r(V) +// build fv info (base, empty, etc.) unless there was partialling out + if `fvops' & ~`partial_ct' { + local bfv "buildfvinfo" + } + } + +******************************************************************************************* + +// restore data if preserved for partial option + if `partial_ct' { + restore + } + + if "`small'"!="" { + local NminusK = `N'-`rankxx'-`sdofminus' + capture ereturn post `b' `V', dep(`depname') obs(`N') esample(`touse') dof(`NminusK') `bfv' + } + else { + capture ereturn post `b' `V', dep(`depname') obs(`N') esample(`touse') `bfv' + } + + local rc = _rc + if `rc' == 504 { +di in red "Error: estimated variance-covariance matrix has missing values" + exit 504 + } + if `rc' == 506 { +di in red "Error: estimated variance-covariance matrix not positive-definite" + exit 506 + } + if `rc' > 0 { +di in red "Error: estimation failed - could not post estimation results" + exit `rc' + } + + local mok =1 // default - margins OK + local mok = `mok' & ~`partial_ct' // but not if partialling out + local mok = `mok' & ~(`fvops' & `bvclean') // nor if there are FVs and the base vars are not in e(b) + if `mok' & `endo1_ct' { // margins can be used, endog regressors + ereturn local marginsnotok "Residuals SCores" // same as official -ivregress- + ereturn local marginsok "XB default" + } + else if `mok' & ~`endo1_ct' { // margins can be used, no endog regressors + ereturn local marginsok "XB default" // same as official -regress' + } + else { // don't allow margins + ereturn local marginsnotok "Residuals SCores XB default" + } + +// Original varlists without removed duplicates, collinears, etc. +// "0" varlists after removing duplicates and reclassifying vars, and including omitteds, FV base vars, etc. +// "1" varlists without omitted, FV base vars, and partialled-out vars + ereturn local ecollin `ecollin' + ereturn local collin `collin' + ereturn local dups `dups' + ereturn local partial1 `partial1' + ereturn local partial `partial' + ereturn local inexog1 `inexog1' + ereturn local inexog0 `inexog0' + ereturn local inexog `inexog' + ereturn local exexog1 `exexog1' + ereturn local exexog0 `exexog0' + ereturn local exexog `exexog' + ereturn local insts1 `exexog1' `inexog1' + ereturn local insts0 `exexog0' `inexog0' + ereturn local insts `exexog' `inexog' + ereturn local instd1 `endo1' + ereturn local instd0 `endo0' + ereturn local instd `endo' + ereturn local depvar1 `lhs1' + ereturn local depvar0 `lhs0' + ereturn local depvar `lhs' + + ereturn scalar inexog_ct =`inexog1_ct' + ereturn scalar exexog_ct =`exex1_ct' + ereturn scalar endog_ct =`endo1_ct' + ereturn scalar partial_ct =`partial_ct' + + if "`smatrix'" == "" { + ereturn matrix S `S' + } + else { + ereturn matrix S `S0' // it's a copy so original won't be zapped + } + +* No weighting matrix defined for LIML and kclass + if "`wmatrix'"=="" & "`liml'`kclassopt'"=="" { + ereturn matrix W `W' + } + else if "`liml'`kclassopt'"=="" { + ereturn matrix W `wmatrix' // it's a copy so original won't be zapped + } + + if "`kernel'"!="" { + ereturn local kernel "`kernel'" + ereturn scalar bw=`bw' + ereturn local tvar "`tvar'" + if "`ivar'" ~= "" { + ereturn local ivar "`ivar'" + } + if "`bwchoice'" ~= "" { + ereturn local bwchoice "`bwchoice'" + } + } + + if "`small'"!="" { + ereturn scalar df_r=`df_r' + ereturn local small "small" + } + if "`nopartialsmall'"=="" { + ereturn local partialsmall "small" + } + + + if "`robust'" != "" { + local vce "robust" + } + if "`cluster1'" != "" { + if "`cluster2'"=="" { + local vce "`vce' cluster" + } + else { + local vce "`vce' two-way cluster" + } + } + if "`kernel'" != "" { + if "`robust'" != "" { + local vce "`vce' hac" + } + else { + local vce "`vce' ac" + } + local vce "`vce' `kernel' bw=`bw'" + } + if "`sw'" != "" { + local vce "`vce' sw" + } + if "`psd'" != "" { + local vce "`vce' `psd'" + } + local vce : list clean vce + local vce = lower("`vce'") + ereturn local vce `vce' + + if "`cluster'"!="" { + ereturn scalar N_clust=`N_clust' + ereturn local clustvar `cluster' + } + if "`cluster2'"!="" { + ereturn scalar N_clust1=`N_clust1' + ereturn scalar N_clust2=`N_clust2' + ereturn local clustvar1 `cluster1' + ereturn local clustvar2 `cluster2' + } + + if "`robust'`cluster'" != "" { + ereturn local vcetype "Robust" + } + + ereturn scalar df_m=`df_m' + ereturn scalar sdofminus=`sdofminus' + ereturn scalar dofminus=`dofminus' + ereturn scalar center=`center' + ereturn scalar r2=`r2' + ereturn scalar rmse=`rmse' + ereturn scalar rss=`rss' + ereturn scalar mss=`mss' + ereturn scalar r2_a=`r2_a' + ereturn scalar F=`F' + ereturn scalar Fp=`Fp' + ereturn scalar Fdf1=`Fdf1' + ereturn scalar Fdf2=`Fdf2' + ereturn scalar yy=`yy' + ereturn scalar yyc=`yyc' + ereturn scalar r2u=`r2u' + ereturn scalar r2c=`r2c' + ereturn scalar condzz=`condzz' + ereturn scalar condxx=`condxx' + ereturn scalar rankzz=`rankzz' + ereturn scalar rankxx=`rankxx' + ereturn scalar rankS=`rankS' + ereturn scalar rankV=`rankV' + ereturn scalar ll = -0.5 * (`N'*ln(2*_pi) + `N'*ln(`rss'/`N') + `N') + +* Always save J. Also save as Sargan if homoskedastic; save A-R if LIML. + ereturn scalar j=`j' + ereturn scalar jdf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar jp=`jp' + } + if ("`robust'`cluster'"=="") { + ereturn scalar sargan=`j' + ereturn scalar sargandf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar sarganp=`jp' + } + } + if "`liml'"!="" { + ereturn scalar arubin=`arubin' + ereturn scalar arubin_lin=`arubin_lin' + if `j' != 0 & `j' != . { + ereturn scalar arubinp=`arubinp' + ereturn scalar arubin_linp=`arubin_linp' + } + ereturn scalar arubindf=`jdf' + } + + if "`orthog'"!="" { + ereturn scalar cstat=`cstat' + if `cstat'!=0 & `cstat' != . { + ereturn scalar cstatp=`cstatp' + ereturn scalar cstatdf=`cstatdf' + ereturn local clist `orthog1' + } + } + + if "`endogtest'"!="" { + ereturn scalar estat=`estat' + if `estat'!=0 & `estat' != . { + ereturn scalar estatp=`estatp' + ereturn scalar estatdf=`estatdf' + ereturn local elist `endogtest1' + } + } + + if `endo1_ct' > 0 & "`noid'"=="" { + ereturn scalar idstat=`idstat' + ereturn scalar iddf=`iddf' + ereturn scalar idp=`idp' + ereturn scalar cd=`cd' + ereturn scalar widstat=`widstat' + ereturn scalar cdf=`cdf' + capture ereturn matrix ccev=`cceval' + capture ereturn matrix cdev `cdeval' + capture ereturn scalar rkf=`rkf' + } + + if "`redundant'"!="" & "`noid'"=="" { + ereturn scalar redstat=`redstat' + ereturn scalar redp=`redp' + ereturn scalar reddf=`reddf' + ereturn local redlist `redundant1' + } + + if "`first'`ffirst'`savefirst'`sfirst'`savesfirst'" != "" & `endo1_ct'>0 { +// Capture here because firstmat may be empty if mvs encountered in 1st stage regressions + capture ereturn matrix first `firstmat' + ereturn scalar arf=`arf' + ereturn scalar arfp=`arfp' + ereturn scalar archi2=`archi2' + ereturn scalar archi2p=`archi2p' + ereturn scalar ardf=`ardf' + ereturn scalar ardf_r=`ardf_r' + ereturn scalar sstat=`sstat' + ereturn scalar sstatp=`sstatp' + ereturn scalar sstatdf=`sstatdf' + } +// not saved if empty + ereturn local firsteqs `firsteqs' + ereturn local rfeq `rfeq' + ereturn local sfirsteq `sfirsteq' + + if "`liml'"!="" { + ereturn local model "liml" + ereturn scalar kclass=`kclass' + ereturn scalar lambda=`lambda' + if `fuller' > 0 & `fuller' < . { + ereturn scalar fuller=`fuller' + } + } + else if "`kclassopt'" != "" { + ereturn local model "kclass" + ereturn scalar kclass=`kclass' + } + else if "`gmm2s'`cue'`b0'`wmatrix'"=="" { + if "`endo1'" == "" { + ereturn local model "ols" + } + else { + ereturn local model "iv" + } + } + else if "`cue'`b0'"~="" { + ereturn local model "cue" + } + else if "`gmm2s'"~="" { + ereturn local model "gmm2s" + } + else if "`wmatrix'"~="" { + ereturn local model "gmmw" + } + else { +* Should never enter here + ereturn local model "unknown" + } + + if "`weight'" != "" { + ereturn local wexp "=`exp'" + ereturn local wtype `weight' + } + ereturn local cmd `ivreg2cmd' + ereturn local ranktestcmd `rkcmd' + ereturn local version `lversion' + ereturn scalar nocollin =("`nocollin'"~="") + ereturn scalar partialcons =`partialcons' + ereturn scalar cons =`cons' + + ereturn local predict "`ivreg2cmd'_p" + + if "`e(model)'"=="gmm2s" & "`wmatrix'"=="" { + local title2 "2-Step GMM estimation" + } + else if "`e(model)'"=="gmm2s" & "`wmatrix'"~="" { + local title2 "2-Step GMM estimation with user-supplied first-step weighting matrix" + } + else if "`e(model)'"=="gmmw" { + local title2 "GMM estimation with user-supplied weighting matrix" + } + else if "`e(model)'"=="cue" & "`b0'"=="" { + local title2 "CUE estimation" + } + else if "`e(model)'"=="cue" & "`b0'"~="" { + local title2 "CUE evaluated at user-supplied parameter vector" + } + else if "`e(model)'"=="ols" { + local title2 "OLS estimation" + } + else if "`e(model)'"=="iv" { + local title2 "IV (2SLS) estimation" + } + else if "`e(model)'"=="liml" { + local title2 "LIML estimation" + } + else if "`e(model)'"=="kclass" { + local title2 "k-class estimation" + } + else { +* Should never reach here + local title2 "unknown estimation" + } + if "`e(vcetype)'" == "Robust" { + local hacsubtitle1 "heteroskedasticity" + } + if "`e(kernel)'"!="" & "`e(clustvar)'"=="" { + local hacsubtitle3 "autocorrelation" + } + if "`kiefer'"!="" { + local hacsubtitle3 "within-cluster autocorrelation (Kiefer)" + } + if "`e(clustvar)'"!="" { + if "`e(clustvar2)'"=="" { + local hacsubtitle3 "clustering on `e(clustvar)'" + } + else { + local hacsubtitle3 "clustering on `e(clustvar1)' and `e(clustvar2)'" + } + if "`e(kernel)'" != "" { + local hacsubtitle4 "and kernel-robust to common correlated disturbances (Driscoll-Kraay)" + } + } + if "`hacsubtitle1'"~="" & "`hacsubtitle3'" ~= "" { + local hacsubtitle2 " and " + } + if "`title'"=="" { + ereturn local title "`title1'`title2'" + } + else { + ereturn local title "`title'" + } + if "`subtitle'"~="" { + ereturn local subtitle "`subtitle'" + } + local hacsubtitle "`hacsubtitle1'`hacsubtitle2'`hacsubtitle3'" + if "`b0'"~="" { + ereturn local hacsubtitleB "Estimates based on supplied parameter vector" + } + else if "`hacsubtitle'"~="" & "`gmm2s'`cue'"~="" { + ereturn local hacsubtitleB "Estimates efficient for arbitrary `hacsubtitle'" + } + else if "`wmatrix'"~="" { + ereturn local hacsubtitleB "Efficiency of estimates dependent on weighting matrix" + } + else { + ereturn local hacsubtitleB "Estimates efficient for homoskedasticity only" + } + if "`hacsubtitle'"~="" { + ereturn local hacsubtitleV "Statistics robust to `hacsubtitle'" + } + else { + ereturn local hacsubtitleV "Statistics consistent for homoskedasticity only" + } + if "`hacsubtitle4'"~="" { + ereturn local hacsubtitleV2 "`hacsubtitle4'" + } + if "`sw'"~="" { + ereturn local hacsubtitleV "Stock-Watson heteroskedastic-robust statistics (BETA VERSION)" + } + } + +******************************************************************************************* +* Display results unless ivreg2 called just to generate stats or nooutput option + + if "`nooutput'" == "" { + +// Display supplementary first-stage/RF results + if "`savesfirst'`saverf'`savefirst'" != "" { + DispStored `"`savesfirst'"' `"`saverf'"' `"`savefirst'"' + } + if "`rf'" != "" { + local eqname "`e(rfeq)'" + tempname ivest + _estimates hold `ivest', copy + capture estimates restore `eqname' + if _rc != 0 { +di +di in ye "Unable to display stored reduced form estimation." +di + } + else { + DispSFirst "rf" `"`plus'"' `"`level'"' `"`nofooter'"' `"`ivreg2name'"' "`dispopt'" + } + _estimates unhold `ivest' + } + if "`first'" != "" { + DispFirst `"`ivreg2name'"' + } + if "`sfirst'"!="" { + local eqname "`e(sfirsteq)'" + tempname ivest + _estimates hold `ivest', copy + capture estimates restore `eqname' + if _rc != 0 { +di +di in ye "Unable to display stored first-stage/reduced form estimations." +di + } + else { + DispSFirst "sfirst" `"`plus'"' `"`level'"' `"`nofooter'"' `"`ivreg2name'"' "`dispopt'" + } + _estimates unhold `ivest' + } + if "`first'`ffirst'`sfirst'" != "" { + DispFFirst `"`ivreg2name'"' + } + +// Display main output. Can be standard ivreg2, or first-stage-type results + if "`e(model)'"=="first" | "`e(model)'"=="rf" | "`e(model)'"=="sfirst" { + DispSFirst "`e(model)'" `"`plus'"' `"`level'"' `"`nofooter'"' `"`ivreg2name'"' "`dispopt'" + } + else { + DispMain `"`noheader'"' `"`plus'"' `"`level'"' `"`nofooter'"' `"`ivreg2name'"' "`dispopt'" + } + } + +// Drop first stage estimations unless explicitly saved or if replay + if "`savefirst'" == "" { + local firsteqs "`e(firsteqs)'" + foreach eqname of local firsteqs { + capture estimates drop `eqname' + } + ereturn local firsteqs + } +// Drop reduced form estimation unless explicitly saved or if replay + if "`saverf'" == "" { + local eqname "`e(rfeq)'" + capture estimates drop `eqname' + ereturn local rfeq + } +// Drop first stage/reduced form estimation unless explicitly saved or if replay + if "`savesfirst'" == "" { + local eqname "`e(sfirsteq)'" + capture estimates drop `eqname' + ereturn local sfirsteq + } + +end + +******************************************************************************************* +* SUBROUTINES +******************************************************************************************* + +// ************* Display system of or single first-stage and/or RF estimations ************ // + +program define DispSFirst, eclass + args model plus level nofooter helpfile dispopt + version 11.2 + +di + if "`model'"=="first" { +di in gr "First-stage regression of `e(depvar)':" + } + else if "`model'"=="rf" { + local strlen = length("`e(depvar)'")+25 +di in gr "Reduced-form regression: `e(depvar)'" +di in smcl in gr "{hline `strlen'}" + } + else if "`model'"=="sfirst" { +di in gr "System of first-stage/reduced-form regressions:" +di in smcl in gr "{hline 47}" + } + +// Display coefficients etc. +// Header info + if "`e(hacsubtitleV)'" ~= "" { +di in gr _n "`e(hacsubtitleV)'" + } + if "`e(hacsubtitleV2)'" ~= "" { +di in gr "`e(hacsubtitleV2)'" + } +di in gr "Number of obs = " _col(31) in ye %8.0f e(N) + if "`e(kernel)'"!="" { +di in gr " kernel=`e(kernel)'; bandwidth=" `e(bw)' + if "`e(bwchoice)'"!="" { +di in gr " `e(bwchoice)'" + } +di in gr " time variable (t): " in ye e(tvar) + if "`e(ivar)'" != "" { +di in gr " group variable (i): " in ye e(ivar) + } + } + if "`e(clustvar)'"!="" { + if "`e(clustvar2)'"=="" { + local N_clust `e(N_clust)' + local clustvar `e(clustvar)' + } + else { + local N_clust `e(N_clust1)' + local clustvar `e(clustvar1)' + } +di in gr "Number of clusters (`clustvar') = " _col(33) in ye %6.0f `N_clust' + } + if "`e(clustvar2)'"!="" { +di in gr "Number of clusters (" "`e(clustvar2)'" ") = " _col(33) in ye %6.0f e(N_clust2) + } + +// Unfortunate but necessary hack here: to suppress message about cluster adjustment of +// standard error, clear e(clustvar) and then reset it after display + local cluster `e(clustvar)' + ereturn local clustvar + +// Display output + ereturn display, `plus' level(`level') `dispopt' + ereturn local clustvar `cluster' + +end + +// ************* Display main estimation outpout ************** // + +program define DispMain, eclass + args noheader plus level nofooter helpfile dispopt + version 11.2 +* Prepare for problem resulting from rank(S) being insufficient +* Results from insuff number of clusters, too many lags in HAC, +* to calculate robust S matrix, HAC matrix not PD, singleton dummy, +* and indicated by missing value for j stat +* Macro `rprob' is either 1 (problem) or 0 (no problem) + capture local rprob ("`e(j)'"==".") + + if "`noheader'"=="" { + if "`e(title)'" ~= "" { +di in gr _n "`e(title)'" + local tlen=length("`e(title)'") +di in gr "{hline `tlen'}" + } + if "`e(subtitle)'" ~= "" { +di in gr "`e(subtitle)'" + } + if "`e(model)'"=="liml" | "`e(model)'"=="kclass" { +di in gr "k =" %7.5f `e(kclass)' + } + if "`e(model)'"=="liml" { +di in gr "lambda =" %7.5f `e(lambda)' + } + if e(fuller) > 0 & e(fuller) < . { +di in gr "Fuller parameter=" %-5.0f `e(fuller)' + } + if "`e(hacsubtitleB)'" ~= "" { +di in gr _n "`e(hacsubtitleB)'" _c + } + if "`e(hacsubtitleV)'" ~= "" { +di in gr _n "`e(hacsubtitleV)'" + } + if "`e(hacsubtitleV2)'" ~= "" { +di in gr "`e(hacsubtitleV2)'" + } + if "`e(kernel)'"!="" { +di in gr " kernel=`e(kernel)'; bandwidth=" `e(bw)' + if "`e(bwchoice)'"!="" { +di in gr " `e(bwchoice)'" + } +di in gr " time variable (t): " in ye e(tvar) + if "`e(ivar)'" != "" { +di in gr " group variable (i): " in ye e(ivar) + } + } + di + if "`e(clustvar)'"!="" { + if "`e(clustvar2)'"=="" { + local N_clust `e(N_clust)' + local clustvar `e(clustvar)' + } + else { + local N_clust `e(N_clust1)' + local clustvar `e(clustvar1)' + } +di in gr "Number of clusters (`clustvar') = " _col(33) in ye %6.0f `N_clust' _continue + } +di in gr _col(55) "Number of obs = " in ye %8.0f e(N) + if "`e(clustvar2)'"!="" { +di in gr "Number of clusters (" "`e(clustvar2)'" ") = " _col(33) in ye %6.0f e(N_clust2) _continue + } +di in gr _c _col(55) "F(" %3.0f e(Fdf1) "," %6.0f e(Fdf2) ") = " + if e(F) < 99999 { +di in ye %8.2f e(F) + } + else { +di in ye %8.2e e(F) + } +di in gr _col(55) "Prob > F = " in ye %8.4f e(Fp) + +di in gr "Total (centered) SS = " in ye %12.0g e(yyc) _continue +di in gr _col(55) "Centered R2 = " in ye %8.4f e(r2c) +di in gr "Total (uncentered) SS = " in ye %12.0g e(yy) _continue +di in gr _col(55) "Uncentered R2 = " in ye %8.4f e(r2u) +di in gr "Residual SS = " in ye %12.0g e(rss) _continue +di in gr _col(55) "Root MSE = " in ye %8.4g e(rmse) +di + } + +* Display coefficients etc. +* Unfortunate but necessary hack here: to suppress message about cluster adjustment of +* standard error, clear e(clustvar) and then reset it after display + local cluster `e(clustvar)' + ereturn local clustvar + ereturn display, `plus' level(`level') `dispopt' + ereturn local clustvar `cluster' + +* Display 1st footer with identification stats +* Footer not displayed if -nofooter- option or if pure OLS, i.e., model="ols" and Sargan-Hansen=0 + if ~("`nofooter'"~="" | (e(model)=="ols" & (e(sargan)==0 | e(j)==0))) { + +* Under ID test + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##idtest:Underidentification test}" + if "`e(vcetype)'`e(kernel)'"=="" { +di in gr _c " (Anderson canon. corr. LM statistic):" + } + else { +di in gr _c " (Kleibergen-Paap rk LM statistic):" + } +di in ye _col(71) %8.3f e(idstat) +di in gr _col(52) "Chi-sq(" in ye e(iddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(idp) +* IV redundancy statistic + if "`e(redlist)'"!="" { +di in gr "-redundant- option:" +di in smcl _c "{help `helpfile'##redtest:IV redundancy test}" +di in gr _c " (LM test of redundancy of specified instruments):" +di in ye _col(71) %8.3f e(redstat) +di in gr _col(52) "Chi-sq(" in ye e(reddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(redp) +di in gr "Instruments tested: " _c + Disp `e(redlist)', _col(23) + } +di in smcl in gr "{hline 78}" + } +* Report Cragg-Donald statistic + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##widtest:Weak identification test}" +di in gr " (Cragg-Donald Wald F statistic):" in ye _col(71) %8.3f e(cdf) + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr " (Kleibergen-Paap rk Wald F statistic):" in ye _col(71) %8.3f e(widstat) + } +di in gr _c "Stock-Yogo weak ID test critical values:" + Disp_cdsy, model(`e(model)') k2(`e(exexog_ct)') nendog(`e(endog_ct)') fuller("`e(fuller)'") col1(42) col2(73) + if `r(cdmissing)' { + di in gr _col(64) "" + } + else { + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." + } + } + di in smcl in gr "{hline 78}" + } + +* Report either (a) Sargan-Hansen-C stats, or (b) robust covariance matrix problem +* e(model)="gmmw" means user-supplied weighting matrix and Hansen J using 2nd-step resids reported + if `rprob' == 0 { +* Display overid statistic + if "`e(vcetype)'" == "Robust" | "`e(model)'" == "gmmw" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } + else { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } +di in ye _col(71) %8.3f e(j) + if e(jdf) { +di in gr _col(52) "Chi-sq(" in ye e(jdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(jp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + +* Display orthog option: C statistic (difference of Sargan statistics) + if e(cstat) != . { +* If C-stat = 0 then warn, otherwise output + if e(cstat) > 0 { +di in gr "-orthog- option:" + if "`e(vcetype)'" == "Robust" { +di in gr _c "Hansen J statistic (eqn. excluding suspect orthog. conditions): " + } + else { +di in gr _c "Sargan statistic (eqn. excluding suspect orthogonality conditions):" + } +di in ye _col(71) %8.3f e(j)-e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(jdf)-e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f chiprob(e(jdf)-e(cstatdf),e(j)-e(cstat)) +di in smcl _c "{help `helpfile'##ctest:C statistic}" +di in gr _c " (exogeneity/orthogonality of suspect instruments): " +di in ye _col(71) %8.3f e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f e(cstatp) +di in gr "Instruments tested: " _c + Disp `e(clist)', _col(23) + } + if e(cstat) == 0 { +di in gr _n "Collinearity/identification problems in eqn. excl. suspect orthog. conditions:" +di in gr " C statistic not calculated for -orthog- option" + } + } + } + else { +* Problem exists with robust VCV - notify and list possible causes +di in r "Warning: estimated covariance matrix of moment conditions not of full rank." + if e(j)==. { +di in r " overidentification statistic not reported, and standard errors and" + } +di in r " model tests should be interpreted with caution." +di in r "Possible causes:" + if e(nocollin) { +di in r " collinearities in regressors or instruments (with -nocollin- option)" + } + if "`e(N_clust)'" != "" { +di in r " number of clusters insufficient to calculate robust covariance matrix" + } + if "`e(kernel)'" != "" { +di in r " covariance matrix of moment conditions not positive definite" +di in r " covariance matrix uses too many lags" + } +di in r " singleton dummy variable (dummy with one 1 and N-1 0s or vice versa)" +di in r in smcl _c "{help `helpfile'##partial:partial}" +di in r " option may address problem." + } + +* Display endog option: endogeneity test statistic + if e(estat) != . { +* If stat = 0 then warn, otherwise output + if e(estat) > 0 { +di in gr "-endog- option:" +di in smcl _c "{help `helpfile'##endogtest:Endogeneity test}" +di in gr _c " of endogenous regressors: " +di in ye _col(71) %8.3f e(estat) +di in gr _col(52) "Chi-sq(" in ye e(estatdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(estatp) +di in gr "Regressors tested: " _c + Disp `e(elist)', _col(23) + } + if e(estat) == 0 { +di in gr _n "Collinearity/identification problems in restricted equation:" +di in gr " Endogeneity test statistic not calculated for -endog- option" + } + } + + di in smcl in gr "{hline 78}" +* Display AR overid statistic if LIML and not robust + if "`e(model)'" == "liml" & "`e(vcetype)'" ~= "Robust" & "`e(kernel)'" == "" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (LR test of excluded instruments):" + } +di in ye _col(72) %7.3f e(arubin) + if e(arubindf) { +di in gr _col(52) "Chi-sq(" in ye e(arubindf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(arubinp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + di in smcl in gr "{hline 78}" + } + } + +* Display 2nd footer with variable lists + if "`nofooter'"=="" { + +* Warn about dropped instruments if any +* Can happen with nocollin option and rank(S) < cols(S) + if colsof(e(S)) > e(rankzz) { +di in gr "Collinearities detected among instruments: " _c +di in gr colsof(e(S))-e(rankzz) " instrument(s) dropped" + } + + if "`e(collin)'`e(dups)'" != "" | e(partial_ct) { +* If collinearities, duplicates or partial, abbreviated varlists saved with a 1 at the end + local one "1" + } + if e(endog_ct) { + di in gr "Instrumented:" _c + Disp `e(instd`one')', _col(23) + } + if e(inexog_ct) { + di in gr "Included instruments:" _c + Disp `e(inexog`one')', _col(23) + } + if e(exexog_ct) { + di in gr "Excluded instruments:" _c + Disp `e(exexog`one')', _col(23) + } + if e(partial_ct) { + if e(partialcons) { + local partial "`e(partial`one')' _cons" + } + else { + local partial "`e(partial`one')'" + } +di in smcl _c "{help `helpfile'##partial:Partialled-out}" + di in gr ":" _c + Disp `partial', _col(23) + if "`e(partialsmall)'"=="" { +di in gr _col(23) "nb: total SS, model F and R2s are after partialling-out;" +di in gr _col(23) " any {help `helpfile'##s_small:small-sample adjustments} do not include" +di in gr _col(23) " partialled-out variables in regressor count K" + } + else { +di in gr _col(23) "nb: total SS, model F and R2s are after partialling-out;" +di in gr _col(23) " any {help `helpfile'##s_small:small-sample adjustments} include partialled-out" +di in gr _col(23) " variables in regressor count K" + } + } + if "`e(dups)'" != "" { + di in gr "Duplicates:" _c + Disp `e(dups)', _col(23) + } + if "`e(collin)'" != "" { + di in gr "Dropped collinear:" _c + Disp `e(collin)', _col(23) + } + if "`e(ecollin)'" != "" { + di in gr "Reclassified as exog:" _c + Disp `e(ecollin)', _col(23) + } + di in smcl in gr "{hline 78}" + } +end + +************************************************************************************** + +// ************ Display collinearity and duplicates warning messages ************ // + +program define DispCollinDups + version 11.2 + if "`e(dups)'" != "" { +di in gr "Warning - duplicate variables detected" +di in gr "Duplicates:" _c + Disp `e(dups)', _col(16) + } + if "`e(collin)'" != "" { +di in gr "Warning - collinearities detected" +di in gr "Vars dropped:" _c + Disp `e(collin)', _col(16) + } +end + +// ************* Display all first-stage estimations ************ // + +program define DispFirst + version 11.2 + args helpfile + tempname firstmat ivest sheapr2 pr2 F df df_r pvalue + tempname SWF SWFdf1 SWFdf2 SWFp SWr2 + + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display first-stage estimates; macro e(first) is missing" + exit + } +di in gr _newline "First-stage regressions" +di in smcl in gr "{hline 23}" +di + local endo1 : colnames(`firstmat') + local nrvars : word count `endo1' + local firsteqs "`e(firsteqs)'" + local nreqs : word count `firsteqs' + if `nreqs' < `nrvars' { +di in ye "Unable to display all first-stage regressions." +di in ye "There may be insufficient room to store results using -estimates store-," +di in ye "or names of endogenous regressors may be too long to store the results." +di in ye "Try dropping one or more estimation results using -estimates drop-," +di in ye "using the -savefprefix- option, or using shorter variable names." +di + } + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + foreach eqname of local firsteqs { + _estimates hold `ivest' + capture estimates restore `eqname' + if _rc != 0 { +di +di in ye "Unable to list stored estimation `eqname'." +di in ye "There may be insufficient room to store results using -estimates store-," +di in ye "or names of endogenous regressors may be too long to store the results." +di in ye "Try dropping one or more estimation results using -estimates drop-," +di in ye "using the -savefprefix- option, or using shorter variable names." +di + } + else { + local vn "`e(depvar)'" + estimates replay `eqname', noheader + mat `sheapr2' =`firstmat'["sheapr2","`vn'"] + mat `pr2' =`firstmat'["pr2","`vn'"] + mat `F' =`firstmat'["F","`vn'"] + mat `df' =`firstmat'["df","`vn'"] + mat `df_r' =`firstmat'["df_r","`vn'"] + mat `pvalue' =`firstmat'["pvalue","`vn'"] + mat `SWF' =`firstmat'["SWF","`vn'"] + mat `SWFdf1' =`firstmat'["SWFdf1","`vn'"] + mat `SWFdf2' =`firstmat'["SWFdf2","`vn'"] + mat `SWFp' =`firstmat'["SWFp","`vn'"] + mat `SWr2' =`firstmat'["SWr2","`vn'"] + +di in gr "F test of excluded instruments:" +di in gr " F(" %3.0f `df'[1,1] "," %6.0f `df_r'[1,1] ") = " in ye %8.2f `F'[1,1] +di in gr " Prob > F = " in ye %8.4f `pvalue'[1,1] + +di in smcl "{help `helpfile'##swstats:Sanderson-Windmeijer multivariate F test of excluded instruments:}" +di in gr " F(" %3.0f `SWFdf1'[1,1] "," %6.0f `SWFdf2'[1,1] ") = " in ye %8.2f `SWF'[1,1] +di in gr " Prob > F = " in ye %8.4f `SWFp'[1,1] + +di + } + _estimates unhold `ivest' + } +end + +// ************* Display list of stored first-stage and RF estimations ************ // + +program define DispStored + args savesfirst saverf savefirst + version 11.2 + + if "`savesfirst'" != "" { + local eqlist "`e(sfirsteq)'" + } + if "`saverf'" != "" { + local eqlist "`eqlist' `e(rfeq)'" + } + if "`savefirst'" != "" { + local eqlist "`eqlist' `e(firsteqs)'" + } + local eqlist : list retokenize eqlist + +di in gr _newline "Stored estimation results" +di in smcl in gr "{hline 25}" _c + capture estimates dir `eqlist' + if "`eqlist'" != "" & _rc == 0 { +// Estimates exist and can be listed + estimates dir `eqlist' + } + else if "`eqlist'" != "" & _rc != 0 { +di +di in ye "Unable to list stored estimations." +di + } +end + +// ************* Display summary first-stage and ID test results ************ // + +program define DispFFirst + version 11.2 + args helpfile + tempname firstmat + tempname sheapr2 pr2 F df df_r pvalue + tempname SWF SWFdf1 SWFdf2 SWFp SWchi2 SWchi2p SWr2 + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display summary of first-stage estimates; macro e(first) is missing" + exit + } + local endo : colnames(`firstmat') + local nrvars : word count `endo' + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + local efirsteqs "`e(firsteqs)'" + + mat `df' =`firstmat'["df",1] + mat `df_r' =`firstmat'["df_r",1] + mat `SWFdf1' =`firstmat'["SWFdf1",1] + mat `SWFdf2' =`firstmat'["SWFdf2",1] + +di +di in gr _newline "Summary results for first-stage regressions" +di in smcl in gr "{hline 43}" +di + +di _c in smcl _col(44) "{help `helpfile'##swstats:(Underid)}" +di in smcl _col(65) "{help `helpfile'##swstats:(Weak id)}" + +di _c in gr "Variable |" +di _c in smcl _col(16) "{help `helpfile'##swstats:F}" in gr "(" +di _c in ye _col(17) %3.0f `df'[1,1] in gr "," in ye %6.0f `df_r'[1,1] in gr ") P-val" +di _c in gr _col(37) "|" +di _c in smcl _col(39) "{help `helpfile'##swstats:SW Chi-sq}" in gr "(" +di _c in ye %3.0f `SWFdf1'[1,1] in gr ") P-val" +di _c in gr _col(60) "|" +di _c in smcl _col(62) "{help `helpfile'##swstats:SW F}" in gr "(" +di in ye _col(67) %3.0f `SWFdf1'[1,1] in gr "," in ye %6.0f `SWFdf2'[1,1] in gr ")" + + local i = 1 + foreach vn of local endo { + + mat `sheapr2' =`firstmat'["sheapr2","`vn'"] + mat `pr2' =`firstmat'["pr2","`vn'"] + mat `F' =`firstmat'["F","`vn'"] + mat `df' =`firstmat'["df","`vn'"] + mat `df_r' =`firstmat'["df_r","`vn'"] + mat `pvalue' =`firstmat'["pvalue","`vn'"] + mat `SWF' =`firstmat'["SWF","`vn'"] + mat `SWFdf1' =`firstmat'["SWFdf1","`vn'"] + mat `SWFdf2' =`firstmat'["SWFdf2","`vn'"] + mat `SWFp' =`firstmat'["SWFp","`vn'"] + mat `SWchi2' =`firstmat'["SWchi2","`vn'"] + mat `SWchi2p' =`firstmat'["SWchi2p","`vn'"] + mat `SWr2' =`firstmat'["SWr2","`vn'"] + + local vnlen : length local vn + if `vnlen' > 12 { + local vn : piece 1 12 of "`vn'" + } +di _c in y %-12s "`vn'" _col(14) in gr "|" _col(18) in y %8.2f `F'[1,1] +di _c _col(28) in y %8.4f `pvalue'[1,1] +di _c _col(37) in g "|" _col(42) in y %8.2f `SWchi2'[1,1] _col(51) in y %8.4f `SWchi2p'[1,1] +di _col(60) in g "|" _col(65) in y %8.2f `SWF'[1,1] + local i = `i' + 1 + } +di + + if "`robust'`cluster'" != "" { + if "`cluster'" != "" { + local rtype "cluster-robust" + } + else if "`kernel'" != "" { + local rtype "heteroskedasticity and autocorrelation-robust" + } + else { + local rtype "heteroskedasticity-robust" + } + } + else if "`kernel'" != "" { + local rtype "autocorrelation-robust" + } + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: first-stage test statistics `rtype'" +di + } + + local k2 = `SWFdf1'[1,1] +di in gr "Stock-Yogo weak ID F test critical values for single endogenous regressor:" + Disp_cdsy, model(`e(model)') k2(`e(exexog_ct)') nendog(1) fuller("`e(fuller)'") col1(36) col2(67) + if `r(cdmissing)' { + di in gr _col(64) "" + } + else { + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(model)'"=="iv" & "`e(vcetype)'`e(kernel)'"=="" { +di in gr "NB: Critical values are for Sanderson-Windmeijer F statistic." + } + else { +di in gr "NB: Critical values are for i.i.d. errors only." + } +di + } + +* Check that SW chi-sq and F denominator are correct and = underid test dof + if e(iddf)~=`SWFdf1'[1,1] { +di in red "Warning: Error in calculating first-stage id statistics above;" +di in red " dof of SW statistics is " `SWFdf1'[1,1] ", should be L-(K-1)=`e(iddf)'." + } + + tempname iddf idstat idp widstat cdf rkf + scalar `iddf'=e(iddf) + scalar `idstat'=e(idstat) + scalar `idp'=e(idp) + scalar `widstat'=e(widstat) + scalar `cdf'=e(cdf) + capture scalar `rkf'=e(rkf) +di in smcl "{help `helpfile'##idtest:Underidentification test}" +di in gr "Ho: matrix of reduced form coefficients has rank=K1-1 (underidentified)" +di in gr "Ha: matrix has rank=K1 (identified)" + if "`robust'`kernel'"=="" { +di in ye "Anderson canon. corr. LM statistic" _c + } + else { +di in ye "Kleibergen-Paap rk LM statistic" _c + } +di in gr _col(42) "Chi-sq(" in ye `iddf' in gr ")=" %-7.2f in ye `idstat' /* + */ _col(61) in gr "P-val=" %6.4f in ye `idp' + +di +di in smcl "{help `helpfile'##widtest:Weak identification test}" +di in gr "Ho: equation is weakly identified" +di in ye "Cragg-Donald Wald F statistic" _col(65) %8.2f `cdf' + if "`robust'`kernel'"~="" { +di in ye "Kleibergen-Paap Wald rk F statistic" _col(65) %8.2f `rkf' + } +di + +di in gr "Stock-Yogo weak ID test critical values for K1=`e(endog_ct)' and L1=`e(exexog_ct)':" + Disp_cdsy, model(`e(model)') k2(`e(exexog_ct)') nendog(`e(endog_ct)') fuller("`e(fuller)'") col1(36) col2(67) + if `r(cdmissing)' { + di in gr _col(64) "" + } + else { + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." + } + } +di + + tempname arf arfp archi2 archi2p ardf ardf_r + tempname sstat sstatp sstatdf +di in smcl "{help `helpfile'##wirobust:Weak-instrument-robust inference}" +di in gr "Tests of joint significance of endogenous regressors B1 in main equation" +di in gr "Ho: B1=0 and orthogonality conditions are valid" +* Needs to be small so that adjusted dof is reflected in F stat + scalar `arf'=e(arf) + scalar `arfp'=e(arfp) + scalar `archi2'=e(archi2) + scalar `archi2p'=e(archi2p) + scalar `ardf'=e(ardf) + scalar `ardf_r'=e(ardf_r) + scalar `sstat'=e(sstat) + scalar `sstatp'=e(sstatp) + scalar `sstatdf'=e(sstatdf) +di in ye _c "Anderson-Rubin Wald test" +di in gr _col(36) "F(" in ye `ardf' in gr "," in ye `ardf_r' in gr ")=" /* + */ _col(49) in ye %7.2f `arf' _col(61) in gr "P-val=" in ye %6.4f `arfp' +di in ye _c "Anderson-Rubin Wald test" +di in gr _col(36) "Chi-sq(" in ye `ardf' in gr ")=" /* + */ _col(49) in ye %7.2f `archi2' _col(61) in gr "P-val=" in ye %6.4f `archi2p' +di in ye _c "Stock-Wright LM S statistic" +di in gr _col(36) "Chi-sq(" in ye `sstatdf' in gr ")=" /* + */ _col(49) in ye %7.2f `sstat' _col(61) in gr "P-val=" in ye %6.4f `sstatp' +di + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: Underidentification, weak identification and weak-identification-robust" +di in gr " test statistics `rtype'" +di + } + + if "`cluster'" != "" & "`e(clustvar2)'"=="" { +di in gr "Number of clusters N_clust = " in ye %10.0f e(N_clust) + } + else if "`e(clustvar2)'" ~= "" { +di in gr "Number of clusters (1) N_clust1 = " in ye %10.0f e(N_clust1) +di in gr "Number of clusters (2) N_clust2 = " in ye %10.0f e(N_clust2) + } +di in gr "Number of observations N = " in ye %10.0f e(N) +di in gr "Number of regressors K = " in ye %10.0f e(rankxx) +di in gr "Number of endogenous regressors K1 = " in ye %10.0f e(endog_ct) +di in gr "Number of instruments L = " in ye %10.0f e(rankzz) +di in gr "Number of excluded instruments L1 = " in ye %10.0f e(ardf) + if "`e(partial)'" != "" { +di in gr "Number of partialled-out regressors/IVs = " in ye %10.0f e(partial_ct) +di in gr "NB: K & L do not included partialled-out variables" + } + +end + +// ************* Post first-stage and/or RF estimations ************ // + +program define PostFirstRF, eclass + version 11.2 + syntax [if] /// + [ , /// + first(string) /// can be fv + rf /// omit first(.) and rf => post system of eqns + rmse_rf(real 0) /// + bmat(name) /// + vmat(name) /// + smat(name) /// + firstmat(name) /// + lhs1(string) /// can be fv + endo1(string) /// + znames0(string) /// + znames1(string) /// + bvclean(integer 0) /// + fvops(integer 0) /// + partial_ct(integer 0) /// + robust /// + cluster(string) /// + cluster1(string) /// + cluster2(string) /// + nc(integer 0) /// + nc1(integer 0) /// + nc2(integer 0) /// + kernel(string) /// + bw(real 0) /// + ivar(name) /// + tvar(name) /// + obs(integer 0) /// + iv1_ct(integer 0) /// + cons(integer 0) /// + partialcons(integer 0) /// + dofminus(integer 0) /// + sdofminus(integer 0) /// + ] + +// renaming/copying + local N = `obs' + local N_clust = `nc' + local N_clust1 = `nc1' + local N_clust2 = `nc2' + tempname b V S + mat `b' = `bmat' + mat `V' = `vmat' + mat `S' = `smat' + + marksample touse + + mat colname `b' = `lhs1' `endo1' + mat rowname `b' = `znames1' + mat `b' = vec(`b') + mat `b' = `b'' + mat colname `V' = `: colfullnames `b'' + mat rowname `V' = `: colfullnames `b'' + mat colname `S' = `: colfullnames `b'' + mat rowname `S' = `: colfullnames `b'' + + if "`cluster'"=="" { + matrix `V'=`V'*(`N'-`dofminus')/(`N'-`iv1_ct'-`dofminus'-`sdofminus') + } + else { + matrix `V'=`V'*(`N'-1)/(`N'-`iv1_ct'-`sdofminus') /// + * `N_clust'/(`N_clust'-1) + } + +// If RF or first-stage estimation required, extract it +// also set macros for model and depvar + if "`rf'`first'"~="" { + if "`rf'"~="" { // RF + local vnum = 0 + local model rf + local depvar `lhs1' + local rmse = `rmse_rf' + } + else { // first-stage + local vnum : list posof "`first'" in endo1 + local vnum = `vnum' + local model first + local depvar `first' + local rmse = el(`firstmat', rownumb(`firstmat',"rmse"), colnumb(`firstmat',"`first'")) + } + local c0 = 1 + `vnum'*`iv1_ct' + local c1 = (`vnum'+1)*`iv1_ct' + mat `b' = `b'[1,`c0'..`c1'] + mat `V' = `V'[`c0'..`c1',`c0'..`c1'] + mat `S' = `S'[`c0'..`c1',`c0'..`c1'] + mat coleq `b' = "" + mat coleq `V' = "" + mat roweq `V' = "" + mat coleq `S' = "" + mat roweq `S' = "" + } + else { + local model sfirst + local eqlist `lhs1' `endo1' + } + +// reinsert omitteds etc. unless requested not to +// eqlist empty unless first-stage/rf system + if ~`bvclean' { + AddOmitted, bmat(`b') vmat(`V') cnb0(`znames0') cnb1(`znames1') eqlist(`eqlist') + mat `b' = r(b) + mat `V' = r(V) +// build fv info (base, empty, etc.) unless there was partialling out + if `fvops' & ~`partial_ct' { + local bfv "buildfvinfo" + } + } + + local dof = `N' - `iv1_ct' - `dofminus' - `sdofminus' + ereturn post `b' `V', obs(`obs') esample(`touse') dof(`dof') depname(`depvar') `bfv' + +// saved RF/first-stage equation scalars + if "`rf'`first'"~="" { + ereturn scalar rmse = `rmse' + ereturn scalar df_r = `dof' + ereturn scalar df_m = `iv1_ct' - `cons' + `sdofminus' - `partialcons' + } + ereturn scalar k_eq = `: word count `endo1'' + ereturn local cmd ivreg2 + ereturn local model `model' + ereturn matrix S `S' + + if "`kernel'"!="" { + ereturn local kernel "`kernel'" + ereturn scalar bw=`bw' + ereturn local tvar "`tvar'" + if "`ivar'" ~= "" { + ereturn local ivar "`ivar'" + } + } + + if "`robust'" != "" { + local vce "robust" + } + if "`cluster1'" != "" { + if "`cluster2'"=="" { + local vce "`vce' cluster" + } + else { + local vce "`vce' two-way cluster" + } + } + if "`kernel'" != "" { + if "`robust'" != "" { + local vce "`vce' hac" + } + else { + local vce "`vce' ac" + } + local vce "`vce' `kernel' bw=`bw'" + } + + local vce : list clean vce + local vce = lower("`vce'") + ereturn local vce `vce' + + if "`cluster'"!="" { + ereturn scalar N_clust=`N_clust' + ereturn local clustvar `cluster' + } + if "`cluster2'"!="" { + ereturn scalar N_clust1=`N_clust1' + ereturn scalar N_clust2=`N_clust2' + ereturn local clustvar1 `cluster1' + ereturn local clustvar2 `cluster2' + } + + if "`robust'`cluster'" != "" { + ereturn local vcetype "Robust" + } + +// Assemble output titles + if "`e(vcetype)'" == "Robust" { + local hacsubtitle1 "heteroskedasticity" + } + if "`e(kernel)'"!="" & "`e(clustvar)'"=="" { + local hacsubtitle3 "autocorrelation" + } + if "`kiefer'"!="" { + local hacsubtitle3 "within-cluster autocorrelation (Kiefer)" + } + if "`e(clustvar)'"!="" { + if "`e(clustvar2)'"=="" { + local hacsubtitle3 "clustering on `e(clustvar)'" + } + else { + local hacsubtitle3 "clustering on `e(clustvar1)' and `e(clustvar2)'" + } + if "`e(kernel)'" != "" { + local hacsubtitle4 "and kernel-robust to common correlated disturbances (Driscoll-Kraay)" + } + } + if "`hacsubtitle1'"~="" & "`hacsubtitle3'" ~= "" { + local hacsubtitle2 " and " + } + local hacsubtitle "`hacsubtitle1'`hacsubtitle2'`hacsubtitle3'" + if "`hacsubtitle'"~="" { + ereturn local hacsubtitleV "Statistics robust to `hacsubtitle'" + } + else { + ereturn local hacsubtitleV "Statistics consistent for homoskedasticity only" + } + if "`hacsubtitle4'"~="" { + ereturn local hacsubtitleV2 "`hacsubtitle4'" + } + if "`sw'"~="" { + ereturn local hacsubtitleV "Stock-Watson heteroskedastic-robust statistics (BETA VERSION)" + } + +end + + + +************************************************************************************** +program define IsStop, sclass + /* sic, must do tests one-at-a-time, + * 0, may be very large */ + version 11.2 + if `"`0'"' == "[" { + sret local stop 1 + exit + } + if `"`0'"' == "," { + sret local stop 1 + exit + } + if `"`0'"' == "if" { + sret local stop 1 + exit + } +* per official ivreg 5.1.3 + if substr(`"`0'"',1,3) == "if(" { + sret local stop 1 + exit + } + if `"`0'"' == "in" { + sret local stop 1 + exit + } + if `"`0'"' == "" { + sret local stop 1 + exit + } + else sret local stop 0 +end + +// ************* Display list of variables ************ // + +program define Disp + version 11.2 + syntax [anything] [, _col(integer 15) ] + local maxlen = 80-`_col' + local len = 0 + local first = 1 + foreach vn in `anything' { +* Don't display if base or omitted variable + _ms_parse_parts `vn' + if ~`r(omit)' { + local vnlen : length local vn + if `len'+`vnlen' > `maxlen' { + di + local first = 1 + local len = `vnlen' + } + else { + local len = `len'+`vnlen'+1 + } + if `first' { + local first = 0 + di in gr _col(`_col') "`vn'" _c + } + else { + di in gr " `vn'" _c + } + } + } +* Finish with a newline + di +end + +// *********** Display Cragg-Donald/Stock-Yogo critical values etc. ******** // + +program define Disp_cdsy, rclass + version 11.2 + syntax , col1(integer) col2(integer) model(string) k2(integer) nendog(integer) [ fuller(string) ] + local cdmissing=1 + if "`model'"=="iv" | "`model'"=="gmm2s" | "`model'"=="gmmw" { + cdsy, type(ivbias5) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') " 5% maximal IV relative bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "10% maximal IV relative bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "20% maximal IV relative bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "30% maximal IV relative bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "10% maximal IV size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "15% maximal IV size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "20% maximal IV size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "25% maximal IV size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`model'"=="liml" & "`fuller'"=="") | "`model'"=="cue" { + cdsy, type(limlsize10) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "10% maximal LIML size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "15% maximal LIML size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "20% maximal LIML size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "25% maximal LIML size" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`model'"=="liml" & "`fuller'"~="") { + cdsy, type(fullrel5) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') " 5% maximal Fuller rel. bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "10% maximal Fuller rel. bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "20% maximal Fuller rel. bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "30% maximal Fuller rel. bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') " 5% Fuller maximum bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "10% Fuller maximum bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "20% Fuller maximum bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`k2') nendog(`nendog') + if "`r(cv)'"~="." { + di in gr _col(`col1') "30% Fuller maximum bias" in ye _col(`col2') %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + return scalar cdmissing =`cdmissing' +end + +program define cdsy, rclass + version 11.2 + syntax , type(string) k2(integer) nendog(integer) + +* type() can be ivbias5 (k2<=100, nendog<=3) +* ivbias10 (ditto) +* ivbias20 (ditto) +* ivbias30 (ditto) +* ivsize10 (k2<=100, nendog<=2) +* ivsize15 (ditto) +* ivsize20 (ditto) +* ivsize25 (ditto) +* fullrel5 (ditto) +* fullrel10 (ditto) +* fullrel20 (ditto) +* fullrel30 (ditto) +* fullmax5 (ditto) +* fullmax10 (ditto) +* fullmax20 (ditto) +* fullmax30 (ditto) +* limlsize10 (ditto) +* limlsize15 (ditto) +* limlsize20 (ditto) +* limlsize25 (ditto) + + tempname temp cv + +* Initialize critical value as MV + scalar `cv'=. + + if "`type'"=="ivbias5" { + mata: s_cdsy("`temp'", 1) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias10" { + mata: s_cdsy("`temp'", 2) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias20" { + mata: s_cdsy("`temp'", 3) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias30" { + mata: s_cdsy("`temp'", 4) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + if "`type'"=="ivsize10" { + mata: s_cdsy("`temp'", 5) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize15" { + mata: s_cdsy("`temp'", 6) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize20" { + mata: s_cdsy("`temp'", 7) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize25" { + mata: s_cdsy("`temp'", 8) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel5" { + mata: s_cdsy("`temp'", 9) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel10" { + mata: s_cdsy("`temp'", 10) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel20" { + mata: s_cdsy("`temp'", 11) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel30" { + mata: s_cdsy("`temp'", 12) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax5" { + mata: s_cdsy("`temp'", 13) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax10" { + mata: s_cdsy("`temp'", 14) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax20" { + mata: s_cdsy("`temp'", 15) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax30" { + mata: s_cdsy("`temp'", 16) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize10" { + mata: s_cdsy("`temp'", 17) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize15" { + mata: s_cdsy("`temp'", 18) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize20" { + mata: s_cdsy("`temp'", 19) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize25" { + mata: s_cdsy("`temp'", 20) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + return scalar cv=`cv' +end + +// ***************************** Parse ivreg2 arguments **************** // + +program define ivparse, sclass + version 11.2 + syntax [anything(name=0)] /// + [ , /// + ivreg2name(name) /// + partial(string) /// as string because may have nonvariable in list + fwl(string) /// legacy option + orthog(varlist fv ts) /// + endogtest(varlist fv ts) /// + redundant(varlist fv ts) /// + depname(string) /// + robust /// + cluster(varlist fv ts) /// + bw(string) /// as string because may have noninteger option "auto" + kernel(string) /// + dkraay(integer 0) /// + sw /// + kiefer /// + center /// + NOCONSTANT /// + tvar(varname) /// + ivar(varname) /// + gmm2s /// + gmm /// + cue /// + liml /// + fuller(real 0) /// + kclass(real 0) /// + b0(string) /// + wmatrix(string) /// + NOID /// + savefirst /// + savefprefix(name) /// + saverf /// + saverfprefix(name) /// + savesfirst /// + savesfprefix(name) /// + psd0 /// + psda /// + dofminus(integer 0) /// + NOCOLLIN /// + useqr /// + bvclean /// + eform(string) /// + NOOMITTED /// + vsquish /// + noemptycells /// + baselevels /// + allbaselevels /// + ] + +// TS and FV opts based on option varlists + local tsops = ("`s(tsops)'"=="true") + local fvops = ("`s(fvops)'"=="true") +// useful boolean + local cons =("`noconstant'"=="") + + local n 0 + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + while `s(stop)'==0 { + if "`paren'"=="(" { + local ++n + if `n'>1 { +di as err `"syntax is "(all instrumented variables = instrument variables)""' + exit 198 + } + gettoken p lhs : lhs, parse(" =") + while "`p'"!="=" { + if "`p'"=="" { +di as err `"syntax is "(all instrumented variables = instrument variables)""' +di as er `"the equal sign "=" is required"' + exit 198 + } + local endo `endo' `p' + gettoken p lhs : lhs, parse(" =") + } + local exexog `lhs' + } + else { + local inexog `inexog' `lhs' + } + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + } +// lhs attached to front of inexog + gettoken lhs inexog : inexog + local endo : list retokenize endo + local inexog : list retokenize inexog + local exexog : list retokenize exexog +// If depname not provided (default) name is lhs variable + if "`depname'"=="" { + local depname `lhs' + } + +// partial, including legacy FWL option + local partial `partial' `fwl' +// Need to nonvars "_cons" from list if present +// Also set `partialcons' local to 0/1 +// Need word option so that varnames with cons in them aren't zapped + local partial : subinstr local partial "_cons" "", all count(local partialcons) word + local partial : list retokenize partial + if "`partial'"=="_all" { + local partial `inexog' + } +// constant always partialled out if present in regression and other inexog are being partialled out +// (incompatibilities caught in error-check section below) + if "`partial'"~="" { + local partialcons = (`cons' | `partialcons') + } + +// detect if TS or FV operators used in main varlists +// clear any extraneous sreturn macros first + sreturn clear + local 0 `lhs' `inexog' `endo' `exexog' `partial' + syntax varlist(fv ts) + local tsops = ("`s(tsops)'"=="true") | `tsops' + local fvops = ("`s(fvops)'"=="true") | `fvops' + +// TS operators not allowed with cluster, ivar or tvar. Captured in -syntax-. + if "`tvar'" == "" { + local tvar `_dta[_TStvar]' + } + if "`ivar'" == "" { + local ivar `_dta[_TSpanel]' + } + if "`_dta[_TSdelta]'" == "" { + local tdelta 1 + } + else { // use evaluator since _dta[_TSdelta] can + local tdelta = `_dta[_TSdelta]' // be stored as e.g. +1.0000000000000X+000 + } + + sreturn local lhs `lhs' + sreturn local depname `depname' + sreturn local endo `endo' + sreturn local inexog `inexog' + sreturn local exexog `exexog' + sreturn local partial `partial' + sreturn local cons =`cons' + sreturn local partialcons =`partialcons' + sreturn local tsops =`tsops' + sreturn local fvops =`fvops' + sreturn local tvar `tvar' + sreturn local ivar `ivar' + sreturn local tdelta `tdelta' + sreturn local noid `noid' // can be overriden below + sreturn local liml `liml' // can be overriden below + +//convert to boolean + sreturn local useqr =("`useqr'" ~= "") + +// Cluster and SW imply robust + if "`cluster'`sw'"~="" { + local robust "robust" + } + +// HAC estimation. + +// First dkraay(bw): special case of HAC with clustering +// on time-series var in a panel + kernel-robust + if `dkraay' { + if "`bw'" == "" { + local bw `dkraay' + } + if "`cluster'" == "" { + local cluster `tvar' + } + } +// If bw is omitted, default `bw' is 0. +// bw(.) can be number or "auto" hence arrives as string, but is returned as number +// bw=-1 returned if "auto" +// If bw or kernel supplied, check/set `kernel'. +// Macro `kernel' is also used for indicating HAC in use. +// If bw or kernel not supplied, set bw=0 + if "`bw'" == "" & "`kernel'" == "" { + local bw 0 + } + else { +// Check it's a valid kernel and replace with unabbreviated kernel name; check bw. +// s_vkernel is in livreg2 mlib. + mata: s_vkernel("`kernel'", "`bw'", "`ivar'") + local kernel `r(kernel)' + local bw `r(bw)' // = -1 if bw(auto) option chosen + local tsops = 1 + } +// kiefer = kernel(tru) bw(T) and no robust + if "`kiefer'" ~= "" & "`kernel'" == "" { + local kernel "Truncated" + } + +// Done parsing VCE opts + sreturn local bw `bw' + sreturn local kernel `kernel' + sreturn local robust `robust' + sreturn local cluster `cluster' + if `bw' { + sreturn local bwopt "bw(`bw')" + sreturn local kernopt "kernel(`kernel')" + } +// center arrives as string but is returned as boolean + sreturn local center =("`center'"=="center") + +// Fuller implies LIML + if `fuller' != 0 { + sreturn local liml "liml" + sreturn local fulleropt "fuller(`fuller')" + } + + if `kclass' != 0 { + sreturn local kclassopt "kclass(`kclass')" + } + +// b0 implies noid. + if "`b0'" ~= "" { + sreturn local noid "noid" + } + +// save first, rf + if "`savefprefix'" != "" { // savefprefix implies savefirst + local savefirst "savefirst" + } + else { // default savefprefix is _ivreg2_ + local savefprefix "_`ivreg2name'_" + } + sreturn local savefirst `savefirst' + sreturn local savefprefix `savefprefix' + if "`saverfprefix'" != "" { // saverfprefix implies saverf + local saverf "saverf" + } + else { // default saverfprefix is _ivreg2_ + local saverfprefix "_`ivreg2name'_" + } + sreturn local saverf `saverf' + sreturn local saverfprefix `saverfprefix' + if "`savesfprefix'" != "" { // savesfprefix implies savesfirst + local savesfirst "savesfirst" + } + else { // default saverfprefix is _ivreg2_ + local savesfprefix "_`ivreg2name'_" + } + sreturn local savesfirst `savesfirst' + sreturn local savesfprefix `savesfprefix' + +// Macro psd has either psd0, psda or is empty + sreturn local psd "`psd0'`psda'" + +// dofminus + if `dofminus' { + sreturn local dofmopt dofminus(`dofminus') + } + +// display options + local dispopt eform(`eform') `vsquish' `noomitted' `noemptycells' `baselevels' `allbaselevels' +// now boolean - indicates that omitted and/or base vars should NOT be added to VCV +// automatically triggered by partial + local bvclean = wordcount("`bvclean'") | wordcount("`partial'") | `partialcons' + sreturn local bvclean `bvclean' + sreturn local dispopt `dispopt' + +// ************ ERROR CHECKS ************* // + + if `partialcons' & ~`cons' { +di in r "Error: _cons listed in partial() but equation specifies -noconstant-." + exit 198 + } + if `partialcons' > 1 { +// Just in case of multiple _cons +di in r "Error: _cons listed more than once in partial()." + exit 198 + } + +// User-supplied tvar and ivar checked if consistent with tsset. + if "`tvar'"!="`_dta[_TStvar]'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } + if "`ivar'"!="`_dta[_TSpanel]'" { +di as err "invalid ivar() option - data already -xtset-" + exit 5 + } + +// dkraay + if `dkraay' { + if "`ivar'" == "" | "`tvar'" == "" { +di as err "invalid use of dkraay option - must use tsset panel data" + exit 5 + } + if "`dkraay'" ~= "`bw'" { +di as err "cannot use dkraay(.) and bw(.) options together" + exit 198 + } + if "`cluster'" ~= "`tvar'" { +di as err "invalid use of dkraay option - must cluster on `tvar' (or omit cluster option)" + exit 198 + } + } + +// kiefer VCV = kernel(tru) bw(T) and no robust with tsset data + if "`kiefer'" ~= "" { + if "`ivar'" == "" | "`tvar'" == "" { +di as err "invalid use of kiefer option - must use tsset panel data" + exit 5 + } + if "`robust'" ~= "" { +di as err "incompatible options: kiefer and robust" + exit 198 + } + if "`kernel'" ~= "" & "`kernel'" ~= "Truncated" { +di as err "incompatible options: kiefer and kernel(`kernel')" + exit 198 + } + if (`bw'~=0) { +di as err "incompatible options: kiefer and bw" + exit 198 + } + } + +// sw=Stock-Watson robust SEs + if "`sw'" ~= "" & "`cluster'" ~= "" { +di as err "Stock-Watson robust SEs not supported with -cluster- option" + exit 198 + } + if "`sw'" ~= "" & "`kernel'" ~= "" { +di as err "Stock-Watson robust SEs not supported with -kernel- option" + exit 198 + } + if "`sw'" ~= "" & "`ivar'"=="" { +di as err "Must -xtset- or -tsset- data or specify -ivar- with -sw- option" + exit 198 + } + +// LIML/kclass incompatibilities + if "`liml'`kclassopt'" != "" { + if "`gmm2s'`cue'" != "" { +di as err "GMM estimation not available with LIML or k-class estimators" + exit 198 + } + if `fuller' < 0 { +di as err "invalid Fuller option" + exit 198 + } + if "`liml'" != "" & "`kclassopt'" != "" { +di as err "cannot use liml and kclass options together" + exit 198 + } + if `kclass' < 0 { +di as err "invalid k-class option" + exit 198 + } + } + + if "`gmm2s'" != "" & "`cue'" != "" { +di as err "incompatible options: 2-step efficient gmm and cue gmm" + exit 198 + } + + if "`gmm2s'`cue'" != "" & "`exexog'" == "" { +di as err "option `gmm2s'`cue' invalid: no excluded instruments specified" + exit 102 + } + +// Legacy gmm option + if "`gmm'" ~= "" { +di as err "-gmm- is no longer a supported option; use -gmm2s- with the appropriate option" +di as res " gmm = gmm2s robust" +di as res " gmm robust = gmm2s robust" +di as res " gmm bw() = gmm2s bw()" +di as res " gmm robust bw() = gmm2s robust bw()" +di as res " gmm cluster() = gmm2s cluster()" + exit 198 + } + +// b0 incompatible options. + if "`b0'" ~= "" & "`gmm2s'`cue'`liml'`wmatrix'" ~= "" { +di as err "incompatible options: -b0- and `gmm2s' `cue' `liml' `wmatrix'" + exit 198 + } + if "`b0'" ~= "" & `kclass' ~= 0 { +di as err "incompatible options: -b0- and kclass(`kclass')" + exit 198 + } + + if "`psd0'"~="" & "`psda'"~="" { +di as err "cannot use psd0 and psda options together" + exit 198 + } +end + +// *************** Check varlists for for duplicates and collinearities ***************** // + +program define CheckDupsCollin, sclass + version 11.2 + syntax /// + [ , /// + lhs(string) /// + endo(string) /// + inexog(string) /// + exexog(string) /// + partial(string) /// + orthog(string) /// + endogtest(string) /// + redundant(string) /// + touse(string) /// + wvar(string) /// + wf(real 0) /// + NOCONSTANT /// + NOCOLLIN /// + fvall /// + fvsep /// + ] + + if "`fvall'`fvsep'"=="" { // default, expand RHS and exexog separately + local rhs `endo' `inexog' + foreach vl in lhs rhs exexog { + fvexpand ``vl'' if `touse' + local `vl' `r(varlist)' + } + local allvars `rhs' `exexog' + } + else if "`fvall'"~="" { // expand all 3 varlists as one + fvexpand `lhs' if `touse' + local lhs `r(varlist)' + fvexpand `endo' `inexog' `exexog' if `touse' + local allvars `r(varlist)' + } + else if "`fvsep'"~="" { // expand 3 varlists separately + foreach vl in lhs endo inexog exexog { + fvexpand ``vl'' if `touse' + local `vl' `r(varlist)' + } + local allvars `endo' `inexog' `exexog' + } + else { // shouldn't reach here +di as err "internal ivreg2 err: CheckDupsCollin" + exit 198 + } + +// Create dictionary: `allvars' is list with b/n/o etc., sallvars is stripped version +// NB: lhs is not in dictionary and won't need to recreate it + ivreg2_fvstrip `allvars' + local sallvars `r(varlist)' + +// Create consistent expanded varlists +// (1) expand; (2) strip (since base etc. may be wrong); (3) recreate using dictionary +// NB: matchnames will return unmatched original name if not found in 2nd arg varlist + foreach vl in endo inexog exexog partial orthog endogtest redundant { + fvexpand ``vl'' if `touse' + ivreg2_fvstrip `r(varlist)' + local stripped `r(varlist)' // create stripped version of varlist + matchnames "`stripped'" "`sallvars'" "`allvars'" // match using dictionary + local `vl' `r(names)' // new consistent varlist with correct b/n/o etc. + } + +// Check for duplicates of variables +// (1) inexog > endo +// (2) inexog > exexog +// (3) endo + exexog = inexog, as if it were "perfectly predicted" + local lhs0 `lhs' // create here + local dupsen1 : list dups endo + local dupsin1 : list dups inexog + local dupsex1 : list dups exexog + foreach vl in endo inexog exexog partial orthog endogtest redundant { + local `vl'0 : list uniq `vl' + } +// Remove inexog from endo + local dupsen2 : list endo0 & inexog0 + local endo0 : list endo0 - inexog0 +// Remove inexog from exexog + local dupsex2 : list exexog0 & inexog0 + local exexog0 : list exexog0 - inexog0 +// Remove endo from exexog + local dupsex3 : list exexog0 & endo0 + local exexog0 : list exexog0 - endo0 + local dups "`dupsen1' `dupsex1' `dupsin1' `dupsen2' `dupsex2' `dupsex3'" + local dups : list uniq dups + +// Collinearity checks + +// Need variable counts for "0" varlists +// These do NOT include the constant + local endo0_ct : word count `endo0' + local inexog0_ct : word count `inexog0' + local rhs0_ct : word count `inexog0' `exexog0' + local exexog0_ct : word count `exexog' + + if "`nocollin'" == "" { + +// Needed for ivreg2_rmcollright2 + tempvar normwt + qui gen double `normwt' = `wf' * `wvar' if `touse' + +// Simple case: no endogenous regressors, only included and excluded exogenous + if `endo0_ct'==0 { +// Call ivreg2_rmcollright2 on "0" versions of inexog and exexog +// noexpand since already expanded and don't want inconsistant expansion +// newonly since don't want base vars in collinear list + qui ivreg2_rmcollright2 `inexog0' `exexog0' if `touse', /// + normwt(`normwt') `noconstant' noexpand newonly +// ivreg2_rmcollright2 returns fulll varlist with omitteds marked as omitted, +// so just need to separate the inexog and exexog lists + if `r(k_omitted)' { + local collin `collin' `r(omitted)' + local inexog0 "" + local exexog0 "" + local nvarlist `r(varlist)' + local i 1 + while `i' <= `rhs0_ct' { + local nvar : word `i' of `nvarlist' + if `i' <= `inexog0_ct' { + local inexog0 `inexog0' `nvar' // first batch go into inexog0 + } + else { + local exexog0 `exexog0' `nvar' // remainder go into exexog0 + } + local ++i + } + local inexog0 : list retokenize inexog0 + local exexog0 : list retokenize exexog0 + } + } +// Not-simple case: endogenous regressors + else { + +// 1st pass through - remove intra-endo collinears + qui ivreg2_rmcollright2 `endo0' if `touse', /// + normwt(`normwt') `noconstant' noexpand newonly +// ivreg2_rmcollright2 returns fulll varlist with omitteds marked as omitted, +// so just need to separate the inexog and exexog lists + if `r(k_omitted)' { + local collin `collin' `r(omitted)' + local endo0 `r(varlist)' + } + +// 2nd pass through - good enough unless endog appear as colllinear +// noexpand since already expanded and don't want inconsistent expansion +// newonly since don't want base vars in collinear list + qui ivreg2_rmcollright2 `inexog0' `exexog0' `endo0' if `touse', /// + normwt(`normwt') `noconstant' noexpand newonly + if `r(k_omitted)' { +// Check if any endo are in the collinears. +// If yes, reclassify as inexog, then +// 3rd pass through - and then proceed to process inexog and exexog as above + local ecollin `r(omitted)' + local ecollin : list ecollin - inexog0 + local ecollin : list ecollin - exexog0 + if wordcount("`ecollin'") { +// Collinears in endo, so reclassify as inexog, redo counts and call ivreg2_rmcollright2 again + local endo0 : list endo0 - ecollin + local inexog0 `ecollin' `inexog0' + local inexog0 : list retokenize inexog0 + local endo0_ct : word count `endo0' + local inexog0_ct : word count `inexog0' + local rhs0_ct : word count `inexog0' `exexog0' +// noexpand since already expanded and don't want inconsistant expansion +// newonly since don't want base vars in collinear list + qui ivreg2_rmcollright2 `inexog0' `exexog0' `endo0' if `touse', /// + normwt(`normwt') `noconstant' noexpand newonly + } +// Collinears in inexog or exexog + local collin `collin' `r(omitted)' + local inexog0 "" + local exexog0 "" + local nvarlist `r(varlist)' + local i 1 + while `i' <= `rhs0_ct' { + local nvar : word `i' of `nvarlist' + if `i' <= `inexog0_ct' { + local inexog0 `inexog0' `nvar' + } + else { + local exexog0 `exexog0' `nvar' + } + local ++i + } + local inexog0 : list retokenize inexog0 + local exexog0 : list retokenize exexog0 + } + } + +// Collinearity and duplicates warning messages, if necessary + if "`dups'" != "" { +di in gr "Warning - duplicate variables detected" +di in gr "Duplicates:" _c + Disp `dups', _col(21) + } + if "`ecollin'" != "" { +di in gr "Warning - endogenous variable(s) collinear with instruments" +di in gr "Vars now exogenous:" _c + Disp `ecollin', _col(21) + } + if "`collin'" != "" { +di in gr "Warning - collinearities detected" +di in gr "Vars dropped:" _c + Disp `collin', _col(21) + } + } + +// Last step: process partial0 so that names with o/b/n etc. match inexog0 + if wordcount("`partial0'") { + ivreg2_fvstrip `inexog0' if `touse' + local sinexog0 `r(varlist)' // for inexog dictionary + ivreg2_fvstrip `partial0' if `touse' + local spartial0 `r(varlist)' // for partial dictionary + matchnames "`spartial0'" "`sinexog0'" "`inexog0'" // match using dictionary + local partial0 `r(names)' // new partial0 with matches + local partialcheck : list partial0 - inexog0 // unmatched are still in partial0 + if ("`partialcheck'"~="") { // so catch them +di in r "Error: `partialcheck' listed in partial() but not in list of regressors." + error 198 + } + } +// Completed duplicates and collinearity checks + + foreach vl in lhs endo inexog exexog partial orthog endogtest redundant { + sreturn local `vl' ``vl'' + sreturn local `vl'0 ``vl'0' + } + sreturn local dups `dups' + sreturn local collin `collin' + sreturn local ecollin `ecollin' + +end + +// ******************* Misc error checks *************************** // + +program define CheckMisc, rclass + version 11.2 + syntax /// + [ , /// + rhs1_ct(integer 0) /// + iv1_ct(integer 0) /// + bvector(name) /// + smatrix(name) /// + wmatrix(name) /// + cnb1(string) /// + cnZ1(string) /// + ] + +// Check variable counts + if `rhs1_ct' == 0 { +di as err "error: no regressors specified" + exit 102 + } + if `rhs1_ct' > `iv1_ct' { +di as err "equation not identified; must have at least as many instruments" +di as err "not in the regression as there are instrumented variables" + exit 481 + } + +// Check user-supplied b vector + if "`bvector'" != "" { + tempname b0 +// Rearrange/select columns to mat IV matrix + cap matsort `bvector' "`cnb1'" + matrix `b0'=r(sorted) + local scols = colsof(`b0') + local bcols : word count `cnb1' + if _rc ~= 0 | (`scols'~=`bcols') { +di as err "-b0- option error: supplied b0 columns do not match regressor list" +exit 198 + } + return mat b0 = `b0' + } + +// Check user-supplied S matrix + if "`smatrix'" != "" { + tempname S0 +// Check that smatrix is indeed a matrix + cap mat S0 = `smatrix' + if _rc ~= 0 { +di as err "invalid matrix `smatrix' in smatrix option" +exit _rc + } +// Rearrange/select columns to mat IV matrix + cap matsort `smatrix' "`cnZ1'" + matrix `S0'=r(sorted) + local srows = rowsof(`S0') + local scols = colsof(`S0') + local zcols : word count `cnZ1' + if _rc ~= 0 | (`srows'~=`zcols') | (`scols'~=`zcols') { +di as err "-smatrix- option error: supplied matrix columns/rows do not match IV list" +exit 198 + } + if issymmetric(`S0')==0 { +di as err "-smatrix- option error: supplied matrix is not symmetric" +exit 198 + } + return mat S0 = `S0' + } + +// Check user-supplied W matrix + if "`wmatrix'" != "" { + tempname W0 +// Check that wmatrix is indeed a matrix + cap mat W0 = `wmatrix' + if _rc ~= 0 { +di as err "invalid matrix `wmatrix' in wmatrix option" +exit _rc + } +// Rearrange/select columns to mat IV matrix + cap matsort `wmatrix' "`cnZ1'" + matrix `W0'=r(sorted) + local srows = rowsof(`W0') + local scols = colsof(`W0') + local zcols : word count `cnZ1' + if _rc ~= 0 | (`srows'~=`zcols') | (`scols'~=`zcols') { +di as err "-wmatrix- option error: supplied matrix columns/rows do not match IV list" +exit 198 + } + if issymmetric(`W0')==0 { +di as err "-smatrix- option error: supplied matrix is not symmetric" +exit 198 + } + return mat W0 = `W0' + } +end + + +******************************************************************************* +************************* misc utilities ************************************** +******************************************************************************* + +// internal version of ivreg2_fvstrip 1.01 ms 24march2015 +// takes varlist with possible FVs and strips out b/n/o notation +// returns results in r(varnames) +// optionally also omits omittable FVs +// expand calls fvexpand either on full varlist +// or (with onebyone option) on elements of varlist + +program define ivreg2_fvstrip, rclass + version 11.2 + syntax [anything] [if] , [ dropomit expand onebyone NOIsily ] + if "`expand'"~="" { // force call to fvexpand + if "`onebyone'"=="" { + fvexpand `anything' `if' // single call to fvexpand + local anything `r(varlist)' + } + else { + foreach vn of local anything { + fvexpand `vn' `if' // call fvexpand on items one-by-one + local newlist `newlist' `r(varlist)' + } + local anything : list clean newlist + } + } + foreach vn of local anything { // loop through varnames + if "`dropomit'"~="" { // check & include only if + _ms_parse_parts `vn' // not omitted (b. or o.) + if ~`r(omit)' { + local unstripped `unstripped' `vn' // add to list only if not omitted + } + } + else { // add varname to list even if + local unstripped `unstripped' `vn' // could be omitted (b. or o.) + } + } +// Now create list with b/n/o stripped out + foreach vn of local unstripped { + local svn "" // initialize + _ms_parse_parts `vn' + if "`r(type)'"=="variable" & "`r(op)'"=="" { // simplest case - no change + local svn `vn' + } + else if "`r(type)'"=="variable" & "`r(op)'"=="o" { // next simplest case - o.varname => varname + local svn `r(name)' + } + else if "`r(type)'"=="variable" { // has other operators so strip o but leave . + local op `r(op)' + local op : subinstr local op "o" "", all + local svn `op'.`r(name)' + } + else if "`r(type)'"=="factor" { // simple factor variable + local op `r(op)' + local op : subinstr local op "b" "", all + local op : subinstr local op "n" "", all + local op : subinstr local op "o" "", all + local svn `op'.`r(name)' // operator + . + varname + } + else if"`r(type)'"=="interaction" { // multiple variables + forvalues i=1/`r(k_names)' { + local op `r(op`i')' + local op : subinstr local op "b" "", all + local op : subinstr local op "n" "", all + local op : subinstr local op "o" "", all + local opv `op'.`r(name`i')' // operator + . + varname + if `i'==1 { + local svn `opv' + } + else { + local svn `svn'#`opv' + } + } + } + else if "`r(type)'"=="product" { + di as err "ivreg2_fvstrip error - type=product for `vn'" + exit 198 + } + else if "`r(type)'"=="error" { + di as err "ivreg2_fvstrip error - type=error for `vn'" + exit 198 + } + else { + di as err "ivreg2_fvstrip error - unknown type for `vn'" + exit 198 + } + local stripped `stripped' `svn' + } + local stripped : list retokenize stripped // clean any extra spaces + + if "`noisily'"~="" { // for debugging etc. +di as result "`stripped'" + } + + return local varlist `stripped' // return results in r(varlist) +end + +// **************** Add omitted vars to b and V matrices ****************** // + +program define AddOmitted, rclass + version 11.2 + syntax /// + [ , /// + bmat(name) /// + vmat(name) /// + cnb0(string) /// + cnb1(string) /// + eqlist(string) /// if empty, single-equation b and V + ] + + tempname newb newV + local eq_ct =max(1,wordcount("`eqlist'")) + local rhs0_ct : word count `cnb0' + local rhs1_ct : word count `cnb1' + + foreach vn in `cnb1' { + local cnum : list posof "`vn'" in cnb0 + local cnumlist "`cnumlist' `cnum'" + } +// cnumlist is the list of columns in the single-equation new big matrix in which +// the non-zero entries from the reduced matrix (bmat or vmat) will appear. +// E.g., if newb will be [mpg o.mpg2 _cons] then cnum = [1 3]. + + mata: s_AddOmitted( /// + "`bmat'", /// + "`vmat'", /// + "`cnumlist'", /// + `eq_ct', /// + `rhs0_ct', /// + `rhs1_ct') + mat `newb' = r(b) + mat `newV' = r(V) + + if `eq_ct'==1 { + local allnames `cnb0' // simple single-eqn case + } + else { + foreach eqname in `eqlist' { + foreach vname in `cnb0' { + local allnames "`allnames' `eqname':`vname'" + } + } + } + mat colnames `newb' = `allnames' + mat rownames `newb' = y1 + mat colnames `newV' = `allnames' + mat rownames `newV' = `allnames' + + return matrix b =`newb' + return matrix V =`newV' +end + +// ************* More misc utilities ************** // + +program define matsort, rclass + version 11.2 + args bvmat names + tempname m1 m2 + foreach vn in `names' { + mat `m1'=nullmat(`m1'), `bvmat'[1...,"`vn'"] + } + if rowsof(`m1')>1 { + foreach vn in `names' { + mat `m2'=nullmat(`m2') \ `m1'["`vn'",1...] + } + return matrix sorted =`m2' + } + else { + return matrix sorted =`m1' + } +end + + +program define matchnames, rclass + version 11.2 + args varnames namelist1 namelist2 + + local k1 : word count `namelist1' + local k2 : word count `namelist2' + + if `k1' ~= `k2' { + di as err "namelist error" + exit 198 + } + foreach vn in `varnames' { + local i : list posof `"`vn'"' in namelist1 + if `i' > 0 { + local newname : word `i' of `namelist2' + } + else { +* Keep old name if not found in list + local newname "`vn'" + } + local names "`names' `newname'" + } + local names : list clean names + return local names "`names'" +end + + +program define checkversion_ranktest, rclass + version 11.2 + args caller + +* Check that -ranktest- is installed + capture ranktest, version + if _rc != 0 { +di as err "Error: must have ranktest version 01.3.02 or greater installed" +di as err "To install, from within Stata type " _c +di in smcl "{stata ssc install ranktest :ssc install ranktest}" + exit 601 + } + local vernum "`r(version)'" + if ("`vernum'" < "01.3.02") | ("`vernum'" > "09.9.99") { +di as err "Error: must have ranktest version 01.3.02 or greater installed" +di as err "Currently installed version is `vernum'" +di as err "To update, from within Stata type " _c +di in smcl "{stata ssc install ranktest, replace :ssc install ranktest, replace}" + exit 601 + } + +* Minimum Stata version required for ranktest ver 2.0 or higher is Stata 16. +* If calling version is <16 then forks to ranktest ver 1.4 (aka ranktest11). + if `caller' >= 16 { + return local ranktestcmd version `caller': ranktest + } + else { + return local ranktestcmd version 11.2: ranktest + } +end + +// ************ Replacement _rmcollright with tweaks ****************** // + +program define ivreg2_rmcollright2, rclass + version 11.2 + syntax [ anything ] /// anything so that FVs aren't reordered + [if] [in] /// + [, /// + NORMWT(varname) /// + NOCONStant /// + NOEXPAND /// + newonly /// + lindep /// + ] + +// Empty varlist, leave early + if "`anything'"=="" { + return scalar k_omitted =0 + exit + } + + marksample touse + markout `touse' `anything' + + local cons = ("`noconstant'"=="") + local expand = ("`noexpand'"=="") + local newonly = ("`newonly'"~="") + local forcedrop = ("`forcedrop'"~="") + local lindep = ("`lindep'"~="") + local 0 `anything' + sreturn clear // clear any extraneous sreturn macros + syntax varlist(ts fv) + local tsops = ("`s(tsops)'"=="true") + local fvops = ("`s(fvops)'"=="true") + + if `tsops' | `fvops' { + if `expand' { + fvexpand `anything' if `touse' + local anything `r(varlist)' + fvrevar `anything' if `touse' + local fv_anything `r(varlist)' + } + else { +// already expanded and in set order +// loop through fvrevar so that it doesn't rebase or reorder + foreach var in `anything' { + fvrevar `var' if `touse' + local fv_anything `fv_anything' `r(varlist)' + } + } + } + else { + local fv_anything `anything' + } + + tempname wname + if "`normwt'"=="" { + qui gen byte `wname'=1 if `touse' + } + else { + qui gen double `wname' = `normwt' if `touse' + } + + mata: s_rmcoll2("`fv_anything'", "`anything'", "`wname'", "`touse'", `cons', `lindep') + + foreach var in `r(omitted)' { + di as text "note: `var' omitted because of collinearity" + } + + local omitted "`r(omitted)'" // has all omitted, both newly and previously omitted + local k_omitted =r(k_omitted) // but newly omitted not marked with omit operator o + if `lindep' { + tempname lindepmat + mat `lindepmat' = r(lindep) + mat rownames `lindepmat' = `anything' + mat colnames `lindepmat' = `anything' + } + +// Modern Stata version, add omitted notation to newly-missing vars + if `k_omitted' { + foreach var in `omitted' { + _ms_parse_parts `var' // check if already omitted + if r(omit) { // already omitted + local alreadyomitted `alreadyomitted' `var' + } + else { // not already omitted + ivreg2_rmc2_ms_put_omit `var' // add omitted omit operator o and replace in main varlist + local ovar `s(ospec)' + local anything : subinstr local anything "`var'" "`ovar'", word + } + } + if `newonly' { // omitted list should contain only newly omitted + local omitted : list omitted - alreadyomitted + local k_omitted : word count `omitted' + } + } + +// Return results + return scalar k_omitted =`k_omitted' + return local omitted `omitted' + return local varlist `anything' + if `lindep' { + return mat lindep `lindepmat' + } + +end + +// Used by ivreg2_rmcollright2 +// taken from later Stata - not available in Stata 11 +// version 1.0.0 28apr2011 +program ivreg2_rmc2_ms_put_omit, sclass + version 11.2 // added by MS + args vn + _ms_parse_parts `vn' + if r(type) =="variable" { + local name `r(name)' + local ovar o.`name' + } + if r(type) == "factor" { + if !r(base) { + local name `r(name)' + if "`r(ts_op)'" != "" { + local name `r(ts_op)'.`name' + } + local ovar `r(level)'o.`name' + } + else { + local ovar `vn' + } + } + else if r(type) == "interaction" { + local k = r(k_names) + + forval i = 1/`k' { + local name = r(name`i') + if "`r(ts_op`i')'" != "" { + local name `r(ts_op`i')'.`name' + } + if "`r(level`i')'" != "" { + if r(base`i') { + local name `r(level`i')'b.`name' + } + else { + local name `r(level`i')'o.`name' + } + } + else { + local name o.`name' + } + local spec `spec'`sharp'`name' + local sharp "#" + } + local ovar `spec' + + } + _msparse `ovar' + sreturn local ospec `r(stripe)' +end + + +******************************************************************************* +**************** SUBROUTINES FOR KERNEL-ROBUST ******************************** +******************************************************************************* + +// abw wants a varlist of [ eps | Z | touse] +// where Z includes all instruments, included and excluded, with constant if +// present as the last column; eps are a suitable set of residuals; and touse +// marks the observations in the data matrix used to generate the residuals +// (e.g. e(sample) of the appropriate model). +// The Noconstant option indicates that no constant term exists in the Z matrix. +// kern is the name of the HAC kernel. -ivregress- only provides definitions +// for Bartlett (default), Parzen, quadratic spectral. + +// returns the optimal bandwidth as local abw + +// abw 1.0.1 CFB 30jun2007 +// 1.0.1 : redefine kernel names (3 instances) to match ivreg2 +// 1.1.0 : pass nobs and tobs to s_abw; abw bug fix and also handles gaps in data correctly + +// not allowing fv operators, and tsrevar doesn't like them +// included fv and replaced tsrevar with fvrevar + +prog def abw, rclass + version 11.2 + syntax varlist(ts fv), [ tindex(varname) nobs(integer 0) tobs(integer 0) NOConstant Kernel(string)] +// validate kernel + if "`kernel'" == "" { + local kernel = "Bartlett" + } +// cfb B102 + if !inlist("`kernel'", "Bartlett", "Parzen", "Quadratic Spectral") { + di as err "Error: kernel `kernel' not compatible with bw(auto)" + return scalar abw = 1 + return local bwchoice "Kernel `kernel' not compatible with bw(auto); bw=1 (default)" + exit + } + else { +// set constant + local cons 1 + if "`noconstant'" != "" { + local cons 0 + } +// deal with ts ops ** using fvrevar ** +// tsrevar `varlist' + fvrevar `varlist' + local varlist1 `r(varlist)' + mata: s_abw("`varlist1'", "`tindex'", `nobs', `tobs', `cons', "`kernel'") + return scalar abw = `abw' + return local bwchoice "Automatic bw selection according to Newey-West (1994)" + } +end + + +******************************************************************************* +************** END SUBROUTINES FOR KERNEL-ROBUST ****************************** +******************************************************************************* + +******************************************************************************* +*************************** BEGIN MATA CODE *********************************** +******************************************************************************* + +// capture in case calling under version < 11.2 +capture version 11.2 + +mata: + +// For reference: +// struct ms_vcvorthog { +// string scalar ename, Znames, touse, weight, wvarname +// string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel +// string scalar sw, psd, ivarname, tvarname, tindexname +// real scalar wf, N, bw, tdelta, dofminus +// real scalar center +// real matrix ZZ +// pointer matrix e +// pointer matrix Z +// pointer matrix wvar +// } + + +void s_abw (string scalar Zulist, + string scalar tindexname, + real scalar nobs, + real scalar tobs, + real scalar cons, + string scalar kernel + ) +{ + +// nobs = number of observations = number of data points available = rows(uZ) +// tobs = time span of data = t_N - t_1 + 1 +// nobs = tobs if no gaps in data +// nobs < tobs if there are gaps +// nobs used below when calculating means, e.g., covariances in sigmahat. +// tobs used below when time span of data is needed, e.g., mstar. + + string rowvector Zunames, tov + string scalar v, v2 + real matrix uZ + real rowvector h + real scalar lenzu, abw + +// access the Stata variables in Zulist, honoring touse stored as last column + Zunames = tokens(Zulist) + lenzu=cols(Zunames)-1 + v = Zunames[|1\lenzu|] + v2 = Zunames[lenzu+1] + st_view(uZ,.,v,v2) + tnow=st_data(., tindexname) + +// assume constant in last col of uZ if it exists +// account for eps as the first column of uZ + if (cons) { + nrows1=cols(uZ)-2 + nrows2=1 + } + else { + nrows1=cols(uZ)-1 + nrows2=0 + } +// [R] ivregress p.42: referencing Newey-West 1994 REStud 61(4):631-653 +// define h indicator rowvector + h = J(nrows1,1,1) \ J(nrows2,1,0) + +// calc mstar per p.43 +// Hannan (1971, 296) & Priestley (1981, 58) per Newey-West p. 633 +// corrected per Alistair Hall msg to Brian Poi 17jul2008 +// T = rows(uZ) +// oneT = 1/T + expo = 2/9 + q = 1 +// cgamma = 1.4117 + cgamma = 1.1447 + if(kernel == "Parzen") { + expo = 4/25 + q = 2 + cgamma = 2.6614 + } +// cfb B102 + if(kernel == "Quadratic Spectral") { + expo = 2/25 + q = 2 + cgamma = 1.3221 + } +// per Newey-West p.639, Anderson (1971), Priestley (1981) may provide +// guidance on setting expo for other kernels +// mstar = trunc(20 *(T/100)^expo) +// use time span of data (not number of obs) + mstar = trunc(20 *(tobs/100)^expo) + +// calc uZ matrix + u = uZ[.,1] + Z = uZ[|1,2 \.,.|] + +// calc f vector: (u_i Z_i) * h + f = (u :* Z) * h + +// approach allows for gaps in time series + sigmahat = J(mstar+1,1,0) + for(j=0;j<=mstar;j++) { + lsj = "L"+strofreal(j) + tlag=st_data(., lsj+"."+tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix + // now calculate autocovariance; divide by nobs + sigmahat[j+1] = quadcross(f[tmatrix[.,1],.], f[tmatrix[.,2],.]) / nobs + } + +// calc shat(q), shat(0) + shatq = 0 + shat0 = sigmahat[1] + for(j=1;j<=mstar;j++) { + shatq = shatq + 2 * sigmahat[j+1] * j^q + shat0 = shat0 + 2 * sigmahat[j+1] + } + +// calc gammahat + expon = 1/(2*q+1) + gammahat = cgamma*( (shatq/shat0)^2 )^expon +// use time span of data tobs (not number of obs T) + m = gammahat * tobs^expon + +// calc opt lag + if(kernel == "Bartlett" | kernel == "Parzen") { + optlag = min((trunc(m),mstar)) + } + else if(kernel == "Quadratic Spectral") { + optlag = min((m,mstar)) + } + +// if optlag is the optimal lag to be used, we need to add one to +// specify bandwidth in ivreg2 terms + abw = optlag + 1 + st_local("abw",strofreal(abw)) +} // end program s_abw + + +// *********** s_rmcoll2 (replacement for Stata _rmcollright etc. ********** + +void s_rmcoll2( string scalar fv_vnames, + string scalar vnames, + string scalar wname, + string scalar touse, + scalar cons, + scalar lindep) +{ + st_view(X=., ., tokens(fv_vnames), touse) + st_view(w=., ., tokens(wname), touse) + st_view(mtouse=., ., tokens(touse), touse) + + if (cons) { + Xmean=mean(X,w) + XX=quadcrossdev(X,Xmean, w, X,Xmean) + } + else { + XX=quadcross(X, w, X) + } + + XXinv=invsym(XX, range(1,cols(X),1)) + + st_numscalar("r(k_omitted)", diag0cnt(XXinv)) + if (lindep) { + st_matrix("r(lindep)", XX*XXinv) + } + smat = (diagonal(XXinv) :== 0)' + vl=tokens(vnames) + vl_drop = select(vl, smat) + vl_keep = select(vl, (1 :- smat)) + + if (cols(vl_keep)>0) { + st_global("r(varlist)", invtokens(vl_keep)) + } + if (cols(vl_drop)>0) { + st_global("r(omitted)", invtokens(vl_drop)) + } +} // end program s_rmcoll2 + + +// ************** Add omitted Mata utility ************************ + +void s_AddOmitted( string scalar bname, + string scalar vname, + string scalar cnumlist, + scalar eq_ct, + scalar rhs0_ct, + scalar rhs1_ct) + +{ + b = st_matrix(bname) + V = st_matrix(vname) + cn = strtoreal(tokens(cnumlist)) +// cnumlist is the list of columns in the single-equation new big matrix in which +// the non-zero entries from the reduced matrix (bmat or vmat) will appear. +// E.g., if newb will be [mpg o.mpg2 _cons] then cnum = [1 3]. + col_ct = eq_ct * rhs0_ct + + newb = J(1,col_ct,0) + newV = J(col_ct,col_ct,0) + +// Code needs to accommodate multi-equation case. Since all equations will have +// same reduced and full list of vars, in the same order, can do this with Kronecker +// products etc. Second term below is basically the offset for each equation. + cn = (J(1,eq_ct,1) # cn) + ((range(0,eq_ct-1,1)' # J(1,rhs1_ct,1) ) * rhs0_ct) + +// Insert the values from the reduced matrices into the right places in the big matrices. + newb[1, cn] = b + newV[cn, cn] = V + + st_matrix("r(b)", newb) + st_matrix("r(V)", newV) + +} + + +// ************** Partial out ************************************* + +void s_partial( string scalar yname, + string scalar X1names, + string scalar X2names, + string scalar Z1names, + string scalar Pnames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + scalar cons) + +{ + +// All varnames should be basic form, no FV or TS operators etc. +// y = dep var +// X1 = endog regressors +// X2 = exog regressors = included IVs +// Z1 = excluded instruments +// Z2 = included IVs = X2 +// PZ = variables to partial out +// cons = 0 or 1 + + ytoken=tokens(yname) + X1tokens=tokens(X1names) + X2tokens=tokens(X2names) + Z1tokens=tokens(Z1names) + Ptokens=tokens(Pnames) + Ytokens = (ytoken, X1tokens, X2tokens, Z1tokens) + + st_view(wvar, ., st_tsrevar(wvarname), touse) + st_view(Y, ., Ytokens, touse) + st_view(P, ., Ptokens, touse) + L = cols(P) + + if (cons & L>0) { // Vars to partial out including constant + Ymeans = mean(Y,wf*wvar) + Pmeans = mean(P,wf*wvar) + PY = quadcrossdev(P, Pmeans, wf*wvar, Y, Ymeans) + PP = quadcrossdev(P, Pmeans, wf*wvar, P, Pmeans) + } + else if (!cons & L>0) { // Vars to partial out NOT including constant + PY = quadcross(P, wf*wvar, Y) + PP = quadcross(P, wf*wvar, P) + } + else { // Only constant to partial out = demean + Ymeans = mean(Y,wf*wvar) + } + +// Partial-out coeffs. Default Cholesky; use QR if not full rank and collinearities present. +// Not necessary if no vars other than constant + if (L>0) { + b = cholqrsolve(PP, PY) + } +// Replace with residuals + if (cons & L>0) { // Vars to partial out including constant + Y[.,.] = (Y :- Ymeans) - (P :- Pmeans)*b + } + else if (!cons & L>0) { // Vars to partial out NOT including constant + Y[.,.] = Y - P*b + } + else { // Only constant to partial out = demean + Y[.,.] = (Y :- Ymeans) + } + +} // end program s_partial + + + +// ************** Common cross-products ************************************* + +void s_crossprods( string scalar yname, + string scalar X1names, + string scalar X2names, + string scalar Z1names, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N) + +{ + +// y = dep var +// X1 = endog regressors +// X2 = exog regressors = included IVs +// Z1 = excluded instruments +// Z2 = included IVs = X2 + + ytoken=tokens(yname) + X1tokens=tokens(X1names) + X2tokens=tokens(X2names) + Z1tokens=tokens(Z1names) + + Xtokens = (X1tokens, X2tokens) + Ztokens = (Z1tokens, X2tokens) + + K1=cols(X1tokens) + K2=cols(X2tokens) + K=K1+K2 + L1=cols(Z1tokens) + L2=cols(X2tokens) + L=L1+L2 + + st_view(wvar, ., st_tsrevar(wvarname), touse) + st_view(A, ., st_tsrevar((ytoken, Xtokens, Z1tokens)), touse) + + AA = quadcross(A, wf*wvar, A) + + if (K>0) { + XX = AA[(2::K+1),(2..K+1)] + Xy = AA[(2::K+1),1] + } + if (K1>0) { + X1X1 = AA[(2::K1+1),(2..K1+1)] + } + + if (L1 > 0) { + Z1Z1 = AA[(K+2::rows(AA)),(K+2..rows(AA))] + } + + if (L2 > 0) { + Z2Z2 = AA[(K1+2::K+1), (K1+2::K+1)] + Z2y = AA[(K1+2::K+1), 1] + } + + if ((L1>0) & (L2>0)) { + Z2Z1 = AA[(K1+2::K+1), (K+2::rows(AA))] + ZZ2 = Z2Z1, Z2Z2 + ZZ1 = Z1Z1, Z2Z1' + ZZ = ZZ1 \ ZZ2 + } + else if (L1>0) { + ZZ = Z1Z1 + } + else { +// L1=0 + ZZ = Z2Z2 + ZZ2 = Z2Z2 + } + + if ((K1>0) & (L1>0)) { // K1>0, L1>0 + X1Z1 = AA[(2::K1+1), (K+2::rows(AA))] + } + + if ((K1>0) & (L2>0)) { + X1Z2 = AA[(2::K1+1), (K1+2::K+1)] + if (L1>0) { // K1>0, L1>0, L2>0 + X1Z = X1Z1, X1Z2 + XZ = X1Z \ ZZ2 + } + else { // K1>0, L1=0, L2>0 + XZ = X1Z2 \ ZZ2 + X1Z = X1Z2 + } + } + else if (K1>0) { // K1>0, L2=0 + XZ = X1Z1 + X1Z= X1Z1 + } + else if (L1>0) { // K1=0, L2>0 + XZ = AA[(2::K+1),(K+2..rows(AA))], AA[(2::K+1),(2..K+1)] + } + else { // K1=0, L2=0 + XZ = ZZ + } + + if ((L1>0) & (L2>0)) { + Zy = AA[(K+2::rows(AA)), 1] \ AA[(K1+2::K+1), 1] + ZY = AA[(K+2::rows(AA)), (1..K1+1)] \ AA[(K1+2::K+1), (1..K1+1)] + Z2Y = AA[(K1+2::K+1), (1..K1+1)] + } + else if (L1>0) { + Zy = AA[(K+2::rows(AA)), 1] + ZY = AA[(K+2::rows(AA)), (1..K1+1)] + } + else if (L2>0) { + Zy = AA[(K1+2::K+1), 1] + ZY = AA[(K1+2::K+1), (1..K1+1)] + Z2Y = ZY + } +// Zy, ZY, Z2Y not created if L1=L2=0 + + YY = AA[(1::K1+1), (1..K1+1)] + yy = AA[1,1] + st_subview(y, A, ., 1) + ym = sum(wf*wvar:*y)/N + yyc = quadcrossdev(y, ym, wf*wvar, y, ym) + + XXinv = invsym(XX) + if (Xtokens==Ztokens) { + ZZinv = XXinv + XPZXinv = XXinv + } + else { + ZZinv = invsym(ZZ) + XPZX = makesymmetric(XZ*ZZinv*XZ') + XPZXinv=invsym(XPZX) + } + +// condition numbers + condxx=cond(XX) + condzz=cond(ZZ) + + st_matrix("r(XX)", XX) + st_matrix("r(X1X1)", X1X1) + st_matrix("r(X1Z)", X1Z) + st_matrix("r(ZZ)", ZZ) + st_matrix("r(Z2Z2)", Z2Z2) + st_matrix("r(Z1Z2)", Z2Z1') + st_matrix("r(Z2y)",Z2y) + st_matrix("r(XZ)", XZ) + st_matrix("r(Xy)", Xy) + st_matrix("r(Zy)", Zy) + st_numscalar("r(yy)", yy) + st_numscalar("r(yyc)", yyc) + st_matrix("r(YY)", YY) + st_matrix("r(ZY)", ZY) + st_matrix("r(Z2Y)", Z2Y) + st_matrix("r(XXinv)", XXinv) + st_matrix("r(ZZinv)", ZZinv) + st_matrix("r(XPZXinv)", XPZXinv) + st_numscalar("r(condxx)",condxx) + st_numscalar("r(condzz)",condzz) + +} // end program s_crossprods + + +// *************** 1st step GMM ******************** // +// Can be either efficient or inefficient. +// Can be IV or other 1-step GMM estimator. + +void s_gmm1s( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar ZZinvmatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar Wmatrix, + string scalar Smatrix, + scalar dofminus, + scalar efficient, // flag to indicate that 1st-step GMM is efficient + scalar overid, // not guaranteed to be right if nocollin option used! + scalar useqr) // flag to force use of QR instead of Cholesky solver +{ + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + ZZ = st_matrix(ZZmatrix) + XX = st_matrix(XXmatrix) + XZ = st_matrix(XZmatrix) + Zy = st_matrix(Zymatrix) + ZZinv = st_matrix(ZZinvmatrix) + + QZZ = ZZ / N + QXX = XX / N + QXZ = XZ / N + QZy = Zy / N + QZZinv = ZZinv*N + + useqr = (diag0cnt(QZZinv)>0) | useqr + +// Weighting matrix supplied (and inefficient GMM) + if (Wmatrix~="") { + W = st_matrix(Wmatrix) + useqr = (diag0cnt(W)>0) | useqr + } +// Var-cov matrix of orthog conditions supplied + if (Smatrix~="") { + omega=st_matrix(Smatrix) + useqr = (diag0cnt(omega)>0) | useqr + } + + if (efficient) { // Efficient 1-step GMM block: OLS, IV or provided S + if ((Xtokens==Ztokens) & (Smatrix=="")) { // OLS + + beta = cholqrsolve(QZZ, QZy, useqr) + beta = beta' + e[.,.] = y - X * beta' // update residuals + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + omega = sigmasq * QZZ + W = 1/sigmasq * QZZinv + V = 1/N * sigmasq * QZZinv + rankS = rows(omega) - diag0cnt(QZZinv) // inv(omega) is proportional to inv(QZZ) + rankV = rows(V) - diag0cnt(V) // inv(V) is proportional to inv(QZZ) + } + else if (Smatrix=="") { // IV + aux1 = cholqrsolve(QZZ, QXZ', useqr) + aux2 = cholqrsolve(QZZ, QZy, useqr) + aux3 = makesymmetric(QXZ * aux1) + beta = cholqrsolve(aux3, QXZ * aux2, useqr) + beta = beta' + e[.,.] = y - X * beta' // update residuals + ee = quadcross(e, wf*wvar, e) + sigmasq = ee/(N-dofminus) + omega = sigmasq * QZZ + W = 1/sigmasq * QZZinv + V = 1/N * sigmasq * invsym(aux3) + rankS = rows(omega) - diag0cnt(QZZinv) // inv(omega) is proportional to inv(QZZ) + rankV = rows(V) - diag0cnt(V) // V is proportional to inv(aux3) + } + else { // efficient GMM with provided S (=omega) + aux1 = cholqrsolve(omega, QXZ', useqr) + aux2 = cholqrsolve(omega, QZy, useqr) + aux3 = makesymmetric(QXZ * aux1) + beta = cholqrsolve(aux3, QXZ * aux2, useqr) + beta = beta' + e[.,.] = y - X * beta' // update residuals + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + W = invsym(omega) + V = 1/N * invsym(aux3) // Normalize by N + rankS = rows(omega) - diag0cnt(W) // since W=inv(omega) + rankV = rows(V) - diag0cnt(V) // since V is prop to inv(aux3) + } + if (overid) { // J if overidentified + Ze = quadcross(Z, wf*wvar, e) + gbar = Ze / N + aux4 = cholqrsolve(omega, gbar, useqr) + j = N * gbar' * aux4 + } + else { + j=0 + } + st_matrix("r(beta)", beta) + st_matrix("r(V)", V) + st_matrix("r(S)", omega) + st_matrix("r(W)", W) + st_numscalar("r(rss)", ee) + st_numscalar("r(j)", j) + st_numscalar("r(sigmasq)", sigmasq) + st_numscalar("r(rankS)", rankS) + st_numscalar("r(rankV)", rankV) + } + else { // inefficient 1st-step GMM; don't need V, S, j etc. + if ((Xtokens==Ztokens) & (Wmatrix=="")) { // OLS + beta = cholqrsolve(QZZ, QZy, useqr) + beta = beta' + e[.,.] = y - X * beta' // update residuals + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + W = 1/sigmasq * QZZinv + QXZ_W_QZX = 1/sigmasq * QZZ // b/c W incorporates sigma^2 + } + else if (Wmatrix=="") { // IV + aux1 = cholqrsolve(QZZ, QXZ', useqr) + aux2 = cholqrsolve(QZZ, QZy, useqr) + aux3 = makesymmetric(QXZ * aux1) + beta = cholqrsolve(aux3, QXZ * aux2, useqr) + beta = beta' + e[.,.] = y - X * beta' // update residuals + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + W = 1/sigmasq * QZZinv + QXZ_W_QZX = 1/sigmasq * aux3 // b/c IV weighting matrix incorporates sigma^2 + } + else { // some other 1st step inefficient GMM with provided W + QXZ_W_QZX = QXZ * W * QXZ' + _makesymmetric(QXZ_W_QZX) + beta = cholqrsolve(QXZ_W_QZX, QXZ * W * QZy, useqr) + beta = beta' + e[.,.] = y - X * beta' // update residuals + } + st_matrix("r(QXZ_W_QZX)", QXZ_W_QZX) + st_matrix("r(beta)", beta) + st_matrix("r(W)",W) // always return W + } + +} // end program s_gmm1s + + +// *************** efficient GMM ******************** // +// Uses inverse of provided S matrix as weighting matrix. +// IV won't be done here but code would work for it as a special case. + +void s_egmm( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar ZZinvmatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar Smatrix, // always provided + scalar dofminus, + scalar overid, // not guaranteed to be right if -nocollin- used! + scalar useqr) +{ + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + ZZ = st_matrix(ZZmatrix) + XX = st_matrix(XXmatrix) + XZ = st_matrix(XZmatrix) + Zy = st_matrix(Zymatrix) + ZZinv = st_matrix(ZZinvmatrix) + + QZZ = ZZ / N + QXX = XX / N + QXZ = XZ / N + QZy = Zy / N + QZZinv = ZZinv*N + +// Var-cov matrix of orthog conditions supplied + omega=st_matrix(Smatrix) + W = invsym(omega) // Efficient GMM weighting matrix + rankS = rows(omega) - diag0cnt(W) // since W=inv(omega) + + if (rankS cols(X)) { + Ze = quadcross(Z, wf*wvar, e) + gbar = Ze / N + aux4 = cholqrsolve(omega, gbar, useqr) + j = N * gbar' * aux4 + } + else { + j=0 + } + + st_matrix("r(beta)", beta) + st_matrix("r(V)", V) + st_matrix("r(W)", W) + st_numscalar("r(rss)", ee) + st_numscalar("r(j)", j) + st_numscalar("r(sigmasq)", sigmasq) + st_numscalar("r(rankV)",rankV) + st_numscalar("r(rankS)",rankS) + +} // end program s_egmm + +// *************** inefficient GMM ******************** // + +void s_iegmm( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar QXZ_W_QZXmatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar Wmatrix, + string scalar Smatrix, + string scalar bname, + scalar dofminus, + scalar overid, + scalar useqr) +{ + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + QZZ = st_matrix(ZZmatrix) / N + QXX = st_matrix(XXmatrix) / N + QXZ = st_matrix(XZmatrix) / N + QZy = st_matrix(Zymatrix) / N + QXZ_W_QZX = st_matrix(QXZ_W_QZXmatrix) + + useqr = (diag0cnt(QXZ_W_QZX)>0) | useqr + +// beta is supplied + beta = st_matrix(bname) + +// Inefficient weighting matrix supplied + W = st_matrix(Wmatrix) + +// Var-cov matrix of orthog conditions supplied + omega=st_matrix(Smatrix) + +// Residuals are supplied + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + +// Calculate V and J. + +// V +// The GMM estimator is "root-N consistent", and technically we do +// inference on sqrt(N)*beta. By convention we work with beta, so we adjust +// the var-cov matrix instead: + aux5 = cholqrsolve(QXZ_W_QZX, QXZ * W, useqr) + V = 1/N * aux5 * omega * aux5' + _makesymmetric(V) + +// alternative +// QXZ_W_QZXinv=invsym(QXZ_W_QZX) +// V = 1/N * QXZ_W_QZXinv * QXZ * W * omega * W * QXZ' * QXZ_W_QZXinv + + rankV = rows(V) - diag0cnt(invsym(V)) // need explicitly to calc rank + rankS = rows(omega) - diag0cnt(invsym(omega)) // need explicitly to calc rank + +// J if overidentified + if (overid) { +// Note that J requires efficient GMM residuals, which means do 2-step GMM to get them. +// QXZ_W2s_QZX = QXZ * W2s * QXZ' +// _makesymmetric(QXZ_W2s_QZX) +// QXZ_W2s_QZXinv=invsym(QXZ_W2s_QZX) +// beta2s = (QXZ_W2s_QZXinv * QXZ * W2s * QZy) + aux1 = cholqrsolve(omega, QXZ', useqr) + aux2 = cholqrsolve(omega, QZy, useqr) + aux3s = makesymmetric(QXZ * aux1) + beta2s = cholqrsolve(aux3s, QXZ * aux2, useqr) + beta2s = beta2s' + e2s = y - X * beta2s' + Ze2s = quadcross(Z, wf*wvar, e2s) + gbar = Ze2s / N + aux4 = cholqrsolve(omega, gbar, useqr) + j = N * gbar' * aux4 + } + else { + j=0 + } + + st_matrix("r(V)", V) + st_numscalar("r(j)", j) + st_numscalar("r(rss)", ee) + st_numscalar("r(sigmasq)", sigmasq) + st_numscalar("r(rankV)",rankV) + st_numscalar("r(rankS)",rankS) + +} // end program s_iegmm + +// *************** LIML ******************** // + +void s_liml( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar Z2Z2matrix, + string scalar YYmatrix, + string scalar ZYmatrix, + string scalar Z2Ymatrix, + string scalar Xymatrix, + string scalar ZZinvmatrix, + string scalar yname, + string scalar Ynames, + string scalar ename, + string scalar Xnames, + string scalar X1names, + string scalar Znames, + string scalar Z1names, + string scalar Z2names, + scalar fuller, + scalar kclass, + string scalar coviv, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + scalar center, + scalar dofminus, + scalar useqr) + +{ + struct ms_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.center = center + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + + +// X1 = endog regressors +// X2 = exog regressors = included IVs +// Z1 = excluded instruments +// Z2 = included IVs = X2 + + Ytokens=tokens(Ynames) + Ztokens=tokens(Znames) + Z1tokens=tokens(Z1names) + Z2tokens=tokens(Z2names) + Xtokens=tokens(Xnames) + X1tokens=tokens(X1names) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + + vcvo.e = &e + vcvo.Z = &Z + vcvo.wvar = &wvar + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + QZZ = st_matrix(ZZmatrix) / N + QXX = st_matrix(XXmatrix) / N + QXZ = st_matrix(XZmatrix) / N + QZy = st_matrix(Zymatrix) / N + QZ2Z2 = st_matrix(Z2Z2matrix) / N + QYY = st_matrix(YYmatrix) / N + QZY = st_matrix(ZYmatrix) / N + QZ2Y = st_matrix(Z2Ymatrix) / N + QXy = st_matrix(Xymatrix) / N + QZZinv = st_matrix(ZZinvmatrix)*N + + useqr = (diag0cnt(QZZ)>0) | useqr + +// kclass=0 => LIML or Fuller LIML so calculate lambda + if (kclass == 0) { + aux1 = cholqrsolve(QZZ, QZY, useqr) + QWW = QYY - QZY'*aux1 + _makesymmetric(QWW) + if (cols(Z2tokens) > 0) { + aux2 = cholqrsolve(QZ2Z2, QZ2Y, useqr) + QWW1 = QYY - QZ2Y'*aux2 + _makesymmetric(QWW1) + } + else { +// Special case of no exogenous regressors + QWW1 = QYY + } + M=matpowersym(QWW, -0.5) + Eval=symeigenvalues(M*QWW1*M) + lambda=rowmin(Eval) + } + +// Exactly identified but might not be exactly 1, so make it so + if (cols(Z)==cols(X)) { + lambda=1 + } + + if (fuller > (N-cols(Z))) { +printf("\n{error:Error: invalid choice of Fuller LIML parameter.}\n") + exit(error(3351)) + } + else if (fuller > 0) { + k = lambda - fuller/(N-cols(Z)) + } + else if (kclass > 0) { + k = kclass + } + else { + k = lambda + } + + aux3 = cholqrsolve(QZZ, QXZ', useqr) + QXhXh=(1-k)*QXX + k*QXZ*aux3 + _makesymmetric(QXhXh) + aux4 = cholqrsolve(QZZ, QZy, useqr) + aux5 = cholqrsolve(QXhXh, QXZ, useqr) + aux6 = cholqrsolve(QXhXh, QXy, useqr) + beta = aux6*(1-k) + k*aux5*aux4 + beta = beta' + + e[.,.] = y - X * beta' + ee = quadcross(e, wf*wvar, e) + sigmasq = ee /(N-dofminus) + + omega = m_omega(vcvo) + + QXhXhinv=invsym(QXhXh) + + if ((robust=="") & (clustvarname=="") & (kernel=="")) { +// Efficient LIML + if (coviv=="") { +// Note dof correction is already in sigmasq + V = 1/N * sigmasq * QXhXhinv + rankV = rows(V) - diag0cnt(V) // since V is proportional to inv(QXhXh) + } + else { + aux7 = makesymmetric(QXZ * aux3) + V = 1/N * sigmasq * invsym(aux7) + rankV = rows(V) - diag0cnt(V) // since V is proportional to inv(aux7) + } + rankS = rows(omega) - diag0cnt(invsym(omega)) + if (cols(Z)>cols(X)) { + Ze = quadcross(Z, wf*wvar, e) + gbar = Ze / N + aux8 = cholqrsolve(omega, gbar, useqr) + j = N * gbar' * aux8 + } + else { + j=0 + } + } + else { +// Inefficient LIML + if (coviv=="") { + aux9 = cholqrsolve(QZZ, aux5', useqr) + V = 1/N * aux9' * omega * aux9 + _makesymmetric(V) + rankV = rows(V) - diag0cnt(invsym(V)) // need explicitly to calc rank + rankS = rows(omega) - diag0cnt(invsym(omega)) // need explicitly to calc rank + } + else { + aux10 = QXZ * aux3 + _makesymmetric(aux10) + aux11 = cholqrsolve(aux10, aux3', useqr) + V = 1/N * aux11 * omega * aux11' + _makesymmetric(V) + rankV = rows(V) - diag0cnt(invsym(V)) // need explicitly to calc rank + rankS = rows(omega) - diag0cnt(invsym(omega)) // need explicitly to calc rank + } + if (cols(Z)>cols(X)) { + aux12 = cholqrsolve(omega, QXZ', useqr) + aux13 = cholqrsolve(omega, QZy, useqr) + aux14 = makesymmetric(QXZ * aux12) + beta2s = cholqrsolve(aux14, QXZ * aux13, useqr) + beta2s = beta2s' + e2s = y - X * beta2s' + Ze2s = quadcross(Z, wf*wvar, e2s) + gbar = Ze2s / N + aux15 = cholqrsolve(omega, gbar, useqr) + j = N * gbar' * aux15 + } + else { + j=0 + } + } + _makesymmetric(V) + + st_matrix("r(beta)", beta) + st_matrix("r(S)", omega) + st_matrix("r(V)", V) + st_numscalar("r(lambda)", lambda) + st_numscalar("r(kclass)", k) + st_numscalar("r(j)", j) + st_numscalar("r(rss)", ee) + st_numscalar("r(sigmasq)", sigmasq) + st_numscalar("r(rankV)",rankV) + st_numscalar("r(rankS)",rankS) + +} // end program s_liml + + +// *************** CUE ******************** // + +void s_gmmcue( string scalar ZZmatrix, + string scalar XZmatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + string scalar bname, + string scalar b0name, + scalar center, + scalar dofminus, + scalar useqr) + +{ + + struct ms_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.center = center + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Pointers to views + vcvo.e = &e + vcvo.Z = &Z + vcvo.wvar = &wvar + py = &y + pX = &X + + if (b0name=="") { + +// CUE beta not supplied, so calculate/optimize + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + +// CUE is preceded by IV or 2-step GMM to get starting values. +// Stata convention is that parameter vectors are row vectors, and optimizers +// require this, so must conform to this in what follows. + + beta_init = st_matrix(bname) + +// What follows is how to set out an optimization in Stata. First, initialize +// the optimization structure in the variable S. Then tell Mata where the +// objective function is, that it's a minimization, that it's a "d0" type of +// objective function (no analytical derivatives or Hessians), and that the +// initial values for the parameter vector are in beta_init. Finally, optimize. + S = optimize_init() + + optimize_init_evaluator(S, &m_cuecrit()) + optimize_init_which(S, "min") + optimize_init_evaluatortype(S, "d0") + optimize_init_params(S, beta_init) +// CUE objective function takes 3 extra arguments: y, X and the structure with omega details + optimize_init_argument(S, 1, py) + optimize_init_argument(S, 2, pX) + optimize_init_argument(S, 3, vcvo) + optimize_init_argument(S, 4, useqr) + + beta = optimize(S) + +// The last evaluation of the GMM objective function is J. + j = optimize_result_value(S) + +// Call m_omega one last time to get CUE weighting matrix. + e[.,.] = y - X * beta' + omega = m_omega(vcvo) + } + else { +// CUE beta supplied, so obtain maximized GMM obj function at b0 + beta = st_matrix(b0name) + e[.,.] = y - X * beta' + omega = m_omega(vcvo) +// W = invsym(omega) + gbar = 1/N * quadcross(Z, wf*wvar, e) + j = N * gbar' * cholsolve(omega, gbar, useqr) +// j = N * gbar' * W * gbar + } + +// Bits and pieces + QXZ = st_matrix(XZmatrix)/N + + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + +// QXZ_W_QZX = QXZ * W * QXZ' +// _makesymmetric(QXZ_W_QZX) +// QXZ_W_QZXinv=invsym(QXZ_W_QZX) +// V = 1/N * QXZ_W_QZXinv + aux1 = cholsolve(omega, QXZ') + if (aux1[1,1]==.) { // omega not full rank; W=inv(omega) dubious, exit with error +errprintf("\nError: estimated covariance matrix of moment conditions not of full rank,") +errprintf("\n and optimal GMM weighting matrix not unique.") +errprintf("\nPossible causes:") +errprintf("\n collinearities in instruments (if -nocollin- option was used)") +errprintf("\n singleton dummy variable (dummy with one 1 and N-1 0s or vice versa)") +errprintf("\n {help ivreg2##partial:partial} option may address problem.\n") + exit(506) + } + aux3 = makesymmetric(QXZ * aux1) + V = 1/N * invsym(aux3) + if (diag0cnt(V)) { // V not full rank, likely caused by collinearities; + // b dubious, exit with error +errprintf("\nError: estimated variance matrix of b not of full rank, and CUE estimates") +errprintf("\n unreliable; may be caused by collinearities\n") + exit(506) + } + W = invsym(omega) + + st_matrix("r(beta)", beta) + st_matrix("r(S)", omega) + st_matrix("r(W)", W) + st_matrix("r(V)", V) + st_numscalar("r(j)", j) + st_numscalar("r(rss)", ee) + st_numscalar("r(sigmasq)", sigmasq) + +} // end program s_gmmcue + +// CUE evaluator function. +// Handles only d0-type optimization; todo, g and H are just ignored. +// beta is the parameter set over which we optimize, and +// J is the objective function to minimize. + +void m_cuecrit(todo, beta, pointer py, pointer pX, struct ms_vcvorthog scalar vcvo, useqr, j, g, H) +{ + *vcvo.e[.,.] = *py - *pX * beta' + + omega = m_omega(vcvo) + +// Calculate gbar=Z'*e/N + gbar = 1/vcvo.N * quadcross(*vcvo.Z, vcvo.wf*(*vcvo.wvar), *vcvo.e) + aux1 = cholqrsolve(omega, gbar, useqr) + j = vcvo.N * gbar' * aux1 + +// old method +// W = invsym(omega) +// j = vcvo.N * gbar' * W * gbar + +} // end program CUE criterion function + + +// ************** ffirst-stage stats ************************************* + +void s_ffirst( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar ZYmatrix, + string scalar ZZinvmatrix, + string scalar XXinvmatrix, + string scalar XPZXinvmatrix, + string scalar X2X2matrix, + string scalar Z1X2matrix, + string scalar X2ymatrix, + string scalar ename, // Nx1 + string scalar ematnames, // Nx(K1+1) + string scalar yname, + string scalar X1names, + string scalar X2names, + string scalar Z1names, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + scalar N_clust, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + scalar center, + scalar dofminus, + scalar sdofminus) + +{ + + struct ms_vcvorthog scalar vcvo + + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.center = center + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + +// X1 = endog regressors +// X2 = exog regressors = included IVs +// Z1 = excluded instruments +// Z2 = included IVs = X2 + + Xnames = invtokens( (X1names, X2names), " ") + Znames = invtokens( (Z1names, X2names), " ") + + st_view(y, ., st_tsrevar(tokens(yname)), touse) + st_view(X1, ., st_tsrevar(tokens(X1names)), touse) + st_view(Z1, ., st_tsrevar(tokens(Z1names)), touse) + st_view(X, ., st_tsrevar(tokens(Xnames)), touse) + st_view(Z, ., st_tsrevar(tokens(Znames)), touse) + st_view(e, ., ename, touse) + st_view(emat, ., tokens(ematnames), touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + + vcvo.wvar = &wvar + vcvo.Z = &Z + vcvo.Znames = Znames + vcvo.ZZ = st_matrix(ZZmatrix) + + if ("X2names"~="") { + st_view(X2, ., st_tsrevar(tokens(X2names)), touse) + } + + K1=cols(X1) + K2=cols(X2) + K=K1+K2 + L1=cols(Z1) + L2=cols(X2) + L=L1+L2 + df = L1 + df_r = N-L + + ZZinv = st_matrix(ZZinvmatrix) + XXinv = st_matrix(XXinvmatrix) + XPZXinv = st_matrix(XPZXinvmatrix) + QZZ = st_matrix(ZZmatrix) / N + QXX = st_matrix(XXmatrix) / N + QZX = st_matrix(XZmatrix)' / N + QZY = st_matrix(ZYmatrix) / N + QZZinv = ZZinv*N + QXXinv = XXinv*N + QX2X2 = st_matrix(X2X2matrix) / N + QZ1X2 = st_matrix(Z1X2matrix) / N + QX2y = st_matrix(X2ymatrix) / N + + sheaall = (diagonal(XXinv) :/ diagonal(XPZXinv)) // (X1, X2) in column vector + sheaall = (sheaall[(1::K1), 1 ])' // Just X1 in row vector + +// Full system of reduced form (col 1) and first-stage regressions + bz = cholsolve(QZZ, QZY) + Yhat = Z*bz + Xhat = Yhat[.,(2..(K1+1))], X2 +// VCV for full system + eall = (y, X1) - Yhat + ee = quadcross(eall, wf*wvar, eall) +// sigmas have large-sample dofminus correction incorporated but no small dof corrections + sigmasqall = ee / (N-dofminus) +// rmses have small dof corrections + rmseall = sqrt( ee / (N-L-dofminus-sdofminus) ) +// V has all the classical VCVs in block diagonals + V = sigmasqall # ZZinv +// For Wald test of excluded instruments + R = I(L1) , J(L1, L2, 0) +// For AP and SW stats + QXhXh = quadcross(Xhat, wf*wvar, Xhat) / N + QXhX1 = quadcross(Xhat, wf*wvar, X1 ) / N + +// VCV for system of first-stage eqns +// Can be robust; even if not, has correct off-block-diagonal covariances + vcvo.ename = ematnames + vcvo.e = &emat + emat[.,.] = eall + omegar = m_omega(vcvo) + Vr = makesymmetric(I(K1+1)#QZZinv * omegar * I(K1+1)#QZZinv) / N + +// AR statistics from RF (first column) + Rb = bz[ (1::L1), 1 ] + RVR = Vr[| 1,1 \ L1, L1 |] + ARWald = Rb' * cholsolve(RVR, Rb) + ARF = ARWald + ARdf = L1 + if (clustvarname=="") { + ARdf2 = (N-dofminus-L-sdofminus) + ARF = ARWald / (N-dofminus) * ARdf2 / ARdf + } + else { + ARdf2 = N_clust - 1 + ARF = ARWald / (N-1) * (N-L-sdofminus) /(N_clust) * ARdf2 / ARdf + } + ARFp = Ftail(ARdf, ARdf2, ARF) + ARchi2 = ARWald + ARchi2p = chi2tail(ARdf, ARchi2) + +// Stock-Wright LM S statistic +// Equivalent to J stat for model with coeff on endog=0 and with inexog partialled out +// = LM version of AR stat (matches weakiv) + if (K2>0) { + by = cholsolve(QX2X2, QX2y) + e[.,.] = y-X2*by + } + else { + e[.,.] = y + } +// initialize residual for VCV calc to be single Nx1 vector + vcvo.e = &e + vcvo.ename = ename +// get VCV and sstat=J + omega = m_omega(vcvo) + gbar = 1/N * quadcross(Z, wf*wvar, e) + sstat = N * gbar' * cholsolve(omega, gbar) + sstatdf = L1 + sstatp = chi2tail(sstatdf, sstat) + +// Prepare to loop over X1s for F, SW and AP stats +// initialize matrix to save first-stage results + firstmat=J(21,0,0) +// initialize residual for VCV calc to be single Nx1 vector + vcvo.e = &e + vcvo.ename = ename + + for (i=1; i<=K1; i++) { + +// RMSEs for first stage start in SECOND row/column (first has RF) + rmse = rmseall[i+1,i+1] +// Shea partial R2 + shea = sheaall[1,i] +// first-stage coeffs for ith X1. +// (nb: first column is reduced form eqn for y) + b=bz[., (i+1)] +// Classical Wald stat (chi2 here); also yields partial R2 +// Since r is an L1 x 1 zero vector, can use Rb instead of (Rb-r) + Rb = b[ (1::L1), . ] + RVR = V[| 1+i*L,1+i*L \ i*L+L1, i*L+L1 |] + Wald = Rb' * cholsolve(RVR, Rb) +// Wald stat has dofminus correction in it via sigmasq, +// so remove it to calculate partial R2 + pr2 = (Wald/(N-dofminus)) / (1 + (Wald/(N-dofminus))) + +// Robustify F stat if necessary. + if ((robust~="") | (clustvarname~="") | (kernel~="") | (sw~="")) { + RVR = Vr[| 1+i*L,1+i*L \ i*L+L1, i*L+L1 |] + Wald = Rb' * cholsolve(RVR, Rb) + } +// small dof adjustment is effectively additional L2, e.g., partialled-out regressors + df = L1 + if (clustvarname=="") { + df_r = (N-dofminus-L-sdofminus) + F = Wald / (N-dofminus) * df_r / df + } + else { + df_r = N_clust - 1 + F = Wald / (N-1) * (N-L-sdofminus) * (N_clust - 1) / N_clust / df + } + pvalue = Ftail(df, df_r, F) + +// If #endog=1, AP=SW=standard F stat + if (K1==1) { + Fdf1 = df + Fdf2 = df_r + SWF = F + SWFp = pvalue + SWchi2 = Wald + SWchi2p = chi2tail(Fdf1, SWchi2) + SWr2 = pr2 + APF = SWF + APFp = SWFp + APchi2 = SWchi2 + APchi2p = SWchi2p + APr2 = SWr2 + } + else { + +// Angrist-Pischke and Sanderson-Windmeijer stats etc. +// select matrix needed for both; will select all but the endog regressor of interest + selmat=J(1,K,1) + selmat[1,i]=0 // don't select endog regressor of interest + +// AP +// QXhXh is crossproduct of X1hats (fitted Xs) plus Z2s +// QXhX1 is crossproduct with X1s +// QXhXhi and QXhX1i remove the row/col for the endog regressor of interest + QXhXhi = select(select(QXhXh,selmat)', selmat) + QXhX1i = select(QXhX1[.,i], selmat') +// 1st step - in effect, 2nd stage of 2SLS using FITTED X1hats, and then get residuals e1 + b1=cholsolve(QXhXhi, QXhX1i) + QXhXhinv = invsym(QXhXhi) // Need this for V + b1=QXhXhinv*QXhX1i + e1 = X1[.,i] - select(Xhat,selmat)*b1 +// 2nd step - regress e1 on all Zs and test excluded ones + QZe1 = quadcross(Z, wf*wvar, e1 ) / N + b2=cholsolve(QZZ, QZe1) + APe2 = e1 - Z*b2 + ee = quadcross(APe2, wf*wvar, APe2) + sigmasq2 = ee / (N-dofminus) +// Classical V + Vi = sigmasq2 * QZZinv / N + APRb=b2[ (1::L1), .] + APRVR = Vi[ (1::L1), (1..L1) ] + APWald = APRb' * cholsolve(APRVR, APRb) +// Wald stat has dofminus correction in it via sigmasq, +// so remove it to calculate partial R2 + APr2 = (APWald/(N-dofminus)) / (1 + (APWald/(N-dofminus))) + +// Now SW stat +// Uses same 2SLS coeffs as AP but resids use ACTUAL X1 (not fitted X1) + e1 = X1[.,i] - select(X,selmat)*b1 +// next step - regress e on all Zs and test excluded ones + QZe1 = quadcross(Z, wf*wvar, e1 ) / N + b2=cholsolve(QZZ, QZe1) + SWe2 = e1 - Z*b2 + ee = quadcross(SWe2, wf*wvar, SWe2) + sigmasq2 = ee / (N-dofminus) + Vi = sigmasq2 * QZZinv / N + SWRb=b2[ (1::L1), .] + SWRVR = Vi[ (1::L1), (1..L1) ] + SWWald = SWRb' * cholsolve(SWRVR, SWRb) +// Wald stat has dofminus correction in it via sigmasq, +// so remove it to calculate partial R2 + SWr2 = (SWWald/(N-dofminus)) / (1 + (SWWald/(N-dofminus))) + +// Having calculated AP and SW R-sq based on non-robust Wald, now get robust Wald if needed. + if ((robust~="") | (clustvarname~="") | (kernel~="") | (sw~="")) { + e[.,1]=APe2 + omega=m_omega(vcvo) + Vi = makesymmetric(QZZinv * omega * QZZinv) / N + APRVR = Vi[ (1::L1), (1..L1) ] + APWald = APRb' * cholsolve(APRVR, APRb) // re-use APRb + e[.,1]=SWe2 + omega=m_omega(vcvo) + Vi = makesymmetric(QZZinv * omega * QZZinv) / N + SWRVR = Vi[ (1::L1), (1..L1) ] + SWWald = SWRb' * cholsolve(SWRVR, SWRb) // re-use SWRb + } + +// small dof adjustment is effectively additional L2, e.g., partialled-out regressors + Fdf1 = (L1-K1+1) + if (clustvarname=="") { + Fdf2 = (N-dofminus-L-sdofminus) + APF = APWald / (N-dofminus) * Fdf2 / Fdf1 + SWF = SWWald / (N-dofminus) * Fdf2 / Fdf1 + } + else { + Fdf2 = N_clust - 1 + APF = APWald / (N-1) * (N-L-sdofminus) * (N_clust - 1) / N_clust / Fdf1 + SWF = SWWald / (N-1) * (N-L-sdofminus) * (N_clust - 1) / N_clust / Fdf1 + } + APFp = Ftail(Fdf1, Fdf2, APF) + APchi2 = APWald + APchi2p = chi2tail(Fdf1, APchi2) + SWFp = Ftail(Fdf1, Fdf2, SWF) + SWchi2 = SWWald + SWchi2p = chi2tail(Fdf1, SWchi2) + } + +// Assemble results + firstmat = firstmat , /// + (rmse \ shea \ pr2 \ F \ df \ df_r \ pvalue /// + \ SWF \ Fdf1 \ Fdf2 \ SWFp \ SWchi2 \ SWchi2p \ SWr2 /// + \ APF \ Fdf1 \ Fdf2 \ APFp \ APchi2 \ APchi2p \ APr2) + } // end of loop for an X1 variable + + st_numscalar("r(rmse_rf)", rmseall[1,1]) + st_matrix("r(firstmat)", firstmat) + st_matrix("r(b)", bz) + st_matrix("r(V)", Vr) + st_matrix("r(S)", omegar) + st_numscalar("r(archi2)", ARchi2) + st_numscalar("r(archi2p)", ARchi2p) + st_numscalar("r(arf)", ARF) + st_numscalar("r(arfp)", ARFp) + st_numscalar("r(ardf)", ARdf) + st_numscalar("r(ardf_r)", ARdf2) + st_numscalar("r(sstat)",sstat) + st_numscalar("r(sstatp)",sstatp) + st_numscalar("r(sstatdf)",sstatdf) + +} // end program s_ffirst + +// ********************************************************************** + +void s_omega( + string scalar ZZmatrix, + string scalar ename, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + scalar center, + scalar dofminus) +{ + + struct ms_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.center = center + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + + st_view(Z, ., st_tsrevar(tokens(Znames)), touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + st_view(e, ., vcvo.ename, touse) + + vcvo.e = &e + vcvo.Z = &Z + vcvo.wvar = &wvar + + ZZ = st_matrix(ZZmatrix) + + S=m_omega(vcvo) + + st_matrix("r(S)", S) +} // end of s_omega program + + +// Mata utility for sequential use of solvers +// Default is cholesky; +// if that fails, use QR; +// if overridden, use QR. + +function cholqrsolve ( numeric matrix A, + numeric matrix B, + | real scalar useqr) +{ + if (args()==2) useqr = 0 + + real matrix C + + if (!useqr) { + C = cholsolve(A, B) + if (C[1,1]==.) { + C = qrsolve(A, B) + } + } + else { + C = qrsolve(A, B) + } + + return(C) + +} + +end // end Mata section + +exit // exit before loading comments + +********************************** VERSION COMMENTS ********************************** +* Initial version cloned from official ivreg version 5.0.9 19Dec2001 +* 1.0.2: add logic for reg3. Sargan test +* 1.0.3: add prunelist to ensure that count of excluded exogeneous is correct +* 1.0.4: revise option to exog(), allow included exog to be specified as well +* 1.0.5: switch from reg3 to regress, many options and output changes +* 1.0.6: fixed treatment of nocons in Sargan and C-stat, and corrected problems +* relating to use of nocons combined with a constant as an IV +* 1.0.7: first option reports F-test of excluded exogenous; prunelist bug fix +* 1.0.8: dropped prunelist and switched to housekeeping of variable lists +* 1.0.9: added collinearity checks; C-stat calculated with recursive call; +* added ffirst option to report only F-test of excluded exogenous +* from 1st stage regressions +* 1.0.10: 1st stage regressions also report partial R2 of excluded exogenous +* 1.0.11: complete rewrite of collinearity approach - no longer uses calls to +* _rmcoll, does not track specific variables dropped; prunelist removed +* 1.0.12: reorganised display code and saved results to enable -replay()- +* 1.0.13: -robust- and -cluster- now imply -small- +* 1.0.14: fixed hascons bug; removed ivreg predict fn (it didn't work); allowed +* robust and cluster with z stats and correct dofs +* 1.0.15: implemented robust Sargan stat; changed to only F-stat, removed chi-sq; +* removed exog option (only orthog works) +* 1.0.16: added clusterised Sargan stat; robust Sargan handles collinearities; +* predict now works with standard SE options plus resids; fixed orthog() +* so it accepts time series operators etc. +* 1.0.17: fixed handling of weights. fw, aw, pw & iw all accepted. +* 1.0.18: fixed bug in robust Sargan code relating to time series variables. +* 1.0.19: fixed bugs in reporting ranks of X'X and Z'Z +* fixed bug in reporting presence of constant +* 1.0.20: added GMM option and replaced robust Sargan with (equivalent) J; +* added saved statistics of 1st stage regressions +* 1.0.21: added Cragg HOLS estimator, including allowing empty endog list; +* -regress- syntax now not allowed; revised code searching for "_cons" +* 1.0.22: modified cluster output message; fixed bug in replay for Sargan/Hansen stat; +* exactly identified Sargan/Hansen now exactly zero and p-value not saved as e(); +* cluster multiplier changed to 1 (from buggy multiplier), in keeping with +* eg Wooldridge 2002 p. 193. +* 1.0.23: fixed orthog option to prevent abort when restricted equation is underid. +* 1.0.24: fixed bug if 1st stage regressions yielded missing values for saving in e(). +* 1.0.25: Added Shea version of partial R2 +* 1.0.26: Replaced Shea algorithm with Godfrey algorithm +* 1.0.27: Main call to regress is OLS form if OLS or HOLS is specified; error variance +* in Sargan and C statistics use small-sample adjustment if -small- option is +* specified; dfn of S matrix now correctly divided by sample size +* 1.0.28: HAC covariance estimation implemented +* Symmetrize all matrices before calling syminv +* Added hack to catch F stats that ought to be missing but actually have a +* huge-but-not-missing value +* Fixed dof of F-stat - was using rank of ZZ, should have used rank of XX (couldn't use df_r +* because it isn't always saved. This is because saving df_r triggers small stats +* (t and F) even when -post- is called without dof() option, hence df_r saved only +* with -small- option and hence a separate saved macro Fdf2 is needed. +* Added rankS to saved macros +* Fixed trap for "no regressors specified" +* Added trap to catch gmm option with no excluded instruments +* Allow OLS syntax (no endog or excluded IVs specified) +* Fixed error messages and traps for rank-deficient robust cov matrix; includes +* singleton dummy possibility +* Capture error if posting estimated VCV that isn't pos def and report slightly +* more informative error message +* Checks 3 variable lists (endo, inexog, exexog) separately for collinearities +* Added AC (autocorrelation-consistent but conditionally-homoskedastic) option +* Sargan no longer has small-sample correction if -small- option +* robust, cluster, AC, HAC all passed on to first-stage F-stat +* bw must be < T +* 1.0.29 -orthog- also displays Hansen-Sargan of unrestricted equation +* Fixed collinearity check to include nocons as well as hascons +* Fixed small bug in Godfrey-Shea code - macros were global rather than local +* Fixed larger bug in Godfrey-Shea code - was using mixture of sigma-squares from IV and OLS +* with and without small-sample corrections +* Added liml and kclass +* 1.0.30 Changed order of insts macro to match saved matrices S and W +* 2.0.00 Collinearities no longer -qui- +* List of instruments tested in -orthog- option prettified +* 2.0.01 Fixed handling of nocons with no included exogenous, including LIML code +* 2.0.02 Allow C-test if unrestricted equation is just-identified. Implemented by +* saving Hansen-Sargan dof as = 0 in e() if just-identified. +* 2.0.03 Added score() option per latest revision to official ivreg +* 2.0.04 Changed score() option to pscore() per new official ivreg +* 2.0.05 Fixed est hold bug in first-stage regressions +* Fixed F-stat finite sample adjustment with cluster option to match official Stata +* Fixed F-stat so that it works with hascons (collinearity with constant is removed) +* Fixed bug in F-stat code - wasn't handling failed posting of vcv +* No longer allows/ignores nonsense options +* 2.0.06 Modified lsStop to sync with official ivreg 5.1.3 +* 2.0.07a Working version of CUE option +* Added sortpreserve, ivar and tvar options +* Fixed smalls bug in calculation of T for AC/HAC - wasn't using the last ob +* in QS kernel, and didn't take account of possible dropped observations +* 2.0.07b Fixed macro bug that truncated long varlists +* 2.0.07c Added dof option. +* Changed display of RMSE so that more digits are displayed (was %8.1g) +* Fixed small bug where cstat was local macro and should have been scalar +* Fixed bug where C stat failed with cluster. NB: wmatrix option and cluster are not compatible! +* 2.0.7d Fixed bug in dof option +* 2.1.0 Added first-stage identification, weak instruments, and redundancy stats +* 2.1.01 Tidying up cue option checks, reporting of cue in output header, etc. +* 2.1.02 Used Poskitt-Skeels (2002) result that C-D eval = cceval / (1-cceval) +* 2.1.03 Added saved lists of separate included and excluded exogenous IVs +* 2.1.04 Added Anderson-Rubin test of signif of endog regressors +* 2.1.05 Fix minor bugs relating to cluster and new first-stage stats +* 2.1.06 Fix bug in cue: capture estimates hold without corresponding capture on estimates unhold +* 2.1.07 Minor fix to ereturn local wexp, promote to version 8.2 +* 2.1.08 Added dofminus option, removed dof option. Added A-R test p-values to e(). +* Minor bug fix to A-R chi2 test - was N chi2, should have been N-L chi2. +* Changed output to remove potentially misleading refs to N-L etc. +* Bug fix to rhs count - sometimes regressors could have exact zero coeffs +* Bug fix related to cluster - if user omitted -robust-, orthog would use Sargan and not J +* Changed output of Shea R2 to make clearer that F and p-values do not refer to it +* Improved handling of collinearites to check across inexog, exexog and endo lists +* Total weight statement moved to follow summ command +* Added traps to catch errors if no room to save temporary estimations with _est hold +* Added -savefirst- option. Removed -hascons-, now synonymous with -nocons-. +* 2.1.09 Fixes to dof option with cluster so it no longer mimics incorrect areg behavior +* Local ivreg2cmd to allow testing under name ivreg2 +* If wmatrix supplied, used (previously not used if non-robust sargan stat generated) +* Allowed OLS using (=) syntax (empty endo and exexog lists) +* Clarified error message when S matrix is not of full rank +* cdchi2p, ardf, ardf_r added to saved macros +* first and ffirst replay() options; DispFirst and DispFFirst separately codes 1st stage output +* Added savefprefix, macro with saved first-stage equation names. +* Added version option. +* Added check for duplicate variables to collinearity checks +* Rewrote/simplified Godfrey-Shea partial r2 code +* 2.1.10 Added NOOUTput option +* Fixed rf bug so that first does not trigger unnecessary saved rf +* Fixed cue bug - was not starting with robust 2-step gmm if robust/cluster +* 2.1.11 Dropped incorrect/misleading dofminus adjustments in first-stage output summary +* 2.1.12 Collinearity check now checks across inexog/exexog/endog simultaneously +* 2.1.13 Added check to catch failed first-stage regressions +* Fixed misleading failed C-stat message +* 2.1.14 Fixed mishandling of missing values in AC (non-robust) block +* 2.1.15 Fixed bug in RF - was ignoring weights +* Added -endog- option +* Save W matrix for all cases; ensured copy is posted with wmatrix option so original isn't zapped +* Fixed cue bug - with robust, was entering IV block and overwriting correct VCV +* 2.1.16 Added -fwl- option +* Saved S is now robust cov matrix of orthog conditions if robust, whereas W is possibly non-robust +* weighting matrix used by estmator. inv(S)=W if estimator is efficient GMM. +* Removed pscore option (dropped by official ivreg). +* Fixed bug where -post- would fail because of missing values in vcv +* Remove hascons as synonym for nocons +* OLS now outputs 2nd footer with variable lists +* 2.1.17 Reorganization of code +* Added ll() macro +* Fixed N bug where weights meant a non-integer ob count that was rounded down +* Fixed -fwl- option so it correctly handles weights (must include when partialling-out) +* smatrix option takes over from wmatrix option. Consistent treatment of both. +* Saved smatrix and wmatrix now differ in case of inefficient GMM. +* Added title() and subtitle() options. +* b0 option returns a value for the Sargan/J stat even if exactly id'd. +* (Useful for S-stat = value of GMM objective function.) +* HAC and AC now allowed with LIML and k-class. +* Collinearity improvements: bug fixed because collinearity was mistakenly checked across +* inexog/exexog/endog simultaneously; endog predicted exactly by IVs => reclassified as inexog; +* _rmcollright enforces inexog>endo>exexog priority for collinearities, if Stata 9.2 or later. +* K-class, LIML now report Sargan and J. C-stat based on Sargan/J. LIML reports AR if homosked. +* nb: can always easily get a C-stat for LIML based on diff of two AR stats. +* Always save Sargan-Hansen as e(j); also save as e(sargan) if homoskedastic. +* Added Stock-Watson robust SEs options sw() +* 2.1.18 Added Cragg-Donald-Stock-Yogo weak ID statistic critical values to main output +* Save exexog_ct, inexog_ct and endog_ct as macros +* Stock-Watson robust SEs now assume ivar is group variable +* Option -sw- is standard SW. Option -swpsd- is PSD version a la page 6 point 10. +* Added -noid- option. Suppresses all first-stage and identification statistics. +* Internal calls to ivreg2 use noid option. +* Added hyperlinks to ivreg2.hlp and helpfile argument to display routines to enable this. +* 2.1.19 Added matrix rearrangement and checks for smatrix and wmatrix options +* Recursive calls to cstat simplified - no matrix rearrangement or separate robust/nonrobust needed +* Reintroduced weak ID stats to ffirst output +* Added robust ID stats to ffirst output for case of single endogenous regressor +* Fixed obscure bug in reporting 1st stage partial r2 - would report zero if no included exogenous vars +* Removed "HOLS" in main output (misleading if, e.g., estimation is AC but not HAC) +* Removed "ML" in main output if no endogenous regressors - now all ML is labelled LIML +* model=gmm is now model=gmm2s; wmatrix estimation is model=gmm +* wmatrix relates to gmm estimator; smatrix relates to gmm var-cov matrix; b0 behavior equiv to wmatrix +* b0 option implies nooutput and noid options +* Added nocollin option to skip collinearity checks +* Fixed minor display bug in ffirst output for endog vars with varnames > 12 characters +* Fixed bug in saved rf and first-stage results for vars with long varnames; uses permname +* Fixed bug in model df - had counted RHS, now calculates rank(V) since latter may be rank-deficient +* Rank of V now saved as macro rankV +* fwl() now allows partialling-out of just constant with _cons +* Added Stock-Wright S statistic (but adds overhead - calls preserve) +* Properties now include svyj. +* Noted only: fwl bug doesn't allow time-series operators. +* 2.1.20 Fixed Stock-Wright S stat bug - didn't allow time-series operators +* 2.1.21 Fixed Stock-Wright S stat to allow for no exog regressors cases +* 2.2.00 CUE partials out exog regressors, estimates endog coeffs, then exog regressors separately - faster +* gmm2s becomes standard option, gmm supported as legacy option +* 2.2.01 Added explanatory messages if gmm2s used. +* States if estimates efficient for/stats consistent for het, AC, etc. +* Fixed small bug that prevented "{help `helpfile'##fwl:fwl}" from displaying when -capture-d. +* Error message in footer about insuff rank of S changed to warning message with more informative message. +* Fixed bug in CUE with weights. +* 2.2.02 Removed CUE partialling-out; still available with fwl +* smatrix and wmatrix become documented options. e(model)="gmmw" means GMM with arbitrary W +* 2.2.03 Fixed bug in AC with aweights; was weighting zi'zi but not ei'ei. +* 2.2.04 Added abw code for bw(), removed properties(svyj) +* 2.2.05 Fixed bug in AC; need to clear variable vt1 at start of loop +* If iweights, N (#obs with precision) rounded to nearest integer to mimic official Stata treatment +* and therefore don't need N scalar at all - will be same as N +* Saves fwl_ct as macro. +* -ffirst- output, weak id stat, etc. now adjust for number of partialled-out variables. +* Related changes: df_m, df_r include adjustments for partialled-out variables. +* Option nofwlsmall introduced - suppresses above adjustments. Undocumented in ivreg2.hlp. +* Replaced ID tests based on canon corr with Kleibergen-Paap rk-based stats if not homoskedastic +* Replaced LR ID test stats with LM test stats. +* Checks that -ranktest- is installed. +* 2.2.06 Fixed bug with missing F df when cue called; updated required version of ranktest +* 2.2.07 Modified redundancy test statistic to match standard regression-based LM tests +* Change name of -fwl- option to -partial-. +* Use of b0 means e(model)=CUE. Added informative b0 option titles. b0 generates output but noid. +* Removed check for integer bandwidth if auto option used. +* 2.2.08 Add -nocollin- to internal calls and to -ivreg2_cue- to speed performance. +* 2.2.09 Per msg from Brian Poi, Alastair Hall verifies that Newey-West cited constant of 1.1447 +* is correct. Corrected mata abw() function. Require -ranktest- 1.1.03. +* 2.2.10 Added Angrist-Pischke multivariate f stats. Rewrite of first and ffirst output. +* Added Cragg-Donald to weak ID output even when non-iid. +* Fixed small bug in non-robust HAC code whereby extra obs could be used even if dep var missing. +* (required addition of L`tau'.(`s1resid') in creation of second touse variable) +* Fixed bugs that zapped varnames with "_cons" in them +* Changed tvar and ivar setup so that data must be tsset or xtset. +* Fixed bug in redundancy test stat when called by xtivreg2+cluster - no dofminus adj needed in this case +* Changed reporting so that gaps between panels are not reported as such. +* Added check that weight variable is not transformed by partialling out. +* Changed Stock-Wright S statistic so that it uses straight partialling-out of exog regressors +* (had been, in effect, doing 2SGMM partialling-out) +* Fixed bug where dropped collinear endogenous didn't get a warning or listing +* Removed N*CDEV Wald chi-sq statistic from ffirst output (LM stat enough) +* 3.0.00 Fully rewritten and Mata-ized code. Require min Stata 10.1 and ranktest 1.2.00. +* Mata support for Stock-Watson SEs for fixed effects estimator; doesn't support fweights. +* Changed handling of iweights yielding non-integer N so that (unlike official -regress-) all calcs +* for RMSE etc. use non-integer N and N is rounded down only at the end. +* Added support for Thompson/Cameron-Gelbach-Miller 2-level cluster-robust vcvs. +* 3.0.01 Now exits more gracefully if no regressors survive after collinearity checks +* 3.0.02 -capture- instead of -qui- before reduced form to suppress not-full-rank error warning +* Modified Stock-Wright code to partial out all incl Xs first, to reduce possibility of not-full-rank +* omega and missing sstat. Added check within Stock-Wright code to catch not-full-rank omega. +* Fixed bug where detailed first-stage stats with cluster were disrupted if data had been tsset +* using a different variables. +* Fixed bug that didn't allow regression on just a constant. +* Added trap for no observations. +* Added trap for auto bw with panel data - not allowed. +* 3.0.03 Fixed bug in m_omega that always used Stock-Watson spectral decomp to create invertible shat +* instead of only when (undocumented) spsd option is called. +* Fixed bug where, if matsize too small, exited with wrong error (mistakenly detected as collinearities) +* Removed inefficient call to -ranktest- that unnecessarily requested stats for all ranks, not just full. +* 3.0.04 Fixed coding error in m_omega for cluster+kernel. Was *vcvo.e[tmatrix[.,1]], should have been (*vcvo.e)[tmatrix[.,1]]. +* Fixed bug whereby clusters defined by strings were not handled correctly. +* Updated ranktest version check +* 3.0.05 Added check to catch unwanted transformations of time or panel variables by partial option. +* 3.0.06 Fixed partial bug - partialcons macro saved =0 unless _cons explicitly in partial() varlist +* 3.0.07 kclass was defaulting to LIML - fixed. +* Renamed spsd option to psda (a=abs) following Stock-Watson 2008. Added psd0 option following Politis 2007. +* Fixed bug that would prevent RF and first-stage with cluster and TS operators if cluster code changed sort order. +* Modified action if S matrix is not full rank and 2-step GMM chosen. Now continue but report problem in footer +* and do not report J stat etc. +* 3.0.08 Fixed cluster+bw; was not using all observations of all panel units if panel was unbalanced. +* Fixed inconsequential bug in m_omega that caused kernel loop to be entered (with no impact) even if kernel=="" +* Fixed small bug that compared bw to T instead of (correctly) to T/delta when checking that bw can't be too long. +* Added dkraay option = cluster on t var + kernel-robust +* Added kiefer option = truncated kernel, bw=T (max), and no robust +* Fixed minor reporting bug that reported time-series gaps in entire panel dataset rather than just portion touse-d. +* Recoded bw and kernel checks into subroutine vkernel. Allow non-integer bandwidth within check as in ranktest. +* 3.1.01 First ivreg2 version with accompanying Mata library (shared with -ranktest-). Mata library includes +* struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Fixed bug in 2-way cluster code (now in m_omega in Mata library) - would crash if K>1 (relevant for -ranktest- only). +* 3.1.02 Converted cdsy to Mata code and moved to Mata library. Standardized spelling/caps/etc. of QS as "Quadratic Spectral". +* 3.1.03 Improved partialling out in s_sstat and s_ffirst: replaced qrsolve with invsym. +* 3.1.04 Fixed minor bug in s_crossprod - would crash with L1=0 K1>0, and also with K=0 +* 3.1.05 Fixed minor bug in orthog - wasn't saving est results if eqn w/o suspect instruments did not execute properly +* Fixed minor bug in s_cccollin() - didn't catch perverse case of K1>0 (endog regressors) and L1=0 (no excl IVs) +* 3.1.06 Spelling fix for Danielle kernel, correct error check for bw vs T-1 +* 3.1.07 Fixed bug that would prevent save of e(sample) when partialling out just a constant +* 3.1.08 01Jan14. Fixed reporting bug with 2-way clustering and kernel-robust that would give wrong count for 2nd cluster variable. +* 3.1.09 13July14. _rmcollright under version control has serious bug for v10 and earlier. Replaced with canon corr approach. +* Fixed obscure bug in estimation sample - was not using obs when tsset tvar is missing, even if TS operators not used. +* Fixed bug in auto bw code so now ivreg2 and ivregress agree. Also, ivreg2 auto bw code handles gaps in TS correctly. +* 4.0.00 25Jan15. Promote to require Stata version 11.2 +* Rewrite of s_gmm1s, s_iegmm, s_egmm etc. to use matrix solvers rather than inversion. +* rankS and rankV now calculated along with estimators; rankS now always saved. +* Returned to use of _rmcollright to detect collinearities since bug was in Stata 10's _rmcollright and now not relevant. +* Added reporting of collinearities and duplicates in replay mode. +* Rewrite of legacy support for previous ivreg2x version. Main program calls ivreg2x depending on _caller(). +* Estimation and replay moved to ivreg211 subroutine above. +* 4.0.01 8Feb15. Fixed bug in default name and command used used for saved first and RF equations +* Fixed bug in saved command line (was ivreg211, should be ivreg2). +* 4.0.02 9Feb15. Changed forced exit at Stata <11 before continuing loading to forced exit pre-Mata code at Stata <9. +* 4.1.00 Substantial rewrite to allow factor variables. Now also accepts TS ops as well as FV ops in partial varlist. +* Rewrite included code for dropped/collinear/reclassified. +* Saved RF and 1st-stage estimations have "if e(sample)" instead of "if `touse'" in e(cmdline). +* Rewrite of s_gmm1s etc. to use qrsolve if weighting matrix not full rank or cholsolve fails +* Fixed bug in display subroutines that would display hyperlink to wrong (nonexistent) help file. +* 4.1.01 15Jun15. Fixed bug that did not allow dropped variables to be in partial(.) varlist. +* Major rewrite of parsing code and collinearity/dropped/reclassified code. +* Added support for display options noomitted, vsquish, noemptycells, baselevels, allbaselevels. +* Changed from _rmcoll/_rmcollright/_rmcoll2list to internal ivreg2_rmcollright2 +* Changed failure of ranktest to obtain id stats to non-fatal so that estimation proceeds. +* Removed recount via _rmcoll if noid option specified +* Added partial(_all) option. +* Improved checks of smatrix, wmatrix, b0 options +* Rewrite of first-stage and reduced form code; rewrite of replay(.) functionality +* Added option for displaying system of first-stage/reduced form eqns. +* Replaced AP first-stage test stats with SW (Sanderson-Windmeijer) first-stage stats +* Corrected S LM stat option; now calcuated in effect as J stat for case of no endog (i.e. b=0) +* with inexog partialled out i.e. LM version of AR stat; now matches weakiv +* Undocumented FV-related options: fvsep (expand endo, inexog, exexog separately) fvall (expand together) +* 4.1.02 17Jun15. Fixed bug in collinearity check - was ignoring weights. +* More informative error message if invalid matrix provided to smatrix(.) or wmatrix(.) options. +* Caught error if depvar was FV or TS var that expanded to >1 variable. +* 4.1.03 18Jun15. Fixed bug with robust + rf option. +* 4.1.04 18Jun15. Fixed bug in AR stat with dofminus option + cluster (was subtracting dof, shouldn't). +* 4.1.05 18Jun15. Added rmse, df_m, df_r to saved RF and first-stage equation results. +* 4.1.06 4July15. Replaced mvreg with Mata code for partialling out (big speed gains with many vars). +* Rewrote AddOmitted to avoid inefficient loop; replaced with Mata subscripting. +* Failure of id stats because of collinearities triggers error message only; estimation continues. +* Calculation of dofs etc. uses rankS and rankV instead of iv1_ct and rhs1_ct; +* counts are therefore correct even in presence of collinearities and use of nocollin option. +* nocollin options triggers use of QR instead of default Cholesky. +* rankxx and rankzz now based on diag0cnt of (XX)^-1 and (ZZ)^-1. +* CUE fails if either S or V not full rank; can happen if nocollin option used. +* Added undocumented useqr option to force use of QR instead of Cholesky. +* Misc other code tweaks to make results more robust to nocollin option. +* 4.1.07 12July15. Fixed bugs in calculation of rank(V) (had miscounted in some cases if omega not full rank) +* Changed calc of dofs etc. from rankS and rankV to rankzz and rankxx (had miscounted in some cases etc.). +* Restored warning message for all exog regressors case if S not full rank. +* 4.1.08 27July15. Replaced wordcount(.) function with word count macro in AddOmitted; +* AddOmitted called only if any omitted regressors to add. +* Added center option for centering moments. +* 4.1.09 20Aug15. Expanded error message for failure to save first-stage estimations (var name too long). +* Fixed bug when weighting used with new partial-out code (see 4.1.06 4July15). +* Tweaked code so that if called under Stata version < 11, main ivreg2.ado is exited immediately after +* loading parent ivreg2 program. Removed automatic use of QR solver when nocollin option used. +* Added saved condition numbers for XX and ZZ. +* e(cmdline) now saves original string including any "s (i.e., saves `0' instead of `*'). +* 4.1.10 Fixed bug with posting first-stage results if sort had been disrupted by Mata code. +* Fixed bug which mean endog(.) and orthog(.) varlists weren't saved or displayed. +* 4.1.11 22Nov19. Added caller(.) option to ivreg211 subroutine to pass version of parent Stata _caller(.). +* Local macro with this parent Stata version is `caller'. +* Changed calls to ranktest so that if parent Stata is less than version 16, +* ranktest is called under version control as version 11.2: ranktest ..., +* otherwise it is called as version `caller': ranktest ... . +* Added macro e(ranktestcmd); will be ranktest, or ranktest11, or .... +* 4.1.12 14aug2024 Found that abw did not work with FVs. Allowed FVs, substtuted +* fvrevar for tsrevar in the abw routine. diff --git a/data/ado/i/ivreg2.sthlp b/data/ado/i/ivreg2.sthlp new file mode 100644 index 0000000..3ec39f5 --- /dev/null +++ b/data/ado/i/ivreg2.sthlp @@ -0,0 +1,1787 @@ +{smcl} +{* 30July2015}{...} +{hline} +help for {hi:ivreg2} +{hline} + +{title:Extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression} + +{p 4}Full syntax + +{p 8 14}{cmd:ivreg2} {it:depvar} [{it:varlist1}] +{cmd:(}{it:varlist2}{cmd:=}{it:varlist_iv}{cmd:)} [{it:weight}] +[{cmd:if} {it:exp}] [{cmd:in} {it:range}] +{bind:[{cmd:,} {cmd:gmm2s}} +{cmd:bw(}{it:#}{cmd:)} +{cmd:kernel(}{it:string}{cmd:)} +{cmd:dkraay(}{it:integer}{cmd:)} +{cmd:kiefer} +{cmd:liml} +{cmd:fuller(}{it:#}{cmd:)} +{cmd:kclass(}{it:#}{cmd:)} +{cmd:coviv} +{cmd:cue} +{cmd:b0}{cmd:(}{it:matrix}{cmd:)} +{cmdab:r:obust} +{cmdab:cl:uster}{cmd:(}{it:varlist}{cmd:)} +{cmd:orthog(}{it:varlist_ex}{cmd:)} +{cmd:endog(}{it:varlist_en}{cmd:)} +{cmdab:red:undant(}{it:varlist_ex}{cmd:)} +{cmd:partial(}{it:varlist}{cmd:)} +{cmdab:sm:all} +{cmdab:noc:onstant} +{cmd:center} +{cmd:smatrix}{cmd:(}{it:matrix}{cmd:)} +{cmd:wmatrix}{cmd:(}{it:matrix}{cmd:)} +{cmd:first} {cmd:ffirst} {cmd:savefirst} {cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:sfirst} {cmd:savesfirst} {cmdab:savesfp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:rf} {cmd:saverf} {cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:nocollin} {cmd:noid} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmd:bvclean} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{bind:{cmd:plus} ]} + +{p 4}Replay syntax + +{p 8 14}{cmd:ivreg2} +{bind:[{cmd:,} {cmd:first}} {cmd:sfirst} +{cmd:ffirst} {cmd:rf} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{cmd:plus} ]} + +{p 4}Version syntax + +{p 8 14}{cmd:ivreg2}, {cmd:version} + +{p}{cmd:ivreg2} is compatible with Stata version 8 or later. +The most-up-to-date implementation of {cmd:ivreg2} requires +Stata version 11 or later. +If {cmd:ivreg2} is called under earlier versions of Stata, +it will run a legacy version {cmd:ivreg2x}. +See below under {help ivreg2##s_versions:Running ivreg2 under earlier versions of Stata} +for details. + +{p}{cmd:ivreg2} may be used with time-series or panel data, +in which case the data must be {cmd:tsset} +before using {cmd:ivreg2}; see help {help tsset}. + +{p}All {it:varlists} may contain time-series operators or factor variables; +see help {help varlist}. + +{p}{cmd:by}, {cmd:rolling}, {cmd:statsby}, {cmd:xi}, +{cmd:bootstrap} and {cmd:jackknife} are allowed; see help {help prefix}. + +{p}{cmd:aweight}s, {cmd:fweight}s, {cmd:iweight}s and {cmd:pweight}s +are allowed; see help {help weights}. + +{p}The syntax of {help predict} following {cmd:ivreg2} is + +{p 8 16}{cmd:predict} [{it:type}] {it:newvarname} [{cmd:if} {it:exp}] +[{cmd:in} {it:range}] [{cmd:,} {it:statistic}] + +{p}where {it:statistic} is + +{p 8 23}{cmd:xb}{space 11}fitted values; the default{p_end} +{p 8 23}{cmdab:r:esiduals}{space 4}residuals{p_end} +{p 8 23}{cmd:stdp}{space 9}standard error of the prediction{p_end} + +{p}These statistics are available both in and out of sample; +type "{cmd:predict} {it:...} {cmd:if e(sample)} {it:...}" +if wanted only for the estimation sample. + +{title:Contents} +{p 2}{help ivreg2##s_description:Description}{p_end} +{p 2}{help ivreg2##s_robust:Robust, cluster and 2-way cluster, AC, HAC, and cluster+HAC SEs and statistics}{p_end} +{p 2}{help ivreg2##s_gmm:GMM estimation}{p_end} +{p 2}{help ivreg2##s_liml:LIML, k-class and GMM-CUE estimation}{p_end} +{p 2}{help ivreg2##s_sumopt:Summary of robust, HAC, AC, GMM, LIML and CUE options}{p_end} +{p 2}{help ivreg2##s_overid:Testing overidentifying restrictions}{p_end} +{p 2}{help ivreg2##s_endog:Testing subsets of regressors and instruments for endogeneity}{p_end} +{p 2}{help ivreg2##s_relevance:Tests of under- and weak identification}{p_end} +{p 2}{help ivreg2##s_redundancy:Testing instrument redundancy}{p_end} +{p 2}{help ivreg2##s_first:First-stage regressions, identification, and weak-id-robust inference}{p_end} +{p 2}{help ivreg2##s_rf:Reduced form estimates}{p_end} +{p 2}{help ivreg2##s_partial:Partialling-out exogenous regressors}{p_end} +{p 2}{help ivreg2##s_ols:OLS and Heteroskedastic OLS (HOLS) estimation}{p_end} +{p 2}{help ivreg2##s_collin:Collinearities}{p_end} +{p 2}{help ivreg2##s_speed:Speed options: nocollin and noid}{p_end} +{p 2}{help ivreg2##s_small:Small sample corrections}{p_end} +{p 2}{help ivreg2##s_options:Options summary}{p_end} +{p 2}{help ivreg2##s_versions:Running ivreg2 under earlier versions of Stata}{p_end} +{p 2}{help ivreg2##s_macros:Remarks and saved results}{p_end} +{p 2}{help ivreg2##s_examples:Examples}{p_end} +{p 2}{help ivreg2##s_refs:References}{p_end} +{p 2}{help ivreg2##s_acknow:Acknowledgements}{p_end} +{p 2}{help ivreg2##s_citation:Authors}{p_end} +{p 2}{help ivreg2##s_citation:Citation of ivreg2}{p_end} + +{marker s_description}{title:Description} + +{p}{cmd:ivreg2} implements a range of single-equation estimation methods +for the linear regression model: OLS, instrumental +variables (IV, also known as two-stage least squares, 2SLS), +the generalized method of moments (GMM), +limited-information maximum likelihood (LIML), and k-class estimators. +In the language of IV/GMM, {it:varlist1} are the exogenous +regressors or "included instruments", +{it:varlist_iv} are the exogenous variables excluded +from the regression or "excluded instruments", +and {it:varlist2} the endogenous regressors that are being "instrumented". + +{p}{cmd:ivreg2} will also estimate linear regression models using +robust (heteroskedastic-consistent), +autocorrelation-consistent (AC), +heteroskedastic and autocorrelation-consistent (HAC) +and cluster-robust variance estimates. + +{p}{cmd:ivreg2} is an alternative to Stata's official {cmd:ivregress}. +Its features include: +two-step feasible GMM estimation ({cmd:gmm2s} option) +and continuously-updated GMM estimation ({cmd:cue} option); +LIML and k-class estimation; +automatic output of overidentification and underidentification test statistics; +C statistic test of exogeneity of subsets of instruments +({cmd:orthog()} option); +endogeneity tests of endogenous regressors +({cmd:endog()} option); +test of instrument redundancy +({cmd:redundant()} option); +kernel-based autocorrelation-consistent (AC) +and heteroskedastic and autocorrelation consistent (HAC) standard errors +and covariance estimation ({cmd:bw(}{it:#}{cmd:)} option), +with user-specified choice of kernel ({cmd:kernel()} option); +two-level {cmd:cluster}-robust standard errors and statistics; +default reporting of large-sample statistics +(z and chi-squared rather than t and F); +{cmd:small} option to report small-sample statistics; +first-stage regressions reported with various tests and statistics for +identification and instrument relevance; +{cmd:ffirst} option to report only these identification statistics +and not the first-stage regression results themselves. +{cmd:ivreg2} can also be used for ordinary least squares (OLS) estimation +using the same command syntax as official {cmd:regress} and {cmd:newey}. + +{marker s_robust}{dlgtab:Robust, cluster and 2-level cluster, AC, HAC, and cluster+HAC SEs and statistics} + +{p}The standard errors and test statistics reported by {cmd:ivreg2} can be made consistent +to a variety of violations of the assumption of i.i.d. errors. +When these options are combined with +either the {cmd:gmm2s} or {cmd:cue} options (see below), +the parameter estimators reported are also efficient +in the presence of the same violation of i.i.d. errors. + +{p}The options for SEs and statistics are:{break} +{bind:(1) {cmd:robust}} causes {cmd:ivreg2} to report SEs and statistics that are +robust to the presence of arbitrary heteroskedasticity.{break} +{bind:(2) {cmd:cluster}({it:varname})} SEs and statistics are robust to both +arbitrary heteroskedasticity and arbitrary intra-group correlation, +where {it:varname} identifies the group. +See the relevant Stata manual entries on obtaining robust covariance estimates +for further details.{break} +{bind:(3) {cmd:cluster}({it:varname1 varname2})} provides 2-way clustered SEs +and statistics (Cameron et al. 2006, Thompson 2009) +that are robust to arbitrary heteroskedasticity and intra-group correlation +with respect to 2 non-nested categories defined by {it:varname1} and {it:varname2}. +See below for a detailed description.{break} +{bind:(4) {cmd:bw(}{it:#}{cmd:)}} requests AC SEs and statistics that are +robust to arbitrary autocorrelation.{break} +{bind:(5) {cmd:bw(}{it:#}{cmd:)}} combined with {cmd:robust} +requests HAC SEs and statistics that are +robust to both arbitrary heteroskedasticity and arbitrary autocorrelation.{break} +{bind:(6) {cmd:bw(}{it:#}{cmd:)}} combined with {cmd:cluster}({it:varname}) +is allowed with either 1- or 2-level clustering if the data are panel data +that are {cmd:tsset} on the time variable {it:varname}. +Following Driscoll and Kray (1998), +the SEs and statistics reported will be robust to disturbances +that are common to panel units and that are persistent, i.e., autocorrelated.{break} +{bind:(7) {cmd:dkraay(}{it:#}{cmd:)}} is a shortcut for the Driscoll-Kraay SEs +for panel data in (6). +It is equivalent to clustering on the {cmd:tsset} time variable +and the bandwidth supplied as {it:#}. +The default kernel Bartlett kernel can be overridden with the {cmd:kernel} option.{break} +{bind:(8) {cmd:kiefer}} implements SEs and statistics for panel data +that are robust to arbitrary intra-group autocorrelation +(but {it:not} heteroskedasticity) as per Kiefer (1980). +It is equivalent to to specifying the truncated kernel with {cmd:kernel(tru)} +and {cmd:bw(}{it:#}{cmd:)} where {it:#} is the full length of the panel. + +{p}Details: + +{p}{cmd:cluster}({it:varname1 varname2}) provides 2-way cluster-robust SEs +and statistics as proposed by Cameron, Gelbach and Miller (2006) and Thompson (2009). +"Two-way cluster-robust" means the SEs and statistics +are robust to arbitrary within-group correlation in two distinct non-nested categories +defined by {it:varname1} and {it:varname2}. +A typical application would be panel data where one "category" is the panel +and the other "category" is time; +the resulting SEs are robust +to arbitrary within-panel autocorrelation (clustering on panel id) +and to arbitrary contemporaneous cross-panel correlation (clustering on time). +There is no point in using 2-way cluster-robust SEs if the categories are nested, +because the resulting SEs are equivalent to clustering on the larger category. +{it:varname1} and {it:varname2} do not have to +uniquely identify observations. +The order of {it:varname1} and {it:varname2} does not matter for the results, +but processing may be faster if the category with the larger number of categories +(typically the panel dimension) is listed first. + +{p}Cameron, Gelbach and Miller (2006) show how this approach can accommodate +multi-way clustering, where the number of different non-nested categories is arbitary. +Their Stata command {cmd:cgmreg} implements 2-way and multi-way clustering +for OLS estimation. +The two-way clustered variance-covariance estimator +is calculated using 3 different VCEs: one clustered on {it:varname1}, +the second clustered on {it:varname2}, and the third clustered on the +intersection of {it:varname1} and {it:varname2}. +Cameron et al. (2006, pp. 8-9) discuss two possible small-sample adjustments +using the number of clusters in each category. +{cmd:cgmreg} uses one method (adjusting the 3 VCEs separately based on +the number of clusters in the categories VCE clusters on); +{cmd:ivreg2} uses the second (adjusting the final 2-way cluster-robust VCE +using the smaller of the two numbers of clusters). +For this reason, {cmd:ivreg2} and {cmd:cgmreg} will produce slightly different SEs. +See also {help ivreg2##s_small:small sample corrections} below. + +{p}{cmd:ivreg2} allows a variety of options for kernel-based HAC and AC estimation. +The {cmd:bw(}{it:#}{cmd:)} option sets the bandwidth used in the estimation +and {cmd:kernel(}{it:string}{cmd:)} is the kernel used; +the default kernel is the Bartlett kernel, +also known in econometrics as Newey-West (see help {help newey}). +The full list of kernels available is (abbreviations in parentheses): +Bartlett (bar); Truncated (tru); Parzen (par); Tukey-Hanning (thann); +Tukey-Hamming (thamm); Daniell (dan); Tent (ten); and Quadratic-Spectral (qua or qs). +When using the Bartlett, Parzen, or Quadratic spectral kernels, the automatic +bandwidth selection procedure of Newey and West (1994) can be chosen +by specifying {cmd:bw(}{it:auto}{cmd:)}. +{cmd:ivreg2} can also be used for kernel-based estimation +with panel data, i.e., a cross-section of time series. +Before using {cmd:ivreg2} for kernel-based estimation +of time series or panel data, +the data must be {cmd:tsset}; see help {help tsset}. + +{p}Following Driscoll and Kraay (1998), +{cmd:bw(}{it:#}{cmd:)} combined with {cmd:cluster}({it:varname}) +and applied to panel data produces SEs that are +robust to arbitary common autocorrelated disturbances. +The data must be {cmd:tsset} with the time variable specified as {it:varname}. +Driscoll-Kraay SEs also can be specified using the {cmd:dkraay(}{it:#}{cmd:)}} option, +where {it:#} is the bandwidth. +The default Bartlett kernel can be overridden with the {cmd:kernel} option. +Note that the Driscoll-Kraay variance-covariance estimator is a large-T estimator, +i.e., the panel should have a long-ish time-series dimension. + +{p}Used with 2-way clustering as per Thompson (2009), +{cmd:bw(}{it:#}{cmd:)} combined with {cmd:cluster}({it:varname}) +provides SEs and statistics that are robust +to autocorrelated within-panel disturbances (clustering on panel id) +and to autocorrelated across-panel disturbances (clustering on time +combined with kernel-based HAC). +The approach proposed by Thompson (2009) can be implemented in {cmd:ivreg2} +by choosing the truncated kernel {cmd:kernel(}{it:tru}{cmd:)} +and {cmd:bw(}{it:#}{cmd:)}, where the researcher knows or assumes +that the common autocorrelated disturbances can be ignored after {it:#} periods. + +{p}{cmd:Important:} Users should be aware of the asymptotic requirements +for the consistency of the chosen VCE. +In particular: consistency of the 1-way cluster-robust VCE requires +the number of clusters to go off to infinity; +consistency of the 2-way cluster-robust VCE requires the numbers of +clusters in both categories to go off to infinity; +consistency of kernel-robust VCEs requires the numbers of +observations in the time dimension to go off to infinity. +See Angrist and Pischke (2009), Cameron et al. (2006) and Thompson (2009) +for detailed discussions of the performance of the cluster-robust VCE +when the numbers of clusters is small. + +{marker s_gmm}{dlgtab:GMM estimation} + +{p}When combined with the above options, the {cmd:gmm2s} option generates +efficient estimates of the coefficients as well as consistent +estimates of the standard errors. +The {cmd:gmm2s} option implements the two-step efficient +generalized method of moments (GMM) estimator. +The efficient GMM estimator minimizes the GMM criterion function +J=N*g'*W*g, where N is the sample size, +g are the orthogonality or moment conditions +(specifying that all the exogenous variables, or instruments, +in the equation are uncorrelated with the error term) +and W is a weighting matrix. +In two-step efficient GMM, the efficient or optimal weighting matrix +is the inverse of an estimate of the covariance matrix of orthogonality conditions. +The efficiency gains of this estimator relative to the +traditional IV/2SLS estimator derive from the use of the optimal +weighting matrix, the overidentifying restrictions of the model, +and the relaxation of the i.i.d. assumption. +For an exactly-identified model, +the efficient GMM and traditional IV/2SLS estimators coincide, +and under the assumptions of conditional homoskedasticity and independence, +the efficient GMM estimator is the traditional IV/2SLS estimator. +For further details, see Hayashi (2000), pp. 206-13 and 226-27. + +{p}The {cmd:center} option specifies that the moments in the GMM weighting matrix +are centered so that they have mean zero. +There is some evidence that the use of centered moments leads to better +finite-sample performance; see e.g. Hall (2005), pp. 131-8 and 145-8. + +{p}The {cmd:wmatrix} option allows the user to specify a weighting matrix +rather than computing the optimal weighting matrix. +Estimation with the {cmd:wmatrix} option yields a possibly inefficient GMM estimator. +{cmd:ivreg2} will use this inefficient estimator as the first-step GMM estimator +in two-step efficient GMM when combined with the {cmd:gmm2s} option; +otherwise, {cmd:ivreg2} reports the regression results +using this inefficient GMM estimator. + +{p}The {cmd:smatrix} option allows the user to directly +specify the matrix S, the covariance matrix of orthogonality conditions. +{cmd:ivreg2} will use this matrix in the calculation of the variance-covariance +matrix of the estimator, the J statistic, +and, if the {cmd:gmm2s} option is specified, +the two-step efficient GMM coefficients. +The {cmd:smatrix} can be useful for guaranteeing a positive test statistic +in user-specified "GMM-distance tests" (see {help ivreg2##s_endog:below}). +For further details, see Hayashi (2000), pp. 220-24. + +{marker s_liml}{dlgtab:LIML, k-class and GMM-CUE estimation} + +{marker liml}{p} Maximum-likelihood estimation of a single equation of this form +(endogenous RHS variables and excluded instruments) +is known as limited-information maximum likelihood or LIML. +The overidentifying restrictions test +reported after LIML estimation is the Anderson-Rubin (1950) overidentification +statistic in a homoskedastic context. +LIML, OLS and IV/2SLS are examples of k-class estimators. +LIML is a k-class estimator with k=the LIML eigenvalue lambda; +2SLS is a k-class estimator with k=1; +OLS is a k-class esimator with k=0. +Estimators based on other values of k have been proposed. +Fuller's modified LIML (available with the {cmd:fuller(}{it:#}{cmd:)} option) +sets k = lambda - alpha/(N-L), where lambda is the LIML eigenvalue, +L = number of instruments (L1 excluded and L2 included), +and the Fuller parameter alpha is a user-specified positive constant. +Nagar's bias-adjusted 2SLS estimator can be obtained with the +{cmd:kclass(}{it:#}{cmd:)} option by setting +k = 1 + (L-K)/N, where L-K = number of overidentifying restrictions, +K = number of regressors (K1 endogenous and K2=L2 exogenous) +and N = the sample size. +For a discussion of LIML and k-class estimators, +see Davidson and MacKinnon (1993, pp. 644-51). + +{p} The GMM generalization of the LIML estimator +to the case of possibly heteroskedastic +and autocorrelated disturbances +is the "continuously-updated" GMM estimator or CUE +of Hansen, Heaton and Yaron (1996). +The CUE estimator directly maximizes the GMM objective function +J=N*g'*W(b_cue)*g, where W(b_cue) is an optimal weighting matrix +that depends on the estimated coefficients b_cue. +{cmd:cue}, combined with {cmd:robust}, {cmd:cluster}, and/or {cmd:bw}, +generates coefficient estimates that are efficient in the presence +of the corresponding deviations from homoskedasticity. +Specifying {cmd:cue} with no other options +is equivalent to the combination of the options {cmd:liml} and {cmd:coviv}. +The CUE estimator requires numerical optimization methods, +and the implementation here uses Mata's {cmd:optimize} routine. +The starting values are either IV or two-step efficient GMM +coefficient estimates. +If the user wants to evaluate the CUE objective function at +an arbitrary user-defined coefficient vector instead of having {cmd:ivreg2} +find the coefficient vector that minimizes the objective function, +the {cmd:b0(}{it:matrix}{cmd:)} option can be used. +The value of the CUE objective function at {cmd:b0} +is the Sargan or Hansen J statistic reported in the output. + +{marker s_sumopt}{dlgtab:Summary of robust, HAC, AC, GMM, LIML and CUE options} + + + +Estimator {col 20}No VCE option specificed {col 65}VCE option + option {col 60}{cmd:robust}, {cmd:cluster}, {cmd:bw}, {cmd:kernel} +{hline} +(none){col 15}IV/2SLS{col 60}IV/2SLS with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:liml}{col 15}LIML{col 60}LIML with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:gmm2s}{col 15}IV/2SLS{col 60}Two-step GMM with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:cue}{col 15}LIML{col 60}CUE GMM with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:kclass}{col 15}k-class estimator{col 60}k-class estimator with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:wmatrix}{col 15}Possibly inefficient GMM{col 60}Ineff GMM with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:gmm2s} + {col 15}Two-step GMM{col 60}Two-step GMM with +{cmd:wmatrix}{col 15}with user-specified first step{col 60}robust SEs +{col 15}SEs consistent under homoskedasticity + + +{p}With the {cmd:bw} or {cmd:bw} and {cmd:kernel} VCE options, +SEs are autocorrelation-robust (AC). +Combining the {cmd:robust} option with {cmd:bw}, SEs are heteroskedasticity- and +autocorrelation-robust (HAC). + +{p}For further details, see Hayashi (2000), pp. 206-13 and 226-27 +(on GMM estimation), Wooldridge (2002), p. 193 (on cluster-robust GMM), +and Hayashi (2000), pp. 406-10 or Cushing and McGarvey (1999) +(on kernel-based covariance estimation). + +{marker s_overid}{marker overidtests}{dlgtab:Testing overidentifying restrictions} + +{p}The Sargan-Hansen test is a test of overidentifying restrictions. +The joint null hypothesis is that the instruments are valid +instruments, i.e., uncorrelated with the error term, +and that the excluded instruments are correctly excluded from the estimated equation. +Under the null, the test statistic is distributed as chi-squared +in the number of (L-K) overidentifying restrictions. +A rejection casts doubt on the validity of the instruments. +For the efficient GMM estimator, the test statistic is +Hansen's J statistic, the minimized value of the GMM criterion function. +For the 2SLS estimator, the test statistic is Sargan's statistic, +typically calculated as N*R-squared from a regression of the IV residuals +on the full set of instruments. +Under the assumption of conditional homoskedasticity, +Hansen's J statistic becomes Sargan's statistic. +The J statistic is consistent in the presence of heteroskedasticity +and (for HAC-consistent estimation) autocorrelation; +Sargan's statistic is consistent if the disturbance is homoskedastic +and (for AC-consistent estimation) if it is also autocorrelated. +With {cmd:robust}, {cmd:bw} and/or {cmd:cluster}, +Hansen's J statistic is reported. +In the latter case the statistic allows observations +to be correlated within groups. +For further discussion see e.g. Hayashi (2000, pp. 227-8, 407, 417). + +{p}The Sargan statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg2} by the command {cmd:overid}. +The features of {cmd:ivreg2} that are unavailable in {cmd:overid} +are the J statistic and the C statistic; +the {cmd:overid} options unavailable in {cmd:ivreg2} +are various small-sample and pseudo-F versions of Sargan's statistic +and its close relative, Basmann's statistic. +See help {help overid} (if installed). + +{marker s_endog}{dlgtab:Testing subsets of regressors and instruments for endogeneity} + +{marker ctest}{p}The C statistic +(also known as a "GMM distance" +or "difference-in-Sargan" statistic) +implemented using the {cmd:orthog} option, +allows a test of a subset of the orthogonality conditions, i.e., +it is a test of the exogeneity of one or more instruments. +It is defined as +the difference of the Sargan-Hansen statistic +of the equation with the smaller set of instruments +(valid under both the null and alternative hypotheses) +and the equation with the full set of instruments, +i.e., including the instruments whose validity is suspect. +Under the null hypothesis that +both the smaller set of instruments +and the additional, suspect instruments are valid, +the C statistic is distributed as chi-squared +in the number of instruments tested. +Note that failure to reject the null hypothesis +requires that the full set of orthogonality conditions be valid; +the C statistic and the Sargan-Hansen test statistics +for the equations with both the smaller and full set of instruments +should all be small. +The instruments tested may be either excluded or included exogenous variables. +If excluded exogenous variables are being tested, +the equation that does not use these orthogonality conditions +omits the suspect instruments from the excluded instruments. +If included exogenous variables are being tested, +the equation that does not use these orthogonality conditions +treats the suspect instruments as included endogenous variables. +To guarantee that the C statistic is non-negative in finite samples, +the estimated covariance matrix of the full set orthogonality conditions +is used to calculate both Sargan-Hansen statistics +(in the case of simple IV/2SLS, this amounts to using the MSE +from the unrestricted equation to calculate both Sargan statistics). +If estimation is by LIML, the C statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For further discussion, see Hayashi (2000), pp. 218-22 and pp. 232-34. + +{marker endogtest}{p}Endogeneity tests of one or more endogenous regressors +can implemented using the {cmd:endog} option. +Under the null hypothesis that the specified endogenous regressors +can actually be treated as exogenous, the test statistic is distributed +as chi-squared with degrees of freedom equal to the number of regressors tested. +The endogeneity test implemented by {cmd:ivreg2}, is, like the C statistic, +defined as the difference of two Sargan-Hansen statistics: +one for the equation with the smaller set of instruments, +where the suspect regressor(s) are treated as endogenous, +and one for the equation with the larger set of instruments, +where the suspect regressors are treated as exogenous. +Also like the C statistic, the estimated covariance matrix used +guarantees a non-negative test statistic. +Under conditional homoskedasticity, +this endogeneity test statistic is numerically equal to +a Hausman test statistic; see Hayashi (2000, pp. 233-34). +The endogeneity test statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg2} by the command {cmd:ivendog}. +Unlike the Durbin-Wu-Hausman tests reported by {cmd:ivendog}, +the {cmd:endog} option of {cmd:ivreg2} can report test statistics +that are robust to various violations of conditional homoskedasticity; +the {cmd:ivendog} option unavailable in {cmd:ivreg2} +is the Wu-Hausman F-test version of the endogeneity test. +See help {help ivendog} (if installed). + +{marker s_relevance}{dlgtab:Tests of under- and weak identification} + +{marker idtest}{p}{cmd:ivreg2} automatically reports tests of +both underidentification and weak identification. +The underidentification test is an LM test of whether the equation is identified, +i.e., that the excluded instruments are "relevant", +meaning correlated with the endogenous regressors. +The test is essentially the test of the rank of a matrix: +under the null hypothesis that the equation is underidentified, +the matrix of reduced form coefficients on the L1 excluded instruments +has rank=K1-1 where K1=number of endogenous regressors. +Under the null, +the statistic is distributed as chi-squared +with degrees of freedom=(L1-K1+1). +A rejection of the null indicates that the matrix is full column rank, +i.e., the model is identified. + +{p}For a test of whether a particular endogenous regressor alone is identified, +see the discussion {help ivreg2##swstats:below} of the +Sanderson-Windmeijer (2015) and Angrist-Pischke (2009) procedures. + +{p}When errors are assumed to be i.i.d., +{cmd:ivreg2} automatically reports an LM version of +the Anderson (1951) canonical correlations test. +Denoting the minimum eigenvalue of the canonical correlations as CCEV, +the smallest canonical correlation between the K1 endogenous regressors +and the L1 excluded instruments +(after partialling out the K2=L2 exogenous regressors) +is sqrt(CCEV), +and the Anderson LM test statistic is N*CCEV, +i.e., N times the square of the smallest canonical correlation. +With the {cmd:first} or {cmd:ffirst} options, +{cmd:ivreg2} also reports the closely-related +Cragg-Donald (1993) Wald test statistic. +Again assuming i.i.d. errors, +and denoting the minimum eigenvalue of the Cragg-Donald statistic as CDEV, +CDEV=CCEV/(1-CCEV), +and the Cragg-Donald Wald statistic is N*CDEV. +Like the Anderson LM statistic, the Cragg-Donald Wald statistic +is distributed as chi-squred with (L1-K1+1) degrees of freedom. +Note that a result of rejection of the null +should be treated with caution, +because weak instrument problems may still be present. +See Hall et al. (1996) for a discussion of this test, +and below for discussion of testing for the presence of weak instruments. + +{p}When the i.i.d. assumption is dropped +and {cmd:ivreg2} reports heteroskedastic, AC, HAC +or cluster-robust statistics, +the Anderson LM and Cragg-Donald Wald statistics are no longer valid. +In these cases, {cmd:ivreg2} reports the LM and Wald versions +of the Kleibergen-Paap (2006) rk statistic, +also distributed as chi-squared with (L1-K1+1) degrees of freedom. +The rk statistic can be seen as a generalization of these tests +to the case of non-i.i.d. errors; +see Kleibergen and Paap (2006) for discussion, +and Kleibergen and Schaffer (2007) for a Stata implementation, {cmd:ranktest}. +{cmd:ivreg2} requires {cmd:ranktest} to be installed, +and will prompt the user to install it if necessary. +If {cmd:ivreg2} is invoked with the {cmd:robust} option, +the rk underidentification test statistics will be heteroskedastic-robust, +and similarly with {cmd:bw} and {cmd:cluster}. + +{marker widtest}{p}"Weak identification" arises when the excluded instruments are correlated +with the endogenous regressors, but only weakly. +Estimators can perform poorly when instruments are weak, +and different estimators are more robust to weak instruments (e.g., LIML) +than others (e.g., IV); +see, e.g., Stock and Yogo (2002, 2005) for further discussion. +When errors are assumed to be i.i.d., +the test for weak identification automatically reported +by {cmd:ivreg2} is an F version of the Cragg-Donald Wald statistic, (N-L)/L1*CDEV, +where L is the number of instruments and L1 is the number of excluded instruments. +Stock and Yogo (2005) have compiled critical values +for the Cragg-Donald F statistic for +several different estimators (IV, LIML, Fuller-LIML), +several different definitions of "perform poorly" (based on bias and test size), +and a range of configurations (up to 100 excluded instruments +and up to 2 or 3 endogenous regressors, +depending on the estimator). +{cmd:ivreg2} will report the Stock-Yogo critical values +if these are available; +missing values mean that the critical values +haven't been tabulated or aren't applicable. +See Stock and Yogo (2002, 2005) for details. + +{p}When the i.i.d. assumption is dropped +and {cmd:ivreg2} is invoked with the {cmd:robust}, {cmd:bw} or {cmd:cluster} options, +the Cragg-Donald-based weak instruments test is no longer valid. +{cmd:ivreg2} instead reports a correspondingly-robust +Kleibergen-Paap Wald rk F statistic. +The degrees of freedom adjustment for the rk statistic is (N-L)/L1, +as with the Cragg-Donald F statistic, +except in the cluster-robust case, +when the adjustment is N/(N-1) * (N_clust-1)/N_clust, +following the standard Stata small-sample adjustment for cluster-robust. In the case of two-way clustering, N_clust is the minimum of N_clust1 and N_clust2. +The critical values reported by {cmd:ivreg2} for the Kleibergen-Paap statistic +are the Stock-Yogo critical values for the Cragg-Donald i.i.d. case. +The critical values reported with 2-step GMM +are the Stock-Yogo IV critical values, +and the critical values reported with CUE +are the LIML critical values. + +{marker s_redundancy}{dlgtab:Testing instrument redundancy} + +{marker redtest}{p}The {cmd:redundant} option allows a test of +whether a subset of excluded instruments is "redundant". +Excluded instruments are redundant if the asymptotic efficiency +of the estimation is not improved by using them. +Breusch et al. (1999) show that the condition for the redundancy of a set of instruments +can be stated in several equivalent ways: +e.g., in the reduced form regressions of the endogenous regressors +on the full set of instruments, +the redundant instruments have statistically insignificant coefficients; +or the partial correlations between the endogenous regressors +and the instruments in question are zero. +{cmd:ivreg2} uses a formulation based on testing the rank +of the matrix cross-product between the endogenous regressors +and the possibly-redundant instruments after both have +all other instruments partialled-out; +{cmd:ranktest} is used to test whether the matrix has zero rank. +The test statistic is an LM test +and numerically equivalent to a regression-based LM test. +Under the null that the specified instruments are redundant, +the statistic is distributed as chi-squared +with degrees of freedom=(#endogenous regressors)*(#instruments tested). +Rejection of the null indicates that +the instruments are not redundant. +When the i.i.d. assumption is dropped +and {cmd:ivreg2} reports heteroskedastic, AC, HAC +or cluster-robust statistics, +the redundancy test statistic is similarly robust. +See Baum et al. (2007) for further discussion. + +{p}Calculation and reporting of all underidentification +and weak identification statistics +can be supressed with the {cmd:noid} option. + +{marker s_first}{dlgtab:First-stage regressions, identification, and weak-id-robust inference} + +{p}The {cmd:first}, {cmd:sfirst} and {cmd:ffirst} options report +various first-stage results and identification statistics. +The {cmd:first} option reports the individual first-stage regressions separately. +The {cmd:sfirst} option reports all the first-stage regressions jointly +in a single estimation table along with the reduced form equation +for the dependent variable (see {help ivreg2##s_rf:below}); +the output is similar in appearance and usage (e.g., in testing) +as that generated by Stata's {cmd:mvreg}. + +{marker swstats}{p}Tests of both underidentification and weak identification are reported +for each endogenous regressor separately, +using the method of Sanderson-Windmeijer (2015) +(a modification and improvement of the described by +Angrist and Pischke (2009), pp. 217-18, and implemented +in previous versions of {cmd:ivreg2}; +the AP test statistics remain available in the {cmd:e(first) matrix}). + +{p}The Sanderson-Windmeijer (SW) first-stage chi-squared and F statistics +are tests of underidentification and weak identification, respectively, +of individual endogenous regressors. +They are constructed by "partialling-out" linear projections of the +remaining endogenous regressors. +The SW chi-squared Wald statistic is distributed as chi2(L1-K1+1)) +under the null that the particular endogenous regressor +in question is unidentified. +In the special case of a single endogenous regressor, +the SW statistic reported is identical to underidentification statistics reported +in the {cmd:ffirst} output, +namely the Cragg-Donald Wald statistic (if i.i.d.) +or the Kleibergen-Paap rk Wald statistic (if robust, cluster-robust, AC or HAC +statistics have been requested); +see {help ivreg2##idtest:above}. +The SW first-stage F statistic is the F form of the same test statistic. +It can be used as a diagnostic for whether a particular endogenous regressor +is "weakly identified" (see {help ivreg2##widtest:above}). +For further details and discussion, see Sanderson and Windmeijer (2015). + +{p}The first-stage results are always reported with small-sample statistics, +to be consistent with the recommended use of the first-stage F-test as a diagnostic. +If the estimated equation is reported with robust standard errors, +the first-stage F-test is also robust. + +{p}A full set of first-stage statistics for each of the K1 endogenous regressors +is saved in the matrix e(first). +These include (a) the SW and AP F and chi-squared statistics; (b) the "partial R-squared" +(squared partial correlation) corresponding to the SW and SP statistics; +(c) Shea's (1997) partial R-squared measure (closely related to the SW and AP statistics, +but not amenable to formal testing); (d) the simple F and partial R-squared +statistics for each of the first-stage equations, +with no adjustments if there is more than one endogenous regressor. +In the special case of a single endogenous regressor, +these F statistics and partial R-squareds are identical. + +{marker wirobust}{p}The first-stage output also includes +two statistics that provide weak-instrument robust inference +for testing the significance of the endogenous regressors in the structural equation being estimated. +The first statistic is the Anderson-Rubin (1949) test +(not to be confused with the Anderson-Rubin overidentification test for LIML estimation; +see {help ivreg2##s_liml:above}). +The second is the closely related Stock-Wright (2000) S statistic. +The null hypothesis tested in both cases is that +the coefficients of the endogenous regressors in the structural equation are jointly equal to zero, +and, in addition, that the overidentifying restrictions are valid. +Both tests are robust to the presence of weak instruments. +The tests are equivalent to estimating the reduced form of the equation +(with the full set of instruments as regressors) +and testing that the coefficients of the excluded instruments are jointly equal to zero. +In the form reported by {cmd:ivreg2},the Anderson-Rubin statistic is a Wald test +and the Stock-Wright S statistic is an LM test. +Both statistics are distributed as chi-squared with L1 degrees of freedom, +where L1=number of excluded instruments. +The traditional F-stat version of the Anderson-Rubin test is also reported. +See Stock and Watson (2000), Dufour (2003), Chernozhukov and Hansen (2005) and Kleibergen (2007) +for further discussion. +For related alternative test statistics that are also robust to weak instruments, +see {help condivreg} and {help weakiv}, +and the corresponding discussions +in Moreira and Poi (2003) and Mikusheva and Poi (2006), +and in Finlay and Magnusson (2009), respectively. + +{p}The {cmd:savefirst} option requests that the individual first-stage regressions +be saved for later access using the {cmd:estimates} command. +If saved, they can also be displayed using {cmd:first} or {cmd:ffirst} and the {cmd:ivreg2} replay syntax. +The regressions are saved with the prefix "_ivreg2_", +unless the user specifies an alternative prefix with the +{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} option. +The {cmd:savesfirst} and {cmdab:savesfp:refix}{cmd:(}{it:prefix}{cmd:)} options +work similarly for the {cmd:sfirst} option if the user wishes to save +the first-stage and reduced form estimations as a single estimated system. + +{marker s_rf}{dlgtab:Reduced form estimates} + +{p}The {cmd:rf} option requests that the reduced form estimation of the equation be displayed. +The {cmd:saverf} option requests that the reduced form estimation is saved +for later access using the {cmd:estimates} command. +If saved, it can also be displayed using the {cmd:rf} and the {cmd:ivreg2} replay syntax. +The regression is saved with the prefix "_ivreg2_", +unless the user specifies an alternative prefix with the +{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} option. + +{marker s_partial}{dlgtab:Partialling-out exogenous regressors} + +{marker partial}{p}The {cmd:partial(}{it:varlist}{cmd:)} option requests that +the exogenous regressors in {it:varlist} are "partialled out" +from all the other variables (other regressors and excluded instruments) in the estimation. +If the equation includes a constant, it is also automatically partialled out as well. +The coefficients corresponding to the regressors in {it:varlist} are not calculated. +By the Frisch-Waugh-Lovell (FWL) theorem, in IV, +two-step GMM and LIML estimation the coefficients for the remaining regressors +are the same as those that would be obtained if the variables were not partialled out. +(NB: this does not hold for CUE or GMM iterated more than two steps.) +The {cmd:partial} option is most useful when using {cmd:cluster} +and #clusters < (#exogenous regressors + #excluded instruments). +In these circumstances, +the covariance matrix of orthogonality conditions S is not of full rank, +and efficient GMM and overidentification tests are infeasible +since the optimal weighting matrix W = {bind:S^-1} +cannot be calculated. +The problem can be addressed by using {cmd:partial} +to partial out enough exogenous regressors for S to have full rank. +A similar problem arises when the regressors include a variable that is a singleton dummy, +i.e., a variable with one 1 and N-1 zeros or vice versa, +if a robust covariance matrix is requested. +The singleton dummy causes the robust covariance matrix estimator +to be less than full rank. +In this case, partialling-out the variable with the singleton dummy solves the problem. +Specifying {cmd:partial(_cons)} will cause just the constant to be partialled-out, +i.e., the equation will be estimated in deviations-from-means form. +When {cmd:ivreg2} is invoked with {cmd:partial}, +it reports test statistics with the same small-sample adjustments +as if estimating without {cmd:partial}, +with the exception of the information in the output header +(the model F, R-sqs and total sums-of-squares +refer to the model after the variables are partialled-out). +Note that after estimation using the {cmd:partial} option, +the post-estimation {cmd:predict} can be used only to generate residuals. + +{marker s_ols}{dlgtab:OLS and Heteroskedastic OLS (HOLS) estimation} + +{p}{cmd:ivreg2} also allows straightforward OLS estimation +by using the same syntax as {cmd:regress}, i.e., +{it:ivreg2 depvar varlist1}. +This can be useful if the user wishes to use one of the +features of {cmd:ivreg2} in OLS regression, e.g., AC or +HAC standard errors. + +{p}If the list of endogenous variables {it:varlist2} is empty +but the list of excluded instruments {it:varlist_iv} is not, +and the option {cmd:gmm2s} is specified, +{cmd:ivreg2} calculates Cragg's "heteroskedastic OLS" (HOLS) estimator, +an estimator that is more efficient than OLS +in the presence of heteroskedasticity of unknown form +(see Davidson and MacKinnon (1993), pp. 599-600). +If the option {cmd:bw(}{it:#}{cmd:)} is specified, +the HOLS estimator is efficient in the presence of +arbitrary autocorrelation; +if both {cmd:bw(}{it:#}{cmd:)} and {cmd:robust} are specified +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and autocorrelation; +and if {cmd:cluster(}{it:varlist}{cmd:)} is used, +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and within-group correlation. +The efficiency gains of HOLS derive from the orthogonality conditions +of the excluded instruments listed in {it:varlist_iv}. +If no endogenous variables are specified and {cmd:gmm2s} is not specified, +{cmd:ivreg2} reports standard OLS coefficients. +The Sargan-Hansen statistic reported +when the list of endogenous variables {it:varlist2} is empty +is a Lagrange multiplier (LM) test +of the hypothesis that the excluded instruments {it:varlist_iv} are +correctly excluded from the restricted model. +If the estimation is LIML, the LM statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For more on LM tests, see e.g. Wooldridge (2002), pp. 58-60. +Note that because the approach of the HOLS estimator +has applications beyond heteroskedastic disturbances, +and to avoid confusion concerning the robustness of the estimates, +the estimators presented above as "HOLS" +are described in the output of {cmd:ivreg2} +as "2-Step GMM", "CUE", etc., as appropriate. + +{marker s_collin}{dlgtab:Collinearities} + +{p}{cmd:ivreg2} checks the lists of included instruments, +excluded instruments, and endogenous regressors +for collinearities and duplicates. If an endogenous regressor is +collinear with the instruments, it is reclassified as exogenous. If any +endogenous regressors are collinear with each other, some are dropped. +If there are any collinearities among the instruments, some are dropped; +excluded instruments are dropped before included instruments. +If any variables are dropped, a list of their names are saved +in the macros {cmd:e(collin)} and/or {cmd:e(dups)}. + +{p}Starting with {cmd:ivreg2} v4.1, +the Stata 11+ convention is followed and +omitted variables are reported in the regression output +and saved in the {cmd:e(b)} and {cmd:e(V)} macros. +These omitted variables, as well as other omitted variables +(e.g., empty factor variables) can be suppressed +by use of the {cmd:bvclean} option. +The Stata display options +{cmd:noomitted}, {cmd:vsquish}, {cmd:noemptycells}, {cmd:baselevels} and {cmd:allbaselevels} +are also supported; see {helpb ereturn##display_options:ereturn}. +Variable lists with collinear variables, duplicates marked with Stata's "o." operator, +and factor variable base variables +are saved in macros with a "0" appended to the corresponding macro names; +lists with these variables removed are saved in macros with a "1" appended. + +{p}Collinearity checks can be supressed with the {cmd:nocollin} option. + +{marker s_speed}{dlgtab:Speed options: nocollin and noid} + +{p}Two options are available for speeding execution. +{cmd:nocollin} specifies that the collinearity checks not be performed. +{cmd:noid} suspends calculation and reporting of +the underidentification and weak identification statistics +in the main output. + +{marker s_small}{dlgtab:Small sample corrections} + +{p}Mean square error = sqrt(RSS/(N-K)) if {cmd:small}, = sqrt(RSS/N) otherwise. + +{p}If {cmd:robust} is chosen, the finite sample adjustment +(see {hi:[R] regress}) to the robust variance-covariance matrix +qc = N/(N-K) if {cmd:small}, qc = 1 otherwise. + +{p}If {cmd:cluster} is chosen, the finite sample adjustment +qc = (N-1)/(N-K)*M/(M-1) if {cmd:small}, where M=number of clusters, +qc = 1 otherwise. +If 2-way clustering is used, M=min(M1,M2), +where M1=number of clusters in group 1 +and M2=number of clusters in group 2. + +{p}If the {cmd:partial(}{it:varlist}{cmd:)} option is used, +the partialled-out exogenous regressors are included in K. + +{p}The Sargan and C (difference-in-Sargan) statistics use +error variance = RSS/N, i.e., there is no small sample correction. + +{p}A full discussion of these computations and related topics +can be found in Baum, Schaffer, and Stillman (2003) and Baum, Schaffer and +Stillman (2007). Some features of the program postdate the former article and are described in the latter paper. +Some features, such as two-way clustering, postdate the latter article as well. + + +{marker s_options}{title:Options summary} + +{p 0 4}{cmd:gmm2s} requests the two-step efficient GMM estimator. +If no endogenous variables are specified, the estimator is Cragg's HOLS estimator. + +{p 0 4}{cmd:liml} requests the limited-information maximum likelihood estimator. + +{p 0 4}{cmd:fuller(}{it:#}{cmd:)} specifies that Fuller's modified LIML estimator +is calculated using the user-supplied Fuller parameter alpha, +a non-negative number. +Alpha=1 has been suggested as a good choice. + +{p 0 4}{cmd:kclass(}{it:#}{cmd:)} specifies that a general k-class estimator is calculated +using the user-supplied #, a non-negative number. + +{p 0 4}{cmd:coviv} specifies that the matrix used to calculate the +covariance matrix for the LIML or k-class estimator +is based on the 2SLS matrix, i.e., with k=1. +In this case the covariance matrix will differ from that calculated for the 2SLS +estimator only because the estimate of the error variance will differ. +The default is for the covariance matrix to be based on the LIML or k-class matrix. + +{p 0 4}{cmd:cue} requests the GMM continuously-updated estimator (CUE). + +{p 0 4}{cmd:b0(}{it:matrix}{cmd:)} specifies that the J statistic +(i.e., the value of the CUE objective function) +should be calculated for an arbitrary coefficient vector {cmd:b0}. +That vector must be provided as a matrix with appropriate row and column names. +Under- and weak-identification statistics are not reported +in the output. + +{p 0 4}{cmd:robust} specifies that the Eicker/Huber/White/sandwich estimator of +variance is to be used in place of the traditional calculation. {cmd:robust} +combined with {cmd:cluster()} further allows residuals which are not +independent within cluster (although they must be independent between +clusters). See {hi:[U] Obtaining robust variance estimates}. + +{p 0 4}{cmd:cluster}{cmd:(}{it:varlist}{cmd:)} specifies that the observations +are independent across groups (clusters) but not necessarily independent +within groups. +With 1-way clustering, {cmd:cluster}{cmd:(}{it:varname}{cmd:)} +specifies to which group each observation +belongs; e.g., {cmd:cluster(personid)} in data with repeated observations on +individuals. +With 2-way clustering, {cmd:cluster}{cmd:(}{it:varname1 varname2}{cmd:)} +specifies the two (non-nested) groups to which each observation belongs. +Specifying {cmd:cluster()} implies {cmd:robust}. + +{p 0 4}{cmd:bw(}{it:#}{cmd:)} impements AC or HAC covariance estimation +with bandwidth equal to {it:#}, where {it:#} is an integer greater than zero. +Specifying {cmd:robust} implements HAC covariance estimation; +omitting it implements AC covariance estimation. +If the Bartlett (default), Parzen or Quadratic Spectral kernels are selected, +the value {cmd:auto} may be given (rather than an integer) +to invoke Newey and West's (1994) automatic bandwidth selection procedure. + +{p 0 4}{cmd:kernel(}{it:string)}{cmd:)} specifies the kernel +to be used for AC and HAC covariance estimation; +the default kernel is Bartlett (also known in econometrics +as Newey-West). +The full list of kernels available is (abbreviations in parentheses): +Bartlett (bar); Truncated (tru); Parzen (par); Tukey-Hanning (thann); +Tukey-Hamming (thamm); Daniell (dan); Tent (ten); and Quadratic-Spectral (qua or qs). + +{p 4 4}Note: in the cases of the Bartlett, Parzen, +and Tukey-Hanning/Hamming kernels, the number of lags used +to construct the kernel estimate equals the bandwidth minus one. +Stata's official {cmd:newey} implements +HAC standard errors based on the Bartlett kernel, +and requires the user to specify +the maximum number of lags used and not the bandwidth; +see help {help newey}. +If these kernels are used with {cmd:bw(1)}, +no lags are used and {cmd:ivreg2} will report the usual +Eicker/Huber/White/sandwich variance estimates. + +{p 0 4}{cmd:center} specifies that the moments used to construct +the efficient GMM weighting matrix are centered. +If used with an inefficient 1-step estimator, +the estimated coefficients and their standard errors are unaffected but +centered moments will be used in the reported Hansen J statistic. + +{p 0 4}{cmd:wmatrix(}{it:matrix}{cmd:)} specifies a user-supplied weighting matrix +in place of the computed optimal weighting matrix. +The matrix must be positive definite. +The user-supplied matrix must have the same row and column names +as the instrument variables in the regression model (or a subset thereof). + +{p 0 4}{cmd:smatrix(}{it:matrix}{cmd:)} specifies a user-supplied covariance matrix +of the orthogonality conditions to be used in calculating the covariance matrix of the estimator. +The matrix must be positive definite. +The user-supplied matrix must have the same row and column names +as the instrument variables in the regression model (or a subset thereof). + +{p 0 4}{cmd:orthog}{cmd:(}{it:varlist_ex}{cmd:)} requests that a C-statistic +be calculated as a test of the exogeneity of the instruments in {it:varlist_ex}. +These may be either included or excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instruments must still be identified. + +{p 0 4}{cmd:endog}{cmd:(}{it:varlist_en}{cmd:)} requests that a C-statistic +be calculated as a test of the endogeneity +of the endogenous regressors in {it:varlist_en}. + +{p 0 4}{cmd:redundant}{cmd:(}{it:varlist_ex}{cmd:)} requests an LM test +of the redundancy of the instruments in {it:varlist_ex}. +These must be excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instrumenst must still be identified. + +{p 0 4}{cmd:small} requests that small-sample statistics (F and t-statistics) +be reported instead of large-sample statistics (chi-squared and z-statistics). +Large-sample statistics are the default. +The exception is the statistic for the significance of the regression, +which is always reported as a small-sample F statistic. + +{p 0 4}{cmd:noconstant} suppresses the constant term (intercept) in the +regression. If {cmd:noconstant} is specified, the constant term is excluded +from both the final regression and the first-stage regression. To include a +constant in the first-stage when {cmd:noconstant} is specified, explicitly +include a variable containing all 1's in {it:varlist_iv}. + +{p 0 4}{cmd:first} requests that the full first-stage regression results be displayed, +along with the associated diagnostic and identification statistics. + +{p 0 4}{cmd:sfirst} requests that the first-stage and reduced form regressions +are reported as a single system of equations (i.e., in a single regression output table). + +{p 0 4}{cmd:ffirst} requests the first-stage diagnostic and identification statistics. +The results are saved in various e() macros. + +{p 0 4}{cmd:nocollin} suppresses the checks for collinearities +and duplicate variables. + +{p 0 4}{cmd:noid} suppresses the calculation and reporting +of underidentification and weak identification statistics. + +{p 0 4}{cmd:savefirst} requests that the first-stage regressions results +are saved for later access using the {cmd:estimates} command. +The names under which the first-stage regressions are saved +are the names of the endogenous regressors prefixed by "_ivreg2_". +If these use Stata's time-series operators, +the "." is replaced by a "_". + +{p 0 4}{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the first-stage regression results be saved using the user-specified prefix +instead of the default "_ivreg2_". + +{p 0 4}{cmd:rf} requests that the reduced-form estimation of the equation +be displayed. + +{p 0 4}{cmd:saverf} requests that the reduced-form estimation of the equation +be saved for later access using the {cmd:estimates} command. +The estimation is stored under the name of the dependent variable +prefixed by "_ivreg2_". +If this uses Stata's time-series operators, +the "." is replaced by a "_". + +{p 0 4}{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the reduced-form estimation be saved using the user-specified prefix +instead of the default "_ivreg2_". + +{p 0 4}{cmd:sfirst} requests that the first-stage and reduced form equations +are estimated and displayed as a single system of equations. + +{p 0 4}{cmd:savesfirst} requests that the system of first-stage +and reduced form estimations be saved for later access +using the {cmd:estimates} command. +The estimation is stored under the name of the dependent variable +prefixed by "_ivreg2_sfirst_". +If this uses Stata's time-series operators, +the "." is replaced by a "_". + +{p 0 4}{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the reduced-form estimation be saved using the user-specified prefix +instead of the default "_ivreg2_sfirst_". + +{p 0 4}{cmd:partial(}{it:varlist}{cmd:)} requests that +the exogenous regressors in {it:varlist} be partialled out +from the other variables in the equation. +If the equation includes a constant, +it is automatically partialled out as well. +The coefficients corresponding to the regressors in {it:varlist} +are not calculated. + +{p 0 4}{cmd:level(}{it:#}{cmd:)} specifies the confidence level, in percent, +for confidence intervals of the coefficients; see help {help level}. + +{p 0 4}{cmd:bvclean} specifies that omitted variables (including factor base variables) +are not reported in the estimation output and are not saved in the +{cmd:e(b)} and {cmd:e(V)} macros. + +{p 0 4}{cmd:noheader}, {cmd:eform()}, {cmd:depname()} and {cmd:plus} +are for ado-file writers; see {hi:[R] ivreg} and {hi:[R] regress}. + +{p 0 4}{cmd:nofooter} suppresses the display of the footer containing +identification and overidentification statistics, +exogeneity and endogeneity tests, +lists of endogenous variables and instruments, etc. + +{p 0 4}{cmd:version} causes {cmd:ivreg2} to display its current version number +and to leave it in the macro {cmd:e(version)}. +It cannot be used with any other options. +and will clear any existing {cmd:e()} saved results. + + +{marker s_versions}{title:Running ivreg2 under earlier versions of Stata} + +{p}The most-up-to-date implementation of {cmd:ivreg2} requires Stata version 11 or later. +If {cmd:ivreg2} is called under earlier versions of Stata, +it will automatically run a legacy version {cmd:ivreg2x}, +where "x" denotes the required Stata version. +These versions of {cmd:ivreg2} - {cmd:ivreg28}, {cmd:ivreg29} and {cmd:ivreg210} - +are self-contained and require a minimum of Stata version 8/9/10, respectively. +"Self-contained" means these legacy versions (unlike the main up-to-date {cmd:ivreg2} code) +do not require access to any external Mata library or user-written Stata routines. +These legacy versions are installed with the {cmd:ivreg2} package, +can also be called directly from the Stata command line or in do files, +and come with their own help files. + +{p}For example, if a user has Stata 8 installed and calls {cmd:ivreg2}, +it will invoke the legacy version {cmd:ivreg28}. +If a user has a later version of Stata +but wants to run the Stata 8 legacy version of {cmd:ivreg2}, +s/he can estimate either calling {cmd:ivreg28} directly +or by calling {cmd:ivreg2} under version control (i.e., "{cmd:version 8: ivreg2}"). +To see what options are/aren't available with this particular legacy version, +the user can see {helpb help ivreg28}. + + +{marker s_macros}{title:Remarks and saved results} + +{p}{cmd:ivreg2} does not report an ANOVA table. +Instead, it reports the RSS and both the centered and uncentered TSS. +It also reports both the centered and uncentered R-squared. +NB: the TSS and R-squared reported by official {cmd:ivreg} is centered +if a constant is included in the regression, and uncentered otherwise. + + +{p}{cmd:ivreg2} saves the following results in {cmd:e()}: + +Scalars +{col 4}{cmd:e(N)}{col 18}Number of observations +{col 4}{cmd:e(yy)}{col 18}Total sum of squares (SS), uncentered (y'y) +{col 4}{cmd:e(yyc)}{col 18}Total SS, centered (y'y - ((1'y)^2)/n) +{col 4}{cmd:e(rss)}{col 18}Residual SS +{col 4}{cmd:e(mss)}{col 18}Model SS =yyc-rss if the eqn has a constant, =yy-rss otherwise +{col 4}{cmd:e(df_m)}{col 18}Model degrees of freedom +{col 4}{cmd:e(df_r)}{col 18}Residual degrees of freedom +{col 4}{cmd:e(r2u)}{col 18}Uncentered R-squared, 1-rss/yy +{col 4}{cmd:e(r2c)}{col 18}Centered R-squared, 1-rss/yyc +{col 4}{cmd:e(r2)}{col 18}Centered R-squared if the eqn has a constant, uncentered otherwise +{col 4}{cmd:e(r2_a)}{col 18}Adjusted R-squared +{col 4}{cmd:e(ll)}{col 18}Log likelihood +{col 4}{cmd:e(rankxx)}{col 18}Rank of the matrix of observations on rhs variables=K +{col 4}{cmd:e(rankzz)}{col 18}Rank of the matrix of observations on instruments=L +{col 4}{cmd:e(rankV)}{col 18}Rank of covariance matrix V of coefficients +{col 4}{cmd:e(rankS)}{col 18}Rank of covariance matrix S of orthogonality conditions +{col 4}{cmd:e(rmse)}{col 18}root mean square error=sqrt(rss/(N-K)) if -small-, =sqrt(rss/N) if not +{col 4}{cmd:e(F)}{col 18}F statistic +{col 4}{cmd:e(N_clust)}{col 18}Number of clusters (or min(N_clust1,N_clust2) if 2-way clustering) +{col 4}{cmd:e(N_clust1)}{col 18}Number of clusters in dimension 1 (if 2-way clustering) +{col 4}{cmd:e(N_clust2)}{col 18}Number of clusters in dimension 2 (if 2-way clustering) +{col 4}{cmd:e(bw)}{col 18}Bandwidth +{col 4}{cmd:e(lambda)}{col 18}LIML eigenvalue +{col 4}{cmd:e(kclass)}{col 18}k in k-class estimation +{col 4}{cmd:e(fuller)}{col 18}Fuller parameter alpha +{col 4}{cmd:e(sargan)}{col 18}Sargan statistic +{col 4}{cmd:e(sarganp)}{col 18}p-value of Sargan statistic +{col 4}{cmd:e(sargandf)}{col 18}dof of Sargan statistic = degree of overidentification = L-K +{col 4}{cmd:e(j)}{col 18}Hansen J statistic +{col 4}{cmd:e(jp)}{col 18}p-value of Hansen J statistic +{col 4}{cmd:e(jdf)}{col 18}dof of Hansen J statistic = degree of overidentification = L-K +{col 4}{cmd:e(arubin)}{col 18}Anderson-Rubin overidentification LR statistic N*ln(lambda) +{col 4}{cmd:e(arubinp)}{col 18}p-value of Anderson-Rubin overidentification LR statistic +{col 4}{cmd:e(arubin_lin)}{col 18}Anderson-Rubin linearized overidentification statistic N*(lambda-1) +{col 4}{cmd:e(arubin_linp)}{col 18}p-value of Anderson-Rubin linearized overidentification statistic +{col 4}{cmd:e(arubindf)}{col 18}dof of A-R overid statistic = degree of overidentification = L-K +{col 4}{cmd:e(idstat)}{col 18}LM test statistic for underidentification (Anderson or Kleibergen-Paap) +{col 4}{cmd:e(idp)}{col 18}p-value of underidentification LM statistic +{col 4}{cmd:e(iddf)}{col 18}dof of underidentification LM statistic +{col 4}{cmd:e(widstat)}{col 18}F statistic for weak identification (Cragg-Donald or Kleibergen-Paap) +{col 4}{cmd:e(arf)}{col 18}Anderson-Rubin F-test of significance of endogenous regressors +{col 4}{cmd:e(arfp)}{col 18}p-value of Anderson-Rubin F-test of endogenous regressors +{col 4}{cmd:e(archi2)}{col 18}Anderson-Rubin chi-sq test of significance of endogenous regressors +{col 4}{cmd:e(archi2p)}{col 18}p-value of Anderson-Rubin chi-sq test of endogenous regressors +{col 4}{cmd:e(ardf)}{col 18}degrees of freedom of Anderson-Rubin tests of endogenous regressors +{col 4}{cmd:e(ardf_r)}{col 18}denominator degrees of freedom of AR F-test of endogenous regressors +{col 4}{cmd:e(redstat)}{col 18}LM statistic for instrument redundancy +{col 4}{cmd:e(redp)}{col 18}p-value of LM statistic for instrument redundancy +{col 4}{cmd:e(reddf)}{col 18}dof of LM statistic for instrument redundancy +{col 4}{cmd:e(cstat)}{col 18}GMM distance test statistic of exogeneity +{col 4}{cmd:e(cstatp)}{col 18}p-value of GMM distance test statistic of exogeneity +{col 4}{cmd:e(cstatdf)}{col 18}Degrees of freedom of GMM distance test statistic of exogeneity +{col 4}{cmd:e(estat)}{col 18}GMM distance test statistic of endogeneity +{col 4}{cmd:e(estatp)}{col 18}p-value of GMM distance test statistic of endogeneity +{col 4}{cmd:e(estatdf)}{col 18}Degrees of freedom of GMM distance test statistic of endogeneity +{col 4}{cmd:e(cons)}{col 18}1 when equation has a Stata-supplied constant; 0 otherwise +{col 4}{cmd:e(center)}{col 18}1 when moments are mean-centered; 0 otherwise +{col 4}{cmd:e(partialcons)}{col 18}as above but prior to partialling-out (see {cmd:e(partial)}) +{col 4}{cmd:e(partial_ct)}{col 18}Number of partialled-out variables (see {cmd:e(partial)}) + +Macros +{col 4}{cmd:e(cmd)}{col 18}ivreg2 +{col 4}{cmd:e(cmdline)}{col 18}Command line invoking ivreg2 +{col 4}{cmd:e(ivreg2cmd)}{col 18}Version of ivreg2 (ivreg2, ivreg28, ivreg29, etc.) +{col 4}{cmd:e(version)}{col 18}Version number of ivreg2 +{col 4}{cmd:e(model)}{col 18}ols, iv, gmm, liml, or kclass +{col 4}{cmd:e(depvar)}{col 18}Name of dependent variable +{col 4}{cmd:e(instd)}{col 18}Instrumented (RHS endogenous) variables +{col 4}{cmd:e(insts)}{col 18}Instruments +{col 4}{cmd:e(inexog)}{col 18}Included instruments (regressors) +{col 4}{cmd:e(exexog)}{col 18}Excluded instruments +{col 4}{cmd:e(collin)}{col 18}Variables dropped because of collinearities +{col 4}{cmd:e(dups)}{col 18}Duplicate variables +{col 4}{cmd:e(ecollin)}{col 18}Endogenous variables reclassified as exogenous because of +{col 20}collinearities with instruments +{col 4}{cmd:e(clist)}{col 18}Instruments tested for orthogonality +{col 4}{cmd:e(redlist)}{col 18}Instruments tested for redundancy +{col 4}{cmd:e(partial)}{col 18}Partialled-out exogenous regressors +{col 4}{cmd:e(small)}{col 18}small +{col 4}{cmd:e(wtype)}{col 18}weight type +{col 4}{cmd:e(wexp)}{col 18}weight expression +{col 4}{cmd:e(clustvar)}{col 18}Name of cluster variable +{col 4}{cmd:e(vcetype)}{col 18}Covariance estimation method +{col 4}{cmd:e(kernel)}{col 18}Kernel +{col 4}{cmd:e(tvar)}{col 18}Time variable +{col 4}{cmd:e(ivar)}{col 18}Panel variable +{col 4}{cmd:e(firsteqs)}{col 18}Names of stored first-stage equations +{col 4}{cmd:e(rfeq)}{col 18}Name of stored reduced form equation +{col 4}{cmd:e(sfirsteq)}{col 18}Name of stored system of first-stage and reduced form equations +{col 4}{cmd:e(predict)}{col 18}Program used to implement predict + +Matrices +{col 4}{cmd:e(b)}{col 18}Coefficient vector +{col 4}{cmd:e(V)}{col 18}Variance-covariance matrix of the estimators +{col 4}{cmd:e(S)}{col 18}Covariance matrix of orthogonality conditions +{col 4}{cmd:e(W)}{col 18}GMM weighting matrix (=inverse of S if efficient GMM estimator) +{col 4}{cmd:e(first)}{col 18}First-stage regression results +{col 4}{cmd:e(ccev)}{col 18}Eigenvalues corresponding to the Anderson canonical correlations test +{col 4}{cmd:e(cdev)}{col 18}Eigenvalues corresponding to the Cragg-Donald test + +Functions +{col 4}{cmd:e(sample)}{col 18}Marks estimation sample + + + +{marker s_examples}{title:Examples} + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta" : . use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta }{p_end} +{p 8 12}(Wages of Very Young Men, Zvi Griliches, J.Pol.Ec. 1976) + +{col 0}(Instrumental variables. Examples follow Hayashi 2000, p. 255.) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt)} + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), small ffirst" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), small ffirst} + +{col 0}(Testing for the presence of heteroskedasticity in IV/GMM estimation) + +{p 8 12}{stata "ivhettest, fitlev" : . ivhettest, fitlev} + +{col 0}(Two-step GMM efficient in the presence of arbitrary heteroskedasticity) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s robust" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s robust} + +{p 0}(GMM with user-specified first-step weighting matrix or matrix of orthogonality conditions) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), robust" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), robust} + +{p 8 12}{stata "predict double uhat if e(sample), resid" : . predict double uhat if e(sample), resid} + +{p 8 12}{stata "mat accum S = `e(insts)' [iw=uhat^2]" : . mat accum S = `e(insts)' [iw=uhat^2]} + +{p 8 12}{stata "mat S = 1/`e(N)' * S" : . mat S = 1/`e(N)' * S} + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s robust smatrix(S)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s robust smatrix(S)} + +{p 8 12}{stata "mat W = invsym(S)" : . mat W = invsym(S)} + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s robust wmatrix(W)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s robust wmatrix(W)} + +{p 0}(Equivalence of J statistic and Wald tests of included regressors, irrespective of instrument choice (Ahn, 1997)) + +{p 8 12}{stata "ivreg2 lw (iq=med kww age), gmm2s" : . ivreg2 lw (iq=med kww age), gmm2s} + +{p 8 12}{stata "mat S0 = e(S)" : . mat S0 = e(S)} + +{p 8 12}{stata "qui ivreg2 lw (iq=kww) med age, gmm2s smatrix(S0)" : . qui ivreg2 lw (iq=kww) med age, gmm2s smatrix(S0)} + +{p 8 12}{stata "test med age" : . test med age} + +{p 8 12}{stata "qui ivreg2 lw (iq=med) kww age, gmm2s smatrix(S0)" : . qui ivreg2 lw (iq=med) kww age, gmm2s smatrix(S0)} + +{p 8 12}{stata "test kww age" : . test kww age} + +{p 8 12}{stata "qui ivreg2 lw (iq=age) med kww, gmm2s smatrix(S0)" : . qui ivreg2 lw (iq=age) med kww, gmm2s smatrix(S0)} + +{p 8 12}{stata "test med kww" : . test med kww} + +{p 0}(Continuously-updated GMM (CUE) efficient in the presence of arbitrary heteroskedasticity. NB: may require 30+ iterations.) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), cue robust" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), cue robust} + +{col 0}(Sargan-Basmann tests of overidentifying restrictions for IV estimation) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt)} + +{p 8 12}{stata "overid, all" : . overid, all} + +{col 0}(Tests of exogeneity and endogeneity) + +{col 0}(Test the exogeneity of one regressor) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s orthog(s)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s orthog(s)} + +{col 0}(Test the exogeneity of two excluded instruments) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s orthog(age mrt)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age mrt), gmm2s orthog(age mrt)} + +{col 0}(Frisch-Waugh-Lovell (FWL): equivalence of estimations with and without partialling-out) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns i.year (iq=kww age), cluster(year)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age), cluster(year)} + +{p 8 12}{stata "ivreg2 lw s expr tenure rns i.year (iq=kww age), cluster(year) partial(i.year)" : . ivreg2 lw s expr tenure rns smsa i.year (iq=med kww age), cluster(year) partial(i.year)} + +{col 0}({cmd:partial()}: efficient GMM with #clusters<#instruments feasible after partialling-out) + +{p 8 12}{stata "ivreg2 lw s expr tenure rns i.year (iq=kww age), cluster(year) partial(i.year) gmm2s" : . ivreg2 lw s expr tenure rns smsa (iq=med kww age), cluster(year) partial(i.year) gmm2s} + +{col 0}(Examples following Wooldridge 2002, pp.59, 61) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta" : . use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta } + +{col 0}(Equivalence of DWH endogeneity test when regressor is endogenous...) + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6)" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6)} + +{p 8 12}{stata "ivendog educ" :. ivendog educ} + +{col 0}(... endogeneity test using the {cmd:endog} option) + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), endog(educ)" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), endog(educ)} + +{col 0}(...and C-test of exogeneity when regressor is exogenous, using the {cmd:orthog} option) + +{p 8 12}{stata "ivreg2 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)" : . ivreg2 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)} + +{col 0}(Heteroskedastic Ordinary Least Squares, HOLS) + +{p 8 12}{stata "ivreg2 lwage exper expersq educ (=age kidslt6 kidsge6), gmm2s" : . ivreg2 lwage exper expersq educ (=age kidslt6 kidsge6), gmm2s} + +{col 0}(Equivalence of Cragg-Donald Wald F statistic and F-test from first-stage regression +{col 0}in special case of single endogenous regressor. Also illustrates {cmd:first}, {cmd:sfirst} +{col 0}and {cmd:savefirst} options.) + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), first sfirst savefirst" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), first sfirst savefirst} + +{p 8 12}{stata "di e(widstat)" : . di e(widstat)} + +{p 8 12}{stata "estimates restore _ivreg2_educ" : . estimates restore _ivreg2_educ} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Equivalence of Kleibergen-Paap robust rk Wald F statistic and F-test from first-stage +{col 0}regression in special case of single endogenous regressor.) + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust savefirst" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust savefirst} + +{p 8 12}{stata "di e(widstat)" : . di e(widstat)} + +{p 8 12}{stata "estimates restore _ivreg2_educ" : . estimates restore _ivreg2_educ} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Equivalence of Kleibergen-Paap robust rk LM statistic for identification and LM test +{col 0}of joint significance of excluded instruments in first-stage regression in special +{col 0}case of single endogenous regressor. Also illustrates use of {cmd:ivreg2} to perform an +{col 0}LM test in OLS estimation.) + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust} + +{p 8 12}{stata "di e(idstat)" : . di e(idstat)} + +{p 8 12}{stata "ivreg2 educ exper expersq (=age kidslt6 kidsge6) if e(sample), robust" : . ivreg2 educ exper expersq (=age kidslt6 kidsge6) if e(sample), robust} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(Equivalence of an LM test of an excluded instrument for redundancy and an LM test of +{col 0}significance from first-stage regression in special case of single endogenous regressor.) + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust redundant(age)" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust redundant(age)} + +{p 8 12}{stata "di e(redstat)" : . di e(redstat)} + +{p 8 12}{stata "ivreg2 educ exper expersq kidslt6 kidsge6 (=age) if e(sample), robust" : . ivreg2 educ exper expersq kidslt6 kidsge6 (=age) if e(sample), robust} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(Weak-instrument robust inference: Anderson-Rubin Wald F and chi-sq and +{col 0}Stock-Wright S statistics. Also illusrates use of {cmd:saverf} option.) + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust ffirst saverf" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust ffirst saverf} + +{p 8 12}{stata "di e(arf)" : . di e(arf)} + +{p 8 12}{stata "di e(archi2)" : . di e(archi2)} + +{p 8 12}{stata "di e(sstat)" : . di e(sstat)} + +{col 0}(Obtaining the Anderson-Rubin Wald F statistic from the reduced-form estimation) + +{p 8 12}{stata "estimates restore _ivreg2_lwage" : . estimates restore _ivreg2_lwage} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Obtaining the Anderson-Rubin Wald chi-sq statistic from the reduced-form estimation. +{col 0}Use {cmd:ivreg2} without {cmd:small} to obtain large-sample test statistic.) + +{p 8 12}{stata "ivreg2 lwage exper expersq age kidslt6 kidsge6, robust" : . ivreg2 lwage exper expersq age kidslt6 kidsge6, robust} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(chi2)" : . di r(chi2)} + +{col 0}(Obtaining the Stock-Wright S statistic as the value of the GMM CUE objective function. +{col 0}Also illustrates use of {cmd:b0} option. Coefficients on included exogenous regressors +{col 0}are OLS coefficients, which is equivalent to partialling them out before obtaining +{col 0}the value of the CUE objective function.) + +{p 8 12}{stata "mat b = 0" : . mat b = 0} + +{p 8 12}{stata "mat colnames b = educ" : . mat colnames b = educ} + +{p 8 12}{stata "qui ivreg2 lwage exper expersq" : . qui ivreg2 lwage exper expersq} + +{p 8 12}{stata "mat b = b, e(b)" : . mat b = b, e(b)} + +{p 8 12}{stata "ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust b0(b)" : . ivreg2 lwage exper expersq (educ=age kidslt6 kidsge6), robust b0(b)} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(LIML and k-class estimation using Klein data) + +{col 9}{stata "webuse klein" :. webuse klein} +{col 9}{stata "tsset yr" :. tsset yr} + +{col 0}(LIML estimates of Klein's consumption function) + +{p 8 12}{stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml" :. ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml} + +{col 0}(Equivalence of LIML and CUE+homoskedasticity+independence) + +{p 8 12}{stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml coviv" :. ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml coviv} + +{p 8 12}{stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), cue" :. ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), cue} + +{col 0}(Fuller's modified LIML with alpha=1) + +{p 8 12}{stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), fuller(1)" :. ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), fuller(1)} + +{col 0}(k-class estimation with Nagar's bias-adjusted IV, k=1+(L-K)/N=1+4/21=1.19) + +{p 8 12}{stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), kclass(1.19)" :. ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), kclass(1.19)} + +{col 0}(Kernel-based covariance estimation using time-series data) + +{col 9}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta" :. use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta} +{col 9}{stata "tsset year, yearly" :. tsset year, yearly} + +{col 0}(Autocorrelation-consistent (AC) inference in an OLS Regression) + +{p 8 12}{stata "ivreg2 cinf unem, bw(3)" :. ivreg2 cinf unem, bw(3)} + +{p 8 12}{stata "ivreg2 cinf unem, kernel(qs) bw(auto)" :. ivreg2 cinf unem, kernel(qs) bw(auto)} + +{col 0}(Heteroskedastic and autocorrelation-consistent (HAC) inference in an OLS regression) + +{p 8 12}{stata "ivreg2 cinf unem, bw(3) kernel(bartlett) robust small" :. ivreg2 cinf unem, bw(3) kernel(bartlett) robust small} + +{p 8 12}{stata "newey cinf unem, lag(2)" :. newey cinf unem, lag(2)} + +{col 0}(AC and HAC in IV and GMM estimation) + +{p 8 12}{stata "ivreg2 cinf (unem = l(1/3).unem), bw(3)" :. ivreg2 cinf (unem = l(1/3).unem), bw(3)} + +{p 8 12}{stata "ivreg2 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(thann)" :. ivreg2 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(thann)} + +{p 8 12}{stata "ivreg2 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(qs) robust orthog(l1.unem)" :. ivreg2 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(qs) robust orthog(l1.unem)} + +{col 0}(Examples using Large N, Small T Panel Data) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta" : . use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta }{p_end} +{p 8 12}{stata "tsset id year" :. tsset id year} + +{col 0}(Two-step effic. GMM in the presence of arbitrary heteroskedasticity and autocorrelation) + +{p 8 12}{stata "ivreg2 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm2s cluster(id)": . ivreg2 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm2s cluster(id)} + +{col 0}(Kiefer (1980) SEs - robust to arbitrary serial correlation but not heteroskedasticity) + +{p 8 12}{stata "ivreg2 n w k, kiefer": . ivreg2 n w k, kiefer} + +{p 8 12}{stata "ivreg2 n w k, bw(8) kernel(tru)": . ivreg2 n w k, bw(8) kernel(tru)} + +{col 0}(Equivalence of cluster-robust and kernel-robust with truncated kernel and max bandwidth) + +{p 8 12}{stata "ivreg2 n w k, cluster(id)": . ivreg2 n w k, cluster(id)} + +{p 8 12}{stata "ivreg2 n w k, bw(8) kernel(tru) robust": . ivreg2 n w k, bw(8) kernel(tru) robust} + +{col 0}(Examples using factor variables) + +{p 8 12}{stata "sysuse auto" : . sysuse auto }{p_end} + +{p 8 12}{stata "ivreg2 price i.foreign i.rep78": . ivreg2 price i.foreign i.rep78} + +{p 8 12}{stata "ivreg2 price i.rep78 (foreign = weight turn trunk)": . ivreg2 price i.rep78 (foreign = weight turn trunk) } + +{p 8 12}{stata "ivreg2 price i.rep78 (c.mpg#c.mpg = weight length turn)": . ivreg2 price i.rep78 (c.mpg#c.mpg = weight length turn)} + +{col 0}(Examples using Small N, Large T Panel Data. NB: T is actually not very large - only +{col 0}20 - so results should be interpreted with caution) + +{p 8 12}{stata "webuse grunfeld" : . webuse grunfeld }{p_end} +{p 8 12}{stata "tsset" : . tsset }{p_end} + +{col 0}(Autocorrelation-consistent (AC) inference) + +{p 8 12}{stata "ivreg2 invest mvalue kstock, bw(1) kernel(tru)": . ivreg2 invest mvalue kstock, bw(1) kernel(tru)} + +{col 0}(Heteroskedastic and autocorrelation-consistent (HAC) inference) + +{p 8 12}{stata "ivreg2 invest mvalue kstock, robust bw(1) kernel(tru)": . ivreg2 invest mvalue kstock, robust bw(1) kernel(tru)} + +{col 0}(HAC inference, SEs also robust to disturbances correlated across panels) + +{p 8 12}{stata "ivreg2 invest mvalue kstock, robust cluster(year) bw(1) kernel(tru)": . ivreg2 invest mvalue kstock, robust cluster(year) bw(1) kernel(tru)} + +{col 0}(Equivalence of Driscoll-Kraay SEs as implemented by {cmd:ivreg2} and {cmd:xtscc}) +{col 0}(See Hoeschle (2007) for discussion of {cmd:xtscc}) + +{p 8 12}{stata "ivreg2 invest mvalue kstock, dkraay(2) small": . ivreg2 invest mvalue kstock, dkraay(2) small} + +{p 8 12}{stata "ivreg2 invest mvalue kstock, cluster(year) bw(2) small": . ivreg2 invest mvalue kstock, cluster(year) bw(2) small} + +{p 8 12}{stata "xtscc invest mvalue kstock, lag(1)": . xtscc invest mvalue kstock, lag(1)} + +{col 0}(Examples using Large N, Large T Panel Data. NB: T is again not very large - only +{col 0}20 - so results should be interpreted with caution) + +{p 8 12}{stata "webuse nlswork" : . webuse nlswork }{p_end} +{p 8 12}{stata "tsset" : . tsset }{p_end} + +{col 0}(One-way cluster-robust: SEs robust to arbitrary heteroskedasticity and within-panel +{col 0}autocorrelation) + +{p 8 12}{stata "ivreg2 ln_w grade age ttl_exp tenure, cluster(idcode)": . ivreg2 ln_w grade age ttl_exp tenure, cluster(idcode) }{p_end} + +{col 0}(Two-way cluster-robust: SEs robust to arbitrary heteroskedasticity and within-panel +{col 0}autocorrelation, and contemporaneous cross-panel correlation, i.e., the cross-panel +{col 0}correlation is not autocorrelated) + +{p 8 12}{stata "ivreg2 ln_w grade age ttl_exp tenure, cluster(idcode year)": . ivreg2 ln_w grade age ttl_exp tenure, cluster(idcode year) }{p_end} + +{col 0}(Two-way cluster-robust: SEs robust to arbitrary heteroskedasticity and within-panel +{col 0}autocorrelation and cross-panel autocorrelated disturbances that disappear after 2 lags) + +{p 8 12}{stata "ivreg2 ln_w grade age ttl_exp tenure, cluster(idcode year) bw(2) kernel(tru) ": . ivreg2 ln_w grade age ttl_exp tenure, cluster(idcode year) bw(2) kernel(tru) }{p_end} + + + +{marker s_refs}{title:References} + +{p 0 4}Ahn, Seung C. 1997. Orthogonality tests in linear models. Oxford Bulletin +of Economics and Statistics, Vol. 59, pp. 183-186. + +{p 0 4}Anderson, T.W. 1951. Estimating linear restrictions on regression coefficients +for multivariate normal distributions. Annals of Mathematical Statistics, Vol. 22, pp. 327-51. + +{p 0 4}Anderson, T. W. and H. Rubin. 1949. Estimation of the parameters of a single equation +in a complete system of stochastic equations. Annals of Mathematical Statistics, Vol. 20, +pp. 46-63. + +{p 0 4}Anderson, T. W. and H. Rubin. 1950. The asymptotic properties of estimates of the parameters of a single +equation in a complete system of stochastic equations. Annals of Mathematical Statistics, +Vol. 21, pp. 570-82. + +{p 0 4}Angrist, J.D. and Pischke, J.-S. 2009. Mostly Harmless Econometrics: An Empiricist's Companion. +Princeton: Princeton University Press. + +{p 0 4}Baum, C.F., Schaffer, M.E., and Stillman, S. 2003. Instrumental Variables and GMM: +Estimation and Testing. The Stata Journal, Vol. 3, No. 1, pp. 1-31. +{browse "http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html":http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html}. +Working paper version: Boston College Department of Economics Working Paper No. 545. +{browse "http://ideas.repec.org/p/boc/bocoec/545.html":http://ideas.repec.org/p/boc/bocoec/545.html}. +Citations in {browse "http://scholar.google.com/scholar?oi=bibs&hl=en&cites=9432785573549481148":published work}. + +{p 0 4}Baum, C. F., Schaffer, M.E., and Stillman, S. 2007. Enhanced routines for instrumental variables/GMM estimation and testing. +The Stata Journal, Vol. 7, No. 4, pp. 465-506. +{browse "http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html":http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html}. +Working paper version: Boston College Department of Economics Working Paper No. 667. +{browse "http://ideas.repec.org/p/boc/bocoec/667.html":http://ideas.repec.org/p/boc/bocoec/667.html}. +Citations in {browse "http://scholar.google.com/scholar?oi=bibs&hl=en&cites=1691909976816211536":published work}. + +{p 0 4}Breusch, T., Qian, H., Schmidt, P. and Wyhowski, D. 1999. +Redundancy of moment conditions. +Journal of Econometrics, Vol. 9, pp. 89-111. + +{p 0 4}Cameron, A.C., Gelbach, J.B. and Miller, D.L. 2006. +Robust Inference with Multi-Way Clustering. +NBER Technical Working paper 327. +{browse "http://www.nber.org/papers/t0327":http://www.nber.org/papers/t0327}. +Forthcoming in the Journal of Business and Economic Statistics. +{cmd:cgmreg} is available at +{browse "http://www.econ.ucdavis.edu/faculty/dlmiller/statafiles":http://www.econ.ucdavis.edu/faculty/dlmiller/statafiles}. + +{p 0 4}Chernozhukov, V. and Hansen, C. 2005. The Reduced Form: +A Simple Approach to Inference with Weak Instruments. +Working paper, University of Chicago, Graduate School of Business. + +{p 0 4}Cragg, J.G. and Donald, S.G. 1993. Testing Identfiability and Specification in +Instrumental Variables Models. Econometric Theory, Vol. 9, pp. 222-240. + +{p 0 4}Cushing, M.J. and McGarvey, M.G. 1999. Covariance Matrix Estimation. +In L. Matyas (ed.), Generalized Methods of Moments Estimation. +Cambridge: Cambridge University Press. + +{p 0 4}Davidson, R. and MacKinnon, J. 1993. Estimation and Inference in Econometrics. +1993. New York: Oxford University Press. + +{p 0 4}Driscoll, J.C. and Kraay, A. 1998. Consistent Covariance Matrix Estimation With Spatially Dependent Panel Data. +Review of Economics and Statistics. Vol. 80, No. 4, pp. 549-560. + +{p 0 4}Dufour, J.M. 2003. Identification, Weak Instruments and Statistical Inference +in Econometrics. Canadian Journal of Economics, Vol. 36, No. 4, pp. 767-808. +Working paper version: CIRANO Working Paper 2003s-49. +{browse "http://www.cirano.qc.ca/pdf/publication/2003s-49.pdf":http://www.cirano.qc.ca/pdf/publication/2003s-49.pdf}. + +{p 0 4}Finlay, K., and Magnusson, L.M. 2009. Implementing Weak-Instrument Robust Tests +for a General Class of Instrumental-Variables Models. +The Stata Journal, Vol. 9, No. 3, pp. 398-421. +{browse "http://www.stata-journal.com/article.html?article=st0171":http://www.stata-journal.com/article.html?article=st0171}. + +{p 0 4}Hall, A.R. Generalized Method of Moments. 2005. Oxford: Oxford University Press. + +{p 0 4}Hall, A.R., Rudebusch, G.D. and Wilcox, D.W. 1996. Judging Instrument Relevance in +Instrumental Variables Estimation. International Economic Review, Vol. 37, No. 2, pp. 283-298. + +{p 0 4}Hayashi, F. Econometrics. 2000. Princeton: Princeton University Press. + +{p 0 4}Hansen, L.P., Heaton, J., and Yaron, A. 1996. Finite Sample Properties +of Some Alternative GMM Estimators. Journal of Business and Economic Statistics, Vol. 14, No. 3, pp. 262-280. + +{p 0 4}Hoechle, D. 2007. Robust Standard Errors for Panel Regressions with Crossñsectional Dependence. +Stata Journal, Vol. 7, No. 3, pp. 281-312. +{browse "http://www.stata-journal.com/article.html?article=st0128":http://www.stata-journal.com/article.html?article=st0128}. + +{p 0 4}Kiefer, N.M. 1980. Estimation of Fixed Effect Models for Time Series of Cross-Sections with +Arbitrary Intertemporal Covariance. Journal of Econometrics, Vol. 14, No. 2, pp. 195-202. + +{p 0 4}Kleibergen, F. 2007. Generalizing Weak Instrument Robust Statistics Towards Multiple Parameters, Unrestricted Covariance Matrices and Identification Statistics. Journal of Econometrics, forthcoming. + +{p 0 4}Kleibergen, F. and Paap, R. 2006. Generalized Reduced Rank Tests Using the Singular Value Decomposition. +Journal of Econometrics, Vol. 133, pp. 97-126. + +{p 0 4}Kleibergen, F. and Schaffer, M.E. 2007. ranktest: Stata module for testing the rank +of a matrix using the Kleibergen-Paap rk statistic. +{browse "http://ideas.repec.org/c/boc/bocode/s456865.html":http://ideas.repec.org/c/boc/bocode/s456865.html}. + +{p 0 4}Mikusheva, A. and Poi, B.P. 2006. +Tests and Confidence Sets with Correct Size When Instruments are Potentially Weak. The Stata Journal, Vol. 6, No. 3, pp. 335-347. + +{p 0 4}Moreira, M.J. and Poi, B.P. 2003. Implementing Tests with the Correct Size in the Simultaneous Equations Model. The Stata Journal, Vol. 3, No. 1, pp. 57-70. + +{p 0 4}Newey, W.K. and K.D. West, 1994. Automatic Lag Selection in Covariance Matrix Estimation. Review of Economic Studies, Vol. 61, No. 4, pp. 631-653. + +{p 0 4}Sanderson, E. and F. Windmeijer, 2015. A Weak Instrument F-Test in Linear IV Models with Multiple Endogenous Variables. +Journal of Econometrics (forthcoming). +Working paper version: University of Bristol Discussion Paper 14/644. +{browse "http://ideas.repec.org/p/bri/uobdis/14-644.html":http://ideas.repec.org/p/bri/uobdis/14-644.html}. + +{p 0 4}Shea, J. 1997. Instrument Relevance in Multivariate Linear Models: A Simple Measure. +Review of Economics and Statistics, Vol. 49, No. 2, pp. 348-352. + +{p 0 4}Stock, J.H. and Wright, J.H. 2000. GMM with Weak Identification. +Econometrica, Vol. 68, No. 5, September, pp. 1055-1096. + +{p 0 4}Stock, J.H. and Yogo, M. 2005. Testing for Weak Instruments in Linear IV Regression. In D.W.K. Andrews and J.H. Stock, eds. Identification and Inference for Econometric Models: Essays in Honor of Thomas Rothenberg. Cambridge: Cambridge University Press, 2005, pp. 80Ò108. +Working paper version: NBER Technical Working Paper 284. +{browse "http://www.nber.org/papers/T0284":http://www.nber.org/papers/T0284}. + +{p 0 4}Thompson, S.B. 2009. Simple Formulas for Standard Errors that Cluster by Both Firm and Time. +{browse "http://ssrn.com/abstract=914002":http://ssrn.com/abstract=914002}. + +{p 0 4}Wooldridge, J.M. 2002. Econometric Analysis of Cross Section and Panel Data. Cambridge, MA: MIT Press. + + +{marker s_acknow}{title:Acknowledgements} + +{p}We would like to thanks various colleagues who helped us along the way, including +David Drukker, +Frank Kleibergen, +Austin Nichols, +Brian Poi, +Vince Wiggins, +and, not least, the users of {cmd:ivreg2} +who have provided suggestions, +spotted bugs, +and helped test the package. +We are also grateful to Jim Stock and Moto Yogo for permission to reproduce +their critical values for the Cragg-Donald statistic. + +{marker s_citation}{title:Citation of ivreg2} + +{p}{cmd:ivreg2} is not an official Stata command. It is a free contribution +to the research community, like a paper. Please cite it as such: {p_end} + +{phang}Baum, C.F., Schaffer, M.E., Stillman, S. 2010. +ivreg2: Stata module for extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression. +{browse "http://ideas.repec.org/c/boc/bocode/s425401.html":http://ideas.repec.org/c/boc/bocode/s425401.html}{p_end} + +{title:Authors} + + Christopher F Baum, Boston College, USA + baum@bc.edu + + Mark E Schaffer, Heriot-Watt University, UK + m.e.schaffer@hw.ac.uk + + Steven Stillman, Motu Economic and Public Policy Research + stillman@motu.org.nz + + +{title:Also see} + +{p 1 14}Articles:{it:Stata Journal}, volume 3, number 1: {browse "http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html":st0030}{p_end} +{p 10 14}{it:Stata Journal}, volume 7, number 4: {browse "http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html":st0030_3}{p_end} + +{p 1 14}Manual: {hi:[U] 23 Estimation and post-estimation commands}{p_end} +{p 10 14}{hi:[U] 29 Overview of model estimation in Stata}{p_end} +{p 10 14}{hi:[R] ivreg}{p_end} + +{p 1 10}On-line: help for {help ivregress}, {help ivreg}, {help newey}; +{help overid}, {help ivendog}, {help ivhettest}, {help ivreset}, +{help xtivreg2}, {help xtoverid}, {help ranktest}, +{help condivreg} (if installed); +{help weakiv} (if installed); +{help cgmreg} (if installed); +{help xtscc} (if installed); +{help est}, {help postest}; +{help regress}{p_end} diff --git a/data/ado/i/ivreg210.ado b/data/ado/i/ivreg210.ado new file mode 100644 index 0000000..e3f0fd0 --- /dev/null +++ b/data/ado/i/ivreg210.ado @@ -0,0 +1,6951 @@ +*! ivreg210 3.1.10 19Jan2015 +*! authors cfb & mes +*! see end of file for version comments + +* Variable naming: +* lhs = LHS endogenous +* endo = X1, RHS endogenous (instrumented) = #K1 +* inexog = X2 = Z2 = included exogenous (instruments) = #K2 = #L2 +* exexog = Z1 = excluded exogenous (instruments) = #L1 +* iv = {inexog exexog} = all instruments +* rhs = {endo inexog} = RHS regressors +* 1 at the end of the name means the varlist after duplicates and collinearities removed +* ..1_ct at the end means a straight count of the list +* .._ct at the end means ..1_ct with any additional detected cnts removed +* dofminus is large-sample adjustment (e.g., #fixed effects) +* sdofminus is small-sample adjustment (e.g., #partialled-out regressors) + +*************************************** START **************************************** +********************************* livreg2.mlib CODE ********************************** +* Code from: +* livreg2 1.1.07 13july2014 +* authors cfb & mes +* compiled in Stata 9.2 +* Mata library for ivreg2 and ranktest. +* Introduced with ivreg2 v 3.1.01 and ranktest v 1.3.01. +* Imported into ivreg210 so that ivreg210 is free-standing. +* See end of file for version notes. + +version 9.2 +mata: + +// ********* struct ms_ivreg210_vcvorthog - shared by ivreg2 and ranktest ******************* // +struct ms_ivreg210_vcvorthog { + string scalar ename, Znames, touse, weight, wvarname + string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel + string scalar sw, psd, ivarname, tvarname, tindexname + real scalar wf, N, bw, tdelta, dofminus + real matrix ZZ + pointer matrix e + pointer matrix Z + pointer matrix wvar +} + +// ********* s_ivreg210_vkernel - shared by ivreg2 and ranktest ******************* // +// Program checks whether kernel and bw choices are valid. +// s_ivreg210_vkernel is called from Stata. +// Arguments are the kernel name (req), bandwidth (req) and ivar name (opt). +// All 3 are strings. +// Returns results in r() macros. +// r(kernel) - name of kernel (string) +// r(bw) - bandwidth (scalar) + +void s_ivreg210_vkernel( string scalar kernel, + string scalar bwstring, + string scalar ivar + ) +{ + +// Check bandwidth + if (bwstring=="auto") { + bw=-1 + } + else { + bw=strtoreal(bwstring) + if (bw==.) { + printf("{err}bandwidth option bw() required for HAC-robust estimation\n") + exit(102) + } + if (bw<=0) { + printf("{err}invalid bandwidth in option bw() - must be real > 0\n") + exit(198) + } + } + +// Check ivar + if (bwstring=="auto" & ivar~="") { + printf("{err}Automatic bandwidth selection not available for panel data\n") + exit(198) + } + +// Check kernel +// Valid kernel list is abbrev, full name, whether special case if bw=1 +// First in list is default kernel = Barlett + vklist = ( ("", "bartlett", "0") + \ ("bar", "bartlett", "0") + \ ("bartlett", "bartlett", "0") + \ ("par", "parzen", "0") + \ ("parzen", "parzen", "0") + \ ("tru", "truncated", "1") + \ ("truncated", "truncated", "1") + \ ("thann", "tukey-hanning", "0") + \ ("tukey-hanning", "tukey-hanning", "0") + \ ("thamm", "tukey-hamming", "0") + \ ("tukey-hamming", "tukey-hamming", "0") + \ ("qua", "quadratic spectral", "1") + \ ("qs", "quadratic spectral", "1") + \ ("quadratic-spectral", "quadratic spectral", "1") + \ ("quadratic spectral", "quadratic spectral", "1") + \ ("dan", "danielle", "1") + \ ("danielle", "danielle", "1") + \ ("ten", "tent", "1") + \ ("tent", "tent", "1") + ) + kname=strltrim(strlower(kernel)) + pos = (vklist[.,1] :== kname) + +// Exit with error if not in list + if (sum(pos)==0) { + printf("{err}invalid kernel\n") + exit(198) + } + + vkname=strproper(select(vklist[.,2],pos)) + st_global("r(kernel)", vkname) + st_numscalar("r(bw)",bw) + +// Warn if kernel is type where bw=1 means no lags are used + if (bw==1 & select(vklist[.,3],pos)=="0") { + printf("{result}Note: kernel=%s", vkname) + printf("{result} and bw=1 implies zero lags used. Standard errors and\n") + printf("{result} test statistics are not autocorrelation-consistent.\n") + } +} // end of program s_ivreg210_vkernel + +// ********* m_ivreg210_omega - shared by ivreg2 and ranktest ********************* // + +// NB: ivreg2 always calls m_ivreg210_omega with e as column vector, i.e., K=1 // +// ranktest can call m_ivreg210_omega with e as matrix, i.e., K>=1 // + +real matrix m_ivreg210_omega(struct ms_ivreg210_vcvorthog scalar vcvo) +{ + if (vcvo.clustvarname~="") { + st_view(clustvar, ., vcvo.clustvarname, vcvo.touse) + info = panelsetup(clustvar, 1) + N_clust=rows(info) + if (vcvo.clustvarname2~="") { + st_view(clustvar2, ., vcvo.clustvarname2, vcvo.touse) + if (vcvo.kernel=="") { + st_view(clustvar3, ., vcvo.clustvarname3, vcvo.touse) // needed only if not panel tsset + } + } + } + + if (vcvo.kernel~="") { + st_view(t, ., st_tsrevar(vcvo.tvarname), vcvo.touse) + T=max(t)-min(t)+1 + } + + if ((vcvo.kernel=="Bartlett") | (vcvo.kernel=="Parzen") | (vcvo.kernel=="Truncated") /// + | (vcvo.kernel=="Tukey-Hanning")| (vcvo.kernel=="Tukey-Hamming")) { + window="lag" + } + else if ((vcvo.kernel=="Quadratic Spectral") | (vcvo.kernel=="Danielle") | (vcvo.kernel=="Tent")) { + window="spectral" + } + else if (vcvo.kernel~="") { +// Should never reach this point +printf("\n{error:Error: invalid kernel}\n") + exit(error(3351)) + } + + L=cols(*vcvo.Z) + K=cols(*vcvo.e) // ivreg2 always calls with K=1; ranktest may call with K>=1. + +// Covariance matrices +// shat * 1/N is same as estimated S matrix of orthog conditions + +// Block for homoskedastic and AC. dof correction if any incorporated into sigma estimates. + if ((vcvo.robust=="") & (vcvo.clustvarname=="")) { +// ZZ is already calculated as an external + ee = quadcross(*vcvo.e, vcvo.wf*(*vcvo.wvar), *vcvo.e) + sigma2=ee/(vcvo.N-vcvo.dofminus) + shat=sigma2#vcvo.ZZ + if (vcvo.kernel~="") { + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + tnow=st_data(., vcvo.tindexname) + for (tau=1; tau<=TAU; tau++) { + kw = m_ivreg210_calckw(tau, vcvo.bw, vcvo.kernel) + if (kw~=0) { // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + lstau = "L"+strofreal(tau) + tlag=st_data(., lstau+"."+vcvo.tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix +// if no lags exist, tmatrix has zero rows. + if (rows(tmatrix)>0) { +// col 1 of tmatrix has row numbers of all rows of data with this time period that have a corresponding lag +// col 2 of tmatrix has row numbers of all rows of data with lag tau that have a corresponding ob this time period. +// Should never happen that fweights or iweights make it here, +// but if they did the next line would be sqrt(wvari)*sqrt(wvari1) [with no wf since not needed for fw or iw] + wv = (*vcvo.wvar)[tmatrix[.,1]] /// + :* (*vcvo.wvar)[tmatrix[.,2]]*(vcvo.wf^2) // inner weighting matrix for quadcross + sigmahat = quadcross((*vcvo.e)[tmatrix[.,1],.], wv ,(*vcvo.e)[tmatrix[.,2],.]) /// + / (vcvo.N-vcvo.dofminus) // large dof correction + ZZhat = quadcross((*vcvo.Z)[tmatrix[.,1],.], wv, (*vcvo.Z)[tmatrix[.,2],.]) + ghat = sigmahat#ZZhat + shat=shat+kw*(ghat+ghat') + } + } // end non-zero kernel weight block + } // end tau loop + } // end kernel code +// Note large dof correction (if there is one) has already been incorporated + shat=shat/vcvo.N + } // end homoskedastic, AC code + +// Block for robust HC and HAC but not Stock-Watson and single clustering. +// Need to enter for double-clustering if one cluster is time. + if ( (vcvo.robust~="") & (vcvo.sw=="") & ((vcvo.clustvarname=="") /// + | ((vcvo.clustvarname2~="") & (vcvo.kernel~=""))) ) { + if (K==1) { // simple/fast where e is a column vector + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { + wv = (*vcvo.e:^2) :* *vcvo.wvar + } + else { + wv = (*vcvo.e :* *vcvo.wvar * vcvo.wf):^2 // wf needed for aweights and pweights + } + shat=quadcross(*vcvo.Z, wv, *vcvo.Z) // basic Eicker-Huber-White-sandwich-robust vce + } + else { // e is a matrix so must loop + shat=J(L*K,L*K,0) + for (i=1; i<=rows(*vcvo.e); i++) { + eZi=((*vcvo.e)[i,.])#((*vcvo.Z)[i,.]) + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { +// wvar is a column vector. wf not needed for fw and iw (=1 by dfn so redundant). + shat=shat+quadcross(eZi,eZi)*((*vcvo.wvar)[i]) + } + else { + shat=shat+quadcross(eZi,eZi)*((*vcvo.wvar)[i] * vcvo.wf)^2 // **** ADDED *vcvo.wf + } + } + } + if (vcvo.kernel~="") { +// Spectral windows require looping through all T-1 autocovariances + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + tnow=st_data(., vcvo.tindexname) + for (tau=1; tau<=TAU; tau++) { + kw = m_ivreg210_calckw(tau, vcvo.bw, vcvo.kernel) + if (kw~=0) { // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + lstau = "L"+strofreal(tau) + tlag=st_data(., lstau+"."+vcvo.tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix + +// col 1 of tmatrix has row numbers of all rows of data with this time period that have a corresponding lag +// col 2 of tmatrix has row numbers of all rows of data with lag tau that have a corresponding ob this time period. +// if no lags exist, tmatrix has zero rows + if (rows(tmatrix)>0) { + if (K==1) { // simple/fast where e is a column vector +// wv is inner weighting matrix for quadcross + wv = (*vcvo.e)[tmatrix[.,1]] :* (*vcvo.e)[tmatrix[.,2]] /// + :* (*vcvo.wvar)[tmatrix[.,1]] :* (*vcvo.wvar)[tmatrix[.,2]] * (vcvo.wf^2) + ghat = quadcross((*vcvo.Z)[tmatrix[.,1],.], wv, (*vcvo.Z)[tmatrix[.,2],.]) + } + else { // e is a matrix so must loop + ghat=J(L*K,L*K,0) + for (i=1; i<=rows(tmatrix); i++) { + wvari =(*vcvo.wvar)[tmatrix[i,1]] + wvari1=(*vcvo.wvar)[tmatrix[i,2]] + ei =(*vcvo.e)[tmatrix[i,1],.] + ei1 =(*vcvo.e)[tmatrix[i,2],.] + Zi =(*vcvo.Z)[tmatrix[i,1],.] + Zi1 =(*vcvo.Z)[tmatrix[i,2],.] + eZi =ei#Zi + eZi1=ei1#Zi1 +// Should never happen that fweights or iweights make it here, but if they did +// the next line would be ghat=ghat+eZi'*eZi1*sqrt(wvari)*sqrt(wvari1) +// [without *vcvo.wf since wf=1 for fw and iw] + ghat=ghat+quadcross(eZi,eZi1)*wvari*wvari1 * (vcvo.wf^2) // ADDED * (vcvo.wf^2) + } + } + shat=shat+kw*(ghat+ghat') + } // end non-zero-obs accumulation block + } // end non-zero kernel weight block + } // end tau loop + } // end kernel code +// Incorporate large dof correction if there is one + shat=shat/(vcvo.N-vcvo.dofminus) + } // end HC/HAC code + + if (vcvo.clustvarname~="") { +// Block for cluster-robust +// 2-level clustering: S = S(level 1) + S(level 2) - S(level 3 = intersection of levels 1 & 2) +// Prepare shat3 if 2-level clustering + if (vcvo.clustvarname2~="") { + if (vcvo.kernel~="") { // second cluster variable is time + // shat3 was already calculated above as shat + shat3=shat*(vcvo.N-vcvo.dofminus) + } + else { // calculate shat3 + // data were sorted on clustvar3-clustvar1 so + // clustvar3 is nested in clustvar1 and Mata panel functions + // work for both. + info3 = panelsetup(clustvar3, 1) + if (rows(info3)==rows(*vcvo.e)) { // intersection of levels 1 & 2 are all single obs + // so no need to loop through row by row + if (K==1) { // simple/fast where e is a column vector + wv = (*vcvo.e :* *vcvo.wvar * vcvo.wf):^2 + shat3=quadcross(*vcvo.Z, wv, *vcvo.Z) // basic Eicker-Huber-White-sandwich-robust vce + } + else { // e is a matrix so must loop + shat3=J(L*K,L*K,0) + for (i=1; i<=rows(*vcvo.e); i++) { + eZi=((*vcvo.e)[i,.])#((*vcvo.Z)[i,.]) + shat3=shat3+quadcross(eZi,eZi)*((*vcvo.wvar)[i] * vcvo.wf)^2 // **** ADDED *vcvo.wf + } + } + } + else { // intersection of levels 1 & 2 includes some groups of obs + N_clust3=rows(info3) + shat3=J(L*K,L*K,0) + for (i=1; i<=N_clust3; i++) { + esub=panelsubmatrix(*vcvo.e,i,info3) + Zsub=panelsubmatrix(*vcvo.Z,i,info3) + wsub=panelsubmatrix(*vcvo.wvar,i,info3) + wv = esub :* wsub * vcvo.wf + if (K==1) { // simple/fast where e is a column vector + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ = J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.] * vcvo.wf // **** ADDED *vcvo.wf + } + } + shat3=shat3+quadcross(eZ,eZ) + } + } + } + } + +// 1st level of clustering, no kernel-robust +// Entered unless 1-level clustering and kernel-robust + if (!((vcvo.kernel~="") & (vcvo.clustvarname2==""))) { + shat=J(L*K,L*K,0) + for (i=1; i<=N_clust; i++) { // loop through clusters, adding Z'ee'Z + // for indiv cluster in each loop + esub=panelsubmatrix(*vcvo.e,i,info) + Zsub=panelsubmatrix(*vcvo.Z,i,info) + wsub=panelsubmatrix(*vcvo.wvar,i,info) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat=shat+quadcross(eZ,eZ) + } // end loop through clusters + } + +// 2-level clustering, no kernel-robust + if ((vcvo.clustvarname2~="") & (vcvo.kernel=="")) { + imax=max(clustvar2) // clustvar2 is numbered 1..N_clust2 + shat2=J(L*K,L*K,0) + for (i=1; i<=imax; i++) { // loop through clusters, adding Z'ee'Z + // for indiv cluster in each loop + svar=(clustvar2:==i) // mimics panelsubmatrix but doesn't require sorted data + esub=select(*vcvo.e,svar) // it is, however, noticably slower. + Zsub=select(*vcvo.Z,svar) + wsub=select(*vcvo.wvar,svar) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat2=shat2+quadcross(eZ,eZ) + } + } + +// 1st level of cluster, kernel-robust OR +// 2-level clustering, kernel-robust and time is 2nd cluster variable + if (vcvo.kernel~="") { + shat2=J(L*K,L*K,0) +// First, standard cluster-robust, i.e., no lags. + i=min(t) + while (i<=max(t)) { // loop through all T clusters, adding Z'ee'Z + // for indiv cluster in each loop + eZ=J(1,L*K,0) + svar=(t:==i) // select obs with t=i + if (colsum(svar)>0) { // there are obs with t=i + esub=select(*vcvo.e,svar) + Zsub=select(*vcvo.Z,svar) + wsub=select(*vcvo.wvar,svar) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { +// MISSING LINE IS NEXT + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat2=shat2+quadcross(eZ,eZ) + } + i=i+vcvo.tdelta + } // end i loop through all T clusters + +// Spectral windows require looping through all T-1 autocovariances + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + + for (tau=1; tau<=TAU; tau++) { + kw = m_ivreg210_calckw(tau, vcvo.bw, vcvo.kernel) // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + if (kw~=0) { + i=min(t)+tau*vcvo.tdelta // Loop through all possible ts (time clusters) + while (i<=max(t)) { // Start at earliest possible t + svar=t[.,]:==i // svar is current, svar1 is tau-th lag + svar1=t[.,]:==(i-tau*vcvo.tdelta) // tau*vcvo.tdelta is usually just tau + if ((colsum(svar)>0) // there are current & lagged obs + & (colsum(svar1)>0)) { + wv = select((*vcvo.e),svar) :* select((*vcvo.wvar),svar) * vcvo.wf + wv1 = select((*vcvo.e),svar1) :* select((*vcvo.wvar),svar1) * vcvo.wf + Zsub =select((*vcvo.Z),svar) + Zsub1=select((*vcvo.Z),svar1) + if (K==1) { // simple/fast, e is column vector + eZsub = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + eZsub1= quadcross(1, wv1, Zsub1) // equivalent to colsum(wv :* Zsub) + } + else { + eZsub=J(1,L*K,0) + for (j=1; j<=rows(Zsub); j++) { + wvj =wv[j,.] + Zj =Zsub[j,.] + eZsub=eZsub+(wvj#Zj) + } + eZsub1=J(1,L*K,0) + for (j=1; j<=rows(Zsub1); j++) { + wv1j =wv1[j,.] + Z1j =Zsub1[j,.] + eZsub1=eZsub1+(wv1j#Z1j) + } + } + ghat=quadcross(eZsub,eZsub1) + shat2=shat2+kw*(ghat+ghat') + } + i=i+vcvo.tdelta + } + } // end non-zero kernel weight block + } // end tau loop + +// If 1-level clustering, shat2 just calculated above is actually the desired shat + if (vcvo.clustvarname2=="") { + shat=shat2 + } + } + +// 2-level clustering, completion +// Cameron-Gelbach-Miller/Thompson method: +// Add 2 cluster variance matrices and subtract 3rd + if (vcvo.clustvarname2~="") { + shat = shat+shat2-shat3 + } + +// Note no dof correction required for cluster-robust + shat=shat/vcvo.N + } // end cluster-robust code + + if (vcvo.sw~="") { +// Stock-Watson adjustment. Calculate Bhat in their equation (6). Also need T=panel length. +// They define for balanced panels. Since T is not constant for unbalanced panels, need +// to incorporate panel-varying 1/T, 1/(T-1) and 1/(T-2) as weights in summation. + + st_view(ivar, ., st_tsrevar(vcvo.ivarname), vcvo.touse) + info_ivar = panelsetup(ivar, 1) + + shat=J(L*K,L*K,0) + bhat=J(L*K,L*K,0) + N_panels=0 + for (i=1; i<=rows(info_ivar); i++) { + esub=panelsubmatrix(*vcvo.e,i,info_ivar) + Zsub=panelsubmatrix(*vcvo.Z,i,info_ivar) + wsub=panelsubmatrix(*vcvo.wvar,i,info_ivar) + Tsub=rows(esub) + if (Tsub>2) { // SW cov estimator defined only for T>2 + N_panels=N_panels+1 + sigmahatsub=J(K,K,0) + ZZsub=J(L*K,L*K,0) + shatsub=J(L*K,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZi=esub[j,1]#Zsub[j,.] + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { + shatsub=shatsub+quadcross(eZi,eZi)*wsub[j]*vcvo.wf + sigmahatsub=sigmahatsub + quadcross(esub[j,1],esub[j,1])*wsub[j]*vcvo.wf + ZZsub=ZZsub+quadcross(Zsub[j,.],Zsub[j,.])*wsub[j]*vcvo.wf + } + else { + shatsub=shatsub+quadcross(eZi,eZi)*((wsub[j]*vcvo.wf)^2) + sigmahatsub=sigmahatsub + quadcross(esub[j,1],esub[j,1])*((wsub[j]*vcvo.wf)^2) + ZZsub=ZZsub+quadcross(Zsub[j,.],Zsub[j,.])*((wsub[j]*vcvo.wf)^2) + } + } // end loop through j obs of panel i + shat=shat + shatsub*(Tsub-1)/(Tsub-2) + bhat=bhat + ZZsub/Tsub#sigmahatsub/(Tsub-1)/(Tsub-2) + } + } // end loop through i panels + +// Note that Stock-Watson incorporate an N-n-k degrees of freedom correction in their eqn 4 +// for what we call shat. We use only an N-n degrees of freedom correction, i.e., we ignore +// the k regressors. This is because this is an estimate of S, the VCV of orthogonality conditions, +// independently of its use to obtain an estimate of the variance of beta. Makes no diff aysmptotically. +// Ignore dofminus correction since this is explicitly handled here. +// Use number of valid panels in denominator (SW cov estimator defined only for panels with T>2). + shat=shat/(vcvo.N-N_panels) + bhat=bhat/N_panels + shat=shat-bhat + } // end Stock-Watson block + + _makesymmetric(shat) + +// shat may not be positive-definite. Use spectral decomposition to obtain an invertable version. +// Extract Eigenvector and Eigenvalues, replace EVs, and reassemble shat. +// psda option: Stock-Watson 2008 Econometrica, Remark 8, say replace neg EVs with abs(EVs). +// psd0 option: Politis (2007) says replace neg EVs with zeros. + if (vcvo.psd~="") { + symeigensystem(shat,Evec,Eval) + if (vcvo.psd=="psda") { + Eval = abs(Eval) + } + else { + Eval = Eval + (abs(Eval) - Eval)/2 + } + shat = Evec*diag(Eval)*Evec' + _makesymmetric(shat) + } + + return(shat) + +} // end of program m_ivreg210_omega + +// *********************************************************************** // +// ********* m_ivreg210_calckw - shared by ivreg2 and ranktest ********************* // +// *********************************************************************** // + +real scalar m_ivreg210_calckw( real scalar tau, + real scalar bw, + string scalar kernel) + { + karg = tau / bw + if (kernel=="Truncated") { + kw=1 + } + if (kernel=="Bartlett") { + kw=(1-karg) + } + if (kernel=="Parzen") { + if (karg <= 0.5) { + kw = 1-6*karg^2+6*karg^3 + } + else { + kw = 2*(1-karg)^3 + } + } + if (kernel=="Tukey-Hanning") { + kw=0.5+0.5*cos(pi()*karg) + } + if (kernel=="Tukey-Hamming") { + kw=0.54+0.46*cos(pi()*karg) + } + if (kernel=="Tent") { + kw=2*(1-cos(tau*karg)) / (karg^2) + } + if (kernel=="Danielle") { + kw=sin(pi()*karg) / (pi()*karg) + } + if (kernel=="Quadratic Spectral") { + kw=25/(12*pi()^2*karg^2) /* + */ * ( sin(6*pi()*karg/5)/(6*pi()*karg/5) /* + */ - cos(6*pi()*karg/5) ) + } + return(kw) + } // end kw + +// *********************************************************************** // +// ********* END CODE SHARED BY ivreg2 AND ranktest ******************** // +// *********************************************************************** // + +// cdsy: used by ivreg2 + +void s_ivreg210_cdsy( string scalar temp, scalar choice) +{ +string scalar s_ivbias5, s_ivbias10, s_ivbias20, s_ivbias30 +string scalar s_ivsize10, s_ivsize15, s_ivsize20, s_ivsize25 +string scalar s_fullrel5, s_fullrel10, s_fullrel20, s_fullrel30 +string scalar s_fullmax5, s_fullmax10, s_fullmax20, s_fullmax30 +string scalar s_limlsize10, s_limlsize15, s_limlsize20, s_limlsize25 + +s_ivbias5 = +". , . , . \ . , . , . \ 13.91 , . , . \ 16.85 , 11.04 , . \ 18.37 , 13.97 , 9.53 \ 19.28 , 15.72 , 12.20 \ 19.86 , 16.88 , 13.95 \ 20.25 , 17.70 , 15.18 \ 20.53 , 18.30 , 16.10 \ 20.74 , 18.76 , 16.80 \ 20.90 , 19.12 , 17.35 \ 21.01 , 19.40 , 17.80 \ 21.10 , 19.64 , 18.17 \ 21.18 , 19.83 , 18.47 \ 21.23 , 19.98 , 18.73 \ 21.28 , 20.12 , 18.94 \ 21.31 , 20.23 , 19.13 \ 21.34 , 20.33 , 19.29 \ 21.36 , 20.41 , 19.44 \ 21.38 , 20.48 , 19.56 \ 21.39 , 20.54 , 19.67 \ 21.40 , 20.60 , 19.77 \ 21.41 , 20.65 , 19.86 \ 21.41 , 20.69 , 19.94 \ 21.42 , 20.73 , 20.01 \ 21.42 , 20.76 , 20.07 \ 21.42 , 20.79 , 20.13 \ 21.42 , 20.82 , 20.18 \ 21.42 , 20.84 , 20.23 \ 21.42 , 20.86 , 20.27 \ 21.41 , 20.88 , 20.31 \ 21.41 , 20.90 , 20.35 \ 21.41 , 20.91 , 20.38 \ 21.40 , 20.93 , 20.41 \ 21.40 , 20.94 , 20.44 \ 21.39 , 20.95 , 20.47 \ 21.39 , 20.96 , 20.49 \ 21.38 , 20.97 , 20.51 \ 21.38 , 20.98 , 20.54 \ 21.37 , 20.99 , 20.56 \ 21.37 , 20.99 , 20.57 \ 21.36 , 21.00 , 20.59 \ 21.35 , 21.00 , 20.61 \ 21.35 , 21.01 , 20.62 \ 21.34 , 21.01 , 20.64 \ 21.34 , 21.02 , 20.65 \ 21.33 , 21.02 , 20.66 \ 21.32 , 21.02 , 20.67 \ 21.32 , 21.03 , 20.68 \ 21.31 , 21.03 , 20.69 \ 21.31 , 21.03 , 20.70 \ 21.30 , 21.03 , 20.71 \ 21.30 , 21.03 , 20.72 \ 21.29 , 21.03 , 20.73 \ 21.28 , 21.03 , 20.73 \ 21.28 , 21.04 , 20.74 \ 21.27 , 21.04 , 20.75 \ 21.27 , 21.04 , 20.75 \ 21.26 , 21.04 , 20.76 \ 21.26 , 21.04 , 20.76 \ 21.25 , 21.04 , 20.77 \ 21.24 , 21.04 , 20.77 \ 21.24 , 21.04 , 20.78 \ 21.23 , 21.04 , 20.78 \ 21.23 , 21.03 , 20.79 \ 21.22 , 21.03 , 20.79 \ 21.22 , 21.03 , 20.79 \ 21.21 , 21.03 , 20.80 \ 21.21 , 21.03 , 20.80 \ 21.20 , 21.03 , 20.80 \ 21.20 , 21.03 , 20.80 \ 21.19 , 21.03 , 20.81 \ 21.19 , 21.03 , 20.81 \ 21.18 , 21.03 , 20.81 \ 21.18 , 21.02 , 20.81 \ 21.17 , 21.02 , 20.82 \ 21.17 , 21.02 , 20.82 \ 21.16 , 21.02 , 20.82 \ 21.16 , 21.02 , 20.82 \ 21.15 , 21.02 , 20.82 \ 21.15 , 21.02 , 20.82 \ 21.15 , 21.02 , 20.83 \ 21.14 , 21.01 , 20.83 \ 21.14 , 21.01 , 20.83 \ 21.13 , 21.01 , 20.83 \ 21.13 , 21.01 , 20.83 \ 21.12 , 21.01 , 20.84 \ 21.12 , 21.01 , 20.84 \ 21.11 , 21.01 , 20.84 \ 21.11 , 21.01 , 20.84 \ 21.10 , 21.00 , 20.84 \ 21.10 , 21.00 , 20.84 \ 21.09 , 21.00 , 20.85 \ 21.09 , 21.00 , 20.85 \ 21.08 , 21.00 , 20.85 \ 21.08 , 21.00 , 20.85 \ 21.07 , 21.00 , 20.85 \ 21.07 , 20.99 , 20.86 \ 21.06 , 20.99 , 20.86 \ 21.06 , 20.99 , 20.86 \" +ivbias5 = strtoreal(colshape(colshape(tokens(s_ivbias5), 2)[.,1], 3)) + +s_ivbias10 = +". , . , . \ . , . , . \ 9.08 , . , . \ 10.27 , 7.56 , . \ 10.83 , 8.78 , 6.61 \ 11.12 , 9.48 , 7.77 \ 11.29 , 9.92 , 8.5 \ 11.39 , 10.22 , 9.01 \ 11.46 , 10.43 , 9.37 \ 11.49 , 10.58 , 9.64 \ 11.51 , 10.69 , 9.85 \ 11.52 , 10.78 , 10.01 \ 11.52 , 10.84 , 10.14 \ 11.52 , 10.89 , 10.25 \ 11.51 , 10.93 , 10.33 \ 11.5 , 10.96 , 10.41 \ 11.49 , 10.99 , 10.47 \ 11.48 , 11 , 10.52 \ 11.46 , 11.02 , 10.56 \ 11.45 , 11.03 , 10.6 \ 11.44 , 11.04 , 10.63 \ 11.42 , 11.05 , 10.65 \ 11.41 , 11.05 , 10.68 \ 11.4 , 11.05 , 10.7 \ 11.38 , 11.06 , 10.71 \ 11.37 , 11.06 , 10.73 \ 11.36 , 11.06 , 10.74 \ 11.34 , 11.05 , 10.75 \ 11.33 , 11.05 , 10.76 \ 11.32 , 11.05 , 10.77 \ 11.3 , 11.05 , 10.78 \ 11.29 , 11.05 , 10.79 \ 11.28 , 11.04 , 10.79 \ 11.27 , 11.04 , 10.8 \ 11.26 , 11.04 , 10.8 \ 11.25 , 11.03 , 10.8 \ 11.24 , 11.03 , 10.81 \ 11.23 , 11.02 , 10.81 \ 11.22 , 11.02 , 10.81 \ 11.21 , 11.02 , 10.81 \ 11.2 , 11.01 , 10.81 \ 11.19 , 11.01 , 10.81 \ 11.18 , 11 , 10.81 \ 11.17 , 11 , 10.81 \ 11.16 , 10.99 , 10.81 \ 11.15 , 10.99 , 10.81 \ 11.14 , 10.98 , 10.81 \ 11.13 , 10.98 , 10.81 \ 11.13 , 10.98 , 10.81 \ 11.12 , 10.97 , 10.81 \ 11.11 , 10.97 , 10.81 \ 11.1 , 10.96 , 10.81 \ 11.1 , 10.96 , 10.81 \ 11.09 , 10.95 , 10.81 \ 11.08 , 10.95 , 10.81 \ 11.07 , 10.94 , 10.8 \ 11.07 , 10.94 , 10.8 \ 11.06 , 10.94 , 10.8 \ 11.05 , 10.93 , 10.8 \ 11.05 , 10.93 , 10.8 \ 11.04 , 10.92 , 10.8 \ 11.03 , 10.92 , 10.79 \ 11.03 , 10.92 , 10.79 \ 11.02 , 10.91 , 10.79 \ 11.02 , 10.91 , 10.79 \ 11.01 , 10.9 , 10.79 \ 11 , 10.9 , 10.79 \ 11 , 10.9 , 10.78 \ 10.99 , 10.89 , 10.78 \ 10.99 , 10.89 , 10.78 \ 10.98 , 10.89 , 10.78 \ 10.98 , 10.88 , 10.78 \ 10.97 , 10.88 , 10.77 \ 10.97 , 10.88 , 10.77 \ 10.96 , 10.87 , 10.77 \ 10.96 , 10.87 , 10.77 \ 10.95 , 10.86 , 10.77 \ 10.95 , 10.86 , 10.76 \ 10.94 , 10.86 , 10.76 \ 10.94 , 10.85 , 10.76 \ 10.93 , 10.85 , 10.76 \ 10.93 , 10.85 , 10.76 \ 10.92 , 10.84 , 10.75 \ 10.92 , 10.84 , 10.75 \ 10.91 , 10.84 , 10.75 \ 10.91 , 10.84 , 10.75 \ 10.91 , 10.83 , 10.75 \ 10.9 , 10.83 , 10.74 \ 10.9 , 10.83 , 10.74 \ 10.89 , 10.82 , 10.74 \ 10.89 , 10.82 , 10.74 \ 10.89 , 10.82 , 10.74 \ 10.88 , 10.81 , 10.74 \ 10.88 , 10.81 , 10.73 \ 10.87 , 10.81 , 10.73 \ 10.87 , 10.81 , 10.73 \ 10.87 , 10.8 , 10.73 \ 10.86 , 10.8 , 10.73 \ 10.86 , 10.8 , 10.72 \ 10.86 , 10.8 , 10.72 \" +ivbias10 = strtoreal(colshape(colshape(tokens(s_ivbias10), 2)[.,1], 3)) + +s_ivbias20 = +" . , . , . \ . , . , . \ 6.46 , . , . \ 6.71 , 5.57 , . \ 6.77 , 5.91 , 4.99 \ 6.76 , 6.08 , 5.35 \ 6.73 , 6.16 , 5.56 \ 6.69 , 6.20 , 5.69 \ 6.65 , 6.22 , 5.78 \ 6.61 , 6.23 , 5.83 \ 6.56 , 6.23 , 5.87 \ 6.53 , 6.22 , 5.90 \ 6.49 , 6.21 , 5.92 \ 6.45 , 6.20 , 5.93 \ 6.42 , 6.19 , 5.94 \ 6.39 , 6.17 , 5.94 \ 6.36 , 6.16 , 5.94 \ 6.33 , 6.14 , 5.94 \ 6.31 , 6.13 , 5.94 \ 6.28 , 6.11 , 5.93 \ 6.26 , 6.10 , 5.93 \ 6.24 , 6.08 , 5.92 \ 6.22 , 6.07 , 5.92 \ 6.20 , 6.06 , 5.91 \ 6.18 , 6.05 , 5.90 \ 6.16 , 6.03 , 5.90 \ 6.14 , 6.02 , 5.89 \ 6.13 , 6.01 , 5.88 \ 6.11 , 6.00 , 5.88 \ 6.09 , 5.99 , 5.87 \ 6.08 , 5.98 , 5.87 \ 6.07 , 5.97 , 5.86 \ 6.05 , 5.96 , 5.85 \ 6.04 , 5.95 , 5.85 \ 6.03 , 5.94 , 5.84 \ 6.01 , 5.93 , 5.83 \ 6.00 , 5.92 , 5.83 \ 5.99 , 5.91 , 5.82 \ 5.98 , 5.90 , 5.82 \ 5.97 , 5.89 , 5.81 \ 5.96 , 5.89 , 5.80 \ 5.95 , 5.88 , 5.80 \ 5.94 , 5.87 , 5.79 \ 5.93 , 5.86 , 5.79 \ 5.92 , 5.86 , 5.78 \ 5.91 , 5.85 , 5.78 \ 5.91 , 5.84 , 5.77 \ 5.90 , 5.83 , 5.77 \ 5.89 , 5.83 , 5.76 \ 5.88 , 5.82 , 5.76 \ 5.87 , 5.82 , 5.75 \ 5.87 , 5.81 , 5.75 \ 5.86 , 5.80 , 5.74 \ 5.85 , 5.80 , 5.74 \ 5.85 , 5.79 , 5.73 \ 5.84 , 5.79 , 5.73 \ 5.83 , 5.78 , 5.72 \ 5.83 , 5.78 , 5.72 \ 5.82 , 5.77 , 5.72 \ 5.81 , 5.77 , 5.71 \ 5.81 , 5.76 , 5.71 \ 5.80 , 5.76 , 5.70 \ 5.80 , 5.75 , 5.70 \ 5.79 , 5.75 , 5.70 \ 5.78 , 5.74 , 5.69 \ 5.78 , 5.74 , 5.69 \ 5.77 , 5.73 , 5.68 \ 5.77 , 5.73 , 5.68 \ 5.76 , 5.72 , 5.68 \ 5.76 , 5.72 , 5.67 \ 5.75 , 5.72 , 5.67 \ 5.75 , 5.71 , 5.67 \ 5.75 , 5.71 , 5.66 \ 5.74 , 5.70 , 5.66 \ 5.74 , 5.70 , 5.66 \ 5.73 , 5.70 , 5.65 \ 5.73 , 5.69 , 5.65 \ 5.72 , 5.69 , 5.65 \ 5.72 , 5.68 , 5.65 \ 5.71 , 5.68 , 5.64 \ 5.71 , 5.68 , 5.64 \ 5.71 , 5.67 , 5.64 \ 5.70 , 5.67 , 5.63 \ 5.70 , 5.67 , 5.63 \ 5.70 , 5.66 , 5.63 \ 5.69 , 5.66 , 5.62 \ 5.69 , 5.66 , 5.62 \ 5.68 , 5.65 , 5.62 \ 5.68 , 5.65 , 5.62 \ 5.68 , 5.65 , 5.61 \ 5.67 , 5.65 , 5.61 \ 5.67 , 5.64 , 5.61 \ 5.67 , 5.64 , 5.61 \ 5.66 , 5.64 , 5.60 \ 5.66 , 5.63 , 5.60 \ 5.66 , 5.63 , 5.60 \ 5.65 , 5.63 , 5.60 \ 5.65 , 5.63 , 5.59 \ 5.65 , 5.62 , 5.59 \ 5.65 , 5.62 , 5.59 \" +ivbias20 = strtoreal(colshape(colshape(tokens(s_ivbias20), 2)[.,1], 3)) + +s_ivbias30 = +" . , . , . \ . , . , . \ 5.39 , . , . \ 5.34 , 4.73 , . \ 5.25 , 4.79 , 4.30 \ 5.15 , 4.78 , 4.40 \ 5.07 , 4.76 , 4.44 \ 4.99 , 4.73 , 4.46 \ 4.92 , 4.69 , 4.46 \ 4.86 , 4.66 , 4.45 \ 4.80 , 4.62 , 4.44 \ 4.75 , 4.59 , 4.42 \ 4.71 , 4.56 , 4.41 \ 4.67 , 4.53 , 4.39 \ 4.63 , 4.50 , 4.37 \ 4.59 , 4.48 , 4.36 \ 4.56 , 4.45 , 4.34 \ 4.53 , 4.43 , 4.32 \ 4.51 , 4.41 , 4.31 \ 4.48 , 4.39 , 4.29 \ 4.46 , 4.37 , 4.28 \ 4.43 , 4.35 , 4.27 \ 4.41 , 4.33 , 4.25 \ 4.39 , 4.32 , 4.24 \ 4.37 , 4.30 , 4.23 \ 4.35 , 4.29 , 4.21 \ 4.34 , 4.27 , 4.20 \ 4.32 , 4.26 , 4.19 \ 4.31 , 4.24 , 4.18 \ 4.29 , 4.23 , 4.17 \ 4.28 , 4.22 , 4.16 \ 4.26 , 4.21 , 4.15 \ 4.25 , 4.20 , 4.14 \ 4.24 , 4.19 , 4.13 \ 4.23 , 4.18 , 4.13 \ 4.22 , 4.17 , 4.12 \ 4.20 , 4.16 , 4.11 \ 4.19 , 4.15 , 4.10 \ 4.18 , 4.14 , 4.09 \ 4.17 , 4.13 , 4.09 \ 4.16 , 4.12 , 4.08 \ 4.15 , 4.11 , 4.07 \ 4.15 , 4.11 , 4.07 \ 4.14 , 4.10 , 4.06 \ 4.13 , 4.09 , 4.05 \ 4.12 , 4.08 , 4.05 \ 4.11 , 4.08 , 4.04 \ 4.11 , 4.07 , 4.03 \ 4.10 , 4.06 , 4.03 \ 4.09 , 4.06 , 4.02 \ 4.08 , 4.05 , 4.02 \ 4.08 , 4.05 , 4.01 \ 4.07 , 4.04 , 4.01 \ 4.06 , 4.03 , 4.00 \ 4.06 , 4.03 , 4.00 \ 4.05 , 4.02 , 3.99 \ 4.05 , 4.02 , 3.99 \ 4.04 , 4.01 , 3.98 \ 4.04 , 4.01 , 3.98 \ 4.03 , 4.00 , 3.97 \ 4.02 , 4.00 , 3.97 \ 4.02 , 3.99 , 3.96 \ 4.01 , 3.99 , 3.96 \ 4.01 , 3.98 , 3.96 \ 4.00 , 3.98 , 3.95 \ 4.00 , 3.97 , 3.95 \ 3.99 , 3.97 , 3.94 \ 3.99 , 3.97 , 3.94 \ 3.99 , 3.96 , 3.94 \ 3.98 , 3.96 , 3.93 \ 3.98 , 3.95 , 3.93 \ 3.97 , 3.95 , 3.93 \ 3.97 , 3.95 , 3.92 \ 3.96 , 3.94 , 3.92 \ 3.96 , 3.94 , 3.92 \ 3.96 , 3.93 , 3.91 \ 3.95 , 3.93 , 3.91 \ 3.95 , 3.93 , 3.91 \ 3.95 , 3.92 , 3.90 \ 3.94 , 3.92 , 3.90 \ 3.94 , 3.92 , 3.90 \ 3.93 , 3.91 , 3.89 \ 3.93 , 3.91 , 3.89 \ 3.93 , 3.91 , 3.89 \ 3.92 , 3.91 , 3.89 \ 3.92 , 3.90 , 3.88 \ 3.92 , 3.90 , 3.88 \ 3.91 , 3.90 , 3.88 \ 3.91 , 3.89 , 3.87 \ 3.91 , 3.89 , 3.87 \ 3.91 , 3.89 , 3.87 \ 3.90 , 3.89 , 3.87 \ 3.90 , 3.88 , 3.86 \ 3.90 , 3.88 , 3.86 \ 3.89 , 3.88 , 3.86 \ 3.89 , 3.87 , 3.86 \ 3.89 , 3.87 , 3.85 \ 3.89 , 3.87 , 3.85 \ 3.88 , 3.87 , 3.85 \ 3.88 , 3.86 , 3.85 \" +ivbias30 = strtoreal(colshape(colshape(tokens(s_ivbias30), 2)[.,1], 3)) + + +s_ivsize10 = +"16.38 , . \ 19.93 , 7.03 \ 22.3 , 13.43 \ 24.58 , 16.87 \ 26.87 , 19.45 \ 29.18 , 21.68 \ 31.5 , 23.72 \ 33.84 , 25.64 \ 36.19 , 27.51 \ 38.54 , 29.32 \ 40.9 , 31.11 \ 43.27 , 32.88 \ 45.64 , 34.62 \ 48.01 , 36.36 \ 50.39 , 38.08 \ 52.77 , 39.8 \ 55.15 , 41.51 \ 57.53 , 43.22 \ 59.92 , 44.92 \ 62.3 , 46.62 \ 64.69 , 48.31 \ 67.07 , 50.01 \ 69.46 , 51.7 \ 71.85 , 53.39 \ 74.24 , 55.07 \ 76.62 , 56.76 \ 79.01 , 58.45 \ 81.4 , 60.13 \ 83.79 , 61.82 \ 86.17 , 63.51 \ 88.56 , 65.19 \ 90.95 , 66.88 \ 93.33 , 68.56 \ 95.72 , 70.25 \ 98.11 , 71.94 \ 100.5 , 73.62 \ 102.88 , 75.31 \ 105.27 , 76.99 \ 107.66 , 78.68 \ 110.04 , 80.37 \ 112.43 , 82.05 \ 114.82 , 83.74 \ 117.21 , 85.42 \ 119.59 , 87.11 \ 121.98 , 88.8 \ 124.37 , 90.48 \ 126.75 , 92.17 \ 129.14 , 93.85 \ 131.53 , 95.54 \ 133.92 , 97.23 \ 136.3 , 98.91 \ 138.69 , 100.6 \ 141.08 , 102.29 \ 143.47 , 103.97 \ 145.85 , 105.66 \ 148.24 , 107.34 \ 150.63 , 109.03 \ 153.01 , 110.72 \ 155.4 , 112.4 \ 157.79 , 114.09 \ 160.18 , 115.77 \ 162.56 , 117.46 \ 164.95 , 119.15 \ 167.34 , 120.83 \ 169.72 , 122.52 \ 172.11 , 124.2 \ 174.5 , 125.89 \ 176.89 , 127.58 \ 179.27 , 129.26 \ 181.66 , 130.95 \ 184.05 , 132.63 \ 186.44 , 134.32 \ 188.82 , 136.01 \ 191.21 , 137.69 \ 193.6 , 139.38 \ 195.98 , 141.07 \ 198.37 , 142.75 \ 200.76 , 144.44 \ 203.15 , 146.12 \ 205.53 , 147.81 \ 207.92 , 149.5 \ 210.31 , 151.18 \ 212.69 , 152.87 \ 215.08 , 154.55 \ 217.47 , 156.24 \ 219.86 , 157.93 \ 222.24 , 159.61 \ 224.63 , 161.3 \ 227.02 , 162.98 \ 229.41 , 164.67 \ 231.79 , 166.36 \ 234.18 , 168.04 \ 236.57 , 169.73 \ 238.95 , 171.41 \ 241.34 , 173.1 \ 243.73 , 174.79 \ 246.12 , 176.47 \ 248.5 , 178.16 \ 250.89 , 179.84 \ 253.28 , 181.53 \" +ivsize10 = strtoreal(colshape(colshape(tokens(s_ivsize10), 2)[.,1], 2)) + +s_ivsize15 = + "8.96 , . \ 11.59 , 4.58 \ 12.83 , 8.18 \ 13.96 , 9.93 \ 15.09 , 11.22 \ 16.23 , 12.33 \ 17.38 , 13.34 \ 18.54 , 14.31 \ 19.71 , 15.24 \ 20.88 , 16.16 \ 22.06 , 17.06 \ 23.24 , 17.95 \ 24.42 , 18.84 \ 25.61 , 19.72 \ 26.80 , 20.60 \ 27.99 , 21.48 \ 29.19 , 22.35 \ 30.38 , 23.22 \ 31.58 , 24.09 \ 32.77 , 24.96 \ 33.97 , 25.82 \ 35.17 , 26.69 \ 36.37 , 27.56 \ 37.57 , 28.42 \ 38.77 , 29.29 \ 39.97 , 30.15 \ 41.17 , 31.02 \ 42.37 , 31.88 \ 43.57 , 32.74 \ 44.78 , 33.61 \ 45.98 , 34.47 \ 47.18 , 35.33 \ 48.38 , 36.19 \ 49.59 , 37.06 \ 50.79 , 37.92 \ 51.99 , 38.78 \ 53.19 , 39.64 \ 54.40 , 40.50 \ 55.60 , 41.37 \ 56.80 , 42.23 \ 58.01 , 43.09 \ 59.21 , 43.95 \ 60.41 , 44.81 \ 61.61 , 45.68 \ 62.82 , 46.54 \ 64.02 , 47.40 \ 65.22 , 48.26 \ 66.42 , 49.12 \ 67.63 , 49.99 \ 68.83 , 50.85 \ 70.03 , 51.71 \ 71.24 , 52.57 \ 72.44 , 53.43 \ 73.64 , 54.30 \ 74.84 , 55.16 \ 76.05 , 56.02 \ 77.25 , 56.88 \ 78.45 , 57.74 \ 79.66 , 58.61 \ 80.86 , 59.47 \ 82.06 , 60.33 \ 83.26 , 61.19 \ 84.47 , 62.05 \ 85.67 , 62.92 \ 86.87 , 63.78 \ 88.07 , 64.64 \ 89.28 , 65.50 \ 90.48 , 66.36 \ 91.68 , 67.22 \ 92.89 , 68.09 \ 94.09 , 68.95 \ 95.29 , 69.81 \ 96.49 , 70.67 \ 97.70 , 71.53 \ 98.90 , 72.40 \ 100.10 , 73.26 \ 101.30 , 74.12 \ 102.51 , 74.98 \ 103.71 , 75.84 \ 104.91 , 76.71 \ 106.12 , 77.57 \ 107.32 , 78.43 \ 108.52 , 79.29 \ 109.72 , 80.15 \ 110.93 , 81.02 \ 112.13 , 81.88 \ 113.33 , 82.74 \ 114.53 , 83.60 \ 115.74 , 84.46 \ 116.94 , 85.33 \ 118.14 , 86.19 \ 119.35 , 87.05 \ 120.55 , 87.91 \ 121.75 , 88.77 \ 122.95 , 89.64 \ 124.16 , 90.50 \ 125.36 , 91.36 \ 126.56 , 92.22 \ 127.76 , 93.08 \ 128.97 , 93.95 \" +ivsize15 = strtoreal(colshape(colshape(tokens(s_ivsize15), 2)[.,1], 2)) + +s_ivsize20 = + " 6.66 , . \ 8.75 , 3.95 \ 9.54 , 6.40 \ 10.26 , 7.54 \ 10.98 , 8.38 \ 11.72 , 9.10 \ 12.48 , 9.77 \ 13.24 , 10.41 \ 14.01 , 11.03 \ 14.78 , 11.65 \ 15.56 , 12.25 \ 16.35 , 12.86 \ 17.14 , 13.45 \ 17.93 , 14.05 \ 18.72 , 14.65 \ 19.51 , 15.24 \ 20.31 , 15.83 \ 21.10 , 16.42 \ 21.90 , 17.02 \ 22.70 , 17.61 \ 23.50 , 18.20 \ 24.30 , 18.79 \ 25.10 , 19.38 \ 25.90 , 19.97 \ 26.71 , 20.56 \ 27.51 , 21.15 \ 28.31 , 21.74 \ 29.12 , 22.33 \ 29.92 , 22.92 \ 30.72 , 23.51 \ 31.53 , 24.10 \ 32.33 , 24.69 \ 33.14 , 25.28 \ 33.94 , 25.87 \ 34.75 , 26.46 \ 35.55 , 27.05 \ 36.36 , 27.64 \ 37.17 , 28.23 \ 37.97 , 28.82 \ 38.78 , 29.41 \ 39.58 , 30.00 \ 40.39 , 30.59 \ 41.20 , 31.18 \ 42.00 , 31.77 \ 42.81 , 32.36 \ 43.62 , 32.95 \ 44.42 , 33.54 \ 45.23 , 34.13 \ 46.03 , 34.72 \ 46.84 , 35.31 \ 47.65 , 35.90 \ 48.45 , 36.49 \ 49.26 , 37.08 \ 50.06 , 37.67 \ 50.87 , 38.26 \ 51.68 , 38.85 \ 52.48 , 39.44 \ 53.29 , 40.02 \ 54.09 , 40.61 \ 54.90 , 41.20 \ 55.71 , 41.79 \ 56.51 , 42.38 \ 57.32 , 42.97 \ 58.13 , 43.56 \ 58.93 , 44.15 \ 59.74 , 44.74 \ 60.54 , 45.33 \ 61.35 , 45.92 \ 62.16 , 46.51 \ 62.96 , 47.10 \ 63.77 , 47.69 \ 64.57 , 48.28 \ 65.38 , 48.87 \ 66.19 , 49.46 \ 66.99 , 50.05 \ 67.80 , 50.64 \ 68.60 , 51.23 \ 69.41 , 51.82 \ 70.22 , 52.41 \ 71.02 , 53.00 \ 71.83 , 53.59 \ 72.64 , 54.18 \ 73.44 , 54.77 \ 74.25 , 55.36 \ 75.05 , 55.95 \ 75.86 , 56.54 \ 76.67 , 57.13 \ 77.47 , 57.72 \ 78.28 , 58.31 \ 79.08 , 58.90 \ 79.89 , 59.49 \ 80.70 , 60.08 \ 81.50 , 60.67 \ 82.31 , 61.26 \ 83.12 , 61.85 \ 83.92 , 62.44 \ 84.73 , 63.03 \ 85.53 , 63.62 \ 86.34 , 64.21 \ 87.15 , 64.80 \" +ivsize20 = strtoreal(colshape(colshape(tokens(s_ivsize20), 2)[.,1], 2)) + +s_ivsize25 = + " 5.53 , . \ 7.25 , 3.63 \ 7.80 , 5.45 \ 8.31 , 6.28 \ 8.84 , 6.89 \ 9.38 , 7.42 \ 9.93 , 7.91 \ 10.50 , 8.39 \ 11.07 , 8.85 \ 11.65 , 9.31 \ 12.23 , 9.77 \ 12.82 , 10.22 \ 13.41 , 10.68 \ 14.00 , 11.13 \ 14.60 , 11.58 \ 15.19 , 12.03 \ 15.79 , 12.49 \ 16.39 , 12.94 \ 16.99 , 13.39 \ 17.60 , 13.84 \ 18.20 , 14.29 \ 18.80 , 14.74 \ 19.41 , 15.19 \ 20.01 , 15.64 \ 20.61 , 16.10 \ 21.22 , 16.55 \ 21.83 , 17.00 \ 22.43 , 17.45 \ 23.04 , 17.90 \ 23.65 , 18.35 \ 24.25 , 18.81 \ 24.86 , 19.26 \ 25.47 , 19.71 \ 26.08 , 20.16 \ 26.68 , 20.61 \ 27.29 , 21.06 \ 27.90 , 21.52 \ 28.51 , 21.97 \ 29.12 , 22.42 \ 29.73 , 22.87 \ 30.33 , 23.32 \ 30.94 , 23.78 \ 31.55 , 24.23 \ 32.16 , 24.68 \ 32.77 , 25.13 \ 33.38 , 25.58 \ 33.99 , 26.04 \ 34.60 , 26.49 \ 35.21 , 26.94 \ 35.82 , 27.39 \ 36.43 , 27.85 \ 37.04 , 28.30 \ 37.65 , 28.75 \ 38.25 , 29.20 \ 38.86 , 29.66 \ 39.47 , 30.11 \ 40.08 , 30.56 \ 40.69 , 31.01 \ 41.30 , 31.47 \ 41.91 , 31.92 \ 42.52 , 32.37 \ 43.13 , 32.82 \ 43.74 , 33.27 \ 44.35 , 33.73 \ 44.96 , 34.18 \ 45.57 , 34.63 \ 46.18 , 35.08 \ 46.78 , 35.54 \ 47.39 , 35.99 \ 48.00 , 36.44 \ 48.61 , 36.89 \ 49.22 , 37.35 \ 49.83 , 37.80 \ 50.44 , 38.25 \ 51.05 , 38.70 \ 51.66 , 39.16 \ 52.27 , 39.61 \ 52.88 , 40.06 \ 53.49 , 40.51 \ 54.10 , 40.96 \ 54.71 , 41.42 \ 55.32 , 41.87 \ 55.92 , 42.32 \ 56.53 , 42.77 \ 57.14 , 43.23 \ 57.75 , 43.68 \ 58.36 , 44.13 \ 58.97 , 44.58 \ 59.58 , 45.04 \ 60.19 , 45.49 \ 60.80 , 45.94 \ 61.41 , 46.39 \ 62.02 , 46.85 \ 62.63 , 47.30 \ 63.24 , 47.75 \ 63.85 , 48.20 \ 64.45 , 48.65 \ 65.06 , 49.11 \ 65.67 , 49.56 \ 66.28 , 50.01 \" +ivsize25 = strtoreal(colshape(colshape(tokens(s_ivsize25), 2)[.,1], 2)) + + +s_fullrel5 = +" 24.09 , . \ 13.46 , 15.50 \ 9.61 , 10.83 \ 7.63 , 8.53 \ 6.42 , 7.16 \ 5.61 , 6.24 \ 5.02 , 5.59 \ 4.58 , 5.10 \ 4.23 , 4.71 \ 3.96 , 4.41 \ 3.73 , 4.15 \ 3.54 , 3.94 \ 3.38 , 3.76 \ 3.24 , 3.60 \ 3.12 , 3.47 \ 3.01 , 3.35 \ 2.92 , 3.24 \ 2.84 , 3.15 \ 2.76 , 3.06 \ 2.69 , 2.98 \ 2.63 , 2.91 \ 2.58 , 2.85 \ 2.52 , 2.79 \ 2.48 , 2.73 \ 2.43 , 2.68 \ 2.39 , 2.63 \ 2.36 , 2.59 \ 2.32 , 2.55 \ 2.29 , 2.51 \ 2.26 , 2.47 \ 2.23 , 2.44 \ 2.20 , 2.41 \ 2.18 , 2.37 \ 2.16 , 2.35 \ 2.13 , 2.32 \ 2.11 , 2.29 \ 2.09 , 2.27 \ 2.07 , 2.24 \ 2.05 , 2.22 \ 2.04 , 2.20 \ 2.02 , 2.18 \ 2.00 , 2.16 \ 1.99 , 2.14 \ 1.97 , 2.12 \ 1.96 , 2.10 \ 1.94 , 2.09 \ 1.93 , 2.07 \ 1.92 , 2.05 \ 1.91 , 2.04 \ 1.89 , 2.02 \ 1.88 , 2.01 \ 1.87 , 2.00 \ 1.86 , 1.98 \ 1.85 , 1.97 \ 1.84 , 1.96 \ 1.83 , 1.95 \ 1.82 , 1.94 \ 1.81 , 1.92 \ 1.80 , 1.91 \ 1.79 , 1.90 \ 1.79 , 1.89 \ 1.78 , 1.88 \ 1.77 , 1.87 \ 1.76 , 1.87 \ 1.75 , 1.86 \ 1.75 , 1.85 \ 1.74 , 1.84 \ 1.73 , 1.83 \ 1.72 , 1.83 \ 1.72 , 1.82 \ 1.71 , 1.81 \ 1.70 , 1.80 \ 1.70 , 1.80 \ 1.69 , 1.79 \ 1.68 , 1.79 \ 1.68 , 1.78 \ 1.67 , 1.77 \ 1.67 , 1.77 \ 1.66 , 1.76 \ 1.65 , 1.76 \ 1.65 , 1.75 \ 1.64 , 1.75 \ 1.64 , 1.74 \ 1.63 , 1.74 \ 1.63 , 1.73 \ 1.62 , 1.73 \ 1.61 , 1.73 \ 1.61 , 1.72 \ 1.60 , 1.72 \ 1.60 , 1.71 \ 1.59 , 1.71 \ 1.59 , 1.71 \ 1.58 , 1.71 \ 1.58 , 1.70 \ 1.57 , 1.70 \ 1.57 , 1.70 \ 1.56 , 1.69 \ 1.56 , 1.69 \ 1.55 , 1.69 \ 1.55 , 1.69 )" +fullrel5 = strtoreal(colshape(colshape(tokens(s_fullrel5), 2)[.,1], 2)) + +s_fullrel10 = + " 19.36 , . \ 10.89 , 12.55 \ 7.90 , 8.96 \ 6.37 , 7.15 \ 5.44 , 6.07 \ 4.81 , 5.34 \ 4.35 , 4.82 \ 4.01 , 4.43 \ 3.74 , 4.12 \ 3.52 , 3.87 \ 3.34 , 3.67 \ 3.19 , 3.49 \ 3.06 , 3.35 \ 2.95 , 3.22 \ 2.85 , 3.11 \ 2.76 , 3.01 \ 2.69 , 2.92 \ 2.62 , 2.84 \ 2.56 , 2.77 \ 2.50 , 2.71 \ 2.45 , 2.65 \ 2.40 , 2.60 \ 2.36 , 2.55 \ 2.32 , 2.50 \ 2.28 , 2.46 \ 2.24 , 2.42 \ 2.21 , 2.38 \ 2.18 , 2.35 \ 2.15 , 2.31 \ 2.12 , 2.28 \ 2.10 , 2.25 \ 2.07 , 2.23 \ 2.05 , 2.20 \ 2.03 , 2.17 \ 2.01 , 2.15 \ 1.99 , 2.13 \ 1.97 , 2.11 \ 1.95 , 2.09 \ 1.93 , 2.07 \ 1.92 , 2.05 \ 1.90 , 2.03 \ 1.88 , 2.01 \ 1.87 , 2.00 \ 1.86 , 1.98 \ 1.84 , 1.96 \ 1.83 , 1.95 \ 1.82 , 1.93 \ 1.81 , 1.92 \ 1.79 , 1.91 \ 1.78 , 1.89 \ 1.77 , 1.88 \ 1.76 , 1.87 \ 1.75 , 1.86 \ 1.74 , 1.85 \ 1.73 , 1.84 \ 1.72 , 1.83 \ 1.71 , 1.82 \ 1.70 , 1.81 \ 1.70 , 1.80 \ 1.69 , 1.79 \ 1.68 , 1.78 \ 1.67 , 1.77 \ 1.67 , 1.76 \ 1.66 , 1.75 \ 1.65 , 1.75 \ 1.64 , 1.74 \ 1.64 , 1.73 \ 1.63 , 1.72 \ 1.63 , 1.72 \ 1.62 , 1.71 \ 1.61 , 1.70 \ 1.61 , 1.70 \ 1.60 , 1.69 \ 1.60 , 1.68 \ 1.59 , 1.68 \ 1.59 , 1.67 \ 1.58 , 1.67 \ 1.58 , 1.66 \ 1.57 , 1.66 \ 1.57 , 1.65 \ 1.56 , 1.65 \ 1.56 , 1.64 \ 1.56 , 1.64 \ 1.55 , 1.63 \ 1.55 , 1.63 \ 1.54 , 1.62 \ 1.54 , 1.62 \ 1.54 , 1.62 \ 1.53 , 1.61 \ 1.53 , 1.61 \ 1.53 , 1.61 \ 1.52 , 1.60 \ 1.52 , 1.60 \ 1.52 , 1.60 \ 1.52 , 1.59 \ 1.51 , 1.59 \ 1.51 , 1.59 \ 1.51 , 1.59 \ 1.51 , 1.58 \ 1.50 , 1.58 )" +fullrel10 = strtoreal(colshape(colshape(tokens(s_fullrel10), 2)[.,1], 2)) + +s_fullrel20 = +" 15.64 , . \ 9.00 , 9.72 \ 6.61 , 7.18 \ 5.38 , 5.85 \ 4.62 , 5.04 \ 4.11 , 4.48 \ 3.75 , 4.08 \ 3.47 , 3.77 \ 3.25 , 3.53 \ 3.07 , 3.33 \ 2.92 , 3.17 \ 2.80 , 3.04 \ 2.70 , 2.92 \ 2.61 , 2.82 \ 2.53 , 2.73 \ 2.46 , 2.65 \ 2.39 , 2.58 \ 2.34 , 2.52 \ 2.29 , 2.46 \ 2.24 , 2.41 \ 2.20 , 2.36 \ 2.16 , 2.32 \ 2.13 , 2.28 \ 2.10 , 2.24 \ 2.06 , 2.21 \ 2.04 , 2.18 \ 2.01 , 2.15 \ 1.99 , 2.12 \ 1.96 , 2.09 \ 1.94 , 2.07 \ 1.92 , 2.04 \ 1.90 , 2.02 \ 1.88 , 2.00 \ 1.87 , 1.98 \ 1.85 , 1.96 \ 1.83 , 1.94 \ 1.82 , 1.93 \ 1.80 , 1.91 \ 1.79 , 1.89 \ 1.78 , 1.88 \ 1.76 , 1.86 \ 1.75 , 1.85 \ 1.74 , 1.84 \ 1.73 , 1.82 \ 1.72 , 1.81 \ 1.71 , 1.80 \ 1.70 , 1.79 \ 1.69 , 1.78 \ 1.68 , 1.77 \ 1.67 , 1.76 \ 1.66 , 1.75 \ 1.65 , 1.74 \ 1.65 , 1.73 \ 1.64 , 1.72 \ 1.63 , 1.71 \ 1.62 , 1.70 \ 1.62 , 1.69 \ 1.61 , 1.68 \ 1.60 , 1.68 \ 1.60 , 1.67 \ 1.59 , 1.66 \ 1.58 , 1.65 \ 1.58 , 1.65 \ 1.57 , 1.64 \ 1.57 , 1.63 \ 1.56 , 1.63 \ 1.56 , 1.62 \ 1.55 , 1.62 \ 1.55 , 1.61 \ 1.54 , 1.60 \ 1.54 , 1.60 \ 1.53 , 1.59 \ 1.53 , 1.59 \ 1.52 , 1.58 \ 1.52 , 1.58 \ 1.51 , 1.57 \ 1.51 , 1.57 \ 1.51 , 1.56 \ 1.50 , 1.56 \ 1.50 , 1.56 \ 1.49 , 1.55 \ 1.49 , 1.55 \ 1.49 , 1.54 \ 1.48 , 1.54 \ 1.48 , 1.54 \ 1.48 , 1.53 \ 1.47 , 1.53 \ 1.47 , 1.53 \ 1.47 , 1.52 \ 1.46 , 1.52 \ 1.46 , 1.52 \ 1.46 , 1.51 \ 1.46 , 1.51 \ 1.45 , 1.51 \ 1.45 , 1.50 \ 1.45 , 1.50 \ 1.45 , 1.50 \ 1.44 , 1.50 \ 1.44 , 1.49 \ 1.44 , 1.49 )" +fullrel20 = strtoreal(colshape(colshape(tokens(s_fullrel20), 2)[.,1], 2)) + +s_fullrel30 = + " 12.71 , . \ 7.49 , 8.03 \ 5.60 , 6.15 \ 4.63 , 5.10 \ 4.03 , 4.44 \ 3.63 , 3.98 \ 3.33 , 3.65 \ 3.11 , 3.39 \ 2.93 , 3.19 \ 2.79 , 3.02 \ 2.67 , 2.88 \ 2.57 , 2.77 \ 2.48 , 2.67 \ 2.41 , 2.58 \ 2.34 , 2.51 \ 2.28 , 2.44 \ 2.23 , 2.38 \ 2.18 , 2.33 \ 2.14 , 2.28 \ 2.10 , 2.23 \ 2.07 , 2.19 \ 2.04 , 2.16 \ 2.01 , 2.12 \ 1.98 , 2.09 \ 1.95 , 2.06 \ 1.93 , 2.03 \ 1.90 , 2.01 \ 1.88 , 1.98 \ 1.86 , 1.96 \ 1.84 , 1.94 \ 1.83 , 1.92 \ 1.81 , 1.90 \ 1.79 , 1.88 \ 1.78 , 1.87 \ 1.76 , 1.85 \ 1.75 , 1.83 \ 1.74 , 1.82 \ 1.72 , 1.80 \ 1.71 , 1.79 \ 1.70 , 1.78 \ 1.69 , 1.77 \ 1.68 , 1.75 \ 1.67 , 1.74 \ 1.66 , 1.73 \ 1.65 , 1.72 \ 1.64 , 1.71 \ 1.63 , 1.70 \ 1.62 , 1.69 \ 1.61 , 1.68 \ 1.60 , 1.67 \ 1.60 , 1.66 \ 1.59 , 1.66 \ 1.58 , 1.65 \ 1.57 , 1.64 \ 1.57 , 1.63 \ 1.56 , 1.63 \ 1.55 , 1.62 \ 1.55 , 1.61 \ 1.54 , 1.61 \ 1.54 , 1.60 \ 1.53 , 1.59 \ 1.53 , 1.59 \ 1.52 , 1.58 \ 1.51 , 1.57 \ 1.51 , 1.57 \ 1.50 , 1.56 \ 1.50 , 1.56 \ 1.50 , 1.55 \ 1.49 , 1.55 \ 1.49 , 1.54 \ 1.48 , 1.54 \ 1.48 , 1.53 \ 1.47 , 1.53 \ 1.47 , 1.52 \ 1.47 , 1.52 \ 1.46 , 1.52 \ 1.46 , 1.51 \ 1.46 , 1.51 \ 1.45 , 1.50 \ 1.45 , 1.50 \ 1.45 , 1.50 \ 1.44 , 1.49 \ 1.44 , 1.49 \ 1.44 , 1.48 \ 1.43 , 1.48 \ 1.43 , 1.48 \ 1.43 , 1.47 \ 1.43 , 1.47 \ 1.42 , 1.47 \ 1.42 , 1.47 \ 1.42 , 1.46 \ 1.42 , 1.46 \ 1.41 , 1.46 \ 1.41 , 1.45 \ 1.41 , 1.45 \ 1.41 , 1.45 \ 1.41 , 1.45 \ 1.40 , 1.44 \ 1.40 , 1.44 \ 1.40 , 1.44 \" +fullrel30 = strtoreal(colshape(colshape(tokens(s_fullrel30), 2)[.,1], 2)) + + +s_fullmax5 = + " 23.81 , . \ 12.38 , 14.19 \ 8.66 , 10.00 \ 6.81 , 7.88 \ 5.71 , 6.60 \ 4.98 , 5.74 \ 4.45 , 5.13 \ 4.06 , 4.66 \ 3.76 , 4.30 \ 3.51 , 4.01 \ 3.31 , 3.77 \ 3.15 , 3.57 \ 3.00 , 3.41 \ 2.88 , 3.26 \ 2.78 , 3.13 \ 2.69 , 3.02 \ 2.61 , 2.92 \ 2.53 , 2.84 \ 2.47 , 2.76 \ 2.41 , 2.69 \ 2.36 , 2.62 \ 2.31 , 2.56 \ 2.27 , 2.51 \ 2.23 , 2.46 \ 2.19 , 2.42 \ 2.15 , 2.37 \ 2.12 , 2.33 \ 2.09 , 2.30 \ 2.07 , 2.26 \ 2.04 , 2.23 \ 2.02 , 2.20 \ 1.99 , 2.17 \ 1.97 , 2.14 \ 1.95 , 2.12 \ 1.93 , 2.10 \ 1.91 , 2.07 \ 1.90 , 2.05 \ 1.88 , 2.03 \ 1.87 , 2.01 \ 1.85 , 1.99 \ 1.84 , 1.98 \ 1.82 , 1.96 \ 1.81 , 1.94 \ 1.80 , 1.93 \ 1.79 , 1.91 \ 1.78 , 1.90 \ 1.76 , 1.88 \ 1.75 , 1.87 \ 1.74 , 1.86 \ 1.73 , 1.85 \ 1.73 , 1.83 \ 1.72 , 1.82 \ 1.71 , 1.81 \ 1.70 , 1.80 \ 1.69 , 1.79 \ 1.68 , 1.78 \ 1.68 , 1.77 \ 1.67 , 1.76 \ 1.66 , 1.75 \ 1.65 , 1.74 \ 1.65 , 1.74 \ 1.64 , 1.73 \ 1.63 , 1.72 \ 1.63 , 1.71 \ 1.62 , 1.70 \ 1.62 , 1.70 \ 1.61 , 1.69 \ 1.60 , 1.68 \ 1.60 , 1.68 \ 1.59 , 1.67 \ 1.59 , 1.66 \ 1.58 , 1.66 \ 1.58 , 1.65 \ 1.57 , 1.64 \ 1.57 , 1.64 \ 1.56 , 1.63 \ 1.56 , 1.63 \ 1.55 , 1.62 \ 1.55 , 1.62 \ 1.54 , 1.61 \ 1.54 , 1.61 \ 1.53 , 1.60 \ 1.53 , 1.60 \ 1.53 , 1.59 \ 1.52 , 1.59 \ 1.52 , 1.58 \ 1.51 , 1.58 \ 1.51 , 1.57 \ 1.50 , 1.57 \ 1.50 , 1.57 \ 1.50 , 1.56 \ 1.49 , 1.56 \ 1.49 , 1.55 \ 1.49 , 1.55 \ 1.48 , 1.55 \ 1.48 , 1.54 \ 1.47 , 1.54 \ 1.47 , 1.54 \ 1.47 , 1.53 \ 1.46 , 1.53 )" +fullmax5 = strtoreal(colshape(colshape(tokens(s_fullmax5), 2)[.,1], 2)) + +s_fullmax10 = +" 19.40 , . \ 10.14 , 11.92 \ 7.18 , 8.39 \ 5.72 , 6.64 \ 4.85 , 5.60 \ 4.27 , 4.90 \ 3.86 , 4.40 \ 3.55 , 4.03 \ 3.31 , 3.73 \ 3.12 , 3.50 \ 2.96 , 3.31 \ 2.83 , 3.15 \ 2.71 , 3.01 \ 2.62 , 2.89 \ 2.53 , 2.79 \ 2.46 , 2.70 \ 2.39 , 2.62 \ 2.33 , 2.55 \ 2.28 , 2.49 \ 2.23 , 2.43 \ 2.19 , 2.38 \ 2.15 , 2.33 \ 2.11 , 2.29 \ 2.08 , 2.25 \ 2.05 , 2.21 \ 2.02 , 2.18 \ 1.99 , 2.14 \ 1.97 , 2.11 \ 1.94 , 2.08 \ 1.92 , 2.06 \ 1.90 , 2.03 \ 1.88 , 2.01 \ 1.86 , 1.99 \ 1.85 , 1.97 \ 1.83 , 1.95 \ 1.81 , 1.93 \ 1.80 , 1.91 \ 1.79 , 1.89 \ 1.77 , 1.88 \ 1.76 , 1.86 \ 1.75 , 1.85 \ 1.74 , 1.83 \ 1.72 , 1.82 \ 1.71 , 1.81 \ 1.70 , 1.80 \ 1.69 , 1.78 \ 1.68 , 1.77 \ 1.67 , 1.76 \ 1.66 , 1.75 \ 1.66 , 1.74 \ 1.65 , 1.73 \ 1.64 , 1.72 \ 1.63 , 1.71 \ 1.62 , 1.70 \ 1.62 , 1.69 \ 1.61 , 1.69 \ 1.60 , 1.68 \ 1.60 , 1.67 \ 1.59 , 1.66 \ 1.58 , 1.65 \ 1.58 , 1.65 \ 1.57 , 1.64 \ 1.57 , 1.63 \ 1.56 , 1.63 \ 1.55 , 1.62 \ 1.55 , 1.61 \ 1.54 , 1.61 \ 1.54 , 1.60 \ 1.53 , 1.60 \ 1.53 , 1.59 \ 1.52 , 1.59 \ 1.52 , 1.58 \ 1.52 , 1.58 \ 1.51 , 1.57 \ 1.51 , 1.57 \ 1.50 , 1.56 \ 1.50 , 1.56 \ 1.49 , 1.55 \ 1.49 , 1.55 \ 1.49 , 1.54 \ 1.48 , 1.54 \ 1.48 , 1.53 \ 1.48 , 1.53 \ 1.47 , 1.53 \ 1.47 , 1.52 \ 1.46 , 1.52 \ 1.46 , 1.51 \ 1.46 , 1.51 \ 1.45 , 1.51 \ 1.45 , 1.50 \ 1.45 , 1.50 \ 1.44 , 1.50 \ 1.44 , 1.49 \ 1.44 , 1.49 \ 1.44 , 1.49 \ 1.43 , 1.48 \ 1.43 , 1.48 \ 1.43 , 1.48 \ 1.42 , 1.48 \ 1.42 , 1.47 )" +fullmax10 = strtoreal(colshape(colshape(tokens(s_fullmax10), 2)[.,1], 2)) + +s_fullmax20 = +" 15.39 , . \ 8.16 , 9.41 \ 5.87 , 6.79 \ 4.75 , 5.47 \ 4.08 , 4.66 \ 3.64 , 4.13 \ 3.32 , 3.74 \ 3.08 , 3.45 \ 2.89 , 3.22 \ 2.74 , 3.03 \ 2.62 , 2.88 \ 2.51 , 2.76 \ 2.42 , 2.65 \ 2.35 , 2.56 \ 2.28 , 2.48 \ 2.22 , 2.40 \ 2.17 , 2.34 \ 2.12 , 2.28 \ 2.08 , 2.23 \ 2.04 , 2.19 \ 2.01 , 2.15 \ 1.98 , 2.11 \ 1.95 , 2.07 \ 1.92 , 2.04 \ 1.89 , 2.01 \ 1.87 , 1.98 \ 1.85 , 1.96 \ 1.83 , 1.93 \ 1.81 , 1.91 \ 1.79 , 1.89 \ 1.77 , 1.87 \ 1.76 , 1.85 \ 1.74 , 1.83 \ 1.73 , 1.82 \ 1.72 , 1.80 \ 1.70 , 1.79 \ 1.69 , 1.77 \ 1.68 , 1.76 \ 1.67 , 1.74 \ 1.66 , 1.73 \ 1.65 , 1.72 \ 1.64 , 1.71 \ 1.63 , 1.70 \ 1.62 , 1.69 \ 1.61 , 1.68 \ 1.60 , 1.67 \ 1.59 , 1.66 \ 1.58 , 1.65 \ 1.58 , 1.64 \ 1.57 , 1.63 \ 1.56 , 1.62 \ 1.56 , 1.62 \ 1.55 , 1.61 \ 1.54 , 1.60 \ 1.54 , 1.59 \ 1.53 , 1.59 \ 1.52 , 1.58 \ 1.52 , 1.57 \ 1.51 , 1.57 \ 1.51 , 1.56 \ 1.50 , 1.56 \ 1.50 , 1.55 \ 1.49 , 1.54 \ 1.49 , 1.54 \ 1.48 , 1.53 \ 1.48 , 1.53 \ 1.47 , 1.52 \ 1.47 , 1.52 \ 1.47 , 1.51 \ 1.46 , 1.51 \ 1.46 , 1.51 \ 1.45 , 1.50 \ 1.45 , 1.50 \ 1.45 , 1.49 \ 1.44 , 1.49 \ 1.44 , 1.48 \ 1.44 , 1.48 \ 1.43 , 1.48 \ 1.43 , 1.47 \ 1.43 , 1.47 \ 1.42 , 1.46 \ 1.42 , 1.46 \ 1.42 , 1.46 \ 1.41 , 1.45 \ 1.41 , 1.45 \ 1.41 , 1.45 \ 1.40 , 1.44 \ 1.40 , 1.44 \ 1.40 , 1.44 \ 1.40 , 1.44 \ 1.39 , 1.43 \ 1.39 , 1.43 \ 1.39 , 1.43 \ 1.39 , 1.42 \ 1.38 , 1.42 \ 1.38 , 1.42 \ 1.38 , 1.42 \ 1.38 , 1.41 \ 1.37 , 1.41 \ 1.37 , 1.41 )" +fullmax20 = strtoreal(colshape(colshape(tokens(s_fullmax20), 2)[.,1], 2)) + +s_fullmax30 = + " 12.76 , . \ 6.97 , 8.01 \ 5.11 , 5.88 \ 4.19 , 4.78 \ 3.64 , 4.12 \ 3.27 , 3.67 \ 3.00 , 3.35 \ 2.80 , 3.10 \ 2.64 , 2.91 \ 2.52 , 2.76 \ 2.41 , 2.63 \ 2.33 , 2.52 \ 2.25 , 2.43 \ 2.19 , 2.35 \ 2.13 , 2.29 \ 2.08 , 2.22 \ 2.04 , 2.17 \ 2.00 , 2.12 \ 1.96 , 2.08 \ 1.93 , 2.04 \ 1.90 , 2.01 \ 1.87 , 1.97 \ 1.84 , 1.94 \ 1.82 , 1.92 \ 1.80 , 1.89 \ 1.78 , 1.87 \ 1.76 , 1.84 \ 1.74 , 1.82 \ 1.73 , 1.80 \ 1.71 , 1.79 \ 1.70 , 1.77 \ 1.68 , 1.75 \ 1.67 , 1.74 \ 1.66 , 1.72 \ 1.64 , 1.71 \ 1.63 , 1.70 \ 1.62 , 1.68 \ 1.61 , 1.67 \ 1.60 , 1.66 \ 1.59 , 1.65 \ 1.58 , 1.64 \ 1.57 , 1.63 \ 1.57 , 1.62 \ 1.56 , 1.61 \ 1.55 , 1.60 \ 1.54 , 1.59 \ 1.54 , 1.59 \ 1.53 , 1.58 \ 1.52 , 1.57 \ 1.52 , 1.56 \ 1.51 , 1.56 \ 1.50 , 1.55 \ 1.50 , 1.54 \ 1.49 , 1.54 \ 1.49 , 1.53 \ 1.48 , 1.53 \ 1.48 , 1.52 \ 1.47 , 1.51 \ 1.47 , 1.51 \ 1.46 , 1.50 \ 1.46 , 1.50 \ 1.45 , 1.49 \ 1.45 , 1.49 \ 1.44 , 1.48 \ 1.44 , 1.48 \ 1.44 , 1.47 \ 1.43 , 1.47 \ 1.43 , 1.47 \ 1.42 , 1.46 \ 1.42 , 1.46 \ 1.42 , 1.45 \ 1.41 , 1.45 \ 1.41 , 1.45 \ 1.41 , 1.44 \ 1.40 , 1.44 \ 1.40 , 1.44 \ 1.40 , 1.43 \ 1.39 , 1.43 \ 1.39 , 1.43 \ 1.39 , 1.42 \ 1.39 , 1.42 \ 1.38 , 1.42 \ 1.38 , 1.41 \ 1.38 , 1.41 \ 1.37 , 1.41 \ 1.37 , 1.40 \ 1.37 , 1.40 \ 1.37 , 1.40 \ 1.36 , 1.40 \ 1.36 , 1.39 \ 1.36 , 1.39 \ 1.36 , 1.39 \ 1.36 , 1.38 \ 1.35 , 1.38 \ 1.35 , 1.38 \ 1.35 , 1.38 \ 1.35 , 1.37 \ 1.34 , 1.37 \ 1.34 , 1.37 \ 1.34 , 1.37 )" +fullmax30 = strtoreal(colshape(colshape(tokens(s_fullmax30), 2)[.,1], 2)) + + +s_limlsize10 = + " 16.38 , . \ 8.68 , 7.03 \ 6.46 , 5.44 \ 5.44 , 4.72 \ 4.84 , 4.32 \ 4.45 , 4.06 \ 4.18 , 3.90 \ 3.97 , 3.78 \ 3.81 , 3.70 \ 3.68 , 3.64 \ 3.58 , 3.60 \ 3.50 , 3.58 \ 3.42 , 3.56 \ 3.36 , 3.55 \ 3.31 , 3.54 \ 3.27 , 3.55 \ 3.24 , 3.55 \ 3.20 , 3.56 \ 3.18 , 3.57 \ 3.21 , 3.58 \ 3.39 , 3.59 \ 3.57 , 3.60 \ 3.68 , 3.62 \ 3.75 , 3.64 \ 3.79 , 3.65 \ 3.82 , 3.67 \ 3.85 , 3.74 \ 3.86 , 3.87 \ 3.87 , 4.02 \ 3.88 , 4.12 \ 3.89 , 4.19 \ 3.89 , 4.24 \ 3.90 , 4.27 \ 3.90 , 4.31 \ 3.90 , 4.33 \ 3.90 , 4.36 \ 3.90 , 4.38 \ 3.90 , 4.39 \ 3.90 , 4.41 \ 3.90 , 4.43 \ 3.90 , 4.44 \ 3.90 , 4.45 \ 3.90 , 4.47 \ 3.90 , 4.48 \ 3.90 , 4.49 \ 3.90 , 4.50 \ 3.90 , 4.51 \ 3.90 , 4.52 \ 3.90 , 4.53 \ 3.90 , 4.54 \ 3.90 , 4.55 \ 3.90 , 4.56 \ 3.90 , 4.56 \ 3.90 , 4.57 \ 3.90 , 4.58 \ 3.90 , 4.59 \ 3.90 , 4.59 \ 3.90 , 4.60 \ 3.90 , 4.61 \ 3.90 , 4.61 \ 3.90 , 4.62 \ 3.90 , 4.62 \ 3.90 , 4.63 \ 3.90 , 4.63 \ 3.89 , 4.64 \ 3.89 , 4.64 \ 3.89 , 4.64 \ 3.89 , 4.65 \ 3.89 , 4.65 \ 3.89 , 4.65 \ 3.89 , 4.66 \ 3.89 , 4.66 \ 3.89 , 4.66 \ 3.89 , 4.66 \ 3.88 , 4.66 \ 3.88 , 4.66 \ 3.88 , 4.66 \ 3.88 , 4.66 \ 3.88 , 4.66 \ 3.88 , 4.66 \ 3.88 , 4.66 \ 3.87 , 4.66 \ 3.87 , 4.66 \ 3.87 , 4.66 \ 3.87 , 4.66 \ 3.87 , 4.66 \ 3.86 , 4.65 \ 3.86 , 4.65 \ 3.86 , 4.65 \ 3.86 , 4.64 \ 3.85 , 4.64 \ 3.85 , 4.64 \ 3.85 , 4.63 \ 3.85 , 4.63 \ 3.84 , 4.62 \ 3.84 , 4.62 \ 3.84 , 4.61 \ 3.84 , 4.60 \ 3.83 , 4.60 \ 3.83 , 4.59 )" +limlsize10 = strtoreal(colshape(colshape(tokens(s_limlsize10), 2)[.,1], 2)) + +s_limlsize15 = + " 8.96 , . \ 5.33 , 4.58 \ 4.36 , 3.81 \ 3.87 , 3.39 \ 3.56 , 3.13 \ 3.34 , 2.95 \ 3.18 , 2.83 \ 3.04 , 2.73 \ 2.93 , 2.66 \ 2.84 , 2.60 \ 2.76 , 2.55 \ 2.69 , 2.52 \ 2.63 , 2.48 \ 2.57 , 2.46 \ 2.52 , 2.44 \ 2.48 , 2.42 \ 2.44 , 2.41 \ 2.41 , 2.40 \ 2.37 , 2.39 \ 2.34 , 2.38 \ 2.32 , 2.38 \ 2.29 , 2.37 \ 2.27 , 2.37 \ 2.25 , 2.37 \ 2.24 , 2.37 \ 2.22 , 2.38 \ 2.21 , 2.38 \ 2.20 , 2.38 \ 2.19 , 2.39 \ 2.18 , 2.39 \ 2.19 , 2.40 \ 2.22 , 2.41 \ 2.33 , 2.42 \ 2.40 , 2.42 \ 2.45 , 2.43 \ 2.48 , 2.44 \ 2.50 , 2.45 \ 2.52 , 2.54 \ 2.53 , 2.55 \ 2.54 , 2.66 \ 2.55 , 2.73 \ 2.56 , 2.78 \ 2.57 , 2.82 \ 2.57 , 2.85 \ 2.58 , 2.87 \ 2.58 , 2.89 \ 2.58 , 2.91 \ 2.59 , 2.92 \ 2.59 , 2.93 \ 2.59 , 2.94 \ 2.59 , 2.95 \ 2.59 , 2.96 \ 2.60 , 2.97 \ 2.60 , 2.98 \ 2.60 , 2.98 \ 2.60 , 2.99 \ 2.60 , 2.99 \ 2.60 , 3.00 \ 2.60 , 3.00 \ 2.60 , 3.01 \ 2.60 , 3.01 \ 2.60 , 3.02 \ 2.61 , 3.02 \ 2.61 , 3.02 \ 2.61 , 3.03 \ 2.61 , 3.03 \ 2.61 , 3.03 \ 2.61 , 3.03 \ 2.61 , 3.04 \ 2.61 , 3.04 \ 2.61 , 3.04 \ 2.60 , 3.04 \ 2.60 , 3.04 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.60 , 3.05 \ 2.59 , 3.05 \ 2.59 , 3.05 \ 2.59 , 3.05 \ 2.59 , 3.05 \ 2.59 , 3.05 \ 2.59 , 3.04 \ 2.58 , 3.04 \ 2.58 , 3.04 \ 2.58 , 3.04 \ 2.58 , 3.04 \ 2.58 , 3.03 \ 2.57 , 3.03 \ 2.57 , 3.03 \ 2.57 , 3.03 \ 2.57 , 3.02 \ 2.56 , 3.02 \ 2.56 , 3.02 )" +limlsize15 = strtoreal(colshape(colshape(tokens(s_limlsize15), 2)[.,1], 2)) + +s_limlsize20 = + " 6.66 , . \ 4.42 , 3.95 \ 3.69 , 3.32 \ 3.30 , 2.99 \ 3.05 , 2.78 \ 2.87 , 2.63 \ 2.73 , 2.52 \ 2.63 , 2.43 \ 2.54 , 2.36 \ 2.46 , 2.30 \ 2.40 , 2.25 \ 2.34 , 2.21 \ 2.29 , 2.17 \ 2.25 , 2.14 \ 2.21 , 2.11 \ 2.18 , 2.09 \ 2.14 , 2.07 \ 2.11 , 2.05 \ 2.09 , 2.03 \ 2.06 , 2.02 \ 2.04 , 2.01 \ 2.02 , 1.99 \ 2.00 , 1.98 \ 1.98 , 1.98 \ 1.96 , 1.97 \ 1.95 , 1.96 \ 1.93 , 1.96 \ 1.92 , 1.95 \ 1.90 , 1.95 \ 1.89 , 1.95 \ 1.88 , 1.94 \ 1.87 , 1.94 \ 1.86 , 1.94 \ 1.85 , 1.94 \ 1.84 , 1.94 \ 1.83 , 1.94 \ 1.82 , 1.94 \ 1.81 , 1.95 \ 1.81 , 1.95 \ 1.80 , 1.95 \ 1.79 , 1.95 \ 1.79 , 1.96 \ 1.78 , 1.96 \ 1.78 , 1.97 \ 1.80 , 1.97 \ 1.87 , 1.98 \ 1.92 , 1.98 \ 1.95 , 1.99 \ 1.97 , 2.00 \ 1.99 , 2.00 \ 2.00 , 2.01 \ 2.01 , 2.09 \ 2.02 , 2.11 \ 2.03 , 2.18 \ 2.04 , 2.23 \ 2.04 , 2.27 \ 2.05 , 2.29 \ 2.05 , 2.31 \ 2.06 , 2.33 \ 2.06 , 2.34 \ 2.07 , 2.35 \ 2.07 , 2.36 \ 2.07 , 2.37 \ 2.08 , 2.38 \ 2.08 , 2.39 \ 2.08 , 2.39 \ 2.08 , 2.40 \ 2.09 , 2.40 \ 2.09 , 2.41 \ 2.09 , 2.41 \ 2.09 , 2.41 \ 2.09 , 2.42 \ 2.09 , 2.42 \ 2.09 , 2.42 \ 2.09 , 2.43 \ 2.10 , 2.43 \ 2.10 , 2.43 \ 2.10 , 2.43 \ 2.10 , 2.44 \ 2.10 , 2.44 \ 2.10 , 2.44 \ 2.10 , 2.44 \ 2.10 , 2.44 \ 2.09 , 2.44 \ 2.09 , 2.44 \ 2.09 , 2.45 \ 2.09 , 2.45 \ 2.09 , 2.45 \ 2.09 , 2.45 \ 2.09 , 2.45 \ 2.09 , 2.45 \ 2.09 , 2.45 \ 2.08 , 2.45 \ 2.08 , 2.45 \ 2.08 , 2.45 \ 2.08 , 2.45 \ 2.08 , 2.45 \ 2.07 , 2.44 \ 2.07 , 2.44 \ 2.07 , 2.44 )" +limlsize20 = strtoreal(colshape(colshape(tokens(s_limlsize20), 2)[.,1], 2)) + +s_limlsize25 = + " 5.53 , . \ 3.92 , 3.63 \ 3.32 , 3.09 \ 2.98 , 2.79 \ 2.77 , 2.60 \ 2.61 , 2.46 \ 2.49 , 2.35 \ 2.39 , 2.27 \ 2.32 , 2.20 \ 2.25 , 2.14 \ 2.19 , 2.09 \ 2.14 , 2.05 \ 2.10 , 2.02 \ 2.06 , 1.99 \ 2.03 , 1.96 \ 2.00 , 1.93 \ 1.97 , 1.91 \ 1.94 , 1.89 \ 1.92 , 1.87 \ 1.90 , 1.86 \ 1.88 , 1.84 \ 1.86 , 1.83 \ 1.84 , 1.81 \ 1.83 , 1.80 \ 1.81 , 1.79 \ 1.80 , 1.78 \ 1.78 , 1.77 \ 1.77 , 1.77 \ 1.76 , 1.76 \ 1.75 , 1.75 \ 1.74 , 1.75 \ 1.73 , 1.74 \ 1.72 , 1.73 \ 1.71 , 1.73 \ 1.70 , 1.73 \ 1.69 , 1.72 \ 1.68 , 1.72 \ 1.67 , 1.71 \ 1.67 , 1.71 \ 1.66 , 1.71 \ 1.65 , 1.71 \ 1.65 , 1.71 \ 1.64 , 1.70 \ 1.63 , 1.70 \ 1.63 , 1.70 \ 1.62 , 1.70 \ 1.62 , 1.70 \ 1.61 , 1.70 \ 1.61 , 1.70 \ 1.61 , 1.70 \ 1.60 , 1.70 \ 1.60 , 1.70 \ 1.59 , 1.70 \ 1.59 , 1.70 \ 1.59 , 1.70 \ 1.58 , 1.70 \ 1.58 , 1.71 \ 1.58 , 1.71 \ 1.57 , 1.71 \ 1.59 , 1.71 \ 1.60 , 1.71 \ 1.63 , 1.72 \ 1.65 , 1.72 \ 1.67 , 1.72 \ 1.69 , 1.72 \ 1.70 , 1.76 \ 1.71 , 1.81 \ 1.72 , 1.87 \ 1.73 , 1.91 \ 1.74 , 1.94 \ 1.74 , 1.96 \ 1.75 , 1.98 \ 1.75 , 1.99 \ 1.76 , 2.01 \ 1.76 , 2.02 \ 1.77 , 2.03 \ 1.77 , 2.04 \ 1.78 , 2.04 \ 1.78 , 2.05 \ 1.78 , 2.06 \ 1.79 , 2.06 \ 1.79 , 2.07 \ 1.79 , 2.07 \ 1.79 , 2.08 \ 1.80 , 2.08 \ 1.80 , 2.09 \ 1.80 , 2.09 \ 1.80 , 2.09 \ 1.80 , 2.09 \ 1.80 , 2.10 \ 1.80 , 2.10 \ 1.80 , 2.10 \ 1.80 , 2.10 \ 1.80 , 2.10 \ 1.80 , 2.11 \ 1.80 , 2.11 \ 1.80 , 2.11 \ 1.80 , 2.11 \ 1.80 , 2.11 \ 1.80 , 2.11 )" +limlsize25 = strtoreal(colshape(colshape(tokens(s_limlsize25), 2)[.,1], 2)) + +if (choice == 1) { + st_matrix(temp, ivbias5) +} else if (choice == 2) { + st_matrix(temp, ivbias10) +} else if (choice == 3) { + st_matrix(temp, ivbias20) +} else if (choice == 4) { + st_matrix(temp, ivbias30) +} else if (choice == 5) { + st_matrix(temp, ivsize10) +} else if (choice == 6) { + st_matrix(temp, ivsize15) +} else if (choice == 7) { + st_matrix(temp, ivsize20) +} else if (choice == 8) { + st_matrix(temp, ivsize25) +} else if (choice == 9) { + st_matrix(temp, fullrel5) +} else if (choice == 10) { + st_matrix(temp, fullrel10) +} else if (choice == 11) { + st_matrix(temp, fullrel20) +} else if (choice == 12) { + st_matrix(temp, fullrel30) +} else if (choice == 13) { + st_matrix(temp, fullmax5) +} else if (choice == 14) { + st_matrix(temp, fullmax10) +} else if (choice == 15) { + st_matrix(temp, fullmax20) +} else if (choice == 16) { + st_matrix(temp, fullmax30) +} else if (choice == 17) { + st_matrix(temp, limlsize10) +} else if (choice == 18) { + st_matrix(temp, limlsize15) +} else if (choice == 19) { + st_matrix(temp, limlsize20) +} else if (choice == 20) { + st_matrix(temp, limlsize25) +} +} // end of program cdsy + +end + + +****************************************** END *************************************** +*********************************** livreg2.mlib CODE ******************************** + +***************************************** START ************************************** +*********************************** ranktest.ado CODE ******************************** +* Code from: +* ranktest 1.3.04 24aug2014 +* author mes, based on code by fk +* Imported into ivreg210 so that ivreg210 is free-standing. +* See end of file for version notes. + +program define ivreg210_ranktest, rclass sortpreserve + version 9.2 + local lversion 01.3.04 + + if substr("`1'",1,1)== "," { + if "`2'"=="version" { + di in ye "`lversion'" + return local version `lversion' + exit + } + else { +di as err "invalid syntax" + exit 198 + } + } + +* If varlist 1 or varlist 2 have a single element, parentheses optional + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local y `s(varlist)' + local K : word count `y' + local 0 `"`s(rest)'"' + sret clear + } + else { + local y `1' + local K 1 + mac shift 1 + local 0 `"`*'"' + } + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local z `s(varlist)' + local L : word count `z' + local 0 `"`s(rest)'"' + sret clear + } + else { + local z `1' + local K 1 + mac shift 1 +* Need to reinsert comma before options (if any) for -syntax- command to work + local 0 `", `*'"' + } + +* Option version ignored here if varlists were provided + syntax [if] [in] [aw fw pw iw/] [, partial(varlist ts) fwl(varlist ts) /* + */ NOConstant wald ALLrank NULLrank FULLrank ROBust cluster(varlist) /* + */ BW(string) kernel(string) Tvar(varname) Ivar(varname) sw psd version /* + */ dofminus(integer 0) ] + + local partial "`partial' `fwl'" + + if "`noconstant'"=="" { + tempvar one + gen byte `one' = 1 + local partial "`partial' `one'" + } + + if "`wald'"~="" { + local LMWald "Wald" + } + else { + local LMWald "LM" + } + + local optct : word count `allrank' `nullrank' `fullrank' + if `optct' > 1 { +di as err "Incompatible options: `allrank' `nullrank' `fullrank'" + error 198 + } + else if `optct' == 0 { +* Default + local allrank "allrank" + } + +* Note that by tsrevar-ing here, subsequent disruption to the sort doesn't matter +* for TS operators. + tsrevar `y' + local vl1 `r(varlist)' + tsrevar `z' + local vl2 `r(varlist)' + tsrevar `partial' + local partial `r(varlist)' + + foreach vn of varlist `vl1' { + tempvar tv + qui gen double `tv' = . + local tempvl1 "`tempvl1' `tv'" + } + foreach vn of varlist `vl2' { + tempvar tv + qui gen double `tv' = . + local tempvl2 "`tempvl2' `tv'" + } + + marksample touse + markout `touse' `vl1' `vl2' `partial' `cluster', strok + +* Stock-Watson and cluster imply robust. + if "`sw'`cluster'" ~= "" { + local robust "robust" + } + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + if "`fsqrt(wf)*(wvar^0.5):*'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "fweight" & "`sw'" != "" { + di in red "fweights currently not supported with -sw- option" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`bw'" !="" { + di in red "iweights not allowed with robust, cluster, AC or HAC" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + + +* Every time a weight is used, must multiply by scalar wf ("weight factor") +* wf=1 for no weights, fw and iw, wf = scalar that normalizes sum to be N if aw or pw + sum `wvar' if `touse' `wtexp', meanonly +* Weight statement + if "`weight'" ~= "" { +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + if "`weight'"=="" | "`weight'"=="fweight" | "`weight'"=="iweight" { +* If weight is "", weight var must be column of ones and N is number of rows. +* With fw and iw, effective number of observations is sum of weight variable. + local wf=1 + local N=r(sum_w) + } + else if "`weight'"=="aweight" | "`weight'"=="pweight" { +* With aw and pw, N is number of obs, unadjusted. + local wf=r(N)/r(sum_w) + local N=r(N) + } + else { +* Should never reach here +di as err "ivreg210_ranktest error - misspecified weights" + exit 198 + } + +* HAC estimation. +* If bw is omitted, default `bw' is empty string. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. + if "`bw'" == "" & "`kernel'" == "" { + local bw=0 + } + else { +* Need tvar for markout with time-series stuff +* Data must be tsset for time-series operators in code to work +* User-supplied tvar checked if consistent with tsset + capture tsset + if "`r(timevar)'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } +* If no panel data, ivar will still be empty + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already -tsset-" + exit 5 + } + local tdelta `r(tdelta)' + tsreport if `touse', panel + if `r(N_gaps)' != 0 { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + +* Check it's a valid kernel and replace with unabbreviated kernel name; check bw. +* Automatic kernel selection allowed by ivreg2 but not ranktest so must trap. +* s_ivreg210_vkernel is in livreg2 mlib. + if "`bw'"=="auto" { +di as err "invalid bandwidth in option bw() - must be real > 0" + exit 198 + } + mata: s_ivreg210_vkernel("`kernel'", "`bw'", "`ivar'") + local kernel `r(kernel)' + local bw = `r(bw)' + } + +* tdelta missing if version 9 or if not tsset + if "`tdelta'"=="" { + local tdelta=1 + } + + if "`sw'"~="" { + capture xtset + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already tsset or xtset" + exit 5 + } +* Exit with error if ivar is neither supplied nor tsset nor xtset + if "`ivar'"=="" { +di as err "Must -xtset- or -tsset- data or specify -ivar- with -sw- option" + exit 198 + } + qui describe, short varlist + local sortlist "`r(sortlist)'" + tokenize `sortlist' + if "`ivar'"~="`1'" { +di as err "Error - dataset must be sorted on panel var with -sw- option" + exit 198 + } + } + +* Create variable used for getting lags etc. in Mata + tempvar tindex + qui gen `tindex'=1 if `touse' + qui replace `tindex'=sum(`tindex') if `touse' + +********** CLUSTER SETUP ********************************************** + +* Mata code requires data are sorted on (1) the first var cluster if there +* is only one cluster var; (2) on the 3rd and then 1st if two-way clustering, +* unless (3) two-way clustering is combined with kernel option, in which case +* the data are tsset and sorted on panel id (first cluster variable) and time +* id (second cluster variable). +* Second cluster var is optional and requires an identifier numbered 1..N_clust2, +* unless combined with kernel option, in which case it's the time variable. +* Third cluster var is the intersection of 1 and 2, unless combined with kernel +* opt, in which case it's unnecessary. +* Sorting on "cluster3 cluster1" means that in Mata, panelsetup works for +* both, since cluster1 nests cluster3. +* Note that it is possible to cluster on time but not panel, in which case +* cluster1 is time, cluster2 is empty and data are sorted on panel-time. +* Note also that if no kernel-robust, sorting will disrupt any tsset-ing, +* but data are tsrevar-ed earlier to avoid any problems. + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`kernel'"~="" { +* kernel requires either that cluster1 is time var and cluster2 is empty +* or that cluster1 is panel var and cluster2 is time var. +* Either way, data must be tsset and sorted for panel data. + if "`cluster2'"~="" { +* Allow backwards order + if "`cluster1'"=="`tvar'" & "`cluster2'"=="`ivar'" { + local cluster1 "`2'" + local cluster2 "`1'" + } + if "`cluster1'"~="`ivar'" | "`cluster2'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset panel & time vars." +di as err " tsset panel var=`ivar'; tsset time var=`tvar'; cluster vars=`cluster1',`cluster2'" + exit 198 + } + } + else { + if "`cluster1'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset time variable." +di as err " tsset time var=`tvar'; cluster var=`cluster1'" + exit 198 + } + } + } +* Simple way to get quick count of 1st cluster variable without disrupting sort +* clusterid1 is numbered 1.._Nclust1. + tempvar clusterid1 + qui egen `clusterid1'=group(`cluster1') if `touse' + sum `clusterid1' if `touse', meanonly + if "`cluster2'"=="" { + local N_clust=r(max) + local N_clust1=. + local N_clust2=. + if "`kernel'"=="" { +* Single level of clustering and no kernel-robust, so sort on single cluster var. +* kernel-robust already sorted via tsset. + sort `cluster1' + } + } + else { + local N_clust1=r(max) + if "`kernel'"=="" { + tempvar clusterid2 clusterid3 +* New cluster id vars are numbered 1..N_clust2 and 1..N_clust3 + qui egen `clusterid2'=group(`cluster2') if `touse' + qui egen `clusterid3'=group(`cluster1' `cluster2') if `touse' +* Two levels of clustering and no kernel-robust, so sort on cluster3/nested in/cluster1 +* kernel-robust already sorted via tsset. + sort `clusterid3' `cluster1' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) + } + else { +* Need to create this only to count the number of clusters + tempvar clusterid2 + qui egen `clusterid2'=group(`cluster2') if `touse' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) +* Now replace with original variable + local clusterid2 `cluster2' + } + local N_clust=min(`N_clust1',`N_clust2') + } + } + +************************************************************************************************ + +* Note that bw is passed as a value, not as a string + mata: ivreg210_rkstat( "`vl1'", /* + */ "`vl2'", /* + */ "`partial'", /* + */ "`wvar'", /* + */ "`weight'", /* + */ `wf', /* + */ `N', /* + */ "`touse'", /* + */ "`LMWald'", /* + */ "`allrank'", /* + */ "`nullrank'", /* + */ "`fullrank'", /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`tvar'", /* + */ "`ivar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ `dofminus', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`tempvl1'", /* + */ "`tempvl2'") + + tempname rkmatrix chi2 df df_r p rank ccorr eval + mat `rkmatrix'=r(rkmatrix) + mat `ccorr'=r(ccorr) + mat `eval'=r(eval) + mat colnames `rkmatrix' = "rk" "df" "p" "rank" "eval" "ccorr" + +di +di "Kleibergen-Paap rk `LMWald' test of rank of matrix" + if "`robust'"~="" & "`kernel'"~= "" & "`cluster'"=="" { +di " Test statistic robust to heteroskedasticity and autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`kernel'"~="" & "`cluster'"=="" { +di " Test statistic robust to autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`cluster'"~="" { +di " Test statistic robust to heteroskedasticity and clustering on `cluster'" + if "`kernel'"~="" { +di " and kernel-robust to common correlated disturbances" +di " Kernel: `kernel' Bandwidth: `bw'" + } + } + else if "`robust'"~="" { +di " Test statistic robust to heteroskedasticity" + } + else if "`LMWald'"=="LM" { +di " Test assumes homoskedasticity (Anderson canonical correlations test)" + } + else { +di " Test assumes homoskedasticity (Cragg-Donald test)" + } + + local numtests = rowsof(`rkmatrix') + forvalues i=1(1)`numtests' { +di "Test of rank=" %3.0f `rkmatrix'[`i',4] " rk=" %8.2f `rkmatrix'[`i',1] /* + */ " Chi-sq(" %3.0f `rkmatrix'[`i',2] ") pvalue=" %8.6f `rkmatrix'[`i',3] + } + scalar `chi2' = `rkmatrix'[`numtests',1] + scalar `p' = `rkmatrix'[`numtests',3] + scalar `df' = `rkmatrix'[`numtests',2] + scalar `rank' = `rkmatrix'[`numtests',4] + local N `r(N)' + return scalar df = `df' + return scalar chi2 = `chi2' + return scalar p = `p' + return scalar rank = `rank' + if "`cluster'"~="" { + return scalar N_clust = `N_clust' + } + if "`cluster2'"~="" { + return scalar N_clust1 = `N_clust1' + return scalar N_clust2 = `N_clust2' + } + return scalar N = `N' + return matrix rkmatrix `rkmatrix' + return matrix ccorr `ccorr' + return matrix eval `eval' + + tempname S V Omega + if `K' > 1 { + foreach en of local y { +* Remove "." from equation name + local en1 : subinstr local en "." "_", all + foreach vn of local z { + local cn "`cn' `en1':`vn'" + } + } + } + else { + foreach vn of local z { + local cn "`cn' `vn'" + } + } + mat `V'=r(V) + matrix colnames `V' = `cn' + matrix rownames `V' = `cn' + return matrix V `V' + mat `S'=r(S) + matrix colnames `S' = `cn' + matrix rownames `S' = `cn' + return matrix S `S' +end + +* Adopted from -canon- +program define GetVarlist, sclass + sret clear + gettoken open 0 : 0, parse("(") + if `"`open'"' != "(" { + error 198 + } + gettoken next 0 : 0, parse(")") + while `"`next'"' != ")" { + if `"`next'"'=="" { + error 198 + } + local list `list'`next' + gettoken next 0 : 0, parse(")") + } + sret local rest `"`0'"' + tokenize `list' + local 0 `*' + sret local varlist "`0'" +end + + +******************************************************************************* +*************************** BEGIN MATA CODE *********************************** +******************************************************************************* + + + +version 9.2 +mata: + +// ********* MATA CODE SHARED BY ivreg2 AND ranktest *************** // +// ********* 1. struct ms_ivreg210_vcvorthog *************** // +// ********* 2. m_ivreg210_omega *************** // +// ********* 3. m_ivreg210_calckw *************** // +// ********* 4. s_ivreg210_vkernel *************** // +// *********************************************************************** // + +// For reference: +// struct ms_ivreg210_vcvorthog { +// string scalar ename, Znames, touse, weight, wvarname +// string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel +// string scalar sw, psd, ivarname, tvarname, tindexname +// real scalar wf, N, bw, tdelta, dofminus +// real matrix ZZ +// pointer matrix e +// pointer matrix Z +// pointer matrix wvar +// } + +void ivreg210_rkstat( string scalar vl1, + string scalar vl2, + string scalar partial, + string scalar wvarname, + string scalar weight, + scalar wf, + scalar N, + string scalar touse, + string scalar LMWald, + string scalar allrank, + string scalar nullrank, + string scalar fullrank, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + bw, + string scalar tvarname, + string scalar ivarname, + string scalar tindexname, + tdelta, + dofminus, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar tempvl1, + string scalar tempvl2) +{ + +// tempx, tempy and tempz are the Stata names of temporary variables that will be changed by rkstat + if (partial~="") { + tempx=tokens(partial) + } + tempy=tokens(tempvl1) + tempz=tokens(tempvl2) + + st_view(y=.,.,tokens(vl1),touse) + st_view(z=.,.,tokens(vl2),touse) + st_view(yhat=.,.,tempy,touse) + st_view(zhat=.,.,tempz,touse) + st_view(mtouse=.,.,tokens(touse),touse) + st_view(wvar=.,.,tokens(wvarname),touse) + noweight=(st_vartype(wvarname)=="byte") + +// Note that we now use wf*wvar instead of wvar +// because wvar is raw weighting variable and +// wf*wvar normalizes so that sum(wf*wvar)=N. + +// Partial out the X variables +// Note that this is entered if there is a constant, +// i.e., variables are centered + if (partial~="") { + st_view(x=.,.,tempx,touse) + xx = quadcross(x, wf*wvar, x) + xy = quadcross(x, wf*wvar, y) + xz = quadcross(x, wf*wvar, z) + + by = invsym(xx)*xy + bz = invsym(xx)*xz + + yhat[.,.] = y-x*by + zhat[.,.] = z-x*bz + } + else { + yhat[.,.] = y + zhat[.,.] = z + } + K=cols(y) + L=cols(z) + + zhzh = quadcross(zhat, wf*wvar, zhat) + zhyh = quadcross(zhat, wf*wvar, yhat) + yhyh = quadcross(yhat, wf*wvar, yhat) + + pihat = invsym(zhzh)*zhyh +// rzhat is F in paper (p. 103) +// iryhat is G in paper (p. 103) + ryhat=cholesky(yhyh) + rzhat=cholesky(zhzh) + iryhat=luinv(ryhat') + irzhat=luinv(rzhat') + that=rzhat'*pihat*iryhat + +// cc is canonical correlations. Squared cc is eigenvalues. + fullsvd(that, ut, cc, vt) + vt=vt' + vecth=vec(that) + ev = cc:^2 +// S matrix in paper (p. 100). Not used in code below. +// smat=fullsdiag(cc, rows(that)-cols(that)) + + if (abs(1-cc[1,1])<1e-10) { +printf("\n{text:Warning: collinearities detected between (varlist1) and (varlist2)}\n") + } + if ((missing(ryhat)>0) | (missing(iryhat)>0) | (missing(rzhat)>0) | (missing(irzhat)>0)) { +printf("\n{error:Error: non-positive-definite matrix. May be caused by collinearities.}\n") + exit(error(3351)) + } + +// If Wald, yhat is residuals + if (LMWald=="Wald") { + yhat[.,.]=yhat-zhat*pihat + yhyh = quadcross(yhat, wvar, yhat) + } + +// Covariance matrices +// vhat is W in paper (eqn below equation 17, p. 103) +// shat is V in paper (eqn below eqn 15, p. 103) + +// ************************************************************************************* // +// shat calculated using struct and programs m_ivreg210_omega, m_ivreg210_calckw shared with ivreg2 // + + struct ms_ivreg210_vcvorthog scalar vcvo + + + vcvo.ename = tempy // ivreg2 has = ename // + vcvo.Znames = tempz // ivreg2 has = Znames // + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = zhzh // ivreg2 has = st_matrix(ZZmatrix) // + + vcvo.e = &yhat // ivreg2 has = &e // + vcvo.Z = &zhat // ivreg2 has = &Z // + vcvo.wvar = &wvar + + shat=m_ivreg210_omega(vcvo) + +// *************************************************************************************** + +// Finally, calcluate vhat + if ((LMWald=="LM") & (kernel=="") & (robust=="") & (clustvarname=="")) { +// Homoskedastic, iid LM case means vcv is identity matrix +// Generates canonical correlation stats. Default. + vhat=I(L*K,L*K)/N + } + else { + vhat=(iryhat'#irzhat')*shat*(iryhat'#irzhat')' * N + _makesymmetric(vhat) + } + +// ready to start collecting test stats + if (allrank~="") { + firstrank=1 + lastrank=min((K,L)) + } + else if (nullrank~="") { + firstrank=1 + lastrank=1 + } + else if (fullrank~="") { + firstrank=min((K,L)) + lastrank=min((K,L)) + } + else { +// should never reach this point +printf("ivreg210_ranktest error\n") + exit + } + + rkmatrix=J(lastrank-firstrank+1,6,.) + for (i=firstrank; i<=lastrank; i++) { + + if (i>1) { + u12=ut[(1::i-1),(i..L)] + v12=vt[(1::i-1),(i..K)] + } + u22=ut[(i::L),(i..L)] + v22=vt[(i::K),(i..K)] + + symeigensystem(u22*u22', evec, eval) + u22v=evec + u22d=diag(eval) + u22h=u22v*(u22d:^0.5)*u22v' + + symeigensystem(v22*v22', evec, eval) + v22v=evec + v22d=diag(eval) + v22h=v22v*(v22d:^0.5)*v22v' + + if (i>1) { + aq=(u12 \ u22)*luinv(u22)*u22h + bq=v22h*luinv(v22')*(v12 \ v22)' + } + else { + aq=u22*luinv(u22)*u22h + bq=v22h*luinv(v22')*v22' + } + +// lab is lambda_q in paper (eqn below equation 21, p. 104) +// vlab is omega_q in paper (eqn 19 in paper, p. 104) + lab=(bq#aq')*vecth + vlab=(bq#aq')*vhat*(bq#aq')' + +// Symmetrize if numerical inaccuracy means it isn't + _makesymmetric(vlab) + vlabinv=invsym(vlab) +// rk stat Assumption 2: vlab (omega_q in paper) is nonsingular. Detected by a zero on the diagonal, +// since when returning a generalized inverse, Stata/Mata choose the generalized inverse that +// sets entire column(s)/row(s) to zeros. +// Save df and rank even if test stat not available. + df=(L-i+1)*(K-i+1) + rkmatrix[i-firstrank+1,2]=df + rkmatrix[i-firstrank+1,4]=i-1 + if (diag0cnt(vlabinv)>0) { +printf("\n{text:Warning: covariance matrix omega_%f}", i-1) +printf("{text: not full rank; test of rank %f}", i-1) +printf("{text: unavailable}\n") + } +// Note not multiplying by N - already incorporated in vhat. + else { + rk=lab'*vlabinv*lab + pvalue=chi2tail(df, rk) + rkmatrix[i-firstrank+1,1]=rk + rkmatrix[i-firstrank+1,3]=pvalue + } +// end of test loop + } + +// insert squared (=eigenvalues if canon corr) and unsquared canon correlations + for (i=firstrank; i<=lastrank; i++) { + rkmatrix[i-firstrank+1,6]=cc[i-firstrank+1,1] + rkmatrix[i-firstrank+1,5]=ev[i-firstrank+1,1] + } + st_matrix("r(rkmatrix)", rkmatrix) + st_matrix("r(ccorr)", cc') + st_matrix("r(eval)",ev') +// Save V matrix as in paper, without factor of 1/N + vhat=N*vhat*wf + st_matrix("r(V)", vhat) +// Save S matrix as in ivreg2, with factor of 1/N + st_matrix("r(S)", shat) + st_numscalar("r(N)", N) + if (clustvarname~="") { + st_numscalar("r(N_clust)", N_clust) + } + if (clustvarname2~="") { + st_numscalar("r(N_clust2)", N_clust2) + } +// end of program +} + + +end + +****************************************** END *************************************** +*********************************** ranktest.ado CODE ******************************** + + +program define ivreg210, eclass byable(recall) /* properties(svyj) */ sortpreserve + version 10.1 + local lversion 03.1.10 + + local ivreg2_cmd "ivreg210" + local ranktest_cmd "ivreg210_ranktest" + + if replay() { + syntax [, FIRST FFIRST RF Level(integer $S_level) NOHEader NOFOoter dropfirst droprf /* + */ EForm(string) PLUS VERsion] + if "`version'" != "" & "`first'`ffirst'`rf'`noheader'`nofooter'`dropfirst'`droprf'`eform'`plus'" != "" { + di as err "option version not allowed" + error 198 + } + if "`version'" != "" { + di in gr "`lversion'" + ereturn clear + ereturn local version `lversion' + exit + } + if `"`e(cmd)'"' != "`ivreg2_cmd'" { + error 301 + } + if "`e(firsteqs)'" != "" & "`dropfirst'" == "" { +* On replay, set flag so saved eqns aren't dropped + local savefirst "savefirst" + } + if "`e(rfeq)'" != "" & "`droprf'" == "" { +* On replay, set flag so saved eqns aren't dropped + local saverf "saverf" + } + } + else { + local cmdline "`ivreg2_cmd' `*'" + + syntax [anything(name=0)] [if] [in] [aw fw pw iw/] [, /* + */ FIRST FFIRST NOID NOCOLLIN SAVEFIRST SAVEFPrefix(name) /* + */ SMall Robust CLuster(varlist) kiefer dkraay(integer 0) /* + */ GMM GMM2s CUE ORTHOG(string) ENDOGtest(string) /* + */ PARTIAL(string) FWL(string) NOConstant Level(integer $S_level) /* + */ NOHEader NOFOoter NOOUTput title(string) subtitle(string) /* + */ DEPname(string) EForm(string) PLUS /* + */ BW(string) kernel(string) Tvar(varname) Ivar(varname)/* + */ LIML COVIV FULLER(real 0) Kclass(real 0) /* + */ REDundant(string) RF SAVERF SAVERFPrefix(name) /* + */ B0(string) SMATRIX(string) WMATRIX(string) sw psd0 psda /* + */ dofminus(integer 0) sdofminus(integer 0) NOPARTIALSMALL ] + + local n 0 + + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + if `s(stop)' { + error 198 + } + while `s(stop)'==0 { + if "`paren'"=="(" { + local n = `n' + 1 + if `n'>1 { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +exit 198 + } + gettoken p lhs : lhs, parse(" =") + while "`p'"!="=" { + if "`p'"=="" { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +di in red `"the equal sign "=" is required"' +exit 198 + } + local endo `endo' `p' + gettoken p lhs : lhs, parse(" =") + } +* To enable Cragg HOLS estimator, allow for empty endo list + local temp_ct : word count `endo' + if `temp_ct' > 0 { + tsunab endo : `endo' + } +* To enable OLS estimator with (=) syntax, allow for empty exexog list + local temp_ct : word count `lhs' + if `temp_ct' > 0 { + tsunab exexog : `lhs' + } + } + else { + local inexog `inexog' `lhs' + } + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + } + local 0 `"`lhs' `0'"' + + tsunab inexog : `inexog' + tokenize `inexog' + local lhs "`1'" + local 1 " " + local inexog `*' + + if "`gmm2s'`cue'" != "" & "`exexog'" == "" { + di in red "option `gmm2s'`cue' invalid: no excluded instruments specified" + exit 102 + } + +/* DISABLED IN IVREG210 - RANKTEST IS INTERNAL +* Check that -ranktest- is installed + capture `ranktest_cmd', version + if _rc != 0 { +di as err "Error: must have ranktest version `ranktestversion' or greater installed" +di as err "To install, from within Stata type " _c +di in smcl "{stata ssc install ranktest :ssc install ranktest}" + exit 601 + } + local vernum "`r(version)'" + if ("`vernum'" < "`ranktestversion'") | ("`vernum'" > "09.9.99") { +di as err "Error: must have ranktest version `ranktestversion' or greater installed" +di as err "Currently installed version is `vernum'" +di as err "To update, from within Stata type " _c +di in smcl "{stata ssc install ranktest, replace :ssc install ranktest, replace}" + exit 601 + } +*/ + +* Process options + +* Legacy gmm option + if "`gmm'" ~= "" { +di in ye "-gmm- is no longer a supported option; use -gmm2s- with the appropriate option" +di in ye " gmm = gmm2s robust" +di in ye " gmm robust = gmm2s robust" +di in ye " gmm bw() = gmm2s bw()" +di in ye " gmm robust bw() = gmm2s robust bw()" +di in ye " gmm cluster() = gmm2s cluster()" + local gmm2s "gmm2s" + if "`robust'`cluster'`bw'"=="" { +* 2-step efficient gmm with arbitrary heteroskedasticity + local robust "robust" + } + } + +* partial, including legacy FWL option + local partial "`partial' `fwl'" + local partial : list retokenize partial +* Need word option so that varnames with cons in them aren't zapped + local partial : subinstr local partial "_cons" "", all count(local partialcons) word + if `partialcons' > 0 & "`noconstant'"~="" { +di in r "Error: _cons listed in partial() but equation specifies -noconstant-." + error 198 + } + else if "`noconstant'"~="" { + local partialcons 0 + } + else if `partialcons' > 1 { +* Just in case of multiple _cons +di in r "Error: _cons listed more than once in partial()." + error 198 + } + else if "`partial'" ~= "" { + local partialcons 1 + } + + if `fuller' != 0 { + local fulleropt "fuller(`fuller')" + } + if `kclass' != 0 { + local kclassopt "kclass(`kclass')" + } + +* Fuller implies LIML + if "`liml'" == "" & `fuller' != 0 { + local liml "liml" + } + +* b0 implies noid. Also check for incompatible options. + if "`b0'" ~= "" { + local noid "noid" + local b0opts "`gmm2s'`cue'`liml'`wmatrix'`kclassopt'" + if "`b0opts'" != "" { +* ...with spaces + local b0opts "`gmm2s' `cue' `liml' `wmatrix' `kclassopt'" + local b0opts : list retokenize b0opts +di as err "incompatible options: -b0- and `b0opts'" + exit 198 + } + } + + if "`gmm2s'" != "" & "`cue'" != "" { +di as err "incompatible options: 2-step efficient gmm and cue gmm" + exit 198 + } + +* savefprefix implies savefirst + if "`savefprefix'" != "" & "`savefirst'" == "" { + local savefirst "savefirst" + } + +* default savefprefix is _ivreg2_ + if "`savefprefix'" == "" { + local savefprefix "_`ivreg2_cmd'_" + } + +* saverfprefix implies saverf + if "`saverfprefix'" != "" & "`saverf'" == "" { + local saverf "saverf" + } + +* default saverfprefix is _ivreg2_ + if "`saverfprefix'" == "" { + local saverfprefix "_`ivreg2_cmd'_" + } + +* LIML/kclass incompatibilities + if "`liml'`kclassopt'" != "" { + if "`gmm2s'`cue'" != "" { +di as err "GMM estimation not available with LIML or k-class estimators" + exit 198 + } + if `fuller' < 0 { +di as err "invalid Fuller option" + exit 198 + } + if "`liml'" != "" & "`kclassopt'" != "" { +di as err "cannot use liml and kclass options together" + exit 198 + } +* Process kclass string + if `kclass' < 0 { +di as err "invalid k-class option" + exit 198 + } + } + + if "`cluster'`sw'"~="" { +* Cluster and SW imply robust + local robust "robust" + } + + if "`psd0'"~="" & "`psda'"~="" { +di as err "cannot use psd0 and psda options together" + exit 198 + } +* Macro psd has either psd0, psda or is empty + local psd "`psd0'`psda'" + +******************* Prepare for TS data ******************* + + if "`orthog'`endogtest'`redundant'`partial'" != "" { + capture tsunab orthog : `orthog' + capture tsunab endogtest : `endogtest' + capture tsunab redundant : `redundant' + capture tsunab partial : `partial' + } + +* TS operators not allowed with cluster, ivar or tvar. Captured in -syntax-. + +* Set flag for use of time-series variables. Will be =1 if a TS operator is used, =0 otherwise. + tsunab vnames : `lhs' `inexog' `exexog' `endo' + local vnames : subinstr local vnames "." ".", count(local tsused) + +* Routines below will call tsrevar or, from within Mata, st_tsrevar. +* This will create temporary variables according to how the data are tsset now. +* tsrevar remembers the temp vars created between calls, so we create +* them all now. `exp' is weight variable. + + tsrevar `lhs' `inexog' `exexog' `endo' + +* If kernel-robust, data must be tsset. +* Later code maintains tsset-ing for kernel-robust, but can change sort +* order for cluster if not kernel-robust, which would make ts operators +* fail subsequently, so a later call to -tsset- is needed to restore -tsset-ing. +* -sortpreserve- should take care of the rest following exit of ivreg2. +* User-supplied tvar and ivar checked if consistent with tsset. + + capture tsset + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } +* If no panel data, ivar will still be empty + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already -tsset-" + exit 5 + } + if "`r(tdelta)'" != "" { + local tdelta = `r(tdelta)' + } + else { + local tdelta=1 + } + +*********************************************************** + +* dkraay(bw) = clustering on time-series var in a panel + kernel-robust +* Default is zero + if `dkraay' ~= 0 { + if "`ivar'" == "" | "`tvar'" == "" { +di as err "invalid use of dkraay option - must use tsset panel data" + exit 198 + } + local bw "`dkraay'" + if "`cluster'" == "" { + local cluster "`tvar'" + } + else if "`cluster'" ~= "`tvar'" { +di as err "invalid use of dkraay option - must cluster on `tvar' (or omit cluster option)" + exit 198 + } + } + +*********************************************************** + +* HAC estimation. +* If bw is omitted, default `bw' is 0. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. +* If bw or kernel not supplied, set bw=0 so from here on, bw is real. + if "`bw'" == "" & "`kernel'" == "" { + local bw=0 + } + else { +* Check it's a valid kernel and replace with unabbreviated kernel name; check bw. +* s_ivreg210_vkernel is in livreg2 mlib. + mata: s_ivreg210_vkernel("`kernel'", "`bw'", "`ivar'") + local kernel `r(kernel)' + local bw = `r(bw)' +* And force tsused flag to 1 + local tsused = 1 + } + +*********************************************************** + +* Weights +* fweight and aweight accepted as is +* iweight not allowed with robust or gmm and requires a trap below when used with summarize +* pweight is equivalent to aweight + robust +* but in HAC case, robust implied by `kernel' rather than `robust' +* Since we subsequently work with wvar, tsrevar of weight vars in weight `exp' not needed. + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + qui gen double `wvar'=`exp' + } + if "`weight'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "fweight" & "`sw'" != "" { + di in red "fweights currently not supported with -sw- option" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`gmm2s'`kernel'" !="" { + di in red "iweights not allowed with robust or gmm" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + qui gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + qui gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + + if `dofminus' > 0 { + local dofmopt "dofminus(`dofminus')" + } +* Stock-Watson robust SEs. + if "`sw'" ~= "" { + if "`cluster'" ~= "" { +di as err "Stock-Watson robust SEs not supported with -cluster- option" + exit 198 + } + if "`kernel'" ~= "" { +di as err "Stock-Watson robust SEs not supported with -kernel- option" + exit 198 + } + capture xtset + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already tsset or xtset" + exit 5 + } +* Exit with error if ivar is neither supplied nor tsset nor xtset + if "`ivar'"=="" { +di as err "Must -xtset- or -tsset- data or specify -ivar- with -sw- option" + exit 198 + } + qui describe, short varlist + local sortlist "`r(sortlist)'" + tokenize `sortlist' + if "`ivar'"~="`1'" { +di as err "Error - dataset must be sorted on panel var with -sw- option" + exit 198 + } + } + +******************************************************************************** + + marksample touse + markout `touse' `lhs' `inexog' `exexog' `endo' `cluster', strok +* Limit sample to where tvar is available, but only if TS operators used + if `tsused' { + markout `touse' `tvar' + } + +******************************************************************************** + +* Every time a weight is used, must multiply by scalar wf ("weight factor") +* wf=1 for no weights, fw and iw, wf = scalar that normalizes sum to be N if aw or pw + sum `wvar' if `touse' `wtexp', meanonly +* Weight statement + if "`weight'" ~= "" { +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + if "`weight'"=="" | "`weight'"=="fweight" | "`weight'"=="iweight" { +* Effective number of observations is sum of weight variable. +* If weight is "", weight var must be column of ones and N is number of rows + local wf=1 + local N=r(sum_w) + } + else if "`weight'"=="aweight" | "`weight'"=="pweight" { + local wf=r(N)/r(sum_w) + local N=r(N) + } + else { +* Should never reach here +di as err "ivreg2 error - misspecified weights" + exit 198 + } + + if `N'==0 { +di as err "no observations" + exit 2000 + } + +******************************************************************************** +* If kernel-robust, confirm tsset and check for gaps + if `bw' != 0 { +* Data must be tsset for time-series operators in code to work + capture tsset + if "`r(timevar)'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + tsreport if `touse', panel + if `r(N_gaps)' != 0 { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + } + +******************************************************************************** + + tempvar tindex + qui gen `tindex'=1 if `touse' + qui replace `tindex'=sum(`tindex') if `touse' + +* Set local macro T and check that bw < (T-1) +* Also make sure only used sample is checked + if "`tvar'" ~= "" { + sum `tvar' if `touse', meanonly + local T = r(max)-r(min) + 1 + local T1 = `T' - 1 + if (`bw' > (`T1'/`tdelta')) & (`bw' ~= -1) { +di as err "invalid bandwidth in option bw() - cannot exceed timespan of data" + exit 198 + } + } + +* kiefer VCV = kernel(tru) bw(T) and no robust with tsset data + if "`kiefer'" ~= "" { + if "`ivar'" == "" | "`tvar'" == "" { +di as err "invalid use of kiefer option - must use tsset panel data" + exit 198 + } + if "`robust'" ~= "" { +di as err "incompatible options: kiefer and robust" + exit 198 + } + if "`kernel'" ~= "" & "`kernel'" ~= "Truncated" { +di as err "incompatible options: kiefer and bw/kernel" + exit 198 + } + if (`bw'~=0) & (`bw' ~= `T'/`tdelta') { +di as err "incompatible options: kiefer and bw" + exit 198 + } + local kernel "Truncated" + local bw=`T' + } + +*********** Column of ones for constant set up here ************** + + if "`noconstant'"=="" { +* If macro not created, automatically omitted. + tempvar ones + qui gen byte `ones' = 1 if `touse' + } + +************* Duplicates ***************** + + if "`noconstant'" != "" { + local rmcnocons "nocons" + } + +* Check for duplicates of variables +* To mimic official ivreg, in the case of duplicates, +* (1) inexog > endo +* (2) inexog > exexog +* (3) endo + exexog = inexog, as if it were "perfectly predicted" + local dupsen1 : list dups endo + local endo1 : list uniq endo + local dupsex1 : list dups exexog + local exexog1 : list uniq exexog + local dupsin1 : list dups inexog + local inexog1 : list uniq inexog +* Remove inexog from endo + local dupsen2 : list endo1 & inexog1 + local endo1 : list endo1 - inexog1 +* Remove inexog from exexog + local dupsex2 : list exexog1 & inexog1 + local exexog1 : list exexog1 - inexog1 +* Remove endo from exexog + local dupsex3 : list exexog1 & endo1 + local exexog1 : list exexog1 - endo1 + local dups "`dupsen1' `dupsex1' `dupsin1' `dupsen2' `dupsex2' `dupsex3'" + local dups : list uniq dups + + +*********** Collinearities ************************* + +* Also define full set of tempnames for matrices; some used now, some used later + tempname YY yy yyc + tempname XX X1X1 X2X2 X1Z X1Z1 XZ Xy + tempname ZZ Z1Z1 Z2Z2 Z1Z2 Z1X2 Zy ZY Z2y Z2Y + tempname XXinv X2X2inv ZZinv XPZXinv + + if "`nocollin'" == "" { + tempname ccmat + +* Collinearities check using canonical correlations approach +* First, check endo and drop or reclassify as exog regressor + local endo1_ct : word count `endo1' + if `endo1_ct' > 0 { + local Alist "`endo1'" + local Blist "`inexog1' `ones' `exexog1'" + + mata: s_cc_crossprods ("`Alist'", /* + */ "`Blist'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf') + + mat `X1X1'=r(AA) + mat `ZZ'=r(BB) + mat `ZZinv'=r(BBinv) + mat `X1Z'=r(AB) + +* Eigenvalue=1 => included endog is really included exogenous +* Eigenvalue=0 => included endog collinear with other included endog +* Corresponding column names give name of variable + mata: s_cc_collin ( "`ZZ'", /* + */ "`X1X1'", /* + */ "`X1Z'", /* + */ "`ZZinv'") + mat `ccmat'=r(ccmat) + +* Loop through endo1 to find eigenvalues=0 or 1 + local i=1 + foreach vn of varlist `endo1' { + if round(`ccmat'[`i',`i'],10e-7)==0 { +* Collinear with another endog, so remove from endog list + local endo1 : list endo1-vn + local ncollin "`ncollin' `vn'" + } + if round(`ccmat'[`i',`i'],10e-7)==1 { +* Collinear with exogenous, so remove from endog and add to inexog + local endo1 : list endo1-vn + local inexog1 "`inexog1' `vn'" + local ecollin "`ecollin' `vn'" + } + local i=`i'+1 + } + } + +* Check inexog and exexog separately + local inexog1_ct : word count `inexog1' `ones' + if `inexog1_ct' > 1 { + qui _rmcoll `inexog1' if `touse' `wtexp', `noconstant' + local todrop "`r(varlist)'" + local todrop : list inexog1-todrop + local inexog1 "`r(varlist)'" + local collin "`collin' `todrop'" + } + local exexog1_ct : word count `exexog1' + if `exexog1_ct' > 1 { + qui _rmcoll `exexog1' if `touse' `wtexp', nocons + local todrop "`r(varlist)'" + local todrop : list exexog1-todrop + local exexog1 "`r(varlist)'" + local collin "`collin' `todrop'" + } + +* Check exexog vs. inexeg and drop from former if collinear +* Eigenvalue=1 => exexog is collinear with included exogenous + local exexog1_ct : word count `exexog1' + local inexog1_ct : word count `inexog1' `ones' + if `exexog1_ct' > 0 & `inexog1_ct' > 0 { + local Alist "`exexog1'" + local Blist "`inexog1' `ones'" + + mata: s_cc_crossprods ("`Alist'", /* + */ "`Blist'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf') + + mat `Z1Z1'=r(AA) + mat `X2X2'=r(BB) + mat `X2X2inv'=r(BBinv) + mat `Z1X2'=r(AB) + + mata: s_cc_collin ( "`X2X2'", /* + */ "`Z1Z1'", /* + */ "`Z1X2'", /* + */ "`X2X2inv'") + mat `ccmat'=r(ccmat) + +* Loop through exexog1 to find eigenvalues=1 + local i=1 + foreach vn of varlist `exexog1' { + if round(`ccmat'[`i',`i'],10e-7)==1 { +* Excluded exog collinear with included exog, so remove from exexog list + local exexog1 : list exexog1-vn + local collin "`collin' `vn'" + } + local i=`i'+1 + } + } + +* Some collinearities involving inexog/exog wont' be caught by method above, +* so call _rmcoll to catch any remaining ones. + capture _rmcoll `inexog1' `exexog1' if `touse' `wtexp', `rmcnocons' + if _rc == 908 { +di as err "matsize too small" + exit 908 + } + if r(k_omitted) > 0 { + local allinex "`inexog1' `exexog1'" + local noncollin "`r(varlist)'" + local inexcollin : list allinex - noncollin + local inexog1 : list inexog1 - inexcollin + local exexog1 : list exexog1 - inexcollin + local collin "`collin' `inexcollin'" + } + +* Finally, add dropped endogenous to collinear list, trimming down to "" if empty + local collin "`collin' `ncollin'" + local collin : list clean collin + +* Collinearity and duplicates warning messages, if necessary + if "`dups'" != "" { +di in gr "Warning - duplicate variables detected" +di in gr "Duplicates:" _c + Disp `dups', _col(21) + } + if "`ecollin'" != "" { +di in gr "Warning - endogenous variable(s) collinear with instruments" +di in gr "Vars now exogenous:" _c + Disp `ecollin', _col(21) + } + if "`collin'" != "" { +di in gr "Warning - collinearities detected" +di in gr "Vars dropped:" _c + Disp `collin', _col(21) + } + } + + +**** End of collinearities block ************ + +**** Partial-out block ****************** + +* `partial' has all to be partialled out except for constant + if "`partial'" != "" | `partialcons'==1 { + preserve + local partialdrop : list inexog - inexog1 + local partial1 : list partial - partialdrop + local partialcheck : list partial1 - inexog1 + if ("`partialcheck'"~="") { +di in r "Error: `partialcheck' listed in partial() but not in list of regressors." + error 198 + } + local inexog1 : list inexog1 - partial1 +* Check that cluster, weight, tvar or ivar variables won't be transformed + local allvars "`lhs' `inexog' `endo' `exexog'" + if "`cluster'"~="" { + local pvarcheck : list cluster in allvars + if `pvarcheck' { +di in r "Error: cannot use cluster variable `cluster' as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } + if "`tvar'"~="" { + local pvarcheck : list tvar in allvars + if `pvarcheck' { +di in r "Error: cannot use time variable `tvar' as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } + if "`ivar'"~="" { + local pvarcheck : list ivar in allvars + if `pvarcheck' { +di in r "Error: cannot use panel variable `ivar' as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } + if "`wtexp'"~="" { + tokenize `exp', parse("*/()+-^&|~") + local wvartokens `*' + local nwvarnames : list allvars - wvartokens + local wvarnames : list allvars - nwvarnames + if "`wvarnames'"~="" { +di in r "Error: cannot use weight variables as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } +* Constant is partialled out, unless nocons already specified in the first place + capture drop `ones' + local ones "" + tempname partial_resid + foreach var of varlist `lhs' `inexog1' `endo1' `exexog1' { + qui regress `var' `partial1' if `touse' `wtexp', `noconstant' + qui predict double `partial_resid' if `touse', resid + qui replace `var' = `partial_resid' + drop `partial_resid' + } + local partial_ct : word count `partial1' + if "`noconstant'" == "" { +* partial_ct used for small-sample adjustment to regression F-stat + local partial_ct = `partial_ct' + 1 + local noconstant "noconstant" + } + } + else { +* Set count of partial vars to zero if option not used + local partial_ct 0 + local partialcons 0 + } +* Add partial_ct to small dof adjustment sdofminus + if "`nopartialsmall'"=="" { + local sdofminus = `sdofminus'+`partial_ct' + } + +********************************************* + + local insts1 `inexog1' `exexog1' + local rhs1 `endo1' `inexog1' + local iv1_ct : word count `insts1' + local rhs1_ct : word count `rhs1' + local endo1_ct : word count `endo1' + local exex1_ct : word count `exexog1' + local endoexex1_ct : word count `endo1' `exexog1' + local inexog1_ct : word count `inexog1' + + if "`noconstant'" == "" { + local cons 1 + } + else { + local cons 0 + } + +* Counts modified to include constant if appropriate + local iv1_ct = `iv1_ct' + `cons' + local rhs1_ct = `rhs1_ct' + `cons' + + if `rhs1_ct' == 0 { + di in red "error: no regressors specified" + exit 102 + } + + if "`nocollin'" == "" { +* If collinearity check has been done, iv_ct=iv1_ct and rhs_ct=rhs1_ct + local iv_ct = `iv1_ct' + local rhs_ct = `rhs1_ct' + } + else { +* If no full collinearity check, still need to do careful count of Xs and Zs. + qui _rmcoll `endo1' `inexog1', `noconstant' + local rhs_ct : word count `r(varlist)' + qui _rmcoll `exexog1' `inexog1', `noconstant' + local iv_ct : word count `r(varlist)' + local iv_ct = `iv_ct' + `cons' + local rhs_ct = `rhs_ct' + `cons' + } + + if `rhs1_ct' > `iv1_ct' { + di in red "equation not identified; must have at " /* + */ "least as many instruments not in" + di in red "the regression as there are " /* + */ "instrumented variables" + exit 481 + } + + if `bw' != 0 { + local bwopt "bw(`bw')" + } + if "`kernel'"!="" { + local kernopt "kernel(`kernel')" + } +* If depname not provided (default) name is lhs variable + if "`depname'"=="" { + local depname `lhs' + } + +*************** Commonly used matrices (reprise) ************ + + mata: s_crossprods ("`lhs'", /* + */ "`endo1'", /* + */ "`inexog1' `ones'", /* + */ "`exexog1'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N') + mat `XX'=r(XX) + mat `X1X1'=r(X1X1) + mat `X1Z'=r(X1Z) + mat `ZZ'=r(ZZ) + mat `Z2Z2'=r(Z2Z2) + mat `Z1Z2'=r(Z1Z2) + mat `XZ'=r(XZ) + mat `Xy'=r(Xy) + mat `Zy'=r(Zy) + mat `YY'=r(YY) + scalar `yy'=r(yy) + scalar `yyc'=r(yyc) + mat `ZY'=r(ZY) + mat `Z2y'=r(Z2y) + mat `Z2Y'=r(Z2Y) + mat `XXinv'=r(XXinv) + mat `ZZinv'=r(ZZinv) + mat `XPZXinv'=r(XPZXinv) + + +********** CLUSTER SETUP ********************************************** + +* Mata code requires data are sorted on (1) the first var cluster if there +* is only one cluster var; (2) on the 3rd and then 1st if two-way clustering, +* unless (3) two-way clustering is combined with kernel option, in which case +* the data are tsset and sorted on panel id (first cluster variable) and time +* id (second cluster variable). +* Second cluster var is optional and requires an identifier numbered 1..N_clust2, +* unless combined with kernel option, in which case it's the time variable. +* Third cluster var is the intersection of 1 and 2, unless combined with kernel +* opt, in which case it's unnecessary. +* Sorting on "cluster3 cluster1" means that in Mata, panelsetup works for +* both, since cluster1 nests cluster3. +* Note that it is possible to cluster on time but not panel, in which case +* cluster1 is time, cluster2 is empty and data are sorted on panel-time. +* Note also that if data are sorted here but happen to be tsset, will need +* to be re-tsset after estimation code concludes. + + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`kernel'"~="" { +* kernel requires either that cluster1 is time var and cluster2 is empty +* or that cluster1 is panel var and cluster2 is time var. +* Either way, data must be tsset and sorted for panel data. + if "`cluster2'"~="" { +* Allow backwards order + if "`cluster1'"=="`tvar'" & "`cluster2'"=="`ivar'" { + local cluster1 "`2'" + local cluster2 "`1'" + } + if "`cluster1'"~="`ivar'" | "`cluster2'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset panel & time vars." +di as err " tsset panel var=`ivar'; tsset time var=`tvar'; cluster vars=`cluster1',`cluster2'" + exit 198 + } + } + else { + if "`cluster1'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset time variable." +di as err " tsset time var=`tvar'; cluster var=`cluster1'" + exit 198 + } + } + } +* Simple way to get quick count of 1st cluster variable without disrupting sort +* clusterid1 is numbered 1.._Nclust1. + tempvar clusterid1 + qui egen `clusterid1'=group(`cluster1') if `touse' + sum `clusterid1' if `touse', meanonly + if "`cluster2'"=="" { + local N_clust=r(max) + local N_clust1=. + local N_clust2=. + if "`kernel'"=="" { +* Single level of clustering and no kernel-robust, so sort on single cluster var. +* kernel-robust already sorted via tsset. + sort `cluster1' + } + } + else { + local N_clust1=r(max) + if "`kernel'"=="" { + tempvar clusterid2 clusterid3 +* New cluster id vars are numbered 1..N_clust2 and 1..N_clust3 + qui egen `clusterid2'=group(`cluster2') if `touse' + qui egen `clusterid3'=group(`cluster1' `cluster2') if `touse' +* Two levels of clustering and no kernel-robust, so sort on cluster3/nested in/cluster1 +* kernel-robust already sorted via tsset. + sort `clusterid3' `cluster1' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) + } + else { +* Need to create this only to count the number of clusters + tempvar clusterid2 + qui egen `clusterid2'=group(`cluster2') if `touse' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) +* Now replace with original variable + local clusterid2 `cluster2' + } + local N_clust=min(`N_clust1',`N_clust2') + } + } + else { +* No cluster options but for Mata purposes, set N_clust=0 + local N_clust=0 + } + +************************************************************************************************ + + tempname b W S V beta lambda j jp rss mss rmse sigmasq rankV rankS + tempname arubin arubinp arubin_lin arubin_linp + tempname r2 r2_a r2u r2c F Fp Fdf2 ivest + + local cnb "`endo1' `inexog1'" + local cnZ "`exexog1' `inexog1'" + if "`noconstant'"=="" { + local cnb "`cnb' _cons" + local cnZ "`cnZ' _cons" + } + + tempvar resid + qui gen double `resid'=. + +******************************************************************************************* +* LIML +******************************************************************************************* + + if "`liml'`kclassopt'"~="" { + + mata: s_liml( "`ZZ'", /* + */ "`XX'", /* + */ "`XZ'", /* + */ "`Zy'", /* + */ "`Z2Z2'", /* + */ "`YY'", /* + */ "`ZY'", /* + */ "`Z2Y'", /* + */ "`Xy'", /* + */ "`ZZinv'", /* + */ "`lhs'", /* + */ "`lhs' `endo1'", /* + */ "`resid'", /* + */ "`endo1' `inexog1' `ones'", /* + */ "`endo1'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`exexog1'", /* + */ "`inexog1' `ones'", /* + */ `fuller', /* + */ `kclass', /* + */ "`coviv'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`ivar'", /* + */ "`tvar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ `dofminus') + + mat `b'=r(beta) + mat `S'=r(S) + mat `V'=r(V) + scalar `lambda'=r(lambda) + local kclass=r(kclass) + scalar `j'=r(j) + scalar `rss'=r(rss) + scalar `sigmasq'=r(sigmasq) + + scalar `arubin'=(`N'-`dofminus')*ln(`lambda') + scalar `arubin_lin'=(`N'-`dofminus')*(`lambda'-1) + + } + +******************************************************************************************* +* OLS, IV and 2SGMM. Also enter to get CUE starting values. +************************************************************************************************ + if "`liml'`kclassopt'`b0'"=="" { +* Check user-supplied S matrix + if "`smatrix'" != "" { + tempname S0 + matrix `S0'=`smatrix' +* Rearrange/select columns to mat IV matrix + capture matsort `S0' "`cnZ'" + local srows = rowsof(`S0') + local scols = colsof(`S0') + local zcols : word count `cnZ' + if _rc ~= 0 | (`srows'~=`zcols') | (`scols'~=`zcols') { +di as err "-smatrix- option error: supplied matrix columns/rows do not match IV list" +exit 198 + } + if issymmetric(`S0')==0 { +di as err "-smatrix- option error: supplied matrix is not symmetric" +exit 198 + } + } + +* First call to s_gmm. +* If W or S supplied, calculates GMM beta and residuals +* If b0 supplied, calculates residuals +* If none of the above supplied, calculates GMM beta using default IV weighting matrix and residuals + + mata: s_gmm1s( "`ZZ'", /* + */ "`XX'", /* + */ "`XZ'", /* + */ "`Zy'", /* + */ "`ZZinv'", /* + */ "`lhs'", /* + */ "`resid'", /* + */ "`endo1' `inexog1' `ones'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`wmatrix'", /* + */ "`S0'", /* + */ `dofminus') + + mat `b'=r(beta) + mat `W'=r(W) + +* Block calls s_omega to get cov matrix of orthog conditions, if not supplied + if "`smatrix'"~="" { + mat `S'=`S0' + } + else { + +* NB: xtivreg2 calls ivreg2 with data sorted on ivar and optionally tvar. +* Stock-Watson adjustment -sw- assumes data are sorted on ivar. Checked at start of ivreg2. + +* call abw code if bw() is defined and bw(auto) selected + if `bw' != 0 { + if `bw' == -1 { + tempvar abwtouse + gen byte `abwtouse' = (`resid' < .) + abw `resid' `exexog1' `inexog1' `abwtouse', /* + */ tindex(`tindex') nobs(`N') tobs(`T') noconstant kernel(`kernel') + local bw `r(abw)' + local bwopt "bw(`bw')" + local bwchoice "`r(bwchoice)'" + } + } +* S covariance matrix of orthogonality conditions +// cfb B102 +// loc klc = cond("`kernel'" == "Quadratic-Spectral", "Quadratic spectral", "`kernel'") + mata: s_omega( "`ZZ'", /* + */ "`resid'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`ivar'", /* + */ "`tvar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ `dofminus') + mat `S'=r(S) + } + +* By this point: `b' has 1st step beta +* `resid' has resids from the above beta +* `S' has vcv of orthog conditions using either `resid' or user-supplied `S0' + +* Efficient IV. S calculated above. W replaced here. + if "`gmm2s'`robust'`cluster'`kernel'"=="" { + mata: s_egmm( "`ZZ'", /* + */ "`XX'", /* + */ "`XZ'", /* + */ "`Zy'", /* + */ "`ZZinv'", /* + */ "`lhs'", /* + */ "`resid'", /* + */ "`endo1' `inexog1' `ones'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`S'", /* + */ `dofminus') + mat `W'=r(W) + } + +* Inefficient IV. S, W and b calculated above. + if "`gmm2s'"=="" & "`robust'`cluster'`kernel'"~="" { + mata: s_iegmm( "`ZZ'", /* + */ "`XX'", /* + */ "`XZ'", /* + */ "`Zy'", /* + */ "`lhs'", /* + */ "`resid'", /* + */ "`endo1' `inexog1' `ones'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`W'", /* + */ "`S'", /* + */ "`b'", /* + */ `dofminus') + } +* 2-step efficient GMM. S calculated above, b and W are empty. + if "`gmm2s'"~="" { + mata: s_egmm( "`ZZ'", /* + */ "`XX'", /* + */ "`XZ'", /* + */ "`Zy'", /* + */ "`ZZinv'", /* + */ "`lhs'", /* + */ "`resid'", /* + */ "`endo1' `inexog1' `ones'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`S'", /* + */ `dofminus') + mat `b'=r(beta) + mat `W'=r(W) + } + + mat `V'=r(V) + scalar `j'=r(j) + scalar `rss'=r(rss) + scalar `sigmasq'=r(sigmasq) + +* Finished with non-CUE/LIML block + } +*************************************************************************************** +* Block for cue gmm +******************************************************************************************* + if "`cue'`b0'" != "" { + +* s_gmmcue is passed initial b from IV/2-step GMM block above +* OR user-supplied b0 for evaluation of CUE obj function at b0 + mata: s_gmmcue( "`ZZ'", /* + */ "`XZ'", /* + */ "`lhs'", /* + */ "`resid'", /* + */ "`endo1' `inexog1' `ones'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`ivar'", /* + */ "`tvar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ "`b'", /* + */ "`b0'", /* + */ `dofminus') + + mat `b'=r(beta) + mat `S'=r(S) + mat `W'=r(W) + mat `V'=r(V) + scalar `j'=r(j) + scalar `rss'=r(rss) + scalar `sigmasq'=r(sigmasq) + + } + +**************************************************************** +* Done with estimation blocks +**************************************************************** + + mat colnames `b' = `cnb' + mat colnames `V' = `cnb' + mat rownames `V' = `cnb' + mat colnames `S' = `cnZ' + mat rownames `S' = `cnZ' +* No W matrix for LIML or kclass + capture mat colnames `W' = `cnZ' + capture mat rownames `W' = `cnZ' + tempname tempmat + mat `tempmat'=syminv(`V') + scalar `rankV'=rowsof(`tempmat') - diag0cnt(`tempmat') + mat `tempmat'=syminv(`S') + scalar `rankS'=rowsof(`tempmat') - diag0cnt(`tempmat') + +******************************************************************************************* +* RSS, counts, dofs, F-stat, small-sample corrections +******************************************************************************************* + + scalar `rmse'=sqrt(`sigmasq') + if "`noconstant'"=="" { + scalar `mss'=`yyc' - `rss' + } + else { + scalar `mss'=`yy' - `rss' + } + + local Fdf1 = `rhs_ct' - `cons' + local df_m = `rhs_ct' - `cons' + (`sdofminus'-`partialcons') + +* Residual dof + if "`cluster'"=="" { +* Use int(`N') because of non-integer N with iweights, and also because of +* possible numeric imprecision with N returned by above. + local df_r = int(`N') - `rhs_ct' - `dofminus' - `sdofminus' + } + else { +* To match Stata, subtract 1 + local df_r = `N_clust' - 1 + } + +* Sargan-Hansen J dof and p-value +* df=0 doesn't guarantee j=0 since can be call to get value of CUE obj fn + local jdf = `iv_ct' - `rhs_ct' + if `jdf' == 0 & "`b0'"=="" { + scalar `j' = 0 + } + else { + scalar `jp' = chiprob(`jdf',`j') + } + if "`liml'"~="" { + scalar `arubinp' = chiprob(`jdf',`arubin') + scalar `arubin_linp' = chiprob(`jdf',`arubin_lin') + } + +* Small sample corrections for var-cov matrix. +* If robust, the finite sample correction is N/(N-K), and with no small +* we change this to 1 (a la Davidson & MacKinnon 1993, p. 554, HC0). +* If cluster, the finite sample correction is (N-1)/(N-K)*M/(M-1), and with no small +* we change this to 1 (a la Wooldridge 2002, p. 193), where M=number of clusters. + + if "`small'" != "" { + if "`cluster'"=="" { + matrix `V'=`V'*(`N'-`dofminus')/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + } + else { + matrix `V'=`V'*(`N'-1)/(`N'-`rhs_ct'-`sdofminus') /* + */ * `N_clust'/(`N_clust'-1) + } + scalar `sigmasq'=`rss'/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + scalar `rmse'=sqrt(`sigmasq') + } + + scalar `r2u'=1-`rss'/`yy' + scalar `r2c'=1-`rss'/`yyc' + if "`noconstant'"=="" { + scalar `r2'=`r2c' + scalar `r2_a'=1-(1-`r2')*(`N'-1)/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + } + else { + scalar `r2'=`r2u' + scalar `r2_a'=1-(1-`r2')*`N'/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + } +* `N' is rounded down to nearest integer if iweights are used. +* If aw, pw or fw, should already be integer but use round in case of numerical imprecision. + local N=int(`N') + +* Fstat +* To get it to match Stata's, must post separately with dofs and then do F stat by hand +* in case weights generate non-integer obs and dofs +* Create copies so they can be posted + tempname FB FV + mat `FB'=`b' + mat `FV'=`V' + capture ereturn post `FB' `FV' +* If the cov matrix wasn't positive definite, the post fails with error code 506 + local rc = _rc + if `rc' != 506 { + local Frhs1 `rhs1' + capture test `Frhs1' + if "`small'" == "" { + if "`cluster'"=="" { + capture scalar `F' = r(chi2)/`Fdf1' * `df_r'/(`N'-`dofminus') + } + else { + capture scalar `F' = r(chi2)/`Fdf1' * /* +* sdofminus used here so that F-stat matches test stat from regression with no partial and small + */ (`N_clust'-1)/`N_clust' * (`N'-`rhs_ct'-`sdofminus')/(`N'-1) + } + } + else { + capture scalar `F' = r(chi2)/`Fdf1' + } + capture scalar `Fp'=Ftail(`Fdf1',`df_r',`F') + capture scalar `Fdf2'=`df_r' + } + +* If j==. or vcv wasn't full rank, then vcv problems and F is meaningless + if `j' == . | `rc'==506 { + scalar `F' = . + scalar `Fp' = . + } + +* End of counts, dofs, F-stat, small sample corrections + +******************************************************************************************** +* Reduced form and first stage regression options +******************************************************************************************* +* Relies on proper count of (non-collinear) IVs generated earlier. +* Note that nocons option + constant in instrument list means first-stage +* regressions are reported with nocons option. First-stage F-stat therefore +* correctly includes the constant as an explanatory variable. + + if "`rf'`saverf'`first'`ffirst'`savefirst'" != "" & (`endo1_ct' > 0) & "`noid'"=="" { +* Restore original order if changed for mata code above + capture tsset +* Reduced form needed for AR first-stage test stat. Also estimated if requested. + tempname archi2 archi2p arf arfp ardf ardf_r sstat sstatp sstatdf + doRF "`lhs'" "`inexog1'" "`exexog1'" /* + */ `touse' `"`wtexp'"' `"`noconstant'"' `"`robust'"' /* + */ `"`clopt'"' `"`bwopt'"' `"`kernopt'"' /* + */ `"`saverfprefix'"' /* + */ "`dofminus'" "`sdofminus'" `"`sw'"' `"`psd'"' "`ivreg2_cmd'" + scalar `archi2'=r(archi2) + scalar `archi2p'=r(archi2p) + scalar `arf'=r(arf) + scalar `arfp'=r(arfp) + scalar `ardf'=r(ardf) + scalar `ardf_r'=r(ardf_r) + local rfeq "`r(rfeq)'" +* Drop saved rf results if needed only for first-stage estimations + if "`rf'`saverf'" == "" { + capture estimates drop `rfeq' + } +* Stock-Wright S statistic. Equiv to J LM test of exexog. +* Note that Z2==X2 so Z2Z2 is X2X2 and Z2y is X2y + tempname swresid + qui gen double `swresid'=. + +* mata code requires sorting on cluster 3 / cluster 1 (if 2-way) or cluster 1 (if one-way) + if "`cluster'"!="" { + sort `clusterid3' `cluster1' + } + mata: s_sstat( "`Z2Z2'", /* + */ "`Z1Z2'", /* + */ "`Z2y'", /* + */ "`lhs'", /* + */ "`swresid'", /* + */ "`inexog1' `ones'", /* + */ "`exexog1' `inexog1' `ones'", /* + */ "`exexog1'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`ivar'", /* + */ "`tvar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ `dofminus' /* + */ ) + + scalar `sstat'=r(j) + scalar `sstatdf'=`ardf' + scalar `sstatp'=chiprob(`sstatdf',`sstat') + } + + if "`first'`ffirst'`savefirst'" != "" & (`endo1_ct' > 0) { +* Restore original order if changed for mata code above + capture tsset + + if `iv1_ct' > `iv_ct' { +di +di in gr "Warning: collinearities detected among instruments" +di in gr "1st stage tests of excluded exogenous variables may be incorrect" + } + local sdofmopt = "sdofminus(`sdofminus')" + if "`first'`savefirst'" ~= "" { + doFirst "`endo1'" "`inexog1'" "`exexog1'" /* + */ `touse' `"`wtexp'"' `"`noconstant'"' `"`robust'"' /* + */ `"`clopt'"' `"`bwopt'"' `"`kernopt'"' /* + */ `"`savefprefix'"' `"`dofmopt'"' `"`sdofmopt'"' /* + */ `"`sw'"' `"`psd'"' "`ivreg2_cmd'" + local firsteqs "`r(firsteqs)'" + } + +* Need to create Stata placeholders for Mata code so that Stata time-series operators can work on them + tempname firstmat + tempname fsresid + qui gen double `fsresid'=. + tsrevar `endo1' + local ts_endo1 "`r(varlist)'" + foreach x of local ts_endo1 { + tempname `x'_hat + qui gen double ``x'_hat' = . + local endo1_hat "`endo1_hat' ``x'_hat'" + } + +* mata code requires sorting on cluster 3 / cluster 1 (if 2-way) or cluster 1 (if one-way) + if "`cluster'"!="" { + sort `clusterid3' `cluster1' + } + mata: s_ffirst( "`ZZ'", /* + */ "`XX'", /* + */ "`XZ'", /* + */ "`ZZinv'", /* + */ "`XXinv'", /* + */ "`XPZXinv'", /* + */ "`fsresid'", /* + */ "`endo1'", /* + */ "`endo1_hat'", /* + */ "`inexog1' `ones'", /* + */ "`exexog1'", /* + */ "`touse'", /* + */ "`weight'", /* + */ "`wvar'", /* + */ `wf', /* + */ `N', /* + */ `N_clust', /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`ivar'", /* + */ "`tvar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ `dofminus', /* + */ `sdofminus') + + mat `firstmat' = r(firstmat) + mat rowname `firstmat' = sheapr2 pr2 F df df_r pvalue APF APFdf1 APFdf2 APFp APchi2 APchi2p APr2 + mat colname `firstmat' = `endo1' + + } +* End of first-stage regression code + +******************************************************************************************* +* Re-tsset if necessary +************************************************************************************************ + + capture tsset + +******************************************************************************************* +* orthog option: C statistic (difference of Sargan statistics) +******************************************************************************************* +* Requires j dof from above + if "`orthog'"!="" { + tempname cj cstat cstatp +* Initialize cstat + scalar `cstat' = 0 +* Each variable listed must be in instrument list. +* To avoid overwriting, use cendo, cinexog1, cexexog, cendo_ct, cex_ct + local cendo1 "`endo1'" + local cinexog1 "`inexog1'" + local cexexog1 "`exexog1'" + local cinsts1 "`insts1'" + local crhs1 "`rhs1'" + local clist1 "`orthog'" + local clist_ct : word count `clist1' + +* Check to see if c-stat vars are in original list of all ivs +* cinexog1 and cexexog1 are after c-stat exog list vars have been removed +* cendo1 is endo1 after included exog being tested has been added + foreach x of local clist1 { + local llex_ct : word count `cexexog1' + local cexexog1 : list cexexog1 - x + local cex1_ct : word count `cexexog1' + local ok = `llex_ct' - `cex1_ct' + if (`ok'==0) { +* Not in excluded, check included and add to endog list if it appears + local llin_ct : word count `cinexog1' + local cinexog1 : list cinexog1 - x + local cin1_ct : word count `cinexog1' + local ok = `llin_ct' - `cin1_ct' + if (`ok'==0) { +* Not in either list +di in r "Error: `x' listed in orthog() but does not appear as exogenous." + error 198 + } + else { + local cendo1 "`cendo1' `x'" + } + } + } + +* If robust, HAC/AC or GMM (but not LIML or IV), create optimal weighting matrix to pass to ivreg2 +* by extracting the submatrix from the full S and then inverting. +* This guarantees the C stat will be non-negative. See Hayashi (2000), p. 220. +* Calculate C statistic with recursive call to ivreg2 +* Collinearities may cause problems, hence -capture-. +* smatrix works generally, including homoskedastic case with Sargan stat + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + if "`kernel'" != "" { + local bwopt "bw(`bw')" + local kernopt "kernel(`kernel')" + } +* clopt is omitted because it requires calculation of numbers of clusters, which is done +* only when S matrix is calculated + capture `ivreg2_cmd' `lhs' `cinexog1' /* + */ (`cendo1'=`cexexog1') /* + */ if `touse' `wtexp', `noconstant' /* + */ `options' `small' `robust' /* + */ `gmm2s' `bwopt' `kernopt' `dofmopt' `sw' `psd' /* + */ smatrix("`S'") noid nocollin + local rc = _rc + if `rc' == 481 { + scalar `cstat' = 0 + local cstatdf = 0 + } + else { + scalar `cj'=e(j) + local cjdf=e(jdf) + scalar `cstat' = `j' - `cj' + local cstatdf = `jdf' - `cjdf' + } + _estimates unhold `ivest' + scalar `cstatp'= chiprob(`cstatdf',`cstat') +* Collinearities may cause C-stat dof to differ from the number of variables in orthog() +* If so, set cstat=0 + if `cstatdf' != `clist_ct' { + scalar `cstat' = 0 + } + } +* End of orthog block + +******************************************************************************************* +* Endog option +******************************************************************************************* +* Uses recursive call with orthog + if "`endogtest'"!="" { + tempname estat estatp +* Initialize estat + scalar `estat' = 0 +* Each variable to test must be in endo list. +* To avoid overwriting, use eendo, einexog1, etc. + local eendo1 "`endo1'" + local einexog1 "`inexog1'" + local einsts1 "`insts1'" + local elist1 "`endogtest'" + local elist_ct : word count `elist1' +* Check to see if endog test vars are in original endo1 list of endogeneous variables +* eendo1 and einexog1 are after endog test vars have been removed from endo and added to inexog + foreach x of local elist1 { + local llendo_ct : word count `eendo1' + local eendo1 : list eendo1 - x + local eendo1_ct : word count `eendo1' + local ok = `llendo_ct' - `eendo1_ct' + if (`ok'==0) { +* Not in endogenous list +di in r "Error: `x' listed in endog() but does not appear as endogenous." + error 198 + } + else { + local einexog1 "`einexog1' `x'" + } + } +* Recursive call to ivreg2 using orthog option to obtain endogeneity test statistic +* Collinearities may cause problems, hence -capture-. + capture { + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + capture `ivreg2_cmd' `lhs' `einexog1' /* + */ (`eendo1'=`exexog1') if `touse' /* + */ `wtexp', `noconstant' `robust' `clopt' /* + */ `gmm2s' `liml' `bwopt' `kernopt' /* + */ `small' `dofmopt' `sw' `psd' `options' /* + */ orthog(`elist1') noid nocollin + local rc = _rc + if `rc' == 481 { + scalar `estat' = 0 + local estatdf = 0 + } + else { + scalar `estat'=e(cstat) + local estatdf=e(cstatdf) + scalar `estatp'=e(cstatp) + } + _estimates unhold `ivest' +* Collinearities may cause endog stat dof to differ from the number of variables in endog() +* If so, set estat=0 + if `estatdf' != `elist_ct' { + scalar `estat' = 0 + } + } +* End of endogeneity test block + } + +******************************************************************************************* +* Rank identification and redundancy block +******************************************************************************************* + if `endo1_ct' > 0 & "`noid'"=="" { + +* id=underidentification statistic, wid=weak identification statistic + tempname idrkstat widrkstat iddf idp + tempname ccf cdf rkf cceval cdeval cd cc + tempname idstat widstat + +* Anderson canon corr underidentification statistic if homo, rk stat if not +* Need only id stat for testing full rank=(#cols-1) + qui `ranktest_cmd' (`endo1') (`exexog1') `wtexp' if `touse', partial(`inexog1') full /* + */ `noconstant' `robust' `clopt' `bwopt' `kernopt' + if "`cluster'"=="" { + scalar `idstat'=r(chi2)/r(N)*(`N'-`dofminus') + } + else { +* No dofminus adjustment needed for cluster-robust + scalar `idstat'=r(chi2) + } + mat `cceval'=r(ccorr) + mat `cdeval' = J(1,`endo1_ct',.) + forval i=1/`endo1_ct' { + mat `cceval'[1,`i'] = (`cceval'[1,`i'])^2 + mat `cdeval'[1,`i'] = `cceval'[1,`i'] / (1 - `cceval'[1,`i']) + } + local iddf = `iv_ct' - (`rhs_ct'-1) + scalar `idp' = chiprob(`iddf',`idstat') +* Cragg-Donald F statistic. +* Under homoskedasticity, Wald cd eigenvalue = cc/(1-cc) Anderson canon corr eigenvalue. + scalar `cd'=`cdeval'[1,`endo1_ct'] + scalar `cdf'=`cd'*(`N'-`sdofminus'-`iv_ct'-`dofminus')/`exex1_ct' + +* Weak id statistic is Cragg-Donald F stat, rk Wald F stat if not + if "`robust'`cluster'`kernel'"=="" { + scalar `widstat'=`cdf' + } + else { +* Need only test of full rank + qui `ranktest_cmd' (`endo1') (`exexog1') `wtexp' if `touse', partial(`inexog1') full wald /* + */ `noconstant' `robust' `clopt' `bwopt' `kernopt' +* sdofminus used here so that F-stat matches test stat from regression with no partial + if "`cluster'"=="" { + scalar `rkf'=r(chi2)/r(N)*(`N'-`iv_ct'-`sdofminus'-`dofminus')/`exex1_ct' + } + else { + scalar `rkf'=r(chi2)/(`N'-1) /* + */ *(`N'-`iv_ct'-`sdofminus') /* + */ *(`N_clust'-1)/`N_clust' /`exex1_ct' + } + scalar `widstat'=`rkf' + } + } + +* LM redundancy test + if `endo1_ct' > 0 & "`redundant'" ~= "" & "`noid'"=="" { +* Use K-P rk statistics and LM version of test +* Statistic is the rank of the matrix of Z_1B*X_2, where Z_1B are the possibly redundant +* instruments and X_1 are the endogenous regressors; both have X_2 (exogenous regressors) +* and Z_1A (maintained excluded instruments) partialled out. LM test of rank is +* is numerically equivalent to estimation of set of RF regressions and performing +* standard LM test of possibly redundant instruments. + + local redlist1 "`redundant'" + local rexexog1 : list exexog1 - redlist1 + local notlisted : list redlist1 - exexog1 + if "`notlisted'" ~= "" { +di in r "Error: `notlisted' listed in redundant() but does not appear as excluded instrument." + error 198 + } + local rexexog1_ct : word count `rexexog1' + if `rexexog1_ct' < `endo1_ct' { +di in r "Error: specification with redundant() option is unidentified (fails rank condition)" + error 198 + } +* LM version requires only -nullrank- rk statistics so would not need -all- option + tempname rkmatrix + qui `ranktest_cmd' (`endo1') (`redlist1') `wtexp' if `touse', partial(`inexog1' `rexexog1') null /* + */ `noconstant' `robust' `clopt' `bwopt' `kernopt' + mat `rkmatrix'=r(rkmatrix) + tempname redstat redp + local redlist_ct : word count `redlist1' +* dof adjustment needed because it doesn't use the adjusted S + if "`cluster'"=="" { + scalar `redstat' = `rkmatrix'[1,1]/r(N)*(`N'-`dofminus') + } + else { +* No dofminus adjustment needed for cluster-robust + scalar `redstat' = `rkmatrix'[1,1] + } + local reddf = `endo1_ct'*`redlist_ct' + scalar `redp' = chiprob(`reddf',`redstat') + } + +* End of identification stats block + +******************************************************************************************* +* Error-checking block +******************************************************************************************* + +* Check if adequate number of observations + if `N' <= `iv_ct' { +di in r "Error: number of observations must be greater than number of instruments" +di in r " including constant." + error 2001 + } + +* Check if robust VCV matrix is of full rank + if ("`gmm2s'`robust'`cluster'`kernel'" != "") & (`rankS' < `iv_ct') { +* Robust covariance matrix not of full rank means either a singleton dummy or too few +* clusters (in which case the indiv SEs are OK but no F stat or 2-step GMM is possible), +* or there are too many AC/HAC-lags, or the HAC covariance estimator +* isn't positive definite (possible with truncated and Tukey-Hanning kernels) +* Previous versions of ivreg2 exited if 2-step GMM but beta and VCV may be OK. +* Continue but J, F, and C stat (if present) all meaningless. +* Must set Sargan-Hansen j = missing so that problem can be reported in output. + scalar `j' = . + if "`orthog'"!="" { + scalar `cstat' = . + } + if "`endogtest'"!="" { + scalar `estat' = . + } + } + +* End of error-checking block + +********************************************************************************************** +* Post and display results. +******************************************************************************************* + +* restore data if preserved for partial option + if `partial_ct' { + restore + } + + if "`small'"!="" { + local NminusK = `N'-`rhs_ct'-`sdofminus' + capture ereturn post `b' `V', dep(`depname') obs(`N') esample(`touse') /* + */ dof(`NminusK') + } + else { + capture ereturn post `b' `V', dep(`depname') obs(`N') esample(`touse') + } + local rc = _rc + if `rc' == 504 { +di in red "Error: estimated variance-covariance matrix has missing values" + exit 504 + } + if `rc' == 506 { +di in red "Error: estimated variance-covariance matrix not positive-definite" + exit 506 + } + if `rc' > 0 { +di in red "Error: estimation failed - could not post estimation results" + exit `rc' + } + + ereturn local instd `endo' + local insts : colnames `S' +* Stata convention is to exclude constant from instrument list +* Need word option so that varnames with "_cons" in them aren't zapped + local insts : subinstr local insts "_cons" "", word + ereturn local insts `insts' + ereturn local inexog `inexog' + ereturn local exexog `exexog' + ereturn local partial `partial' + ereturn scalar inexog_ct=`inexog1_ct' + ereturn scalar exexog_ct=`exex1_ct' + ereturn scalar endog_ct =`endo1_ct' + ereturn scalar partial_ct =`partial_ct' + if "`collin'`ecollin'`dups'" != "" | `partial_ct' > 0 { + ereturn local collin `collin' + ereturn local ecollin `ecollin' + ereturn local dups `dups' + ereturn local instd1 `endo1' + ereturn local inexog1 `inexog1' + ereturn local exexog1 `exexog1' + ereturn local partial1 `partial1' + } + + if "`smatrix'" == "" { + ereturn matrix S `S' + } + else { +* Create a copy so posting doesn't zap the original + tempname Scopy + mat `Scopy'=`smatrix' + ereturn matrix S `Scopy' + } + +* No weighting matrix defined for LIML and kclass + if "`wmatrix'"=="" & "`liml'`kclassopt'"=="" { + ereturn matrix W `W' + } + else if "`liml'`kclassopt'"=="" { +* Create a copy so posting doesn't zap the original + tempname Wcopy + mat `Wcopy'=`wmatrix' + ereturn matrix W `Wcopy' + } + + if "`kernel'"!="" { + ereturn local kernel "`kernel'" + ereturn scalar bw=`bw' + ereturn local tvar "`tvar'" + if "`ivar'" ~= "" { + ereturn local ivar "`ivar'" + } + if "`bwchoice'" ~= "" { + ereturn local bwchoice "`bwchoice'" + } + } + + if "`small'"!="" { + ereturn scalar df_r=`df_r' + ereturn local small "small" + } + if "`nopartialsmall'"=="" { + ereturn local partialsmall "small" + } + + + if "`robust'" != "" { + local vce "robust" + } + if "`cluster1'" != "" { + if "`cluster2'"=="" { + local vce "`vce' cluster" + } + else { + local vce "`vce' two-way cluster" + } + } + if "`kernel'" != "" { + if "`robust'" != "" { + local vce "`vce' hac" + } + else { + local vce "`vce' ac" + } + local vce "`vce' `kernel' bw=`bw'" + } + if "`sw'" != "" { + local vce "`vce' sw" + } + if "`psd'" != "" { + local vce "`vce' `psd'" + } + local vce : list clean vce + local vce = lower("`vce'") + ereturn local vce `vce' + + if "`cluster'"!="" { + ereturn scalar N_clust=`N_clust' + ereturn local clustvar `cluster' + } + if "`cluster2'"!="" { + ereturn scalar N_clust1=`N_clust1' + ereturn scalar N_clust2=`N_clust2' + ereturn local clustvar1 `cluster1' + ereturn local clustvar2 `cluster2' + } + + if "`robust'`cluster'" != "" { + ereturn local vcetype "Robust" + } + + ereturn scalar df_m=`df_m' + ereturn scalar sdofminus=`sdofminus' + ereturn scalar dofminus=`dofminus' + ereturn scalar r2=`r2' + ereturn scalar rmse=`rmse' + ereturn scalar rss=`rss' + ereturn scalar mss=`mss' + ereturn scalar r2_a=`r2_a' + ereturn scalar F=`F' + ereturn scalar Fp=`Fp' + ereturn scalar Fdf1=`Fdf1' + ereturn scalar Fdf2=`Fdf2' + ereturn scalar yy=`yy' + ereturn scalar yyc=`yyc' + ereturn scalar r2u=`r2u' + ereturn scalar r2c=`r2c' + ereturn scalar rankzz=`iv_ct' + ereturn scalar rankxx=`rhs_ct' + if "`gmm2s'`robust'`cluster'`kernel'" != "" { + ereturn scalar rankS=`rankS' + } + ereturn scalar rankV=`rankV' + ereturn scalar ll = -0.5 * (`N'*ln(2*_pi) + `N'*ln(`rss'/`N') + `N') + +* Always save J. Also save as Sargan if homoskedastic; save A-R if LIML. + ereturn scalar j=`j' + ereturn scalar jdf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar jp=`jp' + } + if ("`robust'`cluster'"=="") { + ereturn scalar sargan=`j' + ereturn scalar sargandf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar sarganp=`jp' + } + } + if "`liml'"!="" { + ereturn scalar arubin=`arubin' + ereturn scalar arubin_lin=`arubin_lin' + if `j' != 0 & `j' != . { + ereturn scalar arubinp=`arubinp' + ereturn scalar arubin_linp=`arubin_linp' + } + ereturn scalar arubindf=`jdf' + } + + if "`orthog'"!="" { + ereturn scalar cstat=`cstat' + if `cstat'!=0 & `cstat' != . { + ereturn scalar cstatp=`cstatp' + ereturn scalar cstatdf=`cstatdf' + ereturn local clist `clist1' + } + } + + if "`endogtest'"!="" { + ereturn scalar estat=`estat' + if `estat'!=0 & `estat' != . { + ereturn scalar estatp=`estatp' + ereturn scalar estatdf=`estatdf' + ereturn local elist `elist1' + } + } + + if `endo1_ct' > 0 & "`noid'"=="" { + ereturn scalar idstat=`idstat' + ereturn scalar iddf=`iddf' + ereturn scalar idp=`idp' + ereturn scalar cd=`cd' + ereturn scalar widstat=`widstat' + ereturn scalar cdf=`cdf' + capture ereturn matrix ccev=`cceval' + capture ereturn matrix cdev `cdeval' + capture ereturn scalar rkf=`rkf' + } + + if "`redundant'"!="" & "`noid'"=="" { + ereturn scalar redstat=`redstat' + ereturn scalar redp=`redp' + ereturn scalar reddf=`reddf' + ereturn local redlist `redlist1' + } + + if "`first'`ffirst'`savefirst'" != "" & `endo1_ct'>0 & "`noid'"=="" { +* Capture here because firstmat empty if mvs encountered in 1st stage regressions + capture ereturn matrix first `firstmat' + ereturn scalar arf=`arf' + ereturn scalar arfp=`arfp' + ereturn scalar archi2=`archi2' + ereturn scalar archi2p=`archi2p' + ereturn scalar ardf=`ardf' + ereturn scalar ardf_r=`ardf_r' + ereturn scalar sstat=`sstat' + ereturn scalar sstatp=`sstatp' + ereturn scalar sstatdf=`sstatdf' + ereturn local firsteqs `firsteqs' + } + if "`rf'`saverf'" != "" & `endo1_ct'>0 { + ereturn local rfeq `rfeq' + } + + ereturn local depvar `lhs' + + if "`liml'"!="" { + ereturn local model "liml" + ereturn scalar kclass=`kclass' + ereturn scalar lambda=`lambda' + if `fuller' > 0 & `fuller' < . { + ereturn scalar fuller=`fuller' + } + } + else if "`kclassopt'" != "" { + ereturn local model "kclass" + ereturn scalar kclass=`kclass' + } + else if "`gmm2s'`cue'`b0'`wmatrix'"=="" { + if "`endo1'" == "" { + ereturn local model "ols" + } + else { + ereturn local model "iv" + } + } + else if "`cue'`b0'"~="" { + ereturn local model "cue" + } + else if "`gmm2s'"~="" { + ereturn local model "gmm2s" + } + else if "`wmatrix'"~="" { + ereturn local model "gmmw" + } + else { +* Should never enter here + ereturn local model "unknown" + } + + if "`weight'" != "" { + ereturn local wexp "=`exp'" + ereturn local wtype `weight' + } + ereturn local cmd `ivreg2_cmd' + ereturn local cmdline `cmdline' + ereturn local version `lversion' + ereturn scalar cons=`cons' + ereturn scalar partialcons=`partialcons' + + ereturn local predict "`ivreg2_cmd'_p" + + if "`e(model)'"=="gmm2s" & "`wmatrix'"=="" { + local title2 "2-Step GMM estimation" + } + else if "`e(model)'"=="gmm2s" & "`wmatrix'"~="" { + local title2 "2-Step GMM estimation with user-supplied first-step weighting matrix" + } + else if "`e(model)'"=="gmmw" { + local title2 "GMM estimation with user-supplied weighting matrix" + } + else if "`e(model)'"=="cue" & "`b0'"=="" { + local title2 "CUE estimation" + } + else if "`e(model)'"=="cue" & "`b0'"~="" { + local title2 "CUE evaluated at user-supplied parameter vector" + } + else if "`e(model)'"=="ols" { + local title2 "OLS estimation" + } + else if "`e(model)'"=="iv" { + local title2 "IV (2SLS) estimation" + } + else if "`e(model)'"=="liml" { + local title2 "LIML estimation" + } + else if "`e(model)'"=="kclass" { + local title2 "k-class estimation" + } + else { +* Should never reach here + local title2 "unknown estimation" + } + if "`e(vcetype)'" == "Robust" { + local hacsubtitle1 "heteroskedasticity" + } + if "`e(kernel)'"!="" & "`e(clustvar)'"=="" { + local hacsubtitle3 "autocorrelation" + } + if "`kiefer'"!="" { + local hacsubtitle3 "within-cluster autocorrelation (Kiefer)" + } + if "`e(clustvar)'"!="" { + if "`e(clustvar2)'"=="" { + local hacsubtitle3 "clustering on `e(clustvar)'" + } + else { + local hacsubtitle3 "clustering on `e(clustvar1)' and `e(clustvar2)'" + } + if "`e(kernel)'" != "" { + local hacsubtitle4 "and kernel-robust to common correlated disturbances (Driscoll-Kraay)" + } + } + if "`hacsubtitle1'"~="" & "`hacsubtitle3'" ~= "" { + local hacsubtitle2 " and " + } + if "`title'"=="" { + ereturn local title "`title1'`title2'" + } + else { + ereturn local title "`title'" + } + if "`subtitle'"~="" { + ereturn local subtitle "`subtitle'" + } + local hacsubtitle "`hacsubtitle1'`hacsubtitle2'`hacsubtitle3'" + if "`b0'"~="" { + ereturn local hacsubtitleB "Estimates based on supplied parameter vector" + } + else if "`hacsubtitle'"~="" & "`gmm2s'`cue'"~="" { + ereturn local hacsubtitleB "Estimates efficient for arbitrary `hacsubtitle'" + } + else if "`wmatrix'"~="" { + ereturn local hacsubtitleB "Efficiency of estimates dependent on weighting matrix" + } + else { + ereturn local hacsubtitleB "Estimates efficient for homoskedasticity only" + } + if "`hacsubtitle'"~="" { + ereturn local hacsubtitleV "Statistics robust to `hacsubtitle'" + } + else { + ereturn local hacsubtitleV "Statistics consistent for homoskedasticity only" + } + if "`hacsubtitle4'"~="" { + ereturn local hacsubtitleV2 "`hacsubtitle4'" + } + if "`sw'"~="" { + ereturn local hacsubtitleV "Stock-Watson heteroskedastic-robust statistics (BETA VERSION)" + } + } + +******************************************************************************************* +* Display results unless ivreg2 called just to generate stats or nooutput option + + if "`nooutput'" == "" { + if "`savefirst'`saverf'" != "" { + DispStored `"`saverf'"' `"`savefirst'"' `"`ivreg2_cmd'"' + } + if "`rf'" != "" { + DispRF + } + if "`first'" != "" { + DispFirst `"`ivreg2_cmd'"' + } + if "`first'`ffirst'" != "" { + DispFFirst `"`ivreg2_cmd'"' + } + if "`eform'"!="" { + local efopt "eform(`eform')" + } + DispMain `"`noheader'"' `"`plus'"' `"`efopt'"' `"`level'"' `"`nofooter'"' `"`ivreg2_cmd'"' + } + +* Drop first stage estimations unless explicitly saved or if replay + if "`savefirst'" == "" { + local firsteqs "`e(firsteqs)'" + foreach eqname of local firsteqs { + capture estimates drop `eqname' + } + ereturn local firsteqs + } + +* Drop reduced form estimation unless explicitly saved or if replay + if "`saverf'" == "" { + local eqname "`e(rfeq)'" + capture estimates drop `eqname' + ereturn local rfeq + } + +end + +******************************************************************************************* +* SUBROUTINES +******************************************************************************************* + +program define DispMain, eclass + args noheader plus efopt level nofooter helpfile + version 8.2 +* Prepare for problem resulting from rank(S) being insufficient +* Results from insuff number of clusters, too many lags in HAC, +* to calculate robust S matrix, HAC matrix not PD, singleton dummy, +* and indicated by missing value for j stat +* Macro `rprob' is either 1 (problem) or 0 (no problem) + capture local rprob ("`e(j)'"==".") + + if "`noheader'"=="" { + if "`e(title)'" ~= "" { +di in gr _n "`e(title)'" + local tlen=length("`e(title)'") +di in gr "{hline `tlen'}" + } + if "`e(subtitle)'" ~= "" { +di in gr "`e(subtitle)'" + } + if "`e(model)'"=="liml" | "`e(model)'"=="kclass" { +di in gr "k =" %7.5f `e(kclass)' + } + if "`e(model)'"=="liml" { +di in gr "lambda =" %7.5f `e(lambda)' + } + if e(fuller) > 0 & e(fuller) < . { +di in gr "Fuller parameter=" %-5.0f `e(fuller)' + } + if "`e(hacsubtitleB)'" ~= "" { +di in gr _n "`e(hacsubtitleB)'" _c + } + if "`e(hacsubtitleV)'" ~= "" { +di in gr _n "`e(hacsubtitleV)'" + } + if "`e(hacsubtitleV2)'" ~= "" { +di in gr "`e(hacsubtitleV2)'" + } + if "`e(kernel)'"!="" { +di in gr " kernel=`e(kernel)'; bandwidth=" `e(bw)' + if "`e(bwchoice)'"!="" { +di in gr " `e(bwchoice)'" + } +di in gr " time variable (t): " in ye e(tvar) + if "`e(ivar)'" != "" { +di in gr " group variable (i): " in ye e(ivar) + } + } + di + if "`e(clustvar)'"!="" { + if "`e(clustvar2)'"=="" { + local N_clust `e(N_clust)' + local clustvar `e(clustvar)' + } + else { + local N_clust `e(N_clust1)' + local clustvar `e(clustvar1)' + } +di in gr "Number of clusters (`clustvar') = " _col(33) in ye %6.0f `N_clust' _continue + } +di in gr _col(55) "Number of obs = " in ye %8.0f e(N) + if "`e(clustvar2)'"!="" { +di in gr "Number of clusters (" "`e(clustvar2)'" ") = " _col(33) in ye %6.0f e(N_clust2) _continue + } +di in gr _c _col(55) "F(" %3.0f e(Fdf1) "," %6.0f e(Fdf2) ") = " + if e(F) < 99999 { +di in ye %8.2f e(F) + } + else { +di in ye %8.2e e(F) + } +di in gr _col(55) "Prob > F = " in ye %8.4f e(Fp) + +di in gr "Total (centered) SS = " in ye %12.0g e(yyc) _continue +di in gr _col(55) "Centered R2 = " in ye %8.4f e(r2c) +di in gr "Total (uncentered) SS = " in ye %12.0g e(yy) _continue +di in gr _col(55) "Uncentered R2 = " in ye %8.4f e(r2u) +di in gr "Residual SS = " in ye %12.0g e(rss) _continue +di in gr _col(55) "Root MSE = " in ye %8.4g e(rmse) +di + } + +* Display coefficients etc. +* Unfortunate but necessary hack here: to suppress message about cluster adjustment of +* standard error, clear e(clustvar) and then reset it after display + local cluster `e(clustvar)' + ereturn local clustvar + ereturn display, `plus' `efopt' level(`level') + ereturn local clustvar `cluster' + +* Display 1st footer with identification stats +* Footer not displayed if -nofooter- option or if pure OLS, i.e., model="ols" and Sargan-Hansen=0 + if ~("`nofooter'"~="" | (e(model)=="ols" & (e(sargan)==0 | e(j)==0))) { + +* Under ID test + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##idtest:Underidentification test}" + if "`e(vcetype)'`e(kernel)'"=="" { +di in gr _c " (Anderson canon. corr. LM statistic):" + } + else { +di in gr _c " (Kleibergen-Paap rk LM statistic):" + } +di in ye _col(71) %8.3f e(idstat) +di in gr _col(52) "Chi-sq(" in ye e(iddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(idp) +* IV redundancy statistic + if "`e(redlist)'"!="" { +di in gr "-redundant- option:" +di in smcl _c "{help `helpfile'##redtest:IV redundancy test}" +di in gr _c " (LM test of redundancy of specified instruments):" +di in ye _col(71) %8.3f e(redstat) +di in gr _col(52) "Chi-sq(" in ye e(reddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(redp) +di in gr "Instruments tested: " _c + Disp `e(redlist)', _col(23) + } +di in smcl in gr "{hline 78}" + } +* Report Cragg-Donald statistic + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##widtest:Weak identification test}" +di in gr " (Cragg-Donald Wald F statistic):" in ye _col(71) %8.3f e(cdf) + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr " (Kleibergen-Paap rk Wald F statistic):" in ye _col(71) %8.3f e(widstat) + } +di in gr _c "Stock-Yogo weak ID test critical values:" + local cdmissing=1 + if "`e(model)'"=="iv" | "`e(model)'"=="gmm2s" | "`e(model)'"=="gmmw" { + cdsy, type(ivbias5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "15% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "25% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)==.) | "`e(model)'"=="cue" { + cdsy, type(limlsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "15% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "25% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)<.) { + cdsy, type(fullrel5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + if `cdmissing' { + di in gr _col(64) "" + } + else { + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." + } + } + di in smcl in gr "{hline 78}" + } + +* Report either (a) Sargan-Hansen-C stats, or (b) robust covariance matrix problem +* e(model)="gmmw" means user-supplied weighting matrix and Hansen J using 2nd-step resids reported + if `rprob' == 0 { +* Display overid statistic + if "`e(vcetype)'" == "Robust" | "`e(model)'" == "gmmw" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } + else { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } +di in ye _col(71) %8.3f e(j) + if e(rankxx) < e(rankzz) { +di in gr _col(52) "Chi-sq(" in ye e(jdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(jp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + +* Display orthog option: C statistic (difference of Sargan statistics) + if e(cstat) != . { +* If C-stat = 0 then warn, otherwise output + if e(cstat) > 0 { +di in gr "-orthog- option:" + if "`e(vcetype)'" == "Robust" { +di in gr _c "Hansen J statistic (eqn. excluding suspect orthog. conditions): " + } + else { +di in gr _c "Sargan statistic (eqn. excluding suspect orthogonality conditions):" + } +di in ye _col(71) %8.3f e(j)-e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(jdf)-e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f chiprob(e(jdf)-e(cstatdf),e(j)-e(cstat)) +di in smcl _c "{help `helpfile'##ctest:C statistic}" +di in gr _c " (exogeneity/orthogonality of suspect instruments): " +di in ye _col(71) %8.3f e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f e(cstatp) +di in gr "Instruments tested: " _c + Disp `e(clist)', _col(23) + } + if e(cstat) == 0 { +di in gr _n "Collinearity/identification problems in eqn. excl. suspect orthog. conditions:" +di in gr " C statistic not calculated for -orthog- option" + } + } + } + else { +* Problem exists with robust VCV - notify and list possible causes +di in r "Warning: estimated covariance matrix of moment conditions not of full rank." + if e(rankxx) < e(rankzz) { +di in r " overidentification statistic not reported, and standard errors and" + } +di in r " model tests should be interpreted with caution." +di in r "Possible causes:" + if "`e(N_clust)'" != "" { +di in r " number of clusters insufficient to calculate robust covariance matrix" + } + if "`e(kernel)'" != "" { +di in r " covariance matrix of moment conditions not positive definite" +di in r " covariance matrix uses too many lags" + } +di in r " singleton dummy variable (dummy with one 1 and N-1 0s or vice versa)" +di in r in smcl _c "{help `helpfile'##partial:partial}" +di in r " option may address problem." + } + +* Display endog option: endogeneity test statistic + if e(estat) != . { +* If stat = 0 then warn, otherwise output + if e(estat) > 0 { +di in gr "-endog- option:" +di in smcl _c "{help `helpfile'##endogtest:Endogeneity test}" +di in gr _c " of endogenous regressors: " +di in ye _col(71) %8.3f e(estat) +di in gr _col(52) "Chi-sq(" in ye e(estatdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(estatp) +di in gr "Regressors tested: " _c + Disp `e(elist)', _col(23) + } + if e(estat) == 0 { +di in gr _n "Collinearity/identification problems in restricted equation:" +di in gr " Endogeneity test statistic not calculated for -endog- option" + } + } + + di in smcl in gr "{hline 78}" +* Display AR overid statistic if LIML and not robust + if "`e(model)'" == "liml" & "`e(vcetype)'" ~= "Robust" & "`e(kernel)'" == "" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (LR test of excluded instruments):" + } +di in ye _col(72) %7.3f e(arubin) + if e(rankxx) < e(rankzz) { +di in gr _col(52) "Chi-sq(" in ye e(arubindf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(arubinp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + di in smcl in gr "{hline 78}" + } + } + +* Display 2nd footer with variable lists + if "`nofooter'"=="" { + +* Warn about dropped instruments if any +* (Re-)calculate number of user-supplied instruments + local iv1_ct : word count `e(insts)' + local iv1_ct = `iv1_ct' + `e(cons)' + + if `iv1_ct' > e(rankzz) { +di in gr "Collinearities detected among instruments: " _c +di in gr `iv1_ct'-e(rankzz) " instrument(s) dropped" + } + + if "`e(collin)'`e(dups)'" != "" | `e(partial_ct)'>0 { +* If collinearities, duplicates or partial, abbreviated varlists saved with a 1 at the end + local one "1" + } + if "`e(instd)'" != "" { + di in gr "Instrumented:" _c + Disp `e(instd`one')', _col(23) + } + if "`e(inexog)'" != "" { + di in gr "Included instruments:" _c + Disp `e(inexog`one')', _col(23) + } + if "`e(exexog)'" != "" { + di in gr "Excluded instruments:" _c + Disp `e(exexog`one')', _col(23) + } + if `e(partial_ct)' > 0 { + if e(partialcons) { + local partial "`e(partial`one')' _cons" + } + else { + local partial "`e(partial`one')'" + } +di in smcl _c "{help `helpfile'##partial:Partialled-out}" + di in gr ":" _c + Disp `partial', _col(23) + if "`e(partialsmall)'"=="" { +di in gr _col(23) "nb: small-sample adjustments do not account for" +di in gr _col(23) " partialled-out variables" + } + else { +di in gr _col(23) "nb: small-sample adjustments account for" +di in gr _col(23) " partialled-out variables" + } + } + if "`e(dups)'" != "" { + di in gr "Duplicates:" _c + Disp `e(dups)', _col(23) + } + if "`e(collin)'" != "" { + di in gr "Dropped collinear:" _c + Disp `e(collin)', _col(23) + } + if "`e(ecollin)'" != "" { + di in gr "Reclassified as exog:" _c + Disp `e(ecollin)', _col(23) + } + di in smcl in gr "{hline 78}" + } +end + +************************************************************************************** + +program define DispRF + version 8.2 + local eqname "`e(rfeq)'" + local depvar "`e(depvar)'" + local strlen : length local depvar + local strlen = `strlen'+25 +di +di in gr "Reduced-form regression: `e(depvar)'" +di in smcl in gr "{hline `strlen'}" + capture estimates replay `eqname' + if "`eqname'"=="" | _rc != 0 { +di in ye "Unable to display reduced-form regression of `e(depvar)'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + else { + estimates replay `eqname', noheader +di + } +end + +program define DispFirst + version 8.2 + args helpfile + tempname firstmat ivest sheapr2 pr2 F df df_r pvalue APF APFdf1 APFdf2 APFp APr2 + + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display first-stage estimates; macro e(first) is missing" + exit + } +di in gr _newline "First-stage regressions" +di in smcl in gr "{hline 23}" +di + local endo1 : colnames(`firstmat') + local nrvars : word count `endo1' + local firsteqs "`e(firsteqs)'" + local nreqs : word count `firsteqs' + if `nreqs' < `nrvars' { +di in ye "Unable to display all first-stage regressions." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + foreach eqname of local firsteqs { + _estimates hold `ivest' + capture estimates restore `eqname' + if _rc != 0 { +di +di in ye "Unable to list stored estimation `eqname'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + else { + local vn "`e(depvar)'" +di in gr "First-stage regression of `vn':" + estimates replay `eqname', noheader + mat `sheapr2' =`firstmat'["sheapr2","`vn'"] + mat `pr2' =`firstmat'["pr2","`vn'"] + mat `F' =`firstmat'["F","`vn'"] + mat `df' =`firstmat'["df","`vn'"] + mat `df_r' =`firstmat'["df_r","`vn'"] + mat `pvalue' =`firstmat'["pvalue","`vn'"] + mat `APF' =`firstmat'["APF","`vn'"] + mat `APFdf1' =`firstmat'["APFdf1","`vn'"] + mat `APFdf2' =`firstmat'["APFdf2","`vn'"] + mat `APFp' =`firstmat'["APFp","`vn'"] + mat `APr2' =`firstmat'["APr2","`vn'"] + +di in gr "F test of excluded instruments:" +di in gr " F(" %3.0f `df'[1,1] "," %6.0f `df_r'[1,1] ") = " in ye %8.2f `F'[1,1] +di in gr " Prob > F = " in ye %8.4f `pvalue'[1,1] + +di in smcl "{help `helpfile'##apstats:Angrist-Pischke multivariate F test of excluded instruments:}" +di in gr " F(" %3.0f `APFdf1'[1,1] "," %6.0f `APFdf2'[1,1] ") = " in ye %8.2f `APF'[1,1] +di in gr " Prob > F = " in ye %8.4f `APFp'[1,1] + +di + } + _estimates unhold `ivest' + } +end + +program define DispStored + args saverf savefirst helpfile + version 8.2 + if "`saverf'" != "" { + local eqlist "`e(rfeq)'" + } + if "`savefirst'" != "" { + local eqlist "`eqlist' `e(firsteqs)'" + } + local eqlist : list retokenize eqlist +di in gr _newline "Stored estimation results" +di in smcl in gr "{hline 25}" _c + capture estimates dir `eqlist' + if "`eqlist'" != "" & _rc == 0 { +* Estimates exist and can be listed + estimates dir `eqlist' + } + else if "`eqlist'" != "" & _rc != 0 { +di +di in ye "Unable to list stored estimations." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } +end + +program define DispFFirst + version 8.2 + args helpfile + tempname firstmat + tempname sheapr2 pr2 F df df_r pvalue APF APFdf1 APFdf2 APFp APchi2 APchi2p APr2 + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display summary of first-stage estimates; macro e(first) is missing" + exit + } + local endo : colnames(`firstmat') + local nrvars : word count `endo' + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + local efirsteqs "`e(firsteqs)'" + + mat `df' =`firstmat'["df",1] + mat `df_r' =`firstmat'["df_r",1] + mat `APFdf1' =`firstmat'["APFdf1",1] + mat `APFdf2' =`firstmat'["APFdf2",1] + +di +di in gr _newline "Summary results for first-stage regressions" +di in smcl in gr "{hline 43}" +di + +di _c in smcl _col(44) "{help `helpfile'##apstats:(Underid)}" +di in smcl _col(65) "{help `helpfile'##apstats:(Weak id)}" + +di _c in gr "Variable |" +di _c in smcl _col(16) "{help `helpfile'##apstats:F}" in gr "(" +di _c in ye _col(17) %3.0f `df'[1,1] in gr "," in ye %6.0f `df_r'[1,1] in gr ") P-val" +di _c in gr _col(37) "|" +di _c in smcl _col(39) "{help `helpfile'##apstats:AP Chi-sq}" in gr "(" +di _c in ye %3.0f `APFdf1'[1,1] in gr ") P-val" +di _c in gr _col(60) "|" +di _c in smcl _col(62) "{help `helpfile'##apstats:AP F}" in gr "(" +di in ye _col(67) %3.0f `APFdf1'[1,1] in gr "," in ye %6.0f `APFdf2'[1,1] in gr ")" + + local i = 1 + foreach vn of local endo { + + mat `sheapr2' =`firstmat'["sheapr2","`vn'"] + mat `pr2' =`firstmat'["pr2","`vn'"] + mat `F' =`firstmat'["F","`vn'"] + mat `df' =`firstmat'["df","`vn'"] + mat `df_r' =`firstmat'["df_r","`vn'"] + mat `pvalue' =`firstmat'["pvalue","`vn'"] + mat `APF' =`firstmat'["APF","`vn'"] + mat `APFdf1' =`firstmat'["APFdf1","`vn'"] + mat `APFdf2' =`firstmat'["APFdf2","`vn'"] + mat `APFp' =`firstmat'["APFp","`vn'"] + mat `APchi2' =`firstmat'["APchi2","`vn'"] + mat `APchi2p' =`firstmat'["APchi2p","`vn'"] + mat `APr2' =`firstmat'["APr2","`vn'"] + + local vnlen : length local vn + if `vnlen' > 12 { + local vn : piece 1 12 of "`vn'" + } +di _c in y %-12s "`vn'" _col(14) in gr "|" _col(18) in y %8.2f `F'[1,1] +di _c _col(28) in y %8.4f `pvalue'[1,1] +di _c _col(37) in g "|" _col(42) in y %8.2f `APchi2'[1,1] _col(51) in y %8.4f `APchi2p'[1,1] +di _col(60) in g "|" _col(65) in y %8.2f `APF'[1,1] + local i = `i' + 1 + } +di + + if "`robust'`cluster'" != "" { + if "`cluster'" != "" { + local rtype "cluster-robust" + } + else if "`kernel'" != "" { + local rtype "heteroskedasticity and autocorrelation-robust" + } + else { + local rtype "heteroskedasticity-robust" + } + } + else if "`kernel'" != "" { + local rtype "autocorrelation-robust" + } + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: first-stage test statistics `rtype'" +di + } + + local k2 = `APFdf1'[1,1] +di in gr "Stock-Yogo weak ID test critical values for single endogenous regressor:" + local cdmissing=1 + if "`e(model)'"=="iv" | "`e(model)'"=="gmm2s" | "`e(model)'"=="gmmw" { + cdsy, type(ivbias5) k2(`e(exexog_ct)') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(37) "5% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)==.) | "`e(model)'"=="cue" { + cdsy, type(limlsize10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)<.) { + cdsy, type(fullrel5) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(43) "5% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "30% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." +di + } + else { +di + } + +* Check that AP chi-sq and F denominator are correct and = underid test dof + if e(iddf)~=`APFdf1'[1,1] { +di in red "Warning: Error in calculating first-stage id statistics above;" +di in red " dof of AP statistics is " `APFdf1'[1,1] ", should be L-(K-1)=`e(iddf)'." + } + + tempname iddf idstat idp widstat cdf rkf + scalar `iddf'=e(iddf) + scalar `idstat'=e(idstat) + scalar `idp'=e(idp) + scalar `widstat'=e(widstat) + scalar `cdf'=e(cdf) + capture scalar `rkf'=e(rkf) +di in smcl "{help `helpfile'##idtest:Underidentification test}" +di in gr "Ho: matrix of reduced form coefficients has rank=K1-1 (underidentified)" +di in gr "Ha: matrix has rank=K1 (identified)" + if "`robust'`kernel'"=="" { +di in ye "Anderson canon. corr. LM statistic" _c + } + else { +di in ye "Kleibergen-Paap rk LM statistic" _c + } +di in gr _col(42) "Chi-sq(" in ye `iddf' in gr ")=" %-7.2f in ye `idstat' /* + */ _col(61) in gr "P-val=" %6.4f in ye `idp' + +di +di in smcl "{help `helpfile'##widtest:Weak identification test}" +di in gr "Ho: equation is weakly identified" +di in ye "Cragg-Donald Wald F statistic" _col(65) %8.2f `cdf' + if "`robust'`kernel'"~="" { +di in ye "Kleibergen-Paap Wald rk F statistic" _col(65) %8.2f `rkf' + } +di + +di in gr "Stock-Yogo weak ID test critical values for K1=`e(endog_ct)' and L1=`e(exexog_ct)':" + local cdmissing=1 + if "`e(model)'"=="iv" | "`e(model)'"=="gmm2s" | "`e(model)'"=="gmmw" { + cdsy, type(ivbias5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(37) "5% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)==.) | "`e(model)'"=="cue" { + cdsy, type(limlsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)<.) { + cdsy, type(fullrel5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "30% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + if `cdmissing' { + di in gr _col(64) "" + } + else { + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." + } + di + } + + tempname arf arfp archi2 archi2p ardf ardf_r + tempname sstat sstatp sstatdf +di in smcl "{help `helpfile'##wirobust:Weak-instrument-robust inference}" +di in gr "Tests of joint significance of endogenous regressors B1 in main equation" +di in gr "Ho: B1=0 and orthogonality conditions are valid" +* Needs to be small so that adjusted dof is reflected in F stat + scalar `arf'=e(arf) + scalar `arfp'=e(arfp) + scalar `archi2'=e(archi2) + scalar `archi2p'=e(archi2p) + scalar `ardf'=e(ardf) + scalar `ardf_r'=e(ardf_r) + scalar `sstat'=e(sstat) + scalar `sstatp'=e(sstatp) + scalar `sstatdf'=e(sstatdf) +di in ye _c "Anderson-Rubin Wald test" +di in gr _col(36) "F(" in ye `ardf' in gr "," in ye `ardf_r' in gr ")=" /* + */ _col(49) in ye %7.2f `arf' _col(61) in gr "P-val=" in ye %6.4f `arfp' +di in ye _c "Anderson-Rubin Wald test" +di in gr _col(36) "Chi-sq(" in ye `ardf' in gr ")=" /* + */ _col(49) in ye %7.2f `archi2' _col(61) in gr "P-val=" in ye %6.4f `archi2p' +di in ye _c "Stock-Wright LM S statistic" +di in gr _col(36) "Chi-sq(" in ye `sstatdf' in gr ")=" /* + */ _col(49) in ye %7.2f `sstat' _col(61) in gr "P-val=" in ye %6.4f `sstatp' +di + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: Underidentification, weak identification and weak-identification-robust" +di in gr " test statistics `rtype'" +di + } + + if "`cluster'" != "" & "`e(clustvar2)'"=="" { +di in gr "Number of clusters N_clust = " in ye %10.0f e(N_clust) + } + else if "`e(clustvar2)'" ~= "" { +di in gr "Number of clusters (1) N_clust1 = " in ye %10.0f e(N_clust1) +di in gr "Number of clusters (2) N_clust2 = " in ye %10.0f e(N_clust2) + } +di in gr "Number of observations N = " in ye %10.0f e(N) +di in gr "Number of regressors K = " in ye %10.0f e(rankxx) +di in gr "Number of endogenous regressors K1 = " in ye %10.0f e(endog_ct) +di in gr "Number of instruments L = " in ye %10.0f e(rankzz) +di in gr "Number of excluded instruments L1 = " in ye %10.0f e(ardf) + if "`e(partial)'" != "" { +di in gr "Number of partialled-out regressors/IVs = " in ye %10.0f e(partial_ct) +di in gr "NB: K & L do not included partialled-out variables" + } + +end + +* Performs first-stage regressions + +program define doFirst, rclass + version 8.2 + args endo /* variable list (including depvar) + */ inexog /* list of included exogenous + */ exexog /* list of excluded exogenous + */ touse /* touse sample + */ wtexp /* full weight expression w/ [] + */ noconstant /* + */ robust /* + */ clopt /* + */ bwopt /* + */ kernopt /* + */ savefprefix /* + */ dofmopt /* + */ sdofmopt /* + */ sw /* + */ psd /* + */ ivreg2_cmd + + + local i 1 + foreach x of local endo { + capture `ivreg2_cmd' `x' `inexog' `exexog' `wtexp' /* + */ if `touse', `noconstant' `robust' `clopt' `bwopt' `kernopt' /* + */ `dofmopt' `sdofmopt' `sw' `psd' small nocollin + if _rc ~= 0 { +* First-stage regression failed +di in ye "Unable to estimate first-stage regression of `x'" + if _rc == 506 { +di in ye " var-cov matrix of first-stage regression of `x' not positive-definite" + } + } + else { +* First-stage regression successful +* Check if there is enough room to save results; leave one free. Allow for overwriting. +* Max is 20-1=19 for Stata 9.0 and earlier, 300-1=299 for Stata 9.1+ + local maxest=299 + local vn "`x'" + local plen : length local savefprefix + local vlen : length local vn + if `plen'+`vlen' > 27 { + local vlen=27-`plen' + local vn : permname `vn', length(`vlen') +* Must create a variable so that permname doesn't reuse it + gen `vn'=0 + local dropvn "`dropvn' `vn'" + } + local eqname "`savefprefix'`vn'" + local eqname : subinstr local eqname "." "_" + qui estimates dir + local est_list "`r(names)'" + local est_list : list est_list - eqname + local est_ct : word count `est_list' + if `est_ct' < `maxest' { + capture est store `eqname', title("First-stage regression: `x'") + if _rc == 0 { + local firsteqs "`firsteqs' `eqname'" + } + } + else { +di +di in ye "Unable to store first-stage regression of `x'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + } + } + return local firsteqs "`firsteqs'" +end + +program define doRF, rclass + version 8.2 + args lhs /* + */ inexog /* list of included exogenous + */ exexog /* list of excluded exogenous + */ touse /* touse sample + */ weight /* full weight expression w/ [] + */ nocons /* + */ robust /* + */ clopt /* + */ bwopt /* + */ kernopt /* + */ saverfprefix /* + */ dofminus /* + */ sdofminus /* + */ sw /* + */ psd /* + */ ivreg2_cmd + +* Anderson-Rubin test of signif of endog regressors (Bo=0) +* In case ivreg2 called with adjusted dof, first stage should adjust dof as well + tempname arf arfp archi2 archi2p ardf ardf_r tempest + capture _estimates hold `tempest' + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } +* Needs to be small so that adjusted dof is reflected in F stat +* capture to prevent not-full-rank error warning + capture `ivreg2_cmd' `lhs' `inexog' `exexog' `weight' if `touse', /* + */ small `nocons' dofminus(`dofminus') sdofminus(`sdofminus') /* + */ `robust' `clopt' `bwopt' `kernopt' `sw' `psd' nocollin + if _rc != 0 { +di as err "Error: reduced form estimation failed" + exit 498 + } + + qui test `exexog' + scalar `arf'=r(F) + scalar `arfp'=r(p) + scalar `ardf'=r(df) + scalar `ardf_r'=r(df_r) + if "`clopt'"=="" { + scalar `archi2'=`arf'*`ardf'*(e(N)-`dofminus')/(e(N)-e(rankxx)-`dofminus'-`sdofminus') + } + else { + scalar `archi2'=`arf'*`ardf'*min(e(N_clust), e(N_clust2))/r(df_r)*(e(N)-1)/(e(N)-e(rankxx)-`sdofminus') + } + scalar `archi2p'=chiprob(`ardf',`archi2') + +* Check if there is enough room to save results; leave one free. Allow for overwriting. +* Max is 20-1=19 for Stata 9.0 and earlier, 300-1=299 for Stata 9.1+ + local maxest=299 + local vn "`lhs'" + local plen : length local saverfprefix + local vlen : length local lhs + if `plen'+`vlen' > 27 { + local vlen=27-`plen' + local vn : permname `vn', length(`vlen') + } + local eqname "`saverfprefix'`vn'" + local eqname : subinstr local eqname "." "_" + qui estimates dir + local est_list "`r(names)'" + local est_list : list est_list - eqname + local est_ct : word count `est_list' + if `est_ct' < `maxest' { + capture est store `eqname', title("Reduced-form regression: `lhs'") + return local rfeq "`eqname'" + } + else { +di +di in ye "Unable to store reduced-form regression of `lhs'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + _estimates unhold `tempest' + return scalar arf=`arf' + return scalar arfp=`arfp' + return scalar ardf=`ardf' + return scalar ardf_r=`ardf_r' + return scalar archi2=`archi2' + return scalar archi2p=`archi2p' +end + +************************************************************************************** +program define IsStop, sclass + /* sic, must do tests one-at-a-time, + * 0, may be very large */ + version 8.2 + if `"`0'"' == "[" { + sret local stop 1 + exit + } + if `"`0'"' == "," { + sret local stop 1 + exit + } + if `"`0'"' == "if" { + sret local stop 1 + exit + } +* per official ivreg 5.1.3 + if substr(`"`0'"',1,3) == "if(" { + sret local stop 1 + exit + } + if `"`0'"' == "in" { + sret local stop 1 + exit + } + if `"`0'"' == "" { + sret local stop 1 + exit + } + else sret local stop 0 +end + +program define Disp + version 8.2 + syntax [anything] [, _col(integer 15) ] + local len = 80-`_col'+1 + local piece : piece 1 `len' of `"`anything'"' + local i 1 + while "`piece'" != "" { + di in gr _col(`_col') "`first'`piece'" + local i = `i' + 1 + local piece : piece `i' `len' of `"`anything'"' + } + if `i'==1 { + di + } +end + +program define matsort + version 8.2 + args vmat names + tempname hold + foreach vn in `names' { + mat `hold'=nullmat(`hold'), `vmat'[1...,"`vn'"] + } + mat `vmat'=`hold' + mat drop `hold' + foreach vn in `names' { + mat `hold'=nullmat(`hold') \ `vmat'["`vn'",1...] + } + mat `vmat'=`hold' +end + +program define cdsy, rclass + version 8.2 + syntax , type(string) k2(integer) nendog(integer) + +* type() can be ivbias5 (k2<=100, nendog<=3) +* ivbias10 (ditto) +* ivbias20 (ditto) +* ivbias30 (ditto) +* ivsize10 (k2<=100, nendog<=2) +* ivsize15 (ditto) +* ivsize20 (ditto) +* ivsize25 (ditto) +* fullrel5 (ditto) +* fullrel10 (ditto) +* fullrel20 (ditto) +* fullrel30 (ditto) +* fullmax5 (ditto) +* fullmax10 (ditto) +* fullmax20 (ditto) +* fullmax30 (ditto) +* limlsize10 (ditto) +* limlsize15 (ditto) +* limlsize20 (ditto) +* limlsize25 (ditto) + + tempname temp cv + +* Initialize critical value as MV + scalar `cv'=. + + if "`type'"=="ivbias5" { + mata: s_ivreg210_cdsy("`temp'", 1) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias10" { + mata: s_ivreg210_cdsy("`temp'", 2) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias20" { + mata: s_ivreg210_cdsy("`temp'", 3) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias30" { + mata: s_ivreg210_cdsy("`temp'", 4) + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + if "`type'"=="ivsize10" { + mata: s_ivreg210_cdsy("`temp'", 5) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize15" { + mata: s_ivreg210_cdsy("`temp'", 6) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize20" { + mata: s_ivreg210_cdsy("`temp'", 7) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize25" { + mata: s_ivreg210_cdsy("`temp'", 8) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel5" { + mata: s_ivreg210_cdsy("`temp'", 9) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel10" { + mata: s_ivreg210_cdsy("`temp'", 10) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel20" { + mata: s_ivreg210_cdsy("`temp'", 11) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel30" { + mata: s_ivreg210_cdsy("`temp'", 12) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax5" { + mata: s_ivreg210_cdsy("`temp'", 13) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax10" { + mata: s_ivreg210_cdsy("`temp'", 14) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax20" { + mata: s_ivreg210_cdsy("`temp'", 15) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax30" { + mata: s_ivreg210_cdsy("`temp'", 16) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize10" { + mata: s_ivreg210_cdsy("`temp'", 17) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize15" { + mata: s_ivreg210_cdsy("`temp'", 18) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize20" { + mata: s_ivreg210_cdsy("`temp'", 19) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize25" { + mata: s_ivreg210_cdsy("`temp'", 20) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + return scalar cv=`cv' +end + +******************************************************************************* +**************** SUBROUTINES FOR KERNEL-ROBUST ******************************** +******************************************************************************* + +// capt prog drop abw +// abw wants a varlist of [ eps | Z | touse] +// where Z includes all instruments, included and excluded, with constant if +// present as the last column; eps are a suitable set of residuals; and touse +// marks the observations in the data matrix used to generate the residuals +// (e.g. e(sample) of the appropriate model). +// The Noconstant option indicates that no constant term exists in the Z matrix. +// kern is the name of the HAC kernel. -ivregress- only provides definitions +// for Bartlett (default), Parzen, quadratic spectral. + +// returns the optimal bandwidth as local abw + +// abw 1.0.1 CFB 30jun2007 +// 1.0.1 : redefine kernel names (3 instances) to match ivreg2 +// 1.1.0 : pass nobs and tobs to s_abw; abw bug fix and also handles gaps in data correctly + +prog def abw, rclass + version 9.2 + syntax varlist(ts), [ tindex(varname) nobs(integer 0) tobs(integer 0) NOConstant Kernel(string)] +// validate kernel + if "`kernel'" == "" { + local kernel = "Bartlett" + } +// cfb B102 + if !inlist("`kernel'", "Bartlett", "Parzen", "Quadratic Spectral") { + di as err "Error: kernel `kernel' not compatible with bw(auto)" + return scalar abw = 1 + return local bwchoice "Kernel `kernel' not compatible with bw(auto); bw=1 (default)" + exit + } + else { +// set constant + local cons 1 + if "`noconstant'" != "" { + local cons 0 + } +// deal with ts ops + tsrevar `varlist' + local varlist1 `r(varlist)' + mata: s_abw("`varlist1'", "`tindex'", `nobs', `tobs', `cons', "`kernel'") + return scalar abw = `abw' + return local bwchoice "Automatic bw selection according to Newey-West (1994)" + } +end + + +******************************************************************************* +************** END SUBROUTINES FOR KERNEL-ROBUST ****************************** +******************************************************************************* + + + +******************************************************************************* +*************************** BEGIN MATA CODE *********************************** +******************************************************************************* + +version 10.1 +mata: + +// For reference: +// struct ms_ivreg210_vcvorthog { +// string scalar ename, Znames, touse, weight, wvarname +// string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel +// string scalar sw, psd, ivarname, tvarname, tindexname +// real scalar wf, N, bw, tdelta, dofminus +// real matrix ZZ +// pointer matrix e +// pointer matrix Z +// pointer matrix wvar +// } + + +void s_abw (string scalar Zulist, + string scalar tindexname, + real scalar nobs, + real scalar tobs, + real scalar cons, + string scalar kernel + ) +{ + +// nobs = number of observations = number of data points available = rows(uZ) +// tobs = time span of data = t_N - t_1 + 1 +// nobs = tobs if no gaps in data +// nobs < tobs if there are gaps +// nobs used below when calculating means, e.g., covariances in sigmahat. +// tobs used below when time span of data is needed, e.g., mstar. + + string rowvector Zunames, tov + string scalar v, v2 + real matrix uZ + real rowvector h + real scalar lenzu, abw + +// access the Stata variables in Zulist, honoring touse stored as last column + Zunames = tokens(Zulist) + lenzu=cols(Zunames)-1 + v = Zunames[|1\lenzu|] + v2 = Zunames[lenzu+1] + st_view(uZ,.,v,v2) + tnow=st_data(., tindexname) + +// assume constant in last col of uZ if it exists +// account for eps as the first column of uZ + if (cons) { + nrows1=cols(uZ)-2 + nrows2=1 + } + else { + nrows1=cols(uZ)-1 + nrows2=0 + } +// [R] ivregress p.42: referencing Newey-West 1994 REStud 61(4):631-653 +// define h indicator rowvector + h = J(nrows1,1,1) \ J(nrows2,1,0) + +// calc mstar per p.43 +// Hannan (1971, 296) & Priestley (1981, 58) per Newey-West p. 633 +// corrected per Alistair Hall msg to Brian Poi 17jul2008 +// T = rows(uZ) +// oneT = 1/T + expo = 2/9 + q = 1 +// cgamma = 1.4117 + cgamma = 1.1447 + if(kernel == "Parzen") { + expo = 4/25 + q = 2 + cgamma = 2.6614 + } +// cfb B102 + if(kernel == "Quadratic Spectral") { + expo = 2/25 + q = 2 + cgamma = 1.3221 + } +// per Newey-West p.639, Anderson (1971), Priestley (1981) may provide +// guidance on setting expo for other kernels +// mstar = trunc(20 *(T/100)^expo) +// use time span of data (not number of obs) + mstar = trunc(20 *(tobs/100)^expo) + +// calc uZ matrix + u = uZ[.,1] + Z = uZ[|1,2 \.,.|] + +// calc f vector: (u_i Z_i) * h + f = (u :* Z) * h + +// calc sigmahat vector +// sigmahat = J(mstar+1,1,oneT) +// for(j=0;j<=mstar;j++) { +// for(i=j+1;i<=T;i++) { +// sigmahat[j+1] = sigmahat[j+1] + f[i]*f[i-j] +// } +// } + +// sigmahat vector following _iv_hacbw_select.mata logic +// sigmahat = J(mstar+1,1,0) +// for(j=0;j<=mstar;j++) { +// for(i=j+1;i<=nobs;i++) { // sum through nobs = number of datapoints available +// sigmahat[j+1] = sigmahat[j+1] + f[i]*f[i-j] +// } +// sigmahat[j+1] = sigmahat[j+1] / nobs +// } + +// alt approach that allows for gaps in time series + sigmahat = J(mstar+1,1,0) + for(j=0;j<=mstar;j++) { + lsj = "L"+strofreal(j) + tlag=st_data(., lsj+"."+tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix + // now calculate autocovariance; divide by nobs + sigmahat[j+1] = quadcross(f[tmatrix[.,1],.], f[tmatrix[.,2],.]) / nobs + } + +// calc shat(q), shat(0) + shatq = 0 + shat0 = sigmahat[1] + for(j=1;j<=mstar;j++) { + shatq = shatq + 2 * sigmahat[j+1] * j^q + shat0 = shat0 + 2 * sigmahat[j+1] + } + +// calc gammahat + expon = 1/(2*q+1) + gammahat = cgamma*( (shatq/shat0)^2 )^expon +// m = gammahat * T^expon +// use time span of data (not number of obs) + m = gammahat * tobs^expon + +// calc opt lag + if(kernel == "Bartlett" | kernel == "Parzen") { + optlag = min((trunc(m),mstar)) + } + else if(kernel == "Quadratic Spectral") { + optlag = min((m,mstar)) + } + +// if optlag is the optimal lag to be used, we need to add one to +// specify bandwidth in ivreg2 terms + abw = optlag + 1 + st_local("abw",strofreal(abw)) +} // end program s_abw + + +// ************** Common cross-products ************************************* + +void s_crossprods( string scalar yname, + string scalar X1names, + string scalar X2names, + string scalar Z1names, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N) + +{ + +// y = dep var +// X1 = endog regressors +// X2 = exog regressors = included IVs +// Z1 = excluded instruments +// Z2 = included IVs = X2 + + ytoken=tokens(yname) + X1tokens=tokens(X1names) + X2tokens=tokens(X2names) + Z1tokens=tokens(Z1names) + + Xtokens = (X1tokens, X2tokens) + Ztokens = (Z1tokens, X2tokens) + + K1=cols(X1tokens) + K2=cols(X2tokens) + K=K1+K2 + L1=cols(Z1tokens) + L2=cols(X2tokens) + L=L1+L2 + + st_view(wvar, ., st_tsrevar(wvarname), touse) + st_view(A, ., st_tsrevar((ytoken, Xtokens, Z1tokens)), touse) + + AA = quadcross(A, wf*wvar, A) + + if (K>0) { + XX = AA[(2::K+1),(2..K+1)] + Xy = AA[(2::K+1),1] + } + if (K1>0) { + X1X1 = AA[(2::K1+1),(2..K1+1)] + } + + if (L1 > 0) { + Z1Z1 = AA[(K+2::rows(AA)),(K+2..rows(AA))] + } + + if (L2 > 0) { + Z2Z2 = AA[(K1+2::K+1), (K1+2::K+1)] + Z2y = AA[(K1+2::K+1), 1] + } + + if ((L1>0) & (L2>0)) { + Z2Z1 = AA[(K1+2::K+1), (K+2::rows(AA))] + ZZ2 = Z2Z1, Z2Z2 + ZZ1 = Z1Z1, Z2Z1' + ZZ = ZZ1 \ ZZ2 + } + else if (L1>0) { + ZZ = Z1Z1 + } + else { +// L1=0 + ZZ = Z2Z2 + ZZ2 = Z2Z2 + } + + if ((K1>0) & (L1>0)) { // K1>0, L1>0 + X1Z1 = AA[(2::K1+1), (K+2::rows(AA))] + } + + if ((K1>0) & (L2>0)) { + X1Z2 = AA[(2::K1+1), (K1+2::K+1)] + if (L1>0) { // K1>0, L1>0, L2>0 + X1Z = X1Z1, X1Z2 + XZ = X1Z \ ZZ2 + } + else { // K1>0, L1=0, L2>0 + XZ = X1Z2 \ ZZ2 + X1Z = X1Z2 + } + } + else if (K1>0) { // K1>0, L2=0 + XZ = X1Z1 + X1Z= X1Z1 + } + else if (L1>0) { // K1=0, L2>0 + XZ = AA[(2::K+1),(K+2..rows(AA))], AA[(2::K+1),(2..K+1)] + } + else { // K1=0, L2=0 + XZ = ZZ + } + + if ((L1>0) & (L2>0)) { + Zy = AA[(K+2::rows(AA)), 1] \ AA[(K1+2::K+1), 1] + ZY = AA[(K+2::rows(AA)), (1..K1+1)] \ AA[(K1+2::K+1), (1..K1+1)] + Z2Y = AA[(K1+2::K+1), (1..K1+1)] + } + else if (L1>0) { + Zy = AA[(K+2::rows(AA)), 1] + ZY = AA[(K+2::rows(AA)), (1..K1+1)] + } + else if (L2>0) { + Zy = AA[(K1+2::K+1), 1] + ZY = AA[(K1+2::K+1), (1..K1+1)] + Z2Y = ZY + } +// Zy, ZY, Z2Y not created if L1=L2=0 + + YY = AA[(1::K1+1), (1..K1+1)] + yy = AA[1,1] + st_subview(y, A, ., 1) + ym = sum(wf*wvar:*y)/N + yyc = quadcrossdev(y, ym, wf*wvar, y, ym) + + XXinv = invsym(XX) + if (Xtokens==Ztokens) { + ZZinv = XXinv + XPZXinv = XXinv + } + else { + ZZinv = invsym(ZZ) + XPZX = makesymmetric(XZ*ZZinv*XZ') + XPZXinv=invsym(XPZX) + } + + st_matrix("r(XX)", XX) + st_matrix("r(X1X1)", X1X1) + st_matrix("r(X1Z)", X1Z) + st_matrix("r(ZZ)", ZZ) + st_matrix("r(Z2Z2)", Z2Z2) + st_matrix("r(Z1Z2)", Z2Z1') + st_matrix("r(Z2y)",Z2y) + st_matrix("r(XZ)", XZ) + st_matrix("r(Xy)", Xy) + st_matrix("r(Zy)", Zy) + st_numscalar("r(yy)", yy) + st_numscalar("r(yyc)", yyc) + st_matrix("r(YY)", YY) + st_matrix("r(ZY)", ZY) + st_matrix("r(Z2Y)", Z2Y) + st_matrix("r(XXinv)", XXinv) + st_matrix("r(ZZinv)", ZZinv) + st_matrix("r(XPZXinv)", XPZXinv) + +} // end program s_crossprods + +// ************** Cross-products needed for collinearity checks ************************************* + +void s_cc_crossprods( string scalar Anames, + string scalar Bnames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf) + +{ + + Atokens=tokens(Anames) + Btokens=tokens(Bnames) + + a=cols(Atokens) + b=cols(Btokens) + + st_view(wvar, ., st_tsrevar(wvarname), touse) + st_view(ABvars, ., st_tsrevar((Atokens, Btokens)), touse) + + M = quadcross(ABvars, wf*wvar, ABvars) + + if (a>0) { + AA = M[(1::a),(1::a)] + } + if (b>0) { + BB = M[(a+1::a+b),(a+1::a+b)] + BBinv = invsym(BB) + } + if ((a>0) & (b>0)) { + AB = M[(1::a),(a+1::a+b)] + } + + + st_matrix("r(AA)", AA) + st_matrix("r(BB)", BB) + st_matrix("r(AB)", AB) + st_matrix("r(BBinv)", BBinv) + +} // end program s_cc_crossprods + +// *************** 1st step GMM ******************** // + +void s_gmm1s( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar ZZinvmatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar Wmatrix, + string scalar Smatrix, + scalar dofminus) +{ + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + ZZ = st_matrix(ZZmatrix) + XX = st_matrix(XXmatrix) + XZ = st_matrix(XZmatrix) + Zy = st_matrix(Zymatrix) + ZZinv = st_matrix(ZZinvmatrix) + + QZZ = ZZ / N + QXX = XX / N + QXZ = XZ / N + QZy = Zy / N + QZZinv = ZZinv*N + +// Weighting matrix supplied + if (Wmatrix~="") { + W = st_matrix(Wmatrix) + } +// Var-cov matrix of orthog conditions supplied + else if (Smatrix~="") { + omega=st_matrix(Smatrix) + W = invsym(omega) + } +// No weighting matrix supplied, default to IV weighting matrix + else { + W = QZZinv + IVflag=1 + } + + if ((Xtokens==Ztokens) & (IVflag==1)) { + beta = QZZinv*QZy // OLS + } + else { + QXZ_W_QZX = QXZ * W * QXZ' + _makesymmetric(QXZ_W_QZX) + QXZ_W_QZXinv=invsym(QXZ_W_QZX) + beta = (QXZ_W_QZXinv * QXZ * W * QZy) + } + beta = beta' + + e[.,.] = y - X * beta' + +// If default weighting matrix, normalize by sigma^2 for standard IV reporting purposes + if (IVflag==1) { + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + W = W/sigmasq + } + + st_matrix("r(beta)", beta) + st_matrix("r(W)",W) + +} // end program s_gmm1s + + +// *************** efficient GMM ******************** // + +void s_egmm( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar ZZinvmatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar Smatrix, + scalar dofminus) +{ + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + ZZ = st_matrix(ZZmatrix) + XX = st_matrix(XXmatrix) + XZ = st_matrix(XZmatrix) + Zy = st_matrix(Zymatrix) + ZZinv = st_matrix(ZZinvmatrix) + + QZZ = ZZ / N + QXX = XX / N + QXZ = XZ / N + QZy = Zy / N + QZZinv = ZZinv*N + +// Var-cov matrix of orthog conditions supplied + if (Smatrix~="") { + omega=st_matrix(Smatrix) + W = invsym(omega) + } +// No weighting matrix supplied, default to IV weighting matrix + else { + W = QZZinv + IVflag=1 + } + + QXZ_W_QZX = QXZ * W * QXZ' + _makesymmetric(QXZ_W_QZX) + QXZ_W_QZXinv=invsym(QXZ_W_QZX) + + beta = (QXZ_W_QZXinv * QXZ * W * QZy) + beta = beta' + + e[.,.] = y - X * beta' + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + +// If default weighting matrix, need to normalize by sigma^2 + if (IVflag==1) { + W = W/sigmasq + } + +// Sandwich var-cov matrix (no finite-sample correction) +// Reduces to classical var-cov matrix if omega is not robust form. +// But the GMM estimator is "root-N consistent", and technically we do +// inference on sqrt(N)*beta. By convention we work with beta, so we adjust +// the var-cov matrix instead: + V = 1/N * QXZ_W_QZXinv + +// J if overidentified + if (cols(Z) > cols(X)) { + Ze = quadcross(Z, wf*wvar, e) + gbar = Ze / N + j = N * gbar' * W * gbar + } + else { + j=0 + } + + st_matrix("r(beta)", beta) + st_matrix("r(V)", V) + st_matrix("r(W)", W) + st_numscalar("r(rss)", ee) + st_numscalar("r(j)", j) + st_numscalar("r(sigmasq)", sigmasq) + +} // end program s_egmm + +// *************** inefficient GMM ******************** // + +void s_iegmm( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar Wmatrix, + string scalar Smatrix, + string scalar bname, + scalar dofminus) +{ + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + QZZ = st_matrix(ZZmatrix) / N + QXX = st_matrix(XXmatrix) / N + QXZ = st_matrix(XZmatrix) / N + QZy = st_matrix(Zymatrix) / N + +// beta is supplied + beta = st_matrix(bname) + +// Weighting matrix supplied + W = st_matrix(Wmatrix) + +// Var-cov matrix of orthog conditions supplied + omega=st_matrix(Smatrix) + +// Residuals are supplied + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + + QXZ_W_QZX = QXZ * W * QXZ' + _makesymmetric(QXZ_W_QZX) + QXZ_W_QZXinv=invsym(QXZ_W_QZX) + +// Calculate V and J. + +// V +// The GMM estimator is "root-N consistent", and technically we do +// inference on sqrt(N)*beta. By convention we work with beta, so we adjust +// the var-cov matrix instead: + V = 1/N * QXZ_W_QZXinv * QXZ * W * omega * W * QXZ' * QXZ_W_QZXinv + _makesymmetric(V) + +// J if overidentified + if (cols(Z) > cols(X)) { +// Note that J requires efficient GMM residuals, which means do 2-step GMM to get them. + W2s = invsym(omega) + QXZ_W2s_QZX = QXZ * W2s * QXZ' + _makesymmetric(QXZ_W2s_QZX) + QXZ_W2s_QZXinv=invsym(QXZ_W2s_QZX) + beta2s = (QXZ_W2s_QZXinv * QXZ * W2s * QZy) + beta2s = beta2s' + e2s = y - X * beta2s' + Ze2s = quadcross(Z, wf*wvar, e2s) + gbar = Ze2s / N + j = N * gbar' * W2s * gbar + } + else { + j=0 + } + + st_matrix("r(V)", V) + st_numscalar("r(j)", j) + st_numscalar("r(rss)", ee) + st_numscalar("r(sigmasq)", sigmasq) + +} // end program s_iegmm + +// *************** LIML ******************** // + +void s_liml( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar Zymatrix, + string scalar Z2Z2matrix, + string scalar YYmatrix, + string scalar ZYmatrix, + string scalar Z2Ymatrix, + string scalar Xymatrix, + string scalar ZZinvmatrix, + string scalar yname, + string scalar Ynames, + string scalar ename, + string scalar Xnames, + string scalar X1names, + string scalar Znames, + string scalar Z1names, + string scalar Z2names, + scalar fuller, + scalar kclass, + string scalar coviv, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + scalar dofminus) + +{ + struct ms_ivreg210_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + + +// X1 = endog regressors +// X2 = exog regressors = included IVs +// Z1 = excluded instruments +// Z2 = included IVs = X2 + + Ytokens=tokens(Ynames) + Ztokens=tokens(Znames) + Z1tokens=tokens(Z1names) + Z2tokens=tokens(Z2names) + Xtokens=tokens(Xnames) + X1tokens=tokens(X1names) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + + vcvo.e = &e + vcvo.Z = &Z + vcvo.wvar = &wvar + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + + QZZ = st_matrix(ZZmatrix) / N + QXX = st_matrix(XXmatrix) / N + QXZ = st_matrix(XZmatrix) / N + QZy = st_matrix(Zymatrix) / N + QZ2Z2 = st_matrix(Z2Z2matrix) / N + QYY = st_matrix(YYmatrix) / N + QZY = st_matrix(ZYmatrix) / N + QZ2Y = st_matrix(Z2Ymatrix) / N + QXy = st_matrix(Xymatrix) / N + QZZinv = st_matrix(ZZinvmatrix)*N + +// kclass=0 => LIML or Fuller LIML so calculate lambda + if (kclass == 0) { + QWW = QYY - QZY'*QZZinv*QZY + _makesymmetric(QWW) + if (cols(Z2tokens) > 0) { + QZ2Z2inv = invsym(QZ2Z2) + QWW1 = QYY - QZ2Y'*QZ2Z2inv*QZ2Y + _makesymmetric(QWW1) + } + else { +// Special case of no exogenous regressors + QWW1 = QYY + } + M=matpowersym(QWW, -0.5) + Eval=symeigenvalues(M*QWW1*M) + lambda=rowmin(Eval) + } + +// Exactly identified but might not be exactly 1, so make it so + if (cols(Z)==cols(X)) { + lambda=1 + } + + if (fuller > (N-cols(Z))) { +printf("\n{error:Error: invalid choice of Fuller LIML parameter.}\n") + exit(error(3351)) + } + else if (fuller > 0) { + k = lambda - fuller/(N-cols(Z)) + } + else if (kclass > 0) { + k = kclass + } + else { + k = lambda + } + QXhXh=(1-k)*QXX + k*QXZ*QZZinv*QXZ' + _makesymmetric(QXhXh) + QXhXhinv=invsym(QXhXh) + beta = QXy'*QXhXhinv*(1-k) + k*QZy'*QZZinv*QXZ'*QXhXhinv + + e[.,.] = y - X * beta' + ee = quadcross(e, wf*wvar, e) + sigmasq = ee /(N-dofminus) + + S = m_ivreg210_omega(vcvo) + Sinv = invsym(S) + + if ((robust=="") & (clustvarname=="") & (kernel=="")) { +// Efficient LIML + if (coviv=="") { +// Note dof correction is already in sigmasq, and the N reverses the division by N to get the Q version above. + V=sigmasq*QXhXhinv/N + } + else { + QXPZXinv=invsym(makesymmetric(QXZ*QZZinv*QXZ')) + V=sigmasq*QXPZXinv/N + } + if (cols(Z)>cols(X)) { + Ze = quadcross(Z, wf*wvar, e) + gbar = Ze / N + j = N * gbar' * Sinv * gbar + } + else { + j=0 + } + } + else { + if (coviv=="") { + V=QXhXhinv*QXZ*QZZinv*S*QZZinv*QXZ'*QXhXhinv/N + } + else { + QXPZXinv=invsym(makesymmetric(QXZ*QZZinv*QXZ')) + V=QXPZXinv*QXZ*QZZinv*S*QZZinv*QXZ'*QXPZXinv/N + } + if (cols(Z)>cols(X)) { + QXZ_Sinv_QZX = QXZ * Sinv * QXZ' + _makesymmetric(QXZ_Sinv_QZX) + QXZ_Sinv_QZXinv=invsym(QXZ_Sinv_QZX) + beta2s = (QXZ_Sinv_QZXinv * QXZ * Sinv * QZy) + beta2s = beta2s' + e2s = y - X * beta2s' + Ze2s = quadcross(Z, wf*wvar, e2s) + gbar = Ze2s / N + j = N * gbar' * Sinv * gbar + } + else { + j=0 + } + } + _makesymmetric(V) + + st_matrix("r(beta)", beta) + st_matrix("r(S)",S) + st_matrix("r(V)",V) + st_numscalar("r(lambda)", lambda) + st_numscalar("r(kclass)", k) + st_numscalar("r(j)", j) + st_numscalar("r(rss)", ee) + st_numscalar("r(sigmasq)", sigmasq) + +} // end program s_liml + + +// *************** CUE ******************** // + +void s_gmmcue( string scalar ZZmatrix, + string scalar XZmatrix, + string scalar yname, + string scalar ename, + string scalar Xnames, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + string scalar bname, + string scalar b0name, + scalar dofminus) + +{ + + struct ms_ivreg210_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + + Ztokens=tokens(Znames) + Xtokens=tokens(Xnames) + + st_view(Z, ., st_tsrevar(Ztokens), touse) + st_view(X, ., st_tsrevar(Xtokens), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Pointers to views + vcvo.e = &e + vcvo.Z = &Z + vcvo.wvar = &wvar + py = &y + pX = &X + + if (b0name=="") { + +// CUE beta not supplied, so calculate/optimize + +// Our convention is that regressors are [endog included exog] +// and instruments are [excluded exog included exog] +// If a constant is included, it is the last column. + +// CUE is preceded by IV or 2-step GMM to get starting values. +// Stata convention is that parameter vectors are row vectors, and optimizers +// require this, so must conform to this in what follows. + + beta_init = st_matrix(bname) + +// What follows is how to set out an optimization in Stata. First, initialize +// the optimization structure in the variable S. Then tell Mata where the +// objective function is, that it's a minimization, that it's a "d0" type of +// objective function (no analytical derivatives or Hessians), and that the +// initial values for the parameter vector are in beta_iv. Finally, optimize. + S = optimize_init() + + optimize_init_evaluator(S, &m_cuecrit()) + optimize_init_which(S, "min") + optimize_init_evaluatortype(S, "d0") + optimize_init_params(S, beta_init) +// CUE objective function takes 3 extra arguments: y, X and the structure with omega details + optimize_init_argument(S, 1, py) + optimize_init_argument(S, 2, pX) + optimize_init_argument(S, 3, vcvo) + + beta = optimize(S) + +// The last evaluation of the GMM objective function is J. + j = optimize_result_value(S) +// Call m_ivreg210_omega one last time to get CUE weighting matrix. + e[.,.] = y - X * beta' + omega = m_ivreg210_omega(vcvo) + W = invsym(omega) + } + else { +// CUE beta supplied, so obtain maximized GMM obj function at b0 + beta = st_matrix(b0name) + e[.,.] = y - X * beta' + omega = m_ivreg210_omega(vcvo) + W = invsym(omega) + gbar = 1/N * quadcross(Z, wf*wvar, e) + j = N * gbar' * W * gbar + } + +// Bits and pieces + QXZ = st_matrix(XZmatrix)/N + + ee = quadcross(e, wf*wvar, e) + sigmasq=ee/(N-dofminus) + + QXZ_W_QZX = QXZ * W * QXZ' + _makesymmetric(QXZ_W_QZX) + QXZ_W_QZXinv=invsym(QXZ_W_QZX) + V = 1/N * QXZ_W_QZXinv + + st_matrix("r(beta)", beta) + st_matrix("r(S)", omega) + st_matrix("r(W)", W) + st_matrix("r(V)", V) + st_numscalar("r(j)", j) + st_numscalar("r(rss)", ee) + st_numscalar("r(sigmasq)", sigmasq) + +} // end program s_gmmcue + +// CUE evaluator function. +// Handles only d0-type optimization; todo, g and H are just ignored. +// beta is the parameter set over which we optimize, and +// J is the objective function to minimize. + +void m_cuecrit(todo, beta, pointer py, pointer pX, struct ms_ivreg210_vcvorthog scalar vcvo, j, g, H) +{ + *vcvo.e[.,.] = *py - *pX * beta' + + omega = m_ivreg210_omega(vcvo) + W = invsym(omega) + +// Calculate gbar=Z'*e/N + gbar = 1/vcvo.N * quadcross(*vcvo.Z, vcvo.wf*(*vcvo.wvar), *vcvo.e) + j = vcvo.N * gbar' * W * gbar + +} // end program CUE criterion function + +// *************** Stock-Wright S statistic ******************** // + +void s_sstat( string scalar X2X2matrix, + string scalar Z1X2matrix, + string scalar X2ymatrix, + string scalar yname, + string scalar ename, + string scalar X2names, + string scalar Znames, + string scalar Z1names, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + scalar dofminus) + +{ + + struct ms_ivreg210_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + + st_view(X2, ., st_tsrevar(tokens(X2names)), touse) + st_view(y, ., st_tsrevar(yname), touse) + st_view(e, ., vcvo.ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + +// Strategy is to partial out X2 (=Z2) from Z1 and from y +// For omega to work with partialled-out Z1, must set up a copy that can be changed. + Z1=st_data( ., st_tsrevar(tokens(Z1names)), touse) + + + X2X2 = st_matrix(X2X2matrix) + Z1X2 = st_matrix(Z1X2matrix) + X2y = st_matrix(X2ymatrix) + + if (cols(tokens(X2names))>0) { +// The X2s are exogenous so we partial them out of y in one step - simple OLS +// Same with Z1 + QX2X2 = X2X2 / N + QX2y = X2y / N + QX2Z1 = Z1X2' / N + +// y=XB => X'y=X'XB + by = invsym(QX2X2)*QX2y + e[.,.] = y-X2*by + bZ1 = invsym(QX2X2)*QX2Z1 + Z1[.,.] = Z1 - X2*bZ1 + } + else { + e[.,.] = y + } + +// And tell m_ivreg210_omega that ZZ is the cross-product of the partialled-out Zs + Z1Z1matrix = quadcross(Z1, wf*wvar, Z1) + + vcvo.e = &e + vcvo.Z = &Z1 + vcvo.Znames = Z1names + vcvo.wvar = &wvar + vcvo.ZZ = Z1Z1matrix + + omega = m_ivreg210_omega(vcvo) + + W = invsym(omega) + +// If zeros on diag, not full rank and can't calculate the statistic + if (diag0cnt(W)==0) { + Ze = quadcross(Z1, wf*wvar, e) + gbar = Ze / N + j = N * gbar' * W * gbar + st_numscalar("r(j)", j) + } + +} // end program s_sstat + +// ************** Canonical correlations utility for collinearity check ************************************* + +void s_cc_collin( string scalar ZZmatrix, + string scalar X1X1matrix, + string scalar X1Zmatrix, + string scalar ZZinvmatrix) + +{ + + ZZ = st_matrix(ZZmatrix) + X1X1 = st_matrix(X1X1matrix) + X1Z = st_matrix(X1Zmatrix) + X1X1inv = invsym(X1X1) + ZZinv = st_matrix(ZZinvmatrix) + X1PZX1 = makesymmetric(X1Z*ZZinv*X1Z') + X1PZX1inv = invsym(X1PZX1) + + ccmat = X1X1inv*X1PZX1 + st_matrix("r(ccmat)", ccmat) + +} // end program s_cc_collin + +// ************** ffirst-stage stats ************************************* + +void s_ffirst( string scalar ZZmatrix, + string scalar XXmatrix, + string scalar XZmatrix, + string scalar ZZinvmatrix, + string scalar XXinvmatrix, + string scalar XPZXinvmatrix, + string scalar ename, + string scalar X1names, + string scalar X1hatnames, + string scalar X2names, + string scalar Z1names, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + scalar N_clust, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + scalar dofminus, + scalar sdofminus) + + +{ + + struct ms_ivreg210_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + +// X1 = endog regressors +// X2 = exog regressors = included IVs +// Z1 = excluded instruments +// Z2 = included IVs = X2 + + Xnames = invtokens( (X1names, X2names), " ") + Znames = invtokens( (Z1names, X2names), " ") + + st_view(X1, ., st_tsrevar(tokens(X1names)), touse) + st_view(X1hat, ., st_tsrevar(tokens(X1hatnames)), touse) + st_view(Z1, ., st_tsrevar(tokens(Z1names)), touse) + st_view(X, ., st_tsrevar(tokens(Xnames)), touse) + st_view(Z, ., st_tsrevar(tokens(Znames)), touse) + st_view(e, ., ename, touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + + vcvo.e = &e + vcvo.Z = &Z + vcvo.wvar = &wvar + + if ("X2names"~="") { + st_view(X2, ., st_tsrevar(tokens(X2names)), touse) + } + + K1=cols(X1) + K2=cols(X2) + K=K1+K2 + L1=cols(Z1) + L2=cols(X2) + L=L1+L2 + df = L1 + df_r = N-L + + ZZinv = st_matrix(ZZinvmatrix) + XXinv = st_matrix(XXinvmatrix) + XPZXinv = st_matrix(XPZXinvmatrix) + QZZ = st_matrix(ZZmatrix) / N + QXX = st_matrix(XXmatrix) / N + QZX = st_matrix(XZmatrix)' / N + QZZinv = ZZinv*N + QXXinv = XXinv*N + + shea = (diagonal(XXinv) :/ diagonal(XPZXinv)) // (X1, X2) in column vector + shea = (shea[(1::K1), 1 ])' // Just X1 in row vector + +// First-stage regressions + bz = invsym(QZZ)*QZX +// Drop 0s/1s = coefficients for "predicting" X2 (=Z2) + bz = bz[., (1..K1)] +// VCV + X1hat[.,.] = Z*bz + eall = X1 - X1hat + eeall = quadcross(eall, wf*wvar, eall) +// sigmas have large-sample dofminus correction incorporated but no small dof corrections + sigmasqall = eeall / (N-dofminus) +// V has all the classical VCVs in block diagonals + V = sigmasqall # ZZinv +// For Wald test of excluded instruments + R = I(L1) , J(L1, L2, 0) +// For AP F stats. Augment exogenous Z with X1hats. +// Create using new view to save memory + st_view(ZX1hat, ., st_tsrevar((tokens(Znames), tokens(X1hatnames))), touse) + QZhZh = quadcross(ZX1hat, wf*wvar, ZX1hat) / N + QZhX1 = quadcross(ZX1hat, wf*wvar, X1 ) / N +// matrix to save first-stage results + firstmat=J(12,0,0) + +// F and AP F stats loop over X1s + for (i=1; i<=K1; i++) { +// first-stage coeffs and residuals for ith X1. + b=bz[., i] + e[.,.] = eall[.,i] + +// Classical Wald F stat; also generates partial R2 +// Since r is an L1 x 1 zero vector, can use Rb instead of (Rb-r) +// Vi=V[| 1+(i-1)*L,1+(i-1)*L \ i*L, i*L |] +// Rb = R*b +// Wald = Rb' * invsym(R*Vi*R') * Rb +// Above is written out properly but amounts to the same thing as: + Rb = b[ (1::L1), . ] + RVR = V[| 1+(i-1)*L,1+(i-1)*L \ (i-1)*L+L1, (i-1)*L+L1 |] + Wald = Rb' * invsym(RVR) * Rb +// Wald stat has dofminus correction in it via sigmasq, +// so remove it to calculate partial R2 + pr2 = (Wald/(N-dofminus)) / (1 + (Wald/(N-dofminus))) + +// Robustify F stat if necessary. + if ((robust~="") | (clustvarname~="") | (kernel~="") | (sw~="")) { +// Z and ZZ changed later in loop, so here reset +// in order that m_ivreg210_omega is passed the right ones. +// vcvo.Z is a pointer so automatically updated. + st_view(Z, ., st_tsrevar(tokens(Znames)), touse) + vcvo.ZZ = st_matrix(ZZmatrix) + omega=m_ivreg210_omega(vcvo) +// omega incorporates large dofminus adjustment + Vi = makesymmetric(QZZinv * omega * QZZinv) / N + RVR = Vi[ (1::L1), (1..L1) ] + Wald = Rb' * invsym(RVR) * Rb + } +// small dof adjustment is effectively additional L2, e.g., partialled-out regressors + df = L1 + if (clustvarname=="") { + df_r = (N-dofminus-L-sdofminus) + F = Wald / (N-dofminus) * df_r / df + } + else { + df_r = N_clust - 1 + F = Wald / (N-1) * (N-L-sdofminus) * (N_clust - 1) / N_clust / df + } + pvalue = Ftail(df, df_r, F) + +// Angrist-Pischke F stat etc. +// selmat is selection matrix for choosing Z1s, X2s and X1hats. +// Entries are col numbers of QZhZh. +// keepmat is for invsym - if linear dependencies, must keep X2 and X1hat. +// Entries are col numbers of selmat = col numbers of SELECTED QZhZh cols. + keepmat=J(1,0,.) + selmat=J(1,0,.) + for (j=1; j<=(L+K1); j++) { + if (j~=(L+i)) { // L+i is position of endog i for which we want AP F + selmat = (selmat, j) + } + if ( (j>L1) & (j~=(L+i)) ) { // Must keep all X2s and the (not-i) X1hats + keepmat = (keepmat, cols(selmat)) + } + } +// QZhZh is crossproduct of all Zs plus X1hats +// QZhZhi has all the Zs plus the right X1hats + QZhZhi = QZhZh[ selmat', selmat ] + QZhX1i = QZhX1 [ selmat', i ] +// Can't use qrsolve as in b = qrsolve(QZhZhi,QZhX1i), since we +// need to be able to control which cols get dropped, including +// cases of perverse collinearities. Must keep X2 and X1hat. + QZhZhinv = invsym(QZhZhi, keepmat) + b = QZhZhinv*QZhX1i + + e[.,.] = X1[.,i] - (Z, X1hat)[., selmat]*b + ee = quadcross(e, wf*wvar, e) + sigmasq = ee / (N-dofminus) + Vi = sigmasq * QZhZhinv / N + Rb=b[ (1::L1), .] + RVR = Vi[ (1::L1), (1..L1) ] + Wald = Rb' * invsym(RVR) * Rb + +// Wald stat has dofminus correction in it via sigmasq, +// so remove it to calculate partial R2 + APr2 = (Wald/(N-dofminus)) / (1 + (Wald/(N-dofminus))) + +// Having calculated AP R-sq based on non-robust AP Wald, now get robust AP Wald if needed. + if ((robust~="") | (clustvarname~="") | (kernel~="") | (sw~="")) { +// Reset Z and ZZ so that m_ivreg210_omega is passed the right variables. +// vcvo.Z is a pointer so automatically updated. + Zhtokens = (tokens(Znames), tokens(X1hatnames)) + st_view(Z, ., st_tsrevar(Zhtokens[1, selmat]), touse) + vcvo.ZZ = quadcross(Z, wf*wvar, Z) + omega=m_ivreg210_omega(vcvo) + Vi = makesymmetric(QZhZhinv * omega * QZhZhinv) / N + } + RVR = Vi[ (1::L1), (1..L1) ] + Wald = Rb' * invsym(RVR) * Rb + +// small dof adjustment is effectively additional L2, e.g., partialled-out regressors + APFdf1 = (L1-K1+1) + if (clustvarname=="") { + APFdf2 = (N-dofminus-L-sdofminus) + APF = Wald / (N-dofminus) * APFdf2 / APFdf1 + } + else { + APFdf2 = N_clust - 1 + APF = Wald / (N-1) * (N-L-sdofminus) * (N_clust - 1) / N_clust / APFdf1 + } + APFp = Ftail(APFdf1, APFdf2, APF) + APchi2 = Wald + APchi2p = chi2tail(APFdf1, APchi2) +// Assemble results + firstmat = firstmat , (pr2 \ F \ df \ df_r \ pvalue \ APF \ APFdf1 \ APFdf2 \ APFp \ APchi2 \ APchi2p \ APr2) + } // end of loop for an X1 variable + + firstmat = shea \ firstmat // append shea partial r2 + st_matrix("r(firstmat)", firstmat) + +} // end program s_ffirst + +// ********************************************************************** + +void s_omega( + string scalar ZZmatrix, + string scalar ename, + string scalar Znames, + string scalar touse, + string scalar weight, + string scalar wvarname, + scalar wf, + scalar N, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + scalar bw, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar ivarname, + string scalar tvarname, + string scalar tindexname, + scalar tdelta, + scalar dofminus) +{ + + struct ms_ivreg210_vcvorthog scalar vcvo + + vcvo.ename = ename + vcvo.Znames = Znames + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = st_matrix(ZZmatrix) + + st_view(Z, ., st_tsrevar(tokens(Znames)), touse) + st_view(wvar, ., st_tsrevar(wvarname), touse) + st_view(e, ., vcvo.ename, touse) + + vcvo.e = &e + vcvo.Z = &Z + vcvo.wvar = &wvar + + ZZ = st_matrix(ZZmatrix) + + S=m_ivreg210_omega(vcvo) + + st_matrix("r(S)", S) +} // end of s_omega program + +end + + +exit + +********************************** VERSION COMMENTS ********************************** +* Initial version cloned from official ivreg version 5.0.9 19Dec2001 +* 1.0.2: add logic for reg3. Sargan test +* 1.0.3: add prunelist to ensure that count of excluded exogeneous is correct +* 1.0.4: revise option to exog(), allow included exog to be specified as well +* 1.0.5: switch from reg3 to regress, many options and output changes +* 1.0.6: fixed treatment of nocons in Sargan and C-stat, and corrected problems +* relating to use of nocons combined with a constant as an IV +* 1.0.7: first option reports F-test of excluded exogenous; prunelist bug fix +* 1.0.8: dropped prunelist and switched to housekeeping of variable lists +* 1.0.9: added collinearity checks; C-stat calculated with recursive call; +* added ffirst option to report only F-test of excluded exogenous +* from 1st stage regressions +* 1.0.10: 1st stage regressions also report partial R2 of excluded exogenous +* 1.0.11: complete rewrite of collinearity approach - no longer uses calls to +* _rmcoll, does not track specific variables dropped; prunelist removed +* 1.0.12: reorganised display code and saved results to enable -replay()- +* 1.0.13: -robust- and -cluster- now imply -small- +* 1.0.14: fixed hascons bug; removed ivreg predict fn (it didn't work); allowed +* robust and cluster with z stats and correct dofs +* 1.0.15: implemented robust Sargan stat; changed to only F-stat, removed chi-sq; +* removed exog option (only orthog works) +* 1.0.16: added clusterised Sargan stat; robust Sargan handles collinearities; +* predict now works with standard SE options plus resids; fixed orthog() +* so it accepts time series operators etc. +* 1.0.17: fixed handling of weights. fw, aw, pw & iw all accepted. +* 1.0.18: fixed bug in robust Sargan code relating to time series variables. +* 1.0.19: fixed bugs in reporting ranks of X'X and Z'Z +* fixed bug in reporting presence of constant +* 1.0.20: added GMM option and replaced robust Sargan with (equivalent) J; +* added saved statistics of 1st stage regressions +* 1.0.21: added Cragg HOLS estimator, including allowing empty endog list; +* -regress- syntax now not allowed; revised code searching for "_cons" +* 1.0.22: modified cluster output message; fixed bug in replay for Sargan/Hansen stat; +* exactly identified Sargan/Hansen now exactly zero and p-value not saved as e(); +* cluster multiplier changed to 1 (from buggy multiplier), in keeping with +* eg Wooldridge 2002 p. 193. +* 1.0.23: fixed orthog option to prevent abort when restricted equation is underid. +* 1.0.24: fixed bug if 1st stage regressions yielded missing values for saving in e(). +* 1.0.25: Added Shea version of partial R2 +* 1.0.26: Replaced Shea algorithm with Godfrey algorithm +* 1.0.27: Main call to regress is OLS form if OLS or HOLS is specified; error variance +* in Sargan and C statistics use small-sample adjustment if -small- option is +* specified; dfn of S matrix now correctly divided by sample size +* 1.0.28: HAC covariance estimation implemented +* Symmetrize all matrices before calling syminv +* Added hack to catch F stats that ought to be missing but actually have a +* huge-but-not-missing value +* Fixed dof of F-stat - was using rank of ZZ, should have used rank of XX (couldn't use df_r +* because it isn't always saved. This is because saving df_r triggers small stats +* (t and F) even when -post- is called without dof() option, hence df_r saved only +* with -small- option and hence a separate saved macro Fdf2 is needed. +* Added rankS to saved macros +* Fixed trap for "no regressors specified" +* Added trap to catch gmm option with no excluded instruments +* Allow OLS syntax (no endog or excluded IVs specified) +* Fixed error messages and traps for rank-deficient robust cov matrix; includes +* singleton dummy possibility +* Capture error if posting estimated VCV that isn't pos def and report slightly +* more informative error message +* Checks 3 variable lists (endo, inexog, exexog) separately for collinearities +* Added AC (autocorrelation-consistent but conditionally-homoskedastic) option +* Sargan no longer has small-sample correction if -small- option +* robust, cluster, AC, HAC all passed on to first-stage F-stat +* bw must be < T +* 1.0.29 -orthog- also displays Hansen-Sargan of unrestricted equation +* Fixed collinearity check to include nocons as well as hascons +* Fixed small bug in Godfrey-Shea code - macros were global rather than local +* Fixed larger bug in Godfrey-Shea code - was using mixture of sigma-squares from IV and OLS +* with and without small-sample corrections +* Added liml and kclass +* 1.0.30 Changed order of insts macro to match saved matrices S and W +* 2.0.00 Collinearities no longer -qui- +* List of instruments tested in -orthog- option prettified +* 2.0.01 Fixed handling of nocons with no included exogenous, including LIML code +* 2.0.02 Allow C-test if unrestricted equation is just-identified. Implemented by +* saving Hansen-Sargan dof as = 0 in e() if just-identified. +* 2.0.03 Added score() option per latest revision to official ivreg +* 2.0.04 Changed score() option to pscore() per new official ivreg +* 2.0.05 Fixed est hold bug in first-stage regressions +* Fixed F-stat finite sample adjustment with cluster option to match official Stata +* Fixed F-stat so that it works with hascons (collinearity with constant is removed) +* Fixed bug in F-stat code - wasn't handling failed posting of vcv +* No longer allows/ignores nonsense options +* 2.0.06 Modified lsStop to sync with official ivreg 5.1.3 +* 2.0.07a Working version of CUE option +* Added sortpreserve, ivar and tvar options +* Fixed smalls bug in calculation of T for AC/HAC - wasn't using the last ob +* in QS kernel, and didn't take account of possible dropped observations +* 2.0.07b Fixed macro bug that truncated long varlists +* 2.0.07c Added dof option. +* Changed display of RMSE so that more digits are displayed (was %8.1g) +* Fixed small bug where cstat was local macro and should have been scalar +* Fixed bug where C stat failed with cluster. NB: wmatrix option and cluster are not compatible! +* 2.0.7d Fixed bug in dof option +* 2.1.0 Added first-stage identification, weak instruments, and redundancy stats +* 2.1.01 Tidying up cue option checks, reporting of cue in output header, etc. +* 2.1.02 Used Poskitt-Skeels (2002) result that C-D eval = cceval / (1-cceval) +* 2.1.03 Added saved lists of separate included and excluded exogenous IVs +* 2.1.04 Added Anderson-Rubin test of signif of endog regressors +* 2.1.05 Fix minor bugs relating to cluster and new first-stage stats +* 2.1.06 Fix bug in cue: capture estimates hold without corresponding capture on estimates unhold +* 2.1.07 Minor fix to ereturn local wexp, promote to version 8.2 +* 2.1.08 Added dofminus option, removed dof option. Added A-R test p-values to e(). +* Minor bug fix to A-R chi2 test - was N chi2, should have been N-L chi2. +* Changed output to remove potentially misleading refs to N-L etc. +* Bug fix to rhs count - sometimes regressors could have exact zero coeffs +* Bug fix related to cluster - if user omitted -robust-, orthog would use Sargan and not J +* Changed output of Shea R2 to make clearer that F and p-values do not refer to it +* Improved handling of collinearites to check across inexog, exexog and endo lists +* Total weight statement moved to follow summ command +* Added traps to catch errors if no room to save temporary estimations with _est hold +* Added -savefirst- option. Removed -hascons-, now synonymous with -nocons-. +* 2.1.09 Fixes to dof option with cluster so it no longer mimics incorrect areg behavior +* Local ivreg2_cmd to allow testing under name ivreg2 +* If wmatrix supplied, used (previously not used if non-robust sargan stat generated) +* Allowed OLS using (=) syntax (empty endo and exexog lists) +* Clarified error message when S matrix is not of full rank +* cdchi2p, ardf, ardf_r added to saved macros +* first and ffirst replay() options; DispFirst and DispFFirst separately codes 1st stage output +* Added savefprefix, macro with saved first-stage equation names. +* Added version option. +* Added check for duplicate variables to collinearity checks +* Rewrote/simplified Godfrey-Shea partial r2 code +* 2.1.10 Added NOOUTput option +* Fixed rf bug so that first does not trigger unnecessary saved rf +* Fixed cue bug - was not starting with robust 2-step gmm if robust/cluster +* 2.1.11 Dropped incorrect/misleading dofminus adjustments in first-stage output summary +* 2.1.12 Collinearity check now checks across inexog/exexog/endog simultaneously +* 2.1.13 Added check to catch failed first-stage regressions +* Fixed misleading failed C-stat message +* 2.1.14 Fixed mishandling of missing values in AC (non-robust) block +* 2.1.15 Fixed bug in RF - was ignoring weights +* Added -endog- option +* Save W matrix for all cases; ensured copy is posted with wmatrix option so original isn't zapped +* Fixed cue bug - with robust, was entering IV block and overwriting correct VCV +* 2.1.16 Added -fwl- option +* Saved S is now robust cov matrix of orthog conditions if robust, whereas W is possibly non-robust +* weighting matrix used by estmator. inv(S)=W if estimator is efficient GMM. +* Removed pscore option (dropped by official ivreg). +* Fixed bug where -post- would fail because of missing values in vcv +* Remove hascons as synonym for nocons +* OLS now outputs 2nd footer with variable lists +* 2.1.17 Reorganization of code +* Added ll() macro +* Fixed N bug where weights meant a non-integer ob count that was rounded down +* Fixed -fwl- option so it correctly handles weights (must include when partialling-out) +* smatrix option takes over from wmatrix option. Consistent treatment of both. +* Saved smatrix and wmatrix now differ in case of inefficient GMM. +* Added title() and subtitle() options. +* b0 option returns a value for the Sargan/J stat even if exactly id'd. +* (Useful for S-stat = value of GMM objective function.) +* HAC and AC now allowed with LIML and k-class. +* Collinearity improvements: bug fixed because collinearity was mistakenly checked across +* inexog/exexog/endog simultaneously; endog predicted exactly by IVs => reclassified as inexog; +* _rmcollright enforces inexog>endo>exexog priority for collinearities, if Stata 9.2 or later. +* K-class, LIML now report Sargan and J. C-stat based on Sargan/J. LIML reports AR if homosked. +* nb: can always easily get a C-stat for LIML based on diff of two AR stats. +* Always save Sargan-Hansen as e(j); also save as e(sargan) if homoskedastic. +* Added Stock-Watson robust SEs options sw() +* 2.1.18 Added Cragg-Donald-Stock-Yogo weak ID statistic critical values to main output +* Save exexog_ct, inexog_ct and endog_ct as macros +* Stock-Watson robust SEs now assume ivar is group variable +* Option -sw- is standard SW. Option -swpsd- is PSD version a la page 6 point 10. +* Added -noid- option. Suppresses all first-stage and identification statistics. +* Internal calls to ivreg2 use noid option. +* Added hyperlinks to ivreg2.hlp and helpfile argument to display routines to enable this. +* 2.1.19 Added matrix rearrangement and checks for smatrix and wmatrix options +* Recursive calls to cstat simplified - no matrix rearrangement or separate robust/nonrobust needed +* Reintroduced weak ID stats to ffirst output +* Added robust ID stats to ffirst output for case of single endogenous regressor +* Fixed obscure bug in reporting 1st stage partial r2 - would report zero if no included exogenous vars +* Removed "HOLS" in main output (misleading if, e.g., estimation is AC but not HAC) +* Removed "ML" in main output if no endogenous regressors - now all ML is labelled LIML +* model=gmm is now model=gmm2s; wmatrix estimation is model=gmm +* wmatrix relates to gmm estimator; smatrix relates to gmm var-cov matrix; b0 behavior equiv to wmatrix +* b0 option implies nooutput and noid options +* Added nocollin option to skip collinearity checks +* Fixed minor display bug in ffirst output for endog vars with varnames > 12 characters +* Fixed bug in saved rf and first-stage results for vars with long varnames; uses permname +* Fixed bug in model df - had counted RHS, now calculates rank(V) since latter may be rank-deficient +* Rank of V now saved as macro rankV +* fwl() now allows partialling-out of just constant with _cons +* Added Stock-Wright S statistic (but adds overhead - calls preserve) +* Properties now include svyj. +* Noted only: fwl bug doesn't allow time-series operators. +* 2.1.20 Fixed Stock-Wright S stat bug - didn't allow time-series operators +* 2.1.21 Fixed Stock-Wright S stat to allow for no exog regressors cases +* 2.2.00 CUE partials out exog regressors, estimates endog coeffs, then exog regressors separately - faster +* gmm2s becomes standard option, gmm supported as legacy option +* 2.2.01 Added explanatory messages if gmm2s used. +* States if estimates efficient for/stats consistent for het, AC, etc. +* Fixed small bug that prevented "{help `helpfile'##fwl:fwl}" from displaying when -capture-d. +* Error message in footer about insuff rank of S changed to warning message with more informative message. +* Fixed bug in CUE with weights. +* 2.2.02 Removed CUE partialling-out; still available with fwl +* smatrix and wmatrix become documented options. e(model)="gmmw" means GMM with arbitrary W +* 2.2.03 Fixed bug in AC with aweights; was weighting zi'zi but not ei'ei. +* 2.2.04 Added abw code for bw(), removed properties(svyj) +* 2.2.05 Fixed bug in AC; need to clear variable vt1 at start of loop +* If iweights, N (#obs with precision) rounded to nearest integer to mimic official Stata treatment +* and therefore don't need N scalar at all - will be same as N +* Saves fwl_ct as macro. +* -ffirst- output, weak id stat, etc. now adjust for number of partialled-out variables. +* Related changes: df_m, df_r include adjustments for partialled-out variables. +* Option nofwlsmall introduced - suppresses above adjustments. Undocumented in ivreg2.hlp. +* Replaced ID tests based on canon corr with Kleibergen-Paap rk-based stats if not homoskedastic +* Replaced LR ID test stats with LM test stats. +* Checks that -ranktest- is installed. +* 2.2.06 Fixed bug with missing F df when cue called; updated required version of ranktest +* 2.2.07 Modified redundancy test statistic to match standard regression-based LM tests +* Change name of -fwl- option to -partial-. +* Use of b0 means e(model)=CUE. Added informative b0 option titles. b0 generates output but noid. +* Removed check for integer bandwidth if auto option used. +* 2.2.08 Add -nocollin- to internal calls and to -ivreg2_cue- to speed performance. +* 2.2.09 Per msg from Brian Poi, Alastair Hall verifies that Newey-West cited constant of 1.1447 +* is correct. Corrected mata abw() function. Require -ranktest- 1.1.03. +* 2.2.10 Added Angrist-Pischke multivariate f stats. Rewrite of first and ffirst output. +* Added Cragg-Donald to weak ID output even when non-iid. +* Fixed small bug in non-robust HAC code whereby extra obs could be used even if dep var missing. +* (required addition of L`tau'.(`s1resid') in creation of second touse variable) +* Fixed bugs that zapped varnames with "_cons" in them +* Changed tvar and ivar setup so that data must be tsset or xtset. +* Fixed bug in redundancy test stat when called by xtivreg2+cluster - no dofminus adj needed in this case +* Changed reporting so that gaps between panels are not reported as such. +* Added check that weight variable is not transformed by partialling out. +* Changed Stock-Wright S statistic so that it uses straight partialling-out of exog regressors +* (had been, in effect, doing 2SGMM partialling-out) +* Fixed bug where dropped collinear endogenous didn't get a warning or listing +* Removed N*CDEV Wald chi-sq statistic from ffirst output (LM stat enough) +* 3.0.00 Fully rewritten and Mata-ized code. Require min Stata 10.1 and ranktest 1.2.00. +* Mata support for Stock-Watson SEs for fixed effects estimator; doesn't support fweights. +* Changed handling of iweights yielding non-integer N so that (unlike official -regress-) all calcs +* for RMSE etc. use non-integer N and N is rounded down only at the end. +* Added support for Thompson/Cameron-Gelbach-Miller 2-level cluster-robust vcvs. +* 3.0.01 Now exits more gracefully if no regressors survive after collinearity checks +* 3.0.02 -capture- instead of -qui- before reduced form to suppress not-full-rank error warning +* Modified Stock-Wright code to partial out all incl Xs first, to reduce possibility of not-full-rank +* omega and missing sstat. Added check within Stock-Wright code to catch not-full-rank omega. +* Fixed bug where detailed first-stage stats with cluster were disrupted if data had been tsset +* using a different variables. +* Fixed bug that didn't allow regression on just a constant. +* Added trap for no observations. +* Added trap for auto bw with panel data - not allowed. +* 3.0.03 Fixed bug in m_ivreg210_omega that always used Stock-Watson spectral decomp to create invertible shat +* instead of only when (undocumented) spsd option is called. +* Fixed bug where, if matsize too small, exited with wrong error (mistakenly detected as collinearities) +* Removed inefficient call to -ranktest- that unnecessarily requested stats for all ranks, not just full. +* 3.0.04 Fixed coding error in m_ivreg210_omega for cluster+kernel. Was *vcvo.e[tmatrix[.,1]], should have been (*vcvo.e)[tmatrix[.,1]]. +* Fixed bug whereby clusters defined by strings were not handled correctly. +* Updated ranktest version check +* 3.0.05 Added check to catch unwanted transformations of time or panel variables by partial option. +* 3.0.06 Fixed partial bug - partialcons macro saved =0 unless _cons explicitly in partial() varlist +* 3.0.07 kclass was defaulting to LIML - fixed. +* Renamed spsd option to psda (a=abs) following Stock-Watson 2008. Added psd0 option following Politis 2007. +* Fixed bug that would prevent RF and first-stage with cluster and TS operators if cluster code changed sort order. +* Modified action if S matrix is not full rank and 2-step GMM chosen. Now continue but report problem in footer +* and do not report J stat etc. +* 3.0.08 Fixed cluster+bw; was not using all observations of all panel units if panel was unbalanced. +* Fixed inconsequential bug in m_ivreg210_omega that caused kernel loop to be entered (with no impact) even if kernel=="" +* Fixed small bug that compared bw to T instead of (correctly) to T/delta when checking that bw can't be too long. +* Added dkraay option = cluster on t var + kernel-robust +* Added kiefer option = truncated kernel, bw=T (max), and no robust +* Fixed minor reporting bug that reported time-series gaps in entire panel dataset rather than just portion touse-d. +* Recoded bw and kernel checks into subroutine vkernel. Allow non-integer bandwidth within check as in ranktest. +* 3.1.01 First ivreg2 version with accompanying Mata library (shared with -ranktest-). Mata library includes +* struct ms_ivreg210_vcvorthog, m_ivreg210_omega, m_ivreg210_calckw, s_ivreg210_vkernel. +* Fixed bug in 2-way cluster code (now in m_ivreg210_omega in Mata library) - would crash if K>1 (relevant for -ranktest- only). +* 3.1.02 Converted cdsy to Mata code and moved to Mata library. Standardized spelling/caps/etc. of QS as "Quadratic Spectral". +* 3.1.03 Improved partialling out in s_sstat and s_ffirst: replaced qrsolve with invsym. +* 3.1.04 Fixed minor bug in s_crossprod - would crash with L1=0 K1>0, and also with K=0 +* 3.1.05 Fixed minor bug in orthog - wasn't saving est results if eqn w/o suspect instruments did not execute properly +* Fixed minor bug in s_cccollin() - didn't catch perverse case of K1>0 (endog regressors) and L1=0 (no excl IVs) +* 3.1.06 Spelling fix for Danielle kernel, correct error check for bw vs T-1 +* 3.1.07 Fixed bug that would prevent save of e(sample) when partialling out just a constant +* 3.1.08 01Jan14. Fixed reporting bug with 2-way clustering and kernel-robust that would give wrong count for 2nd cluster variable. +* 3.1.09 13July14. _rmcollright under version control has serious bug for v10 and earlier. Replaced with canon corr approach. +* Fixed obscure bug in estimation sample - was not using obs when tsset tvar is missing, even if TS operators not used. +* Fixed bug in auto bw code so now ivreg2 and ivregress agree. Also, ivreg2 auto bw code handles gaps in TS correctly. +* 3.1.10 17Jan15. First ivreg210. Mata library and ranktest now internal with names incorporating "_ivreg210_". +* Fixed bug in collinearity code - was not detecting some collinearities in joint inexog/exog list, +* so added extra call to _rmcoll to catch any remaining ones. + +* Version notes for imported version of ranktest: +* 1.0.00 First distributed version +* 1.0.01 With iweights, rkstat truncates N to mimic official Stata treatment of noninteger iweights +* Added warning if shat/vhat/vlab not of full rank. +* 1.0.02 Added NULLrank option +* Added eq names to saved V and S matrices +* 1.0.03 Added error catching for collinearities between varlists +* Not saving S matrix; V matrix now as in paper (without 1/N factor) +* Statistic, p-value etc set to missing if vcv not of full rank (Assumpt 2 in paper fails) +* 1.0.04 Fixed touse bug - was treating missings as touse-able +* Change some cross-products in robust loops to quadcross +* 1.0.05 Fixed bug with col/row names and ts operators. Added eval to saved matrices. +* 1.1.00 First ssc-ideas version. Added version 9.2 prior to Mata compiled section. +* 1.1.01 Allow non-integer bandwidth +* 1.1.02 Changed calc of yhat, zhat and pihat to avoid needlessly large intermediate matrices +* and to use more accurate qrsolve instead of inverted X'X. +* 1.1.03 Fixed touse bug that didn't catch missing cluster variable +* Fixed cluster bug - data needed to be sorted by cluster for Mata panel functions to work properly +* 1.2.00 Changed reporting so that gaps between panels are not reported as such. +* Added support for tdelta in tsset data. +* Changed tvar and ivar setup so that data must be tsset or xtset. +* Removed unnecessary loops through panel data with spectral kernels +* shat vcv now also saved. +* Added support for Thompson/Cameron-Gelbach-Miller 2-level cluster-robust vcvv +* Added support for Stock-Watson vcv - but requires data to have FEs partialled out, & doesn't support fweights +* Removed mimicking of Stata mistake of truncated N with iweights to nearest integer +* Fixed small bug with quadratic kernel (wasn't using negative weights) +* Optimised code dealing with time-series data +* 1.2.01 Fixed bug that always used Stock-Watson spectral decomp to create invertible shat +* instead of only when (undocumented) spsd option is called. +* 1.2.02 Fixed bug that did not allow string cluster variables +* 1.2.03 Fixed bug in code for cluster+kernel robust (typo in imported code from ivreg2=>crash) +* 1.2.04 Replaced code for S with ivreg2 code modified to support e matrix (cols > 1) +* Code block (m_omega, m_calckw, struct definition) now shared by ranktest and ivreg2. +* Renamed spsd option to psd following ivreg2 3.0.07 +* Added wf ("weight factor") and statement about sum of weights, as in ivreg2 +* Added dofminus option, as in ivreg2 +* Fixed minor reporting bug - was reporting gaps in entire panel, not just touse-d portion +* Recoded kernel & bw checks to use shared ivreg2 subroutine vkernel +* 1.2.05 Fixed weighting bug introduced in 1.2.04. All weights were affected. +* Was result of incompatibility of code shared with ivreg2. +* 1.3.01 First ranktest version with accompanying Mata library (shared with -ivreg2-). +* Mata library includes struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Fixed bug in 2-way cluster code (now in m_omega in Mata library) - would crash if K>1. +* 1.3.02 Improved partialling out and matrix inversion - switched from qrsolve to invsym. +* Use _makesymmetric() instead of symmetrizing by hand. +* 1.3.03 01Jan14. Fixed reporting bug with 2-way clustering and kernel-robust that would give +* wrong count for 2nd cluster variable. +* 1.3.04 24Aug14. Fixed bug in markout - would include obs where some vars were missing + +* Version notes for imported version of Mata library +* 1.1.01 First version of library. +* Contains struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Compiled in Stata 9.2 for compatibility with ranktest 1.3.01 (a 9.2 program). +* 1.1.02 Add routine cdsy. Standardized spelling/caps/etc. of QS as "Quadratic Spectral" +* 1.1.03 Corrected spelling of "Danielle" kernel in m_omega() +* 1.1.04 Fixed weighting bugs in robust and cluster code of m_omega where K>1 +* 1.1.05 Added whichlivreg2(.) to aid in version control +* 1.1.06 Fixed remaining weighting bug (see 1.1.04) in 2-way clustering when interection +* of clustering levels is groups +* 1.1.07 Fixed HAC bug that crashed m_omega(.) when there were no obs for a particular lag diff --git a/data/ado/i/ivreg210.sthlp b/data/ado/i/ivreg210.sthlp new file mode 100644 index 0000000..82e3449 --- /dev/null +++ b/data/ado/i/ivreg210.sthlp @@ -0,0 +1,1681 @@ +{smcl} +{* 12Sept2011}{...} +{hline} +help for {hi:ivreg210} +{hline} + +{title:Extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression} + +{p 4}Full syntax + +{p 8 14}{cmd:ivreg210} {it:depvar} [{it:varlist1}] +{cmd:(}{it:varlist2}{cmd:=}{it:varlist_iv}{cmd:)} [{it:weight}] +[{cmd:if} {it:exp}] [{cmd:in} {it:range}] +{bind:[{cmd:,} {cmd:gmm2s}} +{cmd:bw(}{it:#}{cmd:)} +{cmd:kernel(}{it:string}{cmd:)} +{cmd:dkraay(}{it:integer}{cmd:)} +{cmd:kiefer} +{cmd:liml} +{cmd:fuller(}{it:#}{cmd:)} +{cmd:kclass(}{it:#}{cmd:)} +{cmd:coviv} +{cmd:cue} +{cmd:b0}{cmd:(}{it:matrix}{cmd:)} +{cmdab:r:obust} +{cmdab:cl:uster}{cmd:(}{it:varlist}{cmd:)} +{cmd:orthog(}{it:varlist_ex}{cmd:)} +{cmd:endog(}{it:varlist_en}{cmd:)} +{cmdab:red:undant(}{it:varlist_ex}{cmd:)} +{cmd:partial(}{it:varlist}{cmd:)} +{cmdab:sm:all} +{cmdab:noc:onstant} {cmdab:h}ascons +{cmd:smatrix}{cmd:(}{it:matrix}{cmd:)} +{cmd:wmatrix}{cmd:(}{it:matrix}{cmd:)} +{cmd:first} {cmd:ffirst} {cmd:savefirst} {cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:rf} {cmd:saverf} {cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:nocollin} {cmd:noid} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{bind:{cmd:plus} ]} + +{p 4}Replay syntax + +{p 8 14}{cmd:ivreg210} +{bind:[{cmd:,} {cmd:first}} +{cmd:ffirst} {cmd:rf} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{cmd:plus} ]} + +{p 4}Version syntax + +{p 8 14}{cmd:ivreg210}, {cmd:version} + +{p}{cmd:ivreg210} is compatible with Stata version 10.1 or later. + +{p}{cmd:ivreg210} may be used with time-series or panel data, +in which case the data must be {cmd:tsset} +before using {cmd:ivreg210}; see help {help tsset}. + +{p}All {it:varlists} may contain time-series operators, +but factor variables are not currently supported; +see help {help varlist}. + +{p}{cmd:by}, {cmd:rolling}, {cmd:statsby}, {cmd:xi}, +{cmd:bootstrap} and {cmd:jackknife} are allowed; see help {help prefix}. + +{p}{cmd:aweight}s, {cmd:fweight}s, {cmd:iweight}s and {cmd:pweight}s +are allowed; see help {help weights}. + +{p}The syntax of {help predict} following {cmd:ivreg210} is + +{p 8 16}{cmd:predict} [{it:type}] {it:newvarname} [{cmd:if} {it:exp}] +[{cmd:in} {it:range}] [{cmd:,} {it:statistic}] + +{p}where {it:statistic} is + +{p 8 23}{cmd:xb}{space 11}fitted values; the default{p_end} +{p 8 23}{cmdab:r:esiduals}{space 4}residuals{p_end} +{p 8 23}{cmd:stdp}{space 9}standard error of the prediction{p_end} + +{p}These statistics are available both in and out of sample; +type "{cmd:predict} {it:...} {cmd:if e(sample)} {it:...}" +if wanted only for the estimation sample. + +{title:Contents} +{p 2}{help ivreg2##s_description:Description}{p_end} +{p 2}{help ivreg2##s_robust:Robust, cluster and 2-way cluster, AC, HAC, and cluster+HAC SEs and statistics}{p_end} +{p 2}{help ivreg2##s_gmm:GMM estimation}{p_end} +{p 2}{help ivreg2##s_liml:LIML, k-class and GMM-CUE estimation}{p_end} +{p 2}{help ivreg2##s_sumopt:Summary of robust, HAC, AC, GMM, LIML and CUE options}{p_end} +{p 2}{help ivreg2##s_overid:Testing overidentifying restrictions}{p_end} +{p 2}{help ivreg2##s_endog:Testing subsets of regressors and instruments for endogeneity}{p_end} +{p 2}{help ivreg2##s_relevance:Tests of under- and weak identification}{p_end} +{p 2}{help ivreg2##s_redundancy:Testing instrument redundancy}{p_end} +{p 2}{help ivreg2##s_first:First-stage regressions, identification, and weak-id-robust inference}{p_end} +{p 2}{help ivreg2##s_rf:Reduced form estimates}{p_end} +{p 2}{help ivreg2##s_partial:Partialling-out exogenous regressors}{p_end} +{p 2}{help ivreg2##s_ols:OLS and Heteroskedastic OLS (HOLS) estimation}{p_end} +{p 2}{help ivreg2##s_collin:Collinearities}{p_end} +{p 2}{help ivreg2##s_speed:Speed options: nocollin and noid}{p_end} +{p 2}{help ivreg2##s_small:Small sample corrections}{p_end} +{p 2}{help ivreg2##s_options:Options summary}{p_end} +{p 2}{help ivreg2##s_macros:Remarks and saved results}{p_end} +{p 2}{help ivreg2##s_examples:Examples}{p_end} +{p 2}{help ivreg2##s_refs:References}{p_end} +{p 2}{help ivreg2##s_acknow:Acknowledgements}{p_end} +{p 2}{help ivreg2##s_citation:Authors}{p_end} +{p 2}{help ivreg2##s_citation:Citation of ivreg210}{p_end} + +{marker s_description}{title:Description} + +{p}{cmd:ivreg210} implements a range of single-equation estimation methods +for the linear regression model: OLS, instrumental +variables (IV, also known as two-stage least squares, 2SLS), +the generalized method of moments (GMM), +limited-information maximum likelihood (LIML), and k-class estimators. +In the language of IV/GMM, {it:varlist1} are the exogenous +regressors or "included instruments", +{it:varlist_iv} are the exogenous variables excluded +from the regression or "excluded instruments", +and {it:varlist2} the endogenous regressors that are being "instrumented". + +{p}{cmd:ivreg210} will also estimate linear regression models using +robust (heteroskedastic-consistent), +autocorrelation-consistent (AC), +heteroskedastic and autocorrelation-consistent (HAC) +and cluster-robust variance estimates. + +{p}{cmd:ivreg210} is an alternative to Stata's official {cmd:ivregress}. +Its features include: +two-step feasible GMM estimation ({cmd:gmm2s} option) +and continuously-updated GMM estimation ({cmd:cue} option); +LIML and k-class estimation; +automatic output of overidentification and underidentification test statistics; +C statistic test of exogeneity of subsets of instruments +({cmd:orthog()} option); +endogeneity tests of endogenous regressors +({cmd:endog()} option); +test of instrument redundancy +({cmd:redundant()} option); +kernel-based autocorrelation-consistent (AC) +and heteroskedastic and autocorrelation consistent (HAC) standard errors +and covariance estimation ({cmd:bw(}{it:#}{cmd:)} option), +with user-specified choice of kernel ({cmd:kernel()} option); +two-level {cmd:cluster}-robust standard errors and statistics; +default reporting of large-sample statistics +(z and chi-squared rather than t and F); +{cmd:small} option to report small-sample statistics; +first-stage regressions reported with various tests and statistics for +identification and instrument relevance; +{cmd:ffirst} option to report only these identification statistics +and not the first-stage regression results themselves. +{cmd:ivreg210} can also be used for ordinary least squares (OLS) estimation +using the same command syntax as official {cmd:regress} and {cmd:newey}. + +{marker s_robust}{dlgtab:Robust, cluster and 2-level cluster, AC, HAC, and cluster+HAC SEs and statistics} + +{p}The standard errors and test statistics reported by {cmd:ivreg210} can be made consistent +to a variety of violations of the assumption of i.i.d. errors. +When these options are combined with +either the {cmd:gmm2s} or {cmd:cue} options (see below), +the parameter estimators reported are also efficient +in the presence of the same violation of i.i.d. errors. + +{p}The options for SEs and statistics are:{break} +{bind:(1) {cmd:robust}} causes {cmd:ivreg210} to report SEs and statistics that are +robust to the presence of arbitrary heteroskedasticity.{break} +{bind:(2) {cmd:cluster}({it:varname})} SEs and statistics are robust to both +arbitrary heteroskedasticity and arbitrary intra-group correlation, +where {it:varname} identifies the group. +See the relevant Stata manual entries on obtaining robust covariance estimates +for further details.{break} +{bind:(3) {cmd:cluster}({it:varname1 varname2})} provides 2-way clustered SEs +and statistics (Cameron et al. 2006, Thompson 2009) +that are robust to arbitrary heteroskedasticity and intra-group correlation +with respect to 2 non-nested categories defined by {it:varname1} and {it:varname2}. +See below for a detailed description.{break} +{bind:(4) {cmd:bw(}{it:#}{cmd:)}} requests AC SEs and statistics that are +robust to arbitrary autocorrelation.{break} +{bind:(5) {cmd:bw(}{it:#}{cmd:)}} combined with {cmd:robust} +requests HAC SEs and statistics that are +robust to both arbitrary heteroskedasticity and arbitrary autocorrelation.{break} +{bind:(6) {cmd:bw(}{it:#}{cmd:)}} combined with {cmd:cluster}({it:varname}) +is allowed with either 1- or 2-level clustering if the data are panel data +that are {cmd:tsset} on the time variable {it:varname}. +Following Driscoll and Kray (1998), +the SEs and statistics reported will be robust to disturbances +that are common to panel units and that are persistent, i.e., autocorrelated.{break} +{bind:(7) {cmd:dkraay(}{it:#}{cmd:)}} is a shortcut for the Driscoll-Kraay SEs +for panel data in (6). +It is equivalent to clustering on the {cmd:tsset} time variable +and the bandwidth supplied as {it:#}. +The default kernel Bartlett kernel can be overridden with the {cmd:kernel} option.{break} +{bind:(8) {cmd:kiefer}} implements SEs and statistics for panel data +that are robust to arbitrary intra-group autocorrelation +(but {it:not} heteroskedasticity) as per Kiefer (1980). +It is equivalent to to specifying the truncated kernel with {cmd:kernel(tru)} +and {cmd:bw(}{it:#}{cmd:)} where {it:#} is the full length of the panel. + +{p}Details: + +{p}{cmd:cluster}({it:varname1 varname2}) provides 2-way cluster-robust SEs +and statistics as proposed by Cameron, Gelbach and Miller (2006) and Thompson (2009). +"Two-way cluster-robust" means the SEs and statistics +are robust to arbitrary within-group correlation in two distinct non-nested categories +defined by {it:varname1} and {it:varname2}. +A typical application would be panel data where one "category" is the panel +and the other "category" is time; +the resulting SEs are robust +to arbitrary within-panel autocorrelation (clustering on panel id) +and to arbitrary contemporaneous cross-panel correlation (clustering on time). +There is no point in using 2-way cluster-robust SEs if the categories are nested, +because the resulting SEs are equivalent to clustering on the larger category. +{it:varname1} and {it:varname2} do not have to +uniquely identify observations. +The order of {it:varname1} and {it:varname2} does not matter for the results, +but processing may be faster if the category with the larger number of categories +(typically the panel dimension) is listed first. + +{p}Cameron, Gelbach and Miller (2006) show how this approach can accommodate +multi-way clustering, where the number of different non-nested categories is arbitary. +Their Stata command {cmd:cgmreg} implements 2-way and multi-way clustering +for OLS estimation. +The two-way clustered variance-covariance estimator +is calculated using 3 different VCEs: one clustered on {it:varname1}, +the second clustered on {it:varname2}, and the third clustered on the +intersection of {it:varname1} and {it:varname2}. +Cameron et al. (2006, pp. 8-9) discuss two possible small-sample adjustments +using the number of clusters in each category. +{cmd:cgmreg} uses one method (adjusting the 3 VCEs separately based on +the number of clusters in the categories VCE clusters on); +{cmd:ivreg210} uses the second (adjusting the final 2-way cluster-robust VCE +using the smaller of the two numbers of clusters). +For this reason, {cmd:ivreg210} and {cmd:cgmreg} will produce slightly different SEs. +See also {help ivreg2##s_small:small sample corrections} below. + +{p}{cmd:ivreg210} allows a variety of options for kernel-based HAC and AC estimation. +The {cmd:bw(}{it:#}{cmd:)} option sets the bandwidth used in the estimation +and {cmd:kernel(}{it:string}{cmd:)} is the kernel used; +the default kernel is the Bartlett kernel, +also known in econometrics as Newey-West (see help {help newey}). +The full list of kernels available is (abbreviations in parentheses): +Bartlett (bar); Truncated (tru); Parzen (par); Tukey-Hanning (thann); +Tukey-Hamming (thamm); Daniell (dan); Tent (ten); and Quadratic-Spectral (qua or qs). +When using the Bartlett, Parzen, or Quadratic spectral kernels, the automatic +bandwidth selection procedure of Newey and West (1994) can be chosen +by specifying {cmd:bw(}{it:auto}{cmd:)}. +{cmd:ivreg210} can also be used for kernel-based estimation +with panel data, i.e., a cross-section of time series. +Before using {cmd:ivreg210} for kernel-based estimation +of time series or panel data, +the data must be {cmd:tsset}; see help {help tsset}. + +{p}Following Driscoll and Kraay (1998), +{cmd:bw(}{it:#}{cmd:)} combined with {cmd:cluster}({it:varname}) +and applied to panel data produces SEs that are +robust to arbitary common autocorrelated disturbances. +The data must be {cmd:tsset} with the time variable specified as {it:varname}. +Driscoll-Kraay SEs also can be specified using the {cmd:dkraay(}{it:#}{cmd:)}} option, +where {it:#} is the bandwidth. +The default Bartlett kernel can be overridden with the {cmd:kernel} option. +Note that the Driscoll-Kraay variance-covariance estimator is a large-T estimator, +i.e., the panel should have a long-ish time-series dimension. + +{p}Used with 2-way clustering as per Thompson (2009), +{cmd:bw(}{it:#}{cmd:)} combined with {cmd:cluster}({it:varname}) +provides SEs and statistics that are robust +to autocorrelated within-panel disturbances (clustering on panel id) +and to autocorrelated across-panel disturbances (clustering on time +combined with kernel-based HAC). +The approach proposed by Thompson (2009) can be implemented in {cmd:ivreg210} +by choosing the truncated kernel {cmd:kernel(}{it:tru}{cmd:)} +and {cmd:bw(}{it:#}{cmd:)}, where the researcher knows or assumes +that the common autocorrelated disturbances can be ignored after {it:#} periods. + +{p}{cmd:Important:} Users should be aware of the asymptotic requirements +for the consistency of the chosen VCE. +In particular: consistency of the 1-way cluster-robust VCE requires +the number of clusters to go off to infinity; +consistency of the 2-way cluster-robust VCE requires the numbers of +clusters in both categories to go off to infinity; +consistency of kernel-robust VCEs requires the numbers of +observations in the time dimension to go off to infinity. +See Angrist and Pischke (2009), Cameron et al. (2006) and Thompson (2009) +for detailed discussions of the performance of the cluster-robust VCE +when the numbers of clusters is small. + +{marker s_gmm}{dlgtab:GMM estimation} + +{p}When combined with the above options, the {cmd:gmm2s} option generates +efficient estimates of the coefficients as well as consistent +estimates of the standard errors. +The {cmd:gmm2s} option implements the two-step efficient +generalized method of moments (GMM) estimator. +The efficient GMM estimator minimizes the GMM criterion function +J=N*g'*W*g, where N is the sample size, +g are the orthogonality or moment conditions +(specifying that all the exogenous variables, or instruments, +in the equation are uncorrelated with the error term) +and W is a weighting matrix. +In two-step efficient GMM, the efficient or optimal weighting matrix +is the inverse of an estimate of the covariance matrix of orthogonality conditions. +The efficiency gains of this estimator relative to the +traditional IV/2SLS estimator derive from the use of the optimal +weighting matrix, the overidentifying restrictions of the model, +and the relaxation of the i.i.d. assumption. +For an exactly-identified model, +the efficient GMM and traditional IV/2SLS estimators coincide, +and under the assumptions of conditional homoskedasticity and independence, +the efficient GMM estimator is the traditional IV/2SLS estimator. +For further details, see Hayashi (2000), pp. 206-13 and 226-27. + +{p}The {cmd:wmatrix} option allows the user to specify a weighting matrix +rather than computing the optimal weighting matrix. +Estimation with the {cmd:wmatrix} option yields a possibly inefficient GMM estimator. +{cmd:ivreg210} will use this inefficient estimator as the first-step GMM estimator +in two-step efficient GMM when combined with the {cmd:gmm2s} option; +otherwise, {cmd:ivreg210} reports the regression results +using this inefficient GMM estimator. + +{p}The {cmd:smatrix} option allows the user to directly +specify the matrix S, the covariance matrix of orthogonality conditions. +{cmd:ivreg210} will use this matrix in the calculation of the variance-covariance +matrix of the estimator, the J statistic, +and, if the {cmd:gmm2s} option is specified, +the two-step efficient GMM coefficients. +The {cmd:smatrix} can be useful for guaranteeing a positive test statistic +in user-specified "GMM-distance tests" (see {help ivreg2##s_endog:below}). +For further details, see Hayashi (2000), pp. 220-24. + +{marker s_liml}{dlgtab:LIML, k-class and GMM-CUE estimation} + +{marker liml}{p} Maximum-likelihood estimation of a single equation of this form +(endogenous RHS variables and excluded instruments) +is known as limited-information maximum likelihood or LIML. +The overidentifying restrictions test +reported after LIML estimation is the Anderson-Rubin (1950) overidentification +statistic in a homoskedastic context. +LIML, OLS and IV/2SLS are examples of k-class estimators. +LIML is a k-class estimator with k=the LIML eigenvalue lambda; +2SLS is a k-class estimator with k=1; +OLS is a k-class esimator with k=0. +Estimators based on other values of k have been proposed. +Fuller's modified LIML (available with the {cmd:fuller(}{it:#}{cmd:)} option) +sets k = lambda - alpha/(N-L), where lambda is the LIML eigenvalue, +L = number of instruments (L1 excluded and L2 included), +and the Fuller parameter alpha is a user-specified positive constant. +Nagar's bias-adjusted 2SLS estimator can be obtained with the +{cmd:kclass(}{it:#}{cmd:)} option by setting +k = 1 + (L-K)/N, where L-K = number of overidentifying restrictions, +K = number of regressors (K1 endogenous and K2=L2 exogenous) +and N = the sample size. +For a discussion of LIML and k-class estimators, +see Davidson and MacKinnon (1993, pp. 644-51). + +{p} The GMM generalization of the LIML estimator +to the case of possibly heteroskedastic +and autocorrelated disturbances +is the "continuously-updated" GMM estimator or CUE +of Hansen, Heaton and Yaron (1996). +The CUE estimator directly maximizes the GMM objective function +J=N*g'*W(b_cue)*g, where W(b_cue) is an optimal weighting matrix +that depends on the estimated coefficients b_cue. +{cmd:cue}, combined with {cmd:robust}, {cmd:cluster}, and/or {cmd:bw}, +generates coefficient estimates that are efficient in the presence +of the corresponding deviations from homoskedasticity. +Specifying {cmd:cue} with no other options +is equivalent to the combination of the options {cmd:liml} and {cmd:coviv}. +The CUE estimator requires numerical optimization methods, +and the implementation here uses Mata's {cmd:optimize} routine. +The starting values are either IV or two-step efficient GMM +coefficient estimates. +If the user wants to evaluate the CUE objective function at +an arbitrary user-defined coefficient vector instead of having {cmd:ivreg210} +find the coefficient vector that minimizes the objective function, +the {cmd:b0(}{it:matrix}{cmd:)} option can be used. +The value of the CUE objective function at {cmd:b0} +is the Sargan or Hansen J statistic reported in the output. + +{marker s_sumopt}{dlgtab:Summary of robust, HAC, AC, GMM, LIML and CUE options} + + + +Estimator {col 20}No VCE option specificed {col 65}VCE option + option {col 60}{cmd:robust}, {cmd:cluster}, {cmd:bw}, {cmd:kernel} +{hline} +(none){col 15}IV/2SLS{col 60}IV/2SLS with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:liml}{col 15}LIML{col 60}LIML with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:gmm2s}{col 15}IV/2SLS{col 60}Two-step GMM with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:cue}{col 15}LIML{col 60}CUE GMM with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:kclass}{col 15}k-class estimator{col 60}k-class estimator with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:wmatrix}{col 15}Possibly inefficient GMM{col 60}Ineff GMM with +{col 15}SEs consistent under homoskedasticity{col 60}robust SEs + +{cmd:gmm2s} + {col 15}Two-step GMM{col 60}Two-step GMM with +{cmd:wmatrix}{col 15}with user-specified first step{col 60}robust SEs +{col 15}SEs consistent under homoskedasticity + + +{p}With the {cmd:bw} or {cmd:bw} and {cmd:kernel} VCE options, +SEs are autocorrelation-robust (AC). +Combining the {cmd:robust} option with {cmd:bw}, SEs are heteroskedasticity- and +autocorrelation-robust (HAC). + +{p}For further details, see Hayashi (2000), pp. 206-13 and 226-27 +(on GMM estimation), Wooldridge (2002), p. 193 (on cluster-robust GMM), +and Hayashi (2000), pp. 406-10 or Cushing and McGarvey (1999) +(on kernel-based covariance estimation). + +{marker s_overid}{marker overidtests}{dlgtab:Testing overidentifying restrictions} + +{p}The Sargan-Hansen test is a test of overidentifying restrictions. +The joint null hypothesis is that the instruments are valid +instruments, i.e., uncorrelated with the error term, +and that the excluded instruments are correctly excluded from the estimated equation. +Under the null, the test statistic is distributed as chi-squared +in the number of (L-K) overidentifying restrictions. +A rejection casts doubt on the validity of the instruments. +For the efficient GMM estimator, the test statistic is +Hansen's J statistic, the minimized value of the GMM criterion function. +For the 2SLS estimator, the test statistic is Sargan's statistic, +typically calculated as N*R-squared from a regression of the IV residuals +on the full set of instruments. +Under the assumption of conditional homoskedasticity, +Hansen's J statistic becomes Sargan's statistic. +The J statistic is consistent in the presence of heteroskedasticity +and (for HAC-consistent estimation) autocorrelation; +Sargan's statistic is consistent if the disturbance is homoskedastic +and (for AC-consistent estimation) if it is also autocorrelated. +With {cmd:robust}, {cmd:bw} and/or {cmd:cluster}, +Hansen's J statistic is reported. +In the latter case the statistic allows observations +to be correlated within groups. +For further discussion see e.g. Hayashi (2000, pp. 227-8, 407, 417). + +{p}The Sargan statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg210} by the command {cmd:overid}. +The features of {cmd:ivreg210} that are unavailable in {cmd:overid} +are the J statistic and the C statistic; +the {cmd:overid} options unavailable in {cmd:ivreg210} +are various small-sample and pseudo-F versions of Sargan's statistic +and its close relative, Basmann's statistic. +See help {help overid} (if installed). + +{marker s_endog}{dlgtab:Testing subsets of regressors and instruments for endogeneity} + +{marker ctest}{p}The C statistic +(also known as a "GMM distance" +or "difference-in-Sargan" statistic) +implemented using the {cmd:orthog} option, +allows a test of a subset of the orthogonality conditions, i.e., +it is a test of the exogeneity of one or more instruments. +It is defined as +the difference of the Sargan-Hansen statistic +of the equation with the smaller set of instruments +(valid under both the null and alternative hypotheses) +and the equation with the full set of instruments, +i.e., including the instruments whose validity is suspect. +Under the null hypothesis that +both the smaller set of instruments +and the additional, suspect instruments are valid, +the C statistic is distributed as chi-squared +in the number of instruments tested. +Note that failure to reject the null hypothesis +requires that the full set of orthogonality conditions be valid; +the C statistic and the Sargan-Hansen test statistics +for the equations with both the smaller and full set of instruments +should all be small. +The instruments tested may be either excluded or included exogenous variables. +If excluded exogenous variables are being tested, +the equation that does not use these orthogonality conditions +omits the suspect instruments from the excluded instruments. +If included exogenous variables are being tested, +the equation that does not use these orthogonality conditions +treats the suspect instruments as included endogenous variables. +To guarantee that the C statistic is non-negative in finite samples, +the estimated covariance matrix of the full set orthogonality conditions +is used to calculate both Sargan-Hansen statistics +(in the case of simple IV/2SLS, this amounts to using the MSE +from the unrestricted equation to calculate both Sargan statistics). +If estimation is by LIML, the C statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For further discussion, see Hayashi (2000), pp. 218-22 and pp. 232-34. + +{marker endogtest}{p}Endogeneity tests of one or more endogenous regressors +can implemented using the {cmd:endog} option. +Under the null hypothesis that the specified endogenous regressors +can actually be treated as exogenous, the test statistic is distributed +as chi-squared with degrees of freedom equal to the number of regressors tested. +The endogeneity test implemented by {cmd:ivreg210}, is, like the C statistic, +defined as the difference of two Sargan-Hansen statistics: +one for the equation with the smaller set of instruments, +where the suspect regressor(s) are treated as endogenous, +and one for the equation with the larger set of instruments, +where the suspect regressors are treated as exogenous. +Also like the C statistic, the estimated covariance matrix used +guarantees a non-negative test statistic. +Under conditional homoskedasticity, +this endogeneity test statistic is numerically equal to +a Hausman test statistic; see Hayashi (2000, pp. 233-34). +The endogeneity test statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg210} by the command {cmd:ivendog}. +Unlike the Durbin-Wu-Hausman tests reported by {cmd:ivendog}, +the {cmd:endog} option of {cmd:ivreg210} can report test statistics +that are robust to various violations of conditional homoskedasticity; +the {cmd:ivendog} option unavailable in {cmd:ivreg210} +is the Wu-Hausman F-test version of the endogeneity test. +See help {help ivendog} (if installed). + +{marker s_relevance}{dlgtab:Tests of under- and weak identification} + +{marker idtest}{p}{cmd:ivreg210} automatically reports tests of +both underidentification and weak identification. +The underidentification test is an LM test of whether the equation is identified, +i.e., that the excluded instruments are "relevant", +meaning correlated with the endogenous regressors. +The test is essentially the test of the rank of a matrix: +under the null hypothesis that the equation is underidentified, +the matrix of reduced form coefficients on the L1 excluded instruments +has rank=K1-1 where K1=number of endogenous regressors. +Under the null, +the statistic is distributed as chi-squared +with degrees of freedom=(L1-K1+1). +A rejection of the null indicates that the matrix is full column rank, +i.e., the model is identified. + +{p}For a test of whether a particular endogenous regressor alone is identified, +see the discussion {help ivreg2##apstats:below} of the Angrist-Pischke (2009) procedure. + +{p}When errors are assumed to be i.i.d., +{cmd:ivreg210} automatically reports an LM version of +the Anderson (1951) canonical correlations test. +Denoting the minimum eigenvalue of the canonical correlations as CCEV, +the smallest canonical correlation between the K1 endogenous regressors +and the L1 excluded instruments +(after partialling out the K2=L2 exogenous regressors) +is sqrt(CCEV), +and the Anderson LM test statistic is N*CCEV, +i.e., N times the square of the smallest canonical correlation. +With the {cmd:first} or {cmd:ffirst} options, +{cmd:ivreg210} also reports the closely-related +Cragg-Donald (1993) Wald test statistic. +Again assuming i.i.d. errors, +and denoting the minimum eigenvalue of the Cragg-Donald statistic as CDEV, +CDEV=CCEV/(1-CCEV), +and the Cragg-Donald Wald statistic is N*CDEV. +Like the Anderson LM statistic, the Cragg-Donald Wald statistic +is distributed as chi-squred with (L1-K1+1) degrees of freedom. +Note that a result of rejection of the null +should be treated with caution, +because weak instrument problems may still be present. +See Hall et al. (1996) for a discussion of this test, +and below for discussion of testing for the presence of weak instruments. + +{p}When the i.i.d. assumption is dropped +and {cmd:ivreg210} reports heteroskedastic, AC, HAC +or cluster-robust statistics, +the Anderson LM and Cragg-Donald Wald statistics are no longer valid. +In these cases, {cmd:ivreg210} reports the LM and Wald versions +of the Kleibergen-Paap (2006) rk statistic, +also distributed as chi-squared with (L1-K1+1) degrees of freedom. +The rk statistic can be seen as a generalization of these tests +to the case of non-i.i.d. errors; +see Kleibergen and Paap (2006) for discussion, +and Kleibergen and Schaffer (2007) for a Stata implementation, {cmd:ranktest}. +{cmd:ivreg210} requires {cmd:ranktest} to be installed, +and will prompt the user to install it if necessary. +If {cmd:ivreg210} is invoked with the {cmd:robust} option, +the rk underidentification test statistics will be heteroskedastic-robust, +and similarly with {cmd:bw} and {cmd:cluster}. + +{marker widtest}{p}"Weak identification" arises when the excluded instruments are correlated +with the endogenous regressors, but only weakly. +Estimators can perform poorly when instruments are weak, +and different estimators are more robust to weak instruments (e.g., LIML) +than others (e.g., IV); +see, e.g., Stock and Yogo (2002, 2005) for further discussion. +When errors are assumed to be i.i.d., +the test for weak identification automatically reported +by {cmd:ivreg210} is an F version of the Cragg-Donald Wald statistic, (N-L)/L1*CDEV, +where L is the number of instruments and L1 is the number of excluded instruments. +Stock and Yogo (2005) have compiled critical values +for the Cragg-Donald F statistic for +several different estimators (IV, LIML, Fuller-LIML), +several different definitions of "perform poorly" (based on bias and test size), +and a range of configurations (up to 100 excluded instruments +and up to 2 or 3 endogenous regressors, +depending on the estimator). +{cmd:ivreg210} will report the Stock-Yogo critical values +if these are available; +missing values mean that the critical values +haven't been tabulated or aren't applicable. +See Stock and Yogo (2002, 2005) for details. + +{p}When the i.i.d. assumption is dropped +and {cmd:ivreg210} is invoked with the {cmd:robust}, {cmd:bw} or {cmd:cluster} options, +the Cragg-Donald-based weak instruments test is no longer valid. +{cmd:ivreg210} instead reports a correspondingly-robust +Kleibergen-Paap Wald rk F statistic. +The degrees of freedom adjustment for the rk statistic is (N-L)/L1, +as with the Cragg-Donald F statistic, +except in the cluster-robust case, +when the adjustment is N/(N-1) * (N_clust-1)/N_clust, +following the standard Stata small-sample adjustment for cluster-robust. In the case of two-way clustering, N_clust is the minimum of N_clust1 and N_clust2. +The critical values reported by {cmd:ivreg210} for the Kleibergen-Paap statistic +are the Stock-Yogo critical values for the Cragg-Donald i.i.d. case. +The critical values reported with 2-step GMM +are the Stock-Yogo IV critical values, +and the critical values reported with CUE +are the LIML critical values. + +{marker s_redundancy}{dlgtab:Testing instrument redundancy} + +{marker redtest}{p}The {cmd:redundant} option allows a test of +whether a subset of excluded instruments is "redundant". +Excluded instruments are redundant if the asymptotic efficiency +of the estimation is not improved by using them. +Breusch et al. (1999) show that the condition for the redundancy of a set of instruments +can be stated in several equivalent ways: +e.g., in the reduced form regressions of the endogenous regressors +on the full set of instruments, +the redundant instruments have statistically insignificant coefficients; +or the partial correlations between the endogenous regressors +and the instruments in question are zero. +{cmd:ivreg210} uses a formulation based on testing the rank +of the matrix cross-product between the endogenous regressors +and the possibly-redundant instruments after both have +all other instruments partialled-out; +{cmd:ranktest} is used to test whether the matrix has zero rank. +The test statistic is an LM test +and numerically equivalent to a regression-based LM test. +Under the null that the specified instruments are redundant, +the statistic is distributed as chi-squared +with degrees of freedom=(#endogenous regressors)*(#instruments tested). +Rejection of the null indicates that +the instruments are not redundant. +When the i.i.d. assumption is dropped +and {cmd:ivreg210} reports heteroskedastic, AC, HAC +or cluster-robust statistics, +the redundancy test statistic is similarly robust. +See Baum et al. (2007) for further discussion. + +{p}Calculation and reporting of all underidentification +and weak identification statistics +can be supressed with the {cmd:noid} option. + +{marker s_first}{dlgtab:First-stage regressions, identification, and weak-id-robust inference} + +{marker apstats}{p}The {cmd:first} and {cmd:ffirst} options report +various first-stage results and identification statistics. +Tests of both underidentification and weak identification are reported +for each endogenous regressor separately, +using the method described by Angrist and Pischke (2009), pp. 217-18 +(see also the note on their "Mostly Harmless Econometrics" +{browse "http://www.mostlyharmlesseconometrics.com/2009/10/multivariate-first-stage-f-not/" :blog}. + +{p}The Angrist-Pischke (AP) first-stage chi-squared and F statistics +are tests of underidentification and weak identification, respectively, +of individual endogenous regressors. +They are constructed by "partialling-out" linear projections of the +remaining endogenous regressors. +The AP chi-squared Wald statistic is distributed as chi2(L1-K1+1)) +under the null that the particular endogenous regressor +in question is unidentified. +In the special case of a single endogenous regressor, +the AP statistic reported is identical to underidentification statistics reported +in the {cmd:ffirst} output, +namely the Cragg-Donald Wald statistic (if i.i.d.) +or the Kleibergen-Paap rk Wald statistic (if robust, cluster-robust, AC or HAC +statistics have been requested); +see {help ivreg2##idtest:above}. +Note the difference in the null hypotheses if there are two or more endogenous regressors: +the AP test will fail to reject if a particular endogenous regressor is unidentified, +whereas the Anderson/Cragg-Donald/Kleibergen-Paap tests of underidentification +will fail to reject if {it:any} of the endogenous regressors is unidentified. + +{p}The AP first-stage F statistic is the F form of the same test statistic. +It can be used as a diagnostic for whether a particular endogenous regressor +is "weakly identified" (see {help ivreg2##widtest:above}). +Critical values for the AP first-stage F as a test of weak identification are not available, +but the test statistic can be compared to the Stock-Yogo (2002, 2005) critical +values for the Cragg-Donald F statistic with K1=1. + +{p}The first-stage results are always reported with small-sample statistics, +to be consistent with the recommended use of the first-stage F-test as a diagnostic. +If the estimated equation is reported with robust standard errors, +the first-stage F-test is also robust. + +{p}A full set of first-stage statistics for each of the K1 endogenous regressors +is saved in the matrix e(first). +These include (a) the AP F and chi-squared statistics; (b) the "partial R-squared" +(squared partial correlation) corresponding to the AP statistics; +(c) Shea's (1997) partial R-squared measure (closely related to the AP statistic, +but not amenable to formal testing); (d) the simple F and partial R-squared +statistics for each of the first-stage equations, +with no adjustments if there is more than one endogenous regressor. +In the special case of a single endogenous regressor, +these F statistics and partial R-squareds are identical. + +{marker wirobust}{p}The first-stage output also includes +two statistics that provide weak-instrument robust inference +for testing the significance of the endogenous regressors in the structural equation being estimated. +The first statistic is the Anderson-Rubin (1949) test +(not to be confused with the Anderson-Rubin overidentification test for LIML estimation; +see {help ivreg2##s_liml:above}). +The second is the closely related Stock-Wright (2000) S statistic. +The null hypothesis tested in both cases is that +the coefficients of the endogenous regressors in the structural equation are jointly equal to zero, +and, in addition, that the overidentifying restrictions are valid. +Both tests are robust to the presence of weak instruments. +The tests are equivalent to estimating the reduced form of the equation +(with the full set of instruments as regressors) +and testing that the coefficients of the excluded instruments are jointly equal to zero. +In the form reported by {cmd:ivreg210},the Anderson-Rubin statistic is a Wald test +and the Stock-Wright S statistic is a GMM-distance test. +Both statistics are distributed as chi-squared with L1 degrees of freedom, +where L1=number of excluded instruments. +The traditional F-stat version of the Anderson-Rubin test is also reported. +See Stock and Watson (2000), Dufour (2003), Chernozhukov and Hansen (2005) and Kleibergen (2007) +for further discussion. +For related alternative test statistics that are also robust to weak instruments, +see {help condivreg} and {help rivtest}, +and the corresponding discussions +in Moreira and Poi (2003) and Mikusheva and Poi (2006), +and in Finlay and Magnusson (2009), respectively. + +{p}The {cmd:savefirst} option requests that the individual first-stage regressions +be saved for later access using the {cmd:estimates} command. +If saved, they can also be displayed using {cmd:first} or {cmd:ffirst} and the {cmd:ivreg210} replay syntax. +The regressions are saved with the prefix "_ivreg2_", +unless the user specifies an alternative prefix with the +{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} option. + +{marker s_rf}{dlgtab:Reduced form estimates} + +{p}The {cmd:rf} option requests that the reduced form estimation of the equation be displayed. +The {cmd:saverf} option requests that the reduced form estimation is saved +for later access using the {cmd:estimates} command. +If saved, it can also be displayed using the {cmd:rf} and the {cmd:ivreg210} replay syntax. +The regression is saved with the prefix "_ivreg2_", +unless the user specifies an alternative prefix with the +{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} option. + +{marker s_partial}{dlgtab:Partialling-out exogenous regressors} + +{marker partial}{p}The {cmd:partial(}{it:varlist}{cmd:)} option requests that +the exogenous regressors in {it:varlist} are "partialled out" +from all the other variables (other regressors and excluded instruments) in the estimation. +If the equation includes a constant, it is also automatically partialled out as well. +The coefficients corresponding to the regressors in {it:varlist} are not calculated. +By the Frisch-Waugh-Lovell (FWL) theorem, in IV, +two-step GMM and LIML estimation the coefficients for the remaining regressors +are the same as those that would be obtained if the variables were not partialled out. +(NB: this does not hold for CUE or GMM iterated more than two steps.) +The {cmd:partial} option is most useful when using {cmd:cluster} +and #clusters < (#exogenous regressors + #excluded instruments). +In these circumstances, +the covariance matrix of orthogonality conditions S is not of full rank, +and efficient GMM and overidentification tests are infeasible +since the optimal weighting matrix W = {bind:S^-1} +cannot be calculated. +The problem can be addressed by using {cmd:partial} +to partial out enough exogenous regressors for S to have full rank. +A similar problem arises when the regressors include a variable that is a singleton dummy, +i.e., a variable with one 1 and N-1 zeros or vice versa, +if a robust covariance matrix is requested. +The singleton dummy causes the robust covariance matrix estimator +to be less than full rank. +In this case, partialling-out the variable with the singleton dummy solves the problem. +Specifying {cmd:partial(_cons)} will cause just the constant to be partialled-out, +i.e., the equation will be estimated in deviations-from-means form. +When {cmd:ivreg210} is invoked with {cmd:partial}, +it reports test statistics with the same small-sample adjustments +as if estimating without {cmd:partial}. +Note that after estimation using the {cmd:partial} option, +the post-estimation {cmd:predict} can be used only to generate residuals, +and that in the current implementation, +{cmd:partial} is not compatible with endogenous variables or instruments (included or excluded) +that use time-series operators. + +{marker s_ols}{dlgtab:OLS and Heteroskedastic OLS (HOLS) estimation} + +{p}{cmd:ivreg21-} also allows straightforward OLS estimation +by using the same syntax as {cmd:regress}, i.e., +{it:ivreg210 depvar varlist1}. +This can be useful if the user wishes to use one of the +features of {cmd:ivreg210} in OLS regression, e.g., AC or +HAC standard errors. + +{p}If the list of endogenous variables {it:varlist2} is empty +but the list of excluded instruments {it:varlist_iv} is not, +and the option {cmd:gmm2s} is specified, +{cmd:ivreg210} calculates Cragg's "heteroskedastic OLS" (HOLS) estimator, +an estimator that is more efficient than OLS +in the presence of heteroskedasticity of unknown form +(see Davidson and MacKinnon (1993), pp. 599-600). +If the option {cmd:bw(}{it:#}{cmd:)} is specified, +the HOLS estimator is efficient in the presence of +arbitrary autocorrelation; +if both {cmd:bw(}{it:#}{cmd:)} and {cmd:robust} are specified +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and autocorrelation; +and if {cmd:cluster(}{it:varlist}{cmd:)} is used, +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and within-group correlation. +The efficiency gains of HOLS derive from the orthogonality conditions +of the excluded instruments listed in {it:varlist_iv}. +If no endogenous variables are specified and {cmd:gmm2s} is not specified, +{cmd:ivreg210} reports standard OLS coefficients. +The Sargan-Hansen statistic reported +when the list of endogenous variables {it:varlist2} is empty +is a Lagrange multiplier (LM) test +of the hypothesis that the excluded instruments {it:varlist_iv} are +correctly excluded from the restricted model. +If the estimation is LIML, the LM statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For more on LM tests, see e.g. Wooldridge (2002), pp. 58-60. +Note that because the approach of the HOLS estimator +has applications beyond heteroskedastic disturbances, +and to avoid confusion concerning the robustness of the estimates, +the estimators presented above as "HOLS" +are described in the output of {cmd:ivreg210} +as "2-Step GMM", "CUE", etc., as appropriate. + +{marker s_collin}{dlgtab:Collinearities} + +{p}{cmd:ivreg210} checks the lists of included instruments, +excluded instruments, and endogenous regressors +for collinearities and duplicates. If an endogenous regressor is +collinear with the instruments, it is reclassified as exogenous. If any +endogenous regressors are collinear with each other, some are dropped. +If there are any collinearities among the instruments, some are dropped. +In Stata 9+, excluded instruments are dropped before included instruments. +If any variables are dropped, a list of their names are saved +in the macros {cmd:e(collin)} and/or {cmd:e(dups)}. +Lists of the included and excluded instruments +and the endogenous regressors with collinear variables and duplicates removed +are also saved in macros with "1" appended +to the corresponding macro names. + +{p}Collinearity checks can be supressed with the {cmd:nocollin} option. + +{marker s_speed}{dlgtab:Speed options: nocollin and noid} + +{p}Two options are available for speeding execution. +{cmd:nocollin} specifies that the collinearity checks not be performed. +{cmd:noid} suspends calculation and reporting of +the underidentification and weak identification statistics +in the main output. + +{marker s_small}{dlgtab:Small sample corrections} + +{p}Mean square error = sqrt(RSS/(N-K)) if {cmd:small}, = sqrt(RSS/N) otherwise. + +{p}If {cmd:robust} is chosen, the finite sample adjustment +(see {hi:[R] regress}) to the robust variance-covariance matrix +qc = N/(N-K) if {cmd:small}, qc = 1 otherwise. + +{p}If {cmd:cluster} is chosen, the finite sample adjustment +qc = (N-1)/(N-K)*M/(M-1) if {cmd:small}, where M=number of clusters, +qc = 1 otherwise. +If 2-way clustering is used, M=min(M1,M2), +where M1=number of clusters in group 1 +and M2=number of clusters in group 2. + +{p}The Sargan and C (difference-in-Sargan) statistics use +error variance = RSS/N, i.e., there is no small sample correction. + +{p}A full discussion of these computations and related topics +can be found in Baum, Schaffer, and Stillman (2003) and Baum, Schaffer and +Stillman (2007). Some features of the program postdate the former article and are described in the latter paper. +Some features, such as two-way clustering, postdate the latter article as well. + + +{marker s_options}{title:Options summary} + +{p 0 4}{cmd:gmm2s} requests the two-step efficient GMM estimator. +If no endogenous variables are specified, the estimator is Cragg's HOLS estimator. + +{p 0 4}{cmd:liml} requests the limited-information maximum likelihood estimator. + +{p 0 4}{cmd:fuller(}{it:#}{cmd:)} specifies that Fuller's modified LIML estimator +is calculated using the user-supplied Fuller parameter alpha, +a non-negative number. +Alpha=1 has been suggested as a good choice. + +{p 0 4}{cmd:kclass(}{it:#}{cmd:)} specifies that a general k-class estimator is calculated +using the user-supplied #, a non-negative number. + +{p 0 4}{cmd:coviv} specifies that the matrix used to calculate the +covariance matrix for the LIML or k-class estimator +is based on the 2SLS matrix, i.e., with k=1. +In this case the covariance matrix will differ from that calculated for the 2SLS +estimator only because the estimate of the error variance will differ. +The default is for the covariance matrix to be based on the LIML or k-class matrix. + +{p 0 4}{cmd:cue} requests the GMM continuously-updated estimator (CUE). + +{p 0 4}{cmd:b0(}{it:matrix}{cmd:)} specifies that the J statistic +(i.e., the value of the CUE objective function) +should be calculated for an arbitrary coefficient vector {cmd:b0}. +That vector must be provided as a matrix with appropriate row and column names. +Under- and weak-identification statistics are not reported +in the output. + +{p 0 4}{cmd:robust} specifies that the Eicker/Huber/White/sandwich estimator of +variance is to be used in place of the traditional calculation. {cmd:robust} +combined with {cmd:cluster()} further allows residuals which are not +independent within cluster (although they must be independent between +clusters). See {hi:[U] Obtaining robust variance estimates}. + +{p 0 4}{cmd:cluster}{cmd:(}{it:varlist}{cmd:)} specifies that the observations +are independent across groups (clusters) but not necessarily independent +within groups. +With 1-way clustering, {cmd:cluster}{cmd:(}{it:varname}{cmd:)} +specifies to which group each observation +belongs; e.g., {cmd:cluster(personid)} in data with repeated observations on +individuals. +With 2-way clustering, {cmd:cluster}{cmd:(}{it:varname1 varname2}{cmd:)} +specifies the two (non-nested) groups to which each observation belongs. +Specifying {cmd:cluster()} implies {cmd:robust}. + +{p 0 4}{cmd:bw(}{it:#}{cmd:)} impements AC or HAC covariance estimation +with bandwidth equal to {it:#}, where {it:#} is an integer greater than zero. +Specifying {cmd:robust} implements HAC covariance estimation; +omitting it implements AC covariance estimation. +If the Bartlett (default), Parzen or Quadratic Spectral kernels are selected, +the value {cmd:auto} may be given (rather than an integer) +to invoke Newey and West's (1994) automatic bandwidth selection procedure. + +{p 0 4}{cmd:kernel(}{it:string)}{cmd:)} specifies the kernel +to be used for AC and HAC covariance estimation; +the default kernel is Bartlett (also known in econometrics +as Newey-West). +The full list of kernels available is (abbreviations in parentheses): +Bartlett (bar); Truncated (tru); Parzen (par); Tukey-Hanning (thann); +Tukey-Hamming (thamm); Daniell (dan); Tent (ten); and Quadratic-Spectral (qua or qs). + +{p 4 4}Note: in the cases of the Bartlett, Parzen, +and Tukey-Hanning/Hamming kernels, the number of lags used +to construct the kernel estimate equals the bandwidth minus one. +Stata's official {cmd:newey} implements +HAC standard errors based on the Bartlett kernel, +and requires the user to specify +the maximum number of lags used and not the bandwidth; +see help {help newey}. +If these kernels are used with {cmd:bw(1)}, +no lags are used and {cmd:ivreg210} will report the usual +Eicker/Huber/White/sandwich variance estimates. + +{p 0 4}{cmd:wmatrix(}{it:matrix}{cmd:)} specifies a user-supplied weighting matrix +in place of the computed optimal weighting matrix. +The matrix must be positive definite. +The user-supplied matrix must have the same row and column names +as the instrument variables in the regression model (or a subset thereof). + +{p 0 4}{cmd:smatrix(}{it:matrix}{cmd:)} specifies a user-supplied covariance matrix +of the orthogonality conditions to be used in calculating the covariance matrix of the estimator. +The matrix must be positive definite. +The user-supplied matrix must have the same row and column names +as the instrument variables in the regression model (or a subset thereof). + +{p 0 4}{cmd:orthog}{cmd:(}{it:varlist_ex}{cmd:)} requests that a C-statistic +be calculated as a test of the exogeneity of the instruments in {it:varlist_ex}. +These may be either included or excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instruments must still be identified. + +{p 0 4}{cmd:endog}{cmd:(}{it:varlist_en}{cmd:)} requests that a C-statistic +be calculated as a test of the endogeneity +of the endogenous regressors in {it:varlist_en}. + +{p 0 4}{cmd:redundant}{cmd:(}{it:varlist_ex}{cmd:)} requests an LM test +of the redundancy of the instruments in {it:varlist_ex}. +These must be excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instrumenst must still be identified. + +{p 0 4}{cmd:small} requests that small-sample statistics (F and t-statistics) +be reported instead of large-sample statistics (chi-squared and z-statistics). +Large-sample statistics are the default. +The exception is the statistic for the significance of the regression, +which is always reported as a small-sample F statistic. + +{p 0 4}{cmd:noconstant} suppresses the constant term (intercept) in the +regression. If {cmd:noconstant} is specified, the constant term is excluded +from both the final regression and the first-stage regression. To include a +constant in the first-stage when {cmd:noconstant} is specified, explicitly +include a variable containing all 1's in {it:varlist_iv}. + +{p 0 4}{cmd:first} requests that the full first-stage regression results be displayed, +along with the associated diagnostic and identification statistics. + +{p 0 4}{cmd:ffirst} requests the first-stage diagnostic and identification statistics. +The results are saved in various e() macros. + +{p 0 4}{cmd:nocollin} suppresses the checks for collinearities +and duplicate variables. + +{p 0 4}{cmd:noid} suppresses the calculation and reporting +of underidentification and weak identification statistics. + +{p 0 4}{cmd:savefirst} requests that the first-stage regressions results +are saved for later access using the {cmd:estimates} command. +The names under which the first-stage regressions are saved +are the names of the endogenous regressors prefixed by "_ivreg2_". +If these use Stata's time-series operators, +the "." is replaced by a "_". +The maximum number of first-stage estimation results that can be saved +depends on how many other estimation results the user has already saved +and on the maximum supported by Stata. + +{p 0 4}{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the first-stage regression results be saved using the user-specified prefix +instead of the default "_ivreg2_". + +{p 0 4}{cmd:rf} requests that the reduced-form estimation of the equation +be displayed. + +{p 0 4}{cmd:saverf} requests that the reduced-form estimation of the equation +be saved for later access using the {cmd:estimates} command. +The estimation is stored under the name of the dependent variable +prefixed by "_ivreg2_". +If this uses Stata's time-series operators, +the "." is replaced by a "_". + +{p 0 4}{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the reduced-form estimation be saved using the user-specified prefix +instead of the default "_ivreg2_". + +{p 0 4}{cmd:partial(}{it:varlist}{cmd:)} requests that +the exogenous regressors in {it:varlist} be partialled out +from the other variables in the equation. +If the equation includes a constant, +it is automatically partialled out as well. +The coefficients corresponding to the regressors in {it:varlist} +are not calculated. + +{p 0 4}{cmd:level(}{it:#}{cmd:)} specifies the confidence level, in percent, +for confidence intervals of the coefficients; see help {help level}. + +{p 0 4}{cmd:noheader}, {cmd:eform()}, {cmd:depname()} and {cmd:plus} +are for ado-file writers; see {hi:[R] ivreg} and {hi:[R] regress}. + +{p 0 4}{cmd:nofooter} suppresses the display of the footer containing +identification and overidentification statistics, +exogeneity and endogeneity tests, +lists of endogenous variables and instruments, etc. + +{p 0 4}{cmd:version} causes {cmd:ivreg210} to display its current version number +and to leave it in the macro {cmd:e(version)}. +It cannot be used with any other options. +and will clear any existing {cmd:e()} saved results. + +{marker s_macros}{title:Remarks and saved results} + +{p}{cmd:ivreg210} does not report an ANOVA table. +Instead, it reports the RSS and both the centered and uncentered TSS. +It also reports both the centered and uncentered R-squared. +NB: the TSS and R-squared reported by official {cmd:ivreg} is centered +if a constant is included in the regression, and uncentered otherwise. + +{p}{cmd:ivreg210} saves the following results in {cmd:e()}: + +Scalars +{col 4}{cmd:e(N)}{col 18}Number of observations +{col 4}{cmd:e(yy)}{col 18}Total sum of squares (SS), uncentered (y'y) +{col 4}{cmd:e(yyc)}{col 18}Total SS, centered (y'y - ((1'y)^2)/n) +{col 4}{cmd:e(rss)}{col 18}Residual SS +{col 4}{cmd:e(mss)}{col 18}Model SS =yyc-rss if the eqn has a constant, =yy-rss otherwise +{col 4}{cmd:e(df_m)}{col 18}Model degrees of freedom +{col 4}{cmd:e(df_r)}{col 18}Residual degrees of freedom +{col 4}{cmd:e(r2u)}{col 18}Uncentered R-squared, 1-rss/yy +{col 4}{cmd:e(r2c)}{col 18}Centered R-squared, 1-rss/yyc +{col 4}{cmd:e(r2)}{col 18}Centered R-squared if the eqn has a constant, uncentered otherwise +{col 4}{cmd:e(r2_a)}{col 18}Adjusted R-squared +{col 4}{cmd:e(ll)}{col 18}Log likelihood +{col 4}{cmd:e(rankxx)}{col 18}Rank of the matrix of observations on rhs variables=K +{col 4}{cmd:e(rankzz)}{col 18}Rank of the matrix of observations on instruments=L +{col 4}{cmd:e(rankV)}{col 18}Rank of covariance matrix V of coefficients +{col 4}{cmd:e(rankS)}{col 18}Rank of covariance matrix S of orthogonality conditions +{col 4}{cmd:e(rmse)}{col 18}root mean square error=sqrt(rss/(N-K)) if -small-, =sqrt(rss/N) if not +{col 4}{cmd:e(F)}{col 18}F statistic +{col 4}{cmd:e(N_clust)}{col 18}Number of clusters (or min(N_clust1,N_clust2) if 2-way clustering) +{col 4}{cmd:e(N_clust1)}{col 18}Number of clusters in dimension 1 (if 2-way clustering) +{col 4}{cmd:e(N_clust2)}{col 18}Number of clusters in dimension 2 (if 2-way clustering) +{col 4}{cmd:e(bw)}{col 18}Bandwidth +{col 4}{cmd:e(lambda)}{col 18}LIML eigenvalue +{col 4}{cmd:e(kclass)}{col 18}k in k-class estimation +{col 4}{cmd:e(fuller)}{col 18}Fuller parameter alpha +{col 4}{cmd:e(sargan)}{col 18}Sargan statistic +{col 4}{cmd:e(sarganp)}{col 18}p-value of Sargan statistic +{col 4}{cmd:e(sargandf)}{col 18}dof of Sargan statistic = degree of overidentification = L-K +{col 4}{cmd:e(j)}{col 18}Hansen J statistic +{col 4}{cmd:e(jp)}{col 18}p-value of Hansen J statistic +{col 4}{cmd:e(jdf)}{col 18}dof of Hansen J statistic = degree of overidentification = L-K +{col 4}{cmd:e(arubin)}{col 18}Anderson-Rubin overidentification LR statistic N*ln(lambda) +{col 4}{cmd:e(arubinp)}{col 18}p-value of Anderson-Rubin overidentification LR statistic +{col 4}{cmd:e(arubin_lin)}{col 18}Anderson-Rubin linearized overidentification statistic N*(lambda-1) +{col 4}{cmd:e(arubin_linp)}{col 18}p-value of Anderson-Rubin linearized overidentification statistic +{col 4}{cmd:e(arubindf)}{col 18}dof of A-R overid statistic = degree of overidentification = L-K +{col 4}{cmd:e(idstat)}{col 18}LM test statistic for underidentification (Anderson or Kleibergen-Paap) +{col 4}{cmd:e(idp)}{col 18}p-value of underidentification LM statistic +{col 4}{cmd:e(iddf)}{col 18}dof of underidentification LM statistic +{col 4}{cmd:e(widstat)}{col 18}F statistic for weak identification (Cragg-Donald or Kleibergen-Paap) +{col 4}{cmd:e(arf)}{col 18}Anderson-Rubin F-test of significance of endogenous regressors +{col 4}{cmd:e(arfp)}{col 18}p-value of Anderson-Rubin F-test of endogenous regressors +{col 4}{cmd:e(archi2)}{col 18}Anderson-Rubin chi-sq test of significance of endogenous regressors +{col 4}{cmd:e(archi2p)}{col 18}p-value of Anderson-Rubin chi-sq test of endogenous regressors +{col 4}{cmd:e(ardf)}{col 18}degrees of freedom of Anderson-Rubin tests of endogenous regressors +{col 4}{cmd:e(ardf_r)}{col 18}denominator degrees of freedom of AR F-test of endogenous regressors +{col 4}{cmd:e(redstat)}{col 18}LM statistic for instrument redundancy +{col 4}{cmd:e(redp)}{col 18}p-value of LM statistic for instrument redundancy +{col 4}{cmd:e(reddf)}{col 18}dof of LM statistic for instrument redundancy +{col 4}{cmd:e(cstat)}{col 18}C-statistic +{col 4}{cmd:e(cstatp)}{col 18}p-value of C-statistic +{col 4}{cmd:e(cstatdf)}{col 18}Degrees of freedom of C-statistic +{col 4}{cmd:e(cons)}{col 18}1 when equation has a Stata-supplied constant; 0 otherwise +{col 4}{cmd:e(partialcons)}{col 18}as above but prior to partialling-out (see {cmd:e(partial)}) +{col 4}{cmd:e(partial_ct)}{col 18}Number of partialled-out variables (see {cmd:e(partial)}) + +Macros +{col 4}{cmd:e(cmd)}{col 18}ivreg210 +{col 4}{cmd:e(cmdline)}{col 18}Command line invoking ivreg210 +{col 4}{cmd:e(version)}{col 18}Version number of ivreg210 +{col 4}{cmd:e(model)}{col 18}ols, iv, gmm, liml, or kclass +{col 4}{cmd:e(depvar)}{col 18}Name of dependent variable +{col 4}{cmd:e(instd)}{col 18}Instrumented (RHS endogenous) variables +{col 4}{cmd:e(insts)}{col 18}Instruments +{col 4}{cmd:e(inexog)}{col 18}Included instruments (regressors) +{col 4}{cmd:e(exexog)}{col 18}Excluded instruments +{col 4}{cmd:e(collin)}{col 18}Variables dropped because of collinearities +{col 4}{cmd:e(dups)}{col 18}Duplicate variables +{col 4}{cmd:e(ecollin)}{col 18}Endogenous variables reclassified as exogenous because of +{col 20}collinearities with instruments +{col 4}{cmd:e(clist)}{col 18}Instruments tested for orthogonality +{col 4}{cmd:e(redlist)}{col 18}Instruments tested for redundancy +{col 4}{cmd:e(partial)}{col 18}Partialled-out exogenous regressors +{col 4}{cmd:e(small)}{col 18}small +{col 4}{cmd:e(wtype)}{col 18}weight type +{col 4}{cmd:e(wexp)}{col 18}weight expression +{col 4}{cmd:e(clustvar)}{col 18}Name of cluster variable +{col 4}{cmd:e(vcetype)}{col 18}Covariance estimation method +{col 4}{cmd:e(kernel)}{col 18}Kernel +{col 4}{cmd:e(tvar)}{col 18}Time variable +{col 4}{cmd:e(ivar)}{col 18}Panel variable +{col 4}{cmd:e(firsteqs)}{col 18}Names of stored first-stage equations +{col 4}{cmd:e(rfeq)}{col 18}Name of stored reduced-form equation +{col 4}{cmd:e(predict)}{col 18}Program used to implement predict + +Matrices +{col 4}{cmd:e(b)}{col 18}Coefficient vector +{col 4}{cmd:e(V)}{col 18}Variance-covariance matrix of the estimators +{col 4}{cmd:e(S)}{col 18}Covariance matrix of orthogonality conditions +{col 4}{cmd:e(W)}{col 18}GMM weighting matrix (=inverse of S if efficient GMM estimator) +{col 4}{cmd:e(first)}{col 18}First-stage regression results +{col 4}{cmd:e(ccev)}{col 18}Eigenvalues corresponding to the Anderson canonical correlations test +{col 4}{cmd:e(cdev)}{col 18}Eigenvalues corresponding to the Cragg-Donald test + +Functions +{col 4}{cmd:e(sample)}{col 18}Marks estimation sample + + + +{marker s_examples}{title:Examples} + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta" : . use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta }{p_end} +{p 8 12}(Wages of Very Young Men, Zvi Griliches, J.Pol.Ec. 1976) + +{p 8 12}{stata "xi i.year" : . xi i.year} + +{col 0}(Instrumental variables. Examples follow Hayashi 2000, p. 255.) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt)} + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), small ffirst" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), small ffirst} + +{col 0}(Testing for the presence of heteroskedasticity in IV/GMM estimation) + +{p 8 12}{stata "ivhettest, fitlev" : . ivhettest, fitlev} + +{col 0}(Two-step GMM efficient in the presence of arbitrary heteroskedasticity) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust} + +{p 0}(GMM with user-specified first-step weighting matrix or matrix of orthogonality conditions) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), robust" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), robust} + +{p 8 12}{stata "predict double uhat if e(sample), resid" : . predict double uhat if e(sample), resid} + +{p 8 12}{stata "mat accum S = `e(insts)' [iw=uhat^2]" : . mat accum S = `e(insts)' [iw=uhat^2]} + +{p 8 12}{stata "mat S = 1/`e(N)' * S" : . mat S = 1/`e(N)' * S} + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust smatrix(S)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust smatrix(S)} + +{p 8 12}{stata "mat W = invsym(S)" : . mat W = invsym(S)} + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust wmatrix(W)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust wmatrix(W)} + +{p 0}(Equivalence of J statistic and Wald tests of included regressors, irrespective of instrument choice (Ahn, 1997)) + +{p 8 12}{stata "ivreg210 lw (iq=med kww age), gmm2s" : . ivreg210 lw (iq=med kww age), gmm2s} + +{p 8 12}{stata "mat S0 = e(S)" : . mat S0 = e(S)} + +{p 8 12}{stata "qui ivreg210 lw (iq=kww) med age, gmm2s smatrix(S0)" : . qui ivreg210 lw (iq=kww) med age, gmm2s smatrix(S0)} + +{p 8 12}{stata "test med age" : . test med age} + +{p 8 12}{stata "qui ivreg210 lw (iq=med) kww age, gmm2s smatrix(S0)" : . qui ivreg210 lw (iq=med) kww age, gmm2s smatrix(S0)} + +{p 8 12}{stata "test kww age" : . test kww age} + +{p 8 12}{stata "qui ivreg210 lw (iq=age) med kww, gmm2s smatrix(S0)" : . qui ivreg210 lw (iq=age) med kww, gmm2s smatrix(S0)} + +{p 8 12}{stata "test med kww" : . test med kww} + +{p 0}(Continuously-updated GMM (CUE) efficient in the presence of arbitrary heteroskedasticity. NB: may require 30+ iterations.) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust} + +{col 0}(Sargan-Basmann tests of overidentifying restrictions for IV estimation) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt)} + +{p 8 12}{stata "overid, all" : . overid, all} + +{col 0}(Tests of exogeneity and endogeneity) + +{col 0}(Test the exogeneity of one regressor) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(s)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(s)} + +{col 0}(Test the exogeneity of two excluded instruments) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(age mrt)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(age mrt)} + +{col 0}(Frisch-Waugh-Lovell (FWL): equivalence of estimations with and without partialling-out) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns _I* (iq=kww age), cluster(year)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age), cluster(year)} + +{p 8 12}{stata "ivreg210 lw s expr tenure rns _I* (iq=kww age), cluster(year) partial(_I*)" : . ivreg210 lw s expr tenure rns smsa _I* (iq=med kww age), cluster(year) partial(_I*)} + +{col 0}({cmd:partial()}: efficient GMM with #clusters<#instruments feasible after partialling-out) + +{p 8 12}{stata "ivreg210 lw s expr tenure rns _I* (iq=kww age), cluster(year) partial(_I*) gmm2s" : . ivreg210 lw s expr tenure rns smsa (iq=med kww age), cluster(year) partial(_I*) gmm2s} + +{col 0}(Examples following Wooldridge 2002, pp.59, 61) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta" : . use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta } + +{col 0}(Equivalence of DWH endogeneity test when regressor is endogenous...) + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6)" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6)} + +{p 8 12}{stata "ivendog educ" :. ivendog educ} + +{col 0}(... endogeneity test using the {cmd:endog} option) + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), endog(educ)" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), endog(educ)} + +{col 0}(...and C-test of exogeneity when regressor is exogenous, using the {cmd:orthog} option) + +{p 8 12}{stata "ivreg210 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)" : . ivreg210 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)} + +{col 0}(Heteroskedastic Ordinary Least Squares, HOLS) + +{p 8 12}{stata "ivreg210 lwage exper expersq educ (=age kidslt6 kidsge6), gmm2s" : . ivreg210 lwage exper expersq educ (=age kidslt6 kidsge6), gmm2s} + +{col 0}(Equivalence of Cragg-Donald Wald F statistic and F-test from first-stage regression +{col 0}in special case of single endogenous regressor. Also illustrates {cmd:savefirst} option.) + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), savefirst" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), savefirst} + +{p 8 12}{stata "di e(widstat)" : . di e(widstat)} + +{p 8 12}{stata "estimates restore _ivreg2_educ" : . estimates restore _ivreg2_educ} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Equivalence of Kleibergen-Paap robust rk Wald F statistic and F-test from first-stage +{col 0}regression in special case of single endogenous regressor.) + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust savefirst" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust savefirst} + +{p 8 12}{stata "di e(widstat)" : . di e(widstat)} + +{p 8 12}{stata "estimates restore _ivreg2_educ" : . estimates restore _ivreg2_educ} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Equivalence of Kleibergen-Paap robust rk LM statistic for identification and LM test +{col 0}of joint significance of excluded instruments in first-stage regression in special +{col 0}case of single endogenous regressor. Also illustrates use of {cmd:ivreg210} to perform an +{col 0}LM test in OLS estimation.) + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust} + +{p 8 12}{stata "di e(idstat)" : . di e(idstat)} + +{p 8 12}{stata "ivreg210 educ exper expersq (=age kidslt6 kidsge6) if e(sample), robust" : . ivreg210 educ exper expersq (=age kidslt6 kidsge6) if e(sample), robust} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(Equivalence of an LM test of an excluded instrument for redundancy and an LM test of +{col 0}significance from first-stage regression in special case of single endogenous regressor.) + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust redundant(age)" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust redundant(age)} + +{p 8 12}{stata "di e(redstat)" : . di e(redstat)} + +{p 8 12}{stata "ivreg210 educ exper expersq kidslt6 kidsge6 (=age) if e(sample), robust" : . ivreg210 educ exper expersq kidslt6 kidsge6 (=age) if e(sample), robust} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(Weak-instrument robust inference: Anderson-Rubin Wald F and chi-sq and +{col 0}Stock-Wright S statistics. Also illusrates use of {cmd:saverf} option.) + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust ffirst saverf" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust ffirst saverf} + +{p 8 12}{stata "di e(arf)" : . di e(arf)} + +{p 8 12}{stata "di e(archi2)" : . di e(archi2)} + +{p 8 12}{stata "di e(sstat)" : . di e(sstat)} + +{col 0}(Obtaining the Anderson-Rubin Wald F statistic from the reduced-form estimation) + +{p 8 12}{stata "estimates restore _ivreg2_lwage" : . estimates restore _ivreg2_lwage} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Obtaining the Anderson-Rubin Wald chi-sq statistic from the reduced-form estimation. +{col 0}Use {cmd:ivreg210} without {cmd:small} to obtain large-sample test statistic.) + +{p 8 12}{stata "ivreg210 lwage exper expersq age kidslt6 kidsge6, robust" : . ivreg210 lwage exper expersq age kidslt6 kidsge6, robust} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(chi2)" : . di r(chi2)} + +{col 0}(Obtaining the Stock-Wright S statistic as the value of the GMM CUE objective function. +{col 0}Also illustrates use of {cmd:b0} option. Coefficients on included exogenous regressors +{col 0}are OLS coefficients, which is equivalent to partialling them out before obtaining +{col 0}the value of the CUE objective function.) + +{p 8 12}{stata "mat b = 0" : . mat b = 0} + +{p 8 12}{stata "mat colnames b = educ" : . mat colnames b = educ} + +{p 8 12}{stata "qui ivreg210 lwage exper expersq" : . qui ivreg210 lwage exper expersq} + +{p 8 12}{stata "mat b = b, e(b)" : . mat b = b, e(b)} + +{p 8 12}{stata "ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust b0(b)" : . ivreg210 lwage exper expersq (educ=age kidslt6 kidsge6), robust b0(b)} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(LIML and k-class estimation using Klein data) + +{col 9}{stata "webuse klein" :. webuse klein} +{col 9}{stata "tsset yr" :. tsset yr} + +{col 0}(LIML estimates of Klein's consumption function) + +{p 8 12}{stata "ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml" :. ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml} + +{col 0}(Equivalence of LIML and CUE+homoskedasticity+independence) + +{p 8 12}{stata "ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml coviv" :. ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml coviv} + +{p 8 12}{stata "ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), cue" :. ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), cue} + +{col 0}(Fuller's modified LIML with alpha=1) + +{p 8 12}{stata "ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), fuller(1)" :. ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), fuller(1)} + +{col 0}(k-class estimation with Nagar's bias-adjusted IV, k=1+(L-K)/N=1+4/21=1.19) + +{p 8 12}{stata "ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), kclass(1.19)" :. ivreg210 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), kclass(1.19)} + +{col 0}(Kernel-based covariance estimation using time-series data) + +{col 9}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta" :. use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta} +{col 9}{stata "tsset year, yearly" :. tsset year, yearly} + +{col 0}(Autocorrelation-consistent (AC) inference in an OLS Regression) + +{p 8 12}{stata "ivreg210 cinf unem, bw(3)" :. ivreg210 cinf unem, bw(3)} + +{p 8 12}{stata "ivreg210 cinf unem, kernel(qs) bw(auto)" :. ivreg210 cinf unem, kernel(qs) bw(auto)} + +{col 0}(Heteroskedastic and autocorrelation-consistent (HAC) inference in an OLS regression) + +{p 8 12}{stata "ivreg210 cinf unem, bw(3) kernel(bartlett) robust small" :. ivreg210 cinf unem, bw(3) kernel(bartlett) robust small} + +{p 8 12}{stata "newey cinf unem, lag(2)" :. newey cinf unem, lag(2)} + +{col 0}(AC and HAC in IV and GMM estimation) + +{p 8 12}{stata "ivreg210 cinf (unem = l(1/3).unem), bw(3)" :. ivreg210 cinf (unem = l(1/3).unem), bw(3)} + +{p 8 12}{stata "ivreg210 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(thann)" :. ivreg210 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(thann)} + +{p 8 12}{stata "ivreg210 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(qs) robust orthog(l1.unem)" :. ivreg210 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(qs) robust orthog(l1.unem)} + +{col 0}(Examples using Large N, Small T Panel Data) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta" : . use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta }{p_end} +{p 8 12}{stata "tsset id year" :. tsset id year} + +{col 0}(Two-step effic. GMM in the presence of arbitrary heteroskedasticity and autocorrelation) + +{p 8 12}{stata "ivreg210 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm2s cluster(id)": . ivreg210 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm2s cluster(id)} + +{col 0}(Kiefer (1980) SEs - robust to arbitrary serial correlation but not heteroskedasticity) + +{p 8 12}{stata "ivreg210 n w k, kiefer": . ivreg210 n w k, kiefer} + +{p 8 12}{stata "ivreg210 n w k, bw(9) kernel(tru)": . ivreg210 n w k, bw(9) kernel(tru)} + +{col 0}(Equivalence of cluster-robust and kernel-robust with truncated kernel and max bandwidth) + +{p 8 12}{stata "ivreg210 n w k, cluster(id)": . ivreg210 n w k, cluster(id)} + +{p 8 12}{stata "ivreg210 n w k, bw(9) kernel(tru) robust)": . ivreg210 n w k, bw(9) kernel(tru) robust} + +{col 0}(Examples using Small N, Large T Panel Data. NB: T is actually not very large - only +{col 0}20 - so results should be interpreted with caution) + +{p 8 12}{stata "webuse grunfeld" : . webuse grunfeld }{p_end} +{p 8 12}{stata "tsset" : . tsset }{p_end} + +{col 0}(Autocorrelation-consistent (AC) inference) + +{p 8 12}{stata "ivreg210 invest mvalue kstock, bw(1) kernel(tru)": . ivreg210 invest mvalue kstock, bw(1) kernel(tru)} + +{col 0}(Heteroskedastic and autocorrelation-consistent (HAC) inference) + +{p 8 12}{stata "ivreg210 invest mvalue kstock, robust bw(1) kernel(tru)": . ivreg210 invest mvalue kstock, robust bw(1) kernel(tru)} + +{col 0}(HAC inference, SEs also robust to disturbances correlated across panels) + +{p 8 12}{stata "ivreg210 invest mvalue kstock, robust cluster(year) bw(1) kernel(tru)": . ivreg210 invest mvalue kstock, robust cluster(year) bw(1) kernel(tru)} + +{col 0}(Equivalence of Driscoll-Kraay SEs as implemented by {cmd:ivreg210} and {cmd:xtscc}) +{col 0}(See Hoeschle (2007) for discussion of {cmd:xtscc}) + +{p 8 12}{stata "ivreg210 invest mvalue kstock, dkraay(2) small": . ivreg210 invest mvalue kstock, dkraay(2) small} + +{p 8 12}{stata "ivreg210 invest mvalue kstock, cluster(year) bw(2) small": . ivreg210 invest mvalue kstock, cluster(year) bw(2) small} + +{p 8 12}{stata "xtscc invest mvalue kstock, lag(1)": . xtscc invest mvalue kstock, lag(1)} + +{col 0}(Examples using Large N, Large T Panel Data. NB: T is again not very large - only +{col 0}20 - so results should be interpreted with caution) + +{p 8 12}{stata "webuse nlswork" : . webuse nlswork }{p_end} +{p 8 12}{stata "tsset" : . tsset }{p_end} + +{col 0}(One-way cluster-robust: SEs robust to arbitrary heteroskedasticity and within-panel +{col 0}autocorrelation) + +{p 8 12}{stata "ivreg210 ln_w grade age ttl_exp tenure, cluster(idcode)": . ivreg210 ln_w grade age ttl_exp tenure, cluster(idcode) }{p_end} + +{col 0}(Two-way cluster-robust: SEs robust to arbitrary heteroskedasticity and within-panel +{col 0}autocorrelation, and contemporaneous cross-panel correlation, i.e., the cross-panel +{col 0}correlation is not autocorrelated) + +{p 8 12}{stata "ivreg210 ln_w grade age ttl_exp tenure, cluster(idcode year)": . ivreg210 ln_w grade age ttl_exp tenure, cluster(idcode year) }{p_end} + +{col 0}(Two-way cluster-robust: SEs robust to arbitrary heteroskedasticity and within-panel +{col 0}autocorrelation and cross-panel autocorrelated disturbances that disappear after 2 lags) + +{p 8 12}{stata "ivreg210 ln_w grade age ttl_exp tenure, cluster(idcode year) bw(2) kernel(tru) ": . ivreg210 ln_w grade age ttl_exp tenure, cluster(idcode year) bw(2) kernel(tru) }{p_end} + + + +{marker s_refs}{title:References} + +{p 0 4}Ahn, Seung C. 1997. Orthogonality tests in linear models. Oxford Bulletin +of Economics and Statistics, Vol. 59, pp. 183-186. + +{p 0 4}Anderson, T.W. 1951. Estimating linear restrictions on regression coefficients +for multivariate normal distributions. Annals of Mathematical Statistics, Vol. 22, pp. 327-51. + +{p 0 4}Anderson, T. W. and H. Rubin. 1949. Estimation of the parameters of a single equation +in a complete system of stochastic equations. Annals of Mathematical Statistics, Vol. 20, +pp. 46-63. + +{p 0 4}Anderson, T. W. and H. Rubin. 1950. The asymptotic properties of estimates of the parameters of a single +equation in a complete system of stochastic equations. Annals of Mathematical Statistics, +Vol. 21, pp. 570-82. + +{p 0 4}Angrist, J.D. and Pischke, J.-S. 2009. Mostly Harmless Econometrics: An Empiricist's Companion. +Princeton: Princeton University Press. + +{p 0 4}Baum, C.F., Schaffer, M.E., and Stillman, S. 2003. Instrumental Variables and GMM: +Estimation and Testing. The Stata Journal, Vol. 3, No. 1, pp. 1-31. +{browse "http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html":http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html}. +Working paper version: Boston College Department of Economics Working Paper No. 545. +{browse "http://ideas.repec.org/p/boc/bocoec/545.html":http://ideas.repec.org/p/boc/bocoec/545.html}. +Citations in {browse "http://scholar.google.com/scholar?oi=bibs&hl=en&cites=9432785573549481148":published work}. + +{p 0 4}Baum, C. F., Schaffer, M.E., and Stillman, S. 2007. Enhanced routines for instrumental variables/GMM estimation and testing. +The Stata Journal, Vol. 7, No. 4, pp. 465-506. +{browse "http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html":http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html}. +Working paper version: Boston College Department of Economics Working Paper No. 667. +{browse "http://ideas.repec.org/p/boc/bocoec/667.html":http://ideas.repec.org/p/boc/bocoec/667.html}. +Citations in {browse "http://scholar.google.com/scholar?oi=bibs&hl=en&cites=1691909976816211536":published work}. + +{p 0 4}Breusch, T., Qian, H., Schmidt, P. and Wyhowski, D. 1999. +Redundancy of moment conditions. +Journal of Econometrics, Vol. 9, pp. 89-111. + +{p 0 4}Cameron, A.C., Gelbach, J.B. and Miller, D.L. 2006. +Robust Inference with Multi-Way Clustering. +NBER Technical Working paper 327. +{browse "http://www.nber.org/papers/t0327":http://www.nber.org/papers/t0327}. +Forthcoming in the Journal of Business and Economic Statistics. +{cmd:cgmreg} is available at +{browse "http://www.econ.ucdavis.edu/faculty/dlmiller/statafiles":http://www.econ.ucdavis.edu/faculty/dlmiller/statafiles}. + +{p 0 4}Chernozhukov, V. and Hansen, C. 2005. The Reduced Form: +A Simple Approach to Inference with Weak Instruments. +Working paper, University of Chicago, Graduate School of Business. + +{p 0 4}Cragg, J.G. and Donald, S.G. 1993. Testing Identfiability and Specification in +Instrumental Variables Models. Econometric Theory, Vol. 9, pp. 222-240. + +{p 0 4}Cushing, M.J. and McGarvey, M.G. 1999. Covariance Matrix Estimation. +In L. Matyas (ed.), Generalized Methods of Moments Estimation. +Cambridge: Cambridge University Press. + +{p 0 4}Davidson, R. and MacKinnon, J. 1993. Estimation and Inference in Econometrics. +1993. New York: Oxford University Press. + +{p 0 4}Driscoll, J.C. and Kraay, A. 1998. Consistent Covariance Matrix Estimation With Spatially Dependent Panel Data. +Review of Economics and Statistics. Vol. 80, No. 4, pp. 549-560. + +{p 0 4}Dufour, J.M. 2003. Identification, Weak Instruments and Statistical Inference +in Econometrics. Canadian Journal of Economics, Vol. 36, No. 4, pp. 767-808. +Working paper version: CIRANO Working Paper 2003s-49. +{browse "http://www.cirano.qc.ca/pdf/publication/2003s-49.pdf":http://www.cirano.qc.ca/pdf/publication/2003s-49.pdf}. + +{p 0 4}Finlay, K., and Magnusson, L.M. 2009. Implementing Weak-Instrument Robust Tests +for a General Class of Instrumental-Variables Models. +The Stata Journal, Vol. 9, No. 3, pp. 398-421. +{browse "http://www.stata-journal.com/article.html?article=st0171":http://www.stata-journal.com/article.html?article=st0171}. + +{p 0 4}Hall, A.R., Rudebusch, G.D. and Wilcox, D.W. 1996. Judging Instrument Relevance in +Instrumental Variables Estimation. International Economic Review, Vol. 37, No. 2, pp. 283-298. + +{p 0 4}Hayashi, F. Econometrics. 2000. Princeton: Princeton University Press. + +{p 0 4}Hansen, L.P., Heaton, J., and Yaron, A. 1996. Finite Sample Properties +of Some Alternative GMM Estimators. Journal of Business and Economic Statistics, Vol. 14, No. 3, pp. 262-280. + +{p 0 4}Hoechle, D. 2007. Robust Standard Errors for Panel Regressions with Crossñsectional Dependence. +Stata Journal, Vol. 7, No. 3, pp. 281-312. +{browse "http://www.stata-journal.com/article.html?article=st0128":http://www.stata-journal.com/article.html?article=st0128}. + +{p 0 4}Kiefer, N.M. 1980. Estimation of Fixed Effect Models for Time Series of Cross-Sections with +Arbitrary Intertemporal Covariance. Journal of Econometrics, Vol. 14, No. 2, pp. 195-202. + +{p 0 4}Kleibergen, F. 2007. Generalizing Weak Instrument Robust Statistics Towards Multiple Parameters, Unrestricted Covariance Matrices and Identification Statistics. Journal of Econometrics, forthcoming. + +{p 0 4}Kleibergen, F. and Paap, R. 2006. Generalized Reduced Rank Tests Using the Singular Value Decomposition. +Journal of Econometrics, Vol. 133, pp. 97-126. + +{p 0 4}Kleibergen, F. and Schaffer, M.E. 2007. ranktest: Stata module for testing the rank +of a matrix using the Kleibergen-Paap rk statistic. +{browse "http://ideas.repec.org/c/boc/bocode/s456865.html":http://ideas.repec.org/c/boc/bocode/s456865.html}. + +{p 0 4}Mikusheva, A. and Poi, B.P. 2006. +Tests and Confidence Sets with Correct Size When Instruments are Potentially Weak. The Stata Journal, Vol. 6, No. 3, pp. 335-347. + +{p 0 4}Moreira, M.J. and Poi, B.P. 2003. Implementing Tests with the Correct Size in the Simultaneous Equations Model. The Stata Journal, Vol. 3, No. 1, pp. 57-70. + +{p 0 4}Newey, W.K. and K.D. West, 1994. Automatic Lag Selection in Covariance Matrix Estimation. Review of Economic Studies, Vol. 61, No. 4, pp. 631-653. + +{p 0 4}Shea, J. 1997. Instrument Relevance in Multivariate Linear Models: +A Simple Measure. +Review of Economics and Statistics, Vol. 49, No. 2, pp. 348-352. + +{p 0 4}Stock, J.H. and Wright, J.H. 2000. GMM with Weak Identification. +Econometrica, Vol. 68, No. 5, September, pp. 1055-1096. + +{p 0 4}Stock, J.H. and Yogo, M. 2005. Testing for Weak Instruments in Linear IV Regression. In D.W.K. Andrews and J.H. Stock, eds. Identification and Inference for Econometric Models: Essays in Honor of Thomas Rothenberg. Cambridge: Cambridge University Press, 2005, pp. 80Ò108. +Working paper version: NBER Technical Working Paper 284. +{browse "http://www.nber.org/papers/T0284":http://www.nber.org/papers/T0284}. + +{p 0 4}Thompson, S.B. 2009. Simple Formulas for Standard Errors that Cluster by Both Firm and Time. +{browse "http://ssrn.com/abstract=914002":http://ssrn.com/abstract=914002}. + +{p 0 4}Wooldridge, J.M. 2002. Econometric Analysis of Cross Section and Panel Data. Cambridge, MA: MIT Press. + + +{marker s_acknow}{title:Acknowledgements} + +{p}We would like to thanks various colleagues who helped us along the way, including +David Drukker, +Frank Kleibergen, +Austin Nichols, +Brian Poi, +Vince Wiggins, +and, not least, the users of {cmd:ivreg2} +who have provided suggestions, +spotted bugs, +and helped test the package. +We are also grateful to Jim Stock and Moto Yogo for permission to reproduce +their critical values for the Cragg-Donald statistic. + +{marker s_citation}{title:Citation of ivreg210} + +{p}{cmd:ivreg210} is not an official Stata command. It is a free contribution +to the research community, like a paper. Please cite it as such: {p_end} + +{phang}Baum, C.F., Schaffer, M.E., Stillman, S. 2015. +ivreg210: Stata module for extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression. +{browse "http://ideas.repec.org/c/boc/bocode/sS457955.html":http://ideas.repec.org/c/boc/bocode/sS457955.html}{p_end} + +{title:Authors} + + Christopher F Baum, Boston College, USA + baum@bc.edu + + Mark E Schaffer, Heriot-Watt University, UK + m.e.schaffer@hw.ac.uk + + Steven Stillman, Motu Economic and Public Policy Research + stillman@motu.org.nz + + +{title:Also see} + +{p 1 14}Articles:{it:Stata Journal}, volume 3, number 1: {browse "http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html":st0030}{p_end} +{p 10 14}{it:Stata Journal}, volume 7, number 4: {browse "http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html":st0030_3}{p_end} + +{p 1 14}Manual: {hi:[U] 23 Estimation and post-estimation commands}{p_end} +{p 10 14}{hi:[U] 29 Overview of model estimation in Stata}{p_end} +{p 10 14}{hi:[R] ivreg}{p_end} + +{p 1 10}On-line: help for {help ivregress}, {help ivreg}, {help newey}; +{help overid}, {help ivendog}, {help ivhettest}, {help ivreset}, +{help xtivreg2}, {help xtoverid}, {help ranktest}, +{help condivreg} (if installed); +{help rivtest} (if installed); +{help cgmreg} (if installed); +{help xtscc} (if installed); +{help est}, {help postest}; +{help regress}{p_end} diff --git a/data/ado/i/ivreg210_p.ado b/data/ado/i/ivreg210_p.ado new file mode 100644 index 0000000..0051a99 --- /dev/null +++ b/data/ado/i/ivreg210_p.ado @@ -0,0 +1,112 @@ +*! ivreg210_p 1.0.8 19Jan2015 +*! based on ivreg2_p 1.0.8 30Jan2011 +*! author mes +* 1.0.1: 25apr2002 original version +* 1.0.2: 28jun2005 version 8.2 +* 1.0.3: 1Aug2006 complete rewrite plus fwl option +* 1.0.4: 26Jan2007 eliminated double reporting of #MVs +* 1.0.5: 2Feb2007 small fix to allow fwl of just _cons +* 1.0.6: 19Aug2007 replacement of "fwl" with "partial" in conjuction with new ivreg2 syntax +* 1.0.7: 4Feb2010 version check update +* 1.0.8: 30Jan2011 re-introduced stdp option (hadn't been supported after fwl/partial) +* and added labelling of created residual variable + +program define ivreg210_p + version 8.2 + syntax newvarname [if] [in] , [XB Residuals stdp] + marksample touse, novarlist + +* Check ivreg2 version is compatible. +* fwl becomes partial starting in ivreg2 02.2.07 + local vernum "`e(version)'" + if ("`vernum'" < "03.0.00") | ("`vernum'" > "09.9.99") { +di as err "Error: incompatible versions of ivreg2 and ivreg2_p." +di as err "Currently installed version of ivreg2 is `vernum'" +di as err "To update, from within Stata type " _c +di in smcl "{stata ssc install ivreg2, replace :ssc install ivreg2, replace}" + exit 601 + } + + local type "`xb'`residuals'`stdp'" + + if "`type'"=="" { + local type "xb" +di in gr "(option xb assumed; fitted values)" + } + +* e(partialcons) now always exists and is 1 or 0 + if e(partial_ct) { +* partial partial-out block + if "`type'" == "residuals" { + + tempvar esample + tempname ivres + gen byte `esample' = e(sample) + +* Need to strip out time series operators + local lhs "`e(depvar)'" + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + + local rhs : colnames(e(b)) + tsrevar `rhs', substitute + local rhs_t "`r(varlist)'" + + if "`e(partial1)'" != "" { + local partial "`e(partial1)'" + } + else { + local partial "`e(partial)'" + } + tsrevar `partial', substitute + local partial_t "`r(varlist)'" + + if ~e(partialcons) { + local noconstant "noconstant" + } + + local allvars "`lhs_t' `rhs_t'" +* Partial-out block. Uses estimatation sample to get coeffs, markout sample for predict + _estimates hold `ivres', restore + foreach var of local allvars { + tempname `var'_partial + qui regress `var' `partial' if `esample', `noconstant' + qui predict double ``var'_partial' if `touse', resid + local allvars_partial "`allvars_partial' ``var'_partial'" + } + _estimates unhold `ivres' + + tokenize `allvars_partial' + local lhs_partial "`1'" + mac shift + local rhs_partial "`*'" + + tempname b + mat `b'=e(b) + mat colnames `b' = `rhs_partial' +* Use forcezero? + tempvar xb + mat score double `xb' = `b' if `touse' + gen `typlist' `varlist' = `lhs_partial' - `xb' + label var `varlist' "Residuals" + } + else { +di in red "Option `type' not supported with -partial- option" + error 198 + } + } + else if "`type'" == "residuals" { + tempname lhs lhs_t xb + local lhs "`e(depvar)'" + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + qui _predict `typlist' `xb' if `touse' + gen `typlist' `varlist'=`lhs_t'-`xb' + label var `varlist' "Residuals" + } +* Must be either xb or stdp + else { + _predict `typlist' `varlist' if `touse', `type' + } + +end diff --git a/data/ado/i/ivreg28.ado b/data/ado/i/ivreg28.ado new file mode 100644 index 0000000..f4a4732 --- /dev/null +++ b/data/ado/i/ivreg28.ado @@ -0,0 +1,5652 @@ +*! ivreg28 2.1.22 6July2007 +*! authors cfb & mes +*! cloned from official ivreg version 5.0.9 19Dec2001 +*! see end of file for version comments + +* Variable naming: +* lhs = LHS endogenous +* endo = RHS endogenous (instrumented) +* inexog = included exogenous (instruments) +* exexog = excluded exogenous (instruments) +* iv = {inexog exexog} = all instruments +* rhs = {endo inexog} = RHS regressors +* 1 at the end of the name means the varlist after duplicates and collinearities removed +* ..1_ct at the end means a straight count of the list +* .._ct at the end means ..1_ct with any additional detected cnts removed + +program define ivreg28, eclass byable(recall) sortpreserve + version 8.2 + local lversion 02.1.22 + local ivreg2_cmd "ivreg28" + + if replay() { + syntax [, FIRST FFIRST RF Level(integer $S_level) NOHEader NOFOoter dropfirst droprf /* + */ EForm(string) PLUS VERsion] + if "`version'" != "" & "`first'`ffirst'`rf'`noheader'`nofooter'`dropfirst'`droprf'`eform'`plus'" != "" { + di as err "option version not allowed" + error 198 + } + if "`version'" != "" { + di in gr "`lversion'" + ereturn clear + ereturn local version `lversion' + exit + } + if `"`e(cmd)'"' != "`ivreg2_cmd'" { + error 301 + } + if "`e(firsteqs)'" != "" & "`dropfirst'" == "" { +* On replay, set flag so saved eqns aren't dropped + local savefirst "savefirst" + } + if "`e(rfeq)'" != "" & "`droprf'" == "" { +* On replay, set flag so saved eqns aren't dropped + local saverf "saverf" + } + } + else { + + syntax [anything(name=0)] [if] [in] [aw fw pw iw/] [, /* + */ FIRST FFIRST NOID NOCOLLIN SAVEFIRST SAVEFPrefix(name) SMall Robust CLuster(varname) /* + */ GMM CUE CUEINIT(string) CUEOPTions(string) ORTHOG(string) ENDOGtest(string) FWL(string) /* + */ NOConstant Level(integer $S_level) Beta hc2 hc3 /* + */ NOHEader NOFOoter NOOUTput title(string) subtitle(string) /* + */ DEPname(string) EForm(string) PLUS /* + */ BW(string) kernel(string) Tvar(varname) Ivar(varname)/* + */ LIML COVIV FULLER(real 0) Kclass(string) /* + */ REDundant(string) RF SAVERF SAVERFPrefix(name) /* + */ B0(string) SMATRIX(string) WMATRIX(string) EWMATRIX(string) sw swpsd dofminus(integer 0) ] + + local n 0 + + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + if `s(stop)' { + error 198 + } + while `s(stop)'==0 { + if "`paren'"=="(" { + local n = `n' + 1 + if `n'>1 { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +exit 198 + } + gettoken p lhs : lhs, parse(" =") + while "`p'"!="=" { + if "`p'"=="" { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +di in red `"the equal sign "=" is required"' +exit 198 + } + local endo `endo' `p' + gettoken p lhs : lhs, parse(" =") + } +* To enable Cragg HOLS estimator, allow for empty endo list + local temp_ct : word count `endo' + if `temp_ct' > 0 { + tsunab endo : `endo' + } +* To enable OLS estimator with (=) syntax, allow for empty exexog list + local temp_ct : word count `lhs' + if `temp_ct' > 0 { + tsunab exexog : `lhs' + } + } + else { + local inexog `inexog' `lhs' + } + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + } + local 0 `"`lhs' `0'"' + + tsunab inexog : `inexog' + tokenize `inexog' + local lhs "`1'" + local 1 " " + local inexog `*' + + if "`gmm'`cue'" != "" & "`exexog'" == "" { + di in red "option `gmm'`cue' invalid: no excluded instruments specified" + exit 102 + } + +* Process options + +* Fuller implies LIML + if "`liml'" == "" & `fuller' != 0 { + local liml "liml" + } + +* b0 implies nooutput and noid + if "`b0'" ~= "" { + local nooutput "nooutput" + local noid "noid" + } + + if "`gmm'" != "" & "`cue'" != "" { +di as err "incompatible options: 2-step efficient gmm and cue gmm" + exit 198 + } + + if "`b0'" != "" & "`wmatrix'" != "" { +di as err "incompatible options: -b0- and -wmatrix-" + exit 198 + } + + if "`ewmatrix'" != "" { + if "`gmm'" != "" { +di as err "incompatible options: -ewmatrix- and 2-step efficient gmm" + exit 198 + } + local wmatrix "`ewmatrix'" + } + +* savefprefix implies savefirst + if "`savefprefix'" != "" & "`savefirst'" == "" { + local savefirst "savefirst" + } + +* default savefprefix is _ivreg2_ + if "`savefprefix'" == "" { + local savefprefix "_`ivreg2_cmd'_" + } + +* saverfprefix implies saverf + if "`saverfprefix'" != "" & "`saverf'" == "" { + local saverf "saverf" + } + +* default saverfprefix is _ivreg2_ + if "`saverfprefix'" == "" { + local saverfprefix "_`ivreg2_cmd'_" + } + +* LIML/kclass incompatibilities + if "`liml'`kclass'" != "" { + if "`gmm'`cue'" != "" { +di as err "GMM estimation not available with LIML or k-class estimators" + exit 198 + } + if `fuller' < 0 { +di as err "invalid Fuller option" + exit 198 + } + if "`liml'" != "" & "`kclass'" != "" { +di as err "cannot use liml and kclass options together" + exit 198 + } +* Process kclass string + tempname kclass2 + scalar `kclass2'=real("`kclass'") + if "`kclass'" != "" & (`kclass2' == . | `kclass2' < 0 ) { +di as err "invalid k-class option" + exit 198 + } + } + +* HAC estimation. +* If bw is omitted, default `bw' is empty string. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. + if "`bw'" != "" | "`kernel'" != "" { +* Need tvar only for markout with time-series stuff +* but data must be tsset for time-series operators in code to work + if "`tvar'" == "" { + local tvar "`_dta[_TStvar]'" + } + else if "`tvar'"!="`_dta[_TStvar]'" { +di as err "invalid tvar() option - data already tsset" + exit 5 + } + if "`ivar'" == "" { + local ivar "`_dta[_TSpanel]'" + } + else if "`ivar'"!="`_dta[_TSpanel]'" { +di as err "invalid ivar() option - data already tsset" + exit 5 + } + if "`tvar'" == "" & "`ivar'" != "" { +di as err "missing tvar() option with ivar() option" + exit 5 + } + if "`ivar'`tvar'"=="" { + capture tsset + } + else { + capture tsset `ivar' `tvar' + } + capture local tvar "`r(timevar)'" + capture local ivar "`r(panelvar)'" + + if "`tvar'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + tsreport if `tvar' != . + if `r(N_gaps)' != 0 & "`ivar'"=="" { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + + if "`bw'" == "" { +di as err "bandwidth option bw() required for HAC-robust estimation" + exit 102 + } + local bw real("`bw'") +* Check it's a valid bandwidth + if `bw' != int(`bw') | /* + */ `bw' == . | /* + */ `bw' <= 0 { +di as err "invalid bandwidth in option bw() - must be integer > 0" + exit 198 + } +* Convert bw macro to simple integer + local bw=`bw' + +* Check it's a valid kernel + local validkernel 0 + if lower(substr("`kernel'", 1, 3)) == "bar" | "`kernel'" == "" { +* Default kernel + local kernel "Bartlett" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Bartlett and bw=1 implies zero lags used. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 3)) == "par" { + local kernel "Parzen" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Parzen and bw=1 implies zero lags used. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 3)) == "tru" { + local kernel "Truncated" + local window "lag" + local validkernel 1 + } + if lower(substr("`kernel'", 1, 9)) == "tukey-han" | lower("`kernel'") == "thann" { + local kernel "Tukey-Hanning" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Tukey-Hanning and bw=1 implies zero lags. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 9)) == "tukey-ham" | lower("`kernel'") == "thamm" { + local kernel "Tukey-Hamming" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Tukey-Hamming and bw=1 implies zero lags. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 3)) == "qua" | lower("`kernel'") == "qs" { + local kernel "Quadratic spectral" + local window "spectral" + local validkernel 1 + } + if lower(substr("`kernel'", 1, 3)) == "dan" { + local kernel "Daniell" + local window "spectral" + local validkernel 1 + } + if lower(substr("`kernel'", 1, 3)) == "ten" { + local kernel "Tent" + local window "spectral" + local validkernel 1 + } + if ~`validkernel' { + di in red "invalid kernel" + exit 198 + } + } + + if "`kernel'" != "" & "`cluster'" != "" { +di as err "cannot use HAC kernel estimator with -cluster- option" + exit 198 + } + +* changed below from `endog' to `endogtest' 2Aug06 MES + if "`orthog'`endogtest'`redundant'`fwl'" != "" { + capture tsunab orthog : `orthog' + capture tsunab endogtest : `endogtest' + capture tsunab redundant : `redundant' + capture tsunab fwl : `fwl' + } + + if "`hc2'`hc3'" != "" { + if "`hc2'"!="" { + di in red "option `hc2' invalid" + } + else di in red "option `hc3' invalid" + exit 198 + } + + if "`beta'" != "" { + di in red "option `beta' invalid" + exit 198 + } + +* Weights +* fweight and aweight accepted as is +* iweight not allowed with robust or gmm and requires a trap below when used with summarize +* pweight is equivalent to aweight + robust +* but in HAC case, robust implied by `kernel' rather than `robust' + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + if "`weight'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`gmm'`kernel'" !="" { + di in red "iweights not allowed with robust or gmm" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + +* If no kernel (=no HAC) then gmm implies (heteroskedastic-) robust + if "`kernel'" == "" & "`gmm'" != "" { + local robust "robust" + } + if `dofminus' > 0 { + local dofmopt "dofminus(`dofminus')" + } +* Stock-Watson robust SEs. + if "`sw'`swpsd'" ~= "" { + if "`kernel'" ~= "" { +di as err "Stock-Watson robust SEs not supported with -kernel- option" + exit 198 + } + if "`cue'" ~= "" { +di as err "Stock-Watson robust SEs not supported with -cue- option" + exit 198 + } + if "`ivar'"=="" { +di as err "Must specify -ivar- with -sw- option" + exit 198 + } + } + + marksample touse + markout `touse' `lhs' `inexog' `exexog' `endo' `cluster' `tvar', strok + +* Weight statement + if "`weight'" ~= "" { + sum `wvar' if `touse' `wtexp', meanonly +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + +* Set local macro T and check that bw < T +* Also make sure only used sample is checked + if "`bw'" != "" { + sum `tvar' if `touse', meanonly + local T = r(max)-r(min)+1 + if `bw' > `T' { +di as err "invalid bandwidth in option bw() - cannot exceed timespan of data" + exit 198 + } + } + +************* Collinearities and duplicates block ***************** + + if "`noconstant'" != "" { + local rmcnocons "nocons" + } + +* Check for duplicates of variables +* To mimic official ivreg, in the case of duplicates, +* (1) inexog > endo +* (2) inexog > exexog +* (3) endo + exexog = inexog, as if it were "perfectly predicted" + local dupsen1 : list dups endo + local endo1 : list uniq endo + local dupsex1 : list dups exexog + local exexog1 : list uniq exexog + local dupsin1 : list dups inexog + local inexog1 : list uniq inexog +* Remove inexog from endo + local dupsen2 : list endo1 & inexog1 + local endo1 : list endo1 - inexog1 +* Remove inexog from exexog + local dupsex2 : list exexog1 & inexog1 + local exexog1 : list exexog1 - inexog1 +* Remove endo from exexog + local dupsex3 : list exexog1 & endo1 + local exexog1 : list exexog1 - endo1 + local dups "`dupsen1' `dupsex1' `dupsin1' `dupsen2' `dupsex2' `dupsex3'" + local dups : list uniq dups + + if "`nocollin'" == "" { +* First, collinearities check using canonical correlations approach +* Eigenvalue=1 => included endog is really included exogenous +* Eigenvalue=0 => included endog collinear with another included endog +* Corresponding column names give name of variable +* Code block stolen from below, so some repetition + local insts1 `inexog1' `exexog1' + local rhs1 `endo1' `inexog1' + local iv1_ct : word count `insts1' + local rhs1_ct : word count `rhs1' + local endo1_ct : word count `endo1' + local exex1_ct : word count `exexog1' + local endoexex1_ct : word count `endo1' `exexog1' + local inexog1_ct : word count `inexog1' + if `endo1_ct' > 0 { + tempname ccmat ccrealev ccimagev cc A XX XXinv ZZ ZZinv XZ XPZX + qui mat accum `A' = `endo1' `insts1' if `touse' `wtexp', `rmcnocons' + mat `XX' = `A'[1..`endo1_ct',1..`endo1_ct'] + mat `XXinv'=syminv(`XX') + mat `ZZ' = `A'[`endo1_ct'+1...,`endo1_ct'+1...] + mat `ZZinv'=syminv(`ZZ') + mat `XZ' = `A'[1..`endo1_ct',`endo1_ct'+1...] + mat `XPZX'=`XZ'*`ZZinv'*`XZ'' + mat `ccmat' = `XXinv'*`XPZX' + mat eigenvalues `ccrealev' `ccimagev' = `ccmat' + foreach vn of varlist `endo1' { + local i=colnumb(`ccmat',"`vn'") + if round(`ccmat'[`i',`i'],10e-7)==0 { +* Collinear with another endog, so remove from endog list + local endo1 : list endo1-vn + } + if round(`ccmat'[`i',`i'],10e-7)==1 { +* Collinear with exogenous, so remove from endog and add to inexog + local endo1 : list endo1-vn + local inexog1 "`inexog1' `vn'" + local ecollin "`ecollin' `vn'" + } + } +* Loop through endo1 to find Eigenvalues=0 or 1 + } + +* Remove collinearities. Use _rmcollright to enforce same priority as above. + capture version 9.2 + if _rc==0 { +* _rmcollright crashes if no arguments supplied + capture _rmcollright `inexog1' `exexog1' if `touse' `wtexp', `rmcnocons' + } + else { + qui _rmcoll `inexog1' `exexog1' if `touse' `wtexp', `rmcnocons' + } + version 8.2 + +* endo1 has had within-endo collinear removed, so non-colllinear list is _rmcoll result + endo1 + local ncvars `r(varlist)' `endo1' + local allvars1 `endo1' `inexog1' `exexog1' +* collin gets collinear variables to be removed + local collin : list allvars1-ncvars +* Remove collin from exexog1 + local exexog1 : list exexog1-collin +* Remove collin from inexog1 + local inexog1 : list inexog1-collin + +* Collinearity and duplicates warning messages, if necessary + if "`dups'" != "" { +di in gr "Warning - duplicate variables detected" +di in gr "Duplicates:" _c + Disp `dups', _col(21) + } + if "`ecollin'" != "" { +di in gr "Warning - endogenous variable(s) collinear with instruments" +di in gr "Vars now exogenous:" _c + Disp `ecollin', _col(21) + } + if "`collin'" != "" { +di in gr "Warning - collinearities detected" +di in gr "Vars dropped:" _c + Disp `collin', _col(21) + } + } + +**** End of collinearities block ************ + +**** Partial-out FWL block ****************** + + if "`fwl'" != "" { + preserve + local fwl : subinstr local fwl "_cons" "", all count(local fwlcons) + if `fwlcons' > 0 & "`noconstant'"~="" { +di in r "Error: _cons listed in fwl() but equation specifies -noconstant-." + error 198 + } + else if "`noconstant'"~="" { + local fwlcons 0 + } + else { +* Just in case of multiple _cons + local fwlcons 1 + } + local fwldrop : list inexog - inexog1 + local fwl1 : list fwl - fwldrop + local fwlcheck : list fwl1 - inexog1 + if ("`fwlcheck'"~="") { +di in r "Error: `fwlcheck' listed in fwl() but not in list of regressors." + error 198 + } + local inexog1 : list inexog1 - fwl1 + if "`cluster'"~="" { +* Check that cluster var won't be transformed + local allvars "`lhs' `inexog' `endo' `exexog'" + local clustvarcheck : list cluster in allvars + if `clustvarcheck' { +di in r "Error: cannot use cluster variable `cluster' as dependent variable, regressor or IV" +di in r " in combination with -fwl- option." + error 198 + } + } +* Constant is partialled out, unless nocons already specified in the first place + tempname fwl_resid + foreach var of varlist `lhs' `inexog1' `endo1' `exexog1' { + qui regress `var' `fwl1' if `touse' `wtexp', `noconstant' + qui predict double `fwl_resid' if `touse', resid + qui replace `var' = `fwl_resid' + drop `fwl_resid' + } + local fwl_ct : word count `fwl1' + if "`noconstant'" == "" { +* fwl_ct used for small-sample adjustment to regression F-stat + local fwl_ct = `fwl_ct' + 1 + local noconstant "noconstant" + } + } + else { +* Set count of fwl vars to zero if option not used + local fwl_ct 0 + } + +********************************************* + + local insts1 `inexog1' `exexog1' + local rhs1 `endo1' `inexog1' + local iv1_ct : word count `insts1' + local rhs1_ct : word count `rhs1' + local endo1_ct : word count `endo1' + local exex1_ct : word count `exexog1' + local endoexex1_ct : word count `endo1' `exexog1' + local inexog1_ct : word count `inexog1' + + if "`noconstant'" == "" { + local cons_ct 1 + } + else { + local cons_ct 0 + } + + if `rhs1_ct' > `iv1_ct' { + di in red "equation not identified; must have at " /* + */ "least as many instruments not in" + di in red "the regression as there are " /* + */ "instrumented variables" + exit 481 + } + + if `rhs1_ct' + `cons_ct' == 0 { + di in red "error: no regressors specified" + exit 102 + } + + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + if "`robust'"=="" { + local robust "robust" + } + } + if "`bw'"!="" { + local bwopt "bw(`bw')" + } + if "`kernel'"!="" { + local kernopt "kernel(`kernel')" + } +* If depname not provided (default) name is lhs variable + if "`depname'"=="" { + local depname `lhs' + } + +************************************************************************************************ +* Cross-products and basic IV coeffs, residuals and moment conditions + tempvar iota y2 yhat ivresid ivresid2 gresid gresid2 lresid lresid2 b0resid b0resid2 s1resid + tempname Nprec ysum yy yyc r2u r2c B V ivB gmmB wB lB gmmV ivest + tempname r2 r2_a ivrss lrss wbrss b0rss rss mss rmse sigmasq iv_s2 l_s2 wb_s2 b0_s2 F Fp Fdf2 + tempname S Sinv W s1Zu s2Zu b0Zu wbZu wbresid wbresid2 s1sigmasq + tempname A XZ XZa XZb Zy ZZ ZZinv XPZX XPZXinv XPZy + tempname YY Z2Z2 ZY Z2Y XXa XXb XX Xy Z2Z2inv XXinv + tempname XZWZX XZWZXinv XZWZy XZW + tempname B V B1 uZSinvZu j jp arubin arubinp tempmat + +* Generate cross-products of y, X, Z + qui matrix accum `A' = `lhs' `endo1' `exexog1' `inexog1' /* + */ if `touse' `wtexp', `noconstant' + if "`noconstant'"=="" { + matrix rownames `A' = `lhs' `endo1' `exexog1' /* + */ `inexog1' _cons + matrix colnames `A' = `lhs' `endo1' `exexog1' /* + */ `inexog1' _cons + } + else { + matrix rownames `A' = `lhs' `endo1' `exexog1' `inexog1' + matrix colnames `A' = `lhs' `endo1' `exexog1' `inexog1' + } + if `endo1_ct' > 0 { +* X'Z is [endo1 inexog1]'[exexog1 inexog1] + mat `XZ'=`A'[2..`endo1_ct'+1,`endo1_ct'+2...] +* Append portion corresponding to included exog if they (incl constant) exist + if 2+`endo1_ct'+`iv1_ct'-(`rhs1_ct'-`endo1_ct') /* + */ <= rowsof(`A') { + mat `XZ'=`XZ' \ /* + */ `A'[2+`endo1_ct'+`iv1_ct'- /* + */ (`rhs1_ct'-`endo1_ct')..., /* + */ `endo1_ct'+2...] + } +* If included exog (incl const) exist, create XX matrix in 3 steps + if `inexog1_ct' + `cons_ct' > 0 { + mat `XXa' = `A'[2..`endo1_ct'+1, 2..`endo1_ct'+1], /* + */ `A'[2..`endo1_ct'+1, `endoexex1_ct'+2...] + mat `XXb' = `A'[`endoexex1_ct'+2..., 2..`endo1_ct'+1], /* + */ `A'[`endoexex1_ct'+2..., `endoexex1_ct'+2...] + mat `XX' = `XXa' \ `XXb' + mat `Xy' = `A'[2..`endo1_ct'+1, 1] \ `A'[`endoexex1_ct'+2..., 1] + } + else { + mat `XX' = `A'[2..`endo1_ct'+1, 2..`endo1_ct'+1] + mat `Xy' = `A'[2..`endo1_ct'+1, 1] + } + } + else { +* Cragg HOLS estimator with no endogenous variables + mat `XZ'= `A'[2+`iv1_ct'-(`rhs1_ct'-`endo1_ct')..., /* + */ 2...] + mat `XX' = `A'[`endoexex1_ct'+2..., `endoexex1_ct'+2...] + mat `Xy' = `A'[`endoexex1_ct'+2..., 1] + } + + mat `XX'=(`XX'+`XX'')/2 + mat `XXinv'=syminv(`XX') + mat `Zy'=`A'[`endo1_ct'+2...,1] + mat `ZZ'=`A'[`endo1_ct'+2...,`endo1_ct'+2...] + mat `ZZ'=(`ZZ'+`ZZ'')/2 + mat `ZZinv'=syminv(`ZZ') +* diag0cnt probably superfluous since collinearity checks will catch this unless disabled + local iv_ct = rowsof(`ZZ') - diag0cnt(`ZZinv') + mat `YY'=`A'[1..`endo1_ct'+1, 1..`endo1_ct'+1] + mat `ZY' = `A'[`endo1_ct'+2..., 1..`endo1_ct'+1] + mat `XPZX'=`XZ'*`ZZinv'*`XZ'' + mat `XPZX'=(`XPZX'+`XPZX'')/2 + mat `XPZXinv'=syminv(`XPZX') + mat `XPZy'=`XZ'*`ZZinv'*`Zy' +****************************** + qui gen byte `iota'=1 + qui gen double `y2'=`lhs'^2 +* Stata summarize won't work with iweights, so must use matrix cross-product + qui matrix vecaccum `ysum' = `iota' `y2' `lhs' `wtexp' if `touse' +* Nprec is ob count from mat accum. Use this rather than `N' in calculations +* here and below because in official -regress- `N' is rounded if iweights are used. + scalar `Nprec'=`ysum'[1,3] + if "`weight'" == "iweight" { + scalar `Nprec'=round(`Nprec') + } + local N=round(`Nprec') + scalar `yy'=`ysum'[1,1] + scalar `yyc'=`yy'-`ysum'[1,2]^2/`Nprec' + +******************************************************************************************* +* First-step estimators: b0, wmatrix, LIML-kclass, IV. +* Generate residuals s1resid for used in 2SFEGMM and robust. +* User-supplied b0 provides value of CUE obj fn. + if "`b0'" != "" { + capture drop `yhat' + qui mat score double `yhat' = `b0' if `touse' + qui gen double `b0resid'=`lhs'-`yhat' + qui gen double `b0resid2'=`b0resid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `b0resid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `b0rss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `b0_s2'=`b0rss'/(`Nprec'-`dofminus') + scalar `s1sigmasq'=`b0_s2' + qui gen double `s1resid'=`b0resid' + } + else if "`wmatrix'" != "" { +* GMM with arbitrary weighting matrix provides first-step estimates + local cn : colnames(`ZZ') + matrix `W'=`wmatrix' +* Rearrange/select columns to mat IV matrix + capture matsort `W' "`cn'" + local wrows = rowsof(`W') + local wcols = colsof(`W') + local zcols = colsof(`ZZ') + if _rc ~= 0 | (`wrows'~=`zcols') | (`wcols'~=`zcols') { +di as err "-wmatrix- option error: supplied matrix columns/rows do not match IV list" +exit 198 + } + mat `XZWZX'=`XZ'*`W'*`XZ'' + mat `XZWZy'=`XZ'*`W'*`Zy' + mat `XZWZX'=(`XZWZX'+`XZWZX'')/2 + mat `XZWZXinv'=syminv(`XZWZX') + mat `XZW'=`XZ'*`W' + mat `wB'=`XZWZy''*`XZWZXinv'' + + capture drop `yhat' + qui mat score double `yhat' = `wB' if `touse' + qui gen double `wbresid'=`lhs'-`yhat' + qui gen double `wbresid2'=`wbresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `wbresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `wbrss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `wb_s2'=`wbrss'/(`Nprec'-`dofminus') + scalar `s1sigmasq'=`wb_s2' + qui gen double `s1resid'=`wbresid' + } + else if "`liml'`kclass'" != "" { +* LIML and kclass code + tempname WW WW1 Evec Eval Evaldiag target lambda lambda2 khs XhXh XhXhinv ll + if "`kclass'" == "" { +* LIML block + matrix `WW' = `YY' - `ZY''*`ZZinv'*`ZY' + if `inexog1_ct' + `cons_ct' > 0 { + mat `Z2Y' = `A'[`endoexex1_ct'+2..., 1..`endo1_ct'+1] + mat `Z2Z2' = `A'[`endoexex1_ct'+2..., `endoexex1_ct'+2...] + mat `Z2Z2'=(`Z2Z2'+`Z2Z2'')/2 + mat `Z2Z2inv' = syminv(`Z2Z2') + matrix `WW1' = `YY' - `Z2Y''*`Z2Z2inv'*`Z2Y' + } + else { +* Special case of no included exogenous (incl constant) + matrix `WW1' = `YY' + } + matrix `WW'=(`WW'+`WW'')/2 + matrix symeigen `Evec' `Eval' = `WW' + matrix `Evaldiag' = diag(`Eval') +* Replace diagonal elements of Evaldiag with the element raised to the power (-1/2) + local i 1 + while `i' <= rowsof(`Evaldiag') { +* Need to use capture because with collinearities, diag may be virtually zero +* ... but actually negative + capture matrix `Evaldiag'[`i',`i'] = /* + */ `Evaldiag'[`i',`i']^(-0.5) + local i = `i'+1 + } + matrix `target' = (`Evec'*`Evaldiag'*`Evec'') * `WW1' /* + */ * (`Evec'*`Evaldiag'*`Evec'') +* Re-use macro names + matrix `target'=(`target'+`target'')/2 + matrix symeigen `Evec' `Eval' = `target' +* Get smallest eigenvalue +* Note that collinearities can yield a nonsense eigenvalue appx = 0 +* and just-identified will yield an eigenvalue that is ALMOST exactly = 1 +* so require it to be >= 0.9999999999. + local i 1 + scalar `lambda'=. + scalar `lambda2'=. + while `i' <= colsof(`Eval') { + if (`lambda' > `Eval'[1,`i']) & (`Eval'[1,`i'] >=0.9999999999) { + scalar `lambda2' = `lambda' + scalar `lambda' = `Eval'[1,`i'] + } + local i = `i'+1 + } + if `fuller'==0 { +* Basic LIML. Macro kclass2 is the scalar. + scalar `kclass2'=`lambda' + } + else { +* Fuller LIML + if `fuller' > (`N'-`iv_ct') { +di as err "error: invalid choice of Fuller LIML parameter" + exit 198 + } + scalar `kclass2' = `lambda' - `fuller'/(`N'-`iv_ct') + } +* End of LIML block + } + mat `XhXh'=(1-`kclass2')*`XX'+`kclass2'*`XPZX' + mat `XhXh'=(`XhXh'+`XhXh'')/2 + mat `XhXhinv'=syminv(`XhXh') + mat `lB'=`Xy''*`XhXhinv'*(1-`kclass2') + `kclass2'*`Zy''*`ZZinv'*`XZ''*`XhXhinv' + capture drop `yhat' + qui mat score double `yhat'=`lB' if `touse' + qui gen double `lresid'=`lhs' - `yhat' + qui gen double `lresid2'=`lresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `lresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `lrss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `l_s2'=`lrss'/(`Nprec'-`dofminus') + scalar `s1sigmasq'=`l_s2' + qui gen double `s1resid'=`lresid' + } + else { +* IV resids are 1st-step GMM resids +* In these expressions, ignore scaling of W + mat `ivB' = `XPZy''*`XPZXinv'' + mat `XZWZX'=`XPZX' + mat `XZWZXinv'=`XPZXinv' + mat `XZW'=`XZ'*`ZZinv' + capture drop `yhat' + qui mat score double `yhat' = `ivB' if `touse' + qui gen double `ivresid'=`lhs'-`yhat' + qui gen double `ivresid2'=`ivresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `ivresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `ivrss'=`ysum'[1,1] + scalar `iv_s2'=`ivrss'/(`Nprec'-`dofminus') + scalar `s1sigmasq'=`iv_s2' + qui gen double `s1resid'=`ivresid' + } +* Orthogonality conditions using step 1 residuals + qui mat vecaccum `s1Zu'=`s1resid' `exexog1' `inexog1' /* + */ `wtexp' if `touse', `noconstant' + +******************************************************************************************* +* S covariance matrix of orthogonality conditions +******************************************************************************************* +* If user-supplied S matrix is used, use it + if "`smatrix'" != "" { + local cn : colnames(`ZZ') + matrix `S'=`smatrix' +* Rearrange/select columns to mat IV matrix + capture matsort `S' "`cn'" + local srows = rowsof(`S') + local scols = colsof(`S') + local zcols = colsof(`ZZ') + if _rc ~= 0 | (`srows'~=`zcols') | (`scols'~=`zcols') { +di as err "-smatrix- option error: supplied matrix columns/rows do not match IV list" +exit 198 + } + mat `S' = (`S' + `S'') / 2 + mat `Sinv'=syminv(`S') + local rankS = rowsof(`Sinv') - diag0cnt(`Sinv') + } + +******************************************************************************************* +* Start robust block for robust-HAC S and Sinv +* Do not enter if user supplies smatrix or if CUE + if "`robust'`cluster'" != "" & "`cue'"=="" & "`smatrix'"=="" { +* Optimal weighting matrix +* Block calculates S_0 robust matrix +* _robust has same results as +* mat accum `S'=`exexog1' `inexog1' [iweight=`ivresid'^2] if `touse' +* mat `S' = `S'*1/`Nprec' +* _robust doesn't work properly with TS variables, so must first tsrevar + tsrevar `exexog1' `inexog1' + local TSinsts1 `r(varlist)' +* Create identity matrix with matching col/row names + mat `S'=I(colsof(`s1Zu')) + if "`noconstant'"=="" { + mat colnames `S' = `TSinsts1' "_cons" + mat rownames `S' = `TSinsts1' "_cons" + } + else { + mat colnames `S' = `TSinsts1' + mat rownames `S' = `TSinsts1' + } + _robust `s1resid' `wtexp' if `touse', variance(`S') `clopt' minus(0) + if "`cluster'"!="" { + local N_clust=r(N_clust) + } + mat `S' = `S'*1/`Nprec' +* Above doesn't work properly with iweights (i.e. yield same matrix as fw), +* hence iweight trap at start + if "`kernel'" != "" { +* HAC block for S_1 onwards matrices + tempvar vt1 + qui gen double `vt1' = . + tempname tt tx kw karg ow +* Use insts with TS ops removed and with iota (constant) column + if "`noconstant'"=="" { + local insts1c "`TSinsts1' `iota'" + } + else { + local insts1c "`TSinsts1'" + } + local iv1c_ct : word count `insts1c' +* "tau=0 loop" is S_0 block above for all robust code + local tau 1 +* Spectral windows require looping through all T-1 autocovariances + if "`window'" == "spectral" { + local TAU `T'-1 +di in ye "Computing kernel ..." + } + else { + local TAU `bw' + } + if "`weight'" == "" { +* If no weights specified, define neutral ow variable and weight expression for code below + qui gen byte `ow'=1 + local wtexp `"[fweight=`wvar']"' + } + else { +* pweights and aweights + summ `wvar' if `touse', meanonly + qui gen double `ow' = `wvar'/r(mean) + } + while `tau' <= `TAU' { + capture mat drop `tt' + local i 1 + while `i' <= `iv1c_ct' { + local x : word `i' of `insts1c' +* Add lags defined with TS operators + local Lx "L`tau'.`x'" + local Ls1resid "L`tau'.`s1resid'" + local Low "L`tau'.`ow'" + qui replace `vt1' = `Lx'*`s1resid'* /* + */ `Ls1resid'*`Low'*`ow' if `touse' +* Use capture here because there may be insufficient observations, e.g., if +* the IVs include lags and tau=N-1. _rc will be 2000 in this case. + capture mat vecaccum `tx' = `vt1' `insts1c' /* + */ if `touse', nocons + if _rc == 0 { + mat `tt' = nullmat(`tt') \ `tx' + } + local i = `i'+1 + } +* bw = bandwidth, karg is argument to kernel function, kw is kernel function (weight) + scalar `karg' = `tau'/(`bw') + if "`kernel'" == "Truncated" { + scalar `kw'=1 + } + if "`kernel'" == "Bartlett" { + scalar `kw'=(1-`karg') + } + if "`kernel'" == "Parzen" { + if `karg' <= 0.5 { + scalar `kw' = 1-6*`karg'^2+6*`karg'^3 + } + else { + scalar `kw' = 2*(1-`karg')^3 + } + } + if "`kernel'" == "Tukey-Hanning" { + scalar `kw'=0.5+0.5*cos(_pi*`karg') + } + if "`kernel'" == "Tukey-Hamming" { + scalar `kw'=0.54+0.46*cos(_pi*`karg') + } + if "`kernel'" == "Tent" { + scalar `kw'=2*(1-cos(`tau'*`karg')) / (`karg'^2) + } + if "`kernel'" == "Daniell" { + scalar `kw'=sin(_pi*`karg') / (_pi*`karg') + } + if "`kernel'" == "Quadratic spectral" { + scalar `kw'=25/(12*_pi^2*`karg'^2) /* + */ * ( sin(6*_pi*`karg'/5)/(6*_pi*`karg'/5) /* + */ - cos(6*_pi*`karg'/5) ) + } +* Need -capture-s here because tt may not exist (because of insufficient observations/lags) + capture mat `tt' = (`tt'+`tt'')*`kw'*1/`Nprec' + if _rc == 0 { + mat `S' = `S' + `tt' + } + local tau = `tau'+1 + } + if "`weight'" == "" { +* If no weights specified, remove neutral weight variables + local wtexp "" + } + } +* To give S the right col/row names + mat `S'=`S'+0*diag(`s1Zu') +* Right approach is to adjust S by N/(N-dofminus) if NOT cluster +* because clustered S is already "adjusted" + if "`cluster'"=="" { + mat `S'=`S'*`Nprec'/(`Nprec'-`dofminus') + } +* Stock-Watson robust SEs. Requires `wvar' to be defined above. +* Correspondence between S-W (2006) and code below assumes ivreg2 is called on demeaned data. +* Variable ivar identifies the observational unit. +* wvar will simply be 1 for all observations unless weights are used. +* T_i is number of observations for an observational unit, extended to unbalanced data. +* SW consider only balanced data and denote this as T (constant acros units). +* s1resid is (fixed effects) residuals. SW denote this as u_tilda_hat (p. 2, eqn 4). +* s2 is, for an observational unit i, 1/(T-1) * sum of squared (fixed effects) residuals. +* This is the second term in () in the expression for B_hat in SW eqn 6, p. 3. +* mat opaccum calculates a cross-prod of the form A = X1'e1e1'X1 + X2'e2e2'X2 + ... + Xk'ekek'Xk +* ei is s from above. eiei' is a T_i x T_i matrix filled with s_i2s. Thus the cross-prod becomes +* A = s_1^2*X1'X1 + s_2^2*X2'e2e2'X2 + ... + s_k^2*Xk'Xk +* which is the form of B_hat in SW eqn 6 p. 3, except for the missing 1/N and 1/T +* In unbalanced case, 1/T isn't constant, so must incorporate the 1/T that weights the Xi'Xi into the s, +* hence the second division of s2 by T_i. +* S is SW's Sigma_hat_HR-FE, which is the fixed effects S (=Sigma_hat_HR-XS) minus 1/(T-1)*B)hat +* and then multiplied by (T-1)/(T-2). In SW, T is constant because they cover only the balanced case. +* Here, T varies across units, so we use the harmonic mean of T for T_bar. +* PSD code by CFB based on SW point 10 on p. 6. Guarantees S will be PSD. + if "`sw'`swpsd'" ~= "" { + tempname B s s2 T_i T_inv T_bar s1resid2 + qui gen double `s1resid2'=`s1resid'^2 + sort `ivar' `touse' + qui by `ivar' `touse': gen long `T_i' = sum(`wvar') if `touse' + qui by `ivar' `touse': replace `T_i' = `T_i'[_N] if `touse' & _n<_N + qui gen `T_inv' = 1/`T_i' + sum `T_inv' if `touse', meanonly + scalar `T_bar' = 1/r(mean) + qui by `ivar' `touse': gen double `s2'=sum(`s1resid2'*`wvar') if `touse' + qui by `ivar' `touse': replace `s2'=`s2'[_N] if `touse' & _n<_N + qui replace `s2' = `s2'/(`T_i'-1) + qui replace `s2' = `s2'/`T_i' + qui gen double `s' = sqrt(`s2') + qui mat opaccum `B'=`exexog1' `inexog1' `wtexp' if `touse', /* + */ group(`ivar') opvar(`s') `noconstant' + mat `B' = `B' * 1/`Nprec' + mat `S' = (`T_bar'-1)/(`T_bar'-2)*(`S' - `B'*1/(`T_bar'-1)) + if "`swpsd'" ~= "" { + mat `S'=(`S'+`S'')/2 + tempname X v + mat symeigen `X' `v' = `S' + local ncol = colsof(`S') + forv i=1/`ncol' { + mat `v'[1,`i']= abs(`v'[1,`i']) + } + mat `S' = `X' * diag(`v') * `X'' + } + } + mat `S'=(`S'+`S'')/2 + mat `Sinv'=syminv(`S') + local rankS = rowsof(`Sinv') - diag0cnt(`Sinv') + } + +* End robust-HAC S and Sinv block +************************************************************************************ +* Block for non-robust S and Sinv, including autocorrelation-consistent (AC). +* Do not enter if user supplies smatrix or if cue + + if "`robust'`cluster'`cue'`smatrix'"=="" { +* First do with S_0 (=S for simple IV) +* Step 1 sigma^2 is IV sigma^2 unless b0 or wmatrix provided + mat `S' = `s1sigmasq'*`ZZ'*(1/`Nprec') + + if "`kernel'" != "" { +* AC code for S_1 onwards matrices + tempvar vt1 + qui gen double `vt1' = . + tempname tt tx kw karg ow sigttj +* Use insts with TS ops removed and with iota (constant) column + tsrevar `exexog1' `inexog1' + local TSinsts1 `r(varlist)' + if "`noconstant'"=="" { + local insts1c "`TSinsts1' `iota'" + } + else { + local insts1c "`TSinsts1'" + } + local iv1c_ct : word count `insts1c' +* "tau=0 loop" is S_0 block above + local tau 1 +* Spectral windows require looping through all T-1 autocovariances + if "`window'" == "spectral" { + local TAU `T'-1 +di in ye "Computing kernel ..." + } + else { + local TAU `bw' + } + if "`weight'" == "" { +* If no weights specified, define neutral ow variable and wtexp for code below + qui gen byte `ow'=1 + local wtexp `"[fweight=`wvar']"' + } + else { +* pweights and aweights + summ `wvar' if `touse', meanonly + qui gen double `ow' = `wvar'/r(mean) + } + while `tau' <= `TAU' { + capture mat drop `tt' + local i 1 +* errflag signals problems that make this loop's tt invalid + local errflag 0 +* Additional marksample/markout required so that treatment of MVs is consistent across all IVs + marksample touse2 + markout `touse2' `insts1c' L`tau'.(`insts1c') + local Low "L`tau'.`ow'" + while `i' <= `iv1c_ct' { + local x : word `i' of `insts1c' +* Add lags defined with TS operators + local Lx "L`tau'.`x'" + qui replace `vt1'=. + qui replace `vt1' = `Lx'*`Low'*`ow' if `touse' & `touse2' +* Use capture here because there may be insufficient observations, e.g., if +* the IVs include lags and tau=N-1. _rc will be 2000 in this case. + capture mat vecaccum `tx' = `vt1' `insts1c' /* + */ if `touse', nocons + if _rc == 0 { + mat `tt' = nullmat(`tt') \ `tx' + } + local i = `i'+1 + } + capture mat `tt' = 1/`Nprec' * `tt' + if _rc != 0 { + local errflag = 1 + } + local Ls1resid "L`tau'.`s1resid'" +* Weights belong here as well + tempvar ivLiv + qui gen double `ivLiv' = `s1resid'*`Ls1resid'*`ow'*`Low' if `touse' + qui sum `ivLiv' if `touse', meanonly + scalar `sigttj' = r(sum)/`Nprec' + + capture mat `tt' = `sigttj' * `tt' +* bw = bandwidth, karg is argument to kernel function, kw is kernel function (weight) + scalar `karg' = `tau'/(`bw') + if "`kernel'" == "Truncated" { + scalar `kw'=1 + } + if "`kernel'" == "Bartlett" { + scalar `kw'=(1-`karg') + } + if "`kernel'" == "Parzen" { + if `karg' <= 0.5 { + scalar `kw' = 1-6*`karg'^2+6*`karg'^3 + } + else { + scalar `kw' = 2*(1-`karg')^3 + } + } + if "`kernel'" == "Tukey-Hanning" { + scalar `kw'=0.5+0.5*cos(_pi*`karg') + } + if "`kernel'" == "Tukey-Hamming" { + scalar `kw'=0.54+0.46*cos(_pi*`karg') + } + if "`kernel'" == "Tent" { + scalar `kw'=2*(1-cos(`tau'*`karg')) / (`karg'^2) + } + if "`kernel'" == "Daniell" { + scalar `kw'=sin(_pi*`karg') / (_pi*`karg') + } + if "`kernel'" == "Quadratic spectral" { + scalar `kw'=25/(12*_pi^2*`karg'^2) /* + */ * ( sin(6*_pi*`karg'/5)/(6*_pi*`karg'/5) /* + */ - cos(6*_pi*`karg'/5) ) + } + +* Need -capture-s here because tt may not exist (because of insufficient observations/lags) + capture mat `tt' = (`tt'+`tt'')*`kw' + if _rc != 0 { + local errflag = 1 + } +* Accumulate if tt is valid + if `errflag' == 0 { + capture mat `S' = `S' + `tt' + } + local tau = `tau'+1 + } + if "`weight'" == "" { +* If no weights specified, remove neutral weight variables + local wtexp "" + } + } +* End of AC code +* To give S the right col/row names + mat `S'=`S'+0*diag(`s1Zu') + mat `S'=(`S'+`S'')/2 + mat `Sinv'=syminv(`S') + local rankS = rowsof(`Sinv') - diag0cnt(`Sinv') + } + +* End of non-robust S and Sinv code (including AC) +******************************************************************************************* +* 2nd step and final coefficients +******************************************************************************************* +* User-supplied b0. CUE objective function. + if "`b0'" ~= "" { + mat `B' = `b0' + scalar `rss'=`b0rss' + scalar `sigmasq'=`b0_s2' + mat `W' = `Sinv' + } +******************************************************************************************* +* Block for gmm 2nd step to get coefficients and 2nd step residuals + +* Non-robust IV, LIML, k-class, CUE do not enter + if "`gmm'`robust'`cluster'`kernel'`wmatrix'" != "" & "`cue'"=="" & "`ewmatrix'"=="" { + mat `tempmat'=`XZ'*`Sinv'*`XZ'' + mat `tempmat'=(`tempmat'+`tempmat'')/2 + mat `B1'=syminv(`tempmat') + mat `B1'=(`B1'+`B1'')/2 + mat `gmmB'=(`B1'*`XZ'*`Sinv'*`Zy')' + + capture drop `yhat' + qui mat score double `yhat'=`gmmB' if `touse' + qui gen double `gresid'=`lhs'-`yhat' + qui gen double `gresid2'=`gresid'^2 + qui mat vecaccum `s2Zu'=`gresid' `exexog1' `inexog1' /* + */ `wtexp' if `touse', `noconstant' + } +******************************************************************************************* +* GMM with arbitrary weighting matrix + if ("`wmatrix'"~="") & ("`gmm'"=="") & ("`liml'`kclass'`cue'"=="") & "`b0'"=="" { + mat `B'=`wB' + scalar `rss'=`wbrss' + scalar `sigmasq'=`wb_s2' +* Weighting matrix wmatrix already checked and assigned to macro W + } +******************************************************************************************* +* IV coefficients + if ("`wmatrix'"=="") & ("`gmm'"=="") & ("`liml'`kclass'`cue'"=="") & "`b0'"=="" { + mat `B'=`ivB' + scalar `rss'=`ivrss' + scalar `sigmasq'=`iv_s2' +* IV weighting matrix. By convention, no small-sample adjustment (consistent with S) + mat `W' = `ZZinv'*(`Nprec'-`dofminus')/`iv_s2' + } +******************************************************************************************* +* LIML, k-class coefficients + if "`liml'`kclass'" ~= "" { + mat `B'=`lB' + scalar `rss'=`lrss' + scalar `sigmasq'=`l_s2' +* No weighting matrix. + } +******************************************************************************************* +* Efficient GMM coefficients + if "`gmm'"!="" & ("`liml'`kclass'`cue'"=="") & "`b0'"=="" { + mat `B'=`gmmB' + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `gresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `rss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `sigmasq'=`rss'/(`Nprec'-`dofminus') + mat `W'=`Sinv' + } +******************************************************************************************* +* Var-cov matrix +******************************************************************************************* +* Expressions below multipy by N because we are working with cross-products (XZ) not vcvs (Qxz) +* Efficient GMM: homoskedastic IV, 2-step FEGMM. LIML, k-class, CUE handled separately. +* No robust, cluster, kernel => must be efficient GMM +* GMM option => must be efficient GMM +* b0 => must be efficient GMM +* ewmatrix => must be efficient GMM + tempname rankV + if ("`robust'`cluster'`kernel'`liml'`kclass'`cue'`wmatrix'"=="") /* + */ | ("`gmm'"~="") /* + */ | ("`b0'"~="") /* + */ | ("`ewmatrix'"~="") { + mat `tempmat'=`XZ'*`Sinv'*`XZ'' + mat `tempmat'=(`tempmat'+`tempmat'')/2 + mat `V' = syminv(`tempmat')*`Nprec' + mat `V'=(`V'+`V'')/2 + scalar `rankV'=rowsof(`tempmat') - diag0cnt(`tempmat') + } +* Possibly inefficient GMM: robust of all sorts with no 2nd step. LIML, k-class, CUE handled separately. + else if ("`liml'`kclass'`cue'"=="") { + mat `V'=`XZWZXinv'*`XZW'*`S'* /* + */ `XZW''*`XZWZXinv'*`Nprec' + mat `V'=(`V'+`V'')/2 + mat `tempmat'=syminv(`V') + scalar `rankV'=rowsof(`tempmat') - diag0cnt(`tempmat') + } +* LIML and k-class non-robust + else if ("`liml'`kclass'" ~= "") & ("`robust'`cluster'" == "") { + if "`coviv'"== "" { +* LIML or k-class cov matrix + mat `V'=`sigmasq'*`XhXhinv' + scalar `rankV'=rowsof(`XhXh') - diag0cnt(`XhXh') + } + else { +* IV cov matrix + mat `V'=`sigmasq'*`XPZXinv' + scalar `rankV'=rowsof(`XPZXinv') - diag0cnt(`XPZXinv') + } + mat `V'=(`V'+`V'')/2 + } +* LIML and k-class robust + else if ("`liml'`kclass'" ~= "") & ("`robust'`cluster'" ~= "") { + if "`coviv'"== "" { +* Use LIML or k-class cov matrix + mat `V'=`XhXhinv'*`XZ'*`ZZinv'*`S'*`Nprec'* /* + */ `ZZinv'*`XZ''*`XhXhinv' + } + else { +* Use IV cov matrix + mat `V'=`XPZXinv'*`XZ'*`ZZinv'*`S'*`Nprec'* /* + */ `ZZinv'*`XZ''*`XPZXinv' + } + mat `V'=(`V'+`V'')/2 + mat `tempmat'=syminv(`V') + scalar `rankV'=rowsof(`tempmat') - diag0cnt(`tempmat') + } +* Model df handled here since it depends on rank of V +* CUE handled separately + if "`cue'"=="" { + if "`noconstant'"=="" { + local df_m = `rankV' - 1 + } + else { + local df_m = `rankV' + } + } +* End of VCV block +******************************************************************************** +* Sargan-Hansen-Anderson-Rubin statistics +******************************************************************************************* +* Robust requires using gmm residuals; otherwise use iv residuals. CUE handled separately. +* b0 => return value of CUE objective function. b0 is efficient GMM. + if ("`robust'`cluster'`kernel'" == "") & ("`cue'"=="") & ("`b0'`ewmatrix'"=="") { + mat `uZSinvZu'= (`s1Zu'/`Nprec')*`Sinv'*(`s1Zu''/`Nprec') + scalar `j' = `Nprec'*`uZSinvZu'[1,1] + } + if ("`robust'`cluster'`kernel'" ~= "") & ("`cue'"=="") & ("`b0'`ewmatrix'"=="") { + mat `uZSinvZu'= (`s2Zu'/`Nprec')*`Sinv'*(`s2Zu''/`Nprec') + scalar `j' = `Nprec'*`uZSinvZu'[1,1] + } + if "`b0'`ewmatrix'"~="" { + mat `uZSinvZu'= (`s1Zu'/`Nprec')*`Sinv'*(`s1Zu''/`Nprec') + scalar `j' = `Nprec'*`uZSinvZu'[1,1] + } + if "`liml'" != "" { +* Also save Anderson-Rubin overid stat if LIML +* Note dofminus is required because unlike Sargan and 2-step GMM J, doesn't derive from S + scalar `arubin'=(`Nprec'-`dofminus')*ln(`lambda') + } + +*************************************************************************************** +* Block for cue gmm +******************************************************************************************* + if "`cue'" != "" { +* Set up variables and options as globals + global IV_lhs "`lhs'" + global IV_inexog "`inexog1'" + global IV_endog "`endo1'" + global IV_exexog "`exexog1'" + global IV_wt "`wtexp'" + global IV_opt "`noconstant' `robust' `clopt' `bwopt' `kernopt' `dofmopt'" +* `gmm' not in IV_opt because cue+gmm not allowed +* Initial values use 2-step GMM if robust + if "`robust'`cluster'"~="" { + local init_opt "gmm" + } + tempname b_init temphold + capture _estimates hold `temphold', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + qui `ivreg2_cmd' $IV_lhs $IV_inexog ($IV_endog=$IV_exexog) $IV_wt /* + */ if `touse', $IV_opt `init_opt' noid +* Trap here if just-identified + if e(rankzz)>e(rankxx) { + if "`cueinit'"== "" { + mat `b_init'=e(b) + } + else { + mat `b_init'=`cueinit' + } +* Use ML for numerical optimization + ml model d0 `ivreg2_cmd'_cue ($IV_lhs = $IV_endog $IV_inexog, `noconstant') $IV_wt /* + */ if `touse', maximize init(`b_init') `cueoptions' /* + */ crittype(neg GMM obj function -J) /* + */ collinear nooutput nopreserve missing noscvars + } + else { +di in ye "Equation exactly-identified: CUE and 2-step GMM coincide" + } +* Remove equation number from column names + mat `B'=e(b) + mat colnames `B' = _: +* Last call to get vcv, j, Sinv etc. + qui `ivreg2_cmd' $IV_lhs $IV_inexog ($IV_endog=$IV_exexog) $IV_wt /* + */ if `touse', $IV_opt b0(`B') noid +* Save all results + mat `V'=e(V) + mat `S'=e(S) + mat `Sinv'=syminv(`S') + mat `W'=`Sinv' + + local rankS = e(rankS) + scalar `j'=e(j) + local df_m = e(df_m) + scalar `rankV'=e(rankV) + + if "`cluster'" != "" { + local N_clust=e(N_clust) + } + capture drop `yhat' + qui mat score double `yhat'=`B' if `touse' + qui gen double `gresid'=`lhs'-`yhat' + qui gen double `gresid2'=`gresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `gresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `rss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `sigmasq'=`rss'/(`Nprec'-`dofminus') + + macro drop IV_lhs IV_inexog IV_endog IV_exexog IV_wt IV_opt + capture _estimates unhold `temphold' + } + +******************************************************************************************* +* RSS, counts, dofs, F-stat, small-sample corrections +******************************************************************************************* + scalar `rmse'=sqrt(`sigmasq') + if "`noconstant'"=="" { + scalar `mss'=`yyc' - `rss' + } + else { + scalar `mss'=`yy' - `rss' + } + +* Counts modified to include constant if appropriate + if "`noconstant'"=="" { + local iv1_ct = `iv1_ct' + 1 + local rhs1_ct = `rhs1_ct' + 1 + } +* Correct count of rhs variables accounting for dropped collinear vars +* Count includes constant + + local rhs_ct = rowsof(`XX') - diag0cnt(`XXinv') + + if "`cluster'"=="" { +* Residual dof adjusted for dofminus + local df_r = `N' - `rhs_ct' - `dofminus' + } + else { +* To match Stata, subtract 1 (why 1 and not `rhs_ct' is a mystery) + local df_r = `N_clust' - 1 + } + +* Sargan-Hansen J dof and p-value +* df=0 doesn't guarantee j=0 since can be call to get value of CUE obj fn + local jdf = `iv_ct' - `rhs_ct' + if `jdf' == 0 & "`b0'"=="" { + scalar `j' = 0 + } + else { + scalar `jp' = chiprob(`jdf',`j') + } + if "`liml'"~="" { + scalar `arubinp' = chiprob(`jdf',`arubin') + } + +* Small sample corrections for var-cov matrix. +* If robust, the finite sample correction is N/(N-K), and with no small +* we change this to 1 (a la Davidson & MacKinnon 1993, p. 554, HC0). +* If cluster, the finite sample correction is (N-1)/(N-K)*M/(M-1), and with no small +* we change this to 1 (a la Wooldridge 2002, p. 193), where M=number of clusters. +* In the adj of the V matrix for non-small, we use Nprec instead of N because +* iweights rounds off N. Note that iweights are not allowed with robust +* but we use Nprec anyway to maintain consistency of code. + + if "`small'" != "" { + if "`cluster'"=="" { + matrix `V'=`V'*(`Nprec'-`dofminus')/(`Nprec'-`rhs_ct'-`dofminus') + } + else { + matrix `V'=`V'*(`Nprec'-1)/(`Nprec'-`rhs_ct') /* + */ * `N_clust'/(`N_clust'-1) + } + scalar `sigmasq'=`rss'/(`Nprec'-`rhs_ct'-`dofminus') + scalar `rmse'=sqrt(`sigmasq') + } + + scalar `r2u'=1-`rss'/`yy' + scalar `r2c'=1-`rss'/`yyc' + if "`noconstant'"=="" { + scalar `r2'=`r2c' + scalar `r2_a'=1-(1-`r2')*(`Nprec'-1)/(`Nprec'-`rhs_ct'-`dofminus') + } + else { + scalar `r2'=`r2u' + scalar `r2_a'=1-(1-`r2')*`Nprec'/(`Nprec'-`rhs_ct'-`dofminus') + } + +* Fstat +* To get it to match Stata's, must post separately with dofs and then do F stat by hand +* in case weights generate non-integer obs and dofs +* Create copies so they can be posted + tempname FB FV + mat `FB'=`B' + mat `FV'=`V' + capture ereturn post `FB' `FV' +* If the cov matrix wasn't positive definite, the post fails with error code 506 + local rc = _rc + if `rc' != 506 { + local Frhs1 `rhs1' + capture test `Frhs1' + if "`small'" == "" { + if "`cluster'"=="" { + capture scalar `F' = r(chi2)/`df_m' * `df_r'/(`Nprec'-`dofminus') + } + else { + capture scalar `F' = r(chi2)/`df_m' * /* +* fwl_ct used here so that F-stat matches test stat from regression with no FWL and small + */ (`N_clust'-1)/`N_clust' * (`Nprec'-`rhs_ct'-`fwl_ct')/(`Nprec'-1) + } + } + else { + capture scalar `F' = r(chi2)/`df_m' + } + capture scalar `Fp'=Ftail(`df_m',`df_r',`F') + capture scalar `Fdf2'=`df_r' + } + +* If j==. or vcv wasn't full rank, then vcv problems and F is meaningless + if `j' == . | `rc'==506 { + scalar `F' = . + scalar `Fp' = . + } + +* End of counts, dofs, F-stat, small sample corrections +******************************************************************************************* +* orthog option: C statistic (difference of Sargan statistics) +******************************************************************************************* +* Requires j dof from above + if "`orthog'"!="" { + tempname cj cstat cstatp +* Initialize cstat + scalar `cstat' = 0 +* Each variable listed must be in instrument list. +* To avoid overwriting, use cendo, cinexog1, cexexog, cendo_ct, cex_ct + local cendo1 "`endo1'" + local cinexog1 "`inexog1'" + local cexexog1 "`exexog1'" + local cinsts1 "`insts1'" + local crhs1 "`rhs1'" + local clist1 "`orthog'" + local clist_ct : word count `clist1' + +* Check to see if c-stat vars are in original list of all ivs +* cinexog1 and cexexog1 are after c-stat exog list vars have been removed +* cendo1 is endo1 after included exog being tested has been added + foreach x of local clist1 { + local llex_ct : word count `cexexog1' + Subtract cexexog1 : "`cexexog1'" "`x'" + local cex1_ct : word count `cexexog1' + local ok = `llex_ct' - `cex1_ct' + if (`ok'==0) { +* Not in excluded, check included and add to endog list if it appears + local llin_ct : word count `cinexog1' + Subtract cinexog1 : "`cinexog1'" "`x'" + local cin1_ct : word count `cinexog1' + local ok = `llin_ct' - `cin1_ct' + if (`ok'==0) { +* Not in either list +di in r "Error: `x' listed in orthog() but does not appear as exogenous." + error 198 + } + else { + local cendo1 "`cendo1' `x'" + } + } + } + +* If robust, HAC/AC or GMM (but not LIML or IV), create optimal weighting matrix to pass to ivreg2 +* by extracting the submatrix from the full S and then inverting. +* This guarantees the C stat will be non-negative. See Hayashi (2000), p. 220. +* Calculate C statistic with recursive call to ivreg2 +* Collinearities may cause problems, hence -capture-. +* smatrix works generally, including homoskedastic case with Sargan stat + capture { + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + if "`kernel'" != "" { + local bwopt "bw(`bw')" + local kernopt "kernel(`kernel')" + } +* clopt is omitted because it requires calculation of numbers of clusters, which is done +* only when S matrix is calculated + capture `ivreg2_cmd' `lhs' `cinexog1' /* + */ (`cendo1'=`cexexog1') /* + */ if `touse' `wtexp', `noconstant' /* + */ `options' `small' `robust' /* + */ `gmm' `bwopt' `kernopt' `dofmopt' `sw' `swpsd' /* + */ smatrix("`S'") noid + local rc = _rc + if `rc' == 481 { + scalar `cstat' = 0 + local cstatdf = 0 + } + else { + scalar `cj'=e(j) + local cjdf=e(jdf) + } + scalar `cstat' = `j' - `cj' + local cstatdf = `jdf' - `cjdf' + _estimates unhold `ivest' + scalar `cstatp'= chiprob(`cstatdf',`cstat') +* Collinearities may cause C-stat dof to differ from the number of variables in orthog() +* If so, set cstat=0 + if `cstatdf' != `clist_ct' { + scalar `cstat' = 0 + } + } + } +* End of orthog block + +******************************************************************************************* +* Endog option +******************************************************************************************* +* Uses recursive call with orthog + if "`endogtest'"!="" { + tempname estat estatp +* Initialize estat + scalar `estat' = 0 +* Each variable to test must be in endo list. +* To avoid overwriting, use eendo, einexog1, etc. + local eendo1 "`endo1'" + local einexog1 "`inexog1'" + local einsts1 "`insts1'" + local elist1 "`endogtest'" + local elist_ct : word count `elist1' +* Check to see if endog test vars are in original endo1 list of endogeneous variables +* eendo1 and einexog1 are after endog test vars have been removed from endo and added to inexog + foreach x of local elist1 { + local llendo_ct : word count `eendo1' + local eendo1 : list eendo1 - x + local eendo1_ct : word count `eendo1' + local ok = `llendo_ct' - `eendo1_ct' + if (`ok'==0) { +* Not in endogenous list +di in r "Error: `x' listed in endog() but does not appear as endogenous." + error 198 + } + else { + local einexog1 "`einexog1' `x'" + } + } +* Recursive call to ivreg2 using orthog option to obtain endogeneity test statistic +* Collinearities may cause problems, hence -capture-. + capture { + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + capture `ivreg2_cmd' `lhs' `einexog1' /* + */ (`eendo1'=`exexog1') if `touse' /* + */ `wtexp', `noconstant' `robust' `clopt' /* + */ `gmm' `liml' `bwopt' `kernopt' /* + */ `small' `dofmopt' `sw' `swpsd' `options' /* + */ orthog(`elist1') noid + local rc = _rc + if `rc' == 481 { + scalar `estat' = 0 + local estatdf = 0 + } + else { + scalar `estat'=e(cstat) + local estatdf=e(cstatdf) + scalar `estatp'=e(cstatp) + } + _estimates unhold `ivest' +* Collinearities may cause endog stat dof to differ from the number of variables in endog() +* If so, set estat=0 + if `estatdf' != `elist_ct' { + scalar `estat' = 0 + } + } +* End of endogeneity test block + } + +******************************************************************************************* +* Rank identification and redundancy block +******************************************************************************************* + if `endo1_ct' > 0 & "`noid'"=="" { + tempname ccmat ccrealev ccimagev cc idstat iddf idp + tempname cdchi2 cdchi2p ccf cdf cdeval cd + mat `ccmat' = `XXinv'*`XPZX' +* Need only upper LHS block, which corresponds to included endogenous + mat `ccmat' = `ccmat'[1..`endo1_ct',1..`endo1_ct'] + mat eigenvalues `ccrealev' `ccimagev' = `ccmat' +* Real eigenvalues are the squared canonical correlations +* The first reported cc is NOT necessarily the smallest (with mat symeigen the smallest is last). +* Sort so smallest is first. + vecsort `ccrealev' + scalar `cc'=`ccrealev'[1,1] +* dof adjustment needed because it doesn't use the adjusted S + scalar `idstat' = -(`Nprec'-`dofminus')*ln(1-`cc') + local iddf = `iv_ct' - (`rhs_ct'-1) + scalar `idp' = chiprob(`iddf',`idstat') +* Cragg-Donald, Anderson etc. + scalar `cd'=`cc'/(1-`cc') +* dofminus used because it doesn't use adjusted S + local ddf = `Nprec'-`iv_ct'-`dofminus' + local ndf = `exex1_ct' + scalar `cdchi2'=`cd'*(`Nprec'-`dofminus') + scalar `cdchi2p' = chiprob(`iddf',`cdchi2') + scalar `cdf' =`cd'*`ddf'/`ndf' + scalar `ccf' =`cc'*`ddf'/`ndf' +* Save evs in CD style + local evcols = colsof(`ccrealev') + mat `cdeval' = J(1,`evcols',.) + forval i=1/`evcols' { + mat `cdeval'[1,`i'] = `ccrealev'[1,`i'] / (1 - `ccrealev'[1,`i']) + } + } + +* LR redundancy test + if `endo1_ct' > 0 & "`redundant'" ~= "" & "`noid'"=="" { +* Obtain Anderson zero rank (totally unidentified) statistic for full set of instruments + tempname unidstat + scalar `unidstat'=0 + forvalues thiscol=1(1)`endo1_ct' { +* dof adjustment needed because it doesn't use the adjusted S + scalar `unidstat'=`unidstat'-(`Nprec'-`dofminus')*ln(1-`ccrealev'[1,`thiscol']) + } +* Diff between this and the stat using the irrelevant excl IVs is chi2 with dof=#endog*#tested + local redlist1 "`redundant'" +* XZcols are the Z columns, so can use for ZZ too + local rXZcols : colnames `XZ' + foreach x of local redlist1 { + local riv_ct_a : word count `rXZcols' + Subtract rXZcols : "`rXZcols'" "`x'" + local riv_ct_b : word count `rXZcols' + if `riv_ct_a' == `riv_ct_b' { +* Not in list +di in r "Error: `x' listed in redundant() but does not appear as excluded instrument." + error 198 + } + } + tempname rXZ rZZ rZZtemp rZZinv rXPZX rccmat rccrealev rccimagev runidmat runidstat + foreach cn of local rXZcols { + mat `rXZ' = nullmat(`rXZ') , `XZ'[1...,"`cn'"] + mat `rZZtemp' = nullmat(`rZZtemp') , `ZZ'[1...,"`cn'"] + } + foreach cn of local rXZcols { + mat `rZZ' = nullmat(`rZZ') \ `rZZtemp'["`cn'",1...] + } + mat `rZZ'=(`rZZ'+`rZZ'')/2 + mat `rZZinv' = syminv(`rZZ') + mat `rXPZX' = `rXZ'*`rZZinv'*`rXZ'' + mat `rccmat' = `XXinv'*`rXPZX' + mat `rccmat' = `rccmat'[1..`endo1_ct',1..`endo1_ct'] + mat eigenvalues `rccrealev' `rccimagev' = `rccmat' + scalar `runidstat'=0 + forvalues thiscol=1(1)`endo1_ct' { +* dof adjustment needed because it doesn't use the adjusted S + scalar `runidstat'=`runidstat'-(`Nprec'-`dofminus')*ln(1-`rccrealev'[1,`thiscol']) + } + tempname redstat redp + local riv_ct = rowsof(`rZZ') - diag0cnt(`rZZinv') + if `riv_ct' < `rhs_ct' { +* Not in list +di in r "Error: specification with redundant() option is unidentified (fails rank condition)" + error 198 + } + local redlist_ct=`iv_ct'-`riv_ct' + scalar `redstat' = `unidstat' - `runidstat' + local reddf = `endo1_ct'*`redlist_ct' + scalar `redp' = chiprob(`reddf',`redstat') + } + +* End of identification stats block + +******************************************************************************************* +* Error-checking block +******************************************************************************************* + +* Check if adequate number of observations + if `N' <= `iv_ct' { +di in r "Error: number of observations must be greater than number of instruments" +di in r " including constant." + error 2001 + } + +* Check if robust VCV matrix is of full rank + if "`gmm'`robust'`cluster'`kernel'" != "" { +* Robust covariance matrix not of full rank means either a singleton dummy or too few +* clusters (in which case the indiv SEs are OK but no F stat or 2-step GMM is possible), +* or there are too many AC/HAC-lags, or the HAC covariance estimator +* isn't positive definite (possible with truncated and Tukey-Hanning kernels) + if `rankS' < `iv_ct' { +* If two-step GMM then exit with error ... + if "`gmm'" != "" { +di in r "Error: estimated covariance matrix of moment conditions not of full rank;" +di in r " cannot calculate optimal weighting matrix for GMM estimation." +di in r "Possible causes:" + if "`cluster'" != "" { +di in r " number of clusters insufficient to calculate optimal weighting matrix" + } + if "`kernel'" != "" { +di in r " covariance matrix of moment conditions not positive definite" +di in r " covariance matrix uses too many lags" + } +di in r " singleton dummy variable (dummy with one 1 and N-1 0s or vice versa)" +di in r "-fwl- option may address problem. See help " _c +di in smcl "{help ivreg2}". + error 498 + } +* Estimation isn't two-step GMM so continue but J, F, and C stat (if present) all meaningless +* Must set Sargan-Hansen j = missing so that problem can be reported in output + else { + scalar `j' = . + if "`orthog'"!="" { + scalar `cstat' = . + } + if "`endogtest'"!="" { + scalar `estat' = . + } + } + } + } + +* End of error-checking block +******************************************************************************************** +* Reduced form and first stage regression options +******************************************************************************************* +* Relies on proper count of (non-collinear) IVs generated earlier. +* Note that nocons option + constant in instrument list means first-stage +* regressions are reported with nocons option. First-stage F-stat therefore +* correctly includes the constant as an explanatory variable. + + if "`rf'`saverf'`first'`ffirst'`savefirst'" != "" & (`endo1_ct' > 0) & "`noid'"=="" { +* Reduced form needed for AR first-stage test stat. Also estimated if requested. + tempname archi2 archi2p arf arfp ardf ardf_r sstat sstatp sstatdf + doRF "`lhs'" "`inexog1'" "`exexog1'" /* + */ `touse' `"`wtexp'"' `"`noconstant'"' `"`robust'"' /* + */ `"`clopt'"' `"`bwopt'"' `"`kernopt'"' /* + */ `"`saverfprefix'"' /* + */ "`dofminus'" `"`sw'"' `"`swpsd'"' "`ivreg2_cmd'" + scalar `archi2'=r(archi2) + scalar `archi2p'=r(archi2p) + scalar `arf'=r(arf) + scalar `arfp'=r(arfp) + scalar `ardf'=r(ardf) + scalar `ardf_r'=r(ardf_r) + local rfeq "`r(rfeq)'" +* Drop saved rf results if needed only for first-stage estimations + if "`rf'`saverf'" == "" { + capture estimates drop `rfeq' + } +* Stock-Wright S statistic. Equiv to J LM test of exexog. +* First block handles all cases except no exog regressors; second block uses GMM obj function, +* which works without fwl because b0 is only endog regressors. + + if `inexog1_ct' + `cons_ct' > 0 { + qui `ivreg2_cmd' `lhs' `inexog' (=`exexog') `wtexp' if `touse', /* + */ `noconstant' dofminus(`dofminus') /* + */ `robust' `clopt' `bwopt' `kernopt' `sw' `swpsd' + } + else { + tempname b1 + mat `b1'=J(1,`endo1_ct',0) + matrix colnames `b1' = `endo1' + qui `ivreg2_cmd' `lhs' (`endo1'=`exexog') `wtexp' if `touse', /* + */ b0(`b1') noconstant dofminus(`dofminus') /* + */ `robust' `clopt' `bwopt' `kernopt' `sw' `swpsd' + } + scalar `sstat'=e(j) + scalar `sstatdf'=`ardf' + scalar `sstatp'=chiprob(`sstatdf',`sstat') + } + + if "`first'`ffirst'`savefirst'" != "" & (`endo1_ct' > 0) { + +* Godfrey method of Shea partial R2 uses IV and OLS estimates without robust vcvs: +* Partial R2 = OLS V[d,d] / IV V[d,d] * IV s2 / OLS s2 +* where d,d is the diagonal element corresponding to the endog regressor +* ... but this simplifies to matrices that have already been calculated: +* = XXinv[d,d] / XPZXinv[d,d] + tempname godfrey sols siv + tempname firstmat sheapr2 pr2 pr2F pr2p + mat `godfrey' = J(1,`endo1_ct',0) + mat colnames `godfrey' = `endo1' + mat rownames `godfrey' = "sheapr2" + local i 1 + foreach var of local endo1 { + mat `sols'=`XXinv'["`var'","`var'"] + mat `siv'=`XPZXinv'["`var'","`var'"] + mat `godfrey'[1,`i'] = `sols'[1,1]/`siv'[1,1] + local i = `i'+1 + } + + if `iv1_ct' > `iv_ct' { +di +di in gr "Warning: collinearities detected among instruments" +di in gr "1st stage tests of excluded exogenous variables may be incorrect" + } + + doFirst "`endo1'" "`inexog1'" "`exexog1'" /* + */ `touse' `"`wtexp'"' `"`noconstant'"' `"`robust'"' /* + */ `"`clopt'"' `"`bwopt'"' `"`kernopt'"' /* + */ `"`savefprefix'"' /* + */ `"`dofmopt'"' `"`sw'"' `"`swpsd'"' "`ivreg2_cmd'" + + local firsteqs "`r(firsteqs)'" + capture mat `firstmat'=`godfrey' \ r(firstmat) + if _rc != 0 { +di in ye "Warning: missing values encountered; first stage regression results not saved" + } + } +* End of first-stage regression code +********************************************************************************************** +* Post and display results. +******************************************************************************************* + +* restore data if preserved for fwl option + if "`fwl'" != "" { + restore + } + +* NB: Would like to use -Nprec- in obs() in case weights generate non-integer obs +* but Stata complains. Using -Nprec- with dof() makes no difference - seems to round it + if "`small'"!="" { + local NminusK = `N'-`rhs_ct' + capture ereturn post `B' `V', dep(`depname') obs(`N') esample(`touse') /* + */ dof(`NminusK') + } + else { + capture ereturn post `B' `V', dep(`depname') obs(`N') esample(`touse') + } + local rc = _rc + if `rc' == 504 { +di in red "Error: estimated variance-covariance matrix has missing values" + exit 504 + } + if `rc' == 506 { +di in red "Error: estimated variance-covariance matrix not positive-definite" + exit 506 + } + if `rc' > 0 { +di in red "Error: estimation failed - could not post estimation results" + exit `rc' + } + +* changed next from `endo1' to `endo' 2Aug06 MES + ereturn local instd `endo' + local insts : colnames `S' + local insts : subinstr local insts "_cons" "" + ereturn local insts `insts' + ereturn local inexog `inexog' + ereturn local exexog `exexog' + ereturn local fwl `fwl' + ereturn scalar inexog_ct=`inexog1_ct' + ereturn scalar exexog_ct=`exex1_ct' + ereturn scalar endog_ct =`endo1_ct' + if "`collin'`ecollin'`dups'`fwlcons'" != "" { + ereturn local collin `collin' + ereturn local ecollin `ecollin' + ereturn local dups `dups' + ereturn local instd1 `endo1' + ereturn local inexog1 `inexog1' + ereturn local exexog1 `exexog1' + ereturn local fwl1 `fwl1' + } + + if "`smatrix'" == "" { + ereturn matrix S `S' + } + else { +* Create a copy so posting doesn't zap the original + tempname Scopy + mat `Scopy'=`smatrix' + ereturn matrix S `Scopy' + } + +* No weighting matrix defined for LIML and kclass + if "`wmatrix'"=="" & "`liml'`kclass'"=="" { + ereturn matrix W `W' + } + else if "`liml'`kclass'"=="" { +* Create a copy so posting doesn't zap the original + tempname Wcopy + mat `Wcopy'=`wmatrix' + ereturn matrix W `Wcopy' + } + + if "`kernel'"!="" { + ereturn local kernel "`kernel'" + ereturn scalar bw=`bw' + ereturn local tvar "`tvar'" + if "`ivar'" ~= "" { + ereturn local ivar "`ivar'" + } + } + + if "`small'"!="" { + ereturn scalar df_r=`df_r' + ereturn local small "small" + } + + if "`cluster'"!="" { + ereturn scalar N_clust=`N_clust' + ereturn local clustvar `cluster' + } + + if "`robust'`cluster'" != "" { + ereturn local vcetype "Robust" + } + + ereturn scalar df_m=`df_m' + ereturn scalar r2=`r2' + ereturn scalar rmse=`rmse' + ereturn scalar rss=`rss' + ereturn scalar mss=`mss' + ereturn scalar r2_a=`r2_a' + ereturn scalar F=`F' + ereturn scalar Fp=`Fp' + ereturn scalar Fdf2=`Fdf2' + ereturn scalar yy=`yy' + ereturn scalar yyc=`yyc' + ereturn scalar r2u=`r2u' + ereturn scalar r2c=`r2c' + ereturn scalar rankzz=`iv_ct' + ereturn scalar rankxx=`rhs_ct' + if "`gmm'`robust'`cluster'`kernel'" != "" { + ereturn scalar rankS=`rankS' + } + ereturn scalar rankV=`rankV' + ereturn scalar ll = -0.5 * (`Nprec'*ln(2*_pi) + `Nprec'*ln(`rss'/`Nprec') + `Nprec') + +* Always save J. Also save as Sargan if homoskedastic; save A-R if LIML. + ereturn scalar j=`j' + ereturn scalar jdf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar jp=`jp' + } + if ("`robust'`cluster'"=="") { + ereturn scalar sargan=`j' + ereturn scalar sargandf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar sarganp=`jp' + } + } + if "`liml'"!="" { + ereturn scalar arubin=`arubin' + ereturn scalar arubindf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar arubinp=`arubinp' + } + } + + if "`orthog'"!="" { + ereturn scalar cstat=`cstat' + if `cstat'!=0 & `cstat' != . { + ereturn scalar cstatp=`cstatp' + ereturn scalar cstatdf=`cstatdf' + ereturn local clist `clist1' + } + } + + if "`endogtest'"!="" { + ereturn scalar estat=`estat' + if `estat'!=0 & `estat' != . { + ereturn scalar estatp=`estatp' + ereturn scalar estatdf=`estatdf' + ereturn local elist `elist1' + } + } + + if `endo1_ct' > 0 & "`noid'"=="" { + ereturn scalar idstat=`idstat' + ereturn scalar iddf=`iddf' + ereturn scalar idp=`idp' + ereturn scalar cd=`cd' + ereturn scalar cdf=`cdf' + ereturn matrix ccev=`ccrealev' + capture ereturn matrix cdev `cdeval' + } + + if "`redundant'"!="" & "`noid'"=="" { + ereturn scalar redstat=`redstat' + ereturn scalar redp=`redp' + ereturn scalar reddf=`reddf' + ereturn local redlist `redlist1' + } + + if "`first'`ffirst'`savefirst'" != "" & `endo1_ct'>0 & "`noid'"=="" { +* Capture here because firstmat empty if mvs encountered in 1st stage regressions + capture ereturn matrix first `firstmat' + ereturn scalar cdchi2=`cdchi2' + ereturn scalar cdchi2p=`cdchi2p' + ereturn scalar arf=`arf' + ereturn scalar arfp=`arfp' + ereturn scalar archi2=`archi2' + ereturn scalar archi2p=`archi2p' + ereturn scalar ardf=`ardf' + ereturn scalar ardf_r=`ardf_r' + ereturn scalar sstat=`sstat' + ereturn scalar sstatp=`sstatp' + ereturn scalar sstatdf=`sstatdf' + ereturn local firsteqs `firsteqs' + } + if "`rf'`saverf'" != "" & `endo1_ct'>0 { + ereturn local rfeq `rfeq' + } + + ereturn local depvar `lhs' + + if "`liml'"!="" { + ereturn local model "liml" + ereturn scalar kclass=`kclass2' + ereturn scalar lambda=`lambda' + if `fuller' > 0 & `fuller' < . { + ereturn scalar fuller=`fuller' + } + } + else if "`kclass'" != "" { + ereturn local model "kclass" + ereturn scalar kclass=`kclass2' + } + else if "`gmm'`cue'`wmatrix'"=="" { + if "`endo1'" == "" { + ereturn local model "ols" + } + else { + ereturn local model "iv" + } + } + else if "`cue'"~="" { + ereturn local model "cue" + } + else if "`wmatrix'"~="" { + ereturn local model "gmm" + } + else if "`gmm'"~="" { + ereturn local model "gmm2s" + } + else { +* Should never enter here + ereturn local model "unknown" + } + + if "`weight'" != "" { + ereturn local wexp "=`exp'" + ereturn local wtype `weight' + } + ereturn local cmd `ivreg2_cmd' + ereturn local version `lversion' + if "`noconstant'"!="" { + ereturn scalar cons=0 + } + else { + ereturn scalar cons=1 + } + if `fwl_ct'>0 { + ereturn scalar fwlcons=`fwlcons' + } + ereturn local predict "`ivreg2_cmd'_p" + + if "`e(model)'"=="gmm2s" { + local title2 "2-Step GMM estimation" + } + if "`e(model)'"=="gmm" { + local title2 "GMM estimation with user-supplied weighting matrix" + } + if "`e(model)'"=="cue" { + local title2 "CUE estimation" + } + if "`e(model)'"=="ols" { + local title2 "OLS estimation" + } + if "`e(model)'"=="iv" { + local title2 "IV (2SLS) estimation" + } + if "`e(model)'"=="liml" { + local title2 "LIML estimation" + } + if "`e(model)'"=="kclass" { + local title2 "k-class estimation" + } + if "`e(vcetype)'" == "Robust" { + local hacsubtitle1 "heteroskedasticity" + } + if "`e(kernel)'"!="" { + local hacsubtitle3 "autocorrelation" + } + if "`e(clustvar)'"!="" { + local hacsubtitle3 "clustering on `e(clustvar)'" + } + if "`hacsubtitle1'"~="" & "`hacsubtitle3'" ~= "" { + local hacsubtitle2 " and " + } + if "`title'"=="" { + ereturn local title "`title1'`title2'" + } + else { + ereturn local title "`title'" + } + if "`subtitle'"~="" { + ereturn local subtitle "`subtitle'" + } + local hacsubtitle "`hacsubtitle1'`hacsubtitle2'`hacsubtitle3'" + if "`hacsubtitle'"~="" { + ereturn local hacsubtitle "Statistics robust to `hacsubtitle'" + } + if "`sw'"~="" & "`swpsd'"=="" { + ereturn local hacsubtitle "Stock-Watson heteroskedastic-robust statistics (BETA VERSION)" + } + if "`swpsd'"~="" { + ereturn local hacsubtitle "Stock-Watson psd heteroskedastic-robust statistics (BETA VERSION)" + } + } + +******************************************************************************************* +* Display results unless ivreg2 called just to generate stats or nooutput option + + if "`nooutput'" == "" { + if "`savefirst'`saverf'" != "" { + DispStored `"`saverf'"' `"`savefirst'"' `"`ivreg2_cmd'"' + } + if "`rf'" != "" { + DispRF + } + if "`first'" != "" { + DispFirst `"`ivreg2_cmd'"' + } + if "`first'`ffirst'" != "" { + DispFFirst `"`ivreg2_cmd'"' + } + if "`eform'"!="" { + local efopt "eform(`eform')" + } + DispMain `"`noheader'"' `"`plus'"' `"`efopt'"' `"`level'"' `"`nofooter'"' `"`ivreg2_cmd'"' + } + +* Drop first stage estimations unless explicitly saved or if replay + if "`savefirst'" == "" { + local firsteqs "`e(firsteqs)'" + foreach eqname of local firsteqs { + capture estimates drop `eqname' + } + ereturn local firsteqs + } + +* Drop reduced form estimation unless explicitly saved or if replay + if "`saverf'" == "" { + local eqname "`e(rfeq)'" + capture estimates drop `eqname' + ereturn local rfeq + } + +end + +******************************************************************************************* +* SUBROUTINES +******************************************************************************************* + +program define DispMain, eclass + args noheader plus efopt level nofooter helpfile + version 8.2 +* Prepare for problem resulting from rank(S) being insufficient +* Results from insuff number of clusters, too many lags in HAC, +* to calculate robust S matrix, HAC matrix not PD, singleton dummy, +* and indicated by missing value for j stat +* Macro `rprob' is either 1 (problem) or 0 (no problem) + capture local rprob ("`e(j)'"==".") + + if "`noheader'"=="" { + if "`e(title)'" ~= "" { +di in gr _n "`e(title)'" + local tlen=length("`e(title)'") +di in gr "{hline `tlen'}" + } + if "`e(subtitle)'" ~= "" { +di in gr "`e(subtitle)'" + } + if "`e(model)'"=="liml" | "`e(model)'"=="kclass" { +di in gr "k =" %7.5f `e(kclass)' + } + if "`e(model)'"=="liml" { +di in gr "lambda =" %7.5f `e(lambda)' + } + if e(fuller) > 0 & e(fuller) < . { +di in gr "Fuller parameter=" %-5.0f `e(fuller)' + } + if "`e(hacsubtitle)'" ~= "" { +di in gr _n "`e(hacsubtitle)'" + } + if "`e(kernel)'"!="" { +di in gr " kernel=`e(kernel)'; bandwidth=`e(bw)'" +di in gr " time variable (t): " in ye e(tvar) + if "`e(ivar)'" != "" { +di in gr " group variable (i): " in ye e(ivar) + } + } + di + if "`e(clustvar)'"!="" { +di in gr "Number of clusters (" "`e(clustvar)'" ") = " in ye %-4.0f e(N_clust) _continue + } + else { +di in gr " " _continue + } +di in gr _col(55) "Number of obs = " in ye %8.0f e(N) + + if "`e(clustvar)'"=="" { + local Fdf2=e(N)-e(rankxx) + } + else { + local Fdf2=e(N_clust)-1 + } + +di in gr _c _col(55) "F(" %3.0f e(df_m) "," %6.0f e(Fdf2) ") = " + if e(F) < 99999 { +di in ye %8.2f e(F) + } + else { +di in ye %8.2e e(F) + } +di in gr _col(55) "Prob > F = " in ye %8.4f e(Fp) + +di in gr "Total (centered) SS = " in ye %12.0g e(yyc) _continue +di in gr _col(55) "Centered R2 = " in ye %8.4f e(r2c) +di in gr "Total (uncentered) SS = " in ye %12.0g e(yy) _continue +di in gr _col(55) "Uncentered R2 = " in ye %8.4f e(r2u) +di in gr "Residual SS = " in ye %12.0g e(rss) _continue +di in gr _col(55) "Root MSE = " in ye %8.4g e(rmse) +di + } + +* Display coefficients etc. +* Unfortunate but necessary hack here: to suppress message about cluster adjustment of +* standard error, clear e(clustvar) and then reset it after display + local cluster `e(clustvar)' + ereturn local clustvar + ereturn display, `plus' `efopt' level(`level') + ereturn local clustvar `cluster' + +* Display 1st footer with identification stats +* Footer not displayed if -nofooter- option or if pure OLS, i.e., model="ols" and Sargan-Hansen=0 + if ~("`nofooter'"~="" | (e(model)=="ols" & (e(sargan)==0 | e(j)==0))) { + +* Report Anderson rank ID test + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##cancortest:Anderson canon. corr. LR statistic}" +di in gr _c " (underidentification test):" +di in ye _col(71) %8.3f e(idstat) +di in gr _col(52) "Chi-sq(" in ye e(iddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(idp) +* LR IV redundancy statistic + if "`e(redlist)'"!="" { +di in gr "-redundant- option:" +di in smcl _c "{help `helpfile'##redtest:LR IV redundancy test}" +di in gr _c " (redundancy of specified instruments):" +di in ye _col(71) %8.3f e(redstat) +di in gr _col(52) "Chi-sq(" in ye e(reddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(redp) +di in gr "Instruments tested: " _c + Disp `e(redlist)', _col(23) + } + if "`e(vcetype)'"=="Robust" | "`e(kernel)'"~="" { +di in gr "Test statistic(s) not robust" + } +di in smcl in gr "{hline 78}" + } +* Report Cragg-Donald statistic + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##cdtest:Cragg-Donald F statistic}" +di in gr _c " (weak identification test):" +di in ye _col(71) %8.3f e(cdf) +di in gr _c "Stock-Yogo weak ID test critical values:" + local cdmissing=1 + if "`e(model)'"=="iv" | "`e(model)'"=="gmm2s" | "`e(model)'"=="gmm" { + cdsy, type(ivbias5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "15% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "25% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)==.) | "`e(model)'"=="cue" { + cdsy, type(limlsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "15% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "25% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)<.) { + cdsy, type(fullrel5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + if `cdmissing' { + di in gr _col(64) "" + } + else { + if "`e(vcetype)'"=="Robust" | "`e(kernel)'"~="" { +di in gr "Test statistic(s) not robust" + } + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + } + di in smcl in gr "{hline 78}" + } + +* Report either (a) Sargan-Hansen-C stats, or (b) robust covariance matrix problem + if `rprob' == 0 { +* Display overid statistic + if "`e(vcetype)'" == "Robust" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } + else { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } +di in ye _col(71) %8.3f e(j) + if e(rankxx) < e(rankzz) { +di in gr _col(52) "Chi-sq(" in ye e(jdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(jp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + +* Display orthog option: C statistic (difference of Sargan statistics) + if e(cstat) != . { +* If C-stat = 0 then warn, otherwise output + if e(cstat) > 0 { +di in gr "-orthog- option:" + if "`e(vcetype)'" == "Robust" { +di in gr _c "Hansen J statistic (eqn. excluding suspect orthog. conditions): " + } + else { +di in gr _c "Sargan statistic (eqn. excluding suspect orthogonality conditions):" + } +di in ye _col(71) %8.3f e(j)-e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(jdf)-e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f chiprob(e(jdf)-e(cstatdf),e(j)-e(cstat)) +di in smcl _c "{help `helpfile'##ctest:C statistic}" +di in gr _c " (exogeneity/orthogonality of suspect instruments): " +di in ye _col(71) %8.3f e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f e(cstatp) +di in gr "Instruments tested: " _c + Disp `e(clist)', _col(23) + } + if e(cstat) == 0 { +di in gr _n "Collinearity/identification problems in eqn. excl. suspect orthog. conditions:" +di in gr " C statistic not calculated for -orthog- option" + } + } + } + else { +* Problem exists with robust VCV - notify and list possible causes +di in r "Error: estimated covariance matrix of moment conditions not of full rank;" +di in r " overidentification statistic not reported, and standard errors and" +di in r " model tests should be interpreted with caution." +di in r "Possible causes:" + if e(N_clust) < e(rankzz) { +di in r " number of clusters insufficient to calculate robust covariance matrix" + } + if "`e(kernel)'" != "" { +di in r " covariance matrix of moment conditions not positive definite" +di in r " covariance matrix uses too many lags" + } +di in r " singleton dummy variable (dummy with one 1 and N-1 0s or vice versa)" +di in smcl _c "{help `helpfile'##fwl:fwl}" +di in r " option may address problem." + } + +* Display endog option: endogeneity test statistic + if e(estat) != . { +* If stat = 0 then warn, otherwise output + if e(estat) > 0 { +di in gr "-endog- option:" +di in smcl _c "{help `helpfile'##endogtest:Endogeneity test}" +di in gr _c " of endogenous regressors: " +di in ye _col(71) %8.3f e(estat) +di in gr _col(52) "Chi-sq(" in ye e(estatdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(estatp) +di in gr "Regressors tested: " _c + Disp `e(elist)', _col(23) + } + if e(estat) == 0 { +di in gr _n "Collinearity/identification problems in restricted equation:" +di in gr " Endogeneity test statistic not calculated for -endog- option" + } + } + + di in smcl in gr "{hline 78}" +* Display AR overid statistic if LIML and not robust + if "`e(model)'" == "liml" & "`e(vcetype)'" ~= "Robust" & "`e(kernel)'" == "" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (LR test of excluded instruments):" + } +di in ye _col(72) %7.3f e(arubin) + if e(rankxx) < e(rankzz) { +di in gr _col(52) "Chi-sq(" in ye e(arubindf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(arubinp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + di in smcl in gr "{hline 78}" + } + } + +* Display 2nd footer with variable lists + if "`nofooter'"=="" { + +* Warn about dropped instruments if any +* (Re-)calculate number of user-supplied instruments + local iv1_ct : word count `e(insts)' + local iv1_ct = `iv1_ct' + `e(cons)' + + if `iv1_ct' > e(rankzz) { +di in gr "Collinearities detected among instruments: " _c +di in gr `iv1_ct'-e(rankzz) " instrument(s) dropped" + } + + if "`e(collin)'`e(dups)'`e(fwlcons)'" != "" { +* If collinearities, duplicates or fwl, abbreviated varlists saved with a 1 at the end + local one "1" + } + if "`e(instd)'" != "" { + di in gr "Instrumented:" _c + Disp `e(instd`one')', _col(23) + } + if "`e(inexog)'" != "" { + di in gr "Included instruments:" _c + Disp `e(inexog`one')', _col(23) + } + if "`e(exexog)'" != "" { + di in gr "Excluded instruments:" _c + Disp `e(exexog`one')', _col(23) + } + if "`e(fwlcons)'" != "" { + if e(fwlcons) { + local fwl "`e(fwl`one')' _cons" + } + else { + local fwl "`e(fwl`one')'" + } +di in smcl _c "{help `helpfile'##fwl:Partialled-out (FWL)}" + di in gr ":" _c + Disp `fwl', _col(23) +di in gr _col(23) "nb: variable counts and small-sample adjustments" +di in gr _col(23) "do not include partialled-out variables." + } + if "`e(dups)'" != "" { + di in gr "Duplicates:" _c + Disp `e(dups)', _col(23) + } + if "`e(collin)'" != "" { + di in gr "Dropped collinear:" _c + Disp `e(collin)', _col(23) + } + if "`e(ecollin)'" != "" { + di in gr "Reclassified as exog:" _c + Disp `e(ecollin)', _col(23) + } + di in smcl in gr "{hline 78}" + } +end + +************************************************************************************** + +program define DispRF + version 8.2 + local eqname "`e(rfeq)'" + local depvar "`e(depvar)'" + local strlen : length local depvar + local strlen = `strlen'+25 +di +di in gr "Reduced-form regression: `e(depvar)'" +di in smcl in gr "{hline `strlen'}" + capture estimates replay `eqname' + if "`eqname'"=="" | _rc != 0 { +di in ye "Unable to display reduced-form regression of `e(depvar)'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + else { + estimates replay `eqname', noheader +di + } +end + +program define DispFirst + version 8.2 + args helpfile + tempname firstmat ivest sheapr2 pr2 F df df_r pvalue + + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display first-stage estimates; macro e(first) is missing" + exit + } +di in gr _newline "First-stage regressions" +di in smcl in gr "{hline 23}" +di + local endo1 : colnames(`firstmat') + local nrvars : word count `endo1' + local firsteqs "`e(firsteqs)'" + local nreqs : word count `firsteqs' + if `nreqs' < `nrvars' { +di in ye "Unable to display all first-stage regressions." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + foreach eqname of local firsteqs { + _estimates hold `ivest' + capture estimates restore `eqname' + if _rc != 0 { +di +di in ye "Unable to list stored estimation `eqname'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + else { + local vn "`e(depvar)'" +di in gr "First-stage regression of `vn':" + estimates replay `eqname', noheader + mat `sheapr2' =`firstmat'["sheapr2","`vn'"] + mat `pr2' =`firstmat'["pr2","`vn'"] + mat `F' =`firstmat'["F","`vn'"] + mat `df' =`firstmat'["df","`vn'"] + mat `df_r' =`firstmat'["df_r","`vn'"] + mat `pvalue' =`firstmat'["pvalue","`vn'"] +di in smcl _c "{help `helpfile'##partialr2:Partial R-squared}" +di in gr " of excluded instruments: " _c +di in ye %8.4f `pr2'[1,1] +di in gr "Test of excluded instruments:" +di in gr " F(" %3.0f `df'[1,1] "," %6.0f `df_r'[1,1] ") = " in ye %8.2f `F'[1,1] +di in gr " Prob > F = " in ye %8.4f `pvalue'[1,1] +di + } + _estimates unhold `ivest' + } +end + +program define DispStored + args saverf savefirst helpfile + version 8.2 + if "`saverf'" != "" { + local eqlist "`e(rfeq)'" + } + if "`savefirst'" != "" { + local eqlist "`eqlist' `e(firsteqs)'" + } + local eqlist : list retokenize eqlist +di in gr _newline "Stored estimation results" +di in smcl in gr "{hline 25}" _c + capture estimates dir `eqlist' + if "`eqlist'" != "" & _rc == 0 { +* Estimates exist and can be listed + estimates dir `eqlist' + } + else if "`eqlist'" != "" & _rc != 0 { +di +di in ye "Unable to list stored estimations." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } +end + +program define DispFFirst + version 8.2 + args helpfile + tempname firstmat sheapr2 pr2 pr2F pr2p + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display summary of first-stage estimates; macro e(first) is missing" + exit + } + local endo : colnames(`firstmat') + local nrvars : word count `endo' + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + local efirsteqs "`e(firsteqs)'" +di +di in gr _newline "Summary results for first-stage regressions" +di in smcl in gr "{hline 43}" +di + +di in gr _c "Variable |" +di in smcl _c _col(15) "{help `helpfile'##partialr2:Shea Partial R2}" +di in gr _c _col(31) "|" +di in smcl _c _col(35) "{help `helpfile'##partialr2:Partial R2}" +di in gr _c _col(49) "|" +di in smcl _c _col(52) "{help `helpfile'##partialr2:F}" +di in gr _c _col(53) "(" +di in ye _col(54) %3.0f `firstmat'[4,1] in gr "," in ye %6.0f `firstmat'[5,1] in gr ") P-value" + local i = 1 + while `i' <= `nrvars' { + local vn : word `i' of `endo' + local vnlen : length local vn + if `vnlen' > 12 { + local vn : piece 1 12 of "`vn'" + } + scalar `sheapr2'=`firstmat'[1,`i'] + scalar `pr2'=`firstmat'[2,`i'] + scalar `pr2F'=`firstmat'[3,`i'] + scalar `pr2p'=`firstmat'[6,`i'] +di in y %-12s "`vn'" _col(13) in gr "|" _col(17) in y %8.4f `sheapr2' _col(31) in gr "|" /* + */ _col(35) in y %8.4f `pr2' _col(49) in gr "|" /* + */ _col(53) in y %8.2f `pr2F' _col(67) %8.4f `pr2p' + local i = `i' + 1 + } +di + if "`robust'`cluster'" != "" { + if "`cluster'" != "" { + local rtype "cluster-robust" + } + else if "`kernel'" != "" { + local rtype "heteroskedasticity and autocorrelation-robust" + } + else { + local rtype "heteroskedasticity-robust" + } + } + else if "`kernel'" != "" { + local rtype "autocorrelation-robust" + } + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: first-stage F-stat `rtype'" +di + } + + tempname iddf idstat idp cdchi2 cdchi2p cdf + scalar `iddf'=e(iddf) + scalar `idstat'=e(idstat) + scalar `idp'=e(idp) + scalar `cdchi2'=e(cdchi2) + scalar `cdchi2p'=e(cdchi2p) + scalar `cdf'=e(cdf) +di in smcl "{help `helpfile'##s_first:Underidentification tests}" +di in gr "Ho: matrix of reduced form coefficients has rank=K-1 (underidentified)" +di in gr "Ha: matrix has rank=K (identified)" +di in gr _col(50) "Chi-sq(" in ye `iddf' in gr ")" _col(65) "P-value" +di in ye "Anderson canon. corr. -N*ln(1-CCEV) LR stat." _col(49) %8.2f `idstat' _col(65) %7.4f `idp' +di in ye "Cragg-Donald N*CDEV statistic" _col(49) %8.2f `cdchi2' _col(65) %7.4f `cdchi2p' + if "`robust'`cluster'`kernel'" != "" & e(endog_ct)==1 { + tempname rchi2 rchi2p +* Robust chi2 recreated from robust F and dofs of non-robust C-D chi2 and F + scalar `rchi2'=`pr2F'*`cdchi2'/`cdf' + scalar `rchi2p'=chiprob(`iddf',`rchi2') +di in ye "Robust chi-square statistic" _col(49) %8.2f `rchi2' _col(65) %7.4f `rchi2p' + } +di +di in smcl "{help `helpfile'##s_first:Weak identification tests}" +di in gr "Ho: equation is weakly identified" +di in ye "Cragg-Donald (N-L)*CDEV/L1 F-statistic" _col(49) %8.2f `cdf' + if "`robust'`cluster'`kernel'" != "" & e(endog_ct)==1 { +di in ye "Robust F-statistic" _col(49) %8.2f `pr2F' + } +di in gr "See main output for Cragg-Donald weak id test critical values" +di + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: Anderson and Cragg-Donald under- and weak identification stats not robust" + if "`robust'`cluster'`kernel'" != "" & e(endog_ct)==1 { +di in gr " Robust identification stats `rtype'" + } + } +di + tempname arf arfp archi2 archi2p ardf ardf_r + tempname sstat sstatp sstatdf +di in smcl "{help `helpfile'##wirobust:Weak-instrument-robust inference}" +di in gr "Tests of joint significance of endogenous regressors B1 in main equation" +di in gr "Ho: B1=0 and overidentifying restrictions are valid" +* Needs to be small so that adjusted dof is reflected in F stat + scalar `arf'=e(arf) + scalar `arfp'=e(arfp) + scalar `archi2'=e(archi2) + scalar `archi2p'=e(archi2p) + scalar `ardf'=e(ardf) + scalar `ardf_r'=e(ardf_r) + scalar `sstat'=e(sstat) + scalar `sstatp'=e(sstatp) + scalar `sstatdf'=e(sstatdf) +di in ye _c "Anderson-Rubin test" +di in gr _col(30) "F(" in ye `ardf' in gr "," in ye `ardf_r' in gr ")=" /* + */ _col(40) in ye %-7.2f `arf' _col(50) in gr "P-val=" in ye %6.4f `arfp' +di in ye _c "Anderson-Rubin test" +di in gr _col(30) "Chi-sq(" in ye `ardf' in gr ")=" /* + */ _col(40) in ye %-7.2f `archi2' _col(50) in gr "P-val=" in ye %6.4f `archi2p' +di in ye _c "Stock-Wright S statistic" +di in gr _col(30) "Chi-sq(" in ye `sstatdf' in gr ")=" /* + */ _col(40) in ye %-7.2f `sstat' _col(50) in gr "P-val=" in ye %6.4f `sstatp' + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: Test statistics `rtype'" + } +di + if "`cluster'" != "" { +di in gr "Number of clusters N_clust = " in ye %10.0f e(N_clust) + } +di in gr "Number of observations N = " in ye %10.0f e(N) +di in gr "Number of regressors K = " in ye %10.0f e(rankxx) +di in gr "Number of instruments L = " in ye %10.0f e(rankzz) +di in gr "Number of excluded instruments L1 = " in ye %10.0f e(ardf) +di + +end + +* Performs first-stage regressions + +program define doFirst, rclass + version 8.2 + args endog /* variable list (including depvar) + */ inexog /* list of included exogenous + */ exexog /* list of excluded exogenous + */ touse /* touse sample + */ weight /* full weight expression w/ [] + */ nocons /* + */ robust /* + */ clopt /* + */ bwopt /* + */ kernopt /* + */ savefprefix /* + */ dofmopt /* + */ sw /* + */ swpsd /* + */ ivreg2_cmd + + tokenize `endog' + tempname statmat statmat1 + local i 1 + while "``i''" != "" { + capture `ivreg2_cmd' ``i'' `inexog' `exexog' `weight' /* + */ if `touse', `nocons' `robust' `clopt' `bwopt' `kernopt' `dofmopt' `sw' `swpsd' small + if _rc ~= 0 { +* First-stage regression failed +di in ye "Unable to estimate first-stage regression of ``i''" + if _rc == 506 { +di in ye " var-cov matrix of first-stage regression of ``i'' not positive-definite" + } + } + else { +* First-stage regression successful +* Check if there is enough room to save results; leave one free. Allow for overwriting. +* Max is 20-1=19 for Stata 9.0 and earlier, 300-1=299 for Stata 9.1+ + if c(stata_version) < 9.1 { + local maxest=19 + } + else { + local maxest=299 + } + local vn "``i''" + local plen : length local savefprefix + local vlen : length local vn + if `plen'+`vlen' > 27 { + local vlen=27-`plen' + local vn : permname `vn', length(`vlen') +* Must create a variable so that permname doesn't reuse it + gen `vn'=0 + local dropvn "`dropvn' `vn'" + } + local eqname "`savefprefix'`vn'" + local eqname : subinstr local eqname "." "_" + qui estimates dir + local est_list "`r(names)'" + Subtract est_list : "`est_list'" "`eqname'" + local est_ct : word count `est_list' + if `est_ct' < `maxest' { + capture est store `eqname', title("First-stage regression: ``i''") + if _rc == 0 { + local firsteqs "`firsteqs' `eqname'" + } + } + else { +di +di in ye "Unable to store first-stage regression of ``i''." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + tempname rssall rssinc pr2 F p + scalar `rssall'=e(rss) + quietly test `exexog' + scalar `F'=r(F) + scalar `p'=r(p) + local df=r(df) + local df_r=r(df_r) +* 1st stage regression without excluded exogenous +* Use regress since need only RSS and handles all cases, including perverse ones (e.g. no regressors) + qui regress ``i'' `inexog' `weight' /* + */ if `touse', `nocons' + */ if `touse', `nocons' `robust' `clopt' `bwopt' `kernopt' `dofmopt' `sw' `swpsd' small + scalar `rssinc'=e(rss) +* NB: uncentered R2 for main regression is 1-rssall/yy; for restricted is 1-rssinc/yy; +* squared semipartial correlation=(rssinc-rssall)/yy=diff of 2 R2s +* Squared partial correlation (="partialled-out R2") + scalar `pr2'=(`rssinc'-`rssall')/`rssinc' +* End of first-stage successful block + } + capture { + mat `statmat1' = (`pr2' \ `F' \ `df' \ `df_r' \ `p') + mat colname `statmat1' = ``i'' + if `i'==1 { + mat `statmat'=`statmat1' + } + else { + mat `statmat' = `statmat' , `statmat1' + } + } + local i = `i' + 1 + } +* Drop any temporarily-created permname variables + if trim("`dropvn'")~="" { + foreach vn of varlist `dropvn' { + capture drop `vn' + } + } + capture mat rowname `statmat' = pr2 F df df_r pvalue + if _rc==0 { + return matrix firstmat `statmat' + } + return local firsteqs "`firsteqs'" +end + +program define doRF, rclass + version 8.2 + args lhs /* + */ inexog /* list of included exogenous + */ exexog /* list of excluded exogenous + */ touse /* touse sample + */ weight /* full weight expression w/ [] + */ nocons /* + */ robust /* + */ clopt /* + */ bwopt /* + */ kernopt /* + */ saverfprefix /* + */ dofminus /* + */ sw /* + */ swpsd /* + */ ivreg2_cmd + +* Anderson-Rubin test of signif of endog regressors (Bo=0) +* In case ivreg2 called with adjusted dof, first stage should adjust dof as well + tempname arf arfp archi2 archi2p ardf ardf_r tempest + capture _estimates hold `tempest' + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } +* Needs to be small so that adjusted dof is reflected in F stat + qui `ivreg2_cmd' `lhs' `inexog' `exexog' `weight' if `touse', /* + */ small `nocons' dofminus(`dofminus') `robust' `clopt' `bwopt' `kernopt' `sw' `swpsd' + qui test `exexog' + scalar `arf'=r(F) + scalar `arfp'=r(p) + scalar `ardf'=r(df) + scalar `ardf_r'=r(df_r) + if "`clopt'"=="" { + scalar `archi2'=`arf'*`ardf'*(e(N)-`dofminus')/(e(N)-e(rankxx)-`dofminus') + } + else { + scalar `archi2'=`arf'*`ardf'*e(N_clust)/r(df_r)*(e(N)-1)/(e(N)-e(rankxx)) + } + scalar `archi2p'=chiprob(`ardf',`archi2') + +* Check if there is enough room to save results; leave one free. Allow for overwriting. +* Max is 20-1=19 for Stata 9.0 and earlier, 300-1=299 for Stata 9.1+ + if c(stata_version) < 9.1 { + local maxest=19 + } + else { + local maxest=299 + } + local vn "`lhs'" + local plen : length local saverfprefix + local vlen : length local lhs + if `plen'+`vlen' > 27 { + local vlen=27-`plen' + local vn : permname `vn', length(`vlen') + } + local eqname "`saverfprefix'`vn'" + local eqname : subinstr local eqname "." "_" + qui estimates dir + local est_list "`r(names)'" + Subtract est_list : "`est_list'" "`eqname'" + local est_ct : word count `est_list' + if `est_ct' < `maxest' { + capture est store `eqname', title("Reduced-form regression: `lhs'") + return local rfeq "`eqname'" + } + else { +di +di in ye "Unable to store reduced-form regression of `lhs'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + _estimates unhold `tempest' + return scalar arf=`arf' + return scalar arfp=`arfp' + return scalar ardf=`ardf' + return scalar ardf_r=`ardf_r' + return scalar archi2=`archi2' + return scalar archi2p=`archi2p' +end + +************************************************************************************** +program define IsStop, sclass + /* sic, must do tests one-at-a-time, + * 0, may be very large */ + version 8.2 + if `"`0'"' == "[" { + sret local stop 1 + exit + } + if `"`0'"' == "," { + sret local stop 1 + exit + } + if `"`0'"' == "if" { + sret local stop 1 + exit + } +* per official ivreg 5.1.3 + if substr(`"`0'"',1,3) == "if(" { + sret local stop 1 + exit + } + if `"`0'"' == "in" { + sret local stop 1 + exit + } + if `"`0'"' == "" { + sret local stop 1 + exit + } + else sret local stop 0 +end + +program define Disp + version 8.2 + syntax [anything] [, _col(integer 15) ] + local len = 80-`_col'+1 + local piece : piece 1 `len' of `"`anything'"' + local i 1 + while "`piece'" != "" { + di in gr _col(`_col') "`first'`piece'" + local i = `i' + 1 + local piece : piece `i' `len' of `"`anything'"' + } + if `i'==1 { + di + } +end + + + +* Remove all tokens in dirt from full +* Returns "cleaned" full list in cleaned + +program define Subtract /* : */ + version 8.2 + args cleaned /* macro name to hold cleaned list + */ colon /* ":" + */ full /* list to be cleaned + */ dirt /* tokens to be cleaned from full */ + + tokenize `dirt' + local i 1 + while "``i''" != "" { + local full : subinstr local full "``i''" "", word all + local i = `i' + 1 + } + + tokenize `full' /* cleans up extra spaces */ + c_local `cleaned' `*' +end + +program define vecsort /* Also clears col/row names */ + version 8.2 + args vmat + tempname hold + mat `vmat'=`vmat'+J(rowsof(`vmat'),colsof(`vmat'),0) + local lastcol = colsof(`vmat') + local i 1 + while `i' < `lastcol' { + if `vmat'[1,`i'] > `vmat'[1,`i'+1] { + scalar `hold' = `vmat'[1,`i'] + mat `vmat'[1,`i'] = `vmat'[1,`i'+1] + mat `vmat'[1,`i'+1] = `hold' + local i = 1 + } + else { + local i = `i' + 1 + } + } +end + +program define matsort + version 8.2 + args vmat names + tempname hold + foreach vn in `names' { + mat `hold'=nullmat(`hold'), `vmat'[1...,"`vn'"] + } + mat `vmat'=`hold' + mat drop `hold' + foreach vn in `names' { + mat `hold'=nullmat(`hold') \ `vmat'["`vn'",1...] + } + mat `vmat'=`hold' +end + +program define cdsy, rclass + version 8.2 + syntax , type(string) k2(integer) nendog(integer) + +* type() can be ivbias5 (k2<=100, nendog<=3) +* ivbias10 (ditto) +* ivbias20 (ditto) +* ivbias30 (ditto) +* ivsize10 (k2<=100, nendog<=2) +* ivsize15 (ditto) +* ivsize20 (ditto) +* ivsize25 (ditto) +* fullrel5 (ditto) +* fullrel10 (ditto) +* fullrel20 (ditto) +* fullrel30 (ditto) +* fullmax5 (ditto) +* fullmax10 (ditto) +* fullmax20 (ditto) +* fullmax30 (ditto) +* limlsize10 (ditto) +* limlsize15 (ditto) +* limlsize20 (ditto) +* limlsize25 (ditto) + + tempname temp cv + +* Initialize critical value as MV + scalar `cv'=. + + if "`type'"=="ivbias5" { + matrix input `temp' = ( /* + */ . , . , . \ /* + */ . , . , . \ /* + */ 13.91 , . , . \ /* + */ 16.85 , 11.04 , . \ /* + */ 18.37 , 13.97 , 9.53 \ /* + */ 19.28 , 15.72 , 12.20 \ /* + */ 19.86 , 16.88 , 13.95 \ /* + */ 20.25 , 17.70 , 15.18 \ /* + */ 20.53 , 18.30 , 16.10 \ /* + */ 20.74 , 18.76 , 16.80 \ /* + */ 20.90 , 19.12 , 17.35 \ /* + */ 21.01 , 19.40 , 17.80 \ /* + */ 21.10 , 19.64 , 18.17 \ /* + */ 21.18 , 19.83 , 18.47 \ /* + */ 21.23 , 19.98 , 18.73 \ /* + */ 21.28 , 20.12 , 18.94 \ /* + */ 21.31 , 20.23 , 19.13 \ /* + */ 21.34 , 20.33 , 19.29 \ /* + */ 21.36 , 20.41 , 19.44 \ /* + */ 21.38 , 20.48 , 19.56 \ /* + */ 21.39 , 20.54 , 19.67 \ /* + */ 21.40 , 20.60 , 19.77 \ /* + */ 21.41 , 20.65 , 19.86 \ /* + */ 21.41 , 20.69 , 19.94 \ /* + */ 21.42 , 20.73 , 20.01 \ /* + */ 21.42 , 20.76 , 20.07 \ /* + */ 21.42 , 20.79 , 20.13 \ /* + */ 21.42 , 20.82 , 20.18 \ /* + */ 21.42 , 20.84 , 20.23 \ /* + */ 21.42 , 20.86 , 20.27 \ /* + */ 21.41 , 20.88 , 20.31 \ /* + */ 21.41 , 20.90 , 20.35 \ /* + */ 21.41 , 20.91 , 20.38 \ /* + */ 21.40 , 20.93 , 20.41 \ /* + */ 21.40 , 20.94 , 20.44 \ /* + */ 21.39 , 20.95 , 20.47 \ /* + */ 21.39 , 20.96 , 20.49 \ /* + */ 21.38 , 20.97 , 20.51 \ /* + */ 21.38 , 20.98 , 20.54 \ /* + */ 21.37 , 20.99 , 20.56 \ /* + */ 21.37 , 20.99 , 20.57 \ /* + */ 21.36 , 21.00 , 20.59 \ /* + */ 21.35 , 21.00 , 20.61 \ /* + */ 21.35 , 21.01 , 20.62 \ /* + */ 21.34 , 21.01 , 20.64 \ /* + */ 21.34 , 21.02 , 20.65 \ /* + */ 21.33 , 21.02 , 20.66 \ /* + */ 21.32 , 21.02 , 20.67 \ /* + */ 21.32 , 21.03 , 20.68 \ /* + */ 21.31 , 21.03 , 20.69 \ /* + */ 21.31 , 21.03 , 20.70 \ /* + */ 21.30 , 21.03 , 20.71 \ /* + */ 21.30 , 21.03 , 20.72 \ /* + */ 21.29 , 21.03 , 20.73 \ /* + */ 21.28 , 21.03 , 20.73 \ /* + */ 21.28 , 21.04 , 20.74 \ /* + */ 21.27 , 21.04 , 20.75 \ /* + */ 21.27 , 21.04 , 20.75 \ /* + */ 21.26 , 21.04 , 20.76 \ /* + */ 21.26 , 21.04 , 20.76 \ /* + */ 21.25 , 21.04 , 20.77 \ /* + */ 21.24 , 21.04 , 20.77 \ /* + */ 21.24 , 21.04 , 20.78 \ /* + */ 21.23 , 21.04 , 20.78 \ /* + */ 21.23 , 21.03 , 20.79 \ /* + */ 21.22 , 21.03 , 20.79 \ /* + */ 21.22 , 21.03 , 20.79 \ /* + */ 21.21 , 21.03 , 20.80 \ /* + */ 21.21 , 21.03 , 20.80 \ /* + */ 21.20 , 21.03 , 20.80 \ /* + */ 21.20 , 21.03 , 20.80 \ /* + */ 21.19 , 21.03 , 20.81 \ /* + */ 21.19 , 21.03 , 20.81 \ /* + */ 21.18 , 21.03 , 20.81 \ /* + */ 21.18 , 21.02 , 20.81 \ /* + */ 21.17 , 21.02 , 20.82 \ /* + */ 21.17 , 21.02 , 20.82 \ /* + */ 21.16 , 21.02 , 20.82 \ /* + */ 21.16 , 21.02 , 20.82 \ /* + */ 21.15 , 21.02 , 20.82 \ /* + */ 21.15 , 21.02 , 20.82 \ /* + */ 21.15 , 21.02 , 20.83 \ /* + */ 21.14 , 21.01 , 20.83 \ /* + */ 21.14 , 21.01 , 20.83 \ /* + */ 21.13 , 21.01 , 20.83 \ /* + */ 21.13 , 21.01 , 20.83 \ /* + */ 21.12 , 21.01 , 20.84 \ /* + */ 21.12 , 21.01 , 20.84 \ /* + */ 21.11 , 21.01 , 20.84 \ /* + */ 21.11 , 21.01 , 20.84 \ /* + */ 21.10 , 21.00 , 20.84 \ /* + */ 21.10 , 21.00 , 20.84 \ /* + */ 21.09 , 21.00 , 20.85 \ /* + */ 21.09 , 21.00 , 20.85 \ /* + */ 21.08 , 21.00 , 20.85 \ /* + */ 21.08 , 21.00 , 20.85 \ /* + */ 21.07 , 21.00 , 20.85 \ /* + */ 21.07 , 20.99 , 20.86 \ /* + */ 21.06 , 20.99 , 20.86 \ /* + */ 21.06 , 20.99 , 20.86 ) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + + + if "`type'"=="ivbias10" { + matrix input `temp' = /* + */ (.,.,. \ /* + */ .,.,. \ /* + */ 9.08,.,. \ /* + */ 10.27,7.56,. \ /* + */ 10.83,8.78,6.61 \ /* + */ 11.12,9.48,7.77 \ /* + */ 11.29,9.92,8.5 \ /* + */ 11.39,10.22,9.01 \ /* + */ 11.46,10.43,9.37 \ /* + */ 11.49,10.58,9.64 \ /* + */ 11.51,10.69,9.85 \ /* + */ 11.52,10.78,10.01 \ /* + */ 11.52,10.84,10.14 \ /* + */ 11.52,10.89,10.25 \ /* + */ 11.51,10.93,10.33 \ /* + */ 11.5,10.96,10.41 \ /* + */ 11.49,10.99,10.47 \ /* + */ 11.48,11,10.52 \ /* + */ 11.46,11.02,10.56 \ /* + */ 11.45,11.03,10.6 \ /* + */ 11.44,11.04,10.63 \ /* + */ 11.42,11.05,10.65 \ /* + */ 11.41,11.05,10.68 \ /* + */ 11.4,11.05,10.7 \ /* + */ 11.38,11.06,10.71 \ /* + */ 11.37,11.06,10.73 \ /* + */ 11.36,11.06,10.74 \ /* + */ 11.34,11.05,10.75 \ /* + */ 11.33,11.05,10.76 \ /* + */ 11.32,11.05,10.77 \ /* + */ 11.3,11.05,10.78 \ /* + */ 11.29,11.05,10.79 \ /* + */ 11.28,11.04,10.79 \ /* + */ 11.27,11.04,10.8 \ /* + */ 11.26,11.04,10.8 \ /* + */ 11.25,11.03,10.8 \ /* + */ 11.24,11.03,10.81 \ /* + */ 11.23,11.02,10.81 \ /* + */ 11.22,11.02,10.81 \ /* + */ 11.21,11.02,10.81 \ /* + */ 11.2,11.01,10.81 \ /* + */ 11.19,11.01,10.81 \ /* + */ 11.18,11,10.81 \ /* + */ 11.17,11,10.81 \ /* + */ 11.16,10.99,10.81 \ /* + */ 11.15,10.99,10.81 \ /* + */ 11.14,10.98,10.81 \ /* + */ 11.13,10.98,10.81 \ /* + */ 11.13,10.98,10.81 \ /* + */ 11.12,10.97,10.81 \ /* + */ 11.11,10.97,10.81 \ /* + */ 11.1,10.96,10.81 \ /* + */ 11.1,10.96,10.81 \ /* + */ 11.09,10.95,10.81 \ /* + */ 11.08,10.95,10.81 \ /* + */ 11.07,10.94,10.8 \ /* + */ 11.07,10.94,10.8 \ /* + */ 11.06,10.94,10.8 \ /* + */ 11.05,10.93,10.8 \ /* + */ 11.05,10.93,10.8 \ /* + */ 11.04,10.92,10.8 \ /* + */ 11.03,10.92,10.79 \ /* + */ 11.03,10.92,10.79 \ /* + */ 11.02,10.91,10.79 \ /* + */ 11.02,10.91,10.79 \ /* + */ 11.01,10.9,10.79 \ /* + */ 11,10.9,10.79 \ /* + */ 11,10.9,10.78 \ /* + */ 10.99,10.89,10.78 \ /* + */ 10.99,10.89,10.78 \ /* + */ 10.98,10.89,10.78 \ /* + */ 10.98,10.88,10.78 \ /* + */ 10.97,10.88,10.77 \ /* + */ 10.97,10.88,10.77 \ /* + */ 10.96,10.87,10.77 \ /* + */ 10.96,10.87,10.77 \ /* + */ 10.95,10.86,10.77 \ /* + */ 10.95,10.86,10.76 \ /* + */ 10.94,10.86,10.76 \ /* + */ 10.94,10.85,10.76 \ /* + */ 10.93,10.85,10.76 \ /* + */ 10.93,10.85,10.76 \ /* + */ 10.92,10.84,10.75 \ /* + */ 10.92,10.84,10.75 \ /* + */ 10.91,10.84,10.75 \ /* + */ 10.91,10.84,10.75 \ /* + */ 10.91,10.83,10.75 \ /* + */ 10.9,10.83,10.74 \ /* + */ 10.9,10.83,10.74 \ /* + */ 10.89,10.82,10.74 \ /* + */ 10.89,10.82,10.74 \ /* + */ 10.89,10.82,10.74 \ /* + */ 10.88,10.81,10.74 \ /* + */ 10.88,10.81,10.73 \ /* + */ 10.87,10.81,10.73 \ /* + */ 10.87,10.81,10.73 \ /* + */ 10.87,10.8,10.73 \ /* + */ 10.86,10.8,10.73 \ /* + */ 10.86,10.8,10.72 \ /* + */ 10.86,10.8,10.72) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + if "`type'"=="ivbias20" { + matrix input `temp' = ( /* + */ . , . , . \ /* + */ . , . , . \ /* + */ 6.46 , . , . \ /* + */ 6.71 , 5.57 , . \ /* + */ 6.77 , 5.91 , 4.99 \ /* + */ 6.76 , 6.08 , 5.35 \ /* + */ 6.73 , 6.16 , 5.56 \ /* + */ 6.69 , 6.20 , 5.69 \ /* + */ 6.65 , 6.22 , 5.78 \ /* + */ 6.61 , 6.23 , 5.83 \ /* + */ 6.56 , 6.23 , 5.87 \ /* + */ 6.53 , 6.22 , 5.90 \ /* + */ 6.49 , 6.21 , 5.92 \ /* + */ 6.45 , 6.20 , 5.93 \ /* + */ 6.42 , 6.19 , 5.94 \ /* + */ 6.39 , 6.17 , 5.94 \ /* + */ 6.36 , 6.16 , 5.94 \ /* + */ 6.33 , 6.14 , 5.94 \ /* + */ 6.31 , 6.13 , 5.94 \ /* + */ 6.28 , 6.11 , 5.93 \ /* + */ 6.26 , 6.10 , 5.93 \ /* + */ 6.24 , 6.08 , 5.92 \ /* + */ 6.22 , 6.07 , 5.92 \ /* + */ 6.20 , 6.06 , 5.91 \ /* + */ 6.18 , 6.05 , 5.90 \ /* + */ 6.16 , 6.03 , 5.90 \ /* + */ 6.14 , 6.02 , 5.89 \ /* + */ 6.13 , 6.01 , 5.88 \ /* + */ 6.11 , 6.00 , 5.88 \ /* + */ 6.09 , 5.99 , 5.87 \ /* + */ 6.08 , 5.98 , 5.87 \ /* + */ 6.07 , 5.97 , 5.86 \ /* + */ 6.05 , 5.96 , 5.85 \ /* + */ 6.04 , 5.95 , 5.85 \ /* + */ 6.03 , 5.94 , 5.84 \ /* + */ 6.01 , 5.93 , 5.83 \ /* + */ 6.00 , 5.92 , 5.83 \ /* + */ 5.99 , 5.91 , 5.82 \ /* + */ 5.98 , 5.90 , 5.82 \ /* + */ 5.97 , 5.89 , 5.81 \ /* + */ 5.96 , 5.89 , 5.80 \ /* + */ 5.95 , 5.88 , 5.80 \ /* + */ 5.94 , 5.87 , 5.79 \ /* + */ 5.93 , 5.86 , 5.79 \ /* + */ 5.92 , 5.86 , 5.78 \ /* + */ 5.91 , 5.85 , 5.78 \ /* + */ 5.91 , 5.84 , 5.77 \ /* + */ 5.90 , 5.83 , 5.77 \ /* + */ 5.89 , 5.83 , 5.76 \ /* + */ 5.88 , 5.82 , 5.76 \ /* + */ 5.87 , 5.82 , 5.75 \ /* + */ 5.87 , 5.81 , 5.75 \ /* + */ 5.86 , 5.80 , 5.74 \ /* + */ 5.85 , 5.80 , 5.74 \ /* + */ 5.85 , 5.79 , 5.73 \ /* + */ 5.84 , 5.79 , 5.73 \ /* + */ 5.83 , 5.78 , 5.72 \ /* + */ 5.83 , 5.78 , 5.72 \ /* + */ 5.82 , 5.77 , 5.72 \ /* + */ 5.81 , 5.77 , 5.71 \ /* + */ 5.81 , 5.76 , 5.71 \ /* + */ 5.80 , 5.76 , 5.70 \ /* + */ 5.80 , 5.75 , 5.70 \ /* + */ 5.79 , 5.75 , 5.70 \ /* + */ 5.78 , 5.74 , 5.69 \ /* + */ 5.78 , 5.74 , 5.69 \ /* + */ 5.77 , 5.73 , 5.68 \ /* + */ 5.77 , 5.73 , 5.68 \ /* + */ 5.76 , 5.72 , 5.68 \ /* + */ 5.76 , 5.72 , 5.67 \ /* + */ 5.75 , 5.72 , 5.67 \ /* + */ 5.75 , 5.71 , 5.67 \ /* + */ 5.75 , 5.71 , 5.66 \ /* + */ 5.74 , 5.70 , 5.66 \ /* + */ 5.74 , 5.70 , 5.66 \ /* + */ 5.73 , 5.70 , 5.65 \ /* + */ 5.73 , 5.69 , 5.65 \ /* + */ 5.72 , 5.69 , 5.65 \ /* + */ 5.72 , 5.68 , 5.65 \ /* + */ 5.71 , 5.68 , 5.64 \ /* + */ 5.71 , 5.68 , 5.64 \ /* + */ 5.71 , 5.67 , 5.64 \ /* + */ 5.70 , 5.67 , 5.63 \ /* + */ 5.70 , 5.67 , 5.63 \ /* + */ 5.70 , 5.66 , 5.63 \ /* + */ 5.69 , 5.66 , 5.62 \ /* + */ 5.69 , 5.66 , 5.62 \ /* + */ 5.68 , 5.65 , 5.62 \ /* + */ 5.68 , 5.65 , 5.62 \ /* + */ 5.68 , 5.65 , 5.61 \ /* + */ 5.67 , 5.65 , 5.61 \ /* + */ 5.67 , 5.64 , 5.61 \ /* + */ 5.67 , 5.64 , 5.61 \ /* + */ 5.66 , 5.64 , 5.60 \ /* + */ 5.66 , 5.63 , 5.60 \ /* + */ 5.66 , 5.63 , 5.60 \ /* + */ 5.65 , 5.63 , 5.60 \ /* + */ 5.65 , 5.63 , 5.59 \ /* + */ 5.65 , 5.62 , 5.59 \ /* + */ 5.65 , 5.62 , 5.59 ) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias30" { + matrix input `temp' = ( /* + */ . , . , . \ /* + */ . , . , . \ /* + */ 5.39 , . , . \ /* + */ 5.34 , 4.73 , . \ /* + */ 5.25 , 4.79 , 4.30 \ /* + */ 5.15 , 4.78 , 4.40 \ /* + */ 5.07 , 4.76 , 4.44 \ /* + */ 4.99 , 4.73 , 4.46 \ /* + */ 4.92 , 4.69 , 4.46 \ /* + */ 4.86 , 4.66 , 4.45 \ /* + */ 4.80 , 4.62 , 4.44 \ /* + */ 4.75 , 4.59 , 4.42 \ /* + */ 4.71 , 4.56 , 4.41 \ /* + */ 4.67 , 4.53 , 4.39 \ /* + */ 4.63 , 4.50 , 4.37 \ /* + */ 4.59 , 4.48 , 4.36 \ /* + */ 4.56 , 4.45 , 4.34 \ /* + */ 4.53 , 4.43 , 4.32 \ /* + */ 4.51 , 4.41 , 4.31 \ /* + */ 4.48 , 4.39 , 4.29 \ /* + */ 4.46 , 4.37 , 4.28 \ /* + */ 4.43 , 4.35 , 4.27 \ /* + */ 4.41 , 4.33 , 4.25 \ /* + */ 4.39 , 4.32 , 4.24 \ /* + */ 4.37 , 4.30 , 4.23 \ /* + */ 4.35 , 4.29 , 4.21 \ /* + */ 4.34 , 4.27 , 4.20 \ /* + */ 4.32 , 4.26 , 4.19 \ /* + */ 4.31 , 4.24 , 4.18 \ /* + */ 4.29 , 4.23 , 4.17 \ /* + */ 4.28 , 4.22 , 4.16 \ /* + */ 4.26 , 4.21 , 4.15 \ /* + */ 4.25 , 4.20 , 4.14 \ /* + */ 4.24 , 4.19 , 4.13 \ /* + */ 4.23 , 4.18 , 4.13 \ /* + */ 4.22 , 4.17 , 4.12 \ /* + */ 4.20 , 4.16 , 4.11 \ /* + */ 4.19 , 4.15 , 4.10 \ /* + */ 4.18 , 4.14 , 4.09 \ /* + */ 4.17 , 4.13 , 4.09 \ /* + */ 4.16 , 4.12 , 4.08 \ /* + */ 4.15 , 4.11 , 4.07 \ /* + */ 4.15 , 4.11 , 4.07 \ /* + */ 4.14 , 4.10 , 4.06 \ /* + */ 4.13 , 4.09 , 4.05 \ /* + */ 4.12 , 4.08 , 4.05 \ /* + */ 4.11 , 4.08 , 4.04 \ /* + */ 4.11 , 4.07 , 4.03 \ /* + */ 4.10 , 4.06 , 4.03 \ /* + */ 4.09 , 4.06 , 4.02 \ /* + */ 4.08 , 4.05 , 4.02 \ /* + */ 4.08 , 4.05 , 4.01 \ /* + */ 4.07 , 4.04 , 4.01 \ /* + */ 4.06 , 4.03 , 4.00 \ /* + */ 4.06 , 4.03 , 4.00 \ /* + */ 4.05 , 4.02 , 3.99 \ /* + */ 4.05 , 4.02 , 3.99 \ /* + */ 4.04 , 4.01 , 3.98 \ /* + */ 4.04 , 4.01 , 3.98 \ /* + */ 4.03 , 4.00 , 3.97 \ /* + */ 4.02 , 4.00 , 3.97 \ /* + */ 4.02 , 3.99 , 3.96 \ /* + */ 4.01 , 3.99 , 3.96 \ /* + */ 4.01 , 3.98 , 3.96 \ /* + */ 4.00 , 3.98 , 3.95 \ /* + */ 4.00 , 3.97 , 3.95 \ /* + */ 3.99 , 3.97 , 3.94 \ /* + */ 3.99 , 3.97 , 3.94 \ /* + */ 3.99 , 3.96 , 3.94 \ /* + */ 3.98 , 3.96 , 3.93 \ /* + */ 3.98 , 3.95 , 3.93 \ /* + */ 3.97 , 3.95 , 3.93 \ /* + */ 3.97 , 3.95 , 3.92 \ /* + */ 3.96 , 3.94 , 3.92 \ /* + */ 3.96 , 3.94 , 3.92 \ /* + */ 3.96 , 3.93 , 3.91 \ /* + */ 3.95 , 3.93 , 3.91 \ /* + */ 3.95 , 3.93 , 3.91 \ /* + */ 3.95 , 3.92 , 3.90 \ /* + */ 3.94 , 3.92 , 3.90 \ /* + */ 3.94 , 3.92 , 3.90 \ /* + */ 3.93 , 3.91 , 3.89 \ /* + */ 3.93 , 3.91 , 3.89 \ /* + */ 3.93 , 3.91 , 3.89 \ /* + */ 3.92 , 3.91 , 3.89 \ /* + */ 3.92 , 3.90 , 3.88 \ /* + */ 3.92 , 3.90 , 3.88 \ /* + */ 3.91 , 3.90 , 3.88 \ /* + */ 3.91 , 3.89 , 3.87 \ /* + */ 3.91 , 3.89 , 3.87 \ /* + */ 3.91 , 3.89 , 3.87 \ /* + */ 3.90 , 3.89 , 3.87 \ /* + */ 3.90 , 3.88 , 3.86 \ /* + */ 3.90 , 3.88 , 3.86 \ /* + */ 3.89 , 3.88 , 3.86 \ /* + */ 3.89 , 3.87 , 3.86 \ /* + */ 3.89 , 3.87 , 3.85 \ /* + */ 3.89 , 3.87 , 3.85 \ /* + */ 3.88 , 3.87 , 3.85 \ /* + */ 3.88 , 3.86 , 3.85 ) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + if "`type'"=="ivsize10" { + matrix input `temp' = /* + */ (16.38,. \ /* + */ 19.93,7.03 \ /* + */ 22.3,13.43 \ /* + */ 24.58,16.87 \ /* + */ 26.87,19.45 \ /* + */ 29.18,21.68 \ /* + */ 31.5,23.72 \ /* + */ 33.84,25.64 \ /* + */ 36.19,27.51 \ /* + */ 38.54,29.32 \ /* + */ 40.9,31.11 \ /* + */ 43.27,32.88 \ /* + */ 45.64,34.62 \ /* + */ 48.01,36.36 \ /* + */ 50.39,38.08 \ /* + */ 52.77,39.8 \ /* + */ 55.15,41.51 \ /* + */ 57.53,43.22 \ /* + */ 59.92,44.92 \ /* + */ 62.3,46.62 \ /* + */ 64.69,48.31 \ /* + */ 67.07,50.01 \ /* + */ 69.46,51.7 \ /* + */ 71.85,53.39 \ /* + */ 74.24,55.07 \ /* + */ 76.62,56.76 \ /* + */ 79.01,58.45 \ /* + */ 81.4,60.13 \ /* + */ 83.79,61.82 \ /* + */ 86.17,63.51 \ /* + */ 88.56,65.19 \ /* + */ 90.95,66.88 \ /* + */ 93.33,68.56 \ /* + */ 95.72,70.25 \ /* + */ 98.11,71.94 \ /* + */ 100.5,73.62 \ /* + */ 102.88,75.31 \ /* + */ 105.27,76.99 \ /* + */ 107.66,78.68 \ /* + */ 110.04,80.37 \ /* + */ 112.43,82.05 \ /* + */ 114.82,83.74 \ /* + */ 117.21,85.42 \ /* + */ 119.59,87.11 \ /* + */ 121.98,88.8 \ /* + */ 124.37,90.48 \ /* + */ 126.75,92.17 \ /* + */ 129.14,93.85 \ /* + */ 131.53,95.54 \ /* + */ 133.92,97.23 \ /* + */ 136.3,98.91 \ /* + */ 138.69,100.6 \ /* + */ 141.08,102.29 \ /* + */ 143.47,103.97 \ /* + */ 145.85,105.66 \ /* + */ 148.24,107.34 \ /* + */ 150.63,109.03 \ /* + */ 153.01,110.72 \ /* + */ 155.4,112.4 \ /* + */ 157.79,114.09 \ /* + */ 160.18,115.77 \ /* + */ 162.56,117.46 \ /* + */ 164.95,119.15 \ /* + */ 167.34,120.83 \ /* + */ 169.72,122.52 \ /* + */ 172.11,124.2 \ /* + */ 174.5,125.89 \ /* + */ 176.89,127.58 \ /* + */ 179.27,129.26 \ /* + */ 181.66,130.95 \ /* + */ 184.05,132.63 \ /* + */ 186.44,134.32 \ /* + */ 188.82,136.01 \ /* + */ 191.21,137.69 \ /* + */ 193.6,139.38 \ /* + */ 195.98,141.07 \ /* + */ 198.37,142.75 \ /* + */ 200.76,144.44 \ /* + */ 203.15,146.12 \ /* + */ 205.53,147.81 \ /* + */ 207.92,149.5 \ /* + */ 210.31,151.18 \ /* + */ 212.69,152.87 \ /* + */ 215.08,154.55 \ /* + */ 217.47,156.24 \ /* + */ 219.86,157.93 \ /* + */ 222.24,159.61 \ /* + */ 224.63,161.3 \ /* + */ 227.02,162.98 \ /* + */ 229.41,164.67 \ /* + */ 231.79,166.36 \ /* + */ 234.18,168.04 \ /* + */ 236.57,169.73 \ /* + */ 238.95,171.41 \ /* + */ 241.34,173.1 \ /* + */ 243.73,174.79 \ /* + */ 246.12,176.47 \ /* + */ 248.5,178.16 \ /* + */ 250.89,179.84 \ /* + */ 253.28,181.53) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize15" { + matrix input `temp' = ( /* + */ 8.96 , . \ /* + */ 11.59 , 4.58 \ /* + */ 12.83 , 8.18 \ /* + */ 13.96 , 9.93 \ /* + */ 15.09 , 11.22 \ /* + */ 16.23 , 12.33 \ /* + */ 17.38 , 13.34 \ /* + */ 18.54 , 14.31 \ /* + */ 19.71 , 15.24 \ /* + */ 20.88 , 16.16 \ /* + */ 22.06 , 17.06 \ /* + */ 23.24 , 17.95 \ /* + */ 24.42 , 18.84 \ /* + */ 25.61 , 19.72 \ /* + */ 26.80 , 20.60 \ /* + */ 27.99 , 21.48 \ /* + */ 29.19 , 22.35 \ /* + */ 30.38 , 23.22 \ /* + */ 31.58 , 24.09 \ /* + */ 32.77 , 24.96 \ /* + */ 33.97 , 25.82 \ /* + */ 35.17 , 26.69 \ /* + */ 36.37 , 27.56 \ /* + */ 37.57 , 28.42 \ /* + */ 38.77 , 29.29 \ /* + */ 39.97 , 30.15 \ /* + */ 41.17 , 31.02 \ /* + */ 42.37 , 31.88 \ /* + */ 43.57 , 32.74 \ /* + */ 44.78 , 33.61 \ /* + */ 45.98 , 34.47 \ /* + */ 47.18 , 35.33 \ /* + */ 48.38 , 36.19 \ /* + */ 49.59 , 37.06 \ /* + */ 50.79 , 37.92 \ /* + */ 51.99 , 38.78 \ /* + */ 53.19 , 39.64 \ /* + */ 54.40 , 40.50 \ /* + */ 55.60 , 41.37 \ /* + */ 56.80 , 42.23 \ /* + */ 58.01 , 43.09 \ /* + */ 59.21 , 43.95 \ /* + */ 60.41 , 44.81 \ /* + */ 61.61 , 45.68 \ /* + */ 62.82 , 46.54 \ /* + */ 64.02 , 47.40 \ /* + */ 65.22 , 48.26 \ /* + */ 66.42 , 49.12 \ /* + */ 67.63 , 49.99 \ /* + */ 68.83 , 50.85 \ /* + */ 70.03 , 51.71 \ /* + */ 71.24 , 52.57 \ /* + */ 72.44 , 53.43 \ /* + */ 73.64 , 54.30 \ /* + */ 74.84 , 55.16 \ /* + */ 76.05 , 56.02 \ /* + */ 77.25 , 56.88 \ /* + */ 78.45 , 57.74 \ /* + */ 79.66 , 58.61 \ /* + */ 80.86 , 59.47 \ /* + */ 82.06 , 60.33 \ /* + */ 83.26 , 61.19 \ /* + */ 84.47 , 62.05 \ /* + */ 85.67 , 62.92 \ /* + */ 86.87 , 63.78 \ /* + */ 88.07 , 64.64 \ /* + */ 89.28 , 65.50 \ /* + */ 90.48 , 66.36 \ /* + */ 91.68 , 67.22 \ /* + */ 92.89 , 68.09 \ /* + */ 94.09 , 68.95 \ /* + */ 95.29 , 69.81 \ /* + */ 96.49 , 70.67 \ /* + */ 97.70 , 71.53 \ /* + */ 98.90 , 72.40 \ /* + */ 100.10 , 73.26 \ /* + */ 101.30 , 74.12 \ /* + */ 102.51 , 74.98 \ /* + */ 103.71 , 75.84 \ /* + */ 104.91 , 76.71 \ /* + */ 106.12 , 77.57 \ /* + */ 107.32 , 78.43 \ /* + */ 108.52 , 79.29 \ /* + */ 109.72 , 80.15 \ /* + */ 110.93 , 81.02 \ /* + */ 112.13 , 81.88 \ /* + */ 113.33 , 82.74 \ /* + */ 114.53 , 83.60 \ /* + */ 115.74 , 84.46 \ /* + */ 116.94 , 85.33 \ /* + */ 118.14 , 86.19 \ /* + */ 119.35 , 87.05 \ /* + */ 120.55 , 87.91 \ /* + */ 121.75 , 88.77 \ /* + */ 122.95 , 89.64 \ /* + */ 124.16 , 90.50 \ /* + */ 125.36 , 91.36 \ /* + */ 126.56 , 92.22 \ /* + */ 127.76 , 93.08 \ /* + */ 128.97 , 93.95 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize20" { + matrix input `temp' = ( /* + */ 6.66 , . \ /* + */ 8.75 , 3.95 \ /* + */ 9.54 , 6.40 \ /* + */ 10.26 , 7.54 \ /* + */ 10.98 , 8.38 \ /* + */ 11.72 , 9.10 \ /* + */ 12.48 , 9.77 \ /* + */ 13.24 , 10.41 \ /* + */ 14.01 , 11.03 \ /* + */ 14.78 , 11.65 \ /* + */ 15.56 , 12.25 \ /* + */ 16.35 , 12.86 \ /* + */ 17.14 , 13.45 \ /* + */ 17.93 , 14.05 \ /* + */ 18.72 , 14.65 \ /* + */ 19.51 , 15.24 \ /* + */ 20.31 , 15.83 \ /* + */ 21.10 , 16.42 \ /* + */ 21.90 , 17.02 \ /* + */ 22.70 , 17.61 \ /* + */ 23.50 , 18.20 \ /* + */ 24.30 , 18.79 \ /* + */ 25.10 , 19.38 \ /* + */ 25.90 , 19.97 \ /* + */ 26.71 , 20.56 \ /* + */ 27.51 , 21.15 \ /* + */ 28.31 , 21.74 \ /* + */ 29.12 , 22.33 \ /* + */ 29.92 , 22.92 \ /* + */ 30.72 , 23.51 \ /* + */ 31.53 , 24.10 \ /* + */ 32.33 , 24.69 \ /* + */ 33.14 , 25.28 \ /* + */ 33.94 , 25.87 \ /* + */ 34.75 , 26.46 \ /* + */ 35.55 , 27.05 \ /* + */ 36.36 , 27.64 \ /* + */ 37.17 , 28.23 \ /* + */ 37.97 , 28.82 \ /* + */ 38.78 , 29.41 \ /* + */ 39.58 , 30.00 \ /* + */ 40.39 , 30.59 \ /* + */ 41.20 , 31.18 \ /* + */ 42.00 , 31.77 \ /* + */ 42.81 , 32.36 \ /* + */ 43.62 , 32.95 \ /* + */ 44.42 , 33.54 \ /* + */ 45.23 , 34.13 \ /* + */ 46.03 , 34.72 \ /* + */ 46.84 , 35.31 \ /* + */ 47.65 , 35.90 \ /* + */ 48.45 , 36.49 \ /* + */ 49.26 , 37.08 \ /* + */ 50.06 , 37.67 \ /* + */ 50.87 , 38.26 \ /* + */ 51.68 , 38.85 \ /* + */ 52.48 , 39.44 \ /* + */ 53.29 , 40.02 \ /* + */ 54.09 , 40.61 \ /* + */ 54.90 , 41.20 \ /* + */ 55.71 , 41.79 \ /* + */ 56.51 , 42.38 \ /* + */ 57.32 , 42.97 \ /* + */ 58.13 , 43.56 \ /* + */ 58.93 , 44.15 \ /* + */ 59.74 , 44.74 \ /* + */ 60.54 , 45.33 \ /* + */ 61.35 , 45.92 \ /* + */ 62.16 , 46.51 \ /* + */ 62.96 , 47.10 \ /* + */ 63.77 , 47.69 \ /* + */ 64.57 , 48.28 \ /* + */ 65.38 , 48.87 \ /* + */ 66.19 , 49.46 \ /* + */ 66.99 , 50.05 \ /* + */ 67.80 , 50.64 \ /* + */ 68.60 , 51.23 \ /* + */ 69.41 , 51.82 \ /* + */ 70.22 , 52.41 \ /* + */ 71.02 , 53.00 \ /* + */ 71.83 , 53.59 \ /* + */ 72.64 , 54.18 \ /* + */ 73.44 , 54.77 \ /* + */ 74.25 , 55.36 \ /* + */ 75.05 , 55.95 \ /* + */ 75.86 , 56.54 \ /* + */ 76.67 , 57.13 \ /* + */ 77.47 , 57.72 \ /* + */ 78.28 , 58.31 \ /* + */ 79.08 , 58.90 \ /* + */ 79.89 , 59.49 \ /* + */ 80.70 , 60.08 \ /* + */ 81.50 , 60.67 \ /* + */ 82.31 , 61.26 \ /* + */ 83.12 , 61.85 \ /* + */ 83.92 , 62.44 \ /* + */ 84.73 , 63.03 \ /* + */ 85.53 , 63.62 \ /* + */ 86.34 , 64.21 \ /* + */ 87.15 , 64.80 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize25" { + matrix input `temp' = ( /* + */ 5.53 , . \ /* + */ 7.25 , 3.63 \ /* + */ 7.80 , 5.45 \ /* + */ 8.31 , 6.28 \ /* + */ 8.84 , 6.89 \ /* + */ 9.38 , 7.42 \ /* + */ 9.93 , 7.91 \ /* + */ 10.50 , 8.39 \ /* + */ 11.07 , 8.85 \ /* + */ 11.65 , 9.31 \ /* + */ 12.23 , 9.77 \ /* + */ 12.82 , 10.22 \ /* + */ 13.41 , 10.68 \ /* + */ 14.00 , 11.13 \ /* + */ 14.60 , 11.58 \ /* + */ 15.19 , 12.03 \ /* + */ 15.79 , 12.49 \ /* + */ 16.39 , 12.94 \ /* + */ 16.99 , 13.39 \ /* + */ 17.60 , 13.84 \ /* + */ 18.20 , 14.29 \ /* + */ 18.80 , 14.74 \ /* + */ 19.41 , 15.19 \ /* + */ 20.01 , 15.64 \ /* + */ 20.61 , 16.10 \ /* + */ 21.22 , 16.55 \ /* + */ 21.83 , 17.00 \ /* + */ 22.43 , 17.45 \ /* + */ 23.04 , 17.90 \ /* + */ 23.65 , 18.35 \ /* + */ 24.25 , 18.81 \ /* + */ 24.86 , 19.26 \ /* + */ 25.47 , 19.71 \ /* + */ 26.08 , 20.16 \ /* + */ 26.68 , 20.61 \ /* + */ 27.29 , 21.06 \ /* + */ 27.90 , 21.52 \ /* + */ 28.51 , 21.97 \ /* + */ 29.12 , 22.42 \ /* + */ 29.73 , 22.87 \ /* + */ 30.33 , 23.32 \ /* + */ 30.94 , 23.78 \ /* + */ 31.55 , 24.23 \ /* + */ 32.16 , 24.68 \ /* + */ 32.77 , 25.13 \ /* + */ 33.38 , 25.58 \ /* + */ 33.99 , 26.04 \ /* + */ 34.60 , 26.49 \ /* + */ 35.21 , 26.94 \ /* + */ 35.82 , 27.39 \ /* + */ 36.43 , 27.85 \ /* + */ 37.04 , 28.30 \ /* + */ 37.65 , 28.75 \ /* + */ 38.25 , 29.20 \ /* + */ 38.86 , 29.66 \ /* + */ 39.47 , 30.11 \ /* + */ 40.08 , 30.56 \ /* + */ 40.69 , 31.01 \ /* + */ 41.30 , 31.47 \ /* + */ 41.91 , 31.92 \ /* + */ 42.52 , 32.37 \ /* + */ 43.13 , 32.82 \ /* + */ 43.74 , 33.27 \ /* + */ 44.35 , 33.73 \ /* + */ 44.96 , 34.18 \ /* + */ 45.57 , 34.63 \ /* + */ 46.18 , 35.08 \ /* + */ 46.78 , 35.54 \ /* + */ 47.39 , 35.99 \ /* + */ 48.00 , 36.44 \ /* + */ 48.61 , 36.89 \ /* + */ 49.22 , 37.35 \ /* + */ 49.83 , 37.80 \ /* + */ 50.44 , 38.25 \ /* + */ 51.05 , 38.70 \ /* + */ 51.66 , 39.16 \ /* + */ 52.27 , 39.61 \ /* + */ 52.88 , 40.06 \ /* + */ 53.49 , 40.51 \ /* + */ 54.10 , 40.96 \ /* + */ 54.71 , 41.42 \ /* + */ 55.32 , 41.87 \ /* + */ 55.92 , 42.32 \ /* + */ 56.53 , 42.77 \ /* + */ 57.14 , 43.23 \ /* + */ 57.75 , 43.68 \ /* + */ 58.36 , 44.13 \ /* + */ 58.97 , 44.58 \ /* + */ 59.58 , 45.04 \ /* + */ 60.19 , 45.49 \ /* + */ 60.80 , 45.94 \ /* + */ 61.41 , 46.39 \ /* + */ 62.02 , 46.85 \ /* + */ 62.63 , 47.30 \ /* + */ 63.24 , 47.75 \ /* + */ 63.85 , 48.20 \ /* + */ 64.45 , 48.65 \ /* + */ 65.06 , 49.11 \ /* + */ 65.67 , 49.56 \ /* + */ 66.28 , 50.01 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel5" { + matrix input `temp' = ( /* + */ 24.09 , . \ /* + */ 13.46 , 15.50 \ /* + */ 9.61 , 10.83 \ /* + */ 7.63 , 8.53 \ /* + */ 6.42 , 7.16 \ /* + */ 5.61 , 6.24 \ /* + */ 5.02 , 5.59 \ /* + */ 4.58 , 5.10 \ /* + */ 4.23 , 4.71 \ /* + */ 3.96 , 4.41 \ /* + */ 3.73 , 4.15 \ /* + */ 3.54 , 3.94 \ /* + */ 3.38 , 3.76 \ /* + */ 3.24 , 3.60 \ /* + */ 3.12 , 3.47 \ /* + */ 3.01 , 3.35 \ /* + */ 2.92 , 3.24 \ /* + */ 2.84 , 3.15 \ /* + */ 2.76 , 3.06 \ /* + */ 2.69 , 2.98 \ /* + */ 2.63 , 2.91 \ /* + */ 2.58 , 2.85 \ /* + */ 2.52 , 2.79 \ /* + */ 2.48 , 2.73 \ /* + */ 2.43 , 2.68 \ /* + */ 2.39 , 2.63 \ /* + */ 2.36 , 2.59 \ /* + */ 2.32 , 2.55 \ /* + */ 2.29 , 2.51 \ /* + */ 2.26 , 2.47 \ /* + */ 2.23 , 2.44 \ /* + */ 2.20 , 2.41 \ /* + */ 2.18 , 2.37 \ /* + */ 2.16 , 2.35 \ /* + */ 2.13 , 2.32 \ /* + */ 2.11 , 2.29 \ /* + */ 2.09 , 2.27 \ /* + */ 2.07 , 2.24 \ /* + */ 2.05 , 2.22 \ /* + */ 2.04 , 2.20 \ /* + */ 2.02 , 2.18 \ /* + */ 2.00 , 2.16 \ /* + */ 1.99 , 2.14 \ /* + */ 1.97 , 2.12 \ /* + */ 1.96 , 2.10 \ /* + */ 1.94 , 2.09 \ /* + */ 1.93 , 2.07 \ /* + */ 1.92 , 2.05 \ /* + */ 1.91 , 2.04 \ /* + */ 1.89 , 2.02 \ /* + */ 1.88 , 2.01 \ /* + */ 1.87 , 2.00 \ /* + */ 1.86 , 1.98 \ /* + */ 1.85 , 1.97 \ /* + */ 1.84 , 1.96 \ /* + */ 1.83 , 1.95 \ /* + */ 1.82 , 1.94 \ /* + */ 1.81 , 1.92 \ /* + */ 1.80 , 1.91 \ /* + */ 1.79 , 1.90 \ /* + */ 1.79 , 1.89 \ /* + */ 1.78 , 1.88 \ /* + */ 1.77 , 1.87 \ /* + */ 1.76 , 1.87 \ /* + */ 1.75 , 1.86 \ /* + */ 1.75 , 1.85 \ /* + */ 1.74 , 1.84 \ /* + */ 1.73 , 1.83 \ /* + */ 1.72 , 1.83 \ /* + */ 1.72 , 1.82 \ /* + */ 1.71 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.79 \ /* + */ 1.68 , 1.79 \ /* + */ 1.68 , 1.78 \ /* + */ 1.67 , 1.77 \ /* + */ 1.67 , 1.77 \ /* + */ 1.66 , 1.76 \ /* + */ 1.65 , 1.76 \ /* + */ 1.65 , 1.75 \ /* + */ 1.64 , 1.75 \ /* + */ 1.64 , 1.74 \ /* + */ 1.63 , 1.74 \ /* + */ 1.63 , 1.73 \ /* + */ 1.62 , 1.73 \ /* + */ 1.61 , 1.73 \ /* + */ 1.61 , 1.72 \ /* + */ 1.60 , 1.72 \ /* + */ 1.60 , 1.71 \ /* + */ 1.59 , 1.71 \ /* + */ 1.59 , 1.71 \ /* + */ 1.58 , 1.71 \ /* + */ 1.58 , 1.70 \ /* + */ 1.57 , 1.70 \ /* + */ 1.57 , 1.70 \ /* + */ 1.56 , 1.69 \ /* + */ 1.56 , 1.69 \ /* + */ 1.55 , 1.69 \ /* + */ 1.55 , 1.69 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel10" { + matrix input `temp' = ( /* + */ 19.36 , . \ /* + */ 10.89 , 12.55 \ /* + */ 7.90 , 8.96 \ /* + */ 6.37 , 7.15 \ /* + */ 5.44 , 6.07 \ /* + */ 4.81 , 5.34 \ /* + */ 4.35 , 4.82 \ /* + */ 4.01 , 4.43 \ /* + */ 3.74 , 4.12 \ /* + */ 3.52 , 3.87 \ /* + */ 3.34 , 3.67 \ /* + */ 3.19 , 3.49 \ /* + */ 3.06 , 3.35 \ /* + */ 2.95 , 3.22 \ /* + */ 2.85 , 3.11 \ /* + */ 2.76 , 3.01 \ /* + */ 2.69 , 2.92 \ /* + */ 2.62 , 2.84 \ /* + */ 2.56 , 2.77 \ /* + */ 2.50 , 2.71 \ /* + */ 2.45 , 2.65 \ /* + */ 2.40 , 2.60 \ /* + */ 2.36 , 2.55 \ /* + */ 2.32 , 2.50 \ /* + */ 2.28 , 2.46 \ /* + */ 2.24 , 2.42 \ /* + */ 2.21 , 2.38 \ /* + */ 2.18 , 2.35 \ /* + */ 2.15 , 2.31 \ /* + */ 2.12 , 2.28 \ /* + */ 2.10 , 2.25 \ /* + */ 2.07 , 2.23 \ /* + */ 2.05 , 2.20 \ /* + */ 2.03 , 2.17 \ /* + */ 2.01 , 2.15 \ /* + */ 1.99 , 2.13 \ /* + */ 1.97 , 2.11 \ /* + */ 1.95 , 2.09 \ /* + */ 1.93 , 2.07 \ /* + */ 1.92 , 2.05 \ /* + */ 1.90 , 2.03 \ /* + */ 1.88 , 2.01 \ /* + */ 1.87 , 2.00 \ /* + */ 1.86 , 1.98 \ /* + */ 1.84 , 1.96 \ /* + */ 1.83 , 1.95 \ /* + */ 1.82 , 1.93 \ /* + */ 1.81 , 1.92 \ /* + */ 1.79 , 1.91 \ /* + */ 1.78 , 1.89 \ /* + */ 1.77 , 1.88 \ /* + */ 1.76 , 1.87 \ /* + */ 1.75 , 1.86 \ /* + */ 1.74 , 1.85 \ /* + */ 1.73 , 1.84 \ /* + */ 1.72 , 1.83 \ /* + */ 1.71 , 1.82 \ /* + */ 1.70 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.79 \ /* + */ 1.68 , 1.78 \ /* + */ 1.67 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.65 , 1.75 \ /* + */ 1.64 , 1.74 \ /* + */ 1.64 , 1.73 \ /* + */ 1.63 , 1.72 \ /* + */ 1.63 , 1.72 \ /* + */ 1.62 , 1.71 \ /* + */ 1.61 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.60 , 1.69 \ /* + */ 1.60 , 1.68 \ /* + */ 1.59 , 1.68 \ /* + */ 1.59 , 1.67 \ /* + */ 1.58 , 1.67 \ /* + */ 1.58 , 1.66 \ /* + */ 1.57 , 1.66 \ /* + */ 1.57 , 1.65 \ /* + */ 1.56 , 1.65 \ /* + */ 1.56 , 1.64 \ /* + */ 1.56 , 1.64 \ /* + */ 1.55 , 1.63 \ /* + */ 1.55 , 1.63 \ /* + */ 1.54 , 1.62 \ /* + */ 1.54 , 1.62 \ /* + */ 1.54 , 1.62 \ /* + */ 1.53 , 1.61 \ /* + */ 1.53 , 1.61 \ /* + */ 1.53 , 1.61 \ /* + */ 1.52 , 1.60 \ /* + */ 1.52 , 1.60 \ /* + */ 1.52 , 1.60 \ /* + */ 1.52 , 1.59 \ /* + */ 1.51 , 1.59 \ /* + */ 1.51 , 1.59 \ /* + */ 1.51 , 1.59 \ /* + */ 1.51 , 1.58 \ /* + */ 1.50 , 1.58 ) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel20" { + matrix input `temp' = ( /* + */ 15.64 , . \ /* + */ 9.00 , 9.72 \ /* + */ 6.61 , 7.18 \ /* + */ 5.38 , 5.85 \ /* + */ 4.62 , 5.04 \ /* + */ 4.11 , 4.48 \ /* + */ 3.75 , 4.08 \ /* + */ 3.47 , 3.77 \ /* + */ 3.25 , 3.53 \ /* + */ 3.07 , 3.33 \ /* + */ 2.92 , 3.17 \ /* + */ 2.80 , 3.04 \ /* + */ 2.70 , 2.92 \ /* + */ 2.61 , 2.82 \ /* + */ 2.53 , 2.73 \ /* + */ 2.46 , 2.65 \ /* + */ 2.39 , 2.58 \ /* + */ 2.34 , 2.52 \ /* + */ 2.29 , 2.46 \ /* + */ 2.24 , 2.41 \ /* + */ 2.20 , 2.36 \ /* + */ 2.16 , 2.32 \ /* + */ 2.13 , 2.28 \ /* + */ 2.10 , 2.24 \ /* + */ 2.06 , 2.21 \ /* + */ 2.04 , 2.18 \ /* + */ 2.01 , 2.15 \ /* + */ 1.99 , 2.12 \ /* + */ 1.96 , 2.09 \ /* + */ 1.94 , 2.07 \ /* + */ 1.92 , 2.04 \ /* + */ 1.90 , 2.02 \ /* + */ 1.88 , 2.00 \ /* + */ 1.87 , 1.98 \ /* + */ 1.85 , 1.96 \ /* + */ 1.83 , 1.94 \ /* + */ 1.82 , 1.93 \ /* + */ 1.80 , 1.91 \ /* + */ 1.79 , 1.89 \ /* + */ 1.78 , 1.88 \ /* + */ 1.76 , 1.86 \ /* + */ 1.75 , 1.85 \ /* + */ 1.74 , 1.84 \ /* + */ 1.73 , 1.82 \ /* + */ 1.72 , 1.81 \ /* + */ 1.71 , 1.80 \ /* + */ 1.70 , 1.79 \ /* + */ 1.69 , 1.78 \ /* + */ 1.68 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.65 , 1.74 \ /* + */ 1.65 , 1.73 \ /* + */ 1.64 , 1.72 \ /* + */ 1.63 , 1.71 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.68 \ /* + */ 1.60 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.56 , 1.62 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.54 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.44 , 1.50 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 ) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel30" { + matrix input `temp' = ( /* + */ 12.71 , . \ /* + */ 7.49 , 8.03 \ /* + */ 5.60 , 6.15 \ /* + */ 4.63 , 5.10 \ /* + */ 4.03 , 4.44 \ /* + */ 3.63 , 3.98 \ /* + */ 3.33 , 3.65 \ /* + */ 3.11 , 3.39 \ /* + */ 2.93 , 3.19 \ /* + */ 2.79 , 3.02 \ /* + */ 2.67 , 2.88 \ /* + */ 2.57 , 2.77 \ /* + */ 2.48 , 2.67 \ /* + */ 2.41 , 2.58 \ /* + */ 2.34 , 2.51 \ /* + */ 2.28 , 2.44 \ /* + */ 2.23 , 2.38 \ /* + */ 2.18 , 2.33 \ /* + */ 2.14 , 2.28 \ /* + */ 2.10 , 2.23 \ /* + */ 2.07 , 2.19 \ /* + */ 2.04 , 2.16 \ /* + */ 2.01 , 2.12 \ /* + */ 1.98 , 2.09 \ /* + */ 1.95 , 2.06 \ /* + */ 1.93 , 2.03 \ /* + */ 1.90 , 2.01 \ /* + */ 1.88 , 1.98 \ /* + */ 1.86 , 1.96 \ /* + */ 1.84 , 1.94 \ /* + */ 1.83 , 1.92 \ /* + */ 1.81 , 1.90 \ /* + */ 1.79 , 1.88 \ /* + */ 1.78 , 1.87 \ /* + */ 1.76 , 1.85 \ /* + */ 1.75 , 1.83 \ /* + */ 1.74 , 1.82 \ /* + */ 1.72 , 1.80 \ /* + */ 1.71 , 1.79 \ /* + */ 1.70 , 1.78 \ /* + */ 1.69 , 1.77 \ /* + */ 1.68 , 1.75 \ /* + */ 1.67 , 1.74 \ /* + */ 1.66 , 1.73 \ /* + */ 1.65 , 1.72 \ /* + */ 1.64 , 1.71 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.60 , 1.66 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.47 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.42 , 1.47 \ /* + */ 1.42 , 1.47 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.41 , 1.46 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax5" { + matrix input `temp' = ( /* + */ 23.81 , . \ /* + */ 12.38 , 14.19 \ /* + */ 8.66 , 10.00 \ /* + */ 6.81 , 7.88 \ /* + */ 5.71 , 6.60 \ /* + */ 4.98 , 5.74 \ /* + */ 4.45 , 5.13 \ /* + */ 4.06 , 4.66 \ /* + */ 3.76 , 4.30 \ /* + */ 3.51 , 4.01 \ /* + */ 3.31 , 3.77 \ /* + */ 3.15 , 3.57 \ /* + */ 3.00 , 3.41 \ /* + */ 2.88 , 3.26 \ /* + */ 2.78 , 3.13 \ /* + */ 2.69 , 3.02 \ /* + */ 2.61 , 2.92 \ /* + */ 2.53 , 2.84 \ /* + */ 2.47 , 2.76 \ /* + */ 2.41 , 2.69 \ /* + */ 2.36 , 2.62 \ /* + */ 2.31 , 2.56 \ /* + */ 2.27 , 2.51 \ /* + */ 2.23 , 2.46 \ /* + */ 2.19 , 2.42 \ /* + */ 2.15 , 2.37 \ /* + */ 2.12 , 2.33 \ /* + */ 2.09 , 2.30 \ /* + */ 2.07 , 2.26 \ /* + */ 2.04 , 2.23 \ /* + */ 2.02 , 2.20 \ /* + */ 1.99 , 2.17 \ /* + */ 1.97 , 2.14 \ /* + */ 1.95 , 2.12 \ /* + */ 1.93 , 2.10 \ /* + */ 1.91 , 2.07 \ /* + */ 1.90 , 2.05 \ /* + */ 1.88 , 2.03 \ /* + */ 1.87 , 2.01 \ /* + */ 1.85 , 1.99 \ /* + */ 1.84 , 1.98 \ /* + */ 1.82 , 1.96 \ /* + */ 1.81 , 1.94 \ /* + */ 1.80 , 1.93 \ /* + */ 1.79 , 1.91 \ /* + */ 1.78 , 1.90 \ /* + */ 1.76 , 1.88 \ /* + */ 1.75 , 1.87 \ /* + */ 1.74 , 1.86 \ /* + */ 1.73 , 1.85 \ /* + */ 1.73 , 1.83 \ /* + */ 1.72 , 1.82 \ /* + */ 1.71 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.79 \ /* + */ 1.68 , 1.78 \ /* + */ 1.68 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.65 , 1.74 \ /* + */ 1.65 , 1.74 \ /* + */ 1.64 , 1.73 \ /* + */ 1.63 , 1.72 \ /* + */ 1.63 , 1.71 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.70 \ /* + */ 1.61 , 1.69 \ /* + */ 1.60 , 1.68 \ /* + */ 1.60 , 1.68 \ /* + */ 1.59 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.64 \ /* + */ 1.56 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.62 \ /* + */ 1.54 , 1.61 \ /* + */ 1.54 , 1.61 \ /* + */ 1.53 , 1.60 \ /* + */ 1.53 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.50 , 1.57 \ /* + */ 1.50 , 1.57 \ /* + */ 1.50 , 1.56 \ /* + */ 1.49 , 1.56 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.48 , 1.55 \ /* + */ 1.48 , 1.54 \ /* + */ 1.47 , 1.54 \ /* + */ 1.47 , 1.54 \ /* + */ 1.47 , 1.53 \ /* + */ 1.46 , 1.53 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax10" { + matrix input `temp' = ( /* + */ 19.40 , . \ /* + */ 10.14 , 11.92 \ /* + */ 7.18 , 8.39 \ /* + */ 5.72 , 6.64 \ /* + */ 4.85 , 5.60 \ /* + */ 4.27 , 4.90 \ /* + */ 3.86 , 4.40 \ /* + */ 3.55 , 4.03 \ /* + */ 3.31 , 3.73 \ /* + */ 3.12 , 3.50 \ /* + */ 2.96 , 3.31 \ /* + */ 2.83 , 3.15 \ /* + */ 2.71 , 3.01 \ /* + */ 2.62 , 2.89 \ /* + */ 2.53 , 2.79 \ /* + */ 2.46 , 2.70 \ /* + */ 2.39 , 2.62 \ /* + */ 2.33 , 2.55 \ /* + */ 2.28 , 2.49 \ /* + */ 2.23 , 2.43 \ /* + */ 2.19 , 2.38 \ /* + */ 2.15 , 2.33 \ /* + */ 2.11 , 2.29 \ /* + */ 2.08 , 2.25 \ /* + */ 2.05 , 2.21 \ /* + */ 2.02 , 2.18 \ /* + */ 1.99 , 2.14 \ /* + */ 1.97 , 2.11 \ /* + */ 1.94 , 2.08 \ /* + */ 1.92 , 2.06 \ /* + */ 1.90 , 2.03 \ /* + */ 1.88 , 2.01 \ /* + */ 1.86 , 1.99 \ /* + */ 1.85 , 1.97 \ /* + */ 1.83 , 1.95 \ /* + */ 1.81 , 1.93 \ /* + */ 1.80 , 1.91 \ /* + */ 1.79 , 1.89 \ /* + */ 1.77 , 1.88 \ /* + */ 1.76 , 1.86 \ /* + */ 1.75 , 1.85 \ /* + */ 1.74 , 1.83 \ /* + */ 1.72 , 1.82 \ /* + */ 1.71 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.78 \ /* + */ 1.68 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.66 , 1.74 \ /* + */ 1.65 , 1.73 \ /* + */ 1.64 , 1.72 \ /* + */ 1.63 , 1.71 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.69 \ /* + */ 1.60 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.53 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.44 , 1.50 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.42 , 1.48 \ /* + */ 1.42 , 1.47 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax20" { + matrix input `temp' = ( /* + */ 15.39 , . \ /* + */ 8.16 , 9.41 \ /* + */ 5.87 , 6.79 \ /* + */ 4.75 , 5.47 \ /* + */ 4.08 , 4.66 \ /* + */ 3.64 , 4.13 \ /* + */ 3.32 , 3.74 \ /* + */ 3.08 , 3.45 \ /* + */ 2.89 , 3.22 \ /* + */ 2.74 , 3.03 \ /* + */ 2.62 , 2.88 \ /* + */ 2.51 , 2.76 \ /* + */ 2.42 , 2.65 \ /* + */ 2.35 , 2.56 \ /* + */ 2.28 , 2.48 \ /* + */ 2.22 , 2.40 \ /* + */ 2.17 , 2.34 \ /* + */ 2.12 , 2.28 \ /* + */ 2.08 , 2.23 \ /* + */ 2.04 , 2.19 \ /* + */ 2.01 , 2.15 \ /* + */ 1.98 , 2.11 \ /* + */ 1.95 , 2.07 \ /* + */ 1.92 , 2.04 \ /* + */ 1.89 , 2.01 \ /* + */ 1.87 , 1.98 \ /* + */ 1.85 , 1.96 \ /* + */ 1.83 , 1.93 \ /* + */ 1.81 , 1.91 \ /* + */ 1.79 , 1.89 \ /* + */ 1.77 , 1.87 \ /* + */ 1.76 , 1.85 \ /* + */ 1.74 , 1.83 \ /* + */ 1.73 , 1.82 \ /* + */ 1.72 , 1.80 \ /* + */ 1.70 , 1.79 \ /* + */ 1.69 , 1.77 \ /* + */ 1.68 , 1.76 \ /* + */ 1.67 , 1.74 \ /* + */ 1.66 , 1.73 \ /* + */ 1.65 , 1.72 \ /* + */ 1.64 , 1.71 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.58 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.62 \ /* + */ 1.56 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.54 , 1.59 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.52 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.47 , 1.52 \ /* + */ 1.47 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.48 \ /* + */ 1.44 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.41 \ /* + */ 1.37 , 1.41 \ /* + */ 1.37 , 1.41 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax30" { + matrix input `temp' = ( /* + */ 12.76 , . \ /* + */ 6.97 , 8.01 \ /* + */ 5.11 , 5.88 \ /* + */ 4.19 , 4.78 \ /* + */ 3.64 , 4.12 \ /* + */ 3.27 , 3.67 \ /* + */ 3.00 , 3.35 \ /* + */ 2.80 , 3.10 \ /* + */ 2.64 , 2.91 \ /* + */ 2.52 , 2.76 \ /* + */ 2.41 , 2.63 \ /* + */ 2.33 , 2.52 \ /* + */ 2.25 , 2.43 \ /* + */ 2.19 , 2.35 \ /* + */ 2.13 , 2.29 \ /* + */ 2.08 , 2.22 \ /* + */ 2.04 , 2.17 \ /* + */ 2.00 , 2.12 \ /* + */ 1.96 , 2.08 \ /* + */ 1.93 , 2.04 \ /* + */ 1.90 , 2.01 \ /* + */ 1.87 , 1.97 \ /* + */ 1.84 , 1.94 \ /* + */ 1.82 , 1.92 \ /* + */ 1.80 , 1.89 \ /* + */ 1.78 , 1.87 \ /* + */ 1.76 , 1.84 \ /* + */ 1.74 , 1.82 \ /* + */ 1.73 , 1.80 \ /* + */ 1.71 , 1.79 \ /* + */ 1.70 , 1.77 \ /* + */ 1.68 , 1.75 \ /* + */ 1.67 , 1.74 \ /* + */ 1.66 , 1.72 \ /* + */ 1.64 , 1.71 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.68 \ /* + */ 1.61 , 1.67 \ /* + */ 1.60 , 1.66 \ /* + */ 1.59 , 1.65 \ /* + */ 1.58 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.57 , 1.62 \ /* + */ 1.56 , 1.61 \ /* + */ 1.55 , 1.60 \ /* + */ 1.54 , 1.59 \ /* + */ 1.54 , 1.59 \ /* + */ 1.53 , 1.58 \ /* + */ 1.52 , 1.57 \ /* + */ 1.52 , 1.56 \ /* + */ 1.51 , 1.56 \ /* + */ 1.50 , 1.55 \ /* + */ 1.50 , 1.54 \ /* + */ 1.49 , 1.54 \ /* + */ 1.49 , 1.53 \ /* + */ 1.48 , 1.53 \ /* + */ 1.48 , 1.52 \ /* + */ 1.47 , 1.51 \ /* + */ 1.47 , 1.51 \ /* + */ 1.46 , 1.50 \ /* + */ 1.46 , 1.50 \ /* + */ 1.45 , 1.49 \ /* + */ 1.45 , 1.49 \ /* + */ 1.44 , 1.48 \ /* + */ 1.44 , 1.48 \ /* + */ 1.44 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.42 \ /* + */ 1.39 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.41 \ /* + */ 1.38 , 1.41 \ /* + */ 1.37 , 1.41 \ /* + */ 1.37 , 1.40 \ /* + */ 1.37 , 1.40 \ /* + */ 1.37 , 1.40 \ /* + */ 1.36 , 1.40 \ /* + */ 1.36 , 1.39 \ /* + */ 1.36 , 1.39 \ /* + */ 1.36 , 1.39 \ /* + */ 1.36 , 1.38 \ /* + */ 1.35 , 1.38 \ /* + */ 1.35 , 1.38 \ /* + */ 1.35 , 1.38 \ /* + */ 1.35 , 1.37 \ /* + */ 1.34 , 1.37 \ /* + */ 1.34 , 1.37 \ /* + */ 1.34 , 1.37 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize10" { + matrix input `temp' = ( /* + */ 16.38 , . \ /* + */ 8.68 , 7.03 \ /* + */ 6.46 , 5.44 \ /* + */ 5.44 , 4.72 \ /* + */ 4.84 , 4.32 \ /* + */ 4.45 , 4.06 \ /* + */ 4.18 , 3.90 \ /* + */ 3.97 , 3.78 \ /* + */ 3.81 , 3.70 \ /* + */ 3.68 , 3.64 \ /* + */ 3.58 , 3.60 \ /* + */ 3.50 , 3.58 \ /* + */ 3.42 , 3.56 \ /* + */ 3.36 , 3.55 \ /* + */ 3.31 , 3.54 \ /* + */ 3.27 , 3.55 \ /* + */ 3.24 , 3.55 \ /* + */ 3.20 , 3.56 \ /* + */ 3.18 , 3.57 \ /* + */ 3.21 , 3.58 \ /* + */ 3.39 , 3.59 \ /* + */ 3.57 , 3.60 \ /* + */ 3.68 , 3.62 \ /* + */ 3.75 , 3.64 \ /* + */ 3.79 , 3.65 \ /* + */ 3.82 , 3.67 \ /* + */ 3.85 , 3.74 \ /* + */ 3.86 , 3.87 \ /* + */ 3.87 , 4.02 \ /* + */ 3.88 , 4.12 \ /* + */ 3.89 , 4.19 \ /* + */ 3.89 , 4.24 \ /* + */ 3.90 , 4.27 \ /* + */ 3.90 , 4.31 \ /* + */ 3.90 , 4.33 \ /* + */ 3.90 , 4.36 \ /* + */ 3.90 , 4.38 \ /* + */ 3.90 , 4.39 \ /* + */ 3.90 , 4.41 \ /* + */ 3.90 , 4.43 \ /* + */ 3.90 , 4.44 \ /* + */ 3.90 , 4.45 \ /* + */ 3.90 , 4.47 \ /* + */ 3.90 , 4.48 \ /* + */ 3.90 , 4.49 \ /* + */ 3.90 , 4.50 \ /* + */ 3.90 , 4.51 \ /* + */ 3.90 , 4.52 \ /* + */ 3.90 , 4.53 \ /* + */ 3.90 , 4.54 \ /* + */ 3.90 , 4.55 \ /* + */ 3.90 , 4.56 \ /* + */ 3.90 , 4.56 \ /* + */ 3.90 , 4.57 \ /* + */ 3.90 , 4.58 \ /* + */ 3.90 , 4.59 \ /* + */ 3.90 , 4.59 \ /* + */ 3.90 , 4.60 \ /* + */ 3.90 , 4.61 \ /* + */ 3.90 , 4.61 \ /* + */ 3.90 , 4.62 \ /* + */ 3.90 , 4.62 \ /* + */ 3.90 , 4.63 \ /* + */ 3.90 , 4.63 \ /* + */ 3.89 , 4.64 \ /* + */ 3.89 , 4.64 \ /* + */ 3.89 , 4.64 \ /* + */ 3.89 , 4.65 \ /* + */ 3.89 , 4.65 \ /* + */ 3.89 , 4.65 \ /* + */ 3.89 , 4.66 \ /* + */ 3.89 , 4.66 \ /* + */ 3.89 , 4.66 \ /* + */ 3.89 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.86 , 4.65 \ /* + */ 3.86 , 4.65 \ /* + */ 3.86 , 4.65 \ /* + */ 3.86 , 4.64 \ /* + */ 3.85 , 4.64 \ /* + */ 3.85 , 4.64 \ /* + */ 3.85 , 4.63 \ /* + */ 3.85 , 4.63 \ /* + */ 3.84 , 4.62 \ /* + */ 3.84 , 4.62 \ /* + */ 3.84 , 4.61 \ /* + */ 3.84 , 4.60 \ /* + */ 3.83 , 4.60 \ /* + */ 3.83 , 4.59 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize15" { + matrix input `temp' = ( /* + */ 8.96 , . \ /* + */ 5.33 , 4.58 \ /* + */ 4.36 , 3.81 \ /* + */ 3.87 , 3.39 \ /* + */ 3.56 , 3.13 \ /* + */ 3.34 , 2.95 \ /* + */ 3.18 , 2.83 \ /* + */ 3.04 , 2.73 \ /* + */ 2.93 , 2.66 \ /* + */ 2.84 , 2.60 \ /* + */ 2.76 , 2.55 \ /* + */ 2.69 , 2.52 \ /* + */ 2.63 , 2.48 \ /* + */ 2.57 , 2.46 \ /* + */ 2.52 , 2.44 \ /* + */ 2.48 , 2.42 \ /* + */ 2.44 , 2.41 \ /* + */ 2.41 , 2.40 \ /* + */ 2.37 , 2.39 \ /* + */ 2.34 , 2.38 \ /* + */ 2.32 , 2.38 \ /* + */ 2.29 , 2.37 \ /* + */ 2.27 , 2.37 \ /* + */ 2.25 , 2.37 \ /* + */ 2.24 , 2.37 \ /* + */ 2.22 , 2.38 \ /* + */ 2.21 , 2.38 \ /* + */ 2.20 , 2.38 \ /* + */ 2.19 , 2.39 \ /* + */ 2.18 , 2.39 \ /* + */ 2.19 , 2.40 \ /* + */ 2.22 , 2.41 \ /* + */ 2.33 , 2.42 \ /* + */ 2.40 , 2.42 \ /* + */ 2.45 , 2.43 \ /* + */ 2.48 , 2.44 \ /* + */ 2.50 , 2.45 \ /* + */ 2.52 , 2.54 \ /* + */ 2.53 , 2.55 \ /* + */ 2.54 , 2.66 \ /* + */ 2.55 , 2.73 \ /* + */ 2.56 , 2.78 \ /* + */ 2.57 , 2.82 \ /* + */ 2.57 , 2.85 \ /* + */ 2.58 , 2.87 \ /* + */ 2.58 , 2.89 \ /* + */ 2.58 , 2.91 \ /* + */ 2.59 , 2.92 \ /* + */ 2.59 , 2.93 \ /* + */ 2.59 , 2.94 \ /* + */ 2.59 , 2.95 \ /* + */ 2.59 , 2.96 \ /* + */ 2.60 , 2.97 \ /* + */ 2.60 , 2.98 \ /* + */ 2.60 , 2.98 \ /* + */ 2.60 , 2.99 \ /* + */ 2.60 , 2.99 \ /* + */ 2.60 , 3.00 \ /* + */ 2.60 , 3.00 \ /* + */ 2.60 , 3.01 \ /* + */ 2.60 , 3.01 \ /* + */ 2.60 , 3.02 \ /* + */ 2.61 , 3.02 \ /* + */ 2.61 , 3.02 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.04 \ /* + */ 2.61 , 3.04 \ /* + */ 2.61 , 3.04 \ /* + */ 2.60 , 3.04 \ /* + */ 2.60 , 3.04 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.03 \ /* + */ 2.57 , 3.03 \ /* + */ 2.57 , 3.03 \ /* + */ 2.57 , 3.03 \ /* + */ 2.57 , 3.02 \ /* + */ 2.56 , 3.02 \ /* + */ 2.56 , 3.02 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize20" { + matrix input `temp' = ( /* + */ 6.66 , . \ /* + */ 4.42 , 3.95 \ /* + */ 3.69 , 3.32 \ /* + */ 3.30 , 2.99 \ /* + */ 3.05 , 2.78 \ /* + */ 2.87 , 2.63 \ /* + */ 2.73 , 2.52 \ /* + */ 2.63 , 2.43 \ /* + */ 2.54 , 2.36 \ /* + */ 2.46 , 2.30 \ /* + */ 2.40 , 2.25 \ /* + */ 2.34 , 2.21 \ /* + */ 2.29 , 2.17 \ /* + */ 2.25 , 2.14 \ /* + */ 2.21 , 2.11 \ /* + */ 2.18 , 2.09 \ /* + */ 2.14 , 2.07 \ /* + */ 2.11 , 2.05 \ /* + */ 2.09 , 2.03 \ /* + */ 2.06 , 2.02 \ /* + */ 2.04 , 2.01 \ /* + */ 2.02 , 1.99 \ /* + */ 2.00 , 1.98 \ /* + */ 1.98 , 1.98 \ /* + */ 1.96 , 1.97 \ /* + */ 1.95 , 1.96 \ /* + */ 1.93 , 1.96 \ /* + */ 1.92 , 1.95 \ /* + */ 1.90 , 1.95 \ /* + */ 1.89 , 1.95 \ /* + */ 1.88 , 1.94 \ /* + */ 1.87 , 1.94 \ /* + */ 1.86 , 1.94 \ /* + */ 1.85 , 1.94 \ /* + */ 1.84 , 1.94 \ /* + */ 1.83 , 1.94 \ /* + */ 1.82 , 1.94 \ /* + */ 1.81 , 1.95 \ /* + */ 1.81 , 1.95 \ /* + */ 1.80 , 1.95 \ /* + */ 1.79 , 1.95 \ /* + */ 1.79 , 1.96 \ /* + */ 1.78 , 1.96 \ /* + */ 1.78 , 1.97 \ /* + */ 1.80 , 1.97 \ /* + */ 1.87 , 1.98 \ /* + */ 1.92 , 1.98 \ /* + */ 1.95 , 1.99 \ /* + */ 1.97 , 2.00 \ /* + */ 1.99 , 2.00 \ /* + */ 2.00 , 2.01 \ /* + */ 2.01 , 2.09 \ /* + */ 2.02 , 2.11 \ /* + */ 2.03 , 2.18 \ /* + */ 2.04 , 2.23 \ /* + */ 2.04 , 2.27 \ /* + */ 2.05 , 2.29 \ /* + */ 2.05 , 2.31 \ /* + */ 2.06 , 2.33 \ /* + */ 2.06 , 2.34 \ /* + */ 2.07 , 2.35 \ /* + */ 2.07 , 2.36 \ /* + */ 2.07 , 2.37 \ /* + */ 2.08 , 2.38 \ /* + */ 2.08 , 2.39 \ /* + */ 2.08 , 2.39 \ /* + */ 2.08 , 2.40 \ /* + */ 2.09 , 2.40 \ /* + */ 2.09 , 2.41 \ /* + */ 2.09 , 2.41 \ /* + */ 2.09 , 2.41 \ /* + */ 2.09 , 2.42 \ /* + */ 2.09 , 2.42 \ /* + */ 2.09 , 2.42 \ /* + */ 2.09 , 2.43 \ /* + */ 2.10 , 2.43 \ /* + */ 2.10 , 2.43 \ /* + */ 2.10 , 2.43 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.09 , 2.44 \ /* + */ 2.09 , 2.44 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.07 , 2.44 \ /* + */ 2.07 , 2.44 \ /* + */ 2.07 , 2.44 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize25" { + matrix input `temp' = ( /* + */ 5.53 , . \ /* + */ 3.92 , 3.63 \ /* + */ 3.32 , 3.09 \ /* + */ 2.98 , 2.79 \ /* + */ 2.77 , 2.60 \ /* + */ 2.61 , 2.46 \ /* + */ 2.49 , 2.35 \ /* + */ 2.39 , 2.27 \ /* + */ 2.32 , 2.20 \ /* + */ 2.25 , 2.14 \ /* + */ 2.19 , 2.09 \ /* + */ 2.14 , 2.05 \ /* + */ 2.10 , 2.02 \ /* + */ 2.06 , 1.99 \ /* + */ 2.03 , 1.96 \ /* + */ 2.00 , 1.93 \ /* + */ 1.97 , 1.91 \ /* + */ 1.94 , 1.89 \ /* + */ 1.92 , 1.87 \ /* + */ 1.90 , 1.86 \ /* + */ 1.88 , 1.84 \ /* + */ 1.86 , 1.83 \ /* + */ 1.84 , 1.81 \ /* + */ 1.83 , 1.80 \ /* + */ 1.81 , 1.79 \ /* + */ 1.80 , 1.78 \ /* + */ 1.78 , 1.77 \ /* + */ 1.77 , 1.77 \ /* + */ 1.76 , 1.76 \ /* + */ 1.75 , 1.75 \ /* + */ 1.74 , 1.75 \ /* + */ 1.73 , 1.74 \ /* + */ 1.72 , 1.73 \ /* + */ 1.71 , 1.73 \ /* + */ 1.70 , 1.73 \ /* + */ 1.69 , 1.72 \ /* + */ 1.68 , 1.72 \ /* + */ 1.67 , 1.71 \ /* + */ 1.67 , 1.71 \ /* + */ 1.66 , 1.71 \ /* + */ 1.65 , 1.71 \ /* + */ 1.65 , 1.71 \ /* + */ 1.64 , 1.70 \ /* + */ 1.63 , 1.70 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.60 , 1.70 \ /* + */ 1.60 , 1.70 \ /* + */ 1.59 , 1.70 \ /* + */ 1.59 , 1.70 \ /* + */ 1.59 , 1.70 \ /* + */ 1.58 , 1.70 \ /* + */ 1.58 , 1.71 \ /* + */ 1.58 , 1.71 \ /* + */ 1.57 , 1.71 \ /* + */ 1.59 , 1.71 \ /* + */ 1.60 , 1.71 \ /* + */ 1.63 , 1.72 \ /* + */ 1.65 , 1.72 \ /* + */ 1.67 , 1.72 \ /* + */ 1.69 , 1.72 \ /* + */ 1.70 , 1.76 \ /* + */ 1.71 , 1.81 \ /* + */ 1.72 , 1.87 \ /* + */ 1.73 , 1.91 \ /* + */ 1.74 , 1.94 \ /* + */ 1.74 , 1.96 \ /* + */ 1.75 , 1.98 \ /* + */ 1.75 , 1.99 \ /* + */ 1.76 , 2.01 \ /* + */ 1.76 , 2.02 \ /* + */ 1.77 , 2.03 \ /* + */ 1.77 , 2.04 \ /* + */ 1.78 , 2.04 \ /* + */ 1.78 , 2.05 \ /* + */ 1.78 , 2.06 \ /* + */ 1.79 , 2.06 \ /* + */ 1.79 , 2.07 \ /* + */ 1.79 , 2.07 \ /* + */ 1.79 , 2.08 \ /* + */ 1.80 , 2.08 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + return scalar cv=`cv' +end + +exit + +********************************** VERSION COMMENTS ********************************** +* 1.0.2: add logic for reg3. Sargan test +* 1.0.3: add prunelist to ensure that count of excluded exogeneous is correct +* 1.0.4: revise option to exog(), allow included exog to be specified as well +* 1.0.5: switch from reg3 to regress, many options and output changes +* 1.0.6: fixed treatment of nocons in Sargan and C-stat, and corrected problems +* relating to use of nocons combined with a constant as an IV +* 1.0.7: first option reports F-test of excluded exogenous; prunelist bug fix +* 1.0.8: dropped prunelist and switched to housekeeping of variable lists +* 1.0.9: added collinearity checks; C-stat calculated with recursive call; +* added ffirst option to report only F-test of excluded exogenous +* from 1st stage regressions +* 1.0.10: 1st stage regressions also report partial R2 of excluded exogenous +* 1.0.11: complete rewrite of collinearity approach - no longer uses calls to +* _rmcoll, does not track specific variables dropped; prunelist removed +* 1.0.12: reorganised display code and saved results to enable -replay()- +* 1.0.13: -robust- and -cluster- now imply -small- +* 1.0.14: fixed hascons bug; removed ivreg predict fn (it didn't work); allowed +* robust and cluster with z stats and correct dofs +* 1.0.15: implemented robust Sargan stat; changed to only F-stat, removed chi-sq; +* removed exog option (only orthog works) +* 1.0.16: added clusterised Sargan stat; robust Sargan handles collinearities; +* predict now works with standard SE options plus resids; fixed orthog() +* so it accepts time series operators etc. +* 1.0.17: fixed handling of weights. fw, aw, pw & iw all accepted. +* 1.0.18: fixed bug in robust Sargan code relating to time series variables. +* 1.0.19: fixed bugs in reporting ranks of X'X and Z'Z +* fixed bug in reporting presence of constant +* 1.0.20: added GMM option and replaced robust Sargan with (equivalent) J; +* added saved statistics of 1st stage regressions +* 1.0.21: added Cragg HOLS estimator, including allowing empty endog list; +* -regress- syntax now not allowed; revised code searching for "_cons" +* 1.0.22: modified cluster output message; fixed bug in replay for Sargan/Hansen stat; +* exactly identified Sargan/Hansen now exactly zero and p-value not saved as e(); +* cluster multiplier changed to 1 (from buggy multiplier), in keeping with +* eg Wooldridge 2002 p. 193. +* 1.0.23: fixed orthog option to prevent abort when restricted equation is underid. +* 1.0.24: fixed bug if 1st stage regressions yielded missing values for saving in e(). +* 1.0.25: Added Shea version of partial R2 +* 1.0.26: Replaced Shea algorithm with Godfrey algorithm +* 1.0.27: Main call to regress is OLS form if OLS or HOLS is specified; error variance +* in Sargan and C statistics use small-sample adjustment if -small- option is +* specified; dfn of S matrix now correctly divided by sample size +* 1.0.28: HAC covariance estimation implemented +* Symmetrize all matrices before calling syminv +* Added hack to catch F stats that ought to be missing but actually have a +* huge-but-not-missing value +* Fixed dof of F-stat - was using rank of ZZ, should have used rank of XX (couldn't use df_r +* because it isn't always saved. This is because saving df_r triggers small stats +* (t and F) even when -post- is called without dof() option, hence df_r saved only +* with -small- option and hence a separate saved macro Fdf2 is needed. +* Added rankS to saved macros +* Fixed trap for "no regressors specified" +* Added trap to catch gmm option with no excluded instruments +* Allow OLS syntax (no endog or excluded IVs specified) +* Fixed error messages and traps for rank-deficient robust cov matrix; includes +* singleton dummy possibility +* Capture error if posting estimated VCV that isn't pos def and report slightly +* more informative error message +* Checks 3 variable lists (endo, inexog, exexog) separately for collinearities +* Added AC (autocorrelation-consistent but conditionally-homoskedastic) option +* Sargan no longer has small-sample correction if -small- option +* robust, cluster, AC, HAC all passed on to first-stage F-stat +* bw must be < T +* 1.0.29 -orthog- also displays Hansen-Sargan of unrestricted equation +* Fixed collinearity check to include nocons as well as hascons +* Fixed small bug in Godfrey-Shea code - macros were global rather than local +* Fixed larger bug in Godfrey-Shea code - was using mixture of sigma-squares from IV and OLS +* with and without small-sample corrections +* Added liml and kclass +* 1.0.30 Changed order of insts macro to match saved matrices S and W +* 2.0.00 Collinearities no longer -qui- +* List of instruments tested in -orthog- option prettified +* 2.0.01 Fixed handling of nocons with no included exogenous, including LIML code +* 2.0.02 Allow C-test if unrestricted equation is just-identified. Implemented by +* saving Hansen-Sargan dof as = 0 in e() if just-identified. +* 2.0.03 Added score() option per latest revision to official ivreg +* 2.0.04 Changed score() option to pscore() per new official ivreg +* 2.0.05 Fixed est hold bug in first-stage regressions +* Fixed F-stat finite sample adjustment with cluster option to match official Stata +* Fixed F-stat so that it works with hascons (collinearity with constant is removed) +* Fixed bug in F-stat code - wasn't handling failed posting of vcv +* No longer allows/ignores nonsense options +* 2.0.06 Modified lsStop to sync with official ivreg 5.1.3 +* 2.0.07a Working version of CUE option +* Added sortpreserve, ivar and tvar options +* Fixed smalls bug in calculation of T for AC/HAC - wasn't using the last ob +* in QS kernel, and didn't take account of possible dropped observations +* 2.0.07b Fixed macro bug that truncated long varlists +* 2.0.07c Added dof option. +* Changed display of RMSE so that more digits are displayed (was %8.1g) +* Fixed small bug where cstat was local macro and should have been scalar +* Fixed bug where C stat failed with cluster. NB: wmatrix option and cluster are not compatible! +* 2.0.7d Fixed bug in dof option +* 2.1.0 Added first-stage identification, weak instruments, and redundancy stats +* 2.1.01 Tidying up cue option checks, reporting of cue in output header, etc. +* 2.1.02 Used Poskitt-Skeels (2002) result that C-D eval = cceval / (1-cceval) +* 2.1.03 Added saved lists of separate included and excluded exogenous IVs +* 2.1.04 Added Anderson-Rubin test of signif of endog regressors +* 2.1.05 Fix minor bugs relating to cluster and new first-stage stats +* 2.1.06 Fix bug in cue: capture estimates hold without corresponding capture on estimates unhold +* 2.1.07 Minor fix to ereturn local wexp, promote to version 8.2 +* 2.1.08 Added dofminus option, removed dof option. Added A-R test p-values to e(). +* Minor bug fix to A-R chi2 test - was N chi2, should have been N-L chi2. +* Changed output to remove potentially misleading refs to N-L etc. +* Bug fix to rhs count - sometimes regressors could have exact zero coeffs +* Bug fix related to cluster - if user omitted -robust-, orthog would use Sargan and not J +* Changed output of Shea R2 to make clearer that F and p-values do not refer to it +* Improved handling of collinearites to check across inexog, exexog and endo lists +* Total weight statement moved to follow summ command +* Added traps to catch errors if no room to save temporary estimations with _est hold +* Added -savefirst- option. Removed -hascons-, now synonymous with -nocons-. +* 2.1.09 Fixes to dof option with cluster so it no longer mimics incorrect areg behavior +* Local ivreg2_cmd to allow testing under name ivreg2 +* If wmatrix supplied, used (previously not used if non-robust sargan stat generated) +* Allowed OLS using (=) syntax (empty endo and exexog lists) +* Clarified error message when S matrix is not of full rank +* cdchi2p, ardf, ardf_r added to saved macros +* first and ffirst replay() options; DispFirst and DispFFirst separately codes 1st stage output +* Added savefprefix, macro with saved first-stage equation names. +* Added version option. +* Added check for duplicate variables to collinearity checks +* Rewrote/simplified Godfrey-Shea partial r2 code +* 2.1.10 Added NOOUTput option +* Fixed rf bug so that first does not trigger unnecessary saved rf +* Fixed cue bug - was not starting with robust 2-step gmm if robust/cluster +* 2.1.11 Dropped incorrect/misleading dofminus adjustments in first-stage output summary +* 2.1.12 Collinearity check now checks across inexog/exexog/endog simultaneously +* 2.1.13 Added check to catch failed first-stage regressions +* Fixed misleading failed C-stat message +* 2.1.14 Fixed mishandling of missing values in AC (non-robust) block +* 2.1.15 Fixed bug in RF - was ignoring weights +* Added -endog- option +* Save W matrix for all cases; ensured copy is posted with wmatrix option so original isn't zapped +* Fixed cue bug - with robust, was entering IV block and overwriting correct VCV +* 2.1.16 Added -fwl- option +* Saved S is now robust cov matrix of orthog conditions if robust, whereas W is possibly non-robust +* weighting matrix used by estmator. inv(S)=W if estimator is efficient GMM. +* Removed pscore option (dropped by official ivreg). +* Fixed bug where -post- would fail because of missing values in vcv +* Remove hascons as synonym for nocons +* OLS now outputs 2nd footer with variable lists +* 2.1.17 Reorganization of code +* Added ll() macro +* Fixed N bug where weights meant a non-integer ob count that was rounded down +* Fixed -fwl- option so it correctly handles weights (must include when partialling-out) +* smatrix option takes over from wmatrix option. Consistent treatment of both. +* Saved smatrix and wmatrix now differ in case of inefficient GMM. +* Added title() and subtitle() options. +* b0 option returns a value for the Sargan/J stat even if exactly id'd. +* (Useful for S-stat = value of GMM objective function.) +* HAC and AC now allowed with LIML and k-class. +* Collinearity improvements: bug fixed because collinearity was mistakenly checked across +* inexog/exexog/endog simultaneously; endog predicted exactly by IVs => reclassified as inexog; +* _rmcollright enforces inexog>endo>exexog priority for collinearities, if Stata 9.2 or later. +* K-class, LIML now report Sargan and J. C-stat based on Sargan/J. LIML reports AR if homosked. +* nb: can always easily get a C-stat for LIML based on diff of two AR stats. +* Always save Sargan-Hansen as e(j); also save as e(sargan) if homoskedastic. +* Added Stock-Watson robust SEs options sw() +* 2.1.18 Added Cragg-Donald-Stock-Yogo weak ID statistic critical values to main output +* Save exexog_ct, inexog_ct and endog_ct as macros +* Stock-Watson robust SEs now assume ivar is group variable +* Option -sw- is standard SW. Option -swpsd- is PSD version a la page 6 point 10. +* Added -noid- option. Suppresses all first-stage and identification statistics. +* Internal calls to ivreg2 use noid option. +* Added hyperlinks to ivreg2.hlp and helpfile argument to display routines to enable this. +* 2.1.19 Added matrix rearrangement and checks for smatrix and wmatrix options +* Recursive calls to cstat simplified - no matrix rearrangement or separate robust/nonrobust needed +* Reintroduced weak ID stats to ffirst output +* Added robust ID stats to ffirst output for case of single endogenous regressor +* Fixed obscure bug in reporting 1st stage partial r2 - would report zero if no included exogenous vars +* Removed "HOLS" in main output (misleading if, e.g., estimation is AC but not HAC) +* Removed "ML" in main output if no endogenous regressors - now all ML is labelled LIML +* model=gmm is now model=gmm2s; wmatrix estimation is model=gmm +* wmatrix relates to gmm estimator; smatrix relates to gmm var-cov matrix; b0 behavior equiv to wmatrix +* b0 option implies nooutput and noid options +* Added nocollin option to skip collinearity checks +* Fixed minor display bug in ffirst output for endog vars with varnames > 12 characters +* Fixed bug in saved rf and first-stage results for vars with long varnames; uses permname +* Fixed bug in model df - had counted RHS, now calculates rank(V) since latter may be rank-deficient +* Rank of V now saved as macro rankV +* fwl() now allows partialling-out of just constant with _cons +* Added Stock-Wright S statistic (but adds overhead - calls preserve) +* Properties now include svyj. +* Noted only: fwl bug doesn't allow time-series operators. +* 2.1.20 Fixed Stock-Wright S stat bug - didn't allow time-series operators +* 2.1.21 Fixed Stock-Wright S stat to allow for no exog regressors cases +* 2.1.22 Misc fixes. Fixed bug in AC with aweights; was weighting zi'zi but not ei'ei. +* Fixed bug in AC; need to clear variable vt1 at start of loop +* If iweights, Nprec (#obs with precision) rounded to nearest integer to mimic official Stata treatment diff --git a/data/ado/i/ivreg28.hlp b/data/ado/i/ivreg28.hlp new file mode 100644 index 0000000..be2eaf6 --- /dev/null +++ b/data/ado/i/ivreg28.hlp @@ -0,0 +1,1232 @@ +{smcl} +{* 3feb2007}{...} +{hline} +help for {hi:ivreg28} +{hline} + +{title:Extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression} + +{p 4}Full syntax + +{p 8 14}{cmd:ivreg28} {it:depvar} [{it:varlist1}] +{cmd:(}{it:varlist2}{cmd:=}{it:varlist_iv}{cmd:)} [{it:weight}] +[{cmd:if} {it:exp}] [{cmd:in} {it:range}] +{bind:[{cmd:,} {cmd:gmm}} +{cmd:bw(}{it:#}{cmd:)} +{cmd:kernel(}{it:string}{cmd:)} +{cmd:liml} +{cmd:fuller(}{it:#}{cmd:)} +{cmd:kclass(}{it:#}{cmd:)} +{cmd:coviv} +{cmd:cue} +{cmd:cueinit}{cmd:(}{it:matrix}{cmd:)} +{cmdab:cueopt:ions}{cmd:(}{it:string}{cmd:)} +{cmdab:r:obust} +{cmdab:cl:uster}{cmd:(}{it:varname}{cmd:)} +{cmd:orthog(}{it:varlist_ex}{cmd:)} +{cmd:endog(}{it:varlist_en}{cmd:)} +{cmdab:red:undant(}{it:varlist_ex}{cmd:)} +{cmd:fwl(}{it:varlist}{cmd:)} +{cmdab:sm:all} +{cmdab:noc:onstant} {cmdab:h}ascons} +{cmd:first} {cmd:ffirst} {cmd:noid} {cmd:savefirst} {cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:rf} {cmd:saverf} {cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:nocollin} {cmd:noid} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{bind:{cmd:plus} ]} + +{p 4}Replay syntax + +{p 8 14}{cmd:ivreg28} +{bind:[{cmd:,} {cmd:first}} +{cmd:ffirst} {cmd:rf} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{cmd:plus} ]} + +{p 4}Version syntax + +{p 8 14}{cmd:ivreg28}, {cmd:version} + +{p}{cmd:ivreg28} may be used with time-series or panel data, +in which case the data must be {cmd:tsset} +before using {cmd:ivreg28}; see help {help tsset}. + +{p}All {it:varlists} may contain time-series operators; +see help {help varlist}. + +{p}{cmd:by}, {cmd:rolling}, {cmd:statsby}, {cmd:xi}, +{cmd:bootstrap} and {cmd:jackknife} are allowed; see help {help prefix}. + +{p}{cmd:aweight}s, {cmd:fweight}s, {cmd:iweight}s and {cmd:pweight}s +are allowed; see help {help weights}. + +{p}The syntax of {help predict} following {cmd:ivreg28} is + +{p 8 16}{cmd:predict} [{it:type}] {it:newvarname} [{cmd:if} {it:exp}] +[{cmd:in} {it:range}] [{cmd:,} {it:statistic}] + +{p}where {it:statistic} is + +{p 8 23}{cmd:xb}{space 11}fitted values; the default{p_end} +{p 8 23}{cmdab:r:esiduals}{space 4}residuals{p_end} +{p 8 23}{cmd:stdp}{space 9}standard error of the prediction{p_end} + +{p}These statistics are available both in and out of sample; +type "{cmd:predict} {it:...} {cmd:if e(sample)} {it:...}" +if wanted only for the estimation sample. + +{title:Contents} +{p 2}{help ivreg28##s_description:Description}{p_end} +{p 2}{help ivreg28##s_robust:Calculation of robust, AC, HAC standard errors}{p_end} +{p 2}{help ivreg28##s_gmm:GMM estimation}{p_end} +{p 2}{help ivreg28##s_liml:LIML, k-class and GMM-CUE estimation}{p_end} +{p 2}{help ivreg28##s_sumopt:Summary of robust, HAC, AC, GMM, LIML and CUE options}{p_end} +{p 2}{help ivreg28##s_overid:Testing overidentifying restrictions}{p_end} +{p 2}{help ivreg28##s_endog:Testing subsets of regressors and instruments for endogeneity}{p_end} +{p 2}{help ivreg28##s_relevance:Tests of under- and weak identification and instrument redundancy}{p_end} +{p 2}{help ivreg28##s_first:First stage regressions, identification, and weak-id-robust inference}{p_end} +{p 2}{help ivreg28##s_rf:Reduced form estimates}{p_end} +{p 2}{help ivreg28##s_fwl:Estimating the Frisch-Waugh-Lovell regression}{p_end} +{p 2}{help ivreg28##s_ols:OLS and Heteroskedastic OLS (HOLS) estimation}{p_end} +{p 2}{help ivreg28##s_collin:Collinearities}{p_end} +{p 2}{help ivreg28##s_speed:Speed options: nocollin and noid}{p_end} +{p 2}{help ivreg28##s_small:Small sample corrections}{p_end} +{p 2}{help ivreg28##s_options:Options summary}{p_end} +{p 2}{help ivreg28##s_macros:Remarks and saved results}{p_end} +{p 2}{help ivreg28##s_examples:Examples}{p_end} +{p 2}{help ivreg28##s_refs:References}{p_end} +{p 2}{help ivreg28##s_acknow:Acknowledgements}{p_end} +{p 2}{help ivreg28##s_citation:Authors}{p_end} +{p 2}{help ivreg28##s_citation:Citation of ivreg28}{p_end} + +{marker s_description}{title:Description} + +{p}{cmd:ivreg28} implements a range of single-equation estimation methods +for the linear regression model: OLS, instrumental +variables (IV, also known as two-stage least squares, 2SLS), +the generalized method of moments (GMM), +limited-information maximum likelihood (LIML), and k-class estimators. +In the language of IV/GMM, {it:varlist1} are the exogenous +regressors or "included instruments", +{it:varlist_iv} are the exogenous variables excluded +from the regression or "excluded instruments", +and {it:varlist2} the endogenous regressors that are being "instrumented". + +{p}{cmd:ivreg28} will also estimate linear regression models using +robust (heteroskedastic-consistent), +autocorrelation-consistent (AC) and +heteroskedastic and autocorrelation-consistent (HAC) variance estimates. + +{p}{cmd:ivreg28} provides extensions to Stata's official {cmd:ivreg} +and {cmd:newey}. +{cmd:ivreg28} supports the same command syntax as official {cmd:ivreg} +and (almost) all of its options. +The main extensions available are as follows: +two-step feasible GMM estimation ({cmd:gmm} option) +and continuously-updated GMM estimation ({cmd:cue} option); +LIML and k-class estimation; +automatic output overidentification and underidentification test statistics; +C statistic test of exogeneity of subsets of instruments +({cmd:orthog()} option); +endogeneity tests of endogenous regressors +({cmd:endog()} option); +test of instrument redundancy +({cmd:redundant()} option); +kernel-based autocorrelation-consistent (AC) +and heteroskedastic and autocorrelation consistent (HAC) standard errors +and covariance estimation ({cmd:bw(}{it:#}{cmd:)} option), +with user-specified choice of kernel ({cmd:kernel()} option); +default reporting of large-sample statistics +(z and chi-squared rather than t and F); +{cmd:small} option to report small-sample statistics; +first-stage regressions reported with various tests and statistics for +identification and instrument relevance; +{cmd:ffirst} option to report only these identification statistics +and not the first-stage regression results themselves; +{cmd:nofooter} option to suppress footer of regression output. +{cmd:ivreg28} can also be used for ordinary least squares (OLS) estimation +using the same command syntax as official {cmd:regress} and {cmd:newey}. + +{marker s_robust}{dlgtab:Calculation of robust, AC, HAC standard errors} + +{p}The standard errors reported by {cmd:ivreg28} can be made consistent +in the presence of a variety of violations of the assumption of i.i.d. errors: +{bind:(1) {cmd:robust}} causes {cmd:ivreg28} to report standard errors that are +robust to the presence of arbitrary heteroskedasticity; +{bind:(2) {cmd:cluster}} standard errors are robust to both +arbitrary heteroskedasticity and arbitrary intra-group correlation; +{bind:(3) {cmd:bw(}{it:#}{cmd:)}} requests AC standard errors that are +robust to arbitrary autocorrelation; +{bind:(4) {cmd:bw(}{it:#}{cmd:)}} combined with {cmd:robust} +requests HAC standard errors that are +robust to both arbitrary heteroskedasticity and arbitrary autocorrelation. + +{p}{cmd:ivreg28} allows a variety of options for kernel-based HAC and AC estimation. +The {cmd:bw(}{it:#}{cmd:)} option sets the bandwidth used in the estimation +and {cmd:kernel(}{it:string}{cmd:)} is the kernel used; +the default kernel is the Bartlett kernel, +also known in econometrics as Newey-West (see help {help newey}). +{cmd:ivreg28} can also be used for kernel-based estimation +with panel data, i.e., a cross-section of time series. +Before using {cmd:ivreg28} for kernel-based estimation +of time series or panel data, +the data must be {cmd:tsset}; see help {help tsset}. + +{marker s_gmm}{dlgtab:GMM estimation} + +{p}When combined with the above options, the {cmd:gmm} option generates +efficient estimates of the coefficients as well as consistent +estimates of the standard errors. +The {cmd:gmm} option implements the two-step efficient +generalized method of moments (GMM) estimator. +The efficient GMM estimator minimizes the GMM criterion function +J=N*g'*W*g, where N is the sample size, +g are the orthogonality or moment conditions +(specifying that all the exogenous variables, or instruments, +in the equation are uncorrelated with the error term) +and W is a weighting matrix. +In two-step efficient GMM, the efficient or optimal weighting matrix +is the inverse of an estimate of the covariance matrix of orthogonality conditions. +The efficiency gains of this estimator relative to the +traditional IV/2SLS estimator derive from the use of the optimal +weighting matrix, the overidentifying restrictions of the model, +and the relaxation of the i.i.d. assumption. +For an exactly-identified model, +the efficient GMM and traditional IV/2SLS estimators coincide, +and under the assumptions of conditional homoskedasticity and independence, +the efficient GMM estimator is the traditional IV/2SLS estimator. +For further details, see Hayashi (2000), pp. 206-13, and 226-27. + +{p}The efficient GMM estimators available with {cmd:gmm} correspond +to the above choices for consistent standard errors: +{bind:(1) used} on its own, {cmd:gmm} causes {cmd:ivreg28} to report +coefficient estimates that are efficient in presence of arbitrary heteroskedasticity; +{bind:(2) {cmd:gmm}} combined with {cmd:cluster} +generates coefficient estimates that are efficient in the presence of +arbitrary heteroskedasticity and arbitrary intra-group group correlation; +{bind:(3) {cmd:gmm}} plus {cmd:bw(}{it:#}{cmd:)} requests coefficient estimates that are +efficient in the presence of arbitrary autocorrelation; +{bind:(4) {cmd:gmm}} plus {cmd:bw(}{it:#}{cmd:)} and {cmd:robust} +generates coefficient estimates that are efficient in the presence of +both arbitrary heteroskedasticity and arbitrary autocorrelation. + +{marker s_liml}{dlgtab:LIML, k-class and GMM-CUE estimation} + +{marker liml}{p} Maximum-likelihood estimation of a single equation of this form +(endogenous RHS variables and excluded instruments) +is known as limited-information maximum likelihood or LIML. +The overidentifying restrictions test +reported after LIML estimation is the Anderson-Rubin (1950) overidentification +statistic in a homoskedastic context. +LIML, OLS and IV/2SLS are examples of k-class estimators. +LIML is a k-class estimator with k=the LIML eigenvalue lambda; +2SLS is a k-class estimator with k=1; +OLS is a k-class esimator with k=0. +Estimators based on other values of k have been proposed. +Fuller's modified LIML (available with the {cmd:fuller(}{it:#}{cmd:)} option) +sets k = lambda - alpha/(N-L), where lambda is the LIML eigenvalue, +L = number of instruments (included and excluded), +and the Fuller parameter alpha is a user-specified positive constant. +Nagar's bias-adjusted 2SLS estimator can be obtained with the +{cmd:kclass(}{it:#}{cmd:)} option by setting +k = 1 + (L-K)/N, where L-K = number of overidentifying restrictions +and N = the sample size. +For a discussion of LIML and k-class estimators, +see Davidson and MacKinnon (1993, pp. 644-51). + +{p} The GMM generalization of the LIML estimator +to the case of possibly heteroskedastic +and autocorrelated disturbances +is the "continuously-updated" GMM estimator or CUE +of Hansen, Heaton and Yaron (1996). +The CUE estimator directly maximizes the GMM objective function +J=N*g'*W(b_cue)*g, where W(b_cue) is an optimal weighting matrix +that depends on the estimated coefficients b_cue. +{cmd:cue} combined with {cmd:robust}, {cmd:cluster}, and/or {cmd:bw}, +generates coefficient estimates that are efficient in the presence +of the corresponding deviations from homoskedasticity. +Specifying {cmd:cue} with no other options +is equivalent to the combination of the options {cmd:liml} and {cmd:coviv}. +The CUE estimator requires numerical optimization methods, +and the implementation here uses Stata's {cmd:ml} routine. +The starting values are either IV or two-step efficient GMM +coefficient estimates; +these can be overridden with the {cmd:cueinit} option, +which takes the matrix of starting values b as its argument. +{cmd:cueoptions} passes options to Stata's {cmd:ml}; see help {help ml}. +Estimation with the {cmd:cue} option can be slow and problematic, +and it should be used with caution. + +{marker s_sumopt}{dlgtab:Summary of robust, HAC, AC, GMM, LIML and CUE options} + +{p}To summarize the robust, HAC, AC, GMM, LIML and CUE options: + +{p 4}{cmd:robust} => heteroskedastic-robust SEs{p_end} +{p 4}{cmd:gmm} => heteroskedastic-efficient two-step GMM estimator{p_end} +{p 4}{cmd:robust}+{cmd:gmm} => same as {cmd:gmm}{p_end} +{p 4}{cmd:bw} => autocorrelation-robust SEs{p_end} +{p 4}{cmd:bw}+{cmd:robust} => heteroskedastic and autocorrelation-robust SEs{p_end} +{p 4}{cmd:bw}+{cmd:gmm} => autocorrelation-efficient two-step GMM estimator{p_end} +{p 4}{cmd:bw}+{cmd:robust}+{cmd:gmm} => heteroskedastic and autocorrelation-efficient two-step GMM estimator{p_end} +{p 4}{cmd:liml} => LIML estimation with non-robust SEs{p_end} +{p 4}{cmd:liml}+{cmd:coviv} => LIML estimation with alternative non-robust SEs{p_end} +{p 4}{cmd:liml}+{cmd:robust} => LIML estimation with heteroskedastic-robust SEs{p_end} +{p 4}{cmd:cue} => same as {cmd:liml}+{cmd:coviv}{p_end} +{p 4}{cmd:cue}+{cmd:robust} => heteroskedastic-efficient continuously-updated GMM estimator{p_end} +{p 4}{cmd:cue}+{cmd:bw} => autocorrelation-efficient continuously-updated GMM estimator{p_end} +{p 4 8}{cmd:cue}+{cmd:bw}+{cmd:robust} => heteroskedastic and autocorrelation-efficient continuously updated GMM estimator{p_end} + +{p}For further details, see Hayashi (2000), pp. 206-13 and 226-27 +(on GMM estimation), Wooldridge (2002), p. 193 (on cluster-robust GMM), +and Hayashi (2000), pp. 406-10 or Cushing and McGarvey (1999) +(on kernel-based covariance estimation). + +{marker s_overid}{marker overidtests}{dlgtab:Testing overidentifying restrictions} + +{p}The Sargan-Hansen test is a test of overidentifying restrictions. +The joint null hypothesis is that the instruments are valid +instruments, i.e., uncorrelated with the error term, +and that the excluded instruments are correctly excluded from the estimated equation. +Under the null, the test statistic is distributed as chi-squared +in the number of overidentifying restrictions. +A rejection casts doubt on the validity of the instruments. +For the efficient GMM estimator, the test statistic is +Hansen's J statistic, the minimized value of the GMM criterion function. +For the 2SLS estimator, the test statistic is Sargan's statistic, +typically calculated as N*R-squared from a regression of the IV residuals +on the full set of instruments. +Under the assumption of conditional homoskedasticity, +Hansen's J statistic becomes Sargan's statistic. +The J statistic is consistent in the presence of heteroskedasticity +and (for HAC-consistent estimation) autocorrelation; +Sargan's statistic is consistent if the disturbance is homoskedastic +and (for AC-consistent estimation) if it is also autocorrelated. +With {cmd:gmm}, {cmd:robust} and/or {cmd:cluster}, +Hansen's J statistic is reported. +In the latter case the statistic allows observations +to be correlated within groups. +For further discussion see e.g. Hayashi (2000, pp. 227-8, 407, 417). + +{p}The Sargan statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg28} by the command {cmd:overid}. +The features of {cmd:ivreg28} that are unavailable in {cmd:overid} +are the J statistic and the C statistic; +the {cmd:overid} options unavailable in {cmd:ivreg28} +are various small-sample and pseudo-F versions of Sargan's statistic +and its close relative, Basmann's statistic. +See help {help overid} (if installed). + +{marker s_endog}{dlgtab:Testing subsets of regressors and instruments for endogeneity} + +{marker ctest}{p}The C statistic +(also known as a "GMM distance" +or "difference-in-Sargan" statistic) +implemented using the {cmd:orthog} option, +allows a test of a subset of the orthogonality conditions, i.e., +it is a test of the exogeneity of one or more instruments. +It is defined as +the difference of the Sargan-Hansen statistic +of the equation with the smaller set of instruments +(valid under both the null and alternative hypotheses) +and the equation with the full set of instruments, +i.e., including the instruments whose validity is suspect. +Under the null hypothesis that +both the smaller set of instruments +and the additional, suspect instruments are valid, +the C statistic is distributed as chi-squared +in the number of instruments tested. +Note that failure to reject the null hypothesis +requires that the full set of orthogonality conditions be valid; +the C statistic and the Sargan-Hansen test statistics +for the equations with both the smaller and full set of instruments +should all be small. +The instruments tested may be either excluded or included exogenous variables. +If excluded exogenous variables are being tested, +the equation that does not use these orthogonality conditions +omits the suspect instruments from the excluded instruments. +If included exogenous variables are being tested, +the equation that does not use these orthogonality conditions +treats the suspect instruments as included endogenous variables. +To guarantee that the C statistic is non-negative in finite samples, +the estimated covariance matrix of the full set orthogonality conditions +is used to calculate both Sargan-Hansen statistics +(in the case of simple IV/2SLS, this amounts to using the MSE +from the unrestricted equation to calculate both Sargan statistics). +If estimation is by LIML, the C statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For further discussion, see Hayashi (2000), pp. 218-22 and pp. 232-34. + +{marker endogtest}{p}Endogeneity tests of one or more endogenous regressors +can implemented using the {cmd:endog} option. +Under the null hypothesis that the specified endogenous regressors +can actually be treated as exogenous, the test statistic is distributed +as chi-squared with degrees of freedom equal to the number of regressors tested. +The endogeneity test implemented by {cmd:ivreg28}, is, like the C statistic, +defined as the difference of two Sargan-Hansen statistics: +one for the equation with the smaller set of instruments, +where the suspect regressor(s) are treated as endogenous, +and one for the equation with the larger set of instruments, +where the suspect regressors are treated as exogenous. +Also like the C statistic, the estimated covariance matrix used +guarantees a non-negative test statistic. +Under conditional homoskedasticity, +this endogeneity test statistic is numerically equal to +a Hausman test statistic; see Hayashi (2000, pp. 233-34). +The endogeneity test statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg28} by the command {cmd:ivendog}. +Unlike the Durbin-Wu-Hausman tests reported by {cmd:ivendog}, +the {cmd:endog} option of {cmd:ivreg28} can report test statistics +that are robust to various violations of conditional homoskedasticity; +the {cmd:ivendog} option unavailable in {cmd:ivreg28} +is the Wu-Hausman F-test version of the endogeneity test. +See help {help ivendog} (if installed). + +{marker s_relevance}{dlgtab:Tests of under- and weak identification and instrument redundancy} + +{marker cancortest}{p}{cmd:ivreg28} automatically reports tests of +both underidentification and weak identification. +The Anderson (1984) canonical correlations test is +a likelihood-ratio test of whether the equation is identified, +i.e., that the excluded instruments are "relevant", +meaning correlated with the endogenous regressors. +The null hypothesis of the test is that +the matrix of reduced form coefficients has rank=K-1 +where K=number of regressors, +i.e, that the equation is underidentified. +Under the null of underidentification, +the statistic is distributed as chi-squared +with degrees of freedom=(L-K+1) +where L=number of instruments (included+excluded). +A rejection of the null indicates that the model is identified. +{it:Important}: a result of rejection of the null +should be treated with caution, +because weak instrument problems may still be present. +See Hall et al. (1996) for a discussion of this test, +and below for discussion of testing for the presence of weak instruments. +Note: the Anderson canonical correlations test assumes the regressors are distributed +as multivariate normal. + +{marker cdtest}{p}The test for weak identification automatically reported +by {cmd:ivreg28} is based on the Cragg-Donald (1993) F statistic, +a close relative of the Anderson canonical correlations statistic. +Denoting the minimum eigenvalue of the canonical correlations as CCEV +and the minimum eigenvalue of the Cragg-Donald statistic as CDEV, +CDEV=CCEV/(1-CCEV), +the Anderson LR test statistic is -N*ln(1-CCEV) and +the Cragg-Donald F statistic is CDEV*(N-L)/L2, +where L is the number of instruments and L2 is the number of excluded instruments. +"Weak identification" arises when the excluded instruments are correlated +with the endogeous regressors, but only weakly. +Estimators can perform poorly when instruments are weak, +and different estimators are more robust to weak instruments (e.g., LIML) +than others (e.g., IV); +see, e.g., Stock and Yogo (2002, 2005) for further discussion. +Stock and Yogo (2005) have compiled critical values +for the Cragg-Donald F statistic for +several different estimators (IV, LIML, Fuller-LIML), +several different definitions of "perform poorly" (based on bias and test size), +and a range of configurations (up to 100 excluded instruments +and up to 2 or 3 endogenous regressors, +depending on the estimator). +{cmd:ivreg28} will report the Stock-Yogo critical values +if these are available; +missing values mean that the critical values +haven't been tabulated or aren't applicable. +See Stock and Yogo (2002, 2005) for details. +The critical values reported by {cmd:ivreg28} for +(2-step) GMM are the IV critical values, +and the critical values reported for CUE are the LIML +critical values. +Note that the test statistic and the critical values +assume conditional homoskedasticity and independence. +In the special case of a single endogenous regressor, +a robust test statistic for weak instruments is available +with the {cmd:first} or {cmd:ffirst} options; +see below under {help ivreg28##s_first:First stage regressions}. + +{marker redtest}{p}The {cmd:redundant} option allows a test of +whether a subset of excluded instruments is "redundant". +Excluded instruments are redundant if the asymptotic efficiency +of the estimation is not improved by using them. +The test statistic is a likelihood-ratio test +based on the canonical correlations +between the regressors and the instruments with, +and without, the instruments being tested. +Under the null that the specified instruments are redundant, +the statistic is distributed as chi-squared +with degrees of freedom=(#endogenous regressors)*(#instruments tested). +Rejection of the null indicates that +the instruments are not redundant. +See Hall and Peixe (2000) for further discussion of this test. +Note: this test assumes the regressors are distributed +as multivariate normal. + +{p}Calculation and reporting of all underidentification +and weak identification statistics +can be supressed with the {cmd:noid} option. + +{marker s_first}{dlgtab:First stage regressions, identification, and weak-id-robust inference} + +{marker partialr2}{p}The {cmd:first} and {cmd:ffirst} options report +various first-stage results and identification statistics. +Both the Anderson canonical correlations likelihood-ratio test statistic +-N*ln(1-EV) +and its close relative, +the chi-squared version of the Cragg-Donald (1993) test statistic +N*(EV/(1-EV)), are reported; +both are tests of whether the equation is identified (see {help ivreg28##s_relevance:above}). +The first-stage results also include Shea's (1997) "partial R-squared" measure +of instrument relevance that takes +intercorrelations among instruments into account, +the more common form of "partial R-squared" +(a.k.a. the "squared partial correlation" between the excluded +instruments and the endogenous regressor in question), +and the F-test of the excluded instruments +in the corresponding first-stage regression. +When the model has only one endogenous regressor, +(a) the two measures of "partial R-squared" coincide; +(b) the F-stat form of the Cragg-Donald statistic +coincides with the (non-robust) first-stage F-test +of the excluded instruments. +The two partial R-squared measures, the F statistic, +the degrees of freedom of the F statistic, +and the p-value of the F statistic for each endogenous variable +are saved in the matrix e(first). +The first-stage results are always reported with small-sample statistics, +to be consistent with the recommended use of the first-stage F-test as a diagnostic. +If the estimated equation is reported with robust standard errors, +the first-stage F-test is also robust. +Note that in the special case of only one endogenous regressor, +this provides a robust test of weak or underidentification. + +{marker wirobust}{p}The first-stage output also includes +two statistics that provide weak-instrument robust inference +for testing the significance of the endogenous regressors +in the structural equation being estimated. +The first statistic is the Anderson-Rubin (1949) test +(not to be confused with the Anderson-Rubin overidentification test for LIML estimation; +see {help ivreg28##s_liml:above}). +The second is the closely related Stock-Wright (2000) S statistic. +The null hypothesis tested in both cases +is that the coefficients of the endogenous +regressors in the structural equation are jointly equal to zero, +and, in addition, +that the overidentifying restrictions are valid. +Both tests are robust to the presence of weak instruments. +The tests are equivalent to estimating +the reduced form of the equation +(with the full set of instruments as regressors) +and testing that the coefficients of the excluded instruments +are jointly equal to zero. +In the form reported by {cmd:ivreg28}, +the Anderson-Rubin statistic is a Wald test +and the Stock-Watson statistic is a GMM-distance test. +Both statistics are distributed as chi-squared +with L2 degrees of freedom, where L2=number of excluded instruments. +The traditional F-stat version of the Anderson-Rubin test is also reported. +See Stock and Watson (2000), Dufour (2003), Chernozhukov and Hansen (2005) and Kleibergen (2007) +for further discussion. +For related alternative test statistics that are also robust to weak instruments, +see {help condivreg} and the corresponding discussion +in Moreira and Poi (2003) and Mikusheva and Poi (2006). + +{p}The {cmd:savefirst} option requests that +the individual first-stage regressions are saved +for later access using the {cmd:estimates} command. +If saved, they can also be displayed using +{cmd:first} or {cmd:ffirst} and the {cmd:ivreg28} replay syntax. +The regressions are saved with the prefix "_ivreg28_", +unless the user specifies an alternative prefix with the +{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} +option. + +{marker s_rf}{dlgtab:Reduced form estimates} + +{p}The {cmd:rf} option requests that +the reduced form estimation of the equation be displayed. +The {cmd:saverf} option requests that +the reduced form estimation is saved +for later access using the {cmd:estimates} command. +If saved, it can also be displayed using the +{cmd:rf} and the {cmd:ivreg28} replay syntax. +The regression is saved with the prefix "_ivreg28_", +unless the user specifies an alternative prefix with the +{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} +option. + +{marker s_fwl}{dlgtab:Estimating the Frisch-Waugh-Lovell regression} + +{marker fwl}{p}The {cmd:fwl(}{it:varlist}{cmd:)} option requests that +the exogenous regressors in {it:varlist} are "partialled out" +from all the other variables +(other regressors and excluded instruments) in the estimation. +If the equation includes a constant, +it is also automatically partialled out as well. +The coefficients corresponding to the regressors in {it:varlist} +are not calculated. +By the Frisch-Waugh-Lovell (FWL) theorem, +the coefficients for the remaining regressors +are the same as those that would be obtained +if the variables were not partialled out. +The {cmd:fwl} option is most useful when using {cmd:cluster} +and #clusters < (#exogenous regressors + #excluded instruments). +In these circumstances, +the covariance matrix of orthogonality conditions S is not of full rank, +and efficient GMM and overidentification tests are infeasible +since the optimal weighting matrix W = {bind:S^-1} +cannot be calculated. +The problem can be addressed by using {cmd:fwl} +to partial out enough exogenous regressors for S to have full rank. +A similar problem arises when the regressors include a variable that is a singleton dummy, +i.e., a variable with one 1 and N-1 zeros or vice versa, +if a robust covariance matrix is requested. +The singleton dummy causes the robust covariance matrix estimator to be +less than full rank. +In this case, partialling-out the variable with the singleton dummy +solves the problem. +Specifying {cmd:fwl(_cons)} will cause just the constant to be partialled-out, +i.e., the equation will be estimated in deviations-from-means form. +Note that variable counts are not adjusted for the partialled-out variables. +This means that the model degrees of freedom +do not include the partialled-out variables, +and any small-sample statistics such as t or F statistics +will be affected. +Also note that after estimation using the {cmd:fwl} option, +the post-estimation {cmd:predict} can be used only to generate residuals, +and that in the current implementation, +{cmd:fwl} is not compatible with instruments (included or excluded) +that use time-series operators. + +{marker s_ols}{dlgtab:OLS and Heteroskedastic OLS (HOLS) estimation} + +{p}{cmd:ivreg28} also allows straightforward OLS estimation +by using the same syntax as {cmd:regress}, i.e., +{it:ivreg28 depvar varlist1}. +This can be useful if the user wishes to use one of the +features of {cmd:ivreg28} in OLS regression, e.g., AC or +HAC standard errors. + +{p}If the list of endogenous variables {it:varlist2} is empty +but the list of excluded instruments {it:varlist_iv} is not, +and the option {cmd:gmm} is specified, +{cmd:ivreg28} calculates Cragg's "heteroskedastic OLS" (HOLS) estimator, +an estimator that is more efficient than OLS +in the presence of heteroskedasticity of unknown form +(see Davidson and MacKinnon (1993), pp. 599-600). +If the option {cmd:bw(}{it:#}{cmd:)} is specified, +the HOLS estimator is efficient in the presence of +arbitrary autocorrelation; +if both {cmd:bw(}{it:#}{cmd:)} and {cmd:robust} are specified +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and autocorrelation; +and if {cmd:cluster(}{it:varname}{cmd:)} is used, +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and within-group correlation. +The efficiency gains of HOLS derive from the orthogonality conditions +of the excluded instruments listed in {it:varlist_iv}. +If no endogenous variables are specified and {cmd:gmm} is not specified, +{cmd:ivreg28} reports standard OLS coefficients. +The Sargan-Hansen statistic reported +when the list of endogenous variables {it:varlist2} is empty +is a Lagrange multiplier (LM) test +of the hypothesis that the excluded instruments {it:varlist_iv} are +correctly excluded from the restricted model. +If the estimation is LIML, the LM statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For more on LM tests, see e.g. Wooldridge (2002), pp. 58-60. +Note that because the approach of the HOLS estimator +has applications beyond heteroskedastic disturbances, +and to avoid confusion concerning the robustness of the estimates, +the estimators presented above as "HOLS" +are described in the output of {cmd:ivreg28} +as "2-Step GMM", "CUE", etc., as appropriate. + +{marker s_collin}{dlgtab:Collinearities} + +{p}{cmd:ivreg28} checks the lists of included instruments, +excluded instruments, and endogenous regressors +for collinearities and duplicates. If an endogenous regressor is +collinear with the instruments, it is reclassified as exogenous. If any +endogenous regressors are collinear with each other, some are dropped. +If there are any collinearities among the instruments, some are dropped. +In Stata 9+, excluded instruments are dropped before included instruments. +If any variables are dropped, a list of their names are saved +in the macros {cmd:e(collin)} and/or {cmd:e(dups)}. +Lists of the included and excluded instruments +and the endogenous regressors with collinear variables and duplicates removed +are also saved in macros with "1" appended +to the corresponding macro names. + +{p}Collinearity checks can be supressed with the {cmd:nocollin} option. + +{marker s_speed}{dlgtab:Speed options: nocollin and noid} + +{p}Two options are available for speeding execution. +{cmd:nocollin} specifies that the collinearity checks not be performed. +{cmd:noid} suspends calculation and reporting of +the underidentification and weak identification statistics +in the main output. + +{marker s_small}{dlgtab:Small sample corrections} + +{p}Mean square error = sqrt(RSS/(N-K)) if {cmd:small}, = sqrt(RSS/N) otherwise. + +{p}If {cmd:robust} is chosen, the finite sample adjustment +(see {hi:[R] regress}) to the robust variance-covariance matrix +qc = N/(N-K) if {cmd:small}, qc = 1 otherwise. + +{p}If {cmd:cluster} is chosen, the finite sample adjustment +qc = (N-1)/(N-K)*M/(M-1) if {cmd:small}, where M=number of clusters, +qc = 1 otherwise. + +{p}The Sargan and C (difference-in-Sargan) statistics use +error variance = RSS/N, i.e., there is no small sample correction. + +{p}A full discussion of these computations and related topics +can be found in Baum, Schaffer, and Stillman (2003) and Baum, Schaffer and +Stillman (2007). Some features of the program postdate the 2003 article. + + +{marker s_options}{title:Options summary} + +{p 0 4}{cmd:gmm} requests the two-step efficient GMM estimator. +If no endogenous variables are specified, the estimator is Cragg's HOLS estimator. +See help {help ivgmm0} (if installed) for more details. + +{p 0 4}{cmd:bw(}{it:#}{cmd:)} impements AC or HAC covariance estimation +with bandwidth equal to {it:#}, where {it:#} is an integer greater than zero. +Specifying {cmd:robust} implements HAC covariance estimation; +omitting it implements AC covariance estimation. + +{p 0 4}{cmd:kernel(}{it:string)}{cmd:)} specifies the kernel +to be used for AC and HAC covariance estimation; +the default kernel is Bartlett (also known in econometrics +as Newey-West). Other kernels available are (abbreviations in parentheses): +Truncated (tru); Parzen (par); Tukey-Hanning (thann); Tukey-Hamming (thamm); +Daniell (dan); Tent (ten); and Quadratic-Spectral (qua or qs). + +{p 4 4}Note: in the cases of the Bartlett, Parzen, +and Tukey-Hanning/Hamming kernels, the number of lags used +to construct the kernel estimate equals the bandwidth minus one. +Stata's official {cmd:newey} implements +HAC standard errors based on the Bartlett kernel, +and requires the user to specify +the maximum number of lags used and not the bandwidth; +see help {help newey}. +If these kernels are used with {cmd:bw(1)}, +no lags are used and {cmd:ivreg28} will report the usual +Eicker/Huber/White/sandwich variance estimates. + +{p 0 4}{cmd:liml} requests the limited-information maximum likelihood estimator. + +{p 0 4}{cmd:fuller(}{it:#}{cmd:)} specifies that Fuller's modified LIML estimator +is calculated using the user-supplied Fuller parameter alpha, +a non-negative number. +Alpha=1 has been suggested as a good choice. + +{p 0 4}{cmd:kclass(}{it:#}{cmd:)} specifies that a general k-class estimator is calculated +using the user-supplied #, a non-negative number. + +{p 0 4}{cmd:coviv} specifies that the matrix used to calculate the +covariance matrix for the LIML or k-class estimator +is based on the 2SLS matrix, i.e., with k=1. +In this case the covariance matrix will differ from that calculated for the 2SLS +estimator only because the estimate of the error variance will differ. +The default is for the covariance matrix to be based on the LIML or k-class matrix. + +{p 0 4}{cmd:cue} requests the GMM continuously-updated estimator (CUE). + +{p 0 4}{cmd:cueinit(}{it:matrix}{cmd:)} specifies that the starting values +for the CUE estimator use those in a user-supplied matrix b. +If omitted, the default behavior is to use starting values +from IV or 2-step efficient GMM estimation. + +{p 0 4}{cmd:cueopt(}{it:string}{cmd:)} passes user-specified options +to Stata's {cmd:ml} routine; see help {help ml}. + +{p 0 4}{cmd:robust} specifies that the Eicker/Huber/White/sandwich estimator of +variance is to be used in place of the traditional calculation. {cmd:robust} +combined with {cmd:cluster()} further allows residuals which are not +independent within cluster (although they must be independent between +clusters). See {hi:[U] Obtaining robust variance estimates}. + +{p 0 4}{cmd:cluster}{cmd:(}{it:varname}{cmd:)} specifies that the observations +are independent across groups (clusters) but not necessarily independent +within groups. {it:varname} specifies to which group each observation +belongs; e.g., {cmd:cluster(personid)} in data with repeated observations on +individuals. {cmd:cluster()} can be used with {help pweight}s to produce +estimates for unstratified cluster-sampled data, but see help {help svyreg} +for a command especially designed for survey data. Specifying {cmd:cluster()} +implies {cmd:robust}. + +{p 0 4}{cmd:orthog}{cmd:(}{it:varlist_ex}{cmd:)} requests that a C-statistic +be calculated as a test of the exogeneity of the instruments in {it:varlist_ex}. +These may be either included or excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instruments must still be identified. + +{p 0 4}{cmd:endog}{cmd:(}{it:varlist_en}{cmd:)} requests that a C-statistic +be calculated as a test of the endogeneity +of the endogenous regressors in {it:varlist_en}. + +{p 0 4}{cmd:redundant}{cmd:(}{it:varlist_ex}{cmd:)} requests a likelihood-ratio test +of the redundancy of the instruments in {it:varlist_ex}. +These must be excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instrumenst must still be identified. + +{p 0 4}{cmd:small} requests that small-sample statistics (F and t-statistics) +be reported instead of large-sample statistics (chi-squared and z-statistics). +Large-sample statistics are the default. +The exception is the statistic for the significance of the regression, +which is always reported as a small-sample F statistic. + +{p 0 4}{cmd:noconstant} suppresses the constant term (intercept) in the +regression. If {cmd:noconstant} is specified, the constant term is excluded +from both the final regression and the first-stage regression. To include a +constant in the first-stage when {cmd:noconstant} is specified, explicitly +include a variable containing all 1's in {it:varlist_iv}. + +{p 0 4}{cmd:first} requests that the full first-stage regression results be displayed, +along with the associated diagnostic and identification statistics. + +{p 0 4}{cmd:ffirst} requests the first-stage diagnostic and identification statistics. +The results are saved in various e() macros. + +{p 0 4}{cmd:nocollin} suppresses the checks for collinearities +and duplicate variables. + +{p 0 4}{cmd:noid} suppresses the calculation and reporting +of underidentification and weak identification statistics. + +{p 0 4}{cmd:savefirst} requests that the first-stage regressions results +are saved for later access using the {cmd:estimates} command. +The names under which the first-stage regressions are saved +are the names of the endogenous regressors prefixed by "_ivreg28_". +If these use Stata's time-series operators, +the "." is replaced by a "_". +The maximum number of first-stage estimation results that can be saved +depends on how many other estimation results the user has already saved +and on the maximum supported by Stata (20 for Stata 8.2 and 9.0, 300 for Stata 9.1). + +{p 0 4}{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the first-stage regression results be saved using the user-specified prefix +instead of the default "_ivreg28_". + +{p 0 4}{cmd:rf} requests that the reduced-form estimation of the equation +be displayed. + +{p 0 4}{cmd:saverf} requests that the reduced-form estimation of the equation +be saved for later access using the {cmd:estimates} command. +The estimation is stored under the name of the dependent variable +prefixed by "_ivreg28_". +If this uses Stata's time-series operators, +the "." is replaced by a "_". + +{p 0 4}{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the reduced-form estimation be saved using the user-specified prefix +instead of the default "_ivreg28_". + +{p 0 4}{cmd:level(}{it:#}{cmd:)} specifies the confidence level, in percent, +for confidence intervals of the coefficients; see help {help level}. + +{p 0 4}{cmd:noheader}, {cmd:eform()}, {cmd:depname()} and {cmd:plus} +are for ado-file writers; see {hi:[R] ivreg} and {hi:[R] regress}. + +{p 0 4}{cmd:nofooter} suppresses the display of the footer containing +identification and overidentification statistics, +exogeneity and endogeneity tests, +lists of endogenous variables and instruments, etc. + +{p 0 4}{cmd:version} causes {cmd:ivreg28} to display its current version number +and to leave it in the macro {cmd:e(version)}. +It cannot be used with any other options. +and will clear any existing {cmd:e()} saved results. + +{marker s_macros}{title:Remarks and saved results} + +{p}{cmd:ivreg28} does not report an ANOVA table. +Instead, it reports the RSS and both the centered and uncentered TSS. +It also reports both the centered and uncentered R-squared. +NB: the TSS and R-squared reported by official {cmd:ivreg} is centered +if a constant is included in the regression, and uncentered otherwise. + +{p}{cmd:ivreg28} saves the following results in {cmd:e()}: + +Scalars +{col 4}{cmd:e(N)}{col 18}Number of observations +{col 4}{cmd:e(yy)}{col 18}Total sum of squares (SS), uncentered (y'y) +{col 4}{cmd:e(yyc)}{col 18}Total SS, centered (y'y - ((1'y)^2)/n) +{col 4}{cmd:e(rss)}{col 18}Residual SS +{col 4}{cmd:e(mss)}{col 18}Model SS =yyc-rss if the eqn has a constant, =yy-rss otherwise +{col 4}{cmd:e(df_m)}{col 18}Model degrees of freedom +{col 4}{cmd:e(df_r)}{col 18}Residual degrees of freedom +{col 4}{cmd:e(r2u)}{col 18}Uncentered R-squared, 1-rss/yy +{col 4}{cmd:e(r2c)}{col 18}Centered R-squared, 1-rss/yyc +{col 4}{cmd:e(r2)}{col 18}Centered R-squared if the eqn has a constant, uncentered otherwise +{col 4}{cmd:e(r2_a)}{col 18}Adjusted R-squared +{col 4}{cmd:e(ll)}{col 18}Log likelihood +{col 4}{cmd:e(rankxx)}{col 18}Rank of the matrix of observations on rhs variables=K +{col 4}{cmd:e(rankzz)}{col 18}Rank of the matrix of observations on instruments=L +{col 4}{cmd:e(rankV)}{col 18}Rank of covariance matrix V of coefficients +{col 4}{cmd:e(rankS)}{col 18}Rank of covariance matrix S of orthogonality conditions +{col 4}{cmd:e(rmse)}{col 18}root mean square error=sqrt(rss/(N-K)) if -small-, =sqrt(rss/N) otherwise +{col 4}{cmd:e(F)}{col 18}F statistic +{col 4}{cmd:e(N_clust)}{col 18}Number of clusters +{col 4}{cmd:e(bw)}{col 18}Bandwidth +{col 4}{cmd:e(lambda)}{col 18}LIML eigenvalue +{col 4}{cmd:e(kclass)}{col 18}k in k-class estimation +{col 4}{cmd:e(fuller)}{col 18}Fuller parameter alpha +{col 4}{cmd:e(sargan)}{col 18}Sargan statistic +{col 4}{cmd:e(sarganp)}{col 18}p-value of Sargan statistic +{col 4}{cmd:e(sargandf)}{col 18}dof of Sargan statistic = degree of overidentification = L-K +{col 4}{cmd:e(j)}{col 18}Hansen J statistic +{col 4}{cmd:e(jp)}{col 18}p-value of Hansen J statistic +{col 4}{cmd:e(jdf)}{col 18}dof of Hansen J statistic = degree of overidentification = L-K +{col 4}{cmd:e(arubin)}{col 18}Anderson-Rubin overidentification LR statistic +{col 4}{cmd:e(arubinp)}{col 18}p-value of Anderson-Rubin overidentification LR statistic +{col 4}{cmd:e(arubindf)}{col 18}dof of A-R overid statistic = degree of overidentification = L-K +{col 4}{cmd:e(idstat)}{col 18}Anderson canonical correlations LR statistic +{col 4}{cmd:e(idp)}{col 18}p-value of Anderson canonical correlations LR statistic +{col 4}{cmd:e(iddf)}{col 18}dof of Anderson canonical correlations LR statistic +{col 4}{cmd:e(cdf)}{col 18}Cragg-Donald F statistic +{col 4}{cmd:e(cdchi2)}{col 18}Cragg-Donald chi-sq statistic +{col 4}{cmd:e(cdchi2p)}{col 18}p-value of Cragg-Donald chi-sq statistic +{col 4}{cmd:e(arf)}{col 18}Anderson-Rubin F-test of significance of endogenous regressors +{col 4}{cmd:e(arfp)}{col 18}p-value of Anderson-Rubin F-test of endogenous regressors +{col 4}{cmd:e(archi2)}{col 18}Anderson-Rubin chi-sq test of significance of endogenous regressors +{col 4}{cmd:e(archi2p)}{col 18}p-value of Anderson-Rubin chi-sq test of endogenous regressors +{col 4}{cmd:e(ardf)}{col 18}degrees of freedom of Anderson-Rubin tests of endogenous regressors +{col 4}{cmd:e(ardf_r)}{col 18}denominator degrees of freedom of AR F-test of endogenous regressors +{col 4}{cmd:e(redstat)}{col 18}LR statistic for instrument redundancy +{col 4}{cmd:e(redp)}{col 18}p-value of LR statistic for instrument redundancy +{col 4}{cmd:e(reddf)}{col 18}dof of LR statistic for instrument redundancy +{col 4}{cmd:e(cstat)}{col 18}C-statistic +{col 4}{cmd:e(cstatp)}{col 18}p-value of C-statistic +{col 4}{cmd:e(cstatdf)}{col 18}Degrees of freedom of C-statistic +{col 4}{cmd:e(cons)}{col 18}1 when equation has a Stata-supplied constant; 0 otherwise +{col 4}{cmd:e(fwlcons)}{col 18}as above but prior to partialling-out (see {cmd:e(fwl)}) + +Macros +{col 4}{cmd:e(cmd)}{col 18}ivreg28 +{col 4}{cmd:e(version)}{col 18}Version number of ivreg28 +{col 4}{cmd:e(model)}{col 18}ols, iv, gmm, liml, or kclass +{col 4}{cmd:e(depvar)}{col 18}Name of dependent variable +{col 4}{cmd:e(instd)}{col 18}Instrumented (RHS endogenous) variables +{col 4}{cmd:e(insts)}{col 18}Instruments +{col 4}{cmd:e(inexog)}{col 18}Included instruments (regressors) +{col 4}{cmd:e(exexog)}{col 18}Excluded instruments +{col 4}{cmd:e(collin)}{col 18}Variables dropped because of collinearities +{col 4}{cmd:e(dups)}{col 18}Duplicate variables +{col 4}{cmd:e(ecollin)}{col 18}Endogenous variables reclassified as exogenous because of +{col 20}collinearities with instruments +{col 4}{cmd:e(clist)}{col 18}Instruments tested for orthogonality +{col 4}{cmd:e(redlist)}{col 18}Instruments tested for redundancy +{col 4}{cmd:e(fwl)}{col 18}Partialled-out exogenous regressors +{col 4}{cmd:e(small)}{col 18}small +{col 4}{cmd:e(wtype)}{col 18}weight type +{col 4}{cmd:e(wexp)}{col 18}weight expression +{col 4}{cmd:e(clustvar)}{col 18}Name of cluster variable +{col 4}{cmd:e(vcetype)}{col 18}Covariance estimation method +{col 4}{cmd:e(kernel)}{col 18}Kernel +{col 4}{cmd:e(tvar)}{col 18}Time variable +{col 4}{cmd:e(ivar)}{col 18}Panel variable +{col 4}{cmd:e(firsteqs)}{col 18}Names of stored first-stage equations +{col 4}{cmd:e(rfeq)}{col 18}Name of stored reduced-form equation +{col 4}{cmd:e(predict)}{col 18}Program used to implement predict + +Matrices +{col 4}{cmd:e(b)}{col 18}Coefficient vector +{col 4}{cmd:e(V)}{col 18}Variance-covariance matrix of the estimators +{col 4}{cmd:e(S)}{col 18}Covariance matrix of orthogonality conditions +{col 4}{cmd:e(W)}{col 18}GMM weighting matrix (=inverse of S if efficient GMM estimator) +{col 4}{cmd:e(first)}{col 18}First-stage regression results +{col 4}{cmd:e(ccev)}{col 18}Eigenvalues corresponding to the Anderson canonical correlations test +{col 4}{cmd:e(cdev)}{col 18}Eigenvalues corresponding to the Cragg-Donald test + +Functions +{col 4}{cmd:e(sample)}{col 18}Marks estimation sample + + + +{marker s_examples}{title:Examples} + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta" : . use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta }{p_end} +{p 8 12}(Wages of Very Young Men, Zvi Griliches, J.Pol.Ec. 1976) + +{p 8 12}{stata "xi i.year" : . xi i.year} + +{col 0}(Instrumental variables. Examples follow Hayashi 2000, p. 255.) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt)" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt)} + +{p 8 12}{stata "ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), small ffirst" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), small ffirst} + +{col 0}(Testing for the presence of heteroskedasticity in IV/GMM estimation) + +{p 8 12}{stata "ivhettest, fitlev" : . ivhettest, fitlev} + +{col 0}(Two-step GMM efficient in the presence of arbitrary heteroskedasticity) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm} + +{p 0}(Continuously-updated GMM (CUE) efficient in the presence of arbitrary heteroskedasticity. NB: may require 50+ iterations.) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust} + +{col 0}(Sargan-Basmann tests of overidentifying restrictions for IV estimation) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt)" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt)} + +{p 8 12}{stata "overid, all" : . overid, all} + +{col 0}(Tests of exogeneity and endogeneity) + +{col 0}(Test the exogeneity of 1 regressor) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm orthog(s)" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm orthog(s)} + +{col 0}(Test the exogeneity of 2 excluded instruments) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm orthog(age mrt)" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm orthog(age mrt)} + +{col 0}(Frisch-Waugh-Lovell (FWL): equivalence of estimations with and without partialling-out) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns _I* (iq=kww age), cluster(year)" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age), cluster(year)} + +{p 8 12}{stata "ivreg28 lw s expr tenure rns _I* (iq=kww age), cluster(year) fwl(_I*)" : . ivreg28 lw s expr tenure rns smsa _I* (iq=med kww age), cluster(year) fwl(_I*)} + +{col 0}(FWL: efficient GMM with #clusters<#instruments feasible after partialling-out) + +{p 8 12}{stata "ivreg28 lw s expr tenure rns _I* (iq=kww age), cluster(year) fwl(_I*) gmm" : . ivreg28 lw s expr tenure rns smsa (iq=med kww age), cluster(year) fwl(_I*) gmm} + +{col 0}(Examples following Wooldridge 2002, pp.59, 61) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta" : . use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta } + +{col 0}(Test an excluded instrument for redundancy) + +{p 8 12}{stata "ivreg28 lwage exper expersq (educ=age kidslt6 kidsge6), redundant(age)" : . ivreg28 lwage exper expersq (educ=age kidslt6 kidsge6), redundant(age)} + +{col 0}(Equivalence of DWH endogeneity test when regressor is endogenous...) + +{p 8 12}{stata "ivreg28 lwage exper expersq (educ=age kidslt6 kidsge6)" : . ivreg28 lwage exper expersq (educ=age kidslt6 kidsge6)} + +{p 8 12}{stata "ivendog educ" :. ivendog educ} + +{col 0}(... endogeneity test using the {cmd:endog} option) + +{p 8 12}{stata "ivreg28 lwage exper expersq (educ=age kidslt6 kidsge6), endog(educ)" : . ivreg28 lwage exper expersq educ (educ=age kidslt6 kidsge6), endog(educ)} + +{col 0}(...and C-test of exogeneity when regressor is exogenous, using the {cmd:orthog} option) + +{p 8 12}{stata "ivreg28 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)" : . ivreg28 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)} + +{col 0}(Heteroskedastic Ordinary Least Squares, HOLS) + +{p 8 12}{stata "ivreg28 lwage exper expersq educ (=age kidslt6 kidsge6), gmm" : . ivreg28 lwage exper expersq educ (=age kidslt6 kidsge6), gmm} + +{col 0}(LIML and k-class estimation using Klein data) + +{col 9}{stata "use http://fmwww.bc.edu/repec/bocode/k/kleinI" :. use http://fmwww.bc.edu/repec/bocode/k/kleinI} + +{col 0}(LIML estimates of Klein's consumption function) + +{p 8 12}{stata "ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml" :. ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml} + +{col 0}(Equivalence of LIML and CUE+homoskedasticity+independence) + +{p 8 12}{stata "ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml coviv" :. ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml coviv} + +{p 8 12}{stata "ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), cue" :. ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), cue} + +{col 0}(Fuller's modified LIML with alpha=1) + +{p 8 12}{stata "ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), fuller(1)" :. ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), fuller(1)} + +{col 0}(k-class estimation with Nagar's bias-adjusted IV, k=1+(L-K)/N=1+4/21=1.19) + +{p 8 12}{stata "ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), kclass(1.19)" :. ivreg28 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), kclass(1.19)} + +{col 0}(Kernel-based covariance estimation using time-series data) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta" :. use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta} + +{p 8 12}{stata "tsset year, yearly" :. tsset year, yearly} + +{col 0}(Autocorrelation-consistent (AC) inference in an OLS Regression) + +{p 8 12}{stata "ivreg28 cinf unem, bw(3)" :. ivreg28 cinf unem, bw(3)} + +{col 0}(Heteroskedastic and autocorrelation-consistent (HAC) inference in an OLS regression) + +{p 8 12}{stata "ivreg28 cinf unem, bw(3) kernel(bartlett) robust small" :. ivreg28 cinf unem, bw(3) kernel(bartlett) robust small} + +{p 8 12}{stata "newey cinf unem, lag(2)" :. newey cinf unem, lag(2)} + +{col 0}(AC and HAC in IV and GMM estimation) + +{p 8 12}{stata "ivreg28 cinf (unem = l(1/3).unem), bw(3)" :. ivreg28 cinf (unem = l(1/3).unem), bw(3)} + +{p 8 12}{stata "ivreg28 cinf (unem = l(1/3).unem), bw(3) gmm kernel(thann)" :. ivreg28 cinf (unem = l(1/3).unem), bw(3) gmm kernel(thann)} + +{p 8 12}{stata "ivreg28 cinf (unem = l(1/3).unem), bw(3) gmm kernel(qs) robust orthog(l1.unem)" :. ivreg28 cinf (unem = l(1/3).unem), bw(3) gmm kernel(qs) robust orthog(l1.unem)} + +{col 0}(Examples using Large N, Small T Panel Data) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta" : . use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta }{p_end} +{p 8 12}(Layard & Nickell, Unemployment in Britain, Economica 53, 1986, from Ox dist) + +{p 8 12}{stata "tsset id year" :. tsset id year} + +{col 0}(Autocorrelation-consistent inference in an IV regression) + +{p 8 12}{stata "ivreg28 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(1) kernel(tru)": . ivreg28 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(1) kernel(tru)} + +{col 0}(Two-step effic. GMM in the presence of arbitrary heteroskedasticity and autocorrelation) + +{p 8 12}{stata "ivreg28 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(2) gmm kernel(tru) robust": . ivreg28 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(2) gmm kernel(tru) robust} + +{col 0}(Two-step effic. GMM in the presence of arbitrary heterosked. and intra-group correlation) + +{p 8 12}{stata "ivreg28 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm cluster(id)": . ivreg28 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm cluster(id)} + + +{marker s_refs}{title:References} + +{p 0 4}Anderson, T.W. 1984. Introduction to Multivariate Statistical Analysis. +2d ed. New York: John Wiley & Sons. + +{p 0 4}Anderson, T. W., and H. Rubin. 1949. Estimation of the parameters of a single equation +in a complete system of stochastic equations. Annals of Mathematical Statistics, Vol. 20, +pp. 46-63. + +{p 0 4}Anderson, T. W., and H. Rubin. 1950. The asymptotic properties of estimates of the parameters of a single +equation in a complete system of stochastic equations. Annals of Mathematical Statistics, +Vol. 21, pp. 570-82. + +{p 0 4}Baum, C.F., Schaffer, M.E., and Stillman, S. 2003. Instrumental Variables and GMM: +Estimation and Testing. The Stata Journal, Vol. 3, No. 1, pp. 1-31. +Working paper version: Boston College Department of Economics Working Paper No 545. +{browse "http://ideas.repec.org/p/boc/bocoec/545.html":http://ideas.repec.org/p/boc/bocoec/545.html} + +{p 0 4}Baum, C. F., Schaffer, M. E., and Stillman, S. 2007. Enhanced routines for +instrumental variables/GMM estimation and testing. Unpublished working paper, +forthcoming. + +{p 0 4}Chernozhukov, V. and Hansen, C. 2005. The Reduced Form: +A Simple Approach to Inference with Weak Instruments. +Working paper, University of Chicago, Graduate School of Business. + +{p 0 4}Cragg, J.G. and Donald, S.G. 1993. Testing Identfiability and Specification in +Instrumental Variables Models. Econometric Theory, Vol. 9, pp. 222-240. + +{p 0 4}Cushing, M.J. and McGarvey, M.G. 1999. Covariance Matrix Estimation. +In L. Matyas (ed.), Generalized Methods of Moments Estimation. +Cambridge: Cambridge University Press. + +{p 0 4}Davidson, R. and MacKinnon, J. 1993. Estimation and Inference in Econometrics. +1993. New York: Oxford University Press. + +{p 0 4}Dufour, J.M. 2003. Identification, Weak Instruments and Statistical Inference +in Econometrics. Canadian Journal of Economics, Vol. 36, No. 4, pp. 767-808. +Working paper version: CIRANO Working Paper 2003s-49. +http://www.cirano.qc.ca/pdf/publication/2003s-49.pdf + +{p 0 4}Hall, A.R. and Peixe, F.P.M. 2000. A Consistent Method for the Selection of +Relevant Instruments. Econometric Society World Congress 2000 Contributed papers. +http://econpapers.repec.org/paper/ecmwc2000/0790.htm + +{p 0 4}Hall, A.R., Rudebusch, G.D. and Wilcox, D.W. 1996. Judging Instrument Relevance in +Instrumental Variables Estimation. International Economic Review, Vol. 37, No. 2, pp. 283-298. + +{p 0 4}Hayashi, F. Econometrics. 2000. Princeton: Princeton University Press. + +{p 0 4}Hansen, L.P., Heaton, J., and Yaron, A. 1996. Finite Sample Properties +of Some Alternative GMM Estimators. Journal of Business and Economic Statistics, +Vol. 14, No. 3, pp. 262-280. + +{p 0 4}Kleibergen, F. 2007. Generalizing Weak Instrument Robust Statistics Towards +Multiple Parameters, Unrestricted Covariance Matrices and Identification Statistics. +Journal of Econometrics, forthcoming. + +{p 0 4}Mikusheva, A. and Poi, B.P. 2006. +Tests and confidence sets with correct size when instruments are potentially weak. +The Stata Journal, Vol. 6, No. 3, pp. 335-347. + +{p 0 4}Moreira, M.J. and Poi, B.P. 2003. Implementing Tests with the Correct Size +in the Simultaneous Equations Model. The Stata Journal, Vol. 3, No. 1, pp. 57-70. + +{p 0 4}Shea, J. 1997. Instrument Relevance in Multivariate Linear Models: +A Simple Measure. +Review of Economics and Statistics, Vol. 49, No. 2, pp. 348-352. + +{p 0 4}Stock, J.H. and Wright, J.H. 2000. GMM with Weak Identification. +Econometrica, Vol. 68, No. 5, September, pp. 1055-1096. + +{p 0 4}Stock, J.H. and Yogo, M. 2005. Testing for Weak Instruments in Linear IV Regression. +In D.W.K. Andrews and J.H. Stock, eds. Identification and Inference for Econometric Models: +Essays in Honor of Thomas Rothenberg. Cambridge: Cambridge University Press, 2005, pp. 80–108. +Working paper version: NBER Technical Working Paper 284. http://www.nber.org/papers/T0284. + +{p 0 4}Wooldridge, J.M. 2002. Econometric Analysis of Cross Section and Panel Data. +Cambridge, MA: MIT Press. + + +{marker s_acknow}{title:Acknowledgements} + +{p}We would like to thanks various colleagues who helped us along the way, including +David Drukker, +Austin Nichols, +Vince Wiggins, +and, not least, the users of {cmd:ivreg28} +who have provided suggestions, +spotted bugs, +and helped test the package. +We are also grateful to Jim Stock and Moto Yogo for permission to reproduce +their critical values for the Cragg-Donald statistic. + +{marker s_citation}{title:Citation of ivreg28} + +{p}{cmd:ivreg28} is not an official Stata command. It is a free contribution +to the research community, like a paper. Please cite it as such: {p_end} + +{phang}Baum, C.F., Schaffer, M.E., Stillman, S. 2007. +ivreg28: Stata module for extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression. +{browse "http://ideas.repec.org/c/boc/bocode/s425401.html":http://ideas.repec.org/c/boc/bocode/s425401.html}{p_end} + +{title:Authors} + + Christopher F Baum, Boston College, USA + baum@bc.edu + + Mark E Schaffer, Heriot-Watt University, UK + m.e.schaffer@hw.ac.uk + + Steven Stillman, Motu Economic and Public Policy Research + stillman@motu.org.nz + + +{title:Also see} + +{p 1 14}Manual: {hi:[U] 23 Estimation and post-estimation commands},{p_end} +{p 10 14}{hi:[U] 29 Overview of model estimation in Stata},{p_end} + {hi:[R] ivreg} +{p 0 19}On-line: help for {help ivreg}, {help newey}; +{help overid}, {help ivendog}, {help ivhettest}, {help ivreset}, +{help xtivreg28}, {help xtoverid}, +{help condivreg} (if installed); +{help est}, {help postest}; +{help regress}{p_end} diff --git a/data/ado/i/ivreg28_cue.ado b/data/ado/i/ivreg28_cue.ado new file mode 100644 index 0000000..edbba74 --- /dev/null +++ b/data/ado/i/ivreg28_cue.ado @@ -0,0 +1,24 @@ +! 1.0.4 4feb2007 +* 1.0.1 cfb updated to v8.2 +* 1.0.2 mes fixed col and row names mismatch +* 1.0.3 added noid option to supress unnecessary identification stats +* 1.0.4 added local `ivreg2_cmd'. ref only to e(j); e(sargan) no longer needed. + +program define ivreg28_cue + version 8.2 + args todo b lnf + local ivreg2_cmd "ivreg28" + tempname b1 J +* Need to make col and rownames match + mat `b1'=`b' +* Remove equation number from col names + local vn : colfullnames `b1' + local vn : subinstr local vn "eq1" "", all + mat colnames `b1' = `vn' +* Standard row name + mat rownames `b1' = y1 + qui `ivreg2_cmd' $IV_lhs $IV_inexog ($IV_endog=$IV_exexog) $IV_wt if $ML_samp==1, b0(`b1') $IV_opt noid + scalar `J'=e(j) + scalar `lnf' = -`J' +end + diff --git a/data/ado/i/ivreg28_p.ado b/data/ado/i/ivreg28_p.ado new file mode 100644 index 0000000..63bd9df --- /dev/null +++ b/data/ado/i/ivreg28_p.ado @@ -0,0 +1,97 @@ +*! version 1.0.6 30Jan2011 +*! author mes +* 1.0.1: 25apr2002 original version +* 1.0.2: 28jun2005 version 8.2 +* 1.0.3: 1Aug2006 complete rewrite plus fwl option +* 1.0.4: 26Jan2007 eliminated double reporting of #MVs +* 1.0.5: 2Feb2007 small fix to allow fwl of just _cons +* 1.0.6: 30Jan2011 re-introduced stdp (had been removed with fwl) +* and added labelling of created residual variable + +program define ivreg28_p + version 8.2 + syntax newvarname [if] [in] , [XB Residuals stdp] + marksample touse, novarlist + + local type "`xb'`residuals'`stdp'" + + if "`type'"=="" { + local type "xb" +di in gr "(option xb assumed; fitted values)" + } + + if "`e(fwlcons)'" != "" { +* fwl partial-out block + if "`type'" == "residuals" { + + tempvar esample + tempname ivres + gen byte `esample' = e(sample) + +* Need to strip out time series operators + local lhs "`e(depvar)'" + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + + local rhs : colnames(e(b)) + tsrevar `rhs', substitute + local rhs_t "`r(varlist)'" + + if "`e(fwl1)'" != "" { + local fwl "`e(fwl1)'" + } + else { + local fwl "`e(fwl)'" + } + tsrevar `fwl', substitute + local fwl_t "`r(varlist)'" + + if ~e(fwlcons) { + local noconstant "noconstant" + } + + local allvars "`lhs_t' `rhs_t'" +* Partial-out block. Uses estimatation sample to get coeffs, markout sample for predict + _estimates hold `ivres', restore + foreach var of local allvars { + tempname `var'_fwl + qui regress `var' `fwl' if `esample', `noconstant' + qui predict double ``var'_fwl' if `touse', resid + local allvars_fwl "`allvars_fwl' ``var'_fwl'" + } + _estimates unhold `ivres' + + tokenize `allvars_fwl' + local lhs_fwl "`1'" + mac shift + local rhs_fwl "`*'" + + tempname b + mat `b'=e(b) + mat colnames `b' = `rhs_fwl' +* Use forcezero? + tempvar xb + mat score double `xb' = `b' if `touse' + gen `typlist' `varlist' = `lhs_fwl' - `xb' + label var `varlist' "Residuals" + } + else { +di in red "Option `type' not supported with -fwl- option" + error 198 + } + } + else if "`type'" == "residuals" { + tempname lhs lhs_t xb + local lhs "`e(depvar)'" + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + qui _predict `typlist' `xb' if `touse' + gen `typlist' `varlist'=`lhs_t'-`xb' + label var `varlist' "Residuals" + } +* Must be either xb or stdp + else { + _predict `typlist' `varlist' if `touse', `type' + } + +end diff --git a/data/ado/i/ivreg29.ado b/data/ado/i/ivreg29.ado new file mode 100644 index 0000000..5947a76 --- /dev/null +++ b/data/ado/i/ivreg29.ado @@ -0,0 +1,7576 @@ +*! ivreg29 2.2.14 19Jan2015 +*! authors cfb & mes +*! see end of file for version comments + +* Variable naming: +* lhs = LHS endogenous +* endo = RHS endogenous (instrumented) +* inexog = included exogenous (instruments) +* exexog = excluded exogenous (instruments) +* iv = {inexog exexog} = all instruments +* rhs = {endo inexog} = RHS regressors +* 1 at the end of the name means the varlist after duplicates and collinearities removed +* ..1_ct at the end means a straight count of the list +* .._ct at the end means ..1_ct with any additional detected cnts removed + +program define ivreg29, eclass byable(recall) /* properties(svyj) */ sortpreserve + version 9.2 + local lversion 02.2.14 + + local ivreg2_cmd "ivreg29" + + if replay() { + syntax [, FIRST FFIRST RF Level(integer $S_level) NOHEader NOFOoter dropfirst droprf /* + */ EForm(string) PLUS VERsion] + if "`version'" != "" & "`first'`ffirst'`rf'`noheader'`nofooter'`dropfirst'`droprf'`eform'`plus'" != "" { + di as err "option version not allowed" + error 198 + } + if "`version'" != "" { + di in gr "`lversion'" + ereturn clear + ereturn local version `lversion' + exit + } + if `"`e(cmd)'"' != "`ivreg2_cmd'" { + error 301 + } + if "`e(firsteqs)'" != "" & "`dropfirst'" == "" { +* On replay, set flag so saved eqns aren't dropped + local savefirst "savefirst" + } + if "`e(rfeq)'" != "" & "`droprf'" == "" { +* On replay, set flag so saved eqns aren't dropped + local saverf "saverf" + } + } + else { + local cmdline "`ivreg2_cmd' `*'" + + syntax [anything(name=0)] [if] [in] [aw fw pw iw/] [, /* + */ FIRST FFIRST NOID NOCOLLIN SAVEFIRST SAVEFPrefix(name) SMall Robust CLuster(varname) /* + */ GMM GMM2s CUE CUEINIT(string) CUEOPTions(string) ORTHOG(string) ENDOGtest(string) /* + */ PARTIAL(string) FWL(string) NOConstant Level(integer $S_level) Beta hc2 hc3 /* + */ NOHEader NOFOoter NOOUTput title(string) subtitle(string) /* + */ DEPname(string) EForm(string) PLUS /* + */ BW(string) kernel(string) Tvar(varname) Ivar(varname)/* + */ LIML COVIV FULLER(real 0) Kclass(string) /* + */ REDundant(string) RF SAVERF SAVERFPrefix(name) /* + */ B0(string) SMATRIX(string) WMATRIX(string) /* + */ dofminus(integer 0) sdofminus(integer 0) NOPARTIALSMALL ] + + local n 0 + + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + if `s(stop)' { + error 198 + } + while `s(stop)'==0 { + if "`paren'"=="(" { + local n = `n' + 1 + if `n'>1 { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +exit 198 + } + gettoken p lhs : lhs, parse(" =") + while "`p'"!="=" { + if "`p'"=="" { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +di in red `"the equal sign "=" is required"' +exit 198 + } + local endo `endo' `p' + gettoken p lhs : lhs, parse(" =") + } +* To enable Cragg HOLS estimator, allow for empty endo list + local temp_ct : word count `endo' + if `temp_ct' > 0 { + tsunab endo : `endo' + } +* To enable OLS estimator with (=) syntax, allow for empty exexog list + local temp_ct : word count `lhs' + if `temp_ct' > 0 { + tsunab exexog : `lhs' + } + } + else { + local inexog `inexog' `lhs' + } + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + } + local 0 `"`lhs' `0'"' + + tsunab inexog : `inexog' + tokenize `inexog' + local lhs "`1'" + local 1 " " + local inexog `*' + + if "`gmm2s'`cue'" != "" & "`exexog'" == "" { + di in red "option `gmm2s'`cue' invalid: no excluded instruments specified" + exit 102 + } + +/* Block disabled - ranktest code now incorporated into ivreg29. +* Check that -ranktest- is installed + capture ranktest, version + if _rc != 0 { +di as err "Error: must have ranktest version `ranktestversion' or greater installed" +di as err "To install, from within Stata type " _c +di in smcl "{stata ssc install ranktest :ssc install ranktest}" + exit 601 + } + local vernum "`r(version)'" + if ("`vernum'" < "`ranktestversion'") | ("`vernum'" > "09.9.99") { +di as err "Error: must have ranktest version `ranktestversion' or greater installed" +di as err "Currently installed version is `vernum'" +di as err "To update, from within Stata type " _c +di in smcl "{stata ssc install ranktest, replace :ssc install ranktest, replace}" + exit 601 + } +*/ + +* Process options + +* Legacy gmm option + if "`gmm'" ~= "" { +di in ye "-gmm- is no longer a supported option; use -gmm2s- with the appropriate option" +di in ye " gmm = gmm2s robust" +di in ye " gmm robust = gmm2s robust" +di in ye " gmm bw() = gmm2s bw()" +di in ye " gmm robust bw() = gmm2s robust bw()" +di in ye " gmm cluster() = gmm2s cluster()" + local gmm2s "gmm2s" + if "`robust'`cluster'`bw'"=="" { +* 2-step efficient gmm with arbitrary heteroskedasticity + local robust "robust" + } + } + +* partial, including legacy FWL option + local partial "`partial' `fwl'" + local partial : list retokenize partial +* Need word option so that varnames with cons in them aren't zapped + local partial : subinstr local partial "_cons" "", all count(local partialcons) word + if `partialcons' > 0 & "`noconstant'"~="" { +di in r "Error: _cons listed in partial() but equation specifies -noconstant-." + error 198 + } + else if "`noconstant'"~="" { + local partialcons 0 + } + else if `partialcons' > 1 { +* Just in case of multiple _cons +di in r "Error: _cons listed more than once in partial()." + error 198 + } + else if "`partial'" ~= "" { + local partialcons 1 + } + +* Fuller implies LIML + if "`liml'" == "" & `fuller' != 0 { + local liml "liml" + } + +* b0 implies noid. Also check for incompatible options. + if "`b0'" ~= "" { + local noid "noid" + local b0opts "`gmm2s'`cue'`liml'`wmatrix'`kclass'" + if "`b0opts'" != "" { +* ...with spaces + local b0opts "`gmm2s' `cue' `liml' `wmatrix' `kclass'" + local b0opts : list retokenize b0opts +di as err "incompatible options: -b0- and `b0opts'" + exit 198 + } + } + + if "`gmm2s'" != "" & "`cue'" != "" { +di as err "incompatible options: 2-step efficient gmm and cue gmm" + exit 198 + } + +* savefprefix implies savefirst + if "`savefprefix'" != "" & "`savefirst'" == "" { + local savefirst "savefirst" + } + +* default savefprefix is _ivreg2_ + if "`savefprefix'" == "" { + local savefprefix "_`ivreg2_cmd'_" + } + +* saverfprefix implies saverf + if "`saverfprefix'" != "" & "`saverf'" == "" { + local saverf "saverf" + } + +* default saverfprefix is _ivreg2_ + if "`saverfprefix'" == "" { + local saverfprefix "_`ivreg2_cmd'_" + } + +* LIML/kclass incompatibilities + if "`liml'`kclass'" != "" { + if "`gmm2s'`cue'" != "" { +di as err "GMM estimation not available with LIML or k-class estimators" + exit 198 + } + if `fuller' < 0 { +di as err "invalid Fuller option" + exit 198 + } + if "`liml'" != "" & "`kclass'" != "" { +di as err "cannot use liml and kclass options together" + exit 198 + } +* Process kclass string + tempname kclass2 + scalar `kclass2'=real("`kclass'") + if "`kclass'" != "" & (`kclass2' == . | `kclass2' < 0 ) { +di as err "invalid k-class option" + exit 198 + } + } + +* HAC estimation. +* If bw is omitted, default `bw' is empty string. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. + if "`bw'" != "" | "`kernel'" != "" { +* Need tvar only for markout with time-series stuff +* but data must be tsset for time-series operators in code to work +* User-supplied tvar not used but checked if consistent with tsset + capture tsset + if "`r(timevar)'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } + tsreport, panel + if `r(N_gaps)' != 0 { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + + if "`bw'" == "" { +di as err "bandwidth option bw() required for HAC-robust estimation" + exit 102 + } +* Check for bw(auto); flag as -1 + if lower("`bw'") == "auto" { + if "`ivar'" ~= "" { +di as err "Automatic bandwidth selection not available for panel data" + exit 198 + } + local bw=-1 + } + else { + local bw real("`bw'") +* Check it's a valid bandwidth + if `bw' != int(`bw') | /* + */ `bw' == . | /* + */ `bw' <= 0 { +di as err "invalid bandwidth in option bw() - must be integer > 0 or 'auto'" + exit 198 + } +* Convert bw macro to simple integer + local bw=`bw' + } +* Check it's a valid kernel + local validkernel 0 + if lower(substr("`kernel'", 1, 3)) == "bar" | "`kernel'" == "" { +* Default kernel + local kernel "Bartlett" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Bartlett and bw=1 implies zero lags used. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 3)) == "par" { + local kernel "Parzen" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Parzen and bw=1 implies zero lags used. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 3)) == "tru" { + local kernel "Truncated" + local window "lag" + local validkernel 1 + } + if lower(substr("`kernel'", 1, 9)) == "tukey-han" | lower("`kernel'") == "thann" { + local kernel "Tukey-Hanning" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Tukey-Hanning and bw=1 implies zero lags. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 9)) == "tukey-ham" | lower("`kernel'") == "thamm" { + local kernel "Tukey-Hamming" + local window "lag" + local validkernel 1 + if `bw'==1 { +di in ye "Note: kernel=Tukey-Hamming and bw=1 implies zero lags. Standard errors and" +di in ye " test statistics are not autocorrelation-consistent." + } + } + if lower(substr("`kernel'", 1, 3)) == "qua" | lower("`kernel'") == "qs" { + local kernel "Quadratic spectral" + local window "spectral" + local validkernel 1 + } + if lower(substr("`kernel'", 1, 3)) == "dan" { + local kernel "Daniell" + local window "spectral" + local validkernel 1 + } + if lower(substr("`kernel'", 1, 3)) == "ten" { + local kernel "Tent" + local window "spectral" + local validkernel 1 + } + if ~`validkernel' { + di in red "invalid kernel" + exit 198 + } + } + + if "`kernel'" != "" & "`cluster'" != "" { +di as err "cannot use HAC kernel estimator with -cluster- option" + exit 198 + } + + if "`orthog'`endogtest'`redundant'`partial'" != "" { + capture tsunab orthog : `orthog' + capture tsunab endogtest : `endogtest' + capture tsunab redundant : `redundant' + capture tsunab partial : `partial' + } + + if "`hc2'`hc3'" != "" { + if "`hc2'"!="" { + di in red "option `hc2' invalid" + } + else di in red "option `hc3' invalid" + exit 198 + } + + if "`beta'" != "" { + di in red "option `beta' invalid" + exit 198 + } + +* Weights +* fweight and aweight accepted as is +* iweight not allowed with robust or gmm and requires a trap below when used with summarize +* pweight is equivalent to aweight + robust +* but in HAC case, robust implied by `kernel' rather than `robust' + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + qui gen double `wvar'=`exp' + } + if "`weight'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`gmm2s'`kernel'" !="" { + di in red "iweights not allowed with robust or gmm" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + qui gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + qui gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + + if `dofminus' > 0 { + local dofmopt "dofminus(`dofminus')" + } + + marksample touse + markout `touse' `lhs' `inexog' `exexog' `endo' `cluster' `tvar', strok + +* Weight statement + if "`weight'" ~= "" { + sum `wvar' if `touse' `wtexp', meanonly +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + +* Set local macro T and check that bw < T +* Also make sure only used sample is checked + if "`bw'" != "" { + sum `tvar' if `touse', meanonly + local T = r(max)-r(min)+1 + if (`bw' > `T') & (`bw' ~= -1) { +di as err "invalid bandwidth in option bw() - cannot exceed timespan of data" + exit 198 + } + } + +************* Collinearities and duplicates block ***************** + + if "`noconstant'" != "" { + local rmcnocons "nocons" + } + +* Check for duplicates of variables +* To mimic official ivreg, in the case of duplicates, +* (1) inexog > endo +* (2) inexog > exexog +* (3) endo + exexog = inexog, as if it were "perfectly predicted" + local dupsen1 : list dups endo + local endo1 : list uniq endo + local dupsex1 : list dups exexog + local exexog1 : list uniq exexog + local dupsin1 : list dups inexog + local inexog1 : list uniq inexog +* Remove inexog from endo + local dupsen2 : list endo1 & inexog1 + local endo1 : list endo1 - inexog1 +* Remove inexog from exexog + local dupsex2 : list exexog1 & inexog1 + local exexog1 : list exexog1 - inexog1 +* Remove endo from exexog + local dupsex3 : list exexog1 & endo1 + local exexog1 : list exexog1 - endo1 + local dups "`dupsen1' `dupsex1' `dupsin1' `dupsen2' `dupsex2' `dupsex3'" + local dups : list uniq dups + + if "`nocollin'" == "" { +* First, collinearities check using canonical correlations approach +* Eigenvalue=1 => included endog is really included exogenous +* Eigenvalue=0 => included endog collinear with another included endog +* Corresponding column names give name of variable +* Code block stolen from below, so some repetition + local insts1 `inexog1' `exexog1' + local rhs1 `endo1' `inexog1' + local endo1_ct : word count `endo1' + if `endo1_ct' > 0 { + tempname ccmat ccrealev ccimagev cc A XX XXinv ZZ ZZinv XZ XPZX + qui mat accum `A' = `endo1' `insts1' if `touse' `wtexp', `rmcnocons' + mat `XX' = `A'[1..`endo1_ct',1..`endo1_ct'] + mat `XXinv'=syminv(`XX') + mat `ZZ' = `A'[`endo1_ct'+1...,`endo1_ct'+1...] + mat `ZZinv'=syminv(`ZZ') + mat `XZ' = `A'[1..`endo1_ct',`endo1_ct'+1...] + mat `XPZX'=`XZ'*`ZZinv'*`XZ'' + mat `ccmat' = `XXinv'*`XPZX' + mat eigenvalues `ccrealev' `ccimagev' = `ccmat' +* Loop through endo1 to find eigenvalues=0 or 1 + foreach vn of varlist `endo1' { + local i=colnumb(`ccmat',"`vn'") + if round(`ccmat'[`i',`i'],10e-7)==0 { +* Collinear with another endog, so remove from endog list + local endo1 : list endo1-vn + local ncollin "`ncollin' `vn'" + } + if round(`ccmat'[`i',`i'],10e-7)==1 { +* Collinear with exogenous, so remove from endog and add to inexog + local endo1 : list endo1-vn + local inexog1 "`inexog1' `vn'" + local ecollin "`ecollin' `vn'" + } + } + } + +* _rmcollright crashes if no arguments supplied + capture _rmcollright `inexog1' `exexog1' if `touse' `wtexp', `rmcnocons' + +* endo1 has had within-endo collinear removed, so non-colllinear list is _rmcoll result + endo1 + local ncvars `r(varlist)' `endo1' + local allvars1 `endo1' `inexog1' `exexog1' +* collin gets collinear variables to be removed + local collin : list allvars1-ncvars +* Remove collin from exexog1 + local exexog1 : list exexog1-collin +* Remove collin from inexog1 + local inexog1 : list inexog1-collin +* Add dropped endogenous to collinear list, trimming down to "" if empty + local collin "`collin' `ncollin'" + local collin : list clean collin + +* Collinearity and duplicates warning messages, if necessary + if "`dups'" != "" { +di in gr "Warning - duplicate variables detected" +di in gr "Duplicates:" _c + Disp `dups', _col(21) + } + if "`ecollin'" != "" { +di in gr "Warning - endogenous variable(s) collinear with instruments" +di in gr "Vars now exogenous:" _c + Disp `ecollin', _col(21) + } + if "`collin'" != "" { +di in gr "Warning - collinearities detected" +di in gr "Vars dropped:" _c + Disp `collin', _col(21) + } + } + +**** End of collinearities block ************ + +**** Partial-out block ****************** + +* `partial' has all to be partialled out except for constant + if "`partial'" != "" | `partialcons'==1 { + preserve + local partialdrop : list inexog - inexog1 + local partial1 : list partial - partialdrop + local partialcheck : list partial1 - inexog1 + if ("`partialcheck'"~="") { +di in r "Error: `partialcheck' listed in partial() but not in list of regressors." + error 198 + } + local inexog1 : list inexog1 - partial1 +* Check that cluster or weight var won't be transformed + local allvars "`lhs' `inexog' `endo' `exexog'" + if "`cluster'"~="" { + local clustvarcheck : list cluster in allvars + if `clustvarcheck' { +di in r "Error: cannot use cluster variable `cluster' as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } + if "`wtexp'"~="" { + tokenize `exp', parse("*/()+-^&|~") + local wvartokens `*' + local nwvarnames : list allvars - wvartokens + local wvarnames : list allvars - nwvarnames + if "`wvarnames'"~="" { +di in r "Error: cannot use weight variables as dependent variable, regressor or IV" +di in r " in combination with -partial- option." + error 198 + } + } +* Constant is partialled out, unless nocons already specified in the first place + tempname partial_resid + foreach var of varlist `lhs' `inexog1' `endo1' `exexog1' { + qui regress `var' `partial1' if `touse' `wtexp', `noconstant' + qui predict double `partial_resid' if `touse', resid + qui replace `var' = `partial_resid' + drop `partial_resid' + } + local partial_ct : word count `partial1' + if "`noconstant'" == "" { +* partial_ct used for small-sample adjustment to regression F-stat + local partial_ct = `partial_ct' + 1 + local noconstant "noconstant" + } + } + else { +* Set count of partial vars to zero if option not used + local partial_ct 0 + local partialcons 0 + } +* Add partial_ct to small dof adjustment sdofminus + if "`nopartialsmall'"=="" { + local sdofminus = `sdofminus'+`partial_ct' + } + +********************************************* + + local insts1 `inexog1' `exexog1' + local rhs1 `endo1' `inexog1' + local iv1_ct : word count `insts1' + local rhs1_ct : word count `rhs1' + local endo1_ct : word count `endo1' + local exex1_ct : word count `exexog1' + local endoexex1_ct : word count `endo1' `exexog1' + local inexog1_ct : word count `inexog1' + + if "`noconstant'" == "" { + local cons 1 + } + else { + local cons 0 + } + + if `rhs1_ct' > `iv1_ct' { + di in red "equation not identified; must have at " /* + */ "least as many instruments not in" + di in red "the regression as there are " /* + */ "instrumented variables" + exit 481 + } + + if `rhs1_ct' + `cons' == 0 { + di in red "error: no regressors specified" + exit 102 + } + + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + if "`robust'"=="" { + local robust "robust" + } + } + if "`bw'"!="" { + local bwopt "bw(`bw')" + } + if "`kernel'"!="" { + local kernopt "kernel(`kernel')" + } +* If depname not provided (default) name is lhs variable + if "`depname'"=="" { + local depname `lhs' + } + +************************************************************************************************ +* Cross-products and basic IV coeffs, residuals and moment conditions + tempvar iota y2 yhat ivresid ivresid2 gresid gresid2 lresid lresid2 b0resid b0resid2 s1resid + tempname ysum yy yyc r2u r2c B V ivB gmmB wB lB gmmV ivest + tempname r2 r2_a ivrss lrss wbrss b0rss rss mss rmse sigmasq iv_s2 l_s2 wb_s2 b0_s2 F Fp Fdf2 + tempname S Sinv W s1Zu s2Zu b0Zu wbZu wbresid wbresid2 s1sigmasq + tempname A XZ XZa XZb Zy ZZ ZZinv XPZX XPZXinv XPZy + tempname YY Z2Z2 ZY Z2Y XXa XXb XX Xy Z2Z2inv XXinv + tempname XZWZX XZWZXinv XZWZy XZW + tempname B V B1 uZSinvZu j jp arubin arubinp arubin_lin arubin_linp tempmat + +* Generate cross-products of y, X, Z + qui matrix accum `A' = `lhs' `endo1' `exexog1' `inexog1' /* + */ if `touse' `wtexp', `noconstant' + if "`noconstant'"=="" { + matrix rownames `A' = `lhs' `endo1' `exexog1' /* + */ `inexog1' _cons + matrix colnames `A' = `lhs' `endo1' `exexog1' /* + */ `inexog1' _cons + } + else { + matrix rownames `A' = `lhs' `endo1' `exexog1' `inexog1' + matrix colnames `A' = `lhs' `endo1' `exexog1' `inexog1' + } + if `endo1_ct' > 0 { +* X'Z is [endo1 inexog1]'[exexog1 inexog1] + mat `XZ'=`A'[2..`endo1_ct'+1,`endo1_ct'+2...] +* Append portion corresponding to included exog if they (incl constant) exist + if 2+`endo1_ct'+`iv1_ct'-(`rhs1_ct'-`endo1_ct') /* + */ <= rowsof(`A') { + mat `XZ'=`XZ' \ /* + */ `A'[2+`endo1_ct'+`iv1_ct'- /* + */ (`rhs1_ct'-`endo1_ct')..., /* + */ `endo1_ct'+2...] + } +* If included exog (incl const) exist, create XX matrix in 3 steps + if `inexog1_ct' + `cons' > 0 { + mat `XXa' = `A'[2..`endo1_ct'+1, 2..`endo1_ct'+1], /* + */ `A'[2..`endo1_ct'+1, `endoexex1_ct'+2...] + mat `XXb' = `A'[`endoexex1_ct'+2..., 2..`endo1_ct'+1], /* + */ `A'[`endoexex1_ct'+2..., `endoexex1_ct'+2...] + mat `XX' = `XXa' \ `XXb' + mat `Xy' = `A'[2..`endo1_ct'+1, 1] \ `A'[`endoexex1_ct'+2..., 1] + } + else { + mat `XX' = `A'[2..`endo1_ct'+1, 2..`endo1_ct'+1] + mat `Xy' = `A'[2..`endo1_ct'+1, 1] + } + } + else { +* Cragg HOLS estimator with no endogenous variables + mat `XZ'= `A'[2+`iv1_ct'-(`rhs1_ct'-`endo1_ct')..., /* + */ 2...] + mat `XX' = `A'[`endoexex1_ct'+2..., `endoexex1_ct'+2...] + mat `Xy' = `A'[`endoexex1_ct'+2..., 1] + } + + mat `XX'=(`XX'+`XX'')/2 + mat `XXinv'=syminv(`XX') + mat `Zy'=`A'[`endo1_ct'+2...,1] + mat `ZZ'=`A'[`endo1_ct'+2...,`endo1_ct'+2...] + mat `ZZ'=(`ZZ'+`ZZ'')/2 + mat `ZZinv'=syminv(`ZZ') +* diag0cnt not superfluous - collinearity checks will catch but may be disabled + local iv_ct = rowsof(`ZZ') - diag0cnt(`ZZinv') + mat `YY'=`A'[1..`endo1_ct'+1, 1..`endo1_ct'+1] + mat `ZY' = `A'[`endo1_ct'+2..., 1..`endo1_ct'+1] + mat `XPZX'=`XZ'*`ZZinv'*`XZ'' + mat `XPZX'=(`XPZX'+`XPZX'')/2 + mat `XPZXinv'=syminv(`XPZX') + mat `XPZy'=`XZ'*`ZZinv'*`Zy' +****************************** + qui gen byte `iota'=1 + qui gen double `y2'=`lhs'^2 +* Stata summarize won't work with iweights, so must use matrix cross-product + qui matrix vecaccum `ysum' = `iota' `y2' `lhs' `wtexp' if `touse' +* N is ob count from mat accum. +* `N' is rounded down to nearest integer if iweights are used. +* If aw, pw or fw, should already be integer but use round in case of numerical imprecision. + if "`weight'" == "iweight" { + local N=int(`ysum'[1,3]) + } + else { + local N=round(`ysum'[1,3]) + } +* For yyc, use unrounded N to mimic official -regress- (needed in R-sq) + scalar `yy'=`ysum'[1,1] + scalar `yyc'=`yy'-`ysum'[1,2]^2/`ysum'[1,3] + +******************************************************************************************* +* First-step estimators: b0, wmatrix, LIML-kclass, IV. +* Generate residuals s1resid for used in 2SFEGMM and robust. +* User-supplied b0 provides value of CUE obj fn. + if "`b0'" != "" { + capture drop `yhat' + qui mat score double `yhat' = `b0' if `touse' + qui gen double `b0resid'=`lhs'-`yhat' + qui gen double `b0resid2'=`b0resid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `b0resid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `b0rss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `b0_s2'=`b0rss'/(`N'-`dofminus') + scalar `s1sigmasq'=`b0_s2' + qui gen double `s1resid'=`b0resid' + } + else if "`wmatrix'" != "" { +* GMM with arbitrary weighting matrix provides first-step estimates + local cn : colnames(`ZZ') + matrix `W'=`wmatrix' +* Rearrange/select columns to mat IV matrix + capture matsort `W' "`cn'" + local wrows = rowsof(`W') + local wcols = colsof(`W') + local zcols = colsof(`ZZ') + if _rc ~= 0 | (`wrows'~=`zcols') | (`wcols'~=`zcols') { +di as err "-wmatrix- option error: supplied matrix columns/rows do not match IV list" +exit 198 + } + mat `XZWZX'=`XZ'*`W'*`XZ'' + mat `XZWZy'=`XZ'*`W'*`Zy' + mat `XZWZX'=(`XZWZX'+`XZWZX'')/2 + mat `XZWZXinv'=syminv(`XZWZX') + mat `XZW'=`XZ'*`W' + mat `wB'=`XZWZy''*`XZWZXinv'' + + capture drop `yhat' + qui mat score double `yhat' = `wB' if `touse' + qui gen double `wbresid'=`lhs'-`yhat' + qui gen double `wbresid2'=`wbresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `wbresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `wbrss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `wb_s2'=`wbrss'/(`N'-`dofminus') + scalar `s1sigmasq'=`wb_s2' + qui gen double `s1resid'=`wbresid' + } + else if "`liml'`kclass'" != "" { +* LIML and kclass code + tempname WW WW1 Eval lambda khs XhXh XhXhinv ll + if "`kclass'" == "" { +* LIML block + matrix `WW' = `YY' - `ZY''*`ZZinv'*`ZY' + if `inexog1_ct' + `cons' > 0 { + mat `Z2Y' = `A'[`endoexex1_ct'+2..., 1..`endo1_ct'+1] + mat `Z2Z2' = `A'[`endoexex1_ct'+2..., `endoexex1_ct'+2...] + mat `Z2Z2'=(`Z2Z2'+`Z2Z2'')/2 + mat `Z2Z2inv' = syminv(`Z2Z2') + matrix `WW1' = `YY' - `Z2Y''*`Z2Z2inv'*`Z2Y' + } + else { +* Special case of no included exogenous (incl constant) + matrix `WW1' = `YY' + } + matrix `WW'=(`WW'+`WW'')/2 + mata: M=matpowersym(st_matrix("`WW'"), -0.5) + mata: Eval=symeigenvalues(makesymmetric(M*st_matrix("`WW1'")*M)) + mata: lambda=rowmin(Eval) + mata: st_numscalar("r(lambda)", lambda) + scalar `lambda'=r(lambda) + + if `fuller'==0 { +* Basic LIML. Macro kclass2 is the scalar. + scalar `kclass2'=`lambda' + } + else { +* Fuller LIML + if `fuller' > (`N'-`iv_ct') { +di as err "error: invalid choice of Fuller LIML parameter" + exit 198 + } + scalar `kclass2' = `lambda' - `fuller'/(`N'-`iv_ct') + } +* End of LIML block + } + mat `XhXh'=(1-`kclass2')*`XX'+`kclass2'*`XPZX' + mat `XhXh'=(`XhXh'+`XhXh'')/2 + mat `XhXhinv'=syminv(`XhXh') + mat `lB'=`Xy''*`XhXhinv'*(1-`kclass2') + `kclass2'*`Zy''*`ZZinv'*`XZ''*`XhXhinv' + capture drop `yhat' + qui mat score double `yhat'=`lB' if `touse' + qui gen double `lresid'=`lhs' - `yhat' + qui gen double `lresid2'=`lresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `lresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `lrss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `l_s2'=`lrss'/(`N'-`dofminus') + scalar `s1sigmasq'=`l_s2' + qui gen double `s1resid'=`lresid' + } + else { +* IV resids are 1st-step GMM resids +* In these expressions, ignore scaling of W + mat `ivB' = `XPZy''*`XPZXinv'' + mat `XZWZX'=`XPZX' + mat `XZWZXinv'=`XPZXinv' + mat `XZW'=`XZ'*`ZZinv' + capture drop `yhat' + qui mat score double `yhat' = `ivB' if `touse' + qui gen double `ivresid'=`lhs'-`yhat' + qui gen double `ivresid2'=`ivresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `ivresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `ivrss'=`ysum'[1,1] + scalar `iv_s2'=`ivrss'/(`N'-`dofminus') + scalar `s1sigmasq'=`iv_s2' + qui gen double `s1resid'=`ivresid' + } +* Orthogonality conditions using step 1 residuals + qui mat vecaccum `s1Zu'=`s1resid' `exexog1' `inexog1' /* + */ `wtexp' if `touse', `noconstant' + +* call abw code if bw() is defined and bw(auto) selected + if "`bw'" != "" { + if `bw' == -1 { + tempvar abwtouse + gen byte `abwtouse' = (`s1resid' < .) + abw `s1resid' `exexog1' `inexog1' `abwtouse', noconstant kernel(`kernel') + local bw `r(abw)' + local bwopt "bw(`bw')" + local bwchoice "`r(bwchoice)'" + } + } +******************************************************************************************* +* S covariance matrix of orthogonality conditions +******************************************************************************************* +* If user-supplied S matrix is used, use it + if "`smatrix'" != "" { + local cn : colnames(`ZZ') + matrix `S'=`smatrix' +* Rearrange/select columns to mat IV matrix + capture matsort `S' "`cn'" + local srows = rowsof(`S') + local scols = colsof(`S') + local zcols = colsof(`ZZ') + if _rc ~= 0 | (`srows'~=`zcols') | (`scols'~=`zcols') { +di as err "-smatrix- option error: supplied matrix columns/rows do not match IV list" +exit 198 + } + mat `S' = (`S' + `S'') / 2 + mat `Sinv'=syminv(`S') + local rankS = rowsof(`Sinv') - diag0cnt(`Sinv') + } + +******************************************************************************************* +* Start robust block for robust-HAC S and Sinv +* Do not enter if user supplies smatrix or if CUE + if "`robust'`cluster'" != "" & "`cue'"=="" & "`smatrix'"=="" { +* Optimal weighting matrix +* Block calculates S_0 robust matrix +* _robust has same results as +* mat accum `S'=`exexog1' `inexog1' [iweight=`ivresid'^2] if `touse' +* mat `S' = `S'*1/`N' +* _robust doesn't work properly with TS variables, so must first tsrevar + tsrevar `exexog1' `inexog1' + local TSinsts1 `r(varlist)' +* Create identity matrix with matching col/row names + mat `S'=I(colsof(`s1Zu')) + if "`noconstant'"=="" { + mat colnames `S' = `TSinsts1' "_cons" + mat rownames `S' = `TSinsts1' "_cons" + } + else { + mat colnames `S' = `TSinsts1' + mat rownames `S' = `TSinsts1' + } + _robust `s1resid' `wtexp' if `touse', variance(`S') `clopt' minus(0) + if "`cluster'"!="" { + local N_clust=r(N_clust) + } + mat `S' = `S'*1/`N' +* Above doesn't work properly with iweights (i.e. yield same matrix as fw), +* hence iweight trap at start + if "`kernel'" != "" { +* HAC block for S_1 onwards matrices + tempvar vt1 + qui gen double `vt1' = . + tempname tt tx kw karg ow +* Use insts with TS ops removed and with iota (constant) column + if "`noconstant'"=="" { + local insts1c "`TSinsts1' `iota'" + } + else { + local insts1c "`TSinsts1'" + } + local iv1c_ct : word count `insts1c' +* "tau=0 loop" is S_0 block above for all robust code + local tau=1 +* Spectral windows require looping through all T-1 autocovariances + if "`window'" == "spectral" { + local TAU = `T'-1 +di in ye "Computing kernel ..." + } + else { + local TAU=`bw' + } + if "`weight'" == "" { +* If no weights specified, define neutral ow variable and weight expression for code below + qui gen byte `ow'=1 + local wtexp `"[fweight=`wvar']"' + } + else { +* pweights and aweights + summ `wvar' if `touse', meanonly + qui gen double `ow' = `wvar'/r(mean) + } + while `tau' <= `TAU' { + capture mat drop `tt' + local i 1 + while `i' <= `iv1c_ct' { + local x : word `i' of `insts1c' +* Add lags defined with TS operators + local Lx "L`tau'.`x'" + local Ls1resid "L`tau'.`s1resid'" + local Low "L`tau'.`ow'" + qui replace `vt1' = `Lx'*`s1resid'* /* + */ `Ls1resid'*`Low'*`ow' if `touse' +* Use capture here because there may be insufficient observations, e.g., if +* the IVs include lags and tau=N-1. _rc will be 2000 in this case. +* Bug in vecaccum means that if there is only 1 observation it will crash with insufficient obs. +* Replace missings with zeros to head this off. + qui replace `vt1' = 0 if `vt1'==. & `touse' + capture mat vecaccum `tx' = `vt1' `insts1c' /* + */ if `touse', nocons + if _rc == 0 { + mat `tt' = nullmat(`tt') \ `tx' + } + local i = `i'+1 + } +* bw = bandwidth, karg is argument to kernel function, kw is kernel function (weight) + scalar `karg' = `tau'/(`bw') + if "`kernel'" == "Truncated" { + scalar `kw'=1 + } + if "`kernel'" == "Bartlett" { + scalar `kw'=(1-`karg') + } + if "`kernel'" == "Parzen" { + if `karg' <= 0.5 { + scalar `kw' = 1-6*`karg'^2+6*`karg'^3 + } + else { + scalar `kw' = 2*(1-`karg')^3 + } + } + if "`kernel'" == "Tukey-Hanning" { + scalar `kw'=0.5+0.5*cos(_pi*`karg') + } + if "`kernel'" == "Tukey-Hamming" { + scalar `kw'=0.54+0.46*cos(_pi*`karg') + } + if "`kernel'" == "Tent" { + scalar `kw'=2*(1-cos(`tau'*`karg')) / (`karg'^2) + } + if "`kernel'" == "Daniell" { + scalar `kw'=sin(_pi*`karg') / (_pi*`karg') + } + if "`kernel'" == "Quadratic spectral" { + scalar `kw'=25/(12*_pi^2*`karg'^2) /* + */ * ( sin(6*_pi*`karg'/5)/(6*_pi*`karg'/5) /* + */ - cos(6*_pi*`karg'/5) ) + } +* Need -capture-s here because tt may not exist (because of insufficient observations/lags) + capture mat `tt' = (`tt'+`tt'')*`kw'*1/`N' + if _rc == 0 { + mat `S' = `S' + `tt' + } + local tau = `tau'+1 + } + if "`weight'" == "" { +* If no weights specified, remove neutral weight variables + local wtexp "" + } + } +* To give S the right col/row names + mat `S'=`S'+0*diag(`s1Zu') +* Right approach is to adjust S by N/(N-dofminus) if NOT cluster +* because clustered S is already "adjusted" + if "`cluster'"=="" { + mat `S'=`S'*`N'/(`N'-`dofminus') + } + + mat `S'=(`S'+`S'')/2 + mat `Sinv'=syminv(`S') + local rankS = rowsof(`Sinv') - diag0cnt(`Sinv') + } + +* End robust-HAC S and Sinv block +************************************************************************************ +* Block for non-robust S and Sinv, including autocorrelation-consistent (AC). +* Do not enter if user supplies smatrix or if cue + + if "`robust'`cluster'`cue'`smatrix'"=="" { +* First do with S_0 (=S for simple IV) +* Step 1 sigma^2 is IV sigma^2 unless b0 or wmatrix provided + mat `S' = `s1sigmasq'*`ZZ'*(1/`N') + + if "`kernel'" != "" { +* AC code for S_1 onwards matrices + tempvar vt1 + qui gen double `vt1' = . + tempname tt tx kw karg ow sigttj +* Use insts with TS ops removed and with iota (constant) column + tsrevar `exexog1' `inexog1' + local TSinsts1 `r(varlist)' + if "`noconstant'"=="" { + local insts1c "`TSinsts1' `iota'" + } + else { + local insts1c "`TSinsts1'" + } + local iv1c_ct : word count `insts1c' +* "tau=0 loop" is S_0 block above + local tau=1 +* Spectral windows require looping through all T-1 autocovariances + if "`window'" == "spectral" { + local TAU=`T'-1 +di in ye "Computing kernel ..." + } + else { + local TAU=`bw' + } + if "`weight'" == "" { +* If no weights specified, define neutral ow variable and wtexp for code below + qui gen byte `ow'=1 + local wtexp `"[fweight=`wvar']"' + } + else { +* pweights and aweights + sum `wvar' if `touse', meanonly + qui gen double `ow' = `wvar'/r(mean) + } + while `tau' <= `TAU' { + capture mat drop `tt' + local i 1 +* errflag signals problems that make this loop's tt invalid + local errflag 0 +* Additional marksample/markout required so that treatment of MVs is consistent across all IVs and obs + marksample touse2 + markout `touse2' `insts1c' L`tau'.(`insts1c') L`tau'.(`s1resid') + + local Low "L`tau'.`ow'" + while `i' <= `iv1c_ct' { + local x : word `i' of `insts1c' +* Add lags defined with TS operators + local Lx "L`tau'.`x'" + qui replace `vt1'=. + qui replace `vt1' = `Lx'*`Low'*`ow' if `touse' & `touse2' +* Use capture here because there may be insufficient observations, e.g., if +* the IVs include lags and tau=N-1. _rc will be 2000 in this case. +* Bug in vecaccum means that if there is only 1 observation it will crash with insufficient obs. +* Replace missings with zeros to head this off. + qui replace `vt1' = 0 if `vt1'==. & `touse' + capture mat vecaccum `tx' = `vt1' `insts1c' /* + */ if `touse', nocons + + if _rc == 0 { + mat `tt' = nullmat(`tt') \ `tx' + } + local i = `i'+1 + } + + capture mat `tt' = 1/`N' * `tt' + if _rc != 0 { + local errflag = 1 + } + local Ls1resid "L`tau'.`s1resid'" + tempvar ivLiv + qui gen double `ivLiv' = `s1resid'*`Ls1resid'*`ow'*`Low' if `touse' + qui sum `ivLiv' if `touse', meanonly + scalar `sigttj' = r(sum)/(`N'-`dofminus') + capture mat `tt' = `sigttj' * `tt' +* bw = bandwidth, karg is argument to kernel function, kw is kernel function (weight) + scalar `karg' = `tau'/(`bw') + if "`kernel'" == "Truncated" { + scalar `kw'=1 + } + if "`kernel'" == "Bartlett" { + scalar `kw'=(1-`karg') + } + if "`kernel'" == "Parzen" { + if `karg' <= 0.5 { + scalar `kw' = 1-6*`karg'^2+6*`karg'^3 + } + else { + scalar `kw' = 2*(1-`karg')^3 + } + } + if "`kernel'" == "Tukey-Hanning" { + scalar `kw'=0.5+0.5*cos(_pi*`karg') + } + if "`kernel'" == "Tukey-Hamming" { + scalar `kw'=0.54+0.46*cos(_pi*`karg') + } + if "`kernel'" == "Tent" { + scalar `kw'=2*(1-cos(`tau'*`karg')) / (`karg'^2) + } + if "`kernel'" == "Daniell" { + scalar `kw'=sin(_pi*`karg') / (_pi*`karg') + } + if "`kernel'" == "Quadratic spectral" { + scalar `kw'=25/(12*_pi^2*`karg'^2) /* + */ * ( sin(6*_pi*`karg'/5)/(6*_pi*`karg'/5) /* + */ - cos(6*_pi*`karg'/5) ) + } +* Need -capture-s here because tt may not exist (because of insufficient observations/lags) + capture mat `tt' = (`tt'+`tt'')*`kw' + if _rc != 0 { + local errflag = 1 + } +* Accumulate if tt is valid + if `errflag' == 0 { + capture mat `S' = `S' + `tt' + } + local tau = `tau'+1 + } + if "`weight'" == "" { +* If no weights specified, remove neutral weight variables + local wtexp "" + } + } +* End of AC code +* To give S the right col/row names + mat `S'=`S'+0*diag(`s1Zu') + mat `S'=(`S'+`S'')/2 + mat `Sinv'=syminv(`S') + local rankS = rowsof(`Sinv') - diag0cnt(`Sinv') + } + +* End of non-robust S and Sinv code (including AC) +******************************************************************************************* +* 2nd step and final coefficients +******************************************************************************************* +* User-supplied b0. CUE objective function. + if "`b0'" ~= "" { + mat `B' = `b0' + scalar `rss'=`b0rss' + scalar `sigmasq'=`b0_s2' + mat `W' = `Sinv' + } +******************************************************************************************* +* Block for gmm 2nd step to get coefficients and 2nd step residuals + +* Non-robust IV, LIML, k-class, CUE do not enter + if "`gmm2s'`robust'`cluster'`kernel'`wmatrix'" != "" & "`cue'"=="" { + mat `tempmat'=`XZ'*`Sinv'*`XZ'' + mat `tempmat'=(`tempmat'+`tempmat'')/2 + mat `B1'=syminv(`tempmat') + mat `B1'=(`B1'+`B1'')/2 + mat `gmmB'=(`B1'*`XZ'*`Sinv'*`Zy')' + + capture drop `yhat' + qui mat score double `yhat'=`gmmB' if `touse' + qui gen double `gresid'=`lhs'-`yhat' + qui gen double `gresid2'=`gresid'^2 + qui mat vecaccum `s2Zu'=`gresid' `exexog1' `inexog1' /* + */ `wtexp' if `touse', `noconstant' + } +******************************************************************************************* +* GMM with arbitrary weighting matrix + if ("`wmatrix'"~="") & ("`gmm2s'"=="") & ("`liml'`kclass'`cue'"=="") & "`b0'"=="" { + mat `B'=`wB' + scalar `rss'=`wbrss' + scalar `sigmasq'=`wb_s2' +* Weighting matrix wmatrix already checked and assigned to macro W + } +******************************************************************************************* +* IV coefficients + if ("`wmatrix'"=="") & ("`gmm2s'"=="") & ("`liml'`kclass'`cue'"=="") & "`b0'"=="" { + mat `B'=`ivB' + scalar `rss'=`ivrss' + scalar `sigmasq'=`iv_s2' +* IV weighting matrix. By convention, no small-sample adjustment (consistent with S) +* No dofminus correction (needed in sigma^2, not ZZ) + mat `W' = `ZZinv'*`N'/`iv_s2' + } +******************************************************************************************* +* LIML, k-class coefficients + if "`liml'`kclass'" ~= "" { + mat `B'=`lB' + scalar `rss'=`lrss' + scalar `sigmasq'=`l_s2' +* No weighting matrix. + } +******************************************************************************************* +* Efficient GMM coefficients + if "`gmm2s'"!="" & ("`liml'`kclass'`cue'"=="") & "`b0'"=="" { + mat `B'=`gmmB' + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `gresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `rss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `sigmasq'=`rss'/(`N'-`dofminus') + mat `W'=`Sinv' + } +******************************************************************************************* +* Var-cov matrix +******************************************************************************************* +* Expressions below multipy by N because we are working with cross-products (XZ) not vcvs (Qxz) +* Efficient GMM: homoskedastic IV, 2-step FEGMM. LIML, k-class, CUE handled separately. +* No robust, cluster, kernel => must be efficient GMM +* GMM option => must be efficient GMM +* b0 => must be efficient GMM +* wmatrix => (possibly) inefficient GMM + tempname rankV + if ("`robust'`cluster'`kernel'`liml'`kclass'`cue'`wmatrix'"=="") /* + */ | ("`gmm2s'"~="") /* + */ | ("`b0'"~="") { + mat `tempmat'=`XZ'*`Sinv'*`XZ'' + mat `tempmat'=(`tempmat'+`tempmat'')/2 + mat `V' = syminv(`tempmat')*`N' + mat `V'=(`V'+`V'')/2 + scalar `rankV'=rowsof(`tempmat') - diag0cnt(`tempmat') + } +* Possibly inefficient GMM: robust of all sorts with no 2nd step. LIML, k-class, CUE handled separately. + else if ("`liml'`kclass'`cue'"=="") { + mat `V'=`XZWZXinv'*`XZW'*`S'* /* + */ `XZW''*`XZWZXinv'*`N' + mat `V'=(`V'+`V'')/2 + mat `tempmat'=syminv(`V') + scalar `rankV'=rowsof(`tempmat') - diag0cnt(`tempmat') + } +* LIML and k-class non-robust + else if ("`liml'`kclass'" ~= "") & ("`robust'`cluster'`kernel'" == "") { + if "`coviv'"== "" { +* LIML or k-class cov matrix + mat `V'=`sigmasq'*`XhXhinv' + scalar `rankV'=rowsof(`XhXh') - diag0cnt(`XhXh') + } + else { +* IV cov matrix + mat `V'=`sigmasq'*`XPZXinv' + scalar `rankV'=rowsof(`XPZXinv') - diag0cnt(`XPZXinv') + } + mat `V'=(`V'+`V'')/2 + } +* LIML and k-class robust + else if ("`liml'`kclass'" ~= "") & ("`robust'`cluster'`kernel'" ~= "") { + if "`coviv'"== "" { +* Use LIML or k-class cov matrix + mat `V'=`XhXhinv'*`XZ'*`ZZinv'*`S'*`N'* /* + */ `ZZinv'*`XZ''*`XhXhinv' + } + else { +* Use IV cov matrix + mat `V'=`XPZXinv'*`XZ'*`ZZinv'*`S'*`N'* /* + */ `ZZinv'*`XZ''*`XPZXinv' + } + mat `V'=(`V'+`V'')/2 + mat `tempmat'=syminv(`V') + scalar `rankV'=rowsof(`tempmat') - diag0cnt(`tempmat') + } +* End of VCV block +******************************************************************************** +* Sargan-Hansen-Anderson-Rubin statistics +******************************************************************************************* +* Robust requires using gmm residuals; otherwise use iv residuals. CUE handled separately. +* wmatrix is possibly inefficient GMM so require 2nd step residuals +* b0 => return value of CUE objective function. b0 is efficient GMM. + if ("`robust'`cluster'`kernel'`wmatrix'" == "") & ("`cue'"=="") & ("`b0'"=="") { + mat `uZSinvZu'= (`s1Zu'/`N')*`Sinv'*(`s1Zu''/`N') + scalar `j' = `N'*`uZSinvZu'[1,1] + } + if ("`robust'`cluster'`kernel'`wmatrix'" ~= "") & ("`cue'"=="") & ("`b0'"=="") { + mat `uZSinvZu'= (`s2Zu'/`N')*`Sinv'*(`s2Zu''/`N') + scalar `j' = `N'*`uZSinvZu'[1,1] + } + if "`b0'"~="" { + mat `uZSinvZu'= (`s1Zu'/`N')*`Sinv'*(`s1Zu''/`N') + scalar `j' = `N'*`uZSinvZu'[1,1] + } + if "`liml'" != "" { +* Also save Anderson-Rubin overid stat if LIML +* Note dofminus is required because unlike Sargan and 2-step GMM J, doesn't derive from S + scalar `arubin'=(`N'-`dofminus')*ln(`lambda') + scalar `arubin_lin'=(`N'-`dofminus')*(`lambda'-1) + } + +*************************************************************************************** +* Block for cue gmm +******************************************************************************************* + if "`cue'" != "" { + tempname b_init temphold + capture _estimates hold `temphold', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + if "`robust'`cluster'`bwopt'"~="" { + local init_opt "gmm2s" + } + qui `ivreg2_cmd' `lhs' `inexog1' (`endo1'=`exexog1') `wtexp' /* + */ if `touse', `robust' `clopt' `bwopt' `kernopt' `dofmopt' /* + */ `noconstant' `init_opt' noid nocollin + if e(rankzz)>e(rankxx) { + if "`cueinit'"== "" { + mat `b_init'=e(b) + } + else { + mat `b_init'=`cueinit' + } +* Use ML for numerical optimization. Always nocons since not there by user or partialled-out +* Set up variables and options as globals + global IV_lhs "`lhs'" + global IV_inexog "`inexog1'" + global IV_endog "`endo1'" + global IV_exexog "`exexog1'" + global IV_wt "`wtexp'" + global IV_opt "`noconstant' `robust' `clopt' `bwopt' `kernopt' `dofmopt'" +* `gmm2s' not in IV_opt because cue+gmm2s not allowed + ml model d0 `ivreg2_cmd'_cue (`lhs' = `endo1' `inexog1', `noconstant') `wtexp' /* + */ if `touse', maximize init(`b_init') `cueoptions' /* + */ crittype(neg GMM obj function -J) /* + */ collinear nooutput nopreserve missing noscvars + } + else { +di in ye "Equation exactly-identified: CUE and 2-step GMM coincide" + } + + mat `B'=e(b) + mat colnames `B' = _: +* Last call to get vcv, j, Sinv etc. + qui `ivreg2_cmd' `lhs' `inexog1' (`endo1'=`exexog1') `wtexp' if `touse', /* + */ `noconstant' `robust' `clopt' `bwopt' `kernopt' `dofmopt' /* + */ b0(`B') noid nocollin + +* Save all results + mat `V'=e(V) + mat `S'=e(S) + mat `Sinv'=syminv(`S') + mat `W'=`Sinv' + + local rankS = e(rankS) + scalar `j'=e(j) + local df_m = e(df_m) + scalar `rankV'=e(rankV) + + if "`cluster'" != "" { + local N_clust=e(N_clust) + } + capture drop `yhat' + qui mat score double `yhat'=`B' if `touse' + qui gen double `gresid'=`lhs'-`yhat' + qui gen double `gresid2'=`gresid'^2 + capture drop `ysum' + qui matrix vecaccum `ysum' = `iota' `gresid2' /* + */ `wtexp' if `touse', `noconstant' + scalar `rss'= `ysum'[1,1] +* Adjust sigma-squared for dofminus + scalar `sigmasq'=`rss'/(`N'-`dofminus') + + macro drop IV_lhs IV_inexog IV_endog IV_exexog IV_wt IV_opt + capture _estimates unhold `temphold' + + } + +******************************************************************************************* +* RSS, counts, dofs, F-stat, small-sample corrections +******************************************************************************************* + + scalar `rmse'=sqrt(`sigmasq') + if "`noconstant'"=="" { + scalar `mss'=`yyc' - `rss' + } + else { + scalar `mss'=`yy' - `rss' + } + +* Counts modified to include constant if appropriate + if "`noconstant'"=="" { + local iv1_ct = `iv1_ct' + 1 + local rhs1_ct = `rhs1_ct' + 1 + } +* Correct count of rhs variables accounting for dropped collinear vars +* Count includes constant + + local rhs_ct = rowsof(`XX') - diag0cnt(`XXinv') + local Fdf1 = `rhs_ct' - `cons' +* CUE handled separately + if "`cue'"=="" { + local df_m = `rhs_ct' - `cons' + (`sdofminus'-`partialcons') + } + if "`cluster'"=="" { +* Residual dof adjusted for dofminus + local df_r = `N' - `rhs_ct' - `dofminus' - `sdofminus' + } + else { +* To match Stata, subtract 1 + local df_r = `N_clust' - 1 + } + +* Sargan-Hansen J dof and p-value +* df=0 doesn't guarantee j=0 since can be call to get value of CUE obj fn + local jdf = `iv_ct' - `rhs_ct' + if `jdf' == 0 & "`b0'"=="" { + scalar `j' = 0 + } + else { + scalar `jp' = chiprob(`jdf',`j') + } + if "`liml'"~="" { + scalar `arubinp' = chiprob(`jdf',`arubin') + scalar `arubin_linp' = chiprob(`jdf',`arubin_lin') + } + +* Small sample corrections for var-cov matrix. +* If robust, the finite sample correction is N/(N-K), and with no small +* we change this to 1 (a la Davidson & MacKinnon 1993, p. 554, HC0). +* If cluster, the finite sample correction is (N-1)/(N-K)*M/(M-1), and with no small +* we change this to 1 (a la Wooldridge 2002, p. 193), where M=number of clusters. + + if "`small'" != "" { + if "`cluster'"=="" { + matrix `V'=`V'*(`N'-`dofminus')/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + } + else { + matrix `V'=`V'*(`N'-1)/(`N'-`rhs_ct'-`sdofminus') /* + */ * `N_clust'/(`N_clust'-1) + } + scalar `sigmasq'=`rss'/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + scalar `rmse'=sqrt(`sigmasq') + } + + scalar `r2u'=1-`rss'/`yy' + scalar `r2c'=1-`rss'/`yyc' + if "`noconstant'"=="" { + scalar `r2'=`r2c' + scalar `r2_a'=1-(1-`r2')*(`N'-1)/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + } + else { + scalar `r2'=`r2u' + scalar `r2_a'=1-(1-`r2')*`N'/(`N'-`rhs_ct'-`dofminus'-`sdofminus') + } + +* Fstat +* To get it to match Stata's, must post separately with dofs and then do F stat by hand +* in case weights generate non-integer obs and dofs +* Create copies so they can be posted + tempname FB FV + mat `FB'=`B' + mat `FV'=`V' + capture ereturn post `FB' `FV' +* If the cov matrix wasn't positive definite, the post fails with error code 506 + local rc = _rc + if `rc' != 506 { + local Frhs1 `rhs1' + capture test `Frhs1' + if "`small'" == "" { + if "`cluster'"=="" { + capture scalar `F' = r(chi2)/`Fdf1' * `df_r'/(`N'-`dofminus') + } + else { + capture scalar `F' = r(chi2)/`Fdf1' * /* +* sdofminus used here so that F-stat matches test stat from regression with no partial and small + */ (`N_clust'-1)/`N_clust' * (`N'-`rhs_ct'-`sdofminus')/(`N'-1) + } + } + else { + capture scalar `F' = r(chi2)/`Fdf1' + } + capture scalar `Fp'=Ftail(`Fdf1',`df_r',`F') + capture scalar `Fdf2'=`df_r' + } + +* If j==. or vcv wasn't full rank, then vcv problems and F is meaningless + if `j' == . | `rc'==506 { + scalar `F' = . + scalar `Fp' = . + } + +* End of counts, dofs, F-stat, small sample corrections +******************************************************************************************* +* orthog option: C statistic (difference of Sargan statistics) +******************************************************************************************* +* Requires j dof from above + if "`orthog'"!="" { + tempname cj cstat cstatp +* Initialize cstat + scalar `cstat' = 0 +* Each variable listed must be in instrument list. +* To avoid overwriting, use cendo, cinexog1, cexexog, cendo_ct, cex_ct + local cendo1 "`endo1'" + local cinexog1 "`inexog1'" + local cexexog1 "`exexog1'" + local cinsts1 "`insts1'" + local crhs1 "`rhs1'" + local clist1 "`orthog'" + local clist_ct : word count `clist1' + +* Check to see if c-stat vars are in original list of all ivs +* cinexog1 and cexexog1 are after c-stat exog list vars have been removed +* cendo1 is endo1 after included exog being tested has been added + foreach x of local clist1 { + local llex_ct : word count `cexexog1' + Subtract cexexog1 : "`cexexog1'" "`x'" + local cex1_ct : word count `cexexog1' + local ok = `llex_ct' - `cex1_ct' + if (`ok'==0) { +* Not in excluded, check included and add to endog list if it appears + local llin_ct : word count `cinexog1' + Subtract cinexog1 : "`cinexog1'" "`x'" + local cin1_ct : word count `cinexog1' + local ok = `llin_ct' - `cin1_ct' + if (`ok'==0) { +* Not in either list +di in r "Error: `x' listed in orthog() but does not appear as exogenous." + error 198 + } + else { + local cendo1 "`cendo1' `x'" + } + } + } + +* If robust, HAC/AC or GMM (but not LIML or IV), create optimal weighting matrix to pass to ivreg2 +* by extracting the submatrix from the full S and then inverting. +* This guarantees the C stat will be non-negative. See Hayashi (2000), p. 220. +* Calculate C statistic with recursive call to ivreg2 +* Collinearities may cause problems, hence -capture-. +* smatrix works generally, including homoskedastic case with Sargan stat + capture { + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + if "`kernel'" != "" { + local bwopt "bw(`bw')" + local kernopt "kernel(`kernel')" + } +* clopt is omitted because it requires calculation of numbers of clusters, which is done +* only when S matrix is calculated + capture `ivreg2_cmd' `lhs' `cinexog1' /* + */ (`cendo1'=`cexexog1') /* + */ if `touse' `wtexp', `noconstant' /* + */ `options' `small' `robust' /* + */ `gmm2s' `bwopt' `kernopt' `dofmopt' /* + */ smatrix("`S'") noid nocollin + local rc = _rc + if `rc' == 481 { + scalar `cstat' = 0 + local cstatdf = 0 + } + else { + scalar `cj'=e(j) + local cjdf=e(jdf) + } + scalar `cstat' = `j' - `cj' + local cstatdf = `jdf' - `cjdf' + _estimates unhold `ivest' + scalar `cstatp'= chiprob(`cstatdf',`cstat') +* Collinearities may cause C-stat dof to differ from the number of variables in orthog() +* If so, set cstat=0 + if `cstatdf' != `clist_ct' { + scalar `cstat' = 0 + } + } + } +* End of orthog block + +******************************************************************************************* +* Endog option +******************************************************************************************* +* Uses recursive call with orthog + if "`endogtest'"!="" { + tempname estat estatp +* Initialize estat + scalar `estat' = 0 +* Each variable to test must be in endo list. +* To avoid overwriting, use eendo, einexog1, etc. + local eendo1 "`endo1'" + local einexog1 "`inexog1'" + local einsts1 "`insts1'" + local elist1 "`endogtest'" + local elist_ct : word count `elist1' +* Check to see if endog test vars are in original endo1 list of endogeneous variables +* eendo1 and einexog1 are after endog test vars have been removed from endo and added to inexog + foreach x of local elist1 { + local llendo_ct : word count `eendo1' + local eendo1 : list eendo1 - x + local eendo1_ct : word count `eendo1' + local ok = `llendo_ct' - `eendo1_ct' + if (`ok'==0) { +* Not in endogenous list +di in r "Error: `x' listed in endog() but does not appear as endogenous." + error 198 + } + else { + local einexog1 "`einexog1' `x'" + } + } +* Recursive call to ivreg2 using orthog option to obtain endogeneity test statistic +* Collinearities may cause problems, hence -capture-. + capture { + capture _estimates hold `ivest', restore + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } + capture `ivreg2_cmd' `lhs' `einexog1' /* + */ (`eendo1'=`exexog1') if `touse' /* + */ `wtexp', `noconstant' `robust' `clopt' /* + */ `gmm2s' `liml' `bwopt' `kernopt' /* + */ `small' `dofmopt' `options' /* + */ orthog(`elist1') noid nocollin + local rc = _rc + if `rc' == 481 { + scalar `estat' = 0 + local estatdf = 0 + } + else { + scalar `estat'=e(cstat) + local estatdf=e(cstatdf) + scalar `estatp'=e(cstatp) + } + _estimates unhold `ivest' +* Collinearities may cause endog stat dof to differ from the number of variables in endog() +* If so, set estat=0 + if `estatdf' != `elist_ct' { + scalar `estat' = 0 + } + } +* End of endogeneity test block + } + +******************************************************************************************* +* Rank identification and redundancy block +******************************************************************************************* + if `endo1_ct' > 0 & "`noid'"=="" { + +* id=underidentification statistic, wid=weak identification statistic + tempname rkmatrix idrkstat widrkstat iddf idp + tempname ccf cdf rkf cceval cdeval cd cc + tempname idstat widstat + +* Anderson canon corr underidentification statistic if homo, rk stat if not +* Need id stat for testing full rank=(#cols-1) but might need all rk stats for -redundant- test + if "`redundant'"=="" { + local rkopt "full" + } + else { + local rkopt "all" + } + qui ranktest (`endo1') (`exexog1') `wtexp' if `touse', partial(`inexog1') `rkopt' /* + */ `noconstant' `robust' `clopt' `bwopt' `kernopt' + mat `rkmatrix'=r(rkmatrix) + if "`cluster'"=="" { + scalar `idstat'=r(chi2)/r(N)*(`N'-`dofminus') + } + else { +* No dofminus adjustment needed for cluster-robust + scalar `idstat'=r(chi2) + } + mat `cceval'=r(ccorr) + mat `cdeval' = J(1,`endo1_ct',.) + forval i=1/`endo1_ct' { + mat `cceval'[1,`i'] = (`cceval'[1,`i'])^2 + mat `cdeval'[1,`i'] = `cceval'[1,`i'] / (1 - `cceval'[1,`i']) + } + local iddf = `iv_ct' - (`rhs_ct'-1) + scalar `idp' = chiprob(`iddf',`idstat') +* Cragg-Donald F statistic. +* Under homoskedasticity, Wald cd eigenvalue = cc/(1-cc) Anderson canon corr eigenvalue. + scalar `cd'=`cdeval'[1,`endo1_ct'] + scalar `cdf'=`cd'*(`N'-`sdofminus'-`iv_ct'-`dofminus')/`exex1_ct' + +* Weak id statistic is Cragg-Donald F stat, rk Wald F stat if not + if "`robust'`cluster'`kernel'"=="" { + scalar `widstat'=`cdf' + } + else { +* Need only test of full rank + qui ranktest (`endo1') (`exexog1') `wtexp' if `touse', partial(`inexog1') full wald /* + */ `noconstant' `robust' `clopt' `bwopt' `kernopt' +* sdofminus used here so that F-stat matches test stat from regression with no partial + if "`cluster'"=="" { + scalar `rkf'=r(chi2)/r(N)*(`N'-`iv_ct'-`sdofminus'-`dofminus')/`exex1_ct' + } + else { + scalar `rkf'=r(chi2)/(`N'-1) /* + */ *(`N'-`iv_ct'-`sdofminus') /* + */ *(`N_clust'-1)/(`N_clust')/`exex1_ct' + } + scalar `widstat'=`rkf' + } + } + +* LM redundancy test + if `endo1_ct' > 0 & "`redundant'" ~= "" & "`noid'"=="" { +* Use K-P rk statistics and LM version of test +* Statistic is the rank of the matrix of Z_1B*X_2, where Z_1B are the possibly redundant +* instruments and X_1 are the endogenous regressors; both have X_2 (exogenous regressors) +* and Z_1A (maintained excluded instruments) partialled out. LM test of rank is +* is numerically equivalent to estimation of set of RF regressions and performing +* standard LM test of possibly redundant instruments. + + local redlist1 "`redundant'" + local rexexog1 : list exexog1 - redlist1 + local notlisted : list redlist1 - exexog1 + if "`notlisted'" ~= "" { +di in r "Error: `notlisted' listed in redundant() but does not appear as excluded instrument." + error 198 + } + local rexexog1_ct : word count `rexexog1' + if `rexexog1_ct' < `endo1_ct' { +di in r "Error: specification with redundant() option is unidentified (fails rank condition)" + error 198 + } +* LM version requires only -nullrank- rk statistics so would not need -all- option + tempname rrkmatrix + qui ranktest (`endo1') (`redlist1') `wtexp' if `touse', partial(`inexog1' `rexexog1') null /* + */ `noconstant' `robust' `clopt' `bwopt' `kernopt' + mat `rrkmatrix'=r(rkmatrix) + tempname redstat redp + local redlist_ct : word count `redlist1' +* dof adjustment needed because it doesn't use the adjusted S + if "`cluster'"=="" { + scalar `redstat' = `rrkmatrix'[1,1]/r(N)*(`N'-`dofminus') + } + else { +* No dofminus adjustment needed for cluster-robust + scalar `redstat' = `rrkmatrix'[1,1] + } + local reddf = `endo1_ct'*`redlist_ct' + scalar `redp' = chiprob(`reddf',`redstat') + } + +* End of identification stats block + +******************************************************************************************* +* Error-checking block +******************************************************************************************* + +* Check if adequate number of observations + if `N' <= `iv_ct' { +di in r "Error: number of observations must be greater than number of instruments" +di in r " including constant." + error 2001 + } + +* Check if robust VCV matrix is of full rank + if "`gmm2s'`robust'`cluster'`kernel'" != "" { +* Robust covariance matrix not of full rank means either a singleton dummy or too few +* clusters (in which case the indiv SEs are OK but no F stat or 2-step GMM is possible), +* or there are too many AC/HAC-lags, or the HAC covariance estimator +* isn't positive definite (possible with truncated and Tukey-Hanning kernels) + if `rankS' < `iv_ct' { +* If two-step GMM then exit with error ... + if "`gmm2s'" != "" { +di in r "Error: estimated covariance matrix of moment conditions not of full rank;" +di in r " cannot calculate optimal weighting matrix for GMM estimation." +di in r "Possible causes:" + if "`cluster'" != "" { +di in r " number of clusters insufficient to calculate optimal weighting matrix" + } + if "`kernel'" != "" { +di in r " covariance matrix of moment conditions not positive definite" +di in r " covariance matrix uses too many lags" + } +di in r " singleton dummy variable (dummy with one 1 and N-1 0s or vice versa)" +di in r "-partial- option may address problem. See help " _c +di in smcl "{help ivreg2}". + error 498 + } +* Estimation isn't two-step GMM so continue but J, F, and C stat (if present) all meaningless +* Must set Sargan-Hansen j = missing so that problem can be reported in output + else { + scalar `j' = . + if "`orthog'"!="" { + scalar `cstat' = . + } + if "`endogtest'"!="" { + scalar `estat' = . + } + } + } + } + +* End of error-checking block +******************************************************************************************** +* Reduced form and first stage regression options +******************************************************************************************* +* Relies on proper count of (non-collinear) IVs generated earlier. +* Note that nocons option + constant in instrument list means first-stage +* regressions are reported with nocons option. First-stage F-stat therefore +* correctly includes the constant as an explanatory variable. + + if "`rf'`saverf'`first'`ffirst'`savefirst'" != "" & (`endo1_ct' > 0) & "`noid'"=="" { +* Reduced form needed for AR first-stage test stat. Also estimated if requested. + tempname archi2 archi2p arf arfp ardf ardf_r sstat sstatp sstatdf + doRF "`lhs'" "`inexog1'" "`exexog1'" /* + */ `touse' `"`wtexp'"' `"`noconstant'"' `"`robust'"' /* + */ `"`clopt'"' `"`bwopt'"' `"`kernopt'"' /* + */ `"`saverfprefix'"' /* + */ "`dofminus'" "`sdofminus'" "`ivreg2_cmd'" + scalar `archi2'=r(archi2) + scalar `archi2p'=r(archi2p) + scalar `arf'=r(arf) + scalar `arfp'=r(arfp) + scalar `ardf'=r(ardf) + scalar `ardf_r'=r(ardf_r) + local rfeq "`r(rfeq)'" +* Drop saved rf results if needed only for first-stage estimations + if "`rf'`saverf'" == "" { + capture estimates drop `rfeq' + } +* Stock-Wright S statistic. Evaluate CUE objective function at b=0. +* Included exogenous, if any, are partialled out. + tempname b1 + mat `b1'=J(1,`endo1_ct',0) + matrix colnames `b1' = `endo1' + if `inexog1_ct' > 0 { + qui `ivreg2_cmd' `lhs' `inexog1' (`endo1'=`exexog1') `wtexp' if `touse', /* + */ b0(`b1') `noconstant' dofminus(`dofminus') /* + */ `robust' `clopt' `bwopt' `kernopt' nocollin partial(`inexog1') + } + else if `cons' > 0 { + qui `ivreg2_cmd' `lhs' (`endo1'=`exexog1') `wtexp' if `touse', /* + */ b0(`b1') `noconstant' dofminus(`dofminus') /* + */ `robust' `clopt' `bwopt' `kernopt' nocollin partial(_cons) + } + else { + qui `ivreg2_cmd' `lhs' (`endo1'=`exexog1') `wtexp' if `touse', /* + */ b0(`b1') `noconstant' dofminus(`dofminus') /* + */ `robust' `clopt' `bwopt' `kernopt' nocollin + } + + scalar `sstat'=e(j) + scalar `sstatdf'=`ardf' + scalar `sstatp'=chiprob(`sstatdf',`sstat') + } + + if "`first'`ffirst'`savefirst'" != "" & (`endo1_ct' > 0) { + + if `iv1_ct' > `iv_ct' { +di +di in gr "Warning: collinearities detected among instruments" +di in gr "1st stage tests of excluded exogenous variables may be incorrect" + } + + tempname firstmat + local sdofmopt = "sdofminus(`sdofminus')" + doFirst "`endo1'" "`inexog1'" "`exexog1'" "`XXinv'" "`XPZXinv'" /* + */ `touse' `"`wtexp'"' `"`noconstant'"' `"`robust'"' /* + */ `"`clopt'"' `"`bwopt'"' `"`kernopt'"' /* + */ `"`savefprefix'"' `"`dofmopt'"' `"`sdofmopt'"' /* + */ "`ivreg2_cmd'" + + local firsteqs "`r(firsteqs)'" + capture mat `firstmat' = r(firstmat) + if _rc != 0 { +di in ye "Warning: missing values encountered; first stage regression results not saved" + } + } +* End of first-stage regression code +********************************************************************************************** +* Post and display results. +******************************************************************************************* + +* restore data if preserved for partial option + if "`partial'" != "" { + restore + } + + if "`small'"!="" { + local NminusK = `N'-`rhs_ct'-`sdofminus' + capture ereturn post `B' `V', dep(`depname') obs(`N') esample(`touse') /* + */ dof(`NminusK') + } + else { + capture ereturn post `B' `V', dep(`depname') obs(`N') esample(`touse') + } + local rc = _rc + if `rc' == 504 { +di in red "Error: estimated variance-covariance matrix has missing values" + exit 504 + } + if `rc' == 506 { +di in red "Error: estimated variance-covariance matrix not positive-definite" + exit 506 + } + if `rc' > 0 { +di in red "Error: estimation failed - could not post estimation results" + exit `rc' + } + + ereturn local instd `endo' + local insts : colnames `S' +* Stata convention is to exclude constant from instrument list +* Need word option so that varnames with "_cons" in them aren't zapped + local insts : subinstr local insts "_cons" "", word + ereturn local insts `insts' + ereturn local inexog `inexog' + ereturn local exexog `exexog' + ereturn local partial `partial' + ereturn scalar inexog_ct=`inexog1_ct' + ereturn scalar exexog_ct=`exex1_ct' + ereturn scalar endog_ct =`endo1_ct' + ereturn scalar partial_ct =`partial_ct' + if "`collin'`ecollin'`dups'" != "" | `partial_ct' > 0 { + ereturn local collin `collin' + ereturn local ecollin `ecollin' + ereturn local dups `dups' + ereturn local instd1 `endo1' + ereturn local inexog1 `inexog1' + ereturn local exexog1 `exexog1' + ereturn local partial1 `partial1' + } + + if "`smatrix'" == "" { + ereturn matrix S `S' + } + else { +* Create a copy so posting doesn't zap the original + tempname Scopy + mat `Scopy'=`smatrix' + ereturn matrix S `Scopy' + } + +* No weighting matrix defined for LIML and kclass + if "`wmatrix'"=="" & "`liml'`kclass'"=="" { + ereturn matrix W `W' + } + else if "`liml'`kclass'"=="" { +* Create a copy so posting doesn't zap the original + tempname Wcopy + mat `Wcopy'=`wmatrix' + ereturn matrix W `Wcopy' + } + + if "`kernel'"!="" { + ereturn local kernel "`kernel'" + ereturn scalar bw=`bw' + ereturn local tvar "`tvar'" + if "`ivar'" ~= "" { + ereturn local ivar "`ivar'" + } + if "`bwchoice'" ~= "" { + ereturn local bwchoice "`bwchoice'" + } + } + + if "`small'"!="" { + ereturn scalar df_r=`df_r' + ereturn local small "small" + } + if "`nopartialsmall'"=="" { + ereturn local partialsmall "small" + } + + if "`cluster'"!="" { + ereturn scalar N_clust=`N_clust' + ereturn local clustvar `cluster' + } + + if "`robust'`cluster'" != "" { + ereturn local vcetype "Robust" + } + + ereturn scalar df_m=`df_m' + ereturn scalar sdofminus =`sdofminus' + ereturn scalar dofminus=`dofminus' + ereturn scalar r2=`r2' + ereturn scalar rmse=`rmse' + ereturn scalar rss=`rss' + ereturn scalar mss=`mss' + ereturn scalar r2_a=`r2_a' + ereturn scalar F=`F' + ereturn scalar Fp=`Fp' + ereturn scalar Fdf1=`Fdf1' + ereturn scalar Fdf2=`Fdf2' + ereturn scalar yy=`yy' + ereturn scalar yyc=`yyc' + ereturn scalar r2u=`r2u' + ereturn scalar r2c=`r2c' + ereturn scalar rankzz=`iv_ct' + ereturn scalar rankxx=`rhs_ct' + if "`gmm2s'`robust'`cluster'`kernel'" != "" { + ereturn scalar rankS=`rankS' + } + ereturn scalar rankV=`rankV' + ereturn scalar ll = -0.5 * (`N'*ln(2*_pi) + `N'*ln(`rss'/`N') + `N') + +* Always save J. Also save as Sargan if homoskedastic; save A-R if LIML. + ereturn scalar j=`j' + ereturn scalar jdf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar jp=`jp' + } + if ("`robust'`cluster'"=="") { + ereturn scalar sargan=`j' + ereturn scalar sargandf=`jdf' + if `j' != 0 & `j' != . { + ereturn scalar sarganp=`jp' + } + } + if "`liml'"!="" { + ereturn scalar arubin=`arubin' + ereturn scalar arubin_lin=`arubin_lin' + if `j' != 0 & `j' != . { + ereturn scalar arubinp=`arubinp' + ereturn scalar arubin_linp=`arubin_linp' + } + ereturn scalar arubindf=`jdf' + } + + if "`orthog'"!="" { + ereturn scalar cstat=`cstat' + if `cstat'!=0 & `cstat' != . { + ereturn scalar cstatp=`cstatp' + ereturn scalar cstatdf=`cstatdf' + ereturn local clist `clist1' + } + } + + if "`endogtest'"!="" { + ereturn scalar estat=`estat' + if `estat'!=0 & `estat' != . { + ereturn scalar estatp=`estatp' + ereturn scalar estatdf=`estatdf' + ereturn local elist `elist1' + } + } + + if `endo1_ct' > 0 & "`noid'"=="" { + ereturn scalar idstat=`idstat' + ereturn scalar iddf=`iddf' + ereturn scalar idp=`idp' + ereturn scalar cd=`cd' + ereturn scalar widstat=`widstat' + ereturn scalar cdf=`cdf' + capture ereturn matrix ccev=`cceval' + capture ereturn matrix cdev `cdeval' + capture ereturn scalar rkf=`rkf' + } + + if "`redundant'"!="" & "`noid'"=="" { + ereturn scalar redstat=`redstat' + ereturn scalar redp=`redp' + ereturn scalar reddf=`reddf' + ereturn local redlist `redlist1' + } + + if "`first'`ffirst'`savefirst'" != "" & `endo1_ct'>0 & "`noid'"=="" { +* Capture here because firstmat empty if mvs encountered in 1st stage regressions + capture ereturn matrix first `firstmat' + ereturn scalar arf=`arf' + ereturn scalar arfp=`arfp' + ereturn scalar archi2=`archi2' + ereturn scalar archi2p=`archi2p' + ereturn scalar ardf=`ardf' + ereturn scalar ardf_r=`ardf_r' + ereturn scalar sstat=`sstat' + ereturn scalar sstatp=`sstatp' + ereturn scalar sstatdf=`sstatdf' + ereturn local firsteqs `firsteqs' + } + if "`rf'`saverf'" != "" & `endo1_ct'>0 { + ereturn local rfeq `rfeq' + } + + ereturn local depvar `lhs' + + if "`liml'"!="" { + ereturn local model "liml" + ereturn scalar kclass=`kclass2' + ereturn scalar lambda=`lambda' + if `fuller' > 0 & `fuller' < . { + ereturn scalar fuller=`fuller' + } + } + else if "`kclass'" != "" { + ereturn local model "kclass" + ereturn scalar kclass=`kclass2' + } + else if "`gmm2s'`cue'`b0'`wmatrix'"=="" { + if "`endo1'" == "" { + ereturn local model "ols" + } + else { + ereturn local model "iv" + } + } + else if "`cue'`b0'"~="" { + ereturn local model "cue" + } + else if "`gmm2s'"~="" { + ereturn local model "gmm2s" + } + else if "`wmatrix'"~="" { + ereturn local model "gmmw" + } + else { +* Should never enter here + ereturn local model "unknown" + } + + if "`weight'" != "" { + ereturn local wexp "=`exp'" + ereturn local wtype `weight' + } + ereturn local cmd `ivreg2_cmd' + ereturn local cmdline `cmdline' + ereturn local version `lversion' + ereturn scalar cons=`cons' + ereturn scalar partialcons=`partialcons' + + ereturn local predict "`ivreg2_cmd'_p" + + if "`e(model)'"=="gmm2s" & "`wmatrix'"=="" { + local title2 "2-Step GMM estimation" + } + else if "`e(model)'"=="gmm2s" & "`wmatrix'"~="" { + local title2 "2-Step GMM estimation with user-supplied first-step weighting matrix" + } + else if "`e(model)'"=="gmmw" { + local title2 "GMM estimation with user-supplied weighting matrix" + } + else if "`e(model)'"=="cue" & "`b0'"=="" { + local title2 "CUE estimation" + } + else if "`e(model)'"=="cue" & "`b0'"~="" { + local title2 "CUE evaluated at user-supplied parameter vector" + } + else if "`e(model)'"=="ols" { + local title2 "OLS estimation" + } + else if "`e(model)'"=="iv" { + local title2 "IV (2SLS) estimation" + } + else if "`e(model)'"=="liml" { + local title2 "LIML estimation" + } + else if "`e(model)'"=="kclass" { + local title2 "k-class estimation" + } + else { +* Should never reach here + local title2 "unknown estimation" + } + if "`e(vcetype)'" == "Robust" { + local hacsubtitle1 "heteroskedasticity" + } + if "`e(kernel)'"!="" { + local hacsubtitle3 "autocorrelation" + } + if "`e(clustvar)'"!="" { + local hacsubtitle3 "clustering on `e(clustvar)'" + } + if "`hacsubtitle1'"~="" & "`hacsubtitle3'" ~= "" { + local hacsubtitle2 " and " + } + if "`title'"=="" { + ereturn local title "`title1'`title2'" + } + else { + ereturn local title "`title'" + } + if "`subtitle'"~="" { + ereturn local subtitle "`subtitle'" + } + local hacsubtitle "`hacsubtitle1'`hacsubtitle2'`hacsubtitle3'" + if "`b0'"~="" { + ereturn local hacsubtitleB "Estimates based on supplied parameter vector" + } + else if "`hacsubtitle'"~="" & "`gmm2s'`cue'"~="" { + ereturn local hacsubtitleB "Estimates efficient for arbitrary `hacsubtitle'" + } + else if "`wmatrix'"~="" { + ereturn local hacsubtitleB "Efficiency of estimates dependent on weighting matrix" + } + else { + ereturn local hacsubtitleB "Estimates efficient for homoskedasticity only" + } + if "`hacsubtitle'"~="" { + ereturn local hacsubtitleV "Statistics robust to `hacsubtitle'" + } + else { + ereturn local hacsubtitleV "Statistics consistent for homoskedasticity only" + } + } + +******************************************************************************************* +* Display results unless ivreg2 called just to generate stats or nooutput option + + if "`nooutput'" == "" { + if "`savefirst'`saverf'" != "" { + DispStored `"`saverf'"' `"`savefirst'"' `"`ivreg2_cmd'"' + } + if "`rf'" != "" { + DispRF + } + if "`first'" != "" { + DispFirst `"`ivreg2_cmd'"' + } + if "`first'`ffirst'" != "" { + DispFFirst `"`ivreg2_cmd'"' + } + if "`eform'"!="" { + local efopt "eform(`eform')" + } + DispMain `"`noheader'"' `"`plus'"' `"`efopt'"' `"`level'"' `"`nofooter'"' `"`ivreg2_cmd'"' + } + +* Drop first stage estimations unless explicitly saved or if replay + if "`savefirst'" == "" { + local firsteqs "`e(firsteqs)'" + foreach eqname of local firsteqs { + capture estimates drop `eqname' + } + ereturn local firsteqs + } + +* Drop reduced form estimation unless explicitly saved or if replay + if "`saverf'" == "" { + local eqname "`e(rfeq)'" + capture estimates drop `eqname' + ereturn local rfeq + } + +end + +******************************************************************************************* +* SUBROUTINES +******************************************************************************************* + +program define DispMain, eclass + args noheader plus efopt level nofooter helpfile + version 8.2 +* Prepare for problem resulting from rank(S) being insufficient +* Results from insuff number of clusters, too many lags in HAC, +* to calculate robust S matrix, HAC matrix not PD, singleton dummy, +* and indicated by missing value for j stat +* Macro `rprob' is either 1 (problem) or 0 (no problem) + capture local rprob ("`e(j)'"==".") + + if "`noheader'"=="" { + if "`e(title)'" ~= "" { +di in gr _n "`e(title)'" + local tlen=length("`e(title)'") +di in gr "{hline `tlen'}" + } + if "`e(subtitle)'" ~= "" { +di in gr "`e(subtitle)'" + } + if "`e(model)'"=="liml" | "`e(model)'"=="kclass" { +di in gr "k =" %7.5f `e(kclass)' + } + if "`e(model)'"=="liml" { +di in gr "lambda =" %7.5f `e(lambda)' + } + if e(fuller) > 0 & e(fuller) < . { +di in gr "Fuller parameter=" %-5.0f `e(fuller)' + } + if "`e(hacsubtitleB)'" ~= "" { +di in gr _n "`e(hacsubtitleB)'" _c + } + if "`e(hacsubtitleV)'" ~= "" { +di in gr _n "`e(hacsubtitleV)'" + } + if "`e(kernel)'"!="" { +di in gr " kernel=`e(kernel)'; bandwidth=" %6.2g `e(bw)' + if "`e(bwchoice)'"!="" { +di in gr " `e(bwchoice)'" + } +di in gr " time variable (t): " in ye e(tvar) + if "`e(ivar)'" != "" { +di in gr " group variable (i): " in ye e(ivar) + } + } + di + if "`e(clustvar)'"!="" { +di in gr "Number of clusters (" "`e(clustvar)'" ") = " in ye %-4.0f e(N_clust) _continue + } + else { +di in gr " " _continue + } +di in gr _col(55) "Number of obs = " in ye %8.0f e(N) +di in gr _c _col(55) "F(" %3.0f e(Fdf1) "," %6.0f e(Fdf2) ") = " + if e(F) < 99999 { +di in ye %8.2f e(F) + } + else { +di in ye %8.2e e(F) + } +di in gr _col(55) "Prob > F = " in ye %8.4f e(Fp) + +di in gr "Total (centered) SS = " in ye %12.0g e(yyc) _continue +di in gr _col(55) "Centered R2 = " in ye %8.4f e(r2c) +di in gr "Total (uncentered) SS = " in ye %12.0g e(yy) _continue +di in gr _col(55) "Uncentered R2 = " in ye %8.4f e(r2u) +di in gr "Residual SS = " in ye %12.0g e(rss) _continue +di in gr _col(55) "Root MSE = " in ye %8.4g e(rmse) +di + } + +* Display coefficients etc. +* Unfortunate but necessary hack here: to suppress message about cluster adjustment of +* standard error, clear e(clustvar) and then reset it after display + local cluster `e(clustvar)' + ereturn local clustvar + ereturn display, `plus' `efopt' level(`level') + ereturn local clustvar `cluster' + +* Display 1st footer with identification stats +* Footer not displayed if -nofooter- option or if pure OLS, i.e., model="ols" and Sargan-Hansen=0 + if ~("`nofooter'"~="" | (e(model)=="ols" & (e(sargan)==0 | e(j)==0))) { + +* Under ID test + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##idtest:Underidentification test}" + if "`e(vcetype)'`e(kernel)'"=="" { +di in gr _c " (Anderson canon. corr. LM statistic):" + } + else { +di in gr _c " (Kleibergen-Paap rk LM statistic):" + } +di in ye _col(71) %8.3f e(idstat) +di in gr _col(52) "Chi-sq(" in ye e(iddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(idp) +* IV redundancy statistic + if "`e(redlist)'"!="" { +di in gr "-redundant- option:" +di in smcl _c "{help `helpfile'##redtest:IV redundancy test}" +di in gr _c " (LM test of redundancy of specified instruments):" +di in ye _col(71) %8.3f e(redstat) +di in gr _col(52) "Chi-sq(" in ye e(reddf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(redp) +di in gr "Instruments tested: " _c + Disp `e(redlist)', _col(23) + } +di in smcl in gr "{hline 78}" + } +* Report Cragg-Donald statistic + if "`e(instd)'"~="" & "`e(idstat)'"~="" { +di in smcl _c "{help `helpfile'##widtest:Weak identification test}" +di in gr " (Cragg-Donald Wald F statistic):" in ye _col(71) %8.3f e(cdf) + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr " (Kleibergen-Paap rk Wald F statistic):" in ye _col(71) %8.3f e(widstat) + } +di in gr _c "Stock-Yogo weak ID test critical values:" + local cdmissing=1 + if "`e(model)'"=="iv" | "`e(model)'"=="gmm2s" | "`e(model)'"=="gmmw" { + cdsy, type(ivbias5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% maximal IV relative bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "15% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "25% maximal IV size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)==.) | "`e(model)'"=="cue" { + cdsy, type(limlsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "15% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "25% maximal LIML size" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)<.) { + cdsy, type(fullrel5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% maximal Fuller rel. bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "10% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "20% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(42) "30% Fuller maximum bias" in ye _col(73) %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + if `cdmissing' { + di in gr _col(64) "" + } + else { + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." + } + } + di in smcl in gr "{hline 78}" + } + +* Report either (a) Sargan-Hansen-C stats, or (b) robust covariance matrix problem +* e(model)="gmmw" means user-supplied weighting matrix and Hansen J using 2nd-step resids reported + if `rprob' == 0 { +* Display overid statistic + if "`e(vcetype)'" == "Robust" | "`e(model)'" == "gmmw" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Hansen J statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } + else { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##overidtests:Sargan statistic}" +di in gr _c " (Lagrange multiplier test of excluded instruments):" + } + } +di in ye _col(71) %8.3f e(j) + if e(rankxx) < e(rankzz) { +di in gr _col(52) "Chi-sq(" in ye e(jdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(jp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + +* Display orthog option: C statistic (difference of Sargan statistics) + if e(cstat) != . { +* If C-stat = 0 then warn, otherwise output + if e(cstat) > 0 { +di in gr "-orthog- option:" + if "`e(vcetype)'" == "Robust" { +di in gr _c "Hansen J statistic (eqn. excluding suspect orthog. conditions): " + } + else { +di in gr _c "Sargan statistic (eqn. excluding suspect orthogonality conditions):" + } +di in ye _col(71) %8.3f e(j)-e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(jdf)-e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f chiprob(e(jdf)-e(cstatdf),e(j)-e(cstat)) +di in smcl _c "{help `helpfile'##ctest:C statistic}" +di in gr _c " (exogeneity/orthogonality of suspect instruments): " +di in ye _col(71) %8.3f e(cstat) +di in gr _col(52) "Chi-sq(" in ye e(cstatdf) in gr ") P-val = " /* + */ in ye _col(73) %6.4f e(cstatp) +di in gr "Instruments tested: " _c + Disp `e(clist)', _col(23) + } + if e(cstat) == 0 { +di in gr _n "Collinearity/identification problems in eqn. excl. suspect orthog. conditions:" +di in gr " C statistic not calculated for -orthog- option" + } + } + } + else { +* Problem exists with robust VCV - notify and list possible causes +di in r "Warning: estimated covariance matrix of moment conditions not of full rank." + if e(rankxx) < e(rankzz) { +di in r " overidentification statistic not reported, and" + } +di in r " standard errors and model tests should be interpreted with caution." +di in r "Possible causes:" + if "`e(N_clust)'" != "" { +di in r " number of clusters insufficient to calculate robust covariance matrix" + } + if "`e(kernel)'" != "" { +di in r " covariance matrix of moment conditions not positive definite" +di in r " covariance matrix uses too many lags" + } +di in r " singleton dummy variable (dummy with one 1 and N-1 0s or vice versa)" +di in r in smcl _c "{help `helpfile'##partial:partial}" +di in r " option may address problem." + } + +* Display endog option: endogeneity test statistic + if e(estat) != . { +* If stat = 0 then warn, otherwise output + if e(estat) > 0 { +di in gr "-endog- option:" +di in smcl _c "{help `helpfile'##endogtest:Endogeneity test}" +di in gr _c " of endogenous regressors: " +di in ye _col(71) %8.3f e(estat) +di in gr _col(52) "Chi-sq(" in ye e(estatdf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(estatp) +di in gr "Regressors tested: " _c + Disp `e(elist)', _col(23) + } + if e(estat) == 0 { +di in gr _n "Collinearity/identification problems in restricted equation:" +di in gr " Endogeneity test statistic not calculated for -endog- option" + } + } + + di in smcl in gr "{hline 78}" +* Display AR overid statistic if LIML and not robust + if "`e(model)'" == "liml" & "`e(vcetype)'" ~= "Robust" & "`e(kernel)'" == "" { + if "`e(instd)'" != "" { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (overidentification test of all instruments):" + } + else { +di in smcl _c "{help `helpfile'##liml:Anderson-Rubin statistic}" +di in gr _c " (LR test of excluded instruments):" + } +di in ye _col(72) %7.3f e(arubin) + if e(rankxx) < e(rankzz) { +di in gr _col(52) "Chi-sq(" in ye e(arubindf) /* + */ in gr ") P-val = " in ye _col(73) %6.4f e(arubinp) + } + else { +di in gr _col(50) "(equation exactly identified)" + } + di in smcl in gr "{hline 78}" + } + } + +* Display 2nd footer with variable lists + if "`nofooter'"=="" { + +* Warn about dropped instruments if any +* (Re-)calculate number of user-supplied instruments + local iv1_ct : word count `e(insts)' + local iv1_ct = `iv1_ct' + `e(cons)' + + if `iv1_ct' > e(rankzz) { +di in gr "Collinearities detected among instruments: " _c +di in gr `iv1_ct'-e(rankzz) " instrument(s) dropped" + } + + if "`e(collin)'`e(dups)'" != "" | `e(partial_ct)'>0 { +* If collinearities, duplicates or partial, abbreviated varlists saved with a 1 at the end + local one "1" + } + if "`e(instd)'" != "" { + di in gr "Instrumented:" _c + Disp `e(instd`one')', _col(23) + } + if "`e(inexog)'" != "" { + di in gr "Included instruments:" _c + Disp `e(inexog`one')', _col(23) + } + if "`e(exexog)'" != "" { + di in gr "Excluded instruments:" _c + Disp `e(exexog`one')', _col(23) + } + if `e(partial_ct)' > 0 { + if e(partialcons) { + local partial "`e(partial`one')' _cons" + } + else { + local partial "`e(partial`one')'" + } +di in smcl _c "{help `helpfile'##partial:Partialled-out}" + di in gr ":" _c + Disp `partial', _col(23) + if "`e(partialsmall)'"=="" { +di in gr _col(23) "nb: small-sample adjustments do not account for" +di in gr _col(23) " partialled-out variables" + } + else { +di in gr _col(23) "nb: small-sample adjustments account for" +di in gr _col(23) " partialled-out variables" + } + } + if "`e(dups)'" != "" { + di in gr "Duplicates:" _c + Disp `e(dups)', _col(23) + } + if "`e(collin)'" != "" { + di in gr "Dropped collinear:" _c + Disp `e(collin)', _col(23) + } + if "`e(ecollin)'" != "" { + di in gr "Reclassified as exog:" _c + Disp `e(ecollin)', _col(23) + } + di in smcl in gr "{hline 78}" + } +end + +************************************************************************************** + +program define DispRF + version 8.2 + local eqname "`e(rfeq)'" + local depvar "`e(depvar)'" + local strlen : length local depvar + local strlen = `strlen'+25 +di +di in gr "Reduced-form regression: `e(depvar)'" +di in smcl in gr "{hline `strlen'}" + capture estimates replay `eqname' + if "`eqname'"=="" | _rc != 0 { +di in ye "Unable to display reduced-form regression of `e(depvar)'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + else { + estimates replay `eqname', noheader +di + } +end + +program define DispFirst + version 8.2 + args helpfile + tempname firstmat ivest sheapr2 pr2 F df df_r pvalue APF APFdf1 APFdf2 APFp APr2 + + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display first-stage estimates; macro e(first) is missing" + exit + } +di in gr _newline "First-stage regressions" +di in smcl in gr "{hline 23}" +di + local endo1 : colnames(`firstmat') + local nrvars : word count `endo1' + local firsteqs "`e(firsteqs)'" + local nreqs : word count `firsteqs' + if `nreqs' < `nrvars' { +di in ye "Unable to display all first-stage regressions." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + foreach eqname of local firsteqs { + _estimates hold `ivest' + capture estimates restore `eqname' + if _rc != 0 { +di +di in ye "Unable to list stored estimation `eqname'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + else { + local vn "`e(depvar)'" +di in gr "First-stage regression of `vn':" + estimates replay `eqname', noheader + mat `sheapr2' =`firstmat'["sheapr2","`vn'"] + mat `pr2' =`firstmat'["pr2","`vn'"] + mat `F' =`firstmat'["F","`vn'"] + mat `df' =`firstmat'["df","`vn'"] + mat `df_r' =`firstmat'["df_r","`vn'"] + mat `pvalue' =`firstmat'["pvalue","`vn'"] + mat `APF' =`firstmat'["APF","`vn'"] + mat `APFdf1' =`firstmat'["APFdf1","`vn'"] + mat `APFdf2' =`firstmat'["APFdf2","`vn'"] + mat `APFp' =`firstmat'["APFp","`vn'"] + mat `APr2' =`firstmat'["APr2","`vn'"] + +di in gr "F test of excluded instruments:" +di in gr " F(" %3.0f `df'[1,1] "," %6.0f `df_r'[1,1] ") = " in ye %8.2f `F'[1,1] +di in gr " Prob > F = " in ye %8.4f `pvalue'[1,1] + +di in smcl "{help `helpfile'##apstats:Angrist-Pischke multivariate F test of excluded instruments:}" +di in gr " F(" %3.0f `APFdf1'[1,1] "," %6.0f `APFdf2'[1,1] ") = " in ye %8.2f `APF'[1,1] +di in gr " Prob > F = " in ye %8.4f `APFp'[1,1] + +di + } + _estimates unhold `ivest' + } +end + +program define DispStored + args saverf savefirst helpfile + version 8.2 + if "`saverf'" != "" { + local eqlist "`e(rfeq)'" + } + if "`savefirst'" != "" { + local eqlist "`eqlist' `e(firsteqs)'" + } + local eqlist : list retokenize eqlist +di in gr _newline "Stored estimation results" +di in smcl in gr "{hline 25}" _c + capture estimates dir `eqlist' + if "`eqlist'" != "" & _rc == 0 { +* Estimates exist and can be listed + estimates dir `eqlist' + } + else if "`eqlist'" != "" & _rc != 0 { +di +di in ye "Unable to list stored estimations." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } +end + +program define DispFFirst + version 8.2 + args helpfile + tempname firstmat + tempname sheapr2 pr2 F df df_r pvalue APF APFdf1 APFdf2 APFp APchi2 APchi2p APr2 + mat `firstmat'=e(first) + if `firstmat'[1,1] == . { +di +di in ye "Unable to display summary of first-stage estimates; macro e(first) is missing" + exit + } + local endo : colnames(`firstmat') + local nrvars : word count `endo' + local robust "`e(vcetype)'" + local cluster "`e(clustvar)'" + local kernel "`e(kernel)'" + local efirsteqs "`e(firsteqs)'" + + mat `df' =`firstmat'["df",1] + mat `df_r' =`firstmat'["df_r",1] + mat `APFdf1' =`firstmat'["APFdf1",1] + mat `APFdf2' =`firstmat'["APFdf2",1] + +di +di in gr _newline "Summary results for first-stage regressions" +di in smcl in gr "{hline 43}" +di + +di _c in smcl _col(44) "{help `helpfile'##apstats:(Underid)}" +di in smcl _col(65) "{help `helpfile'##apstats:(Weak id)}" + +di _c in gr "Variable |" +di _c in smcl _col(16) "{help `helpfile'##apstats:F}" in gr "(" +di _c in ye _col(17) %3.0f `df'[1,1] in gr "," in ye %6.0f `df_r'[1,1] in gr ") P-val" +di _c in gr _col(37) "|" +di _c in smcl _col(39) "{help `helpfile'##apstats:AP Chi-sq}" in gr "(" +di _c in ye %3.0f `APFdf1'[1,1] in gr ") P-val" +di _c in gr _col(60) "|" +di _c in smcl _col(62) "{help `helpfile'##apstats:AP F}" in gr "(" +di in ye _col(67) %3.0f `APFdf1'[1,1] in gr "," in ye %6.0f `APFdf2'[1,1] in gr ")" + + local i = 1 + foreach vn of local endo { + + mat `sheapr2' =`firstmat'["sheapr2","`vn'"] + mat `pr2' =`firstmat'["pr2","`vn'"] + mat `F' =`firstmat'["F","`vn'"] + mat `df' =`firstmat'["df","`vn'"] + mat `df_r' =`firstmat'["df_r","`vn'"] + mat `pvalue' =`firstmat'["pvalue","`vn'"] + mat `APF' =`firstmat'["APF","`vn'"] + mat `APFdf1' =`firstmat'["APFdf1","`vn'"] + mat `APFdf2' =`firstmat'["APFdf2","`vn'"] + mat `APFp' =`firstmat'["APFp","`vn'"] + mat `APchi2' =`firstmat'["APchi2","`vn'"] + mat `APchi2p' =`firstmat'["APchi2p","`vn'"] + mat `APr2' =`firstmat'["APr2","`vn'"] + + local vnlen : length local vn + if `vnlen' > 12 { + local vn : piece 1 12 of "`vn'" + } +di _c in y %-12s "`vn'" _col(14) in gr "|" _col(18) in y %8.2f `F'[1,1] +di _c _col(28) in y %8.4f `pvalue'[1,1] +di _c _col(37) in g "|" _col(42) in y %8.2f `APchi2'[1,1] _col(51) in y %8.4f `APchi2p'[1,1] +di _col(60) in g "|" _col(65) in y %8.2f `APF'[1,1] + local i = `i' + 1 + } +di + + if "`robust'`cluster'" != "" { + if "`cluster'" != "" { + local rtype "cluster-robust" + } + else if "`kernel'" != "" { + local rtype "heteroskedasticity and autocorrelation-robust" + } + else { + local rtype "heteroskedasticity-robust" + } + } + else if "`kernel'" != "" { + local rtype "autocorrelation-robust" + } + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: first-stage test statistics `rtype'" +di + } + + local k2 = `APFdf1'[1,1] +di in gr "Stock-Yogo weak ID test critical values for single endogenous regressor:" + local cdmissing=1 + if "`e(model)'"=="iv" | "`e(model)'"=="gmm2s" | "`e(model)'"=="gmmw" { + cdsy, type(ivbias5) k2(`e(exexog_ct)') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(37) "5% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)==.) | "`e(model)'"=="cue" { + cdsy, type(limlsize10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)<.) { + cdsy, type(fullrel5) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(43) "5% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "10% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "20% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`k2') nendog(1) + if "`r(cv)'"~="." { + di in gr _col(36) "30% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." +di + } + else { +di + } + +* Check that AP chi-sq and F denominator are correct and = underid test dof + if e(iddf)~=`APFdf1'[1,1] { +di in red "Warning: Error in calculating first-stage id statistics above;" +di in red " dof of AP statistics is " `APFdf1'[1,1] ", should be L-(K-1)=`e(iddf)'." + } + + tempname iddf idstat idp widstat cdf rkf + scalar `iddf'=e(iddf) + scalar `idstat'=e(idstat) + scalar `idp'=e(idp) + scalar `widstat'=e(widstat) + scalar `cdf'=e(cdf) + capture scalar `rkf'=e(rkf) +di in smcl "{help `helpfile'##idtest:Underidentification test}" +di in gr "Ho: matrix of reduced form coefficients has rank=K1-1 (underidentified)" +di in gr "Ha: matrix has rank=K1 (identified)" + if "`robust'`kernel'"=="" { +di in ye "Anderson canon. corr. LM statistic" _c + } + else { +di in ye "Kleibergen-Paap rk LM statistic" _c + } +di in gr _col(42) "Chi-sq(" in ye `iddf' in gr ")=" %-7.2f in ye `idstat' /* + */ _col(61) in gr "P-val=" %6.4f in ye `idp' + +di +di in smcl "{help `helpfile'##widtest:Weak identification test}" +di in gr "Ho: equation is weakly identified" +di in ye "Cragg-Donald Wald F statistic" _col(65) %8.2f `cdf' + if "`robust'`kernel'"~="" { +di in ye "Kleibergen-Paap Wald rk F statistic" _col(65) %8.2f `rkf' + } +di + +di in gr "Stock-Yogo weak ID test critical values for K1=`e(endog_ct)' and L1=`e(exexog_ct)':" + local cdmissing=1 + if "`e(model)'"=="iv" | "`e(model)'"=="gmm2s" | "`e(model)'"=="gmmw" { + cdsy, type(ivbias5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(37) "5% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivbias30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal IV relative bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(ivsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal IV size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)==.) | "`e(model)'"=="cue" { + cdsy, type(limlsize10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize15) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "15% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(limlsize25) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "25% maximal LIML size" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + } + else if ("`e(model)'"=="liml" & e(fuller)<.) { + cdsy, type(fullrel5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullrel30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "30% maximal Fuller rel. bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax5) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(43) "5% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax10) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "10% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax20) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "20% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + cdsy, type(fullmax30) k2(`e(exexog_ct)') nendog(`e(endog_ct)') + if "`r(cv)'"~="." { + di in gr _col(36) "30% Fuller maximum bias" in ye _col(67) %6.2f r(cv) + local cdmissing=0 + } + di in gr "NB: Critical values based on Fuller parameter=1" + } + if `cdmissing' { + di in gr _col(64) "" + } + else { + di in gr "Source: Stock-Yogo (2005). Reproduced by permission." + if "`e(vcetype)'`e(kernel)'"~="" { +di in gr "NB: Critical values are for Cragg-Donald F statistic and i.i.d. errors." + } + di + } + + tempname arf arfp archi2 archi2p ardf ardf_r + tempname sstat sstatp sstatdf +di in smcl "{help `helpfile'##wirobust:Weak-instrument-robust inference}" +di in gr "Tests of joint significance of endogenous regressors B1 in main equation" +di in gr "Ho: B1=0 and orthogonality conditions are valid" +* Needs to be small so that adjusted dof is reflected in F stat + scalar `arf'=e(arf) + scalar `arfp'=e(arfp) + scalar `archi2'=e(archi2) + scalar `archi2p'=e(archi2p) + scalar `ardf'=e(ardf) + scalar `ardf_r'=e(ardf_r) + scalar `sstat'=e(sstat) + scalar `sstatp'=e(sstatp) + scalar `sstatdf'=e(sstatdf) +di in ye _c "Anderson-Rubin Wald test" +di in gr _col(36) "F(" in ye `ardf' in gr "," in ye `ardf_r' in gr ")=" /* + */ _col(49) in ye %7.2f `arf' _col(61) in gr "P-val=" in ye %6.4f `arfp' +di in ye _c "Anderson-Rubin Wald test" +di in gr _col(36) "Chi-sq(" in ye `ardf' in gr ")=" /* + */ _col(49) in ye %7.2f `archi2' _col(61) in gr "P-val=" in ye %6.4f `archi2p' +di in ye _c "Stock-Wright LM S statistic" +di in gr _col(36) "Chi-sq(" in ye `sstatdf' in gr ")=" /* + */ _col(49) in ye %7.2f `sstat' _col(61) in gr "P-val=" in ye %6.4f `sstatp' +di + if "`robust'`cluster'`kernel'" != "" { +di in gr "NB: Underidentification, weak identification and weak-identification-robust" +di in gr " test statistics `rtype'" +di + } + + if "`cluster'" != "" { +di in gr "Number of clusters N_clust = " in ye %10.0f e(N_clust) + } +di in gr "Number of observations N = " in ye %10.0f e(N) +di in gr "Number of regressors K = " in ye %10.0f e(rankxx) +di in gr "Number of endogenous regressors K1 = " in ye %10.0f e(endog_ct) +di in gr "Number of instruments L = " in ye %10.0f e(rankzz) +di in gr "Number of excluded instruments L1 = " in ye %10.0f e(ardf) + if "`e(partial)'" != "" { +di in gr "Number of partialled-out regressors/IVs = " in ye %10.0f e(partial_ct) +di in gr "NB: K & L do not included partialled-out variables" + } + +end + +* Performs first-stage regressions + +program define doFirst, rclass + version 8.2 + args endog /* variable list (including depvar) + */ inexog /* list of included exogenous + */ exexog /* list of excluded exogenous + */ XXinv /* + */ XPZXinv /* + */ touse /* touse sample + */ weight /* full weight expression w/ [] + */ nocons /* + */ robust /* + */ clopt /* + */ bwopt /* + */ kernopt /* + */ savefprefix /* + */ dofmopt /* + */ sdofmopt /* + */ ivreg2_cmd + +* Create fitted values of endogenous regressors + local endog_hat "" + tsrevar `endog' + local ts_endog "`r(varlist)'" + foreach x of local ts_endog { + qui regress `x' `inexog' `exexog' `weight' if `touse', `nocons' + tempname `x'_hat + qui predict double ``x'_hat', xb + local endog_hat "`endog_hat' ``x'_hat'" + } +* inexog and exexog are used with partial() option so must tsrevar them + tsrevar `inexog' + local ts_inexog "`r(varlist)'" + tsrevar `exexog' + local ts_exexog "`r(varlist)'" + + tempname statmat statmat1 + local i 1 + foreach x of local endog { + capture `ivreg2_cmd' `x' `inexog' `exexog' `weight' /* + */ if `touse', `nocons' `robust' `clopt' `bwopt' `kernopt' /* + */ `dofmopt' `sdofmopt' small nocollin + if _rc ~= 0 { +* First-stage regression failed +di in ye "Unable to estimate first-stage regression of `x'" + if _rc == 506 { +di in ye " var-cov matrix of first-stage regression of `x' not positive-definite" + } + } + else { +* First-stage regression successful +* Check if there is enough room to save results; leave one free. Allow for overwriting. +* Max is 20-1=19 for Stata 9.0 and earlier, 300-1=299 for Stata 9.1+ + local maxest=299 + local vn "`x'" + local plen : length local savefprefix + local vlen : length local vn + if `plen'+`vlen' > 27 { + local vlen=27-`plen' + local vn : permname `vn', length(`vlen') +* Must create a variable so that permname doesn't reuse it + gen `vn'=0 + local dropvn "`dropvn' `vn'" + } + local eqname "`savefprefix'`vn'" + local eqname : subinstr local eqname "." "_" + qui estimates dir + local est_list "`r(names)'" + Subtract est_list : "`est_list'" "`eqname'" + local est_ct : word count `est_list' + if `est_ct' < `maxest' { + capture est store `eqname', title("First-stage regression: `x'") + if _rc == 0 { + local firsteqs "`firsteqs' `eqname'" + } + } + else { +di +di in ye "Unable to store first-stage regression of `x'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + tempname rssall rssinc pr2 F p + scalar `rssall'=e(rss) + quietly test `exexog' + scalar `F'=r(F) + scalar `p'=r(p) + local df=r(df) + local df_r=r(df_r) +* 1st stage regression without excluded exogenous +* Use regress since need only RSS and handles all cases, including perverse ones (e.g. no regressors) + qui regress `x' `inexog' `weight' if `touse', `nocons' + scalar `rssinc'=e(rss) +* NB: uncentered R2 for main regression is 1-rssall/yy; for restricted is 1-rssinc/yy; +* squared semipartial correlation=(rssinc-rssall)/yy=diff of 2 R2s +* Squared partial correlation (="partialled-out R2") + scalar `pr2'=(`rssinc'-`rssall')/`rssinc' + +* A-P multivariate F and corresponding r-sq + tempname APF APFdf1 APFdf2 APFp APchi2 APchi2p APr2 + local x_hat "`endog_hat'" + tokenize `endog_hat' + Subtract x_hat : "`x_hat'" "``i''" + tokenize `ts_endog' + local ts_x "``i''" + qui `ivreg2_cmd' `ts_x' `x_hat' `ts_inexog' `ts_exexog' `weight' /* + */ if `touse', `nocons' `robust' `clopt' `bwopt' `kernopt' /* + */ `dofmopt' `sdofmopt' small nocollin partial(`x_hat' `ts_inexog') + scalar `APF' = e(F) + scalar `APFdf1' = e(Fdf1) + scalar `APFdf2' = e(Fdf2) + scalar `APFp' = e(Fp) + if "`clopt'"=="" { + scalar `APchi2' = e(F)*e(Fdf1)/e(Fdf2)*(e(N)-e(dofminus)) + } + else { + scalar `APchi2' = e(F)*e(Fdf1)/e(Fdf2)*e(N_clust)/(e(N)-e(rankxx)-e(sdofminus))*(e(N)-1) + } + scalar `APchi2p'= chi2tail(e(Fdf1),`APchi2') + scalar `APr2' = e(r2) + +* End of first-stage successful block + } + +* Godfrey method of Shea partial R2 uses IV and OLS estimates without robust vcvs: +* Partial R2 = OLS V[d,d] / IV V[d,d] * IV s2 / OLS s2 +* where d,d is the diagonal element corresponding to the endog regressor +* ... but this simplifies to matrices that have already been calculated: +* = XXinv[d,d] / XPZXinv[d,d] + tempname sols siv + tempname sheapr2 + mat `sols'=`XXinv'["`x'","`x'"] + mat `siv'=`XPZXinv'["`x'","`x'"] + scalar `sheapr2' = `sols'[1,1]/`siv'[1,1] + + capture { + mat `statmat1' = (`sheapr2' \ `pr2' \ `F' \ `df' \ `df_r' \ `p' /* + */ \ `APF' \ `APFdf1' \ `APFdf2' \ `APFp' \ `APchi2' \ `APchi2p' \ `APr2') + mat colname `statmat1' = `x' + mat `statmat' = nullmat(`statmat') , `statmat1' + } + local i = `i' + 1 + } +* Drop any temporarily-created permname variables + if trim("`dropvn'")~="" { + foreach vn of varlist `dropvn' { + capture drop `vn' + } + } + capture mat rowname `statmat' = sheapr2 pr2 F df df_r pvalue APF APFdf1 APFdf2 APFp APchi2 APchi2p APr2 + if _rc==0 { + return matrix firstmat `statmat' + } + return local firsteqs "`firsteqs'" +end + +program define doRF, rclass + version 8.2 + args lhs /* + */ inexog /* list of included exogenous + */ exexog /* list of excluded exogenous + */ touse /* touse sample + */ weight /* full weight expression w/ [] + */ nocons /* + */ robust /* + */ clopt /* + */ bwopt /* + */ kernopt /* + */ saverfprefix /* + */ dofminus /* + */ sdofminus /* + */ ivreg2_cmd + +* Anderson-Rubin test of signif of endog regressors (Bo=0) +* In case ivreg2 called with adjusted dof, first stage should adjust dof as well + tempname arf arfp archi2 archi2p ardf ardf_r tempest + capture _estimates hold `tempest' + if _rc==1000 { +di as err "ivreg2 internal error - no room to save temporary estimation results" +di as err "Please drop one or more estimation results using -estimates drop-" + exit 1000 + } +* Needs to be small so that adjusted dof is reflected in F stat +* capture to prevent not-full-rank error warning + capture `ivreg2_cmd' `lhs' `inexog' `exexog' `weight' if `touse', /* + */ small `nocons' dofminus(`dofminus') sdofminus(`sdofminus') /* + */ `robust' `clopt' `bwopt' `kernopt' nocollin + if _rc != 0 { +di as err "Error: reduced form estimation failed" + exit 498 + } + qui test `exexog' + scalar `arf'=r(F) + scalar `arfp'=r(p) + scalar `ardf'=r(df) + scalar `ardf_r'=r(df_r) + if "`clopt'"=="" { + scalar `archi2'=`arf'*`ardf'*(e(N)-`dofminus')/(e(N)-e(rankxx)-`dofminus'-`sdofminus') + } + else { + scalar `archi2'=`arf'*`ardf'*e(N_clust)/r(df_r)*(e(N)-1)/(e(N)-e(rankxx)-`sdofminus') + } + scalar `archi2p'=chiprob(`ardf',`archi2') + +* Check if there is enough room to save results; leave one free. Allow for overwriting. +* Max is 20-1=19 for Stata 9.0 and earlier, 300-1=299 for Stata 9.1+ + local maxest=299 + local vn "`lhs'" + local plen : length local saverfprefix + local vlen : length local lhs + if `plen'+`vlen' > 27 { + local vlen=27-`plen' + local vn : permname `vn', length(`vlen') + } + local eqname "`saverfprefix'`vn'" + local eqname : subinstr local eqname "." "_" + qui estimates dir + local est_list "`r(names)'" + Subtract est_list : "`est_list'" "`eqname'" + local est_ct : word count `est_list' + if `est_ct' < `maxest' { + capture est store `eqname', title("Reduced-form regression: `lhs'") + return local rfeq "`eqname'" + } + else { +di +di in ye "Unable to store reduced-form regression of `lhs'." +di in ye "There may be insufficient room to store results using -estimates store-." +di in ye "Try dropping one or more estimation results using -estimates drop-." +di + } + _estimates unhold `tempest' + return scalar arf=`arf' + return scalar arfp=`arfp' + return scalar ardf=`ardf' + return scalar ardf_r=`ardf_r' + return scalar archi2=`archi2' + return scalar archi2p=`archi2p' +end + +************************************************************************************** +program define IsStop, sclass + /* sic, must do tests one-at-a-time, + * 0, may be very large */ + version 8.2 + if `"`0'"' == "[" { + sret local stop 1 + exit + } + if `"`0'"' == "," { + sret local stop 1 + exit + } + if `"`0'"' == "if" { + sret local stop 1 + exit + } +* per official ivreg 5.1.3 + if substr(`"`0'"',1,3) == "if(" { + sret local stop 1 + exit + } + if `"`0'"' == "in" { + sret local stop 1 + exit + } + if `"`0'"' == "" { + sret local stop 1 + exit + } + else sret local stop 0 +end + +program define Disp + version 8.2 + syntax [anything] [, _col(integer 15) ] + local len = 80-`_col'+1 + local piece : piece 1 `len' of `"`anything'"' + local i 1 + while "`piece'" != "" { + di in gr _col(`_col') "`first'`piece'" + local i = `i' + 1 + local piece : piece `i' `len' of `"`anything'"' + } + if `i'==1 { + di + } +end + + + +* Remove all tokens in dirt from full +* Returns "cleaned" full list in cleaned + +program define Subtract /* : */ + version 8.2 + args cleaned /* macro name to hold cleaned list + */ colon /* ":" + */ full /* list to be cleaned + */ dirt /* tokens to be cleaned from full */ + + tokenize `dirt' + local i 1 + while "``i''" != "" { + local full : subinstr local full "``i''" "", word all + local i = `i' + 1 + } + + tokenize `full' /* cleans up extra spaces */ + c_local `cleaned' `*' +end + +program define vecsort /* Also clears col/row names */ + version 8.2 + args vmat + tempname hold + mat `vmat'=`vmat'+J(rowsof(`vmat'),colsof(`vmat'),0) + local lastcol = colsof(`vmat') + local i 1 + while `i' < `lastcol' { + if `vmat'[1,`i'] > `vmat'[1,`i'+1] { + scalar `hold' = `vmat'[1,`i'] + mat `vmat'[1,`i'] = `vmat'[1,`i'+1] + mat `vmat'[1,`i'+1] = `hold' + local i = 1 + } + else { + local i = `i' + 1 + } + } +end + +program define matsort + version 8.2 + args vmat names + tempname hold + foreach vn in `names' { + mat `hold'=nullmat(`hold'), `vmat'[1...,"`vn'"] + } + mat `vmat'=`hold' + mat drop `hold' + foreach vn in `names' { + mat `hold'=nullmat(`hold') \ `vmat'["`vn'",1...] + } + mat `vmat'=`hold' +end + +program define cdsy, rclass + version 8.2 + syntax , type(string) k2(integer) nendog(integer) + +* type() can be ivbias5 (k2<=100, nendog<=3) +* ivbias10 (ditto) +* ivbias20 (ditto) +* ivbias30 (ditto) +* ivsize10 (k2<=100, nendog<=2) +* ivsize15 (ditto) +* ivsize20 (ditto) +* ivsize25 (ditto) +* fullrel5 (ditto) +* fullrel10 (ditto) +* fullrel20 (ditto) +* fullrel30 (ditto) +* fullmax5 (ditto) +* fullmax10 (ditto) +* fullmax20 (ditto) +* fullmax30 (ditto) +* limlsize10 (ditto) +* limlsize15 (ditto) +* limlsize20 (ditto) +* limlsize25 (ditto) + + tempname temp cv + +* Initialize critical value as MV + scalar `cv'=. + + if "`type'"=="ivbias5" { + matrix input `temp' = ( /* + */ . , . , . \ /* + */ . , . , . \ /* + */ 13.91 , . , . \ /* + */ 16.85 , 11.04 , . \ /* + */ 18.37 , 13.97 , 9.53 \ /* + */ 19.28 , 15.72 , 12.20 \ /* + */ 19.86 , 16.88 , 13.95 \ /* + */ 20.25 , 17.70 , 15.18 \ /* + */ 20.53 , 18.30 , 16.10 \ /* + */ 20.74 , 18.76 , 16.80 \ /* + */ 20.90 , 19.12 , 17.35 \ /* + */ 21.01 , 19.40 , 17.80 \ /* + */ 21.10 , 19.64 , 18.17 \ /* + */ 21.18 , 19.83 , 18.47 \ /* + */ 21.23 , 19.98 , 18.73 \ /* + */ 21.28 , 20.12 , 18.94 \ /* + */ 21.31 , 20.23 , 19.13 \ /* + */ 21.34 , 20.33 , 19.29 \ /* + */ 21.36 , 20.41 , 19.44 \ /* + */ 21.38 , 20.48 , 19.56 \ /* + */ 21.39 , 20.54 , 19.67 \ /* + */ 21.40 , 20.60 , 19.77 \ /* + */ 21.41 , 20.65 , 19.86 \ /* + */ 21.41 , 20.69 , 19.94 \ /* + */ 21.42 , 20.73 , 20.01 \ /* + */ 21.42 , 20.76 , 20.07 \ /* + */ 21.42 , 20.79 , 20.13 \ /* + */ 21.42 , 20.82 , 20.18 \ /* + */ 21.42 , 20.84 , 20.23 \ /* + */ 21.42 , 20.86 , 20.27 \ /* + */ 21.41 , 20.88 , 20.31 \ /* + */ 21.41 , 20.90 , 20.35 \ /* + */ 21.41 , 20.91 , 20.38 \ /* + */ 21.40 , 20.93 , 20.41 \ /* + */ 21.40 , 20.94 , 20.44 \ /* + */ 21.39 , 20.95 , 20.47 \ /* + */ 21.39 , 20.96 , 20.49 \ /* + */ 21.38 , 20.97 , 20.51 \ /* + */ 21.38 , 20.98 , 20.54 \ /* + */ 21.37 , 20.99 , 20.56 \ /* + */ 21.37 , 20.99 , 20.57 \ /* + */ 21.36 , 21.00 , 20.59 \ /* + */ 21.35 , 21.00 , 20.61 \ /* + */ 21.35 , 21.01 , 20.62 \ /* + */ 21.34 , 21.01 , 20.64 \ /* + */ 21.34 , 21.02 , 20.65 \ /* + */ 21.33 , 21.02 , 20.66 \ /* + */ 21.32 , 21.02 , 20.67 \ /* + */ 21.32 , 21.03 , 20.68 \ /* + */ 21.31 , 21.03 , 20.69 \ /* + */ 21.31 , 21.03 , 20.70 \ /* + */ 21.30 , 21.03 , 20.71 \ /* + */ 21.30 , 21.03 , 20.72 \ /* + */ 21.29 , 21.03 , 20.73 \ /* + */ 21.28 , 21.03 , 20.73 \ /* + */ 21.28 , 21.04 , 20.74 \ /* + */ 21.27 , 21.04 , 20.75 \ /* + */ 21.27 , 21.04 , 20.75 \ /* + */ 21.26 , 21.04 , 20.76 \ /* + */ 21.26 , 21.04 , 20.76 \ /* + */ 21.25 , 21.04 , 20.77 \ /* + */ 21.24 , 21.04 , 20.77 \ /* + */ 21.24 , 21.04 , 20.78 \ /* + */ 21.23 , 21.04 , 20.78 \ /* + */ 21.23 , 21.03 , 20.79 \ /* + */ 21.22 , 21.03 , 20.79 \ /* + */ 21.22 , 21.03 , 20.79 \ /* + */ 21.21 , 21.03 , 20.80 \ /* + */ 21.21 , 21.03 , 20.80 \ /* + */ 21.20 , 21.03 , 20.80 \ /* + */ 21.20 , 21.03 , 20.80 \ /* + */ 21.19 , 21.03 , 20.81 \ /* + */ 21.19 , 21.03 , 20.81 \ /* + */ 21.18 , 21.03 , 20.81 \ /* + */ 21.18 , 21.02 , 20.81 \ /* + */ 21.17 , 21.02 , 20.82 \ /* + */ 21.17 , 21.02 , 20.82 \ /* + */ 21.16 , 21.02 , 20.82 \ /* + */ 21.16 , 21.02 , 20.82 \ /* + */ 21.15 , 21.02 , 20.82 \ /* + */ 21.15 , 21.02 , 20.82 \ /* + */ 21.15 , 21.02 , 20.83 \ /* + */ 21.14 , 21.01 , 20.83 \ /* + */ 21.14 , 21.01 , 20.83 \ /* + */ 21.13 , 21.01 , 20.83 \ /* + */ 21.13 , 21.01 , 20.83 \ /* + */ 21.12 , 21.01 , 20.84 \ /* + */ 21.12 , 21.01 , 20.84 \ /* + */ 21.11 , 21.01 , 20.84 \ /* + */ 21.11 , 21.01 , 20.84 \ /* + */ 21.10 , 21.00 , 20.84 \ /* + */ 21.10 , 21.00 , 20.84 \ /* + */ 21.09 , 21.00 , 20.85 \ /* + */ 21.09 , 21.00 , 20.85 \ /* + */ 21.08 , 21.00 , 20.85 \ /* + */ 21.08 , 21.00 , 20.85 \ /* + */ 21.07 , 21.00 , 20.85 \ /* + */ 21.07 , 20.99 , 20.86 \ /* + */ 21.06 , 20.99 , 20.86 \ /* + */ 21.06 , 20.99 , 20.86 ) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + + + if "`type'"=="ivbias10" { + matrix input `temp' = /* + */ (.,.,. \ /* + */ .,.,. \ /* + */ 9.08,.,. \ /* + */ 10.27,7.56,. \ /* + */ 10.83,8.78,6.61 \ /* + */ 11.12,9.48,7.77 \ /* + */ 11.29,9.92,8.5 \ /* + */ 11.39,10.22,9.01 \ /* + */ 11.46,10.43,9.37 \ /* + */ 11.49,10.58,9.64 \ /* + */ 11.51,10.69,9.85 \ /* + */ 11.52,10.78,10.01 \ /* + */ 11.52,10.84,10.14 \ /* + */ 11.52,10.89,10.25 \ /* + */ 11.51,10.93,10.33 \ /* + */ 11.5,10.96,10.41 \ /* + */ 11.49,10.99,10.47 \ /* + */ 11.48,11,10.52 \ /* + */ 11.46,11.02,10.56 \ /* + */ 11.45,11.03,10.6 \ /* + */ 11.44,11.04,10.63 \ /* + */ 11.42,11.05,10.65 \ /* + */ 11.41,11.05,10.68 \ /* + */ 11.4,11.05,10.7 \ /* + */ 11.38,11.06,10.71 \ /* + */ 11.37,11.06,10.73 \ /* + */ 11.36,11.06,10.74 \ /* + */ 11.34,11.05,10.75 \ /* + */ 11.33,11.05,10.76 \ /* + */ 11.32,11.05,10.77 \ /* + */ 11.3,11.05,10.78 \ /* + */ 11.29,11.05,10.79 \ /* + */ 11.28,11.04,10.79 \ /* + */ 11.27,11.04,10.8 \ /* + */ 11.26,11.04,10.8 \ /* + */ 11.25,11.03,10.8 \ /* + */ 11.24,11.03,10.81 \ /* + */ 11.23,11.02,10.81 \ /* + */ 11.22,11.02,10.81 \ /* + */ 11.21,11.02,10.81 \ /* + */ 11.2,11.01,10.81 \ /* + */ 11.19,11.01,10.81 \ /* + */ 11.18,11,10.81 \ /* + */ 11.17,11,10.81 \ /* + */ 11.16,10.99,10.81 \ /* + */ 11.15,10.99,10.81 \ /* + */ 11.14,10.98,10.81 \ /* + */ 11.13,10.98,10.81 \ /* + */ 11.13,10.98,10.81 \ /* + */ 11.12,10.97,10.81 \ /* + */ 11.11,10.97,10.81 \ /* + */ 11.1,10.96,10.81 \ /* + */ 11.1,10.96,10.81 \ /* + */ 11.09,10.95,10.81 \ /* + */ 11.08,10.95,10.81 \ /* + */ 11.07,10.94,10.8 \ /* + */ 11.07,10.94,10.8 \ /* + */ 11.06,10.94,10.8 \ /* + */ 11.05,10.93,10.8 \ /* + */ 11.05,10.93,10.8 \ /* + */ 11.04,10.92,10.8 \ /* + */ 11.03,10.92,10.79 \ /* + */ 11.03,10.92,10.79 \ /* + */ 11.02,10.91,10.79 \ /* + */ 11.02,10.91,10.79 \ /* + */ 11.01,10.9,10.79 \ /* + */ 11,10.9,10.79 \ /* + */ 11,10.9,10.78 \ /* + */ 10.99,10.89,10.78 \ /* + */ 10.99,10.89,10.78 \ /* + */ 10.98,10.89,10.78 \ /* + */ 10.98,10.88,10.78 \ /* + */ 10.97,10.88,10.77 \ /* + */ 10.97,10.88,10.77 \ /* + */ 10.96,10.87,10.77 \ /* + */ 10.96,10.87,10.77 \ /* + */ 10.95,10.86,10.77 \ /* + */ 10.95,10.86,10.76 \ /* + */ 10.94,10.86,10.76 \ /* + */ 10.94,10.85,10.76 \ /* + */ 10.93,10.85,10.76 \ /* + */ 10.93,10.85,10.76 \ /* + */ 10.92,10.84,10.75 \ /* + */ 10.92,10.84,10.75 \ /* + */ 10.91,10.84,10.75 \ /* + */ 10.91,10.84,10.75 \ /* + */ 10.91,10.83,10.75 \ /* + */ 10.9,10.83,10.74 \ /* + */ 10.9,10.83,10.74 \ /* + */ 10.89,10.82,10.74 \ /* + */ 10.89,10.82,10.74 \ /* + */ 10.89,10.82,10.74 \ /* + */ 10.88,10.81,10.74 \ /* + */ 10.88,10.81,10.73 \ /* + */ 10.87,10.81,10.73 \ /* + */ 10.87,10.81,10.73 \ /* + */ 10.87,10.8,10.73 \ /* + */ 10.86,10.8,10.73 \ /* + */ 10.86,10.8,10.72 \ /* + */ 10.86,10.8,10.72) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + if "`type'"=="ivbias20" { + matrix input `temp' = ( /* + */ . , . , . \ /* + */ . , . , . \ /* + */ 6.46 , . , . \ /* + */ 6.71 , 5.57 , . \ /* + */ 6.77 , 5.91 , 4.99 \ /* + */ 6.76 , 6.08 , 5.35 \ /* + */ 6.73 , 6.16 , 5.56 \ /* + */ 6.69 , 6.20 , 5.69 \ /* + */ 6.65 , 6.22 , 5.78 \ /* + */ 6.61 , 6.23 , 5.83 \ /* + */ 6.56 , 6.23 , 5.87 \ /* + */ 6.53 , 6.22 , 5.90 \ /* + */ 6.49 , 6.21 , 5.92 \ /* + */ 6.45 , 6.20 , 5.93 \ /* + */ 6.42 , 6.19 , 5.94 \ /* + */ 6.39 , 6.17 , 5.94 \ /* + */ 6.36 , 6.16 , 5.94 \ /* + */ 6.33 , 6.14 , 5.94 \ /* + */ 6.31 , 6.13 , 5.94 \ /* + */ 6.28 , 6.11 , 5.93 \ /* + */ 6.26 , 6.10 , 5.93 \ /* + */ 6.24 , 6.08 , 5.92 \ /* + */ 6.22 , 6.07 , 5.92 \ /* + */ 6.20 , 6.06 , 5.91 \ /* + */ 6.18 , 6.05 , 5.90 \ /* + */ 6.16 , 6.03 , 5.90 \ /* + */ 6.14 , 6.02 , 5.89 \ /* + */ 6.13 , 6.01 , 5.88 \ /* + */ 6.11 , 6.00 , 5.88 \ /* + */ 6.09 , 5.99 , 5.87 \ /* + */ 6.08 , 5.98 , 5.87 \ /* + */ 6.07 , 5.97 , 5.86 \ /* + */ 6.05 , 5.96 , 5.85 \ /* + */ 6.04 , 5.95 , 5.85 \ /* + */ 6.03 , 5.94 , 5.84 \ /* + */ 6.01 , 5.93 , 5.83 \ /* + */ 6.00 , 5.92 , 5.83 \ /* + */ 5.99 , 5.91 , 5.82 \ /* + */ 5.98 , 5.90 , 5.82 \ /* + */ 5.97 , 5.89 , 5.81 \ /* + */ 5.96 , 5.89 , 5.80 \ /* + */ 5.95 , 5.88 , 5.80 \ /* + */ 5.94 , 5.87 , 5.79 \ /* + */ 5.93 , 5.86 , 5.79 \ /* + */ 5.92 , 5.86 , 5.78 \ /* + */ 5.91 , 5.85 , 5.78 \ /* + */ 5.91 , 5.84 , 5.77 \ /* + */ 5.90 , 5.83 , 5.77 \ /* + */ 5.89 , 5.83 , 5.76 \ /* + */ 5.88 , 5.82 , 5.76 \ /* + */ 5.87 , 5.82 , 5.75 \ /* + */ 5.87 , 5.81 , 5.75 \ /* + */ 5.86 , 5.80 , 5.74 \ /* + */ 5.85 , 5.80 , 5.74 \ /* + */ 5.85 , 5.79 , 5.73 \ /* + */ 5.84 , 5.79 , 5.73 \ /* + */ 5.83 , 5.78 , 5.72 \ /* + */ 5.83 , 5.78 , 5.72 \ /* + */ 5.82 , 5.77 , 5.72 \ /* + */ 5.81 , 5.77 , 5.71 \ /* + */ 5.81 , 5.76 , 5.71 \ /* + */ 5.80 , 5.76 , 5.70 \ /* + */ 5.80 , 5.75 , 5.70 \ /* + */ 5.79 , 5.75 , 5.70 \ /* + */ 5.78 , 5.74 , 5.69 \ /* + */ 5.78 , 5.74 , 5.69 \ /* + */ 5.77 , 5.73 , 5.68 \ /* + */ 5.77 , 5.73 , 5.68 \ /* + */ 5.76 , 5.72 , 5.68 \ /* + */ 5.76 , 5.72 , 5.67 \ /* + */ 5.75 , 5.72 , 5.67 \ /* + */ 5.75 , 5.71 , 5.67 \ /* + */ 5.75 , 5.71 , 5.66 \ /* + */ 5.74 , 5.70 , 5.66 \ /* + */ 5.74 , 5.70 , 5.66 \ /* + */ 5.73 , 5.70 , 5.65 \ /* + */ 5.73 , 5.69 , 5.65 \ /* + */ 5.72 , 5.69 , 5.65 \ /* + */ 5.72 , 5.68 , 5.65 \ /* + */ 5.71 , 5.68 , 5.64 \ /* + */ 5.71 , 5.68 , 5.64 \ /* + */ 5.71 , 5.67 , 5.64 \ /* + */ 5.70 , 5.67 , 5.63 \ /* + */ 5.70 , 5.67 , 5.63 \ /* + */ 5.70 , 5.66 , 5.63 \ /* + */ 5.69 , 5.66 , 5.62 \ /* + */ 5.69 , 5.66 , 5.62 \ /* + */ 5.68 , 5.65 , 5.62 \ /* + */ 5.68 , 5.65 , 5.62 \ /* + */ 5.68 , 5.65 , 5.61 \ /* + */ 5.67 , 5.65 , 5.61 \ /* + */ 5.67 , 5.64 , 5.61 \ /* + */ 5.67 , 5.64 , 5.61 \ /* + */ 5.66 , 5.64 , 5.60 \ /* + */ 5.66 , 5.63 , 5.60 \ /* + */ 5.66 , 5.63 , 5.60 \ /* + */ 5.65 , 5.63 , 5.60 \ /* + */ 5.65 , 5.63 , 5.59 \ /* + */ 5.65 , 5.62 , 5.59 \ /* + */ 5.65 , 5.62 , 5.59 ) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivbias30" { + matrix input `temp' = ( /* + */ . , . , . \ /* + */ . , . , . \ /* + */ 5.39 , . , . \ /* + */ 5.34 , 4.73 , . \ /* + */ 5.25 , 4.79 , 4.30 \ /* + */ 5.15 , 4.78 , 4.40 \ /* + */ 5.07 , 4.76 , 4.44 \ /* + */ 4.99 , 4.73 , 4.46 \ /* + */ 4.92 , 4.69 , 4.46 \ /* + */ 4.86 , 4.66 , 4.45 \ /* + */ 4.80 , 4.62 , 4.44 \ /* + */ 4.75 , 4.59 , 4.42 \ /* + */ 4.71 , 4.56 , 4.41 \ /* + */ 4.67 , 4.53 , 4.39 \ /* + */ 4.63 , 4.50 , 4.37 \ /* + */ 4.59 , 4.48 , 4.36 \ /* + */ 4.56 , 4.45 , 4.34 \ /* + */ 4.53 , 4.43 , 4.32 \ /* + */ 4.51 , 4.41 , 4.31 \ /* + */ 4.48 , 4.39 , 4.29 \ /* + */ 4.46 , 4.37 , 4.28 \ /* + */ 4.43 , 4.35 , 4.27 \ /* + */ 4.41 , 4.33 , 4.25 \ /* + */ 4.39 , 4.32 , 4.24 \ /* + */ 4.37 , 4.30 , 4.23 \ /* + */ 4.35 , 4.29 , 4.21 \ /* + */ 4.34 , 4.27 , 4.20 \ /* + */ 4.32 , 4.26 , 4.19 \ /* + */ 4.31 , 4.24 , 4.18 \ /* + */ 4.29 , 4.23 , 4.17 \ /* + */ 4.28 , 4.22 , 4.16 \ /* + */ 4.26 , 4.21 , 4.15 \ /* + */ 4.25 , 4.20 , 4.14 \ /* + */ 4.24 , 4.19 , 4.13 \ /* + */ 4.23 , 4.18 , 4.13 \ /* + */ 4.22 , 4.17 , 4.12 \ /* + */ 4.20 , 4.16 , 4.11 \ /* + */ 4.19 , 4.15 , 4.10 \ /* + */ 4.18 , 4.14 , 4.09 \ /* + */ 4.17 , 4.13 , 4.09 \ /* + */ 4.16 , 4.12 , 4.08 \ /* + */ 4.15 , 4.11 , 4.07 \ /* + */ 4.15 , 4.11 , 4.07 \ /* + */ 4.14 , 4.10 , 4.06 \ /* + */ 4.13 , 4.09 , 4.05 \ /* + */ 4.12 , 4.08 , 4.05 \ /* + */ 4.11 , 4.08 , 4.04 \ /* + */ 4.11 , 4.07 , 4.03 \ /* + */ 4.10 , 4.06 , 4.03 \ /* + */ 4.09 , 4.06 , 4.02 \ /* + */ 4.08 , 4.05 , 4.02 \ /* + */ 4.08 , 4.05 , 4.01 \ /* + */ 4.07 , 4.04 , 4.01 \ /* + */ 4.06 , 4.03 , 4.00 \ /* + */ 4.06 , 4.03 , 4.00 \ /* + */ 4.05 , 4.02 , 3.99 \ /* + */ 4.05 , 4.02 , 3.99 \ /* + */ 4.04 , 4.01 , 3.98 \ /* + */ 4.04 , 4.01 , 3.98 \ /* + */ 4.03 , 4.00 , 3.97 \ /* + */ 4.02 , 4.00 , 3.97 \ /* + */ 4.02 , 3.99 , 3.96 \ /* + */ 4.01 , 3.99 , 3.96 \ /* + */ 4.01 , 3.98 , 3.96 \ /* + */ 4.00 , 3.98 , 3.95 \ /* + */ 4.00 , 3.97 , 3.95 \ /* + */ 3.99 , 3.97 , 3.94 \ /* + */ 3.99 , 3.97 , 3.94 \ /* + */ 3.99 , 3.96 , 3.94 \ /* + */ 3.98 , 3.96 , 3.93 \ /* + */ 3.98 , 3.95 , 3.93 \ /* + */ 3.97 , 3.95 , 3.93 \ /* + */ 3.97 , 3.95 , 3.92 \ /* + */ 3.96 , 3.94 , 3.92 \ /* + */ 3.96 , 3.94 , 3.92 \ /* + */ 3.96 , 3.93 , 3.91 \ /* + */ 3.95 , 3.93 , 3.91 \ /* + */ 3.95 , 3.93 , 3.91 \ /* + */ 3.95 , 3.92 , 3.90 \ /* + */ 3.94 , 3.92 , 3.90 \ /* + */ 3.94 , 3.92 , 3.90 \ /* + */ 3.93 , 3.91 , 3.89 \ /* + */ 3.93 , 3.91 , 3.89 \ /* + */ 3.93 , 3.91 , 3.89 \ /* + */ 3.92 , 3.91 , 3.89 \ /* + */ 3.92 , 3.90 , 3.88 \ /* + */ 3.92 , 3.90 , 3.88 \ /* + */ 3.91 , 3.90 , 3.88 \ /* + */ 3.91 , 3.89 , 3.87 \ /* + */ 3.91 , 3.89 , 3.87 \ /* + */ 3.91 , 3.89 , 3.87 \ /* + */ 3.90 , 3.89 , 3.87 \ /* + */ 3.90 , 3.88 , 3.86 \ /* + */ 3.90 , 3.88 , 3.86 \ /* + */ 3.89 , 3.88 , 3.86 \ /* + */ 3.89 , 3.87 , 3.86 \ /* + */ 3.89 , 3.87 , 3.85 \ /* + */ 3.89 , 3.87 , 3.85 \ /* + */ 3.88 , 3.87 , 3.85 \ /* + */ 3.88 , 3.86 , 3.85 ) + + if `k2'<=100 & `nendog'<=3 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + if "`type'"=="ivsize10" { + matrix input `temp' = /* + */ (16.38,. \ /* + */ 19.93,7.03 \ /* + */ 22.3,13.43 \ /* + */ 24.58,16.87 \ /* + */ 26.87,19.45 \ /* + */ 29.18,21.68 \ /* + */ 31.5,23.72 \ /* + */ 33.84,25.64 \ /* + */ 36.19,27.51 \ /* + */ 38.54,29.32 \ /* + */ 40.9,31.11 \ /* + */ 43.27,32.88 \ /* + */ 45.64,34.62 \ /* + */ 48.01,36.36 \ /* + */ 50.39,38.08 \ /* + */ 52.77,39.8 \ /* + */ 55.15,41.51 \ /* + */ 57.53,43.22 \ /* + */ 59.92,44.92 \ /* + */ 62.3,46.62 \ /* + */ 64.69,48.31 \ /* + */ 67.07,50.01 \ /* + */ 69.46,51.7 \ /* + */ 71.85,53.39 \ /* + */ 74.24,55.07 \ /* + */ 76.62,56.76 \ /* + */ 79.01,58.45 \ /* + */ 81.4,60.13 \ /* + */ 83.79,61.82 \ /* + */ 86.17,63.51 \ /* + */ 88.56,65.19 \ /* + */ 90.95,66.88 \ /* + */ 93.33,68.56 \ /* + */ 95.72,70.25 \ /* + */ 98.11,71.94 \ /* + */ 100.5,73.62 \ /* + */ 102.88,75.31 \ /* + */ 105.27,76.99 \ /* + */ 107.66,78.68 \ /* + */ 110.04,80.37 \ /* + */ 112.43,82.05 \ /* + */ 114.82,83.74 \ /* + */ 117.21,85.42 \ /* + */ 119.59,87.11 \ /* + */ 121.98,88.8 \ /* + */ 124.37,90.48 \ /* + */ 126.75,92.17 \ /* + */ 129.14,93.85 \ /* + */ 131.53,95.54 \ /* + */ 133.92,97.23 \ /* + */ 136.3,98.91 \ /* + */ 138.69,100.6 \ /* + */ 141.08,102.29 \ /* + */ 143.47,103.97 \ /* + */ 145.85,105.66 \ /* + */ 148.24,107.34 \ /* + */ 150.63,109.03 \ /* + */ 153.01,110.72 \ /* + */ 155.4,112.4 \ /* + */ 157.79,114.09 \ /* + */ 160.18,115.77 \ /* + */ 162.56,117.46 \ /* + */ 164.95,119.15 \ /* + */ 167.34,120.83 \ /* + */ 169.72,122.52 \ /* + */ 172.11,124.2 \ /* + */ 174.5,125.89 \ /* + */ 176.89,127.58 \ /* + */ 179.27,129.26 \ /* + */ 181.66,130.95 \ /* + */ 184.05,132.63 \ /* + */ 186.44,134.32 \ /* + */ 188.82,136.01 \ /* + */ 191.21,137.69 \ /* + */ 193.6,139.38 \ /* + */ 195.98,141.07 \ /* + */ 198.37,142.75 \ /* + */ 200.76,144.44 \ /* + */ 203.15,146.12 \ /* + */ 205.53,147.81 \ /* + */ 207.92,149.5 \ /* + */ 210.31,151.18 \ /* + */ 212.69,152.87 \ /* + */ 215.08,154.55 \ /* + */ 217.47,156.24 \ /* + */ 219.86,157.93 \ /* + */ 222.24,159.61 \ /* + */ 224.63,161.3 \ /* + */ 227.02,162.98 \ /* + */ 229.41,164.67 \ /* + */ 231.79,166.36 \ /* + */ 234.18,168.04 \ /* + */ 236.57,169.73 \ /* + */ 238.95,171.41 \ /* + */ 241.34,173.1 \ /* + */ 243.73,174.79 \ /* + */ 246.12,176.47 \ /* + */ 248.5,178.16 \ /* + */ 250.89,179.84 \ /* + */ 253.28,181.53) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize15" { + matrix input `temp' = ( /* + */ 8.96 , . \ /* + */ 11.59 , 4.58 \ /* + */ 12.83 , 8.18 \ /* + */ 13.96 , 9.93 \ /* + */ 15.09 , 11.22 \ /* + */ 16.23 , 12.33 \ /* + */ 17.38 , 13.34 \ /* + */ 18.54 , 14.31 \ /* + */ 19.71 , 15.24 \ /* + */ 20.88 , 16.16 \ /* + */ 22.06 , 17.06 \ /* + */ 23.24 , 17.95 \ /* + */ 24.42 , 18.84 \ /* + */ 25.61 , 19.72 \ /* + */ 26.80 , 20.60 \ /* + */ 27.99 , 21.48 \ /* + */ 29.19 , 22.35 \ /* + */ 30.38 , 23.22 \ /* + */ 31.58 , 24.09 \ /* + */ 32.77 , 24.96 \ /* + */ 33.97 , 25.82 \ /* + */ 35.17 , 26.69 \ /* + */ 36.37 , 27.56 \ /* + */ 37.57 , 28.42 \ /* + */ 38.77 , 29.29 \ /* + */ 39.97 , 30.15 \ /* + */ 41.17 , 31.02 \ /* + */ 42.37 , 31.88 \ /* + */ 43.57 , 32.74 \ /* + */ 44.78 , 33.61 \ /* + */ 45.98 , 34.47 \ /* + */ 47.18 , 35.33 \ /* + */ 48.38 , 36.19 \ /* + */ 49.59 , 37.06 \ /* + */ 50.79 , 37.92 \ /* + */ 51.99 , 38.78 \ /* + */ 53.19 , 39.64 \ /* + */ 54.40 , 40.50 \ /* + */ 55.60 , 41.37 \ /* + */ 56.80 , 42.23 \ /* + */ 58.01 , 43.09 \ /* + */ 59.21 , 43.95 \ /* + */ 60.41 , 44.81 \ /* + */ 61.61 , 45.68 \ /* + */ 62.82 , 46.54 \ /* + */ 64.02 , 47.40 \ /* + */ 65.22 , 48.26 \ /* + */ 66.42 , 49.12 \ /* + */ 67.63 , 49.99 \ /* + */ 68.83 , 50.85 \ /* + */ 70.03 , 51.71 \ /* + */ 71.24 , 52.57 \ /* + */ 72.44 , 53.43 \ /* + */ 73.64 , 54.30 \ /* + */ 74.84 , 55.16 \ /* + */ 76.05 , 56.02 \ /* + */ 77.25 , 56.88 \ /* + */ 78.45 , 57.74 \ /* + */ 79.66 , 58.61 \ /* + */ 80.86 , 59.47 \ /* + */ 82.06 , 60.33 \ /* + */ 83.26 , 61.19 \ /* + */ 84.47 , 62.05 \ /* + */ 85.67 , 62.92 \ /* + */ 86.87 , 63.78 \ /* + */ 88.07 , 64.64 \ /* + */ 89.28 , 65.50 \ /* + */ 90.48 , 66.36 \ /* + */ 91.68 , 67.22 \ /* + */ 92.89 , 68.09 \ /* + */ 94.09 , 68.95 \ /* + */ 95.29 , 69.81 \ /* + */ 96.49 , 70.67 \ /* + */ 97.70 , 71.53 \ /* + */ 98.90 , 72.40 \ /* + */ 100.10 , 73.26 \ /* + */ 101.30 , 74.12 \ /* + */ 102.51 , 74.98 \ /* + */ 103.71 , 75.84 \ /* + */ 104.91 , 76.71 \ /* + */ 106.12 , 77.57 \ /* + */ 107.32 , 78.43 \ /* + */ 108.52 , 79.29 \ /* + */ 109.72 , 80.15 \ /* + */ 110.93 , 81.02 \ /* + */ 112.13 , 81.88 \ /* + */ 113.33 , 82.74 \ /* + */ 114.53 , 83.60 \ /* + */ 115.74 , 84.46 \ /* + */ 116.94 , 85.33 \ /* + */ 118.14 , 86.19 \ /* + */ 119.35 , 87.05 \ /* + */ 120.55 , 87.91 \ /* + */ 121.75 , 88.77 \ /* + */ 122.95 , 89.64 \ /* + */ 124.16 , 90.50 \ /* + */ 125.36 , 91.36 \ /* + */ 126.56 , 92.22 \ /* + */ 127.76 , 93.08 \ /* + */ 128.97 , 93.95 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize20" { + matrix input `temp' = ( /* + */ 6.66 , . \ /* + */ 8.75 , 3.95 \ /* + */ 9.54 , 6.40 \ /* + */ 10.26 , 7.54 \ /* + */ 10.98 , 8.38 \ /* + */ 11.72 , 9.10 \ /* + */ 12.48 , 9.77 \ /* + */ 13.24 , 10.41 \ /* + */ 14.01 , 11.03 \ /* + */ 14.78 , 11.65 \ /* + */ 15.56 , 12.25 \ /* + */ 16.35 , 12.86 \ /* + */ 17.14 , 13.45 \ /* + */ 17.93 , 14.05 \ /* + */ 18.72 , 14.65 \ /* + */ 19.51 , 15.24 \ /* + */ 20.31 , 15.83 \ /* + */ 21.10 , 16.42 \ /* + */ 21.90 , 17.02 \ /* + */ 22.70 , 17.61 \ /* + */ 23.50 , 18.20 \ /* + */ 24.30 , 18.79 \ /* + */ 25.10 , 19.38 \ /* + */ 25.90 , 19.97 \ /* + */ 26.71 , 20.56 \ /* + */ 27.51 , 21.15 \ /* + */ 28.31 , 21.74 \ /* + */ 29.12 , 22.33 \ /* + */ 29.92 , 22.92 \ /* + */ 30.72 , 23.51 \ /* + */ 31.53 , 24.10 \ /* + */ 32.33 , 24.69 \ /* + */ 33.14 , 25.28 \ /* + */ 33.94 , 25.87 \ /* + */ 34.75 , 26.46 \ /* + */ 35.55 , 27.05 \ /* + */ 36.36 , 27.64 \ /* + */ 37.17 , 28.23 \ /* + */ 37.97 , 28.82 \ /* + */ 38.78 , 29.41 \ /* + */ 39.58 , 30.00 \ /* + */ 40.39 , 30.59 \ /* + */ 41.20 , 31.18 \ /* + */ 42.00 , 31.77 \ /* + */ 42.81 , 32.36 \ /* + */ 43.62 , 32.95 \ /* + */ 44.42 , 33.54 \ /* + */ 45.23 , 34.13 \ /* + */ 46.03 , 34.72 \ /* + */ 46.84 , 35.31 \ /* + */ 47.65 , 35.90 \ /* + */ 48.45 , 36.49 \ /* + */ 49.26 , 37.08 \ /* + */ 50.06 , 37.67 \ /* + */ 50.87 , 38.26 \ /* + */ 51.68 , 38.85 \ /* + */ 52.48 , 39.44 \ /* + */ 53.29 , 40.02 \ /* + */ 54.09 , 40.61 \ /* + */ 54.90 , 41.20 \ /* + */ 55.71 , 41.79 \ /* + */ 56.51 , 42.38 \ /* + */ 57.32 , 42.97 \ /* + */ 58.13 , 43.56 \ /* + */ 58.93 , 44.15 \ /* + */ 59.74 , 44.74 \ /* + */ 60.54 , 45.33 \ /* + */ 61.35 , 45.92 \ /* + */ 62.16 , 46.51 \ /* + */ 62.96 , 47.10 \ /* + */ 63.77 , 47.69 \ /* + */ 64.57 , 48.28 \ /* + */ 65.38 , 48.87 \ /* + */ 66.19 , 49.46 \ /* + */ 66.99 , 50.05 \ /* + */ 67.80 , 50.64 \ /* + */ 68.60 , 51.23 \ /* + */ 69.41 , 51.82 \ /* + */ 70.22 , 52.41 \ /* + */ 71.02 , 53.00 \ /* + */ 71.83 , 53.59 \ /* + */ 72.64 , 54.18 \ /* + */ 73.44 , 54.77 \ /* + */ 74.25 , 55.36 \ /* + */ 75.05 , 55.95 \ /* + */ 75.86 , 56.54 \ /* + */ 76.67 , 57.13 \ /* + */ 77.47 , 57.72 \ /* + */ 78.28 , 58.31 \ /* + */ 79.08 , 58.90 \ /* + */ 79.89 , 59.49 \ /* + */ 80.70 , 60.08 \ /* + */ 81.50 , 60.67 \ /* + */ 82.31 , 61.26 \ /* + */ 83.12 , 61.85 \ /* + */ 83.92 , 62.44 \ /* + */ 84.73 , 63.03 \ /* + */ 85.53 , 63.62 \ /* + */ 86.34 , 64.21 \ /* + */ 87.15 , 64.80 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="ivsize25" { + matrix input `temp' = ( /* + */ 5.53 , . \ /* + */ 7.25 , 3.63 \ /* + */ 7.80 , 5.45 \ /* + */ 8.31 , 6.28 \ /* + */ 8.84 , 6.89 \ /* + */ 9.38 , 7.42 \ /* + */ 9.93 , 7.91 \ /* + */ 10.50 , 8.39 \ /* + */ 11.07 , 8.85 \ /* + */ 11.65 , 9.31 \ /* + */ 12.23 , 9.77 \ /* + */ 12.82 , 10.22 \ /* + */ 13.41 , 10.68 \ /* + */ 14.00 , 11.13 \ /* + */ 14.60 , 11.58 \ /* + */ 15.19 , 12.03 \ /* + */ 15.79 , 12.49 \ /* + */ 16.39 , 12.94 \ /* + */ 16.99 , 13.39 \ /* + */ 17.60 , 13.84 \ /* + */ 18.20 , 14.29 \ /* + */ 18.80 , 14.74 \ /* + */ 19.41 , 15.19 \ /* + */ 20.01 , 15.64 \ /* + */ 20.61 , 16.10 \ /* + */ 21.22 , 16.55 \ /* + */ 21.83 , 17.00 \ /* + */ 22.43 , 17.45 \ /* + */ 23.04 , 17.90 \ /* + */ 23.65 , 18.35 \ /* + */ 24.25 , 18.81 \ /* + */ 24.86 , 19.26 \ /* + */ 25.47 , 19.71 \ /* + */ 26.08 , 20.16 \ /* + */ 26.68 , 20.61 \ /* + */ 27.29 , 21.06 \ /* + */ 27.90 , 21.52 \ /* + */ 28.51 , 21.97 \ /* + */ 29.12 , 22.42 \ /* + */ 29.73 , 22.87 \ /* + */ 30.33 , 23.32 \ /* + */ 30.94 , 23.78 \ /* + */ 31.55 , 24.23 \ /* + */ 32.16 , 24.68 \ /* + */ 32.77 , 25.13 \ /* + */ 33.38 , 25.58 \ /* + */ 33.99 , 26.04 \ /* + */ 34.60 , 26.49 \ /* + */ 35.21 , 26.94 \ /* + */ 35.82 , 27.39 \ /* + */ 36.43 , 27.85 \ /* + */ 37.04 , 28.30 \ /* + */ 37.65 , 28.75 \ /* + */ 38.25 , 29.20 \ /* + */ 38.86 , 29.66 \ /* + */ 39.47 , 30.11 \ /* + */ 40.08 , 30.56 \ /* + */ 40.69 , 31.01 \ /* + */ 41.30 , 31.47 \ /* + */ 41.91 , 31.92 \ /* + */ 42.52 , 32.37 \ /* + */ 43.13 , 32.82 \ /* + */ 43.74 , 33.27 \ /* + */ 44.35 , 33.73 \ /* + */ 44.96 , 34.18 \ /* + */ 45.57 , 34.63 \ /* + */ 46.18 , 35.08 \ /* + */ 46.78 , 35.54 \ /* + */ 47.39 , 35.99 \ /* + */ 48.00 , 36.44 \ /* + */ 48.61 , 36.89 \ /* + */ 49.22 , 37.35 \ /* + */ 49.83 , 37.80 \ /* + */ 50.44 , 38.25 \ /* + */ 51.05 , 38.70 \ /* + */ 51.66 , 39.16 \ /* + */ 52.27 , 39.61 \ /* + */ 52.88 , 40.06 \ /* + */ 53.49 , 40.51 \ /* + */ 54.10 , 40.96 \ /* + */ 54.71 , 41.42 \ /* + */ 55.32 , 41.87 \ /* + */ 55.92 , 42.32 \ /* + */ 56.53 , 42.77 \ /* + */ 57.14 , 43.23 \ /* + */ 57.75 , 43.68 \ /* + */ 58.36 , 44.13 \ /* + */ 58.97 , 44.58 \ /* + */ 59.58 , 45.04 \ /* + */ 60.19 , 45.49 \ /* + */ 60.80 , 45.94 \ /* + */ 61.41 , 46.39 \ /* + */ 62.02 , 46.85 \ /* + */ 62.63 , 47.30 \ /* + */ 63.24 , 47.75 \ /* + */ 63.85 , 48.20 \ /* + */ 64.45 , 48.65 \ /* + */ 65.06 , 49.11 \ /* + */ 65.67 , 49.56 \ /* + */ 66.28 , 50.01 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel5" { + matrix input `temp' = ( /* + */ 24.09 , . \ /* + */ 13.46 , 15.50 \ /* + */ 9.61 , 10.83 \ /* + */ 7.63 , 8.53 \ /* + */ 6.42 , 7.16 \ /* + */ 5.61 , 6.24 \ /* + */ 5.02 , 5.59 \ /* + */ 4.58 , 5.10 \ /* + */ 4.23 , 4.71 \ /* + */ 3.96 , 4.41 \ /* + */ 3.73 , 4.15 \ /* + */ 3.54 , 3.94 \ /* + */ 3.38 , 3.76 \ /* + */ 3.24 , 3.60 \ /* + */ 3.12 , 3.47 \ /* + */ 3.01 , 3.35 \ /* + */ 2.92 , 3.24 \ /* + */ 2.84 , 3.15 \ /* + */ 2.76 , 3.06 \ /* + */ 2.69 , 2.98 \ /* + */ 2.63 , 2.91 \ /* + */ 2.58 , 2.85 \ /* + */ 2.52 , 2.79 \ /* + */ 2.48 , 2.73 \ /* + */ 2.43 , 2.68 \ /* + */ 2.39 , 2.63 \ /* + */ 2.36 , 2.59 \ /* + */ 2.32 , 2.55 \ /* + */ 2.29 , 2.51 \ /* + */ 2.26 , 2.47 \ /* + */ 2.23 , 2.44 \ /* + */ 2.20 , 2.41 \ /* + */ 2.18 , 2.37 \ /* + */ 2.16 , 2.35 \ /* + */ 2.13 , 2.32 \ /* + */ 2.11 , 2.29 \ /* + */ 2.09 , 2.27 \ /* + */ 2.07 , 2.24 \ /* + */ 2.05 , 2.22 \ /* + */ 2.04 , 2.20 \ /* + */ 2.02 , 2.18 \ /* + */ 2.00 , 2.16 \ /* + */ 1.99 , 2.14 \ /* + */ 1.97 , 2.12 \ /* + */ 1.96 , 2.10 \ /* + */ 1.94 , 2.09 \ /* + */ 1.93 , 2.07 \ /* + */ 1.92 , 2.05 \ /* + */ 1.91 , 2.04 \ /* + */ 1.89 , 2.02 \ /* + */ 1.88 , 2.01 \ /* + */ 1.87 , 2.00 \ /* + */ 1.86 , 1.98 \ /* + */ 1.85 , 1.97 \ /* + */ 1.84 , 1.96 \ /* + */ 1.83 , 1.95 \ /* + */ 1.82 , 1.94 \ /* + */ 1.81 , 1.92 \ /* + */ 1.80 , 1.91 \ /* + */ 1.79 , 1.90 \ /* + */ 1.79 , 1.89 \ /* + */ 1.78 , 1.88 \ /* + */ 1.77 , 1.87 \ /* + */ 1.76 , 1.87 \ /* + */ 1.75 , 1.86 \ /* + */ 1.75 , 1.85 \ /* + */ 1.74 , 1.84 \ /* + */ 1.73 , 1.83 \ /* + */ 1.72 , 1.83 \ /* + */ 1.72 , 1.82 \ /* + */ 1.71 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.79 \ /* + */ 1.68 , 1.79 \ /* + */ 1.68 , 1.78 \ /* + */ 1.67 , 1.77 \ /* + */ 1.67 , 1.77 \ /* + */ 1.66 , 1.76 \ /* + */ 1.65 , 1.76 \ /* + */ 1.65 , 1.75 \ /* + */ 1.64 , 1.75 \ /* + */ 1.64 , 1.74 \ /* + */ 1.63 , 1.74 \ /* + */ 1.63 , 1.73 \ /* + */ 1.62 , 1.73 \ /* + */ 1.61 , 1.73 \ /* + */ 1.61 , 1.72 \ /* + */ 1.60 , 1.72 \ /* + */ 1.60 , 1.71 \ /* + */ 1.59 , 1.71 \ /* + */ 1.59 , 1.71 \ /* + */ 1.58 , 1.71 \ /* + */ 1.58 , 1.70 \ /* + */ 1.57 , 1.70 \ /* + */ 1.57 , 1.70 \ /* + */ 1.56 , 1.69 \ /* + */ 1.56 , 1.69 \ /* + */ 1.55 , 1.69 \ /* + */ 1.55 , 1.69 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel10" { + matrix input `temp' = ( /* + */ 19.36 , . \ /* + */ 10.89 , 12.55 \ /* + */ 7.90 , 8.96 \ /* + */ 6.37 , 7.15 \ /* + */ 5.44 , 6.07 \ /* + */ 4.81 , 5.34 \ /* + */ 4.35 , 4.82 \ /* + */ 4.01 , 4.43 \ /* + */ 3.74 , 4.12 \ /* + */ 3.52 , 3.87 \ /* + */ 3.34 , 3.67 \ /* + */ 3.19 , 3.49 \ /* + */ 3.06 , 3.35 \ /* + */ 2.95 , 3.22 \ /* + */ 2.85 , 3.11 \ /* + */ 2.76 , 3.01 \ /* + */ 2.69 , 2.92 \ /* + */ 2.62 , 2.84 \ /* + */ 2.56 , 2.77 \ /* + */ 2.50 , 2.71 \ /* + */ 2.45 , 2.65 \ /* + */ 2.40 , 2.60 \ /* + */ 2.36 , 2.55 \ /* + */ 2.32 , 2.50 \ /* + */ 2.28 , 2.46 \ /* + */ 2.24 , 2.42 \ /* + */ 2.21 , 2.38 \ /* + */ 2.18 , 2.35 \ /* + */ 2.15 , 2.31 \ /* + */ 2.12 , 2.28 \ /* + */ 2.10 , 2.25 \ /* + */ 2.07 , 2.23 \ /* + */ 2.05 , 2.20 \ /* + */ 2.03 , 2.17 \ /* + */ 2.01 , 2.15 \ /* + */ 1.99 , 2.13 \ /* + */ 1.97 , 2.11 \ /* + */ 1.95 , 2.09 \ /* + */ 1.93 , 2.07 \ /* + */ 1.92 , 2.05 \ /* + */ 1.90 , 2.03 \ /* + */ 1.88 , 2.01 \ /* + */ 1.87 , 2.00 \ /* + */ 1.86 , 1.98 \ /* + */ 1.84 , 1.96 \ /* + */ 1.83 , 1.95 \ /* + */ 1.82 , 1.93 \ /* + */ 1.81 , 1.92 \ /* + */ 1.79 , 1.91 \ /* + */ 1.78 , 1.89 \ /* + */ 1.77 , 1.88 \ /* + */ 1.76 , 1.87 \ /* + */ 1.75 , 1.86 \ /* + */ 1.74 , 1.85 \ /* + */ 1.73 , 1.84 \ /* + */ 1.72 , 1.83 \ /* + */ 1.71 , 1.82 \ /* + */ 1.70 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.79 \ /* + */ 1.68 , 1.78 \ /* + */ 1.67 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.65 , 1.75 \ /* + */ 1.64 , 1.74 \ /* + */ 1.64 , 1.73 \ /* + */ 1.63 , 1.72 \ /* + */ 1.63 , 1.72 \ /* + */ 1.62 , 1.71 \ /* + */ 1.61 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.60 , 1.69 \ /* + */ 1.60 , 1.68 \ /* + */ 1.59 , 1.68 \ /* + */ 1.59 , 1.67 \ /* + */ 1.58 , 1.67 \ /* + */ 1.58 , 1.66 \ /* + */ 1.57 , 1.66 \ /* + */ 1.57 , 1.65 \ /* + */ 1.56 , 1.65 \ /* + */ 1.56 , 1.64 \ /* + */ 1.56 , 1.64 \ /* + */ 1.55 , 1.63 \ /* + */ 1.55 , 1.63 \ /* + */ 1.54 , 1.62 \ /* + */ 1.54 , 1.62 \ /* + */ 1.54 , 1.62 \ /* + */ 1.53 , 1.61 \ /* + */ 1.53 , 1.61 \ /* + */ 1.53 , 1.61 \ /* + */ 1.52 , 1.60 \ /* + */ 1.52 , 1.60 \ /* + */ 1.52 , 1.60 \ /* + */ 1.52 , 1.59 \ /* + */ 1.51 , 1.59 \ /* + */ 1.51 , 1.59 \ /* + */ 1.51 , 1.59 \ /* + */ 1.51 , 1.58 \ /* + */ 1.50 , 1.58 ) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel20" { + matrix input `temp' = ( /* + */ 15.64 , . \ /* + */ 9.00 , 9.72 \ /* + */ 6.61 , 7.18 \ /* + */ 5.38 , 5.85 \ /* + */ 4.62 , 5.04 \ /* + */ 4.11 , 4.48 \ /* + */ 3.75 , 4.08 \ /* + */ 3.47 , 3.77 \ /* + */ 3.25 , 3.53 \ /* + */ 3.07 , 3.33 \ /* + */ 2.92 , 3.17 \ /* + */ 2.80 , 3.04 \ /* + */ 2.70 , 2.92 \ /* + */ 2.61 , 2.82 \ /* + */ 2.53 , 2.73 \ /* + */ 2.46 , 2.65 \ /* + */ 2.39 , 2.58 \ /* + */ 2.34 , 2.52 \ /* + */ 2.29 , 2.46 \ /* + */ 2.24 , 2.41 \ /* + */ 2.20 , 2.36 \ /* + */ 2.16 , 2.32 \ /* + */ 2.13 , 2.28 \ /* + */ 2.10 , 2.24 \ /* + */ 2.06 , 2.21 \ /* + */ 2.04 , 2.18 \ /* + */ 2.01 , 2.15 \ /* + */ 1.99 , 2.12 \ /* + */ 1.96 , 2.09 \ /* + */ 1.94 , 2.07 \ /* + */ 1.92 , 2.04 \ /* + */ 1.90 , 2.02 \ /* + */ 1.88 , 2.00 \ /* + */ 1.87 , 1.98 \ /* + */ 1.85 , 1.96 \ /* + */ 1.83 , 1.94 \ /* + */ 1.82 , 1.93 \ /* + */ 1.80 , 1.91 \ /* + */ 1.79 , 1.89 \ /* + */ 1.78 , 1.88 \ /* + */ 1.76 , 1.86 \ /* + */ 1.75 , 1.85 \ /* + */ 1.74 , 1.84 \ /* + */ 1.73 , 1.82 \ /* + */ 1.72 , 1.81 \ /* + */ 1.71 , 1.80 \ /* + */ 1.70 , 1.79 \ /* + */ 1.69 , 1.78 \ /* + */ 1.68 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.65 , 1.74 \ /* + */ 1.65 , 1.73 \ /* + */ 1.64 , 1.72 \ /* + */ 1.63 , 1.71 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.68 \ /* + */ 1.60 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.56 , 1.62 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.54 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.44 , 1.50 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 ) + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullrel30" { + matrix input `temp' = ( /* + */ 12.71 , . \ /* + */ 7.49 , 8.03 \ /* + */ 5.60 , 6.15 \ /* + */ 4.63 , 5.10 \ /* + */ 4.03 , 4.44 \ /* + */ 3.63 , 3.98 \ /* + */ 3.33 , 3.65 \ /* + */ 3.11 , 3.39 \ /* + */ 2.93 , 3.19 \ /* + */ 2.79 , 3.02 \ /* + */ 2.67 , 2.88 \ /* + */ 2.57 , 2.77 \ /* + */ 2.48 , 2.67 \ /* + */ 2.41 , 2.58 \ /* + */ 2.34 , 2.51 \ /* + */ 2.28 , 2.44 \ /* + */ 2.23 , 2.38 \ /* + */ 2.18 , 2.33 \ /* + */ 2.14 , 2.28 \ /* + */ 2.10 , 2.23 \ /* + */ 2.07 , 2.19 \ /* + */ 2.04 , 2.16 \ /* + */ 2.01 , 2.12 \ /* + */ 1.98 , 2.09 \ /* + */ 1.95 , 2.06 \ /* + */ 1.93 , 2.03 \ /* + */ 1.90 , 2.01 \ /* + */ 1.88 , 1.98 \ /* + */ 1.86 , 1.96 \ /* + */ 1.84 , 1.94 \ /* + */ 1.83 , 1.92 \ /* + */ 1.81 , 1.90 \ /* + */ 1.79 , 1.88 \ /* + */ 1.78 , 1.87 \ /* + */ 1.76 , 1.85 \ /* + */ 1.75 , 1.83 \ /* + */ 1.74 , 1.82 \ /* + */ 1.72 , 1.80 \ /* + */ 1.71 , 1.79 \ /* + */ 1.70 , 1.78 \ /* + */ 1.69 , 1.77 \ /* + */ 1.68 , 1.75 \ /* + */ 1.67 , 1.74 \ /* + */ 1.66 , 1.73 \ /* + */ 1.65 , 1.72 \ /* + */ 1.64 , 1.71 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.60 , 1.66 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.47 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.42 , 1.47 \ /* + */ 1.42 , 1.47 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.41 , 1.46 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax5" { + matrix input `temp' = ( /* + */ 23.81 , . \ /* + */ 12.38 , 14.19 \ /* + */ 8.66 , 10.00 \ /* + */ 6.81 , 7.88 \ /* + */ 5.71 , 6.60 \ /* + */ 4.98 , 5.74 \ /* + */ 4.45 , 5.13 \ /* + */ 4.06 , 4.66 \ /* + */ 3.76 , 4.30 \ /* + */ 3.51 , 4.01 \ /* + */ 3.31 , 3.77 \ /* + */ 3.15 , 3.57 \ /* + */ 3.00 , 3.41 \ /* + */ 2.88 , 3.26 \ /* + */ 2.78 , 3.13 \ /* + */ 2.69 , 3.02 \ /* + */ 2.61 , 2.92 \ /* + */ 2.53 , 2.84 \ /* + */ 2.47 , 2.76 \ /* + */ 2.41 , 2.69 \ /* + */ 2.36 , 2.62 \ /* + */ 2.31 , 2.56 \ /* + */ 2.27 , 2.51 \ /* + */ 2.23 , 2.46 \ /* + */ 2.19 , 2.42 \ /* + */ 2.15 , 2.37 \ /* + */ 2.12 , 2.33 \ /* + */ 2.09 , 2.30 \ /* + */ 2.07 , 2.26 \ /* + */ 2.04 , 2.23 \ /* + */ 2.02 , 2.20 \ /* + */ 1.99 , 2.17 \ /* + */ 1.97 , 2.14 \ /* + */ 1.95 , 2.12 \ /* + */ 1.93 , 2.10 \ /* + */ 1.91 , 2.07 \ /* + */ 1.90 , 2.05 \ /* + */ 1.88 , 2.03 \ /* + */ 1.87 , 2.01 \ /* + */ 1.85 , 1.99 \ /* + */ 1.84 , 1.98 \ /* + */ 1.82 , 1.96 \ /* + */ 1.81 , 1.94 \ /* + */ 1.80 , 1.93 \ /* + */ 1.79 , 1.91 \ /* + */ 1.78 , 1.90 \ /* + */ 1.76 , 1.88 \ /* + */ 1.75 , 1.87 \ /* + */ 1.74 , 1.86 \ /* + */ 1.73 , 1.85 \ /* + */ 1.73 , 1.83 \ /* + */ 1.72 , 1.82 \ /* + */ 1.71 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.79 \ /* + */ 1.68 , 1.78 \ /* + */ 1.68 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.65 , 1.74 \ /* + */ 1.65 , 1.74 \ /* + */ 1.64 , 1.73 \ /* + */ 1.63 , 1.72 \ /* + */ 1.63 , 1.71 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.70 \ /* + */ 1.61 , 1.69 \ /* + */ 1.60 , 1.68 \ /* + */ 1.60 , 1.68 \ /* + */ 1.59 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.64 \ /* + */ 1.56 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.62 \ /* + */ 1.54 , 1.61 \ /* + */ 1.54 , 1.61 \ /* + */ 1.53 , 1.60 \ /* + */ 1.53 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.50 , 1.57 \ /* + */ 1.50 , 1.57 \ /* + */ 1.50 , 1.56 \ /* + */ 1.49 , 1.56 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.48 , 1.55 \ /* + */ 1.48 , 1.54 \ /* + */ 1.47 , 1.54 \ /* + */ 1.47 , 1.54 \ /* + */ 1.47 , 1.53 \ /* + */ 1.46 , 1.53 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax10" { + matrix input `temp' = ( /* + */ 19.40 , . \ /* + */ 10.14 , 11.92 \ /* + */ 7.18 , 8.39 \ /* + */ 5.72 , 6.64 \ /* + */ 4.85 , 5.60 \ /* + */ 4.27 , 4.90 \ /* + */ 3.86 , 4.40 \ /* + */ 3.55 , 4.03 \ /* + */ 3.31 , 3.73 \ /* + */ 3.12 , 3.50 \ /* + */ 2.96 , 3.31 \ /* + */ 2.83 , 3.15 \ /* + */ 2.71 , 3.01 \ /* + */ 2.62 , 2.89 \ /* + */ 2.53 , 2.79 \ /* + */ 2.46 , 2.70 \ /* + */ 2.39 , 2.62 \ /* + */ 2.33 , 2.55 \ /* + */ 2.28 , 2.49 \ /* + */ 2.23 , 2.43 \ /* + */ 2.19 , 2.38 \ /* + */ 2.15 , 2.33 \ /* + */ 2.11 , 2.29 \ /* + */ 2.08 , 2.25 \ /* + */ 2.05 , 2.21 \ /* + */ 2.02 , 2.18 \ /* + */ 1.99 , 2.14 \ /* + */ 1.97 , 2.11 \ /* + */ 1.94 , 2.08 \ /* + */ 1.92 , 2.06 \ /* + */ 1.90 , 2.03 \ /* + */ 1.88 , 2.01 \ /* + */ 1.86 , 1.99 \ /* + */ 1.85 , 1.97 \ /* + */ 1.83 , 1.95 \ /* + */ 1.81 , 1.93 \ /* + */ 1.80 , 1.91 \ /* + */ 1.79 , 1.89 \ /* + */ 1.77 , 1.88 \ /* + */ 1.76 , 1.86 \ /* + */ 1.75 , 1.85 \ /* + */ 1.74 , 1.83 \ /* + */ 1.72 , 1.82 \ /* + */ 1.71 , 1.81 \ /* + */ 1.70 , 1.80 \ /* + */ 1.69 , 1.78 \ /* + */ 1.68 , 1.77 \ /* + */ 1.67 , 1.76 \ /* + */ 1.66 , 1.75 \ /* + */ 1.66 , 1.74 \ /* + */ 1.65 , 1.73 \ /* + */ 1.64 , 1.72 \ /* + */ 1.63 , 1.71 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.69 \ /* + */ 1.60 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.58 , 1.65 \ /* + */ 1.57 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.63 \ /* + */ 1.55 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.53 , 1.60 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.52 , 1.58 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.46 , 1.52 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.44 , 1.50 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.42 , 1.48 \ /* + */ 1.42 , 1.47 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax20" { + matrix input `temp' = ( /* + */ 15.39 , . \ /* + */ 8.16 , 9.41 \ /* + */ 5.87 , 6.79 \ /* + */ 4.75 , 5.47 \ /* + */ 4.08 , 4.66 \ /* + */ 3.64 , 4.13 \ /* + */ 3.32 , 3.74 \ /* + */ 3.08 , 3.45 \ /* + */ 2.89 , 3.22 \ /* + */ 2.74 , 3.03 \ /* + */ 2.62 , 2.88 \ /* + */ 2.51 , 2.76 \ /* + */ 2.42 , 2.65 \ /* + */ 2.35 , 2.56 \ /* + */ 2.28 , 2.48 \ /* + */ 2.22 , 2.40 \ /* + */ 2.17 , 2.34 \ /* + */ 2.12 , 2.28 \ /* + */ 2.08 , 2.23 \ /* + */ 2.04 , 2.19 \ /* + */ 2.01 , 2.15 \ /* + */ 1.98 , 2.11 \ /* + */ 1.95 , 2.07 \ /* + */ 1.92 , 2.04 \ /* + */ 1.89 , 2.01 \ /* + */ 1.87 , 1.98 \ /* + */ 1.85 , 1.96 \ /* + */ 1.83 , 1.93 \ /* + */ 1.81 , 1.91 \ /* + */ 1.79 , 1.89 \ /* + */ 1.77 , 1.87 \ /* + */ 1.76 , 1.85 \ /* + */ 1.74 , 1.83 \ /* + */ 1.73 , 1.82 \ /* + */ 1.72 , 1.80 \ /* + */ 1.70 , 1.79 \ /* + */ 1.69 , 1.77 \ /* + */ 1.68 , 1.76 \ /* + */ 1.67 , 1.74 \ /* + */ 1.66 , 1.73 \ /* + */ 1.65 , 1.72 \ /* + */ 1.64 , 1.71 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.69 \ /* + */ 1.61 , 1.68 \ /* + */ 1.60 , 1.67 \ /* + */ 1.59 , 1.66 \ /* + */ 1.58 , 1.65 \ /* + */ 1.58 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.56 , 1.62 \ /* + */ 1.56 , 1.62 \ /* + */ 1.55 , 1.61 \ /* + */ 1.54 , 1.60 \ /* + */ 1.54 , 1.59 \ /* + */ 1.53 , 1.59 \ /* + */ 1.52 , 1.58 \ /* + */ 1.52 , 1.57 \ /* + */ 1.51 , 1.57 \ /* + */ 1.51 , 1.56 \ /* + */ 1.50 , 1.56 \ /* + */ 1.50 , 1.55 \ /* + */ 1.49 , 1.54 \ /* + */ 1.49 , 1.54 \ /* + */ 1.48 , 1.53 \ /* + */ 1.48 , 1.53 \ /* + */ 1.47 , 1.52 \ /* + */ 1.47 , 1.52 \ /* + */ 1.47 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.46 , 1.51 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.50 \ /* + */ 1.45 , 1.49 \ /* + */ 1.44 , 1.49 \ /* + */ 1.44 , 1.48 \ /* + */ 1.44 , 1.48 \ /* + */ 1.43 , 1.48 \ /* + */ 1.43 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.41 \ /* + */ 1.37 , 1.41 \ /* + */ 1.37 , 1.41 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="fullmax30" { + matrix input `temp' = ( /* + */ 12.76 , . \ /* + */ 6.97 , 8.01 \ /* + */ 5.11 , 5.88 \ /* + */ 4.19 , 4.78 \ /* + */ 3.64 , 4.12 \ /* + */ 3.27 , 3.67 \ /* + */ 3.00 , 3.35 \ /* + */ 2.80 , 3.10 \ /* + */ 2.64 , 2.91 \ /* + */ 2.52 , 2.76 \ /* + */ 2.41 , 2.63 \ /* + */ 2.33 , 2.52 \ /* + */ 2.25 , 2.43 \ /* + */ 2.19 , 2.35 \ /* + */ 2.13 , 2.29 \ /* + */ 2.08 , 2.22 \ /* + */ 2.04 , 2.17 \ /* + */ 2.00 , 2.12 \ /* + */ 1.96 , 2.08 \ /* + */ 1.93 , 2.04 \ /* + */ 1.90 , 2.01 \ /* + */ 1.87 , 1.97 \ /* + */ 1.84 , 1.94 \ /* + */ 1.82 , 1.92 \ /* + */ 1.80 , 1.89 \ /* + */ 1.78 , 1.87 \ /* + */ 1.76 , 1.84 \ /* + */ 1.74 , 1.82 \ /* + */ 1.73 , 1.80 \ /* + */ 1.71 , 1.79 \ /* + */ 1.70 , 1.77 \ /* + */ 1.68 , 1.75 \ /* + */ 1.67 , 1.74 \ /* + */ 1.66 , 1.72 \ /* + */ 1.64 , 1.71 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.68 \ /* + */ 1.61 , 1.67 \ /* + */ 1.60 , 1.66 \ /* + */ 1.59 , 1.65 \ /* + */ 1.58 , 1.64 \ /* + */ 1.57 , 1.63 \ /* + */ 1.57 , 1.62 \ /* + */ 1.56 , 1.61 \ /* + */ 1.55 , 1.60 \ /* + */ 1.54 , 1.59 \ /* + */ 1.54 , 1.59 \ /* + */ 1.53 , 1.58 \ /* + */ 1.52 , 1.57 \ /* + */ 1.52 , 1.56 \ /* + */ 1.51 , 1.56 \ /* + */ 1.50 , 1.55 \ /* + */ 1.50 , 1.54 \ /* + */ 1.49 , 1.54 \ /* + */ 1.49 , 1.53 \ /* + */ 1.48 , 1.53 \ /* + */ 1.48 , 1.52 \ /* + */ 1.47 , 1.51 \ /* + */ 1.47 , 1.51 \ /* + */ 1.46 , 1.50 \ /* + */ 1.46 , 1.50 \ /* + */ 1.45 , 1.49 \ /* + */ 1.45 , 1.49 \ /* + */ 1.44 , 1.48 \ /* + */ 1.44 , 1.48 \ /* + */ 1.44 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.43 , 1.47 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.46 \ /* + */ 1.42 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.45 \ /* + */ 1.41 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.44 \ /* + */ 1.40 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.43 \ /* + */ 1.39 , 1.42 \ /* + */ 1.39 , 1.42 \ /* + */ 1.38 , 1.42 \ /* + */ 1.38 , 1.41 \ /* + */ 1.38 , 1.41 \ /* + */ 1.37 , 1.41 \ /* + */ 1.37 , 1.40 \ /* + */ 1.37 , 1.40 \ /* + */ 1.37 , 1.40 \ /* + */ 1.36 , 1.40 \ /* + */ 1.36 , 1.39 \ /* + */ 1.36 , 1.39 \ /* + */ 1.36 , 1.39 \ /* + */ 1.36 , 1.38 \ /* + */ 1.35 , 1.38 \ /* + */ 1.35 , 1.38 \ /* + */ 1.35 , 1.38 \ /* + */ 1.35 , 1.37 \ /* + */ 1.34 , 1.37 \ /* + */ 1.34 , 1.37 \ /* + */ 1.34 , 1.37 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize10" { + matrix input `temp' = ( /* + */ 16.38 , . \ /* + */ 8.68 , 7.03 \ /* + */ 6.46 , 5.44 \ /* + */ 5.44 , 4.72 \ /* + */ 4.84 , 4.32 \ /* + */ 4.45 , 4.06 \ /* + */ 4.18 , 3.90 \ /* + */ 3.97 , 3.78 \ /* + */ 3.81 , 3.70 \ /* + */ 3.68 , 3.64 \ /* + */ 3.58 , 3.60 \ /* + */ 3.50 , 3.58 \ /* + */ 3.42 , 3.56 \ /* + */ 3.36 , 3.55 \ /* + */ 3.31 , 3.54 \ /* + */ 3.27 , 3.55 \ /* + */ 3.24 , 3.55 \ /* + */ 3.20 , 3.56 \ /* + */ 3.18 , 3.57 \ /* + */ 3.21 , 3.58 \ /* + */ 3.39 , 3.59 \ /* + */ 3.57 , 3.60 \ /* + */ 3.68 , 3.62 \ /* + */ 3.75 , 3.64 \ /* + */ 3.79 , 3.65 \ /* + */ 3.82 , 3.67 \ /* + */ 3.85 , 3.74 \ /* + */ 3.86 , 3.87 \ /* + */ 3.87 , 4.02 \ /* + */ 3.88 , 4.12 \ /* + */ 3.89 , 4.19 \ /* + */ 3.89 , 4.24 \ /* + */ 3.90 , 4.27 \ /* + */ 3.90 , 4.31 \ /* + */ 3.90 , 4.33 \ /* + */ 3.90 , 4.36 \ /* + */ 3.90 , 4.38 \ /* + */ 3.90 , 4.39 \ /* + */ 3.90 , 4.41 \ /* + */ 3.90 , 4.43 \ /* + */ 3.90 , 4.44 \ /* + */ 3.90 , 4.45 \ /* + */ 3.90 , 4.47 \ /* + */ 3.90 , 4.48 \ /* + */ 3.90 , 4.49 \ /* + */ 3.90 , 4.50 \ /* + */ 3.90 , 4.51 \ /* + */ 3.90 , 4.52 \ /* + */ 3.90 , 4.53 \ /* + */ 3.90 , 4.54 \ /* + */ 3.90 , 4.55 \ /* + */ 3.90 , 4.56 \ /* + */ 3.90 , 4.56 \ /* + */ 3.90 , 4.57 \ /* + */ 3.90 , 4.58 \ /* + */ 3.90 , 4.59 \ /* + */ 3.90 , 4.59 \ /* + */ 3.90 , 4.60 \ /* + */ 3.90 , 4.61 \ /* + */ 3.90 , 4.61 \ /* + */ 3.90 , 4.62 \ /* + */ 3.90 , 4.62 \ /* + */ 3.90 , 4.63 \ /* + */ 3.90 , 4.63 \ /* + */ 3.89 , 4.64 \ /* + */ 3.89 , 4.64 \ /* + */ 3.89 , 4.64 \ /* + */ 3.89 , 4.65 \ /* + */ 3.89 , 4.65 \ /* + */ 3.89 , 4.65 \ /* + */ 3.89 , 4.66 \ /* + */ 3.89 , 4.66 \ /* + */ 3.89 , 4.66 \ /* + */ 3.89 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.88 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.87 , 4.66 \ /* + */ 3.86 , 4.65 \ /* + */ 3.86 , 4.65 \ /* + */ 3.86 , 4.65 \ /* + */ 3.86 , 4.64 \ /* + */ 3.85 , 4.64 \ /* + */ 3.85 , 4.64 \ /* + */ 3.85 , 4.63 \ /* + */ 3.85 , 4.63 \ /* + */ 3.84 , 4.62 \ /* + */ 3.84 , 4.62 \ /* + */ 3.84 , 4.61 \ /* + */ 3.84 , 4.60 \ /* + */ 3.83 , 4.60 \ /* + */ 3.83 , 4.59 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize15" { + matrix input `temp' = ( /* + */ 8.96 , . \ /* + */ 5.33 , 4.58 \ /* + */ 4.36 , 3.81 \ /* + */ 3.87 , 3.39 \ /* + */ 3.56 , 3.13 \ /* + */ 3.34 , 2.95 \ /* + */ 3.18 , 2.83 \ /* + */ 3.04 , 2.73 \ /* + */ 2.93 , 2.66 \ /* + */ 2.84 , 2.60 \ /* + */ 2.76 , 2.55 \ /* + */ 2.69 , 2.52 \ /* + */ 2.63 , 2.48 \ /* + */ 2.57 , 2.46 \ /* + */ 2.52 , 2.44 \ /* + */ 2.48 , 2.42 \ /* + */ 2.44 , 2.41 \ /* + */ 2.41 , 2.40 \ /* + */ 2.37 , 2.39 \ /* + */ 2.34 , 2.38 \ /* + */ 2.32 , 2.38 \ /* + */ 2.29 , 2.37 \ /* + */ 2.27 , 2.37 \ /* + */ 2.25 , 2.37 \ /* + */ 2.24 , 2.37 \ /* + */ 2.22 , 2.38 \ /* + */ 2.21 , 2.38 \ /* + */ 2.20 , 2.38 \ /* + */ 2.19 , 2.39 \ /* + */ 2.18 , 2.39 \ /* + */ 2.19 , 2.40 \ /* + */ 2.22 , 2.41 \ /* + */ 2.33 , 2.42 \ /* + */ 2.40 , 2.42 \ /* + */ 2.45 , 2.43 \ /* + */ 2.48 , 2.44 \ /* + */ 2.50 , 2.45 \ /* + */ 2.52 , 2.54 \ /* + */ 2.53 , 2.55 \ /* + */ 2.54 , 2.66 \ /* + */ 2.55 , 2.73 \ /* + */ 2.56 , 2.78 \ /* + */ 2.57 , 2.82 \ /* + */ 2.57 , 2.85 \ /* + */ 2.58 , 2.87 \ /* + */ 2.58 , 2.89 \ /* + */ 2.58 , 2.91 \ /* + */ 2.59 , 2.92 \ /* + */ 2.59 , 2.93 \ /* + */ 2.59 , 2.94 \ /* + */ 2.59 , 2.95 \ /* + */ 2.59 , 2.96 \ /* + */ 2.60 , 2.97 \ /* + */ 2.60 , 2.98 \ /* + */ 2.60 , 2.98 \ /* + */ 2.60 , 2.99 \ /* + */ 2.60 , 2.99 \ /* + */ 2.60 , 3.00 \ /* + */ 2.60 , 3.00 \ /* + */ 2.60 , 3.01 \ /* + */ 2.60 , 3.01 \ /* + */ 2.60 , 3.02 \ /* + */ 2.61 , 3.02 \ /* + */ 2.61 , 3.02 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.03 \ /* + */ 2.61 , 3.04 \ /* + */ 2.61 , 3.04 \ /* + */ 2.61 , 3.04 \ /* + */ 2.60 , 3.04 \ /* + */ 2.60 , 3.04 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.60 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.05 \ /* + */ 2.59 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.04 \ /* + */ 2.58 , 3.03 \ /* + */ 2.57 , 3.03 \ /* + */ 2.57 , 3.03 \ /* + */ 2.57 , 3.03 \ /* + */ 2.57 , 3.02 \ /* + */ 2.56 , 3.02 \ /* + */ 2.56 , 3.02 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize20" { + matrix input `temp' = ( /* + */ 6.66 , . \ /* + */ 4.42 , 3.95 \ /* + */ 3.69 , 3.32 \ /* + */ 3.30 , 2.99 \ /* + */ 3.05 , 2.78 \ /* + */ 2.87 , 2.63 \ /* + */ 2.73 , 2.52 \ /* + */ 2.63 , 2.43 \ /* + */ 2.54 , 2.36 \ /* + */ 2.46 , 2.30 \ /* + */ 2.40 , 2.25 \ /* + */ 2.34 , 2.21 \ /* + */ 2.29 , 2.17 \ /* + */ 2.25 , 2.14 \ /* + */ 2.21 , 2.11 \ /* + */ 2.18 , 2.09 \ /* + */ 2.14 , 2.07 \ /* + */ 2.11 , 2.05 \ /* + */ 2.09 , 2.03 \ /* + */ 2.06 , 2.02 \ /* + */ 2.04 , 2.01 \ /* + */ 2.02 , 1.99 \ /* + */ 2.00 , 1.98 \ /* + */ 1.98 , 1.98 \ /* + */ 1.96 , 1.97 \ /* + */ 1.95 , 1.96 \ /* + */ 1.93 , 1.96 \ /* + */ 1.92 , 1.95 \ /* + */ 1.90 , 1.95 \ /* + */ 1.89 , 1.95 \ /* + */ 1.88 , 1.94 \ /* + */ 1.87 , 1.94 \ /* + */ 1.86 , 1.94 \ /* + */ 1.85 , 1.94 \ /* + */ 1.84 , 1.94 \ /* + */ 1.83 , 1.94 \ /* + */ 1.82 , 1.94 \ /* + */ 1.81 , 1.95 \ /* + */ 1.81 , 1.95 \ /* + */ 1.80 , 1.95 \ /* + */ 1.79 , 1.95 \ /* + */ 1.79 , 1.96 \ /* + */ 1.78 , 1.96 \ /* + */ 1.78 , 1.97 \ /* + */ 1.80 , 1.97 \ /* + */ 1.87 , 1.98 \ /* + */ 1.92 , 1.98 \ /* + */ 1.95 , 1.99 \ /* + */ 1.97 , 2.00 \ /* + */ 1.99 , 2.00 \ /* + */ 2.00 , 2.01 \ /* + */ 2.01 , 2.09 \ /* + */ 2.02 , 2.11 \ /* + */ 2.03 , 2.18 \ /* + */ 2.04 , 2.23 \ /* + */ 2.04 , 2.27 \ /* + */ 2.05 , 2.29 \ /* + */ 2.05 , 2.31 \ /* + */ 2.06 , 2.33 \ /* + */ 2.06 , 2.34 \ /* + */ 2.07 , 2.35 \ /* + */ 2.07 , 2.36 \ /* + */ 2.07 , 2.37 \ /* + */ 2.08 , 2.38 \ /* + */ 2.08 , 2.39 \ /* + */ 2.08 , 2.39 \ /* + */ 2.08 , 2.40 \ /* + */ 2.09 , 2.40 \ /* + */ 2.09 , 2.41 \ /* + */ 2.09 , 2.41 \ /* + */ 2.09 , 2.41 \ /* + */ 2.09 , 2.42 \ /* + */ 2.09 , 2.42 \ /* + */ 2.09 , 2.42 \ /* + */ 2.09 , 2.43 \ /* + */ 2.10 , 2.43 \ /* + */ 2.10 , 2.43 \ /* + */ 2.10 , 2.43 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.10 , 2.44 \ /* + */ 2.09 , 2.44 \ /* + */ 2.09 , 2.44 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.09 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.08 , 2.45 \ /* + */ 2.07 , 2.44 \ /* + */ 2.07 , 2.44 \ /* + */ 2.07 , 2.44 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + if "`type'"=="limlsize25" { + matrix input `temp' = ( /* + */ 5.53 , . \ /* + */ 3.92 , 3.63 \ /* + */ 3.32 , 3.09 \ /* + */ 2.98 , 2.79 \ /* + */ 2.77 , 2.60 \ /* + */ 2.61 , 2.46 \ /* + */ 2.49 , 2.35 \ /* + */ 2.39 , 2.27 \ /* + */ 2.32 , 2.20 \ /* + */ 2.25 , 2.14 \ /* + */ 2.19 , 2.09 \ /* + */ 2.14 , 2.05 \ /* + */ 2.10 , 2.02 \ /* + */ 2.06 , 1.99 \ /* + */ 2.03 , 1.96 \ /* + */ 2.00 , 1.93 \ /* + */ 1.97 , 1.91 \ /* + */ 1.94 , 1.89 \ /* + */ 1.92 , 1.87 \ /* + */ 1.90 , 1.86 \ /* + */ 1.88 , 1.84 \ /* + */ 1.86 , 1.83 \ /* + */ 1.84 , 1.81 \ /* + */ 1.83 , 1.80 \ /* + */ 1.81 , 1.79 \ /* + */ 1.80 , 1.78 \ /* + */ 1.78 , 1.77 \ /* + */ 1.77 , 1.77 \ /* + */ 1.76 , 1.76 \ /* + */ 1.75 , 1.75 \ /* + */ 1.74 , 1.75 \ /* + */ 1.73 , 1.74 \ /* + */ 1.72 , 1.73 \ /* + */ 1.71 , 1.73 \ /* + */ 1.70 , 1.73 \ /* + */ 1.69 , 1.72 \ /* + */ 1.68 , 1.72 \ /* + */ 1.67 , 1.71 \ /* + */ 1.67 , 1.71 \ /* + */ 1.66 , 1.71 \ /* + */ 1.65 , 1.71 \ /* + */ 1.65 , 1.71 \ /* + */ 1.64 , 1.70 \ /* + */ 1.63 , 1.70 \ /* + */ 1.63 , 1.70 \ /* + */ 1.62 , 1.70 \ /* + */ 1.62 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.61 , 1.70 \ /* + */ 1.60 , 1.70 \ /* + */ 1.60 , 1.70 \ /* + */ 1.59 , 1.70 \ /* + */ 1.59 , 1.70 \ /* + */ 1.59 , 1.70 \ /* + */ 1.58 , 1.70 \ /* + */ 1.58 , 1.71 \ /* + */ 1.58 , 1.71 \ /* + */ 1.57 , 1.71 \ /* + */ 1.59 , 1.71 \ /* + */ 1.60 , 1.71 \ /* + */ 1.63 , 1.72 \ /* + */ 1.65 , 1.72 \ /* + */ 1.67 , 1.72 \ /* + */ 1.69 , 1.72 \ /* + */ 1.70 , 1.76 \ /* + */ 1.71 , 1.81 \ /* + */ 1.72 , 1.87 \ /* + */ 1.73 , 1.91 \ /* + */ 1.74 , 1.94 \ /* + */ 1.74 , 1.96 \ /* + */ 1.75 , 1.98 \ /* + */ 1.75 , 1.99 \ /* + */ 1.76 , 2.01 \ /* + */ 1.76 , 2.02 \ /* + */ 1.77 , 2.03 \ /* + */ 1.77 , 2.04 \ /* + */ 1.78 , 2.04 \ /* + */ 1.78 , 2.05 \ /* + */ 1.78 , 2.06 \ /* + */ 1.79 , 2.06 \ /* + */ 1.79 , 2.07 \ /* + */ 1.79 , 2.07 \ /* + */ 1.79 , 2.08 \ /* + */ 1.80 , 2.08 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.09 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.10 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 \ /* + */ 1.80 , 2.11 ) + + if `k2'<=100 & `nendog'<=2 { + scalar `cv'=`temp'[`k2',`nendog'] + } + } + + + return scalar cv=`cv' +end + +// capt prog drop abw +// abw wants a varlist of [ eps | Z | touse] +// where Z includes all instruments, included and excluded, with constant if +// present as the last column; eps are a suitable set of residuals; and touse +// marks the observations in the data matrix used to generate the residuals +// (e.g. e(sample) of the appropriate model). +// The Noconstant option indicates that no constant term exists in the Z matrix. +// kern is the name of the HAC kernel. -ivregress- only provides definitions +// for Bartlett (default), Parzen, quadratic spectral. + +// returns the optimal bandwidth as local abw + +// abw 1.0.1 CFB 30jun2007 +// 1.0.1 : redefine kernel names (3 instances) to match ivreg2 + +prog def abw, rclass + version 9.2 + syntax varlist(ts), [ NOConstant Kernel(string)] +// validate kernel + if "`kernel'" == "" { + local kernel = "Bartlett" + } + if !inlist("`kernel'","Bartlett","Parzen","Quadratic spectral") { + di as err "Error: kernel `kernel' not compatible with bw(auto)" + return scalar abw = 1 + return local bwchoice "Kernel `kernel' not compatible with bw(auto); bw=1 (default)" + exit + } + else { +// set constant + local cons 1 + if "`noconstant'" != "" { + local cons 0 + } +// deal with ts ops + tsrevar `varlist' + local varlist1 `r(varlist)' + + mata: abw("`varlist1'",`cons',"`kernel'") + return scalar abw = `abw' + return local bwchoice "Automatic bw selection according to Newey-West (1994)" + } +end + +mata: +void abw (string scalar Zulist, + real scalar cons, + string scalar kernel + ) +{ + string rowvector Zunames, tov + string scalar v, v2 + real matrix uZ + real rowvector h + real scalar lenzu, abw + +// access the Stata variables in Zulist, honoring touse stored as last column + Zunames = tokens(Zulist) + lenzu=cols(Zunames)-1 + v = Zunames[|1\lenzu|] + v2 = Zunames[lenzu+1] + st_view(uZ,.,v,v2) + +// assume constant in last col of uZ if it exists +// account for eps as the first column of uZ + if (cons) { + nrows1=cols(uZ)-2 + nrows2=1 + } + else { + nrows1=cols(uZ)-1 + nrows2=0 + } +// [R] ivregress p.42: referencing Newey-West 1994 REStud 61(4):631-653 +// define h indicator rowvector + h = J(nrows1,1,1) \ J(nrows2,1,0) + +// calc mstar per p.43 +// Hannan (1971, 296) & Priestley (1981, 58) per Newey-West p. 633 +// corrected per Alistair Hall msg to Brian Poi 17jul2008 + T = rows(uZ) + oneT = 1/T + expo = 2/9 + q = 1 +// cgamma = 1.4117 + cgamma = 1.1447 + if(kernel == "Parzen") { + expo = 4/25 + q = 2 + cgamma = 2.6614 + } + if(kernel == "Quadratic spectral") { + expo = 2/25 + q = 2 + cgamma = 1.3221 + } +// per Newey-West p.639, Anderson (1971), Priestley (1981) may provide +// guidance on setting expo for other kernels + mstar = trunc(20 *(T/100)^expo) + +// calc uZ matrix + u = uZ[.,1] + Z = uZ[|1,2 \.,.|] + +// calc f vector: (u_i Z_i) * h + f = (u :* Z) * h + +// calc sigmahat vector + sigmahat = J(mstar+1,1,oneT) + for(j=0;j<=mstar;j++) { + for(i=j+1;i<=T;i++) { + sigmahat[j+1] = sigmahat[j+1] + f[i]*f[i-j] + } + } + +// calc shat(q), shat(0) + shatq = 0 + shat0 = sigmahat[1] + for(j=1;j<=mstar;j++) { + shatq = shatq + 2 * sigmahat[j+1] * j^q + shat0 = shat0 + 2 * sigmahat[j+1] + } + +// calc gammahat + expon = 1/(2*q+1) + gammahat = cgamma*( (shatq/shat0)^2 )^expon + m = gammahat * T^expon + +// calc opt lag + if(kernel == "Bartlett" | kernel == "Parzen") { + optlag = min((trunc(m),mstar)) + } + else if(kernel == "Quadratic spectral") { + optlag = min((m,mstar)) + } + +// if optlag is the optimal lag to be used, we need to add one to +// specify bandwidth in ivreg2 terms + abw = optlag + 1 + st_local("abw",strofreal(abw)) +} +end + + +*************************************** START **************************************** +********************************* livreg2.mlib CODE ********************************** +* Code from: +* livreg2 1.1.07 13july2014 +* authors cfb & mes +* compiled in Stata 9.2 +* Mata library for ranktest. +* Used by later versions of ivreg2 but NOT by ivreg29 - only by ranktest here. +* Introduced with ivreg2 v 3.1.01 and ranktest v 1.3.01. +* Imported into ivreg29 so that ivreg29 is free-standing. +* See end of file for version notes. + +version 9.2 +mata: + +// ********* struct ms_ivreg29_vcvorthog - shared by ivreg2 and ranktest ******************* // +struct ms_ivreg29_vcvorthog { + string scalar ename, Znames, touse, weight, wvarname + string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel + string scalar sw, psd, ivarname, tvarname, tindexname + real scalar wf, N, bw, tdelta, dofminus + real matrix ZZ + pointer matrix e + pointer matrix Z + pointer matrix wvar +} + +// ********* s_ivreg29_vkernel - shared by ivreg2 and ranktest ******************* // +// Program checks whether kernel and bw choices are valid. +// s_ivreg29_vkernel is called from Stata. +// Arguments are the kernel name (req), bandwidth (req) and ivar name (opt). +// All 3 are strings. +// Returns results in r() macros. +// r(kernel) - name of kernel (string) +// r(bw) - bandwidth (scalar) + +void s_ivreg29_vkernel( string scalar kernel, + string scalar bwstring, + string scalar ivar + ) +{ + +// Check bandwidth + if (bwstring=="auto") { + bw=-1 + } + else { + bw=strtoreal(bwstring) + if (bw==.) { + printf("{err}bandwidth option bw() required for HAC-robust estimation\n") + exit(102) + } + if (bw<=0) { + printf("{err}invalid bandwidth in option bw() - must be real > 0\n") + exit(198) + } + } + +// Check ivar + if (bwstring=="auto" & ivar~="") { + printf("{err}Automatic bandwidth selection not available for panel data\n") + exit(198) + } + +// Check kernel +// Valid kernel list is abbrev, full name, whether special case if bw=1 +// First in list is default kernel = Barlett + vklist = ( ("", "bartlett", "0") + \ ("bar", "bartlett", "0") + \ ("bartlett", "bartlett", "0") + \ ("par", "parzen", "0") + \ ("parzen", "parzen", "0") + \ ("tru", "truncated", "1") + \ ("truncated", "truncated", "1") + \ ("thann", "tukey-hanning", "0") + \ ("tukey-hanning", "tukey-hanning", "0") + \ ("thamm", "tukey-hamming", "0") + \ ("tukey-hamming", "tukey-hamming", "0") + \ ("qua", "quadratic spectral", "1") + \ ("qs", "quadratic spectral", "1") + \ ("quadratic-spectral", "quadratic spectral", "1") + \ ("quadratic spectral", "quadratic spectral", "1") + \ ("dan", "danielle", "1") + \ ("danielle", "danielle", "1") + \ ("ten", "tent", "1") + \ ("tent", "tent", "1") + ) + kname=strltrim(strlower(kernel)) + pos = (vklist[.,1] :== kname) + +// Exit with error if not in list + if (sum(pos)==0) { + printf("{err}invalid kernel\n") + exit(198) + } + + vkname=strproper(select(vklist[.,2],pos)) + st_global("r(kernel)", vkname) + st_numscalar("r(bw)",bw) + +// Warn if kernel is type where bw=1 means no lags are used + if (bw==1 & select(vklist[.,3],pos)=="0") { + printf("{result}Note: kernel=%s", vkname) + printf("{result} and bw=1 implies zero lags used. Standard errors and\n") + printf("{result} test statistics are not autocorrelation-consistent.\n") + } +} // end of program s_ivreg29_vkernel + +// ********* m_ivreg29_omega - shared by ivreg2 and ranktest ********************* // + +// NB: ivreg2 always calls m_ivreg29_omega with e as column vector, i.e., K=1 // +// ranktest can call m_ivreg29_omega with e as matrix, i.e., K>=1 // + +real matrix m_ivreg29_omega(struct ms_ivreg29_vcvorthog scalar vcvo) +{ + if (vcvo.clustvarname~="") { + st_view(clustvar, ., vcvo.clustvarname, vcvo.touse) + info = panelsetup(clustvar, 1) + N_clust=rows(info) + if (vcvo.clustvarname2~="") { + st_view(clustvar2, ., vcvo.clustvarname2, vcvo.touse) + if (vcvo.kernel=="") { + st_view(clustvar3, ., vcvo.clustvarname3, vcvo.touse) // needed only if not panel tsset + } + } + } + + if (vcvo.kernel~="") { + st_view(t, ., st_tsrevar(vcvo.tvarname), vcvo.touse) + T=max(t)-min(t)+1 + } + + if ((vcvo.kernel=="Bartlett") | (vcvo.kernel=="Parzen") | (vcvo.kernel=="Truncated") /// + | (vcvo.kernel=="Tukey-Hanning")| (vcvo.kernel=="Tukey-Hamming")) { + window="lag" + } + else if ((vcvo.kernel=="Quadratic Spectral") | (vcvo.kernel=="Danielle") | (vcvo.kernel=="Tent")) { + window="spectral" + } + else if (vcvo.kernel~="") { +// Should never reach this point +printf("\n{error:Error: invalid kernel}\n") + exit(error(3351)) + } + + L=cols(*vcvo.Z) + K=cols(*vcvo.e) // ivreg2 always calls with K=1; ranktest may call with K>=1. + +// Covariance matrices +// shat * 1/N is same as estimated S matrix of orthog conditions + +// Block for homoskedastic and AC. dof correction if any incorporated into sigma estimates. + if ((vcvo.robust=="") & (vcvo.clustvarname=="")) { +// ZZ is already calculated as an external + ee = quadcross(*vcvo.e, vcvo.wf*(*vcvo.wvar), *vcvo.e) + sigma2=ee/(vcvo.N-vcvo.dofminus) + shat=sigma2#vcvo.ZZ + if (vcvo.kernel~="") { + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + tnow=st_data(., vcvo.tindexname) + for (tau=1; tau<=TAU; tau++) { + kw = m_ivreg29_calckw(tau, vcvo.bw, vcvo.kernel) + if (kw~=0) { // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + lstau = "L"+strofreal(tau) + tlag=st_data(., lstau+"."+vcvo.tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix +// if no lags exist, tmatrix has zero rows. + if (rows(tmatrix)>0) { +// col 1 of tmatrix has row numbers of all rows of data with this time period that have a corresponding lag +// col 2 of tmatrix has row numbers of all rows of data with lag tau that have a corresponding ob this time period. +// Should never happen that fweights or iweights make it here, +// but if they did the next line would be sqrt(wvari)*sqrt(wvari1) [with no wf since not needed for fw or iw] + wv = (*vcvo.wvar)[tmatrix[.,1]] /// + :* (*vcvo.wvar)[tmatrix[.,2]]*(vcvo.wf^2) // inner weighting matrix for quadcross + sigmahat = quadcross((*vcvo.e)[tmatrix[.,1],.], wv ,(*vcvo.e)[tmatrix[.,2],.]) /// + / (vcvo.N-vcvo.dofminus) // large dof correction + ZZhat = quadcross((*vcvo.Z)[tmatrix[.,1],.], wv, (*vcvo.Z)[tmatrix[.,2],.]) + ghat = sigmahat#ZZhat + shat=shat+kw*(ghat+ghat') + } + } // end non-zero kernel weight block + } // end tau loop + } // end kernel code +// Note large dof correction (if there is one) has already been incorporated + shat=shat/vcvo.N + } // end homoskedastic, AC code + +// Block for robust HC and HAC but not Stock-Watson and single clustering. +// Need to enter for double-clustering if one cluster is time. + if ( (vcvo.robust~="") & (vcvo.sw=="") & ((vcvo.clustvarname=="") /// + | ((vcvo.clustvarname2~="") & (vcvo.kernel~=""))) ) { + if (K==1) { // simple/fast where e is a column vector + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { + wv = (*vcvo.e:^2) :* *vcvo.wvar + } + else { + wv = (*vcvo.e :* *vcvo.wvar * vcvo.wf):^2 // wf needed for aweights and pweights + } + shat=quadcross(*vcvo.Z, wv, *vcvo.Z) // basic Eicker-Huber-White-sandwich-robust vce + } + else { // e is a matrix so must loop + shat=J(L*K,L*K,0) + for (i=1; i<=rows(*vcvo.e); i++) { + eZi=((*vcvo.e)[i,.])#((*vcvo.Z)[i,.]) + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { +// wvar is a column vector. wf not needed for fw and iw (=1 by dfn so redundant). + shat=shat+quadcross(eZi,eZi)*((*vcvo.wvar)[i]) + } + else { + shat=shat+quadcross(eZi,eZi)*((*vcvo.wvar)[i] * vcvo.wf)^2 // **** ADDED *vcvo.wf + } + } + } + if (vcvo.kernel~="") { +// Spectral windows require looping through all T-1 autocovariances + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + tnow=st_data(., vcvo.tindexname) + for (tau=1; tau<=TAU; tau++) { + kw = m_ivreg29_calckw(tau, vcvo.bw, vcvo.kernel) + if (kw~=0) { // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + lstau = "L"+strofreal(tau) + tlag=st_data(., lstau+"."+vcvo.tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix + +// col 1 of tmatrix has row numbers of all rows of data with this time period that have a corresponding lag +// col 2 of tmatrix has row numbers of all rows of data with lag tau that have a corresponding ob this time period. +// if no lags exist, tmatrix has zero rows + if (rows(tmatrix)>0) { + if (K==1) { // simple/fast where e is a column vector +// wv is inner weighting matrix for quadcross + wv = (*vcvo.e)[tmatrix[.,1]] :* (*vcvo.e)[tmatrix[.,2]] /// + :* (*vcvo.wvar)[tmatrix[.,1]] :* (*vcvo.wvar)[tmatrix[.,2]] * (vcvo.wf^2) + ghat = quadcross((*vcvo.Z)[tmatrix[.,1],.], wv, (*vcvo.Z)[tmatrix[.,2],.]) + } + else { // e is a matrix so must loop + ghat=J(L*K,L*K,0) + for (i=1; i<=rows(tmatrix); i++) { + wvari =(*vcvo.wvar)[tmatrix[i,1]] + wvari1=(*vcvo.wvar)[tmatrix[i,2]] + ei =(*vcvo.e)[tmatrix[i,1],.] + ei1 =(*vcvo.e)[tmatrix[i,2],.] + Zi =(*vcvo.Z)[tmatrix[i,1],.] + Zi1 =(*vcvo.Z)[tmatrix[i,2],.] + eZi =ei#Zi + eZi1=ei1#Zi1 +// Should never happen that fweights or iweights make it here, but if they did +// the next line would be ghat=ghat+eZi'*eZi1*sqrt(wvari)*sqrt(wvari1) +// [without *vcvo.wf since wf=1 for fw and iw] + ghat=ghat+quadcross(eZi,eZi1)*wvari*wvari1 * (vcvo.wf^2) // ADDED * (vcvo.wf^2) + } + } + shat=shat+kw*(ghat+ghat') + } // end non-zero-obs accumulation block + } // end non-zero kernel weight block + } // end tau loop + } // end kernel code +// Incorporate large dof correction if there is one + shat=shat/(vcvo.N-vcvo.dofminus) + } // end HC/HAC code + + if (vcvo.clustvarname~="") { +// Block for cluster-robust +// 2-level clustering: S = S(level 1) + S(level 2) - S(level 3 = intersection of levels 1 & 2) +// Prepare shat3 if 2-level clustering + if (vcvo.clustvarname2~="") { + if (vcvo.kernel~="") { // second cluster variable is time + // shat3 was already calculated above as shat + shat3=shat*(vcvo.N-vcvo.dofminus) + } + else { // calculate shat3 + // data were sorted on clustvar3-clustvar1 so + // clustvar3 is nested in clustvar1 and Mata panel functions + // work for both. + info3 = panelsetup(clustvar3, 1) + if (rows(info3)==rows(*vcvo.e)) { // intersection of levels 1 & 2 are all single obs + // so no need to loop through row by row + if (K==1) { // simple/fast where e is a column vector + wv = (*vcvo.e :* *vcvo.wvar * vcvo.wf):^2 + shat3=quadcross(*vcvo.Z, wv, *vcvo.Z) // basic Eicker-Huber-White-sandwich-robust vce + } + else { // e is a matrix so must loop + shat3=J(L*K,L*K,0) + for (i=1; i<=rows(*vcvo.e); i++) { + eZi=((*vcvo.e)[i,.])#((*vcvo.Z)[i,.]) + shat3=shat3+quadcross(eZi,eZi)*((*vcvo.wvar)[i] * vcvo.wf)^2 // **** ADDED *vcvo.wf + } + } + } + else { // intersection of levels 1 & 2 includes some groups of obs + N_clust3=rows(info3) + shat3=J(L*K,L*K,0) + for (i=1; i<=N_clust3; i++) { + esub=panelsubmatrix(*vcvo.e,i,info3) + Zsub=panelsubmatrix(*vcvo.Z,i,info3) + wsub=panelsubmatrix(*vcvo.wvar,i,info3) + wv = esub :* wsub * vcvo.wf + if (K==1) { // simple/fast where e is a column vector + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ = J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.] * vcvo.wf // **** ADDED *vcvo.wf + } + } + shat3=shat3+quadcross(eZ,eZ) + } + } + } + } + +// 1st level of clustering, no kernel-robust +// Entered unless 1-level clustering and kernel-robust + if (!((vcvo.kernel~="") & (vcvo.clustvarname2==""))) { + shat=J(L*K,L*K,0) + for (i=1; i<=N_clust; i++) { // loop through clusters, adding Z'ee'Z + // for indiv cluster in each loop + esub=panelsubmatrix(*vcvo.e,i,info) + Zsub=panelsubmatrix(*vcvo.Z,i,info) + wsub=panelsubmatrix(*vcvo.wvar,i,info) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat=shat+quadcross(eZ,eZ) + } // end loop through clusters + } + +// 2-level clustering, no kernel-robust + if ((vcvo.clustvarname2~="") & (vcvo.kernel=="")) { + imax=max(clustvar2) // clustvar2 is numbered 1..N_clust2 + shat2=J(L*K,L*K,0) + for (i=1; i<=imax; i++) { // loop through clusters, adding Z'ee'Z + // for indiv cluster in each loop + svar=(clustvar2:==i) // mimics panelsubmatrix but doesn't require sorted data + esub=select(*vcvo.e,svar) // it is, however, noticably slower. + Zsub=select(*vcvo.Z,svar) + wsub=select(*vcvo.wvar,svar) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat2=shat2+quadcross(eZ,eZ) + } + } + +// 1st level of cluster, kernel-robust OR +// 2-level clustering, kernel-robust and time is 2nd cluster variable + if (vcvo.kernel~="") { + shat2=J(L*K,L*K,0) +// First, standard cluster-robust, i.e., no lags. + i=min(t) + while (i<=max(t)) { // loop through all T clusters, adding Z'ee'Z + // for indiv cluster in each loop + eZ=J(1,L*K,0) + svar=(t:==i) // select obs with t=i + if (colsum(svar)>0) { // there are obs with t=i + esub=select(*vcvo.e,svar) + Zsub=select(*vcvo.Z,svar) + wsub=select(*vcvo.wvar,svar) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { +// MISSING LINE IS NEXT + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat2=shat2+quadcross(eZ,eZ) + } + i=i+vcvo.tdelta + } // end i loop through all T clusters + +// Spectral windows require looping through all T-1 autocovariances + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + + for (tau=1; tau<=TAU; tau++) { + kw = m_ivreg29_calckw(tau, vcvo.bw, vcvo.kernel) // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + if (kw~=0) { + i=min(t)+tau*vcvo.tdelta // Loop through all possible ts (time clusters) + while (i<=max(t)) { // Start at earliest possible t + svar=t[.,]:==i // svar is current, svar1 is tau-th lag + svar1=t[.,]:==(i-tau*vcvo.tdelta) // tau*vcvo.tdelta is usually just tau + if ((colsum(svar)>0) // there are current & lagged obs + & (colsum(svar1)>0)) { + wv = select((*vcvo.e),svar) :* select((*vcvo.wvar),svar) * vcvo.wf + wv1 = select((*vcvo.e),svar1) :* select((*vcvo.wvar),svar1) * vcvo.wf + Zsub =select((*vcvo.Z),svar) + Zsub1=select((*vcvo.Z),svar1) + if (K==1) { // simple/fast, e is column vector + eZsub = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + eZsub1= quadcross(1, wv1, Zsub1) // equivalent to colsum(wv :* Zsub) + } + else { + eZsub=J(1,L*K,0) + for (j=1; j<=rows(Zsub); j++) { + wvj =wv[j,.] + Zj =Zsub[j,.] + eZsub=eZsub+(wvj#Zj) + } + eZsub1=J(1,L*K,0) + for (j=1; j<=rows(Zsub1); j++) { + wv1j =wv1[j,.] + Z1j =Zsub1[j,.] + eZsub1=eZsub1+(wv1j#Z1j) + } + } + ghat=quadcross(eZsub,eZsub1) + shat2=shat2+kw*(ghat+ghat') + } + i=i+vcvo.tdelta + } + } // end non-zero kernel weight block + } // end tau loop + +// If 1-level clustering, shat2 just calculated above is actually the desired shat + if (vcvo.clustvarname2=="") { + shat=shat2 + } + } + +// 2-level clustering, completion +// Cameron-Gelbach-Miller/Thompson method: +// Add 2 cluster variance matrices and subtract 3rd + if (vcvo.clustvarname2~="") { + shat = shat+shat2-shat3 + } + +// Note no dof correction required for cluster-robust + shat=shat/vcvo.N + } // end cluster-robust code + + if (vcvo.sw~="") { +// Stock-Watson adjustment. Calculate Bhat in their equation (6). Also need T=panel length. +// They define for balanced panels. Since T is not constant for unbalanced panels, need +// to incorporate panel-varying 1/T, 1/(T-1) and 1/(T-2) as weights in summation. + + st_view(ivar, ., st_tsrevar(vcvo.ivarname), vcvo.touse) + info_ivar = panelsetup(ivar, 1) + + shat=J(L*K,L*K,0) + bhat=J(L*K,L*K,0) + N_panels=0 + for (i=1; i<=rows(info_ivar); i++) { + esub=panelsubmatrix(*vcvo.e,i,info_ivar) + Zsub=panelsubmatrix(*vcvo.Z,i,info_ivar) + wsub=panelsubmatrix(*vcvo.wvar,i,info_ivar) + Tsub=rows(esub) + if (Tsub>2) { // SW cov estimator defined only for T>2 + N_panels=N_panels+1 + sigmahatsub=J(K,K,0) + ZZsub=J(L*K,L*K,0) + shatsub=J(L*K,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZi=esub[j,1]#Zsub[j,.] + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { + shatsub=shatsub+quadcross(eZi,eZi)*wsub[j]*vcvo.wf + sigmahatsub=sigmahatsub + quadcross(esub[j,1],esub[j,1])*wsub[j]*vcvo.wf + ZZsub=ZZsub+quadcross(Zsub[j,.],Zsub[j,.])*wsub[j]*vcvo.wf + } + else { + shatsub=shatsub+quadcross(eZi,eZi)*((wsub[j]*vcvo.wf)^2) + sigmahatsub=sigmahatsub + quadcross(esub[j,1],esub[j,1])*((wsub[j]*vcvo.wf)^2) + ZZsub=ZZsub+quadcross(Zsub[j,.],Zsub[j,.])*((wsub[j]*vcvo.wf)^2) + } + } // end loop through j obs of panel i + shat=shat + shatsub*(Tsub-1)/(Tsub-2) + bhat=bhat + ZZsub/Tsub#sigmahatsub/(Tsub-1)/(Tsub-2) + } + } // end loop through i panels + +// Note that Stock-Watson incorporate an N-n-k degrees of freedom correction in their eqn 4 +// for what we call shat. We use only an N-n degrees of freedom correction, i.e., we ignore +// the k regressors. This is because this is an estimate of S, the VCV of orthogonality conditions, +// independently of its use to obtain an estimate of the variance of beta. Makes no diff aysmptotically. +// Ignore dofminus correction since this is explicitly handled here. +// Use number of valid panels in denominator (SW cov estimator defined only for panels with T>2). + shat=shat/(vcvo.N-N_panels) + bhat=bhat/N_panels + shat=shat-bhat + } // end Stock-Watson block + + _makesymmetric(shat) + +// shat may not be positive-definite. Use spectral decomposition to obtain an invertable version. +// Extract Eigenvector and Eigenvalues, replace EVs, and reassemble shat. +// psda option: Stock-Watson 2008 Econometrica, Remark 8, say replace neg EVs with abs(EVs). +// psd0 option: Politis (2007) says replace neg EVs with zeros. + if (vcvo.psd~="") { + symeigensystem(shat,Evec,Eval) + if (vcvo.psd=="psda") { + Eval = abs(Eval) + } + else { + Eval = Eval + (abs(Eval) - Eval)/2 + } + shat = Evec*diag(Eval)*Evec' + _makesymmetric(shat) + } + + return(shat) + +} // end of program m_ivreg29_omega + +// *********************************************************************** // +// ********* m_ivreg29_calckw - shared by ivreg2 and ranktest ********************* // +// *********************************************************************** // + +real scalar m_ivreg29_calckw( real scalar tau, + real scalar bw, + string scalar kernel) + { + karg = tau / bw + if (kernel=="Truncated") { + kw=1 + } + if (kernel=="Bartlett") { + kw=(1-karg) + } + if (kernel=="Parzen") { + if (karg <= 0.5) { + kw = 1-6*karg^2+6*karg^3 + } + else { + kw = 2*(1-karg)^3 + } + } + if (kernel=="Tukey-Hanning") { + kw=0.5+0.5*cos(pi()*karg) + } + if (kernel=="Tukey-Hamming") { + kw=0.54+0.46*cos(pi()*karg) + } + if (kernel=="Tent") { + kw=2*(1-cos(tau*karg)) / (karg^2) + } + if (kernel=="Danielle") { + kw=sin(pi()*karg) / (pi()*karg) + } + if (kernel=="Quadratic Spectral") { + kw=25/(12*pi()^2*karg^2) /* + */ * ( sin(6*pi()*karg/5)/(6*pi()*karg/5) /* + */ - cos(6*pi()*karg/5) ) + } + return(kw) + } // end kw + +// *********************************************************************** // +// ********* END CODE SHARED BY ivreg2 AND ranktest ******************** // +// *********************************************************************** // + + +end + +****************************************** END *************************************** +*********************************** livreg2.mlib CODE ******************************** + +***************************************** START ************************************** +*********************************** ranktest.ado CODE ******************************** +* Code from: +* ranktest 1.3.04 24aug2014 +* author mes, based on code by fk +* Imported into ivreg29 so that ivreg29 is free-standing. +* See end of file for version notes. + +program define ivreg29_ranktest, rclass sortpreserve + version 9.2 + local lversion 01.3.04 + + if substr("`1'",1,1)== "," { + if "`2'"=="version" { + di in ye "`lversion'" + return local version `lversion' + exit + } + else { +di as err "invalid syntax" + exit 198 + } + } + +* If varlist 1 or varlist 2 have a single element, parentheses optional + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local y `s(varlist)' + local K : word count `y' + local 0 `"`s(rest)'"' + sret clear + } + else { + local y `1' + local K 1 + mac shift 1 + local 0 `"`*'"' + } + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local z `s(varlist)' + local L : word count `z' + local 0 `"`s(rest)'"' + sret clear + } + else { + local z `1' + local K 1 + mac shift 1 +* Need to reinsert comma before options (if any) for -syntax- command to work + local 0 `", `*'"' + } + +* Option version ignored here if varlists were provided + syntax [if] [in] [aw fw pw iw/] [, partial(varlist ts) fwl(varlist ts) /* + */ NOConstant wald ALLrank NULLrank FULLrank ROBust cluster(varlist) /* + */ BW(string) kernel(string) Tvar(varname) Ivar(varname) sw psd version /* + */ dofminus(integer 0) ] + + local partial "`partial' `fwl'" + + if "`noconstant'"=="" { + tempvar one + gen byte `one' = 1 + local partial "`partial' `one'" + } + + if "`wald'"~="" { + local LMWald "Wald" + } + else { + local LMWald "LM" + } + + local optct : word count `allrank' `nullrank' `fullrank' + if `optct' > 1 { +di as err "Incompatible options: `allrank' `nullrank' `fullrank'" + error 198 + } + else if `optct' == 0 { +* Default + local allrank "allrank" + } + +* Note that by tsrevar-ing here, subsequent disruption to the sort doesn't matter +* for TS operators. + tsrevar `y' + local vl1 `r(varlist)' + tsrevar `z' + local vl2 `r(varlist)' + tsrevar `partial' + local partial `r(varlist)' + + foreach vn of varlist `vl1' { + tempvar tv + qui gen double `tv' = . + local tempvl1 "`tempvl1' `tv'" + } + foreach vn of varlist `vl2' { + tempvar tv + qui gen double `tv' = . + local tempvl2 "`tempvl2' `tv'" + } + + marksample touse + markout `touse' `vl1' `vl2' `partial' `cluster', strok + +* Stock-Watson and cluster imply robust. + if "`sw'`cluster'" ~= "" { + local robust "robust" + } + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + if "`fsqrt(wf)*(wvar^0.5):*'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "fweight" & "`sw'" != "" { + di in red "fweights currently not supported with -sw- option" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`bw'" !="" { + di in red "iweights not allowed with robust, cluster, AC or HAC" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + + +* Every time a weight is used, must multiply by scalar wf ("weight factor") +* wf=1 for no weights, fw and iw, wf = scalar that normalizes sum to be N if aw or pw + sum `wvar' if `touse' `wtexp', meanonly +* Weight statement + if "`weight'" ~= "" { +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + if "`weight'"=="" | "`weight'"=="fweight" | "`weight'"=="iweight" { +* If weight is "", weight var must be column of ones and N is number of rows. +* With fw and iw, effective number of observations is sum of weight variable. + local wf=1 + local N=r(sum_w) + } + else if "`weight'"=="aweight" | "`weight'"=="pweight" { +* With aw and pw, N is number of obs, unadjusted. + local wf=r(N)/r(sum_w) + local N=r(N) + } + else { +* Should never reach here +di as err "ivreg29_ranktest error - misspecified weights" + exit 198 + } + +* HAC estimation. +* If bw is omitted, default `bw' is empty string. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. + if "`bw'" == "" & "`kernel'" == "" { + local bw=0 + } + else { +* Need tvar for markout with time-series stuff +* Data must be tsset for time-series operators in code to work +* User-supplied tvar checked if consistent with tsset + capture tsset + if "`r(timevar)'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } +* If no panel data, ivar will still be empty + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already -tsset-" + exit 5 + } + local tdelta `r(tdelta)' + tsreport if `touse', panel + if `r(N_gaps)' != 0 { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + +* Check it's a valid kernel and replace with unabbreviated kernel name; check bw. +* Automatic kernel selection allowed by ivreg2 but not ranktest so must trap. +* s_ivreg29_vkernel is in livreg2 mlib. + if "`bw'"=="auto" { +di as err "invalid bandwidth in option bw() - must be real > 0" + exit 198 + } + mata: s_ivreg29_vkernel("`kernel'", "`bw'", "`ivar'") + local kernel `r(kernel)' + local bw = `r(bw)' + } + +* tdelta missing if version 9 or if not tsset + if "`tdelta'"=="" { + local tdelta=1 + } + + if "`sw'"~="" { + capture xtset + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already tsset or xtset" + exit 5 + } +* Exit with error if ivar is neither supplied nor tsset nor xtset + if "`ivar'"=="" { +di as err "Must -xtset- or -tsset- data or specify -ivar- with -sw- option" + exit 198 + } + qui describe, short varlist + local sortlist "`r(sortlist)'" + tokenize `sortlist' + if "`ivar'"~="`1'" { +di as err "Error - dataset must be sorted on panel var with -sw- option" + exit 198 + } + } + +* Create variable used for getting lags etc. in Mata + tempvar tindex + qui gen `tindex'=1 if `touse' + qui replace `tindex'=sum(`tindex') if `touse' + +********** CLUSTER SETUP ********************************************** + +* Mata code requires data are sorted on (1) the first var cluster if there +* is only one cluster var; (2) on the 3rd and then 1st if two-way clustering, +* unless (3) two-way clustering is combined with kernel option, in which case +* the data are tsset and sorted on panel id (first cluster variable) and time +* id (second cluster variable). +* Second cluster var is optional and requires an identifier numbered 1..N_clust2, +* unless combined with kernel option, in which case it's the time variable. +* Third cluster var is the intersection of 1 and 2, unless combined with kernel +* opt, in which case it's unnecessary. +* Sorting on "cluster3 cluster1" means that in Mata, panelsetup works for +* both, since cluster1 nests cluster3. +* Note that it is possible to cluster on time but not panel, in which case +* cluster1 is time, cluster2 is empty and data are sorted on panel-time. +* Note also that if no kernel-robust, sorting will disrupt any tsset-ing, +* but data are tsrevar-ed earlier to avoid any problems. + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`kernel'"~="" { +* kernel requires either that cluster1 is time var and cluster2 is empty +* or that cluster1 is panel var and cluster2 is time var. +* Either way, data must be tsset and sorted for panel data. + if "`cluster2'"~="" { +* Allow backwards order + if "`cluster1'"=="`tvar'" & "`cluster2'"=="`ivar'" { + local cluster1 "`2'" + local cluster2 "`1'" + } + if "`cluster1'"~="`ivar'" | "`cluster2'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset panel & time vars." +di as err " tsset panel var=`ivar'; tsset time var=`tvar'; cluster vars=`cluster1',`cluster2'" + exit 198 + } + } + else { + if "`cluster1'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset time variable." +di as err " tsset time var=`tvar'; cluster var=`cluster1'" + exit 198 + } + } + } +* Simple way to get quick count of 1st cluster variable without disrupting sort +* clusterid1 is numbered 1.._Nclust1. + tempvar clusterid1 + qui egen `clusterid1'=group(`cluster1') if `touse' + sum `clusterid1' if `touse', meanonly + if "`cluster2'"=="" { + local N_clust=r(max) + local N_clust1=. + local N_clust2=. + if "`kernel'"=="" { +* Single level of clustering and no kernel-robust, so sort on single cluster var. +* kernel-robust already sorted via tsset. + sort `cluster1' + } + } + else { + local N_clust1=r(max) + if "`kernel'"=="" { + tempvar clusterid2 clusterid3 +* New cluster id vars are numbered 1..N_clust2 and 1..N_clust3 + qui egen `clusterid2'=group(`cluster2') if `touse' + qui egen `clusterid3'=group(`cluster1' `cluster2') if `touse' +* Two levels of clustering and no kernel-robust, so sort on cluster3/nested in/cluster1 +* kernel-robust already sorted via tsset. + sort `clusterid3' `cluster1' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) + } + else { +* Need to create this only to count the number of clusters + tempvar clusterid2 + qui egen `clusterid2'=group(`cluster2') if `touse' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) +* Now replace with original variable + local clusterid2 `cluster2' + } + local N_clust=min(`N_clust1',`N_clust2') + } + } + +************************************************************************************************ + +* Note that bw is passed as a value, not as a string + mata: ivreg29_rkstat( "`vl1'", /* + */ "`vl2'", /* + */ "`partial'", /* + */ "`wvar'", /* + */ "`weight'", /* + */ `wf', /* + */ `N', /* + */ "`touse'", /* + */ "`LMWald'", /* + */ "`allrank'", /* + */ "`nullrank'", /* + */ "`fullrank'", /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`tvar'", /* + */ "`ivar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ `dofminus', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`tempvl1'", /* + */ "`tempvl2'") + + tempname rkmatrix chi2 df df_r p rank ccorr eval + mat `rkmatrix'=r(rkmatrix) + mat `ccorr'=r(ccorr) + mat `eval'=r(eval) + mat colnames `rkmatrix' = "rk" "df" "p" "rank" "eval" "ccorr" + +di +di "Kleibergen-Paap rk `LMWald' test of rank of matrix" + if "`robust'"~="" & "`kernel'"~= "" & "`cluster'"=="" { +di " Test statistic robust to heteroskedasticity and autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`kernel'"~="" & "`cluster'"=="" { +di " Test statistic robust to autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`cluster'"~="" { +di " Test statistic robust to heteroskedasticity and clustering on `cluster'" + if "`kernel'"~="" { +di " and kernel-robust to common correlated disturbances" +di " Kernel: `kernel' Bandwidth: `bw'" + } + } + else if "`robust'"~="" { +di " Test statistic robust to heteroskedasticity" + } + else if "`LMWald'"=="LM" { +di " Test assumes homoskedasticity (Anderson canonical correlations test)" + } + else { +di " Test assumes homoskedasticity (Cragg-Donald test)" + } + + local numtests = rowsof(`rkmatrix') + forvalues i=1(1)`numtests' { +di "Test of rank=" %3.0f `rkmatrix'[`i',4] " rk=" %8.2f `rkmatrix'[`i',1] /* + */ " Chi-sq(" %3.0f `rkmatrix'[`i',2] ") pvalue=" %8.6f `rkmatrix'[`i',3] + } + scalar `chi2' = `rkmatrix'[`numtests',1] + scalar `p' = `rkmatrix'[`numtests',3] + scalar `df' = `rkmatrix'[`numtests',2] + scalar `rank' = `rkmatrix'[`numtests',4] + local N `r(N)' + return scalar df = `df' + return scalar chi2 = `chi2' + return scalar p = `p' + return scalar rank = `rank' + if "`cluster'"~="" { + return scalar N_clust = `N_clust' + } + if "`cluster2'"~="" { + return scalar N_clust1 = `N_clust1' + return scalar N_clust2 = `N_clust2' + } + return scalar N = `N' + return matrix rkmatrix `rkmatrix' + return matrix ccorr `ccorr' + return matrix eval `eval' + + tempname S V Omega + if `K' > 1 { + foreach en of local y { +* Remove "." from equation name + local en1 : subinstr local en "." "_", all + foreach vn of local z { + local cn "`cn' `en1':`vn'" + } + } + } + else { + foreach vn of local z { + local cn "`cn' `vn'" + } + } + mat `V'=r(V) + matrix colnames `V' = `cn' + matrix rownames `V' = `cn' + return matrix V `V' + mat `S'=r(S) + matrix colnames `S' = `cn' + matrix rownames `S' = `cn' + return matrix S `S' +end + +* Adopted from -canon- +program define GetVarlist, sclass + sret clear + gettoken open 0 : 0, parse("(") + if `"`open'"' != "(" { + error 198 + } + gettoken next 0 : 0, parse(")") + while `"`next'"' != ")" { + if `"`next'"'=="" { + error 198 + } + local list `list'`next' + gettoken next 0 : 0, parse(")") + } + sret local rest `"`0'"' + tokenize `list' + local 0 `*' + sret local varlist "`0'" +end + + +******************************************************************************* +*************************** BEGIN MATA CODE *********************************** +******************************************************************************* + + + +version 9.2 +mata: + +void ivreg29_rkstat( string scalar vl1, + string scalar vl2, + string scalar partial, + string scalar wvarname, + string scalar weight, + scalar wf, + scalar N, + string scalar touse, + string scalar LMWald, + string scalar allrank, + string scalar nullrank, + string scalar fullrank, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + bw, + string scalar tvarname, + string scalar ivarname, + string scalar tindexname, + tdelta, + dofminus, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar tempvl1, + string scalar tempvl2) +{ + +// tempx, tempy and tempz are the Stata names of temporary variables that will be changed by rkstat + if (partial~="") { + tempx=tokens(partial) + } + tempy=tokens(tempvl1) + tempz=tokens(tempvl2) + + st_view(y=.,.,tokens(vl1),touse) + st_view(z=.,.,tokens(vl2),touse) + st_view(yhat=.,.,tempy,touse) + st_view(zhat=.,.,tempz,touse) + st_view(mtouse=.,.,tokens(touse),touse) + st_view(wvar=.,.,tokens(wvarname),touse) + noweight=(st_vartype(wvarname)=="byte") + +// Note that we now use wf*wvar instead of wvar +// because wvar is raw weighting variable and +// wf*wvar normalizes so that sum(wf*wvar)=N. + +// Partial out the X variables +// Note that this is entered if there is a constant, +// i.e., variables are centered + if (partial~="") { + st_view(x=.,.,tempx,touse) + xx = quadcross(x, wf*wvar, x) + xy = quadcross(x, wf*wvar, y) + xz = quadcross(x, wf*wvar, z) + + by = invsym(xx)*xy + bz = invsym(xx)*xz + + yhat[.,.] = y-x*by + zhat[.,.] = z-x*bz + } + else { + yhat[.,.] = y + zhat[.,.] = z + } + K=cols(y) + L=cols(z) + + zhzh = quadcross(zhat, wf*wvar, zhat) + zhyh = quadcross(zhat, wf*wvar, yhat) + yhyh = quadcross(yhat, wf*wvar, yhat) + + pihat = invsym(zhzh)*zhyh +// rzhat is F in paper (p. 103) +// iryhat is G in paper (p. 103) + ryhat=cholesky(yhyh) + rzhat=cholesky(zhzh) + iryhat=luinv(ryhat') + irzhat=luinv(rzhat') + that=rzhat'*pihat*iryhat + +// cc is canonical correlations. Squared cc is eigenvalues. + fullsvd(that, ut, cc, vt) + vt=vt' + vecth=vec(that) + ev = cc:^2 +// S matrix in paper (p. 100). Not used in code below. +// smat=fullsdiag(cc, rows(that)-cols(that)) + + if (abs(1-cc[1,1])<1e-10) { +printf("\n{text:Warning: collinearities detected between (varlist1) and (varlist2)}\n") + } + if ((missing(ryhat)>0) | (missing(iryhat)>0) | (missing(rzhat)>0) | (missing(irzhat)>0)) { +printf("\n{error:Error: non-positive-definite matrix. May be caused by collinearities.}\n") + exit(error(3351)) + } + +// If Wald, yhat is residuals + if (LMWald=="Wald") { + yhat[.,.]=yhat-zhat*pihat + yhyh = quadcross(yhat, wvar, yhat) + } + +// Covariance matrices +// vhat is W in paper (eqn below equation 17, p. 103) +// shat is V in paper (eqn below eqn 15, p. 103) + +// ************************************************************************************* // +// shat calculated using struct and programs m_ivreg29_omega, m_ivreg29_calckw shared with ivreg2 // + + struct ms_ivreg29_vcvorthog scalar vcvo + + + vcvo.ename = tempy // ivreg2 has = ename // + vcvo.Znames = tempz // ivreg2 has = Znames // + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = zhzh // ivreg2 has = st_matrix(ZZmatrix) // + + vcvo.e = &yhat // ivreg2 has = &e // + vcvo.Z = &zhat // ivreg2 has = &Z // + vcvo.wvar = &wvar + + shat=m_ivreg29_omega(vcvo) + +// *************************************************************************************** + +// Finally, calcluate vhat + if ((LMWald=="LM") & (kernel=="") & (robust=="") & (clustvarname=="")) { +// Homoskedastic, iid LM case means vcv is identity matrix +// Generates canonical correlation stats. Default. + vhat=I(L*K,L*K)/N + } + else { + vhat=(iryhat'#irzhat')*shat*(iryhat'#irzhat')' * N + _makesymmetric(vhat) + } + +// ready to start collecting test stats + if (allrank~="") { + firstrank=1 + lastrank=min((K,L)) + } + else if (nullrank~="") { + firstrank=1 + lastrank=1 + } + else if (fullrank~="") { + firstrank=min((K,L)) + lastrank=min((K,L)) + } + else { +// should never reach this point +printf("ivreg29_ranktest error\n") + exit + } + + rkmatrix=J(lastrank-firstrank+1,6,.) + for (i=firstrank; i<=lastrank; i++) { + + if (i>1) { + u12=ut[(1::i-1),(i..L)] + v12=vt[(1::i-1),(i..K)] + } + u22=ut[(i::L),(i..L)] + v22=vt[(i::K),(i..K)] + + symeigensystem(u22*u22', evec, eval) + u22v=evec + u22d=diag(eval) + u22h=u22v*(u22d:^0.5)*u22v' + + symeigensystem(v22*v22', evec, eval) + v22v=evec + v22d=diag(eval) + v22h=v22v*(v22d:^0.5)*v22v' + + if (i>1) { + aq=(u12 \ u22)*luinv(u22)*u22h + bq=v22h*luinv(v22')*(v12 \ v22)' + } + else { + aq=u22*luinv(u22)*u22h + bq=v22h*luinv(v22')*v22' + } + +// lab is lambda_q in paper (eqn below equation 21, p. 104) +// vlab is omega_q in paper (eqn 19 in paper, p. 104) + lab=(bq#aq')*vecth + vlab=(bq#aq')*vhat*(bq#aq')' + +// Symmetrize if numerical inaccuracy means it isn't + _makesymmetric(vlab) + vlabinv=invsym(vlab) +// rk stat Assumption 2: vlab (omega_q in paper) is nonsingular. Detected by a zero on the diagonal, +// since when returning a generalized inverse, Stata/Mata choose the generalized inverse that +// sets entire column(s)/row(s) to zeros. +// Save df and rank even if test stat not available. + df=(L-i+1)*(K-i+1) + rkmatrix[i-firstrank+1,2]=df + rkmatrix[i-firstrank+1,4]=i-1 + if (diag0cnt(vlabinv)>0) { +printf("\n{text:Warning: covariance matrix omega_%f}", i-1) +printf("{text: not full rank; test of rank %f}", i-1) +printf("{text: unavailable}\n") + } +// Note not multiplying by N - already incorporated in vhat. + else { + rk=lab'*vlabinv*lab + pvalue=chi2tail(df, rk) + rkmatrix[i-firstrank+1,1]=rk + rkmatrix[i-firstrank+1,3]=pvalue + } +// end of test loop + } + +// insert squared (=eigenvalues if canon corr) and unsquared canon correlations + for (i=firstrank; i<=lastrank; i++) { + rkmatrix[i-firstrank+1,6]=cc[i-firstrank+1,1] + rkmatrix[i-firstrank+1,5]=ev[i-firstrank+1,1] + } + st_matrix("r(rkmatrix)", rkmatrix) + st_matrix("r(ccorr)", cc') + st_matrix("r(eval)",ev') +// Save V matrix as in paper, without factor of 1/N + vhat=N*vhat*wf + st_matrix("r(V)", vhat) +// Save S matrix as in ivreg2, with factor of 1/N + st_matrix("r(S)", shat) + st_numscalar("r(N)", N) + if (clustvarname~="") { + st_numscalar("r(N_clust)", N_clust) + } + if (clustvarname2~="") { + st_numscalar("r(N_clust2)", N_clust2) + } +// end of program +} + + +end + +****************************************** END *************************************** +*********************************** ranktest.ado CODE ******************************** + +exit + +********************************** VERSION COMMENTS ********************************** +* Initial version cloned from official ivreg version 5.0.9 19Dec2001 +* 1.0.2: add logic for reg3. Sargan test +* 1.0.3: add prunelist to ensure that count of excluded exogeneous is correct +* 1.0.4: revise option to exog(), allow included exog to be specified as well +* 1.0.5: switch from reg3 to regress, many options and output changes +* 1.0.6: fixed treatment of nocons in Sargan and C-stat, and corrected problems +* relating to use of nocons combined with a constant as an IV +* 1.0.7: first option reports F-test of excluded exogenous; prunelist bug fix +* 1.0.8: dropped prunelist and switched to housekeeping of variable lists +* 1.0.9: added collinearity checks; C-stat calculated with recursive call; +* added ffirst option to report only F-test of excluded exogenous +* from 1st stage regressions +* 1.0.10: 1st stage regressions also report partial R2 of excluded exogenous +* 1.0.11: complete rewrite of collinearity approach - no longer uses calls to +* _rmcoll, does not track specific variables dropped; prunelist removed +* 1.0.12: reorganised display code and saved results to enable -replay()- +* 1.0.13: -robust- and -cluster- now imply -small- +* 1.0.14: fixed hascons bug; removed ivreg predict fn (it didn't work); allowed +* robust and cluster with z stats and correct dofs +* 1.0.15: implemented robust Sargan stat; changed to only F-stat, removed chi-sq; +* removed exog option (only orthog works) +* 1.0.16: added clusterised Sargan stat; robust Sargan handles collinearities; +* predict now works with standard SE options plus resids; fixed orthog() +* so it accepts time series operators etc. +* 1.0.17: fixed handling of weights. fw, aw, pw & iw all accepted. +* 1.0.18: fixed bug in robust Sargan code relating to time series variables. +* 1.0.19: fixed bugs in reporting ranks of X'X and Z'Z +* fixed bug in reporting presence of constant +* 1.0.20: added GMM option and replaced robust Sargan with (equivalent) J; +* added saved statistics of 1st stage regressions +* 1.0.21: added Cragg HOLS estimator, including allowing empty endog list; +* -regress- syntax now not allowed; revised code searching for "_cons" +* 1.0.22: modified cluster output message; fixed bug in replay for Sargan/Hansen stat; +* exactly identified Sargan/Hansen now exactly zero and p-value not saved as e(); +* cluster multiplier changed to 1 (from buggy multiplier), in keeping with +* eg Wooldridge 2002 p. 193. +* 1.0.23: fixed orthog option to prevent abort when restricted equation is underid. +* 1.0.24: fixed bug if 1st stage regressions yielded missing values for saving in e(). +* 1.0.25: Added Shea version of partial R2 +* 1.0.26: Replaced Shea algorithm with Godfrey algorithm +* 1.0.27: Main call to regress is OLS form if OLS or HOLS is specified; error variance +* in Sargan and C statistics use small-sample adjustment if -small- option is +* specified; dfn of S matrix now correctly divided by sample size +* 1.0.28: HAC covariance estimation implemented +* Symmetrize all matrices before calling syminv +* Added hack to catch F stats that ought to be missing but actually have a +* huge-but-not-missing value +* Fixed dof of F-stat - was using rank of ZZ, should have used rank of XX (couldn't use df_r +* because it isn't always saved. This is because saving df_r triggers small stats +* (t and F) even when -post- is called without dof() option, hence df_r saved only +* with -small- option and hence a separate saved macro Fdf2 is needed. +* Added rankS to saved macros +* Fixed trap for "no regressors specified" +* Added trap to catch gmm option with no excluded instruments +* Allow OLS syntax (no endog or excluded IVs specified) +* Fixed error messages and traps for rank-deficient robust cov matrix; includes +* singleton dummy possibility +* Capture error if posting estimated VCV that isn't pos def and report slightly +* more informative error message +* Checks 3 variable lists (endo, inexog, exexog) separately for collinearities +* Added AC (autocorrelation-consistent but conditionally-homoskedastic) option +* Sargan no longer has small-sample correction if -small- option +* robust, cluster, AC, HAC all passed on to first-stage F-stat +* bw must be < T +* 1.0.29 -orthog- also displays Hansen-Sargan of unrestricted equation +* Fixed collinearity check to include nocons as well as hascons +* Fixed small bug in Godfrey-Shea code - macros were global rather than local +* Fixed larger bug in Godfrey-Shea code - was using mixture of sigma-squares from IV and OLS +* with and without small-sample corrections +* Added liml and kclass +* 1.0.30 Changed order of insts macro to match saved matrices S and W +* 2.0.00 Collinearities no longer -qui- +* List of instruments tested in -orthog- option prettified +* 2.0.01 Fixed handling of nocons with no included exogenous, including LIML code +* 2.0.02 Allow C-test if unrestricted equation is just-identified. Implemented by +* saving Hansen-Sargan dof as = 0 in e() if just-identified. +* 2.0.03 Added score() option per latest revision to official ivreg +* 2.0.04 Changed score() option to pscore() per new official ivreg +* 2.0.05 Fixed est hold bug in first-stage regressions +* Fixed F-stat finite sample adjustment with cluster option to match official Stata +* Fixed F-stat so that it works with hascons (collinearity with constant is removed) +* Fixed bug in F-stat code - wasn't handling failed posting of vcv +* No longer allows/ignores nonsense options +* 2.0.06 Modified lsStop to sync with official ivreg 5.1.3 +* 2.0.07a Working version of CUE option +* Added sortpreserve, ivar and tvar options +* Fixed smalls bug in calculation of T for AC/HAC - wasn't using the last ob +* in QS kernel, and didn't take account of possible dropped observations +* 2.0.07b Fixed macro bug that truncated long varlists +* 2.0.07c Added dof option. +* Changed display of RMSE so that more digits are displayed (was %8.1g) +* Fixed small bug where cstat was local macro and should have been scalar +* Fixed bug where C stat failed with cluster. NB: wmatrix option and cluster are not compatible! +* 2.0.7d Fixed bug in dof option +* 2.1.0 Added first-stage identification, weak instruments, and redundancy stats +* 2.1.01 Tidying up cue option checks, reporting of cue in output header, etc. +* 2.1.02 Used Poskitt-Skeels (2002) result that C-D eval = cceval / (1-cceval) +* 2.1.03 Added saved lists of separate included and excluded exogenous IVs +* 2.1.04 Added Anderson-Rubin test of signif of endog regressors +* 2.1.05 Fix minor bugs relating to cluster and new first-stage stats +* 2.1.06 Fix bug in cue: capture estimates hold without corresponding capture on estimates unhold +* 2.1.07 Minor fix to ereturn local wexp, promote to version 8.2 +* 2.1.08 Added dofminus option, removed dof option. Added A-R test p-values to e(). +* Minor bug fix to A-R chi2 test - was N chi2, should have been N-L chi2. +* Changed output to remove potentially misleading refs to N-L etc. +* Bug fix to rhs count - sometimes regressors could have exact zero coeffs +* Bug fix related to cluster - if user omitted -robust-, orthog would use Sargan and not J +* Changed output of Shea R2 to make clearer that F and p-values do not refer to it +* Improved handling of collinearites to check across inexog, exexog and endo lists +* Total weight statement moved to follow summ command +* Added traps to catch errors if no room to save temporary estimations with _est hold +* Added -savefirst- option. Removed -hascons-, now synonymous with -nocons-. +* 2.1.09 Fixes to dof option with cluster so it no longer mimics incorrect areg behavior +* Local ivreg2_cmd to allow testing under name ivreg2 +* If wmatrix supplied, used (previously not used if non-robust sargan stat generated) +* Allowed OLS using (=) syntax (empty endo and exexog lists) +* Clarified error message when S matrix is not of full rank +* cdchi2p, ardf, ardf_r added to saved macros +* first and ffirst replay() options; DispFirst and DispFFirst separately codes 1st stage output +* Added savefprefix, macro with saved first-stage equation names. +* Added version option. +* Added check for duplicate variables to collinearity checks +* Rewrote/simplified Godfrey-Shea partial r2 code +* 2.1.10 Added NOOUTput option +* Fixed rf bug so that first does not trigger unnecessary saved rf +* Fixed cue bug - was not starting with robust 2-step gmm if robust/cluster +* 2.1.11 Dropped incorrect/misleading dofminus adjustments in first-stage output summary +* 2.1.12 Collinearity check now checks across inexog/exexog/endog simultaneously +* 2.1.13 Added check to catch failed first-stage regressions +* Fixed misleading failed C-stat message +* 2.1.14 Fixed mishandling of missing values in AC (non-robust) block +* 2.1.15 Fixed bug in RF - was ignoring weights +* Added -endog- option +* Save W matrix for all cases; ensured copy is posted with wmatrix option so original isn't zapped +* Fixed cue bug - with robust, was entering IV block and overwriting correct VCV +* 2.1.16 Added -fwl- option +* Saved S is now robust cov matrix of orthog conditions if robust, whereas W is possibly non-robust +* weighting matrix used by estmator. inv(S)=W if estimator is efficient GMM. +* Removed pscore option (dropped by official ivreg). +* Fixed bug where -post- would fail because of missing values in vcv +* Remove hascons as synonym for nocons +* OLS now outputs 2nd footer with variable lists +* 2.1.17 Reorganization of code +* Added ll() macro +* Fixed N bug where weights meant a non-integer ob count that was rounded down +* Fixed -fwl- option so it correctly handles weights (must include when partialling-out) +* smatrix option takes over from wmatrix option. Consistent treatment of both. +* Saved smatrix and wmatrix now differ in case of inefficient GMM. +* Added title() and subtitle() options. +* b0 option returns a value for the Sargan/J stat even if exactly id'd. +* (Useful for S-stat = value of GMM objective function.) +* HAC and AC now allowed with LIML and k-class. +* Collinearity improvements: bug fixed because collinearity was mistakenly checked across +* inexog/exexog/endog simultaneously; endog predicted exactly by IVs => reclassified as inexog; +* _rmcollright enforces inexog>endo>exexog priority for collinearities, if Stata 9.2 or later. +* K-class, LIML now report Sargan and J. C-stat based on Sargan/J. LIML reports AR if homosked. +* nb: can always easily get a C-stat for LIML based on diff of two AR stats. +* Always save Sargan-Hansen as e(j); also save as e(sargan) if homoskedastic. +* Added Stock-Watson robust SEs options sw() +* 2.1.18 Added Cragg-Donald-Stock-Yogo weak ID statistic critical values to main output +* Save exexog_ct, inexog_ct and endog_ct as macros +* Stock-Watson robust SEs now assume ivar is group variable +* Option -sw- is standard SW. Option -swpsd- is PSD version a la page 6 point 10. +* Added -noid- option. Suppresses all first-stage and identification statistics. +* Internal calls to ivreg2 use noid option. +* Added hyperlinks to ivreg2.hlp and helpfile argument to display routines to enable this. +* 2.1.19 Added matrix rearrangement and checks for smatrix and wmatrix options +* Recursive calls to cstat simplified - no matrix rearrangement or separate robust/nonrobust needed +* Reintroduced weak ID stats to ffirst output +* Added robust ID stats to ffirst output for case of single endogenous regressor +* Fixed obscure bug in reporting 1st stage partial r2 - would report zero if no included exogenous vars +* Removed "HOLS" in main output (misleading if, e.g., estimation is AC but not HAC) +* Removed "ML" in main output if no endogenous regressors - now all ML is labelled LIML +* model=gmm is now model=gmm2s; wmatrix estimation is model=gmm +* wmatrix relates to gmm estimator; smatrix relates to gmm var-cov matrix; b0 behavior equiv to wmatrix +* b0 option implies nooutput and noid options +* Added nocollin option to skip collinearity checks +* Fixed minor display bug in ffirst output for endog vars with varnames > 12 characters +* Fixed bug in saved rf and first-stage results for vars with long varnames; uses permname +* Fixed bug in model df - had counted RHS, now calculates rank(V) since latter may be rank-deficient +* Rank of V now saved as macro rankV +* fwl() now allows partialling-out of just constant with _cons +* Added Stock-Wright S statistic (but adds overhead - calls preserve) +* Properties now include svyj. +* Noted only: fwl bug doesn't allow time-series operators. +* 2.1.20 Fixed Stock-Wright S stat bug - didn't allow time-series operators +* 2.1.21 Fixed Stock-Wright S stat to allow for no exog regressors cases +* 2.2.00 CUE partials out exog regressors, estimates endog coeffs, then exog regressors separately - faster +* gmm2s becomes standard option, gmm supported as legacy option +* 2.2.01 Added explanatory messages if gmm2s used. +* States if estimates efficient for/stats consistent for het, AC, etc. +* Fixed small bug that prevented "{help `helpfile'##fwl:fwl}" from displaying when -capture-d. +* Error message in footer about insuff rank of S changed to warning message with more informative message. +* Fixed bug in CUE with weights. +* 2.2.02 Removed CUE partialling-out; still available with fwl +* smatrix and wmatrix become documented options. e(model)="gmmw" means GMM with arbitrary W +* 2.2.03 Fixed bug in AC with aweights; was weighting zi'zi but not ei'ei. +* 2.2.04 Added abw code for bw(), removed properties(svyj) +* 2.2.05 Fixed bug in AC; need to clear variable vt1 at start of loop +* If iweights, Nprec (#obs with precision) rounded to nearest integer to mimic official Stata treatment +* and therefore don't need Nprec scalar at all - will be same as N +* Saves fwl_ct as macro. +* -ffirst- output, weak id stat, etc. now adjust for number of partialled-out variables. +* Related changes: df_m, df_r include adjustments for partialled-out variables. +* Option nofwlsmall introduced - suppresses above adjustments. Undocumented in ivreg2.hlp. +* Replaced ID tests based on canon corr with Kleibergen-Paap rk-based stats if not homoskedastic +* Replaced LR ID test stats with LM test stats. +* Checks that -ranktest- is installed. +* 2.2.06 Fixed bug with missing F df when cue called; updated required version of ranktest +* 2.2.07 Modified redundancy test statistic to match standard regression-based LM tests +* Change name of -fwl- option to -partial-. +* Use of b0 means e(model)=CUE. Added informative b0 option titles. b0 generates output but noid. +* Removed check for integer bandwidth if auto option used. +* 2.2.08 Add -nocollin- to internal calls and to -ivreg2_cue- to speed performance. +* 2.2.09 Per msg from Brian Poi, Alastair Hall verifies that Newey-West cited constant of 1.1447 +* is correct. Corrected mata abw() function. Require -ranktest- 1.1.03. +* 2.2.10 Added Angrist-Pischke multivariate f stats. Rewrite of first and ffirst output. +* Added Cragg-Donald to weak ID output even when non-iid. +* Fixed small bug in non-robust HAC code whereby extra obs could be used even if dep var missing. +* (required addition of L`tau'.(`s1resid') in creation of second touse variable) +* Fixed bugs that zapped varnames with "_cons" in them +* Changed tvar and ivar setup so that data must be tsset or xtset; tvar and ivar can still be supplied +* but are only checked for consistency. +* Fixed bug in redundancy test stat when called by xtivreg2+cluster - no dofminus adj needed in this case +* Removed undocumented and unverified Stock-Watson option +* Bug in vecaccum meant that if there is only 1 observation it will crash with insufficient obs. +* Affected kernel-robust AC/HAC if there were gaps in the data. Fixed by replacing missings with zeros. +* Fixed bug in LIML with AC but not HAC that meant non-robust VCV was reported. +* Changed reporting so that gaps between panels are not reported as such. +* Changed Stock-Wright S statistic so that it uses straight partialling-out of exog regressors +* (had been, in effect, doing 2SGMM partialling-out) +* Fixed xtivreg2-related bug in AC (not HAC) where dofminus correction was not used in calc of sigmas. +* Fixed xtivreg2-related bug where IV weighting matrix didn't incorporate dofminus correction. +* Added check that weight variable is not transformed by partialling out. +* Fixed bug where dropped collinear endogenous didn't get a warning or listing +* Removed N*CDEV Wald chi-sq statistic from ffirst output (LM stat enough) +* Revised eigenvalue code of LIML with Mata version +* 2.2.11 -capture- instead of -qui- before reduced form to suppress not-full-rank error warning +* Repaired bug in Stock-Wright S stat so that it handles partialling-out consistently. +* 2.2.12 Disabled auto bandwidth selection with panel data +* 2.2.13 Fixed partial bug - partialcons macro saved =0 unless _cons explicitly in partial() varlist +* 2.2.14 Incorporated ranktest and Mata library code into ivreg29.ado - no longer needs separate installation. + +* Version notes for imported version of ranktest: +* 1.0.00 First distributed version +* 1.0.01 With iweights, rkstat truncates N to mimic official Stata treatment of noninteger iweights +* Added warning if shat/vhat/vlab not of full rank. +* 1.0.02 Added NULLrank option +* Added eq names to saved V and S matrices +* 1.0.03 Added error catching for collinearities between varlists +* Not saving S matrix; V matrix now as in paper (without 1/N factor) +* Statistic, p-value etc set to missing if vcv not of full rank (Assumpt 2 in paper fails) +* 1.0.04 Fixed touse bug - was treating missings as touse-able +* Change some cross-products in robust loops to quadcross +* 1.0.05 Fixed bug with col/row names and ts operators. Added eval to saved matrices. +* 1.1.00 First ssc-ideas version. Added version 9.2 prior to Mata compiled section. +* 1.1.01 Allow non-integer bandwidth +* 1.1.02 Changed calc of yhat, zhat and pihat to avoid needlessly large intermediate matrices +* and to use more accurate qrsolve instead of inverted X'X. +* 1.1.03 Fixed touse bug that didn't catch missing cluster variable +* Fixed cluster bug - data needed to be sorted by cluster for Mata panel functions to work properly +* 1.2.00 Changed reporting so that gaps between panels are not reported as such. +* Added support for tdelta in tsset data. +* Changed tvar and ivar setup so that data must be tsset or xtset. +* Removed unnecessary loops through panel data with spectral kernels +* shat vcv now also saved. +* Added support for Thompson/Cameron-Gelbach-Miller 2-level cluster-robust vcvv +* Added support for Stock-Watson vcv - but requires data to have FEs partialled out, & doesn't support fweights +* Removed mimicking of Stata mistake of truncated N with iweights to nearest integer +* Fixed small bug with quadratic kernel (wasn't using negative weights) +* Optimised code dealing with time-series data +* 1.2.01 Fixed bug that always used Stock-Watson spectral decomp to create invertible shat +* instead of only when (undocumented) spsd option is called. +* 1.2.02 Fixed bug that did not allow string cluster variables +* 1.2.03 Fixed bug in code for cluster+kernel robust (typo in imported code from ivreg2=>crash) +* 1.2.04 Replaced code for S with ivreg2 code modified to support e matrix (cols > 1) +* Code block (m_omega, m_calckw, struct definition) now shared by ranktest and ivreg2. +* Renamed spsd option to psd following ivreg2 3.0.07 +* Added wf ("weight factor") and statement about sum of weights, as in ivreg2 +* Added dofminus option, as in ivreg2 +* Fixed minor reporting bug - was reporting gaps in entire panel, not just touse-d portion +* Recoded kernel & bw checks to use shared ivreg2 subroutine vkernel +* 1.2.05 Fixed weighting bug introduced in 1.2.04. All weights were affected. +* Was result of incompatibility of code shared with ivreg2. +* 1.3.01 First ranktest version with accompanying Mata library (shared with -ivreg2-). +* Mata library includes struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Fixed bug in 2-way cluster code (now in m_omega in Mata library) - would crash if K>1. +* 1.3.02 Improved partialling out and matrix inversion - switched from qrsolve to invsym. +* Use _makesymmetric() instead of symmetrizing by hand. +* 1.3.03 01Jan14. Fixed reporting bug with 2-way clustering and kernel-robust that would give +* wrong count for 2nd cluster variable. +* 1.3.04 24Aug14. Fixed bug in markout - would include obs where some vars were missing + +* Version notes for imported version of Mata library +* 1.1.01 First version of library. +* Contains struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Compiled in Stata 9.2 for compatibility with ranktest 1.3.01 (a 9.2 program). +* 1.1.02 Add routine cdsy. Standardized spelling/caps/etc. of QS as "Quadratic Spectral" +* 1.1.03 Corrected spelling of "Danielle" kernel in m_omega() +* 1.1.04 Fixed weighting bugs in robust and cluster code of m_omega where K>1 +* 1.1.05 Added whichlivreg2(.) to aid in version control +* 1.1.06 Fixed remaining weighting bug (see 1.1.04) in 2-way clustering when interection +* of clustering levels is groups +* 1.1.07 Fixed HAC bug that crashed m_omega(.) when there were no obs for a particular lag diff --git a/data/ado/i/ivreg29.hlp b/data/ado/i/ivreg29.hlp new file mode 100644 index 0000000..426120d --- /dev/null +++ b/data/ado/i/ivreg29.hlp @@ -0,0 +1,1508 @@ +{smcl} +{* 2Jan2010}{...} +{hline} +help for {hi:ivreg29} +{hline} + +{title:Extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression} + +{p 4}Full syntax + +{p 8 14}{cmd:ivreg29} {it:depvar} [{it:varlist1}] +{cmd:(}{it:varlist2}{cmd:=}{it:varlist_iv}{cmd:)} [{it:weight}] +[{cmd:if} {it:exp}] [{cmd:in} {it:range}] +{bind:[{cmd:,} {cmd:gmm2s}} +{cmd:bw(}{it:#}{cmd:)} +{cmd:kernel(}{it:string}{cmd:)} +{cmd:liml} +{cmd:fuller(}{it:#}{cmd:)} +{cmd:kclass(}{it:#}{cmd:)} +{cmd:coviv} +{cmd:cue} +{cmd:cueinit}{cmd:(}{it:matrix}{cmd:)} +{cmdab:cueopt:ions}{cmd:(}{it:string}{cmd:)} +{cmd:b0}{cmd:(}{it:matrix}{cmd:)} +{cmdab:r:obust} +{cmdab:cl:uster}{cmd:(}{it:varname}{cmd:)} +{cmd:orthog(}{it:varlist_ex}{cmd:)} +{cmd:endog(}{it:varlist_en}{cmd:)} +{cmdab:red:undant(}{it:varlist_ex}{cmd:)} +{cmd:partial(}{it:varlist}{cmd:)} +{cmdab:sm:all} +{cmdab:noc:onstant} {cmdab:h}ascons +{cmd:smatrix}{cmd:(}{it:matrix}{cmd:)} +{cmd:wmatrix}{cmd:(}{it:matrix}{cmd:)} +{cmd:first} {cmd:ffirst} {cmd:savefirst} {cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:rf} {cmd:saverf} {cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:nocollin} {cmd:noid} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{bind:{cmd:plus} ]} + +{p 4}Replay syntax + +{p 8 14}{cmd:ivreg29} +{bind:[{cmd:,} {cmd:first}} +{cmd:ffirst} {cmd:rf} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{cmd:plus} ]} + +{p 4}Version syntax + +{p 8 14}{cmd:ivreg29}, {cmd:version} + +{p}{cmd:ivreg29} is a version of {cmd:ivreg2} compatible with Stata version 9.2 or later. +{cmd:ivreg29} is not under active development. +See the online description of {view "http://fmwww.bc.edu/RePEc/bocode/i/ivreg2.hlp" :ivreg2} +for details. + +{p}{cmd:ivreg29} may be used with time-series or panel data, +in which case the data must be {cmd:tsset} +before using {cmd:ivreg29}; see help {help tsset}. + +{p}All {it:varlists} may contain time-series operators; +see help {help varlist}. + +{p}{cmd:by}, {cmd:rolling}, {cmd:statsby}, {cmd:xi}, +{cmd:bootstrap} and {cmd:jackknife} are allowed; see help {help prefix}. + +{p}{cmd:aweight}s, {cmd:fweight}s, {cmd:iweight}s and {cmd:pweight}s +are allowed; see help {help weights}. + +{p}The syntax of {help predict} following {cmd:ivreg29} is + +{p 8 16}{cmd:predict} [{it:type}] {it:newvarname} [{cmd:if} {it:exp}] +[{cmd:in} {it:range}] [{cmd:,} {it:statistic}] + +{p}where {it:statistic} is + +{p 8 23}{cmd:xb}{space 11}fitted values; the default{p_end} +{p 8 23}{cmdab:r:esiduals}{space 4}residuals{p_end} +{p 8 23}{cmd:stdp}{space 9}standard error of the prediction{p_end} + +{p}These statistics are available both in and out of sample; +type "{cmd:predict} {it:...} {cmd:if e(sample)} {it:...}" +if wanted only for the estimation sample. + +{title:Contents} +{p 2}{help ivreg29##s_description:Description}{p_end} +{p 2}{help ivreg29##s_robust:Calculation of robust, cluster-robust, AC, HAC standard errors}{p_end} +{p 2}{help ivreg29##s_gmm:GMM estimation}{p_end} +{p 2}{help ivreg29##s_liml:LIML, k-class and GMM-CUE estimation}{p_end} +{p 2}{help ivreg29##s_sumopt:Summary of robust, HAC, AC, GMM, LIML and CUE options}{p_end} +{p 2}{help ivreg29##s_overid:Testing overidentifying restrictions}{p_end} +{p 2}{help ivreg29##s_endog:Testing subsets of regressors and instruments for endogeneity}{p_end} +{p 2}{help ivreg29##s_relevance:Tests of under- and weak identification}{p_end} +{p 2}{help ivreg29##s_redundancy:Testing instrument redundancy}{p_end} +{p 2}{help ivreg29##s_first:First-stage regressions, identification, and weak-id-robust inference}{p_end} +{p 2}{help ivreg29##s_rf:Reduced form estimates}{p_end} +{p 2}{help ivreg29##s_partial:Partialling-out exogenous regressors}{p_end} +{p 2}{help ivreg29##s_ols:OLS and Heteroskedastic OLS (HOLS) estimation}{p_end} +{p 2}{help ivreg29##s_collin:Collinearities}{p_end} +{p 2}{help ivreg29##s_speed:Speed options: nocollin and noid}{p_end} +{p 2}{help ivreg29##s_small:Small sample corrections}{p_end} +{p 2}{help ivreg29##s_options:Options summary}{p_end} +{p 2}{help ivreg29##s_macros:Remarks and saved results}{p_end} +{p 2}{help ivreg29##s_examples:Examples}{p_end} +{p 2}{help ivreg29##s_refs:References}{p_end} +{p 2}{help ivreg29##s_acknow:Acknowledgements}{p_end} +{p 2}{help ivreg29##s_citation:Authors}{p_end} +{p 2}{help ivreg29##s_citation:Citation of ivreg29}{p_end} + +{marker s_description}{title:Description} + +{p}{cmd:ivreg29} implements a range of single-equation estimation methods +for the linear regression model: OLS, instrumental +variables (IV, also known as two-stage least squares, 2SLS), +the generalized method of moments (GMM), +limited-information maximum likelihood (LIML), and k-class estimators. +In the language of IV/GMM, {it:varlist1} are the exogenous +regressors or "included instruments", +{it:varlist_iv} are the exogenous variables excluded +from the regression or "excluded instruments", +and {it:varlist2} the endogenous regressors that are being "instrumented". + +{p}{cmd:ivreg29} will also estimate linear regression models using +robust (heteroskedastic-consistent), +autocorrelation-consistent (AC), +heteroskedastic and autocorrelation-consistent (HAC) +and cluster-robust variance estimates. + +{p}{cmd:ivreg29} provides extensions to Stata's official {cmd:ivreg} +and {cmd:newey}. +{cmd:ivreg29} supports the same command syntax as official {cmd:ivreg} +and (almost) all of its options. +The main extensions available are as follows: +two-step feasible GMM estimation ({cmd:gmm2s} option) +and continuously-updated GMM estimation ({cmd:cue} option); +LIML and k-class estimation; +automatic output of overidentification and underidentification test statistics; +C statistic test of exogeneity of subsets of instruments +({cmd:orthog()} option); +endogeneity tests of endogenous regressors +({cmd:endog()} option); +test of instrument redundancy +({cmd:redundant()} option); +kernel-based autocorrelation-consistent (AC) +and heteroskedastic and autocorrelation consistent (HAC) standard errors +and covariance estimation ({cmd:bw(}{it:#}{cmd:)} option), +with user-specified choice of kernel ({cmd:kernel()} option); +default reporting of large-sample statistics +(z and chi-squared rather than t and F); +{cmd:small} option to report small-sample statistics; +first-stage regressions reported with various tests and statistics for +identification and instrument relevance; +{cmd:ffirst} option to report only these identification statistics +and not the first-stage regression results themselves; +{cmd:nofooter} option to suppress footer of regression output. +{cmd:ivreg29} can also be used for ordinary least squares (OLS) estimation +using the same command syntax as official {cmd:regress} and {cmd:newey}. + +{marker s_robust}{dlgtab:Calculation of robust, cluster-robust, AC, HAC standard errors} + +{p}The standard errors reported by {cmd:ivreg29} can be made consistent +in the presence of a variety of violations of the assumption of i.i.d. errors: +{bind:(1) {cmd:robust}} causes {cmd:ivreg29} to report standard errors that are +robust to the presence of arbitrary heteroskedasticity; +{bind:(2) {cmd:cluster}} standard errors are robust to both +arbitrary heteroskedasticity and arbitrary intra-group correlation; +{bind:(3) {cmd:bw(}{it:#}{cmd:)}} requests AC standard errors that are +robust to arbitrary autocorrelation; +{bind:(4) {cmd:bw(}{it:#}{cmd:)}} combined with {cmd:robust} +requests HAC standard errors that are +robust to both arbitrary heteroskedasticity and arbitrary autocorrelation. + +{p}{cmd:ivreg29} allows a variety of options for kernel-based HAC and AC estimation. +The {cmd:bw(}{it:#}{cmd:)} option sets the bandwidth used in the estimation +and {cmd:kernel(}{it:string}{cmd:)} is the kernel used; +the default kernel is the Bartlett kernel, +also known in econometrics as Newey-West (see help {help newey}). When +using the Bartlett, Parzen, or Quadratic spectral kernels, the automatic +bandwidth selection procedure of Newey and West (1994) can be chosen +by specifying {cmd:bw(}{it:auto}{cmd:)}. +{cmd:ivreg29} can also be used for kernel-based estimation +with panel data, i.e., a cross-section of time series. +Before using {cmd:ivreg29} for kernel-based estimation +of time series or panel data, +the data must be {cmd:tsset}; see help {help tsset}. + +{marker s_gmm}{dlgtab:GMM estimation} + +{p}When combined with the above options, the {cmd:gmm2s} option generates +efficient estimates of the coefficients as well as consistent +estimates of the standard errors. +The {cmd:gmm2s} option implements the two-step efficient +generalized method of moments (GMM) estimator. +The efficient GMM estimator minimizes the GMM criterion function +J=N*g'*W*g, where N is the sample size, +g are the orthogonality or moment conditions +(specifying that all the exogenous variables, or instruments, +in the equation are uncorrelated with the error term) +and W is a weighting matrix. +In two-step efficient GMM, the efficient or optimal weighting matrix +is the inverse of an estimate of the covariance matrix of orthogonality conditions. +The efficiency gains of this estimator relative to the +traditional IV/2SLS estimator derive from the use of the optimal +weighting matrix, the overidentifying restrictions of the model, +and the relaxation of the i.i.d. assumption. +For an exactly-identified model, +the efficient GMM and traditional IV/2SLS estimators coincide, +and under the assumptions of conditional homoskedasticity and independence, +the efficient GMM estimator is the traditional IV/2SLS estimator. +For further details, see Hayashi (2000), pp. 206-13 and 226-27. + +{p}The {cmd:wmatrix} option allows the user to specify a weighting matrix +rather than computing the optimal weighting matrix. +Estimation with the {cmd:wmatrix} option yields a possibly inefficient GMM estimator. +{cmd:ivreg29} will use this inefficient estimator as the first-step GMM estimator +in two-step efficient GMM when combined with the {cmd:gmm2s} option; +otherwise, {cmd:ivreg29} reports the regression results +using this inefficient GMM estimator. + +{p}The {cmd:smatrix} option allows the user to directly +specify the matrix S, the covariance matrix of orthogonality conditions. +{cmd:ivreg29} will use this matrix in the calculation of the variance-covariance +matrix of the estimator, the J statistic, +and, if the {cmd:gmm2s} option is specified, +the two-step efficient GMM coefficients. +The {cmd:smatrix} can be useful for guaranteeing a positive test statistic +in user-specified "GMM-distance tests" (see {help ivreg29##s_endog:below}). +For further details, see Hayashi (2000), pp. 220-24. + +{marker s_liml}{dlgtab:LIML, k-class and GMM-CUE estimation} + +{marker liml}{p} Maximum-likelihood estimation of a single equation of this form +(endogenous RHS variables and excluded instruments) +is known as limited-information maximum likelihood or LIML. +The overidentifying restrictions test +reported after LIML estimation is the Anderson-Rubin (1950) overidentification +statistic in a homoskedastic context. +LIML, OLS and IV/2SLS are examples of k-class estimators. +LIML is a k-class estimator with k=the LIML eigenvalue lambda; +2SLS is a k-class estimator with k=1; +OLS is a k-class esimator with k=0. +Estimators based on other values of k have been proposed. +Fuller's modified LIML (available with the {cmd:fuller(}{it:#}{cmd:)} option) +sets k = lambda - alpha/(N-L), where lambda is the LIML eigenvalue, +L = number of instruments (L1 excluded and L2 included), +and the Fuller parameter alpha is a user-specified positive constant. +Nagar's bias-adjusted 2SLS estimator can be obtained with the +{cmd:kclass(}{it:#}{cmd:)} option by setting +k = 1 + (L-K)/N, where L-K = number of overidentifying restrictions, +K = number of regressors (K1 endogenous and K2=L2 exogenous) +and N = the sample size. +For a discussion of LIML and k-class estimators, +see Davidson and MacKinnon (1993, pp. 644-51). + +{p} The GMM generalization of the LIML estimator +to the case of possibly heteroskedastic +and autocorrelated disturbances +is the "continuously-updated" GMM estimator or CUE +of Hansen, Heaton and Yaron (1996). +The CUE estimator directly maximizes the GMM objective function +J=N*g'*W(b_cue)*g, where W(b_cue) is an optimal weighting matrix +that depends on the estimated coefficients b_cue. +{cmd:cue} combined with {cmd:robust}, {cmd:cluster}, and/or {cmd:bw}, +generates coefficient estimates that are efficient in the presence +of the corresponding deviations from homoskedasticity. +Specifying {cmd:cue} with no other options +is equivalent to the combination of the options {cmd:liml} and {cmd:coviv}. +The CUE estimator requires numerical optimization methods, +and the implementation here uses Stata's {cmd:ml} routine. +The starting values are either IV or two-step efficient GMM +coefficient estimates; +these can be overridden with the {cmd:cueinit} option, +which takes the matrix of starting values b as its argument. +{cmd:cueoptions} passes options to Stata's {cmd:ml}; see help {help ml}. +Estimation with the {cmd:cue} option can be slow and problematic, +and it should be used with caution. +If the user wants to evaluate the CUE objective function at +an arbitrary user-defined coefficient vector instead of having {cmd:ivreg29} +find the coefficient vector that minimizes the objective function, +the {cmd:b0(}{it:matrix}{cmd:)} option can be used. +The value of the CUE objective function at {cmd:b0} +is the Sargan or Hansen J statistic reported in the output. + +{marker s_sumopt}{dlgtab:Summary of robust, HAC, AC, GMM, LIML and CUE options} + + +{col 45}VCE option +Estimator + option{col 20}(none) {col 65}{cmd:robust}, {cmd:cluster}, {cmd:bw}, {cmd:kernel} +{hline} +(none){col 20}IV/2SLS{col 65}IV/2SLS with +{col 20}SEs consistent under homoskedasticity{col 65}robust SEs + +{cmd:liml}{col 20}LIML{col 65}LIML with +{col 20}SEs consistent under homoskedasticity{col 65}robust SEs + +{cmd:gmm2s}{col 20}IV/2SLS{col 65}Two-step GMM with +{col 20}SEs consistent under homoskedasticity{col 65}robust SEs + +{cmd:cue}{col 20}LIML{col 65}CUE GMM with +{col 20}SEs consistent under homoskedasticity{col 65}robust SEs + +{cmd:kclass}{col 20}k-class estimator{col 65}k-class estimator with +{col 20}SEs consistent under homoskedasticity{col 65}robust SEs + +{cmd:wmatrix}{col 20}Possibly inefficient GMM{col 65}Ineff GMM with +{col 20}SEs consistent under homoskedasticity{col 65}robust SEs + +{cmd:gmm2s} + {col 20}Two-step GMM{col 65}two-step GMM with +{cmd:wmatrix}{col 20}with user-specified first step{col 65}robust SEs +{col 20}SEs consistent under homoskedasticity + + +{p}With the {cmd:bw} or {cmd:bw} and {cmd:kernel} VCE options, +SEs are autocorrelation-robust (AC). +Combining the {cmd:robust} option with {cmd:bw}, SEs are heteroskedasticity- and +autocorrelation-robust (HAC). + +{p}For further details, see Hayashi (2000), pp. 206-13 and 226-27 +(on GMM estimation), Wooldridge (2002), p. 193 (on cluster-robust GMM), +and Hayashi (2000), pp. 406-10 or Cushing and McGarvey (1999) +(on kernel-based covariance estimation). + +{marker s_overid}{marker overidtests}{dlgtab:Testing overidentifying restrictions} + +{p}The Sargan-Hansen test is a test of overidentifying restrictions. +The joint null hypothesis is that the instruments are valid +instruments, i.e., uncorrelated with the error term, +and that the excluded instruments are correctly excluded from the estimated equation. +Under the null, the test statistic is distributed as chi-squared +in the number of (L-K) overidentifying restrictions. +A rejection casts doubt on the validity of the instruments. +For the efficient GMM estimator, the test statistic is +Hansen's J statistic, the minimized value of the GMM criterion function. +For the 2SLS estimator, the test statistic is Sargan's statistic, +typically calculated as N*R-squared from a regression of the IV residuals +on the full set of instruments. +Under the assumption of conditional homoskedasticity, +Hansen's J statistic becomes Sargan's statistic. +The J statistic is consistent in the presence of heteroskedasticity +and (for HAC-consistent estimation) autocorrelation; +Sargan's statistic is consistent if the disturbance is homoskedastic +and (for AC-consistent estimation) if it is also autocorrelated. +With {cmd:robust}, {cmd:bw} and/or {cmd:cluster}, +Hansen's J statistic is reported. +In the latter case the statistic allows observations +to be correlated within groups. +For further discussion see e.g. Hayashi (2000, pp. 227-8, 407, 417). + +{p}The Sargan statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg29} by the command {cmd:overid}. +The features of {cmd:ivreg29} that are unavailable in {cmd:overid} +are the J statistic and the C statistic; +the {cmd:overid} options unavailable in {cmd:ivreg29} +are various small-sample and pseudo-F versions of Sargan's statistic +and its close relative, Basmann's statistic. +See help {help overid} (if installed). + +{marker s_endog}{dlgtab:Testing subsets of regressors and instruments for endogeneity} + +{marker ctest}{p}The C statistic +(also known as a "GMM distance" +or "difference-in-Sargan" statistic) +implemented using the {cmd:orthog} option, +allows a test of a subset of the orthogonality conditions, i.e., +it is a test of the exogeneity of one or more instruments. +It is defined as +the difference of the Sargan-Hansen statistic +of the equation with the smaller set of instruments +(valid under both the null and alternative hypotheses) +and the equation with the full set of instruments, +i.e., including the instruments whose validity is suspect. +Under the null hypothesis that +both the smaller set of instruments +and the additional, suspect instruments are valid, +the C statistic is distributed as chi-squared +in the number of instruments tested. +Note that failure to reject the null hypothesis +requires that the full set of orthogonality conditions be valid; +the C statistic and the Sargan-Hansen test statistics +for the equations with both the smaller and full set of instruments +should all be small. +The instruments tested may be either excluded or included exogenous variables. +If excluded exogenous variables are being tested, +the equation that does not use these orthogonality conditions +omits the suspect instruments from the excluded instruments. +If included exogenous variables are being tested, +the equation that does not use these orthogonality conditions +treats the suspect instruments as included endogenous variables. +To guarantee that the C statistic is non-negative in finite samples, +the estimated covariance matrix of the full set orthogonality conditions +is used to calculate both Sargan-Hansen statistics +(in the case of simple IV/2SLS, this amounts to using the MSE +from the unrestricted equation to calculate both Sargan statistics). +If estimation is by LIML, the C statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For further discussion, see Hayashi (2000), pp. 218-22 and pp. 232-34. + +{marker endogtest}{p}Endogeneity tests of one or more endogenous regressors +can implemented using the {cmd:endog} option. +Under the null hypothesis that the specified endogenous regressors +can actually be treated as exogenous, the test statistic is distributed +as chi-squared with degrees of freedom equal to the number of regressors tested. +The endogeneity test implemented by {cmd:ivreg29}, is, like the C statistic, +defined as the difference of two Sargan-Hansen statistics: +one for the equation with the smaller set of instruments, +where the suspect regressor(s) are treated as endogenous, +and one for the equation with the larger set of instruments, +where the suspect regressors are treated as exogenous. +Also like the C statistic, the estimated covariance matrix used +guarantees a non-negative test statistic. +Under conditional homoskedasticity, +this endogeneity test statistic is numerically equal to +a Hausman test statistic; see Hayashi (2000, pp. 233-34). +The endogeneity test statistic can also be calculated after +{cmd:ivreg} or {cmd:ivreg29} by the command {cmd:ivendog}. +Unlike the Durbin-Wu-Hausman tests reported by {cmd:ivendog}, +the {cmd:endog} option of {cmd:ivreg29} can report test statistics +that are robust to various violations of conditional homoskedasticity; +the {cmd:ivendog} option unavailable in {cmd:ivreg29} +is the Wu-Hausman F-test version of the endogeneity test. +See help {help ivendog} (if installed). + +{marker s_relevance}{dlgtab:Tests of under- and weak identification} + +{marker idtest}{p}{cmd:ivreg29} automatically reports tests of +both underidentification and weak identification. +The underidentification test is an LM test of whether the equation is identified, +i.e., that the excluded instruments are "relevant", +meaning correlated with the endogenous regressors. +The test is essentially the test of the rank of a matrix: +under the null hypothesis that the equation is underidentified, +the matrix of reduced form coefficients on the L1 excluded instruments +has rank=K1-1 where K1=number of endogenous regressors. +Under the null, +the statistic is distributed as chi-squared +with degrees of freedom=(L1-K1+1). +A rejection of the null indicates that the matrix is full column rank, +i.e., the model is identified. +When errors are assumed to be i.i.d., +{cmd:ivreg29} automatically reports an LM version of +the Anderson (1951) canonical correlations test. +Denoting the minimum eigenvalue of the canonical correlations as CCEV, +the smallest canonical correlation between the K1 endogenous regressors +and the L1 excluded instruments +(after partialling out the K2=L2 exogenous regressors) +is sqrt(CCEV), +and the Anderson LM test statistic is N*CCEV, +i.e., N times the square of the smallest canonical correlation. +With the {cmd:first} or {cmd:ffirst} options, +{cmd:ivreg29} also reports the closely-related +Cragg-Donald (1993) Wald test statistic. +Again assuming i.i.d. errors, +and denoting the minimum eigenvalue of the Cragg-Donald statistic as CDEV, +CDEV=CCEV/(1-CCEV), +and the Cragg-Donald Wald statistic is N*CDEV. +Like the Anderson LM statistic, the Cragg-Donald Wald statistic +is distributed as chi-squred with (L1-K1+1) degrees of freedom. +Note that a result of rejection of the null +should be treated with caution, +because weak instrument problems may still be present. +See Hall et al. (1996) for a discussion of this test, +and below for discussion of testing for the presence of weak instruments. + +{p}When the i.i.d. assumption is dropped +and {cmd:ivreg29} reports heteroskedastic, AC, HAC +or cluster robust statistics, +the Anderson LM and Cragg-Donald Wald statistics are no longer valid. +In these cases, {cmd:ivreg29} reports the LM and Wald versions +of the Kleibergen-Paap (2006) rk statistic, +also distributed as chi-squared with (L1-K1+1) degrees of freedom. +The rk statistic can be seen as a generalization of these tests +to the case of non-i.i.d. errors; +see Kleibergen and Paap (2006) for discussion, +and Kleibergen and Schaffer (2007) for a Stata implementation, {cmd:ranktest}. +{cmd:ivreg29} requires {cmd:ranktest} to be installed, +and will prompt the user to install it if necessary. +If {cmd:ivreg29} is invoked with the {cmd:robust} option, +the rk underidentification test statistics will be heteroskedastic-robust, +and similarly with {cmd:bw} and {cmd:cluster}. + +{marker widtest}{p}"Weak identification" arises when the excluded instruments are correlated +with the endogeous regressors, but only weakly. +Estimators can perform poorly when instruments are weak, +and different estimators are more robust to weak instruments (e.g., LIML) +than others (e.g., IV); +see, e.g., Stock and Yogo (2002, 2005) for further discussion. +When errors are assumed to be i.i.d., +the test for weak identification automatically reported +by {cmd:ivreg29} is an F version of the Cragg-Donald Wald statistic, (N-L)/L1*CDEV, +where L is the number of instruments and L1 is the number of excluded instruments. +Stock and Yogo (2005) have compiled critical values +for the Cragg-Donald F statistic for +several different estimators (IV, LIML, Fuller-LIML), +several different definitions of "perform poorly" (based on bias and test size), +and a range of configurations (up to 100 excluded instruments +and up to 2 or 3 endogenous regressors, +depending on the estimator). +{cmd:ivreg29} will report the Stock-Yogo critical values +if these are available; +missing values mean that the critical values +haven't been tabulated or aren't applicable. +See Stock and Yogo (2002, 2005) for details. + +{p}When the i.i.d. assumption is dropped +and {cmd:ivreg29} is invoked with the {cmd:robust}, {cmd:bw} or {cmd:cluster} options, +the Cragg-Donald-based weak instruments test is no longer valid. +{cmd:ivreg29} instead reports a correspondly-robust +Kleibergen-Paap Wald rk F statistic. +The degrees of freedom adjustment for the rk statistic is (N-L)/L1, +as with the Cragg-Donald F statistic, +except in the cluster-robust case, +when the adjustment is ((N-L)/L1)*((N-1)/N)*(N_clust-1)/N_clust), +following the standard Stata small-sample adjustment for cluster-robust. +The critical values reported by {cmd:ivreg29} for the Kleibergen-Paap statistic +are the Stock-Yogo critical values for the Cragg-Donald i.i.d. case. +The critical values reported with 2-step GMM +are the Stock-Yogo IV critical values, +and the critical values reported with CUE +are the LIML critical values. + +{marker s_redundancy}{dlgtab:Testing instrument redundancy} + +{marker redtest}{p}The {cmd:redundant} option allows a test of +whether a subset of excluded instruments is "redundant". +Excluded instruments are redundant if the asymptotic efficiency +of the estimation is not improved by using them. +Breusch et al. (1999) show that the condition for the redundancy of a set of instruments +can be stated in several equivalent ways: +e.g., in the reduced form regressions of the endogenous regressors +on the full set of instruments, +the redundant instruments have statistically insignificant coefficients; +or the partial correlations between the endogenous regressors +and the instruments in question are zero. +{cmd:ivreg29} uses a formulation based on testing the rank +of the matrix cross-product between the endogenous regressors +and the possibly-redundant instruments after both have +all other instruments partialled-out; +{cmd:ranktest} is used to test whether the matrix has zero rank. +The test statistic is an LM test +and numerically equivalent to a regression-based LM test. +Under the null that the specified instruments are redundant, +the statistic is distributed as chi-squared +with degrees of freedom=(#endogenous regressors)*(#instruments tested). +Rejection of the null indicates that +the instruments are not redundant. +When the i.i.d. assumption is dropped +and {cmd:ivreg29} reports heteroskedastic, AC, HAC +or cluster-robust statistics, +the redundancy test statistic is similarly robust. +See Baum et al. (2007) for further discussion. + +{p}Calculation and reporting of all underidentification +and weak identification statistics +can be supressed with the {cmd:noid} option. + +{marker s_first}{dlgtab:First-stage regressions, identification, and weak-id-robust inference} + +{marker apstats}{p}The {cmd:first} and {cmd:ffirst} options report +various first-stage results and identification statistics. +Tests of both underidentification and weak identification are reported +for each endogenous regressor separately, +using the method described by Angrist and Pischke (2009), pp. 217-18 +(see also the note on their "Mostly Harmless Econometrics" +{browse "http://www.mostlyharmlesseconometrics.com/2009/10/multivariate-first-stage-f-not/" :blog}. + +{p}The Angrist-Pischke (AP) first-stage chi-squared and F statistics +are tests of underidentification and weak identification, respectively, +of individual endogenous regressors. +They are constructed by "partialling-out" linear projections of the +remaining endogenous regressors. +The AP chi-squared Wald statistic is distributed as chi2(L1-K1+1)) +under the null that the particular endogenous regressor +in question is unidentified. +In the special case of a single endogenous regressor, +the AP statistic reported is identical to underidentification statistics reported +in the {cmd:ffirst} output, +namely the Cragg-Donald Wald statistic (if i.i.d.) +or the Kleibergen-Paap rk Wald statistic (if robust, cluster-robust, AC or HAC +statistics have been requested); +see {help ivreg29##idtest:above}. +Note the difference in the null hypotheses if there are two or more endogenous regressors: +the AP test will fail to reject if a particular endogenous regressor is unidentified, +whereas the Anderson/Cragg-Donald/Kleibergen-Paap tests of underidentification +will fail to reject if {it:any} of the endogenous regressors is unidentified. + +{p}The AP first-stage F statistic is the F form of the same test statistic. +It can be used as a diagnostic for whether a particular endogenous regressor +is "weakly identified" (see {help ivreg29##widtest:above}). +Critical values for the AP first-stage F as a test of weak identification are not available, +but the test statistic can be compared to the Stock-Yogo (2002, 2005) critical +values for the Cragg-Donald F statistic with K1=1. + +{p}The first-stage results are always reported with small-sample statistics, +to be consistent with the recommended use of the first-stage F-test as a diagnostic. +If the estimated equation is reported with robust standard errors, +the first-stage F-test is also robust. + +{p}A full set of first-stage statistics for each of the K1 endogenous regressors +is saved in the matrix e(first). +These include (a) the AP F and chi-squared statistics; (b) the "partial R-squared" +(squared partial correlation) corresponding to the AP statistics; +(c) Shea's (1997) partial R-squared measure (closely related to the AP statistic, +but not amenable to formal testing); (d) the simple F and partial R-squared +statistics for each of the first-stage equations, +with no adjustments if there is more than one endogenous regressor. +In the special case of a single endogenous regressor, +these F statistics and partial R-squareds are identical. + +{marker wirobust}{p}The first-stage output also includes +two statistics that provide weak-instrument robust inference +for testing the significance of the endogenous regressors in the structural equation being estimated. +The first statistic is the Anderson-Rubin (1949) test +(not to be confused with the Anderson-Rubin overidentification test for LIML estimation; +see {help ivreg29##s_liml:above}). +The second is the closely related Stock-Wright (2000) S statistic. +The null hypothesis tested in both cases is that +the coefficients of the endogenous regressors in the structural equation are jointly equal to zero, +and, in addition, that the overidentifying restrictions are valid. +Both tests are robust to the presence of weak instruments. +The tests are equivalent to estimating the reduced form of the equation +(with the full set of instruments as regressors) +and testing that the coefficients of the excluded instruments are jointly equal to zero. +In the form reported by {cmd:ivreg29},the Anderson-Rubin statistic is a Wald test +and the Stock-Wright S statistic is a GMM-distance test. +Both statistics are distributed as chi-squared with L1 degrees of freedom, +where L1=number of excluded instruments. +The traditional F-stat version of the Anderson-Rubin test is also reported. +See Stock and Watson (2000), Dufour (2003), Chernozhukov and Hansen (2005) and Kleibergen (2007) +for further discussion. +For related alternative test statistics that are also robust to weak instruments, +see {help condivreg} and {help rivtest}, +and the corresponding discussions +in Moreira and Poi (2003) and Mikusheva and Poi (2006), +and in Finlay and Magnusson (2009), respectively. + +{p}The {cmd:savefirst} option requests that the individual first-stage regressions +be saved for later access using the {cmd:estimates} command. +If saved, they can also be displayed using {cmd:first} or {cmd:ffirst} and the {cmd:ivreg29} replay syntax. +The regressions are saved with the prefix "_ivreg29_", +unless the user specifies an alternative prefix with the +{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} option. + +{marker s_rf}{dlgtab:Reduced form estimates} + +{p}The {cmd:rf} option requests that the reduced form estimation of the equation be displayed. +The {cmd:saverf} option requests that the reduced form estimation is saved +for later access using the {cmd:estimates} command. +If saved, it can also be displayed using the {cmd:rf} and the {cmd:ivreg29} replay syntax. +The regression is saved with the prefix "_ivreg29_", +unless the user specifies an alternative prefix with the +{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} option. + +{marker s_partial}{dlgtab:Partialling-out exogenous regressors} + +{marker partial}{p}The {cmd:partial(}{it:varlist}{cmd:)} option requests that +the exogenous regressors in {it:varlist} are "partialled out" +from all the other variables (other regressors and excluded instruments) in the estimation. +If the equation includes a constant, it is also automatically partialled out as well. +The coefficients corresponding to the regressors in {it:varlist} are not calculated. +By the Frisch-Waugh-Lovell (FWL) theorem, in IV, +two-step GMM and LIML estimation the coefficients for the remaining regressors +are the same as those that would be obtained if the variables were not partialled out. +(NB: this does not hold for CUE or GMM iterated more than two steps.) +The {cmd:partial} option is most useful when using {cmd:cluster} +and #clusters < (#exogenous regressors + #excluded instruments). +In these circumstances, +the covariance matrix of orthogonality conditions S is not of full rank, +and efficient GMM and overidentification tests are infeasible +since the optimal weighting matrix W = {bind:S^-1} +cannot be calculated. +The problem can be addressed by using {cmd:partial} +to partial out enough exogenous regressors for S to have full rank. +A similar problem arises when the regressors include a variable that is a singleton dummy, +i.e., a variable with one 1 and N-1 zeros or vice versa, +if a robust covariance matrix is requested. +The singleton dummy causes the robust covariance matrix estimator +to be less than full rank. +In this case, partialling-out the variable with the singleton dummy solves the problem. +Specifying {cmd:partial(_cons)} will cause just the constant to be partialled-out, +i.e., the equation will be estimated in deviations-from-means form. +When {cmd:ivreg29} is invoked with {cmd:partial}, +it reports test statistics with the same small-sample adjustments +as if estimating without {cmd:partial}. +Note that after estimation using the {cmd:partial} option, +the post-estimation {cmd:predict} can be used only to generate residuals, +and that in the current implementation, +{cmd:partial} is not compatible with endogenous variables or instruments (included or excluded) +that use time-series operators. + +{marker s_ols}{dlgtab:OLS and Heteroskedastic OLS (HOLS) estimation} + +{p}{cmd:ivreg29} also allows straightforward OLS estimation +by using the same syntax as {cmd:regress}, i.e., +{it:ivreg29 depvar varlist1}. +This can be useful if the user wishes to use one of the +features of {cmd:ivreg29} in OLS regression, e.g., AC or +HAC standard errors. + +{p}If the list of endogenous variables {it:varlist2} is empty +but the list of excluded instruments {it:varlist_iv} is not, +and the option {cmd:gmm2s} is specified, +{cmd:ivreg29} calculates Cragg's "heteroskedastic OLS" (HOLS) estimator, +an estimator that is more efficient than OLS +in the presence of heteroskedasticity of unknown form +(see Davidson and MacKinnon (1993), pp. 599-600). +If the option {cmd:bw(}{it:#}{cmd:)} is specified, +the HOLS estimator is efficient in the presence of +arbitrary autocorrelation; +if both {cmd:bw(}{it:#}{cmd:)} and {cmd:robust} are specified +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and autocorrelation; +and if {cmd:cluster(}{it:varname}{cmd:)} is used, +the HOLS estimator is efficient in the presence of +arbitrary heteroskedasticity and within-group correlation. +The efficiency gains of HOLS derive from the orthogonality conditions +of the excluded instruments listed in {it:varlist_iv}. +If no endogenous variables are specified and {cmd:gmm2s} is not specified, +{cmd:ivreg29} reports standard OLS coefficients. +The Sargan-Hansen statistic reported +when the list of endogenous variables {it:varlist2} is empty +is a Lagrange multiplier (LM) test +of the hypothesis that the excluded instruments {it:varlist_iv} are +correctly excluded from the restricted model. +If the estimation is LIML, the LM statistic reported +is now based on the Sargan-Hansen test statistics from +the restricted and unrestricted equation. +For more on LM tests, see e.g. Wooldridge (2002), pp. 58-60. +Note that because the approach of the HOLS estimator +has applications beyond heteroskedastic disturbances, +and to avoid confusion concerning the robustness of the estimates, +the estimators presented above as "HOLS" +are described in the output of {cmd:ivreg29} +as "2-Step GMM", "CUE", etc., as appropriate. + +{marker s_collin}{dlgtab:Collinearities} + +{p}{cmd:ivreg29} checks the lists of included instruments, +excluded instruments, and endogenous regressors +for collinearities and duplicates. If an endogenous regressor is +collinear with the instruments, it is reclassified as exogenous. If any +endogenous regressors are collinear with each other, some are dropped. +If there are any collinearities among the instruments, some are dropped. +In Stata 9+, excluded instruments are dropped before included instruments. +If any variables are dropped, a list of their names are saved +in the macros {cmd:e(collin)} and/or {cmd:e(dups)}. +Lists of the included and excluded instruments +and the endogenous regressors with collinear variables and duplicates removed +are also saved in macros with "1" appended +to the corresponding macro names. + +{p}Collinearity checks can be supressed with the {cmd:nocollin} option. + +{marker s_speed}{dlgtab:Speed options: nocollin and noid} + +{p}Two options are available for speeding execution. +{cmd:nocollin} specifies that the collinearity checks not be performed. +{cmd:noid} suspends calculation and reporting of +the underidentification and weak identification statistics +in the main output. + +{marker s_small}{dlgtab:Small sample corrections} + +{p}Mean square error = sqrt(RSS/(N-K)) if {cmd:small}, = sqrt(RSS/N) otherwise. + +{p}If {cmd:robust} is chosen, the finite sample adjustment +(see {hi:[R] regress}) to the robust variance-covariance matrix +qc = N/(N-K) if {cmd:small}, qc = 1 otherwise. + +{p}If {cmd:cluster} is chosen, the finite sample adjustment +qc = (N-1)/(N-K)*M/(M-1) if {cmd:small}, where M=number of clusters, +qc = 1 otherwise. + +{p}The Sargan and C (difference-in-Sargan) statistics use +error variance = RSS/N, i.e., there is no small sample correction. + +{p}A full discussion of these computations and related topics +can be found in Baum, Schaffer, and Stillman (2003) and Baum, Schaffer and +Stillman (2007). Some features of the program postdate the former article and are described in the latter paper. + + +{marker s_options}{title:Options summary} + +{p 0 4}{cmd:gmm2s} requests the two-step efficient GMM estimator. +If no endogenous variables are specified, the estimator is Cragg's HOLS estimator. + +{p 0 4}{cmd:liml} requests the limited-information maximum likelihood estimator. + +{p 0 4}{cmd:fuller(}{it:#}{cmd:)} specifies that Fuller's modified LIML estimator +is calculated using the user-supplied Fuller parameter alpha, +a non-negative number. +Alpha=1 has been suggested as a good choice. + +{p 0 4}{cmd:kclass(}{it:#}{cmd:)} specifies that a general k-class estimator is calculated +using the user-supplied #, a non-negative number. + +{p 0 4}{cmd:coviv} specifies that the matrix used to calculate the +covariance matrix for the LIML or k-class estimator +is based on the 2SLS matrix, i.e., with k=1. +In this case the covariance matrix will differ from that calculated for the 2SLS +estimator only because the estimate of the error variance will differ. +The default is for the covariance matrix to be based on the LIML or k-class matrix. + +{p 0 4}{cmd:cue} requests the GMM continuously-updated estimator (CUE). + +{p 0 4}{cmd:cueinit(}{it:matrix}{cmd:)} specifies that the starting values +for the CUE estimator use those in a user-supplied matrix b. +If omitted, the default behavior is to use starting values +from IV or 2-step efficient GMM estimation. + +{p 0 4}{cmd:cueopt(}{it:string}{cmd:)} passes user-specified options +to Stata's {cmd:ml} routine; see help {help ml}. + +{p 0 4}{cmd:b0(}{it:matrix}{cmd:)} specifies that the J statistic +(i.e., the value of the CUE objective function) +should be calculated for an arbitrary coefficient vector {cmd:b0}. +That vector must be provided as a matrix with appropriate row and column names. +Under- and weak-identification statistics are not reported +in the output. + +{p 0 4}{cmd:robust} specifies that the Eicker/Huber/White/sandwich estimator of +variance is to be used in place of the traditional calculation. {cmd:robust} +combined with {cmd:cluster()} further allows residuals which are not +independent within cluster (although they must be independent between +clusters). See {hi:[U] Obtaining robust variance estimates}. + +{p 0 4}{cmd:cluster}{cmd:(}{it:varname}{cmd:)} specifies that the observations +are independent across groups (clusters) but not necessarily independent +within groups. {it:varname} specifies to which group each observation +belongs; e.g., {cmd:cluster(personid)} in data with repeated observations on +individuals. {cmd:cluster()} can be used with {help pweight}s to produce +estimates for unstratified cluster-sampled data, but see help {help svyreg} +for a command especially designed for survey data. Specifying {cmd:cluster()} +implies {cmd:robust}. + +{p 0 4}{cmd:bw(}{it:#}{cmd:)} impements AC or HAC covariance estimation +with bandwidth equal to {it:#}, where {it:#} is an integer greater than zero. +Specifying {cmd:robust} implements HAC covariance estimation; +omitting it implements AC covariance estimation. +If the Bartlett (default), Parzen or Quadratic Spectral kernels are selected, +the value {cmd:auto} may be given (rather than an integer) +to invoke Newey and West's (1994) automatic bandwidth selection procedure. + +{p 0 4}{cmd:kernel(}{it:string)}{cmd:)} specifies the kernel +to be used for AC and HAC covariance estimation; +the default kernel is Bartlett (also known in econometrics +as Newey-West). Other kernels available are (abbreviations in parentheses): +Truncated (tru); Parzen (par); Tukey-Hanning (thann); Tukey-Hamming (thamm); +Daniell (dan); Tent (ten); and Quadratic-Spectral (qua or qs). + +{p 4 4}Note: in the cases of the Bartlett, Parzen, +and Tukey-Hanning/Hamming kernels, the number of lags used +to construct the kernel estimate equals the bandwidth minus one. +Stata's official {cmd:newey} implements +HAC standard errors based on the Bartlett kernel, +and requires the user to specify +the maximum number of lags used and not the bandwidth; +see help {help newey}. +If these kernels are used with {cmd:bw(1)}, +no lags are used and {cmd:ivreg29} will report the usual +Eicker/Huber/White/sandwich variance estimates. + +{p 0 4}{cmd:wmatrix(}{it:matrix}{cmd:)} specifies a user-supplied weighting matrix +in place of the computed optimal weighting matrix. +The matrix must be positive definite. +The user-supplied matrix must have the same row and column names +as the instrument variables in the regression model (or a subset thereof). + +{p 0 4}{cmd:smatrix(}{it:matrix}{cmd:)} specifies a user-supplied covariance matrix +of the orthogonality conditions to be used in calculating the covariance matrix of the estimator. +The matrix must be positive definite. +The user-supplied matrix must have the same row and column names +as the instrument variables in the regression model (or a subset thereof). + +{p 0 4}{cmd:orthog}{cmd:(}{it:varlist_ex}{cmd:)} requests that a C-statistic +be calculated as a test of the exogeneity of the instruments in {it:varlist_ex}. +These may be either included or excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instruments must still be identified. + +{p 0 4}{cmd:endog}{cmd:(}{it:varlist_en}{cmd:)} requests that a C-statistic +be calculated as a test of the endogeneity +of the endogenous regressors in {it:varlist_en}. + +{p 0 4}{cmd:redundant}{cmd:(}{it:varlist_ex}{cmd:)} requests an LM test +of the redundancy of the instruments in {it:varlist_ex}. +These must be excluded exogenous variables. +The standard order condition for identification applies: +the restricted equation that does not use these variables +as exogenous instrumenst must still be identified. + +{p 0 4}{cmd:small} requests that small-sample statistics (F and t-statistics) +be reported instead of large-sample statistics (chi-squared and z-statistics). +Large-sample statistics are the default. +The exception is the statistic for the significance of the regression, +which is always reported as a small-sample F statistic. + +{p 0 4}{cmd:noconstant} suppresses the constant term (intercept) in the +regression. If {cmd:noconstant} is specified, the constant term is excluded +from both the final regression and the first-stage regression. To include a +constant in the first-stage when {cmd:noconstant} is specified, explicitly +include a variable containing all 1's in {it:varlist_iv}. + +{p 0 4}{cmd:first} requests that the full first-stage regression results be displayed, +along with the associated diagnostic and identification statistics. + +{p 0 4}{cmd:ffirst} requests the first-stage diagnostic and identification statistics. +The results are saved in various e() macros. + +{p 0 4}{cmd:nocollin} suppresses the checks for collinearities +and duplicate variables. + +{p 0 4}{cmd:noid} suppresses the calculation and reporting +of underidentification and weak identification statistics. + +{p 0 4}{cmd:savefirst} requests that the first-stage regressions results +are saved for later access using the {cmd:estimates} command. +The names under which the first-stage regressions are saved +are the names of the endogenous regressors prefixed by "_ivreg29_". +If these use Stata's time-series operators, +the "." is replaced by a "_". +The maximum number of first-stage estimation results that can be saved +depends on how many other estimation results the user has already saved +and on the maximum supported by Stata (300 for Stata 9.1). + +{p 0 4}{cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the first-stage regression results be saved using the user-specified prefix +instead of the default "_ivreg29_". + +{p 0 4}{cmd:rf} requests that the reduced-form estimation of the equation +be displayed. + +{p 0 4}{cmd:saverf} requests that the reduced-form estimation of the equation +be saved for later access using the {cmd:estimates} command. +The estimation is stored under the name of the dependent variable +prefixed by "_ivreg29_". +If this uses Stata's time-series operators, +the "." is replaced by a "_". + +{p 0 4}{cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} requests that +the reduced-form estimation be saved using the user-specified prefix +instead of the default "_ivreg29_". + +{p 0 4}{cmd:partial(}{it:varlist}{cmd:)} requests that +the exogenous regressors in {it:varlist} be partialled out +from the other variables in the equation. +If the equation includes a constant, +it is automatically partialled out as well. +The coefficients corresponding to the regressors in {it:varlist} +are not calculated. + +{p 0 4}{cmd:level(}{it:#}{cmd:)} specifies the confidence level, in percent, +for confidence intervals of the coefficients; see help {help level}. + +{p 0 4}{cmd:noheader}, {cmd:eform()}, {cmd:depname()} and {cmd:plus} +are for ado-file writers; see {hi:[R] ivreg} and {hi:[R] regress}. + +{p 0 4}{cmd:nofooter} suppresses the display of the footer containing +identification and overidentification statistics, +exogeneity and endogeneity tests, +lists of endogenous variables and instruments, etc. + +{p 0 4}{cmd:version} causes {cmd:ivreg29} to display its current version number +and to leave it in the macro {cmd:e(version)}. +It cannot be used with any other options. +and will clear any existing {cmd:e()} saved results. + +{marker s_macros}{title:Remarks and saved results} + +{p}{cmd:ivreg29} does not report an ANOVA table. +Instead, it reports the RSS and both the centered and uncentered TSS. +It also reports both the centered and uncentered R-squared. +NB: the TSS and R-squared reported by official {cmd:ivreg} is centered +if a constant is included in the regression, and uncentered otherwise. + +{p}{cmd:ivreg29} saves the following results in {cmd:e()}: + +Scalars +{col 4}{cmd:e(N)}{col 18}Number of observations +{col 4}{cmd:e(yy)}{col 18}Total sum of squares (SS), uncentered (y'y) +{col 4}{cmd:e(yyc)}{col 18}Total SS, centered (y'y - ((1'y)^2)/n) +{col 4}{cmd:e(rss)}{col 18}Residual SS +{col 4}{cmd:e(mss)}{col 18}Model SS =yyc-rss if the eqn has a constant, =yy-rss otherwise +{col 4}{cmd:e(df_m)}{col 18}Model degrees of freedom +{col 4}{cmd:e(df_r)}{col 18}Residual degrees of freedom +{col 4}{cmd:e(r2u)}{col 18}Uncentered R-squared, 1-rss/yy +{col 4}{cmd:e(r2c)}{col 18}Centered R-squared, 1-rss/yyc +{col 4}{cmd:e(r2)}{col 18}Centered R-squared if the eqn has a constant, uncentered otherwise +{col 4}{cmd:e(r2_a)}{col 18}Adjusted R-squared +{col 4}{cmd:e(ll)}{col 18}Log likelihood +{col 4}{cmd:e(rankxx)}{col 18}Rank of the matrix of observations on rhs variables=K +{col 4}{cmd:e(rankzz)}{col 18}Rank of the matrix of observations on instruments=L +{col 4}{cmd:e(rankV)}{col 18}Rank of covariance matrix V of coefficients +{col 4}{cmd:e(rankS)}{col 18}Rank of covariance matrix S of orthogonality conditions +{col 4}{cmd:e(rmse)}{col 18}root mean square error=sqrt(rss/(N-K)) if -small-, =sqrt(rss/N) if not +{col 4}{cmd:e(F)}{col 18}F statistic +{col 4}{cmd:e(N_clust)}{col 18}Number of clusters +{col 4}{cmd:e(bw)}{col 18}Bandwidth +{col 4}{cmd:e(lambda)}{col 18}LIML eigenvalue +{col 4}{cmd:e(kclass)}{col 18}k in k-class estimation +{col 4}{cmd:e(fuller)}{col 18}Fuller parameter alpha +{col 4}{cmd:e(sargan)}{col 18}Sargan statistic +{col 4}{cmd:e(sarganp)}{col 18}p-value of Sargan statistic +{col 4}{cmd:e(sargandf)}{col 18}dof of Sargan statistic = degree of overidentification = L-K +{col 4}{cmd:e(j)}{col 18}Hansen J statistic +{col 4}{cmd:e(jp)}{col 18}p-value of Hansen J statistic +{col 4}{cmd:e(jdf)}{col 18}dof of Hansen J statistic = degree of overidentification = L-K +{col 4}{cmd:e(arubin)}{col 18}Anderson-Rubin overidentification LR statistic N*ln(lambda) +{col 4}{cmd:e(arubinp)}{col 18}p-value of Anderson-Rubin overidentification LR statistic +{col 4}{cmd:e(arubin_lin)}{col 18}Anderson-Rubin linearized overidentification statistic N*(lambda-1) +{col 4}{cmd:e(arubin_linp)}{col 18}p-value of Anderson-Rubin linearized overidentification statistic +{col 4}{cmd:e(arubindf)}{col 18}dof of A-R overid statistic = degree of overidentification = L-K +{col 4}{cmd:e(idstat)}{col 18}LM test statistic for underidentification (Anderson or Kleibergen-Paap) +{col 4}{cmd:e(idp)}{col 18}p-value of underidentification LM statistic +{col 4}{cmd:e(iddf)}{col 18}dof of underidentification LM statistic +{col 4}{cmd:e(widstat)}{col 18}F statistic for weak identification (Cragg-Donald or Kleibergen-Paap) +{col 4}{cmd:e(arf)}{col 18}Anderson-Rubin F-test of significance of endogenous regressors +{col 4}{cmd:e(arfp)}{col 18}p-value of Anderson-Rubin F-test of endogenous regressors +{col 4}{cmd:e(archi2)}{col 18}Anderson-Rubin chi-sq test of significance of endogenous regressors +{col 4}{cmd:e(archi2p)}{col 18}p-value of Anderson-Rubin chi-sq test of endogenous regressors +{col 4}{cmd:e(ardf)}{col 18}degrees of freedom of Anderson-Rubin tests of endogenous regressors +{col 4}{cmd:e(ardf_r)}{col 18}denominator degrees of freedom of AR F-test of endogenous regressors +{col 4}{cmd:e(redstat)}{col 18}LM statistic for instrument redundancy +{col 4}{cmd:e(redp)}{col 18}p-value of LM statistic for instrument redundancy +{col 4}{cmd:e(reddf)}{col 18}dof of LM statistic for instrument redundancy +{col 4}{cmd:e(cstat)}{col 18}C-statistic +{col 4}{cmd:e(cstatp)}{col 18}p-value of C-statistic +{col 4}{cmd:e(cstatdf)}{col 18}Degrees of freedom of C-statistic +{col 4}{cmd:e(cons)}{col 18}1 when equation has a Stata-supplied constant; 0 otherwise +{col 4}{cmd:e(partialcons)}{col 18}as above but prior to partialling-out (see {cmd:e(partial)}) +{col 4}{cmd:e(partial_ct)}{col 18}Number of partialled-out variables (see {cmd:e(partial)}) + +Macros +{col 4}{cmd:e(cmd)}{col 18}ivreg29 +{col 4}{cmd:e(cmdline)}{col 18}Command line invoking ivreg29 +{col 4}{cmd:e(version)}{col 18}Version number of ivreg29 +{col 4}{cmd:e(model)}{col 18}ols, iv, gmm, liml, or kclass +{col 4}{cmd:e(depvar)}{col 18}Name of dependent variable +{col 4}{cmd:e(instd)}{col 18}Instrumented (RHS endogenous) variables +{col 4}{cmd:e(insts)}{col 18}Instruments +{col 4}{cmd:e(inexog)}{col 18}Included instruments (regressors) +{col 4}{cmd:e(exexog)}{col 18}Excluded instruments +{col 4}{cmd:e(collin)}{col 18}Variables dropped because of collinearities +{col 4}{cmd:e(dups)}{col 18}Duplicate variables +{col 4}{cmd:e(ecollin)}{col 18}Endogenous variables reclassified as exogenous because of +{col 20}collinearities with instruments +{col 4}{cmd:e(clist)}{col 18}Instruments tested for orthogonality +{col 4}{cmd:e(redlist)}{col 18}Instruments tested for redundancy +{col 4}{cmd:e(partial)}{col 18}Partialled-out exogenous regressors +{col 4}{cmd:e(small)}{col 18}small +{col 4}{cmd:e(wtype)}{col 18}weight type +{col 4}{cmd:e(wexp)}{col 18}weight expression +{col 4}{cmd:e(clustvar)}{col 18}Name of cluster variable +{col 4}{cmd:e(vcetype)}{col 18}Covariance estimation method +{col 4}{cmd:e(kernel)}{col 18}Kernel +{col 4}{cmd:e(tvar)}{col 18}Time variable +{col 4}{cmd:e(ivar)}{col 18}Panel variable +{col 4}{cmd:e(firsteqs)}{col 18}Names of stored first-stage equations +{col 4}{cmd:e(rfeq)}{col 18}Name of stored reduced-form equation +{col 4}{cmd:e(predict)}{col 18}Program used to implement predict + +Matrices +{col 4}{cmd:e(b)}{col 18}Coefficient vector +{col 4}{cmd:e(V)}{col 18}Variance-covariance matrix of the estimators +{col 4}{cmd:e(S)}{col 18}Covariance matrix of orthogonality conditions +{col 4}{cmd:e(W)}{col 18}GMM weighting matrix (=inverse of S if efficient GMM estimator) +{col 4}{cmd:e(first)}{col 18}First-stage regression results +{col 4}{cmd:e(ccev)}{col 18}Eigenvalues corresponding to the Anderson canonical correlations test +{col 4}{cmd:e(cdev)}{col 18}Eigenvalues corresponding to the Cragg-Donald test + +Functions +{col 4}{cmd:e(sample)}{col 18}Marks estimation sample + + + +{marker s_examples}{title:Examples} + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta" : . use http://fmwww.bc.edu/ec-p/data/hayashi/griliches76.dta }{p_end} +{p 8 12}(Wages of Very Young Men, Zvi Griliches, J.Pol.Ec. 1976) + +{p 8 12}{stata "xi i.year" : . xi i.year} + +{col 0}(Instrumental variables. Examples follow Hayashi 2000, p. 255.) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt)} + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), small ffirst" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), small ffirst} + +{col 0}(Testing for the presence of heteroskedasticity in IV/GMM estimation) + +{p 8 12}{stata "ivhettest, fitlev" : . ivhettest, fitlev} + +{col 0}(Two-step GMM efficient in the presence of arbitrary heteroskedasticity) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust} + +{p 0}(GMM with user-specified first-step weighting matrix or matrix of orthogonality conditions) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), robust" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), robust} + +{p 8 12}{stata "predict double uhat if e(sample), resid" : . predict double uhat if e(sample), resid} + +{p 8 12}{stata "mat accum S = `e(insts)' [iw=uhat^2]" : . mat accum S = `e(insts)' [iw=uhat^2]} + +{p 8 12}{stata "mat S = 1/`e(N)' * S" : . mat S = 1/`e(N)' * S} + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust smatrix(S)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust smatrix(S)} + +{p 8 12}{stata "mat W = invsym(S)" : . mat W = invsym(S)} + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust wmatrix(W)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s robust wmatrix(W)} + +{p 0}(Equivalence of J statistic and Wald tests of included regressors, irrespective of instrument choice (Ahn, 1997)) + +{p 8 12}{stata "ivreg29 lw (iq=med kww age), gmm2s" : . ivreg29 lw (iq=med kww age), gmm2s} + +{p 8 12}{stata "mat S0 = e(S)" : . mat S0 = e(S)} + +{p 8 12}{stata "qui ivreg29 lw (iq=kww) med age, gmm2s smatrix(S0)" : . qui ivreg29 lw (iq=kww) med age, gmm2s smatrix(S0)} + +{p 8 12}{stata "test med age" : . test med age} + +{p 8 12}{stata "qui ivreg29 lw (iq=med) kww age, gmm2s smatrix(S0)" : . qui ivreg29 lw (iq=med) kww age, gmm2s smatrix(S0)} + +{p 8 12}{stata "test kww age" : . test kww age} + +{p 8 12}{stata "qui ivreg29 lw (iq=age) med kww, gmm2s smatrix(S0)" : . qui ivreg29 lw (iq=age) med kww, gmm2s smatrix(S0)} + +{p 8 12}{stata "test med kww" : . test med kww} + +{p 0}(Continuously-updated GMM (CUE) efficient in the presence of arbitrary heteroskedasticity. NB: may require 50+ iterations.) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust} + +{p 0}(Continuously-updated GMM (CUE) with ml options) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust cueopt(technique(dfp))" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), cue robust cueopt(technique(dfp))} + +{col 0}(Sargan-Basmann tests of overidentifying restrictions for IV estimation) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt)} + +{p 8 12}{stata "overid, all" : . overid, all} + +{col 0}(Tests of exogeneity and endogeneity) + +{col 0}(Test the exogeneity of one regressor) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(s)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(s)} + +{col 0}(Test the exogeneity of two excluded instruments) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(age mrt)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age mrt), gmm2s orthog(age mrt)} + +{col 0}(Frisch-Waugh-Lovell (FWL): equivalence of estimations with and without partialling-out) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns _I* (iq=kww age), cluster(year)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age), cluster(year)} + +{p 8 12}{stata "ivreg29 lw s expr tenure rns _I* (iq=kww age), cluster(year) partial(_I*)" : . ivreg29 lw s expr tenure rns smsa _I* (iq=med kww age), cluster(year) partial(_I*)} + +{col 0}({cmd:partial()}: efficient GMM with #clusters<#instruments feasible after partialling-out) + +{p 8 12}{stata "ivreg29 lw s expr tenure rns _I* (iq=kww age), cluster(year) partial(_I*) gmm2s" : . ivreg29 lw s expr tenure rns smsa (iq=med kww age), cluster(year) partial(_I*) gmm2s} + +{col 0}(Examples following Wooldridge 2002, pp.59, 61) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta" : . use http://fmwww.bc.edu/ec-p/data/wooldridge/mroz.dta } + +{col 0}(Equivalence of DWH endogeneity test when regressor is endogenous...) + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6)" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6)} + +{p 8 12}{stata "ivendog educ" :. ivendog educ} + +{col 0}(... endogeneity test using the {cmd:endog} option) + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), endog(educ)" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), endog(educ)} + +{col 0}(...and C-test of exogeneity when regressor is exogenous, using the {cmd:orthog} option) + +{p 8 12}{stata "ivreg29 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)" : . ivreg29 lwage exper expersq educ (=age kidslt6 kidsge6), orthog(educ)} + +{col 0}(Heteroskedastic Ordinary Least Squares, HOLS) + +{p 8 12}{stata "ivreg29 lwage exper expersq educ (=age kidslt6 kidsge6), gmm2s" : . ivreg29 lwage exper expersq educ (=age kidslt6 kidsge6), gmm2s} + +{col 0}(Equivalence of Cragg-Donald Wald F statistic and F-test from first-stage regression +{col 0}in special case of single endogenous regressor. Also illustrates {cmd:savefirst} option.) + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), savefirst" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), savefirst} + +{p 8 12}{stata "di e(widstat)" : . di e(widstat)} + +{p 8 12}{stata "estimates restore _ivreg29_educ" : . estimates restore _ivreg29_educ} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Equivalence of Kleibergen-Paap robust rk Wald F statistic and F-test from first-stage +{col 0}regression in special case of single endogenous regressor.) + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust savefirst" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust savefirst} + +{p 8 12}{stata "di e(widstat)" : . di e(widstat)} + +{p 8 12}{stata "estimates restore _ivreg29_educ" : . estimates restore _ivreg29_educ} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Equivalence of Kleibergen-Paap robust rk LM statistic for identification and LM test +{col 0}of joint significance of excluded instruments in first-stage regression in special +{col 0}case of single endogenous regressor. Also illustrates use of {cmd:ivreg29} to perform an +{col 0}LM test in OLS estimation.) + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust} + +{p 8 12}{stata "di e(idstat)" : . di e(idstat)} + +{p 8 12}{stata "ivreg29 educ exper expersq (=age kidslt6 kidsge6) if e(sample), robust" : . ivreg29 educ exper expersq (=age kidslt6 kidsge6) if e(sample), robust} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(Equivalence of an LM test of an excluded instrument for redundancy and an LM test of +{col 0}significance from first-stage regression in special case of single endogenous regressor.) + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust redundant(age)" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust redundant(age)} + +{p 8 12}{stata "di e(redstat)" : . di e(redstat)} + +{p 8 12}{stata "ivreg29 educ exper expersq kidslt6 kidsge6 (=age) if e(sample), robust" : . ivreg29 educ exper expersq kidslt6 kidsge6 (=age) if e(sample), robust} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(Weak-instrument robust inference: Anderson-Rubin Wald F and chi-sq and +{col 0}Stock-Wright S statistics. Also illusrates use of {cmd:saverf} option.) + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust ffirst saverf" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust ffirst saverf} + +{p 8 12}{stata "di e(arf)" : . di e(arf)} + +{p 8 12}{stata "di e(archi2)" : . di e(archi2)} + +{p 8 12}{stata "di e(sstat)" : . di e(sstat)} + +{col 0}(Obtaining the Anderson-Rubin Wald F statistic from the reduced-form estimation) + +{p 8 12}{stata "estimates restore _ivreg29_lwage" : . estimates restore _ivreg29_lwage} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(F)" : . di r(F)} + +{col 0}(Obtaining the Anderson-Rubin Wald chi-sq statistic from the reduced-form estimation. +{col 0}Use {cmd:ivreg29} without {cmd:small} to obtain large-sample test statistic.) + +{p 8 12}{stata "ivreg29 lwage exper expersq age kidslt6 kidsge6, robust" : . ivreg29 lwage exper expersq age kidslt6 kidsge6, robust} + +{p 8 12}{stata "test age kidslt6 kidsge6" : . test age kidslt6 kidsge6} + +{p 8 12}{stata "di r(chi2)" : . di r(chi2)} + +{col 0}(Obtaining the Stock-Wright S statistic as the value of the GMM CUE objective function. +{col 0}Also illustrates use of {cmd:b0} option. Coefficients on included exogenous regressors +{col 0}are OLS coefficients, which is equivalent to partialling them out before obtaining +{col 0}the value of the CUE objective function.) + +{p 8 12}{stata "mat b = 0" : . mat b = 0} + +{p 8 12}{stata "mat colnames b = educ" : . mat colnames b = educ} + +{p 8 12}{stata "qui ivreg29 lwage exper expersq" : . qui ivreg29 lwage exper expersq} + +{p 8 12}{stata "mat b = b, e(b)" : . mat b = b, e(b)} + +{p 8 12}{stata "ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust b0(b)" : . ivreg29 lwage exper expersq (educ=age kidslt6 kidsge6), robust b0(b)} + +{p 8 12}{stata "di e(j)" : . di e(j)} + +{col 0}(LIML and k-class estimation using Klein data) + +{col 9}{stata "use http://fmwww.bc.edu/repec/bocode/k/kleinI" :. use http://fmwww.bc.edu/repec/bocode/k/kleinI} + +{col 0}(LIML estimates of Klein's consumption function) + +{p 8 12}{stata "ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml" :. ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml} + +{col 0}(Equivalence of LIML and CUE+homoskedasticity+independence) + +{p 8 12}{stata "ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml coviv" :. ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), liml coviv} + +{p 8 12}{stata "ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), cue" :. ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), cue} + +{col 0}(Fuller's modified LIML with alpha=1) + +{p 8 12}{stata "ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), fuller(1)" :. ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), fuller(1)} + +{col 0}(k-class estimation with Nagar's bias-adjusted IV, k=1+(L-K)/N=1+4/21=1.19) + +{p 8 12}{stata "ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), kclass(1.19)" :. ivreg29 consump L.profit (profit wages = govt taxes trend wagegovt capital1 L.demand), kclass(1.19)} + +{col 0}(Kernel-based covariance estimation using time-series data) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta" :. use http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta} + +{p 8 12}{stata "tsset year, yearly" :. tsset year, yearly} + +{col 0}(Autocorrelation-consistent (AC) inference in an OLS Regression) + +{p 8 12}{stata "ivreg29 cinf unem, bw(3)" :. ivreg29 cinf unem, bw(3)} + +{p 8 12}{stata "ivreg29 cinf unem, kernel(qs) bw(auto)" :. ivreg29 cinf unem, kernel(qs) bw(auto)} + +{col 0}(Heteroskedastic and autocorrelation-consistent (HAC) inference in an OLS regression) + +{p 8 12}{stata "ivreg29 cinf unem, bw(3) kernel(bartlett) robust small" :. ivreg29 cinf unem, bw(3) kernel(bartlett) robust small} + +{p 8 12}{stata "newey cinf unem, lag(2)" :. newey cinf unem, lag(2)} + +{col 0}(AC and HAC in IV and GMM estimation) + +{p 8 12}{stata "ivreg29 cinf (unem = l(1/3).unem), bw(3)" :. ivreg29 cinf (unem = l(1/3).unem), bw(3)} + +{p 8 12}{stata "ivreg29 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(thann)" :. ivreg29 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(thann)} + +{p 8 12}{stata "ivreg29 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(qs) robust orthog(l1.unem)" :. ivreg29 cinf (unem = l(1/3).unem), bw(3) gmm2s kernel(qs) robust orthog(l1.unem)} + +{col 0}(Examples using Large N, Small T Panel Data) + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta" : . use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta }{p_end} + +{p 8 12}{stata "tsset id year" :. tsset id year} + +{col 0}(Autocorrelation-consistent inference in an IV regression) + +{p 8 12}{stata "ivreg29 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(1) kernel(tru)": . ivreg29 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(1) kernel(tru)} + +{col 0}(Two-step effic. GMM in the presence of arbitrary heteroskedasticity and autocorrelation) + +{p 8 12}{stata "ivreg29 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(2) gmm2s kernel(tru) robust": . ivreg29 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), bw(2) gmm2s kernel(tru) robust} + +{col 0}(Two-step effic. GMM in the presence of arbitrary heterosked. and intra-group correlation) + +{p 8 12}{stata "ivreg29 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm2s cluster(id)": . ivreg29 n (w k ys = d.w d.k d.ys d2.w d2.k d2.ys), gmm2s cluster(id)} + + +{marker s_refs}{title:References} + +{p 0 4}Ahn, Seung C. 1997. Orthogonality tests in linear models. Oxford Bulletin +of Economics and Statistics, Vol. 59, pp. 183-186. + +{p 0 4}Anderson, T.W. 1951. Estimating linear restrictions on regression coefficients +for multivariate normal distributions. Annals of Mathematical Statistics, Vol. 22, pp. 327-51. + +{p 0 4}Anderson, T. W. and H. Rubin. 1949. Estimation of the parameters of a single equation +in a complete system of stochastic equations. Annals of Mathematical Statistics, Vol. 20, +pp. 46-63. + +{p 0 4}Anderson, T. W. and H. Rubin. 1950. The asymptotic properties of estimates of the parameters of a single +equation in a complete system of stochastic equations. Annals of Mathematical Statistics, +Vol. 21, pp. 570-82. + +{p 0 4}Angrist, J.D. and Pischke, J.-S. 2009. Mostly Harmless Ecnometrics: An Empiricist's Companion. +Princeton: Princeton University Press. + +{p 0 4}Baum, C.F., Schaffer, M.E., and Stillman, S. 2003. Instrumental Variables and GMM: +Estimation and Testing. The Stata Journal, Vol. 3, No. 1, pp. 1-31. +{browse "http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html":http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html}. +Working paper version: Boston College Department of Economics Working Paper No. 545. +{browse "http://ideas.repec.org/p/boc/bocoec/545.html":http://ideas.repec.org/p/boc/bocoec/545.html}. + +{p 0 4}Baum, C. F., Schaffer, M.E., and Stillman, S. 2007. Enhanced routines for instrumental variables/GMM estimation and testing. +The Stata Journal, Vol. 7, No. 4, pp. 465-506. +{browse "http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html":http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html}. +Working paper version: Boston College Department of Economics Working Paper No. 667. +{browse "http://ideas.repec.org/p/boc/bocoec/667.html":http://ideas.repec.org/p/boc/bocoec/667.html}. + +{p 0 4}Breusch, T., Qian, H., Schmidt, P. and Wyhowski, D. 1999. +Redundancy of moment conditions. +Journal of Econometrics, Vol. 9, pp. 89-111. + +{p 0 4}Chernozhukov, V. and Hansen, C. 2005. The Reduced Form: +A Simple Approach to Inference with Weak Instruments. +Working paper, University of Chicago, Graduate School of Business. + +{p 0 4}Cragg, J.G. and Donald, S.G. 1993. Testing Identfiability and Specification in +Instrumental Variables Models. Econometric Theory, Vol. 9, pp. 222-240. + +{p 0 4}Cushing, M.J. and McGarvey, M.G. 1999. Covariance Matrix Estimation. +In L. Matyas (ed.), Generalized Methods of Moments Estimation. +Cambridge: Cambridge University Press. + +{p 0 4}Davidson, R. and MacKinnon, J. 1993. Estimation and Inference in Econometrics. +1993. New York: Oxford University Press. + +{p 0 4}Dufour, J.M. 2003. Identification, Weak Instruments and Statistical Inference +in Econometrics. Canadian Journal of Economics, Vol. 36, No. 4, pp. 767-808. +Working paper version: CIRANO Working Paper 2003s-49. +{browse "http://www.cirano.qc.ca/pdf/publication/2003s-49.pdf":http://www.cirano.qc.ca/pdf/publication/2003s-49.pdf}. + +{p 0 4}Finlay, K., and Magnusson, L.M. 2009. Implementing Weak-Instrument Robust Tests +for a General Class of Instrumental-Variables Models. + +{p 0 4}Hall, A.R., Rudebusch, G.D. and Wilcox, D.W. 1996. Judging Instrument Relevance in +Instrumental Variables Estimation. International Economic Review, Vol. 37, No. 2, pp. 283-298. +The Stata Journal, Vol. 9, No. 3, pp. 398-421. +{browse "http://www.stata-journal.com/article.html?article=st0171":http://www.stata-journal.com/article.html?article=st0171}. + +{p 0 4}Hayashi, F. Econometrics. 2000. Princeton: Princeton University Press. + +{p 0 4}Hansen, L.P., Heaton, J., and Yaron, A. 1996. Finite Sample Properties +of Some Alternative GMM Estimators. Journal of Business and Economic Statistics, Vol. 14, No. 3, pp. 262-280. + +{p 0 4}Kleibergen, F. 2007. Generalizing Weak Instrument Robust Statistics Towards Multiple Parameters, Unrestricted Covariance Matrices and Identification Statistics. Journal of Econometrics, forthcoming. + +{p 0 4}Kleibergen, F. and Paap, R. 2006. Generalized Reduced Rank Tests Using the Singular Value Decomposition. +Journal of Econometrics, Vol. 133, pp. 97-126. + +{p 0 4}Kleibergen, F. and Schaffer, M.E. 2007. ranktest: Stata module for testing the rank +of a matrix using the Kleibergen-Paap rk statistic. +{browse "http://ideas.repec.org/c/boc/bocode/s456865.html":http://ideas.repec.org/c/boc/bocode/s456865.html}. + +{p 0 4}Mikusheva, A. and Poi, B.P. 2006. +Tests and Confidence Sets with Correct Size When Instruments are Potentially Weak. The Stata Journal, Vol. 6, No. 3, pp. 335-347. + +{p 0 4}Moreira, M.J. and Poi, B.P. 2003. Implementing Tests with the Correct Size in the Simultaneous Equations Model. The Stata Journal, Vol. 3, No. 1, pp. 57-70. + +{p 0 4}Newey, W.K. and K.D. West, 1994. Automatic Lag Selection in Covariance Matrix Estimation. Review of Economic Studies, Vol. 61, No. 4, pp. 631-653. + +{p 0 4}Shea, J. 1997. Instrument Relevance in Multivariate Linear Models: +A Simple Measure. +Review of Economics and Statistics, Vol. 49, No. 2, pp. 348-352. + +{p 0 4}Stock, J.H. and Wright, J.H. 2000. GMM with Weak Identification. +Econometrica, Vol. 68, No. 5, September, pp. 1055-1096. + +{p 0 4}Stock, J.H. and Yogo, M. 2005. Testing for Weak Instruments in Linear IV Regression. In D.W.K. Andrews and J.H. Stock, eds. Identification and Inference for Econometric Models: Essays in Honor of Thomas Rothenberg. Cambridge: Cambridge University Press, 2005, pp. 80–108. +Working paper version: NBER Technical Working Paper 284. +{browse "http://www.nber.org/papers/T0284":http://www.nber.org/papers/T0284}. + +{p 0 4}Wooldridge, J.M. 2002. Econometric Analysis of Cross Section and Panel Data. Cambridge, MA: MIT Press. + + +{marker s_acknow}{title:Acknowledgements} + +{p}We would like to thanks various colleagues who helped us along the way, including +David Drukker, +Frank Kleibergen, +Austin Nichols, +Brian Poi, +Vince Wiggins, +and, not least, the users of {cmd:ivreg29} +who have provided suggestions, +spotted bugs, +and helped test the package. +We are also grateful to Jim Stock and Moto Yogo for permission to reproduce +their critical values for the Cragg-Donald statistic. + +{marker s_citation}{title:Citation of ivreg29} + +{p}{cmd:ivreg29} is not an official Stata command. It is a free contribution +to the research community, like a paper. Please cite it as such: {p_end} + +{phang}Baum, C.F., Schaffer, M.E., Stillman, S. 2010. +ivreg29: Stata module for extended instrumental variables/2SLS, GMM and AC/HAC, LIML and k-class regression. +{browse "http://ideas.repec.org/c/boc/bocode/s425401.html":http://ideas.repec.org/c/boc/bocode/s425401.html}{p_end} + +{title:Authors} + + Christopher F Baum, Boston College, USA + baum@bc.edu + + Mark E Schaffer, Heriot-Watt University, UK + m.e.schaffer@hw.ac.uk + + Steven Stillman, Motu Economic and Public Policy Research + stillman@motu.org.nz + + +{title:Also see} + +{p 1 14}Articles:{it:Stata Journal}, volume 3, number 1: {browse "http://ideas.repec.org/a/tsj/stataj/v3y2003i1p1-31.html":st0030}{p_end} +{p 10 14}{it:Stata Journal}, volume 7, number 4: {browse "http://ideas.repec.org/a/tsj/stataj/v7y2007i4p465-506.html":st0030_3}{p_end} + +{p 1 14}Manual: {hi:[U] 23 Estimation and post-estimation commands}{p_end} +{p 10 14}{hi:[U] 29 Overview of model estimation in Stata}{p_end} +{p 10 14}{hi:[R] ivreg}{p_end} + +{p 1 10}On-line: help for {help ivregress}, {help ivreg}, {help newey}; +{help overid}, {help ivendog}, {help ivhettest}, {help ivreset}, +{help xtivreg2}, {help xtoverid}, {help ranktest}, +{help condivreg} (if installed); +{help rivtest} (if installed); +{help est}, {help postest}; +{help regress}{p_end} diff --git a/data/ado/i/ivreg29_cue.ado b/data/ado/i/ivreg29_cue.ado new file mode 100644 index 0000000..a7908a2 --- /dev/null +++ b/data/ado/i/ivreg29_cue.ado @@ -0,0 +1,26 @@ +! 1.0.6 13Nov2009 +* 1.0.1 cfb updated to v8.2 +* 1.0.2 mes fixed col and row names mismatch +* 1.0.3 added noid option to supress unnecessary identification stats +* 1.0.4 added local `ivreg2_cmd'. ref only to e(j); e(sargan) no longer needed. +* 1.0.5 added nocollin option to supress unnecessary checks for collinearity +* 1.0.6 slight rewrite of ivreg2_cue to ivreg29_cue + +program define ivreg29_cue + version 8.2 + args todo b lnf + local ivreg2_cmd "ivreg29" + tempname b1 J +* Need to make col and rownames match + mat `b1'=`b' +* Remove equation number from col names + local vn : colfullnames `b1' + local vn : subinstr local vn "eq1" "", all + mat colnames `b1' = `vn' +* Standard row name + mat rownames `b1' = y1 + qui `ivreg2_cmd' $IV_lhs $IV_inexog ($IV_endog=$IV_exexog) $IV_wt if $ML_samp==1, b0(`b1') $IV_opt noid nocollin + scalar `J'=e(j) + scalar `lnf' = -`J' +end + diff --git a/data/ado/i/ivreg29_p.ado b/data/ado/i/ivreg29_p.ado new file mode 100644 index 0000000..b5b9678 --- /dev/null +++ b/data/ado/i/ivreg29_p.ado @@ -0,0 +1,100 @@ +*! ivreg29_p 1.0.8 30Jan2011 +*! author mes +* 1.0.1: 25apr2002 original version +* 1.0.2: 28jun2005 version 8.2 +* 1.0.3: 1Aug2006 complete rewrite plus fwl option +* 1.0.4: 26Jan2007 eliminated double reporting of #MVs +* 1.0.5: 2Feb2007 small fix to allow fwl of just _cons +* 1.0.6: 19Aug2007 replacement of "fwl" with "partial" in conjuction with new ivreg2 syntax +* 1.0.7: 13Nov2009 slight rewrite of ivreg2_p to ivreg29_p +* 1.0.8: 30Jan2011 re-introduced stdp option (hadn't been supported after fwl/partial) +* and added labelling of created residual variable + +program define ivreg29_p + version 8.2 + syntax newvarname [if] [in] , [XB Residuals stdp] + marksample touse, novarlist + + local type "`xb'`residuals'`stdp'" + + if "`type'"=="" { + local type "xb" +di in gr "(option xb assumed; fitted values)" + } + +* e(partialcons) now always exists and is 1 or 0 + if e(partial_ct) { +* partial partial-out block + if "`type'" == "residuals" { + + tempvar esample + tempname ivres + gen byte `esample' = e(sample) + +* Need to strip out time series operators + local lhs "`e(depvar)'" + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + + local rhs : colnames(e(b)) + tsrevar `rhs', substitute + local rhs_t "`r(varlist)'" + + if "`e(partial1)'" != "" { + local partial "`e(partial1)'" + } + else { + local partial "`e(partial)'" + } + tsrevar `partial', substitute + local partial_t "`r(varlist)'" + + if ~e(partialcons) { + local noconstant "noconstant" + } + + local allvars "`lhs_t' `rhs_t'" +* Partial-out block. Uses estimatation sample to get coeffs, markout sample for predict + _estimates hold `ivres', restore + foreach var of local allvars { + tempname `var'_partial + qui regress `var' `partial' if `esample', `noconstant' + qui predict double ``var'_partial' if `touse', resid + local allvars_partial "`allvars_partial' ``var'_partial'" + } + _estimates unhold `ivres' + + tokenize `allvars_partial' + local lhs_partial "`1'" + mac shift + local rhs_partial "`*'" + + tempname b + mat `b'=e(b) + mat colnames `b' = `rhs_partial' +* Use forcezero? + tempvar xb + mat score double `xb' = `b' if `touse' + gen `typlist' `varlist' = `lhs_partial' - `xb' + label var `varlist' "Residuals" + } + else { +di in red "Option `type' not supported with -partial- option" + error 198 + } + } + else if "`type'" == "residuals" { + tempname lhs lhs_t xb + local lhs "`e(depvar)'" + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + qui _predict `typlist' `xb' if `touse' + gen `typlist' `varlist'=`lhs_t'-`xb' + label var `varlist' "Residuals" + } +* Must be either xb or stdp + else { + _predict `typlist' `varlist' if `touse', `type' + } + +end diff --git a/data/ado/i/ivreg2_p.ado b/data/ado/i/ivreg2_p.ado new file mode 100644 index 0000000..8114cf9 --- /dev/null +++ b/data/ado/i/ivreg2_p.ado @@ -0,0 +1,148 @@ +*! ivreg2_p 1.0.10 30jul2023 +*! author mes +* 1.0.1: 25apr2002 original version +* 1.0.2: 28jun2005 version 8.2 +* 1.0.3: 1Aug2006 complete rewrite plus fwl option +* 1.0.4: 26Jan2007 eliminated double reporting of #MVs +* 1.0.5: 2Feb2007 small fix to allow fwl of just _cons +* 1.0.6: 19Aug2007 replacement of "fwl" with "partial" in conjuction with new ivreg2 syntax +* 1.0.7: 4Feb2010 version check update +* 1.0.8: 30Jan2011 re-introduced stdp option (hadn't been supported after fwl/partial) +* and added labelling of created residual variable +* 1.0.9: 25Jan2015 Rewrite to accommodate new ivreg2 with legacy support; +* passes control to matching ivreg2x_p predict program. +* 1.0.10:30Jul2023 Change version of ivreg211_p to 11.2, tsrevar->fvrevar to handle FVs (cfb0) + +program define ivreg2_p + +* Minimum of version 8 required (earliest ivreg2 is ivreg28) + version 8 + +* If estimation used current ivreg2, pass control to ivreg211 subroutine below. +* If estimation used legacy ivreg2x, pass control to earlier version. + + if "`e(ivreg2cmd)'"=="ivreg2" { + ivreg211_p `0' + } + else if "`e(ivreg2cmd)'"=="ivreg210" { + ivreg210_p `0' + } + else if "`e(ivreg2cmd)'"=="ivreg29" { + ivreg29_p `0' + } + else if "`e(ivreg2cmd)'"=="ivreg28" { + ivreg28_p `0' + } + else { +di as err "Error - ivreg2 estimation missing e(ivreg2cmd) macro" + exit 601 + } + +end + + +* Main/current predict program: upgrade to v11.2 for FV handling +program define ivreg211_p +// version 8.2 + version 11.2 + syntax newvarname [if] [in] , [XB Residuals stdp] + marksample touse, novarlist + +* Check ivreg2 version is compatible. +* fwl becomes partial starting in ivreg2 02.2.07 + local vernum "`e(version)'" + if ("`vernum'" < "03.0.00") | ("`vernum'" > "09.9.99") { +di as err "Error: incompatible versions of ivreg2 and ivreg2_p." +di as err "Currently installed version of ivreg2 is `vernum'" +di as err "To update, from within Stata type " _c +di in smcl "{stata ssc install ivreg2, replace :ssc install ivreg2, replace}" + exit 601 + } + + local type "`xb'`residuals'`stdp'" + + if "`type'"=="" { + local type "xb" +di in gr "(option xb assumed; fitted values)" + } + +* e(partialcons) now always exists and is 1 or 0 + if e(partial_ct) { +* partial partial-out block + if "`type'" == "residuals" { + + tempvar esample + tempname ivres + gen byte `esample' = e(sample) + +* Need to strip out time series operators *** and FVs *** + local lhs "`e(depvar)'" +// tsrevar `lhs', substitute + fvrevar `lhs', substitute + local lhs_t "`r(varlist)'" + + local rhs : colnames(e(b)) +// tsrevar `rhs', substitute + fvrevar `rhs', substitute + local rhs_t "`r(varlist)'" + + if "`e(partial1)'" != "" { + local partial "`e(partial1)'" + } + else { + local partial "`e(partial)'" + } +// tsrevar `partial', substitute + fvrevar `partial', substitute + local partial_t "`r(varlist)'" + + if ~e(partialcons) { + local noconstant "noconstant" + } + + local allvars "`lhs_t' `rhs_t'" +* Partial-out block. Uses estimatation sample to get coeffs, markout sample for predict + _estimates hold `ivres', restore + foreach var of local allvars { + tempname `var'_partial + qui regress `var' `partial' if `esample', `noconstant' + qui predict double ``var'_partial' if `touse', resid + local allvars_partial "`allvars_partial' ``var'_partial'" + } + _estimates unhold `ivres' + + tokenize `allvars_partial' + local lhs_partial "`1'" + mac shift + local rhs_partial "`*'" + + tempname b + mat `b'=e(b) + mat colnames `b' = `rhs_partial' +* Use forcezero? + tempvar xb + mat score double `xb' = `b' if `touse' + gen `typlist' `varlist' = `lhs_partial' - `xb' + label var `varlist' "Residuals" + } + else { +di in red "Option `type' not supported with -partial- option" + error 198 + } + } + else if "`type'" == "residuals" { + tempname lhs lhs_t xb + local lhs "`e(depvar)'" +// tsrevar `lhs', substitute + fvrevar `lhs', substitute + local lhs_t "`r(varlist)'" + qui _predict `typlist' `xb' if `touse' + gen `typlist' `varlist'=`lhs_t'-`xb' + label var `varlist' "Residuals" + } +* Must be either xb or stdp + else { + _predict `typlist' `varlist' if `touse', `type' + } + +end diff --git a/data/ado/l/leebounds.ado b/data/ado/l/leebounds.ado new file mode 100644 index 0000000..852875b --- /dev/null +++ b/data/ado/l/leebounds.ado @@ -0,0 +1,961 @@ +******************************************************************************************************************************** +** LEE (2009) TREATMENT EFFECT BOUNDS ****************************************************************************************** +******************************************************************************************************************************** + +*! version 1.5 2013-07-17 ht +*! author Harald Tauchmann +*! Lee (2009) Treatment Effect Bounds + +capture program drop leebounds +program leebounds, eclass +version 11.1 +if !replay() { + quietly { + local cmd "leebounds" + local cmdline "`cmd' `*'" + syntax varlist(min=2 max=2) [if] [in] [pweight fweight iweight/], [SELect(varname)] [TIGht(varlist)] [CIEffect] [VCE(string asis)] [LEVel(real 10)] + ** TOKENIZE VARLIST ** + tokenize `varlist' + local yy "`1'" + local tr "`2'" + ** MANAGE MORE ** + local moreold `c(more)' + set more off + ** MANGE LEVEL ** + local clevel = `c(level)' + if `level' >= 50 & `level' < 100 { + local level = round(`level',0.01) + set level `level' + } + else { + set level `clevel' + local level = `clevel' + } + ** MANAGE IF ** + if "`if'" == "" { + local if2 = "if" + } + else { + local if2 = "`if' & " + } + ** TEMPORARY NAMES ** + tempvar __tempsel __tempt __cesamp __esamp __zz __wwsc __wwusc __tempid + tempname __selcat __res __resV __bb __bsq __mis __Vtest __csize __mcsize __micsize __macsize + tempfile __bsfile + ** CHECK and GENERATE SELECTION INDICATOR ** + if "`select'" != "" { + if "`weight'" == "" { + sum `select' `if2' `yy'<. + } + else { + sum `select' `if2' `yy'<. & `exp' >=0 & `exp' <. [iw=`exp'] + } + local cssel = r(sum) + tab `select' `if' `in', matrow(`__selcat') + if r(r) == 1 { + display as error "no variation in selection indicator `select'" + exit 109 + } + if r(r) > 2 | `__selcat'[1,1] !=0 | `__selcat'[2,1] !=1 | `cssel' == 0 { + display as error "selection indicator `select' incorrectly specified" + exit 109 + } + gen `__tempsel' = `select' `in' `if2' (`select' == 1 | `select' == 0) + local ss "`__tempsel'" + } + else { + gen `__tempsel' = `yy' <. `in' `if' + local ss "`__tempsel'" + if "`weight'" == "" { + sum `__tempsel' `in' `if' + } + else { + sum `__tempsel' `in' `if2' `exp' >=0 & `exp' <. [iw=`exp'] + } + if r(mean) == 1 { + display as error "all observations selected" + exit 109 + } + if r(mean) == 0 { + display as error "no observations selected" + exit 2000 + } + } + ** GENERATE DUMMY WEIGHTS ** + if "`exp'" == "" { + local exp "1" + local dw "pw" + } + else { + local dw "`weight'" + } + ** CHECK TREATMENT INDICATOR ** + egen `__tempt' = group(`tr') `in' `if' + replace `__tempt' = `__tempt'-1 + tab `__tempt' + if r(r) != 2 { + display as error "treatment indicator `tr' not binary" + exit 149 + } + ** CHECK SPECIFICATION OF OPTION VCE ** + if "`vce'" == "" { + local reps = 0 + } + else { + tokenize `"`vce'"', parse(",") + if "`4'" != "" { + di as error "option vce() incorrectly specified" + exit 198 + } + local 1 : list retokenize 1 + local 2 : list retokenize 2 + local 3 : list retokenize 3 + if "`1'" == "analytic" | "`1'" == "analyti" | "`1'" == "analyt" | "`1'" == "analy" | "`1'" == "anal" | "`1'" == "ana" { + local reps = 0 + } + else { + if "`1'" == "bootstrap" | "`1'" == "bootstra" | "`1'" == "bootstr" | "`1'" == "bootst" | "`1'" == "boots" | "`1'" == "boot" { + if "`2'" == "" & "`3'" == "" { + local reps = 50 + local dots "dots" + } + else { + if "`2'" == "," & ("`3'" == "dots" | "`3'" == "nodots" ) { + local reps = 50 + local dots "dots" + if "`3'" == "nodots" { + local dots "" + } + } + else { + if "`2'" == "," & "`3'" != "" { + local dots "dots" + local cdot "nodots" + local cdot2 : list cdot in 3 + if `cdot2' == 1 { + local dots "" + local 3 : list 3 - cdot + local 3 : list retokenize 3 + } + local cdot "dots" + local cdot2 : list cdot in 3 + if `cdot2' == 1 { + local dots "dots" + local 3 : list 3 - cdot + local 3 : list retokenize 3 + } + tokenize `"`3'"', parse("(") + if ("`2'" == "(") & ("`1'" == "reps" | "`1'" == "rep" |"`1'" == "re" |"`1'" == "r") { + tokenize `"`3'"', parse(")") + local rr = real("`1'") + if `rr' <. & `rr' > 1 & `rr'-floor(`rr') == 0 { + local reps = `1' + } + else { + di as error "suboption reps() incorrectly specified; must be integer > 1" + exit 126 + } + if "`3'" != "" { + di as error "only suboptions reps() and nodots allowed for vce(bootstrap)" + exit 198 + } + } + else { + di as error "only suboption reps() and nodots allowed for vce(bootstrap)" + exit 198 + } + } + else { + di as error "suboption reps() incorrectly specified" + exit 198 + } + } + } + } + else { + di as error "option vce() incorrectly specified; only vce(analytic) and vce(bootstrap) allowed" + exit 198 + } + } + } + ** SELECT RELEVANT SAMPLE FOR TIGHTENED BOUNDS ** + if "`tight'" != "" { + gen `__cesamp' = 1 `in' `if' + if "`select'" == "" { + gen `__esamp' = (`yy' !=. | (`yy' ==. & `ss' == 0)) & (`__tempt' == 1 | `__tempt' == 0) & (`ss' == 1 | `ss' == 0) & `__cesamp' == 1 + } + else { + gen `__esamp' = (`yy' !=. | (`yy' ==. & `ss' == 0)) & (`__tempt' == 1 | `__tempt' == 0) & (`ss' == 1 | `ss' == 0) & (`__tempsel' == 1 | `__tempsel' == 0) & `__cesamp' == 1 + } + ** GENERATE WEIGHTS ** + gen `__wwusc' = `exp' + replace `__esamp' = 0 if `__wwusc' >=. | `__wwusc' < 0 + preserve + keep if `__esamp' == 1 + ** RESCALE WEIGHTS + sum `__wwusc' + local wsumusc = r(sum) + gen `__wwsc' = `__wwusc'/r(mean) + sum `__wwsc' + ** WEIGHT CORRECTION FACTOR + if "`weight'" == "fweight" | "`weight'" == "iweight" { + local wcf = `wsumusc'/r(sum) + } + else { + local wcf = 1 + } + sum `ss' [iweight = `__wwsc'] + local samps = round(`wcf'*r(sum_w)) + local nsel = round(`wcf'*r(mean)*r(sum_w),1) + ** RE-CHECK TREATMENT INDICATOR ** + mean `ss' [pweight = `__wwsc'], over(`__tempt') + if _b[0] == 0 { + display as error "no information on `yy' for control group" + exit 2000 + } + if _b[1] == 0 { + display as error "no information on `yy' for treatment group" + exit 2000 + } + if _b[0] == _b[1] { + noisily: display as result "selection proportion exactly equal for both groups, no bounds computed" + exit 498 + } + if _b[0] > _b[1] { + replace `__tempt' = (`__tempt'-1)^2 + local trimmed "control" + } + else { + local trimmed "treatment" + } + ** CREATE CELLS ** + unab tight : `tight' + egen `__zz' = group(`tight') + ** CHECK CELL SIZE ** + tab `__zz' `__tempt' [iweight = `__wwsc'], matcell(`__csize') + mata: st_numscalar("`__mcsize'", min(st_matrix("`__csize'"))) + if `__mcsize' <= 0 { + display as error "cells without variation in treatment; change varlist specified by tight()" + restore + exit 2000 + } + mean `ss' [pweight = `__wwsc'], over(`__tempt' `__zz') + mat `__csize' = e(b) + mata: st_numscalar("`__micsize'", min(st_matrix("`__csize'"))) + if `__micsize' <= 0 { + display as error "cells without information on `yy' for one group; change varlist specified by tight()" + restore + exit 2000 + } + ** CHECK FOR HOMOGENEOUS SELECTION DIRECTION ACROSS CELLS ** + mat `__csize' = `__csize'[1,1..colsof(`__csize')/2]- `__csize'[1,1+colsof(`__csize')/2..colsof(`__csize')] + mata: st_numscalar("`__micsize'", min(st_matrix("`__csize'"))) + mata: st_numscalar("`__macsize'", max(st_matrix("`__csize'"))) + if `__micsize' < 0 & `__macsize' > 0 { + display as error "warning: heterogenous selection direction across cells; thightening may fail" + local cellsel "hetero" + } + else { + local cellsel "homo" + } + ** CALCULATE TIGHTENED LEE-BOUNDs + leetbound `yy' `__tempt' `ss' `__zz' `trimmed' `__wwusc' + mat `__res' = e(b) + mat `__resV' = e(V)/`wcf' + local otrim = e(trim) + local ocells = e(cells) + local cno : colfullnames `__res' + ** BOOTSTRAPPING ** + if `reps' > 1 { + keep `yy' `__tempt' `ss' `__zz' `__wwusc' + gen `__tempid' = _n + save `__bsfile' + local count = 0 + forvalues rr = 1/`reps' { + wbsample `__tempid' `__wwusc' `__tempt' `__bsfile' `exp' + capture leetbound `yy' `__tempt' `ss' `__zz' `trimmed' __tempw + mat `__mis' = matmissing(e(b)) + local mis = `__mis'[1,1] + local cnb : colfullnames e(b) + if _rc != 0 | `mis' != 0 | "`cnb'" != "`cno'" { + if "`dots'" == "dots" { + if `rr' == 1 { + noisily: display "" + } + if `rr'/50 == round(`rr'/50) | `rr' == `reps' { + noisily: display as error "x" as text " `rr'" + } + else { + noisily: display as error "x" _continue + } + } + if `rr' < `reps' { + continue + } + else { + local finalerror "finalerror" + } + } + if "`dots'" == "dots" & "finalerror" != "`finalerror'" { + if `rr' == 1 { + noisily: display "" + } + if `rr'/50 == round(`rr'/50) | `rr' == `reps' { + noisily: display as text ". `rr'" + } + else { + noisily: display as text "." _continue + } + } + if "finalerror" != "`finalerror'" { + local count = `count'+1 + if `count' == 1 { + mat `__bb' = e(b) + mat `__bsq' = e(b)'*e(b) + } + else { + mat `__bb' = `__bb' + e(b) + mat `__bsq' = `__bsq'+ e(b)'*e(b) + } + } + if `rr' == `reps' { + if `count' > 1 { + mat `__bb' = `__bb'/`count' + mat `__bsq' = `__bsq'/(`count'-1) + mat `__resV' = `__bsq' - `__bb''*`__bb'*(`count'/(`count'-1)) + mat `__resV' = `__resV'/`wcf' + } + else { + mat `__resV' = J(2,2,0) + mat colnames `__resV' = `cno' + mat rownames `__resV' = `cno' + } + } + } + } + restore + mat coleq `__res' = `tr' + mat coleq `__resV' = `tr' + mat roweq `__resV' = `tr' + ereturn post `__res' `__resV', depname(`yy') properties(b V) esample(`__esamp') + } + ** SELECT RELEVANT SAMPLE FOR SIMPLE BOUNDS ** + else { + gen `__cesamp' = 1 `if' `in' + if "`select'" == "" { + gen `__esamp' = (`yy' !=. | (`yy' ==. & `ss' == 0)) & (`__tempt' == 1 | `__tempt' == 0) & (`ss' == 1 | `ss' == 0) & `__cesamp' == 1 + } + else { + gen `__esamp' = (`yy' !=. | (`yy' ==. & `ss' == 0)) & (`__tempt' == 1 | `__tempt' == 0) & (`ss' == 1 | `ss' == 0) & (`__tempsel' == 1 | `__tempsel' == 0) & `__cesamp' == 1 + } + gen `__wwusc' = `exp' + ** GENERATE WEIGHTS ** + replace `__esamp' = 0 if `__wwusc' >=. | `__wwusc' < 0 + preserve + keep if `__esamp' == 1 + ** RESCALE WEIGHTS + sum `__wwusc' + local wsumusc = r(sum) + gen `__wwsc' = `__wwusc'/r(mean) + sum `__wwsc' + ** WEIGHT CORRECTION FACTOR + if "`weight'" == "fweight" | "`weight'" == "iweight" { + local wcf = `wsumusc'/r(sum) + } + else { + local wcf = 1 + } + sum `ss' [iweight = `__wwsc'] + local samps = round(`wcf'*r(sum_w)) + local nsel = round(`wcf'*r(mean)*r(sum_w)) + ** RE-CHECK TREATMENT INDICATOR ** + mean `ss' [pweight = `__wwsc'], over(`__tempt') + if _b[0] == 0 { + display as error "no information on `yy' for control group" + exit 2000 + } + if _b[1] == 0 { + display as error "no information on `yy' for treatment group" + exit 2000 + } + if _b[0] == _b[1] { + noisily: display as result "selection proportion exactly equal for both groups, no bounds computed" + exit 498 + } + if _b[0] > _b[1] { + replace `__tempt' = (`__tempt'-1)^2 + local trimmed "control" + } + else { + local trimmed "treatment" + } + ** CALCULATE SIMPLE LEE-BOUNDs + leesbound `yy' `__tempt' `ss' `trimmed' `__wwusc' + mat `__res' = e(b) + mat `__resV' = e(V)/`wcf' + local otrim = e(trim) + local cno : colfullnames `__res' + ** BOOTSTRAPPING ** + if `reps' > 1 { + keep `yy' `__tempt' `ss' `__wwusc' + gen `__tempid' = _n + save `__bsfile' + local count = 0 + forvalues rr = 1/`reps' { + wbsample `__tempid' `__wwusc' `__tempt' `__bsfile' `exp' + capture leesbound `yy' `__tempt' `ss' `trimmed' __tempw + mat `__mis' = matmissing(e(b)) + local mis = `__mis'[1,1] + local cnb : colfullnames e(b) + if _rc != 0 | `mis' != 0 | "`cnb'" != "`cno'" { + if "`dots'" == "dots" { + if `rr' == 1 { + noisily: display "" + } + if `rr'/50 == round(`rr'/50) | `rr' == `reps' { + noisily: display as error "x" as text " `rr'" + } + else { + noisily: display as error "x" _continue + } + } + if `rr' < `reps' { + continue + } + else { + local finalerror "finalerror" + } + } + if "`dots'" == "dots" & "finalerror" != "`finalerror'" { + if `rr' == 1 { + noisily: display "" + } + if `rr'/50 == round(`rr'/50) | `rr' == `reps' { + noisily: display as text ". `rr'" + } + else { + noisily: display as text "." _continue + } + } + if "finalerror" != "`finalerror'" { + local count = `count'+1 + if `count' == 1 { + mat `__bb' = e(b) + mat `__bsq' = e(b)'*e(b) + } + else { + mat `__bb' = `__bb' + e(b) + mat `__bsq' = `__bsq'+ e(b)'*e(b) + } + } + if `rr' == `reps' { + if `count' > 1 { + mat `__bb' = `__bb'/`count' + mat `__bsq' = `__bsq'/(`count'-1) + mat `__resV' = `__bsq' - `__bb''*`__bb'*(`count'/(`count'-1)) + mat `__resV' = `__resV'/`wcf' + } + else { + mat `__resV' = J(2,2,0) + mat colnames `__resV' = `cno' + mat rownames `__resV' = `cno' + } + } + } + } + restore + mat coleq `__res' = `tr' + mat coleq `__resV' = `tr' + mat roweq `__resV' = `tr' + ereturn post `__res' `__resV', depname(`yy') properties(b V) esample(`__esamp') + } + ** POST RESULTS ** + ereturn scalar N = `samps' + ereturn scalar Nsel = `nsel' + if "`tight'" != "" { + ereturn scalar cells = `ocells' + } + ereturn scalar trim = `otrim' + ereturn scalar level = `c(level)' + if "`weight'" != "" { + ereturn local wexp "= `exp'" + ereturn local wtype "`weight'" + } + ereturn local trimmed "`trimmed'" + ereturn local treatment "`tr'" + if "`select'" != "" { + ereturn local select "`select'" + } + ereturn local covariates "`tight'" + if "`tight'" != "" { + ereturn local cellsel "`cellsel'" + } + if `reps' > 1 { + ereturn scalar N_reps = `count' + ereturn local vcetype "Bootstrap" + ereturn local vce "bootstrap" + } + if `reps' == 0 { + ereturn local vce "analytic" + } + ereturn local title "Lee (2009) treatment effect bounds" + ereturn local cmdline `cmdline' + ereturn local cmd `cmd' + capture mat `__Vtest' = inv(e(V)) + if "`cieffect'" == "cieffect" { + if _rc == 0 { + leebci + ereturn scalar cilower = cilower + ereturn scalar ciupper = ciupper + scalar drop ciupper cilower + } + else { + ereturn local cilower "." + ereturn local ciupper "." + } + } + } + set level `clevel' + set more `moreold' + } + else { + if "`e(cmd)'" != "leebounds" { + error 301 + } + else { + syntax, [LEVel(real `e(level)')] + } + } + ** DISPLAY RESULTS ** + if "`e(covariates)'" != "" { + display _newline as text "Tightened Lee (2009) treatment effect bounds" + display _newline as text "Number of obs." _skip(20) as text " = " as result `e(N)' + display as text "Number of selected obs." _skip(11) as text " = " as result `e(Nsel)' + display as text "Number of cells" _skip(19) as text " = " as result `e(cells)' + display as text "Overall trimming porportion" _skip(7) as text " = " as result %-06.4f `e(trim)' + } + else { + display _newline as text "Lee (2009) treatment effect bounds" + display _newline as text "Number of obs." _skip(20) as text " = " as result `e(N)' + display as text "Number of selected obs." _skip(11) as text " = " as result `e(Nsel)' + display as text "Trimming porportion" _skip(15) as text " = " as result %-06.4f `e(trim)' + } + if "`e(cilower)'" != "" | "`e(ciupper)'" != "" { + if `e(cilower)' > 0 { + local psk "_skip(1)" + } + display as text "Effect `e(level)'% conf. interval" _skip(9) as text " : [" `psk' as result %-06.4f `e(cilower)' _skip(2) as result %-06.4f `e(ciupper)' as text "]" + } + display "" + ereturn display, level(`level') +end + +***************************************************************************** +** Compute Tightened Lee (2009) Bounds ************************************** +capture program drop leetbound +program leetbound, eclass +version 11.2 +args yy tt ss zz cc ww + tempvar __esamp __ysq __st __sit __group __wws + tempname __res __resV __ctst __vres __instfreq + ** Rescale Weights + gen `__wws' = `ww' + sum `__wws' + replace `__wws' = `__wws'/r(mean) + gen `__ysq' = (`yy')^2 + ** Cells ** + capture drop _instcat* + tab `zz', g(_instcat) + local ncat = r(r) + ** Overall Trimmed Means & Number of Trimmed Observations + mean `ss' [pweight = `__wws'], over(`tt') + local trim = 100*(_b[1]-_b[0])/_b[1] + local qtrim = `trim'/100 + local otrim = `qtrim' + _pctile `yy' if `ss' == 1 & `tt' == 1 [pweight = `__wws'], percentiles(`trim') + local uth = r(r1) + sum `__wws' if `ss' == 1 & `tt' == 1 & `yy' == `uth' + if r(sum) == 0 { + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' >= `uth' [iweight = `__wws'] + local tubov = r(mean) + } + else { + local neth = r(sum) + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' > `uth' [iweight = `__wws'] + local nbth = r(sum_w) + local sbth = r(sum) + sum `__wws' if `ss' == 1 & `tt' == 1 & `yy' !=. + local ntall = r(sum) + local stie = (`ntall'*(1-`qtrim')-`nbth')/`neth' + local tubov = (`sbth'+`stie'*`neth'*`uth')/(`nbth'+`stie'*`neth') + } + local itrim = 100-`trim' + _pctile `yy' if `ss' == 1 & `tt' == 1 [pweight = `__wws'], percentiles(`itrim') + local lth = r(r1) + sum `__wws' if `ss' == 1 & `tt' == 1 & `yy' == `lth' + if r(sum) == 0 { + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' <= `lth' [iweight = `__wws'] + local lubov = r(mean) + } + else { + local neth = r(sum) + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' < `lth' [iweight = `__wws'] + local nbth = r(sum_w) + local sbth = r(sum) + sum `__wws' if `ss' == 1 & `tt' == 1 & `yy' !=. + local ntall = r(sum) + local stie = (`ntall'*(1-`qtrim')-`nbth')/`neth' + local lubov = (`sbth'+`stie'*`neth'*`lth')/(`nbth'+`stie'*`neth') + } + ** BY CELL ** + forvalues instv = 1/`ncat' { + tab `ss' `tt' if _instcat`instv' == 1 [iweight = `__wws'], matcell(`__ctst') + local nall = r(N) + mat `__ctst' = `__ctst'/`nall' + local est = `__ctst'[2,2] + local esnt = `__ctst'[2,1] + local et = `__ctst'[1,2]+`__ctst'[2,2] + local oddsc = `__ctst'[1,1]/`__ctst'[2,1] + local oddst = `__ctst'[1,2]/`__ctst'[2,2] + ** Estimate Cell's Weight + sum `yy' if `ss' == 1 & `tt' == 0 & _instcat`instv' == 1 [iweight = `__wws'] + local __instfreql = r(sum_w) + local __instfrequ = r(sum_w) + ** Trimming Proportion + mean `ss' if _instcat`instv' == 1 [pweight = `__wws'], over(`tt') + local trim = 100*(_b[1]-_b[0])/_b[1] + local qtrim = `trim'/100 + if `trim' > 0 & `trim' < 100 { + _pctile `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 [iweight = `__wws'], percentiles(`trim') + local uth = r(r1) + } + else { + sum `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 [iweight = `__wws'] + if `trim' <= 0 { + local uth = r(min) + } + if `trim' >= 100 { + local uth = r(max) + } + } + sum `__wws' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' == `uth' + if r(sum) == 0 { + sum `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' >= `uth' [iweight = `__wws'] + local tub`instv' = r(mean) + ** Analytic Variance + local vp = (1-`qtrim')^2*(`oddst'/(`et'*`nall')+`oddsc'/((1-`et')*`nall')) + local vb1 = r(Var)/r(sum_w) + local vb2 = (`uth'-`tub`instv'')^2*((`qtrim')/(1-`qtrim'))/(`est'*`nall') + local vb3 = ((`uth'-`tub`instv'')/(1-`qtrim'))^2*`vp' + local vub`instv' = `vb1'+`vb2'+`vb3' + } + else { + local neth = r(sum) + sum `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' > `uth' [iweight = `__wws'] + local nbth = r(sum_w) + local sbth = r(sum) + sum `__wws' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' !=. + local ntall = r(sum) + local stie = (`ntall'*(1-`qtrim')-`nbth')/`neth' + local tub`instv' = (`sbth'+`stie'*`neth'*`uth')/(`nbth'+`stie'*`neth') + ** Analytic Variance + sum `__ysq' if `ss' == 1 & `tt' == 1 & `yy' > `uth' & _instcat`instv' == 1 [iweight = `__wws'] + local vp = (1-`qtrim')^2*(`oddst'/(`et'*`nall')+`oddsc'/((1-`et')*`nall')) + local vb1 = ((r(sum)+`stie'*`neth'*(`uth')^2)/(`nbth'+`stie'*`neth')-(`tub`instv'')^2)/(`nbth'+`stie'*`neth') + local vb2 = (`uth'-`tub`instv'')^2*(`qtrim')/((1-`qtrim')*`est'*`nall') + local vb3 = ((`uth'-`tub`instv'')/(1-`qtrim'))^2*`vp' + local vub`instv' = `vb1'+`vb2'+`vb3' + } + local itrim = 100-`trim' + if `itrim' > 0 & `itrim' < 100 { + _pctile `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 [pweight = `__wws'], percentiles(`itrim') + local lth = r(r1) + } + else { + sum `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 [iweight = `__wws'] + if `itrim' <= 0 { + local lth = r(min) + } + if `itrim' >= 100 { + local lth = r(max) + } + } + sum `__wws' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' == `lth' + if r(sum) == 0 { + sum `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' <= `lth' [iweight = `__wws'] + local lub`instv' = r(mean) + ** Analytic Variance + local vp = (1-`qtrim')^2*(`oddst'/(`et'*`nall')+`oddsc'/((1-`et')*`nall')) + local vb1 = r(Var)/r(sum_w) + local vb2 = (`lth'-`lub`instv'')^2*((`qtrim')/(1-`qtrim'))/(`est'*`nall') + local vb3 = ((`lth'-`lub`instv'')/(1-`qtrim'))^2*`vp' + local vlb`instv' = `vb1'+`vb2'+`vb3' + } + else { + local neth = r(sum) + sum `yy' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' < `lth' [iweight = `__wws'] + local nbth = r(sum_w) + local sbth = r(sum) + sum `__wws' if `ss' == 1 & `tt' == 1 & _instcat`instv' == 1 & `yy' !=. + local ntall = r(sum) + local stie = (`ntall'*(1-`qtrim')-`nbth')/`neth' + local lub`instv' = (`sbth'+`stie'*`neth'*`lth')/(`nbth'+`stie'*`neth') + ** Analytic Variance + sum `__ysq' if `ss' == 1 & `tt' == 1 & `yy' < `lth' & _instcat`instv' == 1 [iweight = `__wws'] + local vp = (1-`qtrim')^2*(`oddst'/(`et'*`nall')+`oddsc'/((1-`et')*`nall')) + local vb1 = ((r(sum)+`stie'*`neth'*(`lth')^2)/(`nbth'+`stie'*`neth')-(`lub`instv'')^2)/(`nbth'+`stie'*`neth') + local vb2 = (`lth'-`lub`instv'')^2*(`qtrim')/((1-`qtrim')*`est'*`nall') + local vb3 = ((`lth'-`lub`instv'')/(1-`qtrim'))^2*`vp' + local vlb`instv' = `vb1'+`vb2'+`vb3' + } + ** Weighted Sum ** + if `instv' == 1 { + local uwsum = `__instfrequ' + local lwsum = `__instfreql' + local ubttreat = `__instfrequ'*`tub`instv'' + local lbttreat = `__instfreql'*`lub`instv'' + local ubttreat_sq = `__instfrequ'*(`tub`instv'')^2 + local lbttreat_sq = `__instfreql'*(`lub`instv'')^2 + local vub = (`__instfrequ')^2*(`vub`instv'') + local vlb = (`__instfreql')^2*(`vlb`instv'') + } + else { + local uwsum = `uwsum'+`__instfrequ' + local lwsum = `lwsum'+`__instfreql' + local ubttreat = `ubttreat'+`__instfrequ'*`tub`instv'' + local lbttreat = `lbttreat'+`__instfreql'*`lub`instv'' + local ubttreat_sq = `ubttreat_sq'+`__instfrequ'*(`tub`instv'')^2 + local lbttreat_sq = `lbttreat_sq'+`__instfreql'*(`lub`instv'')^2 + local vub = `vub'+(`__instfrequ')^2*(`vub`instv'') + local vlb = `vlb'+(`__instfreql')^2*(`vlb`instv'') + } + if `instv' == `ncat' { + sum `yy' if `tt' == 0 & `ss' == 1 [iweight = `__wws'] + local vc = r(Var)/r(sum_w) + local vub = `vub'/(`uwsum')^2+((`ubttreat_sq'/`uwsum')-(`ubttreat'/`uwsum')^2)/`ntall'+`vc' + local vlb = `vlb'/(`lwsum')^2+((`lbttreat_sq'/`lwsum')-(`lbttreat'/`lwsum')^2)/`ntall'+`vc' + local ubttreat = `ubttreat'/`uwsum'-r(mean) + local lbttreat = `lbttreat'/`lwsum'-r(mean) + } + } + if "`cc'" != "control" { + matrix `__res' = (`lbttreat', `ubttreat') + } + else { + matrix `__res' = -1*(`ubttreat', `lbttreat') + } + local varmis = matmissing(`__res') + if `varmis' == 1 { + display as error "cannot compute tightened bounds; change varlist specified by tight()" + capture restore + exit 2000 + } + matrix colnames `__res' = `tt':lower `tt':upper + local cn : colfullnames `__res' + if "`cc'" != "control" { + matrix `__vres' = (`vlb',`vub') + } + else { + matrix `__vres' = (`vub',`vlb') + } + matrix `__resV' = diag(`__vres') + local varmis = matmissing(`__resV') + if `varmis' == 1 { + matrix `__resV' = J(2,2,0) + display as error "warning: cannot compute analytic variance; change varlist specified by tight()" + } + matrix colnames `__resV' = `cn' + matrix rownames `__resV' = `cn' + ereturn post `__res' `__resV', depname(`yy') properties(b V) + ereturn scalar cells = `ncat' + ereturn scalar trim = `otrim' +end + +***************************************************************** +** Basic Lee (2005) Bounds ************************************** +capture program drop leesbound +program leesbound, eclass +version 11.2 +args yy tt ss cc ww + tempvar __esamp __ysq __st __sit __wws + tempname __res __resV __ctst __vres + ** RESCALING WEIGHTS ** + gen `__wws' = `ww' + sum `__wws' + replace `__wws' = `__wws'/r(mean) + gen `__ysq' = (`yy')^2 + tab `ss' `tt' [iweight = `__wws'], matcell(`__ctst') + local nall = r(N) + mat `__ctst' = `__ctst'/`nall' + local est = `__ctst'[2,2] + local esnt = `__ctst'[2,1] + local et = `__ctst'[1,2]+`__ctst'[2,2] + local oddsc = `__ctst'[1,1]/`__ctst'[2,1] + local oddst = `__ctst'[1,2]/`__ctst'[2,2] + mean `ss' [pweight = `ww'], over(`tt') + local trim = 100*(_b[1]-_b[0])/_b[1] + local qtrim = `trim'/100 + local nall = round(`nall') + _pctile `yy' if `ss' == 1 & `tt' == 1 [pweight = `__wws'], percentiles(`trim') + local uth = r(r1) + sum `__wws' if `ss' == 1 & `tt' == 1 & `yy' == `uth' + if r(sum) == 0 { + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' >= `uth' [iweight = `__wws'] + local tub = r(mean) + ** Analytic Variance + local vp = (1-`qtrim')^2*(`oddst'/`et'+`oddsc'/(1-`et')) + local vb1 = r(Var)/r(sum_w) + local vb2 = (`uth'-`tub')^2*(`qtrim')*(`est'*(1-`qtrim'))^-1 + local vb3 = ((`uth'-`tub')/(1-`qtrim'))^2*`vp' + sum `yy' if `ss' == 1 & `tt' == 0 + local vc = r(Var)/`esnt' + local vub = `vb1'+(`vb2'+`vb3'+`vc')/`nall' + } + else { + local neth = r(sum) + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' > `uth' [iweight = `__wws'] + local nbth = r(sum_w) + local sbth = r(sum) + sum `__wws' if `ss' == 1 & `tt' == 1& `yy' !=. + local ntall = r(sum) + local stie = (`ntall'*(1-`qtrim')-`nbth')/`neth' + local tub = (`sbth'+`stie'*`neth'*`uth')/(`nbth'+`stie'*`neth') + ** Analytic Variance + local vp = (1-`qtrim')^2*(`oddst'/`et'+`oddsc'/(1-`et')) + sum `__ysq' if `ss' == 1 & `tt' == 1 & `yy' > `uth' [iweight = `__wws'] + local vb1 = ((r(sum)+`stie'*`neth'*(`uth')^2)/(`nbth'+`stie'*`neth')-(`tub')^2)/(`nbth'+`stie'*`neth') + local vb2 = (`uth'-`tub')^2*(`qtrim')*(`est'*(1-`qtrim'))^-1 + local vb3 = ((`uth'-`tub')/(1-`qtrim'))^2*`vp' + sum `yy' if `ss' == 1 & `tt' == 0 [iweight = `__wws'] + local vc = r(Var)/`esnt' + local vub = `vb1'+(`vb2'+`vb3'+`vc')/`nall' + } + sum `yy' if `ss' == 1 & `tt' == 0 [iweight = `__wws'] + local ubtreat = `tub'-r(mean) + local itrim = 100-`trim' + _pctile `yy' if `ss' == 1 & `tt' == 1 [pweight = `__wws'], percentiles(`itrim') + local lth = r(r1) + sum `__wws' if `ss' == 1 & `tt' == 1 & `yy' == `lth' + if r(sum) == 0 { + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' <= `lth' [iweight = `__wws'] + local lub = r(mean) + ** Analytic Variance + local vp = (1-`qtrim')^2*(`oddst'/`et'+`oddsc'/(1-`et')) + local vb1 = r(Var)/r(sum_w) + local vb2 = (`lth'-`lub')^2*(`qtrim')*(`est'*(1-`qtrim'))^-1 + local vb3 = ((`lth'-`lub')/(1-`qtrim'))^2*`vp' + sum `yy' if `ss' == 1 & `tt' == 0 [iweight = `__wws'] + local vc = r(Var)/`esnt' + local vlb = `vb1'+(`vb2'+`vb3'+`vc')/`nall' + } + else { + local neth = r(sum) + sum `yy' if `ss' == 1 & `tt' == 1 & `yy' < `lth' [iweight = `__wws'] + local nbth = r(sum_w) + local sbth = r(sum) + sum `__wws' if `ss' == 1 & `tt' == 1 & `yy' !=. + local ntall = r(sum) + local stie = (`ntall'*(1-`qtrim')-`nbth')/`neth' + local lub = (`sbth'+`stie'*`neth'*`lth')/(`nbth'+`stie'*`neth') + ** Analytic Variance + local vp = (1-`qtrim')^2*(`oddst'/`et'+`oddsc'/(1-`et')) + sum `__ysq' if `ss' == 1 & `tt' == 1 & `yy' < `lth' [iweight = `__wws'] + local vb1 = ((r(sum)+`stie'*`neth'*(`lth')^2)/(`nbth'+`stie'*`neth')-(`lub')^2)/(`nbth'+`stie'*`neth') + local vb2 = (`lth'-`lub')^2*(`qtrim')*(`est'*(1-`qtrim'))^-1 + local vb3 = ((`lth'-`lub')/(1-`qtrim'))^2*`vp' + sum `yy' if `tt' == 0 & `ss' == 1 [iweight = `__wws'] + local vc = r(Var)/`esnt' + local vlb = `vb1'+(`vb2'+`vb3'+`vc')/`nall' + } + sum `yy' if `ss' == 1 & `tt' == 0 [iweight = `__wws'] + local lbtreat = `lub'-r(mean) + if "`cc'" != "control" { + matrix `__res' = (`lbtreat' , `ubtreat') + } + else { + matrix `__res' = -1*(`ubtreat', `lbtreat') + } + local varmis = matmissing(`__res') + if `varmis' == 1 { + display as error "cannot compute bounds" + capture restore + exit 2000 + } + matrix colnames `__res' = `tt':lower `tt':upper + local cn : colfullnames `__res' + if "`cc'" != "control" { + matrix `__vres' = (`vlb',`vub') + } + else { + matrix `__vres' = (`vub',`vlb') + } + matrix `__resV' = diag(`__vres') + local varmis = matmissing(`__resV') + if `varmis' == 1 { + matrix `__resV' = J(2,2,0) + display as error "warning: cannot compute analytic variance" + } + matrix colnames `__resV' = `cn' + matrix rownames `__resV' = `cn' + ereturn post `__res' `__resV', depname(`yy') properties(b V) + ereturn scalar trim = `qtrim' +end + +********************************************************************** +** Confidence Intervals for Bounds *********************************** +capture program drop leebci +program leebci, rclass +version 11.2 + local cs = invnormal(1-(100-`c(level)')/100) + local ce = invnormal(1-(100-`c(level)')/200) + local qd = 10^15 + forvalues cc = `cs'(0.001)`ce' { + local qdn = ((normal(`cc'+(_b[upper]-_b[lower])/max(_se[lower], _se[upper]))-normal(-`cc')) - (1-(100-`c(level)')/100))^2 + if `qdn' < `qd' { + local qd = `qdn' + local cnn = `cc' + } + } + scalar cilower = _b[lower]-_se[lower]*`cnn' + scalar ciupper = _b[upper]+_se[upper]*`cnn' +end + +********************************************************************* +** Weighted Bootstrap *********************************************** +capture program drop wbsample +program wbsample, nclass +version 11.1 + args id ww gg ff wexp + ** TEMPORARY NAMES ** + tempvar __ww2 __repl __fww0 __fww1 + if "`wexp'" == "1" { + capture drop __tempw + gen __tempw =. + bsample, strata(`gg') weight(__tempw) + } + else { + sum `ww' if `ww' > 0 + gen `__ww2' = floor(`ww'/r(min)) + replace `__ww2' = `__ww2'+ rbinomial(1,(`ww'/r(min))-floor(`ww'/r(min))) if (`ww'/r(min))-floor(`ww'/r(min)) != 0 + keep `id' `__ww2' `gg' + expand `__ww2', gen(`__repl') + sort `id' `__repl' + capture drop `__fww0' __tempw `__fww1' + gen `__fww0' =. + sum `__repl' if `gg' == 0 + local on = round((1-r(mean))*r(N)) + bsample `on' if `gg' == 0 & `__ww2' > 0 & `__ww2' <., weight(`__fww0') + by `id', sort: egen __tempw = total(`__fww0') + capture drop `__fww0' + gen `__fww0' =. + sum `__repl' if `gg' == 1 + local on = round((1-r(mean))*r(N)) + bsample `on' if `gg' == 1 & `__ww2' > 0 & `__ww2' <., weight(`__fww0') + by `id', sort: egen `__fww1' = total(`__fww0') + replace __tempw = __tempw+`__fww1' + keep if `__repl' == 0 + keep `id' __tempw + sort `id' + merge 1:1 `id' using `ff' + } +end diff --git a/data/ado/l/leebounds.sthlp b/data/ado/l/leebounds.sthlp new file mode 100644 index 0000000..c0e49f6 --- /dev/null +++ b/data/ado/l/leebounds.sthlp @@ -0,0 +1,221 @@ +{smcl} +{* *! version 1.0 3mar2011}{...} +{cmd:help orderalpha} +{hline} + +{title:Title} + +{p2colset 5 20 22 2}{...} +{phang} +{bf:leebounds} {hline 2} Lee (2009) treatment effect bounds{p_end} +{p2colreset}{...} + +{title:Syntax} + +{p 8 17 2} +{cmd:leebounds} +{it:{help varname:depvar}} {it:{help varname:treatvar}} {ifin} {weight}, [{cmd:}{it:{help leebounds##options:options}}] + + +{synoptset 28 tabbed}{...} +{marker Outcome_and_treatment}{...} +{synopthdr :Outcome and treatment} +{synoptline} +{syntab :Model} +{synopt :{it:{help varname:depvar}}}dependent variable{p_end} +{synopt :{it:{help varname:treatvar}}}binary treatment indicator{p_end} + +{synoptset 28 tabbed}{...} +{synopthdr :options} +{synoptline} +{syntab :Main} +{synopt :{opth {ul on}sel{ul off}ect(varname)}}selection indicator {p_end} +{synopt :{opth {ul on}tig{ul off}ht(varlist)}}covariats for tightened bounds {p_end} +{synopt :{opt cie:ffect}}compute confidence interval for treatment effect {p_end} + +{syntab :SE/Bootstrap} +{space 6}{cmd:vce(}{ul on}{it:ana}{ul off}{it:lytic}|{help bootstrap:{ul on}{it:boot}{ul off}{it:strap}}{cmd:)} {space 3} compute analytic or bootstrapped standard errors; {opt vce(analytic)} is the default. + +{syntab :Reporting} +{synopt :{opt lev:el(#)}}set confidence level; default is {opt level(95)}{p_end} +{synoptline} +{p2colreset}{...} +{p 4 6 2} +{opt pweights} (default), {opt fweights}, and {opt iweights} are allowed, {opt aweights} are not allowed; see {help weight}. Observations with negative weight are skipped for any weight type.{p_end} +{p 4 6 2}{cmd:bootstrap} is allowed, {cmd:by} and {cmd:svy} are not allowed; see {help prefix}.{p_end} + + + +{title:Description} + +{pstd} +{cmd:leebounds} computes treatment effect bounds for samples with non-random sample selection/attrition as proposed by Lee (2009). The lower and upper bound, +respectively, correspond to extreme assumptions about the missing information that are consistent with the observed data. As opposed to parametric +approaches to correcting for sample selection bias, such as the classical Heckman (1979) estimator, Lee (2009) bounds rest on very few assumptions, i.e. random assignment +of treatment and monotonicity. Monotonicity means that the treatment status affects selection in just one direction. That is, receiving a treatment makes selection either +more or less likely for any observation. In technical terms, the approach rests on a trimming procedure. Either from below or from above, the group (treatment, control) +that suffers less from sample attrition is trimmed at the quantile of the outcome variable that corresponds to the share of 'excess observations' in this group. Calculating +group differentials in mean outcome yields the lower and the upper bound, respectively, for the treatment effect depending on whether trimming is from below or above. +{cmd:leebounds} assumes that it is unknown, a priori, which group (treatment, control) is subject to the higher selection probability and estimates this from data +(see Lee, 2009:1090). + + +{title:Outcome and treatment} + +{dlgtab:Model} + +{phang} +{opt depvar} specifies the outcome variable. + +{phang} +{opt treatvar} specifies a binary variable, indicating receipt of treatment. Estimating the effect of {it:treatvar} +on {it: depvar} is subject of the empirical analysis. The lager value of {it:treatvar} is assumed to indicate treatment. + + +{marker options}{...} +{title:Options} + +{dlgtab:Main} + + +{phang} +{opt select(varname)} specifies a binary selection indicator. {it:treatvar} my only take the value zero or unity. If no selction indicator {it:varname} is specified, any observation with non-missing +information on {it:depvar} is assumed to be selected while all observations with missing information on {it:depvar} are assumed to be not selected. + +{phang} +{opt tight(varlist)} specifies a list of covariates for computing tightened bounds. With {opt tight()} specified, the sample is splitted into into cells defined by +the covariates in {it:varlist}. Trimmed means are calculated separately for each cell, where the trimming proportion is specific to each cell. Finally, a weighted average of trimmed means is calculated. +Continuous variables may, hence, not enter {it:varlist} without afore being converted to categorical variables. Specifying to many cells by including numerous +variables in {it:varlist}, or by including variables that take numerous different values, will cause error. + +{phang} +{opt cieffect} requests calculation of a confidence interval for the treatment effect. Note that this interval is narrower than the conjunction +of confidence intervals for the estimated bounds (see Lee, 2009:1089; Imbens and Manski, 2004). This interval captures both, uncertainty +about the bias due to non-random sample attrition and uncertainty because of sampling error. + +{dlgtab:SE/Bootstrap} + +{phang} +{opt vce(analytic|bootstrap)} specifies whether analytic or bootstrapped standard errors are calculated for estimated bounds. {it:analytic} +is the default. {it:bootstrap} allows for the suboptions {opt r:eps(#)} and {opt nodots}; see {help bootstrap:bootstrap}. For {opt vce(analytic)} +the covariance for the estimated lower and upper bound is not computed. If this covariance is of relevance, one should choose {opt vce(bootstrap)}. +Instead of specifying {opt vce(bootstrap)} one may alternatively use the {help prefix:prefix} command {cmd:bootstrap}, which allows for numerous additional options. +Yet {cmd:leebounds}' internal bootstrapping routine is much faster than the prefix command, allows for sampling weights by +performing a weighted bootstrap, and makes the option {opt cieffect} use bootstrapped standard errors, too. + +{dlgtab:Reporting} + +{phang} +{opt level(#)}; see {helpb estimation options##level():[R] estimation options}. One may change the reported confidence level by retyping +{cmd:leebounds} without arguments and only specifying the option {opt level(#)}. However, this affects only the confidence interval for the +bounds, but not for the confidence interval requested with {opt cieffect}. + + +{title:Examples} + +{pstd}Basic syntax{p_end} +{phang2}{cmd:. leebounds wage training}{p_end} + +{pstd}Tightened Lee bounds with weighted bootstrap and treatment effect-confidence interval{p_end} +{phang2}{cmd:. leebounds wage training [pw=1/prob], select(wageinfo) tight(female immigrant) cieffect vce(boot, reps(250) nodots)}{p_end} + + +{title:Saved results} + +{pstd} +{cmd:leebounds} saves the following in {cmd:e()}: + +{synoptset 20 tabbed}{...} +{p2col 5 20 24 2: Scalars}{p_end} +{synopt:{cmd:e(N)}}number of observations{p_end} +{synopt:{cmd:e(Nsel)}}number of selected observations{p_end} +{synopt:{cmd:e(trim)}}(overall) trimming proportion{p_end} +{synopt:{cmd:e(cells)}}number of cells (only saved for {opt tight()}){p_end} +{synopt:{cmd:e(cilower)}}lower bound of treatment effect-confidence interval (only saved for {opt cieffect}){p_end} +{synopt:{cmd:e(ciupper)}}upper bound of treatment effect-confidence interval (only saved for {opt cieffect}){p_end} +{synopt:{cmd:e(level)}}confidence level{p_end} +{synopt:{cmd:e(N_reps)}}number of bootstrap repetitions (only saved for {opt vce(bootstrap)}){p_end} + +{synoptset 20 tabbed}{...} +{p2col 5 20 24 2: Macros}{p_end} +{synopt:{cmd:e(cmd)}}{cmd:leebounds}{p_end} +{synopt:{cmd:e(cmdline)}}command as typed{p_end} +{synopt:{cmd:e(title)}}{cmd:Lee (2009) treatment effect bounds}{p_end} +{synopt:{cmd:e(vce)}}either {opt analytic} or {opt bootstrap}{p_end} +{synopt:{cmd:e(vcetype)}}{cmd:Bootstrap} for {opt vce(bootstrap)}{p_end} +{synopt:{cmd:e(depvar)}}{it:depvar}{p_end} +{synopt:{cmd:e(treatment)}}{it:treatvar}{p_end} +{synopt:{cmd:e(select)}}{it:varname} (only saved for {opt select()}){p_end} +{synopt:{cmd:e(cellsel)}}cell-specific selection pattern, either {opt homo}, or {opt hetero} (only saved for {opt tight()}){p_end} +{synopt:{cmd:e(covariates)}}{it:varlist} (only saved for {opt tight()}){p_end} +{synopt:{cmd:e(trimmed)}}either {opt treatment} or {opt control}{p_end} +{synopt:{cmd:e(wtype)}}either {opt pweight}, {opt fweight}, or {opt iweight} (only saved if weights are specified){p_end} +{synopt:{cmd:e(wexp)}}= {it: exp} (only saved if weights are specified){p_end} +{synopt:{cmd:e(properties)}}{opt b V}{p_end} + +{synoptset 20 tabbed}{...} +{p2col 5 20 24 2: Matrices}{p_end} +{synopt:{cmd:e(b)}}{it:1x2} vector of estimated treatment effect bounds ({it:colnames} are of the form {it: treatvar:lower} and {it: treatvar:upper}){p_end} +{synopt:{cmd:e(V)}}{it:2x2} variance-covariance matrix for estimated treatment effect bounds (covariance set to zero for {opt vce(analytic)}){p_end} + +{synoptset 20 tabbed}{...} +{p2col 5 20 24 2: Functions}{p_end} +{synopt:{cmd:e(sample)}}marks estimation sample{p_end} +{p2colreset}{...} + + +{title:References} + +{pstd} +Heckman, J.J. (1979). Sample Selection Bias as a Specification Error. {it: Econometrica} 47, 153–161. + +{pstd} +Imbens, G.W. and C.F. Manski (2004). Confidence Intervals for Partially Identified Parameters. {it: Econometrica} 72, +1845–1857. + +{pstd} +Lee, D.S. (2009). Training, Wages, and Sample Selection: Estimating Sharp Bounds on Treatment +Effects. {it: Review of Economic Studies} 76, 1071–1102. + + +{title:Also see} + +{psee} +Manual: {manlink R heckman} + +{psee} +{space 2}Help: {manhelp heckman R:heckman}{break} + +{psee} +Online: {helpb bpbounds}, {helpb bpboundsi}, {helpb mhbounds}{p_end} + + +{title:Author} + +{psee} +Harald Tauchmann{p_end} +{psee} +Rheinisch-Westfälisches Institut für Wirtschaftsforschung (RWI){p_end} +{psee} +Essen, Germany{p_end} +{psee} +E-mail: harald.tauchmann@rwi-essen.de +{p_end} + + +{title:Disclaimer} + +{pstd} This software is provided "as is" without warranty of any kind, either expressed or implied. The entire risk as to the quality and +performance of the program is with you. Should the program prove defective, you assume the cost of all necessary servicing, repair or +correction. In no event will the copyright holders or their employers, or any other party who may modify and/or redistribute this software, +be liable to you for damages, including any general, special, incidental or consequential damages arising out of the use or inability to +use the program. +{p_end} + + +{title:Acknowledgements} + +{pstd} +This work has been supported in part by the Collaborative Research Center "Statistical Modelling of +Nonlinear Dynamic Processes" (SFB 823) of the German Research Foundation (DFG). +{p_end} diff --git a/data/ado/l/livreg2.mlib b/data/ado/l/livreg2.mlib new file mode 100644 index 0000000000000000000000000000000000000000..457ac3338bb1d37dfb13c0144707ea1f5141d00b GIT binary patch literal 262968 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 Ym~|!H-mhkz=)*DV)NeTJz@2sf3q55wGynhq literal 0 HcmV?d00001 diff --git a/data/ado/r/ranktest.ado b/data/ado/r/ranktest.ado new file mode 100644 index 0000000..53ccc3d --- /dev/null +++ b/data/ado/r/ranktest.ado @@ -0,0 +1,2676 @@ +*! ranktest 2.0.04 21sept2020 +*! authors mes & fw; KP stat based on code by fk +*! see end of file for version comments + +program define ranktest, rclass sortpreserve + + local lversion 02.0.04 + + if _caller() < 11 { + ranktest9 `0' + return add // otherwise all the ranktest9 results are zapped + return local ranktestcmd ranktest9 + return local cmd ranktest + return local version `lversion' + exit + } + else if _caller() < 13 { + ranktest11 `0' + return add // otherwise all the ranktest11 results are zapped + return local ranktestcmd ranktest11 + return local cmd ranktest + return local version `lversion' + exit + } + + version 13.1 + + if substr("`1'",1,1)== "," { + if "`2'"=="version" { + di in ye "`lversion'" + return local version `lversion' + exit + } + else { + di as err "ranktest error: invalid syntax" + exit 198 + } + } + + // If varlist 1 or varlist 2 have a single element, parentheses optional + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local y `s(varlist)' + local 0 `"`s(rest)'"' + sret clear + } + else { + local y `1' + mac shift 1 + local 0 `"`*'"' + } + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local z `s(varlist)' + local 0 `"`s(rest)'"' + sret clear + } + else { + local z `1' + mac shift 1 + // Need to reinsert comma before options (if any) for -syntax- command to work + local 0 `", `*'"' + } + + // y and z macros created, now ready to parse options + + // Option version ignored here if varlists were provided + syntax [if] [in] [aw fw pw iw/] /// + [, /// + partial(varlist ts fv) /// + NOConstant /// + center /// + wald /// + KP /// default + NOSVD /// override default use of SVD algorithm with KP + JGMM2s /// + Jcue /// + j2lr /// + j2l /// + LR /// for iid case only + small /// small-sample adjustment + jtol(real 1e-10) /// tolerance for change in J; Mata's default for vtol=1e-7 + btol(real 1e-5) /// tolerance for change in beta; Mata's default for ptol=1e-6 + binit(string) /// + NODOTS /// no dots for iterated cue; interchangable with notrace + tracelevel(string) /// trace level for numerical cue; "nodots" >= "none" + NOITERate /// + NOCOMBiter /// + NOCOLLIN /// + NOIID /// force use of robust code + ALLrank /// default + NULLrank /// + FULLrank /// + rr(integer 0) /// rank reduction + NOEVORDER /// overrides default of evorder for jcue and j2lr + NOSTD /// override default behaviour to standardize + kc(real 1e-08) /// adj if var(pihat) singular + maxiter(integer 100) /// + ROBust /// + cluster(varlist) /// + BW(string) /// + kernel(string) /// + Tvar(varname) /// + Ivar(varname) /// + h(name) /// xtabond2-related + hvar(varname) /// xtabond2-related + NOHMAT /// xtabond2-related - force ignore of h + sw /// + psd0 /// + psda /// + version /// + dofminus(integer 0) /// + ] + + + ******************** options *********************** + + // allow lower-case for string options + foreach opt in binit { + local `opt' =strlower("``opt''") + } + + // set flags based on options + local jflag ="`jcue'`j2l'`j2lr'`jgmm2s'"~="" + local jcueflag ="`jcue'"~="" + local j2lflag ="`j2l'"~="" + local j2lrflag ="`j2lr'"~="" + local jgmm2sflag ="`jgmm2s'"~="" + local kpflag ="`kp'"~="" | "`jcue'`j2l'`j2lr'`jgmm2s'"=="" + // h(.) is matrix used for first-step in xtabond2 estimation; relevant only for jgmm2s + local hflag ="`h'`hvar'"~="" & "`nohmat'"=="" + // use SVD for KP unless user specifies nosvd + local svdflag ="`nosvd'"=="" & `kpflag' + local consflag ="`noconstant'"=="" + local evorderflag ="`noevorder'"=="" + // non-invariant tests do not reorder + // nb: j2l and j2lr are invariant for fullrank (rr=1) + if `jgmm2sflag' { + local evorderflag = 0 + } + local stdflag ="`nostd'"=="" + local dotsflag =("`nodots'"=="") + if (`dotsflag'==0) & "`tracelevel'"=="" { + local tracelevel "none" + } + local allrankflag ="`allrank'"~="" + local nullrankflag ="`nullrank'"~="" + local fullrankflag ="`fullrank'"~="" + local iterateflag ="`noiterate'"=="" + local combiterflag ="`nocombiter'"=="" + local collinflag ="`nocollin'"=="" + local centerflag ="`center'"~="" + local smallflag ="`small'"~="" + local LMflag ="`wald'"=="" + local LRflag ="`lr'"~="" + // flag=1 if LIML as EV problem is ever required + local limlflag = `j2lflag' | `j2lrflag' | `svdflag' | "`binit'"=="liml" + + if "`nullrank'`fullrank'`allrank'" == "" { + // default + local allrankflag 1 + } + + // check options + // only 1 stat allowed + local statcount = `kpflag' + `jcueflag' + `j2lflag' + `j2lrflag' + `jgmm2sflag' + if `statcount'>1 { + di as err "ranktest error: incompatible options - `kp' `jcue' `j2l' `j2lr' `jgmm2s'" + exit 198 + } + // incompatible stats + if `LRflag' & ~`LMflag' { + di as err "ranktest error: incompatible options - wald and lr" + exit 198 + } + if "`binit'"~="" & "`binit'"~="liml" & "`binit'"~="2sls" { + di as err "ranktest error: unrecognized option binit(`binit')" + exit 198 + } + if `limlflag' & `hflag' { + di as err "ranktest error: H matrix option h(.) not supported when LIML obtained as an EV solution" + exit 198 + } + + local optct : word count `allrank' `nullrank' `fullrank' + if `optct' > 1 { + di as err "ranktest error: incompatible options `allrank' `nullrank' `fullrank'" + error 198 + } + else if `optct' == 0 { + // Default + local allrank "allrank" + } + + local optct : word count `psd0' `psda' + if `optct' > 1 { + di as err "ranktest error: incompatible options `psd0' `psda'" + error 198 + } + local psd "`psd0' `psda'" + local psd : list retokenize psd + + *********************** end options section ************************ + + marksample touse + markout `touse' `y' `z' `partial' `cluster', strok + + // Note that y or z could be e.g. "y1-y3", so they need to be unab-ed. + // fvunab ylist : `y' + fvexpand `y' if `touse' + local ylist `r(varlist)' + // fvunab zlist : `z' + fvexpand `z' if `touse' + local zlist `r(varlist)' + if "`ylist'"=="" | "`zlist'"=="" { + di as err "ranktest error: missing varlist" + exit 100 + } + if "`partial'"~="" { + // fvunab xlist : `partial' + fvexpand `partial' if `touse' + local xlist `r(varlist)' + } + + // Create tempvars; "rv" for "revar". Note that by revar-ing here, + // subsequent disruption to the sort doesn't matter for TS operators. + fvrevar `ylist' + local rvylist `r(varlist)' + fvrevar `zlist' + local rvzlist `r(varlist)' + fvrevar `xlist' + local rvxlist `r(varlist)' + + // Having created fvrevar tempvars, now remove factor variable base vars from y and z lists. + // Means they won't be reported as dropped collinear variables later. + cap _fv_check_depvar `ylist' + if _rc>0 { + fvstrip `ylist' if `touse', dropomit + local newylist `r(varlist)' + matchnames "`newylist'" "`ylist'" "`rvylist'" + // now replace + local rvylist `r(names)' + local ylist `newylist' + } + cap _fv_check_depvar `zlist' + if _rc>0 { + fvstrip `zlist' if `touse', dropomit + local newzlist `r(varlist)' + matchnames "`newzlist'" "`zlist'" "`rvzlist'" + // now replace + local rvzlist `r(names)' + local zlist `newzlist' + } + + // Stock-Watson and cluster imply robust. + if "`sw'`cluster'" ~= "" { + local robust "robust" + } + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + if "`fsqrt(wf)*(wvar^0.5):*'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "fweight" & "`sw'" != "" { + di in red "fweights currently not supported with -sw- option" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`bw'" !="" { + di in red "iweights not allowed with robust, cluster, AC or HAC" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { + // If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + + // Every time a weight is used, must multiply by scalar wf ("weight factor") + // wf=1 for no weights, fw and iw, wf = scalar that normalizes sum to be N if aw or pw + sum `wvar' if `touse' `wtexp', meanonly + // Weight statement + if "`weight'" ~= "" { + di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + if "`weight'"=="" | "`weight'"=="fweight" | "`weight'"=="iweight" { + // If weight is "", weight var must be column of ones and N is number of rows. + // With fw and iw, effective number of observations is sum of weight variable. + local wf=1 + local N=r(sum_w) + } + else if "`weight'"=="aweight" | "`weight'"=="pweight" { + // With aw and pw, N is number of obs, unadjusted. + local wf=r(N)/r(sum_w) + local N=r(N) + } + else { + // Should never reach here + di as err "ranktest error: misspecified weights" + exit 198 + } +****************************** last flag set here ******************************************************* + // ... since robust macro can be changed by weights + local iidflag = "`robust'`cluster'`kernel'`bw'"=="" & "`noiid'"=="" + + // update other flags based on iidflag + // unchanged: jgmm2sflag, LMflag, LRflag + if `iidflag' { + local svdflag = 0 + local kpflag = 0 + local jcueflag = 0 + local j2lrflag = 0 + local j2lflag = 0 + } + + if `LRflag' & ~`iidflag' { + di as err "LR option not available for robust tests" + exit 198 + } +****************************** last flag set here ******************************************************* + +* HAC estimation. +* If bw is omitted, default `bw' is empty string. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. + if "`bw'" == "" & "`kernel'" == "" { + local bw=0 + } + else { +* Need tvar for markout with time-series stuff +* Data must be tsset for time-series operators in code to work +* User-supplied tvar checked if consistent with tsset + capture tsset + if "`r(timevar)'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } +* If no panel data, ivar will still be empty + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already -tsset-" + exit 5 + } + local tdelta `r(tdelta)' + if "`ivar'"=="" { + qui tsreport if `touse' + } + else { + qui tsreport if `touse', panel + } + if `r(N_gaps)' != 0 { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + +* Check it's a valid kernel and replace with unabbreviated kernel name; check bw. +* Automatic kernel selection allowed by ivreg2 but not ranktest so must trap. +* s_vkernel is in livreg2 mlib. + if "`bw'"=="auto" { +di as err "invalid bandwidth in option bw() - must be real > 0" + exit 198 + } + mata: s_vkernel("`kernel'", "`bw'", "`ivar'") + local kernel `r(kernel)' + local bw = `r(bw)' + } + +* tdelta missing if version 9 or if not tsset + if "`tdelta'"=="" { + local tdelta=1 + } + + if "`sw'"~="" { + capture xtset + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already tsset or xtset" + exit 5 + } +* Exit with error if ivar is neither supplied nor tsset nor xtset + if "`ivar'"=="" { +di as err "Must -xtset- or -tsset- data or specify -ivar- with -sw- option" + exit 198 + } + qui describe, short varlist + local sortlist "`r(sortlist)'" + tokenize `sortlist' + if "`ivar'"~="`1'" { +di as err "Error - dataset must be sorted on panel var with -sw- option" + exit 198 + } + } + +* Create variable used for getting lags etc. in Mata + tempvar tindex + qui gen `tindex'=1 if `touse' + qui replace `tindex'=sum(`tindex') if `touse' + +********** CLUSTER SETUP ********************************************** + +* Mata code requires data are sorted on (1) the first var cluster if there +* is only one cluster var; (2) on the 3rd and then 1st if two-way clustering, +* unless (3) two-way clustering is combined with kernel option, in which case +* the data are tsset and sorted on panel id (first cluster variable) and time +* id (second cluster variable). +* Second cluster var is optional and requires an identifier numbered 1..N_clust2, +* unless combined with kernel option, in which case it's the time variable. +* Third cluster var is the intersection of 1 and 2, unless combined with kernel +* opt, in which case it's unnecessary. +* Sorting on "cluster3 cluster1" means that in Mata, panelsetup works for +* both, since cluster1 nests cluster3. +* Note that it is possible to cluster on time but not panel, in which case +* cluster1 is time, cluster2 is empty and data are sorted on panel-time. +* Note also that if data are sorted here but happen to be tsset, will need +* to be re-tsset after estimation code concludes. + + +// No cluster options or only 1-way clustering +// but for Mata and other purposes, set N_clust vars =0 + local N_clust=0 + local N_clust1=0 + local N_clust2=0 + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`kernel'"~="" { +* kernel requires either that cluster1 is time var and cluster2 is empty +* or that cluster1 is panel var and cluster2 is time var. +* Either way, data must be tsset and sorted for panel data. + if "`cluster2'"~="" { +* Allow backwards order + if "`cluster1'"=="`tvar'" & "`cluster2'"=="`ivar'" { + local cluster1 "`2'" + local cluster2 "`1'" + } + if "`cluster1'"~="`ivar'" | "`cluster2'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset panel & time vars." +di as err " tsset panel var=`ivar'; tsset time var=`tvar'; cluster vars=`cluster1',`cluster2'" + exit 198 + } + } + else { + if "`cluster1'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset time variable." +di as err " tsset time var=`tvar'; cluster var=`cluster1'" + exit 198 + } + } + } +* Simple way to get quick count of 1st cluster variable without disrupting sort +* clusterid1 is numbered 1.._Nclust1. + tempvar clusterid1 + qui egen `clusterid1'=group(`cluster1') if `touse' + sum `clusterid1' if `touse', meanonly + if "`cluster2'"=="" { + local N_clust=r(max) + local N_clust1=`N_clust' + if "`kernel'"=="" { +* Single level of clustering and no kernel-robust, so sort on single cluster var. +* kernel-robust already sorted via tsset. + sort `cluster1' + } + } + else { + local N_clust1=r(max) + if "`kernel'"=="" { + tempvar clusterid2 clusterid3 +* New cluster id vars are numbered 1..N_clust2 and 1..N_clust3 + qui egen `clusterid2'=group(`cluster2') if `touse' + qui egen `clusterid3'=group(`cluster1' `cluster2') if `touse' +* Two levels of clustering and no kernel-robust, so sort on cluster3/nested in/cluster1 +* kernel-robust already sorted via tsset. + sort `clusterid3' `cluster1' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) + } + else { +* Need to create this only to count the number of clusters + tempvar clusterid2 + qui egen `clusterid2'=group(`cluster2') if `touse' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) +* Now replace with original variable + local clusterid2 `cluster2' + } + + local N_clust=min(`N_clust1',`N_clust2') + + } // end 2-way cluster block + } // end cluster block + +****************************** TEST SUBROUTINE ********************************************************** +* Note that bw is passed as a value, not as a string + + mata: s_jstat( /// + "`ylist'", /// original varnames + "`zlist'", /// + "`xlist'", /// + "`rvylist'", /// tempvars for FV or TS operators + "`rvzlist'", /// created using fvrevar + "`rvxlist'", /// + "`wvar'", /// + "`weight'", /// + `wf', /// + `N', /// + `consflag', /// + "`touse'", /// + `iidflag', /// + `LMflag', /// + `LRflag', /// + `kpflag', /// + `svdflag', /// + `jcueflag', /// + `jgmm2sflag', /// + `j2lrflag', /// + `j2lflag', /// + `evorderflag', /// + `stdflag', /// + `dotsflag', /// + "`tracelevel'", /// + `jtol', /// + `btol', /// + "`binit'", /// + `maxiter', /// + `iterateflag', /// + `combiterflag', /// + `collinflag', /// + `kc', /// + "`allrank'", /// + "`nullrank'", /// + "`fullrank'", /// + `rr', /// + "`robust'", /// + "`clusterid1'", /// + "`clusterid2'", /// + "`clusterid3'", /// + `bw', /// + "`tvar'", /// + "`ivar'", /// + "`tindex'", /// + `tdelta', /// + `centerflag', /// + `smallflag', /// + `dofminus', /// + "`kernel'", /// + "`sw'", /// + "`psd'", /// + `hflag', /// + "`h'", /// + "`hvar'" /// + ) + + tempname rkmatrix chi2 df df_r p rank ccorr eval b b0 K1 K2 K3 V S + mat `rkmatrix' = r(rkmatrix) + mat `ccorr' = r(ccorr) + mat `eval' = r(eval) + mat colnames `rkmatrix' = "rk" "df" "p" "rank" "eval" "ccorr" + local ynocollin `r(ynocollin)' + local znocollin `r(znocollin)' + local ycollin `r(ycollin)' + local zcollin `r(zcollin)' + mat `b' = r(b) + mat `b0' = r(b0) + mat `V' = r(V) + mat `S' = r(S) + local depvar `r(depvar)' + local endog `r(endog)' + local exexog `r(exexog)' + scalar `K3' = r(K3) + scalar `K2' = r(K2) + scalar `K1' = r(K1) + +*************************** REPORT RESULTS **************************** + + // report output + di + + // messages saved for later posting in r(.) macros + + // LM (default) or Wald + if `LRflag' { + local testtype "LR" + } + else if `LMflag' { + local testtype "LM" + } + else { + local testtype "Wald" + } + + // iid cases + if `iidflag' { + if `jgmm2sflag' { + local testdesc "2SLS-based (`testtype' version)" + di as text _c "`testdesc'" + } + else if `LRflag' { + local testdesc "Anderson canonical correlations LR" + di in smcl _c "{help ranktest##CCiid:`testdesc'}" + } + else if `LMflag' { + local testdesc "Anderson canonical correlations LM" + di in smcl _c "{help ranktest##CCiid:`testdesc'}" + } + else { + local testdesc "Cragg-Donald Wald" + di in smcl _c "{help ranktest##CDiid:`testdesc'}" + } + } + // non-iid cases + else { + if `kpflag' { + local testdesc "Kleibergen-Paap robust LIML-based (`testtype' version)" + di in smcl _c "{help ranktest##KProbust:`testdesc'}" + } + else if `jcueflag' { + local testdesc "Cragg-Donald robust CUE-based (`testtype' version)" + di in smcl _c "{help ranktest##CDrobust:`testdesc'}" + } + else if `j2lrflag' { + local testdesc "Windmeijer robust J2LR LIML-based (`testtype' version)" + di in smcl _c "{help ranktest##CDrobust:`testdesc'}" + } + else if `j2lflag' { + local testdesc "Windmeijer robust J2L LIML-based (`testtype' version)" + di in smcl _c "{help ranktest##CDrobust:`testdesc'}" + } + else if `jgmm2sflag' { + local testdesc "2-step-GMM-based (`testtype' version)" + di in smcl _c "{help ranktest##CDrobust:`testdesc'}" + } + else { + local testdesc "(internal ranktest error - test name not indicated)" + } + } + // complete the sentence + di as text " test of rank of matrix" + + if "`robust'"~="" & "`kernel'"~= "" & "`cluster'"=="" { + local vcedesc1 " Test statistic robust to heteroskedasticity and autocorrelation" + local vcedesc2 " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`kernel'"~="" & "`cluster'"=="" { + local vcedesc1 " Test statistic robust to autocorrelation" + local vcedesc2 " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`cluster'"~="" { + local vcedesc1 " Test statistic robust to heteroskedasticity and clustering on `cluster'" + if "`kernel'"~="" { + local vcedesc2 " and kernel-robust to common correlated disturbances" + local vcedesc3 " Kernel: `kernel' Bandwidth: `bw'" + } + } + else if "`robust'"~="" { + local vcedesc1 " Test statistic robust to heteroskedasticity" + } + else { + local vcedesc1 " Test consistent for homoskedasticity only" + } + + di as text "`vcedesc1'" + if "`vcedesc2'"~="" { + di as text "`vcedesc2'" + } + if "`vcedesc3'"~="" { + di as text "`vcedesc3'" + } + + local numtests = rowsof(`rkmatrix') + forvalues i=1(1)`numtests' { + di as text "Test of rank=" as res %3.0f `rkmatrix'[`i',4] as text " rk=" as res %8.2f `rkmatrix'[`i',1] /* + */ as text " Chi-sq(" as res %3.0f `rkmatrix'[`i',2] as text ") p-value=" as res %6.4f `rkmatrix'[`i',3] + } + scalar `chi2' = `rkmatrix'[`numtests',1] + scalar `p' = `rkmatrix'[`numtests',3] + scalar `df' = `rkmatrix'[`numtests',2] + scalar `rank' = `rkmatrix'[`numtests',4] + local N `r(N)' + return scalar cons = `consflag' + return scalar df = `df' + return scalar chi2 = `chi2' + return scalar p = `p' + return scalar rank = `rank' + return scalar K3 = `K3' + return scalar K1 = `K1' + return scalar K2 = `K2' + if "`cluster'"~="" { + return scalar N_clust = `N_clust' + } + if "`cluster2'"~="" { + return scalar N_clust1 = `N_clust1' + return scalar N_clust2 = `N_clust2' + } + return scalar N = `N' + return matrix rkmatrix `rkmatrix' + return matrix ccorr `ccorr' + return matrix eval `eval' + if `rr' { + return scalar rr = `rr' + } + + tempname Omega + if `K1' > 1 { + // use ynocollin and znocollin (instead of y and z), in case any collinearities dropped + foreach en of local ynocollin { + // Remove "." from equation name + local en1 : subinstr local en "." "_", all + foreach vn of local znocollin { + local cn "`cn' `en1':`vn'" + } + } + } + else { + foreach vn of local znocollin { + local cn "`cn' `vn'" + } + } + + if `b'[1,1] ~= . { + return matrix b0 `b0' + return matrix b `b' + return matrix V `V' + return matrix S `S' + return local depvar `depvar' + return local endog `endog' + return local exexog `exexog' + } + else if `kpflag' | `iidflag' { + return matrix V `V' + return matrix S `S' + } + else { + return matrix S `S' + } + return local collin `ycollin' `zcollin' + return local partial `xlist' + // return local varlist3 `xlist' + return local varlist2 `zlist' + return local varlist1 `ylist' + + return local vcedesc3 `vcedesc3' + return local vcedesc2 `vcedesc2' + return local vcedesc1 `vcedesc1' + return local testdesc `testdesc' + + local method `kp' `jcue' `j2l' `j2lr' `jgmm2s' + local method : list clean method + + return local small `small' + return local testtype `testtype' + return local method `method' + return local ranktestcmd ranktest + return local cmd ranktest + return local version `lversion' +end + + +// internal version of fvstrip 1.01 ms 24march2015 +// takes varlist with possible FVs and strips out b/n/o notation +// returns results in r(varnames) +// optionally also omits omittable FVs +// expand calls fvexpand either on full varlist +// or (with onebyone option) on elements of varlist +program define fvstrip, rclass + version 11.2 + syntax [anything] [if] , [ dropomit expand onebyone NOIsily ] + if "`expand'"~="" { // force call to fvexpand + if "`onebyone'"=="" { + fvexpand `anything' `if' // single call to fvexpand + local anything `r(varlist)' + } + else { + foreach vn of local anything { + fvexpand `vn' `if' // call fvexpand on items one-by-one + local newlist `newlist' `r(varlist)' + } + local anything : list clean newlist + } + } + foreach vn of local anything { // loop through varnames + if "`dropomit'"~="" { // check & include only if + _ms_parse_parts `vn' // not omitted (b. or o.) + if ~`r(omit)' { + local unstripped `unstripped' `vn' // add to list only if not omitted + } + } + else { // add varname to list even if + local unstripped `unstripped' `vn' // could be omitted (b. or o.) + } + } +// Now create list with b/n/o stripped out + foreach vn of local unstripped { + local svn "" // initialize + _ms_parse_parts `vn' + if "`r(type)'"=="variable" & "`r(op)'"=="" { // simplest case - no change + local svn `vn' + } + else if "`r(type)'"=="variable" & "`r(op)'"=="o" { // next simplest case - o.varname => varname + local svn `r(name)' + } + else if "`r(type)'"=="variable" { // has other operators so strip o but leave . + local op `r(op)' + local op : subinstr local op "o" "", all + local svn `op'.`r(name)' + } + else if "`r(type)'"=="factor" { // simple factor variable + local op `r(op)' + local op : subinstr local op "b" "", all + local op : subinstr local op "n" "", all + local op : subinstr local op "o" "", all + local svn `op'.`r(name)' // operator + . + varname + } + else if"`r(type)'"=="interaction" { // multiple variables + forvalues i=1/`r(k_names)' { + local op `r(op`i')' + local op : subinstr local op "b" "", all + local op : subinstr local op "n" "", all + local op : subinstr local op "o" "", all + local opv `op'.`r(name`i')' // operator + . + varname + if `i'==1 { + local svn `opv' + } + else { + local svn `svn'#`opv' + } + } + } + else if "`r(type)'"=="product" { + di as err "fvstrip error - type=product for `vn'" + exit 198 + } + else if "`r(type)'"=="error" { + di as err "fvstrip error - type=error for `vn'" + exit 198 + } + else { + di as err "fvstrip error - unknown type for `vn'" + exit 198 + } + local stripped `stripped' `svn' + } + local stripped : list retokenize stripped // clean any extra spaces + + if "`noisily'"~="" { // for debugging etc. +di as result "`stripped'" + } + + return local varlist `stripped' // return results in r(varlist) +end + + +// Internal version of matchnames +// Sample syntax: +// matchnames "`varlist'" "`list1'" "`list2'" +// takes list in `varlist', looks up in `list1', returns entries in `list2', called r(names) +program define matchnames, rclass + version 11.2 + args varnames namelist1 namelist2 + + local k1 : word count `namelist1' + local k2 : word count `namelist2' + + if `k1' ~= `k2' { + di as err "namelist error" + exit 198 + } + foreach vn in `varnames' { + local i : list posof `"`vn'"' in namelist1 + if `i' > 0 { + local newname : word `i' of `namelist2' + } + else { +* Keep old name if not found in list + local newname "`vn'" + } + local names "`names' `newname'" + } + local names : list clean names + return local names "`names'" +end + +* Adopted from -canon- +program define GetVarlist, sclass + version 11.2 + sret clear + gettoken open 0 : 0, parse("(") + if `"`open'"' != "(" { + error 198 + } + gettoken next 0 : 0, parse(")") + while `"`next'"' != ")" { + if `"`next'"'=="" { + error 198 + } + local list `list'`next' + gettoken next 0 : 0, parse(")") + } + sret local rest `"`0'"' + tokenize `list' + local 0 `*' + sret local varlist "`0'" +end + +********************* EXIT IF STATA VERSION < 13 ******************************** + +* When do file is loaded, exit here if Stata version calling program is < 12. +* Prevents loading of rest of program file (would cause e.g. Stata 10 to crash at Mata). + +if c(stata_version) < 13 { + exit +} + +******************** END EXIT IF STATA VERSION < 13 ***************************** + +******************************************************************************* +*************************** BEGIN MATA CODE *********************************** +******************************************************************************* + +version 13.1 +mata: + +// ********* MATA CODE SHARED BY ivreg2 AND ranktest *************** // +// ********* 1. struct ms_vcvorthog *************** // +// ********* 2. m_omega *************** // +// ********* 3. m_calckw *************** // +// ********* 4. s_vkernel *************** // +// *********************************************************************** // + +// For reference: +// struct ms_vcvorthog { +// string scalar ename, Znames, touse, weight, wvarname +// string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel +// string scalar sw, psd, ivarname, tvarname, tindexname +// real scalar wf, N, bw, tdelta, dofminus +// real scalar center +// real matrix ZZ +// pointer matrix e +// pointer matrix Z +// pointer matrix wvar +// } + +struct ms_jresult { + real scalar j + real matrix beta + real matrix beta0 + real scalar pvalue + real scalar df + real matrix V + real matrix S +} + +struct ms_jargs { + pointer matrix pvy1 + pointer matrix pvy2 + pointer matrix py1 + pointer matrix py2 + pointer matrix pz + pointer matrix pz_kron + real scalar K1 + real scalar K2 + real scalar ii + real scalar kk + real matrix Qzz + real matrix Qzz_kron + real matrix Qzy1 + real matrix Qzy2 + real scalar N + real scalar Nminus + real scalar hflag + real matrix Hmat + real matrix hvar + real matrix info + real matrix sigma2 + real scalar btol + real scalar jtol + real scalar maxiter + string scalar tracelevel + real scalar dotsflag +} + +void s_jstat( + string scalar ylist, // tokens with original varnames + string scalar zlist, // can include TS or FV operators + string scalar xlist, // X = to be partialled-out + string scalar rvylist, // TS or FV vars replaced with temps + string scalar rvzlist, // using fvrevar + string scalar rvxlist, + string scalar wvarname, + string scalar weight, + scalar wf, + scalar N, + scalar cons, + string scalar touse, + scalar iidflag, + scalar LMflag, + scalar LRflag, + scalar kpflag, + scalar svdflag, + scalar jcueflag, + scalar jgmm2sflag, + scalar j2lrflag, + scalar j2lflag, + scalar evorderflag, + scalar stdflag, + scalar dotsflag, + string scalar tracelevel, + scalar jtol, + scalar btol, + string scalar binit, + scalar maxiter, + scalar iterateflag, + scalar combiterflag, + scalar collinflag, + scalar kc, + string scalar allrank, + string scalar nullrank, + string scalar fullrank, + scalar rr, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + bw, + string scalar tvarname, + string scalar ivarname, + string scalar tindexname, + tdelta, + scalar centerflag, + scalar smallflag, + dofminus, + string scalar kernel, + string scalar sw, + string scalar psd, + scalar hflag, + string scalar hname, + string scalar hvarname + ) +{ + + // tokens with original variable names + ytokens=tokens(ylist) + ztokens=tokens(zlist) + xtokens=tokens(xlist) + + // tokens with names of variables to use + // TS or FV variables replaced with temps using fvrevar + rvytokens=tokens(rvylist) + rvztokens=tokens(rvzlist) + rvxtokens=tokens(rvxlist) + + // create views on original data for Y, Z and X, as well as touse and weight var + st_view(ynopartial=.,.,rvytokens,touse) + st_view(znopartial=.,.,rvztokens,touse) + if (partial~="") { + st_view(x=.,.,rvxtokens,touse) + } + st_view(mtouse=.,.,tokens(touse),touse) + st_view(wvar=.,.,tokens(wvarname),touse) + noweight=(st_vartype(wvarname)=="byte") + + // Partial out the X variables. + // Result is y and z after transformation. + // y and z are data matrices created in Mata, not views on Stata data. + // Note that this includes demeaning if there is a constant, + // i.e., variables are centered. + // Note that we use wf*wvar instead of wvar + // because wvar is raw weighting variable and + // wf*wvar normalizes so that sum(wf*wvar)=N. + P = cols(x) // count of vars to be partialled out (excluding constant) + if (cons & P>0) { // Vars to partial out including constant + ymeans = mean(ynopartial,wf*wvar) + zmeans = mean(znopartial,wf*wvar) + xmeans = mean(x,wf*wvar) + Qxy = quadcrossdev(x, xmeans, wf*wvar, ynopartial, ymeans)*1/N + Qxz = quadcrossdev(x, xmeans, wf*wvar, znopartial, zmeans)*1/N + Qxx = quadcrossdev(x, xmeans, wf*wvar, x, xmeans)*1/N + } + else if (!cons & P>0) { // Vars to partial out NOT including constant + Qxy = quadcross(x, wf*wvar, ynopartial)*1/N + Qxz = quadcross(x, wf*wvar, znopartial)*1/N + Qxx = quadcross(x, wf*wvar, x)*1/N + } + else { // Only constant to partial out = demean + ymeans = mean(ynopartial,wf*wvar) + zmeans = mean(znopartial,wf*wvar) + } + // Partial-out coeffs. Default Cholesky; use QR if not full rank and collinearities present. + // Not necessary if no vars other than constant. + rankxx = 0 + if (P>0) { + by = cholqrsolve(Qxx, Qxy, rankxx) // also updates rankxx with rank of (demeaned) X'X + bz = cholqrsolve(Qxx, Qxz) + } + // Replace with residuals + if (cons & P>0) { // Vars to partial out including constant + y = (ynopartial :- ymeans) - (x :- xmeans)*by + z = (znopartial :- zmeans) - (x :- xmeans)*bz + } + else if (!cons & P>0) { // Vars to partial out NOT including constant + y = ynopartial - x*by + z = znopartial - x*bz + } + else if (cons) { // Only constant to partial out = demean + y = (ynopartial :- ymeans) + z = (znopartial :- zmeans) + } + else { // no transformations required + y = ynopartial + z = znopartial + } + + // standardize here + // nb - variance formula uses N-1 + if (stdflag) { + sy = sqrt(diagonal(quadvariance(y))) + sy = sy+(sy:==0) + sz = sqrt(diagonal(quadvariance(z))) + sz = sz+(sz:==0) + + y = y :/ (sy') + z = z :/ (sz') + } + + yy = quadcross(y, wf*wvar, y) // may need this for vcvo + Qyy = yy * 1/N + iQyy = invsym(Qyy) + + // check for collinearities and adjust if necessary + if (diag0cnt(iQyy) & collinflag) { + yvarkeep = selectindex(diagonal(iQyy)') + yvardrop = selectindex(diagonal(iQyy)':==0) + ykeeptokens = ytokens[yvarkeep] + ydroptokens = ytokens[yvardrop] + printf("collinearities detected - dropping %s\n",invtokens(ydroptokens)) + y = y[.,yvarkeep] + Qyy = Qyy[yvarkeep',yvarkeep] + iQyy = iQyy[yvarkeep',yvarkeep] + if (stdflag) { + sy = sy[yvarkeep'] + } + } + else { + ykeeptokens = ytokens + } + zz = quadcross(z, wf*wvar, z) // need this for vcvo + Qzz = zz * 1/N + iQzz = invsym(Qzz) + // check for collinearities and adjust if necessary + if (diag0cnt(iQzz) & collinflag) { + zvarkeep = selectindex(diagonal(iQzz)') + zvardrop = selectindex(diagonal(iQzz)':==0) + zkeeptokens = ztokens[zvarkeep] + zdroptokens = ztokens[zvardrop] + printf("collinearities detected - dropping %s\n",invtokens(zdroptokens)) + z = z[.,zvarkeep] + zz = zz[zvarkeep',zvarkeep] + Qzz = Qzz[zvarkeep',zvarkeep] + iQzz = iQzz[zvarkeep',zvarkeep] + if (stdflag) { + sz = sz[zvarkeep'] + } + } + else { + zkeeptokens = ztokens + } + + // Check for collinearities within [Y Z]. + // Allowed if e.g. Y includes exogenous vars and therefore they appear in Z as well. + // Minimum rank is #zeros in the inverse of the combined cross-product matrix. + // If no collinearities, minrank = 0. + if (collinflag) { + yzzy = quadcross((y,z), wf*wvar, (y,z)) + Qyzzy = yzzy * 1/N + iQyzzy = invsym(Qyzzy) + minrank = diag0cnt(iQyzzy) + if (minrank>0) { + yzvarcollin = selectindex(diagonal(iQyzzy)':==0) + yzexogtokens = (ykeeptokens, zkeeptokens)[yzvarcollin] + printf("{txt}collinearities detected between varlists, including: %s\n",invtokens(yzexogtokens)) + printf("{txt}implies minimum matrix rank = %f\n",minrank) + } + } + else { + minrank = 0 + } + + // minrank > 0 supported for iid, jcue, jgmm2s, and kp+svd + // not supported for non-iid case with j2l, j2lr and kp+nosvd + if ((minrank>0) & !(iidflag)) { + if ( /// + (j2lflag) | /// + (j2lrflag) | /// + ((kpflag) & !(svdflag)) /// + ) { + printf("{err}exogenous variables in matrix not supported with options j2l, j2lr and kp+nosvd\n") + exit(198) + } + } + + // Now that collinearities are removed, check if cols(Y)>cols(Z) and switch if yes. + // switchflag = 1 if z and y are switched, =0 otherwise + if (cols(z) >= cols(y)) { + // standard case + switchflag=0 + py=&y + pz=&z + } + else { + // switch y and z + switchflag=1 + py=&z + pz=&y + // memory reqs small so no need to use pointers + y_zz = zz + y_Qzz = Qzz + y_iQzz = iQzz + y_sz = sz + y_zkeeptokens = zkeeptokens + y_zdroptokens = zdroptokens + zz = yy + Qzz = Qyy + iQzz = iQyy + sz = sy + zkeeptokens = ykeeptokens + zdroptokens = ydroptokens + yy = y_zz + Qyy = y_Qzz + iQyy = y_iQzz + sy = y_sz + ykeeptokens = y_zkeeptokens + ydroptokens = y_zdroptokens + } + K1=cols(*py) // count of vars in first varlist + K2=cols(*pz) // count of vars in second varlist + + maxrank=min((K1,K2)) // max possible rank (should be K1) + if (maxrank!=K1) { + printf("{err}internal ranktest error: maxrank does not match K1\n") + exit(3000) + } + if (minrank==maxrank) { + printf("{err}internal ranktest error: minrank=maxrank; may be caused by collinearities\n") + exit(3000) + } + K3=rankxx+cons // number of partialled-out vars including constant + + // Now that Z and Y are decided... + Qzy = quadcross(*pz, wf*wvar, *py) * 1/N + // Initialize ehat column vector for later use; don't use N since that may be fweighted. + ehat = J(rows(y),K1,0) + + // special treatment for xtabond2-type first-step H matrix + // first check if special treatment is necessary - if H is identity matrix, can ignore + if (hflag) { + Hmat = st_matrix(hname) + if (Hmat==I(rows(Hmat))) { + // reset hflag since special treatment no longer needed + hflag=0 + } + } + + if (hflag) { + // ivar is panel identifier + // hvar has row/col index for Hmat matrix + // note that data should be sorted on ivar but need not be sorted on tvar + st_view(ivar=.,.,ivarname,touse) + st_view(hvar=.,.,hvarname,touse) + info = panelsetup(ivar, 1) + zHz = makesymmetric(hcross(*pz,*pz,Hmat,hvar,wvar,info)) + QzHz = zHz * 1/N + iQzHz = invsym(QzHz) + // "G" is inverse of H + // not in use until SVD/LIML/KP support is added for hmat option + // yGy = makesymmetric(hcross(*py,*py,Hmat,hvar,wvar,info,"invert")) + // QyGy = yGy * 1/N + // iQyGy = invsym(QyGy) + } + + // Needed for KP or for reporting canonical corr + if ((kpflag) | (iidflag)) { + rQyy = cholesky(Qyy) + rQzz = cholesky(Qzz) + irQyy = luinv(rQyy') + irQzz = luinv(rQzz') + } + // not in use until SVD/LIML/KP support is added for hmat option + // else if ((svdflag) & (hflag)) { + // zHz = makesymmetric(hcross(*pz,*pz,Hmat,hvar,wvar,info)) + // yGy = makesymmetric(hcross(*py,*py,Hmat,hvar,wvar,info,"invert")) + // rQyy = cholesky(yGy*1/N) + // rQzz = cholesky(zHz*1/N) + // irQyy = luinv(rQyy') + // irQzz = luinv(rQzz') + //} + + // eigenvalues and reordering + // If iid and canonical correlations, no reordering needed. Use m_evorder to get eigenvalues. + // If iid and jgmm2s, no reordering needed. Use m_evorder to get eigenvalues. + // If SVD (KP, robust), no reordering. Use SVD to get eigenvalues. + // In all other cases, reorder. Use m_evorder. + if (iidflag & !jgmm2sflag) { + // override evorder setting + evorderflag = 0 + } + if (svdflag) { + // override evorder setting + evorderflag = 0 + } + + if (svdflag==0) { + // KP using SVD handled separately + // note that currently hflag=1 implies svdflag=0 and KP enters here + // need phil to get liml coefs + // also need canonical correlations and/or for ordering by eigenvalue + // m_evorder uses symeigensystem(.) and places values in args + // ind has the ordering + eval = . + ccorr = . + ind = . + phil = . + if (hflag) { + m_evorder(Qyy,iQyy,QzHz,iQzHz,Qzy,eval,ccorr,ind,phil) + } + else { + m_evorder(Qyy,iQyy,Qzz,iQzz,Qzy,eval,ccorr,ind,phil) + } + + // order all objects with y by eigenvalue + if (evorderflag) { + (*py)[.,.] = (*py)[.,ind] + Qzy[.,.] = Qzy[.,ind] + Qyy[.,.] = Qyy[ind,ind] + iQyy[.,.] = iQyy[ind,ind] + phil = phil[ind,.] + if (stdflag) { + sy = sy[ind,1] + } + } + } + else { + // default ind = (1, 2, 3) so selection does nothing + ind = runningsum(J(rows(Qyy),1,1))' + } + + // initialize struct used for getting vcv of moment conditions + // only thing that changes in each use is vcvo.e, the NxK matrix for resids + struct ms_vcvorthog scalar vcvo + vcvo.touse = touse + vcvo.center = centerflag + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = zz + vcvo.Z = pz // pz is pointer to z + vcvo.wvar = &wvar + + // what if pihat is rank-deficient? + // below uses QR if Cholesky fails + pihat = cholqrsolve(Qzz, Qzy) + if (LMflag) { + vhat = *py + } + else { + vhat = *py-(*pz)*pihat + } + vecpi = vec(pihat) + zz_kron = I(K1) # zz + Qzz_kron = I(K1) # Qzz + + // small-sample correction in final calculation of statistic + if ((!smallflag) | (LRflag)) { + // never any small-sample correction for LR + Nminus = N + } + else if ((smallflag) & (LMflag)) { + // LM subtracts number of exogenous regressors + Nminus = N - K3 + } + else if ((smallflag) & (!LMflag)) { + // Wald subtracts number of instruments including exogenous regressors + Nminus = N - K3 - max((K2,K1)) + } + else { + printf("{err}internal ranktest error in small-sample adjustment\n") + exit(3000) + } + + // obtain VCV y matrix as "residuals" + vcvo.e = &vhat + shat0 = m_omega(vcvo) // called ome0 in FW code; FW does not normalise by N. + ishat0 = invsym(shat0) + + // needed only for cue and j2lr + if ((jcueflag) | (j2lrflag)) { + ivarpi0 = makesymmetric(Qzz_kron*ishat0*Qzz_kron) + if (diag0cnt(ishat0) & (jcueflag) & (iterateflag)) { + // not full rank, add kc*I; default kc=1e-08 + printf("{txt}\nwarning - var(pihat) singular; adjusting by %-7.1e*I(K2)\n",kc) + ishat0kc = cholinv(shat0+kc*I(cols(shat0))) + // use adjusted shat0 to get ivarpi0 + ivarpi0kc = makesymmetric(Qzz_kron*ishat0kc*Qzz_kron) + } + else { + // no adjustment to shat0 needed + // note that by using z'z/N, ivarpi0 doesn't explode as N gets big + ivarpi0kc = ivarpi0 + } + } + + // needed only for KP statistic using SVD + // eigenvalues and canonical correlations also obtained here + if (svdflag) { + kpthat = rQzz' * pihat * irQyy + // note that fullsvd inserts vt = v' into the 4th argument + fullsvd(kpthat, kpu, kpcc, kpvt) + ccorr = kpcc' + eval = ccorr:^2 + } + + if ((kpflag) | (iidflag)) { + // KP variance + kpvar = (irQyy'#irQzz')*shat0*(irQyy'#irQzz')' + _makesymmetric(kpvar) + if ((LMflag==0) & (iidflag)) { + // Homoskedastic iid Wald case means vcv has block-diag identity matrix structure. + // Enforce this by setting ~0 entries to 0. + kpvar = kpvar :* (J(K1,K1,1)#I(K2)) + } + else if (iidflag) { + // Homoskedastic iid LM case means vcv is identity matrix. + kpvar = I(rows(kpvar)) + } + } + + // for collecting test stats + if (rr>0) { + firstrank=maxrank-rr + lastrank=maxrank-rr + // check that rr is legal; must be >=1 and <= min(K1,K2). minrank is > 0 if Y and Z share (exogenous) variables + if ( (rr<1) | (rr>maxrank) ) { + printf("{err}error: rank reduction rr(.) option must lie in range 1 <= rr <= min(K1,K2)\n") + exit(198) + } + if (minrank>firstrank) { + printf("{err}error: rank reduction rr(.) option inconsistent with specified included exogenous variables\n") + exit(198) + } + } + else if (allrank~="") { + firstrank=minrank + lastrank=maxrank-1 + } + else if (nullrank~="") { + firstrank=minrank + lastrank=0 + } + else if (fullrank~="") { + firstrank=maxrank-1 + lastrank=maxrank-1 + } + else { + // should never reach this point + printf("ranktest error\n") + exit + } + // set rr if rr not supplied (so rr=0) and if a single rank reduction test is in effect requested + if (rr==0) { + if (firstrank==lastrank) { + rr = maxrank-firstrank + } + } + // where results will go; rkrow tracks the row + rkmatrix=J(lastrank-firstrank+1,6,.) + rkrow = 1 + struct ms_jresult scalar r + // save beta if (1) using J and not SVD or canonical correlations; + // (2) only one rank reduction being tested; + // (3) beta is calculated in the non-iid code + betaflag = 0 + if ((jcueflag==1) | (jgmm2sflag==1) | ((kpflag) & !(svdflag))) { + if ((firstrank==lastrank) & (firstrank>0)) { + betaflag = 1 + } + } + + //************ BEGIN TESTS *****************// + + if (iidflag & !jgmm2sflag) { + // block for iid case and canonical-correlations-based tests + // requires only eigenvalues to get LM, Wald and LR versions + // works for Anderson LM and LR, CD Wald, LIML-based but not IV-based tests + + // transformed eigenvalues + evalt = eval :/ (1 :- eval) + // test is based on sum of minimum EVs or sum of log(1-EV) + // so create a single complete vector of running sums and from that a vector of test stats + // note that dofminus also needs to be used (since m_omega and shat are not used) + if (LRflag) { + // LR uses original EVs + lrsum = -runningsum(ln(1:-sort(eval',1)')) + jrow = (Nminus-dofminus)*lrsum + } + else if (LMflag) { + // LM uses original EVs + jrow = (Nminus-dofminus)*runningsum(sort(eval',1)') + } + else { + // Wald uses transformed EVs + jrow = (Nminus-dofminus)*runningsum(sort(evalt',1)') + } + jrow = sort(jrow',-1)' + + for (ii=firstrank+1; ii<=lastrank+1; ii++) { + + rrank = diag0cnt(iQzz)*(K1-ii+1) + if (rrank) { + printf("{txt}warning - rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,ii-1) + } + + j = jrow[ii] + df = (K2-ii+1)*(K1-ii+1) + pvalue = chi2tail(df,j) + rkmatrix[rkrow,1] = j + rkmatrix[rkrow,2] = df + rkmatrix[rkrow,3] = pvalue + rkmatrix[rkrow,4] = ii-1 + rkmatrix[rkrow,5] = eval[ii] + rkmatrix[rkrow,6] = ccorr[ii] + rkrow++ + } + } + + else { + // block for robust and jgmm2s-based tests + + // initialize struct with arguments for j subroutines + struct ms_jargs scalar jargs + jargs.K1 = K1 + jargs.K2 = K2 + jargs.Qzz = Qzz + jargs.pz = pz + jargs.N = N + jargs.Nminus = Nminus + jargs.btol = btol + jargs.jtol = jtol + jargs.tracelevel = tracelevel + jargs.maxiter = maxiter + jargs.dotsflag = dotsflag + jargs.hflag = hflag + if (hflag) { + jargs.Hmat = Hmat + jargs.hvar = hvar + jargs.info = info + } + + // test H0:rank=0; works for all stats + if (firstrank==0) { + + // get J + eit = vec(Y=*py) + z_kron = I(K1) # (*pz) + // need to stack weights + // need W=wvar to avoid "view found where array required" error + gbar = quadcross(z_kron, wf*(J(K1,1,1) # (W=wvar)), eit) * 1/N + j = gbar' * ishat0 * gbar * Nminus + + rrank = diag0cnt(ishat0) + if (rrank) { + printf("{txt}\nwarning - avar rank reduction=%f in test of rank=0; adjusting df of test\n",rrank) + } + + // store results in row 1 of rkmatrix + df = K2*K1 - rrank + pvalue = chi2tail(df,j) + rkmatrix[rkrow,1] = j + rkmatrix[rkrow,2] = df + rkmatrix[rkrow,3] = pvalue + rkmatrix[rkrow,4] = 0 // H0:rank=0 + rkmatrix[rkrow,5] = eval[rkrow] + rkmatrix[rkrow,6] = ccorr[rkrow] + rkrow++ // increment row counter for next time through the loop + + firstrank=1 // increment firstrank so loops below starts in the right place + + } + + // test ranks in reverse order + // blocks for: iid, iterated CUE, numeric CUE, j2lr, j2l and 2-step GMM + for (kk=firstrank; kk<=lastrank; kk++) { + // loops through endogenous variables including dep var; index called rr in FW code + // loops in reverse, collecting tests of rank=1 up to rank=K1-1 + // naming: + // y is all endog after partialling; doesn't change; #cols=K1; called xx in FW code + // z is all IVs after partialling; doesn't change; #cols=K2; called z in FW code + // y1 is cols 1 to ii of y; loop through; called y in FW code + // y2 is cols ii+1 to K1 of y; loop through; called x in FW code + // ii is cols of y1; called rr in FW code + // kk is cols of y2; called kx in FW code + + ii = K1 - kk + // submatrices + vy1 = vhat[.,(1..ii)] + vy2 = vhat[|1,(ii+1) \ .,.|] + y1 = (*py)[.,(1..ii)] + y2 = (*py)[|1,(ii+1) \ .,.|] + Qzy1 = Qzy[|1,1 \ .,ii|] + Qzy2 = Qzy[|1,(ii+1) \ .,.|] + // z_kron called zz in FW code + z_kron = I(ii) # (*pz) + // zz_kron = quadcross(z_kron, z_kron) + // expression for zz_kron is zz'zz in FW code + Qzz_kron = I(ii) # Qzz + + // prepare pointers; pointer to z already exists + pvy1 = &vy1 + pvy2 = &vy2 + py1 = &y1 + py2 = &y2 + pz_kron = &z_kron + + // don't need to initialize e, just need to make conformable + vcvo.e = &ehat[.,(1..ii)] + + // update struct with args for j subroutines + jargs.pvy1 = pvy1 + jargs.pvy2 = pvy2 + jargs.py1 = py1 + jargs.py2 = py2 + jargs.pz_kron = pz_kron + jargs.Qzz_kron = Qzz_kron + jargs.Qzy1 = Qzy1 + jargs.Qzy2 = Qzy2 + jargs.ii = ii + jargs.kk = kk + + if (iidflag) { // iid J stat is LIML or Sargan/IV + if (binit=="liml") { + b0 = -phil[ii+1::K1,1::ii]*luinv(phil[1::ii,1::ii]) + } + else { + // initial b0 = 2sls + b0 = invsym(Qzy2' * iQzz * Qzy2) * Qzy2' * iQzz * Qzy1 + } + r = m_jiid(jargs,vcvo,b0) + } + else if ((kpflag) & (svdflag)) { // KP and SVD algorithm + // note we call with kpv = kpvt' + // nb: SVD not yet supported with Hmat + r = m_svd(jargs,kpthat,kpu,kpvt',kpvar) + } + else if (kpflag) { // KP using J-type algorithm + // nb: LIML not yet supported with Hmat + bliml = -phil[ii+1::K1,1::ii]*luinv(phil[1::ii,1::ii]) + r = m_kp(jargs,vcvo,bliml) + } + else if ((jcueflag) & (iterateflag)) { // J CUE using iterative algorithm + if (binit=="liml") { + // initial b0 = liml + b0 = -phil[ii+1::K1,1::ii]*luinv(phil[1::ii,1::ii]) + } + else if (hflag) { + // initial b0 = 2sls with Hmat matrix + b0 = invsym(Qzy2' * iQzHz * Qzy2) * Qzy2' * iQzHz * Qzy1 + } + else { + // initial b0 = 2sls + b0 = invsym(Qzy2' * iQzz * Qzy2) * Qzy2' * iQzz * Qzy1 + } + // iterated CUE uses possibly-adjusted ivarpi0kc + r = m_jcueiter(jargs,vcvo,ivarpi0kc,vecpi,b0) + // finish off with call to numerical maximizer + if (combiterflag) { + printf("{txt}Switching to numerical maximization...") + b0 = r.beta + r = m_jcuenum(jargs,vcvo,b0) + } + } + else if (jcueflag) { // J CUE using numerical maximization + if (binit=="liml") { + // initial b0 = liml + b0 = -phil[ii+1::K1,1::ii]*luinv(phil[1::ii,1::ii]) + } + else if (hflag) { + // initial b0 = 2sls with Hmat matrix + b0 = invsym(Qzy2' * iQzHz * Qzy2) * Qzy2' * iQzHz * Qzy1 + } + else { + // initial b0 = 2sls + b0 = invsym(Qzy2' * iQzz * Qzy2) * Qzy2' * iQzz * Qzy1 + } + r = m_jcuenum(jargs,vcvo,b0) + } + else if (j2lflag) { // J2L + bliml = -phil[ii+1::K1,1::ii]*luinv(phil[1::ii,1::ii]) + r = m_j2l(jargs,vcvo,bliml) + } + else if (j2lrflag) { // J2LR = iterated cue with b0=liml and maxiter=1 + bliml = -phil[ii+1::K1,1::ii]*luinv(phil[1::ii,1::ii]) + jargs.maxiter = 1 + r = m_jcueiter(jargs,vcvo,ivarpi0kc,vecpi,bliml) + } + else { // J from 2-step GMM + if (hflag) { + biv = invsym(Qzy2' * iQzHz * Qzy2) * Qzy2' * iQzHz * Qzy1 + } + else { + biv = invsym(Qzy2' * iQzz * Qzy2) * Qzy2' * iQzz * Qzy1 + } + r = m_jgmm2s(jargs,vcvo,biv) + } + + // store stats in appropriate row of rkmatrix + rkmatrix[rkrow,1] = r.j + rkmatrix[rkrow,2] = r.df + rkmatrix[rkrow,3] = r.pvalue + rkmatrix[rkrow,4] = kk // H0:rank=kk + rkmatrix[rkrow,5] = eval[kk+1] + rkmatrix[rkrow,6] = ccorr[kk+1] + rkrow++ // increment row counter for next time through the loop + + } + + } + + // single test of rank reduction and using J so beta exists + if (betaflag) { + + // betas from last test of rank + beta0 = r.beta0 + beta = r.beta + V = r.V + S = r.S + + // if standardization is used, need to unstandardize coefs, V and S + if (stdflag) { + sy1 = (J(rr,K1-rr,1) :* sy[1..rr,1])' + sy2 = J(K1-rr,rr,1) :* sy[(rr+1)..K1,1] + sy1_sy2 = sy1 :/ sy2 + beta0 = beta0 :* sy1_sy2 + beta = beta :* sy1_sy2 + V = V :* (vec(sy1_sy2) * vec(sy1_sy2)') + _makesymmetric(V) + S = S :* (((sy[1..rr,1]) # sz)*((sy[1..rr,1]) # sz)') + _makesymmetric(S) + } + + // for labelling beta if EV ordering has been used + if (evorderflag) { + // selection indexes (row vectors) + ind1 = ind[1,1..rr] + ind2 = ind[1,(rr+1)..K1] + } + else { + // selection indexes (row vectors): e.g. (1, 2, 3) and (4, 5, 6) + ind1 = runningsum(J(rr,1,1))' + ind2 = runningsum(J(K1-rr,1,1))' :+ rr + } + + // label beta vector/matrix + // here, depvar and endog are vectors + depvar = ykeeptokens[.,ind1] + endog = ykeeptokens[.,ind2] + // Stata standard is coef vectors (will transpose below) + beta = vec(beta) + beta0 = vec(beta0) + if (cols(depvar)==1) { + // single equation, no eqn stripe needed + bstripe = J(cols(endog),1,""), endog' + sstripe = J(cols(zkeeptokens),1,""), zkeeptokens' + } + else { + bstripe = J(0,2,"") + sstripe = J(0,2,"") + for (kk=1;kk<=cols(depvar);kk++) { + for (ll=1;ll<=cols(endog);ll++) { + bstripe = bstripe \ ( invtokens(depvar[1,kk]), invtokens(endog[1,ll])) + } + for (ll=1;ll<=cols(zkeeptokens);ll++) { + sstripe = sstripe \ ( invtokens(depvar[1,kk]), invtokens(zkeeptokens[1,ll])) + } + } + } + // now make them into tokens so they can be saved as Stata macros + depvar = invtokens(depvar) + endog = invtokens(endog) + exexog = invtokens(zkeeptokens) + } + else if ((kpflag) | (iidflag)) { + V = kpvar + S = shat0 + if (stdflag) { + S = S :* ((sy # sz)*(sy # sz)') + _makesymmetric(S) + } + // evorder may have changed order of y + ylist = ykeeptokens[.,ind] + if (cols(depvar)==1) { + // single equation, no eqn stripe needed + sstripe = J(cols(zkeeptokens),1,""), zkeeptokens' + } + else { + sstripe = J(0,2,"") + for (kk=1;kk<=cols(ylist);kk++) { + for (ll=1;ll<=cols(zkeeptokens);ll++) { + sstripe = sstripe \ ( invtokens(ylist[1,kk]), invtokens(zkeeptokens[1,ll])) + } + } + } + } + + + // return results to Stata + st_matrix("r(rkmatrix)", rkmatrix) + st_matrix("r(ccorr)", ccorr) + st_matrix("r(eval)", eval) + st_numscalar("r(N)", N) + if (clustvarname~="") { + st_numscalar("r(N_clust)", N_clust) + } + if (clustvarname2~="") { + st_numscalar("r(N_clust2)", N_clust2) + } + + // beta vector/matrix + // return as Stata-style row vector if vector, and transpose if matrix + if (betaflag) { + st_matrix("r(b0)", beta0') + st_matrix("r(b)", beta') + st_matrix("r(V)", V) + st_matrix("r(S)", S) + st_matrixcolstripe("r(b0)", bstripe) + st_matrixcolstripe("r(b)", bstripe) + st_matrixrowstripe("r(b0)", ("", "y1")) + st_matrixrowstripe("r(b)", ("", "y1")) + st_matrixrowstripe("r(V)", bstripe) + st_matrixcolstripe("r(V)", bstripe) + st_matrixrowstripe("r(S)", sstripe) + st_matrixcolstripe("r(S)", sstripe) + st_global("r(depvar)", depvar) + st_global("r(endog)", endog) + st_global("r(exexog)", exexog) + } + else if ((kpflag) | (iidflag)) { + st_matrix("r(V)", V) + st_matrix("r(S)", S) + st_matrixrowstripe("r(V)", sstripe) + st_matrixcolstripe("r(V)", sstripe) + st_matrixrowstripe("r(S)", sstripe) + st_matrixcolstripe("r(S)", sstripe) + } +// else { +// st_matrix("r(S)", S) +// st_matrixrowstripe("r(S)", sstripe) +// st_matrixcolstripe("r(S)", sstripe) +// } + st_numscalar("r(K3)",K3) + if (switchflag) { + // rank(varlist1) > rank(varlist2) so we switched them to z and y above. + st_numscalar("r(K1)",K2) + st_numscalar("r(K2)",K1) + // these have had any collinearities removed + st_global("r(ynocollin)",invtokens(zkeeptokens)) + st_global("r(znocollin)",invtokens(ykeeptokens)) + // dropped because of collinearities + if (cols(zdroptokens)>0) { + st_global("r(ycollin)",invtokens(zdroptokens)) + } + if (cols(ydroptokens)>0) { + st_global("r(zcollin)",invtokens(ydroptokens)) + } + } + else { + st_numscalar("r(K1)",K1) + st_numscalar("r(K2)",K2) + // these have had any collinearities removed + st_global("r(ynocollin)",invtokens(ykeeptokens)) + st_global("r(znocollin)",invtokens(zkeeptokens)) + // dropped because of collinearities + if (cols(ydroptokens)>0) { + st_global("r(ycollin)",invtokens(ydroptokens)) + } + if (cols(zdroptokens)>0) { + st_global("r(zcollin)",invtokens(zdroptokens)) + } + } + + +} // end of s_jstat program + + +// ordering by eigenvalues +function m_evorder( + numeric matrix Qyy, + numeric matrix iQyy, + numeric matrix Qzz, + numeric matrix iQzz, + numeric matrix Qzy, + numeric matrix eval, // result placed in var + numeric matrix ccorr, // result placed in var + numeric matrix ind, // result placed in var + numeric matrix phil // result placed in var + ) +{ + + K1 =cols(Qyy) + irQyy = matpowersym(Qyy,-0.5) + + if (irQyy[1,1]==.) { + printf("{err}error - missings in matrix square root - may be caused by collinearities\n") + exit(error(3351)) + } + + matl = irQyy*Qzy'*iQzz*Qzy*irQyy + vl = . // need to create var first + symeigensystem(matl,vl,eval) + phil = irQyy*vl + ccorr = eval:^(0.5) + + // reorder + phil = phil[.,K1::1] + phils = abs(phil) + + ii = . + ww = . + ind = J(1,K1,0) + + for (jj=1;jj<=K1;jj++) { + maxindex(phils[.,jj],1,ii,ww) + ind[1,jj] = ii + phils[ii,.] = J(1,K1,0) + } + +} + + +// returns structure with 2-step GMM results +struct ms_jresult scalar m_jgmm2s( struct ms_jargs scalar jargs, + struct ms_vcvorthog scalar vcvo, + numeric matrix biv) +{ + + struct ms_jresult scalar r + + r.beta0 = biv // in saved results + + // ishat based on IV residuals + (*vcvo.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2)*biv + shat = m_omega(vcvo) + ishat = invsym(shat) + + Qzy2_kron = I(jargs.ii) # jargs.Qzy2 + + bgmm = invsym(Qzy2_kron'*ishat*Qzy2_kron) * Qzy2_kron'*ishat*vec(jargs.Qzy1) + bgmm = rowshape(bgmm',rows(biv'))' + + // j based on 2-step GMM beta and first-step (IV) shat + (*vcvo.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2)*bgmm + eit = vec((*jargs.py1) - (*jargs.py2)*bgmm) + // need to stack weights + gbar = quadcross(*jargs.pz_kron, vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))), eit) * 1/jargs.N + j = gbar' * ishat * gbar * jargs.Nminus + rrank = diag0cnt(ishat) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + df = (jargs.K2-jargs.kk)*jargs.ii - rrank + pvalue = chi2tail(df,j) + + r.j = j + r.beta = bgmm + r.pvalue = pvalue + r.df = df + tkron = I(jargs.ii) # jargs.Qzy2 + r.V = invsym(tkron' * invsym(shat) * tkron) * 1/jargs.N + r.S = shat + + return(r) +} + +// returns structure with kp-liml results +struct ms_jresult scalar m_kp( struct ms_jargs scalar jargs, + struct ms_vcvorthog scalar vcvo, + numeric matrix bliml + ) +{ + + struct ms_jresult scalar r + struct ms_vcvorthog scalar vcvo_kp + + r.beta0 = bliml // in saved results + + + // ul are liml residuals + ul = (*jargs.py1) - (*jargs.py2)*bliml + aux1 = cholinv(quadcross(ul,vcvo.wf*(*vcvo.wvar),ul)) + aux2 = quadcross(ul,vcvo.wf*(*vcvo.wvar),*jargs.pz) + muz = (*jargs.pz)-ul*aux1*aux2 + y2l = (*jargs.pz)*cholsolve(quadcross(muz,vcvo.wf*(*vcvo.wvar),muz),quadcross(muz,vcvo.wf*(*vcvo.wvar),(*jargs.py2))) + aux3 = quadcross(y2l,vcvo.wf*(*vcvo.wvar),(*jargs.pz)[.,jargs.kk+1::jargs.K2]) + my2lz2 = (*jargs.pz)[.,jargs.kk+1::jargs.K2]-y2l*cholinv(quadcross(y2l,vcvo.wf*(*vcvo.wvar),y2l))*aux3 + my2lz2_kron = I(jargs.ii) # my2lz2 + + + // shat based on liml residuals for VCV + (*vcvo.e)[.,(1..jargs.ii)] = ul + shat_liml = m_omega(vcvo) + + // shat based on liml residuals for KP-J; Z and ZZ are overwritten so need to create new ms_vcvorthog + vcvo_kp = vcvo + (*vcvo_kp.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2)*bliml + vcvo_kp.Z = &my2lz2 + vcvo_kp.ZZ = quadcross(my2lz2, vcvo_kp.wf*(*vcvo_kp.wvar), my2lz2) + shat = m_omega(vcvo_kp) + ishat = invsym(shat) + eit = vec(ul) + gbar = quadcross(my2lz2_kron, vcvo_kp.wf*(J(jargs.ii,1,1) # (W=(*vcvo_kp.wvar))), eit) * 1/jargs.N + j = gbar' * ishat * gbar * jargs.Nminus + rrank = diag0cnt(ishat) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + df = (jargs.K2-jargs.kk)*jargs.ii - rrank + pvalue = chi2tail(df,j) + + r.j = j + r.beta = bliml + r.pvalue = pvalue + r.df = df + + tkron = I(jargs.ii) # jargs.Qzy2 + r.V = invsym(tkron' * invsym(shat_liml) * tkron) * 1/jargs.N + r.S = shat_liml + + return(r) +} + +// returns structure with kp using SVD; no beta returned +struct ms_jresult scalar m_svd( struct ms_jargs scalar jargs, + matrix that, + matrix u, + matrix v, + matrix vhat) +{ + struct ms_jresult scalar r + + vecthat = vec(that) + + u12 = u[(1::jargs.kk),(jargs.kk+1..jargs.K2)] + v12 = v[(1::jargs.kk),(jargs.kk+1..jargs.K1)] + u22 = u[(jargs.kk+1::jargs.K2),(jargs.kk+1..jargs.K2)] + v22 = v[(jargs.kk+1::jargs.K1),(jargs.kk+1..jargs.K1)] + + symeigensystem(u22*u22', evec, eval) + // if rank deficiency probs, evals can be negative, so zero out + if (sum(eval :< 0)>0) { + printf("{txt}warning - negative eigenvalues encountered in SVD algorithm in test of rank=%f\n",jargs.kk) + eval = (eval :>= 0) :* eval + } + u22v = evec + u22d = diag(eval) + u22h = u22v*(u22d:^0.5)*u22v' + + symeigensystem(v22*v22', evec, eval) + // if rank deficiency probs, evals can be negative, so zero out + if (sum(eval :< 0)>0) { + printf("{txt}warning - negative eigenvalues encountered in SVD algorithm in test of rank=%f\n",jargs.kk) + eval = (eval :>= 0) :* eval + } + v22v = evec + v22d = diag(eval) + v22h = v22v*(v22d:^0.5)*v22v' + + // luqrinv - use LU inversion; if fails because singular, use QR + aq = (u12 \ u22)*luqrinv(u22)*u22h + bq = v22h*luqrinv(v22')*(v12 \ v22)' + + lab = (bq#aq')*vecthat + vlab = (bq#aq')*vhat*(bq#aq')' + _makesymmetric(vlab) + vlabinv = invsym(vlab) + + rrank = diag0cnt(vlabinv) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + r.j = lab'*vlabinv*lab*jargs.Nminus + r.df = (jargs.K2-jargs.kk)*jargs.ii - rrank + r.pvalue = chi2tail(r.df,r.j) + + return(r) +} + +// returns structure with j2l results +struct ms_jresult scalar m_j2l( struct ms_jargs scalar jargs, + struct ms_vcvorthog scalar vcvo, + numeric matrix bliml) +{ + + struct ms_jresult scalar r + + r.beta0 = bliml // in saved results + + // ul are liml residuals + ul = (*jargs.py1) - (*jargs.py2)*bliml + // can cause numerical problems...? + aux1 = cholinv(quadcross(ul,vcvo.wf*(*vcvo.wvar),ul)) + aux2 = quadcross(ul,vcvo.wf*(*vcvo.wvar),*jargs.pz) + muz = (*jargs.pz)-ul*aux1*aux2 + y2l = (*jargs.pz)*cholsolve(quadcross(muz,vcvo.wf*(*vcvo.wvar),muz),quadcross(muz,vcvo.wf*(*vcvo.wvar),(*jargs.py2))) + Qzy2l = quadcross(*jargs.pz,vcvo.wf*(*vcvo.wvar),y2l) * 1/jargs.N + Qzy2l_kron = I(jargs.ii) # Qzy2l + y2_kron = I(jargs.ii) # (*jargs.py2) + + // ishat based on liml residuals + (*vcvo.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2)*bliml + shat = m_omega(vcvo) + ishat = invsym(shat) + + // calc b2l; note shat is based on liml residuals + inst = (*jargs.pz_kron)*ishat*Qzy2l_kron + // need to stack weights + aux3 = quadcross(inst,vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))),y2_kron) + aux4 = quadcross(inst,vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))),vec(*jargs.py1)) + b2l = luinv(aux3)*aux4 + b2l = rowshape(b2l,jargs.ii) + b2l = b2l' + + // resids, ishat and j based on b2l + (*vcvo.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2)*b2l + shat = m_omega(vcvo) + ishat = invsym(shat) + eit = vec((*jargs.py1) - (*jargs.py2)*b2l) + // need to stack weights + gbar = quadcross(*jargs.pz_kron, vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))), eit) * 1/jargs.N + j = gbar' * ishat * gbar * jargs.Nminus + + rrank = diag0cnt(ishat) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + df = (jargs.K2-jargs.kk)*jargs.ii - rrank + pvalue = chi2tail(df,j) + + r.j = j + r.beta = b2l + r.pvalue = pvalue + r.df = df + return(r) +} + + +// returns structure with iid results +struct ms_jresult scalar m_jiid( struct ms_jargs scalar jargs, + struct ms_vcvorthog scalar vcvo, + real matrix b0 + ) +{ + + struct ms_jresult scalar r + + // b0 is expected to be the 2SLS beta + // b0 = LIML yields same results as canonical correlations etc. + + (*vcvo.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2) * b0 + shat = m_omega(vcvo) + ishat = invsym(shat) + eit = vec((*jargs.py1) - (*jargs.py2) * b0) + // need to stack weights + gbar = quadcross( *jargs.pz_kron, /// + vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))), /// + eit) /// + * 1/jargs.N + j = gbar' * ishat * gbar * jargs.Nminus + + rrank = diag0cnt(ishat) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + df = (jargs.K2-jargs.kk)*jargs.ii - rrank + pvalue = chi2tail(df,j) + + r.j = j + r.beta0 = b0 + r.beta = b0 + r.pvalue = pvalue + r.df = df + + tkron = I(jargs.ii) # jargs.Qzy2 + r.V = invsym(tkron' * invsym(shat) * tkron) * 1/jargs.N + r.S = shat + + return(r) +} + + +// returns structure with iterated J CUE results +struct ms_jresult scalar m_jcueiter( struct ms_jargs scalar jargs, + struct ms_vcvorthog scalar vcvo, + real matrix ivarpi0, + real matrix vecpi, + numeric matrix binit) +{ + + struct ms_jresult scalar r + + // iterated CUE message, but only if we are iterating + if ((jargs.dotsflag) & (jargs.maxiter>1)) { + printf("\n") + dotscmd = "_dots 0 0, title(Calculating iterated CUE J for test of rank=" + strofreal(jargs.kk) + ")" + stata(dotscmd) + } + else if (jargs.maxiter>1) { + printf("\n{txt}Calculating CUE J for test of rank=%f",jargs.kk) + } + + // initialize + bit = binit + r.beta0 = binit // in saved results + (*vcvo.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2) * bit + shat = m_omega(vcvo) // FW doesn't normalise by N (equiv to multiplies by N) + ishat = invsym(shat) // w2 in FW code + eit = vec((*jargs.py1) - (*jargs.py2) * bit) + gbar = quadcross(*jargs.pz_kron, vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))), eit) * 1/jargs.N + jcue = gbar' * ishat * gbar * jargs.Nminus + + i=0 + + // do...while + do { + + jprev=jcue + bprev=bit + + i=i+1 + + // output dots only if we are iterating + if ((jargs.dotsflag) & (jargs.maxiter>1)) { + dotscmd = "_dots " + strofreal(i) + " 0" + stata(dotscmd) + } + + // get new bit for next time through loop + dd = (bit' \ I(jargs.kk)) # I(jargs.K2) + // pih = invsym(dd'*ivarpi0*dd)*dd'*ivarpi0*vecpi + pih = cholinv(dd'*ivarpi0*dd)*dd'*ivarpi0*vecpi + // equivalent is rowshape(pih,(K1-ii)) + pih = colshape(pih,jargs.K2) + pih = pih' + inst = (*jargs.pz_kron)*ishat*jargs.Qzz_kron*(I(jargs.ii)#pih) + insty1 = quadcross(inst,vec((*jargs.py1):*(vcvo.wf*(*vcvo.wvar)))) + // equivalent to + // = quadcross(inst,vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))),vec((*jargs.py1))) + insty2 = quadcross(inst,I(jargs.ii)#((*jargs.py2):*(vcvo.wf*(*vcvo.wvar)))) + // nonsymmetric matrix so can't use cholinv or invsym + // is rank deficiency a potential issue? if so, use qrinv or pinv? + // bit = luinv(insty2)*insty1 + bit = qrinv(insty2)*insty1 + bit = rowshape(bit,jargs.ii) + bit = bit' + + // ishat and jcue based on resids from current bit + // at first iteration, will be resids from binit (2sls or liml) + // note that jcue=N*gbar(ehat)'ishat(ehat)gbar(ehat) uses same resid throughout + // usual 2-step GMM uses initial resids in ishat(ehat) + // ehat[.,(1..ii)] = y1 - y2*bit + // vcvo.e = &ehat[.,(1..ii)] + + (*vcvo.e)[.,(1..jargs.ii)] = (*jargs.pvy1) - (*jargs.pvy2) * bit + shat = m_omega(vcvo) // FW doesn't normalise by N (equiv to multiplies by N) + ishat = invsym(shat) // w2 in FW code + eit = vec((*jargs.py1) - (*jargs.py2) * bit) + // need to stack weights + gbar = quadcross(*jargs.pz_kron, vcvo.wf*(J(jargs.ii,1,1) # (W=(*vcvo.wvar))), eit) * 1/jargs.N + jcue = gbar' * ishat * gbar * jargs.N + + // change in jcue; should be negative unless algo is starting to veer off + jcha = jcue-jprev + // can hit problem if shat rank deficient, bit has missings, veers off, etc. + // if jcha >=0 or jcha==., algo will exit + if (jcha>0) { + jcue = jprev + bit = bprev + } + if (jcue==.) { + jcue = jprev + jcha = . + } + if (jcue==0) { + jcue = . + } + + // printf("{txt}iteration %f, jcha=%f, J=%f\n",i,jcha,jcue) + + } while ((jcha < -jargs.jtol) & (i < jargs.maxiter)) + + // message output only if we are iterating + if ((i1)) { + printf("\n{txt}convergence after %f iterations\n",i) + } + else if (jargs.maxiter>1) { + printf("\n{txt}no convergence after max %f iterations; del(jcue)=%g\n",i,jcha) + } + + // used as diagnostic at end of loop + // note that this is based on the updated bit; works better as a diagnostic that way + bcha = vec(bit-bprev)'vec(bit-bprev) + + // warning messages only if we are iterating + if ((jargs.maxiter>1) & ((bcha>jargs.btol) | (jcha>0))) { + printf("warning: possible convergence failure\n") + if (bcha>1e-10) { + printf(" del(b)'del(b)=%g\n",bcha) + } + if (jcha>0) { + printf(" del(jcue)=%g; positive at last iteration\n",jcha) + } + else { + printf(" del(jcue)=%g\n",jcha) + } + if (hasmissing(bit)) { + printf(" last iteration of b has missing values\n") + } + if (diag0cnt(ishat)) { + printf(" last iteration of avar of moments not full rank\n") + } + } + // behavior if we are not iterating: j missing if obj fn increased + if ((maxiter==1) & (jcha>0)) { + printf("warning: del(jcue)=%g; positive after single iteration\n",jcha) + jcue = . + } + + rrank = diag0cnt(ishat) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + df = (jargs.K2-jargs.kk)*jargs.ii - rrank + pvalue = chi2tail(df,jcue) + + r.j = jcue + r.beta = bit + r.pvalue = pvalue + r.df = df + r.S = shat + tkron = I(jargs.ii) # jargs.Qzy2 + r.V = invsym(tkron' * invsym(shat) * tkron) * 1/jargs.N + r.S = shat + + return(r) +} + + +// returns structure with numerical J CUE results +struct ms_jresult scalar m_jcuenum( struct ms_jargs scalar jargs, + struct ms_vcvorthog scalar vcvo, + numeric matrix binit) +{ + + struct ms_jresult scalar r + + r.beta0 = binit // in saved results + + b0 = rowshape(binit,1) + + // What follows is how to set out an optimization in Stata. First, initialize + // the optimization structure in the variable S. Then tell Mata where the + // objective function is, that it's a minimization, that it's a "d0" type of + // objective function (no analytical derivatives or Hessians), and that the + // initial values for the parameter vector are in b0. Finally, optimize. + + S = optimize_init() + + // see later in file for m_cuecrit(.) function + optimize_init_evaluator(S, &m_cuecrit()) + optimize_init_which(S, "min") + optimize_init_evaluatortype(S, "d0") + optimize_init_params(S, b0) + optimize_init_conv_maxiter(S, jargs.maxiter) + if (jargs.tracelevel~="") { + optimize_init_tracelevel(S, jargs.tracelevel) + } + optimize_init_conv_ptol(S,jargs.btol) + optimize_init_conv_vtol(S,jargs.jtol) + // CUE objective function takes 2 extra arguments = struct with args and struct with vcvo + optimize_init_argument(S, 1, jargs) + optimize_init_argument(S, 2, vcvo) + + printf("\n{txt}Calculating CUE J using numerical maximization for test of rank=%f\n",jargs.kk) + + beta = optimize(S) // Stata convention is row vector orientation + + // the last evaluation of the GMM objective function is J. + jcue = optimize_result_value(S) + + shat = m_omega(vcvo) + ishat = invsym(shat) + rrank = diag0cnt(ishat) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + df = (jargs.K2-jargs.kk)*jargs.ii - rrank + pvalue = chi2tail(df,jcue) + + r.j = jcue + r.beta = rowshape(beta,rows(binit)) // put into correct r x c dim + r.pvalue = pvalue + r.df = df + r.S = shat + + tkron = I(jargs.ii) # jargs.Qzy2 + r.V = invsym(tkron' * invsym(shat) * tkron) * 1/jargs.N + r.S = shat + + return(r) +} + +// CUE evaluator function. +// Handles only d0-type optimization; todo, g and H are just ignored. +// beta is the parameter set over which we optimize, and +// J is the objective function to minimize. + +void m_cuecrit(todo, beta, struct ms_jargs scalar jargs, struct ms_vcvorthog scalar vcvo, j, g, H) +{ + + ii = cols(*jargs.py1) + + // beta arrives as a rowvector so must reshape it first + b = rowshape(beta, cols(*jargs.py2)) + + *vcvo.e[.,.] = (*jargs.pvy1) - (*jargs.pvy2) * b + + shat = m_omega(vcvo) + ishat = invsym(shat) + + eit = vec((*jargs.py1) - (*jargs.py2) * b) + // need to stack weights + gbar = quadcross(*jargs.pz_kron, vcvo.wf*(J(ii,1,1) # (W=(*vcvo.wvar))), eit) * 1/vcvo.N + j = gbar' * ishat * gbar * jargs.Nminus + +} // end program CUE criterion function + + +// returns structure with numerical J LIML results +// not currently in use +struct ms_jresult scalar m_jlimlnum( struct ms_jargs scalar jargs, + struct ms_vcvorthog scalar vcvo, + numeric matrix binit) +{ + + struct ms_jresult scalar r + + r.beta0 = binit // in saved results + + b0 = rowshape(binit,1) + + S = optimize_init() + + optimize_init_evaluator(S, &m_limlcrit()) + optimize_init_which(S, "min") + optimize_init_evaluatortype(S, "d0") + optimize_init_params(S, b0) + optimize_init_conv_maxiter(S, jargs.maxiter) + if (jargs.tracelevel~="") { + optimize_init_tracelevel(S, jargs.tracelevel) + } + optimize_init_conv_ptol(S,jargs.btol) + optimize_init_conv_vtol(S,jargs.jtol) + // LIML objective function takes 2 extra arguments + optimize_init_argument(S, 1, jargs) + optimize_init_argument(S, 2, vcvo) + + printf("\n{txt}Calculating LIML J using numerical maximization for test of rank=%f\n",jargs.kk) + + beta = optimize(S) // Stata convention is row vector orientation + + // the last evaluation of the GMM objective function is J. + jliml = optimize_result_value(S) + + shat = m_omega(vcvo) + ishat = invsym(shat) + rrank = diag0cnt(ishat) + if (rrank) { + printf("{txt}warning - avar rank reduction=%f in test of rank=%f; adjusting df of test\n",rrank,jargs.kk) + } + + df = (jargs.K2-jargs.kk)*jargs.ii - rrank + pvalue = chi2tail(df,jliml) + + r.j = jliml + r.beta = beta' // our convention is column vector orientation + r.pvalue = pvalue + r.df = df + return(r) +} + +void m_limlcrit(todo, beta, struct ms_jargs scalar jargs, struct ms_vcvorthog scalar vcvo, j, g, H) +{ + ii = cols(*jargs.py1) + + // beta arrives as a rowvector so must reshape it first + b = rowshape(beta, cols(*jargs.py2)) + + *vcvo.e[.,.] = (*jargs.pvy1) - (*jargs.pvy2) * b + + // LIML support for H-mat not yet available + // if (jargs.hflag) { + // sigma2 = hcross(*vcvo.e[.,.],*vcvo.e[.,.],jargs.Hmat,jargs.hvar,*vcvo.wvar,jargs.info,"invert") + // } + sigma2 = quadcross(*vcvo.e[.,.], vcvo.wf*(*vcvo.wvar), *vcvo.e[.,.]) * 1/vcvo.N + jargs.sigma2 = sigma2 + + _makesymmetric(sigma2) + shat = sigma2#(jargs.Qzz) + ishat = invsym(shat) + eit = vec((*jargs.py1) - (*jargs.py2) * b) + // need to stack weights + gbar = quadcross(*jargs.pz_kron, vcvo.wf*(J(ii,1,1) # (W=(*vcvo.wvar))), eit) * 1/vcvo.N + + j = gbar' * ishat * gbar * jargs.Nminus + + +} // end program CUE criterion function + +function hcross( numeric matrix A, + numeric matrix B, + numeric matrix Hmat, + numeric matrix hvar, + numeric matrix wvar, + numeric matrix info, + | string scalar invertH) +{ + + if (args()==6) { + invertflag=0 + } + else if (invertH=="invert") { + invertflag=1 + } + else { + printf("{err}internal ranktest error - invalid argument provided to hcross(.)\n") + exit(3000) + } + + npanel = rows(info) + AHB = J(cols(A),cols(B),0) + for (i=1; i<=npanel; i++) { + Apanel = panelsubmatrix(A,i,info) + Bpanel = panelsubmatrix(B,i,info) + hpanel = panelsubmatrix(hvar,i,info) + wpanel = panelsubmatrix(wvar,i,info) + H = Hmat[hpanel,hpanel] + if (invertflag) { + H = invsym(H) + } + AHB = AHB + Apanel' * H * diag(wpanel) * Bpanel + } + + return(AHB) +} + + + +// Mata utility for sequential use of inverters of square matrices +// Default is LU; +// if that fails, use QR. +function luqrinv ( numeric matrix A, + | real scalar r) +{ + return_rank = (args()==2) + + real matrix C + + C = luinv(A) + if ((C[1,1]==.) & (return_rank)) { + C = qrinv(A, r) + } + else if (C[1,1]==.) { + C = qrinv(A) + } + else if (return_rank) { + r = cols(A) + } + + return(C) + +} + +// Mata utility for sequential use of solvers +// Default is cholesky; +// if that fails, use QR. +function cholqrsolve ( numeric matrix A, + numeric matrix B, + | real scalar r) +{ + return_rank = (args()==3) + + real matrix C + + C = cholsolve(A, B) + if ((C[1,1]==.) & (return_rank)) { + C = qrsolve(A, B, r) + } + else if (C[1,1]==.) { + C = qrsolve(A, B) + } + else if (return_rank) { + r = cols(A) + } + + return(C) + +} + +end + +* Version notes +* 2.0.01 Complete rewrite. See version notes for ranktest11 for notes on previous versions. +* Main new feature: Cragg-Donald GMM CUE-based J statistic and iterative algorithm. +* Misc new options: rr(.) for test of H0: rank=(K1-rr) +* small for small-sample statistics +* added standardization; override with nostd option +* lr for LR version of Anderson canonical correlations test +* 2.0.02 (21 Nov 2019) Added e(ranktestcmd) = ranktest for main program. +* 2.0.03 (14 Jun 2020) Final version for v2 release. +* Branches to ranktest11 if _caller is version 12 or 11. +* 2.0.04 (21 Sep 2020) Added check for perverse case where minrank=maxrank. diff --git a/data/ado/r/ranktest.sthlp b/data/ado/r/ranktest.sthlp new file mode 100644 index 0000000..f41965e --- /dev/null +++ b/data/ado/r/ranktest.sthlp @@ -0,0 +1,939 @@ +{smcl} +{* *! version 1.0.0 25jun2020}{...} +{vieweralsosee "[if installed] underid" "help underid"}{...} +{viewerjumpto "Syntax" "ranktest##syntax"}{...} +{viewerjumpto "Description" "ranktest##description"}{...} +{viewerjumpto "Tests" "ranktest##tests"}{...} +{viewerjumpto "Notes on numerical methods" "ranktest##numerical"}{...} +{viewerjumpto "Examples" "ranktest##examples"}{...} +{viewerjumpto "Stored results" "ranktest##results"}{...} +{viewerjumpto "References" "ranktest##references"}{...} +{title:Title} + +{p2colset 5 22 24 2}{...} +{p2col :{manlink R ranktest} {hline 2}}Module for testing the rank of a matrix{p_end} +{p2colreset}{...} + +{pstd} +Note: {cmd:ranktest} was substantially rewritten and expanded starting with version 2.0.02, +and the version of Stata required was raised to Stata 12. +To run the previous version of {cmd:ranktest}, +either use version control ({bind:{it:version 11: ranktest ...}}) +or call {cmd:ranktest11} (included in the {cmd:ranktest} package). + +{title:Contents} + +{p 4}{help ranktest##syntax:Syntax}{p_end} +{p 4}{help ranktest##description:Description}{p_end} +{p 4}{help ranktest##summary:Tests (summary)}{p_end} +{p 4}{help ranktest##tests:Tests (detail)}{p_end} +{p 4}{help ranktest##numerical:Notes on numerical methods and options}{p_end} +{p 4}{help ranktest##examples:Examples}{p_end} +{p 4}{help ranktest##replication:Replication: Manresa et al. (2017)}{p_end} +{p 4}{help ranktest##results:Stored results}{p_end} +{p 4}{help ranktest##references:References}{p_end} + +{marker syntax}{...} +{title:Syntax} + +{p 8 14 2} +{cmd:ranktest} +[{it:{help ranktest##weight:weight}}] +{cmd:(}{it:varlist1}{cmd:)} +{cmd:(}{it:varlist2}{cmd:)} +[{it:weight}] +{ifin} +[{cmd:,} {it:options}] + +{synoptset 22}{...} + +{p2col 3 4 4 2:iid test options}{p_end} +{synopt :{opt lr}}report Anderson likelihood ratio statistic instead of default Anderson LM statistic{p_end} +{synopt :{opt wald}}report Cragg-Donald Wald statistic instead of default Anderson LM statistic{p_end} + +{p2col 3 4 4 2:robust test options}{p_end} +{synopt :{opt kp}}(default robust test) Kleibergen-Paap LIML-based statistic{p_end} +{synopt :{opt jcue}}Cragg-Donald CUE-based J statistic{p_end} +{synopt :{opt jgmm2s}}use 2-step efficient GMM instead of GMM CUE to obtain J statistic{p_end} +{synopt :{opt wald}}report Wald instead of default LM statistic{p_end} + +{p2col 3 4 4 2:Main options}{p_end} +{synopt :{opt partial(varlist3)}}partial out the variables in {it:varlist3} from {it:varlist1} and {it:varlist2}{p_end} +{synopt :{cmdab:noc:onstant}}suppress the constant term (intercept) in the list of partialled-out variables{p_end} +{synopt :{cmdab:all:rank}}(default) report test statistics for rank=0, rank=1, ..., rank=(K1-1) where K1=min(#varlist1,#varlist2){p_end} +{synopt :{opt rr(integer)}}report only the test statistic for H0: rank=(K1-rr){p_end} +{synopt :{cmdab:full:rank}}report only the test statistic for H0: rank=(K1-1); equivalent to specifying {opt rr(1)}{p_end} +{synopt :{cmdab:null:rank}}report only the test statistic for H0: rank=0; equivalent to specifying {opt rr(K1)}{p_end} +{synopt :{opt small}}use a small-sample adjustment: instead of N, for LM-type tests use N-K3, and for Wald-type tests use N-K2-K3, +where K2=max(#varlist1,#varlist2) and K3=#varlist3{p_end} + +{p2col 3 4 4 2:VCE options}{p_end} +{synopt :{cmdab:rob:ust}}report tests that are robust to arbitrary heteroskedasticity{p_end} +{synopt :{opt cluster(varlist)}}report tets that are robust to heteroskedasticity and within-cluster correlation; 2-way clustering is supported{p_end} +{synopt :{opt bw(#)}}report tests that are autocorrelation-consistent (AC) +or (with the {opt robust} option) heteroskedasticity- and autocorrelation-consistent (HAC), +with bandwidth equal to #{p_end} +{synopt :{opt kernel(string)}}specifies the kernel to be used for AC and HAC covariance estimation (default=Bartlett a.k.a. Newey-West){p_end} +{synopt :{opt center}}specifies that the moments in the robust VCE are centered so that they have mean zero{p_end} + +{p2col 3 4 4 2:Iterative algorithm and numerical optimization options for CUE J statistic}{p_end} +{synopt :{opt jtol(real)}}(default=1e-10) tolerance for change in J in iterative algorithm when calculating the CUE J statistic{p_end} +{synopt :{opt btol(real)}}(default=1e-5) tolerance for change in beta in iterative algorithm when calculating the CUE J statistic{p_end} +{synopt :{opt binit(estimator)}}(default=2sls) initial beta when calculating the CUE J statistic; can be {opt liml} or {opt 2sls}{p_end} +{synopt :{opt nodots}}do not display dots when iterating to obtain the CUE J statistic{p_end} +{synopt :{cmdab:NOITER:ate}}do not use iterative algorithm; use only numerical optimization (default=use both){p_end} +{synopt :{cmdab:NOCOMB:iter}}do not use numerical optimization; use only iterative algorithm (default=use both){p_end} +{synopt :{opt maxiter(real)}}(default=100) maximum number of iterations in iterative algorithm{p_end} +{synopt :{opt noevorder}}override default behavior of reordering the variables in {it:varlist1} by eigenvalues{p_end} +{synopt :{opt nosvd}}(KP test only) use LIML residuals algorithm instead of default SVD algorithm to obtain KP statistic{p_end} + +{p2col 3 4 4 2:Other options}{p_end} +{synopt :{opt nostd}}override the default behavior of standardizing variables to unit variance{p_end} +{synopt :{opt version}}display the current version number of {opt ranktest}; cannot be used with other options{p_end} + + +{pstd} +{cmd:ranktest} requires the Stata module {cmd:avar}; click {stata ssc install avar :here} to install +or type "ssc install avar" from inside Stata. +{cmd:ranktest} allows all robust covariance estimators supported by {cmd:avar}; +see {help avar:help avar} for details. + +{pstd} +All varlists may contain time-series operators or factor variables; see {stata "help varlist"}. + +{pstd} +{cmd:aweight}s, {cmd:fweight}s, {cmd:iweight}s and {cmd:pweight}s +are allowed; see help {help weights}. + + +{marker description}{...} +{title:Description} + +{pstd} +{cmd:ranktest} implements tests for the rank of a matrix. +Tests of the rank of a matrix have many practical applications. +For example, in econometrics the requirement for identification is the rank condition, +which states that a particular matrix must be of full column rank. +Another example from econometrics concerns +cointegration in vector autoregressive (VAR) models; +the Johansen trace test is a test of a rank of a particular matrix. + +{pstd} +Denote one list of K1 variables as Y and a second list of K2 variables as Z, +and assume here and below that {bind:K1 <= K2 < N}. +The null hypothesis of the tests implemented by {cmd:ranktest} +is that the matrix of correlations or regression parameters B between Y and Z has rank(B)=K1-rr, +where rr denotes the reduction in rank. +A large test statistic and rejection of the null +indicates that the matrix B has rank at least K1-rr+1. +The most commonly employed choice is rr=1, +in which case the null is that rank(B)=K1-1 (B is rank deficient) +and rejection of the null indicates rank(B)=K1 (B is full column rank). + +{pstd} +The traditional test of the rank of a matrix for the standard iid case +is the Anderson (1951) canonical correlations test. +If we calculate the squared {help canon:canonical correlations} between Y and Z, +the LM form of the Anderson test +is N times the sum of the rr smallest squared canonical correlations. +Anderson's test also has a likelihood ratio version (see below). +The Cragg-Donald (1993, 1997) statistic for the iid case is essentially +a Wald version of Anderson's test. +Both the Anderson and Cragg-Donald tests require the iid assumption, +i.e., that the covariance matrix has a Kronecker form. +When this is not so, +e.g., when disturbances are heteroskedastic or autocorrelated, +the test statistics are no longer valid. + +{pstd} +In the non-iid case, {cmd:ranktest} will report tests +that are robust to various forms of +heteroskedasticity, autocorrelation, and clustering. +The default is to report the Kleibergen-Paap (2006) test. +An alterative is to report a robust form of the Cragg-Donald (1993, 1997) test. +Windmeijer (2018) shows that the Cragg-Donald test can be interpreted, +and is implemented in {cmd:ranktest} as, a Hansen-Sargan J statistic +when estimating using GMM and the CUE (continuously-updated) estimator. +The robust form of the Cragg-Donald test is specifed by the {opt jcue} option. +All of these tests are discussed in more detail below. + +{pstd} +The rank test is applied to Y and Z, +where Y={it:varlist1} and Z={it:varlist2}. +Optionally, a third set of variables X={it:varlist3} +can be partialled-out of Y and Z +with the {opt partial(varlist3)} option. +A constant is automatically partialled out, +unless the user specifies the {opt nocons} option. +The null hypothesis is H0: rank(B)=K1-rr, +a rank reduction of rr. +Rejection of the null indicates that the matrix +has at least rank=K1-rr+1. +The test statistic is distributed as chi-squared +with degrees of freedom = (K1-(K1-rr))*(K2-(K2-rr)), +where K1 is the number of Y variables, +K2 is the number of Z variables, +and rr is the rank reduction being tested in H0. +For example, +to test if the matrix is full column rank K1 where K1<=K2, +the null would be H0:rank(B)=K1-1 (a rank reduction of 1) +and the degrees of freedom of the test +would be {bind:(K1-(K1-1))*(K2-(K1-1)} = (K2-K1+1). +The default behavior of {cmd:ranktest} is to perform all possible tests of rank; +the {cmdab:full:rank} option causes only the test of whether the matrix is full rank +(H0:rank(B)=K1-1) to be reported; +the {cmdab:null:rank} option causes only the test of whether the matrix is zero rank +(H0:rank(B)=0) to be reported; +the {opt rr(integer)} option allows the user to test for the specified order of rank reduction. + +{pstd}Note that {cmd:ranktest} separately checks the data matrices Y and X for collinearities +and if necessary drops collinear variables. +Also note that if the number of variables in {it:varlist1} +is greater than the number of variables in {it:varlist2}, +{cmd:ranktest} will use {it:varlist2} for Y and {it:varlist1} for Z. +However, the macros {opt r(K1)} and {opt r(K2)} set by {cmd:ranktest} +always refer to the number of variables in {it:varlist1} and {it:varlist2}, respectively, +after any collinear variables are dropped. + +{pstd}With the exception of the LR version of Anderson's canonical correlation test, +all the tests reported by {cmd:ranktest} are score (Lagrange multiplier, LM) tests. +The distinction between the "LM" and "Wald" versions of the tests +lies only in the type of residual used to construct an estimate of the variance. +See {help "ranktest##examples":below} for examples illustrating this point +and Windmeijer (2018) for explanation and discussion. + +{pstd}The default behavior of {cmd:ranktest} is to report LM versions of the tests; +the {opt wald} option will cause it to report Wald versions. +In the iid case only, the {opt lr} option will report the LR version of the Anderson test. +Specifying {opt robust}, {opt bw(#)} (where # is the bandwidth) or {opt cluster(varname)} +will generate an rk statistic that is robust to +heteroskedasticity, autocorrelation or within-group clustering; +{opt robust} combined with {opt bw(#)} will generate a +heteroskedasticity and autocorrelation-consistent (HAC) statistic. +The implementation of an autocorrelation-consistent statistic +and the options available for various kernels +follow that in {help ivreg2}; +for more details, see Baum et al. (2007) or {help help ivreg2} if installed. +If none of the above options is specified, +{cmd:ranktest} defaults to reporting the +LM version of the Anderson (1951) canonical correlations test, +or, if {opt wald} is specified, the Cragg-Donald (1993, 1997) Wald test. + +{pstd}It is useful to note that in the special case of K1=1 +(there is a single variable Y) and H0:rank=0, +all these tests reduce to statistics that are available from OLS estimation. +The iid version of the Cragg-Donald statistic can be calculated +by regressing the single Y on Z and X and testing the joint significance of Z +using a standard Wald test +and the traditional non-robust covariance estimator. +The Anderson LM statistic can be obtained by calculating an LM test +of the same joint hypothesis. +Also in the K1=1 case, the robust KP and CD statistics coincide, +and can be calculated using OLS and the desired robust covariance estimator. +If K1>1, test statistics for H0:rank=0 reported by {cmd:ranktest} +can be reproduced by testing the joint significance of the Z variables +across the K1 equations for the Y variables; +see the {help "ranktest##examples":examples} below. + +{pstd}In certain settings the user may specify that some variables appear +in {it:both} Y ({it:varlist1}) and Z ({it:varlist2}). +In the iid case, and in the cases of the tests using KP and J using 2-step GMM, +the test statistics thus obtained will be identical +to when these shared variable are instead partialled-out from Y and Z. +The results will differ, however, in the non-robust case with tests based on the CUE GMM estimator. +The intuition can be seen by recognizing that these variables +correspond to exogenous regressors in a linear IV estimation. +In an equation estimated by CUE GMM, +the orthogonality conditions corresponding to the excluded instruments +also contribute to the estimation of the coefficients on the included exogenous regressors, +and hence estimation using CUE yields result different from when they are partialled-out. +The replication below using the paper by Manresa et al. (2017) +provides an example of the use of this feature. + + +{marker summary}{...} +{title:Test statistics (summary)} + +{pstd}Note: {opt robust} below applies to all tests employing +a "robust" covariance estimator (heteroskedastic-robust, HAC, cluster-robust etc.). + +{p2col 5 25 26 0: {it:Options}} +Test +{p_end} + +{p2col 5 25 26 0: {cmd:(none)}} +Anderson canonical correlations test, LM version. Assumes iid. +{p_end} + +{p2col 5 25 26 0: {opt lr}} +Anderson canonical correlations test, LR version. Assumes iid. +{p_end} + +{p2col 5 25 26 0: {opt wald}} +Cragg-Donald test, iid version. +{p_end} + +{p2col 5 25 26 0: {opt robust}} +Kleibergen-Paap LIML-based robust statistic, LM version. +Same as specifying {opt robust kp}. +{p_end} + +{p2col 5 25 26 0: {opt robust wald}} +Kleibergen-Paap LIML-based robust statistic, Wald version. +Same as specifying {opt robust kp wald}. +{p_end} + +{p2col 5 25 26 0: {opt robust jcue}} +Cragg-Donald robust CUE-based statistic, LM version. +{p_end} + +{p2col 5 25 26 0: {opt robust jcue wald}} +Cragg-Donald robust CUE-based statistic, Wald version. +{p_end} + + +{marker tests}{...} +{title:Test statistics (detail)} + +{pstd}Denote by Y and Z two lists of variables, with K1 and K2 columns respectively. +By convention, K1 <= K2. +For simplicity we assume no collinearities exist within Y and Z. +An optional third set of variables X has already been partialled out of Y and Z; +the default behavior of {cmd:ranktest} is to center Y and Z (partial out a constant). +Rank tests are tests of the rank of the matrix E(Z_i'Y_i), +where Z_i and Y_i correspond to rows of the data matrices Z and Y. +E(Z_i'Y_i) is full rank if rank(E(Z_i'Y_i))=K1. + +{pstd} +Rank tests can also be presented in terms of linear regression. +Write the system of linear equations as {bind:Y = Z*B + V}. +The K2xK1 matrix of regression coefficients B +is defined as inv(E(Z_i'Z_i))*E(Z_i'Y_i), +and the OLS estimate of B is Bhat=inv(Z'Z))*Z'Y. +(In the context of instrumental variable estimation, +this is the set of first-stage equations.) +Rank tests are tests of the rank of the matrix B. + +{pstd} +A test of whether B is full rank is a test of the null hypothesis H0:rank(B)=K1-1, +a rank reduction of 1; +rejection indicates B is full rank. +A test of whether B is null rank is a test of the null hypothesis H0:rank(B)=0, +a rank reduction of K1. +If K1=1 so that there is a single Y variable, only a single test is available, H0:rank(B)=0; +rejection indicates rejection of null rank in favor of full rank. +In the K1=1 case the rank test is equivalent to a test of +the significance of the variables Z in an OLS regression of Y on Z (and X); +see the {help "ranktest##examples":examples} below. + +{marker CCiid}{...} +{bf:Anderson canonical correlations test} + +{pstd}Denote by ev_1 < ev_2 < ... < ev_K +the eigenvalues of (Y'*P_z*Y)*inv(Y'Y) where P_z is the projection matrix Z*inv(Z'Z)*Z', +after partialling out X and ordering the eigenvalues from smallest to largest. +The eigenvalues correspond to the squared {help canon:canonical correlations} between Y and Z (Anderson 1951). +The LM version of Anderson's canonical correlations test is + + rk = N sum_p ev_p, p=1...rr + +{pstd}where rr denotes the reduction in rank. +A test of whether B is full rank is obtained from rr=1 (i.e., using the smallest eigenvalue); +a test of whether it is null rank is obtained from rr=K1 (i.e., using the sum of all the eigenvalues). + +{pstd}The likelihood-ratio version of Anderson's test is + + rk = -N sum_p ln(1-ev_p), p=1...rr + +{marker CDiid}{...} +{bf:Cragg-Donald rank test (iid version)} + +{pstd}In the iid case, the Cragg-Donald (1993, 1997) test is essentially a Wald version of Anderson's test: + + rk = N sum_p ev_p/(1-ev_p), p=1...rr + +{marker KProbust}{...} +{bf:Kleibergen-Paap (LIML-based) rank test} + +{pstd}Denote by Bhat the OLS estimator of B. +The Kleibergen-Paap (2006) test of the rank of B +is derived from applying the singular value decomposition (SVD) +to a normalized version of Bhat. +Kleibergen-Paap (2006) show that +the KP test statistic can be interpreted as +Anderson's canonical correlations test generalized to the non-iid case +(a non-Kronecker covariance matrix). +Windmeijer (2018) shows that the KP test statistic +can also be interpreted as a LIML-based robust score test. +He also shows that it can be obtained from an artificial regression +using the residuals from LIML estimation(s); +the LIML residuals are obtained from estimations +where the Y variables are partitioned into +some that are treated as dependent (LHS) variables +and the remainder are endogenous (RHS) regressors. +The default is for {cmd:ranktest} to use the SVD algorithm; +the {opt nosvd} option means {cmd:ranktest} uses the LIML residuals method. +Because it is a robust score test, +the test is invariant to how the Y variables are partitioned +when the LIML residuals method is used. +See the {help "ranktest##examples":examples} below. + +{marker CDrobust}{...} +{bf:Cragg-Donald (CUE-based) rank test (robust version)} + +{pstd}Cragg-Donald (1993, 1997) present a test for the rank of B for the non-iid case +that is based on the Generalized Method of Moments (GMM). +Windmeijer (2018) shows that their test statistic +is equal to a J statistic from a regression estimated using +GMM CUE (the continuously-updated GMM estimator), +where the Y variables are partitioned into +some that are treated as dependent (LHS) variables +and the remainder are endogenous (RHS) regressors. +Because it is a robust score test, +the test is invariant to how the Y variables are partitioned. +See the {help "ranktest##examples":examples} below. +The robust CD statistic is obtained from {cmd:ranktest} using the option {opt jcue} +in order to distinguish it from the CD statistic for the iid case +presented in the same 1993 paper. +(NB: 2-step efficient GMM can be used instead of GMM CUE with the {opt jgmm2s} option. +For more on variants of J- and LIML-based test statistics, see Windmeijer (2018).) + +{marker numerical}{...} +{title:Notes on numerical methods and options} + +{pstd}To help with numerical stability, +by default all variables are standardized to have unit variance +prior to calculation of the test statistics. +This can be turned off with the {opt nostd} option. +Returned results such as coefficient vectors and covariances +are unstandardized after estimation, +so this option affects only the numerical optimization and not the reported results. +In addition, prior to the calculation of the CUE-based tests, +the Y variables are reordered according to eigenvalues. +This can be turned off with the {opt noevorder} option. + +{pstd}The default behavior of {cmd:ranktest} +is to use the iterative algorithm of Windmeijer (2018) for the GMM CUE estimator +until convergence (according to either {opt btol(real)} or {opt jtol(real)}), +followed by numerical minimization using Mata's {opt optimize(.)} +until convergence (again according to either {opt btol(real)} or {opt jtol(real)}). +The {opt nocombiter} option causes {cmd:ranktest} to rely only on the iterative algorithm; +the {opt noiterate} option causes it to rely only on numerical minimization. +Note that the CUE objective function is not guaranteed to have a unique minimum, +and hence the algorithm may converge to a local minimum; +see below for an example. + +{pstd} +The coefficients for the GMM regression +behind the J-based test statistics (CUE and 2-step GMM) +for the test of the highest rank reported by {cmd:ranktest} +are saved in the macro {opt r(b)}. +The macro {opt r(b0)} has the initial coefficient vector used in the algorithm. +To obtain the coefficients and variance-covariance matrix +corresponding to a CUE or 2-step GMM estimation, +use the {opt noevorder} option and in {cmd:(}{it:varlist1}{cmd:)} +specify the dependent variable(s) followed by the endogenous regressors. +See the example(s) below. + +{pstd} +The GMM CUE estimator corresponding to the LM form of the CUE-based J statistic +is not invariant to the partialling out +of the variables in X (including the constant). +The intuition is that the projection coefficients +used to partial out X are OLS coefficients, +whereas in a full CUE specification in which X are explicit exogenous regressors, +the orthogonality conditions in Z are also used when estimating the coefficients on X. +The test statistic corresponding to a full CUE specification +can be obtained by including the exogenous regressors including the constant +in both Y ({it:varlist1}) and Z ({it:varlist2}). +See the example below. +(NB: the Wald form of the CUE-based J statistic is invariant to partialling-out.) + + +{marker s_macros}{title:Stored results} + +{pstd}{cmd:ranktest} stores the following results in {cmd:r()}: + +{synoptset 19 tabbed}{...} +{p2col 5 19 23 2: scalars}{p_end} +{synopt:{cmd:r(N)}}Number of observations{p_end} +{synopt:{cmd:r(N_clust)}}Number of clusters{p_end} +{synopt:{cmd:r(K1)}}Rank of Y matrix (number of non-collinear variables in {it:varlist1}){p_end} +{synopt:{cmd:r(K2)}}Rank of Z matrix (number of non-collinear variables in {it:varlist2}){p_end} +{synopt:{cmd:r(K3)}}Rank of X matrix ({it:varlist3}, +number of partialled-out non-collinear variables including the constant){p_end} +{synopt:{cmd:r(chi2)}}rk statistic for highest rank tested{p_end} +{synopt:{cmd:r(p)}}p-value of rk statistic{p_end} +{synopt:{cmd:r(rdf)}}dof of rk statistic{p_end} +{synopt:{cmd:r(rank)}}Rank of matrix under H0 for highest rank tested{p_end} +{synopt:{cmd:r(cons)}}=1 if constant present, =0 if not{p_end} + +{synoptset 19 tabbed}{...} +{p2col 5 19 23 2: macros}{p_end} +{synopt:{cmd:r(version)}}Version number of {cmd:ranktest}{p_end} +{synopt:{cmd:r(varlist1)}}First (Y) varlist provided to {cmd:ranktest}{p_end} +{synopt:{cmd:r(varlist2)}}Second (Z) varlist provided to {cmd:ranktest}{p_end} +{synopt:{cmd:r(partial)}}Third (X) varlist of partialled-out variables (not including the constant){p_end} +{synopt:{cmd:r(collin)}}Dropped collinear variables in Y and/or Z{p_end} +{synopt:{cmd:r(testtype)}}LR, LM or Wald{p_end} +{synopt:{cmd:r(method)}}kp, jcue, jgmm2s, etc.{p_end} + +{synoptset 19 tabbed}{...} +{p2col 5 19 23 2: matrices}{p_end} +{synopt:{cmd:r(rkmarix)}}Saved results of rank tests{p_end} +{synopt:{cmd:r(ccorr)}}Matrix of canonical correlations{p_end} +{synopt:{cmd:r(eval)}}Matrix of eigenvalues (=squared canonical correlations){p_end} +{p2col 5 19 23 2: (CUE- and 2-step GMM-based tests of a single order of rank reduction only)}{p_end} +{synopt:{cmd:r(b)}}Coefficient vector from CUE or 2-step GMM estimation{p_end} +{synopt:{cmd:r(b0)}}Initial coefficient vector for CUE or 2-step GMM estimation{p_end} +{synopt:{cmd:r(V)}}Covariance matrix of CUE or 2-step GMM estimator{p_end} +{synopt:{cmd:r(S)}}Covariance matrix of orthogonality conditions{p_end} +{p2col 5 19 23 2: (Canonical correlations or KP-based tests only)}{p_end} +{synopt:{cmd:r(S)}}Covariance matrix (asymptotic variance of Z'V){p_end} +{synopt:{cmd:r(V)}}Covariance matrix (Omega in Kleibergen-Paap (2006){p_end} + + +{marker examples}{title:Examples} + +{col 0}{bf:Tests for underidentification of Klein consumption equation.} + +{pstd} +Underidentification means endogenous regressors (profits wagetot) are not identified +by the excluded instruments (govt taxnetx year wagegovt capital1 L.totinc) after +partialling-out the included instruments (L.totinc _cons). +Test is equivalent to testing whether the matrix of reduced form coefficients for the endogenous regressors +is full rank (K1=2) vs. less than full rank (K1=1). +The test for underidentification should not be confused with a test for "weak identification"; + +{phang2}. {stata "webuse klein, clear"}{p_end} +{phang2}. {stata "tsset yr"}{p_end} + +{pstd} +Klein consumption equation - for reference. + +{phang2}. {stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc)"}{p_end} + +{pstd} +IID case, LM => Anderson canonical correlations test; test all ranks. +H0 of rank=1 can be rejected, suggesting the model is identified. + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits)"}{p_end} + +{pstd} +IID case, Wald => Cragg-Donald (1993, 1997) test; test all ranks. +H0 of rank=1 can be rejected, suggesting model is identified. + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald"}{p_end} + +{pstd} +Heteroskedastic-robust Kleibergen-Paap LIML-based LM statistic, test for full rank only. +H0 of rank=1 now cannot be rejected, suggesting model may be underidentified. + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) full robust"}{p_end} + +{pstd} +Heteroskedastic-robust Cragg-Donald CUE-based LM statistic, test for full rank only. +H0 of rank=1 now cannot be rejected, suggesting model may be underidentified. + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) full robust jcue"}{p_end} + +{pstd} +Heteroskedastic and autocorrelation robust, Cragg-Donald CUE-based LM statistic, test for full rank only. + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) full robust bw(2) jcue"}{p_end} + + +{bf:Testing for reduced rank in VAR models.} + +{pstd} +Relationship of Johansen trace statistic and Anderson canonical correlations statistic. +Former is an LR test, {cmd:ranktest} reports LM version of latter, +but based on the same eigenvalues. +Note that the p-values reported by {cmd:ranktest} (unlike those reported by {cmd:vecrank}) +are not valid in this application because they are for the standard stationary case. + +{phang2}. {stata "vecrank consump profits wagetot, lags(1)"}{p_end} + +{phang2}. {stata "ranktest (d.consump d.profits d.wagetot) (L1.consump L1.profits L1.wagetot), lr"}{p_end} +{phang2}. {stata "mat list r(eval)"}{p_end} + +{pstd} +HAC (heteroskedastic- and autocorrelation-consistent) tests for reduced rank in a VAR model. +The Kleibergen-Paap robust test statistics reported by {cmd:ranktest} below +use a Barlett (Newey-West) kernel with bandwidth=3. +Kleibergen-Paap (2006) show that the distribution of the KP statistic +is the same as that of the Johansen trace statistic +and hence the critical values reported in the output of {cmd:vecrank} can be used +(and not the p-values in the {cmd:ranktest} output). + +{phang2}. {stata "ranktest (d.consump d.profits d.wagetot) (L1.consump L1.profits L1.wagetot), rob bw(3)"}{p_end} + + +{col 0}{bf:Equivalences between rk statistic and other test statistics} + +{pstd} +Examples use the Klein consumption equation, +shown immediately below for reference. +Stata variables Lprofits, Ltotinc and esample also created here. +These are used in the Mata examples below. + +{phang2}. {stata "webuse klein, clear"}{p_end} +{phang2}. {stata "tsset yr"}{p_end} +{phang2}. {stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc)"}{p_end} +{phang2}. {stata "gen byte esample=e(sample)"}{p_end} +{phang2}. {stata "gen Lprofits=L.profits"}{p_end} +{phang2}. {stata "gen Ltotinc=L.totinc"}{p_end} + +{pstd} +Equivalence of {cmd:ranktest} LM statistic and canonical correlations in the iid case. + +{phang2}. {stata "canon (profits wagetot) (govt taxnetx year wagegovt)"}{p_end} +{phang2}. {stata "mat list e(ccorr)"}{p_end} + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt)"}{p_end} +{phang2}. {stata "mat list r(rkmatrix)"}{p_end} + +{pstd} +Illustration of LM version vs Wald version of rk statistic in the iid case. +In the non-robust iid case, the Anderson and Cragg-Donald statistics can be obtained +as Sargan and Basmann J statistics from LIML estimation, respectively. +{cmd:ivreg2} is used instead of {cmd:regress} +in order to obtain a test statistic without a small-sample adjustment. + +{pstd} +LM (Anderson, Sargan) version: + +{phang2}. {stata "qui ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) liml"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} +{phang2}. {stata "cap drop ehat"}{p_end} +{phang2}. {stata "predict double ehat, r"}{p_end} +{phang2}. {stata "qui ivreg2 ehat L.profits govt taxnetx year wagegovt capital1 L.totinc"}{p_end} +{phang2}(as an LM NR2 test statistic:){p_end} +{phang2}. {stata "di e(N)*e(r2)"}{p_end} + +{phang2}. {stata "ranktest (consump profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rr(1)"}{p_end} + +{pstd} +Wald (Cragg-Donald, Basmann) version: + +{phang2}. {stata "qui ivreg2 ehat L.profits govt taxnetx year wagegovt capital1 L.totinc"}{p_end} +{phang2}. {stata "test govt taxnetx year wagegovt capital1 L.totinc"}{p_end} + +{phang2}. {stata "ranktest (consump profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rr(1) wald"}{p_end} + +{pstd} +Equality of Cragg-Donald CUE-based robust rk statistic for rank reduction=1 +and J test statistic from GMM CUE estimation. + +{phang2}. {stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob cue"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} +{phang2}. {stata "ranktest (consump profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob jcue rr(1)"}{p_end} +{phang2}. {stata "di r(chi2)"}{p_end} + +{pstd} +Using {opt ranktest} as a GMM CUE estimator. +Use {opt noevorder} to control which is the dependent variable and which are the endogenous regressors. +Use the {opt rr(1)} option to specify that there is a single dependent variable (single-equation CUE estimation). +Use a HAC-covariance estimator. +NB: results differ slightly because of differences in numerical optimization. + +{phang2}. {stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob bw(3) cue"}{p_end} +{phang2}. {stata "mat list e(b)"}{p_end} +{phang2}. {stata "mat list e(V)"}{p_end} +{phang2}. {stata "ranktest (consump profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob bw(3) jcue rr(1) noevorder"}{p_end} +{phang2}. {stata "mat list r(b)"}{p_end} +{phang2}. {stata "mat list r(V)"}{p_end} + +{pstd} +Invariance of the Cragg-Donald CUE-based robust test statistic: +switch wagetot and consump +so that wagetot is the dependent variable (was an endogenous regressor) +and consump is an endogenous regressor (was the dependent variable), +and the same J statistic is obtained. + +{phang2}. {stata "qui ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob cue"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} +{phang2}. {stata "qui ivreg2 wagetot L.profits (profits consump = govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob cue"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} + +{pstd} +CUE coefficients when partialling out vs not partialling out: +include the exogenous regressor L.profits and a constant in Y and X. +Also use the {opt noevorder} and {opt nocons} options. +Note this refers to the LM form of the CUE-based J test; +the Wald form is invariant to partialling out + +{phang2}. {stata "qui ranktest (consump profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob jcue rr(1) noevorder"}{p_end} +{phang2}. {stata "mat list r(b)"}{p_end} +{phang2}. {stata "qui ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rob cue"}{p_end} +{phang2}. {stata "mat list e(b)"}{p_end} + +{phang2}. {stata "gen byte one=1"}{p_end} +{phang2}. {stata "qui ranktest (consump profits wagetot L.profits one) (govt taxnetx year wagegovt capital1 L.totinc L.profits one), rob jcue rr(1) noevorder nocons"}{p_end} +{phang2}. {stata "mat list r(b)"}{p_end} +{phang2}. {stata "qui ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc), rob cue"}{p_end} +{phang2}. {stata "mat list e(b)"}{p_end} + +{pstd} +Kleibergen-Paap LIML-based robust score test for rank reduction=1 +as a J test in an artificial regression +using LIML residuals and a subset of the fitted values of Y. +Denoting profits as Y1 and wagetot as Y2, +the LIML residuals are obtained from a LIML estimation +with Y1 as the dependent variable and Y2 as the endogenous regressor. +First create LIML residuals and then create the fitted values of the subset of Y in Mata. +(NB: The Stata variables Lprofits, Ltotinc and esample were created above.) +The J statistic reported by {cmd:ivreg2} is an LM-type test +of the significance of the excluded instruments +with the LIML residuals as the dependent variable, +the fitted Y2 as an additional exogenous regressor, +and an arbitrary subset of instruments +(dropping one instrument since dim(Y2)=1). + +{pstd} +First calculated the fitted values of the endogenous Y2 (wagetot): + +{phang2}. {stata "qui ivreg2 profits L.profits (wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml"}{p_end} +{phang2}. {stata "cap drop ehat"}{p_end} +{phang2}. {stata "predict double ehat, r"}{p_end} +{phang2}. {stata "putmata Y=(wagetot) Z=(govt taxnetx year wagegovt capital1 Ltotinc) U=(ehat Lprofits 1) yr if esample, replace"}{p_end} +{phang2}. {stata "mata: Ztilde = Z - U*invsym(U'U)*U'Z"}{p_end} +{phang2}. {stata "mata: Yhat = Ztilde*invsym(Ztilde'Ztilde)*Ztilde'Y"}{p_end} +{phang2}. {stata "getmata (wagetothat)=Yhat, id(yr) replace"}{p_end} + +{pstd} +Now show the J statistic is identical to the {cmd:ranktest} LM version of the robust KP test statistic; L.totinc is the omitted instrument: + +{phang2}. {stata "qui ivreg2 ehat wagetothat L.profits (=govt taxnetx year wagegovt capital1), rob"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rr(1) rob"}{p_end} + +{pstd} +LM version vs Wald version of the robust KP test statistic in an artificial regression. +LM version is obtained as above with Z variables as excluded instruments. +Wald version is obtained as a Wald test using OLS with the Z variables as regressors. +L.totinc is the dropped instrument. +{cmd:ivreg2} is used instead of {cmd:regress} to perform OLS +in order that no small-sample adjustments are applied and a chi-sq statistic is reported by {cmd:test}. + +{phang2}. {stata "qui ivreg2 ehat wagetothat L.profits (=govt taxnetx year wagegovt capital1), rob"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rr(1) rob"}{p_end} + +{phang2}. {stata "qui ivreg2 ehat wagetothat govt taxnetx year wagegovt capital1 L.profits, rob"}{p_end} +{phang2}. {stata "test govt taxnetx year wagegovt capital1"}{p_end} +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) rr(1) rob wald"}{p_end} + +{pstd} +Invariance of the Kleibergen-Paap LIML-based robust score test: +reverse Y1 and Y2 (profits and wagetot) and the same statistic is obtained: + +{phang2}. {stata "qui ivreg2 profits L.profits (wagetot = govt taxnetx year wagegovt capital1 L.totinc), liml"}{p_end} +{phang2}. {stata "cap drop ehat"}{p_end} +{phang2}. {stata "predict double ehat, r"}{p_end} +{phang2}. {stata "putmata Y=(profits) U=(ehat Lprofits 1) yr if esample, replace"}{p_end} +{phang2}. {stata "mata: Ztilde = Z - U*invsym(U'U)*U'Z"}{p_end} +{phang2}. {stata "mata: Yhat = Ztilde*invsym(Ztilde'Ztilde)*Ztilde'Y"}{p_end} +{phang2}. {stata "getmata (profitshat)=Yhat, id(yr) replace"}{p_end} + +{phang2}. {stata "qui ivreg2 ehat profitshat L.profits (=govt taxnetx year wagegovt capital1), rob"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} + +{pstd} +Invariance: drop govt (or any other instrument) instead of L.totinc and the same statistic is obtained: + +{phang2}. {stata "qui ivreg2 ehat profitshat L.profits (=taxnetx year wagegovt capital1 L.totinc), rob"}{p_end} +{phang2}. {stata "di e(j)"}{p_end} + +{pstd} +Invariance: drop taxnetx (or any other instrument) instead of L.totinc and the same statistic is obtained: + +{phang2}. {stata "qui ivreg2 ehat profitshat govt year wagegovt capital1 L.totinc L.profits, rob"}{p_end} +{phang2}. {stata "test govt year wagegovt capital1 L.totinc"}{p_end} + +{pstd} +Equality of robust rk statistic and Wald test from OLS regression in special case of single regressor. +Note that this is a test of H0:rank=0 and so applies to both the robust KP and robust CD tests. + +{phang2}. {stata "qui ivreg2 profits govt taxnetx year wagegovt capital1 L.totinc L.profits, robust"}{p_end} +{phang2}. {stata "test govt taxnetx year wagegovt capital1 L.totinc"}{p_end} + +{phang2}. {stata "ranktest (profits) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald robust"}{p_end} + +{pstd} +Equality of rk statistic of null rank and Wald test from OLS regressions and a +Kronecker covariance matrix (independent and homoskedastic equations). +To show equality, estimate the equations using {cmd:reg3} specifying that all regressors are exogenous, +and then test joint significance of Z variables in both regressions. +L.profits is the partialled-out variable and is not tested. + +{phang2}. {stata "global e1 (profits govt taxnetx year wagegovt capital1 L.totinc L.profits)"}{p_end} +{phang2}. {stata "global e2 (wagetot govt taxnetx year wagegovt capital1 L.totinc L.profits)"}{p_end} +{phang2}. {stata "reg3 $e1 $e2, allexog"}{p_end} +{phang2}. {stata "qui test [profits]govt [profits]taxnetx [profits]year [profits]wagegovt [profits]capital1 [profits]L.totinc"}{p_end} +{phang2}. {stata "test [wagetot]govt [wagetot]taxnetx [wagetot]year [wagetot]wagegovt [wagetot]capital1 [wagetot]L.totinc, accum"}{p_end} + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald null "}{p_end} + +{pstd} +Equality of rk statistic of null rank and Wald test from OLS regressions and {cmd:suest}. +To show equality, use {cmd:suest} to test joint significance of Z variables in both regressions. +L.profits is the partialled-out variable and is not tested. +Note that {cmd:suest} introduces a finite sample adjustment of (N-1)/N. + +{phang2}. {stata "qui regress profits govt taxnetx year wagegovt capital1 L.totinc L.profits"}{p_end} +{phang2}. {stata "est store e1"}{p_end} +{phang2}. {stata "qui regress wagetot govt taxnetx year wagegovt capital1 L.totinc L.profits"}{p_end} +{phang2}. {stata "est store e2"}{p_end} +{phang2}. {stata "qui suest e1 e2"}{p_end} +{phang2}. {stata "qui test [e1_mean]govt [e1_mean]taxnetx [e1_mean]year [e1_mean]wagegovt [e1_mean]capital1 [e1_mean]L.totinc"}{p_end} +{phang2}. {stata "test [e2_mean]govt [e2_mean]taxnetx [e2_mean]year [e2_mean]wagegovt [e2_mean]capital1 [e2_mean]L.totinc, accum"}{p_end} +{phang2}. {stata "di r(chi2)*e(N)/(e(N)-1)"}{p_end} + +{phang2}. {stata "ranktest (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald null robust"}{p_end} + +{pstd} +The test for a rank reduction of 2 (rank=1) +is the Arellano-Hansen-Sentana (2012) I test for underidentification: + +{phang2}. {stata "ranktest (consump profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) robust bw(2) jcue rr(2)"}{p_end} + + +{marker replication}{title:Replication: Manresa et al. (2017)} + +{bf:Testing for reduced rank in an asset pricing model.} + +{pstd} +Manresa et al. (2017) present an application using Yogo's (2006) data +with 3 observable risk factors +and quarterly returns on the Fama-French cross-section of 25 portfolios +for the period 1951-2001. +GMM CUE J-based tests below of rank 1, 2, and 3 correspond to +sets of stochastic discount factors (SDFs) of dimension 3, 2 and 1, respectively +and replicate the results they present in their Table 1. +A vector of ones (i.e., a constant) is explicitly included along with the 3 risk factors. +Note that in the last specification the vector of ones is included in {it:both} the Y and Z varlists. +Tests use a heteroskedastic- and autocorrelation-consistent VCE +with centered moments and a Bartlett kernel with bandwidth=2. +The {opt noevorder} option is used when replicating the coefficients +in order to control which variables are treated as dependent variables/endogenous regressors +in the underlying CUE GMM estimations. +The rejection of rank=1 (dimension=3) +and the failure to reject rank=2 (dimension=2) +at conventional levels +suggest the admissible SDFs lie in a two-dimensional subspace +(Manresa et al. 2017, p. 16). +The fact that the null of zero means of the SDFs is not rejected (p=0.494) +suggests the model is completely overspecified, +where "overspecified" means the model has "at least one non-zero SDF which is uncorrelated +with the excess returns on the vector of test assets" (Manresa et al. 2017, p. 1). + +{pstd} +Note that although the first estimation replicates the Manresa et al. results, +the resulting test statistic for rank=1 (dimension 3) is actually a local minimum. +The second estimation uses the default initial 2SLS beta +instead of the optional LIML beta +and achieves a smaller value for the rank=1 test in this case. + +{phang2}. {stata `"import excel "https://www.dropbox.com/s/roxp36yyzjw93kb/fr.xls?dl=1", first clear"'}{p_end} +{phang2}. {stata "gen int t = _n"}{p_end} +{phang2}. {stata "tsset t"}{p_end} +{phang2}. {stata "gen byte one = 1"}{p_end} + +{pstd}Replicate J statistics reported in "Criterion" row of Table 1 of Manresa et al. (2017):{p_end} +{phang2}. {stata "ranktest (one f1-f3) (r1-r25), jcue noconstant rob bw(2) center nodots binit(liml)"}{p_end} + +{pstd}Test statistic for rank=1 is smaller than that reported in Table 1 of Manresa et al. (2017):{p_end} +{phang2}. {stata "ranktest (one f1-f3) (r1-r25), jcue noconstant rob bw(2) center nodots"}{p_end} + +{pstd}Replicate coefficients #1 and #2 in first column in "Two-dimensional Set" of Table 1:{p_end} +{phang2}. {stata "qui ranktest (one f3 f1 f2) (r1-r25), jcue rr(2) noconstant rob bw(2) center noevorder"}{p_end} +{phang2}. {stata "mat b_cf1f2 = r(b)"}{p_end} +{phang2}. {stata "mat b_cf1f2 = b_cf1f2[1,1..2]"}{p_end} +{phang2}. {stata "mat list b_cf1f2"}{p_end} + +{pstd}Replicate coefficients #1 and #3 in second column in "Two-dimensional Set" of Table 1:{p_end} +{phang2}. {stata "qui ranktest (one f2 f1 f3) (r1-r25), jcue rr(2) noconstant rob bw(2) center noevorder"}{p_end} +{phang2}. {stata "mat b_cf1f3 = r(b)"}{p_end} +{phang2}. {stata "mat b_cf1f3 = b_cf1f3[1,1..2]"}{p_end} +{phang2}. {stata "mat list b_cf1f3"}{p_end} + +{pstd}Replicate all 4 p-values in third column in "Two-dimensional Set" of Table 1,:{p_end} +{pstd}First obtain and save J statistic for full model.{p_end} +{phang2}. {stata "qui ranktest (one f3 f1 f2) (r1-r25), jcue rr(2) noconstant rob bw(2) center"}{p_end} +{phang2}. {stata "scalar jfull = r(chi2)"}{p_end} +{pstd}Report p-values from GMM distance tests for f1, f2, f3 and c_i (means of SDFs):{p_end} +{phang2}. {stata "qui ranktest (one f2 f3) (r1-r25), jcue rr(2) noconstant rob bw(2) center"}{p_end} +{phang2}. {stata "di chi2tail(2,r(chi2)-jfull)"}{p_end} +{phang2}. {stata "qui ranktest (one f1 f3) (r1-r25), jcue rr(2) noconstant rob bw(2) center"}{p_end} +{phang2}. {stata "di chi2tail(2,r(chi2)-jfull)"}{p_end} +{phang2}. {stata "qui ranktest (one f1 f2) (r1-r25), jcue rr(2) noconstant rob bw(2) center"}{p_end} +{phang2}. {stata "di chi2tail(2,r(chi2)-jfull)"}{p_end} +{phang2}. {stata "qui ranktest (one f1 f2 f3) (one r1-r25), jcue rr(2) noconstant rob bw(2) center"}{p_end} +{phang2}. {stata "di chi2tail(2,r(chi2)-jfull)"}{p_end} + + +{marker s_refs}{title:References} + +{p 0 4}Anderson, T.W. 1951. Estimating linear restrictions on regression coefficients +for multivariate normal distributions. Annals of Mathematical Statistics, Vol. 22, pp. 327-51. + +{p 0 4}Arellano, M., Hansen, L.P., and Sentana, E. 2012. +Underidentification? Journal of Econometrics, Vol. 170, pp. 256-280. + +{p 0 4}Cragg, J.G. and Donald, S.G. 1993. Testing Identfiability and Specification in +Instrumental Variables Models. Econometric Theory, Vol. 9, pp. 222-240. + +{p 0 4}Cragg, J.G. and Donald, S.G. 1997. Inferring the Rank of a Matrix. +Journal of Econometrics, Vol. 76, pp. 223-250. + +{p 0 4}Kleibergen, F. and Paap, R. 2006. Generalized Reduced Rank Tests Using the Singular Value Decomposition. +Journal of Econometrics, Vol. 133, pp. 97-126. + +{p 0 4}Manresa, E., F. Penaranda and E. Sentana. 2017. +Empirical evaluation of overspecified asset pricing models. +{browse "https://ideas.repec.org/p/cmf/wpaper/wp2017_1711.html":CEMFI Working Papers 1711, CEMFI, Madrid}, +and {browse "https://ideas.repec.org/p/cpr/ceprdp/12085.html":CEPR Discussion Paper Series No. DP12085, CEPR, London}. + +{p 0 4}Windmeijer, F. 2018. Testing Over- and Underidentification in Linear Models, +with Applications to Dynamic Panel Data and Asset-Pricing Models. +{browse "https://ideas.repec.org/p/bri/uobdis/18-696.html":Bristol Economics Discussion Papers 18/696}. + +{p 0 4}Yogo, M. 2006. A consumption-based explanation of expected stock returns. +Journal of Finance, Vol. 61, pp. 539-580. + + +{marker s_acknow}{title:Acknowledgements} + +{p}We would like to thank Kit Baum and Austin Nichols for helpful suggestions and feedback +on the original version of {opt ranktest}. + + +{marker s_citation}{title:Citation of ranktest} + +{p}{cmd:ranktest} is not an official Stata command. It is a free contribution +to the research community, like a paper. Please cite it as such: {p_end} + +{phang}Kleibergen, F., Schaffer, M.E. 2020, Windmeijer, F. +ranktest: module for testing the rank of a matrix +{browse "http://ideas.repec.org/c/boc/bocode/s456865.html":http://ideas.repec.org/c/boc/bocode/s456865.html}{p_end} + + +{title:Authors} + + Frank Kleibergen, University of Amsterdam, Netherlands + F.R.Kleibergen@uva.nl + + Mark E Schaffer, Heriot-Watt University, UK + m.e.schaffer@hw.ac.uk + + Frank Windmeijer, Oxford University, UK + frank.windmeijer@stats.ox.ac.uk + + +{title:Also see} + +{p 1 14}Manual: {hi:[R] canon}{p_end} + +{p 1 10}On-line: help for {help canon}, {help vecrank}, {help avar}, {help ivreg2} (if installed){p_end} diff --git a/data/ado/r/ranktest11.ado b/data/ado/r/ranktest11.ado new file mode 100644 index 0000000..9a0b073 --- /dev/null +++ b/data/ado/r/ranktest11.ado @@ -0,0 +1,981 @@ +*! ranktest11 1.4.01 based on ranktest 1.4.01 of 18aug2015 +*! author mes, based on code by fk +*! see end of file for version comments + +if c(version) < 12 { +* ranktest uses livreg2 Mata library. +* Ensure Mata library is indexed if new install. +* Not needed for Stata 12+ since ssc.ado does this when installing. + capture mata: mata drop m_calckw() + capture mata: mata drop m_omega() + capture mata: mata drop ms_vcvorthog() + capture mata: mata drop s_vkernel() + mata: mata mlib index +} + +program define ranktest11, rclass sortpreserve + + local lversion 01.4.01 + + if _caller() < 11 { + ranktest9 `0' + return add // otherwise all the ranktest9 results are zapped + return local ranktestcmd ranktest9 + return local cmd ranktest + return local version `lversion' + exit + } + version 11.2 + + if substr("`1'",1,1)== "," { + if "`2'"=="version" { + di in ye "`lversion'" + return local version `lversion' + exit + } + else { +di as err "invalid syntax" + exit 198 + } + } + +* If varlist 1 or varlist 2 have a single element, parentheses optional + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local y `s(varlist)' + local 0 `"`s(rest)'"' + sret clear + } + else { + local y `1' + mac shift 1 + local 0 `"`*'"' + } + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local z `s(varlist)' + local 0 `"`s(rest)'"' + sret clear + } + else { + local z `1' + mac shift 1 +* Need to reinsert comma before options (if any) for -syntax- command to work + local 0 `", `*'"' + } + +// Note that y or z could be a varlist, e.g., "y1-y3", so they need to be unab-ed. + tsunab y : `y' + local K : word count `y' + tsunab z : `z' + local L : word count `z' + +* Option version ignored here if varlists were provided + syntax [if] [in] [aw fw pw iw/] /// + [, /// + partial(varlist ts) /// + fwl(varlist ts) /// + NOConstant /// + wald /// + ALLrank /// + NULLrank /// + FULLrank /// + ROBust /// + cluster(varlist) /// + BW(string) /// + kernel(string) /// + Tvar(varname) /// + Ivar(varname) /// + sw /// + psd0 /// + psda /// + version /// + dofminus(integer 0) /// + ] + + local partial "`partial' `fwl'" + local partial : list retokenize partial + + local cons = ("`noconstant'"=="") + + if "`wald'"~="" { + local LMWald "Wald" + } + else { + local LMWald "LM" + } + + local optct : word count `allrank' `nullrank' `fullrank' + if `optct' > 1 { +di as err "Incompatible options: `allrank' `nullrank' `fullrank'" + error 198 + } + else if `optct' == 0 { +* Default + local allrank "allrank" + } + + local optct : word count `psd0' `psda' + if `optct' > 1 { +di as err "Incompatible options: `psd0' `psda'" + error 198 + } + local psd "`psd0' `psda'" + local psd : list retokenize psd + +* Note that by tsrevar-ing here, subsequent disruption to the sort doesn't matter +* for TS operators. + tsrevar `y' + local vl1 `r(varlist)' + tsrevar `z' + local vl2 `r(varlist)' + tsrevar `partial' + local partial `r(varlist)' + + foreach vn of varlist `vl1' { + tempvar tv + qui gen double `tv' = . + local tempvl1 "`tempvl1' `tv'" + } + foreach vn of varlist `vl2' { + tempvar tv + qui gen double `tv' = . + local tempvl2 "`tempvl2' `tv'" + } + + marksample touse + markout `touse' `vl1' `vl2' `partial' `cluster', strok + +* Stock-Watson and cluster imply robust. + if "`sw'`cluster'" ~= "" { + local robust "robust" + } + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + if "`fsqrt(wf)*(wvar^0.5):*'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "fweight" & "`sw'" != "" { + di in red "fweights currently not supported with -sw- option" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`bw'" !="" { + di in red "iweights not allowed with robust, cluster, AC or HAC" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + + +* Every time a weight is used, must multiply by scalar wf ("weight factor") +* wf=1 for no weights, fw and iw, wf = scalar that normalizes sum to be N if aw or pw + sum `wvar' if `touse' `wtexp', meanonly +* Weight statement + if "`weight'" ~= "" { +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + if "`weight'"=="" | "`weight'"=="fweight" | "`weight'"=="iweight" { +* If weight is "", weight var must be column of ones and N is number of rows. +* With fw and iw, effective number of observations is sum of weight variable. + local wf=1 + local N=r(sum_w) + } + else if "`weight'"=="aweight" | "`weight'"=="pweight" { +* With aw and pw, N is number of obs, unadjusted. + local wf=r(N)/r(sum_w) + local N=r(N) + } + else { +* Should never reach here +di as err "ranktest error - misspecified weights" + exit 198 + } + +* HAC estimation. +* If bw is omitted, default `bw' is empty string. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. + if "`bw'" == "" & "`kernel'" == "" { + local bw=0 + } + else { +* Need tvar for markout with time-series stuff +* Data must be tsset for time-series operators in code to work +* User-supplied tvar checked if consistent with tsset + capture tsset + if "`r(timevar)'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } +* If no panel data, ivar will still be empty + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already -tsset-" + exit 5 + } + local tdelta `r(tdelta)' + tsreport if `touse', panel + if `r(N_gaps)' != 0 { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + +* Check it's a valid kernel and replace with unabbreviated kernel name; check bw. +* Automatic kernel selection allowed by ivreg2 but not ranktest so must trap. +* s_vkernel is in livreg2 mlib. + if "`bw'"=="auto" { +di as err "invalid bandwidth in option bw() - must be real > 0" + exit 198 + } + mata: s_vkernel("`kernel'", "`bw'", "`ivar'") + local kernel `r(kernel)' + local bw = `r(bw)' + } + +* tdelta missing if version 9 or if not tsset + if "`tdelta'"=="" { + local tdelta=1 + } + + if "`sw'"~="" { + capture xtset + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already tsset or xtset" + exit 5 + } +* Exit with error if ivar is neither supplied nor tsset nor xtset + if "`ivar'"=="" { +di as err "Must -xtset- or -tsset- data or specify -ivar- with -sw- option" + exit 198 + } + qui describe, short varlist + local sortlist "`r(sortlist)'" + tokenize `sortlist' + if "`ivar'"~="`1'" { +di as err "Error - dataset must be sorted on panel var with -sw- option" + exit 198 + } + } + +* Create variable used for getting lags etc. in Mata + tempvar tindex + qui gen `tindex'=1 if `touse' + qui replace `tindex'=sum(`tindex') if `touse' + +********** CLUSTER SETUP ********************************************** + +* Mata code requires data are sorted on (1) the first var cluster if there +* is only one cluster var; (2) on the 3rd and then 1st if two-way clustering, +* unless (3) two-way clustering is combined with kernel option, in which case +* the data are tsset and sorted on panel id (first cluster variable) and time +* id (second cluster variable). +* Second cluster var is optional and requires an identifier numbered 1..N_clust2, +* unless combined with kernel option, in which case it's the time variable. +* Third cluster var is the intersection of 1 and 2, unless combined with kernel +* opt, in which case it's unnecessary. +* Sorting on "cluster3 cluster1" means that in Mata, panelsetup works for +* both, since cluster1 nests cluster3. +* Note that it is possible to cluster on time but not panel, in which case +* cluster1 is time, cluster2 is empty and data are sorted on panel-time. +* Note also that if data are sorted here but happen to be tsset, will need +* to be re-tsset after estimation code concludes. + + +// No cluster options or only 1-way clustering +// but for Mata and other purposes, set N_clust vars =0 + local N_clust=0 + local N_clust1=0 + local N_clust2=0 + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`kernel'"~="" { +* kernel requires either that cluster1 is time var and cluster2 is empty +* or that cluster1 is panel var and cluster2 is time var. +* Either way, data must be tsset and sorted for panel data. + if "`cluster2'"~="" { +* Allow backwards order + if "`cluster1'"=="`tvar'" & "`cluster2'"=="`ivar'" { + local cluster1 "`2'" + local cluster2 "`1'" + } + if "`cluster1'"~="`ivar'" | "`cluster2'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset panel & time vars." +di as err " tsset panel var=`ivar'; tsset time var=`tvar'; cluster vars=`cluster1',`cluster2'" + exit 198 + } + } + else { + if "`cluster1'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset time variable." +di as err " tsset time var=`tvar'; cluster var=`cluster1'" + exit 198 + } + } + } +* Simple way to get quick count of 1st cluster variable without disrupting sort +* clusterid1 is numbered 1.._Nclust1. + tempvar clusterid1 + qui egen `clusterid1'=group(`cluster1') if `touse' + sum `clusterid1' if `touse', meanonly + if "`cluster2'"=="" { + local N_clust=r(max) + local N_clust1=`N_clust' + if "`kernel'"=="" { +* Single level of clustering and no kernel-robust, so sort on single cluster var. +* kernel-robust already sorted via tsset. + sort `cluster1' + } + } + else { + local N_clust1=r(max) + if "`kernel'"=="" { + tempvar clusterid2 clusterid3 +* New cluster id vars are numbered 1..N_clust2 and 1..N_clust3 + qui egen `clusterid2'=group(`cluster2') if `touse' + qui egen `clusterid3'=group(`cluster1' `cluster2') if `touse' +* Two levels of clustering and no kernel-robust, so sort on cluster3/nested in/cluster1 +* kernel-robust already sorted via tsset. + sort `clusterid3' `cluster1' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) + } + else { +* Need to create this only to count the number of clusters + tempvar clusterid2 + qui egen `clusterid2'=group(`cluster2') if `touse' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) +* Now replace with original variable + local clusterid2 `cluster2' + } + + local N_clust=min(`N_clust1',`N_clust2') + + } // end 2-way cluster block + } // end cluster block + +************************************************************************************************ + +* Note that bw is passed as a value, not as a string + mata: s_rkstat( /// + "`vl1'", /// + "`vl2'", /// + "`partial'", /// + "`wvar'", /// + "`weight'", /// + `wf', /// + `N', /// + `cons', /// + "`touse'", /// + "`LMWald'", /// + "`allrank'", /// + "`nullrank'", /// + "`fullrank'", /// + "`robust'", /// + "`clusterid1'", /// + "`clusterid2'", /// + "`clusterid3'", /// + `bw', /// + "`tvar'", /// + "`ivar'", /// + "`tindex'", /// + `tdelta', /// + `dofminus', /// + "`kernel'", /// + "`sw'", /// + "`psd'", /// + "`tempvl1'", /// + "`tempvl2'" /// + ) + + tempname rkmatrix chi2 df df_r p rank ccorr eval + mat `rkmatrix'=r(rkmatrix) + mat `ccorr'=r(ccorr) + mat `eval'=r(eval) + mat colnames `rkmatrix' = "rk" "df" "p" "rank" "eval" "ccorr" + +di +di "Kleibergen-Paap rk `LMWald' test of rank of matrix" + if "`robust'"~="" & "`kernel'"~= "" & "`cluster'"=="" { +di " Test statistic robust to heteroskedasticity and autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`kernel'"~="" & "`cluster'"=="" { +di " Test statistic robust to autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`cluster'"~="" { +di " Test statistic robust to heteroskedasticity and clustering on `cluster'" + if "`kernel'"~="" { +di " and kernel-robust to common correlated disturbances" +di " Kernel: `kernel' Bandwidth: `bw'" + } + } + else if "`robust'"~="" { +di " Test statistic robust to heteroskedasticity" + } + else if "`LMWald'"=="LM" { +di " Test assumes homoskedasticity (Anderson canonical correlations test)" + } + else { +di " Test assumes homoskedasticity (Cragg-Donald test)" + } + + local numtests = rowsof(`rkmatrix') + forvalues i=1(1)`numtests' { +di "Test of rank=" %3.0f `rkmatrix'[`i',4] " rk=" %8.2f `rkmatrix'[`i',1] /* + */ " Chi-sq(" %3.0f `rkmatrix'[`i',2] ") pvalue=" %8.6f `rkmatrix'[`i',3] + } + scalar `chi2' = `rkmatrix'[`numtests',1] + scalar `p' = `rkmatrix'[`numtests',3] + scalar `df' = `rkmatrix'[`numtests',2] + scalar `rank' = `rkmatrix'[`numtests',4] + local N `r(N)' + return scalar df = `df' + return scalar chi2 = `chi2' + return scalar p = `p' + return scalar rank = `rank' + if "`cluster'"~="" { + return scalar N_clust = `N_clust' + } + if "`cluster2'"~="" { + return scalar N_clust1 = `N_clust1' + return scalar N_clust2 = `N_clust2' + } + return scalar N = `N' + return matrix rkmatrix `rkmatrix' + return matrix ccorr `ccorr' + return matrix eval `eval' + + tempname S V Omega + if `K' > 1 { + foreach en of local y { +* Remove "." from equation name + local en1 : subinstr local en "." "_", all + foreach vn of local z { + local cn "`cn' `en1':`vn'" + } + } + } + else { + foreach vn of local z { + local cn "`cn' `vn'" + } + } + + mat `V'=r(V) + matrix colnames `V' = `cn' + matrix rownames `V' = `cn' + return matrix V `V' + mat `S'=r(S) + matrix colnames `S' = `cn' + matrix rownames `S' = `cn' + return matrix S `S' + + return local cmd "ranktest11" + return local version `lversion' +end + +* Adopted from -canon- +program define GetVarlist, sclass + version 11.2 + sret clear + gettoken open 0 : 0, parse("(") + if `"`open'"' != "(" { + error 198 + } + gettoken next 0 : 0, parse(")") + while `"`next'"' != ")" { + if `"`next'"'=="" { + error 198 + } + local list `list'`next' + gettoken next 0 : 0, parse(")") + } + sret local rest `"`0'"' + tokenize `list' + local 0 `*' + sret local varlist "`0'" +end + +********************* EXIT IF STATA VERSION < 11 ******************************** + +* When do file is loaded, exit here if Stata version calling program is < 11. +* Prevents loading of rest of program file (would cause e.g. Stata 10 to crash at Mata). + +if c(stata_version) < 11 { + exit +} + +******************** END EXIT IF STATA VERSION < 9 ***************************** + +******************************************************************************* +*************************** BEGIN MATA CODE *********************************** +******************************************************************************* + +version 11.2 +mata: + +// ********* MATA CODE SHARED BY ivreg2 AND ranktest *************** // +// ********* 1. struct ms_vcvorthog *************** // +// ********* 2. m_omega *************** // +// ********* 3. m_calckw *************** // +// ********* 4. s_vkernel *************** // +// *********************************************************************** // + +// For reference: +// struct ms_vcvorthog { +// string scalar ename, Znames, touse, weight, wvarname +// string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel +// string scalar sw, psd, ivarname, tvarname, tindexname +// real scalar wf, N, bw, tdelta, dofminus +// real scalar center +// real matrix ZZ +// pointer matrix e +// pointer matrix Z +// pointer matrix wvar +// } + +void s_rkstat( string scalar vl1, + string scalar vl2, + string scalar partial, + string scalar wvarname, + string scalar weight, + scalar wf, + scalar N, + scalar cons, + string scalar touse, + string scalar LMWald, + string scalar allrank, + string scalar nullrank, + string scalar fullrank, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + bw, + string scalar tvarname, + string scalar ivarname, + string scalar tindexname, + tdelta, + dofminus, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar tempvl1, + string scalar tempvl2) +{ + +// iid flag used below + iid = ((kernel=="") & (robust=="") & (clustvarname=="")) + +// tempx, tempy and tempz are the Stata names of temporary variables that will be changed by s_rkstat + tempy=tokens(tempvl1) + tempz=tokens(tempvl2) + tempx=tokens(partial) + + st_view(y=.,.,tokens(vl1),touse) + st_view(z=.,.,tokens(vl2),touse) + st_view(yhat=.,.,tempy,touse) + st_view(zhat=.,.,tempz,touse) + if (partial~="") { + st_view(x=.,.,tempx,touse) + } + st_view(mtouse=.,.,tokens(touse),touse) + st_view(wvar=.,.,tokens(wvarname),touse) + noweight=(st_vartype(wvarname)=="byte") + + K=cols(y) // count of vars in first varlist + L=cols(z) // count of vars in second varlist + P=cols(x) // count of vars to be partialled out (excluding constant) + +// Note that we now use wf*wvar instead of wvar +// because wvar is raw weighting variable and +// wf*wvar normalizes so that sum(wf*wvar)=N. + +// Partial out the X variables. +// Note that this includes demeaning if there is a constant, +// i.e., variables are centered. + if (cons & P>0) { // Vars to partial out including constant + ymeans = mean(y,wf*wvar) + zmeans = mean(z,wf*wvar) + xmeans = mean(x,wf*wvar) + xy = quadcrossdev(x, xmeans, wf*wvar, y, ymeans) + xz = quadcrossdev(x, xmeans, wf*wvar, z, zmeans) + xx = quadcrossdev(x, xmeans, wf*wvar, x, xmeans) + } + else if (!cons & P>0) { // Vars to partial out NOT including constant + xy = quadcross(x, wf*wvar, y) + xz = quadcross(x, wf*wvar, z) + xx = quadcross(x, wf*wvar, x) + } + else { // Only constant to partial out = demean + ymeans = mean(y,wf*wvar) + zmeans = mean(z,wf*wvar) + } +// Partial-out coeffs. Default Cholesky; use QR if not full rank and collinearities present. +// Not necessary if no vars other than constant + if (P>0) { + by = cholqrsolve(xx, xy) + bz = cholqrsolve(xx, xz) + } +// Replace with residuals + if (cons & P>0) { // Vars to partial out including constant + yhat[.,.] = (y :- ymeans) - (x :- xmeans)*by + zhat[.,.] = (z :- zmeans) - (x :- xmeans)*bz + } + else if (!cons & P>0) { // Vars to partial out NOT including constant + yhat[.,.] = y - x*by + zhat[.,.] = z - x*bz + } + else if (cons) { // Only constant to partial out = demean + yhat[.,.] = (y :- ymeans) + zhat[.,.] = (z :- zmeans) + } + else { // no transformations required + yhat[.,.] = y + zhat[.,.] = z + } + + zhzh = quadcross(zhat, wf*wvar, zhat) + zhyh = quadcross(zhat, wf*wvar, yhat) + yhyh = quadcross(yhat, wf*wvar, yhat) + +// pihat = invsym(zhzh)*zhyh + pihat = cholqrsolve(zhzh, zhyh) + +// rzhat is F in paper (p. 103) +// iryhat is G in paper (p. 103) + ryhat=cholesky(yhyh) + rzhat=cholesky(zhzh) + iryhat=luinv(ryhat') + irzhat=luinv(rzhat') + that=rzhat'*pihat*iryhat + +// cc is canonical correlations. Squared cc is eigenvalues. + fullsvd(that, ut, cc, vt) + vt=vt' + vecth=vec(that) + ev = cc:^2 +// S matrix in paper (p. 100). Not used in code below. +// smat=fullsdiag(cc, rows(that)-cols(that)) + + if (abs(1-cc[1,1])<1e-10) { +printf("\n{text:Warning: collinearities detected between (varlist1) and (varlist2)}\n") + } + if ((missing(ryhat)>0) | (missing(iryhat)>0) | (missing(rzhat)>0) | (missing(irzhat)>0)) { +printf("\n{error:Error: non-positive-definite matrix. May be caused by collinearities.}\n") + exit(error(3351)) + } + +// If Wald, yhat is residuals + if (LMWald=="Wald") { + yhat[.,.]=yhat-zhat*pihat + yhyh = quadcross(yhat, wvar, yhat) + } + +// Covariance matrices +// vhat is W in paper (eqn below equation 17, p. 103) +// shat is V in paper (eqn below eqn 15, p. 103) + +// ************************************************************************************* // +// shat calculated using struct and programs m_omega, m_calckw shared with ivreg2 // + + struct ms_vcvorthog scalar vcvo + + + vcvo.ename = tempy // ivreg2 has = ename // + vcvo.Znames = tempz // ivreg2 has = Znames // + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = zhzh // ivreg2 has = st_matrix(ZZmatrix) // + + vcvo.e = &yhat // ivreg2 has = &e // + vcvo.Z = &zhat // ivreg2 has = &Z // + vcvo.wvar = &wvar + + shat=m_omega(vcvo) + +// *************************************************************************************** + +// prepare to start collecting test stats + if (allrank~="") { + firstrank=1 + lastrank=min((K,L)) + } + else if (nullrank~="") { + firstrank=1 + lastrank=1 + } + else if (fullrank~="") { + firstrank=min((K,L)) + lastrank=min((K,L)) + } + else { +// should never reach this point +printf("ranktest error\n") + exit + } + +// where results will go + rkmatrix=J(lastrank-firstrank+1,6,.) + +// *************************************************************************************** +// Calculate vector of canonical correlations test statistics. +// All we need if iid case. + rkvec = ev // Initialize vector with individual eigenvalues. + if (LMWald~="LM") { // LM is sum of min evals, Wald is sum of eval/(1-eval) + rkvec = rkvec :/ (1 :- rkvec) + } + for (i=(rows(rkvec)-1); i>=1; i--) { // Now loop through and sum the eigenvalues. + rkvec[i,1] = rkvec[i+1,1] + rkvec[i,1] + } + rkvec = N*rkvec // Multiply by N to get the test statistics. + +// *************************************************************************************** + +// Finally, calcluate vhat + if ((LMWald=="LM") & (iid)) { +// Homoskedastic, iid LM case means vcv is identity matrix +// Generates canonical correlation stats. Default. + vhat=I(L*K,L*K)/N + } + else { + vhat=(iryhat'#irzhat')*shat*(iryhat'#irzhat')' * N + _makesymmetric(vhat) +// Homoskedastic iid Wald case means vcv has block-diag identity matrix structure. +// Enforce this by setting ~0 entries to 0. If iid, vhat not used in calcs, for reporting only. + if ((LMWald=="Wald") & (iid)) { + vhat = vhat :* (J(K,K,1)#I(L)) + } + } + +// *************************************************************************************** +// Loop through ranks and collect test stats, dfs, p-values, ranks, evs and ev^2 (=ccs) + + for (i=firstrank; i<=lastrank; i++) { + if (iid) { // iid case = canonical correlations test + rk = rkvec[i,1] + } + else { // non-iid case + if (i>1) { + u12=ut[(1::i-1),(i..L)] + v12=vt[(1::i-1),(i..K)] + } + u22=ut[(i::L),(i..L)] + v22=vt[(i::K),(i..K)] + + symeigensystem(u22*u22', evec, eval) + u22v=evec + u22d=diag(eval) + u22h=u22v*(u22d:^0.5)*u22v' + + symeigensystem(v22*v22', evec, eval) + v22v=evec + v22d=diag(eval) + v22h=v22v*(v22d:^0.5)*v22v' + + if (i>1) { + aq=(u12 \ u22)*luinv(u22)*u22h + bq=v22h*luinv(v22')*(v12 \ v22)' + } + else { + aq=u22*luinv(u22)*u22h + bq=v22h*luinv(v22')*v22' + } + +// lab is lambda_q in paper (eqn below equation 21, p. 104) +// vlab is omega_q in paper (eqn 19 in paper, p. 104) + lab=(bq#aq')*vecth + vlab=(bq#aq')*vhat*(bq#aq')' + +// Symmetrize if numerical inaccuracy means it isn't + _makesymmetric(vlab) + vlabinv=invsym(vlab) +// rk stat Assumption 2: vlab (omega_q in paper) is nonsingular. Detected by a zero on the diagonal, +// since when returning a generalized inverse, Stata/Mata choose the generalized inverse that +// sets entire column(s)/row(s) to zeros. + if (diag0cnt(vlabinv)>0) { + rk = . +printf("\n{text:Warning: covariance matrix omega_%f}", i-1) +printf("{text: not full rank; test of rank %f}", i-1) +printf("{text: unavailable}\n") + } +// Note not multiplying by N - already incorporated in vhat. + else { + rk=lab'*vlabinv*lab + } + } // end non-iid case +// at this point rk has value of test stat +// fill out rest of row of rkmatrix +// save df, rank, etc. even if test stat not available. + df=(L-i+1)*(K-i+1) + pvalue=chi2tail(df, rk) + rkmatrix[i-firstrank+1,1]=rk + rkmatrix[i-firstrank+1,2]=df + rkmatrix[i-firstrank+1,3]=pvalue + rkmatrix[i-firstrank+1,4]=i-1 + rkmatrix[i-firstrank+1,5]=ev[i-firstrank+1,1] + rkmatrix[i-firstrank+1,6]=cc[i-firstrank+1,1] +// end of test loop + } + +// *************************************************************************************** +// Finish up and return results + + st_matrix("r(rkmatrix)", rkmatrix) + st_matrix("r(ccorr)", cc') + st_matrix("r(eval)",ev') +// Save V matrix as in paper, without factor of 1/N + vhat=N*vhat*wf + st_matrix("r(V)", vhat) +// Save S matrix as in ivreg2, with factor of 1/N + st_matrix("r(S)", shat) + st_numscalar("r(N)", N) + if (clustvarname~="") { + st_numscalar("r(N_clust)", N_clust) + } + if (clustvarname2~="") { + st_numscalar("r(N_clust2)", N_clust2) + } +// end of program +} + +// Mata utility for sequential use of solvers +// Default is cholesky; +// if that fails, use QR; +// if overridden, use QR. + +function cholqrsolve ( numeric matrix A, + numeric matrix B, + | real scalar useqr) +{ + if (args()==2) useqr = 0 + + real matrix C + + if (!useqr) { + C = cholsolve(A, B) + if (C[1,1]==.) { + C = qrsolve(A, B) + } + } + else { + C = qrsolve(A, B) + } + + return(C) + +} + +end + +* Version notes +* 1.0.00 First distributed version +* 1.0.01 With iweights, rkstat truncates N to mimic official Stata treatment of noninteger iweights +* Added warning if shat/vhat/vlab not of full rank. +* 1.0.02 Added NULLrank option +* Added eq names to saved V and S matrices +* 1.0.03 Added error catching for collinearities between varlists +* Not saving S matrix; V matrix now as in paper (without 1/N factor) +* Statistic, p-value etc set to missing if vcv not of full rank (Assumpt 2 in paper fails) +* 1.0.04 Fixed touse bug - was treating missings as touse-able +* Change some cross-products in robust loops to quadcross +* 1.0.05 Fixed bug with col/row names and ts operators. Added eval to saved matrices. +* 1.1.00 First ssc-ideas version. Added version 9.2 prior to Mata compiled section. +* 1.1.01 Allow non-integer bandwidth +* 1.1.02 Changed calc of yhat, zhat and pihat to avoid needlessly large intermediate matrices +* and to use more accurate qrsolve instead of inverted X'X. +* 1.1.03 Fixed touse bug that didn't catch missing cluster variable +* Fixed cluster bug - data needed to be sorted by cluster for Mata panel functions to work properly +* 1.2.00 Changed reporting so that gaps between panels are not reported as such. +* Added support for tdelta in tsset data. +* Changed tvar and ivar setup so that data must be tsset or xtset. +* Removed unnecessary loops through panel data with spectral kernels +* shat vcv now also saved. +* Added support for Thompson/Cameron-Gelbach-Miller 2-level cluster-robust vcvv +* Added support for Stock-Watson vcv - but requires data to have FEs partialled out, & doesn't support fweights +* Removed mimicking of Stata mistake of truncated N with iweights to nearest integer +* Fixed small bug with quadratic kernel (wasn't using negative weights) +* Optimised code dealing with time-series data +* 1.2.01 Fixed bug that always used Stock-Watson spectral decomp to create invertible shat +* instead of only when (undocumented) spsd option is called. +* 1.2.02 Fixed bug that did not allow string cluster variables +* 1.2.03 Fixed bug in code for cluster+kernel robust (typo in imported code from ivreg2=>crash) +* 1.2.04 Replaced code for S with ivreg2 code modified to support e matrix (cols > 1) +* Code block (m_omega, m_calckw, struct definition) now shared by ranktest and ivreg2. +* Renamed spsd option to psd following ivreg2 3.0.07 +* Added wf ("weight factor") and statement about sum of weights, as in ivreg2 +* Added dofminus option, as in ivreg2 +* Fixed minor reporting bug - was reporting gaps in entire panel, not just touse-d portion +* Recoded kernel & bw checks to use shared ivreg2 subroutine vkernel +* 1.2.05 Fixed weighting bug introduced in 1.2.04. All weights were affected. +* Was result of incompatibility of code shared with ivreg2. +* 1.3.01 First ranktest version with accompanying Mata library (shared with -ivreg2-). +* Mata library includes struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Fixed bug in 2-way cluster code (now in m_omega in Mata library) - would crash if K>1. +* 1.3.02 Improved partialling out and matrix inversion - switched from qrsolve to invsym. +* Use _makesymmetric() instead of symmetrizing by hand. +* 1.3.03 01Jan14. Fixed reporting bug with 2-way clustering and kernel-robust that would give +* wrong count for 2nd cluster variable. +* 1.3.04 24Aug14. Fixed bug in markout - would include obs where some vars were missing +* 1.3.05 22Jan15. Promotion to version 11.2; forks to ranktest9 if version<=10; requires +* capture before "version 11.2" in Mata section since must load before forking. +* Renamed subroutine rkstat to s_rkstat. +* 1.4.01 16Aug15. Pass cons flag to Mata code. Added cholqrsolve() utility (use qr if chol fails). +* Partial code rewritten to use centering and cholqrsolve. pihat uses cholqrsolve. +* Separate code for iid and non-iid cases (faster, more accurate for iid case). +* Fixed bug in naming rows/cols of saved V and S matrices (wasn't unab-ing the varlists). +* Updated undocumented psd options psd0 and psda. Tweaked cluster count code to match ivreg2. +* Added r(version) and r(cmd) macros. diff --git a/data/ado/r/ranktest11.sthlp b/data/ado/r/ranktest11.sthlp new file mode 100644 index 0000000..e915c92 --- /dev/null +++ b/data/ado/r/ranktest11.sthlp @@ -0,0 +1,433 @@ +{smcl} +{* 9dec2018}{...} +{hline} +help for {hi:ranktest11} +{hline} + +{title:ranktest11: module for testing the rank of a matrix using the Kleibergen-Paap rk statistic} + +{p 4}Full syntax + +{p 8 14}{cmd:ranktest11} +{cmd:(}{it:varlist1}{cmd:)} +{cmd:(}{it:varlist2}{cmd:)} +[{it:weight}] +[{cmd:if} {it:exp}] [{cmd:in} {it:range}] +{bind:[{cmd:, {cmd:partial(}{it:varlist3}{cmd:)}}} +{cmd:wald} +{cmdab:all:rank} +{cmdab:full:rank} +{cmdab:null:rank} +{cmdab:r:obust} +{cmd:bw(}{it:#}{cmd:)} +{cmd:kernel(}{it:string}{cmd:)} +{cmdab:cl:uster}{cmd:(}{it:varlist}{cmd:)} +{bind:{cmdab:noc:onstant} ]} + +{p 4}Version syntax + +{p 8 14}{cmd:ranktest11}, {cmd:version} + +{p}{cmd:ranktest11} is a version of {cmd:ranktest} that works with Stata 11 or earlier. +The current version of {cmd:ranktest} has more features and reports a wider range of tests; +to install it, type or click on {stata "ssc install ranktest"}. + +{p}{cmd:ranktest11} may be used with time-series or panel data, +in which case the data must be {cmd:tsset} +before using {cmd:ranktest11}; see help {help tsset}. + +{p}All {it:varlists} may contain time-series operators; +see help {help varlist}. +If {cmd:(}{it:varlist1}{cmd:)} or {cmd:(}{it:varlist1}{cmd:)} contain a single variable, +the parentheses {cmd:()} may be omitted. + +{p}{cmd:aweight}s, {cmd:fweight}s, {cmd:iweight}s and {cmd:pweight}s +are allowed; see help {help weights}. + +{p}{cmd:ranktest11} is an r-class program. + +{title:Contents} +{p 2}{help ranktest11##s_description:Description}{p_end} +{p 2}{help ranktest11##s_examples:Options}{p_end} +{p 2}{help ranktest11##s_examples:Examples}{p_end} +{p 2}{help ranktest11##s_refs:References}{p_end} +{p 2}{help ranktest11##s_acknow:Acknowledgements}{p_end} +{p 2}{help ranktest11##s_citation:Authors}{p_end} +{p 2}{help ranktest11##s_citation:Citation of ranktest11}{p_end} + +{marker s_description}{title:Description} + +{p}{cmd:ranktest11} implements the Kleibergen-Paap (2006) +rk test for the rank of a matrix. +Tests of the rank of a matrix have many practical applications. +For example, in econometrics the requirement for identification +is the rank condition, +which states that a particular matrix must be of full column rank. +Another example from econometrics concerns +cointegration in vector autoregressive (VAR) models; +the Johansen trace test is a test of a rank of a particular matrix. +The traditional test of the rank of a matrix for the standard (stationary) case +is the Anderson (1951) canonical correlations test. +If we denote one list of variables as Y and a second as Z, +and we calculate the squared canonical correlations between Y and Z, +the LM form of the Anderson test, +where the null hypothesis is that +the matrix of correlations or regression parameters B between Y and Z has rank(B)=r, +is N times the sum of the r+1 largest squared canonical correlations. +A large test statistic and +rejection of the null indicates that the matrix has rank at least r+1. +The Cragg-Donald (1993) statistic is a closely related Wald test +for the rank of a matrix. +Both the Anderson and Cragg-Donald tests require the assumption +that the covariance matrix has a Kronecker form; +when this is not so, +e.g., when disturbances are heteroskedastic or autocorrelated, +the test statistics are no longer valid. + +{p}The Kleibergen-Paap (2006) rk statistic is a generalization +of the Anderson canonical correlation rank test +to the case of a non-Kronecker covariance matrix. +The implementation in {cmd:ranktest11} +will calculate rk statistics that are robust to various forms of +heteroskedasticity, autocorrelation, and clustering. +For a full discussion of the test statistic +and its relationship other test statistics for the rank of a matrix, +see Kleibergen-Paap (2006). + +{p}The text is applied to Y and Z, +where Y={it:varlist1} and Z={it:varlist2}. +Optionally, a third set of variables X={it:varlist3} +can be partialled-out of Y and Z +with the {cmd:partial()} option. +A constant is automatically partialled out, +unless the user specifies the {cmd:nocons} option. +To test if a matrix is rank r+1, +the null hypothesis is Ho: rank(B)=r. +Rejection of the null indicates that the matrix +has at least rank=r+1. +In the standard (stationary) case, +the test statistic is distributed as chi-squared +with degrees of freedom = (K-r)*(L-r), +where K is the number of Y variables, +L is the number of Z variables, +and r is the rank being tested in Ho. +For example, +to test if the matrix is full column rank K where K1 the test statistics for rank=0 reported by {cmd:ranktest11} +can be reproduced by testing the joint significance of the Z variables +across the K equations for the Y variables. +See the examples below. + +{marker s_options}{title:Options summary} + +{p 0 4}{cmd:partial(}{it:varlist3}{cmd:)} +requests that the variables in {cmd:(}{it:varlist3}{cmd:)} +are partialled out of the variables in +{cmd:(}{it:varlist1}{cmd:)} and {cmd:(}{it:varlist2}{cmd:)}. +A constant is automatically partialled out as well, +unless the option {cmd:noconstant} is specified. + +{p 0 4}{cmd:wald} requests the Wald instead of the LM version of the test. +The LM version is the default. + +{p 0 4}{cmdab:all:rank} requests that test statistics +for rank=0, rank=1, ..., rank=(#cols-1) be reported, +where (#cols-1) is the number of columns +of the smaller of the two matrices (varlists). +{cmdab:all:rank} is the default. + +{p 0 4}{cmdab:full:rank} requests that only the test statistic +for Ho: rank=(#cols-1) be reported, +where (#cols-1) is the number of columns +of the smaller of the two matrices (varlists). +Rejection of the null indicates that the matrix +is of full column rank. + +{p 0 4}{cmdab:null:rank} requests that only the test statistic +for Ho: rank=0 be reported. +Rejection of the null indicates that the matrix has at least rank=1. + +{p 0 4}{cmd:robust} specifies that the Eicker/Huber/White/sandwich +heteroskedastic-robust estimator of variance is to be used. +The reported rk statistic will be robust to heteroskedasticity. + +{p 0 4}{cmd:cluster}{cmd:(}{it:varlist}{cmd:)} specifies that +observations are independent across groups (clusters) +but not necessarily independent within groups. +{it:varname} specifies to which group each observation belongs. +Specifying {cmd:cluster()} implies {cmd:robust}, +i.e., the reported rk statistic will be robust to both +heteroskedasticity and within-cluster correlation. +If {cmd:ivreg2} version 3.0 or later is installed, 2-way clustering is supported; +see help {help ivreg2} for details. + +{p 0 4}{cmd:bw(}{it:#}{cmd:)} impements +autocorrelation-consistent (AC) +or heteroskedasticity- and autocorrelation-consistent (HAC) +covariance estimation with bandwidth equal to {it:#}, +where {it:#} is an integer greater than zero. +Specifying {cmd:robust} together with {cmd:bw(}{it:#}{cmd:)} +implements HAC covariance estimation; +omitting {cmd:robust} implements AC covariance estimation. + +{p 0 4}{cmd:kernel(}{it:string)}{cmd:)} specifies the kernel +to be used for AC and HAC covariance estimation; +the default kernel is Bartlett +(also known in econometrics as Newey-West). +Kernels available are (abbreviations in parentheses): +Bartlett (bar); Truncated (tru); Parzen (par); Tukey-Hanning (thann); Tukey-Hamming (thamm); +Daniell (dan); Tent (ten); and Quadratic-Spectral (qua or qs). +Note that for some kernels (bar, par, thann and thamm) +the bandwidth must be at least 2 +to obtain an autocorrelation-consistent estimator. + +{p 0 4}{cmd:noconstant} suppresses the constant term (intercept) in the +list of partialled-out variables. + +{p 0 4}{cmd:version} causes {cmd:ranktest11} to display its current version number +and to leave it in the macro {cmd:s(version)}. +It cannot be used with any other options. + +{marker s_macros}{title:Saved results} + +{p}{cmd:ranktest11} saves the following results in {cmd:r()}: + +Scalars +{col 4}{cmd:r(N)}{col 18}Number of observations +{col 4}{cmd:r(N_clust)}{col 18}Number of clusters +{col 4}{cmd:r(chi2)}{col 18}rk statistic for highest rank tested +{col 4}{cmd:r(p)}{col 18}p-value of rk statistic +{col 4}{cmd:r(rdf)}{col 18}dof of rk statistic +{col 4}{cmd:r(rank)}{col 18}Rank of matrix under Ho for highest rank tested + +Macros +{col 4}{cmd:r(version)}{col 18}Version number of {cmd:ranktest11} + +Matrices +{col 4}{cmd:r(rkmarix)}{col 18}Saved results of rank tests +{col 4}{cmd:r(ccorr)}{col 18}Matrix of canonical correlations +{col 4}{cmd:r(eval)}{col 18}Matrix of eigenvalues (=squared canonical correlations) +{col 4}{cmd:r(V)}{col 18}Covariance matrix (W in Kleibergen-Paap (2006), p. 103) + +{marker s_examples}{title:Examples} + +{col 0}{bf:Tests for underidentification of Klein consumption equation.} + +{col 0}(Underidentification means endogenous regressors (profits wagetot) are not identified +{col 0}by the excluded instruments (govt taxnetx year wagegovt capital1 L.totinc) after +{col 0}partialling-out the included instruments (L.totinc _cons). Test is equivalent to +{col 0}testing whether the matrix of reduced form coefficients for the endogenous regressors +{col 0}is full rank (#cols=2) vs. less than full rank (#cols=1). The test for underidentification +{col 0}should not be confused with a test for "weak identification"; see e.g. Stock and Yogo (2005) +{col 0}or Baum et al. (2007).) + +{col 9}{stata "webuse klein, clear" :. webuse klein, clear} + +{col 9}{stata "tsset yr" :. tsset yr} + +{col 0}(Klein consumption equation - for reference) + +{p 8 12}{stata "ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc)" :. ivreg2 consump L.profits (profits wagetot = govt taxnetx year wagegovt capital1 L.totinc)} + +{col 0}(Homoskedasticity, LM => Anderson canonical correlations test; test all ranks. Ho of +{col 0}rank=1 can be rejected, suggesting the model is identified.) + +{p 8 12}{stata "ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits)" :. ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits)} + +{col 0}(Homoskedasticity, Wald => Cragg-Donald (1993) test; test all ranks. Ho of rank=1 can +{col 0}be rejected, suggesting model is identified.) + +{p 8 12}{stata "ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald" :. ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald} + +{col 0}(Heteroskedastic robust, LM statistic, test for full rank only. Ho of rank=1 now +{col 0}cannot be rejected, suggesting model may be underidentified.) + +{p 8 12}{stata "ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) full robust" :. ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) full robust} + +{col 0}(Heteroskedastic and autocorrelation robust, LM statistic, test for null rank only) + +{p 8 12}{stata "ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) null robust bw(2)":. ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) null robust bw(2)} + +{col 0}{bf:Testing for reduced rank in VAR models.} + +{col 0}(Relationship of Johansen trace statistic and Anderson canonical correlations statistic. +{col 0}Former is an LR test, {cmd:ranktest11} reports LM version of latter, but based on the same +{col 0}eigenvalues. Note that the p-values reported by {cmd:ranktest11} are not valid in this application +{col 0}because they are for the standard stationary case.) + +{p 8 12}{stata "vecrank consump profits wagetot, lags(1)" :. vecrank consump profits wagetot, lags(1)} + +{p 8 12}{stata "ranktest11 (d.consump d.profits d.wagetot) (L1.consump L1.profits L1.wagetot)" :. ranktest11 (d.consump d.profits d.wagetot) (L1.consump L1.profits L1.wagetot)} + +{p 8 12}{stata "mat eval=r(eval)" :. mat eval=r(eval)} + +{p 8 12}{stata "mat list eval" :. mat list eval} + +{col 0}({cmd:vecrank} LR trace statistic for maximum rank=0 vs. {cmd:ranktest11} LM canonical correlations +{col 0}statistic for same. Both statistics calculated using the same eigenvalues.) + +{p 8 12}{stata "di -r(N)*(ln(1-eval[1,1]) + ln(1-eval[1,2]) + ln(1-eval[1,3]))" :. di -r(N)*(ln(1-eval[1,1]) + ln(1-eval[1,2]) + ln(1-eval[1,3]))} + +{p 8 12}{stata "di r(N)*(eval[1,1] + eval[1,2] + eval[1,3])" :. di r(N)*(eval[1,1] + eval[1,2] + eval[1,3])} + +{col 0}{bf:Equalities between rk statistic and other test statistics} + +{col 0}(Equivalence of rk statistic and canonical correlations under homoskedasticity) + +{p 8 12}{stata "canon (profits wagetot) (govt taxnetx year wagegovt)" :. canon (profits wagetot) (govt taxnetx year wagegovt)} + +{p 8 12}{stata "mat list e(ccorr)" :. mat list e(ccorr)} + +{p 8 12}{stata "ranktest11 (profits wagetot) (govt taxnetx year wagegovt)" :. ranktest11 (profits wagetot) (govt taxnetx year wagegovt)} + +{p 8 12}{stata "mat list r(rkmatrix)" :. mat list r(rkmatrix)} + +{col 0}(Equality of rk statistic and Wald test from OLS regression in special case +{col 0} of single regressor) + +{p 8 12}{stata "ranktest11 (profits) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald robust" :. ranktest11 (profits) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald robust} + +{p 8 12}{stata "regress profits govt taxnetx year wagegovt capital1 L.totinc L.profits, robust" :. regress profits govt taxnetx year wagegovt capital1 L.totinc L.profits, robust} + +{p 8 12}{stata "testparm govt taxnetx year wagegovt capital1 L.totinc" :. testparm govt taxnetx year wagegovt capital1 L.totinc} + +{p 8 12}{stata "di r(F)*r(df)*e(N)/e(df_r)" :. di r(F)*r(df)*e(N)/e(df_r)} + +{col 0}(Equality of rk statistic and LM test from OLS regression in special case +{col 0} of single regressor. Generate a group variable to illustrate {cmd:cluster}) + +{p 8 12}{stata "gen clustvar = round(yr/2)" :. gen clustvar = round(yr/2)} + +{p 8 12}{stata "ranktest11 (profits) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) cluster(clustvar)" :. ranktest11 (profits) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) cluster(clustvar)} + +{p 8 12}{stata "ivreg2 profits L.profits (=govt taxnetx year wagegovt capital1 L.totinc), cluster(clustvar)" :. ivreg2 profits L.profits (=govt taxnetx year wagegovt capital1 L.totinc), cluster(clustvar)} + +{p 8 12}{stata "di e(j)" :. di e(j)} + +{col 0}(Equality of rk statistic of null rank and Wald test from OLS regressions and a +{col 0}Kronecker covariance matrix (independent and homoskedastic equations). To show equality, +{col 0}estimate the equations using {cmd:reg3} specifying that all regressors are exogenous, +{col 0}and then test joint significance of Z variables in both regressions. L.profits is the +{col 0}partialled-out variable and is not tested.) + +{p 8 12}{stata "ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald null ":. ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald null} + +{p 8 12}{stata "global e1 (profits govt taxnetx year wagegovt capital1 L.totinc L.profits)" :. global e1 (profits govt taxnetx year wagegovt capital1 L.totinc L.profits)} + +{p 8 12}{stata "global e2 (wagetot govt taxnetx year wagegovt capital1 L.totinc L.profits)" :. global e2 (wagetot govt taxnetx year wagegovt capital1 L.totinc L.profits)} + +{p 8 12}{stata "reg3 $e1 $e2, allexog" :. reg3 $e1 $e2, allexog} + +{p 8 12}{stata "qui test [profits]govt [profits]taxnetx [profits]year [profits]wagegovt [profits]capital1 [profits]L.totinc": . qui test [profits]govt [profits]taxnetx [profits]year [profits]wagegovt [profits]capital1 [profits]L.totinc} + +{p 8 12}{stata "test [wagetot]govt [wagetot]taxnetx [wagetot]year [wagetot]wagegovt [wagetot]capital1 [wagetot]L.totinc, accum": . test [wagetot]govt [wagetot]taxnetx [wagetot]year [wagetot]wagegovt [wagetot]capital1 [wagetot]L.totinc, accum} + +{col 0}(Equality of rk statistic of null rank and Wald test from OLS regressions and {cmd:suest}. +{col 0}To show equality, use {cmd:suest} to test joint significance of Z variables in both +{col 0}regressions. L.profits is the partialled-out variable and is not tested. Note that +{col 0}{cmd:suest} introduces a finite sample adjustment of (N-1)/N.) + +{p 8 12}{stata "ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald null robust":. ranktest11 (profits wagetot) (govt taxnetx year wagegovt capital1 L.totinc), partial(L.profits) wald null robust} + +{p 8 12}{stata "di r(chi2)*(r(N)-1)/r(N)": . di r(chi2)*(r(N)-1)/r(N)} + +{p 8 12}{stata "qui regress profits govt taxnetx year wagegovt capital1 L.totinc L.profits":. qui regress profits govt taxnetx year wagegovt capital1 L.totinc L.profits} + +{p 8 12}{stata "est store e1": . est store e1} + +{p 8 12}{stata "qui regress wagetot govt taxnetx year wagegovt capital1 L.totinc L.profits":. qui regress wagetot govt taxnetx year wagegovt capital1 L.totinc L.profits} + +{p 8 12}{stata "est store e2": . est store e2} + +{p 8 12}{stata "qui suest e1 e2": . qui suest e1 e2} + +{p 8 12}{stata "qui test [e1_mean]govt [e1_mean]taxnetx [e1_mean]year [e1_mean]wagegovt [e1_mean]capital1 [e1_mean]L.totinc": . qui test [e1_mean]govt [e1_mean]taxnetx [e1_mean]year [e1_mean]wagegovt [e1_mean]capital1 [e1_mean]L.totinc} + +{p 8 12}{stata "test [e2_mean]govt [e2_mean]taxnetx [e2_mean]year [e2_mean]wagegovt [e2_mean]capital1 [e2_mean]L.totinc, accum": . test [e2_mean]govt [e2_mean]taxnetx [e2_mean]year [e2_mean]wagegovt [e2_mean]capital1 [e2_mean]L.totinc, accum} + + +{marker s_refs}{title:References} + +{p 0 4}Anderson, T.W. 1951. Estimating linear restrictions on regression coefficients +for multivariate normal distributions. Annals of Mathematical Statistics, Vol. 22, pp. 327-51. + +{p 0 4}Anderson, T.W. 1984. Introduction to Multivariate Statistical Analysis. +2d ed. New York: John Wiley & Sons. + +{p 0 4}Baum, C. F., Schaffer, M.E., and Stillman, S. 2007. Enhanced routines for instrumental variables/GMM estimation and testing. Boston College Department of Economics Working Paper No. 667. +{browse "http://ideas.repec.org/p/boc/bocoec/667.html":http://ideas.repec.org/p/boc/bocoec/667.html} + +{p 0 4}Cragg, J.G. and Donald, S.G. 1993. Testing Identfiability and Specification in +Instrumental Variables Models. Econometric Theory, Vol. 9, pp. 222-240. + +{p 0 4}Kleibergen, F. and Paap, R. 2006. Generalized Reduced Rank Tests Using the Singular Value Decomposition. +Journal of Econometrics, Vol. 133, pp. 97-126. + +{p 0 4}Stock, J.H. and Yogo, M. 2005. Testing for Weak Instruments in Linear IV Regression. In D.W.K. Andrews and J.H. Stock, eds. Identification and Inference for Econometric Models: Essays in Honor of Thomas Rothenberg. Cambridge: Cambridge University Press, 2005, pp. 80–108. +Working paper version: NBER Technical Working Paper 284. +{browse "http://www.nber.org/papers/T0284":http://www.nber.org/papers/T0284}. + +{marker s_acknow}{title:Acknowledgements} + +{p}We would like to thank Kit Baum and Austin Nichols for helpful suggestions and feedback. + +{marker s_citation}{title:Citation of ranktest11} + +{p}{cmd:ranktest11} is not an official Stata command. It is a free contribution +to the research community, like a paper. Please cite it as such: {p_end} + +{phang}Kleibergen, F., Schaffer, M.E. 2010. +ranktest11: module for testing the rank of a matrix using the Kleibergen-Paap rk statistic +{browse "http://ideas.repec.org/c/boc/bocode/s456865.html":http://ideas.repec.org/c/boc/bocode/s456865.html}{p_end} + +{title:Authors} + + Frank Kleibergen, Brown University, US + Frank_Kleibergen@brown.edu + + Mark E Schaffer, Heriot-Watt University, UK + m.e.schaffer@hw.ac.uk + +{title:Also see} + +{p 1 14}Manual: {hi:[R] canon}{p_end} + +{p 1 10}On-line: help for {help canon}, {help vecrank}, {help ivreg2} (if installed){p_end} diff --git a/data/ado/r/ranktest9.ado b/data/ado/r/ranktest9.ado new file mode 100644 index 0000000..9014e1b --- /dev/null +++ b/data/ado/r/ranktest9.ado @@ -0,0 +1,1387 @@ +*! ranktest9 1.3.06 18Aug2015 +*! based on ranktest 1.3.04 and livreg2 Mata library 1.1.07 +*! author mes, based on code by fk +*! see end of file for version comments + +program define ranktest9, rclass sortpreserve + version 9.2 + local lversion 01.3.05 + + if substr("`1'",1,1)== "," { + if "`2'"=="version" { + di in ye "`lversion'" + return local version `lversion' + exit + } + else { +di as err "invalid syntax" + exit 198 + } + } + +* If varlist 1 or varlist 2 have a single element, parentheses optional + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local y `s(varlist)' + local K : word count `y' + local 0 `"`s(rest)'"' + sret clear + } + else { + local y `1' + local K 1 + mac shift 1 + local 0 `"`*'"' + } + + if substr("`1'",1,1)=="(" { + GetVarlist `0' + local z `s(varlist)' + local L : word count `z' + local 0 `"`s(rest)'"' + sret clear + } + else { + local z `1' + local K 1 + mac shift 1 +* Need to reinsert comma before options (if any) for -syntax- command to work + local 0 `", `*'"' + } + +* Option version ignored here if varlists were provided + syntax [if] [in] [aw fw pw iw/] [, partial(varlist ts) fwl(varlist ts) /* + */ NOConstant wald ALLrank NULLrank FULLrank ROBust cluster(varlist) /* + */ BW(string) kernel(string) Tvar(varname) Ivar(varname) sw psd version /* + */ dofminus(integer 0) ] + + local partial "`partial' `fwl'" + + if "`noconstant'"=="" { + tempvar one + gen byte `one' = 1 + local partial "`partial' `one'" + } + + if "`wald'"~="" { + local LMWald "Wald" + } + else { + local LMWald "LM" + } + + local optct : word count `allrank' `nullrank' `fullrank' + if `optct' > 1 { +di as err "Incompatible options: `allrank' `nullrank' `fullrank'" + error 198 + } + else if `optct' == 0 { +* Default + local allrank "allrank" + } + +* Note that by tsrevar-ing here, subsequent disruption to the sort doesn't matter +* for TS operators. + tsrevar `y' + local vl1 `r(varlist)' + tsrevar `z' + local vl2 `r(varlist)' + tsrevar `partial' + local partial `r(varlist)' + + foreach vn of varlist `vl1' { + tempvar tv + qui gen double `tv' = . + local tempvl1 "`tempvl1' `tv'" + } + foreach vn of varlist `vl2' { + tempvar tv + qui gen double `tv' = . + local tempvl2 "`tempvl2' `tv'" + } + + marksample touse + markout `touse' `vl1' `vl2' `partial' `cluster', strok + +* Stock-Watson and cluster imply robust. + if "`sw'`cluster'" ~= "" { + local robust "robust" + } + + tempvar wvar + if "`weight'" == "fweight" | "`weight'"=="aweight" { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + if "`fsqrt(wf)*(wvar^0.5):*'" == "fweight" & "`kernel'" !="" { + di in red "fweights not allowed (data are -tsset-)" + exit 101 + } + if "`weight'" == "fweight" & "`sw'" != "" { + di in red "fweights currently not supported with -sw- option" + exit 101 + } + if "`weight'" == "iweight" { + if "`robust'`cluster'`bw'" !="" { + di in red "iweights not allowed with robust, cluster, AC or HAC" + exit 101 + } + else { + local wtexp `"[`weight'=`exp']"' + gen double `wvar'=`exp' + } + } + if "`weight'" == "pweight" { + local wtexp `"[aweight=`exp']"' + gen double `wvar'=`exp' + local robust "robust" + } + if "`weight'" == "" { +* If no weights, define neutral weight variable + qui gen byte `wvar'=1 + } + + +* Every time a weight is used, must multiply by scalar wf ("weight factor") +* wf=1 for no weights, fw and iw, wf = scalar that normalizes sum to be N if aw or pw + sum `wvar' if `touse' `wtexp', meanonly +* Weight statement + if "`weight'" ~= "" { +di in gr "(sum of wgt is " %14.4e `r(sum_w)' ")" + } + if "`weight'"=="" | "`weight'"=="fweight" | "`weight'"=="iweight" { +* If weight is "", weight var must be column of ones and N is number of rows. +* With fw and iw, effective number of observations is sum of weight variable. + local wf=1 + local N=r(sum_w) + } + else if "`weight'"=="aweight" | "`weight'"=="pweight" { +* With aw and pw, N is number of obs, unadjusted. + local wf=r(N)/r(sum_w) + local N=r(N) + } + else { +* Should never reach here +di as err "ranktest error - misspecified weights" + exit 198 + } + +* HAC estimation. +* If bw is omitted, default `bw' is empty string. +* If bw or kernel supplied, check/set `kernel'. +* Macro `kernel' is also used for indicating HAC in use. + if "`bw'" == "" & "`kernel'" == "" { + local bw=0 + } + else { +* Need tvar for markout with time-series stuff +* Data must be tsset for time-series operators in code to work +* User-supplied tvar checked if consistent with tsset + capture tsset + if "`r(timevar)'" == "" { +di as err "must tsset data and specify timevar" + exit 5 + } + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } +* If no panel data, ivar will still be empty + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already -tsset-" + exit 5 + } + local tdelta `r(tdelta)' + tsreport if `touse', panel + if `r(N_gaps)' != 0 { +di in gr "Warning: time variable " in ye "`tvar'" in gr " has " /* + */ in ye "`r(N_gaps)'" in gr " gap(s) in relevant range" + } + +* Check it's a valid kernel and replace with unabbreviated kernel name; check bw. +* Automatic kernel selection allowed by ivreg2 but not ranktest so must trap. +* s_vkernel is in livreg2 mlib. + if "`bw'"=="auto" { +di as err "invalid bandwidth in option bw() - must be real > 0" + exit 198 + } + mata: s_ranktest9_vkernel("`kernel'", "`bw'", "`ivar'") + local kernel `r(kernel)' + local bw = `r(bw)' + } + +* tdelta missing if version 9 or if not tsset + if "`tdelta'"=="" { + local tdelta=1 + } + + if "`sw'"~="" { + capture xtset + if "`ivar'" == "" { + local ivar "`r(panelvar)'" + } + else if "`ivar'"!="`r(panelvar)'" { +di as err "invalid ivar() option - data already tsset or xtset" + exit 5 + } +* Exit with error if ivar is neither supplied nor tsset nor xtset + if "`ivar'"=="" { +di as err "Must -xtset- or -tsset- data or specify -ivar- with -sw- option" + exit 198 + } + qui describe, short varlist + local sortlist "`r(sortlist)'" + tokenize `sortlist' + if "`ivar'"~="`1'" { +di as err "Error - dataset must be sorted on panel var with -sw- option" + exit 198 + } + } + +* Create variable used for getting lags etc. in Mata + tempvar tindex + qui gen `tindex'=1 if `touse' + qui replace `tindex'=sum(`tindex') if `touse' + +********** CLUSTER SETUP ********************************************** + +* Mata code requires data are sorted on (1) the first var cluster if there +* is only one cluster var; (2) on the 3rd and then 1st if two-way clustering, +* unless (3) two-way clustering is combined with kernel option, in which case +* the data are tsset and sorted on panel id (first cluster variable) and time +* id (second cluster variable). +* Second cluster var is optional and requires an identifier numbered 1..N_clust2, +* unless combined with kernel option, in which case it's the time variable. +* Third cluster var is the intersection of 1 and 2, unless combined with kernel +* opt, in which case it's unnecessary. +* Sorting on "cluster3 cluster1" means that in Mata, panelsetup works for +* both, since cluster1 nests cluster3. +* Note that it is possible to cluster on time but not panel, in which case +* cluster1 is time, cluster2 is empty and data are sorted on panel-time. +* Note also that if no kernel-robust, sorting will disrupt any tsset-ing, +* but data are tsrevar-ed earlier to avoid any problems. + if "`cluster'"!="" { + local clopt "cluster(`cluster')" + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`kernel'"~="" { +* kernel requires either that cluster1 is time var and cluster2 is empty +* or that cluster1 is panel var and cluster2 is time var. +* Either way, data must be tsset and sorted for panel data. + if "`cluster2'"~="" { +* Allow backwards order + if "`cluster1'"=="`tvar'" & "`cluster2'"=="`ivar'" { + local cluster1 "`2'" + local cluster2 "`1'" + } + if "`cluster1'"~="`ivar'" | "`cluster2'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset panel & time vars." +di as err " tsset panel var=`ivar'; tsset time var=`tvar'; cluster vars=`cluster1',`cluster2'" + exit 198 + } + } + else { + if "`cluster1'"~="`tvar'" { +di as err "Error: cluster kernel-robust requires clustering on tsset time variable." +di as err " tsset time var=`tvar'; cluster var=`cluster1'" + exit 198 + } + } + } +* Simple way to get quick count of 1st cluster variable without disrupting sort +* clusterid1 is numbered 1.._Nclust1. + tempvar clusterid1 + qui egen `clusterid1'=group(`cluster1') if `touse' + sum `clusterid1' if `touse', meanonly + if "`cluster2'"=="" { + local N_clust=r(max) + local N_clust1=. + local N_clust2=. + if "`kernel'"=="" { +* Single level of clustering and no kernel-robust, so sort on single cluster var. +* kernel-robust already sorted via tsset. + sort `cluster1' + } + } + else { + local N_clust1=r(max) + if "`kernel'"=="" { + tempvar clusterid2 clusterid3 +* New cluster id vars are numbered 1..N_clust2 and 1..N_clust3 + qui egen `clusterid2'=group(`cluster2') if `touse' + qui egen `clusterid3'=group(`cluster1' `cluster2') if `touse' +* Two levels of clustering and no kernel-robust, so sort on cluster3/nested in/cluster1 +* kernel-robust already sorted via tsset. + sort `clusterid3' `cluster1' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) + } + else { +* Need to create this only to count the number of clusters + tempvar clusterid2 + qui egen `clusterid2'=group(`cluster2') if `touse' + sum `clusterid2' if `touse', meanonly + local N_clust2=r(max) +* Now replace with original variable + local clusterid2 `cluster2' + } + local N_clust=min(`N_clust1',`N_clust2') + } + } + +************************************************************************************************ + +* Note that bw is passed as a value, not as a string + mata: s_ranktest9_rkstat( "`vl1'", /* + */ "`vl2'", /* + */ "`partial'", /* + */ "`wvar'", /* + */ "`weight'", /* + */ `wf', /* + */ `N', /* + */ "`touse'", /* + */ "`LMWald'", /* + */ "`allrank'", /* + */ "`nullrank'", /* + */ "`fullrank'", /* + */ "`robust'", /* + */ "`clusterid1'", /* + */ "`clusterid2'", /* + */ "`clusterid3'", /* + */ `bw', /* + */ "`tvar'", /* + */ "`ivar'", /* + */ "`tindex'", /* + */ `tdelta', /* + */ `dofminus', /* + */ "`kernel'", /* + */ "`sw'", /* + */ "`psd'", /* + */ "`tempvl1'", /* + */ "`tempvl2'") + + tempname rkmatrix chi2 df df_r p rank ccorr eval + mat `rkmatrix'=r(rkmatrix) + mat `ccorr'=r(ccorr) + mat `eval'=r(eval) + mat colnames `rkmatrix' = "rk" "df" "p" "rank" "eval" "ccorr" + +di +di "Kleibergen-Paap rk `LMWald' test of rank of matrix" + if "`robust'"~="" & "`kernel'"~= "" & "`cluster'"=="" { +di " Test statistic robust to heteroskedasticity and autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`kernel'"~="" & "`cluster'"=="" { +di " Test statistic robust to autocorrelation" +di " Kernel: `kernel' Bandwidth: `bw'" + } + else if "`cluster'"~="" { +di " Test statistic robust to heteroskedasticity and clustering on `cluster'" + if "`kernel'"~="" { +di " and kernel-robust to common correlated disturbances" +di " Kernel: `kernel' Bandwidth: `bw'" + } + } + else if "`robust'"~="" { +di " Test statistic robust to heteroskedasticity" + } + else if "`LMWald'"=="LM" { +di " Test assumes homoskedasticity (Anderson canonical correlations test)" + } + else { +di " Test assumes homoskedasticity (Cragg-Donald test)" + } + + local numtests = rowsof(`rkmatrix') + forvalues i=1(1)`numtests' { +di "Test of rank=" %3.0f `rkmatrix'[`i',4] " rk=" %8.2f `rkmatrix'[`i',1] /* + */ " Chi-sq(" %3.0f `rkmatrix'[`i',2] ") pvalue=" %8.6f `rkmatrix'[`i',3] + } + scalar `chi2' = `rkmatrix'[`numtests',1] + scalar `p' = `rkmatrix'[`numtests',3] + scalar `df' = `rkmatrix'[`numtests',2] + scalar `rank' = `rkmatrix'[`numtests',4] + local N `r(N)' + return scalar df = `df' + return scalar chi2 = `chi2' + return scalar p = `p' + return scalar rank = `rank' + if "`cluster'"~="" { + return scalar N_clust = `N_clust' + } + if "`cluster2'"~="" { + return scalar N_clust1 = `N_clust1' + return scalar N_clust2 = `N_clust2' + } + return scalar N = `N' + return matrix rkmatrix `rkmatrix' + return matrix ccorr `ccorr' + return matrix eval `eval' + + tempname S V Omega + if `K' > 1 { + foreach en of local y { +* Remove "." from equation name + local en1 : subinstr local en "." "_", all + foreach vn of local z { + local cn "`cn' `en1':`vn'" + } + } + } + else { + foreach vn of local z { + local cn "`cn' `vn'" + } + } + mat `V'=r(V) + matrix colnames `V' = `cn' + matrix rownames `V' = `cn' + return matrix V `V' + mat `S'=r(S) + matrix colnames `S' = `cn' + matrix rownames `S' = `cn' + return matrix S `S' + + return local cmd "ranktest9" + return local version `lversion' +end + +* Adopted from -canon- +program define GetVarlist, sclass + sret clear + gettoken open 0 : 0, parse("(") + if `"`open'"' != "(" { + error 198 + } + gettoken next 0 : 0, parse(")") + while `"`next'"' != ")" { + if `"`next'"'=="" { + error 198 + } + local list `list'`next' + gettoken next 0 : 0, parse(")") + } + sret local rest `"`0'"' + tokenize `list' + local 0 `*' + sret local varlist "`0'" +end + + +******************************************************************************* +*************************** BEGIN MATA CODE *********************************** +******************************************************************************* + +version 9.2 +mata: + +// ********* struct ms_ranktest9_vcvorthog ******************* // +struct ms_ranktest9_vcvorthog { + string scalar ename, Znames, touse, weight, wvarname + string scalar robust, clustvarname, clustvarname2, clustvarname3, kernel + string scalar sw, psd, ivarname, tvarname, tindexname + real scalar wf, N, bw, tdelta, dofminus + real matrix ZZ + pointer matrix e + pointer matrix Z + pointer matrix wvar +} + + +void s_ranktest9_rkstat( string scalar vl1, + string scalar vl2, + string scalar partial, + string scalar wvarname, + string scalar weight, + scalar wf, + scalar N, + string scalar touse, + string scalar LMWald, + string scalar allrank, + string scalar nullrank, + string scalar fullrank, + string scalar robust, + string scalar clustvarname, + string scalar clustvarname2, + string scalar clustvarname3, + bw, + string scalar tvarname, + string scalar ivarname, + string scalar tindexname, + tdelta, + dofminus, + string scalar kernel, + string scalar sw, + string scalar psd, + string scalar tempvl1, + string scalar tempvl2) +{ + +// tempx, tempy and tempz are the Stata names of temporary variables that will be changed by rkstat + if (partial~="") { + tempx=tokens(partial) + } + tempy=tokens(tempvl1) + tempz=tokens(tempvl2) + + st_view(y=.,.,tokens(vl1),touse) + st_view(z=.,.,tokens(vl2),touse) + st_view(yhat=.,.,tempy,touse) + st_view(zhat=.,.,tempz,touse) + st_view(mtouse=.,.,tokens(touse),touse) + st_view(wvar=.,.,tokens(wvarname),touse) + noweight=(st_vartype(wvarname)=="byte") + +// Note that we now use wf*wvar instead of wvar +// because wvar is raw weighting variable and +// wf*wvar normalizes so that sum(wf*wvar)=N. + +// Partial out the X variables +// Note that this is entered if there is a constant, +// i.e., variables are centered + if (partial~="") { + st_view(x=.,.,tempx,touse) + xx = quadcross(x, wf*wvar, x) + xy = quadcross(x, wf*wvar, y) + xz = quadcross(x, wf*wvar, z) + + by = invsym(xx)*xy + bz = invsym(xx)*xz + + yhat[.,.] = y-x*by + zhat[.,.] = z-x*bz + } + else { + yhat[.,.] = y + zhat[.,.] = z + } + K=cols(y) + L=cols(z) + + zhzh = quadcross(zhat, wf*wvar, zhat) + zhyh = quadcross(zhat, wf*wvar, yhat) + yhyh = quadcross(yhat, wf*wvar, yhat) + + pihat = invsym(zhzh)*zhyh +// rzhat is F in paper (p. 103) +// iryhat is G in paper (p. 103) + ryhat=cholesky(yhyh) + rzhat=cholesky(zhzh) + iryhat=luinv(ryhat') + irzhat=luinv(rzhat') + that=rzhat'*pihat*iryhat + +// cc is canonical correlations. Squared cc is eigenvalues. + fullsvd(that, ut, cc, vt) + vt=vt' + vecth=vec(that) + ev = cc:^2 +// S matrix in paper (p. 100). Not used in code below. +// smat=fullsdiag(cc, rows(that)-cols(that)) + + if (abs(1-cc[1,1])<1e-10) { +printf("\n{text:Warning: collinearities detected between (varlist1) and (varlist2)}\n") + } + if ((missing(ryhat)>0) | (missing(iryhat)>0) | (missing(rzhat)>0) | (missing(irzhat)>0)) { +printf("\n{error:Error: non-positive-definite matrix. May be caused by collinearities.}\n") + exit(error(3351)) + } + +// If Wald, yhat is residuals + if (LMWald=="Wald") { + yhat[.,.]=yhat-zhat*pihat + yhyh = quadcross(yhat, wvar, yhat) + } + +// Covariance matrices +// vhat is W in paper (eqn below equation 17, p. 103) +// shat is V in paper (eqn below eqn 15, p. 103) + +// ************************************************************************************* // +// shat calculated using struct and programs m_omega, m_calckw shared with ivreg2 // + + struct ms_ranktest9_vcvorthog scalar vcvo + + + vcvo.ename = tempy // ivreg2 has = ename // + vcvo.Znames = tempz // ivreg2 has = Znames // + vcvo.touse = touse + vcvo.weight = weight + vcvo.wvarname = wvarname + vcvo.robust = robust + vcvo.clustvarname = clustvarname + vcvo.clustvarname2 = clustvarname2 + vcvo.clustvarname3 = clustvarname3 + vcvo.kernel = kernel + vcvo.sw = sw + vcvo.psd = psd + vcvo.ivarname = ivarname + vcvo.tvarname = tvarname + vcvo.tindexname = tindexname + vcvo.wf = wf + vcvo.N = N + vcvo.bw = bw + vcvo.tdelta = tdelta + vcvo.dofminus = dofminus + vcvo.ZZ = zhzh // ivreg2 has = st_matrix(ZZmatrix) // + + vcvo.e = &yhat // ivreg2 has = &e // + vcvo.Z = &zhat // ivreg2 has = &Z // + vcvo.wvar = &wvar + + shat=m_ranktest9_omega(vcvo) + +// *************************************************************************************** + +// Finally, calcluate vhat + if ((LMWald=="LM") & (kernel=="") & (robust=="") & (clustvarname=="")) { +// Homoskedastic, iid LM case means vcv is identity matrix +// Generates canonical correlation stats. Default. + vhat=I(L*K,L*K)/N + } + else { + vhat=(iryhat'#irzhat')*shat*(iryhat'#irzhat')' * N + _makesymmetric(vhat) + } + +// ready to start collecting test stats + if (allrank~="") { + firstrank=1 + lastrank=min((K,L)) + } + else if (nullrank~="") { + firstrank=1 + lastrank=1 + } + else if (fullrank~="") { + firstrank=min((K,L)) + lastrank=min((K,L)) + } + else { +// should never reach this point +printf("ranktest error\n") + exit + } + + rkmatrix=J(lastrank-firstrank+1,6,.) + for (i=firstrank; i<=lastrank; i++) { + + if (i>1) { + u12=ut[(1::i-1),(i..L)] + v12=vt[(1::i-1),(i..K)] + } + u22=ut[(i::L),(i..L)] + v22=vt[(i::K),(i..K)] + + symeigensystem(u22*u22', evec, eval) + u22v=evec + u22d=diag(eval) + u22h=u22v*(u22d:^0.5)*u22v' + + symeigensystem(v22*v22', evec, eval) + v22v=evec + v22d=diag(eval) + v22h=v22v*(v22d:^0.5)*v22v' + + if (i>1) { + aq=(u12 \ u22)*luinv(u22)*u22h + bq=v22h*luinv(v22')*(v12 \ v22)' + } + else { + aq=u22*luinv(u22)*u22h + bq=v22h*luinv(v22')*v22' + } + +// lab is lambda_q in paper (eqn below equation 21, p. 104) +// vlab is omega_q in paper (eqn 19 in paper, p. 104) + lab=(bq#aq')*vecth + vlab=(bq#aq')*vhat*(bq#aq')' + +// Symmetrize if numerical inaccuracy means it isn't + _makesymmetric(vlab) + vlabinv=invsym(vlab) +// rk stat Assumption 2: vlab (omega_q in paper) is nonsingular. Detected by a zero on the diagonal, +// since when returning a generalized inverse, Stata/Mata choose the generalized inverse that +// sets entire column(s)/row(s) to zeros. +// Save df and rank even if test stat not available. + df=(L-i+1)*(K-i+1) + rkmatrix[i-firstrank+1,2]=df + rkmatrix[i-firstrank+1,4]=i-1 + if (diag0cnt(vlabinv)>0) { +printf("\n{text:Warning: covariance matrix omega_%f}", i-1) +printf("{text: not full rank; test of rank %f}", i-1) +printf("{text: unavailable}\n") + } +// Note not multiplying by N - already incorporated in vhat. + else { + rk=lab'*vlabinv*lab + pvalue=chi2tail(df, rk) + rkmatrix[i-firstrank+1,1]=rk + rkmatrix[i-firstrank+1,3]=pvalue + } +// end of test loop + } + +// insert squared (=eigenvalues if canon corr) and unsquared canon correlations + for (i=firstrank; i<=lastrank; i++) { + rkmatrix[i-firstrank+1,6]=cc[i-firstrank+1,1] + rkmatrix[i-firstrank+1,5]=ev[i-firstrank+1,1] + } + st_matrix("r(rkmatrix)", rkmatrix) + st_matrix("r(ccorr)", cc') + st_matrix("r(eval)",ev') +// Save V matrix as in paper, without factor of 1/N + vhat=N*vhat*wf + st_matrix("r(V)", vhat) +// Save S matrix as in ivreg2, with factor of 1/N + st_matrix("r(S)", shat) + st_numscalar("r(N)", N) + if (clustvarname~="") { + st_numscalar("r(N_clust)", N_clust) + } + if (clustvarname2~="") { + st_numscalar("r(N_clust2)", N_clust2) + } +// end of program +} + +// *********************************************************************** // +// **************** SUPPORT CODE (prev in livreg2.mlib ******************* // +// *********************************************************************** // + + +// ************************* s_ranktest9_vkernel ***************************** // +// Program checks whether kernel and bw choices are valid. +// s_ranktest9_vkernel is called from Stata. +// Arguments are the kernel name (req), bandwidth (req) and ivar name (opt). +// All 3 are strings. +// Returns results in r() macros. +// r(kernel) - name of kernel (string) +// r(bw) - bandwidth (scalar) + +void s_ranktest9_vkernel( string scalar kernel, + string scalar bwstring, + string scalar ivar + ) +{ + +// Check bandwidth + if (bwstring=="auto") { + bw=-1 + } + else { + bw=strtoreal(bwstring) + if (bw==.) { + printf("{err}bandwidth option bw() required for HAC-robust estimation\n") + exit(102) + } + if (bw<=0) { + printf("{err}invalid bandwidth in option bw() - must be real > 0\n") + exit(198) + } + } + +// Check ivar + if (bwstring=="auto" & ivar~="") { + printf("{err}Automatic bandwidth selection not available for panel data\n") + exit(198) + } + +// Check kernel +// Valid kernel list is abbrev, full name, whether special case if bw=1 +// First in list is default kernel = Barlett + vklist = ( ("", "bartlett", "0") + \ ("bar", "bartlett", "0") + \ ("bartlett", "bartlett", "0") + \ ("par", "parzen", "0") + \ ("parzen", "parzen", "0") + \ ("tru", "truncated", "1") + \ ("truncated", "truncated", "1") + \ ("thann", "tukey-hanning", "0") + \ ("tukey-hanning", "tukey-hanning", "0") + \ ("thamm", "tukey-hamming", "0") + \ ("tukey-hamming", "tukey-hamming", "0") + \ ("qua", "quadratic spectral", "1") + \ ("qs", "quadratic spectral", "1") + \ ("quadratic-spectral", "quadratic spectral", "1") + \ ("quadratic spectral", "quadratic spectral", "1") + \ ("dan", "danielle", "1") + \ ("danielle", "danielle", "1") + \ ("ten", "tent", "1") + \ ("tent", "tent", "1") + ) + kname=strltrim(strlower(kernel)) + pos = (vklist[.,1] :== kname) + +// Exit with error if not in list + if (sum(pos)==0) { + printf("{err}invalid kernel\n") + exit(198) + } + + vkname=strproper(select(vklist[.,2],pos)) + st_global("r(kernel)", vkname) + st_numscalar("r(bw)",bw) + +// Warn if kernel is type where bw=1 means no lags are used + if (bw==1 & select(vklist[.,3],pos)=="0") { + printf("{result}Note: kernel=%s", vkname) + printf("{result} and bw=1 implies zero lags used. Standard errors and\n") + printf("{result} test statistics are not autocorrelation-consistent.\n") + } +} // end of program s_ranktest9_vkernel + + +// ************************ m_ranktest9_omega ************************************** // + +real matrix m_ranktest9_omega(struct ms_ranktest9_vcvorthog scalar vcvo) +{ + if (vcvo.clustvarname~="") { + st_view(clustvar, ., vcvo.clustvarname, vcvo.touse) + info = panelsetup(clustvar, 1) + N_clust=rows(info) + if (vcvo.clustvarname2~="") { + st_view(clustvar2, ., vcvo.clustvarname2, vcvo.touse) + if (vcvo.kernel=="") { + st_view(clustvar3, ., vcvo.clustvarname3, vcvo.touse) // needed only if not panel tsset + } + } + } + + if (vcvo.kernel~="") { + st_view(t, ., st_tsrevar(vcvo.tvarname), vcvo.touse) + T=max(t)-min(t)+1 + } + + if ((vcvo.kernel=="Bartlett") | (vcvo.kernel=="Parzen") | (vcvo.kernel=="Truncated") /// + | (vcvo.kernel=="Tukey-Hanning")| (vcvo.kernel=="Tukey-Hamming")) { + window="lag" + } + else if ((vcvo.kernel=="Quadratic Spectral") | (vcvo.kernel=="Danielle") | (vcvo.kernel=="Tent")) { + window="spectral" + } + else if (vcvo.kernel~="") { +// Should never reach this point +printf("\n{error:Error: invalid kernel}\n") + exit(error(3351)) + } + + L=cols(*vcvo.Z) + K=cols(*vcvo.e) // ivreg2 always calls with K=1; ranktest may call with K>=1. + +// Covariance matrices +// shat * 1/N is same as estimated S matrix of orthog conditions + +// Block for homoskedastic and AC. dof correction if any incorporated into sigma estimates. + if ((vcvo.robust=="") & (vcvo.clustvarname=="")) { +// ZZ is already calculated as an external + ee = quadcross(*vcvo.e, vcvo.wf*(*vcvo.wvar), *vcvo.e) + sigma2=ee/(vcvo.N-vcvo.dofminus) + shat=sigma2#vcvo.ZZ + if (vcvo.kernel~="") { + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + tnow=st_data(., vcvo.tindexname) + for (tau=1; tau<=TAU; tau++) { + kw = m_ranktest9_calckw(tau, vcvo.bw, vcvo.kernel) + if (kw~=0) { // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + lstau = "L"+strofreal(tau) + tlag=st_data(., lstau+"."+vcvo.tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix +// if no lags exist, tmatrix has zero rows. + if (rows(tmatrix)>0) { +// col 1 of tmatrix has row numbers of all rows of data with this time period that have a corresponding lag +// col 2 of tmatrix has row numbers of all rows of data with lag tau that have a corresponding ob this time period. +// Should never happen that fweights or iweights make it here, +// but if they did the next line would be sqrt(wvari)*sqrt(wvari1) [with no wf since not needed for fw or iw] + wv = (*vcvo.wvar)[tmatrix[.,1]] /// + :* (*vcvo.wvar)[tmatrix[.,2]]*(vcvo.wf^2) // inner weighting matrix for quadcross + sigmahat = quadcross((*vcvo.e)[tmatrix[.,1],.], wv ,(*vcvo.e)[tmatrix[.,2],.]) /// + / (vcvo.N-vcvo.dofminus) // large dof correction + ZZhat = quadcross((*vcvo.Z)[tmatrix[.,1],.], wv, (*vcvo.Z)[tmatrix[.,2],.]) + ghat = sigmahat#ZZhat + shat=shat+kw*(ghat+ghat') + } + } // end non-zero kernel weight block + } // end tau loop + } // end kernel code +// Note large dof correction (if there is one) has already been incorporated + shat=shat/vcvo.N + } // end homoskedastic, AC code + +// Block for robust HC and HAC but not Stock-Watson and single clustering. +// Need to enter for double-clustering if one cluster is time. + if ( (vcvo.robust~="") & (vcvo.sw=="") & ((vcvo.clustvarname=="") /// + | ((vcvo.clustvarname2~="") & (vcvo.kernel~=""))) ) { + if (K==1) { // simple/fast where e is a column vector + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { + wv = (*vcvo.e:^2) :* *vcvo.wvar + } + else { + wv = (*vcvo.e :* *vcvo.wvar * vcvo.wf):^2 // wf needed for aweights and pweights + } + shat=quadcross(*vcvo.Z, wv, *vcvo.Z) // basic Eicker-Huber-White-sandwich-robust vce + } + else { // e is a matrix so must loop + shat=J(L*K,L*K,0) + for (i=1; i<=rows(*vcvo.e); i++) { + eZi=((*vcvo.e)[i,.])#((*vcvo.Z)[i,.]) + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { +// wvar is a column vector. wf not needed for fw and iw (=1 by dfn so redundant). + shat=shat+quadcross(eZi,eZi)*((*vcvo.wvar)[i]) + } + else { + shat=shat+quadcross(eZi,eZi)*((*vcvo.wvar)[i] * vcvo.wf)^2 // **** ADDED *vcvo.wf + } + } + } + if (vcvo.kernel~="") { +// Spectral windows require looping through all T-1 autocovariances + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + tnow=st_data(., vcvo.tindexname) + for (tau=1; tau<=TAU; tau++) { + kw = m_ranktest9_calckw(tau, vcvo.bw, vcvo.kernel) + if (kw~=0) { // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + lstau = "L"+strofreal(tau) + tlag=st_data(., lstau+"."+vcvo.tindexname) + tmatrix = tnow, tlag + svar=(tnow:<.):*(tlag:<.) // multiply column vectors of 1s and 0s + tmatrix=select(tmatrix,svar) // to get intersection, and replace tmatrix + +// col 1 of tmatrix has row numbers of all rows of data with this time period that have a corresponding lag +// col 2 of tmatrix has row numbers of all rows of data with lag tau that have a corresponding ob this time period. +// if no lags exist, tmatrix has zero rows + if (rows(tmatrix)>0) { + if (K==1) { // simple/fast where e is a column vector +// wv is inner weighting matrix for quadcross + wv = (*vcvo.e)[tmatrix[.,1]] :* (*vcvo.e)[tmatrix[.,2]] /// + :* (*vcvo.wvar)[tmatrix[.,1]] :* (*vcvo.wvar)[tmatrix[.,2]] * (vcvo.wf^2) + ghat = quadcross((*vcvo.Z)[tmatrix[.,1],.], wv, (*vcvo.Z)[tmatrix[.,2],.]) + } + else { // e is a matrix so must loop + ghat=J(L*K,L*K,0) + for (i=1; i<=rows(tmatrix); i++) { + wvari =(*vcvo.wvar)[tmatrix[i,1]] + wvari1=(*vcvo.wvar)[tmatrix[i,2]] + ei =(*vcvo.e)[tmatrix[i,1],.] + ei1 =(*vcvo.e)[tmatrix[i,2],.] + Zi =(*vcvo.Z)[tmatrix[i,1],.] + Zi1 =(*vcvo.Z)[tmatrix[i,2],.] + eZi =ei#Zi + eZi1=ei1#Zi1 +// Should never happen that fweights or iweights make it here, but if they did +// the next line would be ghat=ghat+eZi'*eZi1*sqrt(wvari)*sqrt(wvari1) +// [without *vcvo.wf since wf=1 for fw and iw] + ghat=ghat+quadcross(eZi,eZi1)*wvari*wvari1 * (vcvo.wf^2) // ADDED * (vcvo.wf^2) + } + } + shat=shat+kw*(ghat+ghat') + } // end non-zero-obs accumulation block + } // end non-zero kernel weight block + } // end tau loop + } // end kernel code +// Incorporate large dof correction if there is one + shat=shat/(vcvo.N-vcvo.dofminus) + } // end HC/HAC code + + if (vcvo.clustvarname~="") { +// Block for cluster-robust +// 2-level clustering: S = S(level 1) + S(level 2) - S(level 3 = intersection of levels 1 & 2) +// Prepare shat3 if 2-level clustering + if (vcvo.clustvarname2~="") { + if (vcvo.kernel~="") { // second cluster variable is time + // shat3 was already calculated above as shat + shat3=shat*(vcvo.N-vcvo.dofminus) + } + else { // calculate shat3 + // data were sorted on clustvar3-clustvar1 so + // clustvar3 is nested in clustvar1 and Mata panel functions + // work for both. + info3 = panelsetup(clustvar3, 1) + if (rows(info3)==rows(*vcvo.e)) { // intersection of levels 1 & 2 are all single obs + // so no need to loop through row by row + if (K==1) { // simple/fast where e is a column vector + wv = (*vcvo.e :* *vcvo.wvar * vcvo.wf):^2 + shat3=quadcross(*vcvo.Z, wv, *vcvo.Z) // basic Eicker-Huber-White-sandwich-robust vce + } + else { // e is a matrix so must loop + shat3=J(L*K,L*K,0) + for (i=1; i<=rows(*vcvo.e); i++) { + eZi=((*vcvo.e)[i,.])#((*vcvo.Z)[i,.]) + shat3=shat3+quadcross(eZi,eZi)*((*vcvo.wvar)[i] * vcvo.wf)^2 // **** ADDED *vcvo.wf + } + } + } + else { // intersection of levels 1 & 2 includes some groups of obs + N_clust3=rows(info3) + shat3=J(L*K,L*K,0) + for (i=1; i<=N_clust3; i++) { + esub=panelsubmatrix(*vcvo.e,i,info3) + Zsub=panelsubmatrix(*vcvo.Z,i,info3) + wsub=panelsubmatrix(*vcvo.wvar,i,info3) + wv = esub :* wsub * vcvo.wf + if (K==1) { // simple/fast where e is a column vector + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ = J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.] * vcvo.wf // **** ADDED *vcvo.wf + } + } + shat3=shat3+quadcross(eZ,eZ) + } + } + } + } + +// 1st level of clustering, no kernel-robust +// Entered unless 1-level clustering and kernel-robust + if (!((vcvo.kernel~="") & (vcvo.clustvarname2==""))) { + shat=J(L*K,L*K,0) + for (i=1; i<=N_clust; i++) { // loop through clusters, adding Z'ee'Z + // for indiv cluster in each loop + esub=panelsubmatrix(*vcvo.e,i,info) + Zsub=panelsubmatrix(*vcvo.Z,i,info) + wsub=panelsubmatrix(*vcvo.wvar,i,info) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat=shat+quadcross(eZ,eZ) + } // end loop through clusters + } + +// 2-level clustering, no kernel-robust + if ((vcvo.clustvarname2~="") & (vcvo.kernel=="")) { + imax=max(clustvar2) // clustvar2 is numbered 1..N_clust2 + shat2=J(L*K,L*K,0) + for (i=1; i<=imax; i++) { // loop through clusters, adding Z'ee'Z + // for indiv cluster in each loop + svar=(clustvar2:==i) // mimics panelsubmatrix but doesn't require sorted data + esub=select(*vcvo.e,svar) // it is, however, noticably slower. + Zsub=select(*vcvo.Z,svar) + wsub=select(*vcvo.wvar,svar) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat2=shat2+quadcross(eZ,eZ) + } + } + +// 1st level of cluster, kernel-robust OR +// 2-level clustering, kernel-robust and time is 2nd cluster variable + if (vcvo.kernel~="") { + shat2=J(L*K,L*K,0) +// First, standard cluster-robust, i.e., no lags. + i=min(t) + while (i<=max(t)) { // loop through all T clusters, adding Z'ee'Z + // for indiv cluster in each loop + eZ=J(1,L*K,0) + svar=(t:==i) // select obs with t=i + if (colsum(svar)>0) { // there are obs with t=i + esub=select(*vcvo.e,svar) + Zsub=select(*vcvo.Z,svar) + wsub=select(*vcvo.wvar,svar) + if (K==1) { // simple/fast if e is a column vector + wv = esub :* wsub * vcvo.wf + eZ = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + } + else { +// MISSING LINE IS NEXT + eZ=J(1,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZ=eZ+(esub[j,.]#Zsub[j,.])*wsub[j,.]*vcvo.wf // **** ADDED *vcvo.wf + } + } + shat2=shat2+quadcross(eZ,eZ) + } + i=i+vcvo.tdelta + } // end i loop through all T clusters + +// Spectral windows require looping through all T-1 autocovariances + if (window=="spectral") { + TAU=T/vcvo.tdelta-1 + } + else { + TAU=vcvo.bw + } + + for (tau=1; tau<=TAU; tau++) { + kw = m_ranktest9_calckw(tau, vcvo.bw, vcvo.kernel) // zero weight possible with some kernels + // save an unnecessary loop if kw=0 + // remember, kw<0 possible with some kernels! + if (kw~=0) { + i=min(t)+tau*vcvo.tdelta // Loop through all possible ts (time clusters) + while (i<=max(t)) { // Start at earliest possible t + svar=t[.,]:==i // svar is current, svar1 is tau-th lag + svar1=t[.,]:==(i-tau*vcvo.tdelta) // tau*vcvo.tdelta is usually just tau + if ((colsum(svar)>0) // there are current & lagged obs + & (colsum(svar1)>0)) { + wv = select((*vcvo.e),svar) :* select((*vcvo.wvar),svar) * vcvo.wf + wv1 = select((*vcvo.e),svar1) :* select((*vcvo.wvar),svar1) * vcvo.wf + Zsub =select((*vcvo.Z),svar) + Zsub1=select((*vcvo.Z),svar1) + if (K==1) { // simple/fast, e is column vector + eZsub = quadcross(1, wv, Zsub) // equivalent to colsum(wv :* Zsub) + eZsub1= quadcross(1, wv1, Zsub1) // equivalent to colsum(wv :* Zsub) + } + else { + eZsub=J(1,L*K,0) + for (j=1; j<=rows(Zsub); j++) { + wvj =wv[j,.] + Zj =Zsub[j,.] + eZsub=eZsub+(wvj#Zj) + } + eZsub1=J(1,L*K,0) + for (j=1; j<=rows(Zsub1); j++) { + wv1j =wv1[j,.] + Z1j =Zsub1[j,.] + eZsub1=eZsub1+(wv1j#Z1j) + } + } + ghat=quadcross(eZsub,eZsub1) + shat2=shat2+kw*(ghat+ghat') + } + i=i+vcvo.tdelta + } + } // end non-zero kernel weight block + } // end tau loop + +// If 1-level clustering, shat2 just calculated above is actually the desired shat + if (vcvo.clustvarname2=="") { + shat=shat2 + } + } + +// 2-level clustering, completion +// Cameron-Gelbach-Miller/Thompson method: +// Add 2 cluster variance matrices and subtract 3rd + if (vcvo.clustvarname2~="") { + shat = shat+shat2-shat3 + } + +// Note no dof correction required for cluster-robust + shat=shat/vcvo.N + } // end cluster-robust code + + if (vcvo.sw~="") { +// Stock-Watson adjustment. Calculate Bhat in their equation (6). Also need T=panel length. +// They define for balanced panels. Since T is not constant for unbalanced panels, need +// to incorporate panel-varying 1/T, 1/(T-1) and 1/(T-2) as weights in summation. + + st_view(ivar, ., st_tsrevar(vcvo.ivarname), vcvo.touse) + info_ivar = panelsetup(ivar, 1) + + shat=J(L*K,L*K,0) + bhat=J(L*K,L*K,0) + N_panels=0 + for (i=1; i<=rows(info_ivar); i++) { + esub=panelsubmatrix(*vcvo.e,i,info_ivar) + Zsub=panelsubmatrix(*vcvo.Z,i,info_ivar) + wsub=panelsubmatrix(*vcvo.wvar,i,info_ivar) + Tsub=rows(esub) + if (Tsub>2) { // SW cov estimator defined only for T>2 + N_panels=N_panels+1 + sigmahatsub=J(K,K,0) + ZZsub=J(L*K,L*K,0) + shatsub=J(L*K,L*K,0) + for (j=1; j<=rows(esub); j++) { + eZi=esub[j,1]#Zsub[j,.] + if ((vcvo.weight=="fweight") | (vcvo.weight=="iweight")) { + shatsub=shatsub+quadcross(eZi,eZi)*wsub[j]*vcvo.wf + sigmahatsub=sigmahatsub + quadcross(esub[j,1],esub[j,1])*wsub[j]*vcvo.wf + ZZsub=ZZsub+quadcross(Zsub[j,.],Zsub[j,.])*wsub[j]*vcvo.wf + } + else { + shatsub=shatsub+quadcross(eZi,eZi)*((wsub[j]*vcvo.wf)^2) + sigmahatsub=sigmahatsub + quadcross(esub[j,1],esub[j,1])*((wsub[j]*vcvo.wf)^2) + ZZsub=ZZsub+quadcross(Zsub[j,.],Zsub[j,.])*((wsub[j]*vcvo.wf)^2) + } + } // end loop through j obs of panel i + shat=shat + shatsub*(Tsub-1)/(Tsub-2) + bhat=bhat + ZZsub/Tsub#sigmahatsub/(Tsub-1)/(Tsub-2) + } + } // end loop through i panels + +// Note that Stock-Watson incorporate an N-n-k degrees of freedom correction in their eqn 4 +// for what we call shat. We use only an N-n degrees of freedom correction, i.e., we ignore +// the k regressors. This is because this is an estimate of S, the VCV of orthogonality conditions, +// independently of its use to obtain an estimate of the variance of beta. Makes no diff aysmptotically. +// Ignore dofminus correction since this is explicitly handled here. +// Use number of valid panels in denominator (SW cov estimator defined only for panels with T>2). + shat=shat/(vcvo.N-N_panels) + bhat=bhat/N_panels + shat=shat-bhat + } // end Stock-Watson block + + _makesymmetric(shat) + +// shat may not be positive-definite. Use spectral decomposition to obtain an invertable version. +// Extract Eigenvector and Eigenvalues, replace EVs, and reassemble shat. +// psda option: Stock-Watson 2008 Econometrica, Remark 8, say replace neg EVs with abs(EVs). +// psd0 option: Politis (2007) says replace neg EVs with zeros. + if (vcvo.psd~="") { + symeigensystem(shat,Evec,Eval) + if (vcvo.psd=="psda") { + Eval = abs(Eval) + } + else { + Eval = Eval + (abs(Eval) - Eval)/2 + } + shat = Evec*diag(Eval)*Evec' + _makesymmetric(shat) + } + + return(shat) + +} // end of program m_ranktest9_omega + +// *********************************************************************** // +// *********************************************************************** // + +real scalar m_ranktest9_calckw( real scalar tau, + real scalar bw, + string scalar kernel) + { + karg = tau / bw + if (kernel=="Truncated") { + kw=1 + } + if (kernel=="Bartlett") { + kw=(1-karg) + } + if (kernel=="Parzen") { + if (karg <= 0.5) { + kw = 1-6*karg^2+6*karg^3 + } + else { + kw = 2*(1-karg)^3 + } + } + if (kernel=="Tukey-Hanning") { + kw=0.5+0.5*cos(pi()*karg) + } + if (kernel=="Tukey-Hamming") { + kw=0.54+0.46*cos(pi()*karg) + } + if (kernel=="Tent") { + kw=2*(1-cos(tau*karg)) / (karg^2) + } + if (kernel=="Danielle") { + kw=sin(pi()*karg) / (pi()*karg) + } + if (kernel=="Quadratic Spectral") { + kw=25/(12*pi()^2*karg^2) /* + */ * ( sin(6*pi()*karg/5)/(6*pi()*karg/5) /* + */ - cos(6*pi()*karg/5) ) + } + return(kw) + } // end kw + +// *********************************************************************** // +// *********************************************************************** // + + +end + +* Version notes +* 1.0.00 First distributed version +* 1.0.01 With iweights, rkstat truncates N to mimic official Stata treatment of noninteger iweights +* Added warning if shat/vhat/vlab not of full rank. +* 1.0.02 Added NULLrank option +* Added eq names to saved V and S matrices +* 1.0.03 Added error catching for collinearities between varlists +* Not saving S matrix; V matrix now as in paper (without 1/N factor) +* Statistic, p-value etc set to missing if vcv not of full rank (Assumpt 2 in paper fails) +* 1.0.04 Fixed touse bug - was treating missings as touse-able +* Change some cross-products in robust loops to quadcross +* 1.0.05 Fixed bug with col/row names and ts operators. Added eval to saved matrices. +* 1.1.00 First ssc-ideas version. Added version 9.2 prior to Mata compiled section. +* 1.1.01 Allow non-integer bandwidth +* 1.1.02 Changed calc of yhat, zhat and pihat to avoid needlessly large intermediate matrices +* and to use more accurate qrsolve instead of inverted X'X. +* 1.1.03 Fixed touse bug that didn't catch missing cluster variable +* Fixed cluster bug - data needed to be sorted by cluster for Mata panel functions to work properly +* 1.2.00 Changed reporting so that gaps between panels are not reported as such. +* Added support for tdelta in tsset data. +* Changed tvar and ivar setup so that data must be tsset or xtset. +* Removed unnecessary loops through panel data with spectral kernels +* shat vcv now also saved. +* Added support for Thompson/Cameron-Gelbach-Miller 2-level cluster-robust vcvv +* Added support for Stock-Watson vcv - but requires data to have FEs partialled out, & doesn't support fweights +* Removed mimicking of Stata mistake of truncated N with iweights to nearest integer +* Fixed small bug with quadratic kernel (wasn't using negative weights) +* Optimised code dealing with time-series data +* 1.2.01 Fixed bug that always used Stock-Watson spectral decomp to create invertible shat +* instead of only when (undocumented) spsd option is called. +* 1.2.02 Fixed bug that did not allow string cluster variables +* 1.2.03 Fixed bug in code for cluster+kernel robust (typo in imported code from ivreg2=>crash) +* 1.2.04 Replaced code for S with ivreg2 code modified to support e matrix (cols > 1) +* Code block (m_omega, m_calckw, struct definition) now shared by ranktest and ivreg2. +* Renamed spsd option to psd following ivreg2 3.0.07 +* Added wf ("weight factor") and statement about sum of weights, as in ivreg2 +* Added dofminus option, as in ivreg2 +* Fixed minor reporting bug - was reporting gaps in entire panel, not just touse-d portion +* Recoded kernel & bw checks to use shared ivreg2 subroutine vkernel +* 1.2.05 Fixed weighting bug introduced in 1.2.04. All weights were affected. +* Was result of incompatibility of code shared with ivreg2. +* 1.3.01 First ranktest version with accompanying Mata library (shared with -ivreg2-). +* Mata library includes struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Fixed bug in 2-way cluster code (now in m_omega in Mata library) - would crash if K>1. +* 1.3.02 Improved partialling out and matrix inversion - switched from qrsolve to invsym. +* Use _makesymmetric() instead of symmetrizing by hand. +* 1.3.03 01Jan14. Fixed reporting bug with 2-way clustering and kernel-robust that would give +* wrong count for 2nd cluster variable. +* 1.3.04 24Aug14. Fixed bug in markout - would include obs where some vars were missing +* 1.3.05 22Jan15. First version of ranktest9. Mata library now internal with names incorporating "_ranktest9_". +* 1.3.06 18Aug15. Added r(cmd) and r(version) macros. + +* Version notes for imported version of Mata library +* 1.1.01 First version of library. +* Contains struct ms_vcvorthog, m_omega, m_calckw, s_vkernel. +* Compiled in Stata 9.2 for compatibility with ranktest 1.3.01 (a 9.2 program). +* 1.1.02 Add routine cdsy. Standardized spelling/caps/etc. of QS as "Quadratic Spectral" +* 1.1.03 Corrected spelling of "Danielle" kernel in m_omega() +* 1.1.04 Fixed weighting bugs in robust and cluster code of m_omega where K>1 +* 1.1.05 Added whichlivreg2(.) to aid in version control +* 1.1.06 Fixed remaining weighting bug (see 1.1.04) in 2-way clustering when interection +* of clustering levels is groups +* 1.1.07 Fixed HAC bug that crashed m_omega(.) when there were no obs for a particular lag diff --git a/data/ado/stata.trk b/data/ado/stata.trk new file mode 100644 index 0000000..0cb743d --- /dev/null +++ b/data/ado/stata.trk @@ -0,0 +1,367 @@ +* 00000009 +*! version 1.0.0 +* Do not erase or edit this file +* It is used by Stata to track the ado and help +* files you have installed. + +S http://www.stata.com/users/vwiggins +N grc1leg.pkg +D 25 Sep 2024 +U 1 +d grc1leg. Combine graphs into one graph with a common legend. +d Program by Vince Wiggins, StataCorp . +d Statalist distribution, 16 June 2003. +d +d Exactly like -graph combine- but shows a single common legend for all +d combined graphs. +d +d Distribution-Date: 02jun2010 +f g/grc1leg.ado +f g/grc1leg.hlp +e +S http://fmwww.bc.edu/repec/bocode/e +N estout.pkg +D 25 Sep 2024 +U 2 +d 'ESTOUT': module to make regression tables +d +d estout produces a table of regression results from one or +d several models for use with spreadsheets, LaTeX, HTML, or a +d word-processor table. eststo stores a quick copy of the active +d estimation results for later tabulation. esttab is a wrapper for +d estout. It displays a pretty looking publication-style regression +d table without much typing. estadd adds additional results to the +d e()-returns for one or several models previously fitted and +d stored. This package subsumes the previously circulated esto, +d esta, estadd, and estadd_plus. An earlier version of estout is +d available as estout1. +d +d KW: estimates +d KW: LaTeX +d KW: HTML +d KW: word processor +d KW: output +d +d Requires: Stata version 8.2 +d +d Distribution-Date: 20230212 +d +d Author: Ben Jann, University of Bern +d Support: email jann@@soz.unibe.ch +d +f _/_eststo.ado +f _/_eststo.hlp +f e/estadd.ado +f e/estadd.hlp +f e/estout.ado +f e/estout.hlp +f e/eststo.ado +f e/eststo.hlp +f e/estpost.ado +f e/estpost.hlp +f e/esttab.ado +f e/esttab.hlp +e +S http://fmwww.bc.edu/repec/bocode/x +N xtivreg2.pkg +D 25 Sep 2024 +U 3 +d 'XTIVREG2': module to perform extended IV/2SLS, GMM and AC/HAC, LIML and k-class regression for panel data models +d +d xtivreg2 implements IV/GMM estimation of the fixed-effects and +d first-differences panel data models with possibly endogenous +d regressors. It is essentially a wrapper for ivreg2, which must +d be installed for xtivreg2 to run: ssc install ivreg2, replace). +d xtivreg2 supports all the estimation and reporting options of +d ivreg2; see help ivreg2 for full descriptions and examples. In +d particular, all the statistics available with ivreg2 +d (heteroskedastic, cluster- and autocorrelation-robust covariance +d matrix and standard errors, overidentification and orthogonality +d tests, first-stage and weak/underidentification statistics, etc.) +d are also supported by xtivreg2 and will be reported with any +d degrees-of-freedom adjustments required for a panel data +d estimation. +d +d KW: instrumental variables +d KW: panel data +d KW: fixed effects +d KW: first differences +d KW: Sargan test +d KW: robust estimation +d KW: orthogonality +d KW: GMM +d KW: Hansen's J +d KW: heteroskedastic OLS, +d +d Requires: Stata version 8.2 and ivreg2, ranktest from SSC +d +d Distribution-Date: 20200626 +d +d Author: Mark E Schaffer, Heriot-Watt University +d Support: email m.e.schaffer@@hw.ac.uk +d +f x/xtivreg2.ado +f x/xtivreg2.hlp +f x/xtivreg2_p.ado +e +S http://fmwww.bc.edu/repec/bocode/i +N ivreg2.pkg +D 25 Sep 2024 +U 4 +d 'IVREG2': module for extended instrumental variables/2SLS and GMM estimation +d +d ivreg2 provides extensions to Stata's official ivregress and +d newey. Its main capabilities: two-step feasible GMM estimation; +d continuously updated GMM estimation (CUE); LIML and k-class +d estimation; automatic output of the Hansen-Sargan or +d Anderson-Rubin statistic for overidentifying restrictions; C +d statistic test of exogeneity of subsets of instruments (orthog() +d option); kernel-based autocorrelation-consistent (AC) and +d heteroskedastic and autocorrelation-consistent (HAC) estimation, +d with user-specified choice of kernel; Cragg's "heteroskedastic +d OLS" (HOLS) estimator; default reporting of large-sample +d statistics (z and chi-squared rather than t and F); small option +d to report small-sample statistics; first-stage regression +d reported with F-test of excluded instruments and R-squared with +d included instruments "partialled-out"; enhanced Kleibergen-Paap +d and Cragg-Donald tests for weak instruments, redundancy of +d instruments, significance of endogenous regressors; two-way +d clustering of standard errors; Kiefer and Driscoll-Kraay +d standard errors. ivreg2 can also be used for ordinary least +d squares (OLS) estimation using the same command syntax as Stata's +d official regress and newey. New in this version: ivreg2 now +d supports factor variables. This is version 4.1.11 of ivreg2, +d updated from that published in Stata Journal, 5(4), requiring +d Stata 11.2 or better. Stata 8.2/9.2/10.2 users may use this +d routine, which will automatically call ivreg28, ivreg29, or +d ivreg210, respectively. These versions are now included in the +d ivreg2 package. Stata 7 users may use the Stata Journal version +d of ivreg2, accessible via net search ivreg2. +d +d KW: instrumental variables +d KW: Sargan test +d KW: robust estimation +d KW: orthogonality +d KW: GMM +d KW: Hansen's J +d KW: heteroskedastic OLS, +d +d Requires: Stata version 11.2 and ranktest from SSC +d +d Distribution-Date: 20240814 +d +d Author: Christopher F Baum, Boston College +d Support: email baum@@bc.edu +d +d Author: Mark E Schaffer, Heriot-Watt University +d Support: email m.e.schaffer@@hw.ac.uk +d +d Author: Steven Stillman, Free University of Bozen-Bolzano +d Support: email Steven.Stillman@@unibz.it +d +f i/ivreg2.ado +f i/ivreg2.sthlp +f i/ivreg2_p.ado +f l/livreg2.mlib +f i/ivreg210.ado +f i/ivreg210.sthlp +f i/ivreg210_p.ado +f i/ivreg29.ado +f i/ivreg29.hlp +f i/ivreg29_p.ado +f i/ivreg29_cue.ado +f i/ivreg28.ado +f i/ivreg28.hlp +f i/ivreg28_p.ado +f i/ivreg28_cue.ado +e +S http://fmwww.bc.edu/repec/bocode/r +N ranktest.pkg +D 25 Sep 2024 +U 5 +d 'RANKTEST': module to test the rank of a matrix +d +d ranktest implements various tests for the rank of a matrix. +d Tests of the rank of a matrix have many practical applications. +d For example, in econometrics the requirement for identification +d is the rank condition, which states that a particular matrix must +d be of full column rank. Another example from econometrics +d concerns cointegration in vector autoregressive (VAR) models; the +d Johansen trace test is a test of a rank of a particular matrix. +d The traditional test of the rank of a matrix for the standard +d (stationary) case is the Anderson (1951) canonical correlations +d test. If we denote one list of variables as Y and a second as Z, +d and we calculate the squared canonical correlations between Y and +d Z, the LM form of the Anderson test, where the null hypothesis is +d that the matrix of correlations or regression parameters B +d between Y and Z has rank(B)=r, is N times the sum of the r+1 +d largest squared canonical correlations. A large test statistic +d and rejection of the null indicates that the matrix has rank at +d least r+1. The Cragg-Donald (1993) statistic is a closely related +d Wald test for the rank of a matrix. The standard versions of +d these tests require the assumption that the covariance matrix has +d a Kronecker form; when this is not so, e.g., when disturbances +d are heteroskedastic or autocorrelated, the test statistics are no +d longer valid. ranktest implements various generalizations of +d these tests - Kleibergen-Paap, Cragg-Donald, and J-type 2-step +d GMM and CUE GMM tests - to the case of a non-Kronecker covariance +d matrix. The implementation in ranktest will calculate test +d statistics that are robust to various forms of +d heteroskedasticity, autocorrelation, and clustering. +d +d KW: matrix +d KW: rank +d KW: collinearity +d KW: cointegration +d +d Requires: Stata version 12 (version 9.2 for ranktest9, version 11 for ranktest11) +d +d Distribution-Date: 20200929 +d +d Author: Frank Kleibergen, Brown University +d Support: email Frank_Kleibergen@@brown.edu +d +d Author: Mark E Schaffer, Heriot-Watt University +d Support: email m.e.schaffer@@hw.ac.uk +d +d Author: Frank Windmeijer, University of Oxford +d Support: email frank.windmeijer@@stats.ox.ac.uk +d +f r/ranktest.ado +f r/ranktest9.ado +f r/ranktest11.ado +f r/ranktest.sthlp +f r/ranktest11.sthlp +f l/livreg2.mlib +e +S http://fmwww.bc.edu/repec/bocode/l +N leebounds.pkg +D 25 Sep 2024 +U 6 +d 'LEEBOUNDS': module for estimating Lee (2009) treatment effect bounds +d +d leebounds computes treatment effect bounds for samples with +d non-random sample selection/attrition as proposed by Lee (Review +d of Economic Studies, 2009). The lower and upper bound, +d respectively, correspond to extreme assumptions about the missing +d information that are consistent with the observed data. As +d opposed to parametric approaches to correcting for sample +d selection bias, such as the classical Heckman (1979) estimator, +d Lee (2009) bounds rest on very few assumptions, i.e. random +d assignment of treatment and monotonicity. Monotonicity means that +d the treatment status affects selection in just one direction. +d That is, receiving a treatment makes selection either more or +d less likely for any observation. In technical terms, the approach +d rests on a trimming procedure. Either from below or from +d above, the group (treatment, control) that suffers less from +d sample attrition is trimmed at the quantile of the outcome +d variable that corresponds to the share of 'excess observations' +d in this group. Calculating group differentials in mean outcome +d yields the lower and the upper bound, respectively, for the +d treatment effect depending on whether trimming is from below or +d above. leebounds assumes that it is unknown, a priori, which +d group (treatment, control) is subject to the higher selection +d probability and estimates this from data (see Lee, 2009:1090). d +d KW: sample selection bias +d KW: attrition bias +d KW: random assignment +d +d Requires: Stata version 11 +d +d Distribution-Date: 20130725 +d +d Author: Harald Tauchmann , University of Erlangen-Nuremberg, Germany +d Support: email harald.tauchmann@@fau.de +d +f l/leebounds.ado +f l/leebounds.sthlp +e +S http://fmwww.bc.edu/repec/bocode/c +N cibar.pkg +D 25 Sep 2024 +U 7 +d 'CIBAR': module to plot bar graphs and confidence intervals over groups +d +d cibar plots bars and confidence intervals of the mean of a +d variable over at least one group. cibar aims at drawing graphs +d that resemble graphs created by graph bar varname, over(varname) +d asyvar, adding confidence intervals to the bars. In order to do +d so, cibar uses Stata's twoway bar and twoway rcap. cibar shows +d graphically the differences in the mean of a variable depending +d on the categories of other variables. +d +d KW: bar graph +d KW: graphics +d KW: confidence intervals +d KW: means +d +d Requires: Stata version 13 +d +d Distribution-Date: 20190624 +d +d Author: Alexander Staudt, N/A +d Support: email staudtlex@@live.de +d +f c/cibar.ado +f c/cibar.sthlp +e +S http://fmwww.bc.edu/repec/bocode/c +N coefplot.pkg +D 25 Sep 2024 +U 8 +d 'COEFPLOT': module to plot regression coefficients and other results +d +d coefplot plots results from estimation commands or Stata +d matrices. Results from multiple models or matrices can be +d combined in a single graph. The default behavior of coefplot is +d to draw markers for coefficients and horizontal spikes for +d confidence intervals. However, coefplot can also produce various +d other types of graphs. +d +d KW: graphics +d KW: coefficients +d KW: estimation +d +d Requires: Stata version 11 +d +d Distribution-Date: 20230225 +d +d Author: Ben Jann, University of Bern +d Support: email jann@@soz.unibe.ch +d +f c/coefplot.ado +f c/coefplot.sthlp +e +S http://fmwww.bc.edu/repec/bocode/c +N cmogram.pkg +D 25 Sep 2024 +U 9 +d 'CMOGRAM': module to plot histogram-style conditional mean or median graphs +d +d cmogram graphs the means, medians, frequencies, or proportions +d of one variable, conditional on another. Output can be further +d conditioned on a series of control variables, in which case it is +d the means or medians of the residual values that are plotted. For +d regression discontinuity and similar applications, graphs can be +d split at a particular cut point, and a by() option allows for +d sub-groups to be plotted separately. While the default output is +d similar to a histogram, there is the option of scatterplot-style +d output. +d +d KW: graphics +d KW: descriptive statistics +d KW: mean +d KW: median +d KW: frequencies +d KW: proportions +d +d Requires: Stata version 9.2 +d +d Distribution-Date: 20110911 +d +d Author: Christopher Robert, John F. Kennedy School of Government, Harvard University +d Support: email chris_robert@@hksphd.harvard.edu +d +f c/cmogram.ado +f c/cmogram.hlp +e diff --git a/data/ado/x/xtivreg2.ado b/data/ado/x/xtivreg2.ado new file mode 100644 index 0000000..3bcefa0 --- /dev/null +++ b/data/ado/x/xtivreg2.ado @@ -0,0 +1,765 @@ +*! xtivreg2 1.0.17 19Feb2015 +*! author mes +* 01.0.02 - Wasn't rewriting collinear/dups macro lists for time-series operators +* Fixed version bug. Added cmd to saved locals. +* 01.0.03 - Update to match ivreg2 2.1.15 including endog option +* 01.0.04 - Fixed bug in reporting obs numbers with weights; now ob numbers weighted for fw and iw only +* 01.0.05 - Added support for ivreg28 +* 01.0.06 - Fixed replay bug +* 01.0.07 - Added cmdline macro +* 01.0.08 - Tweaked checks for v8 vs >8, ivreg2 vs ivreg28 +* 01.0.09 - Fixed annoying bug in FD that reversed order of variables +* 01.0.10 - Fixed bug that didn't allow partial() with FE and time series operators. +* NB: FD and partial with TS operators not feasible; would require substantial rewrite of FD +* block or rewrite of ivreg2 code +* allowed 2-level clustering as supported by ivreg2 +* 01.0.11 - Fixed bug in reporting of e(df_m) with cluster - counted FEs but shouldn't have (vcv, F etc. were OK) +* 01.0.12 - Added check for demeaning of time variable. +* 01.0.13 - Fixed bug that didn't allow saved/displayed first-stage results for endog vars with TS operator +* Also made similar changes relating to RF results and to use of TS-prefixed var as dep var in main eq. +* 01.0.14 - Changed call to ivreg2 from qui to noi with nooutput option so that ivreg2 reports collinearities, errors, etc. +* Added qui to gen of weight var to suppress msg about missings created. +* Added nooutput option. Added check for ivreg210. Consolidated code for checking which ivreg2 installed. +* 01.0.15 - Added version control to call to ivreg2 so that call is under original calling version +* rather than version set locally by xtivreg2. +* 01.0.16 - Fixed bug in first-stage display connected to version control. +* 01.0.17 - Fixed bug (partial vs fwl) that would not allow running under Stata 8 or with ivreg28 +* Ensured correct support for 2-step GMM ("gmm" in ivreg28, "gmm2s" in ivreg29 onwards) + +program define xtivreg2, eclass byable(recall) + version 8.2 + local lversion 01.0.17 + +* Needed for call to ivreg2 + local ver = _caller() + local ver : di %6.1f `ver' + +* ivreg28 called option "fwl"; ivreg29 and onwards calls it "partial" + if `ver' < 9 { + local partialopt "fwl" + } + else { + local partialopt "partial" + } + +* Before replay() or estimation blocks, set ivreg2 command + tempname regest + capture _estimates hold `regest', restore +* Look for latest installed version of ivreg2 +* Start with ivreg2 + local ivreg2_cmd "ivreg2" + capture `ivreg2_cmd', version + if _rc != 0 { +* No ivreg2, check for ivreg210 + local ivreg2_cmd "ivreg210" + capture `ivreg2_cmd', version + if _rc != 0 { +* No ivreg210, check for ivreg29 + local ivreg2_cmd "ivreg29" + capture `ivreg2_cmd', version + if _rc != 0 { +* No ivreg29, check for ivreg28 + local ivreg2_cmd "ivreg28" + capture `ivreg2_cmd', version + } + } + } +* Done checking for an ivreg2, confirm found or not + if _rc != 0 { +* 4 strikes and you're out. +di as err "Error - must have ivreg2/ivreg28/ivreg29/ivreg210 version 2.1.15 or greater installed" + exit 601 + } + local vernum "`e(version)'" + capture _estimates unhold `regest' + if ("`vernum'" < "02.1.15") | ("`vernum'" > "09.9.99") { +di as err "Error - must have ivreg2/ivreg28/ivreg29/ivreg210 version 2.1.15 or greater installed" + exit 601 + } +* Macro `ivreg2_cmd' now set with appropriate ivreg2 command. + +* replay() previous results + if replay() { + syntax [, FIRST FFIRST rf Level(integer $S_level) NOHEader NOFOoter NOOUTput /* + */ EForm(string) PLUS VERsion] + + if "`version'" != "" & "`first'`ffirst'`rf'`noheader'`nofooter'`eform'`plus'" != "" { + di as err "option version not allowed" + error 198 + } + if "`version'" != "" { + di in gr "`lversion'" + ereturn clear + ereturn local version `lversion' + ereturn local cmd "xtivreg2" + exit + } + if `"`e(cmd)'"' != "xtivreg2" { + error 301 + } +* End replay block + } + else { +* Start estimation block + local cmdline "xtivreg2 `*'" + + syntax [anything(name=0)] [if] [in] [aw fw pw iw/] , [ fe fd /* + */ Ivar(varname) Tvar(varname) first ffirst rf /* + */ savefirst SAVEFPrefix(name) saverf SAVERFPrefix(name) CLuster(varlist) /* + */ orthog(string) ENDOGtest(string) REDundant(string) PARTIAL(string) /* + */ BW(string) SKIPCOLL NOHEader NOFOoter NOOUTput GMM GMM2s * ] + +* Option called gmm in ivreg28, gmm2s in ivreg29 onwards + if "`gmm'`gmm2s'" ~= "" { + if `ver' < 9 { + local gmm2s "gmm" + } + else { + local gmm2s "gmm2s" + } + } + + if ("`fe'"=="" & "`fd'"=="") | ("`fe'"~="" & "`fd'"~="") { +di as err "error - must specify either fe or fd option" + error 198 + } + + if "`bw'"=="auto" { +di as err "error - automatic bandwidth selection not supported by -xtivreg2-" + error 198 + } + +* Also catches inconsistencies between i/tvar and tsset variables + xt_iis `ivar' + local ivar "`s(ivar)'" + + capture tsset + if "`tvar'" == "" { + local tvar "`r(timevar)'" + } + else if "`tvar'"!="`r(timevar)'" { +di as err "invalid tvar() option - data already -tsset-" + exit 5 + } + if "`tvar'"!="" | "`fd'"!="" { + xt_tis `tvar' + local tvar "`s(timevar)'" + } + + if "`skipcoll'"=="" { + qui _rmcoll `varlist' + local retlist `r(varlist)' `ivar' + qui _rmcoll `retlist' + if "`r(varlist)'" ~= "`retlist'" { + di as err "independent variables " _c + di as err "are collinear with the panel variable" _c + di as err " `ivar'" + exit 198 + } + } + + local n 0 + + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + if `s(stop)' { + error 198 + } + while `s(stop)'==0 { + if "`paren'"=="(" { + local n = `n' + 1 + if `n'>1 { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +exit 198 + } + gettoken p lhs : lhs, parse(" =") + while "`p'"!="=" { + if "`p'"=="" { +capture noi error 198 +di in red `"syntax is "(all instrumented variables = instrument variables)""' +di in red `"the equal sign "=" is required"' +exit 198 + } + local endo `endo' `p' + gettoken p lhs : lhs, parse(" =") + } +* To enable Cragg HOLS estimator, allow for empty endo list + if "`endo'" != "" { + tsunab endo : `endo' + } +* To enable OLS estimator with (=) syntax, allow for empty exexog list + if "`lhs'" != "" { + tsunab exexog : `lhs' + } + } + else { + local inexog `inexog' `lhs' + } + gettoken lhs 0 : 0, parse(" ,[") match(paren) + IsStop `lhs' + } + local 0 `"`lhs' `0'"' + + tsunab inexog : `inexog' + tokenize `inexog' + local lhs "`1'" + local 1 " " + local inexog `*' + + if "`gmm'`gmm2s'" != "" & "`exexog'" == "" { +di as err "option -gmm- invalid: no excluded instruments specified" + exit 102 + } + +* If first requested, also needs to request savefirst or savefprefix and set drop flag + if "`first'" != "" & "`savefirst'`savefprefix'" == "" { + local savefirst "savefirst" + local dropfirst "dropfirst" + } + if "`savefirst'" != "" & "`savefprefix'" == "" { + local savefprefix "_xtivreg2_" + } + +* If rf requested, also needs to request saverf or saverfprefix and set drop flag + if "`rf'" != "" & "`saverf'`saverfprefix'" == "" { + local saverf "saverf" + local droprf "droprf" + } + if "`saverf'" != "" & "`saverfprefix'" == "" { + local saverfprefix "_xtivreg2_" + } + + tempvar wvar + if "`weight'" !="" { + local wtexp `"[`weight'=`exp']"' + qui gen double `wvar'=`exp' + } + else { + qui gen long `wvar'=1 + } + +* Begin estimation blocks + if "`fd'" ~= "" { + local lhs_fd "d.`lhs'" + foreach vn of local inexog { + local inexog_fd "`inexog_fd' d.`vn'" + } + foreach vn of local exexog { + local exexog_fd "`exexog_fd' d.`vn'" + } + foreach vn of local endo { + local endo_fd "`endo_fd' d.`vn'" + } + foreach vn of local orthog { + local orthog_fd "`orthog_fd' d.`vn'" + } + foreach vn of local endogtest { + local endogtest_fd "`endogtest_fd' d.`vn'" + } + foreach vn of local redundant { + local redundant_fd "`redundant_fd' d.`vn'" + } +* Do this even though ivreg2 currently won't accept TS operators with partial() + foreach vn of local partial { + local partial_fd "`partial_fd' d.`vn'" + } + +* Use nooutput option to get collinearity etc. messages +* Ensures that these are reported before any fatal ivreg2 error that might occur +* Called under version control using calling version + version `ver' : `ivreg2_cmd' `lhs_fd' `inexog_fd' (`endo_fd' = `exexog_fd') `wtexp' `if', /* + */ `first' `ffirst' `rf' /* + */ savefprefix(`savefprefix') saverfprefix(`saverfprefix') /* + */ cluster(`cluster') orthog(`orthog_fd') endog(`endogtest_fd') /* + */ redundant(`redundant_fd') `partialopt'(`partial_fd') tvar(`tvar') bw(`bw') `options' /* + */ `gmm2s' nooutput + preserve + tempvar touse + qui gen `touse'=e(sample) + tempname T_i + + sort `ivar' `touse' +* Only iw and fw use weighted observation counts + if "`weight'" == "iweight" | "`weight'" == "fweight" { + qui by `ivar' `touse': gen long `T_i' = sum(`wvar') if `touse' + } + else { + qui by `ivar' `touse': gen long `T_i' = _N if `touse' + } + qui by `ivar' `touse': replace `T_i' = . if _n~=_N + qui count if `T_i' < . + ereturn scalar N_g=r(N) + + tempname g_min g_avg g_max + qui by `ivar' `touse' : replace `T_i'=`T_i'[_N] if `touse' & _n<_N +* Only iw and fw report weighted observation counts + if "`weight'" == "iweight" | "`weight'" == "fweight" { + sum `T_i' `wtexp', meanonly + ereturn scalar g_avg = r(sum_w)/e(N_g) + } + else { + sum `T_i', meanonly + ereturn scalar g_avg = r(N)/e(N_g) + } + + ereturn scalar g_min = r(min) + ereturn scalar g_max = r(max) + + ereturn scalar df_b=e(df_m) + ereturn scalar sigma_e=e(rmse) +* ereturn scalar singleton=`singleton' + ereturn local xtmodel "fd" + ereturn local version `lversion' + ereturn local predict "xtivreg2_p" + ereturn local ivar "`ivar'" + ereturn local tvar "`tvar'" + + restore +* End FD block + } + else { +* Must be fixed effects + marksample touse + markout `touse' `lhs' `inexog' `exexog' `endo' `cluster' `tvar', strok + +* Catch weird bug if ivar is used as a regressor + local allvars "`lhs' `inexog' `endo' `exexog'" + local allvars : subinstr local allvars "`ivar'" "`ivar'", all word count(local ivar_ct) + if `ivar_ct'>0 { +di as err "Error - cannot use tsset panel variable `ivar' as dependent variable, regressor or IV." + exit 198 + } +* Don't allow tvar to be used as a regressor either - too dangerous + if "`tvar'"~="" { + local allvars "`lhs' `inexog' `endo' `exexog'" + local allvars : subinstr local allvars "`tvar'" "`tvar'", all word count(local tvar_ct) + if `tvar_ct'>0 { +di as err "Error - cannot use tsset time variable `tvar' as dependent variable, regressor or IV." +di as err "Create a new variable equal to `tvar' and use it instead." + exit 198 + } + } + + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + tsrevar `inexog', substitute + local inexog_t "`r(varlist)'" + tsrevar `endo', substitute + local endo_t "`r(varlist)'" + tsrevar `exexog', substitute + local exexog_t "`r(varlist)'" + tsrevar `orthog', substitute + local orthog_t "`r(varlist)'" + tsrevar `endogtest', substitute + local endogtest_t "`r(varlist)'" + tsrevar `redundant', substitute + local redundant_t "`r(varlist)'" + tsrevar `partial', substitute + local partial_t "`r(varlist)'" + +* preserve here, prior to first sort + preserve + + tempvar T_i + sort `ivar' `touse' +* Catch singletons. Must use unweighted data + qui by `ivar' `touse': gen long `T_i' = _N if _n==_N & `touse' + qui count if `T_i' == 1 + local singleton=r(N) + if `singleton' > 0 { +di in ye "Warning - singleton groups detected. " `singleton' " observation(s) not used." + } + qui replace `touse'=0 if `T_i'==1 + drop `T_i' + +* Catch clustvar-ivar inconsistencies + if "`cluster'"!="" { +* Allow for 2-way clustering + tokenize `cluster' + local cluster1 "`1'" + local cluster2 "`2'" + if "`cluster1'" ~= "`ivar'" & "`cluster2'" ~= "`ivar'" { + tempvar ic_ct + sort `ivar' `cluster1' `touse' + qui by `ivar' `cluster1' `touse': gen long `ic_ct' = 1 if _n==_N & `touse' + sort `ivar' `touse' + qui by `ivar' `touse': replace `ic_ct'=sum(`ic_ct') if `touse' + qui count if `ic_ct' > 1 & `ic_ct' < . + if r(N)>1 & r(N)<. & "`cluster2'"=="" { +di as err "cluster option not supported if a panel spans more than one cluster" + exit 198 + } + else if r(N)>1 & r(N)<. & "`cluster2'"~="" { +* Need to check second cluster var if it exists + drop `ic_ct' + sort `ivar' `cluster2' `touse' + qui by `ivar' `cluster2' `touse': gen long `ic_ct' = 1 if _n==_N & `touse' + sort `ivar' `touse' + qui by `ivar' `touse': replace `ic_ct'=sum(`ic_ct') if `touse' + qui count if `ic_ct' > 1 & `ic_ct' < . + if r(N)>1 & r(N)<. { +di as err "cluster option not supported if a panel spans more than one cluster" + exit 198 + } + } + } + } + + sort `ivar' `touse' +* Only iw and fw use weighted observation counts + if "`weight'" == "iweight" | "`weight'" == "fweight" { + qui by `ivar' `touse': gen long `T_i' = sum(`wvar') if `touse' + } + else { + qui by `ivar' `touse': gen long `T_i' = _N if `touse' + } + qui by `ivar' `touse': replace `T_i' = . if _n~=_N + qui count if `T_i' < . + local N_g=r(N) + local dofminus=`N_g' + local allvars "`lhs_t' `inexog_t' `endo_t' `exexog_t'" + foreach var of local allvars { + tempvar `var'_m +* To get weighted means + qui by `ivar' `touse' : gen double ``var'_m'=sum(`var'*`wvar')/sum(`wvar') if `touse' + qui by `ivar' `touse' : replace ``var'_m'=``var'_m'[_N] if `touse' & _n<_N +* This guarantees that the demeaned variables are doubles + qui by `ivar' `touse' : replace ``var'_m'=`var'-``var'_m'[_N] if `touse' + drop `var' + rename ``var'_m' `var' + } +* Use nooutput option to get collinearity etc. messages +* Ensures that these are reported before any fatal ivreg2 error that might occur + version `ver' : `ivreg2_cmd' `lhs_t' `inexog_t' (`endo_t' = `exexog_t') `wtexp' if `touse', /* + */ dofminus(`dofminus') nocons `first' `ffirst' `rf' /* + */ savefprefix(`savefprefix') saverfprefix(`saverfprefix') /* + */ cluster(`cluster') orthog(`orthog_t') endog(`endogtest_t') /* + */ redundant(`redundant_t') `partialopt'(`partial_t') tvar(`tvar') bw(`bw') `options' /* + */ `gmm2s' nooutput + + ereturn scalar N_g = `N_g' + qui by `ivar' `touse' : replace `T_i'=`T_i'[_N] if `touse' & _n<_N +* Only iw and fw report weighted observation counts + if "`weight'" == "iweight" | "`weight'" == "fweight" { + sum `T_i' `wtexp', meanonly + ereturn scalar g_avg = r(sum_w)/e(N_g) + } + else { + sum `T_i', meanonly + ereturn scalar g_avg = r(N)/e(N_g) + } + ereturn scalar g_min = r(min) + ereturn scalar g_max = r(max) +* Will need these for first/rf option + tempname g_min g_avg g_max + scalar `g_min'=e(g_min) + scalar `g_avg'=e(g_avg) + scalar `g_max'=e(g_max) + restore + +* Replace any time series locals with original time series names + tempname b V S W firstmat + +* First replace ts locals in saved first and/or rf results, if any + if "`first'`savefirst'`rf'`saverf'" ~= "" { + local eqlist "`e(rfeq)' `e(firsteqs)'" +* In case estimates names have changed, we will be saving under new names. + local rrfeq "`e(rfeq)'" + local rfirsteqs "`e(firsteqs)'" + foreach eqname of local eqlist { + _estimates hold `regest', restore + capture estimates restore `eqname' + if _rc == 0 { +* In case estimates name has changed, e.g., dep var of first-stage regression, +* we will want to re-save under a replace new name, reqname + estimates drop `eqname' + local reqname "`eqname'" + mat `b' =e(b) + mat `V' =e(V) + mat `S' =e(S) + local cnames : colnames `b' + local cnamesS : colnames `S' + local vnames "`lhs' `endo' `inexog' `exexog'" + local vnames_t "`lhs_t' `endo_t' `inexog_t' `exexog_t'" +* Macros to be fixed + local finsts "`e(insts)'" + local finexog "`e(inexog)'" + local fdv "`e(depvar)'" + foreach vn of local vnames { + tokenize `vnames_t' + local vn_t `1' + mac shift + local vnames_t `*' + local cnames : subinstr local cnames "`vn_t'" "`vn'" + local cnamesS : subinstr local cnamesS "`vn_t'" "`vn'" +* Macro varlists + local finsts : subinstr local finsts "`vn_t'" "`vn'" + local finexog : subinstr local finexog "`vn_t'" "`vn'" + local fdv : subinstr local fdv "`vn_t'" "`vn'" +* Titles. TS ops not allowed so change . to _ + local reqname : subinstr local reqname "`vn_t'" "`vn'" + local reqname : subinstr local reqname "." "_" + } +* Change in list of equation names + local rrfeq : subinstr local rrfeq "`eqname'" "`reqname'" + local rfirsteqs : subinstr local rfirsteqs "`eqname'" "`reqname'" + mat colnames `b' =`cnames' + mat colnames `V' =`cnames' + mat rownames `V' =`cnames' + mat colnames `S' =`cnamesS' + mat rownames `S' =`cnamesS' + ereturn post `b' `V', depname(`fdv') noclear + ereturn matrix S `S' + ereturn local insts `finsts' + ereturn local inexog `finexog' + ereturn scalar N_g=`N_g' + ereturn scalar df_a=`N_g' + ereturn scalar df_b=e(df_m) + if "`cluster'"=="" { + ereturn scalar df_m=`N_g'+e(df_b) + } + else { + ereturn scalar df_m=e(df_b) + } + ereturn scalar sigma_e=e(rmse) + ereturn local xtmodel "fe" + ereturn local version `lversion' + ereturn local predict "xtivreg2_p" + ereturn local ivar "`ivar'" + ereturn local tvar "`tvar'" + ereturn scalar g_min = `g_min' + ereturn scalar g_avg = `g_avg' + ereturn scalar g_max = `g_max' + ereturn local cmd "xtivreg2" + local eqtitle "`e(_estimates_title)'" + capture est store `reqname', title(`eqtitle') + } + _estimates unhold `regest' + } + } +* Now fix main results + mat `b' =e(b) + mat `V' =e(V) + mat `S' =e(S) + mat `W' =e(W) + mat `firstmat'=e(first) +* Matrix column names to be changed + local cnames : colnames `b' + local cnamesS : colnames `S' + local cnamesW : colnames `W' + local cnamesf : colnames `firstmat' +* Full list of names to change + local vnames "`lhs' `inexog' `endo' `exexog'" + local vnames_t "`lhs_t' `inexog_t' `endo_t' `exexog_t'" +* Macros to be fixed + local insts "`e(insts)'" + local inexog "`e(inexog)'" + local instd "`e(instd)'" + local exexog "`e(exexog)'" + local depvar "`e(depvar)'" + local clist "`e(clist)'" + local elist "`e(elist)'" + local redlist "`e(redlist)'" + local partial "`e(partial)'" +* If any collinear or duplicates + local collin "`e(collin)'" + local dups "`e(dups)'" + local insts1 "`e(insts1)'" + local inexog1 "`e(inexog1)'" + local instd1 "`e(instd1)'" + local exexog1 "`e(exexog1)'" + local partial1 "`e(partial1)'" + foreach vn of local vnames { + tokenize `vnames_t' + local vn_t `1' + mac shift + local vnames_t `*' + local cnames : subinstr local cnames "`vn_t'" "`vn'" + local cnamesS : subinstr local cnamesS "`vn_t'" "`vn'" + local cnamesW : subinstr local cnamesW "`vn_t'" "`vn'" + local cnamesf : subinstr local cnamesf "`vn_t'" "`vn'" +* Macro varlists + local insts : subinstr local insts "`vn_t'" "`vn'" + local inexog : subinstr local inexog "`vn_t'" "`vn'" + local instd : subinstr local instd "`vn_t'" "`vn'" + local exexog : subinstr local exexog "`vn_t'" "`vn'" + local partial : subinstr local partial "`vn_t'" "`vn'" + local depvar : subinstr local depvar "`vn_t'" "`vn'" + local clist : subinstr local clist "`vn_t'" "`vn'" + local elist : subinstr local elist "`vn_t'" "`vn'" + local redlist : subinstr local redlist "`vn_t'" "`vn'" + local collin : subinstr local collin "`vn_t'" "`vn'" + local dups : subinstr local dups "`vn_t'" "`vn'" + local insts1 : subinstr local insts1 "`vn_t'" "`vn'" + local inexog1 : subinstr local inexog1 "`vn_t'" "`vn'" + local instd1 : subinstr local instd1 "`vn_t'" "`vn'" + local exexog1 : subinstr local exexog1 "`vn_t'" "`vn'" + local partial1: subinstr local partial1 "`vn_t'" "`vn'" + } + mat colnames `b' =`cnames' + mat colnames `V' =`cnames' + mat rownames `V' =`cnames' + mat colnames `S' =`cnamesS' + mat rownames `S' =`cnamesS' + mat colnames `W' =`cnamesW' + mat rownames `W' =`cnamesW' + mat colnames `firstmat'=`cnamesf' + + ereturn post `b' `V', dep(`depvar') esample(`touse') noclear + ereturn matrix S `S' + if ~matmissing(`W') { + ereturn matrix W `W' + } + if ~matmissing(`firstmat') { + ereturn matrix first `firstmat' + } + ereturn local insts `insts' + ereturn local inexog `inexog' + ereturn local instd `instd' + ereturn local exexog `exexog' + ereturn local partial `partial' + ereturn local collin `collin' + ereturn local dups `dups' + ereturn local insts1 `insts1' + ereturn local inexog1 `inexog1' + ereturn local instd1 `instd1' + ereturn local exexog1 `exexog1' + ereturn local partial1 `partial1' + ereturn local depvar `depvar' + ereturn local clist `clist' + ereturn local elist `elist' + ereturn local redlist `redlist' + ereturn scalar N_g=`N_g' + ereturn scalar df_b=e(df_m) + ereturn scalar df_a=e(N_g) + if "`cluster'"=="" { + ereturn scalar df_m=e(N_g)+e(df_b) + } + else { +* FEs with cluster don't use up degrees of freedom as incidental parameters + ereturn scalar df_m=e(df_b) + } + ereturn scalar sigma_e=e(rmse) + ereturn scalar singleton=`singleton' + ereturn local xtmodel "fe" + ereturn local version `lversion' + ereturn local predict "xtivreg2_p" + ereturn local ivar "`ivar'" + ereturn local tvar "`tvar'" + if "`first'`savefirst'`rf'`saverf'" ~= "" { + ereturn local rfeq `rrfeq' + ereturn local firsteqs `rfirsteqs' + } +* End fixed effects block + } + +* End estimation block + } + + if "`noheader'`nooutput'"=="" { + if "`e(xtmodel)'"=="fd" { + di in gr _newline "FIRST DIFFERENCES ESTIMATION" + di in gr "{hline 28}" + } + else { + di in gr _newline "FIXED EFFECTS ESTIMATION" + di in gr "{hline 24}" + } + di in gr "Number of groups = " in ye %9.0g e(N_g) /* + */ _col(49) in gr "Obs per group: min" _col(68) "=" /* + */ _col(70) in ye %9.0g e(g_min) + di in gr _col(64) in gr "avg" _col(68) "=" /* + */ _col(70) in ye %9.1f e(g_avg) + di in gr _col(64) in gr "max" _col(68) "=" /* + */ _col(70) in ye %9.0g e(g_max) + } + + ereturn local cmd "`ivreg2_cmd'" + ereturn local cmdline "`cmdline'" + if "`eform'"!="" { + local efopt "eform(`eform')" + } + if "`level'"!="" { + local levopt "level(`level')" + } + if "`nooutput'"=="" { + if "`e(xtmodel)'"=="fd" { + version `ver' : `ivreg2_cmd', `first' `ffirst' `rf' `noheader' `nofooter' `plus' `levopt' `efopt' `dropfirst' `droprf' + } + else { +* ivreg2 F stat looks in df_m, not df_b, for F dof + local temp_df_m = e(df_m) + ereturn scalar df_m=e(df_b) + version `ver' : `ivreg2_cmd', `first' `ffirst' `rf' `noheader' `nofooter' `plus' `levopt' `efopt' `dropfirst' `droprf' + ereturn scalar df_m=`temp_df_m' + } + } + if "`dropfirst'" != "" { + local firsteqs "`e(firsteqs)'" + foreach eqname of local firsteqs { + capture estimates drop `eqname' + } + ereturn local firsteqs + } + if "`droprf'" != "" { + local eqname "`e(rfeq)'" + capture estimates drop `eqname' + ereturn local rfeq + } + ereturn local cmd "xtivreg2" +* End display block + +end + +********************************************************************** + +* Taken from ivreg2 +program define Disp + version 8.2 + syntax [anything] [, _col(integer 15) ] + local len = 80-`_col'+1 + local piece : piece 1 `len' of `"`anything'"' + local i 1 + while "`piece'" != "" { + di in gr _col(`_col') "`first'`piece'" + local i = `i' + 1 + local piece : piece `i' `len' of `"`anything'"' + } + if `i'==1 { + di + } +end + +program define IsStop, sclass + /* sic, must do tests one-at-a-time, + * 0, may be very large */ + if `"`0'"' == "[" { + sret local stop 1 + exit + } + if `"`0'"' == "," { + sret local stop 1 + exit + } + if `"`0'"' == "if" { + sret local stop 1 + exit + } +* per official ivreg 5.1.3 + if substr(`"`0'"',1,3) == "if(" { + sret local stop 1 + exit + } + if `"`0'"' == "in" { + sret local stop 1 + exit + } + if `"`0'"' == "" { + sret local stop 1 + exit + } + else sret local stop 0 +end + +exit diff --git a/data/ado/x/xtivreg2.hlp b/data/ado/x/xtivreg2.hlp new file mode 100644 index 0000000..6aafa0e --- /dev/null +++ b/data/ado/x/xtivreg2.hlp @@ -0,0 +1,250 @@ +{smcl} +{* 5 Feb 2010}{...} +{hline} +help for {hi:xtivreg2} +{hline} + +{title:Extended IV/2SLS, GMM and AC/HAC, LIML and k-class regression for panel data models} + +{p 4}Full syntax, fixed effects and first differences models + +{p 8 14}{cmd:xtivreg2} {it:depvar} [{it:varlist1}] +{cmd:(}{it:varlist2}{cmd:=}{it:varlist_iv}{cmd:)} [{it:weight}] +[{cmd:if} {it:exp}] +{bind:[{cmd:in} {it:range}] {cmd:, {{cmd:fe} | {cmd:fd}}} } +{bind:[{cmdab:i:var(}{it:varname}{cmd:)} {cmdab:t:var(}{it:varname}{cmd:)}} +{cmd:gmm} +{cmd:bw(}{it:#}{cmd:)} +{cmd:kernel(}{it:string}{cmd:)} +{cmd:liml} +{cmd:fuller(}{it:#}{cmd:)} +{cmd:kclass(}{it:#}{cmd:)} +{cmd:coviv} +{cmd:cue} +{cmd:cueinit}{cmd:(}{it:matrix}{cmd:)} +{cmdab:cueopt:ions}{cmd:(}{it:string}{cmd:)} +{cmdab:r:obust} +{cmdab:cl:uster}{cmd:(}{it:varlist}{cmd:)} +{cmd:orthog(}{it:varlist_ex}{cmd:)} +{cmd:endog(}{it:varlist_en}{cmd:)} +{cmdab:red:undant(}{it:varlist_ex}{cmd:)} +{cmd:fwl(}{it:varlist}{cmd:)} +{cmdab:sm:all} +{cmdab:noc:onstant} +{cmd:first} {cmd:ffirst} {cmd:savefirst} {cmdab:savefp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:rf} {cmd:saverf} {cmdab:saverfp:refix}{cmd:(}{it:prefix}{cmd:)} +{cmd:nocollin} {cmd:noid} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{bind:{cmd:plus} ]} + +{p 4}Replay syntax + +{p 8 14}{cmd:xtivreg2} +{bind:[{cmd:,} {cmd:first}} +{cmd:ffirst} {cmd:rf} +{cmdab:l:evel}{cmd:(}{it:#}{cmd:)} +{cmdab:nohe:ader} +{cmdab:nofo:oter} +{cmdab:ef:orm}{cmd:(}{it:string}{cmd:)} +{cmdab:dep:name}{cmd:(}{it:varname}{cmd:)} +{cmd:plus} ]} + +{p 4}Version syntax + +{p 8 14}{cmd:xtivreg2}, {cmd:version} + + +{p}{cmd:xtivreg2} may be used with time-series or panel data, +in which case the data can be {cmd:tsset} +before using {cmd:xtivreg2}; see help {help tsset}. + +{p}All {it:varlists} may contain time-series operators; +see help {help varlist}. + +{p}{cmd:aweight}s, {cmd:fweight}s, {cmd:iweight}s and {cmd:pweight}s +are allowed; see help {help weights}. + +{p}The syntax of {help predict} following {cmd:xtivreg2} is + +{p 8 16}{cmd:predict} [{it:type}] {it:newvarname} [{cmd:if} {it:exp}] +[{cmd:in} {it:range}] [{cmd:,} {it:statistic}] + +{p}For the fixed-effects estimator, {it:statistic} is + +{p 8 23}{cmd:e}{space 11}v_it, the idiosyncratic component of the error term{p_end} + +{p}and is available only for the estimation sample. + +{p}For the first-differences estimator, {it:statistic} is + +{p 8 23}{cmd:e}{space 11}v_it - v_it-1, the first-differenced idiosyncratic component{p_end} +{p 8 23}{cmd:xb}{space 10}(X_it - X_it-1)*b_hat, the fitted values{p_end} + +{p}and are available in and out of sample. +Use {cmd:e(sample)} if wanted only for the estimation sample. + + +{title:Description} + +{p}{cmd:xtivreg2} implements IV/GMM estimation +of the fixed-effects and first-differences panel data models +with possibly endogenous regressors. +It is essentially a wrapper for {cmd:ivreg2}, +which must be installed for {cmd:xtivreg2} to run +(version 2.1.11 or above of {cmd:ivreg2} is required for Stata 9; +Stata 8.2 requires {cmd:ivreg28}). +{cmd:xtivreg2} supports all the estimation and reporting +options of {cmd:ivreg2}; +see help {help ivreg2} for full descriptions and examples. +In particular, all the statistics available with {cmd:ivreg2} +(heteroskedastic, cluster- and +autocorrelation-robust covariance matrix and standard errors, +overidentification and orthogonality tests, +first-stage and weak/underidentification statistics, etc.) +are also supported by {cmd:xtivreg2} and will be reported +with any degrees-of-freedom adjustments +required for a panel data estimation. + +{p}The degrees-of-freedom adjustments depend on +whether the estimation is fixed-effects or first-differences, +and whether it uses the {cmd:cluster} option. + +{p}For fixed-effects estimation without {cmd:cluster}, +the covariance matrix +and regression statistics +(identification and overidentification statistics, +first-stage regressions and tests, etc.) +are adjusted for the number of fixed effects N_g. +With large-sample statistics, +the covariance matrix has the adjustment (N-N_g); +with small-sample statistics, +the adjustment is (N-N_g-K), +where K is the number of regressors. + +{p}For fixed-effects estimation with {cmd:cluster}, +{cmd:xtivreg2} makes {it:no} degrees-of-freedom adjustment +for the number of fixed effects. +This follows the formulation of a cluster-robust covariance matrix +for the fixed-effects model as originally proposed by Arellano (1987); +see, e.g., Wooldridge (2002), p. 275. +Stata's official {cmd:xtivreg}, {cmd:xtreg} and {cmd:areg} +(as of version 9.1, October 2005), +by contrast, use the (N-N_g-K) adjustment, +which is somewhat conservative in this context. +{it:However}, the approach used by {cmd:xtivreg2} +requires that no panel overlaps more than one cluster. +That is, either the panel variable is identical to the cluster variable, +or panels are uniquely assigned to clusters. +If any panel is contained in more than one cluster, +the {cmd:xtivreg2} approach is invalid, and it will exit with an error. + +{p}First-differences estimation makes +no degrees-of-freedom adjustment, +irrespective of whether {cmd:cluster} is used. + +{p}Other features of {cmd:xtivreg2} +and differences vs. official {cmd:xtivreg}: + +{p 3 3}{cmd:xtivreg2} supports only the fixed effects +and the first-differences panel models; +the option {cmd:fe} or {cmd:fd} is required. +GLS random effects is not supported. + +{p 3 3}{cmd:xtivreg2} does not estimate or report a constant +with the fixed effects model {cmd:fe}. + +{p 3 3}If {cmd:ivreg2} version 3.0 or later is installed, +{cmd:xtivreg2} supports 2-way clustering; +see help {help ivreg2} for details. + +{p 3 3}First-differences estimation with {cmd:xtivreg2} +yields estimates identical to {cmd:ivreg2} when the latter +is supplied with all variables +expressed in first-differences. + +{p 3 3}{cmd:xtivreg2} allows use of time series operators. + +{p 3 3}For fixed-effects estimation, +the data must either be {cmd:tsset}, +the panel id variable set with {cmd:iis}, +or the panel id variable supplied to {cmd:xtivreg2} +with the {cmd:ivar} option. +For first-differences estimation, +the data must be {cmd:tsset}. + +{p 3 3}{cmd:xtivreg2} supports all types of weights. + +{p 3 3}The R-squared reported by {cmd:xtivreg2} +for the fixed-effects estimation +is the "within R-squared" obtained by estimating +the equation in mean-deviation form. + +{p 3 3}{cmd:xtivreg2} supports simple fixed effects +and first-differences estimation +with no endogeneous variables, +i.e., {cmd:(}{it:varlist2}{cmd:=}{it:varlist_iv}{cmd:)} +can be omitted. + + +{title:Examples} + +{p 8 12}{stata "use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta" : . use http://fmwww.bc.edu/ec-p/data/macro/abdata.dta }{p_end} +{p 8 12}(Layard & Nickell, Unemployment in Britain, Economica 53, 1986, from Ox dist) + +{p 8 12}{stata "tsset id year" :. tsset id year} + +{col 0}({cmd:xtivreg} vs. {cmd:xtivreg2}, fixed effects) + +{p 8 12}{stata "xtivreg2 ys k (n=l2.n l3.n), fe small" : . xtivreg2 ys k (n=l2.n l3.n), fe small} + +{p 8 12}{stata "xtivreg ys k (n=l2.n l3.n), fe small" : . xtivreg ys k (n=l2.n l3.n), fe small} + +{col 0}({cmd:xtivreg2} vs. {cmd:ivreg2} vs. {cmd:xtivreg}, first-differences) + +{p 8 12}{stata "xtivreg2 ys k (n=l.n l2.n), fd small first" : . xtivreg2 ys k (n=l.n l2.n), fd small first} + +{p 8 12}{stata "ivreg2 d.ys d.k (d.n=ld.n l2d.n), small first" : . ivreg2 d.ys d.k (d.n=ld.n ld2.n), small first} + +{p 8 12}{stata "xtivreg ys k (n=l.n l2.n), fd small" : . xtivreg ys k (n=l.n l2.n), fd small} + + +{title:Citation of xtivreg2} + +{p}{cmd:xtivreg2} is not an official Stata command. It is a free contribution +to the research community, like a paper. Please cite it as such: {p_end} + +{phang}Schaffer, M.E., 2010. +xtivreg2: Stata module to perform extended IV/2SLS, GMM and AC/HAC, LIML and k-class regression +for panel data models. +{browse "http://ideas.repec.org/c/boc/bocode/s456501.html":http://ideas.repec.org/c/boc/bocode/s456501.html}{p_end} + + +{title:References} + +{p 0 4}Arellano, M. 1987. Computing Robust Standard Errors for Within-Groups Estimators. +Oxford Bulletin of Economics and Statistics, Vol. 49, pp. 431-34. + +{p 0 4}Baum, C.F., Schaffer, M.E., and Stillman, S. 2003. Instrumental Variables and GMM: +Estimation and Testing. The Stata Journal, Vol. 3, No. 1, pp. 1-31. +Unpublished working paper version: +Boston College Department of Economics Working Paper No 545. http://fmwww.bc.edu/ec-p/WP545.pdf + +{p 0 4}Wooldridge, J.M. 2002. Econometric Analysis of Cross Section and Panel Data. +Cambridge, MA: MIT Press. + + +{title:Author} + + Mark E Schaffer, Heriot-Watt University, UK + m.e.schaffer@hw.ac.uk + + +{title:Also see} + +{p 0 19}On-line: help for {help ivreg2}, {help overid}, {help ivendog}, {help ivhettest}, +{help ivreset}, {help xtoverid}, {help condivreg} (if installed) +{p_end} diff --git a/data/ado/x/xtivreg2_p.ado b/data/ado/x/xtivreg2_p.ado new file mode 100644 index 0000000..9ce5880 --- /dev/null +++ b/data/ado/x/xtivreg2_p.ado @@ -0,0 +1,95 @@ +*! xtivreg2_p version 1.0.3 5July2012 +program define xtivreg2_p, sortpreserve + version 8.2 + syntax newvarname [if] [in] , [E XB U UE XBU] + +* Does not currently support previous estimation using fwl or partial + if "`e(fwlcons)'" != "" | (e(partial_ct)>0 & e(partial_ct)<.) { +di in r "predict not supported after xtivreg2 with partialling-out option" + error 499 + } + +* Uses [if] [in] as well as limiting to e(sample) + tempname touse esample + mark `touse' `if' `in' + +* Sorting disturbs existing sort if xtset so sort only when actually needed + qui xtset + local notxtset = ("`r(panelvar)'" == "" | "`r(timevar)'" == "") + + if "`e(xtmodel)'"=="fd" { + if `notxtset' { + sort `e(ivar)' `e(tvar)' + } + + if "`u'`ue'`xbu'" != "" { + di as err "`u'`ue'`xbu' not supported for fd model" + exit 198 + } + if "`xb'" ~= "" { + markout `touse' + _predict `typlist' `varlist' if `touse' + } + else { +* Default to e + tempname xb + markout `touse' + qui _predict double `xb' if `touse' + gen `typlist' `varlist'=d.`e(depvar)'-`xb' if `touse' + } + } + else if "`e(xtmodel)'"=="fe" { + + if "`xb'`u'`ue'`xbu'" != "" { + di as err "`xb'`u'`ue'`xbu' not currently supported by -xtivreg2-" + exit 198 + } + + qui if "`e'"!="" { + gen byte `esample' = e(sample) + markout `touse' `esample' + if `notxtset' { + sort `e(ivar)' `e(tvar)' + } +* Need to strip out time series operators + local lhs "`e(depvar)'" + tsrevar `lhs', substitute + local lhs_t "`r(varlist)'" + local rhs : colnames(e(b)) + tsrevar `rhs', substitute + local rhs_t "`r(varlist)'" + + sort `e(ivar)' `esample' + local allvars "`lhs_t' `rhs_t'" +* Demeaning block. Uses entire estimatation sample + foreach var of local allvars { + tempname `var'_m `var'_dm + by `e(ivar)' `esample' : gen double ``var'_m'=sum(`var')/_N if `esample' + by `e(ivar)' `esample' : replace ``var'_m'=``var'_m'[_N] if `esample' & _n<_N + sum `var' if `esample', meanonly + by `e(ivar)' `esample' : gen double ``var'_dm'=`var'-``var'_m'[_N] if `esample' + local allvars_dm "`allvars_dm' ``var'_dm'" + } + + tokenize `allvars_dm' + local lhs_dm "`1'" + mac shift + local rhs_dm "`*'" + + sort `e(ivar)' `e(tvar)' + tempname b + mat `b'=e(b) + mat colnames `b' = `rhs_dm' + + tempvar fitted + mat score double `fitted' = `b' if `touse' + gen `typlist' `varlist'= `lhs_dm' - `fitted' + } + } + +end + +* Version notes +* 1.0.1 Fixed sort bug - forcing sort would disturb ts operators if tsset +* 1.0.2 Changed trap for partialling-out so that fwl (old) or partial (new) are trapped +* 1.0.3 Changed calls from tsset to xtset to accommodate panels with no time-series dimension diff --git a/out/Graphsfig4.gph b/out/Graphsfig4.gph index 47c5562f86085d64f269c9641256a46a19083400..d54a41a2db1355679d92c73351bd6e7944bce1e9 100644 GIT binary patch delta 262 zcmcb2p7Gv!#tp2DEJjwQrjt1t@3R@1rI;ioZ+^$v%FdioZiKzxj z7MuSGw1An$7L(sG7Hs}5ACAX)>=uB#WhCk^xY_V=}LzC`)3p zrNv~$C^4uyN5xX8C6o6kDzgCXFxVVpH;-p?qn-&L$Q>q=ts>6?b&9Z=nH!{<8%$nc zD+)H*Ua^t|5)#k#KTxI}mtxuHz delta 268 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 OpMtEa%rhxd|NjRVfytc! literal 114042 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 z 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 diff --git a/out/Graphsfig5a.gph b/out/Graphsfig5a.gph index 210bc596a6d774e38520458298d88a3761965443..7c5fda21a430fc061f8c2a9c65dca2b09f25b2f1 100644 GIT binary patch delta 2442 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 delta 2455 zcmYk;dsI_L9tUvpD2ObgVu1iDfrQY2u#tm=mtaPUREx0qC=qlC2!=&O7Elav!=nO4 z6lFpT7|?(fR(X~xU9>8!U_mQb*-BYy*`-}Xwk)t#N}-QCbI-{%e|_ec@62y9XL8S- zR86YddYNo-fVUX-Gl$s{Nn$dbGTYGcIm?>OmM16scTAZzTe2knl8&m^@3PcKJnN@s z!XDf)p+2PnjFyEs+HoRcwfZB!pAXaZ^mbBD&nDKet{XG#AX4v&Aa$*3<29Klz0R!) zoQcGZnSUdj$jc^9izgG@zO6HE)HG*a+;DJ!nwu9gnNM7L0b1F6!QJ-Z-qpRQExzIO zqUEKVl1)lRd9(8DvpJN_BQY*d%IP0WlYNlgI!cvCw=)9 zv~ckHePglZr_IY9ROzmCzcsPG_r>_r;t#3%r&9j72E%WI>? zBhu2RplSMQE7UlMtp5DLPlnNTI;zeF9VyH3p@Xx9o0=)thZIt^b@0Cq9Jt2O&S}p+ zruvK_hN|&^yfL{d@<-YQYeMGwHpyVPqbT*J|FPjGaTy^dChGws+|*nin2Fsfy?M8D ztBSH881>lmT`coBcICMC&HCb8%0ZwrxH?KVpM$L(7`)cpeFFQP4`qy;uSzI~0uc0{ z$QsL&l*8eWBL`Y??X2xrRE65^gj8)8XtJ4m;kT{=^0*==?(=kdfWO|?3TU9&Bv;>*!2rri%Rln^Eu(gvT5{# zvp|(_aoA@JEtCT;PE2mIEU(0N|B^K-=2c*S+Z62`x(dzB0kiI3`?F5bdEW=A_q}@P zy47+-s|c(?jaA@QWJKQ=MQE}L9M`?d+}DemsX#ZUF!1fisDTPpC0^R7TXB|h9$1n+ zzwJ?W4tu#-aA(Q>T!j-?op>+Bn;Dsp%Oy?eX_<3n*yl&a?HId?u|bAaU;K$u$^{@W z`tR{dy#_nuOy$tTE0iw)yx{c9b+}alm{Ei|@fheL6@aUE-jG{9D#t!H$hTd5T!bCD z_mkV(=86T>;61SXBrR}k0d1lPtX^E{ch(FwE&^VmIRUKMbMPUxQQHrmD;{^FgD3)@ zSx9rtcNJo%+e(hN`Jpo@0xl&tZYtgBIx`zIMCYMHECG&=pD#~;gf?9QVmH>i=WnJR z6P*%k;G-K<0%j9z|6L|R>r;7?WHauT3)oKi>H2|A4I2&MAs%PT9BUz16owAI6gcga z*I67v*Q*TNKK1U##Uj+O4D?;`{Zm*xx?W{KUt9otxq58th#lRg3pG&3`3{j7Ku(i%3Scm$*L(XJDfX7c%&EYO%`~x!<*;+n@t0Jc;*5 z5a;F+2Z@M}dJub5{?*e1KbLgizMfb$KXz==5j}INLC=2Sd8gMdV=o=RM$epTFcMF` z2uvfcmJz2ekc9+?rhm-yYNF=q!S5cuFxuNErK=~Ku1iK0MpyKcOzaf#dJg=BZ<7Fp zWVr|jV&#bdRzYEuiMxq(JUJ@+^I>L0A= zGihg{A}K8?n77?mOnu~XDkB!Jg#VJPgEhjfuc0@rL^vgM!Eaa4%1wY@u6*5Y*wC+G Ivzw0n3OTc$Q~&?~ diff --git a/out/Graphsfig6.png b/out/Graphsfig6.png index 913073126cbe950a15f4307f6d381cfd0ddee6d0..f2a3d18d408c2039017680297af3388bd9d0e9c4 100644 GIT binary patch literal 150809 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 z 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 literal 378291 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∨GWjeHO}jH?sa5o6rjT#N4Zk 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�zt!c6@Gs4y`a%96{^gs0TX2_R=9N<}fiuaaoI^5f%|lcdNCsg~Jf&Fe zHC+DP3Dp$h)zo=Mg?}l2DZh{mvW;rb@ZZi0xzke1_gE-?DK5zl%Gu;M>JP{cnnzfX ze#Cpq5tMf+=TMvzpQ-i`&Lo%cqkKR;E5$y|qxhg)M===DKz_y>`HlJw;xl1NaY^}w zbfFwe{vcfF>_WXBag8`hW27JPl>9-lPqtBwqIypFQO`i}OZkO-P8=s+(iwtyN;=bi z#4FN;>MHf)}}~=EU%QWD34QY(LCZBjgdbnwx}PnbuH!W z5%%(#C*nBiOnnLUK9v8c7oa*wKBqpLu&4MX3@Gms59o|d`%&yuY!N4kyR?@4VJi;^ zQ}Pjwk>5xzVMY0w@-D?R#RBD1sxxE<`J8kn{V4Vc7m`8oOJl?#@*Cw-%DaRq`HkX; z@-xXGtZ0mUMDr-WP+g!JPrV-bgX$&ugY2bTM?NB)={!T&Q!hYVBmAg#Q_dj{QH~`} z683~M`GYW}+CyLQ4LVPCdiC0uVh%Y3AuqXX!Kf;P?3gr#r0m-1ggwEJhSIOrzMr*0(B7aam zAlt}CWt^>Q!43(d&OLpCfwciGYg?IFg)PG&T-Obgloi-TRqm#katf_NomyYJG z{heGp28WvGIJ>&JdANI)@^JGg>E-2B+SAMY8{h8wZ%VnB_HZv-res-9k5cZQ9%aqH zF$4trYRg<)3p=@X@{jZ=^~DdRKmFkE8);}4rdg2i>jbEDli~r926q3mY5&}m;w4=@ zyxhvTd6f1nRmQ!nTUn1!ws^RDm2!70>E-6(=~lL+mxuP7|C6?S;f~MFvbLz~-}$Dv zr>lD@4=?wUUM0WHuBF|)Jj!@^mUJsws!W+OrT>Qva_wdaZWk2k6C7ai zoKD|(a>mmhIUZ&2vl7ixj<4Fc`@Jgj0m9_6dOJ7db7$;qU> z)|i&YRCL7c8EHmFt7jiS`ZOw)#9JG$a4Ma5ukGD7N3IV0H2;2=`P&!%`g5ixzlW*m zEmi;7kCL0Zmv3$KcrdESs~%yh+=f2Y^6g1(I`i{TW7eBXUNtKjrp~3?o^;-{;$mFIG{`Xbvgk&39Hw;y24^|kyux@fwraniE&l=QPV!ytl zT3(=cy(0ONn+m>5YOFJ7T(iKq5LNe=E#EDDo6J-(#h6NOf4#qDc##nG$K|&til0oT z@0ToDz4M*Rbx?!KlpDWdQ8H86Of4%#m8Gsl2+Pk zTvzX|Yxx@iYGR^pK4q>s>bl%-IC|>5TK=kJoAr4%uXogSvEY4t)61LXM>(3JlcZAF zmbZy+kj77S%vfsvHiM%nr0ATAUETXe9+>H;oH|Dasfv!K1`n!iAAWs(_g%02)Plon zitNbXXbO5)*VuG>l1G&?`m1U#&mUHKnAGIC#DCl6eH~7ef9I#J5AayAdskA^ftLfe zXN~)#z~+U1s?W8~ooh@@YHIATT&3~-`TnMyekyzURVDX_C)I6hb7R?@*mQns4Ady_=Bz1JiBQFoJdSIyFp23=>p8~pzb{Xpe@j<&pl$ITC;KKb z)$yOF5|vrIp?hc#6}UBIz>m%1*S;-wC@l1KFXfPBY4x+NNla~qudej-fam3tH0`5i zMLck9o-~QhwLQ}_jmlNMpQ?DQ$iWL&5}RuFDr_86q(ZV3b$(G7i?kona$RCm+P&T? zPf+`m`^)xM-3BlE;mU}_Ca>~Yj9r_~p3)@40F~j!A8C975}Sth3N>b^@glZtgsp{ZJ<&pT-?kR_VRXZIGGlDxim})hv zTp{abuip8_3{yV-zqfr*D}HS5nY_VIPYqY^x8Ka$(K&u?%3l**OcggmP0p6@_T$%y zOt-g9HU@2c>UKHtDCO1FZ$YPHiA+ViKG?p=|53-5e~eP6PRtH|Hb0S$^P6F@V}>sr ztvVIIUNo{#{JfaL^AG({Ym7?utMlWRO%j>3n9kg{|Dv{M$Ed}(d{%ZVp2$>X*ED56 zs9oBs^~b83-ZR7BBu=E`x3YW_hgYk|s#{a9diJ_(uk)qA+`4^x*hi^fUgv!MevQ4Z zpU;*$gN~GoQn?zp-qdHfy(z`3{o7j&Y?Sd?n<%wq`Ltek{`NXIoa6jT-0c{pnmb*t z*uR{;>4AL???o=XPc3a1rCu7c+a*pHzu!xT8TM7bk5W-Pe%d+co}I39_52YBql2SV ziJVggI_|JDUCBAtc)LU{mpKtp>Tvf9HGcgqeqLsuQw5g>M5*A@S(2ydWT(gZ#Z^&z z<0?d{q;Aa*ji_m-$Cj&0E5|AC$Evx*Cyh*<+s+g>eT^~g&Jy>2o;z0cJ-TeB^P`VO z4d*B4m;ChM#8|a)P_g{^r+qYPazD;U_h$Rku_~s*l7)rpel(7Ec&<{N>fHHAwkTEP zMd9K_-^LlWJlUc1py9_3M=Ad$3s<==iZh<=oYcETNvBR3$Ba|c{0ez_G>jdRO%D?RoV3)^!>UHDC=4MyNRmi(7C%R7(N)a z*w0v_T-v#nC#ilaZ!PZ(AB@6V;$5I1FtdbTWg z!bJh~M3R3Vcwz`r%e{)h{b2KJ_X8)~Myg98ohbMK}9hZElyb zi~s#MMlC0%4zHOkPslv=JlFU)fs^0p{H4&<^~R{>#3QEh>z}M% zpbR6&CJKEWYt(YdqF1&1jo-Xb&8U`UNay*nx*b)z4t!vjb+J14Zd8gcO=68&-O6$# zyj{}YmZ&sqQjO`JI9A{9yQGh9Om|$SYPTPeq4%2C`n;sudj`3WU9S4)Nin&v-)o~* zkA~!LeCJ2^m1@iRUvmyf`&!reWa20NHf3C;UW`sQXRzs&j!UKwv;ovo!|JX-qZCeZT|jcek=OYcyWi5_vG9&POdDmQPsI*w{7ah z7dl^(1ecptt@9=|AgXWWnZLf!eIDGkd%Cs9(qu zc0bpdfA_gQFWl*9jRp0$Dc6nfjxL(`+^FRUk2|@0gmu}j+J*IOysY|jox5#QRaxFA z!l-5yd~S@qnUfC*Vytuc0WsDvR4-;M3lVsLTwQX~F=uV#) zW6rbhwxzgsxMbBFyVR@BG0*m-j?sNIVMeWyuV(I2B?@=yc3|66ozH_a|6bZyeYXmV ze*Erm$Wx<74S(f3`$4-a(Yw{`Ngewg&;C^B)!-3!xuZtyQR}9kPrh)%6Jx}H<7&sN zOGQov?Nu%*&!$`P{IR~@w1Z1>)vd5kP3?Iq`}&5Db*#ER+Wzis;{7W1z2o_}t$3vK zuVs$oeb*h@uYPHEwD|5+kM#W#M{Zm&Z`1+xV$UJ3LmeLKu`sk{<@`fyA5`r;52%v| z9_aa{OOK{+O=%CQi*xqYx=`qWzF(!APbTL!|5Nbw((Y~;J?OrURiTeZb5wkISeg3n z`04J=d-~Y&_N9kRKXycwe7xQNapimZ+6w(|j4rVBsG8quYskx)f9Uga?@PY)&G=&~ z>!D3u-ha4jEFJg6n0#K>?Iy3|YDC!$eH>cdHEKP`jtoDYnflvt^>M-4Ax@j`=p1j8 zVqt+c&yK6`OsmJF&2q=6)zvVET?e0cJfUt6TroLI*V{(DmueYP{KB0Rs`>M!b8?@) zrSo~t!k{vb>z`DId>1b%=yA)a)y8@)e1{}nc~Vt6zF=+fF*l7L$GUqL$#$sM&Jw58 zs!H>=c|N{j)N0C%!{w$|Tz*RBUp8lN`R{KSwVYjYN0l7kmpH8^WuJAd%Hr!rt*^7o z_Pom3xu=!Wu<7S(C%dk5WIC@51JK}a`#n5Yd z%v>ztKK(<}vugL^qIb7dyK21Yo8J54i|cbj&Yx9_h7^2r$nJ_!>ra2Q>yRfpgcn6;U}y&Of?e)a`AVe%Xw2YtO6ZxiXh{<$1xV^^=vBuFd}8 z`wOb#yR?-P$DGrBUbm6SAw$dsmG^wg#_5)w)$Pq#B6fSqB^Q{DF+`ACtYI>(2vu2X+>y{qc*?h~`` z%{ip=Wk!$C7lyr8)ucZA_9V%Ez?du7S!3+=wFjS-zoz`kY`d3d++L&B|M`r3-*3;% zYpVFO)u}3_*sXKOqi}LlY|J$kyJVsJPXl%spEPv#9yI+&|A>syYVe^7OCG-3X4K9B z_U^Arwl5m3awwPQ`R{Jj@q4(gb2^7w(Q5VT^yOQhTcgMR^)#_Jer_49#(W=_r0D2n zdJO*1sB_6D?W5J!l4mAN4V$amJ38~ktEGBIt7D~_*Ud63O1C3?|BwuxL!;HKZ8Pf! zKW(8jUs}#X1B!p&rNGq*O3QT<7Ek%P#*k<=vBa?=b5hS!-p6v8cD=uSCtdGo)xK8j z6nEDZN~?KE2L04_bx^dLxpK^)==p1vR(}uYYWHH{578=l#d#GMuHU4z`1p`~MUgXJ z(JJD=rk7!Rw<|5)jvJ~x`96QNdQ#->+3XK?sB-znE05LbI#o^|t@3w{S^Y75x6gLYr(Yn<*%q2nU@xL9(`8Vubsoe#a)hFR-4MLN`E{5d8PGN zEeo$0w>jvtI^BA`{kfnEI)3?vj6HVh{U!CJ-Ul+JwQOy=Eg|3Cy{NqJAKWyf`&Fg&YcYprj?3NW zqH3Ay_<}K8ujxAP?)m$@)tN4;^1t1$Q@LNX()icRjPSzn)iNS6>t? zknE<;jq1tjR{F8VdG$W*bBwa&Aw!|T`Q)UWn$Gi3h$meTr{QwM4U4%>cC zWg7QBMViOAbp6V{>3ppHkaKEo{*Q^0kGZYuH@VxWf^~j6r`*=tzqR+cqqOt%t?CZ7 zQ{_IVw$)4=^Y+vorPbdBJ4&~0dGoBQb0O&;&%4}JTK&zvf7g&rzn@j-+9$vEF!LWu z>pQ1*OB(u1*jW|uKE>JFoBq)GGI(*9F$asCRWTz|AGzA{o+@&)zjDu1tkKk4XH=iu zX?LIda8Kv1?}G0uZXa<*rC61I%ki1_b$eg$KI8T#-x>8=l}xJ-RDPiQyvggP{rB!X ztqPpZvS{bc2TH4}1*2yUywvuzT5ZTaYs;XA`n;BQk$ZyTPAT;|=cKiT9_ew}=fl=9 z6{nn1hle_kT6W-(($2Lf`^MIpUh$M_kuBe#`5hjsX>;GH`%6277e0AX-C0tg_smpJ zbPNt=7=PkS>ys*?qD#bYE1oE=j}5BvOJK|UCse<78Q1N1d8%`5W9!HaNkUGjnky%| z?dkDUX+5D&+ssEw+&ZpOzsbCG$HAxi+IohU!|t{{uFh1RTxfgt7~SWgCwksIz3G^m zHZ0rR%^@*L>uI8j-P`-ik)z80)YM!Xw#CHrulnNWJ5C=_MRMevvL^L2rJZ|zJ2unt zN{S;YCSXR!l|IjOf6RP!Fl<+$!)oKQ++&xne5Uihr{})84ZRPkzOQDbTx9=TX}#mF z-e+UR_dBR+sJuhxHF~bJ+URq}ZF8HW2UMz|a~CR(Zdgnsxr$Db-)-aWu5xvr3D`?o)n#g}P3f_(I2}R-={~oe%9*g_kUh z8F%-Ej={E^nTMWyxJNyGUby3!GB0(1_*{+M>5ylS+E8K1A0vK!skFX*{Dy8tQv2*y zeFhZ^`1RsTJ!Ya>#3edAewV6#blJ5*MPKPY>hbn)$+%-XRm#jITK4b#O6SnQk&ma< zH}`+1d{&)drHdD7c{`*!uD|GM3s(#Gokz2kO7g-qP0)*tfn?&ue*v_9f> zwMGpt)Z40l&aiPy@S0dX_V@Yt&zg{Ni>lVTZ0W$nZwelfsb2YaIyX{{-v1>1$2F?=+^Xs8jCiNlg}Os$rMy>hjjH-^_oy0I-swCY9-j4R ziBYSSQ>hwGRbAgJt&a%rv^LYt-K*4zpZ5(?ec$W4R7yOdL)qsm)o*)i*;hFJUY*R7 z$h&0H#JvNntyDhW9qe5u&j%fY*@IuFi3(bw3O27B>lyw*z5KA)Siv{btP>-at4FgA zN4W3$ptN3~@YQ~)KHgcT*50f4qG5hB!U1{js=W-Br_; zsw%x2+$p#|PLCs}@mbe4xW7at-+jV2pW{b8j%sb66tJ%35_LRf<14wFe^gozqRtga zSGDP4HL1zz<~bI9)a?!bwcq(t!xyPGGn$;v^7f<7gDQP*R?B;Np^A!luwYmLJ8#YB zi>5W3m^uAI^)mC)+sS^g^VaJ5sMr^`vbir%&9{c+8`9OzTdTi|D|$M;^PR7@v@PzN zWTu_BmQUaMsIntR&QrOPJf1ONpPjdcRqC*7nJdirUH!6X`DOd3cHUauUpe1y*AFM> zs$2EKvh~YiugiU)9w+v7nX76(E73g8+umD?>GiIydKZ~KM=hTCbVBc7dvC4IRJ}K- z@RBNXRI2i;PQ4v#@2%DIcCK4qO@A<3b-LC$ZI8|N-dc@Xm;QAxg&uO-K7#>V2ok zWZ|t6>2fRN>2?3ioEgd|W2qWX2PX2?>guplwOdrmI$iDD^m0JxvP9lm{kWUzm(x>M zOjQNitl#nQOd@Zs4lZ=9(t2Z&DQakZCE3Rfutm~Y7%AEE?^Nv-s3iN)|s!C!VmuI)%Y(HFijB+?wq3EUdiM_QmVzoVM z%I%soN(F{~2x>7dv2I6U=Rqk({W3xwNVk3dxh;vkwc0rCa=WK*yoae`8~WU8ax1a7 zR^xwr+wxx0vqRMAmMZV*lu5j``mn^*pUVwI0*YTl(NoKy;^IBSy^*pUVwI0)W zZ#|~t7X<}DYmrU%z7T#K{=LU=33hCysh^mu4(5U>v^;v zVL)+iYo4U|pgd0cQLIvpB45%N`I30Aor$fnx^gs1jE$_{R``5tuH+)`zAyh!#O3oY zrHs}xXzh+uqos_#E5z8T%$bFLB~00cT*q5W#n{~=kwO=;?d8k@V&3G}&O(>`Sy~Di zuKoYmYHjbeSeeIZ?Befpgl#*scNJr#^O0R%VjkIh|8;<{?P=ZWV(h^mi^LeoSYPy* zz=g0PJ4lyWN`CsriGnAEZNwqs?wQJtV(o*bX-w8WBAyb5NEhN??178|zb?l&iuy~u zztQBnSW7;lcsn?`hOn1nhUSqjgdgok{&?1~zp&%{=*2=m;=!%HC&XIPZ{@kif`5Ce z2MQS!Tf}kuF^5G=6DJ7+nnyW;;^=gPokHi7Wkw2J?uOKYA@AV;uYykSdot? z-YBL?=S!QW2waFmlMwDF@&S!etWsY>IhJY^ z#WeYs@-xNTk-PT<52$~p{($&Q*pn}*9#L&1-V+ZfHxZv{E!BAP5%nNsFU2M0Fp3X4 z3sJ06U7%VPQ(>6Mbu>mgQ|+d_OFW?ZLGeK~nQ|w^CGmAbex_PRyr=jjo)Yg##-k6jMa)Ed z-xFgLtAxSvv=>E=rM09poolIXQO>4w0Ob;jbBaNdOMD@mDId@ohvJ;_3-!;`3sByr z{)KWeah!Za7?6Ld&ml~S<76*!m(H-Z_AivzC`V9lLHUn-NpVi`OL0W{QGZYP(L9Rt z_TOg^IW{P7elbS+QO`h}BtFwT;wkkYWE<5KTl*p68u^G~hT@!fPdv4?-z8lrmyj-$ zPbsFUc2lfUZ6p~qk79=U1Ipuc-%jyHb&K?)o`GVY&gaAz;s)g*!k)&+Ueb@aMrRjV zOL0jtLorA-kIp32*HNvYnry3&DF2adboL`VD2|AebT>!65Al!UmudxJPx=w2gbU3h zjuUrj9`&|VXDGi=jvyY8&J-Vn3-t^XZxl0hW+%BcMr$bsspe6CMR7^orCRa0pZtVm zsy$Sbsh^}cqFhY<3!Tg8Oh-N^u2GGmdjZVZ@ZL7@k79w&d6Xk)KYBlzxJ&j@zNeZ; zvG2R7uITH?Hp-pEHR3b%VU!QZ=hSD@S~{mtFG{gR`Vj^smvEuFPj--hDL#n1q%*}O z#czmjO5t%Q@&V;>%2(8f5ueF6sx#zs%FlFnLuUwzBZ?352iZpW5zfR(;x5G?@rp2| z{)OJxpniku5$Q*38y-@EQ04pLPoWZSA`v<^8-V$ zm{+D`oZ!_q*T-TW*>*g|1fdJX+wY6y`{yKgVzNy_F69!68S*9Zk2pj+6aQ$e-?{Qa z=hi!Oi(GPV%Uvcuz4y+@)THFeMpOLy1?!4e~GLI*OT6zxEb+obnL$ zn3OwdKbl8%i#Tp;zdWQqlfeadT8Yl+XqKl@2{ zM82Y!rrbnvMEx$|Ok?C zkEJ|Ly#;ZSY98T7d?Ef34`@H)0o4Gi6|^7mp7yg9XNpxi_mB+A8BUR>ci%{JQe#$t;6f<;=r+h_y9pxtS8`X1)1;T~qnLp=EaLCp=L;fJ1(mbl?6sva!%e(OLvnz-@ z_$!Ymi?RL_k_p?MjyNOc4G$Z<#lEvKQWKiUOG5T+zk&XBtH}D&g6;S zmc1>nBZ|wvjI@I+ss%ezNCh0cV_#65?^-9PC}SkZo@A7OuHm4nca#t2iI z_eXst_M^3=ANiMLT-`8T;GDT~a^bfLC98>f6W`0vOd=nV&ZHmt?OM9R!k5IgY`4w| ztcXLz@o6quguR3*+0nJ)9|9N08dHTXv|o$kqr_VB(cAp8u9DvfQ__WeNn^A&CRb}= z8^tu)LG%1(E)^K0%_!erC9KH56qm#y@(1N&8l$x&moT6_MElWN@(0;QYe_EU7vd0c zoMM&M60fMfQEX9urv3W286h~Cf6WUqM)p#^B0DI*U<^V&rF=yg5D&->nn$taoz%f( zsk@d};t=UV{-AtsYYdX#sMb<`ChTLH$g>OSOtp++fqYJJL|9R7A|H{x6i1Xx2p7to zG>^u}4$398marmwDK06dX^ebHT%)y=vnkFgACO$KgXWQciT4yoL65I1N)!kO06JmLY(qg+R0gdg#g zVr$4MN72K@{@7ZaL%WYnD{Aucv-QN-o}@;xcGmfcVvJ-g*n3i(7u@{iXDO46URg&A zT_U=Biv4KqteP9d+QbDWi!rieMQlo&Y`dO6#AvDGme=$el3ZF#woxn)cPZWo7m9t7LAp>Zly84VU_kkPK;dCV z3r{Ss~OKYp#OegZowpUdJ$0;sJ=cM;Ci~Y#I&r%H%yeEGU zrWDh}4Z?*mAbTfx&kz{c%3Z=Gt6edH3-OBlM)f1Mg}up6|N8v*QN(fDkMaTem*NO@ zf!>?yImw`&fv`V2;j*hX998{BYP>AQ2$5%rQU*M5DzH!X)Wb;s%3;d$t61o1Io|DHPVIh0r7x(6~dJK zL2HSVl<$duWCz7L*+Dsn@S`}QnnJmlfdQq~sUFAYD=j6;Q z#z;TvCn*<`&ctVmH(E=1h-^DMUw-~ZI_HieU$yObQs77aB~Fqri7(WHkj@kflsjpR zbS4gwT*@01Gn6+dUs0YUUsB#6u8|#-4~X~FpOSvW7s@a1DyA~o>0f_+Mzqxq%87(M z)yv4%@|;&??mcnO&>&fN!SOcvd9Zchfx5nbscd8ZKl^yf8)FWh}^?LX45UQ_nbx{c7Ei&k!_8d|O~jYsqiH zhPFZ%8l(NlHo}VJlD&lKm@@L2C(?yv5H4gJ`OQ`tq#ya0uzH^By?FMBbZ%bgsqhi) zH*WoC!Gq^>ei5-iF^y|MKhpX9s8NEaWJg1L`T19b6|E(1P~IT@h#SN|;x6Gwx{!~$ z_1h!-M!d?|E|t+b-;)f&ifkjDi~M?2_=t2SJ`*=6jtG0QgT{zMWE;sP{V0!9%+P*> zGtHwh;uY0Fnn&Cq49E`BnfyWf(OTjL@t$e``Hk!#pOY_%<|cSrb*Y$LgwN^MfswTx^d9#C!~ zoQbDo8?7Z7WE=U7{6RPq|0v&+FG&WCksXv{DG!l;=0Bin4P`{Z-No?@TIY?Vt`ksXAet^E~YYU??kdJw{%_)Ixx%H^9PPm&DE5i~|V zB45%N;X*M@@k{s-E+m6=q1;K_ARbU$5~jpc8YBJ4mt-4pm*SUjCSAzC#Cy`2dMT1Y zwvo?ijB*%ZPuxYhaF0%M$qvGWxIsRm`qBB?E)lEL{}J{yMsoL+fXQDDfF5ySm*GZQ~ z$gTf0Q23)>&(Z?t5tBEG_jPF=@s!qfI@UqhLAH_3=|=Px`Xvv3E%u{%#4D0P{vhrW zHwaT2BV5Rr<$7ckw%Ljm*-No%t1oFk(wXcXRin1BgLqoF*bp&~VwL2QF9|EkVOyHY ze`k;MBVN&dl#6LU$|ZyW%3=M20*%%+kMtuS zkuH?8X+QEM)mp-U@+8?o^C-U%4+uZXb>v^#kNPIUfONi|{%7G|$~m+jaW`F^wBFV} zCvK20ZH-^b_q3L{K|Z4WVwQFj+@-ur+$FiWJKq%h5hux)#24x@iO=LW;t=(9)ca6e zl3d~%~XNafc>=y`MQf?>giC1JV*+#X8xJLF;tP=l7?yK08 zBBql%pl7A_FX)T?dX&%KJagwm7{U}FJjiR--@}BAz`HgI| zHJ_3%Db7g-af9TNz0^CB&xsq9bBN=8>eLZ`yL2yEInmec>LT9{xHn;mxW_!#C04BM zFmk1MzlX+1M$CdFV(nOG`EOZ`%p4@%pK-lDPUu4WRXqBGkddgPyq7P#=em%wam^dC zmc~}yke`D=*pq%yN#$o{6ZW*0Fb&K1o#^W-$K(>W(b|9`{wC`)NmFAXfiumc{kGJW zpBGO4Af3ra#0}Dg*3vw;Vh+N#9YyAgG18gFNIx2@{&u+F70n|a5T?XQ;@@}E+6ddo zzv(@;3BHgngcbRcaIRMDj?jf{Bb;d-`ImCtzsXIHX8a~_A*={zieJhbgfsDl>>yld z9{GrHCS7_u%I7z3T<&eO&KopFIfA%htA6BjsudJlG_>4h4LiHrFmor;X-mrKZ-4iK^h~!k$NwBJvgGcFG6jBkH+m9`y`_0r`?*kT_0u5T+F8LB zI*(gi*xTAirR!u8^T;1G=3Xkh*pK8sT3=1*+|;;JjP1%iM_`a+{(dpGx!X12U$TSn zBVN&3^3ke8y~KNl#5K~{$-zP3Ok+nY|0d=U$6HTsCNLoGj(5o=aP}WtSjZsk$=WT$^c_qDu| z&&fxmv#o218^lwxmueKnG;t_fTr*{{)AAZIqK_E+;5JQ+jXOP0j8Q(NwUpP$UYbX7 zNqnXrj`X8>#39Omw3d1w!k+j-v065VgSW*umRE``sx!ntT1(hdou>YZlgnB>5YB$xIht`VlT@}<@Jdp6-mvGCG;pum~@Mi@{m z5H935vX^ur8O}wjd0RMUd8Pb9IFoIpbIYx{1*SBQ_9NS<2GClv*Vb5|e4y@>6<852 zlwZi_QyQERxDdxFC)zrXbfH>7e4+Y5exos}p(KO+LA?NR$m_;HlZCUESKc1dC(asc zW*Nm;kA|Z~uSfa??C}zESL|&nID@{X*`K61@t^croaxm`8ThSX#p- z87||Rig^!Wy@YLd^9>O52&=e5o5eg^Wf0Eo9eo6*^~<&q7!Y5`=P`>~nJjtK@_N8Y z{_RbnqL~E-WbdBMkA;2@+jbQgkR8O0{#Of%wS5wA7w1*dg>=qwd$HJ$;%(OJOky7S zZAr`=F^}SH?6N?k1z*c6`C~~%S!YNtVMSwv74gMw<8r|vlDo0-V=<59Qp}KC`$tCw zUv^HuC@>|yQ2rzRHk5iN?sG^+T;{35M`0=EiZO~AidB+9xh{wMa3O={*_!_-28qw) zbMgnpFXdR$k7AHwmFy+_hzAsJq#xxH;x6GwGAMqj##0PZeIt7*jz|XKN4z5cQmvpd ziY>B@xYj(g{P)F=T&p2?Pq9V5q#8wQ2`ln1#V=t%Ic(o_`S+KkGsRKK3p)h{q%-M4 zm{Lxpyha$1-w0FceJbW&A@VqJgD{|&rapF6hO8z_?X?)Eat zXB>#9qziF_a3Q&rH&Sn!E-)o~*R9zsY_k=6;wi}`u2IaiT6kUX`N>>w?@u{N|0cRG zap-n|nPM&Rh2osBCmuvzZ!BcceszD4clyLh!r+g6O@u!vE=ewNjW|R(hd53+lMK?C zI7Hkaxr7zzOc;8l$)*tZc14geh^2>MGeweFR}o`GEXJ`w^xz zk8oM=QvREI|AwdJOY#w6K)TR8@+HY7zwHi9A#x(&LOF47s(m7dk>4nHQl2C`h*y+5 zDK1F{)m7pP@t*p2;w05U>i;Nj5LU!p(uMK?afrAkYxXHRVBYTPC zgejdN$PU_%avk}SFrc`koK5+K#t17KqgqQor~a9IPI;1Y80Bor&y)`cXYvv0Li0#J z;vbz2$PV%cotcOSR0D{o6z5d)NCxFK%J;-^;sN3OaYZrFACS(Z3&jHAN3lh@gvQ86 zbRR}BLwS;PrucA+SSorSI;)Y-iIe0b;yC3JihZ(;T=Eh5l4KCq z$Va3z)gG!Tw3h53xfJKLmU^9?t|+Kr~x;=Dj|$qvuC`Gvi-U+l$jVOz(6yTlk_TJ!O8A%o_1&zVll z+f}=~kU=^JdA1U334@$vhXIUqBMflNv z#Bp2m^T{m>M4VF`QC=ggXddO4q7F@ky@Wv~uL(jwTKl5=3^9-NE8xCS_=sYVxHdcE zJ0W9Z=|bX+O?j7aA-UvVifQui(&e>oJ zy^AFhb`bUytJLojhlmHn@w)pC3#^Xb_*LW~;u^`NJ{!j>%fD?QOrN@x7P^psi3hYF z^|6$5f|tw_a;Xm^?o!<%tcYur?Btsp*AA3^$|48Wc+Ai0D+#o+DHe+d4OKZws1 zThw2XepGu%2Jw&dqufrmQI4RxMe#;<5T?W{vX}BR$smrC&XlicjAYP$geloZ^Jt9f zmaYCE{HV8}I!&=a`;jhG7bpgaFN6VclH!Q+71a;oAH@gdXVQ<(Z`51RTH+AlV(S?B zi0q)eLAnrk$(JO9#(M5aVzSe}qWfB2Nf+W3h4rBmD@2(a;l;&g5U>Go8z* z&!PNGx==4gaw*Ppg~?|dNx#BQXGK3m_Rf2lL&QGST8e3kOY)Je93o$m9VD0XJ=sgK zO19D3{MnCJvgAk0>)Yq@@19B;^9k%}9_=@0KtCbl{+($e=UlunUyPlckxh)vNj*{A zCk|S?ksDlCt1tdClH!wisL6G(wDhtX{<1 zvc~dCG6?%iRSt;#2rKdj>38VxN~1*w%WGpV`8n!#E#+rh6V6Wd@|;XQB5sh3Ek^k_ zE5w&ucU}u0k$!|F z)w@>fgj~WZ{k+m*UggIrMf@(!epk#RtWJ0G5%UOpvX|zOj5;&qXOK{ics{JI(1r2_ z#lGLgZ2|+zYZMFQH~;zz1@Bi6bTwLH+44%Zk~Mhf19iy3iQ$k8%@@kKU4iE=wWBF zaLn>bIhJsy{mAEp3vq~Qz>?LwMJ!NlB;Idzxgz{a^QeB1KZt+%=HC|FrI>l;luO`D zaw+GK3|sRM)diA4*b`4FR(lPXe|JJPg?Ke}-cjLSieJhvB!g_D+B5vO^Fr>l)bc$R zieHLLvV(Fq`HlJmvV-OkR-_;Co^k}`UCKEW=fr2KJ%lsKCHyEKP|r%SPxB}~DA!R8 zMl_J0@kV~5euMZ-m{MF)ej!~b$C5t?7dpF8uSZ-XPSP0ZM?58eQ0$X!RHLY#6Mob) zQ2bJUA)gb+$(MA7AfA%Wv>)+`bfLOR{W$rO_9I+~_rxLMAJyOQ8asPi`WDM8V`xINmN#ZW8C4bn;1HzPiL}TPPl1o@oex|%jF-@^R`IPDm*+D)hok>56eZqxg zQ2f#uaftjz`IPc5VM>0ZIHLSaG6*XgBOlQ`$}dzGsK!&TNB*FCN&X;vDc6yY2xmIa z5cbpy5Z4Gls@;@xh(nZPiIapq;Y|J@OsV!zT#_y{kMyH{h_E7m(7Be*R)hhqrP!i6 zNd6^zNe0yq;uVb%pJ^V|Bg*%LDa8@ZBfb!y347ud)eqte$sp`WKiZG5qMAZ^gLptP zs4t;2Hq}+~IgQa;>bb}tln=-@@)7xiaw44(>0W@|i=jHB`NOF~_0WLEhVTeOWHsMN z-%4Nn9RGdoNJB^ScU27Sf^*5b-mooU%sAh?jHVb&Q7l89TI+1EMbaE zM5KRMNLYAb=TP6sF5$i*Aw9YU1xFfO+zabs{%&h`e}kXf|Cz15{Cs`?$Fz>@7S_$T zN4s#}PC-8HKH=iw?^njnxk8f&Lt`DVN}qnCBW4CHvPX!))esOIsek9}7uH?>#>F`# zIMk5vtq!1z4qM^E&JjVr0r;E3&e}fyVV!ztj?lar(bB!Ob46!YAD?=@om>-~lffrCSh7|sCmCgXO~VPVUgix5`=}iYukSQ(KXc2&Drd7%^H^k z2E-#$*jdNKrLAk2U;7S*9)-*n_(nRrJG(o5vEJRayKnd42%i8$cSD4E>$Z8_^A`H^ zgdTr4p_;)z#5dgFtZAjI*Q0yaU_-YA)gpUzGPr1%ngP_YF>CZ0q)*B@_vq>y9_;I9 zHsepfH%|>VM1%!82N*&lf+NjlICuY>ncdBEw6D)7nYaA>gZpQhe}b)(d%Tu^wq7?% zutl5c63>osLx6^CxWQMqGJeZ1e)T0ezEt8%)I2n&+Kie<>(3StYUbbDh}xGkzZEr) zuc7AgSE%`gbTNDlw)o$D4LAP~gKxM`guicyA>z-j3OAS|FX1=lmL_tPd8WkbUvH3(cIf_oYQ zd?F3qBhA~z>)TQLsk2L4GZyAJ{xaK`xAoB$7IrS|>}LoG>-KjlYm@&*@5aqQaaI<(V%>NcEzqZtNLnFHQMFvOe zWd7%#v@F(4_4Nzu8lTlIr6+-aUSF7MS@1Wu{s5l&>e4T4^*7VlVD4c)7uWO!Y3>|z!0vbn#v&|=0NOXE{l;7 zd7V9+^ERsb1u9< zg3X!#uk)k3=C)7rJ-$(X{JL+E@A0MlkZ-g zBpk_|oqPIpG`p>sbI2FxUi}FE<^RNd=ior+aR11P72Q9rOgI*PxlH@sJh6xQ)K{@$ zUJo~S&*JW-@;Vnx5L&6Y*Qf6*Xy2OeA|fIxl`3YvNBog1zLRwc{PJeUqPFFp$9iRa z$LXSXUM^qjyv!|0cb!fyvYU#(j`(uh9`REXTBpL!@jq(Z*RJb28eBrdLe2f0Pe*gd z9p8i%)()Wo=F_Ix1$jM6IX5sD_!svmVHV+A zBEsLte3}GXBe1Zdgx`b-8Lcf@yU4qKnNW9l`FKaO0dD6XJ{B`C3EBAW7US6ebx!3dc_454h zUN8P~)Ycm+_b=|UzV(Lczk59`^?bfavh6nXzk9v^?)Cn*%m4B!5_|W*>W>o&1Frj` z2ea<^tuBDRwe>e|<70FCpCI#V9lZ@!er>7khFY3$y>6^uSXKreT)1*-J1M&ulFr)G5mM0=knjZ zo+ZitMd`C#8GUPUx4E!?tt|glMgQ6w8|<-^;eTAiEerp?ep_b#lY6kQuKB{Ge|fK0 zD>yVD_`i!it9Mf2R`7q>#a@u+w@>$T@ejLvd6T7m|EHTheZjxJ+S7Nj-0kT<{D1v& zua*YnpKtffH>Ur8z1=h4C;OS7p|XB#&)41jh#Xz-#XmA=x!%*Bu+yK{v3l|?VOR4_ zyLSH=9;QF^;}-vu`Nmg!?B(-Mfx+Ps+Wo!xft@_@kHdWVXpE%-eZDr)A8l(F9vqPH zU|alCFy@EVG)=yEzAXM{{r}okuJ+uW`K`9Y^}L#VU)ZAA0q z+5ygyVcJvdVPPTW0%?98DImhx{H%-Ry+7+G5dZd;^1o*hT>m?>#6O;IsUY8$KlN3A zc?A2v_8h{OZ^$RKJ?1B#6Ca?El+uT3fgfe=n;Q(@%|A!kgCotd_YKO1R36?{ofiSD>|1`mh;${ne$h zxgAZI|L6C|Bg4CVetTSdOw;^FBd+>iPQ?Fxgx1FSggO^>E^B_EJYk2gOe5u8zcTmJ yUSG7f+FTo?|NV+@QbbqO{I>|U*e<7iU8J1*RomrMYviqMmn;5}BA*|6_URicEl}h*7wPi^j!v*W;r9uluprBRC^xI+V@j@P-pj)f!KT~VW7O|4BAAHr{oYcyT7)G2Oy*(RSHW!J2pFyV8Tw)aVjiR@* zfbVc2BT}KOEXGBYNWC9ikx{`*9X;?qGKQzjF0XaB_Jc7OZ%MeRFF{rxW^U~I{J*Lw zpBwebs;CfF8WV%m%?ohb8i%a$`4LR7U1q+40z*y5MkW&O+hyA~Kt41bW>`q*G|O0t zgv0O0O2R2sURCOot&MSj%^AJ>aj|5`yKrzAd~X-6Fs;IBqc}*jJRpSIRNE zjJqYmqijNBvJDkZ*+hi0@vP!eHo?H`^LZ2LVdS#S{V;{w!y=>g_0X^N9PPh#RI_mw PrT-p9FaG_F>E8AOB9pOf delta 571 zcmYk4yGsK>5Qjld&*jDa$f{*hN8WwGj>TzOCQ*lkiVi2rhGo;TqcNOPSn)k|TAWo_;u@)o=-JE@ z7wjENLh-vubj$}59mm6&CPh7WZkcwbKHE0vd~>fYdzo9F{v)1qKSct zsmWwU=8DaE{M{f~OA~`hKwg<>FDt8IvZ;Z=WDe;Vpt=-uv*gJQVWLpMSz)rQi6CP) z?+J?$*vzCO!pvr7l4g-&fU1ZMY@fmAyCNI l*@CQKcTP6Q)?x*_1;~<|T#+pVv2=5P_6KfA$TgQ&0|4BKV37a- delta 332 zcmezOp7Gy%#tjNgEQVGF#*kk!X@UnUT3-a~@|CkZ+h~ zm}CIq^LMkdni*J_m`no7mWlQPc}a`&L**f63WOyI zYNSMXc62*=MnVPJ|7D>j)roPB5fVeg$OAG3#m@J9Oi?f8F4gm2kfp{RRHowgJ L!wm_imu1xedI4Fh delta 314 zcmaFzj`7Jm#tqs`EQVGFW|Q@qZnC5qr6h0WVLrjiVw_@-Jeixhe6v4iFe{sxL83u& z@?;+7vdwb*A*`&%$tIQ-VD4KHAlED@F)?|vn^YW&fuXU*lRZdDvazuNiYc87)*%>6t%mQ-3b$VrY5U_iGc;Oy)QBgAg+zc(ty1>)U@Qu_r$|kjZBS`48SbIWK#nW%VY9PT~P%i^Ry%b0|lGV z;?&^ejMUszI|Xku10YBQ>ou6H;2JeqKvD*5>0|>*WgsKbVzY;yDC6cFsbnFLt4t=} z@hP6{;}i@r(Ztf&0;`E&H^5AkhPV}IQm-(wA(`?9iD{PD4FEfR^A)FbMi!8}C)>N& Wuo{7^+uYz1!2u4S&3Al$F#!NCUR?nI delta 308 zcmcaMpYhs!#tpoTEQVGF7Lx@TZ?Pn%7+Y+9&$x|~B{4bCV)A>&ipg(yxHfC^B(bv^ znx$Eq0EIL+?-oAH%wn9Hm^S&YcsQ%EQL2H-_tY%4xiOE2g$K;v1q6&r<2FV5n z3O1p|slmw^sky0k3f^W0K#&O1YG5!~!8K~KfTRrA(#Zyr%3wP;d+3QWZqAWP76Q4- zeDWQi;>kWv!C(`O(^5>6v6~2T1I$Eeh*NSi#n9Zg7d<00+?KJ3had0Oe(10RR91 diff --git a/out/Graphsfige1.gph b/out/Graphsfige1.gph index ceba83a928871a5caa906a1a0de9908fd5c840de..5be6dc82789592c3f2b4391f387535fabcb2e6a8 100644 GIT binary patch delta 630 zcmZXSPfHs?7{-}>XJaqfN~_gYq)~g*!0c{zcUG)6P*CVWTS>%=o6YP75B;Nv?Lq3L zhqmA?hdB#=fI<#)>m>yJ1VS!i!7t!dp>$@p(TH=JdEouc^E@-%PQKg8|9XtDJL|d4 z5wwlm=1){6OdSbUW70I^Bz8fDUd0J zH2`CeR40U=NAMB3+$zI+a46+p%P@lV?SG2!*~~i7gEGDvyt0Jz7G4;9dK8}WPpdG< ztr<8~G`pXMNx+!4fwgyu+wE1Rcv#gW9uB~Bi?6RhSM0rn0^Bo&8(}F+gLPt!(QQ&L zF%z;YStQLsLV~U}qu)xEk5^#05GEcaj1=Z7JLxLhOh2Uag*QHtE7s+ScNN$~S$n^$ qFsojH%9s3Gg}E%u{F>Y;KVp9kHXi6tr6U{eBriKKB$68J8vg)d9Js6i delta 676 zcmZvaO=}ZD7{{4?X189liq?19u5E8xn3+tHO{uK`!HNf8N>aRZGrOBmq*_JlrO=B9 z6?)6zISc&&LJo8D5`umLAs4OS2hgJk;>@g7DB07_vortsJ-=s1!_sJ2dUu9UzQ}96 z^W+)fy*H#wxyUQX4!qUgetM(7>kSj1i!RHMA9%O=`zdV)RbJ;z+QO^;)Zk-6WnL+k z`sp0`kocDjX)Q?WLMyX`=g zQ)YsG_^^tfeF&*gX^P){xb2p{h-<0*_qi0*b6MyA3!z_4m2&4dre(P z2YbbLZY^yT;=_9|(!19of@9!Y)C_>(UIWfi=c$OX18_0(pyJqK&V<^8{DR|LEu3n? z*+>ai6WLfi=UYE$!X}|sIKFSeVo> Date: Wed, 25 Sep 2024 15:10:26 -0500 Subject: [PATCH 4/4] run4 --- out/Tablestable8.xsls | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/out/Tablestable8.xsls b/out/Tablestable8.xsls index 6dddc10..3721484 100644 --- a/out/Tablestable8.xsls +++ b/out/Tablestable8.xsls @@ -1,15 +1,15 @@ - (1) (2) (3) -VARIABLES LABELS Endline math score Residuals Residuals - -m_theta_mle1 Baseline math score 0.58 - (0.041) -lower 0.31 0.31 - (0.092) (0.092) -upper 0.45 0.45 - (0.085) (0.085) -Constant Constant 0.51 - (0.033) - -Observations 535 619 619 -R-squared 0.365 -Robust standard errors in parentheses + (1) (2) (3) (4) +VARIABLES LABELS Endline math score Residuals Residuals Residuals + +m_theta_mle1 Baseline math score 0.58 + (0.041) +lower 0.31 0.31 0.31 + (0.092) (0.092) (0.092) +upper 0.45 0.45 0.45 + (0.085) (0.085) (0.085) +Constant Constant 0.51 + (0.033) + +Observations 535 619 619 619 +R-squared 0.365 +Robust standard errors in parentheses

    $i%#$gNJ#k2YDV*3vdMHuCZqrPDSFZI&MLc>DI8 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%0DOE-SY=ObKBbX<7xuC;E- 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 literal 0 HcmV?d00001 diff --git a/out/Graphsfiga1.png b/out/Graphsfiga1.png new file mode 100644 index 0000000000000000000000000000000000000000..6350ce88372be6893ff7461b3eab32a61ecbcbaf GIT binary patch literal 101758 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