【发布时间】:2013-03-19 16:05:16
【问题描述】:
这是一个非常简化的示例,但希望它能让每个人都明白我在说什么:
real.length = c(10,11,12,13,13,13,13,14,15,50)
random.length = vector()
for (i in 1:length(real.length)){
random.length[i] = sample(min(real.length):max(real.length),1)
}
(注意:我知道我可以说 random.length=sample(min:max,10) 但我需要在我的真实代码中使用循环。)
我希望我的随机长度与我的实际长度具有相似的范围,但分布也相似。我试过 rnorm 但我的真实数据没有正态分布,所以我认为除非有一些我错过的选项,否则我认为这不会起作用。
是否可以使用我的真实数据设置示例函数的概率?因此,在这种情况下,为 10-15 之间的数字赋予较高的权重/概率,而为 50 等高数赋予较低的权重/概率。
编辑:使用詹姆斯的解决方案:
samples = length(real.length)
d = density(real.length)
random.length = d$x[findInterval(runif(samples+100),cumsum(d$y)/sum(d$y))]
random.length = subset(random.length, random.length>0)
random.length = random.length[1:samples]
【问题讨论】:
-
您是否希望能够返回 [10 11 12 13 14 15 50} 以外的值?换句话说 - 您是否试图找到一个平滑的 PDF 来近似您观察到的频率(尽管其他值可能是可能的,例如 45),或者观察到的频率是您想要采样的 only 频率吗?后者比前者容易得多...
-
不幸的是,前者听起来更像它——所以我很乐意生成一个看起来有点像 [10 10 11 14 14 15 15 16 48 49] 的 random.length
标签: r random distribution sample weighted