Pendahuluan

Teorema Limit Pusat (Central Limit Theorem - CLT) menyatakan bahwa distribusi rata-rata sampel akan mendekati distribusi normal seiring dengan bertambahnya ukuran sampel, terlepas dari distribusi populasi asal.

Konsep Utama

Prosedur Simulasi ADEMP Morris et al. (2019)

  1. Aims (Tujauan): Menjelaskan secara jelas apa yang ingin dicapai atau dipelajari dari simulasi.

  2. Data generating Mechanism: Menjabarkan bagaimana data disimulasikan.

  3. Estimand/Target of Analysis: Menentukan nilai parameter sebenarnya (true value) yang ingin diestimasi dari data simulasi.

  4. Methods: Merinci metode statistik atau algoritma yang digunakan dalam analisis data hasil simulasi.

  5. Performance Measure: Menjelaskan bagaimana kinerja metode diukur, bisa secara visual atau numerik.

Ilustrasi 1 PPT Kuliah

Aims

Tujuan dari simulasi ini adalah untuk menentukan batas bawah ukuran amatan contoh \(n_{obs}\) agar distribusi sample mean \(\bar{X}_{n_{obs}} \sim \mathcal{N}\) (Normal) dengan pendekatan visual, yaitu saat bentuk sebarannya terlihat mendekati distribusi normal (misalnya memiliki bentuk simetris dan lonceng) ketika populasi asal adalah distribusi Normal.

Data Generating Mechanism

Data dibangkitkan dari distribusi Normal dengan rata-rata 10 dan standar deviasi 3, yaitu \(\mathcal{N}(10,3)\). Ukuran contoh (\(n_{obs}\)) yang diuji: 5, 8, 10, 15, 20, …, 100.

library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)

set.seed(123)
n_obs_seq <- seq(5, 100, by = 10)
n_sim <- 1000
mu <- 10
sigma <- 3

# Simulasi untuk semua nilai n_obs
sim_results <- lapply(n_obs_seq, function(n) {
  means <- replicate(n_sim, mean(rnorm(n, mean = mu, sd = sigma)))
  data.frame(n_obs = n, sample_mean = means)
}) %>% bind_rows()

Estimand

Karena kita ingin memeriksa apakah distribusi sample mean \(\bar{X}\) menyerupai distribusi normal, maka kita membandingkan bentuk distribusi tersebut dengan distribusi normal teoritis. Perlu dicatat bahwa estimasi sample mean mendekati rata-rata populasi (yaitu 10), bukan nol.

Methods

  1. Untuk setiap ukuran contoh (\(n_{obs}\)), dilakukan 1000 simulasi dan dihitung nilai \(\bar{X}_{n_{obs}}\).
  2. Distribusi hasil sample mean divisualisasikan menggunakan histogram dan density plot.
ggplot(sim_results, aes(x = sample_mean)) +
  geom_histogram(aes(y = ..density..), bins = 30, fill = "skyblue", color = "black") +
  geom_density(color = "red", size = 1) +
  facet_wrap(~ n_obs, scales = "free", ncol = 5) +
  theme_minimal() +
  labs(title = "Distribusi Sample Mean untuk Berbagai Ukuran Sampel",
       x = "Sample Mean", y = "Density")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Performance

Kinerja dievaluasi secara visual dari grafik density untuk setiap \(n_{obs}\). Kita ingin mencari batas bawah dari \(n_{obs}\) dimana bentuk distribusi sample mean sudah terlihat cukup simetris dan menyerupai distribusi normal (berbentuk lonceng).

Kesimpulan: Berdasarkan grafik, distribusi sample mean mulai terlihat normal sekitar \(n_{obs} \geq 30\).

Ilustrasi 2 dengan Sampel dari Distribusi Normal, Seragam, dan Eksponensial

Dalam eksperimen ini, kita akan melihat bagaimana distribusi sampel berubah dengan ukuran sampel yang berbeda. Kita akan menggunakan tiga jenis distribusi populasi yang berbeda: Normal, Seragam, dan Eksponensial. Untuk setiap distribusi ini, kita akan mengambil sampel dengan ukuran n = 5, n = 25, n = 50, dan n = 100 kemudian menghitung rata-rata sampel dan memvisualisasikan hasilnya.

Langkah-langkah

  1. Membangkitkan Sampel: Kita akan membangkitkan sampel dari tiga distribusi: normal, seragam, dan eksponensial dengan ukuran sampel yang berbeda (5, 25, 50, 100).

  2. Histogram Rata-rata Sampel: Setelah kita mengambil sampel, kita akan menghitung rata-rata sampel dan memvisualisasikan hasilnya dengan histogram.

  3. Normal QQ-Plot: Kita juga akan memplotkan normal QQ-plot untuk melihat bagaimana distribusi rata-rata sampel dibandingkan dengan distribusi normal.

Kode dan Penjelasan

1. Membangkitkan Sampel dan Membuat Histogram

Kita akan membangkitkan sampel dari distribusi Normal, Seragam, dan Eksponensial untuk ukuran sampel n = 5, 25, 50, dan 100. Kemudian, kita akan menghitung rata-rata dari setiap sampel dan membuat histogram untuk melihat distribusi rata-rata sampel.

