Puji syukur ke hadirat Tuhan Yang Maha Esa, karena atas rahmat dan karunia-Nya, eBook ini dapat disusun dan diselesaikan dengan baik. Buku ini dibuat sebagai panduan belajar dan referensi dalam memahami konsep, metode, serta penerapan analisis data kategori yang banyak digunakan dalam penelitian di berbagai bidang, terutama ilmu sosial, kesehatan, dan statistika terapan.

Analisis data kategori merupakan salah satu cabang penting dalam statistika yang berfokus pada data dalam bentuk kategori atau klasifikasi. Materi dalam eBook ini mencakup dasar-dasar teori, pendekatan-pendekatan pengujian hipotesis, hingga penerapan praktis menggunakan perangkat lunak statistik seperti R. Disertai dengan contoh-contoh nyata dan interpretasi hasil, diharapkan pembaca dapat memahami serta menerapkan metode yang sesuai dalam analisis data kategori.

Saya menyadari bahwa eBook ini masih jauh dari sempurna. Oleh karena itu, saran dan kritik yang membangun sangat saya harapkan untuk perbaikan di edisi berikutnya.

Akhir kata, saya mengucapkan terima kasih kepada semua pihak yang telah membantu dalam penyusunan buku ini, baik secara langsung maupun tidak langsung. Semoga eBook ini dapat memberikan manfaat bagi para pembaca, khususnya mahasiswa, dosen, peneliti, dan praktisi yang berkecimpung di dunia statistik dan penelitian kuantitatif.

Jatinangor, 12 Juni 2025

Dinar Olivia Rahmadyta

1 PENDAHULUAN

Data kategori adalah data yang dapat dikelompokkan berdasarkan karakteristik atau ciri-ciri tertentu. Data ini biasanya terdiri dari skala nominal dan ordinal dan merupakan data kualitatif. Data kategorikal biasanya disebut data non-metrik atau tidak mengukur data.

Analisis data kategorik adalah pengumpulan data, pemodelan data, dan analisis data. Konsep analisis ini mengekstraksi data dan memberikan keuntungan. Dalam analisis ini, dapat dikatakan bahwa proses pembuangan data sampah yang mendapatkan data yang berguna. Data tersebut nantinya dapat memberikan manfaat dalam mengambil kesimpulan atau pun keputusan yang cerdas.

1.1 Tujuan Analisis Data Kategori

Dari pengertian analisis data kategorik di atas, tentunya analisis ini dilakukan untuk tujuan mengelompokkan data berdasarkan kategori tertentu. Selain itu, analisis data kategorik digunakan untuk memahami pola tertentu, korelasi (hubungan) dan perbedaan dari kelompok-kelompok atau pun kategori tertentu. Dengan memahami hal tersebut maka dapat lebih mudah dalam mengambil sebuah keputusan cerdas.

1.2 Jenis-jenis Data Kategori

Ada dua jenis data kategorik utama yang sering digunakan. Beberapa macam-macam data kategorik adalah:

1.2.1 Nominal

Data yang tidak memiliki urutan atau peringkat. Contohnya termasuk jenis kelamin (pria, wanita), warna mobil (merah, hijau, biru), atau nama negara.

1.2.2 Ordinal

Data yang memiliki urutan atau tingkatan tapi tidak memiliki jarak yang tetap antar kategori. Contohnya termasuk tingkat pendidikan (SD, SMP, SMA, S1), atau tingkat kepuasan (tidak puas, cukup puas, sangat puas).

2 JENIS-JENIS ANALISIS DATA KATEGORIK

Beberapa jenis uji statistik yang digunakan untuk menganalisis data kategorik diantaranya:

2.1 Uji Chi-Square

Uji Chi-Square digunakan untuk menguji hubungan antara dua variabel kategorik. Metode ini mengukur sejauh mana perbedaan antara frekuensi yang diamati dengan frekuensi yang diharapkan jika tidak ada hubungan antara variabel-variabel tersebut.

Hasil uji Chi-Square menghasilkan nilai statistik dan nilai p-value. Jika nilai p-value cukup kecil (biasanya di bawah tingkat signifikansi yang ditentukan sebelumnya, misalnya 0.05), maka kita dapat menyimpulkan bahwa terdapat hubungan yang signifikan antara variabel-variabel tersebut.

Hipotesis

  • H0: Tidak ada hubungan antara variabel (independen)

  • H1: Ada hubungan antara variabel (dependen)

\[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \] - \(O_{ij}\): frekuensi observasi

  • \(E_{ij}\): frekuensi harapan = \(\frac{\text{baris total} \times \text{kolom total}}{\text{total keseluruhan}}\)

Kriteria Uji

Bandingkan nilai \(\chi^2\) hitung dengan nilai kritis dari tabel distribusi chi-square dengan derajat bebas: \[ df = (r - 1)(c - 1) \] Jika \(\chi^2_{hitung} > \chi^2_{tabel}\), maka tolak \(H_0\).

2.2 Analisis Frekuensi

Analisis frekuensi melibatkan penghitungan frekuensi kemunculan masing-masing kategori dalam data yang diamati. Frekuensi ini sering direpresentasikan dalam bentuk tabel atau diagram batang.

Analisis frekuensi memungkinkan kita untuk melihat distribusi data secara visual dan mengidentifikasi pola atau trend dalam data kategorik.

Hipotesis

Tidak diperlukan hipotesis formal; digunakan untuk eksplorasi deskriptif.

Statistik yang Dilaporkan

  • Frekuensi absolut

  • Frekuensi relatif (%)

  • Grafik: bar chart atau pie chart

data <- c("A", "A", "B", "C", "A", "B", "C", "C", "C")
table(data)
## data
## A B C 
## 3 2 4
prop.table(table(data)) * 100
## data
##        A        B        C 
## 33.33333 22.22222 44.44444

2.3 Analisis Kontingensi

Analisis kontingensi digunakan untuk menganalisis hubungan antara dua atau lebih variabel kategorik dengan menggunakan tabel kontingensi. Tabel kontingensi adalah tabel silang yang menunjukkan frekuensi kemunculan kombinasi kategori yang berbeda dalam data.

Metode yang umum digunakan dalam analisis kontingensi adalah uji Chi-Square yang telah disebutkan sebelumnya.

Analisis kontingensi memungkinkan kita untuk melihat hubungan antara variabel-variabel kategorik dan mengidentifikasi asosiasi atau ketergantungan antara variabel-variabel tersebut.

Hipotesis

H0: Tidak ada asosiasi antara dua variabel

H1: Ada asosiasi

Statistik yang Umum Digunakan :

Chi-Square (lihat atas)

Fisher’s Exact Test (untuk tabel kecil)

Korelasi Cramér’s V (ukuran asosiasi)

\[ V = \sqrt{\frac{\chi^2}{n \cdot \min(r - 1, c - 1)}} \] - \(\chi^2\): nilai chi-square dari tabel kontingensi
- \(n\): jumlah total observasi
- \(r\), \(c\): jumlah baris dan kolom

Interpretasi Nilai V (rule of thumb) - 0 – 0.1 : sangat lemah
- 0.1 – 0.3 : lemah
- 0.3 – 0.5 : sedang
- > 0.5 : kuat

2.4 Analisis Multivariat

Analisis multivariat melibatkan penggunaan teknik statistik yang lebih kompleks untuk menganalisis hubungan antara tiga atau lebih variabel kategorik.

2.4.1 Regresi Logistik

Tujuan

Memprediksi variabel kategorik (biasanya biner) dari satu atau lebih prediktor.

Hipotesis

H0: Koefisien regresi = 0 (tidak berpengaruh)

H1: Koefisien ≠ 0 (berpengaruh)

\[ \log\left(\frac{p}{1 - p}\right) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k \]

atau dapat ditulis sebagai:

\[ p = \frac{1}{1 + e^{-(\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k)}} \] - \(p\): probabilitas terjadinya peristiwa (Y = 1) - \(\beta_0\): intercept - \(\beta_1, \beta_2, \dots, \beta_k\): koefisien regresi - \(X_1, X_2, \dots, X_k\): variabel prediktor

2.4.2 Correspondence Analysis

Tujuan

Visualisasi hubungan antar kategori dari dua variabel atau lebih.

Hipotesis

Tidak formal; fokus pada eksplorasi visual

Statistik

Inertia (sejenis varians)

Chi-Square Distance

2.4.3 Latent Class Analysis (LCA)

Tujuan

Mengelompokkan observasi berdasarkan pola respons kategorik.

Hipotesis

H0: Jumlah kelas yang ditentukan cukup

H1: Tambahan kelas meningkatkan model

Statistik

AIC / BIC untuk pemilihan jumlah kelas

Probabilitas keanggotaan kelas

3 DISTRIBUSI PROBABILITAS ANALISIS DATA KATEGORIK

3.1 Distribusi Bernoulli

Distribusi Bernoulli menggambarkan hasil dari satu percobaan dengan dua kemungkinan: sukses (1) atau gagal (0). Dengan rumus Umum

\[ P(X = x) = p^x (1 - p)^{1 - x}, \quad \text{dengan } x \in \{0, 1\} \]

  • \(p\): probabilitas sukses
  • \(1 - p\): probabilitas gagal
  • \(X\): variabel acak hasil percobaan

Contoh Soal :

Sebuah perusahaan elektronik memproduksi baterai isi ulang. Dari data historis, diketahui bahwa 30% baterai gagal berfungsi (gagal mengisi daya secara optimal). Seorang teknisi ingin mengetahui probabilitas bahwa sebuah baterai acak dari lini produksi akan berfungsi dengan normal (sukses).

Berapakah peluang bahwa satu unit baterai berfungsi normal?

# Peluang gagal 30% → maka peluang sukses (berfungsi normal) adalah 70%
p <- 0.7      # probabilitas sukses (produk berfungsi normal)
x <- 1        # x = 1 berarti kondisi sukses (berfungsi)
prob_berfungsi <- p^x * (1 - p)^(1 - x)  # rumus distribusi Bernoulli
paste("Probabilitas produk berfungsi:", prob_berfungsi)
## [1] "Probabilitas produk berfungsi: 0.7"

Interpretasi

Peluang bahwa satu produk acak berfungsi normal (tidak gagal) adalah 70%. Ini adalah kasus distribusi Bernoulli, di mana hanya ada dua kemungkinan: sukses (fungsi) atau gagal.

3.2 Distribusi Binomial

Distribusi Binomial merupakan hasil dari \(n\) percobaan Bernoulli yang independen, masing-masing dengan probabilitas sukses \(p\).Dengan rumus umum: \[ P(X = k) = \binom{n}{k} p^k (1 - p)^{n - k} \]

  • \(n\): jumlah percobaan
  • \(k\): jumlah sukses
  • \(p\): probabilitas sukses dalam satu percobaan
  • \(\binom{n}{k}\): kombinasi \(n\) ambil \(k\)

Contoh Soal

Sebuah perusahaan teknologi sedang menguji perangkat lunak deteksi malware. Berdasarkan hasil uji coba sebelumnya, software ini berhasil mendeteksi malware dalam 60% kasus. Seorang peneliti keamanan siber ingin mengetahui probabilitas bahwa software akan berhasil mendeteksi malware tepat dalam 6 dari 10 percobaan.

Jika software diuji pada 10 file yang mengandung malware, berapa peluang bahwa tepat 6 dari 10 file tersebut berhasil terdeteksi?

# Parameter binomial
n <- 10      # jumlah percobaan
p <- 0.6     # peluang sukses pada tiap percobaan
k <- 6       # jumlah sukses yang diinginkan

# Hitung probabilitas tepat 6 sukses dari 10
prob_binomial <- dbinom(k, size = n, prob = p)

# Tampilkan hasil
paste("Probabilitas tepat 6 sukses dari 10:", prob_binomial)
## [1] "Probabilitas tepat 6 sukses dari 10: 0.250822656"

Interpretasi

Peluang bahwa tepat 6 dari 10 percobaan berhasil (sukses), jika peluang sukses tiap kali adalah 60%, adalah sekitar 25.08%. Ini adalah distribusi Binomial, karena jumlah percobaan tetap (n = 10) dan tiap percobaan independen.

3.3 Distribusi Multinomial

Distribusi Multinomial adalah generalisasi dari distribusi Binomial untuk lebih dari dua kategori.Dengan rumus Umum

\[ P(X_1 = x_1, \dots, X_k = x_k) = \frac{n!}{x_1! x_2! \cdots x_k!} p_1^{x_1} p_2^{x_2} \cdots p_k^{x_k} \]

  • \(n\): total jumlah percobaan
  • \(x_i\): jumlah kemunculan kategori ke-\(i\)
  • \(p_i\): probabilitas kategori ke-\(i\)
  • \(\sum x_i = n\), \(\sum p_i = 1\)

Contoh Soal

Sebuah perusahaan ingin mengetahui preferensi masyarakat terhadap tiga merek minuman populer: Aqua (A), Birama (B), dan Citrus (C). Survei dilakukan terhadap 10 responden, dan setiap orang hanya boleh memilih satu merek yang paling mereka sukai.

Dari data riset pasar sebelumnya, diperkirakan:

  • Peluang seseorang memilih merek A adalah 0.4

  • Peluang memilih merek B adalah 0.3

  • Peluang memilih merek C adalah 0.3

Berapakah peluang bahwa tepat 4 orang memilih A, 3 orang memilih B, dan 3 orang memilih C?

# Jumlah orang yang memilih tiap merek
x <- c(4, 3, 3)   # 4 untuk A, 3 untuk B, 3 untuk C

# Peluang memilih masing-masing merek
p <- c(0.4, 0.3, 0.3)

# Hitung probabilitas kombinasi tersebut
prob_multinom <- dmultinom(x, prob = p)

# Tampilkan hasil
paste("Probabilitas kombinasi (4,3,3):", prob_multinom)
## [1] "Probabilitas kombinasi (4,3,3): 0.0783820800000002"

Interpretasi

Peluang bahwa 4 orang memilih merek A, 3 memilih B, dan 3 memilih C dari 10 responden, dengan probabilitas masing-masing merek adalah (0.4, 0.3, 0.3), adalah sekitar 22.74%. Ini menggunakan distribusi Multinomial, cocok untuk data kategori dengan >2 hasil.

3.4 Distribusi Poisson

Distribusi Poisson menggambarkan jumlah kejadian dalam suatu interval waktu atau ruang, dengan asumsi kejadian terjadi secara acak dan independen.Dengan rumus Umum

\[ P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!} \]

  • \(\lambda\): rata-rata kejadian dalam interval
  • \(k\): jumlah kejadian
  • \(e\): bilangan Euler (≈ 2.718)

Contoh Soal

Sebuah kedai kopi di pusat kota mencatat bahwa rata-rata terdapat 5 pelanggan yang datang setiap jam. Pemilik kedai ingin mengetahui kemungkinan bahwa tepat 3 pelanggan datang dalam satu jam tertentu, misalnya pada jam 3–4 sore.

Distribusi kedatangan pelanggan diasumsikan mengikuti distribusi Poisson, karena:

  • Kejadian bersifat acak dan independen,

  • Dihitung dalam satuan waktu (per jam),

  • Peluang kedatangan dalam interval kecil sangat kecil (rare events),

  • Tidak terjadi kedatangan bersamaan (tepat satu per waktu).

Berapakah probabilitas bahwa tepat 3 pelanggan datang dalam satu jam, jika rata-rata kedatangan adalah 5 pelanggan per jam?

lambda <- 5  # rata-rata kedatangan per jam
k <- 3       # jumlah pelanggan yang diharapkan

# Hitung probabilitas menggunakan distribusi Poisson
prob_poisson <- dpois(k, lambda = lambda)

# Tampilkan hasil
paste("Probabilitas tepat 3 pelanggan:", prob_poisson)
## [1] "Probabilitas tepat 3 pelanggan: 0.140373895814281"

Interpretasi

Peluang bahwa tepat 3 pelanggan datang dalam satu jam jika rata-rata kedatangan adalah 5 per jam adalah sekitar 14.04%. Distribusi Poisson cocok digunakan di sini karena kita mengukur jumlah kejadian dalam satu interval waktu tetap.

4 DESAIN SAMPLING DALAM ANALISIS DATA KATEGORI

Dalam analisis data kategorik, penting untuk memahami bagaimana data dikumpulkan karena desain sampling sangat mempengaruhi jenis statistik yang dapat digunakan serta bagaimana hasilnya diinterpretasikan. Salah satu aspek penting adalah membedakan antara data yang dikumpulkan secara prospektif (maju ke depan dalam waktu) dan retrospektif (kembali ke masa lalu), serta bentuk studi seperti eksperimen, studi kohort, dan studi kasus-kontrol.

4.1 Prospective Sampling

Desain prospektif mengamati subjek mulai dari paparan dan mengikuti ke depan waktu untuk melihat outcome. Cocok untuk studi yang ingin melihat hubungan kausal dan estimasi kejadian baru (insiden).

4.1.1 Eksperimen (Randomized Controlled Trial/RCT)

  • Subjek dibagi secara acak ke dalam kelompok perlakuan dan kontrol.
  • Peneliti mengatur paparan (misalnya pemberian obat).
  • Outcome diamati ke depan waktu.
  • Inferensi kausal sangat kuat.

Teknik Sampling yang umum digunakan adalah: Simple Random Sampling - Setiap individu dalam populasi memiliki peluang yang sama untuk dipilih. - Cocok untuk eksperimen kecil dengan populasi yang homogen.

Stratified Random Sampling - Populasi dibagi menjadi strata (misalnya usia, jenis kelamin), lalu dilakukan pengambilan acak dalam tiap strata. - Menjamin representasi proporsional.

Cluster Sampling (lebih jarang digunakan) - Populasi dibagi ke dalam kelompok (cluster), lalu cluster dipilih secara acak. - Cocok untuk populasi yang tersebar geografis.

Block Randomization - Digunakan untuk menjaga keseimbangan jumlah subjek pada setiap kelompok perlakuan dalam percobaan. - Subjek diacak dalam blok kecil.

Catatan Penting: Dalam eksperimen, yang paling penting bukan hanya sampling, tapi juga random assignment (pengacakan ke perlakuan), untuk menghindari bias.

4.1.2 Studi Kohort Prospektif

  • Subjek dikelompokkan berdasarkan status paparan (misalnya perokok vs bukan).
  • Outcome diamati di masa depan.
  • Tidak ada intervensi, hanya observasi.

Teknik Sampling yang umum digunakan adalah: Simple Random Sampling dari populasi berdasarkan status paparan.

Stratified Sampling berdasarkan variabel seperti usia, jenis kelamin.

Systematic Sampling jika data daftar populasi tersedia.

Multistage Sampling (penggabungan cluster + stratified), untuk populasi besar dan menyebar.

4.2 Retrospective Sampling

Pada desain retrospektif, outcome telah terjadi dan peneliti melihat kembali ke masa lalu untuk mencari paparan. Efisien dalam biaya dan waktu, tetapi inferensi kausal lebih lemah.

4.2.1 Studi Kasus-Kontrol

  • Subjek dipilih berdasarkan outcome (kasus: memiliki penyakit, kontrol: tidak).
  • Riwayat paparan ditelusuri dari masa lalu.
  • Tidak dapat menghitung RR, hanya Odds Ratio (OR).

Teknik Sampling yang umum digunakan adalah: Purposive Sampling (bertujuan)
Memilih kasus dan kontrol berdasarkan kriteria tertentu.

Matching Sampling
Kasus dan kontrol dipasangkan berdasarkan variabel pengganggu seperti usia, jenis kelamin (matching 1:1 atau 1:n).

Stratified Sampling
Jika populasi kontrol besar, digunakan untuk menjamin proporsionalitas.

4.2.2 Studi Kohort Retrospektif

  • Subjek dipilih berdasarkan status paparan dari data masa lalu.
  • Outcome dilihat pada catatan selanjutnya.
  • Sama seperti kohort, tapi dengan data historis.

Teknik Sampling yang umum digunakan adalah: - Systematic Sampling dari catatan historis berdasarkan status paparan.
- Stratified Sampling jika data arsip lengkap dan heterogen.
- Convenience Sampling (tidak disarankan untuk inferensi statistik).

4.3 Tabel Perbandingan Desain Sampling

## Warning: package 'knitr' was built under R version 4.3.3
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
Perbandingan Desain Sampling dalam Analisis Data Kategorik
Aspek Eksperimen Kohort Prospektif Kasus-Kontrol Kohort Retrospektif
Tujuan Utama Menguji efek intervensi Mengamati efek paparan Mencari faktor risiko Mengamati efek paparan (historis)
Arah Waktu Prospektif Prospektif Retrospektif Retrospektif
Dasar Pemilihan Subjek Randomisasi ke perlakuan Berdasarkan status paparan Berdasarkan status outcome (kasus vs kontrol) Berdasarkan status paparan dari data arsip
Contoh Sampling yang Umum Simple, Stratified, Block Simple, Stratified, Systematic Purposive, Matching Systematic, Stratified
Kemampuan Estimasi Insidensi Ya Ya Tidak Ya (dari arsip)
Kemampuan Estimasi Risiko Relatif Ya Ya Tidak langsung Ya
Kemampuan Estimasi Odds Ratio Ya Ya Ya Ya
Kelebihan Kontrol kuat terhadap variabel luar Data real-world, urutan waktu jelas Cepat, hemat biaya Lebih cepat dari prospektif, biaya lebih rendah
Keterbatasan Mahal, etika, tidak selalu praktis Waktu lama, mahal Rentan bias, tidak estimasi insidensi Kualitas data historis bisa bervariasi

5 TABEL KONTINGENSI 2X2

