Ich versuche, Zufallsstichproben aus einem benutzerdefinierten PDF mit R zu generieren. Mein PDF lautet:
Ich habe einheitliche Samples generiert und dann versucht, diese in meine benutzerdefinierte Distribution umzuwandeln. Dazu habe ich die cdf meiner Verteilung ( ) gefunden und auf die einheitliche Stichprobe ( ) gesetzt und nach .
Um eine Zufallsstichprobe mit der obigen Verteilung zu erzeugen, erhalten Sie eine einheitliche Stichprobe und lösen nach x in \ frac {3} {2} (x - \ frac {x ^ 3} {3}) = u
Ich habe es in implementiert R
und bekomme nicht die erwartete Verteilung. Kann jemand auf den Fehler in meinem Verständnis hinweisen?
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
, war es ein gutes Match.Antworten:
Sie haben anscheinend herausgefunden, dass Ihr Code funktioniert, aber @Aniko hat darauf hingewiesen, dass Sie die Effizienz verbessern können. Ihr größter Geschwindigkeitsgewinn würde wahrscheinlich durch die Vorbelegung des Speichers entstehen,
z
damit Sie ihn nicht in einer Schleife vergrößern. So etwasz <- rep(NA, nsamples)
sollte den Trick machen. Möglicherweise erhalten Sie einen kleinen Geschwindigkeitsgewinn durch die Verwendung vonvapply()
(der den zurückgegebenen Variablentyp angibt) anstelle einer expliziten Schleife (es gibt eine große SO-Frage zur Apply-Familie).Und Sie brauchen nicht das
;
am Ende jeder Zeile (sind Sie ein MATLAB-Konverter?).quelle
vapply
. Ich habe schonC/C++
sehr lange programmiert und das ist der Grund für;
Bedrängnis!uniroot