Как масштабировать деревья до экстремальных форм?

Я публикую это снова, хотя @jeremycg помог мне разработать следующий код. Это работает, но выполняет не то, что я хотел! Быстрое напоминание: у меня есть набор деревьев, которые мне нужно измерить в терминах фактора, называемого гаммой, и если значение каждого дерева не находится в определенном диапазоне, оно масштабируется до тех пор, пока его значение не окажется в определенном диапазоне... Давайте попробуем этот пример:

library(ape)
library(phytools)

trees<- pbtree(b=1, n=100, nsim=50)

 fixmytrees <- function(tree, rescaleamt = NULL){
if(is.null(rescaleamt)){
rescaleamt <- sample(seq(from = 0.1, to = 0.9, by = 0.1), 1)
} 
if(is.na(gammaStat(tree))){return("bad tree")}
if(gammaStat(tree) < 6){
 return(tree)
 } else {
return(rescale(tree, model ="delta", rescaleamt))
}
}
z<-lapply(tree, fixmytrees) 

 #The script does rescale trees but they are not extreme enough. In this case if you try

 gammaStat(z[[]]) #You would probably see values lower than 6 and sometimes NA!!! 

Благодарю вас!

1 ответ

Решение

Сначала прочитайте библиотеки и создайте рекурсивную вспомогательную функцию:

library(ape)
library(geiger)
fixmytrees <- function(tree, rescaleamt = NULL){
  if(is.null(rescaleamt)){
    rescaleamt <- sample(seq(from = 0.1, to = 0.9, by = 0.1))
  } 
  if(gammaStat(tree) >= 1){
    return(tree)
  } else {
    return(fixmytrees(rescale(tree, "delta", rescaleamt), rescaleamt/2))
  }
}

Эта функция берет дерево, и, если оно проходит проверку гаммы, возвращает его. Если нет, он будет принимать случайное число от seq(from = 0.1, to = 0.9, by = 0.1) и измените масштаб дерева на эту величину и снова вызовите функцию с новым деревом, и rescaleamt/2,

Так что теперь нам просто нужно сделать это в вашем списке деревьев:

lapply(trees, fixmytrees)

NB. Это не очень важно для ваших данных, поэтому, пожалуйста, убедитесь, что вы знаете, почему вы это делаете.

Другие вопросы по тегам