Teknik umum dalam pembangkitan bilangan acak ada 3, yaitu:
Inverse-Transform Method
Acceptance-rejection method
Direct Transformation
Jika X adalah peubah acak kontinu dengan cdf \(F(x)\), maka \(U = F(x) \sim Uniform (0,1)\). Jika \(X = F^{-1}(u)\) maka \(X \sim f(x)\). Jadi, algoritma untuk membangkitkan data menggunakan metode ITM:
Tentukan fsk \(F(x)\) dari sebaran yang diinginkan
Tentukan \(F^{-1}(x)\)
Bangkitkan \(U \sim Uniform (0,1)\)
Transformasi \(X = F^{-1}(u)\)
Membangkitkan bilangan acak \(Eksponensial(\lambda)\)
\(X \sim eks (\lambda)\)
\(f(x) = \lambda e ^{- \lambda x}\) , untuk \(x \ge 0\)
\(F(x) = 1-e ^{- \lambda x}\) , untuk \(x \ge 0\)
\(U=1-e ^{- \lambda x}\) , untuk \(x \ge 0\)
\(X=-ln(1-U)/\lambda\)
Algoritma :
Bangkitkan U, bilangan acak Seragam(0, 1)
Hitung \(X=-ln(1-U)/\lambda\)
Ulangi berkali-kali sesuai dengan banyaknya bilangan yang diinginkan
#Eksponensial(lambda=3)
eks <- function(n,lambda){
U <- runif(n) #membangkitkan bilangan acak seragam sebanyak n
X <- -log(1-U)/lambda #menentukan inversnya dengan fungsi log
return(X) #
}
yy1 <- eks(1000,3) #inverse transform method #membangkitkan 1000 bilangan dengan lambda=3
yy2 <- rexp(1000,rate=3) #membangkitkan 1000 bilangan dengan rate=3 menggunakan fungsi bawaan R
par(mfrow=c(1,2)) #membagi layout menjadi 1 baris dan 2 kolom
hist(yy1,main="Exp dari Inverse Transform") #membuat histogram dari invers transform method
hist(yy2,main="Exp dari fungsi rexp") #membuat histogram dari fungsi bawaab RKesimpulan:
Baik mmenggunakan invers transform method maupun fungsi bawaan R, hasilnya mirip.
Bangkitkan \(X \sim f (x) = 3x^2\), \(0 < x < 1\), atau dengan kata lain, \(F_X(x) = x^3\), sehingga \(F^{-1}(u) = u^{1/3}\), \(0 < u < 1\)
n <- 1000 #jumlah bilangan ada 1000
u <- runif(n) #membangkitkan bilang acak sebaran seragam sebanyak n=1000
x <- u^(1/3) # inversnya dari f(x)
hist(x, prob=TRUE) ##membuat histogram dari invers transform method pada f(x)
sbx <- seq(0,1,.01) #sumbu x dari 0 sampai 1 dengan jarak 0.01
lines(sbx, 3*sbx^2) #menambah garisAlgoritme untuk membangkitkan \(X \sim f(x) ; x_0 < x < x_1\) :
Bangkitkan \(x \sim U(x_0,x_1)\)
Tentukan c sehingga \(f(x)
\le c\) untuk \(x_0 < x <
x_1\)
Bangkitkan \(y_1 \sim U(0,c)\)
Tentukan \(y_2 = f(x)\)
Jika \(y_1 \le y_2\), terima
x
Bangkitkan bilangan acak yang memiliki fkp \(f_Y(y)=3y^2 ; 0<y<1\) menggunakan acceptance-rejection method !
ar <- function(n,x0,x1,f) {
xx <- seq(x0,x1,length=10000) #baris bilangan dari x0 sampai x1 dengan 10000 titik
c <- max(f(xx)) #nilai maksimum dari fungsi f(xx)
terima <- 0; iterasi <- 0 #menyimpan berapa banyak iterasi yang dibutuhkan dan yg termasuk ke dalam kriteria
hasil <- numeric(n)
while(terima<n) { #menjalankan fungsi selama terima < n
x <- runif(1,x0,x1) #membangkitkan bilangan seragam dari x0 sampai x1
y1<- runif(1,0,c) #membangkitkan bilangan seragam dari 0 sampai c
y2<- f(x) #nilai f(x) untuk setiap x yang dibangkitkan
if(y1<=y2) { #jika y1<=y2, maka
terima <- terima+1
hasil[terima]<-x } #hasil x disimpan pada vektor hasil
iterasi <- iterasi+1 }
list(hasil=hasil,iterasi=iterasi) #hasil dari iterasi disimpan dalam bentuk list
}
set.seed(10)
f <- function(x) {3*x^2} #f(x)
yyy <- ar(100,0,1,f) #membangkitkan 100 bilangan dari 0 sampai 1 pada f(x)
yyy## $hasil
## [1] 0.8647212 0.7751099 0.8382877 0.7707715 0.5355970 0.8613824 0.2036477
## [8] 0.7979930 0.7438394 0.3443435 0.9837322 0.6935082 0.6331153 0.8880315
## [15] 0.7690405 0.6483695 0.8795432 0.9360689 0.7233519 0.7620444 0.9868082
## [22] 0.8760261 0.7240640 0.8140516 0.5588949 0.8900940 0.7456896 0.8480646
## [29] 0.8703302 0.8223331 0.8508123 0.7709219 0.8953595 0.5803863 0.5982260
## [36] 0.9235285 0.7367755 0.6898170 0.8301572 0.9293209 0.9095163 0.5347576
## [43] 0.3478601 0.8759762 0.7286815 0.8749293 0.6988356 0.8312562 0.5572238
## [50] 0.6647687 0.7400502 0.9806898 0.3800746 0.7553169 0.5184889 0.8879149
## [57] 0.9177773 0.8084086 0.8537441 0.4232184 0.7604306 0.3405763 0.3886568
## [64] 0.4774175 0.5387605 0.9485434 0.7124685 0.9081691 0.9457656 0.7716899
## [71] 0.6946655 0.5368832 0.8481593 0.8242752 0.5123742 0.3152032 0.9924487
## [78] 0.9327120 0.9892809 0.6283590 0.5254605 0.8810815 0.5291748 0.5765517
## [85] 0.7231807 0.8761180 0.3995670 0.8986123 0.9335217 0.7859216 0.7784128
## [92] 0.6955333 0.9060413 0.9916424 0.4729846 0.9770567 0.9386110 0.9959093
## [99] 0.8543663 0.8309547
##
## $iterasi
## [1] 322
par(mfrow=c(1,1)) #membuat layout 1 kolom 1 baris
hist(yyy$hasil,
main="f(x)=3*x^2", prob=T) #membuat histogram dari f(x) untuk 0 sampai 1
x <- seq(0, 1, 0.01)
lines(x, f(x), lwd=2, col=4) #menambah garisMemanfaatkan beberapa fungsi transformasi dari berbagai sebaran yang ada.
Jika \(X \sim U(0,1)\) menggunakan \(Y=b-aX+a\) maka \(Y \sim U(a,b)\). Membangkitkan bilangan acak \(Y \sim U(3,5) ; Y =2X+3\):
Bangkitkan bilangan acak \(\sim X^2_{(1)}\) !
y <- rnorm(1000) #membangkitkan bilangan acak sebaran normal sebanyak 1000
x <- y^2 #mengkuadratkan bilangan acak normal yang sudah diperoleh agar berdistribusi chi-square
hist(x,prob=T) #membuat histogram dari x
sbx <- seq(0,13,0.01) ##sumbu x dari 0 sampai 13 dengan jarak 0.01
lines(sbx,dchisq(sbx,df =1),col="red") #menambah garis