2009-09-14 13 views
6

Ho un oggetto densità dd creato in questo modo:Generare devia casuali stocastici da un oggetto densità con R

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

che produce questa distribuzione molto non-gaussiana:

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

lo farei Alla fine piace ottenere deviazioni casuali da questa distribuzione simile a quanto rnorm devia da una distribuzione normale.

Il modo in cui sto cercando di crearlo è quello di ottenere il CDF del mio kernel e poi ottenerlo per dirmi la varia se si passa una probabilità cumulativa (CDF inversa). In questo modo posso trasformare un vettore di variabili casuali uniformi in disegni dalla densità.

Sembra che quello che sto cercando di fare dovrebbe essere qualcosa di fondamentale che altri hanno fatto prima di me. C'è un modo semplice o una semplice funzione per fare questo? Odio reinventare la ruota.

FWIW Ho trovato this R Help article ma non riesco a recuperare ciò che stanno facendo e l'output finale non sembra produrre quello che sto cercando. Ma potrebbe essere un passo lungo il cammino che semplicemente non capisco.

Ho preso in considerazione solo un Johnson distribution from the suppdists package ma Johnson non mi darà la bella gobba bimodale che i miei dati hanno.

+0

più di una domanda statistiche di programmazione ... –

+0

conosco le statistiche. Voglio implementare il metodo stats in una determinata lingua. Questa è la programmazione. –

risposta

2

Questa è solo una miscela di normali. Quindi, perché non qualcosa di simile:

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

Questo dovrebbe andare bene se tutto ciò che serve sono campioni da questa distribuzione della miscela.

+0

Mi piace l'idea! Ma il mio esempio è semplificato per scopi illustrativi. In realtà non conosco le due modalità e potrebbe avere solo una modalità e una coda lunga (cioè la leptokurtosi). Ma mi piace il tuo esempio. Non avrei potuto programmarlo così vicino in modo succinto. proposito, ritengo mancano ac in: trama (densità (rmnorm (10000, medi = c (0,3), sd = c (1,2), prob = c (.5, .5)))) –

+0

@JD Long: grazie per aver individuato l'errore di battitura. –

+1

Qual è il motivo per cui vuoi la risposta di Hadley - ricampionarlo è. Ricorda che il tuo grafico di densità è/solo una stima/che dipende anche dal tuo parametro di livellamento. –

9

approccio alternativo:

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

ftw bootstrapping! –

+0

sì, ci ho pensato troppo. Se campionassi + un pareggio da un normale dovrei finire per addensare la mia coda nello stesso modo in cui lo farebbe il kernel, giusto? Supponendo che paramimo il mio normale allo stesso modo del metodo kerneling. –

+2

Sì, aggiungi normali rv con media zero e sd = larghezza di banda dalla stima della densità: esempio (x, n, replace = TRUE) + rnorm (n, 0, sd = 0,4214) Simulazione come questa è discussa nel libro di Silverman del 1986 su stima della densità. –

Problemi correlati