2026版RNA-seq入门实战(九):PPI蛋白互作网络构建(上)——STRING数据库的使用

本节概览:
1.STRING数据库基本介绍
2.STRING R语言版——STRINGdb的使用:
①STRINGdb数据库导入 ②获取STRING_id ③PPI绘制
④clustering分簇 ⑤富集分析 ⑥获取蛋白互作信息
3.STRING 网页版的简单使用:
文件上传、各选项设置、数据导出


当我们获得目标基因集合后,除了利用GO等富集分析方法来探究它们参与了哪些关键的生物学通路之外,还可以进一步构建PPI蛋白质相互作用网络(PPI, Protein-Protein Interaction Networks),通过分析这些基因编码蛋白之间的关联,从而筛选出核心的关键基因。
在构建PPI网络的过程中,STRING数据库常被用于提取蛋白互作数据并进行网络的可视化展示。下面,我们就从网页版和R语言版两个角度,来了解STRING数据库的使用方式。
其他数据库的使用:


1. STRING 数据库基本介绍

官网: STRING: functional protein association networks (string-db.org)
R语言版本:Bioconductor - STRINGdb

  • STRING是一个已知和预测的蛋白质-蛋白质相互作用的数据库。
    蛋白之间的相互作用既包含直接的物理结合,也包含间接的功能关联;这些信息的来源包括计算预测、跨物种的知识迁移,以及从其他主要数据库整合而来的互作数据。
    STRING中的相互作用有五个主要来源:基因组预测、高通量实验、(保守的)共表达实验、自动化文本挖掘、数据库相关知识。
    STRING数据库目前涵盖了来自5′090个物种的24′584′628个蛋白质。

2. STRING的R语言版——STRINGdb的使用

STRINGdb说明书:STRINGdb.pdf (bioconductor.org)或使用命令vignette("STRINGdb")在本地查看说明书。查看STRINGdb的函数帮助文档比较特殊,要用STRINGdb$help("get_graph")的形式。
使用STRINGdb时,参数species代表NCBI Taxonomy物种编码,可在此查询:https://cn.string-db.org/cgi/input.pl?input_page_active_form=organisms,其中人为9606,小鼠为10090 。

① STRINGdb数据库导入

  • 首先选择载入的STRINGdb数据(数据库版本、物种、蛋白互作得分)和之前基因差异分析得到的DEG。
    STRINGdb$new设置使用最新的11.5版本数据库,物种选择为小鼠(人9606,小鼠10090 ),蛋白互作得分阈值选择700(默认400, 低150,高700,极高900,越高可信度越强)。
    DEG结果中选取前100显著差异基因用于后续分析,并将其基因名保存为gene_diff100.txt文件用于后续STRING网页版的使用(特别注意write.table要设quote = F,让字符不要带引号 ,否则后续上传 STRING容易识别错误)
# 清空当前环境中的所有变量,避免历史数据干扰
rm(list = ls()) 

# 设置全局选项:字符向量不自动转换为因子,保持原样
options(stringsAsFactors = F)

# 加载 tidyverse 系列包(包含数据处理和可视化工具)
library(tidyverse)  # ggplot2 stringer dplyr tidyr readr purrr  tibble forcats

# 加载 STRINGdb 包,用于蛋白互作网络分析
library(STRINGdb) #BiocManager::install(c("STRINGdb","igraph"),ask = F,update = F)

# 加载 igraph 包,用于网络图的分析与绘图
library(igraph)

# 设置工作目录(请根据实际路径修改)
#setwd("工作目录")

# 加载之前分析得到的差异表达结果,其中应包含数据框 'DEG_DESeq2'
load(file = './3.DEG/test_DEG_results.Rdata')

# 在当前目录下创建名为 "7.PPI" 的文件夹,用于存放PPI分析结果
dir.create("7.PPI")

# 将工作目录切换至刚创建(或已存在)的 "7.PPI" 文件夹
setwd("7.PPI")

######################### 选择STRINGdb类型 #########################
# 初始化 STRINGdb 对象,配置数据库版本、物种和互作得分阈值
string_db <- STRINGdb$new( version="11.5", #数据库版本。截止2022.5.24最新为11.5
                           species=10090,   #人9606,小鼠10090 
                           score_threshold=700, #蛋白互作的得分 默认400, 低150,高700,极高900
                           input_directory="") #可自己导入数据

########################## 获取DEG结果 ############################
##  筛选条件设置 
log2FC_cutoff = log2(2)     # log2(倍数变化) 阈值,对应变化倍数 ≥ 2
pvalue_cutoff = 0.05        # p值显著性阈值
padj_cutoff = 0.05          # 校正后p值显著性阈值

