Warum kann ich keinen p-Wert kleiner als 2.2e-16 bekommen?
Ich gefunden habe dieses Problem mit t-tests und chi-Quadrat in R, aber ich nehme an, dieses Problem gilt generell für andere tests. Wenn ich das mache:
a <- 1:10
b <- 100:110
t.test(a,b)
Bekomme ich: t = -64.6472, df = 18.998, p-value < 2.2e-16
. Ich weiß aus den Kommentaren, dass 2.2e-16
ist der Wert von .Machine$double.eps
- die kleinste Gleitkommazahl, so dass 1 + x != 1
aber natürlich R kann zahlen darstellen, die viel kleiner als die. Ich weiß auch aus dem R-FAQ, die R hat Runde schwimmt 53 binäre stellen Genauigkeit: R FAQ.
Ein paar Fragen: (1) gehe ich Recht in der Lesung, als 53 binäre stellen Präzision oder sind die Werte, die in R < .Machine$double.eps
nicht genau berechnet? (2) Warum, wenn man solche Berechnungen nicht R keine Möglichkeit, die Anzeige einen kleineren Wert für die p-Wert, sogar mit einem gewissen Verlust an Präzision? (3) gibt es einen Weg, um einen kleineren p-Wert, auch wenn ich verlieren einige der Präzision? Für einen einzigen test 2 Dezimalstellen signifikanten zahlen würde in Ordnung sein, für Werte werde ich Bonferroni zu korrigieren, werde ich mehr brauchen. Wenn ich sage, "verlieren etwas an Präzision" ich denke, dass < 53 binäre stellen, aber (4) bin ich völlig Irre und jede p-Wert < .Machine$double.eps
ist Wild ungenau? (5) Ist R nur ehrlich und die anderen stats sind die Pakete nicht?
In meinem Bereich sehr kleine p-Werte sind in der norm, einige Beispiele: http://www.ncbi.nlm.nih.gov/pubmed/20154341http://www.plosgenetics.org/article/info%3Adoi%2F10.1371%2Fjournal.pgen.1002215 und dies ist der Grund, warum ich möchte darstellen, wie kleine p-Werte.
Danke für Eure Hilfe, sorry für so eine unerlaubte Frage.
InformationsquelleAutor der Frage arandomlypickedname | 2011-08-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Probieren Sie etwas wie dieses
t.test(a,b)$p.value
sehen, ob das gibt Ihnen die Genauigkeit die Sie brauchen. Ich glaube, es hat mehr zu tun mit dem drucken des Ergebnisses, als es die tatsächliche gespeicherte computer-Wert, sollte über die notwendige Präzision.InformationsquelleAutor der Antwort eWizardII
Ich bin verwirrt durch einige Dinge in den Austausch von Antworten und Kommentare hier.
Zuerst von allen, wenn ich versuche die OP ' s original-Beispiel, das ich nicht bekommen p Wert so klein wie die sind, die diskutiert werden hier (mehrere verschiedene 2.13.x-Versionen und R-devel):
Zweite, wenn ich den Unterschied zwischen den Gruppen sehr viel größer, ich in der Tat die Ergebnisse, die angeregt durch @eWizardII:
Das Verhalten der gedruckten Ausgabe in
t.test
wird angetrieben von einem Aufrufstats:::print.htest
(die man auch von anderen statistischen Tests Funktionen wiechisq.test
wie bereits von der OP), die wiederum ruftformat.pval
präsentiert p Werte kleiner als der Wert voneps
(das ist.Machine$double.eps
standardmäßig) als< eps
. Ich bin überrascht, zu finden, der mich uneins mit diesen allgemein scharfsinnige Kommentatoren ...Schließlich, obwohl es scheint dumm zu kümmern, der genaue Wert der eine sehr kleine p Wert, die OP ist richtig, dass diese Werte werden oft als Indizes der Stärke der Evidenz in der Bioinformatik Literatur -- man könnte beispielsweise testen zu 100.000 Gene und Blick auf die Verteilung der resultierenden p Werte (Suche nach "volcano plot" für ein Beispiel dieser Art von Verfahren).
InformationsquelleAutor der Antwort Ben Bolker
Zwei Fragen:
1) Was ist der mögliche Unterschied in der statistischen Implikation wäre es zwischen p-Werten von 1e-16 1e-32? Wenn Sie wirklich begründen können Sie es dann mit den protokollierten Werten ist der Weg zu gehen.
2) Warum verwenden Sie Wikipedia, wenn Ihr Interesse an der numerischen Genauigkeit von R?
R-FAQ sagt "Andere [D. H. nicht-integer] zahlen müssen gerundet werden, um (in der Regel) 53 binäre stellen Genauigkeit." 16-stellig ist, über die Grenze. Dies ist, wie man die Grenzen der Genauigkeit, wenn auf der Konsole:
Diese Nummer ist effektiv null, wenn Sie interpretiert wird, auf einen Bereich von [0,1]
InformationsquelleAutor der Antwort 42-
Den Wikipedia-Seite, die Sie verlinkt war für die Decimal64 Art, die R nicht verwenden – er verwendet standard-Ausgabe verdoppelt.
Zunächst einige Definitionen aus der
.Machine
Hilfe-Seite.So darstellen können zahlen, die kleiner als 2.2 e-16, aber Ihre Genauigkeit ist dimished, und es verursacht Probleme mit Berechnungen. Versuchen Sie, einige Beispiele mit zahlen in der Nähe der kleinsten darstellbaren Wert.
Sie erwähnt in einem Kommentar, dass Sie das tun wollten bonferroni-Korrekturen. Anstatt Ihre eigenen Rollen-code für diese, ich schlage vor, daß du
p.adjust(your_p_value, method = "bonferroni")
statt.pairwise.t.test
verwendet.InformationsquelleAutor der Antwort Richie Cotton
Einige R-Pakete, dieses Problem zu lösen. Der beste Weg ist durch Paket pspearman.
[1] 3.819961 e-294
InformationsquelleAutor der Antwort user1277593
Hatte vor kurzem dasselbe problem. Fellow Statistiker empfiehlt:
InformationsquelleAutor der Antwort Vince