✔️ median income among those below the threshold
✔️ useful for understanding the depth of poverty
✔️ related to the RMPG
❌ not very common outside the EU
❌ not immediately interpretable in terms of the poverty gap
Median income below the at-risk-of-poverty-threshold (POORMED) is median of incomes of people having the income below the ARPT:
\[ poormed = median\{y_i; y_i< arpt\} \] The details of the linearization of the POORMED are discussed by Deville (1999Deville, Jean-Claude. 1999. “Variance Estimation for Complex Statistics and Estimators: Linearization and Residual Techniques.” Survey Methodology 25 (2): 193–203. http://www.statcan.gc.ca/pub/12-001-x/1999002/article/4882-eng.pdf.) and Osier (2009Osier, Guillaume. 2009. “Variance Estimation for Complex Indicators of Poverty and Inequality.” Journal of the European Survey Research Association 3 (3): 167–95. http://ojs.ub.uni-konstanz.de/srm/article/view/369.).
The R
vardpoor
package (Breidaks, Liberts, and Ivanova 2016Breidaks, Juris, Martins Liberts, and Santa Ivanova. 2016. “Vardpoor: Estimation of Indicators on Social Exclusion and Poverty and Its Linearization, Variance Estimation.” Riga, Latvia: CSB.), created by researchers at the Central Statistical Bureau of Latvia, includes a POORMED coefficient calculation using the ultimate cluster method. The example below reproduces those statistics.
Load and prepare the same data set:
# load the convey package
library(convey)
# load the survey library
library(survey)
# load the vardpoor library
library(vardpoor)
# load the vardpoor library
library(laeken)
# load the synthetic EU statistics on income & living conditions
data(eusilc)
# make all column names lowercase
names(eusilc) <- tolower(names(eusilc))
# add a column with the row number
dati <- data.table::data.table(IDd = 1:nrow(eusilc), eusilc)
# calculate the poormed coefficient
# using the R vardpoor library
varpoord_poormed_calculation <-
varpoord(
# analysis variable
Y = "eqincome",
# weights variable
w_final = "rb050",
# row number variable
ID_level1 = "IDd",
# row number variable
ID_level2 = "IDd",
# strata variable
H = "db040",
N_h = NULL ,
# clustering variable
PSU = "rb030",
# data.table
dataset = dati,
# poormed coefficient function
type = "linpoormed",
# get linearized variable
outp_lin = TRUE
)
# construct a survey.design
# using our recommended setup
des_eusilc <-
svydesign(
ids = ~ rb030 ,
strata = ~ db040 ,
weights = ~ rb050 ,
data = eusilc
)
# immediately run the convey_prep function on it
des_eusilc <- convey_prep(des_eusilc)
# coefficients do match
varpoord_poormed_calculation$all_result$value
## [1] 8803.735
## eqincome
## 8803.735
# linearized variables do match
# vardpoor
lin_poormed_varpoord <-
varpoord_poormed_calculation$lin_out$lin_poormed
# convey
lin_poormed_convey <-
attr(svypoormed( ~ eqincome , des_eusilc), "lin")
# check equality
all.equal(lin_poormed_varpoord, lin_poormed_convey)
## [1] "names for current but not for target"
## eqincome
## eqincome 5311.47
## [1] 5302.086
## [1] 72.81542
## eqincome
## eqincome 72.87983
The variance estimator and the linearized variable \(z\) are both defined in Linearization-Based Variance Estimation. The functions convey::svypoormed
and vardpoor::linpoormed
produce the same linearized variable \(z\).
However, the measures of uncertainty do not line up, because library(vardpoor)
defaults to an ultimate cluster method that can be replicated with an alternative setup of the survey.design
object.
# within each strata, sum up the weights
cluster_sums <-
aggregate(eusilc$rb050 , list(eusilc$db040) , sum)
# name the within-strata sums of weights the `cluster_sum`
names(cluster_sums) <- c("db040" , "cluster_sum")
# merge this column back onto the data.frame
eusilc <- merge(eusilc , cluster_sums)
# construct a survey.design
# with the fpc using the cluster sum
des_eusilc_ultimate_cluster <-
svydesign(
ids = ~ rb030 ,
strata = ~ db040 ,
weights = ~ rb050 ,
data = eusilc ,
fpc = ~ cluster_sum
)
# again, immediately run the convey_prep function on the `survey.design`
des_eusilc_ultimate_cluster <-
convey_prep(des_eusilc_ultimate_cluster)
# matches
stopifnot(all.equal(
attr(svypoormed(~ eqincome , des_eusilc_ultimate_cluster) , 'var')[1],
varpoord_poormed_calculation$all_result$var
))
# matches
stopifnot(all.equal(
SE(svypoormed(~ eqincome , des_eusilc_ultimate_cluster))[1],
varpoord_poormed_calculation$all_result$se
))
For additional usage examples of svypoormed
, type ?convey::svypoormed
in the R
console.
This section displays example results using nationally-representative surveys from both the United States and Brazil. We present a variety of surveys, levels of analysis, and subpopulation breakouts to provide users with points of reference for the range of plausible values of the svypoormed
function.
To understand the construction of each survey design object and respective variables of interest, please refer to section 1.4 for CPS-ASEC, section 1.5 for PNAD Contínua, and section 1.6 for SCF.
## poormed SE
## htotval 24001 202.67
## sex htotval se.htotval
## male male 25010 248.9748
## female female 23040 376.7984
## poormed SE
## ftotval 29000 221.99
## sex ftotval se.ftotval
## male male 30044 275.2839
## female female 27184 496.5440
## poormed SE
## pearnval 28000 684.82
## sex pearnval se.pearnval
## male male 28000 144.2578
## female female 28000 878.5112
## poormed SE
## deflated_per_capita_income 366.23 4.4574
## sex deflated_per_capita_income se.deflated_per_capita_income
## male male 369.2743 4.504995
## female female 364.3737 4.483770
## poormed SE
## deflated_labor_income 502.67 4.5457
## sex deflated_labor_income se.deflated_labor_income
## male male 512.4121 5.2748713
## female female 498.4078 0.8745423
## Multiple imputation results:
## with(scf_design, svypoormed(~networth))
## scf_MIcombine(with(scf_design, svypoormed(~networth)))
## results se
## networth 14242 963.1121
## Multiple imputation results:
## with(scf_design, svyby(~networth, ~hhsex, svypoormed))
## scf_MIcombine(with(scf_design, svyby(~networth, ~hhsex, svypoormed)))
## results se
## male 19082.0 1907.857
## female 8896.4 1268.692
## Multiple imputation results:
## with(scf_design, svypoormed(~income))
## scf_MIcombine(with(scf_design, svypoormed(~income)))
## results se
## income 25077.15 887.2537
## Multiple imputation results:
## with(scf_design, svyby(~income, ~hhsex, svypoormed))
## scf_MIcombine(with(scf_design, svyby(~income, ~hhsex, svypoormed)))
## results se
## male 27022.8 702.1986
## female 23347.7 961.0849