# Set seed untuk hasil yang konsisten
set.seed(123)

# Ukuran sampel yang berbeda
sample_sizes = c(5, 25, 50, 100)

# Fungsi untuk mengambil sampel dan menghitung rata-rata
ambil_sampel = function(n, k, distribusi) {
  means = numeric(k)
  for (i in 1:k) {
    if (distribusi == "normal") {
      sampel = rnorm(n)
    } else if (distribusi == "uniform") {
      sampel = runif(n)
    } else if (distribusi == "exponential") {
      sampel = rexp(n)
    }
    means[i] = mean(sampel)
  }
  return(means)
}

# Membuat histogram dan QQ-Plot untuk masing-masing distribusi dan ukuran sampel
par(mfrow = c(2, 2))  # Layout untuk menampilkan 3 histogram dan 3 QQ-Plot

# Distribusi Normal
for (size in sample_sizes) {
  means = ambil_sampel(size, 1000, "normal")
  hist(means, main = paste("Normal - n =", size),
       xlab = "Rata-rata Sampel", col = "lightblue", border = "black")
}

# Distribusi Seragam
for (size in sample_sizes) {
  means = ambil_sampel(size, 1000, "uniform")
  hist(means, main = paste("Seragam - n =", size),
       xlab = "Rata-rata Sampel", col = "lightgreen", border = "black")
}

# Distribusi Eksponensial
for (size in sample_sizes) {
  means = ambil_sampel(size, 1000, "exponential")
  hist(means, main = paste("Eksponensial - n =", size),
       xlab = "Rata-rata Sampel", col = "lightcoral", border = "black")
}

2. Membuat Normal QQ-Plot

QQ-plot digunakan untuk membandingkan distribusi rata-rata sampel dengan distribusi normal. Jika rata-rata sampel terdistribusi normal, maka titik-titik pada QQ-plot akan mengikuti garis diagonal.

# Menampilkan Normal QQ-Plot untuk masing-masing distribusi dan ukuran sampel
par(mfrow = c(2, 2))  # Layout untuk menampilkan 3 QQ-Plot

# Distribusi Normal
for (size in sample_sizes) {
  means = ambil_sampel(size, 1000, "normal")
  qqnorm(means, main = paste("QQ-Plot Normal - n =", size))
  qqline(means, col = "red")
}

# Distribusi Seragam
for (size in sample_sizes) {
  means = ambil_sampel(size, 1000, "uniform")
  qqnorm(means, main = paste("QQ-Plot Seragam - n =", size))
  qqline(means, col = "red")
}

# Distribusi Eksponensial
for (size in sample_sizes) {
  means = ambil_sampel(size, 1000, "exponential")
  qqnorm(means, main = paste("QQ-Plot Eksponensial - n =", size))
  qqline(means, col = "red")
}

Dari hasil histogram dan QQ-plot yang dihasilkan, kita bisa menarik beberapa kesimpulan penting:

  1. Distribusi Normal: Dengan ukuran sampel yang lebih besar, distribusi rata-rata sampel akan semakin mendekati distribusi normal. QQ-plot akan menunjukkan kecocokan yang sangat baik dengan garis diagonal.

  2. Distribusi Seragam: Meskipun distribusi populasi seragam, distribusi rata-rata sampel akan semakin mendekati distribusi normal dengan bertambahnya ukuran sampel. Hal ini terlihat jelas pada histogram dan QQ-plot.

  3. Distribusi Eksponensial: Meskipun distribusi populasi eksponensial, rata-rata sampel akan mendekati distribusi normal seiring bertambahnya ukuran sampel, meskipun mungkin tidak sekuat distribusi normal atau seragam.

library(ggplot2)
library(gridExtra)
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
library(dplyr)

Ilustrasi 3 dengan Sampel dari Distribusi Normal, dan Campuran

1. Bangkitkan Dua Gugus Data

  • Gugus 1: Data dari sebaran normal standar.

  • Gugus 2: Data campuran dengan tiga jenis kombinasi distribusi:

    1. 50% normal + 50% chi-square
    2. 50% chi-square(df=a) + 50% chi-square(df=b)
    3. 25% chi-square(df=a) + 25% chi-square(df=b) + 25% normal(mean=a) + 25% normal(mean=b)
# misalkan pada praktikum ini menggunakan parameter a=2 dan parameter b=5
bangkitkan_data = function(jenis, n, a = 2, b = 5) {
  if (jenis == "normal") {
    return(rnorm(n))
  } else if (jenis == "campuran1") {
    return(c(rnorm(n/2), rchisq(n/2, df = 2)))
  } else if (jenis == "campuran2") {
    return(c(rchisq(n/2, df = a), rchisq(n/2, df = b)))
  } else if (jenis == "campuran3") {
    return(c(
      rchisq(n/4, df = a),
      rchisq(n/4, df = b),
      rnorm(n/4, mean = a),
      rnorm(n/4, mean = b)
    ))
  }
}

