10 CLS:PRINT "MULTFIT-Fits Multiplicative Model" 11 PRINT" by Michael Birnbaum" 12 PRINT :PRINT 14 PRINT"Prediction(i,j) = B + S(i)T(j)" 15 PRINT :PRINT "Initial Estimates as Follows" 16 PRINT" B estimated from 4 corners" 17 PRINT " S and T estimated from marginal sums" 18 PRINT 20 INPUT"NO. OF ROWS";r 30 INPUT"NO. OF COLS";c 40 DIM x(r,c),s(r),T(c),S1(r),T1(c),S2(r),T2(c),X2(r,c) 41 INPUT"Data in file (f) or Entered from keyboard (k)";k$ 42 IF k$ <> "f" AND k$ <> "k" THEN PRINT "type either 'k' or 'f': go to 42 43 IF k$ = "f" OR k$ = "F" THEN 1000 45 PRINT :PRINT "ENTER DATA, BY ROWS":PRINT 50 FOR i=1 TO r 55 PRINT :PRINT "ROW";i 60 FOR j=1 TO c 70 PRINT "X(";i;",";j;")="; 80 INPUT x(i,j) 90 NEXT:NEXT 120 FOR i=1 TO r:S1(i)=0:S2(i)=0 :NEXT 125 FOR j=1 TO c:T1(j)=0:T2(j)=0:NEXT 130 A1=(x(r,c)-x(r,1))/(x(1,c)-x(1,1)) 132 IF A1=1 THEN A1=1.0000001# 135 B=(x(1,1)*A1-x(r,1))/(A1-1) 140 CLS:PRINT "FIRST EST. OF B = " 141 PRINT B:PRINT 150 FOR i=1 TO r:FOR j=1 TO c:X2(i,j)=x(i,j)-B:NEXT:NEXT 155 GT=0 160 FOR i=1 TO r:S1(i)=0:FOR j=1 TO c 170 GT=GT+X2(i,j) 175 S1(i)=S1(i)+X2(i,j) 180 T1(j)=T1(j)+X2(i,j) 185 NEXT:NEXT 190 IF GT=0 THEN PRINT"Grand Total=0. Reflect Data":END 191 PRINT :PRINT "ESTIMATES OF S" 192 FOR i=1 TO r:s(i)=S1(i)/GT:PRINT i,s(i):NEXT 193 PRINT "HIT A KEY" 194 a$=INKEY$:IF a$="" THEN 194 195 PRINT :PRINT "ESTIMATES OF T":PRINT 196 FOR j=1 TO c:T(j)=T1(j):PRINT j,INT(T(j)*1000+.5)/1000:NEXT 198 PRINT: PRINT "EST. OF B =";B: PRINT 203 PRINT "HIT A KEY" 204 a$=INKEY$:IF a$=""THEN 204 300 ICT=0:SER=0 310 CLS:PRINT "FIT OF INITIAL ESTS" 315 PRINT " I J ","X(I,J)"," PRED"," RES" 320 FOR i=1 TO r:FOR j=1 TO c: ICT = ICT+1 322 PR=s(i)*T(j)+B 324 E1=x(i,j)-PR:SER=SER+E1*E1 326 PRINT i;j,x(i,j),INT(1000*PR+.5)/1000,INT(1000*E1+.5)/1000 327 IF 14 > ICT THEN 330 328 ICT = 0: PRINT "HIT A KEY" 329 a$=INKEY$:IF a$=""THEN 329 330 NEXT:NEXT 332 PRINT "HIT A KEY"; 335 a$=INKEY$:IF a$=""THEN 335 340 PRINT :PRINT "SUM OF SQUARED ERRORS":PRINT "SS=";SER 347 INPUT"ANOTHER LOOK (Y/N)?";r$ 348 IF r$="Y" OR r$="y" THEN GOTO 191 350 CLS: PRINT"Iterative Least-Squares Solution" 352 INPUT"Tolerance (e.g., .01)"; TL 360 REM -----another iteration starts here ------ 365 BT = 0 370 FOR i = 1 TO r: FOR j=1 TO c: BT=BT+x(i,j)-s(i)*T(j):NEXT:NEXT 375 B=BT/(r*c) 380 FOR i = 1 TO r: S1(i)=0:S2(i)=0: FOR j=1 TO c 382 S1(i)=S1(i)+(x(i,j)-B)*T(j) 383 S2(i)=S2(i)+T(j)*T(j) 384 NEXT: S1(i)=S1(i)/S2(i):NEXT 390 FOR j=1 TO c: T1(j)=0:T2(j)=0:FOR i=1 TO r 392 T1(j) = T1(j)+(x(i,j)-B)*s(i) 393 T2(j) = T2(j)+s(i)*s(i) 394 NEXT: T1(j)=T1(j)/T2(j):NEXT 400 SD = 0: SER =0 410 FOR i=1 TO r: SD=SD+ABS(S1(i)-s(i)):NEXT 420 FOR j=1 TO c: SD=SD+ABS(T1(j)-T(j)):NEXT 430 FOR i=1 TO r: FOR j=1 TO c 432 SER=SER+(x(i,j)-B-s(i)*T(j))^2 435 NEXT:NEXT 440 PRINT"Change in Scales=";SD, "Sum of Squares=";SER 450 FOR i=1 TO r: s(i)=S1(i):NEXT 460 FOR j=1 TO c:T(j)=T1(j):NEXT 465 IF TL > SD THEN GOSUB 700 470 IF SD > TL THEN 360 482 INPUT"Another look (y/n)";RL$ 484 IF RL$="Y" OR RL$="y" THEN GOSUB 700 486 INPUT"More iterations (y/n)";AM$ 488 IF AM$="Y" OR AM$="y" THEN 350 490 INPUT"Save results (y/n)";AD$ 498 IF AD$="Y" OR AD$="y" THEN GOSUB 900 500 END 700 PRINT :INPUT"HIT A KEY";KK$ 710 CLS: PRINT"Approximate Least-Squares Solution" 791 PRINT :PRINT "ESTIMATES OF S" 792 FOR i=1 TO r: PRINT i,INT(s(i)*1000+.5)/1000:NEXT 793 PRINT "HIT A KEY" 794 a$=INKEY$:IF a$="" THEN 794 795 PRINT :PRINT "ESTIMATES OF T":PRINT 796 FOR j=1 TO c: PRINT j,INT(T(j)*1000+.5)/1000:NEXT 798 PRINT: PRINT "EST. OF B =";B: PRINT 803 PRINT "HIT A KEY" 804 a$=INKEY$:IF a$=""THEN 804 810 CLS:PRINT "Approximate Least Squares Fit":PRINT 812 SER=0 815 PRINT " I J ","X(I,J)"," PRED"," RES" 820 FOR i=1 TO r:FOR j=1 TO c 824 PR=s(i)*T(j)+B 826 E1=x(i,j)-PR:SER=SER+E1*E1 828 PRINT i;j,x(i,j),INT(1000*PR+.5)/1000,INT(1000*E1+.5)/1000 830 NEXT 832 PRINT "HIT A KEY" 835 a$=INKEY$:IF a$=""THEN 835 838 NEXT 840 PRINT :PRINT "SUM OF SQUARED ERRORS":PRINT "SS=";SER 850 RETURN 900 REM subroutine to create file 901 INPUT"type 'y' if you want to save output (y/n)";pout$ 902 IF pout$ <> "y" AND pout$ <>"Y" THEN GOTO 999 903 INPUT"name of file";nemfile$ 904 INPUT"title of output";title$ 908 OPEN nemfile$ FOR OUTPUT AS #1 910 PRINT #1, "Approximate Least-Squares Solution Multfit" 912 PRINT #1, title$ 914 PRINT#1, :PRINT #1, "ESTIMATES OF S" 916 FOR i=1 TO r: PRINT #1, i,INT(s(i)*1000+.5)/1000:NEXT 920 PRINT #1,:PRINT #1,"ESTIMATES OF T":PRINT #1, 922 FOR j=1 TO c: PRINT#1, j,INT(T(j)*1000+.5)/1000:NEXT 930 PRINT# 1,: PRINT #1, "EST. OF B =";B: PRINT #1, 932 PRINT # 1, "Approximate Least Squares Fit":PRINT#1, 934 SER=0 936 PRINT #1, " I J ","X(I,J)"," PRED"," RES" 938 FOR i=1 TO r:FOR j=1 TO c 940 PR=s(i)*T(j)+B 942 E1=x(i,j)-PR:SER=SER+E1*E1 944 PRINT #1,i;j,x(i,j),INT(1000*PR+.5)/1000,INT(1000*E1+.5)/1000 946 NEXT 948 NEXT 950 PRINT#1, :PRINT#1, "SUM OF SQUARED ERRORS":PRINT #1, "SS=";SER 955 PRINT#1, 960 PRINT#1, "Extra Copy of Predictions (Copy and Paste)" 970 FOR i=1 TO r:FOR j=1 TO c 974 PR=s(i)*T(j)+B 978 PRINT #1,INT(1000*PR+.5)/1000 980 NEXT 982 NEXT 983 PRINT#1, 985 PRINT#1, "Extra Copy of DATA (Copy and Paste)" 987 FOR i=1 TO r:FOR j=1 TO c 990 PRINT #1,x(i,j) 992 NEXT 993 NEXT 995 CLOSE #1 997 RETURN 999 END 1000 INPUT"Your data are in a file (y/n)";a$ 1001 IF a$ <> "y" AND a$ <> "Y" THEN 45 1020 INPUT"Name of file ="; dmul$ 1023 OPEN dmul$ FOR INPUT AS #2 1026 FOR i = 1 TO r 1028 FOR j = 1 TO c 1030 INPUT #2, x(i,j) 1034 NEXT:NEXT 1040 CLOSE #2 1050 GOTO 120