studio - superponer graficas en r
Controlar el número de dígitos decimales en la salida de impresión en R (2)
Hay una opción en R para obtener control sobre la visualización de dígitos. Por ejemplo:
options(digits=10)
se supone que debe dar los resultados del cálculo en 10 dígitos hasta el final de la sesión R. En el archivo de ayuda de R, la definición de parámetro de dígitos es la siguiente:
dígitos: controla el número de dígitos para imprimir al imprimir valores numéricos. Es solo una sugerencia. Los valores válidos son 1 ... 22 con el valor predeterminado 7
Por lo tanto, dice que esto es solo una sugerencia. ¿Qué pasa si me gusta mostrar siempre 10 dígitos, no más o menos?
Mi segunda pregunta es, ¿qué pasa si me gusta mostrar más de 22 dígitos, es decir, para cálculos más precisos como 100 dígitos? ¿Es posible con la base R, o necesito un paquete / función adicional para eso?
Editar: Gracias a la sugerencia de jmoy, probé sprintf("%.100f",pi)
y me dio
[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"
que tiene 48 decimales. ¿Es este el límite máximo que R puede manejar? En realidad, pi tiene un número infinito de decimales.
La razón por la cual es solo una sugerencia es que podría escribir fácilmente una función de impresión que ignore el valor de las opciones. Las funciones integradas de impresión y formateo usan el valor de las options
como predeterminado.
En cuanto a la segunda pregunta, dado que R utiliza la aritmética de precisión finita, sus respuestas no son precisas más allá de 15 o 16 decimales, por lo que, en general, no se requieren más. Los paquetes gmp y rcdd ocupan de aritmética de precisión múltiple (a través de un interace a la biblioteca gmp), pero esto se relaciona principalmente con enteros grandes en lugar de más decimales para sus dobles.
Mathematica o Maple te permitirá dar tantos decimales como tu corazón desee.
EDITAR:
Puede ser útil pensar en la diferencia entre lugares decimales y cifras significativas. Si está haciendo pruebas estadísticas que se basan en diferencias más allá de la 15a cifra significativa, entonces su análisis es casi seguro basura.
Por otro lado, si solo se trata de números muy pequeños, ese es un problema menor, ya que R puede manejar un número tan pequeño como .Machine$double.xmin
(generalmente 2e-308).
Compare estos dos análisis.
x1 <- rnorm(50, 1, 1e-15)
y1 <- rnorm(50, 1 + 1e-15, 1e-15)
t.test(x1, y1) #Should throw an error
x2 <- rnorm(50, 0, 1e-15)
y2 <- rnorm(50, 1e-15, 1e-15)
t.test(x2, y2) #ok
En el primer caso, las diferencias entre números solo ocurren después de muchas cifras significativas, por lo que los datos son "casi constantes". En el segundo caso, aunque el tamaño de las diferencias entre los números es el mismo, en comparación con la magnitud de los números en sí son grandes.
Como mencionó e3bo, puede usar números de coma flotante de precisión múltiple usando el paquete Rmpfr
.
mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")
Estos son más lentos y requieren más memoria que numeric
vectores numeric
regulares (precisión doble), pero pueden ser útiles si tiene un problema poco condicionado o un algoritmo inestable.
Si está produciendo todo el producto usted mismo, puede usar sprintf
> sprintf("%.10f",0.25)
[1] "0.2500000000"
No conozco ninguna forma de forzar a las funciones de nivel superior de R a imprimir una cantidad exacta de dígitos.
Mostrar 100 dígitos no tiene sentido si está imprimiendo los números habituales de R, ya que la mejor precisión que puede obtener usando dobles de 64 bits es de alrededor de 16 dígitos decimales (consulte .Machine $ double.eps en su sistema). Los dígitos restantes serán basura.