The Model
Property insurance loss ratio is the canonical executive question for a coastal insurer. Four observable variables drive it. Storm season, the prevailing weather regime over the policy period. Building vintage, a proxy for construction quality, code era, and material resilience. Claim frequency, how often a covered loss is filed in this policy-year. Claim severity, the dollar size of each claim conditional on it being filed. Loss ratio is the ratio of payouts to premium — the bottom line.
The graph below commits to a particular causal story: storm season drives frequency (more storms, more claims filed), building vintage drives severity (older buildings sustain more dollar damage per event), and frequency and severity together produce the loss ratio. There is no arrow from storm season to severity in this model, and no arrow from building vintage to frequency. Those are the modeller’s claims. They are testable and revisable; if either is wrong, the model needs a different graph, not different numbers.
The graph fixes which variables can appear on the right side of which equation. The functions then specify how the right side combines into the left.
The Equations
Each variable in the model gets one equation, in topological order. Each equation has exactly two kinds of inputs: the variable’s direct causes (its parents in the graph), and one exogenous noise term U that collects everything not in the model.
Three things in this notation matter more than the symbols suggest.
The asymmetric assignment. The operator := is a one-directional assignment, not an equation. F := fF(S, UF) says the value of F is computed from S and UF, in that direction. Reversing it to S := fS(F, US) describes the same joint distribution — the same correlations between S and F — but a different causal world, one where claim frequency causes storm season. Statistical equations don’t care about that direction. Structural equations do, and the difference is the entire content of the model. Two Structural Causal Models (SCMs) with the same joint distribution but different graphs give different answers to interventional and counterfactual queries.
The noise terms. Each variable gets its own U. UV is everything that determined this particular building’s vintage that the model does not represent — the developer’s budget in 1987, the local building code at the time, whatever was available in the lumber market. UL is whatever idiosyncratic shocks affect the loss ratio that the four upstream variables don’t capture. The U values are not measurement error. They are the part of the world that lives outside the model, and counterfactual reasoning works precisely because once you fix the U values, you have pinned down which world you are reasoning about.
The functional form. fS, fV, and the others can be anything the domain calls for: a linear regression, a logistic, a lookup table, a threshold rule. A discrete Bayesian network exhausts fi as a conditional probability table covering every parent combination. A continuous model uses a parametric form. The graph fixes the dependency structure; the function fixes the arithmetic.
A Concrete Run (Rung 1)
Take a single-family dwelling on the Florida coast, pre-1990 construction, $3,200 annual premium. We are simulating one year. The U values for this case are drawn from their priors. Once drawn, the equations propagate forward deterministically.
The factual loss ratio is 1.21. The book paid out $1.21 for every premium dollar collected on this policy in this season. That is the Rung 1 answer — what happened — computed forward through the equations once the world’s exogenous state was fixed.
Sample U from prior, propagate forward through the equations. Repeated across many cases this gives the joint distribution P(S, V, F, X, L). It tells you what tends to happen and how variables co-occur. It does not tell you what would happen if you intervened, and it does not tell you what would have happened to this case under different conditions.
An Intervention (Rung 2)
The factual run gave the loss ratio for one specific policy in one specific year. The next question every actuarial review wants answered is: if we increase the rate by 15% on this risk profile, what happens to the loss ratio? This is Rung 2 — a forward intervention — and the procedure is a small step up from Rung 1.
First, the model has to be extended. Rate action wasn’t in the original four-node graph. Add a new variable R representing the rate action (Hold, Increase, Decrease), and make Premium an explicit downstream node:
The crucial modeling claim is the lack of arrows from R to S, V, F, or X. Storms don’t worsen because the insurer charged more; buildings don’t age because the insurer charged more; severity doesn’t change because the insurer charged more. Rate action moves Premium and only Premium — which means it moves the denominator of the loss ratio, not the numerator. Whether that claim is correct is a domain question; for a one-year forward simulation it’s defensible. Across multi-year horizons it is wrong, because rate action affects renewal behavior and adverse selection, which feed back into F and X — that is a different model and a different page.
Apply the do-operator: replace R := fR(UR) with R := +0.15. The market dynamics that would normally determine rate action are severed. The U values for the original four nodes are not abducted — we are not asking about a specific policy under a different rate, we are asking what the model says happens when rate is set to +15% across the population. So S, V, F, X stay at their factual values for this run.
The intervention answer is 1.05 — better than 1.21, still above 1.0. A 15% rate increase reduces the loss ratio but does not return the book to profitability on this risk profile. The structural reason is visible in the equations: rate action moves the denominator only, and on a severe-season run with elevated frequency and severity, the numerator is too large for any defensible rate increase to fix alone. Profitability requires moving F (mitigation, deductible structure) or X (coverage limits, exclusions) — the variables that have arrows into the numerator.
Replace the equation for the intervened-on variable with a fixed value, leave the other equations alone, sample U from priors and propagate forward. The do-operator severs incoming arrows; the rest of the graph carries the consequences. This is the procedure that supports rate filings, regulatory testimony, and any “what would happen if we changed X” question that needs to hold the underlying loss-generation process fixed.
A Counterfactual (Rung 3)
The intervention answered a question about the policy class — what happens to risks like this one when rate is set to +15%. The adjuster’s actual question on this individual claim is different and harder: what would have happened to this policy if the season had been mild instead of severe. Same building. Same owner. Same zip-code repair-cost regime. Different weather. This is Rung 3 — the counterfactual — and it requires machinery the previous two rungs did not need.
Pearl’s three-step procedure operates directly on the structural equations.
1. Abduction. Pin the U values from the factual run. UV = 0.41 — this is still that pre-1990 building. UF = 0.62 — this owner’s claim-filing tendency is unchanged. UX = 0.55, UL = 0.0 — same zip, same idiosyncratic shock. US is no longer used because we are about to override S directly.
2. Action. Replace the equation for S with a fixed value. The original S := fS(US) goes; the new S := Mild takes its place. The graph keeps every other arrow; only the equation is surgically replaced. This is what the do-operator does formally — sever the incoming arrows of the intervened-on variable.
3. Prediction. Re-run the modified equations forward, using the abducted U values:
For this policy, in this counterfactual, the loss ratio would have been 0.40 — forty cents on the premium dollar instead of $1.21.
Two things are worth noticing about this answer. First, it is specific to this case. A regression on loss-ratio data, conditioned on Mild season and pre-1990 vintage, would return the population average for that subgroup. The counterfactual returns what would have happened to this case — pinned by the abducted U values — under a different season. The ratio of factual to counterfactual (1.21 / 0.40 ≈ 3.0) is the storm-season effect for this case specifically, which is generally not the same as the population-average storm-season effect. Second, severity stayed at $11,400 because fX depends on building vintage, not season — vintage didn’t move, so severity didn’t move. The counterfactual cleanly attributes the loss-ratio reduction to frequency, not severity, and that attribution falls out of the graph rather than being assumed.
Abduct U from factual evidence, intervene on the variable in question, predict forward. The U values are not redrawn — they encode which world we are in, and that has to be preserved or the question loses its referent. This is the procedure that produces a different answer than a population-level intervention would, and the procedure that statistical models cannot fake.
What Carried Through
The same five equations answered three categorically different questions. No retraining, no rebuilding, no swap of statistical method. The graph fixed which variables could affect which others; the equations fixed the arithmetic; and the three rungs differed in how the U values and the equations were treated.
| Rung | U values | Equations | Question |
|---|---|---|---|
| 1 — Seeing | Sampled from priors | All run forward | What tends to happen? |
| 2 — Doing | Sampled from priors | One replaced by do(); rest run forward | What would happen if we set X? |
| 3 — Imagining | Abducted from factual case | One replaced by do(); rest run forward with pinned U | What would have happened to this case if X had been different? |
The progression up the ladder is a progression in what gets held constant. Rung 1 holds nothing constant — you average over the world. Rung 2 holds the model’s mechanism constant while overriding one equation — you average over the world but in a counterfactual policy regime. Rung 3 holds the specific case’s exogenous state constant while overriding one equation — you ask about that case alone, in a different world.
This is also the cleanest answer to why a regression cannot do what an SCM does. A regression learns the conditional distribution P(L | F, X, S, V) from data. That distribution is enough for Rung 1. It is not enough for Rung 2, because the do-operator changes the joint distribution in ways that depend on the graph and not just on the conditional — specifically, it severs the incoming arrows of the intervened variable, which a conditional cannot represent. And it is nowhere near enough for Rung 3, because the regression has no representation of which case is which — no U values, no anchor for “this specific policy”. The U variables are the machinery that distinguishes this from typical. Without them, every counterfactual collapses into a population average and the adjuster’s actual question goes unanswered.
The graph and the equations together are the model. Pearl’s ladder is what the same model can do.
The walkthrough above is on a four-node toy. The case studies on this site — property insurance, utility grid risk, bank churn — run the same machinery on graphs of fifteen to thirty nodes calibrated against real portfolio data. The arithmetic gets larger; the procedure stays exactly as shown.