This program performs statistical analysis on paired (x, y) datasets entered by the user or loaded from tape. It computes descriptive statistics including mean, standard deviation, coefficient of variation, standard error of the mean, and an F-test for comparing precision between the two datasets. Inferential statistics include linear regression, Pearson’s correlation coefficient, and a two-sample t-test. Additional features include a Shell sort (Shellsort) algorithm implemented in BASIC for ranking data to find medians, minima, and maxima, plus graphical output as a scatter plot with regression line or a 15-column histogram bar chart. User-defined graphics are loaded via POKEs to USR addresses at runtime using three 8-byte character definitions stored in DATA statements, and the program supports LPRINT for hard-copy data output as well as COPY for screen dumps.
Program Structure
The program is organized into clearly delineated functional blocks, each introduced by a REM statement with inverse-video labels. The top-level flow is:
- Lines 10–60: Title splash, optional instructions branch
- Lines 70–190: UDG setup, data input or tape load, array initialization
- Lines 200–595: Interactive data editing loop
- Lines 600–630: UDG DATA definitions
- Lines 650–690: Reusable print/copy subroutine
- Lines 700–840: Calculation dispatch and main menu
- Lines 900–1280: Descriptive statistics display (mean, SD, CV, SEM, F-test, sort, median)
- Lines 1300–1550: Inferential statistics display (regression, correlation, t-test)
- Lines 1600–3650: Graphical output (line graph, bar chart)
- Lines 6000–6080: Save/restart/exit handler
- Lines 7000–7190: Core calculation subroutine
- Lines 8000–8460: Full multi-page instruction set
Data Storage
Input data is stored in a two-column array X(A,2) where column 1 holds x values and column 2 holds y values. Two separate single-dimension arrays, B(A) and C(A), are copies of the x and y columns respectively and are used exclusively by the sort/median routine so that the original data in X() remains unmodified for subsequent analyses. Data can be saved to and loaded from tape using SAVE "S.A. Data" DATA X() / LOAD "S.A. Data" DATA X().
ON ERR Usage
Lines 180–190 use an inventive technique to determine the actual number of data rows stored in array X() after a tape load. A loop walks N from 1 to 999, reading X(N,1); when N exceeds the array bound, an error is triggered. ON ERR GO TO 190 at line 180 catches this, and line 190 immediately cancels the handler with ON ERR RESET, then sets LET A=N-1 to recover the true count. This is a well-established idiom for probing array bounds at runtime.
Shell Sort Implementation
Lines 1112–1145 implement a Shellsort (diminishing-increment sort) entirely in BASIC, sorting arrays B() and C() independently into descending order. The gap sequence halves on each pass (mm = INT(mm/2)), and elements are swapped via a temporary variable tt. The program’s own instruction text acknowledges this is slow because it is in BASIC rather than machine code. The two sort blocks (x at 1112–1126, y at 1131–1145) are structurally identical, differing only in the array they operate on.
Calculation Subroutine (line 7000)
The subroutine at line 7000 computes all statistical values in a single pass where possible:
t1–t5: Σx, Σy, Σx², Σy², Σxyp,q: means of x and y (rounded to 3 decimal places)D: regression coefficient b, using the formula b = (Σxy − Σx·Σy/(n−1)) / (Σx² − (Σx)²/(n−1))U: Pearson’s r, similarly computed from the sumsE: regression intercept c = mean(y) − b·mean(x)s3,s4: SD of x and y usingSQR(SS/(n−2))— note divisor isi−2after a loop ending ati=A+1, yielding effectivelyA−1in the denominator, giving the sample SDs5,s6: SEM = SD / SQR(n)T: two-sample t statisticu2: degrees of freedom = 2A−2
There is a subtle indexing anomaly: the regression and correlation formulas at lines 7070–7080 use h−1 as the denominator after the loop ends with h=A+1, making the effective divisor A — consistent with the standard formula. However this is easy to misread in the listing.
User-Defined Graphics
Three UDG characters (chars 144–146, i.e. \a, \b, \c) are defined at lines 80–630. The DATA at lines 610–630 provides three 8-byte bitmaps POKEd into UDG memory via POKE USR CHR$(144+f)+g, a. The characters appear to be decorative symbols used inline in PRINT statements — notably \b and \c appear in line 970 and 1350 as labels for the mean values of x and y respectively (printed as x̄ and ȳ equivalents).
Bar Chart Algorithm
The bar chart routine (lines 2097–3650) bins data into exactly 15 equal-width intervals between the minimum and maximum values. The bin width is divx = (maxx − minx) / 15. For each bin, a nested loop counts how many data points fall within [minx, minx+divx), with a small epsilon (+0.000001) added to the last bin’s upper bound to ensure the maximum value is included. A secondary sort of the frequency array (another Shellsort-like bubble pass at lines 2170–2190) finds the maximum frequency for scaling. If the tallest bar exceeds 18 pixels, a scale factor is computed by repeatedly subtracting 18 and incrementing scalex, then all bar heights are divided by this factor. Bars are drawn two character columns wide using inverse-video space characters.
Line Graph
The scatter plot at lines 1660–1760 plots each (x, y) pair as a small circle using CIRCLE at pixel coordinates (8*x+17, 8*y+9), giving an 8-pixel-per-unit scale. The regression line is drawn with PLOT 17, 8*E : DRAW p+16*p, q+16*p — a single DRAW from the y-intercept. The program correctly notes this only works for positively correlated data and points users to specific line numbers to delete for negative correlation. Data is constrained to x < 26, y < 18 before plotting.
Menu Dispatch
The main menu at lines 730–840 uses a computed GO TO pattern. After reading a digit string W$ and converting it with VAL, choices 1–3 branch to 800 + W*100 (i.e. 900, 1000, 1100) and choices 5–6 branch to 1000 + W*100 (i.e. 1500, 1600). Choice 4 branches directly to 1300 and choice 7 to 2000. This avoids a long IF-THEN chain at the cost of some arithmetic.
String Variable O$
The variable O$ initialized at line 25 holds a five-character control-code sequence: CHR$(21)+CHR$(1)+CHR$(22)+CHR$(0)+CHR$(0). This embeds an OVER 1 attribute followed by an AT 0,0 cursor positioning sequence, used as an inline underline effect when printed after a heading — the OVER 1 mode causes subsequent characters to XOR with screen content, creating an underline on the line below without erasing existing text.
Copy/Printer Handling
The subroutine at line 650 serves as a universal pause-and-continue handler. It checks the flag CPY: if set to 1 (by the instruction copy mode activated at line 8420), it immediately issues COPY and returns. Otherwise it prompts the user to press Enter to continue or z to copy. The data listing routine at lines 1020–1090 additionally uses LPRINT directly when the dataset has more than 20 pairs, routing output to the printer rather than the screen.
Bugs and Anomalies
- Line 260:
IF V$="Y"branches to the y-value change routine at 410, but the prompt at line 250 asks forxory— the test for"Y"is case-sensitive and would match a capital Y input intended as “yes” rather than the y-axis selector, potentially confusing users who type uppercase. - Line 1220: The median calculation for an odd number of values uses
LET M1=B(s)wheres=A/2(not rounded), so for e.g. A=5, s=2.5 andB(2.5)is evaluated — BASIC will truncate the index to 2, which is the correct lower of the two middle elements for an odd-length array, but the intent is arguablyB(INT(A/2)+1)for the true middle. - Lines 7070–7080: The regression and correlation formulas use
h-1as divisor wherehis the loop variable left atA+1after the FOR-NEXT at line 7040, makingh-1 = A. This is numerically correct but relies on the post-loop value of the FOR variable, which is a common but fragile BASIC idiom. - Line 1260: The condition
M1-.1 = INT(p*10+.5)/10 OR M1-.1 = INT(p*10+.5)/10repeats the same sub-expression twice; the second clause was presumably intended to beM1+.1, making the test a ±0.1 tolerance check. As written, one branch is redundant.
Content
Source Code
10 REM \{20}\{1}STATISTICS PROGRAM\{20}\{0}
21 BEEP .9,28:PAPER 0:BORDER 0:INK 6:CLS :PRINT INVERSE 1; AT 10,5;" STATISTICAL ANALYSIS "
25 POKE 23658,8:LET CPY=0:LET O$= CHR$ 21+ CHR$ 1+ CHR$ 22+ CHR$ 0+ CHR$ 0
30 BEEP .8,30:PRINT INK 7'''"\{20}\{0} WOULD YOU LIKE INSTRUCTIONS?"'' TAB 12;"(Y/N)"
40 PAUSE 0:IF INKEY$="Y" THEN CLS :GO TO 8000
50 IF INKEY$="N" THEN GO TO 70
60 GO TO 40
70 REM \{20}\{1}DATA INPUT , STORAGE, PRINTING, READ GRAPHICS.\{20}\{0}
75 POKE 26564,35:PAPER 6:INK 1:BORDER 6:CLS
80 RESTORE :FOR f=0 TO 2:FOR g=0 TO 7:READ a:POKE USR CHR$ (144+f)+g,a:NEXT g:NEXT f
90 BEEP .7,25:PRINT INK 1;" STATISTICAL ANALYSIS OF DATA BY GREG TURNBULL 1983.";O$;"________________________________________________________________"''
95 PRINT AT 5,0;"DO YOU WISH TO LOAD IN OLD DATA THAT WAS SAVED? (Y/N)":PAUSE NOT PI:IF INKEY$="Y" THEN GO TO 175
100 PRINT AT 5,0;"TYPE IN YOUR TOTAL NUMBER OF DATA PAIRS (N)",:INPUT r:PRINT "N=";r'':LET A=r
120 PRINT INK 1;"TYPE IN YOUR X AND Y VALUES (ENTER EACH ONE):"''
130 PRINT INK PI;"NOTE:IF YOU MAKE A MISTAKE","WRITE IT DOWN AND YOU WILL","BE ABLE TO ALTER IT LATER."
150 DIM X(A,2):PRINT :FOR N=1 TO A:INPUT "x: ";x;" y: ";y:LET X(N,1)=x:LET X(n,2)=y:GO SUB 160:NEXT N:GO TO 180
160 PRINT INK 1;"N:";n; TAB 6;"x:";X(n,1),"y:";X(n,2):RETURN
175 CLS :PRINT AT 10,0;"PRESS ENTER AND PLAY DATA TAPE":PAUSE 0:LOAD "S.A. DATA"DATA X()
180 ON ERR GO TO 190:FOR N=1 TO 999:LET A=X(N,1):NEXT N
190 ON ERR RESET :PAUSE 90:CLS :PRINT "DATA"'':LET A=N-1:DIM B(A):DIM C(A):FOR N=1 TO A:LET B(N)=X(N,1):LET C(N)=X(N,2):GO SUB 160:NEXT N
200 REM \{20}\{1}CHOICE OF ALTERING DATA\{20}\{0}
210 BEEP .3,30:PRINT INK 2;"WOULD YOU LIKE TO ALTER","ANY DATA? (Y/N):":INPUT Q$:CLS
220 IF Q$="Y" THEN GO TO 250
230 IF Q$="N" THEN GO TO 700
240 GO TO 210
250 PRINT "WOULD YOU LIKE TO CHANGE","x OR y VALUES? (x/y):":INPUT V$:CLS
260 IF V$="Y" THEN GO TO 410
270 IF V$="X" THEN GO TO 290
280 GO TO 250
290 BEEP .3,30:PRINT INK 1;"CHANGE AN x VALUE:";O$;" "''
300 PRINT "INPUT THE DATA ROW NUMBER","FOR THE CHANGE (N):":INPUT N:CLS
305 IF N>A THEN GO TO 300
310 PRINT "INPUT THE x VALUE YOU WANT","FOR THIS ROW (x):":INPUT W:CLS
320 LET X(N,1)=W:LET B(N)=W
330 PRINT "DO YOU WANT TO ALTER ANY MORE x VALUES? (Y/N):":INPUT Q$:CLS
340 IF Q$="Y" THEN GO TO 290
350 IF Q$="N" THEN GO TO 370
360 GO TO 330
370 PRINT "DO YOU WANT TO ALTER ANY","y VALUES?(Y/N):":INPUT Q$:CLS
380 IF Q$="Y" THEN GO TO 410
390 IF Q$="N" THEN GO TO 530
400 GO TO 370
410 BEEP .3,30:PRINT INK 1;"CHANGE A y VALUE:";O$;"________________"''
420 PRINT "INPUT THE DATA ROW NUMBER","FOR THE CHANGE (N):":INPUT N:CLS
425 IF N>A THEN GO TO 420
430 PRINT "INPUT THE y VALUE YOU WANT","FOR THIS ROW (y):":INPUT V:CLS
440 LET X(N,2)=V:LET C(N)=V
450 PRINT "DO YOU WANT TO ALTER ANY MORE y VALUES? (Y/N):":INPUT Q$:CLS
460 IF Q$="Y" THEN GO TO 410
470 IF Q$="N" THEN GO TO 490
480 GO TO 450
490 PRINT "DO YOU WANT TO ALTER ANY","x VALUES? (Y/N):":INPUT Q$:CLS
500 IF Q$="Y" THEN GO TO 290
510 IF Q$="N" THEN GO TO 530
520 GO TO 490
530 PRINT INK PI;"NEW DATA VALUES:";O$;"_______________"''
540 FOR N=1 TO A
550 PRINT "N:";n;" ";"x:";X(n,1),"y:";X(n,2)
560 NEXT n
570 PRINT :PRINT INK 2;"WOULD YOU LIKE TO ALTER ANY FURTHER DATA? (Y/N):":INPUT Q$:CLS
580 IF Q$="Y" THEN GO TO 250
590 IF Q$="N" THEN GO TO 700
595 GO TO 570
600 REM \{20}\{1}DATA FOR GRAPHICS\{20}\{0}\{20}\{1}.\{20}\{0}
610 DATA 0,126,66,32,24,32,66,126
620 DATA 255,0,195,102,60,60,102,195
630 DATA 255,0,195,102,60,24,48,224
650 REM \{20}\{1}\{20}\{0}\{20}\{1}COPY DATA TO PRINTER.\{20}\{0}\{20}\{0}
655 IF CPY=1 THEN COPY :CLS :RETURN
660 INPUT "ENTER TO CONTINUE, Z TO COPY";W$
670 IF W$="z" THEN COPY :CLS :RETURN
680 IF W$="" THEN CLS :RETURN
690 GO TO 650
700 PRINT PAPER 1; INK 6; FLASH 1;"PLEASE WAIT."'':PRINT PAPER 6; INK 1; FLASH 0;"THE COMPUTER IS CALCULATING THE STATISTICAL VALUES."''
710 GO SUB 7000:CLS
720 REM \{20}\{1}\{20}\{1}MENU OF CHOICES.\{20}\{1}\{20}\{0}
730 \{20}\{0} CLS :BEEP .3,30:PRINT INK 1;"WHICH TYPE OF ANALYSIS WOULD YOU LIKE?"''
740 PRINT INK 2;"A) DESCRIPTIVE STATISTICS:"'':PRINT INK 1;"TYPE IN '1' FOR MEAN,SD,CV(%), SEM & F-TEST:":PRINT "TYPE IN '2' TO PRINT THE DATA":PRINT "TYPE IN '3' FOR MIN,MAX & MEDIAN"''
750 PRINT INK 2;"B) STATISTICAL ANALYSIS:"'':PRINT INK 1;"TYPE IN '4' FOR REGRESSION AND CORRELATION":PRINT "TYPE IN '5' FOR 2-SAMPLE t-TEST"''
760 PRINT INK 2;"C) GRAPHS:"'':INK 1:PRINT "TYPE IN '6' FOR A LINE GRAPH"'"TYPE IN '7' FOR A BAR CHART"'':PRINT INK PI;"TYPE IN '0' TO SAVE DATA/RESTART"
770 INPUT W$:IF W$="" THEN GO TO 720
780 LET W= VAL W$:CLS
790 IF W=0 THEN GO TO 6000
800 IF W>0 AND W<4 THEN GO TO 800+W*100
810 IF W>4 AND W<7 THEN GO TO 1000+W*100
820 IF W=4 THEN GO TO 1300
830 IF W=7 THEN GO TO 2000
840 IF W>7 THEN GO TO 720
900 REM \{20}\{1}START OF DESCRIPTIVE STATISTICS MEANS SD. CV(%) SEM F-TEST \{20}\{0}
915 BEEP .3,30:PRINT INK PI;"DESCRIPTIVE STATISTICS:";O$;"______________________"''
920 LET s3= INT (s3*10^5+.5)/(10^5):LET s4= INT (s4*10^5+.5)/(10^5)
930 LET v1= INT (v1*10^3+.5)/(10^3):LET v2= INT (v2*10^3+.5)/(10^3)
940 LET s5= INT (s5*10^5+.5)/(10^5):LET s6= INT (s6*10^5+.5)/(10^5)
950 LET h1=s3^2:LET h2=s4^2
955 IF h1>h2 OR h1=h2 THEN LET h3=h1/h2
960 IF h2>h1 THEN LET h3=h2/h1
965 LET h3= INT (h3*10^4+.5)/(10^4):LET h4=A-1
970 PRINT "N=";A;" \b=";P;" \c=";q:PRINT '"S.D. of x=";s3:PRINT "CV(%) of x=";v1:PRINT "S.E.M for x=";s5
975 PRINT '"S.D. of y=";s4:PRINT "CV(%) of y=";v2:PRINT "S.E.M for y=";s6''
980 PRINT INK PI; AT 12,0;"F-TEST:"; OVER 1; AT 12,0;"______"'':PRINT INK 1;"A TEST TO COMPARE THE PRECISION OF x WITH THAT OF y.":PRINT "THE F VALUE=";h3:PRINT "FOR DF1 & DF2 OF:";h4:PRINT "THIS VALUE CAN BE LOOKED UP IN F-TABLES TO FIND A PROBABILITY (P) VALUE FOR SIGNIFICANCE TESTING."
990 GO SUB 650:GO TO 720
1000 REM \{20}\{1}PRINT DATA\{20}\{0}
1010 BEEP .3,30:PRINT INK 2;"DATA:";O$;" "''
1020 IF A<21 THEN GO TO 1060
1030 LPRINT "DATA.";O$;" "'':FOR n=1 TO A
1040 LPRINT "N:";n; TAB 6;"x:";X(n,1),"y:";X(n,2)
1050 NEXT n:GO TO 1090
1060 FOR n=1 TO A
1070 PRINT "N:";n; TAB 6;"x:";X(n,1),"y:";X(n,2)
1080 NEXT n
1090 GO SUB 650:GO TO 720
1100 REM \{20}\{1}DATA SORTING INTO DESCENDING ORDER .PRINT RANKEDDATA \{20}\{0}
1110 PRINT PAPER 1; INK 7; FLASH 1;"PLEASE WAIT."'':PRINT PAPER 6; INK 1;"THE COMPUTER IS RANKING THE DATA"
1112 LET mm=A
1113 LET mm= INT (mm/2)
1114 IF mm=0 THEN GO TO 1130
1115 LET kk=A-mm
1116 LET jj=1
1117 LET ii=jj
1118 LET ll=ii+mm
1119 IF B(ii) >=B(ll) THEN GO TO 1124
1120 LET tt=B(ll):LET B(ll)=B(ii):LET B(ii)=tt
1121 LET ii=ii-mm
1122 IF ii<1 THEN GO TO 1124
1123 IF NOT ii<1 THEN GO TO 1118
1124 LET jj=jj+1
1125 IF jj>kk THEN GO TO 1113
1126 GO TO 1117
1130 REM \{20}\{1}SORT Y VALUES\{20}\{0}
1131 LET mm=A
1132 LET mm= INT (mm/2)
1133 IF mm=0 THEN GO TO 1160
1134 LET kk=A-mm
1135 LET jj=1
1136 LET ii=jj
1137 LET ll=ii+mm
1138 IF C(ii) >=C(ll) THEN GO TO 1143
1139 LET tt=C(ll):LET C(ll)=C(ii):LET C(ii)=tt
1140 LET ii=ii-mm
1141 IF ii<1 THEN GO TO 1143
1142 IF NOT ii<1 THEN GO TO 1137
1143 LET jj=jj+1
1144 IF jj>kk THEN GO TO 1132
1145 GO TO 1136
1150 REM \{20}\{1}PRINT SORTEDDATA \{20}\{0}
1160 CLS :BEEP .3,30:PRINT INK PI;"RANKED DATA:";O$;"___________"''
1165 FOR l=1 TO A
1170 PRINT "n:";l; TAB 6;"x:";B(l),"y:";C(l)
1180 NEXT l
1190 GO SUB 650
1200 REM \{20}\{1}MIN,MAX AND MEDIANS.\{20}\{0}
1205 PRINT INK PI;"MIN, MAX, MEDIANS:";O$;"_________________"''
1210 LET s=A/2:IF s= INT s THEN GO TO 1230
1220 LET M1=B(s):LET M2=C(s):GO TO 1240
1230 LET w=A/2:LET v=A/2+1:LET M1=(B(w)+B(v))/2:LET M2=(C(w)+C(v))/2
1240 PRINT \{16}\{0}"MEDIAN OF x=";M1\{16}\{0}:PRINT "MINIMUM VALUE OF x IS ";B(A):PRINT "MAXIMUM VALUE OF x IS ";B(1)''
1250 PRINT "MEDIAN OF y=";M2'"MINIMUM VALUE OF y=";C(A)'"MAXIMUM VALUE OF y IS ";C(1)''
1260 LET M1= INT (M1*10+.5)/10:IF M1= INT (p*10+.5)/10 OR M1-.1= INT (p*10+.5)/10 OR M1-.1= INT (p*10+.5)/10 THEN PRINT "median of x approx' equal to mean of x indicating normally distributed x data."''
1270 LET M2= INT (M2*10+.5)/10:IF M2= INT (q*10+.5)/10 OR M2+.1= INT (q*10+.5)/10 OR M2-.1= INT (q*10+.5)/10 THEN PRINT "median of y approx' equal to mean of y indicating normally distributed y data."''
1280 GO SUB 650:GO TO 720
1300 REM \{20}\{1}START OF STATISTICAL ANALYSIS.\{20}\{0}
1310 REM \{20}\{1}REGRESSION AND CORRELATION.\{20}\{0}
1320 BEEP .3,30:PRINT INK PI;"REGRESSION AND CORRELATION:"''
1330 LET E= INT (E*10^5+.5)/(10^5):LET D= INT (D*10^5)/(10^5):LET U= INT (U*10^5)/(10^5)
1340 PRINT "\ax=";t1,"\ax*x=";t3,"\ay=";t2,"\ay*y=";t4,"\ax*y=";t5
1350 PRINT "n=";A;" \b=";p;" \c=";q'':PRINT INK 0;"FOR y=b*x+c"'':PRINT "b=";D,"","c=";E:PRINT '' INK PI;"COR. COEFF'"; INK 1''"r=";U''
1360 IF D>.75 AND U>.75 THEN PRINT "b and r are >.75 indicating a strong positive linear correlation between x and y."''
1370 IF D<-.75 AND U<-.75 THEN PRINT "b and r are <-.75 indicating a strong negative linear correlation between x and y."''
1375 IF D<.75 AND U>.75 THEN PRINT "correlation coefficient (r)<.75 indicating a strong positive relationship between x and y."
1380 IF U=0 THEN PRINT "r=0 this indicates that x and y are totally uncorrelated."
1390 GO SUB 650:GO TO 720
1500 REM \{20}\{1}t-TEST AND DF.\{20}\{0}
1510 BEEP .3,30:PRINT INK PI;"2-SAMPLE t-TEST:"''
1515 LET T= INT (T*10^5+.5)/(10^5)
1520 PRINT INK 0;"for DF=";U2''
1530 PRINT INK 0;"THE VALUE OF t=";T''
1540 PRINT INK 1;"LOOK UP YOUR t VALUE IN t-TABLESFOR THE ABOVE DF, AND FIND THE PROBABILITY VALUE (P) FOR SIGNIFICANCE TESTING."''
1550 GO SUB 650:GO TO 720
1600 REM \{20}\{1}START OF GRAPHICAL SECTION.\{20}\{0}
1605 REM \{20}\{1}DRAW LINE GRAPH.\{20}\{0}
1610 BEEP .3,32:PRINT INK PI;"A LINE GRAPH OF x,y:";O$;" "''
1620 PRINT INK 1;"HAVE YOU BEEN VIA THE MEDIANS ROUTINE? (Y/N)"''"THIS IS BECAUSE THE MAXIMUM AND MINIMUM VALUES ARE NEEDED FOR THE BARCHART."'':PAUSE 0
1625 IF INKEY$="N" THEN GO TO 720
1630 IF NOT INKEY$="Y" THEN CLS :GO TO 1600
1635 FOR N=1 TO 20:NEXT N
1640 PRINT ''"TYPE IN THE NAME OF THE x-AXIS":INPUT A$
1650 PRINT '"TYPE IN THE NAME OF THE y-AXIS":INPUT B$:CLS
1660 LET F=B(1):LET G=C(1)
1670 IF F>26 THEN LET F=26
1680 IF G>18 THEN LET G=18
1690 FOR O=17 TO (8*F+40):PLOT O,9:NEXT O
1700 FOR M=9 TO (8*G+22):PLOT 17,M:NEXT M
1710 PRINT AT 21,3;A$:PRINT AT 18-G,2;B$:PRINT AT 19-G,0;G:PRINT AT 21,2.5+F;F:PRINT AT 21,1;"0"
1720 FOR n=1 TO A
1730 IF X(n,1) >=26 OR X(n,2) >=18 THEN PRINT AT 19,3;"DATA IS TOO LARGE":GO SUB 650:GO TO 720
1735 BEEP .02,12:INK 2:OVER 0:CIRCLE 8*X(n,1)+17,8*X(n,2)+9,2
1740 NEXT n
1750 IF p>10 OR q>10 THEN PRINT AT 19,3;"MEAN VALUES ARE TOO LARGE":GO SUB 650:GO TO 720
1760 FOR Z=1 TO 20:BEEP .05,50-z:NEXT z:INK 1:PLOT 17,8*E:DRAW p+16*p,q+16*p:PAUSE 200
1770 GO SUB 650:GO TO 720
2000 REM \{20}\{1}BAR CHART.\{20}\{0}
2010 BEEP .3,30:PRINT INK PI;"BAR CHART.";O$;"_________"''
2020 PRINT INK 1;"HAVE YOU BEEN VIA THE MEDIANS ROUTINE? (Y/N)"''"THIS IS BECAUSE THE MAXIMUM AND MINIMUM VALUES ARE NEEDED FOR THE BARCHART."'':PAUSE 0
2040 IF INKEY$ <>"Y" THEN GO TO 720
2060 PRINT INK 1;"WOULD YOU LIKE A BAR CHART OF THE x OR y DATA? TYPE IN x OR y OR PRESS ENTER TO RETURN:"'':INPUT z$:CLS
2070 IF z$="X" THEN GO TO 2097
2080 IF z$="Y" THEN GO TO 2500
2085 IF z$="" THEN GO TO 720
2090 GO TO 2060
2095 PRINT FLASH 1;"PLEASE WAIT ."'' FLASH 0;"THIS MAY TAKE SOME TIME!":RETURN
2097 GO SUB 2095
2099 REM \{20}\{1}\{20}\{1}CALCULATE X VALUES.\{20}\{0}
2100 LET minx=B(A):LET maxx=B(1):DIM R(15):DIM L(16):LET divx=(maxx-minx)/15
2110 FOR B=1 TO 15:FOR n=1 TO A
2120 LET P9=0:LET R9=minx+divx
2125 IF B=15 THEN LET R9=R9+.000001
2130 IF X(n,1) >=minx AND X(n,1)<R9 THEN LET P9=P9+1:LET R(B)=R(B)+P9:LET L(B)=L(B)+P9
2140 NEXT n
2150 LET minx=minx+divx
2160 NEXT B
2165 PRINT "NEARLY FINISHED."
2170 FOR J=1 TO 15:FOR K=1 TO 15
2180 LET l=0:IF L(K+1)>L(K) THEN LET l=L(K):LET L(K)=L(K+1):LET L(K+1)=l
2190 NEXT K:NEXT J
2200 LET highx=L(1):LET scalex=1
2210 IF highx>18 THEN LET scalex=scalex+1:LET highx=highx-18:GO TO 2210
2250 GO TO 3000
2500 GO SUB 2095
2505 REM \{20}\{1}CALCULATE y VALUES.\{20}\{0}
2510 LET miny=C(A):LET maxy=C(1):DIM S(15):DIM M(16):LET divy=(maxy-miny)/15
2520 FOR B=1 TO 15:FOR n=1 TO A
2530 LET P9=0:LET R9=miny+divy
2535 IF B=15 THEN LET R9=R9+.000001
2540 IF X(n,2) >=miny AND X(n,2)<R9 THEN LET P9=P9+1:LET S(B)=S(B)+P9:LET M(B)=M(B)+P9
2550 NEXT n
2560 LET miny=miny+divy
2570 NEXT B
2575 PRINT "NEARLY FINISHED."
2580 FOR J=1 TO 15:FOR K=1 TO 15
2590 LET l=0:IF M(K+1)>M(K) THEN LET l=M(K):LET M(K)=M(K+1):LET M(K+1)=l
2600 NEXT K:NEXT J
2610 LET highy=M(1):LET scaley=1
2620 IF highy>18 THEN LET scaley=scaley+1:LET highy=highy-18:GO TO 2620
2630 GO TO 3500
3000 REM \{20}\{1}DRAW BAR CHART OF x .\{20}\{0}
3010 IF scalex=1 THEN GO TO 3030
3020 \{20}\{0} FOR B=1 TO 15:LET R(B)= INT (R(B)/scalex+.5):NEXT B
3030 BEEP .5,20:CLS :DIM J$(18):PRINT "INPUT THE NAME OF THE HORIZONTAL(x) AXIS:":INPUT I$
3040 PRINT "INPUT THE NAME OF THE VERTICAL (y) AXIS:":INPUT J$:CLS
3050 BEEP .3,30:PLOT 16,16:DRAW 0,143:PLOT 16,16:DRAW 239,0:PRINT AT 0,4;"BAR CHART OF x.":PRINT AT 19,1;"0":PRINT AT 20,2;B(A):PRINT AT 20,28;B(1):PRINT AT 21,6;I$:FOR z=0 TO 17:PRINT AT z+4,0;J$(z+1):NEXT z:PRINT AT 2,0;18*scalex
3055 LET sp=2
3060 FOR B=1 TO 15
3065 IF R(B)=0 THEN LET sp=sp+2:GO TO 3110
3070 FOR J=1 TO R(B)
3080 PRINT INK 2; AT 20-J,sp;"\{20}\{1} \{20}\{0}":PRINT INK 2; AT 20-J,sp+1;"\{20}\{1} \{20}\{0}"
3090 NEXT J
3100 LET sp=sp+2
3110 NEXT B
3150 GO SUB 650:CLS :GO TO 2060
3500 REM \{20}\{1}DRAW BAR CHART OF y.\{20}\{0}
3510 IF scaley=1 THEN GO TO 3530
3520 FOR B=1 TO 15:LET S(B)= INT (S(B)/scaley+.5):NEXT B
3530 BEEP .25,20:CLS :DIM K$(18):PRINT "INPUT THE NAME OF THE HORIZONTAL(x) AXIS:":INPUT I$
3540 PRINT "INPUT THE NAME OF THE VERTICAL (y) AXIS:":INPUT K$:CLS
3550 BEEP .2,30:PLOT 16,16:DRAW 0,143:PLOT 16,16:DRAW 239,0:PRINT AT 0,4;"A BAR CHART OF y.":PRINT AT 19,1;"0":PRINT AT 20,2;C(A):PRINT AT 20,28;C(1):PRINT AT 21,6;I$:FOR z=0 TO 17:PRINT AT z+4,0;K$(z+1):NEXT z:PRINT AT 2,0;18*scaley
3560 LET sp=2
3570 FOR B=1 TO 15
3580 IF S(B)=0 THEN LET sp=sp+2:GO TO 3630
3590 FOR J=1 TO S(B)
3600 PRINT INK 2; AT 20-J,sp;"\{20}\{1} \{20}\{0}":PRINT INK 2; AT 20-J,sp+1;"\{20}\{1} \{20}\{0}"
3610 NEXT J
3620 LET sp=sp+2
3630 NEXT B
3650 GO SUB 650:CLS :GO TO 2060
6000 REM \{20}\{1}EXIT.\{20}\{0}
6010 \{20}\{0} PRINT "DO YOU WISH TO:"''" SAVE THE DATA (Y/N)":INPUT Y$:CLS
6020 IF Y$="N" THEN GO TO 6050
6030 IF Y$ <>"Y" THEN GO TO 6000
6040 SAVE "S.A. DATA"DATA X()
6050 PRINT ''"WOULD YOU LIKE TO:"'''"CONTINUE? C"''"CLEAR AND RUN AGAIN? R"''"OR STOP? S":INPUT Y$:CLS
6060 IF Y$="R" THEN GO TO 20
6070 IF Y$="C" THEN GO TO 720
6075 IF Y$="S" THEN STOP
6080 GO TO 6050
7000 REM \{20}\{1}CALCULATION OF SUM OF TOTALS MEANS SD CV SEM \{20}\{1}R\{20}\{0}\{20}\{1}EG CORR DF * t.\{20}\{0}
7010 \{20}\{0} LET t1=0:LET t2=T1:LET t3=T1:LET t4=T1:LET t5=T1:LET S1=T1:LET S2=T1
7020 FOR h=1 TO A
7030 LET t1=t1+X(h,1):LET t2=t2+X(h,2):LET t3=t3+X(h,1)^2:LET t4=t4+X(h,2)^2:LET t5=t5+X(h,1)*X(h,2)
7040 NEXT h
7050 LET q=t2/A:LET q= INT (q*10^3+.5)/(10^3):REM MEAN(y)
7060 LET p=t1/A:LET p= INT (p*10^3+.5)/(10^3):REM MEAN(x)
7070 LET d=(t5-(t1*t2/(h-1)))/(t3-(t1^2/(h-1))):REM REG(b)
7080 LET U=(t5-(t1*t2/(h-1)))/ SQR ((t3-(t1^2/(h-1)))*(t4-(t2^2/(h-1)))):REM COR(r)
7090 LET E=q-D*p:REM REG(c)
7100 FOR i=1 TO A
7110 LET s1=s1+(X(i,1)-p)*(X(i,1)-p):LET s2=s2+(X(i,2)-q)*(X(i,2)-q)
7120 NEXT i
7130 LET s3= SQR (s1/(i-2)):LET s4= SQR (s2/(i-2)):REM SD(x&y)
7140 LET v1=s3/p*100:LET v2=s4/q*100:REM CV(x&y)
7150 LET s5=s3/ SQR (i-1):LET s6=s4/ SQR (i-1):REM SEM(x&y)
7160 LET u2=2*A-2:REM DF
7170 IF q>p THEN LET T=(q-p)/ SQR ((2/(u2*A))*(t3+t4-(t1^2/A)-(t2^2/A))):GO TO 7190
7180 LET T=(p-q)/ SQR ((2/(u2*A))*(t3+t4-(t1^2/A)-(t2^2/A))):REM t-TEST
7190 RETURN
8000 REM \{20}\{1}INSTRUCTIONS.\{20}\{0}
8010 BEEP .8,30:PRINT INK 5;"INSTRUCTIONS ON STATISTICS:";O$;"__________________________"''
8020 PRINT INK 6;"THIS PROGRAM ALLOWS YOU TO INPUTTWO SETS OF DATA OF ANY LENGTH FOR A 72K 2068 TIMEX.","NOTE: BOTH SETS OF DATA MUST BE OF EQUAL LENGTH."'"THE TOTAL NUMBER OF DATA PAIRS BEING ENTERED AS n"''
8030 GO SUB 650
8040 PRINT INK 5;"THE RAW DATA:";O$;"____________"'' INK 6;"THIS WILL BE STORED IN TWO","SEPARATE ARRAYS, ONE FOR","PRINTING AND ANALYSIS, THE OTHERFOR RANKING (USED IN MEDIANS). YOU WILL THEN BE ABLE TO ALTER ANY OF THE DATA THAT MAY HAVE BEEN ENTERED INCORRECTLY. THE STATISTICAL TESTS ARE THEN ","PERFORMED AND A MENU OF CHOICES PRINTED."''
8050 GO SUB 650
8060 PRINT INK 5;"DESCRIPTIVE STATISTICS:"'' INK 6;"THIS GIVES YOU THE MEANS","(AVERAGES) OF THE TWO SETS OF DATA. IT ALSO GIVES YOU SOME MEASURES OF THE DISTRIBUTION OF VALUES ABOUT THE MEANS.":PRINT INK 5'"THESE ARE:"''"A) STANDARD DEVIATION:"; OVER 1; AT 10,3;"__________________":PRINT ' INK 6;"THIS VALUE IS BOTH POSITIVE (+) AND NEGATIVE (-). AT THE 95% CONFIDENCE LIMIT LEVEL 95.4% OF ALL VALUES SHOULD LIE WITHIN +2 OR -2 SD FROM THE MEAN. SO ANY VALUE OUTSIDE THESE LIMITS MUST BE CONSIDERED STATISTICALLY DIFFERENT FROM THE MEAN OF NORMALLY DISTRIBUTED DATA."
8070 PRINT :GO SUB 650
8080 PRINT INK 5;"B) COEFFICIENT OF VARIATION (CV)";O$;" _____________________________"'' INK 6;"THIS IS A PERCENTAGE (%) VALUE OFTEN USED TO EXPRESS THE","PRECISION OF THE DATA.","IT RELATES BOTH THE SD AND MEAN BY: CV=SD/MEAN*100%. A LOW CV INDICATES GOOD PRECISION, AND AHIGH VALUE INDICATES POOR","PRECISION."''
8090 GO SUB 650
8100 PRINT INK 5;"C) STANDARD ERROR OF THE MEAN (SEM):";O$;" __________________________"'''' INK 6;"THIS IS AN ESTIMATE OF HOW CLOSETHE MEAN OF YOR SAMPLE IS TO ","THE MEAN OF THE POPULATION FROM WHICH IT WAS TAKEN. HENCE THIS VALUE MAY NOT BE RELEVANT FOR ALL SETS OF DATA.","THE CALCULATION IS SEM=SD/SQR(n)SO AS SAMPLE SIZE INCREASES,","THE SEM SHOULD DECREASE AS IT APPROACHES THE 'TRUE' MEAN OF THE POPULATION. (WHERE SEM=0)"''
8110 GO SUB 650
8120 PRINT INK 5;"F-TEST:";O$;"______"'' INK 6;"THIS IS A TEST SOMETIMES USED TOCOMPARE THE PRECISIONS OF TWO SETS OF DATA. THE F VALUE IS","CALCULATED FROM THE VARIANCE","RATIO (VARIANCE=SD SQUARED) BY: F=(LARGER VARIANCE)/(SMALLER","VARIANCE). THIS VALUE IS THEN LOOKED UP IN F-TABLES FOR TWO DF(DEGREES OF FREEDOM) VALUES","(IN THIS CASE BOTH VALUES ARE EQUAL AND ONLY ONE IS PRINTED). FROM THE TABLES A PROBABILITY VALUE (P) IS FOUND AND THIS CAN BE USED IN ASSESSING THE SIGNIFICANCE (IF ANY) BETWEEN THE TWO PRECISIONS. SEE ALSO THENOTES ON THE t-TEST."
8130 PRINT :GO SUB 650
8140 PRINT INK 5;"PRINT DATA:";O$;"__________"' INK 6'"THE SECOND CHOICE ON THE MENU ALLOWS YOU TO LIST THE DATA.","THIS CAN BE COPIED BY PRESSING 'c' INSTEAD OF ENTER, SO ANY","TIME A HARD COPY OF THE","INSTRUCTIONS OR THE ANALYSIS IS REQUIRED JUST PRESS 'c'."''
8150 GO SUB 650
8160 PRINT INK 5;"MEDIANS & DATA SORTING:";O$;"_______ ____________"'' INK 6;"THE THIRD CHOICE (AND FINAL PARTOF DESCRIPTIVE STATISTICS) WILL USE A SORTING ROUTINE TO RANK THE SPARE ARRAY DATA INTO","DESCENDING ORDER (THIS MAY TAKE SOME TIME AS IT'S IN BASIC AND NOT MACHINE CODE!). ONCE THE DATA HAS BEEN RANKED IT WILL BE LISTED AND THE MAXIMUM, MINIMUM AND MEDIAN VALUES FOR x & y WILLBE DISPLAYED. THE MEDIAN IS A VALUE WHICH DIVIDES THE NUMBER OF OBSERVATIONS INTO TWO EQUAL PARTS. IN NORMALLY DISTRIBUTED DATA IT WOULD BE EQUAL, OR VERY CLOSE TO THE MEAN VALUE. THUS DIFFERENCES BETWEEN THE MEAN ANDMEDIAN SHOWS LEFT OR RIGHT SKEW IN THE DATA."
8170 PRINT :GO SUB 650
8180 PRINT INK 5;"THE MODE:";O$;"________"'' INK 6;"THIS IS THE MOST COMMONLY","OCCURING VALUE IN ANY SET OF","DATA. IN THIS PROGRAM IT CAN","EASILY BE SEEN IN THE LIST OF RANKED DATA. IN NORMALLY","DISTRIBUTED DATA THE MODE, MEAN AND MEDIAN WOULD ALL BE","(APPROXIMATELY) EQUAL. ANY LEFT OR RIGHT SKEW IN THE DATA WOULD MAKE THEM SIGNIFICANTLY","DIFFERENT FROM EACH OTHER."''
8190 GO SUB 650
8200 PRINT INK 5;"STATISTICAL ANALYSIS:";O$;"____________________"'' INK 6;"THESE CHOICES GIVE VARIOUS","CALCULATIONS ON THE DATA WHICH WOULD BE VERY TIME CONSUMING TO DO MANUALLY. THEY ARE REGRESION,CORRELATION AND t-TEST."''
8210 GO SUB 650
8220 PRINT INK 5;"REGRESSION ANALYSIS:";O$;"___________________"'' INK 6;"THIS IS AN ESTIMATE OF THE","ASSOCIATION OF THE x DATA WITH THE y DATA. LINEAR REGRESSION ISUSED, WHERE IF THE ASSOCIATION IS A STRAIGHT LINE THEN IT WILLHAVE THE FORMULAE y=b*x+c WHERE c=INTERCEPT ON THE y-AXIS AND b=REGRESSION COEFFICIENT","(GRADIENT). IF THE ASSOCIATION IS TOTALLY LINEAR THEN b WILL BE+1 OR -1 DEPENDING ON THE SLOPE OF THE LINE. STATISTICALLY","REGRESSION IS USED TO DRAW A","BEST-FIT LINE THROUGH SPREAD OUTDATA."''
8230 GO SUB 650
8240 PRINT INK 6;"HERE b IS CALCULATED AND USED TOFIND THE VALUE OF c (BY c=C-b*B)THE LINE IS THEN DRAWN FROM c THROUGH (B,C) TO THE UPPER","LIMITS OF THE DATA. THIS LINE DRAWING METHOD IS THE ONE USED ON THE PLOT A GRAPH CHOICE.","NOTE: THE LINE ONLY WORKS FOR","POSITIVELY CORRELATED DATA,","IF THE DATA IS NEGATIVELY","CORRELATED THE LINE WILL RUN OFFTHE SCREEN. THIS CAN BE AVOIDED IF PROGRAM LINES 1750 & 1760 AREDELETED. SEE ALSO GRAPH","INSTRUCTIONS."''
8250 GO SUB 650
8260 PRINT INK 5;"CORRELATION COEFFICIENT:"'' INK 6;"THIS IS ANOTHER EXPRESSION OF THE ASSOCIATION BETWEEN THE TWO SETS OF DATA. COMPLETE","CORRELATION WILL GIVE AN r VALUEOF +1 OR -1 DEPENDING ON THE","SLOPE OF THE LINE. IF THE DATA IS TOTALLY UNCORRELATED THEN r WILL BE 0. CORRELATION AND ","REGRESSION ANALYSIS ARE USUALLY USED IN CONJUNCTION AND ARE","OFTEN DISPLAYED ON THE GRAPHS OF DATA."''
8270 GO SUB 650
8280 PRINT INK 5;"2-SAMPLE t-TEST:"'' INK 6;"THERE ARE MANY TYPES OF t-TEST ANALYSIS. THE ONE USED HERE IS FOR TWO SAMPLES OF EQUAL LENGTH.THE TEST IS USED TO DETERMINE WHETHER THERE IS ANY SIGNIFICANTDIFFERENCE BETWEEN THE TWO SETS OF DATA. THE t VALUE IS","CALCULATED ALONG WITH THE","DEGREES OF FREEDOM (DF) FOR THE DATA. FROM THESE, STUDENT'S","t-TABLES CAN BE USED TO FIND THEPROBABILITY VALUE (P) FOR","SIGNIFICANCE TESTING."''
8290 GO SUB 650
8300 PRINT INK 5;"SIGNIFICANCE TESTING:"'' INK 6;"THIS USES THE P VALUE (WHICH MAYBE EXPRESSED AS A %) TO SEE IF THERE IS ANY STATISTICAL","DIFFERENCE BETWEEN THE TWO SETS OF DATA FOR EXAMPLE P <=.001","(OR .1%) MEANS THAT THE DATA ARE STATISTICALLY THE SAME.","NOTE: IF THE t VALUE EXCEEDS THETABULATED VALUES THEN THE","DIFFERENCE IS SIGNIFICANT","(ie: NOT LIKELY TO BE DUE TO ","CHANCE ALONE.)"''
8310 GO SUB 650
8320 PRINT INK 5;"THE LINE GRAPH:"'' INK 6;"THIS IS LIMITED BY THE SCREEN SIZE FOR THE 2068. IT WILL","ONLY ALLOW (x,y)<(26,20) TO BE PRINTED, OR MEANS<11. IT ALSO ASSUMES POSITIVE LINEAR","CORRELATION BETWEEN x & y WHEN IT DRAWS A LINE THROUGH THE","POINTS. HOWEVER AS MENTIONED","THIS COULD BE AVOIDED IF","NECESSARY BY THE DELETION OF THERELEVANT LINES. IF A GRAPH OF HIGH DATA IS NEEDED, YOU WOULD HAVE TO RE-ENTER THE VALUES","AFTER DIVISION BY A SUITABLE","FACTOR TO DECREASE THEIR SIZE."''
8330 GO SUB 650
8340 PRINT INK 6;"THE GRAPH ROUTINE WILL ALLOW YOUTO NAME THE TWO AXES, AND ","SPECIFY THEIR MAXIMUM LENGTHS. THUS THE ROUTINE IS VERY USEFULFOR VISUALISING THE ACTUAL","RELATIONSHIPS BETWEEN TWO SETS OF DATA. IT CAN BE COPIED TO THE PRINTER BY PRESSING 'c'."''
8350 GO SUB 650
8360 PRINT INK 5;"BAR CHART."'' INK 6;"THIS ROUTINE ALLOWS YOU TO ","CHOOSE A BAR CHART OF x OR y","VALUES. AGAIN IT IS LIMITED BY THE SCREEN SIZE OF THE 2068","THE VALUES ARE SORTED INTO 15 DOUBLE-WIDTH COLUMNS BY A","DIVISION FACTOR CALCULATED FROM THE MAXIMUM AND MINIMUM DATA VALUES. THUS YOU MUST GO THROUGHCHOICE NUMBER 3 (MEDIANS) BEFOREUSING THE BAR CHART. THE DATA ISSORTED INTO AN ARRAY ACCORDING TO ITS PARTICULAR VALUE. IF THE COLUMN BECOMES TOO LARGE (>17) THEN THE COMPUTER WILL SCALE","DOWN ALL THE VALUES AS REQUIRED.THE USE OF THIS IS THAT IT WILL SHOW YOU IF THE DATA IS NORMALLYDISTRIBUTED THIS IS REQUIRED BY MANY STATS TESTS."
8370 GO SUB 650
8380 LET CPY=0
8390 PRINT "PRESS"''"R TO READ THE INSTRUCTIONS AGAIN"''"C TO COPY INSTRUCTIONS"''"P TO RETURN TO THE MAIN PROGRAM:"
8400 PAUSE 0:IF INKEY$="R" THEN CLS :GO TO 8000
8410 IF INKEY$="P" THEN CLS :GO TO 70
8420 IF INKEY$="C" THEN LET CPY=1:GO TO 8000
8430 GO TO 8400
8440 REM \{20}\{1}THIS LISTING OCCUPIES\{20}\{1} \{20}\{0}\{20}\{1} 26.2K\{20}\{0}\{20}\{0}
8450 SAVE "Stat.Anal." LINE 10
8460 VERIFY ""
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

