Simulasi Monte Carlo adalah teknik statistik yang memanfaatkan distribusi acak untuk memodelkan dan memperkirakan perilaku sistem kompleks yang tidak dapat diselesaikan secara analitik. Teknik ini sangat berguna dalam menguji dan mempelajari distribusi statistik dan estimasi parameter berdasarkan sampel acak dari populasi.
Masalah: Misalkan \(X \sim N(0,1)\), dan kita ingin menghitung probabilitas bahwa \(Y = 2X\) lebih besar dari 2, yaitu \(P(Y > 2)\).
set.seed(123)
# Secara empirik
n = 100000
x = rnorm(n) # Bangkitkan X ~ N(0,1)
y = 2 * x # Hitung Y = 2X
y1 = ifelse(y > 2, 1, 0) # Tentukan apakah Y > 2
mean(y1) # P(Y > 2) secara empirik
## [1] 0.15939
# Secara teoritis
pnorm(2, 0, sqrt(4), lower.tail = FALSE) # P(Y > 2) dari distribusi hipotetik
## [1] 0.1586553
rnorm(n): Fungsi ini digunakan untuk membangkitkan
\(n\) bilangan acak dari distribusi
normal dengan rata-rata 0 dan deviasi standar 1.ifelse(y > 2, 1, 0): Mengecek apakah \(Y > 2\) dan memberi nilai 1 jika benar,
dan 0 jika tidak.mean(y1): Menghitung proporsi \(Y > 2\) dari 100,000 percobaan.pnorm(2, 0, 2, lower.tail = FALSE): Menghitung
probabilitas \(P(Y > 2)\) dari
distribusi normal \(N(0, 4)\), yang
merupakan distribusi \(Y\).Masalah: Misalkan kita ingin menghitung probabilitas \(P(X > 1)\) untuk distribusi eksponensial dengan parameter \(\lambda\). Kita akan menghitung probabilitas empiris dan membandingkannya dengan hasil dari distribusi eksponensial teoritis.
## Ilustrasi 2: Menghitung P(X > 1) pada distribusi eksponensial
lambda = 2
N = 100000
x = rexp(N, lambda) # Bangkitkan X ~ Exp(2)
y = ifelse(x > 1, 1, 0) # Tentukan apakah X > 1
prob_empirical = mean(y) # Probabilitas empiris
prob_empirical
## [1] 0.13463
## Hasil Empirik: 0.1353
# Membandingkan dengan hasil teoritis
prob_theoretical = pexp(1, rate = lambda, lower.tail = FALSE) # P(X > 1) dari distribusi teoritis
prob_theoretical
## [1] 0.1353353
## Hasil Teoritis: 0.1353
rexp(N, lambda): Fungsi ini digunakan untuk
membangkitkan \(N\) bilangan acak dari
distribusi eksponensial dengan parameter \(\lambda\).ifelse(x > 1, 1, 0): Mengecek apakah \(X > 1\), dan memberi nilai 1 jika benar,
dan 0 jika tidak.mean(y): Menghitung proporsi \(X > 1\) dari 100,000 percobaan.pexp(1, rate = lambda, lower.tail = FALSE): Menghitung
probabilitas teoritis \(P(X > 1)\)
untuk distribusi eksponensial dengan parameter \(\lambda\).Masalah: Diberikan data dari distribusi eksponensial dengan \(\lambda = 1\), kita ingin menguji hipotesis \(H_0: \lambda = 1\) menggunakan statistik uji \(t\). Kita akan menghitung p-value dan membuat kesimpulan berdasarkan uji hipotesis.
## Ilustrasi 3: Uji Hipotesis untuk Distribusi Eksponensial
lambda = 1
k = 10000
data1 = c(1.6876, 0.03037, 0.91673, 1.34939, 0.08164, 0.0312, 0.61068, 0.63169, 2.99986, 2.70955)
n = length(data1)
m = mean(data1)
s = sd(data1)
tdata = abs((m - 1 / lambda) / (s / sqrt(n)))
# Bangkitkan distribusi t dari sampel acak
data2 = matrix(rexp(n * k, lambda), k)
m1 = apply(data2, 1, mean)
s1 = apply(data2, 1, sd)
tdist = abs((m1 - 1 / lambda) / (s1 / sqrt(n)))
# Hitung p-value
y = ifelse(tdist > tdata, 1, 0)
pvalue = mean(y)
kesimpulan = ifelse(pvalue < 0.05, "Tolak H0", "Tidak Tolak H0")
# Menampilkan hasil
pvalue
## [1] 0.7691
kesimpulan
## [1] "Tidak Tolak H0"
matrix(rexp(n * k, lambda), k): Membuat \(k\) sampel dari distribusi eksponensial
untuk \(n\) data.apply(data2, 1, mean): Menghitung rata-rata untuk
setiap baris dalam matriks (setiap sampel).apply(data2, 1, sd): Menghitung standar deviasi untuk
setiap baris dalam matriks.abs((m1 - 1 / lambda) / (s1 / sqrt(n))): Menghitung
statistik uji \(t_{\text{dist}}\) untuk
setiap distribusi acak.ifelse(tdist > tdata, 1, 0): Mengecek apakah \(t_{\text{dist}}\) lebih besar dari \(t_{\text{data}}\), untuk menghitung
p-value.mean(y): Menghitung p-value berdasarkan distribusi
\(t_{\text{dist}}\).Teknik Monte Carlo dapat digunakan dalam berbagai situasi statistik untuk memperkirakan probabilitas, menguji hipotesis, dan mengestimasi parameter distribusi dari data atau model yang kompleks.
Jackknife adalah teknik resampling yang digunakan untuk mengestimasi bias dan variansi dari statistik estimasi, terutama ketika kita memiliki sampel yang terbatas. Teknik ini bekerja dengan cara meninggalkan satu observasi dari sampel pada satu waktu dan menghitung statistik yang diinginkan pada data yang tersisa.
Metode Jackknife merupakan teknik pendugaan yang mirip dengan metode Bootstrap dalam menghitung kesalahan baku. Metode ini dapat dianggap sebagai bentuk validasi silang leave-one-out. Misalkan kita memiliki sampel acak \(\mathbf{x} = (x_1, x_2, \dots, x_n)\). Untuk setiap \(i = 1, 2, \dots, n\), kita membentuk himpunan Jackknife \(\mathbf{x}_{(i)}\), yaitu subset dari \(\mathbf{x}\) yang diperoleh dengan menghapus satu pengamatan \(x_i\). Secara matematis, himpunan ini dapat dinyatakan sebagai:
\([\mathbf{x}_{(i)} = (x_1, x_2, \dots, x_{i-1}, x_{i+1}, \dots, x_n)]\)
Jika suatu parameter \(\theta\) diduga menggunakan \(\hat{\theta} = f_n(\mathbf{x})\), maka untuk setiap subset Jackknife, penduga parameter tersebut dihitung sebagai:
\([\hat{\theta}_{(i)} = f_{n-1}(\mathbf{x}_{(i)}), \quad i = 1, 2, \dots, n]\)
Dengan demikian, metode Jackknife memberikan serangkaian estimasi parameter yang dapat digunakan untuk menghitung kesalahan baku atau bias dari penduga \(\hat{\theta}\). Teknik ini sering digunakan dalam statistik untuk meningkatkan keandalan estimasi serta mengurangi bias dalam analisis data.
Masalah: Misalkan kita memiliki data tentang dua item yang terjual di beberapa toko. Kita ingin menghitung rasio rata-rata penjualan item1 terhadap total penjualan (item1 + item2) di seluruh toko. Kita akan menggunakan teknik Jackknife untuk menghitung estimasi variansi dan standar error (SE) dari rasio ini.
# Data Penjualan di beberapa toko
store = LETTERS[1:6] # Nama toko
item1 = c(1363, 670, 761, 746, 991, 798) # Penjualan item1
item2 = c(1087, 571, 518, 612, 770, 655) # Penjualan item2
# Menggabungkan data menjadi data frame
data1 = data.frame(store, item1, item2)
n = nrow(data1) # Jumlah toko
# Menghitung estimasi awal (theta_hat)
theta_hat = mean(data1$item1) / (mean(data1$item1) + mean(data1$item2))
# Menyiapkan matriks untuk Jackknife samples
y = matrix(NA, n, n-1) # Matriks untuk item1 tanpa toko i
x = matrix(NA, n, n-1) # Matriks untuk item2 tanpa toko i
# Membuat Jackknife samples untuk setiap toko
for (i in 1:n) {
y[i,] = data1$item1[-i] # Item1 tanpa toko i
x[i,] = data1$item2[-i] # Item2 tanpa toko i
}
# Menghitung rata-rata untuk setiap Jackknife sample
ybar = apply(y, 1, mean) # Rata-rata item1 untuk setiap Jackknife sample
xbar = apply(x, 1, mean) # Rata-rata item2 untuk setiap Jackknife sample
# Menghitung statistik Jackknife (theta_i)
theta_i = ybar / (xbar + ybar)
# Menghitung estimasi Jackknife untuk theta (teta_jk)
theta_jk = n * theta_hat - (n - 1) * mean(theta_i)
# Menghitung variansi Jackknife
var_jk = (n - 1) / n * (sum(theta_i^2) - n * mean(theta_i)^2)
# Menghitung standar error (SE) Jackknife
se_jk = sqrt(var_jk)
# Menampilkan hasil estimasi Jackknife
theta_jk # Estimasi theta dengan Jackknife
## [1] 0.5584068
se_jk # Standar error dengan Jackknife
## [1] 0.006207102
data1. Kita mengasumsikan bahwa item1
dan item2 adalah penjualan barang yang berbeda di setiap toko.mean(item1) / (mean(item1) + mean(item2)).Teknik Jackknife adalah metode yang sangat berguna untuk mengestimasi variansi dan bias dari statistik estimasi. Dalam contoh di atas, kita berhasil menghitung rasio rata-rata penjualan item1 terhadap total penjualan di beberapa toko menggunakan Jackknife dan memperkirakan standar error (SE) dari estimasi tersebut.
Bootstrap adalah teknik resampling yang digunakan untuk mengatasi masalah yang muncul ketika ukuran sampel kecil, atau ketika tidak ada informasi yang cukup tentang distribusi populasi. Tujuan utama dari metode bootstrap adalah untuk mengestimasi distribusi sampel dari statistik estimasi tanpa memerlukan asumsi kuat tentang distribusi populasi. Teknik ini dapat memberikan hasil yang robust meskipun ukuran sampel sangat kecil.
Membangun Data Semu: Data semu dibangkitkan dengan cara menarik sampel ulang secara acak (dengan pengembalian) dari data asli.
Pengulangan: Sampel semu ini digunakan untuk menghitung statistik estimasi, dan proses ini dilakukan berulang kali (misalnya 1000 kali).
Mempelajari Statistik: Statistik yang dihitung pada setiap iterasi dipelajari untuk memahami distribusi dari statistik tersebut, yang akan digunakan untuk menduga parameter populasi yang lebih baik.
Ambil Sampel Asli \(y = (y_1, y_2, \dots, y_n)\) untuk menduga parameter \(\theta\) dengan estimator \(\hat{\theta} = f(y)\).
Simulasikan Sampel Berulang: Buat sampel semu \(y_b^{(i)}\) dari \(y\) sebanyak \(N\) kali, masing-masing dengan ukuran \(n\).
Hitung Statistik \(\hat{\theta}_b^{(i)} = f(y_b^{(i)})\) untuk setiap sampel semu.
Estimasi Parameter Bootstrap: Hitung estimator \(\hat{\theta}_b\) sebagai rata-rata dari semua \(\hat{\theta}_b^{(i)}\).
Estimasi Variansi dan Standar Error: Hitung variansi bootstrap dan standar error dari estimator.
Rumus untuk estimator dan variansi Bootstrap adalah sebagai berikut:
\[ \hat{\theta}_b = \frac{1}{N} \sum_{i=1}^{N} \hat{\theta}_b^{(i)} \]
\[ V_b(\hat{\theta}) = \frac{1}{N-1} \sum_{i=1}^{N} (\hat{\theta}_b^{(i)} - \hat{\theta}_b)^2 \]
Masalah:
Diberikan data penjualan untuk dua item di beberapa toko, kita ingin
mengestimasi rasio antara penjualan item1 terhadap
total penjualan (item1 + item2)
menggunakan teknik bootstrap.
Bootstrap Sampel: Buat sampel semu \(y_b^{(i)}\) dan \(x_b^{(i)}\) untuk item1 dan item2 secara acak dari data asli.
Hitung Statistik Bootstrap: Hitung rasio untuk setiap sampel semu \(\hat{\theta}_b^{(i)}\).
Estimasi dengan Bootstrap: Hitung rata-rata rasio bootstrap \(\hat{\theta}_b\), serta variansi dan standar error.
## Aplikasi Bootstrap untuk Menghitung Rasio Item1 terhadap Total Penjualan
store = LETTERS[1:6] # Nama Toko
item1 = c(1363, 670, 761, 746, 991, 798) # Penjualan item1
item2 = c(1087, 571, 518, 612, 770, 655) # Penjualan item2
# Membuat Data Frame
data1 = data.frame(store, item1, item2)
n = nrow(data1) # Jumlah toko
k = 1000 # Jumlah iterasi atau pengulangan dalam proses bootstrap
# Membuat sampel bootstrap untuk item1 dan item2
y = matrix(sample(data1$item1, n * k, replace = TRUE), k)
x = matrix(sample(data1$item2, n * k, replace = TRUE), k)
# Menghitung rata-rata untuk setiap sampel bootstrap
ybar = apply(y, 1, mean) # Rata-rata item1 untuk setiap sampel bootstrap
xbar = apply(x, 1, mean) # Rata-rata item2 untuk setiap sampel bootstrap
# Menghitung rasio bootstrap (teta_i)
teta_i = ybar / (xbar + ybar)
# Menghitung rata-rata rasio bootstrap (teta_b)
teta_b = mean(teta_i)
# Menghitung variansi bootstrap
var_b = (sum(teta_i^2) - (k * teta_b^2)) / (k - 1)
# Menghitung standar error (SE) bootstrap
se_b = sqrt(var_b)
# Menampilkan hasil estimasi rasio bootstrap dan SE
teta_b # Estimasi rasio dengan bootstrap
## [1] 0.5578302
se_b # Standar error dengan bootstrap
## [1] 0.0374347
Data Penjualan: Data penjualan item1 dan item2
di beberapa toko disusun dalam data frame data1.
Sample Bootstrap: Fungsi sample()
digunakan untuk membuat sampel semu (bootstrap samples) dari data asli
untuk item1 dan item2.
Rata-rata Bootstrap: Fungsi apply()
digunakan untuk menghitung rata-rata item1 dan item2 dari setiap sampel
semu.
Rasio Bootstrap: Rasio antara rata-rata item1 dan total penjualan dihitung untuk setiap sampel semu, dan hasilnya digunakan untuk mengestimasi rasio yang lebih akurat.
Estimasi Variansi dan SE: Variansi bootstrap dihitung menggunakan rumus variansi klasik, dan standar error dihitung sebagai akar dari variansi.
Bootstrap memberikan estimasi yang lebih akurat untuk parameter yang sulit dihitung, terutama ketika ukuran sampel kecil atau distribusi populasi tidak diketahui.
Rasio penjualan antara item1 dan total penjualan dihitung menggunakan teknik Bootstrap, dan estimasi standar error (SE) digunakan untuk memahami seberapa tepat rasio tersebut.
Dengan menggunakan Bootstrap, kita dapat mendapatkan hasil yang lebih robust dan efisien untuk menduga parameter populasi meskipun hanya dengan sedikit data.