利用R語言作PPI(免String網(wǎng)頁和安裝cytoscape法)

原創(chuàng)來自https://mp.weixin.qq.com/s/xw-x_r9yq6Iiw-4LwyKvWw,本人稍作修改缩歪,原文是針對小鼠莺奸,現(xiàn)改為人類
當?shù)玫讲町惢蚝螅芏鄷r候需要作PPI蛋白互作網(wǎng)絡叠骑,一般需要登陸STRING網(wǎng)站,然后用cytoscape軟件作圖削茁,本文將通過R包STRINGdb(記住是大寫座云,這個包是bioconductor里的,默認的CRAN里有個stringdb付材,名字一模一樣朦拖,但是完全不全,前往不要搞錯)來進行string蛋白互作分析厌衔,同時會利用igraph和ggraph對互作網(wǎng)絡進行可視化璧帝。
首先安裝包,缺啥補啥富寿,沒啥好說的

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")

BiocManager::install("STRINGdb")

進行分析前睬隶,先要創(chuàng)建一個STRINGdb對象:

library(tidyverse)
library(clusterProfiler) # Y叔的包有沒有,這個其實只是為了ID轉換
library(org.Hs.eg.db)  小鼠的話页徐,把Hs改成Mm
 
library(STRINGdb)
library(igraph)
library(ggraph)
# 創(chuàng)建STRINGdb對象
string_db <- STRINGdb$new( version="11", species=9606, 
                           score_threshold=400, input_directory="")

目前version最新版是11,9606是人類苏潜,小鼠是10090
score_threshold是蛋白互作的得分,此值會用于篩選互作結果变勇,400是默認分值恤左,如果要求嚴格可以調(diào)高此值。自己調(diào)即可

  • 構建基因列表搀绣,可以自己定義值飞袋,也可以導入表格,需要表頭
    可以是symbol链患,可以是ENTREZID巧鸭,這個不詳細說
# Y叔的clusterProfiler將Gene Symbol轉換為Entrez ID
gene <- gene %>% bitr(fromType = "SYMBOL", 
                      toType = "ENTREZID", 
                      OrgDb = "org.Hs.eg.db", 
                      drop = T)

轉換后是這樣的


image.png

使用map函數(shù)用于將基因匹配到STRING數(shù)據(jù)庫的ID,map函數(shù)的幫助信息可以查看STRINGdb$help("map")麻捻。然后plot_network繪圖即可纲仍。中途需要在線下載數(shù)據(jù)呀袱,慢慢等吧。

data_mapped <- gene %>% string_db$map(my_data_frame_id_col_names = "ENTREZID", 
                removeUnmappedRows = TRUE)
string_db$plot_network( data_mapped$STRING_id )
網(wǎng)址畫圖

R語言畫圖

可以發(fā)現(xiàn)和官網(wǎng)的出圖是一樣的郑叠。這里不是重點夜赵,只是為了說明STRINGdb的基礎用法,就不再展開了锻拘。

使用get_interactions獲取蛋白互作信息,以用于后續(xù)可視化击蹲。

需在線下載數(shù)據(jù)署拟,等著。歌豺。推穷。

hit<-data_mapped$STRING_id
info <- string_db$get_interactions(hit)

info包含了蛋白互作的信息,比較重要的是前兩列和最后一列:from类咧、to馒铃、combined_score,前兩列指定了蛋白互作關系的基因?qū)弁铮詈笠涣惺谴说鞍谆プ麝P系的得分区宇。
info數(shù)據(jù)將用于后續(xù)分析。
info的結果是這樣的

image.png

使用igraph和ggraph可視化蛋白互作網(wǎng)絡圖
先使用igraph創(chuàng)建網(wǎng)絡數(shù)據(jù)值戳,并進行必要的處理议谷,然后轉到ggraph繪圖。

# 轉換stringID為Symbol堕虹,只取前兩列和最后一列
links <- info %>%
  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)
