metaMDS提取scores报维度不正确错误 物种得分不显示如何解决
报错核心诱因
- 跨设备vegan包版本差异是直接触发因素。
metaMDS()函数计算物种得分必须依赖原始物种丰度表,当输入对象是提前计算好的Unifrac距离矩阵时,函数没有计算物种得分的基础数据。新版本vegan不会在输出结果中生成无意义的species占位组分,此时直接调用scores()默认会同时提取样点、物种两类得分,索引不存在的species元素时就会抛出维度不匹配的错误。工作电脑安装的vegan版本更低,旧版本会自动生成空值填充的species占位对象,因此不会触发报错,但实际也无法输出有效的物种得分结果。 - 代码参数设置逻辑错误。你已经提前生成了Unifrac距离矩阵,却在
metaMDS()调用时传入distance = "bray"参数,该参数仅在输入为原始丰度表时才会触发对应距离计算,传入预计算距离时保留该参数会让函数执行非预期的距离重算逻辑,进一步干扰结果对象的组分生成,放大版本差异带来的兼容问题。
修复方法
根据分析需求二选一即可:
- 仅需样本得分开展聚类分析(适配你当前探究样本聚类规律的目标,绝大多数场景仅需样本得分)
先修正metaMDS()的错误参数,再指定scores仅提取样点评分,完全规避物种得分的索引逻辑:# 移除错误的distance参数,明确告知函数输入为预计算距离矩阵 nmds.all = metaMDS(unifrac.dist.all, k = 4, trymax = 500, distance = NULL) # 仅提取样本(位点)得分 nmds.all.scores = as.data.frame(scores(nmds.all, display = "sites")) - 确实需要输出物种得分
不能仅传入距离矩阵运行metaMDS(),需要将原始的OTU/ASV丰度表作为输入,同时正确指定距离计算方法为Unifrac(需提前加载支持Unifrac距离计算的依赖包,如phyloseq、GUniFrac):# 此处otu_tab为行对应样本、列对应物种的原始丰度表 nmds.all = metaMDS(otu_tab, k = 4, trymax = 500, distance = "unifrac") # 此时结果对象包含有效species组分,可正常提取全部得分 nmds.all.scores = as.data.frame(scores(nmds.all))
排查验证:运行
str(nmds.all)查看报错设备上的NMDS结果对象结构,可直接观察到对象内不存在有效的species矩阵组分,和报错提示完全对应;两台设备分别运行packageVersion("vegan")可确认版本差异,通常版本差≥2.6.0时会出现该兼容问题。
内容的提问来源于stack exchange,提问作者Nicolas Vanderzyl
相关产品推荐
相关产品推荐

