2009-09-14 2 views
6

У меня есть объект плотности дд создается следующим образом:Генерация стохастических случайных отклоняется от объекта плотности с R

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, но Джонсон не даст мне хороший бимодальный горб, который есть у моих данных.

+0

Я знаю статистику. Я хочу реализовать метод статистики на определенном языке. Это программирование. –

+0

sample(x, n, replace = TRUE) 

ответ

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

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

+0

Мне нравится идея! Но мой пример упрощен для иллюстративных целей. На самом деле я не знаю двух режимов, и у него может быть только один режим и длинный хвост задницы (то есть лептокуртоз). Но мне нравится ваш пример. Я не мог запрограммировать это почти так же лаконично. BTW, я считаю, отсутствуют ac in: plot (плотность (rmnorm (10000, mean = c (0,3), sd = c (1,2), prob = c (.5, .5)))) –

+0

@JD Long: спасибо за обнаружение опечатки. –

+1

Вот почему вы хотите ответа Хэдли - передискретируйте это. Помните, что ваш график плотности - это просто оценка /, которая также зависит от вашего параметра сглаживания. –

9

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

больше статистики вопрос, чем программирование ...
+1

загрузочный фут! –

+0

Да, я уже думал об этом. Если я делаю выборку + ничья из нормального, я должен закончить утолщение своих хвостов так же, как ядро, верно? Предполагая, что я перенял свой обычным то же, что и метод ядра. –

+2

Да, добавьте нормальные rvs с нулевым средним значением и sd = ширина полосы от оценки плотности: образец (x, n, replace = TRUE) + rnorm (n, 0, sd = 0.4214) Моделирование, как это обсуждается в книге Сильвермана 1986 года оценка плотности. –