voidly
/atlas/lead-lag

Country lead/lag cross-correlation

Time-shifted Pearson correlation between top-50 censored countries. Surfaces pairs where one country’s daily incident pattern reliably leads another’s by N days — useful for forecasting which country may be hit next when one starts shutting down.

129 significant pairs|of 190 evaluated|after Benjamini–Hochberg FDR @ α=0.05 and |r| ≥ 0.4
Generated Thu, 21 May 2026 12:55:40 GMT
Three axes of country–country similarity:

Top 20 most significant lead/lag pairs

Ranked by |r|. Reading: when leader has a spike, follower has a spike lag_days later. Direction inferred from the lag with maximum |r|.

#LeaderFollowerLag (days)rp (FDR)
1SA Saudi ArabiaTH Thailand1+0.912<1e-6
2UZ UzbekistanPK Pakistan1+0.891<1e-6
3AZ AzerbaijanJO Jordan1+0.847<1e-6
4TZ TanzaniaAZ Azerbaijan2+0.836<1e-6
5UZ UzbekistanAZ Azerbaijan1+0.801<1e-6
6IQ IraqKZ Kazakhstan26+0.780<1e-6
7UZ UzbekistanJO Jordan1+0.771<1e-6
8JO JordanPK Pakistan1+0.764<1e-6
9AE United Arab EmiratesTH Thailand1+0.756<1e-6
10AE United Arab EmiratesSA Saudi Arabia1+0.756<1e-6
11TH ThailandKZ Kazakhstan1+0.749<1e-6
12SA Saudi ArabiaKZ Kazakhstan1+0.749<1e-6
13AE United Arab EmiratesQA Qatar1+0.747<1e-6
14TZ TanzaniaJO Jordan5+0.735<1e-6
15MA MoroccoIR Iran15+0.733<1e-6
16AZ AzerbaijanPK Pakistan2+0.732<1e-6
17MM MyanmarTZ Tanzania30+0.726<1e-6
18PK PakistanTZ Tanzania30+0.716<1e-6
19AE United Arab EmiratesPK Pakistan26+0.686<1e-6
20RW RwandaAZ Azerbaijan10+0.675<1e-6

Per-country lead/lag

For each country, the top countries that LEAD it (predictive signal) and the top countries IT LEADS. Only 20 countries have ≥5 nonzero days and ≥5 total incidents in the past 365 days and qualify for analysis.

PK Pakistan
30 incidents · 365d
Led by
  • UZ +1d+0.89
  • JO +1d+0.76
  • AZ +2d+0.73
  • AE +26d+0.69
  • QA +15d+0.60
Leads
  • TZ +30d+0.72
  • RW +30d+0.52
  • MM +1d+0.52
  • BY +26d+0.45
AZ Azerbaijan
29 incidents · 365d
Led by
  • TZ +2d+0.84
  • UZ +1d+0.80
  • RW +10d+0.67
  • MM +30d+0.53
  • SY +1d+0.51
Leads
  • JO +1d+0.85
  • PK +2d+0.73
  • MA +30d+0.61
UZ Uzbekistan
22 incidents · 365d
Led by
  • TZ +1d+0.63
  • QA +14d+0.61
  • AE +24d+0.59
  • MM +30d+0.56
  • RW +19d+0.50
Leads
  • PK +1d+0.89
  • AZ +1d+0.80
  • JO +1d+0.77
  • SY +1d+0.54
TZ Tanzania
17 incidents · 365d
Led by
  • MM +30d+0.73
  • PK +30d+0.72
  • RW +1d+0.65
  • SY +1d+0.58
  • BY +3d+0.58
Leads
  • AZ +2d+0.84
  • JO +5d+0.73
  • MA +30d+0.65
  • UZ +1d+0.63
  • EG +2d+0.40
JO Jordan
14 incidents · 365d
Led by
  • AZ +1d+0.85
  • UZ +1d+0.77
  • TZ +5d+0.73
  • RW +8d+0.61
  • SY +1d+0.48
