Quantitative trait¶
Quantitative traits are naturally stored in information fields of each individual. A quantitative trait operator assigns quantitative trait fields according to individual genetic (genotype) and environmental (other information fields) information. Although a large number of quantitative trait models have been used in theoretical and empirical studies, no model is popular enough to deserve a specialized operator. Therefore, only one hybrid operator is currently provided in simuPOP.
A hybrid quantitative trait operator (operator PyQuanTrait
)¶
Operator PyQuanTrait
accepts a user defined function that returns
quantitative trait values for specified information fields. This operator can
comunicate with functions in one of the forms of func(geno)
, func(geno,
field_name, ...)
or func(geno, field_name, gen)
where field_name
should be name of existing fields. simuPOP will pass genotype and value of
specified fields according to name of the passed function. Note that geno are
arrange locus by locus, namely in the order of A1
,``A2``,``B1``,``B2`` for
loci A
and B
.
A quantitative trait operator can be applied before or after mating and assign
values to the trait fields of all parents or offspring, respectively. It can
also be applied during mating to assign trait values to offspring. Example
PyQuanTrait demonstrates the use of this operator, using
two trait fields trait1
and trait2
which are determined by individual
genotype and age. This example also demonstrates how to calculate statistics
within virtual subpopulations (defined by age).
Example: A hybrid quantitative trait model
>>> import simuPOP as sim
>>> import random
>>> pop = sim.Population(size=5000, loci=2, infoFields=['qtrait1', 'qtrait2', 'age'])
>>> 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
... )
Mean of trait1: 92.876 (age < 40), 183.515 (age >=40)
Mean of trait1: 94.041 (age < 40), 183.374 (age >=40)
Mean of trait1: 95.447 (age < 40), 183.288 (age >=40)
Mean of trait1: 95.017 (age < 40), 183.919 (age >=40)
Mean of trait1: 94.769 (age < 40), 185.430 (age >=40)
5
>>>
now exiting runScriptInteractively...