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.