Leads
  • PK +1d+0.76
  • MA +26d+0.52
EG Egypt
11 incidents · 365d
Led by
  • RU +1d+0.65
  • BY +1d+0.63
  • IQ +1d+0.61
  • RW +10d+0.57
  • IR +1d+0.55
Leads
  • VN +25d+0.55
  • KZ +24d+0.53
  • TH +22d+0.51
  • SA +22d+0.51
  • MA +25d+0.47
RU Russia
8 incidents · 365d
Led by
  • IR +1d+0.60
  • MM +1d+0.45
Leads
  • EG +1d+0.65
  • IQ +1d+0.57
  • VN +27d+0.52
  • PK +30d+0.51
  • KZ +25d+0.51
IR Iran
7 incidents · 365d
Led by
  • MA +15d+0.73
Leads
  • MM +1d+0.67
  • KZ +25d+0.61
  • RU +1d+0.60
  • TH +21d+0.60
  • SA +21d+0.60
AE United Arab Emirates
6 incidents · 365d
Led by
  • MM +18d+0.52
  • IR +19d+0.52
  • IQ +21d+0.48
  • EG +21d+0.43
  • VN +18d+0.43
Leads
  • TH +1d+0.76
  • SA +1d+0.76
  • QA +1d+0.75
  • PK +26d+0.69
  • UZ +24d+0.59
BY Belarus
6 incidents · 365d
Led by
  • RW +5d+0.65
  • SY +1d+0.59
  • RU +27d+0.45
  • PK +26d+0.45
Leads
  • MA +29d+0.66
  • EG +1d+0.63
  • TZ +3d+0.58
  • UZ +14d+0.49
  • AZ +4d+0.48
IQ Iraq
6 incidents · 365d
Led by
  • IR +1d+0.58
  • RU +1d+0.57
  • MA +14d+0.44
Leads
  • KZ +26d+0.78
  • QA +19d+0.62
  • EG +1d+0.61
  • TH +22d+0.57
  • SA +22d+0.57
MM Myanmar
6 incidents · 365d
Led by
  • IR +1d+0.67
  • PK +1d+0.52
  • VN +17d+0.51
  • MA +15d+0.46
  • IQ +1d+0.44
Leads
  • TZ +30d+0.73
  • TH +21d+0.57
  • SA +21d+0.57
  • SY +30d+0.57
  • UZ +30d+0.56
QA Qatar
6 incidents · 365d
Led by
  • AE +1d+0.75
  • IQ +19d+0.62
  • MM +18d+0.54
  • IR +19d+0.53
  • EG +19d+0.42
Leads
  • TH +1d+0.67
  • SA +1d+0.67
  • UZ +14d+0.61
  • PK +15d+0.60
  • KZ +5d+0.59
RW Rwanda
6 incidents · 365d
Led by
  • SY +19d+0.54
  • PK +30d+0.52
  • MM +30d+0.49
  • IQ +14d+0.44
Leads
  • AZ +10d+0.67
  • BY +5d+0.65
  • TZ +1d+0.65
  • JO +8d+0.61
  • EG +10d+0.57
KZ Kazakhstan
5 incidents · 365d
Led by
  • IQ +26d+0.78
  • TH +1d+0.75
  • SA +1d+0.75
  • IR +25d+0.61
  • QA +5d+0.59
Leads
  • PK +26d+0.50
  • SY +26d+0.47
  • UZ +5d+0.44
  • VN +2d+0.41
MA Morocco
5 incidents · 365d
Led by
  • BY +29d+0.66
  • TZ +30d+0.65
  • AZ +30d+0.61
  • RW +30d+0.54
  • JO +26d+0.52
Leads
  • IR +15d+0.73
  • MM +15d+0.46
  • IQ +14d+0.44
