我正在尝试使用素食主义者的 diversity()
函数计算 R 中的反辛普森多样性指数。我想为每个实验处理计算这个指数。
我的数据看起来有点像这样,其中 species
是物种 x 站点列联表,env
是处理因子 x 站点表:
spe <- read.table(header=TRUE, text="
S1 S2 S3 S4
0 1 2 1
0 1 1 0
1 0 0 3
0 1 0 1
1 2 1 0
")
env <- read.table(header=TRUE, text="
Stage
a
b
c
a
c
")
理想情况下,我会为每个 (a,b,c) 治疗因素获得一个单一的多样性指数值。
我知道 specnumber()
函数有一个组选项,但我没有看到任何类似的多样性,希望找到一种简单的方法来做同样的事情。我尝试过应用 summaryBy()
、aggregate()
和 ddply()
,但没有成功。
我还为每个 env$Stage
尝试了蛮力计算 diversity(subset(spe, env$Stage=="a"),"simpson")
>但这仍然为我提供了该阶段每个站点的辛普森多样性指数,而不是整个阶段的指数。
谢谢。
最佳答案
diversity
中没有这样的groups
参数,因为它没有明确定义:你是指一个组中抽样单元的平均多样性,还是一组抽样单位的平均值?它们是不同的东西,最好明确地做你想让这个索引做的事情。
第一件事比较简单:只需计算 SU 的多样性并按组取平均值:
tapply(diversity(spe, "simpson"), env$Stage, mean)
对于普通社区的多样性,您首先需要按组
聚合数据,然后计算每个组的多样性(对于大多数指数mean
和sum
在通常的 diversity() 索引中给出相同的结果,但 sum
在 mean
不适用的某些情况下有效:
diversity(aggregate(. ~ env$Stage, spe, sum)[,-1], MARGIN=1, index="simpson")
aggregate
想要添加一个额外的列来命名行,我们必须用 [,-1]
删除它,并给出转置的结果,我们需要设置MARGIN = 1
(或使用 t()
进行反向转置)。
如您所见,结果是不同的。有些人将这种差异称为 beta 多样性。
关于r - R中治疗组和地点的多样性指数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44376286/