Обтекание пользовательских заметок в выводе 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
не хватает способностей, поэтому я не уверен, как бы я это сделал.