*! version 1.2.2 NJC 29 April 1998 STB-44 sg85 * version 1.2.1 NJC 20 March 1998 * version 1.1.0 NJC 4 Feb 1998 program define movsumm version 5.0 local varlist "req ex max(1)" local if "opt" local in "opt" local weight "fweight aweight" local options "Window(int 3) Gen(str) Result(int 0) End Mid" local options "`options' Binomial OWeight(str) WRAP" parse "`*'" if `window' < 2 { di in r "window length must be at least 2" exit 198 } if "`binomia'" != "" & "`weight'" != "" { di in r "binomial cannot be combined with weight" exit 198 } if "`oweight'" != "" & "`weight'" != "" { di in r "oweight cannot be combined with weight" exit 198 } if "`oweight'" != "" & "`binomia'" != "" { di in r "oweight cannot be combined with binomial" exit 198 } if "`oweight'" != "" { local nowt : word count `oweight' if `window' != `nowt' { di in r "number of weights not equal to window length" exit 198 } } if `result' < 1 | `result' > 18 { di in r "invalid result( )" exit 198 } else if `result' >= 7 & `result' < 18 { local detail "detail" } else if `result' != 4 { local novar "meanonly" } if "`gen'" == "" { di in r "gen( ) not specified" exit 198 } else { confirm new variable `gen' qui gen `gen' = . } tempvar touse mark `touse' `if' `in' local k = `window' if "`wrap'" != "" { local nb "nobreak" } `nb' { if "`wrap'" != "" { tempvar order expand gen `order' = _n local nend = int(`k'/2) local N = _N local N1 = _N + 1 local N2 = _N + `nend' qui expand 1 + (`order' <= `nend' | (`order' > (`N'- `nend'))) qui replace `order' = `order' - `N' in -`nend'/l qui replace `order' = `order' + `N' in `N1'/`N2' gen `expand' = _n > `N' sort `order' } if "`binomia'" != "" | "`oweight'" != "" { tempvar w wt qui gen `w' = . local i 1 if "`binomia'" != "" { while `i' <= `k' { qui replace `w' = comb(`k'-1, `i'-1) in `i' local i = `i' + 1 } } else { while `i' <= `k' { local owt : word `i' of `oweight' qui replace `w' = `owt' in `i' local i = `i' + 1 } } qui gen `wt' = . local weight "aweight" local exp "= `wt'" } if (mod(`window',2) == 0 & "`mid'" != "mid") | "`end'" == "end" { local j = `window' local jlast = _N } else { local j = int((`window' + 2)/2) local jlast = _N - `j' + 1 + (mod(`window',2) == 0) } local i = 1 while `j' <= `jlast' { if "`binomia'" != "" | "`oweight'" != "" { qui replace `wt' = `w'[_n - `i' + 1] in `i'/`k' } qui su `varlist' [`weight'`exp'] in `i'/`k' if `touse' , /* */ `detail' `novar' qui replace `gen' = _result(`result') in `j' local i = `i' + 1 local j = `j' + 1 local k = `k' + 1 } if "`wrap'" != "" { qui drop if `expand' } } end