1 ' CHI-SQUARE TEST 2 ' Written by Tracy L. Gustafson, M.D. 3 ' Round Rock, Texas. Version 3.0, 1984 4 ON ERROR GOTO 5000:CHAIN MERGE "EPIMRG",5 15 DIM XC(1,1),SR(1),SC(1):P$="######" 22 DATA "CHI-SQUARE TEST",30,17 30 PRINT:PRINT:PRINT TAB(5);"Do you want to evaluate a:":PRINT 35 PRINT TAB(25);"1.) Table of data.":PRINT 40 PRINT TAB(25);"2.) Known chi-square value.":PRINT 45 PRINT TAB(25);"3.) Chi-square test for trend." 50 LOCATE 15,30:INPUT "Enter choice: ",ASUB:IF ABS(ASUB-2)>1 THEN BEEP:GOTO 50 55 CLS:ON ASUB GOTO 110,100,60 60 AF=0:PRINT TAB(23);DTTL;" FOR TREND":PRINT TAB(23);STRING$(25,205):N1=0:N2=0:E1=0:E2=0:E3=0 65 LOCATE 6,1:INPUT "Enter NAME of factor you wish to test for dose response: ",DC 70 PRINT TAB(15);"How many levels does ";DC;:INPUT " have? ",CL 75 AR=CSRLIN:LOCATE 25,5:PRINT "Exposure levels should be ranks or midpoints of exposure categories.";:LOCATE AR+1,1 80 PRINT DC;" EXPOSURE LEVEL";TAB(35);"CASES";TAB(50);"CONTROLS":PRINT STRING$(60,196) 85 FOR Z=1 TO CL:AR=CSRLIN:INPUT;" ",XE:AC=36:GOSUB 285:BA=I:AC=53:GOSUB 285:BB=I:PRINT 90 M=BA+BB:N1=N1+BA:N2=N2+BB:E1=E1+BA*XE:E2=E2+M*XE:E3=E3+M*XE*XE:NEXT Z 95 N=N1+N2:X=E1-(N1*E2/N):X=X*X*(N*N*(N-1))/(N1*N2*(N*E3-E2*E2)):V1=1:GOTO 160 100 GOSUB 280:AF=0:LOCATE 6,24:INPUT "Enter chi-square value: ",X:PRINT:PRINT TAB(22); 105 INPUT "Enter degrees of freedom: ",V1:PRINT:GOTO 165 110 GOSUB 280:AF=1:LOCATE 4,10:INPUT;"How many ROWS? ",NR:PRINT TAB(45);:INPUT "How many COLUMNS? ",NC 115 ERASE XC,SR,SC:DIM XC(NR,NC),SR(NR),SC(NC):PRINT:PRINT 120 TB=INT(75/(NC+1))+(NC<5)*20/NC:F=((NR*NC)=4)*(-.5):V1=(NR-1)*(NC-1) 125 SN=0:CQ=0:X=0:PRINT "Enter your table values:";TAB(TB*(NC+1));"TOTAL":PRINT 130 FOR AX=1 TO NR:AR=CSRLIN:FOR AY=1 TO NC 135 AC=AY*TB:GOSUB 285:XC(AX,AY)=I:SR(AX)=SR(AX)+I:NEXT 140 LOCATE AR,TB*AY-3:PRINT USING P$;SR(AX):SN=SN+SR(AX):PRINT:NEXT 145 PRINT "TOTAL";:AR=CSRLIN:FOR AY=1 TO NC:FOR AX=1 TO NR:SC(AY)=SC(AY)+XC(AX,AY):NEXT:LOCATE AR,TB*AY-4:PRINT USING P$;SC(AY);:NEXT:LOCATE AR,TB*AY-3:PRINT USING P$;SN 150 FOR AX=1 TO NR:FOR AY=1 TO NC:E=SR(AX)*SC(AY)/SN:IF E<5 THEN CQ=1 155 XZ=ABS(XC(AX,AY)-E)-F:XZ=XZ*XZ/E:X=X+XZ:NEXT:NEXT 160 PRINT:PRINT TAB(16);"CHI-SQUARE = ";X;TAB(52);"df =";V1 165 IF X<31 OR V1>2 THEN J=V1/2-1:R=1 ELSE P=0:GOTO 195 170 FOR B=1 TO INT(V1/2-.5):R=R*J:J=J-1:NEXT 175 IF V1 MOD 2<>0 THEN R=R*1.77245374942627# 180 S=1:I=1:K=((X/2)^(V1/2))*2/(EXP(X/2)*R*V1):VC=V1+2 185 I=I*X/VC:S=S+I:VC=VC+2:IF I>9.999999E-31 THEN 185 190 P=1-K*S 195 PLAY "O2 MB MS T120 L16 D-P8A-P8 L3 D-":PRINT:PRINT TAB(15); 200 COLOR CLR2,CLR1:PRINT TAB(30);"p = ";:IF P<.000001 THEN PRINT "< 10 (-6)"; ELSE PRINT P; 205 PRINT TAB(60):COLOR CLR1,CLR2 210 IF AF=0 THEN 235 ELSE IF V1>1 THEN 230 ELSE PRINT:PRINT:PRINT TAB(25);"ODDS RATIO = "; 215 XD=XC(1,2)*XC(2,1):IF XD=0 THEN PRINT "not calculable";:GOTO 230 ELSE XO=XC(1,1)*XC(2,2)/XD:PRINT XO:IF XO=0 THEN 230 220 M1=SR(1):M2=SR(2):N1=SC(1):N2=SC(2):YA=XC(1,1) 225 PRINT TAB(12);"95% Confidence limits: ";:F=-1:GOSUB 245:PRINT " and ";:F=1:GOSUB 245 230 IF CQ=1 THEN PRINT:PRINT:PRINT "The Chi-square test may not be applicable in this case---":PRINT TAB(24);"because the expected count in one or more cells is < 5." 235 LOCATE 25,1:PRINT TAB(79):LOCATE 25,12:INPUT;"Do you want to calculate another Chi-square test? ",A$:IF A$="y" OR A$="Y" THEN 20 240 LOCATE 23,1:END 245 N=0:Y1=YA 250 Y=1/Y1+1/(M1-Y1)+1/(N1-Y1)+1/(N2-M1+Y1):IF Y<0 THEN 270 255 Y2=YA+F*.5+F*1.96*(1/Y1+1/(M1-Y1)+1/(N1-Y1)+1/(N2-M1+Y1))^-.5:N=N+1 260 IF ABS(Y1-Y2)>9.999999E-06 AND N<500 THEN Y1=Y2:GOTO 250 265 IF N<500 THEN PRINT Y2*(N2-M1+Y2)/((M1-Y2)*(N1-Y2));:RETURN 270 XP=1.96/SQR(X):X1=EXP((1-XP)*LOG(XO)):X2=EXP((1+XP)*LOG(XO)):IF F=SGN(X1-X2) THEN PRINT X1; ELSE PRINT X2; 275 RETURN 280 PRINT TAB(29);DTTL:PRINT TAB(29);STRING$(15,205):PRINT:RETURN 285 LOCATE AR,AC:INPUT;"",I:IF INT(I)=I THEN RETURN ELSE BEEP:LOCATE 25,20:PRINT "Please enter integers only.";:LOCATE AR,AC:PRINT " ";:GOTO 285 5000 BEEP:IF ERR<>53 AND ERR<>71 THEN 5010 ELSE LOCATE 10,10:PRINT "Please place EPISTAT in drive A: (or other default).":PRINT TAB(25);"Press any key to continue:" 5005 A$=INKEY$:IF A$="" THEN 5005 ELSE RESUME 5010 ON ERROR GOTO 0:END