Pre-liminary Results

Published

February 18, 2026

Abstract

First results from the main study survey data

1 Premilinary Results

Code
```{r}
#| message: false
#| warning: false
#| label: load-data

library(tidyverse)
library(fixest)
library(haven)
library(kableExtra)
library(modelsummary)
library(ggplot2)
library(patchwork)
library(DescTools)
library(broom)
library(tibble)
library(dplyr)
library(tidyr)
library(haven)

conflicted::conflict_prefer("select", "dplyr")
conflicted::conflict_prefer("filter", "dplyr")

theme_set(theme_minimal())


# To refresh data, first run the do file at:
###### "/Users/st2246/Work/Pilot3/code/tidy_run_main.do"
# Then run python file:
##### /Users/st2246/Work/Pilot3/code/pipeline/load.py
df <- read_dta("/Users/st2246/Work/Pilot3/data/generated/main/transform/30_merged_panel-hh_id-period.dta") %>%
    mutate(
        treatment = as.factor(treatment),
        treatment_split = as.factor(treatment_split),
        treatment_balanced = as.factor(treatment_balanced),
        enum_id = as.factor(enum_id),
        # Make sure draw is non-empty for control arms too
        draw_realized = ifelse(treatment == 0, "C", draw_realized),
        draw_imputed = ifelse(treatment == 0, "C", draw_imputed),
        draw_imputed_lag1 = ifelse(treatment == 0, "C", draw_imputed_lag1),
        draw_realized_lag1 = ifelse(treatment == 0, "C", draw_realized_lag1),
        pass_bags = if_else(is.na(pass_bags), 0, pass_bags),
        study_income = as.numeric(pass_bags * 12),
        study_income = if_else(treatment == 0, 0, study_income),
        study_income = if_else(pickup_completed == 0, 0, study_income),
        # high = draw == "H"
        hh_size = as.numeric(hh_size),
        hh_id = as.factor(hh_id)
    )

# Food consumption categories
food_categories <- c("grains", "veges", "bevs", "pulses", "dairy", "meat", "fruits")
# Note: we only have fruit consumption, not purchases since we don't ask for itemized fruit purchases in the phone survey
consumption_category_vars <- paste0("food_consumption_", food_categories, "_99") 
#purchase_category_vars <- paste0("food_purchase_", food_categories, "_99")

# Define variables to analyze
variables <- c(
    "loan_total_outstanding_99",
    "food_consumption_total_99",
    "food_consumption_total_phone_99",
    "food_purchase_total_phone_99",
    "food_purchase_total_99",
    "total_consumption_99",
    "expenditure_total_nonfood_99",
    "days_worked_corrected",
    "money_work_corrected_99",
    "days_worked_p_corrected",
    "money_earn_p_corrected",
    "work_engaged_p_corrected",
    "working_adults_corrected",
    "gad2_z",
    "phq2_z",
    "dd_hdds_z",
    "fi_index_anderson",
    "svg_current_savings_99",
    "svg_savings_flow_99",
    "total_income_99",
    "asset_sales_99",
    "asset_purchases_99",
    "asset_net_99",
    "money_work_99",
    "days_worked",
    "working_adults",
    consumption_category_vars
)



# Make basic tables using modelsummary and kableExtra to show results
variableLabels <- c(
    "loan_total_outstanding_99" = "Loans taken",
    "food_consumption_total_99" = "Food Consumption Total",
    "food_consumption_total_phone_99" = "Food Consumption (Phone Items)",
    "food_purchase_total_phone_99" = "Food Purchase (Phone Items)",
    "food_purchase_total_99" = "Food Purchase Total",
    "total_consumption_99" = "Total Consumption",
    "expenditure_total_nonfood_99" = "Non-Food Expenditure",
    "days_worked_corrected" = "Days Worked",
    "money_work_corrected_99" = "Income from Work",
    "days_worked_p_corrected" = "Days Worked (Participant)",
    "money_earn_p_corrected" = "Money Total (Participant)",
    "work_engaged_p_corrected" = "Working? (Participant)",
    "working_adults_corrected" = "Working Adults",
    "gad2_z" = "GAD-2 Z-Score",
    "phq2_z" = "PHQ-2 Z-Score",
    "dd_hdds_z" = "HDDS Z-Score",
    "fi_index_anderson" = "FI Index",
    "svg_current_savings_99" = "Current Savings",
    "svg_savings_flow_99" = "Savings Flow",
    "total_income_99" = "Total Income",
    "asset_sales_99" = "Asset Sales",
    "asset_purchases_99" = "Asset Purchases",
    "asset_net_99" = "Asset Net",
    "money_work_99" = "Income from Work",
    "days_worked" = "Days Worked",
    "working_adults" = "Working Adults",
    "food_consumption_grains_99" = "Grains",
    "food_consumption_veges_99" = "Vegetables",
    "food_consumption_bevs_99" = "Beverages",
    "food_consumption_pulses_99" = "Pulses",
    "food_consumption_dairy_99" = "Dairy",
    "food_consumption_meat_99" = "Meat",
    "food_consumption_fruits_99" = "Fruits",
    "food_purchase_grains_99" = "Grains",
    "food_purchase_veges_99" = "Vegetables",
    "food_purchase_bevs_99" = "Beverages",
    "food_purchase_pulses_99" = "Pulses",
    "food_purchase_dairy_99" = "Dairy",
    "food_purchase_meat_99" = "Meat",
    "food_purchase_fruits_99" = "Fruits"
)
# Make baseline labels by iterating through variableLabels and adding _bl to the variable name and "Baseline" to the variable label
variableLabelsBl <- setNames(paste("Baseline", variableLabels), paste0(names(variableLabels), "_bl"))


# Calculate control group baseline means and SDs
control_baseline_stats <- df %>%
    filter(treatment == 0, period == 0) %>%
    summarise(across(
        all_of(setdiff(variables, c("phq2_z", "gad2_z"))),
        list(
            mean = ~ mean(.x, na.rm = TRUE),
            sd = ~ sd(.x, na.rm = TRUE)
        ),
        .names = "{.col}_{.fn}"
    ))


# Create standardized versions of variables using control baseline stats
df <- df %>%
    mutate(across(
        all_of(setdiff(variables, c("phq2_z", "gad2_z"))),
        ~ (.x - control_baseline_stats[[paste0(cur_column(), "_mean")]]) /
            control_baseline_stats[[paste0(cur_column(), "_sd")]],
        .names = "{.col}_z"
    ))


variables_and_z <- c(variables, paste0(setdiff(variables, c("phq2_z", "gad2_z")), "_z"))

# Create baseline values using filter + join approach
baseline_df <- df %>%
    filter(period == 0) %>%
    select(hh_id, all_of(c(variables, variables_and_z))) %>%
    rename_with(~ paste0(.x, "_bl"), .cols = -hh_id)

df <- df %>%
    left_join(baseline_df, by = "hh_id")
```
Code
```{r}
#| message: false
#| warning: false
#| label: run-regressions

# Function to run regressions for a variable
run_regressions <- function(
    var,
    varLabel = variableLabels[var],
    reg_data = df,
    fe_spec = "| district_id + period + wave + enum_id + day_of_week + cohort",
    fe_spec_endline = "| district_id + wave + enum_id + day_of_week + cohort",
    controls = paste0(var, "_bl + hh_size + census_wealth_index")) {

    reg_data_bl <- reg_data 
    reg_data <- reg_data %>%
        filter(period > 0)

    
    
    # By Treatment groups
    group_reg <- feols(as.formula(paste0(var, " ~ ", controls, " + i(treatment) ", fe_spec)),
        cluster = "hh_id",
        data = reg_data
    )

    # By Treatment groups - including baseline
    group_reg_with_baseline <- feols(as.formula(paste0(var, " ~ ", controls, " + i(treatment) ", fe_spec)),
        cluster = "hh_id",
        data = reg_data_bl
    )

    group_reg_no_endline <- feols(as.formula(paste0(var, " ~ ", controls, " + i(treatment) ", fe_spec)),
        cluster = "hh_id",
        data = reg_data %>% filter(period < 6)
    ) 

    # By Treatment groups - balanced_risky
    group_reg_balanced <- feols(as.formula(paste0(var, " ~ ", controls, " + i(treatment_balanced) ", fe_spec)),
        cluster = "hh_id",
        data = reg_data
    )
    # By Treatment groups - balanced_risky
    group_reg_split <- feols(as.formula(paste0(var, " ~ ", controls, " + i(treatment_split) ", fe_spec)),
        cluster = "hh_id",
        data = reg_data
    )

    income_reg <- feols(as.formula(paste0(var, " ~ ", controls, " + study_income ", fe_spec)),
        cluster = "hh_id",
        data = reg_data
    )

    income_and_treatment_reg <- feols(as.formula(paste0(var, " ~ ", controls, " + i(treatment) + study_income ", fe_spec)),
        cluster = "hh_id",
        data = reg_data
    )

    income_treatment_interaction_reg <- feols(as.formula(paste0(var, " ~ ", controls, " + i(treatment) * study_income ", fe_spec)),
        cluster = "hh_id",
        data = reg_data,
        collin.tol = 1e-5
    )

    draw_imputed_reg <- feols(as.formula(paste0(var, " ~ ", controls, " + i(draw_imputed, ref = 'C') + unpredictable ", fe_spec)),
        cluster = "hh_id",
        data = reg_data
    )

    draw_imputed_with_lag_reg <- feols(as.formula(paste0(var, " ~ ", controls, " + i(draw_imputed, ref = 'C') + i(draw_imputed_lag1, ref = 'C') + unpredictable ", fe_spec)),
        cluster = "hh_id",
        data = reg_data
    )

    draw_realized_reg <- feols(as.formula(paste0(var, " ~ ", controls, " + i(draw_realized, ref = 'C') + unpredictable ", fe_spec)),
        cluster = "hh_id",
        data = reg_data %>% filter(draw_realized != "")
    )

    draw_realized_with_lag_reg <- feols(as.formula(paste0(var, " ~ ", controls, " + i(draw_realized, ref = 'C') + i(draw_realized_lag1, ref = 'C') + unpredictable ", fe_spec)),
        cluster = "hh_id",
        data = reg_data %>% filter(draw_realized != "" & draw_realized_lag1 != "")
    )

    # By Treatment groups -> Using balanced panel of people who completed all surveys
    balanced_panel_reg <- feols(as.formula(paste0(var, " ~ ", controls, " + i(treatment) ", fe_spec)),
        cluster = "hh_id",
        data = reg_data %>% filter(completed_all_surveys == 1)
    )

    endline_only <- feols(as.formula(paste0(var, " ~ ", controls, " + i(treatment) ", fe_spec_endline)),
        cluster = "community_id",
        data = reg_data %>% filter(period == 6)
    )

    treated_v_control <- feols(as.formula(paste0(var, " ~ ", controls, " + treated ", fe_spec)),
        cluster = "hh_id",
        data = reg_data
    )

    treated_v_control_endline <- feols(as.formula(paste0(var, " ~ ", controls, " + treated ", fe_spec_endline, " + enum_id")),
        cluster = "community_id",
        data = reg_data %>% filter(period == 6)
    )

    # Create named list using simple numeric names to avoid HTML encoding
    return(setNames(
        list(
            group_reg, group_reg_balanced, group_reg_split,
            income_reg, income_and_treatment_reg, income_treatment_interaction_reg,
            draw_imputed_reg, draw_imputed_with_lag_reg, draw_realized_reg,
            draw_realized_with_lag_reg, balanced_panel_reg, endline_only,
            treated_v_control, treated_v_control_endline, group_reg_with_baseline, group_reg_no_endline
        ),
        c(
            varLabel,
            paste0(varLabel, " - Balanced Risky"),
            paste0(varLabel, " - Split Risky"),
            paste0(varLabel, " - Income"),
            paste0(varLabel, " - Income + Arm"),
            paste0(varLabel, " - Income X Arm"),
            paste0(varLabel, " - Imputed Draw"),
            paste0(varLabel, " - Imputed Draw with Lag"),
            paste0(varLabel, " - Realized Draw"),
            paste0(varLabel, " - Realized Draw with Lag"),
            paste0(varLabel, " - Balanced Panel"),
            paste0(varLabel, " - Endline Only"),
            paste0(varLabel, " - Treated vs Control"),
            paste0(varLabel, " - Treated vs Control (Endline Only)"),
            paste0(varLabel, " - Baseline Included"),
            paste0(varLabel, " - Excluding Endline")
        )
    ))
}

# Run regressions on all dv's specified in variables
models <- map(variables, run_regressions) %>%
    set_names(variables)


# Make a list of _z variables (std version of dv's)
zVariables <- c(paste0(setdiff(variables, c("phq2_z", "gad2_z")), "_z"), "gad2_z", "phq2_z")
# Run regressions on them
# The results are used for effect plots below
z_models <- map(zVariables, run_regressions) %>%
    set_names(zVariables)
```
Code
```{r}
allLabels <- c(
    variableLabels,
    # variableLabelsBl,
    "treatment" = "Arm",
    "treated" = "Treated",
    # "period::1" = "Period 1",
    # "period::2" = "Period 2",
    # "period::3" = "Period 3",
    # "period::4" = "Period 4",
    # "period::5" = "Period 5",
    # "period::6" = "Endline",
    "treatment::1" = "Stable",
    "treatment::2" = "Predictable",
    "treatment::3" = "Risky",
    "treatment_balanced::1" = "Stable",
    "treatment_balanced::2" = "Predictable",
    "treatment_balanced::3" = "Risky (Balanced)",
    "treatment_split::1" = "Stable",
    "treatment_split::2" = "Predictable",
    "treatment_split::3" = "Risky Medium",
    "treatment_split::4" = "Risky High",
    "treatment_split::5" = "Risky Low",
    "draw_realized::H" = "High Draw",
    "draw_realized::M" = "Medium Draw",
    "draw_realized::L" = "Low Draw",
    "draw_realized_lag1::H" = "High Draw previous period",
    "draw_realized_lag1::M" = "Medium Draw previous period",
    "draw_realized_lag1::L" = "Low Draw previous period",
    "draw_imputed::H" = "High Draw",
    "draw_imputed::M" = "Medium Draw",
    "draw_imputed::L" = "Low Draw",
    "draw_imputed_lag1::H" = "High Draw previous period",
    "draw_imputed_lag1::M" = "Medium Draw previous period",
    "draw_imputed_lag1::L" = "Low Draw previous period",
    "study_income" = "Study Income",
    "study_income:treatment::1" = "Stable × Study Income",
    "study_income:treatment::2" = "Predictable × Study Income",
    "study_income:treatment::3" = "Risky × Study Income"
    # add labels for interaction between study income and arm
)

makeTable <- function(models) {
    table <- modelsummary(models,
        escape = FALSE,
        coef_map = allLabels,
        output = "kableExtra",
        estimate = "{estimate}{stars}",
        statistic = "{std.error} ({conf.low}, {conf.high})",
        coef_omit = NULL,
        coef_omit_sources = FALSE,
        stars = c(`***` = 0.01, `**` = 0.05, `*` = 0.1),
        gof_map = tribble(
            ~raw, ~clean, ~fmt,
            "nobs", "Observations", 0,
            "FE", "Community FE", 1,
        )
    ) %>%
        kable_classic(full_width = F, html_font = "Cambria", fixed_thead = T)
    table
}
```
Code
```{r}
#| message: false
#| warning: false
#| label: regression-plot-functions

# Function to run regressions for a variable
generate_coeff_df <- function(estimate_data, var) {
    # Get the label for the variable
    varLabel <- variableLabels[var]
    # Define common controls specification
    controls <- paste0(var, "_bl + hh_size")

    period <- c(0, 1, 2, 3, 4, 5, 6)
    estimate_df <- map(period, ~
        tidy(
            feols(as.formula(paste0(var, " ~ ", controls, " + i(treatment) | community_id")),
                cluster = "community_id",
                data = estimate_data %>% filter(period == .x)
            ),
            conf.int = TRUE
        ))
    # Aggreagte estimate_df into one, adding a period column
    estimate_df <- bind_rows(estimate_df, .id = "period") %>%
        filter(str_detect(term, "treatment")) %>%
        filter(period != 1) %>%
        mutate(
            period = as.numeric(period) - 1,
            treatment = case_when(
                term == "treatment::1" ~ "Stable",
                term == "treatment::2" ~ "Predictable",
                term == "treatment::3" ~ "Risky",
            ),
            # add jitter to period for plotting based on treatment
            period = case_when(
                treatment == "Stable" ~ period - 0.2,
                treatment == "Predictable" ~ period,
                treatment == "Risky" ~ period + 0.2,
            )
        ) %>%
        select(!c(term))

    estimate_df
}

effects_grapher <- function(data, ylabel) {
    ggplot(data, aes(x = period, y = estimate, group = treatment, color = treatment)) +
        geom_point() +
        geom_hline(yintercept = 0, color = "grey") +
        geom_errorbar(aes(ymin = conf.low, ymax = conf.high)) +
        ylab(ylabel) +
        xlab("Period")
}
```
Note

All regressions control for household size and wealth at census. They also include district_id, period, wave, enum_id, day_of_week and cohort fixed effects

1.1 Consumption and Purchases

1.1.1 Descriptive Graphs (mean)

Code
```{r}
#| warning: false
#| message: false
#| label: fig-total-consumption
#| fig-cap: "Total Consumption Over Time"
total_consumption <- ggplot(df, aes(x = period, y = total_consumption_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "All consumption",
        x = "Period",
        y = "Cedis (win. 99%)"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    )


non_food_expenditure <- ggplot(df, aes(x = period, y = expenditure_total_nonfood_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Non-Food Consumption",
        x = "Period",
        y = "Cedis (win. 99%)"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    )

total_consumption / non_food_expenditure + plot_layout(guides = "collect") & theme(legend.justification = c("right", "top"))
```
Figure 1: Total Consumption Over Time

1.1.2 Period by Period Regression Coefficents

Code
```{r}
#| warning: false
#| message: false
total_consumption_reg_df <- df %>% generate_coeff_df("food_consumption_total_99")
total_consumption_reg_gp <- total_consumption_reg_df %>%
    effects_grapher("All Items")

total_consumption_reg_gp
```

1.1.3 Descriptive Graphs (mean)

Code
```{r}
#| warning: false
#| message: false
#| label: fig-food-consumption-detailed
#| fig-cap: "Food Consumption Over Time"
# Make ggplot showing how average food consumption changes over time by treatment
consumption <- ggplot(df, aes(x = period, y = food_consumption_total_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Food Consumption - All Items",
        x = "Period",
        y = "Cedis (win. 99%)"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

consumption_phone <- ggplot(df, aes(x = period, y = food_consumption_total_phone_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Food Consumption - Phone Items",
        x = "Period",
        y = "Cedis (win. 99%)"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()


(consumption / consumption_phone) + plot_layout(guides = "collect") & theme(legend.justification = c("right", "top"))
```
Figure 2: Food Consumption Over Time

1.1.4 Period by Period Regression Coefficents

Code
```{r}
#| warning: false
#| message: false
cosnumption_reg_df <- df %>% generate_coeff_df("food_consumption_total_99")
consumption_reg_gp <- cosnumption_reg_df %>%
    effects_grapher("All Items")

consumption_phone_reg_gp <- df %>%
    generate_coeff_df("food_consumption_total_phone_99") %>%
    effects_grapher("Subset to Phone Items")

(consumption_reg_gp / consumption_phone_reg_gp) + plot_layout(guides = "collect", axes = "collect") + plot_annotation(title = "Treatment effect on food consumption (win 99%)")
```

Code
```{r}
#| label: fig-food-purchases-detailed
#| fig-cap: "Food Consumption Over Time"
#| warning: false
#| message: false
# Make ggplot showing how average food consumption changes over time by treatment
purchase <- ggplot(df, aes(x = period, y = food_purchase_total_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Food Purchases - All Items",
        x = "Period",
        y = "Cedis (win. 99%)"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

purchase_phone <- ggplot(df, aes(x = period, y = food_purchase_total_phone_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Food Purchases - Phone Items",
        x = "Period",
        y = "Cedis (win. 99%)"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

(purchase / purchase_phone) + plot_layout(guides = "collect") & theme(legend.justification = c("right", "top"))
```
Figure 3: Food Consumption Over Time

1.1.5 Period by Period Regression Coefficents

Code
```{r}
#| warning: false
#| message: false
purchase_reg_gp <- df %>%
    generate_coeff_df("food_purchase_total_99") %>%
    effects_grapher("All Items")

purchase_phone_reg_gp <- df %>%
    generate_coeff_df("food_purchase_total_phone_99") %>%
    effects_grapher("Subset to Phone Items")

(purchase_reg_gp / purchase_phone_reg_gp) + plot_layout(guides = "collect", axes = "collect") + plot_annotation(title = "Treatment effect on food purchases (win 99%)")
```

1.1.6 Food Consumption Regressions

