Bio.PopGen:群体遗传学
Bio.PopGen
是 Biopython 模块,支持群体遗传学,从 Biopython 1.44 开始可用。该模块的目标是支持广泛使用的数据格式、应用程序和数据库。
GenePop
GenePop (http://genepop.curtin.edu.au/) 是一个流行的群体遗传学软件包,支持 Hardy-Weinberg 检验、连锁不平衡、群体分化、基本统计、\(F_{st}\) 和迁移估计等。GenePop 不提供基于序列的统计数据,因为它不处理序列数据。GenePop 文件格式受到许多其他群体遗传学软件应用程序的支持,因此在群体遗传学领域成为一种相关的格式。
Bio.PopGen
提供 GenePop 文件格式的解析器和生成器。还提供了用于操作记录内容的实用程序。以下是如何读取 GenePop 文件的示例(您可以在 Biopython 的 Test/PopGen 目录中找到 GenePop 示例数据文件)
from Bio.PopGen import GenePop
with open("example.gen") as handle:
rec = GenePop.read(handle)
这将读取名为 example.gen 的文件并进行解析。如果您打印 rec,记录将再次以 GenePop 格式输出。
rec 中最重要的信息将是基因座名称和群体信息(但还有更多信息 - 使用 help(GenePop.Record) 检查 API 文档)。基因座名称可以在 rec.loci_list 中找到。群体信息可以在 rec.populations 中找到。populations 是一个列表,每个元素代表一个群体。每个元素本身都是一个个体列表,每个个体都是一个由个体名称和等位基因列表(每个标记 2 个)组成的对,以下是一个 rec.populations 的示例
[
[
("Ind1", [(1, 2), (3, 3), (200, 201)]),
("Ind2", [(2, None), (3, 3), (None, None)]),
],
[
("Other1", [(1, 1), (4, 3), (200, 200)]),
],
]
所以我们有两个群体,第一个群体有两个个体,第二个群体只有一个。第一个群体的第一个个体名为 Ind1,每个基因座的等位基因信息随之而来。请注意,对于任何基因座,信息可能缺失(例如上面的 Ind2)。
提供了一些用于操作 GenePop 记录的实用程序函数,以下是一个示例
from Bio.PopGen import GenePop
# Imagine that you have loaded rec, as per the code snippet above...
rec.remove_population(pos)
# Removes a population from a record, pos is the population position in
# rec.populations, remember that it starts on position 0.
# rec is altered.
rec.remove_locus_by_position(pos)
# Removes a locus by its position, pos is the locus position in
# rec.loci_list, remember that it starts on position 0.
# rec is altered.
rec.remove_locus_by_name(name)
# Removes a locus by its name, name is the locus name as in
# rec.loci_list. If the name doesn't exist the function fails
# silently.
# rec is altered.
rec_loci = rec.split_in_loci()
# Splits a record in loci, that is, for each loci, it creates a new
# record, with a single loci and all populations.
# The result is returned in a dictionary, being each key the locus name.
# The value is the GenePop record.
# rec is not altered.
rec_pops = rec.split_in_pops(pop_names)
# Splits a record in populations, that is, for each population, it creates
# a new record, with a single population and all loci.
# The result is returned in a dictionary, being each key
# the population name. As population names are not available in GenePop,
# they are passed in array (pop_names).
# The value of each dictionary entry is the GenePop record.
# rec is not altered.
GenePop 不支持群体名称,这是一个有时很麻烦的限制。目前正在计划为 Biopython 提供支持群体名称的功能。这些扩展不会以任何方式破坏与标准格式的兼容性。从中期来看,我们还想支持 GenePop Web 服务。