You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中基于比例OTU表生成边列表与节点列表

从合并丰度表生成共现网络边列表与节点列表的实现方法

以下默认基于R语言实现(匹配你之前使用inner_join的操作环境):

步骤1:计算类群间的相关系数矩阵

共现网络一般基于类群在不同样本中的丰度相关性构建,首先需要计算所有类群两两之间的相关系数和显著性:

library(dplyr)
library(tidyr)
library(psych)

# 假设你的合并丰度表名为 merged_otu,行名为采样点位,列名为B1-B50、D1-D50的类群
# 计算Spearman相关系数及校正后p值,更适配微生物丰度这类非正态分布数据
cor_result <- corr.test(t(merged_otu), method = "spearman", adjust = "fdr")
cor_matrix <- cor_result$r # 相关系数矩阵
p_matrix <- cor_result$p # 校正后显著性p值矩阵

步骤2:生成边列表

边列表核心结构为「源节点-目标节点-权重」,我们将矩阵转换为长格式后过滤符合阈值的有效边:

edge_list <- as.data.frame(as.table(cor_matrix)) %>%
  setNames(c("source", "target", "weight")) %>%
  # 匹配对应边的显著性值
  left_join(as.data.frame(as.table(p_matrix)) %>% 
              setNames(c("source", "target", "p_value")),
            by = c("source", "target")) %>%
  filter(
    source < target, # 按字符串排序去重,避免A-B、B-A这类重复边
    abs(weight) >= 0.6, # 可根据研究需求调整相关系数阈值
    p_value < 0.05 # 可根据研究需求调整显著性阈值
  )

得到的edge_list就是标准边列表,其中weight为正代表两个类群呈正相关,为负代表呈负相关。

步骤3:生成节点列表

节点列表至少需要包含节点ID,也可补充类群属性方便后续分析:

node_list <- data.frame(
  node_id = colnames(merged_otu), # 所有类群的ID
  group = ifelse(grepl("^B", colnames(merged_otu)), "细菌", "藻类") # 标记类群所属类型
  # 如有类群的平均丰度、分类地位等信息,可在这里新增对应列
)

# 若需要过滤网络中的孤立节点,可保留以下步骤,只保留出现在边列表中的节点
used_nodes <- unique(c(edge_list$source, edge_list$target))
node_list <- node_list %>% filter(node_id %in% used_nodes)

后续使用说明

生成的边列表和节点列表可直接导入igraph、Cytoscape等工具,开展网络拓扑属性计算、模块划分、可视化等后续分析,你可以根据研究需求调整相关系数计算方法、筛选阈值。

内容的提问来源于stack exchange,提问作者ASHooper93

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:45:04