** ADO FILE FOR EFFECTIVENESS SHEET OF CEQ OUTPUT TABLES
** VERSION AND NOTES (changes between versions described under CHANGES)
*! v1.13 22feb2022
*! v1.12 16oct2020
** v1.11 23jul2020
** v1.10 30jun2018
** v1.9 11feb2018 For use with Aug 2017 version of Output Tables
** v1.8 04dec2017 For use with Aug 2017 version of Output Tables
** v1.7 28nov2017 For use with Aug 2017 version of Output Tables
** v1.6 14aug2017 For use with July 2017 version of Output Tables
** v1.5 20jul2017 For use with July 2017 version of Output Tables
** v1.4 21may2017 For use with Apr 2017 version of Output Tables
** v1.3 03may2017 For use with Jul 2016 version of Output Tables
** v1.2 03jan2016 For use with Jul 2016 version of Output Tables
** (beta version; please report any bugs), written by Rodrigo Aranda raranda@tulane.edu
** CHANGES
** v1.13 Using semicolumns as delimiters created problems with comments in some Stata versions.
** Added comments with * instead of /*.
** v1.12 Added lines to print poverty lines in MWB
** v1.11 Adding return to output of _ceqspend sub-program and fixed issue with tempvar S
** Adjusted _ceqspend sub-program to Ali's excel file and to new formulas
** Including sorting at the beginning of ceqbensp sub-program and fixed issue with local
** Fixed typos in calculations and formulas of IE indicator for poverty
** Fixed typos in calculations of IE indicator for inequality
** Fixed algorithm for IE indicator for inequality for combined system
** Fixed calculation in main program of SE indicator for inequality when there is only taxes
** Added missing if that was altering the number of matched braces
** Fixed issue with id_taxharm variable in ceqtaxharm sub-program
** Fixed issue with scalar in ceqbensp sub-program
** Eliminated conditions on ginis to calculate Spending Effectiveness indicators
** Fixed typos in calculation of Spending Effectiveness indicators for inequality
** Added an if clause so that the program does not calcute Beckerman Imervoll if ppp option is not specified
** Updated PPP conversion factors to 2011-PPP era
** Added consideration of special case for optimal tax in ceqtaxstar sub-program
** Eliminated calculations:
** 1. Net Income to Gross Income
** 2. Any Income concept to Taxable Income
** 3. Taxable Income to any income concept
** v1.10 Fixed ystar_ppp issue, (#50 on Github)
** v1.9 Modified ceqbensp to use Ali's formula
** v1.8 Including warning for when fiscal intervention options are not specified.
** v1.7 Mofidied _ceqspend to use Ali's formula.
** v1.6 Including warnings for IE, when sum of programs exceeds starting income.
** Modifying ceqtaxharm
** Removed tempvar int_ben and int_tax due to redunacy
** Change who is messaged in case of error.
** v1.5 Replacing covgini with covconc and modifiying ceq(tax/ben)star to be more efficient.
** Adjusting _fifgpmc removing marginal contributions of tax and benefits, uses only contribution of FI and FGP to effectivness.
** v1.2 Added Spending effectiveness, changes in Spillover so it shows in Excel, FI/FGP results available for all income concepts
** v1.3 Updated to produce no results for FI/FGP per capita and normalized per capita effectiveness indicator
** Fix the national poverty line specification to include both variables and scalar condition for Beckerman
** Add the weight local in subcommands
** v1.4 Add option flexibility for income concept and fiscal interventions
** NOTES
** No spending effectiveness. Results are not feasible for poverty using the whole system.
** TO DO
** See if other indicators can be used (or even make sense) for the system such as s-gini, 90/10, theil, etc.
************************
* PRELIMINARY PROGRAMS *
************************
#delimit cr
// BEGIN returncol (Higgins 2015)
// Returns Excel column corresponding to a number
cap program drop returncol
program define returncol, rclass
confirm integer number `1'
mata: st_strscalar("col",numtobase26(`1'))
return local col = col
end // END returncol
* Program to compute Gini coefficient;* GINI USING COVARIANCE FORMULA
* Makes two adjustments relative to the "naive" approach:
* first is to multiply by (N-1)/N to adjust for the fact that Stata uses sample covariance
* second is to estimate F(y) using Lerman and Yitzhaki (1989); weighted fractional ranks would give biased estimate
* With these two adjustments, covgini gives same answer as Gini commands based on
* discrete formulas to 9 decimal places
// BEGIN _fifgpmc (Edited from _fifgp, Higgins 2015)
// Calculates fiscal impoverishemnt and fiscal gains of the poor
// measures for a specific poverty line and two income concepts
capture program drop _fifgpmc
program define _fifgpmc,rclass
#delimit;
syntax [if] [in] [aw] [,
z(string)
taxes(varname)
benef(varname)
startinc(varname)
endinc(varname)
];
#delimit cr
if wordcount("`taxes'")==0{
tempvar taxes
gen `taxes'=0
}
if wordcount("`benef'")==0{
tempvar benef
gen `benef'=0
}
tempvar notax noben
qui gen double `notax'=`endinc'+`taxes'
qui gen double `noben'=`endinc'-`benef'
*total taxes and transfers;
sum `taxes' [`weight' `exp']
local T=abs(r(sum))
sum `benef' [`weight' `exp']
local B=r(sum)
local TB=`T'+`B'
tempvar d_fi d_fg
qui gen `d_fi' = min(`startinc',`z') - min(`startinc',`endinc',`z')
*qui gen `d_fi_t' = min(`notax',`z') - min(`notax',`endinc',`z')
* qui gen `d_fi' = min(`y0',`z') - min(`y0',`y1',`z')
*qui gen `d_fg' = min(`y1',`z') - min(`y0',`y1',`z')
qui gen `d_fg' = min(`endinc',`z') - min(`startinc',`endinc',`z')
*qui gen `d_fg_b' = min(`endinc',`z') - min(`noben',`endinc',`z')
foreach v in fi fg {
qui summ `d_`v'' [`weight' `exp'], meanonly
local t_`v' = r(sum)
local pc_`v' = r(mean)
local n_`v' = r(mean)/`z'
}
*Marginal contributions
foreach m in t pc n{
*local `m'_mc_t=``m'_fi'-``m'_fi_t'
*local `m'_mc_b=``m'_fg_b'-``m'_fg'
if `T'!=0 /*& (``m'_mc_t'>=0 & ``m'_mc_t'!=0)*/{
local mceft_`m'=(`T'/`TB')*(1-(``m'_fi'/`T'))
}
else{
local mceft_`m'=0
}
if `B'!=0 /*& (``m'_mc_b'>=0 & ``m'_mc_b'!=.)*/{
local mcefb_`m'=(`B'/`TB')*((``m'_fg'/`B'))
}
else{
local mcefb_`m'=0
}
*local MCEF_`m'=`mceft_`m''+`mcefb_`m''
*scalar MCEF_`m'=`mceft_`m''+`mcefb_`m''
return scalar MCEF_`m' = `mceft_`m''+`mcefb_`m''
}
end // END _fifgpmc
* Program to compute ideal tax for impact effectiveness
*generates income variable (ytaxstar) whith ideal taxes
*rest of observations have no tax income
*var taxstar has the ideal tax for those obs. rest is missing
cap program drop ceqtaxstar
program define ceqtaxstar, rclass
#delimit;
syntax [if] [in] [pw aw iw fw/] [,
/*Incomes*/
startinc(varname)
endinc(varname)
taxes(varname)
]
;
#delimit cr
if "`exp'" == "" {
local exp = 1
}
cap drop ___startinc
gen double ___startinc = `startinc'
cap drop ___taxes
gen double ___taxes = `taxes'
gsort -___startinc
replace ___taxes = abs(___taxes)
qui sum ___taxes [aw=`exp']
local tot=r(sum) //total amount to redistribute
qui sum ___startinc [aw=`exp']
if (`tot' > r(sum) | `tot' == 0 ) {
if `tot' > r(sum) return scalar t_gr = 1
if `tot' == 0 return scalar t_0 = 1
exit
}
else {
// Taking the difference of income b/w one person and then previous
gen double ___diff_y = ___startinc - ___startinc[_n-1]
recode ___diff_y (.=0)
gen double ___cum_w = sum(`exp')
gen double ___diff_y_i = ___diff_y*___cum_w[_n-1]
recode ___diff_y_i (.=0)
gen double ___cum_diff_y_i = sum(___diff_y_i)
local tot2=abs(___cum_diff_y_i[_N])
if (`tot'>`tot2') { // Considering special case - June 24,2020
return scalar t_N=1
gen ___taxed = (abs(___cum_diff_y_i) < abs(___cum_diff_y_i[_N]))
gen ___last_taxed = ___taxed==1 & ___taxed[_n+1]==0
gen ___id = _n
sum ___id if ___last_taxed== 1
assert r(min)==r(max)
local which = r(mean) // Giving observation of which person is taxed.
// Generating optimal tax
gen double ____taxstar = 0
replace ____taxstar = ___startinc - ___startinc[`which'] if ___taxed==1
local still_tax = abs(___cum_diff_y_i[_N]) - abs(___cum_diff_y_i[`which'])
local still_tax_per_person = `still_tax' / ___cum_w[`which']
replace ____taxstar = ____taxstar + `still_tax_per_person' if ___taxed==1
local dif=`tot'- abs(___cum_diff_y_i[_N])
local dif_per_person=`dif'/___cum_w[_N]
replace ____taxstar = ____taxstar + `dif_per_person'
replace ___taxed=1
}
else {
// Determining who is taxed.
gen ___taxed = (abs(___cum_diff_y_i) < `tot')
gen ___last_taxed = ___taxed==1 & ___taxed[_n+1]==0
gen ___id = _n
sum ___id if ___last_taxed== 1
assert r(min)==r(max)
local which = r(mean) // Giving observation of which person is taxed.
// Generating optimal tax
gen double ____taxstar = 0
replace ____taxstar = ___startinc - ___startinc[`which'] if ___taxed==1
local still_tax = `tot' - abs(___cum_diff_y_i[`which'])
local still_tax_per_person = `still_tax' / ___cum_w[`which']
replace ____taxstar = ____taxstar + `still_tax_per_person' if ___taxed==1
}
sum ____taxstar [aw=`exp']
nois assert abs((`tot' - `r(sum)')/`tot') < 0.0001
// Ensuring that we are allocating the exact amount of tax available
*assert round(`tot',.1) == round(r(sum),.1)
// Generating optimal income
cap drop ____id_taxstar
cap drop ____ytaxstar
gen double ____ytaxstar = ___startinc
replace ____ytaxstar = ____ytaxstar - ____taxstar if ___taxed == 1
gen ____id_taxstar = ___taxed
return scalar twarn = 0
drop ___taxed ___last_taxed ____taxstar ___diff_y ___diff_y_i ///
___cum_diff_y_i ___cum_w ___id
}
drop ___startinc ___taxes
end
* Program to compute ideal transfer for impact effectiveness
*generates income variable (ybenstar) whith ideal transfers
*rest of observations have no transfer income
*var benstar has the ideal transfers for those obs. rest is missing
cap program drop ceqbenstar
program define ceqbenstar, rclass
#delimit;
syntax [if] [in] [pw aw iw fw/] [,
/*Incomes*/
startinc(varname)
endinc(varname)
ben(varname)
]
;
#delimit cr
if "`exp'" == "" {
local exp = 1
}
cap drop ___startinc
gen double ___startinc = `startinc'
cap drop ___ben
gen double ___ben = `ben'
sort ___startinc
qui sum ___ben [aw=`exp']
local tot=r(sum) //total amount to redistribute
qui sum ___startinc [aw=`exp']
if (`tot' > r(sum) | `tot' == 0 ) {
if `tot' > r(sum) return scalar b_gr = 1
if `tot' == 0 return scalar b_0 = 1
exit
}
else {
// Taking the difference of income b/w one person and then previous
gen double ___diff_y = ___startinc - ___startinc[_n-1]
recode ___diff_y (.=0)
gen double ___cum_w = sum(`exp')
gen double ___diff_y_i = ___diff_y*___cum_w[_n-1]
recode ___diff_y_i (.=0)
gen double ___cum_diff_y_i = sum(___diff_y_i)
// Determining who is taxed.
gen ___gets_ben = (abs(___cum_diff_y_i) < `tot')
gen ___last_rec = ___gets_ben==1 & ___gets_ben[_n+1]==0
gen ___id = _n
sum ___id if ___last_rec== 1
assert r(min)==r(max)
local which = r(mean) // Giving observation of which person is taxed.
gen double ____benstar = 0
replace ____benstar = `startinc'[`which'] - `startinc' if ___gets_ben==1
local still_ben = `tot' - abs(___cum_diff_y_i[`which'])
local still_ben_per_person = `still_ben' / ___cum_w[`which']
replace ____benstar = ____benstar + `still_ben_per_person' if ___gets_ben==1
sum ____benstar [aw=`exp']
// Ensuring that we how allocating the exact amount of benefits available
*nois assert round(`tot',.1) == round(r(sum),.1)
nois assert abs((`tot' - r(sum))/`tot') < 0.0001
cap drop ____id_benstar
cap drop ____ybenstar
gen double ____ybenstar = `startinc'
replace ____ybenstar = ____ybenstar + ____benstar if ___gets_ben == 1
gen ____id_benstar = ___gets_ben
return scalar bwarn = 0
drop ___gets_ben ___last_rec ____benstar ___diff_y ___diff_y_i ///
___cum_diff_y_i ___cum_w ___id
}
drop ___startinc ___ben
end
* Program to compute harm tax formula for poverty impact effectiveness
*generates income variable (ytaxharm) whith ideal taxes
*rest of observations have no tax income
*var taxharm has the harm tax for those obs. rest is missing
cap program drop ceqtaxharm
program define ceqtaxharm, rclass
#delimit;
syntax [if] [in] [pw aw iw fw/] [,
/*Incomes*/
endinc(varname)
taxes(varname)
]
;
#delimit cr
if "`exp'" !="" {
local aw = "[aw = `exp']" //weights
local pw = "[pw = `exp']"
}
else {
tempvar ww
gen `ww' = 1
}
*no taxes income
cap drop ___ww
gen double ___ww = `exp'
cap drop ___notax
gen double ___notax =`endinc'+abs(`taxes')
cap drop ___taxes
gen double ___taxes = `taxes'
sort ___notax
qui sum ___taxes `aw'
local tot= abs(r(sum)) //total amount to redistribute
qui sum ___notax `aw'
if `tot' > r(sum) { ;
return scalar thwarn = 1
exit
}
else {
gen double ___inc_wght= ___notax*___ww
gen double ___cum_inc_wght = sum(___inc_wght)
gen ___taxed = ___cum_inc_wght < abs(`tot')
gen ___new_inc = ___notax
replace ___new_inc = 0 if ___taxed == 1
gen ___last_taxed = 1 if ___taxed == 1 & ___taxed[_n+1] == 0
gen ___id = _n
sum ___id if ___last_taxed == 1
//pause will this assertion breakus? here is r(N)
assert r(N) ==1
local which = r(mean)
scalar remainder = abs(`tot') - ___cum_inc_wght[`which']
//pause or is it this
assert remainder > 0 & remainder < ___cum_inc_wght[`which' + 1]
replace ___new_inc = ___notax - (remainder/___ww) in `=`which' + 1'
cap drop ___taxstar
gen double ___taxstar = ___notax - ___new_inc
sum ___taxstar `aw'
local rsum = r(sum)
// Ensuring harm tax is equal to amount avaible to tax
local tax1 = round(`tot',.1)
local tax2 = round(`rsum',.1)
assert (abs((`tax1'-`tax2')/`tax1') < 0.00001)
cap drop ____id_taxharm
cap drop ____ytaxharm
gen double ____id_taxharm=___taxed
replace ____id_taxharm=1 in `=`which' + 1' // It was not considering the last one taxed - April 7th, 2020
gen double ____ytaxharm=___new_inc
return scalar thwarn = 0
cap drop ___id ___notax ___inc_wght ___cum_inc_wght ___taxed ___last_taxed ___new_inc
}
cap drop ___taxes ___notax ___ww
end
***Marginal contribution ID
cap program drop _ceqmcid
program define _ceqmcid, rclass
#delimit;
syntax [if] [in] [pw aw iw fw/] [,
/*Incomes*/
inc(varname)
sptax(varname)
spben(varname)
pline(string)
]
;
#delimit cr
if "`exp'" !="" {
local aw = "[aw = `exp']" //weights
local pw = "[pw = `exp']"
}
local id_tax=0
local id_ben=0
tempvar inter
*See if we are dealing with taxes or transfers
if wordcount("`sptax'")>0{
local id_tax=1
gen double `inter'=abs(`sptax')
}
if wordcount("`spben'")>0{
local id_ben=1
gen double `inter'=abs(`spben')
}
if `id_tax'==1{
tempvar o_inc
gen double `o_inc'=`inc'+`inter'
}
if `id_ben'==1{
tempvar o_inc
gen double `o_inc'=`inc'-`inter'
}
*gini final income
covconc `inc' `pw'
local g_f=r(gini)
covconc `o_inc' `pw'
local g_o=r(gini)
local mc=`g_o'-`g_f'
return scalar mc_ineq = `mc' //Marginal Contribution
if wordcount("`pline'")>0{
tempvar pov0_o pov1_o pov2_o
tempvar pov0_f pov1_f pov2_f
gen `pov0_o'=(`o_inc'<`pline')
gen `pov0_f'=(`inc'<`pline')
qui gen `pov1_o' = max((`pline'-`o_inc')/`pline',0) // normalized povety gap of each individual
qui gen `pov2_o' = `pov1_o'^2
qui gen `pov1_f' = max((`pline'-`inc')/`pline',0) // normalized povety gap of each individual
qui gen `pov2_f' = `pov1_f'^2
forvalues f=0/2{
qui sum `pov`f'_o' `aw'
local p`f'_o=r(mean)
qui sum `pov`f'_f' `aw'
local p`f'_f=r(mean)
local mc`f'=`p`f'_o'-`p`f'_f'
return scalar mc_p`f'=`mc`f'' //Marginal Contribution of poverty fgt:`f'
}
}
end
****Spending Effectiveness program;
cap program drop _ceqspend
program define _ceqspend, rclass
#delimit;
syntax [if] [in] [pw aw iw fw/] [,
/*Incomes*/
inc(varname)
sptax(varname)
spben(varname)
]
;
#delimit cr
// note variable names represent column names in Effectives_SE Cal.xlsx in Methods folder of CEQStataPackage shared dropbox folder
local id_tax=0
local id_ben=0
set type double
*See if we are dealing with taxes or transfers
tempvar G
qui gen double `G' = `inc'
if wordcount("`sptax'")>0{
local id_tax=1
tempvar F E
qui gen double `F'=abs(`sptax')
qui gen double `E' = `G'+ `F'
}
if wordcount("`spben'")>0{
local id_ben=1
tempvar F E
qui gen double `F' =abs(`spben')
qui gen double `E' = `G'-`F'
}
if `id_ben' == 1 {
sort `E' // Because we are dealing with benefits
tempvar C D
qui sum `exp'
qui gen double `C' = `exp'/r(sum) // normalizing the weights
qui gen double `D' = sum(`C') // culmative sum of weights
tempvar B
qui gen int `B' = _n // generating observation number, ith person
tempvar S T
qui gen double `S' = `E'[_n+1] - `E' // diff in starting income between i and ith person
replace `S'=0 if _n==_N // Taking care of the last observation - May 7 , 2020
qui gen double `T' = `S'*`D' in 1
qui replace `T' = `S'*`D' + `T'[_n-1] if _n>1 // Sum of differnce in OI.
tempvar F_hat w_F
qui gen double `F_hat' = `D'[_n-1] + `C'/2 // empirical distribution / rankings; H
qui replace `F_hat' = `C'/2 in 1 // H
qui gen double `w_F' = `C'*`F_hat' // weighted rankings
qui summ `w_F'
scalar Fbar = r(sum) // average weighted rankings; J and K
// Based on theory this should always be .5
assert abs(Fbar-.5) <= 0.0001
tempvar W X
qui gen double `W' = (`F_hat' - Fbar)*`C' // difference with avg. weighted rankings
qui gen double `X' = `W' in 1
qui replace `X' = `W' + `X'[_n-1] if _n>1 // culmative sum of diff with avg weighted rankings
tempvar Y Z
qui gen double `Y' = `X'*`S' // Multiplying X with difference in original income
qui gen double `Z' = `Y' in 1
qui replace `Z' = `Y' + `Z'[_n-1] if _n>1 // Culmative sum of difference times culmative sum of weight rankings difference
tempvar AD
qui qui gen double `AD' = 2*`Z'
qui covconc `E' [pw=`C']
scalar Gini_OI = r(gini) // O
qui summarize `E' [aw=`C'], meanonly
scalar mu_OI = r(mean) // M
tempvar Gini_star
qui gen double `Gini_star' = (mu_OI*Gini_OI + `AD')/(mu_OI + `T') //AF
replace `Gini_star' =0 if (mu_OI + `T')==0 // Adjusting to Ali's excel file - May 6, 2020
// suppose the observed ending income Gini is saved in scalar Gini_EI
qui covconc `G' [pw=`C']
scalar Gini_EI = r(gini) // P
tempvar higher_gini
qui gen byte `higher_gini' = (`Gini_star' < Gini_EI) & /// AG
(`Gini_star'[_n-1] > Gini_EI )
replace `higher_gini'=0 if _n==1 // Adjusting to Ali's excel file - May 7, 2020
// note higher_gini is column AG
/*qui summ `B' if `higher_gini'==1
assert r(min)==r(max) // just one obs
local which = r(mean) */ // Adjusting to Ali's excel file - May 7, 2020
// Composition of s
// signs change depending on tax or benefit
// Adjusting to Ali's excel file - May 7, 2020
tempvar AO AQ AS AU AW
qui gen double `AO'= `B'*`higher_gini'
qui summ `AO'
if r(sum)>0 scalar AP2=r(sum)
else scalar AP2=1
local which=AP2
qui gen double `AQ'= `D'*`higher_gini'
qui summ `AQ'
scalar AR2= r(sum)
qui gen double `AS'= (mu_OI*Gini_OI+ `AD')*`higher_gini'[_n+1]
qui summ `AS'
scalar AT2= r(sum)
qui gen double `AU'=(mu_OI + `T')*`higher_gini'[_n+1]
qui summ `AU'
scalar AV2= r(sum)
qui gen double `AW'=2*`X'*`higher_gini'
qui summ `AW'
scalar AX2 = r(sum)
tempvar AH AJ AK
qui gen double `AH'= `E'* `higher_gini'
qui summ `AH'
scalar AI2=r(sum)
qui gen double `AJ' = (AI2 - `E')*(`E' <= AI2)
qui gen double `AK' = `E' + `AJ'
scalar Q=Gini_OI-Gini_EI
tempvar AZ BA
local scondition= Gini_EI*AR2-AX2
if `scondition'!=0 local s = (AT2 - Gini_EI*AV2)/(Gini_EI*AR2 - AX2) // AY; Adjutsitng to new formula - May 7, 2020
else local s=(mu_OI*Q)/(`C'* (Gini_OI-Q)-2*`W') in `=`which'' //AY
qui gen double `AZ' = (`AJ' +`s')*(`B'<= `which')
qui gen double `BA' = `AZ' + `E'
covconc `BA' [pw=`C'] // BD
assert abs(r(gini) - Gini_EI)/Gini_EI < 0.0001
qui summ `AZ' [aw=`C']
scalar tot_EHB = r(sum)
qui summ `F' [aw=`C']
scalar tot_TB = r(sum)
return scalar sp_ef = tot_EHB / tot_TB
scalar drop AI2 AP2
}
if `id_tax' == 1 {
*set trace on
sort `E' // even though we are dealing with taxes the orderings are still intended to be from least to greatest, the reverse
tempvar B // comes with a second wieght variable we create
gen `B' = _n
sum `exp'
tempvar C D
gen double `C' = `exp'/r(sum)
gen double `D' = sum(`C')
tempvar F_hat
gen double `F_hat' = `D'[_n-1] + `C'/2
replace `F_hat' = `C'/2 in 1 // I and J
tempvar w_F
gen double `w_F' = `C' * `F_hat'
summ `w_F'
scalar Fbar = r(sum) //K and L
assert abs(r(sum)-.5)/.5 < 0.00001
summarize `E' [aw=`C'], meanonly
scalar mu_OI = r(mean) // N
// Storing value for starting income Gini
covconc `E' [pw=`C']
scalar Gini_OI = r(gini) //P
// suppose the observed ending income Gini is saved in scalar Gini_EI
covconc `G' [pw=`C']
scalar Gini_EI = r(gini) //Q
tempvar S
gen double `S' = `E' - `E'[_n-1] // T
gsort - `E'
tempvar Drev T
gen double `Drev' = sum(`C') // E
gen double `T' = `S'*`Drev' in 1
replace `T' = `S'*`Drev' + `T'[_n-1] if _n>1 // U
tempvar W
gen double `W' = (`F_hat' - Fbar)*`C' // X
tempvar X
gen double `X' = `W' in 1
replace `X' = `W' + `X'[_n-1] if _n>1 // Y
tempvar Y Z
gen double `Y' = `X'*`S' // Z
gen double `Z' = `Y' in 1
replace `Z' = `Y' + `Z'[_n-1] if _n>1 // AA
tempvar AD
gen double `AD' = 2*`Z' // AE
// Resort based on starting income to calculate Ginis
sort `E'
tempvar Gini_star
gen double `Gini_star' =0
replace `Gini_star'= (mu_OI*Gini_OI - `AD')/(mu_OI - `T') if (mu_OI - `T')!=0 // AG
// remember to change to negative signs in both numerator and denom
// when doing it for taxes
tempvar higher_gini
gen byte `higher_gini' = (`Gini_star' < Gini_EI) & (`Gini_star'[_n+1] > Gini_EI) // AH
replace `higher_gini' = (`Gini_star' < Gini_EI) if _n==_N // AH; Adjutsitng to new formula - May 6, 2020
*qui gen byte `higher_gini' = (`Gini_star' < Gini_EI) & (`Gini_star'[_n-1] > Gini_EI )
summ `B' if `higher_gini'==1
assert r(min)==r(max) // just one obs
local which = r(mean)
tempvar AP AT AV // Adjusting to Ali's excel file - May , 2020
gen double `AP'=(`B'[_N]+1-`B')*`higher_gini'
qui summ `AP'
scalar AQ2= r(sum)
gen double `AT'=(Gini_OI*mu_OI- `AD')* `higher_gini'[_n-1]
qui summ `AT'
scalar AT2= r(sum) //AU
gen double `AV'=(mu_OI - `T')* `higher_gini'[_n-1]
qui summ `AV'
scalar AV2= r(sum) //AW
scalar AR2 = `Drev' in `which' // AS
scalar AX2 = 2*`X' in `which' // AY
if `=AQ2'>1 local s = (AT2 - Gini_EI*AV2)/(AX2-Gini_EI*AR2) //AZ; Adjuting to Ali's excel file - May 6, 2020
else local s=(mu_OI*(Gini_OI-Gini_EI))/(2*AR2*(`F_hat'[_N] - Fbar)- AR2*Gini_EI)
tempvar AJ AK AZ BA
gen double `AJ' = (`E'[`which'] - `E')*(`B' >=`which') // AK
gen double `AK' = `E' + `AJ' // AL
gen double `AZ' = (`AJ' - `s')*(`B'>=`which') // BA
gen double `BA' = `AZ' + `E' // BB
covconc `BA' [pw=`C'] // BE
assert abs(r(gini) - Gini_EI)/Gini_EI < 0.0001
summ `AZ' [aw=`C']
scalar tot_EHB = -1*r(sum)
summ `F' [aw=`C']
scalar tot_TB = r(sum)
return scalar se_ind = tot_EHB / tot_TB // return was missing- Feb 15,2020
*set trace off
scalar drop AQ2
}
scalar drop tot_EHB tot_TB Gini_EI Gini_OI ///
AR2 AX2 AT2 AV2 mu_OI Fbar
end
****Poverty Spending effectiveness;
* Program to computepoverty spending effectiveness for FGT1 and FGT2
*generates scalars sp_ef_pov_1 and sp_ef_pov_2
cap program drop ceqbensp
program define ceqbensp, rclass
#delimit;
syntax [if] [in] [pw aw iw fw/] [,
/*Incomes*/
startinc(varname)
endinc(varname)
ben(varname)
zz(string)
obj1(string)
obj2(string)
*
]
;
#delimit cr
sort `startinc' // adding sorting by original income_ Apr 20th,2020.
scalar A = `zz'
scalar B = _N
tempvar D C
gen double `D' = `exp'
gen int `C' = _n
tempvar G H I
gen double `G' = `startinc'
gen double `H' = `ben'
gen double `I' = `G' + `H'
if "`obj1'" != "" {
// Poverty gap calculation
tempvar opt_ben
gen double `opt_ben' = min(`H',A-`G')*(`G' 1
gen byte `Y' = (`X' <= P & `X'[_n+1] > P)
tempvar Z AB // Adjusting it to Ali's excel file - May 10, 2020
qui gen double `Z'=`Y'*(`C'+1)
qui summ `Z'
if (r(sum)==0) scalar AA=1
else scalar AA=r(sum)
qui gen double `AB'= `X'*`Y'
qui summ `AB'
scalar AC= P- r(sum)
scalar AD = A^2*E*AC
tempvar AE AF AI AN
qui gen `AE' = (`X' > P) in 1 // Adjusted Y column
qui replace `AE' = (`X' > P & `X'[_n-1] < P) if _n>1 // Adjusted Y column
qui gen double `AF'=`S'*`AE'
qui summ `AF'
scalar AG= r(sum)
scalar AH = AG^2 // (z-y_J)^2
qui gen double `AI'=`F'*`AE'
qui summ `AI'
scalar AJ=r(sum)
scalar AK = (2*AG+sqrt(4*AH - 4*(AD/AJ)))/2 // First root of equation
scalar AL = (2*AG - sqrt(4*AH - 4*(AD/AJ)))/2 // second root of equation
if min(AK,AL)>0 scalar AM=min(AK,AL) //Changing to match excel
else scalar AM= max(AK,AL)
qui gen double `AN'= `G'*`AE'
qui summ `AN'
scalar AO= r(sum)
tempvar AP AQ AR
gen double `AP' = ((AO-`G') + AM)*(`G'<=AO) // Optimum benefit
gen double `AQ' = `G' + `AP' // New EI
gen double `AR' = ((A - `AQ')/A)^2*(`AQ'= `zline'
scalar B = -r(sum)
summarize `difference' `aw' if `postinc' < `zline'
scalar A1 = r(sum)
summarize `pre_shortfall'`aw' if `preinc' < `zline' & `postinc' >= `zline'
scalar A2 = r(sum)
scalar A = A1 + A2
summarize `pre_shortfall' `aw' if `preinc' < `zline'
scalar AD = r(sum)
scalar VEE = AB/ABC
scalar Spillover = B/AB
scalar PRE = A/ABC
scalar PGE = A/AD
return scalar VEE=VEE
return scalar Spill = Spillover
return scalar PRE = PRE
return scalar PGE = PGE
}
end
*********************
* ceqef PROGRAM *
*********************
capture program drop ceqef
program define ceqef
version 13.0
#delimit ;
syntax
[using/]
[if] [in] [pweight/]
[,
/* INCOME CONCEPTS: */
Market(varname)
Mpluspensions(varname)
Netmarket(varname)
Gross(varname)
Taxable(varname)
Disposable(varname)
Consumable(varname)
Final(varname)
/* FISCAL INTERVENTIONS: */
Pensions (varlist)
DTRansfers (varlist)
DTAXes (varlist)
CONTribs(varlist)
SUbsidies (varlist)
INDTAXes (varlist)
HEALTH (varlist)
EDUCation (varlist)
OTHERpublic(varlist)
/* PPP CONVERSION */
PPP(real -1)
CPISurvey(real -1)
CPIBase(real -1)
YEARly
MOnthly
DAily
/* SURVEY INFORMATION */
HHid(varname)
HSize(varname)
PSU(varname)
Strata(varname)
/* POVERTY LINES */
PL1(real 1.90)
PL2(real 3.20)
PL3(real 5.50)
NATIONALExtremepl(string)
NATIONALModeratepl(string)
OTHERExtremepl(string)
OTHERModeratepl(string)
/* EXPORTING TO CEQ MASTER WORKBOOK: */
sheet(string)
OPEN
/* GROUP CUTOFFS */
cut1(real 1.90)
cut2(real 3.20)
cut3(real 5.50)
cut4(real 11.50)
cut5(real 57.50)
/* INFORMATION CELLS */
COUNtry(string)
SURVeyyear(string) /* string because could be range of years */
AUTHors(string)
SCENario(string)
GROUp(string)
PROJect(string)
BASEyear(real -1)*
/** DROP MISSING VALUES */
IGNOREMissing
]
;
*****General Options;
* general programming locals;
local dit display as text in smcl;
local die display as error in smcl;
local command ceqef;
local version 1.12;
`dit' "Running version `version' of `command' on `c(current_date)' at `c(current_time)'" _n " (please report this information if reporting a bug to sean.higgins@ceqinstitute.org and marc.brooks@ceqinstitute.org)"; //";
qui{;
* weight (if they specified hhsize*hhweight type of thing);
if strpos("`exp'","*")> 0 { ;
`die' "Please use the household weight in {weight}, this will automatically be multiplied by the size of household given by {bf:hsize}";
exit;
};
* hsize and hhid;
if wordcount("`hsize' `hhid'")!=1 {;
`die' "Must exclusively specify {bf:hsize} (number of household members for household-level data) or ";
`die' "{bf:hhid} (unique household identifier for individual-level data)";
exit 198;
};
* make sure using is xls or xlsx;
ceq_parse_using using `"`using'"', cmd("ceqef") open("open");
//";
***********************
* PRESERVE AND MODIFY *
***********************;
set type double;
preserve;
if wordcount("`if' `in'")!=0 quietly keep `if' `in';
* collapse to hh-level data;
if "`hsize'"=="" { ;// i.e., it is individual-level data;
tempvar members;
sort `hhid';
qui bys `hhid': gen `members' = _N; // # members in hh ;
qui bys `hhid': drop if _n>1; // faster than duplicates drop;
local hsize `members';
};
**********************
* SVYSET AND WEIGHTS *
**********************;
cap svydes;
scalar no_svydes = _rc;
if !_rc qui svyset ;// gets the results saved in return list;
if "`r(wvar)'"=="" & "`exp'"=="" {;
`dit' "Warning: weights not specified in svydes or the command";
`dit' "Hence, equal weights (simple random sample) assumed";
};
else {;
if "`exp'"=="" & "`r(wvar)'"!="" local w `r(wvar)';
if "`exp'"!="" local w `exp';
if "`w'"!="" {;
tempvar weightvar;
qui gen double `weightvar' = `w'*`hsize';
local w `weightvar';
};
else local w "`hsize'";
if "`w'"!="" {;
local pw "[pw = `w']";
local aw "[aw = `w']";
};
if "`exp'"=="" & "`r(wvar)'"!="" {;
local weight "pw";
local exp "`r(wvar)'";
};
};
else if "`r(su1)'"=="" & "`psu'"=="" {;
di as text "Warning: primary sampling unit not specified in svydes or the d1 command's psu() option";
di as text "P-values will be incorrect if sample was stratified";
};
if "`psu'"=="" & "`r(su1)'"!="" {;
local psu `r(su1)';
};
if "`strata'"=="" & "`r(strata1)'"!="" {;
local strata `r(strata1)';
};
if "`strata'"!="" {;
local opt strata(`strata');
};
* now set it:;
if "`exp'"!="" qui svyset `psu' `pw', `opt';
else qui svyset `psu', `opt';
* temporary variables;
tempvar one;
qui gen `one' = 1;
* create pseudo income concepts when users did not specify income concepts;
foreach concept in market mpluspensions netmarket gross taxable disposable consumable final {;
if "``concept''"=="" {;
tempvar `concept';
qui gen ``concept'' = -1;
};
};
**********
* LOCALS *
**********;
* income concepts;
local m `market';
local mp `mpluspensions';
local n `netmarket';
local g `gross';
local t `taxable';
local d `disposable';
local c `consumable';
local f `final';
local alllist m mp n g t d c f;
local alllist2 m mp n g t d c f;
local incomes = wordcount("`alllist'");
local origlist m mp n g d;
tokenize `alllist'; // so `1' contains m; to get the variable you have to do ``1'';
local varlist "";
local varlist2 "";
local counter = 1;
foreach y of local alllist {;
local varlist `varlist' ``y''; // so varlist has the variable names;
local varlist2 `varlist' ``y'2';
// reverse tokenize:;
local _`y' = `counter'; // so _m = 1, _mp = 2 (regardless of whether these options included);
if "``y''"!="" local `y'__ `y' ;// so `m__' is e.g. m if market() was specified, "" otherwise;
local ++counter;
};
local d_m = "Market Income";
local d_mp = "Market Income + Pensions";
local d_n = "Net Market Income";
local d_g = "Gross Income";
local d_t = "Taxable Income";
local d_d = "Disposable Income";
local d_c = "Consumable Income";
local d_f = "Final Income";
foreach y of local alllist {;
if "``y''"!="" {;
scalar _d_``y'' = "`d_`y''";
};
};
** missing income concepts
foreach var of local varlist {
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."
}
}
}
** Checking if fiscal intervention options are specificied.
if wordcount("`pensions' `dtransfers' `dtaxes' `contribs' `subsidies' `indtaxes' `health' `education' `otherpublic'") == 0 {
`dit' "Warning: No fiscal intervention options were specified, therefore impact and spending effectiveness indicators are not produced."
local warning `warning' "Warning: No fiscal intervention options were specified, therefore impact and spending effectiveness indicators are not produced."
}
* negative incomes;
foreach v of local alllist {;
if "``v''"!="" {;
qui count if ``v''<0;
if r(N) `dit' "Warning: `r(N)' negative values of ``v''";
};
};
#delimit cr
* poverty lines
local povlines `pl1' `pl2' `pl3' `nationalextremepl' `nationalmoderatepl' `otherextremepl' `othermoderatepl'
local plopts pl1 pl2 pl3 nationalextremepl nationalmoderatepl otherextremepl othermoderatepl
foreach p of local plopts {
if "``p''"!="" {
cap confirm number ``p'' // `p' is the option name eg pl125 so ``p'' is what the user supplied in the option
if !_rc scalar _`p'_isscalar = 1 // !_rc = ``p'' is a number
else { // if _rc, i.e. ``p'' not number
cap confirm numeric variable ``p''
if _rc {
`die' "Option " in smcl "{opt `p'}" as error " must be specified as a scalar or existing variable."
exit 198
}
else scalar _`p'_isscalar = 0 // else = if ``p'' is numeric variable
}
}
}
scalar _relativepl_isscalar = 1 // `relativepl' created later
* ppp conversion
if (`ppp'==-1 & `cpisurvey'==-1 & `cpibase'==-1) {
local _ppp = 0
local divideby = 1
local ppp_calculated = 1
`dit' "Warning: results by income group and bin not produced since {bf:ppp} option not specified."
}
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' & wordcount("`daily' `monthly' `yearly'")==0) {
`dit' "Warning: {bf:daily}, {bf:monthly}, or {bf:yearly} options not specified; variables assumed to be in {bf:yearly} local currency 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
* transfer and tax categories
local taxlist dtaxes contribs indtaxes
local transferlist pensions dtransfers subsidies health education otherpublic
local programlist pensions dtransfers dtaxes contribs subsidies indtaxes health education otherpublic
foreach x of local programlist {
local allprogs `allprogs' ``x'' // so allprogs has the actual variable names
}
* columns including disaggregated components and broader categories
local broadcats dtransfersp dtaxescontribs inkind alltaxes alltaxescontribs alltransfers
local dtransfersp `pensions' `dtransfers'
local dtaxescontribs `dtaxes' `contribs'
local inkind `health' `education' `otherpublic' // these contain the variables, or blank if not specified
local alltransfers `dtransfers' `subsidies' `inkind'
local alltransfersp
local alltaxes `dtaxes' `indtaxes'
local alltaxescontribs `dtaxes' `contribs' `indtaxes'
**********
*Tax and Transfer options between core income concepts
**********
/* From July 22nd on, the following taxes and transfers will not be calculated:
1. Net Income to Gross Income
2. Any Income concept to Taxable Income
3. Taxable Income to any income concept
3 and 4 imply that taxdif will no longer be defined since it's not an actual
fiscal intervention.
*/
/*qui su `taxable'
local mean1 = r(mean)
qui su `gross'
local mean2 = r(mean)
if `mean1'!=-1 & `mean2'!=-1 {
tempvar taxdif
gen double `taxdif'=`taxable'-`gross'
replace `taxdif'=0 if (`taxdif')>0
replace `taxdif'=abs(`taxdif')
}*/
**********
*Market Income
**********
*From Market income to Market Income plus pensions
if "`pensions'"!="" {
tempvar ben_m_mp
egen double `ben_m_mp' =rsum(`pensions')
local bname_m_mp = `" `pensions' "' // "
}
*From Market income to Net Market Income
if "`dtaxes'"!="" {
tempvar tax_m_n
egen double `tax_m_n'=rsum(`dtaxes')
local tname_m_n = `" `dtaxes' "' // "
}
if "`pensions'"!="" {
tempvar ben_m_n
egen double `ben_m_n'=rsum(`pensions')
local bname_m_n = `" `pensions' "' // "
}
*From Market income to Gross Income
*gen double `tax_m_g'=0
if "`dtransfers'"!="" | "`pensions'"!="" {
tempvar /*tax_m_g*/ ben_m_g
egen double `ben_m_g'=rsum(`pensions' `dtransfers')
local bname_m_g = `" `pensions' `dtransfers' "' // "
}
*From Market income to Taxable Income
/* if "`taxdif'"!="" {
tempvar tax_m_t
gen double `tax_m_t'=`taxdif'
local tname_m_t = `" `taxdif' "'
}
if "`dtransfers'"!="" | "`pensions'"!="" {
tempvar ben_m_t
egen double `ben_m_t'=rsum(`pensions' `dtransfers')
local bname_m_t = `" `pensions' `dtransfers' "' // "
} */
*From Market income to Disposable Income
if "`dtaxes'"!="" {
tempvar tax_m_d
egen double `tax_m_d'=rsum(`dtaxes')
local tname_m_d = `" `dtaxes' "'
}
if "`dtransfers'"!="" | "`pensions'"!="" {
tempvar ben_m_d
egen double `ben_m_d'=rsum(`pensions' `dtransfers')
local bname_m_d = `" `pensions' `dtransfers' "' // "
}
*From Market income to Consumable Income
if "`dtaxes'"!="" | "`indtaxes'"!="" {
tempvar tax_m_c
egen double `tax_m_c'=rsum(`dtaxes' `indtaxes')
local tname_m_c = `" `dtaxes' `indtaxes' "' // "
}
if "`dtransfers'"!="" | "`pensions'"!="" | "`subsidies'"!="" {
tempvar ben_m_c
egen double `ben_m_c'=rsum(`pensions' `dtransfers' `subsidies')
local bname_m_c = `" `pensions' `dtransfers' `subsidies' "' // "
}
*From Market income to Final Income
if "`dtaxes'"!="" | "`indtaxes'"!="" {
tempvar tax_m_f
egen double `tax_m_f'=rsum(`dtaxes' `indtaxes')
local tname_m_f = `" `dtaxes' `indtaxes' "'
}
if "`dtransfers'"!="" | "`pensions'"!="" | "`subsidies'"!="" | "`inkind'"!="" { // "
tempvar ben_m_f
egen double `ben_m_f'=rsum(`pensions' `dtransfers' `subsidies' `inkind')
local bname_m_f = `" `pensions' `dtransfers' `subsidies' `inkind' "' // "
}
**********
*Market Income plus Pensions
**********
*From Market income plus Pensions to Net Market Income
if "`dtaxes'"!="" {
tempvar tax_mp_n /*ben_mp_n*/
egen double `tax_mp_n'=rsum(`dtaxes')
local tname_mp_n = `" `dtaxes' "' // "
}
**gen double `ben_mp_n'=0
*From Market income plus Pensions to Gross Income
**gen double `tax_mp_g'=0
if "`dtransfers'"!="" {
tempvar /*tax_mp_g*/ ben_mp_g
egen double `ben_mp_g'=rsum(`dtransfers')
local bname_mp_g = `" `dtransfers' "' // "
}
/* *From Market income plus Pensions to Taxable Income
if "`taxdif'"!="" {
tempvar tax_mp_t
gen double `tax_mp_t'=`taxdif'
local tname_mp_t = `" `taxdif' "' // "
}
if "`dtransfers'"!="" {
tempvar ben_mp_t
egen double `ben_mp_t'=rsum(`dtransfers')
local bname_mp_t = `" `dtransfers' "' // "
} */
*From Market income plus Pensions to Disposable Income
if "`dtaxes'"!="" {
tempvar tax_mp_d
egen double `tax_mp_d'=rsum(`dtaxes')
local tname_mp_d = `" `dtaxes' "' // "
}
if "`dtransfers'"!="" {
tempvar ben_mp_d
egen double `ben_mp_d'=rsum(`dtransfers')
local bname_mp_d = `" `dtranfers' "' // "
}
*From Market income plus Pensions to Consumable Income
if "`dtaxes'"!="" | "`indtaxes'"!="" {
tempvar tax_mp_c
egen double `tax_mp_c'=rsum(`dtaxes' `indtaxes')
local tname_mp_c = `" `dtaxes' `indtaxes' "' // "
}
if "`dtransfers'"!="" | "`subsidies'"!="" {
tempvar ben_mp_c
egen double `ben_mp_c'=rsum(`dtransfers' `subsidies')
local bname_mp_c = `" `dtransfers' `subsidies' "' // "
}
*From Market income plus Pensions to Final Income
if "`dtaxes'"!="" | "`indtaxes'"!="" {
tempvar tax_mp_f
egen double `tax_mp_f'=rsum(`dtaxes' `indtaxes')
local tname_mp_f = `" `dtaxes' `indtaxes' "' // "
}
if "`dtransfers'"!="" | "`subsidies'"!="" | "`inkind'"!="" {
tempvar ben_mp_f
egen double `ben_mp_f'=rsum(`dtransfers' `subsidies' `inkind')
local bname_mp_f = `" `dtransfers' `subsidies' `inkind' "' // "
}
**********
*Net Market Income
**********
/* *From Net Market income to Gross Income
if "`tax_m_d'"!="" {
tempvar tax_n_g
gen double `tax_n_g'=`tax_m_d'
local tname_n_g = `" `tname_m_d' "' // "
}
if "`dtransfers'"!="" {
tempvar /*tax_n_g*/ ben_n_g
egen double `ben_n_g'=rsum(`dtransfers' )
local bname_n_g = `" `dtransfers' "' // "
} */
**replace `ben_n_g'=`ben_n_g'-abs(`tax_m_d')
/* *From Net Market income to Taxable Income
if "`dtransfers'"!="" & "`taxdif'"!="" {
tempvar tax_n_t dtr
egen double `dtr'=rsum(`dtransfers')
gen double `tax_n_t'=`taxdif'+ abs(`dtr')
local tname_n_t = `" `tax_n_t' `dtransfers' "' // "
}
if "`dtransfers'"!="" {
tempvar ben_n_t
egen double `ben_n_t'=rsum(`dtransfers')
local bname_n_t = `" `dtransfers' "' // "
} */
*From Net Market income to Disposable Income
*gen double `tax_n_d'=0
if "`dtransfers'"!="" {
tempvar /*tax_n_d*/ ben_n_d
egen double `ben_n_d'=rsum(`dtransfers')
local bname_n_d = `" `dtransfers' "' // "
}
*From Net Market income to Consumable Income
if "`indtaxes'"!="" {
tempvar tax_n_c
egen double `tax_n_c'=rsum(`indtaxes')
local tname_n_c = `" `indtaxes' "' // "
}
if "`dtransfers'"!="" | "`subsidies'"!="" {
tempvar ben_n_c
egen double `ben_n_c'=rsum(`dtransfers' `subsidies')
local bname_n_c = `" `dtransfers' `subsidies' "' // "
}
*From Net Market income to Final Income
if "`indtaxes'"!="" {
tempvar tax_n_f
egen double `tax_n_f'=rsum(`indtaxes')
local tname_n_f = `" `indtaxes' "' // "
}
if "`dtransfers'"!="" | "`subsidies'"!="" | "`inkind'"!="" {
tempvar ben_n_f
egen double `ben_n_f'=rsum(`dtransfers' `subsidies' `inkind')
local bname_n_f = `" `dtransfers' `subsidies' `inkind' "' // "
}
**********
*Gross Income
**********
/* *From Gross income to Taxable Income
if "`taxdif'"!="" {
tempvar tax_g_t /*ben_g_t*/
gen double `tax_g_t'=`taxdif'
local tname_g_t = `" `taxdif' "' // "
} */
*gen double `ben_g_t'=0
*From Gross income to Disposable Income
if "`dtaxes'"!="" {
tempvar tax_g_d /*ben_g_d*/
egen double `tax_g_d'=rsum(`dtaxes')
local tname_g_d = `" `dtaxes' "' // "
}
*gen double `ben_g_d'=0
*From Gross income to Consumable Income
if "`dtaxes'"!="" | "`indtaxes'"!="" {
tempvar tax_g_c
egen double `tax_g_c'=rsum(`dtaxes' `indtaxes')
local tname_g_c = `" `dtaxes' `indtaxes' "' // "
}
if "`subsidies'"!="" {
tempvar ben_g_c
egen double `ben_g_c'=rsum(`subsidies')
local bname_g_c = `" `subsidies' "' // "
}
*From Gross income to Final Income
if "`dtaxes'"!="" | "`indtaxes'"!="" {
tempvar tax_g_f
egen double `tax_g_f'=rsum(`dtaxes' `indtaxes')
local tname_g_f = `" `dtaxes' `indtaxes' "' // "
}
if "`subsidies'"!="" | "`inkind'"!="" {
tempvar ben_g_f
egen double `ben_g_f'=rsum(`subsidies' `inkind')
local bname_g_f = `" `subsidies' `inkind' "' // "
}
**********
*Taxable Income
**********
/*
*From Taxable income to Disposable Income
if "`dtaxes'"!="" {
tempvar tax_t_d
egen double `tax_t_d'=rsum(`dtaxes')
local tname_t_d = `" `dtaxes' "' // "
}
if "`taxdif'"!="" {
tempvar ben_t_d
gen double `ben_t_d'=`taxdif'
local bname_t_d = `" `taxdif' "' // "
}
*From Taxable income to Consumable Income
if "`dtaxes'"!="" | "`indtaxes'"!="" {
tempvar tax_t_c
egen double `tax_t_c'=rsum(`dtaxes' `indtaxes')
local tname_t_c = `" `dtaxes' `indtaxes' "' // "
}
if "`taxdif'"!="" | "`subsidies'"!="" {
tempvar ben_t_c
egen double `ben_t_c'=rsum(`taxdif' `subsidies')
local bname_t_c = `" `taxdif' `subsidies' "' // "
}
*From Taxable income to Final Income
if "`dtaxes'"!="" | "`indtaxes'"!="" {
tempvar tax_t_f
egen double `tax_t_f'=rsum(`dtaxes' `indtaxes')
local tname_t_f = `" `dtaxes' `indtaxes' "' // "
}
if "`taxdif'"!="" | "`subsidies'"!="" | "`inkind'"!="" {
tempvar ben_t_f
egen double `ben_t_f'=rsum(`taxdif' `subsidies' `inkind')
local bname_t_f = `" `taxdif' `subsidies' `inkind' "' // "
}
*/
**********
*Disposable Income
**********
*From Disposable income to Consumable Income
if "`indtaxes'"!="" {
tempvar tax_d_c
egen double `tax_d_c'=rsum(`indtaxes')
local tname_d_c = `" `indtaxes' "' // "
}
if "`subsidies'"!="" {
tempvar ben_d_c
egen double `ben_d_c'=rsum(`subsidies')
local bname_d_c = `" `subsidies' "' // "
}
*From Disposable income to Final Income
if "`indtaxes'"!="" {
tempvar tax_d_f
egen double `tax_d_f'=rsum(`indtaxes')
local tname_d_f = `" `indtaxes' "' // "
}
if "`subsidies'"!="" | "`inkind'"!="" {
tempvar ben_d_f
egen double `ben_d_f'=rsum(`subsidies' `inkind')
local bname_d_f = `" `subsidies' `inkind' "' // "
}
**********
*Consumable Income
**********
*From Consumable income to Final Income
*gen double `tax_c_f'=0
if "`subsidies'"!="" | "`inkind'"!="" {
tempvar /*tax_c_f*/ ben_c_f
egen double `ben_c_f'=rsum(`subsidies' `inkind')
local bname_c_f = `" `subsidies' `inkind' "' // "
}
******Rows******
local rw_ie_pl1_1=3
local rw_ie_pl1_2=4
local rw_ie_pl2_1=5
local rw_ie_pl2_2=6
local rw_ie_pl3_1=7
local rw_ie_pl3_2=8
local rw_ie_nationalextremepl_1=9
local rw_ie_nationalextremepl_2=10
local rw_ie_nationalmoderatepl_1=11
local rw_ie_nationalmoderatepl_2=12
local rw_ie_otherextremepl_1=13
local rw_ie_otherextremepl_2=14
local rw_ie_othermoderatepl_1=15
local rw_ie_othermoderatepl_2=16
local rw_se_pl1_1=19
local rw_se_pl1_2=20
local rw_se_pl2_1=21
local rw_se_pl2_2=22
local rw_se_pl3_1=23
local rw_se_pl3_2=24
local rw_se_nationalextremepl_1=25
local rw_se_nationalextremepl_2=26
local rw_se_nationalmoderatepl_1=27
local rw_se_nationalmoderatepl_2=28
local rw_se_otherextremepl_1=29
local rw_se_otherextremepl_2=30
local rw_se_othermoderatepl_1=31
local rw_se_othermoderatepl_2=32
*For Beckerman Imervoll
local rbk_pl1=33
local rbk_pl2=37
local rbk_pl3=41
local rbk_nationalextremepl=45
local rbk_nationalmoderatepl=49
local rbk_otherextremepl=53
local rbk_othermoderatepl=57
*For FI/FGP
local rfi_pl1=62
local rfi_pl2=65
local rfi_pl3=68
local rfi_nationalextremepl=71
local rfi_nationalmoderatepl=74
local rfi_otherextremepl=77
local rfi_othermoderatepl=80
* PPP converted variables
if (`_ppp') {
local ppp_calculated = `ppp'*(`cpisurvey'/`cpibase')
foreach v of local alllist {
tempvar `v'_ppp
if "``v''"!="" {
qui gen ``v'_ppp' = (``v''/`divideby')*(1/`ppp_calculated')
}
}
}
#delimit;
*Effectiveness matrices for each income concept;
foreach y of local alllist{;//generate matrices for results;
matrix `y'_ef = J(82,8,.);
};
*Calculate Effectiveness indicators;
foreach rw of local alllist {; //row income concept;
*pause we made it to `rw';
foreach cc of local alllist{; //column income concept;
if "`rw'" == "mp" {;
*pause we are here with `cc';
};
nois di "`rw'"; //just for debugging
nois di "`cc'";
nois di `_`rw'';
nois di `_`cc'';
if ("`rw'" !="`cc'") & (`_`rw''<`_`cc'') {;
****TAXES AND TRANSFERS for R and N;
qui su ``rw'';
local inc1 = r(mean);
qui su ``cc'';
local inc2 = r(mean);
if `inc1'== -1 {;
forval i = 1/82 {;
matrix `rw'_ef[`i',`_`cc''] = .;
};
};
if `inc2'==-1 {;
forval i = 1/82 {;
matrix `rw'_ef[`i',`_`cc''] = .;
};
};
if `inc1'!=-1 & `inc2'!=-1 {;
if "`tax_`rw'_`cc''"!=""{;
tempvar taxesef;
gen double `taxesef'=abs(`tax_`rw'_`cc'');
};
if "`ben_`rw'_`cc''"!=""{;
tempvar benef;
gen double `benef'=`ben_`rw'_`cc'';
};
local yes= wordcount("`benef'")+wordcount("`taxesef'");
if (wordcount("`tax_`rw'_`cc''")>0 | wordcount("`ben_`rw'_`cc''")>0){; //ESTIMATE EFFECTIVENESS INDICATORS FOR CASES THAT APPLY;
*impact effectiveness;
/*if wordcount("`benef'")>0{;
ceqbenstar [w=`w'], endinc(``cc'') ben(`benef');
};
if wordcount("`taxesef'")>0{;
ceqtaxstar [w=`w'], endinc(``cc'') taxes(`taxesef');
};*/
if wordcount("`tax_`rw'_`cc''")>0 & wordcount("`ben_`rw'_`cc''")>0{; // Fixed algorithm for combined system- Apr 30th, 2020
tempvar ystar;
gen double `ystar'=``rw'';
ceqbenstar `pw', startinc(``rw'') ben(`benef');
local bwarn = 0 ;
local twarn = 0 ;
local t_N=0;
if r(b_gr) ==1 { ;
nois `dit' "Sum of `bname_`rw'_`cc'' exceed ``rw'', so impact effectiveness indicator for ``rw'' to ``cc'' excludes benefits or is not produced" ;
local warning `warning' "Sum of `bname_`rw'_`cc'' exceed ``rw'', so impact effectiveness indicator for ``rw'' to ``cc'' excludes benefits or is not produced" ;
local bwarn = r(b_gr) ;
} ;
else if r(b_0) ==1 { ;
nois `dit' "Sum of `bname_`rw'_`cc'' exceed ``rw'', so impact effectiveness indicator for ``rw'' to ``cc'' excludes benefits or is not produced" ;
local warning `warning' "Sum of `bname_`rw'_`cc'' exceed ``rw'', so impact effectiveness indicator for ``rw'' to ``cc'' excludes benefits or is not produced" ;
local bwarn = r(b_0) ;
} ;
if `bwarn' == 0{;
*set trace on ;
ceqtaxstar `pw', startinc(____ybenstar) taxes(`taxesef');
*set trace off ;
local t_N=r(t_N);
if r(t_gr) == 1{ ;
nois `dit' "Sum of `tname_`rw'_`cc'' exceed ``rw'', so impact effectiveness indicator not produced from ``rw'' to ``cc''" ;
local warning `warning' "Sum of `tname_`rw'_`cc'' exceed ``rw'', so impact effectiveness indicator not produced from ``rw'' to ``cc''" ;
local twarn = r(t_gr) ;
} ;
else if r(t_0) == 1{ ;
nois `dit' "Sum of `tname_`rw'_`cc'' is 0, so impact effectiveness indicator not produced from ``rw'' to ``cc''" ;
local warning `warning' "Sum of `tname_`rw'_`cc'' exceed ``rw'', so impact effectiveness indicator not produced from ``rw'' to ``cc''" ;
local twarn = r(t_0) ;
} ;
};
if `bwarn' == 0 & `twarn' == 0 { ;
replace `ystar'=____ytaxstar;
*cap drop ____ytaxstar ____ybenstar ____id_benstar ____id_taxstar ;
cap drop ____ytaxstar ____id_benstar ____id_taxstar ;
};
else { ;
local bwarn = 1 ;
local twarn = 1 ;
};
};
if wordcount("`tax_`rw'_`cc''")>0 & wordcount("`ben_`rw'_`cc''")==0{;
*set trace on;
ceqtaxstar `pw' , startinc(``rw'') taxes(`taxesef') ;
*set trace off;
local twarn = 0 ;
local t_N=0;
local bwarn=1; // Reseting all locals - May 6, 2020
if r(t_gr) ==1 { ;
nois `dit' "Sum of `tname_`rw'_`cc'' exceed ``rw'', so impact effectiveness indicator not produced from ``rw'' to ``cc''" ;
local warning `warning' "Sum of `tname_`rw'_`cc'' exceed ``rw'', so impact effectiveness indicator not produced from ``rw'' to ``cc''" ;
local twarn = r(t_gr) ;
} ;
else if r(t_0) ==1 { ;
nois `dit' "Sum of `tname_`rw'_`cc'' is 0, so impact effectiveness indicator not produced from ``rw'' to ``cc''" ;
local warning `warning' "Sum of `tname_`rw'_`cc'' is 0, so impact effectiveness indicator not produced from ``rw'' to ``cc''" ;
local twarn = r(t_0) ;
} ;
else if !(r(t_0) == 1 | r(t_gr) == 1) {; // if was missing - March, 31st 2020
tempvar ystar;
gen double `ystar'=____ytaxstar;
cap drop ____ytaxstar ____ybenstar ____id_benstar ____id_taxstar;
};
};
if wordcount("`tax_`rw'_`cc''")==0 & wordcount("`ben_`rw'_`cc''")>0{;
ceqbenstar `pw', startinc(``rw'') ben(`benef');
local bwarn = 0 ;
local t_N=0;
local twarn=1; // Reseting all locals - May 6, 2020
if r(b_gr) == 1 { ;
nois `dit' "Sum of `bname_`rw'_`cc'' is 0, so impact effectiveness indicator not produced from ``rw'' to ``cc''" ;
local warning `warning' "Sum of `bname_`rw'_`cc'' exceed ``rw'', so impact effectiveness indicator not produced from ``rw'' to ``cc''" ;
local bwarn = r(b_gr) ;
} ;
else if r(b_0) == 1 { ;
nois `dit' "Sum of `bname_`rw'_`cc'' is 0, so impact effectiveness indicator not produced from ``rw'' to ``cc''" ;
local warning `warning' "Sum of `bname_`rw'_`cc'' exceed ``rw'', so impact effectiveness indicator not produced from ``rw'' to ``cc''" ;
local bwarn = r(b_0) ;
} ;
if !(r(b_0) == 1 | r(b_gr) == 1) {;
tempvar ystar;
gen double `ystar'=____ybenstar;
cap drop ____ytaxstar ____ybenstar ____id_benstar ____id_taxstar;
};
};
if !( "`bwarn'" == "1" & "`twarn'" == "1" ) { ; // Moved outside the previous if- Feb 12,2020
covconc ``cc'' `pw'; //gini of column income;
local g1_`cc'=r(gini);
di "`rw' ``rw''";
covconc ``rw'' `pw'; //gini of row income;
local g2_`rw'=r(gini);
covconc `ystar' `pw'; //gini of star income;
local g_star=r(gini);
local imef=(`g2_`rw''-`g1_`cc'')/(`g2_`rw''-`g_star');
matrix `rw'_ef[1,`_`cc'']=`imef';
};
*noisily di in red "INEQ IMPACT EFF. `rw' `cc' Row= `row'";
*IMPACT EFFECTIVENESS FOR POVERTY (WHEN THERE IS ONLY TAXES OR ONLY TRANSFERS);
*Convert to ppp;
if "`tax_`rw'_`cc''"!=""{;
tempvar int_tax_ppp;
gen double `int_tax_ppp'=(`tax_`rw'_`cc''/`divideby')*(1/`ppp_calculated');
};
if "`ben_`rw'_`cc''"!=""{;
tempvar int_ben_ppp;
gen double `int_ben_ppp'=(`ben_`rw'_`cc''/`divideby')*(1/`ppp_calculated');
};
/*tempvar int_tax;
gen double `int_tax'=abs(`tax_`rw'_`cc'');
tempvar int_ben;
gen double `int_ben'=`ben_`rw'_`cc'';
tempvar int_tax_ppp;
gen double `int_tax_ppp'=(`int_tax'/`divideby')*(1/`ppp_calculated');
tempvar int_ben_ppp;
gen double `int_ben_ppp'=(`int_ben'/`divideby')*(1/`ppp_calculated');
*/
tempvar `rw'_ppp;
gen double ``rw'_ppp'=(``rw''/`divideby')*(1/`ppp_calculated');
tempvar `cc'_ppp;
gen double ``cc'_ppp'=(``cc''/`divideby')*(1/`ppp_calculated');
** if (wordcount("`tax_`rw'_`cc''")>0 & wordcount("`ben_`rw'_`cc''")==0) { ;
** above line was leading to error (issue 50 on Github);
tempvar ystar_ppp;
gen double `ystar_ppp'=(`ystar'/`divideby')*(1/`ppp_calculated');
** } ;
local row=2;
*noisily di in red "Begin of POV IMPACT EFF. `rw' `cc' Row= `row'";
*Only taxes MC<0 so harm formula);
if (wordcount("`tax_`rw'_`cc''")>0 & wordcount("`ben_`rw'_`cc''")==0) {;
*if wordcount("`ben_`rw'_`cc''")==0) & wordcount("`tax_`rw'_`cc''")>0 {;
foreach p in `plopts'{;
if "``p''"!=""{;
if substr("`p'",1,2)=="pl" {; // these are the PPP lines;
local _pline = ``p'';
local vtouse1 ``cc'_ppp';//1 is for original;
local vtouse2 ``rw'_ppp';//2 is for income without intervention;
local vtouse3 `ystar_ppp';//3 is for ideal income;
};
else if _`p'_isscalar==1 { ; // if pov line is scalar, // (note this local defined above);
local _pline = ``p''; // set `_pline' as that scalar and;
local vtouse1 ``cc'' ;// use original income variable;
local vtouse2 ``rw'';//income without intervention;
local vtouse3 `ystar';//income with ideal intervention;
};
else if _`p'_isscalar==0 {; // if pov line is variable,;
tempvar `v'_normalized1 ; // create temporary variable that is income...;
tempvar `v'_normalized2 ; // create temporary variable that is income...;
tempvar `v'_normalized3 ; // create temporary variable that is income...;
qui gen ``v'_normalized1' = ``cc''/``p'' ;// normalized by pov line;
qui gen ``v'_normalized2' = ``rw''/``p'' ;// normalized by pov line;
qui gen ``v'_normalized3' = `ystar'/``p'' ;// normalized by pov line;
local _pline = 1 ; // and normalized pov line is 1;
local vtouse1 ``v'_normalized1'; // use normalized income in the calculations;
local vtouse2 ``v'_normalized2'; // use normalized income in the calculations;
local vtouse3 ``v'_normalized3'; // use normalized income in the calculations;
};
tempvar zyzfgt1_1 zyzfgt2_1 zyzfgt1_2 zyzfgt2_2 zyzfgt1_3 zyzfgt2_3 ; // zyzfgt2_2 added by Rosie on May 21st;
qui gen `zyzfgt1_1' = max((`_pline'-`vtouse1')/`_pline',0) ;// normalized povety gap of each individual;
qui gen `zyzfgt2_1' = `zyzfgt1_1'^2 ; // square of normalized poverty gap;
qui gen `zyzfgt1_2' = max((`_pline'-`vtouse2')/`_pline',0) ;// normalized povety gap of each individual;
qui gen `zyzfgt2_2' = `zyzfgt1_2'^2 ; // square of normalized poverty gap;
qui gen `zyzfgt1_3' = max((`_pline'-`vtouse3')/`_pline',0) ;// normalized povety gap of each individual;
qui gen `zyzfgt2_3' = `zyzfgt1_3'^2 ; // square of normalized poverty gap;
forval i=1/2 {;
qui summ `zyzfgt`i'_1' `aw', meanonly; // `if' `in' restrictions already taken care of by `touse' above;
local p`i'_orig=r(mean);
qui summ `zyzfgt`i'_2' `aw', meanonly; // `if' `in' restrictions already taken care of by `touse' above;
local p`i'_wo=r(mean);
qui summ `zyzfgt`i'_3' `aw', meanonly; // `if' `in' restrictions already taken care of by `touse' above;
local p`i'_3=r(mean);
drop `zyzfgt`i'_3' `zyzfgt`i'_2' `zyzfgt`i'_1';
****Poverty Impact effectiveness;
//Marginal contributions for fgt 1,2;
local mp_`i'_`p'_`rc'=`p`i'_wo'-`p`i'_orig'; //Observed MC; Corrected spelling mistake - Apr 30th, 2020
****For Impact effectiveness there can only be a negative effect, we use the harm formula Ch. 5 CEQ Handbook;
if `mp_`i'_`p'_`rc''<0{;
//pause here ar are passing "`pw'", "`cc'", "`tax_`ra'_`cc''";
ceqtaxharm `pw', endinc(``cc'') taxes(`tax_`rw'_`cc'');
if "`rw'" == "mp" & "`cc'" == "n" { ;
//pause we are right here! with `i';
};
if r(thwarn) == 1 { ;
nois `dit' "Sum of `tname_`rw'_`cc'' exceed ``rw'', so impact effectiveness indicator not produced from ``rw'' to ``cc''" ;
local warning `warning' "Sum of `tname_`rw'_`cc'' exceed ``rw'', so impact effectiveness indicator not produced from ``rw'' to ``cc''" ;
local row=`row'+1;
} ;
else { ;
tempvar yharm;
gen double `yharm'=____ytaxharm;
cap drop ____ytaxharm ____id_taxharm;
tempvar yharm_ppp;
gen `yharm_ppp'=(`yharm'/`divideby')*(1/`ppp_calculated');
if "``p''"!="" { ;
if substr("`p'",1,2)=="pl" {; // these are the PPP lines;
local _pline = ``p'';
local vtouseh `yharm_ppp';//h is for harm;
};
else if _`p'_isscalar==1 { ; // if pov line is scalar, // (note this local defined above);
local _pline = ``p''; // set `_pline' as that scalar and;
local vtouseh `yharm' ;
};
else if _`p'_isscalar==0 {; // if pov line is variable,;
tempvar `v'_normalizedh ; // create temporary variable that is income...;
qui gen ``v'_normalizedh' = `yharm'/``p'' ;// normalized by pov line;
local _pline = 1 ; // and normalized pov line is 1;
local vtouseh ``v'_normalizedh'; // use normalized income in the calculations;
};
tempvar zyzfgt1_h zyzfgt2_h;
qui gen `zyzfgt1_h' = max((`_pline'-`vtouseh')/`_pline',0) ;// normalized povety gap of each individual;
qui gen `zyzfgt2_h' = `zyzfgt1_h'^2 ; // square of normalized poverty gap;
qui summ `zyzfgt`i'_h' `aw', meanonly; // `if' `in' restrictions already taken care of by `touse' above;
local p`i'_h=r(mean);
local mst_p`i'_h=`p`i'_wo' - `p`i'_h';//Ideal MC with tax formula; Corrected formula- Apr 30th, 2020
local eft_`i'_h=(`mp_`i'_`p'_`rc''/`mst_p`i'_h')*(-1);
*return scalar eft_`i'_h = `eft_`i'_h';//Impact effectiveness indicator, v has the variable name of the transfer, y=income, p=poverty line ;
local row=`row'+1;
matrix `rw'_ef[`rw_ie_`p'_`i'',`_`cc''] = `eft_`i'_h';
*noisily di in green "Doing POV IMPACT EFF. TAXES `rw' `cc' Row= `row'";
/*local row=`row'+1;
matrix p_ie_`y'[`row',`col'] = `eft_2_h';
matrix p_se_`y'[`row',`col'] = .;*/
};
};
};
else{;
local row=`row'+1;
matrix `rw'_ef[`rw_ie_`p'_`i'',`_`cc''] =.;
};
};
if "`rw'" == "mp" & "`cc'" == "n" { ;
//pause we made it out of that bad boy;
};
};
};
};
*Only Benefits;
local rowsp=18;
if wordcount("`tax_`rw'_`cc''")==0 & wordcount("`ben_`rw'_`cc''")>0{;
if wordcount("`povlines'")>0 {; // otherwise produces inequality only;
foreach p in `plopts' { ;// plopts includes all lines;
if "``p''"!="" { ;
if substr("`p'",1,2)=="pl" {; // these are the PPP lines;
local _pline = ``p'';
local vtouse1 ``cc'_ppp';//1 is for original;
local vtouse2 ``rw'_ppp';//2 is for income without intervention;
local vtouse3 `ystar_ppp';//3 is for ideal income;
};
else if _`p'_isscalar==1 { ; // if pov line is scalar, // (note this local defined above);
local _pline = ``p''; // set `_pline' as that scalar and;
local vtouse1 ``cc'' ;// use original income variable;
local vtouse2 ``rw'';//income without intervention;
local vtouse3 `ystar';//income with ideal intervention;
};
else if _`p'_isscalar==0 {; // if pov line is variable,;
tempvar `v'_normalized4 ; // create temporary variable that is income...;
tempvar `v'_normalized5 ; // create temporary variable that is income...;
tempvar `v'_normalized6 ; // create temporary variable that is income...;
qui gen ``v'_normalized4' = ``cc''/``p'' ;// normalized by pov line;
qui gen ``v'_normalized5' = ``rw''/``p'' ;// normalized by pov line;
/*qui gen ``v'_normalized2' = `ext'/``p'' ;// normalized by pov line;*/
qui gen ``v'_normalized6' = `ystar'/``p'' ;// normalized by pov line;
local _pline = 1 ; // and normalized pov line is 1;
local vtouse1 ``v'_normalized4'; // use normalized income in the calculations;
local vtouse2 ``v'_normalized5'; // use normalized income in the calculations;
local vtouse3 ``v'_normalized6'; // use normalized income in the calculations;
};
tempvar zyzfgt1_1 zyzfgt2_1 zyzfgt1_2 zyzfgt2_2 zyzfgt1_3 zyzfgt2_3;
qui gen `zyzfgt1_1' = max((`_pline'-`vtouse1')/`_pline',0) ;// normalized povety gap of each individual;
qui gen `zyzfgt2_1' = `zyzfgt1_1'^2 ; // square of normalized poverty gap;
qui gen `zyzfgt1_2' = max((`_pline'-`vtouse2')/`_pline',0) ;// normalized povety gap of each individual;
qui gen `zyzfgt2_2' = `zyzfgt1_2'^2 ; // square of normalized poverty gap;
qui gen `zyzfgt1_3' = max((`_pline'-`vtouse3')/`_pline',0) ;// normalized povety gap of each individual;
qui gen `zyzfgt2_3' = `zyzfgt1_3'^2 ; // square of normalized poverty gap;
qui summ `zyzfgt1_1' `aw', meanonly; // `if' `in' restrictions already taken care of by `touse' above;
local p1_`y'_orig=r(mean);
qui summ `zyzfgt1_2' `aw', meanonly; // `if' `in' restrictions already taken care of by `touse' above;
local p1_`y'_2=r(mean);
qui summ `zyzfgt1_3' `aw', meanonly; // `if' `in' restrictions already taken care of by `touse' above;
local p1_`y'_3_st=r(mean);
qui summ `zyzfgt2_1' `aw', meanonly; // `if' `in' restrictions already taken care of by `touse' above;
local p2_`y'_orig=r(mean);
qui summ `zyzfgt2_2' `aw', meanonly; // `if' `in' restrictions already taken care of by `touse' above;
local p2_`y'_2=r(mean);
qui summ `zyzfgt2_3' `aw', meanonly; // `if' `in' restrictions already taken care of by `touse' above;
local p2_`y'_3_st=r(mean);
drop `zyzfgt1_3' `zyzfgt1_2' `zyzfgt1_1' `zyzfgt2_3' `zyzfgt2_2' `zyzfgt2_1';
//Marginal contributions for fgt 1,2;
local mp_1_`p'=`p1_`y'_2'-`p1_`y'_orig';//Observed MC;
local mp_1_`p'_s=`p1_`y'_2'-`p1_`y'_3_st';//Star MC;
local mp_2_`p'=`p2_`y'_2'-`p2_`y'_orig';//Observed MC;
local mp_2_`p'_s=`p2_`y'_2'-`p2_`y'_3_st';//Star MC;
****Poverty Impact effectiveness;
****For Impact effectiveness with Transfers there can only be a positive effect;
forval i=1/2 {;
if `mp_`i'_`p''>0{;
*Impact effectiveness;
*Ystar already exists;
*local mst_p`i'_h=`p`i'_`y'_3' - `p`i'_h';//Ideal MC with tax formula;
scalar eft_`i' = (`mp_`i'_`p''/`mp_`i'_`p'_s');//MC/MCstar;
local row=`row'+1;
matrix `rw'_ef[`rw_ie_`p'_`i'',`_`cc''] = eft_`i';
local rowsp=`rowsp'+1;
****Poverty Spending effectiveness;
tempvar bentouse;
gen double `bentouse'=abs(`vtouse1'-`vtouse2');
//! Uncomment out once fixed
****Poverty Spending effectiveness;
*tempvar bentouse;
cap drop ___bentouse;
gen double ___bentouse=abs(`vtouse1'-`vtouse2');
//! Uncomment after fixed.
cap drop ___t ;
gen double ___t = `vtouse2'+ abs(`bentouse') ;
covconc ``cc'' `pw' ;
local gini1 = r(gini) ;
covconc ``rw'' `pw' ;
local gini2 = r(gini) ;
ceqbensp `pw', startinc(`vtouse2') ben(`bentouse') zz(`_pline') obj1(`p1_`y'_orig') obj2(`p2_`y'_orig');
local dip = r(sp_ef_pov_`i') ;
if "`p1_`y'_orig'" ! = "" { ;
local squared = 1 ;
} ;
else if "`p2_`y'_orig'" != "" { ;
local squared = 2 ;
} ;
matrix `rw'_ef[`rw_se_`p'_`i'',`_`cc''] = r(sp_ef_pov_`i');
};
else{;
local row=`row'+1;
matrix `rw'_ef[`rw_ie_`p'_`i'',`_`cc''] = .;
local rowsp=`rowsp'+1;
matrix `rw'_ef[`rw_se_`p'_`i'',`_`cc''] = .;
};
*noisily di in green "Doing POV IMPACT EFF. BEN `rw' `cc' Row= `row'";
};
};
};
};
};
*noisily di in red "End of POV IMPACT EFF. `rw' `cc' Row= `row'";
*SPENDING EFFECTIVENESS FOR INEQUALITY;
local row=17;
*Only TAXES with MC>0 , with poverty it never happens with taxes;
if wordcount("`tax_`rw'_`cc''")>0 & wordcount("`ben_`rw'_`cc''")==0{;
_ceqmcid `pw', inc(``cc'') sptax(`tax_`rw'_`cc'') ;
*If Marg. Cont. is negative, SE is missing;
if r(mc_ineq)<0{;
matrix `rw'_ef[17,`_`cc''] = .;
};
else{;
cap drop ___t ;
gen double ___t = ``rw'' - abs(`tax_`rw'_`cc'') ; // It was adding taxes- April 1st, 2020
covconc ___t `pw' ;
local gini1 = r(gini) ;
covconc ``rw'' `pw' ;
local gini2 = r(gini) ;
_ceqspend `pw',inc(``cc'') sptax(`tax_`rw'_`cc'');
local seind=r(se_ind); // SE indicator is different when it's only taxes (se_ind) rather than only transfers (sp_ef)- Feb 15, 2020
matrix `rw'_ef[17,`_`cc''] =`seind';
};
};
*Only TRANSFERS with MC>0 ;
if wordcount("`tax_`rw'_`cc''")==0 & wordcount("`ben_`rw'_`cc''")>0{;
*Spending Effectiveness;
_ceqmcid `pw', inc(``cc'') spben(`ben_`rw'_`cc'') ;
*If Marg. Cont. is negative, SE is missing;
if r(mc_ineq)<0{;
matrix `rw'_ef[17,`_`cc''] = .;
};
else{;
cap drop ___t ;
gen double ___t = ``rw'' + abs(`ben_`rw'_`cc'') ; // It was substracting benefits- April 1st, 2020
covconc ___t `pw' ;
local gini1 = r(gini) ;
covconc ``rw'' `pw' ;
local gini2 = r(gini) ;
_ceqspend `pw',inc(``cc'') spben(`ben_`rw'_`cc'');
local spef=r(sp_ef);
matrix `rw'_ef[17,`_`cc''] =`spef';
};
};
*Beckerman Imervoll Effectiveness Indicators (row 2 to 30);
if (`_ppp'){; // Added if clause in case the user does not specify ppp since it's a necessary condition for these indicators - July 23rd, 2020
local row=33;
*noisily di in red "Begin of BECK EFF. `rw' `cc' Row= `row'";
// line 1608 to 1621 updated by Rosie on May 3rd, 2017;
foreach p in `plopts'{;
if "``p''"!=""{;
if substr("`p'",1,2)!="pl" {; // these are the national PL;
if _`p'_isscalar==1 { ;
local z= (``p''/`divideby')*(1/`ppp_calculated');
};
else if _`p'_isscalar==0 {;
tempvar z;
qui gen `z'= (``p''/`divideby')*(1/`ppp_calculated');
};
};
if substr("`p'",1,2)=="pl" {; // these are the national PL;
local z= ``p'';
};
ceqbeck `aw' ,preinc(``rw'_ppp') postinc(``cc'_ppp') zline(`z');
local rowbk=`rbk_`p'';
matrix `rw'_ef[`rowbk',`_`cc'']=r(VEE);//Vertical Expenditure Efficiency;
local rowbk=`rowbk'+1;
matrix `rw'_ef[`rowbk',`_`cc'']=r(Spill);//Spillover Index;
local rowbk=`rowbk'+1;
matrix `rw'_ef[`rowbk',`_`cc'']=r(PRE);//Poverty Reduction Efficiency;
local rowbk=`rowbk'+1;
matrix `rw'_ef[`rowbk',`_`cc'']=r(PGE);//Poverty Gap Efficiency;
local rowbk=`rowbk'+1;
};
else{;
local row=`row'+4;
};
};
*noisily di in red "End of BECK EFF. `rw' `cc' Row= `row'";
*FI/FGP (row 62 to to 82);
local row=62;
*noisily di in red "Begin of FI/FGP EFF. `rw' `cc' Row= `row'";
****TAXES AND TRANSFERS for R and N;
if "`tax_`rw'_`cc''"!=""{;
tempvar taxesef;
gen double `taxesef'=abs((`tax_`rw'_`cc''/`divideby')*(1/`ppp_calculated'));
};
if "`ben_`rw'_`cc''"!=""{;
tempvar benef;
gen double `benef'=(`ben_`rw'_`cc''/`divideby')*(1/`ppp_calculated');
};
local yes= wordcount("`tax_`rw'_`cc''")+wordcount("`ben_`rw'_`cc''");
if `yes'>0{; //ESTIMATE EFFECTIVENESS INDICATORS FOR CASES THAT APPLY;
foreach p in `plopts'{;
if "``p''"!=""{;
if substr("`p'",1,2)!="pl" {; // these are the national PL;
local z= (``p''/`divideby')*(1/`ppp_calculated');
};
if substr("`p'",1,2)=="pl" {; // these are the national PL;
local z= ``p'';
};
*FI/FGP effectiveness;
if wordcount("`tax_`rw'_`cc''")>0 & wordcount("`ben_`rw'_`cc''")>0{;
_fifgpmc `aw',taxes(`taxesef') benef(`benef') startinc(``rw'_ppp') endinc(``cc'_ppp') z(`z');
local rowfi=`rfi_`p'';
matrix `rw'_ef[`rowfi',`_`cc'']=r(MCEF_t);
local rowfi=`rowfi'+1;
matrix `rw'_ef[`rowfi',`_`cc'']=.;
local rowfi=`rowfi'+1;
matrix `rw'_ef[`rowfi',`_`cc'']=.;
local rowfi=`rowfi'+1;
};
if wordcount("`tax_`rw'_`cc''")>0 & wordcount("`ben_`rw'_`cc''")==0{;
*noisily di in green "HEEEEEEEEEEEEEEREEEEE" in red "`rw' to `cc'";
_fifgpmc `aw',taxes(`taxesef') startinc(``rw'_ppp') endinc(``cc'_ppp') z(`z');
local rowfi=`rfi_`p'';
matrix `rw'_ef[`rowfi',`_`cc'']=r(MCEF_t);
local rowfi=`rowfi'+1;
matrix `rw'_ef[`rowfi',`_`cc'']=.;
local rowfi=`rowfi'+1;
matrix `rw'_ef[`rowfi',`_`cc'']=.;
local rowfi=`rowfi'+1;
*noisily di r(MCEF_t);
*noisily di r(MCEF_pc);
*noisily di r(MCEF_n);
};
if wordcount("`tax_`rw'_`cc''")==0 & wordcount("`ben_`rw'_`cc''")>0{;
_fifgpmc `aw', benef(`benef') startinc(``rw'_ppp') endinc(``cc'_ppp') z(`z');
local rowfi=`rfi_`p'';
matrix `rw'_ef[`rowfi',`_`cc'']=r(MCEF_t);
local rowfi=`rowfi'+1;
matrix `rw'_ef[`rowfi',`_`cc'']=.;
local rowfi=`rowfi'+1;
matrix `rw'_ef[`rowfi',`_`cc'']=.;
local rowfi=`rowfi'+1;
*noisily di in green "FI/FGP INCOME COL:`cc':`_`cc'', row: `row', real col: `_`cc''";
};
};
**else{;
**local row=`row'+3;
**};
};
};
*noisily di in red "End of FI/FGP EFF. `rw' `cc' Row= `row'";
};
};
};
*noisily matrix list `rw'_ef;
};
};
};
****************
* SAVE RESULTS *
****************;
if `"`using'"'!="" {; // "
`dit' `"Writing to "`using'", may take several minutes"';
if "`sheet'"=="" local sheet=`"E9. Effectiveness"';
*Rows for core income concept results;
/*local r_m=11;
local r_mp=64;
local r_n=117;
local r_g=170;
local r_t=223;
local r_d=276;
local r_c=329;
local r_f=382;*/
local r_m=11;
local r_mp=95;
local r_n=179;
local r_g=263;
local r_t=347;
local r_d=431;
local r_c=515;
local r_f=599;
foreach y of local alllist{;
qui putexcel D`r_`y''=matrix(`y'_ef) using `"`using'"',keepcellformat modify sheet("`sheet'") ; // "
};
local date `c(current_date)';
local titlesprint;
local titlerow = 3;
local titlecol = 1;
local titlelist country surveyyear authors date ppp baseyear cpibase cpisurvey ppp_calculated scenario group project;
foreach title of local titlelist {;
returncol `titlecol';
if "``title''"!="" & "``title''"!="-1"
local titlesprint `titlesprint' `r(col)'`titlerow'=("``title''");
local titlecol = `titlecol' + 1;
};
qui putexcel `titlesprint' using `"`using'"', modify keepcellformat sheet("`sheet'");
qui putexcel A4=("Results produced by version `version' of `command' on `c(current_date)' at `c(current_time)'") using `"`using'"', modify keepcellformat sheet("`sheet'"); // "
// Export to Excel Poverty lines - October 15, 2020
local plcol = 2; // Column number where poverty lines are printed
returncol `plcol';
local _plcol `r(col)';
local rpovlines_ie =13; // IE poverty lines
local rpovlines_se=29; // SE poverty lines
local rpovlines_beck=43; // Beckerman Immervoll poverty lines
local rpovlines_FI=72; // FI poverty lines
local totalrows=84; // Number of rows until the next set of poverty lines
local rpovlines rpovlines_ie rpovlines_se rpovlines_beck rpovlines_FI;
local counter=1;
foreach rpl of local rpovlines {;
if `counter'==1 local rows=2; // rows between each poverty line. It is different for each each indicator
if `counter'==2 local rows=2;
if `counter'==3 local rows=4;
if `counter'==4 local rows=3;
local original ``rpl'';
forval j=1/8{;
forval i=1/3 {;
if `i'==1 & `j'==1 {;
local all_povlines `all_povlines' `_plcol'``rpl''=("$`pl`i'' PPP");
local rpl = ``rpl'' + `rows';
};
else{;
local all_povlines `all_povlines' `_plcol'`rpl'=("$`pl`i'' PPP");
local rpl = `rpl' + `rows';
};
};
local rpl = `original' + `totalrows'*`j';
local lpovlines `lpovlines' `all_povlines';
};
local ++counter;
}; // rpovlines
qui putexcel `lpovlines' using `"`using'"', keepcellformat modify sheet("`sheet'"); // printing poverty lines
}; // if using
********
* OPEN *
********;
if "`open'"!="" & "`c(os)'"=="Windows" {;
shell start `using'; // doesn't work with "" or `""' so I already changed `open' to "" if using has spaces, ;
};
else if "`open'"!="" & "`c(os)'"=="MacOSX" {;
shell open `using';
};
else if "`open'"!="" & "`c(os)'"=="Unix" {;
shell xdg-open `using';
};
}; // missing brace - March 31st, 2020
************
* CLEAN UP *
************;
quietly putexcel clear;
restore;
end; // END ceqef;