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:

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)

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.2. Load Required Libraries

library(tidyverse)
library(ggplot2)
library(gridExtra)
library(knitr)

1.3 Wealth Quintile Income Distribution (Kenya)

# Quintile income data
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 = "Mean Annual Income by Wealth Quintile (Kenya)")
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

2 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 rows: %d\n", nrow(df_compare)))
## Number of rows: 100000
cat(sprintf("Number of columns: %d\n", ncol(df_compare)))
## Number of columns: 45
cat("\nColumn names:\n")
## 
## Column names:
print(names(df_compare))
##  [1] "individual_id"        "total_costs_Emp"      "total_dalys_Emp"     
##  [4] "life_years_Emp"       "cycles_survived_Emp"  "alive_at_end_Emp"    
##  [7] "had_morbidity_Emp"    "total_costs_UC"       "total_dalys_UC"      
## [10] "life_years_UC"        "cycles_survived_UC"   "alive_at_end_UC"     
## [13] "had_morbidity_UC"     "age"                  "wealth"              
## [16] "region"               "bmi"                  "sbp"                 
## [19] "tc"                   "htn"                  "htn_grade"           
## [22] "htn_treatment"        "dm"                   "dm_treatment"        
## [25] "smk"                  "female"               "male"                
## [28] "subgroup"             "mi_risk_annual"       "stroke_risk_annual"  
## [31] "total_cvd_annual"     "cvd_risk_10yr_lab"    "cvd_risk_10yr_no_lab"
## [34] "wealth_quintile_num"  "wealth_quintile"      "sex"                 
## [37] "delta_costs"          "delta_dalys"          "dalys_averted"       
## [40] "delta_life_years"     "life_years_gained"    "delta_survival"      
## [43] "delta_mortality"      "delta_morbidity"      "wealth_quintile_char"
# Calculate overall totals if not already present
if (!exists("total_dalys_averted")) {
  total_dalys_averted <- sum(df_compare$dalys_averted, na.rm = TRUE)
}
if (!exists("total_net_cost")) {
  total_net_cost <- sum(df_compare$delta_costs, na.rm = TRUE)
}

