** ADO FILE FOR FISCAL IMPOVERISHMENT AND GAINS OF THE POOR STAND ALONE COMMANDS ** VERSION AND NOTES (changes between versions described under CHANGES) ** v1.0 19jun2017 *! (beta version; please report any bugs), written by Sean Higgins sean.higgins@ceqinstitute.org ** CHANGES // BEGIN _fifgp (Higgins 2017) // Calculates fiscal impoverishemnt and fiscal gains of the poor // measures for a specific poverty line and two income concepts capture program drop _fi_fgp program define _fi_fgp, rclass #delimit ; syntax varlist(min=2 max=2) [aweight pweight], z(string) [ TOTal PERcapita NORMalized KAPPa(real -1) NORATio HEADcount /*Total Decompositon */ DEComp ] ; #delimit cr local y0 = word("`varlist'",1) local y1 = word("`varlist'",2) tempvar t_fi t_fg qui gen double `t_fi' = min(`y0',`z') - min(`y0',`y1',`z') qui gen double `t_fg' = min(`y1',`z') - min(`y0',`y1',`z') if "`exp'" != "" { local aw "[aw `exp']" } /* Calulating main results*/ tempvar tot_fi tot_fg foreach name in fi fg { if "`total'"!="" { qui summ `t_`name'' `aw' , detail return scalar _`name' = r(sum) qui gen double `tot_`name'' = `t_`name'' } if "`percapita'"!="" { qui summ `t_`name'' `aw' return scalar _`name' = r(mean) qui gen double `tot_`name'' = `t_`name'' } if "`normalized'"!="" { qui gen double `tot_`name'' = `t_`name'' / `z' qui summ `tot_`name'' `aw', meanonly return scalar _`name' = r(mean) } if (`kappa' != -1) { qui gen double `tot_`name'' = `kappa'*`t_`name'' qui summ `tot_`name'' `aw' return scalar _`name' = r(sum) } } /* Calculating % fi of fgp */ if ("`headcount'" == "" & "`noratio'" == "") { qui summ `tot_fi' `aw' local fi_tot = r(sum) qui summ `tot_fg' `aw' local fg_tot = r(sum) return scalar _fifg_rat = (`fi_tot' / `fg_tot') } /* Calculating Headcount */ if "`headcount'" !="" { tempvar h_fi h_fg qui gen double `h_fi' = (`y1' < `y0' & `y1' < `z') qui gen double `h_fg' = (`y0' < `y1' & `y0' < `z') qui summ `h_fi' `aw', meanonly return scalar _h_fi = r(mean) qui summ `h_fg' `aw', meanonly return scalar _h_fg = r(mean) } /* Demcop results */ if "`decomp'" != "" { tempvar p_fi p_fg i_fi i_fg p0 p1 qui gen double `p0' = `z' - min(`y0',`z') // individual's pre-fisc poverty gap qui gen double `p1' = `z' - min(`y1',`z') // individual's post-fisc poverty gap //Marc: If total is called we want these p0 p1. ** Total post/pre - fisc pover gap if "`total'" !="" { qui sum `p0' `aw' return scalar _p0 = r(sum) qui sum `p1' `aw' return scalar _p1 = r(sum) } if "`percapita'"!="" { qui sum `p0' `aw' return scalar _p0 = r(mean) qui sum `p1' `aw' return scalar _p1 = r(mean) } if "`normalized'"!="" { tempvar p0_z p1_z qui gen double `p0_z' = `p0' / `z' qui gen double `p1_z' = `p1' / `z' qui sum `p0_z' `aw' return scalar _p0 = r(mean) qui sum `p1_z' `aw' return scalar _p1 = r(mean) } if (`kappa' != -1) { tempvar p0_k p1_k qui gen double `p0_k' = `kappa'*`p0' qui summ `p0_k' `aw' return scalar _p0 = r(sum) qui gen double `p1_k' = `kappa'*`p1' return scalar _p1 = r(sum) } } end // END _fi_fgp // BEGIN _fifgp (Higgins 2017) // Calculates fiscal impoverishemnt and fiscal gains of the poor // measures for a specific poverty line and two income concepts capture program drop fi_fgp program define fi_fgp, rclass #delimit ; syntax varlist(min=2 max=2) [if] [in] [aweight pweight/], z(string) [ /* ppp values */ PPP(real -1) CPISurvey(real -1) CPIBase(real -1) YEARly MOnthly DAily /*scalar values */ TOTal PERcapita NORMalized KAPpa(real -1) NORATio HEADcount /*Total Decompositon */ DEComp /*Household size*/ HHouse INDidivid DISPLAYInd hhsize(real -1) /*Graph Options*/ precision(real 0.01) path(string) graphname(string) scheme(string) /** DROP MISSING VALUES */ IGNOREMissing ] ; #delimit cr version 13 ********** ** LOCALS * ********** ** parse subcommand gettoken subcmd 0: 0 if substr("`subcmd'",1,2)=="graph" { // fiscal impoverishment fi_fgp_graph `0' } else { if "`kappa'" != "" { local k = "kappa(`kappa')" } local options z(`z') `total' `percapita' `normalized' `k' `headcount' `decomp' ** general programming locals local dit display as text in smcl local die display as error in smcl local command fi_fgp local version 1.0 `dit' "Running version `version' of `command' on `c(current_date)' at `c(current_time)'" _n " (please report this information if reporting a bug to seanhiggins@berkeley.edu)" ************************ ** PRESERVE AND MODIFY * ************************ preserve if wordcount("`if' `in'")!=0 quietly keep `if' `in' ** make sure all newly generated variables are in double format set type double ****************** ** PARSE OPTIONS * ****************** ** Check if all income and fisc variables are in double format local inctypewarn foreach var of local varlist { if "`var'"!="" { local vartype: type `var' if "`vartype'"!="double" { if wordcount("`inctypewarn'")>0 local inctypewarn `inctypewarn', `var' else local inctypewarn `var' } } } if wordcount("`inctypewarn'")>0 `dit' "Warning: Income variable(s) `inctypewarn' not stored in double format. This may lead to substantial discrepancies in the MWB due to rounding error." ** income or fisical interventions varialbes local y0 = word("`varlist'",1) local y1 = word("`varlist'",2) local alllist y0 y1 ** missing income concepts foreach var of local alllist { qui count if missing(``var'') if "`ignoremissing'"=="" { if r(N) { `die' "Missing values not allowed; `r(N)' missing values of ``var'' found" exit 198 } } else { if r(N) { qui drop if missing(``var'') `dit' "Warning: `r(N)' observations that are missing ``var'' were dropped because the user specified {bf:ignoremissing}" local warning `warning' "Warning: `r(N)' observations that are missing ``var'' were dropped because the user specified the ignoremissing option." } } } if ( wordcount("`total' `percapita' `normalized' `headcount'")>1 | (`kappa' !=-1 & wordcount("`total' `percapita' `normalized' `headcount'")>0)) { `die' "{bf:kappa}, {bf:total}, {bf:percapita}, or {bf:normalized} options are exclusive" exit 198 } if (`kappa' == -1 & wordcount("`total' `percapita' `normalized' `headcount'")==0) { `die' "One of {bf:kappa},{bf:total}, {bf:percapita}, or {bf:normalized} options must be specified" exit 198 } ** ppp conversion if (`ppp'==-1 & `cpisurvey'==-1 & `cpibase'==-1) { local _ppp = 0 `dit' "{bf:ppp}, {bf:cpisurvey}, {bf:cpibase} options aren't selected. Variables are assumed to be in ppp dollars per day" } else local _ppp = 1 if (`_ppp' & min(`ppp',`cpisurvey',`cpibase')==-1) { `die' "To convert to PPP, must provide {bf:ppp}, {bf:cpisurvey}, and {bf:cpibase} options" exit 198 } if ((`_ppp'==0) & (wordcount("`daily' `monthly' `yearly'")>0)) { `die' "{bf:daily}, {bf:monthly}, or {bf:yearly} options require use of {bf:ppp}, {bf:cpisurvey}, and {bf:cpibase}" exit 198 } if ((`_ppp' == 1) & (wordcount("`daily' `monthly' `yearly'")==0)) { `dit' "Warning: {bf:daily}, {bf:monthly}, or {bf:yearly} options not specified; variables assumed to be in {bf:yearly} units" local yearly yearly } if (wordcount("`daily' `monthly' `yearly'")>1) { `die' "{bf:daily}, {bf:monthly}, and {bf:yearly} options are exclusive" exit 198 } if ("`daily'"!="") local divideby = 1 else if ("`monthly'"!="") local divideby = 365/12 else if ("`yearly'"!="") local divideby = 365 ** Weights if "`individ'" !="" & "`displayind'" != "" { `dit' "Warning: {bf:displayind} and {bf:individ} we're both called. Check that data is at household level or remove option {bf:displayind}" } if "`displayind'" !="" &`hhsize' == -1 { `die' "{bf:displayind} requires {bf:hhsize}" exit 198 } if "`exp'" != "" { if "`hhouse'" !="" & "`displayind'" != "" { tempvar hhweights gen double `hhweights' = `exp'*`hhsize' local aw "[aweight = `hhweights']" } else { local aw "[aweight = `exp']" } } ** PPP converted variables if (`_ppp') { local ppp_calculated = `ppp'*(`cpisurvey'/`cpibase') foreach v of local alllist { tempvar `v'_ppp qui gen ``v'_ppp' = (``v''/`divideby')*(1/`ppp_calculated') } } else { foreach v of local alllist { tempvar `v'_ppp qui gen ``v'_ppp' = ``v'' } } ** Calculating FI and FGP #delimit ; _fi_fgp `y0_ppp' `y1_ppp' `aw', `options' ; #delimit cr return scalar fi = `r(_fi)' return scalar fg = `r(_fg)' if ("`headcount'" == "" & "`noratio'" == "") { return scalar fifg_rat = `r(_fifg_rat)' } if "`headcount'" !="" { return scalar h_fi = `r(_h_fi)' return scalar h_fg = `r(_h_fg)' } if "`decomp'" !="" { return scalar p0 = `r(_p0)' return scalar p1 = `r(_p1)' local __p1 = `r(_p1)' local __p0 = `r(_p0)' local __fi = `r(_fi)' local __fg = `r(_fg)' local pgap = `r(_p1)' - `r(_p0)' local fifgp =`r(_fi)' - `r(_fg)' return scalar diff_pgap = `pgap' return scalar diff_fifpg = `fifgp' tempname table .`table' = ._tab.new, col(4) separator(0) lmargin(0) .`table'.width 16 16 16 16 .`table'.strcolor yellow yellow yellow yellow .`table'.numcolor yellow yellow yellow yellow .`table'.numfmt %16s %16.5f %16s %16.5f .`table'.sep, top .`table'.titles "" "Decomposition of fiscal intervention:" "" "" scalar r11 = "p0 = " scalar r13 = "FGP = " scalar r21 = "p1 = " scalar r23 = "FI = " scalar r31 = "p1 - p0 = " scalar r33 = "FI - FGP = " .`table'.sep, mid .`table'.row r11 `__p0' r13 `__fg' .`table'.row r21 `__p1' r23 `__fi' .`table'.row r31 `pgap' r33 `fifgp' .`table'.sep,bot } } end // END fi_fgp