Lesson 16 — Spreading or staying — populations connected by migration

BIO 202, Spring 2026, draft v1. F_ST and migration. Drift's mirror image: migration adds variation back where drift took it away.

What you'll do

Two populations drift apart. Add migration. Watch F_ST equilibrate at 1/(1+4Nₑm). Back-calculate Nₑm from observed F_ST. Italian sparrows.

It's not that an Atlantic fish swims all the way to Syria. Instead: an Atlantic fish breeds with a fish right on the other side of the Pillars of Hercules. That heterozygote breeds with one further up the coast of Spain... Many generations later. The individual fish doesn't swim across the Mediterranean. The genes do.— 202_lec21_01

A — Two isolated populations drift apart

Start identical. Run drift. Watch F_ST climb as the two diverge.

Locked — confirm your name above to begin.

Scenario

Two populations of size Nₑ, both starting at p = 0.5. Each generation, both drift independently. Plot p₁ and p₂ over time, and F_ST = var(p)/(p̄(1−p̄)) — which grows from 0 toward 1.

p₁, p₂, and F_ST over generations

Nₑ: 100  |  gens: 500  |  final F_ST:

Prediction

  1. Q1. With Nₑ = 100, after 500 generations of complete isolation, F_ST will be:
Try at least 3 (Nₑ, gens) combos. 0/3 combos

Controls

100
500
42

R code — two pops drift

set.seed(42)N <- 100; gens <- 500p1 <- p2 <- 0.5for (g in 1:gens) { p1 <- rbinom(1,2*N,p1)/(2*N); p2 <- rbinom(1,2*N,p2)/(2*N) }pbar <- (p1+p2)/2; FST <- var(c(p1,p2))/(pbar*(1-pbar))

B — Turn migration on — F_ST equilibrates

Add a fraction m of each generation that comes from the other population. F_ST settles at 1/(1+4Nₑm).

Complete Stage A.

Scenario

Each generation, after drift, exchange fraction m of alleles between the two populations. F_ST stops growing and approaches an equilibrium. The classical island-model result: F_ST_eq ≈ 1/(1+4Nₑm).

F_ST over time, multiple m values

Nₑ: 100  |  m: 0.010  |  final F_ST:  |  predicted 1/(1+4Nₑm):

Prediction

  1. Q1. With Nₑ = 100 and m = 0.01 (so Nₑm = 1), equilibrium F_ST is approximately:
Try at least 4 m values. 0/4 m values

Controls

100
0.010
42

R code — drift + migration

set.seed(42)N <- 100; m <- 0.01; gens <- 2000p1 <- p2 <- 0.5; trajF <- numeric(gens)for (g in 1:gens) {  p1m <- (1-m)*p1 + m*p2; p2m <- (1-m)*p2 + m*p1  p1 <- rbinom(1,2*N,p1m)/(2*N); p2 <- rbinom(1,2*N,p2m)/(2*N)  pbar <- (p1+p2)/2; trajF[g] <- var(c(p1,p2))/(pbar*(1-pbar))}

C — Estimate Nₑm from observed F_ST

Invert F_ST = 1/(1+4Nₑm). Given an F_ST, you get the product Nₑm — the number of effective migrants per generation. You can't separate Nₑ from m without independent information.

Complete Stage B.

Scenario

Plot F_ST vs Nₑm on a log scale. F_ST = 0.5 corresponds to Nₑm = 0.25 (one migrant every 4 generations). F_ST = 0.05 corresponds to Nₑm ≈ 5. Even one migrant per generation tightly couples two populations.

F_ST as a function of Nₑm

observed F_ST: 0.10  |  inferred Nₑm:

Prediction

  1. Q1. If two populations have F_ST = 0.10, the inferred Nₑm is approximately:
Try at least 3 F_ST values. 0/3 F_ST values

Controls

0.100

R code — inverter

FST <- 0.10Nm <- (1/FST - 1) / 4Nm

D — Italian sparrows across the hybrid zone

Loci from data/clean/italian_sparrow_loci.csv. Compute per-locus F_ST between Spanish and house sparrow populations. Find the outliers — those resist gene flow despite hybridization.

Complete Stage C.

Scenario

Italian sparrows are a stable hybrid lineage. Across the genome, most loci show F_ST consistent with substantial gene flow. A few loci show elevated F_ST — candidates for divergence-with-gene-flow, possibly involving species-specific adaptations.

Per-locus F_ST distribution

loci:  |  median F_ST:  |  implied median Nₑm:  |  outliers (F_ST > 95th %ile):

Prediction

  1. Q1. Across loci, is the F_ST distribution between Spanish and house sparrows roughly unimodal or bimodal?
Resample at least 2 times. 0/2 resamples

Controls

42

R code — per-locus F_ST

loci <- read.csv("data/clean/italian_sparrow_loci.csv")FSTs <- apply(loci, 1, function(r) {  p1 <- r["p_spanish"]; p2 <- r["p_house"]  pbar <- (p1+p2)/2  var(c(p1,p2))/(pbar*(1-pbar))})

Round 2 — Atlantic cod across a Norwegian fjord

Spies et al. (2018) sampled Atlantic cod (Gadus morhua) along the Skagerrak coast. Two F_ST estimates from neutral markers between sampled pairs:

  • Risør outer-coast pair (open water, ~30 km apart): F_ST = 0.0002
  • Søndeled inner-fjord pair (sill-restricted basin, ~12 km apart): F_ST = 0.0045

The math is the same as Stage C's inverter. F_ST ≈ 1 / (1 + 4·Nₑm) ⇒ Nₑm ≈ (1/F_ST − 1) / 4.

Prediction

Compute Nₑm for each pair (effective migrants per generation). Order-of-magnitude is what counts.