邻接法构建系统发育树中枝长的计算(Least-Square Estimation)

Least-Square Estimation

刚刚用BioNJ跑完了一波数据,老板和我说这个算法其实挺简单的,你可以自己写一个(主要是BIONJ软件本身和Philip以及MEGA对输入文件要求都比较严,不方便处理),所以我初步学习了一下最原始的NJ树的构建方法

算法源于 The Neighbor-joining Method: A New Method for Reconstructing Phylogenetic Trees

假设我们有一棵无根树具有\(n\)个叶节点,\(n-1\)个内部节点,\(2n-3\)条边(edge,边的数量简记为\(N_E\)),以及由两两叶节点构成的\(\frac{n(n-1)}{2}\)条路径(path,路径的数量简记为\(N_P\))

对于边我们可以构建一个向量\(v_E\)(vector of edge)表示每一条边的长度

对于路径我们可以构建一个向量\(v_P\)(vector of path)表示每一条路径的长度,叶节点距离矩阵\(\{D_{ij}\}\)展开后的形式

于是我们可以构建一个矩阵(A),它的列数等于\(N_E\),它的行数等于\(N_P\),每一个元素等于1或者0,它表示一条边是否存在于某一个路径当中,或者说一条路径是由哪几个边组成的

\[ \left[\begin{array}{l} 1&1&0&0&0&0\\ 1&0&1&0&0&1\\ 1&0&0&1&0&1\\ 1&0&0&0&1&1\\ 0&1&1&0&0&1\\ 0&1&0&1&0&1\\ 0&1&0&0&1&1\\ 0&0&1&1&0&0\\ 0&0&1&0&1&0\\ 0&0&0&1&1&0\\ \end{array}\right] \]

于是我们可以得到一个关于边长与路径长的线性方程组

\[A\cdot v_{E}=v_{P} \]

\[A^{T}Av_{E}=A^{T}v_{P} \]

我们记

\[B = A^TA \]

B是一个对称矩阵,它表示的是两条边同时出现的路径数量

于是我们能够得到

\[ v_{E} = B^{-1}A^{T}v_{P} \]

这就是我们计算树中各个边长的方法,最理想的方法

但是我们不可能遍历树空间,来找到一个边长之和最小的树结构,所以NJ法中采取的方法是迭代寻找一个局部最优

假设我们有一个初始的star-structure的树,我们需要从中将两个OTU(operational taxonomic unit)提取出,并连接到另一个内部节点上,并计算这样的一棵树的边长之和,遍历所有选择方式,共\(C_n^2\)种,选择边长之和最小的那一种树。

那么之前提到的矩阵B可以写成如下形式(其中N是边[edge]的数量)

\[v_E = [L_{1X},L_{2X},L_{3Y},L_{4Y},...,L_{NY},L_{XY}]\\ \]

\[v_P = [D_{12},D_{13},D_{14},D_{15},...D_{1N},D_{23},D_{24},...D_{2N},...D_{(N-1)N}] \]

\[ B = \left[ \begin{array}{l} N-1 & 1 & 1 & ... & 1 & N-2\\ 1 & N-1 & 1 & ... & 1 & N-2\\ 1 & 1 & N-1 & ... & 1 & 2\\ ... & ... &... &...&...&...\\ 1 & 1 & 1 & ... & N-1 & 2\\ N-2 & N-2 & 2 & ... & 2 & 2(N-2)\\ \end{array} \right] \]

上述公式为理论推导,能力有限,具体解的过程就跳过了,最后可以得到下面化简的公式便于我们进行计算

这里声明,下述公式中"1"和"2"代表选中进行研究的两个叶节点,X为两个叶节点所连的新的内部节点,Y为其它叶节点所连的内部节点,X和Y之间由一条边相连

\[ L_{1X} = \frac{1}{2}D_{12}+\frac{1}{2(N-2)}(P-Q)\newline \quad\\* \]

\[L_{1X} = \frac{1}{2}D_{12}+\frac{1}{2(N-2)}(Q-P)\\* \quad\\* \]

\[L_{iY} = \frac{1}{N-2}U_i-\frac{1}{(N-2)^2}(P+Q)-\frac{N-4}{(N-2)^2(N-3)}V,\quad(3\le i \le N)\\* \quad\\* \]

\[L_{XY} = \frac{1}{2(N-2)}(P+Q)-\frac{1}{2}D_{12}-\frac{1}{(N-2)(N-3)}V\\* \quad\\* \]

\[P = \sum^{N}_{j=3}{D_{1j}}\\* \quad\\* \]

\[Q = \sum^{N}_{j=3}{D_{2j}}\\* \quad\\* \]

\[U_i = \sum^{N}_{j=1,j\ne i}D_{ij}(i \ge 3)\\* \quad\\* \]

\[V = \sum_{3\le j < k}D_{jk}\\* \quad\\* \]

上述等式可计算自行验证

同时有将两个叶节点支出后的树的边长之和\(S_{12}\)的计算方式:

\[ S_{12} = \frac{1}{2(N-2)}(P+Q) + \frac{1}{2}D_{12}+\frac{1}{N-2}V \]

\[ S_{12} = \frac{1}{2(N-2)}\sum_{j=3}^{N}{D_{1j}+D_{2j}} + \frac{1}{2}D_{12}+\frac{1}{N-2}\sum_{3\le i < j}^{N}{D_{ij}} \]

\[ S_{12} = \frac{1}{2(N-2)}\sum_{j=3}^{N}{(L_{1X}+L_{2X}+2L_{XY}+2L_{Yj})} + \frac{1}{2}(L_{1X}+L_{2X})+\frac{N-3}{N-2}\sum_{j=3}^{N}{L_{Yj}} \]

\[S_{12} = L_{1X}+L_{2X}+L_{XY}+\sum_{j=3}^{N}{L_{Yj}} \]

之前提到我们是要寻找一个局部最优解,所以我们要遍历每一对叶节点,找到\(S_{12}\)最小的那一对叶节点,我们假设其名为\(A\),\(B\),并将其合并成一个新的叶节点\(\{A,B\}\)

新的叶节点与其它叶节比如叶节点\(C\)的距离\(D_{\{A,B\}C}\),为\(A\)\(B\)\(C\)的距离的均值

\[ D_{\{A,B\}C} = \frac{D_{AC}+D{BC}}{2} \]

基于此构建新的距离矩阵 \(\{D_{ij}^{new}\}\)

我们不断重复上述步骤就可以得到一个完整的NJ树

NJ树本身是基于ME的(minimum evolution principle),相比于其它的构建系统发育树的方法,它速度非常快,后续衍生出来的还有BIONJ,FastME等等基于距离的构建系统发育树的方法,但是建树精度上不如ML或者Bayes基于替换模型的方法

posted @ 2023-01-18 00:03  迷茫的小天  阅读(835)  评论(0)    收藏  举报