R中治疗组和部位的多样性指数

时间:2017-06-05 19:27:45

标签: r plyr vegan

我正在尝试使用素食的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,但这仍然为我提供了该阶段每个站点的辛普森多样性指数,而不是阶段作为一个整体。

感谢。

2 个答案:

答案 0 :(得分:1)

groups中没有这样的diversity参数,因为它没有明确定义:您是指一组中抽样单位的平均多样性,还是采样单位平均值的多样性一组?它们是不同的东西,最好明确地做你希望这个索引做的事情。

第一件事情更简单:只计算SU的多样性并按群体取平均值:

tapply(diversity(spe, "simpson"), env$Stage, mean)

对于普通社区的多样性,您首先需要按groups汇总数据,然后计算每个组的多样性(对于大多数指数meansum,通常的Diversity()索引也是如此,但summean没有的情况下有效:

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")
})