2011-06-16 7 views
7

¿Cómo puedo publicar una fórmula de regresión muy bien?Cómo publicar (sudar) fórmulas de regresión?

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

¿Cómo puedo Sweave s1$call? Quiero decir que no quiero tener algo como `dynlm (formula = dep ~ indep1 + indep2 + indep3) 'en mi documento pdf. Prefiero tener un estilo de libro de texto más sobre este estilo de llamada de función. Además, me gustaría (¿de forma manual?) Agregar intercepción y errorterm al modelo (porque en realidad está allí).

Tenga en cuenta que encontré outreg en google (que parece un poco demasiado pesado en este momento) y que no corresponde exactamente a mis necesidades a primera vista.

EDIT: Tratar de publicar un ejemplo de salida, en realidad Me encanta, pero no saben cómo hacerlo mejor con el editor SO:

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

Algunos notación matricial también estaría bien, pero imprimir la definición del modelo sería bueno sin importar cómo. Por supuesto, también es posible agregarlo manualmente, pero cuando se encuentra en una fase de verificación de robustez, las variables del modelo pueden cambiar con frecuencia y la documentación debe estar actualizada.

(Usando 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

+0

No conozco ninguna solución enlatada. Sugeriría armar un traductor apropiado (usando 'paste',' gsub', etc. - ¡tenga cuidado de escapar de las barras invertidas cuando sea necesario!), Cree la cadena LaTeX que desee y luego use 'results = tex' en su Sweave opciones para el fragmento relevante (no sé de pasada si puedes obtener el equivalente de 'resultados = tex' en una expresión' \ Sexpr' ...) –

+0

Los resultados de PS '\ Sexpr' se incluyen textualmente, así que mi comentario sobre 'results = tex' es irrelevante. Esto puede ser útil: http://stackoverflow.com/questions/5406071/r-sweave-latex-escape-variables-to-be-printed-in-latex –

+0

Estoy un poco desconcertado de que no haya nada fuera de la caja. Probablemente tendré que hacer algo por mi cuenta, pero gracias a todas sus respuestas, particularmente el pasado y la grabación, debería ser manejable.Será difícil aceptar UNA respuesta al final :) –

Respuesta

3

me encontré con esta función que escribí cuando estaba tomando una clase de introducción al modelo de regresión. Estoy seguro de que es menos que óptimo, pero funcionó bastante bien para ese curso. Si nada más, tal vez esto lo lleve a uno en la dirección correcta para llevarlo más allá.

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) 
    } 

Y en acción:

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" 
+0

es agradable, pero no suena como lo que quiere el OP, es decir, la fórmula teórica para el regresión, no los coeficientes estimados, etc. –

5

Este archivo 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} 

conduce a este fragmento 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} 
+0

Cuando ejecuto ese código, obtengo el siguiente fragmento TeX: '$$ \ Sexpr {\\\\ mbox {consumption} = \\\\ beta_0 \\\\ cdot \ \\\ mbox {gnp} + \\\\ beta_1 \\\\ cdot \\\\ mbox {L (consumo)} + \\\\ epsilon} $$ ' – Zach

+0

¿Cómo lo ejecutó? Funciona para mí: copié el texto en un archivo 'Sweavetmp.Rnw' y probé ambos (desde la línea de comando)' R CMD Sweave Sweavetmp.Rnw' y (desde el prompt R) 'Sweave (" Sweavetmp.Rnw ") '. Obtuve un archivo 'Sweavetmp.tex' sensible con barras invertidas simples, que podría ser' pdflatex'ed bien. –

+0

@ Ben Bolker: estoy usando la opción "compilar pdf" en Rstudio, que creo que está causando el problema. – Zach

0

Este archivo corto Rnw demuestra imprimir una fórmula de regresión larga, envolver ove r múltiples líneas:

\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} 

El código de látex resultante es:

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

que envuelve bien a través de múltiples líneas, utilizando el paquete breqn y el medio ambiente dmath.