vlambda博客
学习文章列表

R语言物种丰度矩阵的实现基本操作与生物物种多样性指数计算




本文由“壹伴编辑器”提供技术支持

在使用R语言处理数据的过程中,最基础的一步是把数据导入为合理的数据格式,因为不同的R命令只会匹配特定的数据格式。在生态学野外调查研究中,我们获取的实验数据往往是列表的形式,图1的数据中我们在每个样地(site)中设置了5个样方(plot),对于5个样方的调查,描述了样地的物种组成和物种对于环境的适应度,本调查中用草本物种的盖度代替了物种的丰度。


R语言物种丰度矩阵的实现基本操作与生物物种多样性指数计算

图1 植物群落数据举例


但是,我们在用R处理数据时,图1的数据格式不能拿来直接计算,矩阵是运用最广的数据格式,基于物种丰度(相对丰度)的群落数据矩阵用于许多生态学常用指数的计算(生物多样性指数、距离矩阵等)。
那么如何将列表数据转换成矩阵呢?我的思路是,首先将样方为单位的数据整理成样地为单位的数据,再将样地数据转换为丰度矩阵。
首先我们将原始数据保存成文件名为rawdata的csv格式文件。



代码如下:

#读取数据

rawdata= read.csv("rawdata.csv", header = T) #第一行为表头

library(doBy)#加载R包(需提前安装)

rawdata.site= summaryBy(abun ~ site + species, data=rawdata, FUN=mean)

#将abun列的数据按照每个样地中的

#每个物种为单位(site +species)

#计算均值

names(rawdata.site)[3]="abun"

#对均值列的列名重新命名为“abun”

head(rawdata.site)#查看前六行的数据


R语言物种丰度矩阵的实现基本操作与生物物种多样性指数计算

得到的rawdata.site即为样地为单位的数据列表。
随后,我们将列表转换成丰度矩阵(代码来自赖江山R语言学习班)。代码大致思路为:首先根据所有样地出现的物种和样地数量,建立一个行数为样地数,列数为物种数的空矩阵,然后利用循环语句,将数据填入空矩阵中。



代码如下:

tram.sitedata= function(data1)

{Species=unique(data1$species)

#提取所有的不重复物种名称并赋给

#Species向量

Site=unique(data1$site)

#提取所有不重复样方编号并赋给Site向量

n=length(Species) 

#计算不重复物种数并赋值给n

m=length(Site)  

#计算不重复的样方数并赋值给m

newdata=as.data.frame(matrix(0,m,n))

#构建一个新m×n的矩阵,然后将矩阵

#转为数据框,才能添加行名和列名

names(newdata)=Species 

#将列名改为物种名称

row.names(newdata)=Site 

#将行名改为样地的名称

#做一个行循环,然后进行填空

for(iin 1:m)

{newdata1=data1[data1$site==Site[i],]

#提取原始数据第i个样地的数据


newspecies=newdata1$species          

#提取第i个样地的物种名

newn=length(newspecies)             

#提取第i个样地的物种数

#做一个列循环,看多少个物种,

#就插入多少数值

for (jin 1:newn)

{Ncol=which(Species==newspecies[j])

#提取第i个样地的物种所在的位置

newdata[i,Ncol]=newdata1$abun[j]   

#第i行物种所在的位置依次#填入

#当前的物种多度值

}

}

return(newdata)#返回结果

}

spe.matrix= tram.sitedata(rawdata.site)#丰度矩阵

library(vegan)#(需提前安装)

spe.rel.matrix<- decostand(spe.matrix, "total")#相对丰度矩阵

write.csv(spe.rel.matrix,"spe.rel.csv")

#输出结果



将数据读出到spe.rel.csv文件中,结果如下:


图2转换后的相对丰度矩阵

根据物种相对丰度矩阵,我们可以计算生物多样性指数(以物种多样性为例)。



代码如下:

library(vegan)

Richness=rowSums(spe.rel.matrix>0)#物种丰富度指数

Shannon=diversity(spe.rel.matrix,"shannon")

#shannon多样性指数

Simpson=diversity(spe.rel.matrix,"simpson")

#Simpson多样性指数

H=diversity(spe.rel.matrix)

Pielou=H/log(Richness) #Pielou均匀度指数


R学习感言:R语言是生态学研究中常用的工具,因为其功能的多样性与代码的开源性,得到广大生态学者们的青睐。R语言比SPSS等软件上手难度大,刚接触R的同 学,一定要保持一个好的心态,不管遇到什么Error也不要怕,微笑面对它,不要放弃学习。入门之后就可以根据自己的需要,自学代码了。下一期分享的代码可以根据大家的需求决定。






本文编辑


2016级博士 衣世杰