## 选择DEG
# 从差异表达结果中提取第2、5、6列(通常对应 log2FC, pvalue, padj)
need_deg <- DEG_DEseq2[,c(2,5,6)] ; head(need_deg) 

# 为提取的列重新命名,便于后续使用
colnames(need_deg) <- c('log2FC','pvalue','padj'); head(need_deg)

# 添加一列 'gene',内容为原数据框的行名(基因名或ENTREZID)
need_deg$gene <- rownames(need_deg); head(need_deg)      #gene symbol或ENTREZID都可

# 根据阈值分别筛选上调基因、下调基因和所有差异基因
if(T){  
  # 上调:log2FC > 阈值,且 pvalue 和 padj 均小于 0.05
  gene_up=need_deg[with(need_deg,log2FC>log2FC_cutoff & pvalue<pvalue_cutoff & padj<padj_cutoff),]
  # 下调:log2FC < -阈值,且 pvalue 和 padj 均小于 0.05
  gene_down=need_deg[with(need_deg,log2FC < -log2FC_cutoff & pvalue<pvalue_cutoff & padj<padj_cutoff),]
  # 所有差异基因:|log2FC| > 阈值,且 pvalue 和 padj 均小于 0.05
  gene_diff=need_deg[with(need_deg,abs(log2FC)>log2FC_cutoff & pvalue<pvalue_cutoff & padj<padj_cutoff),]
}

# 输出上调、下调、总差异基因的数量,便于检查筛选结果
dim(gene_up);dim(gene_down);dim(gene_diff)

# 选取前100个显著差异基因用于后续PPI分析
dat <- gene_diff[1:100,] ##这里选取前100显著基因用于后续分析

# 将选中的基因名称(行名)写入文本文件,每行一个基因,不加引号
write.table(rownames(dat),'gene_diff100.txt',row.names = F,col.names = F,quote = F) #字符不要带引号

② 获取STRING_id

  • 使用map获取基因名对应的STRING_id用于绘制string_PPI , 基因名为gene symbol或ENTREZID都可以直接对应获取STRING_id
# 将差异基因数据框映射到 STRING 数据库的蛋白标识符
dat_map <- string_db$map(my_data_frame=dat, 
                         my_data_frame_id_col_names="gene", # 指定数据框中哪一列包含基因名(可以是 gene symbol 或 ENTREZID)
                         removeUnmappedRows = TRUE )        # 移除无法映射到 STRING 数据库的基因行

# 从映射结果中提取 STRING 数据库内部的蛋白 ID 向量
hits <- dat_map$STRING_id

③ PPI蛋白互作网络绘制

  • 完成以上步骤后使用plot_network即可绘制PPI图,还可以给PPI添加上下调信息(上调标记为红色光环,下调标记为绿色光环)
## PPI
# 开始绘制基础PPI网络图,输出为PNG文件
png("string_PPI.png", units = "in", width = 10, height = 10, res = 400)   # 打开PNG图形设备,指定文件名为string_PPI.png,尺寸10×10英寸,分辨率400 DPI
string_db$plot_network(hits)    # 使用STRINGdb对象的内置函数,根据hits(STRING蛋白ID向量)绘制蛋白互作网络
dev.off()                       # 关闭图形设备,保存文件

## PPI_halo  #给PPI添加上下调信息
# filter by p-value and add a color column(i.e.green for down and red for up genes)
# 根据p值过滤,并添加颜色列(例如:下调基因绿色,上调基因红色)
dat_map_color <- string_db$add_diff_exp_color(subset(dat_map, pvalue < 0.01),   # 对dat_map数据框按p值<0.01筛选,并根据log2FC列添加上下调颜色
                                                  logFcColStr = "log2FC")        # 指定log2FC列名,用于判断上调(正)或下调(负)
payload_id <- string_db$post_payload(dat_map_color$STRING_id,                    # 将上一步得到的颜色信息上传到STRING数据库服务器,返回一个payload ID
                                     colors = dat_map_color$color)              # 颜色向量,与STRING_id一一对应
png("string_PPI_halo.png", units = "in", width = 10, height = 10, res = 400)    # 打开新的图形设备,输出带颜色映射的PPI网络图
string_db$plot_network(hits, payload_id = payload_id)                           # 绘制网络时传入payload_id,使节点按上下调信息着色
dev.off()                                                                       # 保存并关闭图形设备

④ clustering分簇

  • STRINGdb还能调用iGraph进行PPI的clustering分簇,get_clusters有这些算法可以选择: fastgreedy(默认), walktrap, edge.betweenness,以下代码演示了用 fastgreedy方法对PPI进行clustering,并展示前6个cluster
