From bc4f786194bcede49651db92818b5841ecb29d8c Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Fri, 3 Apr 2020 14:43:33 +0000 Subject: [PATCH] StepFwdMRUnit, BackRegUnit: like the others. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7352 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../lazstats/docs/HelpNDoc/LazStats.hnd | Bin 5083136 -> 5156864 bytes .../multiple_regression/backregunit.lfm | 197 ++++----- .../multiple_regression/backregunit.pas | 388 ++++++++++-------- .../multiple_regression/stepfwdmrunit.lfm | 19 +- .../multiple_regression/stepfwdmrunit.pas | 1 - .../lazstats/source/units/matrixlib.pas | 145 ++++--- 6 files changed, 416 insertions(+), 334 deletions(-) diff --git a/applications/lazstats/docs/HelpNDoc/LazStats.hnd b/applications/lazstats/docs/HelpNDoc/LazStats.hnd index 8a485c1411e8e4ea3cd46c27aadf6f871e8ffdc9..d1f002aaef1b80d550b0f91cd548285537718bac 100644 GIT binary patch delta 40654 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 delta 1549 zcmYM!eNa?Y6aesd@4N54WqJD+L=;eA*B0VqSKcb0E{h8YE39uDn#r&aglxtfCh=?h zo&+n_l7v~{ZWDr*u~p=B*Kq5;-bf&`pTRlBQZK!<_tOV z6+Z=M?~?Q>3b{y1`0sfqK7+H-@phMf1A+(t;?0na^&0zUrz%GK0$9(4(g2n#e|4a9 zTnu-ZBSWN$A2GgdBuc#!!W}j=$PeY!q4$s@bcudMzcyqnq)PXXu38$FUJ-+0xiBo0 zK~7MvhU(D}189S?3+@Ny0_Yu-weddk2*+UyXn*02G`Opv1;NOWJRe~?`-bSn>a<;D3T-Q3iuJwtIRtpJ3Wgv7}njz3-iNSb)p6Ie{kT8ye z;O7n#U2xWN2|?JfEKq7Z&g)U**08=1C@zNurhelJ|R&7lhH|ZIi@Od8@dG-z*C9V)441 zD@RK=ke?nLO>UDgFM#o3l8J7-pZq0;Be|XgV0Fa%YR8h96k0oGeLam&LmeQgHcx_- zCf*SbiIrlEa8cMU%o8vV&dg+HF=inb=KR6RXGuLE1)Xt_7<4`j zdDJn9ZVx)6CFoE0Cir@WolGt>hjB4^Og>XUdxqy`9^%>fgVYs0jbu92P0%pYW`c7A z&SKhN^|m0Iv7@kCIC#T@>Y5Adnu|J`-6Ru5fzazVLt?LcEq%Y&y-gHQ6>AIBuPtWq zUUqj&`W4*z@yPPOlg)5+y=sC+gl!}(ll$1`?{hQrsK2jxl@FzZP*L(K4tbugt|*y` zPzm@4a62t}spRx2naIPOF-O^K0C|`ltIKj!t!>$4O+z{xyK)?-<4_9HA;T;VZd*P1 z2t%sPlm7pOdDrGyhzR^?^DKUROlZvv&l@N nil); - if OutputFrm = nil then Application.CreateForm(TOutputFrm, OutputFrm); end; procedure TBackRegFrm.FormShow(Sender: TObject); @@ -129,14 +129,13 @@ begin end; procedure TBackRegFrm.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.Strings[index]); + VarList.Clear; + UpdateBtnStates; end; procedure TBackRegFrm.CancelBtnClick(Sender: TObject); @@ -145,8 +144,7 @@ begin end; procedure TBackRegFrm.ComputeBtnClick(Sender: TObject); -Label CleanUp; -VAR +var NoVars, NoIndepVars, i, j, NCases, StepNo : integer; Index: integer; R2, determinant, stderrest, POut, LowestPartial : double; @@ -168,6 +166,7 @@ VAR BetaWeights : DblDyneVec; IndepIndex : IntDyneVec; constant : double; + lReport: TStrings; begin if NoVariables = 0 then NoVariables := 200; SetLength(Corrs,NoVariables+1,NoVariables+1); @@ -183,44 +182,46 @@ begin SetLength(IndepIndex,NoVariables); SetLength(ColNoSelected,NoVariables); - OutputFrm.RichEdit.Clear; -// OutputFrm.RichEdit.ParaGraph.Alignment := taLeftJustify; - OutputFrm.RichEdit.Lines.Add('Step Backward Multiple Regression by Bill Miller'); - errcode := false; - errorcode := 0; - if MatInChkBox.Checked = true then - begin - OpenDialog1.Filter := 'FreeStat matrix files (*.MAT)|*.MAT|All files (*.*)|*.*'; + lReport := TStringList.Create; + try + lReport.Add('STEP BACKWARD MULTIPLE REGRESSION by Bill Miller'); + errcode := false; + errorcode := 0; + + 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); + 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]); + for i := 0 to NoVars-2 do SelList.Items.Add(RowLabels[i]); CPChkBox.Checked := false; CovChkBox.Checked := false; MatSaveChkBox.Checked := false; - ShowMessage('NOTICE! Last variable in matrix is the dependent variable'); + MessageDlg('Last variable in matrix is the dependent variable.', mtInformation, [mbOK], 0); end; - end; - if MatInChkBox.Checked = false then - begin + end; + + if not MatInChkBox.Checked then + begin { get variable columns } - NoVars := ListBox1.Items.Count; + NoVars := SelList.Items.Count; if NoVars < 1 then begin - ShowMessage('ERROR! No variables selected.'); - goto CleanUp; + MessageDlg('No variables selected.', mtError, [mbOK], 0); + exit; end; for i := 1 to NoVars do begin - cellstring := ListBox1.Items.Strings[i-1]; + cellstring := SelList.Items[i-1]; for j := 1 to NoVariables do begin if cellstring = OS3MainFrm.DataGrid.Cells[j,0] then @@ -234,8 +235,8 @@ begin { get dependendent variable column } if DepVar.Text = '' then begin - ShowMessage('ERROR! No Dependent variable selected.'); - goto CleanUp; + MessageDlg('No Dependent variable selected.', mtError, [mbOK], 0); + exit; end; NoVars := NoVars + 1; for j := 1 to NoVariables do @@ -247,59 +248,65 @@ begin ColLabels[NoVars-1] := DepVar.Text; end; end; - end; - POut := 1.0; - StepNo := 1; - while NoVars > 1 do - begin - OutputFrm.RichEdit.Lines.Add(''); - outline := format('----------------- STEP %3d ------------------',[StepNo]); - OutputFrm.RichEdit.Lines.Add(outline); - if CPChkBox.Checked = true then + end; + + POut := 1.0; + StepNo := 1; + while NoVars > 1 do + begin + if StepNo > 1 then + lReport.Add(''); + lReport.Add(''); + lReport.Add('----------------- STEP %3d ------------------', [StepNo]); + if CPChkBox.Checked then begin title := 'Cross-Products Matrix'; - GridXProd(NoVars,ColNoSelected,Corrs,errcode,NCases); - MAT_PRINT(Corrs,NoVars,NoVars,title,RowLabels,ColLabels,NCases); + GridXProd(NoVars, ColNoSelected, Corrs, errcode, NCases); + MatPrint(Corrs, NoVars, NoVars, title, RowLabels, ColLabels, NCases, lReport); end; - if CovChkBox.Checked = true then + if CovChkBox.Checked then begin title := 'Variance-Covariance Matrix'; - GridCovar(NoVars,ColNoSelected,Corrs,Means,Variances, - StdDevs,errcode,NCases); - MAT_PRINT(Corrs,NoVars,NoVars,title,RowLabels,ColLabels,NCases); + GridCovar(NoVars, ColNoSelected, Corrs, Means, Variances, StdDevs, errcode, NCases); + MatPrint(Corrs, NoVars, NoVars, title, RowLabels, ColLabels, NCases, lReport); end; - if MatInChkBox.Checked = false then - Correlations(NoVars,ColNoSelected,Corrs,Means,Variances, - StdDevs,errcode,NCases); - if CorrsChkBox.Checked = true then + if not MatInChkBox.Checked then + Correlations(NoVars, ColNoSelected, Corrs, Means, Variances, StdDevs, errcode, NCases); + if CorrsChkBox.Checked then begin title := 'Product-Moment Correlations Matrix'; - MAT_PRINT(Corrs,NoVars,NoVars,title,RowLabels,ColLabels,NCases); + MatPrint(Corrs, NoVars, NoVars, title, RowLabels, ColLabels, NCases, lReport); end; - if MatSaveChkBox.Checked = true then + if MatSaveChkBox.Checked then begin - SaveDialog1.Filter := 'FreeStat matrix files (*.MAT)|*.MAT|All files (*.*)|*.*'; + 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); + MatSave(Corrs, NoVars, NoVars, Means, StdDevs, NCases, RowLabels, ColLabels, filename); end; MatSaveChkBox.Checked := false; // only save first one 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 MeansChkBox.Checked then + begin + title := 'Means'; + DynVectorPrint(Means, NoVars, title, ColLabels, NCases, lReport); + end; + if VarChkBox.Checked then + begin + title := 'Variances'; + DynVectorPrint(Variances, NoVars, title, ColLabels, NCases, lReport); + end; + if SDChkBox.Checked then + begin + title := 'Standard Deviations'; + DynVectorPrint(StdDevs, NoVars, title, ColLabels, NCases, lReport); + end; if errorcode > 0 then begin - ShowMessage('ERROR! A selected variable has no variability-run aborted.'); - goto CleanUp; + MessageDlg('A selected variable has no variability-run aborted.', mtError, [mbOK], 0); + exit; end; { get determinant of the correlation matrix } @@ -307,56 +314,55 @@ begin for i := 1 to NoVars do for j := 1 to NoVars do CorrMat[i-1,j-1] := Corrs[i-1,j-1]; - Determ(CorrMat,NoVars,NoVars,determinant,errcode); + Determ(CorrMat, NoVars, NoVars, determinant, errcode); if (determinant < 0.000001) then begin - ShowMessage('ERROR! Matrix is singular!'); + MessageDlg('Matrix is singular!', mtError,[mbOK], 0); // goto cleanup; end; - outline := format('Determinant of correlation matrix = %8.4f',[determinant]); - OutputFrm.RichEdit.Lines.Add(outline); - OutputFrm.RichEdit.Lines.Add(''); - NoIndepVars := NoVars-1; + lReport.Add('Determinant of correlation matrix = %8.4f', [determinant]); + lReport.Add(''); + + NoIndepVars := NoVars-1; for i := 1 to NoIndepVars do IndepIndex[i-1] := i; MReg2(NCases,NoVars,NoIndepVars,IndepIndex,corrs,InverseMat, RowLabels,R2,BetaWeights, - Means,Variances,errorcode,StdErrEst,constant,POut,true, false,false, OutputFrm.RichEdit.Lines); - // Get partial correlation matrix - for i := 1 to NoVars do + Means,Variances,errorcode,StdErrEst,constant,POut,true, false,false, lReport); + + // Get partial correlation matrix + for i := 1 to NoVars do for j := 1 to NoVars do InverseMat[i-1,j-1] := Corrs[i-1,j-1]; - SVDinverse(InverseMat,NoVars); - for i := 1 to NoVars do - begin + SVDinverse(InverseMat, NoVars); + for i := 1 to NoVars do + begin for j := 1 to NoVars do begin ProdMat[i-1,j-1] := -(1.0 / sqrt(InverseMat[i-1,i-1])) * InverseMat[i-1,j-1] * (1.0 / sqrt(InverseMat[j-1,j-1])); end; - end; - LowestPartial := 1.0; - Index := NoIndepVars; - for i := 1 to NoIndepVars do - begin + end; + LowestPartial := 1.0; + Index := NoIndepVars; + for i := 1 to NoIndepVars do + begin BetaWeights[i-1] := ProdMat[i-1,NoVars-1]; if abs(BetaWeights[i-1]) < LowestPartial then begin LowestPartial := abs(BetaWeights[i-1]); Index := i; end; - end; - if PartialsChkBox.Checked = true then - begin + end; + if PartialsChkBox.Checked then + begin title := 'Partial Correlations'; - DynVectorPrint(BetaWeights,NoIndepVars,title,ColLabels,NCases); - end; - OutputFrm.ShowModal; + DynVectorPrint(BetaWeights, NoIndepVars, title, ColLabels, NCases, lReport); + end; - { eliminate variable with lowest partial } - if NoVars > 2 then - begin - outline := format('Variable %d (%s) eliminated',[Index,ColLabels[Index-1]]); - OutputFrm.RichEdit.Lines.Add(outline); + { eliminate variable with lowest partial } + if NoVars > 2 then + begin + lReport.Add('Variable %d (%s) eliminated', [Index, ColLabels[Index-1]]); for i := Index to NoVars-1 do begin ColNoSelected[i-1] := ColNoSelected[i]; @@ -366,71 +372,119 @@ begin NoVars := NoVars - 1; StepNo := StepNo + 1; end - else NoVars := 0; - end; - OutputFrm.ShowModal; + else + NoVars := 0; + end; -CleanUp: - ColNoSelected := nil; - IndepIndex := nil; - BetaWeights := nil; - CorrMat := nil; - ProdMat := nil; - InverseMat := nil; - ColLabels := nil; - RowLabels := nil; - StdDevs := nil; - Variances := nil; - Means := nil; - Corrs := nil; - Close; + DisplayReport(lReport); + + finally + lReport.Free; + + ColNoSelected := nil; + IndepIndex := nil; + BetaWeights := nil; + CorrMat := nil; + ProdMat := nil; + InverseMat := nil; + ColLabels := nil; + RowLabels := nil; + StdDevs := nil; + Variances := nil; + Means := nil; + Corrs := nil; + end; end; procedure TBackRegFrm.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 TBackRegFrm.DepOutBtnClick(Sender: TObject); begin - ListBox1.Items.Add(DepVar.Text); - DepVar.Text := ''; - DepInBtn.Enabled := true; + if DepVar.Text <> '' then + begin + SelList.Items.Add(DepVar.Text); + DepVar.Text := ''; + end; + UpdateBtnStates; end; procedure TBackRegFrm.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 TBackRegFrm.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 TBackRegFrm.UpdateBtnStates; +var + i: Integer; + lSelected: Boolean; +begin + lSelected := false; + for i := 0 to VarList.Items.Count-1 do + if VarList.Selected[i] then + begin + lSelected := true; + break; + end; + DepInBtn.Enabled := lSelected and (DepVar.Text = ''); + InBtn.Enabled := lSelected; + + DepOutBtn.Enabled := DepVar.Text <> ''; + + 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 backregunit.lrs} diff --git a/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.lfm b/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.lfm index 43afa3812..342ca3aaa 100644 --- a/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.lfm +++ b/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.lfm @@ -29,7 +29,7 @@ object StepFwdFrm: TStepFwdFrm AnchorSideTop.Control = InBtn Left = 269 Height = 15 - Top = 104 + Top = 108 Width = 127 Caption = 'Variables to be Analyzed' ParentColor = False @@ -39,7 +39,7 @@ object StepFwdFrm: TStepFwdFrm AnchorSideBottom.Control = DepVar Left = 269 Height = 15 - Top = 28 + Top = 32 Width = 102 Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 2 @@ -73,7 +73,7 @@ object StepFwdFrm: TStepFwdFrm AnchorSideTop.Side = asrBottom Left = 224 Height = 28 - Top = 104 + Top = 108 Width = 28 BorderSpacing.Top = 24 Images = MainDataModule.ImageList @@ -89,7 +89,7 @@ object StepFwdFrm: TStepFwdFrm AnchorSideTop.Side = asrBottom Left = 224 Height = 28 - Top = 136 + Top = 140 Width = 28 BorderSpacing.Top = 4 Images = MainDataModule.ImageList @@ -105,7 +105,7 @@ object StepFwdFrm: TStepFwdFrm AnchorSideTop.Side = asrBottom Left = 215 Height = 25 - Top = 188 + Top = 192 Width = 46 AutoSize = True BorderSpacing.Top = 24 @@ -123,8 +123,8 @@ object StepFwdFrm: TStepFwdFrm AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = GroupBox2 Left = 269 - Height = 92 - Top = 121 + Height = 88 + Top = 125 Width = 199 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 8 @@ -154,8 +154,9 @@ object StepFwdFrm: TStepFwdFrm AnchorSideTop.Side = asrBottom Left = 224 Height = 28 - Top = 52 + Top = 56 Width = 28 + BorderSpacing.Top = 4 Images = MainDataModule.ImageList ImageIndex = 0 OnClick = DepOutBtnClick @@ -173,7 +174,7 @@ object StepFwdFrm: TStepFwdFrm AnchorSideBottom.Side = asrBottom Left = 269 Height = 23 - Top = 45 + Top = 49 Width = 199 Anchors = [akLeft, akRight, akBottom] BorderSpacing.Left = 8 diff --git a/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.pas b/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.pas index 92972b315..7a541dc84 100644 --- a/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.pas +++ b/applications/lazstats/source/forms/analysis/multiple_regression/stepfwdmrunit.pas @@ -123,7 +123,6 @@ end; procedure TStepFwdFrm.FormCreate(Sender: TObject); begin Assert(OS3MainFrm <> nil); - if OutputFrm = nil then Application.CreateForm(TOutputFrm, OutputFrm); end; procedure TStepFwdFrm.FormShow(Sender: TObject); diff --git a/applications/lazstats/source/units/matrixlib.pas b/applications/lazstats/source/units/matrixlib.pas index 15decced6..f6fb63a6d 100644 --- a/applications/lazstats/source/units/matrixlib.pas +++ b/applications/lazstats/source/units/matrixlib.pas @@ -46,10 +46,10 @@ procedure nonsymroots(a : DblDyneMat; nv : integer; var t : double; var ev : double); -PROCEDURE ludcmp(VAR a: DblDyneMat; n: integer; VAR indx: IntDyneVec; VAR d: double); +procedure ludcmp(const a: DblDyneMat; n: integer; const indx: IntDyneVec; out d: double); -procedure DETERM(VAR a : DblDyneMat; rows, cols : integer; VAR determ : double; - VAR errorcode : boolean); +procedure DETERM(const a: DblDyneMat; Rows, Cols: integer; + out determ: double; out errorcode: boolean); procedure EffectCode(GridCol, min, max : integer; FactLetter : string; @@ -522,86 +522,108 @@ begin end; { of procedure nonsymroots } //------------------------------------------------------------------- -PROCEDURE ludcmp(VAR a: DblDyneMat; n: integer; VAR indx: IntDyneVec; VAR d: double); -CONST tiny=1.0e-20; -VAR k,j,imax,i: integer; - sum,dum,big: double; - vv: DblDyneVec; +PROCEDURE ludcmp(const a: DblDyneMat; n: integer; const indx: IntDyneVec; out d: double); +const + tiny = 1.0e-20; +var + k,j,imax,i: integer; + sum,dum,big: double; + vv: DblDyneVec; BEGIN SetLength(vv,n); - d := 1.0; imax := 0; - FOR i := 1 to n DO BEGIN + d := 1.0; + imax := 0; + for i := 1 to n do begin big := 0.0; - FOR j := 1 to n DO IF (abs(a[i-1,j-1]) > big) THEN big := abs(a[i-1,j-1]); - IF (big = 0.0) THEN BEGIN - ShowMessage('Singular matrix in Lower-Upper Decomposition routine'); + for j := 1 to n do + if (abs(a[i-1,j-1]) > big) then big := abs(a[i-1,j-1]); + if (big = 0.0) then + begin + MessageDlg('Singular matrix in Lower-Upper Decomposition routine', mtError, [mbOK], 0); exit; - END; - vv[i-1] := 1.0/big - END; - FOR j := 1 to n DO BEGIN - IF (j > 1) THEN BEGIN - FOR i := 1 to j-1 DO BEGIN + end; + vv[i-1] := 1.0/big; + end; + + for j := 1 to n do + begin + if (j > 1) then + begin + for i := 1 to j-1 do + begin sum := a[i-1,j-1]; - IF (i > 1) THEN BEGIN - FOR k := 1 to i-1 DO BEGIN - sum := sum - a[i-1,k-1] * a[k-1,j-1] - END; + if (i > 1) then + begin + for k := 1 to i-1 do + sum := sum - a[i-1,k-1] * a[k-1,j-1]; a[i-1,j-1] := sum - END - END - END; + end; + end; + end; + big := 0.0; - FOR i := j to n DO BEGIN + for i := j to n do + begin sum := a[i-1,j-1]; - IF (j > 1) THEN BEGIN - FOR k := 1 to j-1 DO BEGIN - sum := sum - a[i-1,k-1] * a[k-1,j-1] - END; + if (j > 1) then + begin + for k := 1 to j-1 do + sum := sum - a[i-1,k-1] * a[k-1,j-1]; a[i-1,j-1] := sum END; dum := vv[i-1] * abs(sum); - IF (dum > big) THEN BEGIN + if (dum > big) then + begin big := dum; imax := i - END - END; - IF (j <> imax) THEN BEGIN - FOR k := 1 to n DO BEGIN + end; + end; + + if (j <> imax) then + begin + for k := 1 to n do + begin dum := a[imax-1,k-1]; a[imax-1,k-1] := a[j-1,k-1]; - a[j-1,k-1] := dum - END; + a[j-1,k-1] := dum; + end; d := -d; vv[imax-1] := vv[j-1] - END; + end; indx[j-1] := imax; - IF (j <> n) THEN BEGIN - IF (a[j-1,j-1] = 0.0) THEN a[j-1,j-1] := tiny; + if (j <> n) then + begin + if (a[j-1,j-1] = 0.0) then + a[j-1,j-1] := tiny; dum := 1.0/a[j-1,j-1]; - FOR i := j+1 to n DO BEGIN - a[i-1,j-1] := a[i-1,j-1] * dum - END - END - END; - IF (a[n-1,n-1] = 0.0) THEN a[n-1,n-1] := tiny; + for i := j+1 to n do + a[i-1,j-1] := a[i-1,j-1] * dum; + end; + end; + + if (a[n-1,n-1] = 0.0) then + a[n-1,n-1] := tiny; + vv := nil; -END; +end; //------------------------------------------------------------------- -procedure DETERM(VAR a : DblDyneMat; rows, cols : integer; VAR determ : double; - VAR errorcode : boolean); -var indx : IntDyneVec; - i : integer; +procedure DETERM(const a: DblDyneMat; Rows, Cols: integer; out determ: double; + out errorcode: boolean); +var + indx: IntDyneVec; + i: integer; begin - SetLength(indx,rows); - errorcode := FALSE; - if (rows <> cols) then errorcode := TRUE else - begin - LUDCMP(a, rows, indx, determ); - for i := 1 to rows do - determ := determ * a[i-1,i-1]; - end; + SetLength(indx,rows); + errorcode := false; + if (rows <> cols) then + errorcode := true + else + begin + LUDCMP(a, rows, indx, determ); + for i := 1 to rows do + determ := determ * a[i-1,i-1]; + end; end; { of determ } //------------------------------------------------------------------- @@ -1329,7 +1351,7 @@ begin IndColLabels[i] := RowLabels[IndepIndex[i]-1]; XYCorrs[i] := corrs[IndepIndex[i]-1,NoVars-1]; end; - SVDinverse(IndepCorrs,NoIndepVars); + SVDinverse(IndepCorrs, NoIndepVars); if PrintInv then begin @@ -1362,6 +1384,7 @@ begin MessageDlg('Error in computing variance estimate.', mtError, [mbOK], 0); StdErrEst := 0.0; end; + if (R2 < 1.0) and (df2 > 0.0) and (df1 > 0.0) then F := (R2 / df1) / ((1.0-R2)/ df2) else