使用R语言vegan包decorana()做DCA时遇负值报错排查
问题描述
使用R语言vegan包的decorana()函数对植被数据集做DCA(去趋势对应分析)时,执行代码:
dca_result <- decorana(species_data)
触发报错:
Error in decorana(species_data) : 'decorana' cannot handle negative data entries
数据集结构显示为419个样方、174个物种的数值型数据(部分示例如下):
str(species_data) 'data.frame': 419 obs. of 174 variables: $ Agrostis.canina : num 0 2.5 0 0 0 0 0.2 0 0 6.5 ... $ Agrostis.stolonifera : num 0 0 0 0 0 0 0 0 0 0 ... $ Ajuga.reptans : num 0 0 0 0 0 0 0 0 0 0 ... $ Anthoxantum.odoratum : num 0 0 0 0 0 0 0 0 0 0 ... $ Avenella.flexuosa : num 0 0 0 0 0 0 0 0 0 0 ... $ Ahtyrium.filix.femina : num 0 0 0 0 0 0 0 0 0 0 ... $ Betula.pendula : num 0 0 0 0 0 0 0 0 0 0 ... $ Struthiopteris.spicant : num 0 0 0 0 0 0 0 0 0 0 ... $ Calamagrostis.arundinacea : num 0 0 0 0 0 0 0 0 0 0 ... $ Callitriche.spec : num 0 0 0 0 0 0 0 0 0 0 ... $ Calluna.vulgaris : num 3.5 0 0 0 18 0 0 0.2 0 0 ...
已做的检测:
- 用
fixr包的check_for_negative_values(species_data)检测,返回:Data frame does not contain negative values. NULL - 执行
any_negative <- any(species_data[,-1] < 0)并打印,结果为FALSE。
明明没检测到负值,却触发该报错,求原因及解决办法。
可能的原因及解决办法
- 浮点数精度误差:数值型数据可能存在极小的负值(比如
-1e-16),常规检测函数无法识别,但decorana()内部的严格检查会触发报错。可以用以下两种方式处理:# 方式1:直接将所有小于0的数值替换为0 species_data[species_data < 0] <- 0 # 方式2:去除浮点数精度误差 species_data <- zapsmall(species_data) - 数据集包含非数值列:即使
str()显示大部分是数值型,若数据框中存在非数值列(比如第一列是样方ID字符型),decorana()处理时可能因隐式转换产生异常负值。确保输入的是纯物种丰度矩阵:# 提取所有数值型列并转为矩阵 species_matrix <- as.matrix(species_data[sapply(species_data, is.numeric)]) dca_result <- decorana(species_matrix) - vegan版本bug:旧版本vegan的
decorana()可能存在检测逻辑缺陷,尝试更新包:install.packages("vegan") library(vegan)
内容的提问来源于stack exchange,提问作者Platycerium
相关产品推荐
相关产品推荐

