def sc3ei(params , ns): # p_misid: proportion of misidentified ancestral states # P: proportion of sites with lower migration # Fi: factor of migration reduction (1e-5 - 0.999) # migration is asymmetric, scales with pop size nu1_1,nu2_1,nu1_2,nu2_2,T1,T2,m12,m21,Fs,P,p_misid = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) fs.integrate([nu1_1, nu2_1], T1, m = np.array([[0, m12], [m21, 0]])) fs.integrate([nu1_2, nu2_2], T2, m = np.array([[0, 0], [0, 0]])) stsi = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsi = moments.Spectrum(stsi) fsi = moments.Manips.split_1D_to_2D(fsi, ns[0], ns[1]) fsi.integrate([nu1_1, nu2_1*Fs], T1, m = np.array([[0, m12*Fs], [m21*Fs, 0]])) fsi.integrate([nu1_2, nu2_2*Fs], T2, m = np.array([[0, 0], [0, 0]])) fs2=P*fsi+(1-P)*fs return (1-p_misid)*fs2 + p_misid*moments.Numerics.reverse_array(fs2)
def SC(params, ns): s, nToro, nMega, t1, t2, m12, m21 = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) nu1_func = lambda t: s * (nToro / s)**(t / t2) nu2_func = lambda t: (1 - s) * (nMega / (1 - s))**(t / t2) nu_func = lambda t: [nu1_func(t), nu2_func(t)] fs.integrate([nToro, nMega], t1, dt_fac=0.01, m=np.array([[0, 0], [0, 0]])) fs.integrate(nu_func, t2, dt_fac=0.01, m=np.array([[0, m12], [m21, 0]])) return fs
def sc11(params, ns): # p_misid: proportion of misidentified ancestral states nu0, nu1_2, nu2_2, T0, T, m = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs.integrate([nu0], T0) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) fs.integrate([nu1_2, nu2_2], T, m=np.array([[0, m], [m, 0]])) return fs
def model_func(params, ns): t1, nu11, t2, nu21, s1, t3, nu31, nu32, m3_12, m3_21 = params sts = moments.LinearSystem_1D.steady_state_1D(np.sum(ns)) fs = moments.Spectrum(sts) fs.integrate(tf=t1, Npop=[nu11], dt_fac=0.01) fs.integrate(tf=t2, Npop=[nu21], dt_fac=0.01) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) nu1_func = lambda t: (s1 * nu21) * (nu31 / (s1 * nu21)) ** (t / t3) migs = np.array([[0, m3_12], [m3_21, 0]]) fs.integrate(tf=t3, Npop=lambda t: [nu1_func(t), nu32], m=migs, dt_fac=0.01) return fs
def sc3ei(params, ns): # p_misid: proportion of misidentified ancestral states nu1_1, nu2_1, nu1_2, nu2_2, nu1_3, nu2_3, T1, T2, T3, m12_3, m21_3 = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) fs.integrate([nu1_1, nu2_1], T1, m=np.array([[0, m12_3], [m21_3, 0]])) fs.integrate([nu1_2, nu2_2], T2, m=np.array([[0, 0], [0, 0]])) fs.integrate([nu1_3, nu2_3], T3, m=np.array([[0, 0], [0, 0]])) return fs
def sc12nm(params, ns): # p_misid: proportion of misidentified ancestral states nu0, nu1, T1, T2 = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs.integrate([nu0], T1) fs.integrate([nu1], T2) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) return fs
def test_expected_sfs(self): pop_id = 'root' ns0 = 20 nu = 1. theta = 1.0 fs_moments = moments.Spectrum( moments.LinearSystem_1D.steady_state_1D(ns0, gamma=0, h=0.5), pop_ids=[pop_id]) fs = demography.integration.moments_fs_root_equilibrium(ns0, nu, theta, pop_id) self.assertTrue(np.allclose(fs_moments, fs)) self.assertTrue(fs.pop_ids == [pop_id])
def sc11(params, ns): # p_misid: proportion of misidentified ancestral states nu0, nu1_2, nu2_2, T0, T, m12_2, m21_2, p_misid = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs.integrate([nu0], T0) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) fs.integrate([nu1_2, nu2_2], T, m=np.array([[0, m12_2], [m21_2, 0]])) return (1 - p_misid) * fs + p_misid * moments.Numerics.reverse_array(fs)
def test_marginalize(self): ns = (7, 8, 6) fs = moments.Spectrum(numpy.random.uniform(size=ns)) folded = fs.fold() marg1 = fs.marginalize([1]) # Do manual marginalization. manual = moments.Spectrum(fs.data.sum(axis=1)) # Check that these are equal in the unmasked entries. self.assert_( numpy.allclose(numpy.where(marg1.mask, 0, marg1.data), numpy.where(manual.mask, 0, manual.data))) # Check folded Spectrum objects. I should get the same result if I # marginalize then fold, as if I fold then marginalize. mf1 = marg1.fold() mf2 = folded.marginalize([1]) self.assert_(numpy.allclose(mf1, mf2))
def sc12iml(params, ns): # p_misid: proportion of misidentified ancestral states nu0, nu1_2, nu2_2, nu1_3, nu2_3, T1, T2, T3, m, mi, m12_3, m21_3, m12_3i, m21_3i, P = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs.integrate([nu0], T1) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) fs.integrate([nu1_2, nu2_2], T2, m=np.array([[0, m], [m, 0]])) fs.integrate([nu1_3, nu2_3], T3, m=np.array([[0, m12_3], [m21_3, 0]])) stsi = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsi = moments.Spectrum(stsi) fsi.integrate([nu0], T1) fsi = moments.Manips.split_1D_to_2D(fsi, ns[0], ns[1]) fsi.integrate([nu1_2, nu2_2], T2, m=np.array([[0, mi], [mi, 0]])) fsi.integrate([nu1_3, nu2_3], T3, m=np.array([[0, m12_3i], [m21_3i, 0]])) fs2 = P * fsi + (1 - P) * fs return fs2
def sc12nm(params , ns): # p_misid: proportion of misidentified ancestral states # P: proportion of sites with lower Ne # Fs: factor of Ne reduction (1e-5 - 0.999) nu0,nu1,T1,T2,Fs,P = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs.integrate([nu0], T1) fs.integrate([nu1], T2) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) stsi = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsi = moments.Spectrum(sts) fsi.integrate([nu0*Fs], T1) fsi.integrate([nu1*Fs], T2) fsi = moments.Manips.split_1D_to_2D(fsi, ns[0], ns[1]) fs2=P*fsi+(1-P)*fs return fs2
def sc3ei(params, ns): # p_misid: proportion of misidentified ancestral states # Pi: proportion of sites with lower migration # Fi: factor of migration reduction (1e-5 - 0.999) # Ps: proportion of sites with lower Ne # Fs: factor of Ne reduction (0.1 - 0.999) # migration is asymmetric, scales with pop size nu1_1, nu2_1, nu1_2, nu2_2, T1, T2, m12, m21, Fi, Pi, Fs, Ps = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) fs.integrate([nu1_1, nu2_1], T1, m=np.array([[0, m12], [m21, 0]])) fs.integrate([nu1_2, nu2_2], T2, m=np.array([[0, 0], [0, 0]])) stsi = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsi = moments.Spectrum(stsi) fsi = moments.Manips.split_1D_to_2D(fsi, ns[0], ns[1]) fsi.integrate([nu1_1, nu2_1], T1, m=np.array([[0, m12 * Fi], [m21 * Fi, 0]])) fsi.integrate([nu1_2, nu2_2], T2, m=np.array([[0, 0], [0, 0]])) stsis = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsis = moments.Spectrum(stsis) fsis = moments.Manips.split_1D_to_2D(fsis, ns[0], ns[1]) fsis.integrate([nu1_1 * Fs, nu2_1 * Fs], T1, m=np.array([[0, m12 * Fi * Fs], [m21 * Fi * Fs, 0]])) fsis.integrate([nu1_2 * Fs, nu2_2 * Fs], T2, m=np.array([[0, 0], [0, 0]])) stss = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fss = moments.Spectrum(stss) fss = moments.Manips.split_1D_to_2D(fss, ns[0], ns[1]) fss.integrate([nu1_1 * Fs, nu2_1 * Fs], T1, m=np.array([[0, m12 * Fs], [m21 * Fs, 0]])) fss.integrate([nu1_2 * Fs, nu2_2 * Fs], T2, m=np.array([[0, 0], [0, 0]])) fs2 = Pi * (1 - Ps) * fsi + Ps * (1 - Pi) * fss + Pi * Ps * fsis + ( 1 - Pi) * (1 - Ps) * fs return fs2
def test_pickle(self): """ Saving spectrum to file. """ comments = ['comment 1', 'comment 2'] filename = 'test.p' data = numpy.random.rand(3, 3) fs = moments.Spectrum(data) pickle.dump(fs, open(filename, "wb")) os.remove(filename)
def s12nm(params , ns): # p_misid: proportion of misidentified ancestral states # P: proportion of sites with lower Ne # Fs: factor of Ne reduction (1e-5 - 0.999) nu1,nu1_2,nu2_2,T1,T2 = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs.integrate([nu1], T1) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) fs.integrate([nu1_2, nu2_2], T2, m = np.array([[0, 0], [0, 0]])) return fs
def sc12nm(params, ns): # p_misid: proportion of misidentified ancestral states nu0, nu1, nu2, T1, T2, T3, p_misid = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs.integrate([nu0], T1) fs.integrate([nu1], T2) fs.integrate([nu2], T3) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) return (1 - p_misid) * fs + p_misid * moments.Numerics.reverse_array(fs)
def model_func(params, ns): s1, t1, nu11, nu12, m1_12, m1_21 = params sts = moments.LinearSystem_1D.steady_state_1D(np.sum(ns)) fs = moments.Spectrum(sts) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) nu2_func = lambda t: ((1 - s1) * 1.0) * (nu12 / ((1 - s1) * 1.0))**(t / t1) migs = np.array([[0, m1_12], [m1_21, 0]]) fs.integrate(tf=t1, Npop=lambda t: [nu11, nu2_func(t)], m=migs, dt_fac=0.01) return fs
def s12IMi(params, ns): """ ancestral pop size change, then split into two populations with exponential growth Migration is asymmetric and scales with the size of the source population p_misid: proportion of misidentified ancestral states Ps: proportion of sites with lower Ne Fs: factor of Ne reduction (1e-4 - 0.999) """ nu0, nu1_0, nu2_0, nu1, nu2, T0, T2, m12, m21 = params nu1_func = lambda t: nu1_0 * (nu1 / nu1_0)**(t / T2) nu2_func = lambda t: nu2_0 * (nu2 / nu2_0)**(t / T2) nu_func = lambda t: [nu1_func(t), nu2_func(t)] """ nu1s_func = lambda t: Fs*nu1_0 * (nu1/nu1_0)**(t/T2) nu2s_func = lambda t: Fs*nu2_0 * (nu2/nu2_0)**(t/T2) nus_func = lambda t: [nu1s_func(t), nu2s_func(t)] """ m21_func = lambda t: m21 * nu2_func(t) m12_func = lambda t: m12 * nu1_func(t) migs = lambda t: np.array([[0, m12_func(t)], [m21_func(t), 0]]) migs.i = lambda t: np.array([[0, Fi * m12_func(t)], [Fi * m21_func(t), 0]]) sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs.integrate([nu0], T0) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) # fs.integrate([nu1_0, nu2_0], T1, m = np.array([[0, 0], [0, 0]])) fs.integrate(nu_func, T2, dt_fac=0.01, m=migs) """ stsi = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsi = moments.Spectrum(stsi) fsi.integrate([nu0], T0) fsi = moments.Manips.split_1D_to_2D(fsi, ns[0], ns[1]) # fsi.integrate([nu1_0, nu2_0], T1, m = np.array([[0, 0], [0, 0]])) fsi.integrate(nu_func, T2, dt_fac=0.01, m=migs.i) stss = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fss = moments.Spectrum(stss) fss.integrate([nu0*Fs], T0) fss = moments.Manips.split_1D_to_2D(fss, ns[0], ns[1]) # fss.integrate([Fs*nu1_0, Fs*nu2_0], T1, m = np.array([[0, 0], [0, 0]])) fss.integrate(nus_func, T2, dt_fac=0.01, m=migs) stsis = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsis = moments.Spectrum(stsis) fsis.integrate([nu0*Fs], T0) fsis = moments.Manips.split_1D_to_2D(fsis, ns[0], ns[1]) fsis.integrate([Fs*nu1_0, Fs*nu2_0], T1, m = np.array([[0, 0], [0, 0]])) fsis.integrate(nus_func, T2, dt_fac=0.01, m=migs.i) """ # fs2=Ps*fsi+(1-Pi)*fs return fs
def model_func(params, ns): """ Some model """ nuB, nuF, TB, TF = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0]) fs = moments.Spectrum(sts) fs.integrate(tf=TB, Npop=[nuB]) fs.integrate(tf=TF, Npop=[nuF]) return fs
def sc3ei(params , ns): # p_misid: proportion of misidentified ancestral states # P: proportion of sites with lower Ne # Fs: factor of Ne reduction (1e-5 - 0.999) nu1,nu1_2,nu2_2,T1,T2,m12,m21,p_misid = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs.integrate([nu1], T1) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) fs.integrate([nu1_2, nu2_2], T2, m = np.array([[0, m12], [m21, 0]])) return (1-p_misid)*fs + p_misid*moments.Numerics.reverse_array(fs)
def SI_2N(params, ns): """ nu1= pop size for North Sea nu2=pop size for Baltic Sea T1= time of split hrf= Hill-Robertson factor (i.e. average Ne for regions under linked selection as a proportion of "neutral" Ne) Q= proportion of the genome under linked selection """ nu1,nu2,T1,hrf,Q = params # calculate the spectrum for neutral portion of the genome sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) fs.integrate([nu1, nu2], T1, dt_fac=0.01, m=numpy.array([[0, 0], [0, 0]])) # calculate the spectrum for lower Ne regions of the genome stsn2 = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsn2 = moments.Spectrum(stsn2) fsn2 = moments.Manips.split_1D_to_2D(fsn2, ns[0], ns[1]) fsn2.integrate([nu1*hrf, nu2*hrf], T1, dt_fac=0.01, m=numpy.array([[0, 0], [0, 0]])) fs2= Q*fsn2+(1-Q)*fs return fs2
def sc3ei(params, ns): # p_misid: proportion of misidentified ancestral states # P: proportion of sites with lower migration # Fi: factor of migr reduction (1e-5 - 0.999) nu1, nu1_2, nu2_2, T1, T2, m12, m21, Fi, P = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs.integrate([nu1], T1) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) fs.integrate([nu1_2, nu2_2], T2, m=np.array([[0, m12], [m21, 0]])) stsi = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsi = moments.Spectrum(stsi) fsi.integrate([nu1], T1) fsi = moments.Manips.split_1D_to_2D(fsi, ns[0], ns[1]) fsi.integrate([nu1_2, nu2_2], T2, m=np.array([[0, m12 * Fi], [m21 * Fi, 0]])) fs2 = P * fsi + (1 - P) * fs return fs2
def AM_b_2M(params, ns): """ nu1= pop size for North Sea s=proportion of the North Sea pop which invaded the Baltic (i.e. original bottleneck) nu2= final size of Baltic Sea pop T1= time of population split T2= time of second epoch of migration and population growth m12= migration rate from North Sea to Baltic m21= migration rate from Baltic Sea to North Sea i1= reduction in migration rate for Islands from the Baltic to North Sea i2= reduction in migration rate for Islands from the North Sea to Baltic P= proportion of the genome made up of "islands" O= Proportion of miss-polirized SNPs """ nu1, nu2, s, T1, T2, m12, m21, i1, i2, P, O = params nu2_0 = nu1 * s nu2_func = lambda t: nu2_0 * (nu2 / nu2_0)**(t / T2) nu_func = lambda t: [nu1, nu2_func(t)] # calculate the spectrum for neutral portion of the genome sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsO = moments.Spectrum(sts) fsO = moments.Manips.split_1D_to_2D(fsO, ns[0], ns[1]) fsO.integrate([nu1, nu1 * s], T1, dt_fac=0.01, m=numpy.array([[0, m12], [m21, 0]])) fsO.integrate(nu_func, T2, dt_fac=0.01, m=numpy.array([[0, 0], [0, 0]])) fsM = moments.Numerics.reverse_array(fsO) # calculate teh spectrum for genomic islands stsi = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsiO = moments.Spectrum(stsi) fsiO = moments.Manips.split_1D_to_2D(fsiO, ns[0], ns[1]) fsiO.integrate([nu1, nu1 * s], T1, dt_fac=0.01, m=numpy.array([[0, m12 * i2], [m21 * i1, 0]])) fsiO.integrate(nu_func, T2, dt_fac=0.01, m=numpy.array([[0, 0], [0, 0]])) fsiM = moments.Numerics.reverse_array(fsiO) fs2 = P * (O * fsiO + (1 - O) * fsiM) + (1 - P) * (O * fsO + (1 - O) * fsM) return fs2
def SI(params, ns): """ nu1= pop size for North Sea nu2=pop size for Baltic Sea T1= time of split """ nu1,nu2,T1 = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) fs.integrate([nu1, nu2], T1, dt_fac=0.01,m = numpy.array([[0, 0], [0, 0]])) return fs
def sc3ei(params, ns): # p_misid: proportion of misidentified ancestral states # P: proportion of sites with lower migration # Fi: factor of migration reduction (1e-5 - 0.999) nu0, nu1_1, nu2_1, nu1_2, nu2_2, T0, T1, T2, m12_1, m21_1, m12_2, m21_2 = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs.integrate([nu0], T0) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) fs.integrate([nu1_1, nu2_1], T1, m=np.array([[0, m12_1], [m21_1, 0]])) fs.integrate([nu1_2, nu2_2], T2, m=np.array([[0, m12_2], [m21_2, 0]])) return fs
def IM(params, ns): s, nPer, nAlb, tSplit, m12, m21 = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) nu1_func = lambda t: s * (nPer / s)**(t / tSplit) nu2_func = lambda t: (1 - s) * (nAlb / (1 - s))**(t / tSplit) nu_func = lambda t: [nu1_func(t), nu2_func(t)] fs.integrate(nu_func, tSplit, dt_fac=0.01, m=np.array([[0, m12], [m21, 0]])) return fs
def test_folded_slices(self): ns = (3, 4) fs1 = moments.Spectrum(numpy.random.rand(*ns)) folded1 = fs1.fold() self.assert_(fs1[:].folded == False) self.assert_(folded1[:].folded == True) self.assert_(fs1[0].folded == False) self.assert_(folded1[1].folded == True) self.assert_(fs1[:, 0].folded == False) self.assert_(folded1[:, 1].folded == True)
def SC_2M(params, ns): """ nu1= pop size for North Sea nu2= pop size for the Baltic Sea T1= time of population split T2= time of secondary contact i1= reduction in migration rate for Islands from the Baltic to North Sea i2= reduction in migration rate for Islands from the North Sea to Baltic P= proportion of the genome made up of "islands" O= Proportion of miss-polirized SNPs """ nu1, nu2, T1, T2, m12, m21, i1, i2, P, O = params # calculate the spectrum for neutral portion of the genome sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsO = moments.Spectrum(sts) fsO = moments.Manips.split_1D_to_2D(fsO, ns[0], ns[1]) fsO.integrate([nu1, nu2], T1, dt_fac=0.01, m=numpy.array([[0, 0], [0, 0]])) fsO.integrate([nu1, nu2], T2, dt_fac=0.01, m=numpy.array([[0, m12], [m21, 0]])) fsM = moments.Numerics.reverse_array(fsO) # calculate the spectrum from genomic islands stsi = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsiO = moments.Spectrum(stsi) fsiO = moments.Manips.split_1D_to_2D(fsiO, ns[0], ns[1]) fsiO.integrate([nu1, nu2], T1, dt_fac=0.01, m=numpy.array([[0, 0], [0, 0]])) fsiO.integrate([nu1, nu2], T2, dt_fac=0.01, m=numpy.array([[0, m12 * i2], [m21 * i1, 0]])) fsiM = moments.Numerics.reverse_array(fsiO) fs2 = P * (O * fsiO + (1 - O) * fsiM) + (1 - P) * (O * fsO + (1 - O) * fsM) return fs2
def make_plot(sim_fs, integrated_fs, args, initial_seed): ndemes = len(integrated_fs.shape) outfile = os.path.basename(args.yaml).replace(".yml", "_residuals.png") fig = plt.Figure() if ndemes == 2: moments_sim_fs = moments.Spectrum(sim_fs.todense()) moments.Plotting.plot_2d_comp_Poisson( integrated_fs, moments_sim_fs, show=False, fig_num=plt.gcf().number, ) # simfs = os.path.basename(args.yaml).replace("yml", "mean_sim_fs") # moments_sim_fs.to_file(simfs) # simfs = os.path.basename(args.yaml).replace("yml", "integrated_fs") # integrated_fs.to_file(simfs) elif ndemes == 1: moments_sim_fs = moments.Spectrum(sim_fs.data[:-1]) moments.Plotting.plot_1d_comp_Poisson( integrated_fs[:-1], moments_sim_fs, show=False, fig_num=plt.gcf().number, ) # simfs = os.path.basename(args.yaml).replace("yml", "mean_sim_fs") # moments_sim_fs.to_file(simfs) # simfs = os.path.basename(args.yaml).replace("yml", "integrated_fs") # integrated_fs.to_file(simfs) else: raise NotImplementedError( f"Plotting not implemented for {ndemes} demes.") plt.gcf().suptitle(f"No. reps = {args.nreps}, seed = {initial_seed}") plt.gcf().tight_layout() plt.savefig(outfile) return outfile
def sc3ei(params, ns): # p_misid: proportion of misidentified ancestral states # P: proportion of sites with lower migration # Fi: factor of migr reduction (1e-5 - 0.999) nu1, nu1_2, nu2_2, T1, T2, m12, m21, Fi, Pi, Fs, Ps, p_misid = params sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs.integrate([nu1], T1) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) fs.integrate([nu1_2, nu2_2], T2, m=np.array([[0, m12], [m21, 0]])) stsi = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsi = moments.Spectrum(stsi) fsi.integrate([nu1], T1) fsi = moments.Manips.split_1D_to_2D(fsi, ns[0], ns[1]) fsi.integrate([nu1_2, nu2_2], T2, m=np.array([[0, m12 * Fi], [m21 * Fi, 0]])) stsis = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsis = moments.Spectrum(stsis) fsis.integrate([nu1], T1) fsis = moments.Manips.split_1D_to_2D(fsis, ns[0], ns[1]) fsis.integrate([nu1_2 * Fs, nu2_2 * Fs], T2, m=np.array([[0, m12 * Fi * Fs], [m21 * Fi * Fs, 0]])) stss = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fss = moments.Spectrum(stss) fss.integrate([nu1], T1) fss = moments.Manips.split_1D_to_2D(fss, ns[0], ns[1]) fss.integrate([nu1_2 * Fs, nu2_2 * Fs], T2, m=np.array([[0, m12 * Fs], [m21 * Fs, 0]])) fs2 = Pi * (1 - Ps) * fsi + Ps * (1 - Pi) * fss + Pi * Ps * fsis + ( 1 - Pi) * (1 - Ps) * fs return (1 - p_misid) * fs2 + p_misid * moments.Numerics.reverse_array(fs2)
def SC_b_2N(params, ns): """ nu1= pop size for North Sea s=proportion of the North Sea pop which invaded the Baltic (i.e. original bottleneck) nu2= final size of Baltic Sea pop T1= time of population split T2= time of secondary contact m12= migration rate from North Sea to Baltic m21= migration rate from Baltic Sea to North Sea hrf= Hill-Robertson factor (i.e. average Ne for regions under selection as a proportion of "neutral" Ne) Q= proportion of the genome under selection """ nu1, nu2, s, T1, T2, m12, m21, hrf, Q = params nu2_0 = nu1 * s nu2_func = lambda t: nu2_0 * (nu2 / nu2_0)**(t / T2) nu_func = lambda t: [nu1, nu2_func(t)] nu2hrf_func = lambda t: nu2_0 * (nu2 / nu2_0)**(t / T2) * hrf nuhrf_func = lambda t: [nu1 * hrf, nu2hrf_func(t)] # calculate the spectrum for neutral portion of the genome sts = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fs = moments.Spectrum(sts) fs = moments.Manips.split_1D_to_2D(fs, ns[0], ns[1]) fs.integrate([nu1, nu1 * s], T1, m=np.array([[0, 0], [0, 0]])) fs.integrate(nu_func, T2, dt_fac=0.01, m=np.array([[0, m12], [m21, 0]])) # calculate the spectrum from low Ne parts of the genome stsn2 = moments.LinearSystem_1D.steady_state_1D(ns[0] + ns[1]) fsn2 = moments.Spectrum(stsn2) fsn2 = moments.Manips.split_1D_to_2D(fsn2, ns[0], ns[1]) fsn2.integrate([nu1 * hrf, nu1 * s * hrf], T1, m=np.array([[0, 0], [0, 0]])) fsn2.integrate(nuhrf_func, T2, dt_fac=0.01, m=np.array([[0, m12], [m21, 0]])) fs2 = Q * fsn2 + (1 - Q) * fs return fs2