我对肠杆菌细菌基因组中的4个管家基因感兴趣。
所以我有了管家基因,对NR进行了研究,并下载了比对的序列。
我使用具有最大似然法的MEGA7软件制作了系统树。 Boostrap方法进行了200次迭代。
我将树导出为newick文件。
因此,现在,我的4个管家基因有4棵树。我想创建我的4棵树的共识树。
我个人尝试使用Bio.Phylo(http://biopython.org/DIST/docs/api/Bio.Phylo.Consensus-module.html#strict_consensus)(http://biopython.org/wiki/Phylo)中的共识树。
我选择了major_consensus函数,并且效果很好。但是我有一个问题。
我的“脚本”是这样的:
import os
import sys
from Bio import Phylo
from Bio.Phylo.Consensus import *
fichier=sys.argv[1]
fichier2=sys.argv[2]
fichier3=sys.argv[3]
fichier4=sys.argv[4]
tree1=Phylo.read(fichier, 'newick')
tree2=Phylo.read(fichier2, 'newick')
tree3=Phylo.read(fichier3, 'newick')
tree4=Phylo.read(fichier4, 'newick')
trees=tree1,tree2,tree3,tree4
majority_tree = majority_consensus(trees, 0.5)
Phylo.draw(majority_tree)
问题在于共识树取决于顺序。
例如,当我
try trees = tree1,tree2,tree3,tree4
和trees = tree2,tree4,tree1,tree3
时,我得到了不同的结果有人知道其他软件可以从newick文件中生成共识树吗?
我需要有关
Bio.Phylo
的帮助。如果有人对这个软件包有更多的了解,那就太好了。 最佳答案
由于您没有发布newick文件,因此让我们尝试重现您的问题,以便我们有一个Minimal, Complete, and Verifiable example来显示共识树取决于顺序。
我们从以下三棵树开始:
这些以newick格式表示如下:
newicks = {1: '((A,B,C),(D,(E,F)))',
2: '(((A,B),C),(D,(E,F)))',
3: '((A,B,C),(E,(D,F)))'}
现在,我们尝试对这三个树进行所有可能的排列,创建共识树,看看它们是否都相同:
from io import StringIO
from Bio import Phylo
from Bio.Phylo.Consensus import majority_consensus
from itertools import permutations
def read_newick(treedata):
handle = StringIO(treedata)
return Phylo.read(handle, "newick")
for keys in permutations(newicks.keys()):
trees = [read_newick(newicks[key]) for key in keys]
majority_tree = majority_consensus(trees, 0.5)
print('majority consensus for order: {}'.format(keys))
Phylo.draw_ascii(majority_tree)
结果:
majority consensus for order: (1, 2, 3)
________________________ A
|
________________________|________________________ B
| |
_| |________________________ C
|
| ________________________ D
|________________________|
| ________________________ E
|________________________|
|________________________ F
majority consensus for order: (1, 3, 2)
________________________ A
|
________________________|________________________ B
| |
_| |________________________ C
|
| ________________________ D
|________________________|
| ________________________ E
|________________________|
|________________________ F
majority consensus for order: (2, 1, 3)
________________________ A
|
________________________|________________________ B
| |
_| |________________________ C
|
| ________________________ D
|________________________|
| ________________________ E
|________________________|
|________________________ F
majority consensus for order: (2, 3, 1)
________________________ A
|
________________________|________________________ B
| |
_| |________________________ C
|
| ________________________ D
|________________________|
| ________________________ E
|________________________|
|________________________ F
majority consensus for order: (3, 1, 2)
________________________ A
|
________________________|________________________ B
| |
_| |________________________ C
|
| ________________________ E
|________________________|
| ________________________ D
|________________________|
|________________________ F
majority consensus for order: (3, 2, 1)
________________________ A
|
________________________|________________________ B
| |
_| |________________________ C
|
| ________________________ E
|________________________|
| ________________________ D
|________________________|
|________________________ F
所以的确,后两个共识树与前四个共识树不同。
要了解为什么会发生这种情况,我们查看majority_consensus()的源代码。在那里,我们看到第一步是创建根系。终端进化枝的顺序由提供的第一棵树确定。
因此,对于
(tree1, tree2, tree3)
,提供的第一个树是tree1
,根分支是ABCDEF
。但是对于(tree3, tree2, tree1)
,提供的第一棵树是tree3
,根分支变成ABC
ED
F
。因此,这是算法本身的局限性,多数共识的任何实现都将根据您提供的第一个树为您提供不同的顺序。
关于python - 使用Bio.phylo从几棵树中建立共识树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43187246/