蛋白质互作网络STRING分析¶
一句话概述:STRING数据库是分析蛋白质-蛋白质相互作用(PPI)网络的"社交平台",能帮你找出哪些蛋白质在细胞里"搭伙干活",是功能注释和通路分析的核心工具。
核心知识点表¶
| 知识点 | 白话解释 | 重要程度 |
|---|---|---|
| STRING数据库 | 收集了所有已知和预测的蛋白质互作关系的"通讯录" | ⭐⭐⭐⭐⭐ |
| PPI网络 | 蛋白质之间的"社交网络图",节点是蛋白质,边是互作关系 | ⭐⭐⭐⭐⭐ |
| 置信度分数 | 衡量两个蛋白质真的有互作的"可信程度",0-1分 | ⭐⭐⭐⭐ |
| 功能富集 | 分析一组蛋白质"扎堆"参与了哪些生物学功能 | ⭐⭐⭐⭐ |
| 网络聚类 | 把大网络拆成小团体,找出功能模块 | ⭐⭐⭐⭐ |
| Cytoscape可视化 | 把STRING的结果导入专业画图软件,画出发表级的网络图 | ⭐⭐⭐⭐ |
| 调控网络 | STRING 12.5新功能:不仅知道谁和谁互作,还知道谁调控谁 | ⭐⭐⭐ |
一、STRING数据库简介¶
1.1 STRING是什么?(白话解释)¶
想象蛋白质是一群人,STRING就是记录他们"社交关系"的数据库: - 实验证据:有人亲眼看到A和B在一起(共免疫沉淀、酵母双杂交等) - 文本挖掘:从论文里读到A和B有关系 - 基因组上下文:A和B在基因组上总是"邻居"(基因邻近、基因融合) - 共表达:A和B总是同时出现或消失 - 数据库导入:从其他数据库搬运来的关系
STRING 12.5(2025年最新版)新增了"调控网络"——不仅告诉你A和B有关系,还告诉你是A激活B还是A抑制B。
1.2 核心概念¶
# STRING评分体系(combined_score)
# 每种证据渠道独立打分,最后用贝叶斯方法整合
证据渠道 权重说明
─────────────────────────────────
experiments 实验验证(最可靠)
database 已知数据库收录
textmining 文献挖掘(NLP提取)
coexpression 共表达分析
neighborhood 基因组邻近
gene_fusion 基因融合事件
cooccurrence 系统发育共现
combined_score 综合分数(0-1000)
二、STRING网页版使用流程¶
2.1 基本查询¶
# 第一步:打开STRING官网
# 网址:https://string-db.org/
# 第二步:选择输入方式
# - "Multiple proteins":输入一组蛋白质名称(最常用)
# - "Single protein":查单个蛋白质的互作伙伴
# - "Protein by sequence":用序列查询
# 第三步:输入蛋白质列表(示例:免疫相关蛋白)
# 在输入框中粘贴:
# TP53
# BRCA1
# MDM2
# CDK2
# RB1
# E2F1
# CCND1
# ATM
# CHEK2
# BAX
2.2 参数设置¶
# 关键参数说明
─────────────────────────────────────
物种选择 选择你研究的物种(如 Homo sapiens)
置信度阈值 推荐 ≥ 0.7(high confidence)
0.15 = 低置信度(噪音多)
0.40 = 中置信度
0.70 = 高置信度(推荐)
0.90 = 最高置信度(很严格)
网络类型 full = 所有互作
physical = 只看物理结合
regulatory = 调控关系(新功能)
互作伙伴数量 first shell = 直接互作伙伴数量
second shell = 间接互作伙伴数量
三、STRING API批量查询(Python实操)¶
3.1 安装依赖¶
3.2 Python批量查询STRING¶
#!/usr/bin/env python3
"""STRING API批量查询蛋白质互作网络"""
import requests # 用于发送HTTP请求
import pandas as pd # 用于数据处理
import json # 用于JSON解析
# ========== 配置参数 ==========
string_api_url = "https://version-12-5.string-db.org/api" # STRING API地址(12.5版本)
output_format = "json" # 输出格式:json或tsv
species = 9606 # 物种ID:9606=人类,10090=小鼠
# 要查询的蛋白质列表(示例:p53通路相关蛋白)
my_genes = ["TP53", "BRCA1", "MDM2", "CDK2", "RB1",
"E2F1", "CCND1", "ATM", "CHEK2", "BAX"]
# ========== 第一步:获取蛋白质互作网络 ==========
method = "network" # API方法:获取网络
params = {
"identifiers": "%0d".join(my_genes), # 用换行符连接蛋白质名称
"species": species, # 物种ID
"caller_identity": "bioinformatics_tutorial" # 调用者标识(必填)
}
# 发送请求
response = requests.post( # 发送POST请求到STRING API
f"{string_api_url}/{output_format}/{method}",
data=params
)
data = response.json() # 解析JSON响应
# 转换为DataFrame
df_network = pd.DataFrame(data) # 将互作数据转为表格
print(f"共获取 {len(df_network)} 条互作关系") # 打印互作关系数量
# 保存结果
df_network.to_csv("string_network.tsv", sep="\t", index=False) # 保存为TSV文件
print("互作网络已保存到 string_network.tsv")
# ========== 第二步:获取功能富集结果 ==========
method = "enrichment" # API方法:功能富集分析
params_enrich = {
"identifiers": "%0d".join(my_genes), # 蛋白质列表
"species": species, # 物种ID
"caller_identity": "bioinformatics_tutorial" # 调用者标识
}
response_enrich = requests.post( # 发送功能富集请求
f"{string_api_url}/{output_format}/{method}",
data=params_enrich
)
enrichment = response_enrich.json() # 解析富集结果
# 转换并筛选
df_enrich = pd.DataFrame(enrichment) # 转为表格
df_enrich_sig = df_enrich[df_enrich["fdr"] < 0.05] # 只保留显著的结果(FDR<0.05)
print(f"\n显著富集的通路/功能:{len(df_enrich_sig)} 条")
# 按类别分组查看
for category in df_enrich_sig["category"].unique(): # 遍历每个注释类别
subset = df_enrich_sig[df_enrich_sig["category"] == category] # 筛选该类别
print(f"\n{'='*50}")
print(f"类别: {category} (共{len(subset)}条)")
for _, row in subset.head(5).iterrows(): # 每个类别显示前5条
print(f" - {row['term']}: {row['description']} (FDR={row['fdr']:.2e})")
# 保存富集结果
df_enrich_sig.to_csv("string_enrichment.tsv", sep="\t", index=False) # 保存显著结果
print("\n富集分析结果已保存到 string_enrichment.tsv")
3.3 用NetworkX构建和分析网络¶
#!/usr/bin/env python3
"""用NetworkX分析STRING蛋白质互作网络"""
import networkx as nx # 网络分析库
import pandas as pd # 数据处理
import matplotlib.pyplot as plt # 绑图
# 读取STRING互作数据
df = pd.read_csv("string_network.tsv", sep="\t") # 读取之前保存的网络数据
# ========== 构建网络图 ==========
G = nx.Graph() # 创建无向图
for _, row in df.iterrows(): # 遍历每条互作关系
# 只保留高置信度的互作(score > 0.7)
if row["score"] > 0.7: # 过滤低置信度互作
G.add_edge( # 添加边(互作关系)
row["preferredName_A"], # 蛋白质A的名称
row["preferredName_B"], # 蛋白质B的名称
weight=row["score"] # 边的权重=置信度分数
)
print(f"网络节点数(蛋白质): {G.number_of_nodes()}") # 打印蛋白质数量
print(f"网络边数(互作关系): {G.number_of_edges()}") # 打印互作关系数量
# ========== 计算网络拓扑参数 ==========
# 度中心性:一个蛋白质连接了多少其他蛋白质("人缘好不好")
degree_centrality = nx.degree_centrality(G) # 计算度中心性
# 介数中心性:一个蛋白质是不是网络中的"桥梁"("交通枢纽")
betweenness = nx.betweenness_centrality(G) # 计算介数中心性
# 紧密中心性:一个蛋白质到其他所有蛋白质的平均距离("离大家近不近")
closeness = nx.closeness_centrality(G) # 计算紧密中心性
# 汇总为表格
topo_df = pd.DataFrame({
"protein": list(G.nodes()), # 蛋白质名称
"degree": [G.degree(n) for n in G.nodes()], # 度(连接数)
"degree_centrality": [degree_centrality[n] for n in G.nodes()], # 度中心性
"betweenness": [betweenness[n] for n in G.nodes()], # 介数中心性
"closeness": [closeness[n] for n in G.nodes()] # 紧密中心性
})
# 按度排序,找出hub蛋白
topo_df = topo_df.sort_values("degree", ascending=False) # 按连接数降序排列
print("\n===== 网络拓扑分析 =====")
print(topo_df.to_string(index=False)) # 打印拓扑参数表
# ========== 网络可视化 ==========
plt.figure(figsize=(12, 10)) # 设置图片大小
pos = nx.spring_layout(G, k=2, seed=42) # 使用弹簧布局算法计算节点位置
# 节点大小按度数调整
node_sizes = [G.degree(n) * 300 + 200 for n in G.nodes()] # 度越大,节点越大
# 画网络图
nx.draw_networkx(
G, pos,
node_size=node_sizes, # 节点大小
node_color="lightblue", # 节点颜色
edge_color="gray", # 边颜色
font_size=10, # 字体大小
font_weight="bold", # 字体加粗
width=[G[u][v]["weight"] * 2 for u, v in G.edges()] # 边宽度按置信度调整
)
plt.title("Protein-Protein Interaction Network (STRING)", fontsize=16) # 标题
plt.tight_layout() # 自动调整布局
plt.savefig("ppi_network.png", dpi=300, bbox_inches="tight") # 保存高清图片
plt.close()
print("\n网络图已保存到 ppi_network.png")
四、Cytoscape进阶可视化¶
4.1 导入STRING数据到Cytoscape¶
# 方法一:通过StringApp插件直接查询
# 1. 打开Cytoscape → Apps → App Manager
# 2. 搜索 "stringApp" → Install
# 3. File → Import → Network from STRING...
# 4. 输入蛋白质列表,选择物种
# 方法二:导入TSV文件
# 1. File → Import → Network from File
# 2. 选择 string_network.tsv
# 3. 设置列映射:
# - Source Node = preferredName_A(源蛋白质)
# - Target Node = preferredName_B(目标蛋白质)
# - Edge Attribute = score(互作分数)
4.2 Cytoscape网络美化脚本¶
#!/usr/bin/env python3
"""用py4cytoscape控制Cytoscape进行网络美化"""
# 安装:pip install py4cytoscape
# 需要先启动Cytoscape桌面版
import py4cytoscape as p4c # Cytoscape的Python接口
# 检查Cytoscape连接
print(p4c.cytoscape_version_info()) # 打印Cytoscape版本
# 设置网络布局
p4c.layout_network("force-directed") # 使用力导向布局
# 设置节点样式
p4c.set_node_color_default("#66B2FF") # 默认节点颜色:浅蓝
p4c.set_node_shape_default("ELLIPSE") # 节点形状:椭圆
p4c.set_node_size_default(60) # 节点大小
# 按度数设置节点大小(hub蛋白更大)
p4c.set_node_size_mapping(
"degree", # 映射属性:度数
[1, 5, 10], # 度数范围
[30, 60, 120], # 对应节点大小
mapping_type="c" # 连续映射
)
# 导出高清图片
p4c.export_image("ppi_network_cytoscape.png", resolution=300) # 导出PNG
print("Cytoscape网络图已导出")
五、R语言STRING分析(STRINGdb包)¶
#!/usr/bin/env Rscript
# STRING蛋白质互作网络R语言分析
# ========== 安装和加载包 ==========
if (!requireNamespace("BiocManager", quietly = TRUE)) # 检查BiocManager
install.packages("BiocManager")
BiocManager::install("STRINGdb") # 安装STRINGdb包
library(STRINGdb) # 加载STRING R包
# ========== 初始化STRING对象 ==========
string_db <- STRINGdb$new(
version = "12.5", # 使用最新12.5版本
species = 9606, # 人类(NCBI Taxonomy ID)
score_threshold = 700, # 置信度阈值:700=high confidence
network_type = "full" # 网络类型:full=所有互作
)
# ========== 准备输入数据 ==========
# 示例:差异表达基因列表
deg_list <- data.frame(
gene = c("TP53", "BRCA1", "MDM2", "CDK2", "RB1", # 基因名称
"E2F1", "CCND1", "ATM", "CHEK2", "BAX"),
logFC = c(2.5, -1.8, 3.1, 1.2, -2.0, # log2倍数变化
1.5, 2.8, -1.3, 1.7, -2.5),
pvalue = c(0.001, 0.005, 0.0001, 0.01, 0.003, # p值
0.008, 0.002, 0.006, 0.004, 0.001)
)
# ========== 映射蛋白质ID ==========
mapped <- string_db$map(deg_list, "gene", removeUnmappedRows = TRUE) # 将基因名映射为STRING ID
cat("成功映射的蛋白质数量:", nrow(mapped), "\n") # 打印映射结果
# ========== 绘制网络图 ==========
string_db$plot_network(mapped$STRING_id) # 绘制互作网络图
# ========== 功能富集分析 ==========
enrichment <- string_db$get_enrichment(mapped$STRING_id) # 获取功能富集结果
sig_enrich <- enrichment[enrichment$fdr < 0.05, ] # 筛选显著结果
cat("显著富集通路数:", nrow(sig_enrich), "\n") # 打印显著通路数
# ========== 网络聚类 ==========
clusters <- string_db$get_clusters(mapped$STRING_id, algorithm = "kmeans") # K-means聚类
for (i in seq_along(clusters)) { # 遍历每个聚类
cat("Cluster", i, ":", length(clusters[[i]]), "个蛋白质\n") # 打印聚类信息
}
常见报错与解决¶
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
Error 400: Bad Request | 蛋白质名称写错或物种ID不对 | 检查基因名拼写,确认物种NCBI Taxonomy ID |
No interactions found | 蛋白质之间确实没有已知互作 | 降低置信度阈值,或增加查询蛋白质数量 |
Too many proteins | 输入蛋白质超过2000个限制 | 分批查询,每批不超过2000个 |
Species not found | 物种不在STRING数据库中 | 查看STRING支持的物种列表 |
API rate limit exceeded | 短时间内请求太多 | 添加time.sleep(1)延迟,或使用批量API |
| Cytoscape连不上 | py4cytoscape需要Cytoscape桌面版运行 | 先启动Cytoscape,确保CyREST API开启 |
| R包安装失败 | Bioconductor版本不匹配 | 更新R到最新版本,重新安装BiocManager |
速查表¶
========================================
STRING 蛋白质互作网络分析 速查表
========================================
【网页版操作】
打开网站 → string-db.org
输入蛋白质 → Multiple proteins → 粘贴列表
选物种 → Organism → Homo sapiens
设置阈值 → Settings → confidence ≥ 0.7
导出数据 → Exports → TSV格式
【API查询(Python)】
基础URL → https://version-12-5.string-db.org/api
获取网络 → /json/network
功能富集 → /json/enrichment
蛋白质映射 → /json/get_string_ids
必填参数 → identifiers, species, caller_identity
【置信度阈值选择】
探索性分析 → 0.4(中置信度)
标准分析 → 0.7(高置信度,推荐)
严格分析 → 0.9(最高置信度)
【常用物种ID】
人类 → 9606
小鼠 → 10090
大鼠 → 10116
果蝇 → 7227
斑马鱼 → 7955
拟南芥 → 3702
大肠杆菌 → 511145
【网络分析指标】
Degree(度) → 连接数,找hub蛋白
Betweenness → 介数中心性,找桥梁蛋白
Closeness → 紧密中心性,找核心蛋白
Clustering coeff → 聚集系数,衡量局部连接密度
【下游分析工具】
Cytoscape → 专业网络可视化
NetworkX → Python网络分析
igraph → R/Python网络分析
MCODE → Cytoscape聚类插件
ClueGO → Cytoscape功能注释插件
【面试考点】
Q: STRING的证据渠道有哪些?
A: 实验验证、数据库、文本挖掘、共表达、基因组邻近、基因融合、系统发育共现
Q: 置信度分数怎么算的?
A: 各渠道独立打分,用贝叶斯方法整合为combined_score
Q: STRING 12.5有什么新功能?
A: 新增调控网络,用语言模型从文献提取调控方向
========================================
参考资料:STRING 12.5数据库(2025)| Nucleic Acids Research | string-db.org