首先,我不完全确定这是否是发布此内容的正确位置,因为它可能应该放在更侧重于统计的论坛中。但是,由于我计划用 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)
您可以使用它来获取任何 x 值处的密度分布(而不仅仅是在
density
函数使用的网格点处),然后使用 dens.func
的输出作为 prob
的 sample
参数。关于R - 模拟从核密度估计获得的概率密度分布的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39705354/