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

R - simulate data for probability density distribution obtained from kernel density estimate

首先,我不完全确定这是不是 post 的正确位置,因为也许它应该放在更注重统计的论坛中。但是,由于我打算用 R 实现它,所以我认为最好在此处 post。如果我错了请道歉。

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

对我来说非常重要的是,我不基于离散概率模拟新数据,而是基于连续概率模拟新数据,因为一个值可以说是 2.89 而不是 3 或 2 非常重要。所以新值将根据图中描述的概率分配。模拟数据中最常见的值大约在 +2 左右,而大约 -4 和 +5 的值则很少见。

我已经阅读了很多有关 R 中的模拟数据以及核密度估计如何工作的资料,但我真的根本没有继续前进。所以我的问题基本上需要两个步骤——我什至如何模拟数据 (1),此外,我如何使用这个特定的概率分布 (2) 模拟数据?

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

使用您的基础离散数据,根据您的需要在尽可能精细的网格上创建核密度估计(即,根据您的应用程序的需要 "close to continuous"(在机器精度和计算时间的限制内,课程))。然后从该核密度中采样,使用密度值来确保更有可能对分布的更可能值进行采样。例如:

假数据,只是为了在这个例子中有一些东西可以使用:

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)

使用上述方法,您可以为密度估计创建越来越精细的网格,但您仍将限于用于密度估计的网格点处的密度值(即 [=21 的值=]).但是,如果您确实需要能够获得 any 数据值的密度,则可以创建一个近似函数。在这种情况下,您仍然会创建密度估计——以捕获数据结构所需的任何带宽和网格大小——然后创建一个函数来对网格点之间的密度进行插值。例如:

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 的输出作为prob sample 的参数。