Code
```{r}
#| label: tbl-consumption-main-results
#| tbl-cap: ""
# Create and output 1 table
makeTable(c(
    models[["total_consumption_99"]][1],
    models[["food_consumption_total_99"]][1],
    models[["food_purchase_total_99"]][1],
    models[["total_consumption_99"]][2],
    models[["food_consumption_total_99"]][2],
    models[["food_purchase_total_99"]][2]
))
```
Table 1
Total Consumption Food Consumption Total Food Purchase Total Total Consumption - Balanced Risky Food Consumption Total - Balanced Risky Food Purchase Total - Balanced Risky
Stable 71.600*** 40.097*** 57.129*** 72.937*** 41.504*** 58.568***
19.322 (33.709, 109.492) 14.570 (11.526, 68.668) 15.045 (27.626, 86.632) 19.377 (34.928, 110.946) 14.524 (13.015, 69.994) 15.097 (28.953, 88.183)
Predictable 72.977*** 66.335*** 54.592*** 71.464*** 66.113*** 53.803***
18.825 (36.062, 109.893) 15.216 (36.497, 96.174) 14.407 (26.339, 82.845) 18.809 (34.569, 108.358) 15.208 (36.280, 95.946) 14.400 (25.556, 82.049)
Risky 65.175*** 47.110*** 53.803***
15.447 (34.884, 95.467) 12.152 (23.281, 70.940) 11.795 (30.673, 76.933)
Risky (Balanced) 81.952*** 43.193** 62.259***
23.359 (36.132, 127.772) 17.350 (9.159, 77.227) 17.218 (28.484, 96.034)
Observations 12593 12593 12593 8065 8065 8065
Code
```{r}
#| label: tbl-consumption-risky-splits
#| tbl-cap: ""
# Create and output 1 table
makeTable(c(
    models[["total_consumption_99"]][3],
    models[["food_consumption_total_99"]][3],
    models[["food_purchase_total_99"]][3]
))
```
Table 2
Total Consumption - Split Risky Food Consumption Total - Split Risky Food Purchase Total - Split Risky
Stable 71.788*** 40.114*** 57.242***
19.355 (33.828, 109.748) 14.545 (11.587, 68.640) 15.077 (27.672, 86.812)
Predictable 71.896*** 65.385*** 53.855***
18.808 (35.008, 108.785) 15.223 (35.527, 95.242) 14.403 (25.606, 82.103)
Risky Medium 80.656*** 41.998** 60.870***
23.238 (35.080, 126.232) 17.357 (7.956, 76.040) 17.155 (27.224, 94.515)
Risky High 38.919* 34.233* 28.587*
22.716 (−5.633, 83.471) 18.658 (−2.361, 70.828) 17.074 (−4.900, 62.073)
Risky Low 78.074*** 59.203*** 68.657***
25.755 (27.561, 128.586) 18.930 (22.076, 96.330) 19.955 (29.518, 107.795)
Observations 9830 9830 9830
Code
```{r}
#| label: tbl-consumption-income-interactions
#| tbl-cap: ""
# create and output 1 table
makeTable(c(
    models[["total_consumption_99"]][4],
    models[["food_consumption_total_99"]][4],
    models[["food_purchase_total_99"]][4],
    models[["total_consumption_99"]][5],
    models[["food_consumption_total_99"]][5],
    models[["food_purchase_total_99"]][5],
    models[["total_consumption_99"]][6],
    models[["food_consumption_total_99"]][6],
    models[["food_purchase_total_99"]][6]
))
```
Table 3
 Total Consumption - Income  Food Consumption Total - Income  Food Purchase Total - Income  Total Consumption - Income + Arm  Food Consumption Total - Income + Arm  Food Purchase Total - Income + Arm  Total Consumption - Income X Arm  Food Consumption Total - Income X Arm  Food Purchase Total - Income X Arm
Stable 74.746*** 43.954*** 62.497*** 62.274 15.722 60.501
20.396 (34.749, 114.743) 15.412 (13.730, 74.177) 15.816 (31.482, 93.513) 50.523 (−36.802, 161.351) 38.487 (−59.751, 91.195) 44.457 (−26.680, 147.682)
Predictable 76.075*** 70.133*** 59.878*** 53.391** 57.474*** 39.887**
20.056 (36.746, 115.405) 16.193 (38.378, 101.889) 15.237 (29.999, 89.757) 22.598 (9.075, 97.707) 18.340 (21.509, 93.440) 16.989 (6.573, 73.202)
Risky 68.267*** 50.901*** 59.078*** 76.910*** 56.502*** 66.361***
16.963 (35.003, 101.531) 13.135 (25.143, 76.659) 12.933 (33.717, 84.439) 17.595 (42.407, 111.413) 13.582 (29.868, 83.136) 13.394 (40.096, 92.626)
Study Income 0.172*** 0.113** 0.117** −0.032 −0.039 −0.054 −0.121 −0.097 −0.129**
0.064 (0.046, 0.298) 0.051 (0.012, 0.213) 0.048 (0.022, 0.211) 0.069 (−0.166, 0.103) 0.054 (−0.145, 0.067) 0.051 (−0.154, 0.045) 0.083 (−0.283, 0.041) 0.065 (−0.225, 0.031) 0.060 (−0.248, −0.011)
Stable × Study Income 0.215 0.343 0.095
0.495 (−0.756, 1.186) 0.378 (−0.398, 1.084) 0.432 (−0.751, 0.941)
Predictable × Study Income 0.324** 0.188 0.282**
0.151 (0.027, 0.620) 0.119 (−0.044, 0.421) 0.110 (0.066, 0.497)
Observations 12593 12593 12593 12593 12593 12593 12593 12593 12593
Note

For risky arms that did not complete dropoff, we impute a medium draw for the regressions below

Code
```{r}
#| label: tbl-consumption-draw
#| tbl-cap: ""
# create and output 1 table
makeTable(c(
    models[["total_consumption_99"]][7],
    models[["food_consumption_total_99"]][7],
    models[["food_purchase_total_99"]][7],
    models[["total_consumption_99"]][8],
    models[["food_consumption_total_99"]][8],
    models[["food_purchase_total_99"]][8]
))
```
Table 4
 Total Consumption - Imputed Draw  Food Consumption Total - Imputed Draw  Food Purchase Total - Imputed Draw  Total Consumption - Imputed Draw with Lag  Food Consumption Total - Imputed Draw with Lag  Food Purchase Total - Imputed Draw with Lag
High Draw 63.909*** 54.439*** 47.726*** 74.355*** 65.912*** 65.748***
18.629 (27.377, 100.441) 14.902 (25.215, 83.663) 14.306 (19.671, 75.781) 24.718 (25.883, 122.828) 19.116 (28.424, 103.399) 18.612 (29.249, 102.247)
Medium Draw 77.585*** 49.036*** 59.753*** 76.834*** 49.542*** 59.005***
18.523 (41.260, 113.909) 14.071 (21.442, 76.630) 14.357 (31.600, 87.907) 18.640 (40.280, 113.388) 14.199 (21.697, 77.386) 14.398 (30.770, 87.240)
Low Draw 69.854*** 59.944*** 56.080*** 80.639*** 71.944*** 74.449***
18.851 (32.887, 106.820) 15.220 (30.097, 89.791) 14.301 (28.035, 84.124) 24.749 (32.105, 129.172) 19.393 (33.914, 109.974) 18.394 (38.379, 110.519)
High Draw previous period −17.741 −19.323 −27.676*
19.524 (−56.027, 20.545) 14.629 (−48.011, 9.365) 14.361 (−55.837, 0.486)
Low Draw previous period −10.948 −8.956 −20.231
19.946 (−50.063, 28.167) 14.952 (−38.278, 20.365) 14.602 (−48.865, 8.403)
Observations 12593 12593 12593 12593 12593 12593
Note

Only treated participants that completed pickup are included in the regressions below.

Code
```{r}
#| label: tbl-consumption-imputed-draw
#| tbl-cap: ""
# create and output 1 table
makeTable(c(
    models[["total_consumption_99"]][9],
    models[["food_consumption_total_99"]][9],
    models[["food_purchase_total_99"]][9],
    models[["total_consumption_99"]][10],
    models[["food_consumption_total_99"]][10],
    models[["food_purchase_total_99"]][10]
))
```
Table 5
Total Consumption - Realized Draw Food Consumption Total - Realized Draw Food Purchase Total - Realized Draw Total Consumption - Realized Draw with Lag Food Consumption Total - Realized Draw with Lag Food Purchase Total - Realized Draw with Lag
High Draw 72.328*** 65.297*** 51.648*** 10.533 16.180 −1.109
19.541 (34.008, 110.649) 15.696 (34.515, 96.079) 14.920 (22.388, 80.908) 8241207.364 (−16161473.423, 16161494.490) 6084953.686 (−11932929.688, 11932962.048) 5885818.683 (−11542431.727, 11542429.509)
Medium Draw 71.166*** 40.554*** 55.996*** 60.267*** 34.247** 44.985***
19.544 (32.839, 109.493) 14.701 (11.724, 69.383) 15.180 (26.227, 85.765) 19.657 (21.719, 98.815) 14.809 (5.206, 63.289) 15.207 (15.163, 74.807)
Low Draw 77.016*** 69.551*** 58.906*** 19.065 22.487 11.188
19.847 (38.095, 115.937) 16.134 (37.911, 101.190) 14.976 (29.536, 88.275) 8241207.973 (−16161466.086, 16161504.215) 6084954.214 (−11932924.416, 11932969.390) 5885819.096 (−11542420.241, 11542442.618)
High Draw previous period 47.064 36.917 37.836
8241206.513 (−16161435.223, 16161529.352) 6084953.399 (−11932908.390, 11932982.223) 5885818.152 (−11542391.741, 11542467.414)
Low Draw previous period 52.540 48.527 45.211
8241207.027 (−16161430.755, 16161535.834) 6084953.415 (−11932896.810, 11932993.864) 5885818.564 (−11542385.175, 11542475.597)
Observations 11968 11968 11968 10385 10385 10385
Note

Only participants who completed all surveys are included in the regressions below.

Code
```{r}
#| label: tbl-consumption-balanced-panel
#| tbl-cap: ""
# create and output 1 table
makeTable(c(
    models[["total_consumption_99"]][11],
    models[["food_consumption_total_99"]][11],
    models[["food_purchase_total_99"]][11]
))
```
Table 6
Total Consumption - Balanced Panel Food Consumption Total - Balanced Panel Food Purchase Total - Balanced Panel
Stable 73.847*** 40.024** 57.201***
23.256 (28.231, 119.464) 17.350 (5.991, 74.056) 18.295 (21.316, 93.086)
Predictable 67.166*** 60.474*** 50.638***
22.709 (22.623, 111.708) 18.597 (23.995, 96.952) 17.671 (15.976, 85.301)
Risky 65.392*** 46.998*** 56.540***
18.970 (28.183, 102.602) 15.098 (17.383, 76.613) 14.768 (27.574, 85.507)
Observations 9384 9384 9384
Note

The regressions below include baseline (period 0) data.

Code
```{r}
#| label: tbl-consumption-baseline-included
#| tbl-cap: ""
makeTable(c(
    models[["total_consumption_99"]][15],
    models[["food_consumption_total_99"]][15],
    models[["food_purchase_total_99"]][15]
))
```
Table 7
 Total Consumption - Baseline Included  Food Consumption Total - Baseline Included  Food Purchase Total - Baseline Included
Stable 59.606*** 33.540*** 47.879***
16.529 (27.192, 92.019) 12.778 (8.483, 58.598) 12.850 (22.679, 73.078)
Predictable 60.451*** 59.433*** 46.899***
16.111 (28.857, 92.045) 13.246 (33.458, 85.407) 12.356 (22.668, 71.130)
Risky 52.821*** 39.091*** 43.874***
13.220 (26.897, 78.746) 10.719 (18.071, 60.110) 10.086 (24.096, 63.652)
Observations 14865 14865 14865
Note

The regressions below exclude endline (period 6) data.

Code
```{r}
#| label: tbl-consumption-excluding-endline
#| tbl-cap: ""
makeTable(c(
    models[["total_consumption_99"]][16],
    models[["food_consumption_total_99"]][16],
    models[["food_purchase_total_99"]][16]
))
```
Table 8
Total Consumption - Excluding Endline Food Consumption Total - Excluding Endline Food Purchase Total - Excluding Endline
Stable 61.962*** 37.359** 53.279***
18.527 (25.630, 98.294) 14.501 (8.922, 65.796) 14.971 (23.921, 82.637)
Predictable 61.202*** 61.228*** 50.238***
17.907 (26.087, 96.317) 15.184 (31.453, 91.003) 14.129 (22.530, 77.946)
Risky 56.937*** 46.921*** 52.176***
14.823 (27.870, 86.005) 12.242 (22.915, 70.928) 11.729 (29.176, 75.176)
Observations 10345 10345 10345

1.2 Mental Health

Warning

The N for mental health outcomes is lower than for other outcomes. The cause for the lower observation count is due to 62 endline surveys that were conducted with a household member other than the participant. In these cases we did not ask for responses to the mental health questions.

1.2.1 Descriptive Graphs (mean)

Code
```{r}
#| label: fig-mental-health
#| fig-cap: "Mental Health Over Time"
#| warning: false
# Make ggplot showing how average food consumption changes over time by treatment
phq <- ggplot(df, aes(x = period, y = phq2_z, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "PHQ-2 Z-Score",
        x = "Period",
        y = "PHQ-2 Z-score",
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()
gad <- ggplot(df, aes(x = period, y = gad2_z, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "GAD-2 Z-Score",
        x = "Period",
        y = "GAD-2 Z-score",
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

(gad / phq) + plot_layout(guides = "collect") & theme(legend.justification = c("right", "top"))
```
Figure 4: Mental Health Over Time

1.2.2 Period by Period Regression Coefficents

Code
```{r}
#| warning: false
#| message: false
gad_reg_gp <- df %>%
    generate_coeff_df("gad2_z") %>%
    effects_grapher("GAD-2 Z-Score")

phq_reg_gp <- df %>%
    generate_coeff_df("phq2_z") %>%
    effects_grapher("PHQ-2 Z-Score")

(gad_reg_gp / phq_reg_gp) + plot_layout(guides = "collect", axes = "collect") + plot_annotation(title = "Treatment effect on mental health")
```

1.2.3 Mental Health Regressions

Code
```{r}
#| label: tbl-mental-health-main
#| tbl-cap: ""
makeTable(c(
    models[["gad2_z"]][1],
    models[["phq2_z"]][1],
    models[["gad2_z"]][2],
    models[["phq2_z"]][2]
))
```
Table 9
 GAD-2 Z-Score  PHQ-2 Z-Score  GAD-2 Z-Score - Balanced Risky  PHQ-2 Z-Score - Balanced Risky
Stable −0.060* −0.071** −0.056 −0.070**
0.037 (−0.132, 0.012) 0.035 (−0.138, −0.003) 0.037 (−0.127, 0.016) 0.034 (−0.137, −0.002)
Predictable −0.028 −0.035 −0.028 −0.037
0.037 (−0.100, 0.044) 0.034 (−0.101, 0.032) 0.037 (−0.100, 0.044) 0.034 (−0.104, 0.030)
Risky −0.060* −0.084***
0.031 (−0.122, 0.001) 0.028 (−0.140, −0.028)
Risky (Balanced) −0.025 −0.105***
0.043 (−0.109, 0.059) 0.039 (−0.182, −0.029)
Observations 12531 12531 8030 8030
Code
```{r}
#| label: tbl-mental-health-risky-splits
#| tbl-cap: ""
makeTable(c(
    models[["gad2_z"]][3],
    models[["phq2_z"]][3]
))
```
Table 10
 GAD-2 Z-Score - Split Risky  PHQ-2 Z-Score - Split Risky
Stable −0.058 −0.071**
0.037 (−0.129, 0.014) 0.034 (−0.138, −0.003)
Predictable −0.029 −0.037
0.037 (−0.101, 0.043) 0.034 (−0.103, 0.030)
Risky Medium −0.026 −0.107***
0.043 (−0.110, 0.058) 0.039 (−0.183, −0.031)
Risky High −0.104** −0.056
0.046 (−0.194, −0.015) 0.041 (−0.136, 0.025)
Risky Low −0.007 −0.062
0.054 (−0.113, 0.100) 0.049 (−0.158, 0.033)
Observations 9776 9776
Code
```{r}
#| label: tbl-mental-health-income-interactions
#| tbl-cap: ""
makeTable(c(
    models[["gad2_z"]][4],
    models[["phq2_z"]][4],
    models[["gad2_z"]][5],
    models[["phq2_z"]][5],
    models[["gad2_z"]][6],
    models[["phq2_z"]][6]
))
```
Table 11
 GAD-2 Z-Score - Income  PHQ-2 Z-Score - Income  GAD-2 Z-Score - Income + Arm  PHQ-2 Z-Score - Income + Arm  GAD-2 Z-Score - Income X Arm  PHQ-2 Z-Score - Income X Arm
Stable −0.023 −0.045 −0.096 −0.163
0.039 (−0.099, 0.054) 0.037 (−0.117, 0.028) 0.110 (−0.312, 0.121) 0.105 (−0.370, 0.044)
Predictable 0.009 −0.009 −0.009 −0.033
0.039 (−0.068, 0.086) 0.036 (−0.081, 0.062) 0.044 (−0.095, 0.078) 0.043 (−0.117, 0.051)
Risky −0.023 −0.059* −0.014 −0.046
0.034 (−0.090, 0.044) 0.031 (−0.120, 0.002) 0.035 (−0.084, 0.055) 0.032 (−0.109, 0.017)
Study Income −0.000*** −0.000*** −0.000*** −0.000** −0.000*** −0.000***
0.000 (−0.001, −0.000) 0.000 (−0.001, −0.000) 0.000 (−0.001, −0.000) 0.000 (−0.001, −0.000) 0.000 (−0.001, −0.000) 0.000 (−0.001, −0.000)
Stable × Study Income 0.001 0.001
0.001 (−0.001, 0.003) 0.001 (−0.001, 0.003)
Predictable × Study Income 0.000 0.000
0.000 (−0.000, 0.001) 0.000 (−0.000, 0.001)
Observations 12531 12531 12531 12531 12531 12531
Note

For risky arms that did not complete dropoff, we impute a medium draw for the regressions below

Code
```{r}
#| label: tbl-mental-health-draw
#| tbl-cap: ""
makeTable(c(
    models[["gad2_z"]][7],
    models[["phq2_z"]][7],
    models[["gad2_z"]][8],
    models[["phq2_z"]][8]
))
```
Table 12
 GAD-2 Z-Score - Imputed Draw  PHQ-2 Z-Score - Imputed Draw  GAD-2 Z-Score - Imputed Draw with Lag  PHQ-2 Z-Score - Imputed Draw with Lag
High Draw −0.062* −0.064* 0.335 −0.216
0.037 (−0.135, 0.010) 0.034 (−0.131, 0.003) 32162.960 (−63071.627, 63072.298) 30242.724 (−59306.572, 59306.140)
Medium Draw −0.050 −0.053 0.313 −0.204
0.035 (−0.120, 0.020) 0.033 (−0.118, 0.012) 32162.958 (−63071.645, 63072.272) 30242.723 (−59306.557, 59306.149)
Low Draw −0.015 −0.041 0.383 −0.192
0.037 (−0.088, 0.058) 0.034 (−0.108, 0.026) 32162.960 (−63071.578, 63072.345) 30242.724 (−59306.548, 59306.163)
High Draw previous period −0.410 0.149
32162.958 (−63072.368, 63071.547) 30242.722 (−59306.202, 59306.501)
Medium Draw previous period −0.359 0.149
32162.958 (−63072.317, 63071.598) 30242.722 (−59306.203, 59306.502)
Low Draw previous period −0.396 0.150
32162.958 (−63072.354, 63071.562) 30242.722 (−59306.201, 59306.501)
Observations 12531 12531 12531 12531
Note

Only treated participants that completed pickup are included in the regressions below.

Code
```{r}
#| label: tbl-mental-health-imputed-draw
#| tbl-cap: ""
makeTable(c(
    models[["gad2_z"]][9],
    models[["phq2_z"]][9],
    models[["gad2_z"]][10],
    models[["phq2_z"]][10]
))
```
Table 13
 GAD-2 Z-Score - Realized Draw  PHQ-2 Z-Score - Realized Draw  GAD-2 Z-Score - Realized Draw with Lag  PHQ-2 Z-Score - Realized Draw with Lag
High Draw −0.053 −0.047 −0.058 −0.054
0.038 (−0.128, 0.023) 0.036 (−0.117, 0.023) 0.040 (−0.137, 0.021) 0.038 (−0.128, 0.021)
Medium Draw −0.060 −0.065* −0.055 −0.069*
0.037 (−0.132, 0.012) 0.035 (−0.133, 0.004) 0.038 (−0.129, 0.019) 0.036 (−0.140, 0.001)
Low Draw −0.004 −0.020 −0.016 −0.033
0.039 (−0.079, 0.072) 0.036 (−0.090, 0.050) 0.042 (−0.097, 0.066) 0.039 (−0.111, 0.044)
High Draw previous period −0.010 0.001
0.022 (−0.054, 0.034) 0.020 (−0.039, 0.041)
Observations 11931 11931 10349 10349
Note

Only participants who completed all surveys are included in the regressions below.

Code
```{r}
#| label: tbl-mental-health-balanced-panel
#| tbl-cap: ""
makeTable(c(
    models[["gad2_z"]][11],
    models[["phq2_z"]][11]
))
```
Table 14
 GAD-2 Z-Score - Balanced Panel  PHQ-2 Z-Score - Balanced Panel
