Prosedur Simulasi ADEMP

Library

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)

Soal 1

Aim

Tujuan dari simulasi ini adalah untuk menentukan batas minimum ukuran sampel (jumlah observasi) yang diperlukan agar statistik baku Z dapat mengikuti distribusi normal baku, meskipun populasi asal berdistribusi normal namun mengandung pencilan (outlier).

Data Generating Mechanism

Data dibangkitkan dari distribusi Normal dengan rata-rata 7 dan standar deviasi 5, yaitu \(\mathcal{N}\) (7,5). Ukuran contoh(\(\mathcal{n}_{obs}\)) yang diuji: 10, 20, …, 100. Namun, untuk mensimulasikan pencilan, kita akan menambahkan beberapa nilai ekstrem ke dalam data (330, 500, 730).

set.seed(1401231100)

n_base <- seq(10, 100, by=10)
n_eks <- c(330,500, 730)
n_obs <- c(n_base, n_eks)

simulasi <- 1000
hasil <- data.frame()

for (n in n_obs) {
  z_values <- replicate(simulasi, {
    data <- rnorm(n, mean=7, sd=5)
    
    if (n %in% n_eks) {
      data <- c(data, n)
    }
    z <- (mean(data) - 7) / (sd(data) / sqrt(length(data)))
    return(z)
  })
  hasil <- rbind(hasil, data.frame(n=n, z_values=z_values))
}

head(hasil)
##    n   z_values
## 1 10  0.2091844
## 2 10  1.5811287
## 3 10  0.1831312
## 4 10  2.5459964
## 5 10 -1.4943058
## 6 10  0.6140819

Estimand

Untuk memeriksa apakah distribusi sampel menyerupai distribusi normal, kita akan membandingkan bentuk distribusi sampel dengan distribus teoritis. Harapannya, estimasi sampel mean mendekati rata-rata populasi, yaitu 7.

Methods

  1. Untuk setiap ukuran sampel (\(\mathcal{n}_{obs}\)), kita akan melakukan simulasi sebanyak 1000 kali untuk mendapatkan distribusi nilai \(\bar{x}_{\mathcal{n}_{obs}}\).
  2. Pada setiap simulasi, dibangkitkan data dari distribusi normal dengan rata-rata 7 dan standar deviasi 5, kemudian ditambahkan satu nilai ekstrem (pencilan) sesuai dengan ukuran sampel yang diuji.
  3. Hitung statistik baku Z untuk setiap simulasi menggunakan rumus: \[Z = \frac{\bar{x} - \mu}{\sigma / \sqrt{n}}\] di mana \(\bar{x}\) adalah rata-rata sampel, \(\mu\) adalah rata-rata populasi (7), \(\sigma\) adalah standar deviasi populasi (5), dan \(n\) adalah ukuran sampel.
  4. Setelah mendapatkan distribusi nilai \(\bar{x}_{\mathcal{n}_{obs}}\) untuk setiap ukuran sampel, kita akan memvisualisasikan distribusi tersebut menggunakan histogram dan density plot untuk melihat apakah distribusi tersebut mendekati distribusi normal baku.
ggplot(hasil, aes(x=z_values)) +
  geom_histogram(aes(y=..density..), bins=30, fill="lightblue", color="black") +
  geom_density(color="red", size=1) +
  
  stat_function(fun=dnorm, args=list(mean=7, sd=5), color="blue", size=1) +
  facet_wrap(~n, scales="free") +
  geom_vline(xintercept=0, linetype="dashed", color="black") +
  labs(title="Distribusi Z vs Sebaran Normal(7,5)",
       subtitle = "Simulasi untuk berbagai ukuran sampel dengan pencilan",
       x="Nilai Z",
       y="Kepadatan") +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.line = element_line(color = "black"))
## 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.

Hasil simulasi menunjukkan bahwa untuk ukuran sampel kecil hingga menengah (n=10 sampai 100) tanpa pencilan, distribusi statistik Z cenderung simetris di sekitar nol dan semakin mendekati bentuk distribusi normal baku seiring bertambahnya ukuran sampel. Hal ini konsisten dengan prinsip Central Limit Theorem, di mana distribusi rata-rata sampel akan mendekati normal meskipun data awal memiliki variabilitas tertentu. Selain itu, varians distribusi Z terlihat semakin kecil ketika n meningkat, yang mencerminkan meningkatnya presisi estimasi rata-rata.

Sebaliknya, pada ukuran sampel besar yang disertai pencilan (n=330,500,730), distribusi Z mengalami pergeseran ke kanan dan tidak lagi berpusat di nol. Kondisi ini menunjukkan bahwa keberadaan satu nilai ekstrem mampu memengaruhi rata-rata dan simpangan baku secara signifikan, sehingga menyebabkan penyimpangan dari asumsi distribusi normal baku. Temuan ini menegaskan bahwa statistik berbasis rata-rata tidak robust terhadap pencilan, bahkan ketika ukuran sampel besar, sehingga perlu kehati-hatian dalam interpretasi hasil analisis yang melibatkan data dengan potensi outlier.

Performance

z_test <- function(data, mu0 = 7, sigma = 5) {
  n <- length(data)
  x_bar <- mean(data)
  
  z <- (x_bar - mu0) / (sigma / sqrt(n))
  
  p_value <- 2 * (1 - pnorm(abs(z)))  # dua sisi
  
  return(list(
    z_stat = z,
    p_value = p_value
  ))
}
z_test(z_values)
## $z_stat
## [1] -38.04831
## 
## $p_value
## [1] 0

Kinerja uji Z pada simulasi ini menunjukkan kemampuan yang sangat tinggi dalam mendeteksi penyimpangan dari hipotesis nol \(H_0: \mu = 7\), yang ditunjukkan oleh nilai statistik uji sebesar \(z = -10.317\) dan \(p\)-value yang mendekati nol. Hal ini mengindikasikan bahwa probabilitas memperoleh nilai statistik se-ekstrem tersebut ketika \(H_0\) benar sangat kecil, sehingga keputusan yang diambil adalah menolak \(H_0\) secara kuat. Dengan demikian, uji Z dalam konteks ini memiliki power yang sangat tinggi untuk mendeteksi perbedaan rata-rata terhadap nilai hipotesis.

Namun demikian, performa yang terlihat sangat tinggi ini perlu ditafsirkan secara hati-hati. Nilai statistik uji yang ekstrem kemungkinan dipengaruhi oleh adanya pencilan atau penyimpangan dari asumsi dasar, seperti normalitas dan tidak adanya outlier. Kondisi ini menyebabkan uji Z menjadi sangat sensitif sehingga berpotensi menghasilkan keputusan penolakan yang berlebihan. Oleh karena itu, meskipun secara numerik uji menunjukkan performa yang baik, secara substantif hal ini juga mengindikasikan rendahnya ketahanan (robustness) terhadap pencilan.