微生物联合挖掘教程连载-PC-10-网络稳定性分析、分组之间距离比较和可视化、网络模块化分析

学术   2024-10-01 17:01   江苏  

主编寄语

微生物组发展到现在,相关分析技术和体系已经十分成熟,而微生物组数据的分析方法更是各式各样,我们借助“R语言在微生物组的最佳实践”这篇之前我们发表的论文带领大家从简单到困难,从基础到流程,从单一功能到组合功能,从上游分析到下游分析的全部代码。全套流程全部借助于Rstudio作为平台,在win和linux和mac下都可以完善运行,大家可以自己准备相关硬件资源,跟着我们这批教程进行全面学习。
这篇综述是我们小组在2023年发表在protein cell 期刊,整体内容几乎囊括了微生物组数据分析的全部内容,代码脚本有2w+行,全部属于公开分享阶段,但由于内容很多,为了方便大家理解和使用学习,这里选择分期带大家运行。
微生信生物分享的这批内容经过如下步骤:
同学A进行代码整理运行,基础注释书写,形成分享稿件的基本样貌;
同学B对代码复现一遍,解决其中无法顺利运行的地方,以及再次注释内容无法让自己明白的地方,完善分享稿件;
同学C再次运行一遍,进行全部流程代码学习,继续注释自己不明白的地方,最终形成完善分享稿件。

我们希望通过这个教程带领需要学习的小伙伴开启全民免费学习微生物组联合挖掘时代。给大家尽量做高质量的教程;

写在前面

“R语言在微生物组的最佳实践”的综述流程,我们已经学习了9节,今天我们继续开始前面的基础分析。
今天继续带大家学习一下:网络分析
需要注意的是:每次分析之前,需要加载”数据分析准备“ 这一节的代码,才可以开始下游分析。
这次的分享内容希望能够帮助大家更加深入的挖掘自己的数据,给大家带来分析数据的便捷,同时也欢迎大家可以引用我们的文章。
下面是文章的具体信息:
Wen, T., et al., The best practice for microbiome analysis using R. Protein & Cell, 2023. 14(10): p. 713-725.
文章链接:https://doi.org/10.1093/procel/pwad024
流程实践数据:https://github.com/taowenmicro/EasyMicrobiomeR

数据代码获取地址

数据地址:https://github.com/taowenmicro/EasyMicrobiomeR/tree/master/data
全套数据代码整套流程下载地址:https://github.com/taowenmicro/EasyMicrobiomeR/tree/master

实例介绍

以下图片来自“Learning from Seed Microbes: Trichoderma Coating Intervenesin Rhizosphere Microbiome Assembly”文章,于2023年发表于Microbiology Spectrum,查看链接https://journals.asm.org/doi/full/10.1128/spectrum.03097-22#/
例书写参考:
Display of the stability of the microbial network in the coated and control watermelon.

网络分析:主要基于ggClusterNet R包具体可以查看这篇文章:https://onlinelibrary.wiley.com/doi/full/10.1002/imt2.32#/

实践操作

一些概念
网络稳定性:指微生物组中物种相互作用的网络能够抵抗外界干扰并维持其结构和功能的能力。
抵抗力:网络在面对干扰(如环境变化、物种入侵或移除)时保持不变的能力。
恢复力:网络在遭受干扰后恢复到原有状态的能力。
网络稳定性分析可以做什么:
生态系统评估:通过分析微生物组网络的稳定性,可以评估生态系统的健康状况和生物多样性的丰富程度。
环境变化影响:预测环境压力(如气候变化、污染)对微生物群落结构和功能的潜在影响。
关键物种识别:识别对网络稳定性贡献大的关键物种,为保护和管理生态系统提供依据。
微生物间研究:增进对微生物组内相互作用、物种共存机制及群落构建过程的理解。
特点
复杂性:考虑微生物组内复杂的物种相互作用,包括正相互作用(如共生、互利共生)和负相互作用(如竞争、捕食)。
动态性:分析微生物组网络随时间和环境条件变化的动态特性。
模块化:识别网络中的模块,理解不同模块间的相互作用及其对整体网络稳定性的影响。
多尺度性:可以在多个尺度上进行分析。
应用场景:
环境监测:评估环境压力对微生物群落的影响。
农业土壤管理:理解土壤微生物组对作物健康的影响。
生物修复:设计微生物组以提高污染物的生物降解效率。

network stability analysis(网络稳定性分析)

