方差分解分析(Variance Partitioning Analysis)可用于确定指定环境因子对微生物(原生生物/植物/动物等等)群落结构变化的解释比例。要计算指定环境因子与群落结构的相关性,就需要约束非指定环境因子的同时,对指定环境因子做排序分析。其实就是相当于做partial排序分析。

本文记录一下使用vegan包进行VPA分析的两种方法。

一、 数据准备

# 1. 设置工作路径,老生常谈,设置工作路径和查看路径内容一定是第一步
setwd("D:\\VPAanalysis")
getwd()
dir()


# 2. 调用R包
install.packages("ecodist")
library(vegan)
browseVignettes("vegan")
# 3. 读入数据
spe=read.csv("spe.csv",header=TRUE,row.names=1,sep=",", colClasses = c("character",rep("numeric",times=8)) )# 群落组成数据,物种组成数据是整数,为了使读入数据格式为数值型,设置colClasses,7为物种种类。
## ?rep  # 查看函数用法和函数中参数意义
spe


group=read.csv("group.csv",header=TRUE,row.names=1,sep=",")#分类数据,包含两种类别,grazing和soil depth
group # 这里不用group数据
env=read.csv("env.csv",header=TRUE,row.names=1,sep=",") #环境数据:土壤理化因子与气候因子。虚构数据仅用作教程
env

R语言 vegan r语言vegan包使用_数据分析

图1|物种组成数据(spe.csv)。

R语言 vegan r语言vegan包使用_数据分析_02

图2|环境因子数据(env.csv)。

R语言 vegan r语言vegan包使用_大数据_03

图3|分类数据(group.csv)。

二、方差分解分析(Variation partitioning analysis,VPA)

2.1 方法一:RDA及VPA分析

使用rda()进行偏RDA分析,然后自行计算指定环境因子解释率以及不同环境因子方差解释率重叠部分。此部分也有两种计算方式。R统计-VPA分析(RDA/CCA)文中记录了先计算指定环境因子的partial effect(局部效应),再使用总体环境因子效应-指定环境环境因子效应,得到共有方差解释率。此处记录计算指定环境因子的marginal effect(边际效应),然后所有边际效应相加-环境因子总体方差解释率,得到环境因子对微生物群落结构的解释率的共有部分。

# 2.1.1 RDA-全部环境因子。
RDA=rda(decostand(spe, "hel"),env)
RDA
sumr=summary(RDA)


# 2.1.2 RDA-WC、pH和TC
## RDA-WC、pH和TC的局部效应:单独只由WC、pH和TC解释的方差
RDA2=rda(decostand(spe, "hel"),env[c(1,2,5)],env[c(3,4,6)]) 
RDA2
sumr2=summary(RDA2)
anova(RDA2) # 显著性检验
#permutest(RDA2,permu=999) # anova()作用一样
RsquareAdj(RDA2) # 指定环境因子相关性结果校正,环境因子分类中不止一个环境因子,需要对R^2结果进行校正。


## RDA-WC、pH和TC的边际效应:只由WC、pH和TC解释的方差+WC、pH和TC与其它环境因子共同解释的方差
RDA4=rda(decostand(spe, "hel"),env[c(1,2,5)]) 
RDA4
sumr4=summary(RDA4)


# 2.1.3 RDA-氮形态环境因子
## 氮形态环境因子的局部效应
RDA3=rda(decostand(spe, "hel"),env[c(3,4,6)],env[c(1,2,5)])
RDA3
sumr3=summary(RDA3)


## 氮形态环境因子的边际效应
RDA5=rda(decostand(spe, "hel"),env[c(3,4,6)])
RDA5
sumr5=summary(RDA5)


# 2.1.4 计算WC、pH和TC与氮形态环境因子对微生物群落变化的解释度的共有部分
## 环境因子间的共线性,导致对群落结构方差贡献率的重叠。
## 局部效应计算方式
con=sumr$constr.chi/sumr$tot.chi-(sumr2$constr.chi/sumr2$tot.chi+sumr3$constr.chi/sumr3$tot.chi)
con
## 边际效应计算方式
con2=(sumr4$constr.chi/sumr4$tot.chi+sumr5$constr.chi/sumr5$tot.chi)-sumr$constr.chi/sumr$tot.chi
con2 # 两种计算方法的结果一致


# 2.1.5 VPA分析结果
## 局部效应计算方式
data = data.frame(RDA2=sumr2$constr.chi/sumr2$tot.chi,con=con,RDA3=sumr3$constr.chi/sumr3$tot.chi,un=sumr$unconst.chi/sumr$tot.chi)
data


## 边际效应计算方式
data2 = data.frame(`WC+pH+TC`=sumr4$constr.chi/sumr4$tot.chi-con,con=con,`N form`=sumr5$constr.chi/sumr5$tot.chi-con,un=sumr$unconst.chi/sumr$tot.chi)
data2

注:如果群落结构数据是高通量测序数据,存在很多物种为0的情况,可选择对数据进行hellinger转换,避免“弓形效应”。“弓形效应”就是CA/RA的第二排序轴在许多情况下是第一轴的二次变形。此部分的输出结果在R统计-VPA分析(RDA/CCA)文中,已经解释过了。这里不再赘述。

