You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Phangorn包nnls.tree函数处理部分进化树时出错问题排查

nnls.tree函数报错:Dimnames长度不匹配的原因分析

问题场景

使用ape和phangorn包调整进化树分支高度时,包含t35节点的树执行nnls.tree会触发维度不匹配错误,移除该节点后函数可正常运行。

报错代码示例

library(ape)
library(phangorn)

tree1 <- ape::read.tree(text = "(((((t1:1,t2:1)n5:1,(((t3:1,t4:1)n8:1,(t5:1,t6:1)n9:1)n7:1,(t7:1,(t8:1,t9:1)n11:1)n10:1)n6:1,(t10:1,t11:1,((t12:1,t13:1,t14:1)n14:1,(t15:1,t16:1,t17:1,t18:1)n15:1)n13:1)n12:1)n4:1,(((t19:1,(t20:1,(t21:1,t22:1)n20:1)n19:1)n18:1,t23:1)n17:1,(t24:1,(t25:1,t26:1)n22:1,(t27:1,t28:1,t29:1,t30:1)n23:1)n21:1)n16:1,(t31:1)n24:1,(t32:1,t33:1,t34:1)n25:1)n3:1,t35:1)n2:1)n1;")

nnls.tree(cophenetic(tree1), tree1)

触发的错误信息

Error in fixupDN.if.valid(value, x@Dim) : length of Dimnames[[2]] (58) is not equal to Dim[2] (57)

正常运行的代码示例

tree2 <- drop.tip(tree1, "t35")
nnls.tree(cophenetic(tree2), tree2)

正常输出结果

Phylogenetic tree with 34 tips and 22 internal nodes.
Tip labels: t1, t2, t3, t4, t5, t6, ... Node labels: n3, n4, n5, n6, n7, n8, ...
Unrooted; includes branch lengths.

原因分析

  • 核心问题:单分支悬垂节点导致维度不匹配
    tree1中的t35是一个单分支悬垂节点——它直接连接在内部节点n2上,自身没有任何子节点,属于进化树结构中的冗余分支。
  • cophenetic函数的计算逻辑
    cophenetic()会计算进化树中所有节点(包括末端节点和内部节点)之间的两两距离,生成的距离矩阵会包含t35这个冗余节点的相关条目,导致矩阵维度多了一个额外项。
  • nnls.tree的输入要求
    nnls.tree()要求输入的距离矩阵维度必须和树的有效节点数(末端节点+非冗余内部节点)严格对应。但该函数处理时会自动过滤掉单分支悬垂节点,导致实际预期的节点数比cophenetic()生成的矩阵维度少1,最终触发维度不匹配的错误。
  • 移除t35后的变化
    删掉t35后,tree2的所有节点都是非冗余的正常分支结构,cophenetic()生成的距离矩阵维度和nnls.tree()预期的节点数完全匹配,因此能正常执行。

内容的提问来源于stack exchange,提问作者MGN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:32:44