/* Regularized Exponential Moving Average REMA(k,lambda) */ 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\000REMA(5,lambda)\000REMA(10,lambda)"; title("Regularized Exponential Moving Average(lambda=0.5)"); lambda=0.5; xy(t,data~rema(data,5,lambda)~rema(data,10,lambda)); proc rema(x,k,lambda); local n,alpha,m,i; alpha=2/(k+1); m=zeros(rows(x),cols(x)); m[1,.]=x[1,.]; m[2,.]=alpha*x[2,.]+(1-alpha)*m[1,.]; i=3; do while i<=rows(x); m[i,.]=(m[i-1,.]*(1+2*lambda)+alpha*(x[i,.]-m[i-1,.])-lambda*m[i-2,.])/(1+lambda); i=i+1; endo; retp(m); endp;