Próbuję wygenerować losowe próbki z niestandardowego pliku PDF przy użyciu R. Mój pdf to:
Wygenerowałem jednolite próbki, a następnie próbowałem przekształcić je w moją niestandardową dystrybucję. Zrobiłem to, znajdując plik cdf mojej dystrybucji ( ) i ustawiając go na jednolitą próbkę ( ) i rozwiązując dla .
Aby wygenerować losową próbkę z powyższym rozkładem, pobierz jednolitą próbkę i rozwiąż dla in
Zaimplementowałem to w R
i nie otrzymuję oczekiwanej dystrybucji. Czy ktoś może wskazać wadę w moim rozumieniu?
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
, było to dobre dopasowanie.Odpowiedzi:
Wygląda na to, że zorientowałeś się, że Twój kod działa, ale @Aniko wskazało, że możesz poprawić jego wydajność. Twój największy wzrost prędkości prawdopodobnie pochodziłby z alokacji pamięci dla
z
, abyś nie rozwijał jej w pętli. Coś takiegoz <- rep(NA, nsamples)
powinno załatwić sprawę. Możesz uzyskać niewielki wzrost prędkości przy użyciuvapply()
(który określa zwracany typ zmiennej) zamiast wyraźnej pętli (istnieje świetne pytanie SO dotyczące rodziny zastosuj).I nie potrzebujesz
;
znaku na końcu każdej linii (czy jesteś konwerterem MATLAB?).źródło
vapply
. Wchodzę wC/C++
to od bardzo dawna i to jest przyczyną;
dolegliwości!uniroot