Обтекание пользовательских заметок в выводе texreg

Я пытаюсь добавить довольно длинную заметку в нижней части таблицы, созданной texreg; Я хочу, чтобы это просто обернулось вокруг, но, похоже, в функцию не встроено никаких функций для этого.

Взять, например:

texreg(lm(speed~dist,data=cars),
       custom.note=paste("%stars. This regression should be",
                         "intepreted with strong caution as",
                         "it is likely plagued by extensive",
                         "omitted variable bias"))

Что при компиляции дает что-то вроде:

простой техрег

Форматирование ужасно; намного лучше было бы что-то вроде замены стандартного вывода:

\multicolumn{2}{l}{\scriptsize{$^{***}p<0.001$, $^{**}p<0.01$, $^*p<0.05$. This regression should be intepreted with strong caution as it is likely plagued by extensive omitted variable bias}}

С более удобоваримой упаковкой:

\multicolumn{2}{l}{\scriptsize{$^{***}p<0.001$, $^{**}p<0.01$, $^*p<0.05$.}} \\
\multicolumn{2}{l}{\scriptsize{This regression should be intepreted with}} \\
\multicolumn{2}{l}{\scriptsize{strong caution as it is likely plagued by}} \\
\multicolumn{2}{l}{\scriptsize{extensive omitted variable bias}}

Что дает вывод гораздо ближе к тому, что я ищу:

предпочтительный выход

Есть ли способ сделать это программно?

2 ответа

Решение

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

Соответственно, пользовательская заметка заканчивается \multicolumn в коде LaTeX, поэтому мы не можем использовать команды разрыва строки, такие как par или же \\, Но мы можем добиться автоматического разрыва линии с \parbox, Если мы все еще хотим произвольный разрыв строки, мы можем использовать четыре обратных слеша \\\\, Для лучшего форматирования мы можем использовать \\vspace{2pt} только в начале текстового содержания:

texreg(lm(speed ~ dist, data = cars),
       custom.note = ("\\parbox{.4\\linewidth}{\\vspace{2pt}%stars. \\\\
       This regression should be intepreted with strong caution as it is 
       likely plagued by extensive omitted variable bias.}"))

С версией 1.37.1 (выпущенной в мае 2020 г.), texreg вводит threeparttable аргумент, который использует threeparttable Пакет LaTeX, который был разработан для этой цели.

Пример кода R:

texreg(lm(speed ~ dist, data = cars),
       custom.note = paste("\\item %stars. This regression",
                           "should be interpreted with strong",
                           "caution as it is likely plagued by",
                           "extensive omitted variable bias."),
       single.row = TRUE,
       threeparttable = TRUE)

Выход:

\begin{table}
\begin{center}
\begin{threeparttable}
\begin{tabular}{l c}
\hline
 & Model 1 \\
\hline
(Intercept) & $8.28 \; (0.87)^{***}$ \\
dist        & $0.17 \; (0.02)^{***}$ \\
\hline
R$^2$       & $0.65$                 \\
Adj. R$^2$  & $0.64$                 \\
Num. obs.   & $50$                   \\
\hline
\end{tabular}
\begin{tablenotes}[flushleft]
\scriptsize{\item $^{***}p<0.001$; $^{**}p<0.01$; $^{*}p<0.05$. This regression should be interpreted with strong caution as it is likely plagued by extensive omitted variable bias}
\end{tablenotes}
\end{threeparttable}
\caption{Statistical models}
\label{table:coefficients}
\end{center}
\end{table}

Это отображается как:

Обратите внимание, что пользовательское примечание должно начинаться с \\item. Также возможно иметь несколько элементов и / или использовать маркеры для форматирования нескольких заметок, как в списке:

texreg(lm(speed ~ dist, data = cars),
       custom.note = paste("\\item[$\\bullet$] %stars.",
                           "\\item[$\\bullet$] This regression",
                           "should be interpreted with strong",
                           "caution as it is likely plagued by",
                           "extensive omitted variable bias."),
       single.row = TRUE,
       threeparttable = TRUE)

Форматирование не идеальное, так как вы не можете установить желаемую ширину таблицы; заметка просто подстраивается под ширину соответствующей таблицы. Но я думаю, что это должно быть меньше проблем в реалистичном сценарии использования, когда одновременно отображается более одной модели, а некоторые имена коэффициентов длиннее, чем в примере. Это решение также поддерживаетlongtable среды, и в этом случае threeparttablex вместо него используется пакет.

Вот пример того, как вы могли бы хорошо выглядеть с двумя моделями:


fit <- lm(speed ~ dist, data = cars)
texreg(list(fit, fit),
       custom.note = paste("\\item[\\hspace{-5mm}] %stars.",
                           "\\item[\\hspace{-5mm}] This regression",
                           "should be interpreted with strong",
                           "caution as it is likely plagued by",
                           "extensive omitted variable bias."),
       single.row = TRUE,
       threeparttable = TRUE)

Это дает:

\begin{table}
\begin{center}
\begin{threeparttable}
\begin{tabular}{l c c}
\hline
 & Model 1 & Model 2 \\
\hline
(Intercept) & $8.28 \; (0.87)^{***}$ & $8.28 \; (0.87)^{***}$ \\
dist        & $0.17 \; (0.02)^{***}$ & $0.17 \; (0.02)^{***}$ \\
\hline
R$^2$       & $0.65$                 & $0.65$                 \\
Adj. R$^2$  & $0.64$                 & $0.64$                 \\
Num. obs.   & $50$                   & $50$                   \\
\hline
\end{tabular}
\begin{tablenotes}[flushleft]
\scriptsize{\item[\hspace{-5mm}] $^{***}p<0.001$; $^{**}p<0.01$; $^{*}p<0.05$. \item[\hspace{-5mm}] This regression should be interpreted with strong caution as it is likely plagued by extensive omitted variable bias.}
\end{tablenotes}
\end{threeparttable}
\caption{Statistical models}
\label{table:coefficients}
\end{center}
\end{table}

Что отображается как:

Я нашел обходной путь, переписав texreg функция путем добавления custom.note.wrap аргумент и изменение:

note <- paste0("\\multicolumn{", length(models) + 1, 
               "}{l}{\\", notesize, "{", custom.note, "}}")
note <- gsub("%stars", snote, note, perl = TRUE)

Для того, чтобы:

if (custom.note.wrap){
  note<-paste(paste0("\\multicolumn{", length(models) + 1L,"}{l}{\\",notesize,"{",
                     strwrap(custom.note, width=custom.note.wrap), "}}"),
              collapse = " \\ \n")
  note <- gsub("%stars", snote, note, perl = TRUE)
}else{
  note <- paste0("\\multicolumn{", length(models) + 1L, 
                 "}{l}{\\", notesize, "{", custom.note, "}}")
  note <- gsub("%stars", snote, note, perl = TRUE)
}

Идея состоит в том, чтобы выбрать максимальную длину строки для каждой строки (custom.note.wrap), а затем разбить предоставленную заметку на строки не более той длины, которые заканчиваются пробелом, в конечном итоге объединяя все в кучу multicolumnс каждой разделенной подстрокой.

Это не оптимально, так как было бы лучше для texreg (иметь возможность) автоматически устанавливать custom.note.wrap с учетом длины названий моделей и т. д. Но мой сырой LaTeX не хватает способностей, поэтому я не уверен, как бы я это сделал.

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