Files
lazarus-ccr/applications/lazstats/tests/multiple_regression_test/multiple_regression.lpr

101 lines
2.0 KiB
ObjectPascal
Raw Normal View History

program multiple_regression;
uses
SysUtils, Classes,
Globals, MatrixUnit, RegressionUnit;
var
L: TStrings;
xCols: IntDyneVec = nil;
yCol: Integer;
xData: TDblMatrix = nil;
yData: TDblVector = nil;
i, j: Integer;
sa: TStringArray = nil;
RegressionRes: TMultipleRegressionResults;
Labels: StrDyneVec = nil;
const
W = 20;
D = 3;
procedure WriteMatrix(A: TDblMatrix; RowLabels, ColLabels: StrDyneVec);
var
i,j: Integer;
n, m: Integer;
begin
MatSize(A, n,m);
Write('':W);
for j := 0 to High(ColLabels) do
Write(ColLabels[j]:W);
WriteLn;
for i := 0 to n-1 do
begin
Write(RowLabels[i]:W);
for j := 0 to m-1 do
Write(A[i,j]:W:D);
WriteLn;
end;
end;
begin
DefaultFormatSettings.DecimalSeparator := '.';
SetLength(xCols, 2);
xCols[0] := 0;
xCols[1] := 1;
yCol := 5;
SetLength(Labels, Length(xCols) + 1);
Labels[High(Labels)] := 'Intercept';
L := TStringList.Create;
try
L.LoadFromFile('..\..\data\cansas.tab');
sa := L[0].Split(#9);
for j := 0 to High(xCols) do
Labels[j] := sa[xCols[j]];
SetLength(xData, L.Count-1, 2);
SetLength(yData, L.Count-1);
for i:=1 to L.Count-1 do
begin
sa := L[i].Split(#9);
for j := 0 to High(xCols) do
xData[i-1, xCols[j]] := StrToFloat(sa[xCols[j]]);
yData[i-1] := StrToFloat(sa[yCol]);
end;
Write('Index':10);
for j := 0 to High(xCols) do
Write(Labels[j]:10);
WriteLn(sa[yCol]:10);
//WriteLn('Index':10, sa[0]:10, sa[1]:10, sa[yCol]:10);
for i := 0 to High(yData) do
begin
Write(i:10);
for j := 0 to High(xCols) do
Write(xdata[i, j]:10:3);
WriteLn(yData[i]:10:3);
end;
WriteLn;
finally
L.Free;
end;
MultipleRegression(xData, yData, 0.95, RegressionRes);
for i := 0 to High(Labels) do
WriteLn('B[' + Labels[i] + '] =':20, RegressionRes.Coeffs[i]:W:D);
WriteLn;
WriteLn('Variance-Covariance Matrix');
WriteMatrix(RegressionRes.VarCovar, Labels, Labels);
ReadLn;
end.