Добавление мультиколонок в мой вывод texreg

Я хочу сделать таблицу с сгруппированными столбцами через texreg, Я вижу только варианты для сгруппированных строк (groups).

Вот пример:

set.seed(01349)
DF <- data.frame(y = rnorm(100), x1A = rnorm(100), x2A = rnorm(100),
                 x1B = rnorm(100), x2B = rnorm(100))
regs <- lapply(paste0("x", 1:2, c("A", "A", "B", "B")), function(x)
          lm(paste0("y ~ ", x), data = DF))

Вот как можно ближе с простой texreg:

texreg(regs, custom.coef.names = c("Intercept", rep("x", 4)),
       custom.model.names = c("1", "2", "1", "2"))

С выходом LaTeX:

\begin{table}
\begin{center}
\begin{tabular}{l c c c c }
\hline
           & 1 & 2 & 1 & 2 \\
\hline
Intercept  & $-0.13$  & $-0.13$  & $-0.11$  & $-0.11$  \\
           & $(0.12)$ & $(0.12)$ & $(0.12)$ & $(0.12)$ \\
x          & $0.02$   & $0.07$   & $0.13$   & $-0.11$  \\
           & $(0.13)$ & $(0.12)$ & $(0.12)$ & $(0.13)$ \\
\hline
R$^2$      & 0.00     & 0.00     & 0.01     & 0.01     \\
Adj. R$^2$ & -0.01    & -0.01    & 0.00     & -0.00    \\
Num. obs.  & 100      & 100      & 100      & 100      \\
RMSE       & 1.18     & 1.17     & 1.17     & 1.17     \\
\hline
\multicolumn{5}{l}{\scriptsize{$^{***}p<0.001$, $^{**}p<0.01$, $^*p<0.05$}}
\end{tabular}
\caption{Statistical models}
\label{table:coefficients}
\end{center}
\end{table}

Я бы предпочел дополнительную строку (выделено % Комментарии):

\begin{table}
\begin{center}
\begin{tabular}{l c c c c }
\hline
%*************A HEADER LINE HERE*********************
 & \multicolumn{2}{c}{A} & \multicolumn{2}{c}{B} \\ %
%****************************************************
           & 1 & 2 & 1 & 2 \\
\hline
Intercept  & $-0.13$  & $-0.13$  & $-0.11$  & $-0.11$  \\
           & $(0.12)$ & $(0.12)$ & $(0.12)$ & $(0.12)$ \\
x          & $0.02$   & $0.07$   & $0.13$   & $-0.11$  \\
           & $(0.13)$ & $(0.12)$ & $(0.12)$ & $(0.13)$ \\
\hline
R$^2$      & 0.00     & 0.00     & 0.01     & 0.01     \\
Adj. R$^2$ & -0.01    & -0.01    & 0.00     & -0.00    \\
Num. obs.  & 100      & 100      & 100      & 100      \\
RMSE       & 1.18     & 1.17     & 1.17     & 1.17     \\
\hline
\multicolumn{5}{l}{\scriptsize{$^{***}p<0.001$, $^{**}p<0.01$, $^*p<0.05$}}
\end{tabular}
\caption{Statistical models}
\label{table:coefficients}
\end{center}
\end{table}

Я что-то упустил, или нет встроенного способа сделать это?

Мой обходной путь:

x <- capture.output(texreg(
  regs, custom.coef.names = c("Intercept", rep("x", 4)),
  custom.model.names = c("1", "2", "1", "2")))

x[6] <- paste0("& \\multicolumn{2}{c}{A} & \\multicolumn{2}{c}{B} \\\\ \n", x[6])

cat(x, sep = "\n")

Но это, очевидно, немного клейкая лента.

1 ответ

Решение

Вы можете прочитать код function набрав его в консоли или из github веб-сторона пакета texreg,

texreg
function (l, file = NULL, single.row = FALSE, stars = c(0.001, 
    0.01, 0.05), custom.model.names = NULL,...

Это вывод texreg для стола из 4 моделей:

\begin{table}
\begin{center}
\begin{tabular}{l c c c c }
\hline
 & Model 1 & Model 2 & Model 3 & Model 4 \\

Я посмотрел на строку кода 469, начало таблицы:

 string <- paste0(string, "\\begin{tabular}{", coldef, 
            "}", linesep)

Затем я добавил некоторые свои собственные изменения:

string <- paste0(string, "\\begin{tabular}{", coldef, 
            "}", linesep)
        ## Additions
        string <- paste0(string, "\\\\[-1.8ex]\\hline", linesep)
        string <- paste0(string, "& \\multicolumn{", length(l), "}{c}{\\textit{Dependent variable:}} \\\\", linesep)
        string <- paste0(string, "\\cline{2-5}", linesep)
        string <- paste0(string, "\\\\[-1.8ex] & \\multicolumn{", length(l), "}{c}{", dep.var, "} \\\\", linesep)

Затем сохраните функцию с другим именем, например:

texreg2 <- function (l, file = NULL, single.row = FALSE, ...)

Теперь для этой функции требуются внутренние функции из пакета, поэтому вам нужно присоединить свою пользовательскую функцию к пространству имен пакета в вашей среде. Очень просто:

environment(texreg2) <- asNamespace('texreg')

Теперь вы можете вызвать вашу новую функцию. Мои дополнения включают три строки и имя зависимой переменной, аналогично stargazer,

texreg2(out, dep.var = "Normalize Citation Score")

\begin{table}
\begin{center}
\begin{tabular}{l c c c c }
\\[-1.8ex]\hline
& \multicolumn{4}{c}{\textit{Dependent variable:}} \\
\cline{2-5}
\\[-1.8ex] & \multicolumn{4}{c}{Normalize Citation Score} \\
\hline
 & Model 1 & Model 2 & Model 3 & Model 4 \\

Наконец, если вам не нравится этот метод, вы можете манипулировать выводом с помощью regexПроверь этот вопрос.

Это может быть поздно, но все же полезно.

Новая версия texreg(1.36.28) только что вышла на GitHub (еще не на CRAN, 22 мая 2020 г.). Он добавляет опциюcustom.header для создания групп регрессий.

Применительно к вашему примеру он создает:

library(texreg)

set.seed(01349)
DF <- data.frame(y = rnorm(100), x1A = rnorm(100), x2A = rnorm(100),
                 x1B = rnorm(100), x2B = rnorm(100))
regs <- lapply(paste0("x", 1:2, c("A", "A", "B", "B")), function(x)
  lm(paste0("y ~ ", x), data = DF))

screenreg(
  regs, 
  custom.header = list("A" = 1:2, "B" = 3:4),
  custom.coef.names = c("Intercept", rep("x", 4)),
  custom.model.names = c("1", "2", "1", "2"),
)

=============================================
                   A                 B       
           ----------------  ----------------
           1        2        1        2      
---------------------------------------------
Intercept   -0.13    -0.13    -0.11    -0.11 
            (0.12)   (0.12)   (0.12)   (0.12)
x            0.02     0.07     0.13    -0.11 
            (0.13)   (0.12)   (0.12)   (0.13)
---------------------------------------------
R^2          0.00     0.00     0.01     0.01 
Adj. R^2    -0.01    -0.01     0.00    -0.00 
Num. obs.  100      100      100      100    
=============================================
*** p < 0.001; ** p < 0.01; * p < 0.05

я использовал screenreg() чтобы легче было показать результат, но он работает с texreg() тоже.

Другие вопросы по тегам