使用Evomap结合MCMC分析进化性状时出现矩阵运算错误的原因排查与解决咨询
问题分析与解决方案
错误含义解释
那个Error in invC %*% X : requires numeric/complex matrix/vector arguments错误很直白:矩阵乘法操作(%*%)要求参与运算的对象必须是数值型或复型的矩阵/向量,但你的代码里有一个对象不符合这个要求——这里就是你怀疑的CDdat,它确实是NULL,没法参与任何矩阵运算。
核心原因:CDdat的赋值语法错误
看你代码里的这一行:
CDdat<- mydata2$CD; names(CDdat <-rownames(mydata2) + )
这里有两个致命问题:
- 后半句的
rownames(mydata2) + )是语法错误,多了一个无意义的+符号,导致这行代码执行失败,返回NULL - 你用
CDdat <- rownames(mydata2)覆盖了前面的CDdat<- mydata2$CD,再加上语法错误,最终CDdat被赋值成了NULL(从你代码里输出的NULL也能确认这一点)
解决方案:修正CDdat的赋值
把那行错误的代码替换成正确的赋值语句,先获取鸣叫时长的数值,再给它加上物种名作为名称:
# 提取鸣叫时长数值 CDdat <- mydata2$CD # 给数值向量添加物种名(匹配系统发育树的节点/物种名) names(CDdat) <- rownames(mydata2)
执行完这两行后,你可以用str(CDdat)检查一下,它应该是一个带名称的数值型向量,比如:
num [1:XX] X.X X.X X.X ... - attr(*, "names")= chr [1:XX] "SpeciesA" "SpeciesB" ...
额外检查点(避免后续问题)
- 确认
mydata2$CD是数值型:用class(mydata2$CD)查看,如果是字符型,需要转成数值:mydata2$CD <- as.numeric(mydata2$CD) - 检查
tree_mvBMCD的结构:确保它是一个有效的phylo对象,没有缺失的分支或错误的节点名称,可以用plot(tree_mvBMCD)快速可视化验证 - 确认
anc.Bayes的参数匹配:比如tree_mvBMCD的物种名和CDdat的名称完全对应,没有拼写错误或缺失
内容的提问来源于stack exchange,提问作者Trent Williams
相关产品推荐
相关产品推荐

