*! version 3.0.0 06/01/92 nlsm S program define nlsm_s /* varname newvar */ local varlist "`1'" local generat "`2'" local z `varlist' local type : type `z' tempvar res res2 quietly { gen `type' `res' = `z' local t 3 while `t'<=_N-2 { if (`z'[`t']==`z'[`t'+1]) { local u=`t'+1 local s1=sign(`z'[`t']-`z'[`t'-1]) if `s1'==sign(`z'[`u']-`z'[`u'+1]) & `s1' { nlsm_epu `z'[`t'-2] `z'[`t'-1] `z'[`t'] replace `res'=$S_1 in `t' nlsm_epu `z'[`u'+2] `z'[`u'+1] `z'[`u'] replace `res'=$S_1 in `u' } } local t=`t'+1 } } nlsm_rpt "nlsm_m 3" `res' `res2' rename `res2' `generat' end exit /* for any data sequence {..., y[t-2], y[t-1], y[t], y[u], y[u+1], ...}, where u=t+1, and its smooth given by 3R {..., z[t-2], z[t-1], z[t], z[u], z[u+1], ...}, whereever z[t]==z[u] and sign(z[t]-z[t-1])=sign(z[u]-z[u+1]!=0, replace z[t] by med{3z[t-1]-2*z[t-2],z[t],z[t-1]} (nlsm_epu(z[t-2],z[t-1],z[t]) and z[u] by med{3z[u+1]-2*z[u+2],z[u],z[u+1]} (nlsm_epu(z[u+2],z[u+1],z[u]) Finally, resmooth by 3R. This is usually repeated once (SS) or until no further changes take place (SR). */