2.2 方法二:VPA分析

直接使用varpart()函数进行VPA分析。

# 2.2.1 两个环境因子分类VPA分析
## transfo参数定义微生物群落结构数据的转换方法:"hellinger", "chi.square", "total", "norm"可选,当已经对微生物群落结构数据进行了矩阵计算,则不设置此参数。
## chisquare = FALSE表示进行partial RDA分析,chisquare = TRUE则进行partial CCA分析。
rda.vpa <- varpart(spe, env[c(1,2,5)],env[c(3,4,6)], transfo="hel",chisquare = FALSE) 
#cca.vpa <- varpart(spe, env[c(1,2,5)],env[c(3,4,6)], chisquare = TRUE,permutations=999)
#cca.vpa
str(rda.vpa)
rda.vpa
## 对partial RDA分析结果进行校正,再进行计算,可以获得一样的结果。
#RsquareAdj(RDA2)
#RsquareAdj(RDA3)

R语言 vegan r语言vegan包使用_数据分析_04

图4|varpart()运行结构包含的数据,str(vpa)

R语言 vegan r语言vegan包使用_数据分析_05

R语言 vegan r语言vegan包使用_人工智能_06

5|varpart函数的VPA分析结果[a+b]表示WC、pH和TC的边际效应。[b+c]表示氮形态环境因子的边际效应。[a+b+c]表示所有环境因子的总体方差解释率。输出结果与方法1中的计算结果一致。[a]表示校正后的WC、pH和TC的局部效应,与RsquareAdj(RDA2)输出结果一致(可能因取的小数点位数有些微差异)。[b]表示校正后的WC、pH和TC与氮形态环境因子的对方差的共有解释率。[c]表示校正后的氮形态环境因子的局部效应,与RsquareAdj(RDA3)输出结果一致。[d]为残差。图中共有的部分产生的原因在于环境因子数据对微生物解释存在着共线性而产生,如果环境因子完全相互独立理论上重叠部分=0。

# 2.2.2 使用formula(公式)形式进行两个以上环境因子分类VPA分析
## 一般环境因子分类不超过4个
colnames(env)
rda.vpa2 <- varpart(spe, ~ pH + WC, ~ NH4..N + NO3..N, ~ TC + TN, data=env,transfo="hel",chisquare = FALSE) 
rda.vpa2

R语言 vegan r语言vegan包使用_python_07

R语言 vegan r语言vegan包使用_R语言 vegan_08

图6|三个环境因子分类的VPA分析结果。

三、绘制韦恩图

opar = par(no.readonly = TRUE) # 保存原始图形设置参数
#layout(matrix(c(1,3,2,4),nrow=2,byrow=TRUE),widths = c(2,2),heights = c(2,2))
#layout.show(4) # 将画布划分为4个区域用于将4幅图拼在一起
par(mfrow=c(2,2)) # 将画布划分为4个区域用于拼图
# 3.1. 2个环境因子分类,可以使用计算结果直接绘制韦恩图
data
counts=c(0.8258243*100,0.1027252*100,0.06568206*100,0.005768427*100)
venn(2,counts,zcolor = "red, green",snames = "pH+WC+TC,N form",ilabels = TRUE, ilcs = 0.5)


# 3.2 vegan中提供了对varpart()输出结果直接绘图的函数
showvarparts(3, bg=2:4)# 展示venn图示例,可以查看各部分对应的字符标记。3表示3个环境因子分类的venn视图。bg用于设置颜色
##Xnames=c("WC+pH+TC","N form")),用于设置venn图中的各环境因子分类标签
plot(rda.vpa, cutoff = -Inf, cex = 0.7, bg = c("hotpink","skyblue"),
     Xnames=c("WC+pH+TC","N form")) # cutoff = -Inf,可以显示出负值。
plot(rda.vpa2, cutoff = -Inf, cex = 0.7, bg=2:5,digits = 2,
      Xnames=c("WC+pH","TC+TN","N form")) # digits = 2设置小数点位数,函数是先对数据*100,再取小数点,所以图中实际显示的是4位小数点。
par(opar) # 恢复原始图形设置参数

注:2表示有两个组分,ilabels = TRUE表示添加数值标记,标记是counts内容。snames标记组分名称,ilcs=0.5为设置数值标记的字体大小。本来想要根据面积来绘制,但是没有找到好的方法使用R直接绘制(主要还是ggplot2学的不精啊)。所以这里图形不是根据面积来绘制的,用数值表示解释度。

R语言 vegan r语言vegan包使用_人工智能_09

图7|venn图。R中venn、gvenn和VennDiagram等R包都可以绘制韦恩图,具体参数可以看说明文档学习。

两个环境因子对微生物群落变化的存在共有解释度说明两个环境因子对微生物群落变化的解释存在共线性,否则共有解释度理论上应为0。如果某些环境因子对微生物变化的解释度<0,则说明环境因子数据对群落数据变化的解释度比使用随机变量的解释度还低,分析时解释度当做0处理。在选择环境因子数据时最好过滤掉解释度<0的环境因子,以及做一下共线性分析,选择互相共线性较低的环境因子