Saya mencoba untuk menghasilkan sampel acak dari pdf kustom menggunakan R. Pdf saya adalah:
Saya menghasilkan sampel yang seragam dan kemudian mencoba mengubahnya menjadi distribusi khusus saya. Saya melakukan ini dengan menemukan cdf dari distribusi saya ( ) dan mengaturnya ke sampel seragam ( ) dan menyelesaikannya untuk .
Untuk menghasilkan sampel acak dengan distribusi di atas, dapatkan sampel seragam dan selesaikan untuk in
Saya menerapkannya R
dan saya tidak mendapatkan distribusi yang diharapkan. Adakah yang bisa menunjukkan kekurangan dalam pemahaman saya?
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
itu cocok.Jawaban:
Sepertinya Anda tahu bahwa kode Anda berfungsi, tetapi @Aniko menunjukkan bahwa Anda dapat meningkatkan efisiensinya. Kenaikan kecepatan terbesar Anda mungkin berasal dari pra-alokasi memori
z
agar Anda tidak menanamnya di dalam satu lingkaran. Sesuatu sepertiz <- rep(NA, nsamples)
harus melakukan triknya. Anda dapat memperoleh kecepatan kecil dengan menggunakanvapply()
(yang menentukan tipe variabel yang dikembalikan) alih-alih loop eksplisit (ada pertanyaan SO yang bagus tentang keluarga yang berlaku).Dan Anda tidak perlu
;
di akhir setiap baris (apakah Anda seorang konversi MATLAB?).sumber
vapply
. Saya telah mengkode dalamC/C++
waktu yang sangat lama dan itulah alasan;
kesengsaraan!uniroot