查看原文
其他

Stata: 用esttab生成带组别名称的 LaTeX 回归表格

华晨 Stata连享会 2020-02-10

作者:华晨 (The University of Manchester)

Stata 连享会 (知乎 | 简书 | 码云)

特别说明

文中包含的链接在微信中无法生效。请点击本文底部左下角的【阅读原文】,转入本文【简书】


Stata 寒假班 报名中……
连玉君主讲,2018年1月13日-21日,北京)
Stata初级班 | Stata高级班

最近在跑数据的时候做了许多分组的回归,由于在写作论文时使用LaTeX编辑,因此需要产生多个分组回归的表格插入LaTeX文档。

众所周知,LaTeX表格的代码很(fan)复(ren)杂(lei),不适合人工编辑,因而许多用户都建议利用一些工具直接产生或将电子表格转换成LaTeX表格代码再插入LaTeX文档中进行编译。

我最开始使用常用的esttab命令将表格导入到Excel中,再在Excel中进一步美化和编辑各个分组回归的表格,最后用excel2latex插件转出表格的LaTeX代码再插入LaTeX主文档中。

虽然此方法可行,但毕竟还是需要一定量的手工作业。Excel2latex插件导出的LaTeX代码也比较呆板,在插入主文档时还需要自己不断地调试和debug,尤其是组别名要跨行的时候,简直无力吐槽。

对着满屏的数字和反斜线,头昏眼花。伟大的高尔基同志教导我们说,懒人改变世界。

因此,花了一个小时研究了一下用强大到令人畏惧的 esttab 生成分组回归表格的LaTeX表格代码,于此分享。

闲言少叙,书归正传。对于分组的样本的回归,我们通常想要一个这样的表格:

怎样用Stata来生成它的LaTeX表格代码呢?我们直接来看个例子。

cls sysuse atuo, clear eststo clear eststo: quietly reg weight mpg eststo: quietly reg weight mpg foreign eststo: quietly reg price weight mpg eststo: quietly reg price weight mpg foreign

我们利用 auto.dta 模拟了四个回归模型,下面我们想把前两个模型的结果归为一组,名称叫“A”,后两个结果的模型归为一组,叫“B”。根据esttab网站上提供的例子,我们可以先执行以下一段代码:

esttab using mgroups1.tex, replace                        ///       star(*0.1 ** 0.05 *** 0.01)                        ///       mgroups(A B,                                       ///               pattern(1 0 1 0) span                      ///               prefix(\multicolumn{@span}{c}{) suffix(})  ///               erepeat(\cmidrule(lr){@span}))

相信大家对 esttab 的基本用法已经熟悉了,下面主要解释 mgroups()
选项的含义。mgroup() 就是将模型分组的变量。括号中的参数 A B 就是指定两个组别的名称。注意,B 后面紧跟着一个逗号,逗号后面是mgroups() 的子选项,用来设定组别名称的性质:

  • pattern(1 0 1 0) 这个选项是用来从左到右将各个模型归入每个组别的。1表示该组别的第一个模型,0表示该组别的其他模型。因此,第一个和第二个回归的估计结果会被归入A组,第三个回归估计结果是第二组,也就是B组的第一个模型,第三四个回归估计结果会被归入B组。

  • span 是指定组别名能在表格中跨列,不指定则组别名称会保留在该组别第一个模型的顶部的单元格内。

  • prefix(\multicolumn{@span}{c}{) 和 suffix(}) 这一前一后两个选项是用来设定组别名在LaTeX代码中跨行的。前面已经说了,LaTeX表格中跨行的内容设定非常的不友好,手工写代码或者修改都极容易出错,强大的Stata免去了让我们手工数需要跨的行的数目,这就是@span的作用。熟悉LaTeX的胖友们应该一眼就能看出这就是LaTeX表格中设置跨行内容的代码。

  • erepeat(\cmidrule(lr){@span}) 这一次选项一看也能知道是设定跨行代码的。对,它是用来给组别名执行命令后在当前工作目录会生成一个tex文件,打开后如下图所示:下面加底部表格线的。

执行命令后在当前工作目录会生成一个tex文件,打开后如下图所示:

这一段代码不能直接编译,熟悉LaTeX的朋友知道,这个文件可以插入已经加载了必备的package的主文档方可编译。当然,我们也可以在这个tex文件上补充成完整的LaTeX文档代码结构进而编译。可是每次都要补充不麻烦吗?有没有打开就能编译的tex表格?答案当然是Yes!执行以下Stata代码:

esttab using mgroups2.tex, replace                        ///       star(* 0.1 ** 0.05 *** 0.01)                       ///       mgroups(A B,                                       ///               pattern(1 0 1 0) span                      ///               prefix(\multicolumn{@span}{c}{) suffix(})  ///               erepeat(\cmidrule(lr){@span}))             ///       page booktabs

注意到,在底部加了两个选项 page 和 booktabspage 的作用是在生成的tex文件中添加生成LaTeX文章的代码,而 booktabs 的作用是在生成的tex文档中添加加载booktabs宏包的代码。生成的tex文件如下图所示:

注意比较该tex文件和上一个tex文件在头部和底部的差异。这个tex文件是可以直接编译的,生成的PDF表格如下图,已经几乎达到我们的要求了。

需要说明的是,也可以使用选项page(booktabs)产生可以直接编译的tex文件,但是生成的PDF表格的顶部和底部均为双线,这既浪费纸张油墨,也不像Journal of Finance里表格的高大(bi)上(ge),还不是男神连老师清新大气的审美风格,所以本人不推荐这个方案。

