R:STRINGdb包用於string蛋白互作分析

2021-02-15 生信菜鳥團

使用STRING資料庫進行蛋白互作分析是生信常規下遊分析項目之一。

本文將通過R包STRINGdb來進行string蛋白互作分析,同時會利用igraph和ggraph對互作網絡進行可視化。

STRINGdb包用於蛋白互作分析

STRINGdb包有別於其他的R包,它的幫助信息不是使用help函數查看,而是傳給STRINGdb$help(),如使用STRINGdb$help("map")查看map函數的幫助。如需要查看它的vignette文檔,可以使用vignette("STRINGdb")命令。

map和plot_network用於蛋白互作分析

進行分析前,先要創建一個STRINGdb對象:

library(tidyverse)
library(clusterProfiler)
library(org.Mm.eg.db)

library(STRINGdb)
library(igraph)
library(ggraph)
# 創建STRINGdb對象
string_db <- STRINGdb$new( version="10", species=10090,
                           score_threshold=400, input_directory="")

其中species代表物種編碼,它是NCBI Taxonomy的物種編碼(http://www.ncbi.nlm.nih.gov/taxonomy),其中人的編碼為9606,小鼠的編碼為10090,這裡使用小鼠的編碼,因為下面分析的基因來源於小鼠。

score_threshold是蛋白互作的得分,此值會用於篩選互作結果,400是默認分值,如果要求嚴格可以調高此值。

# 需要分析的基因
# 這些基因我測試過,就不再找其他的基因測試了(比如clusterProfiler裡面的geneList基因集)
gene <- c('Drd2','Lrrc10b','Adora2a','Gpr6','Syndig1l','Rgs9','Drd1','Scn4b','Gpr88','Pde10a',
  'Rasd2','Ppp1r1b','Pde1b','Adcy5','Gng7','Arpp21','Hpca','Kcnab1','Ptpn5','St8sia3',
  'Spock3','Penk','Rxrg','Tmem158','Pcp4','Tac1','Gnal','Rasgrp2','Ano3','Vxn','Trbc2',
  'Ighm','Tbr1','Nptx1','Nr4a2','Ccn2','Plp1','Mbp','Trf','Cnp','Mobp','Qdpr','Mal',
  'Mag','Plekhb1','Cldn11','Cryab','Car2','Tspan2','Csrp1','Sept4','Bcas1','Mog','Qk',
  'Ermn','Ndrg1','Apod','Gatm','Olig1','Gpr37','Tmem88b','Pllp','Dbndd2','Opalin',
  'Ppp1r14a','Ugt8a','Fa2h','Grb14','Gsn','Evi2a','Lamp5','Rasgrf2','Eomes','Ms4a15',
  'Th','Cdhr1','Nmb','Doc2g','S100a5','Islr','Ly6g6e','Calb2','Trh','Fabp7','Slc6a11',
  'Csdc2','Nrip3','Lbhd2','Reln','Rab3b','Ptn','Kctd12','Ptgds','Mgp','Stx1a','Baiap3',
  'Nts','Zcchc12','Nap1l5','Resp18','Tmem130','Ndn','Gprasp2','Lypd1','Ahi1','Hap1',
  'Hpcal1','Pnck','Vat1l','Wdr6','Nnat','6330403K07Rik','Sst','Pdyn','Tac1','Strip2',
  'Drd1','Wfs1','Ppp1r2','Penk','Rgs9','Pde1b','Pde10a','Gpr88','Ppp1r1b','Tafa2',
  'Lmo3','Slc30a3','Nptxr','Rprm','Cartpt','Rhcg','Ctxn3','Sp8','Lgr6','Dlx2','Dlx1',
  'Dcx','Shisa8','Ablim3','Sp9','Tuba8','Myo16','Isoc1','Sall1','Cacng5','Pbx3','Gpsm1',
  'Gng4','Kank3','Tshz1','Pcbp3','Ptpro','Cpne4','Ppp1r12b','Synpr','Gm17750','Ampd2',
  'Meis2','Ankrd6','Ppm1e','Pbx1','Inpp5j','Grb2','Csdc2','Gprc5b','Nrep','Rgs12',
  'Cpne6','Kcnip1','Rasa2','Dclk2','Gprin1','Btg1','Dync1i1','Sox4','Gad1','Gm27032',
  'Ppp1cc','Syt6','Eml5','Rragd','Pcp4l1','Nrip3','Rasl11b','Gdpd5','Prkca','Marcksl1',
  'Tubb2b','Pacsin2','Kcnf1','Hap1','Calb2','Stxbp6','Nr2f2','Six3','Ramp3','Pvalb',
  'Unc13c','Vamp1','Gpx1','Kcnc1','Spp1','Gad1','Agt','Lgi2','Nefh','Prkcd','Esrrg',
  'Kcnip1','Prr32','Cldn2','Calml4','Slc4a5','Otx2','Kcne2','Steap1','Tmem72','Ccdc153',
  'Tmem212','F5','Col8a2','Kcnj13','Wfdc2','Folr1','Cfap126','Lbp','2900040C04Rik',
  'Trpv4','Sostdc1','Col8a1','Prlr','Tuba1c','Dynlrb2','Wdr86','Abca4','Msx1','Kl',
  'Gm19935','Foxj1','Ecrg4','Rdh5','Rsph1','Mia','Cdkn1c','Aqp1','Cox6b2','Clic6',
  'Prelp','Slc2a12','Slc13a4','Col9a3','Ace','1110017D15Rik','Igf2','Bst2','Car12',
  'Lgals3bp','Cab39l','Slc29a4','Sulf1','Pcolce','Ttr','Enpp2','Fxyd1','Slc4a2','Pltp',
  'Igfbp2','Rbp1','Rarres2','Cd24a','Ezr','Trpm3','1700094D03Rik','Car14','Ctsd',
  'Slc31a1','Ifi27','Cd9','Ifitm3','Dbi','Ccnd2','Vamp8','Ucp2','Cd63','Hemk1','Spint2',
  'Slc12a2','Plxnb2','Ephx1','Stk39','Tcn2','Vim','Emb','Hba-a2','Hbb-bs','Hba-a1',
  'Gfap','Spink8','Rasd1','Shisa6','Npy2r','Cabp7','Olfml2b','Homer3','Neurod6','Nr4a3',
  'Tanc1','Cnih2','Gabra5','Neurod2','Wipf3','Nr3c2','Zbtb18','Pcdh20','Arhgef25',
  'Prdm8','Epha4','Arpc5','Nell2','Hpca','Slit1','Crym','Hs3st4','Prkca','Chgb','Cpne6',
  'Dock9','Prkcg','Cpne7','Grin2a','Dkk3','Nt5dc3','Ak5','Rgs14','St6galnac5','Nptxr',
  'Nptx1','Bok')

# 將Gene Symbol轉換為Entrez ID
gene <- gene %>% bitr(fromType = "SYMBOL", 
                      toType = "ENTREZID", 
                      OrgDb = "org.Mm.eg.db", 
                      drop = T)

使用map函數用於將基因匹配到STRING資料庫的ID,map函數的幫助信息可以查看STRINGdb$help("map")。然後plot_network繪圖即可。

data_mapped <- gene %>% string_db$map(my_data_frame_id_col_names = "ENTREZID", 
                removeUnmappedRows = TRUE)
string_db$plot_network( data_mapped$STRING_id )

可以發現和官網的出圖是一樣的。這裡不是重點,只是為了說明STRINGdb的基礎用法,就不再展開了。

使用get_interactions獲取互作信息用於後續可視化分析

使用get_interactions獲取蛋白互作信息,以用於後續可視化。

data_links <- data_mapped$STRING_id[1:100] %>% string_db$get_interactions()

data_links包含了蛋白互作的信息,比較重要的是前兩列和最後一列:from、to、combined_score,前兩列指定了蛋白互作關係的基因對,最後一列是此蛋白互作關係的得分。

data_links數據將用於後續分析。

使用igraph和ggraph可視化蛋白互作網絡圖

先使用igraph創建網絡數據,並進行必要的處理,然後轉到ggraph繪圖。

# 轉換stringID為Symbol,只取前兩列和最後一列
links <- data_links %>%
  mutate(from = data_mapped[match(from, data_mapped$STRING_id), "SYMBOL"]) %>% 
  mutate(to = data_mapped[match(to, data_mapped$STRING_id), "SYMBOL"]) %>%  
  dplyr::select(from, to , last_col()) %>% 
  dplyr::rename(weight = combined_score)
# 節點數據
nodes <- links %>% { data.frame(gene = c(.$from, .$to)) } %>% distinct()
# 創建網絡圖
# 根據links和nodes創建
net <- igraph::graph_from_data_frame(d=links,vertices=nodes,directed = F)
# 添加一些參數信息用於後續繪圖
# V和E是igraph包的函數,分別用於修改網絡圖的節點(nodes)和連線(links)
igraph::V(net)$deg <- igraph::degree(net) # 每個節點連接的節點數
igraph::V(net)$size <- igraph::degree(net)/5 #
igraph::E(net)$width <- igraph::E(net)$weight/10

# 使用ggraph繪圖
# ggraph是基於ggplot2的包,語法和常規ggplot2類似
ggraph(net,layout = "kk")+
  geom_edge_fan(aes(edge_width=width), color = "lightblue", show.legend = F)+
  geom_node_point(aes(size=size), color="orange", alpha=0.7)+
  geom_node_text(aes(filter=deg>5, label=name), size = 5, repel = T)+
  scale_edge_width(range = c(0.2,1))+
  scale_size_continuous(range = c(1,10) )+
  guides(size=F)+
  theme_graph()

這裡的參數設置是節點的大小和其連接的線的數量有關,線數量越多則點越大;線的寬度和其蛋白互作的得分有關,得分越高則越寬。只顯示節點數大於5的基因名稱。

布局方式有多種,除了剛才的kk方法,還有stress布局:

ggraph(net,layout = "stress")+
  geom_edge_fan(aes(edge_width=width), color = "lightblue", show.legend = F)+
  geom_node_point(aes(size=size), color="orange", alpha=0.7)+
  geom_node_text(aes(filter=deg>5, label=name), size = 5, repel = T)+
  scale_edge_width(range = c(0.2,1))+
  scale_size_continuous(range = c(1,10) )+
  guides(size=F)+
  theme_graph()

環形布局:

ggraph(net,layout = "linear", circular = TRUE)+
  geom_edge_fan(aes(edge_width=width), color = "lightblue", show.legend = F)+
  geom_node_point(aes(size=size), color="orange", alpha=0.7)+
  geom_node_text(aes(filter=deg>5, label=name), size = 5, repel = F)+
  scale_edge_width(range = c(0.2,1))+
  scale_size_continuous(range = c(1,10) )+
  guides(size=F)+
  theme_graph()

上面的幾張圖可以看到有幾個單一的互作關係,其和主網絡並不相連,像這種互作關係可以去掉,此時出來的圖就會更加美觀。

# 去除游離的互作關係
# 如果links數據框的一個link的from只出現過一次,同時to也只出現一次,則將其去除
links_2 <- links %>% mutate(from_c = count(., from)$n[match(from, count(., from)$from)]) %>%
  mutate(to_c = count(., to)$n[match(to, count(., to)$to)]) %>%
  filter(!(from_c == 1 & to_c == 1)) %>%
  dplyr::select(1,2,3)
# 新的節點數據
nodes_2 <- links_2 %>% { data.frame(gene = c(.$from, .$to)) } %>% distinct()
# 創建網絡圖
net_2 <- igraph::graph_from_data_frame(d=links_2,vertices=nodes_2,directed = F)
# 添加必要的參數
igraph::V(net_2)$deg <- igraph::degree(net_2)
igraph::V(net_2)$size <- igraph::degree(net_2)/5
igraph::E(net_2)$width <- igraph::E(net_2)$weight/10

如果去除了游離的互作關係,那麼可以使用一種中心布局的方式,它是根據一個節點的連接數而排列其位置,連接數越大,節點越傾向於在中間位置排列,會更容易看得出重要節點。

ggraph(net_2,layout = "centrality", cent = deg)+
  geom_edge_fan(aes(edge_width=width), color = "lightblue", show.legend = F)+
  geom_node_point(aes(size=size), color="orange", alpha=0.7)+
  geom_node_text(aes(filter=deg>5, label=name), size = 5, repel = T)+
  scale_edge_width(range = c(0.2,1))+
  scale_size_continuous(range = c(1,10) )+
  guides(size=F)+
  theme_graph()

另外環形布局的線使用弧形線(geom_edge_arc)會更美觀:

ggraph(net,layout = "linear", circular = TRUE)+
  geom_edge_arc(aes(edge_width=width), color = "lightblue", show.legend = F)+
  geom_node_point(aes(size=size), color="orange", alpha=0.7)+
  geom_node_text(aes(filter=deg>5, label=name), size = 5, repel = F)+
  scale_edge_width(range = c(0.2,1))+
  scale_size_continuous(range = c(1,10) )+
  guides(size=F)+
  theme_graph()

除了使用igraph創建網絡圖外,也可以使用tidygraph的as_tbl_graph函數處理數據,然後使用ggraph繪圖:

links_2 %>% tidygraph::as_tbl_graph() %>%
  ggraph(layout = "kk")+
  geom_edge_fan(color = "grey")+
  geom_node_point(size=5, color="blue", alpha=0.8)+
  geom_node_text(aes(label=name), repel = T)+
  theme_void()

參考資料

網絡數據可視化(3修訂版)ggraph:ggplot2的網絡可視化 https://mp.weixin.qq.com/s/jV8KEMudy9-L_EYwvAgYSA

文末友情推薦

要想真正入門生物信息學建議務必購買全套書籍,一點一滴攻克計算機基礎知識,書單在:什麼,生信入門全套書籍僅需160 。如果大家沒有時間自行慢慢摸索著學習,可以考慮我們生信技能樹官方舉辦的學習班:

•數據挖掘學習班第5期(線上直播3周,馬拉松式陪伴,帶你入門),原價4800的數據挖掘全套課程, 疫情期間半價即可搶購。•生信爆款入門-第7期(線上直播4周,馬拉松式陪伴,帶你入門),原價9600的生信入門全套課程,疫情期間3.3折即可搶購。

如果你課題涉及到轉錄組,歡迎添加一對一客服:詳見:你還在花三五萬做一個單細胞轉錄組嗎?

相關焦點

  • String:蛋白互作網絡(PPI)分析資料庫
    String資料庫是一個搜索已知蛋白質之間和預測蛋白質之間相互作用的資料庫,該資料庫可應用於2031個物種,包含960萬種蛋白和1380萬中蛋白質之間的相互作用。它除了包含有實驗數據、從PubMed摘要中文本挖掘的結果和綜合其他資料庫數據外,還有利用生物信息學的方法預測的結果。
  • R語言-stringr-字符串處理
    R中字符串不像python中可以用加號連接字符串,如下所示:R 版本#base Rpaste0('a','b')#stringr#base Rpaste0(c('a','b','d','e'),collapse = ',')#stringrstr_c(c('a','b','d','e'),collapse = ',')  #collapse 參數控制
  • R語言可視化之UpSetR包
    今天介紹一個R包UpSetR,專門用來集合可視化,來源於UpSet,Python裡面也有一個相似的包py-upset。此外還有個UpSetR shiny app以及原始碼.active = F), list(query = intersects, params = list("Action","Drama"), active = T, query.name = "Emotional action")))參數attribute.plots主要是用於添加屬性圖
  • 蛋白組學/代謝組學如何快速從主流資料庫中獲取人/小鼠數據?
    :肌球蛋白9(Myosin-9); 可以看到該蛋白主要分布在細胞基質中,是細胞的動力蛋白;◆生信分析:這個R包不太冷系列——GOplot(功能富集繪圖)◆生信分析:10行代碼讓你的相關性圖貌美如花◆生信分析:對話百年名畫--文章繪圖配色高級又簡單!
  • 蛋白組學/代謝組學如何快速從主流資料庫中獲取人/小鼠數據?
    Reference Sequence: NC_000022.11,起個合適的文件名,推薦使用基因名或者資料庫登錄號;(5)物種基因組和蛋白組序列的下載選擇Genome子資料庫,同樣在搜索框輸入物種英文名或拉丁學名,例如,輸入human,我們查找人的基因組數據,如下所示:點擊下載基因組或蛋白組
  • STRING:蛋白質相互作用(PPI網絡)資料庫簡介
    研究蛋白之間的相互作用網絡,有助於挖掘核心的調控基因,目前已經有很多的蛋白質相互作用的資料庫,而string絕對是其中覆蓋的物種最多,相互作用信息做大的一個,網址如下https://string-db.org/該資料庫的最新版本為version 10.5, 更新於2017年5月14號,
  • 機器學習的R包
    R語言:R語言可以使用rpart包實現決策樹fit3 <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis,control = rpart.control(cp = 0.05))其中參數
  • 整理了一些自己可能會用到的R包~20210125更新
    更新於2021年1月25號gtable生信菜鳥團 公眾號分享的文章 R包:gtable包用於處理ggplot2圖像ggrgl畫三維圖 在 微生物生信 看到的推文 ggrgl:用ggplot做3D圖表rayshader公眾號有人留言說這個包做ppt很好用,我查了一下,大體看了一眼幫助文檔
  • Teleport v2.5發布,支持限制包大小與自定義包協議
    可用於Peer-Peer對等通信、RPC、長連接網關、微服務、推送服務,遊戲服務等領域。這次升級新增了自定義通信協議、包大小限制等一些新特性,並作了一系列深度優化。,支持列印輸入、輸出消息的詳細信息(狀態碼、消息頭、消息體) 伺服器和客戶端之間對等通信,兩者API方法基本一致 底層通信數據包包含Header和Body兩部分 支持單獨定製Header和Body編碼類型,例如JSON Protobuf string Body支持gzip壓縮 Header包含狀態碼及其描述文本
  • STRING:蛋白相互作用資料庫的使用
    對於基因組數據分析而言的話,我們能用到網絡分析的就是蛋白相互作用分析(protein-protein ineraction, PPI)分析了。蛋白相互作用分析的資料庫有很多,至於為什麼選擇STRING,還是在於其強大的可視化,以及自定義功能。
  • 島津推出用於分析疏水多肽蛋白的MALDI新基質
    島津製作所(SSI)近日發布了ATHAP-MALDI基質方法工具包,用於改進對包含跨膜疏水蛋白和多肽的分析能力。傳統的LC-MS/MS和MALDI-TOF 很難分析包含疏水基團的膜蛋白。烷基化三羥基苯乙酮(ATHAP)新基質在此方法中發揮了特殊的作用。
  • 從String中移除空白字符的多種方式!?差別竟然這麼大!
    stringAfterTrim = stringWithSpace.strip(); System.out.println("After strip : \'" + stringAfterTrim + "\'"); } } 我們在字符串前後都增加了一個特殊的字符
  • Nature | 大量未被報導的蛋白互作被鑑定
    在激素合成方面,一種激素可以調控另一種植物激素的合成;在信號轉導方面,植物激素的信號轉導途徑存在著複雜的交互作用,同一個調控蛋白也可能在多條信號途徑中共同起作用。因此,不同植物激素的信號途徑之間存在複雜的調控網絡,但不同激素信號通路之間是如何通過蛋白網絡互作的目前還不完全清楚。
  • C#初學者教程系列4:C 數據類型示例,int、double、string、var
    這些數據類型用於建立在應用程式中使用的值。讓我們探索C#中可用的基本數據類型。對於每個示例,我們將只修改Program.cs文件中的main函數。本示例僅展示了基本的幾種類型,實際上它的類型不只於此。僅以本文作拋磚引玉之意。1)int類型整數數據類型用於處理數字。在這種情況下,數字是整數,例如10、20或30。在C#中,數據類型由Int32關鍵字表示。
  • stringTie:轉錄本組裝和定量工具
    能夠進行定量的軟體有很多,本文主要介紹stringTie這款軟體。為了順應測序和分析的新趨勢,原本的開發團隊對整個pipeline進行了全面升級, 用hisat 代替tophat, 用stringTie + ballgown 代替cufflinks + cuffdiff。
  • 真香|誰說的 StringJoiner 不好!真香警告……
    public static void main(String[] args) { StringJoiner stringJoiner = new StringJoiner(","); stringJoiner.add("hello"); stringJoiner.add("world");System.out.println(stringJoiner.toString());}StringJoiner
  • R包ggrepel解決散點圖樣品標籤重疊,方便篩選樣品
    而在樣品比較、樣品篩選時又必須看清這些點名字,用於篩選掉一些記錄錯誤、未報抗生素使用或隱性疾病等異常樣品。ggplot2的輔助包ggrepel就是專門處理遮蓋問題的專家。有了人類可讀的可視化結果,在我們下遊分析、樣品篩選、異常樣品鑑定更加方便高效。
  • Cell:揭示染色質調節蛋白特異性組合調控染色質活性
    根據2011年12月23日發表在《細胞》雜誌上的一篇研究論文,研究小組發現染色質調節蛋白的特異性組合控制比較重要的染色質活性,比如組蛋白修飾。組蛋白是組成染色質的非基因物質的一部分。通過修飾這些蛋白,染色質影響內在的DNA遺傳密碼如何翻譯。
  • 【R語言】相關性分析、相關係數的顯著性檢驗及可視化
    相關性分析用於評估兩個或多個變量之間的關聯,能通過定量指標描述變量之間的強弱、直接或間接聯繫。相關係數是對變量之間的相關程度的定量描述,相關係數值介於-1~1之間,越接近0相關性越低,越接近-1或1相關性越高;正負號表明相關方向,正號為正相關、負號為負相關。當數據呈正態分布時,才可以使用相關性分析。可以使用Shapiro-Wilk test進行檢查數據是否滿足正態分布。