Difference-in-Differences: Conflict Impact on Agricultural Output#

This notebook is used to visualize the results of a DiD conducted to estimate the impact of conflict on agricultural yield in Ehtiopia during the Tigray and Amhara conflicts.

Assumptions & Design Decisions#

Dependent variable: log(EVI) — the log of Enhanced Vegetation Index, a satellite-derived measure of vegetation greenness used as a proxy for agricultural productivity.

Identification strategy: Two-way fixed effects (entity + time) panel regression with a binary DiD interaction term (treated_post = NewConflict × Post_t).

Conflict classification:

  • Non-violent event types (Protests, Strategic developments) are dropped from the conflict data before classification.

  • Regions are classified as New Conflict (treated) if they had low/no conflict pre-treatment and exceeded the conflict threshold post-treatment.

  • Regions with consistently low conflict (both pre and post) are classified as No/Low Conflict (control).

  • Regions with persistent or reduced conflict are excluded — they don’t fit the DiD design.

  • Default metric: nrFatalities with threshold 10 (Tigray) and 15 (Amhara).

Clustering: Regions are grouped into 3 climate-similar clusters using K-means on LST, rainfall, and elevation (equal weights, 0.33 each). EVI is excluded from clustering to avoid endogeneity. Crop season data is not used in clustering as it is a consequence of climate, not a driver.

Covariates: log(rainfall_mm + 0.001) and log(lst_max + 0.001) — both have direct causal pathways to EVI. Crop area is excluded as EVI measures vegetation greenness, not agricultural output per se. Elevation is time-invariant and absorbed by entity fixed effects.

Standard errors: Entity-clustered to account for within-region serial correlation.

Parallel trends: Assessed visually using monthly in-season log(EVI) with regression lines, and statistically using a pre-trend slope equality t-test.

All months are used in the regression — time fixed effects absorb seasonality, so off-season months contribute power without introducing bias.

Experimental Setup#

Tigray Model#

Any reference to Tigray, or Tigray war throughout this notebook refers to all the four regions mentioned here from the following dates

  • Treatment date: November 1, 2020 (onset of Tigray War)

  • Pre-period: ~2010 – October 2020

  • Post-period: November 2020 – November 2022

  • End date: November 30, 2022

  • Geographic scope: Tigray, Afar, Oromia, Amhara

  • Conflict metric: nrFatalities, threshold = 10

Amhara Model#

Any reference to Amhara, or Amhara war throughout this notebook refers to all the four regions mentioned here from the following dates

  • Treatment date: April 1, 2023 (Amhara conflict escalation)

  • Pre-period: ~2010 – March 2023

  • Post-period: April 2023 – December 2026

  • End date: December 31, 2026

  • Geographic scope: Amhara, Oromia

  • Conflict metric: nrFatalities, threshold = 15

Clustering#

  • 3 clusters per war, based on LST + rainfall + elevation (equal weights)

  • Clustering period: 2012–2022 (Tigray), 2012–2026 (Amhara)

Insights#

Control and Treatment Groups#

Clustering of ADM3 locations into smaller groups with similar climatic conditions was done using k-means clustering based on land surface temperature, elevation, and rainfall conditions in the adm3 locations from 2012-2025. 3 clusters were identified for the Amhara war and 3 for the Tigray war. The DiD was run along these clusters along with running it for all the treatment and control adm3 regions in all of the Amhara and Tigray war affected regions.

It can be seen that the maximum lst in Cluster 2 of Tigray is much higher than the other two clusters, at a much lower median elevation and significantly lower rainfall. This could be indicative of the drought conditions that persisted in Tigray during the Tigray war.

============================================================
Tigray — Average climate characteristics by cluster
============================================================
         n_adm3  elevation_mean  lst_max_mean  rainfall_mean  n_treated  n_control
cluster                                                                           
0.0         334         2080.68         36.43          86.78         78        256
1.0         144         1967.27         31.98         130.56         25        119
2.0          79         1052.32         45.06          53.13         30         49


============================================================
Amhara — Average climate characteristics by cluster
============================================================
         n_adm3  elevation_mean  lst_max_mean  rainfall_mean  n_treated  n_control