已经完了吗?既然我这么说那就肯定还没完。细心的胖友们肯定发现了,系数里的负号似乎不够长啊?是的,这个短短的横线不是负号(minus) 而是连字符 (hyphen)。之前用 excel2latex 插件导出 Excel 表格时,连字符不会自动改成负号,而我的变量里又有一个 Market-to-book ratio。因而每次选中表格替换 hyphen 都要将这个变成负号的连字符再改正过来,心中就是一万头草泥马飞奔。温柔体贴的Stata其实早就想到了这一点,不信我们执行以下代码:

#delimit ; esttab using mgroups3.tex, replace        star(* 0.1 ** 0.05 *** 0.01)        compress nogaps        title(\textbf{An Illustration of mgroup() in esttab})        mgroups(A B,                pattern(1 0 1 0) span                prefix(\multicolumn{@span}{c}{) suffix(})                erepeat(\cmidrule(lr){@span}))                booktabs page(dcolumn) alignment(D{.}{.}{-1}) ; #delimit cr

这段代码中,我们加入了 page(dcolumn) 和 alignment(D{.}{.}{-1}) 两个选项。

  • page(dcolumn) 的作用是在生成的tex文件中添加完整LaTeX文章文档代码的同时,添加加载宏包dcolumn的代码。

  • alignment(D{.}{.}{-1}) 的作用是调整单元格对齐方式的。(具体是啥意思其实我也不懂啊啊啊!至少有一个功能是小数点对齐。)

生成的tex文件如下图所示:

编译之后呢?

惊喜地发现,所有hyphen都变成minus了!几乎产生了完美的分组回归表格的LaTeX代码!妈妈再也不用担心我的分组回归表格了!

其实 esttab 还有好多灵活用于生成 LaTeX 表格代码的选项,比如还有longtable 的选项,期待胖友们一起来发掘更多更方便更强大的功能吧!


样例代码

*  = Example = * *  - If you did not install external commands below, please install them first. *    Otherwise, the code would not be executed properly. *  - For compiling LaTeX files, you should have installed necessary LaTeX systems *    e.g. MikTeX on Windows * *      ssc install esttab *       ssc install estout *      ssc install texify     cap mkdir "D:\_Temp_\"     cd "D:\_Temp_\"     cls     sysuse auto     eststo clear     eststo: quietly reg weight mpg     eststo: quietly reg weight mpg foreign     eststo: quietly reg price weight mpg     eststo: quietly reg price weight mpg foreign     *- Basic code -     esttab using mgroups1.tex, replace                            ///            star(* 0.1 ** 0.05 *** 0.01)                        ///            mgroups(A B,                                         ///                    pattern(1 0 1 0) span                        ///                     prefix(\multicolumn{@span}{c}{) suffix(})    ///                     erepeat(\cmidrule(lr){@span}))    *- Generate full LaTeX code -        esttab using mgroups2.tex, replace                            ///           star(* 0.1 ** 0.05 *** 0.01)                            ///           mgroups(A B, pattern(1 0 1 0)                        ///                   prefix(\multicolumn{@span}{c}{) suffix(})    ///                    span erepeat(\cmidrule(lr){@span}))            ///           page booktabs /* Strongly suggest */    texify mgroups2.tex    *- Beautify the LaTeX table -    #delimit ;     esttab using mgroups3.tex, replace                                        star(* 0.1 ** 0.05 *** 0.01)                                    compress nogaps                                                    title(\textbf{An Illustration of mgroup() in esttab})            mgroups("Group A" "Group B",                    pattern(1 0 1 0) span                                          prefix(\multicolumn{@span}{c}{) suffix(})                        erepeat(\cmidrule(lr){@span}))            booktabs page(dcolumn) alignment(D{.}{.}{-1})                 ;    #delimit cr    texify mgroups3.tex

关于我们

  • Stata 连享会(公众号:StataChina)】由中山大学连玉君老师团队创办,旨在定期与大家分享 Stata 应用的各种经验和技巧。

  • 公众号推文同步发布于 【简书-Stata连享会】 和 【知乎-连玉君Stata专栏】。可以在简书知乎中搜索关键词StataStata连享会后关注我们。

  • 推文中的相关数据和程序,以及 Markdown 格式原文 可以在 【Stata连享会-码云】 中获取。【Stata连享会-码云】 中还放置了诸多 Stata 资源和程序。如 Stata命令导航 || stata-fundamentals || Propensity-score-matching-in-stata || Stata-Training 等。

联系我们

  • 欢迎赐稿: 欢迎将您的文章或笔记投稿至Stata连享会(公众号: StataChina),我们会保留您的署名;录用稿件达五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。

  • 意见和资料: 欢迎您的宝贵意见,您也可以来信索取推文中提及的程序和数据。

  • 招募英才: 欢迎加入我们的团队,一起学习 Stata。合作编辑或撰写稿件五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。

  • 联系邮件: StataChina@163.com


Stata 寒假班 报名中……
连玉君主讲,2018年1月13日-21日,北京)

Stata初级班 | Stata高级班


特别说明

文中包含的链接在微信中无法生效。请点击本文底部左下角的【阅读原文】,转入本文【简书版】


往期精彩推文

Stata:君哥和涛哥背靠背

GIF 动态图:我用 Stata 做!

君生我未生!Stata - 论文四表一键出

盈余管理、过度投资怎么算?分组回归获取残差

哇!Stata 书库来袭!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存