Files
lazarus-ccr/applications/lazstats/source/forms/analysis/multivariate/bartletttestunit.pas

256 lines
5.5 KiB
ObjectPascal
Raw Normal View History

unit BartlettTestUnit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, StdCtrls, Buttons, ExtCtrls,
MainUnit, Globals, FunctionsLib, MatrixLib, BasicStatsReportFormUnit;
type
{ TBartlettTestForm }
TBartlettTestForm = class(TBasicStatsReportForm)
AllBtn: TBitBtn;
InBtn: TBitBtn;
Label2: TLabel;
Label3: TLabel;
OutBtn: TBitBtn;
SelList: TListBox;
VarList: TListBox;
procedure AllBtnClick(Sender: TObject);
procedure InBtnClick(Sender: TObject);
procedure OutBtnClick(Sender: TObject);
procedure SelListDblClick(Sender: TObject);
procedure VarListDblClick(Sender: TObject);
procedure VarListSelectionChange(Sender: TObject; {%H-}User: boolean);
private
protected
procedure AdjustConstraints; override;
procedure Compute; override;
procedure UpdateBtnStates; override;
public
constructor Create(AOwner: TComponent); override;
procedure Reset; override;
end;
var
BartlettTestForm: TBartlettTestForm;
implementation
{$R *.lfm}
uses
Utils, GridProcs;
{ TBartlettTestForm }
constructor TBartlettTestForm.Create(AOwner: TComponent);
begin
inherited;
end;
procedure TBartlettTestForm.AdjustConstraints;
begin
inherited;
ParamsPanel.Constraints.MinWidth := CloseBtn.Width * 4 + CloseBtn.BorderSpacing.Left * 3;
ParamsPanel.Constraints.MinHeight := AllBtn.Top + AllBtn.Height +
VarList.BorderSpacing.Bottom + ButtonBevel.Height +
CloseBtn.BorderSpacing.Top + CloseBtn.Height;
end;
procedure TBartlettTestForm.AllBtnClick(Sender: TObject);
var
i: integer;
begin
for i := 0 to VarList.Items.Count-1 do
SelList.Items.Add(VarList.Items[i]);
VarList.Clear;
UpdateBtnStates;
end;
procedure TBartlettTestForm.Compute;
VAR
matrix: DblDyneMat = nil;
means: DblDyneVec = nil;
variances: DblDyneVec = nil;
stddevs: DblDyneVec = nil;
ColNoSelected: IntDyneVec = nil;
DataGrid: DblDyneMat = nil;
RowLabels: StrDyneVec = nil;
ColLabels: StrDyneVec = nil;
determinant, chisquare, probability: double;
i, j, df, numVars, numCases, colno: integer;
errorcode: boolean;
lReport: TStrings;
begin
numVars := SelList.Count;
SetLength(matrix, numVars+1, numVars+1); // +1 due to augmentation
SetLength(means, numVars+1);
SetLength(stddevs, numVars+1);
SetLength(variances, numVars+1);
SetLength(ColNoSelected, numVars);
SetLength(DataGrid, NoCases, numVars);
SetLength(RowLabels, numVars);
SetLength(ColLabels, numVars);
for j := 0 to numVars-1 do
begin
RowLabels[j] := SelList.Items[j];
ColLabels[j] := RowLabels[j];
ColNoSelected[j] := GetVariableIndex(OS3MainFrm.DataGrid, RowLabels[j]);
end;
numCases := 0;
errorcode := false;
// get data into the datagrid
for j := 0 to numVars-1 do
begin
for i := 1 to NoCases do
begin
if not GoodRecord(OS3MainFrm.DataGrid, i, ColNoSelected) then continue;
colno := ColNoSelected[j];
DataGrid[i-1, j] := StrToFloat(OS3MainFrm.DataGrid.Cells[colno, i]);
numCases := numCases + 1;
end;
end;
lReport := TStringList.Create;
try
numCases := 0;
Correlations(numVars, ColNoSelected, matrix, means, variances, stddevs, errorcode, numCases);
MatPrint(matrix, numVars, numVars, 'CORRELATION MATRIX', RowLabels, ColLabels, numCases, lReport);
lReport.Add('');
Determ(matrix, numVars, numVars, determinant, errorcode);
lReport.Add('Determinant of matrix: %8.3f', [determinant]);
lReport.Add('');
chiSquare := -((numCases-1) - (2*numVars - 5)/6) * ln(determinant);
df := (sqr(numVars)- numVars) div 2;
probability := ChiSquaredProb(chiSquare, df);
lReport.Add('ChiSquare: %8.3f', [chisquare]);
lReport.Add('Degrees of Freedom: %8d', [df]);
lReport.Add('Probability > value: %8.3f', [1.0 - probability]);
FReportFrame.DisplayReport(lReport);
finally
lReport.Free;
end;
end;
procedure TBartlettTestForm.InBtnClick(Sender: TObject);
var
i: integer;
begin
i := 0;
while i < VarList.Items.Count do
begin
if VarList.Selected[i] then
begin
SelList.Items.Add(VarList.Items[i]);
VarList.Items.Delete(i);
i := 0;
end else
inc(i);
end;
UpdateBtnStates;
end;
procedure TBartlettTestForm.OutBtnClick(Sender: TObject);
var
i: integer;
begin
i := 0;
while i < SelList.Items.Count do
begin
if SelList.Selected[i] then
begin
VarList.Items.Add(SelList.Items[i]);
SelList.Items.Delete(i);
i := 0;
end else
i := i + 1;
end;
UpdateBtnStates;
end;
procedure TBartlettTestForm.Reset;
var
i: integer;
begin
inherited;
SelList.Clear;
VarList.Clear;
for i := 1 to NoVariables do
VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]);
UpdateBtnStates;
end;
procedure TBartlettTestForm.SelListDblClick(Sender: TObject);
var
index: Integer;
begin
index := SelList.ItemIndex;
if index > -1 then
begin
VarList.Items.Add(SelList.Items[index]);
SelList.Items.Delete(index);
UpdateBtnStates;
end;
end;
procedure TBartlettTestForm.UpdateBtnStates;
begin
inherited;
InBtn.Enabled := AnySelected(VarList);
OutBtn.Enabled := AnySelected(SelList);
AllBtn.Enabled := VarList.Items.Count > 0;
end;
procedure TBartlettTestForm.VarListDblClick(Sender: TObject);
var
index: Integer;
begin
index := VarList.ItemIndex;
if index > -1 then
begin
SelList.Items.Add(VarList.Items[index]);
VarList.Items.Delete(index);
UpdateBtnStates;
end;
end;
procedure TBartlettTestForm.VarListSelectionChange(Sender: TObject;
User: boolean);
begin
UpdateBtnStates;
end;
end.