Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
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"
Ejemplo n.º 3
0
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")
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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"
Ejemplo n.º 6
0
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"
Ejemplo n.º 7
0
        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
Ejemplo n.º 9
0
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"
Ejemplo n.º 10
0
    # 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()
Ejemplo n.º 11
0
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"
Ejemplo n.º 12
0
      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)
Ejemplo n.º 13
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