Files
lazarus-ccr/applications/lazstats/source_orig/onecaseanovaunit.pas
wp_xxyyzz e1c5977e0d LazStats: Adding original source, part 6.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7885 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2020-11-16 11:16:49 +00:00

1914 lines
67 KiB
ObjectPascal

unit OneCaseAnovaUnit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, Buttons, ExtCtrls, MainUnit, Globals, FunctionsLib, OutPutUnit,
DataProcs, GraphLib, ANOVATESTSUnit, Math, contexthelpunit, BLKANOVAUNIT;
type
{ TOneCaseAnovaForm }
TOneCaseAnovaForm = class(TForm)
CancelBtn: TButton;
ComputeBtn: TButton;
DepIn: TBitBtn;
DepOut: TBitBtn;
DepVar: TEdit;
Fact1In: TBitBtn;
Fact1Out: TBitBtn;
Fact2In: TBitBtn;
Fact2Out: TBitBtn;
Fact3In: TBitBtn;
Fact3Out: TBitBtn;
Factor1: TEdit;
Factor2: TEdit;
Factor3: TEdit;
GroupBox1: TGroupBox;
OptionsBox: TGroupBox;
HelpBtn: TButton;
Label1: TLabel;
Label3: TLabel;
Label4: TLabel;
NewmanKeulsChk: TCheckBox;
OverAllAlpha: TEdit;
Plot2DLines: TCheckBox;
Plot3DLines: TCheckBox;
PlotMeans: TCheckBox;
PostAlpha: TEdit;
InteractBtn: TRadioButton;
ResetBtn: TButton;
ReturnBtn: TButton;
ScheffeChk: TCheckBox;
StaticText1: TStaticText;
StaticText2: TStaticText;
StaticText3: TStaticText;
StaticText4: TStaticText;
TukeyBChk: TCheckBox;
TukeyHSDChk: TCheckBox;
TukeyKramerChk: TCheckBox;
VarList: TListBox;
procedure ComputeBtnClick(Sender: TObject);
procedure DepInClick(Sender: TObject);
procedure DepOutClick(Sender: TObject);
procedure Fact1InClick(Sender: TObject);
procedure Fact1OutClick(Sender: TObject);
procedure Fact2InClick(Sender: TObject);
procedure Fact2OutClick(Sender: TObject);
procedure Fact3InClick(Sender: TObject);
procedure Fact3OutClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure HelpBtnClick(Sender: TObject);
procedure ResetBtnClick(Sender: TObject);
private
{ private declarations }
NoSelected, intvalue, N : integer;
ColNoSelected : IntDyneVec;
DepVarCol, F1Col, F2Col, F3Col, Nf1cells, Nf2cells, Nf3cells : integer;
minf1, maxf1, minf2, maxf2, minf3, maxf3, nofactors, totcells : integer;
NoGrpsA, NoGrpsB, NoGrpsC : integer;
SSDep, SSErr, SSF1, SSF2, SSF3, SSF1F2, SSF1F3, SSF2F3, SSF1F2F3 : double;
MSDep, MSErr, MSF1, MSF2, MSF3, MSF1F2, MSF1F3, MSF2F3, MSF1F2F3 : double;
DFTot, DFErr, DFF1, DFF2, DFF3, DFF1F2, DFF1F3, DFF2F3, DFF1F2F3 : double;
Omega, OmegaF1, OmegaF2, OmegaF3, OmegaF1F2, F, MinSize, MaxSize : double;
OmegaF1F3, OmegaF2F3, OmegaF1F2F3 : double;
FF1, FF2, FF1F2, ProbF1, ProbF2, ProbF3, ProbF1F2, ProbF1F3 : double;
FF3, FF2F3, FF1F3, FF1F2F3, ProbF2F3, ProbF1F2F3 : double;
MeanDep, MeanF1, MeanF2, MeanF3, X : double;
SSNonAdd, SSBalance,MSNonAdd, MSBalance, GrandMean, DFBalance : double;
FNonAdd, ProbNonAdd : double;
rowmean, colmean, slicemean, temp : double;
cellcnts : DblDyneVec; // array of cell counts
cellvars : DblDyneVec; // arrray of cell sums of squares then variances
cellsums : DblDyneVec; // array of cell sums then means
counts : DblDyneMat; // matrix for 2-way containing cell sizes
sums : DblDyneMat; // matrix for 2-way containing cell sums
vars : DblDyneMat; // matrix for 2-way containing sums of squares
RowSums : DblDyneVec; // 2 way row sums
ColSums : DblDyneVec; // 2 way col sums
RowCount : DblDyneVec; // 2 way row count
ColCount : DblDyneVec; // 2 way col count
SlcSums : DblDyneVec; // 3 way slice sums
SlcCount : DblDyneVec; // 3 way slice counts
OrdMeansA, OrdMeansB, OrdMeansC : DblDyneVec; // reordered means for f1, f2, f3
OverAll, PostHocAlpha : double; // alphas for tests
wsum, wx2 : DblDyneCube; // : DblDyneCube
ncnt : IntDyneCube; // : IntDyneCube;
OKterms : IntDyneVec;
CompError : boolean;
equal_grp : boolean; // check for equal groups for post-hoc tests
comparisons : boolean;
interacts : boolean; // true if 2 way interactions to be included in 3 way design
outline : string;
cellstring : string;
procedure getlevels(Sender: TObject);
procedure Calc2Way(Sender: TObject);
procedure TwoWayTable(Sender: TObject);
procedure TwoWayPlot(Sender: TObject);
procedure Calc3Way(Sender: TObject);
procedure ThreeWayTable(Sender: TObject);
procedure ThreeWayPlot(Sender: TObject);
procedure TwoWayContrasts(Sender: TObject);
procedure ThreeWayContrasts(Sender: TObject);
public
{ public declarations }
end;
var
OneCaseAnovaForm: TOneCaseAnovaForm;
implementation
{ TOneCaseAnovaForm }
procedure TOneCaseAnovaForm.ResetBtnClick(Sender: TObject);
VAR i : integer;
begin
VarList.Clear;
DepIn.Visible := true;
Fact1In.Visible := true;
Fact2In.Visible := true;
Fact3In.Visible := true;
DepOut.Visible := false;
Fact1Out.Visible := false;
Fact2Out.Visible := false;
Fact3Out.Visible := false;
DepVar.Text := '';
Factor1.Text := '';
Factor2.Text := '';
Factor3.Text := '';
// Fact1Grp.ItemIndex := 0;
// Fact2Grp.ItemIndex := 0;
// Fact3Grp.ItemIndex := 0;
PlotMeans.Checked := false;
ScheffeChk.Checked := false;
TukeyHSDChk.Checked := false;
TukeyBChk.Checked := false;
TukeyKramerChk.Checked := false;
NewmanKeulsChk.Checked := false;
// BonferroniChk.Checked := false;
PostAlpha.Text := '0.05';
OverAllAlpha.Text := '0.05';
for i := 1 to NoVariables do
VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]);
end;
procedure TOneCaseAnovaForm.FormShow(Sender: TObject);
begin
ResetBtnClick(self);
end;
procedure TOneCaseAnovaForm.DepInClick(Sender: TObject);
VAR index : integer;
begin
index := VarList.ItemIndex;
DepVar.Text := VarList.Items.Strings[index];
DepIn.Visible := false;
DepOut.Visible := true;
VarList.Items.Delete(index);
end;
procedure TOneCaseAnovaForm.DepOutClick(Sender: TObject);
begin
VarList.Items.Add(DepVar.Text);
DepVar.Text := '';
DepOut.Visible := false;
DepIn.Visible := true;
end;
procedure TOneCaseAnovaForm.Fact1InClick(Sender: TObject);
VAR index : integer;
begin
index := VarList.ItemIndex;
Factor1.Text := VarList.Items.Strings[index];
Fact1In.Visible := false;
Fact1Out.Visible := true;
VarList.Items.Delete(index);
end;
procedure TOneCaseAnovaForm.Fact1OutClick(Sender: TObject);
begin
VarList.Items.Add(DepVar.Text);
Factor1.Text := '';
Fact1Out.Visible := false;
Fact1In.Visible := true;
end;
procedure TOneCaseAnovaForm.Fact2InClick(Sender: TObject);
VAR index : integer;
begin
index := VarList.ItemIndex;
Factor2.Text := VarList.Items.Strings[index];
Fact2In.Visible := false;
Fact2Out.Visible := true;
VarList.Items.Delete(index);
end;
procedure TOneCaseAnovaForm.Fact2OutClick(Sender: TObject);
begin
VarList.Items.Add(DepVar.Text);
Factor2.Text := '';
Fact2Out.Visible := false;
Fact2In.Visible := true;
end;
procedure TOneCaseAnovaForm.Fact3InClick(Sender: TObject);
VAR index : integer;
begin
index := VarList.ItemIndex;
Factor3.Text := VarList.Items.Strings[index];
Fact3In.Visible := false;
Fact3Out.Visible := true;
VarList.Items.Delete(index);
end;
procedure TOneCaseAnovaForm.Fact3OutClick(Sender: TObject);
begin
VarList.Items.Add(DepVar.Text);
Factor3.Text := '';
Fact3Out.Visible := false;
Fact3In.Visible := true;
end;
procedure TOneCaseAnovaForm.ComputeBtnClick(Sender: TObject);
Var
result, i : integer;
// nofactors : integer;
Label cleanit;
label nexttwo;
label nextthree;
begin
nofactors := 0;
if ((Factor1.Text <> '') and (Factor2.Text <> '')) then nofactors := 2;
if ((Factor1.Text <> '') and (Factor2.Text <> '') and (Factor3.Text <> ''))
then nofactors := 3;
if (nofactors < 2) then
begin
ShowMessage('ERROR! Selection of 2 or 3 factors required!');
exit;
end;
OutPutFrm.RichEdit.Clear;
// initialize values
if (ScheffeChk.Checked) then comparisons := true;
if (TukeyHSDChk.Checked) then comparisons := true;
if (TukeyBChk.Checked) then comparisons := true;
if (TukeyKramerChk.Checked) then comparisons := true;
if (NewmanKeulsChk.Checked) then comparisons := true;
// if (BonferroniChk.Checked) then comparisons := true;
// if (OrthogonalChk.Checked) then comparisons := true;
SetLength(ColNoSelected,NoVariables);
DepVarCol := 0;
F1Col := 0;
F2Col := 0;
F3Col := 0;
SSDep := 0.0;
SSF1 := 0.0;
SSF2 := 0.0;
SSF3 := 0.0;
SSF1F2 := 0.0;
SSF1F3 := 0.0;
SSF2F3 := 0.0;
SSF1F2F3 := 0.0;
MeanDep := 0.0;
MeanF1 := 0.0;
MeanF2 := 0.0;
MeanF3 := 0.0;
Nf1cells := 0;
Nf2cells := 0;
Nf3cells := 0;
N := 0;
NoSelected := 0;
minf1 := 0;
maxf1 := 0;
minf2 := 0;
maxf2 := 0;
minf3 := 0;
maxf3 := 0;
// setup posthoc comparisons
BlksAnovaFrm.PostAlpha.Text := PostAlpha.Text;
// Get column numbers of dependent variable and factors
for i := 1 to NoVariables do
begin
cellstring := OS3MainFrm.DataGrid.Cells[i,0];
if (cellstring = DepVar.Text) then
begin
DepVarCol := i;
NoSelected := NoSelected + 1;
ColNoSelected[NoSelected-1] := DepVarCol;
end;
if (cellstring = Factor1.Text) then
begin
F1Col := i;
NoSelected := NoSelected + 1;
ColNoSelected[NoSelected-1] := F1Col;
end;
if (cellstring = Factor2.Text) then
begin
F2Col := i;
NoSelected := NoSelected + 1;
ColNoSelected[NoSelected-1] := F2Col;
end;
if (cellstring = Factor3.Text) then
begin
F3Col := i;
NoSelected := NoSelected + 1;
ColNoSelected[NoSelected-1] := F3Col;
end;
end;
OverAll := StrToFloat(OverAllAlpha.Text);
PostHocAlpha := StrToFloat(PostAlpha.Text);
// get min and max of each factor code
getlevels(self);
// allocate space
SetLength(cellcnts,totcells); // array of cell counts
SetLength(cellvars,totcells); // arrray of cell sums of squares variances
SetLength(cellsums,totcells); // array of cell sums means
// initialize array values
for i := 1 to totcells do
begin
cellsums[i-1] := 0.0;
cellvars[i-1] := 0.0;
cellcnts[i-1] := 0;
end;
// analysis
case nofactors of
2 : // two-way anova
begin
SetLength(counts,Nf1cells,Nf2cells); // matrix for 2-way containing cell sizes
SetLength(sums,Nf1cells,Nf2cells); // matrix for 2-way containing cell sums
SetLength(vars,Nf1cells,Nf2cells); // matrix for 2-way containing sums of squares
SetLength(RowSums,Nf1cells); // 2 way row sums
SetLength(ColSums,Nf2cells); // 2 way col sums
SetLength(RowCount,Nf1cells); // 2 way row count
SetLength(ColCount,Nf2cells); // 2 way col count
SetLength(OrdMeansA,Nf1cells); // ordered means for factor 1
SetLength(OrdMeansB,Nf2cells); // ordered means for factor 2
Calc2Way(self);
if (CompError) then goto nexttwo;
TwoWayTable(self);
TwoWayContrasts(self);
OutPutFrm.ShowModal;
if ((PlotMeans.checked) or (Plot2DLines.Checked) or (Plot3DLines.Checked)) then TwoWayPlot(self);
nexttwo: OrdMeansB := nil;
OrdMeansA := nil;
ColCount := nil;
RowCount := nil;
ColSums := nil;
RowSums := nil;
vars := nil;
sums := nil;
counts := nil;
end;
3 : // three way anova
begin
SetLength(RowSums,Nf1cells); // 2 way row sums
SetLength(ColSums,Nf2cells); // 2 way col sums
SetLength(RowCount,Nf1cells); // 2 way row count
SetLength(ColCount,Nf2cells); // 2 way col count
SetLength(SlcSums,Nf3cells); // 3 way slice sums
SetLength(SlcCount,Nf3cells); // 3 way slice counts
SetLength(OrdMeansA,Nf1cells); // ordered means for factor 1
SetLength(OrdMeansB,Nf2cells); // ordered means for factor 2
SetLength(OrdMeansC,Nf3cells); // ordered means for factor 3
SetLength(wsum,Nf1cells,Nf2cells,Nf3cells);
SetLength(wx2,Nf1cells,Nf2cells,Nf3cells);
SetLength(ncnt,Nf1cells,Nf2cells,Nf3cells);
Calc3Way(self);
if (CompError) then goto nextthree;
ThreeWayTable(self);
ThreeWayContrasts(self);
OutPutFrm.ShowModal;
if ((PlotMeans.checked) or (Plot2DLines.Checked) or (Plot3DLines.Checked)) then ThreeWayPlot(self);
nextthree:
ncnt := nil;
wx2 := nil;
wsum := nil;
OrdMeansC := nil;
OrdMeansB := nil;
OrdMeansA := nil;
SlcCount := nil;
SlcSums := nil;
ColCount := nil;
ColSums := nil;
RowCount := nil;
RowSums := nil;
end;
end; // end switch
cleanit:
cellcnts := nil;
cellvars := nil;
cellsums := nil;
ColNoSelected := nil;
end;
procedure TOneCaseAnovaForm.HelpBtnClick(Sender: TObject);
begin
ContextHelpForm.HelpMessage((Sender as TButton).tag);
end;
procedure TOneCaseAnovaForm.getlevels(Sender: TObject);
VAR
i, result, avalue : integer;
dblvalue : double;
strvalue : string;
begin
minf1 := ceil(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[F1Col,1])));
maxf1 := minf1;
for i := 2 to NoCases do
begin
if not GoodRecord(i,NoSelected,ColNoSelected) then continue;
intvalue := floor(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[F1Col,i])));
if (intvalue > maxf1) then maxf1 := intvalue;
if (intvalue < minf1) then minf1 := intvalue;
end;
Nf1cells := maxf1 - minf1 + 1;
if (nofactors > 1) then
begin
minf2 := floor(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[F2Col,1])));
maxf2 := minf2;
for i := 2 to NoCases do
begin
if not GoodRecord(i,NoSelected,ColNoSelected) then continue;
intvalue := floor(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[F2Col,i])));
if (intvalue > maxf2) then maxf2 := intvalue;
if (intvalue < minf2) then minf2 := intvalue;
end;
Nf2cells := maxf2 - minf2 + 1;
end;
if (nofactors = 3) then
begin
minf3 := floor(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[F3Col,1])));
maxf3 := minf3;
for i := 2 to NoCases do
begin
if not GoodRecord(i,NoSelected,ColNoSelected) then continue;
intvalue := floor(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[F3Col,i])));
if (intvalue > maxf3) then maxf3 := intvalue;
if (intvalue < minf3) then minf3 := intvalue;
end;
Nf3cells := maxf3 - minf3 + 1;
end;
totcells := Nf1cells + Nf2cells + Nf3cells;
end;
procedure TOneCaseAnovaForm.Calc2Way(Sender: TObject);
VAR
i, j, grpA, grpB : integer;
Constant, RowsTotCnt, ColsTotCnt, SSCells : double;
begin
CompError := false;
// initialize matrix values
NoGrpsA := maxf1 - minf1 + 1;
NoGrpsB := maxf2 - minf2 + 1;
for i := 1 to NoGrpsA do
begin
RowSums[i-1] := 0.0;
RowCount[i-1] := 0.0;
for j := 1 to NoGrpsB do
begin
counts[i-1,j-1] := 0.0;
sums[i-1,j-1] := 0.0;
vars[i-1,j-1] := 0.0;
end;
end;
for i := 1 to NoGrpsB do
begin
ColCount[i-1] := 0.0;
ColSums[i-1] := 0.0;
end;
N := 0;
MeanDep := 0.0;
SSDep := 0.0;
SSCells := 0.0;
RowsTotCnt := 0.0;
ColsTotCnt := 0.0;
SSNonAdd := 0.0;
SSBalance := 0.0;
MSNonAdd := 0.0;
MSBalance := 0.0;
// get working totals
for i := 1 to NoCases do
begin
if not GoodRecord(i,NoSelected,ColNoSelected) then continue;
grpA := floor(StrToFloat(OS3MainFrm.DataGrid.Cells[F1Col,i]));
grpB := floor(StrToFloat(OS3MainFrm.DataGrid.Cells[F2Col,i]));
X := StrToFloat(OS3MainFrm.DataGrid.Cells[DepVarCol,i]);
grpA := grpA - minf1 + 1;
grpB := grpB - minf2 + 1;
counts[grpA-1,grpB-1] := counts[grpA-1,grpB-1] + 1;
sums[grpA-1,grpB-1] := sums[grpA-1,grpB-1] + X;
vars[grpA-1,grpB-1] := vars[grpA-1,grpB-1] + (X * X);
RowSums[grpA-1] := RowSums[grpA-1] + X;
ColSums[grpB-1] := ColSums[grpB-1] + X;
RowCount[grpA-1] := RowCount[grpA-1] + 1.0;
ColCount[grpB-1] := ColCount[grpB-1] + 1.0;
MeanDep := MeanDep + X;
SSDep := SSDep + (X * X);
N := N + 1;
end;
// Calculate results
for i := 0 to NoGrpsA - 1 do
begin
SSF1 := SSF1 + ((RowSums[i] * RowSums[i]) / RowCount[i]);
RowsTotCnt := RowsTotCnt + RowCount[i];
end;
for j := 0 to NoGrpsB - 1 do
begin
SSF2 := SSF2 + ((ColSums[j] * ColSums[j]) / ColCount[j]);
ColsTotCnt := ColsTotCnt + ColCount[j];
end;
GrandMean := MeanDep / N;
for i := 0 to NoGrpsA - 1 do
begin
rowmean := RowSums[i] / RowCount[i];
for j := 0 to NoGrpsB - 1 do
begin
colmean := ColSums[j] / ColCount[j];
SSNonAdd := SSNonAdd +
( (colmean - GrandMean) * (rowmean - GrandMean) * sums[i,j] );
end;
end;
if (N > 0) then Constant := (MeanDep * MeanDep) / N
else Constant := 0.0;
SSF1 := SSF1 - Constant;
SSF2 := SSF2 - Constant;
SSDep := SSDep - Constant;
SSErr := SSDep - (SSF1 + SSF2);
SSNonAdd := (SSNonAdd * SSNonAdd) / ((SSF1 * SSF2) / (NoGrpsA * NoGrpsB) );
MSNonAdd := SSNonAdd;
SSBalance := SSErr - SSNonAdd;
if ((SSF1 < 0) or (SSF2 < 0)) then
begin
ShowMessage('ERROR! A negative SS found. Unbalanced design? Ending analysis.');
CompError := true;
exit;
end;
DFTot := N - 1;
DFF1 := NoGrpsA - 1;
DFF2 := NoGrpsB - 1;
DFErr := DFF1 * DFF2;
DFBalance := DFErr - 1;
MSF1 := SSF1 / DFF1;
MSF2 := SSF2 / DFF2;
MSErr := SSErr / DFErr;
MSDep := SSDep / DFTot;
MSBalance := SSBalance / DFBalance;
OmegaF1 := (SSF1 - DFF1 * MSErr) / (SSDep + MSErr);
OmegaF2 := (SSF2 - DFF2 * MSErr) / (SSDep + MSErr);
Omega := OmegaF1 + OmegaF2;
MeanDep := MeanDep / N;
// f tests for fixed effects
FF1 := abs(MSF1 / MSErr);
FF2 := abs(MSF2 / MSErr);
if (MSBalance > 0.0) then FNonAdd := MSNonAdd / MSBalance
else FNonAdd := 0.0;
ProbF1 := probf(FF1,DFF1,DFErr);
ProbF2 := probf(FF2,DFF2,DFErr);
ProbNonAdd := probf(FNonAdd,1.0,DFBalance);
if (ProbF1 > 1.0) then ProbF1 := 1.0;
if (ProbF2 > 1.0) then ProbF2 := 1.0;
// Obtain omega squared (proportion of dependent variable explained)
if (OmegaF1 < 0.0) then OmegaF1 := 0.0;
if (OmegaF2 < 0.0) then OmegaF2 := 0.0;
if (Omega < 0.0) then Omega := 0.0;
end;
procedure TOneCaseAnovaForm.TwoWayTable(Sender: TObject);
VAR
i, j, groupsize : integer;
MinVar, MaxVar, sumvars, sumDFrecip, XBar, V, S, RowSS, ColSS : double;
sumfreqlogvar, c, bartlett, cochran, hartley, chiprob : double;
astring : string;
begin
if (CompError) then exit;
OutPutFrm.RichEdit.Clear;
OutPutFrm.RichEdit.Lines.Add('Two Way Analysis of Variance');
OutPutFrm.RichEdit.Lines.Add('');
astring := format('Variable analyzed: %s',[DepVar.Text]);
OutPutFrm.RichEdit.Lines.Add(astring);
OutPutFrm.RichEdit.Lines.Add('');
astring := format('Factor A (rows) variable: %s',[Factor1.Text]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format('Factor B (columns) variable: %s',[Factor2.Text]);
OutPutFrm.RichEdit.Lines.Add(astring);
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('SOURCE D.F. SS MS F PROB.> F Omega Squared');
OutPutFrm.RichEdit.Lines.Add('');
astring := format('Among Rows %4.0f %8.3f %8.3f %8.3f %6.3f %6.3f',
[DFF1,SSF1,MSF1,FF1,ProbF1,OmegaF1]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format('Among Columns %4.0f %8.3f %8.3f %8.3f %6.3f %6.3f',
[DFF2,SSF2,MSF2,FF2,ProbF2,OmegaF2]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format('Residual %4.0f %8.3f %8.3f',
[DFErr,SSErr,MSErr]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format(' NonAdditivity %4.0f %8.3f %8.3f %8.3f %6.3f',
[1.0,SSNonAdd,MSNonAdd,FNonAdd,ProbNonAdd]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format(' Balance %4.0f %8.3f %8.3f',[DFBalance,SSBalance,MSBalance]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format('Total %4.0f %8.3f %8.3f',
[DFTot,SSDep,MSDep]);
OutPutFrm.RichEdit.Lines.Add(astring);
OutPutFrm.RichEdit.Lines.Add('');
astring := format('Omega squared for combined effects = %8.3f',[Omega]);
OutPutFrm.RichEdit.Lines.Add(astring);
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('Descriptive Statistics');
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('GROUP Row Col. N MEAN VARIANCE STD.DEV.');
groupsize := ceil(counts[0,0]);
equal_grp := true;
MaxVar := 0.0;
MinVar := 1e20;
sumvars := 0.0;
sumfreqlogvar := 0.0;
sumDFrecip := 0.0;
// Display cell means, variances, standard deviations
V := 0.0;
XBar := 0.0;
S := 0.0;
for i := 0 to NoGrpsA - 1 do
begin
for j := 0 to NoGrpsB - 1 do
begin
if (counts[i,j] > 1) then
begin
XBar := sums[i][j] / counts[i,j];
V := vars[i][j] - ( (sums[i,j] * sums[i,j]) / counts[i,j]);
V := V / (counts[i,j] - 1.0);
S := sqrt(V);
sumvars := sumvars + V;
if (V > MaxVar) then MaxVar := V;
if (V < MinVar) then MinVar := V;
sumDFrecip := sumDFrecip + (1.0 / (counts[i,j] - 1.0));
sumfreqlogvar := sumfreqlogvar + ((counts[i,j] - 1.0) * ln(V));
if (counts[i,j] <> groupsize) then equal_grp := false;
end
else XBar := sums[i][j];
astring := format('Cell %3d %3d %3.0f %8.3f %8.3f %8.3f',
[minf1+i,minf2+j,counts[i,j],XBar,V,S]);
OutPutFrm.RichEdit.Lines.Add(astring);
end;
end;
//Display Row means, variances, standard deviations
for i := 0 to NoGrpsA - 1 do
begin
XBar := RowSums[i] / RowCount[i];
OrdMeansA[i] := XBar;
RowSS := 0.0;
for j := 0 to NoGrpsB - 1 do RowSS := RowSS + vars[i,j];
V := RowSS - (RowSums[i] * RowSums[i] / RowCount[i]);
V := V / (RowCount[i] - 1.0);
S := sqrt(V);
astring := format('Row %3d %3.0f %8.3f %8.3f %8.3f',
[minf1+i,RowCount[i],XBar,V,S]);
OutPutFrm.RichEdit.Lines.Add(astring);
end;
//Display means, variances and standard deviations for columns
for j := 0 to NoGrpsB - 1 do
begin
XBar := ColSums[j] / ColCount[j];
OrdMeansB[j] := XBar;
ColSS := 0.0;
for i := 0 to NoGrpsA - 1 do ColSS := ColSS + vars[i,j];
if (ColCount[j] > 0) then V := ColSS - (ColSums[j] * ColSums[j] / ColCount[j]);
if (ColCount[j] > 1) then V := V / (ColCount[j] - 1.0);
if (V > 0.0) then S := sqrt(V);
astring := format('Col %3d %3.0f %8.3f %8.3f %8.3f',
[minf2+j,ColCount[j],XBar,V,S]);
OutPutFrm.RichEdit.Lines.Add(astring);
end;
astring := format('TOTAL %3d %8.3f %8.3f %8.3f',
[N,MeanDep,MSDep,sqrt(MSDep)]);
OutPutFrm.RichEdit.Lines.Add(astring);
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('');
end;
procedure TOneCaseAnovaForm.TwoWayPlot(Sender: TObject);
VAR
i, j : integer;
maxmean, XBar : double;
XValue : DblDyneVec;
title : string;
plottype : integer;
setstring : string;
begin
if (CompError) then exit;
SetLength(XValue,Nf1cells+Nf2cells);
if (PlotMeans.Checked) then PlotType := 2;
if (Plot2DLines.Checked) then PlotType := 1;
if (Plot3DLines.Checked) then PlotType := 10;
// Factor A first
setstring := 'FACTOR A';
GraphFrm.SetLabels[1] := setstring;
maxmean := 0.0;
SetLength(GraphFrm.Xpoints,1,Nf1cells);
SetLength(GraphFrm.Ypoints,1,Nf1cells);
for i := 1 to Nf1cells do
begin
RowSums[i-1] := RowSums[i-1] / RowCount[i-1];
GraphFrm.Ypoints[0,i-1] := RowSums[i-1];
if (RowSums[i-1] > maxmean) then maxmean := RowSums[i-1];
XValue[i-1] := minf1 + i - 1;
GraphFrm.Xpoints[0,i-1] := XValue[i-1];
end;
GraphFrm.nosets := 1;
GraphFrm.nbars := Nf1cells;
GraphFrm.Heading := Factor1.Text;
title := Factor1.Text + ' Codes';
GraphFrm.XTitle := title;
GraphFrm.YTitle := 'Mean';
GraphFrm.barwideprop := 0.5;
GraphFrm.AutoScale := false;
GraphFrm.miny := 0.0;
GraphFrm.maxy := maxmean;
GraphFrm.GraphType := plottype;
GraphFrm.BackColor := clYellow;
GraphFrm.WallColor := clBlack;
GraphFrm.FloorColor := clLtGray;
GraphFrm.ShowBackWall := true;
GraphFrm.ShowModal();
GraphFrm.Xpoints := nil;
GraphFrm.Ypoints := nil;
// Factor B next
setstring := 'FACTOR B';
GraphFrm.SetLabels[1] := setstring;
maxmean := 0.0;
SetLength(GraphFrm.Xpoints,1,Nf2cells);
SetLength(GraphFrm.Ypoints,1,Nf2cells);
for i := 1 to Nf2cells do
begin
ColSums[i-1] := ColSums[i-1] / ColCount[i-1];
GraphFrm.Ypoints[0,i-1] := ColSums[i-1];
if (ColSums[i-1] > maxmean) then maxmean := ColSums[i-1];
XValue[i-1] := minf1 + i - 1;
GraphFrm.Xpoints[0,i-1] := XValue[i-1];
end;
GraphFrm.nosets := 1;
GraphFrm.nbars := Nf2cells;
GraphFrm.Heading := Factor2.Text;
title := FActor2.Text + ' Codes';
GraphFrm.XTitle := title;
GraphFrm.YTitle := 'Mean';
GraphFrm.barwideprop := 0.5;
GraphFrm.AutoScale := false;
GraphFrm.miny := 0.0;
GraphFrm.maxy := maxmean;
GraphFrm.GraphType := plottype;
GraphFrm.BackColor := clYellow;
GraphFrm.WallColor := clBlack;
GraphFrm.FloorColor := clLtGray;
GraphFrm.ShowBackWall := true;
GraphFrm.ShowModal();
GraphFrm.Xpoints := nil;
GraphFrm.Ypoints := nil;
// Factor A x B Interaction next
maxmean := 0.0;
SetLength(GraphFrm.Ypoints,Nf1cells,Nf2cells);
SetLength(GraphFrm.Xpoints,1,Nf2cells);
for i := 1 to Nf1cells do
begin
setstring := Factor1.Text + ' ' + IntToStr(i);
GraphFrm.SetLabels[i] := setstring;
for j := 1 to Nf2cells do
begin
XBar := sums[i-1,j-1] / counts[i-1,j-1];
if (XBar > maxmean) then maxmean := XBar;
GraphFrm.Ypoints[i-1,j-1] := XBar;
end;
end;
for j := 1 to Nf2cells do
begin
XValue[j-1] := minf2 + j - 1;
GraphFrm.Xpoints[0,j-1] := XValue[j-1];
end;
GraphFrm.nosets := Nf1cells;
GraphFrm.nbars := Nf2cells;
GraphFrm.Heading := 'Factor A x Factor B';
title := Factor2.Text + ' Codes';
GraphFrm.XTitle := title;
GraphFrm.YTitle := 'Mean';
GraphFrm.barwideprop := 0.5;
GraphFrm.AutoScale := false;
GraphFrm.miny := 0.0;
GraphFrm.maxy := maxmean;
GraphFrm.GraphType := plottype;
GraphFrm.BackColor := clYellow;
GraphFrm.WallColor := clBlack;
GraphFrm.FloorColor := clLtGray;
GraphFrm.ShowBackWall := true;
GraphFrm.ShowModal();
XValue := nil;
GraphFrm.Xpoints := nil;
GraphFrm.Ypoints := nil;
end;
procedure TOneCaseAnovaForm.Calc3Way(Sender: TObject);
VAR
i, j, k, grpA, grpB, grpC : integer;
Constant, RowsTotCnt, ColsTotCnt, SlcsTotCnt, SSCells, p, n2 : double;
label loop;
begin
if (InteractBtn.Checked) then interacts := true
else interacts := false;
CompError := false;
// initialize matrix values
NoGrpsA := maxf1 - minf1 + 1;
NoGrpsB := maxf2 - minf2 + 1;
NoGrpsC := maxf3 - minf3 + 1;
for i := 0 to NoGrpsA - 1 do
begin
RowSums[i] := 0.0;
RowCount[i] := 0.0;
for j := 0 to NoGrpsB - 1 do
begin
for k := 0 to NoGrpsC - 1 do
begin
wsum[i,j,k] := 0.0;
ncnt[i,j,k] := 0;
wx2[i,j,k] := 0.0;
end;
end;
end;
for i := 0 to NoGrpsB - 1 do
begin
ColCount[i] := 0.0;
ColSums[i] := 0.0;
end;
for i := 0 to NoGrpsC - 1 do
begin
SlcCount[i] := 0.0;
SlcSums[i] := 0.0;
end;
N := 0;
MeanDep := 0.0;
SSDep := 0.0;
RowsTotCnt := 0.0;
ColsTotCnt := 0.0;
SlcsTotCnt := 0.0;
SSF1 := 0.0;
SSF2 := 0.0;
SSF3 := 0.0;
SSF1F2 := 0.0;
SSF1F3 := 0.0;
SSF2F3 := 0.0;
SSF1F2F3 := 0.0;
SSCells := 0.0;
SSNonAdd := 0.0;
// get working totals
for i := 1 to NoCases do
begin
if not GoodRecord(i,NoSelected,ColNoSelected) then continue;
grpA := floor(StrToFloat(OS3MainFrm.DataGrid.Cells[F1Col,i]));
grpB := floor(StrToFloat(OS3MainFrm.DataGrid.Cells[F2Col,i]));
grpC := floor(StrToFloat(OS3MainFrm.DataGrid.Cells[F3Col,i]));
X := StrToFloat(OS3MainFrm.DataGrid.Cells[DepVarCol,i]);
grpA := grpA - minf1 + 1;
grpB := grpB - minf2 + 1;
grpC := grpC - minf3 + 1;
ncnt[grpA-1,grpB-1,grpC-1] := ncnt[grpA-1,grpB-1,grpC-1] + 1;
wsum[grpA-1,grpB-1,grpC-1] := wsum[grpA-1,grpB-1,grpC-1] + X;
wx2[grpA-1,grpB-1,grpC-1] := wx2[grpA-1,grpB-1,grpC-1] + (X * X);
RowSums[grpA-1] := RowSums[grpA-1] + X;
ColSums[grpB-1] := ColSums[grpB-1] + X;
SlcSums[grpC-1] := SlcSums[grpC-1] + X;
RowCount[grpA-1] := RowCount[grpA-1] + 1.0;
ColCount[grpB-1] := ColCount[grpB-1] + 1.0;
SlcCount[grpC-1] := SlcCount[grpC-1] + 1.0;
MeanDep := MeanDep + X;
SSDep := SSDep + (X * X);
N := N + 1;
end;
// Calculate results
Constant := (MeanDep * MeanDep) / N;
GrandMean := MeanDep / N;
// get ss for rows
for i := 0 to NoGrpsA - 1 do
begin
SSF1 := SSF1 + ((RowSums[i] * RowSums[i]) / RowCount[i]);
RowsTotCnt := RowsTotCnt + RowCount[i];
end;
SSF1 := SSF1 - Constant;
// get ss for columns
for j := 0 to NoGrpsB - 1 do
begin
SSF2 := SSF2 + ((ColSums[j] * ColSums[j]) / ColCount[j]);
ColsTotCnt := ColsTotCnt + ColCount[j];
end;
SSF2 := SSF2 - Constant;
// get ss for slices
for k := 0 to NoGrpsC - 1 do
begin
SSF3 := SSF3 + ((SlcSums[k] * SlcSums[k]) / SlcCount[k]);
SlcsTotCnt := SlcsTotCnt + SlcCount[k];
end;
SSF3 := SSF3 - Constant;
// get ss for row x col interaction
p := 0.0;
n2 := 0.0;
for i := 0 to NoGrpsA - 1 do
begin
for j := 0 to NoGrpsB - 1 do
begin
for k := 0 to NoGrpsC - 1 do
begin
p := p + wsum[i,j,k];
n2 := n2 + ncnt[i,j,k];
end;
SSF1F2 := SSF1F2 + ((p * p) / n2);
p := 0.0;
n2 := 0.0;
end;
end;
SSF1F2 := SSF1F2 - SSF1 - SSF2 - Constant;
// get ss for row x slice interaction
for i := 0 to NoGrpsA - 1 do
begin
for k := 0 to NoGrpsC - 1 do
begin
for j := 0 to NoGrpsB - 1 do
begin
p := p + wsum[i,j,k];
n2 := n2 + ncnt[i,j,k];
end;
SSF1F3 := SSF1F3 + ((p * p) / n2);
p := 0.0;
n2 := 0.0;
end;
end;
SSF1F3 := SSF1F3 - SSF1 - SSF3 - Constant;
// get ss for columns x slices interaction
for j := 0 to NoGrpsB - 1 do
begin
for k := 0 to NoGrpsC - 1 do
begin
for i := 0 to NoGrpsA - 1 do
begin
p := p + wsum[i,j,k];
n2 := n2 + ncnt[i,j,k];
end;
SSF2F3 := SSF2F3 + ((p * p) / n2);
p := 0.0;
n2 := 0.0;
end;
end;
SSF2F3 := SSF2F3 - SSF2 - SSF3 - Constant;
(*
// get ss for cells
for (i := 0; i < NoGrpsA; i++)
for (j := 0; j < NoGrpsB; j++)
for (k := 0; k < NoGrpsC; k++)
SSCells := SSCells + ((wsum[i][j][k] * wsum[i][j][k]) / ncnt[i][j][k]);
SSF1F2F3 := SSCells - SSF1 - SSF2 - SSF3 - SSF1F2 - SSF1F3 - SSF2F3 - Constant;
*)
for i := 0 to NoGrpsA - 1 do
begin
rowmean := RowSums[i] / RowCount[i];
for j := 0 to NoGrpsB - 1 do
begin
colmean := ColSums[j] / ColCount[j];
for k := 0 to NoGrpsC - 1 do
begin
slicemean := SlcSums[k] / SlcCount[k];
SSNonAdd := SSNonAdd +
( (colmean - GrandMean) * (rowmean - GrandMean) *
(slicemean - GrandMean) * wsum[i,j,k] );
end;
end;
end;
loop:
SSDep := SSDep - Constant;
if (interacts = false) then SSErr := SSDep - (SSF1 + SSF2 + SSF3)
else SSErr := SSDep - (SSF1 + SSF2 + SSF3 + SSF1F2 + SSF1F3 + SSF2F3);
SSNonAdd := (SSNonAdd * SSNonAdd) / (SSF1 * SSF2 * SSF3);
SSNonAdd := SSNonAdd * (NoGrpsA * NoGrpsB * NoGrpsC) * (NoGrpsA * NoGrpsB * NoGrpsC );
MSNonAdd := SSNonAdd;
SSBalance := SSErr - SSNonAdd;
if ((SSF1 < 0.0) or (SSF2 < 0.0) or (SSF3 < 0.0) or (SSF1F2 < 0.0) or
(SSF1F3 < 0.0) or (SSF2F3 < 0.0)) then
begin
ShowMessage('ERROR! A negative SS found. Unbalanced Design? Ending analysis.');
CompError := true;
exit;
end;
DFTot := N - 1;
DFF1 := NoGrpsA - 1;
DFF2 := NoGrpsB - 1;
DFF3 := NoGrpsC - 1;
DFF1F2 := DFF1 * DFF2;
DFF1F3 := DFF1 * DFF3;
DFF2F3 := DFF2 * DFF3;
if (interacts = false) then DFErr := DFTot - DFF1 - DFF2 - DFF3
else DFErr := DFTot - DFF1 - DFF2 - DFF3 - DFF1F2 - DFF1F3 - DFF2F3;
DFBalance := DFErr - 1;
MSF1 := SSF1 / DFF1;
MSF2 := SSF2 / DFF2;
MSF3 := SSF3 / DFF3;
MSF1F2 := SSF1F2 / DFF1F2;
MSF1F3 := SSF1F3 / DFF1F3;
MSF2F3 := SSF2F3 / DFF2F3;
MSErr := SSErr / DFErr;
MSDep := SSDep / DFTot;
MSBalance := SSBalance / DFBalance;
OmegaF1 := (SSF1 - DFF1 * MSErr) / (SSDep + MSErr);
OmegaF2 := (SSF2 - DFF2 * MSErr) / (SSDep + MSErr);
OmegaF3 := (SSF3 - DFF3 * MSErr) / (SSDep + MSErr);
OmegaF1F2 := (SSF1F2 - DFF1F2 * MSErr) / (SSDep + MSErr);
OmegaF1F3 := (SSF1F3 - DFF1F3 * MSErr) / (SSDep + MSErr);
OmegaF2F3 := (SSF2F3 - DFF2F3 * MSErr) / (SSDep + MSErr);
if (interacts = false) then Omega := OmegaF1 + OmegaF2 + OmegaF3
else Omega := OmegaF1 + OmegaF2 + OmegaF3 + OmegaF1F2 + OmegaF1F3 + OmegaF2F3;
MeanDep := MeanDep / N;
FF1 := abs(MSF1 / MSErr);
FF2 := abs(MSF2 / MSErr);
FF3 := abs(MSF3 / MSErr);
FF1F2 := abs(MSF1F2 / MSErr);
FF1F3 := abs(MSF1F3 / MSErr);
FF2F3 := abs(MSF2F3 / MSErr);
if (MSBalance > 0.0) then FNonAdd := MSNonAdd / MSBalance
else FNonAdd := 0.0;
ProbF1 := probf(FF1,DFF1,DFErr);
ProbF2 := probf(FF2,DFF2,DFErr);
ProbF3 := probf(FF3,DFF3,DFErr);
ProbF1F2 := probf(FF1F2,DFF1F2,DFErr);
ProbF1F3 := probf(FF1F3,DFF1F3,DFErr);
ProbF2F3 := probf(FF2F3,DFF2F3,DFErr);
ProbNonAdd := probf(FNonAdd,1.0,DFBalance);
if (ProbF1 > 1.0) then ProbF1 := 1.0;
if (ProbF2 > 1.0) then ProbF2 := 1.0;
if (ProbF3 > 1.0) then ProbF3 := 1.0;
if (ProbF1F2 > 1.0) then ProbF1F2 := 1.0;
if (ProbF1F3 > 1.0) then ProbF1F3 := 1.0;
if (ProbF2F3 > 1.0) then ProbF2F3 := 1.0;
// Obtain omega squared (proportion of dependent variable explained)
if (OmegaF1 < 0.0) then OmegaF1 := 0.0;
if (OmegaF2 < 0.0) then OmegaF2 := 0.0;
if (OmegaF3 < 0.0) then OmegaF3 := 0.0;
if (OmegaF1F2 < 0.0) then OmegaF1F2 := 0.0;
if (OmegaF1F3 < 0.0) then OmegaF1F3 := 0.0;
if (OmegaF2F3 < 0.0) then OmegaF2F3 := 0.0;
if (Omega < 0.0) then Omega := 0.0;
end;
procedure TOneCaseAnovaForm.ThreeWayTable(Sender: TObject);
VAR
groupsize : integer;
MinVar, MaxVar, sumvars, sumDFrecip : double;
i, j, k : integer;
XBar, V, S, RowSS, ColSS, SlcSS : double;
sumfreqlogvar, c, bartlett, cochran, hartley, chiprob : double;
problem : boolean;
astring : string;
begin
if (CompError) then exit;
OutPutFrm.RichEdit.Clear;
problem := false;
OutPutFrm.RichEdit.Lines.Add('Three Way Analysis of Variance');
OutPutFrm.RichEdit.Lines.Add('');
astring := format('Variable analyzed: %s',[DepVar.Text]);
OutPutFrm.RichEdit.Lines.Add(astring);
OutPutFrm.RichEdit.Lines.Add('');
astring := format('Factor A (rows) variable: %s',[Factor1.Text]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format('Factor B (columns) variable: %s',[Factor2.Text]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format('Factor C (slices) variable: %s',[Factor3.Text]);
OutPutFrm.RichEdit.Lines.Add(astring);
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('SOURCE D.F. SS MS F PROB.> F Omega Squared');
OutPutFrm.RichEdit.Lines.Add('');
astring := format('Among Rows %4.0f %12.4f %12.4f %12.4f %6.3f %6.3f',
[DFF1,SSF1,MSF1,FF1,ProbF1,OmegaF1]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format('Among Columns %4.0f %12.4f %12.4f %12.4f %6.3f %6.3f',
[DFF2,SSF2,MSF2,FF2,ProbF2,OmegaF2]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format('Among Slices %4.0f %12.4f %12.4f %12.4f %6.3f %6.3f',
[DFF3,SSF3,MSF3,FF3,ProbF3,OmegaF3]);
OutPutFrm.RichEdit.Lines.Add(astring);
if (interacts) then
begin
astring := format('A x B Inter. %4.0f %12.4f %12.4f %12.4f %6.3f %6.3f',
[DFF1F2,SSF1F2,MSF1F2,FF1F2,ProbF1F2,OmegaF1F2]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format('A x C Inter. %4.0f %12.4f %12.4f %12.4f %6.3f %6.3f',
[DFF1F3,SSF1F3,MSF1F3,FF1F3,ProbF1F3,OmegaF1F3]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format('B x C Inter. %4.0f %12.4f %12.4f %12.4f %6.3f %6.3f',
[DFF2F3,SSF2F3,MSF2F3,FF2F3,ProbF2F3,OmegaF2F3]);
OutPutFrm.RichEdit.Lines.Add(astring);
end;
astring := format('Residual %4.0f %12.4f %12.4f', [DFErr,SSErr,MSErr]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format(' NonAdditivity %4.0f %12.4f %12.4f %12.4f %6.3f',
[1.0,SSNonAdd,MSNonAdd,FNonAdd,ProbNonAdd]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format(' Balance %4.0f %12.4f %12.4f',[DFBalance,SSBalance,MSBalance]);
OutPutFrm.RichEdit.Lines.Add(astring);
astring := format('Total %4.0f %12.4f %12.4f',[DFTot,SSDep,MSDep]);
OutPutFrm.RichEdit.Lines.Add(astring);
OutPutFrm.RichEdit.Lines.Add('');
astring := format('Omega squared for combined effects := %8.4f',[Omega]);
OutPutFrm.RichEdit.Lines.Add(astring);
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('Descriptive Statistics');
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('GROUP N MEAN VARIANCE STD.DEV.');
groupsize := ncnt[1][1][1];
equal_grp := true;
MaxVar := 0.0;
MinVar := 1e20;
sumvars := 0.0;
sumfreqlogvar := 0.0;
sumDFrecip := 0.0;
// Display cell means, variances, standard deviations
for i := 0 to NoGrpsA - 1 do
begin
for j := 0 to NoGrpsB - 1 do
begin
for k := 0 to NoGrpsC - 1 do
begin
XBar := wsum[i,j,k] / ncnt[i,j,k];
V := 0.0;
S := 0.0;
end;
end;
end;
//Display Row means, variances, standard deviations
for i := 0 to NoGrpsA - 1 do
begin
XBar := RowSums[i] / RowCount[i];
OrdMeansA[i] := XBar;
RowSS := 0.0;
for j := 0 to NoGrpsB - 1 do
for k := 0 to NoGrpsC - 1 do RowSS := RowSS + wx2[i,j,k];
V := RowSS - (RowSums[i] * RowSums[i] / RowCount[i]);
V := V / (RowCount[i] - 1.0);
S := sqrt(V);
astring := format('Row %3d %3.0f %8.3f %8.3f %8.3f',
[minf1+i,RowCount[i],XBar,V,S]);
OutPutFrm.RichEdit.Lines.Add(astring);
end;
//Display means, variances and standard deviations for columns
for j := 0 to NoGrpsB - 1 do
begin
XBar := ColSums[j] / ColCount[j];
OrdMeansB[j] := XBar;
ColSS := 0.0;
for i := 0 to NoGrpsA - 1 do
for k := 0 to NoGrpsC - 1 do ColSS := ColSS + wx2[i,j,k];
V := ColSS - (ColSums[j] * ColSums[j] / ColCount[j]);
V := V / (ColCount[j] - 1.0);
S := sqrt(V);
astring := format('Col %3d %3.0f %8.3f %8.3f %8.3f',
[minf2+j,ColCount[j],XBar,V,S]);
OutPutFrm.RichEdit.Lines.Add(astring);
end;
//Display means, variances and standard deviations for slices
for k := 0 to NoGrpsC - 1 do
begin
XBar := SlcSums[k] / SlcCount[k];
OrdMeansC[k] := XBar;
SlcSS := 0.0;
for i := 0 to NoGrpsA - 1 do
for j := 0 to NoGrpsB - 1 do SlcSS := SlcSS + wx2[i,j,k];
V := SlcSS - (SlcSums[k] * SlcSums[k] / SlcCount[k]);
V := V / (SlcCount[k] - 1.0);
S := sqrt(V);
astring := format('Slice %3d %3.0f %8.3f %8.3f %8.3f',
[minf3+k,SlcCount[k],XBar,V,S]);
OutPutFrm.RichEdit.Lines.Add(astring);
end;
astring := format('TOTAL %3d %8.3f %8.3f %8.3f',
[N,MeanDep,MSDep,sqrt(MSDep)]);
OutPutFrm.RichEdit.Lines.Add(astring);
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('');
end;
procedure TOneCaseAnovaForm.ThreeWayPlot(Sender: TObject);
VAR
i, j, k : integer;
maxmean, XBar : double;
XValue : DblDyneVec;
title : string;
plottype : integer;
setstring : string;
begin
if (CompError) then exit;
SetLength(XValue,totcells);
if (PlotMeans.Checked) then PlotType := 2;
if (Plot2DLines.Checked) then PlotType := 1;
if (Plot3DLines.Checked) then PlotType := 10;
// Factor A first
setstring := 'FACTOR A';
GraphFrm.SetLabels[1] := setstring;
maxmean := 0.0;
SetLength(GraphFrm.Xpoints,1,Nf1cells);
SetLength(GraphFrm.Ypoints,1,Nf1cells);
for i := 0 to Nf1cells - 1 do
begin
RowSums[i] := RowSums[i] / RowCount[i];
GraphFrm.Ypoints[0,i] := RowSums[i];
if (RowSums[i] > maxmean) then maxmean := RowSums[i];
XValue[i] := minf1 + i;
GraphFrm.Xpoints[0,i] := XValue[i];
end;
GraphFrm.nosets := 1;
GraphFrm.nbars := Nf1cells;
GraphFrm.Heading := Factor1.Text;
title := Factor1.Text + ' Codes';
GraphFrm.XTitle := title;
GraphFrm.YTitle := 'Mean';
GraphFrm.barwideprop := 0.5;
GraphFrm.AutoScale := false;
GraphFrm.miny := 0.0;
GraphFrm.maxy := maxmean;
GraphFrm.GraphType := plottype;
GraphFrm.BackColor := clYellow;
GraphFrm.WallColor := clBlack;
GraphFrm.FloorColor := clLtGray;
GraphFrm.ShowBackWall := true;
GraphFrm.ShowModal;
GraphFrm.Xpoints := nil;
GraphFrm.Ypoints := nil;
// Factor B next
setstring := 'FACTOR B';
GraphFrm.SetLabels[1] := setstring;
maxmean := 0.0;
SetLength(GraphFrm.Xpoints,1,Nf2cells);
SetLength(GraphFrm.Ypoints,1,Nf2cells);
for i := 0 to Nf2cells - 1 do
begin
ColSums[i] := ColSums[i] / ColCount[i];
GraphFrm.Ypoints[0,i] := ColSums[i];
if (ColSums[i] > maxmean) then maxmean := ColSums[i];
XValue[i] := minf2 + i;
GraphFrm.Xpoints[0,i] := XValue[i];
end;
GraphFrm.nosets := 1;
GraphFrm.nbars := Nf2cells;
GraphFrm.Heading := Factor2.Text;
title := Factor2.Text + ' Codes';
GraphFrm.XTitle := title;
GraphFrm.YTitle := 'Mean';
GraphFrm.barwideprop := 0.5;
GraphFrm.AutoScale := false;
GraphFrm.miny := 0.0;
GraphFrm.maxy := maxmean;
GraphFrm.GraphType := plottype;
GraphFrm.BackColor := clYellow;
GraphFrm.WallColor := clBlack;
GraphFrm.FloorColor := clLtGray;
GraphFrm.ShowBackWall := true;
GraphFrm.ShowModal;
GraphFrm.Xpoints := nil;
GraphFrm.Ypoints := nil;
// Factor C next
setstring := 'FACTOR C';
GraphFrm.SetLabels[1] := setstring;
maxmean := 0.0;
SetLength(GraphFrm.Xpoints,1,Nf3cells);
SetLength(GraphFrm.Ypoints,1,Nf3cells);
for i := 0 to Nf3cells - 1 do
begin
SlcSums[i] := SlcSums[i] / SlcCount[i];
GraphFrm.Ypoints[0,i] := SlcSums[i];
if (SlcSums[i] > maxmean) then maxmean := SlcSums[i];
XValue[i] := minf3 + i;
GraphFrm.Xpoints[0,i] := XValue[i];
end;
GraphFrm.nosets := 1;
GraphFrm.nbars := Nf3cells;
GraphFrm.Heading := Factor3.Text;
title := Factor2.Text + ' Codes';
GraphFrm.XTitle := title;
GraphFrm.YTitle := 'Mean';
GraphFrm.barwideprop := 0.5;
GraphFrm.AutoScale := false;
GraphFrm.miny := 0.0;
GraphFrm.maxy := maxmean;
GraphFrm.GraphType := plottype;
GraphFrm.BackColor := clYellow;
GraphFrm.WallColor := clBlack;
GraphFrm.FloorColor := clLtGray;
GraphFrm.ShowBackWall := true;
GraphFrm.ShowModal;
GraphFrm.Xpoints := nil;
GraphFrm.Ypoints := nil;
// Factor A x B Interaction within each slice next
SetLength(GraphFrm.Ypoints,Nf1cells,Nf2cells);
SetLength(GraphFrm.Xpoints,1,Nf2cells);
for k := 0 to Nf3cells - 1 do
begin
maxmean := 0.0;
for i := 0 to Nf1cells - 1 do
begin
setstring := Factor1.Text + ' ' + IntToStr(i+1);
GraphFrm.SetLabels[i+1] := setstring;
for j := 0 to Nf2cells - 1 do
begin
XBar := wsum[i,j,k] / ncnt[i,j,k];
if (XBar > maxmean) then maxmean := XBar;
GraphFrm.Ypoints[i,j] := XBar;
end;
end;
for j := 0 to Nf2cells - 1 do
begin
XValue[j] := minf2 + j ;
GraphFrm.Xpoints[0,j] := XValue[j];
end;
GraphFrm.nosets := Nf1cells;
GraphFrm.nbars := Nf2cells;
GraphFrm.Heading := 'Factor A x Factor B Within C ' + IntToStr(k+1);
title := Factor2.Text + ' Codes';
GraphFrm.XTitle := title;
GraphFrm.YTitle := 'Mean';
GraphFrm.barwideprop := 0.2;
GraphFrm.AutoScale := false;
GraphFrm.miny := 0.0;
GraphFrm.maxy := maxmean;
GraphFrm.GraphType := plottype;
GraphFrm.BackColor := clYellow;
GraphFrm.WallColor := clBlack;
GraphFrm.FloorColor := clLtGray;
GraphFrm.ShowBackWall := true;
GraphFrm.ShowModal;
end;
GraphFrm.Xpoints := nil;
GraphFrm.Ypoints := nil;
// Factor A x C Interaction within each Column next
SetLength(GraphFrm.Xpoints,1,Nf3cells);
SetLength(GraphFrm.Ypoints,Nf1cells,Nf3cells);
for j := 0 to Nf2cells - 1 do
begin
maxmean := 0.0;
for i := 0 to Nf1cells - 1 do
begin
setstring := Factor1.Text + ' ' + IntToStr(i+1);
GraphFrm.SetLabels[i+1] := setstring;
for k := 0 to Nf3cells - 1 do
begin
XBar := wsum[i,j,k] / ncnt[i,j,k];
if (XBar > maxmean) then maxmean := XBar;
GraphFrm.Ypoints[i,k] := XBar;
end;
end;
for k := 0 to Nf3cells - 1 do
begin
XValue[k] := minf3 + k;
GraphFrm.Xpoints[0,k] := XValue[k];
end;
GraphFrm.nosets := Nf1cells;
GraphFrm.nbars := Nf3cells;
GraphFrm.Heading := 'Factor A x Factor C Within B ' + IntToStr(j+1);
title := Factor3.Text + ' Codes';
GraphFrm.XTitle := title;
GraphFrm.YTitle := 'Mean';
GraphFrm.barwideprop := 0.2;
GraphFrm.AutoScale := false;
GraphFrm.miny := 0.0;
GraphFrm.maxy := maxmean;
GraphFrm.GraphType := plottype;
GraphFrm.BackColor := clYellow;
GraphFrm.WallColor := clBlack;
GraphFrm.FloorColor := clLtGray;
GraphFrm.ShowBackWall := true;
GraphFrm.ShowModal;
end;
GraphFrm.Xpoints := nil;
GraphFrm.Ypoints := nil;
// Factor B x C Interaction within each row next
SetLength(GraphFrm.Xpoints,1,Nf3cells);
SetLength(GraphFrm.Ypoints,Nf2cells,Nf3cells);
for i := 0 to Nf1cells - 1 do
begin
maxmean := 0.0;
for j := 0 to Nf2cells - 1 do
begin
setstring := Factor2.Text + ' ' + IntToStr(j+1);
GraphFrm.SetLabels[j+1] := setstring;
for k := 0 to Nf3cells - 1 do
begin
XBar := wsum[i,j,k] / ncnt[i,j,k];
if (XBar > maxmean) then maxmean := XBar;
GraphFrm.Ypoints[j,k] := XBar;
end;
end;
for j := 0 to Nf3cells - 1 do
begin
XValue[j] := minf3 + j;
GraphFrm.Xpoints[0,j] := XValue[j];
end;
GraphFrm.nosets := Nf2cells;
GraphFrm.nbars := Nf3cells;
GraphFrm.Heading := 'Factor B x Factor C Within A ' + IntToStr(i+1);
title := Factor3.Text + ' Codes';
GraphFrm.XTitle := title;
GraphFrm.YTitle := 'Mean';
GraphFrm.barwideprop := 0.2;
GraphFrm.AutoScale := false;
GraphFrm.miny := 0.0;
GraphFrm.maxy := maxmean;
GraphFrm.GraphType := plottype;
GraphFrm.BackColor := clYellow;
GraphFrm.WallColor := clBlack;
GraphFrm.FloorColor := clLtGray;
GraphFrm.ShowBackWall := true;
GraphFrm.ShowModal;
end; // next row
GraphFrm.Xpoints := nil;
GraphFrm.Ypoints := nil;
XValue := nil;
end;
procedure TOneCaseAnovaForm.TwoWayContrasts(Sender: TObject);
VAR
i, j : integer;
value, alpha : double;
// outline : string;
variances : DblDyneVec;
RowSS, ColSS : double;
begin
if (comparisons = false) then exit;
if (CompError) then exit;
SetLength(variances,totcells);
alpha := StrToFloat(PostAlpha.Text);
// row comparisons
if ((Nf1cells > 2) and (ProbF1 < Overall) ) then
begin
for i := 0 to NoGrpsA - 1 do
begin
RowSS := 0.0;
for j := 0 to NoGrpsB - 1 do RowSS := RowSS + vars[i,j];
variances[i] := RowSS - (RowSums[i] * RowSums[i] / RowCount[i]);
variances[i] := variances[i] / (RowCount[i] - 1.0);
end;
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('COMPARISONS AMONG ROWS');
// get smallest group size
value := 1e20;
for i := 0 to Nf1cells - 1 do if (RowCount[i] < value) then value := RowCount[i];
if (ScheffeChk.Checked) then
SCHEFFETEST(MSErr,RowSums,RowCount,minf1,maxf1,N);
if ((TukeyHSDChk.Checked) and (equal_grp)) then
TUKEY(MSErr,DFErr,value,RowSums,RowCount,minf1,maxf1);
if ((TukeyBChk.Checked) and (equal_grp)) then
TUKEYBTEST(MSErr,DFErr,RowSums,RowCount,minf1,maxf1,value);
if ((TukeyKramerChk.Checked) and (equal_grp)) then
TUKEY_KRAMER(MSErr,DFErr,value,RowSums,RowCount,minf1,maxf1);
// if (BonferroniChk.Checked) then
// Bonferroni(RowSums,RowCount,variances,minf1,maxf1);
// if (OrthogonalChk.Checked) then
// CONTRASTS(MSErr,DFErr,RowSums,RowCount,minf1,maxf1,Alpha);
if ((NewmanKeulsChk.Checked) and (equal_grp)) then
Newman_Keuls(MSErr,DFErr,value,RowSums,RowCount,minf1,maxf1);
end;
// column comparisons
if ((Nf2cells > 2) and (ProbF2 < Alpha) ) then
begin
for j := 0 to NoGrpsB - 1 do
begin
ColSS := 0.0;
for i := 0 to NoGrpsA - 1 do ColSS := ColSS + vars[i,j];
variances[j] := ColSS - (ColSums[j] * ColSums[j] / ColCount[j]);
variances[j] := variances[j] / (ColCount[j] - 1.0);
end;
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('COMPARISONS AMONG COLUMNS');
value := 1e20;
for i := 0 to Nf2cells - 1 do if (ColCount[i] < value) then value := ColCount[i];
if (ScheffeChk.Checked) then
SCHEFFETEST(MSErr,ColSums,ColCount,minf2,maxf2,N);
if ((TukeyHSDChk.Checked) and (equal_grp)) then
TUKEY(MSErr,DFErr,value,ColSums,ColCount,minf2,maxf2);
if ((TukeyBChk.Checked) and (equal_grp)) then
TUKEYBTEST(MSErr,DFErr,ColSums,ColCount,minf2,maxf2,value);
if ((TukeyKramerChk.Checked) and (equal_grp)) then
TUKEY_KRAMER(MSErr,DFErr,value,ColSums,ColCount,minf2,maxf2);
// if (BonferroniChk.Checked) then
// Bonferroni(ColSums,ColCount,variances,minf2,maxf2);
// if (OrthogonalChk.Checked) then
// CONTRASTS(MSErr,DFErr,ColSums,ColCount,minf2,maxf2,Alpha);
if ((NewmanKeulsChk.Checked) and (equal_grp)) then
Newman_Keuls(MSErr,DFErr,value,ColSums,ColCount,minf2,maxf2);
end;
// simple effects for columns within each row
if (ProbF3 < Alpha) then
begin
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('COMPARISONS AMONG COLUMNS WITHIN EACH ROW');
for i := 0 to Nf1cells - 1 do
begin
OutPutFrm.RichEdit.Lines.Add('');
outline := format('ROW %d COMPARISONS',[i+1]);
OutPutFrm.RichEdit.Lines.Add(outline);
// move cell sums and counts to cellsums and cellcnts
for j := 0 to Nf2cells - 1 do
begin
cellsums[j] := sums[i,j];
cellcnts[j] := counts[i,j];
cellvars[j] := vars[i,j];
end;
value := 1e20;
for j := 0 to Nf2cells - 1 do if (cellcnts[j] < value) then value := cellcnts[j];
if (ScheffeChk.Checked) then
SCHEFFETEST(MSErr,cellsums,cellcnts,minf2,maxf2,N);
if ((TukeyHSDChk.Checked) and (equal_grp)) then
TUKEY(MSErr,DFErr,value,cellsums,cellcnts,minf2,maxf2);
if ((TukeyBChk.Checked) and (equal_grp)) then
TUKEYBTEST(MSErr,DFErr,cellsums,cellcnts,minf2,maxf2,value);
if ((TukeyKramerChk.Checked) and (equal_grp)) then
TUKEY_KRAMER(MSErr,DFErr,value,cellsums,cellcnts,minf2,maxf2);
// if (BonferroniChk.Checked) then
// Bonferroni(cellsums,cellcnts,cellvars,minf2,maxf2);
// if (OrthogonalChk.Checked) then
// CONTRASTS(MSErr,DFErr,cellsums,cellcnts,minf2,maxf2,0.05);
if ((NewmanKeulsChk.Checked) and (equal_grp)) then
Newman_Keuls(MSErr,DFErr,value,cellsums,cellcnts,minf2,maxf2);
end;
end;
// simple effects for rows within each column
if (ProbF3 < Alpha) then
begin
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('COMPARISONS AMONG ROWS WITHIN EACH COLUMN');
for j := 0 to Nf2cells - 1 do
begin
OutPutFrm.RichEdit.Lines.Add('');
outline := format('COLUMN %d COMPARISONS', [j+1]);
OutPutFrm.RichEdit.Lines.Add(outline);
// move cell sums and counts to cellsums and cellcnts
for i := 0 to Nf1cells - 1 do
begin
cellsums[i] := sums[i,j];
cellcnts[i] := counts[i,j];
cellvars[i] := vars[i,j];
end;
value := 1e20;
for i := 0 to Nf1cells - 1 do if (cellcnts[j] < value) then value := cellcnts[j];
if (ScheffeChk.Checked) then
SCHEFFETEST(MSErr,cellsums,cellcnts,minf1,maxf1,N);
if ((TukeyHSDChk.Checked) and (equal_grp)) then
TUKEY(MSErr,DFErr,value,cellsums,cellcnts,minf1,maxf1);
if ((TukeyBChk.Checked) and (equal_grp)) then
TUKEYBTEST(MSErr,DFErr,cellsums,cellcnts,minf1,maxf1,value);
if ((TukeyKramerChk.Checked) and (equal_grp)) then
TUKEY_KRAMER(MSErr,DFErr,value,cellsums,cellcnts,minf1,maxf1);
// if (BonferroniChk.Checked) then
// Bonferroni(cellsums,cellcnts,cellvars,minf1,maxf1);
// if (OrthogonalChk.Checked) then
// CONTRASTS(MSErr,DFErr,cellsums,cellcnts,minf1,maxf1,0.05);
if ((NewmanKeulsChk.Checked) and (equal_grp)) then
Newman_Keuls(MSErr,DFErr,value,cellsums,cellcnts,minf1,maxf1);
end;
end;
variances := nil;
end;
procedure TOneCaseAnovaForm.ThreeWayContrasts(Sender: TObject);
VAR
i, j, k : integer;
value, alpha : double;
// outline : string;
variances : DblDyneVec;
RowSS, ColSS, SlcSS : double;
begin
if (comparisons = false) then exit;
if (CompError) then exit;
alpha := StrToFloat(PostAlpha.Text);
if ((ScheffeChk.Checked = false) and (TukeyHSDChk.Checked = false) and
(TukeyBChk.Checked = false) and (TukeyKramerChk.Checked = false) and
(NewmanKeulsChk.Checked = false)) then exit;
SetLength(variances,totcells);
// row comparisons
if ((Nf1cells > 2) and (ProbF1 < Alpha)) then
begin
for i := 0 to NoGrpsA - 1 do
begin
RowSS := 0.0;
for j := 0 to NoGrpsB - 1 do
for k := 0 to NoGrpsC - 1 do RowSS := RowSS + wx2[i,j,k];
variances[i] := RowSS - (RowSums[i] * RowSums[i] / RowCount[i]);
variances[i] := variances[i] / (RowCount[i] - 1.0);
end;
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('COMPARISONS AMONG ROWS');
// get smallest group size
value := 1e20;
for i := 0 to Nf1cells - 1 do if (RowCount[i] < value) then value := RowCount[i];
if (ScheffeChk.Checked) then
SCHEFFETEST(MSErr,RowSums,RowCount,minf1,maxf1,N);
if ((TukeyHSDChk.Checked) and (equal_grp)) then
TUKEY(MSErr,DFErr,value,RowSums,RowCount,minf1,maxf1);
if ((TukeyBChk.Checked) and (equal_grp)) then
TUKEYBTEST(MSErr,DFErr,RowSums,RowCount,minf1,maxf1,value);
if ((TukeyKramerChk.Checked) and (equal_grp)) then
TUKEY_KRAMER(MSErr,DFErr,value,RowSums,RowCount,minf1,maxf1);
// if (BonferroniChk.Checked) then
// Bonferroni(RowSums,RowCount,variances,minf1,maxf1);
// if (OrthogonalChk.Checked) then
// CONTRASTS(MSErr,DFErr,RowSums,RowCount,minf1,maxf1,Alpha);
if ((NewmanKeulsChk.Checked) and (equal_grp)) then
Newman_Keuls(MSErr,DFErr,value,RowSums,RowCount,minf1,maxf1);
end;
// column comparisons
if ((Nf2cells > 2) and (ProbF2 < Alpha)) then
begin
for j := 0 to NoGrpsB - 1 do
begin
ColSS := 0.0;
for i := 0 to NoGrpsA - 1 do
for k := 0 to NoGrpsC - 1 do ColSS := ColSS + wx2[i,j,k];
variances[j] := ColSS - (ColSums[j] * ColSums[j] / ColCount[j]);
variances[j] := variances[j] / (ColCount[j] - 1.0);
end;
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('COMPARISONS AMONG COLUMNS');
value := 1e20;
for i := 0 to Nf2cells - 1 do if (ColCount[i] < value) then value := ColCount[i];
if (ScheffeChk.Checked) then
SCHEFFETEST(MSErr,ColSums,ColCount,minf2,maxf2,N);
if ((TukeyHSDChk.Checked) and (equal_grp)) then
TUKEY(MSErr,DFErr,value,ColSums,ColCount,minf2,maxf2);
if ((TukeyBChk.Checked) and (equal_grp)) then
TUKEYBTEST(MSErr,DFErr,ColSums,ColCount,minf2,maxf2,value);
if ((TukeyKramerChk.Checked) and (equal_grp)) then
TUKEY_KRAMER(MSErr,DFErr,value,ColSums,ColCount,minf2,maxf2);
// if (BonferroniChk.Checked) then
// Bonferroni(ColSums,ColCount,variances,minf2,maxf2);
// if (OrthogonalChk.Checked) then
// CONTRASTS(MSErr,DFErr,ColSums,ColCount,minf2,maxf2,Alpha);
if ((NewmanKeulsChk.Checked) and (equal_grp)) then
Newman_Keuls(MSErr,DFErr,value,ColSums,ColCount,minf2,maxf2);
end;
// slice comparisons
if ((Nf3cells > 2) and (ProbF3 < Alpha)) then
begin
for k := 0 to NoGrpsC - 1 do
begin
SlcSS := 0.0;
for i := 0 to NoGrpsA - 1 do
for j := 0 to NoGrpsB - 1 do SlcSS := SlcSS + wx2[i,j,k];
variances[k] := SlcSS - (SlcSums[k] * SlcSums[k] / SlcCount[k]);
variances[k] := variances[k] / (SlcCount[k] - 1.0);
end;
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('COMPARISONS AMONG SLICES');
value := 1e20;
for i := 0 to Nf3cells - 1 do if (SlcCount[i] < value) then value := SlcCount[i];
if (ScheffeChk.Checked) then
SCHEFFETEST(MSErr,SlcSums,SlcCount,minf3,maxf3,N);
if ((TukeyHSDChk.Checked) and (equal_grp)) then
TUKEY(MSErr,DFErr,value,SlcSums,SlcCount,minf3,maxf3);
if ((TukeyBChk.Checked) and (equal_grp)) then
TUKEYBTEST(MSErr,DFErr,SlcSums,SlcCount,minf3,maxf3,value);
if ((TukeyKramerChk.Checked) and (equal_grp)) then
TUKEY_KRAMER(MSErr,DFErr,value,SlcSums,SlcCount,minf3,maxf3);
// if (BonferroniChk.Checked) then
// Bonferroni(SlcSums,SlcCount,variances,minf3,maxf3);
// if (OrthogonalChk.Checked) then
// CONTRASTS(MSErr,DFErr,SlcSums,SlcCount,minf3,maxf3,Alpha);
if ((NewmanKeulsChk.Checked) and (equal_grp)) then
Newman_Keuls(MSErr,DFErr,value,SlcSums,SlcCount,minf3,maxf3);
end;
// simple effects for columns within each row
if (ProbF1F2 < Alpha) then
begin
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('COMPARISONS AMONG COLUMNS WITHIN EACH ROW');
for i := 0 to Nf1cells - 1 do
begin
OutPutFrm.RichEdit.Lines.Add('');
outline := format('ROW %d COMPARISONS',[i+1]);
OutPutFrm.RichEdit.Lines.Add(outline);
// move cell sums && counts to cellsums && cellcnts
for j := 0 to Nf2cells - 1 do
begin
for k := 0 to Nf3cells - 1 do
begin
cellsums[j] := wsum[i,j,k];
cellcnts[j] := ncnt[i,j,k];
cellvars[j] := wx2[i,j,k];
end;
end;
value := 1e20;
for j := 0 to Nf2cells - 1 do if (cellcnts[j] < value) then value := cellcnts[j];
if (ScheffeChk.Checked) then
SCHEFFETEST(MSErr,cellsums,cellcnts,minf2,maxf2,N);
if ((TukeyHSDChk.Checked) and (equal_grp)) then
TUKEY(MSErr,DFErr,value,cellsums,cellcnts,minf2,maxf2);
if ((TukeyBChk.Checked) and (equal_grp)) then
TUKEYBTEST(MSErr,DFErr,cellsums,cellcnts,minf2,maxf2,value);
if ((TukeyKramerChk.Checked) and (equal_grp)) then
TUKEY_KRAMER(MSErr,DFErr,value,cellsums,cellcnts,minf2,maxf2);
// if (BonferroniChk.Checked) then
// Bonferroni(cellsums,cellcnts,cellvars,minf2,maxf2);
// if (OrthogonalChk.Checked) then
// CONTRASTS(MSErr,DFErr,cellsums,cellcnts,minf2,maxf2,0.05);
if ((NewmanKeulsChk.Checked) and (equal_grp)) then
Newman_Keuls(MSErr,DFErr,value,cellsums,cellcnts,minf2,maxf2);
end;
end;
// simple effects for rows within each column
if (ProbF1F2 < Alpha) then
begin
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('COMPARISONS AMONG ROWS WITHIN EACH COLUMN');
for j := 0 to Nf2cells - 1 do
begin
OutPutFrm.RichEdit.Lines.Add('');
outline := format('COLUMN %d COMPARISONS',[j+1]);
OutPutFrm.RichEdit.Lines.Add(outline);
// move cell sums && counts to cellsums && cellcnts
for i := 0 to Nf1cells - 1 do
begin
for k := 0 to Nf3cells - 1 do
begin
cellsums[i] := wsum[i,j,k];
cellcnts[i] := ncnt[i,j,k];
cellvars[i] := wx2[i,j,k];
end;
end;
value := 1e20;
for i := 0 to Nf1cells - 1 do if (cellcnts[j] < value) then value := cellcnts[j];
if (ScheffeChk.Checked) then
SCHEFFETEST(MSErr,cellsums,cellcnts,minf1,maxf1,N);
if ((TukeyHSDChk.Checked) and (equal_grp)) then
TUKEY(MSErr,DFErr,value,cellsums,cellcnts,minf1,maxf1);
if ((TukeyBChk.Checked) and (equal_grp)) then
TUKEYBTEST(MSErr,DFErr,cellsums,cellcnts,minf1,maxf1,value);
if ((TukeyKramerChk.Checked) and (equal_grp)) then
TUKEY_KRAMER(MSErr,DFErr,value,cellsums,cellcnts,minf1,maxf1);
// if (BonferroniChk.Checked) then
// Bonferroni(cellsums,cellcnts,cellvars,minf1,maxf1);
// if (OrthogonalChk.Checked) then
// CONTRASTS(MSErr,DFErr,cellsums,cellcnts,minf1,maxf1,0.05);
if ((NewmanKeulsChk.Checked) and (equal_grp)) then
Newman_Keuls(MSErr,DFErr,value,cellsums,cellcnts,minf1,maxf1);
end;
end;
// simple effects for columns within each slice
if (ProbF2F3 < Alpha) then
begin
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('COMPARISONS AMONG COLUMNS WITHIN EACH SLICE');
for k := 0 to Nf3cells - 1 do
begin
OutPutFrm.RichEdit.Lines.Add('');
outline := format('SLICE %d COMPARISONS',[k+1]);
OutPutFrm.RichEdit.Lines.Add(outline);
// move cell sums && counts to cellsums && cellcnts
for j := 0 to Nf2cells - 1 do
begin
for i := 0 to Nf1cells - 1 do
begin
cellsums[j] := wsum[i,j,k];
cellcnts[j] := ncnt[i,j,k];
cellvars[j] := wx2[i,j,k];
end;
end;
value := 1e20;
for j := 0 to Nf2cells-1 do if (cellcnts[j] < value) then value := cellcnts[j];
if (ScheffeChk.Checked) then
SCHEFFETEST(MSErr,cellsums,cellcnts,minf2,maxf2,N);
if ((TukeyHSDChk.Checked) and (equal_grp)) then
TUKEY(MSErr,DFErr,value,cellsums,cellcnts,minf2,maxf2);
if ((TukeyBChk.Checked) and (equal_grp)) then
TUKEYBTEST(MSErr,DFErr,cellsums,cellcnts,minf2,maxf2,value);
if ((TukeyKramerChk.Checked) and (equal_grp)) then
TUKEY_KRAMER(MSErr,DFErr,value,cellsums,cellcnts,minf2,maxf2);
// if (BonferroniChk.Checked) then
// Bonferroni(cellsums,cellcnts,cellvars,minf2,maxf2);
// if (OrthogonalChk.Checked) then
// CONTRASTS(MSErr,DFErr,cellsums,cellcnts,minf2,maxf2,0.05);
if ((NewmanKeulsChk.Checked) and (equal_grp)) then
Newman_Keuls(MSErr,DFErr,value,cellsums,cellcnts,minf2,maxf2);
end;
end;
// simple effects for rows within each slice
if (ProbF1F3 < Alpha) then
begin
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('COMPARISONS AMONG ROWS WITHIN EACH SLICE');
for k := 0 to Nf3cells - 1 do
begin
OutPutFrm.RichEdit.Lines.Add('');
outline := format('SLICE %d COMPARISONS',[k+1]);
OutPutFrm.RichEdit.Lines.Add(outline);
// move cell sums && counts to cellsums && cellcnts
for i := 0 to Nf1cells - 1 do
begin
for j := 0 to Nf2cells - 1 do
begin
cellsums[j] := wsum[i,j,k];
cellcnts[j] := ncnt[i,j,k];
cellvars[j] := wx2[i,j,k];
end;
end;
value := 1e20;
for i := 0 to Nf1cells - 1 do if (cellcnts[i] < value) then value := cellcnts[i];
if (ScheffeChk.Checked) then
SCHEFFETEST(MSErr,cellsums,cellcnts,minf1,maxf1,N);
if ((TukeyHSDChk.Checked) and (equal_grp)) then
TUKEY(MSErr,DFErr,value,cellsums,cellcnts,minf1,maxf1);
if ((TukeyBChk.Checked) and (equal_grp)) then
TUKEYBTEST(MSErr,DFErr,cellsums,cellcnts,minf1,maxf1,value);
if ((TukeyKramerChk.Checked) and (equal_grp)) then
TUKEY_KRAMER(MSErr,DFErr,value,cellsums,cellcnts,minf1,maxf1);
// if (BonferroniChk.Checked) then
// Bonferroni(cellsums,cellcnts,cellvars,minf1,maxf1);
// if (OrthogonalChk.Checked) then
// CONTRASTS(MSErr,DFErr,cellsums,cellcnts,minf1,maxf1,0.05);
if ((NewmanKeulsChk.Checked) and (equal_grp)) then
Newman_Keuls(MSErr,DFErr,value,cellsums,cellcnts,minf1,maxf1);
end;
end;
variances := nil;
end;
initialization
{$I onecaseanovaunit.lrs}
end.