网络稳定性分析是研究网络系统在受到外部扰动或内部变化时,能否保持或恢复到其正常运行状态的科学。它在不同的学科领域中有着不同的定义和研究重点,但通常关注以下几个核心概念特点:
稳定性(Stability):通常指系统在受到临时扰动后返回到一个特定稳态的能力。稳定性分析关注系统在扰动后能否保持其功能和结构的完整性。
鲁棒性(Robustness):衡量的是当网络的一部分节点或边失效时,网络维持连通的能力。它与网络的静态结构有关,强调网络对故障的抵抗能力。
抗毁性:在复杂网络中,抗毁性研究网络在遭受攻击或故障时保持功能的能力,包括随机攻击和针对性攻击下的表现。
在网络稳定性计算中,负相关(NegativeCorrelation)通常指的是网络中两个或多个节点之间的一种关系,其中当一个节点的状态或行为向某个方向变化时,另一个节点的状态或行为则向相反的方向变化。
library(ggClusterNet)library(phyloseq)library(tidyverse)library(igraph)library(tidyfst)
netpath = paste(otupath,"/network_stab/",sep = "")dir.create(netpath)ps = ps0res = module.compare.m( ps = ps, Top = 200, degree = TRUE, zipi = FALSE, r.threshold= 0.8, p.threshold=0.05, method = "spearman", padj = F, n = 3)
p = res[[1]]p
dat = res[[2]]head(dat)dat2 = res[[3]]head(dat2)dat2$m1 = dat2$module1 %>% strsplit("model") %>% sapply(`[`, 1)
dat2$m2 = dat2$module2 %>% strsplit("model") %>% sapply(`[`, 1)dat2$cross = paste(dat2$m1,dat2$m2,sep = "_Vs_")
head(dat2)
p2 = ggplot(dat2) + geom_bar(aes(x = cross,fill = cross)) + labs(x = "", y = "numbers.of.similar.modules" )+ theme_classic()
p2getwd()library(ggplot2)#--发现分组1和分组3网络更相似一些FileName <- paste(netpath,"module.compare.groups.pdf", sep = "")ggsave(FileName, p, width = 10, height = 10)
FileName <- paste(netpath,"numbers.of.similar.modules.pdf", sep = "")ggsave(FileName, p2, width = 8, height = 8)
FileName <- paste(netpath,"module.otu.csv", sep = "")write.csv(dat,FileName, quote = F)
FileName <- paste(netpath,"module.compare.groups.csv", sep = "")write.csv(dat2,FileName, quote = F)
```### 鲁棒性```{r}

#--随即取出任意比例节点-网络鲁棒性#---------res = Robustness.Random.removal(ps = ps, Top = 500, r.threshold= 0.8, p.threshold=0.05, method = "spearman")p = res[[1]]pdat = res[[2]]head(dat)

# dir.create("./Robustness_Random_removal/")path = paste(netpath,"/Robustness_Random_removal/",sep = "")fs::dir_create(path)write.csv(dat, paste(path,"random_removal_network.csv",sep = ""))ggsave(paste(path,"random_removal_network.pdf",sep = ""), p,width = 8,height = 4)

res= Robustness.Targeted.removal(ps = ps, Top = 500, degree = TRUE, zipi = FALSE, r.threshold= 0.8, p.threshold=0.05, method = "spearman")
p = res[[1]]pdat = res[[2]]
path = paste(netpath,"/Robustness_Targeted_removal/",sep = "")fs::dir_create(path)write.csv(dat, paste(path,"Robustness_Targeted_removal_network.csv",sep = ""))ggsave(paste(path,"Robustness_Targeted_removal_network.pdf",sep = ""), p,width = 8,height = 4)

网络易损性

res = Vulnerability.micro(ps = ps,                          Top = 500,                          degree = TRUE,                          zipi = FALSE,                          r.threshold= 0.8,                          p.threshold=0.05,                          method = "spearman")
p = res[[1]] + theme_bw()pdat = res[[2]]
path = paste(netpath,"/Vulnerability/",sep = "")fs::dir_create(path)
write.csv(dat, paste(path,"Vulnerability_network.csv",sep = ""))ggsave(paste(path,"Vulnerability_network.pdf",sep = ""), p,width = 4,height = 4)

计算负相关的比例

id <- sample_data(ps)$Group %>% unique()res = negative.correlation.ratio(ps = ps,                                 Top = 500,                                 degree = TRUE,                                 zipi = FALSE,                                 r.threshold= 0.8,                                 p.threshold=0.05,                                 method = "spearman",                                 corg = NULL)
p = res[[1]]pdat = res[[2]]head(dat)

path = paste(netpath,"/Vulnerability/",sep = "")fs::dir_create(path)
write.csv(dat, paste(path,"Vnegative.correlation.ratio_network.csv",sep = ""))ggsave(paste(path,"negative.correlation.ratio_network.pdf",sep = ""), p,width = 4,height = 4)

网络抗毁性

