diff --git a/applications/lazstats/docs/HelpNDoc/LazStats.hnd b/applications/lazstats/docs/HelpNDoc/LazStats.hnd
index 27cfe6652..d248e186a 100644
Binary files a/applications/lazstats/docs/HelpNDoc/LazStats.hnd and b/applications/lazstats/docs/HelpNDoc/LazStats.hnd differ
diff --git a/applications/lazstats/docs/chm/LazStats.chm b/applications/lazstats/docs/chm/LazStats.chm
index 1559bd7c0..e5a2b78be 100644
Binary files a/applications/lazstats/docs/chm/LazStats.chm and b/applications/lazstats/docs/chm/LazStats.chm differ
diff --git a/applications/lazstats/source/LazStats.lpi b/applications/lazstats/source/LazStats.lpi
index 1caca9da7..cbc4f63d4 100644
--- a/applications/lazstats/source/LazStats.lpi
+++ b/applications/lazstats/source/LazStats.lpi
@@ -40,7 +40,7 @@
-
+
@@ -1382,6 +1382,11 @@
+
+
+
+
+
diff --git a/applications/lazstats/source/LazStats.lpr b/applications/lazstats/source/LazStats.lpr
index e995850f7..bc791a0f3 100644
--- a/applications/lazstats/source/LazStats.lpr
+++ b/applications/lazstats/source/LazStats.lpr
@@ -8,7 +8,7 @@ uses
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms,
- Globals, LicenseUnit, OptionsUnit, MainDM, MainUnit;
+ Globals, LicenseUnit, OptionsUnit, MainDM, MainUnit, utils;
{$R LazStats.res}
diff --git a/applications/lazstats/source/forms/analysis/multiple_regression/twoslsunit.lfm b/applications/lazstats/source/forms/analysis/multiple_regression/twoslsunit.lfm
index f41cb2200..883a48006 100644
--- a/applications/lazstats/source/forms/analysis/multiple_regression/twoslsunit.lfm
+++ b/applications/lazstats/source/forms/analysis/multiple_regression/twoslsunit.lfm
@@ -74,6 +74,7 @@ object TwoSLSFrm: TTwoSLSFrm
Constraints.MinHeight = 220
ItemHeight = 0
MultiSelect = True
+ OnSelectionChange = ExplanatorySelectionChange
TabOrder = 0
end
object DepIn: TBitBtn
@@ -168,6 +169,7 @@ object TwoSLSFrm: TTwoSLSFrm
BorderSpacing.Top = 4
Images = MainDataModule.ImageList
ImageIndex = 0
+ OnClick = InstOutClick
Spacing = 0
TabOrder = 8
end
@@ -188,6 +190,7 @@ object TwoSLSFrm: TTwoSLSFrm
BorderSpacing.Left = 8
BorderSpacing.Top = 2
BorderSpacing.Right = 8
+ ReadOnly = True
TabOrder = 3
Text = 'DepVarEdit'
end
@@ -210,6 +213,7 @@ object TwoSLSFrm: TTwoSLSFrm
BorderSpacing.Bottom = 24
ItemHeight = 0
MultiSelect = True
+ OnSelectionChange = ExplanatorySelectionChange
TabOrder = 6
end
object Instrumental: TListBox
@@ -230,6 +234,8 @@ object TwoSLSFrm: TTwoSLSFrm
BorderSpacing.Right = 8
BorderSpacing.Bottom = 8
ItemHeight = 0
+ MultiSelect = True
+ OnSelectionChange = ExplanatorySelectionChange
TabOrder = 9
end
object GroupBox1: TGroupBox
@@ -238,20 +244,20 @@ object TwoSLSFrm: TTwoSLSFrm
Left = 8
Height = 73
Top = 286
- Width = 308
+ Width = 316
Anchors = [akLeft, akBottom]
AutoSize = True
BorderSpacing.Left = 8
BorderSpacing.Bottom = 8
Caption = 'Options'
- ChildSizing.LeftRightSpacing = 12
+ ChildSizing.LeftRightSpacing = 16
ChildSizing.TopBottomSpacing = 6
ChildSizing.VerticalSpacing = 2
ClientHeight = 53
- ClientWidth = 304
+ ClientWidth = 312
TabOrder = 10
object ProxyRegShowChk: TCheckBox
- Left = 12
+ Left = 16
Height = 19
Top = 6
Width = 273
@@ -259,7 +265,7 @@ object TwoSLSFrm: TTwoSLSFrm
TabOrder = 0
end
object SaveItChk: TCheckBox
- Left = 12
+ Left = 16
Height = 19
Top = 28
Width = 280
@@ -268,84 +274,66 @@ object TwoSLSFrm: TTwoSLSFrm
end
end
object ResetBtn: TButton
- AnchorSideRight.Control = CancelBtn
+ AnchorSideRight.Control = ComputeBtn
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
- Left = 114
+ Left = 202
Height = 25
Top = 383
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 = 12
end
- object CancelBtn: TButton
- AnchorSideRight.Control = ComputeBtn
- AnchorSideBottom.Control = Owner
- AnchorSideBottom.Side = asrBottom
- Left = 180
- Height = 25
- Top = 383
- Width = 62
- Anchors = [akRight, akBottom]
- AutoSize = True
- BorderSpacing.Left = 12
- BorderSpacing.Top = 8
- BorderSpacing.Right = 12
- BorderSpacing.Bottom = 8
- Caption = 'Cancel'
- ModalResult = 2
- TabOrder = 13
- end
object ComputeBtn: TButton
- AnchorSideRight.Control = ReturnBtn
+ AnchorSideRight.Control = CloseBtn
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
- Left = 254
+ Left = 264
Height = 25
Top = 383
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 = 14
+ TabOrder = 13
end
- object ReturnBtn: TButton
+ object CloseBtn: TButton
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
- Left = 342
+ Left = 348
Height = 25
Top = 383
- Width = 61
+ Width = 55
Anchors = [akRight, akBottom]
AutoSize = True
- BorderSpacing.Left = 12
+ BorderSpacing.Left = 8
BorderSpacing.Top = 8
BorderSpacing.Right = 12
BorderSpacing.Bottom = 8
- Caption = 'Return'
- ModalResult = 1
- TabOrder = 15
+ Caption = 'Close'
+ ModalResult = 11
+ TabOrder = 14
end
object HelpBtn: TButton
Tag = 153
AnchorSideRight.Control = ResetBtn
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
- Left = 51
+ Left = 143
Height = 25
Top = 383
Width = 51
@@ -353,7 +341,7 @@ object TwoSLSFrm: TTwoSLSFrm
AutoSize = True
BorderSpacing.Left = 12
BorderSpacing.Top = 8
- BorderSpacing.Right = 12
+ BorderSpacing.Right = 8
BorderSpacing.Bottom = 8
Caption = 'Help'
OnClick = HelpBtnClick
@@ -363,7 +351,7 @@ object TwoSLSFrm: TTwoSLSFrm
AnchorSideLeft.Control = Owner
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
- AnchorSideBottom.Control = ReturnBtn
+ AnchorSideBottom.Control = CloseBtn
Left = 0
Height = 8
Top = 367
diff --git a/applications/lazstats/source/forms/analysis/multiple_regression/twoslsunit.pas b/applications/lazstats/source/forms/analysis/multiple_regression/twoslsunit.pas
index 896693b0e..c305af11a 100644
--- a/applications/lazstats/source/forms/analysis/multiple_regression/twoslsunit.pas
+++ b/applications/lazstats/source/forms/analysis/multiple_regression/twoslsunit.pas
@@ -1,3 +1,8 @@
+// File for testing: "cansas.laz"
+// - dependent variable: jumpgs
+// - exolanatory variables: pulse, chins, situps
+// - instrumental variables: pulse, chins, situps, weight, waist
+
unit TwoSLSUnit;
{$mode objfpc}{$H+}
@@ -18,9 +23,8 @@ type
Bevel2: TBevel;
HelpBtn: TButton;
ResetBtn: TButton;
- CancelBtn: TButton;
ComputeBtn: TButton;
- ReturnBtn: TButton;
+ CloseBtn: TButton;
ProxyRegShowChk: TCheckBox;
SaveItChk: TCheckBox;
DepIn: TBitBtn;
@@ -42,20 +46,23 @@ type
procedure DepInClick(Sender: TObject);
procedure DepOutClick(Sender: TObject);
procedure ExpInClick(Sender: TObject);
+ procedure ExplanatorySelectionChange(Sender: TObject; User: boolean);
procedure ExpOutClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure HelpBtnClick(Sender: TObject);
procedure InstInClick(Sender: TObject);
+ procedure InstOutClick(Sender: TObject);
procedure ResetBtnClick(Sender: TObject);
- procedure PredictIt(ColNoSelected : IntDyneVec; NoVars : integer;
+ procedure PredictIt(const ColNoSelected: IntDyneVec; NoVars: integer;
Means, StdDevs, BetaWeights : DblDyneVec;
StdErrEst : double; NoIndepVars : integer);
private
{ private declarations }
FAutoSized: boolean;
+ procedure UpdateBtnStates;
public
{ public declarations }
@@ -66,24 +73,23 @@ var
implementation
+uses
+ StrUtils, Utils;
+
{ TTwoSLSFrm }
procedure TTwoSLSFrm.ResetBtnClick(Sender: TObject);
-VAR i : integer;
+var
+ i: integer;
begin
- VarList.Clear;
- Explanatory.Clear;
- Instrumental.Clear;
- DepVarEdit.Text := '';
- ProxyRegShowChk.Checked := false;
- DepIn.Enabled := true;
- DepOut.Enabled := false;
- ExpIn.Enabled := true;
- ExpOut.Enabled := false;
- InstIn.Enabled := true;
- InstOut.Enabled := false;
- for i := 1 to NoVariables do
- VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]);
+ VarList.Clear;
+ Explanatory.Clear;
+ Instrumental.Clear;
+ DepVarEdit.Text := '';
+ ProxyRegShowChk.Checked := false;
+ for i := 1 to NoVariables do
+ VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]);
+ UpdateBtnStates;
end;
procedure TTwoSLSFrm.FormActivate(Sender: TObject);
@@ -93,12 +99,11 @@ begin
if FAutoSized then
exit;
- w := MaxValue([HelpBtn.Width, ResetBtn.Width, CancelBtn.Width, ComputeBtn.Width, ReturnBtn.Width]);
+ w := MaxValue([HelpBtn.Width, ResetBtn.Width, ComputeBtn.Width, CloseBtn.Width]);
HelpBtn.Constraints.MinWidth := w;
ResetBtn.Constraints.MinWidth := w;
- CancelBtn.Constraints.MinWidth := w;
ComputeBtn.Constraints.MinWidth := w;
- ReturnBtn.Constraints.MinWidth := w;
+ CloseBtn.Constraints.MinWidth := w;
Constraints.MinWidth := Width;
Constraints.MinHeight := Height;
@@ -109,7 +114,6 @@ end;
procedure TTwoSLSFrm.FormCreate(Sender: TObject);
begin
Assert(OS3MainFrm <> nil);
- if OutputFrm = nil then Application.CreateForm(TOutputFrm, OutputFrm);
if DictionaryFrm = nil then Application.CreateForm(TDictionaryFrm, DictionaryFrm);
end;
@@ -126,64 +130,89 @@ begin
end;
procedure TTwoSLSFrm.InstInClick(Sender: TObject);
-VAR i : integer;
+var
+ i: integer;
begin
- if (VarList.Items.Count < 1) then exit;
- i := 0;
- while (i < VarList.Items.Count) do
- begin
- if (VarList.Selected[i]) then
- begin
- Instrumental.Items.Add(VarList.Items.Strings[i]);
- end;
- i := i + 1;
- end;
- InstOut.Enabled := true;
- if (VarList.Items.Count < 1) then InstIn.Enabled := false;
+ i := 0;
+ while (i < VarList.Items.Count) do
+ begin
+ if VarList.Selected[i] and (Instrumental.Items.IndexOf(VarList.Items[i]) = -1) then
+ Instrumental.Items.Add(VarList.Items[i])
+ // DO NOT DELETE Items HERE.
+ else
+ i := i + 1;
+ end;
+ UpdateBtnStates;
end;
-procedure TTwoSLSFrm.DepInClick(Sender: TObject);
-VAR index : integer;
+procedure TTwoSLSFrm.InstOutClick(Sender: TObject);
+var
+ i: Integer;
begin
- if (VarList.Items.Count < 1) then exit;
- index := VarList.ItemIndex;
- DepVarEdit.Text := VarList.Items.Strings[index];
- VarList.Items.Delete(index);
- DepOut.Enabled := true;
- DepIn.Enabled := false;
+ i := 0;
+ while (i < Instrumental.Items.Count) do
+ begin
+ if Instrumental.Selected[i] then
+ begin
+ if VarList.Items.IndexOf(Instrumental.Items[i]) = -1 then
+ VarList.Items.Add(Instrumental.Items[i]);
+ Instrumental.Items.Delete(i);
+ i := 0;
+ end else
+ i := i + 1;
+ end;
+ UpdateBtnStates;
end;
procedure TTwoSLSFrm.ComputeBtnClick(Sender: TObject);
-label cleanup;
-VAR
+var
i, j, k, DepCol, NoInst, NoExp, NoProx, Noindep : integer;
IndepCols, ProxSrcCols, ExpCols, InstCols, ProxCols : IntDyneVec;
DepProx, NCases, col, counter : integer;
ExpLabels, InstLabels, ProxLabels, RowLabels, ProxSrcLabels : StrDyneVec;
- outstr : string;
- R2, stderrest, X, Y : double;
+ X, Y : double;
Means, Variances, StdDevs, BWeights : DblDyneVec;
BetaWeights, BStdErrs, Bttests, tprobs : DblDyneVec;
- ProxVals : DblDyneMat;
- errorcode, PrintDesc, PrintCorrs, PrintInverse, PrintCoefs, SaveCorrs : boolean;
+// ProxVals : DblDyneMat;
+ PrintDesc: Boolean;
+// PrintCorrs, PrintInverse, PrintCoefs, SaveCorrs : boolean;
found : boolean;
-
+ lReport: TStrings;
+ errorcode: Boolean = false;
+ R2: Double = 0.0;
+ stdErrEst: Double = 0.0;
begin
+ if DepVarEdit.Text = '' then
+ begin
+ MessageDlg('Dependent variable not selected.', mtError, [mbOK], 0);
+ exit;
+ end;
+ if Explanatory.Items.Count = 0 then
+ begin
+ MessageDlg('No explanatory variables selected.', mtError, [mbOK], 0);
+ exit;
+ end;
+ if Instrumental.Items.Count = 0 then
+ begin
+ MessageDlg('No instrumental variables selected.', mtError, [mbOK], 0);
+ exit;
+ end;
+
if (ProxyRegShowChk.Checked) then
begin
PrintDesc := true;
- PrintCorrs := true;
- PrintInverse := false;
- PrintCoefs := true;
- SaveCorrs := false;
+// PrintCorrs := true;
+// PrintInverse := false;
+// PrintCoefs := true;
+// SaveCorrs := false;
end
else
begin
PrintDesc := false;
- PrintCorrs := false;
- PrintInverse := false;
- PrintCoefs := false;
- SaveCorrs := false;
+// PrintCorrs := false;
+// PrintInverse := false;
+// PrintCoefs := false;
+// SaveCorrs := false;
end;
SetLength(Means,NoVariables+2);
SetLength(Variances,NoVariables+2);
@@ -203,7 +232,7 @@ begin
SetLength(RowLabels,NoVariables);
SetLength(ProxSrcCols,NoVariables);
SetLength(ProxSrcLabels,NoVariables);
- SetLength(ProxVals,NoCases,NoVariables);
+// SetLength(ProxVals,NoCases,NoVariables);
// Get variables to analyze
NCases := NoCases;
@@ -211,9 +240,10 @@ begin
NoExp := Explanatory.Items.Count;
if (NoInst < NoExp) then
begin
- ShowMessage('The no. of Instrumental must equal or exceed the Explanatory');
- goto cleanup;
+ MessageDlg('The no. of Instrumental must equal or exceed the Explanatory', mtError, [mbOK], 0);
+ exit;
end;
+
for i := 0 to NoVariables - 1 do
begin
if (OS3MainFrm.DataGrid.Cells[i+1,0] = DepVarEdit.Text) then
@@ -260,22 +290,29 @@ begin
end;
end;
- // Output Parameters of the Analysis
- OutputFrm.RichEdit.Clear;
- OutputFrm.RichEdit.Lines.Add('FILE: ' + OS3MainFrm.FileNameEdit.Text);
- OutputFrm.RichEdit.Lines.Add('');
- OutputFrm.RichEdit.Lines.Add('Dependent := ' + DepVarEdit.Text);
- OutputFrm.RichEdit.Lines.Add('Explanatory Variables:');
- for i := 0 to NoExp - 1 do OutputFrm.RichEdit.Lines.Add(ExpLabels[i]);
- OutputFrm.RichEdit.Lines.Add('Instrumental Variables:');
- for i := 0 to NoInst - 1 do OutputFrm.RichEdit.Lines.Add(InstLabels[i]);
- OutputFrm.RichEdit.Lines.Add('Proxy Variables:');
- for i := 0 to NoProx - 1 do OutputFrm.RichEdit.Lines.Add(ProxLabels[i]);
- OutputFrm.RichEdit.Lines.Add('');
+ lReport := TStringList.Create;
+ try
+ // Output Parameters of the Analysis
+ lReport.Add('FILE: ' + OS3MainFrm.FileNameEdit.Text);
+ lReport.Add('');
+ lReport.Add('Dependent: ' + DepVarEdit.Text);
+ lReport.Add('');
+ lReport.Add('Explanatory Variables:');
+ for i := 0 to NoExp - 1 do
+ lReport.Add(' ' + ExpLabels[i]);
+ lReport.Add('');
+ lReport.Add('Instrumental Variables:');
+ for i := 0 to NoInst - 1 do
+ lReport.Add(' ' + InstLabels[i]);
+ lReport.Add('');
+ lReport.Add('Proxy Variables:');
+ for i := 0 to NoProx - 1 do
+ lReport.Add(' ' + ProxLabels[i]);
+ lReport.Add('');
- // Compute the prox regressions for the instrumental variables
- for i := 0 to NoProx - 1 do
- begin
+ // Compute the prox regressions for the instrumental variables
+ for i := 0 to NoProx - 1 do
+ begin
DictionaryFrm.DictGrid.ColCount := 8;
col := NoVariables + 1;
// NoVariables := col;
@@ -307,14 +344,23 @@ begin
end;
end;
IndepCols[Noindep] := DepProx;
- OutputFrm.RichEdit.Lines.Add('Analysis for ' + ProxLabels[i]);
- OutputFrm.RichEdit.Lines.Add('Dependent: ' + ProxSrcLabels[i]);
- OutputFrm.RichEdit.Lines.Add('Independent: ');
- for j := 0 to Noindep - 1 do OutputFrm.RichEdit.Lines.Add(RowLabels[j]);
+ lReport.Add('');
+ lReport.Add('==================================================================');
+ lReport.Add('');
+ lReport.Add('Analysis for ' + ProxLabels[i]);
+ lReport.Add('-------------' + DupeString('-', Length(ProxLabels[i])));
+ lReport.Add('Dependent: ' + ProxSrcLabels[i]);
+ lReport.Add('');
+ lReport.Add('Independent: ');
+ for j := 0 to Noindep - 1 do
+ lReport.Add(' ' + RowLabels[j]);
+ lReport.Add('');
+
// OutputFrm.ShowModal();
- mreg(Noindep, IndepCols, DepProx, RowLabels, Means, Variances, StdDevs,
+ MReg(Noindep, IndepCols, DepProx, RowLabels, Means, Variances, StdDevs,
BWeights, BetaWeights, BStdErrs, Bttests, tprobs, R2, stderrest,
- NCases, errorcode, PrintDesc);
+ NCases, errorcode, PrintDesc, lReport);
+
// save predicted scores at column := NoVariables and in ProxVals array
for j := 1 to NoCases do
begin
@@ -327,17 +373,20 @@ begin
end;
Y := Y + BWeights[Noindep]; // intercept
col := NoVariables;
- outstr := format('%12.5f',[Y]);
- OS3MainFrm.DataGrid.Cells[col,j] := outstr;
+ OS3MainFrm.DataGrid.Cells[col,j] := Format('%12.5f', [Y]);
end; // next case
- end; // next proxy
+ end; // next proxy
// OutputFrm.ShowModal();
- // Compute the OLS using the Prox values and explanatory
- Noindep := 0;
- counter := 0;
- for i := 0 to NoExp - 1 do
- begin
+ lReport.Add('');
+ lReport.Add('==================================================================');
+ lReport.Add('');
+
+ // Compute the OLS using the Prox values and explanatory
+ Noindep := 0;
+ counter := 0;
+ for i := 0 to NoExp - 1 do
+ begin
for j := 0 to NoInst - 1 do
begin
if (ExpLabels[i] = InstLabels[j]) then // use proxy
@@ -354,88 +403,115 @@ begin
end;
end;
Noindep := Noindep + 1;
- end;
- PrintDesc := true;
- PrintCorrs := true;
- PrintInverse := false;
- PrintCoefs := true;
- SaveCorrs := false;
- IndepCols[Noindep] := DepCol;
- mreg(Noindep, IndepCols, DepCol, RowLabels, Means, Variances, StdDevs,
+ end;
+ PrintDesc := true;
+// PrintCorrs := true;
+// PrintInverse := false;
+// PrintCoefs := true;
+// SaveCorrs := false;
+ IndepCols[Noindep] := DepCol;
+ MReg(Noindep, IndepCols, DepCol, RowLabels, Means, Variances, StdDevs,
BWeights, BetaWeights, BStdErrs, Bttests, tprobs, R2, stderrest,
- NCases, errorcode, PrintDesc);
- OutputFrm.ShowModal;
- if (SaveItChk.Checked) then
- begin
- PredictIt(IndepCols, Noindep+1, Means, StdDevs, BetaWeights, stderrest, Noindep);
- end;
+ NCases, errorcode, PrintDesc, lReport);
- // cleanup
-cleanup:
- ProxVals := nil;
- ProxSrcLabels := nil;
- ProxSrcCols := nil;
- RowLabels := nil;
- IndepCols := nil;
- ProxLabels := nil;
- ProxCols := nil;
- InstCols := nil;
- InstLabels := nil;
- ExpCols := nil;
- ExpLabels := nil;
- tprobs := nil;
- Bttests := nil;
- BStdErrs := nil;
- BetaWeights := nil;
- BWeights := nil;
- StdDevs := nil;
- Variances := nil;
- Means := nil;
+ DisplayReport(lReport);
+
+ if SaveItChk.Checked then
+ PredictIt(IndepCols, Noindep+1, Means, StdDevs, BetaWeights, stderrest, Noindep);
+
+ finally
+ lReport.Free;
+// ProxVals := nil;
+ ProxSrcLabels := nil;
+ ProxSrcCols := nil;
+ RowLabels := nil;
+ IndepCols := nil;
+ ProxLabels := nil;
+ ProxCols := nil;
+ InstCols := nil;
+ InstLabels := nil;
+ ExpCols := nil;
+ ExpLabels := nil;
+ tprobs := nil;
+ Bttests := nil;
+ BStdErrs := nil;
+ BetaWeights := nil;
+ BWeights := nil;
+ StdDevs := nil;
+ Variances := nil;
+ Means := nil;
+ end;
+end;
+
+procedure TTwoSLSFrm.DepInClick(Sender: TObject);
+var
+ index: integer;
+begin
+ index := VarList.ItemIndex;
+ if (index > -1) and (DepVarEdit.Text = '') then
+ begin
+ DepVarEdit.Text := VarList.Items[index];
+ VarList.Items.Delete(index);
+ end;
+ UpdateBtnStates;
end;
procedure TTwoSLSFrm.DepOutClick(Sender: TObject);
begin
- if (DepVarEdit.Text = '') then exit;
- VarList.Items.Add(DepVarEdit.Text);
- DepVarEdit.Text := '';
- DepIn.Enabled := true;
- DepOut.Enabled := false;
+ if DepVarEdit.Text <> '' then
+ begin
+ VarList.Items.Add(DepVarEdit.Text);
+ DepVarEdit.Text := '';
+ end;
+ UpdateBtnStates;
end;
procedure TTwoSLSFrm.ExpInClick(Sender: TObject);
-VAR i : integer;
+var
+ i: integer;
begin
- if (VarList.Items.Count < 1) then exit;
- i := 0;
- while (i < VarList.Items.Count) do
- begin
- if (VarList.Selected[i]) then
- begin
- Explanatory.Items.Add(VarList.Items.Strings[i]);
- end;
- i := i + 1;
- end;
- ExpOut.Enabled := true;
- if (VarList.Items.Count < 1) then ExpIn.Enabled := false;
+ i := 0;
+ while (i < VarList.Items.Count) do
+ begin
+ if VarList.Selected[i] and (Explanatory.Items.IndexOf(VarList.Items[i]) = -1) then
+ Explanatory.Items.Add(VarList.Items[i]);
+ // DO NOT DELETE Items HERE.
+ i := i + 1;
+ end;
+ UpdateBtnStates;
+end;
+
+procedure TTwoSLSFrm.ExplanatorySelectionChange(Sender: TObject; User: boolean);
+begin
+ UpdateBtnStates;
end;
procedure TTwoSLSFrm.ExpOutClick(Sender: TObject);
-VAR index : integer;
+var
+ i: Integer;
begin
- index := Explanatory.ItemIndex;
- Explanatory.Items.Delete(index);
- ExpIn.Enabled := true;
- if (Explanatory.Items.Count < 1) then ExpOut.Enabled := false;
+ i := 0;
+ while (i < Explanatory.Items.Count) do
+ begin
+ if Explanatory.Selected[i] then
+ begin
+ if (VarList.Items.IndexOf(Explanatory.Items[i]) = -1) then
+ VarList.Items.Add(Explanatory.Items[i]);
+ Explanatory.Items.Delete(i);
+ i := 0;
+ end else
+ i := i + 1;
+ end;
+ UpdateBtnStates;
end;
-procedure TTwoSLSFrm.PredictIt(ColNoSelected : IntDyneVec; NoVars : integer;
- Means, StdDevs, BetaWeights : DblDyneVec;
- StdErrEst : double; NoIndepVars : integer);
-VAR
- col, i, j, k, Index: integer;
- predicted, zpredicted, z1, z2, resid, residsqr : double;
- astring : string;
-
+procedure TTwoSLSFrm.PredictIt(const ColNoSelected: IntDyneVec; NoVars: integer;
+ Means, StdDevs, BetaWeights: DblDyneVec;
+ StdErrEst: double; NoIndepVars: integer);
+var
+ col, i, j, k, Index: integer;
+ predicted, zpredicted, z1, z2, resid, residsqr: double;
+ astring: string;
begin
// routine obtains predicted raw and standardized scores and their
// residuals. It is assumed that the dependent variable is last in the
@@ -520,6 +596,20 @@ begin
end;
end;
+procedure TTwoSLSFrm.UpdateBtnStates;
+var
+ lSelected: Boolean;
+begin
+ lSelected := AnySelected(VarList);
+ DepIn.Enabled := lSelected and (DepVarEdit.Text = '');
+ ExpIn.Enabled := lSelected;
+ InstIn.Enabled := lSelected;
+
+ DepOut.Enabled := (DepVarEdit.Text <> '');
+ ExpOut.Enabled := AnySelected(Explanatory);
+ InstOut.Enabled := AnySelected(Instrumental);
+end;
+
initialization
{$I twoslsunit.lrs}