diff --git a/Indicators/Economic-Capacity-to-Meet-Essential-Needs/ECMEN-ExcludingAssistance.R b/Indicators/Economic-Capacity-to-Meet-Essential-Needs/ECMEN-ExcludingAssistance.R new file mode 100644 index 0000000..d97ca22 --- /dev/null +++ b/Indicators/Economic-Capacity-to-Meet-Essential-Needs/ECMEN-ExcludingAssistance.R @@ -0,0 +1,200 @@ +# ------------------------------------------------------------ +# WFP Standardized Scripts +# Economic Capacity to Meet Essential Needs (ECMEN) – Assessments +# Version excluding assistance (and deducting humanitarian cash used for consumption) +# Last Updated: January 2026 +# ------------------------------------------------------------ + +library(dplyr) + +# ----------------------------- +# 0) Food expenditure inputs (7D recall) +# ----------------------------- +food_purch_7d <- c( + "HHExpFCer_Purch_MN_7D","HHExpFTub_Purch_MN_7D","HHExpFPuls_Purch_MN_7D", + "HHExpFVeg_Purch_MN_7D","HHExpFFrt_Purch_MN_7D","HHExpFAnimMeat_Purch_MN_7D", + "HHExpFAnimFish_Purch_MN_7D","HHExpFFats_Purch_MN_7D","HHExpFDairy_Purch_MN_7D", + "HHExpFEgg_Purch_MN_7D","HHExpFSgr_Purch_MN_7D","HHExpFCond_Purch_MN_7D", + "HHExpFBev_Purch_MN_7D","HHExpFOut_Purch_MN_7D" +) + +food_gift_7d <- c( + "HHExpFCer_GiftAid_MN_7D","HHExpFTub_GiftAid_MN_7D","HHExpFPuls_GiftAid_MN_7D", + "HHExpFVeg_GiftAid_MN_7D","HHExpFFrt_GiftAid_MN_7D","HHExpFAnimMeat_GiftAid_MN_7D", + "HHExpFAnimFish_GiftAid_MN_7D","HHExpFFats_GiftAid_MN_7D","HHExpFDairy_GiftAid_MN_7D", + "HHExpFEgg_GiftAid_MN_7D","HHExpFSgr_GiftAid_MN_7D","HHExpFCond_GiftAid_MN_7D", + "HHExpFBev_GiftAid_MN_7D","HHExpFOut_GiftAid_MN_7D" +) + +food_own_7d <- c( + "HHExpFCer_Own_MN_7D","HHExpFTub_Own_MN_7D","HHExpFPuls_Own_MN_7D", + "HHExpFVeg_Own_MN_7D","HHExpFFrt_Own_MN_7D","HHExpFAnimMeat_Own_MN_7D", + "HHExpFAnimFish_Own_MN_7D","HHExpFFats_Own_MN_7D","HHExpFDairy_Own_MN_7D", + "HHExpFEgg_Own_MN_7D","HHExpFSgr_Own_MN_7D","HHExpFCond_Own_MN_7D", + "HHExpFBev_Own_MN_7D","HHExpFOut_Own_MN_7D" +) + +# ----------------------------- +# 1) Non-food expenditure inputs (cash/credit only for ECMEN) +# 1M recall (short-term) +# ----------------------------- +nf_purch_1m <- c( + "HHExpNFHyg_Purch_MN_1M","HHExpNFTransp_Purch_MN_1M","HHExpNFFuel_Purch_MN_1M", + "HHExpNFWat_Purch_MN_1M","HHExpNFElec_Purch_MN_1M","HHExpNFEnerg_Purch_MN_1M", + "HHExpNFDwelSer_Purch_MN_1M","HHExpNFPhone_Purch_MN_1M","HHExpNFRecr_Purch_MN_1M", + "HHExpNFAlcTobac_Purch_MN_1M" +) + +# 6M recall (long-term) converted to monthly average by /6 +nf_purch_6m <- c( + "HHExpNFMedServ_Purch_MN_6M","HHExpNFMedGood_Purch_MN_6M","HHExpNFCloth_Purch_MN_6M", + "HHExpNFEduFee_Purch_MN_6M","HHExpNFEduGood_Purch_MN_6M","HHExpNFRent_Purch_MN_6M", + "HHExpNFHHSoft_Purch_MN_6M","HHExpNFHHMaint_Purch_MN_6M" +) + +# ----------------------------- +# 2) Assistance variables (assessments) +# ----------------------------- +asst_vars <- c("HHAsstWFPCBTRecTot","HHAsstUNNGOCBTRecTot","HHAsstCBTCShare") + +# If your HH size variable is not HHSize, rename here: +hh_size_var <- "HHSize" # <-- change if needed (e.g., "hh_size") + +# If your MEB variables are named differently, rename here: +meb_var <- "MEB" # per capita MEB +smeb_var <- "sMEB" # per capita SMEB (optional) + +# ----------------------------- +# 3) Convert SYSMIS (NA) expenditures to 0 (SPSS: SYSMIS=0) +# ----------------------------- +all_exp_inputs <- c(food_purch_7d, food_gift_7d, food_own_7d, nf_purch_1m, nf_purch_6m) + +df <- df %>% + mutate(across(all_of(all_exp_inputs), ~ as.numeric(.x))) %>% + mutate(across(all_of(all_exp_inputs), ~ dplyr::coalesce(.x, 0))) + +# ----------------------------- +# 4) (Optional) quick overview for outliers (min/max/mean) +# ----------------------------- +exp_overview <- df %>% + summarise(across(all_of(all_exp_inputs), + list(min = ~min(.x, na.rm = TRUE), + max = ~max(.x, na.rm = TRUE), + mean = ~mean(.x, na.rm = TRUE)))) +exp_overview + +# ----------------------------- +# 5) Compute monthly food totals by source (7D -> 1M with 30/7) +# ----------------------------- +df <- df %>% + mutate( + HHExp_Food_Purch_MN_1M = rowSums(across(all_of(food_purch_7d))) * (30/7), + HHExp_Food_GiftAid_MN_1M = rowSums(across(all_of(food_gift_7d))) * (30/7), + HHExp_Food_Own_MN_1M = rowSums(across(all_of(food_own_7d))) * (30/7) + ) + +# ----------------------------- +# 6) Compute monthly non-food (cash/credit only) = 30D + (6M/6) +# ----------------------------- +df <- df %>% + mutate( + HHExpNFTotal_Purch_MN_30D = rowSums(across(all_of(nf_purch_1m))), + HHExpNFTotal_Purch_MN_6M = rowSums(across(all_of(nf_purch_6m))), + HHExpNFTotal_Purch_MN_1M = HHExpNFTotal_Purch_MN_30D + (HHExpNFTotal_Purch_MN_6M / 6) + ) + +# ----------------------------- +# 7) Household economic capacity for ECMEN (ASSESSMENTS) +# IMPORTANT: exclude in-kind gifts/aid from the aggregate +# Food: Purch + Own (exclude GiftAid) +# Non-food: Purch only +# ----------------------------- +df <- df %>% + mutate( + HHExpF_ECMEN = HHExp_Food_Purch_MN_1M + HHExp_Food_Own_MN_1M, + HHExpNF_ECMEN = HHExpNFTotal_Purch_MN_1M, + HHExp_ECMEN = HHExpF_ECMEN + HHExpNF_ECMEN + ) + +# ----------------------------- +# 8) Deduct humanitarian cash assistance used for consumption (ASSESSMENTS) +# ----------------------------- +df <- df %>% + mutate( + HHAsstWFPCBTRecTot = dplyr::coalesce(as.numeric(HHAsstWFPCBTRecTot), 0), + HHAsstUNNGOCBTRecTot = dplyr::coalesce(as.numeric(HHAsstUNNGOCBTRecTot), 0), + HHAsstCBTCShare = as.numeric(HHAsstCBTCShare), + + HHAsstCBTRec = HHAsstWFPCBTRecTot + HHAsstUNNGOCBTRecTot, + HHAsstCBTRec_1M = HHAsstCBTRec / 3 + ) + +# Median share used for consumption (if all missing -> treat as 0) +asst_share_med <- median(df$HHAsstCBTCShare, na.rm = TRUE) +if (is.na(asst_share_med)) asst_share_med <- 0 + +df <- df %>% + mutate( + HHAsstCBTCShare_med = asst_share_med, + HHAsstCBTRec_Cons_1M = HHAsstCBTRec_1M * (HHAsstCBTCShare_med / 100), + HHAsstCBTRec_Cons_1M = dplyr::coalesce(HHAsstCBTRec_Cons_1M, 0), + HHExp_ECMEN = HHExp_ECMEN - HHAsstCBTRec_Cons_1M + ) + +# ----------------------------- +# 9) Per-capita economic capacity (monthly) +# ----------------------------- +df <- df %>% + mutate( + PCExp_ECMEN = HHExp_ECMEN / .data[[hh_size_var]] + ) + +# ----------------------------- +# 10) ECMEN classification vs MEB (per-capita) +# ----------------------------- +df <- df %>% + mutate( + ECMEN_exclAsst = if_else( + !is.na(PCExp_ECMEN) & !is.na(.data[[meb_var]]), + as.integer(PCExp_ECMEN > .data[[meb_var]]), + NA_integer_ + ) + ) + +df <- df %>% + mutate( + ECMEN_exclAsst = factor( + ECMEN_exclAsst, + levels = c(0, 1), + labels = c("Below MEB", "Above MEB") + ) + ) + + +table(df$ECMEN_exclAsst, useNA = "ifany") + +# Optional SMEB version (only if SMEB exists in your dataset) +if (smeb_var %in% names(df)) { + df <- df %>% + mutate( + ECMEN_exclAsst_SMEB = if_else( + !is.na(PCExp_ECMEN) & !is.na(.data[[smeb_var]]), + as.integer(PCExp_ECMEN > .data[[smeb_var]]), + NA_integer_ + ) + ) + + df <- df %>% + mutate( + ECMEN_exclAsst_SMEB = factor( + ECMEN_exclAsst_SMEB, + levels = c(0, 1), + labels = c("Below MEB", "Above MEB") + ) + ) + + smeb_tab <- table(df$ECMEN_exclAsst_SMEB, useNA = "ifany") + print(smeb_tab) +} + + diff --git a/Indicators/Economic-Capacity-to-Meet-Essential-Needs/ECMEN-IncludingAssistance.R b/Indicators/Economic-Capacity-to-Meet-Essential-Needs/ECMEN-IncludingAssistance.R new file mode 100644 index 0000000..06e1722 --- /dev/null +++ b/Indicators/Economic-Capacity-to-Meet-Essential-Needs/ECMEN-IncludingAssistance.R @@ -0,0 +1,174 @@ +# ------------------------------------------------------------ +# WFP Standardized Scripts +# Economic Capacity to Meet Essential Needs (ECMEN) – Monitoring +# Version INCLUDING assistance (in-kind gifts/aid included) +# Last Updated: January 2026 +# ------------------------------------------------------------ + +library(dplyr) + +# ----------------------------- +# 0) Food expenditure inputs (7D recall) +# ----------------------------- +food_purch_7d <- c( + "HHExpFCer_Purch_MN_7D","HHExpFTub_Purch_MN_7D","HHExpFPuls_Purch_MN_7D", + "HHExpFVeg_Purch_MN_7D","HHExpFFrt_Purch_MN_7D","HHExpFAnimMeat_Purch_MN_7D", + "HHExpFAnimFish_Purch_MN_7D","HHExpFFats_Purch_MN_7D","HHExpFDairy_Purch_MN_7D", + "HHExpFEgg_Purch_MN_7D","HHExpFSgr_Purch_MN_7D","HHExpFCond_Purch_MN_7D", + "HHExpFBev_Purch_MN_7D","HHExpFOut_Purch_MN_7D" +) + +food_gift_7d <- c( + "HHExpFCer_GiftAid_MN_7D","HHExpFTub_GiftAid_MN_7D","HHExpFPuls_GiftAid_MN_7D", + "HHExpFVeg_GiftAid_MN_7D","HHExpFFrt_GiftAid_MN_7D","HHExpFAnimMeat_GiftAid_MN_7D", + "HHExpFAnimFish_GiftAid_MN_7D","HHExpFFats_GiftAid_MN_7D","HHExpFDairy_GiftAid_MN_7D", + "HHExpFEgg_GiftAid_MN_7D","HHExpFSgr_GiftAid_MN_7D","HHExpFCond_GiftAid_MN_7D", + "HHExpFBev_GiftAid_MN_7D","HHExpFOut_GiftAid_MN_7D" +) + +food_own_7d <- c( + "HHExpFCer_Own_MN_7D","HHExpFTub_Own_MN_7D","HHExpFPuls_Own_MN_7D", + "HHExpFVeg_Own_MN_7D","HHExpFFrt_Own_MN_7D","HHExpFAnimMeat_Own_MN_7D", + "HHExpFAnimFish_Own_MN_7D","HHExpFFats_Own_MN_7D","HHExpFDairy_Own_MN_7D", + "HHExpFEgg_Own_MN_7D","HHExpFSgr_Own_MN_7D","HHExpFCond_Own_MN_7D", + "HHExpFBev_Own_MN_7D","HHExpFOut_Own_MN_7D" +) + +# ----------------------------- +# 1) Non-food expenditure inputs (1M recall + 6M recall) +# Purchases (cash/credit) and GiftAid both used in monitoring ECMEN +# ----------------------------- +nf_purch_1m <- c( + "HHExpNFHyg_Purch_MN_1M","HHExpNFTransp_Purch_MN_1M","HHExpNFFuel_Purch_MN_1M", + "HHExpNFWat_Purch_MN_1M","HHExpNFElec_Purch_MN_1M","HHExpNFEnerg_Purch_MN_1M", + "HHExpNFDwelSer_Purch_MN_1M","HHExpNFPhone_Purch_MN_1M","HHExpNFRecr_Purch_MN_1M", + "HHExpNFAlcTobac_Purch_MN_1M" +) + +nf_gift_1m <- c( + "HHExpNFHyg_GiftAid_MN_1M","HHExpNFTransp_GiftAid_MN_1M","HHExpNFFuel_GiftAid_MN_1M", + "HHExpNFWat_GiftAid_MN_1M","HHExpNFElec_GiftAid_MN_1M","HHExpNFEnerg_GiftAid_MN_1M", + "HHExpNFDwelSer_GiftAid_MN_1M","HHExpNFPhone_GiftAid_MN_1M","HHExpNFRecr_GiftAid_MN_1M", + "HHExpNFAlcTobac_GiftAid_MN_1M" +) + +nf_purch_6m <- c( + "HHExpNFMedServ_Purch_MN_6M","HHExpNFMedGood_Purch_MN_6M","HHExpNFCloth_Purch_MN_6M", + "HHExpNFEduFee_Purch_MN_6M","HHExpNFEduGood_Purch_MN_6M","HHExpNFRent_Purch_MN_6M", + "HHExpNFHHSoft_Purch_MN_6M","HHExpNFHHMaint_Purch_MN_6M" +) + +nf_gift_6m <- c( + "HHExpNFMedServ_GiftAid_MN_6M","HHExpNFMedGood_GiftAid_MN_6M","HHExpNFCloth_GiftAid_MN_6M", + "HHExpNFEduFee_GiftAid_MN_6M","HHExpNFEduGood_GiftAid_MN_6M","HHExpNFRent_GiftAid_MN_6M", + "HHExpNFHHSoft_GiftAid_MN_6M","HHExpNFHHMaint_GiftAid_MN_6M" +) + +# Set these to your actual names if different +hh_size_var <- "HHSize" # household size +meb_var <- "MEB" # per-capita MEB +smeb_var <- "sMEB" # per-capita SMEB (optional) + +# ----------------------------- +# 2) Convert NA to 0 for expenditure inputs +# ----------------------------- +all_inputs <- c(food_purch_7d, food_gift_7d, food_own_7d, + nf_purch_1m, nf_gift_1m, nf_purch_6m, nf_gift_6m) + +df <- df %>% + mutate(across(all_of(all_inputs), ~ as.numeric(.x))) %>% + mutate(across(all_of(all_inputs), ~ dplyr::coalesce(.x, 0))) + +# ----------------------------- +# 3) Compute monthly food totals by source (7D -> 1M with 30/7) +# ----------------------------- +df <- df %>% + mutate( + HHExp_Food_Purch_MN_1M = rowSums(across(all_of(food_purch_7d))) * (30/7), + HHExp_Food_GiftAid_MN_1M = rowSums(across(all_of(food_gift_7d))) * (30/7), + HHExp_Food_Own_MN_1M = rowSums(across(all_of(food_own_7d))) * (30/7) + ) + +# ----------------------------- +# 4) Compute monthly non-food totals (purchases + gift/aid) +# 30D + (6M/6) +# ----------------------------- +df <- df %>% + mutate( + HHExpNFTotal_Purch_MN_30D = rowSums(across(all_of(nf_purch_1m))), + HHExpNFTotal_Purch_MN_6M = rowSums(across(all_of(nf_purch_6m))), + HHExpNFTotal_Purch_MN_1M = HHExpNFTotal_Purch_MN_30D + (HHExpNFTotal_Purch_MN_6M / 6), + + HHExpNFTotal_GiftAid_MN_30D = rowSums(across(all_of(nf_gift_1m))), + HHExpNFTotal_GiftAid_MN_6M = rowSums(across(all_of(nf_gift_6m))), + HHExpNFTotal_GiftAid_MN_1M = HHExpNFTotal_GiftAid_MN_30D + (HHExpNFTotal_GiftAid_MN_6M / 6) + ) + +# ----------------------------- +# 5) Household economic capacity (MONITORING, including assistance) +# Food: Purch + GiftAid + Own +# Non-food: Purch + GiftAid +# ----------------------------- +df <- df %>% + mutate( + HHExpF_ECMEN = HHExp_Food_Purch_MN_1M + HHExp_Food_GiftAid_MN_1M + HHExp_Food_Own_MN_1M, + HHExpNF_ECMEN = HHExpNFTotal_Purch_MN_1M + HHExpNFTotal_GiftAid_MN_1M, + HHExp_ECMEN = HHExpF_ECMEN + HHExpNF_ECMEN + ) + +# ----------------------------- +# 6) Per-capita economic capacity +# ----------------------------- +df <- df %>% + mutate( + PCExp_ECMEN = HHExp_ECMEN / .data[[hh_size_var]] + ) + +# ----------------------------- +# 7) ECMEN classification vs MEB (per-capita) +# ----------------------------- +df <- df %>% + mutate( + ECMEN_inclAsst = if_else( + !is.na(PCExp_ECMEN) & !is.na(.data[[meb_var]]), + as.integer(PCExp_ECMEN > .data[[meb_var]]), + NA_integer_ + ) + ) + +df <- df %>% + mutate( + ECMEN_inclAsst = factor( + ECMEN_inclAsst, + levels = c(0, 1), + labels = c("Below MEB", "Above MEB") + ) + ) + +print(table(df$ECMEN_inclAsst, useNA = "ifany")) + +# ----------------------------- +# 8) Optional SMEB version (if SMEB exists) +# ----------------------------- +if (smeb_var %in% names(df)) { + df <- df %>% + mutate( + ECMEN_inclAsst_SMEB = if_else( + !is.na(PCExp_ECMEN) & !is.na(.data[[smeb_var]]), + as.integer(PCExp_ECMEN > .data[[smeb_var]]), + NA_integer_ + ) + ) + + df <- df %>% + mutate( + ECMEN_inclAsst_SMEB = factor( + ECMEN_inclAsst_SMEB,, + levels = c(0, 1), + labels = c("Below MEB", "Above MEB") + ) + ) + + + print(table(df$ECMEN_inclAsst_SMEB, useNA = "ifany")) +}