skbio.tree.majority_rule

skbio.tree.majority_rule(trees, weights=None, cutoff=0.5, support_attr='support', tree_node_class=<class 'skbio.tree._tree.TreeNode'>)[源代码]

从根目录树的列表中确定一致树

状态:从0.4.0开始实验。

参数
  • trees (list of TreeNode) -- 要手术的树

  • weights (list or np.array of {int, float}, optional) -- 如果提供,则列表必须按索引顺序排列 trees . 每棵树将获得相应的权重。如果省略,所有树的权重将相等。

  • cutoff (float, 0.0 <= cutoff <= 1.0, optional) -- 任何具有<=截止支持的clade将被丢弃。如果截止值小于0.5,则有可能出现平局。如果是这样,则根据列表排序顺序随意断开连接。

  • support_attr (str, optional) -- 要装饰到包含一致支持的结果树上的属性。

  • tree_node_class (type, optional) -- 指定返回的一致性树的类型。或者 TreeNode (默认值)或实现相同接口的类型(最有用的是 TreeNode

返回

每棵树都是 tree_node_class . 在输入端表示的两个或多个不相交的提示集的情况下,可以返回多个树。

返回类型

list of tree_node_class instances

提示

此代码改编自PyCogent最初由Matthew Wakefield编写的多数一致性代码。该方法基于中一致树的原始描述 1. Phylip手册中提供了其他说明 2. 此方法不支持扩展的多数规则。

支持度计算为树权重的加权平均值,在树权重中观察到枝梗。例如,如果在5棵树中观察到{A,B,C},且权重均为1,则其支持度将为5。

引用

1

Margush T,McMorris FR.(1981年)“共识n-树”,《数学生物学公报》43(2)239-44。

2

http://evolution.genetics.washington.edu/phylip/doc/consense.html

实际案例

使用Phylip手册中的示例计算多数一致性,但我们正在计算多数规则而不是扩展的多数规则。

>>> from skbio.tree import TreeNode
>>> from io import StringIO
>>> trees = [
... TreeNode.read(StringIO("(A,(B,(H,(D,(J,(((G,E),(F,I)),C))))));")),
... TreeNode.read(StringIO("(A,(B,(D,((J,H),(((G,E),(F,I)),C)))));")),
... TreeNode.read(StringIO("(A,(B,(D,(H,(J,(((G,E),(F,I)),C))))));")),
... TreeNode.read(StringIO("(A,(B,(E,(G,((F,I),((J,(H,D)),C))))));")),
... TreeNode.read(StringIO("(A,(B,(E,(G,((F,I),(((J,H),D),C))))));")),
... TreeNode.read(StringIO("(A,(B,(E,((F,I),(G,((J,(H,D)),C))))));")),
... TreeNode.read(StringIO("(A,(B,(E,((F,I),(G,(((J,H),D),C))))));")),
... TreeNode.read(StringIO("(A,(B,(E,((G,(F,I)),((J,(H,D)),C)))));")),
... TreeNode.read(StringIO("(A,(B,(E,((G,(F,I)),(((J,H),D),C)))));"))]
>>> consensus = majority_rule(trees, cutoff=0.5)[0]
>>> for node in sorted(consensus.non_tips(),
...                    key=lambda k: k.count(tips=True)):
...     support_value = node.support
...     names = ' '.join(sorted(n.name for n in node.tips()))
...     print("Tips: %s, support: %s" % (names, support_value))
Tips: F I, support: 9.0
Tips: D H J, support: 6.0
Tips: C D H J, support: 6.0
Tips: C D F G H I J, support: 6.0
Tips: C D E F G H I J, support: 9.0
Tips: B C D E F G H I J, support: 9.0

在下一个示例中,将返回多个树,如果在树之间没有很好地支持类,则可能会发生这种情况。此外,如果不是所有树都有提示,则可能会出现这种情况。

>>> trees = [
...     TreeNode.read(StringIO("((a,b),(c,d),(e,f));")),
...     TreeNode.read(StringIO("(a,(c,d),b,(e,f));")),
...     TreeNode.read(StringIO("((c,d),(e,f),b);")),
...     TreeNode.read(StringIO("(a,(c,d),(e,f));"))]
>>> consensus_trees = majority_rule(trees)
>>> len(consensus_trees)
4