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 服务。