Stable −0.105** −0.118***
0.044 (−0.191, −0.019) 0.042 (−0.201, −0.036)
Predictable −0.035 −0.078*
0.045 (−0.123, 0.053) 0.042 (−0.160, 0.005)
Risky −0.083** −0.126***
0.039 (−0.159, −0.006) 0.036 (−0.196, −0.055)
Observations 9357 9357
Note

The regressions below include baseline (period 0) data.

Code
```{r}
#| label: tbl-mental-health-baseline-included
#| tbl-cap: ""
makeTable(c(
    models[["gad2_z"]][15],
    models[["phq2_z"]][15]
))
```
Table 15
 GAD-2 Z-Score - Baseline Included  PHQ-2 Z-Score - Baseline Included
Stable −0.056* −0.062**
0.031 (−0.117, 0.006) 0.030 (−0.120, −0.004)
Predictable −0.018 −0.025
0.031 (−0.080, 0.044) 0.029 (−0.083, 0.032)
Risky −0.051* −0.072***
0.027 (−0.104, 0.001) 0.024 (−0.120, −0.024)
Observations 14803 14803
Note

The regressions below exclude endline (period 6) data.

Code
```{r}
#| label: tbl-mental-health-excluding-endline
#| tbl-cap: ""
makeTable(c(
    models[["gad2_z"]][16],
    models[["phq2_z"]][16]
))
```
Table 16
 GAD-2 Z-Score - Excluding Endline  PHQ-2 Z-Score - Excluding Endline
Stable −0.096*** −0.099***
0.037 (−0.170, −0.023) 0.035 (−0.167, −0.032)
Predictable −0.059 −0.056
0.037 (−0.131, 0.014) 0.035 (−0.124, 0.012)
Risky −0.079** −0.096***
0.032 (−0.141, −0.016) 0.029 (−0.153, −0.039)
Observations 10345 10345

1.3 Income and Days Worked

Note

The variables included in total income are:

  • Work Income
  • Income from crop or ag. product sales
  • Income from “other sources” (remittances and sales of goods mostly)
Tip

During period 4, we made a change in the survey to account for the fact the participants were including study income in their reported income.

1.3.1 Descriptive Graphs (mean)

Code
```{r}
#| label: fig-money-earned
#| fig-cap: "Work Outcomes Over Time"
#| warning: false

total_income_plot <- ggplot(df, aes(x = period, y = total_income_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Total Income (Household)",
        x = "Period",
        y = "Cedis"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

working_adults_plot <- ggplot(df, aes(x = period, y = working_adults_corrected, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Working Adults (Household)",
        x = "Period",
        y = "Count"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

days_worked_corrected_plot <- ggplot(df, aes(x = period, y = days_worked_corrected, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Days Worked (Household)",
        x = "Period",
        y = "Days"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

money_work_plot <- ggplot(df, aes(x = period, y = money_work_corrected_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Work Income (Household)",
        x = "Period",
        y = "Cedis"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

((total_income_plot + working_adults_plot) / days_worked_corrected_plot / money_work_plot) + plot_layout(guides = "collect") & theme(legend.justification = c("right", "top"))
```
Figure 5: Work Outcomes Over Time

1.3.2 Period by Period Regression Coefficents

Code
```{r}
#| warning: false
#| message: false
total_income_reg_gp <- df %>%
    generate_coeff_df("total_income_99") %>%
    effects_grapher("Total Income (Cedis)")

working_adults_reg_gp <- df %>%
    generate_coeff_df("working_adults_corrected") %>%
    effects_grapher("Working Adults")

days_worked_corrected_reg_gp <- df %>%
    generate_coeff_df("days_worked_corrected") %>%
    effects_grapher("Days Worked")

money_work_reg_gp <- df %>%
    generate_coeff_df("money_work_corrected_99") %>%
    effects_grapher("Work Income (Cedis)")

((total_income_reg_gp + working_adults_reg_gp) / days_worked_corrected_reg_gp / money_work_reg_gp) + plot_layout(guides = "collect", axes = "collect") + plot_annotation(title = "Treatment effect on household work")
```

1.3.3 Descriptive Graphs (mean)

Code
```{r}
#| label: fig-money-earned-p
#| fig-cap: "Work Outcomes Over Time"
#| warning: false

working_adults_plot <- ggplot(df, aes(x = period, y = work_engaged_p_corrected, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Working? (participant)",
        x = "Period",
        y = "Count"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

days_worked_corrected_plot <- ggplot(df, aes(x = period, y = days_worked_p_corrected, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Days Worked (Participant)",
        x = "Period",
        y = "Days"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

money_work_plot <- ggplot(df, aes(x = period, y = money_work_p_corrected_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Work Income (Participant)",
        x = "Period",
        y = "Cedis"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

(working_adults_plot / days_worked_corrected_plot / money_work_plot) + plot_layout(guides = "collect") & theme(legend.justification = c("right", "top"))
```
Figure 6: Work Outcomes Over Time

1.3.4 Period by Period Regression Coefficents

Code
```{r}
#| warning: false
#| message: false
#| label: fig-money-earned-p-reg
working_adults_reg_gp <- df %>%
    generate_coeff_df("work_engaged_p_corrected") %>%
    effects_grapher("Working?")

days_worked_corrected_reg_gp <- df %>%
    generate_coeff_df("days_worked_p_corrected") %>%
    effects_grapher("Days Worked")

money_work_reg_gp <- df %>%
    generate_coeff_df("money_earn_p_corrected") %>%
    effects_grapher("Work Income")

(working_adults_reg_gp / days_worked_corrected_reg_gp / money_work_reg_gp) + plot_layout(guides = "collect", axes = "collect") + plot_annotation(title = "Treatment effect on participant outside work")
```
Figure 7

1.3.5 Work Regressions

Code
```{r}
#| label: tbl-money-earned-main
#| tbl-cap: ""
makeTable(c(
    models[["working_adults_corrected"]][1], models[["days_worked_corrected"]][1], models[["money_work_corrected_99"]][1], models[["total_income_99"]][1],
    models[["working_adults_corrected"]][2], models[["days_worked_corrected"]][2], models[["money_work_corrected_99"]][2], models[["total_income_99"]][2],
    models[["days_worked_p_corrected"]][1], models[["money_earn_p_corrected"]][1], models[["work_engaged_p_corrected"]][1],
    models[["days_worked_p_corrected"]][2], models[["money_earn_p_corrected"]][2], models[["work_engaged_p_corrected"]][2]
))
```
Table 17
Working Adults Days Worked  Income from Work  Total Income Working Adults - Balanced Risky Days Worked - Balanced Risky  Income from Work - Balanced Risky  Total Income - Balanced Risky Days Worked (Participant) Money Total (Participant) Working? (Participant) Days Worked (Participant) - Balanced Risky Money Total (Participant) - Balanced Risky Working? (Participant) - Balanced Risky
Stable −0.067*** −0.352** −9.865** −25.115* −0.066*** −0.343** −9.401** −24.081 −0.174*** −1.623 −0.025*** −0.168*** −1.524 −0.025***
0.021 (−0.108, −0.025) 0.150 (−0.647, −0.057) 4.758 (−19.195, −0.535) 15.008 (−54.545, 4.316) 0.021 (−0.108, −0.024) 0.152 (−0.642, −0.045) 4.784 (−18.785, −0.017) 15.134 (−53.768, 5.607) 0.058 (−0.288, −0.059) 2.777 (−7.069, 3.822) 0.009 (−0.043, −0.007) 0.059 (−0.284, −0.052) 2.746 (−6.911, 3.863) 0.009 (−0.043, −0.007)
Predictable −0.052** −0.181 −3.963 18.379 −0.053** −0.180 −3.891 20.015 −0.115* −0.504 −0.021** −0.116* −0.119 −0.022**
0.021 (−0.093, −0.010) 0.150 (−0.475, 0.112) 4.807 (−13.390, 5.465) 16.462 (−13.903, 50.661) 0.021 (−0.094, −0.011) 0.150 (−0.474, 0.115) 4.813 (−13.332, 5.549) 16.539 (−12.427, 52.458) 0.060 (−0.232, 0.002) 2.848 (−6.089, 5.080) 0.009 (−0.039, −0.003) 0.060 (−0.233, 0.002) 2.811 (−5.633, 5.394) 0.009 (−0.040, −0.004)
Risky −0.034* −0.187 −5.311 −10.901 −0.116** −0.613 −0.015*
0.018 (−0.068, 0.001) 0.123 (−0.429, 0.054) 3.810 (−12.782, 2.160) 13.109 (−36.609, 14.806) 0.052 (−0.218, −0.014) 1.955 (−4.447, 3.220) 0.008 (−0.031, 0.001)
Risky (Balanced) −0.065*** −0.312** −12.838*** −16.535 −0.172*** −4.948** −0.027***
0.022 (−0.108, −0.021) 0.156 (−0.619, −0.006) 4.591 (−21.844, −3.832) 16.819 (−49.526, 16.456) 0.064 (−0.297, −0.047) 1.967 (−8.806, −1.090) 0.010 (−0.048, −0.007)
Observations 12593 12593 12593 12593 8065 8065 8065 8065 12593 12593 12593 8065 8065 8065
Code
```{r}
#| label: tbl-money-earned-risky-splits
#| tbl-cap: ""
makeTable(c(
    models[["working_adults_corrected"]][3], models[["days_worked_corrected"]][3], models[["money_work_corrected_99"]][3], models[["total_income_99"]][3],
    models[["days_worked_p_corrected"]][3], models[["money_earn_p_corrected"]][3], models[["work_engaged_p_corrected"]][3]
))
```
Table 18
Working Adults - Split Risky Days Worked - Split Risky  Income from Work - Split Risky  Total Income - Split Risky Days Worked (Participant) - Split Risky Money Total (Participant) - Split Risky Working? (Participant) - Split Risky
Stable −0.067*** −0.357** −9.784** −24.959* −0.172*** −1.467 −0.025***
0.021 (−0.109, −0.025) 0.151 (−0.653, −0.060) 4.770 (−19.140, −0.428) 15.078 (−54.531, 4.614) 0.059 (−0.286, −0.057) 2.772 (−6.903, 3.969) 0.009 (−0.043, −0.007)
Predictable −0.052** −0.188 −4.121 19.448 −0.118** −0.401 −0.021**
0.021 (−0.093, −0.011) 0.150 (−0.482, 0.105) 4.816 (−13.568, 5.325) 16.494 (−12.902, 51.799) 0.060 (−0.235, −0.001) 2.849 (−5.988, 5.187) 0.009 (−0.039, −0.003)
Risky Medium −0.066*** −0.327** −12.418*** −15.261 −0.178*** −5.014** −0.028***
0.022 (−0.109, −0.023) 0.156 (−0.632, −0.021) 4.605 (−21.449, −3.386) 16.752 (−48.117, 17.596) 0.064 (−0.303, −0.053) 2.011 (−8.959, −1.069) 0.010 (−0.048, −0.008)
Risky High −0.034 −0.256 2.275 −10.785 −0.066 6.062 −0.007
0.026 (−0.085, 0.016) 0.172 (−0.593, 0.081) 6.318 (−10.117, 14.667) 19.365 (−48.765, 27.195) 0.080 (−0.222, 0.090) 4.328 (−2.426, 14.550) 0.012 (−0.030, 0.017)
Risky Low 0.019 −0.082 4.230 −10.930 −0.165** −2.491 −0.009
0.033 (−0.045, 0.083) 0.218 (−0.510, 0.346) 7.552 (−10.583, 19.043) 20.750 (−51.627, 29.767) 0.078 (−0.318, −0.013) 2.751 (−7.886, 2.904) 0.013 (−0.034, 0.016)
Observations 9830 9830 9830 9830 9830 9830 9830
Code
```{r}
#| label: tbl-money-earned-income-interactions
#| tbl-cap: ""
makeTable(c(
    models[["working_adults_corrected"]][4], models[["days_worked_corrected"]][4], models[["money_work_corrected_99"]][4], models[["total_income_99"]][4],
    models[["working_adults_corrected"]][5], models[["days_worked_corrected"]][5], models[["money_work_corrected_99"]][5], models[["total_income_99"]][5],
    models[["working_adults_corrected"]][6], models[["days_worked_corrected"]][6], models[["money_work_corrected_99"]][6], models[["total_income_99"]][6],
    models[["days_worked_p_corrected"]][4], models[["money_earn_p_corrected"]][4], models[["work_engaged_p_corrected"]][4],
    models[["days_worked_p_corrected"]][5], models[["money_earn_p_corrected"]][5], models[["work_engaged_p_corrected"]][5],
    models[["days_worked_p_corrected"]][6], models[["money_earn_p_corrected"]][6], models[["work_engaged_p_corrected"]][6]
))
```
Table 19
 Working Adults - Income  Days Worked - Income  Income from Work - Income  Total Income - Income  Working Adults - Income + Arm  Days Worked - Income + Arm  Income from Work - Income + Arm  Total Income - Income + Arm  Working Adults - Income X Arm  Days Worked - Income X Arm  Income from Work - Income X Arm  Total Income - Income X Arm  Days Worked (Participant) - Income  Money Total (Participant) - Income  Working? (Participant) - Income  Days Worked (Participant) - Income + Arm  Money Total (Participant) - Income + Arm  Working? (Participant) - Income + Arm  Days Worked (Participant) - Income X Arm  Money Total (Participant) - Income X Arm  Working? (Participant) - Income X Arm
Stable −0.057** −0.277* −9.962* −18.500 −0.143*** −0.867*** −10.916 −38.336 −0.142** −0.346 −0.021** −0.196 6.090 −0.050**
0.023 (−0.102, −0.011) 0.163 (−0.597, 0.043) 5.284 (−20.324, 0.400) 16.059 (−49.992, 12.991) 0.045 (−0.232, −0.054) 0.289 (−1.433, −0.302) 14.431 (−39.216, 17.383) 34.781 (−106.542, 29.869) 0.064 (−0.268, −0.016) 3.227 (−6.674, 5.981) 0.010 (−0.041, −0.002) 0.156 (−0.502, 0.111) 13.184 (−19.765, 31.945) 0.021 (−0.092, −0.008)
Predictable −0.041* −0.108 −4.058 24.894 −0.052* −0.198 −9.007 9.941 −0.084 0.753 −0.017* −0.086 −1.252 −0.018
0.023 (−0.087, 0.004) 0.165 (−0.431, 0.216) 5.209 (−14.273, 6.157) 17.216 (−8.868, 58.655) 0.028 (−0.107, 0.003) 0.207 (−0.603, 0.208) 5.739 (−20.261, 2.247) 19.782 (−28.852, 48.734) 0.065 (−0.212, 0.044) 3.046 (−5.220, 6.726) 0.010 (−0.037, 0.003) 0.078 (−0.239, 0.068) 3.057 (−7.246, 4.742) 0.012 (−0.041, 0.006)
Risky −0.024 −0.114 −5.406 −4.401 −0.017 −0.059 −3.587 1.717 −0.085 0.642 −0.011 −0.082 1.129 −0.010
0.020 (−0.063, 0.016) 0.140 (−0.387, 0.160) 4.447 (−14.127, 3.314) 14.521 (−32.877, 24.076) 0.021 (−0.058, 0.025) 0.146 (−0.345, 0.226) 4.735 (−12.873, 5.698) 15.041 (−27.779, 31.213) 0.059 (−0.200, 0.031) 2.546 (−4.351, 5.634) 0.009 (−0.029, 0.007) 0.062 (−0.204, 0.039) 2.821 (−4.402, 6.661) 0.010 (−0.029, 0.009)
Study Income −0.000** −0.001** −0.017 −0.071 −0.000 −0.001 0.001 −0.067 −0.000 −0.001 −0.018 −0.130* −0.001** −0.012 −0.000** −0.000 −0.013 −0.000 −0.000 −0.018 −0.000
0.000 (−0.000, −0.000) 0.001 (−0.002, −0.000) 0.019 (−0.053, 0.020) 0.055 (−0.180, 0.037) 0.000 (−0.000, 0.000) 0.001 (−0.002, 0.001) 0.022 (−0.042, 0.044) 0.059 (−0.183, 0.049) 0.000 (−0.000, 0.000) 0.001 (−0.003, 0.000) 0.027 (−0.071, 0.035) 0.068 (−0.264, 0.004) 0.000 (−0.001, −0.000) 0.010 (−0.031, 0.007) 0.000 (−0.000, −0.000) 0.000 (−0.001, 0.000) 0.013 (−0.038, 0.012) 0.000 (−0.000, 0.000) 0.000 (−0.001, 0.000) 0.016 (−0.050, 0.014) 0.000 (−0.000, 0.000)
Stable × Study Income 0.001** 0.007** 0.028 0.263 0.001 −0.060 0.000
0.000 (0.000, 0.002) 0.003 (0.001, 0.012) 0.130 (−0.227, 0.284) 0.317 (−0.357, 0.884) 0.001 (−0.002, 0.004) 0.117 (−0.289, 0.169) 0.000 (−0.000, 0.001)
Predictable × Study Income 0.000 0.001 0.070 0.218 0.000 0.026 0.000
0.000 (−0.000, 0.001) 0.002 (−0.002, 0.005) 0.046 (−0.020, 0.160) 0.143 (−0.063, 0.498) 0.001 (−0.001, 0.001) 0.023 (−0.019, 0.070) 0.000 (−0.000, 0.000)
Observations 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593
Note

For risky arms that did not complete dropoff, we impute a medium draw for the regressions below

Code
```{r}
#| label: tbl-money-earned-draw
#| tbl-cap: ""
makeTable(c(
    models[["working_adults_corrected"]][7], models[["days_worked_corrected"]][7], models[["money_work_corrected_99"]][7], models[["total_income_99"]][7],
    models[["working_adults_corrected"]][8], models[["days_worked_corrected"]][8], models[["money_work_corrected_99"]][8], models[["total_income_99"]][8],
    models[["days_worked_p_corrected"]][7], models[["money_earn_p_corrected"]][7], models[["work_engaged_p_corrected"]][7],
    models[["days_worked_p_corrected"]][8], models[["money_earn_p_corrected"]][8], models[["work_engaged_p_corrected"]][8]
))
```
Table 20
 Working Adults - Imputed Draw  Days Worked - Imputed Draw  Income from Work - Imputed Draw  Total Income - Imputed Draw  Working Adults - Imputed Draw with Lag  Days Worked - Imputed Draw with Lag  Income from Work - Imputed Draw with Lag  Total Income - Imputed Draw with Lag  Days Worked (Participant) - Imputed Draw  Money Total (Participant) - Imputed Draw  Working? (Participant) - Imputed Draw  Days Worked (Participant) - Imputed Draw with Lag  Money Total (Participant) - Imputed Draw with Lag  Working? (Participant) - Imputed Draw with Lag
High Draw −0.065*** −0.271* −6.653 3.386 −0.043 −0.125 −2.578 19.015 −0.154** −2.875 −0.026*** −0.202** −4.463 −0.039***
0.021 (−0.107, −0.023) 0.154 (−0.572, 0.030) 4.962 (−16.384, 3.078) 16.414 (−28.803, 35.575) 0.031 (−0.104, 0.018) 0.220 (−0.558, 0.307) 6.739 (−15.794, 10.638) 20.294 (−20.781, 58.812) 0.063 (−0.277, −0.031) 3.001 (−8.760, 3.011) 0.010 (−0.045, −0.007) 0.084 (−0.368, −0.037) 3.472 (−11.271, 2.345) 0.013 (−0.064, −0.013)
Medium Draw −0.059*** −0.283* −6.229 −14.134 −0.054** −0.245 −5.907 −12.811 −0.135** 1.068 −0.021** −0.133** 1.121 −0.021**
0.021 (−0.099, −0.018) 0.145 (−0.568, 0.002) 4.691 (−15.428, 2.969) 14.718 (−42.995, 14.728) 0.021 (−0.096, −0.012) 0.152 (−0.542, 0.053) 4.751 (−15.224, 3.410) 15.058 (−42.341, 16.718) 0.059 (−0.250, −0.020) 2.852 (−4.524, 6.661) 0.009 (−0.039, −0.003) 0.060 (−0.250, −0.016) 2.700 (−4.173, 6.415) 0.009 (−0.040, −0.003)
Low Draw −0.055** −0.233 −8.648* 10.915 −0.033 −0.085 −4.318 26.672 −0.154** −3.602 −0.024** −0.204** −5.160 −0.036***
0.022 (−0.097, −0.012) 0.153 (−0.534, 0.067) 4.892 (−18.242, 0.947) 16.362 (−21.172, 43.002) 0.032 (−0.096, 0.030) 0.231 (−0.537, 0.368) 6.364 (−16.798, 8.161) 20.481 (−13.493, 66.836) 0.062 (−0.276, −0.032) 3.113 (−9.706, 2.502) 0.010 (−0.043, −0.005) 0.085 (−0.371, −0.036) 3.341 (−11.712, 1.391) 0.013 (−0.061, −0.011)
High Draw previous period −0.029 −0.175 −7.328 −19.911 0.078 1.847 0.015
0.030 (−0.087, 0.030) 0.215 (−0.597, 0.246) 6.327 (−19.736, 5.079) 17.752 (−54.722, 14.900) 0.080 (−0.078, 0.234) 3.159 (−4.347, 8.041) 0.012 (−0.009, 0.038)
Low Draw previous period −0.014 −0.100 −2.419 −16.503 0.050 2.288 0.016
0.030 (−0.074, 0.045) 0.218 (−0.528, 0.327) 6.554 (−15.271, 10.432) 17.675 (−51.164, 18.159) 0.077 (−0.101, 0.202) 3.140 (−3.870, 8.446) 0.012 (−0.007, 0.039)
Observations 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593 12593
Note

