Генерация случайных отклонений от объекта плотности с R - PullRequest
6 голосов
/ 14 сентября 2009

У меня есть объект плотности 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 , но я не могу понять, что они делают, и окончательный вывод, похоже, не дает того, что я ищу. Но это может быть шагом на пути, который я просто не понимаю.

Я подумал о том, чтобы просто пойти с дистрибутивом Johnson из пакета suppdists , но Johnson не даст мне приятного бимодального горба, который есть в моих данных.

Ответы [ 2 ]

9 голосов
/ 14 сентября 2009

Альтернативный подход:

sample(x, n, replace = TRUE)
2 голосов
/ 14 сентября 2009

Это просто смесь нормалей. Так почему бы не что-то вроде:

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

Это нормально, если вам нужны только образцы из этой смеси.

...