Я пытаюсь сгенерировать случайные выборки из пользовательского PDF-файла, используя R. Мой PDF-файл:
Я сгенерировал единообразные образцы, а затем попытался преобразовать их в свой собственный дистрибутив. Я сделал это, найдя cdf моего дистрибутива ( ) и установив его в единую выборку ( ) и решив для .
Чтобы сгенерировать случайную выборку с указанным выше распределением, получите равномерную выборку и решите для in
Я реализовал это, R
и я не получаю ожидаемое распределение. Кто-нибудь может указать на недостаток в моем понимании?
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
это был хороший матч.Ответы:
Похоже, вы поняли, что ваш код работает, но @Aniko указал, что вы можете повысить его эффективность. Ваше наибольшее увеличение скорости, вероятно, будет связано с предварительным выделением памяти,
z
чтобы вы не увеличивали ее в цикле. Что-то вродеz <- rep(NA, nsamples)
должно сделать свое дело. Вы можете получить небольшое увеличение скорости от использованияvapply()
(которое указывает возвращаемый тип переменной) вместо явного цикла (есть большой вопрос SO по семейству apply).И вам не нужно
;
в конце каждой строки (вы конвертируете в MATLAB?).источник
vapply
. Я кодировал вC/C++
течение очень долгого времени, и это причина;
несчастья!uniroot