Only treated participants that completed pickup are included in the regressions below.

Code
```{r}
#| label: tbl-money-earned-imputed-draw
#| tbl-cap: ""
makeTable(c(
    models[["working_adults_corrected"]][9], models[["days_worked_corrected"]][9], models[["money_work_corrected_99"]][9], models[["total_income_99"]][9],
    models[["working_adults_corrected"]][10], models[["days_worked_corrected"]][10], models[["money_work_corrected_99"]][10], models[["total_income_99"]][10],
    models[["days_worked_p_corrected"]][9], models[["money_earn_p_corrected"]][9], models[["work_engaged_p_corrected"]][9],
    models[["days_worked_p_corrected"]][10], models[["money_earn_p_corrected"]][10], models[["work_engaged_p_corrected"]][10]
))
```
Table 21
Working Adults - Realized Draw Days Worked - Realized Draw  Income from Work - Realized Draw  Total Income - Realized Draw Working Adults - Realized Draw with Lag Days Worked - Realized Draw with Lag  Income from Work - Realized Draw with Lag  Total Income - Realized Draw with Lag Days Worked (Participant) - Realized Draw Money Total (Participant) - Realized Draw Working? (Participant) - Realized Draw Days Worked (Participant) - Realized Draw with Lag Money Total (Participant) - Realized Draw with Lag Working? (Participant) - Realized Draw with Lag
High Draw −0.060*** −0.239 −3.177 15.658 −0.389 −0.087 5.209 29.198 −0.124* 0.233 −0.023** −0.098 3.384 −0.255
0.022 (−0.104, −0.016) 0.159 (−0.551, 0.074) 5.139 (−13.254, 6.900) 17.328 (−18.324, 49.640) 10336.314 (−20270.498, 20269.719) 69417.384 (−136131.590, 136131.416) 2707728.664 (−5310007.199, 5310017.616) 6831722.146 (−13397372.782, 13397431.177) 0.063 (−0.248, 0.001) 2.955 (−5.563, 6.029) 0.010 (−0.042, −0.004) 30107.898 (−59043.426, 59043.230) 1350982.814 (−2649351.996, 2649358.764) 4929.370 (−9667.035, 9666.525)
Medium Draw −0.062*** −0.333** −9.251* −22.695 −0.053** −0.259 −8.878* −27.914* −0.175*** −1.607 −0.025*** −0.154** −1.645 −0.022**
0.021 (−0.105, −0.020) 0.153 (−0.632, −0.034) 4.833 (−18.728, 0.225) 15.194 (−52.491, 7.101) 0.024 (−0.099, −0.007) 0.166 (−0.584, 0.066) 5.036 (−18.753, 0.997) 16.317 (−59.912, 4.084) 0.058 (−0.289, −0.060) 2.806 (−7.109, 3.896) 0.009 (−0.043, −0.006) 0.062 (−0.277, −0.032) 2.490 (−6.527, 3.237) 0.010 (−0.041, −0.002)
Low Draw −0.052** −0.220 −5.807 22.378 −0.393 −0.148 4.552 34.661 −0.126** −0.245 −0.020** −0.110 3.534 −0.255
0.023 (−0.096, −0.008) 0.159 (−0.531, 0.091) 5.028 (−15.668, 4.053) 17.217 (−11.385, 56.141) 10336.314 (−20270.502, 20269.715) 69417.386 (−136131.655, 136131.358) 2707728.381 (−5310007.301, 5310016.405) 6831722.121 (−13397367.271, 13397436.592) 0.063 (−0.249, −0.002) 3.002 (−6.133, 5.642) 0.010 (−0.039, −0.001) 30107.895 (−59043.432, 59043.213) 1350982.864 (−2649351.946, 2649359.014) 4929.370 (−9667.035, 9666.524)
High Draw previous period 0.330 −0.112 −9.971 −14.445 0.014 −2.429 0.236
10336.312 (−20269.776, 20270.436) 69417.376 (−136131.597, 136131.374) 2707728.942 (−5310022.925, 5310002.982) 6831722.373 (−13397416.870, 13397387.979) 30107.897 (−59043.313, 59043.340) 1350982.941 (−2649358.060, 2649353.201) 4929.370 (−9666.544, 9667.015)
Low Draw previous period 0.343 −0.050 −5.318 −9.111 −0.021 −2.210 0.237
10336.313 (−20269.764, 20270.451) 69417.383 (−136131.550, 136131.449) 2707728.894 (−5310018.176, 5310007.541) 6831721.936 (−13397410.679, 13397392.457) 30107.899 (−59043.351, 59043.308) 1350982.997 (−2649357.949, 2649353.530) 4929.370 (−9666.544, 9667.017)
Observations 11968 11968 11968 11968 10385 10385 10385 10385 11968 11968 11968 10385 10385 10385
Note

Only participants who completed all surveys are included in the regressions below.

Code
```{r}
#| label: tbl-money-earned-balanced-panel
#| tbl-cap: ""
makeTable(c(
    models[["working_adults_corrected"]][11], models[["days_worked_corrected"]][11], models[["money_work_corrected_99"]][11], models[["total_income_99"]][11],
    models[["days_worked_p_corrected"]][11], models[["money_earn_p_corrected"]][11], models[["work_engaged_p_corrected"]][11]
))
```
Table 22
Working Adults - Balanced Panel Days Worked - Balanced Panel  Income from Work - Balanced Panel  Total Income - Balanced Panel Days Worked (Participant) - Balanced Panel Money Total (Participant) - Balanced Panel Working? (Participant) - Balanced Panel
Stable −0.081*** −0.412** −9.192* −18.940 −0.186*** −0.504 −0.028***
0.025 (−0.129, −0.033) 0.175 (−0.756, −0.069) 5.566 (−20.111, 1.726) 18.269 (−54.775, 16.895) 0.067 (−0.317, −0.055) 3.376 (−7.127, 6.118) 0.010 (−0.049, −0.008)
Predictable −0.053** −0.222 −1.441 21.513 −0.127* 0.557 −0.021*
0.025 (−0.103, −0.004) 0.179 (−0.574, 0.129) 5.948 (−13.107, 10.226) 20.183 (−18.077, 61.102) 0.071 (−0.266, 0.012) 3.744 (−6.787, 7.901) 0.011 (−0.042, 0.000)
Risky −0.036* −0.207 −6.294 −8.144 −0.116* −0.500 −0.015
0.021 (−0.078, 0.005) 0.145 (−0.493, 0.078) 4.507 (−15.135, 2.547) 16.207 (−39.934, 23.647) 0.061 (−0.236, 0.004) 2.371 (−5.150, 4.150) 0.009 (−0.033, 0.004)
Observations 9384 9384 9384 9384 9384 9384 9384
Note

The regressions below include baseline (period 0) data.

Code
```{r}
#| label: tbl-money-earned-baseline-included
#| tbl-cap: ""
makeTable(c(
    models[["working_adults_corrected"]][15], models[["days_worked_corrected"]][15], models[["money_work_corrected_99"]][15], models[["total_income_99"]][15],
    models[["days_worked_p_corrected"]][15], models[["money_earn_p_corrected"]][15], models[["work_engaged_p_corrected"]][15]
))
```
Table 23
 Working Adults - Baseline Included  Days Worked - Baseline Included  Income from Work - Baseline Included  Total Income - Baseline Included  Days Worked (Participant) - Baseline Included  Money Total (Participant) - Baseline Included  Working? (Participant) - Baseline Included
Stable −0.056*** −0.288** −6.673 −18.303 −0.149*** −0.384 −0.022***
0.018 (−0.092, −0.020) 0.130 (−0.543, −0.032) 4.147 (−14.806, 1.460) 12.886 (−43.571, 6.966) 0.050 (−0.247, −0.050) 2.500 (−5.287, 4.519) 0.008 (−0.037, −0.006)
Predictable −0.046** −0.171 −3.158 15.757 −0.095* −0.210 −0.017**
0.018 (−0.082, −0.011) 0.130 (−0.426, 0.085) 4.194 (−11.383, 5.068) 14.157 (−12.004, 43.519) 0.051 (−0.196, 0.006) 2.483 (−5.078, 4.658) 0.008 (−0.033, −0.002)
Risky −0.030* −0.163 −3.666 −7.817 −0.097** 0.030 −0.013*
0.015 (−0.060, 0.000) 0.106 (−0.371, 0.045) 3.321 (−10.178, 2.847) 11.250 (−29.878, 14.244) 0.045 (−0.184, −0.009) 1.755 (−3.413, 3.472) 0.007 (−0.026, 0.001)
Observations 14865 14865 14865 14865 14865 14865 14865
Note

The regressions below exclude endline (period 6) data.

Code
```{r}
#| label: tbl-money-earned-excluding-endline
#| tbl-cap: ""
makeTable(c(
    models[["working_adults_corrected"]][16], models[["days_worked_corrected"]][16], models[["money_work_corrected_99"]][16], models[["total_income_99"]][16],
    models[["days_worked_p_corrected"]][16], models[["money_earn_p_corrected"]][16], models[["work_engaged_p_corrected"]][16]
))
```
Table 24
Working Adults - Excluding Endline Days Worked - Excluding Endline  Income from Work - Excluding Endline  Total Income - Excluding Endline Days Worked (Participant) - Excluding Endline Money Total (Participant) - Excluding Endline Working? (Participant) - Excluding Endline
Stable −0.052*** −0.248* −8.342** −26.852* −0.127** −2.149 −0.022**
0.020 (−0.091, −0.014) 0.148 (−0.539, 0.043) 3.826 (−15.845, −0.839) 14.385 (−55.060, 1.357) 0.058 (−0.241, −0.014) 2.681 (−7.407, 3.109) 0.009 (−0.039, −0.004)
Predictable −0.032* −0.064 −4.172 14.592 −0.091 −1.467 −0.017*
0.020 (−0.071, 0.006) 0.148 (−0.355, 0.226) 3.982 (−11.981, 3.638) 16.174 (−17.124, 46.309) 0.059 (−0.206, 0.025) 2.943 (−7.237, 4.304) 0.009 (−0.035, 0.000)
Risky −0.028* −0.115 −5.875* −11.683 −0.087* −2.217 −0.014*
0.017 (−0.061, 0.005) 0.123 (−0.357, 0.126) 3.151 (−12.054, 0.303) 12.971 (−37.120, 13.754) 0.052 (−0.188, 0.014) 1.860 (−5.865, 1.431) 0.008 (−0.029, 0.002)
Observations 10345 10345 10345 10345 10345 10345 10345

1.4 Savings & Debt

1.4.1 Descriptive Graphs (mean)

Code
```{r}
#| label: fig-savings-debt
#| fig-cap: "Savings and Debt Over Time"
#| warning: false
savings_plot <- ggplot(df, aes(x = period, y = svg_current_savings_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Current Savings",
        x = "Period",
        y = "Cedis (win. 99%)"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

svg_savings_flow_plot <- ggplot(df, aes(x = period, y = svg_savings_flow_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Savings Flow",
        x = "Period",
        y = "Cedis (win. 99%)"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

debt_plot <- ggplot(df, aes(x = period, y = loan_total_outstanding_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Outstanding Loans",
        x = "Period",
        y = "Cedis"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

(savings_plot + svg_savings_flow_plot) / debt_plot + plot_layout(guides = "collect") & theme(legend.justification = c("right", "top"))
```
Figure 8: Savings and Debt Over Time

1.4.2 Period by Period Regression Coefficents

Code
```{r}
#| warning: false
#| message: false
savings_reg_gp <- df %>%
    generate_coeff_df("svg_current_savings_99") %>%
    effects_grapher("Current Savings (Cedis, win 99%)")

svg_savings_flow_reg_gp <- df %>%
    generate_coeff_df("svg_savings_flow_99") %>%
    effects_grapher("Savings Flow (Cedis, win 99%)")

debt_reg_gp <- df %>%
    generate_coeff_df("loan_total_outstanding_99") %>%
    effects_grapher("Outstanding Loans (Cedis)")

(savings_reg_gp + svg_savings_flow_reg_gp) / debt_reg_gp + plot_layout(guides = "collect", axes = "collect") + plot_annotation(title = "Treatment effect on savings and debt")
```

1.4.3 Savings & Debt Regressions

Code
```{r}
#| label: tbl-savings-debt-main
#| tbl-cap: ""
makeTable(c(
    models[["svg_current_savings_99"]][1], models[["svg_savings_flow_99"]][1], models[["loan_total_outstanding_99"]][1],
    models[["svg_current_savings_99"]][2], models[["svg_savings_flow_99"]][2], models[["loan_total_outstanding_99"]][2]
))
```
Table 25
Current Savings Savings Flow Loans taken Current Savings - Balanced Risky Savings Flow - Balanced Risky Loans taken - Balanced Risky
Stable −1.684 −11.077 21.058 −1.803 −11.593* 20.331
22.034 (−44.893, 41.526) 6.894 (−24.597, 2.443) 14.741 (−7.850, 49.966) 22.227 (−45.403, 41.798) 6.905 (−25.138, 1.952) 14.733 (−8.570, 49.231)
Predictable −10.814 −1.540 26.593* −11.137 −2.571 28.262*
21.836 (−53.635, 32.007) 7.111 (−15.486, 12.405) 16.103 (−4.984, 58.171) 21.802 (−53.904, 31.630) 7.155 (−16.607, 11.464) 16.018 (−3.159, 59.684)
Risky −2.896 −3.346 12.725
18.519 (−39.211, 33.419) 6.420 (−15.937, 9.245) 11.938 (−10.685, 36.134)
Risky (Balanced) −12.848 −12.989 4.040
25.228 (−62.334, 36.639) 9.042 (−30.727, 4.750) 18.328 (−31.911, 39.992)
Observations 12593 11139 12593 8065 7148 8065
Code
```{r}
#| label: tbl-savings-debt-risky-splits
#| tbl-cap: ""
makeTable(c(
    models[["svg_current_savings_99"]][3], models[["svg_savings_flow_99"]][3], models[["loan_total_outstanding_99"]][3]
))
```
Table 26
Current Savings - Split Risky Savings Flow - Split Risky Loans taken - Split Risky
Stable −2.837 −11.152 20.974
22.190 (−46.357, 40.683) 6.860 (−24.607, 2.304) 14.718 (−7.892, 49.840)
Predictable −11.463 −2.395 27.520*
21.830 (−54.278, 31.352) 7.087 (−16.296, 11.506) 16.044 (−3.946, 58.987)
Risky Medium −12.077 −12.182 4.200
25.150 (−61.403, 37.249) 9.035 (−29.903, 5.539) 18.272 (−31.637, 40.037)
Risky High −11.740 −9.259 7.767
25.028 (−60.828, 37.348) 8.544 (−26.016, 7.498) 17.484 (−26.524, 42.057)
Risky Low 13.554 −2.310 31.444
35.805 (−56.670, 83.778) 12.159 (−26.159, 21.540) 21.264 (−10.262, 73.149)
Observations 9830 8700 9830
Code
```{r}
#| label: tbl-savings-debt-income-interactions
#| tbl-cap: ""
makeTable(c(
    models[["svg_current_savings_99"]][4], models[["svg_savings_flow_99"]][4], models[["loan_total_outstanding_99"]][4],
    models[["svg_current_savings_99"]][5], models[["svg_savings_flow_99"]][5], models[["loan_total_outstanding_99"]][5],
    models[["svg_current_savings_99"]][6], models[["svg_savings_flow_99"]][6], models[["loan_total_outstanding_99"]][6]
))
```
Table 27
 Current Savings - Income  Savings Flow - Income  Loans taken - Income  Current Savings - Income + Arm  Savings Flow - Income + Arm  Loans taken - Income + Arm  Current Savings - Income X Arm  Savings Flow - Income X Arm  Loans taken - Income X Arm
Stable 3.387 −19.785** 19.183 2.243 21.011 −4.309
22.833 (−41.389, 48.164) 9.561 (−38.535, −1.034) 15.564 (−11.338, 49.704) 50.160 (−96.120, 100.606) 31.863 (−41.475, 83.496) 34.415 (−71.798, 63.179)
Predictable −5.825 −10.156 24.748 −20.268 −18.929 44.509**
22.609 (−50.161, 38.511) 9.899 (−29.568, 9.257) 17.166 (−8.915, 58.411) 23.820 (−66.978, 26.443) 17.186 (−52.633, 14.774) 20.398 (4.509, 84.510)
Risky 2.083 −11.894 10.883 7.330 −10.035 4.620
19.524 (−36.204, 40.371) 9.337 (−30.206, 6.417) 12.813 (−14.244, 36.009) 20.009 (−31.908, 46.568) 10.052 (−29.748, 9.678) 12.972 (−20.817, 30.058)
Study Income −0.049 0.049 0.064 −0.051 0.087 0.019 −0.105 0.068 0.083
0.068 (−0.182, 0.084) 0.051 (−0.051, 0.149) 0.051 (−0.036, 0.164) 0.063 (−0.175, 0.073) 0.067 (−0.045, 0.219) 0.054 (−0.087, 0.124) 0.078 (−0.258, 0.048) 0.075 (−0.079, 0.216) 0.060 (−0.035, 0.202)
Stable × Study Income 0.066 −0.389 0.173
0.478 (−0.871, 1.002) 0.326 (−1.028, 0.250) 0.339 (−0.493, 0.838)
Predictable × Study Income 0.203 0.109 −0.269**
0.130 (−0.052, 0.458) 0.171 (−0.227, 0.444) 0.134 (−0.531, −0.007)
Observations 12593 11139 12593 12593 11139 12593 12593 11139 12593
Note

For risky arms that did not complete dropoff, we impute a medium draw for the regressions below

Code
```{r}
#| label: tbl-savings-debt-draw
#| tbl-cap: ""
makeTable(c(
    models[["svg_current_savings_99"]][7], models[["svg_savings_flow_99"]][7], models[["loan_total_outstanding_99"]][7],
    models[["svg_current_savings_99"]][8], models[["svg_savings_flow_99"]][8], models[["loan_total_outstanding_99"]][8]
))
```
Table 28
 Current Savings - Imputed Draw  Savings Flow - Imputed Draw  Loans taken - Imputed Draw  Current Savings - Imputed Draw with Lag  Savings Flow - Imputed Draw with Lag  Loans taken - Imputed Draw with Lag
High Draw −20.305 −0.074 30.279* −46.133 −38.092 44.122**
21.449 (−62.367, 21.758) 8.937 (−17.600, 17.451) 15.590 (−0.293, 60.851) 28.178 (−101.391, 9.124) 4372350.503 (−8574599.221, 8574523.036) 19.191 (6.488, 81.755)
Medium Draw 4.773 −6.084 16.677 0.993 6.198 15.213
21.277 (−36.952, 46.498) 7.087 (−19.982, 7.814) 14.062 (−10.899, 44.253) 21.156 (−40.494, 42.480) 4372351.276 (−8574556.448, 8574568.843) 14.405 (−13.036, 43.462)
Low Draw −14.380 −13.198 31.757** −39.914 −51.332 44.656**
21.528 (−56.598, 27.837) 9.098 (−31.039, 4.643) 15.711 (0.947, 62.566) 28.050 (−94.921, 15.093) 4372350.423 (−8574612.304, 8574509.639) 19.379 (6.654, 82.658)
High Draw previous period 26.123 49.849 −10.812
19.915 (−12.930, 65.175) 4372349.756 (−8574509.816, 8574609.513) 15.070 (−40.364, 18.740)
Medium Draw previous period −19.380
4372350.989 (−8574581.462, 8574542.702)
Low Draw previous period 29.556 40.888 −27.170*
20.987 (−11.599, 70.712) 4372350.160 (−8574519.569, 8574601.345) 15.105 (−56.791, 2.452)
Observations 12593 11139 12593 12593 11139 12593
Note

Only treated participants that completed pickup are included in the regressions below.

