1. Introduction

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:

  1. Financial risk protection (catastrophic health expenditures and poverty averted)

  2. Distributional consequences across wealth quintiles

  3. Equity weights to value health gains among the poor

  4. Insurance value (risk premium reduction)

  5. 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

rm(list=ls())
  1. Load Required Libraries
library(tidyverse)
library(ggplot2)
library(gridExtra)
library(knitr)

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)")
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
  1. Health Insurance Parameters
# 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)")
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%
cat(sprintf("\nEffective financial protection (coverage × reimbursement):\n"))
## 
## Effective financial protection (coverage × reimbursement):
cat(sprintf("Poorest: %.1f%% of costs covered\n", insurance_params$effective_coverage[1] * 100))
## Poorest: 2.4% of costs covered
cat(sprintf("Richest: %.1f%% of costs covered\n", insurance_params$effective_coverage[5] * 100))
## Richest: 35.8% of costs covered
  1. Load the data
# 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 ===
cat(sprintf("Number of individuals: %d\n", nrow(df_compare)))
## Number of individuals: 100000
cat(sprintf("Number of columns: %d\n", ncol(df_compare)))
## 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
cat(sprintf("Total DALYs averted : %.0f\n", total_dalys_averted))
## Total DALYs averted : 11680
cat(sprintf("Total incremental cost : $%.2f\n", total_net_cost))
## Total incremental cost : $46607641.82
  1. Prepare ECEA Dataset with Insurance
# 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:

  1. Health gains (DALYs averted)

  2. Private expenditures averted (out-of-pocket costs reduced)

  3. Financial risk protection (catastrophic and poverty cases averted)

  4. Policy costs (net cost to government)

  5. 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)
Table 3: Health Gains (DALYs Averted) by Wealth Quintile (Age-Adjusted)
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
  1. Domain 2: Out-of-Pocket Expenditures (After Insurance)
# 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)
Table 4: Out-of-Pocket Expenditures with Insurance by Wealth Quintile
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
  1. Domain 3: Financial Risk Protection (FRP)

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)
Table 5: Catastrophic Health Expenditure Rates (After Insurance)
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)
Table 6: Poverty Rates Due to Healthcare Payments (After Insurance)
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)
Table 7: Insurance Value (Risk Premium Reduction) by Wealth Quintile
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
  1. Domain 4: Policy Costs
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)
Table 8: Policy Costs by Wealth Quintile
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
  1. Distributional Equity Weights
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)
Table 9: Distributional Equity Weights by Wealth Quintile
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
  1. ECEA Efficiency Metrics
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")
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
  1. Visualizations Figure 1: Health Gains by Wealth Quintile
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

cat("\n")
cat("================================================================================\n")
## ================================================================================
cat("INTERPRETATION OF ECEA RESULTS\n")
## INTERPRETATION OF ECEA RESULTS
cat("================================================================================\n\n")
## ================================================================================
cat("### 14.1 Health Gains Interpretation\n\n")
## ### 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.
cat("- Poorest quintile gains: %.6f DALYs\n", health_gains$DALYs_Averted[1])
## - Poorest quintile gains: %.6f DALYs
##  0.09988889
cat("- Richest quintile gains: %.6f DALYs\n", health_gains$DALYs_Averted[5])
## - 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
cat("### 14.2 Out-of-Pocket Spending Interpretation\n\n")
## ### 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.
cat("### 14.3 Financial Risk Protection Interpretation\n\n")
## ### 14.3 Financial Risk Protection Interpretation
cat(sprintf("**Catastrophic cases averted:** %.0f (negative = more cases)\n", total_catastrophic))
## **Catastrophic cases averted:** -232 (negative = more cases)
cat(sprintf("**Poverty cases averted:** %.0f (negative = more poverty)\n", total_poverty))
## **Poverty cases averted:** -1839 (negative = more poverty)
cat("\n**Interpretation:** Empower Health does NOT provide financial risk protection.")
## 
## **Interpretation:** Empower Health does NOT provide financial risk protection.
cat("It leads to more catastrophic health expenditures and more households pushed into poverty.\n")
## It leads to more catastrophic health expenditures and more households pushed into poverty.
cat("### 14.4 Equity Weight Interpretation\n\n")
## ### 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.
cat("### 14.5 Cost-Effectiveness Interpretation\n\n")
## ### 14.5 Cost-Effectiveness Interpretation
cat(sprintf("**ICER:** $%.0f per DALY averted\n", total_net_cost / total_dalys_averted))
## **ICER:** $3990 per DALY averted
cat(sprintf("**Kenya GDP per capita:** $%.0f\n", 2200))
## **Kenya GDP per capita:** $2200
cat(sprintf("**ICER/GDP ratio:** %.2f\n", (total_net_cost / total_dalys_averted) / 2200))
## **ICER/GDP ratio:** 1.81
cat("\n**Interpretation:** The ICER exceeds Kenya's GDP per capita (ratio > 1). ")
## 
## **Interpretation:** The ICER exceeds Kenya's GDP per capita (ratio > 1).
cat("\n================================================================================\n")
## 
## ================================================================================
  1. Policy Implications
