Neighbor Joining是一種bottom-up的聚類方法,常被用于系統(tǒng)發(fā)育樹(phylogenetic tree)的構(gòu)建當(dāng)中。 Naruya Saitou 和 Masatoshi Nei在1987年將NJ法發(fā)表在Molecular Biology and Evolution中,至今已有超5萬的引入量,實在是生物信息學(xué)中超重量級的文章。
P.S. 由于小弟對圖論一知半解,所以后面寫的時候可能各種術(shù)語穿插使用,望見諒。
術(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包ape
的nj()
函數(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)
使用參數(shù)type
可以控制輸出有根樹或無根樹
plot(tr, type = "unrooted", rotate.tree = 90)
節(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)
一點補充:
對同源基因/蛋白進行建樹時,物種間的進化距離矩陣一般通過核酸/蛋白質(zhì)序列的多序列比對(Multiple Sequence Algnment, MSA)結(jié)果而來。但如何從MSA的序列比對得分矩陣得到進化距離矩陣暫時還不清楚,以后有待補充。
ref: en.wikipedia.org/wiki/Neighbor_joining
完。