Synthetic validation for CAMS × Seshat Granger causality — three-scenario stress test
Before applying Granger causality to real CAMS + Seshat data, we validate the implementation against synthetic series
with known ground truth. Three scenarios: A — true signal detection,
B — null rejection (no false positives), C — noise stress test.
Matches granger_synthetic_validator.py in the repo.
What Is Granger Causality?
X "Granger-causes" Y if past values of X improve predictions of Y beyond what Y's own history provides. For CAMS research, we test whether Seshat social complexity indices predict CAMS cross-layer coupling Λ(t), and whether the causal direction is Seshat→Λ, Λ→Seshat, or bidirectional. The synthetic validator confirms the implementation is correct before applying it to real data.
The F-Test (per lag L)
Why Three Scenarios?
Stationarity Requirement
The F-test assumes both series are stationary. CAMS Λ(t) and Seshat complexity indices are likely
non-stationary (I(1) — unit roots are common in social time series).
Use granger_stationary_safe() on real data: it ADF-gates and auto-differences until
both series pass, then passes them to the Granger test.
Results on ∆-series interpret causality at rates of change, not levels — document which
in any publication.
Python source: granger_synthetic_validator.py in
KaliBond/wintermute.
Depends on statsmodels, pandas, numpy.
This in-browser implementation uses vanilla JS OLS + jStat F-distribution.