Tabel kontingensi 2x2 merupakan suatu metode statistik yang menggambarkan dua variabel secara simultan dan hasilnya ditampilkan dalam bentuk tabel yang merefleksikan distribusi bersama dua variabel dengan jumlah kategori yang terbatas. Tabel kontingensi sering disebut juga dengan cross tabulation yang digunakan untuk mengetahui hubungan antara dua variabel penelitian yang bukan hubungan sebab akibat

Misalkan terdapat 2 variabel, yaitu Variabel A dan B. Tabel kontingensi dua dimensi dapat disajikan dalam bentuk tabel 2 x 2 dengan:

Terdapat 2 x 2 sel dalam tabel yang berisi frekuensi pengamatan yang terjadi dari kombinasi variabel A dan B.

tabel <- data.frame(
  "Variabel A \\ Variabel B" = c("1", "2", "Total"),
  "1" = c("a", "c", "a + c"),
  "2" = c("b", "d", "b + d"),
  "Total" = c("a + b", "c + d", "n")
)
knitr::kable(tabel, caption = "Tabel Kontingensi 2x2")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
Tabel Kontingensi 2x2
Variabel.A…Variabel.B X1 X2 Total
1 a b a + b
2 c d c + d
Total a + c b + d n

Keterangan Kolom dan Baris:

Variabel A dan Variabel B: Dua variabel kategorik yang ingin dianalisis. Contoh:

A = status merokok (1 = merokok, 2 = tidak merokok)

B = status penyakit (1 = sakit, 2 = sehat)

a: Jumlah individu yang termasuk kategori A = 1 dan B = 1

b: Jumlah individu yang termasuk A = 1 dan B = 2

c: Jumlah individu yang termasuk A = 2 dan B = 1

d: Jumlah individu yang termasuk A = 2 dan B = 2

a + b: Jumlah total untuk kategori A = 1

c + d: Jumlah total untuk kategori A = 2

a + c: Jumlah total untuk kategori B = 1

b + d: Jumlah total untuk kategori B = 2

n: Jumlah seluruh pengamatan, yaitu total keseluruhan (a + b + c + d)

5.1 Distribusi Peluang dalam Tabel Kontingensi 2x2

5.1.1 Peluang Bersama

Peluang bersama adalah peluang terjadinya dua kejadian secara bersamaan. Dalam tabel kontingensi 2x2, ini berarti peluang untuk suatu kombinasi nilai dari dua variabel kategorik.

5.1.2 Peluang Marginal

Peluang marginal adalah peluang terjadinya satu kejadian tanpa mempertimbangkan kejadian lainnya. Ini diperoleh dari total baris atau kolom, dibagi dengan total keseluruhan.

5.1.3 Peluang Bersyarat

Peluang bersyarat adalah peluang terjadinya suatu kejadian dengan asumsi kejadian lain telah terjadi. Dalam tabel 2x2, ini dilihat sebagai baris (A) terhadap kolom (B), atau sebaliknya.

Untuk variabel A:

\[ P(A=1) = \frac{a + b}{n} \]

\[ P(A=2) = \frac{c + d}{n} \]

Untuk variabel B:

\[ P(B=1) = \frac{a + c}{n} \]

\[ P(B=2) = \frac{b + d}{n} \]

Peluang B terjadi jika diketahui A:

\[ P(B=1 \mid A=1) = \frac{a}{a + b} \]

\[ P(B=2 \mid A=1) = \frac{b}{a + b} \]

\[ P(B=1 \mid A=2) = \frac{c}{c + d} \]

\[ P(B=2 \mid A=2) = \frac{d}{c + d} \]

Peluang A terjadi jika diketahui B:

\[ P(A=1 \mid B=1) = \frac{a}{a + c} \]

\[ P(A=2 \mid B=1) = \frac{c}{a + c} \]

\[ P(A=1 \mid B=2) = \frac{b}{b + d} \]

\[ P(A=2 \mid B=2) = \frac{d}{b + d} \]

Contoh Perhitungan manual

Misalkan sebuah perusahaan melakukan survei terhadap 200 pelanggan mengenai preferensi mereka terhadap dua merek produk A dan B berdasarkan jenis kelamin mereka.

Prefer A Prefer B Total
Laki-laki 50 30 80
Perempuan 70 50 120
Total 120 80 200

Langkah 1: Hitung Peluang Bersama

Misalkan peluang bersama untuk masing-masing kategori:

total_responden <- 200
table_contingency <- matrix(c(50, 30, 70, 50), nrow = 2, byrow = TRUE)
colnames(table_contingency) <- c("Prefer A", "Prefer B")
rownames(table_contingency) <- c("Laki-laki", "Perempuan")
table_contingency
##           Prefer A Prefer B
## Laki-laki       50       30
## Perempuan       70       50
# Menghitung peluang bersama
p_joint <- table_contingency / total_responden
p_joint
##           Prefer A Prefer B
## Laki-laki     0.25     0.15
## Perempuan     0.35     0.25

Perhitungan manual: \[ P(Laki-laki \cap Prefer A) = \frac{50}{200} = 0.25 \] \[ P(Laki-laki \cap Prefer B) = \frac{30}{200} = 0.15 \] \[ P(Perempuan \cap Prefer A) = \frac{70}{200} = 0.35 \] \[ P(Perempuan \cap Prefer B) = \frac{50}{200} = 0.25 \]

Langkah 2: Hitung Peluang Marginal

# Menghitung peluang marginal
p_marginal_A <- rowSums(table_contingency) / total_responden
p_marginal_B <- colSums(table_contingency) / total_responden

p_marginal_A # Peluang berdasarkan jenis kelamin
## Laki-laki Perempuan 
##       0.4       0.6
p_marginal_B # Peluang berdasarkan preferensi produk
## Prefer A Prefer B 
##      0.6      0.4

Perhitungan manual: \[ P(Laki-laki) = \frac{80}{200} = 0.4 \] \[ P(Perempuan) = \frac{120}{200} = 0.6 \] \[ P(Prefer A) = \frac{120}{200} = 0.6 \] \[ P(Prefer B) = \frac{80}{200} = 0.4 \]

Langkah 3: Hitung Peluang Bersyarat

Contoh perhitungan peluang seorang pelanggan laki-laki lebih memilih produk A:

# Menghitung peluang bersyarat
p_A_given_B <- p_joint / p_marginal_B
p_A_given_B
##            Prefer A Prefer B
## Laki-laki 0.4166667    0.250
## Perempuan 0.8750000    0.625

Perhitungan manual: \[ P(Laki-laki | Prefer A) = \frac{P(Laki-laki \cap Prefer A)}{P(Prefer A)} = \frac{0.25}{0.6} = 0.4167 \] \[ P(Laki-laki | Prefer B) = \frac{P(Laki-laki \cap Prefer B)}{P(Prefer B)} = \frac{0.15}{0.4} = 0.375 \] \[ P(Perempuan | Prefer A) = \frac{P(Perempuan \cap Prefer A)}{P(Prefer A)} = \frac{0.35}{0.6} = 0.5833 \] \[ P(Perempuan | Prefer B) = \frac{P(Perempuan \cap Prefer B)}{P(Prefer B)} = \frac{0.25}{0.4} = 0.625 \]

5.2 Ukuran Asosiasi dalam Data Kategori 2X2

Ukuran asosiasi dalam tabel kontingensi 2x2 digunakan untuk mengukur hubungan atau perbedaan proporsi antara dua variabel kategorik. Biasanya digunakan untuk membandingkan risiko, peluang (odds), dan kekuatan asosiasi antar dua kelompok (misal: terpapar vs tidak terpapar).

Bidang Contoh Penggunaan
Kesehatan Merokok vs Risiko Kanker Paru-paru
Sosial Pendidikan vs Partisipasi dalam Pemilu
Psikologi Terapi vs Perubahan Status Mental
Epidemiologi Vaksinasi vs Infeksi COVID-19

Struktur Tabel Kontingensi 2x2

\[ \begin{array}{|c|c|c|c|} \hline & Y = 1 & Y = 0 & \text{Total} \\ \hline X = 1 & a & b & a + b \\ X = 0 & c & d & c + d \\ \hline \text{Total} & a + c & b + d & n \\ \hline \end{array} \]

5.2.1 Risk Difference (RD)

Pengertian: Risk Difference adalah selisih antara proporsi kejadian pada dua kelompok. Ini menunjukkan seberapa besar perbedaan risiko kejadian antar dua kelompok (misalnya, kelompok terpapar vs tidak terpapar). Rumus: \[ RD = \frac{a}{a + b} - \frac{c}{c + d} \]

Interpretasi:

  • Jika \(RD > 0\): risiko kejadian lebih tinggi di Grup 1.

  • Jika \(RD < 0\): risiko kejadian lebih rendah di Grup 1.

  • Jika \(RD = 0\): tidak ada perbedaan risiko antar grup.

5.2.2 Relative Risk (RR)

Pengertian: Relative Risk membandingkan risiko kejadian pada grup terpapar dengan risiko pada grup tidak terpapar. Cocok digunakan dalam studi prospektif (cohort, eksperimen).

Rumus: \[ RR = \frac{a / (a + b)}{c / (c + d)} \]

Interpretasi:

  • Jika \(RR = 1\): risiko sama antar grup.

  • Jika \(RR > 1\): risiko lebih tinggi di grup 1.

  • Jika \(RR < 1\): risiko lebih rendah di grup 1.

5.2.3 Odds dan Odds Ratio (OR)

Pengertian: Odds adalah rasio antara kemungkinan kejadian dan tidak kejadian dalam satu kelompok. Digunakan sebagai dasar untuk Odds Ratio.

Rumus: Odds:

  • Grup 1: \(\text{Odds}_1 = \frac{a}{b}\)

  • Grup 2: \(\text{Odds}_0 = \frac{c}{d}\)

Odds Ratio (OR):

Pengertian:

Odds Ratio membandingkan odds kejadian antara dua kelompok. Sangat umum dalam studi kasus-kontrol dan digunakan dalam regresi logistik.

Rumus: \[ OR = \frac{a \cdot d}{b \cdot c} \]

Interpretasi:

  • \(OR = 1\): Tidak ada asosiasi

  • \(OR > 1\): Odds lebih tinggi pada grup 1

  • \(OR < 1\): Odds lebih rendah

5.2.4 Uji Chi-Square

Pengertian:

Uji Chi-Square digunakan untuk menguji apakah terdapat hubungan yang signifikan antara dua variabel kategorik dalam tabel kontingensi.

Rumus: \[ \chi^2 = \sum \frac{(O - E)^2}{E} \]

  • \(O\): Observasi aktual
  • \(E\): Nilai ekspektasi berdasarkan independensi

Hipotesis:

  • H0: Tidak ada asosiasi (variabel independen)

  • H1: Ada asosiasi (variabel dependen)

Kapan digunakan:

Ketika frekuensi di tiap sel cukup besar (umumnya semua sel ≥ 5).

5.2.5 Fisher’s Exact Test

Pengertian:

Fisher’s Exact Test digunakan untuk menguji hubungan antara dua variabel kategorik dalam tabel kecil (biasanya 2x2), terutama jika ada sel dengan frekuensi < 5.

Rumus probabilitas tabel 2x2: \[ P = \frac{(a + b)! (c + d)! (a + c)! (b + d)!}{a! b! c! d! n!} \]

Hipotesis:

  • H0: Tidak ada asosiasi antar variabel

  • H1: Ada asosiasi antar variabel

Kapan digunakan:

  • Sampel kecil

  • Frekuensi harapan (expected) < 5

Contoh Analisis di R

Hipotetsis

H0: Tidak ada asosiasi antara paparan dan kejadian penyakit. (Proporsi kejadian sama pada kedua kelompok)

H1: Ada asosiasi antara paparan dan kejadian penyakit. (Proporsi kejadian berbeda antara kelompok yang terpapar dan tidak terpapar)

# Data
a <- 40; b <- 60; c <- 10; d <- 90
n <- a + b + c + d

# Buat tabel
tabel <- matrix(c(a, b, c, d), nrow=2, byrow=TRUE,
                dimnames = list("Paparan" = c("Ya", "Tidak"),
                                "Kejadian" = c("Ya", "Tidak")))

# Ukuran asosiasi
rd <- (a / (a + b)) - (c / (c + d))
rr <- (a / (a + b)) / (c / (c + d))
or <- (a * d) / (b * c)

# Uji chi-square & fisher
chisq <- chisq.test(tabel, correct = FALSE)
fisher <- fisher.test(tabel)

# Hasil
data.frame(
  "Risk Difference" = round(rd, 3),
  "Relative Risk" = round(rr, 3),
  "Odds Ratio" = round(or, 3),
  "Chi-square p-value" = chisq$p.value,
  "Fisher's Exact p-value" = fisher$p.value
)
##   Risk.Difference Relative.Risk Odds.Ratio Chi.square.p.value
## 1             0.3             4          6        9.63357e-07
##   Fisher.s.Exact.p.value
## 1           1.243341e-06

Kesimpulan

Karena p-value < 0.05 baik pada Chi-square maupun Fisher’s Exact Test, maka: Tolak H0

Interpretasi

  • Risk Difference = 0.3 → Selisih risiko penyakit antara kelompok terpapar dan tidak terpapar adalah 30%. Artinya, paparan meningkatkan risiko penyakit sebesar 30% secara absolut.

  • Relative Risk = 4.0 → Orang yang terpapar zat kimia memiliki risiko 4 kali lebih tinggi mengalami penyakit dibanding yang tidak terpapar.

  • Odds Ratio = 6.0 → Odds (peluang relatif) terkena penyakit pada kelompok terpapar adalah 6 kali lebih besar dibanding kelompok yang tidak terpapar.

  • Chi-square test menghasilkan p-value (misalnya) p = 0.00001, yang berarti ada asosiasi signifikan antara paparan dan kejadian penyakit secara statistik.

  • Fisher’s Exact Test (p-value sangat kecil, < 0.05) → Hasil ini memvalidasi signifikansi temuan bahkan ketika frekuensi kejadian rendah, dan menghindari bias yang mungkin muncul pada Chi-square saat ukuran sampel kecil.

6 INFERENSI TABEL KONTINGENSI 2 ARAH

adalah proses penarikan kesimpulan statistik mengenai hubungan antara dua variabel kategori berdasarkan data dalam bentuk tabel kontingensi (tabel silang 2x2 atau lebih besar). Inferensi ini bertujuan untuk:

Inferensi dalam tabel kontingensi dua arah dapat dibagi menjadi dua kategori utama:

6.1 Estimasi

Estimasi adalah proses untuk menaksir parameter populasi menggunakan data sampel. Dalam konteks tabel kontingensi, estimasi mencakup:

6.1.1 Estimasi Titik

  • Proporsi:
    \[ \hat{p} = \frac{x}{n} \] di mana \(x\) adalah jumlah kasus sukses dan \(n\) adalah total observasi.

  • Risk Difference (RD):
    \[ \hat{RD} = \hat{p}_1 - \hat{p}_2 \] Mengukur selisih risiko antara dua kelompok.

  • Relative Risk (RR):
    \[ \hat{RR} = \frac{\hat{p}_1}{\hat{p}_2} \] Mengukur perbandingan risiko kejadian antara dua kelompok.

  • Odds Ratio (OR) (untuk tabel 2x2):
    \[ \hat{OR} = \frac{a \cdot d}{b \cdot c} \] Mengukur rasio odds antara dua kelompok. \(a, b, c, d\) berasal dari tabel 2x2 berikut:

    Kasus (+) Kasus (−)
    Paparan (+) \(a\) \(b\)
    Paparan (−) \(c\) \(d\)

6.1.2 Estimasi Interval

Memberikan batas bawah dan atas untuk parameter populasi dengan tingkat keyakinan tertentu.

  • Interval untuk Proporsi (CI untuk satu proporsi): \[ CI = \hat{p} \pm Z_{(1-\alpha/2)} \cdot \sqrt{ \frac{\hat{p}(1 - \hat{p})}{n} } \]

  • CI untuk Perbedaan Proporsi: \[ SE = \sqrt{ \frac{\hat{p}_1 (1 - \hat{p}_1)}{n_1} + \frac{\hat{p}_2 (1 - \hat{p}_2)}{n_2} } \] \[ CI = (\hat{p}_1 - \hat{p}_2) \pm Z_{(1-\alpha/2)} \cdot SE \]

  • CI untuk Odds Ratio (log OR): \[ SE(\log(OR)) = \sqrt{ \frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d} } \] \[ CI = \exp \left( \log(OR) \pm Z_{(1-\alpha/2)} \cdot SE \right) \]

6.2 Uji Hipotesis

Pengujian dalam tabel kontingensi dua arah bertujuan untuk menguji apakah terdapat asosiasi antara dua variabel kategori.

6.2.1 Uji Proporsi

Pengujian dalam tabel kontingensi dua arah bertujuan untuk menguji apakah terdapat asosiasi antara dua variabel kategori.

  • Hipotesis:
    • H0 :Tidak ada perbedaan proporsi antara dua kelompok \(p_1 = p_2\)
    • H1 :Terdapat perbedaan proporsi antara dua kelompok \(p_1 \ne p_2\)
  • Rumus Statistik Uji: \[ Z = \frac{ \hat{p}_1 - \hat{p}_2 }{ \sqrt{ \hat{p}(1 - \hat{p}) \left( \frac{1}{n_1} + \frac{1}{n_2} \right) } } \] di mana \(\hat{p} = \frac{x_1 + x_2}{n_1 + n_2}\)

Misalkan kita memiliki tabel kontingensi 2x2 berikut:

Kejadian (+) Tidak Kejadian (−) Total
Kelompok 1 a b a + b
Kelompok 2 c d c + d
Total a + c b + d n

Notasi:

  • \(a\): jumlah unit di kelompok 1 dengan kejadian

  • \(b\): jumlah unit di kelompok 1 tanpa kejadian

  • \(c\): jumlah unit di kelompok 2 dengan kejadian

  • \(d\): jumlah unit di kelompok 2 tanpa kejadian

  • \(n_1 = a + b\): total unit di kelompok 1

  • \(n_2 = c + d\): total unit di kelompok 2

  • \(n = n_1 + n_2 = a + b + c + d\): total keseluruhan

Estimasi Proporsi dalam Masing-Masing Kelompok

  • Kelompok 1 (Proporsi Kejadian): \[ \hat{p}_1 = \frac{a}{a + b} \]

  • Kelompok 2 (Proporsi Kejadian): \[ \hat{p}_2 = \frac{c}{c + d} \]

Estimasi Proporsi Gabungan (Pooled Proportion)

  • Proporsi gabungan dari seluruh unit yang mengalami kejadian: \[ \hat{p} = \frac{a + c}{a + b + c + d} = \frac{a + c}{n} \] Interpretasi Umum

  • Jika \(\hat{p}_1 > \hat{p}_2\), maka proporsi kejadian lebih tinggi di kelompok 1.

  • Jika \(\hat{p}_1 < \hat{p}_2\), maka proporsi kejadian lebih tinggi di kelompok 2.

  • Jika \(\hat{p}_1 = \hat{p}_2\), maka tidak ada perbedaan proporsi antara kedua kelompok.

Contoh Soal

Sebuah studi dilakukan untuk menilai efektivitas vaksin terhadap suatu penyakit. Penelitian dilakukan terhadap 200 orang, yang terdiri dari 100 orang divaksin dan 100 orang tidak divaksin. Hasilnya sebagai berikut:

Sakit (+) Tidak Sakit (−) Total
Vaksin (+) 10 90 100
Vaksin (−) 30 70 100
Total 40 160 200

Estimasi Proporsi

Dalam Tiap Kelompok (Manual)

  • Kelompok Vaksin (+):
    \[ \hat{p}_1 = \frac{10}{100} = 0.10 \]

  • Kelompok Vaksin (−):
    \[ \hat{p}_2 = \frac{30}{100} = 0.30 \]

Proporsi Gabungan (Manual)

\[ \hat{p} = \frac{10 + 30}{100 + 100} = \frac{40}{200} = 0.20 \]

Uji Hipotesis Dua Proporsi (Z-Test)

Hipotesis: - \(H_0: p_1 = p_2\) (tidak ada perbedaan proporsi) - \(H_1: p_1 \neq p_2\) (ada perbedaan proporsi)

Rumus Uji-Z:

\[ Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1 - \hat{p}) \left(\frac{1}{n_1} + \frac{1}{n_2}\right)}} \]

Substitusi nilai:

\[ Z = \frac{0.10 - 0.30}{\sqrt{0.20(1 - 0.20)\left(\frac{1}{100} + \frac{1}{100}\right)}} = \frac{-0.20}{\sqrt{0.16 \cdot 0.02}} = \frac{-0.20}{\sqrt{0.0032}} \approx \frac{-0.20}{0.0566} \approx -3.53 \]

Keputusan:

  • Nilai kritis z untuk α = 0.05 dua arah adalah ±1.96

  • Karena \(|Z| = 3.53 > 1.96\), maka tolak \(H_0\)

Interpretasi: Terdapat perbedaan signifikan dalam proporsi kejadian sakit antara yang divaksin dan tidak divaksin.

Perhitungan di R

# Data
a <- 10  # sakit + vaksin
b <- 90  # tidak sakit + vaksin
c <- 30  # sakit + tidak vaksin
d <- 70  # tidak sakit + tidak vaksin

n1 <- a + b
n2 <- c + d

# Estimasi proporsi
p1 <- a / n1
p2 <- c / n2
p_pool <- (a + c) / (n1 + n2)

# Z-statistik
z <- (p1 - p2) / sqrt(p_pool * (1 - p_pool) * (1/n1 + 1/n2))
z
## [1] -3.535534
# P-value
p_value <- 2 * pnorm(-abs(z))
p_value
## [1] 0.000406952

6.2.2 Uji Asosiasi

