5D Library › Social Network Topology, Structural Holes and Complex Contagion · 中文
Chapter 3 Simple and Complex Contagion
Thresholds
A piece of news or a joke may be passed on after being heard once. Many behaviours are different: whether to start running, join a new association or adopt a time-consuming new practice in a team, people often need to see more than one acquaintance do it before they follow. In 1978 Granovetter described such collective behaviour with a threshold model: each person has a threshold, and adopts once the number (or share) of others around who have adopted exceeds it. A famous example shows how extremely sensitive the outcome is to the distribution of thresholds: if a hundred people have thresholds of exactly 0, 1, 2, …, 99, the first person’s action sets off a chain in which everyone ends up acting; replace the person whose threshold is 1 with someone whose threshold is 2, and the chain stops after the first person, although the “average disposition” of the two crowds is almost the same (Granovetter 1978). Volume 6 of 5D Library, The Economics of Attention, has already demonstrated this phase transition with a program, so it is not repeated here.
Centola and Macy called spreading that requires reinforcement from several sources complex contagion, and spreading for which one source suffices simple contagion. They pointed out that the long-range weak ties that most favour simple contagion are actually unfavourable to complex contagion: a long tie can carry only one adopter to a distant place, and people there need two or more adopters before they follow; to cross from one group to another, the bridge must be wide, made of several ties close to one another (Centola and Macy 2007).
Evidence
An online experiment. Centola recruited 1,528 participants from health-interest websites and placed them at random in purpose-built networks, each with 6 or 8 anonymous “health buddies”. There were six independent trials, each with a clustered lattice network and a random network with the same number of contacts per person. The behaviour that spread was registering for a health forum. On average it reached 53.77 % of the clustered networks and 38.26 % of the random networks, and it spread more than four times as fast in the clustered networks. Participants who received a second signal were significantly more likely to register than those who had received only one; a third signal had a smaller effect, and a fourth or later signal no significant effect (Centola 2010).
Evidence
Structural diversity. Ugander and colleagues analysed invitations to join Facebook and found that whether a person accepted depended not mainly on the number of friends who had already joined, but on how many separate, mutually unconnected circles those friends belonged to (“structural diversity”): invitations from several different circles were more effective than the same number of invitations from a single circle (Ugander et al. 2012).
The two studies point in different directions: Centola’s experiment shows that repeated reinforcement from one tight circle helps adoption, while Ugander and colleagues’ data show that contact from different circles is more effective. They do not contradict each other: the first controlled network structure and compared the spread of one behaviour across networks; the second is observational and measures the local structure around a person. Real diffusion probably needs both: enough reinforcement, and “social proof” from different sources.
Starting from volume 13: how wide a bridge, and where
Chapter 5 of volume 13 of 5D Library, The Classical and Statistical Mechanics of Action, compared spreading with thresholds of 1, 2 and 3 on a ring of 400 people with 8 contacts each: simple contagion was fastest on random networks; with threshold 2, random networks reached only about 71 % on average; with threshold 3, none of 20 random networks was taken over, while the ring was covered circle by circle. This chapter builds on that by asking three more specific questions: how wide a bridge must be to cross from one group to another; how the same number of ties should be placed to be useful; and how the result changes when people’s thresholds differ.
Calculation
Group A has fully adopted a demanding new practice. Group B is a ring of 200 people, each tied to two neighbours on each side (4 contacts). There are ties from A to B, placed in one of two ways: a “wide bridge”, with the ties landing two at a time on adjacent people in B; or “scattered”, with each tie landing on a person in B chosen at random. People in B adopt once at least 2 of their contacts have adopted. Finally we consider the case in which some people in B have a threshold of only 1.
# Bridge width and threshold heterogeneity (extending volume 13, Chapter 5).
# Community A has fully adopted a costly behaviour. Community B is a ring of
# 200 people, each tied to 2 neighbours on each side (4 contacts). w bridge
# ties run from A to B. A person in B adopts once at least THETA of his or her
# contacts have adopted (Centola & Macy 2007). Bridges are either
# "wide": the w ties land two per person on adjacent people in B, or
# "scattered": each tie lands on a person in B chosen at random.
# Optionally a share f of people in B has threshold 1 instead of 2.
import random
rng = random.Random(6)
NB, REPS = 200, 2000
def spread_in_b(bridge_count, theta):
# bridge_count[i] = number of A-adopters tied to person i of B
adopted = [False] * NB
changed = True
while changed:
changed = False
for i in range(NB):
if adopted[i]:
continue
ring = sum(adopted[(i + d) % NB] for d in (-2, -1, 1, 2))
if ring + bridge_count[i] >= theta[i]:
adopted[i] = changed = True
return sum(adopted) / NB
def trial(w, kind, f=0.0):
count = [0] * NB
if kind == "wide":
start = rng.randrange(NB)
for t in range(w):
count[(start + t // 2) % NB] += 1
else:
for _ in range(w):
count[rng.randrange(NB)] += 1
theta = [1 if rng.random() < f else 2 for _ in range(NB)]
return spread_in_b(count, theta)
def p_cross(w, kind, f=0.0, reps=REPS):
return sum(trial(w, kind, f) > 0.9 for _ in range(reps)) / reps
print("threshold 2 for everyone in B: chance that B is taken over (> 90 % adopt)")
print(" bridge width w wide bridge scattered ties")
for w in (1, 2, 3, 4, 8, 16, 32):
wide, scat = p_cross(w, "wide", reps=50), p_cross(w, "scattered")
print(f" {w:5d} {wide:8.2f} {scat:10.3f}")
print("scattered ties, w = 4, with a share f of B at threshold 1:")
for f in (0.0, 0.02, 0.05, 0.1, 0.2):
print(f" f = {f:4.2f}: chance of take-over {p_cross(4, 'scattered', f):.3f}")
# threshold 2 for everyone in B: chance that B is taken over (> 90 % adopt)
# bridge width w wide bridge scattered ties
# 1 0.00 0.000
# 2 0.00 0.000
# 3 1.00 0.000
# 4 1.00 0.002
# 8 1.00 0.018
# 16 1.00 0.136
# 32 1.00 0.698
# scattered ties, w = 4, with a share f of B at threshold 1:
# f = 0.00: chance of take-over 0.002
# f = 0.02: chance of take-over 0.011
# f = 0.05: chance of take-over 0.043
# f = 0.10: chance of take-over 0.152
# f = 0.20: chance of take-over 0.412The results show that placement matters more than number. Three ties placed together (two on one person, one on the person next to them) are enough for the whole of group B to adopt: the first person has two adopting contacts; once he or she adopts, the neighbour has one tie from A plus one adopting neighbour and also reaches the threshold, and the practice spreads round the ring. The same three ties scattered never succeeded in 2,000 random placements; 16 scattered ties succeed only 14 % of the time, and even 32 only about 70 %. Heterogeneous thresholds change the picture: if just 10 % of the people in B have a threshold of 1, the chance that 4 scattered ties succeed rises from 0.2 % to about 15 %, and with 20 % it rises to about 41 %. In other words, “complex contagion needs wide bridges” is at its strictest when thresholds are uniform; a small share of easily persuaded people lets narrow bridges work too.
Noisy thresholds: long ties strike back
Centola and Macy’s conclusion rests on deterministic thresholds: with fewer than 2 adopting contacts, a person never adopts. Real people are not so exact. In 2024 Eckles, Mossel, Rahimian and Sen showed that a small probability of adopting below the threshold is enough to reverse the conclusion: on a ring lattice, randomly rewiring ties (making them “longer”) accelerates a noisy threshold-based contagion. Their theoretical analysis uses ring lattices, and they tested the result in simulations on hundreds of real social networks; they also report that it holds when rewiring is partial but frequent, when adoption is reversible but infrequent, and in high-dimensional lattices; they concluded that those who want to speed spreading up should induce long ties rather than triad-closing ties (Eckles et al. 2024).
Calculation
A setting modelled on theirs. 400 people sit on a ring, each tied to the people 1 and 2 steps away (4 contacts). A share of the “2-step” ties is rewired to random people, becoming long ties. The threshold is 2; noise: someone with only 1 adopting contact still adopts with probability in each round. Starting from two adjacent adopters, we record the number of rounds until 90 % have adopted (median of 11 runs; “never” if it does not happen within 3,000 rounds).
# Noisy threshold contagion (after Eckles, Mossel, Rahimian & Sen 2024).
# Ring of N people; everyone is tied to the neighbours 1 step away (the
# "cycle") and 2 steps away (the "short ties"). A share r of the short ties is
# rewired to random people (long ties). Threshold 2: adopt once 2 contacts have
# adopted. Noise: someone with exactly 1 adopting contact still adopts with
# probability q in each round. Start: two adjacent adopters. We count rounds
# until 90 % have adopted (cap 3000). Parameters are illustrative.
import random
N, CAP, RUNS = 400, 3000, 11
def network(r, rng):
nb = [set() for _ in range(N)]
for i in range(N):
for d in (1, 2):
j = (i + d) % N
if d == 2 and rng.random() < r:
j = rng.randrange(N)
while j == i or j in nb[i]:
j = rng.randrange(N)
nb[i].add(j); nb[j].add(i)
return nb
def rounds_to_90(r, q, rng, theta=2):
nb = network(r, rng)
adopted = {0, 1}
for t in range(1, CAP + 1):
new = []
for i in {j for a in adopted for j in nb[a]} - adopted:
k = len(nb[i] & adopted)
if k >= theta or (k >= 1 and rng.random() < q):
new.append(i)
adopted.update(new)
if len(adopted) >= 0.9 * N:
return t
return None
def median_rounds(r, q, theta=2, seed=7):
rng = random.Random(seed)
res = sorted((rounds_to_90(r, q, rng, theta) or CAP + 1) for _ in range(RUNS))
m = res[RUNS // 2]
return "never" if m > CAP else str(m)
if __name__ == "__main__":
print(f"median rounds to 90 % adoption ({RUNS} runs, N = {N};"
f" 'never' = not within {CAP})")
print(" share of short ties rewired r: 0 0.05 0.2 1.0")
print(" simple contagion (threshold 1) " + "".join(
f"{median_rounds(r, 0, theta=1):>8s}" for r in (0, 0.05, 0.2, 1.0)))
for q in (0, 0.005, 0.02, 0.1):
print(f" threshold 2, noise q = {q:<6} " + "".join(
f"{median_rounds(r, q):>8s}" for r in (0, 0.05, 0.2, 1.0)))
# median rounds to 90 % adoption (11 runs, N = 400; 'never' = not within 3000)
# share of short ties rewired r: 0 0.05 0.2 1.0
# simple contagion (threshold 1) 90 20 9 6
# threshold 2, noise q = 0 179 never never never
# threshold 2, noise q = 0.005 178 282 327 286
# threshold 2, noise q = 0.02 175 123 101 82
# threshold 2, noise q = 0.1 163 58 34 23Without noise the result agrees with Centola and Macy: on the ring, 90 % have adopted after 179 rounds, while rewiring just 5 % of the short ties makes the spread stall at some gap and never reach 90 %. With noise the picture changes: at the ring needs 175 rounds, rewiring 20 % of the short ties needs only 101 and rewiring all of them only 82; at full rewiring needs only 23 rounds, seven times faster than the ring. But with very little noise (), rewiring slows spreading down (282–327 rounds against 178). This agrees in direction with the theory: for threshold 2, their theorem requires the noise to be large relative to (; here ) for long ties to speed the spread up, so the larger the network, the less noise is needed. This is an asymptotic order-of-magnitude condition, not a sharp cut-off: in this simulation of 400 people, already shows the advantage of long ties, while does not yet.
Neither “complex contagion needs clustering and long ties are harmful” nor “long ties speed spreading up” is therefore an absolute conclusion. Which is closer to reality depends on whether people with only one source never adopt. For truly costly and risky behaviour (joining a dangerous protest, say) that probability may indeed be close to zero; for most everyday behaviour, some chance of “giving it a try” always exists.
Evidence
Complex path length. Guilbeault and Centola pointed out that the classical shortest-path length assumes simple contagion and fails to capture the connectedness and centrality that matter for complex contagions; they derived measures of “complex path length” and “complex centrality” and tested them on data on the spread of a microfinance programme across 43 villages in India (Guilbeault and Centola 2021).
Note
“Contagion” in observational data. In observational data, friends may behave alike because they influence each other, or merely because similar people are more likely to become friends (homophily), or because they share an environment. Shalizi and Thomas showed that under general conditions homophily and contagion cannot, in principle, be distinguished from observational network data alone (Shalizi and Thomas 2011). That is why Centola’s experiment and the randomised LinkedIn experiments matter: only when network structure or ties are assigned at random can the effect of “contagion” be estimated with reasonable confidence.
Chapter summary
The threshold model shows that collective outcomes are extremely sensitive to the distribution of thresholds. Complex contagions, which need reinforcement from several sources, spread better in clustered networks, and crossing between groups needs wide bridges; an online experiment supports this, while observational data show that contact from different circles is more effective. The programs show that the placement of a bridge matters more than its size: three ties placed together are more reliable than sixteen scattered ones; but a small share of low-threshold people makes narrow bridges work as well. A 2024 theoretical result shows that as long as there is some chance of adopting below the threshold, long ties speed spreading up again. The next chapter turns from spreading to the structure of networks themselves: degree distributions, the scale-free dispute, and how networks behave under failure and attack.
References
Fan, Y. (2026). Social Network Topology, Structural Holes and Complex Contagion: From the Strength of Weak Ties and Preferential Attachment to Information Cascades, Read Beside Classical Chinese Diplomacy [社会网络拓扑、结构洞与复杂传染的数学模型] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23764990 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).