voidly
Atlas/Heterogeneous Treatment Effects

Heterogeneous Treatment Effects: Elections → Shutdowns

For each country, the expected lift in 7-day shutdown probability when an election occurs in the next 7 days. Causal Forest DML (Athey & Wager 2019, Chernozhukov et al. 2018). 90% honest forest confidence intervals from EconML.

Avg ATE (train)
9.6pp
on training pop.
Avg ATE (holdout)
9.6pp
temporal hold-out
CI Coverage
99.5%
vs bootstrap ATE
Promote
PROMOTED
floor: coverage ≥ 75%, nonzero-CI ≥ 50%
Honest caveats
  • Only 5 countries have ≥ 3 elections in the training window. Other estimates are extrapolations via the country one-hot plus risk-tier and unrest features — wide CI, flagged noisy=true.
  • Identification assumes unconfoundedness conditional on W = (risk_tier, month, day-of-week, prior shutdowns, lagged block rate, weekend). Unobserved confounders (e.g. coups not in our event calendar) still bias the estimate.
  • ATE is the average over the country's day distribution. A specific election may differ by stakes, incumbent risk, opposition coordination — not captured here.

Per-country ATE (sorted by magnitude)

Bars scale by ATE; brackets show the 90% honest forest CI. Negative ATE = elections reduce shutdown probability.

-143.6pp0+143.6ppIR44.8pp [-54.0pp, 143.6pp] (N=0 • noisy)VN32.2pp [14.1pp, 50.2pp] (N=8)KP17.7pp [-2.8pp, 38.2pp] (N=0 • noisy)CN17.7pp [-2.8pp, 38.2pp] (N=0 • noisy)BY16.7pp [9.2pp, 24.3pp] (N=8)SA16.7pp [-3.0pp, 36.3pp] (N=0 • noisy)CU15.8pp [3.1pp, 28.6pp] (N=0 • noisy)SY15.2pp [2.7pp, 27.7pp] (N=0 • noisy)TM13.4pp [1.7pp, 25.1pp] (N=0 • noisy)PK7.1pp [-7.7pp, 21.8pp] (N=0 • noisy)RU3.3pp [-22.3pp, 29.0pp] (N=0 • noisy)TR3.1pp [-13.9pp, 20.1pp] (N=0 • noisy)MY2.6pp [-4.2pp, 9.4pp] (N=0 • noisy)MM1.9pp [-6.9pp, 10.7pp] (N=0 • noisy)BD1.5pp [-10.7pp, 13.7pp] (N=0 • noisy)TH0.6pp [-3.5pp, 4.7pp] (N=0 • noisy)KZ0.5pp [-0.3pp, 1.2pp] (N=8)ID0.4pp [-1.8pp, 2.6pp] (N=0 • noisy)EG0.3pp [-0.2pp, 0.8pp] (N=8)UZ0.2pp [-3.3pp, 3.7pp] (N=0 • noisy)VE-9.6pp [-15.2pp, -3.9pp] (N=8)

Per-country detail (click country for raw JSON)

CountryATE90% CITrain eventsStatus
IRIran44.8pp[-54.0pp, 143.6pp]0noisy / extrapolated
VNVietnam32.2pp[14.1pp, 50.2pp]8signal
KPNorth Korea17.7pp[-2.8pp, 38.2pp]0noisy / extrapolated
CNChina17.7pp[-2.8pp, 38.2pp]0noisy / extrapolated
BYBelarus16.7pp[9.2pp, 24.3pp]8signal
SASaudi Arabia16.7pp[-3.0pp, 36.3pp]0noisy / extrapolated
CUCuba15.8pp[3.1pp, 28.6pp]0noisy / extrapolated
SYSyria15.2pp[2.7pp, 27.7pp]0noisy / extrapolated
TMTurkmenistan13.4pp[1.7pp, 25.1pp]0noisy / extrapolated
PKPakistan7.1pp[-7.7pp, 21.8pp]0noisy / extrapolated
RURussia3.3pp[-22.3pp, 29.0pp]0noisy / extrapolated
TRTurkey3.1pp[-13.9pp, 20.1pp]0noisy / extrapolated
MYMalaysia2.6pp[-4.2pp, 9.4pp]0noisy / extrapolated
MMMyanmar1.9pp[-6.9pp, 10.7pp]0noisy / extrapolated
BDBangladesh1.5pp[-10.7pp, 13.7pp]0noisy / extrapolated
THThailand0.6pp[-3.5pp, 4.7pp]0noisy / extrapolated
KZKazakhstan0.5pp[-0.3pp, 1.2pp]8signal
IDIndonesia0.4pp[-1.8pp, 2.6pp]0noisy / extrapolated
EGEgypt0.3pp[-0.2pp, 0.8pp]8signal
UZUzbekistan0.2pp[-3.3pp, 3.7pp]0noisy / extrapolated
VEVenezuela-9.6pp[-15.2pp, -3.9pp]8signal