Uji asosiasi dalam data kategorik bertujuan untuk mengetahui apakah terdapat hubungan atau asosiasi antara dua variabel kategorik. Dalam konteks tabel kontingensi 2x2, asosiasi antara dua kelompok (misalnya, terpapar vs tidak terpapar) dan suatu hasil (misalnya, sakit vs tidak sakit) sering diukur menggunakan:

  1. Risk Difference (RD)
  2. Relative Risk (RR)
  3. Odds Ratio (OR)

Struktur Tabel Kontingensi 2x2

Outcome: Yes (1) Outcome: No (0) Total
Exposed (1) a b a + b
Unexposed (0) c d c + d
Total a + c b + d N = a+b+c+d

Hipotesis dalam Uji Asosiasi

Untuk semua ukuran asosiasi, hipotesis dapat dirumuskan sebagai berikut:

  • H0:
    • Tidak ada asosiasi antara dua variabel.
    • \(RD = 0\), \(RR = 1\), \(OR = 1\)
  • H1:
    • Ada asosiasi antara dua variabel.
    • \(RD \neq 0\), \(RR \neq 1\), \(OR \neq 1\)

6.2.2.1 Risk Difference

Pengertian: Selisih risiko (probabilitas) kejadian antara dua kelompok. Mengukur perbedaan absolut risiko antara dua kelompok.

\[ RD = \hat{p}_1 - \hat{p}_2 = \frac{a}{a + b} - \frac{c}{c + d} \]

Standar Error (SE) RD: \[ SE(RD) = \sqrt{ \frac{a}{(a + b)^2} + \frac{b}{(a + b)^2} + \frac{c}{(c + d)^2} + \frac{d}{(c + d)^2} } \]

Statistik Uji Z: \[ Z = \frac{RD}{SE(RD)} \]

6.2.2.2 Relative Risk

Perbandingan risiko kejadian antara kelompok terpapar dan tidak terpapar. Mengukur seberapa besar risiko kejadian meningkat atau menurun akibat paparan.

Rumus: \[ RR = \frac{\hat{p}_1}{\hat{p}_2} = \frac{a / (a + b)}{c / (c + d)} \]

Standar Error (SE) log(RR): \[ SE(\log(RR)) = \sqrt{ \frac{1}{a} - \frac{1}{a + b} + \frac{1}{c} - \frac{1}{c + d} } \]

Statistik Uji Z: \[ Z = \frac{\log(RR)}{SE(\log(RR))} \]

6.2.2.3 Odds Ratio

Pengertian: Rasio odds kejadian antara dua kelompok. Lebih umum digunakan dalam studi kasus-kontrol.

Rumus: \[ OR = \frac{a/b}{c/d} = \frac{a \cdot d}{b \cdot c} \]

Standar Error (SE) log(OR): \[ SE(\log(OR)) = \sqrt{ \frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d} } \]

Statistik Uji Z: \[ Z = \frac{\log(OR)}{SE(\log(OR))} \]

Catatan Tambahan: - RR dan RD lebih sering digunakan pada studi prospektif (misalnya kohort). - OR umum digunakan pada studi retrospektif (kasus-kontrol).

Contoh Soal

Tabel Kontingensi 2x2 Sebuah studi dilakukan untuk menilai efektivitas vaksin terhadap suatu penyakit. Penelitian dilakukan terhadap 200 orang, yang terdiri dari 100 orang divaksin dan 100 orang tidak divaksin. Hasilnya sebagai berikut:

Sakit (+) Tidak Sakit (−) Total
Vaksin (+) 10 90 100
Vaksin (−) 30 70 100
Total 40 160 200

Notasi:

  • a = 10 (Vaksin (+), Sakit)

  • b = 90 (Vaksin (+), Tidak Sakit)

  • c = 30 (Vaksin (−), Sakit)

  • d = 70 (Vaksin (−), Tidak Sakit)

  1. Risk Difference (RD) Perhitungan Manual: \[ RD = \frac{10}{100} - \frac{30}{100} = 0.10 - 0.30 = -0.20 \]

Standar Error RD: \[ SE(RD) = \sqrt{ \frac{a}{(a + b)^2} + \frac{b}{(a + b)^2} + \frac{c}{(c + d)^2} + \frac{d}{(c + d)^2} } \] \[ SE(RD) = \sqrt{ \frac{10}{100^2} + \frac{90}{100^2} + \frac{30}{100^2} + \frac{70}{100^2} } = \sqrt{ \frac{200}{10000} } = \sqrt{0.02} \approx 0.1414 \]

Uji Z: \[ Z = \frac{-0.20}{0.1414} \approx -1.41 \]

  1. Relative Risk (RR) Perhitungan Manual: \[ RR = \frac{a / (a + b)}{c / (c + d)} = \frac{10 / 100}{30 / 100} = \frac{0.10}{0.30} = 0.33 \]

SE(log(RR)): \[ SE(\log(RR)) = \sqrt{ \frac{1}{a} - \frac{1}{a + b} + \frac{1}{c} - \frac{1}{c + d} } \] \[ = \sqrt{ \frac{1}{10} - \frac{1}{100} + \frac{1}{30} - \frac{1}{100} } = \sqrt{ 0.1 - 0.01 + 0.0333 - 0.01 } = \sqrt{0.1133} \approx 0.3365 \]

Z-statistik: \[ Z = \frac{\log(0.33)}{0.3365} = \frac{-1.1087}{0.3365} \approx -3.29 \]

  1. Odds Ratio (OR) Perhitungan Manual: \[ OR = \frac{a \cdot d}{b \cdot c} = \frac{10 \cdot 70}{90 \cdot 30} = \frac{700}{2700} \approx 0.259 \]

SE(log(OR)): \[ SE(\log(OR)) = \sqrt{ \frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d} } = \sqrt{ \frac{1}{10} + \frac{1}{90} + \frac{1}{30} + \frac{1}{70} } \approx \sqrt{0.1636} \approx 0.4045 \]

Z-statistik: \[ Z = \frac{\log(0.259)}{0.4045} = \frac{-1.350}{0.4045} \approx -3.34 \]

Perhitungan dengan R

# Data
a <- 10; b <- 90
c <- 30; d <- 70

# Risk Difference
RD <- (a / (a + b)) - (c / (c + d))
SE_RD <- sqrt(a / (a + b)^2 + b / (a + b)^2 + c / (c + d)^2 + d / (c + d)^2)
Z_RD <- RD / SE_RD

# Relative Risk
RR <- (a / (a + b)) / (c / (c + d))
SE_logRR <- sqrt(1/a - 1/(a + b) + 1/c - 1/(c + d))
Z_RR <- log(RR) / SE_logRR

# Odds Ratio
OR <- (a * d) / (b * c)
SE_logOR <- sqrt(1/a + 1/b + 1/c + 1/d)
Z_OR <- log(OR) / SE_logOR

list(RD = RD, SE_RD = SE_RD, Z_RD = Z_RD,
     RR = RR, SE_logRR = SE_logRR, Z_RR = Z_RR,
     OR = OR, SE_logOR = SE_logOR, Z_OR = Z_OR)
## $RD
## [1] -0.2
## 
## $SE_RD
## [1] 0.1414214
## 
## $Z_RD
## [1] -1.414214
## 
## $RR
## [1] 0.3333333
## 
## $SE_logRR
## [1] 0.3366502
## 
## $Z_RR
## [1] -3.263365
## 
## $OR
## [1] 0.2592593
## 
## $SE_logOR
## [1] 0.3984095
## 
## $Z_OR
## [1] -3.388289

Kesimpulan:

Vaksinasi secara statistik signifikan menurunkan risiko dan odds terkena sakit (berdasarkan RR dan OR), namun tidak signifikan jika dilihat dari Risk Difference.

6.2.3 Uji Independensi

Pengertian:

Uji independensi digunakan untuk menguji apakah dua variabel kategori saling bebas (independen) atau memiliki hubungan (dependen) dalam suatu populasi. Uji ini umumnya dilakukan pada tabel kontingensi, khususnya 2x2 atau RxC.

Tujuan:

Menilai apakah proporsi suatu kategori dalam baris bergantung pada kategori di kolom atau tidak.

Hipotesis

Untuk semua uji berikut:

  • H0: Kedua variabel adalah independen
  • H1: Kedua variabel adalah tidak independen

6.2.3.1 Uji Chi-Square

Rumus: \[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \] - \(O_{ij}\): Frekuensi yang diamati pada sel ke-(i,j) - \(E_{ij}\): Frekuensi yang diharapkan pada sel ke-(i,j), dihitung dengan: \[ E_{ij} = \frac{( \text{jumlah baris}_i \times \text{jumlah kolom}_j )}{n} \]

Distribusi: Statistik uji mengikuti distribusi Chi-Square dengan derajat bebas: \[ df = (r - 1)(c - 1) \]

Contoh Soal

Sebuah kafe ingin mengetahui apakah terdapat perbedaan preferensi minuman antara pelanggan laki-laki dan perempuan. Sebuah survei dilakukan terhadap 100 pelanggan dan hasilnya dirangkum dalam tabel berikut:

Kopi Teh Total
Laki-laki 30 10 40
Perempuan 20 40 60
Total 50 50 100

Hipotesis

H0: Tidak terdapat hubungan antara jenis kelamin dan preferensi minuman (variabel independen).

H1): Terdapat hubungan antara jenis kelamin dan preferensi minuman (variabel dependen).

Perhitungan Manual

  • Hitung nilai ekspektasi (E): \(E_{ij} = \frac{(\text{baris total}) \times (\text{kolom total})}{\text{grand total}}\)
  • Hitung \(\chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}}\)
# Observed values
observed <- matrix(c(30, 10, 20, 40), nrow=2, byrow=TRUE,
                   dimnames = list(Jenis_Kelamin = c("Laki-laki", "Perempuan"),
                                     Minuman = c("Kopi", "Teh")))
observed
##              Minuman
## Jenis_Kelamin Kopi Teh
##     Laki-laki   30  10
##     Perempuan   20  40
# Expected values
row_totals <- margin.table(observed, 1)
col_totals <- margin.table(observed, 2)
grand_total <- sum(observed)

expected <- outer(row_totals, col_totals) / grand_total
expected
##              Minuman
## Jenis_Kelamin Kopi Teh
##     Laki-laki   20  20
##     Perempuan   30  30
# Chi-square statistic
chi_sq_manual <- sum((observed - expected)^2 / expected)
chi_sq_manual
## [1] 16.66667

Perhitungan di R

chisq.test(observed, correct = FALSE)
## 
##  Pearson's Chi-squared test
## 
## data:  observed
## X-squared = 16.667, df = 1, p-value = 4.456e-05

Keputusan

Karena p-value = 4.456e-05 < 0.05, maka: Tolak H0

Interpretasi

Terdapat hubungan signifikan antara jenis kelamin dan preferensi minuman. Artinya:

  • Laki-laki dan perempuan memiliki kecenderungan berbeda dalam memilih kopi atau teh.

Contoh: Laki-laki cenderung memilih kopi (30 dari 40), sementara perempuan cenderung memilih teh (40 dari 60).

6.2.3.2 Partisi Chi-Square

Pengertian: Partisi chi-square digunakan untuk menguraikan nilai χ² menjadi bagian-bagian berdasarkan hipotesis parsial tertentu, dan memungkinkan pengujian komponen atau interaksi tertentu dalam tabel.

Hipotesis:

  • H0: Tidak ada perbedaan atau interaksi antar kelompok tertentu (tergantung bentuk partisi).

  • H1: Ada perbedaan/interaksi antar kelompok yang diuji.

Rumus Umum:

Sama dengan uji chi-square, tetapi dihitung pada bagian (sub-tabel) tertentu dari tabel.

Contoh Soal

Sebuah sekolah ingin mengetahui apakah metode pembelajaran yang berbeda (Metode A dan Metode B) berpengaruh terhadap tingkat kelulusan siswa.

Lulus Tidak Lulus Total
Metode A 40 10 50
Metode B 20 30 50
Total 60 40 100

Hipotesis

H0: Tidak terdapat perbedaan tingkat kelulusan antara metode A dan B (metode dan kelulusan tidak berhubungan).

H1: Terdapat perbedaan tingkat kelulusan antara metode A dan B (metode dan kelulusan berhubungan).

Perhitungan Manual

  • Sama seperti uji chi-square biasa, tetapi bisa dipartisi ke dalam komponen-komponen penyebab ketidaksesuaian.
observed2 <- matrix(c(40, 10, 20, 30), nrow=2, byrow=TRUE,
                    dimnames = list(Metode = c("A", "B"),
                                      Kelulusan = c("Lulus", "Tidak Lulus")))
expected2 <- outer(margin.table(observed2, 1), margin.table(observed2, 2)) / sum(observed2)
chi_sq_manual2 <- sum((observed2 - expected2)^2 / expected2)
chi_sq_manual2
## [1] 16.66667

Perhitungan di R

chisq.test(observed2, correct = FALSE)
## 
##  Pearson's Chi-squared test
## 
## data:  observed2
## X-squared = 16.667, df = 1, p-value = 4.456e-05

6.2.3.3 Uji Likehood Ratio

Pengertian:

Alternatif dari uji χ², menggunakan pendekatan likelihood. Cocok saat asumsi normalitas kurang terpenuhi.

Rumus: \[ G^2 = 2 \sum O_{ij} \cdot \ln\left(\frac{O_{ij}}{E_{ij}}\right) \]

  • \(O_{ij}\): Observasi aktual
  • \(E_{ij}\): Ekspektasi jika independen

Hipotesis :

H0: Tidak ada hubungan antara dua variabel → variabel-variabel tersebut independen. (Contoh: Metode pembelajaran tidak berpengaruh terhadap kelulusan)

H1: Ada hubungan antara dua variabel → variabel-variabel tersebut tidak independen. (Contoh: Metode pembelajaran berpengaruh terhadap kelulusan)

Distribusi:

Distribusi G² juga mengikuti Chi-Square dengan \(df = (r - 1)(c - 1)\)

Contoh Soal

Apakah jenis pekerjaan (Pegawai, Wirausaha) berpengaruh terhadap keputusan membeli asuransi (Ya, Tidak)?

Ya Tidak Total
Pegawai 35 15 50
Wirausaha 25 25 50
Total 60 40 100

Hipotesis :

H0: Metode pembelajaran dan tingkat kelulusan tidak berhubungan (independen).

H1: Metode pembelajaran dan tingkat kelulusan berhubungan (tidak independen).

Perhitungan Manual \[ G^2 = 2 \sum O_{ij} \log\left(\frac{O_{ij}}{E_{ij}}\right) \]

observed3 <- matrix(c(35, 15, 25, 25), nrow=2, byrow=TRUE,
                    dimnames = list(Pekerjaan = c("Pegawai", "Wirausaha"),
                                      Asuransi = c("Ya", "Tidak")))
expected3 <- outer(margin.table(observed3, 1), margin.table(observed3, 2)) / sum(observed3)

g_stat <- 2 * sum(observed3 * log(observed3 / expected3))
g_stat
## [1] 4.201185

Perhitungan di R

# Gunakan package 'DescTools'
if(!require(DescTools)) install.packages("DescTools")
## Loading required package: DescTools
## Warning: package 'DescTools' was built under R version 4.3.3
## Registered S3 method overwritten by 'DescTools':
##   method         from 
##   reorder.factor gdata
library(DescTools)
GTest(observed3)
## 
##  Log likelihood ratio (G-test) test of independence without correction
## 
## data:  observed3
## G = 4.2012, X-squared df = 1, p-value = 0.0404

Keputusan

Dengan p-value = 0.0404 dan asumsi taraf signifikansi α = 0.05:

Karena p-value < α, maka tolak H0.

Interpretasi:

Terdapat hubungan yang signifikan antara metode pembelajaran dan tingkat kelulusan. Artinya, kemungkinan kelulusan mahasiswa berbeda tergantung pada metode pembelajaran yang digunakan (A atau B).

6.2.3.4 Uji Exact Fisher

Pengertian:

Uji ini digunakan pada tabel 2x2 terutama ketika frekuensi yang diamati terlalu kecil (< 5), sehingga pendekatan χ² tidak valid.
Uji Fisher menghitung probabilitas dari semua kemungkinan tabel 2x2 dengan marginal tetap yang lebih ekstrem dari tabel aktual.

Hipotesis:

  • H0: Tidak ada asosiasi antara dua variabel (independen)

  • H1: Ada asosiasi antara dua variabel

6.2.3.4.1 Distribusi Hipergeometrik

Rumus Probabilitas (Distribusi Hipergeometrik): \[ P = \frac{ \binom{a + b}{a} \binom{c + d}{c} }{ \binom{n}{a + c} } \]

Di mana:

  • \(a\) = sel [1,1], \(b\) = sel [1,2], \(c\) = sel [2,1], \(d\) = sel [2,2]
  • \(n = a + b + c + d\)

Contoh Soal

Apakah terapi baru lebih efektif dibandingkan terapi lama dalam menyembuhkan pasien? Sebuah penelitian dilakukan terhadap 20 pasien yang dibagi menjadi dua kelompok secara acak:

-10 pasien mendapatkan terapi baru

-10 pasien mendapatkan terapi lama

Hasil pengamatan ditampilkan sebagai berikut:

Sembuh Tidak Sembuh Total
Terapi Baru 8 2 10
Terapi Lama 1 9 10
Total 9 11 20

Perhitungan Manual

Probabilitas persis (hipergeometrik): \[ P = \frac{\binom{a+b}{a} \binom{c+d}{c}}{\binom{n}{a+c}} \]

a <- 8; b <- 2; c <- 1; d <- 9
fisher_prob <- choose(10, 8) * choose(10, 1) / choose(20, 9)
fisher_prob
## [1] 0.002679209

Perhitungan di R

observed4 <- matrix(c(8, 2, 1, 9), nrow=2, byrow=TRUE,
                    dimnames = list(Terapi = c("Baru", "Lama"),
                                      Hasil = c("Sembuh", "Tidak Sembuh")))
fisher.test(observed4)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  observed4
## p-value = 0.005477
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
##     2.057999 1740.081669
## sample estimates:
## odds ratio 
##   27.32632

Tabel Kesimpulan

Nama Uji Tujuan Output Utama
Chi-Square Test Menguji independensi antara dua variabel kategorik Nilai Chi-square, p-value
Partisi Chi-Square Menganalisis komponen penyebab utama dari ketidaksesuaian data Nilai Chi-square terpartisi
Likelihood Ratio (G-Test) Menguji hubungan antara dua variabel menggunakan pendekatan likelihood Nilai G-statistik, p-value
Fisher Exact Test Menguji independensi untuk tabel kecil menggunakan distribusi eksak p-value dari distribusi eksak

6.3 Analisis Residual dalam Tabel Kontingensi

Dalam tabel kontingensi, residual adalah selisih antara nilai observasi (yang sebenarnya terjadi) dan nilai harapan (yang diharapkan jika tidak ada hubungan antara variabel). Residual membantu mengidentifikasi apakah ada penyimpangan antara hasil aktual dan asumsi independensi antar variabel.

Secara umum, residual dihitung sebagai:

\[ \text{Residual} = \text{Nilai Observasi} - \text{Nilai Harapan} \]

Ada juga versi standardized residual (residual terstandarisasi) yang digunakan untuk analisis statistik lebih lanjut.

Interpretasi Nilai Residual

Berikut adalah interpretasi nilai residual dalam tabel kontingensi:

Jika Residual = 0

  • Artinya: Frekuensi observasi sama persis dengan yang diharapkan.
  • Interpretasi: Tidak ada penyimpangan, variabel dapat dianggap independen pada sel tersebut.

Jika Residual Kecil (~0)

  • Artinya: Perbedaan antara nilai observasi dan harapan sangat kecil.
  • Interpretasi: Tidak ada hubungan yang signifikan antar kategori pada sel tersebut.

Jika Residual Positif Besar

  • Artinya: Nilai observasi jauh lebih besar dibandingkan nilai yang diharapkan.
  • Interpretasi: Terdapat hubungan positif antara kategori di sel tersebut, lebih sering muncul bersama daripada yang diharapkan.

Jika Residual Negatif Besar

  • Artinya: Nilai observasi jauh lebih kecil dibandingkan nilai yang diharapkan.
  • Interpretasi: Terdapat hubungan negatif antara kategori di sel tersebut, lebih jarang muncul bersama dibandingkan yang diharapkan.

Jika Residual Besar (Baik Positif maupun Negatif)

  • Artinya: Terdapat penyimpangan yang besar dari nilai harapan.
  • Interpretasi:
    • Jika positif besar → keterhubungan kuat (lebih sering muncul bersama).
    • Jika negatif besar → saling menghindar atau tidak berhubungan.

Biasanya, residual standar yang lebih besar dari |2| dianggap signifikan secara statistik dan menunjukkan bahwa ada kontribusi kuat dari sel tersebut terhadap hasil uji chi-square.

6.3.1 Jenis Residual

Pearson Residual adalah salah satu jenis residual yang digunakan dalam analisis tabel kontingensi, untuk mengevaluasi apakah terdapat perbedaan yang signifikan antara frekuensi observasi dan ekspektasi berdasarkan asumsi independensi.

Residual ini membantu mengidentifikasi sel mana yang memberikan kontribusi besar terhadap nilai statistik chi-square.

Rumus Pearson Residual

\[ R_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]

Keterangan: - \(R_{ij}\) = Pearson residual untuk sel ke-(i,j) - \(O_{ij}\) = Nilai observasi (frekuensi aktual) - \(E_{ij}\) = Nilai harapan (ekspektasi jika tidak ada hubungan antara variabel)

Contoh

Apakah preferensi terhadap jenis produk (A atau B) berbeda menurut kelompok usia (< 30 tahun dan ≥ 30 tahun)?

Sebuah survei dilakukan terhadap 100 orang yang terbagi ke dalam dua kelompok usia:

  • 50 responden berusia < 30 tahun

  • 50 responden berusia ≥ 30 tahun

Mereka diminta memilih antara Produk A dan Produk B. Hasil pengamatan sebagai berikut:

