2012-01-10 12 views
24

que tienen algún cálculo pasando y obtener la siguiente advertencia (es decir, no es un error):¿Qué es el desbordamiento de enteros en R y cómo puede suceder?

Warning messages: 
1: In sum(myvar, na.rm = T) : 
Integer overflow - use sum(as.numeric(.)) 

En esta thread personas afirman que desborda número entero simplemente no sucederá. O R no es demasiado moderno o no tienen razón. Sin embargo, ¿qué se supone que debo hacer aquí? Si utilizo as.numeric como sugiere la advertencia, es posible que no tenga en cuenta el hecho de que la información se perdió mucho antes. myvar se lee de un archivo .csv, ¿por lo que R no debería darse cuenta de que se necesita un campo más grande? ¿Ya cortó algo?

¿Cuál es la longitud máxima de integer o numeric? ¿Sugeriría algún otro tipo/modo de campo?

EDIT: corro:

versión R 2.13.2 (2011-09-30) Plataforma: x86_64-apple-darwin9.8.0/x86_64 (64-bit) dentro de R Studio

Respuesta

35

Puede responder a muchas de sus preguntas leyendo la página de ayuda ?integer. Dice:

R utiliza enteros de 32 bits para los vectores de enteros, por lo que la gama de números enteros representables se limita a aproximadamente +/- 2 * 10^9.

La ampliación de enteros más grandes está siendo considerada por R Core, pero no va a suceder en un futuro próximo.

Si desea una capacidad "bignum", instale Martin Maechler's Rmpfr package [PDF]. Recomiendo el paquete 'Rmpfr' debido a la reputación del autor. Martin Maechler también está muy involucrado con el desarrollo del paquete Matrix y también con R Core. Hay alternativas, incluidos paquetes aritméticos como 'gmp', 'Brobdingnag' y el paquete 'Ryacas' (este último también ofrece una interfaz matemática simbólica).

A continuación, para responder a los comentarios críticos en la respuesta a la que se vinculó y cómo evaluar la relevancia para su trabajo, considere esto: si hubiera la misma funcionalidad estadística disponible en uno de esos idiomas "modernos" que existen está en R, probablemente vería una migración de usuario en esa dirección. Pero diría que la migración, y ciertamente el crecimiento, está en la dirección R en este momento. R fue construido por estadísticos para estadísticas.

Hubo una vez una variante de Lisp con un paquete de estadísticas, Xlisp-Stat, pero su principal desarrollador y proponente ahora es miembro de R-Core. Por otro lado, uno de los primeros desarrolladores de R, Ross Ihaka, suggests working toward development in a Lisp-like language [PDF]. Hay un lenguaje compilado llamado Clojure (pronunciado como los que hablan inglés dirían "cierre") con una interfaz experimental, Rincanter.

Actualización:

Las nuevas versiones de R (. + 3.0) tiene 53 bits enteros de una especie (usando la mantisa numeric). Cuando a un elemento vectorial "entero" se le asigna un valor superior a ".Machine $ integer.max", todo el vector se fuerza a "numérico", a.k.a. "doble". El valor máximo para integers permanece como estaba, sin embargo, puede haber coerción de vectores enteros para duplicar la precisión en casos que anteriormente generarían un desbordamiento. Desafortunadamente, la longitud de las listas, las dimensiones de matriz y matriz, y los vectores todavía se establece en integer.max.

Al leer valores grandes a partir de archivos, probablemente sea más seguro utilizar la clase de carácter como objetivo y luego manipular. Si hay una coacción a los valores de NA, habrá una advertencia.

+0

+1 para el paquete Rmpfr! –

+0

El paquete 'gmp' también puede ser de interés – James

+0

Estoy haciendo un DT [, sapply (.SD, sum, na.rm = T)] con un data.table lleno de 0,1 y NA, con 2 millones filas Y obtengo el mensaje de desbordamiento, pero el número máximo generado debe ser menor a 2 millones. ¿Qué podría pasar? – skan

17

En corto, integer es un tipo exacto con rango limitado, y numeric es un tipo de coma flotante que puede representar un rango de valores mucho más amplio pero inexacto. Consulte las páginas de ayuda (?integer y ?numeric) para obtener más detalles.

En cuanto al desbordamiento, aquí es un explanation por Brian D. Ripley:

Esto significa que usted está tomando la media [en su caso, la suma - @aix] de algunos números enteros muy grandes y el cálculo está desbordando. Es solo una advertencia.

Esto no ocurrirá en la próxima versión de R.

Puede especificar que un número es un número entero, dándole el sufijo L, por ejemplo, 1L es el número entero uno, en contraposición a 1 que es un punto flotante, con clase "numeric".

El número entero más grande que puede crear en su máquina está dado por .Machine$integer.max.

> .Machine$integer.max 
[1] 2147483647 
> class(.Machine$integer.max) 
[1] "integer" 

Adición de un número entero positivo que esto provoca un desbordamiento, volviendo NA.

> .Machine$integer.max + 1L 
[1] NA 
Warning message: 
In .Machine$integer.max + 1L : NAs produced by integer overflow 
> class(.Machine$integer.max + 1L) 
[1] "integer" 

Puede redondear este límite agregando valores de coma flotante.

> .Machine$integer.max + 1 
[1] 2147483648 
> class(.Machine$integer.max + 1) 
[1] "numeric" 

Dado que en el caso de que el aviso se emite por sum, esto indica que el desbordamiento ocurre cuando se suman los números juntos. La solución sugerida sum(as.numeric(.)) debería hacer el truco.

+1

bien, ¿y si quiero tener un cálculo exacto y tener grandes números?Exactamente, los desbordamientos se crean cuando se agregan números. ¿Puedo obtener un resultado exacto de todos modos? –

+0

He solucionado la descripción de lo que sucede cuando agrega números al entero más grande. –

+0

... pero prueba esto: 'clase (sum (c (.Machine $ integer.max, as.integer (1))))' para mí obtengo un desbordamiento de enteros (usando 2.14). – Dason

4

¿Cuál es la longitud máxima de número entero o numérico?

Los vectores están actualmente indexados con un número entero, por lo que la longitud máxima está dada por .Machine$integer.max. Como señaló DWin, todas las versiones de R actualmente usan enteros de 32 bits, por lo que este será 2^31 - 1, o un poco más de 2 mil millones.

A menos que esté empaquetando hardware serio (o está leyendo esto en el futuro; hola de 2012) no tendrá suficiente memoria para asignar vectores de ese tamaño.

Recuerdo una discusión en la que R-core (Brian Ripley, creo) sugirió que el siguiente paso podría ser indexar vectores con la mantisa de dobles, o algo así, dando 48 bits de índice. Tristemente, no puedo encontrar esa discusión.


Además del paquete de Rmpfr, si usted está sufriendo de desbordamiento de enteros, es posible que desee probar el paquete int64.

Cuestiones relacionadas