Today, an R-sig-phylo list member asked:
“I am using the ape package to randomly resolve polytomies using 'multi2di' and wondering if there is a way to use this function to get a single output tree file that contains multiple different randomly resolved trees using some number of resamplings?”
This can be done using the phytools function resolveNode
, which
returns all possible resolutions of a given node. We just iterate over all
the nodes of the tree pick a random resolution each time.
Here's a function to do that:
resolveRandom<-function(tree){
while(!is.binary(tree)){
nodes<-1:tree$Nnode+Ntip(tree)
Nchildren<-function(node,tree) length(Children(tree,node))
nchilds<-sapply(nodes,Nchildren,tree=tree)
node<-nodes[which(nchilds>2)[1]]
tree<-sample(resolveNode(tree,node),1)[[1]]
}
tree
}
Here's a quick demo:
library(phytools)
library(phangorn)
tree<-read.tree(text="(((A1,A2),(B1,B2,B3),C,D),E,F);")
plotTree(tree,type="cladogram",nodes="centered")
## now some random resolutions
plotTree(resolveRandom(tree),type="cladogram",nodes="centered")
plotTree(resolveRandom(tree),type="cladogram",nodes="centered")
plotTree(resolveRandom(tree),type="cladogram",nodes="centered")
plotTree(resolveRandom(tree),type="cladogram",nodes="centered")
We can also generate a set of resolutions using replicate
:
trees<-replicate(36,resolveRandom(tree),simplify=FALSE)
class(trees)<-"multiPhylo"
par(mfrow=c(6,6))
plotTree(trees,type="cladogram",nodes="centered")
That's it.
This comment has been removed by the author.
ReplyDelete