我有一个与密度和模拟值有关的理论和编码问题。
我正在通过density(x)命令构建自定义密度。但是我希望从这个密度生成1000-10000个模拟值。总体目标是采用密度(x $ y)形式构建两个密度并运行模拟,并说密度A大于密度B x%的时间。我只想取每个模拟值,看看哪个更高,代码计算A高于B的次数。
有没有办法实现这个目标?或者是否有某种方法可以实现与这些密度类似的东西?谢谢!
答案 0 :(得分:1)
sample
函数可以取样本密度的间隔的中点,然后使用密度作为概率参数。
mysamp <- sample(x= dens$x, size=1000 , prob=dens$y, repl=TRUE)
这样做的缺点是您可能需要抖动结果以避免大量重复。
mysamp <- jitter(mysamp)
另一种方法是使用approxfun
和ecdf
。您可能需要反转函数(x和y的反向角色),以便使用runif(1000)
的输入对结果进行采样。我非常确定在SO中有这方面的例子,我很确定我是过去将这些代码发布到R-help的众多人之一。 (如果您的搜索未能找到,则发布搜索策略,其他人可以尝试改进它们。)
答案 1 :(得分:1)
按照@ DWin的提示反转ecdf
,以下是如何实现这种方法,使用样条函数来拟合反向步进函数:
鉴于
z <- c(rnorm(40), runif(40))
plot(density(z))
定义
spl <- with(environment(ecdf(z)), splinefun(y, x))
sampler <- function(n)spl(runif(n))
现在,您可以使用您想要的尺寸拨打sampler()
:
plot(density(sampler(1000)))
最后注意事项:这将永远不会生成原始数据范围之外的值,但重复数据将极为罕见:
> anyDuplicated(sampler(1e4))
[1] 0