TIME Subroutine

public subroutine TIME(X, N)

NAME

time(3f) - [M_datapac:ANALYSIS] perform a time series analysis
(autocorrelation plot, a test for white noise, a "pilot" spectrum,
and 4 other estimated spectra based on differing bandwidth)

SYNOPSIS

   SUBROUTINE TIME(X,N)

DESCRIPTION

time(3f) performs a time series analysis on the data in the input
vector x.

the analysis consists of the following--

  1. a plot of autocorrelation versus lag number;
  2. a test for white noise (assuming normality);
  3. a 'pilot' spectrum; and
  4. 4 other estimated spectra--each based
     on a differing bandwidth.

in order that the results of the time series analysis be valid and
properly interpreted, the input data in x should be equi-spaced in time
(or whatever variable corresponds to time).

the horizontal axis of the spectra produced by time(3f) is frequency.

this frequency is measured in units of cycles per 'data point' or,
more precisely, in cycles per unit time where 'unit time' is defined
as the elapsed time between adjacent observations.

the range of the frequency axis is 0.0 to 0.5.

OPTIONS

 X   description of parameter
 Y   description of parameter

EXAMPLES

Sample program:

program demo_time
use M_datapac, only : time
implicit none
! call time(x,y)
end program demo_time

Results:

AUTHOR

The original DATAPAC library was written by James Filliben of the
Statistical Engineering Division, National Institute of Standards
and Technology.

MAINTAINER

John Urban, 2022.05.31

LICENSE

CC0-1.0

REFERENCES

  • Jenkins and Watts, especially page 290.

Arguments

Type IntentOptional Attributes Name
real(kind=wp), dimension(:) :: X
integer :: N

Source Code

SUBROUTINE TIME(X,N)
REAL(kind=wp) :: absr, ak, al, all, almax, an, an2, arg1, arg2, bw, df, dfroun, hold, p, perout, pi, pmsq, ps, pssq, r
REAL(kind=wp) :: r025, r975, rk, rmax, s, sd, sdr, ssq, sum, sum1,  sum2, var, varb, wk, X, xbar
INTEGER :: i, i2, iarg1, iarg2, idf, ilower, imin, irev, j, jmax, jmin, k, kmax, krev, l, ll, llp1, lm1, lmax
INTEGER :: maxlag, N, n2, ndiv, nmk, numout, numsp
!
!     INPUT ARGUMENTS--X      = THE  VECTOR OF
!                               (UNSORTED) OBSERVATIONS.
!                      N      = THE INTEGER NUMBER OF OBSERVATIONS
!                               IN THE VECTOR X.
!     OUTPUT--7 TO 11 pages (DEPENDING ON
!             THE INPUT SAMPLE SIZE) OF
!             AUTOMATIC PRINTOUT--
!             1) A PLOT OF AUTOCORRELATION VERSUS LAG NUMBER;
!                THIS PLOT MAY TAKE AS LITTLE AS 1
!                OR AS MANY AS 5 pages
!                (THE EXACT NUMBER DEPENDING ON
!                THE INPUT SAMPLE SIZE N);
!             2) A TEST FOR WHITE NOISE (ASSUMING NORMALITY);
!             3) A 'PILOT' SPECTRUM; AND
!             4) AN ESTIMATED SPECTRUM BASED ON A
!                BANDWIDTH DERIVED FROM THE DATA SET;
!             5) AN ESTIMATED SPECTRUM BASED ON A
!                BANDWIDTH ONLY 1/2 AS WIDE AS IN 4;
!             6) AN ESTIMATED SPECTRUM BASED ON A
!                BANDWIDTH ONLY 1/4 AS WIDE AS IN 4;
!             7) AN ESTIMATED SPECTRUM BASED ON A
!                BANDWIDTH ONLY 1/8 AS WIDE AS IN 4;
!     PRINTING--YES.
!     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
!                   OF N FOR THIS SUBROUTINE.
!                 --THE SAMPLE SIZE N MUST BE GREATER
!                   THAN OR EQUAL TO 3.

