Agregar fila(s) personalizada(s) a una tabla R generada por LaTeX de resultados de regresión usando memisc, xtable, etc.

Es una práctica común que las tablas de resultados de regresión en trabajos académicos tengan filas que describan alguna característica del modelo estimado. Por ejemplo, podría tener un nombre de fila: "Modelo incluido efectos fijos individuales" y luego cada celda asociada tendrá un Sí/No según corresponda.

Mi pregunta es si es posible en alguna de las muchas herramientas para hacer tablas de LaTeX con R (cf, Herramientas para hacer tablas de látex en R) para pasar las funciones de generación de tablas como una fila Para hacer esto más concreto, imagino tener un parámetro como:

model.info.row <- list(name = "Fixed effects", values = c("Y", "N", "Y"))

He leído la documentación de memisc mtable y toLaTeX y no vi nada que parezca capaz de hacer esto --- no estoy seguro acerca de otros paquetes/enfoques, pero parece un caso de uso tan común que sospecho que hay alguna forma de hacerlo esta.

preguntado el 11 de junio de 12 a las 19:06

2 Respuestas

Puede intentar agregar esa (s) nueva (s) línea (s) directamente a la tabla a la que desea pasar, por ejemplo xtable. Ejemplo realmente cojo:

  1. Tengamos algún modelo:

    m <- lm(mtcars$hp ~ mtcars$wt)
    
  2. Coge la mesa que se devuelve en xtable y otros ayudantes:

    df <- as.data.frame(summary(m)$coefficient)
    
  3. Agregue una nueva línea con algunos valores:

    df[3, ] <- c(sample(c('foo', 'bar'), 4, replace = TRUE))
    
  4. Actualice el nombre de fila de su línea personalizada:

    rownames(df)[3] <- 'FOOBAR'
    
  5. Consulta los resultados:

    > df
                         Estimate       Std. Error             t value            Pr(>|t|)
    (Intercept) -1.82092177119464 32.3246158121787 -0.0563323561763288     0.95545056134944
    mtcars$wt    46.1600502824445 9.62530003926982    4.79569988406785 4.14582744107531e-05
    FOOBAR                    bar              foo                 bar                  bar
    
  6. O simplemente llama xtable:

    > xtable(df)
    % latex table generated in R 2.15.0 by xtable 1.7-0 package
    % Tue Jun 12 01:39:46 2012
    \begin{table}[ht]
    \begin{center}
    \begin{tabular}{rllll}
      \hline
     & Estimate & Std. Error & t value & Pr($>$$|$t$|$) \\ 
      \hline
    (Intercept) & -1.82092177119464 & 32.3246158121787 & -0.0563323561763288 & 0.95545056134944 \\ 
      mtcars\$wt & 46.1600502824445 & 9.62530003926982 & 4.79569988406785 & 4.14582744107531e-05 \\ 
      FOOBAR & bar & foo & bar & bar \\ 
       \hline
    \end{tabular}
    \end{center}
    \end{table}
    

Respondido el 12 de junio de 12 a las 13:06

Terminé escribiendo un código R hacky (tenga en cuenta que solo funciona en un sistema con sed, wc y awk disponibles) que es más flexible y funciona bien con la función memisc 'mtable', que es mi forma preferida de generar tablas LaTeX. Básicamente, escribe su tabla en un archivo de texto, luego llama a esta función con (1) el número de línea en el archivo donde desea realizar una inserción (2) la línea que desea insertar y (3) el nombre del archivo con en el que desea realizar las inserciones (tenga en cuenta que esta función sobrescribirá su archivo existente). El código es:

insert.note <-function(linenumber, line, file){
  num.lines <- as.numeric(system(paste("wc", file, "| awk '{print $1}'"), intern=TRUE))
  tmp <- tempfile()
  system(paste("head -n ", linenumber, file, "> ", tmp))
  sink(tmp, append=TRUE)
   cat(line)
   sink()
  system(paste("tail -n", num.lines - linenumber, file, ">>", tmp))
  system(paste("mv", tmp, file))
}

Como función de ayuda, este código crea una línea válida de LaTeX utilizando el espacio entre columnas y doble de mtable:

 create.note <- function(l, include.row.end = TRUE){
  n <- length(l)
  s <- ""
  i <- 1
  for(note in l){
    if(i < n){
      cap <- "&&"
    } else {
      if(include.row.end){
        cap <- "\\\\ \n "
      } else {
          cap <- " \n"
      }
    }
    s <- paste(s, note, cap)
    i <- i + 1
  }
  s
}

El parámetro include.row.end es en caso de que quiera pasarle algo como "\midrule" y no quiere obtener una línea adicional.

Respondido 05 ago 12, 23:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.