File: xtrm.f

package info (click to toggle)
x13as 1.1-b59-1
  • links: PTS, VCS
  • area: non-free
  • in suites: bookworm
  • size: 9,088 kB
  • sloc: fortran: 114,121; makefile: 14
file content (185 lines) | stat: -rw-r--r-- 7,432 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
C     Last change:  BCM  15 Apr 2005   12:40 pm
      SUBROUTINE xtrm(Xi,Kfda,Klda,Kfdax,Kldax)
      IMPLICIT NONE
c-----------------------------------------------------------------------
C --- THIS ROUTINE COMPUTES WEIGHTS FOR THE IRREGULAR COMPONENT
C --- AND IDENTIFIES EXTREME IRREGULAR VALUES
c-----------------------------------------------------------------------
      INCLUDE 'srslen.prm'
      INCLUDE 'notset.prm'
c      INCLUDE 'x11ptr.cmn'
      INCLUDE 'lzero.cmn'
      INCLUDE 'x11opt.cmn'
      INCLUDE 'xtrm.cmn'
c-----------------------------------------------------------------------
      INTEGER PY1
      DOUBLE PRECISION ZERO,ONE
      LOGICAL F,T
      PARAMETER(PY1=PYRS+1,ZERO=0D0,ONE=1D0,F=.false.,T=.true.)
c-----------------------------------------------------------------------
      DOUBLE PRECISION sdev1,sdev2,xbar,Xi
      INTEGER i,inx,istep,j,jfda,jlda,k,Kfda,Klda,l,m,lx,
     &        mx,n,n1,n2,Kfdax,Kldax
      INTEGER n3,nfda,nlda
      DIMENSION Xi(PLEN)
c-----------------------------------------------------------------------
      DOUBLE PRECISION sdxtrm,wtxtrm
      LOGICAL dpeq
      EXTERNAL sdxtrm,wtxtrm,dpeq
c-----------------------------------------------------------------------
      n1=2*Ny
      n2=n1+Ny-1
      n3=n2+n1
      istep=1
      jfda=(Kfdax+Ny-2)/Ny*Ny+1
      jlda=Kldax/Ny*Ny-n3
c  changes suggested by NBB May 2004
      nfda=(Kfdax-1)/Ny*Ny+1
      nlda=(((Kldax-1)/Ny)+1)*Ny-n3
c  end of changes
      IF(jlda.lt.jfda)nlda=nfda
c-----------------------------------------------------------------------
C --- SET ALL WEIGHTS EQUAL TO 1.0 TO START
c-----------------------------------------------------------------------
      CALL setdp(ONE,Klda,Stwt)
      CALL setdp(ZERO,Ny,Stdper)
      xbar=ONE
      IF(Muladd.ne.0)xbar=ZERO
      DO WHILE (istep.le.2)
c-----------------------------------------------------------------------
c	Check to see if a grouping of periods has been done.  If so,
c	calculate extremes using standard errors generated for the
c     grouped irregulars.
c-----------------------------------------------------------------------
       IF(Ksdev.eq.4)THEN
        sdev1=sdxtrm(Xi,xbar,Kfdax,Kldax,1,Imad,istep,Ny,T)
        sdev2=sdxtrm(Xi,xbar,Kfdax,Kldax,1,Imad,istep,Ny,F)
c-----------------------------------------------------------------------
c     Store sdev/MAD for each group
c-----------------------------------------------------------------------
        DO i=1,Ny
         Stdper(i)=sdev2
         IF(Csigvc(i))Stdper(i)=sdev1
        END DO
c-----------------------------------------------------------------------
        DO k=Kfda,Klda
c-----------------------------------------------------------------------
C --- COMPUTE DEVIATION OF EACH IRREGULAR VALUE.
c-----------------------------------------------------------------------
         i=mod(k,Ny)
         IF(i.eq.0)i=Ny
         IF(Stdper(i).gt.ZERO)Stwt(k)=wtxtrm(Xi(k),xbar,Stdper(i),Sigmu,
     &                                       Sigml,istep,Stwt(k))
        END DO
