一、引言

       周集中老师团队于2021年在Nature climate change发表的文章,阐述了网络稳定性评估的原理算法,并提供了完整的代码。自此对微生物生态网络的评估具有更全面的指标,自此网络稳定性的评估广受大家欢迎。本系列将介绍网络稳定性之鲁棒性和易损性指数原理,计算方法以及代码,如有疑问欢迎讨论交流。

       为了理解增温是否以及如何影响构建的微生物生态网络(MEN)的稳定性,我们使用了多种指标来表征网络及其嵌入成员的稳定性,包括稳健性、易损性、节点和连接的稳定性、节点持久性以及组成稳定性。我们通过消除模拟和经验观察评估了网络及网络内微生物群落的稳定性。这一节集中于基于模拟的方式评估网络稳定性的稳健性(Robustness)和易损性指标。下一节我们将讨论基于经验观测值评估网络稳定性。

二、基础知识之基于模拟的网络稳定性

稳健性(Robustness

       微生物生态网络(MEN)的稳健性定义为在随机或定向移除节点后网络中剩余物种的比例。在随机移除物种的模拟中,随机移除一定比例的节点;在定向移除模拟中,移除了一定数量的模块中心节点。为了测试物种移除对剩余物种的影响,计算了节点 i 的加权平均相互作用强度(wMIS),其公式如下:

       式中,bj是物种 j 的相对丰度;

                 sij 是物种 ij 之间的关联强度,以皮尔森相关系数表示。因此在本研究中,sij = sji

         从MEN中移除选定节点后,如果 wMISi = 0(即所有与物种 i 的链接均被移除)或 wMISi< 0(即物种 i 与其他物种之间的共生协同不足以维持其生存),则节点 i 被视为灭绝/孤立并从网络中移除。该过程持续进行,直到所有物种的 wMIS 均为正数。剩余节点的比例即为网络的稳健性。在随机移除50%的节点或移除5个模块枢纽节点的情况下,测量了网络的稳健性。

图中a,稳健性测量方法是从每个经验MEN 中随机移除 50% 的分类单元后剩余的分类单元比例。b稳健性测量方法是从每个经验MEN中移除五个模块中心后剩余的分类单元比例。在ab中,每个误差线对应于 100 次模拟的标准差。变暖(W)和控制(Ctl)之间的显著性差异(双侧t检验)用 *** P < 0.001表示。

易损性(Vulnerability

       每个节点的易损性衡量该节点对全局效率的相对贡献。网络的易损性由网络中节点的最大易损性表示,公式如下:

       式中,E 是网络的全局效率;

                 Ei 是移除节点 i 及其所有链接后的全局效率。

       网络图的全局效率计算为所有节点对间效率的平均值:

       式中,d(i, j) 表示节点 i 和节点 j 之间最短路径上的边数量。

       效率描述了信息在网络中传播的速度。在生态网络中,效率可以提供关于生物或生态事件后果在网络局部或整体传播速度的信息。

图中,网络易损性通过每个网络中的最大节点易损性来衡量。显示了线性回归的调整后R2P

三、示例数据及R代码

      本文的示例数据和代码均来自于2021年周集中老师团队的Nature climate change文章,感兴趣的同学可以自行去学习。

3.1 鲁棒性(Robustness)指标

🌟准备数据

准备otu.csv表格,该表格为要计算鲁棒性的网络otu数据表。代码每次计算一个网络的稳健性,因此需要计算几个网络就运行几次代码,每次将输入文件名修改。

🌟完整代码

# 清理工作环境中的所有对象
rm(list = ls())
# 读取 OTU 表格数据
otutab <- read.csv("control_otu.csv", row.names = 1)
otutab[is.na(otutab)] <- 0  # 将 NA 值替换为 0
# 筛选出在至少 12 个样本中存在的 OTU
counts <- rowSums(otutab > 0)
otutab <- otutab[counts >= 12,]
# 转置 OTU 表,计算每种物种的相对丰度
comm <- t(otutab)
sp.ra <- colMeans(comm) / 30000  # 每种物种的相对丰度
#从 OTU 表中计算相关矩阵
cormatrix <- matrix(0, ncol(comm), ncol(comm))  # 初始化相关矩阵
for (i in 1:ncol(comm)) {for (j in i:ncol(comm)) {speciesi <- sapply(1:nrow(comm), function(k) {ifelse(comm[k, i] > 0, comm[k, i], ifelse(comm[k, j] > 0, 0.01, NA))})speciesj <- sapply(1:nrow(comm), function(k) {ifelse(comm[k, j] > 0, comm[k, j], ifelse(comm[k, i] > 0, 0.01, NA))})corij <- cor(log(speciesi)[!is.na(speciesi)], log(speciesj)[!is.na(speciesj)])  # 计算对数变换后的相关性cormatrix[i, j] <- cormatrix[j, i] <- corij  # 填充对称矩阵}
}# 设置行名和列名为物种名称
row.names(cormatrix) <- colnames(cormatrix) <- colnames(comm)# 仅保留相关系数大于等于 0.80 的连接
cormatrix2 <- cormatrix * (abs(cormatrix) >= 0.80)
cormatrix2[is.na(cormatrix2)] <- 0  # 将 NA 替换为 0
diag(cormatrix2) <- 0  # 去除自连接# 计算网络连接数量和节点数量
sum(abs(cormatrix2) > 0) / 2  # 连接数
sum(colSums(abs(cormatrix2)) > 0)  # 至少有一个连接的节点数# 提取连接网络的矩阵
network.raw <- cormatrix2[colSums(abs(cormatrix2)) > 0, colSums(abs(cormatrix2)) > 0]
sp.ra2 <- sp.ra[colSums(abs(cormatrix2)) > 0]
sum(row.names(network.raw) == names(sp.ra2))  # 检查是否匹配# 鲁棒性模拟函数
# 随机移除部分物种后计算剩余物种比例
rand.remov.once <- function(netRaw, rm.percent, sp.ra, abundance.weighted = TRUE) {id.rm <- sample(1:nrow(netRaw), round(nrow(netRaw) * rm.percent))net.Raw <- netRawnet.Raw[id.rm, ] <- 0;  net.Raw[, id.rm] <- 0  # 移除物种if (abundance.weighted) {net.stength <- net.Raw * sp.ra} else {net.stength <- net.Raw}sp.meanInteration <- colMeans(net.stength)id.rm2 <- which(sp.meanInteration <= 0)  # 移除无连接的物种remain.percent <- (nrow(netRaw) - length(id.rm2)) / nrow(netRaw)remain.percent
}# 鲁棒性模拟
rmsimu <- function(netRaw, rm.p.list, sp.ra, abundance.weighted = TRUE, nperm = 100) {t(sapply(rm.p.list, function(x) {remains <- sapply(1:nperm, function(i) {rand.remov.once(netRaw = netRaw, rm.percent = x, sp.ra = sp.ra, abundance.weighted = abundance.weighted)})remain.mean <- mean(remains)remain.sd <- sd(remains)remain.se <- sd(remains) / sqrt(nperm)result <- c(remain.mean, remain.sd, remain.se)names(result) <- c("remain.mean", "remain.sd", "remain.se")result}))
}# 加权和非加权模拟
Weighted.simu <- rmsimu(netRaw = network.raw, rm.p.list = seq(0.05, 1, by = 0.05), sp.ra = sp.ra2, abundance.weighted = TRUE, nperm = 100)
Unweighted.simu <- rmsimu(netRaw = network.raw, rm.p.list = seq(0.05, 1, by = 0.05), sp.ra = sp.ra2, abundance.weighted = FALSE, nperm = 100)# 整合结果
dat1 <- data.frame(Proportion.removed = rep(seq(0.05, 1, by = 0.05), 2),rbind(Weighted.simu, Unweighted.simu),weighted = rep(c("weighted", "unweighted"), each = 20),year = rep(2014, 40),treat = rep("Warmed", 40)#根据自己的处理修改treat名称
)# 保存结果到文件
write.csv(dat1, "random_removal_result_Y14_W.csv")# 加载 ggplot2 包
library(ggplot2)# 生成加权网络的结果图
ggplot(dat1[dat1$weighted == "weighted",], aes(x = Proportion.removed, y = remain.mean, group = treat, color = treat)) +geom_line() +geom_pointrange(aes(ymin = remain.mean - remain.sd, ymax = remain.mean + remain.sd), size = 0.2) +scale_color_manual(values = c("blue", "red")) +xlab("Proportion of species removed") +ylab("Proportion of species remained") +theme_light() +facet_wrap(~year, ncol = 3)# 生成非加权网络的结果图
ggplot(dat1[dat1$weighted == "unweighted",], aes(x = Proportion.removed, y = remain.mean, group = treat, color = treat)) +geom_line() +geom_pointrange(aes(ymin = remain.mean - remain.sd, ymax = remain.mean + remain.sd), size = 0.2) +scale_color_manual(values = c("blue", "red")) +xlab("Proportion of species removed") +ylab("Proportion of species remained") +theme_light() +facet_wrap(~year, ncol = 3)

🌟输出结果

如下所示,结果输出名为random_removal_result_Y14_W.csv的表格。

在随机移除50%的节点情况下即Proportion.removed值为0.5时,获得该网络的鲁棒性值0.21278;标准差是0.01966,该值对应于 100 次模拟的标准差。

⚠️ weighted考虑到物种丰度了,ubweighted没有考虑物种丰度。

随后可基于这个结果绘制柱状图或其他图纸。

⚠️移除5个模块中心点的鲁棒性值计算代码我们也放在了示例代码和数据文件中,需要的可以留言获取

3.2 易损性(vulnerability)指标

🌟准备数据

准备otu.csv表格,该表格为要计算易损性的网络otu数据表。

代码每次计算一个网络的易损性,因此需要计算几个网络就运行几次代码,每次将输入文件名修改。

🌟完整代码

# 清理工作环境中的所有对象
rm(list = ls())# 导入igraph包和自定义的centrality函数
if(!require("igraph")){install.packages("igraph")}
library(igraph)
source("info.centrality.R")#自定义函数#### 获取图结构(Graph)####
# 可以通过以下三种方式获取图结构:
# 1. 读取已有的图
# 2. 从OTU表中构建图
# 3. 从MENAP下载的相关矩阵构建图## 2) 从OTU表中构建图
# 读取OTU表,缺失值替换为0
otutab <- read.csv("treat_otu.csv",  row.names = 1)
otutab[is.na(otutab)] <- 0# 筛选至少出现在12个样本中的OTU
counts <- rowSums(otutab > 0)
otutab <- otutab[counts >= 12,]# 转置OTU表,以便进行后续计算
comm <- t(otutab)# 初始化相关矩阵,存储物种间的相关性
cormatrix <- matrix(0, ncol(comm), ncol(comm))# 使用嵌套循环计算OTU之间的相关性
for (i in 1:ncol(comm)) {for (j in i:ncol(comm)) {speciesi <- sapply(1:nrow(comm), function(k) {ifelse(comm[k, i] > 0, comm[k, i], ifelse(comm[k, j] > 0, 0.01, NA))})speciesj <- sapply(1:nrow(comm), function(k) {ifelse(comm[k, j] > 0, comm[k, j], ifelse(comm[k, i] > 0, 0.01, NA))})# 计算物种对数值的相关性corij <- cor(log(speciesi)[!is.na(speciesi)], log(speciesj)[!is.na(speciesj)])cormatrix[i, j] <- cormatrix[j, i] <- corij}
}# 设置相关矩阵的行名和列名
row.names(cormatrix) <- colnames(cormatrix) <- colnames(comm)# 仅保留相关系数大于等于0.80的连接
cormatrix2 <- cormatrix * (abs(cormatrix) >= 0.80)
cormatrix2[is.na(cormatrix2)] <- 0
diag(cormatrix2) <- 0  # 移除自连接
cormatrix2[abs(cormatrix2) > 0] <- 1  # 转换为邻接矩阵# 从邻接矩阵构建无向图g
g <- graph_from_adjacency_matrix(as.matrix(cormatrix2), mode = "undirected", weighted = NULL, diag = FALSE)### 结束图构建部分# 移除孤立节点
iso_node_id <- which(degree(g) == 0)
g2 <- delete.vertices(g, iso_node_id)  # 生成不含孤立节点的图g2# 检查节点和连接数
length(V(g2))  # 节点数
length(E(g2))  # 边数# 计算每个节点的易损性
node.vul <- info.centrality.vertex(g2)
max(node.vul)  # 输出最大易损性

🌟输出结果

四、参考文献

[1] Yuan, M.M., Guo, X., Wu, L. et al. Climate warming enhances microbial network complexity and stability. Nat. Clim. Chang. 11, 343–348 (2021).

[2] Mengting-Maggie-Yuan/warming-network-complexity-stability

五、相关信息

!!!本文内容由小编总结互联网和文献内容总结整理,如若侵权,联系立即删除!

 !!!有需要的小伙伴评论区获取今天的测试代码和实例数据。

 📌示例代码中提供了数据和代码,小编已经测试,可直接运行。

以上就是本节所有内容

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

setup 函数在 Vue 3 中的作用是什么?什么时候会执行

文章目录 前言✅ 一、setup() 函数的作用是什么&#xff1f;✅ 二、setup() 什么时候执行&#xff1f;✅ 三、setup() 的参数✅ 四、setup() 中不能做什么&#xff1f;✅ 五、常见用法示例✅ 六、总结&#xff08;适合背诵或面试回答&#xff09; <script setup> 是 **Vu…

JDBC实现--保姆级教程~

本来以为写过一个使用python与数据库连接的文章&#xff0c;但是今天突然发现没有&#xff0c;那就直接写Java与数据库连接的吧。当然如果大家有需要可以告诉我&#xff0c;有时间的话也可以写一个的pymysql的使用的。 数据库有很多种&#xff0c;接下来我就以MySQL为例来进行讲…

Ubuntu18.04搭建samda服务器

一.什么是Samba服务器&#xff1f; Samba服务器是一种基于开源协议实现的网络共享服务软件&#xff0c;主要用于在不同操作系统&#xff08;如Windows、Linux、Unix&#xff09;之间实现文件和打印机共享功能。其核心目标是解决跨平台资源共享的兼容性问题&#xff0c;尤其是在…

《分词算法大揭秘:BPE、BBPE、WordPiece、ULM常见方法介绍》

分词算法是自然语言处理&#xff08;NLP&#xff09;中的一个重要预处理步骤&#xff0c;它将文本分割成更小的单元&#xff08;如单词、子词或字符&#xff09;。以下是几种常见的分词算法&#xff1a;Byte Pair Encoding (BPE)、Byte-level BPE (BBPE)、WordPiece 和 Unigram…

WordPress01 - 后台常用功能

最近些日子研究Wordpress&#xff0c;做些简单的笔记。 怎么安装Wordpress&#xff0c;怎么进的后台&#xff0c;这些咱就不唠了哈&#xff0c;网上到处是教程。 目录 1&#xff0c;Wordpress的后台 1-1&#xff0c; Posts(投稿) 1-2&#xff0c;Media(媒体) 1-3&#xf…

R8周:RNN实现阿尔茨海默病诊断

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 一、前期准备 1.设置GPU import numpy as np import pandas as pd import torch from torch import nn import torch.nn as nn import torch.nn.functi…

今天python练习题

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 不要害怕失败&#xff0c;失败可能成为我们前进的动力&#xff01; 二、练习题 有列表lst [[1,2,3],[4,5,6],[7,8,9]],取出其中的元素1/5/9组成新的列表 # 有列表lst [[1,2,3],[4,5,6],[…

机器人强化学习入门学习笔记(二)

基于上一篇的《机器人强化学习入门学习笔记》,在基于 MuJoCo 的仿真强化学习训练中,除了 PPO(Proximal Policy Optimization)之外,还有多个主流强化学习算法可用于训练机器人直行或其他复杂动作。 🧠 一、常见强化学习算法对比(可用于 MuJoCo) 算法类型特点适合场景PP…

用 DuckDB 高效分析 JSON 数据:从入门到实战

解析 JSON 文件进行分析常常充满挑战。无论你是在处理 API 响应、日志文件&#xff0c;还是应用数据&#xff0c;如果没有合适的工具&#xff0c;分析 JSON 都会非常耗时。 借助 DuckDB&#xff0c;你可以直接用 SQL 查询复杂的 JSON 文件&#xff0c;无需编写复杂的解析代码或…

从贴牌到品牌:出海官网如何让中国制造“贵”起来?

在全球经济一体化的当下&#xff0c;中美关税战如同一记重锤&#xff0c;给国际贸易格局带来了巨大震荡。自贸易摩擦爆发以来&#xff0c;双方多次调整关税政策&#xff0c;涉及的商品种类不断增多&#xff0c;税率持续攀升&#xff0c;众多中国企业的出口业务遭受重创&#xf…

react-13react中外部css引入以及style内联样式(动态className与动态style)

1. 外部css文件 - 普通引入 1.1 创建一个 CSS 文件&#xff0c;MyComponent.css。 /* MyComponent.css */ .my-class {color: red;font-size: 20px; } 1.2 组件中import引入 import React from react; import ./MyComponent.css; // 引入 CSS 文件function MyComponent() {r…

n8n 与智能体构建:开发自动化 AI 作业的基础平台

n8n 是一款开源的自动化流程构建平台&#xff0c;通过其模块化节点系统&#xff0c;开发者可以快速实现跨平台的任务编排、数据集成与智能交互。当 n8n 与大型语言模型&#xff08;LLM&#xff09;结合时&#xff0c;就能构建出具备感知、推理、执行能力的 AI 智能体&#xff0…

14.Spring Boot 3.1.5 集成 Spring Security 进行访问控制

14.Spring Boot 3.1.5 集成 Spring Security 进行访问控制 Spring Security 是一个强大且高度可定制的认证和访问控制框架&#xff0c;专为基于 Spring 的应用程序设计。它为基于 Java EE 的企业应用程序提供了全面的安全解决方案&#xff0c;包括 Web 应用程序安全和方法级安…

Linux学习笔记(二):Linux权限管理

文章目录 一、Linux下用户的分类1. Linux下用户分为两类&#xff1a;2. 这两类用户如何进行切换呢&#xff1f;3. 短暂提权 二、何为权限1. 什么是权限2. Linux的文件后缀意义 三、修改权限1. 设置文件的访问权限——chmod2. 修改文件拥有者——chown3. 修改文件所属组——chgr…

学习alpha,第2个alpha

alphas (-1 * ts_corr(rank(ts_delta(log(volume), 2)), rank(((close - open) / open)), 6)) 先分析操作符从左到右 ts_corr: Pearson 相关度量两个变量之间的线性关系。当变量呈正态分布且关系呈线性时&#xff0c;它最有效。 ts_corr(vwap, close, 20)是一个计算时间序列相…

Paddle Serving|部署一个自己的OCR识别服务器

前言 之前使用C部署了自己的OCR识别服务器&#xff0c;Socket网络传输部分是自己写的&#xff0c;回过头来一看&#xff0c;自己犯傻了&#xff0c;PaddleOCR本来就有自己的OCR服务器项目&#xff0c;叫PaddleServing&#xff0c;这里记录一下部署过程。 1 下载依赖环境 1.1 …

React Native【详解】搭建开发环境,创建项目,启动项目

下载安装 node https://nodejs.cn/download/ 查看 npx 版本 npx -v若无 npx 则安装 npm install -g npx创建项目 npx create-expo-applatestRN_demo 为自定义的项目名称 下载安装 Python 2.7 下载安装 JAVA JDK https://www.oracle.com/java/technologies/downloads/#jdk24-…

NVIDIA Halos:智能汽车革命中的全栈式安全系统

高级辅助驾驶行业正面临一个尴尬的"安全悖论"——传感器数量翻倍的同时&#xff0c;事故率曲线却迟迟不见明显下降。究其原因&#xff0c;当前行业普遍存在三大技术困局&#xff1a; 碎片化安全方案 传统方案就像"打补丁"&#xff0c;激光雷达厂商只管点云…

数据资产管理与AI融合:物联网时代的新征程

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;数据资产已成为企业和组织的核心竞争力之一。随着物联网&#xff08;IoT&#xff09;技术的飞速发展&#xff0c;海量的数据如潮水般涌来&#xff0c;如何高效地管理和利用这些数据资产成为了亟待解决的问题。与此同时&am…

MySQL 表的内外连接

文章目录 表的内外连接&#xff08;重点&#xff09;内连接外连接左外连接右外连接 表的内外连接&#xff08;重点&#xff09; 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的查询都是内连接&#xff0c;也是在开发过程中使…