Resampling adalah pendekatan statistik nonparametrik yang digunakan untuk mengevaluasi ketidakpastian dalam estimasi statistik. Teknik ini melibatkan pengambilan sampel ulang dari dataset yang tersedia.
Bootstrap adalah metode resampling dengan pengembalian dari dataset asli. Metode ini digunakan untuk memperkirakan distribusi sampling dari suatu statistik tanpa asumsi bentuk distribusi populasi.
Prosedur:
a. Ambil sampel bootstrap sebanyak B kali dari data asli (dengan pengembalian)
b. Hitung statistik untuk tiap sampel
c. Analisis hasil dari distribusi bootstrap
Contoh: Estimasi Galat Baku dan Selang Kepercayaan dari Mean
set.seed(123)
data_asli <- c(5, 7, 8, 6, 9, 4, 7, 6, 5, 8)
n <- length(data_asli)
B <- 1000
bootstrap_means <- replicate(B, mean(sample(data_asli, n, replace = TRUE)))
hist(bootstrap_means, breaks = 30, col = "skyblue", main = "Bootstrap Distribution of Mean")
Histogram di atas menampilkan distribusi bootstrap dari rata-rata sampel yang diperoleh dengan mengambil 1.000 sampel ulang (resampling) dari data asli, menggunakan teknik bootstrap. Setiap sampel ulang berukuran sama dengan data asli dan diambil dengan pengembalian (replacement).
se_bootstrap <- sd(bootstrap_means)
se_bootstrap
## [1] 0.4571057
Standar error yang terbentuk dari resampling bootstrap diatas sebesar 0.4620514.
ci <- quantile(bootstrap_means, c(0.025, 0.975))
ci
## 2.5% 97.5%
## 5.6 7.4
Berdasarkan metode bootstrap, diperoleh selang kepercayaan 95% untuk nilai rata-rata sebesar [5,6; 7,4].
Bootstrapping dapat digunakan untuk pengujian hipotesis dengan membandingkan statistik yang teramati terhadap distribusi bootstrap berdasarkan hipotesis nol. Biasanya digunakan untuk satu populasi, seperti pengujian mean = nilai tertentu.
Ilustrasi: Misalkan kita ingin menguji:
Data asli: 5, 7, 8, 6, 9, 4, 7, 6, 5, 8
H0: mean = 6 vs H1: mean ≠ 6
Hitung rata-rata dari data asli sebagai statistik yang diamati: \(\bar{x}_{\text{obs}} = \text{mean(data_asli)}\)
set.seed(123)
data_asli <- c(5, 7, 8, 6, 9, 4, 7, 6, 5, 8)
n <- length(data_asli)
B <- 10000
mu0 <- 6 # nilai hipotesis nol
# Statistik teramati
t_obs <- mean(data_asli)
Bangkitkan Sampel Bootstrap Berdasarkan H₀
Pusatkan data asli agar memiliki rata-rata sama dengan nilai nol hipotesis (μ₀ = 6). Ini menciptakan sampel bootstrap di bawah asumsi H₀ benar:
\([\text{data_centered} = \text{data_asli} - \bar{x}_{\text{obs}} + \mu_0 ]\)
Kemudian lakukan resampling terhadap data tersebut sebanyak B kali:
data_centered <- data_asli - mean(data_asli) + mu0
bootstrap_null <- replicate(B, mean(sample(data_centered, n, replace = TRUE)))
Hitung P-Value Empiris (Dua Sisi)
Hitung proporsi nilai rata-rata bootstrap yang berbeda dari μ₀ sebesar atau lebih ekstrem daripada perbedaan yang diamati:
\([\text{p-value} = P\left( \left| \bar{x}_{\text{boot}} - \mu_0 \right| \geq \left| \bar{x}_{\text{obs}} - \mu_0 \right| \right)]\)
p_value <- mean(abs(bootstrap_null - mu0) >= abs(t_obs - mu0))
p_value
## [1] 0.3449
Diperoleh p-value sebesar 0.3373 > 0.05, maka terima H0. sehingga cukup bukti untuk mneyatakan bahwa data memiliki nilai rata-rata sebesar 6 pada taraf 5%.
Visualisasi Distribusi Bootstrap
Histogram menunjukkan distribusi nilai rata-rata bootstrap di bawah H₀. Dua garis vertikal ditambahkan:
hist(bootstrap_null, breaks = 40, col = "salmon", main = "Bootstrap Null Distribution")
abline(v = t_obs, col = "blue", lwd = 2, lty = 2)
abline(v = mu0, col = "black", lwd = 2)
legend("topright", legend = c("Mean Observed", "Mean Null"),
col = c("blue", "black"), lty = 2, bty = "n")
Gambar diatas menunjukkan bahwa abline biru (rata-rata data bootstrap)
tidak jauh berbeda dari abline hitam (rata-rata hipotesis null). Dari
hasil pengujian hipotesis menunjukkan bahwa data cenderung memiliki
nilai rata-rata yang dirumuskan H0.
Notes: Apabila garis abline biru berada di ekor distribusi dan sangat jauh dari garis abline hitam, hal ini menunjukkan bahwa data cenderung menolak hipotesis nol H0.
Cross-validation (CV) adalah teknik resampling tanpa pengembalian yang digunakan untuk mengevaluasi performa model prediktif pada data yang belum terlihat.
Kode berikut menunjukkan contoh penerapan metode k-fold
cross-validation dengan 10 fold untuk mengevaluasi model regresi
linier sederhana. Data sintetis dibuat dengan dua variabel,
x dan y, di mana y merupakan
kombinasi linear dari x dengan tambahan error. Fungsi
train dari paket caret digunakan untuk
melakukan pelatihan model dengan kontrol validasi silang, sehingga
performa model dapat dinilai secara lebih andal dan menghindari
overfitting.
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
set.seed(123)
data <- data.frame(
x = rnorm(100),
y = 2 * rnorm(100) + rnorm(100)
)
fit_control <- trainControl(method = "cv", number = 10)
model_cv <- train(y ~ x, data = data, method = "lm", trControl = fit_control)
model_cv
## Linear Regression
##
## 100 samples
## 1 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 89, 91, 88, 90, 90, 90, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 2.172308 0.1378184 1.721652
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
Penjelasan Syntax:
- Kode di atas menunjukkan penerapan K-Fold Cross Validation sebanyak 10 lipatan (cv, number = 10) menggunakan paket caret.
- Dengan trainControl(method = “cv”, number = 10), data dibagi menjadi 10 subset. Model dilatih sebanyak 10 kali, masing-masing menggunakan 9 bagian untuk pelatihan dan 1 bagian untuk validasi.
- Hasil akhir adalah rata-rata performa dari 10 model, memberikan estimasi yang lebih stabil dan dapat mengurangi risiko overfitting.
| Aspek | K-CV (K=5/10) | LOOCV |
|---|---|---|
| Bias | Lebih tinggi | Lebih rendah |
| Variansi | Lebih rendah | Lebih tinggi |
| Waktu komputasi | Relatif cepat | Sangat lambat untuk data besar |
| Ukuran data train | (K-1) folds | N-1 amatan |
| Ukuran data test | 1 folds | 1 amatan |
Metode Monte Carlo adalah teknik simulasi berdasarkan sampel acak untuk menghitung estimasi numerik. Cocok digunakan saat solusi analitik sulit ditemukan.
Mengestimasi nilai dari integral: \([ \int_2^5 \sin(x^2) \, dx ]\)
Integral ini sulit dihitung secara analitik, sehingga pendekatan Monte Carlo digunakan.
set.seed(123)
N <- 10000
a <- 2
b <- 5
x <- runif(N, min = a, max = b)
g_x <- sin(x^2)
theta_hat <- (b - a) * mean(g_x)
theta_hat
## [1] -0.2753906
Hasil integral menggunakan resampling monte carlo menunjukkan hasil mendekati -0.3099078.
hist(g_x, breaks = 30, col = "lightblue", main = "Distribusi sin(x^2) dari Uniform(2,5)")
Histogram yang ditampilkan menunjukkan sebaran nilai dari fungsi \(( \sin(x^2))\) ketika \(( x )\) dibangkitkan secara acak dari distribusi Uniform(2,5). Terlihat bahwa nilai \(( \sin(x^2) )\) bervariasi dari sekitar -1 hingga 1.