2012-01-10 11 views
24

ho qualche calcolo in corso e ottenere il seguente avviso (vale a dire non è un errore):Cos'è l'overflow dei numeri interi in R e come può accadere?

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

In questo thread persone affermano che integer overflow semplicemente non accadrà. O R non è eccessivamente moderno o non è giusto. Tuttavia, cosa dovrei fare qui? Se uso as.numeric come suggerisce l'avviso, potrei non tenere conto del fatto che le informazioni sono state perse molto prima. myvar viene letto come un file .csv, quindi non dovrebbe R capire che è necessario un campo più grande? Ha già tagliato qualcosa?

Qual è la lunghezza massima di integer o numeric? Consiglieresti qualche altro tipo di campo/modalità?

EDIT: ho eseguito:

versione R 2.13.2 (2011-09-30) Piattaforma: x86_64-apple-darwin9.8.0/x86_64 (64-bit) all'interno di R Studio

risposta

35

Puoi rispondere a molte delle tue domande leggendo la pagina di aiuto ?integer. Si dice:

R utilizza numeri interi a 32-bit per vettori interi, quindi l'intervallo di interi rappresentabili è limitato a circa +/- 2 * 10^9.

L'espansione a numeri interi più grandi è all'esame di R Core, ma non accadrà nel prossimo futuro.

Se si desidera una capacità di "bignum" quindi installare di Martin Maechler Rmpfr package [PDF]. Raccomando il pacchetto 'Rmpfr' a causa della reputazione dell'autore. Martin Maechler è anche fortemente coinvolto nello sviluppo del pacchetto Matrix e anche in R Core. Ci sono alternative, inclusi pacchetti aritmetici come "gmp", "Brobdingnag" e "Ryacas" (quest'ultimo offre anche un'interfaccia matematica simbolica).

Successivamente, per rispondere ai commenti critici nella risposta a cui si è collegati e su come valutare la pertinenza del proprio lavoro, considerare quanto segue: Se esistesse la stessa funzionalità statistica disponibile in una di quelle "moderne" lingue come è in R, probabilmente vedresti una migrazione dell'utente in quella direzione. Ma direi che la migrazione, e certamente la crescita, è in direzione R al momento. R è stato costruito da statistici per le statistiche.

C'era una volta una variante Lisp con un pacchetto di statistiche, XLISP-Stat, ma la sua principale sviluppatore e sostenitore è ora membro di R-Core. D'altra parte uno dei primi sviluppatori R, Ross Ihaka, suggests working toward development in a Lisp-like language [PDF]. Esiste un linguaggio compilato chiamato Clojure (pronunciato come chi parla inglese direbbe "chiusura") con un'interfaccia sperimentale, Rincanter.

Aggiornamento:

Le nuove versioni R (. 3.0 +) ha 53 bit interi di una specie (utilizzando il numeric mantissa). Quando un elemento vettoriale "integer" è assegnato un valore superiore '.Machine $ integer.max', l'intero vettore è costretto a 'numerico', pseudonimo 'doppio'. valore massimo per integers rimane com'era, tuttavia, ci può essere coercizione di vettori interi a doppie per preservare l'accuratezza nei casi precedentemente genererebbero troppopieno. Sfortunatamente, la lunghezza degli elenchi, delle dimensioni di matrice e matrice e dei vettori è ancora impostata su integer.max.

Quando si legge in grandi valori da file, è probabilmente più sicuro utilizzare il carattere di classe come il bersaglio e poi manipolare. Se c'è una coercizione ai valori di NA, ci sarà un avvertimento.

+0

+1 per il pacchetto Rmpfr! –

+0

Anche il pacchetto 'gmp' può essere di interesse – James

+0

Sto facendo un DT [, sapply (.SD, sum, na.rm = T)] con un data.table riempito con 0,1 e NA, con 2 milioni filari. E ottengo il messaggio di overflow, ma il numero massimo generato dovrebbe essere inferiore a 2 milioni. Cosa potrebbe accadere? – skan

17

In breve, integer è un tipo esatto con intervallo limitato e numeric è un tipo a virgola mobile che può rappresentare un intervallo di valori molto più ampio ma inesatto. Consultare le pagine della guida (?integer e ?numeric) per ulteriori dettagli.

Per quanto riguarda il troppo pieno, qui è un explanation da Brian D. Ripley:

Significa che si sta assumendo la media [nel tuo caso, la somma - @aix] di alcuni molto grandi numeri interi e il calcolo sta traboccando. È solo un avvertimento.

Questo non accadrà nella prossima release di R.

È possibile specificare che un numero è un intero dandogli il suffisso L, per esempio, 1L è il numero intero uno, al contrario di 1 che è a virgola mobile, con classe "numeric".

Il numero intero più grande che è possibile creare sulla macchina è dato da .Machine$integer.max.

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

Aggiunta di un numero intero positivo a questo provoca un overflow, tornando 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" 

È possibile aggirare questo limite aggiungendo valori in virgola mobile.

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

Dal momento che nel tuo caso l'avviso è emesso da sum, questo indica che l'overflow si verifica quando i numeri si sommano. La soluzione suggerita sum(as.numeric(.)) dovrebbe fare il trucco.

+1

ok, cosa succede se voglio avere un calcolo esatto e avere numeri grandi?Esattamente, gli overflow vengono creati quando vengono aggiunti i numeri. Posso avere comunque un risultato esatto? –

+0

Ho risolto la descrizione di cosa succede quando aggiungi numeri al numero intero più grande. –

+0

... ma prova questo: 'class (sum (c (.Machine $ integer.max, as.integer (1))))' per me ottengo un overflow di interi (usando 2.14). – Dason

4

Qual è la lunghezza massima di numero intero o numerico?

I vettori sono attualmente indicizzati con un numero intero, quindi la lunghezza massima è data da .Machine$integer.max. Come ha fatto notare DWin, tutte le versioni di R attualmente usano interi a 32 bit, quindi questo sarà 2^31 - 1, o un po 'più di 2 miliardi di euro.

A meno che non stiate preparando hardware serio (o lo state leggendo in futuro, ciao dal 2012) non avrete abbastanza memoria per allocare i vettori tanto a lungo.

Ricordo una discussione in cui l'R-core (Brian Ripley, penso) suggeriva che il passo successivo potrebbe essere quello di indicizzare i vettori con la mantissa dei doppi, o qualcosa di così intelligente, dando effettivamente 48 bit di indice. Purtroppo, non riesco a trovare quella discussione.


Oltre al pacchetto Rmpfr, se si è affetti integer overflow, si potrebbe desiderare di provare il pacchetto int64.

Problemi correlati