BIO 202, Spring 2026, draft v1. F_ST and migration. Drift's mirror image: migration adds variation back where drift took it away.
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.
Start identical. Run drift. Watch F_ST climb as the two diverge.
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.
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))
Add a fraction m of each generation that comes from the other population. F_ST settles at 1/(1+4Nₑm).
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).
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))}
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.
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.
FST <- 0.10Nm <- (1/FST - 1) / 4Nm
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.
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.
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))})
Spies et al. (2018) sampled Atlantic cod (Gadus morhua) along the Skagerrak coast. Two F_ST estimates from neutral markers between sampled pairs:
The math is the same as Stage C's inverter. F_ST ≈ 1 / (1 + 4·Nₑm) ⇒ Nₑm ≈ (1/F_ST − 1) / 4.
Compute Nₑm for each pair (effective migrants per generation). Order-of-magnitude is what counts.