Как получить наименьшее поддерево, содержащее набор узлов из BioPhylo?

Я тестирую различные филогенетические библиотеки в Python. Я хочу прочитать дерево Ньюика, а затем, учитывая список таксонов, создать наименьшее дерево, содержащее их все. Эта задача довольно проста и эффективна в dendropy и ete2:

newick = '((raccoon, bear),((sea_lion,seal),((monkey,cat), weasel)),dog);'
taxa = ['raccoon', 'sea_lion']

import ete2
tree = ete2.Tree(newick)
pruned = tree.prune(taxa)

import dendropy
tree = dendropy.Tree.get_from_string(newick, 'newick')
pruned = tree.prune_taxa_with_labels(taxa)

Я пытаюсь, но не могу найти эквивалентную функциональность в пакете Bio.Phylo. У деревьев есть метод «обрезки», но он удаляет один узел из дерева.

Ответы (2)

Функция common_ancestorдолжна дать вам желаемый результат: она дает вам дерево (я думаю), которое является самым последним общим предком всех заданных целей.

Извините, что выкопал этот старый вопрос. Но я думаю, что, учитывая, что у вас есть некорневое дерево, общий предок может быть неправильным ответом.

Что вам нужно сделать, так это: предположим, что у вас есть неукорененное дерево с n кончиками (видами) и, следовательно, 2n-3 ветвями. Вы должны разрезать дерево пополам во всех этих возможных ветвях. Сделав это, вы получите 4n-6 поддеревьев. Наименьшее поддерево, содержащее все выбранные вами виды, будет вашим ответом.

Это отличается от общего предка, потому что для неукорененного дерева это может быть сделано таким образом, что те виды, которые вы не выбрали, группируются в первую очередь, все выбранные вами виды становятся внешней группой. Но если вы «переукорените» дерево должным образом, вы все равно сможете объединить выбранные вами виды в небольшую эксклюзивную кладу.

Вы правы, что это было бы неправильно для деревьев без корней, так что спасибо за ответ. Я не упомянул в вопросе, что деревья, с которыми я работал, на самом деле были укоренены (поэтому пример дерева, возможно, немного вводил в заблуждение).