#!/usr/bin/env python # coding: utf-8 # In[1]: from collections import OrderedDict from copy import deepcopy import numpy as np import seaborn as sns import matplotlib.pyplot as plt import simuPOP as sp get_ipython().run_line_magic('matplotlib', 'inline') # In[2]: num_loci = 10 pop_size = 100 num_gens = 10 # In[3]: init_ops = OrderedDict() pre_ops = OrderedDict() post_ops = OrderedDict() # In[4]: pops = sp.Population(pop_size, loci=[1] * num_loci) # In[5]: init_ops['Sex'] = sp.InitSex() init_ops['Freq'] = sp.InitGenotype(freq=[0.5, 0.5]) post_ops['Stat-freq'] = sp.Stat(alleleFreq=sp.ALL_AVAIL) post_ops['Stat-freq-eval'] = sp.PyEval(r"'%d %.2f\n' % (gen, alleleFreq[0][0])") # In[6]: mating_scheme = sp.RandomMating() # In[7]: sim = sp.Simulator(pops, rep=1) sim.evolve(initOps=init_ops.values(), preOps=pre_ops.values(), postOps=post_ops.values(), matingScheme=mating_scheme, gen=num_gens) # In[8]: def init_accumulators(pop, param): accumulators = param for accumulator in accumulators: pop.vars()[accumulator] = [] return True def update_accumulator(pop, param): accumulator, var = param pop.vars()[accumulator].append(deepcopy(pop.vars()[var])) return True # In[9]: def calc_exp_he(pop): #assuming bi-allelic markers coded as 0 and 1 #sample size not corrected - OK pop.dvars().expHe = {} for locus, freqs in pop.dvars().alleleFreq.items(): f0 = freqs[0] pop.dvars().expHe[locus] = 1 - f0**2 - (1 - f0)**2 return True # In[10]: init_ops['accumulators'] = sp.PyOperator(init_accumulators, param=['num_males', 'exp_he']) post_ops['Stat-males'] = sp.Stat(numOfMales=True) post_ops['ExpHe'] = sp.PyOperator(calc_exp_he) post_ops['male_accumulation'] = sp.PyOperator(update_accumulator, param=('num_males', 'numOfMales')) post_ops['expHe_accumulation'] = sp.PyOperator(update_accumulator, param=('exp_he', 'expHe')) #remember ordering #generation step # In[11]: del post_ops['Stat-freq-eval'] # In[12]: num_gens = 100 pops_500 = sp.Population(500, loci=[1] * num_loci) sim = sp.Simulator(pops_500, rep=1) sim.evolve(initOps=init_ops.values(), preOps=pre_ops.values(), postOps=post_ops.values(), matingScheme=mating_scheme, gen=num_gens) # In[13]: pop_500_after = deepcopy(sim.population(0)) # In[14]: pops_40 = sp.Population(40, loci=[1] * num_loci) sim = sp.Simulator(pops_40, rep=1) sim.evolve(initOps=init_ops.values(), preOps=pre_ops.values(), postOps=post_ops.values(), matingScheme=mating_scheme, gen=num_gens) # In[15]: pop_40_after = deepcopy(sim.population(0)) # In[16]: def calc_loci_stat(var, fun): stat = [] for gen_data in var: stat.append(fun(gen_data.values())) return stat # In[17]: sns.set_style('white') fig, axs = plt.subplots(1, 2, figsize=(16, 9), sharey=True, squeeze=False) def plot_pop(ax1, pop): for locus in range(num_loci): ax1.plot([x[locus] for x in pop.dvars().exp_he], color=(0.75, 0.75, 0.75)) mean_exp_he = calc_loci_stat(pop.dvars().exp_he, np.mean) ax1.plot(mean_exp_he, color='r') axs[0, 0].set_title('PopSize: 40') axs[0, 1].set_title('PopSize: 500') axs[0, 0].set_ylabel('Expected heterozygosity') plot_pop(axs[0, 0], pop_40_after) plot_pop(axs[0, 1], pop_500_after) ax = fig.add_subplot(4, 4, 6) ax.set_title('Distribution of number of males') ax.boxplot(pop_40_after.dvars().num_males) ax = fig.add_subplot(4, 4, 16) ax.set_title('Distribution of number of males') ax.boxplot(pop_500_after.dvars().num_males) fig.tight_layout() # In[ ]: