R - 与实数类似分布的随机数

时间:2013-03-19 16:05:17

标签: r random distribution sample weighted

这是一个非常简单的例子,但希望它让每个人都知道我在说什么:

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]

2 个答案:

答案 0 :(得分:0)

您可以创建density估算值并从中进行采样:

d <- density(real.length)
d$x[findInterval(runif(6),cumsum(d$y)/sum(d$y))]
[1] 13.066019 49.591973  9.636352 15.209561 11.951377 12.808794

请注意,这假设您的变量是连续的,因此您认为round是合适的。

答案 1 :(得分:0)

虽然我可以阅读R,但我无法写它(我没有安装它,因此无法测试)。我将在Matlab中给你一个简单的例子来做你想问的事情 - 我希望这能激发你的灵感:

obs = sort([10 11 12 13 13 13 13 14 15 50]); % have to make sure they are sorted...
uo = unique(obs);
hh = hist(obs, uo); % find frequencies of each value
cpdf = cumsum(obs);
cpdfn = cpdf / max(cpdf); % normalized cumulative pdf
r = rand(1, 100); % 100 random numbers from 0 to 1
rv = round(interp1(cpdfn, uo, r)); % randomly pick values in the cpdfn; find corresponding "observation"
hr = hist(rv, 1:50);
hrc = cumsum(hr);
figure
plot(uo, cpdfn);
hold all;
plot(1:50, hhc/max(hhc))

figure; hist(rv, 1:50);

这会产生以下图表: enter image description here

enter image description here

注意 - 由于您有更多观察结果,因此效果更好;在当前示例中,因为您的样本相对较少,所以15%到50之间的空间在大约10%的时间内被采样。