2009-09-14 10 views
6

Mam obiekt gęstość dd stworzony tak:Generowanie stochastycznych losowych odbiega od obiektu gęstości R

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

która produkuje tego bardzo nie-Gaussa dystrybucji:

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

bym w końcu lubię losowe odchylenia od tej dystrybucji podobne do tego, w jaki sposób rnorm odbiega od normalnego rozkładu.

Sposób, w jaki próbuję to złamać, polega na uzyskaniu CDF z mojego jądra, a następnie pobraniu go, aby poinformować mnie o wariancie, jeśli przekażę mu skumulowane prawdopodobieństwo (odwrotne CDF). W ten sposób mogę przekształcić wektor jednolitych losowych zmienności w rysunki od gęstości.

Wygląda na to, co staram się zrobić coś powinno być podstawową że inni zrobili przede mną. Czy istnieje prosty sposób lub prosta funkcja, aby to zrobić? Nienawidzę wymyślania koła.

FWIW Znalazłem this R Help article, ale nie mogę zrozumieć, co robią, a ostateczny wynik nie wydaje się produkować tego, co chcę. Ale może to być krok po drodze, którego po prostu nie rozumiem.

Zastanawiałem się, czy po prostu pójść z Johnson distribution from the suppdists package, ale Johnson nie da mi miły bimodalny garb, który ma moje dane.

+0

bardziej pytanie niż statystyki programowania ... –

+0

znam statystyk. Chcę zaimplementować metodę statystyki w danym języku. To jest programowanie. –

Odpowiedz

2

To tylko mieszanina normalnych. Dlaczego więc nie coś takiego:

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

Powinno być dobrze, jeśli potrzebujesz tylko próbek z tego rozkładu mieszanin.

+0

Podoba mi się ten pomysł! Ale mój przykład jest uproszczony w celach ilustracyjnych. W rzeczywistości nie znam tych dwóch trybów i może to być tylko jeden tryb i długi tyłek (czyli leptokurtoza). Ale podoba mi się twój przykład. Nie mogłem zaprogramować tego tak zwięźle. okazji wierzę, brakuje ac: powierzchni (gęstości (rmnorm (10000, oznaczają = C (0,3), SD = C (1,2), prob = C (0,5, 0,5)))) –

+0

@JD Long: dzięki za zauważenie literówki. –

+1

Dlatego właśnie potrzebujesz odpowiedzi Hadley'a - próbując jej ponownie. Pamiętaj, że twój wykres gęstości jest/tylko oszacowaniem/również zależy od twojego parametru wygładzania. –

9

Alternatywne podejście:

sample(x, n, replace = TRUE) 
+1

bootstrapping ftw! –

+0

Tak, już to przemyślałem. Jeśli wykonam próbkę + losowanie z normalnego, powinienem w końcu zgrubić moje ogony w taki sam sposób, w jaki zrobi to jądro, prawda? Zakładając, że param normalnie tak samo, jak metoda kernelingu. –

+2

Tak, dodaj normalne wartości rvs ze średnią zerową, a sd = szerokość pasma z oszacowania gęstości: próbka (x, n, zamień = TRUE) + rnorm (n, 0, sd = 0,4214) Symulowanie w ten sposób jest omówione w książce Silverman z 1986 roku na temat: oszacowanie gęstości. –

Powiązane problemy