从具有可变底层网格的核密度估计器模拟

时间:2017-11-20 18:47:07

标签: r random probability-density kernel-density

我有一个数据集,我通过估算核密度来创建经验概率分布。现在我使用MASS包中的R&#39 {s} kde2d。在估计概率分布之后,我使用sample从沿x轴的2D分布的切片中采样。我使用sample非常类似here所述。示例代码看起来像这样

library(MASS)
set.seed(123)
x = rnorm(100, 1, 0.1)
set.seed(456)
y = rnorm(100, 1, 0.5)
den <- kde2d(x, y, n = 50, lims = c(-2, 2, -2, 2))
#to plot this 2d kde:
#library(lattice)
#persp(den)
conditional_probabilty_density = list(x = den$y, y = den$z[40, ])
#to plot the slice:
#plot(conditional_probabilty_density)
simulated_sample = sample(conditional_probabilty_density$x, size = 10, replace = TRUE, prob = conditional_probabilty_density$y)

den看起来像这样

kde2d

我的数据有已知的区域,其中存在大量波动,需要精细的网格粒度。其他区域基本上没有数据点,也没有任何数据点。如果我可以将n的{​​{1}}参数设置为一个非常高的数字,以便在任何地方都能很好地分辨我的数据,我会没事的。唉,由于内存限制,这是不可能的。

这就是为什么我认为我可以修改kde2d函数以获得非恒定粒度。
Here是kde2d函数的源代码。 可以修改一行

kde2d

并在y轴上放置所需的粒度。例如

gy <- seq.int(lims[3L], lims[4L], length.out = n[2L])

修改后的a <- seq(-1, 0, 0.5) gy <- c(a, seq.int(0.1, 2, length.out = n[2L]-length(a))) 返回指定位置的内核密度估计值。效果很好。假设我现在有

kde2d_2

问题是,我不能再使用kde2d从x轴的切片中采样。因为分布左侧的部分更精细,因此sample采样的概率更高。

如果需要的话,我可以做一个精细的网格,但是根据其适当的密度从分布中抽样?非常感谢你。

1 个答案:

答案 0 :(得分:0)

approx上使用conditional_probabilty_densityn