我遇到了以下问题:我正在从 Stata 导出回归输出并将其输入到我的 LaTex 文档中。我的目标是在 latex 中编写页眉和页脚,然后简单地输入原始“表格数据” \input{}
。我使用 tabularx 并在小数点处对齐。但我还想打印表格中的观察值数量。这些值大约在 250-1500 之间,可以说是在小数点处对齐,但由于它们没有小数,因此会产生小数点对齐的视觉效果。我宁愿将它们置于列的中心。我知道可以通过在\mulitcolumn{}{}{}
它周围放置一个环境来实现这一点,但这需要在每次更新由 Stata 创建的表格时进行手动更改。我正在寻找一个可扩展的解决方案。是否可以以某种方式定义一个足够灵活的列类型,以将小数点 {-1,1} 之间的数字对齐,并将没有小数的数字置于中心。
这是我的表格的一个例子:
\newcolumntype{Y}{D..{1.5}}
\newcolumntype{L}[1]{>{\raggedright}p{#1}}
\begin{table}
\begin{minipage}{\textwidth}
{\footnotesize
\lipsum[5]}
\end{minipage}
\begin{tabularx}{\textwidth}{L{3.8cm} @{\extracolsep{\fill}}*{2}{Y}}
\toprule
\multicolumn{1}{l}{} & \multicolumn{1}{c}{(1)} & \multicolumn{1}{c}{(2)} \\
\midrule
\input{tab}
\midrule
Firm FE & \multicolumn{1}{c}{X}& \multicolumn{1}{c}{X} \\
Time FE & \multicolumn{1}{c}{X}& \multicolumn{1}{c}{X} \\
\bottomrule
\end{tabularx}
\end{table}
其中文件 tab.tex 直接从 Stata 保存,包含以下代码:
Variable 1 & 0.012 & -0.542 \\
Variable 2 & 0.523 & 0.235 \\
\midrule
No. of Obs. & 1459 & 255 \\
答案1
我最近尝试做类似的事情,但没有找到从 LaTeX 方面解决它的方法。从 Stata 方面,可以通过稍微修改输出表来完成。这是使用 的 Stata 代码esttab
:
clear all
set more off
set obs 1000
gen x1 = rnormal()
gen x2 = rnormal()
gen y = 1+2*x1+3*x2+rnormal()
gen z = 1+3*x1+2*x2+rnormal()
eststo clear
eststo: reg y x1 x2
estadd local firm "\multicolumn{1}{c}{X}"
estadd local year "\multicolumn{1}{c}{X}"
estadd local obs "\multicolumn{1}{c}{`e(N)'}"
eststo: reg z x1 x2
estadd local firm "\multicolumn{1}{c}{X}"
estadd local year "\multicolumn{1}{c}{X}"
estadd local obs "\multicolumn{1}{c}{`e(N)'}"
esttab using table.tex, replace b(a3) nonum mtitles("y" "z") ///
starlevels($^{*}$ .1 $^{**}$ .05 $^{***}$ 0.01) ///
se label nonotes noobs booktabs align(S) ///
scalars("obs No. of Obs." "firm Firm FE" "year Year FE")
如您所见,它不仅报告观察次数,还发出所有代码\multicolumn
。此外,它使用S
对齐字符,假定使用siunitx
。相应的 LaTeX 代码可以是以下(关键siunitx
设置是input-symbols={()}
,没有它,标准错误就无法解析):
\documentclass[twocolumn]{article}
\usepackage{siunitx,booktabs}
\sisetup{group-digits=false,parse-numbers=true,input-symbols={()},table-align-text-post=false,
table-number-alignment=center,table-figures-integer=3,table-figures-decimal=5}
\begin{document}
\begin{table}[ht]
\input{table}
\end{table}
\end{document}
为了供参考,我还展示了生成的table.tex
:
{
\def\sym#1{\ifmmode^{#1}\else\(^{#1}\)\fi}
\begin{tabular}{l*{2}{S}}
\toprule
&\multicolumn{1}{c}{y}&\multicolumn{1}{c}{z}\\
\midrule
x1 & 1.952$^{***}$& 2.971$^{***}$\\
& (0.0318) & (0.0314) \\
\addlinespace
x2 & 3.013$^{***}$& 1.992$^{***}$\\
& (0.0308) & (0.0304) \\
\addlinespace
Constant & 1.067$^{***}$& 0.987$^{***}$\\
& (0.0310) & (0.0306) \\
\midrule
No. of Obs. &\multicolumn{1}{c}{1000} &\multicolumn{1}{c}{1000} \\
Firm FE &\multicolumn{1}{c}{X} &\multicolumn{1}{c}{X} \\
Year FE &\multicolumn{1}{c}{X} &\multicolumn{1}{c}{X} \\
\bottomrule
\end{tabular}
}
另一个想法可能是使用某种后处理器并\multicolumn
在表生成后添加内容。
答案2
您可以使用siunitx
。这需要对表格代码进行一些调整,但效果要好得多。
您希望条目在其S
列中居中,只需将其括起来输入即可。
\documentclass[twocolumn]{article}
\usepackage{siunitx,booktabs}
\begin{document}
\begin{table}[ht]
\begin{tabular*}{\columnwidth}{
@{\extracolsep{\fill}}
l
S[table-format=1.3]
S[table-format=-1.3]
}
\toprule
& {(1)} & {(2)} \\
\midrule
Variable 1 & 0.012 & -0.542 \\
Variable 2 & 0.523 & 0.235 \\
\midrule
No. of Obs. & {1459} & {255} \\
\midrule
Firm FE & {X}& {X} \\
Time FE & {X}& {X} \\
\bottomrule
\end{tabular*}
\end{table}
\end{document}
我用了twocolum
,希望你有一张两栏纸(三栏表格的宽度与全局文本宽度一样宽非常难以阅读)。