Produk A Produk B Total
Usia < 30 20 30 50
Usia ≥ 30 30 20 50
Total 50 50 100

Hipotesis

H0: Tidak ada hubungan antara kelompok usia dan preferensi produk (independen).

H1): Terdapat hubungan antara kelompok usia dan preferensi produk (tidak independen).

Langkah Perhitungan Manual

Hitung Nilai Ekspektasi (E) Gunakan rumus:

\[ E_{ij} = \frac{\text{Total baris i} \times \text{Total kolom j}}{\text{Grand total}} \]

  • E(Usia<30, Produk A) = \(\frac{50 \times 50}{100} = 25\)
  • E(Usia<30, Produk B) = \(\frac{50 \times 50}{100} = 25\)
  • E(Usia≥30, Produk A) = \(\frac{50 \times 50}{100} = 25\)
  • E(Usia≥30, Produk B) = \(\frac{50 \times 50}{100} = 25\)

Hitung Pearson Residual

\[ R_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]

  • R(Usia<30, Produk A) = \(\frac{20 - 25}{\sqrt{25}} = \frac{-5}{5} = -1\)
  • R(Usia<30, Produk B) = \(\frac{30 - 25}{\sqrt{25}} = \frac{5}{5} = 1\)
  • R(Usia≥30, Produk A) = \(\frac{30 - 25}{\sqrt{25}} = 1\)
  • R(Usia≥30, Produk B) = \(\frac{20 - 25}{\sqrt{25}} = -1\)

Perhitungan di R

# Buat tabel kontingensi
data <- matrix(c(20, 30, 30, 20), nrow = 2, byrow = TRUE)
colnames(data) <- c("Produk A", "Produk B")
rownames(data) <- c("Usia < 30", "Usia >= 30")
tabel <- as.table(data)

# Uji chi-square
hasil <- chisq.test(tabel)

# Tampilkan hasil
hasil
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tabel
## X-squared = 3.24, df = 1, p-value = 0.07186
# Nilai ekspektasi
hasil$expected
##            Produk A Produk B
## Usia < 30        25       25
## Usia >= 30       25       25
# Pearson residual
hasil$residuals  # Sama dengan (observed - expected) / sqrt(expected)
##            Produk A Produk B
## Usia < 30        -1        1
## Usia >= 30        1       -1

digunakan taraf signifikansi α=0.05

Karena p-value = 0.07186 > 0.05, maka gagal tolak H0

Interpretasi: Tidak terdapat cukup bukti statistik untuk menyimpulkan bahwa preferensi produk (A atau B) secara signifikan berbeda menurut kelompok usia pada taraf signifikansi 5%. Artinya, preferensi produk dan usia tidak berbeda secara signifikan, meskipun terlihat ada kecenderungan.

Kesimpulan

Pearson residual menunjukkan seberapa besar deviasi antara nilai observasi dan nilai harapan dalam satuan standar deviasi.

Nilai residual besar (positif/negatif) mengindikasikan hubungan yang kuat antara kategori tersebut.

Residual antara -2 dan 2 umumnya dianggap tidak signifikan, kecuali jika menggunakan signifikansi ketat.

6.3.2 Deteksi Outlier dalam Analisis Data Kategori Menggunakan Residual

Pengertian Outlier dalam Tabel Kontingensi

Dalam konteks tabel kontingensi, outlier adalah sel yang nilai observasinya (frekuensi aktual) sangat berbeda dari nilai yang diharapkan (ekspektasi) jika kedua variabel kategori independen.

Outlier dalam tabel kontingensi dapat menunjukkan hubungan yang tidak biasa atau anomali, yang bisa menjadi indikasi: - asosiasi kuat (positif/negatif), - kesalahan pengumpulan data, - atau kelompok yang sangat berbeda perilakunya.

Deteksi outlier dilakukan dengan residual, yaitu selisih antara nilai observasi dan ekspektasi.

6.3.2.1 Menggunakan Residual untuk Mendeteksi Outlier

Pearson residual mengukur deviasi antara nilai observasi dan nilai harapan dalam satuan standar deviasi dari harapan.

Rumus:

\[ R_{ij}^{(P)} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]

  • \(R_{ij}^{(P)}\): Pearson residual pada sel ke-(i,j)
  • \(O_{ij}\): Nilai observasi
  • \(E_{ij}\): Nilai ekspektasi jika independen

Interpretasi:

  • Nilai mendekati 0 → cocok dengan ekspektasi (tidak ada outlier)
  • Nilai besar positif → kejadian lebih sering dari yang diharapkan
  • Nilai besar negatif → kejadian lebih jarang dari yang diharapkan
  • Nilai > |2| → bisa dianggap sebagai indikasi outlier signifikan

Standardized residual memperbaiki Pearson residual dengan mempertimbangkan variabilitas lebih lengkap, termasuk proporsi total baris dan kolom.

Rumus:

\[ R_{ij}^{(S)} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}(1 - p_{i\cdot})(1 - p_{\cdot j})}} \]

  • \(R_{ij}^{(S)}\): Standardized residual pada sel ke-(i,j)
  • \(p_{i\cdot}\): Proporsi total baris ke-i
  • \(p_{\cdot j}\): Proporsi total kolom ke-j
  • \(O_{ij}, E_{ij}\): seperti sebelumnya

Jika residual ini > |2|, maka sel tersebut berkontribusi signifikan terhadap deviasi dan bisa disebut outlier.

Kesimpulan Outlier dalam tabel kontingensi menunjukkan kategori yang tidak sesuai dengan pola umum.

Gunakan Pearson atau Standardized residual untuk mengidentifikasinya.

Residual yang besar (misal > |2|) → indikasi pentingnya hubungan atau penyimpangan signifikan dari asumsi independensi.

Deteksi Outlier dalam Tabel Kontingensi

Contoh Soal

Sebuah survei dilakukan untuk mengetahui preferensi minuman (Kopi atau Teh) berdasarkan jenis kelamin (Laki-laki atau Perempuan). Hasilnya sebagai berikut:

Jenis Kelamin Kopi Teh Total
Laki-laki 30 10 40
Perempuan 20 40 60
Total 50 50 100

Langkah 1: Hitung Nilai Harapan (Expected Value)

Gunakan rumus:

\[ E_{ij} = \frac{\text{Total Baris}_i \times \text{Total Kolom}_j}{\text{Grand Total}} \]

Hitungan Manual:

  • \(E_{11} = \frac{40 \times 50}{100} = 20\)
  • \(E_{12} = \frac{40 \times 50}{100} = 20\)
  • \(E_{21} = \frac{60 \times 50}{100} = 30\)
  • \(E_{22} = \frac{60 \times 50}{100} = 30\)

Langkah 2: Hitung Pearson Residual

Gunakan rumus:

\[ R_{ij}^{(P)} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]

Hitungan Manual:

  • \(R_{11}^{(P)} = \frac{30 - 20}{\sqrt{20}} = \frac{10}{4.472} \approx 2.24\)
  • \(R_{12}^{(P)} = \frac{10 - 20}{\sqrt{20}} = \frac{-10}{4.472} \approx -2.24\)
  • \(R_{21}^{(P)} = \frac{20 - 30}{\sqrt{30}} = \frac{-10}{5.477} \approx -1.83\)
  • \(R_{22}^{(P)} = \frac{40 - 30}{\sqrt{30}} = \frac{10}{5.477} \approx 1.83\)

Langkah 3: Deteksi Outlier

  • Sel dengan residual lebih besar dari |2| dianggap sebagai outlier signifikan.
  • Maka, sel (Laki-laki, Kopi) dan (Laki-laki, Teh) terindikasi outlier.

Langkah 4: Perhitungan dengan R

# Buat tabel kontingensi
observed <- matrix(c(30, 10, 20, 40), nrow = 2, byrow = TRUE,
                   dimnames = list(Jenis_Kelamin = c("Laki-laki", "Perempuan"),
                                   Minuman = c("Kopi", "Teh")))

# Uji chi-square
hasil <- chisq.test(observed)

# Nilai harapan
hasil$expected
##              Minuman
## Jenis_Kelamin Kopi Teh
##     Laki-laki   20  20
##     Perempuan   30  30
# Pearson residual
hasil$residuals
##              Minuman
## Jenis_Kelamin      Kopi       Teh
##     Laki-laki  2.236068 -2.236068
##     Perempuan -1.825742  1.825742

Langkah 5: Hitung Standardized Residual (Opsional)

# Hitung total
total <- sum(observed)
row_prop <- rowSums(observed) / total
col_prop <- colSums(observed) / total

# Hitung standardized residual secara manual
expected <- hasil$expected
standardized_resid <- matrix(0, nrow = 2, ncol = 2)

for (i in 1:2) {
  for (j in 1:2) {
    standardized_resid[i, j] <- 
      (observed[i, j] - expected[i, j]) / 
      sqrt(expected[i, j] * (1 - row_prop[i]) * (1 - col_prop[j]))
  }
}

rownames(standardized_resid) <- rownames(observed)
colnames(standardized_resid) <- colnames(observed)
standardized_resid
##                Kopi       Teh
## Laki-laki  4.082483 -4.082483
## Perempuan -4.082483  4.082483

Kesimpulan Tabel kontingensi dapat mengungkap sel yang tidak sesuai dengan pola keseluruhan.

Pearson dan Standardized residual dapat digunakan untuk mendeteksi outlier.

Analisis residual sangat berguna dalam eksplorasi hubungan antar kategori sebelum membuat keputusan atau menyusun model lanjutan.

7 TABEL KONTINGENSI 3 ARAH

Tabel kontingensi tiga arah adalah bentuk perluasan dari tabel kontingensi dua arah yang melibatkan tiga variabel kategorik. Tabel ini menyajikan hubungan antara tiga dimensi sekaligus dan digunakan untuk menganalisis interaksi di antara ketiganya.

Tujuan penggunaan tabel ini adalah untuk: - Menilai apakah ada interaksi tiga arah antar variabel. - Mengidentifikasi apakah asosiasi antara dua variabel tergantung pada level variabel ketiga.

7.1 Tabel Parsial dan Marginal

Tabel marginal adalah tabel yang diperoleh dengan menjumlahkan frekuensi terhadap salah satu variabel. Ini memberikan ringkasan hubungan dua variabel dengan mengabaikan variabel ketiga.

Contoh:

Tabel marginal untuk A dan B: \[ n_{ij\cdot} = \sum_{k} n_{ijk} \]

Contoh: jumlah seluruh nilai untuk A dan B, tanpa mempertimbangkan nilai C.

Tabel parsial adalah tabel kontingensi dua arah untuk A dan B pada satu tingkat tetap dari variabel C.

Contoh:

Tabel parsial A dan B pada C = C₁: \[ n_{ij1},\ \text{untuk semua } i, j \]

Tabel ini digunakan untuk menganalisis hubungan antara A dan B pada strata tertentu dari C (misalnya hanya untuk kelompok “Usia Muda”).

Kegunaan

  • Tabel marginal digunakan untuk melihat pengaruh rata-rata dua variabel, tanpa pengaruh variabel ketiga.
  • Tabel parsial penting untuk mengevaluasi interaksi dan mendeteksi efek perancu (confounding) atau kondisional.

Tabel tiga arah dituliskan sebagai berikut:

Let \(n_{ijk}\) menyatakan frekuensi pengamatan untuk: - Kategori ke-\(i\) dari variabel A (misal: Minuman) - Kategori ke-\(j\) dari variabel B (misal: Jenis Kelamin) - Kategori ke-\(k\) dari variabel C (misal: Usia)

Dengan demikian:

B₁ (j=1) B₂ (j=2)
A₁, C₁ \(n_{111}\) \(n_{121}\)
A₂, C₁ \(n_{211}\) \(n_{221}\)
A₁, C₂ \(n_{112}\) \(n_{122}\)
A₂, C₂ \(n_{212}\) \(n_{222}\)

Artinya: - Baris menunjukkan kombinasi nilai dari variabel A dan C (Minuman dan Usia) - Kolom menunjukkan nilai dari variabel B (Jenis Kelamin)

Tabel kontingensi tiga arah menyajikan distribusi frekuensi dari tiga variabel kategorikal. Pada contoh ini, kita akan menggunakan tiga variabel kategorikal:

Sebuah perusahaan ingin mengetahui apakah preferensi produk (A atau B) dipengaruhi oleh kombinasi antara jenis kelamin dan usia pelanggan. Untuk itu, dilakukan survei kepada responden yang diklasifikasikan berdasarkan 3 variabel:

Usia: Muda / Tua

Jenis Kelamin: Laki-laki / Perempuan

Preferensi Produk: Produk A / Produk B

Berikut adalah contoh tabel data yang digunakan:

Usia Jenis Kelamin Preferensi A Preferensi B
Muda Laki-laki 50 30
Muda Perempuan 70 50
Tua Laki-laki 40 60
Tua Perempuan 60 40

Struktur Data dalam R

# Data contoh
data <- array(
  c(50, 30, 70, 50, 40, 60, 60, 40),
  dim = c(2, 2, 2),
  dimnames = list(
    Usia = c("Muda", "Tua"),
    JenisKelamin = c("Laki-laki", "Perempuan"),
    Preferensi = c("A", "B")
  )
)

# Menampilkan array 3 dimensi
data
## , , Preferensi = A
## 
##       JenisKelamin
## Usia   Laki-laki Perempuan
##   Muda        50        70
##   Tua         30        50
## 
## , , Preferensi = B
## 
##       JenisKelamin
## Usia   Laki-laki Perempuan
##   Muda        40        60
##   Tua         60        40

Tabel Parsial Tabel parsial didapat dengan memperbaiki satu variabel dan melihat hubungan antara dua variabel lainnya. Misalnya, kita dapat membuat tabel parsial untuk melihat hubungan Preferensi A dan B pada Usia Muda.

Dalam contoh ini, kita akan memperbaiki variabel usia dan melihat hubungan antara jenis kelamin dan preferensi.

Tabel Parsial untuk Usia Muda

Frekuensi:

Jenis Kelamin Preferensi A Preferensi B
Laki-laki 50 30
Perempuan 70 50

Interpretasi: - Pada usia muda, lebih banyak perempuan yang memilih Produk A dibanding laki-laki. - Produk B juga relatif lebih dipilih oleh perempuan muda dibanding laki-laki muda.

Tabel Parsial untuk Usia Tua

Frekuensi:

Jenis Kelamin Preferensi A Preferensi B
Laki-laki 40 60
Perempuan 60 40

Interpretasi: - Pada usia tua, laki-laki lebih dominan memilih Produk B. - Perempuan tua justru lebih memilih Produk A.

Tabel Parsial dalam R

# Buat kembali data dalam bentuk 3D array
parsial_data <- array(
  c(50, 30, 70, 50, 40, 60, 60, 40),
  dim = c(2, 2, 2),
  dimnames = list(
    JenisKelamin = c("Laki-laki", "Perempuan"),
    Preferensi = c("Prefer A", "Prefer B"),
    Usia = c("Muda", "Tua")
  )
)

# Tabel parsial untuk Usia Muda
parsial_muda <- parsial_data[, , "Muda"]
parsial_muda
##             Preferensi
## JenisKelamin Prefer A Prefer B
##    Laki-laki       50       70
##    Perempuan       30       50
# Tabel parsial untuk Usia Tua
parsial_tua <- parsial_data[, , "Tua"]
parsial_tua
##             Preferensi
## JenisKelamin Prefer A Prefer B
##    Laki-laki       40       60
##    Perempuan       60       40

Tabel Marginal Tabel marginal didapatkan dengan menjumlahkan frekuensi berdasarkan satu variabel sambil mengabaikan dua variabel lainnya. Misalnya, kita akan menghitung jumlah total Preferensi A dan B, serta Jenis Kelamin.

Frekuensi marginal untuk jenis kelamin:

  • Laki-laki:
    • Prefer A: 50 + 40 = 90
    • Prefer B: 30 + 60 = 90
  • Perempuan:
    • Prefer A: 70 + 60 = 130
    • Prefer B: 50 + 40 = 90

Frekuensi marginal untuk preferensi:

  • Prefer A:
    • Muda: 50 + 70 = 120
    • Tua: 40 + 60 = 100
  • Prefer B:
    • Muda: 30 + 50 = 80
    • Tua: 60 + 40 = 100
# Membuat data matrix
data <- matrix(c(50, 30, 70, 50, 40, 60, 60, 40), nrow = 4, byrow = TRUE)

# Menambahkan nama kolom dan baris
colnames(data) <- c("Prefer A", "Prefer B")
rownames(data) <- c("Muda Laki-laki", "Muda Perempuan", "Tua Laki-laki", "Tua Perempuan")

# Hitung frekuensi marginal berdasarkan jenis kelamin dan preferensi
marginal_jenis_kelamin <- rowSums(data)
marginal_preferensi <- colSums(data)

# Menampilkan hasil
marginal_jenis_kelamin
## Muda Laki-laki Muda Perempuan  Tua Laki-laki  Tua Perempuan 
##             80            120            100            100
marginal_preferensi
## Prefer A Prefer B 
##      220      180

Kesimpulan Tabel marginal memberikan informasi keseluruhan untuk masing-masing variabel kategori dengan mengabaikan variabel lainnya.

Tabel parsial menunjukkan distribusi dua variabel dalam satu strata variabel lainnya, memberikan pandangan lebih mendalam tentang interaksi antara variabel.

Perhitungan tabel marginal dan parsial di R membantu dalam analisis data kategorik dengan cara yang lebih efisien dan terstruktur.

7.2 Distribusi Peluang

7.2.1 Peluang Bersama (Joint Probability)

Peluang bersama menyatakan probabilitas dua kejadian terjadi bersamaan.

Rumus: \[ P(A \cap B) = \frac{n_{A \cap B}}{n_{total}} \]

Perhitungan Manual

Contoh:
- \(P(\text{Muda, Laki-laki, Preferensi A}) = \frac{50}{400} = 0.125\)
- \(P(\text{Tua, Perempuan, Preferensi B}) = \frac{40}{400} = 0.10\)

Perhitungan di R

# Data vector
data_vector <- c(50, 30, 70, 50, 40, 60, 60, 40)

# Total
total <- sum(data_vector)

# Peluang bersama
joint_prob <- data_vector / total

# Nama kombinasi
names(joint_prob) <- c(
  "Muda_Laki_A", "Muda_Laki_B",
  "Muda_Perem_A", "Muda_Perem_B",
  "Tua_Laki_A", "Tua_Laki_B",
  "Tua_Perem_A", "Tua_Perem_B"
)

joint_prob
##  Muda_Laki_A  Muda_Laki_B Muda_Perem_A Muda_Perem_B   Tua_Laki_A   Tua_Laki_B 
##        0.125        0.075        0.175        0.125        0.100        0.150 
##  Tua_Perem_A  Tua_Perem_B 
##        0.150        0.100

7.2.2 Peluang Marginal (Marginal Probability)

Pengertian Peluang marginal adalah probabilitas satu kejadian tanpa mempertimbangkan kejadian lainnya.

Rumus: P(A) = ∑ P(A ∩ B)

Perhitungan Manual 1. \(P(\text{Preferensi A}) = \frac{50 + 70 + 40 + 60}{400} = \frac{220}{400} = 0.55\)

  1. \(P(\text{Laki-laki}) = \frac{50 + 30 + 40 + 60}{400} = \frac{180}{400} = 0.45\)

Perhitungan di R

# Bentuk array 3D
data_array <- array(
  data_vector,
  dim = c(2, 2, 2),
  dimnames = list(
    Preferensi = c("A", "B"),
    JenisKelamin = c("Laki-laki", "Perempuan"),
    Usia = c("Muda", "Tua")
  )
)

# Peluang marginal
p_marginal_preferensi <- margin.table(data_array, 1) / total
p_marginal_jeniskelamin <- margin.table(data_array, 2) / total
p_marginal_usia <- margin.table(data_array, 3) / total

p_marginal_preferensi
## Preferensi
##    A    B 
## 0.55 0.45
p_marginal_jeniskelamin
## JenisKelamin
## Laki-laki Perempuan 
##      0.45      0.55
p_marginal_usia
## Usia
## Muda  Tua 
##  0.5  0.5

7.2.3 Peluang Bersyarat

Pengertian Peluang bersyarat adalah probabilitas suatu kejadian dengan syarat kejadian lain telah terjadi.

Rumus: P(A|B) = P(A ∩ B) / P(B)

# Contoh: Preferensi diberikan Jenis Kelamin
conditional_preferensi_given_gender <- prop.table(margin.table(data, c(1, 2)), margin = 2)

Perhitungan Manual 1. \(P(\text{Preferensi A} \mid \text{Laki-laki}) = \frac{50 + 40}{180} = \frac{90}{180} = 0.5\)

  1. \(P(\text{Preferensi B} \mid \text{Perempuan}) = \frac{50 + 40}{130 + 90} = \frac{90}{220} = 0.409\)

Perhitungan di R

# Preferensi A diberikan Jenis Kelamin
prefer_by_gender <- margin.table(data_array, c(1,2))  # preferensi vs jenis kelamin
p_conditional <- prop.table(prefer_by_gender, margin = 2)  # bagi tiap kolom

p_conditional
##           JenisKelamin
## Preferensi Laki-laki Perempuan
##          A       0.5 0.5909091
##          B       0.5 0.4090909

Kesimpulan Peluang bersama memperlihatkan proporsi dari kombinasi kategori.

Peluang marginal digunakan untuk mendapatkan distribusi satu variabel saja.

Peluang bersyarat menjelaskan bagaimana satu variabel terdistribusi pada kondisi tetap dari variabel lain.

7.3 Ukuran Asosiasi

Ukuran asosiasi digunakan untuk mengukur kekuatan hubungan antara dua variabel kategorik. Pada tabel kontingensi 3 arah, kita mengukur hubungan dua variabel sambil mengendalikan variabel ketiga.

