2015-01-14 7 views
0

모집단 고정 방법을 시뮬레이션하기 위해 노력하고 있습니다. 모집단은 1s (또는 p)와 0s (또는 q)로 구성되며 각 개체에는 2 개의 요소 (1-1, 1-0 또는 0-0)가 있습니다.파이썬을 사용하여 가중치 적용 선택에 따른 인구 고정

N은 모집단 및 인구의 각 부재는 2 개 요소를 갖고 있기 때문에, 인구 풀은 2 * N은

가 1의

초기 주파수가 0.1 디폴트로 (여기서는 20) q는 1 것 - 0.1 = 0.9

초기 인구는 [1, 1, 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 목록에 고정되는 세대를 기록하려고합니다.

그래서 한 가지 시뮬레이션을 위해이 작업을 수행했지만이 작업을 위해 노력하고 있습니다.

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] 
: N = 100 시뮬레이션과 나는 p_fix을 채우기 위해 계속하는 루프를 얻기 위해 그것을 구조와 내가 p_fix 및 q_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 

내 결과를 나열하는 방법을 알아낼 질수

첫 번째 이후 모든 시뮬레이션에 대해 0 번째 세대가 아닙니다. 시뮬레이션. 그러나 원래 인구의 90 %가 q (즉, 0)이기 때문에 인구가 q로 고정되어 있다는 것이 합리적입니다. 주파수는 각 모집단마다 바뀌므로 (왜 내가 다시 설정했는지) 고정이 필요합니다. 인구의 크기는 동일하게 유지됩니다.

여러 시뮬레이션을 수행하려면 어떻게해야합니까?

답변

1

각 시뮬레이션 후에 p_freq= 0.1q_freq= 1 - p_freq을 재설정하지 않는 것이 문제입니다. for sim in range(n): 루프에서 다시 설정해야합니다 (그렇지 않으면 마지막 sim에서 값을 유지합니다).

+0

감사합니다. @gerrat! –