跳转至

蛋白质互作网络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 安装依赖

# 安装requests库(用于HTTP请求)
pip install requests pandas networkx matplotlib  # 安装所需Python库

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