*! STB-6: smv4 *! Version 3.0 program define manova version 3.0 local varlist "req ex min(3)" local if "opt" local in "opt" local options "`options' Matrix" parse "`*'" parse "`varlist'", parse(" ") local sfn "S_FN" tempfile USER qui save `USER', replace cap { /* Begin capture block */ if "`if'`in'"~="" { keep `if'`in'} qui { dropmiss `varlist' count local origobs=_result(1) sum `1' local numgrps=_result(6) local wmata = 0 local wmatd = 0 local wmatbc = 0 local sumsuma = 0 local sumsumb = 0 local sumsqa = 0 local sumsqb = 0 local sumcp = 0 tempvar i gen `i'=0 while `i'<`numgrps' { local i=`i'+1 tempvar dpv1`i' dpvc`i' dpva`i' dpvb`i' dpsqa`i' dpsqb`i' dpcp`i' count if `1'==`i' gen `dpvc`i''=_result(1) /* count per group */ egen `dpva`i'' = sum(`2') if `1'==`i' /* sum var 1 */ egen `dpsqa`i''= sum(`2'^2) if `1'==`i' /* sum sq var 1 */ egen `dpvb`i'' = sum(`3') if `1'==`i' /* sum var 2 */ egen `dpsqb`i''= sum(`3'^2) if `1'==`i' /* sum sq var 2 up */ egen `dpcp`i'' = sum(`2'*`3') if `1'==`i' /* sum cross prod */ /* W Matrix calculations */ local wa = `dpsqa`i''-((`dpva`i'')^2/`dpvc`i'') local wmata=`wa'+ `wmata' local wd = `dpsqb`i''-((`dpvb`i'')^2/`dpvc`i'') local wmatd = `wd'+ `wmatd' local wbbc = `dpcp`i'' - ((`dpva`i'' * `dpvb`i'')/`dpvc`i'') local wmatbc = `wbbc' + `wmatbc' /* T Matrix preliminary calculations */ local sumsuma = `dpva`i'' + `sumsuma' local sumsumb = `dpvb`i'' + `sumsumb' local sumsqa = `dpsqa`i'' + `sumsqa' local sumsqb = `dpsqb`i'' + `sumsqb' local sumcp = `dpcp`i'' + `sumcp' } /* T matrix final calculations */ local tmata = `sumsqa' - ((`sumsuma'^2)/`origobs') local tmatd = `sumsqb' - ((`sumsumb'^2)/`origobs') local tmatbc = `sumcp' - ((`sumsuma' * `sumsumb')/`origobs') /* Determinants & Lambda */ local detw = (`wmata'*`wmatd') - (`wmatbc'^2) local dett = (`tmata'*`tmatd') - (`tmatbc'^2) local lambda = `detw'/`dett' #delimit ; local f = ((1-sqrt(`lambda'))/sqrt(`lambda')) * ((`origobs'-`numgrps'-1)/(`numgrps'-1)); #delimit cr local df1 = 2*(`numgrps'-1) local df2 = 2*(`origobs'-`numgrps'-1) if `numgrps'==2 { local f = ((1-`lambda')* (`origobs'-3)/`lambda' )/2 local df1 = 2 local df2 = `origobs'-3 } local hss1 = `tmata'-`wmata' local hss2 = `tmatd'-`wmatd' local hms1 = `hss1'/(`numgrps'-1) local hms2 = `hss2'/(`numgrps'-1) local ems1 = `wmata'/(`origobs'-`numgrps') local ems2 = `wmatd'/(`origobs'-`numgrps') local f1 = `hms1'/`ems1' local f2 = `hms2'/`ems2' local mdf = `origobs'-`numgrps' local prob1 = fprob(`numgrps'-1,`mdf',`f1') local prob2 = fprob(`numgrps'-1,`mdf',`f2') local dfmod = `numgrps'-1 } } di _n(1) _col(16) in gr "Oneway Multivariate Analysis of Variance" #delimit ; di _n(1) _col(8) in gr "Number of obs in model = " in ye `origobs' _col(44) in gr "Number of groups = " in ye `numgrps'; di _col(8) in gr "Model degrees freedom = " in ye "`dfmod',`mdf'"; di _n(1) _col(2) in gr "Variable | HypSS ErrSS HypMS ErrMS F Prob>F"; di in gr _dup(70) "-"; di _col(2) in gr "`2'" _col(11) "|" in ye %9.4f _col(13) `hss1' %9.4f _col(24) `wmata' %9.4f _col(35) `hms1' %9.4f _col(45) `ems1' %7.2f _col(55) `f1' %5.4f _col(65) `prob1' ; di _col(2) in gr "`3'" _col(11) "|" in ye %9.4f _col(13) `hss2' %9.4f _col(24) `wmatd' %9.4f _col(35) `hms2' %9.4f _col(45) `ems2' %7.2f _col(55) `f2' %5.4f _col(65) `prob2' ; di in gr _dup(70) "_"; di in gr _col(2) "Wilk's lambda (df:`df1',`df2') = " in ye %9.4f _col(30) `lambda' %7.2f _col(55) `f' %5.4f _col(65) fprob(`df1',`df2',`f'); #delimit cr if "`matrix'"!= "" { di _n(1) di in gr _col(5) "W matrix" di %9.4f _col(25) `wmata' %9.4f _col(40) `wmatbc' di %9.4f _col(25) `wmatbc' %9.4f _col(40) `wmatd' di in gr _col(5) "T matrix" di %9.4f _col(25) `tmata' %9.4f _col(40) `tmatbc' di %9.4f _col(25) `tmatbc' %9.4f _col(40) `tmatd' di _n(1) #delimit ; di in gr _col(2) "W determinant = " in ye %9.4f `detw' in gr _col(42) "T determinant = " in ye %9.4f _col(59) `dett'; #delimit cr } local rc=_rc qui use `USER', clear mac def S_FN "`sfn'" erase `USER' error `rc' end capture program drop dropmiss program define dropmiss version 3.0 local varlist "req ex min(3)" parse "`*'" parse "`varlist'", parse(" ") while "`1'"~="" { drop if `1'==. mac shift } end