c-----------------------------------------------------------------------
c     Check to see if test for heterskedastic irregular has been
c     accepted.  If so, calculate extremes using standard errors
c     calculated for each month/quarter.
c-----------------------------------------------------------------------
       ELSE IF(Ksdev.gt.0)THEN
        DO l=Kfda,Kfda+Ny-1
         i=mod(l,Ny)
         IF(i.eq.0)i=Ny
c-----------------------------------------------------------------------
c     Calculate s.dev./MAD for a given calendar month/quarter.
c-----------------------------------------------------------------------
         lx=l
         IF(l.lt.Kfdax)THEN
          j=mod(lx,Ny)
          IF(j.eq.0)j=Ny
          IF(i.ge.j)THEN
	   lx=Kfdax+(j-i)
          ELSE
           lx=Kfdax+Ny+(i-j)
          END IF
         END IF
         m=((Klda-l)/Ny)*Ny+l
         mx=((Kldax-l)/Ny)*Ny+l
         sdev1=sdxtrm(Xi,xbar,lx,mx,Ny,Imad,istep,Ny,T)
c-----------------------------------------------------------------------
c     Store sdev/MAD for month/quarter i
c-----------------------------------------------------------------------
         Stdper(i)=sdev1
c-----------------------------------------------------------------------
         IF(.not.dpeq(sdev1,ZERO))THEN
          DO k=l,m,Ny
           Stwt(k)=wtxtrm(Xi(k),xbar,sdev1,Sigmu,Sigml,istep,Stwt(k))
          END DO
         END IF
        END DO
c-----------------------------------------------------------------------
        IF(istep.eq.2)CALL setdp(DNOTST,PY1,Stdev)
       ELSE
c-----------------------------------------------------------------------
c     Else, identify extreme values and weights using standard X-11
c     Method
c-----------------------------------------------------------------------
        inx=3+((Lsp-1)/Ny)
        DO i=nfda,nlda,Ny
         IF(nlda.le.nfda)THEN
c-----------------------------------------------------------------------
C --- LESS THAN 5 YEARS AVAILABLE.
c-----------------------------------------------------------------------
          j=Kfda
          k=Klda
          l=Kfdax
          m=Kldax
         ELSE IF(i.le.nfda)THEN
c-----------------------------------------------------------------------
C --- BEGINNING OF SERIES
c-----------------------------------------------------------------------
          j=Kfda
          k=nfda+n2
          l=Kfdax
          m=jfda+n3
         ELSE IF(i.lt.nlda)THEN
c-----------------------------------------------------------------------
C --- CENTRAL YEARS
c-----------------------------------------------------------------------
          j=i+n1
          k=i+n2
          l=i
          m=n3+i
         ELSE
c-----------------------------------------------------------------------
C --- END OF SERIES
c-----------------------------------------------------------------------
          j=nlda+n1
          k=Klda
          l=jlda
          m=Kldax
         END IF
c-----------------------------------------------------------------------
C --- COMPUTE FIVE YEAR STANDARD DEVIATION (OR MEDIAN ABSOLUTE
C     DEVIATION) OF THE IRREGULARS.
c-----------------------------------------------------------------------
         sdev1=sdxtrm(Xi,xbar,l,m,1,Imad,istep,Ny,T)
c-----------------------------------------------------------------------
C --- STORE STANDARD DEVIATIONS FOR PRINTING IN TABLE OF WEIGHTS.
c-----------------------------------------------------------------------
         Stdev(inx)=sdev1
         inx=inx+1
         IF(.not.dpeq(sdev1,ZERO))THEN
          DO n=j,k
           Stwt(n)=wtxtrm(Xi(n),xbar,sdev1,Sigmu,Sigml,istep,Stwt(n))
          END DO
         END IF
        END DO
c-----------------------------------------------------------------------
        IF(istep.eq.2)THEN
         DO i=1,3
          Stdev(i-1+inx)=sdev1
          Stdev(i)=Stdev(3+((Lsp-1)/Ny))
         END DO
        END IF
c-----------------------------------------------------------------------
       END IF
       istep=istep+1
      END DO
c-----------------------------------------------------------------------
c      DO i=Kfda,Klda
      DO i=Kfdax,Kldax
       IF((Stwt(i)+ONE).le.ZERO)Stwt(i)=ZERO
      END DO
      RETURN
      END