¿Qué es el desbordamiento de enteros en R y cómo puede suceder?

Tengo algunos cálculos en curso y recibo la siguiente advertencia (es decir, no es un error):

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

En este hilo, las personas afirman que los desbordamientos de enteros simplemente no ocurren. O R no es demasiado moderno o no tienen razón. Sin embargo, ¿qué se supone que debo hacer aquí? Si uso tan as.numeric como sugiere la advertencia, es posible que no explique el hecho de que la información se haya perdido mucho antes. myvar se lee de un archivo .csv, ¿no debería R 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?

EDITAR: corro:

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

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

R usa enteros de 32 bits para vectores enteros, por lo que el rango de enteros representables está restringido a aproximadamente +/- 2 * 10 ^ 9.

La expansión a números enteros más grandes está siendo considerada por R Core, pero no va a suceder en el futuro cercano.

Si desea una capacidad “bignum”, instale el paquete Rmpfr de Martin Maechler [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 hay 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 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, sugiere trabajar hacia el desarrollo en un lenguaje similar a Lisp [PDF]. Hay un lenguaje comstackdo llamado Clojure (pronunciado como los que hablan inglés dirían “cierre”) con una interfaz experimental, Rincanter.

Actualizar:

Las nuevas versiones de R (3.0. +) Tienen enteros de 53 bits de un género (usando la mantisa numeric ). Cuando a un elemento vectorial “entero” se le asigna un valor superior a “.Machine $ integer.max”, todo el vector se ve forzado a “numérico”, también conocido como “doble”. El valor máximo para integers permanece como estaba, sin embargo, puede haber coerción de vectores enteros a dobles para preservar 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 usar la clase de carácter como objective y luego manipular. Si hay una coacción a los valores de NA, habrá una advertencia.

En resumen, el integer es un tipo exacto con un rango limitado, y el numeric es un tipo de punto 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í hay una explicación de Brian D. Ripley:

Significa que está tomando la media [en su caso, la sum – @aix] de algunos enteros muy grandes, y el cálculo se está desbordando. Es solo una advertencia.

Esto no sucederá en el próximo lanzamiento de R.

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

El entero más grande que puede crear en su máquina viene dado por .Machine$integer.max .

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

Agregar un entero positivo a esto provoca un desbordamiento, devolviendo 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 superar este límite agregando valores de coma flotante.

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

Como en su caso la advertencia se emite por sum , esto indica que el desbordamiento ocurre cuando los números se sumn. La sum(as.numeric(.)) solución sugerida sum(as.numeric(.)) Debería ser el truco.

¿Cuál es la longitud máxima de 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 serán 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 desde 2012), no tendrá suficiente memoria para asignar vectores tan largos.

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 Rmpfr , si está sufriendo un desbordamiento de enteros, es posible que desee probar el paquete int64 .