* Isograph V1.1 2017-04-25 * module to implement the new ISO measure of inequality, a local Gini across the income scale * Authors: Louis Chauvel and Eyal Bar-Haim Req: Stata version 13 * Created: 2016-10-18 * Use: isograph var [weight=weight var], [repeats(#)] [seed(#)] [span(#)] capt mata mata which mm_which() if _rc==111 ssc install moremata capture which abg if _rc==111 ssc install abg capture which gsample if _rc==111 ssc install gsample program define isograph, rclass version 13 syntax varlist [aweight fweight pweight] [if] [in] [, repeats(real 0) seed(real 123) span(real 3)] marksample touse tempvar toto *di "preserving" preserve qui { local revabc : word 1 of `varlist' if "`weight'" == "" gen `toto' = 1 else gen `toto' `exp' su `toto',d gsample 100 [weight=`toto'] if `touse', percent if (`repeats' > 0) { noi isoboot `revabc' [weight=`toto'], span(`span') repeats(`repeats') seed(`seed') } else { zboot `revabc' [weight=`toto'] , span(`span') } } ******** ******** ******** ******** mat def isograph=r(isograph) matrix colnames isograph = "x" "ISO" "Lower bound" "Upper bound" matlist isograph, left(20) names(c) title("Isograph for `varlist'") tind(20) bor(all) aligncolnames(c) for(%12.0g) return matrix isograph=isograph restore end program _isograph, rclass sortpreserve version 10.0 syntax varlist(numeric ts) [aweight fweight pweight] [if] [in] , GENIso(string) GENLogitx(string) qui { tempvar temprev xtemp lxtemp ltemprev ytemp lytemp rll y tempname A B V marksample touse local revabc : word 1 of `varlist' gen `temprev'= `revabc' if `touse' *replace temprev = 0 if temprev==. & `touse' replace `temprev' = `temprev' +runiform()*.000001 if `touse' gen `geniso'=. gen `genlogitx' =. sort `temprev' tempvar toto if "`weight'" == "" & `touse' gen `toto' = 1 else gen `toto' `exp' if `touse' sort `temprev' replace `temprev'=(`temprev'+`temprev'[_n+1]+`temprev'[_n+1])/3 if _n>1 & _n<_N gen `xtemp' = sum(`toto') if `touse' su `xtemp' [w =`toto'] if `touse' replace `xtemp'=(`xtemp'/r(max)) if `touse' su `xtemp' [w =`toto'] if `touse' replace `xtemp'=((`xtemp'-r(min)/2)/r(max)) if `touse' gen `lxtemp' =ln(`xtemp'/(1-`xtemp')) if `touse' gen `lytemp'=ln(`temprev') reg `lytemp' `lxtemp' [w =`toto'] if `touse' & abs(`lxtemp')<.25 mat C=e(b) replace `lytemp'=`lytemp'-C[1,2] if `touse' gen `ytemp'=exp(`lytemp') if `touse' replace `geniso' =`lytemp'/`lxtemp' if `touse' replace `genlogitx' =`lxtemp' if `touse' } end program zboot, rclass sortpreserve syntax varlist(numeric ts) [aweight fweight pweight] [if] [in] [, span(real 3) ] marksample touse preserve tempname A B V tempvar Yvar tempvar hw1 tempvar Iso tempvar Lri tempvar rll tempvar Rll tempvar toto qui{ if "`weight'" == "" & `touse' gen `toto' = 1 else gen `toto' `exp' if `touse' su `toto' local revabc : word 1 of `varlist' di "`revabc'" _isograph `revabc' , geniso(`Iso') genlogitx(`Lri') gen `Yvar'=`Iso'*`Lri' su `Yvar' gen `rll'=round(`Lri',.5) if `touse' su `Lri' replace `rll' =. if abs(`rll')>`span' & `touse' ta `rll' gen `Rll'=`rll' mat `A'=J(r(r),4,.) mat li `A' local i=0 levelsof `rll', local(levels) foreach l of local levels { local i=`i'+1 di `rll' "L:" `l' "RLL" `Rll' su `Yvar' if `l'==`Rll' if `r(N)'!=0 { reg `Yvar' `Lri' [pw =`toto'] if `l'==`Rll' & `touse' , nocons mat `B'=e(b) mat `V'=e(V) mat `A'[`i',1]=`l' mat `A'[`i',2]=`B'[1,1] mat `A'[`i',3]=`B'[1,1]-2*sqrt(`V'[1,1]) mat `A'[`i',4]=`B'[1,1]+2*sqrt(`V'[1,1]) } } return matrix isograph=`A' } end program isoboot, rclass version 10.0 syntax varlist(numeric ts) [aweight fweight pweight] [if] [in][, repeats(real 50) seed(real 123) span(real 3)] marksample touse local revabc : word 1 of `varlist' tempvar toto qui{ *di `span' loc mspan=-`span' loc pspan=`mspan'+0.5 loc cn=1 tempname A preserve if "`weight'" == "" & `touse' gen `toto' = 1 else gen `toto' `exp' if `touse' local listy=" " *di "`listy'" local nsam=`span'*4+1 mat `A'=J(`nsam',4,.) *di `nsam' forval i=1 2 to `nsam' { *di `i' loc listy="`listy'iso`i'=r(iso`i') " } } simulate `listy', reps(`repeats') seed(`seed'): lboot `revabc', span(`span') forval t=`mspan' `pspan' to `span'{ qui su iso`cn' *di `cn' mat `A'[`cn',1]=`t' mat `A'[`cn',2]= r(mean) mat `A'[`cn',3]=r(mean)-2*(r(sd)) mat `A'[`cn',4]=r(mean)+2*(r(sd)) local cn=`cn'+1 } restore return matrix isograph=`A' end