Pembangkitan Bilangan Acak Eksponensial

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]\).

1. Hubungan antara Distribusi Seragam dan Eksponensial

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.

2. Langkah-Langkah Pembangkitan

  1. Generate Bilangan Acak Seragam:
    • Pertama, kita menghasilkan bilangan acak \(U\) yang terdistribusi uniform pada interval \([0,1]\).
  2. Transformasi ke Bilangan Acak Eksponensial:
    • Setelah menghasilkan \(U\), kita transformasikan \(U\) menggunakan rumus \(X = -\frac{\ln(U)}{\lambda}\) untuk mendapatkan bilangan acak eksponensial \(X\).
  3. Interpretasi:
    • Dengan langkah ini, bilangan acak \(X\) yang dihasilkan memiliki distribusi eksponensial dengan parameter \(\lambda\).

3. Penyelesaian Aljabar

Dari transformasi kumulatif fungsi distribusi eksponensial, kita memiliki:

  • Fungsi distribusi kumulatif untuk distribusi eksponensial adalah \(F_X(x) = 1 - e^{-\lambda x}\), untuk \(x \geq 0\).
  • Dengan mengatur \(F_X(x) = U\), di mana \(U\) adalah bilangan acak uniform, kita mendapatkan:

\[ U = 1 - e^{-\lambda x} \]

  • Mengisolasi \(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} \]

4. Implementasi dalam R

Pembangkitan bilangan acak eksponensial dalam R dapat dilakukan dengan fungsi rexp() atau dengan mengimplementasikan rumus transformasi tersebut secara manual. Berikut adalah contoh implementasi:

Menggunakan Fungsi 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")

Pembangkitan Manual (Menggunakan Transformasi):

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:

  1. set.seed(123): Menetapkan seed untuk memastikan bahwa hasil bilangan acak yang dibangkitkan tetap sama setiap kali kode dijalankan.
  2. lambda = 1: Menentukan parameter laju kejadian \(\lambda\) dari distribusi eksponensial. Dalam hal ini, \(lambda = 1\).
  3. n = 1000: Menetapkan jumlah bilangan acak eksponensial yang akan dibangkitkan, yaitu 1000 angka.
  4. runif(n): Membuat n bilangan acak dari distribusi uniform pada interval \([0,1]\).
  5. Transformasi eksponensial:
    • Bilangan acak eksponensial diperoleh dengan transformasi -log(uniform_numbers) / lambda, yang berdasarkan sifat transformasi variabel acak dari distribusi uniform ke eksponensial.
  6. 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]\).


Pembangkitan Bilangan Acak Gamma

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.

1. Hubungan antara Distribusi Gamma dan Eksponensial

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.

2. Pembangkitan Bilangan Acak Gamma

Jika kita ingin menghasilkan bilangan acak Gamma \(G\) dengan parameter \(\alpha = n\) dan \(\beta = \lambda\), kita dapat mengikuti langkah-langkah berikut:

  1. Generate \(n\) Bilangan Acak Eksponensial:
    • Masing-masing bilangan acak eksponensial \(X_i\) dibangkitkan menggunakan rumus \(X_i = -\frac{\ln(U_i)}{\lambda}\), dengan \(U_i \sim Uniform(0, 1)\).
  2. Jumlahkan \(n\) Bilangan Acak Eksponensial:
    • Untuk mendapatkan bilangan acak Gamma, kita jumlahkan \(n\) bilangan acak eksponensial yang telah dibangkitkan: \[ G = \sum_{i=1}^{n} X_i \]
    • Bilangan \(G\) yang dihasilkan akan memiliki distribusi Gamma dengan parameter \(\alpha = n\) dan \(\beta = \lambda\).

3. Implementasi dalam R

Berikut adalah implementasi pembangkitan bilangan acak Gamma dalam R:

Menggunakan Fungsi 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")

Pembangkitan Manual (Menggunakan Eksponensial):

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:

  1. set.seed(123): Menetapkan seed agar hasil bilangan acak tetap konsisten setiap kali kode dijalankan.
  2. n = 5: Menentukan jumlah bilangan acak eksponensial yang akan dijumlahkan untuk membentuk distribusi Gamma.
  3. lambda = 1: Menentukan parameter laju kejadian \((\lambda)\) dari distribusi eksponensial.
  4. runif(n * 1000): Membuat bilangan acak dari distribusi uniform dengan ukuran \(5 \times 1000\), yang nantinya akan dikonversi ke distribusi eksponensial.
  5. Transformasi eksponensial:
    • Setiap bilangan acak uniform diubah menjadi bilangan acak eksponensial menggunakan -log(uniform_numbers) / lambda.
  6. Penjumlahan eksponensial untuk membentuk distribusi Gamma:
    • Karena distribusi Gamma dengan parameter shape \(n\) dapat diperoleh dari jumlah \(n\) bilangan acak eksponensial, maka dilakukan penjumlahan menggunakan rowSums(exp_numbers).
  7. 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\).

Pembangkitan Bilangan Acak Khi-Kuadrat

Metode Pembangkitan Khi-Kuadrat Berdasarkan distribusi Gamma

Apabila kita ingin membangkitkan bilangan acak khi kuadrat dengan derajat bebas \(m\), maka dapat dilakukan sebagai berikut:

Jika \(m\) genap

Peubah acak khi-kuadrat dapat diperoleh dari distribusi Gamma dengan parameter (\(m/2, 1/2\)):

\[ X \sim \Gamma(m/2, 1/2) \]

Jika \(m\) ganjil

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)\)

Implementasi dalam R

# 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:

  • Jika \(m\) genap, kita menggunakan fungsi rgamma() dengan parameter shape = m/2 dan `rate = 1/2``.
  • Jika \(m\) ganjil, kita menambahkan rgamma() dengan kuadrat dari peubah acak normal standar (rnorm()^2).
  • Kita menetapkan seed dengan set.seed(123) agar hasilnya dapat direproduksi.

Pembangkitan Bilangan Acak Khi-Kuadrat dari Peubah Acak Normal Standar

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:

  1. Generate Peubah Acak Normal Standar: Hasilkan \(m\) peubah acak yang berdistribusi normal standar (\(N(0,1)\)).
  2. Hitung Jumlah Kuadratnya: Kuadratkan setiap nilai yang dihasilkan, lalu jumlahkan hasilnya.

Secara matematis, pembangkitan bilangan acak khi-kuadrat dapat ditulis sebagai:

\[ X = \sum_{i=1}^{m} Z_i^2 \]

Implementasi dalam R

# 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:

  • Fungsi 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.

Pembangkitan Bilangan Acak Normal

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:

  • Dalil Limit Pusat
  • Metode Box-Muller
  • Metode Polar-Marsaglia

1. Dalil Limit Pusat

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)\)

Pembuktian:

\(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\)

Bagaimana jika kita ingin membangkitkan peubah acak \(Normal(5,2)\)?

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)\)

Aplikasi di R

1. Membangkitkan Normal (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)"))

2. Membangkitkan Normal (5,2)

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)"))

Menggunakan fungsi di rnorm di R

X = rnorm(1000, mean = 0, sd = 1)
hist(X, col = "Light Coral", main = paste("Histogram of", "X ~ Normal (0,1)"))