厚缊

诹图——ggcor简介(八)

厚缊 / 2020-02-08


相关性网络数据处理部分的函数均是高度试验性的,目前来说非常不稳定,所以除了测试和试用,都不推荐使用。预计还需要两轮更新才会稳定下来,多多提优化建议。

网络数据处理

ggcor对几个主流的带相关性系数计算和检验的包的支持均比较友好,而且无论是cor_tbl对象还是mantel_tbl对象,本身转化成相关性网络十分容易,扩展到相关性网络是比较也算是进一步发挥了ggcor的作用。相关性网络(又有说互作网络)的构建无外乎是一个相关系数矩阵和一个p 值矩阵,然后根据需求按照相关系数、p 值等等过滤一部分边和节点,在ggcor中完成这一工作的基础函数cor_network()

library(ggcor)
args(cor_network)
## function (corr, p.value = NULL, row.names = NULL, col.names = NULL, 
##     rm.dup = TRUE, simplify = TRUE, r.thres = 0.6, r.absolute = TRUE, 
##     p.thres = 0.05, val.type = "graph_tbl") 
## NULL

第一个参数是相关系数矩阵,第二个是p 值矩阵(非必须),默认返回(val.type)的是graph_tbl对象(tidygraphggraph所用的数据结构,也可以设置为igraphigraph对象)或者listcor_network列表)。

cor(mtcars) %>% cor_network()
## # A tbl_graph: 11 nodes and 26 edges
## #
## # An undirected simple graph with 1 component
## #
## # Node Data: 11 x 1 (active)
##   name 
##   <chr>
## 1 mpg  
## 2 cyl  
## 3 disp 
## 4 hp   
## 5 drat 
## 6 wt   
## # … with 5 more rows
## #
## # Edge Data: 26 x 3
##    from    to      r
##   <int> <int>  <dbl>
## 1     1     2 -0.852
## 2     1     3 -0.848
## 3     1     4 -0.776
## # … with 23 more rows
cor(mtcars) %>% cor_network(val.type = "igraph")
## IGRAPH 1d3794b UN-- 11 26 -- 
## + attr: name (v/c), r (e/n)
## + edges from 1d3794b (vertex names):
##  [1] mpg --cyl  mpg --disp mpg --hp   mpg --drat mpg --wt   mpg --vs  
##  [7] cyl --disp cyl --hp   cyl --drat cyl --wt   cyl --vs   disp--hp  
## [13] disp--drat disp--wt   disp--vs   hp  --wt   hp  --qsec hp  --vs  
## [19] hp  --carb drat--wt   drat--am   drat--gear wt  --am   qsec--vs  
## [25] qsec--carb am  --gear
cor(mtcars) %>% cor_network(val.type = "list")
## $nodes
## # A tibble: 11 x 1
##    name 
##    <chr>
##  1 mpg  
##  2 cyl  
##  3 disp 
##  4 hp   
##  5 drat 
##  6 wt   
##  7 qsec 
##  8 am   
##  9 vs   
## 10 carb 
## 11 gear 
## 
## $edges
## # A tibble: 26 x 3
##    .row.names .col.names      r
##    <chr>      <chr>       <dbl>
##  1 cyl        mpg        -0.852
##  2 disp       mpg        -0.848
##  3 hp         mpg        -0.776
##  4 drat       mpg         0.681
##  5 wt         mpg        -0.868
##  6 vs         mpg         0.664
##  7 disp       cyl         0.902
##  8 hp         cyl         0.832
##  9 drat       cyl        -0.700
## 10 wt         cyl         0.782
## # … with 16 more rows
## 
## attr(,"class")
## [1] "cor_network"

当然,我们可以加上p 值矩阵。为了简洁,后续除非有必要,我就不会介绍三种输出了,有需要的话可以自己试。

corr <- correlate(mtcars, cor.test = TRUE)
cor_network(corr$r, corr$p.value)
## # A tbl_graph: 11 nodes and 26 edges
## #
## # An undirected simple graph with 1 component
## #
## # Node Data: 11 x 1 (active)
##   name 
##   <chr>
## 1 mpg  
## 2 cyl  
## 3 disp 
## 4 hp   
## 5 drat 
## 6 wt   
## # … with 5 more rows
## #
## # Edge Data: 26 x 4
##    from    to      r  p.value
##   <int> <int>  <dbl>    <dbl>
## 1     1     2 -0.852 6.11e-10
## 2     1     3 -0.848 9.38e-10
## 3     1     4 -0.776 1.79e- 7
## # … with 23 more rows

