4 OPTION BASE 0 5 COMMON CHISQ(), F(), TJ(), NI(), SUMINDEX(), SULIST(), NNAME$(), DIVSP() 20 CLS 30 PRINT " STATISTICAL ECOLOGY: A PRIMER ON METHODS AND COMPUTING " 40 PRINT 50 PRINT " I N T E R A C T I V E B A S I C P R O G R A M " 55 PRINT 60 PRINT " N A S S O C . B A S " 70 PRINT " --------------------------------------------------------" 80 PRINT " THIS PROGRAM COMPUTES:": PRINT 90 PRINT " NORMAL ASSOCIATION ANALYSIS of N sampling units " 100 PRINT " based on the PRESENCE/ABSENCE of S species. Inter- " 110 PRINT " specific associations between all pairs of species " 120 PRINT " are used to sort the sampling units into homogeneous" 130 PRINT " groups. " 150 PRINT " OPTIONS: 1. VARIANCE TEST for detecting the Presence of" 160 PRINT " overall associations (see CHAPTER 11) " 170 PRINT " 2. INDEX for selecting DIVISIVE species: " 180 PRINT " A. Sum of Chi-Square (UnCorrected) " 190 PRINT " B. Sum of Chi-Square (Corrected) " 230 PRINT " --------------------------------------------------------" 240 PRINT "PRESS ANY KEY TO CONTINUE" 250 IF INKEY$ = "" THEN 250 260 CLS 270 PRINT "- - - - - - - - - -PART I. DATA ENTRY- - - - - - - - - - ": PRINT "" 280 PRINT "This program utilizes PRESENCE/ABSENCE data of S species found " 290 PRINT " in N sampling units (SUs) (plots, stands, locations, etc.) " 300 PRINT " " 310 PRINT "These data are organized into a DATA MATRIX where the " 320 PRINT " PRESENCE of a species in a SU is indicated by a 1 " 330 PRINT " and its ABSENCE by a 0. " 340 PRINT " " 350 PRINT " SU " 360 PRINT " 1 2 3 4 5 6 7 ... N " 370 PRINT " SPECIES " 380 PRINT " 1 1 1 0 1 1 1 0 ... " 390 PRINT " 2 0 0 0 0 0 1 1 ... " 400 PRINT " 3 1 1 1 1 1 0 0 ... " 410 PRINT " " 420 PRINT " S . . . . . . . . . ... " 430 REM FOR I=1 TO 1:PRINT "":NEXT I 440 REM PRINT"PRESS ANY KEY TO CONTINUE" 450 REM IF INKEY$="" THEN 430 460 REM CLS 470 GOSUB 2620 480 CLS 490 INPUT "Do you want to compute the variance test (Y=yes/N=no) "; A$ 500 IF A$ = "N" OR A$ = "n" THEN GOTO 970 510 CLS 520 PRINT "- - - - - -PART II. VARIANCE TEST - - - - - - - " 530 PRINT "This Section of the program computes 'V', an INDEX of ASSOCIATION. " 540 PRINT " Under the NULL hypothesis of NO ASSOCIATION between the S " 550 PRINT " SPECIES, the EXPECTED value of V is 1.0. " 560 PRINT " If V > 1, possible OVERALL POSITIVE association " 570 PRINT " If V < 1, possible OVERALL NEGATIVE association " 580 PRINT " This test is a method for assessing simultaneously whether " 590 PRINT " the species in the group are associated (Schluter, Ecology 65:" 600 PRINT " 998-1005, 1984) ": PRINT 610 PRINT "A statistic,'W', is computed that may be used to test whether " 620 PRINT " deviations from 1 are significant. For example, if the species " 630 PRINT " are NOT associated, then there is a 90% probability that W " 640 PRINT " lies between limits given by the CHI-SQUARE distribution: " 650 PRINT " 2 2 " 660 PRINT " X <= W <= X " 670 PRINT " .05,N .95,N ": PRINT 680 REM COMPUTE Tj=#species in jth SU, Ni=# SUs where ith species found 690 FOR SP = 1 TO S: FOR SU = 1 TO N 700 IF F(SP, SU) = 1 THEN NI(SP) = NI(SP) + 1 710 NEXT SU: NEXT SP 720 FOR SU = 1 TO N: FOR SP = 1 TO S 730 IF F(SP, SU) = 1 THEN TJ(SU) = TJ(SU) + 1 740 NEXT SP: NEXT SU 750 REM COMPUTE SUM OF VARS FOR OCCURRANCES OF INDIV SPECIES IN SUs 760 SUMIVAR = 0 770 FOR SP = 1 TO S 780 SUMIVAR = SUMIVAR + NI(SP) / N * (1! - NI(SP) / N) 790 NEXT SP 800 REM COMPUTE SUM OF VAR IN TOTAL SPECIES NUMBER 810 SUMT = 0: FOR SU = 1 TO N 820 SUMT = SUMT + TJ(SU) 830 NEXT SU: MEANT = SUMT / N: ' MEAN # SPECIES/SU 840 SUMTVAR = 0: FOR SU = 1 TO N 850 SUMTVAR = SUMTVAR + (TJ(SU) - MEANT) ^ 2 860 NEXT SU 870 TSPVAR = (1 / N) * SUMTVAR 880 REM COMPUTE V RATIO: INDEX OF SPECIES ASSOCIATION 890 V = TSPVAR / SUMIVAR 900 PRINT "V, Index of OVERALL Association.............."; V 910 IF V > 1 THEN PRINT " (Since V > 1 possible POSITIVE association)" 920 IF V < 1 THEN PRINT " (Since V < 1 possible NEGATIVE association)" 930 PRINT "W, Test Statistic............................"; V * N 940 PRINT 950 PRINT "PRESS ANY KEY TO CONTINUE" 960 IF INKEY$ = "" THEN 960 970 CLS 980 PRINT "- - - PART III. NORMAL ASSOCIATION ANALYSIS - - - ": PRINT 990 PRINT " Select ASSOCIATION INDEX to be used in the analysis: " 1000 PRINT " 1 = Chi-square " 1010 PRINT " 2 = Chi-square (using Yate's correction factor) " 1020 INPUT "ENTER 1, or 2 "; INDEX 1030 IF INDEX > 2 THEN GOTO 1020 1040 CLS 1050 PRINT "NOTE: The species with the largest sum of Chi-Square" 1060 PRINT " is selected as the DIVISIVE species. " 1070 PRINT 1080 PRINT " The following scheme is used DIVISIVE CYCLE" 1090 PRINT " to identify groups: --------------" 1100 PRINT " A Initial " 1110 PRINT " NOTE: Each group may / \ " 1120 PRINT " be split into 2 A.1 A.2 1st " 1130 PRINT " new groups at / \ / \ " 1140 PRINT " some lower A.1.1 A.1.2 A.2.1 A.2.2 2nd " 1150 PRINT " level until / \ / \ / \ / \ " 1160 PRINT " some pre- etc etc etc etc etc " 1170 PRINT " determined level " 1180 PRINT " of HOMOGENEITY is reached. In this program, a group is considered" 1190 PRINT " homogeneous when there are NO Chi-Square values between any pair " 1200 PRINT " of species (in that group) > 3.84 (the critical value at 1 df). " 1210 PRINT 1220 PRINT " The initial cycle produces 2 groups: A.1 and A.2. All other cycles" 1230 PRINT " require the user to identify which group is to be analyzed next. " 1240 PRINT " For example, if you indicate A.1, then groups A.1.1 & A.1.2 will " 1250 PRINT " will be produced (see diagram above)" 1260 PRINT 1270 PRINT "HIT ANY KEY TO CONTINUE " 1280 IF INKEY$ = "" THEN 1280 1290 CLS 1300 PRINT "IN EXECUTION LOOP" 1310 IF INDEX = 1 THEN INDX$ = "CHI-SQ (>3.84)........" 1320 IF INDEX = 2 THEN INDX$ = "CORR.CHI-SQ. (>3.84).." 1330 REM DIVISIVE LOOP 1340 REM INITIALIZE NAMING SEQUENCE FOR GROUPS 1350 FOR I = 1 TO 15: READ NNAME$(I): NEXT I 1360 DATA "A","A.1","A.2","A.1.1","A.1.2","A.2.1","A.2.2","A.1.1.1","A.1.1.2","A.1.2.1","A.1.2.2","A.2.1.1","A.2.1.2","A.2.2.1","A.2.2.2" 1370 CURRNAM$ = "A": 'FIRST LOOP 1380 FOR J = 1 TO N: SULIST(1, J) = 1: NEXT J: 'INIT. SULIST MATRIX 1390 FOR CYCLE = 1 TO 15 1400 IF CYCLE > 1 THEN ERASE CHISQ 1410 PRINT 1420 PRINT 1430 IF CYCLE <> 1 THEN PRINT "Choose any 1 of the above groups for the next DIVISIVE cycle." 1440 IF CYCLE <> 1 THEN INPUT "ENTER GROUP ID (e.g., A.2, etc.) or S to stop: ", CURRNAM$ 1450 IF CURRNAM$ = "S" OR CURRNAM$ = "s" THEN END 1460 REM---DETERMINE THE PRESENT ROW OF SULIST MATRIX OF INTEREST 1470 FOR E = 1 TO 15: IF CURRNAM$ = NNAME$(E) THEN ROW = E 1480 NEXT E 1490 REM---COMPUTE 2X2 TABLES & MEASURE OF PAIR-WISE ASSOCIATION B/T SPECIES 1500 RROW = ROW: GOSUB 1990 1510 REM---FIND LARGEST CHI-SQ IN THE ORIGINAL SXS MATRIX OF ASSOCIATION 1520 IF CYCLE = 1 THEN GOSUB 3400 1530 GOSUB 3170 'FIND THE CORRECT ROW FOR SULIST MATRIX 1540 REM---SPLIT CURR GRP INTO 2 NEW GRPS BASED ON +/- OF DIVISOR SPECIES 1550 GOSUB 2460: 'SUBROUTINE TO FIND DIVISOR SPECIES 1560 FOR SU = 1 TO N 1570 IF SULIST(ROW, SU) = 0 THEN SULIST(ROW1, SU) = 0: SULIST(ROW2, SU) = 0: GOTO 1600 1580 IF F(DIVSP(ROW), SU) = 1 THEN SULIST(ROW1, SU) = 1: SULIST(ROW2, SU) = 0 1590 IF F(DIVSP(ROW), SU) = 0 THEN SULIST(ROW1, SU) = 0: SULIST(ROW2, SU) = 1 1600 NEXT SU 1610 IF CYCLE = 1 THEN GOSUB 3260 'PRINT INITIAL GROUP A 1620 REM FIND NEW LARGEST VALUES OF ASSOC. INDEX IN EACH OF THE NEW GRPS 1630 RROW = ROW1: ERASE CHISQ: GOSUB 1990: GOSUB 2460 1640 GOSUB 3400 1650 PRINT 1660 PRINT "GROUP.................................."; NNAME$(ROW1) 1670 PRINT "Divisor Species "; DIVSP(ROW); " PRESENT in all SUs" 1680 PRINT "LARGEST CHI-SQ VALUE IN GROUP........"; 1690 PRINT USING "###.##"; SUMINDEX(ROW1, S + 2); 1700 PRINT " (Between species "; SPID1; " & "; SPID2; ")" 1710 PRINT "LARGEST SUM OF "; INDX$; 1720 PRINT USING "###.##"; SUMINDEX(ROW1, S + 1); 1730 IF DIVSP(RROW) > 0 THEN PRINT " (This is for species "; DIVSP(RROW); ")" 1740 IF DIVSP(RROW) = 0 THEN PRINT " (There are NO values > 3.84)": PRINT " *****THIS GROUP IS HOMOGENEOUS*****" 1750 PRINT "SU 's in GROUP: "; 1760 FOR SU = 1 TO N 1770 IF SULIST(ROW1, SU) = 1 THEN PRINT USING "###"; SU; 1780 NEXT SU: PRINT 1790 PRINT 1800 RROW = ROW2: ERASE CHISQ: GOSUB 1990: GOSUB 2460 1810 GOSUB 3400 1820 PRINT "GROUP.................................."; NNAME$(ROW2) 1830 PRINT "Divisor Species "; DIVSP(ROW); " ABSENT in all SUs" 1840 PRINT "LARGEST CHI-SQ VALUE IN GROUP........"; 1850 PRINT USING "###.##"; SUMINDEX(ROW2, S + 2); 1860 PRINT " (Between species "; SPID1; " & "; SPID2; ")" 1870 PRINT "LARGEST SUM OF "; INDX$; 1880 PRINT USING "###.##"; SUMINDEX(ROW2, S + 1); 1890 IF DIVSP(RROW) > 0 AND INDEX <> 3 THEN PRINT " (This is for species "; DIVSP(RROW); ")" 1900 IF DIVSP(RROW) = 0 AND INDEX <> 3 THEN PRINT " (There are NO values > 3.84)": PRINT " *****THIS GROUP IS HOMOGENEOUS*****" 1910 IF DIVSP(RROW) > 0 AND INDEX = 3 THEN PRINT " (This is for species "; DIVSP(RROW); ")" 1920 IF DIVSP(RROW) = 0 AND INDEX = 3 THEN PRINT " (All values are ZERO )": PRINT " *****THIS GROUP IS HOMOGENEOUS*****" 1930 PRINT "SU 's in GROUP: "; 1940 FOR SU = 1 TO N 1950 IF SULIST(ROW2, SU) = 1 THEN PRINT USING "###"; SU; 1960 NEXT SU 1970 NEXT CYCLE 1980 STOP 1990 REM ----------------SUBROUTINE TO COMPUTE 2 X 2 CONTINGENCY TABLE --------" 2000 ' FOR EACH PAIR OF SPECIES & ASSOCIATION MEASURE 2010 DIM CHISQ(S, S) 2020 FOR SP = 1 TO S - 1: FOR SPP = SP + 1 TO S 2030 A = 0: B = 0: C = 0: D = 0: ABCDSUM = 0'INIT. CELLS OF 2X2 TABLE 2040 FOR SU = 1 TO N 2050 IF SULIST(RROW, SU) = 0 THEN GOTO 2110 'THIS SU NOT PART OF CURRENT GRP 2060 ABCDSUM = ABCDSUM + 1 2070 IF F(SP, SU) = 1 AND F(SPP, SU) = 1 THEN A = A + 1 2080 IF F(SP, SU) = 1 AND F(SPP, SU) = 0 THEN B = B + 1 2090 IF F(SP, SU) = 0 AND F(SPP, SU) = 1 THEN C = C + 1 2100 IF F(SP, SU) = 0 AND F(SPP, SU) = 0 THEN D = D + 1 2110 NEXT SU 2120 MM = A + B: NN = C + D: RR = A + C: SS = B + D: 'ROW & COLUMN TOTALS 2130 DET = A * D - B * C 'DETERMINANT OF 2X2 TABLE 2140 IF MM = ABCDSUM OR NN = ABCDSUM OR RR = ABCDSUM OR SS = ABCDSUM THEN GOTO 2360 2150 IF DET = 0 THEN GOTO 2360 'IF DETERMINANT = 0 SET X2,C8 =0 2160 EXPA = MM * RR / N 'EXPECTED VALUES 2170 EXPB = MM * SS / N 2180 EXPC = RR * NN / N 2190 EXPD = SS * NN / N 2200 REM CHECK FOR BIAS IN CHI-SQUARE 2210 BIA = 0: IF EXPA < 5 THEN BIA = BIA + 1 2220 IF EXPB < 5 THEN BIA = BIA + 1 2230 IF EXPC < 5 THEN BIA = BIA + 1 2240 IF EXPD < 5 THEN BIA = BIA + 1 2250 BIS = 0: IF EXPA < 1 THEN BIS = 1 2260 IF EXPB < 1 THEN BIS = 1 2270 IF EXPC < 1 THEN BIS = 1 2280 IF EXPD < 1 THEN BIS = 1 2290 IF BIA > 1 OR BIS = 1 THEN BIAS$ = "*" ELSE BIAS$ = " " 2300 REM COMPUTE CHI-SQ (INDEX=1:CHI-SQ INDEX:2/YATES CORRECTION FACTOR) 2310 IF A * D >= B * C THEN ASSOC$ = "+" ELSE ASSOC$ = "-"'DETER ASSOC 2320 IF INDEX <> 2 THEN CHISQ(SP, SPP) = (ABCDSUM * DET ^ 2) / (MM * NN * RR * SS) 2330 IF INDEX = 2 THEN CHISQ(SP, SPP) = (ABCDSUM * (ABS(DET) - ABCDSUM / 2) ^ 2) / (MM * NN * RR * SS) 2340 CHISQ(SPP, SP) = CHISQ(SP, SPP) 2350 IF INDEX = 3 THEN GOTO 2370 ELSE GOTO 2400 2360 'SET CHI-SQ & C8 = 0 FOR INDETERMINATE SPECIES 2370 BIAS$ = "INDETERMINANT" 2380 CHISQ(SP, SPP) = 0: CHISQ(SPP, SP) = 0 2390 GOTO 2400 2400 NEXT SPP: NEXT SP 2410 REM SET DIAGONALS = 0 FOR CHI-SQ, AND C8 2420 FOR SP = 1 TO S 2430 CHISQ(SP, SP) = 0 2440 NEXT SP 2450 RETURN 2460 REM------------SUBROUTINE TO DETER SP WITH HIGHEST ----------------- 2470 ' SUM OF CHI-SQ : THIS IS DIVISOR SPECIES 2480 MAXSUM = 0 2490 FOR SP = 1 TO S: SUM = 0 2500 FOR COL = 1 TO S 2510 ON INDEX GOTO 2520, 2520, 2540 2520 IF CHISQ(SP, COL) < 3.84 THEN SUM = SUM + 0 ELSE SUM = SUM + CHISQ(SP, COL) 2530 GOTO 2550 2540 SUM = SUM + ABS(C8(SP, COL)) 'SUM OF SP ROWS 2550 NEXT COL 2560 SUMINDEX(RROW, SP) = SUM 2570 IF SUM <= MAXSUM THEN GOTO 2600 2580 MAXSUM = SUM: DIVSP(RROW) = SP: 'MAX SUM FOR DIVISOR SP 2590 SUMINDEX(RROW, S + 1) = SUM 2600 NEXT SP 2610 RETURN 2620 REM -----------SUBROUTINE FOR DATA ENTRY--------------------------- 2626 INPUT "INPUT Number of SUs ", N 2627 INPUT "INPUT Number of Species ", S 2628 DIM F(S, N), TJ(N), NI(S), SUMINDEX(100, S + 2), SULIST(100, N), NNAME$(15), DIVSP(15) 2630 PRINT "Data INPUT options: " 2640 PRINT " Option 1 - Data already exists in a STORED data file " 2650 PRINT " Option 2 - Data is to be manually entered from keyboard " 2660 PRINT " (and subsequently STORED, if desired) " 2670 INPUT "Choose OPTION: Enter 1 OR 2 "; OPT 2680 IF OPT = 1 THEN GOTO 2920 ELSE IF OPT <> 2 THEN GOTO 2670 2720 PRINT "" 2730 PRINT "The data matrix is created one COLUMN (or SU) at a time. " 2740 PRINT " ENTER 1 for PRESENCE and 0 for ABSENCE of a species in a SU " 2750 PRINT 2760 FOR SU = 1 TO N 2770 FOR SP = 1 TO S 2780 PRINT "SPECIES "; SP; " in SU "; SU 2790 INPUT " "; F(SP, SU) 2800 NEXT SP: NEXT SU 2810 INPUT "STORE THIS DATASET ON DISK ? (ENTER Y for YES / N for NO) "; A$ 2820 IF A$ = "N" OR A$ = "n" THEN GOTO 3030 ELSE GOTO 2830 2830 PRINT "" 2831 INPUT "Specify a name for this DATASET (e.g., ASSOC.DAT) "; OUTDAT$ 2840 INPUT "Specify DISK drive: ENTER A, B, C, etc. "; DD$ 2850 OUTDAT$ = DD$ + ":" + OUTDAT$ 2860 OPEN OUTDAT$ FOR OUTPUT AS #1 2870 FOR SU = 1 TO N 2880 FOR SP = 1 TO S 2890 WRITE #1, F(SP, SU) 2900 NEXT SP: NEXT SU 2910 GOTO 3030 2920 INPUT "Specify name of DATA File (e.g., ASSOC.DAT) "; DATAFIL$ 2930 INPUT "Specify DISK DRIVE where located: A, B, C, etc. "; DD$ 2970 FILENAM$ = DD$ + ":" + DATAFIL$ 2980 OPEN "I", #1, FILENAM$ 2990 FOR SU = 1 TO N 3000 FOR SP = 1 TO S 3010 INPUT #1, F(SP, SU) 3020 NEXT SP: NEXT SU 3030 INPUT "Would you like to list the DATA ? (Y for Yes / N for NO) "; A$ 3040 IF A$ = "Y" OR A$ = "y" THEN GOTO 3050 ELSE GOTO 3150 3050 PRINT "LISTING OF THE DATA SET. ROWS=species, COLUMNS=SUs " 3060 PRINT " " 3070 FOR SP = 1 TO S 3080 FOR SU = 1 TO N 3090 PRINT F(SP, SU); 3100 NEXT SU: PRINT 3110 NEXT SP 3120 FOR I = 1 TO 2: PRINT "": NEXT I 3130 PRINT "PRESS ANY KEY TO CONTINUE" 3140 IF INKEY$ = "" THEN 3140 3150 CLOSE #1 3160 RETURN 3170 REM------------SUBROUTINE TO DETER. ROW FOR SULIST MATRIX----------------- 3180 IF ROW = 1 THEN ROW1 = 2: ROW2 = 3 3190 IF ROW = 2 THEN ROW1 = 4: ROW2 = 5 3200 IF ROW = 3 THEN ROW1 = 6: ROW2 = 7 3210 IF ROW = 4 THEN ROW1 = 8: ROW2 = 9 3220 IF ROW = 5 THEN ROW1 = 10: ROW2 = 11 3230 IF ROW = 6 THEN ROW1 = 12: ROW2 = 13 3240 IF ROW = 7 THEN ROW1 = 14: ROW2 = 15 3250 RETURN 3260 REM--------SUBROUTINE TO PRINT INITIAL GROUP & LARGEST CHI-SQ------------- 3270 PRINT "INITIAL GROUP...........................A" 3280 PRINT "LARGEST CHI-SQ VALUE IN GROUP........"; 3290 PRINT USING "###.##"; SUMINDEX(1, S + 2); 3300 PRINT " (Between species "; SPID1; " & "; SPID2; ")" 3310 PRINT "LARGEST SUM OF "; INDX$; 3320 PRINT USING "###.##"; SUMINDEX(1, S + 1); 3330 IF DIVSP(1) > 0 THEN PRINT " (This is for species "; DIVSP(1); ")": ELSE PRINT " (There are NO values > 3.84)": PRINT "*****THIS GROUP IS HOMOGENEOUS*****" 3340 PRINT "SU 's in GROUP: "; 3350 FOR SU = 1 TO N 3360 PRINT USING "###"; SU; 3370 NEXT SU 3380 PRINT 3390 RETURN 3400 REM --------------SUBROUTINE TO COMPUTE LARGEST X2 VALUE ----------------- 3410 ' IN S X S MATRIX 3420 MAXCS = 0 3430 FOR SP = 1 TO S - 1: FOR SPP = SP + 1 TO S 3440 IF CHISQ(SP, SPP) <= MAXCS THEN GOTO 3480 3450 MAXCS = CHISQ(SP, SPP) 3460 SUMINDEX(RROW, S + 2) = MAXCS 3470 SPID1 = SP: SPID2 = SPP 3480 NEXT SPP: NEXT SP 3490 RETURN