Vegan包diversity函数计算错误:无法正确计算鱼类位点Simpson alpha多样性
解决vegan包diversity()函数计算位点Simpson多样性的错误问题
问题描述
我需要为包含6个位点、12个物种的鱼类数据库计算Simpson alpha多样性,但使用vegan包的diversity()函数时,错误地将12个物种条目分别计算出Simpson值,而非针对6个位点进行计算。对比vegan自带的dune数据库也未排查出问题,尝试调换csv文件的行列后问题仍未解决,附上当前代码及错误计算结果,请求帮助。
当前代码
if (!require(ggplot2)) install.packages('ggplot2') library(ggplot2) if (!require(ggpubr)) install.packages('ggpubr') library(ggpubr) if (!require(tidyverse)) install.packages('tidyverse') library(tidyverse) if (!require(vegan)) install.packages('vegan') library(vegan) if (!require(labdsv)) install.packages('labdsv') library(labdsv) Abundancia2017<- c(0,36,0,9,0,0,46,0,0,0,25,0) Abundancia2018<- c(0,46,0,13,5,0,69,2,0,0,123,9) Abundancia2019<- c(4,20,0,38,2,1,97,0,0,0,12,0) datafish <- data.frame(Abundancia2017,Abundancia2018, Abundancia2019) datafish
错误计算结果
运行diversity(datafish, index = "simpson")得到的结果:
[1] 0.0000000 0.6336025 1.0000000 0.5294444 0.4081633 0.0000000 0.6376379 0.0000000 1.0000000 1.0000000 [11] 0.3789844 0.0000000
问题根源与解决方案
问题根源
vegan的diversity()函数默认按行计算多样性,你的datafish数据框是12行(对应12个物种)、3列(对应3个位点/年份),所以函数默认给每行(每个物种)计算了多样性,完全搞反了分析逻辑。
解决步骤
- 转置数据框:将物种和位点的行列互换,确保行代表位点,列代表物种——这是vegan包要求的群落数据标准格式(行=样方/位点,列=物种)。
- 补充位点数据:你当前代码仅包含3个年份的位点数据,若实际是6个位点,只需将剩余3个位点的列添加到
datafish中,再转置计算即可。
修改后的代码示例
# 转置数据框,让位点作为行,物种作为列 datafish_transposed <- t(datafish) # 计算每个位点的Simpson多样性 simpson_result <- diversity(datafish_transposed, index = "simpson") # 查看结果 simpson_result
结果说明
转置后datafish_transposed有3行(对应3个年份位点),运行diversity()会得到3个Simpson值,每个值对应一个位点的alpha多样性,符合你的需求。
内容的提问来源于stack exchange,提问作者Ana Alicia
相关产品推荐
相关产品推荐

