How CausalDynamics compares

CausalDynamics.jl owns one niche: identify → intervene → shared-U counterfactual trajectories for discrete-time structural models. It composes with, rather than competes against, the packages below.

NeedReach forWhy
Learn a DAG from data (PC, OCE)Associations.jlOptional weakdep bridge (infer_pc_graph, infer_oce_temporal_spec); see Associations integration
Learn a DAG from data (legacy Julia PC)CausalInference.jlpcalg; we use CausalInference for d-separation and backdoor primitives
Solve ODEs / SDEs / UDEsSciML, UniversalDiffEq.jlWe supply structure and do(·) semantics, not integrators — see SciML recipes
Doubly robust effect estimation on tablesTMLE.jlWe identify the adjustment set; TMLE estimates (integration)
Scalable Bayesian inferenceRxInfer.jlVariational backdoor head is a weakdep extension
Tabular causal simulation / estimationCausalTables.jlTable-centric; we are trajectory-centric over occasions t = 1:T
Python causal workflowsDoWhyBroad four-step workflow; no discrete-time trajectory counterfactuals with shared U

What is distinctive here

  • Trajectories, not single outcomessimulate returns a CDMTrajectory with the realised exogenous draws retained
  • Shared-U counterfactual pathscounterfactual replays the same creative advance under a different intervention, giving unit-level alternative histories rather than population contrasts
  • Time-indexed identificationunroll_temporal_dag turns a lag specification into a static DAG so ordinary backdoor logic covers lagged confounding
  • Soft interventionsPolicy supports treatment rules that react to state
  • Lean core — hard dependencies are Graphs and CausalInference only

What is deliberately absent

Full causal discovery implementations, differential-equation solvers, and full symbolic do-calculus. Discovery runs in Associations.jl; identification and trajectories stay here. See Scope.

The CDCS book is the long-form narrative companion for these APIs.