Stata结果输出:Stata-to-LaTeX指南
2024-06-25
王卓
3527

连享会   主页 || 推文 || 知乎 || B 站 || 在线课堂

New! 搜推文,找资料,用 lianxh 命令:
安装: ssc install lianxh, replace
使用: lianxh 合成控制
       lianxh DID + 多期, w


作者: 王卓 (上海财经大学)
邮箱: zhuowang@stu.sufe.edu.cn

  • Title: Stata结果输出:Stata-to-LaTeX指南
  • Keywords: esttab, estout, estpost, estto, tabstat, Overleaf, TeX文档

Source: 本文摘译自 Asjad Naqvi, 2021, Blog, The Stata-to-LaTeX Guide, -Link-,特此致谢。

1. 背景与简介

这篇推文来自 Asjad Naqvi 老师的博客:The Stata-to-LaTeX guide。在本指南中,我们将重点学习如何将 Stata 表格和回归结果导出到 LaTeX。

本指南的目的不是讲解如 esttabtabout 等命令,而是为相应的操作提供可复制的模板。此外,阅读和使用本指南需要读者熟悉 Stata 和 LaTeX 语言。

LaTeX 部分在 共享的 Overleaf 文档 中提供,可以在线查看。读者可以复制模板,也可以下载源代码并在本地编译文件。该文档还包含一个更改日志,用于记录本指南的更新版本。

本指南讨论了每个表的 Stata 部分,并且可以在 Overleaf 上查看 LaTeX 代码。在 Stata 中生成的表在 Overleaf 中使用相同的表号进行编号,例如,导出为 table1.tex 的表将是 Overleaf 上的表 X.1

1.1 准备工作:Stata

安装软件包:estout

ssc install estout, replace

本文使用的版本信息如下:

. which estout
D:/stata/plus\e\estout.ado
*! version 3.31  26apr2022  Ben Jann

. which esttab
D:/stata/plus\e\esttab.ado
*! version 2.1.1  10jun2022  Ben Jann
*! wrapper for estout

. which estpost
D:/stata/plus\e\estpost.ado
*! version 1.2.2  10feb2023  Ben Jann

1.2 准备工作: LaTeX

对于 LaTeX,首先需要在 Overleaf 拥有一个帐户,或者在本地部署 LaTeX 编译器(MikTeX、TeXLive 等)。Overleaf 便捷之处在于,当你在多台计算机上工作时,可以通过云编译免去全面更新编译器和库。此外,它还允许协作编译,方便合作者之间进行修改。

LaTeX 相关介绍(包括所需的软件包)已在此 Overleaf 文档:Stata-to-Latex guide on Overleaf中给出。

另外,你需要检查正在使用的编译器,确保编译器设置为 2022。因为旧文档可能具有较旧的编译器,具体取决于创建文档时可用的版本。由于本指南更新了表的语法,因此旧代码可能会损坏。查看编译器版本可以单击左上角的“菜单”图标,将弹出此窗口:

关于 Stata 与 LaTeX 的交互,estout 命令是一个很好的例子。该命令的帮助指南也相当广泛,可以参考 estout : Making regression tables in Stataestout。此外,Statalist 中也有很多有用的帖子,可以在搜索与estout相关的用法。连享会此前发布的推文也是不错的参考资料:

需要注意的是,在 LaTeX 中加载一些包是必需的。例如,booktabs用于更整洁的表格格式,dcolumn用于对齐小数,adjustbox用于调整表格大小,当然还有其他更好的选择。

2. Stata to LaTex 具体操作

在输出论文表格时,不建议手动创建表,在 Stata 中生成表格并在 LaTeX 中用标准格式处理它们更具可行性。因为随着数据文件的更新和清理,输出内容很容易更改,复制粘贴更新数字是很痛苦的,而且过程很容易出错。

在这该指南中,我们将介绍生成描述性统计和回归结果的各种示例。主要目的是使用estout命令创建 LaTeX 类型的输出。

操作内容分为两部分。第一部分介绍描述性统计表,第二部分介绍回归结果的输出。为了保证可复制,我们使用默认的 Stata 数据集(示例数据集非常干净,遇到错误或问题的可能性可以忽略不计)。

2.1 生成组合的统计表

本节介绍基本表。在 Stata 中,描述性统计表是利用 summarizetabstatttest 等命令生成的。让我们从一个简单的表格开始:

表 1:基本示例

首先,我们加载一个数据集并进行一些小的清理:

sysuse "census", clear
foreach x of varlist pop-popurban death-divorce {
    replace `x' = `x' / 1000
}

现在,让我们生成一个简单的汇总统计表:

tabstat pop pop65p medage death marriage divorce, ///
        c(stat) stat(sum mean sd min max n)

在 Stata 窗口显示:

. tabstat pop pop65p medage death marriage divorce, ///
>         c(stat) stat(sum mean sd min max n)

 Variable |       Sum      Mean        SD       Min       Max     N
----------+--------------------------------------------------------
      pop |  225907.5  4518.149  4715.038   401.851   23667.9    50
   pop65p |  25475.14  509.5028  538.9324    11.547   2414.25    50
   medage |      1477     29.54  1.693445      24.2      34.7    50
    death |  1973.713  39.47426  41.74235     1.604   186.428    50
 marriage |   2385.07   47.7014  45.13042     4.437   210.864    50
  divorce |  1183.972  23.67944  25.09401     2.142   133.541    50
-------------------------------------------------------------------

我们可以使用estpost命令存储这些统计值,该命令还将我们关注的一些统计量保存为 e 类(e-class)局部变量:

est clear    // clear the stored estimates
estpost tabstat pop pop65p medage death marriage divorce, ///
        c(stat) stat(sum mean sd min max n)

ereturn list // list the stored locals

其中,ereturn list 会返回一些矩阵 (matrices),如 e(sum),它与 estpost tabstat ... 得到的结果对应关系如下:

在上面的输出中,e() 矩阵中的所有变量都可以由estout获取。这使得我们在一些自定义编写的 Stata 命令中,有时我们需要将 r 类局部变量转换为 e 类局部变量,以使存储的估计值可用于 estout

让我们在上述命令的基础上加入一些选项,增加表格的输出内容,采用 estout 命令:

// basic
esttab, cells("sum mean sd min max count")

// some options added
esttab, cells("sum mean sd min max count") ///
        nonumber nomtitle nonote noobs label

