program define decomp * program to conduct a Blinder-Oaxaca decomposition of earnings. * Requires regression for subgroup of high wage persons to be * run first, followed by himod [,ds heck]. Then the regression for the * low wage persons, followed by lomod [,ds heck]. Then decomp is run. *! ver 1.7 8nov2010 - fixed bug regards estimation sample (was using means *! from full sample, now use wage equation sample means). *! Thanks to Anne Busch for drawing my attention to this. * ver 1.6 25jan05 - added Tobit correction & removed Heck option (now built-in) * ver 1.5 30sept04 - added Heckman option * ver 1.4 26nov02 - added weighting * ver 1.3 25july02 - fixed typo in himod and lomod * ver 1.2 4feb02 - changed output presentation * ver 1.1 14apr00 - original program developed version 8.2 syntax [,r] local varnms : rownames(locoef) local k=rowsof(locoef) local hiconstant=hicoef[`k',1] local loconstant=locoef[`k',1] local constantdiff=`hiconstant'-`loconstant' mat endowdiff=himean-lomean mat coefdiff=hicoef-locoef mat endow=J(`k',1,1) mat coeff=J(`k',1,1) local totalendow=0 local totalcoeff=0 if "`r'" ~="" { foreach c of numlist 1/`k'{ if `c'<`k'{ mat endow[`c',1]= endowdiff[`c',1]*locoef[`c',1] local totalendow=`totalendow'+endow[`c',1] mat coeff[`c',1]= coefdiff[`c',1]*himean[`c',1] local totalcoeff=`totalcoeff'+coeff[`c',1] } } } else { foreach c of numlist 1/`k'{ if `c'<`k'{ mat endow[`c',1]= endowdiff[`c',1]*hicoef[`c',1] local totalendow=`totalendow'+endow[`c',1] mat coeff[`c',1]= coefdiff[`c',1]*lomean[`c',1] local totalcoeff=`totalcoeff'+coeff[`c',1] } } } if "`r'" ~="" { di di di as text "DECOMPOSITION IS USING THE REVERSE METHOD" } mat attrib= endow+coeff mat results=attrib,endow,coeff mat colnames results=Attrib Endow Coeff di di as text "{title:Decomposition results for variables (as %s)}" di di as text "{hline 13}{c TT}{hline 40}" di as text "{ralign 12: Variable} {c |} {ralign 13: Attrib}" /* */ "{ralign 12: Endow} {ralign 13: Coeff}" di as text "{hline 13}{c +}{hline 40}" local j=`k'-1 foreach r of numlist 1/`j'{ local varnm: word `r' of `varnms' local varnm=abbrev("`varnm'",15) di as text "{ralign 12:`varnm'} {c |} {col 20}" /* */ as result %9.1f results[`r',1] *100 "{col 32}" /* */ as result %9.1f results[`r',2] *100 "{col 46}" /* */ as result %9.1f results[`r',3] * 100 } di as text "{hline 13}{c +}{hline 40}" di as text "{ralign 12:Subtotal} {c |} {col 20}" /* */ as result %9.1f (`totalendow'+`totalcoeff')*100 "{col 32}" /* */ as result %9.1f `totalendow'*100 "{col 46}" /* */ as result %9.1f `totalcoeff'*100 di as text "{hline 13}{c BT}{hline 40}" di di di di as text "{title:Summary of decomposition results (as %)}" di di as text "{hline 33}{c TT}{hline 9}" di as text "{lalign 32:Amount attributable:} {c |}" /* */ as result %9.1f (`totalendow'+`totalcoeff')*100 di as text "{lalign 32:- due to endowments (E):} {c |}" /* */ as result %9.1f `totalendow'*100 di as text "{lalign 32:- due to coefficients (C):} {c |}" /* */ as result %9.1f `totalcoeff'*100 di as text "{lalign 32:Shift coefficient (U):} {c |}" /* */ as result %9.1f `constantdiff'*100 di as text "{lalign 32:Raw differential (R) {E+C+U}:} {c |}" /* */ as result %9.1f (`totalendow'+`totalcoeff'+`constantdiff')*100 di as text "{lalign 32:Adjusted differential (D) {C+U}:} {c |}" /* */ as result %9.1f (`totalcoeff'+`constantdiff')*100 di as text "{hline 33}{c +}{hline 9}" di as text "{lalign 32:Endowments as % total (E/R):} {c |}" /* */ as result %9.1f (`totalendow'/(`totalendow'+`totalcoeff'+`constantdiff'))*100 di as text "{lalign 32:Discrimination as % total (D/R):} {c |}" /* */ as result %9.1f ((`totalcoeff'+`constantdiff')/(`totalendow'+`totalcoeff'+`constantdiff'))*100 di as text "{hline 33}{c BT}{hline 9}" di di as text " U = unexplained portion of differential" di as text " (difference between model constants)" di as text " D = portion due to discrimination (C+U)" di di as text " positive number indicates advantage to high group" di as text " negative number indicates advantage to low group" end