home *** CD-ROM | disk | FTP | other *** search
/ World of Ham Radio 1997 / WOHR97_AmSoft_(1997-02-01).iso / antenna / ant_21 / prog / linreg.bas < prev    next >
BASIC Source File  |  1997-02-01  |  5KB  |  171 lines

  1.      REM   LINREG.BAS
  2.          cls: PRINT : PRINT " This program fits a straight line to a given set of coordinates"
  3.      PRINT " using the method of least squares.  The equation of the line,"
  4.      PRINT " coefficient of determination, coefficient of correlation and standard"
  5.      PRINT " error of estimate are printed.  Once the line has been fitted, you may"
  6.      PRINT " predict values of y for given values of x."
  7.      PRINT
  8.      PRINT " From SOME COMMON BASIC PROGRAMS, 3rd edition, by Lon Poole and"
  9.      PRINT " Mary Borchers, Osborne/McGraw-Hill, Berkeley CA, 1979.  The authors"
  10.      PRINT " state that the programs had been tested on a Wang 2200 and the"
  11.      PRINT " Commodore PET (ancient history!).  Adapted where necessary to"
  12.      PRINT " Microsoft QuickBasic 4.5, and modified for more aesthetic and useful"
  13.      PRINT " output (with attention to curve-fitting for programmers) and compiled"
  14.      PRINT " by Orrin C. Winton WN1Z, 11/94 and 11/95."
  15.      PRINT
  16.      PRINT " The plot routine came from PROGRAMMING WITH BASIC 3rd ed., by"
  17.      PRINT " Byron S. Gottfried, McGraw-Hill, NY, 1986, extensively modified by"
  18.      PRINT " O.C. Winton.  The menu program is from ADVANCED QuickBASIC, by Ken"
  19.      PRINT " Knecht, Scott, Foresman and Company, Glenview, Illinois, 1989"
  20.      PRINT " and is modified only slightly."
  21.     
  22.      PRINT
  23.      PRINT " linear regression"
  24.      PRINT
  25.      PRINT " number of known points:  ";
  26.      INPUT n
  27.      DIM x(30)
  28.      DIM y(30)
  29.      DIM o(30)
  30.      DIM p(30)
  31.      j = 0
  32.      k = 0
  33.      l = 0
  34.      m = 0
  35.      r2 = 0
  36.  
  37.      REM   loop to enter coordinates of points
  38.      FOR i = 1 TO n
  39.          PRINT " x,y of point"; i;
  40.          INPUT x(i), y(i)
  41.          REM   accumulate intermediate sums
  42.          j = j + x(i)
  43.          k = k + y(i)
  44.          l = l + x(i) ^ 2
  45.          m = m + y(i) ^ 2
  46.          r2 = r2 + x(i) * y(i)
  47.      NEXT i
  48.  
  49.      REM   compute curve coefficient
  50.      b = (n * r2 - k * j) / (n * l - j ^ 2)
  51.      a = (k - b * j) / n
  52.      PRINT
  53.      PRINT " f(x) = ("; b; "* x) + "; a
  54.  
  55.      REM   compute regression analysis
  56.      j = b * (r2 - j * k / n)
  57.      m = m - k ^ 2 / n
  58.      k = m - j
  59.      PRINT
  60.      r2 = j / m
  61.      PRINT " coefficient of determination (r^2) = "; r2
  62.      PRINT " coefficient of correlation         = "; SQR(r2)
  63.      IF k < 0 OR (n - 2) <= 0 THEN GOTO d
  64.      PRINT " standard error of estimate         = "; SQR(k / (n - 2)): GOTO e
  65. d:       PRINT " standard error of estimate         = "
  66. e:       PRINT
  67.  
  68.      REM   estimate y-coordinates of points with entered x-coordinates
  69.      INPUT " do you wish to do interpolation?  enter 'y' for yes"; y$
  70.      IF y$ = "y" THEN
  71.          PRINT " enter -999 to quit interpolation"
  72.          GOTO b
  73.      ELSE GOTO c
  74.      END IF
  75.  
  76. b:       PRINT " x = ";
  77.      INPUT x
  78.      IF x = -999 THEN GOTO c
  79.      REM   restart or end program?
  80.      PRINT " y = "; a + b * x
  81.      PRINT
  82.      GOTO b
  83. c:       REM
  84.     
  85.  
  86. 2115 ' ******* Prepare to plot regression-equation y-values against
  87. 2116 '         user-input x-values.  Not user-input y-values.
  88. 2117 '
  89. 2120 FOR i = 1 TO n
  90. 2122     o(i) = x(i)
  91. 2124 NEXT i
  92.  
  93. 2126 FOR i = 1 TO n
  94. 2128     p(i) = b * (o(i)) + a
  95. 2130 NEXT i
  96.  
  97. 2270 ' ******* Find Largest and Smallest X and Y (the user-input x,y values)
  98. 2280 '
  99. 2290 XMAX = -100000!: YMAX = -100000!: XMIN = 100000!: YMIN = 100000!
  100. 2300 FOR i = 1 TO n
  101. 2310    IF x(i) > XMAX THEN XMAX = x(i)
  102. 2320    IF y(i) > YMAX THEN YMAX = y(i)
  103. 2330    IF x(i) < XMIN THEN XMIN = x(i)
  104. 2340    IF y(i) < YMIN THEN YMIN = y(i)
  105. 2350 NEXT i
  106. 2360
  107. 2370 ' ******* Scale the Xs and Ys
  108. 2380 '
  109. 2390 FOR i = 1 TO n
  110. 2400     x(i) = 29 + INT(280 * (x(i) - XMIN) / (XMAX - XMIN))
  111. 2410     y(i) = 189 - INT(150 * (y(i) - YMIN) / (YMAX - YMIN))
  112. 2420 NEXT i
  113.  
  114. 2470 ' ******* Plot the Graphical Display of user-input x and y values
  115. 2480 '
  116. 2490 SCREEN 9
  117. 2500 LINE (19, 29)-(19, 199): LINE -(319, 199)
  118. 2510 FOR IY = 59 TO 179 STEP 20: LINE (19, IY)-(23, IY): NEXT IY
  119. 2520 FOR IX = 39 TO 299 STEP 20: LINE (IX, 199)-(IX, 195): NEXT IX
  120. 2530 '
  121. 2540 FOR i = 1 TO n
  122. 2550     PSET (x(i), y(i)): LINE (x(i), y(i) - 2)-(x(i) - 4, y(i) + 2)
  123. 2560     LINE -(x(i) + 4, y(i) + 2): LINE -(x(i), y(i) - 2)
  124. 2570 NEXT i
  125. 2580 '
  126. 2590 FOR i = 1 TO n - 1
  127. 2600     LINE (x(i), y(i))-(x(i + 1), y(i + 1))
  128. 2610 NEXT i
  129.  
  130. 2770 ' ******* Find Largest and Smallest o and p
  131. 2780 '
  132. 2790 OMAX = -100000!: PMAX = -100000!: OMIN = 100000!: PMIN = 100000!
  133. 2800 FOR i = 1 TO n
  134. 2810    IF o(i) > OMAX THEN OMAX = o(i)
  135. 2820    IF p(i) > PMAX THEN PMAX = p(i)
  136. 2830    IF o(i) < OMIN THEN OMIN = o(i)
  137. 2840    IF p(i) < PMIN THEN PMIN = p(i)
  138. 2850 NEXT i
  139. 2860
  140. 2870 ' ******* Scale the Os and Ps
  141. 2880 '
  142. 2890 FOR i = 1 TO n
  143. 2900     o(i) = 29 + INT(280 * (o(i) - OMIN) / (OMAX - OMIN))
  144. 2910     p(i) = 189 - INT(150 * (p(i) - PMIN) / (PMAX - PMIN))
  145. 2920 NEXT i
  146.  
  147. 3000 ' ******* Plot the regression equation y-values against
  148. 3002 '         user-input x values.  Not user-input y values.
  149. 3010 '
  150. 3015 COLOR 4
  151. 3020 FOR i = 1 TO (n - 1)
  152. 3030     LINE (o(i), p(i))-(o(i + 1), p(i + 1))
  153. 3040 NEXT i
  154.  
  155. 3045 COLOR 7
  156. 3050 PRINT " f(x) = ("; b; "* x) + "; a
  157. 3060 PRINT : PRINT : PRINT : PRINT : PRINT : PRINT : PRINT : PRINT : PRINT : PRINT : PRINT : PRINT : PRINT : PRINT : PRINT : PRINT
  158. 3064 PRINT " White curve w/markers: your x,y inputs."
  159. 3066 COLOR 4: PRINT " Red curve is eqn's y based on your x-inputs."
  160. 3068 PRINT " Eqn's fit is close to perfect if red line overwrites white line."
  161. 3069 COLOR 2
  162. 3070 INPUT " hit any key to end LINEAR REGRESSION sub-program", dummy
  163. 3080 RUN "menu"
  164. 3099 END
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.