我有一个基因长度的数据集,看起来有点像这样:
Gene Length
Gene1 5
Gene2 6
Gene3 400000
Gene4 1000
Gene5 25000
Gene6 10
Gene7 50
Gene8 4
Gene9 100
Gene10 2000
Length
的分布是扭曲的,大多数基因的大小都很小。我想看看我是否可以制作一个样本生成器,它可以选择具有不同大小的基因子集,而不仅仅是在这个长度数据范围内非常小的基因-以一种尽可能无偏的/尽可能随机的方式给我一个混合长度的基因列表。
我不知道从哪里开始。我一直在研究使用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)))
但我想要的是随机选择位于dnorm()
/normal分布上部尾部的基因-这是否可以添加到prob
of sample()
中
发布于 2021-05-11 03:08:42
也许这个例子可以有所帮助。
让我们假设基因服从威布尔分布:
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)]
我们现在有了一个带有短基因的“倾斜”分布(基因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 <- table(dfrep$Gene)
density_calc <- classes/sum(classes)
dfrep$density_calc <- density_calc[match(dfrep$Gene,names(density_calc))]
如果我们想从每个类中抽取相等数量的基因,我们可以使用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
这允许从倾斜分布中获得相似数量的每个基因。
https://stackoverflow.com/questions/67442119
复制相似问题