// formatted
esttab, ///
   cells("sum(fmt(%6.0fc)) mean(fmt(%6.2fc)) ///
   sd(fmt(%6.2fc)) min max count") ///
   nonumber nomtitle nonote noobs  ///
   label ///
   collabels("Sum" "Mean" "SD" "Min" "Max" "N")

输出为:

. esttab, cells("sum mean sd min max count")

---------------------------------------------------------------------
                (1)                                                  
                                                                     
                sum       mean         sd       min       max   count
---------------------------------------------------------------------
pop        225907.5   4518.149   4715.038   401.851   23667.9      50
pop65p     25475.14   509.5028   538.9324    11.547   2414.25      50
medage         1477      29.54   1.693445      24.2      34.7      50
death      1973.713   39.47426   41.74235     1.604   186.428      50
marriage    2385.07    47.7014   45.13042     4.437   210.864      50
divorce    1183.972   23.67944   25.09401     2.142   133.541      50
---------------------------------------------------------------------
N                50                                                  
---------------------------------------------------------------------


. // some options added
. esttab, cells("sum mean sd min max count") ///
>         nonumber nomtitle nonote noobs label

------------------------------------------------------------------------------
                          sum       mean         sd       min       max  count
------------------------------------------------------------------------------
Population           225907.5   4518.149   4715.038   401.851   23667.9     50
Pop, 65 and older    25475.14   509.5028   538.9324    11.547   2414.25     50
Median age               1477      29.54   1.693445      24.2      34.7     50
Number of deaths     1973.713   39.47426   41.74235     1.604   186.428     50
Number of marriages   2385.07    47.7014   45.13042     4.437   210.864     50
Number of divorces   1183.972   23.67944   25.09401     2.142   133.541     50
------------------------------------------------------------------------------


. // formatted
. esttab, ///
>    cells("sum(fmt(%6.0fc)) mean(fmt(%6.2fc)) sd(fmt(%6.2fc)) min max count") ///
>    nonumber nomtitle nonote noobs  ///
>    label ///
>    collabels("Sum" "Mean" "SD" "Min" "Max" "N")

-----------------------------------------------------------------
                         Sum     Mean       SD   Min     Max    N
-----------------------------------------------------------------
Population            225907  4518.15  4715.04   402  23,668   50
Pop, 65 and older     25,475   509.50   538.93    12   2,414   50
Median age             1,477    29.54     1.69    24      35   50
Number of deaths       1,974    39.47    41.74     2     186   50
Number of marriages    2,385    47.70    45.13     4     211   50
Number of divorces     1,184    23.68    25.09     2     134   50
-----------------------------------------------------------------

estpost存储的信息由esttab处理,并展示表格在 LaTeX 中的样子。在上面的示例中也指定了很多选项。强烈建议您用help esttab查找它们。需要强调的是cells的使用,可以从 e 类变量中获取名称。我们还使用fmt()选项定义它们的格式。如果您不熟悉格式,请查看help format

仅上述命令指定要在 Stata 交互界面上显示的输出,为了将其导出到 LaTeX,需要指定其他选项:

esttab using "./graphs/guide80/table1.tex", replace ////
    cells("sum(fmt(%6.0fc)) mean(fmt(%6.2fc)) ///
    sd(fmt(%6.2fc)) min max count") nonumber  ///
    nomtitle nonote noobs label booktabs      ///
    collabels("Sum" "Mean" "SD" "Min" "Max" "N")

命令中关键信息的解释如下:

  • nomtitle nonote noobs label booktabs,文件 table1.texbooktabs 格式导出。其中,Booktabs 是一个 LaTeX 软件包,使表格格式整齐;
  • collabels 选项用于指定每一列的标题;
  • label 选项用于指定第一列各行中使用变量的标签 (而不是变量名)。因此,请在执行 esttab 命令之前为变量加上标签 (参见 [D] label)。

上述命令执行完毕后,会生成 table1.tex 文件。这是一个 TeX 文档,需要用 LaTeX 套装,或 TeXStudio 打开。如果您没有本地 LaTeX 版本,也可以使用通用文本编辑器(如记事本,或者是 Windows 中的 Notepad++)或 VScode 查看它:

我们还可以在上述基本输出上增加内容,甚至可以直接在 Stata 中将标题和标签添加到表格中:

esttab using "./graphs/guide80/table1_title.tex", replace ////
  cells("sum(fmt(%6.0fc)) mean(fmt(%6.2fc))  ///
  sd(fmt(%6.2fc)) min max count")   nonumber ///
  nomtitle nonote noobs label booktabs       ///
  collabels("Sum" "Mean" "SD" "Min" "Max" "N")  ///
  title("Table 1 with title generated in Stata \label{table1stata}")

上述的表格非常有用,特别是当你在标题中存储信息以进行某些估计,或者通过循环生成标头时。

可以使用下面的屏幕截图中显示的向上小箭头图标将文件上传到 Overleaf 上。

LaTeX 代码在 Overleaf 文件中进行了注释。下面我们可以看到这个表在LaTeX输出中的样子:

表 2 和表 3:main/aux() V.S. cells()选项

我们还可以导出一些控制组别的描述性统计数据。例如,我们可以基于 region 变量计算每个 region 类别的均值和标准差 (SD) 以及其他统计数据:

sysuse "census", clear
foreach x of varlist pop-popurban death-divorce {
    replace `x' = `x' / 1000
}

est clear
estpost tabstat pop pop65p medage death marriage divorce, ///
        by(region) c(stat) stat(mean sd) nototal

输出结果为:

. estpost tabstat pop pop65p medage death marriage divorce, ///
>         by(region) c(stat) stat(mean sd) nototal

Summary statistics: mean sd
     for variables: pop pop65p medage death marriage divorce
  by categories of: region

      region |   e(mean)      e(sd) 
-------------+----------------------
NE           |                      
         pop |  5459.476   5925.235 
      pop65p |  674.6488   738.7864 
      medage |  31.23333   1.023474 
       death |  52.99611   59.28985 
    marriage |  44.47922   47.56717 
     divorce |  19.30433   19.57721 
-------------+----------------------
N Cntrl      |                      
         pop |  4905.472   3750.094 
      pop65p |  557.6558   389.9379 
      medage |    29.525   .7008113 
       death |   43.3115   33.05996 
    marriage |  47.43642   35.29558 
     divorce |  24.33583     19.684 
-------------+----------------------
South        |                      
         pop |  4670.877   3277.853 
      pop65p |  525.8502    416.714 
      medage |  29.61875   1.683733 
       death |  40.66294   27.72655 
    marriage |  54.68769   41.31285 
     divorce |  27.76344   23.91968 
-------------+----------------------
West         |                      
         pop |  3320.961   6217.177 
      pop65p |  330.6022   638.6548 
      medage |  28.28462   1.775221 
       death |  25.10792    49.3073 
    marriage |  41.57823    58.4754 
     divorce |    21.076   34.65649

还要检查 e 类变量中存储的内容:

. ereturn list

scalars:
                  e(N) =  50

macros:
                e(cmd) : "estpost"
             e(subcmd) : "tabstat"
              e(stats) : "mean sd"
               e(vars) : "pop pop65p medage death marriage divorce"
              e(byvar) : "region"

matrices:
               e(mean) :  1 x 24
                 e(sd) :  1 x 24

存储的信息可以通过两种方式导出。

第一种方法是使用更简单的选项:main()

*** display on screen:
esttab, main(mean %8.2fc) aux(sd  %8.2fc) nostar nonumber unstack ///
   nonote noobs label ///
   collabels(none) ///
   eqlabels("North East" "North Central" "South" "West") /// 
   nomtitles nogap

------------------------------------------------------------------------
                       North East North Cent~l        South         West
------------------------------------------------------------------------
Population               5,459.48     4,905.47     4,670.88     3,320.96
                       (5,925.24)   (3,750.09)   (3,277.85)   (6,217.18)
Pop, 65 and older          674.65       557.66       525.85       330.60
                         (738.79)     (389.94)     (416.71)     (638.65)
Median age                  31.23        29.52        29.62        28.28
                           (1.02)       (0.70)       (1.68)       (1.78)
Number of deaths            53.00        43.31        40.66        25.11
                          (59.29)      (33.06)      (27.73)      (49.31)
Number of marriages         44.48        47.44        54.69        41.58
                          (47.57)      (35.30)      (41.31)      (58.48)
Number of divorces          19.30        24.34        27.76        21.08
                          (19.58)      (19.68)      (23.92)      (34.66)
------------------------------------------------------------------------

导出到 LaTeX,如下所示:

esttab using "./graphs/guide80/table2.tex", replace ///
  main(mean %8.2fc) aux(sd %8.2fc) nostar nonumber unstack ///
   compress nonote noobs gap label booktabs   ///
   collabels(none) ///
   eqlabels("North East" "North Central" "South" "West") ///  
   nomtitles

我们得到:

在这里,main()aux() 选项输入了 e 类本地变量的名称。如果不需要任何自定义,这是生成表的最快方法。无论定义什么,main都会在上方,而aux在下方。

第二个更高级的选项是cells()

esttab, cells("mean(fmt(%8.2fc))" "sd(par)") ///
   nostar unstack nonumber /// 
   nonote noobs label      ///
   collabels(none)         ///
   eqlabels("North East" "North Central" "South" "West") /// 
   nomtitles

------------------------------------------------------------------------
                       North East North Cent~l        South         West
------------------------------------------------------------------------
Population               5,459.48     4,905.47     4,670.88     3,320.96
                       (5,925.24)   (3,750.09)   (3,277.85)   (6,217.18)
Pop, 65 and older          674.65       557.66       525.85       330.60
                         (738.79)     (389.94)     (416.71)     (638.65)
Median age                  31.23        29.52        29.62        28.28
                           (1.02)       (0.70)       (1.68)       (1.78)
Number of deaths            53.00        43.31        40.66        25.11
                          (59.29)      (33.06)      (27.73)      (49.31)
Number of marriages         44.48        47.44        54.69        41.58
                          (47.57)      (35.30)      (41.31)      (58.48)
Number of divorces          19.30        24.34        27.76        21.08
                          (19.58)      (19.68)      (23.92)      (34.66)
------------------------------------------------------------------------

导出到 LaTeX 如下:

esttab using "./graphs/guide80/table3.tex", replace ////
   cells("mean(fmt(%8.2fc))" "sd(par)")  ///
   nostar unstack nonumber ///
   compress nonote noobs gap label booktabs   ///
   collabels(none) ///
   eqlabels("North East" "North Central" "South" "West") /// 
   nomtitles

在这里我们可以看到,通过选项main,我们从 e 类表中选择元素,即 meansd。这在 cells 中也是一样的。主要区别在于格式的定义方式。在第一种情况下,格式仅在变量前面给出,而在cells选项中,需要使用选项fmt定义格式。cells选项可以为每个表定义多个输出。例如,可以堆叠观测值,或最小值和最大值等。

另请注意,这里我们使用eqlabels而不是collabels来定义列标题。这是因为我们采用堆叠输出(所有的by变量都显示在一个长列上),并使用unstack选项解除它的堆叠(所有的by变量都是不同的列)。因此,每一列都被视为一个“方程式”。

表 4:单元格格式设置

如上所述,我们可以使用更通用的cells选项导出汇总统计表。这还允许在定制输出时具有更大的灵活性。让我们尝试一些选择。我们还是从一个简单的表格开始:

est clear

estpost tabstat pop pop65p medage death marriage divorce, ///
   by(region) c(stat) stat(mean sd) nototal

esttab, cells(mean(fmt(2)) sd(par)) ///
   nostar  nonumber unstack         ///
   nomtitle nonote noobs label      ///
   collabels(none) gap              ///
   eqlabels("N. East" "N. Central" "South" "West") ///  
   nomtitles

它的 LaTeX 代码为:

esttab using "./graphs/guide80/table4.tex", replace ///
    cells(mean(fmt(2)) sd(par)) nostar ///
    unstack nonumber compress ///
    nonote noobs gap ///
    label booktabs collabels(none) ///
    eqlabels("N. East" "N. Central" "South" "West") ///
    nomtitles

这里我们使用另一个格式化选项fmt(2),它是小数点后两位的缩写。这种格式化也在SD上传递。对于SD,我们还在括号中指定par,它代表圆括号。

这是设置表格格式的最简单方法。我们只需定义一次fmt(2),所有数字都显示为小数点后 2 位。

表 5:自定义括号

小括号 ( ) 也可以修改。例如,下面的代码将小括号替换为中括号:

esttab, cells(mean sd(par([ ]))) nostar ///
    nonumber unstack nomtitle ///
    nonote noobs label ///
    collabels(none) ///
    eqlabels("N. East" "N. Central" "South" "West") ///
    nomtitles

------------------------------------------------------------------------
                          N. East   N. Central        South         West
------------------------------------------------------------------------
Population               5459.476     4905.472     4670.877     3320.961
                       [5925.235]   [3750.094]   [3277.853]   [6217.177]
Pop, 65 and older        674.6488     557.6558     525.8502     330.6022
                       [738.7864]   [389.9379]    [416.714]   [638.6548]
Median age               31.23333       29.525     29.61875     28.28462
                       [1.023474]   [.7008113]   [1.683733]   [1.775221]
Number of deaths         52.99611      43.3115     40.66294     25.10792
                       [59.28985]   [33.05996]   [27.72655]    [49.3073]
Number of marriages      44.47922     47.43642     54.68769     41.57823
                       [47.56717]   [35.29558]   [41.31285]    [58.4754]
Number of divorces       19.30433     24.33583     27.76344       21.076
                       [19.57721]     [19.684]   [23.91968]   [34.65649]
------------------------------------------------------------------------

实际上,par( ) 中指定的任何选项都将替换左括号和右括号。例如,也可以使用 par(< >).

导出到 LaTeX:

esttab using "./graphs/guide80/table5.tex", replace ///
    cells(mean sd(par([ ]))) nostar ///
    unstack nonumber compress ///
    nonote noobs gap ///
    label booktabs collabels(none) ///
    eqlabels("N. East" "N. Central" "South" "West") ///
    nomtitles

表 6 和表 7:自定义小数位

我们还可以尝试小数位,并针对每个元素进行不同的自定义。例如:

esttab, cells(mean(fmt(2)) sd(fmt(3) par)) ///
    nostar nonumber unstack nomtitle ///
    nonote noobs label ///
    collabels(none) ///
    eqlabels("N. East" "N. Central" "South" "West") ///
    nomtitles

平均值显示为小数点两位,而标准误差显示为小数点 3 位。导出为 LaTeX:

esttab using "./graphs/guide80/table6.tex", replace ///
    cells(mean(fmt(2)) sd(fmt(3) par)) nostar ///
    unstack nonumber compress ///
    nonote noobs gap ///
    label booktabs collabels(none) ///
    eqlabels("N. East" "N. Central" "South" "West") ///
    nomtitles

得到:

接下来,我们尝试进一步的自定义,其中平均值的小数位数增加,而 SD 的小数位数则因行而异,这主要通过选项 sd(fmt(3 2 1 0) par)) 来实现:

esttab, cells(mean(fmt(1 2 3 4)) ///
    sd(fmt(3 2 1 0) par))        ///
    nostar nonumber unstack      ///
    nomtitle nonote noobs label  ///
    collabels(none)              ///
    eqlabels("N. East" "N. Central" "South" "West") ///
    nomtitles

------------------------------------------------------------------------
                          N. East   N. Central        South         West
------------------------------------------------------------------------
Population                 5459.5       4905.5       4670.9       3321.0
                       (5925.235)   (3750.094)   (3277.853)   (6217.177)
Pop, 65 and older          674.65       557.66       525.85       330.60
                         (738.79)     (389.94)     (416.71)     (638.65)
Median age                 31.233       29.525       29.619       28.285
                            (1.0)        (0.7)        (1.7)        (1.8)
Number of deaths          52.9961      43.3115      40.6629      25.1079
                             (59)         (33)         (28)         (49)
Number of marriages       44.4792      47.4364      54.6877      41.5782
                             (48)         (35)         (41)         (58)
Number of divorces        19.3043      24.3358      27.7634      21.0760
                             (20)         (20)         (24)         (35)
------------------------------------------------------------------------

LaTeX 格式:

esttab using "./graphs/guide80/table7.tex", replace ///
    cells(mean(fmt(1 2 3 4)) sd(fmt(3 2 1 0) par)) ///
    nostar unstack nonumber              ///
    compress nonote noobs gap            ///
    label booktabs collabels(none)       ///
    eqlabels("N. East" "N. Central" "South" "West") ///
    nomtitles

这输出了一个特别样式的表格:

这可以让我们定义有不同单位变量的表,比如,某些变量可能以百万为单位表示,而有些变量可能以分数表示。但最好将这些变量使用一种报告格式。

表 8:具有变量组的完全格式化的表

这部分我们生成一个对行中的变量进行分组的表格。我们还可以在标签中加入 LaTeX 元素:

foreach x of varlist pop pop65p medage death marriage divorce {
  local t : var label `x'
  local t = "\hspace{0.25cm} `t'"
  lab var `x' "`t'"
}

在这里,我们在变量标签的描述之前添加一个 0.25 厘米的空格。注意,这在变量名中很难更改!所以这些在 Stata 中也会像这样显示:

在这里,我们 “欺骗” LaTeX读取名称并应用水平空间函数 \hspace

接下来,我们生成描述性统计表格:

est clear

estpost tabstat ///
  pop pop65p medage death marriage divorce, ///
2  c(stat) stat(mean sd min max n)

esttab, cells("mean sd min max count")
estout, cells("mean sd min max count")

自定义输出如下:

esttab using "./graphs/guide80/table8.tex", replace ///
    refcat(pop "\emph{Demographic}" death "\vspace{0.1em} \\ \emph{Status}", nolabel) ///
    cells("mean(fmt(%8.0fc %8.0fc %8.0fc %8.0fc 2)) ///
    sd min max count(fmt(0))") ///
    nostar unstack nonumber         ///
    compress nomtitle nonote noobs  ///
    label booktabs                  ///
    collabels("Mean" "SD" "Min" "Max" "N")

我们可以使用refcat选项来选择变量作为参考点,并为每组变量添加一个名称。我们还设置了每行的格式。从上面的代码中,我们得到了这个LaTeX表:

表 9:T 检验

对于 t 检验,我们定义了两组:

tab region
cap drop dummy
gen dummy = inlist(region, 1,4)

我们想定义东北(区域=1)和西部(区域=4)与中北部(区域=2)和南部(区域=3)。得到基本输出:

. ttest pop, by(dummy)

Two-sample t test with equal variances
-----------------------------------------------------------------------
   Group | Obs      Mean   Std. err.   Std. dev.   [95% conf. interval]
---------+-------------------------------------------------------------
       0 |  28  4771.418   646.7638    3422.353    3444.368    6098.468
       1 |  22  4195.808   1290.179    6051.478    1512.733    6878.883
---------+-------------------------------------------------------------
Combined |  50  4518.149    666.807    4715.038    3178.151    5858.148
---------+-------------------------------------------------------------
    diff |        575.61   1354.697                -2148.19     3299.41
-----------------------------------------------------------------------
    diff = mean(0) - mean(1)                               t =   0.4249
H0: diff = 0                              Degrees of freedom =       48

    Ha: diff < 0              Ha: diff != 0             Ha: diff > 0
 Pr(T < t) = 0.6636      Pr(|T| > |t|) = 0.6728      Pr(T > t) = 0.3364

可以看到各组的 population 在统计上似乎没有显著差异:

对于这两组,我们还可以在一系列变量上执行 t 检验。需要说明的是,t 检验本身不允许使用 estout 定义多个变量。因此,对于上述组,我们使用以下命令:

est clear
global vars pop pop65p medage death marriage divorce
estpost ttest $vars, by(dummy)

. ereturn list

scalars:
                  e(N) =  50
                  e(k) =  6

macros:
                e(cmd) : "estpost"
             e(subcmd) : "ttest"
              e(byvar) : "dummy"
         e(properties) : "b"

matrices:
                  e(b) :  1 x 6
              e(count) :  1 x 6
                 e(se) :  1 x 6
                  e(t) :  1 x 6
               e(df_t) :  1 x 6
                e(p_l) :  1 x 6
                  e(p) :  1 x 6
                e(p_u) :  1 x 6
                e(N_1) :  1 x 6
               e(mu_1) :  1 x 6
                e(N_2) :  1 x 6
               e(mu_2) :  1 x 6

我们可以使用如下两个命令之一在 Stata 窗口中输出。其中,第一个选项将平均值和差值的标准差纵向堆叠,而第二个选项将标准差与平均值放在同一行。

esttab, nogap
esttab, wide

输出结果为:

. esttab, nogap
----------------------------
pop                 575.6   
                   (0.42)   
pop65p              68.13   
                   (0.44)   
medage             0.0877   
                   (0.18)   
death               5.281   
                   (0.44)   
marriage            8.815   
                   (0.68)   
divorce             5.943   
                   (0.83)   
----------------------------
N                      50   
----------------------------

. esttab, wide
-----------------------------------------
pop                 575.6          (0.42)
pop65p              68.13          (0.44)
medage             0.0877          (0.18)
death               5.281          (0.44)
marriage            8.815          (0.68)
divorce             5.943          (0.83)
-----------------------------------------
N                      50                
-----------------------------------------
t statistics in parentheses
* p<0.05, ** p<0.01, *** p<0.001

我们可以将此表导出到 LaTeX,如下所示:

esttab using "./graphs/guide80/table9.tex", replace ///
    cells("mu_1(fmt(1)) mu_2  b(star) se(par) count(fmt(0))") ///
    collabels("North" "South" "Diff. (North - South)" "s.e." "obs.") ///
    star(* 0.10 ** 0.05 *** 0.01)   ///
    label booktabs nonum gaps noobs ///
    compress

t 检验本身并没有什么特别之处。只是我们以一种新的方式使用了选项cells(),这使表格看起来比较复杂:

可以使用存储在 e 类局部变量中的任何信息来构造类似的表。

表 10:不同对照组的汇总统计

有时我们希望按不同的组生成描述性统计表。请注意, "by" 组不是相互排斥的,其他变量可以在类别中有重叠。例如,在世界、欧洲、欧盟、欧元区等高收入国家中,有很高的重叠,但也有其他国家。

此时,我们无需使用 tabstat,只需借助 eststo 命令,辅以 summarize 命令,将符合特定条件的结果存入内存即可:

est clear
eststo grp1: estpost summ $vars 
eststo grp2: estpost summ $vars if region==1  
eststo grp3: estpost summ $vars if dummy==1
eststo grp4: estpost summ $vars if pop > 2000

其中,描述性统计数据存储在 grp* 中。接下来,可以使用 esttab 命令将 estto 收集在内存中的 分样本统计结果 grp1-grp4 整合在一张表格中:

esttab grp*, main(mean %6.2f) aux(sd) nogap ///
             mtitle("All" "N. East" "Coasts" "High pop")
			 
----------------------------------------------------------------------------
                      (1)             (2)             (3)             (4)   
                      All         N. East          Coasts        High pop   
----------------------------------------------------------------------------
pop               4518.15         5459.48         4195.81         6358.03   
                 (4715.0)        (5925.2)        (6051.5)        (4866.8)   
pop65p             509.50          674.65          471.35          720.54   
                  (538.9)         (738.8)         (686.3)         (555.0)   
medage              29.54           31.23           29.49           29.95   
                  (1.693)         (1.023)         (2.098)         (1.473)   
death               39.47           53.00           36.52           55.89   
                  (41.74)         (59.29)         (54.09)         (42.91)   
marriage            47.70           44.48           42.77           63.83   
                  (45.13)         (47.57)         (53.08)         (44.75)   
divorce             23.68           19.30           20.35           32.93   
                  (25.09)         (19.58)         (28.86)         (26.44)   
----------------------------------------------------------------------------
N                      50               9              22              33   
----------------------------------------------------------------------------
mean coefficients; sd in parentheses
* p<0.05, ** p<0.01, *** p<0.001

最后,使用如下命令输出为 LaTeX 格式:

esttab grp* using "./graphs/guide80/table10.tex", replace ///
    main(mean %8.2fc) aux(sd %8.2fc) nostar ///
    nonumber unstack compress ///
    nonote noobs gap label booktabs ///
    collabels(none) ///
    mtitle("All" "N. East" "Coasts" "High pop")

生成表格如下:

2.2 回归结果

对于回归结果输出的命令 estout,已有很多的在线示例。在这里主要介绍一些例子来解释如何生成回归表。它们处理非标准方面,如滞后项、交互项以及从回归、堆叠变量等的组合中生成表。

让我们从回归表格的核心部分开始,在这里一次性生成所有数字。

基本回归部分 1(Block 1):

在这里,我们一次性生成结果。实际上是一系列因变量回归到一系列自变量上。自变量可以变化,但有一些共同的部分。对于 Block 1,我们需要根据显示出的内容对结果进行格式化,并添加页眉和页脚。具体步骤如下:

首先,让我们加载并清理数据:

webuse nlswork, clear
xtset idcode year
gen age2      = age^2
gen ttl_exp2  = ttl_exp^2
gen tenure2   = tenure^2
gen black     = (race==2)lab var age      "Age"
lab var age2     "Age sq."lab var ttl_exp  "Work experience"
lab var ttl_exp2 "Work experience sq."lab var tenure   "Job tenure"
lab var tenure2  "Job tenure eq."lab var not_smsa "SMSA (=1)"
lab var black    "Black (=1)"
lab var south    "South (=1)"
lab var union    "Union (=1)"

回归 1:构建基础块(block)

让我们从两个基本回归开始。在第一个回归中,我们用几个变量对工资对数ln_w进行了回归。第二个回归只是在第一个回归的基础上增加了一些控制变量。(这些回归只是为了举例,没有经济意义)

在下面的代码中,我们还通过调用命令eststo来存储面板回归的估计:

est clear
eststo: xtreg ln_w age* ttl_exp* tenure* not_smsa, vce(robust)
eststo: xtreg ln_w age* ttl_exp* tenure* not_smsa black south, vce(robust)

运行以上命令,在 Stata 中显示:

在运行结果底部会申明回归结果已经被存储。

这些存储的估计值显示如下:

esttab
esttab, label

第一个选项按原样显示输出,而第二个选项使用我们之前定义的变量标签显示输出:

让我们设置小数点位数,并删除列标题(因为这是多余信息):

esttab, b(3) se(3) nomtitle label

这样输出更为简洁:

下一步是非常重要的:esttab默认情况下显著性水平显示为5%,1%和0.1%,而我们需要对进行设定,让***,** 和 * 分别代表10%,5%和1% 的显著性水平。设定如下:

esttab, b(3) se(3) nomtitle label star(* 0.10 ** 0.05 *** 0.01)

结果如下表所示:

虽然在这个例子中,设定前后星星没有变化,但在其他的例子中可能有很大的不同。

接下来,以LaTeX格式导出该表,主要有两种方式:第一是直接将其导出,并在Stata中格式化所有内容;第二是直接导出表体,然后在LaTeX中插入表的简介和格式。

对于带有标题和标签的第一个方法:

esttab using "./graphs/guide80/regression1_1.tex", replace ///
    b(3) se(3) nomtitle label ///
    star(* 0.10 ** 0.05 *** 0.01) booktabs ///
    title("Basic regression table \label{reg1}") ///
    addnotes("Data: websuse nlswork" "Second line note")

这里,我们使用booktabs 简洁地格式化一个表。最后两行添加了标题和脚注。注意,在addnote选项中,可以通过使用一组新的引号开始新的行,如addnote("Line 1" "Line 2")

在 LaTeX 中需要输入以下代码:

\input{regression1_1.tex}

第二种方法只导出表的核心内容,不包含页眉和页脚:

esttab using "./graphs/guide80/regression1_2.tex", replace ///
    b(3) se(3) nomtitle label booktabs ///
    star(* 0.10 ** 0.05 *** 0.01) ///
    nonotes

为了将这个表添加到LaTeX中,我们需要如下代码:

有关这两个表的实现,请参阅 Overleaf。建议查看表格输出文件,可以使用安装在本地 LaTeX 编辑器中进行查看,也可以使用 Windows 中的任何文本阅读软件,如 Notepad 或Notepad++(强烈推荐)。下面是两个文件的 TeX 输出如下所示:

请注意第二个文件中缺少tabular的前导码。从第一个选项生成的表格在 LaTeX 中如下所示:

回归 2:在回归表的底部添加控件

大多数时候,当我们运行回归时,我们想要指示它是什么类型的回归。这是在回归表的底部突出显示的附加信息,可能是观察值、R2, F检验或其他值。

在这里,我们将学习如何在Stata中为LaTeX表添加这些信息。从一个基本的例子开始:

global controls age* ttl_exp* tenure* not_smsa south unionest cleareststo: xtreg ln_w $controls, re vce(robust)
estadd local  FE  "No"
estadd local  TE  "No"

其中,我们添加了关于使用固定效应(FE)还是时间效应(TE)的信息。注意,在输出中,用estadd选项生成 e 类局部变量:

我们可以通过输入以下命令来检查回归中存储的所有内容:

return list 
mat li r(table)

在顶部的行中,r(table)提供了变量名称。

通过添加更多回归变体并将它们存储在 estadd

est cleareststo: xtreg ln_w $controls, re vce(robust)
 estadd local  FE  "No"
 estadd local  TE  "No"
 
eststo: xtreg ln_w $controls, fe vce(robust)
 estadd local  FE "Yes"
 estadd local  TE "No"
 
eststo: xtreg ln_w $controls i.year, re vce(robust)
 estadd local  FE  "No"
 estadd local  TE  "Yes"eststo: xtreg ln_w $controls i.year, fe vce(robust)
 estadd local  FE  "Yes"
 estadd local  TE  "Yes"

请注意,在最后两组中,我们还添加了时间固定效应的虚拟变量。如果数据中年份很多,我们将得到一个非常大的回归表,因为每年都会有一个系数。所以需要修改要显示的内容:

esttab, ///
    b(3) se(3) ///
    keep($controls) ///
    star(* 0.10 ** 0.05 *** 0.01) ///
    label noobs nonotes nomtitle ///
    collabels(none) compress ///
    scalars("rho \$\rho\$" "TE Time Effects" "FE Fixed effects") ///
    sfmt(3 0)

我们将变量名称存储在全局宏$controls中。scalars选项控制显示的内容。在这里,我们选择了三个元素并确定它们的标签。sfmt可设置显示格式。在这里,我们说我们显示的第一个标量应该有三个 d.p.,而其余的为零。输出如下所示:

输出到 LaTeX 中显示::

esttab using "./graphs/guide80/regression2.tex", replace ///
    b(3) se(3) ///
    keep($controls) ///
    star(* 0.10 ** 0.05 *** 0.01) ///
    label booktabs noobs nonotes nomtitle ///
    collabels(none) compress alignment(D{.}{.}{-1}) ///
    scalars("rho \$\rho\$" "TE Time fixed effects" "FE Panel fixed effects") ///
    sfmt(3 0)

得到表格,底部有表注:

回归输出中存在的所有标量都可以在这里直接调用,例如 rho。此外,还可以使用estadd local指定其他标量。这还可以包括回归估计的计算,例如一些线性组合或转折点等。

回归 3:非常规系数

如果我们在回归中使用滞后或交互项,那么系数名称对于输出到 LaTeX 来说就不是那么简单了。让我们从一个简单的例子开始:

est clear
eststo: xtreg ln_w i.black#i.collgrad, vce(robust)

并通过输入mat li r(table)查看存储的表 :

如果你使用滞后项或交互项,并且不清楚变量的存储名称时,可以使用该表确定和选择变量名称。

假设我们只对交互系数感兴趣,即 Black x CollegeGrad,或者两个虚拟变量都等于1,导出这个系数:

esttab, ///
    keep(1.black#1.collgrad) ///
    coeflabel(1.black#1.collgrad "Black X College") ///
    b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) ///
    label nonotes nomtitle collabels(none)   ///
    b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) ///
    label nonotes nomtitle collabels(none)

我们得到了这个极简的输出:

现在,假设我们想要添加另一个具有滞后项的回归,并且我们也想报告该滞后项:

eststo: xtreg ln_w i.black#i.collgrad age L1.hours, vce(robust)

在表中滞后项名称为hours L1.,但这不是它存储的名称。可以输入r(table)进行检查:

在这里我们得到了正确的名称L.hours,将此添加到命令estout中,同时修改名称:

esttab, ///
    keep(1.black#1.collgrad L.hours) ///
    coeflabel(1.black#1.collgrad "Black X College" L.hours "Hours(t-1)") ///
    b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) ///
    label nonotes nomtitle collabels(none) ///
    compress

输入下方代码,将其导出至 LaTeX:

esttab using "./graphs/guide80/regression3.tex", replace ///
    keep(1.black#1.collgrad L.hours) ///
    coeflabel(1.black#1.collgrad "Black X College" L.hours "Hours(t-1)") ///
    b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) ///
    label booktabs noobs nonotes nomtitle ///
    collabels(none) compress alignment(D{.}{.}{-1})

回归 4:按组划分的回归

此示例展示了相同的因变量用于两个不同的回归设定,在这里使用了3个因变量。

我们介绍回归Block 2:

Block 2 中,结果部分的每一列表示 Block 1中的一组回归。它们仍然可以在一次循环中运行出,但需要不同的设定来区分它们。

首先使用全局来定义所有控制变量:

global controls age* ttl_exp* tenure* not_smsa south union
est clear

foreach x of varlist ln_wage hours wks_ue {
    eststo: xtreg `x' $controls, re vce(robust)
    estadd local FE "No"
    
    eststo: xtreg `x' $controls, fe vce(robust)
    estadd local FE "Yes"
}

输入esttab进行检查:

然后导出此表,并正确识别和标记回归:

esttab using "./graphs/guide80/regression4.tex", replace ///
    b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) ///
    label booktabs nonotes noobs nomtitle collabels(none) ///
    scalars("FE Fixed effects") sfmt(0) ///
    mgroups("Ln(Wages)" "Hours worked" "Weeks unemployed(t-1)", pattern(1 0 1 0 1 0) ///
        prefix(\multicolumn{@span}{c}{) suffix(}) span erepeat(\cmidrule(lr){@span})) ///
    alignment(D{.}{.}{-1})

mgroups选项进行了分组回归。由于每个因变量都有两个回归方程,因此它遵循 1 0 模式。如果每组有三个回归,那么它将是 1 0 0 1 0 0 ,依此类推。prefix() 添加了额外的 LaTeX 语法,同时需要在 erepeat()添加mgroups中定义的标题下添加行。

此 LaTeX 表格显示如下:

你还可以自定义列号和表页脚以添加更多信息。在这里,我们通过底部的 “Fixed effects” 行来区分列。你还可以进行其他分组,对不同的回归设置不同的控制变量等。

回归 5:多元回归中核心变量系数的显示

这部分介绍如何在表格中突出显示感兴趣变量的系数。我们经常在论文中遇到这样的表格,它显示了核心解释变量的系数,而不是显示所有回归系数的输出。

这个复杂的形式,我们称之为 Block 3:

这种表格格式将多个回归压缩成一个表,主要显示感兴趣的系数。这不仅需要水平循环,还需要垂直循环。意味着需要大量的代码操作才能得到我们想要的表格格式。

在我们的例子中,我们在一系列自变量上对三个因变量ln_wagehourswks_ue进行回归。我们希望每行针对四种不同聚类类型显示我们感兴趣变量的系数。因此,我们需要生成一个4行乘3列 (4x3) 的表。

为了在 Stata 中实现这一点,我们需要将表生成拆分为三个部分。最上方(Top panel)包含标题信息和第一组系数,中间部分(Middle panel)只包含了系数;底部(Bottom panel)包含最后一组系数和表脚注。执行代码如下:

Top panel

最上方部分代码如下:

**** top panel
est clear
foreach x of varlist ln_wage hours wks_ue {
    eststo: xtreg `x' i.black#i.collgrad, re vce(robust)
}

esttab using "./graphs/guide80/regression5.tex", replace f ///
    prehead(\begin{tabular}{l*{@M}{r}} \toprule) ///
    b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) ///
    keep(1.black#1.collgrad) ///
    varlabels(1.black#1.collgrad "Random effects") ///
    label booktabs noobs nonotes collabels(none) ///
    alignment(D{.}{.}{-1}) ///
    mtitles("Ln(Wages)" "Hours worked" "Weeks unemployed(t-1)")

我们在这里只保留了交互项。请注意,可以输入mat li r(table)看到名称,使用选项coeflabel手动标记它。

Middle panels

Middle panels 关闭了标签和线条的所有选项:

*** center panel 1 ***
est clear
foreach x of varlist ln_wage hours wks_ue {
    eststo: xtreg `x' i.black#i.collgrad i.year, re
}
esttab using "./graphs/guide80/regression5.tex", append f ///
    b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) /// 
    keep(1.black#1.collgrad) ///
    varlabels(1.black#1.collgrad "Year effects") ///
    label booktabs nodep nonum nomtitles nolines noobs nonotes ///
    collabels(none) alignment(D{.}{.}{-1})

*** center panel 2 ***
est clear
foreach x of varlist ln_wage hours wks_ue {
    eststo: xtreg `x' i.black#i.collgrad, be
}
esttab using "./graphs/guide80/regression5.tex", append f ///
    b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) /// 
    keep(1.black#1.collgrad) ///
    varlabels(1.black#1.collgrad "Between effects") ///
    label booktabs nodep nonum nomtitles nolines noobs nonotes ///
    collabels(none) alignment(D{.}{.}{-1})

每个部分都是单独生成的,并使用append选项附加到原始文件中。f选项代表片段,只存储数字,不存储其他任何内容。同时关闭了所有行以及列页眉和页脚。

Bottom panel

底部是最复杂的部分,因为在这里我们用 varlabels 代替 coeflabel,它可以覆盖很多内部的 estout 代码(所以要小心使用)。

*** bottom panel ***
est clear
foreach x of varlist ln_wage hours wks_ue {
    eststo: xtreg `x' i.black#i.collgrad, pa
}
esttab using "./graphs/guide80/regression5.tex", append f ///
    postfoot(\bottomrule \end{tabular}) ///
    b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) /// 
    keep(1.black#1.collgrad) ///
    varlabels(1.black#1.collgrad "Pop.-avg. estimator", elist(1.black#1.collgrad \bottomrule)) ///
    label booktabs collabels(none) nomtitles nolines nonum ///
    alignment(D{.}{.}{-1}) sfmt(%6.0fc)

在这里,我们使用 noline 取消表横线,并在varlabels选项中使用elist\bottomrule 手动指定一行。请注意,bottomrule 是 LaTeX 中的一个 booktabs 选项。对于没有booktabs的表,bottomrule 可以替换为 hline。我们再次将这部分附加到原始文件中。

执行上述代码,得到下面的 4x3 的表:

此表还可以扩展成在页脚中显示分组列、标量和局部变量。

回归 6:堆叠标准误差

这部分介绍将把不同回归的标准误差堆叠在一起,其中参数的平均值是相同的。例如,随机效应或聚类模型,或对s.e.进行空间调整的模型。这种展示方式更加简洁。

为此,我们只需运行一个回归,但在 esttab 输出中修改代码以跳过表的底部部分(如前面的示例所示),还需将平均值前面的星号移动到标准误:

est clear
foreach x of varlist ln_wage hours wks_ue {
    eststo: xtreg `x' i.black#i.collgrad, re
}

esttab using "./graphs/guide80/regression6.tex", replace f ///
    prehead(\begin{tabular*}{\textwidth}{@{\hskip\tabcolsep\extracolsep\fill}l*{@M}{r}} \toprule) ///
    cells(b(fmt(3)) se(fmt(3) star par)) ///
    keep(1.black#1.collgrad) ///
    varlabels(1.black#1.collgrad "Black X College") ///
    label booktabs noobs nonotes collabels(none) ///
    star(* 0.10 ** 0.05 *** 0.01) ///
    alignment(D{.}{.}{-1}) ///
    mtitles("Ln(Wages)" "Hours worked" "Weeks unemp.(t-1)")

现在生成第二个回归,这里只是保留了S.E.,将值放在方括号中,并附加到原始文件中:

est clear
foreach x of varlist ln_wage hours wks_ue {
    eststo: xtreg `x' i.black#i.collgrad, be
}

esttab using "./graphs/guide80/regression6.tex", append f ///
    postfoot(\bottomrule \end{tabular*}) ///
    cells(se(fmt(3) star par([ ]))) noobs ///
    keep(1.black#1.collgrad) ///
    varlabels(1.black#1.collgrad " ", elist(1.black#1.collgrad \bottomrule)) ///
    star(* 0.10 ** 0.05 *** 0.01) ///
    alignment(D{.}{.}{-1}) ///
    label booktabs nomtitle noline nonumber ///
    collabels(none) scalars("N Obs.") sfmt(%6.0fc)

我们得到这张表:

这里很容易看出哪个模型给出了什么结果。这种类型的表格输出部分受到了Melissa Dell’s Mining Mita 论文的启发。我们也借鉴它来显示稳健性和空间稳健标准误等。

回归 7:旋转表格

旋转表格是常见的操作,因为当我们希望输出所有回归结果时,有时只适合宽格式的表显示结果。

让我们对两种不同设定的回归进行循环:一种没有控制,一种有控制:

global controls age* ttl_exp* tenure* not_smsa south union
est clear
foreach x of varlist ln_wage hours wks_ue {
    eststo: xtreg `x' $controls i.year, re
    estadd local eff "RE"
    
    eststo: xtreg `x' $controls i.year, fe
    estadd local eff "FE"
    
    eststo: xtreg `x' $controls i.year, be
    estadd local eff "BE"
}

在 Stata 窗口中显示如下:

esttab, keep($controls _cons) label

请注意,在选项keep中使用了变量名和通配符L*,其中保留了所有滞后并选择了全局$controls中使用的变量名。

执行下方代码输出:

esttab using "./graphs/guide80/regression7.tex", replace ///
    b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) ///
    keep($controls _cons) ///
    label booktabs nonotes noobs nomtitle ///
    collabels(none) scalars("N Obs." "eff Controls") ///
    sfmt(0) mgroups("Ln(Wages)" "Hours worked" "Weeks unemp.(t-1)", ///
    pattern(1 0 0 1 0 0 1 0 0) prefix(\multicolumn{@span}{c}{) ///
    suffix(}) span erepeat(\cmidrule(lr){@span})) ///
    alignment(D{.}{.}{-1})

在Overleaf(参见文档)中,调用 rotating允许我们使用 \sidewaystable,我们得到这个表:

3. 总结

以上是本指南的全部内容,读者们可以根据自己的需求在以上代码中进行修改,也可以探索更多选项的使用。

当然网上还有很多其他很棒的资源,涵盖了多个 Stata-to-LaTeX 包,例如 GitHub - lukestein/stata-latex-workflows: Stata Workflows for LaTeX OutputStata Coding Guide - Julian ReifGitHub - avila/mat2tex: little stata program to generate body of LaTeX tables from a stata matrix (adapted from mat2txt)

当然,上述表格生成过程可能还有其他更好的选择。如果您有任何建议,请在 GitHub 页面上打开一个 Issue,并提出意见和建议。

4. 参考资料

  • Asjad Naqvi, The Stata-to-LaTeX guide, Blog, 2023, -Link-
  • Overleaf 文档:Stata-to-Latex guide on Overleaf -Link
  • estout: Making regression tables in Stata -Link
  • estout: Introductory examples for estout -Link

5. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh LaTex esttab estout, md0 nocat
安装最新版 lianxh 命令:
ssc install lianxh, replace

资源共享


尊敬的老师 / 亲爱的同学们:
连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。
请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。
我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!https://www.wjx.cn/vm/YgPfdsJ.aspx# 再次感谢大家宝贵的意见!


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。more……
  • 扫码加入连享会微信群,提问交流更方便