由于论文问题,这里重做了mantel test,所以记录一下完整的重做过程。
首先是运行语言,这路选择R语言作为计算语言。
1 package
library(vegan)
library(geosphere)
library(tidyverse)
library(ggcor)
#前三个包可以直接安装,ggcor安不上去的话考虑用devtools本地安装:
#devtools::install_local("./ggcor-master.zip")
ggcor作者删除了账号,不知道原因,但是github上还有备用仓库:mj163163/ggcor-1: ggcor备用源,版权归houyunhuang所有,本源仅供应急使用 (github.com)
2 直接使用vegan的mantel函数进行mantel检验
这里基本是翻译了教程Mantel Test in R (jkzorz.github.io),作者写的很清晰,可以对mantel 检验做出基本的了解
首先读入文件
df <- read.csv("OTU_table.csv",sep="\t")
文件应读入以后应该这个样子:第一列是样品名称,接下来的4列包含每个样品的环境参数(盐度、温度)。其后2列包含每个样品的经纬度,其余各列是每个样品相对应的200多个OTU丰度(鸟枪法的宏基因组count/FPKM丰度也可以使用)。
然后创建三个subsets:丰度表,温度向量,经纬度表
#abundance data frame
abund = df[,8:ncol(df)]
#environmental vector
temp = df$Temperature
#longitude and latitude
geo = data.frame(df$Longitude, df$Latitude)
要把这些子集转换成距离矩阵,注意这里环境因子向量用的统计方法和丰度表不同,同时针对经纬度,我们用到了geosphere包的函数,计算haversine距离
#abundance data frame - bray curtis dissimilarity
dist.abund = vegdist(abund, method = "bray")
#environmental vector - euclidean distance
dist.temp = dist(temp, method = "euclidean")
#geographic data frame - haversine distance
d.geo = distm(geo, fun = distHaversine)
dist.geo = as.dist(d.geo)
现在我们可以运行mantel命令了:
#abundance vs environmental
abund_temp = mantel(dist.abund, dist.temp, method = "spearman",
permutations = 9999, na.rm = TRUE)
abund_temp
#abundance vs geographic
abund_geo = mantel(dist.abund, dist.geo, method = "spearman",
permutations = 9999, na.rm = TRUE)
abund_geo
#解释一下参数:
#method : 这里用了spearman相关系数,属于数据是非正态情况下使用的方法,如果数据具有正态性,尽量使用person相关系数
#permutations : Mantel检验通过排列(随机化)一个矩阵X次并观察统计量的预期分布来确定显著性。我倾向于选择一个较大的排列数,但如果计算能力较低,可以随意减少
#na.rm : 命令的可选添加,它告诉R删除缺少值的行
Mantel test 的输出是:
#abundance vs temperature test
> abund_temp
Mantel statistic based on Spearman's rank correlation rho
Call:
mantel(xdis = dist.abund, ydis = dist.temp, method = "spearman", permutations = 9999, na.rm = TRUE)
Mantel statistic r: 0.677
Significance: 1e-04
Upper quantiles of permutations (null model):
90% 95% 97.5% 99%
0.148 0.198 0.246 0.290
Permutation: free
Number of permutations: 9999
#abundance vs geography test
> abund_geo
Mantel statistic based on Spearman's rank correlation rho
Call:
mantel(xdis = dist.abund, ydis = dist.geo, method = "spearman", permutations = 9999, na.rm = TRUE)
Mantel statistic r: 0.1379
Significance: 0.0525
Upper quantiles of permutations (null model):
90% 95% 97.5% 99%
0.107 0.140 0.170 0.204
Permutation: free
Number of permutations: 9999
重点是两个值:
1 温度距离矩阵与物种Bray-Curtis矩阵有很强的关系(Mantel-R: 0.667, p值 = 1e-04)。换句话说,当样品在温度方面变得越来越不同时,它们在微生物群落组成方面也变得越来越不同。
2 物种Bray-Curtis矩阵与样品的地理分离关系不显著(Mantel-R: 0.138, p值= 0.052)。因此,当样品在物理上变得更加分离时,它们对应的微生物群落并不一定会变得更加不同。
如果对环境参数和微生物群落的总体影响感兴趣,可以将所有的环境参数合并到一个距离矩阵中,并测试这个矩阵与丰度数据的相关性:
#create environmental data frame
#make subset
env = df[,2:5]
#scale data
scale.env = scale(env, center = TRUE, scale = TRUE)
#create distance matrix of scaled data
dist.env = dist(scale.env, method = "euclidean")
#run mantel test
abund_env = mantel(dist.abund, dist.env, method = "spearman", permutations = 9999, na.rm = TRUE)
abund_env
这里需要在创建距离矩阵之前缩放环境数据(scale函数)。这是因为所有的环境变量都是用不同的指标来测量的,这些指标彼此之间没有可比性。
这里的结果是:
> abund_env
Mantel statistic based on Spearman's rank correlation rho
Call:
mantel(xdis = dist.abund, ydis = dist.env, method = "spearman", permutations = 9999, na.rm = TRUE)
Mantel statistic r: 0.6858
Significance: 1e-04
Upper quantiles of permutations (null model):
90% 95% 97.5% 99%
0.151 0.201 0.244 0.292
Permutation: free
Number of permutations: 9999
结果再次表明,累积环境因子与微生物群落高度相关(Mantel-R: 0.686, p值= 1e-04)。因为微生物群落与环境参数的相关性比地理距离的相关性更强,所以我会得出这样的结论:在这个系统中,环境对微生物群落是“选择”的,存在最小(或相对最小)的扩散限制。
3 使用ggcor 进行绘图
ggcor做出来的图真好看,所以建议希望做mantel检验的研究,都学习一下ggcor的可视化思路,不过这个可视化方法,最早是一篇science提出来的:
来源Structure and function of the global ocean microbiome | Science
不得不说,science的作者的作图能力是真的强,美观还好看。
然后作者 “厚缊” 尝试写了ggcor包,来复刻图片,不过目前作者把github上的包删除了,这里也不知道发生了什么,可能是版权问题?但是我们的目的只是作图,能用就好
然后是ggcor的教程,这里引用刘永鑫老师的的博客吧,(主要是中文的,我没必要再写一遍了,建议两篇博文都过一遍,对相关性的可视化有一个思路上的理解):
ggcor |相关系数矩阵可视化_刘永鑫Adam的博客-CSDN博客
最终版本Science级组合图表绘制_刘永鑫Adam的博客-CSDN博客
写完了,结束,收工! 😀 😀 😀
更正:经过测试,我发现ggcor目前安装上去以后,针对现在版本的vegan会出现bug 使用ggcor中的函数进行mantal test会出bug,我这里能想到的解决方法就是首先自己分别做mental test 然后将文件的R和P值构建成类似下图的表格,最后直接画图
再次更新,我发现作者换名字了:ggcor换成linkET了,各位可以去github上搜一下Hy4m/linkET (github.com)