由核密度估计得到的概率密度分布的R-模拟数据 [英] R - simulate data for probability density distribution obtained from kernel density estimate

查看:13
本文介绍了由核密度估计得到的概率密度分布的R-模拟数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先,我不完全确定这是否是发布这篇文章的正确位置,因为它可能应该放在一个更关注统计数据的论坛上。然而,由于我计划用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)
[1] 0.001689885 0.017292405 0.040875436

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

这篇关于由核密度估计得到的概率密度分布的R-模拟数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