/* Triangular Moving Average TMA(k) Harmonic version */ new; cls; let data[50,1]= 60 61 60 62 60 63 64 65 69 70 69 66 64 64 62 64 65 55 53 57 60 58 63 63 63 68 69 69 68 69 70 67 66 67 68 69 69 77 80 80 78 76 76 72 71 70 73 71 78 80 ; data=rev(data); /* original data in reverse order */ t=seqa(1,1,rows(data)); library pgraph; graphset; _pltype=6; _plegctl=1; _plegstr="actual\000TMA(5)\000TMA(10)"; title("Triangular Moving Average(Harmonic version)"); xy(t,data~tmag(data,5)~tmag(data,10)); proc tmag(x,k); local alpha,m; if k%2==1; /* odd case */ alpha=ceil(k/2); m=hma(hma(x,alpha),alpha); else; /* even case */ alpha=k/2; m=hma(hma(x,alpha),alpha+1); endif; retp(m); endp; proc hma(x,k); local m,i,j; m=zeros(rows(x),cols(x)); i=k; do while i<=rows(x); j=1; do while j<=k; m[i,.]=m[i,.]+(1/x[i-k+j,.]); j=j+1; endo; i=i+1; endo; m[1:k-1,.]=miss(zeros(k-1,cols(x)),0); m=k/m; retp(m); endp;