Lazstats: Massive refactoring of DescriptiveUnits: Move calculation to new TDescriptiveStats class. More user-friendly interface.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7730 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2020-10-02 17:14:33 +00:00
parent 0175c44fa5
commit c25230eb89
6 changed files with 682 additions and 338 deletions

View File

@ -24,7 +24,7 @@ function poly(const c: Array of double; nord: integer; x: double): double; // RE
procedure swilk (var init : boolean; const x: DblDyneVec; n, n1, n2: integer;
const a: DblDyneVec; var w, pw: double; out ifault: integer);
procedure SVDinverse(VAR a : DblDyneMat; N : integer);
function inverset(Probt, DF : double) : double;
function InverseT(Prob, DF: double): double;
function inversechi(p : double; k : integer) : double;
function STUDENT(q,v,r : real) : real;
function realraise(base,power : double ): double;
@ -43,10 +43,12 @@ function UniStats(N : integer; VAR X : DblDyneVec; VAR z : DblDyneVec;
VAR SESkew : double; VAR SEkurtosis : double; VAR min : double;
VAR max : double; VAR Range : double; VAR MissValue : string) :
integer;
function WholeValue(value : double) : double;
function FractionValue(value : double) : double;
function Quartiles(TypeQ : integer; pcntile : double; N : integer;
VAR values : DblDyneVec) : double;
//function WholeValue(value : double) : double;
//function FractionValue(value : double) : double;
function Quartiles(TypeQ: integer; Percentile: double; N: integer;
const Values: DblDyneVec): double;
function KolmogorovProb(z: double): double;
function KolmogorovTest(na: integer; const a: DblDyneVec; nb: integer;
@ -944,15 +946,14 @@ begin
Result := prob;
end;
function inverset(Probt, DF : double) : double;
{ Returns the t value corresponding to a two-tailed t test probability. }
function InverseT(Prob, DF: double): double;
var
z, W, tValue: double;
z, W: double;
begin
// Returns the t value corresponding to a two-tailed t test probability.
z := inversez(Probt);
W := z * ((8.0 * DF + 3.0) / (1.0 + 8.0 * DF));
tValue := sqrt(DF * (exp(W * W / DF) - 1.0));
inverset := tValue;
z := InverseZ(Prob);
W := z * ((8.0 * DF + 3.0) / (1.0 + 8.0 * DF));
Result := sqrt(DF * (exp(W * W / DF) - 1.0));
end;
//---------------------------------------------------------------------
@ -1644,11 +1645,11 @@ begin
end;
function Quartiles(TypeQ : integer; pcntile : double; N : integer;
VAR values : DblDyneVec) : double;
VAR
whole, fraction, Myresult, np, avalue, avalue1 : double;
subscript : integer;
function Quartiles(TypeQ: integer; Percentile: double; N: integer;
const Values: DblDyneVec): double;
var
whole, fraction, np, lValue, lValue1: double;
subscript: integer;
begin
{ for i := 0 to N - 1 do // this is for debugging
begin
@ -1656,46 +1657,52 @@ begin
OutPutFrm.RichEdit.Lines.Add(outline);
end;
OutPutFrm.ShowModal;
OutPutFrm.RichEdit.Clear; }
case TypeQ of
1 : np := pcntile * N;
2 : np := pcntile * (N + 1);
3 : np := pcntile * N;
4 : np := pcntile * N;
5 : np := pcntile * (N - 1);
6 : np := pcntile * N + 0.5;
7 : np := pcntile * (N + 1);
8 : np := pcntile * (N + 1);
OutPutFrm.RichEdit.Clear;
}
case TypeQ of
1 : np := Percentile * N;
2 : np := Percentile * (N + 1);
3 : np := Percentile * N;
4 : np := Percentile * N;
5 : np := Percentile * (N - 1);
6 : np := Percentile * N + 0.5;
7 : np := Percentile * (N + 1);
8 : np := Percentile * (N + 1);
end;
whole := WholeValue(np);
fraction := FractionValue(np);
subscript := Trunc(whole) - 1;
lValue := Values[subscript];
lValue1 := Values[subscript + 1];
case TypeQ of
1 : Result := ((1.0 - fraction) * values[subscript]) + fraction * values[subscript + 1];
2 : Result := ((1.0 - fraction) * lValue) + fraction * lValue1; // values[subscript + 1];
3 : if (fraction = 0.0) then
Result := values[subscript]
else
Result := values[subscript + 1];
4 : if (fraction = 0.0) then
Result := 0.5 * (values[subscript] + values[subscript + 1])
else
Result := values[subscript + 1];
5 : if (fraction = 0.0) then
Result := values[subscript + 1]
else
Result := Values[subscript + 1] + fraction * (Values[subscript + 2] - values[subscript + 1]);
6 : Result := values[subscript];
7 : if (fraction = 0.0) then
Result := values[subscript]
else
Result := fraction * Values[subscript] + (1.0 - fraction) * Values[subscript + 1];
8 : begin
if (fraction = 0.0) then Result := values[subscript];
if (fraction = 0.5) then Result := 0.5 * (values[subscript] + values[subscript + 1]);
if (fraction < 0.5) then Result := values[subscript];
if (fraction > 0.5) then Result := values[subscript + 1];
end;
whole := WholeValue(np);
fraction := FractionValue(np);
subscript := Trunc(whole) - 1;
avalue := values[subscript];
avalue1 := values[subscript + 1];
case TypeQ of
1 : Myresult := ((1.0 - fraction) * values[subscript]) +
fraction * values[subscript + 1];
2 : Myresult := ((1.0 - fraction) * avalue) +
fraction * avalue1; // values[subscript + 1];
3 : if (fraction = 0.0) then Myresult := values[subscript]
else Myresult := values[subscript + 1];
4 : if (fraction = 0.0) then Myresult := 0.5 * (values[subscript] + values[subscript + 1])
else Myresult := values[subscript + 1];
5 : if (fraction = 0.0) then Myresult := values[subscript + 1]
else Myresult := values[subscript + 1] + fraction * (values[subscript + 2] -
values[subscript + 1]);
6 : Myresult := values[subscript];
7 : if (fraction = 0.0) then Myresult := values[subscript]
else Myresult := fraction * values[subscript] +
(1.0 - fraction) * values[subscript + 1];
8 : begin
if (fraction = 0.0) then Myresult := values[subscript];
if (fraction = 0.5) then Myresult := 0.5 * (values[subscript] + values[subscript + 1]);
if (fraction < 0.5) then Myresult := values[subscript];
if (fraction > 0.5) then Myresult := values[subscript + 1];
end;
end;
Result := Myresult;
end;
end;
function KolmogorovProb(z : double) : double;