温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
作者: 华晨 (The University of Manchester)
邮箱: huachen0108@foxmail.com
目录
最近在跑数据的时候做了许多分组的回归,由于在写作论文时使用 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
和 booktabs
。page
的作用是在生成的 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
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1 小时 40 分钟 Stata 33 讲 - 连玉君, 每讲 15 分钟. 部分直播课 课程资料下载 (PPT,dofiles 等)
支持回看,所有课程可以随时购买观看。
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 ⭐ | DSGE, 因果推断, 空间计量等 | |
⭕ Stata 数据清洗 | 游万海 | 直播, 2 小时,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2 小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD