Как публиковать (соткать) формулы регрессии?

Как красиво опубликовать формулу регрессии?

fit1<-dynlm(dep~indep1+indep2+indep3)
s1<-summary(fit1)
s1$call

Как я могу сплести s1$call ? Я имею в виду, что я не хочу иметь что-то вроде «dynlm(formula=dep~indep1+indep2+indep3)» в моем pdf-документе. Я бы предпочел стиль учебника, а не этот стиль вызова функции. Кроме того, я хотел бы (вручную?) добавить в модель intercept и errorterm (потому что он там есть).

Обратите внимание, что я нашел outreg в Google (который сейчас кажется слишком тяжелым), и на первый взгляд он не совсем соответствует моим потребностям.

РЕДАКТИРОВАТЬ: Попытка опубликовать образец вывода, на самом деле я бы с удовольствием, но я не знаю, как сделать это лучше с помощью редактора SO:

 dep = alpha + beta_1*indep1 + beta_2*indep2 + beta_3*indep3 + epsilon

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

(Используя http://texify.com :)

img]http://www.texify.com/img/%5CLARGE%5C%21%5Cmbox%7Bdep%7D  %20%3D%20%5Calpha%20%2B%20%5Cbeta_1%20%5Ccdot%20%5Cmbox%7Bindep1%7D%20%2B%20%5Cbeta_2%20%5Ccdot%20%5Cmbox%7Bindep2%7D%20  %2B%20%5Cepsilon.gif[/img


person Matt Bannert    schedule 16.06.2011    source источник
comment
Я не знаю ни одного готового решения. Я бы предложил собрать соответствующий транслятор (используя paste, gsub и т. д. — будьте осторожны, чтобы избежать обратной косой черты там, где это необходимо!), создать нужную строку LaTeX, а затем использовать results=tex в параметрах Sweave для соответствующего фрагмента (я не не знаю навскидку, можно ли получить эквивалент results=tex в выражении \Sexpr...)   -  person Ben Bolker    schedule 17.06.2011
comment
PS \Sexpr результаты включены дословно, так что мой комментарий о results=tex неактуален. Это может быть полезно: для печати в латексе"> stackoverflow.com/questions/5406071/   -  person Ben Bolker    schedule 17.06.2011
comment
Я немного озадачен тем, что нет ничего из коробки. Вероятно, придется что-то делать самостоятельно, но благодаря всем вашим ответам, особенно пастину и gsubbbing, это должно быть управляемо. В конце концов, будет трудно принять ОДИН ответ :)   -  person Matt Bannert    schedule 17.06.2011
comment
На самом деле не совсем понятно, какой результат вы хотите. Не могли бы вы опубликовать образец вывода?   -  person Ben Bolker    schedule 17.06.2011
comment
Спасибо Бен! Я ненавижу тот факт, что мне приходится писать эту тарабарщину прямо здесь, просто чтобы поблагодарить Бена, потому что ТАК нужно больше символов :)   -  person Matt Bannert    schedule 18.06.2011


Ответы (3)


Этот Rnw-файл:

\documentclass{article}
\begin{document}
<<>>=
data("USDistLag", package = "lmtest")
library(dynlm)
dfm1 <- dynlm(consumption ~ gnp + L(consumption), data = USDistLag)
@ 

<<echo=FALSE>>=
cc <-dfm1$call
f <- cc$formula
LHS <- as.character(f)[2]
RHS <- as.character(f)[3]
coefs <- gsub(" +","",strsplit(RHS,"\\+")[[1]])
mbox <- function(x) { paste("\\\\mbox{",x,"}",sep="") }
pars <- paste("\\\\beta_",0:(length(coefs)-1),sep="")
p <- paste(mbox(LHS),"=",paste(pars,mbox(coefs),sep=" \\\\cdot ",collapse="+"),
           "+ \\\\epsilon")
@ 

$$
\Sexpr{p}
$$
\end{document}

приводит к этому фрагменту TeX:

\documentclass{article}
\begin{document}
\begin{Schunk}
\begin{Sinput}
> data("USDistLag", package = "lmtest")
> library(dynlm)
> dfm1 <- dynlm(consumption ~ gnp + L(consumption), data = USDistLag)
\end{Sinput}
\end{Schunk}


$$
\mbox{consumption} = \beta_0 \cdot \mbox{gnp}+\beta_1 \cdot \mbox{L(consumption)} + \epsilon
$$
\end{document}
person Ben Bolker    schedule 17.06.2011
comment
Когда я запускаю этот код, я получаю следующий фрагмент TeX: $$ \Sexpr{\\\\mbox{consumption} = \\\\beta_0 \\\\cdot \\\\mbox{gnp}+\\\\beta_1 \\\\cdot \\\\mbox{L(consumption)} + \\\\epsilon} $$ - person Zach; 27.01.2012
comment
Как вы его запускали? У меня работает - я скопировал текст в файл Sweavetmp.Rnw и попробовал оба (из командной строки) R CMD Sweave Sweavetmp.Rnw и (из командной строки R) Sweave("Sweavetmp.Rnw"). Получил разумный файл Sweavetmp.tex с одиночными обратными косыми чертами, который можно было бы просто pdflatexed. - person Ben Bolker; 28.01.2012
comment
@ Бен Болкер: я использую параметр компиляции pdf в Rstudio, который, я думаю, вызывает проблему. - person Zach; 28.01.2012
comment
возможно, вы могли бы задать вопрос на справочном форуме Rstudio по адресу support.rstudio.org . Разработчики обычно довольно отзывчивы... - person Ben Bolker; 28.01.2012

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

writeCoef <- function(x) {
  require(plyr)

    coefnames <- as.data.frame(coef(x))
    coefnames$betas <- row.names(coefnames) 
    coefnames <- adply(coefnames, 1, function(x) paste(round(x[1],3), x[2] , sep = " * "))

    dependent <- paste(as.character(x$call$formula)[2], " = ", sep = "")

    ret <- paste(dependent, paste(coefnames[,3], sep = "", collapse = " + "))
    ret <- gsub("\\*\\s\\(Intercept\\)", "", ret)
  return(ret)
    }

И в действии:

ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
group <- gl(2,10,20, labels=c("Ctl","Trt"))
weight <- c(ctl, trt)
lm.D9 <- lm(weight ~ group)

> writeCoef(lm.D9)
[1] "weight =  5.032 + -0.371 * groupTrt"
person Chase    schedule 16.06.2011
comment
это хорошо, но это не похоже на то, чего хочет ОП, то есть теоретическая формула регрессии, а не оценочные коэффициенты и т. д. - person Ben Bolker; 17.06.2011

Этот короткий файл Rnw демонстрирует распечатку длинной формулы регрессии, перенося ее на несколько строк:

\documentclass{article}
\usepackage{breqn}
\begin{document}
\SweaveOpts{concordance=TRUE}

<<Printmodel,echo=FALSE,results=tex>>=
#Specify any formula
model1 <- formula("outcome ~ (variable1 +variable2 + variable3 + variable4 + variable5 + variable6 )^2 + variable7 + variable8 + variable7 * variable8")

#Converts formula to LaTeX
cat(paste("\\begin{dmath*}\n",gsub("~","\\\\sim",deparse(model1,width.cutoff = 500L)),"\n\\end{dmath*}",sep=""))
@

\end{document}

Результирующий код LaTeX:

\begin{dmath*}
outcome \sim (variable1 + variable2 + variable3 + variable4 + variable5 + variable6)^2 + variable7 + variable8 + variable7 * variable8
\end{dmath*}

который красиво обтекает несколько строк с помощью пакета breqn и среды dmath.

person Christophe Lambert    schedule 06.05.2016