/* Holt-Winters' Additive Method */ /* (p periods ahead) */ new; cls; let data[12,1]= 23 25 36 31 26 28 48 36 31 42 53 43 ; p=4; /* number of periods in S */ t=seqa(1,1,rows(data)+p); library pgraph; graphset; _pltype=6; _plegctl=1; _plegstr="actual\000predicted\000p ahead"; title("Holt-Winters' Additive Method"); alpha=0.2; beta=0.9; gam=0.7; xy(t,(data|miss(zeros(p,1),0))~hwaddf(data,alpha,beta,gam,p)); proc hwaddf(x,alpha,beta,gam,p); local n,L,T,S,m,mp,i; n=rows(x); L=zeros(n,1); T=zeros(n,1); S=zeros(n,1); m=zeros(n,1); S[1:p]=x[1:p]-meanc(x[1:p]); L[p]=x[p]-S[p]; T[p]=0; i=p+1; do while i<=n; L[i]=alpha*(x[i]-S[i-p])+(1-alpha)*(L[i-1]+T[i-1]); T[i]=beta*(L[i]-L[i-1])+(1-beta)*T[i-1]; S[i]=gam*(x[i]-L[i])+(1-gam)*S[i-p]; m[i]=L[i-1]+T[i-1]+S[i-p]; i=i+1; endo; L[1:p-1]=miss(zeros(p-1,1),0); T[1:p-1]=miss(zeros(p-1,1),0); mp=miss(zeros(n-1,1),0)|m[n]|L[n]+seqa(1,1,p)*T[n]+S[seqa(n-p+1,1,p)]; m=m|miss(zeros(p,1),0); m[1:p]=miss(zeros(p,1),0); retp(m~mp); endp;