文章目录
系统发育树是生物学最常涉及到的内容,有多种软件(MEGA、iQtree、raxML等)以及多种算法(贝叶斯、最大似然法、邻接法等)生成多种格式(newick、nexus、phylip)的系统发育树。我们常常通过iTOL、ggtree进行可视化或者其他操作,这里介绍一个可以批量对树进行编辑、删除操作的R包-TreeTools。
TreeTools能做什么
TreeTools "是一个R软件包,它提供了用于创建、修改和分析系统发育树等多种功能。
主要功能包括:生成具有指定形状的树;分析树的形状;树的根系和提取子树;计算和描述节点支持度;计算祖先-后裔关系;从Newick、Nexus和TNT格式导入和导出树;以及分析进化树分块和clade信息。
它是对’ape’、'phangorn’和’phytools’等软件包的补充,旨在实现高效和稳健的功能,通常应用于非加权树(即那些没有边长的树)。
安装
- 从CRAN安装并载入包
install.packages('TreeTools')
library('TreeTools')
- 或可从最新的github下载最新版
if(!require(devtools)) install.packages("devtools") # 借助devtools从github安装最新版包
devtools::install_github('ms609/TreeTools')
常用功能
对系统发育树指定根
RootTree()
:按照指定叶子(tips)root
RootOnNode()
:按照内部节点(node)root
UnrootTree()
:可以折叠一个根节点,而不会出现在预排序的树上使用 ape::unroot() 时遇到的未定义行为
首先需要说明一下什么是tips和node,如下图所示,tips是指的是每个参与建树的最小元素(t1-t8),是树的叶子;node则是指按照树的结构,一个node下有包含多个叶子或者子node(9-15)。
library('ape')
library('TreeTools')
tree <- PectinateTree(8) # 生成梳状的t1-t8叶子的树
tree
plot(tree) # 绘制树
ape::nodelabels() # 添加node lables
因此,在root的时候可以按照这两种方式来指定。
查看是否是root tree
TreeIsRooted(tree)
[1] TRUE
按照叶子名称指定root
使用RootTree
,
plot(RootTree(tree, outgroupTips = 't8')) # t8 单个物种作为外支
plot(RootTree(tree, outgroupTips = c('t7', 't8'))) # t7、t8两个物种作为外支
plot(RootTree(tree, outgroupTips = c('t1', 't5', 't8'))) # t1、t5、t8 三个物种作为外支,注意由于这3个tips在原来的树结构中就是外侧,因此指定root后也不会变
按照Node名称root
指定t7、t8的祖先节点15作为root,并且不解析根节点,也就是说t8和t7不在合并在一起作为一支。
plot(RootOnNode(tree, node = 15, resolveRoot = F)) # 指定t7、t8的祖先节点15作为root,并且不解析根节点
指定t7、t8的祖先节点15作为root,并且解析根节点。t7和t8合并到一支再与其他支并列。
plot(RootOnNode(tree, node = 15, resolveRoot = T))# 指定t7、t8的祖先节点15作为root,并且解析根节点
将root tree保存
使用write.tree
保存为newick格式
root.tree <- RootOnNode(tree, node = 15, resolveRoot = T)
write.tree(root.tree, 'root.tree.newick')
# 重新读入root tree
plot(read.tree('root.tree.newick'))
取消root
plot(UnrootTree(tree)) # 取消默认的root
TreeIsRooted(UnrootTree(tree))
[1] FALSE
按照tip label或者node删除某些树枝
DropTip()
将指定的叶子从系统发育树中移除,并将附带的分支折叠起来。
DropTip(tree, tip, preorder = TRUE, check = TRUE)
tree <- BalancedTree(9)
plot(tree) # 9个tips的树
plot(DropTip(tree, c('t5', 't6'))) # 去掉t5和t6两个tips
- 去掉t5和t6
- 参数和返回值
# 参数
tree,一个phylo类的树。
tip,指定要删除的树的标签的字符向量,或指定要删除的树的索引的整数向量。指定一个内部节点的索引将删除该节点的所有子节点。
preorder, 逻辑值,指定是否在丢弃提示前对树进行预排序。指定FALSE可以节省一点时间,但是如果树不在预排序中,会导致未定义的行为。
check,逻辑值,指定是否检查提示的有效性。如果是FALSE,并且提示包含的条目与树的叶子不一致,可能会发生未定义的行为。
# 值
DropTip()返回一棵去除所请求的叶子的phylo类树。树的边缘将被按顺序编号,但其顺序可能不符合Preorder()的惯例。KeepTip() 返回所有不在树尖上的叶子都被移除的树,按预排序。
- 按照node删除树结构
plot(tree)
nodelabels() # 显示node number
plot(DropTip(tree, tip = 14)) # 去掉node 14,t4-t5
转换成newick文本格式
通过NewickTree
将一棵树编码为一个Newick格式的字符串。这与write.tree()的不同之处在于将空格编码为空格,而不是下划线。
plot(tree)
NewickTree(tree)
[1] "((((t1,t2),t3),(t4,t5)),((t6,t7),(t8,t9)));"
NewickTree(DropTip(tree, 't9'))
[1] "((((t1,t2),t3),(t4,t5)),((t6,t7),t8));"
NewickTree(RootTree(tree, 't9'))
[1] "((((((t1,t2),t3),(t4,t5)),(t6,t7)),t8),t9);"