如何绘制 R 中多个数据集之间的数据方差分布?

How can I draw a data variance distribution among multiple datasets in R?

我有三个生物医学数据集(1 个二进制矩阵、1 个连续矩阵和 1 个离散矩阵)。现在,我想画一个三合一的数据(方差或中位数或均值)分布图,然后根据三个数据集的 D'Agostino 检验计算偏度和 P 值。 具体来说,在每个分布曲线中,x 轴表示基因的(方差或均值或中值),而 y 轴表示样本中基因的频率或密度。

下图和我想要的结果差不多

这是可重现的数据集。

-df1:

df1 = structure(c(-0.056, -0.056, -0.056, -0.056, -0.056, -0.1388, 
              -0.1388, -0.1388, -0.1388, -0.1388, -0.0592, -0.0592, -0.0592, 
              -0.0592, -0.0592, -0.0646, -0.0646, -0.0646, -0.0646, -0.0646, 
              -0.1669, -0.1669, -0.1669, -0.1669, -0.1669), .Dim = c(5L, 5L
              ), .Dimnames = list(c("TCGA-4H-AAAK-01", "TCGA-5L-AAT0-01", "TCGA-5T-A9QA-01", 
                                    "TCGA-A1-A0SB-01", "TCGA-A1-A0SD-01"), c("TBC1D21", "FGF4", "KRTAP9-4", 
                                                                             "PSG11", "ADAM5")))

-df2:

df2 = structure(c(0L, 0L, 2L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 2L, 
                  0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 2L, 0L, 0L), .Dim = c(5L, 
                                                                            5L), .Dimnames = list(c("TCGA-4H-AAAK-01", "TCGA-5L-AAT0-01", 
                                                                                                    "TCGA-5T-A9QA-01", "TCGA-A1-A0SB-01", "TCGA-A1-A0SD-01"), c("GPR124", 
                                                                                                                                                                "ERLIN2", "LOC728024", "PROSC", "KCNU1")))

-df 3:

df3 = structure(c(0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 
                  0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L), .Dim = c(5L, 
                                                                            5L), .Dimnames = list(c("TCGA-4H-AAAK-01", "TCGA-5L-AAT0-01", 
                                                                                                    "TCGA-5T-A9QA-01", "TCGA-A1-A0SB-01", "TCGA-A1-A0SD-01"), c("PIK3CA", 
                                                                                                                                                                "TP53", "TTN", "MUC16", "CDH1")))

我一直在网上积极搜索,但没有一个对我的愿望有用。任何帮助将不胜感激。提前致谢。

我认为第一步是将我的三个数据集合并为一个:

MYdata = do.call("rbind", list(t(df1), t(df2),t(df3)))

然后,我将计算三个数据集的方差:

MYdata = var(MYdata)

最后,我必须使用 ggplot2 绘制它们(我认为)但是对于像我这样的新 R 用户来说它太复杂了。

根据我的理解,你有三个数据集,你想绘制成一个图形,每个数据集中的值的密度用代表均值、中值或方差的垂直线表示。我说得对吗?

一个可能的解决方案是合并数据集,但在将它们重塑为更长的格式(例如使用 tidyr 包中的 pivot_longer 函数)并添加一个命名不同数据集的列之后:

以你的例子,可以是:

library(tidyr)
library(dplyr)
DF1 <- as.data.frame(df1) %>% mutate(Patients = rownames(df1)) %>% 
  pivot_longer(-Patients, names_to = "Genes",values_to = "Values") %>%
  mutate(Dataset = "DF1")

# A tibble: 25 x 4
   Patients        Genes     Values Dataset
   <chr>           <chr>      <dbl> <chr>  
 1 TCGA-4H-AAAK-01 TBC1D21  -0.056  DF1    
 2 TCGA-4H-AAAK-01 FGF4     -0.139  DF1    
 3 TCGA-4H-AAAK-01 KRTAP9-4 -0.0592 DF1    
 4 TCGA-4H-AAAK-01 PSG11    -0.0646 DF1    
 5 TCGA-4H-AAAK-01 ADAM5    -0.167  DF1    
 6 TCGA-5L-AAT0-01 TBC1D21  -0.056  DF1    
 7 TCGA-5L-AAT0-01 FGF4     -0.139  DF1    
 8 TCGA-5L-AAT0-01 KRTAP9-4 -0.0592 DF1    
 9 TCGA-5L-AAT0-01 PSG11    -0.0646 DF1    
10 TCGA-5L-AAT0-01 ADAM5    -0.167  DF1    
# … with 15 more rows

现在,您对 df2 和 df3 做同样的事情,我们将所有行加在一起:

library(tidyr)
library(dplyr)
DF2 <- as.data.frame(df2) %>% mutate(Patients = rownames(df2)) %>% 
  pivot_longer(-Patients, names_to = "Genes",values_to = "Values") %>%
  mutate(Dataset = "DF2")

DF3 <- as.data.frame(df3) %>% mutate(Patients = rownames(df3)) %>% 
  pivot_longer(-Patients, names_to = "Genes",values_to = "Values") %>%
  mutate(Dataset = "DF3")

DF <- bind_rows(DF1,DF2,DF3)

现在,我们正在创建第二个数据框,其中包含每个数据集的均值、中位数和方差:

library(dplyr)
DF_mean <- DF %>% group_by(Dataset) %>% 
  summarise(Mean = mean(Values),
            Median = median(Values),
            Var = var(Values))

最后,我们可以使用这两个数据集绘制每个数据集的密度,并添加一条垂直线对应每个数据集的平均值:

library(tidyr)
library(dplyr)
library(ggplot2)

ggplot(DF,aes(x = Values, fill = Dataset))+
  geom_density(alpha = 0.6)+
  geom_vline(inherit.aes = FALSE, 
             data = DF_mean, aes(xintercept = Mean, color = Dataset),
             linetype = "dashed", size = 2,
             show.legend = FALSE)

它是否回答了您的问题?