首先,我不完全确定这是否是发布此内容的正确位置,因为它可能会出现在更加统计数据的论坛中。但是,由于我计划用R实现这一点,我认为最好在此处发布。如果我错了,请道歉。
所以,我试图做的是以下内容。我想模拟总共250,000个观测值的数据,根据经验数据(离散)得出的核密度估计值分配连续(非整数)值,原始值范围从-5到+5。这是我想要使用的分布图。
对我而言,根据离散概率模拟新数据非常重要,而不是连续的数据,因为值非常重要,可以说是2.89而不是因此,将根据图中描绘的概率分配新值。模拟数据中最常见的值约为+2,而-4和+5附近的值则相当罕见。
我已经完成了关于模拟R中数据以及内核密度估计如何工作的相关内容,但我真的没有向前发展。所以我的问题基本上需要两个步骤 - 我如何模拟数据(1)以及如何使用这个特定的概率分布模拟数据(2)?
在此先感谢,我希望你们能帮我解决这个问题。
答案 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)
使用上述方法,您可以为密度估计创建更精细和更精细的网格,但您仍然会限制在用于密度估计的网格点处的密度值(即{{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
的参数。