Chapter 1 closed on a confounded one-step SCM whose causal claim of interest was a single edge \(A \rightarrow Y\). That edge was not a decoration on a table of variables: it was the local claim that \(Y\) is computed from \(A\) (and from what else the graph allows into that assignment). This chapter isolates that claim as the primary structural unit.
Causality is inherently relational. Saying that \(X\) causes \(Y\) is a claim about a directed dependence, not about either variable alone. The dyad\(X \rightarrow Y\) is therefore the natural pedagogical atom of causal structure: one edge, one local mechanism. Peters, Janzing, and Schölkopf develop causal models first in this bivariate setting (cause–effect SCMs and the principle of independent mechanisms), then generalise to many variables (Peters et al. 2017). In the book’s process vocabulary, an edge may be described as prehension when \(Y\) incorporates information from \(X\) under a stated mechanism.1 Graphs record those dependencies as a static edge set so that \(do(\cdot)\) and shared-\(\mathbf{u}\) questions stay well posed.
In graph language, a DAG is a sparse assembly of dyads. Chains, forks, and colliders are not new kinds of atom; they are overlapping edges with characteristic path geometry. Node roles (source, sink, intermediate) are read from incident edges, not from an a priori taxonomy of “kinds of variables.” The chapter develops that unit before Chapter 3 builds the three classical patterns and Chapter 4 attaches executable mechanisms to the same skeleton.
3.2 The Dyad: Two Nodes, One Edge
A dyad \(X \rightarrow Y\) is the smallest structure that encodes a direct dependence of \(Y\) on \(X\). In an SCM it appears as the assignment
\[
Y \coloneqq f(X, U),
\]
where \(f\) is the local mechanism and \(U\) is the exogenous variable for that equation (the bivariate cause–effect assignment of (Peters et al. 2017)). A realised \(u\) is one value of \(U\). The symbol \(\coloneqq\) marks a generative rule rather than a mere equality of realised numbers: \(Y\) is produced from its parents and from \(U\), not merely declared equal to them after the fact (Chapter 1).
Under \(do(X = x)\) the Structural surgery of Chapter 1 replaces (or bypasses) the assignment that would have generated \(X\), sets the input to \(x\), and leaves \(Y\)’s mechanism intact: \(Y \coloneqq f(x, U)\). The edge remains as a dependence of \(Y\) on the (now intervened) value of \(X\). That is the bivariate form of modularity: intervening on the cause does not invent a new kind of relation for the effect; it changes what feeds an existing mechanism.
On the three-strata grid, the dyad lives primarily in the Structural stratum (which parents enter which assignment). When the same motif is unrolled in time, \(X_t \rightarrow Y_t\) or \(X_t \rightarrow X_{t+1}\) may represent recipient-specific uptake within a dynamical process; when \(Y\) is an assay of latent state, the Observable map \(h\) is itself a dyad-shaped claim about measurement. The atom remains the same, while the stratum foregrounds a different modelling role.
project_root =let current =pwd()while !isfile(joinpath(current, "Project.toml")) && !isfile(joinpath(current, "_quarto.yml")) parent =dirname(current) parent == current &&break current = parentend currentendinclude(joinpath(project_root, "scripts", "ensure_packages.jl"))@auto_using DAGMakie CairoMakie Graphs StableRNGsg_dyad =SimpleDiGraph(2)add_edge!(g_dyad, 1, 2) # X → Y
true
The dyad \(X \rightarrow Y\): one directed edge, one local mechanism.
3.3 Why Dyads Are Fundamental
Two modelling reasons come before the full graph formalism, and both reappear throughout Parts I–III.
Relation before aggregate. A joint distribution \(P(X,Y)\) alone does not determine causal direction. Many mechanisms (and both orientations of a single edge) can induce the same observational association. What determines direction is the assignment (and intervention) semantics: \(Y\) is computed from \(X\), not the reverse (Peters et al. 2017). Pearl’s ladder makes the same point at query level: conditioning on observed \(X\) (L1) is not the same enquiry as setting \(X\) by \(do(\cdot)\) (L2), and neither is the same as replaying one unit under a flipped assignment with the same realised \(\mathbf{u}\) (L3) (Chapter 1).
Mechanism modularity. Intervening on \(X\) replaces the \(X\)-assignment and leaves \(Y\)’s mechanism intact. That is the bivariate form of the principle of independent mechanisms (Peters et al. 2017): local rules can be altered or clamped without rewriting every other equation. Surgery changes one declared mechanism; it does not silently revise the Structural claim (rewiring, a new mechanism class, or a regime change).
The graph \(G = (V, E)\) is exactly a set of dyads: each \(e \in E\) joins two vertices. Roles of nodes are therefore read from incident edges, not from an extrinsic label set:
Source: no incoming edges (often exogenous or background relative to the subgraph of interest)
Sink: no outgoing edges (often an outcome or terminal measurement)
Intermediate: both in- and out-edges
An isolated vertex is possible in a drawing but carries no causal claim until an edge appears. Chapter 1’s confounder \(C\) was a source relative to \(\{A,Y\}\); the outcome \(Y\) was a sink. Those roles followed the edges.
"""Return a node's role from its incident edges."""functionnode_role(g::AbstractGraph, node::Integer) has_in = !isempty(inneighbors(g, node)) has_out = !isempty(outneighbors(g, node))if !has_in && has_outreturn"Source"elseif has_in && !has_outreturn"Sink"elseif has_in && has_outreturn"Intermediate"elsereturn"Isolated"endendg_roles =SimpleDiGraph(4)add_edge!(g_roles, 1, 2)add_edge!(g_roles, 2, 3)add_edge!(g_roles, 3, 4)println("Node roles (from incident edges):")for i in1:nv(g_roles)println(" Node ", i, ": ", node_role(g_roles, i))end
A short chain: node 1 is a source, 2–3 are intermediate, 4 is a sink.
3.4 Building from Dyads
Three classical patterns that organise the next chapter are just overlapping dyads (Chapter 3):
Chain: \(X \rightarrow Y\) and \(Y \rightarrow Z\) (mediation along a directed path)
Fork: \(X \leftarrow Y \rightarrow Z\) (common cause; the good-control motif of Chapter 1 when \(Y\) is the confounder)
Collider: \(X \rightarrow Y \leftarrow Z\) (common effect; conditioning opens a path that association alone does not)
Nothing in those names adds a fourth kind of atom. What changes is how paths compose, which routes association under observation, and which routes remain open or closed under intervention. Identification criteria (backdoor, frontdoor, and the adjustment stories of Chapter 5) are read on assemblies of dyads, not on freestanding nodes.
With \(n\) nodes there are \(n(n-1)\) possible directed dyads; realistic models keep only a sparse subset. That sparsity is both a modelling assumption, or rather, the formalisation of scientific knowledge and hypotheses (most quantities do not directly take account of most others) and what makes many graph algorithms practical. A dense digraph on ten nodes already has ninety possible edges; scientific DAGs typically retain a small fraction, and the absent edges are as much part of the Structural claim as the present ones.
rng =StableRNG(2)n =10total_possible = n * (n -1)g_sparse =SimpleDiGraph(n)for i in1:nfor t inrand(rng, 1:n, rand(rng, 1:2))if t != iadd_edge!(g_sparse, i, t)endendendactual_edges =ne(g_sparse)println("System with ", n, " nodes:")println(" Possible directed dyads: ", total_possible)println(" Edges in a sparse draw: ", actual_edges)println(" Fraction absent: ", round(100* (1- actual_edges / total_possible); digits =1), "%")
System with 10 nodes:
Possible directed dyads: 90
Edges in a sparse draw: 13
Fraction absent: 85.6%
3.5 Summary
Causality begins with a relation. The dyad is that atom: two nodes, one directed edge, one local mechanism \(Y \coloneqq f(X, U)\). On the three-strata grid it is primarily a Structural claim about parents and mechanisms; Dynamical and Observable readings reuse the same form when state or measurement take account of parents through time. Node roles follow incident edges; chains, forks, and colliders are assemblies of dyads; sparsity of possible edges is the usual scientific case. Interventions set the source of a dyad without inventing a new kind of relation, which is why \(do(\cdot)\) on Chapter 1’s confounded example could change \(A\) while leaving the mechanism for \(Y\) intact.
Chapter 3 composes these atoms into path patterns and d-separation. Chapter 4 makes the mechanisms executable.
Peters et al. (2017): Elements of Causal Inference — bivariate cause–effect models and independent mechanisms
Pearl (2009): Causality — interventions as local surgery on mechanisms
Whitehead (1978): process orientation (prehension glossed in the Introduction)
Pearl, Judea. 2009. Causality: Models, Reasoning, and Inference. 2nd ed. Cambridge University Press.
Peters, Jonas, Dominik Janzing, and Bernhard Schölkopf. 2017. Elements of Causal Inference: Foundations and Learning Algorithms. MIT Press.
Whitehead, Alfred North. 1978. Process and Reality: An Essay in Cosmology. Edited by David Ray Griffin and Donald W. Sherburne. Free Press.
This is a limited modelling use of Whitehead’s term for recipient-specific incorporation; the graph remains a causal-graphical relation and does not thereby imply consciousness or metaphysical fundamentality.↩︎