*! improved xtsum function *! based on stata xtsum version 1.0.7 04sep2000 program define xtsumcorr, rclass byable(recall) sort version 6 syntax [varlist] [if] [in] [, I(varname)] xt_iis `i' local ivar "`s(ivar)'" tempname N n Tbar mean sdo min max sdb sdw minb maxb minw maxw tempname sdocor sdbcor sdwcor rho tempname varocor sumbetwdiff2 sumalldiff2 numwithindiff sumwithindiff2 tempname varocor sumbd2 sumod2 numwd sumwd2 tempvar touse tu bv wv Ti mark `touse' `if' `in' di in smcl in gr _n "Variable" _skip(9) "{c |}" _skip(6) /* */ "Mean Std. Dev. Min Max {c |} Observations" /* */ _n "{hline 17}{c +}{hline 44}{c +}{hline 16}" sort `ivar' tokenize `varlist' while "`1'"!="" { quietly { gen byte `tu' = `touse' & `1'!=. summ `1' if `tu' scalar `N' = r(N) scalar `mean' = r(mean) scalar `sdo' = cond(`N'>1,sqrt(r(Var)),.) scalar `min' = r(min) scalar `max' = r(max) by `ivar': gen long `Ti' = /* */ cond(_n==_N,sum(cond(`tu',1,0)),.) by `ivar': gen double `bv'= cond(_n==_N, /* */ sum(cond(`tu',`1',0)) / `Ti', . ) summ `Ti' if `tu' * scalar `Tbar' = cond(r(mean)==.,0,r(mean)) if r(min)==r(max) { /* min == max */ local wrd " T" } else local wrd "T-bar" drop `Ti' by `ivar': gen double `wv' = /* */ cond(`tu',`1'-`bv'[_N], .) /* + `mean' */ } #delimit ; di in smcl in gr /* */ abbrev("`1'",8) _col(10) "overall {c |} " in ye %9.0g `mean' " " %9.0g `sdo' " " %9.0g `min' " " %9.0g `max' in gr " {c |}" _col(69) "N =" %8.0f `N' ; qui summ `bv' ; scalar `n' = r(N) ; scalar `sdb' = cond(`n'>1,sqrt(r(Var)),.) ; scalar `minb' = r(min) ; scalar `maxb' = r(max) ; * Now make between printout ; di in smcl in gr _col(10) "between {c |}" _col(31) in ye %9.0g `sdb' " " %9.0g `minb' " " %9.0g `maxb' in gr " {c |}" _col(69) "n =" %8.0f `n' ; qui summ `wv' ; scalar `sdw' = cond(r(N)>1,sqrt(r(Var)),.) ; scalar `minw' = r(min) + `mean' ; scalar `maxw' = r(max) + `mean' ; scalar `Tbar' = `N'/`n' ; * Now make within printout ; di in smcl in gr _col(10) "within {c |}" _col(31) in ye %9.0g `sdw' " " %9.0g `minw' " " %9.0g `maxw' in gr " {c |} `wrd' =" %8.0g `Tbar' ; * Now compute corrected between and within sd's ; * First get corrected sdo ; * Here calculating all within-subject squared differences and subtracting them from all squared differences ; preserve ; xtdiff `1' tmpdiff ; by `ivar': gen withinid = _n ; quietly reshape long tmpdiff , i(`ivar' withinid) j(lagf) ; quietly drop if (tmpdiff == .) ; quietly gen tmpdiff2 = tmpdiff*tmpdiff ; gen sumtmpdiff2=sum(tmpdiff2) ; scalar `sumwd2' = sumtmpdiff2[_N] ; scalar `numwd' = _N ; restore ; scalar `sumod2' = `sdo'*`sdo'*`N'*(`N'-1) ; scalar `sumbd2' = `sumod2' - `sumwd2' ; scalar `varocor' = `sumbd2'/ (2*(`N'*(`N'-1)/2 - `numwd')) ; scalar `sdocor' = sqrt(`varocor') ; scalar `sdwcor' = `sdw'*sqrt((`N'-1)/(`N'-`n')) ; scalar `sdbcor' = sqrt(`varocor' - `sdwcor'*`sdwcor') ; scalar `rho' = (`sdbcor'*`sdbcor')/(`varocor') ; * Now make corrected total and between and within printouts ; di in smcl in gr _col(4) "corr. total {c |}" _col(31) in ye %9.0g `sdocor' " " in gr " {c |}" ; di in smcl in gr _col(4) "corr. between {c |}" _col(31) in ye %9.0g `sdbcor' " " in gr " {c |}" ; di in smcl in gr _col(4) "corr. within {c |}" _col(31) in ye %9.0g `sdwcor' " " in gr " {c |}" ; di in smcl in gr _col(4) " rho {c |}" _col(31) in ye %6.0g `rho' " (betw. fract. of total)" in gr " {c |}" ; #delimit cr drop `wv' `bv' `tu' ret scalar N = `N' ret scalar n = `n' ret scalar Tbar = `Tbar' ret scalar mean = `mean' ret scalar sd = `sdo' ret scalar min = `min' ret scalar max = `max' ret scalar sd_b = `sdb' ret scalar min_b = `minb' ret scalar max_b = `maxb' ret scalar sd_w = `sdw' ret scalar min_w = `minw' ret scalar max_w = `maxw' ret scalar var_oc = `varocor' ret scalar sd_oc = `sdocor' ret scalar sd_bc = `sdbcor' ret scalar sd_wc = `sdwcor' * double saves scalar S_1 = `N' scalar S_2 = `n' scalar S_3 = `Tbar' scalar S_4 = `mean' scalar S_5 = `sdo' scalar S_6 = `min' scalar S_7 = `max' scalar S_8 = `sdb' scalar S_9 = `minb' scalar S_10= `maxb' scalar S_11 = `sdw' scalar S_12 = `minw' scalar S_13 = `maxw' scalar S_14 = `varocor' scalar S_15 = `sdocor' scalar S_16 = `sdbcor' scalar S_17 = `sdwcor' mac shift if "`1'"!="" { di in smcl in gr _col(18) "{c |}" _col(63) "{c |}" } } end exit