home *** CD-ROM | disk | FTP | other *** search
/ Between Heaven & Hell 2 / BetweenHeavenHell.cdr / 500 / 474 / ems.arc / PITMAN.FOR < prev    next >
Text File  |  1985-12-12  |  23KB  |  870 lines

  1. C        
  2. C                                 PC-PITMAN
  3. C                            Randomization Tests
  4. C                                Version 2.0
  5. C                             December 12, 1985
  6. C
  7. C
  8. C                              Gerard E. Dallal
  9. C
  10. C               USDA Human Nutrition Research Center on Aging
  11. C                            at Tufts University
  12. C                           711 Washington Street
  13. C                             Boston, MA  02111
  14. C
  15. C                                    and
  16. C
  17. C                    Tufts University School of Nutrition
  18. C                             132 Curtis Street
  19. C                             Medford, MA 02155
  20. C        
  21. C
  22. C
  23. C                                  NOTICE
  24. C
  25. C       Documentation and original code copyright 1985 by  Gerard  E.  
  26. C       Dallal.  Reproduction of material for non-commercial purposes 
  27. C       is   permitted,   without  charge,   provided  that  suitable 
  28. C       reference is made to PC-PITMAN and its author.  
  29. C
  30. C       Neither PC-PITMAN nor its documentation should be modified in 
  31. C       any way without permission from the author,  except for those 
  32. C       changes  that are  essential  to move  PC-PITMAN  to  another 
  33. C       computer.  
  34. C
  35. C       Please acknowledge  PC-PITMAN in any manuscript that uses its 
  36. C       calculations.  
  37. C
  38. C
  39.       DIMENSION H(36000), DATA(100), DATAI(100), DCOPY(100), 
  40.      *   DATAG(100)
  41.       CHARACTER*1 QUERY
  42.       DATA MAXTOT /36000/, MAXOBS /100/
  43.       DATA IIN /0/, IOUT /0/, IFIN/10/
  44. C
  45.       WRITE(IOUT,1)
  46.     1 FORMAT (//35X,'PC-PITMAN'/
  47.      *   30X,'Randomization Tests'/
  48.      *   34X,'Version 2.0'/31X,'December 12, 1985'//
  49.      *   32X,'Gerard E. Dallal'/
  50.      *   17X,'USDA Human Nutrition Research Center on Aging'/
  51.      *   30X,'at Tufts University'/29X,'711 Washington Street'/
  52.      *   31X,'Boston, MA  02111'///36X,'NOTICE'//9X,'Please '
  53.      *   'acknowledge PC-PITMAN in any manuscript that uses its',/
  54.      *   33X,'calculations.'/)
  55. C
  56.    10 CALL READ(IIN,IOUT,IFIN,DATA,DATAG,MAXOBS,NOBS,M,N,NGRP)
  57.       XNOBS = NOBS
  58. C
  59.   110 WRITE(IOUT,120)
  60.   120 FORMAT (' Multiply data by what integer power of 10?  '$)
  61.       READ(IIN,*,ERR=110) DEC
  62.       NDEC = DEC
  63.       IF(FLOAT(NDEC).NE.DEC) GOTO 110
  64. C
  65. C        1.2 ADDITION... ROUND RATHER THAN TRUNCATE
  66. C
  67.       DO 130 I = 1, NOBS
  68.   130 DCOPY(I) = AINT(DATA(I) * 10.0**NDEC + SIGN(0.5,DATA(I)))
  69. C
  70.       IF (NGRP.EQ.2) GOTO 200
  71. C
  72.       CALL PITMN1(DATAI,DCOPY,NOBS,H,MAXTOT,IOUT)
  73. C
  74. C        T-TEST
  75. C
  76.       IF (NOBS.LE.1) STOP 'Fewer than 2 observations.'
  77.       AVG = 0.0
  78.       DO 140 I = 1, NOBS
  79.   140 AVG = AVG + DATA(I)
  80.       AVG = AVG / XNOBS
  81.       SSQ = 0.0
  82.       DO 150 I = 1, NOBS
  83.   150 SSQ = SSQ + (DATA(I) - AVG)**2
  84.       IF (SSQ.GT.0.0) GOTO 180
  85. C
  86.       WRITE(IOUT,170)
  87.   170 FORMAT (' All data values equal.  No t-test.')
  88.       GOTO 300
  89. C
  90.   180 T = AVG / SQRT(SSQ / ((XNOBS - 1) * XNOBS))
  91.       NDF = NOBS - 1
  92.       PVALT = 2.0 * PROBST(SIGN(T,-1.0),NDF)
  93.       WRITE(IOUT,190) T, NDF, PVALT
  94.   190 FORMAT(' Student''s t-statistic = ',G11.4,' with',
  95.      *   I3,' d.f.  (P-value =',F7.4,')')
  96.       GOTO 300
  97. C
  98.   200 CALL PITMN2(DATAI,DCOPY,M,N,NOBS,H,MAXTOT,IOUT)
  99. C
  100. C        T-TEST
  101. C
  102.       IF (NOBS.LE.2 .OR. M.EQ.0 .OR. N.EQ.0) 
  103.      *   STOP 'Degenerate data set.'
  104.       AVG1 = 0.0
  105.       DO 230 I = 1, M
  106.   230 AVG1 = AVG1 + DATA(I)
  107.       AVG1 = AVG1 / FLOAT(M)
  108.       AVG2 = 0.0
  109.       DO 240 I = 1, N
  110.   240 AVG2 = AVG2 + DATA(M+I)
  111.       AVG2 = AVG2 / FLOAT(N)
  112.       SSQ = 0.0
  113.       DO 250 I = 1, M
  114.   250 SSQ = SSQ + (DATA(I) - AVG1)**2
  115.       DO 260 I = 1, N
  116.   260 SSQ = SSQ + (DATA(M+I) - AVG2)**2
  117.       IF (SSQ.GT.0.0) GOTO 280
  118. C
  119.       WRITE(IOUT,270)
  120.   270 FORMAT (' Within group variance zero.  No t-test.')
  121.       GOTO 300
  122. C
  123.   280 T = (AVG1 - AVG2) / SQRT((SSQ / FLOAT(NOBS-2)) *
  124.      *   (1.0 / FLOAT(M) + 1.0 / FLOAT(N)))
  125.       NDF = NOBS - 2
  126.       PVALT = 2.0 * PROBST(SIGN(T,-1.0),NDF)
  127.       WRITE(IOUT,190) T, NDF, PVALT
  128. C
  129.   300 WRITE (IOUT,310)
  130.   310 FORMAT (//' Do you wish to continue?  (Y or N):  '$)
  131.       READ (IIN,320) QUERY
  132.   320 FORMAT (A1)
  133.       IF (QUERY.NE.'Y' .AND. QUERY.NE.'y') STOP ' '
  134.       GOTO 10
  135.       END
  136. C
  137.       FUNCTION ALGAMA(S)
  138. C
  139. C        CACM ALGORITHM 291
  140. C        LOGARITHM OF GAMMA FUNCTION
  141. C        BY PIKE, M.C. AND HILL, I.D.
  142. C
  143. C        TRANSLATED INTO FORTRAN BY
  144. C                   Gerard E. Dallal
  145. C                   USDA-Human Nutrition Research Center on Aging
  146. C                              at Tufts University
  147. C                   711 Washington Street
  148. C                   Boston, MA  02111
  149. C
  150. C
  151.       X = S
  152.       ALGAMA = 0.0
  153.       IF (X .LE. 0.0) RETURN
  154.       F = 0.0
  155.       IF (X .GE. 7.0) GOTO 30
  156. C
  157.       F = 1.0
  158.       Z = X - 1.0
  159. C
  160.    10 Z = Z + 1.0
  161.       IF (Z .GE. 7.0) GOTO 20
  162.       X = Z
  163.       F = F * Z
  164.       GOTO 10
  165. C
  166.    20 X = X + 1
  167.       F = -ALOG(F)
  168. C
  169.    30 Z = 1.0 / X ** 2
  170.       ALGAMA = F + ( X - 0.5) * ALOG(X) - X + 0.918938533204673 +
  171.      1   (((-0.000595238095238 * Z + 0.000793650793651) * Z
  172.      2   - 0.002777777777778) * Z + 0.083333333333333) / X
  173.       RETURN
  174.       END
  175. C
  176.       SUBROUTINE BIGGIE(IOBS, IMAX, ICAUSE, IOUT)
  177. C
  178.       GOTO (100,200), ICAUSE
  179. C
  180.   100 WRITE(IOUT,110) IOBS, IMAX
  181.   110 FORMAT(/' ** Too many observations.'/
  182.      *        '    Your data set contains',I4/
  183.      *        '    The program is configured to handle,'I4/)
  184.       RETURN
  185. C
  186.   200 WRITE(IOUT,210) IOBS, IMAX
  187.   210 FORMAT(/
  188.      * ' ** Your data set requires a storage array of',I8,' elements.'/
  189.      * '    At present, the array contains',I7,' elements.'/)
  190.       RETURN
  191.       END
  192. C
  193.       SUBROUTINE PITMN1(DATAI ,DCOPY, NOBSX, H, MAXTOT, 
  194.      *   IOUT)
  195.       DOUBLE PRECISION PLOW, PHIGH
  196.       DIMENSION DATAI(NOBSX), H(MAXTOT), DCOPY(NOBSX)
  197. C
  198.       NOBS = 0
  199.       DO 20 I = 1, NOBSX
  200.       IF (DCOPY(I).EQ.0) GOTO 20
  201.       NOBS = NOBS + 1
  202.       DCOPY(NOBS) = DCOPY(I)
  203.    20 CONTINUE
  204.       IF (NOBS.EQ.0) STOP 'All observations are 0.'
  205. C
  206. C         ITEST = 1 -- Sign test
  207. C                 2 -- Wilcoxon signed-rank test
  208. C                 3 -- Pitman randomization test
  209. C
  210.       DO 1300 ITEST = 1, 3
  211. C
  212.       GOTO (60,50,30), ITEST
  213. C
  214.    30 DO 40 I = 1, NOBS
  215.    40 DATAI(I) = DCOPY(I)
  216.       GOTO 80
  217. C
  218.    50 CALL RANK(DATAI ,DCOPY, NOBS)
  219.       GOTO 80
  220. C
  221. C        SIGN TEST
  222. C
  223.    60 NSTAT = 0
  224.       DO 65 I = 1, NOBS
  225.       IF(DCOPY(I).GT.0) NSTAT = NSTAT + 1
  226.    65 CONTINUE
  227.       NSTAT = MIN0(NSTAT,NOBS - NSTAT)
  228. C
  229.       PVAL = 0.0
  230.       XNOBS = NOBS
  231.       XNOBS1 = NOBS + 1
  232.       DO 70 I = 0, NSTAT
  233.       TERM = ALGAMA(XNOBS1) - ALGAMA(FLOAT(I+1)) - 
  234.      *   ALGAMA(XNOBS1-FLOAT(I)) - XNOBS * ALOG(2.0)
  235.       IF (TERM.GT.-78.0) PVAL = PVAL + EXP(TERM)
  236.    70 CONTINUE
  237.       PVAL = AMIN1(1.0, 2.0 * PVAL)
  238.       GOTO 1205
  239. C
  240.    80 ISUM = 1
  241.       DO 100 I = 1, NOBS
  242.   100 ISUM = ISUM + IFIX(ABS(DATAI(I)))
  243.       IF (ISUM.LE.MAXTOT) GOTO 110
  244.       CALL BIGGIE(ISUM,MAXTOT,2,IOUT)
  245.       GOTO 1300
  246. C
  247.   110 NPDF = 1
  248.       H(1) = 1
  249. C
  250.       DO 200 K = 1, NOBS
  251. C
  252. C
  253.       INC = ABS(DATAI(K))
  254.       DO 150 I = 1, INC
  255.   150 H(NPDF+I) = 0
  256.       DO 160 I = NPDF, 1, -1
  257.   160 H(INC+I) = H(INC+I) + H(I)
  258.       NPDF = NPDF + INC
  259. C
  260.   200 CONTINUE
  261. C
  262. C        CALCULATE P-VALUE (TWO-TAILED)
  263. C
  264.       ISTAT = 0
  265.       DO 1100 I = 1, NOBS
  266.  1100 ISTAT = ISTAT + MAX1(0.0,DATAI(I))
  267.  
  268.       PLOW = 0.0
  269.       DO 1200 I = 1, ISTAT
  270.  1200 PLOW = PLOW + DBLE(H(I))
  271.       PHIGH = 2.0D0**NOBS - PLOW
  272.       PLOW = PLOW + DBLE(H(ISTAT + 1))
  273.       PVAL = 2.0D0 * DMIN1(PLOW,PHIGH) / 2.0D0**NOBS
  274.       PVAL = AMIN1(PVAL,1.0)
  275. C
  276.  1205 IF (ITEST.EQ.1) WRITE(IOUT,1210) PVAL
  277.  1210 FORMAT(/' Sign test:  P-value =',F7.4)
  278.       IF (ITEST.EQ.2) WRITE(IOUT,1220) PVAL
  279.  1220 FORMAT(' Wilcoxon signed-rank test:  P-value =',F7.4)
  280.       IF (ITEST.EQ.3) WRITE(IOUT,1230) PVAL
  281.  1230 FORMAT(' Pitman randomization test:  P-value =',F7.4)
  282. C
  283.  1300 CONTINUE
  284.       RETURN
  285.       END
  286.  
  287.       SUBROUTINE PITMN2(DATAI, DCOPY, M, N, NOBS, H, MAXTOT,
  288.      *   IOUT)
  289.       DOUBLE PRECISION PLOW, PHIGH
  290.       DIMENSION DATAI(NOBS), DCOPY(NOBS), H(MAXTOT)
  291. C
  292. C        ADJUST DATA
  293. C
  294.       MIN = DCOPY(1)
  295.       DO 10 I = 1, NOBS
  296.    10 IF (DCOPY(I).LT.MIN) MIN = DCOPY(I)
  297.       DO 20 I = 1, NOBS
  298.    20 DCOPY(I) = DCOPY(I) - MIN
  299. C
  300. C        ITEST = 1 -- Wilcoxon-Mann-Whitney test
  301. C                2 -- Pitman randomization test
  302. C
  303.       DO 2500 ITEST = 1, 2
  304. C
  305.       GOTO (80,110), ITEST
  306. C
  307.    80 CALL RANK(DATAI, DCOPY, NOBS)
  308. C
  309. C        SUBTRACT MINIMUM RANK
  310. C        (MIN RANK CAN BE ANYTHING DEPENDING ON TIES)
  311. C
  312.       MIN = DATAI(1)
  313.       DO 90 I = 1, NOBS
  314.    90 IF (MIN.GT.IFIX(DATAI(I))) MIN = DATAI(I)
  315.       DO 100 I = 1, NOBS
  316.   100 DATAI(I) = DATAI(I) - FLOAT(MIN)
  317.       GOTO 130
  318. C
  319.   110 DO 120 I = 1, NOBS
  320.   120 DATAI(I) = DCOPY(I)
  321.  
  322. C
  323. C        CALCULATE TEST STATISTIC BEFORE DATA ARE SORTED
  324. C
  325.   130 ISTAT = 0
  326.       DO 140 I = 1, M
  327.   140 ISTAT = ISTAT + IFIX(DATAI(I))
  328. C
  329. C        PP3 -- LINE 1
  330. C
  331.       MOBS = MIN0(M,N)
  332. C
  333. C        PP3 -- LINES 2,3
  334. C      
  335.       CALL SHELL(DATAI, NOBS)
  336. C
  337. C           IQ -- 1 + SUM OF M-LARGEST
  338. C           IU -- SUM OF M-SMALLEST
  339. C
  340.       IQ = 1
  341.       IU = 0
  342.       DO 190 K = 1, M
  343.       IQ = IQ + IFIX(DATAI(NOBS+1-K))
  344.       IU = IU + IFIX(DATAI(K))
  345.   190 CONTINUE
  346.       ISUM = IQ + IFIX(DATAI(NOBS))
  347.       ISUM = ISUM * (MOBS + 3)
  348.       IF (ISUM.LE.MAXTOT) GOTO 200
  349.       CALL BIGGIE(ISUM,MAXTOT,2,IOUT)
  350.       GOTO 2500
  351. C
  352. C           NPDFR(C) -- NUMBER OF ROWS(COLUMNS) IN H, THE PDF
  353. C
  354.   200 NPDFR = 1
  355.       NPDFC = 1
  356.       H(1) = 1
  357. C
  358. C        PP3 -- LINE 4
  359. C
  360.       DO 1000 K = 1, NOBS
  361. C
  362. C        PP3 -- LINE 5
  363. C      
  364.       INCR = DATAI(K)
  365.       INCC = 1
  366.       NPDFR2 = NPDFR + INCR
  367.       NPDFC2 = NPDFC + INCC
  368. C
  369. C        ADD ROWS
  370. C
  371.       INCR = NPDFR2 - NPDFR
  372.       IF (INCR.EQ.0) GOTO 250
  373.       DO 240 J = NPDFC, 1, -1
  374.       INDEX0 = (J-1) * NPDFR2
  375.       DO 220 I = NPDFR, 1, -1
  376.   220 H(INDEX0+I) = H((J-1)*NPDFR+I)
  377.       DO 230 I = INCR, 1, -1
  378.   230 H(INDEX0 + NPDFR + I) = 0
  379.   240 CONTINUE
  380. C
  381. C        ADD COLUMN
  382. C
  383.   250 INDEX0 = NPDFR2 * NPDFC
  384.       DO 260 I = 1, NPDFR2
  385.   260 H(INDEX0 + I) = 0
  386. C
  387.       DO 280 J = NPDFC, 1, -1
  388.       INDEX1 = (J - 1) * NPDFR2
  389.       DO 280 I = NPDFR, 1, -1
  390.       INDEX0 = (J + INCC - 1) * NPDFR2 + I + INCR
  391.       H(INDEX0) = H(INDEX0) + H(INDEX1 + I)
  392.   280 CONTINUE
  393. C
  394.       NPDFR = NPDFR2
  395.       NPDFC = NPDFC2
  396.  
  397. C
  398. C        PP3 -- LINE 6
  399. C
  400.       NPDFR2 = MIN0(NPDFR,IQ)
  401.       NPDFC2 = MIN0(NPDFC,MOBS+2)
  402. C
  403.       IF (NPDFR.EQ.NPDFR2) GOTO 300
  404.       DO 290 J = 1, NPDFC2
  405.       INDEX0 = (J - 1) * NPDFR2
  406.       INDEX1 = (J - 1) * NPDFR
  407.       DO 290 I = 1, NPDFR2
  408.   290 H(INDEX0 + I) = H(INDEX1 + I)
  409.       NPDFR = NPDFR2
  410.   300 NPDFC = NPDFC2
  411. C
  412. C        PP3 -- LINE 7
  413. C
  414.       IF (K .LE. MOBS) GOTO 1000
  415. C
  416. C        PP3 -- LINE 8
  417. C
  418.       NPDFC = NPDFC - 1
  419.  
  420. C
  421. C        PP3 -- LINE 9
  422. C
  423.       IF (K .LE. NOBS-MOBS) GOTO 1000
  424. C
  425. C        PP3 -- LINE 10
  426. C
  427.       NPDFC2 = NPDFC - 1
  428.       INCR = DATAI(K+MOBS-NOBS)
  429.       NPDFR2 = NPDFR - INCR
  430.       DO 310 J = 1, NPDFC2
  431.       INDEX0 = (J - 1) * NPDFR2
  432.       INDEX1 = J * NPDFR + INCR
  433.       DO 310 I = 1, NPDFR2
  434.   310 H(INDEX0 + I) = H(INDEX1 + I)
  435.       NPDFR = NPDFR2
  436.       NPDFC = NPDFC2
  437.  
  438. C
  439. C        PP3 -- LINE 11
  440. C
  441.  1000 CONTINUE
  442. C
  443. C        PP3 -- LINE 12
  444. C
  445.       IF (NPDFC .NE. 1) STOP 12
  446. C
  447.       DO 1100 I = 1, IU
  448.  1100 H(NPDFR + I) = 0
  449.       DO 1110 I = NPDFR, 1, -1
  450.  1110 H(I + IU) = H(I)
  451.       NPDFR = IU + NPDFR
  452. C
  453.       DO 1120 I = 1, IU
  454.  1120 H(I) = 0
  455. C
  456.       INCR = IQ - NPDFR
  457.       IF (INCR .LE. 0) GOTO 1160
  458.       DO 1150 I = 1, INCR
  459.  1150 H(NPDFR + I) = 0
  460. C
  461.  1160 NPDFR = IQ
  462. C
  463. C        PP3 -- LINE 13
  464. C
  465.       IF (M .LE. N) GOTO 2000
  466. C
  467. C        PP3 -- LINE 14
  468. C
  469. C          DROP
  470. C
  471.       NPDFR = NPDFR - IU
  472.       DO 1200 I = 1, NPDFR
  473.  1200 H(I) = H(I + IU)
  474. C
  475. C          ROTATE
  476. C
  477.       NPDFR2 = NPDFR / 2
  478.       DO 1210 I = 1, NPDFR2
  479.       DUM = H(I)
  480.       H(I) = H(NPDFR+1-I)
  481.  1210 H(NPDFR+1-I) = DUM
  482. C
  483. C          TAKE
  484. C
  485.       NPDFR2 = IQ + IFIX(DATAI(MOBS+1))
  486.       INCR = NPDFR2 - NPDFR
  487.       IF (INCR) 1220, 2000, 1250
  488. C
  489.  1220 INCR = -INCR
  490.       NPDFR = NPDFR2
  491.       DO 1230 I = 1, NPDFR
  492.  1230 H(I) = H(I+INCR)
  493.       GOTO 2000
  494. C
  495.  1250 DO 1260 I = NPDFR, 1, -1
  496.  1260 H(INCR+I) = H(I)
  497.       DO 1270 I = 1, INCR
  498.  1270 H(I) = 0
  499.       NPDFR = NPDFR2
  500. C
  501. C        PP3 -- ALL DONE.
  502. C
  503.  2000 ITOT = 0
  504.       DO 2100 I = 1, NOBS
  505.  2100 ITOT = ITOT + IFIX(DATAI(I))
  506. C
  507. C        TACK ZEROS ONTO END OF PDF
  508. C
  509.       INCR = ITOT - IQ + 1
  510.       IF (INCR.EQ.0) GOTO 2200
  511. C
  512.       DO 2120 I = 1, INCR
  513.  2120 H(NPDFR+I) = 0
  514.       NPDFR = NPDFR + INCR
  515. C
  516. C        ADJUST LENGTH
  517. C
  518.  2200 NPDFR2 = ITOT+1
  519.       INCR = NPDFR2 - NPDFR
  520.       IF (INCR) 2210, 2300, 2250
  521. C
  522.  2210 INCR = -INCR
  523.       NPDFR = NPDFR2
  524.       DO 2220 I = 1, NPDFR
  525.  2220 H(I) = H(I+INCR)
  526.       GOTO 2300
  527. C
  528.  2250 DO 2260 I = NPDFR, 1, -1
  529.  2260 H(INCR+I) = H(I)
  530.       DO 2270 I = 1, INCR
  531.  2270 H(I) = 0
  532.       NPDFR = NPDFR2
  533. C
  534.  2300 ISTAT1 = ISTAT+1
  535.       PLOW = 0.0
  536.       DO 2310 I = 1, ISTAT1
  537.  2310 PLOW = PLOW + DBLE(H(I))
  538. C
  539.       PHIGH = 0.0
  540.       DO 2320 I = ISTAT1, NPDFR
  541.  2320 PHIGH = PHIGH + DBLE(H(I))
  542. C
  543.       PVAL = 2.0D0 * DMIN1(PLOW, PHIGH)
  544.       PVAL = AMIN1(1.0, PVAL / EXP(ALGAMA(FLOAT(NOBS + 1)) - 
  545.      *   ALGAMA(FLOAT(M + 1)) - ALGAMA(FLOAT(N + 1))))
  546. C
  547.       IF (ITEST.EQ.1) WRITE(IOUT,2420) PVAL
  548.  2420 FORMAT(/' Wilcoxon-Mann-Whitney test:  P-value =',F7.4)
  549.       IF (ITEST.EQ.2) WRITE(IOUT,2430) PVAL
  550.  2430 FORMAT(' Pitman randomization test:  P-value =',F7.4)
  551.  2500 CONTINUE
  552.       RETURN   
  553.       END
  554. C
  555.       FUNCTION PROBST(T,IDF)
  556. C
  557. C         ALGORITHM AS 3  J.R.S.S. C, (1968) VOL. 17, NO. 2.
  558. C
  559. C         STUDENT T PROBABILITY (LOWER TAIL)
  560. C         USES METHOD DUE TO D.B. OWEN (BIOMETRIKA VOL. 52 1965 DEC. P438)
  561. C
  562.       DATA G1/0.3183098862/
  563. C
  564.       F=IDF
  565.       A=T/SQRT(F)
  566.       B=F/(F+T**2)
  567.       IM2=IDF-2
  568.       IOE=IDF-2*(IDF/2)
  569.       S=1.0
  570.       C=1.0
  571.       KS=2+IOE
  572.       FK=KS
  573.       IF(IM2-2) 6,7,7
  574.     7 DO 8 K=KS,IM2,2
  575.       C=C*B*(FK-1.0)/FK
  576.       S=S+C
  577.     8 FK=FK+2.
  578.     6 IF(IOE) 1,1,2
  579.     1 PROBST=.5+.5*A*SQRT(B)*S
  580.       GO TO 3
  581.     2 IF (IDF-1) 4,4,5
  582.     4 S=0.0
  583.     5 PROBST=.5+(A*B*S+ATAN(A))*G1
  584.     3 RETURN
  585.       END
  586.  
  587.       SUBROUTINE RANK(DATAI, DCOPY, N)
  588. C
  589. C        DCOPY:  DATA
  590. C        DATA:  INPUT --  SCRATCH
  591. C                 OUTPUT --  RANKS
  592.  
  593.       DIMENSION DATAI(N), DCOPY(N)
  594. C
  595.       DO 200 I = 1,N
  596.       NTIE = 0
  597.       NRANK = 0
  598.       IDUM = ABS(DCOPY(I))
  599.  
  600.       DO 100 K = 1,N
  601.       KDUM = ABS(DCOPY(K))
  602.       IF (IDUM.EQ.KDUM) NTIE = NTIE + 1
  603.       IF (IDUM.GT.KDUM) NRANK = NRANK + 1
  604.   100 CONTINUE
  605.  
  606.       DATAI(I) = 2 * NRANK + 2 + (NTIE - 1)
  607.   200 CONTINUE
  608.  
  609.       DO 210 I = 1, N
  610.   210 DATAI(I) = SIGN(DATAI(I),DCOPY(I))
  611. C
  612. C        IF ALL RANKS ARE EVEN DIVIDE BY TWO
  613. C
  614.       DO 220 I = 1, N
  615.       IF (MOD(IFIX(DATAI(I)),2).EQ.1) RETURN
  616.   220 CONTINUE
  617.       DO 230 I = 1,N
  618.   230 DATAI(I) = DATAI(I) / 2.0
  619.  
  620.       RETURN
  621.       END
  622.  
  623.       SUBROUTINE READ(IIN, IOUT, IFIN, DATA, DATAG, MAXOBS, NOBS, 
  624.      *   M, N, NGRP)
  625. C
  626.       CHARACTER FNAME*50, QUERY*1
  627.       DIMENSION DATA(MAXOBS), DATAG(MAXOBS)
  628. C
  629.   100 WRITE(IOUT,110)
  630.   110 FORMAT(/' Does this problem involve paired data (P)'/
  631.      *        '            or two independent samples (I)?  ',$)
  632.       READ (IIN,220) QUERY
  633.       NGRP = 0
  634.       IF (QUERY.EQ.'P' .OR. QUERY.EQ.'p') NGRP = 1
  635.       IF (QUERY.EQ.'I' .OR. QUERY.EQ.'i') NGRP = 2
  636.       IF (NGRP.EQ.0) GOTO 100
  637. C
  638.   200 WRITE (IOUT,210)
  639.   210 FORMAT(/' Will data be entered through the keyboard (K)'/
  640.      *        '             or read from an external file (F)?  '$)
  641.       READ (IIN,220) QUERY
  642.   220 FORMAT(A1)
  643.       IF (QUERY.EQ.'K' .OR. QUERY.EQ.'k') GOTO 400
  644.       IF (QUERY.NE.'F' .AND. QUERY.NE.'f') GOTO 200
  645. C
  646.   230 WRITE (IOUT,240)
  647.   240 FORMAT (/' Enter filename:  '$)
  648.       READ (IIN,'(A)') FNAME
  649.       OPEN (IFIN, FILE = FNAME, STATUS = 'OLD', IOSTAT = IOCHK)
  650.       IF (IOCHK.NE.0) GOTO 230
  651. C
  652.   245 WRITE (IOUT,250)
  653.   250 FORMAT (' Enter the number of variables in the file:  '$)
  654.       READ (IIN,*,ERR=245) NVAR
  655.       KVARA = 1
  656.       KVARG = 0
  657.       IF (NVAR.EQ.1) GOTO 280
  658. C
  659. C        1.2 ADDITION...  DIFFERENCES ORIGINAL VARIABLES
  660. C
  661.       IF (NGRP.EQ.2) GOTO 260
  662.   251 WRITE(IOUT,252)
  663.   252 FORMAT (' Does the files contain paired values (P)',
  664.      *   ' or differences (D)?:  '$)
  665.       READ (IIN,220) QUERY
  666.       IF (QUERY.EQ.'D' .OR. QUERY.EQ.'d') GOTO 260
  667.       IF (QUERY.NE.'P' .AND. QUERY.NE.'p') GOTO 251
  668.   253 WRITE(IOUT,254)
  669.   254 FORMAT(' Which variables are paired?:  '$)
  670.       READ(IIN,*,ERR=253) KVARA,KVARG
  671.       IF(KVARA.LT.1 .OR. KVARA.GT.NVAR .OR. KVARA.EQ.KVARG .OR.
  672.      *   KVARG.LT.1 .OR. KVARG.GT.NVAR) GOTO 253
  673. C
  674.       KVAR1 = MIN0(KVARA,KVARG)
  675.       KVAR2 = MAX0(KVARA,KVARG) 
  676.       NOBS = 0
  677.   255 READ (IFIN,*,END=256) (DUMMY,I=1,KVAR1-1),DATAX,
  678.      *   (DUMMY,I=KVAR1+1,KVAR2-1),DATAY,(DUMMY,I=KVAR2+1,NVAR)
  679.       NOBS = NOBS + 1
  680.       IF (NOBS.GT.MAXOBS) CALL BIGGIE(NOBS, MAXOBS, 1, IOUT)
  681. C
  682.       DATA(NOBS) = DATAX - DATAY
  683.       GOTO 255
  684. C
  685.   256 CLOSE (IFIN, STATUS = 'KEEP')
  686.       RETURN
  687. C
  688.   260 WRITE (IOUT,270)
  689.   270 FORMAT (' Enter the number of the variable to be analyzed:  '$)
  690.       READ (IIN,*,ERR=260) KVARA
  691.       IF (KVARA.GT.NVAR) GOTO 260
  692.       IF (NGRP.EQ.1) GOTO 280
  693.   271 WRITE (IOUT,272)
  694.   272 FORMAT (' Enter the number of the grouping variable ',
  695.      *   '(0, if none):  '$)
  696.       READ (IIN,*,ERR=271) KVARG
  697.       IF (KVARG.GT.NVAR) GOTO 271
  698.       IF (KVARG.EQ.0) GOTO 280
  699. C
  700. C        GROUPING VARIABLE PRESENT
  701. C
  702.       KVAR1 = MIN0(KVARA,KVARG)
  703.       KVAR2 = MAX0(KVARA,KVARG) 
  704.       NOBS = 0
  705.   273 READ (IFIN,*,END=274) (DUMMY,I=1,KVAR1-1),DATAX,
  706.      *   (DUMMY,I=KVAR1+1,KVAR2-1),DATAY,(DUMMY,I=KVAR2+1,NVAR)
  707.       NOBS = NOBS + 1
  708.       IF (NOBS.GT.MAXOBS) CALL BIGGIE(NOBS, MAXOBS, 1, IOUT)
  709. C
  710. C        BLOCK IF BELOW
  711. C
  712.       IF (KVARA.LT.KVARG) THEN
  713.          DATA(NOBS) = DATAX
  714.          DATAG(NOBS) = DATAY
  715.       ELSE
  716.          DATA(NOBS) = DATAY
  717.          DATAG(NOBS) = DATAX
  718.       ENDIF
  719. C
  720.       GOTO 273
  721. C
  722.   274 CLOSE (IFIN, STATUS = 'KEEP')
  723.       CALL SHELL2(DATAG,DATA,NOBS)
  724.       IF(DATAG(NOBS).EQ.DATAG(1)) STOP ' *** Only one group...'
  725. C
  726.       M = 1
  727.       DO 275 I = 2, NOBS-1
  728.       IF (DATAG(I).EQ.DATAG(1)) M = M + 1
  729.       IF (DATAG(I).NE.DATAG(1) .AND. DATAG(I).NE.DATAG(NOBS))
  730.      *   STOP ' *** More than two groups...'
  731.   275 CONTINUE
  732.       N = NOBS - M
  733.       RETURN
  734. C
  735.   280 NOBS = 0
  736.       IF (NGRP.EQ.1) GOTO 300
  737.   285 WRITE (IOUT,290)
  738.   290 FORMAT (' Enter number of observations in each group:  '$) 
  739.       READ(IIN,*,ERR=285) M, N
  740.       NOBSX = M + N
  741. C
  742. C        SORRY ABOUT STATEMENT 300.  IT USES FORTRAN-77
  743. C        CONVENTIONS THAT IF 1>KVAR-1 OR KVAR+1>NVAR THEN
  744. C        THAT LOOP WILL NOT BE EXECUTED.
  745. C
  746. C        THIS CODE IS NEEDED TO INSURE THE THE APPROPRIATE 
  747. C        NUMBER OF RECORDS ARE SKIPPED IF THERE ARE MORE THAN 
  748. C        ONE RECORD PER CASE.
  749. C
  750.   300 READ (IFIN,*,END=350) (DUMMY,I=1,KVARA-1),DATAX,
  751.      *   (DUMMY,I=KVARA+1,NVAR)
  752.       NOBS = NOBS + 1
  753.       IF (NOBS.GT.MAXOBS) CALL BIGGIE(NOBS, MAXOBS, 1, IOUT)
  754.       DATA(NOBS) = DATAX
  755.       GOTO 300
  756. C
  757.   350 CLOSE (IFIN, STATUS = 'KEEP')
  758.       IF (NGRP.EQ.1 .OR. NOBS.EQ.NOBSX) RETURN
  759.       WRITE(IOUT,360) NOBSX, NOBS
  760.   360 FORMAT(/' ** Sum of group sizes is',I4,'.  File contains',I4,
  761.      *   ' observations.')
  762.       STOP ' '
  763. C
  764.   400 IF (NGRP.EQ.2) GOTO 630
  765. C
  766. C        1.2 ADDITION... COMPUTE DIFFERENCES
  767. C
  768.   405 WRITE(IOUT,408)
  769.   408 FORMAT(/' Will you be entering pairs (P) or ',
  770.      *   'differences (D)?:  '$)
  771.       READ (IIN,220) QUERY
  772.       IF(QUERY.EQ.'D' .OR. QUERY.EQ.'d') GOTO 500
  773.       IF(QUERY.NE.'P' .AND. QUERY.NE.'p') GOTO 405
  774. C
  775.   410 WRITE(IOUT,420)
  776.   420 FORMAT(/' Enter the number of pairs:  '$)
  777.       READ (IIN,*,ERR=410) NOBS
  778.       IF (NOBS.GT.MAXOBS) CALL BIGGIE(NOBS, MAXOBS, 1, IOUT)
  779.       WRITE(IOUT,425)
  780.   425 FORMAT(/' Enter data, one pair at a time:')
  781. C
  782.       DO 460 I = 1, NOBS
  783.       GOTO 450
  784.   430 WRITE (IOUT,440)
  785.   440 FORMAT (' Error... re-enter pair:')
  786.   450 READ (IIN,*,ERR=430) DATAX, DATAY
  787.       DATA(I) = DATAX - DATAY
  788.   460 CONTINUE
  789.       RETURN
  790. C  
  791.   500 WRITE (IOUT,510)
  792.   510 FORMAT (/' Enter the number of observations:  '$)
  793.       READ (IIN,*,ERR=500) NOBS
  794.       IF (NOBS.GT.MAXOBS) CALL BIGGIE(NOBS, MAXOBS, 1, IOUT)
  795.       GOTO 650
  796. C
  797.   630 WRITE (IOUT,290)
  798.       READ(IIN,*,ERR=630) M, N
  799.       NOBS = M + N
  800.  
  801.   650 WRITE (IOUT,660)
  802.   660 FORMAT(/' Enter data:  '$)
  803.       READ (IIN,*,ERR=650) (DATA(I),I=1,NOBS)
  804.       RETURN
  805.       END
  806.  
  807.       SUBROUTINE SHELL(X, N)
  808. C        SHELL SORT WITH DECREMENTS SUGGESTED BY KNUTH
  809.       INTEGER H0(12), HP1, H, S, T
  810.       DIMENSION X(N)
  811.       DATA H0(1), H0(2), H0(3), H0(4), H0(5), H0(6)/
  812.      *         1,     4,    13,    40,   121,   364/
  813.       DATA H0(7), H0(8), H0(9), H0(10), H0(11), H0(12)/
  814.      *      1093,  3280,  9841,  29524,  88573, 265720/
  815.       NN = N
  816.       DO 1 T = 1, 10
  817.       IF (H0(T+2).GE.NN) GOTO 2
  818.     1 CONTINUE
  819.       T = 11
  820.     2 DO 6 S = 1, T
  821.       H = H0(T+1-S)
  822.       HP1 = H + 1
  823.       DO 5 J = HP1, NN
  824.       I = J - H
  825.       XM = X(J)
  826.     3 IF (XM.GE.X(I)) GOTO 4
  827.       X(I+H) = X(I)
  828.       I = I - H
  829.       IF (I.GT.0) GOTO 3
  830.     4 X(I+H) = XM
  831.     5 CONTINUE
  832.     6 CONTINUE
  833.       RETURN
  834.       END
  835. C
  836.       SUBROUTINE SHELL2(X, Y, N)
  837. C        SHELL SORT WITH DECREMENTS SUGGESTED BY KNUTH
  838. C        Y GOES ALONG FOR THE RIDE
  839.       INTEGER H0(12), HP1, H, S, T
  840.       DIMENSION X(N), Y(N)
  841.       DATA H0(1), H0(2), H0(3), H0(4), H0(5), H0(6)/
  842.      *         1,     4,    13,    40,   121,   364/
  843.       DATA H0(7), H0(8), H0(9), H0(10), H0(11), H0(12)/
  844.      *      1093,  3280,  9841,  29524,  88573, 265720/
  845.       NN = N
  846.       DO 1 T = 1, 10
  847.       IF (H0(T+2).GE.NN) GOTO 2
  848.     1 CONTINUE
  849.       T = 11
  850.     2 DO 6 S = 1, T
  851.       H = H0(T+1-S)
  852.       HP1 = H + 1
  853.       DO 5 J = HP1, NN
  854.       I = J - H
  855.       XM = X(J)
  856.       YM = Y(J)
  857.     3 IF (XM.GE.X(I)) GOTO 4
  858.       X(I+H) = X(I)
  859.       Y(I+H) = Y(I)
  860.       I = I - H
  861.       IF (I.GT.0) GOTO 3
  862.     4 X(I+H) = XM
  863.       Y(I+H) = YM
  864.     5 CONTINUE
  865.     6 CONTINUE
  866.  
  867.       RETURN
  868.       END
  869.