07 蛋白互作网络与 STRING
07 蛋白互作网络与 STRING
差异蛋白列表常常是几十到几百个,单独看每个蛋白意义不大。互作网络能把它们组织成"模块"——同一个复合物或通路的蛋白会聚在一起,让生物学故事浮出来。STRING 是目前最常用的免费蛋白互作数据库。
STRING 的关键概念
| 概念 | 含义 |
|---|---|
| Combined score | 7 种证据综合的互作可信度(0-1000) |
| Experimental | 实验直接验证的互作(亲和纯化、Y2H 等) |
| Database | KEGG/Reactome 等通路库的共注释 |
| Coexpression | 共表达证据 |
| Textmining | 文献共出现 |
实际筛选时建议 combined score ≥ 700(high confidence),如果蛋白少可以放到 ≥ 400(medium)。
R 端调用 STRINGdb
library(STRINGdb)
# 物种 ID:9606=人,10090=小鼠
string_db <- STRINGdb$new(version = "12.0",
species = 9606,
score_threshold = 700,
input_directory = "")
# 把基因符号映射到 STRING ID
mapped <- string_db$map(diff_genes, "gene", removeUnmappedRows = TRUE)
# 取互作子图
hits <- mapped$STRING_id
links <- string_db$get_interactions(hits)
# 富集分析(在差异蛋白集合内做)
enrichment <- string_db$get_enrichment(hits)
get_enrichment 返回 GO / KEGG / Reactome / 域 / 蛋白家族等多种富集,比单独跑 clusterProfiler 更全。
网络可视化:igraph + ggraph
STRING 网页图好看但不便复用。R 里用 igraph 构图,ggraph 出版级可视化:
library(igraph)
library(ggraph)
library(dplyr)
# 构建无向图
g <- graph_from_data_frame(
d = links %>% select(from, to, weight = combined_score),
vertices = mapped %>% select(STRING_id, gene, logFC, padj),
directed = FALSE
)
# 度中心性
V(g)$degree <- degree(g)
# 模块检测(Louvain)
clusters <- cluster_louvain(g)
V(g)$module <- membership(clusters)
ggraph(g, layout = "fr") +
geom_edge_link(aes(alpha = weight / 1000), color = "grey50") +
geom_node_point(aes(size = degree, fill = logFC),
shape = 21, color = "white", stroke = 0.5) +
geom_node_text(aes(label = ifelse(degree > 5, gene, "")),
repel = TRUE, size = 3) +
scale_fill_gradient2(low = "#2563eb", mid = "white", high = "#dc2626") +
scale_size_continuous(range = c(2, 8)) +
theme_void()
度中心性 degree 反映"枢纽"程度——网络里 hub 蛋白往往是关键调控因子。
模块解释:每个模块跑富集
Louvain 把网络切成几个相对独立的模块,每个模块单独做富集能看出"这个模块是干嘛的":
library(clusterProfiler)
library(org.Hs.eg.db)
module_enrich <- lapply(unique(V(g)$module), function(m) {
genes <- V(g)$gene[V(g)$module == m]
enrichGO(genes, OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
ont = "BP", pAdjustMethod = "BH",
pvalueCutoff = 0.05)
})
# 每个模块的 top 3 GO term
lapply(seq_along(module_enrich), function(i) {
e <- module_enrich[[i]]
if (!is.null(e) && nrow(e@result) > 0) {
data.frame(module = i, term = head(e@result$Description, 3))
}
})
进阶:Cytoscape 联动
复杂网络在 Cytoscape 里编辑更顺手。RCy3 可以把 R 里的图直接送到 Cytoscape:
library(RCy3)
# Cytoscape 需要先打开
createNetworkFromIgraph(g, "DEP-network")
setNodeColorMapping("logFC", c(-2, 0, 2),
c("#2563eb", "white", "#dc2626"),
style.name = "default")
然后在 Cytoscape 里手动调整布局、加注释、导出 PDF。
报告中的关键参数
- STRING 版本(12.0 / 11.5)
- combined score 阈值
- 网络节点和边数
- 模块检测算法(Louvain / Leiden)
- 富集所用的物种数据库版本
常见坑
坑 1:combined score 阈值设太低导致假互作泛滥
STRING 的 combined score 400(medium confidence)会包含大量 text-mining 和 co-expression 的"互作",这些不是物理结合。如果图里节点密密麻麻全连在一起,说明阈值太松。建议 ≥ 700(high confidence),如果要更严格用 ≥ 900(highest)。
坑 2:hub 基因膨胀——高连接度 ≠ 关键调控因子
网络里 degree 最高的蛋白(如 UBC、TP53、AKT1)几乎在所有实验里都是 hub,因为它们在 STRING 数据库里本身就有海量注释。这种"明星蛋白"的高连接度反映的是研究偏好(study bias),不是你实验的特异发现。报告 hub 时应该和随机背景比较。
坑 3:Louvain 模块不稳定
Louvain 社区检测有随机性,每次运行可能给出不同模块划分。跑 10 次取共识,或者用 Leiden 算法(更稳定)。如果模块划分每次都不同,说明网络本身没有清晰的社区结构,不要强行解读。
坑 4:只看 STRING 网页图不导出数据做统计
STRING 网页提供的 enrichment 分析不能自定义背景集,也不方便做多重校正调参。建议用 R 的 STRINGdb 包拉数据,在本地用 clusterProfiler 做富集分析,背景集设为"实验中检测到的全部蛋白"。
下一步
接着深入:
- 03 功能富集与 Reactome 通路 — 模块内蛋白的富集分析
- 08 与转录组联合分析 — 互作网络中的蛋白在 RNA 层面是否也协同变化
横向延伸:
- 多组学整合 04 WGCNA — 共表达网络的构建和模块分析方法论相似
- 多组学整合 06 SNF 网络融合 — 样本相似性网络而非蛋白互作网络
参考资源
- STRING 数据库
- STRINGdb R 包文档
- igraph 用户手册
- Cytoscape:可视化网络分析工具