vegan包adonis2检验报缺失值错误的原因与修复方法
adonis2报错缺失值的触发原因
检查到丰度列无显性NA仍触发该报错,核心原因有3类:
- 丰度输入混入了非数值的分组列:最常见的错误是将包含站点(site)字符/因子列的完整数据集直接作为公式左侧的丰度输入,非数值列在被
vegdist转成矩阵计算距离时会隐式生成NA,这类NA不会出现在你检查的纯丰度列中,因此容易被忽略。 - 存在未被识别的非有限值:数据中存在
NaN、Inf/-Inf、空字符串、以字符格式存储的"0"等特殊值,这类值肉眼排查容易和0混淆,但会被距离计算函数识别为缺失值。 - 预处理产生隐式异常值:如果丰度数据提前做过标准化、转化操作,全零行/全零列参与计算时可能生成非有限值,触发缺失值报错。
可行修复方案
按优先级依次操作:
- 严格拆分丰度数据与分组变量
公式左侧必须是纯数值型的丰度表(仅包含物种/类群丰度列,无任何分组、字符型列),分组变量通过data参数指定,确保丰度表行顺序和分组变量顺序一一对应,参考代码:# 假设你的总数据框名为df,包含site列和所有丰度列 # 提取纯丰度表:剔除site列,保留所有数值型丰度 abund <- df[, colnames(df) != "site"] # 传入adonis2 adonis2(abund ~ site, data = df, method = "bray") - 全量排查数据异常值
不要依赖肉眼检查,运行以下代码逐类排查所有会被识别为缺失的异常值:
排查到异常后按实际场景处理:非数值列直接剔除,字符型存储的数值用# 确认丰度表所有列均为数值型 str(abund) # 统计各类异常值数量 sum(is.na(as.matrix(abund))) # 常规NA sum(is.nan(as.matrix(abund))) # NaN值 sum(is.infinite(as.matrix(abund))) # 正负无穷值 sum(abund == "", na.rm = T) # 空字符串as.numeric()转换,无穷值/NaN替换为0或过滤对应全零的样本/物种列即可。 - 参数兜底(确认数据无异常后使用)
若完成前两步仍报错,可以显式给内部调用的vegdist传递na.rm=TRUE参数,注意该操作会自动剔除存在缺失值的行,使用前必须确认缺失值占比极低不会影响结果:adonis2(abund ~ site, data = df, method = "bray", na.rm = TRUE)
内容的提问来源于stack exchange,提问作者timeywimey
相关产品推荐
相关产品推荐

