1 ' DESCRIPTIVE STATISTICS --- DSTAT.BAS --- by Dr Russell Langley
2 GOTO 400
4 '<UNK! {000A}>--- Press Enter ---
5 IF PR THEN RETURN ELSE PRINT TAB(40);:PRINT "Press <Enter> to continue.";:IN$=INKEY$:WHILE INKEY$<>CHR$(13):WEND:LOCATE,40:PRINT SPACE$(26):RETURN
6 PRINT TAB(14);:PRINT "Press <Enter> to continue, or `/' to end viewing.";:IN$=INKEY$:WHILE IN$<>CHR$(13) AND IN$<>"/":IN$=INKEY$:WEND:LOCATE,14:PRINT SPACE$(50):IF IN$="/" THEN I=N:RETURN ELSE RETURN
7 '<UNK! {000A}><UNK! {000A}>*** Redirect to Block ***
9 ON QB GOTO 403,177,435,30:STOP '=start,printout,cmd-prompt,quit.<UNK! {000A}><UNK! {000A}>--- Another go? ---
10 CLOSE:IF HD$="" THEN LPRINT STRING$(79,61)STRING$(4,10)
11 DO$="run this program again now":GOSUB 20:IF Z$="Y" THEN 2 ELSE 30
19 '<UNK! {000A}>--- Yes/No? ---
20 PRINT:PRINT"Do you want to "+DO$;
21 INPUT" (Y/N)";Z$:IF Z$="" THEN Z$="N":RETURN ELSE Z$=CHR$(ASC(Z$) AND 95):IF Z$="Y" OR Z$="N" THEN RETURN ELSE PRINT"WHAT? ";:GOTO 21
29 '<UNK! {000A}>--- Errors & End ---
30 IF ERR THEN BEEP ELSE RUN "MENU"
31 IF ERR=70 THEN INPUT"Can't write to that disk. Remove its Write-Protect tab, then press <Enter>.";Z$:RESUME
32 IF ERR=71 THEN INPUT"That drive is empty or its gate is open. Fix, then press <Enter>.";Z$:RESUME
33 IF ERR=210 THEN RESUME 9 'from #87
39 ON ERROR GOTO 0:END'<UNK! {000A}><UNK! {000A}>*** Messages ***
40 BEEP:PRINT "---> Sorry, that entry is illegal.":RETURN
41 BEEP:PRINT "---> Sorry, double quotes are not allowed here.":RETURN
42 BEEP:PRINT"* * * Can't Do That.":RETURN
43 COLOR 23,0:PRINT:PRINT"Working";:COLOR 7,0:RETURN
44 LOCATE,1:PRINT"Ok, done.";:GOTO 5
49 '<UNK! {000A}>--- Vetted Decoding of FF X(I,J) from X$ ---<UNK! {000A}> Needs I, M, Q(0) from #96 or #256, & UT>0 if UT matrix.
50 K=1:L=M
51 KX=0:FOR J=K TO L:Y$=SPACE$(10):KY=0
52 KX=KX+1:IF KX>LEN(X$) THEN IF J=L THEN 54 ELSE 57
53 Z$=MID$(X$,KX,1):IF INSTR("-.0123456789",Z$) THEN KY=KY+1:MID$(Y$,KY,1)=Z$:GOTO 52 ELSE IF Z$<>" " THEN 58 ELSE IF KY=0 THEN 52
54 IF Q(0) THEN Q(J)=VAL(Y$) ELSE X(I,J)=VAL(Y$)
55 NEXT J:IF KX>=LEN(X$) THEN 60
56 PLAY"L8O3CO2C":PRINT"Only the first"L"values have been read in that line. Re-do it";:GOSUB 21:IF Z$="Y" THEN 59 ELSE 60
57 PLAY"L32O4CEG>C":PRINT"Not enough values in the line above. Please re-do whole line.":GOTO 59
58 PLAY"L16O3CEL4>B":PRINT"That line contains a `non-numeric' entry. Please re-do whole line."
59 PRINT"Row"STR$(I);:INPUT X$:IF RIGHT$(X$,1)<>"/" THEN 51 ELSE X$=LEFT$(X$,LEN(X$)-1):N=I+(X$=""):IF X$>"" THEN 51
60 RETURN
69 '<UNK! {000A}>--- K/b Input of all X(I,J) in FF ---<UNK! {000A}> Needs first I, M, Q>0 (sample #), KN(Q), & if UT matrix UT>0. Returns N.
70 PRINT"Enter data from keyboard, ";:IF M=1 THEN PRINT "pressing <Enter> after each number.":GOTO 72
71 PRINT"in Free Format, pressing <Enter> at end of each row.":IF UT THEN 73
72 PRINT"Null entry duplicates previous row. Signal `end-of-data' by entering a `/'"
73 PRINT"Row"STR$(I-KN(Q-1));:INPUT X$:IF X$="" THEN IF I>1 THEN FOR J=1 TO M:X(I,J)=X(I-1,J):NEXT J:I=I+1:LOCATE CSRLIN-1,POS(0)+9:PRINT"Ditto":GOTO 73
74 IF RIGHT$(X$,1)="/" THEN X$=LEFT$(X$,LEN(X$)-1):N=I+(X$=""):IF X$="" THEN 76
75 GOSUB 50:IF N=0 THEN IF I<MXR THEN I=I+1:GOTO 73 ELSE N=MXR
76 RETURN
79 '<UNK! {000A}>--- Disk Input of X(I,J), N, M, etc ---<UNK! {000A}> Needs MNR, MNC, & NEEDVARS. Also ZZ$="UTOK" if UT is acceptable.
80 QD=1:IO$="I":GOSUB 110:CLS:PRINT "Loading data from disk.":INPUT #1,FL$,VR$
81 IF LEFT$(VR$,4)<>"(RL," THEN BEEP:PRINT "Unreadable file --- not made by our Data Filer/Editor program.":GOTO 86
83 IF UT>0 AND ZZ$<>"UTOK" THEN PRINT "This file is an upper triangular matrix, which this program can't use!":GOTO 86
84 PRINT"File has"N"rows of data. ";:IF N<MNR THEN PRINT "--- Not enough!":GOTO 86 ELSE IF N>MXR THEN PRINT"--- Too many!":GOTO 86
85 PRINT:PRINT"File has"M"column variables. ";:IF M<MNC THEN PRINT "--- Not enough!" ELSE IF M>MXC THEN PRINT"Too many!" ELSE 88
86 CLOSE:BEEP:GOSUB 5:ERROR 210
87 ' Select variables
88 PRINT:IF VN$="N" THEN PRINT "The"M"variables are not named.":GOTO 90
89 PRINT "Variables in file are:":FOR J=1 TO M:INPUT #1,VN$(J):PRINT J;VN$(J),:NEXT J:PRINT
90 IF M=MNC OR UT>0 THEN 100 ELSE PRINT
91 IF NEEDVARS=0 THEN PRINT"How many filed column variables are to be IGNORED (0-"MID$(STR$(M-MNC),2)")";:INPUT ND:IF ND<0 OR ND>M-MNC THEN 91 ELSE IF ND=0 THEN 100
92 IF NEEDVARS=1 THEN PRINT"This test analyses only 1 column variable at a time.":ND=M-1
93 IF NEEDVARS=2 THEN PRINT"This test analyses only 2 column variables.":ND=M-2
94 IF ND=1 THEN PRINT "Number of the variable to be IGNORED (1-"MID$(STR$(M),2)")";:INPUT X$:Q(1)=VAL(X$):IF Q(1)<1 OR Q(1)>M THEN GOSUB 40:GOTO 94 ELSE 97
95 PRINT MID$(STR$(ND),2)" numbers of variables to be IGNORED (in ascending order & Free Format):":INPUT X$:IF VAL(X$)<1 THEN GOSUB 40:GOTO 95
96 Q(0)=1:MM=M:M=ND:GOSUB 50:Q(0)=0:M=MM
97 KK=1:L=1:FOR J=1 TO M:IF J=Q(KK) THEN KK=KK+1 ELSE VN$(L)=VN$(J):L=L+1
98 NEXT J
99 ' Now read numerical data from disk
100 PRINT:COLOR 23,0:PRINT"Loading numbers";:COLOR 7,0:FOR I=1 TO N:KK=1:LL=1:L=M
101 FOR J=1 TO L:INPUT #1,Z
102 IF J=Q(KK) THEN KK=KK+1 ELSE X(I,LL)=Z:LL=LL+1
103 NEXT J:NEXT I:CLOSE:LOCATE,1:PRINT SPACE$(15):M=M-ND:RETURN
109 '<UNK! {000A}>--- Get Filespec ---
110 IF IO$="O" THEN STOP
111 LINE INPUT "Filename (I will add .DAT extension)? ";FL$:IF FL$="" THEN 111 ELSE IF MID$(FL$,2,1)=":" THEN DR$=LEFT$(FL$,1):FL$=MID$(FL$,3)
112 ER=0:FOR I=1 TO LEN(FL$):Z$=MID$(FL$,I,1):IF INSTR(" .,/\|?*:;[]+="+CHR$(34),Z$) THEN ER=1
113 NEXT I
114 IF ER=0 AND FL$>"" AND LEN(FL$)<9 THEN FL$=FL$+".DAT" ELSE BEEP:PRINT "Invalid filename. Will you try again";:GOSUB 21:IF Z$="Y" THEN 111 ELSE 2
115 INPUT "Which drive (A,B,C,D)";DR$:IF DR$="" THEN 115
116 DR$=CHR$(ASC(DR$) AND 95):IF INSTR("ABCD",DR$)=0 THEN 115
117 INPUT "Which directory (e.g. WORK, MYDATA, or Null Entry if root) ";DR2$:IF DR2$="" THEN DR$=DR$+":" ELSE DR$=DR$+":\"+DR2$+"\"
129 '<UNK! {000A}>*** Open File, IO$= "I" ***
130 IF IO$="O" THEN STOP
131 '
132 '
133 '
134 ON ERROR GOTO 136:OPEN DR$+FL$ FOR INPUT AS #1 'for input
177 CLS:PRINT"Printing .....":LOCATE 4,1:CLOSE:OPEN "LPT1:" FOR OUTPUT AS #2
178 IF HD$>"" THEN PRINT #2,STRING$(79,61):PRINT #2,DAT$;TAB(42-LEN(HD$)\2);HD$;TAB(73)VER$:PRINT #2,STRING$(79,61):HD$=""
179 PRINT #2,CHR$(10)"Problem: "ID$;CHR$(10)
180 RETURN
189 '<UNK! {000A}>*** Print Data ***<UNK! {000A}> Needs X( , ) & QS=1 if Scattergram.
190 DO$="print all the data used":GOSUB 20:IF Z$="N" THEN 193
191 PRINT #2,"DATA USED: "VN$(J);:IF QS=0 THEN PRINT #2,:FOR I=1 TO N:PRINT #2,X(I,J);:NEXT I:PRINT #2,:GOTO 193
192 PRINT #2,", & "VN$(K):FOR I=1 TO N:PRINT #2,X(I,J);X(I,K),:NEXT I
193 PR=0:PRINT #2,:CLOSE:RETURN
199 '<UNK! {000A}>--- Show a Row of Data ---
200 PRINT"Row"STR$(I)": ";:FOR J=1 TO M:PRINT X(I,J);:NEXT J:PRINT:RETURN
209 '<UNK! {000A}>--- Varnames ---
210 IF VN$="Y" THEN RETURN ELSE FOR J=1 TO M:IF J<10 THEN VN$(J)="Var #"+STR$(J) ELSE VN$(J)="Var #"+MID$(STR$(J),2)
211 NEXT J:RETURN
229 '<UNK! {000A}>--- Stats of X(I,J), I=II to NN (for Sample Q if NS>1) ---
230 S1=0:S2=0:S3=0:S4=0:SM=X(II,J):GR=SM:FOR I=II TO NN:X=X(I,J)-X(II,J):S1=S1+X:S2=S2+X*X:S3=S3+X*X*X:S4=S4+X*X*X*X:IF X(I,J)<SM THEN SM=X(I,J) ELSE IF X(I,J)>GR THEN GR=X(I,J)
253 INPUT"Which transform (+/- 1 to 9, or 10)";T%:IF T%=10 THEN 273 ELSE IF ABS(T%)<1 OR ABS(T%)>9 THEN PRINT"WHAT? ";:GOTO 253
254 IF M=1 THEN NT=1:Q(1)=1:GOTO 257 ELSE PRINT"How many variables are to have this transform (max"STR$(M)")";:INPUT NT:IF NT<1 OR NT>M THEN 254 ELSE IF NT=M THEN FOR J=1 TO M:Q(J)=J:NEXT J:GOTO 257
255 IF NT=1 THEN INPUT"Which variable # ";X$:Q(1)=VAL(X$):IF Q(1)<1 OR Q(1)>M THEN PRINT"Silly":GOTO 255 ELSE 257
256 PRINT"Which"NT"variables (#'s in Free Format)";:INPUT X$:I=1:MM=M:M=NT:Q(0)=1:GOSUB 50:Q(0)=0:M=MM:FOR J=1 TO NT:IF Q(J)>0 AND Q(J)<=M THEN NEXT J ELSE PRINT"Value"J"is out-of-bounds. Try again.":GOTO 256
262 IF X(I,K)>=Z THEN X(I,K)=(SIN(X(I,K)/A))^2:IF T%=-U THEN 271 ELSE X(I,K)=H*X(I,K):GOTO 271 ELSE T%=U:GOTO 272
263 X(I,K)=X(I,K)+U
264 IF X(I,K)>Z THEN X(I,K)=B*LOG(X(I,K)):GOTO 271 ELSE 272
265 X(I,K)=EXP(X(I,K)/B):IF T%=-3 THEN 271 ELSE X(I,K)=X(I,K)-U:GOTO 271
266 X(I,K)=X(I,K)+U
267 IF X(I,K)<>Z THEN X(I,K)=H/X(I,K):IF T%=-6 THEN X(I,K)=X(I,K)-U:GOTO 271 ELSE 271 ELSE 272
268 X(I,K)=X(I,K)+P5
269 IF X(I,K)>=Z THEN X(I,K)=SQR(X(I,K)):GOTO 271 ELSE T%=7:GOTO 272
270 X(I,K)=X(I,K)*X(I,K):IF T%=-8 THEN X(I,K)=X(I,K)-P5
271 NEXT I:NEXT J:IF E$(0)=""THEN GOSUB 44:GOTO 273
272 BEEP:E$(0)="PROPORTION < 0":E$(1)="LOG 0 or Negative Number":E$(2)="DIVISION by 0":E$(3)="SQRT of Negative Number":PRINT:PRINT"Fatal Error: "E$((ABS(T%)-1)/2)", Row"I:GOSUB 5:END
273 RETURN
289 '<UNK! {000A}>--- Scattergram Sub ---
290 QS=1:C$="*23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ#":S$=SPACE$(6):S12$=SPACE$(12):P5=0.5:IF QDIM=0 THEN DIM XP(5),O$(41)
291 QDIM=1:INPUT "Horizontal Var # ";J:IF J<1 OR J>M THEN 291 ELSE L=J
292 IF M>2 THEN INPUT "Vertical Var # ";K:IF K<1 OR K>M OR K=J THEN 292 ELSE 293 ELSE IF J=1 THEN K=2 ELSE K=1
293 GOSUB 43
294 SM=X(1,L):GR=SM:FOR I=2 TO N:Z=X(I,L):IF Z<SM THEN SM=Z ELSE IF Z>GR THEN GR=Z
295 NEXT I
296 IF GR-SM<9.999E-06 THEN BEEP:J=L:LOCATE ,1:PRINT"Can't proceed. Var"J"has no variation.":GOSUB 5:GOTO 331 ELSE IF L=J THEN H=4 ELSE H=1.5'<UNK! {000A}> Select Scales
297 Q=1:KT=0
298 R=GR-SM:C=SM
299 IF R<=1 THEN KT=KT+1:R=R*10:GOTO 299
300 IF R>10 THEN KT=KT-1:R=R/10:GOTO 300
301 IF Q>2 THEN 303 ELSE C=C*10^KT:IF C<0 AND C<>INT(C) THEN C=C-1
302 C=INT(C)/10^KT:R=(GR-C)/H:KT=0:Q=Q+2:GOTO 299
303 F=INT(R):IF F<>R THEN F=F+1
304 IF R<P5 THEN F=F-P5
305 F=F/10^KT:IF Q<>4 THEN IF(GR-SM)/(H*F)<=0.8 THEN KT=1:Q=2:GOTO 298
306 SM=C:D=F*INT(C/F):IF D<0 AND D<>C THEN D=D-F
307 IF D+H*F>=GR THEN SM=D
308 IF L=J THEN X=SM:U=F:L=K:GOTO 294 ELSE Y=SM:V=F'<UNK! {000A}> Rpt with Y, then--<UNK! {000A}> Calc r
309 IF PR=1 THEN 312 ELSE A=0:B=0:C=0:D=0:E=0
310 FOR I=1 TO N:A=A+X(I,J):B=B+X(I,J)*X(I,J):C=C+X(I,K):D=D+X(I,K)*X(I,K):E=E+X(I,J)*X(I,K):NEXT I
311 E=E-A*C/N:B=B-A*A/N:D=D-C*C/N:PEAR=E/SQR(B*D)
312 NX=41:LX=5:NY=16:A=10/U:B=10/V:IF PR=0 THEN GOSUB 160:CLS ELSE GOSUB 165
313 PRINT #2,"SCATTERGRAM"S$"n ="STR$(N)S$"PEARSON'S r =";USING"+##.### (*=1, A=10, !=36 or more)";PEAR;"#":PRINT #2,'<UNK! {000A}> Scan data points to be plotted
314 O=0:FOR KN=1 TO LX:XP(KN)=X+O*U:O=O+1:NEXT KN
315 FOR I=1 TO NY:Q=I-1:IL=NY-Q:FOR II=1 TO NX:O$(II)=" ":NEXT II
316 FOR L=1 TO N:IX=((X(L,J)-X)*A)+1:IF IX<1 OR IX>NX THEN 320 ELSE IY=((X(L,K)-Y)*B)+1:IF IY<>IL THEN 320 ELSE IF O$(IX)=" " THEN O$(IX)="*":GOTO 320
317 IF O$(IX)="#" THEN 320
318 FOR KK=1 TO 35:IF O$(IX)=MID$(C$,KK,1) THEN O$(IX)=MID$(C$,KK+1,1):KK=35
319 NEXT KK
320 NEXT L'<UNK! {000A}> Print a line
321 FOR L=41 TO 1 STEP -1:IF O$(L)=" " THEN NEXT L:LN=1 ELSE LN=L
322 IF Q MOD 5 <>0 THEN 325
323 O=H-Q/10:D=Y+O*V:IF D<100000 THEN PRINT #2,USING"##########.#";D;:PRINT #2,"+ ";:FOR L=1 TO LN:PRINT #2,O$(L);:NEXT L:GOTO 327
426 IF INSTR(VN$(J),Q$) THEN GOSUB 41:GOTO 425 ELSE VN$(J)=LEFT$(VN$(J),10)
427 NEXT J
428 I=1:Q=1:GOSUB 70:GOSUB 210
429 '<UNK! {000A}>--- Menu ---
430 CLS:PRINT TAB(26)"COMMAND MENU":LOCATE 4,1,0:PRINT"Indicate your requirements thus---":K=12
431 PRINT"<UNK! {000A}>"TAB(K)"SA = Show all data<UNK! {000A}>"TAB(K)"C# = Change row #<UNK! {000A}>"TAB(K)"D# = Delete row #";
432 PRINT"<UNK! {000A}>"TAB(K)"I# = Insert row # (in Free Format)<UNK! {000A}>"TAB(K)"XR = Extra rows to be added (from keyboard)<UNK! {000A}>"TAB(K)"T = Transform variables";
433 PRINT"<UNK! {000A}>"TAB(K)"H";:IF M=1 THEN PRINT" "H$;ELSE PRINT"#"H$" of Variable #<UNK! {000A}>"TAB(K)"S = "SC$;:IF M>2 THEN PRINT"s of Selected Variables";
434 PRINT"<UNK! {000A}>"TAB(K)"Q = Quit or Re-run"
437 INPUT OP$:IF OP$="" THEN 430 ELSE PRINT:IF OP$="SA" OR OP$="sa" THEN 442
438 IF OP$="XR" OR OP$="xr" THEN 457 ELSE IF OP$="T" OR OP$="t" THEN GOSUB 250:GOTO 430 ELSE IF (OP$="H" OR OP$="h") AND M=1 THEN J=1:GOTO 459 ELSE IF OP$="S" OR OP$="s" THEN 492 ELSE IF OP$="Q" OR OP$="q" THEN 10
439 L$=CHR$(ASC(OP$) AND 95):I=VAL(MID$(OP$,2)):IF I>0 AND I<=N THEN IF L$="C" THEN 448 ELSE IF L$="D" OR L$="I" THEN 453 ELSE IF L$="H" THEN J=I:IF J<=M THEN 459
440 GOSUB 42:GOTO 435
441 '<UNK! {000A}>--- Show Data ---
442 I=1:PRINT:IF QR=0 THEN PRINT"Data read was---"ELSE PRINT"Revised data is---"
443 GOSUB 200:IF I MOD 20=0 THEN GOSUB 6:IF IN$="/" THEN 445
444 I=I+1:IF I<=N THEN 443 ELSE PRINT
445 IF VN$<>"Y" THEN PRINT"Variables not named"; ELSE FOR J=1 TO M:PRINT TAB(1+30*((J+2) MOD 3)) USING"Var##=";J;:PRINT VN$(J);:NEXT J:PRINT
446 GOSUB 5:GOTO 430
447 '<UNK! {000A}>--- Change Datum ---
448 QR=1:IF M=1 THEN J=1:GOTO 450 ELSE GOSUB 200
449 PRINT "Change which variable # (1-"MID$(STR$(M),2)")";:INPUT Z$:J=VAL(Z$):IF J<1 OR J>M THEN BEEP:GOTO 449
450 PRINT "Old value ="X(I,J);TAB(28)"New value";:INPUT Z$:FOR K=1 TO LEN(Z$):IF INSTR("-.0123456789",MID$(Z$,K,1))THEN NEXT K:X(I,J)=VAL(Z$) ELSE PLAY"L16O3CEL4>B":PRINT"That contains a `non-numeric' entry. Please re-do.":GOTO 450
451 PRINT "Revised Row"STR$(I)": ";:FOR J=1 TO M:PRINT X(I,J);:NEXT J:PRINT:IF M=1 THEN 435 ELSE DO$="change that row again":GOSUB 20:IF Z$="Y" THEN 449 ELSE 435
452 '<UNK! {000A}>--- Delete, Insert, or Add Extra Rows ---
453 IF INSTR(OP$,"-") THEN GOSUB 40:GOTO 435 ELSE GOSUB 43:IF L$="I"THEN 455
454 N=N-1:FOR K=I TO N:FOR J=1 TO M:X(K,J)=X(K+1,J):NEXT:NEXT:GOSUB 44:GOTO 430
455 IF N=MXR THEN 440 ELSE N=N+1:QR=1:FOR K=N TO I+1 STEP -1:FOR J=1 TO M:X(K,J)=X(K-1,J):NEXT:NEXT:LOCATE,1
468 PRINT #2,"HISTOGRAM of Z SCORES of "VN$(J);:F0$=FA$
469 PRINT #2,SPACE$(6)"(Exp=Expected if Population Normal)":PRINT #2,:PRINT #2,"Exp Obs Z ";:FOR K=0 TO 5:PRINT #2,RIGHT$(STR$(K),1)"----+----";:NEXT K:PRINT #2,USING"#";6:F0$=FA$:ZL=-3
470 FOR L=1 TO 14:NE=INT(PE(L)*N+P5):PRINT #2,USING F0$;NE;N(L);ZL;
471 IF N(L) THEN IF N(L)<60 THEN PRINT #2,STRING$(N(L),42);ELSE PRINT #2,STRING$(55,42)"===>";
472 IF L<14 THEN PRINT #2,:IF L<13 THEN ZL=ZL+P5 ELSE ZL=3:F0$=FB$
473 NEXT L:PRINT #2,:GOSUB 5:GOTO 475
474 '<UNK! {000A}>--- Statistics ---
475 IF PR=0 THEN CLS ELSE PRINT #2,:PRINT #2,
476 PRINT #2,"STATISTICS of "VN$(J):PRINT #2,
477 PRINT #2,"First 6 data values:";:FOR I=1 TO 6:PRINT #2,X(I,J);:NEXT I