# Extract wealth results if needed
if (!exists("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
  1. ECEA Methodology (Verguet et al. 2016) The ECEA framework examines four domains across wealth quintiles:

  2. Health gains (DALYs averted)

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

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

  5. Policy costs (net cost to government)

3.1 Domain 1: Health Gains

# Health gains by wealth quintile
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 = "Health Gains (DALYs Averted) by Wealth Quintile", digits = 6)
Health Gains (DALYs Averted) by Wealth Quintile
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

3.2 Domain 2: Private Expenditures Averted Private expenditures averted represent the reduction in out-of-pocket payments for healthcare as a result of the intervention.

# Calculate private expenditures averted
df_ecea <- df_compare %>%
  mutate(wealth_quintile_char = as.character(wealth_quintile)) %>%
  left_join(quintile_income, by = c("wealth_quintile_char" = "Wealth_Quintile"))

private_expenditures <- df_ecea %>%
  group_by(wealth_quintile_char) %>%
  summarise(
    Wealth_Quintile = first(wealth_quintile_char),
    Mean_OOP_UC = mean(total_costs_UC, na.rm = TRUE),
    Mean_OOP_Emp = mean(total_costs_Emp, na.rm = TRUE),
    PE_Averted = Mean_OOP_UC - Mean_OOP_Emp,
    Percent_Reduction = (Mean_OOP_UC - Mean_OOP_Emp) / Mean_OOP_UC * 100,
    Total_PE_Averted = sum(total_costs_UC - total_costs_Emp, na.rm = TRUE)
  ) %>%
  select(-wealth_quintile_char)

knitr::kable(private_expenditures, caption = "Private Expenditures Averted by Wealth Quintile", digits = 2)
Private Expenditures Averted by Wealth Quintile
Wealth_Quintile Mean_OOP_UC Mean_OOP_Emp PE_Averted Percent_Reduction Total_PE_Averted
Q1_Poorest 4098.29 4482.81 -384.53 -9.38 -7018025
Q2 4456.93 4889.15 -432.21 -9.70 -10102138
Q3 4805.75 5286.65 -480.90 -10.01 -11189110
Q4 5010.57 5510.23 -499.65 -9.97 -11207219
Q5_Richest 5308.19 5867.48 -559.28 -10.54 -7091150

3.3 Domain 3: Financial Risk Protection (FRP)

3.3.1 Catastrophic Health Expenditures Averted

A catastrophic health expenditure occurs when out-of-pocket payments exceed 10% of household income.

# Calculate catastrophic expenditures
CATASTROPHIC_THRESHOLD <- 0.10

df_ecea <- df_ecea %>%
  mutate(
    individual_income = Mean_Income_USD,
    oop_Emp = total_costs_Emp,
    oop_UC = total_costs_UC,
    catastrophic_Emp = (oop_Emp / individual_income) > CATASTROPHIC_THRESHOLD,
    catastrophic_UC = (oop_UC / individual_income) > CATASTROPHIC_THRESHOLD
  )

catastrophic_averted <- df_ecea %>%
  group_by(wealth_quintile_char) %>%
  summarise(
    Wealth_Quintile = first(wealth_quintile_char),
    Catastrophic_Rate_UC = mean(catastrophic_UC, na.rm = TRUE) * 100,
    Catastrophic_Rate_Emp = mean(catastrophic_Emp, na.rm = TRUE) * 100,
    Catastrophic_Cases_Averted = sum(catastrophic_UC, na.rm = TRUE) - 
                                 sum(catastrophic_Emp, na.rm = TRUE),
    Rate_Reduction = Catastrophic_Rate_UC - Catastrophic_Rate_Emp
  ) %>%
  select(-wealth_quintile_char)

knitr::kable(catastrophic_averted, caption = "Catastrophic Health Expenditure Cases Averted", digits = 2)
Catastrophic Health Expenditure Cases Averted
Wealth_Quintile Catastrophic_Rate_UC Catastrophic_Rate_Emp Catastrophic_Cases_Averted Rate_Reduction
Q1_Poorest 76.20 76.20 0 0.00
Q2 79.22 79.22 0 0.00
Q3 81.51 81.51 0 0.00
Q4 81.85 82.00 -34 -0.15
Q5_Richest 83.15 83.56 -51 -0.40

3.3.2 Poverty Cases Averted

A poverty case occurs when out-of-pocket payments push a household below the poverty line.

# Poverty line ($2.15/day = $785/year)
POVERTY_LINE <- 785

df_ecea <- df_ecea %>%
  mutate(
    net_income_Emp = individual_income - oop_Emp,
    net_income_UC = individual_income - oop_UC,
    impoverished_Emp = (individual_income > POVERTY_LINE) & (net_income_Emp < POVERTY_LINE),
    impoverished_UC = (individual_income > POVERTY_LINE) & (net_income_UC < POVERTY_LINE)
  )

poverty_averted <- df_ecea %>%
  group_by(wealth_quintile_char) %>%
  summarise(
    Wealth_Quintile = first(wealth_quintile_char),
    Poverty_Rate_UC = mean(impoverished_UC, na.rm = TRUE) * 100,
    Poverty_Rate_Emp = mean(impoverished_Emp, na.rm = TRUE) * 100,
    Poverty_Cases_Averted = sum(impoverished_UC, na.rm = TRUE) - 
                           sum(impoverished_Emp, na.rm = TRUE),
    Rate_Reduction = Poverty_Rate_UC - Poverty_Rate_Emp
  ) %>%
  select(-wealth_quintile_char)

knitr::kable(poverty_averted, caption = "Poverty Cases Averted by Wealth Quintile", digits = 2)
Poverty Cases Averted by Wealth Quintile
Wealth_Quintile Poverty_Rate_UC Poverty_Rate_Emp Poverty_Cases_Averted Rate_Reduction
Q1_Poorest 0.00 0.00 0 0.00
Q2 79.23 79.23 0 0.00
Q3 78.32 79.02 -164 -0.70
Q4 70.93 73.26 -523 -2.33
Q5_Richest 47.46 54.32 -870 -6.86

3.3.3 Money-Metric Value of Insurance (Risk Premium)

Following Arrow-Pratt theory, the value of insurance is the risk premium individuals are willing to pay to avoid financial uncertainty.

RISK_AVERSION <- 3  # Coefficient of relative risk aversion

df_ecea <- df_ecea %>%
  mutate(
    # Risk premium for each arm (simplified approximation)
    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 = reduction in risk premium
    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),
    Mean_Risk_Premium_UC = mean(risk_premium_UC, na.rm = TRUE),
    Mean_Risk_Premium_Emp = mean(risk_premium_Emp, na.rm = TRUE)
  ) %>%
  select(-wealth_quintile_char)

