5D Library › Early Experience, Epigenetic Methylation and the Limits of Intergenerational Transmission · 中文
Chapter 5 Differential Susceptibility: Orchids, Dandelions and the Crossover Test
Two models
Psychopathology has long used the diathesis–stress model: some people carry a vulnerable “diathesis” (genetic, temperamental or physiological) and are more likely to develop problems in adverse environments, while in good environments they do not differ from others. Belsky and Pluess proposed another possibility: the same characteristics may represent not “vulnerability” but greater sensitivity to the environment, whether it is good or bad. In adverse environments these children do worse; in supportive environments they do better than other children. This is the differential susceptibility hypothesis (Belsky and Pluess 2009).
Evidence
Biological sensitivity to context. From an evolutionary-developmental perspective, Boyce and Ellis proposed a theory of “biological sensitivity to context”: highly stress-reactive children are more prone to health and behaviour problems in highly stressful environments but have the best health outcomes in highly supportive ones, and the authors suggested that high reactivity is more common in both very adverse and very protected environments (Boyce and Ellis 2005). Ellis and Boyce later summarised the idea by borrowing the Swedish expression “dandelion children” (maskrosbarn, who grow in almost any environment) and setting against it “orchid children” (who wither under neglect and flourish with care) (Ellis and Boyce 2008).
Belsky and Pluess reviewed evidence for temperament (such as infants high in negative emotionality), physiology (stress reactivity) and several candidate genes (such as certain variants of the dopamine D4 receptor and serotonin transporter genes) as markers of susceptibility (Belsky and Pluess 2009). The idea has been very influential because it redescribes “problem children” as “the children most sensitive to their environment”: they are not destined for trouble, and they may be the ones who gain most from a good environment.
The crossover: the statistical difference between the models
Calculation
Let , where is the quality of the caregiving environment (higher is better), a susceptibility marker and adjustment (higher is better), all standardised. The regression lines for high and low cross at . Differential susceptibility predicts a crossover in the middle of the environmental range; diathesis–stress predicts a crossover at or beyond the top of the range. Following the recommendations of Roisman and colleagues (Roisman et al. 2012), the program reports the crossover and its 95 % confidence interval (delta method); the range of over which the effect of is significant (region of significance); and PoI, the share of the area between the and lines (for from −2 to +2) that lies on the “high does better” side. Coefficients are illustrative; 400 children per scenario.
# Differential susceptibility (DS) versus diathesis-stress (D-S).
# Y = b0 + b1 E + b2 S + b3 E*S + noise; E = caregiving quality, S = a
# susceptibility marker, Y = adjustment (higher = better), all standardised.
# High- and low-S lines cross at E_c = -b2 / b3: mid-range under DS, at or
# beyond the top of the range under D-S. Diagnostics after Roisman et al.
# (2012): crossover with 95 % CI (delta method), region of significance of
# S, and PoI = share of the area between the S = +1 and S = -1 lines (E from
# -2 to +2) on the "high S does better" side. Coefficients ILLUSTRATIVE.
import math, random
def fit(E, S, Y): # OLS via Gauss-Jordan: b and covariance
X = [(1.0, e, s, e * s) for e, s in zip(E, S)]
M = [[sum(x[i] * x[j] for x in X) for j in range(4)]
+ [sum(x[i] * y for x, y in zip(X, Y))]
+ [float(i == j) for j in range(4)] for i in range(4)]
for c in range(4):
p = max(range(c, 4), key=lambda r: abs(M[r][c])); M[c], M[p] = M[p], M[c]
M[c] = [v / M[c][c] for v in M[c]]
for r in (r for r in range(4) if r != c):
M[r] = [a - M[r][c] * b for a, b in zip(M[r], M[c])]
b = [M[i][4] for i in range(4)]
s2 = sum((y - sum(u * w for u, w in zip(b, x))) ** 2
for x, y in zip(X, Y)) / (len(Y) - 4)
return b, [[s2 * M[i][5 + j] for j in range(4)] for i in range(4)]
def diagnose(b, V):
b2, b3 = b[2], b[3]; ec = -b2 / b3
se = math.sqrt(V[2][2] + ec * ec * V[3][3] + 2 * ec * V[2][3]) / abs(b3)
z = lambda e: (b2 + b3 * e) / math.sqrt(V[2][2] + 2 * e * V[2][3]
+ e * e * V[3][3])
sig = [abs(z(e / 100)) > 1.96 for e in range(-300, 301)]
edges = [(e - 300) / 100 for e in range(1, 601) if sig[e] != sig[e - 1]]
pos = sum(max(0, b2 + b3 * e / 100) for e in range(-200, 201))
tot = sum(abs(b2 + b3 * e / 100) for e in range(-200, 201))
return ec, se, edges, pos / tot
def data(kind, n, rng):
E = [rng.gauss(0, 1) for _ in range(n)]; S = [rng.gauss(0, 1) for _ in range(n)]
b = (0, 0.30, 0.0, 0.25) if kind == "DS" else (0, 0.30, -0.25, 0.125)
Y = [b[1] * e + b[2] * s + b[3] * e * s + rng.gauss(0, 1) for e, s in zip(E, S)]
return E, S, Y, b
if __name__ == "__main__":
rng = random.Random(2009)
for kind in ("DS", "D-S"):
E, S, Y, tr = data(kind, 400, rng)
b, V = fit(E, S, Y); ec, se, edges, poi = diagnose(b, V)
z3 = b[3] / math.sqrt(V[3][3])
print(f"{kind}: true crossover {-tr[2] / tr[3] + 0.0:+.1f} SD; n = 400;"
f" b2 = {b[2]:+.3f}, b3 = {b[3]:.3f} (z = {z3:.2f})")
print(f" crossover {ec:+.2f} SD (95 % CI {ec - 1.96 * se:+.2f} to"
f" {ec + 1.96 * se:+.2f})")
print(" significance of S switches at E = "
+ ", ".join(f"{x:+.2f}" for x in edges) + " (scan from -3 to +3)")
print(f" PoI = {poi:.2f}; sample above the crossover:"
f" {sum(e > ec for e in E) / len(E):.0%}")
# DS: true crossover +0.0 SD; n = 400; b2 = +0.041, b3 = 0.224 (z = 5.04)
# crossover -0.18 SD (95 % CI -0.61 to +0.25)
# significance of S switches at E = -0.66, +0.27 (scan from -3 to +3)
# PoI = 0.59; sample above the crossover: 56%
# D-S: true crossover +2.0 SD; n = 400; b2 = -0.239, b3 = 0.125 (z = 2.33)
# crossover +1.92 SD (95 % CI +0.15 to +3.69)
# significance of S switches at E = +0.87 (scan from -3 to +3)
# PoI = 0.00; sample above the crossover: 5%In the differential-susceptibility scenario the estimated crossover is −0.18 standard deviations (95 % CI −0.61 to +0.25), in the middle of the environmental distribution; has a significant effect on both sides of the crossover (high is worse when is below about −0.66 and better when it is above about +0.27); PoI is 0.59 and about 56 % of the sample lies above the crossover. In the diathesis–stress scenario the crossover is +1.92 (95 % CI +0.15 to +3.69), with only 5 % of the sample above it; is significant only below about +0.87, well short of the crossover; PoI is 0.
Both patterns produce a significant interaction ( = 5.04 and 2.33), so a significant interaction alone does not support differential susceptibility; one must check where the lines cross and whether the “for better” side really exists. Note also how wide the crossover interval is in the diathesis–stress scenario, from +0.15 to +3.69: even with 400 children, the crossover is hard to locate precisely.
Note
The range of environments determines what can be seen. If a sample contains almost no genuinely high-quality caregiving environments, the “for better” half cannot be observed and differential susceptibility will look like diathesis–stress; conversely, if the measured “environment” covers mainly the adverse end, the top cannot be seen. This is why Roisman and colleagues recommend interpreting the crossover against the observed range of the environment (for example ±2 standard deviations).
Power and overfitting
Calculation
Part 1: true differential susceptibility with a small interaction (). How often does a study (a) find a significant interaction, and (b) meet the full differential-susceptibility pattern: a significant interaction, a 95 % crossover interval inside ±2 standard deviations, and significant effects of of opposite sign at both and ? Part 2: 10 candidate markers, none of which truly moderates anything, with 200 children per study.
# Power for E x S interactions, and the cost of testing many candidate markers.
# Part 1: true DS with a SMALL interaction, b3 = 0.10 (b1 = 0.30, b2 = 0). How
# often does a study (a) find p < .05 for b3, (b) meet the full DS pattern:
# significant b3, crossover 95 % CI inside -2..+2 SD, and significant
# effects of S of opposite sign at E = -2 and E = +2?
# Part 2: 10 candidate markers, none of which moderates anything, n = 200.
# Coefficients ILLUSTRATIVE; E, S standard normal; residual SD 1.
import math, random
rng = random.Random(1993)
def fit(E, S, Y): # OLS via Gauss-Jordan: b and covariance
X = [(1.0, e, s, e * s) for e, s in zip(E, S)]
M = [[sum(x[i] * x[j] for x in X) for j in range(4)]
+ [sum(x[i] * y for x, y in zip(X, Y))]
+ [float(i == j) for j in range(4)] for i in range(4)]
for c in range(4):
p = max(range(c, 4), key=lambda r: abs(M[r][c])); M[c], M[p] = M[p], M[c]
M[c] = [v / M[c][c] for v in M[c]]
for r in (r for r in range(4) if r != c):
M[r] = [a - M[r][c] * b for a, b in zip(M[r], M[c])]
b = [M[i][4] for i in range(4)]
s2 = sum((y - sum(u * w for u, w in zip(b, x))) ** 2
for x, y in zip(X, Y)) / (len(Y) - 4)
return b, [[s2 * M[i][5 + j] for j in range(4)] for i in range(4)]
def ds_pattern(b, V):
b2, b3 = b[2], b[3]
if abs(b3) / math.sqrt(V[3][3]) < 1.96: return False, False
ec = -b2 / b3
se = math.sqrt(V[2][2] + ec * ec * V[3][3] + 2 * ec * V[2][3]) / abs(b3)
z = lambda e: (b2 + b3 * e) / math.sqrt(V[2][2] + 2 * e * V[2][3]
+ e * e * V[3][3])
both = abs(z(-2)) > 1.96 and abs(z(2)) > 1.96 and z(-2) * z(2) < 0
return True, -2 < ec - 1.96 * se and ec + 1.96 * se < 2 and both
def study(n, b3):
E = [rng.gauss(0, 1) for _ in range(n)]; S = [rng.gauss(0, 1) for _ in range(n)]
Y = [0.30 * e + b3 * e * s + rng.gauss(0, 1) for e, s in zip(E, S)]
return ds_pattern(*fit(E, S, Y))
print("true b3 = 0.10 (DS, crossover at 0): 300 simulated studies per size")
print(" n | b3 significant | full DS pattern")
for n in (100, 300, 1000):
res = [study(n, 0.10) for _ in range(300)]
a = sum(x for x, _ in res) / 300; c = sum(y for _, y in res) / 300
print(f" {n:5d} | {a:14.0%} | {c:15.0%}")
need = math.ceil(((1.96 + 1.2816) / 0.10) ** 2) # se(b3) ~ 1/sqrt(n)
print(f"normal approximation: about {need} children for 90 % power")
hits, sizes = 0, []
for _ in range(300):
E = [rng.gauss(0, 1) for _ in range(200)]
Y = [0.30 * e + rng.gauss(0, 1) for e in E]
found = False
for m in range(10):
b, V = fit(E, [rng.gauss(0, 1) for _ in range(200)], Y)
if abs(b[3]) / math.sqrt(V[3][3]) > 1.96:
found = True; sizes.append(abs(b[3]))
hits += found
print(f"10 null markers, n = 200: a 'significant' interaction in {hits / 300:.0%}"
" of studies;")
print(f" these average |b3| = {sum(sizes) / len(sizes):.2f}, though every"
" true b3 is 0")
# true b3 = 0.10 (DS, crossover at 0): 300 simulated studies per size
# n | b3 significant | full DS pattern
# 100 | 18% | 6%
# 300 | 43% | 23%
# 1000 | 89% | 69%
# normal approximation: about 1051 children for 90 % power
# 10 null markers, n = 200: a 'significant' interaction in 43% of studies;
# these average |b3| = 0.17, though every true b3 is 0With a true interaction of 0.10, a study of 100 children detects the interaction only about 18 % of the time and meets the full pattern only about 6 % of the time; with 300 children, 43 % and 23 %; only with 1,000 children do the figures reach 89 % and 69 %. By the normal approximation, about 1,051 children are needed for 90 % power to detect such an interaction. Part 2 is more worrying: with 10 completely null candidate markers, about 43 % of studies find at least one “significant” interaction, and these “significant” interactions average about 0.17, larger than the real interaction above.
This is a miniature of what happened to candidate-gene research over the past two decades.
Evidence
The replication crisis of candidate gene-by-environment interactions. Duncan and Keller reviewed the first ten years of candidate gene-by-environment research in psychiatry: 96 % of novel studies reported significant results, compared with 27 % of replication attempts, with clear evidence of publication bias (Duncan and Keller 2011). Border and colleagues tested the 18 historically most studied candidate genes for depression and their interactions with the environment in several large samples (up to hundreds of thousands of people) and found no support (Border et al. 2019).
So claims such as “children carrying a certain gene variant are orchids” currently have no reliable basis. Differential susceptibility as a pattern remains worth studying, and some randomised experiments (comparing the effect of an intervention among children of different susceptibility) and studies using genome-wide, behavioural or physiological measures offer some support, but effects are usually small and replication is limited.
What this means for families
Note
Do not label children as “orchids”. Differential susceptibility is a hypothesis about patterns of interaction in populations; no test can currently tell whether a particular child is an “orchid” or a “dandelion”, still less decide how the child should be treated. A reasonable and modest lesson for parents is that the same family environment may affect different children differently, and differences between siblings do not necessarily mean that the parents play favourites or that one child “has a problem”. This also fits the large non-shared environment of Chapter 2.
Hypothesis · not established
Susceptibility and “modelling a pause” (not yet established). If differential susceptibility holds, the children who gain most when parents learn to model a pause under stress should be those most sensitive to their environment. A testable prediction: in the Chapter 8 trial, the intervention effect is larger among children with higher baseline emotional reactivity, and these children do not do better in the control arm; the crossover should fall within the observed range. This analysis can only be pre-registered as exploratory: by this chapter’s power calculations, the Chapter 8 sample is not large enough to detect such an interaction reliably. If the effect is not larger among highly reactive children, or if highly reactive children do worse in the control arm and merely catch up in the intervention arm, the latter fits the diathesis–stress model better.
Chapter summary
Differential susceptibility holds that the same children do worse “for worse” and better “for better”; diathesis–stress holds that they only do worse in adverse environments. Both produce significant interactions and can only be told apart by the crossover, the regions of significance and PoI, and crossover intervals are often wide. Small interactions need about a thousand children, testing many candidate markers produces inflated false positives, and candidate gene-by-environment findings replicate poorly. The next chapter asks what weakens negative intergenerational cycles.
References
Fan, Y. (2026). Early Experience, Epigenetic Methylation and the Limits of Intergenerational Transmission: From Glucocorticoid-Receptor Programming and Twin Variance Decomposition to Social-Learning Channels, Read Beside Classical Chinese Family Instruction [早期经验、表观遗传甲基化与跨代行为先验的传递边界] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23761337 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).