Methodology

We use Double Machine Learning (DML) with a Causal Forest second stage (EconML's CausalForestDML). The DML framework cross-fits two nuisance models — an outcome regression E[Y | W] and a propensity model P(T=1 | W) — and then a causal forest learns the conditional average treatment effect tau(X) = E[Y(1) - Y(0) | X] from residualised data. This makes the estimate doubly robust: it is consistent if either the outcome model or the propensity model is correctly specified.

Treatment

T = 1 if the country has an election in the next 7 days (election_in_7days flag from the forecast feature panel). 40 treated rows in training, across 7 distinct countries (KZ, VN, BD, EG, BY, MM, VE).

Outcome

Y = target_7day — binary indicator: did at least one labelled shutdown event occur for this country in the 7-day window starting at this country-day? Same label as the production XGBoost forecast.

Covariates W

  • risk_tier (1–5 baseline censorship intensity)
  • month, day_of_week, is_weekend (seasonality)
  • prior_shutdowns_30d (rolling 30-day target sum, shifted)
  • block_rate_lag7 (7-day-old block-rate baseline)

Effect modifiers X

  • Country one-hot (21 dummies)
  • risk_tier
  • gdelt_unrest_30d

Identification assumptions

  1. SUTVA: country i's outcome does not depend on whether country j has an election. Plausible at 7-day horizon.
  2. Unconfoundedness given W: after controlling for risk tier, seasonality, and lagged severity, election timing is as good as random. Violated if governments call snap elections strategically when censorship infrastructure is ready.
  3. Positivity: every covariate stratum has a non-zero chance of treatment. Approximated by the DML cross-fit; some country/risk-tier cells are sparse.

Evaluation

We hold out the most recent 120 days of country-days. The held-out ATE is computed two ways:

  • Model ATE: est.ate_inference(X_holdout).conf_int_mean(alpha=0.10).
  • Empirical ATE: bootstrap-resample the held-out treated and control outcome means 200 times.

CI coverage = fraction of bootstrap empirical ATEs that fall inside the model's 90% CI. Election treatment: 99.5%.

Promote criteria

  • CI coverage ≥ 75% on held-out
  • ≥ 50% of countries with ≥ 3 events have a CI that excludes zero (signal-to-noise floor)

Election treatment passes both. Protest treatment fails (empirical ATE near zero, CI excludes empirical mean) and is not promoted.

Related

References

  • Athey, S. & Wager, S. (2019). "Estimation and Inference of Heterogeneous Treatment Effects using Random Forests." JASA.
  • Chernozhukov, V., Chetverikov, D., Demirer, M., Duflo, E., Hansen, C., Newey, W., & Robins, J. (2018). "Double/debiased machine learning for treatment and structural parameters." Econometrics Journal.
  • Microsoft EconML library: econml.azurewebsites.net

API: GET /v1/sentinel/hte?country={cc}&treatment=election · leaderboard /v1/sentinel/hte/leaderboard · info /v1/sentinel/hte/info

Data refreshes every 30 minutes. Model retrained on demand from forecast_training_data.parquet.