3

RのF検定からp値を計算していますが、1e-16より低い値を表示するのに問題があるようです。たとえば、自由度1,200の80〜90のF値の場合:

> 1-pf(80:90,1,200)
 [1] 2.220446e-16 2.220446e-16 1.110223e-16 1.110223e-16 0.000000e+00 0.000000e+00 0.000000e+00
 [8] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00

pf()関数の計算の精度を上げるにはどうすればよいですか?

4

2 に答える 2

12

この低いp値はとにかく意味がありません。第一に、ほとんどの計算はわずかな近似を使用するため、 p値がゼロに近づくにつれて不正確さが結果を支配するようになり、第二に、おそらくもっと重要なことに、モデル化された分布からの母集団のわずかな偏差が、希望する精度を圧倒します。

p値を「p <0.0001」として引用するだけで、それで完了します。

于 2013-01-31T16:31:21.860 に答える
4

p値に関するジャックの実用的なアドバイスに加えて、関数は明確に定義されているので(実用的でない場合)、これが機能しない有限精度の数学的理由を示します。

.Machine$double.eps2.220446e-16であり、それは1に追加して何か違うものを得ることができる最小の数です。つまり、1とは異なり、それが得られる最小の値です。

> pf(80:90,1,200)
 [1] 1 1 1 1 1 1 1 1 1 1 1
> sprintf("%.17f",pf(80:90,1,200))
 [1] "0.99999999999999978" "0.99999999999999978" "0.99999999999999989"
 [4] "0.99999999999999989" "1.00000000000000000" "1.00000000000000000"
 [7] "1.00000000000000000" "1.00000000000000000" "1.00000000000000000"
[10] "1.00000000000000000" "1.00000000000000000"
> sprintf("%a", pf(80:90,1,200))
 [1] "0x1.ffffffffffffep-1" "0x1.ffffffffffffep-1" "0x1.fffffffffffffp-1"
 [4] "0x1.fffffffffffffp-1" "0x1p+0"               "0x1p+0"              
 [7] "0x1p+0"               "0x1p+0"               "0x1p+0"              
[10] "0x1p+0"               "0x1p+0"              

ただし、近似値$ 1-p =-\ ln(p)$と、p値の対数をより正確に取得できるという事実を使用できます。

> -pf(80:90,1,200,log.p=TRUE)
 [1] 2.540347e-16 1.770938e-16 1.236211e-16 8.640846e-17 6.047690e-17
 [6] 4.238264e-17 2.974043e-17 2.089598e-17 1.470045e-17 1.035491e-17
[11] 7.303070e-18
于 2013-01-31T16:44:57.867 に答える