算法 | Neighbor Joining法建樹淺析

Neighbor Joining是一種bottom-up的聚類方法,常被用于系統(tǒng)發(fā)育樹(phylogenetic tree)的構(gòu)建當(dāng)中。 Naruya SaitouMasatoshi Nei在1987年將NJ法發(fā)表在Molecular Biology and Evolution中,至今已有超5萬的引入量,實在是生物信息學(xué)中超重量級的文章。

P.S. 由于小弟對圖論一知半解,所以后面寫的時候可能各種術(shù)語穿插使用,望見諒。

The neighbor-joining method: a new method for reconstructing phylogenetic trees

術(shù)語闡明

taxa = node = 節(jié)點
edge = 邊

算法原理

NJ法要求輸入的數(shù)據(jù)必須是待聚類數(shù)據(jù)(taxa)之間的距離信息,例如對多個物種進行NJ法建樹的話,輸入的就是物種之間的進化距離。

NJ法是一種bottom-up的聚類,故首先要計算出進化距離最近的兩個物種,將其聚為一類,再計算出距離該新類最近的一個物種再次聚為一個類,如此迭代,遍歷所有輸入的物種,構(gòu)建系統(tǒng)發(fā)育樹。

下面以對多個物種進行NJ法建樹來簡述其原理:

Q-criterion

對于n > 3的物種集合X而言,基于現(xiàn)有的距離矩陣 d(x, y)可以計算得到Q矩陣

可將Q(x,y)視為計算一種矯正后的d(x,y)

選定x,y使得上述Q值最小,即為當(dāng)前最靠近的兩個taxa,而該法即為Q-criterion

構(gòu)建新節(jié)點

找出了距離最近的(x,y)后,構(gòu)建一個新的節(jié)點 Vx,y 取締原有的兩個節(jié)點(x,y),接下來可計算x,y點到新節(jié)點的距離


以及Vx,y 到其余各點的距離

z: 在集合X中除x,y之外的各點

重新進行Q-criterion

上述兩步結(jié)束后,就對集合X中最近的兩點聚類完畢,繼續(xù)迭代即可對集合中所有的點進行聚類,并構(gòu)建發(fā)育樹。

R應(yīng)用的例子

這里用4個物種同源基因的進化距離矩陣進行NJ法建樹,當(dāng)然更一般來說我們會利用多重序列比對(Multiple Sequence Alignment,MSA),再根據(jù)MSA的結(jié)果得到進化距離矩陣構(gòu)建系統(tǒng)發(fā)育樹

現(xiàn)有4個物種的同源基因ABCD,它們的進化距離矩陣如下:

A B C D
A 0
B 5 0
C 12 11 0
D 10 9 8 0

現(xiàn)將距離矩陣導(dǎo)入R中,使用R包apenj()函數(shù)建樹

library(ape)

A <- c(0,5,12,10)
B <- c(5,0,11,9)
C <- c(12,11,0,8)
D <- c(10,9,8,0)
em <- as.matrix(cbind(A,B,C,D))
row.names(em) <- c('A','B','C','D')
tr <- nj(em)
plot(tr)
Rooted tree

使用參數(shù)type可以控制輸出有根樹或無根樹

plot(tr, type = "unrooted", rotate.tree = 90)
Unrooted tree

節(jié)點的距離,邊的長度等信息,亦包含在nj()輸出的結(jié)果中

str(tr)
## List of 4
## $ edge       : int [1:5, 1:2] 5 5 5 6 6 4 3 6 1 2
## $ edge.length: num [1:5] 3 5 4 3 2
## $ tip.label  : chr [1:4] "A" "B" "C" "D"
## $ Nnode      : int 2
## - attr(*, "class")= chr "phylo"
## - attr(*, "order")= chr "cladewise"

利用R包ggtree可以將edge length 標(biāo)在樹上

library(ggtree)
ggtree(tr, layout = 'unrooted') + 
  geom_treescale() +
  geom_tiplab() + 
  geom_text(aes(label=branch.length, x=branch), vjust=-.5)
ggtree output

一點補充:
對同源基因/蛋白進行建樹時,物種間的進化距離矩陣一般通過核酸/蛋白質(zhì)序列的多序列比對(Multiple Sequence Algnment, MSA)結(jié)果而來。但如何從MSA的序列比對得分矩陣得到進化距離矩陣暫時還不清楚,以后有待補充。

ref: en.wikipedia.org/wiki/Neighbor_joining

完。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 今天,我們將更深入地學(xué)習(xí)和實現(xiàn)8個頂級Python機器學(xué)習(xí)算法。 讓我們開始Python編程中的機器學(xué)習(xí)算法之旅。...
    梔子花_ef39閱讀 8,452評論 0 62
  • TF API數(shù)學(xué)計算tf...... :math(1)剛開始先給一個運行實例。tf是基于圖(Graph)的計算系統(tǒng)...
    MachineLP閱讀 3,522評論 0 1
  • 樹形動態(tài)規(guī)劃,顧名思義就是樹+DP,先分別回顧一下基本內(nèi)容吧:動態(tài)規(guī)劃:問題可以分解成若干相互聯(lián)系的階段,在每一個...
    Mr_chong閱讀 1,505評論 0 2
  • 以西瓜書為主線,以其他書籍作為參考進行補充,例如《統(tǒng)計學(xué)習(xí)方法》,《PRML》等 第一章 緒論 1.2 基本術(shù)語 ...
    danielAck閱讀 4,579評論 0 6
  • sì 支zhī茶chá 對duì 酒jiǔ,賦fù 對duì 詩shī,燕yàn子zi 對duì 鶯yīng 兒é...
    每個人的孟母堂閱讀 1,253評論 0 6