够用就好的网络分析_03.R语言网络分析实战练习(以PPI为例)

文摘   2024-11-23 23:45   中国香港  

够用就好的网络分析_03.R语言网络分析实战练习(以PPI为例)


如下碎碎念:年末了,实在是忙。
回顾一下这个月的公众号的推文,比较前几个月,冷清了很多。
11月份,我必把够用就好的网络分析彻底终结。
12月份,开启广大粉丝一直期待的ggplot2版本的WGCNA


在这一系列够用就好的网络分析推文中,我们主要涉及到以下内容

  • 01.网络分析及其在生物信息学中的应用
  • 02.网络分析常用软件及常用R包介绍
  • 03.R语言网络分析实战练习
  • 04.网络分析中的各种网络属性
  • 05.网络分析可视化常用布局
  • 06.网络分析可视化之自定义布局

03.R语言网络分析实战练习(以PPI为例)

在生物信息学中,我接触最多主要有两个方向:

  1. 网络分析紧密相关的有蛋白质相互作用PPI (Protein-Protein Interaction)
  2. 微生物的共现网络MCN (Microbial Co-occurrence Network)

从上一期推文中可知igraph是我们使用R&Python进行网络分析的基石

今天笔者简单的介绍一下本人常接触PPIMCN分析, 了解网络分析涉及到的输入数据的格式,快速且简单的构建一个网络。 后续我们再一起探索网络的各种网络属性。

针对PPI, 那么我就不得不提及的就是大名鼎鼎STRING数据库。

这里,我们不去介绍STRING的用法(具体用法,大家请自行百度)。 然后我们开始输入humanSymbol ID 然后进行预测。

我们的测试数据为200humanSymbol ID

然后下载PPI的结果

拿到这个数据之后,我们就可以开始进行PPI的分析以及可视化。

rm(list = ls())

####----load R Package----####
library(tidyverse)
library(readxl)
library(igraph)

####----load Data----####
ppi_df <- read_delim(file = "Input/string_interactions_short.tsv",
                     col_names = T,
                     delim = "\t") %>%
  dplyr::select(1,2,13) %>%
  purrr::set_names(c("from","to","weight"))

head(ppi_df)
# A tibble: 6 × 3
  from    to     weight
  <chr>   <chr>   <dbl>
1 ABCG1   APOA1   0.997
2 ABCG1   CH25H   0.469
3 ABHD16A IFITM3  0.58 
4 ACOD1   IFNG    0.477
5 ACOD1   IRF1    0.429
6 ACOD1   CXCL10  0.695

因此,在进行PPI分析的时候,我们只需要最基础的三列数据,分别是fromtoweight。 既可以构建成为网络对象。

# 基于data.frame,创建网络对象
# 构建有向网络图
igraph_obj1 <- igraph::graph_from_data_frame(ppi_df, directed = T)
igraph_obj1

IGRAPH f825884 DNW- 129 1355 -- 
+ attr: name (v/c), weight (e/n)
+ edges from f825884 (vertex names):
 [1] ABCG1  ->APOA1  ABCG1  ->CH25H  ABHD16A->IFITM3 ACOD1  ->IFNG  
 [5] ACOD1  ->IRF1   ACOD1  ->CXCL10 ACOD1  ->GBP5   ACOD1  ->IFIT3 
 [9] ACOD1  ->MTHFR  ACOD1  ->ISG15  ACOD1  ->RSAD2  ACOD1  ->IRF7  
[13] ADAR   ->USP18  ADAR   ->OAS3   ADAR   ->IRF1   ADAR   ->DHX58 
[17] ADAR   ->BST2   ADAR   ->CMPK2  ADAR   ->OASL   ADAR   ->SP110 
[21] ADAR   ->RTP4   ADAR   ->PARP12 ADAR   ->UBE2L6 ADAR   ->DTX3L 
[25] ADAR   ->STAT2  ADAR   ->TRIM25 ADAR   ->OAS2   ADAR   ->TAP1  
[29] ADAR   ->PARP9  ADAR   ->STAT1  ADAR   ->IFITM3 ADAR   ->PARP14
... omitted several edges

# 查看数据类型
class(igraph_obj1)
# [1] "igraph"

# 构建无向网络
igraph_obj2 <- igraph::graph_from_data_frame(ppi_df, directed = F)
igraph_obj2