cluster                                                                           
0.0          81         1586.56         39.16          74.80         32         49
1.0         184         2261.65         34.67          98.86         91         93
2.0         111         1975.27         31.10         132.79         13         98

A map of the clusters, with treatment and control groups marked out, shows that the cluster in the Tigray War group with high temperatures is in fact one of the worst affected areas by drought during the war, in Afar.

Regression Results#

Diff-in-diff Regression

\[ \log(\text{EVI}_{it}) = \beta_0 + \beta_1(\text{NewConflict}_i \times \text{Post}_t) + \beta_2 \log(\text{rainfall}_{it}) + \beta_3 \log(\text{lst\_max}_{it}) + \alpha_i + \gamma_t + \varepsilon_{it} \]

Where:

  • \(\log(\text{EVI}_{it})\) — log vegetation index for region \(i\) in month \(t\)

  • \(\text{NewConflict}_i \times \text{Post}_t\) — DiD interaction: 1 for conflict regions after treatment date

  • \(\text{Post}_t\) — 1 if \(t \geq\) treatment date (Nov 2020 Tigray, Apr 2023 Amhara)

  • \(\beta_1\)the causal estimate of conflict on vegetation

  • \(\alpha_i\) — ADM3 entity fixed effects (absorbs elevation, soil, baseline productivity)

  • \(\gamma_t\) — monthly time fixed effects (absorbs seasonality, common shocks)

  • \(\varepsilon_{it}\) — entity-clustered errors

Running the regression showed a few interesting results

  • Only the results from Amhara aggregate, Amhara cluster 0, Amhara cluster 2 and Tigray cluster 2 were significant for the β₁ value i.e., causal estimate (as shown below)

  • In the Amhara War regions of Oromia and Amhara, when considering the aggregate model, suggests that regions that experienced conflict during the Amhara war period, that did not have conflict before then, experienced a 2.3% reduction in EVI. Conflict is defined here as the areas where number of fatalities is less than 15 during the entire pre-war/post-war period.

  • This 2.3% reduction is after accounting for the affect of rainfall, and temperature on the crop yield, with lst having a 26% reduction on EVI.

======================================================================
  Amhara_aggregate
======================================================================
PanelOLS Estimation Summary
Dep. Variable: log(EVI) R-squared: 0.0886
Estimator: PanelOLS R-squared (Between): 0.8352
No. Observations: 47904 R-squared (Within): 0.2227
Date: Sat, Jun 27 2026 R-squared (Overall): 0.7967
Time: 18:17:37 Log-likelihood 1.109e+04
Cov. Estimator: Clustered
F-statistic: 1536.4
Entities: 376 P-value 0.0000
Avg Obs: 127.40 Distribution: F(3,47398)
Min Obs: 60.000
Max Obs: 128.00 F-statistic (robust): 31.562
P-value 0.0000
Time periods: 128 Distribution: F(3,47398)
Avg Obs: 374.25
Min Obs: 371.00
Max Obs: 376.00
Parameter Estimates
Parameter Std. Err. T-stat P-value Lower CI Upper CI
treated_post -0.0231 0.0061 -3.7798 0.0002 -0.0350 -0.0111
log(rainfall_mm + 0.001) 0.0231 0.0034 6.7137 0.0000 0.0164 0.0299
log(lst_max + 0.001) -0.2660 0.1002 -2.6531 0.0080 -0.4624 -0.0695


F-test for Poolability: 207.75
P-value: 0.0000
Distribution: F(502,47398)

Included effects: Entity, Time
======================================================================
  Amhara_cluster_0
======================================================================
PanelOLS Estimation Summary
Dep. Variable: log(EVI) R-squared: 0.2712
Estimator: PanelOLS R-squared (Between): -0.1445
No. Observations: 10348 R-squared (Within): 0.4115
Date: Sat, Jun 27 2026 R-squared (Overall): -0.1117
Time: 18:17:42 Log-likelihood 794.45
Cov. Estimator: Clustered
F-statistic: 1257.5
Entities: 81 P-value 0.0000
Avg Obs: 127.75 Distribution: F(3,10137)
Min Obs: 108.00
Max Obs: 128.00 F-statistic (robust): 15.344
P-value 0.0000
Time periods: 128 Distribution: F(3,10137)
Avg Obs: 80.844
Min Obs: 80.000
Max Obs: 81.000
Parameter Estimates
Parameter Std. Err. T-stat P-value Lower CI Upper CI
treated_post -0.0454 0.0169 -2.6904 0.0071 -0.0784 -0.0123
log(rainfall_mm + 0.001) 0.0212 0.0081 2.6075 0.0091 0.0053 0.0372
log(lst_max + 0.001) -0.9228 0.5036 -1.8324 0.0669 -1.9100 0.0644


