diff --git a/applications/lazstats/docs/HelpNDoc/LazStats.hnd b/applications/lazstats/docs/HelpNDoc/LazStats.hnd
index b142fcb15..8a485c141 100644
Binary files a/applications/lazstats/docs/HelpNDoc/LazStats.hnd and b/applications/lazstats/docs/HelpNDoc/LazStats.hnd differ
diff --git a/applications/lazstats/source/LazStats.lpi b/applications/lazstats/source/LazStats.lpi
index 97b7f1289..1caca9da7 100644
--- a/applications/lazstats/source/LazStats.lpi
+++ b/applications/lazstats/source/LazStats.lpi
@@ -1397,14 +1397,14 @@
-
-
-
+
+
+
diff --git a/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.lfm b/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.lfm
index 2119e4b81..43afa3812 100644
--- a/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.lfm
+++ b/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.lfm
@@ -1,12 +1,12 @@
object StepFwdFrm: TStepFwdFrm
- Left = 677
- Height = 461
- Top = 239
- Width = 469
+ Left = 989
+ Height = 470
+ Top = 243
+ Width = 476
AutoSize = True
Caption = 'Forward Stepwise Multiple Regression'
- ClientHeight = 461
- ClientWidth = 469
+ ClientHeight = 470
+ ClientWidth = 476
OnActivate = FormActivate
OnCreate = FormCreate
OnShow = FormShow
@@ -25,24 +25,24 @@ object StepFwdFrm: TStepFwdFrm
ParentColor = False
end
object Label2: TLabel
- AnchorSideLeft.Control = ListBox1
- AnchorSideTop.Control = Owner
- Left = 189
+ AnchorSideLeft.Control = SelList
+ AnchorSideTop.Control = InBtn
+ Left = 269
Height = 15
- Top = 8
+ Top = 104
Width = 127
- BorderSpacing.Top = 8
Caption = 'Variables to be Analyzed'
ParentColor = False
end
object Label3: TLabel
AnchorSideLeft.Control = DepVar
- AnchorSideTop.Control = Owner
- Left = 346
+ AnchorSideBottom.Control = DepVar
+ Left = 269
Height = 15
- Top = 8
+ Top = 28
Width = 102
- BorderSpacing.Top = 8
+ Anchors = [akLeft, akBottom]
+ BorderSpacing.Bottom = 2
Caption = 'Dependent Variable'
ParentColor = False
end
@@ -51,11 +51,11 @@ object StepFwdFrm: TStepFwdFrm
AnchorSideTop.Control = Label1
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = AllBtn
- AnchorSideBottom.Control = GroupBox1
+ AnchorSideBottom.Control = GroupBox2
Left = 8
- Height = 244
+ Height = 188
Top = 25
- Width = 119
+ Width = 199
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Left = 8
BorderSpacing.Top = 2
@@ -63,90 +63,96 @@ object StepFwdFrm: TStepFwdFrm
BorderSpacing.Bottom = 8
ItemHeight = 0
MultiSelect = True
+ OnSelectionChange = SelListSelectionChange
TabOrder = 0
end
object InBtn: TBitBtn
- AnchorSideLeft.Control = AllBtn
+ AnchorSideLeft.Control = Owner
AnchorSideLeft.Side = asrCenter
- AnchorSideTop.Control = VarList
- Left = 144
+ AnchorSideTop.Control = DepOutBtn
+ AnchorSideTop.Side = asrBottom
+ Left = 224
Height = 28
- Top = 25
+ Top = 104
Width = 28
+ BorderSpacing.Top = 24
Images = MainDataModule.ImageList
ImageIndex = 1
OnClick = InBtnClick
Spacing = 0
- TabOrder = 1
+ TabOrder = 4
end
object OutBtn: TBitBtn
- AnchorSideLeft.Control = AllBtn
+ AnchorSideLeft.Control = Owner
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = InBtn
AnchorSideTop.Side = asrBottom
- Left = 144
+ Left = 224
Height = 28
- Top = 57
+ Top = 136
Width = 28
BorderSpacing.Top = 4
Images = MainDataModule.ImageList
ImageIndex = 0
OnClick = OutBtnClick
Spacing = 0
- TabOrder = 2
+ TabOrder = 5
end
object AllBtn: TBitBtn
+ AnchorSideLeft.Control = Owner
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = OutBtn
AnchorSideTop.Side = asrBottom
- Left = 135
+ Left = 215
Height = 25
- Top = 97
+ Top = 188
Width = 46
- Anchors = [akTop]
AutoSize = True
- BorderSpacing.Top = 12
+ BorderSpacing.Top = 24
Caption = 'ALL'
OnClick = AllBtnClick
Spacing = 0
- TabOrder = 3
+ TabOrder = 6
end
- object ListBox1: TListBox
+ object SelList: TListBox
AnchorSideLeft.Control = AllBtn
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Label2
AnchorSideTop.Side = asrBottom
- AnchorSideRight.Control = DepInBtn
- AnchorSideBottom.Control = VarList
- AnchorSideBottom.Side = asrBottom
- Left = 189
- Height = 244
- Top = 25
- Width = 113
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ AnchorSideBottom.Control = GroupBox2
+ Left = 269
+ Height = 92
+ Top = 121
+ Width = 199
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Left = 8
BorderSpacing.Top = 2
BorderSpacing.Right = 8
ItemHeight = 0
- TabOrder = 4
+ MultiSelect = True
+ OnSelectionChange = SelListSelectionChange
+ TabOrder = 7
end
object DepInBtn: TBitBtn
- Left = 310
+ AnchorSideLeft.Control = Owner
+ AnchorSideLeft.Side = asrCenter
+ Left = 224
Height = 28
Top = 24
Width = 28
- Anchors = [akTop]
Images = MainDataModule.ImageList
ImageIndex = 1
OnClick = DepInBtnClick
Spacing = 0
- TabOrder = 5
+ TabOrder = 1
end
object DepOutBtn: TBitBtn
AnchorSideLeft.Control = DepInBtn
AnchorSideTop.Control = DepInBtn
AnchorSideTop.Side = asrBottom
- Left = 310
+ Left = 224
Height = 28
Top = 52
Width = 28
@@ -154,24 +160,28 @@ object StepFwdFrm: TStepFwdFrm
ImageIndex = 0
OnClick = DepOutBtnClick
Spacing = 0
- TabOrder = 6
+ TabOrder = 2
end
object DepVar: TEdit
- AnchorSideLeft.Control = DepInBtn
+ AnchorSideLeft.Control = AllBtn
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Label3
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
- Left = 346
+ AnchorSideBottom.Control = DepOutBtn
+ AnchorSideBottom.Side = asrBottom
+ Left = 269
Height = 23
- Top = 25
- Width = 115
- Anchors = [akTop, akLeft, akRight]
+ Top = 45
+ Width = 199
+ Anchors = [akLeft, akRight, akBottom]
BorderSpacing.Left = 8
BorderSpacing.Top = 2
BorderSpacing.Right = 8
- TabOrder = 7
+ BorderSpacing.Bottom = 12
+ ReadOnly = True
+ TabOrder = 3
Text = 'DepVar'
end
object GroupBox1: TGroupBox
@@ -179,8 +189,8 @@ object StepFwdFrm: TStepFwdFrm
AnchorSideBottom.Control = Bevel1
Left = 8
Height = 135
- Top = 277
- Width = 451
+ Top = 286
+ Width = 457
Anchors = [akLeft, akBottom]
AutoSize = True
BorderSpacing.Left = 8
@@ -188,12 +198,12 @@ object StepFwdFrm: TStepFwdFrm
Caption = 'Options'
ChildSizing.LeftRightSpacing = 16
ChildSizing.TopBottomSpacing = 6
- ChildSizing.HorizontalSpacing = 18
+ ChildSizing.HorizontalSpacing = 24
ChildSizing.VerticalSpacing = 2
ChildSizing.Layout = cclTopToBottomThenLeftToRight
ChildSizing.ControlsPerLine = 5
ClientHeight = 115
- ClientWidth = 447
+ ClientWidth = 453
TabOrder = 9
object CPChkBox: TCheckBox
Left = 16
@@ -236,7 +246,7 @@ object StepFwdFrm: TStepFwdFrm
TabOrder = 4
end
object SDChkBox: TCheckBox
- Left = 230
+ Left = 236
Height = 19
Top = 6
Width = 201
@@ -244,7 +254,7 @@ object StepFwdFrm: TStepFwdFrm
TabOrder = 5
end
object MatInChkBox: TCheckBox
- Left = 230
+ Left = 236
Height = 19
Top = 27
Width = 201
@@ -252,7 +262,7 @@ object StepFwdFrm: TStepFwdFrm
TabOrder = 6
end
object MatSaveChkBox: TCheckBox
- Left = 230
+ Left = 236
Height = 19
Top = 48
Width = 201
@@ -260,7 +270,7 @@ object StepFwdFrm: TStepFwdFrm
TabOrder = 7
end
object PredictChkBox: TCheckBox
- Left = 230
+ Left = 236
Height = 19
Top = 69
Width = 201
@@ -269,163 +279,149 @@ object StepFwdFrm: TStepFwdFrm
end
end
object ResetBtn: TButton
- AnchorSideRight.Control = CancelBtn
+ AnchorSideRight.Control = ComputeBtn
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
- Left = 168
+ Left = 267
Height = 25
- Top = 428
+ Top = 437
Width = 54
Anchors = [akRight, akBottom]
AutoSize = True
- BorderSpacing.Left = 12
+ BorderSpacing.Left = 8
BorderSpacing.Top = 8
- BorderSpacing.Right = 12
+ BorderSpacing.Right = 8
BorderSpacing.Bottom = 8
Caption = 'Reset'
OnClick = ResetBtnClick
TabOrder = 10
end
object ComputeBtn: TButton
- AnchorSideRight.Control = ReturnBtn
+ AnchorSideRight.Control = CloseBtn
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
- Left = 308
+ Left = 329
Height = 25
- Top = 428
+ Top = 437
Width = 76
Anchors = [akRight, akBottom]
AutoSize = True
- BorderSpacing.Left = 12
+ BorderSpacing.Left = 8
BorderSpacing.Top = 8
- BorderSpacing.Right = 12
+ BorderSpacing.Right = 8
BorderSpacing.Bottom = 8
Caption = 'Compute'
OnClick = ComputeBtnClick
TabOrder = 11
end
- object CancelBtn: TButton
- AnchorSideRight.Control = ComputeBtn
- AnchorSideBottom.Control = Owner
- AnchorSideBottom.Side = asrBottom
- Left = 234
- Height = 25
- Top = 428
- Width = 62
- Anchors = [akRight, akBottom]
- AutoSize = True
- BorderSpacing.Left = 12
- BorderSpacing.Top = 8
- BorderSpacing.Right = 12
- BorderSpacing.Bottom = 8
- Caption = 'Cancel'
- ModalResult = 2
- TabOrder = 12
- end
- object ReturnBtn: TButton
+ object CloseBtn: TButton
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
- Left = 396
+ Left = 413
Height = 25
- Top = 428
- Width = 61
+ Top = 437
+ Width = 55
Anchors = [akRight, akBottom]
AutoSize = True
- BorderSpacing.Left = 12
+ BorderSpacing.Left = 8
BorderSpacing.Top = 8
- BorderSpacing.Right = 12
+ BorderSpacing.Right = 8
BorderSpacing.Bottom = 8
- Caption = 'Return'
- ModalResult = 1
- TabOrder = 13
+ Caption = 'Close'
+ ModalResult = 11
+ TabOrder = 12
end
object Bevel1: TBevel
AnchorSideLeft.Control = Owner
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
- AnchorSideBottom.Control = ReturnBtn
+ AnchorSideBottom.Control = CloseBtn
Left = 0
Height = 8
- Top = 412
- Width = 469
+ Top = 421
+ Width = 476
Anchors = [akLeft, akRight, akBottom]
Shape = bsBottomLine
end
object GroupBox2: TGroupBox
- AnchorSideLeft.Control = DepInBtn
+ AnchorSideLeft.Control = Owner
AnchorSideTop.Control = DepOutBtn
AnchorSideTop.Side = asrBottom
- Left = 310
- Height = 80
- Top = 92
- Width = 132
+ AnchorSideBottom.Control = GroupBox1
+ Left = 8
+ Height = 53
+ Top = 225
+ Width = 268
+ Anchors = [akLeft, akBottom]
AutoSize = True
+ BorderSpacing.Left = 8
BorderSpacing.Top = 12
BorderSpacing.Right = 8
+ BorderSpacing.Bottom = 8
Caption = 'Minimum Probability'
- ClientHeight = 60
- ClientWidth = 128
+ ClientHeight = 33
+ ClientWidth = 264
TabOrder = 8
object Label4: TLabel
+ AnchorSideLeft.Control = GroupBox2
AnchorSideTop.Control = InProb
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = InProb
- Left = 25
+ Left = 18
Height = 15
Top = 6
Width = 44
- Anchors = [akTop, akRight]
BorderSpacing.Left = 18
BorderSpacing.Right = 8
Caption = 'to Enter:'
ParentColor = False
end
object Label5: TLabel
- AnchorSideTop.Control = ProbOut
+ AnchorSideLeft.Control = InProb
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = InProb
AnchorSideTop.Side = asrCenter
- AnchorSideRight.Control = ProbOut
- Left = 19
+ AnchorSideRight.Control = OutProb
+ Left = 144
Height = 15
- Top = 33
+ Top = 6
Width = 50
- Anchors = [akTop, akRight]
- BorderSpacing.Left = 18
+ BorderSpacing.Left = 24
BorderSpacing.Right = 8
Caption = 'to Retain:'
ParentColor = False
end
object InProb: TEdit
+ AnchorSideLeft.Control = Label4
+ AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = GroupBox2
AnchorSideRight.Control = GroupBox2
AnchorSideRight.Side = asrBottom
- Left = 77
+ Left = 70
Height = 23
Top = 2
- Width = 39
- Anchors = [akTop, akRight]
+ Width = 50
BorderSpacing.Top = 2
BorderSpacing.Right = 12
TabOrder = 0
Text = 'InProb'
end
- object ProbOut: TEdit
- AnchorSideLeft.Control = InProb
+ object OutProb: TEdit
+ AnchorSideLeft.Control = Label5
+ AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = InProb
- AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = GroupBox2
AnchorSideRight.Side = asrBottom
- Left = 77
+ Left = 202
Height = 23
- Top = 29
- Width = 39
- Anchors = [akTop, akLeft, akRight]
- BorderSpacing.Top = 4
+ Top = 2
+ Width = 50
BorderSpacing.Right = 12
BorderSpacing.Bottom = 8
TabOrder = 1
- Text = 'Edit1'
+ Text = 'OutProb'
end
end
object Bevel2: TBevel
diff --git a/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.pas b/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.pas
index 839a67daf..92972b315 100644
--- a/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.pas
+++ b/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.pas
@@ -20,8 +20,7 @@ type
OpenDialog1: TOpenDialog;
ResetBtn: TButton;
ComputeBtn: TButton;
- CancelBtn: TButton;
- ReturnBtn: TButton;
+ CloseBtn: TButton;
PredictChkBox: TCheckBox;
MatSaveChkBox: TCheckBox;
MatInChkBox: TCheckBox;
@@ -34,7 +33,7 @@ type
CPChkBox: TCheckBox;
GroupBox1: TGroupBox;
InProb: TEdit;
- ProbOut: TEdit;
+ OutProb: TEdit;
InBtn: TBitBtn;
Label4: TLabel;
Label5: TLabel;
@@ -46,7 +45,7 @@ type
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
- ListBox1: TListBox;
+ SelList: TListBox;
VarList: TListBox;
procedure AllBtnClick(Sender: TObject);
procedure ComputeBtnClick(Sender: TObject);
@@ -56,14 +55,16 @@ type
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure InBtnClick(Sender: TObject);
+ procedure SelListSelectionChange(Sender: TObject; User: boolean);
procedure OutBtnClick(Sender: TObject);
procedure ResetBtnClick(Sender: TObject);
private
{ private declarations }
FAutoSized: boolean;
+ procedure UpdateBtnStates;
public
{ public declarations }
- end;
+ end;
var
StepFwdFrm: TStepFwdFrm;
@@ -76,30 +77,27 @@ uses
{ TStepFwdFrm }
procedure TStepFwdFrm.ResetBtnClick(Sender: TObject);
-VAR i : integer;
+var
+ i: integer;
begin
- VarList.Clear;
- ListBox1.Clear;
- for i := 1 to NoVariables do
- begin
- VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]);
- end;
- InBtn.Enabled := true;
- OutBtn.Enabled := false;
- DepInBtn.Enabled := true;
- DepOutBtn.Enabled := false;
- DepVar.Text := '';
- InProb.Text := '0.05';
- ProbOut.Text := '0.10';
- CPChkBox.Checked := false;
- CovChkBox.Checked := false;
- CorrsChkBox.Checked := true;
- MeansChkBox.Checked := true;
- VarChkBox.Checked := false;
- SDChkBox.Checked := true;
- MatInChkBox.Checked := false;
- MatSaveChkBox.Checked := false;
- PredictChkBox.Checked := false;
+ VarList.Clear;
+ SelList.Clear;
+ for i := 1 to NoVariables do
+ VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]);
+
+ DepVar.Text := '';
+ InProb.Text := FormatFloat('0.00', DEFAULT_ALPHA_LEVEL);
+ OutProb.Text := FormatFloat('0.00', 0.10);
+
+ CPChkBox.Checked := false;
+ CovChkBox.Checked := false;
+ CorrsChkBox.Checked := true;
+ MeansChkBox.Checked := true;
+ VarChkBox.Checked := false;
+ SDChkBox.Checked := true;
+ MatInChkBox.Checked := false;
+ MatSaveChkBox.Checked := false;
+ PredictChkBox.Checked := false;
end;
procedure TStepFwdFrm.FormActivate(Sender: TObject);
@@ -109,13 +107,12 @@ begin
if FAutoSized then
exit;
- w := MaxValue([ResetBtn.Width, CancelBtn.Width, ComputeBtn.Width, ReturnBtn.Width]);
+ w := MaxValue([ResetBtn.Width, ComputeBtn.Width, CloseBtn.Width]);
ResetBtn.Constraints.MinWidth := w;
- CancelBtn.Constraints.MinWidth := w;
ComputeBtn.Constraints.MinWidth := w;
- ReturnBtn.Constraints.MinWidth := w;
+ CloseBtn.Constraints.MinWidth := w;
- VarList.Constraints.MinHeight := Max(200, GroupBox2.Top + Groupbox2.Height - VarList.Top);
+ VarList.Constraints.MinHeight := Max(200, AllBtn.Top + AllBtn.Height - VarList.Top); //GroupBox2.Top + Groupbox2.Height - VarList.Top);
Constraints.MinWidth := Width;
Constraints.MinHeight := Height;
@@ -135,28 +132,27 @@ begin
end;
procedure TStepFwdFrm.AllBtnClick(Sender: TObject);
-var count, index : integer;
+var
+ index: integer;
begin
- count := VarList.Items.Count;
- for index := 0 to count-1 do
- begin
- ListBox1.Items.Add(VarList.Items.Strings[index]);
- end;
- VarList.Clear;
+ for index := 0 to VarList.Items.Count-1 do
+ SelList.Items.Add(VarList.Items[index]);
+ VarList.Clear;
+ UpdateBtnStates;
end;
procedure TStepFwdFrm.ComputeBtnClick(Sender: TObject);
-Label CleanUp, lastone;
+Label
+ lastone;
var
i, j, k, k1, NoVars, NCases,errcnt : integer;
- errorcode : boolean;
Index, NoIndepVars : integer;
largest, R2, Constant: double;
StdErrEst, NewR2, LargestPartial : double;
pdf1, pdf2, PartF, PartProb, LargestProb, POut : double;
SmallestProb : double;
BetaWeights : DblDyneVec;
- cellstring, outline: string;
+ cellstring: string;
corrs : DblDyneMat;
Means : DblDyneVec;
Variances : DblDyneVec;
@@ -165,334 +161,451 @@ var
title : string;
RowLabels : StrDyneVec;
ColLabels : StrDyneVec;
- IndRowLabels : StrDyneVec;
- IndColLabels : StrDyneVec;
- IndepCorrs : DblDyneMat;
+// IndRowLabels : StrDyneVec;
+// IndColLabels : StrDyneVec;
+// IndepCorrs : DblDyneMat;
IndepInverse : DblDyneMat;
IndepIndex : IntDyneVec;
- XYCorrs : DblDyneVec;
+// XYCorrs : DblDyneVec;
matched : boolean;
Partial : DblDyneVec;
Candidate : IntDyneVec;
TempNoVars : Integer;
StepNo : integer;
filename : string;
+ errorcode : boolean = false;
+ lReport: TStrings;
+ tmp: Double;
begin
- if NoVariables = 0 then NoVariables := 200;
- SetLength(corrs,NoVariables+1,NoVariables+1);
- SetLength(IndepCorrs,NoVariables,NoVariables);
- SetLength(IndepInverse,NoVariables,NoVariables);
- SetLength(Means,NoVariables);
- SetLength(Variances,NoVariables);
- SetLength(StdDevs,NoVariables);
- SetLength(RowLabels,NoVariables);
- SetLength(ColLabels,NoVariables);
- SetLength(XYCorrs,NoVariables);
- SetLength(IndepIndex,NoVariables);
- SetLength(IndColLabels,NoVariables);
- SetLength(IndRowLabels,NoVariables);
- SetLength(BetaWeights,NoVariables);
- SetLength(Partial,NoVariables);
- SetLength(Candidate,NoVariables);
- SetLength(ColNoSelected,NoVariables);
+ if InProb.Text = '' then
+ begin
+ InProb.SetFocus;
+ MessageDlg('Probability to enter not specified.', mtError, [mbOK], 0);
+ exit;
+ end;
+ if OutProb.Text = '' then
+ begin
+ OutProb.SetFocus;
+ MessageDlg('Probability to retain not specified.', mtError, [mbOK], 0);
+ exit;
+ end;
+ if not TryStrToFloat(InProb.Text, tmp) then
+ begin
+ InProb.SetFocus;
+ MessageDlg('No valid number.', mtError, [mbOK], 0);
+ exit;
+ end;
+ if not TryStrToFloat(OutProb.Text, tmp) then
+ begin
+ OutProb.SetFocus;
+ MessageDlg('No valid number.', mtError, [mbOK], 0);
+ exit;
+ end;
- OutputFrm.RichEdit.Clear;
-// OutputFrm.RichEdit.ParaGraph.Alignment := taLeftJustify;
- OutputFrm.RichEdit.Lines.Add('Stepwise Multiple Regression by Bill Miller');
- StepNo := 1;
- errcnt := 0;
- errorcode := false;
- if MatInChkBox.Checked = true then
- begin
- OpenDialog1.Filter := 'OS3 matrix files (*.MAT)|*.MAT|All files (*.*)|*.*';
- OpenDialog1.FilterIndex := 1;
- if OpenDialog1.Execute then
- begin
- filename := OpenDialog1.FileName;
- MATREAD(Corrs,NoVars,NoVars,Means,StdDevs,NCases,RowLabels,ColLabels,filename);
- for i := 0 to NoVars-1 do
- begin
- Variances[i] := sqr(StdDevs[i]);
- ColNoSelected[i] := i+1;
- end;
- DepVar.Text := RowLabels[NoVars-1];
- for i := 0 to NoVars-2 do ListBox1.Items.Add(RowLabels[i]);
- ShowMessage('NOTICE! Last variable in matrix is the dependent variable');
- end;
- end;
- if MatInChkBox.Checked = false then
- begin
- { get independent item columns }
- NoVars := ListBox1.Items.Count;
- if NoVars < 1 then
- begin
- ShowMessage('ERROR! No independent variables selected.');
- goto CleanUp;
- end;
- for i := 0 to NoVars-1 do
- begin
- cellstring := ListBox1.Items.Strings[i];
- for j := 1 to NoVariables do
- begin
- if cellstring = OS3MainFrm.DataGrid.Cells[j,0] then
- begin
- ColNoSelected[i] := j;
- RowLabels[i] := cellstring;
- ColLabels[i] := cellstring;
- end;
- end;
- end;
- { get dependendent variable column }
- if DepVar.Text = '' then
- begin
- ShowMessage('ERROR! No Dependent variable selected.');
- goto CleanUp;
- end;
- NoVars := NoVars + 1;
- for j := 1 to NoVariables do
- begin
- if DepVar.Text = OS3MainFrm.DataGrid.Cells[j,0] then
- begin
- ColNoSelected[NoVars-1] := j;
- RowLabels[NoVars-1] := DepVar.Text;
- ColLabels[NoVars-1] := DepVar.Text;
- end;
- end;
- if CPChkBox.Checked = true then
- begin
- title := 'Cross-Products Matrix';
- GridXProd(NoVars,ColNoSelected,Corrs,errorcode,NCases);
- MAT_PRINT(Corrs,NoVars,NoVars,title,RowLabels,ColLabels,NCases);
- end;
- if CovChkBox.Checked = true then
- begin
- title := 'Variance-Covariance Matrix';
- GridCovar(NoVars,ColNoSelected,Corrs,Means,Variances,
- StdDevs,errorcode,NCases);
- MAT_PRINT(Corrs,NoVars,NoVars,title,RowLabels,ColLabels,NCases);
- end;
- Correlations(NoVars,ColNoSelected,Corrs,Means,Variances,
- StdDevs,errorcode,NCases);
- end;
- if CorrsChkBox.Checked = true then
- begin
- title := 'Product-Moment Correlations Matrix';
- MAT_PRINT(Corrs,NoVars,NoVars,title,RowLabels,ColLabels,NCases);
- end;
- if MatSaveChkBox.Checked = true then
- begin
- SaveDialog1.Filter := 'OS3 matrix files (*.MAT)|*.MAT|All files (*.*)|*.*';
- SaveDialog1.FilterIndex := 1;
- if SaveDialog1.Execute then
- begin
- filename := SaveDialog1.FileName;
- MATSAVE(Corrs,NoVars,NoVars,Means,StdDevs,NCases,RowLabels,ColLabels,filename);
- end;
- end;
- title := 'Means';
- if MeansChkBox.Checked = true then
- DynVectorPrint(Means,NoVars,title,ColLabels,NCases);
- title := 'Variances';
- if VarChkBox.Checked = true then
- DynVectorPrint(Variances,NoVars,title,ColLabels,NCases);
- title := 'Standard Deviations';
- if SDChkBox.Checked = true then
- DynVectorPrint(StdDevs,NoVars,title,ColLabels,NCases);
- if errorcode then
- begin
- OutputFrm.RichEdit.Lines.Add('One or more correlations could not be computed due to zero variance of a variable.');
- end;
- OutputFrm.ShowModal;
- if errorcode then
- begin
- ShowMessage('ERROR! A selected variable has no variability-run aborted.');
- goto CleanUp;
- end;
- OutputFrm.RichEdit.Clear;
- OutputFrm.RichEdit.Lines.Add('Stepwise Multiple Regression by Bill Miller');
+ if NoVariables = 0 then
+ NoVariables := 200;
+ SetLength(corrs, NoVariables+1, NoVariables+1);
+// SetLength(IndepCorrs, NoVariables, NoVariables);
+ SetLength(IndepInverse, NoVariables, NoVariables);
+ SetLength(Means, NoVariables);
+ SetLength(Variances, NoVariables);
+ SetLength(StdDevs, NoVariables);
+ SetLength(RowLabels, NoVariables);
+ SetLength(ColLabels, NoVariables);
+// SetLength(XYCorrs, NoVariables);
+ SetLength(IndepIndex, NoVariables);
+// SetLength(IndColLabels, NoVariables);
+// SetLength(IndRowLabels, NoVariables);
+ SetLength(BetaWeights, NoVariables);
+ SetLength(Partial, NoVariables);
+ SetLength(Candidate, NoVariables);
+ SetLength(ColNoSelected, NoVariables);
- { Select largest correlation to begin. Note: dependent is last variable }
- largest := 0.0;
- Index := 1;
- for i := 1 to NoVars - 1 do
- begin
- if abs(corrs[i-1,NoVars-1]) > largest then
+ lReport := TStringList.Create;
+ try
+ lReport.Add('STEPWISE MULTIPLE REGRESSION by Bill Miller');
+ StepNo := 1;
+ errcnt := 0;
+ errorcode := false;
+ if MatInChkBox.Checked then
+ begin
+ OpenDialog1.Filter := 'LazStats matrix files (*.mat)|*.mat;*.MAT|All files (*.*)|*.*';
+ OpenDialog1.FilterIndex := 1;
+ if OpenDialog1.Execute then
+ begin
+ filename := OpenDialog1.FileName;
+ MatRead(Corrs, NoVars, NoVars, Means, StdDevs, NCases, RowLabels, ColLabels, filename);
+ for i := 0 to NoVars-1 do
+ begin
+ Variances[i] := sqr(StdDevs[i]);
+ ColNoSelected[i] := i+1;
+ end;
+ DepVar.Text := RowLabels[NoVars-1];
+ for i := 0 to NoVars-2 do SelList.Items.Add(RowLabels[i]);
+ Messagedlg('Last variable in matrix is the dependent variable.', mtInformation, [mbOK], 0);
+ end;
+ end;
+
+ if not MatInChkBox.Checked then
+ begin
+ { get independent item columns }
+ NoVars := SelList.Items.Count;
+ if NoVars < 1 then
+ begin
+ MessageDlg('No independent variables selected.', mtError, [mbOK], 0);
+ exit;
+ end;
+
+ for i := 0 to NoVars-1 do
+ begin
+ cellstring := SelList.Items.Strings[i];
+ for j := 1 to NoVariables do
+ begin
+ if cellstring = OS3MainFrm.DataGrid.Cells[j,0] then
begin
- largest := abs(corrs[i-1,NoVars-1]);
- Index := i;
+ ColNoSelected[i] := j;
+ RowLabels[i] := cellstring;
+ ColLabels[i] := cellstring;
end;
- end;
- NoIndepVars := 1;
- IndepIndex[NoIndepVars-1] := Index;
- POut := StrToFloat(ProbOut.Text);
- OutputFrm.RichEdit.Lines.Add('');
- outline := format('----------------- STEP %d ------------------',[StepNo]);
- OutputFrm.RichEdit.Lines.Add(outline);
- MReg2(NCases,NoVars,NoIndepVars,IndepIndex,corrs,IndepInverse,
- RowLabels,R2,BetaWeights,
- Means,Variances,errcnt,StdErrEst,constant,POut,true, true,false, OutputFrm.RichEdit.Lines);
- OutputFrm.ShowModal;
- while NoIndepVars < NoVars-1 do
+ end;
+ end;
+
+ { get dependendent variable column }
+ if DepVar.Text = '' then
+ begin
+ MessageDlg('No Dependent variable selected.', mtError, [mbOK], 0);
+ exit;
+ end;
+
+ NoVars := NoVars + 1;
+ for j := 1 to NoVariables do
+ begin
+ if DepVar.Text = OS3MainFrm.DataGrid.Cells[j,0] then
+ begin
+ ColNoSelected[NoVars-1] := j;
+ RowLabels[NoVars-1] := DepVar.Text;
+ ColLabels[NoVars-1] := DepVar.Text;
+ end;
+ end;
+
+ if CPChkBox.Checked then
+ begin
+ title := 'Cross-Products Matrix';
+ GridXProd(NoVars, ColNoSelected, Corrs, errorcode, NCases);
+ MatPrint(Corrs, NoVars, NoVars, title, RowLabels, ColLabels, NCases, lReport);
+ lReport.Add('');
+ end;
+
+ if CovChkBox.Checked then
+ begin
+ title := 'Variance-Covariance Matrix';
+ GridCovar(NoVars, ColNoSelected, Corrs, Means, Variances, StdDevs, errorcode, NCases);
+ MatPrint(Corrs, NoVars, NoVars, title, RowLabels, ColLabels, NCases, lReport);
+ lReport.Add('');
+ end;
+
+ Correlations(NoVars, ColNoSelected, Corrs, Means, Variances, StdDevs, errorcode, NCases);
+ end;
+
+ if CorrsChkBox.Checked then
begin
- { select the next independent variable based on the largest
- semipartial correlation with the dependent variable. The
- squared semipartial for each remaining independent variable
- is the difference between the squared MC of the dependent
- variable with all previously entered variables plus a candidate
- variable and the squared MC with just the previously entered
- variables ( the previously obtained R2 ). }
- { build list of candidates }
- StepNo := StepNo + 1;
- k := 0;
- for i := 1 to NoVars - 1 do
- begin
- matched := false;
- for j := 0 to NoIndepVars-1 do
- begin
- if IndepIndex[j] = i then matched := true;
- end;
- if (matched = false) then
- begin
- k := k + 1;
- Candidate[k-1] := i;
- end;
- end; { k is the no. of candidates }
- OutputFrm.RichEdit.Lines.Add('');
- OutputFrm.RichEdit.Lines.Add('Candidates for entry in next step.');
- OutputFrm.RichEdit.Lines.Add('Candidate Partial F Statistic Prob. DF1 DF2');
- LargestProb := 0.0;
- SmallestProb := 1.0;
- for k1 := 1 to k do
- begin
- { get Mult Corr. with previously entered plus candidate }
- IndepIndex[NoIndepVars] := Candidate[k1-1];
- TempNoVars := NoIndepVars + 1;
- MReg2(NCases,NoVars,TempNoVars,IndepIndex,corrs,IndepInverse,
- RowLabels,NewR2,BetaWeights, Means,Variances,
- errcnt, StdErrEst, constant, POut, false, false,false, OutputFrm.RichEdit.Lines);
- Partial[k1-1] := (NewR2 - R2) / (1.0 - R2);
- pdf1 := 1;
- pdf2 := NCases - TempNoVars - 1;
- PartF := ((NewR2 - R2) * pdf2) / (1.0 - NewR2);
- PartProb := probf(PartF,pdf1,pdf2);
- if PartProb < SmallestProb then SmallestProb := PartProb;
- if PartProb > LargestProb then LargestProb := PartProb;
- outline := format('%-10s %6.4f %7.4f %6.4f %3.0f %3.0f',
- [RowLabels[Candidate[k1-1]-1], sqrt(abs(Partial[k1-1])), PartF, PartProb, pdf1, pdf2]);
- OutputFrm.RichEdit.Lines.Add(outline);
- end;
+ title := 'Product-Moment Correlations Matrix';
+ MatPrint(Corrs, NoVars, NoVars, title, RowLabels, ColLabels, NCases, lReport);
+ lReport.Add('');
+ end;
- if (SmallestProb > StrToFloat(InProb.Text)) then
- begin
- OutputFrm.RichEdit.Lines.Add('No further steps meet criterion for entry.');
- goto lastone;
- end;
- { select variable with largest partial to enter next }
- largestpartial := 0.0;
- Index := 1;
- for i := 1 to k do
- begin
- if Partial[i-1] > LargestPartial then
- begin
- Index := Candidate[i-1];
- LargestPartial := Partial[i-1];
- end;
- end;
+ if MatSaveChkBox.Checked then
+ begin
+ SaveDialog1.Filter := 'LazStats matrix files (*.mat)|*.mat;*.MAT|All files (*.*)|*.*';
+ SaveDialog1.FilterIndex := 1;
+ if SaveDialog1.Execute then
+ begin
+ filename := SaveDialog1.FileName;
+ MatSave(Corrs, NoVars, NoVars, Means, StdDevs, NCases, RowLabels, ColLabels, filename);
+ end;
+ end;
- outline := format('Variable %s will be added',[RowLabels[Index-1]]);
- OutputFrm.RichEdit.Lines.Add(outline);
- NoIndepVars := NoIndepVars + 1;
- IndepIndex[NoIndepVars-1] := Index;
- OutputFrm.RichEdit.Lines.Add('');
- outline := format('----------------- STEP %d ------------------',[StepNo]);
- OutputFrm.RichEdit.Lines.Add(outline);
- MReg2(NCases,NoVars,NoIndepVars,IndepIndex,corrs,IndepInverse,
- RowLabels,R2,BetaWeights, Means,Variances,
- errcnt, StdErrEst, constant,POut,true,true,false, OutputFrm.RichEdit.Lines);
- if (errcnt > 0) or (NoIndepVars = NoVars-1) then { out tolerance exceeded - finish up }
-lastone: begin
- OutputFrm.RichEdit.Lines.Add('');
- OutputFrm.RichEdit.Lines.Add('-------------FINAL STEP-----------');
- MReg2(NCases,NoVars,NoIndepVars,IndepIndex,corrs,IndepInverse,
- RowLabels,NewR2,BetaWeights,Means,Variances,
- errcnt,StdErrEst,constant,POut,true,false,false, OutputFrm.RichEdit.Lines);
- k1 := NoIndepVars; { store temporarily }
- NoIndepVars := NoVars; { this stops loop }
- end;
- end; { while not done }
- OutputFrm.ShowModal;
+ if MeansChkBox.Checked = true then
+ begin
+ title := 'Means';
+ DynVectorPrint(Means, NoVars, title, ColLabels, NCases, lReport);
+ lReport.Add('');
+ end;
- NoIndepVars := k1;
- { add [predicted scores, residual scores, etc. to grid if options elected }
- if MatInChkBox.Checked = true then PredictChkBox.Checked := false;
- if PredictChkBox.Checked = true then
- Predict(ColNoSelected, NoVars, IndepInverse, Means, StdDevs,
- BetaWeights, StdErrEst, IndepIndex, NoIndepVars);
+ if VarChkBox.Checked then
+ begin
+ title := 'Variances';
+ DynVectorPrint(Variances, NoVars, title, ColLabels, NCases, lReport);
+ lReport.Add('');
+ end;
-CleanUp:
- ColNoSelected := nil;
- Candidate := nil;
- Partial := nil;
- BetaWeights := nil;
- IndColLabels := nil;
- IndRowLabels := nil;
- IndepIndex := nil;
- XYCorrs := nil;
- ColLabels := nil;
- RowLabels := nil;
- StdDevs := nil;
- Variances := nil;
- Means := nil;
- IndepInverse := nil;
- IndepCorrs := nil;
- corrs := nil;
+ if SDChkBox.Checked = true then
+ begin
+ title := 'Standard Deviations';
+ DynVectorPrint(StdDevs, NoVars, title, ColLabels, NCases, lReport);
+ lReport.Add('');
+ end;
+
+ if errorcode then
+ begin
+ lReport.Add('One or more correlations could not be computed due to zero variance of a variable.');
+ DisplayReport(lReport);
+ MessageDlg('A selected variable has no variability-run aborted.', mtError, [mbOk], 0);
+ exit;
+ end;
+
+ lReport.Add('');
+ lReport.Add('=====================================================================');
+ lReport.Add('');
+
+ lReport.Add('STEPWISE MULTIPLE REGRESSION by Bill Miller');
+
+ { Select largest correlation to begin. Note: dependent is last variable }
+ largest := 0.0;
+ Index := 1;
+ for i := 1 to NoVars - 1 do
+ begin
+ if abs(corrs[i-1,NoVars-1]) > largest then
+ begin
+ largest := abs(corrs[i-1,NoVars-1]);
+ Index := i;
+ end;
+ end;
+ NoIndepVars := 1;
+ IndepIndex[NoIndepVars-1] := Index;
+ POut := StrToFloat(OutProb.Text);
+ lReport.Add('');
+ lReport.Add('----------------- STEP %d ------------------', [StepNo]);
+ MReg2(NCases, NoVars, NoIndepVars, IndepIndex, corrs, IndepInverse,
+ RowLabels, R2, BetaWeights,
+ Means, Variances, errcnt, StdErrEst, constant, POut, true, true, false,
+ lReport);
+
+ lReport.Add('');
+ lReport.Add('=====================================================================');
+ lReport.Add('');
+
+ while NoIndepVars < NoVars-1 do
+ begin
+ { select the next independent variable based on the largest
+ semipartial correlation with the dependent variable. The
+ squared semipartial for each remaining independent variable
+ is the difference between the squared MC of the dependent
+ variable with all previously entered variables plus a candidate
+ variable and the squared MC with just the previously entered
+ variables ( the previously obtained R2 ). }
+
+ { build list of candidates }
+ StepNo := StepNo + 1;
+ k := 0;
+ for i := 1 to NoVars - 1 do
+ begin
+ matched := false;
+ for j := 0 to NoIndepVars-1 do
+ if IndepIndex[j] = i then matched := true;
+ if not matched then
+ begin
+ k := k + 1;
+ Candidate[k-1] := i;
+ end;
+ end; { k is the no. of candidates }
+
+ lReport.Add('');
+ lReport.Add('Candidates for entry in next step:');
+ lReport.Add('');
+ lReport.Add('Candidate Partial F Statistic Prob. DF1 DF2');
+
+ LargestProb := 0.0;
+ SmallestProb := 1.0;
+ for k1 := 1 to k do
+ begin
+ { get Mult Corr. with previously entered plus candidate }
+ IndepIndex[NoIndepVars] := Candidate[k1-1];
+ TempNoVars := NoIndepVars + 1;
+ MReg2(NCases, NoVars, TempNoVars, IndepIndex, corrs, IndepInverse,
+ RowLabels, NewR2, BetaWeights, Means, Variances,
+ errcnt, StdErrEst, constant, POut, false, false,false, lReport);
+ Partial[k1-1] := (NewR2 - R2) / (1.0 - R2);
+ pdf1 := 1;
+ pdf2 := NCases - TempNoVars - 1;
+ PartF := ((NewR2 - R2) * pdf2) / (1.0 - NewR2);
+ PartProb := probf(PartF, pdf1, pdf2);
+ if PartProb < SmallestProb then SmallestProb := PartProb;
+ if PartProb > LargestProb then LargestProb := PartProb;
+ lReport.Add('%-10s %6.4f %7.4f %6.4f %3.0f %3.0f', [
+ RowLabels[Candidate[k1-1]-1],
+ sqrt(abs(Partial[k1-1])),
+ PartF, PartProb, pdf1, pdf2
+ ]);
+ end;
+
+ if (SmallestProb > StrToFloat(InProb.Text)) then
+ begin
+ lReport.Add('No further steps meet criterion for entry.');
+ goto lastone;
+ end;
+
+ { select variable with largest partial to enter next }
+ largestpartial := 0.0;
+ Index := 1;
+ for i := 1 to k do
+ begin
+ if Partial[i-1] > LargestPartial then
+ begin
+ Index := Candidate[i-1];
+ LargestPartial := Partial[i-1];
+ end;
+ end;
+
+ lReport.Add('Variable %s will be added', [RowLabels[Index-1]]);
+ NoIndepVars := NoIndepVars + 1;
+ IndepIndex[NoIndepVars-1] := Index;
+ lReport.Add('');
+ lReport.Add('----------------- STEP %d ------------------', [StepNo]);
+ MReg2(NCases, NoVars, NoIndepVars, IndepIndex, corrs, IndepInverse,
+ RowLabels, R2, BetaWeights, Means, Variances,
+ errcnt, StdErrEst, constant, POut, true, true, false, lReport);
+
+ if (errcnt > 0) or (NoIndepVars = NoVars-1) then { out tolerance exceeded - finish up }
+lastone:
+ begin
+ lReport.Add('');
+ lReport.Add('-------------FINAL STEP-----------');
+ MReg2(NCases, NoVars, NoIndepVars, IndepIndex, corrs, IndepInverse,
+ RowLabels, NewR2, BetaWeights, Means, Variances,
+ errcnt, StdErrEst, constant, POut, true, false, false, lReport);
+ k1 := NoIndepVars; { store temporarily }
+ NoIndepVars := NoVars; { this stops loop }
+ end;
+ end; { while not done }
+
+ lReport.Add('');
+ lReport.Add('=====================================================================');
+ lReport.Add('');
+
+ NoIndepVars := k1;
+ { add [predicted scores, residual scores, etc. to grid if options elected }
+ if MatInChkBox.Checked then PredictChkBox.Checked := false;
+ if PredictChkBox.Checked then
+ Predict(ColNoSelected, NoVars, IndepInverse, Means, StdDevs, BetaWeights, StdErrEst, IndepIndex, NoIndepVars);
+
+ DisplayReport(lReport);
+
+ finally
+ lReport.Free;
+ ColNoSelected := nil;
+ Candidate := nil;
+ Partial := nil;
+ BetaWeights := nil;
+// IndColLabels := nil;
+// IndRowLabels := nil;
+ IndepIndex := nil;
+// XYCorrs := nil;
+ ColLabels := nil;
+ RowLabels := nil;
+ StdDevs := nil;
+ Variances := nil;
+ Means := nil;
+ IndepInverse := nil;
+// IndepCorrs := nil;
+ corrs := nil;
+ end;
end;
procedure TStepFwdFrm.DepInBtnClick(Sender: TObject);
-VAR index : integer;
+var
+ index: integer;
begin
- index := ListBox1.ItemIndex;
- DepVar.Text := ListBox1.Items.Strings[index];
- ListBox1.Items.Delete(index);
- DepOutBtn.Enabled := true;
- DepInBtn.Enabled := false;
+ index := VarList.ItemIndex;
+ if (index > -1) and (DepVar.Text = '') then
+ begin
+ DepVar.Text := VarList.Items[index];
+ VarList.Items.Delete(index);
+ end;
+ UpdateBtnStates;
end;
procedure TStepFwdFrm.DepOutBtnClick(Sender: TObject);
begin
- ListBox1.Items.Add(DepVar.Text);
- DepVar.Text := '';
- DepInBtn.Enabled := true;
+ if DepVar.Text <> '' then
+ begin
+ VarList.Items.Add(DepVar.Text);
+ DepVar.Text := '';
+ end;
+ UpdateBtnStates;
end;
procedure TStepFwdFrm.InBtnClick(Sender: TObject);
-VAR i, index : integer;
+var
+ i: integer;
begin
- index := VarList.Items.Count;
- i := 0;
- while i < index do
- begin
- if (VarList.Selected[i]) then
- begin
- ListBox1.Items.Add(VarList.Items.Strings[i]);
- VarList.Items.Delete(i);
- index := index - 1;
- i := 0;
- end
- else i := i + 1;
- end;
- OutBtn.Enabled := true;
+ 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
+ i := i + 1;
+ end;
+ UpdateBtnStates;
+end;
+
+procedure TStepFwdFrm.SelListSelectionChange(Sender: TObject; User: boolean);
+begin
+ UpdateBtnStates;
end;
procedure TStepFwdFrm.OutBtnClick(Sender: TObject);
-VAR index : integer;
+var
+ i: integer;
begin
- index := ListBox1.ItemIndex;
- VarList.Items.Add(ListBox1.Items.Strings[index]);
- ListBox1.Items.Delete(index);
- InBtn.Enabled := true;
+ 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 TStepFwdFrm.UpdateBtnStates;
+var
+ lSelected: Boolean;
+ i: Integer;
+begin
+ DepInBtn.Enabled := (VarList.ItemIndex > -1) and (DepVar.Text = '');
+ DepOutBtn.Enabled := (DepVar.Text <> '');
+
+ lSelected := false;
+ for i:=0 to VarList.Items.Count-1 do
+ if VarList.Selected[i] then
+ begin
+ lSelected := true;
+ break;
+ end;
+ InBtn.Enabled := lSelected;
+
+ lSelected := false;
+ for i := 0 to SelList.Items.Count-1 do
+ if SelList.Selected[i] then
+ begin
+ lSelected := true;
+ break;
+ end;
+ OutBtn.Enabled := lSelected;
+end;
+
+
initialization
{$I stepfwdmrunit.lrs}
diff --git a/applications/lazstats/source/units/dataprocs.pas b/applications/lazstats/source/units/dataprocs.pas
index 76809d19b..53a2a98b6 100644
--- a/applications/lazstats/source/units/dataprocs.pas
+++ b/applications/lazstats/source/units/dataprocs.pas
@@ -31,15 +31,9 @@ procedure OpenTabFile;
procedure SaveTabFile;
function ValidValue(row, col : integer) : boolean;
function IsFiltered(GridRow : integer) : boolean;
-procedure MATREAD(VAR a : DblDyneMat;
- VAR norows : integer;
- VAR nocols : integer;
- VAR means : DblDyneVec;
- VAR stddevs : DblDyneVec;
- VAR NCases : integer;
- VAR RowLabels : StrDyneVec;
- VAR ColLabels : StrDyneVec;
- filename : string);
+procedure MatRead(var a: DblDyneMat; out NoRows, NoCols: integer;
+ var Means, StdDevs: DblDyneVec; out NCases: integer;
+ var RowLabels, ColLabels: StrDyneVec; const filename: string);
procedure MATSAVE(VAR a : DblDyneMat;
norows : integer;
nocols : integer;
@@ -832,15 +826,12 @@ begin
end;
//-------------------------------------------------------------------
-procedure MATREAD(VAR a : DblDyneMat;
- VAR norows : integer;
- VAR nocols : integer;
- VAR means : DblDyneVec;
- VAR stddevs : DblDyneVec;
- VAR NCases : integer;
- VAR RowLabels : StrDyneVec;
- VAR ColLabels : StrDyneVec;
- filename : string);
+procedure MATREAD(var a: DblDyneMat;
+ out NoRows, NoCols: integer;
+ var means, stddevs: DblDyneVec;
+ out NCases: integer;
+ var RowLabels, ColLabels: StrDyneVec;
+ const filename: string);
var i, j : integer;
mat_file : TextFile;
begin
@@ -849,6 +840,11 @@ begin
readln(mat_file,norows);
readln(mat_file,nocols);
readln(mat_file,NCases);
+
+ // wp: Setlength missing here --> very critical !!!!
+ // I understand that the calling routine pre-allocates these arrays
+ // But there should be a check whehter Norows, etc do not go beyond array size.
+
for i := 1 to norows do readln(mat_file,RowLabels[i-1]);
for i := 1 to nocols do readln(mat_file,ColLabels[i-1]);
for i := 1 to nocols do readln(mat_file,means[i-1]);
@@ -897,7 +893,7 @@ begin
if FileExists(filename) then
begin
- fileext := ExtractFileExt(filename);
+ fileext := Uppercase(ExtractFileExt(filename));
OS3MainFrm.FileNameEdit.Text := filename;
OS3MainFrm.OpenDialog1.FileName := filename;
if fileext = '.CSV' then OpenCommaFile
@@ -906,7 +902,7 @@ begin
else if fileext = '.SSV' then OpenSpaceFile;
end
else begin
- ShowMessage('ERROR! ' + filename + ' not found');
+ MessageDlg(filename + ' not found.', mtError, [mbOK], 0);
exit;
end;
end;
diff --git a/applications/lazstats/source/units/matrixlib.pas b/applications/lazstats/source/units/matrixlib.pas
index 7c68cc139..15decced6 100644
--- a/applications/lazstats/source/units/matrixlib.pas
+++ b/applications/lazstats/source/units/matrixlib.pas
@@ -128,13 +128,13 @@ procedure MReg2(NCases : integer;
VAR corrs : DblDyneMat;
VAR IndepCorrs : DblDyneMat;
VAR RowLabels : StrDyneVec;
- VAR R2 : double;
+ out R2: double;
VAR BetaWeights : DblDyneVec;
VAR Means : DblDyneVec;
VAR Variances : DblDyneVec;
VAR errorcode : integer;
- VAR StdErrEst : double;
- VAR constant : double;
+ out StdErrEst: double;
+ out constant: double;
probout : double;
Printit : boolean;
TestOut : boolean;
@@ -1260,13 +1260,13 @@ procedure MReg2(NCases : integer;
VAR corrs : DblDyneMat;
VAR IndepCorrs : DblDyneMat;
VAR RowLabels : StrDyneVec;
- VAR R2 : double;
+ out R2: double;
VAR BetaWeights : DblDyneVec;
VAR Means : DblDyneVec;
VAR Variances : DblDyneVec;
VAR errorcode : integer;
- VAR StdErrEst : double;
- VAR constant : double;
+ out StdErrEst: double;
+ out constant: double;
probout : double;
Printit : boolean;
TestOut : boolean;