By default, all measures are estimated.
A quick start
As an example, we will now demonstrate the estimation of the global
MPI for Benin in 2006.
# Estimate the Benin global MPI 2006
estimate.01 <- mpitb.est(set, k = 33, measures = "M0", indmeasures = NULL)
## ****** SPECIFICATION ******
## Call:
## mpitb.est.mpitb_set(set = set, klist = 33, measures = "M0", indmeasures = NULL)
## Name: ben_dhs06
## Weighting scheme: equal
## Description: Benin global MPI 2006
## ___________________
##
## Dimension 1: hl 0.333 (d_nutr, d_cm)
## Dimension 2: ed 0.333 (d_satt, d_educ)
## Dimension 3: ls 0.333 (d_elct, d_sani, d_wtr, d_hsg, d_ckfl, d_asst)
## ___________________
##
## Indicator 1: d_nutr 0.1667
## Indicator 2: d_cm 0.1667
## Indicator 3: d_satt 0.1667
## Indicator 4: d_educ 0.1667
## Indicator 5: d_elct 0.0556
## Indicator 6: d_sani 0.0556
## Indicator 7: d_wtr 0.0556
## Indicator 8: d_hsg 0.0556
## Indicator 9: d_ckfl 0.0556
## Indicator 10: d_asst 0.0556
##
## ****** ESTIMATION ******
## ___________________
## Partial AF measures: ' M0 ' under estimation... DONE
##
## ****** RESULTS ******
## ___________________
## Parameters
## Subgroups: 1
## Poverty cut-offs (k): 1
##
## *Notes:
## Confidence level: 95 %
## Parallel estimations: FALSE
Upon execution, the mpitb.est
function displays a
message that includes the function call itself, a list of dimensions
with their assigned indicators and corresponding weights (allowing users
to verify the setup), the specific measures that have been estimated,
relevant estimation parameters such as the number of poverty cut-offs
and subgroups analyzed, and other important features like the confidence
level used for calculating confidence intervals and whether parallel
estimation has been employed. This detailed message can be suppressed by
setting the verbose
argument to FALSE
within
the mpitb.est
function call.
The estimation results are stored in the estimate.01
object, which is an instance of the mpitb_est
class. This
object is a list containing two data frames: lframe
, which
encompasses all cross-sectional estimates for each level of analysis,
and cotframe
, which contains measures of change over time
for each level of analysis. However, since this example does not involve
changes-over-time analysis, the cotframe
element will be
NULL
. This structure allows for flexible storage and
retrieval of both cross-sectional and longitudinal poverty
estimates.
# Take a glance at the results
as.data.frame(estimate.01$lframe)
## b se ll ul subg loa measure ctype k indicator
## 1 0.4381315 0.00604726 0.426297 0.4500369 nat nat M0 lev 33 NA
This displays the raw data frame of our estimates. The first four
columns provide the point estimate (b
), the standard error
of the point estimate (se
), which accounts for the survey
design, and the lower and upper bound of the confidence interval
(lb
and ub
), with confidence intervals
calculated considering the measures as proportions. measure
and k
columns indicate the specific AF measure and poverty
cut-off, respectively, to which each estimate corresponds.
Analyzing poverty across population groups
We have previously established that the MPI can be calculated as the
sum of the MPIs of mutually exclusive population subgroups, weighted by
the population share of each group. This decomposition is crucial for
identifying sociodemographic disparities in poverty distribution.
Typically, global MPI analyses explore differences across rural-urban
areas, different age cohorts, and by gender.
To calculate the MPI for specific subgroups, utilize the
over
argument within the mpitb.est
function.
This argument accepts a character vector specifying the column names of
the population groups for which poverty analysis is desired.
Let’s examine disparities between rural and urban areas in Benin
during 2006. We can execute the following code:
# Include living areas in the MPI calculation
estimate.02 <- mpitb.est(set, k = 33, measures = "M0", indmeasures = NULL,
over = "area", verbose = FALSE)
# View results
as.data.frame(estimate.02$lframe)
## b se ll ul subg loa measure ctype k
## 1 0.4381315 0.006047260 0.4262970 0.4500369 nat nat M0 lev 33
## 2 0.5313261 0.007133483 0.5173004 0.5453025 rural area M0 lev 33
## 3 0.2852113 0.010101845 0.2657999 0.3054505 urban area M0 lev 33
## indicator
## 1 NA
## 2 NA
## 3 NA
Again, results are presented as a data frame. The population group
(in this case, area
) is identified in loa
column, which stands for ‘level of analysis’. The corresponding MPI
estimates for each level of analysis are labeled by each subgroup in the
subg
column. Note that another loa
entry
exists with a unique subgroup called “nat”. This represents the MPI
estimate calculated across all the observations within the data set,
generally at the national level. To exclude the overall national
estimate, set the overall
argument to FALSE
within the mpitb.est
function.
The following code generates a barplot using ggplot2
to
visualize and compare national, and living-area poverty levels.
# Save complete subgroups names to be used in the plots
subg_names <- c("National","Rural","Urban")
plt_data.MPI <- as.data.frame(estimate.02$lframe) %>%
# Replace the subgroup names by their complete names
mutate(subg = factor(stringi::stri_replace_all_regex(
subg, pattern = c("nat","rural","urban"),
replacement = subg_names, vectorize = F), levels = subg_names))
# Plot!
plt <- ggplot(plt_data.MPI,
aes(x = subg, y = b, fill = subg)) +
geom_bar(stat = "identity", position = "dodge", width = 0.5) +
# Add confidence intervals
geom_errorbar(aes(ymin = ll, ymax = ul), width = 0.15) +
# Axis labels
labs(x = "Level of Analysis", y = "MPI", fill = "Subgroups") +
# White background
theme_bw() +
# Legend position
theme(legend.position = "bottom") +
# Bars color
scale_fill_manual(values = c("#8C8C8CFF", "#88BDE6FF", "#FBB258FF"))
# Show plot
plt
Figure 1 demonstrates that poverty levels in rural areas are
significantly higher than in urban areas of Benin (0.531 and 0.285, respectively). Confidence intervals
are displayed at the top of each bar. A good practice for comparing
poverty levels is to examine if the confidence intervals do not overlap.
In this example, it is possible to infer that multidimensional poverty
in rural Benin is statistically higher than in urban Benin.
To further investigate whether higher multidimensional poverty in
rural Benin is primarily driven by a larger proportion of poor
individuals (incidence, H) or
by the rural poor experiencing greater deprivation (intensity, A), we can incorporate these two
measures into our previous analysis using the measures
argument.
# Include incidence H and intesity A in the MPI calculation
estimate.03 <- mpitb.est(set, k = 33, measures = c("M0","H","A"), indmeasures = NULL,
over = c("area"), verbose = FALSE)
# Explore coefficients of H and A
# Incidence
coef(subset(estimate.03$lframe, measure == "H" & loa == "area"))
## Subgroup Level of analysis Cut-off Coefficient
## 1 rural area 33 0.876
## 2 urban area 33 0.527
# Intensity
coef(subset(estimate.03$lframe, measure == "A" & loa == "area"))
## Subgroup Level of analysis Cut-off Coefficient
## 1 rural area 33 0.607
## 2 urban area 33 0.541
While the intensity of poverty is statistically higher in rural areas
of Benin than in urban areas, the difference in intensity compared to
urban areas is not as pronounced as the difference in incidence (87.59% of the rural population experiencing
multidimensional poverty compared to 52.73% in urban areas).
! A final important caveat: when analyzing
multidimensional poverty across different subgroups, avoid subsetting
the dataset to isolate specific groups before specifying the measurement
project with mpitb.set
function. Subsetting the data can
impact the degrees of freedom, potentially compromising the accuracy of
statistical inferences.
Indicator-specific measures analysis
Breaking down the MPI by indicators provides valuable insights in
multidimensional poverty analysis. We can compare the censored and
uncensored headcount ratios of each indicator and explore their
contribution (absolute and percentage) to the MPI. This granular
analysis can be further refined by examining these contributions across
different population subgroups, offering a high-resolution lens of
poverty within a society.
As mentioned earlier, the argument indmeasures
in the
mpitb.est
function encompasses all the indicator-specific
measures and, by default, all of them are calculated. This is why we
previously set this argument to NULL
.
# Estimate indicator-specific measures
# We specify nothing in `indmeasures`
# since all of them are calculated by default.
estimate.04 <- mpitb.est(set, k = 33, measures = "M0", over = "area")
## ****** SPECIFICATION ******
## Call:
## mpitb.est.mpitb_set(set = set, klist = 33, measures = "M0", over = "area")
## Name: ben_dhs06
## Weighting scheme: equal
## Description: Benin global MPI 2006
## ___________________
##
## Dimension 1: hl 0.333 (d_nutr, d_cm)
## Dimension 2: ed 0.333 (d_satt, d_educ)
## Dimension 3: ls 0.333 (d_elct, d_sani, d_wtr, d_hsg, d_ckfl, d_asst)
## ___________________
##
## Indicator 1: d_nutr 0.1667
## Indicator 2: d_cm 0.1667
## Indicator 3: d_satt 0.1667
## Indicator 4: d_educ 0.1667
## Indicator 5: d_elct 0.0556
## Indicator 6: d_sani 0.0556
## Indicator 7: d_wtr 0.0556
## Indicator 8: d_hsg 0.0556
## Indicator 9: d_ckfl 0.0556
## Indicator 10: d_asst 0.0556
##
## ****** ESTIMATION ******
## ___________________
## Partial AF measures: ' M0 ' under estimation... DONE
##
## ___________________
## Indicator-specific measures: ' hd hdk actb pctb ' under estimation... DONE
##
## ****** RESULTS ******
## ___________________
## Parameters
## Subgroups: 2
## Poverty cut-offs (k): 1
##
## *Notes:
## Confidence level: 95 %
## Parallel estimations: FALSE
# View results
head(estimate.04$lframe)
## b se ll ul subg loa measure ctype k
## 1 0.4381315 0.006047260 0.4262970 0.4500369 nat nat M0 lev 33
## 2 0.5313261 0.007133483 0.5173004 0.5453025 rural area M0 lev 33
## 3 0.2852113 0.010101845 0.2657999 0.3054505 urban area M0 lev 33
## 113 0.4527050 0.007121543 0.4387647 0.4667199 nat nat hd lev NA
## 212 0.5065955 0.009153211 0.4886248 0.5245491 rural area hd lev NA
## 311 0.3642776 0.011294546 0.3424047 0.3867260 urban area hd lev NA
## indicator
## 1 <NA>
## 2 <NA>
## 3 <NA>
## 113 d_nutr
## 212 d_nutr
## 311 d_nutr
The indicator
column now makes more sense. It clearly
indicates to which indicator the estimated measure (measure
column) corresponds.
In practice, a valuable exercise involves comparing visually the
uncensored and censored indicators’ headcount ratios and the
contributions of each indicator within each population subgroup. This
deeper exploration reveals how the structure of poverty changes across
different segments of society.
# Save complete indicators names to be used in the plots
indicators_names <- c("Nutrition","Child Mortality",
"School Attendance","Years of Schooling",
"Electricity","Sanitation","Water",
"Housing","Cooking Fuel","Assets")
# Rearrange data to create fancier plots :)
plt_data.hd <- as.data.frame(estimate.04$lframe) %>%
# Filter by the indicators headcount ratios
filter(measure == "hd" | measure == "hdk") %>%
# Replace the indicators names by their complete names
mutate(indicator = factor(stringi::stri_replace_all_regex(
indicator, pattern = unlist(indicators),
replacement = indicators_names, vectorize = F), levels = indicators_names)) %>%
# Replace the subgroup names by their complete names
mutate(subg = factor(stringi::stri_replace_all_regex(
subg, pattern = c("nat","rural","urban"),
replacement = subg_names, vectorize = F), levels = subg_names)) %>%
# Replace the measure abbreviation by their complete names
mutate(measure = ifelse(measure == 'hd', 'Uncensored',
ifelse(measure == 'hdk', 'Censored', measure)))
# Plot!
plt <- ggplot(plt_data.hd,
aes(x = indicator, y = b, fill = measure)) +
geom_bar(stat = "identity", width = 0.5,
position=position_dodge()) +
# Headcount as percentage
scale_y_continuous(labels = scales::percent) +
# Legend position
theme(legend.position = "right") +
# Axis Labels
labs(y = "Indicators Headcount ratios", fill = "Measure", x = "Indicators") +
# White background
theme_bw() +
# facet by population subgroups
facet_grid(rows = vars(subg)) +
# Fit indicators names by rotating them
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Show plot
plt
Figure 2 illustrates the raw and censored headcount ratios for each
indicator in Benin. The raw headcount represents the overall percentage
of the population deprived in a specific indicator, while the censored
headcount focuses on the percentage of the multidimensionally poor
population experiencing that particular deprivation.
The figure reveals several key findings. Firstly, living standards
indicators generally exhibit higher deprivation rates compared to other
indicators. Secondly, the population in Benin demonstrates significant
deprivation in nutrition and years of schooling.
Furthermore, remarkable disparities exist between rural and urban
areas. In rural regions, the raw and censored headcount ratios for most
indicators tend to be closer, indicating a strong correlation between
deprivation in any dimension and overall poverty. This insight could
have significant implications for the design of targeted poverty
reduction programs.
A concerning finding is that approximately 50% of the rural population lives with a
child who is either undernourished and/or not attending school.
Additionally, access to essential services like water, electricity, and
adequate housing materials is notably more precarious in rural areas.
Finally, educational attainment levels are significantly lower in rural
compared to urban regions.
Figure 3 presents a comparative analysis of poverty across national,
rural, and urban populations concerning the contribution of each
indicator. The figure includes two bar plots. The left-hand panel
displays the absolute contribution of each indicator to the MPI value
for each subgroup. The height of each colored bar represents the
absolute contribution, and the sum of all bars within a subgroup equals
the total MPI value for that group. The right-hand panel illustrates the
percentage contribution of each indicator to the overall MPI for each
subgroup. The height of each bar represents the percentage contribution,
and the sum of all bars within a subgroup equals 100%. This dual
representation allows for a direct visual comparison of the composition
of poverty across different population subgroups, revealing the relative
importance of each deprivation dimension within each context.
# Filter contributions estimates
# Absolute contributions
plt_data.actb <- as.data.frame(estimate.04$lframe) %>%
filter(measure == "actb") %>%
# Order indicators by dimensions conveniently to plot
# we want to avoid alphabetical order in the plot and group by dimension
mutate(indicator = factor(stringi::stri_replace_all_regex(
indicator, pattern = unlist(indicators),
replacement = indicators_names, vectorize = F), levels = indicators_names)) %>%
# Replace the subgroup names by their complete names
mutate(subg = factor(stringi::stri_replace_all_regex(
subg, pattern = c("nat","rural","urban"),
replacement = subg_names, vectorize = F), levels = subg_names))
# Percentage contributions
plt_data.pctb <- as.data.frame(estimate.04$lframe) %>%
filter(measure == "pctb") %>%
# Order indicators by dimensions conveniently to plot
# we want to avoid alphabetical order in the plot and group by dimension
mutate(indicator = factor(stringi::stri_replace_all_regex(
indicator, pattern = unlist(indicators),
replacement = indicators_names, vectorize = F), levels = indicators_names)) %>%
# Replace the subgroup names by their complete names
mutate(subg = factor(stringi::stri_replace_all_regex(
subg, pattern = c("nat","rural","urban"),
replacement = subg_names, vectorize = F), levels = subg_names))
# Define palettes by indicators (different colors for each dimension)
palettes <- c("#A50026FF", "#D73027FF",
"#FFFFE5FF", "#FFF7BCFF",
"#B9DDF1FF", "#94C1E0FF","#75A6CBFF",
"#5889B6FF", "#42779EFF", "#2A5783FF")
# Plot Absolute contribution
plt.actb <- ggplot(plt_data.actb,
aes(x = subg, y = b, fill = indicator)) +
geom_bar(stat = "identity", width = 0.5) +
# Axis Labels
labs(y = "Contribution to MPI value", fill = "Indicators", x = "Subgroups") +
# White background
theme_bw() +
# Remove legend
theme(legend.position = "none") +
# Colour palettes of each indicator
scale_fill_manual(values = palettes)
# Plot Percentage contribution
plt.pctb <- ggplot(plt_data.pctb,
aes(x = subg, y = b, fill = indicator)) +
geom_bar(stat = "identity", width = 0.5) +
# Contributions as percentage
scale_y_continuous(labels = scales::percent) +
# Axis labels
labs(y = "Percentage Contribution to the MPI", fill = "Indicators", x = "Subgroups") +
# White background
theme_bw() +
# Legend position
theme(legend.position = "right") +
# Colour palettes of each indicator
scale_fill_manual(values = palettes)
# Show plot
gridExtra::grid.arrange(plt.actb, plt.pctb, ncol = 2,
widths = c(0.40, 0.55),
heights = c(1))
! Users should be aware that the number of estimates
generated can increase significantly depending on the specific measures
requested and the number of population subgroups analyzed. For example,
a total of 43 measures can be calculated in a ten-indicator MPI, and
this number grows proportionally with the number of population subgroups
and poverty cut-offs. To optimize processing time, it is crucial to
carefully select the desired measures within the mpitb.est
arguments.