[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