Causal reductionism and the frog#

Download this page as a Jupyter notebook Open in Colab

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). CC is a super-bug detector: a single composite unit that fires when the left and right sensors are on together.

  • F2 — the super-bug detector CC has been removed, but the remaining central neurons CL and CR still 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
Substrate8 units · SL, SC, SR, CL, CC, CR, ML, MR
UnitsSL, SC, SR, CL, CC, CR, ML, MR
State spacebinary
Connectivity
SLSCSRCLCCCRMLMR
SL···11···
SC···111··
SR····11··
CL······1·
CC······11
CR·······1
ML········
MR········
TPM
stateSLSCSRCLCCCRMLMR
(0,0,0,0,0,0,0,0)0.003865920.003865920.003865920.003865920.003865920.003865920.003865920.00386592
(1,0,0,0,0,0,0,0)0.003865920.003865920.003865921.0 0.249352 0.003865920.003865920.00386592
(0,1,0,0,0,0,0,0)0.003865920.003865920.003865920.249352 0.945959 0.249352 0.003865920.00386592
(1,1,0,0,0,0,0,0)0.003865920.003865920.003865920.249352 0.411112 0.249352 0.003865920.00386592
(0,0,1,0,0,0,0,0)0.003865920.003865920.003865920.003865920.249352 1.0 0.003865920.00386592
(1,0,1,0,0,0,0,0)0.003865920.003865920.003865921.0 1.0 1.0 0.003865920.00386592
(0,1,1,0,0,0,0,0)0.003865920.003865920.003865920.249352 0.411112 0.249352 0.003865920.00386592
(1,1,1,0,0,0,0,0)0.003865920.003865920.003865920.249352 0.011109 0.249352 0.003865920.00386592
(0,0,0,1,0,0,0,0)0.003865920.003865920.003865920.003865920.003865920.003865920.800737 0.00386592
(1,0,0,1,0,0,0,0)0.003865920.003865920.003865921.0 0.249352 0.003865920.800737 0.00386592
(0,1,0,1,0,0,0,0)0.003865920.003865920.003865920.249352 0.945959 0.249352 0.800737 0.00386592
(1,1,0,1,0,0,0,0)0.003865920.003865920.003865920.249352 0.411112 0.249352 0.800737 0.00386592
(0,0,1,1,0,0,0,0)0.003865920.003865920.003865920.003865920.249352 1.0 0.800737 0.00386592
(1,0,1,1,0,0,0,0)0.003865920.003865920.003865921.0 1.0 1.0 0.800737 0.00386592
(0,1,1,1,0,0,0,0)0.003865920.003865920.003865920.249352 0.411112 0.249352 0.800737 0.00386592
(1,1,1,1,0,0,0,0)0.003865920.003865920.003865920.249352 0.011109 0.249352 0.800737 0.00386592
(0,0,0,0,1,0,0,0)0.003865920.003865920.003865920.003865920.003865920.003865920.0285655 0.0285655
(1,0,0,0,1,0,0,0)0.003865920.003865920.003865921.0 0.249352 0.003865920.0285655 0.0285655
(0,1,0,0,1,0,0,0)0.003865920.003865920.003865920.249352 0.945959 0.249352 0.0285655 0.0285655
(1,1,0,0,1,0,0,0)0.003865920.003865920.003865920.249352 0.411112 0.249352 0.0285655 0.0285655
(0,0,1,0,1,0,0,0)0.003865920.003865920.003865920.003865920.249352 1.0 0.0285655 0.0285655
(1,0,1,0,1,0,0,0)0.003865920.003865920.003865921.0 1.0 1.0 0.0285655 0.0285655
(0,1,1,0,1,0,0,0)0.003865920.003865920.003865920.249352 0.411112 0.249352 0.0285655 0.0285655
(1,1,1,0,1,0,0,0)0.003865920.003865920.003865920.249352 0.011109 0.249352 0.0285655 0.0285655
(0,0,0,1,1,0,0,0)0.003865920.003865920.003865920.003865920.003865920.003865921.0 0.0285655
(1,0,0,1,1,0,0,0)0.003865920.003865920.003865921.0 0.249352 0.003865921.0 0.0285655
(0,1,0,1,1,0,0,0)0.003865920.003865920.003865920.249352 0.945959 0.249352 1.0 0.0285655
(1,1,0,1,1,0,0,0)0.003865920.003865920.003865920.249352 0.411112 0.249352 1.0 0.0285655
(0,0,1,1,1,0,0,0)0.003865920.003865920.003865920.003865920.249352 1.0 1.0 0.0285655
(1,0,1,1,1,0,0,0)0.003865920.003865920.003865921.0 1.0 1.0 1.0 0.0285655
(0,1,1,1,1,0,0,0)0.003865920.003865920.003865920.249352 0.411112 0.249352 1.0 0.0285655
(1,1,1,1,1,0,0,0)0.003865920.003865920.003865920.249352 0.011109 0.249352 1.0 0.0285655
(0,0,0,0,0,1,0,0)0.003865920.003865920.003865920.003865920.003865920.003865920.003865920.800737
(1,0,0,0,0,1,0,0)0.003865920.003865920.003865921.0 0.249352 0.003865920.003865920.800737
(0,1,0,0,0,1,0,0)0.003865920.003865920.003865920.249352 0.945959 0.249352 0.003865920.800737
(1,1,0,0,0,1,0,0)0.003865920.003865920.003865920.249352 0.411112 0.249352 0.003865920.800737
(0,0,1,0,0,1,0,0)0.003865920.003865920.003865920.003865920.249352 1.0 0.003865920.800737
(1,0,1,0,0,1,0,0)0.003865920.003865920.003865921.0 1.0 1.0 0.003865920.800737
(0,1,1,0,0,1,0,0)0.003865920.003865920.003865920.249352 0.411112 0.249352 0.003865920.800737
(1,1,1,0,0,1,0,0)0.003865920.003865920.003865920.249352 0.011109 0.249352 0.003865920.800737
(0,0,0,1,0,1,0,0)0.003865920.003865920.003865920.003865920.003865920.003865920.800737 0.800737
(1,0,0,1,0,1,0,0)0.003865920.003865920.003865921.0 0.249352 0.003865920.800737 0.800737
(0,1,0,1,0,1,0,0)0.003865920.003865920.003865920.249352 0.945959 0.249352 0.800737 0.800737
(1,1,0,1,0,1,0,0)0.003865920.003865920.003865920.249352 0.411112 0.249352 0.800737 0.800737
(0,0,1,1,0,1,0,0)0.003865920.003865920.003865920.003865920.249352 1.0 0.800737 0.800737
(1,0,1,1,0,1,0,0)0.003865920.003865920.003865921.0 1.0 1.0 0.800737 0.800737
(0,1,1,1,0,1,0,0)0.003865920.003865920.003865920.249352 0.411112 0.249352 0.800737 0.800737
(1,1,1,1,0,1,0,0)0.003865920.003865920.003865920.249352 0.011109 0.249352 0.800737 0.800737
(0,0,0,0,1,1,0,0)0.003865920.003865920.003865920.003865920.003865920.003865920.0285655 1.0
(1,0,0,0,1,1,0,0)0.003865920.003865920.003865921.0 0.249352 0.003865920.0285655 1.0
… 206 more

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
Account
Causal links23
Σα12.2889
Causal links
DirectionMechanismPurviewα
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#