我正在尝试使用素食的diversity()
函数来计算R中的反Simpson多样性指数。我想计算每个实验治疗的这个指数。
我的数据看起来有点像这样,其中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()
而没有任何运气。
我还为每个人diversity(subset(spe, env$Stage=="a"),"simpson")
尝试过强力计算env$Stage
,但这仍然为我提供了该阶段每个站点的辛普森多样性指数,而不是阶段作为一个整体。
感谢。
答案 0 :(得分:1)
groups
中没有这样的diversity
参数,因为它没有明确定义:您是指一组中抽样单位的平均多样性,还是采样单位平均值的多样性一组?它们是不同的东西,最好明确地做你希望这个索引做的事情。
第一件事情更简单:只计算SU的多样性并按群体取平均值:
tapply(diversity(spe, "simpson"), env$Stage, mean)
对于普通社区的多样性,您首先需要按groups
汇总数据,然后计算每个组的多样性(对于大多数指数mean
和sum
,通常的Diversity()索引也是如此,但sum
在mean
没有的情况下有效:
diversity(aggregate(. ~ env$Stage, spe, sum)[,-1], MARGIN=1, index="simpson")
aggregate
想要添加一个额外的列来命名行,我们必须使用[,-1]
删除它,并将结果转换为我们需要设置MARGIN = 1
(或使用{{ 1}}反向移调)。
如您所见,结果不同。有些人将这种差异称为beta多样性。
答案 1 :(得分:0)
我假设您的表是逐行连接的(例如,第1行是&#34; 0 1 2 1&#34;)。如果是这样的话,也许这是正确的轨道:
将它们组合成一个数据框:
spec_env <- data.frame(species, env)
> spec_env
S1 S2 S3 S4 Stage
1 0 1 2 1 a
2 0 1 1 0 b
3 1 0 0 3 c
4 0 1 0 1 a
5 1 2 1 0 c
使用split
获取数据框列表:
split_spec_env<-split(spec_env, spec_env$Stage)
现在,如果您需要每次治疗的平均多样性,首先使用lapply
获取每行的索引:
z<-lapply(split_spec_env, function(x){
x$div<-diversity(x[,1:4], index = "invsimpson")
return(x)
}
)
> z
$a
S1 S2 S3 S4 Stage div
1 0 1 2 1 a 2.666667
4 0 1 0 1 a 2.000000
$b
S1 S2 S3 S4 Stage div
2 0 1 1 0 b 2
$c
S1 S2 S3 S4 Stage div
3 1 0 0 3 c 1.600000
5 1 2 1 0 c 2.666667
然后再次获得每个子集的平均索引(我认为更有意义,但取决于您的需要):
lapply(z, function(x){
mean(x$div)
})
或如果您想从子集中获取所有值并在治疗中获得整体多样性:
lapply(z, function(x){
y <- unlist(x[,1:4])
diversity(y, "invsimpson")
})
编辑:我意识到您可能需要处理中总和物种的多样性指数。如果是这种情况,请使用colSums
:
lapply(z, function(x){
y <- colSums(x[,1:4])
diversity(y, "invsimpson")
})