擴增子分析|微生物生態網絡穩定性評估之魯棒性(Robustness)和易損性(Vulnerability)在R中實現

一、引言

?????? 周集中老師團隊于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;也是在開發過程中使…