knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE)
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)

Evaluasi Pengujian Statistik Uji dan Selang Kepercayaan dengan Simulasi Statistik

1. Simulasi Statistik untuk Uji Hipotesis

a. Definisi Uji Hipotesis

Uji hipotesis bertujuan untuk memutuskan apakah data cukup bukti untuk menolak klaim terhadap parameter populasi (misalnya mean, proporsi).

b. Kerangka Dasar Pengujian

  1. Merumuskan Hipotesis
    • H₀ (hipotesis nol): tidak ada perbedaan/pengaruh.
    • H₁ (hipotesis alternatif): terdapat perbedaan/pengaruh.
    • Contoh notasi:
      • H₀: 𝜃 = 𝜃₀, H₁: 𝜃 ≠ 𝜃₀
      • H₀: 𝜃 ≥ 𝜃₀, H₁: 𝜃 < 𝜃₀
  2. Tingkat Signifikansi (𝛼)
    • Peluang menolak H₀ padahal H₀ benar (Type I error)
    • Umumnya: 0.05, 0.01, 0.10
  3. Statistik Uji dan p-value
    • Hitung statistik uji (contoh: t, F, z)
    • p-value: probabilitas mendapatkan hasil ekstrem jika H₀ benar
  4. Pengambilan Keputusan
    • Jika p-value ≤ α → Tolak H₀
    • Jika p-value > α → Gagal tolak H₀
Kenyataan H₀ Tidak Tolak H₀ Tolak H₀
H₀ benar Benar Type I Error (α)
H₀ salah Type II Error (β) Benar

2. Evaluasi Rejection Percentage (Type I Error)

Tujuan

Mengetahui berapa persen simulasi yang menolak H₀ saat H₀ benar (Type I Error).

Pada bagian ini, kita melakukan simulasi untuk mengevaluasi validitas uji statistik (uji-t) dalam kondisi ketika hipotesis nol (H₀) benar. Tujuannya adalah untuk menghitung empirical type I error, yaitu proporsi kejadian di mana H₀ ditolak padahal seharusnya tidak.

Langkah yang dilakukan: - Kita menghasilkan data acak dari distribusi normal dengan rata-rata yang sama dengan nilai yang diasumsikan H₀ (μ = 1500). - Kita melakukan uji-t terhadap setiap sampel, lalu mencatat apakah uji tersebut menolak H₀ pada tingkat signifikansi tertentu (misalnya α = 0.05).

Dengan cara ini, kita dapat melihat seberapa sering uji-t melakukan kesalahan tipe I, dan membandingkannya dengan tingkat signifikansi yang kita tetapkan. Jika hasil empiris mendekati nilai α, maka uji-t dianggap valid dalam kondisi tersebut.

set.seed(100)
n_sim <- 1000
n <- 30
mu0 <- 1500
alpha <- 0.05

p_values <- replicate(n_sim, {
  sampel <- rnorm(n, mean = mu0, sd = 200)
  t.test(sampel, mu = mu0)$p.value
})

rejection_percentage <- mean(p_values <= alpha)
cat("Empirical Type I Error:", rejection_percentage)
## Empirical Type I Error: 0.049

Interpretasi: 1. Tingkat signifikansi yang ditetapkan adalah 5% (α = 0.05), yang berarti secara teori kita mengharapkan tingkat kesalahan tipe I (menolak H₀ padahal H₀ benar) sekitar 5%.

  1. Namun, hasil simulasi menunjukkan empirical type I error sebesar 4.3%, yang sedikit lebih rendah dari 5%, namun masih sangat dekat.

  2. Ini menandakan bahwa uji-t yang digunakan cukup baik dalam mengendalikan kesalahan tipe I, artinya uji tersebut tidak terlalu sering salah menolak hipotesis nol.

  3. Perbedaan kecil ini bisa disebabkan oleh variasi acak pada simulasi, ukuran sampel, atau asumsi distribusi data yang digunakan.


3. Evaluasi Selang Kepercayaan (Confidence Interval)

a. Konsep

Selang kepercayaan menunjukkan seberapa sering parameter populasi jatuh dalam rentang interval jika dilakukan sampling berulang kali.

b. Evaluasi Coverage

Coverage menunjukkan proporsi selang kepercayaan dari banyak simulasi yang benar-benar mengandung parameter populasi sebenarnya.

Untuk mengevaluasi kinerja selang kepercayaan (confidence interval), kita melakukan simulasi statistik dengan membangkitkan data acak dari populasi normal yang memiliki parameter diketahui, yaitu rata-rata (μ) sebesar 1700 dan simpangan baku 200.

Dalam setiap simulasi, kita mengambil sampel berukuran 30, kemudian membentuk selang kepercayaan 95% terhadap rata-rata populasi menggunakan uji-t.

Hipotesis nol (H₀) dalam konteks ini menyatakan bahwa rata-rata populasi adalah μ = 1700, dan seluruh simulasi dilakukan dengan asumsi bahwa H₀ benar.

Tujuan dari simulasi ini adalah untuk menghitung coverage probability, yaitu proporsi dari seluruh selang kepercayaan yang berhasil mencakup nilai parameter sebenarnya (μ = 1700).

Hasil ini akan memberikan gambaran seberapa andal metode selang kepercayaan tersebut dalam menangkap nilai parameter populasi, serta apakah coverage-nya sesuai dengan tingkat kepercayaan teoritis (95%).

set.seed(123)
n_sim <- 100
n <- 30
mu <- 1700
sd_pop <- 200
conf_level <- 0.95

# Simulasi interval kepercayaan
cis <- replicate(n_sim, {
  sampel <- rnorm(n, mean = mu, sd = sd_pop)
  t.test(sampel, conf.level = conf_level)$conf.int
})

