R语言并行计算加快土壤微生物生态学分析(1):spearman相关系数加快共现网络构建速度

生科云网址:https://www.bioincloud.tech本文由微科盟胡天龙根据实践经验而整理,希望对大家有帮助。微科盟原创微文,欢迎转发转载,转载须注明来源《微生态》公众号。共现网络 (co-occurrence network) 和群落构建 (assembly process) 分析日益成为微生物生态学分析中重要的组成部分,成为目前文章发表的热点技术。这些分析中往往会有大量的循环语句,如果顺序执行的话往往非常耗时。R语言的并行计算可以有效地解决耗时的问题,加快程序运行的速度。本文主要介绍如何利用R语言并行计算spearman相关系数,加快共现网络(co-occurrence network)构建速度。后期的的文章将逐一介绍群落构建分析的并行计算,包括R语言并行计算beta-NTI (beta-nearest taxon index)、β多样性零偏差 (null deviation of beta diversity) 和Raup-Crick距离 (Raup-Crick dissimilarity)。利用spearman相关性分析是构建共现网络的重要方法,但由于OTU table往往有成千上万行,用R自带的corr.test()函数计算较为费时,严重制约我们的分析速度。对spearman相关性分析进行并行化运行可大大节省计算时间,为此我们手写了spearman相关性分析函数来实现并行化运行。为方便讲解,本文以我们常见的OTU table 数据为例(联系您所添加的任一微科盟组学老师即可免费领取),对OTU进行两两spearman相关性分析,获得相关系数r和显著性p值。我们将自己手写的函数network_construct()与psych包中的corr.test()函数两者运行时间和计算的结果进行了比较,我们自己的函数network_construct()计算时间远远少于corr.test()函数且结果相同,具体的R代码见下文。如果对您有帮助,请三连一波哦~点赞,在看,转发!!!运行步骤我们经常使用corr.test () 函数计算OTU之间的相关性,但该函数在面对较多的OTU时速度较慢。library(psych)system.time(corr.test(otu[,1:500],use="pairwise",method="spearman",adjust="fdr",alpha=.05))运行时间如下:(elapsed栏为程序运行的时间)

图1 原函数运行时间为了加快计算速度,我们根据相关系数矩阵的计算特点,进行了并行化重写,代码如下:#otu_table行名为样点名,列名为OTU名#threads为使用的CPU核数#本函数默认使用'fdr’进行P值矫正,可参考corr.test()函数的R帮助文档network_construct <- function(otu_table,threads){library(foreach)library(doParallel)library(abind)otu_table2 <- apply(otu_table,2,rank)r <- function(rx,ry){n <- length(rx)lxy <- sum((rx-mean(rx))*(ry-mean(ry)))lxx <- sum((rx-mean(rx))^2)lyy <- sum((ry-mean(ry))^2)r <- lxy/sqrt(lxx*lyy)t <- (r * sqrt(n - 2))/sqrt(1 - r^2)p <- -2 * expm1(pt(abs(t), (n - 2), log.p = TRUE))return(c(r,p))}arraybind <- function(...){abind(...,along = 3,force.array=TRUE)}nc <- ncol(otu_table)registerDoParallel(cores = threads)corr <- foreach (i = 1:nc,.combine = "arraybind") %dopar%{corr1 <- matrix(rep(0,2*nc),nrow = 2,ncol=nc)for(j in 1:nc) {if(j > i) corr1[,j] <- r(otu_table2[,i],otu_table2[,j])}corr <- corr1}rr <- corr[1,,]rr <- rr+t(rr)diag(rr) <- 1pp <- corr[2,,]lp <- lower.tri(pp)pa <- pp[lp]pa <- p.adjust(pa, "fdr")pp[lower.tri(pp, diag = FALSE)] <- papp <- pp+t(pp)rownames(pp) <- colnames(otu_table)colnames(pp) <- colnames(otu_table)rownames(rr) <- colnames(otu_table)colnames(rr) <- colnames(otu_table)return(list(r = rr,p = pp))}使用我们自己构造的函数后,可利用10核进行计算,运行时间如下:

图2 自建函数十核运行时间我们可以看到使用corr.test () 函数进行计算需要313秒,而使用R代码进行并行计算仅需0.99秒。我们再比较一下不同线程情况下所需的时间。单核运行代码如下:system.time(network_construct(otu[,1:500],1))

图3 自建函数单核运行时间即使使用单核进行计算速度,也要比corr.test () 函数快上很多,毕竟该函数里面有很多判断语句, 计算更加费时。当我们加大数据量时,单核和多核的区别就更加明显。下图是单核与10核运行的比较:

图4 自建函数单核与十核运行时间的比较我们可以看到计算量越大,多核的性能就越优越。当我们有成千上万个OTU时可以节省很多时间。那么我们运行的结果与corr.test () 函数的结果是否一致呢?res1<- corr.test(otu[,1:50],use="pairwise",method="spearman",adjust="fdr",alpha=.05)res2 <- network_construct(otu[,1:50],10)res1$r[1:5,1:5]res2$r[1:5,1:5]将我们构建的函数network_construct () 与psych包中的corr.test () 的结果进行比较,结果如下:

图5 自建函数与原函数结果比较我们计算的结果与原函数的结果完全相同,可以放心使用哈,现在就可以把我们的函数复制过去用于自己的项目啦。

(0)

相关推荐

  • 一文构建微生物群落sparcc网络

    数据代码文件打包 欢迎加入微生信生物讨论群,扫描下方二维码添加小编微信,小编带你入伙啦,大牛如云,让交流变得简单.(记得备注姓名-研究方向-单位,防止不小心忽略) 微生物群落构建sparcc网络-一文 ...

  • 学习微生物组数据比较成熟的R包microbiome

    learning_microbiome_2 这两个包的安装比较麻烦 无法下载得到github包,或者无法安装后,将github包手动下载下来,解压之后定位文件夹名称后安装 这部分用来学习微生物组成的操 ...

  • 16s分析之进化树+差异分析(二)

    上回我们说到,R语言16s进化树的构建,单单一个优秀的进化树对于我们不是做进化的人来讲,还是不够,有些华而不实,但是Y叔这个ggtree功能当然不止如此,Y叔也经常宣称其为真正的'支持图形语法':相比 ...

  • 在ggClusterNet中仿造cytosccape添加多行的聚类布局

    写在前面 算法肯定不同,功能相近. 时间戳:现在2020年8月8日,我在上周便构造了这个函数,用于模仿cytoscape网络的矩阵布局.类似下图的样式. 但是我觉得这个算法我写的不够完善,后面应该还会 ...

  • python非线性相关系数计算

    https://blog.csdn.net/u012325865/article/details/88421813 pandas中DataFrame对象corr()方法的用法,该方法用来计算DataF ...

  • 70+篇PQ/PP/PBI文章视频,除了链接,竟然还有内容要点!

    最近一直在尝试对以往所写文章或所录视频内容进行梳理,考虑到大家在查找文章时可能存在的麻烦,于是将文章或视频的内容要点进行较全面的罗列.目前已完成以下70+篇文章(部分视频)的整理,后续继续努力,争取把 ...

  • R语言实现LEfse分析从数据整理到树形图绘制

    R语言完整的Lefse分析 写在前面 怎么说呢,我在之前的推送中,在R语言中实现了LEFse分析过程.但是我没有将数据前处理和结果的物种分类图形做出来.这是一定要在R语言中操作的,要不然,仅仅是实现了 ...

  • 16s分析之FishTaco分析

    一次偶然的机会我看到了这篇文章,发表于Cell Host & Microbe上,这个期刊也不怎么熟悉,就点了WB上的期刊信息: Systematic Characterization and ...

  • 如何用Matlab计算相关系数和偏相关系数

    在脑科学领域的研究中,进行相关分析必不可少,比如说,我们想知道计算出来的某个指标是否与临床数据或行为学数据之间存在正相关或负相关关系.计算相关系数,最常用的是Pearson相关系数和Spearman相 ...

  • 【R分享|实战】科白君教你相关性分析及其绘图

    "R实战"专题·第7篇   编辑 | 科白维尼   1898字 | 4分钟阅读 本期推送内容 相关性分析通常用来定量描述两个变量之间的联系,正相关?负相关?不存在相关?等.常见相关 ...

  • 一条函数使用三种方法检测群落差异(MRPP,anosim,adonis)

    写在前面 微生物生态学领域经常要使用三种差异分析方法,分别似乎MRPP,anosim,adonis.很多人也问,到底使用哪种方法比较好,当然也有一些博文对他们有过简单的区别,但是目前没什么大的不同.这 ...

  • 当韦恩图和upset都不能满足我的可视化要求

    当韦恩图和upset都不能满足我的可视化要求

  • 16s分析之差异分析(DESeq2)

    今天我们来学习R语言DESeq2包,原理什么的后不说,在操作过程中点缀一下,等四个差异包推送完成后,咱们在对这四个包做差异分析的原理做一个比较分析: 这个包适用于: 高通量数据分析过程中,基于coun ...

  • 你认为alpha多样性一定要用OTU来分析吗?

    写在前面 alpha多样性主要包括三方面内容:多样性,丰富度和均匀度.就扩增子数据来说,大部分的文章都是使用OTU来做多样性分析.但是长期以来我们都知道,OTU多样性并不是真正的物种.最近看到一篇文章 ...

  • 生信技能树-R语言视频课听后感 (10万+的播放量就看这个春节)

    应该是我自己的学徒就贡献了一半的学习量吧,距离我夸下海口的10万工程师相差甚远,所以非常有必要放一些导学笔记,这个春节,难度你没有发现特别适合猫在家听视频搞学习吗?而且我们还有一系列免费数据分析提供给 ...

  • 微生物组数据再也别用相对丰度了,结合RastStat完美展示OTU

    写在前面 题目错误,更正为:EasyStat包.我们在分析群落数据的时候,往往相对丰度转化后就展示了,在差异分析中往往使用相对丰度做差异分析不是上上策,因为目前edger和Desep2包中的标准化方式 ...