3

これがこの質問を投稿するのに適切な場所ではない場合、私の謝罪は、R での統計計算の数値安定性に関連しています。

非常に高い値の df2 の F 値を計算しようとしていますが、数値的に不安定なようです。

nrange <- 350000:450000
f <- qf(1e-8, 8, nrange, lower.tail=FALSE)
plot(f ~ nrange)

次のようになります。F値グラフ

本質的にそのあたりdf2=400000ではもはや正確ではありません。問題は、この問題を回避する方法を知っている人はいますか? たとえば、F 分布は 2 つのカイ 2 乗に近似することができ (例: http://en.wikipedia.org/wiki/F-distribution#Related_distributions_and_properties)、そのドキュメントでは、大きな d2 のqf使用について何か述べています。qchisq実際qchisqにはこれらの値で正確に見えますが、これを実装する方法は明らかではありません。例えば

qf(0.05, 8, 100, lower.tail=FALSE)

(qchisq(0.05, 8, lower.tail=FALSE)/8) / (qchisq(0.05, 100, lower.tail=FALSE)/100)

同じ結果を出さないでください。

問題は、大きな df2 の正確な F 値を取得するにはどうすればよいかということです。どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

2

オープンソース プロジェクトの便利な点の 1 つは、それらがオープン ソースであることです。

fortune(250)

As Obi-Wan Kenobi may have said in Star Wars: "Use the source, Luke!"
   -- Barry Rowlingson (answering a question on the documentation of some implementation details)
      R-devel (January 2010)

のソースコードを見てみるとqf

https://svn.r-project.org/R/trunk/src/nmath/qf.c

特にこのビット

/* fudge the extreme DF cases -- qbeta doesn't do this well.
   But we still need to fudge the infinite ones.
 */

if (df1 <= df2 && df2 > 4e5) {
if(!R_FINITE(df1)) /* df1 == df2 == Inf : */
    return 1.;
/* else */
return qchisq(p, df1, lower_tail, log_p) / df1;
}

4e5 を超える値をごまかしていることがわかります。( df2df2 == Inf の場合と同じ結果を想定して完全に無視)

于 2013-02-27T05:19:31.817 に答える