在自定义密度下模拟值

时间:2013-09-18 22:16:24

标签: r statistics simulation kernel-density

我有一个与密度和模拟值有关的理论和编码问题。

我正在通过density(x)命令构建自定义密度。但是我希望从这个密度生成1000-10000个模拟值。总体目标是采用密度(x $ y)形式构建两个密度并运行模拟,并说密度A大于密度B x%的时间。我只想取每个模拟值,看看哪个更高,代码计算A高于B的次数。

有没有办法实现这个目标?或者是否有某种方法可以实现与这些密度类似的东西?谢谢!

2 个答案:

答案 0 :(得分:1)

sample函数可以取样本密度的间隔的中点,然后使用密度作为概率参数。

mysamp <- sample(x= dens$x, size=1000  , prob=dens$y, repl=TRUE)

这样做的缺点是您可能需要抖动结果以避免大量重复。

 mysamp <- jitter(mysamp)

另一种方法是使用approxfunecdf。您可能需要反转函数(x和y的反向角色),以便使用runif(1000)的输入对结果进行采样。我非常确定在SO中有这方面的例子,我很确定我是过去将这些代码发布到R-help的众多人之一。 (如果您的搜索未能找到,则发布搜索策略,其他人可以尝试改进它们。)

答案 1 :(得分:1)

按照@ DWin的提示反转ecdf,以下是如何实现这种方法,使用样条函数来拟合反向步进函数:

鉴于

z <- c(rnorm(40), runif(40))
plot(density(z))

enter image description here

定义

spl <- with(environment(ecdf(z)), splinefun(y, x))

sampler <- function(n)spl(runif(n))

现在,您可以使用您想要的尺寸拨打sampler()

plot(density(sampler(1000)))

enter image description here

最后注意事项:这将永远不会生成原始数据范围之外的值,但重复数据将极为罕见:

> anyDuplicated(sampler(1e4))
[1] 0