专栏名称: 生信菜鸟团
生信菜鸟团荣誉归来,让所有想分析生物信息学数据的小伙伴找到归属,你值得拥有!
目录
相关文章推荐
BioArt  ·  ​PNAS丨常蕾、任兵评述FOODIE-基于 ... ·  3 天前  
BioArt  ·  Science丨神经元- ... ·  3 天前  
生物制品圈  ·  冷冻干燥热敏性药物:含有机共溶剂 + 水的配方 ·  5 天前  
51好读  ›  专栏  ›  生信菜鸟团

用 SPIEC-EASI 进行微生物网络分析

生信菜鸟团  · 公众号  · 生物  · 2020-10-18 22:00

正文

之前的文章 中我们提到,由于微生物组数据之间的非独立性,往往会导致传统相关性计算方法(Pearson)出现偏差。除了 SparCC 之外, SPIEC-EASI ( SP arse I nvers E C ovariance Estimation for E cological A ssociation I nference,读作 speakeasy )也是一种常用的统计方法。这种方法将针对组成数据开发的数据转换方法与稀疏图形模型推理框架相结合,使用稀疏邻域和逆协方差选择算法构建微生物组网络,该流程封装于 SpiecEasi R 包中。

Sparse and compositionally robust inference of microbial ecological networks. PLoS Comput. Biol. 2015; 11: e1004226

GitHub 地址:https://github.com/zdk123/SpiecEasi

相关性分析和条件独立性

在一个生态系统中,任何 OTU 的丰度都可能依赖于其他 OTU 的丰度。下面我们定义一个场景:OTU 3 可(通过某种生物学机制)直接影响 OTU 1、2 和 4,OTU 1、2 和 4 之间并无直接关联。

根据上图中的关系,我们模拟了一个包含五百个样本的虚拟数据集(绝对丰度):

根据丰度矩阵我们可计算这四个物种的 Pearson 相关性矩阵(正相关为绿色,负相关为红色)。

不同阈值可绘制不同的网络关系。比如以 ρ≥|0.35| 为阈值(虚线),网络中 OTU 3 将连接到所有其他 OTU,而且 OTU 2 和 OTU 4 之间还多了一个连接。但若使用更严格的ρ≥|0.5| 为阈值(实线),将导致更稀疏的相关性网络,缺失 OTU 3 和 OTU 1 之间的联系。

但更关键的是,用这种方法没有一个阈值可以恢复真正的网络关系。

SPIEC-EASI 所使用的逆样本协方差矩阵也是一个对称矩阵,如果 OTU 关系是独立的,则值近似为零。所以根据样本逆协方差的方法选择阈值,可以恢复真实的网络。

而对于相关性或协方差方法(如 SparCC 和 CCREPE)则不能保证存在这样的阈值。

SPIEC-EASI 分析流程

SPIEC-EASI 流程主要分三个阶段进行:首先,对数据进行预处理,进行 中心对数比转换(CLR) ,确保组成数据的鲁棒性。第二步,选择图形模型推断方法:1)邻域选择(MB 方法)或 2)逆协方差选择(glasso 方法,默认值)。SPIEC-EASI 网络推论假设基础网络稀疏。通过一种叫 Stability Approach to Regularization Selection (StARS)的 bootstrap 方法,对数据集进行随机子采样,在所选边集中找到可靠网络,以推断正确的模型稀疏度。SPIEC-EASI 输出包括网络(来自逆协方差网络的非零项)和一个逆协方差矩阵。

安装

library(devtools)install_github("zdk123/SpiecEasi")library(SpiecEasi)

基本用法

SpiecEasi 一行命令即可完成整个流程,这里我们使用基于 American Gut 的示例数据,同时比较 MB 方法和 glasso 方法以及 SparCC 结果之间的区别。

data(amgut1.filt)se.mb.amgut  spiec.easi(amgut1.filt, method='mb', lambda.min.ratio=1e-2,                          nlambda=20, pulsar.params=list(rep.num=50))se.gl.amgut  spiec




    
.easi(amgut1.filt, method='glasso', lambda.min.ratio=1e-2,                          nlambda=20, pulsar.params=list(rep.num=50))sparcc.amgut  sparcc(amgut1.filt)## 定义 SparCC 阈值sparcc.graph  abs(sparcc.amgut$Cor) >= 0.3diag(sparcc.graph)  0library(Matrix)sparcc.graph  Matrix(sparcc.graph, sparse=TRUE)## 创建 igraph 对象ig.mb      adj2igraph(getRefit(se.mb.amgut))ig.gl      adj2igraph(getRefit(se.gl.amgut))ig.sparcc  adj2igraph(sparcc.graph)

igraph 可视化:

library(igraph)## set size of vertex proportional to clr-meanvsize     rowMeans(clr(amgut1.filt, 1))+6am.coord  layout.fruchterman.reingold(ig.mb)par(mfrow=c(1,3))plot(ig.mb, layout=am.coord, vertex.size=vsize, vertex.label=NA, main="MB")plot(ig.gl, layout=am.coord, vertex.size=vsize, vertex.label=NA, main="glasso")plot(ig.sparcc, layout=am.coord, vertex.size=vsize, vertex.label=NA, main="sparcc")

由于 SPIEC-EASI 基于惩罚估计量,因此边缘权重无法直接与 SparCC(或Pearson/Spearman相关系数)相比较,需要进行调整。

library(




    
Matrix)secor   cov2cor(getOptCov(se.gl.amgut))sebeta  symBeta(getOptBeta(se.mb.amgut), mode='maxabs')elist.gl      summary(triu(secor*getRefit(se.gl.amgut), k=1))elist.mb      summary(sebeta)elist.sparcc  summary(sparcc.graph*sparcc.amgut$Cor)hist(elist.sparcc[,3], main='', xlab='edge weights')hist(elist.mb[,3], add=TRUE, col='forestgreen')hist(elist.gl[,3], add=TRUE, col='red')

比较不同方法推断出的网络性质。

dd.gl      degree.distribution(ig.gl)dd.mb      degree.distribution(ig.mb)dd.sparcc  degree.distribution(ig.sparcc)plot(0:(length(dd.sparcc)-1), dd.sparcc, ylim=c(0,.35), type='b',      ylab="Frequency", xlab="Degree", main="Degree Distributions")points(0:(length(dd.gl)-1), dd.gl, col="red" , type='b')points(0:(length(dd.mb)-1), dd.mb, col="forestgreen", type='b')legend("topright", c("MB", "glasso", "sparcc"),        col=c("forestgreen", "red", "black"), pch=1, lty=1)

用 phyloseq 对象构建网络

phyloseq 对象 可直接导入 SpiecEasi 流程进行相关性分析。







请到「今天看啥」查看全文