/* utility routines used by stats */ capt prog drop _STScoun prog define _STScoun version 2.1 %_1 replace %_2=sum(%_2~=.) %_1 replace %_2=%_2[_N] end capt prog drop _STSmean prog define _STSmean version 2.1 %_1 replace %_2=sum(%_2)/sum(%_2~=.) %_1 replace %_2=%_2[_N] end capt prog drop _STSmedi prog define _STSmedi version 2.1 mac def _byvar = substr("%_1",4,length("%_1")-4) sort %_byvar %_2 %_1 gen long _CNT=sum(%_2~=.) %_1 replace %_2=(%_2[(_CNT[_N]+1)/2]+%_2[(_CNT[_N]+2)/2])/2 if _n==_N %_1 replace %_2=%_2[_N] drop _CNT end capt prog drop _STSvar prog define _STSvar version 2.1 %_1 gen long _CNT=sum(%_2~=.) %_1 gen _MEAN=sum(%_2)/_CNT[_N] %_1 replace %_2=sum((%_2-_MEAN[_N])^2) %_1 replace %_2=cond(_CNT[_N]>1,%_2[_N]/(_CNT[_N]-1),.) drop _CNT _MEAN end capt prog drop _STSsdev prog define _STSsdev version 2.1 %_1 gen long _CNT=sum(%_2~=.) %_1 gen _MEAN=sum(%_2)/_CNT[_N] %_1 replace %_2=sum((%_2-_MEAN[_N])^2) %_1 replace %_2=cond(_CNT[_N]>1,sqrt(%_2[_N]/(_CNT[_N]-1)),.) drop _CNT _MEAN end capt prog drop _STSmin prog define _STSmin version 2.1 %_1 replace %_2=min(%_2,%_2[_n-1]) if _n>1 %_1 replace %_2=%_2[_N] end capt prog drop _STSmax prog define _STSmax version 2.1 %_1 replace %_2=max(%_2,%_2[_n-1]) if %_2[_n-1]~=. %_1 replace %_2=%_2[_N] end capt prog drop _STSrang prog define _STSrang version 2.1 gen _COPY = %_2 %_1 replace _COPY=min(_COPY,_COPY[_n-1]) if _n>1 %_1 replace %_2 =max(%_2,%_2[_n-1]) if %_2[_n-1]~=. %_1 replace %_2=%_2[_N]-_COPY[_N] drop _COPY end capt prog drop _STSsum prog define _STSsum version 2.1 %_1 gen _CNT = sum(%_2~=.) %_1 replace %_2=sum(%_2)*_CNT[_N]/_CNT[_N] %_1 replace %_2=%_2[_N] drop _CNT end capt prog drop _STSlf prog define _STSlf version 2.1 mac def _byvar = substr("%_1",4,length("%_1")-4) sort %_byvar %_2 %_1 gen long _CNT=sum(%_2~=.) mac def _D1 "((int((_CNT[_N]+1)/2)+1)/2)" mac def _D2 "((int((_CNT[_N]+1)/2)+2)/2)" %_1 replace %_2 = (%_2[%_D1]+%_2[%_D2])/2 if _n==_N %_1 replace %_2=%_2[_N] drop _CNT end capt prog drop _STSuf prog define _STSuf version 2.1 mac def _byvar = substr("%_1",4,length("%_1")-4) sort %_byvar %_2 %_1 gen long _CNT=sum(%_2~=.) mac def _D0 "(int((_CNT[_N]+1)/2)/2)" mac def _D1 "((int((_CNT[_N]+1)/2)+1)/2)" %_1 replace %_2 = /* */ (%_2[_CNT[_N]+1-%_D0]+%_2[_CNT[_N]+1-%_D1])/2 if _n==_N %_1 replace %_2=%_2[_N] drop _CNT end capt prog drop _STSdf prog define _STSdf version 2.1 mac def _byvar = substr("%_1",4,length("%_1")-4) sort %_byvar %_2 %_1 gen long _CNT=sum(%_2~=.) mac def _D0 "(int((_CNT[_N]+1)/2)/2)" mac def _D1 "((int((_CNT[_N]+1)/2)+1)/2)" mac def _D2 "((int((_CNT[_N]+1)/2)+2)/2)" %_1 replace %_2 = /* */ ((%_2[_CNT[_N]+1-%_D0]+%_2[_CNT[_N]+1-%_D1])/2) /* */ - ((%_2[%_D1]+%_2[%_D2])/2) if _n==_N %_1 replace %_2=%_2[_N] drop _CNT end capt prog drop _STSperc prog define _STSperc version 2.1 capt conf number %_3 if _rc>0 { replace %_2 = . } else if ~(%_3>0 & %_3<100) { replace %_2 = . } else { mac def _byvar = substr("%_1",4,length("%_1")-4) sort %_byvar %_2 %_1 gen long _CNT=sum(%_2~=.) mac def _Rp _CNT[_N]*%_3/100 mac def _Ip int(%_Rp+1.00001) %_1 replace %_2 = cond(%_Ip-%_Rp>=1,(%_2[%_Ip]+%_2[%_Ip-1])/2 /* */ , %_2[%_Ip] ) if _n==_N %_1 replace %_2 = %_2[_N] drop _CNT } end /* top level program */ capt prog drop stats prog define stats version 2.1 if "%_*"=="" { di in red "invalid syntax -- see help stats" exit 198 } /* parsing input */ mac def _varlist "req ex" mac def _options /* */ "BY(str) noDescr COLlapse noWarning Keep(str) COUnt MEAn MEDian Var *" mac def _if "opt" mac def _in "opt" parse "%_*" mac def _varl "%_varlist" mac def _if1 "%_if" mac def _in1 "%_in" mac def _varlist "" mac def _if "" mac def _in "" mac def _REST = ", "+"%_options" mac def _options "SDev MIn MAx Range SUm LF UF DF Perc(str)" parse "%_REST" mac def _byvar "%_by" if "%_by"=="" { mac def _by "" } else { mac def _by = "by " + "%_by" + ":" } /* check on input faults */ if "%_options"~="" { di in red "%_options not allowed -- see help stats" exit 198 } if "%_byvar"+"%_keep"~="" { conf var %_byvar %_keep } /* warning for destroying data */ if "%_warning"=="" & "%_collaps"~="" { di in red "Warning: " in bl "Data in memory will be destroyed." di _col(10) in bl /* */ "Press any key to continue, Ctrl-Break to abort." more } set out err #del ; mac def _type1 "count" ; mac def _pref1 "CT" ; mac def _type2 "mean" ; mac def _pref2 "MN" ; mac def _type3 "median" ; mac def _pref3 "MD" ; mac def _type4 "var" ; mac def _pref4 "VR" ; mac def _type5 "sdev" ; mac def _pref5 "SD" ; mac def _type6 "min" ; mac def _pref6 "MI" ; mac def _type7 "max" ; mac def _pref7 "MA" ; mac def _type8 "range" ; mac def _pref8 "RG" ; mac def _type9 "sum" ; mac def _pref9 "SM" ; mac def _type10 "lf" ; mac def _pref10 "LF" ; mac def _type11 "uf" ; mac def _pref11 "UF" ; mac def _type12 "df" ; mac def _pref12 "DF" ; mac def _type13 "perc" ; mac def _pref13 "PT" ; #del cr /* default statistic setting */ if "%_count"+"%_mean"+"%_median"+"%_var"+"%_sdev"+"%_min"+"%_max" /* */ +"%_range"+"%_sum"+"%_lf"+"%_uf"+"%_df"+"%_perc"=="" { mac def _mean "mean" } capt { gen int _S_E_L = 1 %_if1 %_in1 cap sort %_byvar parse "%_varl" , parse(" ") while "%_1"~="" { /* statistics for variable %_1 */ mac def _tp = 0 while %_tp < 13 { mac def _tp = %_tp + 1 mac def _type "_type%_tp" mac def _ctype "_%%_type" if "%%_ctype"~="" { /* create statistic _type */ mac def _pref "_pref%_tp" mac def _vname = substr("%%_pref%_1",1,8) cap noisily conf new var %_vname if _rc==0 { gen %_vname = %_1 if _S_E_L==1 mac def _STS = substr("_STS%%_type",1,8) %_STS "%_by" %_vname %_perc lab var %_vname "%%_type %_1 %_by" } } } mac shift } /* collapse dataset if wanted */ if "%_collaps"~="" { gen _L_A_S_T = . keep %_byvar %_keep _S_E_L - _L_A_S_T %_by drop if _n<_N } /* describe new dataset if wanted */ cap drop _S_E_L cap drop _L_A_S_T if "%_descr"=="" { noisily descr } } cap drop _S_E_L end