F-test for Poolability: 56.172
P-value: 0.0000
Distribution: F(207,10137)

Included effects: Entity, Time
  • In Amhara cluster 0, this effect went up to 4.5%. This has 32 treatment adm3 locations in the’South Gondar’, ‘North Wello’, ‘South Wello’, ‘North Shewa (AM)’,’East Gojam’, ‘Wag Hamra’, ‘Awi’, ‘Central Gondar’, ‘West Gondar’, ‘East Shewa’, ‘Arsi’ woredas. These regions were identified as areas with food insecurity due to climatic factors in other UN reports as well (reference)

======================================================================
  Amhara_cluster_1
======================================================================
PanelOLS Estimation Summary
Dep. Variable: log(EVI) R-squared: 0.0630
Estimator: PanelOLS R-squared (Between): 0.9282
No. Observations: 23396 R-squared (Within): 0.2167
Date: Sat, Jun 27 2026 R-squared (Overall): 0.8837
Time: 18:19:21 Log-likelihood 1.114e+04
Cov. Estimator: Clustered
F-statistic: 517.29
Entities: 184 P-value 0.0000
Avg Obs: 127.15 Distribution: F(3,23082)
Min Obs: 60.000
Max Obs: 128.00 F-statistic (robust): 11.256
P-value 0.0000
Time periods: 128 Distribution: F(3,23082)
Avg Obs: 182.78
Min Obs: 181.00
Max Obs: 184.00
Parameter Estimates
Parameter Std. Err. T-stat P-value Lower CI Upper CI
treated_post -0.0285 0.0073 -3.8813 0.0001 -0.0429 -0.0141
log(rainfall_mm + 0.001) 0.0070 0.0030 2.3390 0.0193 0.0011 0.0129
log(lst_max + 0.001) -0.3151 0.1613 -1.9538 0.0507 -0.6313 0.0010


F-test for Poolability: 246.58
P-value: 0.0000
Distribution: F(310,23082)

Included effects: Entity, Time
  • In Amhara cluster 1, it was again close to 2.8%.

  • There wasn’t a significant result in Amhara cluster 2 which contains Addis Kidame town, Bibugn. It is important to note that this cluster also has 13 treatment locations compared to the 98 control groups.

======================================================================
  Amhara_cluster_2
======================================================================
PanelOLS Estimation Summary
Dep. Variable: log(EVI) R-squared: 0.0578
Estimator: PanelOLS R-squared (Between): 0.1072
No. Observations: 14160 R-squared (Within): 0.1853
Date: Sat, Jun 27 2026 R-squared (Overall): 0.1129
Time: 18:19:34 Log-likelihood 6302.4
Cov. Estimator: Clustered
F-statistic: 284.63
Entities: 111 P-value 0.0000
Avg Obs: 127.57 Distribution: F(3,13919)
Min Obs: 116.00
Max Obs: 128.00 F-statistic (robust): 15.191
P-value 0.0000
Time periods: 128 Distribution: F(3,13919)
Avg Obs: 110.62
Min Obs: 107.00
Max Obs: 111.00
Parameter Estimates
Parameter Std. Err. T-stat P-value Lower CI Upper CI
treated_post -0.0282 0.0160 -1.7628 0.0780 -0.0596 0.0032
log(rainfall_mm + 0.001) 0.0380 0.0064 5.9816 0.0000 0.0256 0.0505
log(lst_max + 0.001) -0.0646 0.0408 -1.5833 0.1134 -0.1446 0.0154


F-test for Poolability: 130.09
P-value: 0.0000
Distribution: F(237,13919)

Included effects: Entity, Time
======================================================================
  Tigray_cluster_2