默认情况下,cor_network()过滤了AB-BA形式的重复值(rm.dup参数),过滤了r的绝对值小于0.6的边(r.thresr.absolute参数),并且只保留显著(p.value参数)的边。r.thresp.thres为非有限值时,不会该变量过滤。

cor_network(corr$r, corr$p.value, 
            rm.dup = FALSE) # 不移除重复的边
## # A tbl_graph: 11 nodes and 63 edges
## #
## # An undirected multigraph with 1 component
## #
## # Node Data: 11 x 1 (active)
##   name 
##   <chr>
## 1 mpg  
## 2 cyl  
## 3 disp 
## 4 hp   
## 5 drat 
## 6 wt   
## # … with 5 more rows
## #
## # Edge Data: 63 x 4
##    from    to      r  p.value
##   <int> <int>  <dbl>    <dbl>
## 1     1     1  1     0.      
## 2     1     2 -0.852 6.11e-10
## 3     1     3 -0.848 9.38e-10
## # … with 60 more rows
cor_network(corr$r, corr$p.value, 
            r.thres = 0.5) # r 按0.5过滤
## # A tbl_graph: 11 nodes and 36 edges
## #
## # An undirected simple graph with 1 component
## #
## # Node Data: 11 x 1 (active)
##   name 
##   <chr>
## 1 mpg  
## 2 cyl  
## 3 disp 
## 4 hp   
## 5 drat 
## 6 wt   
## # … with 5 more rows
## #
## # Edge Data: 36 x 4
##    from    to      r  p.value
##   <int> <int>  <dbl>    <dbl>
## 1     1     2 -0.852 6.11e-10
## 2     1     3 -0.848 9.38e-10
## 3     1     4 -0.776 1.79e- 7
## # … with 33 more rows
cor_network(corr$r, corr$p.value, 
            p.thres = NA) # 不需要按p值过滤
## # A tbl_graph: 11 nodes and 26 edges
## #
## # An undirected simple graph with 1 component
## #
## # Node Data: 11 x 1 (active)
##   name 
##   <chr>
## 1 mpg  
## 2 cyl  
## 3 disp 
## 4 hp   
## 5 drat 
## 6 wt   
## # … with 5 more rows
## #
## # Edge Data: 26 x 4
##    from    to      r  p.value
##   <int> <int>  <dbl>    <dbl>
## 1     1     2 -0.852 6.11e-10
## 2     1     3 -0.848 9.38e-10
## 3     1     4 -0.776 1.79e- 7
## # … with 23 more rows

as_*()系列函数

cor_network()函数是底层,一般情况很少需要直接调用该函数。对于几种常见的相关性分析函数,可以直接调用对应的转换函数。对于cor_tblmantel_tblcorrelationrcorrcorr.test对象,都可以直接调用对应的as_*()函数转成网络,cor_network()的主要参数都是支持的。

as_cor_network()函数

这个函数是cor_network()中参数val.type = "list"的情形,做了二次封装使用更简单一些。后几种有需要的自己运行。

correlate(mtcars, cor.test = TRUE) %>% 
  as_cor_network()
## $nodes
## # A tibble: 11 x 1
##    name 
##    <chr>
##  1 mpg  
##  2 cyl  
##  3 disp 
##  4 hp   
##  5 drat 
##  6 wt   
##  7 qsec 
##  8 am   
##  9 vs   
## 10 carb 
## 11 gear 
## 
## $edges
## # A tibble: 26 x 4
##    .row.names .col.names      r  p.value
##    <chr>      <chr>       <dbl>    <dbl>
##  1 cyl        mpg        -0.852 6.11e-10
##  2 disp       mpg        -0.848 9.38e-10
##  3 hp         mpg        -0.776 1.79e- 7
##  4 drat       mpg         0.681 1.78e- 5
##  5 wt         mpg        -0.868 1.29e-10
##  6 vs         mpg         0.664 3.42e- 5
##  7 disp       cyl         0.902 1.80e-12
##  8 hp         cyl         0.832 3.48e- 9
##  9 drat       cyl        -0.700 8.24e- 6
## 10 wt         cyl         0.782 1.22e- 7
## # … with 16 more rows
## 
## attr(,"class")
## [1] "cor_network"
# Hmisc::rcorr(data.matrix(mtcars)) %>% 
#   as_cor_network()
# psych::corr.test(mtcars) %>% 
#   as_cor_network()
# fortify_cor(mtcars, cor.test = TRUE) %>% 
#   as_cor_network()