knitr::kable(insurance_summary, caption = "Insurance Value (Risk Premium Reduction) by Wealth Quintile", digits = 2)
Insurance Value (Risk Premium Reduction) by Wealth Quintile
Wealth_Quintile Mean_Insurance_Value Total_Insurance_Value Mean_Risk_Premium_UC Mean_Risk_Premium_Emp
Q1_Poorest 13951.40 254627086 122729.81 139101.33
Q2 8043.18 187993241 67435.49 76638.45
Q3 5271.40 122649599 44348.79 50701.20
Q4 3370.43 75598738 26022.98 29514.30
Q5_Richest 1555.61 19723611 12149.09 13944.43

3.4 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()
  ) %>%
  mutate(Cost_per_Person = Mean_Net_Cost)

knitr::kable(policy_costs, caption = "Policy Costs by Wealth Quintile", digits = 2)
Policy Costs by Wealth Quintile
wealth_quintile Wealth_Quintile Total_Net_Cost Mean_Net_Cost Population Cost_per_Person
Q1_Poorest Q1_Poorest 7018025 384.53 18251 384.53
Q2 Q2 10102138 432.21 23373 432.21
Q3 Q3 11189110 480.90 23267 480.90
Q4 Q4 11207219 499.65 22430 499.65
Q5_Richest Q5_Richest 7091150 559.28 12679 559.28
  1. Distributional Equity Weights

Following Verguet et al., we apply equity weights that give higher value to health gains among the poor:

Weight = (Poverty Line / Income)^η

where η = 1.0 (elasticity parameter)

EQUITY_ELASTICITY <- 1.0

df_ecea <- df_ecea %>%
  mutate(
    equity_weight = (POVERTY_LINE / individual_income)^EQUITY_ELASTICITY,
    equity_weight = pmin(equity_weight, 5),  # Cap at 5
    equity_weight = pmax(equity_weight, 0.2), # Floor at 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 = "Distributional Equity Weights by Wealth Quintile", digits = 3)
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)
total_insurance <- sum(insurance_summary$Total_Insurance_Value, 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",
    "Catastrophic cases averted per $1,000",
    "Poverty cases averted per $1,000"
  ),
  Value = c(
    sprintf("$%.0f", total_net_cost / total_dalys_averted),
    sprintf("$%.0f", total_net_cost / total_catastrophic),
    sprintf("$%.0f", total_net_cost / total_poverty),
    sprintf("%.2f", total_dalys_averted / total_net_cost * 1000),
    sprintf("%.2f", total_catastrophic / total_net_cost * 1000),
    sprintf("%.2f", total_poverty / total_net_cost * 1000)
  )
)

knitr::kable(efficiency_metrics, caption = "ECEA Efficiency Metrics")
ECEA Efficiency Metrics
Metric Value
Cost per DALY averted \(3990 | |Cost per catastrophic case averted |\)-548325
Cost per poverty case averted $-29934
DALYs averted per $1,000 0.25
Catastrophic cases averted per $1,000 -0.00
Poverty cases averted per $1,000 -0.03
  1. ECEA Visualization

Figure 1: Health Gains and Private Expenditures Averted

# Prepare data for plotting
plot_data_health <- health_gains %>%
  mutate(Type = "Health Gains", Value = DALYs_Averted)

plot_data_pe <- private_expenditures %>%
  mutate(Type = "Private Expenditures Averted", Value = PE_Averted / 100)

fig1 <- ggplot(plot_data_health, aes(x = Wealth_Quintile, y = DALYs_Averted, fill = "Health Gains")) +
  geom_bar(stat = "identity", alpha = 0.7, width = 0.4) +
  geom_bar(data = plot_data_pe, aes(x = Wealth_Quintile, y = Value, fill = "Private Expenditures Averted"),
           stat = "identity", alpha = 0.7, width = 0.4, position = position_nudge(x = 0.4)) +
  scale_y_continuous(
    name = "DALYs Averted",
    sec.axis = sec_axis(~.*100, name = "Private Expenditures Averted ($)")
  ) +
  scale_fill_manual(values = c("Health Gains" = "steelblue", 
                                "Private Expenditures Averted" = "darkorange"),
                    name = "Domain") +
  labs(x = "\nWealth Quintile", y = "DALYs Averted\n",
       title = "A) Health Gains and Private Expenditures Averted") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"), legend.position = "bottom")

print(fig1)

Figure 2: 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)

