program define sm4253eh version 2.1 * running-medians of span 4,2,5,3 and hanning * compound smoother * syntax do sm4253eh * sm4253eh oldvar newvar capture confirm existence %_2 if _rc~=0 { display "syntax sm4253eh oldvar newvar" exit } * first, running-medians of span 4 qui { gen hvsum=%_1[_n-2]+%_1[_n-1]+%_1+%_1[_n+1] gen hvmax=max(%_1[_n-2],%_1[_n-1],%_1,%_1[_n+1]) gen hvmin=min(%_1[_n-2],%_1[_n-1],%_1,%_1[_n+1]) gen hvalue=(hvsum-hvmax-hvmin)/2 gen %_2=cond(_n==1,%_1,(hvalue)) replace %_2=(%_1[_n-1]+%_1)/2 if _n==2 replace %_2=(%_1[_n-1]+%_1)/2 if _n==_N replace %_2=%_1[_N] if _n==_N+1 drop hvsum hvmin hvmax hvalue * running-medians of span 2 gen tempo=%_2 replace %_2=(tempo+tempo[_n+1])/2 replace %_2=%_1 if _n==1 | _n==_N gen tempoa=%_2 drop tempo * running-medians of span 5 smoother gen tempo=%_2 gen index=_n+1 gen span=group(int(_N/5)) gen index1=_n sort span tempo by span: gen median51=tempo[3] by span: gen ordmed=_n by span: replace %_2=median51 if _n==1 sort index1 replace tempo=tempo[index] sort span tempo by span: replace median51=tempo[3] sort span ordmed by span: replace %_2=median51 if _n==2 sort index1 replace tempo=tempo[index] sort span tempo by span: replace median51=tempo[3] sort span ordmed by span: replace %_2=median51 if _n==3 sort index1 replace tempo=tempo[index] sort span tempo by span: replace median51=tempo[3] sort span ordmed by span: replace %_2=median51 if _n==4 sort index1 replace tempo=tempo[index] sort span tempo by span: replace median51=tempo[3] sort span ordmed by span: replace %_2=median51 if _n==5 drop index span ordmed median51 * recovering original values position gen index2=_n-1 gen tempo2=%_2[index2] replace %_2=tempo2 replace tempo2=%_2[index2] replace %_2=tempo2 sort index1 * median of 3 on sequence extremes (on tempoa that is a copy of %_2 after 42) gen hvsum=tempoa[_n-1]+tempoa+tempoa[_n+1] gen hvmax=max(tempoa[_n-1],tempoa,tempoa[_n+1]) gen hvmin=min(tempoa[_n-1],tempoa,tempoa[_n+1]) gen hvalue=hvsum-hvmax-hvmin replace %_2=hvalue[2] if index2==1 replace %_2=hvalue[_N-1] if index2==_N-2 replace %_2=tempoa[1] if index2==0 replace %_2=tempoa[_N] if index2==_N-1 sort index2 gen tempob=%_2 drop tempoa hvsum hvmin hvmax hvalue * running-medians of span 3 smoother gen hvsum=tempob[_n-1]+tempob+tempob[_n+1] gen hvmax=max(tempob[_n-1],tempob,tempob[_n+1]) gen hvmin=min(tempob[_n-1],tempob,tempob[_n+1]) gen hvalue=hvsum-hvmax-hvmin replace %_2=cond(_n==1|_n==_N,tempob,(hvalue)) drop tempob hvsum hvmin hvmax hvalue * endpoints adjusting gen yxtpol1=3*%_2[_n-2]-(2*%_2[_n-1]) gen yxtpol2=3*%_2[_n-1]-(2*%_2[_n-2]) gen lowyxtp=yxtpol1[4] gen hiyxtp=yxtpol2[_N] gen lowsum=lowyxtp+%_2[1]+%_2[2] gen lowmin=min(lowyxtp,%_2[1],%_2[2]) gen lowmax=max(lowyxtp,%_2[1],%_2[2]) gen lowend=lowsum-lowmin-lowmax gen hisum=hiyxtp+%_2[_N]+%_2[_N-1] gen himin=min(hiyxtp,%_2[_N],%_2[_N-1]) gen himax=max(hiyxtp,%_2[_N],%_2[_N-1]) gen hiend=hisum-himin-himax replace %_2=lowend if _n==1 replace %_2=hiend if _n==_N drop yxtpol1 yxtpol2 lowyxtp hiyxtp lowsum lowmin lowmax lowend drop hisum himin himax hiend * hanning gen tempoc=%_2 replace %_2=cond(_n==1 |_n==_N,tempoc,((tempoc[_n-1]/4)+(tempoc/2)+(tempoc[_n+1]/4))) drop tempoc index1 index2 tempo tempo2 %_1 label variable %_2 "4253eh resistant smooth" gen timendx=_n } end