Поскольку вы не опубликовали свои файлы newick, давайте попробуем воспроизвести вашу проблему, чтобы у нас был минимальный, полный и проверяемый пример. это показывает, что дерево консенсуса зависит от порядка.
Начнем со следующих трех деревьев:
В формате 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
.
Итак, это ограничение самого алгоритма, и любая реализация консенсуса большинства даст вам другой порядок, зависящий от первого предоставленного дерева.
person
BioGeek
schedule
04.04.2017