祖先状态重建中如何处理多叉树与无分支长度问题
多叉无枝长系统发育树离散性状祖先状态估计解决方案
适配方案(无需转二叉、无人工节点问题,不依赖phytools)
方案1:最大简约法重建(无需分支长度,原生支持多叉)
最大简约法本身不需要分支长度输入,也原生适配多叉拓扑,完全匹配形态学树的应用场景:
- 优先使用
phangorn包的ancestral.pars()函数:- 支持二元离散性状,默认采用费奇简约法,不会强行转换多叉为二叉,返回结果仅包含原树的原生节点
- 示例用法:
library(phangorn) # 输入要求:trait为命名向量,名称与树的tip.label一一对应,值为二元性状 asr_result <- ancestral.pars( tree = your_polytomy_tree, data = trait, type = "USER", cost = matrix(c(0,1,1,0), nrow=2, ncol=2) # 二元性状转换代价矩阵 ) - 大数据量场景可选
castor包的asr_max_parsimony()函数,运算速度更快,同样原生支持多叉无枝长树。
- 优先使用
方案2:概率模型重建(适配你原有的kappa=0参数设定)
无分支长度的形态学树做概率型祖先重建时,领域常规操作为将所有分支长度设为等长(如统一赋值为1),结合你原设置的
kappa=0可以实现性状演化与分支长度解耦,完全匹配你的原分析逻辑:
推荐使用corHMM包的ancRECON()函数:- 原生支持多叉拓扑,无需提前转换为二叉,不会生成人工节点
- 支持自定义kappa参数,和你之前使用
ape::ace的参数设定兼容 - 示例用法:
library(corHMM) # 先给无枝长树设置等长分支 your_polytomy_tree$edge.length <- rep(1, nrow(your_polytomy_tree$edge)) # 祖先状态重建 asr_result <- ancRECON( phy = your_polytomy_tree, data = trait_df, # 两列数据框,第一列为物种名,第二列为二元性状值 model = "ARD", # 可根据需求替换为ER/ARD/SYM模型 rate.cat = 1, kappa = 0 # 匹配你原有的参数设置 )
补充说明
如果坚持使用ape::ace,也可以在使用multi2di转换为二叉后,通过节点编号过滤掉人工生成的节点结果:multi2di生成的人工节点编号会大于原多叉树的最大原生节点编号,仅保留编号等于原树节点数的结果即可,但操作复杂度高于直接使用原生支持多叉的函数。
内容的提问来源于stack exchange,提问作者Diego Almeida-Silva
相关产品推荐
相关产品推荐