Ukuran yang Dibahas: - Beda Peluang (Risk Difference / Absolute Risk Reduction) - Risiko Relatif (Risk Ratio / Relative Risk) - Odds Ratio (Perbandingan Odds)

Rumus

7.3.1 1. Risk Difference (RD)

\[ RD = P(E|A) - P(E|B) \]

7.3.2 2. Risk Ratio (RR)

\[ RR = \frac{P(E|A)}{P(E|B)} \]

7.3.3 3. Odds Ratio (OR)

\[ OR = \frac{\frac{P(E|A)}{1-P(E|A)}}{\frac{P(E|B)}{1-P(E|B)}} \]

Contoh Soal

Peneliti ingin mengetahui apakah kebiasaan merokok berpengaruh terhadap risiko terkena penyakit paru-paru, dan apakah hubungan tersebut berbeda antara laki-laki dan perempuan. Diketahui bahwa jenis kelamin bisa menjadi confounder dalam hubungan antara merokok dan penyakit paru-paru.

Jenis Kelamin Merokok Penyakit Jumlah
L Ya Ya 40
L Ya Tidak 60
L Tidak Ya 10
L Tidak Tidak 90
P Ya Ya 30
P Ya Tidak 70
P Tidak Ya 20
P Tidak Tidak 80

Perhitungan Manual (Untuk Jenis Kelamin = Laki-laki)

  • P(Penyakit | Merokok) = 40 / (40 + 60) = 0.40
  • P(Penyakit | Tidak Merokok) = 10 / (10 + 90) = 0.10

7.3.4 Risk Difference (L)

\[ RD = 0.40 - 0.10 = 0.30 \]

7.3.5 Risk Ratio (L)

\[ RR = \frac{0.40}{0.10} = 4.0 \]

7.3.6 Odds Ratio (L)

  • Odds(Merokok) = 40 / 60 = 0.667
  • Odds(Tidak Merokok) = 10 / 90 = 0.111

\[ OR = \frac{0.667}{0.111} \approx 6.0 \]

Perhitungan di R

# Data array 2x2x2: [Penyakit, Merokok, Jenis Kelamin]
data <- array(c(
  # Laki-laki
  40, 60,  # Merokok: Ya (Penyakit = Ya, Tidak)
  10, 90,  # Merokok: Tidak

  # Perempuan
  30, 70,  # Merokok: Ya
  20, 80   # Merokok: Tidak
), dim = c(2, 2, 2),
dimnames = list(
  Penyakit = c("Ya", "Tidak"),
  Merokok = c("Ya", "Tidak"),
  JenisKelamin = c("L", "P")
))

data
## , , JenisKelamin = L
## 
##         Merokok
## Penyakit Ya Tidak
##    Ya    40    10
##    Tidak 60    90
## 
## , , JenisKelamin = P
## 
##         Merokok
## Penyakit Ya Tidak
##    Ya    30    20
##    Tidak 70    80
library(epitools)

# Hitung per jenis kelamin
for (jk in dimnames(data)$JenisKelamin) {
  cat("\n=== Jenis Kelamin:", jk, "===\n")
  
  # Ambil tabel 2x2 untuk strata tsb (Penyakit × Merokok)
  tab <- data[ , , jk]
  
  print(tab)
  
  # Hitung ukuran asosiasi
  hasil <- riskratio(tab)
  print(hasil)
}
## 
## === Jenis Kelamin: L ===
##         Merokok
## Penyakit Ya Tidak
##    Ya    40    10
##    Tidak 60    90
## $data
##         Merokok
## Penyakit  Ya Tidak Total
##    Ya     40    10    50
##    Tidak  60    90   150
##    Total 100   100   200
## 
## $measure
##         risk ratio with 95% C.I.
## Penyakit estimate    lower    upper
##    Ya           1       NA       NA
##    Tidak        3 1.697336 5.302427
## 
## $p.value
##         two-sided
## Penyakit   midp.exact fisher.exact  chi.square
##    Ya              NA           NA          NA
##    Tidak 7.190546e-07 1.243341e-06 9.63357e-07
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
## 
## === Jenis Kelamin: P ===
##         Merokok
## Penyakit Ya Tidak
##    Ya    30    20
##    Tidak 70    80
## $data
##         Merokok
## Penyakit  Ya Tidak Total
##    Ya     30    20    50
##    Tidak  70    80   150
##    Total 100   100   200
## 
## $measure
##         risk ratio with 95% C.I.
## Penyakit estimate     lower    upper
##    Ya    1.000000        NA       NA
##    Tidak 1.333333 0.9200446 1.932273
## 
## $p.value
##         two-sided
## Penyakit midp.exact fisher.exact chi.square
##    Ya            NA           NA         NA
##    Tidak  0.1065195    0.1412067  0.1024704
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Kesimpulan

  • Untuk laki-laki, merokok meningkatkan risiko penyakit paru-paru 4 kali lipat dibandingkan tidak merokok.
  • Odds penyakit lebih tinggi sekitar 6 kali lipat pada perokok dibanding bukan perokok.
  • Perbedaan peluang menunjukkan peningkatan risiko absolut sebesar 30%.
  • Dengan menggunakan pendekatan 3 arah, kita dapat mengontrol efek perancu dari variabel ketiga (jenis kelamin).

7.4 Conditional Independence

Conditional independence (ketidakbergantungan bersyarat) adalah kondisi di mana dua variabel dikatakan tidak saling bergantung secara langsung, setelah dikendalikan atau dikondisikan oleh variabel ketiga. Dalam konteks tabel kontingensi 2x2xK, kita ingin tahu apakah hubungan antara dua variabel tetap ada ketika stratifikasi dilakukan terhadap variabel ketiga.

Rumus

Jika variabel A dan B conditionally independent given C, maka: \[ P(A, B \mid C) = P(A \mid C) \cdot P(B \mid C) \]

Dalam tabel kontingensi, kita uji conditional independence dengan: - Menggunakan uji homogenitas odds ratio antar strata, atau - Uji Breslow-Day, atau - Melihat apakah odds ratio berbeda signifikan antar strata.

Contoh Soal

Penelitian ini bertujuan untuk mengetahui apakah jenis asupan makanan (Sehat/Tidak Sehat) berpengaruh terhadap status hipertensi (Ya/Tidak), dengan mempertimbangkan bahwa tingkat aktivitas fisik (Tinggi/Rendah) bisa menjadi variabel pengganggu (confounder).

Aktivitas Makanan Hipertensi Jumlah
Tinggi Sehat Ya 20
Tinggi Sehat Tidak 80
Tinggi Tidak Sehat Ya 40
Tinggi Tidak Sehat Tidak 60
Rendah Sehat Ya 30
Rendah Sehat Tidak 70
Rendah Tidak Sehat Ya 50
Rendah Tidak Sehat Tidak 50

Perhitungan Manual

  1. Odds Ratio per strata:

Aktivitas Tinggi:
OR = (20×60) / (80×40) = 1200 / 3200 = 0.375

Aktivitas Rendah:
OR = (30×50) / (70×50) = 1500 / 3500 = 0.429

  1. Apakah OR serupa?

Karena nilai odds ratio serupa (0.375 vs 0.429), secara kasar bisa dikatakan tidak ada interaksi antara makanan dan aktivitas → indikasi conditional independence.

Perhitungan R

library(epitools)

# Susun array 2x2x2: [Hipertensi, Makanan, Aktivitas]
tabel <- array(c(
  20, 80,  # Sehat, Aktif Tinggi
  40, 60,  # Tidak Sehat, Aktif Tinggi

  30, 70,  # Sehat, Aktif Rendah
  50, 50   # Tidak Sehat, Aktif Rendah
), dim = c(2, 2, 2),
dimnames = list(
  Hipertensi = c("Ya", "Tidak"),
  Makanan = c("Sehat", "TidakSehat"),
  Aktivitas = c("Tinggi", "Rendah")
))

# Lihat hasil OR dan CI
for (a in dimnames(tabel)$Aktivitas) {
  cat("\n>> Aktivitas:", a, "\n")
  tab <- tabel[,,a]
  print(tab)
  print(oddsratio(tab))
}
## 
## >> Aktivitas: Tinggi 
##           Makanan
## Hipertensi Sehat TidakSehat
##      Ya       20         40
##      Tidak    80         60
## $data
##           Makanan
## Hipertensi Sehat TidakSehat Total
##      Ya       20         40    60
##      Tidak    80         60   140
##      Total   100        100   200
## 
## $measure
##           odds ratio with 95% C.I.
## Hipertensi  estimate    lower     upper
##      Ya    1.0000000       NA        NA
##      Tidak 0.3780748 0.197225 0.7064918
## 
## $p.value
##           two-sided
## Hipertensi  midp.exact fisher.exact  chi.square
##      Ya             NA           NA          NA
##      Tidak 0.002145336  0.003191817 0.002028231
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
## 
## >> Aktivitas: Rendah 
##           Makanan
## Hipertensi Sehat TidakSehat
##      Ya       30         50
##      Tidak    70         50
## $data
##           Makanan
## Hipertensi Sehat TidakSehat Total
##      Ya       30         50    80
##      Tidak    70         50   120
##      Total   100        100   200
## 
## $measure
##           odds ratio with 95% C.I.
## Hipertensi estimate     lower     upper
##      Ya    1.000000        NA        NA
##      Tidak 0.431164 0.2389018 0.7676769
## 
## $p.value
##           two-sided
## Hipertensi  midp.exact fisher.exact  chi.square
##      Ya             NA           NA          NA
##      Tidak 0.004138365  0.005937341 0.003892417
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Interpretasi

Nilai odds ratio pada kedua strata relatif serupa (0.375 dan 0.429), sehingga kita simpulkan:

  • Tidak ada perbedaan besar efek makanan terhadap hipertensi di antara tingkat aktivitas

  • Jenis makanan dan status hipertensi conditionally independent terhadap aktivitas fisik

Namun, untuk kesimpulan kuat bisa digunakan uji homogenitas odds ratio atau uji Breslow-Day.

Uji Homogenitas Odds Ratio (Breslow-Day Test)

Setelah menghitung odds ratio per strata, kita bisa menguji apakah nilai-nilai OR tersebut homogen (tidak berbeda signifikan satu sama lain). Uji ini penting untuk mengetahui apakah ada interaksi antara variabel utama dengan variabel stratifikasi.

Hipotesis

  • H0 (null): Odds ratio homogen antar strata (tidak ada interaksi)

  • H1 (alternatif): Odds ratio tidak homogen antar strata (ada interaksi)

Rumus dan Konsep

Uji Breslow-Day menguji apakah variasi antar odds ratio di berbagai strata lebih besar dari yang diharapkan jika semua strata memiliki OR yang sama.

Digunakan dalam stratifikasi 2x2xK, dan bisa dihitung menggunakan fungsi dari paket vcdExtra.

Perhitungan R

# Gunakan tabel dari sebelumnya
breslow.day.test <- BreslowDayTest(tabel)
breslow.day.test
## 
##  Breslow-Day test on Homogeneity of Odds Ratios
## 
## data:  tabel
## X-squared = 0.092991, df = 1, p-value = 0.7604

Interpretasi Jika nilai p-value > 0.05, maka: - Tidak ada bukti yang cukup untuk menolak H0 - Kesimpulan: odds ratio homogen, indikasi tidak ada interaksi - Maka, conditional independence dapat diasumsikan valid

Jika p-value < 0.05, maka: - Terdapat perbedaan signifikan antar strata - Maka, conditional independence tidak berlaku

7.5 Inferensi Tabel Kontingensi 3 Arah

7.5.1 Independensi Bersyarat dalam Tabel Kontingensi Tiga Arah

Dalam tabel kontingensi 3 arah (misal: A × B × C), independensi bersyarat menyatakan bahwa dua variabel (A dan B) saling bebas jika dikondisikan pada variabel ketiga (C). Artinya, setelah mengontrol efek variabel C, tidak ada hubungan antara A dan B.

Uji Cochran-Mantel-Haenszel (CMH) digunakan untuk menguji apakah hubungan antara dua variabel (A dan B) tetap konsisten dalam setiap level dari variabel ketiga (C), serta untuk mengetahui apakah ada asosiasi bersyarat yang signifikan.

7.5.2 Pengujian Statistik untuk Independensi Bersyarat

Rumus Statistika Cochran-Mantel-Haenszel (CMH)

Untuk tabel-tabel 2×2 sebanyak \(K\) strata:

\[ \chi^2_{CMH} = \frac{\left[ \sum_{k=1}^{K} \left( \frac{a_k d_k - b_k c_k}{n_k} \right) \right]^2} {\sum_{k=1}^{K} \left( \frac{a_k + b_k)(c_k + d_k)(a_k + c_k)(b_k + d_k)}{n_k^2 (n_k - 1)} \right)} \]

Dengan: - \(a_k, b_k, c_k, d_k\): frekuensi dari tabel 2x2 ke-k - \(n_k\): total observasi di strata ke-k

Contoh Soal

Penelitian ini bertujuan untuk mengevaluasi apakah konsumsi gorengan berkaitan dengan penyakit paru-paru, dan apakah hubungan ini tetap signifikan ketika dikendalikan berdasarkan jenis kelamin (L/P).

Tujuan Analisis

  • Mengetahui apakah ada hubungan antara konsumsi gorengan dan penyakit paru-paru.

  • Mengontrol potensi pengganggu dari variabel jenis kelamin menggunakan Uji Mantel-Haenszel.

  • Menginterpretasikan odds ratio dan signifikansi statistik.

Jenis Kelamin Gorengan Penyakit Jumlah
L Sering Ya 35
L Sering Tidak 65
L Tidak Ya 20
L Tidak Tidak 80
P Sering Ya 30
P Sering Tidak 70
P Tidak Ya 15
P Tidak Tidak 85

Perhitungan Manual

# Data masing-masing strata (jenis kelamin)
L <- matrix(c(35, 65, 20, 80), nrow = 2, byrow = TRUE)
P <- matrix(c(30, 70, 15, 85), nrow = 2, byrow = TRUE)

# Fungsi hitung nilai CMH manual
cmh_manual <- function(tables) {
  num <- 0
  denom <- 0
  for (tab in tables) {
    a <- tab[1,1]; b <- tab[1,2]
    c <- tab[2,1]; d <- tab[2,2]
    n <- a + b + c + d

    num <- num + ((a*d - b*c)/n)
    denom <- denom + (((a + b)*(c + d)*(a + c)*(b + d)) / (n^2 * (n - 1)))
  }
  CMH <- (num^2) / denom
  return(CMH)
}

# Hitung nilai chi-square CMH manual
cmh_stat <- cmh_manual(list(L, P))
cmh_stat
## [1] 11.97993

Perhitungan R

# Gabungkan data menjadi array 2x2x2 (baris x kolom x strata)
gorengan_data <- array(c(35, 65, 20, 80,
                         30, 70, 15, 85),
                       dim = c(2, 2, 2),
                       dimnames = list(
                         Penyakit = c("Ya", "Tidak"),
                         Gorengan = c("Sering", "Tidak"),
                         Kelamin = c("L", "P")
                       ))

# Uji CMH
mantelhaen.test(gorengan_data)
## 
##  Mantel-Haenszel chi-squared test with continuity correction
## 
## data:  gorengan_data
## Mantel-Haenszel X-squared = 11.195, df = 1, p-value = 0.0008204
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
##  1.421940 3.644941
## sample estimates:
## common odds ratio 
##          2.276596

Interpretasi Jika nilai p-value < 0.05, maka ada asosiasi antara konsumsi gorengan dan penyakit paru-paru, bahkan setelah mengontrol jenis kelamin (independensi bersyarat ditolak).

Jika p-value > 0.05, maka tidak ada bukti kuat bahwa gorengan memengaruhi penyakit setelah dikontrol jenis kelamin (independensi bersyarat diterima).

7.5.3 Odds Ratio Bersama pada Tabel Kontingensi Tiga Arah

Dalam tabel kontingensi 3 arah (2x2xK), kita ingin mengetahui seberapa kuat hubungan antara dua variabel (misalnya paparan dan penyakit) setelah mengontrol efek variabel ketiga (strata), misalnya jenis kelamin atau usia.
Odds Ratio Bersama (Common Odds Ratio) adalah estimasi keseluruhan odds ratio dari seluruh strata jika diasumsikan homogen.

Penaksiran ini dilakukan dengan statistik Mantel-Haenszel.

Rumus Mantel-Haenszel

Untuk \(K\) tabel 2x2:

\[ \hat{\theta}_{MH} = \frac{ \sum_{k=1}^{K} \frac{a_k d_k}{n_k} }{ \sum_{k=1}^{K} \frac{b_k c_k}{n_k} } \]

dengan: - \(a_k, b_k, c_k, d_k\): sel-sel tabel 2x2 ke-k - \(n_k = a_k + b_k + c_k + d_k\)

Contoh Soal

Ingin menaksir odds ratio bersama antara konsumsi gorengan dan penyakit paru-paru, setelah dikontrol oleh jenis kelamin.

Jenis Kelamin Gorengan Penyakit Jumlah
L Sering Ya 35
L Sering Tidak 65
L Tidak Ya 20
L Tidak Tidak 80
P Sering Ya 30
P Sering Tidak 70
P Tidak Ya 15
P Tidak Tidak 85

Perhitungan Manual (Mantel-Haenszel Estimator)

# Tabel per strata
L <- matrix(c(35, 65, 20, 80), nrow = 2, byrow = TRUE)  # [a, b; c, d]
P <- matrix(c(30, 70, 15, 85), nrow = 2, byrow = TRUE)

# Fungsi OR_MH manual
or_mh <- function(tables) {
  num <- 0
  denom <- 0
  for (tab in tables) {
    a <- tab[1,1]; b <- tab[1,2]
    c <- tab[2,1]; d <- tab[2,2]
    n <- a + b + c + d

    num <- num + (a * d) / n
    denom <- denom + (b * c) / n
  }
  return(num / denom)
}

# Hitung OR bersama
or_mh(list(L, P))
## [1] 2.276596

Perhitungan R

# Gabungkan ke array 3D
gorengan_data <- array(c(35, 65, 20, 80,
                         30, 70, 15, 85),
                       dim = c(2, 2, 2),
                       dimnames = list(
                         Penyakit = c("Ya", "Tidak"),
                         Gorengan = c("Sering", "Tidak"),
                         Kelamin = c("L", "P")
                       ))

# Hitung OR bersama dengan epitools
library(epitools)
mantel_result <- mantelhaen.test(gorengan_data)
mantel_result
## 
##  Mantel-Haenszel chi-squared test with continuity correction
## 
## data:  gorengan_data
## Mantel-Haenszel X-squared = 11.195, df = 1, p-value = 0.0008204
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
##  1.421940 3.644941
## sample estimates:
## common odds ratio 
##          2.276596

Interpretasi - Nilai odds ratio bersama (common OR) menggambarkan kekuatan asosiasi antara gorengan dan penyakit setelah mengontrol jenis kelamin. - Jika OR > 1, artinya konsumsi gorengan meningkatkan risiko penyakit. - Jika p-value < 0.05, maka hubungan tersebut signifikan secara statistik. - Penaksiran ini mengasumsikan homogenitas odds ratio antar strata

7.5.4 Uji Homogenitas Odds Ratio dengan Statistik Breslow-Day

Pengertian: Uji Homogenitas Odds Ratio dengan Statistik Breslow-Day digunakan untuk menguji apakah OR (Odds Ratio) dari beberapa strata (lapisan) dalam tabel kontingensi 3 arah (misalnya: Treatment x Outcome x Strata seperti Jenis Kelamin atau Usia) adalah sama.

Dengan kata lain, uji ini memeriksa apakah terdapat interaksi antara strata dengan dua variabel utama (treatment dan outcome).

Hipotesis: H0: OR adalah homogen di seluruh strata (tidak ada interaksi). H1: OR tidak homogen di seluruh strata (ada interaksi).

Rumus Statistik Breslow-Day: BD = ∑ [ (O_11k - E_11k)^2 / V_11k ] untuk setiap strata k di mana: O_11k = frekuensi observasi sel (1,1) pada strata k E_11k = ekspektasi frekuensi sel (1,1) berdasarkan OR gabungan V_11k = variansi dari E_11k Statistik ini mengikuti distribusi chi-square dengan (K - 1) derajat bebas (K = jumlah strata)

Contoh Soal

Misalkan kita punya data efek dari dua jenis terapi terhadap kesembuhan, terstratifikasi berdasarkan jenis kelamin.

Data dalam format array 2x2x2 (Treatment x Outcome x Strata) Dimensi: [Treatment, Outcome, Gender] Treatment: 1 = A, 2 = B Outcome: 1 = Sembuh, 2 = Tidak Sembuh Gender: 1 = Pria, 2 = Wanita

data_array <- array(c(
  30, 20,   # Pria, Terapi A
  20, 30,   # Pria, Terapi B
  25, 25,   # Wanita, Terapi A
  25, 25    # Wanita, Terapi B
), dim = c(2, 2, 2), dimnames = list(
  Treatment = c("A", "B"),
  Outcome = c("Sembuh", "Tidak_Sembuh"),
  Gender = c("Pria", "Wanita")
))

Perhitungan Odds Ratio per strata (manual): OR_Pria = (3030)/(2020) = 900/400 = 2.25 OR_Wanita = (2525)/(2525) = 625/625 = 1

Kita ingin menguji apakah OR_Pria dan OR_Wanita berbeda secara signifikan.

Perhitungan R:

