mantel test 简单教程

由于论文问题,这里重做了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") 

文件应读入以后应该这个样子:
image.png

第一列是样品名称,接下来的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提出来的:

image.png

来源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值构建成类似下图的表格,最后直接画图

image.png

再次更新,我发现作者换名字了:ggcor换成linkET了,各位可以去github上搜一下Hy4m/linkET (github.com)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容