2010-02-18 8 views
77

Hay una opción en R para controlar la visualización de los dígitos. Por ejemplo:Control del número de dígitos decimales en la salida de impresión en R

options(digits=10) 

se supone para dar los resultados de cálculo en 10 dígitos hasta el final de la sesión R. En el archivo de ayuda de R, la definición para el parámetro cifras es el siguiente:

dígitos: controla el número de dígitos a imprimir de los valores numéricos. Es solo una sugerencia. Los valores válidos son 1 ... 22 con defecto

Así, se dice que esto es sólo una sugerencia. ¿Qué pasa si me gusta mostrar siempre 10 dígitos, no más o menos?

Mi segunda pregunta es, ¿y si me gusta mostrar más de 22 dígitos, es decir, para los 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, he intentado sprintf("%.100f",pi) y se lo dio

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000" 

que cuenta con 48 decimales. ¿Es este el límite máximo que R puede manejar? En realidad, pi tiene un número infinito de decimales.

+4

Solo los primeros 15 dígitos de pi son precisos. Compare con el verdadero valor http://joyofpi.com/pi.html –

+1

Tiene razón. ¿Por qué es diferente en R? –

+3

Consulte las preguntas frecuentes en R http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f –

Respuesta

38

La razón es sólo una sugerencia es que se podría fácilmente escribir una función de impresión que ignora el valor opciones. Las funciones integradas de impresión y formateo usan el valor options como valor predeterminado.

En cuanto a la segunda pregunta, ya que R utiliza aritmética de precisión finita, sus respuestas no son precisas más allá de 15 ó 16 cifras decimales, por lo que en general, no se necesitan más. Los paquetes gmp y rcdd se ocupan de aritmética de precisión múltiple (a través de un interace a la biblioteca gmp), pero esto está relacionado principalmente con enteros grandes en lugar de más decimales para sus dobles.

Mathematica o Maple le permitirá dar tantos decimales como desee.

EDITAR:
Puede ser útil pensar en la diferencia entre las cifras decimales y las 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 usted está tratando con números muy pequeños, es decir menos de un problema, puesto que R puede manejar el número tan pequeño como .Machine$double.xmin (por lo general 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 los números sólo se producen después de muchos cifras significativas, por lo que los datos son "casi constante". 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 se ha mencionado por e3bo, puede utilizar de múltiples números de puntos de precisión utilizando el paquete de Rmpfr flotante.

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825") 

Estos son más lentos y más intensivo de la memoria de usar que regular (doble precisión) numeric vectores, pero puede ser útil si usted tiene un problema mal condicionado o algoritmo inestable.

+3

Como [esta página de Rwiki] (http://rwiki.sciviews.org/doku.php?id=misc:r_accuracy:high_precision_arithmetic) demuestra, el [paquete Rmpfr] (http: //cran.at.r-project. org/web/packages/Rmpfr/index.html) permite la aritmética de punto flotante de alta precisión en R. – e3bo

+0

. ¿Puede Rmpfr ser utilizado por cualquier paquete R para mejorar su precisión? ¿O solo puede usar las funciones codificadas internamente en él? – skan

+2

Estaba pensando solo eso, "si estás haciendo pruebas estadísticas que dependen de las diferencias más allá de la decimoquinta cifra significativa, entonces tu análisis es casi seguro basura". pero me pregunté cuál sería el número de dígitos en los que concluiría que es basura, y pensé en 5, pero estaría encantado de que me corrijan. – PatrickT

29

Si desea producir toda la producción a sí mismo, puede utilizar sprintf

> sprintf("%.10f",0.25) 
[1] "0.2500000000" 

Yo no sé de ninguna manera de forzar a funciones de nivel superior de R para imprimir un número exacto de dígitos.

Mostrar 100 dígitos no tiene sentido si está imprimiendo números normales de R, ya que la mejor precisión que puede obtener usando dobles de 64 bits es alrededor de 16 dígitos decimales (consulte .Machine $ double.eps en su sistema). Los dígitos restantes serán basura.

+0

En realidad, algunas pruebas especiales de chi-cuadrado que apliqué necesitaban cientos de decimales para dar resultados precisos. También pi tiene miles de decimales. Es por eso que me preguntaba acerca de 100 o más dígitos. –

+12

pi tiene un número infinito de decimales; eso no significa que una computadora pueda almacenarlos. – Shane

+0

Supongo que este es un escenario donde Mathematica es superior a R. – skan

Cuestiones relacionadas