Causal reductionism and the frog#
Download this page as a Jupyter notebook
Causal reductionism is the assumption that once every elementary unit’s cause has been accounted for, there is nothing causal left to explain — a whole is, causally, nothing more than its parts. This tutorial reproduces the central demonstration of
Grasso M, Albantakis L, Lang JP, Tononi G (2021). Causal reductionism and causal structures. Nature Neuroscience, 24, 1348–1355. https://doi.org/10.1038/s41593-021-00911-8
that the assumption is false: some composite (higher-order) mechanisms have causes of their own, irreducible to the causes of their parts, and an actual-causation analysis makes those causes explicit. It uses PyPhi’s actual-causation tools; for an introduction to those tools on a smaller network, see Actual causation.
import pyphi
from dataclasses import replace
from pyphi import actual
pyphi.config.progress_bars = False
The frogs#
The paper studies three species of simulated “frog” organisms that catch bugs. Each frog has sensors (on its retina), central neurons (its brain), and motor units (that drive a jump). The species differ only in how the central neurons are wired:
F3 — three sensors (
SL,SC,SR), three central neurons (CL,CC,CR), two motors (ML,MR).CCis a super-bug detector: a single composite unit that fires when the left and right sensors are on together.F2 — the super-bug detector
CChas been removed, but the remaining central neuronsCLandCRstill act together on the motors.F1 — a pair of “half-frogs,” each reduced to two sensors, one central neuron, and one motor. This is the most reductionist wiring.
Each frog is available as a substrate:
substrate = pyphi.examples.frog_substrate("F3")
substrate
| Units | SL, SC, SR, CL, CC, CR, ML, MR |
|---|---|
| State space | binary |
| SL | SC | SR | CL | CC | CR | ML | MR | |
|---|---|---|---|---|---|---|---|---|
| SL | · | · | · | 1 | 1 | · | · | · |
| SC | · | · | · | 1 | 1 | 1 | · | · |
| SR | · | · | · | · | 1 | 1 | · | · |
| CL | · | · | · | · | · | · | 1 | · |
| CC | · | · | · | · | · | · | 1 | 1 |
| CR | · | · | · | · | · | · | · | 1 |
| ML | · | · | · | · | · | · | · | · |
| MR | · | · | · | · | · | · | · | · |
| state | SL | SC | SR | CL | CC | CR | ML | MR |
|---|---|---|---|---|---|---|---|---|
| (0,0,0,0,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 |
| (1,0,0,0,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 1.0 | 0.249352 | 0.00386592 | 0.00386592 | 0.00386592 |
| (0,1,0,0,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.945959 | 0.249352 | 0.00386592 | 0.00386592 |
| (1,1,0,0,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.411112 | 0.249352 | 0.00386592 | 0.00386592 |
| (0,0,1,0,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 1.0 | 0.00386592 | 0.00386592 |
| (1,0,1,0,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 1.0 | 1.0 | 1.0 | 0.00386592 | 0.00386592 |
| (0,1,1,0,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.411112 | 0.249352 | 0.00386592 | 0.00386592 |
| (1,1,1,0,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.011109 | 0.249352 | 0.00386592 | 0.00386592 |
| (0,0,0,1,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.800737 | 0.00386592 |
| (1,0,0,1,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 1.0 | 0.249352 | 0.00386592 | 0.800737 | 0.00386592 |
| (0,1,0,1,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.945959 | 0.249352 | 0.800737 | 0.00386592 |
| (1,1,0,1,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.411112 | 0.249352 | 0.800737 | 0.00386592 |
| (0,0,1,1,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 1.0 | 0.800737 | 0.00386592 |
| (1,0,1,1,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 1.0 | 1.0 | 1.0 | 0.800737 | 0.00386592 |
| (0,1,1,1,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.411112 | 0.249352 | 0.800737 | 0.00386592 |
| (1,1,1,1,0,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.011109 | 0.249352 | 0.800737 | 0.00386592 |
| (0,0,0,0,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.0285655 | 0.0285655 |
| (1,0,0,0,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 1.0 | 0.249352 | 0.00386592 | 0.0285655 | 0.0285655 |
| (0,1,0,0,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.945959 | 0.249352 | 0.0285655 | 0.0285655 |
| (1,1,0,0,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.411112 | 0.249352 | 0.0285655 | 0.0285655 |
| (0,0,1,0,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 1.0 | 0.0285655 | 0.0285655 |
| (1,0,1,0,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 1.0 | 1.0 | 1.0 | 0.0285655 | 0.0285655 |
| (0,1,1,0,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.411112 | 0.249352 | 0.0285655 | 0.0285655 |
| (1,1,1,0,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.011109 | 0.249352 | 0.0285655 | 0.0285655 |
| (0,0,0,1,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 1.0 | 0.0285655 |
| (1,0,0,1,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 1.0 | 0.249352 | 0.00386592 | 1.0 | 0.0285655 |
| (0,1,0,1,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.945959 | 0.249352 | 1.0 | 0.0285655 |
| (1,1,0,1,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.411112 | 0.249352 | 1.0 | 0.0285655 |
| (0,0,1,1,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 1.0 | 1.0 | 0.0285655 |
| (1,0,1,1,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 1.0 | 1.0 | 1.0 | 1.0 | 0.0285655 |
| (0,1,1,1,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.411112 | 0.249352 | 1.0 | 0.0285655 |
| (1,1,1,1,1,0,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.011109 | 0.249352 | 1.0 | 0.0285655 |
| (0,0,0,0,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.800737 |
| (1,0,0,0,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 1.0 | 0.249352 | 0.00386592 | 0.00386592 | 0.800737 |
| (0,1,0,0,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.945959 | 0.249352 | 0.00386592 | 0.800737 |
| (1,1,0,0,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.411112 | 0.249352 | 0.00386592 | 0.800737 |
| (0,0,1,0,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 1.0 | 0.00386592 | 0.800737 |
| (1,0,1,0,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 1.0 | 1.0 | 1.0 | 0.00386592 | 0.800737 |
| (0,1,1,0,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.411112 | 0.249352 | 0.00386592 | 0.800737 |
| (1,1,1,0,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.011109 | 0.249352 | 0.00386592 | 0.800737 |
| (0,0,0,1,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.800737 | 0.800737 |
| (1,0,0,1,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 1.0 | 0.249352 | 0.00386592 | 0.800737 | 0.800737 |
| (0,1,0,1,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.945959 | 0.249352 | 0.800737 | 0.800737 |
| (1,1,0,1,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.411112 | 0.249352 | 0.800737 | 0.800737 |
| (0,0,1,1,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 1.0 | 0.800737 | 0.800737 |
| (1,0,1,1,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 1.0 | 1.0 | 1.0 | 0.800737 | 0.800737 |
| (0,1,1,1,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.411112 | 0.249352 | 0.800737 | 0.800737 |
| (1,1,1,1,0,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.249352 | 0.011109 | 0.249352 | 0.800737 | 0.800737 |
| (0,0,0,0,1,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.00386592 | 0.0285655 | 1.0 |
| (1,0,0,0,1,1,0,0) | 0.00386592 | 0.00386592 | 0.00386592 | 1.0 | 0.249352 | 0.00386592 | 0.0285655 | 1.0 |
Reproducing the paper’s settings#
The paper’s analysis is actual causation computed with IIT 3.0 measures (see
Reproduce results from earlier versions of IIT). We build that configuration from the
built-in iit3 preset and layer on the specific choices the paper
uses: WEDGE_TRIPARTITION mechanism partitions, the absolute-intrinsic-
difference (AID) measure, and the WPMI α-measure for actual causation. State
validation is turned off because the frogs’ observed states need not be
reachable from every other state.
frog_formalism = dict(
iit=replace(
pyphi.iit3["iit"],
mechanism_partition_scheme="WEDGE_TRIPARTITION",
mechanism_phi_measure="AID",
),
validate_system_states=False,
alpha_measure="WPMI",
)
Constructing a substrate or transition does not depend on this configuration;
only computing the account does. So we apply frog_formalism in a
config.override block around each account computation.
F3: the account of a frog’s behavior#
frog_transition gives the state transition the paper analyzes — the frog
observed catching a bug, described by its state just before and just after,
together with the sensor units taken as potential causes and the motor and
central units taken as potential effects.
with pyphi.config.override(**frog_formalism):
account = actual.account(pyphi.examples.frog_transition("F3"))
account
| Causal links | 23 |
|---|---|
| Σα | 12.2889 |
| Direction | Mechanism | Purview | α |
|---|---|---|---|
| CAUSE | [CL] | [SL,SC] | 0.940101 |
| CAUSE | [CC] | [SL,SC,SR] | 0.391694 |
| CAUSE | [CR] | [SC,SR] | 0.940101 |
| CAUSE | [ML] | [CL] | 0.957012 |
| CAUSE | [MR] | [CR] | 0.957012 |
| CAUSE | [CL,CC] | [SL,SC,SR] | 0.472435 |
| CAUSE | [CL,CR] | [SL,SC,SR] | 0.417308 |
| CAUSE | [CC,CR] | [SL,SC,SR] | 0.472435 |
| CAUSE | [ML,MR] | [CC] | 0.0899044 |
| CAUSE | [CL,CC,CR] | [SL,SC,SR] | 0.157723 |
| EFFECT | [SL] | [CL] | 0.458355 |
| EFFECT | [SC] | [CL,CR] | 0.210687 |
| EFFECT | [SR] | [CR] | 0.458355 |
| EFFECT | [CL] | [ML] | 0.877183 |
| EFFECT | [CC] | [ML,MR] | 0.0879651 |
| EFFECT | [CR] | [MR] | 0.877183 |
| EFFECT | [SL,SC] | [CL,CC] | 0.786338 |
| EFFECT | [SL,SR] | [CC] | 0.138892 |
| EFFECT | [SC,SR] | [CC,CR] | 0.786338 |
| EFFECT | [CL,CC] | [ML] | 0.151412 |
| EFFECT | [CC,CR] | [MR] | 0.151412 |
| EFFECT | [SL,SC,SR] | [CL,CC,CR] | 1.35764 |
| EFFECT | [CL,CC,CR] | [ML,MR] | 0.151412 |
The account is the frog’s full causal structure: every irreducible causal link between an occurrence at one time and an occurrence at the other, each with its irreducibility \(\alpha\). It behaves like a sequence of links.
len(account)
23
The causes reductionism misses#
A first-order account would list only the causes of individual units. The interesting links are the composite ones, whose cause or effect spans more than one unit:
composite = [link for link in account if len(link.purview) >= 2]
len(composite)
13
Among them is the cause of the super-bug detector CC. Its cause is not any
single sensor but the joint occurrence of all three sensors — a composite
cause that no first-order analysis can represent:
labels = substrate.node_labels
for link in account:
mechanism = ",".join(labels[i] for i in link.mechanism)
purview = ",".join(labels[i] for i in link.purview)
if mechanism == "CC" or purview == "SL,SC,SR":
print(f"{link.direction!s:>6} {mechanism:>8} purview [{purview}] α = {float(link.alpha):.3f}")
CAUSE CC purview [SL,SC,SR] α = 0.392
CAUSE CL,CC purview [SL,SC,SR] α = 0.472
CAUSE CL,CR purview [SL,SC,SR] α = 0.417
CAUSE CC,CR purview [SL,SC,SR] α = 0.472
CAUSE CL,CC,CR purview [SL,SC,SR] α = 0.158
EFFECT CC purview [ML,MR] α = 0.088
The explain method spells a single link out in words:
cc_cause = next(
link for link in account
if ",".join(labels[i] for i in link.mechanism) == "CC"
and link.direction is pyphi.Direction.CAUSE
)
print(cc_cause.explain())
╭─ α = 0.391694 ────────────────╮
├─ Why ─────────────────────────┤
│ Purview (0, 1, 2) │
│ Partition CC/∅ × ∅/SL,SC,SR │
╰───────────────────────────────╯
The whole account is also available as a data frame, for sorting or export:
account.to_pandas()
| alpha | direction | mechanism | purview | |
|---|---|---|---|---|
| 0 | 0.940101 | CAUSE | (CL,) | (SL, SC) |
| 1 | 0.391694 | CAUSE | (CC,) | (SL, SC, SR) |
| 2 | 0.940101 | CAUSE | (CR,) | (SC, SR) |
| 3 | 0.957012 | CAUSE | (ML,) | (CL,) |
| 4 | 0.957012 | CAUSE | (MR,) | (CR,) |
| 5 | 0.472435 | CAUSE | (CL, CC) | (SL, SC, SR) |
| 6 | 0.417308 | CAUSE | (CL, CR) | (SL, SC, SR) |
| 7 | 0.472435 | CAUSE | (CC, CR) | (SL, SC, SR) |
| 8 | 0.089904 | CAUSE | (ML, MR) | (CC,) |
| 9 | 0.157723 | CAUSE | (CL, CC, CR) | (SL, SC, SR) |
| 10 | 0.458355 | EFFECT | (SL,) | (CL,) |
| 11 | 0.210687 | EFFECT | (SC,) | (CL, CR) |
| 12 | 0.458355 | EFFECT | (SR,) | (CR,) |
| 13 | 0.877183 | EFFECT | (CL,) | (ML,) |
| 14 | 0.087965 | EFFECT | (CC,) | (ML, MR) |
| 15 | 0.877183 | EFFECT | (CR,) | (MR,) |
| 16 | 0.786338 | EFFECT | (SL, SC) | (CL, CC) |
| 17 | 0.138892 | EFFECT | (SL, SR) | (CC,) |
| 18 | 0.786338 | EFFECT | (SC, SR) | (CC, CR) |
| 19 | 0.151412 | EFFECT | (CL, CC) | (ML,) |
| 20 | 0.151412 | EFFECT | (CC, CR) | (MR,) |
| 21 | 1.357640 | EFFECT | (SL, SC, SR) | (CL, CC, CR) |
| 22 | 0.151412 | EFFECT | (CL, CC, CR) | (ML, MR) |
Comparing the three species#
The paper’s argument is comparative: as the wiring is simplified, the composite causal structure thins out, but it never disappears entirely — even the reduced frogs contain composite causes that reductionism cannot account for. We count the composite links in each species’ account.
for species in ("F3", "F2", "F1"):
with pyphi.config.override(**frog_formalism):
account = actual.account(pyphi.examples.frog_transition(species))
composite = sum(1 for link in account if len(link.purview) >= 2)
print(f"{species}: {len(account):>3} links, {composite:>2} composite")
F3: 23 links, 13 composite
F2: 15 links, 6 composite
F1: 12 links, 2 composite
F3, with its dedicated super-bug detector, has the richest composite
structure; F1, the reductionist baseline, the least. But the count is never
zero: composite causes arise from the wiring itself.
Takeaway#
Fixing the cause of every individual unit does not fix the causes of the composite mechanisms those units form. The super-bug detector’s cause is the three sensors acting together, and no enumeration of single-unit causes contains it. Actual causation makes such composite causes explicit, which is why — contrary to the reductionist intuition — a system can be, causally, more than the sum of its parts.
Where to go next#
Actual causation — the actual-causation tools on a smaller network.
Reproduce results from earlier versions of IIT — the earlier versions of IIT and the presets that reproduce them.