IGRAPH 7f65c2d UNW- 129 1355 -- 
+ attr: name (v/c), weight (e/n)
+ edges from 7f65c2d (vertex names):
 [1] ABCG1  --APOA1  ABCG1  --CH25H  ABHD16A--IFITM3 ACOD1  --IFNG  
 [5] ACOD1  --IRF1   ACOD1  --CXCL10 ACOD1  --GBP5   ACOD1  --IFIT3 
 [9] ACOD1  --MTHFR  ACOD1  --ISG15  ACOD1  --RSAD2  ACOD1  --IRF7  
[13] ADAR   --USP18  ADAR   --OAS3   ADAR   --IRF1   ADAR   --DHX58 
[17] ADAR   --BST2   ADAR   --CMPK2  ADAR   --OASL   ADAR   --SP110 
[21] ADAR   --RTP4   ADAR   --PARP12 ADAR   --UBE2L6 ADAR   --DTX3L 
[25] ADAR   --STAT2  ADAR   --TRIM25 ADAR   --OAS2   ADAR   --TAP1  
[29] ADAR   --PARP9  ADAR   --STAT1  ADAR   --IFITM3 ADAR   --PARP14
... omitted several edges

我们对igraph对象进行一个仔细的理解。

igraph_obj1
IGRAPH f825884 DNW- 129 1355 -- 
+ attr: name (v/c), weight (e/n)
+ edges from f825884 (vertex names):
 [1] ABCG1  ->APOA1  ABCG1  ->CH25H  ABHD16A->IFITM3 ACOD1  ->IFNG  
 [5] ACOD1  ->IRF1   ACOD1  ->CXCL10 ACOD1  ->GBP5   ACOD1  ->IFIT3 
 [9] ACOD1  ->MTHFR  ACOD1  ->ISG15  ACOD1  ->RSAD2  ACOD1  ->IRF7  
[13] ADAR   ->USP18  ADAR   ->OAS3   ADAR   ->IRF1   ADAR   ->DHX58 
[17] ADAR   ->BST2   ADAR   ->CMPK2  ADAR   ->OASL   ADAR   ->SP110 
[21] ADAR   ->RTP4   ADAR   ->PARP12 ADAR   ->UBE2L6 ADAR   ->DTX3L 
[25] ADAR   ->STAT2  ADAR   ->TRIM25 ADAR   ->OAS2   ADAR   ->TAP1  
[29] ADAR   ->PARP9  ADAR   ->STAT1  ADAR   ->IFITM3 ADAR   ->PARP14
... omitted several edges
  • 第一行表示这是一个IGRAPH对象,后续跟着的是一个变量的编号,其实没有什么含义f825884
  • 再往后面 4 个字符分别具有重要意义:
  • 第一个字符被分配一个D或一个U,指示igraph对象是有向的directed还是无向undirected的。
  • 第二个字母是N或破折号(-),指示igraph对象是否具有name属性。
  • 第三个字母是W或破折号(-),其边是否具有权重的属性。
  • 最后,第四个字符可以是-或者C,表示简单的图或者复杂的图。
  • 后面的129是节点vertices的个数,1355是边edge的个数。
  • +attr标签后面的括号可以采用以下三个值之一:g表示图形graphv表示顶点verticese表示边edges。 同时引用R中的数据类型:n表示数字numericc表示字符characterl表示逻辑logical
# igraph中有函数,可以直接查看igraph的节点
V(igraph_obj1)

129/129 vertices, named, from f825884:
  [1] ABCG1    ABHD16A  ACOD1    ADAR     APOA1    APOA4    APOD    
  [8] APOL6    BATF2    BST2     C4B      CALCA    CALHM6   CCL7    
 [15] CD180    CD274    CFB      CH25H    CIITA    CMPK2    CXCL10  
 [22] DDX58    DHX58    DTX3L    ENPP2    ENY2     FCER1G   FCGR1A  
 [29] GBP2     GBP3     GBP4     GBP5     GBP6     GBP7     GNS     
 [36] GRN      GYPA     GZMA     HCLS1    HK3      IDO1     IFI35   
 [43] IFI44    IFIT3    IFITM3   IFNG     IL10RA   IL15RA   IL18BP  
 [50] IL2RG    IRAK2    IRF1     IRF7     IRF9     IRGM     ISG15   
 [57] KIF5C    LAP3     LCP2     LGALS3BP LGALS9   LY6E     MX1     
 [64] NOD1     OAS2     OAS3     OASL     PARP10   PARP12   PARP14  
... omitted several vertices

