skbio.tree.nj

skbio.tree.nj(dm, disallow_negative_branch_length=True, result_constructor=None)[源代码]

应用邻域连接进行系统发育重建。

状态:从0.4.0开始实验。

参数
  • dm (skbio.DistanceMatrix) -- 输入包含OTU之间距离的距离矩阵。

  • disallow_negative_branch_length (bool, optional) -- 邻居连接可能导致负分支长度,这在进化上下文中没有意义。如果 True ,负分支长度将返回为零,这是该算法的原始开发人员提出的处理此问题的通用策略。

  • result_constructor (function, optional) -- 函数来构造结果对象。这必须以newick格式的字符串作为输入。将此函数应用于newick格式字符串的结果将从此函数返回。默认为 lambda x: TreeNode.read(StringIO(x), format='newick') .

返回

默认情况下,结果对象是 TreeNode ,但这可以通过传递来覆盖 result_constructor .

返回类型

TreeNode

提示

邻里加入最初是在Saitou和Nei(1987)中描述的 1. 这里展示的例子来自Wikipedia关于邻居加入的页面 2. Phylip手册也描述了该方法 3 而Phylip本身提供了一个对比较有用的实现。

根据定义,邻接连接创建无根树。对生成的树进行生根的一种策略是中点生根,它可以作为 TreeNode.root_at_midpoint .

引用

1

Saitou N,和Nei M.(1987)“邻域连接法:重建系统发生树的新方法”,分子生物学与进化。PMID:3447015。

2

http://en.wikipedia.org/wiki/Neighbour_joining

3

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

实际案例

定义一个新的距离矩阵对象,描述五个OTU之间的距离:a、b、c、d和e。

>>> from skbio import DistanceMatrix
>>> from skbio.tree import nj
>>> data = [[0,  5,  9,  9,  8],
...         [5,  0, 10, 10,  9],
...         [9, 10,  0,  8,  7],
...         [9, 10,  8,  0,  3],
...         [8,  9,  7,  3,  0]]
>>> ids = list('abcde')
>>> dm = DistanceMatrix(data, ids)

构造表示这些otu之间关系的邻居连接树。这将作为TreeNode对象返回。

>>> tree = nj(dm)
>>> print(tree.ascii_art())
          /-d
         |
         |          /-c
         |---------|
---------|         |          /-b
         |          \--------|
         |                    \-a
         |
          \-e

同样,构造邻居连接树,但返回表示树的newick字符串,而不是TreeNode对象。(请注意,在本例中,字符串输出在打印时被截断,以便于呈现。)

>>> newick_str = nj(dm, result_constructor=str)
>>> print(newick_str[:55], "...")
(d:2.000000, (c:4.000000, (b:3.000000, a:2.000000):3.00 ...