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)
Uji hipotesis bertujuan untuk memutuskan apakah data cukup bukti untuk menolak klaim terhadap parameter populasi (misalnya mean, proporsi).
| Kenyataan H₀ | Tidak Tolak H₀ | Tolak H₀ |
|---|---|---|
| H₀ benar | Benar | Type I Error (α) |
| H₀ salah | Type II Error (β) | Benar |
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%.
Namun, hasil simulasi menunjukkan empirical type I error sebesar 4.3%, yang sedikit lebih rendah dari 5%, namun masih sangat dekat.
Ini menandakan bahwa uji-t yang digunakan cukup baik dalam mengendalikan kesalahan tipe I, artinya uji tersebut tidak terlalu sering salah menolak hipotesis nol.
Perbedaan kecil ini bisa disebabkan oleh variasi acak pada simulasi, ukuran sampel, atau asumsi distribusi data yang digunakan.
Selang kepercayaan menunjukkan seberapa sering parameter populasi jatuh dalam rentang interval jika dilakukan sampling berulang kali.
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 μ.
Namun, hasil simulasi menunjukkan coverage sebesar 93%, sedikit lebih rendah dari 95%, yang masih cukup dekat.
Ini menunjukkan bahwa metode pembentukan interval kepercayaan (dengan t-test) cukup akurat dan dapat dipercaya dalam mengestimasi parameter rata-rata populasi.
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))
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
# 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:
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).
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.