Description Usage Arguments Value Author(s) See Also Examples
View source: R/bsd.matrix.para.R
bsd.matrix estimates the sBSDmin distance for all paris of trees in a list. It returns an object of class bsd with the pairswise distances and the scaling factors. The scaling factors represent the differences in the magnitude of the rates among trees. See the help file for bsd.dist for more details.
1 | bsd.matrix.para(tree.list, para = F, ncore = 1)
|
tree.list |
A list of trees. It can be a list where each item is a tree, or an object of class multiPhylo. The trees can have names. See the example bellow. |
para |
logical. select T to run in parallel. |
ncore |
number of cores for parallelisation. |
An object of class 'bsd', which is a list with
comp1 |
An object of class dist with the pairwise distances for trees |
comp2 |
An object of class matrix with the scaling factors among trees |
Sebastian Duchene
bsd.dist bsd.matrix
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | # Create a list of trees of class multiPhylo with four patterns of among-lineage rate variation
tr.fix <- rtree(10)
set.seed(12345)
rates1 <- abs(rnorm(18, sd = 0.1))
set.seed(123456)
rates2 <- abs(rnorm(18, sd = 0.1))
set.seed(1234567)
rates3 <- abs(rnorm(18, sd = 0.1))
set.seed(12345678)
rates4 <- abs(rnorm(18, sd = 0.1))
trees.list <- list()
for(i in 1:20){
trees.list[[i]] <- tr.fix
if(i <= 5){
trees.list[[i]]$edge.length <- abs(rates1 + rnorm(18, 0, 0.01))
}else if(i > 5 && i <= 10){
trees.list[[i]]$edge.length <- abs(rates2 + rnorm(18, 0, 0.01))
}else if(i >= 10 && i < 15){
trees.list[[i]]$edge.length <- abs(rates3 + rnorm(18, 0, 0.01))
}else{
trees.list[[i]]$edge.length <- abs(rates4 + rnorm(18, 0, 0.01))
}
}
names(trees.list) <- paste0("tree", 1:20)
class(trees.list) <- "multiPhylo"
## Not run:
# Estimate sBSDmin distance for all pairs of trees:
trees.bsd <- bsd.matrix.para(trees.list, para = T, ncore = 2)
## End(Not run)
## The function is currently defined as
function (tree.list, para = F, ncore = 1)
{
require(foreach)
require(doParallel)
if (length(tree.list) <= 3) {
stop("The number of gene trees is <= 3. ClockstaR requires at least gene 4 trees")
}
bsd.dist <- function(tree1, tree2) {
list.tr <- list()
list.tr[[1]] <- tree1
list.tr[[2]] <- tree2
lens <- c(sum(tree1$edge.length), sum(tree2$edge.length))
tree1 <- list.tr[lens == max(lens)][[1]]
tree2 <- list.tr[lens == min(lens)][[1]]
tree.dist.opt <- function(x) {
tree3 <- tree2
tree3$edge.length <- tree2$edge.length * x
return(dist.topo(tree1, tree3, method = "score"))
}
opt.dist <- optim(0, fn = tree.dist.opt, method = "Brent",
lower = 0, upper = 50)
min.bdi <- opt.dist$value
scaling <- opt.dist$par
tree2.scaled <- tree2
tree2.scaled$edge.length <- tree2$edge.length * scaling
root.scaling <- 0.05/mean(c(tree1$edge.length[tree1$edge.length >
1e-05], tree2.scaled$edge.length[tree2.scaled$edge.length >
1e-05]))
tree1.root.scaled <- tree1
tree2.root.scaled <- tree2.scaled
tree1.root.scaled$edge.length <- tree1$edge.length *
root.scaling
tree2.root.scaled$edge.length <- tree2.scaled$edge.length *
root.scaling
min.bdi.root.scaled <- dist.topo(tree1.root.scaled, tree2.root.scaled,
method = "score")
res.vect <- c(min.bdi.root.scaled, scaling, min.bdi)
names(res.vect) <- c("min.bdi.scaled", "scaling.factor",
"min.bdi")
return(res.vect)
}
sub.trees <- list()
for (k in 2:length(tree.list)) {
sub.trees[[k]] <- tree.list[1:k - 1]
}
compute.tree.dists <- function(tree.sub.list, fix.tree) {
res <- sapply(tree.sub.list, function(a) {
return(bsd.dist(fix.tree, a))
})
return(res)
}
if (para == T) {
cl <- makeCluster(ncore)
registerDoParallel(cl)
print(paste("Clusters registered as follows: ", cl))
res.par <- foreach(s.trees = sub.trees, j = 1:length(tree.list),
.packages = "ape") %dopar% compute.tree.dists(tree.sub.list = s.trees,
fix.tree = tree.list[[j]])
stopCluster(cl)
}
else if (para == F) {
res.par <- foreach(s.trees = sub.trees, j = 1:length(tree.list),
.packages = "ape") %do% compute.tree.dists(tree.sub.list = s.trees,
tree.list[[j]])
}
res.list <- list()
res.list[[1]] <- matrix(NA, nrow = length(tree.list), ncol = length(tree.list))
for (m in 2:nrow(res.list[[1]])) {
res.list[[1]][m, 1:ncol(res.par[[m]])] <- res.par[[m]][1,
]
}
rownames(res.list[[1]]) <- names(tree.list)
colnames(res.list[[1]]) <- names(tree.list)
res.list[[1]] <- as.dist(res.list[[1]])
res.list[[2]] <- matrix(NA, nrow = length(tree.list), ncol = length(tree.list))
for (m in 2:nrow(res.list[[2]])) {
res.list[[2]][m, 1:ncol(res.par[[m]])] <- res.par[[m]][2,
]
}
rownames(res.list[[2]]) <- names(tree.list)
colnames(res.list[[2]]) <- names(tree.list)
class(res.list) <- "bsd"
return(res.list)
}
|
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.