*! version 1.2.0 2mar2003 E. Leuven program define spellsplit version 7 syntax [anything], spell(varlist min=2 max=2) [ by(varlist)] tokenize `spell' local date0 `1' local date1 `2' local f0 : format `date0' local f1 : format `date1' /* set default statistic */ local current "mean" gettoken left anything : anything, match(prns) while "`left'"!="" { if "`prns'"!="" { if !inlist("`left'","mean","sum") { di as error "Statistic `left' not supported" exit 198 } local current "`left'" } else { local `current'vars ``current'vars' `left' } gettoken left anything : anything, match(prns) } if ("`meanvars'"!="") { confirm var `meanvars' unab meanvars : `meanvars' } if ("`sumvars'"!="") { confirm var `sumvars' unab sumvars : `sumvars' } quietly { g _count = 1 local xvars `meanvars' `sumvars' _count /* create dummy by-var if no by option is specified */ if "`by'"=="" { tempvar by g byte `by' = 1 } tempvar `xvars' `by' /* create negative for subtraction when spell ends */ cap foreach v of varlist `xvars' { g double ``v'' = -`v' local txvars `txvars' ``v'' } cap foreach v of varlist `by' { g double ``v'' = `v' local txvars `txvars' ``v'' } stack `date0' `xvars' `by' `date1' `txvars', into(`date0' `xvars' `by') clear /* calculate totals per date */ cap foreach v of varlist `xvars' { egen double ``v'' = sum(`v'), by(`by' `date0') } /* unique dates only */ by `by' `date0', sort: keep if _n==1 /* calculate totals (+ when spell starts - when ends) */ sort `by' cap foreach v of varlist `xvars' { by `by': replace `v' = sum(``v'') } by `by': g `date1' = `date0'[_n + 1] drop if `date0'>`date1' drop _stack drop if _count==0 order `by' `date0' `date1' `xvars' format `date0' `f0' format `date1' `f1' cap for var `meanvars': replace X = X/_count compress } end