微生物群落关键种识别:一种不依赖于网络的自上而下的方法

news2024/10/7 8:20:18

  微生物群落在促进养分循环、协助植物生长、维持人体健康等方面发挥着重要的作用。群落关键种对维持微生物群落稳定性具有重要影响,识别关键种一直是微生物生态学中的热点话题。识别关键种主要有两种框架:数据驱动的方法(data driven method)去除实验(perturbation experiment)。其中数据驱动的方法主要有三种:

  • 基于共现网络的方法
  • top-down方法
  • 基于深度学习的方法

注意:数据驱动的方法确定的关键种只是可能的关键种,还需要通过去除实验进一步地验证。

  • 基于共现网络的方法主要包括:构建共现网络→划分模块→计算模块间连通度和模块内连通度→确定关键种,该方法已在之前的博客中有所介绍:计算网络节点模块内连通度(within modular degree)和模块间连通度(between modular degree)。
  • 基于深度学习的方法:这里先做个预告,代码和数据都整理好了,预计下周上线,具体可参考论文Identifying keystone species in microbial communities using deep learning
  • 本文主要介绍top-down方法,该方法源于论文:Top-down identification of keystone taxa in the microbiome。该方法通过计算Empirical Presence-abundance Interrelation (EPI)来衡量物种的重要性。

EPI指标计算的流程是:

  1. 根据物种i的有-无划分为两组:
  2. 将该物种去除,并将剩余物种的相对丰度标准化,使其和为1;
  3. 然后计算组和组的距离,即该物种的重要性,EPI;
  4. 物种EPI高于平均值+两个标准差的物种可以确定为关键种。

这里的某物种 i i i 的EPI有三种衡量方法:
在这里插入图片描述
D 1 i {D}_{1}^{i} D1i 的计算:

  1. 根据物种 i i i 的有-无划分为两组:
  2. 将该物种去除,并将剩余物种的相对丰度标准化,使其和为1;
  3. 计算组和组样品的两两间的Bray-Crutis距离。假设有5个样品A、B、C、D、E,其中组:A、B、C, 组: D、E。组和组样品的两两间的距离矩阵为:
IDABC
Dxxxxxxxxx
Exxxxxxxxx
  1. 然后取该矩阵的平均值,即为 D 1 i {D}_{1}^{i} D1i

计算 D 1 i {D}_{1}^{i} D1i R代码如下:

EPI_D1 <- function(S) {
  library(vegan)
  # Initialization
  N <- nrow(S)
  M <- ncol(S)
  S_01 <- ifelse(S>0,1,0)
  D1 <- rep(NA, N)
  
  for (i in 1:N) {
    # If the species is always present/absent, D1 is undefined
    if (sum(S_01[i, ], na.rm = TRUE) != 0 & sum(S_01[i, ], na.rm = TRUE) != M) {
      print(i)
      ind_pres <- S_01[i, ] != 0
      S2 <- S[-i, , drop = FALSE]
      S2 <- S2 / colSums(S2)
      bc <- as.matrix(vegdist(t(S2)))
      bc2 <- bc[ind_pres,!ind_pres]
      D1[i] <- sum(bc2) / (sum(ind_pres) * sum(!ind_pres))
    }
  }
  return(D1)
}

D 2 i {D}_{2}^{i} D2i 的计算:

  1. 根据物种 i i i 的有-无划分为两组:
  2. 将该物种去除,并将剩余物种的相对丰度标准化,使其和为1;
  3. 分别计算组和组样品的平均物种组成,获得 P ‾ \overline P P (P: Presence)和 A ‾ \overline A A (A: Absence),然后计算两者的平均值。假设有5个样品A、B、C、D、E,其中组:A、B、C, 组: D、E。组和组样品平均值如下:
IDABC P ‾ \overline P P
taxa1x1x2x3average(x1,x2,x3)
taxa2y1y2y3average(y1,y2,y3)
taxa3z1z2z3average(z1,z2,z3)
IDCD A ‾ \overline A A
taxa1x1x2average(x1,x2)
taxa2y1y2average(y1,y2)
taxa3z1z2average(z1,z2)
  1. 然后计算 P ‾ \overline P P A ‾ \overline A A的Bray-Crutis距离,即为 D 2 i {D}_{2}^{i} D2i

计算 D 2 i {D}_{2}^{i} D2i R代码如下:

