如何在 LaTeX 表格中仅显示四舍五入为整数的系数?
How to show only coefficients rounded to whole numbers in LaTeX tables?
使用 R 的 stargazer
在 LaTeX 中生成 Table 效果很好。
但我不知道如何将我的数字格式化为整数( 相关,但不同)。
由于数据规模,我希望系数和标准误差不显示小数。因此,我使用选项 digits=0
。但是,此选项也会从模型拟合统计中删除小数(例如 R2 = 0
而不是 R2 = 0.42
)。 table的"top"和"bottom"部分如何设置不同的舍入规则?
使用正则表达式,我们可以用四舍五入的值替换 LaTeX 输出中的特定数字 s
。
由于 texreg
包目前似乎比 stargazer
维护得更好,我将两者都包含在答案中。
虽然很难概括一个解决方案,因为回归结果可能总是不同的,但这里有一个想法。
(fit <- lm(mpg ~ hp + cyl, mtcars))
# Call:
# lm(formula = mpg ~ hp + cyl, data = mtcars)
#
# Coefficients:
# (Intercept) hp cyl
# 36.90833 -0.01912 -2.26469
s <- stargazer::stargazer(fit, header=FALSE, digit.separator="")
texreg
用户会做:
tmp <- tempfile()
texreg::texreg(fit, file=tmp)
s <- readLines(tmp)
为此,首先,我们希望子集 s
不包括 GOF。我们也不想替换括号内的 LaTeX 格式命令。
s.sub1 <- 1:(grep("Observations", s) - 1) ## stargazer
s.sub1 <- 1:(grep("R$^2$", s, fixed=TRUE) - 1) ## texreg
re <- regexpr("(\d+\.\d+)(?![^[]*\])", s[s.sub1], perl=TRUE)
toInt <- regmatches(s[s.sub1], re)
v.repl <- round(as.double(toInt), digits=0)
s.sub2 <- which(attr(re, "match.length")[s.sub1] > 1)
在我们获得替换 v.repl
之后,我们在第二步中使用 mapply
将小数替换为四舍五入为整数的值。
s[s.sub2] <- mapply(function(x, y) gsub("(\d+\.\d+)(?![^[]*\])", x, y, perl=TRUE),
v.repl, s[s.sub2])
结果
stargazer
# \begin{table}[!htbp] \centering
# \caption{}
# \label{}
# \begin{tabular}{@{\extracolsep{5pt}}lc}
# \[-1.8ex]\hline
# \hline \[-1.8ex]
# & \multicolumn{1}{c}{\textit{Dependent variable:}} \
# \cline{2-2}
# \[-1.8ex] & mpg \
# \hline \[-1.8ex]
# hp & $-[=14=] \
# & (0) \
# & \
# cyl & $-$^{***}$ \
# & (1) \
# & \
# Constant & 37$^{***}$ \
# & (2) \
# & \
# \hline \[-1.8ex]
# Observations & 32 \
# R$^{2}$ & 0.741 \
# Adjusted R$^{2}$ & 0.723 \
# Residual Std. Error & 3.173 (df = 29) \
# F Statistic & 41.422$^{***}$ (df = 2; 29) \
# \hline
# \hline \[-1.8ex]
# \textit{Note:} & \multicolumn{1}{r}{$^{*}$p$<[=14=].1; $^{**}$p$<[=14=].05; $^{***}$p$<[=14=].01} \
# \end{tabular}
# \end{table}
texreg
# \begin{table}
# \begin{center}
# \begin{tabular}{l c}
# \hline
# & Model 1 \
# \hline
# (Intercept) & ^{***}$ \
# & $(2)$ \
# hp & $-0$ \
# & $(0)$ \
# cyl & $-2^{***}$ \
# & $(1)$ \
# \hline
# R$^2$ & [=15=].74$ \
# Adj. R$^2$ & [=15=].72$ \
# Num. obs. & $ \
# \hline
# \multicolumn{2}{l}{\scriptsize{$^{***}p<0.001$; $^{**}p<0.01$; $^{*}p<0.05$}}
# \end{tabular}
# \caption{Statistical models}
# \label{table:coefficients}
# \end{center}
# \end{table}
注意: 要使系数对齐,您可能需要查看 LaTeX 的 siunitx
包。这里是 starter on tex.stackexchange. Read here 如何在 Rmarkdown 中包含 LaTeX 包。
stargazer
在 LaTeX 中生成 Table 效果很好。
但我不知道如何将我的数字格式化为整数(
由于数据规模,我希望系数和标准误差不显示小数。因此,我使用选项 digits=0
。但是,此选项也会从模型拟合统计中删除小数(例如 R2 = 0
而不是 R2 = 0.42
)。 table的"top"和"bottom"部分如何设置不同的舍入规则?
使用正则表达式,我们可以用四舍五入的值替换 LaTeX 输出中的特定数字 s
。
由于 texreg
包目前似乎比 stargazer
维护得更好,我将两者都包含在答案中。
虽然很难概括一个解决方案,因为回归结果可能总是不同的,但这里有一个想法。
(fit <- lm(mpg ~ hp + cyl, mtcars))
# Call:
# lm(formula = mpg ~ hp + cyl, data = mtcars)
#
# Coefficients:
# (Intercept) hp cyl
# 36.90833 -0.01912 -2.26469
s <- stargazer::stargazer(fit, header=FALSE, digit.separator="")
texreg
用户会做:
tmp <- tempfile()
texreg::texreg(fit, file=tmp)
s <- readLines(tmp)
为此,首先,我们希望子集 s
不包括 GOF。我们也不想替换括号内的 LaTeX 格式命令。
s.sub1 <- 1:(grep("Observations", s) - 1) ## stargazer
s.sub1 <- 1:(grep("R$^2$", s, fixed=TRUE) - 1) ## texreg
re <- regexpr("(\d+\.\d+)(?![^[]*\])", s[s.sub1], perl=TRUE)
toInt <- regmatches(s[s.sub1], re)
v.repl <- round(as.double(toInt), digits=0)
s.sub2 <- which(attr(re, "match.length")[s.sub1] > 1)
在我们获得替换 v.repl
之后,我们在第二步中使用 mapply
将小数替换为四舍五入为整数的值。
s[s.sub2] <- mapply(function(x, y) gsub("(\d+\.\d+)(?![^[]*\])", x, y, perl=TRUE),
v.repl, s[s.sub2])
结果
stargazer
# \begin{table}[!htbp] \centering
# \caption{}
# \label{}
# \begin{tabular}{@{\extracolsep{5pt}}lc}
# \[-1.8ex]\hline
# \hline \[-1.8ex]
# & \multicolumn{1}{c}{\textit{Dependent variable:}} \
# \cline{2-2}
# \[-1.8ex] & mpg \
# \hline \[-1.8ex]
# hp & $-[=14=] \
# & (0) \
# & \
# cyl & $-$^{***}$ \
# & (1) \
# & \
# Constant & 37$^{***}$ \
# & (2) \
# & \
# \hline \[-1.8ex]
# Observations & 32 \
# R$^{2}$ & 0.741 \
# Adjusted R$^{2}$ & 0.723 \
# Residual Std. Error & 3.173 (df = 29) \
# F Statistic & 41.422$^{***}$ (df = 2; 29) \
# \hline
# \hline \[-1.8ex]
# \textit{Note:} & \multicolumn{1}{r}{$^{*}$p$<[=14=].1; $^{**}$p$<[=14=].05; $^{***}$p$<[=14=].01} \
# \end{tabular}
# \end{table}
texreg
# \begin{table}
# \begin{center}
# \begin{tabular}{l c}
# \hline
# & Model 1 \
# \hline
# (Intercept) & ^{***}$ \
# & $(2)$ \
# hp & $-0$ \
# & $(0)$ \
# cyl & $-2^{***}$ \
# & $(1)$ \
# \hline
# R$^2$ & [=15=].74$ \
# Adj. R$^2$ & [=15=].72$ \
# Num. obs. & $ \
# \hline
# \multicolumn{2}{l}{\scriptsize{$^{***}p<0.001$; $^{**}p<0.01$; $^{*}p<0.05$}}
# \end{tabular}
# \caption{Statistical models}
# \label{table:coefficients}
# \end{center}
# \end{table}
注意: 要使系数对齐,您可能需要查看 LaTeX 的 siunitx
包。这里是 starter on tex.stackexchange. Read here 如何在 Rmarkdown 中包含 LaTeX 包。