Saltar al contenido

Cómo mostrar coeficientes en notación científica con stargazer

La guía paso a paso o código que encontrarás en este artículo es la resolución más rápida y efectiva que hallamos a esta inquietud o dilema.

Solución:

He aquí un ejemplo reproducible:

m1 <- lm(Sepal.Length ~ Petal.Length*Sepal.Width,
         transform(iris, Sepal.Length = Sepal.Length+1e6,
                   Petal.Length=Petal.Length*10, Sepal.Width=Sepal.Width*100))
# Coefficients:
#              (Intercept)              Petal.Length               Sepal.Width  Petal.Length:Sepal.Width  
#                1.000e+06                 7.185e-02                 8.500e-03                -7.701e-05  

no creo stargazer tiene soporte fácil para esto. Podrías probar otras alternativas como xtable o cualquiera de las muchas opciones aquí (no las he probado todas)

library(xtable)
xtable(m1, display=rep('g', 5)) # or there's `digits` too; see `?xtable`

O si estás usando knitr o pandoc me gusta bastante panderque ya tiene notación científica automágica (nota: esta es una salida pandoc que parece una reducción, no una salida tex, y luego teje o pandoc a latex/pdf):

library(pander)
pander(m1)

Probablemente valga la pena hacer una solicitud de función al mantenedor del paquete para incluir esta opción.

Mientras tanto, puede reemplazar números en la salida con notación científica de forma automática. Hay algunas cosas que debe tener cuidado al reemplazar números. Es importante no reformatear los números que forman parte de la codificación latex. Además, tenga cuidado de no reemplazar caracteres que formen parte de nombres de variables. por ejemplo el . en Sepal.Width podría confundirse fácilmente con un número mediante expresiones regulares. El siguiente código debe tratar con las situaciones más comunes. Pero, si alguien, por ejemplo, llama a su variable X_123456789 podría cambiar el nombre de esto a X_1.23e+09 dependiendo de la configuración del guión. Por lo tanto, se necesita cierta precaución y probablemente será necesario implementar una solución más robusta dentro del paquete stargazer.

aquí hay un ejemplo de tabla de observación de estrellas para demostrar (copiado descaradamente de @mathematical.coffee):

library(stargazer)
library(gsubfn)
m1 <- lm(Sepal.Length ~ Petal.Length*Sepal.Width,
  transform(iris, Sepal.Length = Sepal.Length+1e6,
    Petal.Length=Petal.Length*10, Sepal.Width=Sepal.Width*100))    
star = stargazer(m1, header = F, digit.separator = '')

Ahora una función auxiliar para reformatear los números. Puede jugar con los dígitos y los parámetros de escritura para controlar el formato de salida. Si desea forzar el formato científico con más frecuencia, use un scipen más pequeño (más negativo). De lo contrario, podemos hacer que use automáticamente el formato científico solo para números muy pequeños o grandes usando un formato más grande scipen. Él cutoff El parámetro está ahí para evitar el reformateo de números representados por solo unos pocos caracteres.

replace_numbers = function(x, cutoff=4, digits=3, scipen=-7) 
  ifelse(nchar(x) < cutoff, x, prettyNum(as.numeric(x), digits=digits, scientific=scipen))

Y aplique eso a la salida del observador de estrellas usando gsubfn::gsubfn

gsubfn("([0-9.]+)", ~replace_numbers(x), star)

ingrese la descripción de la imagen aquí

Otra forma robusta de obtener notación científica usando stargazer es hackear el digit.separator parámetro. Esta opción permite al usuario especificar el carácter que separa los decimales (generalmente un punto . en la mayoría de los lugares). Podemos usurpar este parámetro para insertar un identificador único string en cualquier número que queramos poder encontrar usando expresiones regulares. La ventaja de buscar números de esta manera es que solo encontraremos números que correspondan a valores numéricos en la salida del observador de estrellas. Es decir, no existe la posibilidad de hacer coincidir también números que forman parte de nombres de variables (p. ej., X_12345) o que forman parte del código de formato de látex (p. ej., hline \[-1.8ex]). A continuación utilizo el string ::::pero cualquier carácter único string (como un hash) que no encontraremos en otra parte de la tabla servirá. Probablemente sea mejor evitar tener caracteres especiales de expresiones regulares en la marca del identificador, ya que esto complicará un poco las cosas.

Usando el modelo de ejemplo m1 de esta otra respuesta.

mark  = '::::'
star = stargazer(m1, header = F, decimal.mark  = mark, digit.separator = '')

replace_numbers = function(x, low=0.01, high=1e3, digits = 3, scipen=-7, ...) 
  x = gsub(mark,'.',x)
  x.num = as.numeric(x)
  ifelse(
    (x.num >= low) & (x.num < high), 
    round(x.num, digits = digits), 
    prettyNum(x.num, digits=digits, scientific = scipen, ...)
  )
    

reg = paste0("([0-9.\-]+", mark, "[0-9.\-]+)")
cat(gsubfn(reg, ~replace_numbers(x), star), sep='n')

ingrese la descripción de la imagen aquí

Actualizar
Si desea asegurarse de que los ceros finales se mantengan en la notación científica, entonces podemos usar sprintf en lugar de bonitaNum.

Me gusta esto

replace_numbers = function(x, low=0.01, high=1e3, digits = 3) 
  x = gsub(mark,'.',x)
  x.num = as.numeric(x)
  form = paste0('%.', digits, 'e')
  ifelse(
    (abs(x.num) >= low) & (abs(x.num) < high), 
    round(x.num, digits = digits), 
    sprintf(form, x.num) 
  )

ingrese la descripción de la imagen aquí

Valoraciones y comentarios

Finalizando este artículo puedes encontrar las explicaciones de otros creadores, tú asimismo eres capaz mostrar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *