J'essaie de générer des échantillons aléatoires à partir d'un pdf personnalisé à l'aide de R. Mon pdf est:
J'ai généré des échantillons uniformes, puis j'ai essayé de le transformer en ma distribution personnalisée. J'ai fait cela en trouvant le cdf de ma distribution ( ) et en le réglant sur l'échantillon uniforme ( u ) et en résolvant pour x .
Pour générer un échantillon aléatoire avec la distribution ci-dessus, obtenez un échantillon uniforme et résolvez pour x en 3
Je l'ai implémenté dans R
et je n'obtiens pas la distribution attendue. Quelqu'un peut-il signaler la faille dans ma compréhension?
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
c'était un bon match.Réponses:
Il semble que vous ayez compris que votre code fonctionne, mais @Aniko a souligné que vous pouviez améliorer son efficacité. Votre gain de vitesse le plus important proviendrait probablement de la pré-allocation de mémoire pour
z
que vous ne la développiez pas dans une boucle. Quelque chose commez <- rep(NA, nsamples)
ça devrait faire l'affaire. Vous pouvez obtenir un petit gain de vitesse en utilisantvapply()
(qui spécifie le type de variable renvoyé) au lieu d'une boucle explicite (il y a une grande question SO sur la famille apply).Et vous n'avez pas besoin du
;
à la fin de chaque ligne (êtes-vous un converti MATLAB?).la source
vapply
. J'encodeC/C++
depuis très longtemps et c'est la raison de l';
affliction!uniroot
par une solution directe accélère les choses de trois ordres de grandeur supplémentaires: vous ne devriez avoir aucun problème à vous déplacer