/* Damped Trend Exponential Smoothing */ /* (n periods ahead) */ new; cls; let data[12,1]= 23 25 36 31 26 28 48 36 31 42 53 43 ; nahead=12; t=seqa(1,1,rows(data)+nahead); library pgraph; graphset; _pltype=6; _plegctl=1; _plegstr="actual\000predicted\000n ahead"; title("Damped Trend Exponential Smoothing"); alpha=0.1; beta=0.9; psi=0.9; /* a rate of decay in the trend */ xy(t,(data|miss(zeros(nahead,1),0))~damptf(data,alpha,beta,psi,nahead)); proc damptf(x,alpha,beta,psi,nahead); local n,L,T,m,mp,i; n=rows(x); L=zeros(n,1); T=zeros(n,1); m=zeros(n,1); L[1]=x[1]; T[1]=0; i=2; do while i<=n; L[i]=alpha*x[i]+(1-alpha)*(L[i-1]+psi*T[i-1]); T[i]=beta*(L[i]-L[i-1])+(1-beta)*psi*T[i-1]; m[i]=L[i-1]+T[i-1]; i=i+1; endo; mp=miss(zeros(n-1,1),0)|m[n]|L[n]+cumsumc(psi^seqa(1,1,nahead))*T[n]; m=m|miss(zeros(nahead,1),0); m[1]=miss(m[1],0); retp(m~mp); endp;