読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

(43) 遺伝子ドリフト

ある遺伝子座に2種類の遺伝子A, aがある場合を考えます。この形質Aaの表現型はAA, Aa, aaになります。
個体数nの中の遺伝子Aの頻度をfA, 遺伝子aの頻度をfa(=1-fA)とし、この集団からランダムに配偶子を選んで次世代が個体数n生まれるとします。

遺伝子Aの頻度の世代経緯をシミュレーションしてみましょう。

/* 7.3.10m */
n : 30$
fA : 0.5$
freqList : []$
while fA > 0 and fA < 1 do (
  freqList : endcons(fA, freqList),
  numA : 0,
  for j : 1 thru n do (
    if random(1.0) < fA then numA : numA + 1,
    if random(1.0) < fA then numA : numA + 1
    ),
  fA : numA / (2*n)
)$
plot2d([discrete, makelist(i, i, 1, length(freqList)), freqList], [y, 0, 1])$

(1例)

横軸が世代、縦軸が頻度です。選択がランダムな場合、遺伝子ドリフトが起こり、一方の遺伝子が「絶滅」することがわかります。


では、初期頻度に対して、形質が単一になるまでの平均世代数はいくらか調べましょう。

/* 7.3.11m */
n : 30$
trials : 20$
extinctionList : []$
for fAinit : 1/n step 1/n thru 1 do (
  genAverage : 0,
  for k : 1 thru trials do (
    fA : fAinit,
    generation : 0,
    while fA > 0 and fA < 1 do (
      numA : 0,
      for j : 1 thru n do (
        if random(1.0) < fA then numA : numA + 1,
        if random(1.0) < fA then numA : numA + 1
        ),
      fA : numA / (2*n),
      generation : generation + 1
      ),
    genAverage : genAverage + generation
    ),
  genAverage : genAverage/trials,
  extinctionList : endcons([fAinit, genAverage], extinctionList)
  )$
plot2d([discrete, extinctionList])$