home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / HPSTAT.ZIP / HPSTAT2.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1986-04-15  |  57.0 KB  |  2,249 lines

  1. Program Statistics; {$C-}
  2. Const
  3.   DC2           = ^O;
  4. Type
  5.   Panel         = Array[0..24,0..79] of
  6.                   record
  7.                     ch : char; attr : byte;
  8.                   end;
  9.   Address       = ^Integer;
  10.  
  11.   DataPointer   =  ^DataRecord;
  12.   DataRecord    =  record
  13.                      XX : Array[1..10900] of Real;
  14.                    End;
  15.   Regs          =  record
  16.                      AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags: Integer;
  17.                    End;
  18.   SmallRow      =  array[1..31] of Real;
  19.   DataRow       =  array[1..100] of Real;
  20.   SmallArray    =  array[1..31,1..31] of Real;
  21.   IntRow        =  array[1..31] of Integer;
  22.   Message       =  string[255];
  23.   A_Line                    =     string[68];
  24.  
  25. Var
  26.   graphics_scrn    : Panel absolute $B800:$0000;
  27.   screen           : ^Panel;
  28.   SaveScreen       : panel;
  29.   X_save,Y_save    : integer;
  30.  
  31.   LabXY                        : array[1..2,1..20] of integer;
  32.   Titles                       : Array[1..7] of A_Line;
  33.   PageBuf                 : Array[1..8] of Integer;
  34.   NDP                     : Array[1..100] of Integer;
  35.   HeapTop                 : ^Integer;
  36.   RR                      : SmallArray;
  37.   FirstData,LastData,
  38.   Data                    : DataPointer;
  39.   CH,Comma,Iff                         : Char;
  40.   Avg,StDev,SS,Diagonal,Vertical       : DataRow;
  41.   T,Berr,Bmin,Bmax,SX,A,RY,B           : SmallRow;
  42.  
  43.  
  44.   Mst,Sdr,FX,SY,XDF,TTT,Xnobs,RSUM,SSUM,
  45.   Z,YY,SSB,SSB0,SST,RC1,RC2,S2R,S1R,RCP,
  46.   SSR,Yrange,PSDR,PSDR1,Bmod,U,V,W,X,Y            : Real;
  47.  
  48.   I,J,K,L,M,N,Xstart,Ystart,Code,MR,MC,Skips,
  49.   IY1,Imod,ICX,IIC,Nobs,Nvar,DF1,DF,FC,Irow,
  50.   IY,Xpos,Ypos,LastX,LastY,Degree,RC,SC,PlotCall  : Integer;
  51.  
  52.  
  53.   Result                  : Regs;
  54.   Ansr,Cmd                : Char;
  55.   FileName                : String[20];
  56.   InFile,OutFile,IO       : Text;
  57.   Amount,Stn              : String[10];
  58.   Line                    : String[80];
  59.   IOErr,FileWrite         : Boolean;
  60.   Icol                    : IntRow;
  61.   Len,Decimal             : Array[1..10] of Integer;
  62.  
  63. Function Sign(A: Real): Real;
  64. Begin
  65.   If A > 0 then Sign := 1.0
  66.   Else Sign := -1.0;
  67. End;
  68.  
  69. Function Yes: Boolean;
  70. Var
  71.   Ch  : Char;
  72. Begin
  73.   Repeat
  74.     Write(' (Y,N)?');
  75.     Read(Kbd,Ch);
  76.     Writeln;
  77.   Until Ch in['N','n','Y','y'];
  78.   Yes := Ch in['Y','y']
  79. End;
  80.  
  81. Procedure Pause;
  82. Begin
  83.   Writeln;
  84.   GotoXY(1,24); TextBackground(4);
  85.   Write(' Press Any Key to Continue ');
  86.   TextBackground(0);
  87.   Read(Kbd,Ch);
  88.   GotoXY(1,24); TextBackground(0);
  89.   Write('                           ');
  90. End;
  91.  
  92. Function Power(X,Y: Real): Real;
  93. Const
  94.   Epsilon    = 0.000001;
  95.  
  96. Var
  97.   I: Integer;
  98.   P: Real;
  99.  
  100. Begin
  101.   If Abs(Y - Round(Y)) < Epsilon then
  102.   Begin
  103.     P := 1.0;
  104.     If Y >= 0.0 then
  105.       For I := 1 to Round(Y) do P := P*X
  106.     Else if X = 0.0 then Writeln('Negative Power of 0.0')
  107.     Else
  108.       For I := -1 downto Round(Y) do
  109.         P := P/X;
  110.     Power := P;
  111.   End
  112.   Else if X > 0.0 then
  113.     Power := Exp(Y*Ln(X))
  114.   Else if Abs(X) < Epsilon then
  115.     Power := 0.0
  116.   Else
  117.     Writeln('Attempt to take negative number to non-integer power')
  118. End;
  119.  
  120. Procedure IOcheck;
  121. Const
  122.  IoVal   : Integer = 0;
  123. var
  124.   Ch                   : Char;
  125. begin
  126.   IOVal := IOresult;
  127.   IOErr := (IOVal <> 0);
  128.   GotoXY(1,23); ClrEol;        { Clear error line in any case }
  129.   if IOErr then begin
  130.     Write(Chr(7));
  131.     case IOVal of
  132.       $01  :  Writeln('File does not exist');
  133.       $05  :  Writeln('Can''t read from this file');
  134.       $06  :  Writeln('Can''t Write to this file');
  135.       $10  :  Writeln('Error in numeric format');
  136.       $91  :  Writeln('Seek beyond end of file');
  137.       $99  :  Writeln('Unexpected end of file');
  138.       $F0  :  Writeln('Disk Write error');
  139.       $F1  :  Writeln('Directory is full');
  140.       $F2  :  Writeln('File size overflow');
  141.       $FF  :  Writeln('File disappeared')
  142.     else      Writeln('Unknown I/O error:  ');
  143.     end;
  144.     Pause;
  145.   end
  146. end; { of proc IOCheck }
  147.  
  148. Function  GetX(I,J: Integer): Real;
  149.   Var Index : Integer;
  150. Begin
  151.   Index := (J-1)*MR + I;
  152.   GetX := Data^.XX[Index];
  153. End;
  154.  
  155. Procedure PutX(Number: Real; I,J: Integer);
  156.   Var Index : Integer;
  157. Begin
  158.   Index := (J-1)*MR + I;
  159.   Data^.XX[Index] := Number;
  160. End;
  161.  
  162. Procedure InitializeArray;
  163. Begin
  164.   For M := 1 to 10900 do
  165.     Data^.XX[M] := -2.0E35;
  166. End;
  167.  
  168. Procedure CheckSkips;
  169. Begin
  170.   ClrScr;
  171.   Skips := 0;
  172.   Write(^J' Do you wish to skip any observations for this analysis');
  173.   If Yes then
  174.     Begin
  175.       Write(^J' How many observations do you wish to skip ? ');
  176.       Readln(Skips);
  177.       For J := 1 to Skips do
  178.         Begin
  179.           GotoXY(1,20);
  180.           Write(' Enter an observation number to skip : '); ClrEol;
  181.           Readln(Irow);
  182.           PutX(1.0,Irow,SC);
  183.         End;
  184.     End;
  185. End;
  186.  
  187. Procedure UnsKip;
  188. Begin
  189.   For J := 1 to Nobs do
  190.     Begin
  191.       If GetX(J,SC) > 0.0 then
  192.         PutX(-2.0E35,J,SC);
  193.     End;
  194. End;
  195.  
  196. Procedure MatrixMultiply(  C: SmallRow;
  197.                            B: SmallArray;
  198.                            N: Integer;
  199.                        Var A: SmallRow);
  200. { THIS SUBROUTINE MULTIPLIES TWO MATRICES  }
  201. Var
  202.   Temp   : Real;
  203. Begin
  204.   For I := 1 to N do
  205.     Begin
  206.       Temp := 0.00;
  207.       For J:= 1 to N do
  208.         Temp := Temp + B[I,J]*C[J];
  209.       A[I] := Temp;
  210.     End;
  211. End;
  212.  
  213. Procedure ChooseColumns(Var IY,ICX: Integer;
  214.                         Var Icol  : IntRow ; MinY: Integer);
  215. Var
  216.   OldLen          : Array[1..31] of Integer;
  217.   Col             : Array[1..3] of Integer;
  218.   X,Y,Index       : Integer;
  219.   Amount          : String[5];
  220.  
  221. Procedure Initialize;
  222. Begin
  223.   For I := 1 to 31 do Icol[I] := 0 ;
  224.   Amount := '';
  225. End;
  226.  
  227.  
  228. Procedure Convert(Var Len: Integer);
  229. Var
  230.   Value              :Integer;
  231. Begin;
  232.   Len := Length(Amount);
  233.   Val(AMOUNT,Value,Code);
  234.     Icol[Index] := Value
  235. End;
  236.  
  237. Procedure WriteNum(A,B,C: Integer);
  238. Begin
  239.   GotoXY(A,B);
  240.   If OldLen[Index] > C then
  241.     Begin
  242.       For L := 1 to OldLen[Index] do
  243.         Write(' ');
  244.       GotoXY(A,B);
  245.     End;
  246.   If Icol[Index] <> 0 then Write(Icol[Index]);
  247.   OldLen[Index] := C;
  248. End;
  249.  
  250.  
  251. Procedure CheckNumber;
  252. Var
  253.   C  : Integer;
  254. Begin
  255.   C := 10;
  256.   If(Amount <> '') then
  257.     Convert(C);
  258.   GotoXY(X,Y);
  259.   WriteNum(X,Y,C);
  260.   IY := 0;
  261.   Amount := '';
  262. End;
  263.  
  264. Begin
  265.   Col[1] := 15; Col[2] := 40; Col[3] := 65;
  266.   For J := 1 to 31 do OldLen[J] := 0;
  267.   Initialize;
  268. {
  269.        READ INPUT DATA
  270. }
  271.   ClrScr;
  272.   WriteLn(' Enter Column Numbers for the Regression Variables below. Use');
  273.   Writeln(' the GotoXY Keys to move arount on the entry field. For the ');
  274.   Writeln(' Correlation Matrix, NO Y VARIABLE IS NEEDED ');
  275.   TextBackground(15); TextColor(0);
  276.   Writeln(' TYPE X WHEN FINISHED ');
  277.   TextBackground(0);  TextColor(15);
  278.   If MinY = 1 then
  279.     Begin
  280.       GotoXY(1,6);Write(' Y - Axis :');
  281.     End;
  282.   For I := 1 to 3 do
  283.     Begin
  284.       For J := 1 to 10 do
  285.         Begin
  286.           K := (I-1)*25 + 1;
  287.           GotoXY(K,8+J);
  288.           K := (I-1)*10 + J ;
  289.           Write(' X - ',K:2,' : ');
  290.         End;
  291.     End;
  292.   I := 1; J := MinY;
  293.   GotoXY(Col[I],6+(J-1)*3); Index := 1; IY := 0;
  294.   Repeat
  295.   Read(Kbd,CH);
  296.   If(CH = ^[) then
  297.     Begin
  298.       Read(Kbd,Ch);
  299.       CheckNumber;
  300.       Case CH of
  301.       'P':  Begin
  302.               J := J + 1;
  303.               If (I = 1) and (J > 11) then
  304.                 J := MinY
  305.               Else If (I > 1) and  (J > 10) then
  306.                 J := 1  ;
  307.             End;
  308.       'H':  Begin
  309.               J := J - 1;
  310.               If(J < 1) and (I > 1) then J := 1;
  311.               If(J < MinY) and (I = 1) then J := MinY;
  312.             End;
  313.       'G':  Begin
  314.               I := 1;
  315.               J := MinY;
  316.             End;
  317.       'M':  Begin
  318.               I := I + 1;
  319.               If (I > 3) then I := 3 ;
  320.               If (J > 1) and (I = 2) then J := J - 1;
  321.             End;
  322.       'K':  Begin
  323.               I := I - 1;
  324.               If (I < 1) then I := 1;
  325.               If (I = 1) and (MinY = 2) then J := J + 1;
  326.             End;
  327.       End;
  328.     End;
  329.     X := Col[I];
  330.     Y := 8 + J;
  331.     Index := (I-1)*10 + J;
  332.     If I = 1 then
  333.       Begin
  334.         Index := Index - 1;
  335.         Y := Y - 1;
  336.         If J = 1 then Y := 6;
  337.       End;
  338.     If Index = 0 then Index := 31;
  339.     GotoXY(X,Y);
  340.   If(CH in ['E','e','-','.','0'..'9']) then
  341.     Begin
  342.       IY:= IY + 1;
  343.       If (IY > 5) then IY := 5;
  344.       Insert(Ch,AMOUNT,IY);
  345.       GotoXY(X,Y); Write(Amount);GotoXY(X+IY,Y);
  346.     End;
  347.   If (CH = ^H) then
  348.     Begin
  349.       Delete(Amount,IY,1);
  350.       GotoXY(X,Y);
  351.       Write(Amount,' ');
  352.       GotoXY(X+IY-1,Y);
  353.       IY := IY - 1;
  354.       If IY < 0 then IY := 0;
  355.     End;
  356.    If (Ch = 'X') or (Ch = 'x') then
  357.      CheckNumber;
  358.   Until (CH = 'X') or (CH = 'x');
  359.   ClrScr; TextBackground(0);
  360.   J := 1; ICX := 0 ;
  361.   While (Icol[J] > 0) and (J <= 30) do
  362.     Begin
  363.       ICX := ICX + 1;
  364.       J := J + 1;
  365.     End;
  366.   If MinY = 1 then
  367.     Begin
  368.       Icol[Icx+1] := Icol[31];
  369.       IY := Icol[Icx+1]
  370.     End;
  371. End;
  372.  
  373.  
  374.  
  375. Procedure MatrixInvert(Var A:SmallArray; N : Integer );
  376. Var
  377.   KROW,IROW,JJ,KP1  : Integer;
  378.   Inter             : Array[0..50,0..2] of Integer;
  379. {
  380.       THIS SUBROUTINE CALCULATES THE INVERSE OF A MATRIX USING
  381.       PARTIAL PIVOTING, WHICH AVOIDS PROBLEMS WITH VERY SMALL
  382.       PIVOT POINTS
  383.  }
  384.  
  385. Begin
  386.   For K := 1 to N do
  387.     Begin
  388. {
  389.       SEARCH FOR LARGEST PIVOT ELEMENT
  390. }
  391.       JJ := K;
  392.       IF(K <> N) Then
  393.         Begin
  394.           KP1 := K+1;
  395.           Z := ABS(A[K,K]);
  396.           For I := KP1 to N do
  397.             Begin
  398.               V := ABS(A[I,K]);
  399.               IF(Z < V) Then
  400.                 Begin
  401.                   Z := V;
  402.                   JJ := I;
  403.                 End;
  404.             End;
  405.         End;
  406. {
  407.       STORE NUMBERS OF ROWS INTERCHANGED
  408. }
  409.       INTER[K,1] := K ;
  410.       INTER[K,2] := JJ;
  411.       IF(JJ <> K) Then
  412.         Begin
  413. {
  414.       ROW INTERCHANGE
  415. }
  416.           For J :=  1 to N do
  417.             Begin
  418.               W := A[JJ,J];
  419.               A[JJ,J] := A[K,J];
  420.               A[K,J] := W;
  421.             End;
  422.         End;
  423. {
  424.       CALCULATE NEW ELEMENTS OF PIVOT ROW EXCEPT FOR PIVOT ELEMENT
  425. }
  426.       For J := 1 to N do
  427.         Begin
  428.           IF(J <> K) Then
  429.              A[K,J] := A[K,J]/A[K,K];
  430.         End;
  431. {
  432.       CALCULATE NEW ELEMENT REPLACING PIVOT ELEMENT
  433. }
  434.       A[K,K] := 1.0/A[K,K];
  435. {
  436.       CALCULATE NEW ELEMENTS NOT IN PIVOT ROW OR COLUMN
  437. }
  438.       For L := 1 to N do
  439.         Begin
  440.           IF(L <> K) Then
  441.             Begin
  442.               For M := 1 to N do
  443.                 Begin
  444.                   IF(M <> K) Then
  445.                   A[L,M] := A[L,M]-A[K,M]*A[L,K];
  446.                 End;
  447.             End;
  448.         End;
  449. {
  450.       CALCULATE NEW ELEMENTS FOR PIVOT COLUMN, EXCEPT FOR PIVOT ELEMENT
  451. }
  452.       For I := 1 to N do
  453.         Begin
  454.           IF(I <> K) Then
  455.             A[I,K] := -A[I,K]*A[K,K];
  456.         End;
  457.     End;
  458. {
  459.       REARRANGE COLUMNS OF FINAL MATRIX
  460. }
  461.     For L := 1 to N do
  462.       Begin
  463.         K := N - L+1;
  464.         KROW := INTER[K,1];
  465.         IROW := INTER[K,2];
  466.         IF(KROW <> IROW) Then
  467.           Begin
  468.             For I := 1 to N do
  469.               Begin
  470.                 W := A[I,KROW];
  471.                 A[I,KROW] := A[I,IROW];
  472.                 A[I,IROW] := W;
  473.               End;
  474.           End;
  475.       End;
  476. End;
  477.  
  478.  
  479. Procedure StandardDeviation(A,B: Integer;Var StDev: Datarow);
  480. {
  481.       CALCULATES STANDARD DEVIATIONS FOR ALL VARIABLES IN AN ARRAY
  482. }
  483. Var
  484.   V,S1,S2          : Real;
  485. Begin
  486.   Z := Int(Nobs - Skips);
  487.   For K := 1 to B do
  488.     Begin
  489.       S1 := 0.0; S2 := 0.0;
  490.       For J := 1 to A do
  491.         Begin
  492.           If(GetX(J,SC) < 0.0) then
  493.             Begin
  494.               S1 := S1 + GetX(J,K);
  495.               S2 := S2 + GetX(J,K)*GetX(J,K);
  496.             End;
  497.         End;
  498.       V  := (S2-(S1*S1)/Z)/(Z-1.0);
  499.       StDev[K] := Sqrt(V);
  500.     End;
  501. End;
  502.  
  503.  
  504. Procedure Average(Var Avg: DataRow; A,B: Integer);
  505. {
  506.       CALCULATES THE AVERAGES FOR ALL VARIABLES IN AN ARRAY
  507. }
  508. Begin
  509.   Z := Int(Nobs - Skips);
  510.   For I := 1 to B do
  511.     Begin
  512.       Avg[I]:= 0.0;
  513.       For J := 1 to A do
  514.         Begin
  515.           If GetX(J,SC) < 0.0 then
  516.             Avg[I] := Avg[I] + GetX(J,I)
  517.         End;
  518.       Avg[I] := Avg[I]/Z;
  519.     End;
  520. End;
  521.  
  522.  
  523. Procedure Scorr(Rows: IntRow; Nobs,Ind : Integer;
  524.                 Var RR: SmallArray);
  525. {
  526.       CALCULATES THE CROSS CORRELATION COEFFICIENTS FOR SELECTED VARIABLES
  527. }
  528. Var
  529.   D1,D2,X1,X2,X3  : Real;
  530.   I,J,K           : Integer;
  531. Begin
  532.   Z := Int(Nobs - Skips);
  533.   ClrScr; GotoXY(10,12);
  534.   TextBackground(4);
  535.   Writeln(' WAIT A SECOND, I''M THINKING ');
  536.   TextBackground(0);
  537.   FillChar(RR,5400,Chr(0));
  538.   For I := 1 to Nobs do
  539.     Begin
  540.       If GetX(I,SC) < 0.0 then
  541.         Begin
  542.           For J := 1 to Ind do
  543.             Begin
  544.               D1 := GetX(I,Rows[J]) - Avg[Rows[J]];
  545.               For K := 1 to J do
  546.                 Begin
  547.                   D2 := GetX(I,Rows[K])-AVG[Rows[K]];
  548.                   RR[J,K] := RR[J,K] + D1*D2;
  549.                   If J <> K then RR[K,J] := RR[J,K];
  550.                 End;
  551.             End;
  552.         End;
  553.     End;
  554.   For J := 1 to Ind do
  555.     Begin
  556.       Diagonal[J] := RR[J,J];
  557.       Vertical[J] := RR[J,Ind];
  558.     End;
  559.   For J := 1 to Ind do
  560.     Begin
  561.       For K := 1 to J do
  562.         Begin
  563.           X2 := RR[J,K]/Z;
  564.           X1 := SQRT(Diagonal[J]/Z);
  565.           X3 := SQRT(Diagonal[K]/Z);
  566.           If X1*X3 <> 0.0 then
  567.             RR[J,K] := X2/(X1*X3)
  568.           Else
  569.             RR[J,K] := 1.0;
  570.           If(K = J) Then RR[J,K] := 1.0000;
  571.           If K <> J then RR[K,J] := RR[J,K];
  572.         End;
  573.     End;
  574.     ClrScr;
  575. End;
  576.  
  577. Procedure InitCorr;
  578. Begin
  579.   Average(Avg,Nobs,Nvar);
  580.   StandardDeviation(Nobs,Nvar,StDev);
  581. End;
  582.  
  583. Procedure DifSave;
  584.  
  585. {                                                        }
  586. {     PROGRAM TO CONVERT RPLOT DATA FILES TO DIF FORMAT  }
  587. {     FOR USE IN LOTUS, VISICALC, ETC.                   }
  588. {                                                        }
  589. Begin
  590.   Repeat
  591.    Writeln(^J' ENTER A FILENAME. A  ''.DIF'' SUFFIX WILL AUTOMATICALLY ');
  592.    Write(' BE APPENDED TO THE FILE NAME...');
  593.    Readln(FileName);
  594.    If Pos('.',FileName) = 0 then
  595.      FileName := FileName + '.DIF';
  596. {$I-} Assign(OutFile,FileName);
  597.      Rewrite(OutFile); IOCheck; {$I+}
  598.   Until Not IOerr;
  599.   Writeln(OutFile,'TABLE');
  600.   Writeln(OutFile,'0,1');
  601.   Writeln(OutFile,'""');
  602.   Writeln(OutFile,'VECTORS');
  603.   Writeln(OutFile,'0,',Nvar);
  604.   Writeln(OutFile,'""');
  605.   Writeln(OutFile,'TUPLES');
  606.   Writeln(OutFile,'0,',Nobs);
  607.   Writeln(OutFile,'""');
  608.   Writeln(OutFile,'DATA');
  609.   Writeln(OutFile,'0,0');
  610.   Writeln(OutFile,'""');
  611.   Writeln(OutFile,'-1,0');
  612.     For I := 1 to Nobs do
  613.     Begin
  614.       Writeln(OutFile,'BOT');
  615.       For J := 1 to Nvar do
  616.       Begin
  617.         Writeln(OutFile,'0,',GetX(I,J));
  618.         Writeln(OutFile,'V');
  619.       End;
  620.       Writeln(OutFile,'-1,0');
  621.     End;
  622.   Writeln(OutFile,'EOD');
  623.   Close(OutFile);
  624. End;
  625.  
  626. Procedure SetPageSize;
  627. Begin
  628.  If Nvar*Nobs > 10900.0 then
  629.    Begin
  630.      ClrScr;GotoXY(1,12);
  631.      TextBackground(4);
  632.      Write(' TOO MANY DATA POINTS!! ');
  633.      TextBackground(0);
  634.    End
  635.  Else
  636.    Begin
  637.      Release(HeapTop);
  638.      Mark(HeapTop); New(Data);
  639.      MC := Nvar + 8;
  640.      MR := 10900 div MC;
  641.      GotoXY(1,5);
  642.      Writeln(' SUPERSTAT  has sized  the data area to ',MC-3,' columns  ');
  643.      Write(' and ',MR,' rows.  Do you wish to change this');
  644.      If Yes then
  645.        Begin
  646.          Writeln(' To change this configuration, enter the number of ');
  647.          Writeln(' Columns you wish the data area to have ');
  648.          Writeln(' (Remember that Columns*Rows can not be greater than 10000) ');
  649.          Write(' Enter the number of Columns '); Readln(MC);
  650.          MC := MC + 3; MR := 10900 div MC;
  651.        End;
  652.      FC := MC -1; RC := MC ; SC := MC - 2;
  653.      InitializeArray;
  654.    End;
  655. End;
  656.  
  657.  
  658. Procedure DFread ;
  659.  
  660. { PROCEDURE TO READ DIF FILE }
  661.  
  662. Const
  663.   Vectors  = 'VEC';
  664.   Tuples   = 'TUP';
  665.   Bot      = 'BOT';
  666. Var
  667.    KK,S,N                   :     Integer;
  668.    Alpha                    :     string[3];
  669.    V                        :     real;
  670.    NS                       :     string[25];
  671.    Title                    :     string[72];
  672.    AA                       :     string[2];
  673.    SS                       :     string[1];
  674. begin;
  675. ClrScr;
  676.   for I := 1 to 4 do
  677.   begin
  678.     Readln(Infile,Alpha);
  679.     Readln(Infile,SS,Comma,N);
  680.     Readln(Infile,Comma);
  681.     If(Alpha = Vectors) then  Nvar := N;
  682.     If(Alpha = Tuples) then   Nobs := N;
  683.   end;
  684.  SetPageSize;
  685.  KK := 0;
  686.  For I := 1 to Nobs do
  687.   Begin
  688.     Readln(InFile,AA);
  689.     If(AA <> '-1') then Halt;
  690.     Readln(InFile,Alpha);
  691.     If(Alpha <> Bot) then Halt;
  692.       For J := 1 to Nvar do
  693.       Begin
  694.        Readln(InFile,SS,Comma,V);
  695.        Readln(InFile,Title);
  696.        Val(SS,S,Code);
  697.        If(S = 0) then  PutX(V,I,J)
  698.        else
  699.        KK := KK + 1;
  700.       End;
  701.   End;
  702. Close(InFile)
  703. End;
  704.  
  705. Procedure PRN_READ ;
  706. begin;
  707.   ClrScr;
  708.   Write(^J^J' ENTER THE NUMBER OF VARIABLES IN THE PRN FILE...');
  709.   Readln(Nvar);
  710.   Write(^J' ENTER THE NUMBER OF OBSERVATIONS PER VARIABLE ...');
  711.   Readln(Nobs);
  712.   SetPageSize;
  713.   For I := 1 to Nobs do
  714.     Begin
  715.       For J := 1 to Nvar do
  716.         Begin
  717.           Read(InFile,V);
  718.           PutX(V,I,J);
  719.         End;
  720.     End;
  721.   Close(InFile)
  722. End;
  723.  
  724. Procedure SpreadSheet;
  725.  
  726. Procedure ConvertToReal;
  727.   Var
  728.     Len, NDX              :Integer;
  729.   Begin;
  730.     Len := 0; NDX := 0;
  731.     Repeat
  732.       NDX := NDX + 1;
  733.       If(COPY(AMOUNT,NDX,1) = ' ') then  Len := NDX - 1
  734.     Until (Len > 0);
  735.     Val(Copy(AMOUNT,1,Len),W,Code);
  736.     PutX(W,I,J);
  737.    End;
  738.  
  739. Procedure WriteData(Row,Col : Integer);
  740.   Begin
  741.     If(GetX(Row,Col) > -1.0E35) then
  742.        Write(GetX(Row,Col):10:NDP[Col])
  743.     Else Write('          ');
  744.   End;
  745.  
  746. Procedure HiLite;
  747.   Begin
  748.     TextBackground(15);TextColor(0); WriteData(I,J);
  749.     TextBackground(0); TextColor(15);
  750.   End;
  751.  
  752. Procedure Xrow(Start : Integer);
  753.  Var NDX : Integer;
  754.  Begin
  755.    For M := 0 to 5 do
  756.      Begin
  757.        NDX := M*12 + 13;
  758.        GotoXY(NDX,4);
  759.        Write(Start+M:2);
  760.      End;
  761.  End;
  762.  
  763. Procedure Yrow(Start : Integer);
  764. Begin
  765.   For M := 0 to 14 do
  766.     Begin
  767.       GotoXY(1,M+6);
  768.       Write(Start+M:4);
  769.     End;
  770. End;
  771.  
  772. Procedure UnLite;
  773.   Begin
  774.     GotoXY(XPOS,YPOS);
  775.     TextBackground(0) ;WriteData(I,J);
  776.   End;
  777.  
  778.  
  779. Procedure EntString;
  780. Begin
  781.   GotoXY(1,22);Write('Value:  ');ClrEol;
  782. End;
  783.  
  784. Procedure Where(A,B: Integer);
  785. Begin
  786.   GotoXY(1,3);
  787.   Write('Cell[',A:3,',',B:2,']');
  788. End;
  789.  
  790.  
  791. Procedure CheckAmount;
  792. Begin
  793.   If(Copy(Amount,1,10) <> '          ') then
  794.     ConvertToReal;
  795.   GotoXY(XPOS,YPOS);
  796.   WriteData(I,J);
  797.   IY := 0;
  798.   Amount := '          ';
  799. End;
  800.  
  801. Procedure CountData;
  802. Begin
  803.   Nobs := 1; Nvar := 1;
  804.   While GetX(Nobs,1) > -1.0E35 do
  805.     Nobs := Nobs + 1;
  806.   While GetX(1,Nvar) > -1.0E35 do
  807.     Nvar := Nvar + 1;
  808.   Nobs := Nobs - 1; Nvar := Nvar - 1;
  809. End;
  810.  
  811. Procedure ClearPage;
  812. Var
  813.   Clear : Integer;
  814. Begin
  815.   ClrScr;
  816. End;
  817.  
  818. Procedure FillScreen(NewScreen: Panel);
  819. Var
  820.    XX                   : Real;
  821.    Str3                 : String[3];
  822.    I,J                  : Integer;
  823. Begin
  824.    Window(1,1,80,25);
  825.    For I  := 0 to 14 do
  826.      Begin
  827.        Str(I+Ystart:3,Str3);
  828.        For J := 1 to 3 do NewScreen[I+5][J].ch := Str3[J];
  829.        For K := 0 to 5 do
  830.          Begin
  831.            L  := K*12 + 5;
  832.            M  := Xstart + K;
  833.            XX  := GetX(Ystart+I,M);
  834.            If(XX > -1.0E35) then
  835.              Str(XX:10:NDP[M],Stn)
  836.            Else Stn := '          ';
  837.            For J := 1 to 10 do NewScreen[I+5][L+J].ch := Stn[J];
  838.          End;
  839.      End;
  840.      Screen^ := NewScreen;
  841. End;
  842.  
  843. Procedure Move;
  844.   Begin
  845.     If Xstart = LastX then
  846.       Begin
  847.         If(J < Xstart) then Xstart := J;
  848.         If(J > Xstart + 5) then Xstart := J-5;
  849.         If (Xstart < 1) then Xstart := 1;
  850.       End;
  851.     If Xstart <> LastX then
  852.       Begin
  853.         SaveScreen := Screen^
  854.         FillScreen(SaveScreen);
  855.         Xrow(Xstart);
  856.       End;
  857.     If Ystart = LastY then
  858.       Begin
  859.         If(I > (Ystart+14)) then Ystart := I - 14;
  860.         If(I < Ystart)  then Ystart := I ;
  861.         If(I < 2) then Ystart := 1;
  862.       End;
  863.     If Ystart <> LastY then
  864.       Begin
  865.         SaveScreen := Screen^
  866.         FillScreen(SaveScreen);
  867.       End;
  868.     XPOS := 7 + 12*(J - Xstart);
  869.     YPOS := 6 + I - Ystart;
  870.     Where(I,J);
  871.     GotoXY(XPOS,YPOS);Hilite;EntString;
  872.     LastX := Xstart; LastY := Ystart;
  873.   End;
  874.  
  875.  
  876. Procedure ScreenEntry;
  877. Begin
  878.   ClearPage;  Screen := addr(graphics_scrn);
  879.   XPOS := 7;  YPOS := 6;  AMOUNT := '          ';
  880.   Ystart := 1; Xstart := 1; I := 1; J:= 1;
  881.   LastX := Xstart; LastY := Ystart;
  882.   ClrScr;
  883.   TextBackground(15); TextColor(0);
  884.   Write('SUPERSTAT  Statistical Analysis Program ||');
  885.   Writeln(' Type X when  finished ');
  886.   TextBackground(0); TextColor(15);
  887.   GotoXY(1,3); TextBackground(15); TextColor(0);
  888.   Write('            ');
  889.   TextBackground(0); TextColor(15);
  890.   GotoXY(8,5);Write(Line);Write('==========');
  891.   Move;
  892.   Xrow(Xstart);Yrow(Ystart);GotoXY(Xpos,Ypos);HiLite;
  893.   Where(I,J);
  894.   SaveScreen := Screen^
  895.   EntString;
  896.   IY := 0;
  897.   Repeat
  898.   Read(Kbd,CH);
  899.   If(CH = ^[) then
  900.     Read(Kbd,CH);
  901.   If Ch in['M','K','P','H',DC2,'Q','I','G',^I] then
  902.     Begin
  903.       CheckAmount;
  904.       Unlite;
  905.     End;
  906.   Case CH of
  907.     'P':  Begin
  908.             I := I + 1;
  909.             If(I > MR) then I := MR;
  910.           End;
  911.     'H':  Begin
  912.             I  := I - 1;
  913.             If(I < 1) then I := 1;
  914.           End;
  915.     'M':  Begin
  916.             J := J + 1;
  917.             If(J > MC-3) then J := MC-3;
  918.             End;
  919.     'K':  Begin
  920.             J := J - 1;
  921.             If(J < 1) then J := 1;
  922.           End;
  923.  
  924.  
  925.     DC2 :  Begin
  926.             Xstart := Xstart - 6;
  927.             J := J - 6;
  928.             If J < 1 then J := 1;
  929.             If Xstart < 1 then Xstart := 1;
  930.           End;
  931.     'Q':  Begin
  932.             Ystart := Ystart + 14;
  933.             I := I + 14;
  934.             If Ystart > MR - 14 then Ystart := MR - 14;
  935.             If I > MR then I := MR;
  936.          End;
  937.     'I':  Begin
  938.             Ystart := Ystart  - 14;
  939.             I := I - 14;
  940.             If(Ystart < 1) then Ystart := 1;
  941.             If(I < 1) then I := 1;
  942.           End;
  943.     'G':  Begin
  944.             J := 1; I := 1;
  945.           End;
  946.      ^I:  Begin
  947.             Xstart := Xstart + 6;
  948.             If Xstart > MC - 9 then Xstart := MC - 9;
  949.             J := Xstart;
  950.           End;
  951.      End;
  952.   If Ch in['M','K','P','H',DC2,'Q','I','G',^I] then
  953.        Move;
  954.    If(CH in ['E','e','-','.','0'..'9']) then
  955.      Begin
  956.        IY:= IY + 1;
  957.        If (IY > 10) then IY := 10;
  958.        AMOUNT[IY] := CH;
  959.        GotoXY(9,22); Write(Amount);ClrEol;GotoXY(9+IY,22);
  960.      End;
  961.    If( CH = ^M) then
  962.      Begin
  963.        CheckAmount;
  964.        EntString;
  965.      End;
  966.    If (CH = ^H) then
  967.      Begin
  968.        Amount[IY] := ' ';
  969.        GotoXY(9,22);Write(Amount);ClrEol;GotoXY(8+IY,22);IY := IY - 1;
  970.        If (IY < 0) then IY := 0;
  971.      End;
  972.    If (CH = '/') then
  973.      Begin
  974.        GotoXY(1,22);ClrEol;
  975.        Write(' Commands: (F)ormat, (S)ave ');
  976.        Read(Kbd,Ch);Writeln;
  977.        Case Ch of
  978.        'F','f' : Begin
  979.                  SaveScreen := Screen^
  980.                  GotoXY(1,22);ClrEol;
  981.                  Write('Enter the number of Decimal places for this column: ');
  982.                  Readln(NDP[J]);FillScreen(SaveScreen);
  983.                  End;
  984.        'S','s' : Begin
  985.                    CountData;
  986.                    SaveScreen := Screen^
  987.                    ClrScr;
  988.                    GotoXY(1,15);
  989.                    DifSave;
  990.                    FillScreen(SaveScreen);
  991.                  End;
  992.         End;
  993.         EntString;
  994.       End;
  995.   Until (CH = 'X') or (CH = 'x');
  996. End;
  997.  
  998. Begin
  999.   FillChar(Line,81,'=');
  1000.   For I := 1 to MC do NDP[I] := 4;
  1001.   FirstData := Nil;
  1002.   ScreenEntry;
  1003.   CountData;
  1004.   ClrScr;
  1005.   Writeln(' You entered ',Nvar,' variables and ',Nobs,' Observations');
  1006.   Pause;
  1007. End;
  1008.  
  1009. {Print out matrix of correlation coefficients }
  1010.  
  1011. Procedure CorrelationMatrix;
  1012. Begin
  1013.   ClrScr;
  1014.   GotoXY(1,2);
  1015.   Writeln(' This section prints out cross correlation coefficients ');
  1016.   Writeln(' for up to 30 variables at a time.  You must enter the  ');
  1017.   Writeln(' number of variables you wish to see in the Matrix, and ');
  1018.   Writeln(' then you may enter the column numbers of the variables ');
  1019.   Writeln(' in Question '^J);
  1020.   Pause;
  1021.   ChooseColumns(IY,ICX,Icol,2);
  1022.   Scorr(Icol,Nobs,ICX,RR);
  1023.   ClrScr;
  1024.   Writeln(IO,^J^J^J'Correlation Matrix':33);
  1025.   For J := 1 to ICX do
  1026.     Begin
  1027.       Write(IO,'     ');
  1028.       For K := 1 to J do
  1029.             Write(IO,Icol[K]:10); Writeln(IO);
  1030.       Write(IO,^J'  X[',Icol[J]:2,']');
  1031.       For K := 1 to J do
  1032.             Write(IO,RR[J,K]:10:4); Writeln(IO);
  1033.     End;
  1034.   Writeln(IO,^J^J^J);
  1035.   Pause;
  1036. End;
  1037.  
  1038.  
  1039. Procedure ColumnSum(Var A: Real; B,M: Integer);
  1040. Begin
  1041.   A := 0.0;
  1042.   For I := 1 to M do
  1043.     Begin
  1044.       If GetX(I,SC) < 0.0 then
  1045.         A := A + GetX(I,B)
  1046.     End;
  1047. End;
  1048.  
  1049. Procedure DotProduct(Var A: Real; B,C,M: Integer);
  1050. Begin
  1051.   A := 0.0;
  1052.   For I := 1 to M do
  1053.     Begin
  1054.       If GetX(I,SC) < 0.0 then
  1055.         A := A + GetX(I,B)*GetX(I,C)
  1056.     End;
  1057. End;
  1058.  
  1059. Function Minimum(A,B: Integer): Real;
  1060.  Var Min : Real;
  1061. Begin
  1062.   Min := 1.0E30;
  1063.   For K := 1 to  B do
  1064.     Begin
  1065.       If GetX(K,SC) < 0.0 then
  1066.          Begin
  1067.           If GetX(K,A) < Min then
  1068.             Min := GetX(K,A)
  1069.          End;
  1070.     End;
  1071.   Minimum := Min;
  1072. End;
  1073.  
  1074. Function Maximum(Var A,B: Integer): Real;
  1075.  Var Max : Real;
  1076. Begin
  1077.   Max := -1.0E30;
  1078.   For K := 1 to  B do
  1079.     Begin
  1080.       If GetX(K,SC) < 0.0 then
  1081.         Begin
  1082.          If GetX(K,A) > Max then
  1083.            Max := GetX(K,A);
  1084.         End;
  1085.     End;
  1086.   Maximum := Max;
  1087. End;
  1088.  
  1089. Procedure Analysis(L: Integer);
  1090. Var
  1091.   X_P                 : Real;
  1092. Begin
  1093. {
  1094.        CALCULATE PREDICTED Y VALUES AND RESIDUALS
  1095. }
  1096.   SY := 0.0;
  1097.   RSUM := 0.0;
  1098.   SSUM := 0.0;
  1099.   For I := 1 to L do
  1100.     Begin
  1101.       PutX(B[1],I,FC);
  1102.       SY := SY+(GetX(I,IY) - Avg[IY])*(GetX(I,IY) - Avg[IY]);
  1103.       For J := 2 to Degree+1 do
  1104.         Begin
  1105.           X_P := Int(J - 1);
  1106.           W := GetX(I,FC) + B[J]*Power(GetX(I,ICX),X_P);
  1107.           PutX(W,I,FC);
  1108.         End;
  1109.       PutX(GetX(I,IY) - GetX(I,FC),I,RC);
  1110.       RSUM :=RSUM+(GetX(I,FC)- Avg[IY])*(GetX(I,FC)-Avg[IY]);
  1111.       SSUM :=SSUM+(GetX(I,IY)- Avg[IY])*(GetX(I,IY)-Avg[IY]);
  1112.     End;
  1113.   RCP := RSUM/SSUM;
  1114.   RCP := RCP*100.00;
  1115. End;
  1116.  
  1117. {$I B:Simplex.Pas}
  1118.  
  1119. Overlay Procedure PolyRegr;
  1120. Var
  1121.   NP,NP2,KX,IJ,JK,Index    : Integer;
  1122.   PAVG,Sum,Ysum,PS3R,PS4R  : Real;
  1123.  
  1124. Procedure ColumnMultiply;
  1125. Begin
  1126.   For K := 1 to Nobs do
  1127.       PutX(GetX(K,ICX)*GetX(K,Nvar+1),K,Nvar+1);
  1128. End;
  1129.  
  1130. {
  1131. CHOLESKY'S METHOD FOR SOLUTION OF SIMULTANEOUS LINEAR ALGEBRAIC
  1132. EQUATIONS
  1133. }
  1134. Procedure Cholesky(A: SmallArray; M,N: Integer; Var C: SmallRow);
  1135. Var
  1136.  
  1137. M1,IP1,JM1,II,JJ  : Integer;
  1138. J,K,IM1,NN,IL     : Integer;
  1139. Sum               : Real;
  1140.  
  1141. {
  1142. CALCULATE FIRST ROW OF UPPER TRIANGULAR MATRIX
  1143. }
  1144. Begin;
  1145.   M1 := M+1;
  1146.   For J := 1 to M1 do
  1147.       A[1,J] := A[1,J]/A[1,1];
  1148. {
  1149. CALCULATE OTHER ELEMENTS OF U AND L MATRICES
  1150. }
  1151.   For IL := 2 to M do
  1152.     Begin
  1153.       J := IL;
  1154.       For II := J to M do
  1155.         Begin
  1156.           SUM := 0.0;
  1157.           JM1 := J-1;
  1158.           For K := 1 to JM1 do
  1159.             SUM := SUM+A[II,K]*A[K,J];
  1160.           A[II,J] := A[II,J]-SUM;
  1161.         End;
  1162.       IP1 :=IL + 1;
  1163.       For JJ := IP1 to M1 do
  1164.         Begin
  1165.           SUM := 0.0;
  1166.           IM1 := IL - 1;
  1167.           For K := 1 to IM1 do
  1168.             SUM := SUM+A[IL,K]*A[K,JJ];
  1169.           A[IL,JJ] := (A[IL,JJ]-SUM)/A[IL,IL];
  1170.         End;
  1171.     End;
  1172.   C[M] := A[M,M+1];
  1173.   L := M-1;
  1174.   For NN := 1 to L do
  1175.     Begin
  1176.       SUM := 0.0;
  1177.       IL := M-NN;
  1178.       IP1 := IL + 1;
  1179.       For J := IP1 to M do
  1180.       SUM := SUM+A[IL,J]*C[J];
  1181.       C[IL] := A[IL,M1]-SUM;
  1182.     End;
  1183. End;
  1184.  
  1185. Procedure PSXC(Var Z,Sum : Real);
  1186. Begin
  1187.   Sum := 0.0;
  1188.   For N := 1 to Nobs do
  1189.     Sum := Sum + Sqr(GetX(N,Nvar+1) - Z);
  1190. End;
  1191.  
  1192. Begin
  1193.   ClrScr;
  1194.   Writeln(' This section of SUPERSTAT determines polynomial fits');
  1195.   Writeln(' Up to a degree of 20.');
  1196.   Write(^J^J' Enter the degree of the polynomial for this problem: ');
  1197.   Readln(Degree);
  1198.   Write(' Which column contains the X data? '); Readln(ICX);
  1199.   Write(' Which column contains the Y data? '); Readln(IY);
  1200.   Ysum := 0.0;
  1201.   For J := 1 to Nobs do
  1202.     Begin
  1203.       PutX(1.0,J,Nvar+1);
  1204.       Ysum := Ysum + GetX(J,IY);
  1205.     End;
  1206.     SSB0 := Sqr(Ysum)/XNobs;
  1207.     NP := Degree+1;
  1208. {
  1209.       FILL IN CORRELATION MATRIX
  1210. }
  1211.  
  1212.     RR[1,1] := Nobs;
  1213.     RR[1,NP+1] := Ysum;
  1214.     NP2 := 2*Degree;
  1215.     For J := 1 to NP2 do
  1216.       Begin
  1217.         ColumnMultiply;
  1218.         If (J < NP + 1) then  DotProduct(Y,Nvar+1,IY,Nobs);
  1219.         ColumnSum(W,Nvar+1,Nobs);
  1220.         PAVG := W/Xnobs;
  1221.         IF(J < NP) Then  PSXC(PAVG,SX[J]);
  1222.         IJ := J+1 ;
  1223.         IF(IJ < NP) Then
  1224.           RR[IJ,1] := W
  1225.         Else
  1226.           RR[NP,IJ-Degree] := W;
  1227.           IF(J <= Degree) Then RR[J+1,NP+1] := Y;
  1228.         End;
  1229.       For K := 1 to Degree do
  1230.         For J := 1 to Degree do
  1231.           RR[J,K+1] := RR[J+1,K];
  1232.       KX := NP+1;
  1233.       For I := 1 to 21 do B[I] := 0.00;
  1234. {
  1235.       SOLVE THE CORRELATION MATRIX BY CHOLESKY'S METHOD
  1236. }
  1237.       For JK := 1 to NP do
  1238.        T[JK] := RR[JK,NP+1];
  1239.        Cholesky(RR,NP,KX,B);
  1240.        SSB := 0.0;
  1241.        For IJ := 1 to NP do
  1242.          SSB := SSB+B[IJ]*T[IJ];
  1243.        SST := SSB-SSB0;
  1244.        MST := SST/Degree;
  1245.  
  1246.       Analysis(Nobs);
  1247.  
  1248.       SSR :=SY-SST;
  1249.       S2R :=SSR/(NOBS-NP);
  1250.       IF(S2R <> 0.0) Then
  1251.         FX:=MST/S2R
  1252.       Else
  1253.         FX := 1.0E+08;
  1254.       S1R := 0.0010;
  1255.       IF(S2R > 0.0) Then S1R := SQRT(S2R);
  1256.       For J := 1 to Degree do
  1257.         Begin
  1258.           BERR[J] := S1R/SQRT(SX[J]);
  1259.           IF(BERR[J] = 0.0) THEN
  1260.             T[J] := 1.0E+08
  1261.           ELSE
  1262.             T[J] := B[J+1]/BERR[J];
  1263.         End;
  1264.       PS3R:=100.*S1R/Avg[IY];
  1265.       Yrange := Maximum(IY,Nobs) - Minimum(IY,Nobs);
  1266.       PS4R := 100.0*S1R/YRANGE;
  1267.       IF(RCP > 100.0) Then RCP := 100.0 ;
  1268.   ClrScr;Writeln(IO,' The  fit is for a polynomial of degree ',Degree:2);
  1269.   Writeln(IO,' You may wish to try a higher degree. Remember');
  1270.   Writeln(IO,' that a lower degree is better if the regression');
  1271.   Writeln(IO,' equation is suitable'^J);
  1272.   Writeln(IO,' The polynomial correlation coefficients are :'^J);
  1273.   Writeln(IO,' Intercept         ',B[1]:15);
  1274.   Write(IO,'Correlation':31,'Std Error':19);
  1275.   Writeln(IO,'T-Statistic':21);
  1276.   Writeln(IO,'Coefficient':31,'of Coeff.':19);
  1277.   Write(IO,'-----------          --------':49);
  1278.   Writeln(IO,'-----------':21);
  1279.   For J := 2 to NP do
  1280.     Begin
  1281.       K := J-1;
  1282.       Write(IO,' For X**',K:2,'        ',B[J]:15,'    ',Berr[K]:15);
  1283.       Writeln(IO,'         ',T[K]:7:3);
  1284.     End;
  1285.   Writeln(IO,^J' Calculated F-Test : ',FX:15,^J);
  1286.   Writeln(IO,' Standard Error of Y estimate :',S1R:10:6);
  1287.   Writeln(IO,' Standard Error of Y as a ');
  1288.   Writeln(IO,'  Percent of Y average  : ',PS3R:8:4);
  1289.   Writeln(IO,' Standard Error of Y as a ');
  1290.   Writeln(IO,'  Percent of the Range of Y values  : ',PS4R:8:4);
  1291. {
  1292.       CALCULATE CORRELATION COEFFICIENT
  1293. }
  1294.   RCP := RSUM/SSUM;
  1295.   RCP := RCP*100.00;
  1296.   IF(RCP > 100.0) Then RCP := 100.0;
  1297.   Writeln(IO,' The Correlation Coefficient (R-squared) is: ',RCP:8:4,'%'^J);
  1298.   For J := 1 to Nobs do
  1299.     Begin
  1300.       Index := (Nvar*MR) + J;
  1301.       Data^.XX[Index] := -2.0E35;
  1302.     End;
  1303.   Pause;
  1304. End;
  1305.  
  1306. Overlay Procedure Orthogonal;
  1307. Var
  1308.   Regs                   : Array[0..50] of Real;
  1309.   Temp,Temp1,Temp2,Temp3 : Real;
  1310.   Flag0,Flag1,Flag2,Flag3: Boolean;
  1311.   MaxDeg                 : Integer;
  1312.   X0,XN,A,BB,SumY,Xdiv   : Real;
  1313.  
  1314. Function Divisor(K: Integer): Real;
  1315. Begin
  1316.   If K <> 0 then
  1317.     Begin
  1318.       L := K + Nobs + 2;
  1319.       W := 1.0;
  1320.       While (L <> Nobs + 1) do
  1321.         Begin
  1322.           L := L - 1;
  1323.           W := W*L;
  1324.         End;
  1325.       L := Nobs - K;
  1326.       While L <> Nobs do
  1327.         Begin
  1328.           L := L + 1;
  1329.           W := W/L;
  1330.         End;
  1331.       Divisor := W/(K*2+1);
  1332.     End
  1333.   Else
  1334.       Divisor := Nobs+1;
  1335. End;
  1336.  
  1337. Procedure Two;
  1338. Begin
  1339.   J := 11;
  1340.   For I := 0 to MaxDeg do
  1341.     Begin
  1342.       Regs[J] := Regs[J]/Divisor(I);
  1343.       J := J + 1;
  1344.     End;
  1345.   MaxDeg := MaxDeg + 1;
  1346. End;
  1347.  
  1348. Procedure NewDegree;
  1349. Var
  1350.  X1,X2,X3,Index : Integer;
  1351. Begin
  1352.   GotoXY(1,7);
  1353.   Write(' Enter the Degree for this Problem: '^['J');Readln(Degree);
  1354.    X1 := MaxDeg + 12;
  1355.    X2 := MaxDeg*2 + X1 + 3;
  1356.    For J := X1 to X2 do Regs[J] := 0.0;
  1357.    J := 11;
  1358.    I := 11 + MaxDeg + 1;
  1359.    K:= I + MaxDeg + 1;
  1360.    Regs[I] := 1.0;
  1361.    I := I + 1;
  1362.    Regs[I] := 1.0;
  1363.    Regs[K] := Regs[J];
  1364.    Regs[K+1] := Regs[J+1];
  1365.    Regs[1] := 1;
  1366.    Flag0 := False;
  1367.    M := 12;
  1368. End;
  1369.  
  1370. Procedure Clear(Var TF: Boolean);
  1371. Begin
  1372.   TF := False;
  1373. End;
  1374.  
  1375. Procedure SetFlag(Var TF: Boolean);
  1376. Begin
  1377.   TF := True;
  1378. End;
  1379.  
  1380. Procedure CheckFlag;
  1381. Begin
  1382.   Case Flag0 of
  1383.     True: Clear(Flag0);
  1384.     False: SetFlag(Flag0);
  1385.   End;
  1386. End;
  1387.  
  1388. Procedure Five;
  1389. Var Done : Boolean; X: Real;
  1390. Begin
  1391. Done := False;
  1392. Repeat
  1393.   M := M + 1;
  1394.   I := MaxDeg + 11 + 1;
  1395.   If Flag0 = True then I := I + 1;
  1396.   Temp1 := (Nobs+Regs[1]+1.0)*Regs[1]/(Nobs - Regs[1]);
  1397.   X := -Temp1/(Regs[1] + 1);
  1398.   While Round(Regs[I]) <> 0 do
  1399.     Begin
  1400.       Regs[I] := Regs[I]*X;
  1401.       I := I + 2;
  1402.     End;
  1403.   I := MaxDeg + 11;
  1404.   If Flag0 = False then I := I + 1;
  1405.   X := (Regs[1]*2 +1)*Nobs/(Regs[1]+1.0)/(Nobs - Regs[1]);
  1406.   While Round(Regs[I+1]) <> 0 do
  1407.     Begin
  1408.       I := I + 1;
  1409.       Temp1 := X*Regs[I];
  1410.       I := I + 1;
  1411.       Regs[I] := Regs[I] + Temp1;
  1412.     End;
  1413.   Regs[1] := Regs[1] + 1.0;
  1414.   I := MaxDeg + 12;
  1415.   If Flag0 = True then I := I + 1;
  1416.   K := I + MaxDeg + 1;
  1417.   CheckFlag;
  1418.   Temp1 := K - MaxDeg*2.0 - Regs[1];
  1419.   While 15 > Temp1 do
  1420.     Begin
  1421.       Regs[K] := Regs[K] + Regs[M]*Regs[I];
  1422.       K := K + 2;
  1423.       I := I + 2;
  1424.       Temp1 := K - MaxDeg*2.0 - Regs[1];
  1425.     End;
  1426. Until Regs[1] = Degree;
  1427. End;
  1428.  
  1429. Function Factr(X: Real) : Real;
  1430. Begin
  1431.   If X > 0 then
  1432.     Factr := X*Factr(X-1)
  1433.   Else
  1434.     Factr := 1;
  1435. End;
  1436.  
  1437. Procedure Binomial(Var X: Real);
  1438.   Var Y,Z,T : Real;
  1439. Begin
  1440.   If (Regs[3] = 0) or (Regs[2] = 0) or (Regs[2] = Regs[3]) then
  1441.       X := 1
  1442.   Else
  1443.       Begin
  1444.         Y := Factr(Regs[3]); Z := Factr(Regs[2]);
  1445.         Temp3 := Regs[3] - Regs[2];
  1446.         T := Factr(Temp3);
  1447.         X := Y/(Z*T);
  1448.       End;
  1449. End;
  1450.  
  1451. Procedure Coefficients;
  1452. Var
  1453.   N1,N2,N3: Integer; X,Z: Real;
  1454. Begin
  1455.   N1 := MaxDeg*2 + 13 ;
  1456.   N2 := N1 + Degree;
  1457.   Regs[7] := N1;
  1458.   N  := MaxDeg+12;
  1459.   Regs[2] := 0;
  1460.   Regs[3] := 0;
  1461.   For J := N1 to N2 do
  1462.     Begin
  1463.       Regs[10] := 1;
  1464.       X := 0.0;
  1465.       For I := J to N2 do
  1466.         Begin
  1467.           Binomial(Z);
  1468.           X := X + Z*Regs[I]*Regs[10];
  1469.           Regs[10] := Regs[10]*BB;
  1470.           Regs[3] := Regs[3] + 1;
  1471.         End;
  1472.       Regs[2] := Regs[2] + 1;
  1473.       Regs[3] := Regs[2];
  1474.       Regs[N] := X;
  1475.       N := N + 1;
  1476.     End;
  1477.     N3 := N2 - N1;
  1478.     N1 := MaxDeg  + 12;
  1479.     N2 := N1 + N3 ;
  1480.     X := 1.0;
  1481.     For J := N1 to N2 do
  1482.       Begin
  1483.         Regs[J] := Regs[J]*X;
  1484.         X := A*X;
  1485.       End;
  1486.     B[1] := Regs[N1];
  1487.     For J := N1+1 to N2 do
  1488.         B[J+1-N1] := Regs[J];
  1489. End;
  1490.  
  1491. Procedure Initialize;
  1492. Var
  1493.    X,Z: Real;
  1494. Begin
  1495. Clear(Flag0);
  1496. ClrScr; For J := 0 to 50 do Regs[J] := 0.0;
  1497. Writeln(' This section of SUPERSTAT is for the fitting of Orthogonal ');
  1498. Writeln(' Polynomials.  These routines are for data  which the     ');
  1499. Writeln(' Independent variables are '^['&dB EVENLY SPACED '^['&d@');
  1500. Write(' Which column contains your X values? ');Readln(ICX);
  1501. Nobs := Nobs - 1;
  1502. Write(' Which column contains your Y values? ');Readln(IY);
  1503. X0 := GetX(1,ICX);  XN := GetX(Nobs+1,ICX);
  1504. A := -2.0/(XN - X0); BB := (XN + X0)/(XN - X0);
  1505. Write(' Enter the Maximum degree of the Polynomial: ');Readln(MaxDeg);
  1506. For I := 0 to Nobs do
  1507.   Begin
  1508.     Regs[11] := Regs[11] + GetX(I+1,IY);
  1509.     X  := -2.0*I/Nobs  + 1;
  1510.     Z := 1.0;
  1511.     Regs[12] := Regs[12] + X*GetX(I+1,IY);
  1512.     For J := 1 to MaxDeg - 1 do
  1513.       Begin
  1514.         Temp := X;
  1515.         Temp1   := -(Nobs + J + 1)*J*Z;
  1516.         Temp2   := Temp1 +(Nobs - 2*I)*(J*2+1)*X;
  1517.         X := (Temp2/(J+1))/(Nobs-J);
  1518.         Z := Temp;
  1519.         Regs[13+J-1] :=  Regs[13+J-1] + GetX(I+1,IY)*X;
  1520.       End;
  1521.    End;
  1522. End;
  1523.  
  1524. Begin
  1525.   Initialize;
  1526.   Two;
  1527.   Repeat
  1528.     NewDegree;
  1529.     Five;
  1530.     Coefficients;
  1531.     Analysis(Nobs+1);
  1532.     ClrScr;
  1533.     Writeln(IO,IFF,' The  fit is for a polynomial of degree ',Degree:2);
  1534.     Writeln(IO,' You may wish to try a higher degree. Remember');
  1535.     Writeln(IO,' that a lower degree is better if the regression');
  1536.     Writeln(IO,' equation is suitable'^J);
  1537.     Writeln(IO,' The polynomial correlation coefficients are :'^J);
  1538.     Writeln(IO,' Intercept         ',B[1]:15);
  1539.     For J := 2 to Degree+1 do
  1540.       Begin
  1541.         K := J-1;
  1542.         Writeln(IO,' A',K,'                ',B[J]:15);
  1543.       End;
  1544. {
  1545.       CALCULATE CORRELATION COEFFICIENT
  1546. }
  1547.     IF(RCP > 100.0) Then RCP := 100.0;
  1548.     Writeln(IO,' The Correlation Coefficient (R-squared) is: ',RCP:8:4,'%'^J);
  1549.       GotoXY(1,24);ClrEol;
  1550.       Write(' Try Another Degree');
  1551.     Until Not Yes;
  1552.     Nobs := Nobs + 1;
  1553. End;
  1554.  
  1555. Overlay Procedure LinearRegression;
  1556. Var
  1557.   ZZ : Real;
  1558.  
  1559. Procedure Exponential;
  1560. Begin
  1561.   For J := 1 to Nobs do
  1562.     Begin
  1563.       If (GetX(J,IY) > 0) then
  1564.         PutX(Ln(GetX(J,IY)),J,Nvar+1)
  1565.       Else
  1566.         PutX(0.0,J,Nvar+1);
  1567.     End;
  1568.   IY := Nvar + 1;
  1569.   Nvar := Nvar + 1;
  1570.   InitCorr;
  1571.   Nvar := Nvar - 1;
  1572. End;
  1573.  
  1574. Procedure PowerCurve;
  1575. Begin
  1576.   For J := 1 to Nobs do
  1577.     Begin
  1578.       If (GetX(J,IY) > 0) then
  1579.         PutX(Ln(GetX(J,IY)),J,Nvar+1)
  1580.       Else
  1581.         PutX(0.0,J,Nvar+1);
  1582.       If (GetX(J,IIC) > 0) then
  1583.         PutX(Ln(GetX(J,IIC)),J,Nvar+2)
  1584.       Else
  1585.         PutX(0.0,J,Nvar+2);
  1586.     End;
  1587.   IY := Nvar + 1;
  1588.   ICOL[1] := Nvar + 2;
  1589.   Nvar := Nvar + 2;
  1590.   InitCorr;
  1591.   Nvar := Nvar - 2;
  1592. End;
  1593.  
  1594. Procedure Logarithmic;
  1595. Begin
  1596.   For J := 1 to Nobs do
  1597.     Begin
  1598.       If (GetX(J,IIC) > 0.0) then
  1599.         PutX(Ln(GetX(J,IIC)),J,Nvar+1)
  1600.       Else
  1601.         PutX(0.0,J,Nvar+1);
  1602.     End;
  1603.   Icol[1] := Nvar + 1;
  1604.   Nvar := Nvar + 1;
  1605.   InitCorr;
  1606.   Nvar := Nvar - 1;
  1607. End;
  1608.  
  1609.  
  1610. Begin
  1611.   ClrScr;
  1612.   Writeln(' Multiple Linear Regression Section '^@);
  1613.   Writeln(' Any variable may be correlated against as many as 30');
  1614.   Writeln(' Other variables in your data set');
  1615.   Pause;
  1616.   ChooseColumns(IY,ICX,Icol,1);
  1617.   IY1 := IY;
  1618.   CheckSkips;
  1619.   Imod := 1;
  1620.   DF1  := NOBS-Skips-ICX-1;
  1621.   XDF  := 1.000/Int(DF1);
  1622.   TTT  := (1.93237+1.45140*XDF)/(1.0-0.73411*XDF) ;
  1623.   If(ICX = 1) Then
  1624.     Begin
  1625.       IIC := Icol[1];
  1626.       ClrScr;
  1627.       Writeln(' You have entered a simple 2 variable problem ');
  1628.       Writeln('  Y= f(X). Choose one of the following models...');
  1629.       Writeln('  1 - Linear      :  Y = a + b*X   (default)  ');
  1630.       Writeln('  2 - Exponential :  Y = a*EXP(b*X)   ');
  1631.       Writeln('  3 - Power       :  Y = a*X**b       ');
  1632.       Writeln('  4 - Logarithmic :  Y = a + b*LN(X)'^J^J);
  1633.       Writeln('  Enter your choice ... '); Read(Kbd,Ch);
  1634.       Writeln; Imod := Ord(Ch) - 48;
  1635.       Case Imod of
  1636.         2: Exponential;
  1637.         3: PowerCurve;
  1638.         4: Logarithmic;
  1639.       End;
  1640.     End;
  1641. {
  1642.       MOVE APPROPRIATE CORRELATION COEFFICIENTS INTO CORRELATION
  1643.       MATRIX FOR THE PROBLEM AS STATED
  1644. }
  1645.     If (Skips > 0) and (Imod < 2) then
  1646.       InitCorr;
  1647.     Scorr(Icol,Nobs,ICX+1,RR);
  1648. {
  1649.       CALCULATE CORRELATION COEFFICIENTS
  1650. }
  1651.  
  1652.   ZZ:= Int(Nobs - Skips);
  1653.   For I := 1 to ICX do
  1654.     RY[I] := RR[I,ICX+1];
  1655.  
  1656.   MatrixInvert(RR,ICX);
  1657. {
  1658.       MULTIPLY THE INVERSE OF THE X CORRELATION MATRIX
  1659.       BY THE Y CORRELATION MATRIX TO GET THE A MATRIX
  1660. }
  1661.   MatrixMultiply(RY,RR,ICX,A);
  1662.   SY := Diagonal[ICX+1];
  1663.   For I := 1 to ICX do
  1664.     Begin
  1665.       SX[I] := Diagonal[I];
  1666.       SS[I] := Vertical[I];
  1667.     End;
  1668. {
  1669.       CALCULATE CORRELATION COEFFICIENTS
  1670. }
  1671.   For I := 1 to ICX do
  1672.     B[I+1] := A[I]*SQRT(SY/SX[I]);
  1673.   B[1] := AVG[IY];
  1674.   For I := 1 to ICX do
  1675.     Begin
  1676.       B[1] := B[1]-B[I+1]*AVG[Icol[I]];
  1677.     End;
  1678. {
  1679.       CALCULATE ANALYSIS OF VARIANCE FIGURES
  1680. }
  1681.   ColumnSum(YY,IY,Nobs);
  1682.   SSB0 := YY*YY/ZZ;
  1683.   SSB := B[1]*YY;
  1684.   For J := 1 to ICX do
  1685.     Begin
  1686.       N := Icol[J];
  1687.       DotProduct(Z,N,IY,Nobs);
  1688.       SSB := SSB + B[J+1]*Z;
  1689.     End;
  1690.   SST := SSB - SSB0 ;
  1691.   SSR := SY - SST ;
  1692.   S2R := SSR/Int(Nobs -Skips -ICX - 1);
  1693.   S1R := 0.0;
  1694.   If(S2R >= 0) then S1R := SQRT(S2R);
  1695.   MST := SST/ICX ;
  1696.  
  1697. {
  1698.       F TEST
  1699. }
  1700.   If(S2R <> 0.0) then
  1701.     FX := MST/S2R
  1702.   Else
  1703.     FX  :=  1.0E+08;
  1704. {
  1705.       CALCULATE STD. Writeln OF COEFFICIENTS AND T SCORES
  1706. }
  1707.   For I := 1 to ICX do
  1708.     Begin
  1709.       BERR[I] := S1R/SQRT(SX[I]);
  1710.       If(BERR[I] = 0) THEN
  1711.         T[I]  :=  1.0E+08
  1712.       ELSE
  1713.         T[I] := B[I+1]/BERR[I];
  1714.       BMIN[I] := B[I+1]-TTT*BERR[I];
  1715.       BMAX[I] := B[I+1]+TTT*BERR[I];
  1716.     End;
  1717. {
  1718.       CALCULATE R-SQUARED FOR THE REGRESSION
  1719. }
  1720.   RC1 := SST/SY;
  1721.   RC2 := 1.000-(1.000-RC1)*((ZZ-1.0000)/(ZZ-Int(ICX))) ;
  1722.   RC1 := 100.0*RC1;
  1723.   If(RC1 > 100.0) then RC1 := 100.;
  1724.   RC2 := 100.0*RC2 ;
  1725.   If(RC2 > 100.0) then RC2 := 100. ;
  1726. {
  1727.       CALCULATE PREDICTED Y VALUES AND RESIDUALS
  1728. }
  1729.   If ICX = 1 then
  1730.     Begin
  1731.       If(IMOD = 2) or (IMOD = 3) then B[1] := Exp(B[1]);
  1732.       Icol[1] := IIC;
  1733.       IY := IY1;
  1734.     End;
  1735.   For  J := 1 to NOBS do
  1736.     Begin
  1737.       If ICX = 1 then
  1738.         Begin
  1739.           Case Imod of
  1740.            1: W := B[1] + B[2]*GetX(J,IIC);
  1741.            2: W := B[1]*Exp(B[2]*GetX(J,IIC));
  1742.            3: W := B[1]*Power(GetX(J,IIC),B[2]);
  1743.            4: W := B[1] + B[2]*Ln(GetX(J,IIC));
  1744.           End;
  1745.           PutX(W,J,FC);
  1746.         End
  1747.       Else
  1748.         Begin
  1749.           PutX(B[1],J,FC);
  1750.           For K := 1 to ICX do
  1751.             Begin
  1752.               N := Icol[K];
  1753.               W := GetX(J,FC)+B[K+1]*GetX(J,N);
  1754.               PutX(W,J,FC);
  1755.             End;
  1756.         End;
  1757.       W := GetX(J,IY)-GetX(J,FC);
  1758.       PutX(W,J,RC);
  1759.     End;
  1760.   Yrange := Maximum(IY,Nobs) - Minimum(IY,Nobs);
  1761.   PSDR1 := 100.0*S1R/Yrange;
  1762.   PSDR := 100.0*S1R/AVG[IY];
  1763.   If(IMOD = 3) or (IMOD = 4) then ICOL[1] := IIC ;
  1764.   Writeln(IO,IFF,'Linear Regression Results':43,^J^J);
  1765.   Case Imod of
  1766.     2: Writeln(IO,'  Exponential Curve: Y  =  a*EXP(b*X) '^J);
  1767.     3: Writeln(IO,'  Power Curve      : Y  =  a*X**b '^J);
  1768.     4: Writeln(IO,'  Logarithmic Curve: Y  =  a + b*ALOG(X) '^J);
  1769.   End;
  1770.   Writeln(IO,'Standard':25,'   Correl   Regression    Std Error of    T');
  1771.   Write(IO,'  X     Mean    Deviation   X vs Y   Coefficient   Reg. Coeff.');
  1772.   Writeln(IO,'  Value');
  1773.   Write(IO,'-----   -----   ----------  ------   -----------   ----------');
  1774.   Writeln(IO,'  ------');
  1775.   For J := 1 to ICX do
  1776.     Begin
  1777.       N := ICOL[J];
  1778.       Write(IO,N:2,'   ',AVG[N]:8:3,'  ',StDev[N]:8:4,'     ',RY[J]:6:4);
  1779.       Writeln(IO,'   ',B[J+1]:11,'   ',Berr[J]:11,'  ',T[J]:6:2);
  1780.       Writeln(IO,^J' Limits of Regression       Upper   ',Bmax[J]:11);
  1781.       Writeln(IO,' Coefficient (95% Conf.)    Lower   ',Bmin[J]:11,^J);
  1782.     End;
  1783.     Writeln(IO,^J'Standard':22);
  1784.     Writeln(IO,'  Y     Mean    Deviation');
  1785.     Writeln(IO,'-----   -----   ----------');
  1786.     Writeln(IO,' ',IY:2,'   ',Avg[IY]:8:3,'  ',StDev[IY]:8:4);
  1787.     If(IMOD = 2) or (IMOD = 3) then
  1788.       Bmod := EXP(B[1])
  1789.     Else
  1790.       Bmod := B[1];
  1791.     Writeln(IO,^J' Y  Intercept',':  ':26,Bmod:15);
  1792.     Writeln(IO,^J' R-squared For Correlation          :  ',RC1:8:4);
  1793.     Writeln(IO,^J' R-squared, Adjusted for Degrees');
  1794.     Writeln(IO,' of Freedom',':  ':28,RC2:8:4);
  1795.     Writeln(IO,^J' Std. error of Y estimate           :  ',S1R:8:5);
  1796.     Writeln(IO,^J' Std. error as a percent of Y Avg.  :  ',PSDR:8:4);
  1797.     Writeln(IO,^J' Std. error as a percent of the ');
  1798.     Writeln(IO,' Range of Y values                  :  ',PSDR1:8:4);
  1799.     Pause;
  1800.     Writeln(IO,^J'         Analysis of Variance Table for the Regression'^J);
  1801.     Writeln(IO,'             Degrees      Sum Of       Mean      Calculated');
  1802.     Writeln(IO,'   Source   of Freedom    Squares     Squares     F - Value');
  1803.     Writeln(IO,'    ----     --------      -----       -----       -------');
  1804.     Write(IO,' Regression    ',ICX:2,'        ',SST:7:4,'     ',MST:7:4);
  1805.     Writeln(IO,'      ',FX:7:4);
  1806.     Writeln(IO,^J' Residual     ',DF1:2,'        ',SSR:7:4,'     ',S2R:7:4);
  1807.     DF := NOBS-Skips-1;
  1808.     Writeln(IO,^J'  Total,  '^J^M'  Corrected    ',DF:2,'        ',SY:7:4,^J);
  1809.   If Skips > 0 then
  1810.     Begin
  1811.       UnsKip;
  1812.       Skips := 0;
  1813.       InitCorr;
  1814.     End;
  1815.   Pause;
  1816. End;
  1817.  
  1818. (* {$I B:Plot2.Ovl}  *)
  1819. Procedure Output;
  1820. Begin
  1821.   ClrScr;GotoXY(1,8);Iff := ' ';
  1822.   Writeln(' Do you wish output to go to :');
  1823.   Writeln(' 1 - Your Screen');
  1824.   Writeln(' 2 - The Printer, or');
  1825.   Writeln(' 3 - A disc File ');
  1826.   Read(KBD,Ch);
  1827.   If (Ch = '1') then
  1828.     Begin
  1829.       Assign(IO,'CON:');
  1830.       Reset(IO);
  1831.     End
  1832.   Else  If (Ch = '2') then
  1833.     Begin
  1834.       Assign(IO,'LST:');
  1835.       Reset(IO);
  1836.       Iff := ^L;
  1837.     End
  1838.   Else If (Ch = '3') then
  1839.     Begin
  1840.       Repeat
  1841.         Write(' Enter a filename for output: ');
  1842.         Read(FileName);
  1843.         Assign(IO,FileName);
  1844. {$I-}   Rewrite(IO);  IOCheck; {$I+}
  1845.       Until Not IOErr;
  1846.       FileWrite := True;
  1847.     End;
  1848.  
  1849. End;
  1850.  
  1851. Procedure ResidualTable;
  1852. {
  1853.       RESIDUAL ANALYSIS SECTION
  1854. }
  1855. Begin
  1856.   ClrScr;
  1857.   Writeln(IO,Iff,'Residual Table:40'^J^J);
  1858.   Write(IO,'  Observation ');
  1859.   Writeln(IO,'Percent':15);
  1860.   Write(IO,'     Number         Y-Actual        Y-Calc');
  1861.   Writeln(IO,'        Residual    Deviation'^J^J);
  1862.   For J := 1 to Nobs do
  1863.     Begin
  1864.       If GetX(J,IY) <> 0.0 then
  1865.         W := 100.0*(GetX(J,FC)-GetX(J,IY))/GetX(J,IY);
  1866.       Write(IO,'      ',J:2,'       ',GetX(J,IY):15,'  ');
  1867.       Write(IO,GetX(J,FC):15,' ',GetX(J,RC):15,' ');
  1868.       If GetX(J,IY) <> 0.0 then
  1869.         Writeln(IO,W:8:3)
  1870.       Else
  1871.         Writeln(IO,'********');
  1872.     End;
  1873.     Pause;
  1874. End;
  1875.  
  1876. Procedure ModifyData;
  1877.   Var
  1878.     A: Char;  XX : Real; MaxC, NN : Integer;
  1879. Begin
  1880.   N := Nvar; MaxC := Nvar;
  1881.   Repeat
  1882.     ClrScr;
  1883.     Writeln(^J^J' You may modify colums of data as follows :');
  1884.     Writeln(' 1 - Multiply two columns or a constant and a column');
  1885.     Writeln(' 2 - Take the Natural log of a column');
  1886.     Writeln(' 3 - Divide two columns or a constant and a column');
  1887.     Writeln(' 4 - Exponentiate a column ( Col B = Exp(Col A))  ');
  1888.     Writeln(' 5 - Raise a column to a power ');
  1889.     Writeln(' 6 - Add/Subtract two columns or a constant and a column');
  1890.     Writeln(' 7 - Normalize a column of data');
  1891.     Writeln(' 8 - Save data to a DIF file');
  1892.     Writeln(' 0 - Quit the Data Modification section ');
  1893.     Writeln(' Enter your choice : ');
  1894.   Read(Kbd,CH);
  1895.   NN := Nvar + 1;
  1896.   If(Ch <> '0') and (Ch <> '7') then
  1897.     Begin
  1898.       ClrScr;
  1899.       Writeln(' You have ',Nvar:2,' columns of data. You may  ');
  1900.       Writeln(' Overwrite data in any of these columns if you wish');
  1901.       Writeln(' or store data in the next available empty column, ');
  1902.       Writeln(' which is column ',NN:2,^J^J);
  1903.     End;
  1904.     Case Ch of
  1905. {
  1906.       MULTIPLY TWO COLUMNS TOGETHER
  1907. }
  1908.    '1': Begin
  1909.          Writeln(' You may:');
  1910.          Writeln(' 1 - multiply a column by a constant, or');
  1911.          Writeln(' 2 - multiply two columns together');
  1912.          Writeln(^J' Enter your choice: ');
  1913.          Read(Kbd,A);Writeln;
  1914. {
  1915.       MULTIPLY A COLUMN BY A CONSTANT
  1916. }
  1917.          Case A of
  1918.         '1': Begin
  1919.               Write(' Column C= Column A * Constant X, enter A,X,C :');
  1920.               Readln(M,XX,N);
  1921.               For I := 1 to Nobs do
  1922.                PutX(XX*GetX(I,M),I,N);
  1923.              End;
  1924. {
  1925.       MULTIPLY ONE COLUMN BY ANOTHER
  1926. }
  1927.       '2': Begin
  1928.              Write(' Column C = Column A*Column B, Enter A,B,C : ');
  1929.              Readln(L,M,N);
  1930.              For I := 1 to Nobs do
  1931.                PutX(GetX(I,L)*GetX(I,M),I,N);
  1932.            End;
  1933.         End;
  1934.       End;
  1935. {
  1936.       TAKE THE LOG OF A COLUMN
  1937. }
  1938.    '2': Begin
  1939.           Write('Column C = Ln(Column A) - Enter A and C');
  1940.           Readln(M,N);
  1941.           For I := 1 to Nobs do
  1942.             PutX(Ln(GetX(I,M)),I,N);
  1943.         End;
  1944. {
  1945.       DIVIDE TWO COLUMNS
  1946. }
  1947.    '3': Begin
  1948.           Writeln(' You may:');
  1949.           Writeln(' 1 - divide a column by a constant, or');
  1950.           Writeln(' 2 - divide one column by another');
  1951.           Writeln(^J' Enter your choice: ');
  1952.           Read(Kbd,A);Writeln;
  1953.          Case A of
  1954.        '1': Begin
  1955.               Write(' Column C= Column A / Constant X, enter A,X,C :');
  1956.               Readln(M,XX,N);
  1957.               For I := 1 to Nobs do
  1958.                 PutX(GetX(I,M)/XX,I,N);
  1959.             End;
  1960.        '2': Begin
  1961.               Write(' Column C = Column A/Column B, Enter A,B,C : ');
  1962.               Readln(L,M,N);
  1963.               For I := 1 to Nobs do
  1964.                 PutX(GetX(I,L)/GetX(I,M),I,N);
  1965.             End;
  1966.          End;
  1967.        End;
  1968. {
  1969.       EXPONENTIAL FUNCTION
  1970. }
  1971.    '4': Begin
  1972.           Write(' Column C = EXP( Column A) - Enter A, C : ');
  1973.           Readln(L,N);
  1974.           For I := 1 to Nobs do
  1975.             PutX(Exp(GetX(I,L)),I,N);
  1976.         End;
  1977. {
  1978.       RAISE A COLUMN TO A POWER
  1979. }
  1980.    '5': Begin
  1981.           Write(' Column C = Column A**X ,  Enter A, C, X: ');
  1982.           Readln(L,N,XX);
  1983.           For I := 1 to Nobs do
  1984.             PutX(Power(GetX(I,L),XX),I,N);
  1985.         End;
  1986. {
  1987.       ADD TWO COLUMNS
  1988. }
  1989.    '6': Begin
  1990.          Writeln('You may :');
  1991.          Writeln(' 1 - Add/Subtract a constant to/from a column ');
  1992.          Writeln(' 2 - Add/Subtract any two columns');
  1993.          Writeln('  Enter your choice: '); Read(Kbd,A);Writeln;
  1994.          Case A of
  1995.          '1': Begin
  1996.                Writeln(' Column C = Column A + B (Constant). Enter A, B, C ');
  1997.                Write(' Enter a Negative constant to subtract !: ');
  1998.                Readln(L,XX,N);
  1999.                For I := 1 to Nobs do
  2000.                   PutX(GetX(I,L) + XX,I,N);
  2001.               End;
  2002.          '2': Begin
  2003.                Writeln(' Column C = Column A + Column B, Enter A, B, C ');
  2004.                Write(' To subtract, enter a the negative of B : ');
  2005.                Readln(L,M,N);K := Abs(M);
  2006.                For I := 1 to Nobs do
  2007.                  Begin
  2008.                    If M < 0 then
  2009.                      PutX(GetX(I,L) + GetX(I,K),I,N)
  2010.                    Else
  2011.                      PutX(GetX(I,L) - GetX(I,K),I,N);
  2012.                  End;
  2013.               End;
  2014.         End;
  2015.         End;
  2016. {
  2017. }
  2018.     '7': Begin
  2019.            Writeln(' Enter the column number of the data you wish to');
  2020.            Writeln(' normalize, and a column number where the results should');
  2021.            Write(' be placed: ');Readln(L,N);
  2022.            For I := 1 to Nobs do
  2023.              Begin
  2024.                XX := (GetX(I,L) - Avg[L])/StDev[L];
  2025.                PutX(XX,I,N);
  2026.              End;
  2027.          End;
  2028.     '8': Begin
  2029.           ClrScr;
  2030.           DifSave;
  2031.          End;
  2032.       End;
  2033.       If N > Nvar then Nvar := Nvar + 1;
  2034.       If N > MaxC then Maxc := N;
  2035.   Until Ch = '0';
  2036.   InitCorr;
  2037.  
  2038. End;
  2039. Procedure InputData;
  2040.  
  2041. {
  2042.        This is a simple program to list out the directory of the
  2043.        current (logged) drive.
  2044. }
  2045. type
  2046.   Char15arr            = array [ 1..15 ] of Char;
  2047.   String20             = string[ 20 ];
  2048.   Suffix               = array [1..3] of Char;
  2049. Var
  2050.   NamR                 : Array[1..20] of String20;
  2051.   I,J,Number           : Integer;
  2052.   Open                 : Boolean;
  2053.   Types                : array[1..2] of Suffix;
  2054.  
  2055. Procedure DirList(Descriptor: Suffix; Var Found: Boolean);
  2056. var
  2057.   DTA                  : array [ 1..43 ] of Byte;
  2058.   Mask                 : Char15arr;
  2059.   Error, Default       : Integer;
  2060.   Drive                : Array[1..2] of Char;
  2061. begin { main body of program DirList }
  2062.   ClrScr;
  2063.   Drive[1] := 'B'; Drive[2] := 'A';
  2064.   FillChar(DTA,SizeOf(DTA),0);        { Initialize the DTA buffer }
  2065.   FillChar(Mask,SizeOf(Mask),0);      { Initialize the mask }
  2066.   FillChar(NamR,SizeOf(NamR),0);      { Initialize the file name }
  2067.  
  2068.   Result.AX := $1A00;         { Function used to set the DTA }
  2069.   Result.DS := Seg(DTA);      { store the parameter segment in DS }
  2070.   Result.DX := Ofs(DTA);      {   "    "      "     offset in DX }
  2071.   MSDos(Result);              { Set DTA location }
  2072.   Result.AX := $1900;
  2073.   MSDos(Result);
  2074.   Default := (Result.AX and $FF ) + 1;
  2075.   Error := 0;
  2076.   WriteLn(Descriptor,' Files on Drive ',Drive[Default]);
  2077.   WriteLn;
  2078.   Mask := ' :\????????.   ';
  2079.   Mask[1] := Drive[Default];
  2080.   Mask[13] := Descriptor[1];
  2081.   Mask[14] := Descriptor[2];
  2082.   Mask[15] := Descriptor[3];
  2083.   Result.AX := $4E00;
  2084.   Result.DS := Seg(Mask);
  2085.   Result.DX := Ofs(Mask);
  2086.   Result.CX := 22;
  2087.   MSDos(Result);
  2088.   Error := Result.AX and $FF;
  2089.   I := 1;
  2090.   J := 1;
  2091.   if (Error = 0) then
  2092.     repeat
  2093.       NamR[J][I] := Chr(Mem[Seg(DTA):Ofs(DTA)+29+I]);
  2094.       I := I + 1;
  2095.     until not (NamR[J][I-1] in [' '..'~']) or (I>20);
  2096.  
  2097.   NamR[J][0] := Chr(I-1);
  2098.   while (Error = 0) do begin
  2099.     Error := 0;
  2100.     Result.AX := $4F00;
  2101.     Result.CX := 22;
  2102.     MSDos( Result );
  2103.     Error := Result.AX and $FF;
  2104.     J := J + 1;
  2105.     I := 1;
  2106.     repeat
  2107.       NamR[J][I] := Chr(Mem[Seg(DTA):Ofs(DTA)+29+I]);
  2108.       I := I + 1;
  2109.     until not (NamR[J][I-1] in [' '..'~'] ) or (I > 20);
  2110.     NamR[J][0] := Chr(I-1);
  2111.   end ;
  2112.   GotoXY(1,5);
  2113.   FileName[1] := Drive[Default];
  2114.   FileName[2] := ':';
  2115.   FileName[3] := '\';
  2116.   Found := False;
  2117.   If J-1 > 0 then
  2118.     Begin
  2119.       For I := 1 to J - 1  do
  2120.         Writeln(Chr(64+I),':   ',Namr[I]);
  2121.       GotoXY(1,22);
  2122.       Write(' Choose the file you want by letter, hit <ESC> to exit ');
  2123.       Read(Kbd,Ch);
  2124.       Ch := UpCase(Ch);
  2125.       Number := Ord(Ch) - 64;
  2126.       If Number in[1..J-1] then
  2127.         Begin
  2128.           Insert(NamR[Number],FileName,4);
  2129.           Found := True;
  2130.         End;
  2131.     End
  2132.   Else
  2133.     Begin
  2134.       Writeln(' No ',Descriptor,' Files Found on Drive ',Drive[Default]);
  2135.       Found := False ;
  2136.       Pause;
  2137.     End;
  2138. End;
  2139.  
  2140. Begin
  2141.   Repeat
  2142.     Types[1] := 'DIF'; Types[2] := 'PRN';
  2143.     ClrScr;  Skips := 0;
  2144.     Writeln(' YOU HAVE THE FOLLOWING OPTIONS : '^J);
  2145.     Writeln(' 1 - READ NEW DATA FROM A DIF FILE ');
  2146.     Writeln(' 2 - READ NEW DATA FROM A LOTUS PRN FILE ');
  2147.     Writeln(' 3 - INPUT NEW DATA VIA THE SPREADSHEET, OR ');
  2148.     Writeln(' 4 - MODIFY/ADD TO EXISTING DATA VIA THE SPREADSHEET');
  2149.     Writeln(^J' Enter your Choice '); Read(Kbd,CH);
  2150.   Until Ch in['1','2','3','4'];
  2151.   L := Ord(Ch) - 48;
  2152.   Case L of
  2153.     1,2: Begin
  2154.            FileName := '                    ';
  2155.            DirList(Types[L],Open);
  2156.            If Open then
  2157.              Begin
  2158.                GotoXY(1,15);
  2159.                Write(' Opening File : ');
  2160.                Writeln(FileName);
  2161.    {$I-}       Reset(InFile);  IOCheck;  {$I+}
  2162.              End;
  2163.            If Open then
  2164.              If (L = 1) then DFRead else PRN_Read;
  2165.          End;
  2166.     3  : Begin
  2167.            Release(HeapTop);
  2168.            Mark(HeapTop); New(Data);
  2169.            MC := 45; MR := 200; SC := 43;
  2170.            FC := 44; RC := 45;
  2171.            InitializeArray;
  2172.            SpreadSheet;
  2173.            Open := True;
  2174.          End;
  2175.     4  : Begin
  2176.            SpreadSheet;
  2177.            Open := True;
  2178.          End;
  2179.   End;
  2180.   If Open then InitCorr;
  2181.   Xnobs := Int(Nobs);
  2182. End;
  2183.  
  2184. Begin
  2185. {
  2186.       THE DATA ARRAYS ARE DIMENSIONED TO READ UP TO 200 OBSERVATIONS
  2187.       OF 50 DIFFERENT VARIABLES, AND ANALYZE THE EFFECTS OF UP TO 20
  2188.       OF THESE VARIABLES ON ANY INDEPENDANT VARIABLE (Y)
  2189. }
  2190.   ClrScr;  PlotCall := 0;
  2191.   GotoXY(1,10); TextBackground(0); TextColor(15);
  2192.   Writeln(' Welcome to SUPERSTAT, the Statistical analysis program. This ');
  2193.   Writeln(' program currently reads data in DIF format files such as Lotus');
  2194.   Writeln(' 1,2,3 or Visicalc can create, or Lotus PRN files .');
  2195.   Writeln(' You may also enter data interactively via a spreadsheet-like');
  2196.   Writeln(' Interface. This data can then be saved to a DIF File. Output');
  2197.   Writeln(' is initially directed to the screen. ');
  2198.   Assign(IO,'CON:');
  2199.   Reset(IO);
  2200.   Mark(HeapTop);
  2201.   New(Data);
  2202.   Pause;
  2203.   Repeat
  2204.     ClrScr;GotoXY(1,8);
  2205.     Writeln(' Choose from the Following Options');
  2206.     Writeln(' 1 - Enter/Modify a Data Set');
  2207.     Writeln(' 2 - Correlation Matrix');
  2208.     Writeln(' 3 - Multiple Linear Regression');
  2209.     Writeln(' 4 - Polynomial Regression');
  2210.     Writeln(' 5 - Orthogonal Polynomials');
  2211.     Writeln(' 6 - Simplex Non-Linear curve fitting');
  2212.     Writeln(' 7 - Residual Table');
  2213.     Writeln(' 8 - Modify Data');
  2214.     Writeln(' 9 - Change Output Device');
  2215. {   Writeln(' P - Plot Data');       }
  2216.     Writeln(' X - Exit the Program');
  2217.     Read(Kbd,Ch);
  2218.     Case Ch of
  2219.       'X','x'         : Begin
  2220.                          Ch := ' ';
  2221.                          GotoXY(1,22);ClrEol;
  2222.                          Write(' Sure you want to Exit');
  2223.                          If Yes then
  2224.                            Ch := 'X';
  2225.                         End;
  2226.       '1'             : InputData;
  2227.       '2'             : CorrelationMatrix;
  2228.       '3'             : LinearRegression;
  2229.       '4'             : PolyRegr;
  2230.       '5'             : Orthogonal;
  2231.       '6'             : Simplex;
  2232.       '7'             : ResidualTable;
  2233.       '8'             : ModifyData;
  2234.       '9'             : OutPut;
  2235. {     'P','p'         : DataPlot;   }
  2236.     End;
  2237.   Until Ch = 'X';
  2238.   GotoXY(1,22);ClrEol;Write(' Do you need to save your data');
  2239.   If Yes then DifSave;
  2240.   If FileWrite then
  2241.     Begin
  2242.       Flush(IO);
  2243.       Close(IO);
  2244.     End;
  2245.   Release(HeapTop);
  2246. End.
  2247.  
  2248.  
  2249.