使用R从密度对象生成随机的随机偏差。

6

我有一个像这样创建的密度对象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,我找到了这篇R Help文章,但我无法理解他们在做什么,最终输出似乎也不能产生我想要的结果。但这可能是一步之遥,我只是不理解。

我考虑直接使用包中的Johnson分布,但是Johnson不会给我优美的双峰隆起,而我的数据却有。


更多是统计问题而非编程问题... - Mitch Wheat
我知道这些统计数据。我想在特定的编程语言中实现这些统计方法。这就是编程。 - JD Long
2个回答

9

另一种方法:

sample(x, n, replace = TRUE)

是的,我一直在过度思考这个问题。如果我从正态分布中抽取样本并进行绘制,那么我应该能够像核函数一样加厚尾部,对吧?假设我使用与核函数方法相同的参数来定义我的正态分布。 - JD Long
2
是的,使用密度估计中带宽为标准差、均值为零的正态随机变量添加到正常的随机变量中: sample(x, n, replace=TRUE) + rnorm(n,0,sd=0.4214) 这样模拟的方法在Silverman 1986年的密度估计书中有讨论。 - Rob Hyndman
1
或者,从密度曲线中进行采样,而不是从数据本身中进行采样 sample(dd$x, prob=dd$y, replace=T) - nico

2

这只是一些普通的混合物。那为什么不使用类似于以下的东西:

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))))

如果您只需要来自该混合分布的样本,则这应该是可以的。


我喜欢这个想法!但是我的例子过于简化以说明问题。实际上,我不知道这两种模式,它可能只有一种模式和一个很长的尾巴(即峰度)。但我喜欢你的例子。我自己编程时肯定没有那么简洁。顺便说一下,我认为你错过了一个c: plot(density(rmnorm(10000,mean=c(0,3), sd=c(1,2), prob=c(.5,.5)))) - JD Long
1
这就是为什么你想要Hadley的答案——重新采样它。请记住,你的密度图只是一个估计值,而且还取决于你的平滑参数。 - Dirk Eddelbuettel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接