【问题标题】:How to rescale trees to extreme shapes?如何将树木重新缩放为极端形状?
【发布时间】:2015-12-04 00:53:44
【问题描述】:

尽管@jeremycg 帮助我开发了以下代码,但我再次发布此内容。它有效,但它的表现不是我想要的! 快速提醒:我有一组树,我需要根据一个称为 gamma 的因子进行测量,如果每棵树的值不在定义的范围内,它会重新缩放,直到它的值在定义的范围内......让我们试试这个例子:

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!!! 

谢谢!

【问题讨论】:

  • 偶发错误:较长的对象长度不是较短对象长度的倍数

标签: r loops tree data-manipulation phylogeny


【解决方案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))
  }
}

此函数将采用一棵树,如果它通过了 gamma 检查,则返回它。如果不是,它将从seq(from = 0.1, to = 0.9, by = 0.1) 中获取一个随机数,并按该数量重新缩放树,然后使用新树和rescaleamt/2 再次调用该函数。

所以现在我们只需要在您的树列表上执行此操作:

lapply(trees, fixmytrees)

注意。这不是对您的数据做的特别明智的事情,所以请确保您知道为什么要这样做。

【讨论】:

  • 感谢 jeremycg!它不需要另一个循环来遍历树列表吗?
  • 不,只要运行lapply 命令,输出就是固定的树
  • 好吧,因为 gammaStat 只接受 phyllo 对象,我认为我们需要一个循环来从 multiplyo 对象中一一读取树。也许这就是代码仍然无法工作的原因,对吧?
  • 它返回一个列表:z&lt;-lapply(trees, fixmytrees),你可以用class(z) &lt;- "multiPhylo"把它变成一个多门类
  • 我做了一些修改再次发布!
猜你喜欢
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多