首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从倾斜数据中采样,以获得r中的混合分布输出?

如何从倾斜数据中采样,以获得r中的混合分布输出?
EN

Stack Overflow用户
提问于 2021-05-08 05:57:11
回答 1查看 114关注 0票数 1

我有一个基因长度的数据集,看起来有点像这样:

代码语言:javascript
运行
复制
Gene  Length
Gene1  5
Gene2  6
Gene3  400000
Gene4  1000
Gene5  25000
Gene6  10
Gene7  50
Gene8  4
Gene9  100
Gene10 2000

Length的分布是扭曲的,大多数基因的大小都很小。我想看看我是否可以制作一个样本生成器,它可以选择具有不同大小的基因子集,而不仅仅是在这个长度数据范围内非常小的基因-以一种尽可能无偏的/尽可能随机的方式给我一个混合长度的基因列表。

我不知道从哪里开始。我一直在研究使用sample()函数,但我一直无法对其进行采样,并考虑到我想要具有混合基因长度的基因子集,而不仅仅是那些在我拥有的长度范围内的非常小的大小的基因-我正在尝试做的事情可能吗?

输入数据示例:

代码语言:javascript
运行
复制
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"))

编辑:

我现在运行以下代码来进行示例:

代码语言:javascript
运行
复制
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()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-11 03:08:42

也许这个例子可以有所帮助。

让我们假设基因服从威布尔分布:

代码语言:javascript
运行
复制
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

现在让我们根据它们的密度来复制这些类:

代码语言:javascript
运行
复制
dfrep <- classes[rep(1:nrow(classes), classes$density*100000)]

我们现在有了一个带有短基因的“倾斜”分布(基因8,基因1,...)代表过多:

代码语言:javascript
运行
复制
table(dfrep$Gene)

 Gene1 Gene10  Gene2  Gene3  Gene4  Gene5  Gene6  Gene7  Gene8  Gene9 
 13533     33   4978      4     91     12   1831    673  36787    247 

我们可以得到类的分布并计算出一个密度

代码语言:javascript
运行
复制
classes <- table(dfrep$Gene)
density_calc <- classes/sum(classes)
dfrep$density_calc <- density_calc[match(dfrep$Gene,names(density_calc))]

如果我们想从每个类中抽取相等数量的基因,我们可以使用prob参数根据density_calc的倒数进行采样:

代码语言:javascript
运行
复制
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 

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67442119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档