R

phylogram:R 演化樹整合套件使用教學與範例

介紹 phylogram 這個 R 語言的演化樹資料格式整合套件的使用方式以及實務範例。

系統發生樹(phylogenetic tree)又稱為演化樹或進化樹(evolutionary tree),是演化生物學家常需要繪製的圖形,而 R 中有許多的套件都可以用來畫這類的圖,例如 apephangornphytools,但是這些工具所使用的資料格式並沒有整合在一起。

比較常見的資料格式有 phylodendrogram 這兩種。phylo 是以矩陣方式來儲存資料的格式,效率較高、功能較陽春,採用這種格式的套件有 apephangornPhytools 等;dendrogram 則是以巢狀列表(nested list)的方式儲存資料,雖然效率較低,但是功能較豐富、直覺好操作,同時亦可使用一般列表的操作函數來處理,所以有很多工具(例如 dendextend)都使用這種格式。

phylogram 是一個整合 phylodendrogram 兩種格式的工具套件,可以用來處理演化樹的格式轉換、資料管理、匯入與匯出等動作,同時也支援 Newick 格式,以下是 phylogram 套件的使用教學。

安裝 phylogram

phylogram 套件可以從 CRAN 官方套件庫下載與安裝:

# 安裝 phylogram 套件
install.packages("phylogram")

若想要安裝最新的開發中版本,則可先安裝 devtoolskmerdendextend 這幾個必要的套件之後,再從 GitHub 上面下載並安裝 phylogram

# 從 GitHub 下載並安裝 phylogram 套件
devtools::install_github("ropensci/phylogram", build_vignettes = TRUE)

載入 phylogram 套件:

# 載入 phylogram 套件
library(phylogram)

匯入與匯出 Newick 樹狀圖

Newick 是許多樹狀圖編輯軟體都支援的一種樹狀圖格式,而 phylogram 套件所提供的 read.dendrogram 函數就可以用來匯入 Newick 格式的樹狀圖:

# 匯入 Newick 格式樹狀圖
my.tree.1 <- read.dendrogram(text = "(A,(B,C));")

dendrogram 的樹狀圖可以直接使用 plot 將它畫出來:

# 繪製樹狀圖
plot(my.tree.1, yaxt = "n")

繪製出來的圖形會像這樣:

樹狀圖

若想要將 dendrogram 格式的樹狀圖匯出成為 Newick 格式的文字,可以使用 phylogram 套件所提供的 write.dendrogram 函數,以下是一個簡單的範例。

# 將樹狀圖匯出為 Newick 格式
write.dendrogram(my.tree.1, edges = FALSE)
[1] "(A,(B,C));"

檔案的匯入與匯出

若要直接從 Newick 格式的檔案中讀取樹狀圖,作法也都大同小異,只要使用 file 參數指定來源檔案名稱即可:

# 從檔案匯入 Newick 格式樹狀圖
my.tree.2 <- read.dendrogram(file = "my_tree.dnd")

若要將樹狀圖匯出至檔案,則在呼叫 write.dendrogram 時以 file 參數指定輸出的檔案名稱:

# 將樹狀圖匯出為 Newick 格式的檔案
write.dendrogram(my.tree.2, file = "output.dnd", edges = FALSE)

轉換樹狀圖格式

phylogram 套件所提供的 as.phylo.dendrogramas.dendrogram.phylo 函數可以用來處理 phylodendrogram 格式之間的轉換,但是除了 phylogram 套件之外,其他的套件也有可能會提供相同名稱的函數,若要確保能夠呼叫到 phylogram 套件所提供的轉換函數,在使用時可以加上命名空間的標示:

# 從 dendrogram 轉換為 phylo
my.phylo.1 <- phylogram::as.phylo.dendrogram(my.tree.1)

# 從 phylo 轉換為 dendrogram
my.dend.1 <- phylogram::as.dendrogram.phylo(my.phylo.1)

編輯樹狀圖

phylogram 套件提供了一些可以用來編輯 dendrogram 的函數,prune 可以用來移除符合條件的節點,ladder 函數則可以用來調整節點的順序,方便畫圖。

若以 R 基本的巢狀列表(nested list)建立演化樹的時候,可以使用 remidpoint 函數自動修正各個節點的 midpointmembersleaf 等屬性,而節點的高度則可使用 repositionas.cladogram 來設定。

# 建立基本的巢狀列表
my.tree.3 <- list(1, list(2, 3))

# 設定各個節點的 midpoint、members、leaf 等屬性
my.tree.3 <- remidpoint(my.tree.3)

# 設定各個節點的高度屬性
my.tree.3 <- as.cladogram(my.tree.3)

在進行 dendrogram 的各種編輯動作時,可以運用 dendrapplylapply 函數,將自訂的處理函數一次套用至所有的節點上。

# 建立自訂處理函數
set_label <- function(node) {
  if (is.leaf(node)) attr(node, "label") <- LETTERS[node]
  return (node)
}

# 遞迴處理每個節點
my.tree.3 <- dendrapply(my.tree.3, set_label)

# 繪製樹狀圖
plot(my.tree.3, horiz = TRUE)
樹狀圖

應用實例

若要產生兩棵演化樹的比較圖,可以使用 dendextend 套件的 tanglegram 繪圖函數來處理,但這個繪圖函數只接受 dendrogram 格式,若遇到 phylo 的時候就要使用 phylogram 套件來轉換。

以下示範使用 k-mer 與 Kimura 1980 兩種不同距離計算方式,產生兩棵演化樹,比較它們的差異。

首先安裝 dendextend 這個繪圖用的套件,以及 kmer 這個計算 k-mer 距離的套件:

# 安裝 dendextend 與 kmer 套件
install.packages(c("dendextend", "kmer"))

其實這裡還需要一個 ape 演化樹分析套件,不過這個套件在安裝 phylogram 套件的時候,就已經自動安裝好了,所以不用手動安裝。

首先載入必要的套件以及 woodmouse 這個示範用的資料集。

# 載入套件與資料
library(ape)
library(kmer)
data(woodmouse)

使用 k-mer 與 Kimura 1980 演算法產生兩個距離矩陣:

# 計算距離矩陣
woodmouse.dist <- ape::dist.dna(woodmouse, model = "K80")
woodmouse.kdist <- kdistance(woodmouse, k = 6)

以近鄰結合法(neighbor-joining method)建立演化樹:

# 近鄰結合法建立演化樹
phy1 <- ape::nj(woodmouse.dist)
phy2 <- ape::nj(woodmouse.kdist)

重新排列節點順序,可讓畫出的演化樹更好閱讀:

# 重新排列節點順序
phy1 <- ape::ladderize(phy1)
phy2 <- ape::ladderize(phy2)

phylo 的樹轉換為 dendrogram 的樹:

# 將 phylo 物件轉換為 dendrogram 物件
dnd1 <- phylogram::as.dendrogram(phy1)
dnd2 <- phylogram::as.dendrogram(phy2)

呼叫 tanglegram 繪製樹狀圖:

# 繪製樹狀圖
dndlist <- dendextend::dendlist(dnd1, dnd2)
dendextend::tanglegram(dndlist, fast = TRUE, margin_inner = 5)
比較兩張樹狀圖

參考資料:rOpenSciCRANGitHubkmer vignettesdendextend vignettesCRAN Task View

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago