/* Double Moving Average Smoothing */ /* (n periods ahead) */ new; cls; let data[12,1]= 23 25 36 31 26 28 48 36 31 42 53 43 ; nahead=4; t=seqa(1,1,rows(data)+nahead); library pgraph; graphset; _pltype=6; _plegctl=1; _plegstr="actual\000predicted\000n ahead"; title("Double Moving Average"); k=4; xy(t,(data|miss(zeros(nahead,1),0))~dmaf(data,k,nahead)); proc dmaf(x,k,nahead); local n,m1,m2,m,mp,i,t; n=rows(x); m1=zeros(n,1); m1[1]=x[1]; i=2; do while i<=n; if i<=k; m1[i]=sumc(x[1:i-1])/(i-1); else; m1[i]=sumc(x[i-k:i-1])/k; endif; i=i+1; endo; m2=zeros(n,1); m2[1]=m1[1]; i=2; do while i<=n; if i<=k; m2[i]=sumc(m1[1:i-1])/(i-1); else; m2[i]=sumc(m1[i-k:i-1])/k; endif; i=i+1; endo; m=m1*2-m2; t=seqa(0,1,nahead+1); mp=miss(zeros(n-1,1),0)|m[n]+(2/(n-1))*(m1[n]-m2[n])*t; m=m|miss(zeros(nahead,1),0); retp(m~mp); endp;