【问题标题】:R - simulate data for probability density distribution obtained from kernel density estimateR - 模拟从核密度估计中获得的概率密度分布数据
【发布时间】:2017-02-03 22:41:53
【问题描述】:

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

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

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

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

先谢谢了,我希望你们能帮助我解决这个问题。

【问题讨论】:

  • 如果我理解您的问题,您可能会使用蒙特卡洛模拟。由于您的分布是已知的,因此您可以使用该分布的随机抽样来创建模拟数据。这听起来像你想要做的吗?
  • 嗨@LloydChristmas,感谢您的回复。问题是,分布是已知的,但我不想使用实际的离散分布来模拟数据,而是使用内核中描述的连续分布来模拟数据。如果这就是你所指的,那就太棒了。我该怎么做?
  • 这里有一些有趣的讨论:stats.stackexchange.com/questions/30303/…
  • 我打算推荐一种“拒绝方法”,但这在上面的链接中有介绍。此外,@gung 提供了一个可能也适合您的解决方案。
  • 嗨。我已经阅读了@gung 的方法,但我不太了解其中的大部分内容,但认为它可能会起作用。我将通读他/她推荐的论文,看看我是否可以使用这种方法产生一些有意义的东西。非常感谢!

标签: r simulation kernel-density


【解决方案1】:

使用您的基础离散数据,在尽可能精细的网格上创建内核密度估计(即,根据您的应用程序的需要“接近连续”(当然,在机器精度和计算时间的限制内) )。然后从该内核密度中采样,使用密度值来确保更可能的分布值更有可能被采样。例如:

假数据,只是为了在这个例子中有一些东西可以使用:

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 的输出用作 prob 的参数987654338@.

【讨论】:

  • 非常感谢。我要试试这个,看看它有什么作用。我稍后会回复你我的结果。
  • 亲爱的@eipi10 - 这行得通。非常非常感谢!
猜你喜欢
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 2013-01-11
  • 2021-01-25
  • 2017-10-14
  • 2021-01-21
  • 2017-09-20
  • 2011-05-11
相关资源
最近更新 更多