Yo estaba tratando de ilustrar que el rechazo de muestreo es ineficiente cuando un enfoque alternativo que no bote las muestras. (Este post obviamente es un candidato para la migración, pero creo que también podría ser una estadística aspecto.)
Mi ejemplo de que iba a ser la simulación de $Beta(2,2)$ varia con un algoritmo de rechazo y rbeta(N,2,2)
. Mi código es el siguiente:
# densityatmode <- dbeta(.5,2,2)=1.5
rejectionsampling_beta22 <- function(N){
px <- runif(N,min=0,max=1)
py <- runif(N,min=0,max=1.5)
ikeep <- (py < 6*px*(1-px))
return(px[ikeep])
}
samples <- 1500000
La probabilidad de aceptación es area under density/area in box
, area under density
de curso igual a uno, por lo 1/1.5, o, equivalentemente, tenemos 1.5 como muchos de los candidatos de las muestras en el uso de rechazo.
library(microbenchmark)
result <- microbenchmark(rejectionsampling_beta22(1.5*samples),rbeta(samples,2,2))
El resultado, lo cual es sorprendente para mí, ya que yo sentía que el rechazo de 1/3 de los sorteos debe ser un desperdicio:
Warning message:
In microbenchmark(rejectionsampling_beta22(1.5 * samples), rbeta(samples, :
Could not measure a positive execution time for 33 evaluations.
> result
Unit: nanoseconds
expr min lq mean median uq max neval cld
rejectionsampling_beta22(1.5 * samples) 180171443 254891504 248482870.58 257005186 258866373 329533988 100 b
rbeta(samples, 2, 2) 253091893 254717640 261602707.69 257391248 259902160 333055032 100 c
neval 0 0 63.97 1 1 604 100 a