Генетический дрейф
Урок о том, как в небольших популяциях частоты аллелей меняются просто по воле случая — без всякого отбора.
Генетический дрейф — случайное изменение частот аллелей от поколения к поколению из-за того, что в потомство попадает лишь случайная выборка гамет.
Почему частоты «гуляют»
Закон Харди-Вайнберга предполагал бесконечную популяцию. Но если особей мало, то аллели потомства — это случайная выборка из родительских. По чистой случайности доля аллеля может вырасти или упасть, и со временем аллель может полностью закрепиться (частота 1) или исчезнуть (частота 0). Чем меньше популяция, тем сильнее дрейф.
Симуляция (модель Райта-Фишера)
Промоделируем популяцию из $N$ особей ($2N$ аллелей). Каждое поколение — это $2N$ случайных «вытягиваний» аллеля с текущей частотой $p$. Посмотрим, как меняется частота за 50 поколений в маленькой популяции.
import random
random.seed(7)
def drift(N, p0, gens):
p = p0
for _ in range(gens):
k = sum(1 for _ in range(2 * N) if random.random() < p)
p = k / (2 * N)
return p
for run in range(5):
final = drift(N=10, p0=0.5, gens=50)
print("Запуск", run + 1, "-> итоговая частота A:", round(final, 2))Вывод:
Запуск 1 -> итоговая частота A: 1.0 Запуск 2 -> итоговая частота A: 0.0 Запуск 3 -> итоговая частота A: 0.0 Запуск 4 -> итоговая частота A: 0.0 Запуск 5 -> итоговая частота A: 1.0
Начав с 0.5, аллель в каждом запуске пришёл либо к 1 (закрепился), либо к 0 (исчез) — это и есть дрейф.
Вероятность закрепления
Замечательный факт: при чистом дрейфе вероятность, что аллель в итоге закрепится, равна его начальной частоте $p_0$. Проверим на множестве запусков.
import random
random.seed(7)
def drift(N, p0, gens):
p = p0
for _ in range(gens):
k = sum(1 for _ in range(2 * N) if random.random() < p)
p = k / (2 * N)
return p
fixed = 0
runs = 2000
for _ in range(runs):
if drift(N=10, p0=0.5, gens=50) == 1.0:
fixed += 1
print("Доля запусков с закреплением:", round(fixed / runs, 3))
print("Теория (равна p0):", 0.5)Вывод:
Доля запусков с закреплением: 0.448 Теория (равна p0): 0.5
Около половины запусков закрепили аллель — близко к теоретической $p_0 = 0.5$ (полному совпадению мешает конечное число поколений, при котором часть запусков ещё не зафиксирована).
Как работает под капотом
Дрейф — это та же ошибка выборки, что и в опросах: по маленькой выборке частота отклоняется от истинной. Здесь «выборка» — гаметы, попавшие в следующее поколение. Сила дрейфа обратно пропорциональна размеру популяции $N$: в больших популяциях он почти незаметен, в маленьких правит бал. Поэтому он особенно важен для редких и вымирающих видов и при «эффекте основателя», когда новую популяцию заводит горстка особей.
Частые ошибки
- Считают дрейф разновидностью отбора. Дрейф случаен и не зависит от полезности аллеля.
- Думают, что дрейф силён в больших популяциях. Наоборот — он силён в малых.
- Ждут, что частота всегда вернётся к исходной. Дрейф необратимо ведёт к фиксации или потере.
Итог
- Дрейф — случайное изменение частот из-за конечности популяции.
- Он ведёт к закреплению или исчезновению аллеля; вероятность закрепления равна начальной частоте.
- Сила дрейфа тем больше, чем меньше популяция.
- Дрейф не зависит от полезности аллеля — это чистый случай.