Estoy tratando de generar muestras aleatorias de un pdf personalizado usando R. Mi pdf es:
Generé muestras uniformes y luego traté de transformarlo en mi distribución personalizada. Hice esto buscando el cdf de mi distribución ( ) y configurándolo en la muestra uniforme ( ) y resolviendo para .
Para generar una muestra aleatoria con la distribución anterior, obtenga una muestra uniforme y resuelva para in
Lo implementé R
y no obtengo la distribución esperada. ¿Alguien puede señalar la falla en mi entendimiento?
nsamples <- 1000;
x <- runif(nsamples);
f <- function(x, u) {
return(3/2*(x-x^3/3) - u);
}
z <- c();
for (i in 1:nsamples) {
# find the root within (0,1)
r <- uniroot(f, c(0,1), tol = 0.0001, u = x[i])$root;
z <- c(z, r);
}
nsamples <- 1e6
fue un buen partido.Respuestas:
Parece que descubriste que tu código funciona, pero @Aniko señaló que podrías mejorar su eficiencia. Su mayor ganancia de velocidad probablemente vendría de la asignación previa de memoria para
z
que no la esté creciendo dentro de un ciclo. Algo asíz <- rep(NA, nsamples)
debería hacer el truco. Puede obtener una pequeña ganancia de velocidad al usarvapply()
(que especifica el tipo de variable devuelto) en lugar de un bucle explícito (hay una gran pregunta SO en la familia de aplicaciones).Y no necesitas el
;
al final de cada línea (¿eres un converso de MATLAB?).fuente
vapply
. ¡He estado codificandoC/C++
durante mucho tiempo y esa es la razón de la;
aflicción!uniroot