!     COMMENT--THE 'FAST FOURIER TRANSFORM' IS NOT USED
!              IN THIS VERSION OF TIME, BUT WILL BE
!              IMPLEMENTED IN A FUTURE VERSION.
!            --THE USUAL MAXIMUM NUMBER OF LAGS
!              FOR WHICH THE AUTOCORRELATION IS
!              COMPUTED IS N/4 WHERE N IS
!              THE SAMPLE SIZE (LENGTH OF THE
!              DATA RECORD IN THE VECTOR X).
!              THIS RULE IS OVERRIDDEN IN
!              LARGE DATA SETS AND IS REPLACED
!              BY THE RULE THAT THE MAXIMUM
!              NUMBER OF LAGS = 500
!              (WHICH CORRESPONDS TO AN
!              AUTOCORRELATION PLOT COVERING
!              5 COMPUTER pages).
!              IF MORE LAGS ARE DESIRED,
!              CHANGE THE VALUE OF THE
!              VARIABLE     MAXLAG
!              WITHIN THIS SUBROUTINE
!              FROM 500 TO WHATEVER DESIRED,
!              AND ALSO CHANGE THE DIMENSION OF
!              THE VECTOR R FROM ITS PRESENT 500 TO HOWEVER
!              MANY LAGS ARE DESIRED.
!            --IF THE INPUT OBSERVATIONS IN X ARE CONSIDERED
!              TO HAVE BEEN COLLECTED 1 SECOND APART IN TIME,
!              THEN THE FREQUENCY AXIS OF THE RESULTING
!              SPECTRA WOULD BE IN UNITS OF HERTZ
!              (= CYCLES PER SECOND).
!            --THE FREQUENCY OF 0.0 CORRESPONDS TO A CYCLE
!              IN THE DATA OF INFINITE (= 1/(0.0))
!              LENGTH OR PERIOD.
!              THE FREQUENCY OF 0.5 CORRESPONDS TO A CYCLE
!              IN THE DATA OF LENGTH = 1/(0.5) = 2 DATA POINTS.
!            --ANY EQUI-SPACED TIME SERIES ANALYSIS IS
!              INTRINSICALLY LIMITED TO DETECTING FREQUENCIES
!              NO LARGER THAN 0.5 CYCLES PER DATA POINT;
!              THIS CORRESPONDS TO THE FACT THAT THE
!              SMALLEST DETECTABLE CYCLE IN THE DATA
!              IS 2 DATA POINTS PER CYCLE.
!
!---------------------------------------------------------------------
!
      DIMENSION X(:)
      DIMENSION r(500)
      DIMENSION s(125)
      DIMENSION pssq(6) , pmsq(6) , ps(6) , p(5) , l(4)
      DATA pi/3.14159265358979_wp/
!
      ilower = 3
      maxlag = 500
!
!     CHECK THE INPUT ARGUMENTS FOR ERRORS
!
      IF ( N<ilower ) THEN
         WRITE (G_IO,99001) ilower
99001    FORMAT (' ',                                                   &
     &'***** FATAL ERROR--THE SECOND INPUT ARGUMENT TO THE TIME   SUBROU&
     &TINE IS OUTSIDE THE ALLOWABLE (',I0,',INFINITY) ',                &
     &'INTERVAL *****')
         WRITE (G_IO,99002) N
         99002 FORMAT (' ','***** THE VALUE OF THE ARGUMENT IS ',I0,' *****')
         RETURN
      ELSE
         hold = X(1)
         DO i = 2 , N
            IF ( X(i)/=hold ) GOTO 100
         ENDDO
         WRITE (G_IO,99003) hold