Code
```{r}
#| label: tbl-savings-debt-imputed-draw
#| tbl-cap: ""
makeTable(c(
    models[["svg_current_savings_99"]][9], models[["svg_savings_flow_99"]][9], models[["loan_total_outstanding_99"]][9],
    models[["svg_current_savings_99"]][10], models[["svg_savings_flow_99"]][10], models[["loan_total_outstanding_99"]][10]
))
```
Table 29
Current Savings - Realized Draw Savings Flow - Realized Draw Loans taken - Realized Draw Current Savings - Realized Draw with Lag Savings Flow - Realized Draw with Lag Loans taken - Realized Draw with Lag
High Draw −14.669 3.665 25.582 0.022 12.833 −1.437
22.414 (−58.625, 29.286) 8.766 (−13.526, 20.857) 16.787 (−7.338, 58.501) 7589410.430 (−14883272.473, 14883272.518) 5474016.917 (−10735260.745, 10735286.411) 8600869.937 (−16866804.485, 16866801.611)
Medium Draw −0.724 −9.603 23.329 −1.335 −8.750 20.175
22.271 (−44.398, 42.951) 6.949 (−23.232, 4.026) 14.988 (−6.064, 52.722) 21.811 (−44.107, 41.437) 10.003 (−28.366, 10.866) 15.869 (−10.946, 51.295)
Low Draw −8.505 −8.627 27.589 8.162 −0.833 0.775
22.575 (−52.776, 35.765) 8.973 (−26.224, 8.970) 17.016 (−5.779, 60.958) 7589410.262 (−14883264.005, 14883280.329) 5474017.764 (−10735276.071, 10735274.405) 8600870.186 (−16866802.762, 16866804.312)
High Draw previous period −9.179 8.911 28.172
7589410.116 (−14883281.059, 14883262.700) 5474017.303 (−10735265.423, 10735283.246) 8600874.109 (−16866783.058, 16866839.401)
Low Draw previous period −8.241 −0.944 14.914
7589409.259 (−14883278.442, 14883261.960) 5474018.362 (−10735277.355, 10735275.468) 8600874.444 (−16866796.973, 16866826.801)
Observations 11968 10636 11968 10385 9149 10385
Note

Only participants who completed all surveys are included in the regressions below.

Code
```{r}
#| label: tbl-savings-debt-balanced-panel
#| tbl-cap: ""
makeTable(c(
    models[["svg_current_savings_99"]][11], models[["svg_savings_flow_99"]][11], models[["loan_total_outstanding_99"]][11]
))
```
Table 30
Current Savings - Balanced Panel Savings Flow - Balanced Panel Loans taken - Balanced Panel
Stable 4.075 −4.770 34.320*
27.360 (−49.591, 57.741) 6.558 (−17.634, 8.094) 17.779 (−0.554, 69.194)
Predictable −17.457 0.109 29.994
27.458 (−71.314, 36.401) 6.724 (−13.080, 13.298) 20.296 (−9.817, 69.804)
Risky −9.626 2.031 22.982
23.120 (−54.975, 35.723) 5.940 (−9.621, 13.683) 14.838 (−6.122, 52.087)
Observations 9384 8914 9384
Note

The regressions below include baseline (period 0) data.

Code
```{r}
#| label: tbl-savings-debt-baseline-included
#| tbl-cap: ""
makeTable(c(
    models[["svg_current_savings_99"]][15], models[["svg_savings_flow_99"]][15], models[["loan_total_outstanding_99"]][15]
))
```
Table 31
 Current Savings - Baseline Included  Savings Flow - Baseline Included  Loans taken - Baseline Included
Stable 0.240 −7.443 19.277
18.651 (−36.335, 36.816) 6.048 (−19.304, 4.417) 12.613 (−5.458, 44.012)
Predictable −9.581 −2.405 22.838*
18.616 (−46.087, 26.925) 6.321 (−14.800, 9.991) 13.600 (−3.831, 49.507)
Risky −1.317 −2.977 11.513
15.662 (−32.030, 29.395) 5.624 (−14.007, 8.052) 10.119 (−8.330, 31.356)
Observations 14865 13276 14865
Note

The regressions below exclude endline (period 6) data.

Code
```{r}
#| label: tbl-savings-debt-excluding-endline
#| tbl-cap: ""
makeTable(c(
    models[["svg_current_savings_99"]][16], models[["svg_savings_flow_99"]][16], models[["loan_total_outstanding_99"]][16]
))
```
Table 32
Current Savings - Excluding Endline Savings Flow - Excluding Endline Loans taken - Excluding Endline
Stable 3.871 −12.298 5.838
23.111 (−41.451, 49.192) 8.207 (−28.392, 3.796) 11.721 (−17.148, 28.823)
Predictable −8.944 −5.174 22.202
22.957 (−53.962, 36.075) 8.296 (−21.443, 11.095) 14.482 (−6.198, 50.601)
Risky −1.921 −7.348 9.262
19.240 (−39.651, 35.810) 7.463 (−21.982, 7.287) 9.996 (−10.341, 28.865)
Observations 10345 9169 10345

1.5 Assets and Cash Flow

Note

Assets sales / purchases include: livestock, durable goods, agricultural equipment and farmland

1.5.1 Descriptive Graphs (mean)

Code
```{r}
#| label: fig-assets
#| fig-cap: "Asset Transactions Over Time"
#| warning: false
asset_purchases_plot <- ggplot(df, aes(x = period, y = asset_purchases_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Asset Purchases",
        x = "Period",
        y = "GHC (win. 99%)"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

asset_sales_plot <- ggplot(df, aes(x = period, y = asset_sales_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Asset Sales",
        x = "Period",
        y = NULL
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

asset_net_plot <- ggplot(df, aes(x = period, y = asset_net_99, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Net Asset Transactions",
        x = "Period",
        y = "GHC (win. 99%)"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

(asset_purchases_plot + asset_sales_plot) / asset_net_plot + plot_layout(guides = "collect") & theme(legend.justification = c("right", "top"))
```
Figure 9: Asset Transactions Over Time

1.5.2 Period by Period Regression Coefficents

Code
```{r}
#| warning: false
#| message: false
asset_purchases_reg_gp <- df %>%
    generate_coeff_df("asset_purchases_99") %>%
    effects_grapher("Purchases (GHC win 99.%)")

asset_sales_reg_gp <- df %>%
    generate_coeff_df("asset_sales_99") %>%
    effects_grapher("Sales")

asset_net_reg_gp <- df %>%
    generate_coeff_df("asset_net_99") %>%
    effects_grapher("Net")

(asset_purchases_reg_gp + asset_sales_reg_gp) / asset_net_reg_gp + plot_layout(guides = "collect", axes = "collect") + plot_annotation(title = "Treatment effect on asset transactions")
```

1.5.3 Asset Transaction Regressions

Code
```{r}
#| label: tbl-assets-main
#| tbl-cap: ""
makeTable(c(
    models[["asset_purchases_99"]][1], models[["asset_sales_99"]][1], models[["asset_net_99"]][1],
    models[["asset_purchases_99"]][2], models[["asset_sales_99"]][2], models[["asset_net_99"]][2]
))
```
Table 33
Asset Purchases Asset Sales Asset Net Asset Purchases - Balanced Risky Asset Sales - Balanced Risky Asset Net - Balanced Risky
Stable −0.094 −1.132 1.167 −0.288 −0.901 0.880
4.664 (−9.240, 9.051) 1.970 (−4.994, 2.731) 4.863 (−8.369, 10.704) 4.699 (−9.506, 8.931) 1.983 (−4.790, 2.988) 4.899 (−8.731, 10.490)
Predictable 7.983* −1.008 9.139* 8.061* −0.841 9.016*
4.768 (−1.367, 17.332) 1.970 (−4.871, 2.856) 5.095 (−0.852, 19.130) 4.752 (−1.261, 17.384) 1.989 (−4.744, 3.062) 5.080 (−0.949, 18.981)
Risky 0.551 −1.808 2.395
3.727 (−6.758, 7.859) 1.648 (−5.041, 1.424) 3.983 (−5.417, 10.206)
Risky (Balanced) 0.151 −0.906 1.091
5.069 (−9.791, 10.094) 2.005 (−4.839, 3.027) 5.313 (−9.332, 11.514)
Observations 12593 12593 12593 8065 8065 8065
Code
```{r}
#| label: tbl-assets-risky-splits
#| tbl-cap: ""
makeTable(c(
    models[["asset_purchases_99"]][3], models[["asset_sales_99"]][3], models[["asset_net_99"]][3]
))
```
Table 34
Asset Purchases - Split Risky Asset Sales - Split Risky Asset Net - Split Risky
Stable −0.085 −1.066 1.168
4.692 (−9.287, 9.117) 1.973 (−4.935, 2.803) 4.881 (−8.406, 10.742)
Predictable 8.071* −0.890 9.174*
4.747 (−1.240, 17.381) 1.975 (−4.763, 2.984) 5.074 (−0.777, 19.125)
Risky Medium 0.552 −1.025 1.572
5.075 (−9.401, 10.506) 2.010 (−4.968, 2.917) 5.311 (−8.846, 11.989)
Risky High 1.789 −2.553 3.578
5.217 (−8.443, 12.020) 2.258 (−6.980, 1.875) 5.615 (−7.436, 14.591)
Risky Low −1.304 −5.500** 3.713
6.483 (−14.020, 11.412) 2.199 (−9.812, −1.188) 6.771 (−9.567, 16.993)
Observations 9830 9830 9830
Code
```{r}
#| label: tbl-assets-income-interactions
#| tbl-cap: ""
makeTable(c(
    models[["asset_purchases_99"]][4], models[["asset_sales_99"]][4], models[["asset_net_99"]][4],
    models[["asset_purchases_99"]][5], models[["asset_sales_99"]][5], models[["asset_net_99"]][5],
    models[["asset_purchases_99"]][6], models[["asset_sales_99"]][6], models[["asset_net_99"]][6]
))
```
Table 35
 Asset Purchases - Income  Asset Sales - Income  Asset Net - Income  Asset Purchases - Income + Arm  Asset Sales - Income + Arm  Asset Net - Income + Arm  Asset Purchases - Income X Arm  Asset Sales - Income X Arm  Asset Net - Income X Arm
Stable −1.304 −0.628 −0.682 −15.154 −0.204 −14.564
5.065 (−11.236, 8.628) 2.145 (−4.835, 3.579) 5.288 (−11.053, 9.689) 10.285 (−35.324, 5.016) 4.911 (−9.835, 9.426) 11.373 (−36.868, 7.739)
Predictable 6.791 −0.512 7.318 9.921 1.762 7.813
5.295 (−3.592, 17.173) 2.193 (−4.811, 3.788) 5.609 (−3.682, 18.318) 6.680 (−3.178, 23.020) 2.843 (−3.813, 7.337) 6.959 (−5.833, 21.458)
Risky −0.639 −1.314 0.578 −1.261 −2.148 0.909
4.208 (−8.890, 7.613) 1.852 (−4.946, 2.319) 4.485 (−8.217, 9.373) 4.378 (−9.847, 7.325) 1.907 (−5.889, 1.592) 4.668 (−8.245, 10.063)
Study Income 0.014 −0.008 0.024 0.012 −0.005 0.019 0.019 0.004 0.015
0.018 (−0.020, 0.049) 0.007 (−0.022, 0.007) 0.019 (−0.013, 0.060) 0.020 (−0.027, 0.052) 0.008 (−0.022, 0.011) 0.021 (−0.023, 0.060) 0.023 (−0.028, 0.065) 0.009 (−0.015, 0.022) 0.025 (−0.033, 0.064)
Stable × Study Income 0.133 −0.013 0.144
0.102 (−0.067, 0.334) 0.046 (−0.103, 0.078) 0.113 (−0.078, 0.365)
Predictable × Study Income −0.039 −0.032 −0.002
0.048 (−0.134, 0.056) 0.021 (−0.073, 0.009) 0.051 (−0.102, 0.098)
Observations 12593 12593 12593 12593 12593 12593 12593 12593 12593
Note

For risky arms that did not complete dropoff, we impute a medium draw for the regressions below

Code
```{r}
#| label: tbl-assets-draw
#| tbl-cap: ""
makeTable(c(
    models[["asset_purchases_99"]][7], models[["asset_sales_99"]][7], models[["asset_net_99"]][7],
    models[["asset_purchases_99"]][8], models[["asset_sales_99"]][8], models[["asset_net_99"]][8]
))
```
Table 36
 Asset Purchases - Imputed Draw  Asset Sales - Imputed Draw  Asset Net - Imputed Draw  Asset Purchases - Imputed Draw with Lag  Asset Sales - Imputed Draw with Lag  Asset Net - Imputed Draw with Lag
High Draw 5.252 −1.089 6.930 0.742 −4.141 5.065
4.687 (−3.940, 14.443) 1.955 (−4.922, 2.744) 5.012 (−2.898, 16.759) 7.617 (−14.195, 15.679) 2.595 (−9.229, 0.948) 8.026 (−10.673, 20.803)
Medium Draw 2.249 −1.266 3.518 3.193 −1.257 4.498
4.491 (−6.557, 11.055) 1.902 (−4.997, 2.465) 4.714 (−5.726, 12.763) 4.484 (−5.600, 11.986) 1.955 (−5.090, 2.577) 4.717 (−4.752, 13.749)
Low Draw 5.921 −0.658 6.550 1.371 −3.602 4.570
4.859 (−3.608, 15.451) 2.048 (−4.673, 3.358) 5.172 (−3.593, 16.693) 7.691 (−13.711, 16.452) 2.644 (−8.787, 1.582) 8.118 (−11.349, 20.490)
High Draw previous period 7.418 2.956 4.714
7.552 (−7.392, 22.228) 2.410 (−1.770, 7.682) 7.891 (−10.759, 20.188)
Low Draw previous period 6.438 4.714* 2.590
7.479 (−8.229, 21.105) 2.482 (−0.153, 9.581) 7.867 (−12.837, 18.018)
Observations 12593 12593 12593 12593 12593 12593
Note

Only treated participants that completed pickup are included in the regressions below.

Code
```{r}
#| label: tbl-assets-imputed-draw
#| tbl-cap: ""
makeTable(c(
    models[["asset_purchases_99"]][9], models[["asset_sales_99"]][9], models[["asset_net_99"]][9],
    models[["asset_purchases_99"]][10], models[["asset_sales_99"]][10], models[["asset_net_99"]][10]
))
```
Table 37
Asset Purchases - Realized Draw Asset Sales - Realized Draw Asset Net - Realized Draw Asset Purchases - Realized Draw with Lag Asset Sales - Realized Draw with Lag Asset Net - Realized Draw with Lag
High Draw 8.548* −1.490 10.159* 7.632 0.005 8.288
4.962 (−1.183, 18.279) 2.035 (−5.482, 2.501) 5.328 (−0.290, 20.608) 2135756.700 (−4188334.698, 4188349.961) 929493.858 (−1822791.172, 1822791.181) 2253433.704 (−4419105.447, 4419122.023)
Medium Draw 0.139 −0.981 1.209 1.615 −1.875 3.534
4.736 (−9.149, 9.427) 1.996 (−4.894, 2.932) 4.932 (−8.462, 10.880) 4.835 (−7.866, 11.097) 2.177 (−6.144, 2.394) 5.074 (−6.416, 13.484)
Low Draw 9.448* −0.940 9.998* 6.029 0.838 5.542
5.182 (−0.715, 19.611) 2.126 (−5.110, 3.230) 5.519 (−0.825, 20.822) 2135756.655 (−4188336.211, 4188348.268) 929493.928 (−1822790.477, 1822792.153) 2253433.583 (−4419107.954, 4419119.039)
High Draw previous period 6.130 −1.993 7.295
2135756.558 (−4188335.920, 4188348.181) 929493.725 (−1822792.909, 1822788.923) 2253433.601 (−4419106.237, 4419120.827)
Low Draw previous period 4.756 −0.148 4.505
2135756.884 (−4188337.933, 4188347.444) 929493.682 (−1822790.980, 1822790.683) 2253433.863 (−4419109.542, 4419118.552)
Observations 11968 11968 11968 10385 10385 10385
Note

Only participants who completed all surveys are included in the regressions below.

Code
```{r}
#| label: tbl-assets-balanced-panel
#| tbl-cap: ""
makeTable(c(
    models[["asset_purchases_99"]][11], models[["asset_sales_99"]][11], models[["asset_net_99"]][11]
))
```
Table 38
Asset Purchases - Balanced Panel Asset Sales - Balanced Panel Asset Net - Balanced Panel
Stable 2.768 −0.262 3.392
5.557 (−8.130, 13.667) 2.478 (−5.122, 4.599) 5.812 (−8.007, 14.792)
Predictable 13.822** −1.793 16.013***
5.738 (2.567, 25.077) 2.395 (−6.491, 2.905) 6.196 (3.860, 28.167)
Risky 3.779 −1.962 5.807
4.447 (−4.944, 12.502) 2.098 (−6.077, 2.153) 4.823 (−3.653, 15.268)
Observations 9384 9384 9384
Note

The regressions below include baseline (period 0) data.

Code
```{r}
#| label: tbl-assets-baseline-included
#| tbl-cap: ""
makeTable(c(
    models[["asset_purchases_99"]][15], models[["asset_sales_99"]][15], models[["asset_net_99"]][15]
))
```
Table 39
 Asset Purchases - Baseline Included  Asset Sales - Baseline Included  Asset Net - Baseline Included
Stable −0.420 −1.038 0.769
3.997 (−8.257, 7.418) 1.699 (−4.370, 2.293) 4.142 (−7.354, 8.892)
Predictable 6.048 −0.954 7.117*
4.070 (−1.934, 14.030) 1.692 (−4.273, 2.365) 4.306 (−1.327, 15.561)
Risky 0.076 −1.742 1.826
3.185 (−6.170, 6.322) 1.420 (−4.527, 1.044) 3.367 (−4.776, 8.429)
Observations 14865 14865 14865
Note

The regressions below exclude endline (period 6) data.

Code
```{r}
#| label: tbl-assets-excluding-endline
#| tbl-cap: ""
makeTable(c(
    models[["asset_purchases_99"]][16], models[["asset_sales_99"]][16], models[["asset_net_99"]][16]
))
```
Table 40
Asset Purchases - Excluding Endline Asset Sales - Excluding Endline Asset Net - Excluding Endline
Stable 1.947 0.240 1.796
4.038 (−5.972, 9.866) 1.739 (−3.171, 3.650) 4.332 (−6.700, 10.292)
Predictable 8.809** −1.062 9.948**
4.254 (0.468, 17.151) 1.627 (−4.252, 2.129) 4.594 (0.940, 18.956)
Risky −0.451 −0.731 0.338
3.047 (−6.426, 5.523) 1.470 (−3.613, 2.152) 3.314 (−6.161, 6.837)
Observations 10345 10345 10345

1.6 Food Insecurity

Note

HDDS Z is a z-score of the FAO Household Dietary Diversity Score (HDDS). Higher score is better. The measure is a simple sum of the number of different food groups consumed in a given period.

Food Insecurity index is an Anderson index constructed from food insecurity questions. These questions are likert-scale questions about food insecurity experiences in the past period. A higher score indicates greater food insecurity.

1.6.1 Descriptive Graphs (mean)

Code
```{r}
#| label: fig-food-insecurity
#| fig-cap: "Food Insecurity Over Time"
#| warning: false
hdds_plot <- ggplot(df, aes(x = period, y = dd_hdds_z, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "HDDS Z-Score",
        x = "Period",
        y = "HDDS Z-score"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

fi_plot <- ggplot(df, aes(x = period, y = fi_index_anderson, color = treatment, group = treatment)) +
    geom_line(stat = "summary", fun = "mean") +
    labs(
        title = "Food Insecurity Index",
        x = "Period",
        y = "FI Index"
    ) +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Control", "Stable", "Predictable", "Risky")
    ) +
    theme_minimal()

(hdds_plot / fi_plot) + plot_layout(guides = "collect") & theme(legend.justification = c("right", "top"))
```
Figure 10: Food Insecurity Over Time

1.6.2 Period by Period Regression Coefficents

Code
```{r}
#| warning: false
#| message: false
hdds_reg_gp <- df %>%
    generate_coeff_df("dd_hdds_z") %>%
    effects_grapher("HDDS Z-Score")

fi_reg_gp <- df %>%
    generate_coeff_df("fi_index_anderson") %>%
    effects_grapher("FI Index")

(hdds_reg_gp / fi_reg_gp) + plot_layout(guides = "collect", axes = "collect") + plot_annotation(title = "Treatment effect on food insecurity")
```

1.6.3 Food Insecurity Regressions

Code
```{r}
#| label: tbl-food-insecurity-main
#| tbl-cap: ""
makeTable(c(
    models[["dd_hdds_z"]][1], models[["fi_index_anderson"]][1],
    models[["dd_hdds_z"]][2], models[["fi_index_anderson"]][2]
))
```
Table 41
HDDS Z-Score  FI Index HDDS Z-Score - Balanced Risky  FI Index - Balanced Risky
Stable −0.005 −0.063* −0.005 −0.064*
0.034 (−0.071, 0.062) 0.037 (−0.135, 0.009) 0.034 (−0.071, 0.061) 0.037 (−0.137, 0.009)
Predictable 0.055 −0.022 0.054 −0.020
0.034 (−0.013, 0.123) 0.038 (−0.096, 0.053) 0.034 (−0.014, 0.121) 0.038 (−0.095, 0.055)
Risky 0.029 −0.007
0.028 (−0.026, 0.085) 0.031 (−0.068, 0.053)
Risky (Balanced) 0.027 0.009
0.038 (−0.047, 0.101) 0.042 (−0.073, 0.091)
Observations 12593 12593 8065 8065
Code
```{r}
#| label: tbl-food-insecurity-risky-splits
#| tbl-cap: ""
makeTable(c(
    models[["dd_hdds_z"]][3], models[["fi_index_anderson"]][3]
))
```
Table 42
HDDS Z-Score - Split Risky  FI Index - Split Risky
Stable −0.005 −0.064*
0.034 (−0.071, 0.061) 0.037 (−0.136, 0.009)
Predictable 0.056 −0.018
0.034 (−0.012, 0.124) 0.038 (−0.093, 0.056)
Risky Medium 0.028 0.010
0.038 (−0.046, 0.102) 0.042 (−0.072, 0.092)
Risky High −0.027 0.032
0.040 (−0.107, 0.052) 0.048 (−0.062, 0.127)
Risky Low 0.046 −0.027
0.045 (−0.043, 0.135) 0.053 (−0.131, 0.077)
Observations 9830 9830
Code
```{r}
#| label: tbl-food-insecurity-income-interactions
#| tbl-cap: ""
makeTable(c(
    models[["dd_hdds_z"]][4], models[["fi_index_anderson"]][4],
    models[["dd_hdds_z"]][5], models[["fi_index_anderson"]][5],
    models[["dd_hdds_z"]][6], models[["fi_index_anderson"]][6]
))
```
Table 43
 HDDS Z-Score - Income  FI Index - Income  HDDS Z-Score - Income + Arm  FI Index - Income + Arm  HDDS Z-Score - Income X Arm  FI Index - Income X Arm
