Hi David & Brian,
Yes, I'll put this function in the next release.
Cheers,
Emmanuel
Le 15/06/2015 18:27, David Bapst a écrit :
Whoops, I meant a 'function in ape?'
-Dave
On Mon, Jun 15, 2015 at 10:26 AM, David Bapst <[email protected]> wrote:
Hi Brian,
I was already aware of the read.tree(write.tree()) fix, however I've
run into (corner?) cases where a particular sorting of edges or
whatever can lead to a loss of tip taxa using the
read.tree(write.tree()) approach; plus, read.tree(write.tree()) gets
completely flabbergasted by singleton nodes...
Emmanuel, will checkValidPhylo be made a function in R? It something
I'd certainly like to call for my own internal
phylogeny-object-cleaning functions...
Cheers,
-Dave
On Mon, Jun 15, 2015 at 9:49 AM, Brian O'Meara <[email protected]> wrote:
A kludgy solution to achieve Dave's original use case of fixing
not-quite-right phylo objects is to do:
phy <- read.tree(text=write.tree(phy))
It converts the tree to Newick and reads it back in.
It's not as good a solution as using a validator (great addition, Emanuel!)
to find and fix the general problem, but it can help in a pinch.
Best,
Brian
_______________________________________
Brian O'Meara
Assistant Professor
Dept. of Ecology & Evolutionary Biology
U. of Tennessee, Knoxville
http://www.brianomeara.info
Postdoc collaborators wanted: http://nimbios.org/postdocs/
Calendar: http://www.brianomeara.info/calendars/omeara
On Mon, Jun 15, 2015 at 11:29 AM, Emmanuel Paradis <[email protected]>
wrote:
Hi David,
collapse.singles() seems to work correctly if the "phylo" object is
correctly conformed. Some features of this class may seem annoying (and
Klaus and I alredy discussed about this), but these help for other things.
As a reminder the class "phylo" is defined here:
http://ape-package.ird.fr/misc/FormatTreeR_24Oct2012.pdf
Recently, I put a function on github to help code writters:
https://github.com/emmanuelparadis/checkValidPhylo
This could help you to detect problems that would be tough to find
otherwise.
Cheers,
Emmanuel
Le 12/06/2015 22:41, David Bapst a écrit :
Hi Klaus (and others),
Ah, I see! The real bug then appears to be in collapse.singles, as it
does not reorder the ID numbers in $edge. Here's a quick function to
return the root ID:
getRootID<-function(tree){
uniqueNode<-unique(tree$edge[,1])
whichRoot<-sapply(uniqueNode,function(x)
(sum(x==tree$edge[,2])==0))
rootID<-uniqueNode[whichRoot]
return(rootID)
}
And if we run it...
getRootID(tree) #original tree
[1] 151
getRootID(tree1) #after collapse.singles
[1] 151
getRootID(tree2) #after reorder.phylo
[1] 131
And we can see that although the number of nodes certainly changed
when collapse.singles was run, it didn't change the root node's ID.
So I guess this is really a collapse.singles bug report. Thanks for
the insight, Klaus!
-Dave
On Fri, Jun 12, 2015 at 2:27 PM, Klaus Schliep <[email protected]>
wrote:
Hi David,
I found the bug. Somehow ape assumes on the one hand that the root is
number
of tips + 1.
On the other hand the root of an phylo object is the node which is in
tree$edge[,1], but not in tree$edge[,2],
this is the case even in an unrooted tree. This annoys me for a long
time.
The root of tree1 with the definition above is actually node 151 and not
131. Changing these solves your problem:
Here is a small function to do this for you:
switch.nodes<- function(tree, a, b){
ntips = length(tree$tip.label)
tree$edge[tree$edge==a] = 0L
tree$edge[tree$edge==b] = as.integer(a)
tree$edge[tree$edge==0L] = as.integer(b)
if(!is.null(tree$node.label)){
tmp<-tree$node.label[a-ntips]
tree$node.label[a-ntips] = tree$node.label[b-ntips]
tree$node.label[b-ntips] = tmp
}
tree
}
library(phangorn)
attr(tree1, "order") = NULL
getRoot(tree1)
tree2 = switch.nodes(tree1, 131, 151)
plot(tree2) # now works for me
Cheers and have a nice weekend,
Klaus
On Fri, Jun 12, 2015 at 2:53 PM, David Bapst <[email protected]> wrote:
Hello all,
As those of you who directly manipulate the guts of phylo objects in
your code (or construct new phylo objects whole cloth from
un-phylo-like data structures) have probably experienced, it is
sometimes easy to create $edge matrices that aren't accepted by ape
functions (I often use plot.phylo as my litmus for this).
When this occurs, various things can be done; I usually do the
following sequence:
collapse.singles()
reorder.phylo(,"cladewise")
read.tree(text=write.tree(,file=NULL))
...or something along those lines.
However, I've run into an issue where reorder.phylo() returns what is
essentially a scrap of the original $edge matrix, without warning.
Very worrisome! I'm using R version 3.2.0 and ape 3.3. Here's, my
script, including a call to a saved object on my website, so that the
error can be reproduced:
(Why do I have an .Rdata object listed with a .txt extension, you
might wonder? Because my school apparently sanitizes file extensions
on our hosted websites that it thinks are executables, archives or
doesn't recognize, but doesn't bother to check file innards when it
does recognize the extensions. Its easily hacked, at least.)
#################
library(ape)
load(url("http://webpages.sdsmt.edu/~dbapst/weirdTree_06-12-15.txt"))
#can I plot it?
plot(tree)
#nope
tree1<-collapse.singles(tree)
#any single-child nodes left?
sum(sapply(unique(tree1$edge[,1]),function(x)
sum(x==tree1$edge[,1])==1))
#nope
#can I plot it?
plot(tree1)
#nope
#now reorder
tree2<-reorder.phylo(tree1,"cladewise")
tree2$edge
#now reorder with postorder
tree2<-reorder.phylo(tree1,"postorder")
tree2$edge
#################
As we can see, reorder.phylo with various ordering methods returns an
edge matrix with just six rows, from a tree that originally had
hundreds of edges. Most worrisome, it does this without any error
message. In this particular case, I retain the tree correctly if I
skip reorder.phylo and use the read.tree(write.tree) trick, but this
behavior of reorder.phylo is worrying.
Anyone have a clue what's going on here? If I am perhaps misusing
reorder.phylo(), is there an alternative approach for use in cleaning
phylo objects?
Cheers,
-Dave
--
David W. Bapst, PhD
Adjunct Asst. Professor, Geology and Geol. Eng.
South Dakota School of Mines and Technology
501 E. St. Joseph
Rapid City, SD 57701
http://webpages.sdsmt.edu/~dbapst/
http://cran.r-project.org/web/packages/paleotree/index.html
_______________________________________________
R-sig-phylo mailing list - [email protected]
https://stat.ethz.ch/mailman/listinfo/r-sig-phylo
Searchable archive at
http://www.mail-archive.com/[email protected]/
--
Klaus Schliep
Postdoctoral Fellow
Revell Lab, University of Massachusetts Boston
_______________________________________________
R-sig-phylo mailing list - [email protected]
https://stat.ethz.ch/mailman/listinfo/r-sig-phylo
Searchable archive at
http://www.mail-archive.com/[email protected]/
--
David W. Bapst, PhD
Adjunct Asst. Professor, Geology and Geol. Eng.
South Dakota School of Mines and Technology
501 E. St. Joseph
Rapid City, SD 57701
http://webpages.sdsmt.edu/~dbapst/
http://cran.r-project.org/web/packages/paleotree/index.html
_______________________________________________
R-sig-phylo mailing list - [email protected]
https://stat.ethz.ch/mailman/listinfo/r-sig-phylo
Searchable archive at http://www.mail-archive.com/[email protected]/