======================================================================
PanelOLS Estimation Summary
Dep. Variable: log(EVI) R-squared: 0.4886
Estimator: PanelOLS R-squared (Between): -12.025
No. Observations: 7505 R-squared (Within): 0.4171
Date: Sat, Jun 27 2026 R-squared (Overall): -11.559
Time: 18:19:37 Log-likelihood 2150.8
Cov. Estimator: Clustered
F-statistic: 2334.3
Entities: 79 P-value 0.0000
Avg Obs: 95.000 Distribution: F(3,7329)
Min Obs: 95.000
Max Obs: 95.000 F-statistic (robust): 170.12
P-value 0.0000
Time periods: 95 Distribution: F(3,7329)
Avg Obs: 79.000
Min Obs: 79.000
Max Obs: 79.000
Parameter Estimates
Parameter Std. Err. T-stat P-value Lower CI Upper CI
treated_post 0.0549 0.0233 2.3513 0.0187 0.0091 0.1006
log(rainfall_mm + 0.001) -0.0007 0.0023 -0.2935 0.7691 -0.0053 0.0039
log(lst_max + 0.001) -2.2080 0.0983 -22.464 0.0000 -2.4007 -2.0153


F-test for Poolability: 112.27
P-value: 0.0000
Distribution: F(172,7329)

Included effects: Entity, Time
  • Tigray did not yield any significant result except for Tigray cluster 2. This could be because the Tigray war was quickly followed by the Amhara war, and coincided with heavy drought in the country. Separating these factors might be difficult in this experiemntal design.

  • Tigray cluster 2, showed an increase in EVI relative to conflict suggesting that the areas with conflict actually performed better after the war began. This could be interpreted in a few ways - the maximum temperature during this period has a disproportionately high impact on the EVI suggesting crop areas may have been burned during the war across both treated and control regions. ** Needs additional verification.

Validation using Premise Data#

Using the control and treatment groups identified for Amhara war regions, we obtained survey data from Premise to see if people reported lesser food in 2025.

The number of respondants in both treatment and control group is considerably different from each other.

The same numbe rof people reported having gotten their food from aid in both the groups during different months. However, fewer people in the treatment group get their food from supermarkets, or corner shops.

Methodological Notes: Unsuccessful Approaches#

Clustering#

  • 5 clusters per war — resulted in clusters with too few treated/control regions. Reduced to 3.

  • Crop season as a clustering feature — removed; it is a consequence of climate (LST, rainfall, elevation), not an independent driver.

Covariates#

  • Crop area — dropped. EVI measures vegetation greenness, not output. No direct causal pathway.

  • Soil moisture — dropped. Endogenous to rainfall (double-counting the same pathway).

  • Population — dropped. Time-invariant (absorbed by entity FE). Population change during conflict is a mediator, not a confounder.

  • LST_max + LST_min together — dropped LST_min due to multicollinearity. LST_max alone captures heat stress.

  • Seasonal controls (preseason/inseason aggregates) — computed but never included in the regression formula. Removed from pipeline.

Regression Specification#

  • Crop-season-only months in regression — dropped ~60–70% of observations, killed significance. Time FE already absorb seasonality. Reverted to all months.

  • Continuous conflict intensity (nrEvents × Post) — improved Tigray results but weakened Amhara, suggesting Amhara’s effect is a threshold/step change rather than dose-response. Reported as a robustness check alongside binary DiD.

Conflict Definition Sensitivity#

  • Threshold sweep (3, 5, 10, 15, 25) — treated/control composition changes entirely with each threshold. High thresholds (>15) in Amhara reduce the treated group to a handful of ADM3s, making estimates unstable. Selected thresholds where results were significant across at least one alternative definition.

Tigray#

  • Binary DiD — parallel trends assumption violated or borderline in most clusters. The one significant cluster (Cluster 1) also had the weakest pre-trends (t=1.817, p=0.08). Null result is consistent with existing literature showing Tigrayan farmers sustained cultivation through wartime coping strategies.

Code/Data Fixes#

  • categorize_conflict_regions accepted only treatment_year (integer), losing month-level precision. Updated to accept full dates.

  • find_similar_climate_regions did not accept crop_season_data — original code was passing parameters that were silently ignored.

  • Duplicate entry in cluster_covariates list removed.

  • t_date / t_year bug in parallel trends loop — both wars received the same treatment date.