如何从偏斜数据中采样以获得 r 中的混合分布输出?
How to sample from skewed data to get a mixed distribution output in r?
我有一个基因长度数据集,看起来有点像这样:
Gene Length
Gene1 5
Gene2 6
Gene3 400000
Gene4 1000
Gene5 25000
Gene6 10
Gene7 50
Gene8 4
Gene9 100
Gene10 2000
Length
的分布是倾斜的,大多数基因的大小都非常小。我想看看我是否可以制作一个样本生成器,该样本生成器 select 是具有不同大小的基因子集,而不仅仅是在这个长度数据范围内非常小的基因 - 给我一个基因列表尽可能以 unbiased/as 随机方式混合长度。
我不知道从哪里开始。我一直在研究使用 sample()
函数,但我无法对其进行采样,并考虑到我想要一个具有混合基因长度的基因子集,而不仅仅是那些非常小的基因我所拥有的长度范围 - 是我正在尝试做的可能吗?
示例输入数据:
df <- structure(list(Gene = c("Gene1", "Gene2", "Gene3", "Gene4", "Gene5",
"Gene6", "Gene7", "Gene8", "Gene9", "Gene10"), Length = c(5L,
6L, 400000L, 1000L, 25000L, 10L, 50L, 4L, 100L, 2000L)), row.names = c(NA,
-10L), class = c("data.table", "data.frame"))
编辑:
我现在运行这段代码来采样:
genes_selected <- sample(nrow(df), size = 51, replace=FALSE,
prob=dnorm(df$Gene_length,
mean(df$Gene_length),
sd(df$Gene_length)))
但我想要的是随机 select 位于 dnorm()
/正态分布上尾的基因 - 这是否可以添加到 prob
sample()
?
也许这个例子可以提供帮助。
让我们假设基因服从 Weibull 分布:
classes <- df[order(df$Length)]
classes$density <- dweibull(1:nrow(df), shape=1, scale=1)
classes
Gene Length density
1: Gene8 4 3.678794e-01
2: Gene1 5 1.353353e-01
3: Gene2 6 4.978707e-02
4: Gene6 10 1.831564e-02
5: Gene7 50 6.737947e-03
6: Gene9 100 2.478752e-03
7: Gene4 1000 9.118820e-04
8: Gene10 2000 3.354626e-04
9: Gene5 25000 1.234098e-04
10: Gene3 400000 4.539993e-05
现在让我们根据它们的密度复制 classes:
dfrep <- classes[rep(1:nrow(classes), classes$density*100000)]
我们现在有一个 'skewed' 分布,其中短基因(基因 8、基因 1、...)过多:
table(dfrep$Gene)
Gene1 Gene10 Gene2 Gene3 Gene4 Gene5 Gene6 Gene7 Gene8 Gene9
13533 33 4978 4 91 12 1831 673 36787 247
我们可以得到classes分布并计算出一个密度
classes <- table(dfrep$Gene)
density_calc <- classes/sum(classes)
dfrep$density_calc <- density_calc[match(dfrep$Gene,names(density_calc))]
如果我们想要sample
每个class的基因数量相等,我们可以使用prob
参数根据density_calc
的倒数进行采样:
table(sample(dfrep$Gene, size=1000, prob=1/dfrep$density_calc, replace=T))
Gene1 Gene10 Gene2 Gene3 Gene4 Gene5 Gene6 Gene7 Gene8 Gene9
101 90 111 96 92 99 102 110 101 98
这允许从偏态分布中获得相似数量的每个基因。
我有一个基因长度数据集,看起来有点像这样:
Gene Length
Gene1 5
Gene2 6
Gene3 400000
Gene4 1000
Gene5 25000
Gene6 10
Gene7 50
Gene8 4
Gene9 100
Gene10 2000
Length
的分布是倾斜的,大多数基因的大小都非常小。我想看看我是否可以制作一个样本生成器,该样本生成器 select 是具有不同大小的基因子集,而不仅仅是在这个长度数据范围内非常小的基因 - 给我一个基因列表尽可能以 unbiased/as 随机方式混合长度。
我不知道从哪里开始。我一直在研究使用 sample()
函数,但我无法对其进行采样,并考虑到我想要一个具有混合基因长度的基因子集,而不仅仅是那些非常小的基因我所拥有的长度范围 - 是我正在尝试做的可能吗?
示例输入数据:
df <- structure(list(Gene = c("Gene1", "Gene2", "Gene3", "Gene4", "Gene5",
"Gene6", "Gene7", "Gene8", "Gene9", "Gene10"), Length = c(5L,
6L, 400000L, 1000L, 25000L, 10L, 50L, 4L, 100L, 2000L)), row.names = c(NA,
-10L), class = c("data.table", "data.frame"))
编辑:
我现在运行这段代码来采样:
genes_selected <- sample(nrow(df), size = 51, replace=FALSE,
prob=dnorm(df$Gene_length,
mean(df$Gene_length),
sd(df$Gene_length)))
但我想要的是随机 select 位于 dnorm()
/正态分布上尾的基因 - 这是否可以添加到 prob
sample()
?
也许这个例子可以提供帮助。
让我们假设基因服从 Weibull 分布:
classes <- df[order(df$Length)]
classes$density <- dweibull(1:nrow(df), shape=1, scale=1)
classes
Gene Length density
1: Gene8 4 3.678794e-01
2: Gene1 5 1.353353e-01
3: Gene2 6 4.978707e-02
4: Gene6 10 1.831564e-02
5: Gene7 50 6.737947e-03
6: Gene9 100 2.478752e-03
7: Gene4 1000 9.118820e-04
8: Gene10 2000 3.354626e-04
9: Gene5 25000 1.234098e-04
10: Gene3 400000 4.539993e-05
dfrep <- classes[rep(1:nrow(classes), classes$density*100000)]
我们现在有一个 'skewed' 分布,其中短基因(基因 8、基因 1、...)过多:
table(dfrep$Gene)
Gene1 Gene10 Gene2 Gene3 Gene4 Gene5 Gene6 Gene7 Gene8 Gene9
13533 33 4978 4 91 12 1831 673 36787 247
我们可以得到classes分布并计算出一个密度
classes <- table(dfrep$Gene)
density_calc <- classes/sum(classes)
dfrep$density_calc <- density_calc[match(dfrep$Gene,names(density_calc))]
如果我们想要sample
每个class的基因数量相等,我们可以使用prob
参数根据density_calc
的倒数进行采样:
table(sample(dfrep$Gene, size=1000, prob=1/dfrep$density_calc, replace=T))
Gene1 Gene10 Gene2 Gene3 Gene4 Gene5 Gene6 Gene7 Gene8 Gene9
101 90 111 96 92 99 102 110 101 98
这允许从偏态分布中获得相似数量的每个基因。