You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否有多样性分组函数对应的均匀度分组函数?如何按分组计算Pielou均匀度?

按Quadrant分组计算Pielou均匀度的解决方案

你可以利用vegan包中diversity和specno的groups参数先分别得到分组的Shannon指数和物种丰富度,再通过两者的比值计算Pielou均匀度,以下是几种可行的实现方式:

方法1:基于base R的直接计算

先分别计算分组后的Shannon指数与物种丰富度,再做除法得到均匀度:

# 按Quadrant分组计算Shannon-Wiener指数
shannon_by_quad <- diversity(nta[,c(-1,-2)], groups = nta$Quadrant, index = "shannon")
# 按Quadrant分组计算物种丰富度
specno_by_quad <- specno(nta[,c(-1,-2)], groups = nta$Quadrant)
# 计算Pielou均匀度(H'/log(S))
pielou_by_quad <- shannon_by_quad / log(specno_by_quad)

方法2:用by()函数逐组处理

如果需要对每个分组的数据集单独操作,可以用by()函数遍历每个Quadrant的子数据集,在函数内部完成指数计算:

pielou_by_quad <- by(nta[,c(-1,-2)], nta$Quadrant, function(sub_data) {
  # 计算当前组的Shannon指数
  h_val <- diversity(sub_data, index = "shannon")
  # 计算当前组的物种丰富度
  s_val <- specno(sub_data)
  # 返回Pielou均匀度
  h_val / log(s_val)
})
# 将结果转为更易读的向量格式
pielou_by_quad <- unlist(pielou_by_quad)

方法3:用dplyr做 tidy 风格的计算

如果你习惯tidyverse的语法,可以将数据转为长格式后分组计算:

library(dplyr)
library(tidyr)
library(vegan)

pielou_result <- nta %>%
  # 将物种列转为长格式
  pivot_longer(cols = -c(1,2), names_to = "Species", values_to = "Abundance") %>%
  # 按Quadrant分组
  group_by(Quadrant) %>%
  # 分组计算各项指数
  summarise(
    Shannon指数 = diversity(Abundance, index = "shannon"),
    物种丰富度 = specno(Abundance),
    Pielou均匀度 = Shannon指数 / log(物种丰富度)
  )

说明

Pielou均匀度的核心公式是H'/log(S),其中H'是分组的Shannon指数,S是分组的物种丰富度。上面的方法都是围绕这个公式,利用vegan的分组计算能力完成的,避免了手动循环处理分组数据的麻烦。

内容的提问来源于stack exchange,提问作者Dean Bayliss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:57:31