R优雅绘制小样本间相关性网络图

2024-01-23 13:57:35 浏览数 (1)

欢迎关注R语言数据分析指南

❝最近有观众老爷询问绘制相关性分析网络图中的报错,本节就来解答如何处理这个问题,整个过程仅参考。希望对各位观众老爷能有所帮助。「数据代码已经整合上传到会员交流群」,购买过小编VIP的朋友可在所加的会员群内获取下载,有需要的朋友可关注文末介绍加入VIP交流群。 ❞

❝给予长期支持我们的忠实读者们一个特别待遇,我们提供了一个持续更新的数据可视化会员文档库。「这份文档包含数百个数据可视化文档,是学习和提升技能的理想选择」。一次性付费,您就可以长期享受到持续更新的资源,有效地提升您的R语言应用能力。 ❞

「2024更新的绘图内容同时包含数据 代码 markdown注释文档 文档清单」

具体问题如下
代码语言:javascript复制
Error in rcorr(t(df), type = "spearman") : must have >4 observations

报错信息表明rcorr函数在尝试计算Spearman相关性时遇到了问题,原因是数据中的某些变量(列)的观测值数量不足以进行相关性分析。具体来说rcorr 函数要求每个变量至少有5个观测值来计算相关性。

解决方案

❝由于在进行实验设计时,通常多为设置3重复,若我们想分析每一组内不同样本之间的相关性就会频繁遇到这种问题,使用内置的R包则无法解决问题,因为需要我们进行自定义分析函数来进行相关性分析. ❞

加载R包

代码语言:javascript复制
library(tidyverse)
library(ggraph)
library(Hmisc)
library(igraph)

加载R函数

代码语言:javascript复制
source("corrr.R")
代码语言:javascript复制
df <- read_tsv("gene.xls") %>% column_to_rownames(var="id") %>% 
  filter(rowSums(.) >= 2)

计算相关性

代码语言:javascript复制
df_cor <- corrr(t(df))
df_cor_r <- df_cor$r
df_cor_p <- df_cor$P
df_cor_r[df_cor_p>0.05|abs(df_cor_r)<0.7] = 0

将邻接矩阵转换为边列表

代码语言:javascript复制
edge_list <- df_cor_r %>%
  as_tibble(rownames = "from") %>%
  pivot_longer(cols = -from, names_to = "to", values_to = "weight") %>%
  filter(weight != 0, from != to) # 过滤掉权重为0的边和自环

创建图形

代码语言:javascript复制
df_igraph <- graph_from_data_frame(edge_list, directed = FALSE)

提取边的权重

代码语言:javascript复制
df.weight <- E(df_igraph)$weight

edge_attributes <- tibble(weight = df.weight) %>%
  mutate(
    color = case_when(
      weight > 0 ~ "#E6956F",
      weight < 0 ~ "#788FCE",
      TRUE ~ "gray"
    ),
    width = abs(weight) * 2.5
  )

构建点数据

代码语言:javascript复制
node_sizes <- df %>%
  rowSums() %>%
  enframe(name = "name", value = "size") %>%
  mutate(size = log10(size) * 2.5) %>%
  filter(name %in% V(df_igraph)$name)

数据可视化

代码语言:javascript复制
portraits <- create_layout(df_igraph, layout = 'circle') 

ggraph(df_igraph, layout = "circle") 
  geom_edge_arc(aes(color=color),edge_width = 0.4,show.legend = F,
                curvature=0.2) 
  geom_node_point(aes(size=size),shape = 21,show.legend =F,fill="#788FCE") 
  scale_edge_colour_manual(values=c("#788FCE","red")) 

  theme_graph() 
  expand_limits(x = c(-1.2, 1.2), y = c(-1.2, 1.2))

0 人点赞