This document presents an Extended Cost-Effectiveness Analysis (ECEA) of the Empower Health intervention compared to usual care in Kenya, following the methodology developed by Verguet et al. (2016). ECEA extends traditional cost-effectiveness analysis by incorporating:
Financial risk protection (catastrophic health expenditures and poverty averted)
Distributional consequences across wealth quintiles
Equity weights to value health gains among the poor
Insurance value (risk premium reduction)
Health insurance coverage and its impact on out-of-pocket costs
1.1 Key ECEA Parameters
Parameter Value Source Discount rate (costs & DALYs) 3% per year WHO guidelines Catastrophic threshold 10% of income WHO Poverty line 785/year(785/year(2.15/day) World Bank Risk aversion coefficient (r) 3 Arrow-Pratt Equity weight elasticity (η) 1.0 Verguet et al. Kenya GDP per capita (WTP) $2,090 World Bank
Clear Workspace
3 Wealth Quintile Income Distribution (Kenya)
# Quintile income data (annual income in USD)
quintile_income <- data.frame(
Wealth_Quintile = c("Q1_Poorest", "Q2", "Q3", "Q4", "Q5_Richest"),
Mean_Income_USD = c(420, 850, 1450, 2650, 5900),
Income_Label = c("Poorest", "Second", "Middle", "Fourth", "Richest")
)
knitr::kable(quintile_income, caption = "Table 1: Mean Annual Income by Wealth Quintile (Kenya)")| Wealth_Quintile | Mean_Income_USD | Income_Label |
|---|---|---|
| Q1_Poorest | 420 | Poorest |
| Q2 | 850 | Second |
| Q3 | 1450 | Middle |
| Q4 | 2650 | Fourth |
| Q5_Richest | 5900 | Richest |
# Define insurance coverage rates by wealth quintile (Kenya data)
# Based on Kenya's National Hospital Insurance Fund (NHIF) coverage
# and private insurance penetration
insurance_params <- data.frame(
Wealth_Quintile = c("Q1_Poorest", "Q2", "Q3", "Q4", "Q5_Richest"),
# Proportion of population with health insurance
coverage_rate = c(0.08, 0.12, 0.20, 0.35, 0.55),
# Proportion of healthcare costs paid by insurance (reimbursement rate)
reimbursement_rate = c(0.30, 0.35, 0.45, 0.55, 0.65),
# Annual insurance premium (USD) - approximate
annual_premium = c(12, 24, 48, 96, 180),
stringsAsFactors = FALSE
)
# Display insurance parameters
knitr::kable(insurance_params, caption = "Table 2: Health Insurance Parameters by Wealth Quintile (Kenya)")| Wealth_Quintile | coverage_rate | reimbursement_rate | annual_premium |
|---|---|---|---|
| Q1_Poorest | 0.08 | 0.30 | 12 |
| Q2 | 0.12 | 0.35 | 24 |
| Q3 | 0.20 | 0.45 | 48 |
| Q4 | 0.35 | 0.55 | 96 |
| Q5_Richest | 0.55 | 0.65 | 180 |
# Calculate effective coverage
insurance_params <- insurance_params %>%
mutate(
effective_coverage = coverage_rate * reimbursement_rate
)
cat("\n=== INSURANCE ASSUMPTIONS ===\n")##
## === INSURANCE ASSUMPTIONS ===
cat(sprintf("Poorest quintile insurance coverage: %.1f%%\n", insurance_params$coverage_rate[1] * 100))## Poorest quintile insurance coverage: 8.0%
cat(sprintf("Richest quintile insurance coverage: %.1f%%\n", insurance_params$coverage_rate[5] * 100))## Richest quintile insurance coverage: 55.0%
##
## Effective financial protection (coverage × reimbursement):
## Poorest: 2.4% of costs covered
## Richest: 35.8% of costs covered
# Path to the saved analysis data
data_path <- "/Users/jamesoguta/Documents/James Oguta/PhD Thesis_James Oguta/James Oguta Model/Kenya CVD Model/KenyaCVDModelFinal/inst/rmarkdown/templates/equity_analysis/skeleton/kenya_equity_analysis_data.rds"
# Load the data
df_compare <- readRDS(data_path)
# Verify the data loaded correctly
cat("\n=== DATA LOADED SUCCESSFULLY ===\n")##
## === DATA LOADED SUCCESSFULLY ===
## Number of individuals: 100000
## Number of columns: 45
# Calculate overall totals (these are already age-adjusted)
total_dalys_averted <- sum(df_compare$dalys_averted, na.rm = TRUE)
total_net_cost <- sum(df_compare$delta_costs, na.rm = TRUE)
# Extract wealth results
wealth_results <- df_compare %>%
group_by(wealth_quintile) %>%
summarise(
n = n(),
dalys_averted = mean(dalys_averted, na.rm = TRUE),
dalys_ci_lower = dalys_averted - 1.96 * sd(dalys_averted, na.rm = TRUE) / sqrt(n()),
dalys_ci_upper = dalys_averted + 1.96 * sd(dalys_averted, na.rm = TRUE) / sqrt(n()),
delta_costs = mean(delta_costs, na.rm = TRUE),
costs_ci_lower = delta_costs - 1.96 * sd(delta_costs, na.rm = TRUE) / sqrt(n()),
costs_ci_upper = delta_costs + 1.96 * sd(delta_costs, na.rm = TRUE) / sqrt(n())
) %>%
mutate(
wealth_quintile = factor(wealth_quintile,
levels = c("Q1_Poorest", "Q2", "Q3", "Q4", "Q5_Richest"))
) %>%
arrange(wealth_quintile)
cat("\n✓ Data loaded successfully\n")##
## ✓ Data loaded successfully
## Total DALYs averted : 11680
## Total incremental cost : $46607641.82
# Merge insurance parameters with main dataset
df_ecea <- df_compare %>%
mutate(wealth_quintile_char = as.character(wealth_quintile)) %>%
left_join(quintile_income, by = c("wealth_quintile_char" = "Wealth_Quintile")) %>%
left_join(insurance_params, by = c("wealth_quintile_char" = "Wealth_Quintile"))
# Calculate out-of-pocket costs with insurance
df_ecea <- df_ecea %>%
mutate(
# Total costs (what the healthcare system charges)
total_cost_UC = total_costs_UC,
total_cost_Emp = total_costs_Emp,
# Insurance payment (proportion of costs covered)
insurance_payment_UC = total_cost_UC * coverage_rate * reimbursement_rate,
insurance_payment_Emp = total_cost_Emp * coverage_rate * reimbursement_rate,
# Out-of-pocket costs (what patient pays)
oop_UC = total_cost_UC - insurance_payment_UC,
oop_Emp = total_cost_Emp - insurance_payment_Emp,
# Insurance premiums paid (cost of insurance)
# Using cycles_survived as proxy for years of follow-up
premium_paid = annual_premium * cycles_survived_UC,
# Net financial burden (OOP + premiums)
net_burden_UC = oop_UC + premium_paid,
net_burden_Emp = oop_Emp + premium_paid,
# Individual annual income
individual_income = Mean_Income_USD
)ECEA Methodology (Verguet et al. 2016)
The ECEA framework examines four domains across wealth quintiles:
Health gains (DALYs averted)
Private expenditures averted (out-of-pocket costs reduced)
Financial risk protection (catastrophic and poverty cases averted)
Policy costs (net cost to government)
Domain 1: Health Gains
# Health gains by wealth quintile (age-adjusted)
health_gains <- wealth_results %>%
select(Wealth_Quintile = wealth_quintile,
DALYs_Averted = dalys_averted,
CI_Lower = dalys_ci_lower,
CI_Upper = dalys_ci_upper)
knitr::kable(health_gains, caption = "Table 3: Health Gains (DALYs Averted) by Wealth Quintile (Age-Adjusted)", digits = 6)| Wealth_Quintile | DALYs_Averted | CI_Lower | CI_Upper |
|---|---|---|---|
| Q1_Poorest | 0.099889 | NA | NA |
| Q2 | 0.111872 | NA | NA |
| Q3 | 0.117798 | NA | NA |
| Q4 | 0.126490 | NA | NA |
| Q5_Richest | 0.131233 | NA | NA |
# Calculate out-of-pocket expenditures
oop_expenditures <- df_ecea %>%
group_by(wealth_quintile_char) %>%
summarise(
Wealth_Quintile = first(wealth_quintile_char),
# Out-of-pocket costs
Mean_OOP_UC = mean(oop_UC, na.rm = TRUE),
Mean_OOP_Emp = mean(oop_Emp, na.rm = TRUE),
OOP_Change = Mean_OOP_Emp - Mean_OOP_UC,
OOP_Percent_Change = (Mean_OOP_Emp - Mean_OOP_UC) / Mean_OOP_UC * 100,
# Insurance payments
Mean_Insurance_UC = mean(insurance_payment_UC, na.rm = TRUE),
Mean_Insurance_Emp = mean(insurance_payment_Emp, na.rm = TRUE),
Insurance_Change = Mean_Insurance_Emp - Mean_Insurance_UC,
# Premiums paid
Mean_Premium_Paid = mean(premium_paid, na.rm = TRUE),
# Totals for population
Total_OOP_Change = sum(oop_Emp - oop_UC, na.rm = TRUE)
) %>%
select(-wealth_quintile_char)
knitr::kable(oop_expenditures,
caption = "Table 4: Out-of-Pocket Expenditures with Insurance by Wealth Quintile",
digits = 2)| Wealth_Quintile | Mean_OOP_UC | Mean_OOP_Emp | OOP_Change | OOP_Percent_Change | Mean_Insurance_UC | Mean_Insurance_Emp | Insurance_Change | Mean_Premium_Paid | Total_OOP_Change |
|---|---|---|---|---|---|---|---|---|---|
| Q1_Poorest | 3999.93 | 4375.23 | 375.30 | 9.38 | 98.36 | 107.59 | 9.23 | 262.50 | 6849592 |
| Q2 | 4269.74 | 4683.80 | 414.06 | 9.70 | 187.19 | 205.34 | 18.15 | 525.23 | 9677848 |
| Q3 | 4373.24 | 4810.85 | 437.62 | 10.01 | 432.52 | 475.80 | 43.28 | 1071.94 | 10182090 |
| Q4 | 4046.04 | 4449.51 | 403.47 | 9.97 | 964.54 | 1060.72 | 96.18 | 2224.26 | 9049829 |
| Q5_Richest | 3410.51 | 3769.85 | 359.34 | 10.54 | 1897.68 | 2097.62 | 199.94 | 4360.76 | 4556064 |
9.1 Catastrophic Health Expenditures Averted
CATASTROPHIC_THRESHOLD <- 0.10
# Calculate catastrophic using out-of-pocket (after insurance)
df_ecea <- df_ecea %>%
mutate(
# OOP as proportion of income
oop_income_ratio_UC = oop_UC / individual_income,
oop_income_ratio_Emp = oop_Emp / individual_income,
# Catastrophic if OOP > 10% of income
catastrophic_UC = oop_income_ratio_UC > CATASTROPHIC_THRESHOLD,
catastrophic_Emp = oop_income_ratio_Emp > CATASTROPHIC_THRESHOLD,
# Net burden (OOP + premiums) as proportion of income
net_burden_ratio_UC = net_burden_UC / individual_income,
net_burden_ratio_Emp = net_burden_Emp / individual_income,
# Catastrophic including premiums
catastrophic_total_UC = net_burden_ratio_UC > CATASTROPHIC_THRESHOLD,
catastrophic_total_Emp = net_burden_ratio_Emp > CATASTROPHIC_THRESHOLD
)
catastrophic_averted <- df_ecea %>%
group_by(wealth_quintile_char) %>%
summarise(
Wealth_Quintile = first(wealth_quintile_char),
# OOP-only catastrophic rates
Catastrophic_Rate_UC = mean(catastrophic_UC, na.rm = TRUE) * 100,
Catastrophic_Rate_Emp = mean(catastrophic_Emp, na.rm = TRUE) * 100,
Catastrophic_Change = Catastrophic_Rate_Emp - Catastrophic_Rate_UC,
Catastrophic_Cases_Averted = sum(catastrophic_UC, na.rm = TRUE) -
sum(catastrophic_Emp, na.rm = TRUE)
) %>%
select(-wealth_quintile_char)
knitr::kable(catastrophic_averted,
caption = "Table 5: Catastrophic Health Expenditure Rates (After Insurance)",
digits = 2)| Wealth_Quintile | Catastrophic_Rate_UC | Catastrophic_Rate_Emp | Catastrophic_Change | Catastrophic_Cases_Averted |
|---|---|---|---|---|
| Q1_Poorest | 76.13 | 76.13 | 0.00 | 0 |
| Q2 | 79.22 | 79.22 | 0.00 | 0 |
| Q3 | 81.51 | 81.51 | 0.00 | 0 |
| Q4 | 81.40 | 81.83 | 0.43 | -96 |
| Q5_Richest | 81.33 | 82.40 | 1.07 | -136 |
9.2 Poverty Cases Averted
POVERTY_LINE <- 785
df_ecea <- df_ecea %>%
mutate(
# Net income after OOP
net_income_UC = individual_income - oop_UC,
net_income_Emp = individual_income - oop_Emp,
# Impoverished by OOP alone
impoverished_UC = (individual_income > POVERTY_LINE) & (net_income_UC < POVERTY_LINE),
impoverished_Emp = (individual_income > POVERTY_LINE) & (net_income_Emp < POVERTY_LINE)
)
poverty_averted <- df_ecea %>%
group_by(wealth_quintile_char) %>%
summarise(
Wealth_Quintile = first(wealth_quintile_char),
# OOP-only poverty rates
Poverty_Rate_UC = mean(impoverished_UC, na.rm = TRUE) * 100,
Poverty_Rate_Emp = mean(impoverished_Emp, na.rm = TRUE) * 100,
Poverty_Change = Poverty_Rate_Emp - Poverty_Rate_UC,
Poverty_Cases_Averted = sum(impoverished_UC, na.rm = TRUE) -
sum(impoverished_Emp, na.rm = TRUE)
) %>%
select(-wealth_quintile_char)
knitr::kable(poverty_averted,
caption = "Table 6: Poverty Rates Due to Healthcare Payments (After Insurance)",
digits = 2)| Wealth_Quintile | Poverty_Rate_UC | Poverty_Rate_Emp | Poverty_Change | Poverty_Cases_Averted |
|---|---|---|---|---|
| Q1_Poorest | 0.00 | 0.00 | 0.00 | 0 |
| Q2 | 79.23 | 79.23 | 0.00 | 0 |
| Q3 | 77.76 | 78.76 | 0.99 | -231 |
| Q4 | 67.66 | 70.59 | 2.92 | -656 |
| Q5_Richest | 22.96 | 30.47 | 7.51 | -952 |
9.3 Insurance Value (Risk Premium)
RISK_AVERSION <- 3
df_ecea <- df_ecea %>%
mutate(
risk_premium_UC = 0.5 * RISK_AVERSION * (oop_UC^2) / individual_income,
risk_premium_Emp = 0.5 * RISK_AVERSION * (oop_Emp^2) / individual_income,
insurance_value = pmax(0, risk_premium_UC - risk_premium_Emp)
)
insurance_summary <- df_ecea %>%
group_by(wealth_quintile_char) %>%
summarise(
Wealth_Quintile = first(wealth_quintile_char),
Mean_Insurance_Value = mean(insurance_value, na.rm = TRUE),
Total_Insurance_Value = sum(insurance_value, na.rm = TRUE)
) %>%
select(-wealth_quintile_char)
knitr::kable(insurance_summary,
caption = "Table 7: Insurance Value (Risk Premium Reduction) by Wealth Quintile",
digits = 2)| Wealth_Quintile | Mean_Insurance_Value | Total_Insurance_Value |
|---|---|---|
| Q1_Poorest | 13289.77 | 242551651 |
| Q2 | 7381.74 | 172533428 |
| Q3 | 4365.24 | 101566133 |
| Q4 | 2197.71 | 49294630 |
| Q5_Richest | 642.17 | 8142030 |
policy_costs <- df_compare %>%
group_by(wealth_quintile) %>%
summarise(
Wealth_Quintile = as.character(first(wealth_quintile)),
Total_Net_Cost = sum(delta_costs, na.rm = TRUE),
Mean_Net_Cost = mean(delta_costs, na.rm = TRUE),
Population = n()
)
knitr::kable(policy_costs, caption = "Table 8: Policy Costs by Wealth Quintile", digits = 2)| wealth_quintile | Wealth_Quintile | Total_Net_Cost | Mean_Net_Cost | Population |
|---|---|---|---|---|
| Q1_Poorest | Q1_Poorest | 7018025 | 384.53 | 18251 |
| Q2 | Q2 | 10102138 | 432.21 | 23373 |
| Q3 | Q3 | 11189110 | 480.90 | 23267 |
| Q4 | Q4 | 11207219 | 499.65 | 22430 |
| Q5_Richest | Q5_Richest | 7091150 | 559.28 | 12679 |
EQUITY_ELASTICITY <- 1.0
df_ecea <- df_ecea %>%
mutate(
equity_weight = (POVERTY_LINE / individual_income)^EQUITY_ELASTICITY,
equity_weight = pmin(equity_weight, 5),
equity_weight = pmax(equity_weight, 0.2),
weighted_dalys = dalys_averted * equity_weight
)
weighted_summary <- df_ecea %>%
group_by(wealth_quintile_char) %>%
summarise(
Wealth_Quintile = first(wealth_quintile_char),
Equity_Weight = mean(equity_weight, na.rm = TRUE),
Unweighted_DALYs = mean(dalys_averted, na.rm = TRUE),
Weighted_DALYs = mean(weighted_dalys, na.rm = TRUE),
Equity_Ratio = Weighted_DALYs / Unweighted_DALYs
) %>%
select(-wealth_quintile_char)
knitr::kable(weighted_summary, caption = "Table 9: Distributional Equity Weights by Wealth Quintile", digits = 3)| Wealth_Quintile | Equity_Weight | Unweighted_DALYs | Weighted_DALYs | Equity_Ratio |
|---|---|---|---|---|
| Q1_Poorest | 1.869 | 0.100 | 0.187 | 1.869 |
| Q2 | 0.924 | 0.112 | 0.103 | 0.924 |
| Q3 | 0.541 | 0.118 | 0.064 | 0.541 |
| Q4 | 0.296 | 0.126 | 0.037 | 0.296 |
| Q5_Richest | 0.200 | 0.131 | 0.026 | 0.200 |
total_catastrophic <- sum(catastrophic_averted$Catastrophic_Cases_Averted, na.rm = TRUE)
total_poverty <- sum(poverty_averted$Poverty_Cases_Averted, na.rm = TRUE)
efficiency_metrics <- data.frame(
Metric = c(
"Cost per DALY averted",
"Cost per catastrophic case averted",
"Cost per poverty case averted",
"DALYs averted per $1,000"
),
Value = c(
sprintf("$%.0f", total_net_cost / total_dalys_averted),
sprintf("$%.0f", total_net_cost / abs(total_catastrophic)),
sprintf("$%.0f", total_net_cost / abs(total_poverty)),
sprintf("%.2f", total_dalys_averted / total_net_cost * 1000)
)
)
knitr::kable(efficiency_metrics, caption = "Table 10: ECEA Efficiency Metrics")| Metric | Value |
|---|---|
| Cost per DALY averted | $3990 |
| Cost per catastrophic case averted | $200895 |
| Cost per poverty case averted | $25344 |
| DALYs averted per $1,000 | 0.25 |
fig1 <- ggplot(health_gains, aes(x = Wealth_Quintile, y = DALYs_Averted, fill = Wealth_Quintile)) +
geom_bar(stat = "identity", alpha = 0.7) +
geom_errorbar(aes(ymin = CI_Lower, ymax = CI_Upper), width = 0.2) +
labs(x = "\nWealth Quintile", y = "DALYs Averted\n",
title = "A) Health Gains by Wealth Quintile",
subtitle = "Positive values indicate health benefit from Empower Health | Error bars = 95% CI") +
scale_fill_brewer(palette = "RdYlGn", direction = -1) +
theme_minimal(base_size = 12) +
theme(legend.position = "none", plot.title = element_text(face = "bold"))
print(fig1)
Figure 2: Out-of-Pocket Spending Changes
fig2 <- ggplot(oop_expenditures, aes(x = Wealth_Quintile, y = OOP_Change, fill = Wealth_Quintile)) +
geom_bar(stat = "identity", alpha = 0.7) +
geom_hline(yintercept = 0, linetype = "dashed", color = "red", size = 0.8) +
labs(x = "\nWealth Quintile", y = "Change in Out-of-Pocket Spending ($)\n",
title = "B) Out-of-Pocket Spending Changes by Wealth Quintile",
subtitle = "Positive values = increased financial burden from Empower Health") +
scale_fill_brewer(palette = "RdYlGn", direction = -1) +
theme_minimal(base_size = 12) +
theme(legend.position = "none", plot.title = element_text(face = "bold"))
print(fig2)Figure 3: Financial Risk Protection Benefits
# Prepare FRP data
frp_data <- catastrophic_averted %>%
select(Wealth_Quintile, Catastrophic_Cases_Averted) %>%
mutate(Type = "Catastrophic Cases") %>%
bind_rows(
poverty_averted %>%
select(Wealth_Quintile, Poverty_Cases_Averted) %>%
mutate(Type = "Poverty Cases",
Catastrophic_Cases_Averted = Poverty_Cases_Averted)
) %>%
rename(Cases_Averted = Catastrophic_Cases_Averted)
fig3 <- ggplot(frp_data, aes(x = Wealth_Quintile, y = Cases_Averted, fill = Type)) +
geom_bar(stat = "identity", alpha = 0.7, position = position_dodge(0.8)) +
geom_hline(yintercept = 0, linetype = "dashed", color = "red", size = 0.8) +
scale_fill_manual(values = c("Catastrophic Cases" = "darkred", "Poverty Cases" = "darkgreen"),
name = "FRP Metric") +
labs(x = "\nWealth Quintile", y = "Cases Averted\n",
title = "C) Financial Risk Protection (FRP) Benefits",
subtitle = "Negative values = more cases with Empower Health") +
theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = "bold"), legend.position = "bottom")
print(fig3)Figure 4: Distributional Equity Weights
fig4 <- weighted_summary %>%
ggplot(aes(x = Wealth_Quintile, y = Equity_Weight, fill = Wealth_Quintile)) +
geom_bar(stat = "identity", alpha = 0.7) +
geom_text(aes(label = sprintf("%.2f", Equity_Weight)), vjust = -0.5, size = 4) +
labs(x = "\nWealth Quintile", y = "Mean Equity Weight\n",
title = "D) Distributional Equity Weights",
subtitle = "Higher weight = more priority given to health gains of that group") +
scale_fill_brewer(palette = "RdYlGn", direction = -1) +
theme_minimal(base_size = 12) +
theme(legend.position = "none", plot.title = element_text(face = "bold"))
print(fig4)
Figure 5: Unweighted vs Equity-Weighted Health Benefits
weighted_plot <- weighted_summary %>%
select(Wealth_Quintile, Unweighted_DALYs, Weighted_DALYs) %>%
pivot_longer(cols = c(Unweighted_DALYs, Weighted_DALYs),
names_to = "Type", values_to = "DALYs") %>%
mutate(Type = ifelse(Type == "Unweighted_DALYs", "Unweighted", "Equity-Weighted"))
fig5 <- ggplot(weighted_plot, aes(x = Wealth_Quintile, y = DALYs, fill = Type)) +
geom_bar(stat = "identity", alpha = 0.7, position = position_dodge(0.8)) +
labs(x = "\nWealth Quintile", y = "DALYs Averted\n",
title = "E) Unweighted vs Equity-Weighted Health Benefits",
subtitle = "Equity-weighting gives more value to health gains among the poor") +
scale_fill_manual(values = c("Unweighted" = "steelblue", "Equity-Weighted" = "darkgreen")) +
theme_minimal(base_size = 12) +
theme(legend.position = "bottom", plot.title = element_text(face = "bold"))
print(fig5)
14. Interpretation of Results
## ================================================================================
## INTERPRETATION OF ECEA RESULTS
## ================================================================================
## ### 14.1 Health Gains Interpretation
cat(sprintf("**Total DALYs averted:** %.0f years of healthy life across the population\n", total_dalys_averted))## **Total DALYs averted:** 11680 years of healthy life across the population
cat(sprintf("**Mean DALYs averted per person:** %.4f (approximately %.0f days)\n",
total_dalys_averted / nrow(df_compare),
total_dalys_averted / nrow(df_compare) * 365))## **Mean DALYs averted per person:** 0.1168 (approximately 43 days)
cat("\n**Distribution:** The health benefits are PRO-RICH - richer quintiles gain more DALYs averted than poorer quintiles.\n")##
## **Distribution:** The health benefits are PRO-RICH - richer quintiles gain more DALYs averted than poorer quintiles.
## - Poorest quintile gains: %.6f DALYs
## 0.09988889
## - Richest quintile gains: %.6f DALYs
## 0.1312333
cat("- Ratio (Richest/Poorest): %.2f\n\n", health_gains$DALYs_Averted[5] / health_gains$DALYs_Averted[1])## - Ratio (Richest/Poorest): %.2f
##
## 1.313793
## ### 14.2 Out-of-Pocket Spending Interpretation
cat("**Financial burden change:** Empower Health INCREASES out-of-pocket spending across ALL wealth quintiles\n")## **Financial burden change:** Empower Health INCREASES out-of-pocket spending across ALL wealth quintiles
for(i in 1:5) {
cat(sprintf("- %s: +$%.2f (%.1f%% increase)\n",
oop_expenditures$Wealth_Quintile[i],
oop_expenditures$OOP_Change[i],
oop_expenditures$OOP_Percent_Change[i]))
}## - Q1_Poorest: +$375.30 (9.4% increase)
## - Q2: +$414.06 (9.7% increase)
## - Q3: +$437.62 (10.0% increase)
## - Q4: +$403.47 (10.0% increase)
## - Q5_Richest: +$359.34 (10.5% increase)
cat("\n**Interpretation:** The intervention adds financial burden, not reduces it. This is a NEGATIVE financial protection outcome.\n")##
## **Interpretation:** The intervention adds financial burden, not reduces it. This is a NEGATIVE financial protection outcome.
## ### 14.3 Financial Risk Protection Interpretation
## **Catastrophic cases averted:** -232 (negative = more cases)
## **Poverty cases averted:** -1839 (negative = more poverty)
##
## **Interpretation:** Empower Health does NOT provide financial risk protection.
## It leads to more catastrophic health expenditures and more households pushed into poverty.
## ### 14.4 Equity Weight Interpretation
cat(sprintf("**Equity weight ratio (poorest:richest):** %.1f:1\n",
weighted_summary$Equity_Weight[1] / weighted_summary$Equity_Weight[5]))## **Equity weight ratio (poorest:richest):** 9.3:1
cat("\n**Interpretation:** When equity weights are applied (valuing health gains among the poor more highly),\n")##
## **Interpretation:** When equity weights are applied (valuing health gains among the poor more highly),
cat("the health benefits of the poorest quintile are valued %.1f times more than those of the richest.\n",
weighted_summary$Equity_Weight[1] / weighted_summary$Equity_Weight[5])## the health benefits of the poorest quintile are valued %.1f times more than those of the richest.
## 9.345238
cat("However, the unweighted benefits are already pro-rich, so equity weighting only partially offsets this.\n")## However, the unweighted benefits are already pro-rich, so equity weighting only partially offsets this.
## ### 14.5 Cost-Effectiveness Interpretation
## **ICER:** $3990 per DALY averted
## **Kenya GDP per capita:** $2200
## **ICER/GDP ratio:** 1.81
##
## **Interpretation:** The ICER exceeds Kenya's GDP per capita (ratio > 1).
##
## ================================================================================
## ================================================================================
## POLICY IMPLICATIONS AND RECOMMENDATIONS
## ================================================================================
## ### 15.1 Summary of Findings
## | Domain | Finding | Verdict |
## |--------|---------|--------|
## | Health Gains | 11,680 DALYs averted (pro-rich) | ✓ Positive but inequitable |
## | Out-of-Pocket Costs | INCREASED by 9-11% | ✗ Negative |
## | Catastrophic Expenditure | No reduction (0 to +0.4%) | ✗ No benefit |
## | Poverty | 1,557 additional people impoverished | ✗ Harmful |
## | Cost-Effectiveness | ICER = $3,990 > GDP | ✗ Not very cost-effective |
## | Equity | Pro-rich distribution | ✗ Inequitable |
## ### 15.2 Final Recommendation
## Based on the Extended Cost-Effectiveness Analysis, the Empower Health intervention
## **cannot be recommended for public financing in Kenya at current pricing**.
## While the intervention provides modest health benefits (11,680 DALYs averted),
## these are outweighed by:
## 1. **Increased financial burden** on households (9-11% higher OOP costs)
## 2. **No financial risk protection** (catastrophic and poverty outcomes worsen)
## 3. **Pro-rich distribution** of benefits (richer gain 31% more)
## 4. **Cost-effectiveness concerns** (ICER exceeds GDP threshold)
cat("If the intervention is considered for implementation, the following conditions MUST be met:\n")## If the intervention is considered for implementation, the following conditions MUST be met:
## - **Price reduction** of at least 30-40%
## - **Full subsidies** for poorest 40% of the population
## - **Targeted implementation** to high-risk subgroups only
## - **Regular monitoring** of financial protection outcomes
## ================================================================================
ecea_complete <- health_gains %>%
left_join(oop_expenditures, by = "Wealth_Quintile") %>%
left_join(catastrophic_averted, by = "Wealth_Quintile") %>%
left_join(poverty_averted, by = "Wealth_Quintile") %>%
left_join(insurance_summary, by = "Wealth_Quintile") %>%
left_join(weighted_summary, by = "Wealth_Quintile") %>%
select(
Wealth_Quintile,
DALYs_Averted,
OOP_Change,
OOP_Percent_Change,
Catastrophic_Rate_UC,
Catastrophic_Rate_Emp,
Poverty_Rate_UC,
Poverty_Rate_Emp,
Mean_Insurance_Value,
Equity_Weight,
Equity_Ratio
)
knitr::kable(ecea_complete,
caption = "Table 11: Complete ECEA Results by Wealth Quintile",
digits = c(0, 6, 2, 1, 2, 2, 2, 2, 2, 3, 3))| Wealth_Quintile | DALYs_Averted | OOP_Change | OOP_Percent_Change | Catastrophic_Rate_UC | Catastrophic_Rate_Emp | Poverty_Rate_UC | Poverty_Rate_Emp | Mean_Insurance_Value | Equity_Weight | Equity_Ratio |
|---|---|---|---|---|---|---|---|---|---|---|
| Q1_Poorest | 0.099889 | 375.30 | 9.4 | 76.13 | 76.13 | 0.00 | 0.00 | 13289.77 | 1.869 | 1.869 |
| Q2 | 0.111872 | 414.06 | 9.7 | 79.22 | 79.22 | 79.23 | 79.23 | 7381.74 | 0.924 | 0.924 |
| Q3 | 0.117798 | 437.62 | 10.0 | 81.51 | 81.51 | 77.76 | 78.76 | 4365.24 | 0.541 | 0.541 |
| Q4 | 0.126490 | 403.47 | 10.0 | 81.40 | 81.83 | 67.66 | 70.59 | 2197.71 | 0.296 | 0.296 |
| Q5_Richest | 0.131233 | 359.34 | 10.5 | 81.33 | 82.40 | 22.96 | 30.47 | 642.17 | 0.200 | 0.200 |
policy_summary <- data.frame(
Domain = c(
"Health Gains",
"Health Gains",
"Financial Burden",
"Financial Protection",
"Financial Protection",
"Equity",
"Cost-Effectiveness",
"Cost-Effectiveness"
),
Metric = c(
"Total DALYs averted",
"Distribution (pro-rich)",
"OOP cost increase",
"Catastrophic cases averted",
"Poverty cases averted",
"Equity weight ratio",
"ICER",
"ICER vs Kenya GDP"
),
Value = c(
sprintf("%.0f", total_dalys_averted),
sprintf("%.1f:1 (richer:poorer)", health_gains$DALYs_Averted[5] / health_gains$DALYs_Averted[1]),
sprintf("+$%.0f total", sum(oop_expenditures$Total_OOP_Change)),
sprintf("%.0f (negative = more cases)", total_catastrophic),
sprintf("%.0f (negative = more poverty)", total_poverty),
sprintf("%.1f:1", weighted_summary$Equity_Weight[1] / weighted_summary$Equity_Weight[5]),
sprintf("$%.0f per DALY", total_net_cost / total_dalys_averted),
sprintf("%.2f x GDP", (total_net_cost / total_dalys_averted) / 2200)
),
Interpretation = c(
"11,680 years of healthy life",
"Richest gain 31% more benefit",
"Financial burden increases",
"No protection provided",
"Causes additional poverty",
"Poor valued 9.3x more",
"Exceeds GDP threshold",
"Not very cost-effective"
)
)
knitr::kable(policy_summary, caption = "Table 12: Policy Summary Table")| Domain | Metric | Value | Interpretation |
|---|---|---|---|
| Health Gains | Total DALYs averted | 11680 | 11,680 years of healthy life |
| Health Gains | Distribution (pro-rich) | 1.3:1 (richer:poorer) | Richest gain 31% more benefit |
| Financial Burden | OOP cost increase | +$40315424 total | Financial burden increases |
| Financial Protection | Catastrophic cases averted | -232 (negative = more cases) | No protection provided |
| Financial Protection | Poverty cases averted | -1839 (negative = more poverty) | Causes additional poverty |
| Equity | Equity weight ratio | 9.3:1 | Poor valued 9.3x more |
| Cost-Effectiveness | ICER | $3990 per DALY | Exceeds GDP threshold |
| Cost-Effectiveness | ICER vs Kenya GDP | 1.81 x GDP | Not very cost-effective |
## ================================================================================
## CONCLUSION
## ================================================================================
## This Extended Cost-Effectiveness Analysis evaluated Empower Health against usual care
cat("in Kenya across four domains: health gains, financial risk protection, distributional equity, ")## in Kenya across four domains: health gains, financial risk protection, distributional equity,
## and policy costs, with integration of health insurance parameters.
## **Key Conclusion:** Empower Health provides modest health benefits but at the cost of
## increased financial burden on households, no financial risk protection, and a pro-rich
## distribution of benefits. The intervention is not very cost-effective by WHO standards
## (ICER > GDP) and would likely increase health inequalities in Kenya.
## **Final Recommendation:** Do NOT implement Empower Health under current pricing.
## If implemented, require price reduction, subsidies for the poor, and targeted delivery.
## ================================================================================