我使用概述here的方法来确定F测试的临界F值。我的问题是the beta function is an integral。我的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选择的值。当该值减小时,运行时间线性上升,精度以对数方式改善。
有更好的方法吗?
答案 0 :(得分:2)
所以你想做一个反向的,不完整的beta函数。我很久以前就写过其中一个,远在遥远的银河系中。当然,今天我只是在MATLAB中调用betaincinv。
你只是不想通过小步长的数值积分来做到这一点。当然不像你在这里那样作为矩形规则集成。请注意,测试版对于像这样的参数有一些讨厌的形状。 (好吧,有点讨厌是一个很好的说法。它真的很讨厌。)
Abramowitz&amp;我记得Stegun有一些近似值可以提供帮助。然后,您可以使用牛顿方法快速完成结果。这很好用,因为积分的导数很容易评估。
答案 1 :(得分: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
的线性时间内完成。您必须自己决定使用它的范围以及您可以接受的错误。