如何绘制 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)
它是否回答了您的问题?
我有三个生物医学数据集(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)
它是否回答了您的问题?