as.igraph()函数

这个函数是cor_network()中参数val.type = "igraph"的情形。

correlate(mtcars, cor.test = TRUE) %>% 
  as.igraph()
## IGRAPH 89d91b2 UN-- 11 26 -- 
## + attr: name (v/c), r (e/n), p.value (e/n)
## + edges from 89d91b2 (vertex names):
##  [1] mpg --cyl  mpg --disp mpg --hp   mpg --drat mpg --wt   mpg --vs  
##  [7] cyl --disp cyl --hp   cyl --drat cyl --wt   cyl --vs   disp--hp  
## [13] disp--drat disp--wt   disp--vs   hp  --wt   hp  --qsec hp  --vs  
## [19] hp  --carb drat--wt   drat--am   drat--gear wt  --am   qsec--vs  
## [25] qsec--carb am  --gear
# Hmisc::rcorr(data.matrix(mtcars)) %>% 
#   as_igraph()
# psych::corr.test(mtcars) %>% 
#   as_igraph()
# fortify_cor(mtcars, cor.test = TRUE) %>% 
#   as_igraph()

as_tbl_graph()函数

这个函数是cor_network()中参数val.type = "tbl_graph"的情形。

correlate(mtcars, cor.test = TRUE) %>% 
  as_tbl_graph()
## # A tbl_graph: 11 nodes and 26 edges
## #
## # An undirected simple graph with 1 component
## #
## # Node Data: 11 x 1 (active)
##   name 
##   <chr>
## 1 mpg  
## 2 cyl  
## 3 disp 
## 4 hp   
## 5 drat 
## 6 wt   
## # … with 5 more rows
## #
## # Edge Data: 26 x 4
##    from    to      r  p.value
##   <int> <int>  <dbl>    <dbl>
## 1     1     2 -0.852 6.11e-10
## 2     1     3 -0.848 9.38e-10
## 3     1     4 -0.776 1.79e- 7
## # … with 23 more rows
# Hmisc::rcorr(data.matrix(mtcars)) %>% 
#   as_tbl_graph()
# psych::corr.test(mtcars) %>% 
#   as_tbl_graph()
# fortify_cor(mtcars, cor.test = TRUE) %>% 
#   as_tbl_graph()

网络数据输出

在R中处理网络图还是没有Gephi、cytoscape等交互式的专业软件方便,因此能方便的导出数据可能需求更大。这一功能在ggcor中可以通过export_cor_network()函数来实现。

methods(export_cor_network)
## [1] export_cor_network.cor_network* export_cor_network.cor_tbl*    
## [3] export_cor_network.corr.test*   export_cor_network.correlation*
## [5] export_cor_network.data.frame*  export_cor_network.mantel_tbl* 
## [7] export_cor_network.matrix*      export_cor_network.rcorr*      
## see '?methods' for accessing help and source code

这个函数也是一个S3的泛型函数,底层先转成cor_network对象然后调用utils::write.table()函数输出。

temp <- tempdir()
correlate(mtcars, cor.test = TRUE) %>% 
  export_cor_network(file = paste(temp, "net.csv", sep = "/"))
dir(temp)
## [1] "net.csv"
readr::read_csv(paste(temp, "net.csv", sep = "/"))
## # A tibble: 26 x 4
##    .row.names .col.names      r  p.value
##    <chr>      <chr>       <dbl>    <dbl>
##  1 cyl        mpg        -0.852 6.11e-10
##  2 disp       mpg        -0.848 9.38e-10
##  3 hp         mpg        -0.776 1.79e- 7
##  4 drat       mpg         0.681 1.78e- 5
##  5 wt         mpg        -0.868 1.29e-10
##  6 vs         mpg         0.664 3.42e- 5
##  7 disp       cyl         0.902 1.80e-12
##  8 hp         cyl         0.832 3.48e- 9
##  9 drat       cyl        -0.700 8.24e- 6
## 10 wt         cyl         0.782 1.22e- 7
## # … with 16 more rows
rm(temp)

小结

相关性网络数据处理的部分暂时就是这么多了,R中除了igraphggraph包以外,还有很好的网络图可视化的包可以给我推荐,我研究下那些包的数据结构,可以提供直接支持。

下期预告:相关性网络可视化。