37

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

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

私は得る: t = -64.6472, df = 18.998, p-value < 2.2e-16. 2.2e-16の値であるコメントから知っていますが、もちろん R はそれよりもはるかに小さい数値を表すことができます.Machine$double.eps1 + x != 1R FAQ から、R は float を 53 バイナリ桁の精度に丸める必要があることも知っています: R FAQ

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

私の分野では、非常に小さな p 値が標準です。いくつかの例を 示します。 .1371%2Fjournal.pgen.1002215これが、このような小さな p 値を表現したい理由です。

助けてくれてありがとう、そのような曲がりくねった質問でごめんなさい。

4

6 に答える 6

22

ここでの回答とコメントの交換で、いくつかのことに困惑しています。

まず、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駆動されます(これは、OP で指摘されているように、stats:::print.htestなどの他の統計テスト関数によっても呼び出されます)。デフォルトでは) as . 私は、そのような一般的に抜け目のないコメンターと意見が一致していないことに驚いています...chisq.testformat.pvaleps.Machine$double.eps< eps

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

于 2011-08-14T14:31:31.467 に答える
13

2つの質問:

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

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

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

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

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

于 2011-08-07T04:43:29.900 に答える
11

あなたがリンクしたウィキペディアのページは、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はこれを使用します。

于 2011-08-07T12:57:58.773 に答える
9

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

于 2011-08-07T04:23:15.360 に答える
5

一部の 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

于 2012-09-27T08:27:34.033 に答える