Providing Pensions for the Poor: Targeting Cash Transfers for the Elderly in Mexico

Overview

In December of 2006, the Mexican congress approved a budget for the 2007 year that included an allocation of 8.5B pesos for an elderly pension program designed to assist poor persons aged 70 and older. The new program builds on a number of exiting social programs and addresses concerns that prior programs did not reduce poverty rates among elderly, especially in rural areas. The purpose of this case study is to compare 3 competing implementation options and weigh them against a set of constraints that the program must operate under.

Historical Context

In the mid-1990’s, Mexico suffered from a significant economic crisis that saw the poverty rate jump from 53% in 1994 to 69% in 1996. This lead the country to overhaul its social protection programs. By 2006, the poverty rate had been decreased to 43% with the help of the Oportunidades program that used conditional cash transfers to assist poor families. One persistent problem, however, was the poverty rate among seniors aged 65 and older. Within this group, the poverty rate among rural seniors was much higher than that of their urban counterparts as shown in this table.

Population 65 years and older Poverty Rate Pension Rate
Urban 35.6% 6.7%
Rural 54.7% 0.8%

Prior to the 1990’s, the prevailing belief in Mexico was that goods subsidized by social spending were primarily consumed by the poor. It was realized that this was not the case and as a result, designing programs that more effectively targeted the poor became the focus. The PROGRESA program, which was renamed Oportunidades in 2000, was born out of this new mindset.

In 2006, when the new budget was passed, then President Felipe Calderon wanted to ensure that the program was providing assistance to those who needed it most. Earlier, he had been critical of a “universal” pension program implemented in Mexico City. His primary concern was that scarce resources were not being allocated efficiently.

The Problem

Mexican congress approved the 2007 budget on 23 DEC 2006 and appropriated $8.5B to provide pensions to senior citizens (age 70 and older). This entailed a monthly payment of $500 to each enrolled individual. The budget did not specify eligibility criteria.

In light of the president’s concerns about efficiency, conduct a policy options analysis to determine the specific criteria to be used for a new pension program that will provide poor people, ages 70 and older, a monthly pension of $500 or $6,000 per year. There is budget approval for this new program for the amount of 8.5 billion pesos in its first year. However, eligibility criteria still need to be determined. Who should be eligible for the pension?

Note

The Mexican Peso is denoted by the $ symbol and for brevity, the $ will used to denote Peso amounts in this analysis.

Three eligibility criteria are being proposed:

  1. Oportunidades Criteria - All individuals age 70+ in households eligible for an existing social welfare program called Oportunidades

  2. Rural Locales - All individuals age 70+ in rural locales with a population <2,500

  3. Social Marginality Index - All individuals age 70+ in locales with a “high” or “very high” level of marginality according to the index. This index categorizes all towns/cities on a 5-point scale (very low, low,medium, high, and very high marginality) using data on access to health care, education, housing, water and sanitation

The criteria for comparing and contrasting these eligibility criteria policy options include economy, efficiency, and equity. Efficiency will be determined using the measures leakage and undercoverage.

Leakage refers to persons who receive the pension but are not members of the target population.

