R中metaMDS与scores维度不匹配报错(NMDS排序、双图绘制)
解决vegan包中scores()调用NMDS结果时的维度错误
问题背景
我尝试用R的vegan包绘制NMDS双图,执行了以下步骤:
首先读取数据:
shared_tbl <- read_tsv("data/andok.shared")
数据格式如下:
| Group | Blastocatellales | Frankiales | Cyanobacteriales |
|---|---|---|---|
| sample1 | 319 | 2563 | 546 |
| sample2 | 4114 | 657 | 986 |
| sample3 | 1463 | 123 | 85 |
| sample4 | 158 | 367 | 631 |
接着处理数据并执行NMDS:
shared_df <- shared_tbl %>% column_to_rownames("Group") # 构建距离矩阵 andok_dist <- avgdist(shared_df, sample = 1156) # NMDS排序 set.seed(1996020) andok_nmds <- metaMDS(andok_dist) scores(andok_nmds)
调用scores()时出现错误:
Error in x$species[, choices, drop = FALSE] : incorrect number of dimensions
此前按Pat Schloss教程操作无报错,现寻求解决方法。
错误原因与解决方法
这个错误的核心原因是:当你给metaMDS()传入**距离矩阵(dist对象)**时,函数默认不会计算物种(分类单元)的排序得分,因此andok_nmds$species是无维度的对象,而scores()函数默认会尝试提取物种得分,从而触发维度错误。
有两种常用解决方式:
方式1:让metaMDS直接处理物种矩阵(推荐)
放弃提前计算avgdist的步骤,直接将物种丰度矩阵传入metaMDS(),指定距离方法为"bray"(avgdist默认使用Bray-Curtis距离)并设置抽样参数,函数会自动完成抽样、距离计算、NMDS排序的全流程,同时生成物种得分:
set.seed(1996020) andok_nmds <- metaMDS(shared_df, distance = "bray", sample = 1156) scores(andok_nmds) # 可正常提取位点和物种得分,用于绘制双图
方式2:基于距离矩阵生成物种得分
若坚持提前计算距离矩阵,可通过两种方式修复:
- 仅提取位点得分:调用
scores()时明确指定display = "sites"
scores(andok_nmds, display = "sites")
- 生成物种加权平均得分:调用
metaMDS()时添加wascores = TRUE参数,基于位点得分计算物种的加权平均排序坐标
set.seed(1996020) andok_nmds <- metaMDS(andok_dist, wascores = TRUE) scores(andok_nmds) # 可提取位点和物种得分
内容的提问来源于stack exchange,提问作者vicey
相关产品推荐
相关产品推荐

