算法 | Neighbor Joining法建树浅析

Neighbor Joining是一种bottom-up的聚类方法,常被用于系统发育树(phylogenetic tree)的构建当中。 Naruya SaitouMasatoshi Nei在1987年将NJ法发表在Molecular Biology and Evolution中,至今已有超5万的引入量,实在是生物信息学中超重量级的文章。

P.S. 由于小弟对图论一知半解,所以后面写的时候可能各种术语穿插使用,望见谅。

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

术语阐明

taxa = node = 节点
edge = 边

算法原理

NJ法要求输入的数据必须是待聚类数据(taxa)之间的距离信息,例如对多个物种进行NJ法建树的话,输入的就是物种之间的进化距离。

NJ法是一种bottom-up的聚类,故首先要计算出进化距离最近的两个物种,将其聚为一类,再计算出距离该新类最近的一个物种再次聚为一个类,如此迭代,遍历所有输入的物种,构建系统发育树。

下面以对多个物种进行NJ法建树来简述其原理:

Q-criterion

对于n > 3的物种集合X而言,基于现有的距离矩阵 d(x, y)可以计算得到Q矩阵

可将Q(x,y)视为计算一种矫正后的d(x,y)

选定x,y使得上述Q值最小,即为当前最靠近的两个taxa,而该法即为Q-criterion

构建新节点

找出了距离最近的(x,y)后,构建一个新的节点 Vx,y 取缔原有的两个节点(x,y),接下来可计算x,y点到新节点的距离


以及Vx,y 到其余各点的距离

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

重新进行Q-criterion

上述两步结束后,就对集合X中最近的两点聚类完毕,继续迭代即可对集合中所有的点进行聚类,并构建发育树。

R应用的例子

这里用4个物种同源基因的进化距离矩阵进行NJ法建树,当然更一般来说我们会利用多重序列比对(Multiple Sequence Alignment,MSA),再根据MSA的结果得到进化距离矩阵构建系统发育树

现有4个物种的同源基因ABCD,它们的进化距离矩阵如下:

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

现将距离矩阵导入R中,使用R包apenj()函数建树

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

使用参数type可以控制输出有根树或无根树

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

节点的距离,边的长度等信息,亦包含在nj()输出的结果中

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 标在树上

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

一点补充:
对同源基因/蛋白进行建树时,物种间的进化距离矩阵一般通过核酸/蛋白质序列的多序列比对(Multiple Sequence Algnment, MSA)结果而来。但如何从MSA的序列比对得分矩阵得到进化距离矩阵暂时还不清楚,以后有待补充。

ref: en.wikipedia.org/wiki/Neighbor_joining

完。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 今天,我们将更深入地学习和实现8个顶级Python机器学习算法。 让我们开始Python编程中的机器学习算法之旅。...
    栀子花_ef39阅读 8,280评论 0 62
  • TF API数学计算tf...... :math(1)刚开始先给一个运行实例。tf是基于图(Graph)的计算系统...
    MachineLP阅读 3,432评论 0 1
  • 树形动态规划,顾名思义就是树+DP,先分别回顾一下基本内容吧:动态规划:问题可以分解成若干相互联系的阶段,在每一个...
    Mr_chong阅读 1,462评论 0 2
  • 以西瓜书为主线,以其他书籍作为参考进行补充,例如《统计学习方法》,《PRML》等 第一章 绪论 1.2 基本术语 ...
    danielAck阅读 4,484评论 0 6
  • sì 支zhī茶chá 对duì 酒jiǔ,赋fù 对duì 诗shī,燕yàn子zi 对duì 莺yīng 儿é...
    每个人的孟母堂阅读 1,192评论 0 6