【问题标题】:Generate stochastic random deviates from a density object with R使用 R 生成与密度对象的随机随机偏差
【发布时间】:2010-11-28 04:17:48
【问题描述】:

我有一个这样创建的密度对象 dd:

x1 <- rnorm(1000) 
x2 <- rnorm(1000, 3, 2) 
x <- rbind(x1, x2)
dd <- density(x) 
plot(dd)

这会产生这种非高斯分布:

alt text http://www.cerebralmastication.com/wp-content/uploads/2009/09/nongaus.png

我最终希望得到这个分布的随机偏差,类似于 rnorm 偏离正态分布的方式。

我试图解决这个问题的方法是获取我的内核的 CDF,然后让它告诉我如果我通过累积概率(逆 CDF)告诉我变量。这样我就可以将一个均匀随机变量的向量转化为从密度中抽取的图形。

似乎我想做的事情应该是其他人在我之前做过的一些基本的事情。有没有简单的方法或简单的功能来做到这一点?我讨厌重新发明轮子。

FWIW 我找到了this R Help article,但我无法理解他们在做什么,最终的输出似乎并没有产生我所追求的。但这可能是我不明白的一步。

我考虑过使用 Johnson distribution from the suppdists package,但 Johnson 不会像我的数据那样给我很好的双峰驼峰。

【问题讨论】:

  • 更多的是统计问题而不是编程......
  • 我知道统计数据。我想用给定的语言实现 stats 方法。这就是编程。

标签: r probability stochastic


【解决方案1】:

这只是法线的混合。那么为什么不这样:

rmnorm <- function(n,mean, sd,prob) {
    nmix <- length(mean)
    if (length(sd)!=nmix) stop("lengths should be the same.")
    y <- sample(1:nmix,n,prob=prob, replace=TRUE)
    mean.mix <- mean[y]
    sd.mix <- sd[y]
    rnorm(n,mean.mix,sd.mix)
}
plot(density(rmnorm(10000,mean=c(0,3), sd=c(1,2), prob=c(.5,.5))))

如果您只需要来自该混合分布的样本,这应该没问题。

【讨论】:

  • 我喜欢这个主意!但是为了说明的目的,我的例子过于简单化了。实际上,我不知道这两种模式,它可能只有一种模式和一条长尾巴(即尖峰态)。但我喜欢你的例子。我不可能这么简洁地编程。顺便说一句,我认为缺少 ac : plot(density(rmnorm(10000,mean=c(0,3), sd=c(1,2), prob=c(.5,.5))))跨度>
  • 这就是您想要 Hadley 答案的原因——重新采样。请记住,您的密度图/只是一个估计值/也取决于您的平滑参数。
【解决方案2】:

替代方法:

sample(x, n, replace = TRUE)

【讨论】:

  • 是的,我一直在想这个。如果我做样本+从正常人中抽取,我最终应该像内核一样加厚我的尾巴,对吧?假设我以与内核方法相同的方式参数化我的正常值。
  • 是的,从密度估计中添加具有零均值和 sd=带宽的正常 rvs:sample(x, n, replace=TRUE) + rnorm(n,0,sd=0.4214) 讨论了这样的模拟在 Silverman 1986 年关于密度估计的书中。
  • 或者,从密度曲线采样,而不是从数据本身sample(dd$x, prob=dd$y, replace=T)
猜你喜欢
  • 2012-02-19
  • 2018-12-31
  • 2014-05-13
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 2016-08-15
  • 2010-09-08
相关资源
最近更新 更多