cat("\n")
cat("================================================================================\n")
## ================================================================================
cat("POLICY IMPLICATIONS AND RECOMMENDATIONS\n")
## POLICY IMPLICATIONS AND RECOMMENDATIONS
cat("================================================================================\n\n")
## ================================================================================
cat("### 15.1 Summary of Findings\n\n")
## ### 15.1 Summary of Findings
cat("| Domain | Finding | Verdict |\n")
## | Domain | Finding | Verdict |
cat("|--------|---------|--------|\n")
## |--------|---------|--------|
cat("| Health Gains | 11,680 DALYs averted (pro-rich) | ✓ Positive but inequitable |\n")
## | Health Gains | 11,680 DALYs averted (pro-rich) | ✓ Positive but inequitable |
cat("| Out-of-Pocket Costs | INCREASED by 9-11% | ✗ Negative |\n")
## | Out-of-Pocket Costs | INCREASED by 9-11% | ✗ Negative |
cat("| Catastrophic Expenditure | No reduction (0 to +0.4%) | ✗ No benefit |\n")
## | Catastrophic Expenditure | No reduction (0 to +0.4%) | ✗ No benefit |
cat("| Poverty | 1,557 additional people impoverished | ✗ Harmful |\n")
## | Poverty | 1,557 additional people impoverished | ✗ Harmful |
cat("| Cost-Effectiveness | ICER = $3,990 > GDP | ✗ Not very cost-effective |\n")
## | Cost-Effectiveness | ICER = $3,990 > GDP | ✗ Not very cost-effective |
cat("| Equity | Pro-rich distribution | ✗ Inequitable |\n\n")
## | Equity | Pro-rich distribution | ✗ Inequitable |
cat("### 15.2 Final Recommendation\n\n")
## ### 15.2 Final Recommendation
cat("Based on the Extended Cost-Effectiveness Analysis, the Empower Health intervention ")
## Based on the Extended Cost-Effectiveness Analysis, the Empower Health intervention
cat("**cannot be recommended for public financing in Kenya at current pricing**.\n\n")
## **cannot be recommended for public financing in Kenya at current pricing**.
cat("While the intervention provides modest health benefits (11,680 DALYs averted), ")
## While the intervention provides modest health benefits (11,680 DALYs averted),
cat("these are outweighed by:\n")
## these are outweighed by:
cat("1. **Increased financial burden** on households (9-11% higher OOP costs)\n")
## 1. **Increased financial burden** on households (9-11% higher OOP costs)
cat("2. **No financial risk protection** (catastrophic and poverty outcomes worsen)\n")
## 2. **No financial risk protection** (catastrophic and poverty outcomes worsen)
cat("3. **Pro-rich distribution** of benefits (richer gain 31% more)\n")
## 3. **Pro-rich distribution** of benefits (richer gain 31% more)
cat("4. **Cost-effectiveness concerns** (ICER exceeds GDP threshold)\n\n")
## 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:
cat("- **Price reduction** of at least 30-40%\n")
## - **Price reduction** of at least 30-40%
cat("- **Full subsidies** for poorest 40% of the population\n")
## - **Full subsidies** for poorest 40% of the population
cat("- **Targeted implementation** to high-risk subgroups only\n")
## - **Targeted implementation** to high-risk subgroups only
cat("- **Regular monitoring** of financial protection outcomes\n\n")
## - **Regular monitoring** of financial protection outcomes
cat("================================================================================\n")
## ================================================================================
  1. Complete ECEA Results Summary
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))
Table 11: Complete ECEA Results by Wealth Quintile
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
  1. Policy Summary Table
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")
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
  1. Conclusion
cat("\n")
cat("================================================================================\n")
## ================================================================================
cat("CONCLUSION\n")
## CONCLUSION
cat("================================================================================\n\n")
## ================================================================================
cat("This Extended Cost-Effectiveness Analysis evaluated Empower Health against usual care ")
## 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,
cat("and policy costs, with integration of health insurance parameters.\n\n")
## and policy costs, with integration of health insurance parameters.
cat("**Key Conclusion:** Empower Health provides modest health benefits but at the cost of ")
## **Key Conclusion:** Empower Health provides modest health benefits but at the cost of
cat("increased financial burden on households, no financial risk protection, and a pro-rich ")
## increased financial burden on households, no financial risk protection, and a pro-rich
cat("distribution of benefits. The intervention is not very cost-effective by WHO standards ")
## distribution of benefits. The intervention is not very cost-effective by WHO standards
cat("(ICER > GDP) and would likely increase health inequalities in Kenya.\n\n")
## (ICER > GDP) and would likely increase health inequalities in Kenya.
cat("**Final Recommendation:** Do NOT implement Empower Health under current pricing. ")
## **Final Recommendation:** Do NOT implement Empower Health under current pricing.
cat("If implemented, require price reduction, subsidies for the poor, and targeted delivery.\n\n")
## If implemented, require price reduction, subsidies for the poor, and targeted delivery.
cat("================================================================================\n")
## ================================================================================