\[ \frac{\text{\# enrolled who are not poor}}{\text{Total \# enrolled in program}} \]

Undercoverage refers to persons who should receive the pension but are not reached by the program.

\[ \frac{\text{\# of poor individuals not enrolled}}{\text{Total \# enrolled in program}} \]

For the purposes of this analysis, economy will be measured in terms of cost per target individual served. Options with higher leakage will be penalized by the higher cost per target individual. Equity will be assessed by comparing leakage and undercoverage rates. The goal is to reach as many qualified individuals as possible while minimizing the number of individuals who receive the pension unnecessarily.

Financial Feasibility

There is a budget constraint of 8.5 billion pesos. The most people the program can serve is 8.5 billion pesos/6000 pesos for the annual pension per person or 1,416,667 people.

Data on the efficiency of each option was collected and tabulated. Note that the marginality option was broken into two groups because the budget constraint of $8.5B prevents all individuals from being served. When this was done, the undercoverage of the marginality option increased from 44% to 74%.

Show the code
# generate display table of option efficiency measures.
data |> 
  rename(c(
      "Option"=option, 
      "People Served" = people_served,
      "Leakage" = Leakage,
      "Undercoverage" = Undercoverage
    )
  ) |> 
  gt() |> 
  tab_header(
    title = "Program performance"
  ) |> 
  fmt_number(columns = `People Served`, sep_mark = ",", decimals = 0) |> 
  fmt_percent(columns = c(Leakage, Undercoverage))
Program performance
Option Leakage Undercoverage People Served
Oportunidades 25.76% 65.93% 859,299
Rural Locales 43.28% 57.19% 1,413,182
Marginality A 65.53% 44.03% 3,040,844
Marginality B 65.53% 73.91% 1,416,667
Important

Because both the leakage and undercoverage of the marginality option are both so high, this option has been removed from consideration. Only the Oportunidades and Rural Locales options will be considered in the analysis and recommendations.

Analysis

The goal of the analysis is to identify the option that best satisfies the program constraints and balances the assessment criteria of efficiency, economy, and equity.

Criteria for analysis:

  1. Efficiency - Will people in need receive the pension, and people not in need not receive the pension
  2. Financial feasibility - the budget for this is $8.5B
  3. Ethical Implications - Is the option fair to all affected? Will it create or widen inequities?

Comparing the Oportunidates and Rural Locales program options

Using the program performance data additional quantities can be computed that will allow for a comparison of the two options under consideration.

We can compare the leakage count using the following equation \[ \text{leakage count} = \text{total served}*\text{leakage rate}. \] This value can then be subtracted from the total number of people served to determine how many eligible individuals are served by the program.

\[ \text{eligible served count} = \text{total served} - \text{leakage count} \]

Show the code
yearly_pension_amt <- 6000
total_served_A <- 859299
total_served_B <- 1413182

# the number of individuals who are served but should not be
leakage_option_A <- ceiling(total_served_A*0.2576)
leakage_option_B <- ceiling(total_served_B*0.4328)

# number of people served who actually qualify
target_pop_served_A <- total_served_A - leakage_option_A
target_pop_served_B <- total_served_B - leakage_option_B

# the total cost of each option (not including administrative overhead)
total_cost_A <- total_served_A*yearly_pension_amt
total_cost_B <- total_served_B*yearly_pension_amt

# a measure of the cost to serve someone who actually needs the help
economy_A <- total_cost_A/target_pop_served_A
economy_B <- total_cost_B/target_pop_served_B

df_populations <- data.frame(
  option = c("Oportunidades","Rural Locales"),
  leaked_pop = c(leakage_option_A, leakage_option_B),
  served_pop = c(target_pop_served_A, target_pop_served_B),
  total_cost = c(total_cost_A, total_cost_B),
  cost_efficiency = c(economy_A, economy_B)
)

For Oportunidades, the number of eligible persons served by the program is 637,943 while 801,556 are served by the Rural Locales program option.

The total cost of each program is simply the product of the total number of people in the program and the yearly pension about, which is $6,000.

For the Oportunidades program option, this amounts to $5.16B while for the Rural Locales program option the total cost is $8.48B. Dividing the total cost of each program by the number of eligible persons served gives us an indication of the economy of the program.

\[ \text{cost per eligible senior} = \frac{\text{total program cost}}{\text{eligible served count}} \] The cost per eligible senior for the Oportunidades program option is $8,082 and for Rural Locales program option the cost per eligible senior is $10,578.

The cost per eligible senior for the Oportunidades is 24% less than that for Rural Locales. Oportunidades also serves 80% of the eligible seniors served by Rural Locales while costing 40% less.

Both options are financially feasible, but Oportunidades is more efficient than Rural Locales. Comparing the equity of the two programs is more challenging. Overall, Rural Locales server more people and more eligible people. It reaches 163,613 more eligible people than Oportunidades does. On the other hand, it does this much less efficiently and at greater cost.

Recommendations

The recommendation from the Deputy Director of General Planning is to proceed with Option A, which utilizes the existing Oportunidades program. There are a number of reasons for this. First, while the Rural Locales program option does reach more people, most of those additional people reached do not need the assistance.

Show the code
df_total <- data |> 
  filter(option %in% c("Oportunidades", "Rural Locales")) |> 
  inner_join(df_populations, by="option") |> 
  pivot_longer(cols = -option, names_to = "metric", values_to = "measure") |> 
  mutate(
    metric = case_when(
      metric == "leaked_pop" ~ "Ineligible",
      metric == "served_pop" ~ "Eligible",
      metric == "people_served" ~ "Total served",
      metric == "cost_efficiency" ~ "Cost efficiency",
      metric == "total_cost" ~ "Total cost",
      TRUE ~ metric
    )
  )

df_total |>
  filter(metric %in% c("Ineligible", "Eligible")) |> 
  ggplot(aes(
    x=option,
    y=measure, 
    fill=as_factor(metric), 
    label=formatC(measure, format = "d", big.mark = ","))
  ) +
  geom_col() +
  geom_text(colour="white", position = position_stack(vjust = 0.5)) +
  labs(
    x = element_blank(),
    y = "Number of People Served",
    fill = "",
    title = "Oportunidades reaches 80% of the eligible seniors reached by the Rural criterion",
    caption = "Figure 1"
  ) +
  scale_y_continuous(breaks=c(0,500000,1000000), labels = c("0", "500K", "1M"))

The Oportunidades program option is more efficient in that it reaches 80% of the eligible persons assisted by the Rural Locales program option but for 60% of the cost.

Show the code
df_total |>
  filter(metric == "Total cost") |> 
  ggplot(aes(
    x=option,
    y=measure, 
    # format the labels to make them easier to read
    label=paste("$", round(measure/10^9, 2),"B", sep=""))
  ) +
  geom_col() +
  # put the labels right in the middle of the bar
  geom_text(position = position_stack(vjust = 0.5), colour="white") + 
  labs(
    x = element_blank(),
    y = "Cost in Pesos ($)",
    title = "Oportunidades costs 40% less than the Rural Locales option",
    caption = "Figure 2"
  ) +
  scale_y_continuous(breaks=c(seq(0,8,2)*10^9), labels = c("0", "$2B", "$4B", "$6B", "$8B"))

This increased efficiency can be seen in figure 3 which shows that due to the lower number of ineligible people being served, the cost per eligible person is $8,082 vs $10,578.

Show the code
df_total |>
  filter(metric == "Cost efficiency") |> 
  cbind(data.frame(base_cost = c(yearly_pension_amt))) |>
  mutate(
    overhead = measure - base_cost
  ) |> 
  select(option, overhead, base_cost) |> 
  pivot_longer(cols = c(overhead, base_cost), names_to = "metric", values_to = "measure") |> 
  mutate(
    metric = as_factor(case_when(
      metric == "base_cost" ~ "Yearly Pension",
      metric == "overhead" ~ "Overhead"
    ))
  ) |> 
  ggplot(aes(
    x=option,
    y=measure,
    fill=metric,
    # format labels to make them more user friendly
    label=paste("$", formatC(round(measure, 0), format="d", big.mark = ","), sep=""))
  ) +
  geom_col() +
  geom_text(position = position_stack(vjust = 0.5), colour="white") + 
  labs(
    x = element_blank(),
    y = "Cost in Pesos ($) per person served",
    title = "Oportunidades allocates funding more efficiently to those who need it most",
    subtitle = "Ineligible people in the system increase the cost per eligible person",
    caption = "Figure 3",
    fill=element_blank()
  ) +
  scale_y_continuous(breaks=c(seq(0,10,2.5)*1000), labels = c("0", "$2.5K", "$5K", "$7.5K", "$10K"))

Because of the significant difference in the efficiency of the two options, the recommendation is it proceed with the Oportunidades program option. The savings can be used to improve the program, particularly the number of eligible persons not covered initially. Remaining funds can then be carried over into the next year and applied to eligible persons who were not covered in the first year or the program.