EPI_D2 <- function(S) {
  N <- nrow(S)
  M <- ncol(S)
  S_01 <- ifelse(S>0,1,0)
  D2 <- rep(NA, N)
  
  for (i in 1:N) {
    # If the species is always present/absent, D2 is undefined
    if (sum(S_01[i, ], na.rm = TRUE) != 0 & sum(S_01[i, ], na.rm = TRUE) != M) {
      print(i)
      # Dividing into the two groups
      ind_pres <- S_01[i, ] != 0
      S_pres <- as.matrix(S[, ind_pres])
      S_abs <- as.matrix(S[, !ind_pres])
      
      # Removing the i species
      S_pres <- S_pres[-i, , drop = FALSE]
      S_abs <- S_abs[-i, , drop = FALSE]
      
      # Normalizing
      S_pres <- S_pres / colSums(S_pres)
      S_abs <- S_abs / colSums(S_abs)
      
      # Calculating D2
      D2[i] <- vegdist(rbind(rowMeans(S_pres), rowMeans(S_abs)))[1]
    }
  }
  return(D2)
}

Q i {Q}^{i} Qi 的计算:

  1. 根据物种 i i i 的有-无划分为两组:
  2. 将该物种去除,并将剩余物种的相对丰度标准化,使其和为1;
  3. 计算样品间的Bray-Crutis距离;
  4. 设定一定的阈值,构建样品-样品的网络,这里网络中的节点代表样品;
  5. 对网络中的节点(代表样品)赋予模块,例如:模块1代表模块2代表
  6. 计算该网络的模块度(modularity),即为 Q i {Q}^{i} Qi

计算 Q i {Q}^{i} Qi 的R代码如下:

EPI_Q <- function(S, threshold_net) {
  N <- nrow(S)
  M <- ncol(S)
  S_01 <- ifelse(S > 0,1,0)
  Q <- rep(NA, N)
 
  modularity <- function(B, s) {
    library(igraph)
    B_graph <- graph.adjacency(B, mode = "undirected")
    d <- degree(B_graph) # Degree of each sample
    q <- sum(B) / 2
    Qmod <- (t(s) %*% (B - (d %*% t(d)) / (2 * q)) %*% s) / (4 * q)
    return(Qmod)
  }
  
  for (i in 1:N) {
    # If the species is always present/absent, Q is undefined
    if (sum(S_01[i, ], na.rm = TRUE) != 0 & sum(S_01[i, ], na.rm = TRUE) != M) {
      print(i)
      # Removing the i species
      S_i <- S[-i,]
      
      # Normalizing
      S_i <- S_i / colSums(S_i)
      
      # Building the network
      distances_i <- as.matrix(vegdist(t(S_i)))
      dist_threshold <- quantile(distances_i, threshold_net)
      B_i <- as.matrix(distances_i <= dist_threshold)
      diag(B_i) <- 0
      s_i <- as.numeric(S_01[i, ])
      s_i[s_i == 0] <- -1
      
      # Calculating
      Q[i] <- modularity(B_i, s_i)
    }
  }
  
  return(Q)
}

更多测试数据及R代码可参考如下连接:https://mbd.pub/o/bread/ZZ2bm5hx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1566178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用ENIGMA-toolbox作图

之前一直使用ggseg呈现结果&#xff0c;最近想试一试其他绘图工具。ENIGMA-toolbox有所了解&#xff0c;绘图功能看起来门槛不高&#xff0c;所以就试着用它呈现一些结果。Matlab版本的ENIGMA-toolbox直接使用就是SurfStat的功能绘图&#xff0c;Python版本的绘图功能应该是根据…

详解k8s集群内外的访问方式

文章目录 1、集群内访问2、集群外访问2.1、Ingress转发外网请求2.2、LoadBanlancer接入外网请求2.3、NodePort接入外网请求 3、总结和对比3.1、Ingress、NodePort和LoadBalancer总结3.2、Ingress和网关的区别 1、集群内访问 在k8s中创建的微服务&#xff0c;大部分都是在集群内…

手搓 Docker Image Creator(DIC)工具(02):预备知识

此节主要简单介绍一下 Docker、Dockerfile 的基本概念&#xff0c;Dockerfile 对的基本语法&#xff0c;Windows 和 macOS 下 Docker 桌面的安装&#xff0c;Docker 镜像的创建和运行测试等。 1 关于 Docker Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者打包应用…

非关系型数据库-----------Redis的主从复制、哨兵模式

目录 一、redis群集有三种模式 1.1主从复制、哨兵、集群的区别 1.1.1主从复制 1.1.2哨兵 1.1.3集群 二、主从复制 2.1主从复制概述 2.2主从复制的作用 ①数据冗余 ②故障恢复 ③负载均衡 ④高可用基石 2.3主从复制流程 2.4搭建redis主从复制 2.4.1环境准备 2.4…

hadoop在linux上启动成功了,但是浏览器访问不了

根据网上的资料进行安装hadoop的伪集群 都安装成功&#xff0c;并且启动也成功了&#xff0c;如下图所示&#xff1a; 2、但是在浏览器上确是怎么也访问不了&#xff0c; 解决思路&#xff0c; 2.1、根据网上的一些文章处理解决是关闭防火墙&#xff0c; 2.1.1、我根据操作步骤…

