pop = sim.Population(size=[6000], loci=1000, infoFields=["qtrait"]) def qtrait(geno): trait = random.normalvariate(sum(geno) * 5, random.uniform(0.0001, 3)) if trait <= 0: trait = random.uniform(0.0001, 1) return trait pop.evolve(initOps=[sim.InitSex(), sim.InitGenotype(prop=[0.7, 0.3])], matingScheme=sim.RandomMating(), postOps=[ sim.PyQuanTrait(loci=(0, 1, 2, 3, 4, 5, 6, 10, 100), func=qtrait, infoFields=["qtrait"]) ], gen=10) geno = list() for i in pop.individuals(): geno.append(i.genotype()) pheno = list() for i in pop.individuals(): pheno.append(i.qtrait) f = open("qtrait1.txt", "w") f.write("\n".join(map(lambda x: str(x), pheno))) f.close()
def main(): # Check for arguments passed try: opts, args = getopt.getopt(sys.argv[1:], shortopts="vhd:p1:p2:s:n:l:e:f:i:m:g:r:", longopts=[ "verbose", "help", "distribution=", "parameter1=", "parameter2=", "size=", "number=", "loci=", "effect=", "mean=", "filename=", "heritability=", "gen=", "rrate=" ]) except getopt.GetoptError as err: print(err) usage() sys.exit() verbose = False filename = "my" size = 1000 number = 100 heritability = 0.2 mean = 2.0 gen = 5 rrate = 0.0 print "\n" for o in opts: if o[0] in ("-v", "--verbose"): verbose = True print("Verbose mode") for o in opts: if o[0] in ("-d", "--distribution"): distribution = float(o[1]) if distribution == 0: parameter1 = None parameter2 = None if verbose: print "Simulation will occur with Normal Distribution" elif distribution == 1: if verbose: print "Simulation will occur with Gamma Distribution" for o in opts: if o[0] in ("-p1", "--parameter1"): parameter1 = float(o[1]) if verbose: print "Gamma distribution will occur with alpha:", parameter1 for o in opts: if o[0] in ("-p2", "--parameter2"): parameter2 = float(o[1]) if verbose: print "Gamma distribution will occur with beta:", parameter2 elif distribution != 0 or distribution != 1: sys.exit( "Error message: Distribution option must be either 0 or 1") for o in opts: if o[0] in ("-p2", "--parameter2"): bbeta = float(o[1]) if verbose: print "Gamma distribution will occur with beta:", bbeta for o in opts: if o[0] in ("-s", "--size"): individuals = o[1].split(",") individuals = map(int, individuals) if verbose: print "Population size/s is set at", individuals for o in opts: if o[0] in ("-h", "--help"): usage() sys.exit() elif o[0] in ("-n", "--number"): number = o[1] if verbose: print "Number of loci per individual is set at", number elif o[0] in ("-l", "--loci"): global loci loci = o[1].split(",") loci = map(int, loci) if verbose: print "Loci positions per individual are:", loci elif o[0] in ("-e", "--effect"): global effects effects = o[1].split(",") effects = map(float, effects) if verbose: print "Effects for loci per individual are:", effects elif o[0] in ("-f", "--filename"): filename = o[1] if verbose: print "File will be saved as:", filename elif o[0] in ("-i", "--heritability"): heritability = float(o[1]) if verbose: print "Heritability for simulation specified as:", heritability elif o[0] in ("-m", "--mean"): mean = o[1].split(",") mean = map(float, mean) if len(mean) == 1 and len(individuals) > 1: mean = numpy.array(mean) mean = numpy.repeat(mean, len(individuals), axis=0) mean = list(mean) if verbose: print "Population mean/s specified as:", mean elif o[0] in ("-g", "--gen"): gen = int(o[1]) if verbose: print "Generations to evolve specified as:", gen elif o[0] in ("-r", "--rrate"): rrate = float(o[1]) if verbose: print "Recombination will occur with rate:", rrate ## Start quantitative trait simulation if verbose: print "Creating population..." pop = sim.Population(size=individuals, loci=int(number), infoFields=["qtrait"]) if verbose: print "Evolving population..." pop.evolve( initOps=[sim.InitSex(), sim.InitGenotype(prop=[0.7, 0.3])], matingScheme=sim.RandomMating(ops=sim.Recombinator(rates=rrate)), postOps=[ sim.PyQuanTrait(loci=loci, func=additive_model, infoFields=["qtrait"]) ], gen=gen) if verbose: print "Coalescent process complete. Population evolved with", pop.numSubPop( ), "sub-populations." genotypes = list() for i in pop.individuals(): genotypes.append(i.genotype()) phenotypes = list() for i in pop.individuals(): phenotypes.append(i.qtrait) # fun() obtains the heritability equation set to zero for various settings of sigma (standard deviation) #NOTE: May need to tweak gamma distribution parameters to be appropriate for data! def fun(sigma, h): x_exact = list() count = 0 for i in phenotypes: current_mean = mean[pop.subPopIndPair(count)[0]] x_exact.append(current_mean + i) count += 1 x_random = list() #bbeta=((sigma**2)/current_mean) #Set up approximate beta variable for gamma distribution count = 0 for each in phenotypes: current_mean = mean[pop.subPopIndPair(count)[0]] x_random.append(random.normalvariate(current_mean + each, sigma)) count += 1 r = pearsonr(x_exact, x_random)[0] return r - math.sqrt(h) if verbose: print "Building polynomial model for variance tuning..." # Fits a polynomial model in numpy to the values obtained from the fun() function points = list() for i in drange(0, max(effects) * 10, 0.001): points.append(i) y_points = list() for i in points: y_points.append(fun(i, heritability)) z = numpy.polyfit(x=points, y=y_points, deg=3) p = numpy.poly1d(z) # Netwon's method finds the polynomial model's roots def newton(p): xn = 100 p_d = p.deriv() count = 0 while abs(p(xn)) > 0.01: if count > 1000: print "Unable to converge after 1000 iterations...\nPlease choose different settings." usage() sys.exit() count += 1 xn = xn - p(xn) / p_d(xn) if xn < 0.0: xn = 0.0 if verbose: print "Estimated variance of phenotypes for specified heriability: ", xn return xn if verbose: print "Using Newton's method to find polynomial roots..." # Files are saved to the specified location estimated_variance = newton(p) new_phenotypes = list() count = 0 for o in opts: if o[0] in ("-d", "--distribution"): if distribution == 0: for each in phenotypes: current_mean = mean[pop.subPopIndPair(count)[0]] new_phenotypes.append( random.normalvariate(current_mean + each, estimated_variance)) count += 1 elif distribution == 1: for each in phenotypes: current_mean = mean[pop.subPopIndPair(count)[0]] new_phenotypes.append( random.gammavariate( (current_mean + each) / parameter2, ((estimated_variance / parameter1)**0.5))) count += 1 f = open(filename + "_qtrait.txt", "w") f.write("\n".join(map(lambda x: str(x), new_phenotypes))) f.close() numpy.savetxt(filename + "_kt_ote2.txt", numpy.column_stack((loci, numpy.array(effects)))) export(pop, format='ped', output=filename + '_genomes.ped') export(pop, format='map', output=filename + '_genomes.map') print "\n\n"
def qtrait(geno, age): 'Return two traits that depends on genotype and age' return random.normalvariate(age * sum(geno), 10) pop.evolve( initOps=[ sim.InitSex(), sim.InitGenotype(prop=[0.8, 0.2]), ], matingScheme=sim.RandomMating(), postOps=[ # use random age for simplicity sim.InitInfo(lambda: random.randint(20, 75), infoFields='age'), sim.PyQuanTrait(loci=(1), func=qtrait, infoFields=['qtrait1']), sim.Stat(meanOfInfo=['qtrait1'], subPops=[(0, sim.ALL_AVAIL)], vars='meanOfInfo_sp'), sim.PyEval( r"'Mean of trait1: %.3f (age < 40), %.3f (age >=40)\n' % " "(subPop[(0,0)]['meanOfInfo']['qtrait1'], subPop[(0,1)]['meanOfInfo']['qtrait1'])" ), ], gen=100) qtrait1_ls = list() for ind in pop.individuals(): qtrait1_ls.append(ind.qtrait1) f = open("qtrait1.txt", "w")
pop.setVirtualSplitter(sim.InfoSplitter(field='age', cutoff=[40])) def qtrait(geno, age): 'Return two traits that depends on genotype and age' return random.normalvariate(age * sum(geno), 10), random.randint(0, 10 * sum(geno)) pop.evolve( initOps=[ sim.InitSex(), sim.InitGenotype(freq=[0.2, 0.8]), ], matingScheme=sim.RandomMating(), postOps=[ # use random age for simplicity sim.InitInfo(lambda: random.randint(20, 75), infoFields='age'), sim.PyQuanTrait(loci=(0, 1), func=qtrait, infoFields=['qtrait1', 'qtrait2']), sim.Stat(meanOfInfo=['qtrait1'], subPops=[(0, sim.ALL_AVAIL)], vars='meanOfInfo_sp'), sim.PyEval( r"'Mean of trait1: %.3f (age < 40), %.3f (age >=40)\n' % " "(subPop[(0,0)]['meanOfInfo']['qtrait1'], subPop[(0,1)]['meanOfInfo']['qtrait1'])" ), ], gen=5)
def main(): ## Check for arguments passed try: opts, args = getopt.getopt(sys.argv[1:], shortopts="vhs:n:l:e:f:", longopts=[ "verbose", "help", "size=", "number=", "loci=", "effect=", "filename=" ]) except getopt.GetoptError as err: print(err) usage() sys.exit() verbose = False has_filename = False print "\n" for o in opts: if o[0] in ("-v", "--verbose"): verbose = True print("Verbose mode") for o in opts: if o[0] in ("-h", "--help"): usage() sys.exit() elif o[0] in ("-s", "--size"): individuals = o[1] if verbose: print "Population size is set at", individuals elif o[0] in ("-n", "--number"): number = o[1] if verbose: print "Number of loci per individual is set at", number elif o[0] in ("-l", "--loci"): loci = o[1].split(",") loci = map(int, loci) if verbose: print "Loci positions per individual are:", loci elif o[0] in ("-e", "--effect"): global effects effects = o[1].split(",") effects = map(float, effects) if verbose: print "Effects for loci per individual are:", effects elif o[0] in ("-f", "--filename"): filename = o[1] has_filename = True if verbose: print "File will be saved as:", filename ## Start quantitative trait simulation if verbose: print "Creating population..." pop = sim.Population(size=int(individuals), loci=int(number), infoFields=["qtrait"]) if verbose: print "Evolving population..." pop.evolve(initOps=[sim.InitSex(), sim.InitGenotype(prop=[0.7, 0.3])], matingScheme=sim.RandomMating(), postOps=[ sim.PyQuanTrait(loci=loci, func=trait, infoFields=["qtrait"]) ], gen=5) genotypes = list() for i in pop.individuals(): genotypes.append(i.genotype()) phenotypes = list() for i in pop.individuals(): phenotypes.append(i.qtrait) if has_filename is False: filename = "my" f = open(filename + "_qtrait.txt", "w") f.write("\n".join(map(lambda x: str(x), phenotypes))) f.close() saveCSV(pop, filename + "_genomes.csv") print "\n\n"
def main(): ## Check for arguments passed try: opts, args = getopt.getopt(sys.argv[1:], shortopts="vhs:n:l:e:f:i:", longopts=[ "verbose", "help", "size=", "number=", "loci=", "effect=", "filename=", "herit=" ]) except getopt.GetoptError as err: print(err) usage() sys.exit() verbose = False has_filename = False has_heritability = False filename = "my" heritability = 0.2 print "\n" for o in opts: if o[0] in ("-v", "--verbose"): verbose = True print("Verbose mode") for o in opts: if o[0] in ("-h", "--help"): usage() sys.exit() elif o[0] in ("-s", "--size"): individuals = o[1] if verbose: print "Population size is set at", individuals elif o[0] in ("-n", "--number"): number = o[1] if verbose: print "Number of loci per individual is set at", number elif o[0] in ("-l", "--loci"): global loci loci = o[1].split(",") loci = map(int, loci) if verbose: print "Loci positions per individual are:", loci elif o[0] in ("-e", "--effect"): global effects effects = o[1].split(",") effects = map(float, effects) if verbose: print "Effects for loci per individual are:", effects elif o[0] in ("-f", "--filename"): filename = o[1] has_filename = True if verbose: print "File will be saved as:", filename elif o[0] in ("-i", "--herit"): heritability = float(o[1]) has_heritability = True if verbose: print "Heritability for simulation specified as:", heritability ## Start quantitative trait simulation if verbose: print "Creating population..." pop = sim.Population(size=int(individuals), loci=int(number), infoFields=["qtrait"]) if verbose: print "Evolving population..." pop.evolve(initOps=[sim.InitSex(), sim.InitGenotype(prop=[0.7, 0.3])], matingScheme=sim.RandomMating(), postOps=[ sim.PyQuanTrait(loci=loci, func=additive_model, infoFields=["qtrait"]) ], gen=5) if verbose: print "Coalescent process complete. Population evolved." genotypes = list() for i in pop.individuals(): genotypes.append(i.genotype()) #print i.genotype() phenotypes = list() for i in pop.individuals(): phenotypes.append(i.qtrait) #print i.qtrait def fun(sigma, h): x_exact = phenotypes x_random = list() for each in phenotypes: x_random.append(random.normalvariate(each, sigma)) r = pearsonr(x_exact, x_random)[0] return r - math.sqrt(h) #print fun(2.25, 0.25) if verbose: print "Building polynomial model for variance tuning..." points = list() for i in drange(0, max(effects) * 10, 0.001): points.append(i) y_points = list() for i in points: y_points.append(fun(i, heritability)) z = numpy.polyfit(x=points, y=y_points, deg=3) p = numpy.poly1d(z) def newton(p): xn = 100 p_d = p.deriv() count = 0 while abs(p(xn)) > 0.01: if count > 1000: print "Unable to converge after 1000 iterations..." sys.exit() count += 1 xn = xn - p(xn) / p_d(xn) if verbose: print "Estimated variance of phenotypes for specified heriability using Newton's method: ", xn return xn if verbose: print "Using Newton's method to find polynomial roots..." estimated_variance = newton(p) new_phenotypes = list() for each in phenotypes: new_phenotypes.append(random.normalvariate(each, estimated_variance)) f = open(filename + "_qtrait.txt", "w") f.write("\n".join(map(lambda x: str(x), new_phenotypes))) f.close() saveCSV(pop, filename + "_genomes.csv") print "\n\n"
sim.IdTagger() ], # The order should be: becoming a smurf or not since previous day, dying or not, aging one day # if lucky enough, and then mate at that age. preOps=[ sim.InfoExec("luck = random.random()"), sim.InfoExec( "smurf = 1.0 if ((ind.smurf == 1) or (ind.age > ind.t0 and ind.luck < 1.0 - math.exp(-ind.a * ind.age + ind.a * ind.t0 - ind.a / 2.0))) else 0.0", exposeInd='ind'), sim.DiscardIf(natural_death), sim.InfoExec("age += 1") ], matingScheme=sim.HeteroMating([ sim.CloneMating(subPops=[(0, 0), (0, 1), (0, 2)], weight=-1), sim.RandomMating(ops=[ sim.IdTagger(), sim.PedigreeTagger(), sim.PyQuanTrait(loci=[0], func=qtrait, infoFields=['a', 'b']), sim.InfoExec("smurf = 0.0"), sim.MendelianGenoTransmitter() ], weight=1, subPops=[(0, 1)], numOffspring=(sim.UNIFORM_DISTRIBUTION, 10, 50)) ], subPopSize=demo), gen=args.G) pop = simu.extract(0) outputStructure(pop)
A = sum(geno[:20]) + normalvariate(0, 2.5) B = sum(geno[20:40]) + normalvariate(0, 2.5) I = sum(geno[40:60]) + normalvariate(0, 2.5) D = B + I - A + normalvariate(0, sigma**2) return A, B, I, D pop = sim.Population(100000, loci=[1] * 40, infoFields=['A', 'B', 'I', 'D']) pop.evolve( initOps=[ sim.InitSex(maleProp=0.5), sim.InitGenotype(freq=[0.5, 0.5]), ], preOps=[ sim.PyQuanTrait(func=traits, loci=sim.ALL_AVAIL, infoFields=['A', 'B', 'I', 'D']), sim.PyOperator(func=lambda pop: pop.sortIndividuals('D') is None), ], matingScheme=sim.HomoMating(chooser=sim.SequentialParentsChooser(), generator=sim.OffspringGenerator( ops=sim.MendelianGenoTransmitter(), numOffspring=2, sexMode=(sim.NUM_OF_MALES, 1))), finalOps=sim.PyQuanTrait(func=traits, loci=sim.ALL_AVAIL, infoFields=['A', 'B', 'I', 'D']), gen=10) from rpy import r
def main(): # First, grab and interpret command line arguments parser = argparse.ArgumentParser( description="Command line arguments for Simulate") parser.add_argument("-v", "--verbose", help="Triggers verbose mode", action="store_true") parser.add_argument("-d", "--distribution", default="normal", choices=["normal", "gamma"], help="Distribution option") parser.add_argument( "-p1", "--parameter1", default=3.0, type=float, help="Shape parameter (only used if distribution choice is gamma)") parser.add_argument( "-p2", "--parameter2", default=1.5, type=float, help="Scale parameter (only used if distribution choice is gamma)") parser.add_argument("-s", "--size", required=True, type=int, nargs="+", help="Specify population size(s)") parser.add_argument("-l", "--loci", required=True, type=int, nargs="+", help="Loci with effects") parser.add_argument("-n", "--number", required=True, default=3000, type=int, help="Number of loci per population or sub-population") parser.add_argument("-e", "--effect", required=True, type=float, nargs="+", help="Effect size(s) for the loci specified") parser.add_argument("-i", "--heritability", default=0.2, type=restricted_float, help="Heritability coefficient for population") parser.add_argument("-m", "--mean", default=2.0, type=float, nargs="+", help="Mean(s) for population phenotype(s)") parser.add_argument("-g", "--gen", default=5, type=int, help="Number of generations for population to evolve") parser.add_argument("-r", "--rrate", default=0.0, type=restricted_float, help="Recombination rate for given population") parser.add_argument("-f", "--filename", default="my", type=str, help="Prefix for output file set") args = parser.parse_args() verbose = args.verbose if verbose: print "Verbose mode" distribution = args.distribution if verbose: print "Simulation will occur with " + distribution + " distribution" parameter1 = args.parameter1 if verbose and distribution == "gamma": print "Gamma distrbution will occur with alpha parameter:", parameter1 parameter2 = args.parameter2 if verbose and distribution == "gamma": print "Gamma distribution will occur with beta parameter", parameter2 individuals = args.size if verbose: print "Population size(s) set at", individuals loci = args.loci if verbose: print "Loci positions per individual set as", loci number = args.number if verbose: print "Number of loci per population set as", number global effects effects = args.effect if verbose: print "Effects for loci per individual are", effects heritability = args.heritability mean = args.mean if len(mean) == 1 and len(individuals) > 1: mean = numpy.array(mean) mean = numpy.repeat(mean, len(individuals), axis=0) mean = list(mean) if verbose: print "Population mean(s) set as", mean gen = args.gen if verbose: print "Number of generations to evolve set as", gen rrate = args.rrate if verbose: print "Recombination rate set as", rrate filename = args.filename if verbose: "File will be saved as", filename ## Start quantitative trait simulation via simuPOP if verbose: print "Creating population..." pop = sim.Population(size=individuals, loci=int(number), infoFields=["qtrait"]) if verbose: print "Evolving population..." type(gen) pop.evolve( initOps=[sim.InitSex(), sim.InitGenotype(prop=[0.7, 0.3])], matingScheme=sim.RandomMating(ops=sim.Recombinator(rates=rrate)), postOps=[ sim.PyQuanTrait(loci=loci, func=additive_model, infoFields=["qtrait"]) ], gen=gen) if verbose: print "Coalescent process complete. Population evolved with", pop.numSubPop( ), "sub-populations." genotypes = list() for i in pop.individuals(): genotypes.append(i.genotype()) phenotypes = list() for i in pop.individuals(): phenotypes.append(i.qtrait) # fun() obtains the heritability equation set to zero for various settings of sigma (standard deviation) def fun(sigma, h): x_exact = list() count = 0 for i in phenotypes: current_mean = mean[pop.subPopIndPair(count)[0]] x_exact.append(current_mean + i) count += 1 x_random = list() count = 0 for each in phenotypes: current_mean = mean[pop.subPopIndPair(count)[0]] x_random.append(random.normalvariate(current_mean + each, sigma)) count += 1 r = pearsonr(x_exact, x_random)[0] return r - math.sqrt(h) if verbose: print "Building polynomial model for variance tuning..." # Polyfit fits a polynomial model in numpy to the values obtained from the fun() function points = list() for i in drange(0, max(effects) * 10, 0.001): points.append(i) y_points = list() for i in points: y_points.append(fun(i, heritability)) z = numpy.polyfit(x=points, y=y_points, deg=3) p = numpy.poly1d(z) # Netwon's method finds the polynomial model's roots def newton(p): xn = 100 p_d = p.deriv() count = 0 while abs(p(xn)) > 0.01: if count > 1000: print "Unable to converge after 1000 iterations...\nPlease choose different settings." sys.exit() count += 1 xn = xn - p(xn) / p_d(xn) if xn < 0.0: xn = 0.0 if verbose: print "Estimated variance of phenotypes for specified heriability: ", xn return xn if verbose: print "Using Newton's method to find polynomial roots..." # Files are saved to the specified location estimated_variance = newton(p) new_phenotypes = list() count = 0 for each in phenotypes: current_mean = mean[pop.subPopIndPair(count)[0]] if distribution == "normal": new_phenotypes.append( random.normalvariate(current_mean + each, estimated_variance)) elif distribution == "gamma": new_phenotypes.append( random.gammavariate( (current_mean + each) / parameter2, numpy.sqrt(estimated_variance / parameter1))) count += 1 f = open(filename + "_qtrait.txt", "w") f.write("\n".join(map(lambda x: str(x), new_phenotypes))) f.close() numpy.savetxt(filename + "_kt_ote.txt", numpy.column_stack((loci, numpy.array(effects))), fmt='%i %10.7f') saveCSV(pop, filename + "_genomes.csv") # Call the convert.R script to convert the output into usable PLINK files # Will probably need to change this line to something more generalizable in the near future os.system("Rscript convert.R " + filename) print "\n\n"
# Random mating with fixed number of offspring # https://bopeng.github.io/simuPOP/userGuide_ch6_sec1.html#determine-the-number-of-offspring-during-mating matingScheme = sim.RandomMating( ops = [ # average recombination across all chromosomes sim.Recombinator((1*len(pop.numLoci()))/sum(pop.numLoci())), # avg of 2 recombinations == poisson with rate 2 sim.PedigreeTagger(), sim.IdTagger() ], # each cross results in 10 offspring numOffspring = 10 ), # after mating assign quantitative trait based on genotype postOps = [ sim.PyQuanTrait( func = qtrait, loci = adv_loci, infoFields = ['trait', 'nalleles']) ], # 11 generations (the first generation are the founders) gen = 11 ) #### save results #### def write_pedigree(pop, outfile): out = open(outfile, "w") # get info field names info_names = pop.infoFields()
def main(): ## Check for arguments passed try: opts, args = getopt.getopt(sys.argv[1:], shortopts="vhs:n:l:e:f:i:m:g:r:", longopts=[ "verbose", "help", "size=", "number=", "loci=", "effect=", "mean=", "filename=", "heritability=", "gen=", "rrate=" ]) except getopt.GetoptError as err: print(err) usage() sys.exit() verbose = False filename = "my" size = 1000 number = 100 heritability = 0.2 mean = 2.0 gen = 5 rrate = 0.0 print "\n" for o in opts: if o[0] in ("-v", "--verbose"): verbose = True print("Verbose mode") for o in opts: if o[0] in ("-s", "--size"): individuals = o[1].split(",") individuals = map(int, individuals) if verbose: print "Population size/s is set at", individuals for o in opts: if o[0] in ("-h", "--help"): usage() sys.exit() elif o[0] in ("-n", "--number"): number = o[1] if verbose: print "Number of loci per individual is set at", number elif o[0] in ("-l", "--loci"): global loci loci = o[1].split(",") loci = map(int, loci) if verbose: print "Loci positions per individual are:", loci elif o[0] in ("-e", "--effect"): global effects effects = o[1].split(",") effects = map(float, effects) if verbose: print "Effects for loci per individual are:", effects elif o[0] in ("-f", "--filename"): filename = o[1] if verbose: print "File will be saved as:", filename elif o[0] in ("-i", "--heritability"): heritability = float(o[1]) if verbose: print "Heritability for simulation specified as:", heritability elif o[0] in ("-m", "--mean"): mean = o[1].split(",") mean = map(float, mean) if len(mean) == 1 and len(individuals) > 1: mean = numpy.array(mean) mean = numpy.repeat(mean, len(individuals), axis=0) mean = list(mean) if verbose: print "Population mean/s specified as:", mean elif o[0] in ("-g", "--gen"): gen = int(o[1]) if verbose: print "Generations to evolve specified as:", gen elif o[0] in ("-r", "--rrate"): rrate = float(o[1]) if verbose: print "Recombination will occur with rate:", rrate ## Start quantitative trait simulation if verbose: print "Creating population..." pop = sim.Population(size=individuals, loci=int(number), infoFields=["qtrait"]) if verbose: print "Evolving population..." pop.evolve( initOps=[sim.InitSex(), sim.InitGenotype(prop=[0.7, 0.3])], matingScheme=sim.RandomMating(ops=sim.Recombinator(rates=rrate)), postOps=[ sim.PyQuanTrait(loci=loci, func=additive_model, infoFields=["qtrait"]) ], gen=gen) if verbose: print "Coalescent process complete. Population evolved with", pop.numSubPop( ), "sub-populations." genotypes = list() for i in pop.individuals(): genotypes.append(i.genotype()) phenotypes = list() for i in pop.individuals(): phenotypes.append(i.qtrait) def fun(sigma, h): x_exact = list() count = 0 for i in phenotypes: current_mean = mean[pop.subPopIndPair(count)[0]] x_exact.append(current_mean + i) count += 1 x_random = list() count = 0 for each in phenotypes: current_mean = mean[pop.subPopIndPair(count)[0]] x_random.append(random.normalvariate(current_mean + each, sigma)) count += 1 r = pearsonr(x_exact, x_random)[0] return r - math.sqrt(h) if verbose: print "Building polynomial model for variance tuning..." points = list() for i in drange(0, max(effects) * 10, 0.001): points.append(i) y_points = list() for i in points: y_points.append(fun(i, heritability)) z = numpy.polyfit(x=points, y=y_points, deg=3) p = numpy.poly1d(z) def newton(p): xn = 100 p_d = p.deriv() count = 0 while abs(p(xn)) > 0.01: if count > 1000: print "Unable to converge after 1000 iterations...\nPlease choose different settings." usage() sys.exit() count += 1 xn = xn - p(xn) / p_d(xn) if xn < 0.0: xn = 0.0 if verbose: print "Estimated variance of phenotypes for specified heriability: ", xn return xn if verbose: print "Using Newton's method to find polynomial roots..." estimated_variance = newton(p) new_phenotypes = list() count = 0 for each in phenotypes: current_mean = mean[pop.subPopIndPair(count)[0]] new_phenotypes.append( random.normalvariate(current_mean + each, estimated_variance)) count += 1 f = open(filename + "_qtrait.txt", "w") f.write("\n".join(map(lambda x: str(x), new_phenotypes))) f.close() numpy.savetxt(filename + "_kt_ote2.txt", numpy.column_stack((loci, numpy.array(effects)))) saveCSV(pop, filename + "_genomes.csv") print "\n\n"
sim.InfoExec("luck = random.random()"), sim.InfoExec("smurf = 1.0 if (ind.smurf == 1 or (ind.age > ind.t0 and ind.luck < 1.0 - math.exp(-ind.a * ind.age + ind.a * ind.t0 - ind.a / 2.0))) else 0.0", exposeInd='ind'), sim.DiscardIf(natural_death), sim.InfoExec("age += 1"), sim.PySelector(loci=[0], func=fitness_func) ], matingScheme = sim.HeteroMating( [ sim.CloneMating(subPops = [(0,0), (0,1), (0,2)], weight = -1), sim.RandomMating( ops = [ sim.IdTagger(), sim.PedigreeTagger(), sim.InfoExec("smurf = 0.0"), sim.MendelianGenoTransmitter(), sim.PyQuanTrait(loci = sim.ALL_AVAIL, func = MaleEffect, infoFields = ['a', 'b', 't0']) ], weight = 1, subPops = [(0,1)], numOffspring = 1 ) ], subPopSize = demo ), postOps = [ sim.PyOperator(func=OutputStats, step=100) ], gen=args.G ) pop = simu.extract(0)
def MutationSelection(N=1000, generations=10000, X_loci=100, A_loci=0, AgingModel='two_phases', seed=2001, reps=1, InitMutFreq=0.001, aging_a1=0.003, aging_a2=0.05, aging_b=-0.019, aging_k=0.1911, MutRate=0.001, StatsStep=100, OutPopPrefix='z1', PrintFreqs=False, debug=False): '''Creates and evolves a population to reach mutation-selection balance.''' if debug: sim.turnOnDebug('DBG_ALL') else: sim.turnOffDebug('DBG_ALL') sim.setRNG('mt19937', seed) pop = sim.Population(N, loci=[X_loci, A_loci], ploidy=2, chromTypes=[sim.CHROMOSOME_X, sim.AUTOSOME], infoFields=[ 'age', 'a', 'b', 'smurf', 'ind_id', 'father_id', 'mother_id', 'luck', 't0', 'fitness' ]) pop.setVirtualSplitter( sim.CombinedSplitter( splitters=[ sim.ProductSplitter(splitters=[ sim.InfoSplitter(field='age', cutoff=9), sim.InfoSplitter(field='smurf', values=[0, 1]) ]), sim.SexSplitter(), sim.InfoSplitter(field='age', values=0) ], vspMap=[(0), (2), (1, 3), (4), (5), (6)], names=['larvae', 'adults', 'smurfs', 'males', 'females', 'zero'])) pop.dvars().k = aging_k pop.dvars().N = N pop.dvars().seed = seed pop.dvars().X_loci = X_loci pop.dvars().A_loci = A_loci pop.dvars().AgingModel = AgingModel exec("import random\nrandom.seed(seed)", pop.vars(), pop.vars()) exec("import math", pop.vars(), pop.vars()) simu = sim.Simulator(pop, rep=reps) simu.evolve( initOps=[ sim.InitSex(), sim.InitGenotype(freq=[1 - InitMutFreq, InitMutFreq]), sim.InitInfo([0], infoFields='age'), sim.InitInfo([aging_a1], infoFields='a'), sim.InitInfo([aging_b], infoFields='b'), sim.InitInfo(lambda: random.random(), infoFields='luck'), sim.InfoExec('t0 = -ind.b / ind.a', exposeInd='ind'), sim.InfoExec( 'smurf = 1.0 if AgingModel == "two_phases" and (ind.smurf == 1 or (ind.age > ind.t0 and ind.luck < 1.0 - math.exp(-ind.a * ind.age + ind.a * ind.t0 - ind.a / 2.0))) else 0.0', exposeInd='ind'), sim.IdTagger(), sim.PyExec('XFreqChange={}'), sim.PyExec('AFreqChange={}') ], preOps=[ sim.InfoExec('luck = random.random()'), sim.InfoExec( 'smurf = 1.0 if AgingModel == "two_phases" and (ind.smurf == 1 or (ind.age > ind.t0 and ind.luck < 1.0 - math.exp(-ind.a * ind.age + ind.a * ind.t0 - ind.a / 2.0))) else 0.0', exposeInd='ind'), sim.DiscardIf(natural_death(AgingModel)), sim.InfoExec('age += 1'), sim.PySelector(func=fitness_func1) ], matingScheme=sim.HeteroMating([ sim.CloneMating(subPops=[(0, 0), (0, 1), (0, 2)], weight=-1), sim.RandomMating(ops=[ sim.IdTagger(), sim.PedigreeTagger(), sim.InfoExec('smurf = 0.0'), sexSpecificRecombinator( rates=[0.75 / X_loci for x in range(X_loci)] + [2.07 / A_loci for x in range(A_loci)], maleRates=0.0), sim.PyQuanTrait(loci=sim.ALL_AVAIL, func=TweakAdditiveRecessive( aging_a1, aging_a2, aging_b, X_loci), infoFields=['a', 'b']) ], weight=1, subPops=[(0, 1)], numOffspring=1) ], subPopSize=demo), postOps=[ sim.SNPMutator(u=MutRate, subPops=[(0, 5)]), sim.Stat(alleleFreq=sim.ALL_AVAIL, step=StatsStep), sim.IfElse( 'X_loci > 0', ifOps=[ sim.PyExec( 'XFreqChange[gen] = [alleleFreq[x][1] for x in range(X_loci)]' ) ], elseOps=[sim.PyExec('XFreqChange[gen] = []')], step=StatsStep), sim.IfElse( 'A_loci > 0', ifOps=[ sim.PyExec( 'AFreqChange[gen] = [alleleFreq[a][1] for a in range(X_loci, pop.totNumLoci())]', exposePop='pop') ], elseOps=[sim.PyExec('AFreqChange[gen] = []')], step=StatsStep), sim.IfElse( PrintFreqs, ifOps=[ sim.PyEval( r"str(rep) + '\t' + str(gen) + '\t' + '\t'.join(map('{0:.4f}'.format, XFreqChange[gen])) + '\t\t' + '\t'.join(map('{0:.4f}'.format, AFreqChange[gen])) + '\n'" ) ], step=StatsStep), sim.TerminateIf( 'sum([alleleFreq[x][0] * alleleFreq[x][1] for x in range(X_loci + A_loci)]) == 0' ) ], gen=generations) i = 0 for pop in simu.populations(): pop.save('{}_{}.pop'.format(OutPopPrefix, i)) i += 1