解决R语言vegan包NMDS分析报错:'dist' cannot be all zero
解决vegan包NMDS分析的"dist cannot be all zero"报错问题
问题概述
使用RStudio中vegan包进行非度量多维尺度分析(NMDS)时触发如下报错:
Error in monoMDS(dist, y = cmdscale(dist, k = k), k = k, maxit = maxit, : 'dist' cannot be all zero (all points are identical)
研究背景:样本量n=1,采用人际反应指针(IRI; Davis 1980, 1983)量表测量特质共情,目标是分析F、EC、PD、POV四个子量表间的距离。
现有代码
data_JA_select <- data_JA %>% dplyr::select(IRI_EC_1, IRI_EC_2,IRI_EC_3,IRI_EC_4,IRI_EC_5,IRI_EC_6,IRI_EC_7, IRI_POV_1, IRI_POV_2, IRI_POV_3, IRI_POV_4, IRI_POV_5, IRI_POV_6, IRI_POV_7, IRI_F_1, IRI_F_2, IRI_F_3, IRI_F_4, IRI_F_5, IRI_F_6, IRI_F_7, IRI_PD_1, IRI_PD_2, IRI_PD_3, IRI_PD_4, IRI_PD_5, IRI_PD_6, IRI_PD_7) data_JA_nmds <- metaMDS(data_JA_select, k = 2, distance= "euclidean", trymax = 100)
注:data_JA为已清洗完成的有效数据。
报错原因
- 数据结构错误:NMDS默认分析行(样本)间的距离,但当前输入是1行(1个样本)、28列(各子量表题项)——仅1个观测点时,距离矩阵所有值为0,触发报错。
- 目标与结构不匹配:研究目标是分析4个子量表间的距离,需将子量表作为NMDS的「分析单元」(即行),而非单个样本。
解决方案
步骤1:计算四个子量表的得分
根据IRI量表规则,对子量表题项求平均分或总分:
library(dplyr) # 计算子量表平均分(示例,可替换为总分) data_JA_scores <- data_JA %>% mutate( EC_score = rowMeans(select(., starts_with("IRI_EC_")), na.rm = TRUE), POV_score = rowMeans(select(., starts_with("IRI_POV_")), na.rm = TRUE), F_score = rowMeans(select(., starts_with("IRI_F_")), na.rm = TRUE), PD_score = rowMeans(select(., starts_with("IRI_PD_")), na.rm = TRUE) ) %>% select(EC_score, POV_score, F_score, PD_score)
步骤2:转换数据结构适配NMDS
将子量表作为分析单元(行),样本得分作为变量(列):
# 转置数据,子量表为行,样本得分为列 nmds_data <- t(data_JA_scores) # 给行命名对应子量表 rownames(nmds_data) <- c("EC", "POV", "F", "PD")
步骤3:重新运行NMDS
此时有4个分析单元,可正常计算距离矩阵并运行NMDS:
library(vegan) # 运行NMDS data_JA_nmds <- metaMDS(nmds_data, k = 2, distance = "euclidean", trymax = 100) # 查看结果与绘图 print(data_JA_nmds) plot(data_JA_nmds)
补充方案
也可先直接计算子量表间的距离矩阵,再传入NMDS核心函数monoMDS:
# 计算子量表间欧氏距离 dist_matrix <- dist(t(data_JA_scores), method = "euclidean") # 运行NMDS nmds_result <- monoMDS(dist_matrix, k = 2, maxit = 100)
内容的提问来源于stack exchange,提问作者jeisman
相关产品推荐
相关产品推荐

