2010-02-18 14 views
77

C'è un'opzione in R per ottenere il controllo sul display di cifre. Ad esempio:Controllo del numero di cifre decimali nell'output di stampa in R

options(digits=10) 

deve fornire i risultati del calcolo in 10 cifre fino alla fine della sessione R. Nel file di aiuto della R, la definizione dei parametri per le cifre è la seguente:

cifre: controlla il numero di cifre di stampa durante la stampa i valori numerici. È solo un suggerimento. I valori validi sono 1 ... 22 con predefinito

Quindi, dice che questo è solo un suggerimento. Cosa succede se mi piace visualizzare sempre 10 cifre, non più o meno?

La mia seconda domanda è: cosa succede se mi piace visualizzare più di 22 cifre, ad esempio per calcoli più precisi come 100 cifre? È possibile con la base R o ho bisogno di un pacchetto/funzione aggiuntivo per quello?

Edit: Grazie al suggerimento di jmoy, ho provato sprintf("%.100f",pi) e ha dato

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000" 

che ha 48 decimali. È questo il limite massimo che R può gestire? In realtà, Pi ha un numero infinito di decimali.

+4

Solo le prime 15 cifre di pi sono accurate. Confronta con il vero valore http://joyofpi.com/pi.html –

+1

Hai ragione. Perché è diverso in R? –

+3

Vedere le FAQ su R http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-thth-these-numbers-are-equal_003f –

risposta

38

Il motivo per cui è solo un suggerimento è che si potrebbe facilmente scrivere una funzione di stampa che ignorava il valore delle opzioni. Le funzioni di stampa e formattazione incorporate utilizzano il valore options come predefinito.

Per quanto riguarda la seconda domanda, poiché R utilizza l'aritmetica di precisione finita, le risposte non sono accurate oltre 15 o 16 posizioni decimali, quindi in generale, non sono necessarie ulteriori. I pacchetti gmp e rcdd si occupano di aritmetica di precisione multipla (tramite un'interfaccia alla libreria gmp), ma questo è principalmente correlato ai grandi numeri interi piuttosto che a più cifre decimali per i vostri duplicati.

Mathematica o Maple ti consentiranno di fornire quanti decimali il tuo cuore desidera.

MODIFICA:
Potrebbe essere utile pensare alla differenza tra cifre decimali e cifre significative. Se stai facendo test statistici che si basano su differenze oltre la 15a cifra significativa, allora la tua analisi è quasi certamente spazzatura.

D'altra parte, se si tratta solo di numeri molto piccoli, questo è meno di un problema, poiché R può gestire numeri piccoli come .Machine$double.xmin (in genere 2e-308).

Confrontare queste due analisi.

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 

Nel primo caso, le differenze tra numeri si verificano solo dopo molte cifre significative, quindi i dati sono "quasi costanti". Nel secondo caso, anche se le dimensioni delle differenze tra i numeri sono uguali, rispetto alla grandezza dei numeri stessi sono grandi.


Come menzionato da e3bo, è possibile utilizzare più precisione numeri in virgola utilizzando il pacchetto Rmpfr galleggiante.

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825") 

Questi sono più lento e più intensivo di memoria da usare rispetto regolare (doppia precisione) numeric vettori, ma può essere utile se si ha un problema mal condizionata o algoritmo instabile.

+3

Come [questa pagina Rwiki] (http://rwiki.sciviews.org/doku.php?id=misc:r_accuracy:high_precision_arithmetic) dimostra, il [pacchetto Rmpfr] (http: //cran.at.r-project. org/web/packages/Rmpfr/index.html) consente un'aritmetica in virgola mobile ad alta precisione in R. – e3bo

+0

Ma Rmpfr può essere utilizzato da qualsiasi pacchetto R per migliorarne la precisione? Oppure può usare solo le funzioni codificate internamente su di esso? – skan

+2

Stavo pensando proprio a questo: "Se stai facendo test statistici che si basano su differenze oltre la 15a cifra significativa, allora la tua analisi è quasi certamente spazzatura." ma mi chiedevo quale sarebbe il numero di cifre a cui concluderei è spazzatura, e pensai 5, ma sarei felice di essere corretto. – PatrickT

29

Se si producono l'intera produzione da soli, è possibile utilizzare sprintf

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

Io non conosco alcun modo di forzare le funzioni di livello superiore di R per stampare un numero esatto di cifre.

La visualizzazione di 100 cifre non ha senso se si stampano i numeri consueti di R, poiché la massima precisione ottenibile utilizzando i doppi a 64 bit è di circa 16 cifre decimali (guardare .Machine $ double.eps sul sistema). Le cifre rimanenti saranno solo spazzatura.

+0

In realtà, alcuni test chi-quadrato speciali che ho applicato richiedevano centinaia di decimali per fornire risultati accurati. Anche il pi ha migliaia di decimali. Ecco perché mi stavo chiedendo circa 100 o più cifre. –

+12

pi ha un numero infinito di decimali; ciò non significa che un computer possa memorizzarli. – Shane

+0

Immagino che questo sia uno scenario in cui Mathematica è superiore a R. – skan

Problemi correlati