*! version 1 <03oct2013> Oscar Barriga Cabanillas *! version 2 <05Nov2013> Oscar Barriga Cabanillas *Changes in the name and in correction on the if option *! version 3 <05MAY2014> Oscar Barriga Cabanillas *Changes name and adds option OVER *! version 3.1 <20MAY2014> Oscar Barriga Cabanillas *Verifies variable in period is numerical *! version 4 <27MAY2014> Oscar Barriga Cabanillas *Changes display options *! version 5 <21JUL2014> Oscar Barriga Cabanillas *Display option improved *! version 5.1 <01OCT2014> Oscar Barriga Cabanillas *Disaggregate options updated program define prosperity, rclass tempname R7325 tempname X700 tempname GB version 10.0 syntax varlist(numeric) /// [aweight fweight pweight] /// [if] [, /// PERiod(string) /// OVER(string) /// BOTTom(string) /// DISaggregate(string) /// varpl(string) /// line(string) /// INDEPENDENTLY /// EXPort(string) /// FILename(string) /// FORmat(string) /// SHOWWHO /// ] // Verifies necessary commands are installed cap which apoverty loc error_c = _rc if `error_c' != 0 { qui: cap ssc install apoverty loc error_i = _rc if `error_i' == 0 { noi di in y "apoverty command added to the library" } else { noi di in y "apoverty command is needed but could not be automatically installed" } } cap which quantiles loc error_c = _rc if `error_c' != 0 { qui: cap ssc install quantiles loc error_i = _rc if `error_i' == 0 { noi di in y "quantiles command added to the library" } else { noi di in y "quantiles command is needed but could not be automatically installed" } } tempvar sirve // Defines observations to be used if "`over'" != "" { loc over1 : word 1 of `over' loc over2 : word 2 of `over' if "`if'" == "" loc cond_i = "if" if "`if'" != "" loc cond_i = "&" mark `sirve' `if' `cond_i' (`period' == `over1' | `period' == `over2') // Defines observations to be used taking into account option over } else { mark `sirve' `if' // Defines observations to be used if option over IS NOT used } qui: tempvar count qui: gen `count' = 1 if `sirve' loc income = "`varlist'" // local with the information on the income variable loc weight "`weight'`exp'" // local with the information on the weights loc var `1' local wvar : word 2 of `exp' if "`bottom'" != "" & ("`varpl'" != "" | "`line'" != "") { noi di in red "Options bottom and poverty measures cannot be used simultaneously " error } * if "`varpl'" != "" & "`line'" != "" { noi di in red "poverty measures cannot be used simultaneously " error } * if "`independently'" == "independently" & "`disaggregate'" == ""{ noi di in red "independently option is meant to be used with disaggregate options" error } * loc type_0 : type `period' // the variable used in period must be numerical loc type_1 = substr("`type_0'",1,3) if "`type_1'" == "str" { noi di in red "variable used in period must be numerical" error } qui : su `period' if `count' == 1 & `sirve' // Defines the locals for the two periods of the calculation loc y0 = r(min) loc y1 = r(max) if "`bottom'" == "" & ("`varpl'" == "" | "`line'" == "") { loc bottom = 40 // Default option is calculate the growth of the bottom 40 } * // Defines poverty rates when poverty options are used if "`varpl'" != "" { qui: apoverty `income' [`weight'] if `period' == `y0' & `sirve' , varpl(`varpl') loc bottom = round(`r(head_1)',0.2) } * if "`line'" != "" { qui: apoverty `income' [`weight'] if `period' == `y0' & `sirve' , line(`line') loc bottom = round(`r(head_1)',0.2) } * if "`disaggregate'" != "" { qui: levelsof `disaggregate', loc(area) loc count_disag = wordcount("`area'") } else { loc area = "tot" } * if "`period'" == "" { noi di in red "the years or the calculations have to be defined" error } * qui: ta `period' if `count' == 1 & `sirve' if r(r) > 2 { if wordcount("`over'") != . { noi di in red "only two different years accepted, option over() should be used" error } if wordcount("`over'") != 2 { noi di in red "only two different years can be used in over() option" error } } if r(r) < 2 { noi di in red "only one year defined" error } * * Generate temporary file to save results if "`export'" == "" & ("`filename'" != "" | "`format'" != "" ) { noi di in red "When using filename or format options export must be used " error } * if "`export'" != "" { qui: tempname p qui: tempfile fileaux if "`disaggregate'" != "" { postfile `p' str10(Year1 Year2 Mean_initial_Total Mean_initial_Bottom Mean_final_Total Mean_final_Bottom total_growth Bottom_growth disaggregation Bottom) using `fileaux', replace } else { postfile `p' str10(Year1 Year2 Mean_initial_Total Mean_initial_Bottom Mean_final_Total Mean_final_Bottom total_growth Bottom_growth Bottom) using `fileaux', replace } } * * For the overall sample loc list_var = "_pctile0 _pctile1 " foreach var of loc list_var { cap confirm variable `var' loc error = _rc if `error' == 0 { noi di in red "variable `var' already in the dataset" noi di in red "prosperity needs variable `var' to be renamed" error } } qui : quantiles `income' [`weight'] if `period' == `y0' & `sirve' , nq(100) gen(_pctile0) qui : quantiles `income' [`weight'] if `period' == `y1' & `sirve' , nq(100) gen(_pctile1) qui :su `income' [`weight'] if `period' == `y0' & `sirve' loc b0 =r(mean) qui :su `income' [`weight'] if `period' == `y0' & inrange(_pctile0,0,`bottom') & `sirve' loc a0 =r(mean) qui :su `income' [`weight'] if `period' == `y1' & `sirve' loc b1 =r(mean) qui :su `income' [`weight'] if `period'== `y1' & inrange(_pctile1,0,`bottom') & `sirve' loc a1 =r(mean) loc growth_tot = ((`b1'/`b0')^(1/(`y1'-`y0'))-1)*100 loc growth_bottom = ((`a1'/`a0')^(1/(`y1'-`y0'))-1)*100 if ("`disaggregate'" == "" ) { mat `R7325' = nullmat(`R7325'), `y0' , `y1' , `b0', `a0', `b1' , `a1' , `growth_tot' , `growth_bottom' , `bottom' } else { mat `R7325' = nullmat(`R7325'), `y0' , `y1' , `b0', `a0', `b1' , `a1' , `growth_tot' , `growth_bottom' , 999999, `bottom' } * if "`export'" != "" { if "`disaggregate'" == "" { post `p' ("`y0'") ("`y1'") ("`b0'") ("`a0'") ("`b1'") ("`a1'") ("`growth_tot'") ("`growth_bottom'") ("`bottom'") //saving information } else { post `p' ("`y0'") ("`y1'") ("`b0'") ("`a0'") ("`b1'") ("`a1'") ("`growth_tot'") ("`growth_bottom'") ("999999") ("`bottom'") //saving information } } * * For disaggregate option if "`disaggregate'" != "" { foreach reg of loc area { loc ifo_r = " & `disaggregate' == `reg'" if "`independently'" != "" { if "`varpl'" != "" { qui: apoverty `income' [`weight'] if `period' == `y0' `ifo_r' & `sirve' , varpl(`varpl') loc bottom = r(head_1) } if "`line'" != "" { qui: apoverty `income' [`weight'] if `period' == `y0' `ifo_r' & `sirve' , line(`line') loc bottom = r(head_1) } } * test that disaggregate are in every year qui: su `count' if `disaggregate' == `reg' & `period' == `y0' & `sirve' if `r(N)' == 0 { noi di in red "`disaggregate' in `reg' not defined in period `y0'" error } qui: su `count' if `disaggregate' == `reg' & `period' == `y1' & `sirve' if `r(N)' == 0 { noi di in red "`disaggregate' in `reg' not defined in period `y1'" error } * loc list_var _pctile0_`reg' _pctile1_`reg' foreach var of loc list_var { cap confirm variable `var' loc error = _rc if `error' == 0 { noi di in red "variable `var' already in the dataset" noi di in red "prosperity needs variable `var' to be renamed" error } } qui : quantiles `income' [`weight'] if `period' == `y0' `ifo_r' & `sirve' , nq(100) gen(_pctile0_`reg') qui : quantiles `income' [`weight'] if `period' == `y1' `ifo_r' & `sirve' , nq(100) gen(_pctile1_`reg') qui :su `income' [`weight'] if `period' == `y0' `ifo_r' & `sirve' loc b0 =r(mean) qui :su `income' [`weight'] if `period' == `y0' & inrange(_pctile0_`reg',0,`bottom') `ifo_r' & `sirve' loc a0 =r(mean) qui :su `income' [`weight'] if `period' == `y1' `ifo_r' & `sirve' loc b1 =r(mean) qui : su `income' [`weight'] if `period' == `y1' & inrange(_pctile1_`reg',0,`bottom') `ifo_r' & `sirve' loc a1 =r(mean) loc growth_tot = ((`b1'/`b0')^(1/(`y1'-`y0'))-1)*100 loc growth_bottom = ((`a1'/`a0')^(1/(`y1'-`y0'))-1)*100 mat `R7325' = nullmat(`R7325') \ (`y0' , `y1' , `b0', `a0', `b1' , `a1' , `growth_tot' , `growth_bottom' , `reg' , `bottom') if "`export'" != "" { post `p' ("`y0'") ("`y1'") ("`b0'") ("`a0'") ("`b1'") ("`a1'") ("`growth_tot'") ("`growth_bottom'") ("`reg'") ("`bottom'") //saving information } } } * mat `GB' = `R7325'' * Displays and export results if export option is used preserve noi di as txt _new "Shared Prosperity Indicator" noi di as txt "Annualized growth rate for the bottom `bottom' of the population between `y0'-`y1'" mat list `GB' qui { drop _all svmat double `GB' tempvar n gen `n' =_n drop if `n' == 1 drop if `n' == 2 drop if `n' == 9 cap drop if `n' == 10 label define n 3 "Initial mean income" 4 "Final mean income" 5 "Initial mean income" 6 "Final mean income" 7 "Overall" 8 "Bottom `bottom'" label values `n' n gen groups = . replace groups = 1 if inlist(`n',3,5) replace groups = 2 if inlist(`n',4,6) replace groups = 3 if inrange(`n',7,8) label define groups 1 "Overall population:" 2 "Bottom `bottom':" 3 "Annualized growth rate" label values groups groups label var `n' "period" label var groups "Results by population" ren `GB'1 National if "`disaggregate'" == "" { noi tabdisp `n' , cellvar(National) by(groups) concise format(%10.2f) } else { * defines the number of tables to be used, taking into account they can only display up to 5 results at the time loc list_1 = "National" loc list_control = 1 loc ++count_disag forvalues disg = 2(1)`count_disag' { loc C_`disg' = `disg'-1 label var `GB'`disg' "Sublevel `C_`disg''" if wordcount("`list_`list_control''") >= 5 { loc ++list_control } loc list_`list_control' = "`list_`list_control'' `GB'`disg'" } forvalues d = 1(1)`list_control' { noi tabdisp `n' , cellvar( `list_`d'' ) by(groups) concise format(%10.2f) } } } if "`export'" != "" { postclose `p' qui : use `fileaux', clear qui: destring, replace if "`disaggregate'" != "" { qui: label define disaggregation 999999 "National aggregate" qui: label values disaggregation disaggregation } if "`filename'" == "" { loc filename = "Shared_prosperity" } if ("`format'" == "xls") | ("`format'" == "excel") | ("`format'" == "Excel") { qui : export excel using "`export'/`filename'.xlsx" , first(variable) replace } else { qui : save "`export'/`filename'.dta", replace } } * restore if ("`showwho'" == "") { drop _pctile* } return matrix table = `GB' return scalar year1 = `y0' return scalar year2 = `y1' return local Bottom = `bottom' end exit