## iGraph clustering 互作网络分簇
# 可选聚类算法:fastgreedy(快速贪婪,默认)、walktrap(随机游走)、edge.betweenness(边介数)
# 使用 STRINGdb 自带的聚类函数,基于给定的蛋白 ID 向量进行网络分簇
clustersList <- string_db$get_clusters(string_ids = hits ,     # 输入的 STRING 蛋白 ID 向量
                                       algorithm  = "fastgreedy" ) # 选用 fastgreedy 算法进行社区发现

# 绘制前 6 个聚类的网络图(仅作示例展示)
png("string_PPI_iGraph_cluster.png", units = "in", width = 15, height = 10, res = 400) # 创建 PNG 图形设备,宽15英寸,高10英寸,分辨率400 DPI
par(mfrow = c(2, 3))           # 将绘图区域划分为 2 行 3 列,后续 6 个图将依次填入
for(i in 1:6){                 # 循环从第1到第6个聚类
 string_db$plot_network(clustersList[[i]])  # 绘制第 i 个聚类的蛋白质互作网络子图
}
dev.off()                      # 关闭图形设备,保存文件

⑤ 富集分析

  • 除了以上功能,STRINGdb还能对基因集进行富集分析,参数category指定要使用的数据库(默认为All),其中Process, Component, Function分别对应GO的BP,CC,MF三个子集
# category可选参数:All, Process, Component, Function, Keyword, KEGG, RCTM, Pfam, SMART, InterPro
# 此处选择 "Process" 对应 GO 生物学过程(GO-BP)富集分析
enrichment <- string_db$get_enrichment(string_ids = hits,      # 输入的 STRING 蛋白 ID 向量
                                       category   = "Process" ) # 富集分析类别:生物学过程

# 将富集分析结果保存为 CSV 文件,文件名为 "enrichment_GO_BP.csv"
write.csv(enrichment, "enrichment_GO_BP.csv")

⑥ 获取蛋白互作信息

  • 最后,可使用get_interactions获取蛋白互作信息,再转换stringID为 gene symbol,去除重复(每个相互作用会出现两次),之后导出string_link.csv文件,可在Cytoscape中进一步进行多种可视化操作
############################## 获取蛋白互作信息用于后续可视化 ###############3
# 从 STRING 数据库获取给定 hits(STRING蛋白ID)之间的所有互作关系,返回数据框
dat_link <- string_db$get_interactions(hits)

# 转换stringID为 gene symbol
# 将互作数据框中的 from 列(STRING蛋白ID)通过映射数据框 dat_map 转换为基因名(gene symbol)
dat_link$from <- dat_map[match(dat_link$from, dat_map$STRING_id), 'gene']
# 同理,将 to 列转换为基因名
dat_link$to   <- dat_map[match(dat_link$to,   dat_map$STRING_id), 'gene']

# 为互作数据框的列重命名:node1, node2, combined_score(combined_score 为 STRING 数据库的互作置信度分数)
colnames(dat_link) <- c('node1','node2','combined_score')

# 去除重复的互作对(保留不同的 node1-node2 组合,根据这两列去重,注意 .keep_all = T 保留其他列)
dat_link <- dat_link %>% distinct(node1, node2, .keep_all = T)

# 将整理好的蛋白互作边列表保存为 CSV 文件,不保存行名,字符不带引号
write.csv(dat_link, 'string_link.csv', row.names = F, quote = F)

3. STRING网页版的简单使用

  • 点击SEARCH,会进行匹配string中对应的蛋白,大致预览一下确认正确后,点击CONTINUE即可得PPI图像
SEARCH后界面

分析界面
  • 在分析界面的Vierws选项下可以选择多种展现方式,Legend选项下展现图像各标记的含义;
    Vierws选项

    Legend选项
  • Settings选项下有多项参数可以选择,例如minimum required interaction score可以选择高可信度0.700(默认为0.400),选择完成后点击UPDATE即可更新图像。
Settings选项

调整参数后所得图像
  • Analysis选项下有PPI网络的相关节点信息与GO、KEGG等富集分析结果

    Analysis选项

  • Cluster选项下还可以对PPI网络进行分簇,选择分簇方法(如:kmeans clustering)和分簇数量(如:4)后点击APPLY即可,不同分簇会用不同颜色标注出来

    Cluster选项

    Cluster图像

  • Export选项下进行数据导出,一般选择下载高分辨率的PNG图片与蛋白互作关系TSV文件(下图黄色标记处),TSV文件用于后续在Cytoscape中进一步可视化PPI网络

    Export选项


参考资料
STRINGdb.pdf (bioconductor.org)
用R的bioconductor里面的stringDB包来做PPI分析 | 生信菜鸟团 (bio-info-trainee.com)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容