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

nik*_*UoM 3 simulation r kernel-density

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

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

在此输入图像描述

对我来说非常重要的是我不会根据离散概率模拟新数据,而是连续模拟新数据,因为一个值可以说是2.89而不是3或2是非常重要的.所以新值将基于图中描绘的概率.模拟数据中最常见的值约为+2,而-4和+5附近的值则相当罕见.

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

在此先感谢,我希望你们可以帮助我解决这个问题.

eip*_*i10 6

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

假数据,只是为了在这个例子中有一些工作:

set.seed(4396)
dat = round(rnorm(1000,100,10))
Run Code Online (Sandbox Code Playgroud)

创建内核密度估计.n如果您希望在更精细的点网格上估算密度,请增加:

dens = density(dat, n=2^14)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,密度在2 ^ 14个点的网格上估计,mean(diff(dens$x))每个点之间的距离= 0.0045.

现在,来自核密度估计的样本:我们对密度估计的x值进行采样,并设置为prob等于密度估计的y值(密度),以便更可能对更可能的x值进行采样:

kern.samp = sample(dens$x, 250000, replace=TRUE, prob=dens$y)
Run Code Online (Sandbox Code Playgroud)

比较dens(我们原始数据的密度估计值)(黑线),密度为kern.samp(红色):

plot(dens, lwd=2)
lines(density(kern.samp), col="red",lwd=2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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

dens.func = approxfun(dens)

x = c(72.4588, 86.94, 101.1058301)

dens.func(x)
Run Code Online (Sandbox Code Playgroud)
[1] 0.001689885 0.017292405 0.040875436
Run Code Online (Sandbox Code Playgroud)

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