由核密度估计得到的概率密度分布的R-模拟数据 [英] R - simulate data for probability density distribution obtained from kernel density estimate
问题描述
首先,我不完全确定这是否是发布这篇文章的正确位置,因为它可能应该放在一个更关注统计数据的论坛上。然而,由于我计划用R来实现这一点,我想最好把它张贴在这里。如果我错了,请道歉。
所以,我尝试做的是以下几点。我想模拟总共250.000个观测值的数据,分配一个连续的(非整数)值,该值与从经验数据(离散)得出的核密度估计值一致,原始值的范围从-5到+5。这是我想使用的分布图。
对我来说,模拟新数据不是基于离散的概率,而是基于连续的概率,这对我来说非常重要,因为值可以是2.89而不是3或2。因此,将根据图中描述的概率来分配新值。模拟数据中最常见的值将在+2左右,而-4和+5左右的值将相当罕见。我已经读了相当多关于R中的模拟数据以及内核密度估计如何工作的内容,但我真的一点也没有前进。所以我的问题基本上需要两个步骤--我如何模拟数据(1),以及如何使用这个特定的概率分布来模拟数据(2)?
提前谢谢,希望你们能帮我解决这个问题。
推荐答案
使用您的底层离散数据,在您希望的精细网格上创建一个内核密度估计(即,根据您的应用程序所需的"接近连续"(当然,在机器精度和计算时间的限制内))。然后从该核密度进行采样,使用密度值以确保更有可能对分布的更可能值进行采样。例如:
假数据,在本例中只是为了有东西可用:
set.seed(4396)
dat = round(rnorm(1000,100,10))
创建内核密度估计。如果希望在更精细的点网格上估计密度,请增加n
:
dens = density(dat, n=2^14)
在这种情况下,密度是在2^14点的网格上估计的,每个点之间的距离mean(diff(dens$x))
=0.0045。
现在,从核密度估计中采样:我们对密度估计的x值进行采样,并将prob
设置为等于密度估计的y值(密度),这样更有可能采样更多的x值:
kern.samp = sample(dens$x, 250000, replace=TRUE, prob=dens$y)
比较dens
(我们原始数据的密度估计)(黑线)和密度kern.samp
(红色):
plot(dens, lwd=2)
lines(density(kern.samp), col="red",lwd=2)
使用上面的方法,您可以为密度估计创建越来越精细的栅格,但仍将限制为用于密度估计的栅格点处的密度值(即dens$x
的值)。但是,如果您确实需要能够获得任何数据值的密度,则可以创建近似函数。在这种情况下,您仍然需要创建密度估计--以捕获数据结构所需的任何带宽和网格大小--然后创建一个函数来对网格点之间的密度进行内插。例如:
dens = density(dat, n=2^14)
dens.func = approxfun(dens)
x = c(72.4588, 86.94, 101.1058301)
dens.func(x)
[1] 0.001689885 0.017292405 0.040875436
您可以使用它来获取任何x值(而不仅仅是density
函数使用的网格点)上的密度分布,然后使用dens.func
的输出作为sample
的prob
参数。
这篇关于由核密度估计得到的概率密度分布的R-模拟数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!