Coalescent의 정방향 대응
M29에서 시간 역방향으로 계보를 추적하는 coalescent를 배웠습니다. 그 이론이 딛고 서 있는 정방향 확률 모델이 Wright-Fisher 모델입니다. 1930년대에 Sewall Wright와 Ronald Fisher가 각각 정립했습니다.
Wright-Fisher는 집단 유전학의 알파이자 오메가입니다. 집단 크기 N의 이상 집단에서 세대 간 대립유전자 빈도가 어떻게 변하는가를 이산 확률 과정으로 표현합니다. Kimura의 중성 이론, coalescent, 심지어 최신 pangenome 분석까지 모두 이 모델에서 파생됩니다.
이 편은 Micro Tier 30편의 마지막 편이자, Phase A 완결의 왕관입니다.
모델 정의
집단 크기 N, 두 대립유전자 A와 a. 시각 t에서 A의 빈도 p_t.
Wright-Fisher 정의: 다음 세대(t+1)의 각 개체는 이전 세대(t)에서 랜덤하게, 독립적으로, 복원 추출로 부모를 뽑는다. 각 자식이 A를 가질 확률은 p_t.
즉 다음 세대의 A 개체 수 X는 이항 분포에서 뽑힙니다. X ~ Binomial(N, p_t). 새 빈도는 p 다음 = X 나누기 N.
이 이산 확률 과정이 모델의 전부입니다. 놀랍도록 단순한 정의에서 풍부한 결과들이 파생됩니다.
유전자 부동 (Genetic Drift)
Wright-Fisher의 결정적 예측은 선택압이 없어도 대립유전자 빈도가 흔들린다는 것입니다. 이항 분포에서 오는 무작위 표본 오차. 이걸 유전자 부동(genetic drift) 이라고 부릅니다.
세대별 빈도 변화의 분산은 p_t 곱하기 (1 빼기 p_t) 나누기 N입니다.
집단이 작을수록 부동이 크고, 빈도가 극값(0 또는 1)에 가까울수록 부동이 작습니다. 그리고 결국 대립유전자는 고정(fixation, 빈도 1) 되거나 소실(loss, 빈도 0) 됩니다. 이 두 상태는 흡수 상태 — 한 번 도달하면 벗어날 수 없음.
고정 확률과 시간
초기 빈도 p_0에서 대립유전자가 결국 고정될 확률은 p_0 그 자체입니다.
놀랍도록 단순한 결과. 초기 빈도가 곧 고정 확률. 새 돌연변이는 한 세대에 개체 하나만 가지므로 초기 빈도 = 1 나누기 2N, 따라서 새 중성 돌연변이의 고정 확률 = 1 나누기 2N.
고정까지의 평균 시간(고정된 경우만)은 대략 4N 세대 스케일입니다. p_0가 작으면 이 시간이 매우 길어집니다. 한 개체에서 시작한 새 돌연변이는 고정까지 평균 4N 세대. 인간(N 대략 10,000)이면 4만 세대 즉 100만 년 정도.
Kimura의 중성 진화 이론
Motoo Kimura(Nature 1968)의 중성 진화 이론이 이 모델의 결과를 진화 이론 전체에 확장했습니다. 요지.
대부분의 분자 수준 변이는 자연 선택이 아닌 중성 부동으로 고정된다.
이 명제가 발표됐을 때 격렬한 논쟁을 일으켰습니다. Darwinian 자연 선택이 진화의 유일한 엔진이라는 정통설과 정면 충돌. 지금은 Kimura의 관점이 분자 진화의 baseline으로 인정됩니다.
중성 이론의 정량적 예측: 한 site의 세대당 치환률은 세대당 돌연변이율 mu와 같습니다. 자세히 보면 (2N 곱 mu) 곱 (1 나누기 2N) = mu. 집단 크기 N이 사라지고 오직 mu만 남습니다. 관측된 종간 분자 진화 속도가 이 예측과 일치하는 것이 중성 이론의 강력한 증거였습니다.
R로 시뮬레이션 (20줄)
wright_fisher <- function(N, p0, generations, seed = NULL) {
if (!is.null(seed)) set.seed(seed)
p <- numeric(generations + 1)
p[1] <- p0
for (t in 2:(generations + 1)) {
X <- rbinom(1, N, p[t-1])
p[t] <- X / N
if (p[t] == 0 || p[t] == 1) {
p[t:(generations+1)] <- p[t]
break
}
}
return(p)
}
set.seed(42)
N <- 100
p0 <- 0.5
n_traj <- 20
trajectories <- replicate(n_traj, wright_fisher(N, p0, 500))
matplot(0:500, trajectories, type = 'l', lty = 1,
xlab = "Generation", ylab = "Allele frequency",
main = paste0("Wright-Fisher, N=", N, ", p0=", p0))
abline(h = c(0, 1), lty = 2, col = "gray")플롯을 그리면 20개 궤적이 서로 다르게 흔들리다가 대부분 0 또는 1에 안착합니다. 선택압 없이도 다양성이 사라진다 — 이게 유전자 부동의 시각적 실증입니다.
파이썬 시뮬레이션과 통계 검증
import random
def wright_fisher(N, p0, generations, seed=None): if seed is not None: random.seed(seed) p = [p0] for _ in range(generations): X = sum(1 for _ in range(N) if random.random() < p[-1]) pt = X / N p.append(pt) if pt == 0 or pt == 1: p.extend([pt] * (generations - len(p) + 1)) break return p
N = 100p0 = 0.3n_sims = 10000fixed = 0for i in range(n_sims): p = wright_fisher(N, p0, 500, seed=i) if p[-1] == 1: fixed += 1
empirical = fixed / n_simsprint("empirical fixation:", empirical)print("theoretical (p0):", p0)시뮬레이션 10,000회로 경험적 고정 확률을 뽑으면 p_0 = 0.3에 매우 가까운 값이 나옵니다. 이론과 시뮬레이션의 일치가 통계적으로 검증됩니다.
확장 — 선택, 이주, 돌연변이
Wright-Fisher 기본형에는 세 가지 추가 힘을 얹을 수 있습니다.
자연 선택 (Selection): 각 대립유전자에 적합도 w_A, w_a. 다음 세대 A 빈도의 기대값은 p_t 곱하기 w_A 나누기 (p_t 곱하기 w_A 더하기 (1 빼기 p_t) 곱하기 w_a) 로 조정되고, 이 값이 이항 분포의 p 파라미터로 사용됩니다.
이주 (Migration): 매 세대 다른 집단에서 유입되는 대립유전자 비율 m. 새 빈도는 (1 빼기 m) 곱 p_t 더하기 m 곱 p_source.
돌연변이 (Mutation): 세대당 A에서 a로 돌연변이율 mu. 새 빈도는 (1 빼기 mu) 곱 p_t 더하기 nu 곱 (1 빼기 p_t).
이 세 힘과 부동이 균형하는 지점이 mutation-drift 균형, selection-drift 균형 등의 정상 분포. 인구 유전학 대부분이 이런 균형 상태의 분석입니다.
Wright-Fisher의 한계
- 세대 겹침 없음 가정 (실제 인구는 겹침이 큼)
- 랜덤 교배 가정 (실제 인구는 지리와 계층 구조가 큼)
- 성비 균등 가정
- 이산 세대 가정 (연속 세대 모델은 Moran model)
이 한계에도 불구하고 Wright-Fisher가 살아남은 이유는 coalescent와의 대칭성입니다. Wright-Fisher 정방향과 coalescent 역방향이 통계적으로 동등하다는 사실이 오늘 집단 유전학 이론의 등뼈입니다.
Moran Model — 연속 세대 대안
Wright-Fisher가 이산 세대라면 Moran model은 연속 세대. 매 시각 한 개체가 죽고 한 개체가 랜덤 부모의 자식으로 태어남. 수학적으로 더 다루기 쉬운 특성이 있어 이론 연구에 자주 쓰입니다. 실전 시뮬레이션은 Wright-Fisher가 표준.
SLiM — Wright-Fisher 시뮬레이션의 실전 도구
SLiM(Bioinformatics 2019)은 복잡한 Wright-Fisher 시뮬레이션의 표준 도구. Selection, migration, 인구 구조, chromosome recombination 모두 지원. Eidos 언어로 스크립트 작성.
// SLiM 예제: 병목 이후 확장과 자연 선택
initialize() {
initializeMutationRate(1e-7);
initializeMutationType("m1", 0.5, "f", 0.0);
initializeMutationType("m2", 0.5, "f", 0.05);
initializeGenomicElementType("g1", c(m1, m2), c(0.95, 0.05));
initializeGenomicElement(g1, 0, 999999);
initializeRecombinationRate(1e-8);
}
1 { sim.addSubpop("p1", 10000); }
1000 { p1.setSubpopulationSize(1000); }
2000 { p1.setSubpopulationSize(10000); }
3000 late() { sim.outputFull(); }이런 스크립트를 몇 시간 굴리면 Wright-Fisher 예측 하에서 특정 시나리오의 유전 다양성 패턴을 관측할 수 있습니다.
CS 매핑 — 마르코프 체인의 정수
Wright-Fisher는 상태공간 (0 나누기 N)부터 (N 나누기 N)까지의 마르코프 체인입니다. 다음 상태가 오직 현재 상태에만 의존.
- 전이 행렬: (N 더하기 1) 곱 (N 더하기 1). 각 원소는 이항 분포 확률
- absorbing states: 상태 0 (loss)과 N (fixation)
- stationary distribution: 흡수 시나리오라 정상 분포는 없음, 대신 흡수 확률과 시간이 정의됨
M18의 HMM도 마르코프 체인. 차이는 은닉 상태 대 관측 상태. 마르코프 체인 하나가 여러 옷을 갈아입습니다. 시퀀스 모델(HMM), 인구 유전학(Wright-Fisher), 강화학습(MDP), 페이지 랭크. 몸에 익히면 새 도메인의 마르코프 프로세스도 즉시 해체됩니다.
Rosalind에서 채점받기
Rosalind WFMD 문제. Wright-Fisher 세대별 확률 계산. 위 파이썬 함수의 이론 확률판을 그대로 구현.
Phase A 완결과 다음 편 이후 안내
M30이 Micro Tier(M01부터 M30) 30편의 마지막입니다. Phase A(코어 알고리즘 수학) 완결. 지금까지 배운 것을 감사해봅시다.
- 서열과 정렬 알고리즘 (Needleman-Wunsch, Smith-Waterman, BLAST)
- 문자열 인덱스 (접미사 트리, BWT, FM-index, minimap2, Diamond)
- HMM (Viterbi, Forward-Backward, Baum-Welch, Profile HMM)
- 어셈블리 (OLC, De Bruijn, hifiasm)
- MSA와 계통수와 집단 유전학 (MAFFT, NJ, Fitch, IQ-TREE, coalescent, Wright-Fisher)
30편이 각각 8부터 14KB의 자체 저작 KO. 지금부터는 Phase B — System S1 Tier(NGS 파이프라인 25편) 로 진입 준비입니다. Micro의 이론이 이제 FASTQ부터 시작하는 실무 파이프라인에 결실을 봅니다.
더 깊게 파고 싶다면
- Kimura (1968), Evolutionary rate at the molecular level, Nature — 중성 진화 이론 원 논문.
- Ewens (2004), Mathematical Population Genetics — 표준 교재. Wright-Fisher, coalescent, selection 전 영역.
- Haller와 Messer (2019), SLiM 3: forward genetic simulations beyond the Wright-Fisher model, MBE — SLiM 원 논문.
- Harvard HST.508 — Wright-Fisher 강의 (자막 완비). Jonathan Pritchard의 판서.
- Stanford BIOMEDIN 214 — 인구 유전학 강의. 실전 데이터 분석.
R로 위 시뮬레이션 코드를 실행하고, 집단 크기 N을 10, 100, 1000, 10000으로 바꿔가면서 부동 궤적을 관찰해봅시다. 집단이 클수록 부동이 느려진다는 예측을 눈으로 확인하는 것이, 이 편의 마지막 실습입니다.