Я искал полезный и полный код для распространения chi-square
в Delphi.Есть некоторые коды через сеть, но обычно они не работают или имеют недостающие части, не компилируются и т. Д. Есть также некоторые библиотеки, но меня интересует некоторый код, который я просто могу реализовать.
Я нашел что-то почти работающее.Некоторые немецкие части были исправлены, он компилируется и выдает p-values
для большинства данных:
function LnGamma (x : Real) : Real;
const
a0 = 0.083333333096;
a1 = -0.002777655457;
a2 = 0.000777830670;
c = 0.918938533205;
var
r : Real;
begin
r := (a0 + (a1 + a2 / sqr(x)) / sqr(x)) / x;
LnGamma := (x - 0.5) * ln(x) - x + c + r;
end;
function LnFak (x : Real) : Real;
var
z : Real;
begin
z := x+1;
LnFak := LnGamma(z);
end;
function Reihe (chi : Real; f : Real) : Real;
const MaxError = 0.0001;
var
Bruch,
Summe,
Summand : Real;
k, i : longint;
begin
Summe := 1;
k := 1;
repeat
Bruch := 1;
for i := 1 to k do
Bruch := Bruch * (f + 2 * i);
Summand := power(chi, 2 * k) / Bruch;
Summe := Summe + Summand;
k := succ(k);
until (Summand < MaxError);
Reihe := Summe;
end;
function IntegralChi (chisqr : Real; f : longint) : Real;
var
s : Real;
begin
S := power((0.5 * chisqr), f/2) * Reihe(sqrt(chisqr), f)
* exp((-chisqr/2) - LnGamma((f + 2) / 2));
IntegralChi := 1 - s;
end;
Он работает довольно хорошо для относительно больших результатов.
Например:
Для Chi = 1.142132
и df = 1
Я получаю p
о 0.285202
, что идеально.То же, что SPSS
результат или другие программы.
Но, например, Chi = 138.609137
и df = 4
Я должен получить кое-что о 0.000000
, но я получаю ошибку переполнения с плавающей запятой в функции Reiche
.Summe
и Summand
очень велики.
Я признаю, что понимание функции распределения не является моей сильной стороной, поэтому, возможно, кто-то скажет мне, что я сделал неправильно?
Спасибо большоемного для информации