1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
{ ******************************************************************
One-way analysis of variance
****************************************************************** }
unit uanova1;
interface
uses
utypes;
procedure AnOVa1(Ns : Integer;
N : PIntVector;
M, S : PVector;
var V_f, V_r, F : Float;
var DoF_f, DoF_r : Integer);
{ ------------------------------------------------------------------
Input parameters : Ns = number of samples
N = samples sizes
M = samples means
S = samples SD's (computed with StDev)
Output parameters: V_f, V_r = variances (factorial, residual)
F = ratio Vf / Vr
DoF_f, DoF_r = degrees of freedom
------------------------------------------------------------------ }
implementation
procedure AnOVa1(Ns : Integer;
N : PIntVector;
M, S : PVector;
var V_f, V_r, F : Float;
var DoF_f, DoF_r : Integer);
var
I, Nt : Integer;
Xbar : Float; { Global mean }
SSf, SSr : Float; { Sum of squares }
D : Float; { Difference of means }
begin
if Ns < 2 then
begin
SetErrCode(MatErrDim);
Exit
end;
Nt := 0;
for I := 1 to Ns do
Nt := Nt + N^[I];
if Nt <= Ns then
begin
SetErrCode(MatErrDim);
Exit;
end;
SetErrCode(MatOk);
Xbar := 0.0;
for I := 1 to Ns do
Xbar := Xbar + N^[I] * M^[I];
Xbar := Xbar / Nt;
SSf := 0.0;
SSr := 0.0;
for I := 1 to Ns do
begin
D := M^[I] - Xbar;
SSf := SSf + N^[I] * Sqr(D);
SSr := SSr + (N^[I] - 1) * Sqr(S^[I]);
end;
DoF_f := Ns - 1;
DoF_r := Nt - Ns;
V_f := SSf / DoF_f;
V_r := SSr / DoF_r;
F := V_f / V_r;
end;
end.
|