最近好几个人遇到了同样的问题,就是在将OTU/ASV和系统发育树对齐的时候,报错:
Warning message:
In drop.tip(phylo, trimTaxa) : drop all tips of the tree: returning NULL
意思是OTU/ASV名字和系统发育树的节点全都不匹配,导致树上的节点全都被去掉了,树就变成了NULL。
这种问题的出现基本上都是进化树导致的。需要仔细查看进化树文件是否正确。在R中读入进化树:
library("ape")
tree = read.tree("tree.nwk")
tree
查看一下树,正确的格式应该是这样的:
但是,如果你的数据是某公司分析的,他们返回的树文件可能是这样的:
OTU/ASV名字多了单引号。而单引号也会被当成树节点的一部分,因此就和OTU/ASV不一致,导致全不匹配。。。
解决的办法也很简单,把树节点单引号替换掉即可:
tree$tip.label = gsub("'","",tree$tip.label)
完整的代码如下:
# 读入树和OTU
tree = read.tree("Tree.nwk")
otu = read.table("otu.tabular", header=T, row.names=1, sep="\t")
# 如果树的节点存在单引号
tree$tip.label = gsub("'","",tree$tip.label)
# 查看树是否有根
is.rooted(tree)
# 如果是FALSE,说明没有根,需要构建有根树
tree2 = root(tree, 1, r=TRUE) # pick the the farthest OTU as
is.rooted(tree2) ##true
# 修剪树和OTU
#prune.sample 对树进行修剪,仅包含otu中出现的物种。
#注意OTU表需转至,变成列为OTU/ASV,行为样本
phy.tree = prune.sample(t(otu), tree2)
#match.phylo.otu 对OTU表进行删减,只保留树中包含的OTU。
match.otu <- match.phylo.comm(phy.tree,t(otu))
# 得到匹配的树和OTU
otu = match.otu$comm # 注意得到的是转至过的OTU
phy = match.otu$phy
# 输出树
write.tree(phy,file = "tree.new.nwk")