16 votos

¿Cómo extraer las muestras aleatorias de una distribución no paramétrica estimada?

Tengo una muestra de 100 puntos que son continuas y unidimensional. Calcula su densidad no paramétricos utilizando métodos kernel. ¿Cómo puedo sacar muestras al azar de esta distribución estimada?

24voto

Cupcake Puntos 8

Una estimación de densidad de kernel es una mezcla de distribución; para cada observación, hay un núcleo. Si el núcleo es un modelo a escala de densidad, esto conduce a un algoritmo simple para el muestreo a partir de la estimación de densidad de kernel:

repeat nsim times:
  sample (with replacement) a random observation from the data
  sample from the kernel, and add the previously sampled random observation

Si (por ejemplo) que utiliza un núcleo Gaussiano, su estimación de la densidad es una mezcla de 100 normales, cada uno centrado en uno de sus puntos de muestra y todos con desviación estándar $h$ igual a la estimación de ancho de banda. Para dibujar una muestra que usted puede simplemente muestra con reemplazo de uno de sus puntos de muestra (decir $x_i$) y, a continuación, muestra de una $N(\mu = x_i, \sigma = h)$. En R:

# Original distribution is exp(rate = 5)
N = 1000
x <- rexp(N, rate = 5)

hist(x, prob = TRUE)
lines(density(x))

# Store the bandwith of the estimated KDE
bw <- density(x)$bw

# Draw from the sample and then from the kernel
means <- sample(x, N, replace = TRUE)
hist(rnorm(N, mean = means, sd = bw), prob = TRUE)

Estrictamente hablando, dado que la mezcla de los componentes son de igual peso, usted podría evitar el muestreo con reemplazo de parte y simplemente sacar una muestra de un tamaño de $M$ a partir de cada uno de los componentes de la mezcla:

M = 10
hist(rnorm(N * M, mean = x, sd = bw))

Si por alguna razón usted no puede sacar de su núcleo (ex. su núcleo no es una densidad), puedes probar con la importancia de muestreo o MCMC. Por ejemplo, usando la importancia de muestreo:

# Draw from proposal distribution which is normal(mu, sd = 1)
sam <- rnorm(N, mean(x), 1)

# Weight the sample using ratio of target and proposal densities
w <- sapply(sam, function(input) sum(dnorm(input, mean = x, sd = bw)) / 
                                 dnorm(input, mean(x), 1))

# Resample according to the weights to obtain an un-weighted sample
finalSample <- sample(sam, N, replace = TRUE, prob = w)

hist(finalSample, prob = TRUE)

P. S. Con mi agradecimiento a Glen_b que han contribuido a la respuesta.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X