Как я могу нарисовать распределение дисперсии данных среди нескольких наборов данных в R? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть три набора биомедицинских данных (1 двоичная матрица, 1 непрерывная матрица и 1 дискретная матрица). Прямо сейчас я хочу нарисовать график распределения данных (либо дисперсию, либо медиану, либо среднее значение), включая три в одном рисунке, а затем вычислить асимметрию и значение P на основе теста Д'Агостино среди трех наборов данных. В частности, на каждой кривой распределения ось X указывает (либо дисперсию, либо среднее значение, либо медиану) генов, а ось Y указывает частоту или плотность генов в выборках.

Рисунок ниже аналогичен результат, который я хочу.

enter image description here

А вот и воспроизводимые наборы данных.

-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")))

Я активно искал в Интернете, но ничего не помогло моему wi sh. Любая помощь будет оценена. Заранее спасибо.

Первый шаг, который я думаю, это объединение моих трех наборов данных в один:

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

Затем я вычислю дисперсию трех наборов данных:

MYdata = var(MYdata)

Наконец, я должен построить их с помощью ggplot2 (я думаю), но это так сложно для нового пользователя R, такого как я.

1 Ответ

1 голос
/ 03 марта 2020

Насколько я понимаю, у вас есть три набора данных, и вы хотели бы построить на одном графике плотность значений в каждом из этих наборов данных с вертикальными линиями, представляющими либо среднее значение, либо медиану, либо дисперсию. Я прав?

Возможное решение состоит в том, чтобы объединить наборы данных, но ПОСЛЕ того, чтобы преобразовать их в более длинный формат (например, используя функцию pivot_longer из пакета tidyr) и добавить столбец с именами различных наборов данных:

В вашем примере это может быть:

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)

enter image description here

Отвечает ли он на ваш вопрос?

...