运行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
相关产品推荐
相关产品推荐

