Thank you very much! That actually solved my problem. I couldn't express myself clearly but that was what I wanted.. that nodes with the same maximum path length to the tips should have the same height.. >From a layman perspective that way to compute branch lengths is actually more logic for a tree representation format like newick (think of the number of outside parenthesis..)
Thank you again! 2016-11-02 14:20 GMT-02:00 Liam J. Revell <liam.rev...@umb.edu>: > > Hi Carlos. > > After thinking about this, I realized that what you probably want is not a node depth based on the number of nodes above that node - but the based on the maximum number of nodes separating that node from any leaf. > > I just posted a second solution for this on my blog here: http://blog.phytools.org/2016/11/modified-version-of-grafens-branch.html. > > Let me know if this is helpful. > > All the best, Liam > > Liam J. Revell, Associate Professor of Biology > University of Massachusetts Boston > web: http://faculty.umb.edu/liam.revell/ > email: liam.rev...@umb.edu > blog: http://blog.phytools.org > > On 11/1/2016 10:32 PM, Liam J. Revell wrote: >> >> Hi Carlos. >> >> The edge lengths used for plotting (and thus the 'merge depths') are >> completely arbitrary when none are supplied. The algorithm used to >> compute the edge lengths is in the documentation for compute.brlen as >> follows: >> >> "Grafen's (1989) computation of branch lengths: each node is given a >> ‘height’, namely the number of leaves of the subtree minus one, 0 for >> leaves. Each height is scaled so that root height is 1, and then raised >> at power 'rho' (> 0). Branch lengths are then computed as the difference >> between height of lower node and height of upper node." >> >> If you want to set it so that it is the number of descendant nodes, >> rather than leaves, that determines the height of each internal node, >> you could try something like the following: >> >> tree<-newickTree >> ndn<-function(tree,x){ >> dd<-c(Descendants(tree,x,"all"),x) >> sum(dd>Ntip(tree)) >> } >> nn<-1:(Ntip(tree)+tree$Nnode) >> h<-sapply(nn,ndn,tree=tree) >> edge.length<-vector() >> for(i in 1:nrow(tree$edge)) edge.length[i]<-diff(h[tree$edge[i,2:1]]) >> tree$edge.length<-edge.length >> plot(tree) >> >> All the best, Liam >> >> Liam J. Revell, Associate Professor of Biology >> University of Massachusetts Boston >> web: http://faculty.umb.edu/liam.revell/ >> email: liam.rev...@umb.edu >> blog: http://blog.phytools.org >> >> On 11/1/2016 10:05 PM, Carlos Porto Filho wrote: >>> >>> Dear list, >>> >>> TL;DR: When I plot the newick tree ((((A,B),C,D),E),(((F,G),H),I)); >>> shouldn't ((A,B),C,D) merge at the same level as ((F,G),H)? >>> Or in a phylogenetic tree it doesn't matter? >>> >>> library(ape) >>> newickTree <- read.tree(text="((((A,B),C),E),(((F,G),H),I));") >>> plot(newickTree) >>> goes just fine but then, when I add D: >>> newickTree <- read.tree(text="((((A,B),C,D),E),(((F,G),H),I));") >>> plot(newickTree) >>> The merge between (A,B),C,D goes one level up (and consequently E too). >>> >>> Very long version: I'm developing my own hierarchical clustering >>> algorithm >>> that outputs a matrix like the one bellow: >>> >>> | Level 1 | Level 2 | Level 3 | Level 4 | Level 5 | >>> Level 6 >>> ------------------------------------------------------------------------------------------------------ >>> >>> 1 | 1 | c(5,8) | c(2, 5, 8) | c(2, 5, 7, 8) | c(2, 5, 6, >>> 7, 8) >>> | 1:10 >>> 2 | 2 | c(5,8) | c(1, 5, 8) | c(2, 5, 7, 8) | c(2, 5, 6, >>> 7, 8) >>> | 1:10 >>> 3 | 3 | c(4,9) | c(3, 4, 9) | c(2, 5, 7, 8) | c(1, 2, 5, >>> 7, 8) >>> | 1:10 >>> 4 | 4 | c(4,9) | c(3, 4, 9) | c(3, 4, 9, 10) | c(2, 5, 6, >>> 7, 8) >>> | 1:10 >>> 5 | 5 | c(5,8) | c(1, 5, 8) | c(2, 5, 7, 8) | c(2, 5, 6, >>> 7, 8) >>> | 1:10 >>> 6 | 6 | c(5,8) | c(2, 5, 8) | c(2, 5, 7, 8) | c(1, 2, 5, >>> 7, 8) >>> | 1:10 >>> 7 | 7 | c(5,8) | c(2, 5, 8) | c(2, 5, 7, 8) | c(1, 2, 5, >>> 7, 8) >>> | 1:10 >>> 8 | 8 | c(5,8) | c(2, 5, 8) | c(2, 5, 7, 8) | c(2, 5, 6, >>> 7, 8) >>> | 1:10 >>> 9 | 9 | c(4,9) | c(3, 4, 9) | c(2, 5, 7, 8) | c(2, 5, 6, >>> 7, 8) >>> | 1:10 >>> 10| 10 | c(4,9) | c(3, 4, 9) | c(3, 4, 9, 10) | c(2, 5, 6, 7, >>> 8) | >>> 1:10 >>> >>> I want to plot a dendrogram based on this and the best idea I had was to >>> convert that matrix to a newick tree format and use ape to read it and >>> plot >>> as a dendrogram. >>> So the corresponding newick tree would be >>> newickTree <- >>> read.tree(text="(((((5,8),1,2),7),6),(((4,9),3),10));") >>> plot(newickTree) >>> But the levels are wrong.. I was expecting this: >>> newickTree <- >>> read.tree(text="(((((5:1,8:1):1,1:2,2:2):1,7:3):1,6:4):1,(((4:1,9:1):1,3:2):1,10:3):2);") >>> >>> >>> plot(newickTree) >>> >>> I know that I can just specify the heights and solve my problem but that >>> would make my code more complex. One idea I had reading the last thread >>> (Making ultrametric trees) was to make every height = 1 and read it with >>> chronos() >>> newickTree <- >>> read.tree(text="((((A:1,B:1):1,C:1,D:1):1,E:1):1,(((F:1,G:1):1,H:1):1,I:1):1);") >>> >>> >>> dendr <- chronos(newickTree) >>> plot(dendr) >>> but it doesn't look right.. >>> >>> Sorry for the newbie questions.. I just wanted a way to make my algorithm >>> output a dendrogram. >>> >>> Thanks in advance. >>> -- Carlos Porto Filho Bioengenharia - EESC / IQSC / FMRP - USP [[alternative HTML version deleted]] _______________________________________________ R-sig-phylo mailing list - R-sig-phylo@r-project.org https://stat.ethz.ch/mailman/listinfo/r-sig-phylo Searchable archive at http://www.mail-archive.com/r-sig-phylo@r-project.org/