2

ここで概説した方法を使用して、F 検定の臨界 F 値を決定しています。私の問題は、ベータ関数が積分であることです。私の x と y はそれぞれ 0.5 と 248 です。次の(Java)コードを使用して、合計による統合を試みました。

static double BetaFunction(double x, double y){
    double betaFunction=0.0;
    double inc=0.00001, t=0;
    double xM1=x-1, yM1=y-1;

    do{
        t+=inc;         
        betaFunction+=Math.pow(t, xM1)*Math.pow(1.0-t, yM1)*inc;
    } while (t<1.0);

    return betaFunction;
}

残念ながら、返される値は、inc に選択した値に大きく依存します。この値を減らすと、実行時間は直線的に増加し、精度は対数的に向上します。

これを行うより良い方法はありますか?

4

2 に答える 2

2

したがって、逆の不完全なベータ関数を実行する必要があります。私はずっと前に、はるか彼方の銀河系でこれらの1つを書きました。もちろん、今日は MATLAB で betaincinv を呼び出すだけです。

小さなステップサイズでの数値積分によってそれをしたくないだけです。確かに、ここにあるように、長方形ルールの統合としてではありません。ベータ版は、このようなパラメーターに対してやや厄介な形をしていることに注意してください。(わかりました、やや意地悪というのはいい言い方です。それは本当に単純に意地悪です。)

Abramowitz & Stegun には、私が思い出したときに役立ついくつかの概算があります。次に、ニュートン法による簡単な手順を使用して結果を絞り込むことができます。積分の導関数は非常に簡単に評価できるため、これはうまく機能します。

于 2013-08-29T20:29:12.587 に答える
1

閉じた形式の積分解を使用せずに実行できる最善の方法は、スターリングの近似 ( http://en.wikipedia.org/wiki/Stirling%27s_approximation )を使用することです。

これは、「大きな」n の真の値に近づく閉じた形式のソリューションです。

sqrt(2Pi)*x^(x-.5)*y^(y-.5)/(x+y)^(x+y-.5)

それを計算することは、少なくとも と の線形時間で行うことができxますy。どの範囲で使用するか、どのエラーを許容できるかを自分で決める必要があります。

于 2013-08-29T20:20:59.060 に答える