unity工程输出的log在哪里?

在编辑器里进行活动输出的log位置&#xff1a; C:\Users\username\AppData\Local\Unity\Editor\Editor.log ------------------------------------ 已经打包完成&#xff0c;形成的exe运行后的log位置&#xff1a; C:\Users\xxx用户\AppData\LocalLow\xx公司\xx项目

manga-ocr漫画日文ocr

github 下载 解压 anaconda新建环境 conda create -n manga_ocr python3.8 激活环境 conda activate manga_ocr cd到解压目录 cd /d manga-ocr-master 安装依赖包 pip install -r requirements.txt pip3 install manga-ocr 下载离线model huggingface 123云盘 解压到一个目录…

Python爬虫详解:原理、常用库与实战案例

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言引言&#xff1a;一、爬虫原理1. HTTP请求与响应过程2. 常用爬虫技术 二、P…

回溯算法 DFS

目录 回溯算法和dfs的区别回溯算法基本框架例题&#xff1a;【1,2&#xff0c;3】的全排列代码详解完整代码 DFS 本文思路、代码均参考于&#xff1a;https://labuladong.online/algo/essential-technique/backtrack-framework-2/#%E4%B8%80%E3%80%81%E5%85%A8%E6%8E%92%E5%88%…

搭建 Qt 开发环境

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、QT SDK 的下载和安装 1.QT SDK 的下载 二、QT SDK的安装 1、找到下载的文件并双击 2、双击之…

【项目实战经验】DataKit迁移MySQL到openGauss(上)

前言 本文将分享DataKit迁移MySQL到openGauss的项目实战&#xff0c;供广大openGauss爱好者参考。 1. 下载操作系统 https://www.openeuler.org/zh/download https://support.huawei.com/enterprise/zh/doc/EDOC1100332931/1a643956 https://support.huawei.com/enterprise…

VMware虚拟机三种网络模式配置

vmware有三种网络工作模式&#xff1a;Bridged&#xff08;桥接模式&#xff09;、NAT&#xff08;网络地址转换模式&#xff09;、Host-Only&#xff08;仅主机模式&#xff09;。 1. 打开网络编辑器&#xff08;编辑 --> 虚拟网络编辑器&#xff09; 在主机上有VMware Ne…

LeetCode-19. 删除链表的倒数第 N 个结点【链表 双指针】

LeetCode-19. 删除链表的倒数第 N 个结点【链表 双指针】 题目描述&#xff1a;解题思路一&#xff1a;双指针解题思路二&#xff1a;优化解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。…

hexo博客7:构建简单的多层安全防御体系

【hexo博客7】构建简单的多层安全防御体系 写在最前面理解全面安全策略的重要性防御常见的网络攻击1. SQL注入攻击2. 文件上传漏洞3. 跨站脚本攻击&#xff08;XSS&#xff09;4. 跨站请求伪造&#xff08;CSRF&#xff09;5. 目录遍历/本地文件包含&#xff08;LFI/RFI&#x…

CRMEB 标准版 v5.3公测版发布,快来体验

演示站 后台&#xff1a;http://v5.crmeb.net/admin 账号&#xff1a;demo 密码&#xff1a;crmeb.com H5端&#xff1a;http://v5.crmeb.net 新增功能 后台支持所有功能设置搜索 事业部&#xff1a;想在事业部添加代理商&#xff0c;可以在后台选择添加员工&#xff0c;设…

【c++】STl-list使用list模拟实现

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 …

算法学习 | day34/60 不同路径/不同路径II

一、题目打卡 1.1 不同路径 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 拿到手&#xff0c;首先见到答案需要求的是种类的个数&#xff0c;并且看题目&#xff0c;每次移动的时候只有两个方向&#xff0c;这也就说明&#xff0c;对于某一个位置来说&#x…

[已解决]Vue3+Element-plus使用el-dialog对话框无法显示

文章目录 问题发现原因分析解决方法 问题发现 点击按钮&#xff0c;没有想要的弹框 代码如下 修改 el-dialog到body中&#xff0c;还是不能显示 原因分析 使用devtool中vue工具进行查看组件结构 原因在于&#xff0c;在一个局部组件(Detail->ElTabPane->…)中使用…

C++初阶:list类及模拟实现

list的介绍及使用 list的介绍 list 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list 的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向…

代码随想录算法训练营第二十二天| 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

系列文章目录 目录 系列文章目录235. 二叉搜索树的最近公共祖先①递归法自己写的简洁版 ②迭代法不能这样写&#xff01;正确写法 701.二叉搜索树中的插入操作①递归法②迭代法 450.删除二叉搜索树中的节点递归法 235. 二叉搜索树的最近公共祖先 ①递归法 自己写的 class So…