问题描述
使用曼特尔检验(mantel test)来实现微生物组高维数据相关性分析
实现方法
R语言Vegan软件包
实例操作
这里选择宏基因组数据进行分析,包括两个类群的物种丰度数据(MT1和MT2)和两个基因(Gene1和Gene2)的丰度数据。目的是看两个类群的微生物与目标基因之间存在什么关联(正负相关或不相关)。
数据一览
代码计算
基于vegan软件包mantel()
函数的mantel test分析流程相当简单,代码如下:
#加载包
library(vegan)
#设置文件输入路径
setwd("My_direction")
#输入数据
MT1 <- read.csv("MT1.csv", header = T, row.names = 1, check.names = F)
MT2 <- read.csv("MT2.csv", header = T, row.names = 1, check.names = F)
Gene1 <- read.csv("Gene1.csv", header = T, row.names = 1, check.names = F)
Gene2 <- read.csv("Gene2.csv", header = T, row.names = 1, check.names = F)
#计算输入数据的距离矩阵
MT1_DM <- vegdist(MT1, method = "bray")
MT2_DM <- vegdist(MT2, method = "bray")
Gene1_DM <- vegdist(Gene1, method = "euclidean")
Gene2_DM <- vegdist(Gene2, method = "euclidean")
#这里,对于多维数据的距离矩阵计算,使用bray-curtis算法;对于单变量(一维)数据,使用euclidean算法
#执行mantel test检验
set.seed(520) #设置随机种子,保证相同数据每次执行结果都一样
mantel(MT1_DM, Gene1_DM, method="spearman", permutations=9999) #计算MT1类群与Gene1的相关性
##这里,置换检验9999次,可更改以比较结果差异
输出结果
MT1类群与Gene1之间关系为显著正相关
一些说明及疑问
1,由于我使用mantel test检验的数据比较少,所以我是通过更改mantel()
函数中的距离矩阵来实现不同变量间的分析,因此这些代码不能一次输出所有想要的结果,只能输出一次记录一次;
2,关于mantel test分析,我从没有发现过负显著相关的结果(以p = 0.05为分割),不论是我自己的分析或者是别人已发表的文章都是如此,这是相当令人不解的。如果你发现了负显著相关,烦请留言;
3,假设你有一组数据,包含一个类群的微生物及一个基因,且这些类群微生物的单个微生物相对丰度对这个基因都是显著负相关关系,这时如果你执行这个类群与基因的mantel test,你会发现呈现出一个要么负的不显著、要么正的不显著、要么正的显著的相关性,但不会出现负显著相关的结果。这也让人不解。我的理解是,mantel test需要进行一次距离矩阵的计算,再进行相关性分析,这样相当于对数据进行的二次处理了,故其结论是比不上直接计算单个微生物与基因关系妥当的(即这些微生物与基因之间的关系是负相关,而不是正相关或不相关)。