R 中的系统发育学:折叠内部节点的后代尖端

Phylogenetics in R: collapsing descendant tips of an internal node

我有几千个基因树,我正试图准备好用 codeml 进行分析。下面的树就是一个典型的例子。我想要做的是自动折叠看似重复的提示或节点。例如,节点 56 的后代是提示 26、27、28 等一直到 36。现在,除了提示 26 之外的所有这些似乎都是重复的。我怎样才能将它们全部折叠成一个提示,只留下提示 28 和其他提示的一个代表作为节点 56 的后代?

我知道如何一个一个地手动执行此操作,但我正在尝试使该过程自动化,以便一个函数可以识别哪些提示需要折叠,然后将它们缩减为一个具有代表性的提示。到目前为止,我一直在研究计算尖端之间距离的共生函数。但是,我不确定如何使用该信息来折叠提示。

这是下面树的 newick 字符串:

((((11:0.00201426,12:5e-08,(9:1e-08,10:1e-08,8:1e-08)40:0.00403036)41:0.00099978,7:5e-08)42:0.01717066,(3:0.00191517,(4:0.00196859,(5:1e-08,6:1e-08)71:0.00205168)70:0.00112995)69:0.01796015)43:0.042592645,((1:0.00136179,2:0.00267375)44:0.05586907,(((13:0.00093161,14:0.00532243)47:0.01252989,((15:1e-08,16:1e-08)49:0.00123243,(17:0.00272478,(18:0.00085725,19:0.00113572)51:0.01307761)50:0.00847373)48:0.01103656)46:0.00843782,((20:0.0020268,(21:0.00099593,22:1e-08)54:0.00099081)53:0.00297097,(23:0.00200672,(25:1e-08,(36:1e-08,37:1e-08,35:1e-08,34:1e-08,33:1e-08,32:1e-08,31:1e-08,30:1e-08,29:1e-08,28:0.00099682,27:1e-08,26:1e-08)58:0.00200056,24:1e-08)56:0.00100953)55:0.00210137)52:0.01233888)45:0.01906982)73:0.003562205)38;

一种选择是丢弃长度低于阈值的提示。

drop_dupes <- function(tree,thres=1e-5){
  tips <- which(tree$edge[,2] %in% 1:Ntip(tree))
  toDrop <- tree$edge.length[tips] < thres
  drop.tip(tree,tree$tip.label[toDrop])
}

plot(drop_dupes(tree))