99003    FORMAT (' ',                                                   &
     &'***** NON-FATAL DIAGNOSTIC--THE FIRST  INPUT ARGUMENT (A VECTOR) &
     &TO THE TIME   SUBROUTINE HAS ALL ELEMENTS = ',E15.8,' *****')
         RETURN
      ENDIF
!
!-----START POINT-----------------------------------------------------
!
 100  an = N
!
!     COMPUTE THE SAMPLE MEAN
!
      sum = 0.0_wp
      DO i = 1 , N
         sum = sum + X(i)
      ENDDO
      xbar = sum/an
!
!     COMPUTE THE SAMPLE VARIANCE AND THE SUM OF SQUARED DEVIATIONS
!
      sum = 0.0_wp
      DO i = 1 , N
         sum = sum + (X(i)-xbar)*(X(i)-xbar)
      ENDDO
      ssq = sum
      varb = ssq/an
      var = ssq/(an-1.0_wp)
      sd = SQRT(var)
!
!     COMPUTE THE SAMPLE AUTOCORRELATIONS
!     REFERENCE--JENKINS AND WATTS, pages 290 AND 259 (7.1.6)
!
      kmax = N/4
      IF ( N<=32 ) kmax = N/2
      IF ( N<=16 ) kmax = N
      IF ( kmax>maxlag ) kmax = maxlag
      DO k = 1 , kmax
         sum = 0.0_wp
         nmk = N - k
         DO i = 1 , nmk
            j = i + k
            sum = sum + (X(i)-xbar)*(X(j)-xbar)
         ENDDO
         r(k) = sum/ssq
      ENDDO
!
!     PLOT THE SAMPLE AUTOCORRELATIONS
!
      CALL PLOTCO(r,kmax)
      WRITE (G_IO,99004)
99004 FORMAT (' ',30X,                                                  &
     & 'AUTOCORRELATION PLOT--PLOT OF SAMPLE AUTOCORRELATION VERSUS LAG'&
     & )
      WRITE (G_IO,99005) N , kmax
99005 FORMAT (' ',10X,'THE NUMBER OF OBSERVATIONS = ',I0,10X,           &
     &        'THE NUMBER OF COMPUTED (AND PLOTTED) AUTOCORRELATIONS = '&
     &        ,I0)
!
!     DO A WHITE NOISE ANALYSIS
!
      sdr = 1.0_wp/SQRT(an)
      r975 = 1.96_wp*sdr
      IF ( r975>1.0_wp ) r975 = 1.0_wp
      r025 = -r975
      numout = 0
      DO k = 1 , kmax
         absr = r(k)
         IF ( absr<0.0_wp ) absr = -absr
         IF ( absr>r975 ) numout = numout + 1
      ENDDO
      perout = FLOAT(numout)/FLOAT(kmax)
      perout = 100.0_wp*perout
      WRITE (G_IO,99017)
      WRITE (G_IO,99006) r025 , r975
!
99006 FORMAT (' ',                                                      &
     &'UNDER THE NULL HYPOTHESIS OF WHITE NOISE (AND NORMALITY), A 2-SID&
     &ED 95 PERCENT ACCEPTANCE INTERVAL IS (',F6.4,',',F6.4,')')
      WRITE (G_IO,99007)
99007 FORMAT (' ',                                                      &
     &'UNDER THE NULL HYPOTHESIS, ONLY 5 PERCENT (ON THE AVERAGE) OF THE&
     & OBSERVED AUTOCORRELATIONS SHOULD FALL OUTSIDE THIS INTERVAL')
      WRITE (G_IO,99008) numout , kmax , perout
99008 FORMAT (' ','IT IS OBSERVED THAT ',I5,' OUT OF THE ',I5,          &
     &        ' (THAT IS, ',F5.1,                                       &
     &' PERCENT) OF THE COMPUTED AUTOCORRELATIONS FALL OUTSIDE OF THIS I&
     &NTERVAL')
      DO i = 1 , 5
         WRITE (G_IO,99017)
      ENDDO
      WRITE (G_IO,99009) N
      99009 FORMAT (' ','THE SAMPLE SIZE = ',I0)
      WRITE (G_IO,99010) xbar
      99010 FORMAT (' ','THE SAMPLE MEAN = ',E15.8)
      WRITE (G_IO,99011) var
      99011 FORMAT (' ','THE SAMPLE VARIANCE = ',E15.8)
      WRITE (G_IO,99012) sd
      99012 FORMAT (' ','THE SAMPLE STANDARD DEVIATION = ',E15.8)
      WRITE (G_IO,99013) varb
      99013 FORMAT (' ','THE BIASED SAMPLE VARIANCE = ',E15.8)
!
!     COMPUTE THE PILOT SPECTRUM FOR THE REDUCED (2**J) SAMPLE
!     REFERENCE--JENKINS AND WATTS, page 288
!
      DO i = 1 , 20
         ndiv = N/(2**i)
         IF ( ndiv==0 ) i2 = i - 1
         IF ( ndiv==0 ) EXIT
      ENDDO
      IF ( 7<i2 ) i2 = 7
      n2 = 2**i2
      an2 = n2
      DO k = 1 , i2
         sum = 0.0_wp
         imin = 2**k
         jmax = imin/2
         DO i = imin , n2 , imin
            sum1 = 0.0_wp
            sum2 = 0.0_wp
            DO j = 1 , jmax
               iarg1 = i + j - jmax
               iarg2 = iarg1 - jmax
               sum1 = sum1 + X(iarg1)
               sum2 = sum2 + X(iarg2)
            ENDDO
            sum = sum + (sum1-sum2)*(sum1-sum2)
         ENDDO
         pssq(k) = sum/FLOAT(imin)
         pmsq(k) = pssq(k)/an2
         ps(k) = FLOAT(2*imin)*pmsq(k)
         ps(k) = ps(k)/varb
      ENDDO
!
!     FORM THE PILOT SPECTRUM PLOT
!
      DO i = 1 , i2
         irev = i2 - i + 1
         jmin = (120/(2**i)) + 1
         IF ( i==i2 ) jmin = 1
         jmax = 120/(2**(i-1))
         DO j = jmin , jmax
            s(j) = ps(i)
         ENDDO
      ENDDO
      CALL PLOTSP(s,120,0)
      WRITE (G_IO,99017)
      WRITE (G_IO,99014)
      99014 FORMAT (' ',50X,'PILOT SPECTRUM')
!
!     DEFINE 4 LAG WINDOW TRUNCATION POINTS
!     REFERENCE--JENKINS AND WATTS, pages 290 AND 260
!
      p(1) = 0.2_wp
      p(2) = 0.1_wp
      p(3) = 0.05_wp
      p(4) = 0.025_wp
      p(5) = 0.01_wp
      lmax = 0
      DO i = 1 , 5
         DO k = 1 , kmax
            krev = kmax - k + 1
            rk = r(krev)
            IF ( rk<0.0_wp ) rk = -rk
            IF ( rk>=p(i) ) lmax = krev
            IF ( rk>=p(i) ) GOTO 200
         ENDDO
      ENDDO
      IF ( lmax==0 ) THEN
         rmax = ABS(r(1))
         DO k = 1 , kmax
            rk = r(k)
            IF ( rk<0.0_wp ) rk = -rk
            IF ( rk>=rmax ) lmax = k
            IF ( rk>=rmax ) rmax = rk
         ENDDO
      ENDIF
 200  almax = lmax
      l(1) = (3.0_wp/2.0_wp)*almax
      IF ( l(1)<=32 ) lmax = 32
      IF ( l(1)<=32 ) almax = 32.0_wp
      IF ( l(1)<=32 ) l(1) = 32
      IF ( l(1)>=kmax ) lmax = kmax
      IF ( l(1)>=kmax ) almax = kmax
      IF ( l(1)>=kmax ) l(1) = kmax
      l(2) = (almax/2.0_wp) + 0.1_wp
      l(3) = (almax/4.0_wp) + 0.1_wp
      l(4) = (almax/8.0_wp) + 0.1_wp
      IF ( l(4)>=3 ) numsp = 4
      IF ( l(4)<3 ) THEN
         IF ( l(3)>=3 ) numsp = 3
         IF ( l(3)<3 ) THEN
            IF ( l(2)>=3 ) numsp = 2
            IF ( l(2)<3 ) THEN
               IF ( l(1)>=3 ) numsp = 1
               IF ( l(1)<3 ) THEN
                  WRITE (G_IO,99015) N
99015             FORMAT (' ',                                          &
     &                   'DUE TO THE SMALL NUMBER OF OBSERVATIONS (N = '&
     &                   ,I0,                                           &
     &     '), THERE ARE NOT ENOUGH LAGS TO PRODUCE A RELIABLE SPECTRUM'&
     &     )
                  RETURN
               ENDIF
            ENDIF
         ENDIF
      ENDIF
!
!     COMPUTE THE 4 SPECTRUM ESTIMATES
!     REFERENCE--JENKINS AND WATTS, pages 260 AND 244
!
!     COMPUTE BANDWIDTHS
!     REFERENCE--JENKINS AND WATTS, pages 257 AND 252
!
!     COMPUTE DEGREES OF FREEDOM FOR THE SPECTAL DENSITY ESTIMATE AT INDIVIDUAL
!     FREQUENCIES
!     REFERENCE--JENKINS AND WATTS, pages 254 AND 252
!
!     COMPUTE 95 PERCENT CONFIDENCE INTERVAL LENGTHS FOR THE LOG SPECTRAL
!     DENSITY ESTIMATES
!     REFERENCE--JENKINS AND WATTS, pages 255 AND 252
!
!     WRITE OUT THE 4 SPECTRUM PLOTS
!
      DO i = 1 , numsp
         al = l(i)
         lm1 = l(i) - 1
         DO llp1 = 1 , 121
            ll = llp1 - 1
            all = ll
            sum = 0.0_wp
            DO k = 1 , lm1
               ak = k
               arg1 = pi*ak/al
               arg2 = pi*ak*all/120.0_wp
               wk = 0.0_wp
               IF ( k<=l(i) ) wk = 0.5_wp*(1.0_wp+COS(arg1))
               sum = sum + r(k)*wk*COS(arg2)
            ENDDO
            sum = 2.0_wp + 4.0_wp*sum
            s(llp1) = sum
         ENDDO
         bw = (4.0_wp/3.0_wp)/FLOAT(l(i))
         df = (8.0_wp/3.0_wp)*an/FLOAT(l(i))
         idf = df + 0.5
         CALL PLOTSP(s,121,idf)
         dfroun = idf
         WRITE (G_IO,99017)
         WRITE (G_IO,99016) l(i) , bw , dfroun
         99016 FORMAT (' NUMBER OF LAGS = ',I5,10X,'BANDWIDTH =',F10.3,10X,'DEGREES OF FREEDOM = ',F10.3)
      ENDDO
99017 FORMAT (' ')
!
END SUBROUTINE TIME