5 COMMON R(), F(), S() 10 CLS 20 PRINT 30 PRINT " I N T E R A C T I V E B A S I C P R O G R A M " 40 PRINT 50 PRINT " L O G N O R M . B A S " 60 PRINT 70 PRINT " ---------------------------------------------------------" 80 PRINT " Fitting an OBSERVED FREQUENCY DISTRIBUTION consisting of " 90 PRINT " the NUMBER OF SPECIES found in various ABUNDANCE CLASSES " 100 PRINT " to the LOGNORMAL DISTRIBUTION " 110 PRINT " --------------------------------------------------------" 120 PRINT " The lognormal distribution is given by " 130 PRINT " 2 " 140 PRINT " -(a R) " 150 PRINT " S(R) = So e " 160 PRINT 170 PRINT " where S(R) = number of species in Rth octave " 180 PRINT " So = number of species in modal octave " 190 PRINT " a = parameter related to the variance " 200 PRINT " of the distribution " 210 PRINT " --------------------------------------------------------" 220 PRINT 230 PRINT " PRESS any KEY to CONTINUE" 240 IF INKEY$ = "" THEN 240 250 CLS 260 PRINT "-------------- PART I. DATA ENTRY ---------------------------------" 270 PRINT 280 PRINT " The OBSERVED FREQUENCY DATA consists of the number of species that" 290 PRINT " occur within ABUNDANCE CLASSES arranged so each successive class " 300 PRINT " is a DOUBLING of the previous one; these are termed 'OCTAVES.' " 310 PRINT 320 PRINT " The MODAL octave contains the largest number of species and is " 330 PRINT " identified by R=0; the other octaves are R octaves distant from " 340 PRINT " the mode: indicated by +(1,2,...) to RIGHT & -(1,2,...) to LEFT. " 350 PRINT 360 PRINT "For example: " 370 PRINT " # INDIVIDUALS # SPECIES " 380 PRINT " OCTAVE R PER SPECIES PER OCTAVE " 390 PRINT " ------ - ------------- ---------- " 400 PRINT " 1 -2 0 - 1 9.5 " 410 PRINT " 2 -1 1 - 2 16.5 " 420 PRINT " 3 0 2 - 4 20.0 " 430 PRINT " 4 +1 4 - 8 10.0 " 440 PRINT " 5 +2 8 - 16 2.0 " 450 PRINT " " 460 PRINT "YOUR DATA: " 470 INPUT " Enter TOTAL NUMBER of OCTAVES..(e.g., 5 in example)..........", M 480 INPUT " Enter LARGEST, POSITIVE VALUE of R..(e.g., 2 in example).....", RLAR 490 REM *COMPUTE RANGE OF R VALUES 500 DIM R(M), F(M), S(M) 510 RMIN = RLAR - M 520 FOR I = 1 TO M 530 R(I) = RMIN + I 540 NEXT I 550 PRINT 560 REM *INPUT DATA 570 PRINT " Enter OBSERVED " 580 PRINT "OCTAVE R Number of Species" 590 RSQSUM = 0: LNSSUM = 0: MM = 0 600 FOR I = 1 TO M 610 PRINT USING "### ###.# "; I; R(I); 620 INPUT S(I) 630 RSQSUM = RSQSUM + R(I) ^ 2 632 IF R(I) = 0 OR R(I) = .5 THEN MODAL = I 'THE MODAL OCTAVE 635 IF S(I) <= 0 THEN GOTO 650 640 LNSSUM = LNSSUM + LOG(S(I)) 645 GOTO 660 650 MM = MM + 1 660 NEXT I 670 PRINT " DATA ENTRY COMPLETE -- PRESS any KEY to CONTINUE" 680 IF INKEY$ = "" THEN 680 690 CLS 700 PRINT "-------------- PART II. PARAMETER ESTIMATION ----------" 710 REM ESTI. PARAMETER A 720 IF ABS(R(1)) = RLAR THEN GOTO 760 'SEE IF RMAX SAME FOR + & - 730 IF ABS(R(1)) > RLAR THEN INDX = 1 ELSE INDX = M 740 A = SQR(LOG(S(MODAL) / S(INDX)) / (RLAR ^ 2)) 750 GOTO 790 760 A1 = SQR(LOG(S(MODAL) / S(1)) / R(1) ^ 2) 770 A2 = SQR(LOG(S(MODAL) / S(M)) / R(M) ^ 2) 780 A = (A1 + A2) / 2 790 REM ESTI. OF PARAMETER So 800 R2MEAN = RSQSUM / M 810 LSMEAN = LNSSUM / (M - MM) 820 SOEST = EXP(LSMEAN + A ^ 2 * R2MEAN) 830 REM PRINT ESTIMATES 840 PRINT : PRINT 850 PRINT "ESTIMATES OF PARAMETERS a & So " 860 PRINT 870 PRINT " a (Eq. 7.3) So (Modal) So (Eq. 7.4) " 880 PRINT " ----------- ----------- ------------ " 890 PRINT USING " #.### ###.# ###.#"; A; S(MODAL); SOEST 900 PRINT : PRINT 910 PRINT "----------- PART III. GOODNESS-OF-FIT --------------" 920 MINCSQ = 9999: 'MINIMUM CHI-SQ ASSOC. WITH CERTAIN COMBINATION OF A & SO 930 PRINT 940 PRINT " A CHI-SQUARE value is computed based on the estimates" 950 PRINT " of a = "; A; " and So = "; S(MODAL); " and "; SOEST 960 PRINT 970 PRINT " PARAMETERS APPROXIMATE " 980 PRINT " a So CHI- SQUARE " 990 PRINT " ------- ---- --------------- " 1000 SO = S(MODAL): GOSUB 1410 1010 PRINT USING " #.### ###.# ###.## "; A; SO; CHISQS 1020 SO = SOEST: GOSUB 1410 1030 PRINT USING " #.### ###.# ###.## "; A; SO; CHISQS 1040 PRINT : PRINT 1050 PRINT "PRESS any KEY to CONTINUE" 1060 IF INKEY$ = "" THEN 1060 1070 CLS 1080 PRINT "---------------PART IV. ITERATIVE PARAMETER SEARCH ----------------" 1090 PRINT 1100 PRINT "Different VALUES for 'a' and 'So' may be iteratively " 1110 PRINT " substituted into the LOGNORMAL model to search for " 1120 PRINT " the combination that MINIMIZES the difference between" 1130 PRINT " The OBSERVED and EXPECTED values " 1140 PRINT : PRINT 1150 INPUT "Would you like to CONTINUE ? (YES=HIT RETURN KEY/NO=N)"; A$ 1160 OPT = 1 1170 IF A$ = "n" OR A$ = "N" THEN END 1180 PRINT 1190 PRINT "In the scheme below, if you want to CHANGE the value of a " 1200 PRINT " parameter, then ENTER a NEW value; otherwise hit the " 1210 PRINT " RETURN KEY and the parameter will retain its CURRENT value" 1220 PRINT : PRINT "NOTE: May (1975) has shown that as the total number of" 1230 PRINT " species varies from 20 to 10,000, 'a' varies from 0.3 to 0.13" 1231 PRINT 1240 PRINT " 2" 1250 PRINT USING "Thus far, the MINIMUM X =###.## "; MINCSQ; 1260 PRINT USING " with parameters a = #.###"; AMIN; 1270 PRINT USING " and So = ###.##"; SOMIN 1280 PRINT 1290 PRINT " PARAMETER VALUES: " 1300 PRINT USING " a=#.###"; A; 1310 INPUT " or a =", AX 1320 IF AX > 0 THEN A = AX 1330 PRINT USING "So=###.#"; SO; 1340 INPUT " or So=", SOX 1350 IF SOX > 0 THEN SO = SOX 1360 PRINT " 2 : 2 MINIMUM" 1370 GOSUB 1410 1380 PRINT 1390 INPUT "TRY ANOTHER COMBINATION? (YES= HIT RETURN KEY/NO=N)"; A$ 1400 IF A$ = "N" OR A$ = "n" THEN END ELSE GOTO 1290 1410 REM --------SUBROUTINE TO COMPUTE A GOODNESS-OF-FIT ----------------- 1420 CHISQS = 0: TOTSPT = 0: TOTSPO = 0 1430 IF ABS(R(1)) = R(M) THEN II = 2: MM = M - 1: FLAG = 1 1440 IF ABS(R(1)) <> R(M) THEN II = 1: MM = M: FLAG = 2 1450 FOR I = II TO MM 1460 THEORY = SO * EXP(-(A ^ 2 * R(I) ^ 2)) 1470 TOTSPO = TOTSPO + S(I): 'total number of species observed 1480 TOTSPT = TOTSPT + THEORY: 'total number of species in distribution 1490 DIFF = ((S(I) - THEORY) ^ 2) / THEORY 1500 CHISQS = CHISQS + DIFF 1510 NEXT I 1520 IF FLAG = 2 THEN GOTO 1660 1530 TOTSPO = TOTSPO + S(1) + S(M) 1540 REM: compute expected frequencies in tails of lognormal 1550 IF TOTSPO <= TOTSPT THEN GOTO 1600 1560 X = (TOTSPO - TOTSPT) / 2 1570 TAILS1 = X 1580 TAILS2 = X 1590 GOTO 1620 1600 TAILS1 = SO * EXP(-(A ^ 2 * R(1) ^ 2)) 1610 TAILS2 = SO * EXP(-(A ^ 2 * R(M) ^ 2)) 1620 DIFF1 = ((S(1) - TAILS1) ^ 2) / TAILS1 1630 DIFF2 = ((S(M) - TAILS2) ^ 2) / TAILS2 1640 CHISQS = CHISQS + DIFF1 + DIFF2 1650 REM 1660 IF CHISQS < MINCSQ THEN MINCSQ = CHISQS: AMIN = A: SOMIN = SO 1670 IF OPT = 0 THEN RETURN 1680 PRINT USING "For a=#.###"; A; 1690 PRINT USING ",So=###.#"; SO; 1700 PRINT USING " X =###.##"; CHISQS; 1710 PRINT USING " : X THUS FAR=###.##"; MINCSQ; 1720 PRINT USING " when a=#.###"; AMIN; 1730 PRINT USING ",So=###.#"; SOMIN 1740 RETURN