# library(tidyfst)library("pulsar")# library(ggClusterNet)# library(phyloseq)# library(tidyverse)id = sample_data(ps)$Group %>% unique()res = natural.con.microp (  ps = ps,  Top = 500,  r.threshold= 0.6,  p.threshold=0.05,  method = "spearman",  norm = F,  end = 150,# 小于网络包含的节点数量  start = 0,  con.method = "pulsar")
p = res[[1]]pdat = res[[2]]
path = paste(netpath,"/Natural_connectivity/",sep = "")fs::dir_create(path)
write.csv(dat, paste(path,"/Natural_connectivity.csv",sep = ""))ggsave(paste(path,"/Natural_connectivity.pdf",sep = ""), p,width = 5,height = 4)

network modularity analysis- Module eigenvectors(网络模块化分析-模块特征向量)

id = sample_data(ps)$Group %>% unique()idi = 1netpath = paste(otupath,"/network3_MEs/",sep = "")dir.create(netpath)netpath;library(ggClusterNet)library(igraph)for (i in 1:length(id)) {  ps.1 = phyloseq::subset_samples(    ps,Group %in% c(id[i])  )    result = network.2(ps = ps.1, N = 500,                     big = TRUE,                     select_layout = TRUE,                     layout_net = "model_maptree",                     r.threshold=0.8,                     p.threshold=0.05,                     label = FALSE,                     path = netpath,                     zipi = F,                     ncol = 1,                     nrow = 1,                     # method = "sparcc",                     fill = "Phylum"  )    # 节点的模块化信息的输出 group列为模块化信息  tem <- ggClusterNet::model_maptree(cor =result[[4]],                                     method = "cluster_fast_greedy",                                     seed = 12  )  node_model = tem[[2]]  head(node_model)  tablename <- paste(netpath,"/node_model",".csv",sep = "")  write.csv(node_model,tablename)  head(node_model)  otu = ps.1 %>%     filter_OTU_ps(500) %>%    vegan_otu() %>%    as.data.frame()  node_model = node_model[match(colnames(otu),node_model$ID),]    MEList = WGCNA::moduleEigengenes(otu, colors = node_model$group)  MEs = MEList$eigengenes %>% as.data.frame()  tablename <- paste(netpath,"/",id[i],"node_characteristic_variables",".csv",sep = "")  write.csv(MEs,tablename)  }

detach("package:igraph")

Comparison and visualization of distances between groups(分组之间距离比较和可视化)

概念:分组之间距离比较通常指的是在数据分析中对不同组(或群组、类别)之间的差异进行量化和比较。这种距离可以是实际的物理距离、统计学上的偏差,或者是通过某些算法计算得到的抽象距离。
应用场景:
统计分析:在统计学中,比较不同群体之间的均值差异。
机器学习:在聚类分析中,比较不同群组的中心点距离。
复杂网络:在网络科学中,比较不同网络或网络中不同社区的连接距离
group = "Group"  map = as.data.frame(sample_data(ps))  alppath = paste(otupath,"/distance/",sep = "")  dir.create(alppath)  gro = map[,group] %>% unique()  colnames(gro) = "group"  conbgroup = combn(gro$group,2)  # 计算包括终点均值的所有样品bray距离  bray_curtis = vegan::vegdist(vegan_otu(ps), method = "bray")  bray_curtis = as.matrix(bray_curtis)    for (i in 1:dim(conbgroup)[2]) {    a = conbgroup[,i]    map = as.data.frame(sample_data(ps))    # head(map)        chose1 = map[as.matrix(map[,group]) %>% as.vector() == a[1],] %>% row.names()    chose2 = map[as.matrix(map[,group]) %>% as.vector() == a[2],] %>% row.names()        dat = data.frame(group = paste(a[1],a[2],sep = "_VS_"), Distance =bray_curtis[chose1,chose2] %>% as.dist() %>% as.vector() )    head(dat)        if (i == 1) {      table = dat    }        if (i != 1) {      table = rbind(table,dat)    }  }    head(table)  table$id = 1:dim(table)[1]  data <- table %>% dplyr::select(id,everything())      result = EasyStat::MuiKwWlx(data = data,num = c(3))  FileName <- paste(alppath,"/distance_label.csv", sep = "")  write.csv(result,FileName,sep = "")  FileName <- paste(alppath,"/distance_index.csv", sep = "")  write.csv(data,FileName,sep = "")    result1 = EasyStat::FacetMuiPlotresultBox(data = data,num = c(3),result = result,sig_show ="abc",ncol = 1 )  p1_1 = result1[[1]] +     # scale_x_discrete(limits = axis_order) +     mytheme2 +    guides(fill = guide_legend(title = NULL)) +    scale_fill_manual(values = colset4)  p1_1  res = EasyStat::FacetMuiPlotresultBar(data = data,num = c(3),result = result,sig_show ="abc",ncol = 1)  p1_2 = res[[1]]+     # scale_x_discrete(limits = axis_order) +     guides(color = FALSE) +    mytheme2+     guides(fill = guide_legend(title = NULL))+    scale_fill_manual(values = colset4)  p1_2  res = EasyStat::FacetMuiPlotReBoxBar(data = data,num = c(3),result = result,sig_show ="abc",ncol = 1)  p1_3 = res[[1]]+     # scale_x_discrete(limits = axis_order) +     mytheme2 +     guides(fill = guide_legend(title = NULL))+    scale_fill_manual(values = colset4)  p1_3  FileName <- paste(alppath,"distance_box", ".pdf", sep = "")  ggsave(FileName, p1_1, width = ((4+ gnum) ), height =8,limitsize = FALSE)    FileName <- paste(alppath,"distance_bar", ".pdf", sep = "")  ggsave(FileName, p1_2, width = ((4+gnum) ), height = 8,limitsize = FALSE)    FileName <- paste(alppath,"distance_boxbar", ".pdf", sep = "")  ggsave(FileName, p1_3, width = ((4+gnum) ), height = 8,limitsize = FALSE)    FileName <- paste(alppath,"distance_box", ".jpg", sep = "")  ggsave(FileName, p1_1, width = (( 4+gnum) ), height =8,limitsize = FALSE)    FileName <- paste(alppath,"distance_bar", ".jpg", sep = "")  ggsave(FileName, p1_2, width = ((4+ gnum) ), height = 8,limitsize = FALSE)    FileName <- paste(alppath,"distance_boxbar", ".jpg", sep = "")  ggsave(FileName, p1_3, width = ((4+ gnum) ), height = 8,limitsize = FALSE)

运行时的错误

Error in full_join(., igraph.degree, na_matches = "never") :
could not find function "full_join"

library(dplyr)
就可以解决

Error in ggplot() : could not find function "ggplot"

library(ggplot2)
就可以解决

Error in as.tibble(.) : could not find function "as.tibble"

library(tibble)可以解决

Error in (function (cond) :
在为'taxa_are_rows'函数选择方法时评估'physeq'参数出了错: object of type 'closure' is not subsettable

这个错误是加载的R包与phyloseq包发生冲突,我是重新打开Rstudio运行必要的参数后直接开始运行相关代码,没有报错。这里可以只导入必要的数据和R包,其他没必要的R包可以不加载,以免导致R包冲突。

根际互作生物学研究室 简介

根际互作生物学研究室是沈其荣院士土壤微生物与有机肥团队下的一个关注于根际互作的研究小组。本小组由袁军教授带领,主要关注:1.植物和微生物互作在抗病过程中的作用;2 环境微生物大数据整合研究;3 环境代谢组及其与微生物过程研究体系开发和应用。团队在过去三年中在 Nature Communications,ISME J,Microbiome,SCLS,New Phytologist,iMeta,Fundamental Research, PCE,SBB,JAFC(封面),Horticulture Research,SEL(封面),BMC plant biology等期刊上发表了多篇文章。欢迎关注 微生信生物 公众号对本研究小组进行了解。


撰写:牛国庆 文浩仰

修改:文涛

排版:杨雯儀

审核:袁军

团队工作及其成果 (点击查看)

了解 交流 合作



    • 小组负责人邮箱 袁军:junyuan@njau.edu.cn;

    • 小组成员文涛:taowen@njau.edu.cn等

    • 团队公众号:微生信生物 添加主编微信,或者后台留言。


    • 加主编微信 加入群聊

      目前营销人员过多,为了维护微生信生物3年来维护的超5500人群聊,目前更新进群要求:

      • 1.仅限相关专业或研究方向人员添加,必须实名,不实名则默认忽略。

      • 2.非相关专业的其他人员及推广宣传人员禁止添加。

      • 3.添加主编微信需和简单聊一聊专业相关问题,等待主编判断后,可拉群。

      • 微生信生物VIP微信群不受限制,给微生信生物供稿一次即可加入(群里发送推文代码+高效协助解决推文运行等问题+日常问题咨询回复)。

    • 团队关注

    • 团队文章成果

    • 团队成果-EasyStat专题

    • ggClusterNet专题

    • 袁老师小小组


微生信生物
根际互作生物学研究室是沈其荣院士土壤微生物与有机肥团队下的一个关注于根际互作的研究小组。本小组由袁军教授带领,主要关注:1.植物和微生物互作在抗病过程中的作用 2 环境微生物大数据整合研究3 环境代谢组及其与微生物过程研究体系开发
 最新文章