如何从偏斜数据中采样以获得 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 

这允许从偏态分布中获得相似数量的每个基因。