5 COMMON X(), S4(), D1(), A(), SU(), K4(), K6(), C(), B1(), B2(), S1(), n() 10 WIDTH (80) 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 " 60 PRINT 70 PRINT " S D A . B A S " 80 PRINT " ----------------------------------------------------------- " 90 PRINT " This PROGRAM COMPUTES a SIMPLE DISCRIMINANT ANALYSIS to " 100 PRINT " test for significant differences in environmental " 110 PRINT " factors between PAIRS of ecological COMMUNITIES " 120 PRINT " -----------------------------------------------------------" 130 PRINT " SDA.BAS computes:" 140 PRINT " 1. Basic statistics for each COMMUNITY (OR GROUP) " 150 PRINT " 2. Correlations between environmental factors in groups, " 160 PRINT " 3. Mahalonobis D-squared (i.e., multivariate distance), " 170 PRINT " 4. Discriminant functions between all PAIRS of groups, " 180 PRINT " 5. F-ratio by a Multivariate Analysis of Variance, " 190 PRINT " 6. Relative importance of factors used in the function, " 200 PRINT " 7. Coordinates for group centroids and sampling units" 210 PRINT " -----------------------------------------------------------" 220 PRINT : PRINT " PRESS ANY KEY TO CONTINUE" 230 IF INKEY$ = "" THEN 230 240 CLS : PRINT 250 PRINT "- - - - - - - - - PART I. DATA ENTRY - - - - - - - - - - -" 260 PRINT "This program utilizes data on ENVIRONMENTAL FACTORS that have" 270 PRINT " been measured in SUs (Sampling Units) (e.g., plots, stands, etc.)" 280 PRINT "These data are organized in a DATA MATRIX as follows: " 290 PRINT " ROW 1 = The Identification Number (ID #) of the SUs " 300 PRINT " ROW 2 = Environmental Factor [EF] number one, X(1) " 310 PRINT " ROW 3 = Environmental Factor [EF] number two, X(2) " 320 PRINT " : : " 330 PRINT " etc. etc. " 340 PRINT " |---Community-----|----Community----|-Community-|" 350 PRINT " For example: #1 #2 #3 " 370 PRINT " SUs= (1) (5) (2) (3) (4) (6) (7) (8) (9) (10)" 380 PRINT " ------------------- ---------------- --------" 390 PRINT " SU ID#: 1 5 2 3 4 6 7 8 9 10 " 400 PRINT " EF X(1) 4.2 3.8 1.6 2.4 4.0 1.0 2.2 0.4 1.0 0.3 " 410 PRINT " EF X(2) 6.1 5.9 7.7 8.3 8.9 9.9 9.4 9.0 0.9 1.3 " 420 PRINT : : : : 430 GOSUB 2340 440 CLS : PRINT "-------PART II. SIMPLE DISCRIMINANT ANALYSIS --------------" 450 FOR L = 1 TO NG 460 PRINT : PRINT "Basic Statistics for FACTORS in Community #"; L 470 PRINT 480 PRINT " [EF] Sample Sample Standard Standard" 490 PRINT " X(i) Mean Variance Deviation Error " 500 PRINT "------ -------- ---------- ----------- ---------" 510 M = n(L): F1 = M - 1: F2 = M - 2 520 FOR J = 1 TO NF 530 S1(J, L) = 0: S2 = 0 540 FOR I = 1 TO M 550 S1(J, L) = S1(J, L) + X(I, J, L) 560 S2 = S2 + (X(I, J, L) * X(I, J, L)) 570 NEXT I 580 B1(J, L) = S1(J, L) / M 590 B2(J, L) = S2 - ((S1(J, L) * S1(J, L)) / M) 600 B3 = B2(J, L) / F1 610 B4 = SQR(B3) 620 B5 = B4 / SQR(M) 630 PRINT USING "####"; J; 640 PRINT USING "########.###"; B1(J, L); B3; B4; B5 650 NEXT J 660 PRINT 670 PRINT " EF EF Covariance Correlation Standard t " 680 PRINT " X(i) X(j) Coefficient Coefficient Error Statistic df " 690 PRINT "----- ----- ----------- ----------- --------- --------- ---" 700 K2 = NF - 1 710 FOR J = 1 TO K2 720 FOR K3 = J TO K2 730 K = K3 + 1: S3 = 0 740 FOR I = 1 TO M 750 S3 = S3 + (X(I, J, L) * X(I, K, L)) 760 NEXT I 770 S4(J, K, L) = S3 - ((S1(J, L) * S1(K, L)) / M) 780 S5 = S4(J, K, L) / F1 790 S6 = S4(J, K, L) / (SQR(B2(J, L) * B2(K, L))) 800 S7 = S6 * S6 810 IF S7 > .999 THEN GOTO 850 820 S8 = SQR((1 - S7) / F2) 830 T = S6 / S8 840 GOTO 860 850 S8 = 0: T = 999 860 PRINT USING "#####"; J; K; 870 PRINT USING "########.###"; S5; S6; 880 IF F2 < 3 THEN GOTO 930 890 PRINT USING "########.###"; S8; 900 PRINT USING "######.###"; T; 910 PRINT USING "#######"; F2 920 GOTO 940 930 PRINT TAB(40); "* * * Not Computed * * *" 940 NEXT K3 950 NEXT J 960 PRINT : PRINT " PRESS ANY KEY TO CONTINUE" 970 IF INKEY$ = "" THEN 970 980 NEXT L 990 K2 = NG - 1 1000 FOR L = 1 TO K2 1010 W = n(L) 1020 FOR K3 = L TO K2 1030 M = K3 + 1: Z = n(M) 1040 CLS : PRINT "Discriminant Analysis between Community #"; L; " and #"; M 1050 REM - SETUP the SYSTEM of SIMULTANEOUS LINEAR EQUATIONS 1060 FOR J = 1 TO NF 1070 D1(J, L, M) = B1(J, L) - B1(J, M) 1080 NEXT J 1090 N3 = NF + 1 1100 F2 = (W + Z) - 2 1110 FOR J = 1 TO NF 1120 A(J, J) = (B2(J, L) + B2(J, M)) / F2 1130 A(J, N3) = D1(J, L, M) 1140 I = J + 1 1150 IF I > NF THEN GOTO 1200 1160 FOR K = I TO NF 1170 A(J, K) = (S4(J, K, L) + S4(J, K, M)) / F2 1180 A(K, J) = A(J, K) 1190 NEXT K 1200 NEXT J 1210 REM - SOLVE the SYSTEM of LINEAR EQUATIONS 1220 FOR J = 1 TO NF 1230 K4(J) = 0 1240 NEXT J 1250 FOR J = 1 TO NF 1260 K5 = J + 1 1270 M1 = 0 1280 FOR K = 1 TO NF 1290 IF M1 >= ABS(A(K, J)) THEN GOTO 1330 1300 IF K4(K) > 0 THEN GOTO 1330 1310 K6(J) = K 1320 M1 = ABS(A(K, J)) 1330 NEXT K 1340 IF ABS(M1) < 1E-09 THEN GOTO 2310 1350 K7 = K6(J) 1360 K4(K7) = 1 1370 FOR K = 1 TO NF 1380 IF K7 = K THEN GOTO 1430 1390 G = -A(K, J) / A(K7, J) 1400 FOR I = K5 TO N3 1410 A(K, I) = A(K, I) + (G * A(K7, I)) 1420 NEXT I 1430 NEXT K 1440 NEXT J 1450 PRINT : PRINT "Discriminant Function Coefficients " 1460 FOR J = 1 TO NF 1470 K7 = K6(J) 1480 C(J) = A(K7, N3) / A(K7, J) 1490 PRINT " C("; 1500 PRINT USING "###"; J; 1510 PRINT ") = "; 1520 PRINT USING "######.###"; C(J) 1530 NEXT J 1540 D2 = 0 1550 FOR J = 1 TO NF 1560 D2 = D2 + (C(J) * D1(J, L, M)) 1570 NEXT J 1580 PRINT : PRINT "Mahalanobis D Squared ="; 1590 PRINT USING "######.###"; D2 1600 PRINT : PRINT "Multivariate Analysis of Variance for Discrimination": PRINT 1610 PRINT " Source of Sum of Mean F " 1620 PRINT " Variation df Squares Square Value " 1630 PRINT " ------------------- ---- -------- -------- -------- " 1640 V2 = D2 / F2: V3 = ((W * Z) / (W + Z)) * (V2 * V2) 1650 F3 = NF 1660 V4 = V3 / F3: V5 = V2 1670 F4 = n(L) + n(M) - 1 - NF 1680 V6 = V5 / F4: V7 = V3 + V5 1690 F = V4 / V6 1700 IF n(L) < 10 OR n(M) < 10 THEN PRINT : PRINT "ANOVA not computed because of small sample size": GOTO 1800 1710 PRINT " AMONG communities "; 1720 PRINT USING "#####"; F3; 1730 PRINT USING "#######.##"; V3; V4; F 1740 PRINT " WITHIN communities"; 1750 PRINT USING "#####"; F4; 1760 PRINT USING "#######.##"; V5; V6 1770 PRINT " TOTAL "; 1780 PRINT USING "#####"; F2; 1790 PRINT USING "#######.##"; V7 1800 R2 = (V3 / V7) * 100 1810 PRINT 1820 PRINT "Press ANY KEY to Continue" 1830 IF INKEY$ = "" THEN 1830 1840 CLS : PRINT "Percent of Variation between Communities #"; L; " and #"; M; "accounted for by the Discriminate Analysis ="; R2; "%" 1850 PRINT : PRINT "Percent Contribution of Each Environmental Factor to " 1860 PRINT " the Total Multivariate Distance (Relative Importance)": PRINT 1870 PRINT " Environmental Percentage " 1880 PRINT " Factor Contribution " 1890 PRINT " ------------- ------------ " 1900 FOR J = 1 TO NF 1910 D3 = ((C(J) * D1(J, L, M)) / D2) * 100 1920 PRINT USING "##########"; J; 1930 PRINT USING "#############.#"; D3 1940 NEXT J 1950 PRINT : PRINT : PRINT "Coordinates for Communities #"; L; " and #"; M; " along the " 1960 PRINT "Discriminant Function Axis, i.e., Community Centroids": PRINT 1970 C1 = 0: C2 = 0 1980 FOR J = 1 TO NF 1990 C1 = C1 + (C(J) * B1(J, L)) 2000 C2 = C2 + (C(J) * B1(J, M)) 2010 NEXT J 2020 PRINT "Community #"; L; 2030 PRINT " Centroid ="; 2040 PRINT USING "#######.##"; C1; 2050 PRINT " and " 2060 PRINT "Community #"; M; 2070 PRINT " Centroid ="; 2080 PRINT USING "#######.##"; C2 2090 PRINT : PRINT "Hit ANY KEY to Continue" 2100 IF INKEY$ = "" THEN 2100 2110 NEXT K3 2120 NEXT L 2130 CLS : PRINT "Coordinates for Each Sampling Unit along the " 2140 PRINT "Discriminant AXIS about each Community Centroid " 2150 PRINT " Community SU " 2160 PRINT " # ID # Coordinate " 2170 PRINT " --------- --------- ---------- " 2180 FOR L = 1 TO NG 2190 M = n(L) 2200 FOR I = 1 TO M 2210 P2 = 0 2220 FOR J = 1 TO NF 2230 P2 = P2 + (C(J) * X(I, J, L)) 2240 NEXT J 2250 PRINT USING "#######"; L; 2260 PRINT USING "##########"; SU(I, L); 2270 PRINT USING "#############.##"; P2 2280 NEXT I 2290 NEXT L 2300 GOTO 2320 2310 PRINT " NO UNIQUE SOLUTION EXISTS" 2320 PRINT : PRINT "END OF PROGRAM": CLEAR 2330 END 2340 REM - - - - - SUBROUTINE FOR DATA ENTRY - - - - - 2350 PRINT "Data INPUT options:" 2360 PRINT " Option 1 - Data already exists in a STORED data file" 2370 PRINT " Option 2 - Data is to be manually entered from keyboard" 2380 PRINT " (and subsequently STORED, if desired)" 2390 INPUT "Choose OPTION: Input 1 or 2 "; OPT 2400 IF OPT < 1 OR OPT > 2 THEN PRINT "value out-of-range, try again ": GOTO 2390 2410 INPUT "INPUT TOTAL Number of Communities............"; NG 2420 DIM n(NG): NI = 0 2430 FOR J = 1 TO NG 2440 PRINT "INPUT Number of SUs in Community #"; J; "........"; 2450 INPUT "?", n(J): NI = NI + n(J) 2460 IF n(J) < 10 THEN MADFLAG = 1: GOSUB 3120 2470 NEXT J 2480 INPUT "INPUT Total Number of Environmental Factors.."; NF 2490 NH = NF + 1 2500 DIM X(NI, NF, NG), S4(NI, NF, NG), D1(NI, NF, NG), A(NH, NH) 2510 DIM SU(NI, NG), K4(NF), K6(NF), C(NF), B1(NF, NG), B2(NF, NG), S1(NF, NG) 2520 IF OPT = 1 THEN GOTO 2790 2530 PRINT 2540 PRINT "The data matrix is created one COLUMN at a time" 2550 FOR L = 1 TO NG 2560 M = n(L) 2570 FOR I = 1 TO M 2580 PRINT "INPUT SU ID # for SU number"; I; "of Community................."; L; 2590 INPUT SU(I, L) 2600 FOR J = 1 TO NF 2610 PRINT " Value for EF X("; J; ") in SU "; SU(I, L); " of Community "; L; 2620 INPUT " = "; X(I, J, L) 2630 NEXT J, I, L 2640 INPUT "STORE This DATASET ON DISK ? (ENTER Y for YES / N for NO) "; A$ 2650 IF A$ = "N" OR A$ = "n" THEN GOTO 2920 ELSE 2660 2660 INPUT "Specify a name for this DATASET (e.g., SDA.DAT) "; OUTDAT$ 2670 INPUT "Specify DISK drive: ENTER A, B, C, etc. "; DD$ 2680 OUTDAT$ = DD$ + ":" + OUTDAT$ 2690 OPEN OUTDAT$ FOR OUTPUT AS #1 2700 FOR L = 1 TO NG 2710 M = n(L) 2720 FOR I = 1 TO M 2730 PRINT #1, SU(I, L) 2740 FOR J = 1 TO NF 2750 PRINT #1, X(I, J, L) 2760 NEXT J 2770 NEXT I, L 2780 GOTO 2920 2790 INPUT "Specify name of DATA File (e.g., SDA.DAT) "; DATAFIL$ 2800 INPUT "Specify DISK DRIVE where located: A, B, C, etc. "; DD$ 2810 FILENAM$ = DD$ + ":" + DATAFIL$ 2820 OPEN "I", #1, FILENAM$ 2830 FOR L = 1 TO NG 2840 M = n(L) 2850 FOR I = 1 TO M 2860 INPUT #1, SU(I, L) 2870 FOR J = 1 TO NF 2880 INPUT #1, X(I, J, L) 2890 NEXT J 2900 NEXT I, L 2910 CLS 2920 INPUT "Would you like to list the DATA ? (Y for Yes / N for NO) "; A$ 2930 IF A$ = "N" OR A$ = "n" THEN GOTO 3100 2940 CLS : PRINT "Community SU [EF] Observed" 2950 PRINT " # ID # X(i) Value " 2960 PRINT "--------- -------- -------- --------" 2970 FOR L = 1 TO NG 2980 M = n(L) 2990 FOR I = 1 TO M 3000 PRINT USING "#####"; L; 3010 PRINT " "; : PRINT USING "#####"; SU(I, L); 3020 FOR J = 1 TO NF 3030 IF J = 1 THEN PRINT " "; : PRINT USING "#####"; J; 3040 IF J > 1 THEN PRINT " "; : PRINT USING "#####"; J; 3050 PRINT USING "#######.##"; X(I, J, L) 3060 NEXT J 3070 NEXT I, L 3080 PRINT : PRINT "PRESS ANY KEY TO CONTINUE" 3090 IF INKEY$ = "" THEN 3090 3100 CLOSE #1 3110 RETURN 3120 REM ---------PRINT WARNING FOR SMALL SAMPLE SIZES- ----------------- 3130 PRINT " ___________________________________________________________ " 3140 PRINT " | ** Warning: Low # SUs! Assumption of multivariate normal|" 3150 PRINT " | distribution likely violated! We recommend |" 3160 PRINT " | at least 10 SUs be included in a community. |" 3170 PRINT " | SDA will proceed, but any comparision |" 3180 PRINT " | involving COMMUNITY"; J; " will NOT include the |" 3190 PRINT " | ANOVA. |" 3200 PRINT " |___________________________________________________________|" 3210 PRINT : RETURN