fig2 <- ggplot(frp_data, aes(x = Wealth_Quintile, y = Cases_Averted, fill = Type)) +
  geom_bar(stat = "identity", alpha = 0.7, position = position_dodge(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 = "B) Financial Risk Protection (FRP) Benefits") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"), legend.position = "bottom")

print(fig2)

Figure 3: Insurance Value by Wealth Quintile

fig3 <- insurance_summary %>%
  ggplot(aes(x = Wealth_Quintile, y = Mean_Insurance_Value, fill = Wealth_Quintile)) +
  geom_bar(stat = "identity", alpha = 0.7) +
  labs(x = "\nWealth Quintile", y = "Mean Insurance Value ($)\n",
       title = "C) Money-Metric Value of Insurance (Risk Premium)") +
  scale_fill_brewer(palette = "RdYlGn", direction = -1) +
  theme_minimal(base_size = 12) +
  theme(legend.position = "none", plot.title = element_text(face = "bold"))

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") +
  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") +
  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)

7. ECEA Summary Results

ecea_complete <- health_gains %>%
  left_join(private_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,
    PE_Averted,
    Catastrophic_Cases_Averted,
    Poverty_Cases_Averted,
    Mean_Insurance_Value,
    Equity_Weight,
    Equity_Ratio
  )

knitr::kable(ecea_complete, caption = "Complete ECEA Results by Wealth Quintile",
             digits = c(0, 6, 2, 0, 0, 2, 3, 3))
Complete ECEA Results by Wealth Quintile
Wealth_Quintile DALYs_Averted PE_Averted Catastrophic_Cases_Averted Poverty_Cases_Averted Mean_Insurance_Value Equity_Weight Equity_Ratio
Q1_Poorest 0.099889 -384.53 0 0 13951.40 1.869 1.869
Q2 0.111872 -432.21 0 0 8043.18 0.924 0.924
Q3 0.117798 -480.90 0 -164 5271.40 0.541 0.541
Q4 0.126490 -499.65 -34 -523 3370.43 0.296 0.296
Q5_Richest 0.131233 -559.28 -51 -870 1555.61 0.200 0.200
  1. Policy Summary
ecea_policy <- data.frame(
  Domain = c(
    "Health Gains",
    "Financial Protection",
    "Financial Protection",
    "Financial Protection",
    "Distributional Equity",
    "Distributional Equity",
    "Efficiency",
    "Efficiency"
  ),
  Metric = c(
    "Total DALYs averted",
    "Total catastrophic cases averted",
    "Total poverty cases averted",
    "Total insurance value",
    "Mean equity weight (poorest)",
    "Mean equity weight (richest)",
    "Cost per DALY averted",
    "Cost per poverty case averted"
  ),
  Value = c(
    sprintf("%.0f", total_dalys_averted),
    sprintf("%.0f", total_catastrophic),
    sprintf("%.0f", total_poverty),
    sprintf("$%.0f", total_insurance),
    sprintf("%.2f", weighted_summary$Equity_Weight[1]),
    sprintf("%.2f", weighted_summary$Equity_Weight[5]),
    sprintf("$%.0f", total_net_cost / total_dalys_averted),
    sprintf("$%.0f", total_net_cost / total_poverty)
  )
)

knitr::kable(ecea_policy, caption = "ECEA Policy Summary")
ECEA Policy Summary
Domain Metric Value
Health Gains Total DALYs averted 11680
Financial Protection Total catastrophic cases averted -85
Financial Protection Total poverty cases averted -1557
Financial Protection Total insurance value $660592274
Distributional Equity Mean equity weight (poorest) 1.87
Distributional Equity Mean equity weight (richest) 0.20
Efficiency Cost per DALY averted \(3990 | |Efficiency |Cost per poverty case averted |\)-29934
  1. Interpretation and Policy Implications

9.1 Key Findings

cat("\n")
cat("========================================\n")
## ========================================
cat("ECEA KEY FINDINGS\n")
## ECEA KEY FINDINGS
cat("========================================\n")
## ========================================
cat(sprintf("Total DALYs averted: %.0f\n", total_dalys_averted))
## Total DALYs averted: 11680
cat(sprintf("Total poverty cases averted: %.0f\n", total_poverty))
## Total poverty cases averted: -1557
cat(sprintf("Total catastrophic cases averted: %.0f\n", total_catastrophic))
## Total catastrophic cases averted: -85
cat(sprintf("\nEquity weighting: Poorest receive %.1fx higher weight than richest\n",
    weighted_summary$Equity_Weight[1] / weighted_summary$Equity_Weight[5]))
## 
## Equity weighting: Poorest receive 9.3x higher weight than richest
cat(sprintf("Cost per DALY: $%.0f\n", total_net_cost / total_dalys_averted))
## Cost per DALY: $3990
cat(sprintf("Cost per poverty case averted: $%.0f\n", total_net_cost / total_poverty))
## Cost per poverty case averted: $-29934
cat("========================================\n")
## ========================================