SA Saudi Arabia
5 incidents · 365d
Led by
  • AE +1d+0.76
  • QA +1d+0.67
  • IR +21d+0.60
  • IQ +22d+0.57
  • MM +21d+0.57
Leads
  • TH +1d+0.91
  • KZ +1d+0.75
  • PK +26d+0.57
  • UZ +12d+0.47
  • VN +4d+0.46
SY Syria
5 incidents · 365d
Led by
  • MM +30d+0.57
  • UZ +1d+0.54
  • RU +30d+0.49
  • KZ +26d+0.47
  • TH +28d+0.45
Leads
  • BY +1d+0.59
  • PK +1d+0.58
  • TZ +1d+0.58
  • RW +19d+0.54
  • MA +30d+0.52
TH Thailand
5 incidents · 365d
Led by
  • SA +1d+0.91
  • AE +1d+0.76
  • QA +1d+0.67
  • IR +21d+0.60
  • IQ +22d+0.57
Leads
  • KZ +1d+0.75
  • PK +26d+0.57
  • UZ +12d+0.47
  • VN +4d+0.46
  • SY +28d+0.45
VN Vietnam
5 incidents · 365d
Led by
  • EG +25d+0.55
  • RU +27d+0.52
  • IQ +26d+0.51
  • IR +26d+0.51
  • TH +4d+0.46
Leads
  • MM +17d+0.51
  • MA +6d+0.49
  • AE +18d+0.43

Methodology

Inputs. Daily citable-censorship incident counts (incident_type IN ('censorship','mixed')) for the top-50 countries by 365-day volume. IODA disruption rows are excluded because they conflate fiber cuts, BGP outages, DDoS, and weather with censorship — the same correction shipped in the May-21 forecast-labels fix.

Smoothing. 7d centered rolling mean. Daily incident series are spiky point events; without smoothing the cross-correlation is dominated by accidental single-day overlap.

Cross-correlation. For each ordered pair (A, B) and lag L ∈ {-30, …, +30} \ {0}, we compute Pearson r between A[t] and B[t+L] over the overlap window. Two-sided p-value from the t-statistic on r with n_eff = 365 − |L|. Lag 0 is intentionally excluded: simultaneous correlation already lives at /atlas/correlation-matrix.

Direction convention. If the best lag is positive for (A, B), A leads B; if negative, we swap to (B, A) and flip the sign so reported lag_days is always non-negative.

Multiple-comparison correction. With 20 countries × 60 lags per pair, the raw p-values vastly overstate significance. We apply Benjamini–Hochberg FDR control at α=0.05 and require |r| ≥ 0.4. BH-FDR (rather than Bonferroni) is chosen because the analysis is exploratory and we tolerate a controlled false-discovery rate rather than the catastrophic loss of power Bonferroni would impose.

Sparse-country filter. Countries with fewer than 5 nonzero days OR fewer than 5 total incidents are dropped — they produce artifactual r=1.0 correlations after smoothing because two delta spikes trivially align. We started at 50 countries and kept 20 that clear the support floor.

Honest caveat

Cross-correlation does NOT imply causation. Significant lead/lag pairs may reflect (a) one country influencing another, (b) shared regional or geopolitical drivers (elections, sanctions, fiber routes), or (c) downstream measurement effects from overlapping ISP infrastructure. lag=0 (simultaneous) is intentionally excluded -- see /atlas/correlation-matrix for that case. With 50 countries and 31 lags evaluated per pair, the raw p-values overstate significance; we apply Benjamini-Hochberg FDR control at alpha=0.05 and require |r| >= 0.4. Counts come from the citable-censorship subset (incident_type IN censorship/mixed) -- IODA disruption rows are excluded since they include fiber cuts / weather / DDoS.

Endpoints

  • GET /v1/atlas/lead-lag — full sidecar (pairs + per-country index).
  • GET /v1/atlas/lead-lag/info — sidecar metadata only.
  • GET /v1/atlas/lead-lag/{cc} — top-K leaders + followers for one country.