Files
lazarus-ccr/applications/lazstats/source_orig/interruptedunit.pas

910 lines
25 KiB
ObjectPascal
Raw Normal View History

unit InterruptedUnit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, Buttons, MainUnit, Globals, DataProcs, OutPutUnit,
AutoPlotUnit, GraphLib;
type
{ TInterruptedFrm }
TInterruptedFrm = class(TForm)
CorrChk: TCheckBox;
PreInBtn: TBitBtn;
PreOutBtn: TBitBtn;
PostInBtn: TBitBtn;
PostOutBtn: TBitBtn;
ResetBtn: TButton;
CancelBtn: TButton;
ComputeBtn: TButton;
ReturnBtn: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
VarList: TListBox;
PreList: TListBox;
PostList: TListBox;
procedure ComputeBtnClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure PostInBtnClick(Sender: TObject);
procedure PostOutBtnClick(Sender: TObject);
procedure PreInBtnClick(Sender: TObject);
procedure PreOutBtnClick(Sender: TObject);
procedure ResetBtnClick(Sender: TObject);
procedure matinverse(Sender: TObject);
procedure plotit( Sender: TObject);
procedure PlotFuncs(Sender: TObject);
private
{ private declarations }
z : DblDyneVec;
y : DblDyneVec;
x : DblDyneMat;
x1 : array[1..4,1..4] of double;
x2 : array[1..4,1..4] of double;
x3 : array[1..4] of double;
t : array[1..4] of double;
p : array[1..100] of double;
p1 : array[1..4] of double;
ii3 : array[1..4,1..3] of double;
p2 : array[1..4] of double;
s : array[1..4] of double;
t2 : array[1..4] of double;
b : array[1..4,1..1] of double;
x4 : array[1..50,1..10] of double;
d : array[1..50,1..5] of double;
r : array[1..50] of double;
x5 : array[1..50,1..11] of double;
a1 : array[1..10] of double;
a2 : array[1..10] of double;
r2 : array[1..10] of double;
e : array[1..10] of double;
f2 : array[1..5,1..10] of double;
pl : string;
f1s, g1s, g2s, g3s, g4s, g5s, g6s, g7s, g8s : string;
c9, g, c, g1, t3, t4, t5, t6, f4, n7, d7, y1, xx3, f1, f2x, s1 : double;
s3, s4, h, f3, y2, a, det, amax : double;
col, n, n1, n2, n4, n5, n6, m, l1, l2, i3, t1, NoGoodCases : integer;
n3, j1, m1, i1, R1 : integer;
public
{ public declarations }
end;
var
InterruptedFrm: TInterruptedFrm;
implementation
{ TInterruptedFrm }
procedure TInterruptedFrm.ResetBtnClick(Sender: TObject);
VAR i : integer;
begin
VarList.Clear;
PreList.Clear;
PostList.Clear;
for i := 1 to NoVariables do
VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]);
PreOutBtn.Visible := false;
PostOutBtn.Visible := false;
PreInBtn.Visible := true;
PostInBtn.Visible := true;
end;
procedure TInterruptedFrm.FormShow(Sender: TObject);
begin
ResetBtnClick(Self);
end;
procedure TInterruptedFrm.ComputeBtnClick(Sender: TObject);
label 300;
var
i, i2, j, j2, j3, k : integer;
ColNoSelected : IntDyneVec;
rxy : DblDyneVec;
heading : string;
begin
g1s := 't..change in level ';
g2s := 't..change in slope ';
g3s := 'scaled posterior ';
g4s := 'lower 99 percent ';
g5s := 'lower 95 percent ';
g6s := 'delta ';
g7s := 'upper 95 percent ';
g8s := 'upper 99 percent ';
c9 := 1.0E-15;
n1 := 0;
n2 := 0;
g := 0.01;
NoGoodCases := 0;
OutPutFrm.RichEdit.Clear;
OutPutFrm.RichEdit.Lines.Add('Interrupted Time Series Analysis');
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('Adapted from the Fortran program written by Glass and Maguire');
OutPutFrm.RichEdit.Lines.Add('and based on Box and Tiao IMA(1,1) procedure. Published in');
OutPutFrm.RichEdit.Lines.Add('How To Do Psychotherapy and How to Evaluate It by');
OutPutFrm.RichEdit.Lines.Add('John M. Gottman and Sandra R. Leiblum, Holt, Rinehart and ');
OutPutFrm.RichEdit.Lines.Add('Winston, Inc., New York, 1974.');
OutPutFrm.RichEdit.Lines.Add('');
n1 := PreList.Items.Count;
n2 := PostList.Items.Count;
t1 := n1 + n2;
if t1 < 5 then
begin
ShowMessage('There must be more than 4 total values in the series.');
exit;
end;
// allocate space
SetLength(z,t1);
SetLength(y,t1);
SetLength(x,t1,4);
SetLength(ColNoSelected,t1);
SetLength(rxy,t1);
// Get column numbers of variables selected
for i := 1 to n1 do
begin
for j := 1 to NoVariables do
begin
if PreList.Items.Strings[i-1] = OS3MainFrm.DataGrid.Cells[j,0] then
ColNoSelected[i-1] := j;
end;
end;
for i := 1 to n2 do
begin
for j := 1 to NoVariables do
begin
if PostList.Items.Strings[i-1] = OS3MainFrm.DataGrid.Cells[j,0] then
ColNoSelected[n1+i-1] := j;
end;
end;
// read pre and post values - average for the cases
for j := 0 to t1-1 do z[j] := 0.0;
for i := 1 to NoCases do
begin
if NOT GoodRecord(i,t1,ColNoSelected) then continue;
for j := 0 to t1-1 do
begin
col := ColNoSelected[j];
z[j] := z[j] + StrToFloat(OS3MainFrm.DataGrid.Cells[col,i]);
NoGoodCases := NoGoodCases + 1;
end;
end;
for j := 0 to t1-1 do z[j] := z[j] / NoGoodCases;
// plot correlograms
for j3 := 1 to 4 do
begin
case j3 of
1 : begin
f1s := 'Pre-Treatment Data';
n4 := n1;
l1 := 1;
l2 := n1;
OutPutFrm.RichEdit.Lines.Add('Correlogram of Pre-Treatment Raw Data');
heading := 'Correlogram of Pre-Treatment Raw Data';
i2 := 0;
for i := l1 to l2 do
begin
i2 := i2 + 1;
y[i2-1] := z[i-1];
end;
end;
2 : begin
f1s := 'Post-Treatment Data';
n4 := n2;
l1 := n1 + 1;
l2 := t1;
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('Correlogram of Post-Treatment Raw Data');
heading := 'Correlogram of Post-Treatment Raw Data';
i2 := 0;
for i := l1 to l2 do
begin
i2 := i2 + 1;
y[i2-1] := z[i-1];
end;
end;
3 : begin
f1s := 'Pre-Treatment Data';
n4 := n1 - 1;
l1 := 1;
l2 := n1 - 1;
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('Correlogram of Pre-Treatment Differences');
heading := 'Correlogram of Pre-Treatment Differences';
i2 := 0;
for i := l1 to l2 do
begin
i2 := i2 + 1;
i3 := i + 1;
y[i2-1] := z[i3-1] - z[i-1];
end;
end;
4 : begin
f1s := 'Post-Treatment Data';
n4 := n2-1;
l1 := n1 + 1;
l2 := t1 - 1;
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('Correlogram of Post-Treatment Differences');
heading := 'Correlogram of Post-Treatment Differences';
i2 := 0;
for i := l1 to l2 do
begin
i2 := i2 + 1;
i3 := i + 1;
y[i2-1] := z[i3-1] - z[i-1];
end;
end;
end;
j2 := n4 * 3 div 4;
for k := 1 to j2 do
begin
n5 := n4 - k;
c := 0.0;
t3 := 0.0;
t4 := 0.0;
t5 := 0.0;
t6 := 0.0;
for i := 1 to n5 do
begin
n6 := i + k;
c := c + y[i-1] * y[n6-1];
t3 := t3 + y[i-1];
t4 := t4 + y[n6-1];
t5 := t5 + y[i-1] * y[i-1];
t6 := t6 + y[n6-1] * y[n6-1];
end;
f4 := n5;
n7 := c - (t3 * t4) / f4;
d7 := (t5 - (t3 * t3) / f4) * (t6 - (t4 * t4) / f4);
if d7 > 0.0 then
begin
d7 := sqrt(d7);
r[k] := n7 / d7;
end
else r[k] := 1.0;
pl := format('lag %3d r %4.2f',[k,r[k]]);
OutPutFrm.RichEdit.Lines.Add(pl);
end; // next k
s4 := 1;
n := 1;
m := j2;
for i := 1 to j2 do x4[i,1] := r[i];
// plotit(Self);
if CorrChk.Checked then
begin
rxy[0] := 0.0;
for i := 1 to j2 do rxy[i] := r[i];
AutoPlotFrm.PlotPartCors := false;
AutoPlotFrm.PlotLimits := false;
AutoPlotFrm.correlations := rxy;
AutoPlotFrm.partcors := rxy;
AutoPlotFrm.uplimit := 0.99;
AutoPlotFrm.lowlimit := -0.99;
AutoPlotFrm.npoints := j2+1;
AutoPlotFrm.DepVarEdit := heading;
AutoPlotFrm.ShowModal;
end;
end; // next j3
OutPutFrm.ShowModal;
OutPutFrm.RichEdit.Clear;
// Now do the analysis
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add(' residual t for change in t for');
OutPutFrm.RichEdit.Lines.Add(' gamma variance level level level change');
300:
y[0] := z[0];
for i := 1 to t1-1 do
begin
i1 := i - 1;
y1 := abs(y[i1]);
if (y1 - c9) <= 0.0 then y[i] := z[i] - z[i1]
else if (y1 - 0.000001) > 0 then y[i] := (z[i] - z[i1]) + (1.0 - g) * y[i1];
g1 := abs(1.0 - g);
if (g1 - 0.001) > 0 then y[i] := (z[i] - z[i1]) + (1.0 - g) * y[i1]
else y[i] := z[i] - z[i1];
end;
for i := 0 to t1 - 1 do x[i,0] := 1;
for i := 1 to n1 do x[i-1,1] := 0.0;
for i := n1 + 1 to t1 do x[i-1,1] := 1.0;
x[0,2] := 1.0;
x[1,2] := 1.0 - g;
for i := 2 to t1-1 do
begin
i1 := i - 1;
x[i,2] := x[1,2] * x[i1,2];
xx3 := abs(x[i,2]);
if (c9 - xx3) <= 0.0 then continue;
x[i,2] := 0.0;
end;
for i := 1 to n1 do x[i-1,3] := 0.0;
for i := n1 to t1-1 do
begin
i1 := i-n1;
x[i,3] := x[i1,2];
xx3 := abs(x[i,3]);
if (c9 - xx3) <= 0.0 then continue;
x[i,3] := 0.0;
end;
for i := 1 to 4 do
begin
for j := 1 to 4 do
begin
x2[i,j] := 0.0;
x1[i,j] := 0.0;
end;
end;
for i := 1 to 4 do
for j := 1 to 4 do
for k := 1 to t1 do
x2[i,j] := x2[i,j] + x[k-1,i-1] * x[k-1,j-1];
for i := 1 to 4 do
for j := 1 to 4 do
x1[i,j] := x2[i,j];
for i := 1 to 4 do x3[i] := 0.0;
for i := 1 to 4 do
for j := 1 to t1 do
x3[i] := x3[i] + x[j-1,i-1] * y[j-1];
for i := 1 to 4 do b[i,1] := x3[i];
matinverse(Self);
for i := 1 to 4 do t[i] := b[i,1];
for i := 1 to 4 do s[i] := x1[i,i];
f1 := t1;
y1 := 0.0;
for i := 0 to t1-1 do
begin
y1 := y1 + y[i] * y[i];
end;
for i := 1 to 4 do x3[i] := 0.0;
for j := 1 to 4 do
for i := 1 to 4 do
begin
x3[j] := x3[j] + t[i] * x2[i,j];
end;
f2x := 0.0;
for i := 1 to 4 do
begin
f2x := f2x + x3[i] * t[i];
end;
s1 := y1 - f2x;
s1 := s1 / (f1 - 4.0);
for i := 1 to 4 do
begin
s[i] := sqrt(s1 * s[i]);
t2[i] := t[i] / s[i];
end;
s3 := ln(s1);
det := ln(det);
h := (-0.5 * det) - (0.5 * (f1 - 4.0) * s3);
h := 0.4342945 * h;
j1 := j1 + 1;
x5[j1,1] := g;
x5[j1,2] := s1;
x5[j1,3] := t[3];
x5[j1,4] := t2[3];
x5[j1,5] := t[4];
x5[j1,6] := t2[4];
x5[j1,7] := t[1];
x5[j1,8] := t2[1];
x5[j1,9] := t[2];
x5[j1,10] := t2[2];
if (t1 - 30) >= 0 then
begin
d[j1,1] := t[4] - 2.58 * s[4];
d[j1,2] := t[4] - 1.96 * s[4];
d[j1,3] := t[4];
d[j1,4] := t[4] + 1.96 * s[4];
d[j1,5] := t[4] + 2.58 * s[4];
end;
n3 := n3 + 1;
p[n3] := h;
g := g + 0.04;
if (n3 - 49) <= 0 then goto 300;
f3 := p[1];
for i := 2 to 49 do if (f3 - p[i]) < 0 then f3 := p[i];
for i := 1 to 49 do
begin
p[i] := p[i] - f3;
y2 := abs(p[i]);
if (y2 - 35) >= 0 then p[i] := 0.0
else begin
p[i] := p[i] / 0.4342945;
p[i] := exp(p[i]);
end;
end;
a := 0.0;
for i := 2 to 49 do
begin
i2 := i - 1;
a := a + 0.005 * (p[i] + p[i1]);
end;
for i := 1 to 49 do p[i] := p[i] / a;
for i := 1 to 49 do x5[i,11] := p[i];
for i := 1 to 49 do
begin
pl := format('%2d ',[i]);
for j := 1 to 6 do
pl := pl + format('%6.2f ',[x5[i,j]]);
OutPutFrm.RichEdit.Lines.Add(pl);
end;
OutPutFrm.ShowModal;
OutPutFrm.RichEdit.Clear;
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('');
pl := ' t for change in t for scaled';
OutPutFrm.RichEdit.Lines.Add(pl);
pl := ' slope slope slope change posterior';
OutPutFrm.RichEdit.Lines.Add(pl);
for i := 1 to 49 do
begin
pl := format('%2d ',[i]);
for j := 7 to 11 do
pl := pl + format('%6.2f ',[x5[i,j]]);
OutPutFrm.RichEdit.Lines.Add(pl);
end;
OutPutFrm.ShowModal;
OutPutFrm.RichEdit.Clear;
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('');
for i := 1 to 49 do
begin
x4[i,1] := x5[i,5];
x4[i,2] := x5[i,9];
x4[i,3] := x5[i,11];
end;
m := 49;
n := 3;
i3 := 1;
f1s := g1s + g2s + g3s;
PlotFuncs(Self);
plotit(Self); // plot the f[i,j] values
OutPutFrm.ShowModal;
OutPutFrm.RichEdit.Clear;
n := 5;
if (t1 - 30) >= 0 then
begin // do confidence intervals around delta
for i := 1 to 49 do
for j := 1 to 5 do
x4[i,j] := d[i,j];
f1s := g4s + g5s + g6s + g7s + g8s;
pl := 'Confidence Intervals Around Delta';
OutPutFrm.RichEdit.Lines.Add(pl);
pl := 'gamma lower 99 lower 95 delta upper 95 upper 99';
OutPutFrm.RichEdit.Lines.Add(pl);
for i := 1 to 49 do
begin
pl := format('%6.2f ',[x5[i,1]]);
for j := 1 to 5 do
pl := pl + format('%6.2f ',[d[i,j]]);
OutPutFrm.RichEdit.Lines.Add(pl);
end;
OutPutFrm.RichEdit.Lines.Add('');
pl := 'Graph of Confidence Intervals Around Delta Hat';
OutPutFrm.RichEdit.Lines.Add(pl);
plotit(Self); // plot f matrix
end;
OutPutFrm.ShowModal;
// clean up
rxy := nil;
ColNoSelected := nil;
x := nil;
y := nil;
z := nil;
end;
procedure TInterruptedFrm.PostInBtnClick(Sender: TObject);
VAR i, index : integer;
begin
index := VarList.Items.Count;
i := 0;
while i < index do
begin
if (VarList.Selected[i]) then
begin
PostList.Items.Add(VarList.Items.Strings[i]);
VarList.Items.Delete(i);
index := index - 1;
i := 0;
end
else i := i + 1;
end;
PostOutBtn.Visible := true;
if VarList.Items.Count = 0 then PostInBtn.Visible := false;
end;
procedure TInterruptedFrm.PostOutBtnClick(Sender: TObject);
VAR index : integer;
begin
index := PostList.ItemIndex;
if index >= 0 then
begin
VarList.Items.Add(PostList.Items.Strings[index]);
PostList.Items.Delete(index);
PostInBtn.Visible := true;
if PostList.Items.Count = 0 then PostOutBtn.Visible := false;
end;
end;
procedure TInterruptedFrm.PreInBtnClick(Sender: TObject);
VAR i, index : integer;
begin
index := VarList.Items.count;
i := 0;
while i < index do
begin
if (VarList.Selected[i]) then
begin
PreList.Items.Add(VarList.Items.Strings[i]);
VarList.Items.Delete(i);
index := index - 1;
i := 0;
end
else i := i + 1;
end;
PreOutBtn.Visible := true;
if VarList.Items.Count = 0 then PreInBtn.Visible := false;
end;
procedure TInterruptedFrm.PreOutBtnClick(Sender: TObject);
VAR index : integer;
begin
index := PreList.ItemIndex;
if index >= 0 then
begin
VarList.Items.Add(PreList.Items.Strings[index]);
PreList.Items.Delete(index);
PreInBtn.Visible := true;
if PreList.Items.Count = 0 then PreOutBtn.Visible := false;
end;
end;
procedure TInterruptedFrm.matinverse(Sender: TObject);
var
i, j, j2, j4, k, L, Lc : integer;
temp : double;
begin
//Matrix inverse and determinant
det := 1;
m1 := 1;
N := 4;
For i := 1 To 4 do
begin
p1[i] := 0.0;
For j := 1 To 2 do ii3[i, j] := 0.0;
end;
For i := 1 To N do
begin
amax := 0.0;
For j := 1 To N do
begin
If (p1[j] - 1) <> 0 Then
begin
For k := 1 To N do
begin
If (p1[k] - 1) <> 0 Then
begin
If (p1[k] - 1) > 0 Then Exit;
If Abs(amax) - Abs(x1[j, k]) <= 0 Then
begin
R1 := j;
i1 := k;
amax := x1[j, k];
End;
End;
end;
End;
end;
p1[i1] := p1[i1] + 1;
If (R1 - i1) <> 0 Then //Swap
begin
det := -det;
For L := 1 To N do
begin
s4 := x1[R1, L];
x1[R1, L] := x1[i1, L];
x1[i1, L] := s4;
end;
If m1 > 0 Then //Swap
begin
For L := 1 To m1 do
begin
s4 := b[R1, L];
b[R1, L] := b[i1, L];
b[i1, L] := s4;
end;
End;
End;
ii3[i, 1] := R1;
ii3[i, 2] := i1;
p2[i] := x1[i1, i1];
det := det * p2[i];
If p2[i] = 0 Then
begin
ShowMessage('A singular matrix was found.');
Exit;
End;
x1[i1, i1] := 1;
For L := 1 To N do
begin
x1[i1, L] := x1[i1, L] / p2[i];
end;
If m1 > 0 Then
begin
For L := 1 To m1 do
begin
b[i1, L] := b[i1, L] / p2[i];
end;
End;
For Lc := 1 To N do
begin
If (Lc - i1) <> 0 Then
begin
temp := x1[Lc,i1];
x1[L1,i1] := 0.0;
For L := 1 To N do
begin
x1[Lc,L] := x1[Lc,L] - x1[i1,L] * temp;
end;
If m1 > 0 Then
begin
For L := 1 To m1 do
b[L1, L] := b[L1, L] - b[i1, L] * temp;
End;
End;
end;
end;
For i := 1 To N do
begin
L := N + 1 - i;
If (ii3[L, 1] - ii3[L, 2]) <> 0 Then
begin
j2 := round(ii3[L, 1]);
j4 := round(ii3[L, 2]);
For k := 1 To N do
begin
s4 := x1[k, j2];
x1[k, j2] := x1[k, j4];
x1[k, j4] := s4;
end;
End;
end;
end;
//--------------------------------------------------------------------
procedure TInterruptedFrm.plotit( Sender: TObject);
label 2180, 2660;
var
i, i2, ip, j, k, L, n8 : integer;
bstr, p1str, p2str : string;
c5, z2 : double;
begin
For i := 1 To N do
begin
a1[i] := 1E+37;
a2[i] := -1E+37;
end;
bstr := '153510cmha';
For i := 1 To M do
begin
For j := 1 To N do
begin
c5 := x4[i, j] - a1[j];
If c5 >= 0 Then goto 2180;
a1[j] := x4[i, j];
2180: c5 := x4[i, j] - a2[j];
If c5 <= 0 Then continue;
a2[j] := x4[i, j];
end;
end;
If (N - 5) = 0 Then
begin
For j := 1 To 5 do
begin
a2[j] := a2[5];
a1[j] := a1[1];
end;
End;
n8 := N;
For j := 1 To N do
begin
r2[j] := (a2[j] - a1[j]) / 55;
end;
For j := 1 To N do
begin
e[j] := (a2[j] - a1[j]) / 4;
f2[1, j] := a1[j] + 0.05;
c5 := a1[j];
If c5 < 0 Then
begin
f2[1, j] := f2[1, j] - 0.1;
End;
f2[5, j] := a2[j] - 0.05;
c5 := a2[j];
If c5 < 0 Then
begin
f2[5, j] := f2[5, j] - 0.1;
End;
f2[2, j] := a1[j] + e[j] + 0.05;
c5 := f2[2, j];
If c5 < 0 Then
begin
f2[2, j] := f2[2, j] - 0.1;
End;
f2[3, j] := a1[j] + e[j] * 2 + 0.05;
c5 := f2[3, j];
If c5 < 0 Then
begin
f2[3, j] := f2[3, j] - 0.1;
End;
f2[4, j] := a2[j] - e[j] + 0.05;
c5 := f2[4, j];
If c5 < 0 Then
begin
f2[4, j] := f2[4, j] - 0.1;
End;
end;
For j := 1 To n8 do
begin
pl := bstr[j] + ' ';
For i := 1 To 5 do
begin
pl := pl + format('%6.2f ',[f2[i,j]]);
end;
pl := pl + copy(bstr, j, 1);
OutPutFrm.RichEdit.Lines.Add(pl);
end;
pl := '';
OutPutFrm.RichEdit.Lines.Add('----------------------------------------------------------------------');
for i2 := 1 to 73 do
begin
p2str := p2str + ' ';
p1str := p1str + ' ';
end;
For i := 1 To M do
begin
For i2 := 1 To 72 do p1str[i2] := ' ';
k := 0;
p1str[1] := '.';
For i2 := 1 To 5 do
begin
k := k + 14;
p1str[k] := '.';
end;
n7 := i;
while N7 >= 0 do
begin
n7 := n7 - 10;
end;
If n7 >= 0 Then
begin
k := 3;
p1str[k] := '-';
For i2 := 3 To 30 do
begin
k := k + 2;
p1str[k] := '-';
end;
End;
For k := 1 To N do
begin
If r2[k] > 0 Then
z2 := (x4[i, k] - a1[k]) / r2[k] + 1
Else z2 := 0;
L := round(z2);
If (L - 1) < 0 Then L := 1;
If (55 - L) < 0 Then L := 55;
If (p1str[L] = ' ') Or (p1str[L] = '.') Or (p1str[L] = '-') Then
begin
p2str[k] := bstr[k];
p1str[L] := p2str[k];
end
Else begin
p1str[L] := '+';
End;
end;
If (s4 - 1) = 0 Then goto 2660;
OutPutFrm.RichEdit.Lines.Add('');
2660:
pl := format('%2d. ',[i]);
For ip := 1 To 55 do pl := pl + p1str[ip];
pl := pl + format('. %2d',[i]);
OutPutFrm.RichEdit.Lines.Add(pl);
end;
OutPutFrm.RichEdit.Lines.Add('----------------------------------------------------------------------');
OutPutFrm.RichEdit.Lines.Add('');
For j := 1 To n8 do
begin
pl := bstr[j] + ' ';
For i := 1 To 5 do
begin
pl := pl + format('%6.2f ',[f2[i,j]]);
end;
pl := pl + bstr[j];
OutPutFrm.RichEdit.Lines.Add(pl);
end;
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add(' Plot Description');
OutPutFrm.RichEdit.Lines.Add('title character minimum maximum resolution');
For j := 1 To N do
begin
pl := copy(f1s,j*20-19,20);
pl := pl + ' ' + bstr[j];
pl := pl + ' ' + format('%6.2f',[a1[j]]);
pl := pl + ' ' + format('%6.2f',[a2[j]]);
pl := pl + ' ' + format('%6.2f',[r2[j]]);
OutPutFrm.RichEdit.Lines.Add(pl);
end;
OutPutFrm.RichEdit.Lines.Add('');
OutPutFrm.RichEdit.Lines.Add('');
end;
//-------------------------------------------------------------------
procedure TInterruptedFrm.PlotFuncs(Sender: TObject);
var
i, j : integer;
title : string;
gamma : double;
begin
// Allocate space for point sets of means
SetLength(GraphFrm.Ypoints,3,50);
SetLength(GraphFrm.Xpoints,3,50);
// store points for means
gamma := 0.0;
for i := 1 to 49 do
begin
for j := 1 to 3 do
begin
GraphFrm.Ypoints[j-1,i-1] := x4[i,j];
GraphFrm.Xpoints[j-1,i-1] := gamma;
end;
gamma := gamma + 0.04;
end;
title := 'Plot of ts for change in level and slope and posterior';
GraphFrm.nosets := 3;
GraphFrm.nbars := 49;
GraphFrm.Heading := title;
GraphFrm.SetLabels[1] := 'level';
GraphFrm.SetLabels[2] := 'slope';
GraphFrm.SetLabels[3] := 'posterior';
GraphFrm.XTitle := 'Gamma Increment';
GraphFrm.YTitle := 't';
GraphFrm.barwideprop := 0.5;
GraphFrm.AutoScale := true;
GraphFrm.GraphType := 5; // 2d line chart
GraphFrm.BackColor := clYellow;
GraphFrm.WallColor := clBlack;
GraphFrm.FloorColor := clLtGray;
GraphFrm.ShowBackWall := true;
GraphFrm.ShowModal;
GraphFrm.Xpoints := nil;
GraphFrm.Ypoints := nil;
end;
initialization
{$I interruptedunit.lrs}
end.