1 ' ANCOVA & COMPARING REGRESSION LINES -- ANCOV.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}>*** Redirect to Block ***
9 ON QB GOTO 10,177,405,449:STOP '=start,printout,etc - CLOSE (exc 177)<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 LINE INPUT"Can't write to that disk. Remove its Write-Protect tab, then press <Enter>.";Z$:RESUME
32 IF ERR=71 THEN LINE INPUT"That drive is empty or its gate is open. Fix, then press <Enter>.";Z$:RESUME
33 IF ERR=210 THEN RESUME 9 'from #86
39 ON ERROR GOTO 0:END'<UNK! {000A}><UNK! {000A}>--- Messages ---
40 BEEP:PRINT "---> Sorry, that entry is illegal.":RETURN
43 COLOR 23,0: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.
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, MXR. 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>0 THEN 73
72 PRINT"Null entry duplicates previous row. Signal `end-of-all-data' by entering a `/'.":PRINT
73 PRINT "Row"STR$(I);: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.
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 THEN IF 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 '
92 '
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 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:M=M-ND:RETURN
109 '<UNK! {000A}>--- Get Filespec ---
110 IF IO$="O" THEN STOP:END
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$="I" THEN 134 ELSE STOP:END
131 '
132 '
133 '
134 ON ERROR GOTO 136:OPEN DR$+FL$ FOR INPUT AS #1 'for input
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
402 DIM X(MXR,M),O$(41),N(MG),KN(MG),DF(MG),XX(MG),YY(MG),XY(MG),XM(MG),YM(MG),PA(MG),SR(MG),SE(MG),VE(MG),TX(M),TY(M),TM(M),SK(MG),SL(MG),EK(MG),V(MXC),VN$(MXC),Q(MXC),XP(5),T$(10),P$(5),E$(3)
435 PRINT"Enter up to"MXR"pairs of X Y values (non-stop), 1 pair per line, in Free Format."
436 I=1:GOSUB 72
437 '<UNK! {000A}>--- Show Data ---
438 QB=3:I=1:PRINT:IF QR=0 THEN PRINT"DATA READ WAS ---"ELSE PRINT"REVISED DATA IS ---"
439 GOSUB 200:IF I MOD 20=0 THEN GOSUB 6
440 I=I+1:IF I<=N THEN 439
441 IF VN$<>"Y" THEN VN$(1)=" X ":VN$(2)=" Y "
442 IF QD=1 THEN IF VN$="N" THEN PRINT"Variables not named." ELSE FOR J=1 TO M:PRINT USING "Var##=";J;:PRINT VN$(J),:NEXT J:PRINT
443 '<UNK! {000A}>--- Get # of Groups, NG ---
444 ITER=ITER+1:IF ITER>1 THEN 446
445 PRINT:PRINT"How many samples or regression lines (2-"MID$(STR$(MG),2)") ";:INPUT NG:IF NG<2 OR NG>MG THEN 445
446 IF N<3*NG THEN BEEP:PRINT:PRINT"Sorry, but total N ="N"is NOT enough data for"NG"samples.":PRINT"Each sample must have at least 3 pairs of measurements for this analysis.":GOTO 11
447 IF ITER>1 THEN GOSUB 5
448 '<UNK! {000A}>--- Commands ---
449 QB=4:CLOSE:CLS:PRINT TAB(26)"COMMAND MENU":LOCATE 4,1,0:PRINT"Indicate your requirements thus---":K=20
450 PRINT"<UNK! {000A}>"TAB(K)"SA = Show all data again<UNK! {000A}>"TAB(K)"C# = Change row #<UNK! {000A}>"TAB(K)"D# = Delete row #";
452 INPUT"====> Option (SA, C#, D#, I#, T, A, Q) ";Z$:IF Z$="" THEN 452
453 IF Z$="SA" OR Z$="sa" THEN 438 ELSE IF Z$="T" OR Z$="t" THEN 466 ELSE IF Z$="A" OR Z$="a" THEN 468 ELSE IF Z$="Q" OR Z$="q" THEN 10
454 LZ$=CHR$(ASC(LEFT$(Z$,1)) AND 95):I=VAL(MID$(Z$,2)):IF I>0 AND I<=N THEN IF LZ$="C" THEN 457 ELSE IF LZ$="D" THEN 462 ELSE IF LZ$="I" THEN 463
455 GOSUB 40:GOTO 452
456 '<UNK! {000A}>--- Change Row ---
457 QR=1:GOSUB 200
458 INPUT "Change which variable # (1 or 2)";Z$:J=VAL(Z$):IF J<1 OR J>2 THEN BEEP:GOTO 458
459 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 459
460 PRINT"Revised Row"STR$(I)": ";:FOR J=1 TO M:PRINT X(I,J);:NEXT J:PRINT:DO$="change that row again":GOSUB 20:IF Z$="Y" THEN 458 ELSE 449
461 '<UNK! {000A}>--- Delete & Insert Row ---
462 QR=1:N=N-1:FOR K=I TO N:FOR J=1 TO M:X(K,J)=X(K+1,J):NEXT J:NEXT K:PRINT:PRINT"Row"I"now deleted.";:GOSUB 5:GOTO 449
463 QR=1:IF N=MXR THEN PRINT"No Room":GOSUB 5:GOTO 449 ELSE N=N+1:FOR K=N TO I+1 STEP -1:FOR J=1 TO M:X(K,J)=X(K-1,J):NEXT J:NEXT K
528 FOR L=1+KN(G-1) TO KN(G):IX=((X(L,J)-X)*A)+1:IF IX<1 OR IX>NX THEN 532 ELSE IY=((X(L,K)-Y)*B)+1:IF IY<>IL THEN 532 ELSE IF O$(IX)=" " THEN O$(IX)="*":GOTO 532
529 IF O$(IX)="#" THEN 532
530 FOR KK=1 TO 35:IF O$(IX)=MID$(C$,KK,1) THEN O$(IX)=MID$(C$,KK+1,1):KK=35
531 NEXT KK
532 NEXT L
533 FOR L=41 TO 1 STEP -1:IF O$(L)=" "THEN NEXT L:LN=1 ELSE LN=L
534 IF Q MOD 5<>0 THEN 537
535 GG=Q:O=H-GG/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 539
551 IF PR=0 THEN SR(G)=B*XY(G):SR=SR+SR(G):SE(G)=YY(G)-SR(G):VE(G)=SE(G)/DF(G):SE=SE+SE(G):DA=1:IF SE(G)=0 THEN 372
552 DB=DF(G):F=SR(G)/VE(G):GOSUB 360:PRINT #2,USING FA$;MR$;SR(G);MS$;VE(G):PRINT #2,USING TS$;",";DF(G);F;P$(IND):IF PR=0 THEN PA(G)=YM(G)-PB*XM(G):IF G MOD 2=0 THEN GOSUB 5
553 NEXT G:DA=1:DB=N-2:F=TR/TE*DB:GOSUB 360:PRINT #2,"TOTAL DATA (Pooled Samples)"S6$" N ="N
555 IF PR=1 THEN GOSUB 160 ELSE GOSUB 161:IF PR=1 THEN GOSUB 165:GOTO 548
556 '<UNK! {000A}>--- Show Regression Line Comparisons ---
557 CLS:GOSUB 43:S=VE(1):B=S:FOR G=2 TO NG:IF VE(G)<S THEN S=VE(G) ELSE IF VE(G)>B THEN B=VE(G)
558 NEXT G:HD=INT((N-2*NG)/NG+0.5):CLS
559 PRINT #2,TAB(20)"COMPARING REGRESSION LINES"
560 PRINT #2,:PRINT #2,"(1) HARTLEY'S MAX F RATIO (for homoscedasticity of residuals)":PRINT #2,USING FB$;"MS(Max)";B;"MS(Min)";S:PRINT #2,USING" F (df=##)";HD;:PRINT #2,USING F2$;B/S;:PRINT #2," (BTS Table 31)"
561 DA=NG:DB=N-2*NG:SV=SE/DB:F=SR/NG/SV:GOSUB 360
562 PRINT #2,:PRINT #2,"(2) ALL LINES (overall testing regr of Y on X, if homoscedastic)":PRINT #2,USING F1$;MR$;SR/NG;:PRINT #2,USING FA$;MS$;SV:PRINT #2,USING FF$;DA;",";DB;F;P$(IND)
567 FOR G=1 TO NG:PRINT #2,SPACE$(5)"A"CHR$(34)USING"(##) ";G;:PRINT #2,USING F4$;PA(G):IF G MOD 15=0 THEN GOSUB 5
568 NEXT G
569 PRINT #2,:PRINT #2,"WITH THESE PARALLEL LINES ---":FOR G=1 TO NG:PRINT #2,USING SPACE$(5)+"Adjusted YBAR(##)";G;:PRINT #2,USING F4$;YM(G)-PB*(XM(G)-TM(1)):IF G MOD 15=0 THEN GOSUB 5
570 NEXT G:GOSUB 5
571 DA=1:DB=N-NG-1:F=PG/PV:GOSUB 360
572 PRINT #2,:PRINT #2,"(4) COMMON SLOPE TEST (if parallel)":PRINT #2,USING F1$;MR$;PG;:PRINT #2,USING FA$;MS$;PV:PRINT #2,USING FF$;1;",";DB;F;P$(IND)