Stable 0.011 −0.061 0.032 0.140
0.035 (−0.059, 0.080) 0.039 (−0.138, 0.016) 0.081 (−0.126, 0.191) 0.100 (−0.057, 0.336)
Predictable 0.070* −0.020 0.031 −0.031
0.036 (−0.000, 0.141) 0.040 (−0.099, 0.059) 0.039 (−0.046, 0.108) 0.044 (−0.116, 0.055)
Risky 0.045 −0.006 0.058* −0.009
0.030 (−0.015, 0.104) 0.033 (−0.071, 0.059) 0.031 (−0.003, 0.119) 0.034 (−0.076, 0.058)
Study Income −0.000 −0.000 −0.000 −0.000 −0.000** 0.000
0.000 (−0.000, 0.000) 0.000 (−0.000, 0.000) 0.000 (−0.000, 0.000) 0.000 (−0.000, 0.000) 0.000 (−0.001, −0.000) 0.000 (−0.000, 0.000)
Stable × Study Income −0.000 −0.002**
0.001 (−0.002, 0.001) 0.001 (−0.004, −0.000)
Predictable × Study Income 0.001** 0.000
0.000 (0.000, 0.001) 0.000 (−0.000, 0.001)
Observations 12593 12593 12593 12593 12593 12593
Note

For risky arms that did not complete dropoff, we impute a medium draw for the regressions below

Code
```{r}
#| label: tbl-food-insecurity-draw
#| tbl-cap: ""
makeTable(c(
    models[["dd_hdds_z"]][7], models[["fi_index_anderson"]][7],
    models[["dd_hdds_z"]][8], models[["fi_index_anderson"]][8]
))
```
Table 44
 HDDS Z-Score - Imputed Draw  FI Index - Imputed Draw  HDDS Z-Score - Imputed Draw with Lag  FI Index - Imputed Draw with Lag
High Draw 0.033 −0.031 0.019 −0.020
0.034 (−0.034, 0.100) 0.038 (−0.105, 0.043) 0.042 (−0.064, 0.101) 0.049 (−0.115, 0.076)
Medium Draw 0.012 −0.042 0.016 −0.027
0.033 (−0.051, 0.076) 0.036 (−0.111, 0.028) 0.033 (−0.048, 0.081) 0.036 (−0.098, 0.043)
Low Draw 0.042 −0.055 0.029 −0.044
0.034 (−0.024, 0.109) 0.038 (−0.129, 0.019) 0.042 (−0.053, 0.111) 0.049 (−0.141, 0.053)
High Draw previous period 0.010 0.005
0.033 (−0.056, 0.075) 0.039 (−0.071, 0.081)
Low Draw previous period 0.035 0.003
0.033 (−0.030, 0.101) 0.038 (−0.072, 0.079)
Observations 12593 12593 12593 12593
Note

Only treated participants that completed pickup are included in the regressions below.

Code
```{r}
#| label: tbl-food-insecurity-imputed-draw
#| tbl-cap: ""
makeTable(c(
    models[["dd_hdds_z"]][9], models[["fi_index_anderson"]][9],
    models[["dd_hdds_z"]][10], models[["fi_index_anderson"]][10]
))
```
Table 45
HDDS Z-Score - Realized Draw  FI Index - Realized Draw HDDS Z-Score - Realized Draw with Lag  FI Index - Realized Draw with Lag
High Draw 0.049 −0.011 −0.083 −0.097
0.036 (−0.021, 0.120) 0.040 (−0.090, 0.067) 13195.116 (−25876.469, 25876.303) 16888.605 (−33119.628, 33119.434)
Medium Draw −0.006 −0.072* −0.005 −0.063*
0.034 (−0.073, 0.061) 0.037 (−0.145, 0.000) 0.035 (−0.073, 0.063) 0.038 (−0.137, 0.012)
Low Draw 0.057 −0.040 −0.067 −0.113
0.036 (−0.013, 0.127) 0.040 (−0.119, 0.038) 13195.116 (−25876.453, 25876.319) 16888.604 (−33119.642, 33119.416)
High Draw previous period 0.125 0.088
13195.119 (−25876.266, 25876.515) 16888.606 (−33119.445, 33119.621)
Low Draw previous period 0.150 0.086
13195.119 (−25876.242, 25876.541) 16888.606 (−33119.447, 33119.619)
Observations 11968 11968 10385 10385
Note

Only participants who completed all surveys are included in the regressions below.

Code
```{r}
#| label: tbl-food-insecurity-balanced-panel
#| tbl-cap: ""
makeTable(c(
    models[["dd_hdds_z"]][11], models[["fi_index_anderson"]][11]
))
```
Table 46
HDDS Z-Score - Balanced Panel  FI Index - Balanced Panel
Stable −0.005 −0.062
0.040 (−0.084, 0.074) 0.045 (−0.149, 0.026)
Predictable 0.041 −0.040
0.041 (−0.039, 0.122) 0.047 (−0.131, 0.052)
Risky 0.042 −0.008
0.034 (−0.025, 0.110) 0.039 (−0.084, 0.068)
Observations 9384 9384
Note

The regressions below include baseline (period 0) data.

Code
```{r}
#| label: tbl-food-insecurity-baseline-included
#| tbl-cap: ""
makeTable(c(
    models[["dd_hdds_z"]][15], models[["fi_index_anderson"]][15]
))
```
Table 47
 HDDS Z-Score - Baseline Included  FI Index - Baseline Included
Stable 0.003 −0.055*
0.029 (−0.055, 0.060) 0.032 (−0.117, 0.007)
Predictable 0.050* −0.020
0.030 (−0.008, 0.109) 0.033 (−0.084, 0.045)
Risky 0.028 −0.006
0.025 (−0.020, 0.076) 0.026 (−0.058, 0.045)
Observations 14865 14865
Note

The regressions below exclude endline (period 6) data.

Code
```{r}
#| label: tbl-food-insecurity-excluding-endline
#| tbl-cap: ""
makeTable(c(
    models[["dd_hdds_z"]][16], models[["fi_index_anderson"]][16]
))
```
Table 48
HDDS Z-Score - Excluding Endline  FI Index - Excluding Endline
Stable −0.002 −0.036
0.035 (−0.072, 0.067) 0.039 (−0.112, 0.041)
Predictable 0.067* −0.000
0.036 (−0.003, 0.136) 0.040 (−0.079, 0.078)
Risky 0.031 0.004
0.030 (−0.028, 0.089) 0.033 (−0.061, 0.069)
Observations 10345 10345

2 Visual Results

Code
```{r}
#| output: false
#| warning: false
#| message: false
model_to_coef_treatment <- function(var) {
    varName <- ifelse(var == "phq2_z" | var == "gad2_z", var, paste0(var, "_z"))
    coeff_df <- z_models[[varName]][[1]] %>%
        tidy(, conf.int = T) %>%
        filter(str_detect(term, "treatment")) %>%
        mutate(
            treatment = case_when(
                term == "treatment::1" ~ "Stable",
                term == "treatment::2" ~ "Predictable",
                term == "treatment::3" ~ "Risky",
            ),
            variable = variableLabels[[var]],
            # Compute average estimate for sorting
            avg_estimate = mean(estimate)
        ) %>%
        select(!c(term))
    coeff_df
}



model_to_coef_treatment_split <- function(var) {
    varName <- ifelse(var == "phq2_z" | var == "gad2_z", var, paste0(var, "_z"))
    coeff_df <- z_models[[varName]][[3]] %>%
        tidy(, conf.int = T) %>%
        filter(str_detect(term, "treatment_split")) %>%
        mutate(
            treatment = case_when(
                term == "treatment_split::1" ~ "Stable",
                term == "treatment_split::2" ~ "Predictable",
                term == "treatment_split::3" ~ "Risky Medium",
                term == "treatment_split::4" ~ "Risky High",
                term == "treatment_split::5" ~ "Risky Low"
            ),
            variable = variableLabels[[var]],
            # Compute average estimate for sorting
            avg_estimate = mean(estimate)
        ) %>%
        select(!c(term))
    coeff_df
}

model_to_coef_draw <- function(var) {
    varName <- ifelse(var == "phq2_z" | var == "gad2_z", var, paste0(var, "_z"))
    coeff_df <- z_models[[varName]][[9]] %>%
        tidy(, conf.int = T) %>%
        filter(str_detect(term, "draw_realized")) %>%
        mutate(
            draw = case_when(
                term == "draw_realized::H" ~ "High",
                term == "draw_realized::M" ~ "Medium",
                term == "draw_realized::L" ~ "Low",
                .default = term
            ),
            variable = variableLabels[[var]],
            # Compute average estimate for sorting
            avg_estimate = mean(estimate)
        ) %>%
        select(!c(term))
    coeff_df
}
```
Code
```{r, fig.height=9, fig.width = 7}
treatment_results <- map(variables, model_to_coef_treatment) %>%
    bind_rows() %>%
    mutate(variable = fct_reorder(variable, avg_estimate)) %>%
    # sort by avg_estimate
    arrange(avg_estimate)

ggplot(treatment_results, aes(y = treatment, x = estimate, group = treatment, color = treatment)) +
    geom_pointrange(aes(xmin = conf.low, xmax = conf.high)) +
    facet_grid(variable ~ ., scales = "free_y", space = "free_y", switch = "y") +
    geom_vline(xintercept = 0, color = "grey") +
    ylab(NULL) +
    xlab("Estimated Effect (SD)") +
    theme(
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank(),
        strip.placement = "outside",
        strip.background = element_blank(),
        strip.text.y.left = element_text(angle = 0, hjust = 0)
    )
```

Note

The coefficents below only include people who completed all 6 surveys

Code
```{r, fig.height=9, fig.width = 7}
model_to_coef_balanced <- function(var) {
    varName <- ifelse(var == "phq2_z" | var == "gad2_z", var, paste0(var, "_z"))
    coeff_df <- z_models[[varName]][[11]] %>%
        tidy(, conf.int = T) %>%
        filter(str_detect(term, "treatment")) %>%
        mutate(
            treatment = case_when(
                term == "treatment::1" ~ "Stable",
                term == "treatment::2" ~ "Predictable",
                term == "treatment::3" ~ "Risky",
            ),
            variable = variableLabels[[var]],
            # Compute average estimate for sorting
            avg_estimate = mean(estimate)
        ) %>%
        select(!c(term))
    coeff_df
}

treatment_balanced <- map(variables, model_to_coef_balanced) %>%
    bind_rows() %>%
    mutate(variable = fct_reorder(variable, avg_estimate)) %>%
    # sort by avg_estimate
    arrange(avg_estimate)

ggplot(treatment_balanced, aes(y = treatment, x = estimate, group = treatment, color = treatment)) +
    geom_pointrange(aes(xmin = conf.low, xmax = conf.high)) +
    facet_grid(variable ~ ., scales = "free_y", space = "free_y", switch = "y") +
    geom_vline(xintercept = 0, color = "grey") +
    ylab(NULL) +
    xlab("Estimated Effect (SD)") +
    theme(
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank(),
        strip.placement = "outside",
        strip.background = element_blank(),
        strip.text.y.left = element_text(angle = 0, hjust = 0)
    )
```

Code
```{r, fig.height=12, fig.width = 7}
treatment_results_split <- map(variables, model_to_coef_treatment_split) %>%
    bind_rows() %>%
    mutate(
        variable = fct_reorder(variable, avg_estimate),
        # Reorder treatment so 1 - Stable 2 - Predictable 3 - Risky low 4 - Risky Medium 5 - Risky High
        treatment = fct_reorder(
            treatment,
            case_when(
                treatment == "Stable" ~ 1,
                treatment == "Predictable" ~ 2,
                treatment == "Risky Low" ~ 3,
                treatment == "Risky Medium" ~ 4,
                treatment == "Risky High" ~ 5,
                TRUE ~ NA_real_
            )
        )
    ) %>%
    # sort by avg_estimate
    arrange(avg_estimate)

ggplot(treatment_results_split, aes(y = treatment, x = estimate, group = treatment, color = treatment)) +
    geom_pointrange(aes(xmin = conf.low, xmax = conf.high)) +
    facet_grid(variable ~ ., scales = "free_y", space = "free_y", switch = "y") +
    geom_vline(xintercept = 0, color = "grey") +
    ylab(NULL) +
    xlab("Estimated Effect (SD)") +
    theme(
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank(),
        strip.placement = "outside",
        strip.background = element_blank(),
        strip.text.y.left = element_text(angle = 0, hjust = 0)
    )
```

Code
```{r, fig.height=9, fig.width = 7}
treatment_results_draw <- map(variables, model_to_coef_draw) %>%
    bind_rows() %>%
    mutate(
        variable = fct_reorder(variable, avg_estimate),
        draw = fct_reorder(
            draw,
            case_when(
                draw == "Low" ~ 1,
                draw == "Medium" ~ 2,
                draw == "High" ~ 3,
                TRUE ~ NA_real_
            )
        )
    ) %>%
    # sort by avg_estimate
    arrange(avg_estimate)

ggplot(treatment_results_draw, aes(y = draw, x = estimate, group = draw, color = draw)) +
    geom_pointrange(aes(xmin = conf.low, xmax = conf.high)) +
    facet_grid(variable ~ ., scales = "free_y", space = "free_y", switch = "y") +
    geom_vline(xintercept = 0, color = "grey") +
    ylab(NULL) +
    xlab("Estimated Effect (SD)") +
    theme(
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank(),
        strip.placement = "outside",
        strip.background = element_blank(),
        strip.text.y.left = element_text(angle = 0, hjust = 0)
    )
```

Note

The following results only include data from the endline and thus do not have period fixed effects. They are othwerwise identical to the main treatment results.

Code
```{r, fig.height=9, fig.width = 7}
model_to_coef_endline <- function(var) {
    varName <- ifelse(var == "phq2_z" | var == "gad2_z", var, paste0(var, "_z"))
    coeff_df <- z_models[[varName]][[12]] %>%
        tidy(conf.int = T) %>%
        filter(str_detect(term, "treatment")) %>%
        mutate(
            treatment = case_when(
                term == "treatment::1" ~ "Stable",
                term == "treatment::2" ~ "Predictable",
                term == "treatment::3" ~ "Risky",
            ),
            variable = variableLabels[[var]],
            # Compute average estimate for sorting
            avg_estimate = mean(estimate)
        ) %>%
        select(!c(term))
    coeff_df
}

treatment_results_endline <- map(variables, model_to_coef_endline) %>%
    bind_rows() %>%
    mutate(
        variable = fct_reorder(variable, avg_estimate),
        # Reorder treatment so 1 - Stable 2 - Predictable 3 - Risky low 4 - Risky Medium 5 - Risky High
        treatment = fct_reorder(
            treatment,
            case_when(
                treatment == "Stable" ~ 1,
                treatment == "Preidctable" ~ 2,
                treatment == "Risky" ~ 3,
                .default = 4
            )
        )
    ) %>%
    # sort by avg_estimate
    arrange(avg_estimate)

ggplot(treatment_results_endline, aes(y = treatment, x = estimate, group = treatment, color = treatment)) +
    geom_pointrange(aes(xmin = conf.low, xmax = conf.high)) +
    facet_grid(variable ~ ., scales = "free_y", space = "free_y", switch = "y") +
    geom_vline(xintercept = 0, color = "grey") +
    ylab(NULL) +
    xlab("Estimated Effect (SD)") +
    theme(
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank(),
        strip.placement = "outside",
        strip.background = element_blank(),
        strip.text.y.left = element_text(angle = 0, hjust = 0)
    )
```

Code
```{r, fig.height=9, fig.width = 7}
model_to_coef_tvc <- function(var) {
    varName <- ifelse(var == "phq2_z" | var == "gad2_z", var, paste0(var, "_z"))
    coeff_df <- z_models[[varName]][[13]] %>%
        tidy(, conf.int = T) %>%
        filter(str_detect(term, "treated")) %>%
        mutate(
            variable = variableLabels[var],
            type = "All Periods"
        ) %>%
        select(!c(term))
    endline_df <- z_models[[varName]][[14]] %>%
        tidy(, conf.int = T) %>%
        filter(str_detect(term, "treated")) %>%
        mutate(
            variable = variableLabels[var],
            type = "Endline Only"
        ) %>%
        select(!c(term))
    # Append endline_df and coeff_df
    coeff_df <- bind_rows(coeff_df, endline_df) %>%
        mutate(
            # Set the sort to be based type == All Periods coefficients
            sort_estimate = max(ifelse(type == "All Periods", estimate, NA_real_), na.rm = T)
        )

    coeff_df
}


control_coefs <- map(variables, model_to_coef_tvc) %>%
    bind_rows() %>%
    mutate(variable = fct_reorder(variable, sort_estimate))

ggplot(control_coefs, aes(x = variable, y = estimate, group = type, color = type)) +
    geom_pointrange(aes(ymin = conf.low, ymax = conf.high), position = position_dodge(width = 0.5)) +
    geom_hline(yintercept = 0, color = "grey") +
    coord_flip() +
    xlab(NULL) +
    ylab("Estimated Treatment Effect (SD)")
```

3 Appendix

3.1 Log Food Consumption and Expenditure

Code
```{r}
#| label: tbl-log-consumption-expenditure
#| tbl-cap: "Treatment Effects on Log Food Consumption and Non-Food Expenditure (Excluding Endline)"
#| warning: false
#| message: false

# Create log versions of food consumption and non-food expenditure
df <- df %>%
    mutate(
        log_food_consumption_total_99 = log(food_consumption_total_99 + 1),
        log_expenditure_total_nonfood_99 = log(expenditure_total_nonfood_99 + 1),
        log_food_consumption_total_99_bl = log(food_consumption_total_99_bl + 1),
        log_expenditure_total_nonfood_99_bl = log(expenditure_total_nonfood_99_bl + 1)
    )

# Run regressions for log food consumption
log_food_consumption_reg <- feols(
    log_food_consumption_total_99 ~ log_food_consumption_total_99_bl + hh_size + census_wealth_index + i(treatment) | district_id + period + wave + enum_id + day_of_week + cohort,
    cluster = "hh_id",
    data = df %>% filter(period > 0 & period < 6)
)

# Run regressions for log non-food expenditure
log_nonfood_expenditure_reg <- feols(
    log_expenditure_total_nonfood_99 ~ log_expenditure_total_nonfood_99_bl + hh_size + census_wealth_index + i(treatment) | district_id + period + wave + enum_id + day_of_week + cohort,
    cluster = "hh_id",
    data = df %>% filter(period > 0 & period < 6)
)

modelsummary(
    list(
        "Log Food Consumption" = log_food_consumption_reg,
        "Log Non-Food Expenditure" = log_nonfood_expenditure_reg
    ),
    title = "Treatment Effects (Excluding Endline)",
    escape = FALSE,
    output = "kableExtra",
    estimate = "{estimate}{stars}",
    statistic = "{std.error} ({conf.low}, {conf.high})",
    coef_omit = NULL,
    coef_omit_sources = FALSE,
    stars = c(`***` = 0.01, `**` = 0.05, `*` = 0.1),
    gof_map = tribble(
        ~raw, ~clean, ~fmt,
        "nobs", "Observations", 0,
        "FE", "Fixed Effects", 1,
    ),
    coef_rename = c(
        "log_food_consumption_total_99_bl" = "Baseline (log)",
        "log_expenditure_total_nonfood_99_bl" = "Baseline (log)",
        "hh_size" = "Household Size",
        "census_wealth_index" = "Wealth Index",
        "treatment::1" = "Stable",
        "treatment::2" = "Predictable",
        "treatment::3" = "Risky"
    )
) %>%
    kable_classic(full_width = F, html_font = "Cambria", fixed_thead = T)
```
Table 49: Treatment Effects on Log Food Consumption and Non-Food Expenditure (Excluding Endline)
Treatment Effects (Excluding Endline)
Log Food Consumption Log Non-Food Expenditure
Baseline (log) 0.201*** 0.080***
0.013 (0.175, 0.227) 0.011 (0.058, 0.102)
Household Size 0.020*** 0.022***
0.003 (0.015, 0.026) 0.006 (0.011, 0.033)
Wealth Index 0.038*** 0.036
0.012 (0.013, 0.062) 0.026 (−0.014, 0.087)
Stable 0.048* 0.087*
0.026 (−0.003, 0.098) 0.051 (−0.013, 0.186)
Predictable 0.088*** 0.069
0.025 (0.039, 0.138) 0.053 (−0.035, 0.173)
Risky 0.063*** 0.032
0.021 (0.021, 0.105) 0.043 (−0.052, 0.116)
Observations 10345 10309