lower_bounds <- cis[1, ]
upper_bounds <- cis[2, ]

# Cek coverage
coverage <- (lower_bounds <= mu) & (mu <= upper_bounds)
coverage_prob <- mean(coverage)
cat("Coverage:", coverage_prob, "\n")
## Coverage: 0.96

Interpretasi: 1. Tingkat kepercayaan yang kamu tetapkan adalah 95% (conf_level = 0.95), yang berarti secara teori, kita mengharapkan sekitar 95% interval kepercayaan yang dibentuk dari sampel acak akan mencakup nilai sebenarnya μ.

  1. Namun, hasil simulasi menunjukkan coverage sebesar 93%, sedikit lebih rendah dari 95%, yang masih cukup dekat.

  2. Ini menunjukkan bahwa metode pembentukan interval kepercayaan (dengan t-test) cukup akurat dan dapat dipercaya dalam mengestimasi parameter rata-rata populasi.

  3. Perbedaan kecil ini bisa disebabkan oleh variasi sampling acak dan ukuran sampel yang relatif kecil (n=30).

# Plot garis interval kepercayaan tiap simulasi
plot(c(1, n_sim), range(c(lower_bounds, upper_bounds)), type = "n",
     xlab = "Simulasi ke-", ylab = "Interval Kepercayaan",
     main = paste("Confidence Intervals dari", n_sim, "Simulasi"))

# Tambahkan garis interval kepercayaan tiap simulasi
for(i in 1:n_sim) {
  color <- ifelse(coverage[i], "blue", "red")  # warna biru jika CI menutupi mu, merah jika tidak
  segments(i, lower_bounds[i], i, upper_bounds[i], col = color)
}

# Garis horizontal nilai mu
abline(h = mu, col = "darkgreen", lwd = 2, lty = 2)

legend("topright", legend = c("CI Menutupi μ", "CI Tidak Menutupi μ", "Nilai μ"),
       col = c("blue", "red", "darkgreen"), lty = c(1,1,2), lwd = c(1,1,2))


4. Perbandingan t-test dan Wilcoxon signed-rank test

a. Problem Statement

Bandingkan uji-t dan Wilcoxon untuk pengujian: - Populasi: N(1700,200) - H₀: μ = 1500 vs H₁: μ ≠ 1500 - Ukuran sampel: 5, 10, 20, 30, 60, 100

set.seed(1000)

# Parameter populasi
mu0 <- 1500        # mean di bawah H0 dan juga digunakan untuk generate data
sigma <- 200
alpha <- 0.05
n_sim <- 1000      # jumlah simulasi

# Ukuran sampel yang akan diuji
n_obs <- c(5, 10, 20, 30, 60, 100)

# Fungsi untuk menghitung Type I Error empiris
simulasi_type1 <- function(n) {
  t_pvalues <- numeric(n_sim)
  w_pvalues <- numeric(n_sim)
  
  for (i in 1:n_sim) {
    sampel <- rnorm(n, mean = mu0, sd = sigma)
    
    # Uji t
    t_pvalues[i] <- t.test(sampel, mu = mu0)$p.value
    
    # Uji Wilcoxon, hanya jika data tidak identik
    if (length(unique(sampel)) > 1) {
      w_pvalues[i] <- wilcox.test(sampel, mu = mu0)$p.value
    } else {
      w_pvalues[i] <- 1  # tidak ditolak
    }
  }
  
  # Hitung proporsi penolakan H0 (Type I Error)
  data.frame(
    n = n,
    t_test = mean(t_pvalues < alpha),
    wilcox_test = mean(w_pvalues < alpha)
  )
}

# Jalankan simulasi untuk semua n
library(dplyr)
hasil <- lapply(n_obs, simulasi_type1) %>% bind_rows()

print(hasil)
##     n t_test wilcox_test
## 1   5  0.051       0.000
## 2  10  0.048       0.040
## 3  20  0.054       0.047
## 4  30  0.065       0.055
## 5  60  0.048       0.051
## 6 100  0.044       0.037

5. Visualisasi Hasil Simulasi (Opsional)

# Visualisasi
hasil_long <- hasil %>%
  pivot_longer(cols = c("t_test", "wilcox_test"), names_to = "test_name", values_to = "Rejection_Percentage")

ggplot(hasil_long, aes(x = n, y = Rejection_Percentage, color = test_name)) +
  geom_point() +
  geom_hline(yintercept = alpha, linetype = "solid") +
  ylim(0, 0.1) +
  labs(title = "Empirical Type I Error vs Sample Size",
       x = "Sample Size (n)",
       y = "Rejection Percentage (Type I Error)") +
  theme_minimal()

Interpretasi: Berdasarkan hasil simulasi yang dilakukan dengan menghasilkan data dari populasi normal dengan rata-rata yang sama dengan nilai hipotesis nol (μ = 1500), diperoleh bahwa:

  1. Uji-t menunjukkan tingkat penolakan hipotesis nol (Type I Error) yang konsisten dan mendekati nilai signifikansi teoritis sebesar α = 0.05 untuk berbagai ukuran sampel (n).

  2. Uji Wilcoxon cenderung menghasilkan Type I Error yang lebih rendah dari α, terutama pada ukuran sampel kecil (misalnya n = 5), bahkan mendekati 0.

Dengan demikian, dalam konteks data yang memang berdistribusi normal, uji-t lebih unggul karena menghasilkan empirical Type I Error yang lebih valid dan sesuai dengan nilai signifikansi yang ditetapkan, menjadikannya pilihan yang lebih tepat dalam kondisi ini.