** oppincidence.ado *! version 1.1 skh 7aug2016 ** Created July 2012 ** Sean Higgins; shiggins@tulane.edu capture program drop mld program mld, rclass ** mean log deviation version 10.0 syntax varlist(min=1 max=1 numeric) [if] [in] [aweight fweight iweight] quietly summ `varlist' `if' `in' [`weight' `exp'] local mean_`varlist' = r(mean) tempvar ld quietly gen `ld' = ln(`mean_`varlist''/`varlist') quietly summ `ld' `if' `in' [`weight' `exp'] return scalar mld = `r(mean)' end capture program drop oppincidence program oppincidence, rclass ** opportunity-adjusted fiscal incidence version 10.0 syntax varlist(numeric) [if] [in] [aweight fweight iweight] , GRoupby(varlist) ** varlist is the list of income variables (eg market, net market, disposable, post-fisal, final) ** groupby is the list of categorical variables that define the different types preserve marksample touse quietly drop if `touse'==0 ** question: what to do with zero incomes? ** for now I drop incomes that are zero for any income definition, because ln(0) does not exist ** and I want the same observations to be used for mean log deviation of each income definition foreach income in `varlist' { quietly drop if `income'<=0 } quietly sort `groupby' tempvar type egen `type' = group(`groupby') // now `type' is a categorical var with a distinct value for each type // eg, everyone with {female, black, graduate, urban} would have type==1, // everyone with {female, black, graduate, rural} would have type==2, etc quietly summ `type' local Ngroup = r(max) foreach income in `varlist' { tempvar smoothed_`income' // this is the mean for `income' by type quietly gen `smoothed_`income''=. ** note: I had to do the following round-about way to calculate mean incomes by type ** because egen `smoothed_`income'' = mean(`income'), by(`type') does not appear to allow weights forval i = 1/`Ngroup' { quietly summ `income' if `type'==`i' [`weight' `exp'] quietly replace `smoothed_`income'' = `r(mean)' if `type'==`i' } ** mean log deviation for smoothed distribution: mld `smoothed_`income'' [`weight' `exp'] scalar mld_`income'_smoothed = r(mld) ** mean log deviation for actual distribution: mld `income' [`weight' `exp'] scalar mld_`income' = r(mld) ** ratio of smoothed distribution inequality to actual inequality: scalar mldratio_`income' = mld_`income'_smoothed/mld_`income' } ** Display and store results: local n_income = wordcount("`varlist'") tokenize `varlist' tempname levels ratios matrix `levels' = J(`n_income',1,.) matrix `ratios' = J(`n_income',1,.) forval i=1/`n_income' { matrix `levels'[`i',1] = mld_``i''_smoothed matrix `ratios'[`i',1] = mldratio_``i'' } local title_levels "In levels (MLD of smoothed distribution)" local title_ratios "In ratios (MLD of smoothed/MLD of actual)" foreach mat in levels ratios { matrix rownames ``mat'' = `varlist' matrix colnames ``mat'' = "Ineq of Opp" matlist ``mat'', title("`title_`mat''") format(%11.5f) border(all) /// twidth(14) rowtitle("Income concept") return matrix `mat' = ``mat'' } restore end