1  REM ****  HP BASIC PROGRAM LIBRARY  ******************************
2  REM
3  REM       GRGPLT: SIMPLE REGRESSION AND PLOT
4  REM
5  REM       36542 REV A
6  REM
7  REM ****  CONTRIBUTED PROGRAM  ***********************************
9  REM  ********************************************************
10  REM *  STANFORD GRADUATE SCHOOL OF BUSINESS                *
11  REM *  PROGRAM NAME: GRGPLT                                *
12  REM *  PERFORMS A SIMPLE REGRESSION AND PROVIDES A         *
13  REM *  PLOT OF THE DATA POINTS.                            *
14  REM *                                                      *
15  REM *  PROGRAMMED BY W.F. SHARPE (MARCH, 1971)             *
16  REM ********************************************************
50  DIM X[500],Y[500],X$[25],Y$[25],A$[20],D$[15]
51  D$="---------------"
100  REM -- N = NUMBER OF OBSERVATIONS
102  REM -- X = THE INDEPENDENT VARIABLE
104  REM -- Y = THE DEPENDENT VARIABLE
106  REM -- X1,X2 ARE LOWER,UPPER BOUNDS FOR X-AXIS
108  REM -- Y1,Y2 ARE LOWER,UPPER BOUNDS FOR Y-AXIS
110  REM -- X9 = NUMBER OF INTERVALS ON X-AXIS
112  REM -- Y9 = NUMBER OF INTERVALS ON Y-AXIS
114  REM -- X$,Y$ ARE NAMES OF THE VARIABLES
116  REM -- A1,A2,A9 ARE AVERAGE X, AVERAGE Y, AND INTERCEPT
120  REM ----------------------------------------------------
1000  REM -- SEE IF DATA ALREADY ENTERED
1010  PRINT "DATA FROM TERMINAL OR DATA STATEMENTS";
1011  INPUT A$
1015  IF A$[1,1]="T" THEN 3000
1020  PRINT "HAVE YOU ENTERED THE DATA STATEMENTS ALREADY";
1021  INPUT A$
1030  IF A$[1,1]="Y" THEN 1150
1040  PRINT "ENTER DATA STATEMENTS BETWEEN LINES 2000 AND 2999"
1041  PRINT "FIRST, THE NUMBER OF OBSERVATIONS"
1042  PRINT "THEN THE OBSERVATIONS, ONE AT A TIME, WITH"
1043  PRINT "THE Y-VARIABLE FOLLOWED BY THE X-VARIABLE."
1044  PRINT "WHEN YOU HAVE ENTERED THE DATA STATEMENTS,"
1045  PRINT "RUN THE PROGRAM AGAIN."
1046  STOP 
1150  REM -------------------------------------
1151  REM -- READ DATA FROM DATA STATEMENTS
1155  READ N
1160  FOR I=1 TO N
1161  READ Y[I],X[I]
1162  NEXT I
1170  GOTO 4000
3000  PRINT 
3010  PRINT "HOW MANY POINTS DO YOU HAVE";
3011  INPUT N
3020  PRINT "FOR EACH POINT, TYPE TWO VALUES"
3021  PRINT "  THE Y-VARIABLE FIRST, THEN THE X-VARIABLE"
3022  PRINT "  SEPARATE THEM WITH A COMMA"
3023  PRINT "FOR EXAMPLE --"
3024  PRINT "  PAIR 1? 34, 56.7"
3025  PRINT 
3030  FOR I=1 TO N
3031  PRINT  USING 3032;I
3032  IMAGE #,"PAIR",3D
3033  INPUT Y[I],X[I]
3040  NEXT I
3050  PRINT 
3999  REM -------------------------------
4000  REM -- SUBROUTINE TO DO SIMPLE REGRESSION WITH PLOT
4010  REM -- INPUTS ARE N X(I),Y(I) VALUES
4050  PRINT 
4052  PRINT "NAME OF Y-VARIABLE";
4053  INPUT Y$
4054  Y$=Y$[1,15]
4055  PRINT "NAME OF X-VARIABLE";
4056  INPUT X$
4057  X$=X$[1,15]
4062  PRINT "DO YOU WANT A LIST OF THE DATA";
4063  INPUT A$
4064  IF A$[1,1]="N" THEN 4100
4072  PRINT 
4073  PRINT Y$,X$
4074  PRINT D$[1,LEN(Y$)],D$[1,LEN(X$)]
4075  FOR I=1 TO N
4076  PRINT Y[I],X[I]
4077  NEXT I
4078  PRINT 
4100  REM -- FIND MIN X (M1) AND MAX X(M2)
4102  M1=X[1]
4103  M2=X[1]
4104  FOR I=2 TO N
4105  IF X[I]>M1 THEN 4107
4106  M1=X[I]
4107  IF X[I]<M2 THEN 4110
4108  M2=X[I]
4110  NEXT I
4120  REM -- FIND MIN Y(M3) AND MAX Y(M4)
4121  M3=Y[1]
4122  M4=Y[1]
4123  FOR I=2 TO N
4124  IF Y[I]>M3 THEN 4126
4125  M3=Y[I]
4126  IF Y[I]<M4 THEN 4130
4127  M4=Y[I]
4130  NEXT I
4200  REM -- FIND AVERAGES AND STANDARD DEVIATIONS
4205  REM -- A1 IS AVERAGE OF X, A2 IS AVERAGE OF Y
4206  REM -- S1 IS STD DEV OF X, S2 IS STD DEV OF Y
4210  A1=0
4211  A2=0
4212  FOR I=1 TO N
4214  A1=A1+X[I]
4216  A2=A2+Y[I]
4218  NEXT I
4220  A1=A1/N
4222  A2=A2/N
4250  REM -- FIND STANDARD DEVIATIONS AND COVARIANCE (C1)
4252  S1=0
4254  S2=0
4256  C1=0
4260  FOR I=1 TO N
4262  S1=S1+((X[I]-A1)^2)
4264  S2=S2+((Y[I]-A2)^2)
4266  C1=C1+((X[I]-A1)*(Y[I]-A2))
4270  NEXT I
4272  S1=SQR(S1/N)
4274  S2=SQR(S2/N)
4276  C1=C1/N
4280  REM -FIND SUMS
4281  T1=T2=T3=T4=T5=0
4285  FOR I=1 TO N
4286  T1=T1+X[I]
4287  T2=T2+Y[I]
4288  T3=T3+(X[I]*Y[I])
4289  T4=T4+(X[I]^2)
4290  T5=T5+(Y[I]^2)
4292  NEXT I
4300  REM -- FIND EQUATION OF REGRESSION LINE
4310  REM -- LINE IS Y = A9 + B9*X
4320  B9=C1/(S1^2)
4330  A9=A2-(B9*A1)
4340  REM -- FIND COEFFICIENT OF DETERMINATION (R2)
4350  R2=((B9^2)*(S1^2))/(S2^2)
4500  REM -- GET INFORMATION FOR GRAPH
4505  PRINT "DO YOU WANT A GRAPH";
4506  INPUT A$
4507  A5=1
4508  IF A$[1,1]="Y" THEN 4510
4509  A5=0
4510  IF A5=0 THEN 4700
4512  PRINT "DO YOU WANT TO SELECT THE AXES";
4513  INPUT A$
4514  A6=1
4516  IF A$[1,1]="Y" THEN 4518
4517  A6=0
4518  IF A6=1 THEN 4600
4522  PRINT "DO YOU WANT THE AXES THE SAME";
4524  INPUT A$
4526  IF A$[1,1]="Y" THEN 4550
4530  X1=M1
4531  X2=M2
4532  Y1=M3
4533  Y2=M4
4538  GOTO 4600
4550  X1=M1
4551  IF M3>M1 THEN 4553
4552  X1=M3
4553  Y1=X1
4554  X2=M2
4555  IF M4<M2 THEN 4557
4556  X2=M4
4557  Y2=X2
4600  REM -- FIND SIZE
4610  PRINT "HOW LONG SHOULD EACH SIDE BE (IN INCHES)";
4612  INPUT A5
4614  IF A5 <= 7 THEN 4620
4616  A5=7
4620  X9=INT(10*A5+.001)
4622  Y9=INT(6*A5++.001)
4700  REM -- PRINT RESULTS
4713  PRINT 
4720  PRINT 
4722  PRINT " ",Y$,X$
4724  PRINT " ",D$[1,LEN(Y$)],D$[1,LEN(X$)]
4726  PRINT " MAXIMUM",M4,M2
4728  PRINT " MINIMUM",M3,M1
4730  PRINT " AVERAGE",A2,A1
4732  PRINT " STD DEV",S2,S1
4733  PRINT "(UNADJUSTED)"
4734  PRINT 
4736  PRINT "REGRESSION LINE --"
4737  S$="+"
4738  IF B9 >= 0 THEN 4740
4739  S$=" "
4740  PRINT  USING 4741;Y$,A9,S$,B9,X$
4741  IMAGE 5X,15A," = ",6D.5D,X,A,6D.5D,"*",15A
4744  PRINT 
4745  GOSUB 6500
4750  IF A5>0 THEN 4760
4752  STOP 
4760  PRINT 
4800  PRINT 
4805  IF A6=1 THEN 4900
4810  PRINT "Y-AXIS RUNS FROM ";Y1;" TO ";Y2
4820  PRINT "X-AXIS RUNS FROM ";X1;" TO ";X2
4830  PRINT 
4840  GOTO 4990
4900  PRINT "Y-AXIS -- BOTTOM";
4901  INPUT Y1
4902  PRINT "             TOP";
4903  INPUT Y2
4910  PRINT "X-AXIS --   LEFT";
4911  INPUT X1
4912  PRINT "           RIGHT";
4913  INPUT X2
4990  FOR I=1 TO 3
4991  PRINT 
4992  NEXT I
5000  REM -- NAME: REGPL2
5001  REM -- CHAINS FROM: REGPLT
5009  DIM C$[10]
5010  C$="*23456789"
5020  DIM L$[72]
5100  REM -- RESET ALL VALUES TO INTERVALS
5102  A6=A9+(B9*X1)
5103  Z1=INT((X9*(0-X1)/(X2-X1))+1.001)
5104  Z2=INT((Y9*(0-Y1)/(Y2-Y1))+1.001)
5105  A2=INT((Y9*(A2-Y1)/(Y2-Y1))+1.001)
5106  A1=INT((X9*(A1-X1)/(X2-X1))+1.001)
5107  A6=INT((Y9*(A6-Y1)/(Y2-Y1))+1.001)
5108  A8=(Y1-A9)/B9
5109  A8=INT((X9*(A8-X1)/(X2-X1))+1.001)
5110  FOR I=1 TO N
5120  Y[I]=INT((Y9*(Y[I]-Y1)/(Y2-Y1))+1.001)
5121  IF Y[I] <= Y9 THEN 5130
5122  Y[I]=Y9
5130  X[I]=INT((X9*(X[I]-X1)/(X2-X1))+1.001)
5131  IF X[I] <= X9 THEN 5140
5132  X[I]=X9
5140  NEXT I
5150  REM -- SORT ROWS
5160  N9=N
5170  N9=N9-1
5180  N8=0
5190  FOR I=1 TO N9
5200  IF Y[I]>Y[I+1] THEN 5320
5210  IF Y[I]<Y[I+1] THEN 5250
5220  REM -- YS ARE EQUAL
5230  IF X[I] <= X[I+1] THEN 5320
5240  GOTO 5290
5250  REM -- SWITCH
5255  N8=1
5260  Y3=Y[I]
5270  Y[I]=Y[I+1]
5280  Y[I+1]=Y3
5290  X3=X[I]
5300  X[I]=X[I+1]
5310  X[I+1]=X3
5320  NEXT I
5330  IF N8=1 THEN 5170
5340  REM -- PRINT
5350  R1=1
5355  PRINT Y$
5356  PRINT 
5360  FOR Y3=Y9 TO 1 STEP -1
5370  L9=0
5371  IF Y3=A6 THEN 5375
5372  IF Y3 <> A2 THEN 5380
5373  L$[1,1]="M"
5374  GOTO 5390
5375  L$[1,1]="L"
5376  GOTO 5390
5380  L$[1,1]=" "
5390  REM -- PROCEED
5400  FOR C1=1 TO X9
5410  REM -- SET UP AXIS SYMBOL OR SPACE
5412  IF Y3=Z2 THEN 5426
5416  IF C1=Z1 THEN 5422
5418  P$=" "
5420  GOTO 5500
5422  P$="!"
5423  L9=C1
5424  GOTO 5500
5426  IF C1=Z1 THEN 5432
5428  P$="-"
5429  L9=C1
5430  GOTO 5500
5432  P$="+"
5433  L9=C1
5500  REM -- FIND ENTRIES
5510  C9=0
5511  IF R1>N THEN 5600
5512  IF Y[R1]>Y3 THEN 5524
5513  IF Y[R1]<Y3 THEN 5600
5516  IF X[R1]<C1 THEN 5524
5517  IF X[R1]>C1 THEN 5600
5520  REM -- ROW CONTAINS AN ITEM
5522  C9=C9+1
5524  REM -- GO TO NEXT ROW
5525  R1=R1+1
5526  GOTO 5511
5600  REM -- PRINT CHARACTER
5610  IF C9=0 THEN 5630
5612  IF C9 <= 9 THEN 5620
5614  C9=9
5620  P$=C$[C9,C9]
5622  L9=C1
5630  L$[C1+1,C1+1]=P$
5650  NEXT C1
5660  L$=L$[1,L9+1]
5665  PRINT L$
5710  NEXT Y3
5720  REM -- PRINT HORIZONTAL AXIS
5730  PRINT 
5740  L$[1,1]=" "
5750  FOR I=1 TO X9
5751  IF I=A8 THEN 5756
5752  IF I <> A1 THEN 5760
5753  L$[I+1,I+1]="M"
5754  GOTO 5770
5756  L$[I+1,I+1]="L"
5757  GOTO 5770
5760  L$[I+1,I+1]=" "
5770  NEXT I
5785  PRINT L$;X$
5790  FOR I=1 TO 5
5795  PRINT 
5796  NEXT I
6000  STOP 
6500  REM - SUBROUTINE TO COMPUTE ADJ. R2 AND STD ERRORS
6510  IF N<3 THEN 6690
6520  T6=T4-T1*T1/N
6530  T7=(T3-T1*T2/N)/T6
6540  T8=(T2-T7*T1)/N
6550  T9=T5-T2*T2/N
6560  U1=T9-T7*T7*T6
6570  T9=T9/(N-1)
6580  U1=U1/(N-2)
6590  U2=(T9-U1)/T9
6600  U3=U1/T6
6610  U3=SQR(U3)
6620  U4=U1*T4/(T6*N)
6630  U4=SQR(U4)
6640  PRINT  USING 6650;U4,U3
6650  IMAGE "STANDARD ERRORS:",7X,6D.5D,2X,6D.5D
6652  PRINT  USING 6653;A9/U4,B9/U3
6653  IMAGE "T-VALUES:",14X,6D.5D,2X,6D.5D
6660  PRINT 
6670  PRINT "R-SQUARED -- UNADJUSTED: ";R2;"  ADJUSTED: ";U2
6680  PRINT 
6690  RETURN 
9999  END 
