使用 Python 加权选择的人口固定
Fixation in population with weighted choices using Python
我正在尝试进行模拟以了解人口注视的速度有多快。总体由 1(或 p)和 0(或 q)组成,而每个个体都有 2 个元素(1-1、1-0 或 0-0)。
N 是人口,由于人口中的每个成员都有 2 个元素,人口池将为 2*N(在本例中为 20)
1s的初始频率为0.1,默认情况下,q为1 - 0.1 = 0.9
所以初始种群为[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
对于下一个群体,我根据频率(p_freq 和 q_freq)随机选择(加权选择)并迭代直到群体固定为全 1 或全0秒。一旦它固定下来,我就会尝试在 p_fix 或 q_fix 列表
中记录它固定的那一代
所以我已经让它在一次模拟中工作,但我试图让它在 n=100 次模拟中工作,但我无法弄清楚如何构造它以使循环继续填充在 p_fix 和 q_fix 列表中正确
#!/usr/bin/env python2.7
import random
N= 10
n= 100
p_freq= 0.1
q_freq= 1 - p_freq
simulation= 0
p_fix= []
q_fix= []
for sim in range(n):
generation= 0
#Current population
p_alleles= int(p_freq * 2*N)*[1]
q_alleles= int(q_freq * 2*N)*[0]
population= p_alleles + q_alleles
while (sum(population) != 2*N) and (sum(population) != 0):
#Checking current population for fixation
#Next generation
next_population= []
for i in range(2*N): next_population.append(random.choice(population))
#Resetting parameters
p_freq= float(sum(next_population))/(2*N)
q_freq= 1 - p_freq
population= next_population
#Counts
generation += 1
if sum(population) == 2*N:
p_fix.append(generation)
if sum(population) == 0:
q_fix.append(generation)
simulation += 1
我打印出 p_fix 和 q_fix 时的结果:
p []
q [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
应该不是第一次模拟后所有模拟都是第0代。然而,人口固定为 q 确实是有道理的,因为 90% 的原始人口是 q(即 0)。每个人群的频率都会发生变化(这就是我重置它们的原因),这会导致固定。人口规模保持不变。
我如何才能将其设为 运行 以进行多次模拟?
您的问题是您没有在每次模拟后重置 p_freq= 0.1
和 q_freq= 1 - p_freq
。您需要在您的 for sim in range(n):
循环中重置它们(否则它们会保留上一个 sim 卡的值)。
我正在尝试进行模拟以了解人口注视的速度有多快。总体由 1(或 p)和 0(或 q)组成,而每个个体都有 2 个元素(1-1、1-0 或 0-0)。
N 是人口,由于人口中的每个成员都有 2 个元素,人口池将为 2*N(在本例中为 20)
1s的初始频率为0.1,默认情况下,q为1 - 0.1 = 0.9
所以初始种群为[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
对于下一个群体,我根据频率(p_freq 和 q_freq)随机选择(加权选择)并迭代直到群体固定为全 1 或全0秒。一旦它固定下来,我就会尝试在 p_fix 或 q_fix 列表
中记录它固定的那一代所以我已经让它在一次模拟中工作,但我试图让它在 n=100 次模拟中工作,但我无法弄清楚如何构造它以使循环继续填充在 p_fix 和 q_fix 列表中正确
#!/usr/bin/env python2.7
import random
N= 10
n= 100
p_freq= 0.1
q_freq= 1 - p_freq
simulation= 0
p_fix= []
q_fix= []
for sim in range(n):
generation= 0
#Current population
p_alleles= int(p_freq * 2*N)*[1]
q_alleles= int(q_freq * 2*N)*[0]
population= p_alleles + q_alleles
while (sum(population) != 2*N) and (sum(population) != 0):
#Checking current population for fixation
#Next generation
next_population= []
for i in range(2*N): next_population.append(random.choice(population))
#Resetting parameters
p_freq= float(sum(next_population))/(2*N)
q_freq= 1 - p_freq
population= next_population
#Counts
generation += 1
if sum(population) == 2*N:
p_fix.append(generation)
if sum(population) == 0:
q_fix.append(generation)
simulation += 1
我打印出 p_fix 和 q_fix 时的结果:
p []
q [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
应该不是第一次模拟后所有模拟都是第0代。然而,人口固定为 q 确实是有道理的,因为 90% 的原始人口是 q(即 0)。每个人群的频率都会发生变化(这就是我重置它们的原因),这会导致固定。人口规模保持不变。
我如何才能将其设为 运行 以进行多次模拟?
您的问题是您没有在每次模拟后重置 p_freq= 0.1
和 q_freq= 1 - p_freq
。您需要在您的 for sim in range(n):
循环中重置它们(否则它们会保留上一个 sim 卡的值)。