C***********************************************************
C   THIS SUBROUTINE COMPUTES THE CHI-SQUARE GOODNESS OF FIT TEST TO THE
C   MODEL BEING USED.  THE ONLY COMPLICATION HERE IS THAT OF POOLING
C   CELLS WITH SMALL EXPECTATIONS.  NOT ALL PATTERNS OF EXPECTATIONS CAN
C   BE ANTICIPATED.  THE ONLY POOLING THIS ROUTINE DOES IS IN BOTH
C   TAILS TO ASSURE THE CELL EXPECTATIONS THERE ARE GREATER THAN 2.0.
C   THE USER CAN ALWAYS DO POOLING BY HAND IF IT IS NEEDED.
C
C   NOTATION
C   ECELL     AN ARRAY THAT INITIALLY HOLDS THE EXPECTED CELL VALUES
C             EVALUATED AT THE MLE OF THE PARAMETERS. THESE ARE
C             MULTIPLIED BY XN TO GIVE THE EXPECTATIONS.
C   IDF       DEGREES OF FREEDOM
C   ML        AN INTEGER SUCH THAT CELLS 1,...,ML ARE POOLED
C             INTO ONE CELL AS NECESSARY TO INSURE AN EXPECTATION
C             GREATER THAN 2.0.
C   MU        AN INTEGER SUCH THAT CELLS MU,...,K,ARE POOLED INTO
C             ONE CELL TO INSURE AN EXPECTATION GREATER THAN 2.0.
C   CHVALU    A CHI-SQUARE TEST STATISTIC VALUE WITH IDF DEGREES
C             OF FREEDOM
C
C     SUBROUTINES CALLED: CHI
C***********************************************************
      SUBROUTINE TEST (F,ECELL,K,NPAR,XN,CUT,TRUNC,P)
C***********************************************************************
C     DECLARATIONS
C***********************************************************************
      REAL F(*), ECELL(*), CUT(*)
      LOGICAL TRUNC
C
C   DETERMINE MAXIMUM DEGREES OF FREEDOM
C
      IDF=K-1-NPAR
      DO 10 I=1,K
   10 ECELL(I)=XN*ECELL(I)
C
C   WRITE COLUMN HEADINGS, THEN COMPUTE AND PRINT DATA.
C
      CHVALU=0.0
      WRITE (6,140)
      WRITE (6,210)
      DO 20 I=1,K
      ZZ=ECELL(I)
      QQ=F(I)-ZZ
      RR=0.00001
      IF (RR.LT.ZZ) RR=ZZ
      QQ=QQ*QQ/RR
      CHVALU=CHVALU+QQ
      IF (I.EQ.1) WRITE (6,150) I,CUT(1),F(1),ECELL(1),QQ
      I1=I-1
      IF ((I.LT.K).AND.(I.GT.1)) WRITE (6,160) I,CUT(I1),CUT(I),F(I)
     1 ,ECELL(I),QQ
      IF ((I.EQ.K).AND.TRUNC) WRITE (6,160) I,CUT(I1),CUT(I),F(I),ECELL
     1 (I),QQ
      IF ((I.EQ.K).AND.(.NOT.TRUNC)) WRITE (6,230) I,CUT(I1),F(I),ECELL
     1 (I),QQ
      IF (ZZ.LT.0.0) WRITE (6,240)
   20 CONTINUE
      WRITE (6,210)
      IF (IDF.LT.1) WRITE (6,130)
      IF (IDF.LT.1) RETURN
      CALL CHI (IDF,CHVALU,P)
      WRITE (6,170) CHVALU,IDF
      P=1.0-P
      WRITE (6,180) P
      WRITE (6,220)
C
C   CHECK IF POOLING IS POSSIBLE OR NECESSARY
C
      IF (IDF.EQ.1) RETURN
      SUM=0.0
      DO 30 I=1,K
      SUM=SUM+ECELL(I)
      IF (SUM.GT.2.0) GO TO 40
   30 CONTINUE
      RETURN
   40 ML=I
      SUM=0.0
      DO 50 I=1,K
      J=K-I+1
      SUM=SUM+ECELL(J)
      IF (SUM.GT.2.0) GO TO 60
   50 CONTINUE
      RETURN
   60 MU=J
      IF ((ML.EQ.1).AND.(MU.EQ.K)) RETURN
C
C   CHECK DEGREES OF FREEDOM IF POOLING IS DONE.  IF IDF WOULD
C   BE GREATER THAN ZERO DO THE POOLING. OTHERWISE FORGET IT.
C
      IDF=IDF-ML+1-K+MU
      IF (IDF.GT.0) GO TO 70
      WRITE (6,190)
      RETURN
C
C   DO THE TEST WITH POOLING
C
   70 IF (ML.LT.2) GO TO 90
      MM=ML-1
      DO 80 I=1,MM
      F(ML)=F(ML)+F(I)
   80 ECELL(ML)=ECELL(ML)+ECELL(I)
   90 IF (MU.EQ.K) GO TO 110
      MM=MU+1
      DO 100 I=MM,K
      F(MU)=F(MU)+F(I)
  100 ECELL(MU)=ECELL(MU)+ECELL(I)
  110 WRITE (6,200)
      WRITE (6,140)
      WRITE (6,210)
      CHVALU=0.0
      DO 120 I=ML,MU
      QQ=F(I)-ECELL(I)
      QQ=QQ*QQ/ECELL(I)
      CHVALU=CHVALU+QQ
      IF (I.EQ.ML) WRITE (6,150) I,CUT(I),F(I),ECELL(I),QQ
      I1=I-1
      IF ((I.GT.ML).AND.(I.LT.MU)) WRITE (6,160) I,CUT(I1),CUT(I),F(I)
     1 ,ECELL(I),QQ
      IF ((I.EQ.MU).AND.TRUNC) WRITE (6,160) I,CUT(I1),CUT(K),F(I),ECELL
     1 (I),QQ
      IF ((I.EQ.MU).AND.(.NOT.TRUNC)) WRITE (6,230) I,CUT(I1),F(I),ECELL
     1 (I),QQ
  120 CONTINUE
      WRITE (6,210)
      CALL CHI (IDF,CHVALU,P)
      P=1.0-P
      WRITE (6,170) CHVALU,IDF
      WRITE (6,180) P
C
C     FORMAT STATEMENTS
C
      RETURN
  130 FORMAT ('0No Degrees of Freedom for the test. No test possible.')
  140 FORMAT (/2X,'Cell',11X,'Cut',11X,'Observed',3X,'Expected',2X,
     1 'Chi-square'/3X,'i',12X,'Points',10X,3('Values',5X))
  150 FORMAT (2X,I2,6X,'0.00',6X,G10.3,2X,F4.0,6X,F7.2,3X,G10.3)
  160 FORMAT (2X,I2,4X,G10.3,2X,G10.3,2X,F4.0,6X,F7.2,3X,G10.3)
  170 FORMAT (' Total Chi-square value =',G11.4,2X,
     1 'Degrees of Freedom = ',I3)
  180 FORMAT ('0Probability of a greater chi-square value =',F7.5)
  190 FORMAT ('0There is a need for some pooling to achieve a',
     1' reliable chi-square test'/
     2' However, the pooling algorithm built into this program would',
     3' result in no'/
     4' degrees of freedom left.  Therefore pooling is left',
     5' to the user.')
  200 FORMAT (///'0Goodness of Fit Testing with some Pooling')
  210 FORMAT (1X,61(1H-))
  220 FORMAT (///'0The program has limited capability for pooling.',
     1'  The user should'/
     2' judge the necessity for pooling and if necessary, do pooling',
     3' by hand.')
  230 FORMAT (2X,I2,4X,G10.3,2X,'Infinity',4X,F4.0,6X,F7.2,3X,G10.3)
  240 FORMAT (' The expected value for the above cell was negative',
     1' which'/
     2' occurs if the model is not constrained to be strictly',
     3' positive.'/
     4' If this algorithm is not able to find a suitable pooling',
     5' method,'/
     6' try pooling by hand.')
      END