# 查看边的情况
E(igraph_obj1)
1355/1355 edges from f825884 (vertex names):
 [1] ABCG1  ->APOA1  ABCG1  ->CH25H  ABHD16A->IFITM3 ACOD1  ->IFNG  
 [5] ACOD1  ->IRF1   ACOD1  ->CXCL10 ACOD1  ->GBP5   ACOD1  ->IFIT3 
 [9] ACOD1  ->MTHFR  ACOD1  ->ISG15  ACOD1  ->RSAD2  ACOD1  ->IRF7  
[13] ADAR   ->USP18  ADAR   ->OAS3   ADAR   ->IRF1   ADAR   ->DHX58 
[17] ADAR   ->BST2   ADAR   ->CMPK2  ADAR   ->OASL   ADAR   ->SP110 
[21] ADAR   ->RTP4   ADAR   ->PARP12 ADAR   ->UBE2L6 ADAR   ->DTX3L 
[25] ADAR   ->STAT2  ADAR   ->TRIM25 ADAR   ->OAS2   ADAR   ->TAP1  
[29] ADAR   ->PARP9  ADAR   ->STAT1  ADAR   ->IFITM3 ADAR   ->PARP14
[33] ADAR   ->IFI35  ADAR   ->IFI44  ADAR   ->RSAD2  ADAR   ->ZNFX1 
[37] ADAR   ->IFIT3  ADAR   ->ISG15  ADAR   ->IRF7   ADAR   ->MX1   
... omitted several edges

我们也可以简单的对igraph对象进行可视化

plot(igraph_obj1)

我们对数据进行一些布局的改变,我们先看看igraph中有哪些布局

layouts <- grep("^layout_", ls("package:igraph"), value=TRUE)[-1

layouts
[1"layout_as_bipartite"  "layout_as_star"       "layout_as_tree"      
[4"layout_components"    "layout_in_circle"     "layout_nicely"       
[7"layout_on_grid"       "layout_on_sphere"     "layout_randomly"     
[10"layout_with_dh"       "layout_with_drl"      "layout_with_fr"      
[13"layout_with_gem"      "layout_with_graphopt" "layout_with_kk"      
[16"layout_with_lgl"      "layout_with_mds"      "layout_with_sugiyama"
plot(igraph_obj1,
     layout = layout_randomly,
     vertex.label = NA)

plot(igraph_obj1,
     layout = layout_in_circle,
     vertex.label = NA)

plot(igraph_obj1,
     layout = layout_on_sphere,
     vertex.label = NA)

plot(igraph_obj1,
     layout = layout_with_fr,
     vertex.label = NA)

plot(igraph_obj1,
     layout = layout_with_kk,
     vertex.label = NA)

plot(igraph_obj1,
     layout = layout_with_lgl,
     vertex.label = NA)

plot(igraph_obj1,
     layout = layout_as_star,
     vertex.label = NA)
layouts <- layouts[!grepl("bipartite|merge|norm|sugiyama|tree", layouts)]

layouts
[1"layout_as_star"       "layout_components"    "layout_in_circle"    
[4"layout_nicely"        "layout_on_grid"       "layout_on_sphere"    
[7"layout_randomly"      "layout_with_dh"       "layout_with_drl"     
[10"layout_with_fr"       "layout_with_gem"      "layout_with_graphopt"
[13"layout_with_kk"       "layout_with_lgl"      "layout_with_mds"  
pdf(file = "Output/layout.pdf",
    height = 9,
    width = 4)

par(mfrow = c(5,3), mar = c(1,1,1,1))

for (layout in layouts) {
  print(layout)
  l <- do.call(layout, list(igraph_obj1))
  plot(igraph_obj1,
       edge.arrow.mode = 0,
       layout = l,
       vertex.label = NA,
       main = layout)
}

dev.off()

RPython公众号网络可视化预览

笔者之前绘制过诸多的网络可视化,都是基于以上关键R包进行绘制的。

推文链接如下:

注意:里面的龙凤呈祥的感觉其实就是网络可视化实现的。

推文链接如下:

复现了文章中的物种注释图

推文链接如下:

自定义的网络布局

推文链接如下:

PPI互作网络

推文链接如下:

不一样的GO注释

剩下电脑里面就是笔者的小论文和大论文了,这里就不给大家展示了,hhhhhhh。


历史绘图合集

公众号推文一览


进化树合集


环状图


散点图


基因家族合集

换一个排布方式:

首先查看基础版热图:

然后再看进阶版热图:


基因组共线性


WGCNA ggplot2版本


其他科研绘图


合作、联系和交流

有很多小伙伴在后台私信作者,非常抱歉,我经常看不到导致错过,请添加下面的微信联系作者,一起交流数据分析和可视化。


RPython
人生苦短,R和Python。
 最新文章