library(vcdExtra)
## Warning: package 'vcdExtra' was built under R version 4.3.3
## Loading required package: vcd
## Warning: package 'vcd' was built under R version 4.3.3
## Loading required package: grid
## 
## Attaching package: 'vcd'
## The following object is masked from 'package:epitools':
## 
##     oddsratio
## Loading required package: gnm
## Warning: package 'gnm' was built under R version 4.3.3
## 
## Attaching package: 'vcdExtra'
## The following object is masked from 'package:epitools':
## 
##     expand.table
## The following object is masked from 'package:dplyr':
## 
##     summarise
bd_result <- BreslowDayTest(data_array)
bd_result
## 
##  Breslow-Day test on Homogeneity of Odds Ratios
## 
## data:  data_array
## X-squared = 2.02, df = 1, p-value = 0.1552

Interpretasi: - Jika nilai p-value < 0.05, maka kita tolak H0 → OR tidak homogen → Ada interaksi antara strata dengan efek treatment terhadap outcome. - Jika p-value ≥ 0.05, maka kita gagal tolak H0 → OR dianggap homogen → Efek treatment seragam di semua strata.

8 GERERALIZED LINEAR MODEL (GLM)

Generalized Linear Model (GLM) adalah perluasan dari model regresi linear klasik yang memungkinkan variabel respon memiliki distribusi non-normal, seperti binomial, Poisson, atau gamma.

GLM terdiri dari tiga komponen utama: 1. Distribusi dari family eksponensial (exponential family) 2. Fungsi link: menghubungkan ekspektasi respon ke kombinasi linear prediktor 3. Fungsi linear prediktor: \(\eta = \beta_0 + \beta_1 X_1 + \cdots + \beta_p X_p\)

Rumus Umum GLM

Model GLM dapat ditulis sebagai: \[ g(\mu_i) = \eta_i = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} \] dengan: - \(\mu_i = E(Y_i)\): ekspektasi dari respon - \(g(\cdot)\): fungsi link - \(\eta_i\): linear predictor

8.1 Exponential Family dan Regresi Logistik

Exponential Family

Distribusi termasuk dalam keluarga eksponensial jika dapat ditulis dalam bentuk: \[ f(y; \theta, \phi) = \exp \left\{ \frac{y\theta - b(\theta)}{\phi} + c(y, \phi) \right\} \]

Contoh distribusi dalam exponential family: - Binomial → regresi logistik - Poisson → regresi poisson - Normal → regresi linear klasik

8.2 Model Regresi Logistik

Model regresi logistik digunakan saat respon bersifat biner (0/1), seperti sukses/gagal atau sakit/sehat.

Model logistik: \[ \text{logit}(\pi) = \log\left(\frac{\pi}{1 - \pi}\right) = \beta_0 + \beta_1 X \]

Dengan \(\pi\) adalah probabilitas respon sukses.

Contoh Soal

Misalkan sebuah studi ingin melihat apakah konsumsi gorengan (Sering/Tidak) memengaruhi kejadian sakit tenggorokan (Ya/Tidak).

Gorengan Penyakit Jumlah
Sering Ya 60
Sering Tidak 90
Tidak Ya 35
Tidak Tidak 115

Perhitungan Manual (Odds dan logit)

Odds untuk Sering: \[ \text{Odds}_{Sering} = \frac{60}{90} = 0.667 \]

Odds untuk Tidak: \[ \text{Odds}_{Tidak} = \frac{35}{115} = 0.304 \]

Odds Ratio: \[ OR = \frac{60/90}{35/115} = \frac{0.667}{0.304} \approx 2.2 \]

Logit model: \[ \log\left(\frac{\pi}{1 - \pi}\right) = \beta_0 + \beta_1 \cdot X \]

Perhitungan di R

# Buat data biner
data <- data.frame(
  Gorengan = rep(c("Sering", "Tidak"), each = 2),
  Penyakit = c(1, 0, 1, 0),
  Jumlah = c(60, 90, 35, 115)
)

# Ubah ke format biner
expanded <- data[rep(1:nrow(data), data$Jumlah), ]
expanded$Gorengan <- factor(expanded$Gorengan)
expanded$Y <- ifelse(expanded$Penyakit == 1, 1, 0)

# Model regresi logistik
fit <- glm(Y ~ Gorengan, data = expanded, family = binomial)
summary(fit)
## 
## Call:
## glm(formula = Y ~ Gorengan, family = binomial, data = expanded)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)   
## (Intercept)    -0.4055     0.1667  -2.433  0.01498 * 
## GorenganTidak  -0.7841     0.2550  -3.075  0.00211 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 374.60  on 299  degrees of freedom
## Residual deviance: 364.89  on 298  degrees of freedom
## AIC: 368.89
## 
## Number of Fisher Scoring iterations: 4
# Odds Ratio
exp(coef(fit))
##   (Intercept) GorenganTidak 
##     0.6666667     0.4565217

Interpretasi - Koefisien logistik menunjukkan log-odds dari kejadian sakit tenggorokan. - Nilai OR = exp(β1) ≈ 2.2 artinya: Konsumsi gorengan secara signifikan meningkatkan kemungkinan sakit tenggorokan sekitar 2.2 kali lipat dibanding yang tidak makan gorengan. - Jika p-value < 0.05 untuk koefisien, maka hubungan signifikan secara statistik.

Catatan Tambahan GLM sangat fleksibel untuk berbagai jenis data. Jika data berdistribusi binomial → gunakan family = binomial.

8.3 Model Regresi Poisson

Pengertian

Regresi Poisson adalah salah satu bentuk Generalized Linear Model (GLM) yang digunakan untuk memodelkan data cacahan (count data), yaitu data berupa jumlah kejadian dalam interval waktu atau ruang tertentu.

Model ini digunakan jika: - Respon (Y) berupa bilangan bulat ≥ 0 - Nilai ekspektasi E(Y) ≈ varians (fitur distribusi Poisson)

Struktur Model

GLM untuk distribusi Poisson terdiri dari: 1. Distribusi: \(Y_i \sim \text{Poisson}(\lambda_i)\) 2. Link function: Fungsi log 3. Linear predictor: \[ \log(\lambda_i) = \beta_0 + \beta_1 X_{i1} + \cdots + \beta_p X_{ip} \]

Contoh Soal

Misalkan kita ingin memodelkan jumlah pasien yang datang ke klinik berdasarkan jumlah hari promosi dilakukan:

Hari Promosi Jumlah Pasien
0 5
1 9
2 12
3 18
4 25

Apakah hari promosi memengaruhi jumlah pasien yang datang?

Perhitungan Manual

Misalnya kita ingin menyesuaikan model:

\[ \log(\lambda) = \beta_0 + \beta_1 X \]

Dari data, kita bisa log-transform jumlah pasien untuk mendekati model linear:

hari <- 0:4
pasien <- c(5, 9, 12, 18, 25)
log_pasien <- log(pasien)

# Perkiraan regresi linear biasa untuk log(y)
fit_lm <- lm(log_pasien ~ hari)
summary(fit_lm)
## 
## Call:
## lm(formula = log_pasien ~ hari)
## 
## Residuals:
##         1         2         3         4         5 
## -0.088321  0.108264  0.004743  0.019006 -0.043692 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.69776    0.06605   25.70 0.000129 ***
## hari         0.39120    0.02697   14.51 0.000710 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.08527 on 3 degrees of freedom
## Multiple R-squared:  0.9859, Adjusted R-squared:  0.9813 
## F-statistic: 210.5 on 1 and 3 DF,  p-value: 0.0007101

Ini memberikan perkiraan awal: 𝛽^0 = intercept 𝛽^1 = slope dari hari promosi

# Buat data frame
data <- data.frame(
  Hari = 0:4,
  Pasien = c(5, 9, 12, 18, 25)
)

# Model regresi Poisson
fit <- glm(Pasien ~ Hari, data = data, family = poisson())
summary(fit)
## 
## Call:
## glm(formula = Pasien ~ Hari, family = poisson(), data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  1.73435    0.27918   6.212 5.22e-10 ***
## Hari         0.37639    0.09294   4.050 5.13e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 18.07509  on 4  degrees of freedom
## Residual deviance:  0.17085  on 3  degrees of freedom
## AIC: 25.843
## 
## Number of Fisher Scoring iterations: 3
# Prediksi nilai lambda
data$Prediksi <- predict(fit, type = "response")
data
##   Hari Pasien  Prediksi
## 1    0      5  5.665246
## 2    1      9  8.254313
## 3    2     12 12.026605
## 4    3     18 17.522867
## 5    4     25 25.530969

Interpretasi - Koefisien Intercept (β₀) merepresentasikan log-rata-rata pasien saat Hari = 0 - Koefisien Hari (β₁) mengindikasikan seberapa besar log-pasien meningkat tiap tambahan 1 hari promosi - Jika p-value < 0.05, maka variabel hari berpengaruh signifikan - Nilai exp(β1) menunjukkan faktor pengali terhadap jumlah pasien tiap hari promosi bertambah satu

Visualisasi

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
ggplot(data, aes(x = Hari, y = Pasien)) +
  geom_point(size = 3) +
  geom_line(aes(y = Prediksi), color = "blue", size = 1) +
  labs(title = "Regresi Poisson: Hari Promosi vs Jumlah Pasien",
       y = "Pasien", x = "Hari Promosi") +
  theme_minimal()
## 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.

Catatan Tambahan Jika varians data jauh lebih besar dari mean, pertimbangkan model quasi-Poisson atau negatif binomial.

Bisa menambahkan offset untuk memodelkan rate (laju) dalam GLM Poisson.

9 INFERENSI GLM

Generalized Linear Model (GLM) adalah model statistik yang memperluas regresi linear klasik agar bisa digunakan untuk data dari keluarga distribusi eksponensial (contoh: binomial, Poisson, normal).

Dalam GLM, kita tertarik untuk: - Menentukan ekspektasi (E[Y]) - Menentukan varians (Var[Y]) - Menaksir parameter \(\beta\) dengan metode Maximum Likelihood Estimation (MLE)

Struktur Umum GLM

Komponen GLM: 1. Random component: Distribusi respon \(Y \in \text{Exponential Family}\) 2. Systematic component: Fungsi linear \(\eta = X \beta\) 3. Link function: Menghubungkan \(\mu = E[Y]\) ke \(\eta\)

9.1 Mencari Ekspektasi dan Varians dalam GLM

Ekspektasi dan Varians

Dalam exponential family, fungsi distribusi: \[ f(y;\theta,\phi) = \exp \left\{ \frac{y\theta - b(\theta)}{\phi} + c(y, \phi) \right\} \]

Maka: - Ekspektasi:
\[ \mathbb{E}[Y] = b'(\theta) \] - Varians: \[ \mathbb{V}[Y] = \phi b''(\theta) \]

Contoh Soal

Sebuah studi mengamati jumlah kecelakaan per hari di sebuah simpang jalan selama 5 hari:

Hari Kecelakaan
1 3
2 2
3 4
4 5
5 6

Anggap bahwa data berdistribusi Poisson.

Perhitungan Manual

Karena \(Y \sim \text{Poisson}(\lambda)\), maka:

  • \(\mathbb{E}[Y] = \lambda\)
  • \(\mathbb{V}[Y] = \lambda\)

Link function: \[ \log(\lambda) = \beta_0 + \beta_1 \cdot \text{Hari} \]

Transformasi log jumlah kecelakaan:

hari <- 1:5
kecelakaan <- c(3, 2, 4, 5, 6)
log_kec <- log(kecelakaan)

# Regresi linear awal
lm(log_kec ~ hari)
## 
## Call:
## lm(formula = log_kec ~ hari)
## 
## Coefficients:
## (Intercept)         hari  
##      0.6251       0.2303

Perhitungan R

# Data frame
data <- data.frame(Hari = 1:5, Kecelakaan = c(3, 2, 4, 5, 6))

# Model GLM dengan distribusi Poisson
model <- glm(Kecelakaan ~ Hari, family = poisson(link = "log"), data = data)
summary(model)
## 
## Call:
## glm(formula = Kecelakaan ~ Hari, family = poisson(link = "log"), 
##     data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)   0.6436     0.6069   1.060    0.289
## Hari          0.2301     0.1636   1.407    0.159
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 2.59834  on 4  degrees of freedom
## Residual deviance: 0.55058  on 3  degrees of freedom
## AIC: 20.56
## 
## Number of Fisher Scoring iterations: 4
# Ekspektasi prediksi
data$Ekspektasi <- predict(model, type = "response")

# Varians (untuk Poisson = ekspektasi)
data$Varians <- data$Ekspektasi

data
##   Hari Kecelakaan Ekspektasi  Varians
## 1    1          3   2.395750 2.395750
## 2    2          2   3.015650 3.015650
## 3    3          4   3.795950 3.795950
## 4    4          5   4.778152 4.778152
## 5    5          6   6.014499 6.014499

Interpretasi - Koefisien model diperoleh dengan Maximum Likelihood Estimation (MLE) - Nilai ekspektasi sesuai dengan hasil prediksi μ^i - Varians untuk distribusi Poisson sama dengan ekspektasi - Jika model sesuai (p-value signifikan, deviance rendah), maka model bisa digunakan untuk prediksi jumlah kejadian

Catatan Tambahan - Untuk distribusi lain (misalnya binomial), ekspektasi dan varians akan berbeda. - Link function sangat memengaruhi bentuk hubungan antara prediktor dan ekspektasi.

9.2 Diagnostik dan Estimasi Regresi Logistik

Regresi logistik merupakan bagian dari Generalized Linear Model (GLM) untuk memodelkan data dengan respon biner (0/1). Inferensi dan estimasi dalam regresi logistik melibatkan:

  1. Penaksiran parameter dengan Maximum Likelihood Estimation (MLE)
  2. Diagnostik model untuk menilai kesesuaian model
  3. Inferensi statistik terhadap parameter

Struktur Model Regresi Logistik

Model logistik untuk data biner:

\[ \text{logit}(\pi_i) = \log\left( \frac{\pi_i}{1 - \pi_i} \right) = \eta_i = \beta_0 + \beta_1 x_i \]

di mana: - \(\pi_i = P(Y_i = 1 \mid x_i)\) - \(\eta_i\): linear predictor

Estimasi Parameter: Maximum Likelihood

Likelihood Function: \[ L(\beta) = \prod_{i=1}^n \pi_i^{y_i}(1 - \pi_i)^{1 - y_i} \]

Log-likelihood: \[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \]

Estimasi parameter \(\beta\) dicari dengan maksimalisasi log-likelihood, diselesaikan via Iteratively Reweighted Least Squares (IRLS) oleh fungsi glm().

Diagnostik Model

  1. Deviance: mengukur goodness-of-fit \[ D = 2 \times [\ell_{\text{sat}} - \ell_{\text{model}}] \]
  2. AIC (Akaike Information Criterion): trade-off antara fit dan kompleksitas
  3. Pseudo-\(R^2\): alternatif \(R^2\) untuk model logistik
  4. Residual deviance vs null deviance: digunakan untuk uji keberartian model
  5. Hosmer-Lemeshow test (opsional): goodness-of-fit

Contoh Soal

Sebuah studi mengamati apakah konsumsi gorengan memengaruhi kemungkinan terkena sakit tenggorokan:

Gorengan Penyakit Jumlah
Sering Ya 45
Sering Tidak 55
Tidak Ya 20
Tidak Tidak 80

Perhitungan Manual Odds dan Logit

# Odds untuk Sering
odds_sering <- 45 / 55

# Odds untuk Tidak
odds_tidak <- 20 / 80

# Odds Ratio
OR <- odds_sering / odds_tidak
log_OR <- log(OR)

cat("Odds Ratio:", round(OR, 2), "\nLog Odds Ratio:", round(log_OR, 2), "\n")
## Odds Ratio: 3.27 
## Log Odds Ratio: 1.19

Perhitungan R

# Membuat data biner
data <- data.frame(
  Gorengan = rep(c("Sering", "Tidak"), each = 2),
  Penyakit = c(1, 0, 1, 0),
  Jumlah = c(45, 55, 20, 80)
)

# Ekspansi ke data biner
long_data <- data[rep(1:nrow(data), data$Jumlah), ]
long_data$Y <- long_data$Penyakit
long_data$Gorengan <- factor(long_data$Gorengan)

# Model regresi logistik
fit <- glm(Y ~ Gorengan, data = long_data, family = binomial)
summary(fit)
## 
## Call:
## glm(formula = Y ~ Gorengan, family = binomial, data = long_data)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -0.2007     0.2010  -0.998 0.318122    
## GorenganTidak  -1.1856     0.3208  -3.696 0.000219 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 252.23  on 199  degrees of freedom
## Residual deviance: 237.71  on 198  degrees of freedom
## AIC: 241.71
## 
## Number of Fisher Scoring iterations: 4
# Odds ratio
exp(coef(fit))
##   (Intercept) GorenganTidak 
##     0.8181818     0.3055556

Diagnostik Model di R

# Residual deviance dan null deviance
cat("Null Deviance:", fit$null.deviance, "\n")
## Null Deviance: 252.2324
cat("Residual Deviance:", fit$deviance, "\n")
## Residual Deviance: 237.7082
# AIC
cat("AIC:", AIC(fit), "\n")
## AIC: 241.7082
# Pseudo R-squared (McFadden)
library(pscl)
## Warning: package 'pscl' was built under R version 4.3.3
## Classes and Methods for R originally developed in the
## Political Science Computational Laboratory
## Department of Political Science
## Stanford University (2002-2015),
## by and under the direction of Simon Jackman.
## hurdle and zeroinfl functions by Achim Zeileis.
pR2(fit)
## fitting null model for pseudo-r2
##           llh       llhNull            G2      McFadden          r2ML 
## -118.85412373 -126.11620568   14.52416390    0.05758246    0.07004662 
##          r2CU 
##    0.09773827

Interpretasi - Koefisien signifikan (p-value < 0.05) → konsumsi gorengan berpengaruh terhadap risiko sakit - Odds Ratio > 1 → konsumsi gorengan meningkatkan peluang sakit - Residual deviance < null deviance secara signifikan → model cocok - AIC lebih kecil → model lebih baik Pseudo-R² mendekati 1 → model menjelaskan variabilitas data dengan baik

Catatan Tambahan - Model logistik mengasumsikan hubungan linier antara logit dan prediktor - Diagnostik penting dilakukan untuk mencegah misinterpretasi model

9.3 Regresi Poisson (Estimasi dan Inferensi)

Regresi Poisson merupakan salah satu bentuk dari Generalized Linear Model (GLM) yang digunakan ketika data berupa cacahan (count data), seperti jumlah kejadian, pelanggan, atau penyakit dalam satuan waktu/ruang tertentu.

Model ini cocok jika: - Nilai respon \(Y \in \{0, 1, 2, \dots\}\) - Varian ≈ rata-rata (fitur distribusi Poisson)

Rumus Model Regresi Poisson

Komponen GLM: - Distribusi: \(Y_i \sim \text{Poisson}(\lambda_i)\) - Link function: log-link → \(\log(\lambda_i) = \eta_i = X_i \beta\) - Ekspektasi: \(\mathbb{E}[Y_i] = \lambda_i\) - Varians: \(\mathbb{V}[Y_i] = \lambda_i\)

Metode Estimasi: Maximum Likelihood

Fungsi likelihood untuk data Poisson:

\[ L(\beta) = \prod_{i=1}^n \frac{e^{-\lambda_i} \lambda_i^{y_i}}{y_i!}, \quad \lambda_i = e^{\eta_i} = e^{X_i \beta} \]

Log-likelihood:

\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\lambda_i) - \lambda_i - \log(y_i!) \right] \]

Parameter \(\beta\) ditaksir dengan maksimalisasi log-likelihood, menggunakan iteratively reweighted least squares (IRLS).

Contoh Soal

Seorang peneliti mencatat jumlah pelanggan per hari selama seminggu, beserta total pengeluaran iklan di media sosial:

Hari Iklan (juta rupiah) Pelanggan
1 1.0 3
2 1.5 4
3 2.0 6
4 2.5 8
5 3.0 9
6 3.5 11
7 4.0 13

Perhitungan Manual

Asumsi model: \[ \log(\lambda_i) = \beta_0 + \beta_1 \cdot \text{Iklan}_i \Rightarrow \lambda_i = e^{\beta_0 + \beta_1 \cdot \text{Iklan}_i} \]

Transformasi log:

iklan <- c(1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0)
pelanggan <- c(3, 4, 6, 8, 9, 11, 13)

log_pelanggan <- log(pelanggan)
lm(log_pelanggan ~ iklan)
## 
## Call:
## lm(formula = log_pelanggan ~ iklan)
## 
## Coefficients:
## (Intercept)        iklan  
##      0.7117       0.4877

Perhitungan R

# Data frame
data <- data.frame(
  Hari = 1:7,
  Iklan = c(1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0),
  Pelanggan = c(3, 4, 6, 8, 9, 11, 13)
)

# Model Poisson GLM
fit <- glm(Pelanggan ~ Iklan, data = data, family = poisson(link = "log"))
summary(fit)
## 
## Call:
## glm(formula = Pelanggan ~ Iklan, family = poisson(link = "log"), 
##     data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)   
## (Intercept)   0.8085     0.4463   1.812  0.07001 . 
## Iklan         0.4535     0.1448   3.132  0.00174 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 10.79465  on 6  degrees of freedom
## Residual deviance:  0.35708  on 5  degrees of freedom
## AIC: 30.93
## 
## Number of Fisher Scoring iterations: 4
# Prediksi ekspektasi pelanggan
data$Prediksi <- predict(fit, type = "response")
data
##   Hari Iklan Pelanggan  Prediksi
## 1    1   1.0         3  3.532726
## 2    2   1.5         4  4.431910
## 3    3   2.0         6  5.559963
## 4    4   2.5         8  6.975139
## 5    5   3.0         9  8.750519
## 6    6   3.5        11 10.977785
## 7    7   4.0        13 13.771958