2. Ambil Sampel Ukuran n = 4, 12, 20, 60, 100 dan Hitung Rataannya

# misalkan pada praktikum ini mneggunakan pengulangan (reps) sebanyak 1000 kali
ambl_rataan = function(jenis, n, reps = 1000, a = 2, b = 5) {
  replicate(reps, mean(bangkitkan_data(jenis, n, a, b)))
}

3. Buat Histogram dan Normal QQ-Plot untuk Setiap Ukuran Sampel

# Menampilkan Histogram dan QQ-Plot dalam Grid untuk Jenis Data dan Ukuran Sampel yang Berbeda
library(gridExtra)

# Fungsi untuk menghasilkan dan menampilkan plot dalam grid
plot_data = function(jenis, sample_sizes, a = 2, b = 5) {
  
  # Siapkan list untuk menampung plot
  plots = list()
  
  # Loop untuk semua ukuran sampel
  for (n in sample_sizes) {
    # Ambil rata-rata dari data yang telah dibangkitkan
    rataan = ambl_rataan(jenis, n, a = a, b = b)
    judul = paste(jenis, "n =", n)
    
    # Plot histogram dan QQ-plot
    df = data.frame(x = rataan)
    
    hist_plot = ggplot(df, aes(x)) +
      geom_histogram(bins = 30, fill = 'skyblue', color = 'black') +
      ggtitle(paste("Histogram -", judul)) +
      theme_minimal()
    
    qq_plot = ggplot(df, aes(sample = x)) +
      stat_qq() + stat_qq_line() +
      ggtitle(paste("QQ Plot -", judul)) +
      theme_minimal()
    
    # Simpan plot dalam list
    plots[[length(plots) + 1]] = hist_plot
    plots[[length(plots) + 1]] = qq_plot
  }
  
  # Menampilkan semua plot dalam grid
  do.call(grid.arrange, c(plots, ncol = 2))
}

4. Jalankan Analisis untuk Semua Kombinasi Ukuran Sampel dan Jenis Data

# Ukuran sampel yang ingin dibandingkan
sample_sizes = c(4, 12, 20, 60, 100)

# Menampilkan hasil untuk setiap jenis data
# Grid untuk data normal
plot_data("normal", sample_sizes)

# Grid untuk data campuran1
plot_data("campuran1", sample_sizes)

# Grid untuk data campuran2
plot_data("campuran2", sample_sizes)

# Grid untuk data campuran3
plot_data("campuran3", sample_sizes)

  • Distribusi rataan dari semua jenis data cenderung mendekati distribusi normal seiring dengan bertambahnya ukuran sampel.

  • Untuk data campuran yang lebih kompleks, ukuran sampel minimal 50–100 diperlukan agar bentuk distribusi mendekati normal.

  • Hal ini sejalan dengan Teorema Limit Pusat (Central Limit Theorem).

Kesimpulan

  1. Distribusi Sampel Mendekati Normal
    Distribusi rata-rata sampel akan semakin mendekati distribusi normal seiring dengan bertambahnya ukuran sampel. Dalam distribusi normal, nilai rata-rata sampel yang dekat dengan rata-rata populasi memiliki kemungkinan lebih besar muncul dibandingkan yang jauh.

  2. Rata-rata Sampel Mendekati Rata-rata Populasi
    Rata-rata dari distribusi sampel rata-rata (\(\bar{x}\)) akan mendekati rata-rata populasi (\(\mu\)) seiring bertambahnya ukuran sampel. Hal ini menunjukkan bahwa rata-rata sampel akan semakin dekat dengan rata-rata populasi.

  3. Kemungkinan Rata-rata Sampel Mendekati Rata-rata Populasi
    Karena distribusi rata-rata sampel semakin mendekati distribusi normal, rata-rata sampel lebih mungkin berada dekat dengan rata-rata populasi seiring bertambahnya ukuran sampel. Dengan ukuran sampel yang lebih besar, sampel akan lebih representatif terhadap populasi.

Tugas Mandiri

Kerjakan simulasi menggunakan format ADEMP. Tugas dikumpulkan menggunakan format pdf dan dikumpulkan paling lambar 27 April 2025 pukul 23.59.

Soal 1:

Melakukan simulasi untuk mendapatkan batas bawah ukuran contoh \(n_{\text{obs}}\) agar statistik baku \(Z \sim \mathcal{N}(0, 1)\), jika populasi asal berdistribusi normal namun mengandung pencilan (outlier).

Soal 2:

Bangkitkan dua gugus data:

  1. Data dari sebaran gamma(shape = 3, rate = 1).
  2. Data campuran:
    • 40% dari sebaran uniform(0,2) + 60% dari sebaran chi-square(df = 4).
    • 30% sebaran gamma(shape = 2) + 30% gamma(shape = 5) + 20% normal(mean = 1) + 20% normal(mean = 3).

Ambil sampel dengan ukuran n = 6, 22, 150.

  1. Buat histogram dan normal QQ-plot untuk setiap kombinasi data dan ukuran sampel.
  2. Tentukan pada ukuran n berapa distribusi rata-rata data mendekati distribusi normal.