3.2 Instrumented Income

Note

See Income and Days Worked Section for descriptives and details of the income variable

3.2.1 Income Effects on Consumption

Code
```{r}
#| label: model-consumption-instrumented-income
#| warning: false
#| message: false

## Copied from main regressions; adjuts if chagned
# Define common fixed effects specification

income <- feols(total_consumption_99 ~ total_consumption_99_bl + hh_size + census_wealth_index + total_income_99 * i(treatment, ref = 0) | community_id + period,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)

study_income <- feols(total_consumption_99 ~ total_consumption_99_bl + hh_size + census_wealth_index + study_income * i(treatment, ref = 0) | community_id + period,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)

work_income <- feols(total_consumption_99 ~ total_consumption_99_bl + hh_size + census_wealth_index + money_work_corrected_99 * i(treatment, ref = 0) | community_id + period,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)

work_income_p <- feols(total_consumption_99 ~ total_consumption_99_bl + hh_size + census_wealth_index + money_earn_p_corrected * i(treatment, ref = 0) | community_id + period,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)

# Instrument Participant Income
instrumented_work_income_p <- feols(total_consumption_99 ~ total_consumption_99_bl + hh_size + census_wealth_index + i(treatment, ref = 0) | community_id + period | money_earn_p_corrected:i(treatment, ref = 0) + money_earn_p_corrected ~ study_income:i(treatment, ref = 0) + study_income,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)
# Instrument work Income
instrumented_work_income <- feols(total_consumption_99 ~ total_consumption_99_bl + hh_size + census_wealth_index + i(treatment, ref = 0) | community_id + period | money_work_corrected_99:i(treatment, ref = 0) + money_work_corrected_99 ~ study_income:i(treatment, ref = 0) + study_income,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)
# Instrument Total Income
instrumented_income <- feols(total_consumption_99 ~ total_consumption_99_bl + hh_size + census_wealth_index + i(treatment, ref = 0) | community_id + period | total_income_99:i(treatment, ref = 0) + total_income_99 ~ study_income:i(treatment, ref = 0) + study_income,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)


income_hh_fe <- feols(total_consumption_99 ~ total_consumption_99_bl + hh_size + census_wealth_index + total_income_99 * i(treatment, ref = 0) | period + hh_id,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)

instrumented_income_hh_fe <- feols(total_consumption_99 ~ 1 | hh_id + period | total_income_99:i(treatment, ref = 0) + total_income_99 ~ study_income:i(treatment, ref = 0) + study_income,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)

modelsummary(
    list(
        "Study Income" = study_income,
        "Total Income" = income,
        "Total Income (instrumented)" = instrumented_income,
        "Work Income" = work_income,
        "Work Income (instrumented)" = instrumented_work_income,
        "Participant Work Income" = work_income_p,
        "Participant Work Income (instrumented)" = instrumented_work_income_p,
        "Total Income + HH FE" = income_hh_fe,
        "Total Income + HH FE (instrumented)" = instrumented_income_hh_fe
    ),
    title = "Treatment Effects on Consumption",
    escape = FALSE,
    output = "kableExtra",
    estimate = "{estimate}{stars}",
    statistic = "{std.error} ({conf.low}, {conf.high})",
    coef_omit = NULL,
    coef_omit_sources = FALSE,
    stars = c(`***` = 0.01, `**` = 0.05, `*` = 0.1),
    gof_map = tribble(
        ~raw, ~clean, ~fmt,
        "nobs", "Observations", 0,
        "FE", "Community FE", 1,
    ),
    # rename all the fit_ variables from the instrumentation so that the table is cleaner
    coef_rename = c(
        "total_consumption_99_bl" = "Baseline Consumption",
        "hh_size" = "Household Size",
        "census_wealth_index" = "Wealth Index",
        "money_work_corrected_99" = "Income",
        "money_earn_p_corrected" = "Income",
        "total_income_99" = "Income",
        "fit_money_work_corrected_99" = "Income",
        "fit_money_earn_p_corrected" = "Income",
        "fit_total_income_99" = "Income",
        "treatment::1" = "Stable",
        "treatment::2" = "Predictable",
        "treatment::3" = "Risky",
        # rename all interactions
        "money_work_corrected_99:treatment::1" = "Income x Stable",
        "money_work_corrected_99:treatment::2" = "Income x Predictable",
        "money_work_corrected_99:treatment::3" = "Income x Risky",
        "fit_money_work_corrected_99:treatment::1" = "Income x Stable",
        "fit_money_work_corrected_99:treatment::2" = "Income x Predictable",
        "fit_money_work_corrected_99:treatment::3" = "Income x Risky",
        "money_earn_p_corrected:treatment::1" = "Income x Stable",
        "money_earn_p_corrected:treatment::2" = "Income x Predictable",
        "money_earn_p_corrected:treatment::3" = "Income x Risky",
        "fit_money_earn_p_corrected:treatment::1" = "Income x Stable",
        "fit_money_earn_p_corrected:treatment::2" = "Income x Predictable",
        "fit_money_earn_p_corrected:treatment::3" = "Income x Risky",
        "total_income_99:treatment::1" = "Income x Stable",
        "total_income_99:treatment::2" = "Income x Predictable",
        "total_income_99:treatment::3" = "Income x Risky",
        "fit_total_income_99:treatment::1" = "Income x Stable",
        "fit_total_income_99:treatment::2" = "Income x Predictable",
        "fit_total_income_99:treatment::3" = "Income x Risky"
    )
) %>%
    kable_classic(full_width = F, html_font = "Cambria", fixed_thead = T)
```
Treatment Effects on Consumption
 Study Income  Total Income  Total Income (instrumented)  Work Income  Work Income (instrumented)  Participant Work Income  Participant Work Income (instrumented)  Total Income + HH FE  Total Income + HH FE (instrumented)
Baseline Consumption 0.274*** 0.268*** 0.299* 0.273*** 0.307 0.273*** 0.277***
0.011 (0.253, 0.295) 0.011 (0.247, 0.289) 0.172 (−0.041, 0.639) 0.011 (0.252, 0.294) 0.224 (−0.137, 0.750) 0.011 (0.252, 0.294) 0.018 (0.242, 0.313)
Household Size 12.099*** 11.529*** 13.967 11.730*** 22.209 12.073*** 12.194***
1.929 (8.279, 15.920) 1.910 (7.746, 15.311) 13.683 (−13.137, 41.071) 1.932 (7.903, 15.557) 72.571 (−121.541, 165.959) 1.910 (8.289, 15.856) 2.109 (8.017, 16.371)
Wealth Index 17.540* 12.799 37.009 15.877 73.786 16.702* 21.195*
9.808 (−1.888, 36.968) 9.646 (−6.308, 31.905) 131.645 (−223.755, 297.773) 9.778 (−3.491, 35.244) 390.169 (−699.064, 846.635) 9.808 (−2.727, 36.130) 11.939 (−2.453, 44.844)
study_income −0.060
0.090 (−0.238, 0.119)
Stable 32.265 58.324*** 78.107 57.178*** −20.064 55.378*** 37.497
25.975 (−19.186, 83.717) 18.621 (21.440, 95.209) 129.566 (−178.538, 334.753) 18.298 (20.933, 93.424) 421.472 (−854.919, 814.790) 17.387 (20.937, 89.819) 38.549 (−38.861, 113.855)
Predictable 47.930*** 45.523*** 334.667 56.944*** 269.483 57.050*** 37.300
17.297 (13.668, 82.192) 16.329 (13.179, 77.867) 1530.805 (−2697.563, 3366.896) 15.889 (25.472, 88.416) 1626.267 (−2951.838, 3490.805) 15.061 (27.217, 86.883) 40.701 (−43.320, 117.921)
Risky 49.028*** 48.256*** 46.491*** 48.980***
13.989 (21.318, 76.739) 12.719 (23.062, 73.450) 13.401 (19.945, 73.036) 13.024 (23.182, 74.778)
study_income:treatment::1 0.288
0.324 (−0.353, 0.929)
study_income:treatment::2 0.122
0.160 (−0.195, 0.438)
Income 0.141*** −0.337 0.200*** −4.430 0.541** −2.456 0.116*** −0.079
0.031 (0.081, 0.202) 2.263 (−4.820, 4.145) 0.062 (0.077, 0.323) 27.884 (−59.662, 50.802) 0.267 (0.012, 1.070) 3.618 (−9.623, 4.711) 0.030 (0.056, 0.176) 1.095 (−2.248, 2.090)
Income x Stable −0.033 −0.126 −0.099 1.212 −0.388 1.492 −0.025 −0.249
0.037 (−0.106, 0.040) 0.609 (−1.331, 1.080) 0.085 (−0.268, 0.071) 7.333 (−13.313, 15.737) 0.268 (−0.918, 0.143) 3.195 (−4.836, 7.820) 0.041 (−0.107, 0.058) 0.538 (−1.315, 0.816)
Income x Predictable 0.017 −1.142 −0.054 −4.805 −0.427 1.795 0.025 −0.447
0.036 (−0.055, 0.089) 6.190 (−13.404, 11.120) 0.086 (−0.225, 0.117) 35.279 (−74.685, 65.076) 0.266 (−0.954, 0.099) 3.228 (−4.599, 8.188) 0.037 (−0.048, 0.098) 1.457 (−3.333, 2.440)
Income x Risky −0.015 0.197* −0.021 0.298 −0.439 3.745*** 0.005
0.030 (−0.074, 0.043) 0.102 (−0.006, 0.400) 0.068 (−0.155, 0.113) 3.506 (−6.646, 7.242) 0.274 (−0.983, 0.104) 1.334 (1.102, 6.387) 0.034 (−0.062, 0.072)
Observations 14865 14865 14865 14865 14865 14865 14865 14861 14861

3.2.2 Income Effects on Non-Food Expenditure

Code
```{r}
#| label: model-non-food-expenditure-instrumented-income
#| warning: false
#| message: false

## Copied from main regressions; adjuts if chagned
# Define common fixed effects specification
income <- feols(expenditure_total_nonfood_99 ~ expenditure_total_nonfood_99_bl + hh_size + census_wealth_index + total_income_99 * i(treatment, ref = 0) | community_id + period,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)

study_income <- feols(expenditure_total_nonfood_99 ~ expenditure_total_nonfood_99_bl + hh_size + census_wealth_index + study_income * i(treatment, ref = 0) | community_id + period,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)

work_income <- feols(expenditure_total_nonfood_99 ~ expenditure_total_nonfood_99_bl + hh_size + census_wealth_index + money_work_corrected_99 * i(treatment, ref = 0) | community_id + period,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)

work_income_p <- feols(expenditure_total_nonfood_99 ~ expenditure_total_nonfood_99_bl + hh_size + census_wealth_index + money_earn_p_corrected * i(treatment, ref = 0) | community_id + period,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)

# Instrument Participant Income
instrumented_work_income_p <- feols(expenditure_total_nonfood_99 ~ expenditure_total_nonfood_99_bl + hh_size + census_wealth_index + i(treatment, ref = 0) | community_id + period | money_earn_p_corrected:i(treatment, ref = 0) + money_earn_p_corrected ~ study_income:i(treatment, ref = 0) + study_income,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)
# Instrument work Income
instrumented_work_income <- feols(expenditure_total_nonfood_99 ~ expenditure_total_nonfood_99_bl + hh_size + census_wealth_index + i(treatment, ref = 0) | community_id + period | money_work_corrected_99:i(treatment, ref = 0) + money_work_corrected_99 ~ study_income:i(treatment, ref = 0) + study_income,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)
# Instrument Total Income
instrumented_income <- feols(expenditure_total_nonfood_99 ~ expenditure_total_nonfood_99_bl + hh_size + census_wealth_index + i(treatment, ref = 0) | community_id + period | total_income_99:i(treatment, ref = 0) + total_income_99 ~ study_income:i(treatment, ref = 0) + study_income,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)


income_hh_fe <- feols(expenditure_total_nonfood_99 ~ expenditure_total_nonfood_99_bl + hh_size + census_wealth_index + total_income_99 * i(treatment, ref = 0) | period + hh_id,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)

instrumented_income_hh_fe <- feols(expenditure_total_nonfood_99 ~ 1 | hh_id + period | total_income_99:i(treatment, ref = 0) + total_income_99 ~ study_income:i(treatment, ref = 0) + study_income,
    cluster = "community_id",
    data = df,
    collin.tol = 1e-5
)

modelsummary(
    list(
        "Study Income" = study_income,
        "Total Income" = income,
        "Total Income (instrumented)" = instrumented_income,
        "Work Income" = work_income,
        "Work Income (instrumented)" = instrumented_work_income,
        "Participant Work Income" = work_income_p,
        "Participant Work Income (instrumented)" = instrumented_work_income_p,
        "Total Income + HH FE" = income_hh_fe,
        "Total Income + HH FE (instrumented)" = instrumented_income_hh_fe
    ),
    title = "Treatment Effects on Non-Food Expenditure",
    escape = FALSE,
    output = "kableExtra",
    estimate = "{estimate}{stars}",
    statistic = "{std.error} ({conf.low}, {conf.high})",
    coef_omit = NULL,
    coef_omit_sources = FALSE,
    stars = c(`***` = 0.01, `**` = 0.05, `*` = 0.1),
    gof_map = tribble(
        ~raw, ~clean, ~fmt,
        "nobs", "Observations", 0,
        "FE", "Community FE", 1,
    ),
    # rename all the fit_ variables from the instrumentation so that the table is cleaner
    coef_rename = c(
        "total_consumption_99_bl" = "Baseline Consumption",
        "hh_size" = "Household Size",
        "census_wealth_index" = "Wealth Index",
        "money_work_corrected_99" = "Income",
        "money_earn_p_corrected" = "Income",
        "total_income_99" = "Income",
        "fit_money_work_corrected_99" = "Income",
        "fit_money_earn_p_corrected" = "Income",
        "fit_total_income_99" = "Income",
        "treatment::1" = "Stable",
        "treatment::2" = "Predictable",
        "treatment::3" = "Risky",
        # rename all interactions
        "money_work_corrected_99:treatment::1" = "Income x Stable",
        "money_work_corrected_99:treatment::2" = "Income x Predictable",
        "money_work_corrected_99:treatment::3" = "Income x Risky",
        "fit_money_work_corrected_99:treatment::1" = "Income x Stable",
        "fit_money_work_corrected_99:treatment::2" = "Income x Predictable",
        "fit_money_work_corrected_99:treatment::3" = "Income x Risky",
        "money_earn_p_corrected:treatment::1" = "Income x Stable",
        "money_earn_p_corrected:treatment::2" = "Income x Predictable",
        "money_earn_p_corrected:treatment::3" = "Income x Risky",
        "fit_money_earn_p_corrected:treatment::1" = "Income x Stable",
        "fit_money_earn_p_corrected:treatment::2" = "Income x Predictable",
        "fit_money_earn_p_corrected:treatment::3" = "Income x Risky",
        "total_income_99:treatment::1" = "Income x Stable",
        "total_income_99:treatment::2" = "Income x Predictable",
        "total_income_99:treatment::3" = "Income x Risky",
        "fit_total_income_99:treatment::1" = "Income x Stable",
        "fit_total_income_99:treatment::2" = "Income x Predictable",
        "fit_total_income_99:treatment::3" = "Income x Risky"
    )
) %>%
    kable_classic(full_width = F, html_font = "Cambria", fixed_thead = T)
```
Treatment Effects on Non-Food Expenditure
 Study Income  Total Income  Total Income (instrumented)  Work Income  Work Income (instrumented)  Participant Work Income  Participant Work Income (instrumented)  Total Income + HH FE  Total Income + HH FE (instrumented)
expenditure_total_nonfood_99_bl 0.215*** 0.210*** 0.232* 0.214*** 0.231* 0.214*** 0.217***
0.008 (0.199, 0.231) 0.008 (0.194, 0.226) 0.136 (−0.037, 0.501) 0.008 (0.198, 0.230) 0.127 (−0.019, 0.482) 0.008 (0.198, 0.231) 0.010 (0.198, 0.236)
Household Size 3.745*** 3.434*** 4.690 3.511*** 6.472 3.711*** 3.655***
0.670 (2.417, 5.072) 0.661 (2.125, 4.743) 6.387 (−7.962, 17.343) 0.661 (2.203, 4.820) 20.369 (−33.874, 46.819) 0.661 (2.402, 5.020) 0.923 (1.826, 5.484)
Wealth Index 7.390** 5.904* 13.912 6.791** 21.382 7.202** 9.494**
3.483 (0.492, 14.289) 3.349 (−0.730, 12.537) 44.780 (−74.789, 102.613) 3.414 (0.028, 13.554) 98.726 (−174.174, 216.939) 3.459 (0.351, 14.053) 4.287 (1.002, 17.986)
study_income 0.000
0.034 (−0.068, 0.068)
Stable −10.020 11.947* 43.834 12.815** 4.022 9.157 17.517
10.605 (−31.026, 10.987) 6.793 (−1.508, 25.402) 43.097 (−41.534, 129.201) 6.255 (0.425, 25.206) 108.318 (−210.536, 218.579) 5.996 (−2.720, 21.034) 14.847 (−11.892, 46.927)
Predictable 7.831 4.922 69.710 9.851 59.576 10.791* 6.147
7.596 (−7.215, 22.877) 6.455 (−7.864, 17.709) 530.269 (−980.651, 1120.070) 6.077 (−2.187, 21.889) 415.504 (−763.458, 882.610) 5.649 (−0.398, 21.980) 18.015 (−29.537, 41.831)
Risky 5.419 5.527 5.681 6.723
4.981 (−4.447, 15.285) 4.661 (−3.706, 14.760) 4.853 (−3.933, 15.294) 4.743 (−2.672, 16.117)
study_income:treatment::1 0.230*
0.130 (−0.027, 0.488)
study_income:treatment::2 0.013
0.074 (−0.134, 0.160)
Income 0.045*** −0.114 0.080*** −1.047 0.114 −0.401 0.046*** −0.040
0.012 (0.021, 0.069) 0.799 (−1.696, 1.467) 0.028 (0.026, 0.135) 7.231 (−15.371, 13.277) 0.083 (−0.050, 0.278) 1.357 (−3.089, 2.286) 0.015 (0.015, 0.076) 1.103 (−2.225, 2.144)
Income x Stable −0.010 −0.158 −0.052 0.090 0.027 −0.457 −0.019 −0.048
0.017 (−0.043, 0.023) 0.204 (−0.563, 0.247) 0.039 (−0.130, 0.025) 1.901 (−3.676, 3.857) 0.093 (−0.158, 0.212) 1.243 (−2.918, 2.004) 0.021 (−0.060, 0.022) 0.647 (−1.330, 1.234)
Income x Predictable 0.015 −0.239 0.004 −1.109 −0.109 0.344 0.010 0.319
0.015 (−0.015, 0.045) 2.143 (−4.483, 4.005) 0.045 (−0.085, 0.094) 9.035 (−19.005, 16.788) 0.083 (−0.274, 0.056) 1.324 (−2.278, 2.967) 0.019 (−0.028, 0.049) 0.641 (−0.951, 1.588)
Income x Risky 0.003 0.024 0.015 −0.017 −0.075 0.503 0.001 0.179
0.014 (−0.024, 0.031) 0.042 (−0.060, 0.107) 0.033 (−0.051, 0.081) 0.906 (−1.811, 1.777) 0.084 (−0.241, 0.092) 0.474 (−0.435, 1.442) 0.017 (−0.033, 0.035) 0.447 (−0.707, 1.065)
Observations 14853 14829 14829 14829 14829 14829 14829 14825 14825

3.3 Mental Health Item Controls

Code
```{r}
#| label: models-mh-item-controls
#| warning: false
#| message: false
# Create item-by-item baseline mh controls dataframe
mh_data_baseline <- read_dta("/Users/st2246/Work/Pilot3/data/generated/tidy/main/06_Mental_Health-hh_id-period.dta") %>%
    filter(period == 0) %>%
    select(
        hh_id,
        phq_qst1, phq_qst2, phq_qst3, phq_qst4, phq_qst5, phq_qst6, phq_qst7, phq_qst8,
        gad_qst1, gad_qst2, gad_qst3, gad_qst4, gad_qst5, gad_qst6, gad_qst7
    ) %>%
    mutate(
        hh_id = as.factor(hh_id)
    ) %>%
    rename_with(~ paste0(.x, "_bl"), -hh_id)

mh_df <- df %>%
    left_join(mh_data_baseline, by = "hh_id")

phq_models <- run_regressions(
    var = "phq2_z",
    reg_data = mh_df,
    controls = "phq_qst1_bl + phq_qst2_bl + phq_qst3_bl + phq_qst4_bl + phq_qst5_bl + phq_qst6_bl + phq_qst7_bl + phq_qst8_bl"
)

gad_models <- run_regressions(
    var = "gad2_z",
    reg_data = mh_df,
    controls = "gad_qst1_bl + gad_qst2_bl + gad_qst3_bl + gad_qst4_bl + gad_qst5_bl + gad_qst6_bl + gad_qst7_bl"
)
```
Code
```{r}
#| label: tbl-mh-item-controls-main
#| tbl-cap: ""
makeTable(c(
    phq_models[1],
    gad_models[1],
    phq_models[2],
    gad_models[2]
))
```
Table 50
 PHQ-2 Z-Score  GAD-2 Z-Score  PHQ-2 Z-Score - Balanced Risky  GAD-2 Z-Score - Balanced Risky
