*! version 3.0.0 05/29/92 running median utility /* replace newvar[n0..n1] with running medians span # of varname. timevar = 1, 2, ..., _N; data is in order of timevar */ program define nlsm_mu /* # varname newvar timevar n0 n1 */ version 3.0 local span `1' local v "`2'" local res "`3'" local time "`4'" local n0 `5' local n1 `6' quietly { if `span'==3 { local v0 "`v'[_n-1]" local v1 "`v'[_n+1]" #delimit ; replace `res'=cond( `v'<=max(`v1',`v0') & `v'>=min(`v1',`v0'),`v', cond( `v1'<=max(`v',`v0') & `v1'>=min(`v',`v0'),`v1', `v0')) in `n0'/`n1' ; #delimit cr exit } if `span'==2 { replace `res'=(`v'+`v'[_n+1])/2 in `n0'/`n1' exit } if int(`span'/2)*2!=`span' { /* odd */ local hs=int(`span'/2) local j `n0' while `j'<=`n1' { local j0=`j'-`hs' local j1=`j'+`hs' sort `v' in `j0'/`j1' local answ=`v'[`j'] sort `time' in `j0'/`j1' replace `res'=`answ' in `j' local j=`j'+1 } exit } /* even */ local hs1=int(`span'/2) local hs0=`hs1'-1 local j `n0' while `j'<=`n1' { local j0=`j'-`hs0' local j1=`j'+`hs1' sort `v' in `j0'/`j1' local answ=(`v'[`j']+`v'[`j'+1])/2 sort `time' in `j0'/`j1' replace `res'=`answ' in `j' local j=`j'+1 } } end