6

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

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

这产生了这个非常非高斯分布:

替代文字 http://www.cerebralmastication.com/wp-content/uploads/2009/09/nongaus.png

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

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

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

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

我考虑过使用suppdists 软件包中的 Johnson 分布,但 Johnson 不会给我数据所具有的双峰驼峰。

4

2 回答 2

9

替代方法:

sample(x, n, replace = TRUE)
于 2009-09-14T16:34:01.133 回答
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))))

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

于 2009-09-14T16:17:37.790 回答