home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Between Heaven & Hell 2
/
BetweenHeavenHell.cdr
/
500
/
473
/
multi.arc
/
FORGET.FOR
< prev
next >
Wrap
Text File
|
1985-12-01
|
13KB
|
465 lines
C
C FORGET-IT
C Tukey's Forget-it Plots
C Version 1.0
C November 4, 1985
C
C
C Gerard E. Dallal
C
C USDA Human Nutrition Research Center on Aging
C at Tufts University
C 711 Washington Street
C Boston, MA 02111
C
C and
C
C Tufts University School of Nutrition
C 132 Curtis Street
C Medford, MA 02155
C
C
C
C NOTICE
C
C Documentation and original code copyright 1985 by Gerard E.
C Dallal. Reproduction of material for non-commercial purposes
C is permitted, without charge, provided that suitable
C reference is made to FORGET-IT and its author.
C
C Neither FORGET-IT nor its documentation should be modified in
C any way without permission from the author, except for those
C changes that are essential to move FORGET-IT to another
C computer.
C
C Please acknowledge FORGET-IT in any manuscript that uses its
C calculations.
C
LOGICAL QFILE, QLABEL, QEXT
CHARACTER*1 QUERY, RNAME(20,5), CNAME(20,5), PLOT(100,100),
* BLANK, SLASH, BSLASH, VBAR, XXX, OOO, CDUMMY
CHARACTER FNAME*50
DIMENSION DATA(20, 20), RE(20), CE(20),
* INDEX(20), FIT(20, 20), IROW(20), ICOL(20)
DATA IOUT /0/, IIN /0/, NPLMAX/100/, NLMAX /20/, NLWMAX /5/
DATA IFIN /10/, IWOUT /11/, QFILE /.FALSE./, QEXT/.FALSE./
DATA BLANK /' '/, SLASH /'/'/, BSLASH /'\'/, VBAR /'|'/,
* XXX /'X'/, OOO /'0'/
C
WRITE(IOUT,9999)
9999 FORMAT (//35X,'FORGET-IT'/
* 28X,'Tukey''s Forget-it Plots'/
* 34X,'Version 1.0'/32X,'November 4, 1985'//
* 32X,'Gerard E. Dallal'/
* 17X,'USDA Human Nutrition Research Center on Aging'/
* 30X,'at Tufts University'/29X,'711 Washington Street'/
* 31X,'Boston, MA 02111'///36X,'NOTICE'//9X,'Please '
* 'acknowledge FORGET-IT in any manuscript that uses its',/
* 33X,'calculations.'/)
C
1 QLABEL = .FALSE.
DO 2 KK = 1, NLWMAX
DO 2 K = 1, NLMAX
RNAME(K,KK) = BLANK
CNAME(K,KK) = BLANK
2 CONTINUE
IF (QFILE) GOTO 10
WRITE(IOUT,4)
4 FORMAT(/' Do you wish to save the results of this session? ',
* '(Y or N): '$)
READ (IIN,6) QUERY
6 FORMAT (A1)
IF (QUERY.EQ.'Y' .OR. QUERY.EQ.'y') QFILE = .TRUE.
IF (.NOT. QFILE) GOTO 10
WRITE (IOUT,8)
8 FORMAT (' Enter filename: '$)
READ (IIN,'(A)') FNAME
OPEN (IWOUT, FILE = FNAME, STATUS = 'NEW')
10 WRITE (IOUT,15)
IF (QFILE) WRITE (IWOUT,15)
15 FORMAT(//' Enter the number of rows: '$)
READ (IIN,*) M
IF (QFILE) WRITE (IWOUT,*) M
WRITE (IOUT,20)
IF (QFILE) WRITE (IWOUT,20)
20 FORMAT(' Enter the number of columns: '$)
READ (IIN,*) N
IF (QFILE) WRITE (IWOUT,*) N
WRITE (IOUT,21)
21 FORMAT(/' Are data contained in an external file? (Y or N): '$)
READ (IIN,6) QUERY
IF (QUERY.NE.'Y' .AND. QUERY.NE.'y') GOTO 30
QEXT = .TRUE.
WRITE (IOUT,24)
24 FORMAT (' Enter filename: '$)
READ (IIN,'(A)') FNAME
OPEN (IFIN, FILE = FNAME, STATUS = 'OLD')
DO 26 I = 1, M
READ (IFIN,*) (DATA(I,J), J = 1, N)
26 CONTINUE
DO 27 I = 1, M
READ(IFIN,28,END = 51) (RNAME(I,K), K = 1, 5)
28 FORMAT(5A1)
27 CONTINUE
DO 29 J = 1, N
READ(IFIN,28,END = 51) (CNAME(J,K), K = 1, 5)
29 CONTINUE
QLABEL = .TRUE.
GOTO 59
30 DO 50 I = 1, M
WRITE (IOUT,40) I
40 FORMAT(' Enter row',I2,':')
READ (IIN,*) (DATA(I,J), J = 1, N)
50 CONTINUE
51 WRITE (IOUT,52)
52 FORMAT(/' Do you wish to specify row and column names? ',
* '(Y or N): '$)
READ (IIN,6) QUERY
IF (QUERY.NE.'Y' .AND. QUERY.NE.'y') GOTO 59
QLABEL = .TRUE.
DO 54 I = 1, M
WRITE(IOUT,53) I
53 FORMAT(' Enter name of row',I2,': '$)
READ(IIN,28) (RNAME(I,K), K = 1, 5)
54 CONTINUE
DO 56 J = 1, N
WRITE(IOUT,55) J
55 FORMAT(' Enter name of column',I2,': '$)
READ(IIN,28) (CNAME(J,K), K = 1, 5)
56 CONTINUE
59 WRITE(IOUT,60) ((CNAME(J,K),K=1,5), J=1,N)
60 FORMAT(//(11X,5A1,8X,5A1,8X,5A1,8X,5A1,8X,5A1,8X,5A1))
61 DO 63 I = 1, M
WRITE (IOUT,62) (RNAME(I,K), K = 1, 5), (DATA(I,J), J = 1, N)
62 FORMAT (/1X,5A1,1X,6G13.5/(7X,6G13.5))
63 CONTINUE
IF (QEXT) GOTO 76
WRITE(IOUT,64)
64 FORMAT(/' Any changes? (Y or N): '$)
READ (IIN,6) QUERY
IF (QUERY.NE.'Y' .AND. QUERY.NE.'y') GOTO 76
65 WRITE (IOUT,66)
66 FORMAT(' Enter row: '$)
READ (IIN,*) KROW
IF (KROW.LT.1 .OR. KROW.GT.M) GOTO 65
C
67 WRITE (IOUT,68)
68 FORMAT(' Enter column: '$)
READ (IIN,*) KCOL
IF (KCOL.LT.1 .OR. KCOL.GT.N) GOTO 67
C
WRITE (IOUT,70)
70 FORMAT(' Enter new data value: '$)
READ (IIN,*) DATA(KROW,KCOL)
GOTO 61
76 IF (.NOT.QFILE) GOTO 78
WRITE(IWOUT,60) ((CNAME(J,K),K=1,5), J=1,N)
DO 77 I = 1, M
WRITE (IWOUT,62)
* (RNAME(I,K), K = 1, 5), (DATA(I,J), J = 1, N)
77 CONTINUE
78 WRITE (IOUT,79)
IF (QFILE) WRITE (IWOUT,79)
79 FORMAT (//' Enter the size of the plot: '$)
READ (IIN,*) NPLOT
IF (QFILE) WRITE (IWOUT,*) NPLOT
C
C TUKEY'S FORGETIT PLOTS
C
C
XNPLOT = NPLOT
NPLOTW = NPLOT
DO 80 I = 1, NPLMAX
DO 80 J = 1, NPLMAX
80 PLOT(I,J) = BLANK
C
C FITTED VALUES
C
XBAR = 0.0
DO 90 J = 1, N
90 CE(J)= 0.0
C
DO 200 I = 1, M
RE(I) = 0.0
DO 100 J = 1, N
RE(I) = RE(I) + DATA(I, J)
CE(J) = CE(J) + DATA(I, J)
XBAR = XBAR + DATA(I, J)
100 CONTINUE
200 CONTINUE
XBAR = XBAR / FLOAT(M * N)
FN = N
DO 300 I = 1, M
300 RE(I) = RE(I) / FN - XBAR
FM = M
DO 310 J = 1, N
310 CE(J) = CE(J) / FM - XBAR
WRITE (IOUT, 320) XBAR
IF (QFILE) WRITE (IWOUT,320) XBAR
320 FORMAT(/' GRAND MEAN... ',G12.5//' ROW EFFECTS... '/)
DO 328 I = 1, M
WRITE (IOUT,325) I, RE(I), (RNAME(I,K), K = 1, 5)
IF (QFILE) WRITE (IWOUT,325) I, RE(I), (RNAME(I,K), K = 1, 5)
325 FORMAT (17X,I2,': ',G12.5,3X,5A1)
328 CONTINUE
WRITE (IOUT, 330)
IF (QFILE) WRITE (IWOUT,330)
330 FORMAT(//' COLUMN EFFECTS... '/)
DO 338 J = 1, N
WRITE (IOUT,335) J, CE(J), (CNAME(J,K), K = 1, 5)
IF (QFILE) WRITE (IWOUT,335) J, CE(J), (CNAME(J,K), K = 1, 5)
335 FORMAT (20X,I2,': ',G12.5,3X,5A1)
338 CONTINUE
C
C SORT TABLE IN ORDER OF DECREASING ROW EFFECTS
C
DO 400 I = 1, M
400 INDEX(I) = I
MM1 = M - 1
DO 600 I = 1, MM1
IP1 = I + 1
DO 600 K = IP1, M
IF (RE(I) .GE. RE(K)) GOTO 600
IDUM = INDEX(I)
INDEX(I) = INDEX(K)
INDEX(K) = IDUM
DUMMY = RE(I)
RE(I) = RE(K)
RE(K) = DUMMY
DO 500 J = 1, N
DUMMY = DATA(I,J)
DATA(I,J) = DATA(K,J)
DATA(K,J) = DUMMY
500 CONTINUE
DO 550 KK = 1, 5
CDUMMY = RNAME(I,KK)
RNAME(I,KK) = RNAME(K,KK)
RNAME(K,KK) = CDUMMY
550 CONTINUE
600 CONTINUE
WRITE (IOUT, 720)
IF (QFILE) WRITE (IWOUT, 720)
720 FORMAT(//' ORDER OF DECREASING ROW EFFECTS: ')
DO 728 I = 1, M
WRITE (IOUT,725) INDEX(I), RE(I), (RNAME(I,K), K = 1, 5)
IF (QFILE) WRITE (IWOUT,725) INDEX(I), RE(I),
* (RNAME(I,K), K = 1, 5)
725 FORMAT (35X,I2,': ',G12.5,3X,5A1)
728 CONTINUE
C
C SORT TABLE IN ORDER OF INCREASING COLUMN EFFECTS
C
DO 800 J = 1, N
800 INDEX(J) = J
NM1 = N - 1
DO 1000 J = 1, NM1
JP1 = J + 1
DO 1000 K = JP1, N
IF (CE(J) .LE. CE(K)) GOTO 1000
IDUM = INDEX(J)
INDEX(J) = INDEX(K)
INDEX(K) = IDUM
DUMMY = CE(J)
CE(J) = CE(K)
CE(K) = DUMMY
DO 900 I = 1, M
DUMMY = DATA(I,J)
DATA(I,J) = DATA(I,K)
DATA(I,K) = DUMMY
900 CONTINUE
DO 950 KK = 1, 5
CDUMMY = CNAME(J,KK)
CNAME(J,KK) = CNAME(K,KK)
CNAME(K,KK) = CDUMMY
950 CONTINUE
1000 CONTINUE
WRITE (IOUT, 1130)
IF (QFILE) WRITE (IWOUT,1130)
1130 FORMAT(//' ORDER OF INCREASING COLUMN EFFECTS: ')
DO 1138 J = 1, N
WRITE (IOUT,1135) J, CE(J), (CNAME(J,K), K = 1, 5)
IF (QFILE) WRITE (IWOUT,1135) INDEX(J), CE(J),
* (CNAME(J,K), K = 1, 5)
1135 FORMAT (38X ,I2,': ',G12.5,3X,5A1)
1138 CONTINUE
C
C GET MAX AND MIN (AND FITTED VALUES)
C
XMAX = XBAR + RE(1) + CE(N)
XMIN = XBAR + RE(M) + CE(1)
DO 1200 I = 1, M
DO 1200 J = 1, N
FIT(I,J) = XBAR + RE(I) + CE(J)
IF (DATA(I,J) .LT. XMIN) XMIN = DATA(I,J)
IF (DATA(I,J) .GT. XMAX) XMAX = DATA(I,J)
1200 CONTINUE
C
C A SMALL TWIDDLE... MAKE XMAX AND XMIN THE CENTERS OF THEIR
C RESPECTIVE PLOTTING POSITIONS
C
RANGE = XMAX - XMIN
XMAX = XMAX + RANGE / (2.0 * (XNPLOT - 1.0))
XMIN = XMIN - RANGE / (2.0 * (XNPLOT - 1.0))
RANGE = XMAX - XMIN
C
C FIND ROW PLOTTING POSITIONS OF ROWS AND COLUMNS
C
DO 1300 I = 1, M
1300 IROW(I) = 1.49999 + (XNPLOT - 1.0) * (FIT(I,1) - XMIN) / RANGE
DO 1400 J = 1, N
1400 ICOL(J) = 1.49999 + (XNPLOT - 1.0) * (FIT(1,J) - XMIN) / RANGE
C
C CHANGE LOCATIONS TO OFFSETS FROM ANCHOR AT CELL (1,1)
C
IANCHR = IROW(1)
DO 1410 I = 1, M
1410 IROW(I) = IROW(I) - IANCHR
DO 1420 J = 1, N
1420 ICOL(J) = ICOL(J) - IANCHR
C
C FILL IN THE LINES, ROWS
C
LEN = 1 + ICOL(N)
DO 1600 I = 1, M
ISTART = IANCHR + IROW(I)
JSTART = 1 - IROW(I)
DO 1500 K = 1, LEN
I0 = ISTART + K - 1
J0 = JSTART + K - 1
PLOT(I0,J0) = SLASH
1500 CONTINUE
1600 CONTINUE
C
C FILL IN THE LINES, COLUMNS
C
LEN = 1 - IROW(M)
DO 1800 J = 1, N
ISTART = IANCHR + ICOL(J)
JSTART = 1 + ICOL(J)
DO 1700 K = 1, LEN
I0 = ISTART - K + 1
J0 = JSTART + K - 1
PLOT(I0,J0) = BSLASH
1700 CONTINUE
1800 CONTINUE
C
C FILL IN FITTED VALUES
C
DO 2000 I = 1, M
DO 2000 J = 1, N
I0 = IANCHR + IROW(I) + ICOL(J)
J0 = 1 - IROW(I) + ICOL(J)
PLOT(I0,J0) = OOO
2000 CONTINUE
C
C FILL IN VERTICAL LINES
C
DO 2200 I = 1, M
DO 2200 J = 1, N
DIFF = DATA(I,J) - FIT(I,J)
LEN = 0.49999 + XNPLOT * ABS(DIFF) / RANGE - 1.0
I0 = IANCHR + IROW(I) + ICOL(J)
J0 = 1 - IROW(I) + ICOL(J)
IF (LEN .LE. 0) GOTO 2200
DO 2100 K = 1, LEN
IF (DIFF .GT. 0.0) I0 = I0 + 1
IF (DIFF .LT. 0.0) I0 = I0 - 1
PLOT(I0,J0) = VBAR
2100 CONTINUE
2200 CONTINUE
C
C FILL IN OBSERVED VALUES
C
DO 2300 I = 1, M
DO 2300 J = 1, N
DIFF = DATA(I,J) - FIT(I,J)
LEN = 0.49999 + XNPLOT * ABS(DIFF) / RANGE
I0 = IANCHR + IROW(I) + ICOL(J)
IF (DIFF .GT. 0.0) I0 = I0 + LEN
IF (DIFF .LT. 0.0) I0 = I0 - LEN
J0 = 1 - IROW(I) + ICOL(J)
PLOT(I0,J0) = XXX
2300 CONTINUE
C
C INSERT LABELS
C
IF (.NOT.QLABEL) GOTO 2600
DO 2400 I = 1, M
I0 = IANCHR + IROW(I) + ICOL(N)
DO 2310 K = NPLOT, NPLOTW
J0 = NPLOTW - (K - NPLOT)
IF (PLOT(I0,J0).NE.BLANK) GO TO 2320
2310 CONTINUE
2320 J0 = J0 + 1
IF (J0 + 5.GT.NPLMAX) GOTO 2400
DO 2330 K = 1, 5
J0 = J0 + 1
PLOT(I0,J0) = RNAME(I,K)
2330 CONTINUE
IF (J0.GT.NPLOTW) NPLOTW = J0
2400 CONTINUE
DO 2500 J = 1, N
I0 = IANCHR + IROW(M) + ICOL(J)
DO 2410 K = NPLOT, NPLOTW
J0 = NPLOTW - (K - NPLOT)
IF (PLOT(I0,J0).NE.BLANK) GO TO 2420
2410 CONTINUE
2420 J0 = J0 + 1
IF (J0 + 5.GT.NPLMAX) GOTO 2500
DO 2430 K = 1, 5
J0 = J0 + 1
PLOT(I0,J0) = CNAME(J,K)
2430 CONTINUE
IF (J0.GT.NPLOTW) NPLOTW = J0
2500 CONTINUE
C
C PLOT PLOT
C
2600 WRITE (IOUT,2700)
IF (QFILE) WRITE (IWOUT,2700)
2700 FORMAT('1'//)
XLAB = XMAX + RANGE / (2.0 * XNPLOT)
I0 = NPLOT + 1
DO 3000 I = 1, NPLOT
I0 = I0 - 1
XLAB = XLAB - RANGE / XNPLOT
WRITE (IOUT,2800) XLAB, (PLOT(I0,J), J = 1, NPLOTW)
IF (QFILE) WRITE (IWOUT,2800) XLAB, (PLOT(I0,J), J = 1, NPLOTW)
2800 FORMAT(1X,G12.5, ' | ', 100A1)
3000 CONTINUE
WRITE (IOUT,3020)
3020 FORMAT (///' Do you wish to continue? (Y or N): '$)
READ (IIN,6) QUERY
IF (QUERY.NE.'Y' .AND. QUERY.NE.'y') STOP ' '
IF (QEXT) CLOSE (UNIT = IFIN)
IF (QFILE) WRITE (IWOUT, 3030)
3030 FORMAT(1H1)
GOTO 1
END