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

运行phylo_glmmTMB模型遇Matrix::rankMatrix维度错误求助

问题排查与解决方案

核心错误原因

报错length(d <- dim(x)) == 2 is not TRUE表明传入phyloZ参数的对象不是二维矩阵,而是列表或一维结构。你提到supertreenew的维度显示为[[1]]...[351]、[[2]]...[645],这说明它是一个列表,不符合phylo_glmmTMB对phyloZ参数的要求(需要二维亲缘关系矩阵)。

具体修复步骤

1. 确认supertreenew的结构

先运行以下代码检查对象类型和结构:

class(supertreenew)
str(supertreenew)
dim(supertreenew)

正常情况下,phyloZ需要的是matrix或dgCMatrix类型的二维矩阵,维度应为n × n(n是data$phylo的分组水平数)。

2. 重新生成并格式化亲缘关系矩阵

根据你使用的生成方式,选择对应的修复方法:

方法A:使用vcv.phylo生成亲缘关系矩阵
# 从系统发育树生成亲缘关系矩阵
supertreenew <- vcv.phylo(supertreenew)
# 确保矩阵的行/列名与数据中的phylo分组水平完全匹配
data_phylo_levels <- levels(factor(data$phylo))
supertreenew <- supertreenew[data_phylo_levels, data_phylo_levels]
# 再次检查结构
dim(supertreenew) # 应返回 c(n, n),n为phylo分组数
方法B:使用phylo.to.Z生成Z矩阵

注意phylo.to.Z返回的是包含多个元素的列表,需要提取其中的二维Z矩阵:

supertreenew <- phylo.to.Z(supertreenew)
# 提取列表中的Z矩阵部分
phylo_Z_matrix <- supertreenew$Z
# 匹配数据中的phylo顺序(确保每行对应数据中的样本分组)
phylo_Z_matrix <- phylo_Z_matrix[match(data$phylo, rownames(phylo_Z_matrix)), ]
# 检查维度
dim(phylo_Z_matrix) # 应返回 c(nrow(data), n_tips),n_tips是树的末端数

3. 重新运行模型

将处理后的二维矩阵传入phyloZ参数:

mod1 <- phylo_glmmTMB(
  response ~ sv1 + sv2 + sv3 + sv4 + sv5 + sv6 + sv7 + (1|phylo) + (1|reference_id),
  ziformula = ~ 0,
  phyloZ = supertreenew, # 或phylo_Z_matrix(根据上面的方法选择)
  phylonm = "phylo",
  family = "binomial",
  data = data
)

额外检查项

  • 确保data$phylo没有缺失值,且所有水平都存在于亲缘关系矩阵的行/列名中。
  • 检查随机效应(1|phylo)的分组数与亲缘关系矩阵的维度一致,避免不匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:20:40