# 節(jié)點數(shù)據(jù)
nodes <- links %>% { data.frame(gene = c(.$from, .$to)) } %>% distinct()
# 創(chuàng)建網(wǎng)絡圖
# 根據(jù)links和nodes創(chuàng)建
net <- igraph::graph_from_data_frame(d=links,vertices=nodes,directed = F)
# 添加一些參數(shù)信息用于后續(xù)繪圖
# V和E是igraph包的函數(shù)卧晓,分別用于修改網(wǎng)絡圖的節(jié)點(nodes)和連線(links)
igraph::V(net)$deg <- igraph::degree(net) # 每個節(jié)點連接的節(jié)點數(shù)
igraph::V(net)$size <- igraph::degree(net)/5 #
igraph::E(net)$width <- igraph::E(net)$weight/10
# 使用ggraph繪圖
# ggraph是基于ggplot2的包,語法和常規(guī)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()

這里的參數(shù)設置是節(jié)點的大小和其連接的線的數(shù)量有關赴捞,線數(shù)量越多則點越大逼裆;線的寬度和其蛋白互作的得分有關,得分越高則越寬赦政。只顯示節(jié)點數(shù)大于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()
stree法作圖
  • 環(huán)形布局
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()
image.png

上面的幾張圖可以看到有幾個單一的互作關系,其和主網(wǎng)絡并不相連恢着,像這種互作關系可以去掉掸屡,此時出來的圖就會更加美觀。

# 去除游離的互作關系
# 如果links數(shù)據(jù)框的一個link的from只出現(xiàn)過一次然评,同時to也只出現(xiàn)一次仅财,則將其去除
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)
# 新的節(jié)點數(shù)據(jù)
nodes_2 <- links_2 %>% { data.frame(gene = c(.$from, .$to)) } %>% distinct()
# 創(chuàng)建網(wǎng)絡圖
net_2 <- igraph::graph_from_data_frame(d=links_2,vertices=nodes_2,directed = F)
# 添加必要的參數(shù)
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

如果去除了游離的互作關系,那么可以使用一種中心布局的方式碗淌,它是根據(jù)一個節(jié)點的連接數(shù)而排列其位置盏求,連接數(shù)越大抖锥,節(jié)點越傾向于在中間位置排列,會更容易看得出重要節(jié)點碎罚。

另外環(huán)形布局的線使用弧形線(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()
image.png
  • 除了使用igraph創(chuàng)建網(wǎng)絡圖外磅废,也可以使用tidygraph的as_tbl_graph函數(shù)處理數(shù)據(jù),然后使用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()
image.png
links_2 %>% tidygraph::as_tbl_graph() %>%
  ggraph(layout = "stress")+
  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()
image.png
links_2 %>% tidygraph::as_tbl_graph() %>%
    ggraph(layout = "linear", circular = TRUE)+
    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()
image.png
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荆烈,一起剝皮案震驚了整個濱河市拯勉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌憔购,老刑警劉巖宫峦,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異玫鸟,居然都是意外死亡导绷,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門屎飘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妥曲,“玉大人,你說我怎么就攤上這事钦购¢苊耍” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵押桃,是天一觀的道長遵堵。 經(jīng)常有香客問我,道長怨规,這世上最難降的妖魔是什么陌宿? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮波丰,結果婚禮上壳坪,老公的妹妹穿的比我還像新娘。我一直安慰自己掰烟,他們只是感情好爽蝴,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纫骑,像睡著了一般蝎亚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上先馆,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天发框,我揣著相機與錄音,去河邊找鬼煤墙。 笑死梅惯,一個胖子當著我的面吹牛宪拥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铣减,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼她君,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了葫哗?” 一聲冷哼從身側響起缔刹,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劣针,沒想到半個月后校镐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡酿秸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年灭翔,在試婚紗的時候發(fā)現(xiàn)自己被綠了魏烫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辣苏。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哄褒,靈堂內(nèi)的尸體忽然破棺而出稀蟋,到底是詐尸還是另有隱情,我是刑警寧澤呐赡,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布退客,位于F島的核電站,受9級特大地震影響链嘀,放射性物質(zhì)發(fā)生泄漏萌狂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一怀泊、第九天 我趴在偏房一處隱蔽的房頂上張望茫藏。 院中可真熱鬧,春花似錦霹琼、人聲如沸务傲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽售葡。三九已至,卻和暖如春忠藤,著一層夾襖步出監(jiān)牢的瞬間挟伙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工模孩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留像寒,地道東北人烘豹。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像诺祸,于是被迫代替她去往敵國和親携悯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354