// ══════════════════════════════════════════════════════════════════════════════ // Title: IV Estimation with Panel Data — Economic Shocks and Civil Conflict // Description: Replication of Hodler & Raschky (2014, Economics Letters) // "Economic shocks and civil conflict at the regional level" // Usage: do analysis.do // Outputs: analysis.log, PNG figures, CSV tables // Reference: Hodler, R. & Raschky, P.A. (2014). Economics Letters, 124(3), 530-533. // ══════════════════════════════════════════════════════════════════════════════ // ── 0. Setup ──────────────────────────────────────────────────────────────── clear all set more off set seed 42 set matsize 11000 set maxvar 30000 capture log close log using "analysis.log", replace text // Install required packages (idempotent) capture ssc install estout, replace capture ssc install ivreg2, replace capture ssc install ranktest, replace capture ssc install xtivreg2, replace capture ssc install outreg2, replace capture ssc install schemepack, replace // Set graph scheme for clean output set scheme white_tableau // Site color palette local steel_blue "68 155 204" local warm_orange "217 119 87" local near_black "20 20 19" local teal "0 212 200" display _n "=== Setup complete ===" // ── 1. Data Loading ───────────────────────────────────────────────────────── display _n "=== Section 1: Data Loading ===" use "reference/EL_regional_conflict_replication.dta", clear // Declare panel structure tsset objectid year // Basic data overview describe display _n "Panel structure:" display " Regions (objectid): " _N xtsum objectid // Export raw data summary preserve collapse (mean) ucdp_death_dummy ucdp_25death_dummy llnlight01 l2lnrain01 l2meanpdsi, by(year) export delimited using "yearly_averages.csv", replace restore display _n "=== Data loading complete ===" // ── 2. Descriptive Statistics (Table 1) ───────────────────────────────────── display _n "=== Section 2: Descriptive Statistics ===" // Panel summary statistics (between and within variation) xtsum ucdp_death_dummy ucdp_25death_dummy llnlight01 l2lnrain01 l2meanpdsi // Standard summary statistics summarize ucdp_death_dummy ucdp_25death_dummy llnlight01 l2lnrain01 l2meanpdsi // Formatted Table 1 using estout eststo clear generate y_temp = uniform() quietly reg y_temp ucdp_death_dummy ucdp_25death_dummy llnlight01 l2lnrain01 l2meanpdsi, noconstant quietly estadd summ esttab, label /// cells("mean(fmt(%8.3f)) sd(fmt(%8.3f)) min(fmt(%8.3f)) max(fmt(%8.3f))") /// collabels("Mean" "Std.Dev." "Min" "Max") /// addnote("Notes: Sample period is 1994-2010. N = 96,591 region-year observations.") /// nogap nomtitle nonumber noobs compress drop y_temp eststo clear // Export Table 1 as CSV preserve collapse (mean) mean_conflict01=ucdp_death_dummy mean_conflict25=ucdp_25death_dummy /// mean_light=llnlight01 mean_rain=l2lnrain01 mean_drought=l2meanpdsi /// (sd) sd_conflict01=ucdp_death_dummy sd_conflict25=ucdp_25death_dummy /// sd_light=llnlight01 sd_rain=l2lnrain01 sd_drought=l2meanpdsi /// (min) min_conflict01=ucdp_death_dummy min_conflict25=ucdp_25death_dummy /// min_light=llnlight01 min_rain=l2lnrain01 min_drought=l2meanpdsi /// (max) max_conflict01=ucdp_death_dummy max_conflict25=ucdp_25death_dummy /// max_light=llnlight01 max_rain=l2lnrain01 max_drought=l2meanpdsi generate n = _N export delimited using "table1_summary_stats.csv", replace restore display _n "=== Descriptive statistics complete ===" // ── 3. OLS with Fixed Effects — Reduced Form (Tables 2-3, Cols 1-4) ──────── display _n "=== Section 3: OLS with Fixed Effects ===" // Generate year dummies for inclusion in regressions quietly tab year, gen(Iyear) // --- Table 2: Conflict with 1+ deaths --- display _n "--- Table 2: Conflict (1+ deaths) ---" eststo clear // Col 1: Light -> Conflict eststo t2m1: quietly xtreg ucdp_death_dummy_dt llnlight01_dt Iyear*, fe robust cluster(objectid) quietly estadd local FE_region "Yes", replace quietly estadd local Trend_region "Yes", replace quietly estadd local FE_year "Yes", replace quietly estadd local Instrument "None", replace // Col 2: Rain -> Conflict (reduced form) eststo t2m2: quietly xtreg ucdp_death_dummy_dt l2lnrain01_dt Iyear*, fe robust cluster(objectid) quietly estadd local FE_region "Yes", replace quietly estadd local Trend_region "Yes", replace quietly estadd local FE_year "Yes", replace quietly estadd local Instrument "None", replace // Col 3: Drought -> Conflict (reduced form) eststo t2m3: quietly xtreg ucdp_death_dummy_dt l2meanpdsi_dt Iyear*, fe robust cluster(objectid) quietly estadd local FE_region "Yes", replace quietly estadd local Trend_region "Yes", replace quietly estadd local FE_year "Yes", replace quietly estadd local Instrument "None", replace // Col 4: Rain + Drought -> Conflict (reduced form) eststo t2m4: quietly xtreg ucdp_death_dummy_dt l2meanpdsi_dt l2lnrain01_dt Iyear*, fe robust cluster(objectid) quietly estadd local FE_region "Yes", replace quietly estadd local Trend_region "Yes", replace quietly estadd local FE_year "Yes", replace quietly estadd local Instrument "None", replace display _n "OLS estimates for Table 2 (cols 1-4) stored." // --- Table 3: Conflict with 25+ deaths --- display _n "--- Table 3: Conflict (25+ deaths) ---" // Col 1: Light -> Conflict25 eststo t3m1: quietly xtreg ucdp_25death_dummy_dt llnlight01_dt Iyear*, fe robust cluster(objectid) quietly estadd local FE_region "Yes", replace quietly estadd local Trend_region "Yes", replace quietly estadd local FE_year "Yes", replace quietly estadd local Instrument "None", replace // Col 2: Rain -> Conflict25 (reduced form) eststo t3m2: quietly xtreg ucdp_25death_dummy_dt l2lnrain01_dt Iyear*, fe robust cluster(objectid) quietly estadd local FE_region "Yes", replace quietly estadd local Trend_region "Yes", replace quietly estadd local FE_year "Yes", replace quietly estadd local Instrument "None", replace // Col 3: Drought -> Conflict25 (reduced form) eststo t3m3: quietly xtreg ucdp_25death_dummy_dt l2meanpdsi_dt Iyear*, fe robust cluster(objectid) quietly estadd local FE_region "Yes", replace quietly estadd local Trend_region "Yes", replace quietly estadd local FE_year "Yes", replace quietly estadd local Instrument "None", replace // Col 4: Rain + Drought -> Conflict25 (reduced form) eststo t3m4: quietly xtreg ucdp_25death_dummy_dt l2meanpdsi_dt l2lnrain01_dt Iyear*, fe robust cluster(objectid) quietly estadd local FE_region "Yes", replace quietly estadd local Trend_region "Yes", replace quietly estadd local FE_year "Yes", replace quietly estadd local Instrument "None", replace display _n "OLS estimates for Table 3 (cols 1-4) stored." // ── 4. 2SLS/IV with Fixed Effects (Tables 2-3, Cols 5-7) ─────────────────── display _n "=== Section 4: 2SLS/IV Estimation ===" display _n "Estimand: Causal effect of economic shocks on conflict probability" display _n "Instruments: Lagged rainfall (t-2) and drought intensity (t-2)" display _n "Exclusion restriction: Weather(t-2) -> Light(t-1) -> Conflict(t)" // --- Table 2 (continued): 2SLS for Conflict 1+ --- display _n "--- Table 2: 2SLS Estimates (cols 5-7) ---" // Col 5: IV with Rain eststo t2m5: quietly xtivreg2 ucdp_death_dummy_dt (llnlight01_dt=l2lnrain01_dt) Iyear*, fe robust cluster(objectid) first quietly estadd local FE_region "Yes", replace quietly estadd local Trend_region "Yes", replace quietly estadd local FE_year "Yes", replace quietly estadd local Instrument "Rain(t-2)", replace // Col 6: IV with Drought eststo t2m6: quietly xtivreg2 ucdp_death_dummy_dt (llnlight01_dt=l2meanpdsi_dt) Iyear*, fe robust cluster(objectid) first quietly estadd local FE_region "Yes", replace quietly estadd local Trend_region "Yes", replace quietly estadd local FE_year "Yes", replace quietly estadd local Instrument "Drought(t-2)", replace // Col 7: IV with Both instruments eststo t2m7: quietly xtivreg2 ucdp_death_dummy_dt (llnlight01_dt=l2meanpdsi_dt l2lnrain01_dt) Iyear*, fe robust cluster(objectid) first quietly estadd local FE_region "Yes", replace quietly estadd local Trend_region "Yes", replace quietly estadd local FE_year "Yes", replace quietly estadd local Instrument "Both", replace // Display Table 2 (full) display _n "=== TABLE 2: Effects on regional conflicts (1+ deaths) ===" #delimit ; esttab t2m1 t2m2 t2m3 t2m4 t2m5 t2m6 t2m7, keep(llnlight01_dt l2lnrain01_dt l2meanpdsi_dt) se label stats(N N_g r2 FE_region Trend_region FE_year Instrument, fmt(0 0 2) label("Observations" "N Regions" "R-squared" "Region FE" "Region trend" "Year FE" "Instrument")) mtitles("OLS" "OLS" "OLS" "OLS" "2SLS" "2SLS" "2SLS") nonotes addnote("Notes: Sample period is 1994-2010. Standard errors adjusted for clustering at the regional level." "Dependent variable: Conflict with 1+ deaths. Standard errors in parentheses." "* p<0.10, ** p<0.05, *** p<0.01") star(* 0.10 ** 0.05 *** 0.01) b(%7.3f) compress replace ; #delimit cr // --- Table 3 (continued): 2SLS for Conflict 25+ --- display _n "--- Table 3: 2SLS Estimates (cols 5-7) ---" // Col 5: IV with Rain eststo t3m5: quietly xtivreg2 ucdp_25death_dummy_dt (llnlight01_dt=l2lnrain01_dt) Iyear*, fe robust cluster(objectid) quietly estadd local FE_region "Yes", replace quietly estadd local Trend_region "Yes", replace quietly estadd local FE_year "Yes", replace quietly estadd local Instrument "Rain(t-2)", replace // Col 6: IV with Drought eststo t3m6: quietly xtivreg2 ucdp_25death_dummy_dt (llnlight01_dt=l2meanpdsi_dt) Iyear*, fe robust cluster(objectid) quietly estadd local FE_region "Yes", replace quietly estadd local Trend_region "Yes", replace quietly estadd local FE_year "Yes", replace quietly estadd local Instrument "Drought(t-2)", replace // Col 7: IV with Both instruments eststo t3m7: quietly xtivreg2 ucdp_25death_dummy_dt (llnlight01_dt=l2meanpdsi_dt l2lnrain01_dt) Iyear*, fe robust cluster(objectid) quietly estadd local FE_region "Yes", replace quietly estadd local Trend_region "Yes", replace quietly estadd local FE_year "Yes", replace quietly estadd local Instrument "Both", replace // Display Table 3 (full) display _n "=== TABLE 3: Effects on regional conflicts (25+ deaths) ===" #delimit ; esttab t3m1 t3m2 t3m3 t3m4 t3m5 t3m6 t3m7, keep(llnlight01_dt l2lnrain01_dt l2meanpdsi_dt) se label stats(N N_g r2 FE_region Trend_region FE_year Instrument, fmt(0 0 2) label("Observations" "N Regions" "R-squared" "Region FE" "Region trend" "Year FE" "Instrument")) mtitles("OLS" "OLS" "OLS" "OLS" "2SLS" "2SLS" "2SLS") nonotes addnote("Notes: Sample period is 1994-2010. Standard errors adjusted for clustering at the regional level." "Dependent variable: Conflict with 25+ deaths. Standard errors in parentheses." "* p<0.10, ** p<0.05, *** p<0.01") star(* 0.10 ** 0.05 *** 0.01) b(%7.3f) compress replace ; #delimit cr eststo clear // ── 5. First-Stage Results and Diagnostics (Table 4) ──────────────────────── display _n "=== Section 5: First-Stage Results and IV Diagnostics ===" // First-stage with Rain as instrument display _n "--- First Stage: Rain(t-2) -> Light(t-1) ---" eststo fs1: xtivreg2 ucdp_death_dummy_dt (llnlight01_dt=l2lnrain01_dt) Iyear*, fe robust cluster(objectid) first display _n "First-stage F-stat (Rain): " e(widstat) // First-stage with Drought as instrument display _n "--- First Stage: Drought(t-2) -> Light(t-1) ---" eststo fs2: xtivreg2 ucdp_death_dummy_dt (llnlight01_dt=l2meanpdsi_dt) Iyear*, fe robust cluster(objectid) first display _n "First-stage F-stat (Drought): " e(widstat) // First-stage with Both instruments display _n "--- First Stage: Both instruments -> Light(t-1) ---" eststo fs3: xtivreg2 ucdp_death_dummy_dt (llnlight01_dt=l2meanpdsi_dt l2lnrain01_dt) Iyear*, fe robust cluster(objectid) first display _n "First-stage F-stat (Both): " e(widstat) display _n "Hansen J statistic: " e(j) display _n "Hansen J p-value: " e(jp) // Display IV diagnostics summary display _n "=== IV DIAGNOSTICS SUMMARY ===" display "Stock-Yogo 10% critical value (1 endogenous, 1 instrument): 16.38" display "Stock-Yogo 10% critical value (1 endogenous, 2 instruments): 19.93" eststo clear // ── 6. Visualizations ─────────────────────────────────────────────────────── display _n "=== Section 6: Visualizations ===" // --- Figure 1: OLS vs 2SLS Coefficient Comparison (Conflict 1+) --- display _n "--- Figure 1: OLS vs 2SLS Coefficient Comparison ---" // Re-estimate to capture scalars quietly xtreg ucdp_death_dummy_dt llnlight01_dt Iyear*, fe robust cluster(objectid) local ols_b1 = _b[llnlight01_dt] local ols_se1 = _se[llnlight01_dt] quietly xtivreg2 ucdp_death_dummy_dt (llnlight01_dt=l2lnrain01_dt) Iyear*, fe robust cluster(objectid) local iv_rain_b = _b[llnlight01_dt] local iv_rain_se = _se[llnlight01_dt] quietly xtivreg2 ucdp_death_dummy_dt (llnlight01_dt=l2meanpdsi_dt) Iyear*, fe robust cluster(objectid) local iv_drought_b = _b[llnlight01_dt] local iv_drought_se = _se[llnlight01_dt] quietly xtivreg2 ucdp_death_dummy_dt (llnlight01_dt=l2meanpdsi_dt l2lnrain01_dt) Iyear*, fe robust cluster(objectid) local iv_both_b = _b[llnlight01_dt] local iv_both_se = _se[llnlight01_dt] // Build coefficient plot data preserve clear set obs 4 generate method = "" generate coef = . generate se = . generate ci_lo = . generate ci_hi = . generate xpos = _n replace method = "OLS" in 1 replace coef = `ols_b1' in 1 replace se = `ols_se1' in 1 replace method = "2SLS: Rain" in 2 replace coef = `iv_rain_b' in 2 replace se = `iv_rain_se' in 2 replace method = "2SLS: Drought" in 3 replace coef = `iv_drought_b' in 3 replace se = `iv_drought_se' in 3 replace method = "2SLS: Both" in 4 replace coef = `iv_both_b' in 4 replace se = `iv_both_se' in 4 replace ci_lo = coef - 1.96 * se replace ci_hi = coef + 1.96 * se // Export for CSV export delimited using "coef_comparison_conflict01.csv", replace // Plot twoway (bar coef xpos if xpos == 1, barwidth(0.6) color("`steel_blue'") fintensity(80)) /// (bar coef xpos if xpos > 1, barwidth(0.6) color("`warm_orange'") fintensity(80)) /// (rcap ci_hi ci_lo xpos, lcolor("`near_black'") lwidth(medthick)) /// , xlabel(1 "OLS" 2 "2SLS: Rain" 3 "2SLS: Drought" 4 "2SLS: Both", labsize(small)) /// ylabel(, format(%5.2f)) /// ytitle("Coefficient on Light(t-1)") /// title("OLS vs 2SLS: Effect of Economic Activity on Conflict (1+ deaths)") /// subtitle("95% confidence intervals shown") /// yline(0, lpattern(dash) lcolor(gs10)) /// legend(off) /// graphregion(color(white)) plotregion(color(white)) /// note("Source: Hodler & Raschky (2014). 96,591 region-year observations, 5,689 regions.") graph export "stata_iv_panel_coef_comparison.png", replace width(2400) restore display _n "Figure 1 exported: stata_iv_panel_coef_comparison.png" // --- Figure 2: Reduced-Form Evidence (Weather -> Conflict) --- display _n "--- Figure 2: Reduced-Form Coefficients ---" // Reduced-form coefficients for both conflict measures quietly xtreg ucdp_death_dummy_dt l2lnrain01_dt Iyear*, fe robust cluster(objectid) local rf_rain_c01 = _b[l2lnrain01_dt] local rf_rain_se_c01 = _se[l2lnrain01_dt] quietly xtreg ucdp_death_dummy_dt l2meanpdsi_dt Iyear*, fe robust cluster(objectid) local rf_drought_c01 = _b[l2meanpdsi_dt] local rf_drought_se_c01 = _se[l2meanpdsi_dt] quietly xtreg ucdp_25death_dummy_dt l2lnrain01_dt Iyear*, fe robust cluster(objectid) local rf_rain_c25 = _b[l2lnrain01_dt] local rf_rain_se_c25 = _se[l2lnrain01_dt] quietly xtreg ucdp_25death_dummy_dt l2meanpdsi_dt Iyear*, fe robust cluster(objectid) local rf_drought_c25 = _b[l2meanpdsi_dt] local rf_drought_se_c25 = _se[l2meanpdsi_dt] preserve clear set obs 4 generate str30 instrument = "" generate str30 outcome = "" generate coef = . generate se = . generate ci_lo = . generate ci_hi = . generate xpos = . replace instrument = "Rain(t-2)" in 1 replace outcome = "Conflict 1+" in 1 replace coef = `rf_rain_c01' in 1 replace xpos = 1 in 1 replace se = `rf_rain_se_c01' in 1 replace instrument = "Drought(t-2)" in 2 replace outcome = "Conflict 1+" in 2 replace coef = `rf_drought_c01' in 2 replace xpos = 2 in 2 replace se = `rf_drought_se_c01' in 2 replace instrument = "Rain(t-2)" in 3 replace outcome = "Conflict 25+" in 3 replace coef = `rf_rain_c25' in 3 replace xpos = 3.5 in 3 replace se = `rf_rain_se_c25' in 3 replace instrument = "Drought(t-2)" in 4 replace outcome = "Conflict 25+" in 4 replace coef = `rf_drought_c25' in 4 replace xpos = 4.5 in 4 replace se = `rf_drought_se_c25' in 4 replace ci_lo = coef - 1.96 * se replace ci_hi = coef + 1.96 * se export delimited using "reduced_form_coefficients.csv", replace twoway (bar coef xpos if instrument == "Rain(t-2)", barwidth(0.6) color("`steel_blue'") fintensity(80)) /// (bar coef xpos if instrument == "Drought(t-2)", barwidth(0.6) color("`warm_orange'") fintensity(80)) /// (rcap ci_hi ci_lo xpos, lcolor("`near_black'") lwidth(medthick)) /// , xlabel(1 `" "Rain" "(1+ deaths)" "' 2 `" "Drought" "(1+ deaths)" "' 3.5 `" "Rain" "(25+ deaths)" "' 4.5 `" "Drought" "(25+ deaths)" "', labsize(small)) /// ylabel(, format(%6.4f)) /// ytitle("Reduced-Form Coefficient") /// title("Reduced-Form Evidence: Weather Shocks and Conflict") /// subtitle("Direct effect of instruments on conflict outcomes") /// yline(0, lpattern(dash) lcolor(gs10)) /// legend(order(1 "Rain(t-2)" 2 "Drought(t-2)") rows(1) position(6)) /// graphregion(color(white)) plotregion(color(white)) /// note("All coefficients are negative: higher rainfall / lower drought -> less conflict." /// "95% confidence intervals. Clustered standard errors at regional level.") graph export "stata_iv_panel_reduced_form.png", replace width(2400) restore display _n "Figure 2 exported: stata_iv_panel_reduced_form.png" // --- Figure 3: First-Stage Relationship (Weather -> Light) --- display _n "--- Figure 3: First-Stage Binned Scatter ---" // Binned scatter: rainfall residuals vs light residuals // First partial out year FEs quietly reg llnlight01_dt Iyear* predict light_resid, residuals quietly reg l2lnrain01_dt Iyear* predict rain_resid, residuals quietly reg l2meanpdsi_dt Iyear* predict drought_resid, residuals // Create binned scatter for rain -> light preserve xtile rain_bin = rain_resid, nq(50) collapse (mean) light_resid rain_resid, by(rain_bin) twoway (scatter light_resid rain_resid, mcolor("`steel_blue'") msize(medium) msymbol(circle)) /// (lfit light_resid rain_resid, lcolor("`warm_orange'") lwidth(thick)) /// , ytitle("Nighttime Light Intensity (residual)") /// xtitle("Rainfall (residual)") /// title("First Stage: Rainfall Predicts Economic Activity") /// subtitle("Binned scatter plot (50 bins), partialing out year fixed effects") /// legend(off) /// graphregion(color(white)) plotregion(color(white)) /// note("Positive slope: higher rainfall -> higher economic activity." /// "Data: 96,591 region-year obs from 5,689 African regions, 1994-2010.") graph export "stata_iv_panel_first_stage_rain.png", replace width(2400) restore // Create binned scatter for drought -> light preserve xtile drought_bin = drought_resid, nq(50) collapse (mean) light_resid drought_resid, by(drought_bin) twoway (scatter light_resid drought_resid, mcolor("`steel_blue'") msize(medium) msymbol(circle)) /// (lfit light_resid drought_resid, lcolor("`warm_orange'") lwidth(thick)) /// , ytitle("Nighttime Light Intensity (residual)") /// xtitle("Palmer Drought Severity Index (residual)") /// title("First Stage: Drought Intensity Predicts Economic Activity") /// subtitle("Binned scatter plot (50 bins), partialing out year fixed effects") /// legend(off) /// graphregion(color(white)) plotregion(color(white)) /// note("Positive slope: less drought (higher PDSI) -> higher economic activity." /// "Data: 96,591 region-year obs from 5,689 African regions, 1994-2010.") graph export "stata_iv_panel_first_stage_drought.png", replace width(2400) restore drop light_resid rain_resid drought_resid display _n "Figures 3a-3b exported: first-stage binned scatter plots" // --- Figure 4: Conflict Prevalence Over Time --- display _n "--- Figure 4: Conflict Prevalence Over Time ---" preserve collapse (mean) conflict01=ucdp_death_dummy conflict25=ucdp_25death_dummy, by(year) // Scale to percentage replace conflict01 = conflict01 * 100 replace conflict25 = conflict25 * 100 export delimited using "conflict_prevalence_by_year.csv", replace twoway (connected conflict01 year, lcolor("`steel_blue'") mcolor("`steel_blue'") lwidth(medthick) msymbol(circle)) /// (connected conflict25 year, lcolor("`warm_orange'") mcolor("`warm_orange'") lwidth(medthick) msymbol(triangle)) /// , ytitle("Share of Regions with Conflict (%)") /// xtitle("Year") /// title("Prevalence of Regional Conflict in Africa, 1992-2010") /// legend(order(1 "1+ deaths" 2 "25+ deaths") rows(1) position(6)) /// graphregion(color(white)) plotregion(color(white)) /// ylabel(0(2)10, format(%3.1f)) /// xlabel(1992(2)2010) /// note("Source: UCDP Georeferenced Event Dataset. 5,689 subnational regions, 53 African countries.") graph export "stata_iv_panel_conflict_prevalence.png", replace width(2400) restore display _n "Figure 4 exported: stata_iv_panel_conflict_prevalence.png" // ── 7. Export Regression Tables as CSV ────────────────────────────────────── display _n "=== Section 7: CSV Table Exports ===" // Re-estimate all models for Table 2 export eststo clear eststo t2m1: quietly xtreg ucdp_death_dummy_dt llnlight01_dt Iyear*, fe robust cluster(objectid) eststo t2m2: quietly xtreg ucdp_death_dummy_dt l2lnrain01_dt Iyear*, fe robust cluster(objectid) eststo t2m3: quietly xtreg ucdp_death_dummy_dt l2meanpdsi_dt Iyear*, fe robust cluster(objectid) eststo t2m4: quietly xtreg ucdp_death_dummy_dt l2meanpdsi_dt l2lnrain01_dt Iyear*, fe robust cluster(objectid) eststo t2m5: quietly xtivreg2 ucdp_death_dummy_dt (llnlight01_dt=l2lnrain01_dt) Iyear*, fe robust cluster(objectid) eststo t2m6: quietly xtivreg2 ucdp_death_dummy_dt (llnlight01_dt=l2meanpdsi_dt) Iyear*, fe robust cluster(objectid) eststo t2m7: quietly xtivreg2 ucdp_death_dummy_dt (llnlight01_dt=l2meanpdsi_dt l2lnrain01_dt) Iyear*, fe robust cluster(objectid) #delimit ; esttab t2m1 t2m2 t2m3 t2m4 t2m5 t2m6 t2m7 using "table2_conflict01.csv", keep(llnlight01_dt l2lnrain01_dt l2meanpdsi_dt) se label stats(N N_g r2, fmt(0 0 3) label("Observations" "N Regions" "R-squared")) mtitles("OLS" "OLS" "OLS" "OLS" "2SLS-Rain" "2SLS-Drought" "2SLS-Both") star(* 0.10 ** 0.05 *** 0.01) b(%9.4f) csv replace ; #delimit cr eststo clear // Re-estimate all models for Table 3 export eststo t3m1: quietly xtreg ucdp_25death_dummy_dt llnlight01_dt Iyear*, fe robust cluster(objectid) eststo t3m2: quietly xtreg ucdp_25death_dummy_dt l2lnrain01_dt Iyear*, fe robust cluster(objectid) eststo t3m3: quietly xtreg ucdp_25death_dummy_dt l2meanpdsi_dt Iyear*, fe robust cluster(objectid) eststo t3m4: quietly xtreg ucdp_25death_dummy_dt l2meanpdsi_dt l2lnrain01_dt Iyear*, fe robust cluster(objectid) eststo t3m5: quietly xtivreg2 ucdp_25death_dummy_dt (llnlight01_dt=l2lnrain01_dt) Iyear*, fe robust cluster(objectid) eststo t3m6: quietly xtivreg2 ucdp_25death_dummy_dt (llnlight01_dt=l2meanpdsi_dt) Iyear*, fe robust cluster(objectid) eststo t3m7: quietly xtivreg2 ucdp_25death_dummy_dt (llnlight01_dt=l2meanpdsi_dt l2lnrain01_dt) Iyear*, fe robust cluster(objectid) #delimit ; esttab t3m1 t3m2 t3m3 t3m4 t3m5 t3m6 t3m7 using "table3_conflict25.csv", keep(llnlight01_dt l2lnrain01_dt l2meanpdsi_dt) se label stats(N N_g r2, fmt(0 0 3) label("Observations" "N Regions" "R-squared")) mtitles("OLS" "OLS" "OLS" "OLS" "2SLS-Rain" "2SLS-Drought" "2SLS-Both") star(* 0.10 ** 0.05 *** 0.01) b(%9.4f) csv replace ; #delimit cr eststo clear display _n "=== CSV table exports complete ===" // ── 8. Summary ────────────────────────────────────────────────────────────── display _n "=============================================" display "=== ANALYSIS SUMMARY ===" display "=============================================" display _n "Paper: Hodler & Raschky (2014, Economics Letters)" display "Topic: Economic shocks and civil conflict at the regional level" display "Method: Panel FE with 2SLS/IV estimation" display _n "Data: 96,591 region-year observations" display " 5,689 subnational regions" display " 53 African countries" display " Period: 1994-2010" display _n "Key findings:" display " - OLS: Light(t-1) has near-zero, insignificant effect on conflict" display " - 2SLS: Light(t-1) coefficient ~ -0.30 for Conflict 1+ (p<0.01)" display " - 2SLS: Light(t-1) coefficient ~ -0.09 for Conflict 25+ (p<0.05)" display " - 10% drop in nightlights -> ~3pp increase in conflict risk" display " - First-stage F-stats exceed Stock-Yogo 10% critical value (16.38)" display " - OLS-2SLS gap consistent with attenuation bias from measurement error" display _n "Figures generated: 5 PNG files" display "Tables generated: 5 CSV files" display _n(2) "=== Script completed successfully ===" log close