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 pander
que 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)
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')
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)
)
Valoraciones y comentarios
Finalizando este artículo puedes encontrar las explicaciones de otros creadores, tú asimismo eres capaz mostrar el tuyo si te apetece.