web-dev-qa-db-ja.com

2.2e-16より小さいp値を取得できないのはなぜですか?

Rでt検定とカイ二乗でこの問題を見つけましたが、この問題は一般的に他の検定に当てはまると思います。私が行った場合:

_a <- 1:10
b <- 100:110
t.test(a,b) 
_

取得:_t = -64.6472, df = 18.998, p-value < 2.2e-16_。私はコメントから_2.2e-16_が_.Machine$double.eps_-_1 + x != 1_のような最小の浮動小数点数であることを知っていますが、もちろんRはそれよりはるかに小さい数を表すことができます。私はまた、R FAQ Rが浮動小数点数を53桁の精度に丸める必要があることを知っています: R FAQ

いくつかの質問:(1)私はそれをprecisionの53桁の数字として読み取るか、Rの値であるかを正確に計算していません_< .Machine$double.eps_ ? (2)なぜ、そのような計算を行うとき、Rは、精度がいくらか失われても、p値に対してより小さい値を表示する手段を提供しないのですか? (3)精度をいくらか落としても、より小さいp値を表示する方法はありますか?単一のテストでは2桁の10進数の有効数字で問題ありません。ボンフェローニで正しい値を取得するには、さらに多くの値が必要になります。 「精度が落ちています」と言ったとき、53桁未満の数字だと思いますが、(4)私は完全に誤解しており、p値_< .Machine$double.eps_は非常に不正確ですか? (5)Rは正直で、他の統計パッケージは正直ではありませんか?

私の分野では、非常に小さいp値が標準で、いくつかの例があります。 http://www.ncbi.nlm.nih.gov/pubmed/20154341http:// www。 plosgenetics.org/article/info%3Adoi%2F10.1371%2Fjournal.pgen.1002215 これが、このような小さいp値を表す理由です。

あなたの助けをありがとう、そのような厄介な質問をして申し訳ありません。

32

このようなものを試してくださいt.test(a,b)$p.value必要な精度が得られるかどうか確認してください。結果を出力することは、必要な精度を持つ実際に保存されているコンピューターの値よりも関係があると思います。

7
eWizardII

ここで回答やコメントを交換する際、いくつかのことに戸惑っています。

まず、OPの元の例を試しても、ここで議論されているものほど小さいp値は得られません(いくつかの異なる2.13.xバージョンとR-devel):

a <- 1:10
b <- 10:20
t.test(a,b)
## data:  a and b 
## t = -6.862, df = 18.998, p-value = 1.513e-06

第二に、グループ間の違いをはるかに大きくすると、@ eWizardIIによって提案された結果が得られます。

a <- 1:10
b <- 110:120
(t1 <- t.test(a,b))
# data:  a and b 
# t = -79.0935, df = 18.998, p-value < 2.2e-16
#
> t1$p.value
[1] 2.138461e-25

t.testの印刷出力の動作は、stats:::print.htestへの呼び出しによって駆動されます(これは、OPによって注記されているように、chisq.testなどの他の統計テスト関数によっても呼び出されます)。 turnはformat.pvalを呼び出し、_pの値より小さいeps(デフォルトでは.Machine$double.eps)の値を< epsとして表示します。私は自分がそのような一般的に鋭いコメンターに同意できないことに驚いています...

最後に、非常に小さいp値の正確な値について心配するのは馬鹿げているように思われますが、OPはこれらの値がバイオインフォマティクスの文献で証拠の強さの指標としてしばしば使用されることは正しいです-たとえば、100,000個の候補遺伝子をテストし、結果のp値の分布を確認します(この種の手順の一例については、「火山プロット」を検索してください)。

20
Ben Bolker

2つの質問:

1)1e-16と1e-32のp値の間に統計的意味のどのような可能な違いがありますか?本当に正当化できる場合は、ログに記録された値を使用する方法です。

2)Rの数値精度に関心があるのに、なぜウィキペディアを使用するのですか?

R-FAQは、「その他の[非整数を意味する]数値は(通常)53桁の精度に丸められる必要があると述べています。 16桁が限界です。これは、コンソールでの精度の限界を取得する方法です。

> .Machine$double.eps
[1] 2.220446e-16

[0,1]の範囲で解釈すると、その数は事実上ゼロです。

13
42-

あなたがリンクしたウィキペディアのページは、Rが使用しないDecimal64型のものでした。標準問題のdoubleを使用しています。

最初に、_.Machine_ヘルプページからのいくつかの定義。

double.eps: ‘1 + x!= 1’となるような最小の正の浮動小数点数 ‘x’。 ...通常は「2.220446e-16」。

double.xmin:ゼロ以外の正規化された最小の浮動小数点数...通常は「2.225074e-308」。

したがって、2.2e-16未満の数値を表すことができますが、その精度は低くなり、計算で問題が発生します。表現可能な最小値に近い数値でいくつかの例を試してください。

_2e-350 - 1e-350
sqrt(1e-350)
_

ボンフェローニの修正をしたいとコメントで述べました。このために独自のコードをロールするのではなく、代わりにp.adjust(your_p_value, method = "bonferroni")を使用することをお勧めします。 _pairwise.t.test_はこれを使用します。

9
Richie Cotton

一部のRパッケージはこの問題を解決します。最良の方法は、pspearmanパッケージを使用することです。

source("http://www.bioconductor.org/biocLite.R")
biocLite("pspearman")
library("pspearman")
a=c(1:110,110)
b=1:111
out <- spearman.test(a, b, alternative = "greater", approximation="t-distribution")
out$p.value

[1] 3.819961e-294

4
user1277593

最近同じ問題がありました。仲間の統計学者は以下を推奨します:

A <- cor.test(…)
p <- 2* pt(A$statistic,  df = A$parameter, lower.tail=FALSE)
2
Vince