1.原理的區別
主要區別在於,非加權組平均法(UPGMA)是基於平均鏈接方法的聚集層次聚類方法,而鄰接法(NJ)是基於最小演化准則的迭代聚類法。
UPGMA的假定條件是:在進化過程中,每一世系發生趨異的次數相同,即核苷酸或氨基酸的替換速率是均等且恆定的。
UPGMA生成有根樹,而NJ生成無根樹。由於UPGMA方法假定演化速率相等,因此分支末端相等,NJ方法允許不相等的演化速率,因此分支長度與變化量成正比。
UPGMA示意圖:
NJ示意圖:
UPGMA是一種簡單,快速但不可靠的方法,而NJ方法是一種相對較快的方法,與UPGMA方法相比,效果更好。 當然也要看具體目的。
二者區別總結:
2.實操比較
我用Plink處理得到樣本的親緣關系矩陣(IBD)文件,示例如下:
library(ape) #用於NJ法
df <- read.delim("prefix.ibdM0", sep = "\t",header=TRUE, row.names=1)
df[1:5,1:5]
df <- data.matrix(df)
str(df)
UPGMA
如果直接用親緣關系矩陣,hclust函數(stats包)識別不了。
#hclust對象需要轉化為距離
tr3 <- as.phylo(stats::hclust(df,method="average")) #UPGMA
str(tr3)
plot(tr3, cex=1)
使用dist計算距離:
tr4 <- as.phylo(hclust(dist(df),method="average"))
str(tr4)
plot(tr4, cex=1)
NJ法
而在NJ法中,有沒有dist都可以。但有沒有轉化距離二者還是有一些差別的,建議還是轉化后使用。
tr1 <- bionj(df) #或nj(df)
str(tr1)
plot(tr1, cex=1)
tr2 <- bionj(dist(df))
str(tr2)
plot(tr2, cex=1)
沒用dist:
用dist:
保存樹文件
樹文件在R中是一個列表,包括節點和邊等信息:
保存樹文件:
write.tree(tr1,"test.nwk")
NJ和UPGMA生成的樹都可這樣保存,保存后就可導入其他軟件美化了。
更深理解
如果想要更進一步的了解,建議看看這個教程:
Module 24: An Intro to Phylogenetic Tree Construction in R
包含了極大似然法ML等。
Ref: https://pediaa.com/difference-between-upgma-and-neighbor-joining-tree/