Interpretasi - Koefisien intercept (β₀) menunjukkan log-rata-rata pelanggan saat iklan = 0 - Koefisien iklan (β₁) menunjukkan efek log-linier dari iklan terhadap pelanggan - exp(β1) menyatakan faktor pengali pelanggan untuk setiap kenaikan 1 juta pada iklan - p-value < 0.05 → iklan berpengaruh signifikan

10 REGRESI LOGISTIK DENGAN PREDIKTOR NOMINAL, ORDINAL, DAN RASIO

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## Warning: package 'readr' was built under R version 4.3.3
## Warning: package 'stringr' was built under R version 4.3.3
## Warning: package 'forcats' was built under R version 4.3.3
## Warning: package 'lubridate' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.4     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ✔ readr     2.1.5     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter()       masks stats::filter()
## ✖ dplyr::lag()          masks stats::lag()
## ✖ vcdExtra::summarise() masks dplyr::summarise()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(broom)
## Warning: package 'broom' was built under R version 4.3.3
library(knitr)
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.3.3
## 
## Attaching package: 'kableExtra'
## 
## The following object is masked from 'package:dplyr':
## 
##     group_rows
set.seed(123)

Regresi logistik adalah salah satu metode statistik yang digunakan untuk memodelkan hubungan antara satu variabel respons biner (dengan dua kategori, seperti sukses/gagal atau ya/tidak) dan satu atau lebih variabel prediktor. Metode ini sangat berguna ketika variabel respons tidak memenuhi asumsi normalitas seperti pada regresi linier klasik.

Dalam regresi logistik, hasil yang diprediksi adalah probabilitas terjadinya suatu kejadian. Model ini menggunakan fungsi logit (log odds) untuk menghubungkan prediktor dengan probabilitas kejadian:

prediktor dengan probabilitas kejadian:

\[ \text{logit}(p) = \log\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k \]

Prediktor yang digunakan dalam regresi logistik dapat berupa:

10.1 Simulasi Data

n <- 500
gender <- sample(c("Male", "Female"), n, replace = TRUE)
education <- sample(c("HighSchool", "Bachelor", "Master", "PhD"), n, replace = TRUE, prob = c(0.4, 0.3, 0.2, 0.1))
income <- rnorm(n, mean = 50, sd = 15)

logit_p <- -1 + 0.6 * (gender == "Female") + 0.9 * as.numeric(factor(education, ordered=TRUE)) + 0.04 * income
p <- 1 / (1 + exp(-logit_p))
success <- rbinom(n, 1, p)

sim_data <- tibble(success, gender, education, income)
kable(head(sim_data))
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
success gender education income
1 Male HighSchool 40.97161
1 Male HighSchool 35.09452
1 Male HighSchool 65.40178
1 Female HighSchool 61.26592
1 Male HighSchool 27.36250
1 Female HighSchool 48.57279

10.2 Eksplorasi Data

sim_data %>%
  count(gender, education, success) %>%
  pivot_wider(names_from = success, values_from = n, values_fill = 0)
## # A tibble: 8 × 4
##   gender education    `0`   `1`
##   <chr>  <chr>      <int> <int>
## 1 Female Bachelor       8    67
## 2 Female HighSchool     2    94
## 3 Female Master         1    52
## 4 Female PhD            0    15
## 5 Male   Bachelor       9    69
## 6 Male   HighSchool     7    92
## 7 Male   Master         1    54
## 8 Male   PhD            1    28

10.3 Model dengan Prediktor Ordinal sebagai Nominal (Dummy)

sim_data_nominal <- sim_data %>%
  mutate(education = factor(education, levels = c("HighSchool", "Bachelor", "Master", "PhD")))

model_nominal <- glm(success ~ gender + education + income, data = sim_data_nominal, family = binomial)

# Output tabel aman untuk semua format
tbl_nominal <- tidy(model_nominal)

if (knitr::is_latex_output()) {
  kable(tbl_nominal, format = "latex", digits = 4, booktabs = TRUE)
} else {
  kable(tbl_nominal, digits = 4) %>% kable_styling(full_width = FALSE)
}
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
term estimate std.error statistic p.value
(Intercept) 2.1034 0.7089 2.9672 0.0030
genderMale -0.5115 0.4021 -1.2721 0.2033
educationBachelor -0.9551 0.4304 -2.2194 0.0265
educationMaster 0.9654 0.7930 1.2173 0.2235
educationPhD 0.8058 1.0727 0.7512 0.4525
income 0.0255 0.0129 1.9708 0.0488

Interpretasi: Dengan perlakuan dummy, setiap kategori dari education dibandingkan dengan referensi dasar (HighSchool). Koefisien menggambarkan log odds relatif terhadap referensi. Misalnya, koefisien positif untuk Bachelor berarti bahwa peluang sukses lebih besar dibanding lulusan HighSchool, dengan asumsi variabel lain konstan.

10.4 Model dengan Prediktor Ordinal sebagai Numeric Rank

sim_data_numeric <- sim_data %>%
  mutate(education_numeric = as.numeric(factor(education, levels = c("HighSchool", "Bachelor", "Master", "PhD"))))

model_numeric <- glm(success ~ gender + education_numeric + income, data = sim_data_numeric, family = binomial)

tbl_numeric <- tidy(model_numeric)

if (knitr::is_latex_output()) {
  kable(tbl_numeric, format = "latex", digits = 4, booktabs = TRUE)
} else {
  kable(tbl_numeric, digits = 4) %>% kable_styling(full_width = FALSE)
}
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
term estimate std.error statistic p.value
(Intercept) 1.4389 0.7494 1.9201 0.0548
genderMale -0.4865 0.3970 -1.2253 0.2205
education_numeric 0.2210 0.2084 1.0604 0.2890
income 0.0253 0.0129 1.9562 0.0504

Interpretasi: Dengan menganggap education sebagai numeric, model mengasumsikan bahwa jarak antar tingkat pendidikan sama. Koefisien pendidikan kini mewakili perubahan log odds untuk setiap kenaikan satu tingkat pendidikan.

10.5 Visualisasi Prediksi

sim_data_nominal <- sim_data_nominal %>%
  mutate(predicted = predict(model_nominal, type = "response"))

ggplot(sim_data_nominal, aes(x = income, y = predicted, color = education)) +
  geom_point(alpha = 0.5) +
  labs(title = "Prediksi Probabilitas (Ordinal sebagai Dummy)", x = "Income", y = "Probabilitas") +
  theme_minimal()

sim_data_numeric <- sim_data_numeric %>%
  mutate(predicted = predict(model_numeric, type = "response"))

ggplot(sim_data_numeric, aes(x = income, y = predicted, color = as.factor(education_numeric))) +
  geom_point(alpha = 0.5) +
  labs(title = "Prediksi Probabilitas (Ordinal sebagai Numeric)", x = "Income", y = "Probabilitas") +
  theme_minimal()

10.6 Goodness of Fit: McFadden’s R²

nullmod <- glm(success ~ 1, data = sim_data, family = binomial)
r2_nominal <- 1 - (logLik(model_nominal)/logLik(nullmod))
r2_numeric <- 1 - (logLik(model_numeric)/logLik(nullmod))

rbind(
  Nominal = r2_nominal,
  Numeric = r2_numeric
) %>% round(4)
##           [,1]
## Nominal 0.0801
## Numeric 0.0283

Interpretasi: McFadden’s R² merupakan ukuran kebaikan model regresi logistik. Nilai mendekati 1 menunjukkan model yang lebih baik dalam menjelaskan variabilitas data dibanding model null.

10.7 Kesimpulan

Regresi logistik merupakan alat penting dalam analisis data kategori dengan variabel respons biner. Dalam bab ini, kita telah melihat bahwa: - Variabel prediktor dapat bersifat nominal, ordinal, maupun rasio. - Variabel ordinal dapat diperlakukan sebagai dummy (tanpa asumsi urutan) atau numeric (dengan asumsi urutan berjarak sama). - Pemilihan perlakuan terhadap prediktor ordinal akan memengaruhi interpretasi model dan kesimpulan yang diambil. - Visualisasi dan evaluasi model (seperti McFadden R²) penting untuk menilai kecocokan model terhadap data.

11 PEMILIHAN MODEL REGRESI LOGISTIK DAN EVALUASI

knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
library(broom)
library(pROC)
## Warning: package 'pROC' was built under R version 4.3.3
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following object is masked from 'package:gmodels':
## 
##     ci
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
library(ResourceSelection)
## Warning: package 'ResourceSelection' was built under R version 4.3.3
## ResourceSelection 0.3-6   2023-06-27

Model regresi logistik digunakan untuk memodelkan hubungan antara satu atau lebih variabel prediktor (bebas) dengan variabel respon biner (bernilai 0 atau 1). Regresi logistik sangat penting ketika: - Data respons bersifat kategorik dua nilai (contoh: sakit/tidak, lulus/gagal, beli/tidak beli). - Tujuan penelitian adalah untuk memprediksi probabilitas dari satu kejadian.

Ciri khas regresi logistik: - Menggunakan fungsi logit:\[ \text{logit}(p) = \log\left(\frac{p}{1 - p}\right) = \beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k \] - Probabilitas kejadian dibatasi antara 0 dan 1. - Koefisien diinterpretasi sebagai log odds dan dapat dikonversi ke odds ratio.

11.1 Tujuan Pemilihan Model

  1. model terbaik untuk memprediksi outcome.
  2. Menghindari overfitting dengan memilih model yang parsimonious.
  3. Mengevaluasi prediksi menggunakan metrik evaluasi seperti:
  • ROC Curve dan AUC
  • Tabel klasifikasi (akurasi, sensitivitas, spesifisitas)
  • Pseudo R-squared
  • Likelihood Ratio Test

11.2 Contoh

Misalkan seorang peneliti ingin memprediksi apakah pasien berisiko mengalami penyakit jantung berdasarkan: - Usia (variabel numerik) - Jenis_Kelamin (faktor: L/P) - Perokok (faktor: Ya/Tidak)

set.seed(123)
n <- 200
data <- tibble(
  Penyakit = rbinom(n, 1, 0.4),
  Usia = rnorm(n, 50, 10),
  Jenis_Kelamin = sample(c("L", "P"), n, replace = TRUE),
  Perokok = sample(c("Ya", "Tidak"), n, replace = TRUE)
) %>%
  mutate(Jenis_Kelamin = factor(Jenis_Kelamin),
         Perokok = factor(Perokok))

11.3 Pemodelan Awal: Full Model

model_full <- glm(Penyakit ~ Usia + Jenis_Kelamin + Perokok,
                  data = data, family = binomial)
summary(model_full)
## 
## Call:
## glm(formula = Penyakit ~ Usia + Jenis_Kelamin + Perokok, family = binomial, 
##     data = data)
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)
## (Intercept)     0.69718    0.82647   0.844    0.399
## Usia           -0.01891    0.01547  -1.222    0.222
## Jenis_KelaminP  0.02476    0.29277   0.085    0.933
## PerokokYa      -0.41950    0.29402  -1.427    0.154
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 267.50  on 199  degrees of freedom
## Residual deviance: 264.22  on 196  degrees of freedom
## AIC: 272.22
## 
## Number of Fisher Scoring iterations: 4

11.4 Interpretasi Koefisien

exp(coef(model_full))
##    (Intercept)           Usia Jenis_KelaminP      PerokokYa 
##      2.0080742      0.9812694      1.0250684      0.6573780
  • Koefisien positif: meningkatkan odds terkena penyakit.
  • Koefisien negatif: menurunkan odds.
  • Odds Ratio > 1: variabel meningkatkan risiko.
  • Odds Ratio < 1: variabel bersifat pelindung.

11.5 Evaluasi Model : ROC Curve dan AUC

roc_obj <- roc(data$Penyakit, fitted(model_full))
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj, main = "ROC Curve")

auc(roc_obj)
## Area under the curve: 0.58
  • ROC mengukur trade-off antara sensitivitas dan 1-spesifisitas.
  • AUC > 0.7 menunjukkan model cukup baik.

11.6 Pseudo R-squared

null_model <- glm(Penyakit ~ 1, data = data, family = binomial)
1 - logLik(model_full)/logLik(null_model)
## 'log Lik.' 0.01227384 (df=4)
  • McFadden R² antara 0.2-0.4 dianggap baik.

11.7 Tabel Klasifikasi

pred_class <- ifelse(fitted(model_full) > 0.5, 1, 0)
table(Prediksi = pred_class, Realita = data$Penyakit)
##         Realita
## Prediksi   0   1
##        0 117  73
##        1   5   5

Hitung: -Akurasi = (TP + TN) / total - Sensitivitas = TP / (TP + FN) - Spesifisitas = TN / (TN + FP)

11.8 Uji Likelihood Ratio

anova(null_model, model_full, test = "Chisq")
## Analysis of Deviance Table
## 
## Model 1: Penyakit ~ 1
## Model 2: Penyakit ~ Usia + Jenis_Kelamin + Perokok
##   Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1       199     267.50                     
## 2       196     264.22  3   3.2832     0.35
  • Jika p-value < 0.05, model full signifikan lebih baik dari model tanpa prediktor.

11.9 Stepwise Model Selection

model_step <- step(null_model, scope = list(lower = null_model, upper = model_full),
                   direction = "both", trace = FALSE)
summary(model_step)
## 
## Call:
## glm(formula = Penyakit ~ 1, family = binomial, data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)   
## (Intercept)  -0.4473     0.1450  -3.085  0.00203 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 267.5  on 199  degrees of freedom
## Residual deviance: 267.5  on 199  degrees of freedom
## AIC: 269.5
## 
## Number of Fisher Scoring iterations: 4

11.10 Sensitivitas dan Spesifisitas

Sensitivitas mengukur seberapa baik model mengenali kelas positif: \(\text{Sensitivitas} = \frac{\text{True Positives}}{\text{True Positives} + \text{False Negatives}}\)

Spesifisitas mengukur seberapa baik model mengenali kelas negatif: \(\text{Spesifisitas} = \frac{\text{True Negatives}}{\text{True Negatives} + \text{False Positives}}\)

11.11 Detail Penjelasan ROC Curve

ROC (Receiver Operating Characteristic) adalah grafik yang menunjukkan kinerja model klasifikasi biner dengan memplot True Positive Rate (Sensitivitas) terhadap False Positive Rate (1 - Spesifisitas). - Semakin mendekati sudut kiri atas, semakin baik model. - Luas di bawah kurva (AUC) digunakan sebagai indikator kualitas prediksi.

11.12 Precision-Recall Curve (PR Curve)

Precision (Presisi): \(\text{Precision} = \frac{\text{True Positives}}{\text{True Positives} + \text{False Positives}}\)

Recall (Sensitivitas) seperti sebelumnya: \(\text{Recall} = \frac{\text{True Positives}}{\text{True Positives} + \text{False Negatives}}\)

PR Curve memplot precision vs recall. Cocok digunakan pada data tidak seimbang (class imbalance).

library(PRROC)
## Warning: package 'PRROC' was built under R version 4.3.3
## Loading required package: rlang
## 
## Attaching package: 'rlang'
## The following objects are masked from 'package:purrr':
## 
##     %@%, flatten, flatten_chr, flatten_dbl, flatten_int, flatten_lgl,
##     flatten_raw, invoke, splice
## The following object is masked from 'package:tinytex':
## 
##     check_installed
pr <- pr.curve(scores.class0 = fitted(model_full)[data$Penyakit == 1],
               scores.class1 = fitted(model_full)[data$Penyakit == 0],
               curve = TRUE)
plot(pr)

11.13 Pseudo R-squared pada Regresi Logistik

Beberapa jenis pseudo R² yang umum: - McFadden: \(R^2 = 1 - \frac{\log L_1}{\log L_0}\)

  • Cox & Snell dan Nagelkerke: berbasis probabilitas prediksi.

Pseudo R² tidak sebanding langsung dengan R² pada regresi linear, namun tetap berguna untuk membandingkan model satu dengan yang lain.

11.14 Interpretasi Lengkap

  • Usia mungkin memiliki koefisien positif kecil: semakin tua, risiko meningkat.
  • Perokok jika OR > 1, menunjukkan status merokok meningkatkan risiko penyakit.
  • Jenis kelamin bisa berperan jika prevalensi penyakit berbeda antara laki-laki dan perempuan.

11.15 Prinsip Parsimony

Model terbaik bukan yang memiliki semua variabel, tetapi yang: - Secara teoritis masuk akal - Secara statistik signifikan - Memiliki performa yang baik dalam klasifikasi - Tidak kompleks berlebihan

11.16 Kesimpulan Komprehensif

  • Regresi logistik adalah metode yang kuat untuk prediksi kejadian biner, berguna dalam epidemiologi, sosial, dan bisnis.
  • Seleksi model penting agar model tidak overfitting dan tetap interpretable.
  • Evaluasi model harus mencakup aspek statistik (p-value, AIC), prediktif (ROC, AUC), dan praktikal (akurasi, sensitivitas).
  • Interpretasi harus mempertimbangkan logika substantif dan bukan hanya signifikan statistik.
  • Validasi model dengan data baru sangat disarankan sebelum implementasi operasional.
  • Dengan proses yang tepat, model regresi logistik dapat menjadi alat penting untuk pengambilan keputusan berbasis data yang lebih akurat dan andal.

12 DISTRIBUSI MULTINOMIAL DAN REGRESI LOGISTIK MULTINOMIAL

library(nnet)
## Warning: package 'nnet' was built under R version 4.3.3
library(tidyverse)
library(kableExtra)
library(broom)

Distribusi multinomial adalah perpanjangan dari distribusi binomial, yang digunakan ketika hasil dari sebuah eksperimen terdiri dari lebih dari dua kategori. Dalam banyak kasus, kita tertarik tidak hanya mengetahui proporsi masing-masing kategori, tetapi juga bagaimana faktor-faktor tertentu memengaruhi probabilitas hasil tersebut.

Regresi logistik multinomial memungkinkan kita menganalisis pengaruh variabel prediktor terhadap kategori hasil nominal dengan lebih dari dua kelas. Ini sangat berguna dalam ilmu sosial, pemasaran, epidemiologi, dan bidang lainnya.

12.1 Distribusi Multinomial

library(nnet)
library(tidyverse)
library(kableExtra)
library(broom)

Distribusi ini mengukur probabilitas hasil \((x_1, x_2, ..., x_k)\) dari \(n\) percobaan independen, di mana: - Terdapat \(k\) kategori hasil. - \(p_1, p_2, ..., p_k\) adalah probabilitas dari masing-masing kategori. - \(\sum x_i = n\), dan \(\sum p_i = 1\).

12.1.1 Contoh Simulasi

set.seed(123)
multi_data <- rmultinom(n = 1, size = 100, prob = c(0.4, 0.35, 0.25))
rownames(multi_data) <- c("Kategori A", "Kategori B", "Kategori C")
multi_data
##            [,1]
## Kategori A   39
## Kategori B   36
## Kategori C   25

Interpretasi Output menunjukkan berapa banyak observasi yang masuk ke masing-masing kategori dari total 100 percobaan. Nilai ini bisa digunakan untuk menilai apakah suatu distribusi aktual mendekati distribusi teoritis.

12.2 Regresi Logistik Multinomial

Regresi logistik multinomial memodelkan log odds dari setiap kategori dibandingkan dengan baseline:

\[ \log\left(\frac{P(Y = j)}{P(Y = \text{baseline})}\right) = \beta_{0j} + \beta_{1j}X_1 + ... + \beta_{pj}X_p \]

Model ini digunakan ketika: - Variabel respon berupa kategori > 2. - Tidak ada urutan alami antar kategori (bukan ordinal).

Interpretasi Setiap koefisien menjelaskan pengaruh variabel prediktor terhadap log odds memilih suatu kategori dibandingkan kategori referensi (baseline).

12.3 Simulasi Data Baru

Langkah ini menciptakan dataset buatan yang merepresentasikan hubungan antara variabel prediktor (pendidikan dan pekerjaan) dengan pilihan produk.

set.seed(42)
n <- 300
data_sim <- tibble(
  pendidikan = sample(c("SD", "SMP", "SMA"), size = n, replace = TRUE),
  pekerjaan = sample(c("PNS", "Swasta", "Wirausaha"), size = n, replace = TRUE),
  pilihan = sample(c("Produk A", "Produk B", "Produk C"), size = n, replace = TRUE)
)
data_sim <- data_sim %>% mutate_all(as.factor)
glimpse(data_sim)
## Rows: 300
## Columns: 3
## $ pendidikan <fct> SD, SD, SD, SD, SMP, SMP, SMP, SD, SMA, SMA, SD, SD, SMP, S…
## $ pekerjaan  <fct> PNS, Wirausaha, Swasta, PNS, PNS, PNS, Swasta, Wirausaha, S…
## $ pilihan    <fct> Produk A, Produk B, Produk A, Produk B, Produk C, Produk B,…

Interpretasi Kita membuat data acak untuk menguji model regresi logistik multinomial. Ini penting untuk validasi model ketika tidak tersedia data asli.

12.4 Estimasi Model

Model dibangun menggunakan fungsi multinom() dari paket nnet untuk memodelkan hubungan antara pendidikan dan pekerjaan terhadap pilihan.

model <- multinom(pilihan ~ pendidikan + pekerjaan, data = data_sim)
## # weights:  18 (10 variable)
## initial  value 329.583687 
## iter  10 value 326.321638
## final  value 326.317009 
## converged
summary(model)
## Call:
## multinom(formula = pilihan ~ pendidikan + pekerjaan, data = data_sim)
## 
## Coefficients:
##          (Intercept) pendidikanSMA pendidikanSMP pekerjaanSwasta
## Produk B  -0.3397519   0.004365892     0.5928949      0.07331038
## Produk C  -0.2868043   0.236203220     0.4501356     -0.03328531
##          pekerjaanWirausaha
## Produk B          0.4636806
## Produk C          0.3292755
## 
## Std. Errors:
##          (Intercept) pendidikanSMA pendidikanSMP pekerjaanSwasta
## Produk B   0.3115648     0.3676008     0.3333752       0.3493966
## Produk C   0.3091808     0.3584827     0.3403224       0.3490471
##          pekerjaanWirausaha
## Produk B          0.3598830
## Produk C          0.3591147
## 
## Residual Deviance: 652.634 
## AIC: 672.634

