home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / TURBOPAS / HPSTAT.ZIP / HPSTAT.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1986-04-14  |  56.9 KB  |  2,248 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.    NewScreen := Screen^;
  825.    Window(1,1,80,25);
  826.    For I  := 0 to 14 do
  827.      Begin
  828.        Str(I+Ystart:3,Str3);
  829.        For J := 1 to 3 do NewScreen[I+5][J].ch := Str3[J];
  830.        For K := 0 to 5 do
  831.          Begin
  832.            L  := K*12 + 5;
  833.            M  := Xstart + K;
  834.            XX  := GetX(Ystart+I,M);
  835.            If(XX > -1.0E35) then
  836.              Str(XX:10:NDP[M],Stn)
  837.            Else Stn := '          ';
  838.            For J := 1 to 10 do NewScreen[I+5][L+J].ch := Stn[J];
  839.          End;
  840.      End;
  841.      Screen^ := NewScreen;
  842. End;
  843.  
  844. Procedure Move;
  845.   Begin
  846.     If Xstart = LastX then
  847.       Begin
  848.         If(J < Xstart) then Xstart := J;
  849.         If(J > Xstart + 5) then Xstart := J-5;
  850.         If (Xstart < 1) then Xstart := 1;
  851.       End;
  852.     If Xstart <> LastX then
  853.       Begin
  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.         FillScreen(SaveScreen);
  866.       End;
  867.     XPOS := 7 + 12*(J - Xstart);
  868.     YPOS := 6 + I - Ystart;
  869.     Where(I,J);
  870.     GotoXY(XPOS,YPOS);Hilite;EntString;
  871.     LastX := Xstart; LastY := Ystart;
  872.   End;
  873.  
  874.  
  875. Procedure ScreenEntry;
  876. Begin
  877.   ClearPage;  Screen := addr(graphics_scrn);
  878.   XPOS := 7;  YPOS := 6;  AMOUNT := '          ';
  879.   Ystart := 1; Xstart := 1; I := 1; J:= 1;
  880.   LastX := Xstart; LastY := Ystart;
  881.   ClrScr;
  882.   TextBackground(15); TextColor(0);
  883.   Write('SUPERSTAT  Statistical Analysis Program ||');
  884.   Writeln(' Type X when  finished ');
  885.   TextBackground(0); TextColor(15);
  886.   GotoXY(1,3); TextBackground(15); TextColor(0);
  887.   Write('            ');
  888.   TextBackground(0); TextColor(15);
  889.   GotoXY(8,5);Write(Line);Write('==========');
  890.   Move;
  891.   Xrow(Xstart);Yrow(Ystart);GotoXY(Xpos,Ypos);HiLite;
  892.   Where(I,J);
  893.   FillScreen(SaveScreen);
  894.   EntString;
  895.   IY := 0;
  896.   Repeat
  897.   Read(Kbd,CH);
  898.   If(CH = ^[) then
  899.     Read(Kbd,CH);
  900.   If Ch in['M','K','P','H',DC2,'Q','I','G',^I] then
  901.     Begin
  902.       CheckAmount;
  903.       Unlite;
  904.     End;
  905.   Case CH of
  906.     'P':  Begin
  907.             I := I + 1;
  908.             If(I > MR) then I := MR;
  909.           End;
  910.     'H':  Begin
  911.             I  := I - 1;
  912.             If(I < 1) then I := 1;
  913.           End;
  914.     'M':  Begin
  915.             J := J + 1;
  916.             If(J > MC-3) then J := MC-3;
  917.             End;
  918.     'K':  Begin
  919.             J := J - 1;
  920.             If(J < 1) then J := 1;
  921.           End;
  922.  
  923.  
  924.     DC2 :  Begin
  925.             Xstart := Xstart - 6;
  926.             J := J - 6;
  927.             If J < 1 then J := 1;
  928.             If Xstart < 1 then Xstart := 1;
  929.           End;
  930.     'Q':  Begin
  931.             Ystart := Ystart + 14;
  932.             I := I + 14;
  933.             If Ystart > MR - 14 then Ystart := MR - 14;
  934.             If I > MR then I := MR;
  935.          End;
  936.     'I':  Begin
  937.             Ystart := Ystart  - 14;
  938.             I := I - 14;
  939.             If(Ystart < 1) then Ystart := 1;
  940.             If(I < 1) then I := 1;
  941.           End;
  942.     'G':  Begin
  943.             J := 1; I := 1;
  944.           End;
  945.      ^I:  Begin
  946.             Xstart := Xstart + 6;
  947.             If Xstart > MC - 9 then Xstart := MC - 9;
  948.             J := Xstart;
  949.           End;
  950.      End;
  951.   If Ch in['M','K','P','H',DC2,'Q','I','G',^I] then
  952.        Move;
  953.    If(CH in ['E','e','-','.','0'..'9']) then
  954.      Begin
  955.        IY:= IY + 1;
  956.        If (IY > 10) then IY := 10;
  957.        AMOUNT[IY] := CH;
  958.        GotoXY(9,22); Write(Amount);ClrEol;GotoXY(9+IY,22);
  959.      End;
  960.    If( CH = ^M) then
  961.      Begin
  962.        CheckAmount;
  963.        EntString;
  964.      End;
  965.    If (CH = ^H) then
  966.      Begin
  967.        Amount[IY] := ' ';
  968.        GotoXY(9,22);Write(Amount);ClrEol;GotoXY(8+IY,22);IY := IY - 1;
  969.        If (IY < 0) then IY := 0;
  970.      End;
  971.    If (CH = '/') then
  972.      Begin
  973.        GotoXY(1,22);ClrEol;
  974.        Write(' Commands: (F)ormat, (S)ave ');
  975.        Read(Kbd,Ch);Writeln;
  976.        Case Ch of
  977.        'F','f' : Begin
  978.                  GotoXY(1,22);ClrEol;
  979.                  Write('Enter the number of Decimal places for this column: ');
  980.                  Readln(NDP[J]);FillScreen(SaveScreen);
  981.                  End;
  982.        'S','s' : Begin
  983.                    CountData;
  984.                    GotoXY(1,15);
  985.                    Write(^['J');
  986.                    DifSave;
  987.                    GotoXY(1,15);
  988.                    Write(^['J');
  989.                    FillScreen(SaveScreen);
  990.                  End;
  991.         End;
  992.         EntString;
  993.       End;
  994.   Until (CH = 'X') or (CH = 'x');
  995. End;
  996.  
  997. Begin
  998.   FillChar(Line,81,'=');
  999.   For I := 1 to MC do NDP[I] := 4;
  1000.   FirstData := Nil;
  1001.   ScreenEntry;
  1002.   CountData;
  1003.   ClrScr;
  1004.   Writeln(' You entered ',Nvar,' variables and ',Nobs,' Observations');
  1005.   Pause;
  1006. End;
  1007.  
  1008. {Print out matrix of correlation coefficients }
  1009.  
  1010. Procedure CorrelationMatrix;
  1011. Begin
  1012.   ClrScr;
  1013.   GotoXY(1,2);
  1014.   Writeln(' This section prints out cross correlation coefficients ');
  1015.   Writeln(' for up to 30 variables at a time.  You must enter the  ');
  1016.   Writeln(' number of variables you wish to see in the Matrix, and ');
  1017.   Writeln(' then you may enter the column numbers of the variables ');
  1018.   Writeln(' in Question '^J);
  1019.   Pause;
  1020.   ChooseColumns(IY,ICX,Icol,2);
  1021.   Scorr(Icol,Nobs,ICX,RR);
  1022.   ClrScr;
  1023.   Writeln(IO,^J^J^J'Correlation Matrix':33);
  1024.   For J := 1 to ICX do
  1025.     Begin
  1026.       Write(IO,'     ');
  1027.       For K := 1 to J do
  1028.             Write(IO,Icol[K]:10); Writeln(IO);
  1029.       Write(IO,^J'  X[',Icol[J]:2,']');
  1030.       For K := 1 to J do
  1031.             Write(IO,RR[J,K]:10:4); Writeln(IO);
  1032.     End;
  1033.   Writeln(IO,^J^J^J);
  1034.   Pause;
  1035. End;
  1036.  
  1037.  
  1038. Procedure ColumnSum(Var A: Real; B,M: Integer);
  1039. Begin
  1040.   A := 0.0;
  1041.   For I := 1 to M do
  1042.     Begin
  1043.       If GetX(I,SC) < 0.0 then
  1044.         A := A + GetX(I,B)
  1045.     End;
  1046. End;
  1047.  
  1048. Procedure DotProduct(Var A: Real; B,C,M: Integer);
  1049. Begin
  1050.   A := 0.0;
  1051.   For I := 1 to M do
  1052.     Begin
  1053.       If GetX(I,SC) < 0.0 then
  1054.         A := A + GetX(I,B)*GetX(I,C)
  1055.     End;
  1056. End;
  1057.  
  1058. Function Minimum(A,B: Integer): Real;
  1059.  Var Min : Real;
  1060. Begin
  1061.   Min := 1.0E30;
  1062.   For K := 1 to  B do
  1063.     Begin
  1064.       If GetX(K,SC) < 0.0 then
  1065.          Begin
  1066.           If GetX(K,A) < Min then
  1067.             Min := GetX(K,A)
  1068.          End;
  1069.     End;
  1070.   Minimum := Min;
  1071. End;
  1072.  
  1073. Function Maximum(Var A,B: Integer): Real;
  1074.  Var Max : Real;
  1075. Begin
  1076.   Max := -1.0E30;
  1077.   For K := 1 to  B do
  1078.     Begin
  1079.       If GetX(K,SC) < 0.0 then
  1080.         Begin
  1081.          If GetX(K,A) > Max then
  1082.            Max := GetX(K,A);
  1083.         End;
  1084.     End;
  1085.   Maximum := Max;
  1086. End;
  1087.  
  1088. Procedure Analysis(L: Integer);
  1089. Var
  1090.   X_P                 : Real;
  1091. Begin
  1092. {
  1093.        CALCULATE PREDICTED Y VALUES AND RESIDUALS
  1094. }
  1095.   SY := 0.0;
  1096.   RSUM := 0.0;
  1097.   SSUM := 0.0;
  1098.   For I := 1 to L do
  1099.     Begin
  1100.       PutX(B[1],I,FC);
  1101.       SY := SY+(GetX(I,IY) - Avg[IY])*(GetX(I,IY) - Avg[IY]);
  1102.       For J := 2 to Degree+1 do
  1103.         Begin
  1104.           X_P := Int(J - 1);
  1105.           W := GetX(I,FC) + B[J]*Power(GetX(I,ICX),X_P);
  1106.           PutX(W,I,FC);
  1107.         End;
  1108.       PutX(GetX(I,IY) - GetX(I,FC),I,RC);
  1109.       RSUM :=RSUM+(GetX(I,FC)- Avg[IY])*(GetX(I,FC)-Avg[IY]);
  1110.       SSUM :=SSUM+(GetX(I,IY)- Avg[IY])*(GetX(I,IY)-Avg[IY]);
  1111.     End;
  1112.   RCP := RSUM/SSUM;
  1113.   RCP := RCP*100.00;
  1114. End;
  1115.  
  1116. {$I B:Simplex.Pas}
  1117.  
  1118. Overlay Procedure PolyRegr;
  1119. Var
  1120.   NP,NP2,KX,IJ,JK,Index    : Integer;
  1121.   PAVG,Sum,Ysum,PS3R,PS4R  : Real;
  1122.  
  1123. Procedure ColumnMultiply;
  1124. Begin
  1125.   For K := 1 to Nobs do
  1126.       PutX(GetX(K,ICX)*GetX(K,Nvar+1),K,Nvar+1);
  1127. End;
  1128.  
  1129. {
  1130. CHOLESKY'S METHOD FOR SOLUTION OF SIMULTANEOUS LINEAR ALGEBRAIC
  1131. EQUATIONS
  1132. }
  1133. Procedure Cholesky(A: SmallArray; M,N: Integer; Var C: SmallRow);
  1134. Var
  1135.  
  1136. M1,IP1,JM1,II,JJ  : Integer;
  1137. J,K,IM1,NN,IL     : Integer;
  1138. Sum               : Real;
  1139.  
  1140. {
  1141. CALCULATE FIRST ROW OF UPPER TRIANGULAR MATRIX
  1142. }
  1143. Begin;
  1144.   M1 := M+1;
  1145.   For J := 1 to M1 do
  1146.       A[1,J] := A[1,J]/A[1,1];
  1147. {
  1148. CALCULATE OTHER ELEMENTS OF U AND L MATRICES
  1149. }
  1150.   For IL := 2 to M do
  1151.     Begin
  1152.       J := IL;
  1153.       For II := J to M do
  1154.         Begin
  1155.           SUM := 0.0;
  1156.           JM1 := J-1;
  1157.           For K := 1 to JM1 do
  1158.             SUM := SUM+A[II,K]*A[K,J];
  1159.           A[II,J] := A[II,J]-SUM;
  1160.         End;
  1161.       IP1 :=IL + 1;
  1162.       For JJ := IP1 to M1 do
  1163.         Begin
  1164.           SUM := 0.0;
  1165.           IM1 := IL - 1;
  1166.           For K := 1 to IM1 do
  1167.             SUM := SUM+A[IL,K]*A[K,JJ];
  1168.           A[IL,JJ] := (A[IL,JJ]-SUM)/A[IL,IL];
  1169.         End;
  1170.     End;
  1171.   C[M] := A[M,M+1];
  1172.   L := M-1;
  1173.   For NN := 1 to L do
  1174.     Begin
  1175.       SUM := 0.0;
  1176.       IL := M-NN;
  1177.       IP1 := IL + 1;
  1178.       For J := IP1 to M do
  1179.       SUM := SUM+A[IL,J]*C[J];
  1180.       C[IL] := A[IL,M1]-SUM;
  1181.     End;
  1182. End;
  1183.  
  1184. Procedure PSXC(Var Z,Sum : Real);
  1185. Begin
  1186.   Sum := 0.0;
  1187.   For N := 1 to Nobs do
  1188.     Sum := Sum + Sqr(GetX(N,Nvar+1) - Z);
  1189. End;
  1190.  
  1191. Begin
  1192.   ClrScr;
  1193.   Writeln(' This section of SUPERSTAT determines polynomial fits');
  1194.   Writeln(' Up to a degree of 20.');
  1195.   Write(^J^J' Enter the degree of the polynomial for this problem: ');
  1196.   Readln(Degree);
  1197.   Write(' Which column contains the X data? '); Readln(ICX);
  1198.   Write(' Which column contains the Y data? '); Readln(IY);
  1199.   Ysum := 0.0;
  1200.   For J := 1 to Nobs do
  1201.     Begin
  1202.       PutX(1.0,J,Nvar+1);
  1203.       Ysum := Ysum + GetX(J,IY);
  1204.     End;
  1205.     SSB0 := Sqr(Ysum)/XNobs;
  1206.     NP := Degree+1;
  1207. {
  1208.       FILL IN CORRELATION MATRIX
  1209. }
  1210.  
  1211.     RR[1,1] := Nobs;
  1212.     RR[1,NP+1] := Ysum;
  1213.     NP2 := 2*Degree;
  1214.     For J := 1 to NP2 do
  1215.       Begin
  1216.         ColumnMultiply;
  1217.         If (J < NP + 1) then  DotProduct(Y,Nvar+1,IY,Nobs);
  1218.         ColumnSum(W,Nvar+1,Nobs);
  1219.         PAVG := W/Xnobs;
  1220.         IF(J < NP) Then  PSXC(PAVG,SX[J]);
  1221.         IJ := J+1 ;
  1222.         IF(IJ < NP) Then
  1223.           RR[IJ,1] := W
  1224.         Else
  1225.           RR[NP,IJ-Degree] := W;
  1226.           IF(J <= Degree) Then RR[J+1,NP+1] := Y;
  1227.         End;
  1228.       For K := 1 to Degree do
  1229.         For J := 1 to Degree do
  1230.           RR[J,K+1] := RR[J+1,K];
  1231.       KX := NP+1;
  1232.       For I := 1 to 21 do B[I] := 0.00;
  1233. {
  1234.       SOLVE THE CORRELATION MATRIX BY CHOLESKY'S METHOD
  1235. }
  1236.       For JK := 1 to NP do
  1237.        T[JK] := RR[JK,NP+1];
  1238.        Cholesky(RR,NP,KX,B);
  1239.        SSB := 0.0;
  1240.        For IJ := 1 to NP do
  1241.          SSB := SSB+B[IJ]*T[IJ];
  1242.        SST := SSB-SSB0;
  1243.        MST := SST/Degree;
  1244.  
  1245.       Analysis(Nobs);
  1246.  
  1247.       SSR :=SY-SST;
  1248.       S2R :=SSR/(NOBS-NP);
  1249.       IF(S2R <> 0.0) Then
  1250.         FX:=MST/S2R
  1251.       Else
  1252.         FX := 1.0E+08;
  1253.       S1R := 0.0010;
  1254.       IF(S2R > 0.0) Then S1R := SQRT(S2R);
  1255.       For J := 1 to Degree do
  1256.         Begin
  1257.           BERR[J] := S1R/SQRT(SX[J]);
  1258.           IF(BERR[J] = 0.0) THEN
  1259.             T[J] := 1.0E+08
  1260.           ELSE
  1261.             T[J] := B[J+1]/BERR[J];
  1262.         End;
  1263.       PS3R:=100.*S1R/Avg[IY];
  1264.       Yrange := Maximum(IY,Nobs) - Minimum(IY,Nobs);
  1265.       PS4R := 100.0*S1R/YRANGE;
  1266.       IF(RCP > 100.0) Then RCP := 100.0 ;
  1267.   ClrScr;Writeln(IO,' The  fit is for a polynomial of degree ',Degree:2);
  1268.   Writeln(IO,' You may wish to try a higher degree. Remember');
  1269.   Writeln(IO,' that a lower degree is better if the regression');
  1270.   Writeln(IO,' equation is suitable'^J);
  1271.   Writeln(IO,' The polynomial correlation coefficients are :'^J);
  1272.   Writeln(IO,' Intercept         ',B[1]:15);
  1273.   Write(IO,'Correlation':31,'Std Error':19);
  1274.   Writeln(IO,'T-Statistic':21);
  1275.   Writeln(IO,'Coefficient':31,'of Coeff.':19);
  1276.   Write(IO,'-----------          --------':49);
  1277.   Writeln(IO,'-----------':21);
  1278.   For J := 2 to NP do
  1279.     Begin
  1280.       K := J-1;
  1281.       Write(IO,' For X**',K:2,'        ',B[J]:15,'    ',Berr[K]:15);
  1282.       Writeln(IO,'         ',T[K]:7:3);
  1283.     End;
  1284.   Writeln(IO,^J' Calculated F-Test : ',FX:15,^J);
  1285.   Writeln(IO,' Standard Error of Y estimate :',S1R:10:6);
  1286.   Writeln(IO,' Standard Error of Y as a ');
  1287.   Writeln(IO,'  Percent of Y average  : ',PS3R:8:4);
  1288.   Writeln(IO,' Standard Error of Y as a ');
  1289.   Writeln(IO,'  Percent of the Range of Y values  : ',PS4R:8:4);
  1290. {
  1291.       CALCULATE CORRELATION COEFFICIENT
  1292. }
  1293.   RCP := RSUM/SSUM;
  1294.   RCP := RCP*100.00;
  1295.   IF(RCP > 100.0) Then RCP := 100.0;
  1296.   Writeln(IO,' The Correlation Coefficient (R-squared) is: ',RCP:8:4,'%'^J);
  1297.   For J := 1 to Nobs do
  1298.     Begin
  1299.       Index := (Nvar*MR) + J;
  1300.       Data^.XX[Index] := -2.0E35;
  1301.     End;
  1302.   Pause;
  1303. End;
  1304.  
  1305. Overlay Procedure Orthogonal;
  1306. Var
  1307.   Regs                   : Array[0..50] of Real;
  1308.   Temp,Temp1,Temp2,Temp3 : Real;
  1309.   Flag0,Flag1,Flag2,Flag3: Boolean;
  1310.   MaxDeg                 : Integer;
  1311.   X0,XN,A,BB,SumY,Xdiv   : Real;
  1312.  
  1313. Function Divisor(K: Integer): Real;
  1314. Begin
  1315.   If K <> 0 then
  1316.     Begin
  1317.       L := K + Nobs + 2;
  1318.       W := 1.0;
  1319.       While (L <> Nobs + 1) do
  1320.         Begin
  1321.           L := L - 1;
  1322.           W := W*L;
  1323.         End;
  1324.       L := Nobs - K;
  1325.       While L <> Nobs do
  1326.         Begin
  1327.           L := L + 1;
  1328.           W := W/L;
  1329.         End;
  1330.       Divisor := W/(K*2+1);
  1331.     End
  1332.   Else
  1333.       Divisor := Nobs+1;
  1334. End;
  1335.  
  1336. Procedure Two;
  1337. Begin
  1338.   J := 11;
  1339.   For I := 0 to MaxDeg do
  1340.     Begin
  1341.       Regs[J] := Regs[J]/Divisor(I);
  1342.       J := J + 1;
  1343.     End;
  1344.   MaxDeg := MaxDeg + 1;
  1345. End;
  1346.  
  1347. Procedure NewDegree;
  1348. Var
  1349.  X1,X2,X3,Index : Integer;
  1350. Begin
  1351.   GotoXY(1,7);
  1352.   Write(' Enter the Degree for this Problem: '^['J');Readln(Degree);
  1353.    X1 := MaxDeg + 12;
  1354.    X2 := MaxDeg*2 + X1 + 3;
  1355.    For J := X1 to X2 do Regs[J] := 0.0;
  1356.    J := 11;
  1357.    I := 11 + MaxDeg + 1;
  1358.    K:= I + MaxDeg + 1;
  1359.    Regs[I] := 1.0;
  1360.    I := I + 1;
  1361.    Regs[I] := 1.0;
  1362.    Regs[K] := Regs[J];
  1363.    Regs[K+1] := Regs[J+1];
  1364.    Regs[1] := 1;
  1365.    Flag0 := False;
  1366.    M := 12;
  1367. End;
  1368.  
  1369. Procedure Clear(Var TF: Boolean);
  1370. Begin
  1371.   TF := False;
  1372. End;
  1373.  
  1374. Procedure SetFlag(Var TF: Boolean);
  1375. Begin
  1376.   TF := True;
  1377. End;
  1378.  
  1379. Procedure CheckFlag;
  1380. Begin
  1381.   Case Flag0 of
  1382.     True: Clear(Flag0);
  1383.     False: SetFlag(Flag0);
  1384.   End;
  1385. End;
  1386.  
  1387. Procedure Five;
  1388. Var Done : Boolean; X: Real;
  1389. Begin
  1390. Done := False;
  1391. Repeat
  1392.   M := M + 1;
  1393.   I := MaxDeg + 11 + 1;
  1394.   If Flag0 = True then I := I + 1;
  1395.   Temp1 := (Nobs+Regs[1]+1.0)*Regs[1]/(Nobs - Regs[1]);
  1396.   X := -Temp1/(Regs[1] + 1);
  1397.   While Round(Regs[I]) <> 0 do
  1398.     Begin
  1399.       Regs[I] := Regs[I]*X;
  1400.       I := I + 2;
  1401.     End;
  1402.   I := MaxDeg + 11;
  1403.   If Flag0 = False then I := I + 1;
  1404.   X := (Regs[1]*2 +1)*Nobs/(Regs[1]+1.0)/(Nobs - Regs[1]);
  1405.   While Round(Regs[I+1]) <> 0 do
  1406.     Begin
  1407.       I := I + 1;
  1408.       Temp1 := X*Regs[I];
  1409.       I := I + 1;
  1410.       Regs[I] := Regs[I] + Temp1;
  1411.     End;
  1412.   Regs[1] := Regs[1] + 1.0;
  1413.   I := MaxDeg + 12;
  1414.   If Flag0 = True then I := I + 1;
  1415.   K := I + MaxDeg + 1;
  1416.   CheckFlag;
  1417.   Temp1 := K - MaxDeg*2.0 - Regs[1];
  1418.   While 15 > Temp1 do
  1419.     Begin
  1420.       Regs[K] := Regs[K] + Regs[M]*Regs[I];
  1421.       K := K + 2;
  1422.       I := I + 2;
  1423.       Temp1 := K - MaxDeg*2.0 - Regs[1];
  1424.     End;
  1425. Until Regs[1] = Degree;
  1426. End;
  1427.  
  1428. Function Factr(X: Real) : Real;
  1429. Begin
  1430.   If X > 0 then
  1431.     Factr := X*Factr(X-1)
  1432.   Else
  1433.     Factr := 1;
  1434. End;
  1435.  
  1436. Procedure Binomial(Var X: Real);
  1437.   Var Y,Z,T : Real;
  1438. Begin
  1439.   If (Regs[3] = 0) or (Regs[2] = 0) or (Regs[2] = Regs[3]) then
  1440.       X := 1
  1441.   Else
  1442.       Begin
  1443.         Y := Factr(Regs[3]); Z := Factr(Regs[2]);
  1444.         Temp3 := Regs[3] - Regs[2];
  1445.         T := Factr(Temp3);
  1446.         X := Y/(Z*T);
  1447.       End;
  1448. End;
  1449.  
  1450. Procedure Coefficients;
  1451. Var
  1452.   N1,N2,N3: Integer; X,Z: Real;
  1453. Begin
  1454.   N1 := MaxDeg*2 + 13 ;
  1455.   N2 := N1 + Degree;
  1456.   Regs[7] := N1;
  1457.   N  := MaxDeg+12;
  1458.   Regs[2] := 0;
  1459.   Regs[3] := 0;
  1460.   For J := N1 to N2 do
  1461.     Begin
  1462.       Regs[10] := 1;
  1463.       X := 0.0;
  1464.       For I := J to N2 do
  1465.         Begin
  1466.           Binomial(Z);
  1467.           X := X + Z*Regs[I]*Regs[10];
  1468.           Regs[10] := Regs[10]*BB;
  1469.           Regs[3] := Regs[3] + 1;
  1470.         End;
  1471.       Regs[2] := Regs[2] + 1;
  1472.       Regs[3] := Regs[2];
  1473.       Regs[N] := X;
  1474.       N := N + 1;
  1475.     End;
  1476.     N3 := N2 - N1;
  1477.     N1 := MaxDeg  + 12;
  1478.     N2 := N1 + N3 ;
  1479.     X := 1.0;
  1480.     For J := N1 to N2 do
  1481.       Begin
  1482.         Regs[J] := Regs[J]*X;
  1483.         X := A*X;
  1484.       End;
  1485.     B[1] := Regs[N1];
  1486.     For J := N1+1 to N2 do
  1487.         B[J+1-N1] := Regs[J];
  1488. End;
  1489.  
  1490. Procedure Initialize;
  1491. Var
  1492.    X,Z: Real;
  1493. Begin
  1494. Clear(Flag0);
  1495. ClrScr; For J := 0 to 50 do Regs[J] := 0.0;
  1496. Writeln(' This section of SUPERSTAT is for the fitting of Orthogonal ');
  1497. Writeln(' Polynomials.  These routines are for data  which the     ');
  1498. Writeln(' Independent variables are '^['&dB EVENLY SPACED '^['&d@');
  1499. Write(' Which column contains your X values? ');Readln(ICX);
  1500. Nobs := Nobs - 1;
  1501. Write(' Which column contains your Y values? ');Readln(IY);
  1502. X0 := GetX(1,ICX);  XN := GetX(Nobs+1,ICX);
  1503. A := -2.0/(XN - X0); BB := (XN + X0)/(XN - X0);
  1504. Write(' Enter the Maximum degree of the Polynomial: ');Readln(MaxDeg);
  1505. For I := 0 to Nobs do
  1506.   Begin
  1507.     Regs[11] := Regs[11] + GetX(I+1,IY);
  1508.     X  := -2.0*I/Nobs  + 1;
  1509.     Z := 1.0;
  1510.     Regs[12] := Regs[12] + X*GetX(I+1,IY);
  1511.     For J := 1 to MaxDeg - 1 do
  1512.       Begin
  1513.         Temp := X;
  1514.         Temp1   := -(Nobs + J + 1)*J*Z;
  1515.         Temp2   := Temp1 +(Nobs - 2*I)*(J*2+1)*X;
  1516.         X := (Temp2/(J+1))/(Nobs-J);
  1517.         Z := Temp;
  1518.         Regs[13+J-1] :=  Regs[13+J-1] + GetX(I+1,IY)*X;
  1519.       End;
  1520.    End;
  1521. End;
  1522.  
  1523. Begin
  1524.   Initialize;
  1525.   Two;
  1526.   Repeat
  1527.     NewDegree;
  1528.     Five;
  1529.     Coefficients;
  1530.     Analysis(Nobs+1);
  1531.     ClrScr;
  1532.     Writeln(IO,IFF,' The  fit is for a polynomial of degree ',Degree:2);
  1533.     Writeln(IO,' You may wish to try a higher degree. Remember');
  1534.     Writeln(IO,' that a lower degree is better if the regression');
  1535.     Writeln(IO,' equation is suitable'^J);
  1536.     Writeln(IO,' The polynomial correlation coefficients are :'^J);
  1537.     Writeln(IO,' Intercept         ',B[1]:15);
  1538.     For J := 2 to Degree+1 do
  1539.       Begin
  1540.         K := J-1;
  1541.         Writeln(IO,' A',K,'                ',B[J]:15);
  1542.       End;
  1543. {
  1544.       CALCULATE CORRELATION COEFFICIENT
  1545. }
  1546.     IF(RCP > 100.0) Then RCP := 100.0;
  1547.     Writeln(IO,' The Correlation Coefficient (R-squared) is: ',RCP:8:4,'%'^J);
  1548.       GotoXY(1,24);ClrEol;
  1549.       Write(' Try Another Degree');
  1550.     Until Not Yes;
  1551.     Nobs := Nobs + 1;
  1552. End;
  1553.  
  1554. Overlay Procedure LinearRegression;
  1555. Var
  1556.   ZZ : Real;
  1557.  
  1558. Procedure Exponential;
  1559. Begin
  1560.   For J := 1 to Nobs do
  1561.     Begin
  1562.       If (GetX(J,IY) > 0) then
  1563.         PutX(Ln(GetX(J,IY)),J,Nvar+1)
  1564.       Else
  1565.         PutX(0.0,J,Nvar+1);
  1566.     End;
  1567.   IY := Nvar + 1;
  1568.   Nvar := Nvar + 1;
  1569.   InitCorr;
  1570.   Nvar := Nvar - 1;
  1571. End;
  1572.  
  1573. Procedure PowerCurve;
  1574. Begin
  1575.   For J := 1 to Nobs do
  1576.     Begin
  1577.       If (GetX(J,IY) > 0) then
  1578.         PutX(Ln(GetX(J,IY)),J,Nvar+1)
  1579.       Else
  1580.         PutX(0.0,J,Nvar+1);
  1581.       If (GetX(J,IIC) > 0) then
  1582.         PutX(Ln(GetX(J,IIC)),J,Nvar+2)
  1583.       Else
  1584.         PutX(0.0,J,Nvar+2);
  1585.     End;
  1586.   IY := Nvar + 1;
  1587.   ICOL[1] := Nvar + 2;
  1588.   Nvar := Nvar + 2;
  1589.   InitCorr;
  1590.   Nvar := Nvar - 2;
  1591. End;
  1592.  
  1593. Procedure Logarithmic;
  1594. Begin
  1595.   For J := 1 to Nobs do
  1596.     Begin
  1597.       If (GetX(J,IIC) > 0.0) then
  1598.         PutX(Ln(GetX(J,IIC)),J,Nvar+1)
  1599.       Else
  1600.         PutX(0.0,J,Nvar+1);
  1601.     End;
  1602.   Icol[1] := Nvar + 1;
  1603.   Nvar := Nvar + 1;
  1604.   InitCorr;
  1605.   Nvar := Nvar - 1;
  1606. End;
  1607.  
  1608.  
  1609. Begin
  1610.   ClrScr;
  1611.   Writeln(' Multiple Linear Regression Section '^@);
  1612.   Writeln(' Any variable may be correlated against as many as 30');
  1613.   Writeln(' Other variables in your data set');
  1614.   Pause;
  1615.   ChooseColumns(IY,ICX,Icol,1);
  1616.   IY1 := IY;
  1617.   CheckSkips;
  1618.   Imod := 1;
  1619.   DF1  := NOBS-Skips-ICX-1;
  1620.   XDF  := 1.000/Int(DF1);
  1621.   TTT  := (1.93237+1.45140*XDF)/(1.0-0.73411*XDF) ;
  1622.   If(ICX = 1) Then
  1623.     Begin
  1624.       IIC := Icol[1];
  1625.       ClrScr;
  1626.       Writeln(' You have entered a simple 2 variable problem ');
  1627.       Writeln('  Y= f(X). Choose one of the following models...');
  1628.       Writeln('  1 - Linear      :  Y = a + b*X   (default)  ');
  1629.       Writeln('  2 - Exponential :  Y = a*EXP(b*X)   ');
  1630.       Writeln('  3 - Power       :  Y = a*X**b       ');
  1631.       Writeln('  4 - Logarithmic :  Y = a + b*LN(X)'^J^J);
  1632.       Writeln('  Enter your choice ... '); Read(Kbd,Ch);
  1633.       Writeln; Imod := Ord(Ch) - 48;
  1634.       Case Imod of
  1635.         2: Exponential;
  1636.         3: PowerCurve;
  1637.         4: Logarithmic;
  1638.       End;
  1639.     End;
  1640. {
  1641.       MOVE APPROPRIATE CORRELATION COEFFICIENTS INTO CORRELATION
  1642.       MATRIX FOR THE PROBLEM AS STATED
  1643. }
  1644.     If (Skips > 0) and (Imod < 2) then
  1645.       InitCorr;
  1646.     Scorr(Icol,Nobs,ICX+1,RR);
  1647. {
  1648.       CALCULATE CORRELATION COEFFICIENTS
  1649. }
  1650.  
  1651.   ZZ:= Int(Nobs - Skips);
  1652.   For I := 1 to ICX do
  1653.     RY[I] := RR[I,ICX+1];
  1654.  
  1655.   MatrixInvert(RR,ICX);
  1656. {
  1657.       MULTIPLY THE INVERSE OF THE X CORRELATION MATRIX
  1658.       BY THE Y CORRELATION MATRIX TO GET THE A MATRIX
  1659. }
  1660.   MatrixMultiply(RY,RR,ICX,A);
  1661.   SY := Diagonal[ICX+1];
  1662.   For I := 1 to ICX do
  1663.     Begin
  1664.       SX[I] := Diagonal[I];
  1665.       SS[I] := Vertical[I];
  1666.     End;
  1667. {
  1668.       CALCULATE CORRELATION COEFFICIENTS
  1669. }
  1670.   For I := 1 to ICX do
  1671.     B[I+1] := A[I]*SQRT(SY/SX[I]);
  1672.   B[1] := AVG[IY];
  1673.   For I := 1 to ICX do
  1674.     Begin
  1675.       B[1] := B[1]-B[I+1]*AVG[Icol[I]];
  1676.     End;
  1677. {
  1678.       CALCULATE ANALYSIS OF VARIANCE FIGURES
  1679. }
  1680.   ColumnSum(YY,IY,Nobs);
  1681.   SSB0 := YY*YY/ZZ;
  1682.   SSB := B[1]*YY;
  1683.   For J := 1 to ICX do
  1684.     Begin
  1685.       N := Icol[J];
  1686.       DotProduct(Z,N,IY,Nobs);
  1687.       SSB := SSB + B[J+1]*Z;
  1688.     End;
  1689.   SST := SSB - SSB0 ;
  1690.   SSR := SY - SST ;
  1691.   S2R := SSR/Int(Nobs -Skips -ICX - 1);
  1692.   S1R := 0.0;
  1693.   If(S2R >= 0) then S1R := SQRT(S2R);
  1694.   MST := SST/ICX ;
  1695.  
  1696. {
  1697.       F TEST
  1698. }
  1699.   If(S2R <> 0.0) then
  1700.     FX := MST/S2R
  1701.   Else
  1702.     FX  :=  1.0E+08;
  1703. {
  1704.       CALCULATE STD. Writeln OF COEFFICIENTS AND T SCORES
  1705. }
  1706.   For I := 1 to ICX do
  1707.     Begin
  1708.       BERR[I] := S1R/SQRT(SX[I]);
  1709.       If(BERR[I] = 0) THEN
  1710.         T[I]  :=  1.0E+08
  1711.       ELSE
  1712.         T[I] := B[I+1]/BERR[I];
  1713.       BMIN[I] := B[I+1]-TTT*BERR[I];
  1714.       BMAX[I] := B[I+1]+TTT*BERR[I];
  1715.     End;
  1716. {
  1717.       CALCULATE R-SQUARED FOR THE REGRESSION
  1718. }
  1719.   RC1 := SST/SY;
  1720.   RC2 := 1.000-(1.000-RC1)*((ZZ-1.0000)/(ZZ-Int(ICX))) ;
  1721.   RC1 := 100.0*RC1;
  1722.   If(RC1 > 100.0) then RC1 := 100.;
  1723.   RC2 := 100.0*RC2 ;
  1724.   If(RC2 > 100.0) then RC2 := 100. ;
  1725. {
  1726.       CALCULATE PREDICTED Y VALUES AND RESIDUALS
  1727. }
  1728.   If ICX = 1 then
  1729.     Begin
  1730.       If(IMOD = 2) or (IMOD = 3) then B[1] := Exp(B[1]);
  1731.       Icol[1] := IIC;
  1732.       IY := IY1;
  1733.     End;
  1734.   For  J := 1 to NOBS do
  1735.     Begin
  1736.       If ICX = 1 then
  1737.         Begin
  1738.           Case Imod of
  1739.            1: W := B[1] + B[2]*GetX(J,IIC);
  1740.            2: W := B[1]*Exp(B[2]*GetX(J,IIC));
  1741.            3: W := B[1]*Power(GetX(J,IIC),B[2]);
  1742.            4: W := B[1] + B[2]*Ln(GetX(J,IIC));
  1743.           End;
  1744.           PutX(W,J,FC);
  1745.         End
  1746.       Else
  1747.         Begin
  1748.           PutX(B[1],J,FC);
  1749.           For K := 1 to ICX do
  1750.             Begin
  1751.               N := Icol[K];
  1752.               W := GetX(J,FC)+B[K+1]*GetX(J,N);
  1753.               PutX(W,J,FC);
  1754.             End;
  1755.         End;
  1756.       W := GetX(J,IY)-GetX(J,FC);
  1757.       PutX(W,J,RC);
  1758.     End;
  1759.   Yrange := Maximum(IY,Nobs) - Minimum(IY,Nobs);
  1760.   PSDR1 := 100.0*S1R/Yrange;
  1761.   PSDR := 100.0*S1R/AVG[IY];
  1762.   If(IMOD = 3) or (IMOD = 4) then ICOL[1] := IIC ;
  1763.   Writeln(IO,IFF,'Linear Regression Results':43,^J^J);
  1764.   Case Imod of
  1765.     2: Writeln(IO,'  Exponential Curve: Y  =  a*EXP(b*X) '^J);
  1766.     3: Writeln(IO,'  Power Curve      : Y  =  a*X**b '^J);
  1767.     4: Writeln(IO,'  Logarithmic Curve: Y  =  a + b*ALOG(X) '^J);
  1768.   End;
  1769.   Writeln(IO,'Standard':25,'   Correl   Regression    Std Error of    T');
  1770.   Write(IO,'  X     Mean    Deviation   X vs Y   Coefficient   Reg. Coeff.');
  1771.   Writeln(IO,'  Value');
  1772.   Write(IO,'-----   -----   ----------  ------   -----------   ----------');
  1773.   Writeln(IO,'  ------');
  1774.   For J := 1 to ICX do
  1775.     Begin
  1776.       N := ICOL[J];
  1777.       Write(IO,N:2,'   ',AVG[N]:8:3,'  ',StDev[N]:8:4,'     ',RY[J]:6:4);
  1778.       Writeln(IO,'   ',B[J+1]:11,'   ',Berr[J]:11,'  ',T[J]:6:2);
  1779.       Writeln(IO,^J' Limits of Regression       Upper   ',Bmax[J]:11);
  1780.       Writeln(IO,' Coefficient (95% Conf.)    Lower   ',Bmin[J]:11,^J);
  1781.     End;
  1782.     Writeln(IO,^J'Standard':22);
  1783.     Writeln(IO,'  Y     Mean    Deviation');
  1784.     Writeln(IO,'-----   -----   ----------');
  1785.     Writeln(IO,' ',IY:2,'   ',Avg[IY]:8:3,'  ',StDev[IY]:8:4);
  1786.     If(IMOD = 2) or (IMOD = 3) then
  1787.       Bmod := EXP(B[1])
  1788.     Else
  1789.       Bmod := B[1];
  1790.     Writeln(IO,^J' Y  Intercept',':  ':26,Bmod:15);
  1791.     Writeln(IO,^J' R-squared For Correlation          :  ',RC1:8:4);
  1792.     Writeln(IO,^J' R-squared, Adjusted for Degrees');
  1793.     Writeln(IO,' of Freedom',':  ':28,RC2:8:4);
  1794.     Writeln(IO,^J' Std. error of Y estimate           :  ',S1R:8:5);
  1795.     Writeln(IO,^J' Std. error as a percent of Y Avg.  :  ',PSDR:8:4);
  1796.     Writeln(IO,^J' Std. error as a percent of the ');
  1797.     Writeln(IO,' Range of Y values                  :  ',PSDR1:8:4);
  1798.     Pause;
  1799.     Writeln(IO,^J'         Analysis of Variance Table for the Regression'^J);
  1800.     Writeln(IO,'             Degrees      Sum Of       Mean      Calculated');
  1801.     Writeln(IO,'   Source   of Freedom    Squares     Squares     F - Value');
  1802.     Writeln(IO,'    ----     --------      -----       -----       -------');
  1803.     Write(IO,' Regression    ',ICX:2,'        ',SST:7:4,'     ',MST:7:4);
  1804.     Writeln(IO,'      ',FX:7:4);
  1805.     Writeln(IO,^J' Residual     ',DF1:2,'        ',SSR:7:4,'     ',S2R:7:4);
  1806.     DF := NOBS-Skips-1;
  1807.     Writeln(IO,^J'  Total,  '^J^M'  Corrected    ',DF:2,'        ',SY:7:4,^J);
  1808.   If Skips > 0 then
  1809.     Begin
  1810.       UnsKip;
  1811.       Skips := 0;
  1812.       InitCorr;
  1813.     End;
  1814.   Pause;
  1815. End;
  1816.  
  1817. (* {$I B:Plot2.Ovl}  *)
  1818. Procedure Output;
  1819. Begin
  1820.   ClrScr;GotoXY(1,8);Iff := ' ';
  1821.   Writeln(' Do you wish output to go to :');
  1822.   Writeln(' 1 - Your Screen');
  1823.   Writeln(' 2 - The Printer, or');
  1824.   Writeln(' 3 - A disc File ');
  1825.   Read(KBD,Ch);
  1826.   If (Ch = '1') then
  1827.     Begin
  1828.       Assign(IO,'CON:');
  1829.       Reset(IO);
  1830.     End
  1831.   Else  If (Ch = '2') then
  1832.     Begin
  1833.       Assign(IO,'LST:');
  1834.       Reset(IO);
  1835.       Iff := ^L;
  1836.     End
  1837.   Else If (Ch = '3') then
  1838.     Begin
  1839.       Repeat
  1840.         Write(' Enter a filename for output: ');
  1841.         Read(FileName);
  1842.         Assign(IO,FileName);
  1843. {$I-}   Rewrite(IO);  IOCheck; {$I+}
  1844.       Until Not IOErr;
  1845.       FileWrite := True;
  1846.     End;
  1847.  
  1848. End;
  1849.  
  1850. Procedure ResidualTable;
  1851. {
  1852.       RESIDUAL ANALYSIS SECTION
  1853. }
  1854. Begin
  1855.   ClrScr;
  1856.   Writeln(IO,Iff,'Residual Table:40'^J^J);
  1857.   Write(IO,'  Observation ');
  1858.   Writeln(IO,'Percent':15);
  1859.   Write(IO,'     Number         Y-Actual        Y-Calc');
  1860.   Writeln(IO,'        Residual    Deviation'^J^J);
  1861.   For J := 1 to Nobs do
  1862.     Begin
  1863.       If GetX(J,IY) <> 0.0 then
  1864.         W := 100.0*(GetX(J,FC)-GetX(J,IY))/GetX(J,IY);
  1865.       Write(IO,'      ',J:2,'       ',GetX(J,IY):15,'  ');
  1866.       Write(IO,GetX(J,FC):15,' ',GetX(J,RC):15,' ');
  1867.       If GetX(J,IY) <> 0.0 then
  1868.         Writeln(IO,W:8:3)
  1869.       Else
  1870.         Writeln(IO,'********');
  1871.     End;
  1872.     Pause;
  1873. End;
  1874.  
  1875. Procedure ModifyData;
  1876.   Var
  1877.     A: Char;  XX : Real; MaxC, NN : Integer;
  1878. Begin
  1879.   N := Nvar; MaxC := Nvar;
  1880.   Repeat
  1881.     ClrScr;
  1882.     Writeln(^J^J' You may modify colums of data as follows :');
  1883.     Writeln(' 1 - Multiply two columns or a constant and a column');
  1884.     Writeln(' 2 - Take the Natural log of a column');
  1885.     Writeln(' 3 - Divide two columns or a constant and a column');
  1886.     Writeln(' 4 - Exponentiate a column ( Col B = Exp(Col A))  ');
  1887.     Writeln(' 5 - Raise a column to a power ');
  1888.     Writeln(' 6 - Add/Subtract two columns or a constant and a column');
  1889.     Writeln(' 7 - Normalize a column of data');
  1890.     Writeln(' 8 - Save data to a DIF file');
  1891.     Writeln(' 0 - Quit the Data Modification section ');
  1892.     Writeln(' Enter your choice : ');
  1893.   Read(Kbd,CH);
  1894.   NN := Nvar + 1;
  1895.   If(Ch <> '0') and (Ch <> '7') then
  1896.     Begin
  1897.       ClrScr;
  1898.       Writeln(' You have ',Nvar:2,' columns of data. You may  ');
  1899.       Writeln(' Overwrite data in any of these columns if you wish');
  1900.       Writeln(' or store data in the next available empty column, ');
  1901.       Writeln(' which is column ',NN:2,^J^J);
  1902.     End;
  1903.     Case Ch of
  1904. {
  1905.       MULTIPLY TWO COLUMNS TOGETHER
  1906. }
  1907.    '1': Begin
  1908.          Writeln(' You may:');
  1909.          Writeln(' 1 - multiply a column by a constant, or');
  1910.          Writeln(' 2 - multiply two columns together');
  1911.          Writeln(^J' Enter your choice: ');
  1912.          Read(Kbd,A);Writeln;
  1913. {
  1914.       MULTIPLY A COLUMN BY A CONSTANT
  1915. }
  1916.          Case A of
  1917.         '1': Begin
  1918.               Write(' Column C= Column A * Constant X, enter A,X,C :');
  1919.               Readln(M,XX,N);
  1920.               For I := 1 to Nobs do
  1921.                PutX(XX*GetX(I,M),I,N);
  1922.              End;
  1923. {
  1924.       MULTIPLY ONE COLUMN BY ANOTHER
  1925. }
  1926.       '2': Begin
  1927.              Write(' Column C = Column A*Column B, Enter A,B,C : ');
  1928.              Readln(L,M,N);
  1929.              For I := 1 to Nobs do
  1930.                PutX(GetX(I,L)*GetX(I,M),I,N);
  1931.            End;
  1932.         End;
  1933.       End;
  1934. {
  1935.       TAKE THE LOG OF A COLUMN
  1936. }
  1937.    '2': Begin
  1938.           Write('Column C = Ln(Column A) - Enter A and C');
  1939.           Readln(M,N);
  1940.           For I := 1 to Nobs do
  1941.             PutX(Ln(GetX(I,M)),I,N);
  1942.         End;
  1943. {
  1944.       DIVIDE TWO COLUMNS
  1945. }
  1946.    '3': Begin
  1947.           Writeln(' You may:');
  1948.           Writeln(' 1 - divide a column by a constant, or');
  1949.           Writeln(' 2 - divide one column by another');
  1950.           Writeln(^J' Enter your choice: ');
  1951.           Read(Kbd,A);Writeln;
  1952.          Case A of
  1953.        '1': Begin
  1954.               Write(' Column C= Column A / Constant X, enter A,X,C :');
  1955.               Readln(M,XX,N);
  1956.               For I := 1 to Nobs do
  1957.                 PutX(GetX(I,M)/XX,I,N);
  1958.             End;
  1959.        '2': Begin
  1960.               Write(' Column C = Column A/Column B, Enter A,B,C : ');
  1961.               Readln(L,M,N);
  1962.               For I := 1 to Nobs do
  1963.                 PutX(GetX(I,L)/GetX(I,M),I,N);
  1964.             End;
  1965.          End;
  1966.        End;
  1967. {
  1968.       EXPONENTIAL FUNCTION
  1969. }
  1970.    '4': Begin
  1971.           Write(' Column C = EXP( Column A) - Enter A, C : ');
  1972.           Readln(L,N);
  1973.           For I := 1 to Nobs do
  1974.             PutX(Exp(GetX(I,L)),I,N);
  1975.         End;
  1976. {
  1977.       RAISE A COLUMN TO A POWER
  1978. }
  1979.    '5': Begin
  1980.           Write(' Column C = Column A**X ,  Enter A, C, X: ');
  1981.           Readln(L,N,XX);
  1982.           For I := 1 to Nobs do
  1983.             PutX(Power(GetX(I,L),XX),I,N);
  1984.         End;
  1985. {
  1986.       ADD TWO COLUMNS
  1987. }
  1988.    '6': Begin
  1989.          Writeln('You may :');
  1990.          Writeln(' 1 - Add/Subtract a constant to/from a column ');
  1991.          Writeln(' 2 - Add/Subtract any two columns');
  1992.          Writeln('  Enter your choice: '); Read(Kbd,A);Writeln;
  1993.          Case A of
  1994.          '1': Begin
  1995.                Writeln(' Column C = Column A + B (Constant). Enter A, B, C ');
  1996.                Write(' Enter a Negative constant to subtract !: ');
  1997.                Readln(L,XX,N);
  1998.                For I := 1 to Nobs do
  1999.                   PutX(GetX(I,L) + XX,I,N);
  2000.               End;
  2001.          '2': Begin
  2002.                Writeln(' Column C = Column A + Column B, Enter A, B, C ');
  2003.                Write(' To subtract, enter a the negative of B : ');
  2004.                Readln(L,M,N);K := Abs(M);
  2005.                For I := 1 to Nobs do
  2006.                  Begin
  2007.                    If M < 0 then
  2008.                      PutX(GetX(I,L) + GetX(I,K),I,N)
  2009.                    Else
  2010.                      PutX(GetX(I,L) - GetX(I,K),I,N);
  2011.                  End;
  2012.               End;
  2013.         End;
  2014.         End;
  2015. {
  2016. }
  2017.     '7': Begin
  2018.            Writeln(' Enter the column number of the data you wish to');
  2019.            Writeln(' normalize, and a column number where the results should');
  2020.            Write(' be placed: ');Readln(L,N);
  2021.            For I := 1 to Nobs do
  2022.              Begin
  2023.                XX := (GetX(I,L) - Avg[L])/StDev[L];
  2024.                PutX(XX,I,N);
  2025.              End;
  2026.          End;
  2027.     '8': Begin
  2028.           ClrScr;
  2029.           DifSave;
  2030.          End;
  2031.       End;
  2032.       If N > Nvar then Nvar := Nvar + 1;
  2033.       If N > MaxC then Maxc := N;
  2034.   Until Ch = '0';
  2035.   InitCorr;
  2036.  
  2037. End;
  2038. Procedure InputData;
  2039.  
  2040. {
  2041.        This is a simple program to list out the directory of the
  2042.        current (logged) drive.
  2043. }
  2044. type
  2045.   Char15arr            = array [ 1..15 ] of Char;
  2046.   String20             = string[ 20 ];
  2047.   Suffix               = array [1..3] of Char;
  2048. Var
  2049.   NamR                 : Array[1..20] of String20;
  2050.   I,J,Number           : Integer;
  2051.   Open                 : Boolean;
  2052.   Types                : array[1..2] of Suffix;
  2053.  
  2054. Procedure DirList(Descriptor: Suffix; Var Found: Boolean);
  2055. var
  2056.   DTA                  : array [ 1..43 ] of Byte;
  2057.   Mask                 : Char15arr;
  2058.   Error, Default       : Integer;
  2059.   Drive                : Array[1..2] of Char;
  2060. begin { main body of program DirList }
  2061.   ClrScr;
  2062.   Drive[1] := 'B'; Drive[2] := 'A';
  2063.   FillChar(DTA,SizeOf(DTA),0);        { Initialize the DTA buffer }
  2064.   FillChar(Mask,SizeOf(Mask),0);      { Initialize the mask }
  2065.   FillChar(NamR,SizeOf(NamR),0);      { Initialize the file name }
  2066.  
  2067.   Result.AX := $1A00;         { Function used to set the DTA }
  2068.   Result.DS := Seg(DTA);      { store the parameter segment in DS }
  2069.   Result.DX := Ofs(DTA);      {   "    "      "     offset in DX }
  2070.   MSDos(Result);              { Set DTA location }
  2071.   Result.AX := $1900;
  2072.   MSDos(Result);
  2073.   Default := (Result.AX and $FF ) + 1;
  2074.   Error := 0;
  2075.   WriteLn(Descriptor,' Files on Drive ',Drive[Default]);
  2076.   WriteLn;
  2077.   Mask := ' :\????????.   ';
  2078.   Mask[1] := Drive[Default];
  2079.   Mask[13] := Descriptor[1];
  2080.   Mask[14] := Descriptor[2];
  2081.   Mask[15] := Descriptor[3];
  2082.   Result.AX := $4E00;
  2083.   Result.DS := Seg(Mask);
  2084.   Result.DX := Ofs(Mask);
  2085.   Result.CX := 22;
  2086.   MSDos(Result);
  2087.   Error := Result.AX and $FF;
  2088.   I := 1;
  2089.   J := 1;
  2090.   if (Error = 0) then
  2091.     repeat
  2092.       NamR[J][I] := Chr(Mem[Seg(DTA):Ofs(DTA)+29+I]);
  2093.       I := I + 1;
  2094.     until not (NamR[J][I-1] in [' '..'~']) or (I>20);
  2095.  
  2096.   NamR[J][0] := Chr(I-1);
  2097.   while (Error = 0) do begin
  2098.     Error := 0;
  2099.     Result.AX := $4F00;
  2100.     Result.CX := 22;
  2101.     MSDos( Result );
  2102.     Error := Result.AX and $FF;
  2103.     J := J + 1;
  2104.     I := 1;
  2105.     repeat
  2106.       NamR[J][I] := Chr(Mem[Seg(DTA):Ofs(DTA)+29+I]);
  2107.       I := I + 1;
  2108.     until not (NamR[J][I-1] in [' '..'~'] ) or (I > 20);
  2109.     NamR[J][0] := Chr(I-1);
  2110.   end ;
  2111.   GotoXY(1,5);
  2112.   FileName[1] := Drive[Default];
  2113.   FileName[2] := ':';
  2114.   FileName[3] := '\';
  2115.   Found := False;
  2116.   If J-1 > 0 then
  2117.     Begin
  2118.       For I := 1 to J - 1  do
  2119.         Writeln(Chr(64+I),':   ',Namr[I]);
  2120.       GotoXY(1,22);
  2121.       Write(' Choose the file you want by letter, hit <ESC> to exit ');
  2122.       Read(Kbd,Ch);
  2123.       Ch := UpCase(Ch);
  2124.       Number := Ord(Ch) - 64;
  2125.       If Number in[1..J-1] then
  2126.         Begin
  2127.           Insert(NamR[Number],FileName,4);
  2128.           Found := True;
  2129.         End;
  2130.     End
  2131.   Else
  2132.     Begin
  2133.       Writeln(' No ',Descriptor,' Files Found on Drive ',Drive[Default]);
  2134.       Found := False ;
  2135.       Pause;
  2136.     End;
  2137. End;
  2138.  
  2139. Begin
  2140.   Repeat
  2141.     Types[1] := 'DIF'; Types[2] := 'PRN';
  2142.     ClrScr;  Skips := 0;
  2143.     Writeln(' YOU HAVE THE FOLLOWING OPTIONS : '^J);
  2144.     Writeln(' 1 - READ NEW DATA FROM A DIF FILE ');
  2145.     Writeln(' 2 - READ NEW DATA FROM A LOTUS PRN FILE ');
  2146.     Writeln(' 3 - INPUT NEW DATA VIA THE SPREADSHEET, OR ');
  2147.     Writeln(' 4 - MODIFY/ADD TO EXISTING DATA VIA THE SPREADSHEET');
  2148.     Writeln(^J' Enter your Choice '); Read(Kbd,CH);
  2149.   Until Ch in['1','2','3','4'];
  2150.   L := Ord(Ch) - 48;
  2151.   Case L of
  2152.     1,2: Begin
  2153.            FileName := '                    ';
  2154.            DirList(Types[L],Open);
  2155.            If Open then
  2156.              Begin
  2157.                GotoXY(1,15);
  2158.                Write(' Opening File : ');
  2159.                Writeln(FileName);
  2160.    {$I-}       Reset(InFile);  IOCheck;  {$I+}
  2161.              End;
  2162.            If Open then
  2163.              If (L = 1) then DFRead else PRN_Read;
  2164.          End;
  2165.     3  : Begin
  2166.            Release(HeapTop);
  2167.            Mark(HeapTop); New(Data);
  2168.            MC := 45; MR := 200; SC := 43;
  2169.            FC := 44; RC := 45;
  2170.            InitializeArray;
  2171.            SpreadSheet;
  2172.            Open := True;
  2173.          End;
  2174.     4  : Begin
  2175.            SpreadSheet;
  2176.            Open := True;
  2177.          End;
  2178.   End;
  2179.   If Open then InitCorr;
  2180.   Xnobs := Int(Nobs);
  2181. End;
  2182.  
  2183. Begin
  2184. {
  2185.       THE DATA ARRAYS ARE DIMENSIONED TO READ UP TO 200 OBSERVATIONS
  2186.       OF 50 DIFFERENT VARIABLES, AND ANALYZE THE EFFECTS OF UP TO 20
  2187.       OF THESE VARIABLES ON ANY INDEPENDANT VARIABLE (Y)
  2188. }
  2189.   ClrScr;  PlotCall := 0;
  2190.   GotoXY(1,10); TextBackground(0); TextColor(15);
  2191.   Writeln(' Welcome to SUPERSTAT, the Statistical analysis program. This ');
  2192.   Writeln(' program currently reads data in DIF format files such as Lotus');
  2193.   Writeln(' 1,2,3 or Visicalc can create, or Lotus PRN files .');
  2194.   Writeln(' You may also enter data interactively via a spreadsheet-like');
  2195.   Writeln(' Interface. This data can then be saved to a DIF File. Output');
  2196.   Writeln(' is initially directed to the screen. ');
  2197.   Assign(IO,'CON:');
  2198.   Reset(IO);
  2199.   Mark(HeapTop);
  2200.   New(Data);
  2201.   Pause;
  2202.   Repeat
  2203.     ClrScr;GotoXY(1,8);
  2204.     Writeln(' Choose from the Following Options');
  2205.     Writeln(' 1 - Enter/Modify a Data Set');
  2206.     Writeln(' 2 - Correlation Matrix');
  2207.     Writeln(' 3 - Multiple Linear Regression');
  2208.     Writeln(' 4 - Polynomial Regression');
  2209.     Writeln(' 5 - Orthogonal Polynomials');
  2210.     Writeln(' 6 - Simplex Non-Linear curve fitting');
  2211.     Writeln(' 7 - Residual Table');
  2212.     Writeln(' 8 - Modify Data');
  2213.     Writeln(' 9 - Change Output Device');
  2214. {   Writeln(' P - Plot Data');       }
  2215.     Writeln(' X - Exit the Program');
  2216.     Read(Kbd,Ch);
  2217.     Case Ch of
  2218.       'X','x'         : Begin
  2219.                          Ch := ' ';
  2220.                          GotoXY(1,22);ClrEol;
  2221.                          Write(' Sure you want to Exit');
  2222.                          If Yes then
  2223.                            Ch := 'X';
  2224.                         End;
  2225.       '1'             : InputData;
  2226.       '2'             : CorrelationMatrix;
  2227.       '3'             : LinearRegression;
  2228.       '4'             : PolyRegr;
  2229.       '5'             : Orthogonal;
  2230.       '6'             : Simplex;
  2231.       '7'             : ResidualTable;
  2232.       '8'             : ModifyData;
  2233.       '9'             : OutPut;
  2234. {     'P','p'         : DataPlot;   }
  2235.     End;
  2236.   Until Ch = 'X';
  2237.   GotoXY(1,22);ClrEol;Write(' Do you need to save your data');
  2238.   If Yes then DifSave;
  2239.   If FileWrite then
  2240.     Begin
  2241.       Flush(IO);
  2242.       Close(IO);
  2243.     End;
  2244.   Release(HeapTop);
  2245. End.
  2246.  
  2247.  
  2248.