[Picante-commits] r195 - branches/will/R

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Thu Nov 19 00:18:50 CET 2009


Author: will_cornwell
Date: 2009-11-19 00:18:50 +0100 (Thu, 19 Nov 2009)
New Revision: 195

Modified:
   branches/will/R/evol.distinct.R
Log:
renamed function to spp.evol.history with options for equal splits and fair proportion

Modified: branches/will/R/evol.distinct.R
===================================================================
--- branches/will/R/evol.distinct.R	2009-11-18 23:09:24 UTC (rev 194)
+++ branches/will/R/evol.distinct.R	2009-11-18 23:18:50 UTC (rev 195)
@@ -1,18 +1,47 @@
-#Evolutionary distinctiveness by equal splits (Redding and Mooers 2006)
+#Evolutionary distinctiveness by: 
+#a) equal splits (Redding and Mooers 2006)
+#b) fair proportions (Isaac et al., 2007)
+#The scale option refers to whether or not the phylogeny should be scaled to a depth of 1 or, in the case of an ultrametric tree,  scaled such that branch lengths are relative.
+#If use.branch.lengths=FALSE, then all branch lengths are changed to 1.
 
-ED.equal.splits<- function(tree){
+spp.evol.history<- function(tree, type=c("equal.splits", "fair.proportion"), scale=F, use.branch.lengths=TRUE){
 
+if(is.rooted(tree)==FALSE)
+warning("A rooted phylogeny is required for meaningful output of this function", call.=FALSE)
+
+if(scale==TRUE){
+#Scale tree to have unit depth (for an ultrametric tree) or scale all branches to unit length (for an additive tree)
+
+if(is.ultrametric(tree)==TRUE)
+tree<- rescaleTree(tree, 1) else 
+tree$edge.length<- tree$edge.length/sum(tree$edge.length)
+}
+
+if(use.branch.lengths==FALSE)
+tree<- speciationalTree(tree)
+
 for(i in 1:length(tree$tip.label)){
 	spp<- tree$tip.label[i]
 	nodes<- get.nodes(tree, spp)
 	#get rid of root node
 	nodes<- nodes[1:(length(nodes)-1)]
 	
-	brlen<- tree$edge.length[which(tree$edge[,2] %in% nodes)]
-	portion<- sort(rep(.5, length(brlen))^c(1:length(brlen)))
-	brlen<- brlen*portion
-	ED<- sum(brlen, tree$edge.length[which.edge(tree, spp)])
+	internal.brlen<- tree$edge.length[which(tree$edge[,2] %in% nodes)]
+
+#apportion internal branch lengths appropriately
+if(length(internal.brlen)!=0){
+internal.brlen<- internal.brlen*switch(type,
+	"equal.splits"=	sort(rep(.5,length(internal.brlen))^c(1:length(internal.brlen))),
+	"fair.proportion"= 1/for(j in 1:length(nodes)){
+		n.descendents<- length(node.leaves(tree, nodes[j]))
+		if(j==1)
+		portion<- n.descendents else
+		portion<- c(n.descendents, portion)
+		})}
 	
+	#sum internal branch lengths with the pendant edge
+	ED<- sum(internal.brlen, tree$edge.length[which.edge(tree, spp)])
+	
 	if(i==1)
 	w<- ED else
 	w<- c(w, ED)
@@ -21,4 +50,5 @@
 names(results)<- c("Species", "w")
 results
 	
-	}
\ No newline at end of file
+	}
+	
\ No newline at end of file



More information about the Picante-commits mailing list