Interpretasi Hasil menampilkan koefisien estimasi log-odds masing-masing kategori terhadap baseline. Koefisien positif menunjukkan peningkatan log-odds terhadap baseline.

##Interpretasi Koefisien

tidy(model) %>%
  kable(digits = 3, caption = "Koefisien Regresi Multinomial") %>%
  kable_styling()
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
Koefisien Regresi Multinomial
y.level term estimate std.error statistic p.value
Produk B (Intercept) -0.340 0.312 -1.090 0.276
Produk B pendidikanSMA 0.004 0.368 0.012 0.991
Produk B pendidikanSMP 0.593 0.333 1.778 0.075
Produk B pekerjaanSwasta 0.073 0.349 0.210 0.834
Produk B pekerjaanWirausaha 0.464 0.360 1.288 0.198
Produk C (Intercept) -0.287 0.309 -0.928 0.354
Produk C pendidikanSMA 0.236 0.358 0.659 0.510
Produk C pendidikanSMP 0.450 0.340 1.323 0.186
Produk C pekerjaanSwasta -0.033 0.349 -0.095 0.924
Produk C pekerjaanWirausaha 0.329 0.359 0.917 0.359

Interpretasi Setiap baris menunjukkan efek variabel prediktor terhadap log-odds memilih produk B atau C dibandingkan produk A (baseline). Koefisien signifikan menunjukkan pengaruh penting.

12.5 Uji Signifikansi

Kita menghitung nilai z dan p untuk menguji apakah koefisien berbeda secara signifikan dari nol.

z_val <- summary(model)$coefficients / summary(model)$standard.errors
p_val <- 2 * (1 - pnorm(abs(z_val)))
tibble(
  Coef = as.vector(summary(model)$coefficients),
  SE = as.vector(summary(model)$standard.errors),
  Z = as.vector(z_val),
  P = as.vector(p_val)
) %>%
  mutate(Signif = ifelse(P < 0.05, "*", "")) %>%
  kable(digits = 4, caption = "Uji Z dan P-Value") %>%
  kable_styling()
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
Uji Z dan P-Value
Coef SE Z P Signif
-0.3398 0.3116 -1.0905 0.2755
-0.2868 0.3092 -0.9276 0.3536
0.0044 0.3676 0.0119 0.9905
0.2362 0.3585 0.6589 0.5100
0.5929 0.3334 1.7785 0.0753
0.4501 0.3403 1.3227 0.1859
0.0733 0.3494 0.2098 0.8338
-0.0333 0.3490 -0.0954 0.9240
0.4637 0.3599 1.2884 0.1976
0.3293 0.3591 0.9169 0.3592

Interpretasi P-value < 0.05 menunjukkan bahwa koefisien signifikan secara statistik. Artinya, variabel tersebut memberikan kontribusi signifikan terhadap pemilihan kategori produk.

12.6 Evaluasi dan Prediksi

Kita mengevaluasi akurasi prediksi model dengan membandingkan hasil prediksi dan aktual.

prediksi <- predict(model, type = "class")
conf_mtx <- table(Prediksi = prediksi, Aktual = data_sim$pilihan)
conf_mtx
##           Aktual
## Prediksi   Produk A Produk B Produk C
##   Produk A       44       34       39
##   Produk B       39       61       49
##   Produk C       14        8       12
akurasi <- sum(diag(conf_mtx)) / sum(conf_mtx)
akurasi
## [1] 0.39

Interpretasi Tabel konfusi menunjukkan jumlah prediksi yang benar dan salah. Akurasi memberikan ukuran kinerja model secara umum.

12.7 Visualisasi Probabilitas

12.8 Pengertian

Visualisasi ini menunjukkan bagaimana probabilitas prediksi berubah berdasarkan kategori prediktor.

probs <- predict(model, type = "probs")
data_sim <- bind_cols(data_sim, as_tibble(probs))
data_long <- data_sim %>%
  pivot_longer(cols = starts_with("Produk"), names_to = "Kategori", values_to = "Prob")

ggplot(data_long, aes(x = pekerjaan, y = Prob, fill = Kategori)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "Distribusi Probabilitas Tiap Produk berdasarkan Pekerjaan")

Interpretasi Plot menunjukkan penyebaran probabilitas pilihan produk berdasarkan kategori pekerjaan. Kita dapat melihat pola prediksi dominan berdasarkan prediktor tertentu.

12.9 Kesimpulan

  • Distribusi multinomial menggambarkan probabilitas gabungan dari beberapa kategori dalam satu percobaan.
  • Regresi logistik multinomial memungkinkan kita memodelkan hasil kategori nominal lebih dari dua.
  • Model ini dapat mengidentifikasi pengaruh faktor-faktor terhadap pilihan kategori.
  • Evaluasi model mencakup akurasi klasifikasi, signifikansi koefisien, dan visualisasi prediktif.
  • Cocok digunakan dalam banyak konteks praktis seperti survei pasar, pendidikan, dan kebijakan publik.

13 REGRESI LOGISTIK ORDINAL

library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
library(tidyverse)
library(kableExtra)
library(broom)

Regresi logistik ordinal merupakan salah satu jenis regresi logistik yang digunakan ketika variabel dependen (respon) memiliki lebih dari dua kategori yang berurutan (ordinal). Ini berbeda dari regresi logistik multinomial yang digunakan untuk kategori tanpa urutan (nominal).

Model ini sangat cocok untuk data seperti: - Tingkat kepuasan pelanggan (Tidak Puas, Netral, Puas) - Tingkat pendidikan (SD, SMP, SMA) - Tingkat keparahan penyakit (Ringan, Sedang, Berat)

Model yang paling umum digunakan dalam regresi logistik ordinal adalah Model Logit Kumulatif (Cumulative Logit Model) atau Proportional Odds Model.

13.1 Pengertian Regresi Logistik Ordinal

Model logit kumulatif memperkirakan peluang kumulatif suatu respon jatuh pada atau di bawah suatu kategori tertentu.

Persamaan matematis: \[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \theta_j - (\beta_1X_1 + \beta_2X_2 + ... + \beta_pX_p) \]

Keterangan: - \(Y\): variabel respon ordinal. - \(j\): urutan kategori. - \(\theta_j\): ambang batas antara kategori. - \(\beta\): koefisien regresi. - \(X_p\): prediktor.

Model ini mengasumsikan bahwa efek dari prediktor adalah konsisten di seluruh ambang batas kategori (proportional odds).

13.2 Simulasi Data Ordinal

Kita akan membuat data simulasi untuk melihat bagaimana pendidikan dan pendapatan memengaruhi kepuasan pelanggan terhadap suatu layanan.

set.seed(123)
n <- 300
data_ord <- tibble(
  pendidikan = sample(c("SD", "SMP", "SMA"), n, replace = TRUE),
  pendapatan = sample(c("Rendah", "Sedang", "Tinggi"), n, replace = TRUE),
  kepuasan = sample(c("Tidak Puas", "Netral", "Puas"), n, replace = TRUE, prob = c(0.3, 0.4, 0.3))
) %>%
  mutate(
    pendidikan = factor(pendidikan, ordered = TRUE, levels = c("SD", "SMP", "SMA")),
    pendapatan = factor(pendapatan, ordered = TRUE, levels = c("Rendah", "Sedang", "Tinggi")),
    kepuasan = factor(kepuasan, ordered = TRUE, levels = c("Tidak Puas", "Netral", "Puas"))
  )
head(data_ord)
## # A tibble: 6 × 3
##   pendidikan pendapatan kepuasan  
##   <ord>      <ord>      <ord>     
## 1 SMA        Sedang     Netral    
## 2 SMA        Rendah     Netral    
## 3 SMA        Sedang     Netral    
## 4 SMP        Sedang     Tidak Puas
## 5 SMA        Sedang     Tidak Puas
## 6 SMP        Sedang     Puas

Interpretasi Kita telah membuat data ordinal dengan tiga tingkat pendidikan dan pendapatan, serta tiga tingkat kepuasan pelanggan. Karena data ini bersifat ordinal, maka urutan kategori sangat penting dalam pemodelan.

13.3 Estimasi Model

Kita akan menggunakan fungsi polr() dari paket MASS untuk melakukan regresi logistik ordinal terhadap variabel kepuasan.

model_ord <- polr(kepuasan ~ pendidikan + pendapatan, data = data_ord, Hess = TRUE)
summary(model_ord)
## Call:
## polr(formula = kepuasan ~ pendidikan + pendapatan, data = data_ord, 
##     Hess = TRUE)
## 
## Coefficients:
##                 Value Std. Error t value
## pendidikan.L -0.25288     0.1894 -1.3353
## pendidikan.Q -0.02220     0.1847 -0.1202
## pendapatan.L -0.04288     0.1881 -0.2279
## pendapatan.Q -0.17936     0.1860 -0.9645
## 
## Intercepts:
##                   Value   Std. Error t value
## Tidak Puas|Netral -0.9741  0.1302    -7.4814
## Netral|Puas        0.6786  0.1230     5.5166
## 
## Residual Deviance: 650.6215 
## AIC: 662.6215

Interpretasi - Koefisien positif artinya peningkatan variabel prediktor akan meningkatkan peluang masuk ke kategori yang lebih rendah. - Sebaliknya, koefisien negatif artinya peningkatan prediktor cenderung mendorong respon ke kategori yang lebih tinggi (misalnya dari “Netral” ke “Puas”). - Intercept (cutpoints) menunjukkan titik ambang antar kategori.

13.4 Uji Signifikansi Koefisien

z <- coef(summary(model_ord))[, "Value"] / coef(summary(model_ord))[, "Std. Error"]
p <- 2 * (1 - pnorm(abs(z)))
coef_df <- cbind(coef(summary(model_ord)), "p value" = p)

kable(coef_df, digits = 4, caption = "Uji Signifikansi Koefisien Regresi Logistik Ordinal") %>%
  kable_styling()
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
Uji Signifikansi Koefisien Regresi Logistik Ordinal
Value Std. Error t value p value
pendidikan.L -0.2529 0.1894 -1.3353 0.1818
pendidikan.Q -0.0222 0.1847 -0.1202 0.9043
pendapatan.L -0.0429 0.1881 -0.2279 0.8197
pendapatan.Q -0.1794 0.1860 -0.9645 0.3348
Tidak Puas&#124;Netral -0.9741 0.1302 -7.4814 0.0000
Netral&#124;Puas 0.6786 0.1230 5.5166 0.0000

Interpretasi - Nilai p < 0.05 menunjukkan bahwa variabel tersebut berpengaruh signifikan terhadap tingkat kepuasan. - Z-value yang besar (positif atau negatif) menunjukkan kekuatan hubungan yang lebih besar.

13.5 Prediksi dan Evaluasi Model

Kita akan membandingkan hasil prediksi dari model dengan data aktual untuk melihat performa model klasifikasi.

prediksi <- predict(model_ord, data_ord)
tab <- table(Prediksi = prediksi, Aktual = data_ord$kepuasan)
tab
##             Aktual
## Prediksi     Tidak Puas Netral Puas
##   Tidak Puas          0      0    0
##   Netral             70    109   87
##   Puas               12      7   15

Interpretasi Tabel konfusi menunjukkan jumlah kasus yang diprediksi benar atau salah untuk setiap tingkat kepuasan. Semakin banyak nilai diagonal (prediksi benar), semakin baik model.

13.6 Akurasi Model

accuracy <- sum(diag(tab)) / sum(tab)
accuracy
## [1] 0.4133333

Interpretasi Akurasi menunjukkan proporsi prediksi yang benar. Ini adalah ukuran sederhana untuk menilai performa model secara keseluruhan.

13.7 Kesimpulan

  • Regresi logistik ordinal adalah teknik yang efektif untuk memodelkan hubungan antara prediktor dan variabel ordinal.
  • Model ini memperhitungkan urutan kategori dalam variabel target.
  • Hasil model menunjukkan pengaruh signifikan dari variabel pendidikan dan pendapatan terhadap tingkat kepuasan pelanggan.
  • Evaluasi menggunakan tabel konfusi dan akurasi memberikan gambaran tentang kualitas prediksi.

Model ini sangat berguna dalam survei sosial, analisis pelanggan, penelitian pendidikan, dan bidang lain yang melibatkan data kategorik berurutan.

14 LOG LINIER MODEL

library(MASS)
library(tidyverse)
library(kableExtra)
library(broom)

Model log-linear adalah model statistik yang digunakan untuk menganalisis hubungan antara variabel-variabel kategorik dalam bentuk tabel kontingensi, khususnya frekuensi dalam setiap kombinasi kategori. Model ini tidak menetapkan satu variabel sebagai respon; semua variabel dianggap setara.

Log-linear model sangat relevan untuk data dengan dua arah atau lebih, dan cocok digunakan dalam eksplorasi hubungan tanpa asumsi sebab-akibat langsung. Ini berbeda dengan regresi logistik yang membutuhkan satu variabel dependen.

14.1 Tabel Kontingensi dan Model Loglinier

Misal kita punya dua variabel kategorik: Gender (Male, Female) dan Preference (Yes, No).

data <- matrix(c(40, 60, 30, 70), nrow = 2, byrow = TRUE)
dimnames(data) <- list(Gender = c("Male", "Female"),
                       Preference = c("Yes", "No"))
ftable(data)
##        Preference Yes No
## Gender                  
## Male               40 60
## Female             30 70

Model loglinier: \[ \log(\mu_{ij}) = \lambda + \lambda_i^{(A)} + \lambda_j^{(B)} + \lambda_{ij}^{(AB)} \]

14.2 Model Saturated

Model saturated adalah model yang memuat semua interaksi antar variabel dan sepenuhnya menyesuaikan data.

model_sat <- loglm(~ Gender * Preference, data = data)
summary(model_sat)
## Formula:
## ~Gender * Preference
## attr(,"variables")
## list(Gender, Preference)
## attr(,"factors")
##            Gender Preference Gender:Preference
## Gender          1          0                 1
## Preference      0          1                 1
## attr(,"term.labels")
## [1] "Gender"            "Preference"        "Gender:Preference"
## attr(,"order")
## [1] 1 1 2
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
## 
## Statistics:
##                  X^2 df P(> X^2)
## Likelihood Ratio   0  0        1
## Pearson            0  0        1

Model ini tidak menyisakan residual → perfect fit.

14.3 Model Independent

Model independen hanya mempertimbangkan efek utama tanpa interaksi.

model_indep <- loglm(~ Gender + Preference, data = data)
summary(model_indep)
## Formula:
## ~Gender + Preference
## attr(,"variables")
## list(Gender, Preference)
## attr(,"factors")
##            Gender Preference
## Gender          1          0
## Preference      0          1
## attr(,"term.labels")
## [1] "Gender"     "Preference"
## attr(,"order")
## [1] 1 1
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
## 
## Statistics:
##                       X^2 df  P(> X^2)
## Likelihood Ratio 2.203462  1 0.1377012
## Pearson          2.197802  1 0.1382077

Jika p-value < 0.05, berarti model independen tidak sesuai.

14.4 Odds Ratio dan Interpretasi

\[ OR = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}} = \frac{40 \cdot 70}{60 \cdot 30} \]

OR <- (40 * 70) / (60 * 30)
logOR <- log(OR)
OR
## [1] 1.555556
logOR
## [1] 0.4418328

Interpretasi: - OR > 1 → asosiasi positif antara Gender dan Preference. - logOR menunjukkan kekuatan hubungan dalam skala log.

14.5 Estimasi Parameter

Estimasi parameter log-linear dilakukan menggunakan metode iterative proportional fitting (IPF).

coef(model_sat)
## $`(Intercept)`
## [1] 3.858229
## 
## $Gender
##        Male      Female 
##  0.03338285 -0.03338285 
## 
## $Preference
##        Yes         No 
## -0.3131907  0.3131907 
## 
## $Gender.Preference
##         Preference
## Gender          Yes         No
##   Male    0.1104582 -0.1104582
##   Female -0.1104582  0.1104582

Setiap parameter menunjukkan efek log dari masing-masing kombinasi variabel.

14.6 Model Lebih Sederhana dan Perbandingan Model

Gunakan likelihood ratio test (LRT) untuk membandingkan model.

anova(model_indep, model_sat)
## LR tests for hierarchical log-linear models
## 
## Model 1:
##  ~Gender + Preference 
## Model 2:
##  ~Gender * Preference 
## 
##           Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1   2.203462  1                                    
## Model 2   0.000000  0   2.203462         1         0.1377
## Saturated 0.000000  0   0.000000         0         1.0000

Jika p-value < 0.05 → model independen tidak memadai → interaksi signifikan.

14.7 Studi Kasus:Preferensi Makanan Berdasarkan Umur dan Jenis Kelamin

Latar Belakang Sebuah survei dilakukan untuk mengetahui preferensi makanan (Vegetarian, Non-Vegetarian) berdasarkan kelompok umur (Remaja, Dewasa, Lansia) dan jenis kelamin (Pria, Wanita). Tujuan analisis adalah untuk mengetahui apakah terdapat hubungan tiga arah antara preferensi, umur, dan jenis kelamin.

# Data dalam format data.frame
umur <- rep(c("Remaja", "Dewasa", "Lansia"), each = 4)
gender <- rep(c("Pria", "Wanita"), times = 6)
preferensi <- rep(c("Vegetarian", "Non-Vegetarian"), each = 2, times = 3)
count <- c(30, 50, 40, 60, 20, 25, 40, 20, 50, 30, 30, 15)

df_makanan <- data.frame(Umur = umur, Gender = gender, Preferensi = preferensi, Count = count)

# Melatih model saturated
library(MASS)
model_saturated <- loglm(Count ~ Umur * Gender * Preferensi, data = df_makanan)
summary(model_saturated)
## Formula:
## Count ~ Umur * Gender * Preferensi
## attr(,"variables")
## list(Count, Umur, Gender, Preferensi)
## attr(,"factors")
##            Umur Gender Preferensi Umur:Gender Umur:Preferensi Gender:Preferensi
## Count         0      0          0           0               0                 0
## Umur          1      0          0           1               1                 0
## Gender        0      1          0           1               0                 1
## Preferensi    0      0          1           0               1                 1
##            Umur:Gender:Preferensi
## Count                           0
## Umur                            1
## Gender                          1
## Preferensi                      1
## attr(,"term.labels")
## [1] "Umur"                   "Gender"                 "Preferensi"            
## [4] "Umur:Gender"            "Umur:Preferensi"        "Gender:Preferensi"     
## [7] "Umur:Gender:Preferensi"
## attr(,"order")
## [1] 1 1 1 2 2 2 3
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 1
## attr(,".Environment")
## <environment: R_GlobalEnv>
## attr(,"predvars")
## list(Count, Umur, Gender, Preferensi)
## attr(,"dataClasses")
##       Count        Umur      Gender  Preferensi 
##   "numeric" "character" "character" "character" 
## 
## Statistics:
##                  X^2 df P(> X^2)
## Likelihood Ratio   0  0        1
## Pearson            0  0        1
# Bandingkan dengan model tanpa interaksi tiga arah
model_tanpa_3arah <- loglm(Count ~ (Umur + Gender + Preferensi)^2, data = df_makanan)
anova(model_tanpa_3arah, model_saturated)
## LR tests for hierarchical log-linear models
## 
## Model 1:
##  Count ~ (Umur + Gender + Preferensi)^2 
## Model 2:
##  Count ~ Umur * Gender * Preferensi 
## 
##           Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1   2.783468  2                                    
## Model 2   0.000000  0   2.783468         2        0.24864
## Saturated 0.000000  0   0.000000         0        1.00000

Interpretasi Hasil Model Saturated: Menyediakan fit sempurna terhadap data → semua interaksi dipertimbangkan.

Perbandingan Model: - Jika p-value dari anova kecil → interaksi tiga arah signifikan → ada hubungan kompleks antara semua variabel. - Jika tidak signifikan → model dua arah cukup.

14.8 Kesimpulan

  • Model log-linear digunakan untuk menganalisis struktur asosiasi dalam data kategorik.
  • Model saturated sepenuhnya cocok dengan data; model independen mengasumsikan tidak ada interaksi.
  • Odds ratio dan log-OR membantu mengukur asosiasi.
  • Gunakan LRT untuk membandingkan model nested.
  • Cocok untuk data survey, epidemiologi, dan sosiologi di mana semua variabel dianggap setara.

15 REFERENSI

Agresti, A. (2019). Statistical Methods for the Social Sciences (5th ed.). Pearson.

Christensen, R. (1997). Log-Linear Models and Logistic Regression. Springer.

Dobson, A. J., & Barnett, A. G. (2018). An Introduction to Generalized Linear Models (4th ed.).

Fox, J., & Weisberg, S. (2019). An R Companion to Applied Regression (3rd ed.). SAGE Publications.

Menard, S. (2002). Applied Logistic Regression Analysis (2nd ed.). Sage Publications.

Moore, D. S., Notz, W. I., & Fligner, M. A. (2013). The Basic Practice of Statistics (6th ed.). W.H. Freeman.

James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An Introduction to Statistical Learning (2nd ed.). Springer.

Kleinbaum, D. G., & Klein, M. (2010). Logistic Regression: A Self-Learning Text (3rd ed.). Springer.

R Core Team (2023). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing, Vienna, Austria. https://www.r-project.org

Szklo, M., & Nieto, F. J. (2014). Epidemiology: Beyond the Basics (3rd ed.). Jones & Bartlett Learning.

Wickham, H., & Grolemund, G. (2017). R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. O’Reilly Media.