循环或矢量化此函数以进行系统发育树进化枝丢弃

Loop or Vectorize this function for Phylogenetic Tree Clade Dropping

我有一个过程,我想重复已知次数,但有一个问题。第一次迭代应该是原始数据集,然后下一次应该是第一次的结果,下一次是第二次的结果,......

一些背景:数据集的类型为 phylo,因此 for 循环中的 append 函数对我来说没有意义。下面是实际代码:

library(ape)
library(geiger)

clade.dropper <- function(phy, drop.tips) {
new.phy <- drop.tip(phy, tips(phy, drop.tips[1]))
new.phy <- drop.tip(new.phy, tips(new.phy, drop.tips[2]))
new.phy <- drop.tip(new.phy, tips(new.phy, drop.tips[3]))
new.phy <- drop.tip(new.phy, tips(new.phy, drop.tips[4]))
new.phy <- drop.tip(new.phy, tips(new.phy, drop.tips[5]))
new.phy
}

我希望能够防止上面的硬编码,并以某种方式循环它以获得包含要删除的系统发育树的尖端名称的给定列表。

谢谢!

好吧,我对所有这些系统发育的东西并不完全熟悉,但我相信 Reduce() 就是您要找的东西。简单向量示例演示:

A <- c(1,2,3,4,5);
Reduce(function(current,operand) current+operand,rep(1,6),A);
## [1]  7  8  9 10 11

这是它如何处理系统发育数据,从帮助页面上的示例代码中窃取 ?phylo.clades:

library(ape);
library(geiger);
sal <- get(data(caudata));
tax <- cbind(sal$tax[,c('subfamily','family','suborder')],order='Caudata');
tphy <- phylo.lookup(tax,ncores=2);
clade.num <- 1:5;
Reduce(function(phy,clade.num) drop.tip(phy,tips(phy,clade.num)),clade.num,tphy);
##
## Phylogenetic tree with 613 tips and 19 internal nodes.
##
## Tip labels:
##   Batrachoseps_attenuatus, Batrachoseps_diabolicus, Batrachoseps_gavilanensis, Batrachoseps_incognitus, Batrachoseps_luciae, Batrachoseps_major, ...
## Node labels:
##   Caudata, Salamandroidea, Plethodontidae, Bolitoglossinae, Plethodontinae, Spelerpinae, ...
##
## Unrooted; no branch lengths.

您的方法有几个问题 - 每次子集时都会重新绘制树节点 - 如果您按节点编号进行子集化,则每次删除节点时,在下一个 trim 上,您的下一个节点可能不是你想要的(我以前犯过这个痛苦的错误)。

如果您按名称进行子集化,您可能没问题,但大多数树不会有节点名称。

我们可以做的是一次列出您要删除的每个提示,然后 trim 一次全部删除。

使用 geigerape:

library(geiger)
library(ape)

首先加载一棵树:

geo <- get(data(geospiza))

提示函数未正确矢量化,让我们解决这个问题:

vtips <- Vectorize(tips, "node") 

现在我们可以一次性全部删除它们了:

todrop <- c(18,20)
drop.tip(geo$phy, unlist(vtips(geo$phy, todrop)))

以你的例子为例:

drop.tip(phy, unlist(vtips(phy, cladenum)))