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



-- 
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]/

Reply via email to