首先,我不完全确定这是否是发布此内容的正确位置,因为它可能应该放在更侧重于统计的论坛中。但是,由于我计划用 R 实现它,我认为最好将其发布在这里。如果我错了,请道歉。

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

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

对我来说非常重要的是,我不根据离散概率模拟新数据,而是根据连续概率模拟新数据,因为值可以说 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)

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

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

dens.func = approxfun(dens)

x = c(72.4588, 86.94, 101.1058301)

dens.func(x)



您可以使用它来获取任何 x 值处的密度分布(而不仅仅是在 density 函数使用的网格点处),然后使用 dens.func 的输出作为 probsample 参数。

关于R - 模拟从核密度估计获得的概率密度分布的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39705354/

10-12 23:18