/* Centered Geometric Moving Average CGMA(k) */ 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\000CGMA(5)\000CGMA(10)"; title("(Centered) Geometric Moving Average"); xy(t,data~cgma(data,5)~cgma(data,10)); proc cgma(x,k); local m,i,m1,m2; m=zeros(rows(x),cols(x)); if k%2==0; /* if k is even */ i=1; do while i<=rows(x)-k; m1=exp(sumc(ln(x[i:i+k-1,.]))'/k); m2=exp(sumc(ln(x[i+1:i+k,.]))'/k); m[k/2+i,.]=exp((ln(m1)+ln(m2))/2); i=i+1; endo; m[1:k/2,.]=miss(m[1:k/2,.],0); m[rows(x)-k/2+1:rows(x),.]=miss(m[rows(x)-k/2+1:rows(x),.],0); else; /* if k is odd */ i=1; do while i<=rows(x)-k+1; m[(k-1)/2+i,.]=exp(sumc(ln(x[i:i+k-1,.]))'/k); i=i+1; endo; m[1:(k-1)/2,.]=miss(m[1:(k-1)/2,.],0); m[rows(x)-(k-1)/2+1:rows(x),.]=miss(m[rows(x)-(k-1)/2+1:rows(x),.],0); endif; retp(m); endp;