背景
本课程中, 我们将学习如何分析阿尔伯塔草原的一组植物群落数据。数据中包括阿尔伯塔几个地点草原植物盖度、功能性状和系统发育关系等,
数据详细介绍参见以下论文: S.W. Kembel and J.F. Cahill, Jr. 2011. Independent evolution of leaf and root traits within and among temperate grassland plant communities. PLoS ONE 6(6): e19992. (doi:10.1371/journal.pone.0019992).
怎样使用课程材料
本课程覆盖了导入数据,在R中分析生物多样性的全部内容。如果要学习全部课程, 可以从R入门部分开始。如果已经有R的基础, 则可以直接学习本讲义。本课程需要用到picante程序包,以及数据映像(即.Rdata),后者包括练习用的全部数据,有了这些数据,运行后面的命令就可直接得到结果。
生物多样性数据导入R
首先, 查看一下我们需要的程序包是否能加载。需要用的程序包有ape, picante, vegan. 由于picante是依赖另外两个程序包的,所以加载picante的时候,另外两个程序包也会自动加载。
设定工作路径,请注意Windows和MacOS以及Linux操作系统上,路径斜杠的方向
1 | #setwd("/Users/jinlong/Dropbox/04\ to\ review/kembel/") |
群落数据
群落数据包括每个地点,或者每块样地物种的个体数,或者相对多度等。在本课程的数据中,多度数据是每个不同生境20m*20m样方中植物的相对盖度。
群落数据的格式为data.frame, 行表示样地,列表示物种。 练习数据已经包括comm数据了, 所以直接用就行了。 如果数据是保存在csv文件中, 则需要用read.csv函数读取,格式如下:
1 | # 每一行代表一块样地,因此行名就是样地编号, |
用以上方法将数据读取到R中,注意行名和列名并不是数据本身,而是各行列的名称。行列有了名称, 在后续就更容易操作和展示。群落数据的各行列有了名称,才方便和其他类型的数据关联。
1 | # 先查看comm的数据类型 |
本数据中, 多度其实是样地中某种植物的盖度。多元统计中的很多方法对于多度很敏感,因此可以将绝对多度转换为相对多度。用vegan中的函数即可完成。
1 | # 查看每个样方中盖度之合, 如果数据为个体数, |
性状数据
trait包括每个种叶和根的数据。读取到R中的方法与群落数据一样,但是在性状数据中,每个种是一行,每个性状是一列。
1 | traits <- read.csv("species.traits.csv", header = TRUE, row.names = 1) |
样地的总体情况Metadata
主要包括样地的生境,采集地点,环境数据,如坡度、干湿度等
1 | metadata <- read.csv("plot.metadata.csv", header = TRUE, row.names = 1) |
进化树(或称为系统树)
newick格式的进化树,用read.tree读取. Nexus格式的进化树,用read.nexus读取。
1 | phy <- read.tree("grassland.phylogeny.newick") |
读取到R中的进化树为phylo为格式。 phylo格式的详细说明参见ape的主页(http://ape.mpl.ird.fr/)。 phylo对象的本质是list,包括进化树末端分类单元名称(tip label),枝长(edge length)等等, ape内置的相关函数可以针对phylo这种数据格式打印, 汇总, 绘图等。
1 | # 列出phy对象的所有名称, 这些名称是list内部对象的名 |
数据整理(cleaning)及匹配
本分析用到的数据包括群落、性状、进化树以及metadata。
1 | ls() |
示例中的数据,因为已经经过了认真整理,样地和样品中的物种名能够完全对应。但是很多情况下,物种名并不能完全匹配。例如, 样地数据可能只有一部分种出现在进化树中,有些种可能有性状数据,但未出现在进化树中。一些分析中, R假设物种在群落数据和进化树中出现的顺序是一致的。但是有可能出现输入错误等。 以上问题都要找出来。picante程序包中有几个函数来检测不同数据中物种名是否相同。
1 | # 检查物种是否匹配 |
生物多样性数据的可视化及汇总
物种丰富度和多样性
每种生境上的物种数是否相同?
1 | # 比较 fescue 和 mixedgrass 生境中物种数的差异 |
群落多元分析
不同样地植物群落物种组成是怎样变化的?生境类型和环境变量与群落植物组成有什么关系?
要研究这些问题, 需要用到多元排序方法。 相关函数在vegan程序包中,相关的函数的帮助文件和使用指南也非常详尽。 也可以参考 Borcard等人编写的 Numerical Ecology in R, 这本书在2018年出的第二版。
等级聚类
通过聚类,物种组成相近的群落能聚合到一起。 先计算样方之间的Bray-Curtis距离,Bray-Curtis不但考虑了物种组成的差异, 同时考虑了每个种的多度。之后,用聚合等级聚类(agglomerative hierachical clustering algorithm)算法即可实现聚类。
1 | # 计算样地之间的 Bray-Curtis距离 |
两种类型的草地, 由于有不同的物种组成,分别聚成两类
排序
R中的排序方法比较多,这里我们采用NMDS (non-metric multidimensional scaling)方法。 NMDS的方法是基于距离矩阵的。
1 | # metaMDS函数会自动进行数据转换,并检查结果是否已经收敛。 |
排序结果可通过多种方式展示
1 | # 在Biplot中显示样地 |
也可以用ordisurf函数显示物种多度
1 | # 显示球葵属Sphaeralcea 的多度. cex参数可以调整点的大小 |
添加环境信息和性状数据到排序中
环境变量与排序轴之间是怎样的关系?这里使用envfit函数拟合
1 | ordiplot(comm.bc.mds) |
用vegan中的cca或者rda等排序方法也是可以的。cca或者rda直接考虑了物种组成和多度, 并不用先计算样方之间的距离。
性状与进化树
系统发育信号
最近,系统发育保守性受到很多人关注。群落系统发育结构分析就假设物种的性状是系统发育保守的。
系统发育信号是度量不同物种的性状在进化树上相似程度的指数。Blomberg K统计量就是比较性状的观察值与布朗运动模型预测值的统计量 (Blomberg et al. 2003)。K 值接近1表明性状进化过程接近布朗运动, 表明有一定程度的系统发育信号或者呈现一定的保守性。K接近于0表明性状进化倾向于随机,K>1 表明性状保守。
K的显著性检验可以用以下方法: 将进化树上的物种名随机打乱,计算每次打乱物种名后,性状的系统发育独立差(Phylogenetic independent contrast)的方差, 在多次打乱物种名生成零分布后,真实进化树的系统发育独立差方差与之进行比较。相关检验在Kcalc,phylosignal和multiPhylosignal 函数中可实现。
下面用练习数据计算系统发育信号
1 | # 可以用Kcalc依次计算traits数据框的所有列 |
结果中包括K和PIC.variance.P, 后者表示性状的非随机程度。大部分变量都完全随机表现出更强的系统发育信号。
性状进化的可视化
1 | plot(phy, direction = "up", show.tip.label = FALSE, |
性状相关性的系统发育分析
若功能性状表现出较强的系统发育信号,就违背了数据完全独立的假设。此时可以在gls中设定corBrownian 关联矩阵,考虑物种之间的系统发育关系。(注:在分析过程中, 可以使用caper的pgls回归。)
其中gls是一般最小二乘(Generalised least squares)法的简称,方法类似ANOVA 或线性模型。无序类别变量以及连续变量都可以通过这种方式检验。
下面检验检测一下, 考虑物种之间系统发育关系时, specific root length (SRL) 和 root tissue density 之间的关系。
1 | # 普通的gls模型, 不考虑系统发育关系 |
当不考虑系统发育关系时,SRL和root tissue density的关系很弱。考虑系统发育信号后,两者的相关性就明显了。
系统发育与性状多样性
系统发育多样性
1 | # 计算Faith's PD |
picante可以用来计算
(MPD), (MNTD), (SES_{MPD}) and (SES_{MNTD})
具体定义, 请参见Phylocom的说明书。
群落系统发育最重要指数之一就是标准效应值。公式如下
(SES_{metric} = \frac{ Metric_{observed} - mean(Metric_{null}) }{sd(Metric_{null})})
一般包括:
(SES_{MPD}) 等于 -NRI, (SES_{MNTD}) 等于 -NTI
picante中提供了不同的零模型,用来进行随机化,以计算SES。
1 | # 系统发育距离矩阵 |
输出结果ntaxa
- 物种丰富度mpd.obs
- 群落中mpd观察值mpd.rand.mean
- 零群落mpd平均值mpd.rand.sd
- 零模型mpd的标准差mpd.obs.rank
- 观察值在零模型中的顺序rank(秩)mpd.obs.z
- mpd标准效应指数 (等于 -NRI)mpd.obs.p - P-value (quantile) of observed mpd vs. null communities (= mpd.obs.rank / runs + 1)
runs
- 随机化次数
SES.mpd>0,且mpd.obs.p>0.95时,表示群落系统发育均匀。 SES.mpd<0,且mpd.obs.p<0.05时,表明与零模型相比系统发育聚集。
一般认为, MPD对对系统发育整体的聚集性或均匀性较为敏感,MNTD对靠近进化树末端的均匀性和聚集性更为敏感。
1 | # 不同生境的ses.mpd |
1 | # 某fescue群落中的物种 |
‘mix-H-23’ Mixedgrass 群落中包含了一系列系统发育聚集的种。
1 | # 某mixedgrass群落中出现的个体 |
性状多样性
性状的分析方法与进化树分析的方法类似,一般都是先进行标准化,再计算欧式距离,再计算功能性状相似性,计算MPD或者MNTD
1 | # 性状先用scale标准化, 再用dist计算欧式距离计算 |
vegan中的treedive函数与picante中的pd类似。
系统发育beta多样性
unifrac函数和phylosor函数,都是计算样方之间的Faith’s PD。 comdist和comdistnt的计算类似于MPD和MNTD,但是是针对样方之间的距离。计算过程中可以考虑多度,由于之前我们计算的Bray-Curtis距离已经考虑了多度。为了方便比较,后续的计算也考虑多度, 即abundance.weighted = TRUE
1 | # 系统发育beta多样性 |
系统发育和功能性状排序
之前,我们用Bray-Curtis进行了NDMS排序,实际上,系统发育MNTD以及功能性状MNTD都可以用类似的方法排序, 以展示样地之间的关系
1 | # 由于只有样地之间的距离,这里用monoMDS. |
无论是对物种beta多样性, 系统发育beta多样性还是功能性状beta多样性进行排序方式,两种生境类型的差别都比较大。
##解释beta多样性
为了解释哪些因子对样方之间的系统发育关系有影响, 可以用permutational MANOVA (adonis)计算,R代码如下。输出结果类似ANOVA方差分析。
以下分别检验生境对于Bray-Curtis距离、系统发育距离、功能性状距离的解释能力。
1 | # Bray-Curtis距离 |