R - 模拟从核密度估计获得的概率密度分布数据

时间:2016-09-26 14:19:21

标签: r simulation kernel-density

首先,我不完全确定这是否是发布此内容的正确位置,因为它可能会出现在更加统计数据的论坛中。但是,由于我计划用R实现这一点,我认为最好在此处发布。如果我错了,请道歉。

所以,我试图做的是以下内容。我想模拟总共250,000个观测值的数据,根据经验数据(离散)得出的核密度估计值分配连续(非整数)值,原始值范围从-5到+5。这是我想要使用的分布图。

enter image description here

对我而言,根据离散概率模拟新数据非常重要,而不是连续的数据,因为值非常重要,可以说是2.89而不是因此,将根据图中描绘的概率分配新值。模拟数据中最常见的值约为+2,而-4和+5附近的值则相当罕见。

我已经完成了关于模拟R中数据以及内核密度估计如何工作的相关内容,但我真的没有向前发展。所以我的问题基本上需要两个步骤 - 我如何模拟数据(1)以及如何使用这个特定的概率分布模拟数据(2)?

在此先感谢,我希望你们能帮我解决这个问题。

1 个答案:

答案 0 :(得分:6)

利用您的基础离散数据,可以根据需要在网格上创建核心密度估计(即,"接近连续"根据您的应用需要(在机器精度和计算的限制范围内)时间,当然))。然后使用密度值从该核密度中进行采样,以确保更可能对分布的更可能值进行采样。例如:

虚假数据,只是为了在这个例子中有用处:

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)

enter image description here

使用上述方法,您可以为密度估计创建更精细和更精细的网格,但您仍然会限制在用于密度估计的网格点处的密度值(即{{1的值) }})。但是,如果您确实需要能够获得任何数据值的密度,则可以创建近似函数。在这种情况下,您仍然可以创建密度估计 - 在捕获数据结构所需的任何带宽和网格大小 - 然后创建一个插入网格点之间密度的函数。例如:

dens$x
dens = density(dat, n=2^14)

dens.func = approxfun(dens)

x = c(72.4588, 86.94, 101.1058301)

dens.func(x)

您可以使用它来获取任何x值的密度分布(而不仅仅是[1] 0.001689885 0.017292405 0.040875436 函数使用的网格点),然后使用density的输出作为{{ 1}} dens.func的参数。