跳转至

蛋白互作网络分析(STRING/Cytoscape/MCODE/Hub基因筛选)

一句话概述

蛋白互作网络分析(PPI Network Analysis)是通过STRING数据库构建蛋白质-蛋白质相互作用网络,利用Cytoscape进行可视化和拓扑分析,应用MCODE等算法识别功能模块,并通过度(degree)、介数(betweenness)等拓扑参数筛选核心Hub基因的系统性分析方法。


核心知识点表格

知识点说明
PPI网络Protein-Protein Interaction Network,蛋白质相互作用网络
STRING最常用的蛋白互作数据库(最新v12.5,2025年1月发布),整合实验+预测+文本挖掘证据
Cytoscape开源网络可视化和分析软件
MCODEMolecular Complex Detection,Cytoscape模块检测插件
Hub基因网络中连接度最高的核心节点基因
Degree节点连接的边数(连接度)
Betweenness介数中心性,节点作为最短路径中间人的频率
Closeness接近中心性,节点到其他所有节点的平均距离
Bottleneck瓶颈节点,信息传递的关键枢纽
CytoHubbaCytoscape Hub基因筛选插件,支持12种拓扑算法
Combined ScoreSTRING中综合多种证据来源的可信度评分(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仅收录实验验证的互作
IntActEBI维护,高质量文献互作
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]]