Stable −0.067* −0.061* −0.065* −0.056
0.034 (−0.135, 0.000) 0.036 (−0.132, 0.010) 0.034 (−0.132, 0.002) 0.036 (−0.127, 0.015)
Predictable −0.036 −0.031 −0.037 −0.032
0.034 (−0.103, 0.031) 0.036 (−0.103, 0.040) 0.034 (−0.104, 0.029) 0.036 (−0.103, 0.039)
Risky −0.083*** −0.061**
0.028 (−0.138, −0.027) 0.031 (−0.122, −0.000)
Risky (Balanced) −0.098** −0.027
0.039 (−0.174, −0.022) 0.043 (−0.111, 0.057)
Observations 12531 12531 8030 8030
Code
```{r}
#| label: tbl-mh-item-controls-risky-splits
#| tbl-cap: ""
makeTable(c(
    phq_models[3],
    gad_models[3]
))
```
Table 51
 PHQ-2 Z-Score - Split Risky  GAD-2 Z-Score - Split Risky
Stable −0.067* −0.058
0.034 (−0.134, 0.000) 0.036 (−0.129, 0.013)
Predictable −0.037 −0.032
0.034 (−0.104, 0.029) 0.036 (−0.103, 0.039)
Risky Medium −0.101*** −0.027
0.039 (−0.177, −0.024) 0.043 (−0.111, 0.056)
Risky High −0.052 −0.105**
0.041 (−0.133, 0.029) 0.046 (−0.195, −0.016)
Risky Low −0.067 −0.003
0.048 (−0.162, 0.028) 0.055 (−0.110, 0.104)
Observations 9776 9776
Code
```{r}
#| label: tbl-mh-item-controls-income-interactions
#| tbl-cap: ""
makeTable(c(
    phq_models[4],
    gad_models[4],
    phq_models[5],
    gad_models[5],
    phq_models[6],
    gad_models[6]
))
```
Table 52
 PHQ-2 Z-Score - Income  GAD-2 Z-Score - Income  PHQ-2 Z-Score - Income + Arm  GAD-2 Z-Score - Income + Arm  PHQ-2 Z-Score - Income X Arm  GAD-2 Z-Score - Income X Arm
Stable −0.042 −0.022 −0.149 −0.085
0.037 (−0.114, 0.030) 0.039 (−0.098, 0.054) 0.104 (−0.352, 0.055) 0.111 (−0.303, 0.132)
Predictable −0.011 0.007 −0.035 −0.010
0.036 (−0.082, 0.060) 0.039 (−0.069, 0.083) 0.043 (−0.119, 0.049) 0.044 (−0.096, 0.076)
Risky −0.058* −0.023 −0.045 −0.015
0.031 (−0.119, 0.003) 0.034 (−0.090, 0.043) 0.032 (−0.108, 0.017) 0.035 (−0.084, 0.054)
Study Income −0.000*** −0.000*** −0.000** −0.000*** −0.000** −0.000***
0.000 (−0.001, −0.000) 0.000 (−0.001, −0.000) 0.000 (−0.001, −0.000) 0.000 (−0.001, −0.000) 0.000 (−0.001, −0.000) 0.000 (−0.001, −0.000)
Stable × Study Income 0.001 0.001
0.001 (−0.001, 0.003) 0.001 (−0.001, 0.003)
Predictable × Study Income 0.000 0.000
0.000 (−0.000, 0.001) 0.000 (−0.000, 0.001)
Observations 12531 12531 12531 12531 12531 12531
Note

For risky arms that did not complete dropoff, we impute a medium draw for the regressions below

Code
```{r}
#| label: tbl-mh-item-controls-draw
#| tbl-cap: ""
makeTable(c(
    phq_models[7],
    gad_models[7],
    phq_models[8],
    gad_models[8]
))
```
Table 53
 PHQ-2 Z-Score - Imputed Draw  GAD-2 Z-Score - Imputed Draw  PHQ-2 Z-Score - Imputed Draw with Lag  GAD-2 Z-Score - Imputed Draw with Lag
High Draw −0.065* −0.065* −0.268 0.321
0.034 (−0.131, 0.002) 0.037 (−0.137, 0.006) 30341.622 (−59500.564, 59500.027) 32309.110 (−63358.244, 63358.885)
Medium Draw −0.050 −0.051 −0.255 0.299
0.033 (−0.115, 0.015) 0.035 (−0.120, 0.018) 30341.620 (−59500.548, 59500.038) 32309.108 (−63358.261, 63358.859)
Low Draw −0.042 −0.018 −0.246 0.369
0.034 (−0.109, 0.025) 0.037 (−0.090, 0.055) 30341.622 (−59500.541, 59500.050) 32309.110 (−63358.195, 63358.933)
High Draw previous period 0.202 −0.399
30341.619 (−59500.089, 59500.492) 32309.108 (−63358.959, 63358.161)
Medium Draw previous period 0.203 −0.346
30341.620 (−59500.088, 59500.494) 32309.108 (−63358.906, 63358.214)
Low Draw previous period 0.202 −0.385
30341.619 (−59500.089, 59500.492) 32309.108 (−63358.946, 63358.175)
Observations 12531 12531 12531 12531
Note

Only treated participants that completed pickup are included in the regressions below.

Code
```{r}
#| label: tbl-mh-item-controls-imputed-draw
#| tbl-cap: ""
makeTable(c(
    phq_models[9],
    gad_models[9],
    phq_models[10],
    gad_models[10]
))
```
Table 54
 PHQ-2 Z-Score - Realized Draw  GAD-2 Z-Score - Realized Draw  PHQ-2 Z-Score - Realized Draw with Lag  GAD-2 Z-Score - Realized Draw with Lag
High Draw −0.048 −0.055 −0.055 −0.062
0.035 (−0.117, 0.022) 0.038 (−0.130, 0.019) 0.038 (−0.130, 0.020) 0.040 (−0.141, 0.016)
Medium Draw −0.061* −0.062* −0.066* −0.056
0.035 (−0.129, 0.007) 0.036 (−0.133, 0.010) 0.036 (−0.136, 0.005) 0.037 (−0.129, 0.017)
Low Draw −0.021 −0.006 −0.034 −0.020
0.036 (−0.091, 0.048) 0.038 (−0.081, 0.068) 0.039 (−0.112, 0.043) 0.041 (−0.101, 0.061)
High Draw previous period 0.001 −0.010
0.020 (−0.039, 0.041) 0.022 (−0.054, 0.033)
Observations 11931 11931 10349 10349
Note

Only participants who completed all surveys are included in the regressions below.

Code
```{r}
#| label: tbl-mh-item-controls-balanced-panel
#| tbl-cap: ""
makeTable(c(
    phq_models[11],
    gad_models[11]
))
```
Table 55
 PHQ-2 Z-Score - Balanced Panel  GAD-2 Z-Score - Balanced Panel
Stable −0.116*** −0.108**
0.042 (−0.198, −0.035) 0.043 (−0.193, −0.024)
Predictable −0.078* −0.041
0.042 (−0.160, 0.004) 0.044 (−0.128, 0.045)
Risky −0.126*** −0.088**
0.036 (−0.196, −0.055) 0.038 (−0.163, −0.013)
Observations 9357 9357
Note

The regressions below include baseline (period 0) data.

Code
```{r}
#| label: tbl-mh-item-controls-baseline-included
#| tbl-cap: ""
makeTable(c(
    phq_models[15],
    gad_models[15]
))
```
Table 56
 PHQ-2 Z-Score - Baseline Included  GAD-2 Z-Score - Baseline Included
Stable −0.060** −0.056*
0.030 (−0.118, −0.001) 0.031 (−0.117, 0.005)
Predictable −0.026 −0.020
0.029 (−0.084, 0.031) 0.031 (−0.081, 0.041)
Risky −0.071*** −0.052*
0.024 (−0.119, −0.024) 0.027 (−0.104, 0.000)
Observations 14803 14803
Note

The regressions below exclude endline (period 6) data.

Code
```{r}
#| label: tbl-mh-item-controls-excluding-endline
#| tbl-cap: ""
makeTable(c(
    phq_models[16],
    gad_models[16]
))
```
Table 57
 PHQ-2 Z-Score - Excluding Endline  GAD-2 Z-Score - Excluding Endline
Stable −0.095*** −0.096***
0.034 (−0.163, −0.028) 0.037 (−0.169, −0.024)
Predictable −0.057* −0.061*
0.035 (−0.125, 0.011) 0.037 (−0.133, 0.011)
Risky −0.094*** −0.079**
0.029 (−0.150, −0.037) 0.032 (−0.141, −0.017)
Observations 10345 10345

3.4 Crowding out

Code
```{r}
#| warning: false
#| message: false
#| label: models-crowding-out
#| tbl-cap: "Testing for crowding out"

run_regressions_short <- function(var, reg_data) {
    fe_spec <- "| district_id + period + wave + enum_id + day_of_week + cohort"
    controls <- paste0(var, "_bl + hh_size + census_wealth_index")
    formula <- as.formula(paste0(var, " ~ ", controls, " + i(treatment) ", fe_spec))

    model <- feols(
        formula,
        cluster = "hh_id",
        data = reg_data,
        collin.tol = 1e-5
    )
    return(model)
}

# Run the regression for  working adults, days worked, total income and work income with main spec on period 1-3 data using "non_corrected" income variables
initial <- map(c("working_adults", "days_worked", "money_work_99"), ~ run_regressions_short(
    var = .,
    reg_data = df %>% filter(period <= 3)
)) %>% 
    set_names(c("Working Adults (Original P1-3)", "Days Worked (Original P1-3)", "Work Income (Original P1-3)"))
# Run the regression for  working adults, days worked, total income and work income with main spec on period 1-3 data using "corrected" income variables
corrected <-map(c("working_adults_corrected", "days_worked_corrected", "money_work_corrected_99"), ~ run_regressions_short(
    var = .,
    reg_data = df %>% filter(period <= 3)
)) %>%
    set_names(c("Working Adults (Corrected P1-3)", "Days Worked (Corrected P1-3)", "Work Income (Corrected P1-3)"))

second_half_no_endline <- map(c("working_adults", "days_worked", "money_work_99"), ~ run_regressions_short(
    var = .,
    reg_data = df %>% filter(period > 3 & period < 6)
)) %>%
    set_names(c("Working Adults (Original P4-5)", "Days Worked (Original P4-5)", "Work Income (Original P4-5)"))

# Run the regression for  working adults, days worked, total income and work income with main spec on period 4-6 data using "non-corrected" income variables
second_half <- map(c("working_adults", "days_worked", "money_work_99"), ~ run_regressions_short(
    var = .,
    reg_data = df %>% filter(period > 3)
)) %>%
    set_names(c("Working Adults (Original P4-6)", "Days Worked (Original P4-6)", "Work Income (Original P4-6)"))

makeTable(c(
    initial[1], corrected[1], second_half[1], second_half_no_endline[1],
    initial[2], corrected[2], second_half[2], second_half_no_endline[2],
    initial[3], corrected[3], second_half[3], second_half_no_endline[3]
))
```
Testing for crowding out
 Working Adults (Original P1-3)  Working Adults (Corrected P1-3)  Working Adults (Original P4-6)  Working Adults (Original P4-5)  Days Worked (Original P1-3)  Days Worked (Corrected P1-3)  Days Worked (Original P4-6)  Days Worked (Original P4-5)  Work Income (Original P1-3)  Work Income (Corrected P1-3)  Work Income (Original P4-6)  Work Income (Original P4-5)
Stable 0.249*** −0.045** −0.068** −0.033 0.843*** −0.216 −0.331** −0.086 19.873*** −4.003 −10.808 −5.945
0.022 (0.206, 0.291) 0.019 (−0.083, −0.007) 0.028 (−0.122, −0.013) 0.023 (−0.077, 0.012) 0.160 (0.529, 1.157) 0.155 (−0.521, 0.088) 0.169 (−0.663, −0.000) 0.131 (−0.343, 0.172) 4.495 (11.057, 28.688) 3.990 (−11.828, 3.821) 7.278 (−25.081, 3.466) 5.166 (−16.076, 4.187)
Predictable 0.283*** −0.026 −0.049* −0.015 0.920*** −0.095 −0.084 0.111 24.108*** −2.777 −4.251 −0.779
0.021 (0.242, 0.323) 0.019 (−0.063, 0.012) 0.027 (−0.103, 0.004) 0.023 (−0.060, 0.031) 0.145 (0.635, 1.204) 0.143 (−0.375, 0.185) 0.180 (−0.436, 0.268) 0.142 (−0.168, 0.390) 4.913 (14.472, 33.743) 4.081 (−10.779, 5.226) 7.089 (−18.153, 9.651) 5.131 (−10.841, 9.282)
Risky 0.266*** −0.033** −0.030 −0.006 0.790*** −0.189 −0.169 0.043 21.139*** −4.834 −4.750 −1.388
0.018 (0.230, 0.301) 0.016 (−0.065, −0.001) 0.023 (−0.075, 0.016) 0.020 (−0.045, 0.034) 0.128 (0.539, 1.041) 0.126 (−0.437, 0.059) 0.144 (−0.450, 0.112) 0.112 (−0.176, 0.263) 3.998 (13.299, 28.979) 3.234 (−11.176, 1.508) 6.008 (−16.532, 7.031) 4.417 (−10.050, 7.274)
Observations 8337 8337 6528 4280 8337 8337 6528 4280 8337 8337 6528 4280

3.5 Food Consumption - Category

Code
```{r}
#| warning: false
#| message: false
#| label: fig-food-categories-consumption-descriptive
#| fig-cap: "Food Consumption by Category Over Time"
#| fig-height: 12 

# Create plots for each consumption category
consumption_category_plots <- map(
    food_categories,
    ~ggplot(df, aes(x = period, y = .data[[paste0("food_consumption_", .x, "_99")]], color = treatment, group = treatment)) +
        geom_line(stat = "summary", fun = "mean") +
        labs(
            title = stringr::str_to_title(.x),
            x = "Period",
            y = "Cedis (win. 99%)"
        ) +
        scale_color_discrete(
            name = "Treatment",
            labels = c("Control", "Stable", "Predictable", "Risky")
        ) +
        theme_minimal() +
        theme(legend.position = "none")
)

# Combine plots
wrap_plots(consumption_category_plots, ncol = 2) +
    plot_layout(guides = "collect") & theme(legend.position = "right")
```
Figure 11: Food Consumption by Category Over Time
Code
```{r}
#| warning: false
#| message: false
#| label: fig-food-categories-consumption-by-draw
#| fig-cap: "Food Consumption by Category and Draw Over Time"
#| fig-height: 12 

# Create plots for each consumption category, colored by draw
consumption_category_draw_plots <- map(
    food_categories,
    ~ggplot(df %>% filter(unpredictable == 1), 
            aes(x = period, y = .data[[paste0("food_consumption_", .x, "_99")]], color = draw_imputed, group = draw_imputed)) +
        geom_line(stat = "summary", fun = "mean") +
        labs(
            title = stringr::str_to_title(.x),
            x = "Period",
            y = "Cedis (win. 99%)"
        ) +
        scale_color_discrete(
            name = "Draw",
            labels = c("H" = "High", "M" = "Medium", "L" = "Low")
        ) +
        theme_minimal() +
        theme(legend.position = "none")
)

# Combine plots
wrap_plots(consumption_category_draw_plots, ncol = 2) +
    plot_layout(guides = "collect") & theme(legend.position = "right")
```
Figure 12: Food Consumption by Category and Draw Over Time
Code
```{r}
#| warning: false
#| message: false
#| label: fig-food-categories-consumption-treatment-effects
#| fig-cap: "Treatment Effects on Food Consumption by Category"
#| fig-height: 12 

# Generate coefficient dataframe for all consumption categories
consumption_category_coef_plots <- map(
    consumption_category_vars,
    ~generate_coeff_df(df, .x) %>%
    ggplot(
        aes(x = period, y = estimate, group = treatment, color = treatment)
    ) +
    geom_point(position = position_dodge(width = 0.5)) +
    geom_hline(yintercept = 0, color = "grey") +
    geom_errorbar(aes(ymin = conf.low, ymax = conf.high),
                  position = position_dodge(width = 0.5), width = 0.2) +
    ylab("Treatment Effect (Cedis)") +
    xlab("Period") +
    scale_color_discrete(
        name = "Treatment",
        labels = c("Stable", "Predictable", "Risky")
    ) +
    theme_minimal() +
    labs(title = variableLabels[.x]))

wrap_plots(consumption_category_coef_plots, ncol = 2) +
    plot_layout(guides = "collect") & theme(legend.position = "right")
```
Figure 13: Treatment Effects on Food Consumption by Category
Code
```{r}
#| warning: false
#| message: false
#| label: fig-food-categories-consumption-draw-effects
#| fig-cap: "Treatment Effects on Food Consumption by Category and Draw"
#| fig-height: 12 

# Generate coefficient dataframe for draw effects on consumption categories
model_to_coef_consumption_draw <- function(var) {
    varLabel <- variableLabels[var]
    controls <- paste0(var, "_bl + hh_size")

    period <- c(1, 2, 3, 4, 5, 6)
    estimate_df <- map(period, ~
        tidy(
            feols(as.formula(paste0(var, " ~ ", controls, " + i(draw_realized) + unpredictable | community_id")),
                cluster = "community_id",
                data = df %>% filter(period == .x & unpredictable == 1)
            ),
            conf.int = TRUE
        ))
    
    estimate_df <- bind_rows(estimate_df, .id = "period") %>%
        filter(str_detect(term, "draw_imputed")) %>%
        mutate(
            period = as.numeric(period),
            draw = case_when(
                term == "draw_imputed::H" ~ "High",
                term == "draw_imputed::L" ~ "Low",
                term == "draw_imputed::M" ~ "Medium",
            )
        ) %>%
        select(!c(term)) %>%
        filter(!is.na(draw))

    estimate_df
}

consumption_draw_coef_dfs <- map(
    consumption_category_vars,
    model_to_coef_consumption_draw
) %>%
    bind_rows(.id = "variable") %>%
    mutate(category = str_remove(variable, "food_consumption_|_99"))

# Plot combined
ggplot(consumption_draw_coef_dfs, 
       aes(x = category, y = estimate, group = draw, color = draw)) +
    geom_point(position = position_dodge(width = 0.5)) +
    geom_hline(yintercept = 0, color = "grey") +
    geom_errorbar(aes(ymin = conf.low, ymax = conf.high), 
                  position = position_dodge(width = 0.5), width = 0.2) +
    ylab("Draw Effect (Cedis)") +
    xlab("Category") +
    scale_color_discrete(name = "Draw") +
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
```
Figure 14: Treatment Effects on Food Consumption by Category and Draw
Code
```{r}
#| label: tbl-food-categories-consumption-results
#| tbl-cap: "Treatment Effects on Food Consumption by Category - Main Model"

makeTable(unlist(list(
    models[["food_consumption_grains_99"]][9],
    models[["food_consumption_veges_99"]][9],
    models[["food_consumption_bevs_99"]][9],
    models[["food_consumption_pulses_99"]][9],
    models[["food_consumption_dairy_99"]][9],
    models[["food_consumption_meat_99"]][9],
    models[["food_consumption_fruits_99"]][9]
), recursive = FALSE))
```
Table 58: Treatment Effects on Food Consumption by Category - Main Model
Grains - Realized Draw  Vegetables - Realized Draw Beverages - Realized Draw Pulses - Realized Draw Dairy - Realized Draw Meat - Realized Draw Fruits - Realized Draw
High Draw 25.001*** 3.078*** 2.047** 12.117*** 2.224*** 2.412 1.639**
7.759 (9.786, 40.217) 1.140 (0.842, 5.313) 1.007 (0.073, 4.022) 3.143 (5.953, 18.281) 0.818 (0.620, 3.829) 2.532 (−2.553, 7.376) 0.742 (0.183, 3.095)
Medium Draw 19.690*** 1.409 1.584* 6.555** 0.035 0.091 0.405
7.385 (5.207, 34.172) 1.125 (−0.798, 3.616) 0.879 (−0.139, 3.308) 2.848 (0.970, 12.140) 0.735 (−1.405, 1.476) 2.400 (−4.615, 4.797) 0.737 (−1.040, 1.850)
Low Draw 26.703*** 2.567** 2.174** 11.821*** 1.941** 3.725 1.597**
7.851 (11.307, 42.099) 1.118 (0.374, 4.760) 1.008 (0.197, 4.151) 3.196 (5.554, 18.088) 0.798 (0.375, 3.507) 2.581 (−1.338, 8.787) 0.732 (0.162, 3.031)
Observations 11968 11968 11968 11968 11968 11968 11968