F-statistics
Drift builds differences between populations, migration removes them, and F_ST settles at a value set by Nm.
Read first: Genetic drift, Island-island migration
Three fixation indices
The F-Statistics module starts 20 populations at the same allele frequency, p₀ = 0.5, each with N = 50 diploids (100 gene copies). Every generation each population drifts by binomial sampling, and then each population is replaced by a fraction m from the average of all 20. Three numbers summarise the result, all built from heterozygosity H.
H_I is the observed heterozygosity inside populations. H_S is the heterozygosity expected from each population allele frequency, averaged over populations. H_T is the heterozygosity expected from the pooled frequency. Then F_IS = (H_S − H_I) / H_S measures non-random mating inside a population, F_ST = (H_T − H_S) / H_T measures differences between populations, and F_IT = (H_T − H_I) / H_T measures both together.
The three are linked by (1 − F_IT) = (1 − F_IS)(1 − F_ST). In the module the inbreeding coefficient f only scales H_I, so F_IS = f in every generation and f does not change the drift. F_ST is the one that gene flow acts on.
The module has two panels. The left panel draws the allele frequency of up to 8 of the populations. The right panel draws the three F values against generation. At the start all populations are identical, so every F is 0. Differences appear only as drift scatters the populations, which is why the F_ST line rises from the left edge of the right panel.
Drift alone builds F_ST
Inbreeding adds F_IS
Exercise
Check the identity
Open the module and set Pops 20, Ne 50, p0 0.5, Gen 100, m 0 and f 0.2. Run, then hover the right-hand panel at generation 100 and read the three F values.
What to expect. F_IS reads 0.2000 and F_ST is some value near 0.6. Multiply (1 − F_IS) by (1 − F_ST) and subtract from 1. The result equals the F_IT value. Step 3 of the walkthrough shows this with a fixed seed.
Open the walkthrough step →Migration sets a balance
Drift alone pushes F_ST toward 1, because each population eventually fixes one allele. Migration pulls the populations back toward their common mean. The two forces balance at F_ST ≈ 1 / (1 + 4Nm), where Nm is the number of migrants per generation. The answer depends on the product Nm and not on m alone.
With N = 50 and m = 0.01, Nm = 0.5 and F_ST ≈ 1 / (1 + 2) = 0.333. With m = 0.1, Nm = 5 and F_ST ≈ 1 / 21 = 0.048. The module measures F_ST after migration, which shrinks the spread among populations by about (1 − m)². At m = 0.1 that factor is 0.81, so the module should read 0.048 × 0.81 = 0.039. The mean over 200 seeded runs is 0.040.
Raising N to 500 at m = 0.01 gives Nm = 5 again. The mean F_ST is 0.045, close to the same 0.048 even though the migration rate is ten times lower. One migrant per generation, Nm = 1, gives F_ST ≈ 1 / 5 = 0.2.
Half a migrant per generation
Exercise
Change Nm two ways
Run Pops 20, Ne 50, m 0.1, f 0 and Gen 300. Then set Ne 500 and m 0.01 and run again. Repeat each run a few times.
What to expect. Both settings have Nm = 5, so F_ST stays small, about 0.04 in both, and the lines on the left panel stay bunched. At Nm = 0.5 (Ne 50, m 0.01) F_ST settles near 0.32. Step 5 of the walkthrough compares them.
Summary
- F_IS = (H_S − H_I) / H_S, F_ST = (H_T − H_S) / H_T and F_IT = (H_T − H_I) / H_T, with (1 − F_IT) = (1 − F_IS)(1 − F_ST).
- Drift alone drives F_ST up as 1 − (1 − 1/2N)^t: 0.634 after 100 generations at N = 50.
- The inbreeding coefficient f sets F_IS and leaves F_ST unchanged: f = 0.2 gives F_IS = 0.200 and F_IT = 0.701.
- Migration and drift balance at F_ST ≈ 1 / (1 + 4Nm): 0.333 at Nm = 0.5 and 0.048 at Nm = 5.
- Nm is what matters, so N = 500 with m = 0.01 gives about the same F_ST (0.045) as N = 50 with m = 0.1 (0.040).