1
subroutine stl(y,n,np,ns,nt,nl,isdeg,itdeg,ildeg,nsjump,ntjump,
2
&nljump,ni,no,rw,season,trend,work)
3
integer n, np, ns, nt, nl, isdeg, itdeg, ildeg, nsjump, ntjump,
5
integer newns, newnt, newnl, newnp
6
double precision y(n), rw(n), season(n), trend(n), work(n+2*np,5)
17
if(.not.(mod(newns,2) .eq. 0))goto 23002
20
if(.not.(mod(newnt,2) .eq. 0))goto 23004
23
if(.not.(mod(newnl,2) .eq. 0))goto 23006
27
call onestp(y,n,newnp,newns,newnt,newnl,isdeg,itdeg,ildeg,nsjump,
28
&ntjump,nljump,ni,userw,rw,season, trend, work)
30
if(.not.(k .gt. no))goto 23011
34
work(i,1) = trend(i)+season(i)
36
call rwts(y,n,work(1,1),rw)
40
if(.not.(no .le. 0))goto 23015
49
subroutine ess(y,n,len,ideg,njump,userw,rw,ys,res)
50
integer n, len, ideg, njump, newnj, nleft, nright, nsh, k, i, j
51
double precision y(n), rw(n), ys(n), res(n), delta
53
if(.not.(n .lt. 2))goto 23019
57
newnj = min(njump, n-1)
58
if(.not.(len .ge. n))goto 23021
61
do 23023 i = 1,n,newnj
62
call est(y,n,len,ideg,dble(i),ys(i),nleft,nright,res,userw,rw,ok)
63
if(.not.( .not. ok))goto 23025
69
if(.not.(newnj .eq. 1))goto 23027
74
if(.not.(i .gt. nsh .and. nright .ne. n))goto 23031
78
call est(y,n,len,ideg,dble(i),ys(i),nleft,nright,res,userw,rw,ok)
79
if(.not.( .not. ok))goto 23033
86
do 23035 i = 1,n,newnj
87
if(.not.(i .lt. nsh))goto 23037
92
if(.not.(i .ge. n-nsh+1))goto 23039
101
call est(y,n,len,ideg,dble(i),ys(i),nleft,nright,res,userw,rw,ok)
102
if(.not.( .not. ok))goto 23041
108
if(.not.(newnj .ne. 1))goto 23043
109
do 23045 i = 1,n-newnj,newnj
110
delta = (ys(i+newnj)-ys(i))/dble(newnj)
111
do 23047 j = i+1,i+newnj-1
112
ys(j) = ys(i)+delta*dble(j-i)
115
k = ((n-1)/newnj)*newnj+1
116
if(.not.(k .ne. n))goto 23049
117
call est(y,n,len,ideg,dble(n),ys(n),nleft,nright,res,userw,rw,ok)
118
if(.not.( .not. ok))goto 23051
121
if(.not.(k .ne. n-1))goto 23053
122
delta = (ys(n)-ys(k))/dble(n-k)
124
ys(j) = ys(k)+delta*dble(j-k)
133
subroutine est(y,n,len,ideg,xs,ys,nleft,nright,w,userw,rw,ok)
134
integer n, len, ideg, nleft, nright, j
135
double precision y(n), w(n), rw(n), xs, ys, range, h, h1, h9, a,
138
range = dble(n)-dble(1)
139
h = max(xs-dble(nleft),dble(nright)-xs)
140
if(.not.(len .gt. n))goto 23057
141
h = h+dble((len-n)/2)
146
do 23059 j = nleft,nright
149
if(.not.(r .le. h9))goto 23061
150
if(.not.(r .le. h1))goto 23063
154
w(j) = (1.D0-(r/h)**3.D0)**3.D0
156
if(.not.(userw))goto 23065
162
if(.not.(a .le. 0.D0))goto 23067
167
do 23069 j = nleft,nright
170
if(.not.((h .gt. 0.D0) .and. (ideg .gt. 0)))goto 23071
172
do 23073 j = nleft,nright
177
do 23075 j = nleft,nright
178
c = c+w(j)*(dble(j)-a)**2.D0
180
if(.not.(sqrt(c) .gt. .001*range))goto 23077
182
do 23079 j = nleft,nright
183
w(j) = w(j)*(b*(dble(j)-a)+1.D0)
188
do 23081 j = nleft,nright
196
subroutine fts(x,n,np,trend,work)
198
double precision x(n), trend(n), work(n)
199
call ma(x,n,np,trend)
200
call ma(trend,n-np+1,np,work)
201
call ma(work,n-2*np+2,3,trend)
206
subroutine ma(x, n, len, ave)
207
integer n, len, i, j, k, m, newn
208
double precision x(n), ave(n), flen, v
216
if(.not.(newn .gt. 1))goto 23085
230
subroutine onestp(y,n,np,ns,nt,nl,isdeg,itdeg,ildeg,nsjump,ntjump,
231
&nljump,ni,userw,rw,season,trend,work)
232
integer n,ni,np,ns,nt,nsjump,ntjump,nl,nljump,isdeg,itdeg,ildeg
233
double precision y(n),rw(n),season(n),trend(n),work(n+2*np,5)
237
work(i,1) = y(i)-trend(i)
239
call ss(work(1,1),n,np,ns,isdeg,nsjump,userw,rw,work(1,2),work(1,
240
&3),work(1,4),work(1,5),season)
241
call fts(work(1,2),n+2*np,np,work(1,3),work(1,1))
242
call ess(work(1,3),n,nl,ildeg,nljump,.false.,work(1,4),work(1,1),
245
season(i) = work(np+i,2)-work(i,1)
248
work(i,1) = y(i)-season(i)
250
call ess(work(1,1),n,nt,itdeg,ntjump,userw,rw,trend,work(1,3))
256
subroutine rwts(y,n,fit,rw)
258
double precision y(n), fit(n), rw(n), cmad, c9, c1, r
260
rw(i) = dabs(y(i)-fit(i))
264
call psort(rw,n,mid,2)
265
cmad = 3.D0*(rw(mid(1))+rw(mid(2)))
269
r = dabs(y(i)-fit(i))
270
if(.not.(r .le. c1))goto 23101
274
if(.not.(r .le. c9))goto 23103
275
rw(i) = (1.D0-(r/cmad)**2.D0)**2.D0
286
subroutine ss(y,n,np,ns,isdeg,nsjump,userw,rw,season,work1,work2,
288
integer n, np, ns, isdeg, nsjump, nright, nleft, i, j, k
289
double precision y(n), rw(n), season(n+2*np), work1(n), work2(n),
290
&work3(n), work4(n), xs
293
23105 if(.not.(j .le. np))goto 23107
296
work1(i) = y((i-1)*np+j)
298
if(.not.(userw))goto 23110
300
work3(i) = rw((i-1)*np+j)
303
call ess(work1,k,ns,isdeg,nsjump,userw,work3,work2(2),work4)
306
call est(work1,k,ns,isdeg,xs,work2(1),1,nright,work4,userw,work3,
308
if(.not.( .not. ok))goto 23114
312
nleft = max0(1,k-ns+1)
313
call est(work1,k,ns,isdeg,xs,work2(k+2),nleft,k,work4,userw,work3,
315
if(.not.( .not. ok))goto 23116
316
work2(k+2) = work2(k+1)
319
season((m-1)*np+j) = work2(m)
328
subroutine stlez(y, n, np, ns, isdeg, itdeg, robust, no, rw,
329
&season, trend, work)
331
integer n, i, j, np, ns, no, nt, nl, ni, nsjump, ntjump, nljump,
333
integer isdeg, itdeg, ildeg
334
double precision y(n), rw(n), season(n), trend(n), work(n+2*np,7)
335
double precision maxs, mins, maxt, mint, maxds, maxdt, difs, dift
338
if(.not.(mod(newns,2) .eq. 0))goto 23120
342
nt = (1.5*newnp)/(1 - 1.5/newns) + 0.5
344
if(.not.(mod(nt,2) .eq. 0))goto 23122
348
if(.not.(mod(nl,2) .eq. 0))goto 23124
351
if(.not.(robust))goto 23126
357
nsjump = max(1,int(dble(newns)/10.D0 + 0.9D0))
358
ntjump = max(1,int(dble(nt)/10.D0 + 0.9D0))
359
nljump = max(1,int(dble(nl)/10.D0 + 0.9D0))
363
call onestp(y,n,newnp,newns,nt,nl,isdeg,itdeg,ildeg,nsjump,ntjump,
364
&nljump,ni,.false.,rw,season,trend,work)
366
if(.not.(robust))goto 23130
368
23132 if(.not.(j .le. 15))goto 23134
370
work(i,6) = season(i)
372
work(i,1) = trend(i)+season(i)
374
call rwts(y,n,work(1,1),rw)
375
call onestp(y, n, newnp, newns, nt, nl, isdeg, itdeg, ildeg,
376
&nsjump,ntjump, nljump, ni, .true., rw, season, trend, work)
382
maxds = dabs(work(1,6) - season(1))
383
maxdt = dabs(work(1,7) - trend(1))
385
if(.not.(maxs .lt. work(i,6)))goto 23139
388
if(.not.(maxt .lt. work(i,7)))goto 23141
391
if(.not.(mins .gt. work(i,6)))goto 23143
394
if(.not.(mint .gt. work(i,7)))goto 23145
397
difs = dabs(work(i,6) - season(i))
398
dift = dabs(work(i,7) - trend(i))
399
if(.not.(maxds .lt. difs))goto 23147
402
if(.not.(maxdt .lt. dift))goto 23149
406
if(.not.((maxds/(maxs-mins) .lt. .01) .and.
407
& (maxdt/(maxt-mint) .lt. .01)))goto 23151
414
if(.not.( .not. robust))goto 23153
423
subroutine psort(a,n,ind,ni)
424
double precision a(n)
426
integer indu(16),indl(16),iu(16),il(16),p,jl,ju,i,j,m,k,ij,l
427
double precision t,tt
428
if(.not.(n .lt. 0 .or. ni .lt. 0))goto 23157
431
if(.not.(n .lt. 2 .or. ni .eq. 0))goto 23159
442
if(.not.(i .lt. j))goto 23164
447
if(.not.(m .eq. 0))goto 23169
454
if(.not.(jl .le. ju))goto 23171
455
23173 if(.not.(j-i .gt. 10))goto 23174
459
if(.not.(a(i) .gt. t))goto 23175
465
if(.not.(a(j) .lt. t))goto 23177
469
if(.not.(a(i) .gt. t))goto 23179
477
if(.not.(a(l) .le. t))goto 23184
481
23187 if(.not.(a(k) .ge. t))goto 23186
482
if(.not.(k .gt. l))goto 23189
494
if(.not.(l-i .le. j-k))goto 23191
499
if(.not.(jl .gt. ju))goto 23196
502
if(.not.(ind(ju) .le. j))goto 23198
515
if(.not.(jl .gt. ju))goto 23203
518
if(.not.(ind(jl) .ge. i))goto 23205
528
if(.not.(i .eq. 1))goto 23207
534
if(.not.(i .eq. j))goto 23212
538
if(.not.(a(i) .gt. t))goto 23214
543
23217 if(.not.(t .ge. a(k)))goto 23216