caption  = paste0(
"Note: Shaded area indicates the post-treatment period (2017\u20132022). ",
"The synthetic control (grey dashed) is a weighted combination of donor countries ",
"that best replicates Saudi Arabia\u2019s pre-reform services employment trajectory. ",
"Method: Abadie, Diamond & Hainmueller (2010).")
) +
theme_academic()
ggsave(paste0(OUT, "EmploymentS_SCM_path.pdf"),
p1, width = 9, height = 4.8, device = cairo_pdf)
ggsave(paste0(OUT, "EmploymentS_SCM_path.png"),
p1, width = 9, height = 4.8, dpi = 320)
# ── FIGURE 2: Gap plot ────────────────────────────────────────────────────────
p2 <- ggplot(results_df, aes(x = year, y = gap)) +
annotate("rect",
xmin = treatment_year, xmax = max(years) + 0.5,
ymin = -Inf, ymax = Inf,
fill = "#eef3ee", alpha = 1) +
geom_hline(yintercept = 0,
colour = "grey50", linewidth = 0.4, linetype = "dotted") +
geom_vline(xintercept = treatment_year,
linetype = "dashed", colour = col_vline, linewidth = 0.5) +
annotate("text",
x     = treatment_year + 0.3,
y     = max(gap_SA, na.rm = TRUE) * 0.92,
label = paste0("Vision 2030\n(", treatment_year, ")"),
hjust = 0, size = 2.9, colour = col_vline) +
geom_ribbon(aes(ymin = 0,            ymax = pmax(gap, 0)),
fill = col_treated, alpha = 0.18) +
geom_ribbon(aes(ymin = pmin(gap, 0), ymax = 0),
fill = col_synth,   alpha = 0.18) +
geom_line(colour = col_treated, linewidth = 0.95) +
scale_x_continuous(breaks = seq(time_range[1], time_range[2], by = 5),
expand = expansion(mult = c(0.01, 0.02))) +
scale_y_continuous(labels = label_number(accuracy = 0.1)) +
labs(
title    = "Treatment Effect: Saudi Arabia minus Synthetic Control (Services Employment)",
subtitle = "Gap series (pp); positive values = reform-driven increase in services employment",
x        = "Year",
y        = "Gap in services employment (pp)",
caption  = paste0(
"Note: The gap is Saudi Arabia\u2019s observed services employment share minus the synthetic counterfactual. ",
"Green shading = positive treatment effect (observed above counterfactual); ",
"grey shading = negative deviation. Near-zero pre-2017 gaps confirm good pre-reform fit.")
) +
theme_academic() +
theme(legend.position = "none")
ggsave(paste0(OUT, "EmploymentS_Gap.pdf"),
p2, width = 9, height = 4.5, device = cairo_pdf)
ggsave(paste0(OUT, "EmploymentS_Gap.png"),
p2, width = 9, height = 4.5, dpi = 320)
# ── Placebo-in-space: run all units ───────────────────────────────────────────
placebo_gaps <- list()
for (i in country_ids$country_id) {
dp_i <- tryCatch(dataprep(
foo                   = df,
predictors            = c("GovEff", "SecondEduc",
"Inflation", "LFPRF", "Services"),
predictors.op         = "mean",
special.predictors    = list(
list("EmploymentS", 2000, "mean"),
list("EmploymentS", 2005, "mean"),
list("EmploymentS", 2010, "mean"),
list("EmploymentS", 2015, "mean")
),
dependent             = "EmploymentS",
unit.variable         = "country_id",
unit.names.variable   = "country",
time.variable         = "year",
treatment.identifier  = i,
controls.identifier   = country_ids$country_id[country_ids$country_id != i],
time.predictors.prior = pre_period,
time.optimize.ssr     = pre_period,
time.plot             = time_range[1]:time_range[2]
), error = function(e) NULL)
if (is.null(dp_i)) next
sp_i <- tryCatch(synth(dp_i), error = function(e) NULL)
if (is.null(sp_i)) next
placebo_gaps[[as.character(i)]] <-
as.numeric(dp_i$Y1plot) - as.numeric(dp_i$Y0plot %*% sp_i$solution.w)
}
gap_matrix <- do.call(cbind, placebo_gaps)
colnames(gap_matrix) <- country_ids$country[
match(as.integer(names(placebo_gaps)), country_ids$country_id)]
# ── FIGURE 3: Placebo spaghetti ───────────────────────────────────────────────
gap_long <- as.data.frame(gap_matrix) %>%
mutate(year = years) %>%
pivot_longer(-year, names_to = "country", values_to = "gap") %>%
mutate(is_SA = country == "Saudi Arabia")
y_top <- max(gap_matrix, na.rm = TRUE)
p3 <- ggplot() +
annotate("rect",
xmin = treatment_year, xmax = max(years) + 0.5,
ymin = -Inf, ymax = Inf,
fill = "#eef3ee", alpha = 1) +
geom_hline(yintercept = 0,
colour = "grey50", linewidth = 0.4, linetype = "dotted") +
geom_vline(xintercept = treatment_year,
linetype = "dashed", colour = col_vline, linewidth = 0.5) +
annotate("text",
x = treatment_year + 0.3, y = y_top * 0.93,
label = paste0("Vision 2030\n(", treatment_year, ")"),
hjust = 0, size = 2.9, colour = col_vline) +
geom_line(data = filter(gap_long, !is_SA),
aes(x = year, y = gap, group = country),
colour = col_placebo, linewidth = 0.45) +
geom_line(data = filter(gap_long, is_SA),
aes(x = year, y = gap),
colour = col_treated, linewidth = 1.1) +
annotate("segment",
x = time_range[1] + 1, xend = time_range[1] + 3.5,
y = y_top * 0.80, yend = y_top * 0.80,
colour = col_treated, linewidth = 1.1) +
annotate("text",
x = time_range[1] + 4.0, y = y_top * 0.80,
label = "Saudi Arabia", hjust = 0, size = 3.1) +
annotate("segment",
x = time_range[1] + 1, xend = time_range[1] + 3.5,
y = y_top * 0.67, yend = y_top * 0.67,
colour = col_placebo, linewidth = 0.8) +
annotate("text",
x = time_range[1] + 4.0, y = y_top * 0.67,
label = "Placebo countries", hjust = 0, size = 3.1) +
scale_x_continuous(breaks = seq(time_range[1], time_range[2], by = 5),
expand = expansion(mult = c(0.01, 0.02))) +
scale_y_continuous(labels = label_number(accuracy = 0.1)) +
labs(
title    = "Placebo-in-Space Test: Employment in Services",
subtitle = "Each grey line = a donor country treated as if it received the 2017 reform",
x        = "Year",
y        = "Gap (Observed \u2212 Synthetic), pp",
caption  = paste0(
"Note: The synthetic control method is applied to each donor country as if it ",
"had received the treatment in 2017. If Saudi Arabia\u2019s post-2017 gap (green) is an ",
"outlier relative to the distribution of placebo gaps (grey), this supports a causal ",
"interpretation of the Vision 2030 reform effect on services employment.")
) +
theme_academic() +
theme(legend.position = "none")
ggsave(paste0(OUT, "EmploymentS_PlaceboSpace.pdf"),
p3, width = 9, height = 4.8, device = cairo_pdf)
ggsave(paste0(OUT, "EmploymentS_PlaceboSpace.png"),
p3, width = 9, height = 4.8, dpi = 320)
# ── FIGURE 4: Combined panel ──────────────────────────────────────────────────
combined <- (p1 / p2 / p3) +
plot_annotation(
title   = "Synthetic Control Estimates: Services Employment in Saudi Arabia",
caption = paste0("Source: World Bank / ILO. Method: Abadie, Diamond & Hainmueller (2010). ",
"Treatment: Vision 2030 labour market and economic diversification reforms (2017)."),
theme   = theme(
plot.title      = element_text(size = 13, face = "bold", hjust = 0,
margin = margin(b = 6)),
plot.caption    = element_text(size = 8.5, colour = "grey40", hjust = 0,
margin = margin(t = 8)),
plot.background = element_rect(fill = "white", colour = NA)
)
)
ggsave(paste0(OUT, "EmploymentS_CombinedPanel.pdf"),
combined, width = 9, height = 13, device = cairo_pdf)
ggsave(paste0(OUT, "EmploymentS_CombinedPanel.png"),
combined, width = 9, height = 13, dpi = 320)
# ══════════════════════════════════════════════════════════════════════════════
#  INFERENCE HELPERS
# ══════════════════════════════════════════════════════════════════════════════
compute_rmspe <- function(actual, synth_vals, yrs, treat_yr) {
pre    <- yrs < treat_yr
post   <- yrs >= treat_yr
pre_r  <- sqrt(mean((actual[pre]  - synth_vals[pre])^2))
post_r <- sqrt(mean((actual[post] - synth_vals[post])^2))
c(pre = pre_r, post = post_r, ratio = post_r / pre_r)
}
add_stars <- function(x) {
xr <- round(as.numeric(x), 3)
s  <- formatC(xr, format = "f", digits = 3)
if (abs(xr) >= 2.576) return(paste0(s, "***"))
if (abs(xr) >= 1.960) return(paste0(s, "**"))
if (abs(xr) >= 1.645) return(paste0(s, "*"))
return(s)
}
# Helper: write booktabs .tex file
write_tex <- function(xt_obj, file, include.rn = FALSE, add_to_row = NULL) {
print(xt_obj,
include.rownames       = include.rn,
booktabs               = TRUE,
sanitize.text.function = identity,
add.to.row             = add_to_row,
table.placement        = "H",
comment                = FALSE,
file                   = file)
}
# ── Single loop: RMSPE + t-stats for all units ────────────────────────────────
rmspe_results <- data.frame()
tstat_results <- data.frame()
for (i in seq_along(country_ids$country_id)) {
tid   <- country_ids$country_id[i]
tname <- country_ids$country[i]
pool  <- country_ids$country_id[country_ids$country_id != tid]
dp_i <- tryCatch(dataprep(
foo                   = df,
predictors            = c("GovEff", "SecondEduc",
"Inflation", "LFPRF", "Services"),
predictors.op         = "mean",
special.predictors    = list(
list("EmploymentS", 2000, "mean"),
list("EmploymentS", 2005, "mean"),
list("EmploymentS", 2010, "mean"),
list("EmploymentS", 2015, "mean")
),
dependent             = "EmploymentS",
unit.variable         = "country_id",
unit.names.variable   = "country",
time.variable         = "year",
treatment.identifier  = tid,
controls.identifier   = pool,
time.predictors.prior = pre_period,
time.optimize.ssr     = pre_period,
time.plot             = time_range[1]:time_range[2]
), error = function(e) NULL)
if (is.null(dp_i)) next
sp_i <- tryCatch(synth(dp_i), error = function(e) NULL)
if (is.null(sp_i)) next
act_i <- as.numeric(dp_i$Y1plot)
syn_i <- as.numeric(dp_i$Y0plot %*% sp_i$solution.w)
# RMSPE
v <- compute_rmspe(act_i, syn_i, years, treatment_year)
rmspe_results <- rbind(rmspe_results, data.frame(
Country    = tname,
Pre_RMSPE  = round(v["pre"],   4),
Post_RMSPE = round(v["post"],  4),
Ratio      = round(v["ratio"], 3),
stringsAsFactors = FALSE
))
# T-stat
treat_dummy  <- as.integer(years >= treatment_year)
ratio_series <- act_i / syn_i
mod    <- lm(ratio_series ~ treat_dummy)
coef_  <- summary(mod)$coefficients[2, ]
tstat_results <- rbind(tstat_results, data.frame(
Country = tname,
T_stat  = round(coef_["t value"],  3),
P_value = round(coef_["Pr(>|t|)"], 4),
Stars   = add_stars(coef_["t value"]),
stringsAsFactors = FALSE
))
}
rmspe_results <- rmspe_results %>% arrange(desc(Ratio))
tstat_results <- tstat_results %>% arrange(desc(abs(T_stat)))
rmspe_results$KSA <- ifelse(rmspe_results$Country == "Saudi Arabia", "\\dag", "")
tstat_results$KSA <- ifelse(tstat_results$Country == "Saudi Arabia", "\\dag", "")
SA_rmspe  <- rmspe_results %>% filter(Country == "Saudi Arabia")
SA_tstat  <- tstat_results %>% filter(Country == "Saudi Arabia")
n_total   <- nrow(rmspe_results)
n_above   <- sum(rmspe_results$Ratio >= SA_rmspe$Ratio)
pval_rank <- round(n_above / n_total, 3)
avg_effect <- mean(gap_SA[years >= treatment_year])
cum_effect <- sum(gap_SA[years >= treatment_year])
# ══════════════════════════════════════════════════════════════════════════════
#  LATEX TABLES  (all filenames start with EmploymentS_)
# ══════════════════════════════════════════════════════════════════════════════
# ── TABLE A: Predictor balance ─────────────────────────────────────────────────
pred_tab           <- synth_tables$tab.pred
pred_tab           <- round(as.data.frame(pred_tab), 3)
rownames(pred_tab) <- c(
"Government effectiveness (index)",
"Secondary education attainment (\\%)",
"Inflation rate (\\%)",
"Female labour force participation rate (\\%)",
"Services value added (\\% of GDP)",
"Services employment in 2000 (\\%)",
"Services employment in 2005 (\\%)",
"Services employment in 2010 (\\%)",
"Services employment in 2015 (\\%)"
)
colnames(pred_tab) <- c("Treated", "Synthetic", "Donor mean")
write_tex(
xtable(pred_tab,
caption = "Predictor Balance: Saudi Arabia vs.\\ Synthetic Control (Services Employment Model)",
label   = "tab:predictor_balance_emps"),
file       = paste0(OUT, "EmploymentS_Table_A_PredictorBalance.tex"),
include.rn = TRUE,
add_to_row = list(
pos     = list(nrow(pred_tab)),
command = paste0(
"\\midrule\n",
"\\multicolumn{", ncol(pred_tab) + 1, "}{p{\\linewidth}}{\\footnotesize ",
"\\textit{Notes:} Each row reports the pre-treatment period mean of a predictor ",
"for Saudi Arabia (Treated), its optimised synthetic counterpart (Synthetic), and the ",
"unweighted average of all donor countries (Donor mean). The synthetic control is ",
"constructed by minimising the pre-treatment root mean squared prediction error (RMSPE) ",
"of services employment. A close match between Treated and Synthetic confirms the ",
"synthetic control provides a credible counterfactual prior to the 2017 Vision 2030 ",
"reforms. Averages computed over the full pre-treatment period.}\\\\\n"
)
)
)
# ── TABLE B: Donor weights ─────────────────────────────────────────────────────
weights_tab <- synth_tables$tab.w %>%
rename(Country = unit.names, Weight = w.weights) %>%
filter(Weight > 1e-4) %>%
arrange(desc(Weight)) %>%
mutate(Weight              = round(Weight, 4),
`Cumulative weight` = round(cumsum(Weight), 4))
write_tex(
xtable(weights_tab,
caption = "Donor Country Weights in the Synthetic Control (Services Employment Model)",
label   = "tab:donor_weights_emps"),
file       = paste0(OUT, "EmploymentS_Table_B_DonorWeights.tex"),
add_to_row = list(
pos     = list(nrow(weights_tab)),
command = paste0(
"\\midrule\n",
"\\multicolumn{", ncol(weights_tab), "}{p{\\linewidth}}{\\footnotesize ",
"\\textit{Notes:} Weights assigned to each donor country in constructing ",
"synthetic Saudi Arabia for the services employment model. Weights are optimised ",
"by minimising the pre-treatment RMSPE subject to non-negativity and the constraint ",
"that they sum to one (Abadie, Diamond \\& Hainmueller, 2010). Only countries with ",
"strictly positive weight are shown. The cumulative weight column shows the share of ",
"the synthetic control accounted for by the top contributors.}\\\\\n"
)
)
)
# ── TABLE C: RMSPE ratios ──────────────────────────────────────────────────────
rmspe_print <- rmspe_results %>%
rename(`Pre-RMSPE`      = Pre_RMSPE,
`Post-RMSPE`     = Post_RMSPE,
`Post/Pre ratio` = Ratio,
` `              = KSA)
write_tex(
xtable(rmspe_print,
caption = "Post/Pre RMSPE Ratios: Saudi Arabia and Placebo Countries (Services Employment Model)",
label   = "tab:rmspe_ratio_emps"),
file       = paste0(OUT, "EmploymentS_Table_C_RMSPE_Ratio.tex"),
add_to_row = list(
pos     = list(nrow(rmspe_print)),
command = paste0(
"\\midrule\n",
"\\multicolumn{", ncol(rmspe_print), "}{p{\\linewidth}}{\\footnotesize ",
"\\textit{Notes:} Pre-RMSPE measures average prediction fit over the pre-treatment period; ",
"Post-RMSPE measures average deviation over 2017--2022. Both are in percentage points. ",
"The Post/Pre ratio is the primary permutation test statistic: a high ratio for ",
"Saudi Arabia (\\dag) relative to placebo units indicates the post-reform divergence ",
"is unlikely due to chance. Permutation $p$-value = ", pval_rank,
" (proportion of placebo units with ratio $\\geq$ Saudi Arabia\\textquotesingle s). ",
"Ratios $>$5 indicate strong effects; $>$10 indicate very strong effects.}\\\\\n"
)
)
)
# ── TABLE D: t-statistics ──────────────────────────────────────────────────────
tstat_print <- tstat_results %>%
rename(`$t$-statistic` = T_stat,
`$p$-value`     = P_value,
`Sig.`          = Stars,
` `             = KSA)
write_tex(
xtable(tstat_print,
caption = "Treatment Dummy $t$-Statistics: Saudi Arabia and Placebo Countries (Services Employment Model)",
label   = "tab:tstat_placebo_emps"),
file       = paste0(OUT, "EmploymentS_Table_D_Tstat_Placebo.tex"),
add_to_row = list(
pos     = list(nrow(tstat_print)),
command = paste0(
"\\midrule\n",
"\\multicolumn{", ncol(tstat_print), "}{p{\\linewidth}}{\\footnotesize ",
"\\textit{Notes:} $t$-statistics from regressing the ratio of observed to synthetic ",
"services employment on a post-treatment dummy (1 from 2017 onward, 0 before), ",
"estimated for Saudi Arabia (\\dag) and each donor country as a placebo. A large, ",
"significant positive $t$-statistic for Saudi Arabia combined with insignificant ",
"estimates for most placebo units supports a causal interpretation of the Vision 2030 ",
"reform effect on services employment. ",
"Significance levels: * $p<0.10$,\\ ** $p<0.05$,\\ *** $p<0.01$.}\\\\\n"
)
)
)
# ── TABLE E: Annual treatment effects ─────────────────────────────────────────
effects_tab <- results_df %>%
filter(year >= treatment_year) %>%
mutate(`\\% deviation` = round((KSA / synthetic - 1) * 100, 2)) %>%
select(year, KSA, synthetic, gap, `\\% deviation`) %>%
rename(
Year                         = year,
`Saudi Arabia (observed)`    = KSA,
`Synthetic (counterfactual)` = synthetic,
`Treatment effect (pp)`      = gap
) %>%
mutate(
Year = as.integer(Year),
across(where(is.double), ~ round(.x, 3))
)
rownames(effects_tab) <- NULL
write_tex(
xtable(effects_tab,
caption = "Estimated Annual Treatment Effects on Services Employment (2017--2022)",
label   = "tab:annual_effects_emps"),
file       = paste0(OUT, "EmploymentS_Table_E_AnnualEffects.tex"),
add_to_row = list(
pos     = list(nrow(effects_tab)),
command = paste0(
"\\midrule\n",
"\\multicolumn{5}{p{\\linewidth}}{\\footnotesize ",
"\\textit{Notes:} All values expressed in percentage points (\\% of total employment). ",
"Treatment effect (pp) = Saudi Arabia observed services employment share minus ",
"synthetic counterfactual, computed year by year. The \\% deviation expresses this ",
"as a share of the synthetic value. Positive values indicate services employment ",
"exceeded the level expected absent the Vision 2030 economic diversification reforms. ",
"Average annual treatment effect over 2017--2022: ",
round(avg_effect, 2), " pp. ",
"Cumulative effect: ", round(cum_effect, 2), " pp.}\\\\\n"
)
)
)
# ── TABLE F: Summary inference statistics ─────────────────────────────────────
summary_tab <- data.frame(
Statistic = c(
"Pre-treatment RMSPE (Saudi Arabia)",
"Post-treatment RMSPE (Saudi Arabia)",
"Post/Pre RMSPE ratio (Saudi Arabia)",
"Permutation $p$-value (RMSPE-ratio test)",
"Treatment dummy $t$-statistic (Saudi Arabia)",
"Average annual treatment effect (pp)",
"Cumulative treatment effect, 2017--2022 (pp)",
"Number of post-treatment years",
"Donor pool size (countries)"
),
Value = c(
round(SA_rmspe$Pre_RMSPE,  4),
round(SA_rmspe$Post_RMSPE, 4),
round(SA_rmspe$Ratio,      3),
pval_rank,
SA_tstat$Stars,
round(avg_effect, 3),
round(cum_effect, 3),
as.character(sum(years >= treatment_year)),
as.character(length(donor_ids))
),
stringsAsFactors = FALSE
)
write_tex(
xtable(summary_tab,
caption = "Summary Inference Statistics: Synthetic Control Analysis (Services Employment Model)",
label   = "tab:summary_inference_emps"),
file       = paste0(OUT, "EmploymentS_Table_F_SummaryInference.tex"),
add_to_row = list(
pos     = list(nrow(summary_tab)),
command = paste0(
"\\midrule\n",
"\\multicolumn{", ncol(summary_tab), "}{p{\\linewidth}}{\\footnotesize ",
"\\textit{Notes:} Pre- and post-treatment RMSPE are in percentage points. ",
"The Post/Pre RMSPE ratio is the main permutation test statistic; the $p$-value ",
"equals the share of placebo units with a ratio at least as large as Saudi Arabia\\textquotesingle s ",
"(see Table~\\ref{tab:rmspe_ratio_emps}). A low $p$-value indicates the post-2017 ",
"services employment deviation is unlikely attributable to chance. Effects are reported ",
"in percentage points of total employment. ",
"Significance: * $p<0.10$,\\ ** $p<0.05$,\\ *** $p<0.01$.}\\\\\n"
)
)
)
# ── FIGURE 5: RMSPE distribution bar chart ────────────────────────────────────
p4 <- rmspe_results %>%
mutate(highlight = Country == "Saudi Arabia") %>%
ggplot(aes(x = reorder(Country, Ratio), y = Ratio, fill = highlight)) +
geom_col(width = 0.68, alpha = 0.88) +
geom_hline(yintercept = SA_rmspe$Ratio,
linetype = "dashed", colour = col_SA_bar, linewidth = 0.55) +
coord_flip() +
scale_fill_manual(values = c("TRUE" = col_SA_bar, "FALSE" = "grey72")) +
annotate("text",
x     = 0.7,
y     = SA_rmspe$Ratio * 1.04,
label = paste0("KSA (ratio = ", round(SA_rmspe$Ratio, 2), ")"),
hjust = 0, size = 2.8, colour = col_SA_bar) +
labs(
title    = "Post/Pre RMSPE Ratios: Saudi Arabia vs. Placebo Units (Services Employment)",
subtitle = "Permutation inference distribution under the placebo-in-space test",
x        = NULL,
y        = "Post-to-pre RMSPE ratio",
caption  = paste0(
"Note: Each bar shows the Post/Pre RMSPE ratio when the respective country ",
"is treated as the reform recipient. Saudi Arabia (green) ranks first. ",
"Permutation p-value = ", pval_rank,
" (share of units with ratio \u2265 Saudi Arabia\u2019s ratio). ",
"A low p-value supports a causal interpretation of the Vision 2030 effect on services employment.")
) +
theme_academic() +
theme(legend.position = "none",
axis.text.y = element_text(size = 8.5))
ggsave(paste0(OUT, "EmploymentS_RMSPE_Distribution.pdf"),
p4, width = 8.5, height = 5.8, device = cairo_pdf)
ggsave(paste0(OUT, "EmploymentS_RMSPE_Distribution.png"),
p4, width = 8.5, height = 5.8, dpi = 320)
# ── Save CSVs ──────────────────────────────────────────────────────────────────
write.csv(results_df,    paste0(OUT, "EmploymentS_SCM_results.csv"), row.names = FALSE)
write.csv(rmspe_results, paste0(OUT, "EmploymentS_RMSPE_all.csv"),   row.names = FALSE)
write.csv(tstat_results, paste0(OUT, "EmploymentS_Tstat_all.csv"),   row.names = FALSE)
# ── Summary ────────────────────────────────────────────────────────────────────
cat("\n\n============================================================\n")
cat(" All outputs saved to:\n ", OUT, "\n")
cat("------------------------------------------------------------\n")
cat(" FIGURES (PDF + PNG):\n")
cat("   EmploymentS_SCM_path            - Observed vs synthetic path\n")
cat("   EmploymentS_Gap                 - Treatment effect gap series\n")
cat("   EmploymentS_PlaceboSpace        - Placebo spaghetti chart\n")
cat("   EmploymentS_CombinedPanel       - All three panels stacked\n")
cat("   EmploymentS_RMSPE_Distribution  - RMSPE ratio bar chart\n")
cat(" TABLES (.tex, Overleaf-ready with booktabs + notes):\n")
cat("   EmploymentS_Table_A_PredictorBalance\n")
cat("   EmploymentS_Table_B_DonorWeights\n")
cat("   EmploymentS_Table_C_RMSPE_Ratio\n")
cat("   EmploymentS_Table_D_Tstat_Placebo\n")
cat("   EmploymentS_Table_E_AnnualEffects\n")
cat("   EmploymentS_Table_F_SummaryInference\n")
cat(" CSVs:\n")
cat("   EmploymentS_SCM_results | EmploymentS_RMSPE_all | EmploymentS_Tstat_all\n")
cat("============================================================\n")
