[Phylobase-devl] path between two tips

Thibaut Jombart jombart at biomserv.univ-lyon1.fr
Thu Nov 20 20:54:34 CET 2008


Peter Cowan wrote:
> There is a function for calculating the MRCA.  Line 101 of the 
> treewalk.R file.  Perhaps this is helpful.
>
> Peter
Yes, it is. I used it in the function:

shortestPath <- function(x, node1, node2){
    if(!require(phylobase)) stop("phylobase package is not installed")

    ## conversion from phylo, phylo4 and phylo4d
    x <- as(x, "phylo4")

    ## check phylo4 object
    if (is.character(checkval <- check_phylo4(x))) stop(checkval)

    ## main computations
    t1 <- getnodes(x, node1)
    t2 <- getnodes(x, node2)

    comAnc <- MRCA(x, t1, t2) # common ancestor
    desComAnc <- descendants(x, comAnc, which="all")
    ancT1 <- ancestors(x, t1, which="all")
    path1 <- intersect(desComAnc, ancT1) # path: common anc -> t1

    ancT2 <- ancestors(x, t2, which="all")
    path2 <- intersect(desComAnc, ancT2) # path: common anc -> t2

    res <- union(path1, path2) # union of the path
    res <- c(comAnc,res) # add the common ancestor
    res <- getnodes(x, res)

    return(res)
} # end shortestPath

Example:
##
tr=as(rtree(20),"phylo4")
plot(tr, show.node=T)
shortestPath(tr,"t1","t2")
##

It works for tips, but some pb occur with internal nodes.
The pb seems to come from MRCA. For instance:
##
data(geospiza)
plot(as(geospiza,"phylo4"), show.node=T)
shortestPath(geospiza, "N02","N05")
MRCA(geospiza, "N02","N05")
##

MRCA returns N01 (the root) instead of N02.


Best,

Thibaut.

-- 
######################################
Dr Thibaut JOMBART
CNRS UMR 5558 - Laboratoire de Biométrie et Biologie Evolutive
Universite Lyon 1
43 bd du 11 novembre 1918
69622 Villeurbanne Cedex
Tél. : 04.72.43.29.35
Fax : 04.72.43.13.88
jombart at biomserv.univ-lyon1.fr
http://biomserv.univ-lyon1.fr/%7Ejombart/
http://adegenet.r-forge.r-project.org/



More information about the Phylobase-devl mailing list