it-swarm.com.de

Steuern der Anzahl der Dezimalstellen in der Druckausgabe in R

Es gibt eine Option in R, um die Kontrolle über die Ziffernanzeige zu bekommen. Beispielsweise:

options(digits=10)

soll die Berechnungsergebnisse bis zum Ende der R-Sitzung 10-stellig ausgeben. In der Hilfedatei von R lautet die Definition für den Ziffernparameter wie folgt:

ziffern: Steuert die Anzahl der Ziffern, die beim Drucken von numerischen Werten gedruckt werden sollen. Es ist nur ein Vorschlag. Gültige Werte sind 1 ... 22 mit Standard 7

Es heißt also, dies sei nur ein Vorschlag. Was ist, wenn ich immer 10 Stellen anzeigen möchte, nicht mehr oder weniger?

Meine zweite Frage ist, was ist, wenn ich mehr als 22 Stellen anzeigen möchte, d. H. Für genauere Berechnungen wie 100 Stellen? Ist das mit base R möglich, oder benötige ich dafür ein zusätzliches Paket/eine zusätzliche Funktion?

Edit: Dank jmoys Vorschlag habe ich sprintf("%.100f",pi) ausprobiert und es gab

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

das hat 48 Dezimalstellen. Ist dies die maximale Grenze, die R bewältigen kann?

100

Der Grund, warum dies nur ein Vorschlag ist, ist, dass Sie leicht eine Druckfunktion schreiben können, die den Optionswert ignoriert. Die integrierten Druck- und Formatierungsfunktionen verwenden standardmäßig den Wert options.

Was die zweite Frage betrifft, da R eine endliche Genauigkeitsarithmetik verwendet, sind Ihre Antworten nicht genauer als 15 oder 16 Dezimalstellen, sodass im Allgemeinen keine weiteren erforderlich sind. Die Pakete gmp und rcdd behandeln Arithmetik mit mehrfacher Genauigkeit (über eine Schnittstelle zur gmp-Bibliothek), aber dies bezieht sich hauptsächlich auf große Ganzzahlen und nicht auf mehr Dezimalstellen für Ihre Doppelten .

Mathematica oder Maple ermöglicht es Ihnen, so viele Dezimalstellen anzugeben, wie Ihr Herz es wünscht.

BEARBEITEN:
Es kann nützlich sein, über den Unterschied zwischen Dezimalstellen und signifikanten Zahlen nachzudenken. Wenn Sie statistische Tests durchführen, die auf Differenzen jenseits der 15. signifikanten Zahl beruhen, ist Ihre Analyse mit ziemlicher Sicherheit Trödel.

Auf der anderen Seite ist es weniger problematisch, wenn Sie sich nur mit sehr kleinen Zahlen beschäftigen, da R Zahlen verarbeiten kann, die so klein sind wie .Machine$double.xmin (normalerweise 2e-308).

Vergleichen Sie diese beiden Analysen.

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

Im ersten Fall treten Unterschiede zwischen Zahlen erst nach vielen signifikanten Zahlen auf, sodass die Daten "nahezu konstant" sind. Im zweiten Fall sind die Unterschiede zwischen den Zahlen zwar gleich groß, aber im Vergleich zur Größe der Zahlen selbst sind sie groß.


Wie von e3bo erwähnt, können Sie Gleitkommazahlen mit mehrfacher Genauigkeit mit dem Paket Rmpfr verwenden.

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")

Diese sind langsamer und speicherintensiver als normale (doppelte Genauigkeit) numeric Vektoren, können jedoch nützlich sein, wenn Sie ein schlecht konditioniertes Problem oder einen instabilen Algorithmus haben.

45
Richie Cotton

Wenn Sie die gesamte Ausgabe selbst produzieren, können Sie sprintf() verwenden, z.

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

gibt an, dass Sie eine Gleitkommazahl mit zehn Dezimalpunkten formatieren möchten (in %.10f das f ist für float und das .10 gibt zehn Dezimalstellen an).

Ich kenne keine Möglichkeit, Rs übergeordnete Funktionen zu zwingen, eine genaue Anzahl von Ziffern zu drucken.

Die Anzeige von 100 Stellen ist nicht sinnvoll, wenn Sie die üblichen R-Zahlen drucken, da die beste Genauigkeit, die Sie mit 64-Bit-Doppeln erzielen können, bei 16 Dezimalstellen liegt (siehe .Machine $ double.eps auf Ihrem System). Die restlichen Ziffern sind nur Junk.