如何在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
相关产品推荐
相关产品推荐

