Bilangan acak eksponensial digunakan untuk mensimulasikan waktu antar kejadian dalam proses Poisson atau model antrian. Distribusi eksponensial memiliki parameter \(\lambda\), yang merupakan laju kejadian. Pembangkitan bilangan acak eksponensial dapat dilakukan dengan menggunakan bilangan acak seragam \(U\) yang terdistribusi uniform pada interval \([0,1]\).
Jika \(U\) adalah bilangan acak seragam yang terdistribusi pada interval \([0, 1]\), maka untuk menghasilkan bilangan acak eksponensial \(X\) dengan parameter \(\lambda\), kita dapat menggunakan transformasi berikut:
\[ X = -\frac{\ln(U)}{\lambda} \]
Di mana:
- \(U\) adalah bilangan acak seragam \(U \sim Uniform(0, 1)\)
- \(X\) adalah bilangan acak yang terdistribusi eksponensial \(X \sim \text{Exponential}(\lambda)\)
- \(\lambda\) adalah parameter laju kejadian dari distribusi eksponensial.
Dari transformasi kumulatif fungsi distribusi eksponensial, kita memiliki:
\[ U = 1 - e^{-\lambda x} \]
\[ e^{-\lambda x} = 1 - U \]
\[ -\lambda x = \ln(1 - U) \]
\[ x = -\frac{\ln(1 - U)}{\lambda} \]
Namun, kita tahu bahwa \(1 - U\) juga adalah bilangan acak uniform lainnya, sehingga transformasi akhirnya tetap dapat disederhanakan menjadi:
\[ X = -\frac{\ln(U)}{\lambda} \]
Pembangkitan bilangan acak eksponensial dalam R dapat dilakukan
dengan fungsi rexp() atau dengan mengimplementasikan rumus
transformasi tersebut secara manual. Berikut adalah contoh
implementasi:
rexp():set.seed(123)
lambda = 1 # Parameter laju kejadian
n = 1000 # Jumlah bilangan acak eksponensial yang ingin dibangkitkan
# Membangkitkan bilangan acak eksponensial
exp_numbers = rexp(n, rate = lambda)
# Menampilkan histogram
hist(exp_numbers, main="Histogram Bilangan Acak Eksponensial", col="lightgreen", border="black")
set.seed(123)
lambda = 1 # Parameter laju kejadian
n = 1000 # Jumlah bilangan acak eksponensial yang ingin dibangkitkan
# Membangkitkan bilangan acak uniform
uniform_numbers = runif(n)
# Transformasi ke bilangan acak eksponensial
exp_numbers_manual = -log(uniform_numbers) / lambda
# Menampilkan histogram
hist(exp_numbers_manual, main="Histogram Bilangan Acak Eksponensial (Manual)", col="lightgreen", border="black")
Kodingan di atas digunakan untuk membangkitkan bilangan acak dari distribusi eksponensial menggunakan transformasi dari distribusi uniform. Berikut penjelasannya:
set.seed(123): Menetapkan seed untuk
memastikan bahwa hasil bilangan acak yang dibangkitkan tetap sama setiap
kali kode dijalankan.lambda = 1: Menentukan parameter laju
kejadian \(\lambda\) dari distribusi
eksponensial. Dalam hal ini, \(lambda =
1\).n = 1000: Menetapkan jumlah bilangan
acak eksponensial yang akan dibangkitkan, yaitu 1000 angka.runif(n): Membuat n
bilangan acak dari distribusi uniform pada interval \([0,1]\).-log(uniform_numbers) / lambda, yang
berdasarkan sifat transformasi variabel acak dari distribusi uniform ke
eksponensial.hist(): Menampilkan histogram bilangan
acak eksponensial yang telah dibangkitkan, dengan warna hijau muda dan
garis tepi hitam.Secara matematis, transformasi ini menggunakan formula: \[ X = -\frac{\log(U)}{\lambda} \] di mana \(U\) adalah bilangan acak dari distribusi uniform \(U(0,1)\), dan hasilnya \(X\) mengikuti distribusi eksponensial dengan parameter \(\lambda\).
Dengan menggunakan metode ini, kita dapat mensimulasikan bilangan acak eksponensial berdasarkan bilangan acak uniform yang terdistribusi pada interval \([0, 1]\).
Distribusi Gamma adalah distribusi probabilitas kontinyu yang sering digunakan untuk menggambarkan waktu yang dibutuhkan hingga terjadi \(n\) kejadian dalam proses Poisson. Distribusi Gamma memiliki dua parameter utama: \(\alpha\) dan \(\beta\), yang mempengaruhi bentuk distribusi tersebut.
Jika \(X\) adalah variabel acak eksponensial dengan parameter \(\lambda\), maka bilangan acak Gamma dengan parameter \(\alpha = n\) dan \(\beta = \lambda\) dapat diperoleh dengan menjumlahkan \(n\) bilangan acak eksponensial.
Jika kita ingin menghasilkan bilangan acak Gamma \(G\) dengan parameter \(\alpha = n\) dan \(\beta = \lambda\), kita dapat mengikuti langkah-langkah berikut:
Berikut adalah implementasi pembangkitan bilangan acak Gamma dalam R:
rgamma():set.seed(123)
n = 5 # Jumlah bilangan acak eksponensial untuk membentuk Gamma
lambda = 1 # Parameter laju kejadian
# Membangkitkan bilangan acak Gamma
gamma_numbers = rgamma(1000, shape = n, rate = lambda)
# Menampilkan histogram
hist(gamma_numbers, main="Histogram Bilangan Acak Gamma", col="lightblue", border="black")
set.seed(123)
n = 5 # Jumlah bilangan acak eksponensial untuk membentuk Gamma
lambda = 1 # Parameter laju kejadian
# Membangkitkan bilangan acak uniform
uniform_numbers = matrix(runif(n * 1000), ncol = n)
# Transformasi ke bilangan acak eksponensial
exp_numbers = -log(uniform_numbers) / lambda
# Jumlahkan bilangan acak eksponensial untuk menghasilkan Gamma
gamma_numbers_manual = rowSums(exp_numbers)
# Menampilkan histogram
hist(gamma_numbers_manual, main="Histogram Bilangan Acak Gamma (Manual)", col="lightblue", border="black")
Penjelasan Kode:
set.seed(123): Menetapkan seed agar
hasil bilangan acak tetap konsisten setiap kali kode dijalankan.n = 5: Menentukan jumlah bilangan acak
eksponensial yang akan dijumlahkan untuk membentuk distribusi
Gamma.lambda = 1: Menentukan parameter laju
kejadian \((\lambda)\) dari distribusi
eksponensial.runif(n * 1000): Membuat bilangan acak
dari distribusi uniform dengan ukuran \(5
\times 1000\), yang nantinya akan dikonversi ke distribusi
eksponensial.-log(uniform_numbers) / lambda.rowSums(exp_numbers).hist(): Menampilkan histogram bilangan
acak Gamma yang telah dibangkitkan, dengan warna biru muda dan garis
tepi hitam.Secara matematis, distribusi Gamma dengan parameter shape \(n\) dan rate \(lambda\) diperoleh dari: \(G = \sum_{i=1}^{n} X_i\)
dengan \(X_i\) adalah bilangan acak eksponensial dengan parameter \(\lambda\).
Apabila kita ingin membangkitkan bilangan acak khi kuadrat dengan derajat bebas \(m\), maka dapat dilakukan sebagai berikut:
Peubah acak khi-kuadrat dapat diperoleh dari distribusi Gamma dengan parameter (\(m/2, 1/2\)):
\[ X \sim \Gamma(m/2, 1/2) \]
Peubah acak khi-kuadrat dapat diperoleh dengan menjumlahkan peubah acak Gamma dengan parameter \(((m-1)/2, 1/2)\) dan sebuah kuadrat dari peubah normal standar:
\[ X = \Gamma((m-1)/2, 1/2) + Z^2 \]
dimana \(Z \sim N(0,1)\)
# Fungsi pembangkitan bilangan acak Khi-Kuadrat berdasarkan paritas m
khi2_gen = function(m, n) {
if (m %% 2 == 0) {
# Jika m genap, gunakan distribusi Gamma(m/2, 1/2)
x = rgamma(n, shape = m/2, rate = 1/2)
} else {
# Jika m ganjil, gunakan Gamma((m-1)/2, 1/2) + Z^2
x = rgamma(n, shape = (m-1)/2, rate = 1/2) + rnorm(n)^2
}
return(x)
}
# Contoh pembangkitan bilangan acak khi-kuadrat dengan m = 5 dan n = 10
khi2_gen(5, 10)
## [1] 1.7456835 4.2777591 0.8336954 5.4486690 2.0311200 10.0447038
## [7] 10.7307926 2.4083948 11.6315865 8.6231145
# Dengan fungsi yang ada dalam r
rchisq(n = 10, df = 5) # 10 sampel dari distribusi chi-square dengan df = 5
## [1] 2.380530 3.579539 2.810686 13.611625 1.095696 1.858558 7.072796
## [8] 2.196326 12.907968 7.326772
Penjelasan Kode:
rgamma() dengan parameter shape = m/2
dan `rate = 1/2``.rgamma() dengan kuadrat dari peubah acak normal standar
(rnorm()^2).set.seed(123) agar hasilnya
dapat direproduksi.Distribusi khi-kuadrat merupakan distribusi probabilitas yang sering digunakan dalam uji hipotesis dan analisis varians. Distribusi ini memiliki satu parameter derajat kebebasan (\(m\)). Jika \(Z_1, Z_2, ..., Z_m\) adalah peubah acak normal standar (berdistribusi \(N(0,1)\)), maka jumlah kuadratnya mengikuti distribusi khi-kuadrat dengan \(m\) derajat kebebasan:
\[ X = Z_1^2 + Z_2^2 + \dots + Z_m^2 \sim \chi^2_m \]
Pembangkitan bilangan acak yang berdistribusi khi-kuadrat dapat dilakukan dengan langkah-langkah berikut:
Secara matematis, pembangkitan bilangan acak khi-kuadrat dapat ditulis sebagai:
\[ X = \sum_{i=1}^{m} Z_i^2 \]
# Fungsi untuk pembangkitan bilangan acak Khi-Kuadrat
chi_square = function(m, n) {
Z = matrix(rnorm(m * n), nrow = n, ncol = m) # Generate matriks peubah acak normal standar
X = rowSums(Z^2) # Hitung jumlah kuadrat
return(X)
}
# Contoh pembangkitan bilangan acak Khi-Kuadrat dengan m = 5 dan n = 10
set.seed(123)
chi_square(5, 10)
## [1] 3.6172462 0.3602575 6.0453524 6.0239929 2.8505164 10.7150391
## [7] 1.6313269 5.7130866 2.9609814 2.1459067
Penjelasan Kode:
rnorm(m * n) digunakan untuk menghasilkan \(m \times n\) bilangan acak normal
standar.matrix(rnorm(m * n), nrow = n, ncol = m) membuat
matriks dengan \(n\) baris dan \(m\) kolom.rowSums(Z^2) menghitung jumlah kuadrat dari setiap
baris, sehingga menghasilkan \(n\)
bilangan acak khi-kuadrat.Dengan cara ini, kita dapat membangkitkan bilangan acak yang mengikuti distribusi khi-kuadrat dengan parameter derajat kebebasan tertentu.
Distribusi normal sulit dianalisis dengan integral secara langsung, maka membangkitkan peubah acaknya dilakukan dengan simulasi statistik. Berikut beberapa metode yang dapat digunakan untuk membangkitkan peubah acak normal:
Untuk sembarang peubah acak \(X_i\) yang saling bebas dan identik, \(Y= \sum_{i=1}^{n} X_i\) akan menyebar normal untuk n cukup besar.
Untuk \(U_i \sim Uniform(0,1)\) → \(X=\sum_{i=1}^{n} U_i \sim Normal(\mu, \sigma^2)\)
E(Ui) = 1/2 dan Var(Ui) = 1/12, maka \(X=\sum_{i=1}^{12} U_i - 6 \sim Normal(0,1)\)
\(E(X) = E( \sum_{i=1}^{12} U_i - 6 ) = E(U_1) + E(U_2) + ... + E(U_{12}) - 6 = 12 \times (1/2) - 6 = 0\)
\(Var(X) = V( \sum_{i=1}^{12} U_i - 6 ) = Var(U_1) + Var(U_2) + ... + Var(U_{12}) = 12 \times (1/12) = 1\)
Dengan cara menentukan nilai \(n\) dan \(k\) untuk persamaan \(X = \sum_{i=1}^{n} U_i - k ; X \sim Normal(5,2)\)
Rumus:
\(n = 12\sigma^2\)
\(k = \frac{n}{2} - \mu\)
Sehingga, \(X = \sum_{i=1}^{24} U_i - 7\) dimana \(X \sim Normal(5,2)\) dan \(U_i \sim Uniform(0,1)\)
i = 1000
mu = 0
sigma2 = 1
n = 12 * sigma2
k = (n / 2) - mu
set.seed(1234)
U = runif(n * i) # membangkitkan U ~ uniform (0,1)
Um = matrix(U, i)
X = apply(Um, 1, sum) - k
hasil = data.frame(parameter = c("miu", "sigma2"),
Nilai = c(mean(X), var(X)))
print(hasil)
## parameter Nilai
## 1 miu 0.02175383
## 2 sigma2 0.97653380
hist(X, col = "Light Coral", main = paste("Histogram of", "X ~ Normal (0,1)"))
i = 1000
mu = 5
sigma2 = 2
n = 12 * sigma2
k = (n / 2) - mu
set.seed(1234)
U = runif(n * i) # membangkitkan U ~ uniform (0,1)
Um = matrix(U, i)
X = apply(Um, 1, sum) - k
hasil = data.frame(parameter = c("miu", "sigma2"),
Nilai = c(mean(X), var(X)))
print(hasil)
## parameter Nilai
## 1 miu 5.089300
## 2 sigma2 2.092465
hist(X, col = "Light Coral", main = paste("Histogram of", "X ~ Normal (5,2)"))
X = rnorm(1000, mean = 0, sd = 1)
hist(X, col = "Light Coral", main = paste("Histogram of", "X ~ Normal (0,1)"))