我有一个数据集,我通过估算核密度来创建经验概率分布。现在我使用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
看起来像这样
我的数据有已知的区域,其中存在大量波动,需要精细的网格粒度。其他区域基本上没有数据点,也没有任何数据点。如果我可以将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
从x轴的切片中采样。因为分布左侧的部分更精细,因此sample
采样的概率更高。
如果需要的话,我可以做一个精细的网格,但是根据其适当的密度从分布中抽样?非常感谢你。
答案 0 :(得分:0)
在approx
上使用conditional_probabilty_density
新n
。