Balanced minimum evolution computation in R


Hello friends–

I’m wondering if there is some way to calculate the BME score in an existing R package. By this score, I mean l in the sense of

There are heaps of functions to infer trees using distance matrices, but here we have a distance matrix and a tree and want to get a number.





Hi @ematsen, if your tree is binary this is trivial, as all the necessary functions exist:


# a little function for you
get_l <- function(tree, dm){
  # make sure the w and d will be in the same order
  label <- tree$tip.label  
  dm <- as.matrix(dm)[label, label]
  dm <- dm[lower.tri(dm)]
  tmp <- designTree(tree)
  w <- 2^(rowSums(tmp)-2)
  sum(dm / w)

# a little example
dm <-

fastme_tree <- fastme.bal(dm)
get_l(fastme_tree, dm)

# compare with brute force
trees <- allTrees(8, tip.label = names(yeast)) # compute all possible trees
trees %<>% .uncompressTipLabel() %>% unclass   # this speeds up things a bit

bf_l <- sapply(trees, get_l, dm=dm)
bf_tree <- trees[[which.min(bf_l)]]
RF.dist(bf_tree, fastme_tree)

I have no code for the general case with multifurcations (yet). Hope this gets you started.

Cheers, Klaus


Very slick! Thanks @klaus_schliep! This will do just fine for us.