蛋白互作网络分析(STRING/Cytoscape/MCODE/Hub基因筛选)¶
一句话概述¶
蛋白互作网络分析(PPI Network Analysis)是通过STRING数据库构建蛋白质-蛋白质相互作用网络,利用Cytoscape进行可视化和拓扑分析,应用MCODE等算法识别功能模块,并通过度(degree)、介数(betweenness)等拓扑参数筛选核心Hub基因的系统性分析方法。
核心知识点表格¶
| 知识点 | 说明 |
|---|---|
| PPI网络 | Protein-Protein Interaction Network,蛋白质相互作用网络 |
| STRING | 最常用的蛋白互作数据库(最新v12.5,2025年1月发布),整合实验+预测+文本挖掘证据 |
| Cytoscape | 开源网络可视化和分析软件 |
| MCODE | Molecular Complex Detection,Cytoscape模块检测插件 |
| Hub基因 | 网络中连接度最高的核心节点基因 |
| Degree | 节点连接的边数(连接度) |
| Betweenness | 介数中心性,节点作为最短路径中间人的频率 |
| Closeness | 接近中心性,节点到其他所有节点的平均距离 |
| Bottleneck | 瓶颈节点,信息传递的关键枢纽 |
| CytoHubba | Cytoscape Hub基因筛选插件,支持12种拓扑算法 |
| Combined Score | STRING中综合多种证据来源的可信度评分(0-1000) |
| Confidence | 低(150)/中(400)/高(700)/最高(900)四个可信度阈值 |
各步骤详解¶
第一步:蛋白互作网络基本概念¶
白话解释: 蛋白质在细胞里不是孤立工作的,它们通过物理接触或功能关联形成"社交网络"。蛋白互作网络就是把这种关系画成一张图——蛋白质是图中的点(节点),互作关系是连线(边)。分析这张图可以找到最重要的"关键人物"(Hub基因)和"小团体"(功能模块)。
技术细节: PPI网络是图论在生物学中的应用。网络表示为G = (V, E),其中V是节点集(蛋白/基因),E是边集(互作关系)。网络可以是: - 无向网络:A与B互作 = B与A互作 - 加权网络:边有可信度分数 - 有向网络:调控关系有方向(如信号通路)
STRING数据库的互作证据来源: 1. Experiments:实验验证(如Co-IP、Y2H) 2. Databases:已知数据库(如KEGG、Reactome) 3. Text mining:文献共现挖掘 4. Co-expression:共表达关系 5. Neighborhood:基因组邻近 6. Co-occurrence:系统发育共现 7. Gene fusion:基因融合事件
STRING v12.5新特性(2025年1月发布): - 新增调控网络(regulatory network):利用文献语言模型和通路数据库推断互作的方向性和类型 - 支持三种网络类型:功能网络、物理互作网络、调控网络 - 改进的通路富集分析:更好的FDR校正和冗余过滤 - 提供网络嵌入向量(network embeddings),方便机器学习应用
第二步:从STRING获取PPI网络¶
白话解释: 第一步是把你感兴趣的基因列表(比如差异表达基因)提交到STRING数据库,获取它们之间已知或预测的互作关系,然后下载网络数据。
在线操作流程: 1. 访问 https://string-db.org 2. 选择 "Multiple Proteins" → 粘贴基因列表 3. 选择物种(如Homo sapiens) 4. 设置互作可信度阈值(建议 medium confidence 0.4 或 high confidence 0.7) 5. 查看网络 → Export → 下载TSV格式的网络文件
R语言自动化(STRINGdb包):
BiocManager::install("STRINGdb")
library(STRINGdb)
# 初始化STRING对象(9606 = 人类)
string_db <- STRINGdb$new(
version = "12.0", # R包STRINGdb目前支持到12.0,网页版已更新到12.5
species = 9606,
score_threshold = 400, # medium confidence
network_type = "full", # full = 所有证据; physical = 仅物理互作
input_directory = ""
)
# 准备基因列表(需要有gene symbol列)
deg_list <- data.frame(gene = c("TP53", "BRCA1", "MYC", "EGFR", "CDK2",
"RB1", "PTEN", "AKT1", "MTOR", "PIK3CA"))
# 映射到STRING ID
mapped <- string_db$map(deg_list, "gene", removeUnmappedRows = TRUE)
head(mapped)
# 获取互作网络
interactions <- string_db$get_interactions(mapped$STRING_id)
head(interactions)
# 绘制网络
string_db$plot_network(mapped$STRING_id)
# 富集分析(STRING内置)
enrichment <- string_db$get_enrichment(mapped$STRING_id)
head(enrichment[enrichment$category == "Process", ])
# 导出网络到本地文件
write.table(interactions, "PPI_network.tsv", sep = "\t", quote = FALSE, row.names = FALSE)
# 转换STRING ID回gene symbol用于Cytoscape
id_map <- mapped[, c("STRING_id", "gene")]
interactions_named <- merge(interactions, id_map, by.x = "from", by.y = "STRING_id")
colnames(interactions_named)[ncol(interactions_named)] <- "gene_from"
interactions_named <- merge(interactions_named, id_map, by.x = "to", by.y = "STRING_id")
colnames(interactions_named)[ncol(interactions_named)] <- "gene_to"
write.table(interactions_named[, c("gene_from", "gene_to", "combined_score")],
"PPI_for_cytoscape.tsv", sep = "\t", quote = FALSE, row.names = FALSE)
第三步:Cytoscape网络导入与可视化¶
白话解释: 把STRING导出的网络数据导入Cytoscape软件中,进行美化和布局。Cytoscape就像一个"社交网络地图绘制器"——可以调节点大小、颜色、布局方式,让网络看起来更清晰、信息更丰富。
技术细节: Cytoscape支持多种网络导入格式: - TSV/CSV表格(两列node + 可选的edge属性) - SIF(Simple Interaction Format) - XGMML/GML格式 - 直接从STRING导入(StringApp插件)
Cytoscape操作步骤:
1. 安装StringApp插件:
Apps → App Manager → 搜索"stringApp" → Install
2. 直接从STRING导入(推荐):
File → Import → Network from Public Databases
→ 选择STRING → 输入基因列表 → 设置species和confidence
3. 或导入本地文件:
File → Import → Network from File
→ 选择TSV文件 → 指定Source/Target/Interaction列
4. 调整布局:
Layout → yFiles Organic Layout(推荐)
或 Layout → Prefuse Force Directed Layout
5. 视觉映射(Visual Mapping):
- 节点大小 → 映射到 Degree
- 节点颜色 → 映射到 logFC 或 P-value
- 边粗细 → 映射到 Combined Score
R语言操作Cytoscape(RCy3包):
BiocManager::install("RCy3")
library(RCy3)
# 确保Cytoscape已打开并运行
cytoscapePing() # 测试连接
# 创建网络
nodes <- data.frame(
id = c("TP53", "BRCA1", "MYC", "EGFR", "CDK2", "RB1", "PTEN"),
logFC = c(-2.1, -1.5, 3.2, 2.8, 1.9, -1.2, -2.5),
pvalue = c(0.001, 0.003, 0.0001, 0.002, 0.01, 0.005, 0.0002)
)
edges <- data.frame(
source = c("TP53", "TP53", "BRCA1", "MYC", "EGFR", "PTEN"),
target = c("BRCA1", "RB1", "TP53", "CDK2", "MYC", "AKT1"),
score = c(0.99, 0.95, 0.99, 0.85, 0.78, 0.92)
)
createNetworkFromDataFrames(nodes, edges, title = "PPI Network")
# 设置视觉样式
setNodeSizeMapping("id", mapping.type = "d")
setNodeColorMapping("logFC", c(-3, 0, 3), c("#0000FF", "#FFFFFF", "#FF0000"))
# 设置布局
layoutNetwork("force-directed")
# 导出图片
exportImage("PPI_network.png", type = "PNG", resolution = 300)
第四步:网络拓扑分析¶
白话解释: 拓扑分析就是用数学方法衡量网络中每个节点的"重要性"。比如一个节点连接越多,说明它和很多蛋白都有关系,可能是核心调控者。这就像分析社交网络中谁是"意见领袖"。
技术细节: 常用拓扑参数:
| 参数 | 公式/含义 | 生物学意义 |
|---|---|---|
| Degree | 直连边数 | 互作伙伴数量 |
| Betweenness Centrality | 经过节点的最短路径占比 | 信息传递的枢纽 |
| Closeness Centrality | 到其他节点距离的倒数 | 高效传播信号的能力 |
| Clustering Coefficient | 邻居间实际连接/最大可能连接 | 局部紧密度 |
| Eigenvector Centrality | 连接重要节点的节点也重要 | 影响力传播 |
Cytoscape NetworkAnalyzer操作:
Tools → Analyze Network → 选择 Undirected
结果面板会显示:
- 节点数、边数
- 平均degree
- 网络直径
- 聚类系数
- 各种分布图(degree distribution等)
R语言计算(igraph包):
library(igraph)
# 从边列表创建网络
ppi_data <- read.table("PPI_for_cytoscape.tsv", header = TRUE, sep = "\t")
g <- graph_from_data_frame(ppi_data[, c("gene_from", "gene_to")], directed = FALSE)
# 计算拓扑参数
V(g)$degree <- degree(g)
V(g)$betweenness <- betweenness(g)
V(g)$closeness <- closeness(g)
V(g)$eigenvector <- eigen_centrality(g)$vector
V(g)$clustering <- transitivity(g, type = "local")
# 汇总为数据框
topo_stats <- data.frame(
gene = V(g)$name,
degree = V(g)$degree,
betweenness = V(g)$betweenness,
closeness = V(g)$closeness,
eigenvector = V(g)$eigenvector,
clustering = V(g)$clustering
)
# 排序找Hub基因
topo_stats <- topo_stats[order(-topo_stats$degree), ]
head(topo_stats, 10) # Top 10 hub genes
# 网络全局特征
cat("Nodes:", vcount(g), "\n")
cat("Edges:", ecount(g), "\n")
cat("Average degree:", mean(degree(g)), "\n")
cat("Network density:", graph.density(g), "\n")
cat("Average path length:", mean_distance(g), "\n")
cat("Clustering coefficient:", transitivity(g, type = "global"), "\n")
# Scale-free性质检验
degree_dist <- degree_distribution(g)
# 如果degree分布近似power-law,则网络是scale-free的
第五步:MCODE模块检测¶
白话解释: MCODE算法可以在大网络中自动找到"关系特别紧密的小团体"——这些小团体中的蛋白可能参与同一个生物学功能或形成蛋白复合物。这就像在一个大公司中找到各个项目组。
技术细节: MCODE (Molecular Complex Detection) 算法步骤: 1. 顶点加权:根据局部邻域密度给每个节点打分 2. 种子选择:选分数最高的节点作为种子 3. 复合物扩展:从种子出发,向外扩展加入密度满足阈值的邻居 4. 后处理:去除fluff节点,按阈值过滤模块
Cytoscape MCODE操作:
1. 安装MCODE:Apps → App Manager → MCODE → Install
2. 运行:Apps → MCODE → 选择网络 → 参数设置:
- Degree Cutoff: 2(默认)
- Node Score Cutoff: 0.2(默认)
- K-Core: 2(默认)
- Max Depth: 100(默认)
3. 查看结果:每个模块会高亮显示,按score排序
4. 对每个模块做功能富集验证其生物学意义
R语言实现:
# 使用igraph的社区检测算法(类似MCODE思想)
library(igraph)
# 方法1:基于边介数的Girvan-Newman算法
communities_gn <- cluster_edge_betweenness(g)
# 方法2:Louvain算法(大网络推荐)
communities_louvain <- cluster_louvain(g)
# 方法3:Fast greedy算法
communities_fg <- cluster_fast_greedy(g)
# 查看模块信息
membership(communities_louvain)
sizes(communities_louvain)
modularity(communities_louvain)
# 提取每个模块的基因
modules <- split(V(g)$name, membership(communities_louvain))
for (i in seq_along(modules)) {
cat("Module", i, "(", length(modules[[i]]), "genes):",
paste(modules[[i]], collapse = ", "), "\n")
}
# 对每个模块做富集分析
library(clusterProfiler)
library(org.Hs.eg.db)
for (i in seq_along(modules)) {
if (length(modules[[i]]) >= 5) {
ego <- enrichGO(
gene = modules[[i]],
OrgDb = org.Hs.eg.db,
keyType = "SYMBOL",
ont = "BP",
pAdjustMethod = "BH",
qvalueCutoff = 0.05
)
if (nrow(ego) > 0) {
cat("\n=== Module", i, "Top GO terms ===\n")
print(head(ego@result[, c("Description", "p.adjust", "Count")], 5))
}
}
}
第六步:CytoHubba Hub基因筛选¶
白话解释: CytoHubba是Cytoscape的一个插件,用12种不同的算法来给网络中的每个基因打"重要性分"。取多种算法都认为重要的基因,就是最可靠的Hub基因(核心基因)。
技术细节: CytoHubba支持的12种拓扑算法:
| 算法 | 类型 | 特点 |
|---|---|---|
| Degree | 局部 | 最简单,直连数 |
| Betweenness | 全局 | 信息枢纽 |
| Closeness | 全局 | 高效传播 |
| Radiality | 全局 | 到外围的距离 |
| Stress | 全局 | 承受的最短路径数 |
| EcCentricity | 全局 | 到最远节点的距离 |
| MNC | 局部 | Maximum Neighborhood Component |
| DMNC | 局部 | Density of MNC |
| MCC | 局部 | Maximal Clique Centrality |
| Bottleneck | 局部 | 最短路径树的瓶颈 |
| EPC | 局部 | Edge Percolated Component |
| ClusteringCoefficient | 局部 | 邻居互连程度 |
Cytoscape CytoHubba操作:
1. 安装:Apps → App Manager → cytoHubba → Install
2. 运行:Apps → cytoHubba → 选择算法 → Top N nodes
3. 推荐策略:
- 分别用Degree, MCC, Betweenness, Closeness, EPC计算Top 20
- 取交集作为最终Hub基因
4. 可视化:Hub基因用不同颜色/大小标注
R语言实现多算法交集:
# 用多种中心性指标筛选Hub基因
library(igraph)
# 计算多种中心性
hub_scores <- data.frame(
gene = V(g)$name,
degree = degree(g),
betweenness = betweenness(g, normalized = TRUE),
closeness = closeness(g, normalized = TRUE),
eigenvector = eigen_centrality(g)$vector,
page_rank = page_rank(g)$vector
)
# 每种方法取Top20
top_n <- 20
top_degree <- hub_scores$gene[order(-hub_scores$degree)][1:top_n]
top_between <- hub_scores$gene[order(-hub_scores$betweenness)][1:top_n]
top_close <- hub_scores$gene[order(-hub_scores$closeness)][1:top_n]
top_eigen <- hub_scores$gene[order(-hub_scores$eigenvector)][1:top_n]
# 取交集(至少在3种方法中出现)
all_hubs <- c(top_degree, top_between, top_close, top_eigen)
hub_freq <- table(all_hubs)
final_hubs <- names(hub_freq[hub_freq >= 3])
cat("Final Hub Genes:", paste(final_hubs, collapse = ", "), "\n")
# 绘制Venn图
library(VennDiagram)
venn.diagram(
x = list(Degree = top_degree, Betweenness = top_between,
Closeness = top_close, Eigenvector = top_eigen),
filename = "hub_venn.png",
fill = c("red", "blue", "green", "yellow"),
alpha = 0.5
)
第七步:网络可视化优化¶
白话解释: 一个好看且信息丰富的网络图可以让读者快速理解结果。需要调整节点大小(反映重要性)、颜色(反映表达变化)、布局(让结构清晰)等。
# ===== ggraph高级可视化 =====
library(ggraph)
library(tidygraph)
# 转换为tidygraph对象
tg <- as_tbl_graph(g) %>%
activate(nodes) %>%
mutate(
degree = centrality_degree(),
community = as.factor(group_louvain()),
is_hub = name %in% final_hubs
)
# 绘制网络图
ggraph(tg, layout = "fr") + # Fruchterman-Reingold布局
geom_edge_link(aes(alpha = 0.3), show.legend = FALSE) +
geom_node_point(aes(size = degree, color = community)) +
geom_node_text(aes(label = ifelse(is_hub, name, "")),
repel = TRUE, size = 3) +
scale_size_continuous(range = c(2, 10)) +
theme_graph() +
labs(title = "PPI Network with Hub Genes Highlighted")
# ===== 整合表达信息的可视化 =====
# 假设有差异表达结果
deg_data <- data.frame(
gene = c("TP53", "BRCA1", "MYC", "EGFR"),
logFC = c(-2.1, -1.5, 3.2, 2.8)
)
tg2 <- tg %>%
activate(nodes) %>%
left_join(deg_data, by = c("name" = "gene"))
ggraph(tg2, layout = "fr") +
geom_edge_link(alpha = 0.2) +
geom_node_point(aes(size = degree, color = logFC)) +
scale_color_gradient2(low = "blue", mid = "white", high = "red", midpoint = 0) +
geom_node_text(aes(label = ifelse(degree > 5, name, "")),
repel = TRUE, size = 2.5) +
theme_graph()
第八步:Hub基因验证与下游分析¶
白话解释: 找到Hub基因后,需要用独立的方法或数据验证它们的重要性——比如看它们在独立数据集中是否也差异表达、是否与临床预后相关、是否有文献支持等。
# ===== 生存分析验证Hub基因 =====
library(survival)
library(survminer)
# 假设有TCGA临床数据
for (hub in final_hubs) {
# 按中位数分高低表达组
median_exp <- median(expr_data[hub, ])
group <- ifelse(expr_data[hub, ] > median_exp, "High", "Low")
surv_data <- data.frame(
time = clinical$OS_time,
status = clinical$OS_status,
group = group
)
fit <- survfit(Surv(time, status) ~ group, data = surv_data)
p <- surv_pvalue(fit)$pval
if (p < 0.05) {
cat(hub, "is prognostic, P =", p, "\n")
}
}
# ===== ROC分析验证诊断价值 =====
library(pROC)
for (hub in final_hubs) {
roc_obj <- roc(group_label, as.numeric(expr_data[hub, ]))
cat(hub, "AUC =", auc(roc_obj), "\n")
}
# ===== 独立数据集验证 =====
# 在GEO独立数据集中验证hub基因表达模式
实战命令(可复制)¶
完整PPI分析流程(R脚本)¶
# ========================================
# PPI网络分析完整流程
# ========================================
# 1. 安装和加载包
packages <- c("STRINGdb", "igraph", "ggraph", "tidygraph",
"clusterProfiler", "org.Hs.eg.db", "ggplot2")
BiocManager::install(packages)
lapply(packages, library, character.only = TRUE)
# 2. 准备差异基因列表
deg_genes <- read.csv("DEG_results.csv")
gene_list <- deg_genes$gene[deg_genes$adj.P.Val < 0.05 & abs(deg_genes$logFC) > 1]
# 3. STRING映射
string_db <- STRINGdb$new(version = "12.0", # R包STRINGdb目前支持到12.0,网页版已更新到12.5 species = 9606, score_threshold = 400)
mapped <- string_db$map(data.frame(gene = gene_list), "gene", removeUnmappedRows = TRUE)
interactions <- string_db$get_interactions(mapped$STRING_id)
# 4. 构建igraph网络
# 转换ID
id_map <- setNames(mapped$gene, mapped$STRING_id)
edges <- data.frame(
from = id_map[interactions$from],
to = id_map[interactions$to],
score = interactions$combined_score
)
edges <- edges[complete.cases(edges), ]
g <- graph_from_data_frame(edges[, 1:2], directed = FALSE)
g <- simplify(g) # 去除自环和多重边
# 5. 拓扑分析
topo <- data.frame(
gene = V(g)$name,
degree = degree(g),
betweenness = betweenness(g, normalized = TRUE),
closeness = closeness(g, normalized = TRUE),
clustering = transitivity(g, type = "local")
)
topo <- topo[order(-topo$degree), ]
write.csv(topo, "network_topology.csv", row.names = FALSE)
# 6. Hub基因(多算法交集)
top20_degree <- topo$gene[1:20]
top20_between <- topo$gene[order(-topo$betweenness)][1:20]
top20_close <- topo$gene[order(-topo$closeness)][1:20]
all_top <- c(top20_degree, top20_between, top20_close)
hub_genes <- names(which(table(all_top) >= 2))
cat("Hub genes:", paste(hub_genes, collapse = ", "), "\n")
# 7. 模块检测
comm <- cluster_louvain(g)
modules <- split(V(g)$name, membership(comm))
# 8. 可视化
tg <- as_tbl_graph(g) %>%
activate(nodes) %>%
mutate(degree = centrality_degree(),
community = as.factor(group_louvain()),
is_hub = name %in% hub_genes)
p <- ggraph(tg, layout = "fr") +
geom_edge_link(alpha = 0.15) +
geom_node_point(aes(size = degree, color = community)) +
geom_node_text(aes(label = ifelse(is_hub, name, "")), repel = TRUE, size = 3) +
scale_size(range = c(1, 8)) +
theme_graph() +
labs(title = "PPI Network Analysis")
ggsave("PPI_network.pdf", p, width = 12, height = 10)
面试常问点¶
Q1: 什么是Scale-free网络?PPI网络是Scale-free的吗?¶
A: Scale-free网络的度分布服从幂律分布P(k) ~ k^(-γ),即少数节点(Hub)有很多连接,大多数节点连接很少。PPI网络被认为近似scale-free,这意味着网络对随机攻击具有鲁棒性,但对Hub节点的靶向攻击脆弱。这也是为什么Hub基因可能是疾病的关键靶点和药物靶标。但需注意,这种性质可能部分是由研究偏倚导致的(研究多的蛋白互作信息也多)。
Q2: STRING数据库的combined_score是怎么计算的?¶
A: Combined_score综合了所有证据渠道(实验、数据库、文本挖掘、共表达、基因组邻近等),使用"1 - ∏(1 - Si)"公式整合各渠道的可信度分数,范围0-1000。但各渠道分数会先校正随机背景期望(通过比较随机蛋白对的分数)。一般建议使用medium confidence(>400)或high confidence(>700)。过低会引入大量假阳性,过高则损失很多真实互作。
Q3: CytoHubba的12种算法如何选择?¶
A: 没有一种算法是绝对最优的。推荐策略是多种算法取交集/并集(Upset plot展示),通常选3-5种互补的方法: - Degree(最基础,连接数) - MCC(对局部网络拓扑敏感,推荐) - Betweenness(全局信息流动枢纽) - Closeness(快速传播能力) - EPC(考虑边权重的渗流分析) 取至少在3种方法中均排Top20的基因作为可靠Hub。
Q4: MCODE和Louvain等社区检测算法的区别?¶
A: MCODE基于局部密度(vertex-weighting + complex prediction),专为寻找蛋白复合物设计,倾向找到小而密的模块。Louvain基于模块度优化,适合大网络的全局社区划分。Fast-greedy是贪心模块度优化。Label propagation最快但结果不稳定。建议:寻找蛋白复合物用MCODE,网络整体分区用Louvain,大网络(>10000节点)用Leiden(Louvain改进版)。
Q5: 如何验证Hub基因的可靠性?¶
A: 多维度验证:(1) 独立数据集验证差异表达一致性;(2) 生存分析验证预后价值;(3) ROC分析验证诊断价值;(4) 文献证据支持;(5) 实验验证(Western blot、qPCR、敲低/过表达功能实验)。仅依赖网络拓扑筛选的Hub基因可能有研究偏倚(被研究多的基因连接自然多),需要额外证据支持。
Q6: PPI网络分析中如何处理假阳性互作?¶
A: (1) 提高STRING阈值(≥700 high confidence);(2) 仅使用实验验证的互作(experimental score > 0);(3) 使用多个数据库交叉验证(STRING + BioGRID + IntAct);(4) 过滤hub节点(如去除TP53/UBC等连接过多的"超级枢纽");(5) 考虑tissue-specific PPI网络而非通用网络。
Q7: PPI网络分析在文章中如何展示?¶
A: 典型展示包括:(1) 整体PPI网络图(标注Hub和模块);(2) 网络拓扑统计表(节点数、边数、平均degree等);(3) Top10 Hub基因表(多种拓扑指标);(4) MCODE关键模块的子网络和富集结果;(5) Hub基因的表达验证(boxplot)和生存分析(KM曲线)。
易错点¶
1. STRING阈值设置过低导致假阳性泛滥¶
问题: 使用低可信度阈值(如0.15),大量不可靠互作被纳入,网络过于密集,Hub基因不可靠。 解决: 一般使用medium(0.4)或high(0.7) confidence。发文章建议至少0.4,重要结论建议0.7。同时报告使用的阈值。
2. 输入基因太多导致网络过大无法解读¶
问题: 把几千个差异基因全部放入STRING,得到一个巨大的"毛线球",无法有效分析和可视化。 解决: 控制输入基因数量(通常200-500个效果最好)。可以用更严格的筛选标准(如|logFC|>2),或先做功能富集选取特定通路的基因再构建网络。
3. 忽略孤立节点的生物学意义¶
问题: 很多基因在PPI网络中没有连接(孤立节点),分析时被直接丢弃。但这些基因可能确实是重要的差异基因。 解决: 孤立节点说明目前没有已知互作伙伴(可能是研究较少),不代表不重要。应单独记录和讨论,可能是新靶点。
4. 直接拿Hub基因当结论¶
问题: 仅凭网络拓扑就声称找到了"关键基因",没有独立验证。Hub基因可能只是文献偏倚(study bias)——研究越多的基因在数据库中互作越多。 解决: Hub基因必须经过多维验证(独立队列、生存分析、实验验证),且需讨论study bias的可能影响。
5. 把共表达网络等同于PPI网络¶
问题: 有人用WGCNA的共表达网络代替PPI网络分析,声称是"蛋白互作"。共表达关系≠物理互作。 解决: 明确区分PPI网络(蛋白物理/功能互作,来自STRING等数据库)和共表达网络(转录水平相关性,来自WGCNA等方法)。二者互补但不可混淆。
补充知识¶
其他PPI数据库¶
| 数据库 | 特点 |
|---|---|
| BioGRID | 仅收录实验验证的互作 |
| IntAct | EBI维护,高质量文献互作 |
| MINT | 哺乳动物互作数据库 |
| DIP | 实验验证互作 |
| HPRD | 人类蛋白参考数据库(注意:自2009年起未更新,数据较旧) |
网络药理学延伸¶
PPI网络分析常与网络药理学结合: - 疾病相关基因构建PPI → 药物靶点映射 → 药物-靶点-疾病网络 - 复方中药的多靶点多通路分析 - 药物重定位(drug repurposing)
Python实现参考¶
import networkx as nx
import pandas as pd
# 读取互作数据
edges = pd.read_csv("PPI_edges.tsv", sep="\t")
G = nx.from_pandas_edgelist(edges, "gene_from", "gene_to")
# 计算中心性
degree = nx.degree_centrality(G)
betweenness = nx.betweenness_centrality(G)
closeness = nx.closeness_centrality(G)
# 社区检测
from networkx.algorithms.community import louvain_communities
communities = louvain_communities(G)
# Hub基因
sorted_degree = sorted(degree.items(), key=lambda x: x[1], reverse=True)
top_hubs = [x[0] for x in sorted_degree[:10]]