Causal-Audit
A framework for risk assessment of assumption violations in time-series causal discovery.
Ruiz, M.¹, Arana-Catania, M.², Ardila, D. R.³ & Ventura, R.¹ (2026). Journal of Causal Inference.
¹ ISR, Instituto Superior Técnico, Lisbon ² University of Oxford ³ Jet Propulsion Laboratory, Caltech
Contents
- Install
- Quickstart
- Usage
- Framework, figures & benchmarks
- Reproducing paper experiments
- Citation
- License
Install
Users
Install the released package with uv (recommended) or pip:
uv pip install causal-audit
# or
pip install causal-audit
Optional extras pull in the figure and graph dependencies:
uv pip install "causal-audit[viz]" # IEEE-style figures (SciencePlots)
uv pip install "causal-audit[graphs]" # optional exploratory PCMCI+ graph via tigramite
uv pip install "causal-audit[all]" # viz + graphs + earth-observation helpers
The package installs as causal-audit and imports as causal_audit.
Contributors
Clone the repository and install an editable copy into a fresh environment:
git clone https://github.com/marcoruizrueda/causal-audit.git
cd causal-audit
uv venv .venv --python 3.13
source .venv/bin/activate
uv pip install -e .
Quickstart
import pandas as pd
from causal_audit import RiskAwareGatekeeper
# DataFrame with a DatetimeIndex and one column per variable
df = pd.read_csv("data.csv", index_col=0, parse_dates=True)
gk = RiskAwareGatekeeper(random_seed=42)
result = gk.analyze(data=df, output_dir="results/")
print(result["policy"].decision) # "recommend" or "abstain"
print(result["policy"].recommended_method) # e.g. "PCMCI+" or "LPCMCI"
Run the quickstart notebook for a complete audit and its summary figure. Use the independent walkthrough to configure the audit, inspect diagnostics, and handle abstention. See Usage for the per-stage API.
The default audit does not run causal discovery. The optional exploratory graph requires
include_dependency_network=True and Tigramite; it is skipped when the audit abstains.
Usage
Input: a pandas.DataFrame with a DatetimeIndex, one column per variable, NaN for missing values.
import pandas as pd
from causal_audit import AssumptionAuditor # Stage I
from causal_audit import RiskQuantifier # Stage II
from causal_audit import MethodRecommender # Stage III
from causal_audit import RiskAwareGatekeeper # Stages I → II → III
df = pd.read_csv("data.csv", index_col=0, parse_dates=True)
# Stage I — diagnostics (stationarity, irregularity, persistence, nonlinearity, confounding)
auditor = AssumptionAuditor(alpha=0.05)
evidence = auditor.audit(df) # → AuditEvidence with per-variable effect sizes
# Stage II — diagnostic-derived risk scores with approximate uncertainty bounds
quantifier = RiskQuantifier()
risk_profile = quantifier.quantify(evidence) # → RiskProfile (6 scores, bounds, ledger)
# Stage III — recommend a method or abstain
recommender = MethodRecommender()
policy, scorecard = recommender.recommend(risk_profile) # → Policy + Scorecard
# Or run all three stages at once:
gk = RiskAwareGatekeeper(random_seed=42)
result = gk.analyze(data=df, output_dir="results/")
print(result["policy"].decision) # "recommend" or "abstain"
print(result["policy"].recommended_method) # "PCMCI+" or "LPCMCI"
Stage I can be used alone for structured assumption auditing in individual studies. Use the gatekeeper for the complete configured pipeline: per-stage defaults do not automatically load its calibration configuration or retain all downstream diagnostic inputs.
The paper evaluates four calibrated risk dimensions. The current implementation returns six scores and includes heuristic fallbacks and overrides. Its uncertainty bounds and policy confidence are not probabilities that a causal graph is correct; low confounding proxies cannot establish causal sufficiency. Investigate severe nonstationarity and re-audit any justified preprocessing before selecting a discovery method.
Framework, figures & benchmarks
The pipeline figure, the figure catalogue (six diagnostic figures plus an optional exploratory graph), the synthetic DGP atlas (F1–F10), the framework extension points, and the nonlinearity-diagnostic notes live in FRAMEWORK.md.
Reproducing paper experiments
See the step-by-step commands in FRAMEWORK.md.
Citation
@misc{ruiz2026causalaudit,
title = {Causal-Audit: A Framework for Risk Assessment of Assumption
Violations in Time-Series Causal Discovery},
author = {Marco Ruiz and Miguel Arana-Catania and David R. Ardila
and Rodrigo Ventura},
year = {2026},
eprint = {2604.02488},
archivePrefix = {arXiv},
primaryClass = {cs.LG},
doi = {10.48550/arXiv.2604.02488},
url = {https://arxiv.org/abs/2604.02488},
}
MIT License
Metadata
Release files for causal-audit 0.3.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| causal_audit-0.3.2.tar.gz | 98.3 kB | Without provenance | Details for causal_audit-0.3.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| causal_audit-0.3.2-py3-none-any.whl | Python 3 | none | any | Details for causal_audit-0.3.2-py3-none-any.whl |
Total release size: 200.6 kB
Release files / causal_audit-0.3.2.tar.gz
| Download URL | causal_audit-0.3.2.tar.gz |
|---|---|
| Size | 98.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a8ec31983fa891b2b9f0295385826bcef57918392a414a406ad67c9c2d4b436b
|
|
BLAKE2b-256 checksum How to use checksums |
c1cff6bf300d3bcd30666d4a9ca7b2cea52a968c6140e5915f9c18c0e3fe342b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.0
|
Release files / causal_audit-0.3.2-py3-none-any.whl
| Download URL | causal_audit-0.3.2-py3-none-any.whl |
|---|---|
| Size | 102.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e69723de875e0ec9c6fcee326e169fa1e71210ccd3efbda573a16433a8022845
|
|
BLAKE2b-256 checksum How to use checksums |
08efb5d94fae583759a05085ade6c4f6b7b39536bbec02b05b30eaefe9a46669
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.0
|
Security for causal-audit 0.3.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.