Dalam statistik, data kategori merupakan jenis data yang terdiri dari kategori atau kelompok, bukan angka yang memiliki nilai kontinu. Data ini sering kali digunakan dalam berbagai disiplin ilmu untuk memahami pola, hubungan, dan tren yang tidak dapat diukur secara langsung menggunakan skala numerik. Contoh umum dari data kategori mencakup jenis kelamin (laki-laki/perempuan), status pernikahan (menikah/belum menikah), tingkat pendidikan (rendah/menengah/tinggi), dan preferensi konsumen (setuju/netral/tidak setuju).
Analisis data kategori memainkan peran penting dalam eksplorasi dan interpretasi data yang bersifat nominal atau ordinal. Berbeda dengan data kontinu, analisis data kategori memerlukan pendekatan khusus, seperti tabel kontingensi, uji chi-square, analisis regresi logistik, dan metode estimasi berbasis model probabilitas. Dengan berkembangnya teknologi dan kecerdasan buatan, analisis data kategori juga semakin banyak diterapkan dalam machine learning dan big data analytics.
Analisis data kategori memiliki berbagai tujuan utama yang membantu dalam pengambilan keputusan berbasis data. Beberapa tujuan utama dari analisis ini meliputi:
Analisis data kategori memungkinkan peneliti dan praktisi untuk mengidentifikasi pola-pola yang tersembunyi dalam data. Misalnya, dalam penelitian pemasaran, analisis ini dapat digunakan untuk memahami preferensi konsumen berdasarkan kelompok demografis tertentu.
Dalam banyak kasus, hubungan antara dua atau lebih variabel kategori menjadi perhatian utama. Misalnya, dalam penelitian kesehatan, analisis data kategori dapat membantu memahami hubungan antara gaya hidup dan penyakit tertentu.
Dengan memahami pola dan hubungan dalam data kategori, pengambil keputusan dapat membuat strategi yang lebih tepat sasaran. Misalnya, dalam kebijakan publik, analisis data kategori dapat digunakan untuk menentukan kebijakan sosial berdasarkan segmentasi masyarakat.
Banyak model prediktif yang menggunakan data kategori sebagai salah satu inputnya, seperti regresi logistik untuk memprediksi kejadian biner (misalnya, apakah seorang pasien memiliki risiko tinggi terkena penyakit atau tidak).
Analisis data kategori adalah teknik statistik yang digunakan untuk menganalisis variabel yang bersifat kategorik.
Data kategorik berbeda dari data kuantitatif karena tidak dapat diukur dalam skala numerik kontinu.
Analisis data kategori memiliki manfaat luas dalam berbagai bidang, baik di sektor akademik maupun industri. Berikut adalah beberapa bidang utama dimana analisis ini banyak diterapkan:
Dalam ilmu sosial dan psikologi, analisis data kategori digunakan untuk memahami perilaku manusia, opini publik, dan faktor sosial lainnya. Misalnya:
Dalam bidang kesehatan, analisis data kategori sangat penting dalam epidemiologi dan studi klinis. Contohnya:
Dalam pemasaran dan bisnis, data kategori digunakan untuk memahami preferensi pelanggan, segmentasi pasar, dan efektivitas strategi pemasaran. Beberapa penerapan meliputi:
Dalam dunia pendidikan, analisis data kategori berguna dalam mengevaluasi metode pengajaran, tingkat kepuasan mahasiswa, dan efektivitas kurikulum. Contohnya:
Pemerintah sering menggunakan analisis data kategori untuk memahami kebutuhan masyarakat dan merancang kebijakan yang lebih efektif. Beberapa penerapan termasuk:
Dalam bidang keamanan dan analisis kriminal, data kategori digunakan untuk memahami pola kejahatan dan merancang strategi pencegahan. Contohnya:
Berbagai metode dapat digunakan dalam analisis data kategori, tergantung pada tujuan penelitian. Beberapa metode umum meliputi:
Analisis data kategori merupakan bagian penting dari analisis statistik yang memiliki aplikasi luas dalam berbagai bidang. Dengan pendekatan yang tepat, analisis ini dapat membantu dalam memahami pola, hubungan, dan tren dalam data yang bersifat kategori. Selain itu, metode analisis data kategori seperti tabel kontingensi, uji chi-square, regresi logistik, dan machine learning terus berkembang seiring dengan kemajuan teknologi, memungkinkan pengambilan keputusan yang lebih akurat dan berbasis data.
Dengan demikian, pemahaman yang baik tentang analisis data kategori sangat penting bagi peneliti, praktisi bisnis, pembuat kebijakan, dan profesional dari berbagai disiplin ilmu untuk menghasilkan wawasan yang lebih dalam dan keputusan yang lebih tepat.
Variabel acak kategori adalah variabel yang hanya dapat memiliki beberapa kategori diskrit sebagai hasilnya. Distribusi probabilitas dari variabel ini menggambarkan kemungkinan terjadinya setiap kategori.
Distribusi Bernoulli digunakan untuk percobaan biner, yaitu percobaan yang memiliki dua kemungkinan hasil: - Sukses (1) dengan probabilitas \(p\) - Gagal (0) dengan probabilitas \(1 - p\)
Fungsi probabilitasnya:
\[ P(X = x) = p^x (1 - p)^{1-x}, \quad x \in \{0,1\} \]
Keterangan Notasi
\(X\): Variabel acak biner (0 atau 1)
\(p\): Probabilitas sukses (X = 1)
Contoh Variabel Acak Bernoulli - Hasil dari lemparan koin (Kepala = 1, Ekor = 0) - Keberhasilan atau kegagalan dalam suatu percobaan klinis
Perhitungan dengan R
library(knitr)
library(kableExtra)
library(dplyr)
library(dplyr)
library(broom)
library(ggplot2)
library(tidyverse)
library(broom)
library(knitr)
library(kableExtra)
library(ggplot2)
library(ResourceSelection)
set.seed(123)
bernoulli_sample <- rbinom(n = 10, size = 1, prob = 0.5) # 10 percobaan Bernoulli
bernoulli_sample
## [1] 0 1 0 1 1 0 1 1 1 0
Distribusi Binomial adalah generalisasi dari distribusi Bernoulli yang digunakan untuk n kali percobaan independen yang masing-masing memiliki dua kemungkinan hasil (sukses atau gagal). Jika setiap percobaan memiliki probabilitas sukses \(p\), maka distribusi Binomial memiliki fungsi probabilitas:
\[ P(X = k) = \binom{n}{k} p^k (1-p)^{n-k} \]
Keterangan Notasi - \(X\): Jumlah keberhasilan dalam \(n\) percobaan - \(n\): Jumlah percobaan - \(k\): Jumlah keberhasilan yang diamati - \(p\): Probabilitas keberhasilan dalam satu percobaan - \(\binom{n}{k}\): Kombinasi “n pilih k”, dihitung sebagai \(\frac{n!}{k!(n-k)!}\)
Contoh Variabel Acak Binomial - Jumlah keberhasilan dalam 10 kali lemparan koin - Jumlah pasien yang sembuh setelah diberikan obat tertentu dalam suatu studi klinis
Perhitungan dengan R
set.seed(123)
binomial_sample <- rbinom(n = 10, size = 5, prob = 0.5) # 10 percobaan Binomial dengan 5 ulangan
binomial_sample
## [1] 2 3 2 4 4 1 3 4 3 2
Distribusi Multinomial adalah generalisasi lebih lanjut dari distribusi Binomial, digunakan ketika setiap percobaan memiliki lebih dari dua kemungkinan hasil. Jika suatu eksperimen dilakukan \(n\) kali, dan setiap percobaan dapat menghasilkan salah satu dari \(k\) kategori dengan probabilitas \(p_1, p_2, ..., p_k\), maka distribusi probabilitasnya:
\[ P(X_1 = x_1, ..., X_k = x_k) = \frac{n!}{x_1! x_2! ... x_k!} p_1^{x_1} p_2^{x_2} ... p_k^{x_k} \]
Keterangan Notasi
\(X_i\): Frekuensi kemunculan kategori ke-\(i\)
\(n\): Jumlah total percobaan
\(x_i\): Jumlah kejadian kategori ke-\(i\)
\(p_i\): Probabilitas kategori ke-\(i\)
Contoh Variabel Acak Multinomial
Pemilihan kandidat dalam pemilu (beberapa kandidat, satu suara per pemilih)
Distribusi warna permen dalam satu bungkus acak
Perhitungan dengan R
set.seed(123)
multinomial_sample <- rmultinom(n = 1, size = 10, prob = c(0.3, 0.5, 0.2))
multinomial_sample
## [,1]
## [1,] 2
## [2,] 5
## [3,] 3
Distribusi Poisson digunakan untuk menghitung jumlah kejadian dalam interval waktu atau ruang tertentu dengan rata-rata kejadian \(\lambda\) per unit waktu/ruang. Fungsi probabilitasnya:
\[ P(X = k) = \frac{e^{-\lambda} \lambda^k}{k!} \]
Keterangan Notasi
Contoh Variabel Acak Poisson
Perhitungan dengan R
set.seed(123)
poisson_sample <- rpois(10, lambda = 3) # 10 sampel dengan rata-rata kejadian 3
poisson_sample
## [1] 2 4 2 5 6 0 3 5 3 3
Dalam analisis data kategori, desain sampling memiliki peran yang krusial dalam menentukan validitas dan reliabilitas hasil penelitian. Pemilihan desain sampling yang tepat bergantung pada tujuan penelitian dan jenis data yang dikumpulkan. Secara umum, desain sampling dalam analisis data kategori dapat diklasifikasikan ke dalam dua pendekatan utama, yaitu prospective sampling dan retrospective sampling. Masing-masing pendekatan ini memiliki karakteristik dan metode sampling yang berbeda, yang sering digunakan dalam penelitian eksperimental maupun observasional seperti eksperimen, studi kohort, dan studi kasus-kontrol.
Prospective sampling adalah metode pengambilan sampel dimana subjek penelitian diidentifikasi dan diikuti dalam periode waktu tertentu untuk mengamati perkembangan variabel yang diteliti. Pendekatan ini memungkinkan peneliti untuk mengontrol variabel bebas sebelum pengukuran hasil dilakukan, sehingga sering digunakan dalam studi kausal dan eksperimental. Beberapa jenis desain sampling dalam metode ini meliputi:
Dalam studi eksperimental, subjek secara acak dialokasikan ke dalam kelompok perlakuan dan kontrol. Teknik sampling yang umum digunakan meliputi:
Studi kohort adalah penelitian observasional dimana kelompok individu dengan karakteristik tertentu diikuti dari waktu ke waktu untuk mengamati kejadian yang dipelajari. Jenis sampling yang umum dalam studi kohort meliputi:
Retrospective sampling adalah metode dimana data dikumpulkan dari peristiwa yang telah terjadi sebelumnya. Teknik ini sering digunakan dalam studi observasional yang mencari hubungan antara faktor risiko dan hasil tertentu.
Dalam studi kasus-kontrol, sekelompok individu dengan kondisi tertentu (kasus) dibandingkan dengan kelompok tanpa kondisi tersebut (kontrol). Teknik sampling yang sering digunakan meliputi:
Dalam studi kohort retrospektif, data historis digunakan untuk mengelompokkan individu berdasarkan paparan dan kemudian menganalisis hasil yang terjadi. Teknik sampling yang sering digunakan meliputi:
| Jenis.Studi | Pendekatan | Metode.Sampling | Keuntungan | Kelemahan |
|---|---|---|---|---|
| Eksperimen | Prospective | SRS, Stratified, Cluster | Kontrol tinggi terhadap variabel, hubungan sebab akibat dapat dianalisis | Biaya tinggi, etika dan validitas perlu diperhatikan |
| Studi Kohort | Prospective | Census, Systematic, Matched | Dapat mengamati perkembangan kejadian dalam jangka panjang | Membutuhkan waktu lama, risiko kehilangan partisipan |
| Studi Kasus-Kontrol | Retrospective | Purposive, Snowball, Incidence Density | Mudah dan cepat dilakukan, efisien untuk penyakit langka | Sulit mengontrol variabel pengganggu, rentan bias recall |
| Studi Kohort Retrospektif | Retrospective | Convenience, Quota, Case-Based | Memanfaatkan data historis, lebih murah daripada studi kohort | Ketergantungan pada kualitas data historis, bisa terjadi missing data |
Desain sampling dalam analisis data kategori sangat bergantung pada pendekatan yang digunakan, apakah itu prospective atau retrospective. Pemilihan metode sampling yang sesuai dalam eksperimen, studi kohort, dan studi kasus-kontrol dapat meningkatkan validitas penelitian serta memastikan hasil yang dapat digeneralisasikan. Oleh karena itu, pemahaman terhadap karakteristik masing-masing metode sampling menjadi penting dalam perencanaan penelitian yang robust dan berkualitas.
Tabel kontingensi 2 × 2 adalah bentuk paling sederhana dari tabel kontingensi yang digunakan untuk menganalisis hubungan antara dua variabel kategori. Dalam banyak analisis statistik, tabel ini digunakan untuk menentukan apakah terdapat asosiasi antara dua variabel, seperti hubungan antara pengobatan dan hasil kesembuhan, atau kebiasaan merokok dan risiko kanker paru-paru. Tabel kontingensi 2 × 2 adalah bentuk paling sederhana dari tabel kontingensi yang digunakan untuk menganalisis hubungan antara dua variabel kategori. Dalam banyak analisis statistik, tabel ini digunakan untuk menentukan apakah terdapat asosiasi antara dua variabel, seperti hubungan antara pengobatan dan hasil kesembuhan, atau kebiasaan merokok dan risiko kanker paru-paru.
Tabel kontingensi 2 × 2 memiliki struktur sebagai berikut:
| Kategori 1 (+) | Kategori 2 (-) | Total | |
|---|---|---|---|
| Grup 1 | \(n_{11}\) | \(n_{12}\) | \(n_{1.}\) |
| Grup 2 | \(n_{21}\) | \(n_{22}\) | \(n_{2.}\) |
| Total | \(n_{.1}\) | \(n_{.2}\) | \(n\) |
Peluang bersama adalah probabilitas bahwa kedua variabel terjadi secara bersamaan dalam suatu sel tabel kontingensi: \[ P(A_i, B_j) = \frac{n_{ij}}{n} \]
Peluang marginal adalah probabilitas kejadian suatu variabel tanpa mempertimbangkan variabel lainnya: - Peluang marginal baris: \[ P(A_i) = \frac{n_{i.}}{n} \] - Peluang marginal kolom: \[ P(B_j) = \frac{n_{.j}}{n} \]
Peluang bersyarat adalah probabilitas suatu kejadian terjadi dengan syarat kejadian lain telah terjadi:
\[ P(B_j | A_i) = \frac{P(A_i, B_j)}{P(A_i)} = \frac{n_{ij}}{n_{i.}} \]
Contoh Perhitungan Manual Misalkan kita memiliki tabel berikut tentang hubungan antara merokok dan kanker paru-paru:
| Kanker Paru (+) | Kanker Paru (-) | Total | |
|---|---|---|---|
| Perokok | 450 | 200 | 650 |
| Bukan Perokok | 50 | 300 | 350 |
| Total | 500 | 500 | 1000 |
Langkah 1: Hitung Peluang Bersama
\(P(\text{Perokok, Kanker}) = \frac{450}{1000} = 0.45\)
\(P(\text{Perokok, Tidak Kanker}) = \frac{200}{1000} = 0.20\)
\(P(\text{Tidak Perokok, Kanker}) = \frac{50}{1000} = 0.05\)
\(P(\text{Tidak Perokok, Tidak Kanker}) = \frac{300}{1000} = 0.30\)
Langkah 2: Hitung Peluang Marginal
\(P(\text{Perokok}) = \frac{650}{1000} = 0.65\)
\(P(\text{Tidak Perokok}) = \frac{350}{1000} = 0.35\)
\(P(\text{Kanker}) = \frac{500}{1000} = 0.50\)
\(P(\text{Tidak Kanker}) = \frac{500}{1000} = 0.50\)
Langkah 3: Hitung Peluang Bersyarat
\(P(\text{Kanker} | \text{Perokok}) = \frac{450}{650} = 0.6923\)
\(P(\text{Kanker} | \text{Tidak Perokok}) = \frac{50}{350} = 0.1429\)
Perhitungan dengan R
# Data Observasi
data <- matrix(c(450, 200, 50, 300), nrow = 2, byrow = TRUE)
colnames(data) <- c("Kanker Paru (+)", "Kanker Paru (-)")
rownames(data) <- c("Perokok", "Bukan Perokok")
n <- sum(data)
# Peluang Bersama
P_joint <- data / n
# Peluang Marginal
P_marginal_rows <- rowSums(data) / n
P_marginal_cols <- colSums(data) / n
# Peluang Bersyarat
P_conditional <- data / rowSums(data)
# Hasil
list(Peluang_Bersama = P_joint, Peluang_Marginal_Baris = P_marginal_rows, Peluang_Marginal_Kolom = P_marginal_cols, Peluang_Bersyarat = P_conditional)
## $Peluang_Bersama
## Kanker Paru (+) Kanker Paru (-)
## Perokok 0.45 0.2
## Bukan Perokok 0.05 0.3
##
## $Peluang_Marginal_Baris
## Perokok Bukan Perokok
## 0.65 0.35
##
## $Peluang_Marginal_Kolom
## Kanker Paru (+) Kanker Paru (-)
## 0.5 0.5
##
## $Peluang_Bersyarat
## Kanker Paru (+) Kanker Paru (-)
## Perokok 0.6923077 0.3076923
## Bukan Perokok 0.1428571 0.8571429
Interpretasi
Peluang bersama menunjukkan probabilitas gabungan dari kejadian tertentu dalam tabel.
Peluang marginal menunjukkan probabilitas suatu kejadian tanpa mempertimbangkan variabel lain.
Peluang bersyarat menunjukkan bagaimana probabilitas berubah ketika informasi tentang variabel lain diberikan.
Jika \(P(\text{Kanker} | \text{Perokok}) > P(\text{Kanker} | \text{Tidak Perokok})\), maka ini menunjukkan bahwa perokok lebih berisiko terkena kanker dibandingkan bukan perokok.
Tabel kontingensi 2 × 2 membantu dalam memahami hubungan antara dua variabel kategori.
Peluang bersama, peluang marginal, dan peluang bersyarat adalah dasar untuk memahami hubungan statistik antar variabel dalam tabel kontingensi.
Perhitungan manual dan implementasi dalam R membantu dalam menganalisis data secara lebih akurat dan efisien.
Dalam analisis statistik, asosiasi dalam tabel kontingensi 2 × 2 digunakan untuk menentukan hubungan antara dua variabel kategori. Sebuah tabel kontingensi 2 × 2 menunjukkan frekuensi kejadian dua variabel dengan dua kategori, sehingga memungkinkan kita untuk menilai apakah terdapat hubungan statistik di antara mereka.
Analisis asosiasi ini sering diterapkan dalam berbagai bidang seperti epidemiologi, riset sosial, dan eksperimen klinis. Contohnya:
Epidemiologi: Meneliti hubungan antara kebiasaan merokok dan kanker paru-paru.
Eksperimen Klinis: Mengukur efektivitas suatu pengobatan terhadap penyakit.
Riset Sosial: Memeriksa hubungan antara tingkat pendidikan dan tingkat pekerjaan.
Dalam tabel 2 × 2, kita dapat menghitung ukuran asosiasi seperti:
Risk Difference (RD): Mengukur selisih risiko antara dua kelompok.
Relative Risk (RR): Mengukur perbandingan risiko antara dua kelompok.
Odds Ratio (OR): Membandingkan peluang kejadian antara dua kelompok.
Uji Chi-Square & Fisher’s Exact Test: Untuk menguji apakah hubungan antara dua variabel signifikan secara statistik.
Analisis ini menjadi dasar untuk memahami hubungan antar variabel dan mengambil keputusan berbasis data di berbagai bidang ilmu.
Risk Difference (RD) atau Perbedaan Risiko adalah ukuran absolut dalam epidemiologi yang menggambarkan perbedaan antara probabilitas kejadian suatu hasil dalam dua kelompok yang berbeda. RD dihitung sebagai selisih antara risiko kejadian dalam kelompok terpapar dan risiko kejadian dalam kelompok tidak terpapar.
\[ RD = \left( \frac{n_{11}}{n_{1.}} \right) - \left( \frac{n_{21}}{n_{2.}} \right) \]
Jika \(RD > 0\), maka risiko kejadian lebih tinggi di Grup 1 dibandingkan Grup 2.
Jika \(RD < 0\), maka risiko kejadian lebih rendah di Grup 1 dibandingkan Grup 2.
Jika \(RD = 0\), maka tidak ada perbedaan risiko antara dua kelompok.
Contoh perhitungan dalam R:
RD <- function(n11, n12, n21, n22) {
(n11 / (n11 + n12)) - (n21 / (n21 + n22))
}
RD(50, 50, 30, 70)
## [1] 0.2
Interpretasi: Risk Difference menunjukkan perbedaan risiko antara dua kelompok, dengan nilai positif menunjukkan bahwa kelompok pertama memiliki risiko lebih tinggi.
Relative Risk (RR) atau Risiko Relatif adalah ukuran yang digunakan dalam epidemiologi untuk membandingkan risiko kejadian suatu peristiwa (misalnya penyakit atau kondisi tertentu) antara dua kelompok, yaitu kelompok yang terpapar dan kelompok yang tidak terpapar. RR menunjukkan seberapa besar kemungkinan kejadian tersebut terjadi pada kelompok terpapar dibandingkan dengan kelompok tidak terpapar.
\[ RR = \frac{\frac{n_{11}}{n_{1.}}}{\frac{n_{21}}{n_{2.}}} \]
Jika \(RR > 1\), maka kejadian lebih sering terjadi di Grup 1 dibandingkan Grup 2.
Jika \(RR < 1\), maka kejadian lebih jarang terjadi di Grup 1 dibandingkan Grup 2.
Jika \(RR = 1\), maka tidak ada perbedaan risiko antara dua kelompok.
Contoh perhitungan dalam R:
RR <- function(n11, n12, n21, n22) {
(n11 / (n11 + n12)) / (n21 / (n21 + n22))
}
RR(50, 50, 30, 70)
## [1] 1.666667
Interpretasi: Relative Risk menggambarkan seberapa besar kemungkinan outcome terjadi di kelompok pertama dibandingkan dengan kelompok kedua.
Odds Ratio (OR) atau Rasio Odds adalah ukuran yang digunakan dalam epidemiologi dan statistik untuk membandingkan odds (peluang) terjadinya suatu kejadian antara dua kelompok, yaitu kelompok yang terpapar dan kelompok yang tidak terpapar. OR sering digunakan dalam studi case-control tetapi juga dapat digunakan dalam studi kohort dan eksperimental.
\[ OR = \frac{n_{11} \times n_{22}}{n_{12} \times n_{21}} \]
Jika \(OR > 1\), maka peluang kejadian lebih besar di Grup 1 dibandingkan Grup 2.
Jika \(OR < 1\), maka peluang kejadian lebih kecil di Grup 1 dibandingkan Grup 2.
Jika \(OR = 1\), maka tidak ada perbedaan peluang kejadian antara dua kelompok.
Contoh perhitungan dalam R:
OR <- function(n11, n12, n21, n22) {
(n11 * n22) / (n12 * n21)
}
OR(50, 50, 30, 70)
## [1] 2.333333
Interpretasi: Odds Ratio menunjukkan perbandingan odds antara dua kelompok, dengan nilai OR > 1 menunjukkan bahwa kelompok pertama memiliki odds lebih tinggi.
Perbandingan RD, RR, dan OR
| Ukuran | Definisi | Desain Sampling yang Cocok | Interpretasi |
|---|---|---|---|
| Risk Difference (RD) | Selisih probabilitas kejadian antara dua kelompok | Studi kohort atau eksperimen acak | Menunjukkan tambahan atau pengurangan risiko absolut |
| Relative Risk (RR) | Perbandingan risiko kejadian di dua kelompok | Studi kohort atau eksperimen klinis | Mengukur berapa kali lebih besar risiko di satu kelompok dibandingkan kelompok lainnya |
| Odds Ratio (OR) | Perbandingan odds antara dua kelompok | Studi kasus-kontrol atau studi observasional | Mengukur hubungan antara variabel eksposur dan kejadian dalam desain studi kasus-kontrol |
Kesimpulan - RD digunakan untuk memahami dampak absolut dari suatu faktor risiko atau intervensi. - RR lebih cocok untuk studi kohort atau eksperimen karena mengukur kemungkinan relatif. - OR sering digunakan dalam studi kasus-kontrol karena dapat memperkirakan risiko relatif dalam desain penelitian ini.
Inferensi dalam statistik mengacu pada proses pengambilan kesimpulan mengenai populasi berdasarkan sampel data. Dalam konteks tabel kontingensi dua arah, inferensi digunakan untuk menganalisis hubungan antara dua variabel kategorikal yang disusun dalam tabel kontingensi.
Tabel kontingensi adalah tabel yang menyajikan distribusi frekuensi dari dua variabel kategorikal dalam bentuk matriks. Tujuan utama dari inferensi pada tabel ini adalah untuk memahami hubungan antara variabel-variabel tersebut melalui estimasi dan pengujian hipotesis.
Inferensi dalam tabel kontingensi dua arah dapat dibagi menjadi dua kategori utama:
Estimasi bertujuan untuk memperkirakan parameter populasi berdasarkan data sampel. Estimasi dibagi menjadi:
Estimasi titik digunakan untuk menentukan satu nilai spesifik sebagai perkiraan terbaik dari parameter populasi.
\[ \hat{p} = \frac{x}{n} \]
dimana: - \(\hat{p}\) adalah estimasi titik proporsi, - \(x\) adalah jumlah individu dalam kategori tertentu, - \(n\) adalah total jumlah individu dalam sampel.
Estimasi interval bertujuan untuk memberikan rentang nilai yang diyakini mengandung parameter populasi dengan tingkat kepercayaan tertentu.
\[ \hat{p} \pm Z_{\alpha/2} \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \]
dimana:
Uji proporsi digunakan untuk membandingkan proporsi kejadian antara dua kelompok dalam tabel kontingensi, terutama untuk menentukan apakah terdapat perbedaan yang signifikan dalam proporsi kejadian antara dua kelompok yang berbeda.
Tabel kontingensi 2 × 2 memiliki struktur sebagai berikut:
| Kejadian (+) | Tidak Kejadian (-) | Total | |
|---|---|---|---|
| Grup 1 | \(n_{11}\) | \(n_{12}\) | \(n_{1.}\) |
| Grup 2 | \(n_{21}\) | \(n_{22}\) | \(n_{2.}\) |
| Total | \(n_{.1}\) | \(n_{.2}\) | \(n\) |
Formulasi Uji Proporsi
Untuk menguji hipotesis bahwa tidak ada perbedaan proporsi antara dua kelompok, kita menggunakan uji z dua proporsi, dengan hipotesis:
Hipotesis Nol (\(H_0\)): Tidak ada perbedaan proporsi antara dua kelompok, yaitu \(p_1 = p_2\)
Hipotesis Alternatif (\(H_1\)): Terdapat perbedaan proporsi antara dua kelompok, yaitu \(p_1 \neq p_2\)
Estimasi proporsi dalam masing-masing kelompok diberikan oleh: \[ \hat{p}_1 = \frac{n_{11}}{n_{1.}}, \quad \hat{p}_2 = \frac{n_{21}}{n_{2.}} \]
Estimasi proporsi gabungan (pooling proportion): \[ \hat{p} = \frac{n_{11} + n_{21}}{n_{1.} + n_{2.}} \]
Statistik uji untuk uji proporsi dua sampel: \[ Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p} (1 - \hat{p}) \left( \frac{1}{n_{1.}} + \frac{1}{n_{2.}} \right) }} \]
Statistik uji \(Z\) mengikuti distribusi normal baku \(N(0,1)\), dan p-value dihitung berdasarkan nilai kritis dari distribusi normal.
Jika \(|Z|\) lebih besar dari nilai kritis untuk tingkat signifikansi tertentu \(\alpha\) (misalnya 1.96 untuk \(\alpha = 0.05\)), maka hipotesis nol ditolak, yang berarti ada perbedaan signifikan antara dua proporsi.
Uji ini cocok digunakan dalam studi kohort dan eksperimen klinis.
Perhitungan Manual Langkah Demi Langkah
Misalkan kita memiliki data berikut:
| Kejadian (+) | Tidak Kejadian (-) | Total | |
|---|---|---|---|
| Grup 1 | 50 | 30 | 80 |
| Grup 2 | 30 | 50 | 80 |
| Total | 80 | 80 | 160 |
Langkah 1: Hitung Proporsi Sampel
\(\hat{p}_1 = \frac{50}{80} = 0.625\)
\(\hat{p}_2 = \frac{30}{80} = 0.375\)
Langkah 2: Hitung Proporsi Gabungan
Langkah 3: Hitung Statistik Uji Z
\(Z = \frac{0.625 - 0.375}{\sqrt{0.50 (1 - 0.50) \left( \frac{1}{80} + \frac{1}{80} \right) }}\)
\(Z = \frac{0.25}{\sqrt{0.50 \times 0.50 \times (0.025)}}\)
\(Z = \frac{0.25}{\sqrt{0.00625}} = \frac{0.25}{0.0791} = 3.16\)
Interpretasi Karena \(Z = 3.16\) lebih besar dari nilai kritis untuk \(\alpha = 0.05\) (yaitu 1.96), kita menolak hipotesis nol, yang berarti ada perbedaan signifikan antara dua proporsi.
# Pastikan variabel data_matrix terdefinisi sebelum digunakan
set.seed(123)
data<- matrix(c(50, 30, 30, 50), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Terpapar" = c("Ya", "Tidak"), "Kejadian" = c("Ya", "Tidak"))
print(data)
## Kejadian
## Terpapar Ya Tidak
## Ya 50 30
## Tidak 30 50
# Uji Proporsi dengan variabel yang benar
prop_test <- prop.test(x = c(data[1,1], data[2,1]),
n = c(sum(data[1,]), sum(data[2,])))
print(prop_test)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(data[1, 1], data[2, 1]) out of c(sum(data[1, ]), sum(data[2, ]))
## X-squared = 9.025, df = 1, p-value = 0.002663
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## 0.08747151 0.41252849
## sample estimates:
## prop 1 prop 2
## 0.625 0.375
Interpretasi: Jika p-value < 0.05, maka terdapat perbedaan proporsi kejadian antara kelompok terpapar dan tidak terpapar.
Uji asosiasi dalam tabel kontingensi 2 × 2 bertujuan untuk mengukur hubungan antara dua variabel kategori. Tiga ukuran utama dalam uji asosiasi adalah:
Risk Difference (RD) – Mengukur selisih risiko absolut antara dua kelompok.
Relative Risk (RR) – Mengukur perbandingan risiko antara dua kelompok.
Odds Ratio (OR) – Mengukur perbandingan odds antara dua kelompok.
Hipotesis Uji dalam Tabel Kontingensi 2 × 2
Untuk setiap uji asosiasi, hipotesis yang diuji adalah:
Risk Difference mengukur perbedaan absolut dalam probabilitas kejadian antara dua kelompok: \[ RD = \left( \frac{n_{11}}{n_{1.}} \right) - \left( \frac{n_{21}}{n_{2.}} \right) \]
Standard Error untuk RD: \[ SE(RD) = \sqrt{\frac{\hat{p}_1(1 - \hat{p}_1)}{n_{1.}} + \frac{\hat{p}_2(1 - \hat{p}_2)}{n_{2.}}} \]
Statistik uji Z:
\[ Z_{RD} = \frac{RD}{SE(RD)} \]
Relative Risk membandingkan kemungkinan kejadian antara dua kelompok: \[ RR = \frac{\frac{n_{11}}{n_{1.}}}{\frac{n_{21}}{n_{2.}}} \]
Standard Error untuk log(RR): \[ SE(\ln RR) = \sqrt{\frac{1}{n_{11}} - \frac{1}{n_{1.}} + \frac{1}{n_{21}} - \frac{1}{n_{2.}}} \]
Statistik uji Z: \[ Z_{RR} = \frac{\ln RR}{SE(\ln RR)} \] #### Odds Ratio (OR)
Odds Ratio membandingkan peluang kejadian antara dua kelompok: \[ OR = \frac{n_{11} \times n_{22}}{n_{12} \times n_{21}} \]
Standard Error untuk log(OR): \[ SE(\ln OR) = \sqrt{\frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}}} \]
Statistik uji Z: \[ Z_{OR} = \frac{\ln OR}{SE(\ln OR)} \]
Contoh Perhitungan Manual Misalkan kita memiliki data berikut:
| Kejadian (+) | Tidak Kejadian (-) | Total | |
|---|---|---|---|
| Grup 1 | 50 | 30 | 80 |
| Grup 2 | 30 | 50 | 80 |
| Total | 80 | 80 | 160 |
Perhitungan Manual untuk RD - Misalkan \(\hat{p}_1 = \frac{50}{80} = 0.625\) dan \(\hat{p}_2 = \frac{30}{80} = 0.375\).
Risk Difference: \[ RD = 0.625 - 0.375 = 0.25 \]
Standard Error: \[ SE(RD) = \sqrt{\frac{0.625(0.375)}{80} + \frac{0.375(0.625)}{80}} \] \[ SE(RD) = \sqrt{\frac{0.234}{80} + \frac{0.234}{80}} = \sqrt{0.002925 + 0.002925} = \sqrt{0.00585} = 0.07648529 \]
Statistik uji Z: \[ Z_{RD} = \frac{0.25}{0.07648529} = 3.268602 \]
Perhitungan Manual untuk RR - Relative Risk: \[ RR = \frac{\frac{50}{80}}{\frac{30}{80}} = \frac{0.625}{0.375} = 1.67 \]
Standard Error untuk \(\ln RR\): \[ SE(\ln RR) = \sqrt{\frac{1}{50} - \frac{1}{80} + \frac{1}{30} - \frac{1}{80}} \] \[ SE(\ln RR) = \sqrt{0.02 - 0.0125 + 0.0333 - 0.0125} = \sqrt{0.0283} = 0.1683 \]
Statistik uji Z: \[ Z_{RR} = \frac{\ln 1.67}{0.1683} = \frac{0.51}{0.1683} = 3.03 \]
Perhitungan Manual untuk OR - Odds Ratio: \[ OR = \frac{50 \times 50}{30 \times 30} = \frac{2500}{900} = 2.78 \]
Standard Error untuk \(\ln OR\): \[ SE(\ln OR) = \sqrt{\frac{1}{50} + \frac{1}{30} + \frac{1}{30} + \frac{1}{50}} \] \[ SE(\ln OR) = \sqrt{0.02 + 0.0333 + 0.0333 + 0.02} = \sqrt{0.1066} = 0.3266 \]
Statistik uji Z: \[ Z_{OR} = \frac{\ln 2.78}{0.3266} = \frac{1.02}{0.3266} = 3.12 \]
Perhitungan Menggunakan
n11 <- 50; n12 <- 30; n21 <- 30; n22 <- 50
n1. <- n11 + n12; n2. <- n21 + n22
# Risk Difference
p1<-(n11/n1.)
p2<-(n21/n2.)
rd <- p1 - p2
se_rd <- sqrt((p1 * (1 - p1) / n1.) + p2*((1 - p2) / n2.))
z_rd <- rd / se_rd
# Relative Risk
rr <- (n11/n1.) / (n21/n2.)
se_ln_rr <- sqrt((1/n11) - (1/n1.) + (1/n21) - (1/n2.))
z_rr <- log(rr) / se_ln_rr
# Odds Ratio
or <- (n11 * n22) / (n12 * n21)
se_ln_or <- sqrt((1/n11) + (1/n12) + (1/n21) + (1/n22))
z_or <- log(or) / se_ln_or
# Hasil
list(RD = rd, SE_RD = se_rd, Z_RD = z_rd, RR = rr, SE_Ln_RR = se_ln_rr, Z_RR = z_rr, OR = or, SE_Ln_OR = se_ln_or, Z_OR = z_or)
## $RD
## [1] 0.25
##
## $SE_RD
## [1] 0.07654655
##
## $Z_RD
## [1] 3.265986
##
## $RR
## [1] 1.666667
##
## $SE_Ln_RR
## [1] 0.1683251
##
## $Z_RR
## [1] 3.034756
##
## $OR
## [1] 2.777778
##
## $SE_Ln_OR
## [1] 0.3265986
##
## $Z_OR
## [1] 3.128155
Kesimpulan - Risk Difference (RD) mengukur perbedaan risiko absolut. - Relative Risk (RR) membandingkan kemungkinan kejadian antara dua kelompok. - Odds Ratio (OR) membandingkan peluang kejadian antara dua kelompok. - Standard error dan statistik uji Z digunakan untuk menilai signifikansi statistik masing-masing ukuran asosiasi.
Uji independensi digunakan untuk menentukan apakah ada hubungan statistik antara dua variabel kategorikal.
Uji Chi-Square digunakan untuk menguji apakah ada hubungan antara dua variabel kategorikal.
Rumus Chi-Square:
\[ \chi^2 = \sum \frac{(O - E)^2}{E} \]
dimana:
\(O\) adalah nilai observasi dalam tabel kontingensi.
\(E\) adalah nilai yang diharapkan, dihitung sebagai:
\[ E_{ij} = \frac{(R_i \times C_j)}{N} \] dengan
\(R_i\) = total baris ke-\(i\).
\(C_j\) = total kolom ke-\(j\).
\(N\) = total sampel.
Contoh Perhitungan Manual Chi-Square
Misalkan kita memiliki tabel berikut:
| Kejadian Ya | Kejadian Tidak | Total | |
|---|---|---|---|
| Terpapar | 30 | 10 | 40 |
| Tidak Terpapar | 15 | 45 | 60 |
| Total | 45 | 55 | 100 |
Hitung nilai yang diharapkan \(E\): \[ E_{11} = \frac{(40 \times 45)}{100} = 18 \] \[ E_{12} = \frac{(40 \times 55)}{100} = 22 \] \[ E_{21} = \frac{(60 \times 45)}{100} = 27 \] \[ E_{22} = \frac{(60 \times 55)}{100} = 33 \]
Lalu, hitung \(\chi^2\): \[ \chi^2 = \frac{(30 - 18)^2}{18} + \frac{(10 - 22)^2}{22} + \frac{(15 - 27)^2}{27} + \frac{(45 - 33)^2}{33} \] \[ = \frac{144}{18} + \frac{144}{22} + \frac{144}{27} + \frac{144}{33} \] \[ = 8 + 6.55 + 5.33 + 4.36 = 24.24 \]
Dengan derajat kebebasan \((df) = (2-1)(2-1) = 1\), kita membandingkan dengan tabel \(\chi^2\), adalah 3.841 dan jika p-value < 0.05, kita menolak hipotesis nol.
# Contoh Data
set.seed(123)
data <- matrix(c(30, 10, 15, 45), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Terpapar" = c("Ya", "Tidak"), "Kejadian" = c("Ya", "Tidak"))
print(data)
## Kejadian
## Terpapar Ya Tidak
## Ya 30 10
## Tidak 15 45
# Uji Chi-Square
chisq_test <- chisq.test(data)
print(chisq_test)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data
## X-squared = 22.264, df = 1, p-value = 2.376e-06
Interpretasi: Jika p-value < 0.05, maka terdapat hubungan antara variabel “Terpapar” dan “Kejadian”.
Partisi Chi-Square digunakan untuk mengidentifikasi kategori mana dalam tabel kontingensi yang bertanggung jawab atas hubungan yang signifikan. Jika uji Chi-Square pada tabel kontingensi I × J signifikan, maka partisi Chi-Square memungkinkan kita untuk menguraikan efek hubungan dalam subkelompok yang lebih kecil.
Menurut Lancaster dan Irwin, statistik uji chi-square dapat dipecah menjadi komponen-komponen sebanyak derajat bebas dari tabel kontingensi, memungkinkan identifikasi kategori yang berkontribusi pada hubungan yang signifikan.
Hal ini juga dikenal dengan Simpson’s Paradox: Tren yang muncul dalam beberapa kelompok data dapat menghilang atau bahkan berbalik arah ketika data tersebut digabungkan.
Langkah-langkah Partisi Chi-Square 1. Menggunakan tabel I × J dan menghitung Chi-Square keseluruhan. 2. Memecah tabel menjadi beberapa tabel 2 × 2 sebanyak (I-1)(J-1). 3. Menghitung statistik Chi-Square pada masing-masing tabel 2 × 2. 4. Menginterpretasikan kategori mana yang memberikan kontribusi signifikan.
Contoh Perhitungan Manual Misalkan kita memiliki data identifikasi partai politik berdasarkan gender dari Agresti (2019, Table 2.4): Uji independensi Chi-Square digunakan untuk menentukan apakah dua variabel kategori dalam tabel kontingensi memiliki hubungan statistik atau tidak. Misalkan kita memiliki data berikut:
| Gender | Democrat | Republican | Independent | Total |
|---|---|---|---|---|
| Female | 495 | 272 | 590 | 1357 |
| Male | 330 | 265 | 498 | 1093 |
| Total | 825 | 537 | 1088 | 2450 |
Hipotesis yang diuji adalah:
Hipotesis Nol (H₀): Tidak ada hubungan antara variabel Gender dan Identifikasi Partai Politik.
Hipotesis Alternatif (H₁): Ada hubungan antara variabel Gender dan Identifikasi Partai Politik.
Langkah-langkah Perhitungan Manual
Langkah 1: Lakukan Chi-Square Secara Keseluruhan
\(X^2 = \frac{(495 - 456.95)^2}{456.95} + \frac{(272 - 297.43)^2}{297.43} + \frac{(590 - 602.62)^2}{602.62} + \frac{(330 - 368.05)^2}{368.05} + \frac{(265 - 239.57)^2}{239.57} + \frac{(498 - 485.38)^2}{485.38}\)
Setelah perhitungan: \[ X^2 = 12.57 \]
Perhitungan Menggunakan R
# Data Observasi
data_matrix <- matrix(c(495, 272, 590, 330, 265, 498), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Democrat", "Republican", "Independent")
rownames(data_matrix) <- c("Female", "Male")
# Uji Chi-Square
chi_test <- chisq.test(data_matrix)
# Hasil
list(Chi_Square = chi_test$statistic, P_Value = chi_test$p.value, Decision = ifelse(chi_test$p.value < 0.05, "Reject H0", "Fail to Reject H0"))
## $Chi_Square
## X-squared
## 12.56926
##
## $P_Value
## [1] 0.00186475
##
## $Decision
## [1] "Reject H0"
Interpretasi Hasil - Hasil uji Chi-Square menunjukkan bahwa hubungan antara Gender dan Identifikasi Partai Politik signifikan secara statistik (p < 0.05).
Langkah 2: Lakukan Partisi Chi-Square Partisi 1: Democrat vs. Republican
| Gender | Democrat | Republican |
|---|---|---|
| Female | 495 | 272 |
| Male | 330 | 265 |
Chi-Square: \[ X^2 = 11.536, \quad p < 0.001 \]
Partisi 2: Democrat + Republican vs. Independent
| Gender | Democrat + Republican | Independent |
|---|---|---|
| Female | 767 | 590 |
| Male | 595 | 498 |
Chi-Square: \[ X^2 = 1.065, \quad p = 0.698 \]
Perhitungan Menggunakan R
# Data Observasi
data_matrix <- matrix(c(495, 272, 330, 265), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Democrat", "Republican")
rownames(data_matrix) <- c("Female", "Male")
# Uji Chi-Square Partisi 1
chi_test1 <- chisq.test(data_matrix)
# Data Partisi 2
data_matrix2 <- matrix(c(767, 590, 595, 498), nrow = 2, byrow = TRUE)
colnames(data_matrix2) <- c("Dem+Rep", "Independent")
rownames(data_matrix2) <- c("Female", "Male")
# Uji Chi-Square Partisi 2
chi_test2 <- chisq.test(data_matrix2)
# Hasil
list(Chi_Square_Partisi1 = chi_test1, Chi_Square_Partisi2 = chi_test2)
## $Chi_Square_Partisi1
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data_matrix
## X-squared = 11.178, df = 1, p-value = 0.0008279
##
##
## $Chi_Square_Partisi2
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data_matrix2
## X-squared = 0.98267, df = 1, p-value = 0.3215
Interpretasi Hasil - Hasil partisi pertama menunjukkan bahwa perbedaan antara Democrat dan Republican signifikan (p < 0.001).
Hasil partisi kedua menunjukkan bahwa gabungan Democrat + Republican tidak berbeda signifikan dengan Independent (p = 0.698).
Kesimpulan:Gender lebih mempengaruhi pilihan antara Democrat dan Republican, tetapi tidak berpengaruh signifikan terhadap pilihan Independent.
Uji Likelihood Ratio (G²) adalah alternatif dari uji chi-square yang digunakan untuk menguji hipotesis independensi dalam tabel kontingensi I × J. Statistik uji ini diberikan oleh:
\[ G^2 = 2 \sum_{i} \sum_{j} n_{ij} \ln \left( \frac{n_{ij}}{\hat{\mu}_{ij}} \right) \]
Dimana: - \(n_{ij}\) adalah frekuensi observasi dalam tabel kontingensi. - \(\hat{\mu}_{ij} = n \cdot p_{i+} p_{+j}\) adalah frekuensi ekspektasi.
Statistik \(G^2\) mengikuti distribusi chi-square (χ²) dengan derajat bebas (I-1)(J-1).
Tolak \(H_0\) jika \(G^2 \geq \chi^2_{(1-\alpha/2)(I-1)(J-1)}\).
Contoh Perhitungan Manual Misalkan kita menggunakan data lung cancer sebagai berikut:
| Cancer (+) | Control (-) | Total | |
|---|---|---|---|
| Smoker | 688 | 650 | 1338 |
| Non-Smoker | 21 | 59 | 80 |
| Total | 709 | 709 | 1418 |
Langkah 1: Hitung Frekuensi Ekspektasi \[ \hat{\mu}_{11} = \frac{(1338 \times 709)}{1418} = 669 \]
\[ \hat{\mu}_{12} = \frac{(1338 \times 709)}{1418} = 669 \]
\[ \hat{\mu}_{21} = \frac{(80 \times 709)}{1418} = 40 \]
\[ \hat{\mu}_{22} = \frac{(80 \times 709)}{1418} = 40 \]
Langkah 2: Hitung Statistik Uji G² \[ G^2 = 2 \left[ 688 \ln \left( \frac{688}{669} \right) + 650 \ln \left( \frac{650}{669} \right) + 21 \ln \left( \frac{21}{40} \right) + 59 \ln \left( \frac{59}{40} \right) \right] \]
Setelah dihitung secara manual: \[ G^2 = 2 \times (19.27 + (-18.73) + (-13.53) + 22.93) = 2 \times (9.94) = 19.88 \]
Langkah 3: Bandingkan dengan Distribusi Chi-Square Derajat bebas: \[ (I-1)(J-1) = (2-1)(2-1) = 1 \] Nilai kritis \(\chi^2\) untuk \(\alpha = 0.05\) dengan df = 1 adalah 3.841. Karena \(G^2 = 9.71 > 3.841\), maka kita menolak hipotesis nol dan menyimpulkan bahwa ada hubungan signifikan antara merokok dan kanker paru-paru.
Perhitungan Menggunakan R
# Data Observasi
data_matrix <- matrix(c(688, 650, 21, 59), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Cancer (+)", "Control (-)")
rownames(data_matrix) <- c("Smoker", "Non-Smoker")
# Hitung Frekuensi Ekspektasi
data_expected <- chisq.test(data_matrix)$expected
# Hitung Statistik G²
G2 <- 2 * sum(data_matrix * log(data_matrix / data_expected))
# Nilai kritis chi-square untuk df = 1 dan alpha = 0.05
critical_value <- qchisq(0.95, df = 1)
# Hasil
list(G2 = G2, Critical_Value = critical_value, Decision = ifelse(G2 > critical_value, "Reject H0", "Fail to Reject H0"))
## $G2
## [1] 19.87802
##
## $Critical_Value
## [1] 3.841459
##
## $Decision
## [1] "Reject H0"
Kesimpulan
Uji Likelihood Ratio (G²) digunakan sebagai alternatif dari uji Chi-Square untuk menguji independensi dalam tabel kontingensi.
Jika \(G^2\) lebih besar dari nilai kritis \(\chi^2\), maka hipotesis nol ditolak, menunjukkan adanya hubungan antara dua variabel.
Contoh perhitungan manual dan implementasi di R menunjukkan bahwa ada asosiasi signifikan antara merokok dan kanker paru-paru.
Uji Fisher’s Exact digunakan untuk menguji hubungan antara dua variabel kategorikal dalam tabel kontingensi kecil, dimana asumsi Chi-square tidak berlaku karena ukuran sampel yang kecil.
Uji ini pertama kali dikembangkan oleh Sir Ronald A. Fisher, seorang ahli statistik, yang menggunakannya dalam penelitian biologi dan medis. Fisher’s Exact Test menjadi sangat penting dalam analisis data yang memiliki frekuensi kecil karena tidak bergantung pada asumsi distribusi normal.
Keunggulan:
Cocok untuk ukuran sampel kecil.
Tidak memerlukan asumsi normalitas atau chi-square.
Memberikan hasil yang lebih akurat dibandingkan uji Chi-square pada data dengan frekuensi kecil.
Keterbatasan:
Perhitungan bisa menjadi sangat berat secara komputasi jika ukuran tabel besar.
Hanya cocok untuk tabel kontingensi kecil (misalnya 2x2 atau 3x3).
Distribusi hipergeometrik menggambarkan probabilitas mengambil \(x\) bola putih dalam pengambilan acak tanpa pengembalian dari kumpulan \(N\) bola yang terdiri dari \(K\) bola putih dan \(N-K\) bola hitam.
\[ P(X = x) = \frac{\binom{K}{x} \binom{N-K}{n-x}}{\binom{N}{n}} \]
dengan:
\(N\) = total objek dalam populasi
\(K\) = jumlah objek dalam kategori tertentu (misalnya, sukses)
\(n\) = jumlah sampel yang diambil
\(x\) = jumlah objek dalam kategori tertentu yang diamati dalam sampel
Misalkan kita memiliki contoh berikut:
\(N = 40\) (total populasi)
\(K = 29\) (jumlah bola putih dalam populasi)
\(n = 20\) (jumlah sampel yang diambil)
\(x = 18\) (jumlah bola putih dalam sampel)
Menggunakan rumus di atas:
\[ P(X = 18) = \frac{\binom{29}{18} \binom{40-29}{20-18}}{\binom{40}{20}} \]
Dalam R, perhitungan ini dapat dilakukan dengan:
# Definisi parameter
N <- 40 # Total populasi
K <- 29 # Jumlah kategori sukses (bola putih)
n <- 20 # Jumlah sampel diambil
x <- 18 # Jumlah sukses dalam sampel
# Hitung probabilitas P(X = 18)
dhyper(x, m = K, n = N - K, k = n)
## [1] 0.01380413
Misalkan kita memiliki data berikut:
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 18 | 2 | 20 |
| Grup B | 11 | 9 | 20 |
| Total | 29 | 11 | 40 |
Langkah perhitungan manual: 1. Asumsikan hipotesis nol (tidak ada hubungan antara dua variabel). 2. Hitung probabilitas tabel yang diamati menggunakan distribusi hipergeometrik:
choose(29, 18) * choose(11, 2) / choose(40, 20)
## [1] 0.01380413
Berikut semua kombinasi tabel 2 x 2 yang mungkin dengan total bari dan total kolom sama:
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 20 | 0 | 20 |
| Grup B | 9 | 11 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 20) * choose(11, 0) / choose(40, 20)
## [1] 7.26533e-05
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 19 | 1 | 20 |
| Grup B | 10 | 10 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 19) * choose(11, 1) / choose(40, 20)
## [1] 0.001598373
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 18 | 2 | 20 |
| Grup B | 11 | 9 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 18) * choose(11, 2) / choose(40, 20)
## [1] 0.01380413
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 17 | 3 | 20 |
| Grup B | 12 | 8 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 17) * choose(11, 3) / choose(40, 20)
## [1] 0.06211857
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 16 | 4 | 20 |
| Grup B | 13 | 7 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 16) * choose(11, 4) / choose(40, 20)
## [1] 0.162464
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 15 | 5 | 20 |
| Grup B | 14 | 6 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 15) * choose(11, 5) / choose(40, 20)
## [1] 0.2599423
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 14 | 6 | 20 |
| Grup B | 15 | 5 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 14) * choose(11, 6) / choose(40, 20)
## [1] 0.2599423
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 13 | 7 | 20 |
| Grup B | 16 | 4 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 13) * choose(11, 7) / choose(40, 20)
## [1] 0.162464
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 12 | 8 | 20 |
| Grup B | 17 | 3 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 12) * choose(11, 8) / choose(40, 20)
## [1] 0.06211857
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 11 | 9 | 20 |
| Grup B | 18 | 2 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 11) * choose(11, 9) / choose(40, 20)
## [1] 0.01380413
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 10 | 10 | 20 |
| Grup B | 19 | 1 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 10) * choose(11, 10) / choose(40, 20)
## [1] 0.001598373
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 9 | 11 | 20 |
| Grup B | 20 | 0 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 9) * choose(11, 11) / choose(40, 20)
## [1] 7.26533e-05
p-value untuk uji Exact Fisher adalah kumulatif nilai p-value untuk setiap tabel yang lebih kecil sama dengan nilai p-value tabel empiris
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 18 | 2 | 20 |
| Grup B | 11 | 9 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 18) * choose(11, 2) / choose(40, 20)
## [1] 0.01380413
yaitu
p.value<-0.00007+0.00160+0.01380+0.01380+0.00160+0.00007
p.value
## [1] 0.03094
fisher.test() di Rdata <- matrix(c(18, 2, 11, 9), nrow = 2, byrow = TRUE)
fisher.test(data)
##
## Fisher's Exact Test for Count Data
##
## data: data
## p-value = 0.03095
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.147793 78.183838
## sample estimates:
## odds ratio
## 6.994073
Hasilnya akan memberikan nilai p untuk menentukan apakah ada hubungan signifikan antara kedua variabel.
Interpretasi Hasil
Kesimpulan
| Uji | Tujuan | Output |
|---|---|---|
| Uji Proporsi | Menguji apakah proporsi kejadian berbeda antara dua kelompok | p-value (signifikansi perbedaan proporsi) |
| Risk Difference (RD) | Mengukur perbedaan absolut risiko antar kelompok | Nilai perbedaan risiko |
| Relative Risk (RR) | Mengukur risiko relatif antar kelompok | Rasio risiko |
| Odds Ratio (OR) | Mengukur peluang kejadian antar kelompok | Rasio odds |
| Uji Chi-Square | Menguji apakah ada hubungan antara dua variabel | p-value (signifikansi hubungan) |
| Uji Fisher’s Exact | Menguji hubungan pada sampel kecil | p-value (signifikansi hubungan) |
Dokumen ini memberikan gambaran lengkap tentang perbedaan uji proporsi, ukuran asosiasi, dan uji independensi beserta implementasi dalam R, serta perhitungan manual uji Chi-Square.
Buatlah fungsi untuk menghitung dan melakukan pegujian hipotesis untuk RD, RR, dan OR. Gunakan data berikut Dataset dari Agresti (2019, hlm. 35, Tabel 2.3):
| Smoker | Lung Cancer (Cases) | Control |
|---|---|---|
| Yes | 688 | 650 |
| No | 21 | 59 |
Struktur Tabel Untuk Pembuatan Function
| Exposure | Cases | Control | Total |
|---|---|---|---|
| Yes | a | c | a+c |
| No | b | d | b+d |
| Total | a+b | c+d | a+b+c+d |
prop_diff <- function(a, b, c, d, alpha = 0.05) {
ph <- a / (a + c)
pi <- b / (b + d)
nh <- a + c
ni <- b + d
se_bp <- sqrt((ph * (1 - ph) / nh) + (pi * (1 - pi) / ni))
z_alpha <- qnorm(1 - alpha / 2)
ci_lower <- (ph - pi) - z_alpha * se_bp
ci_upper <- (ph - pi) + z_alpha * se_bp
list(estimate = ph - pi, ci = c(ci_lower, ci_upper))
}
# Input data
hasil <- prop_diff(a = 688, b = 21, c = 650, d = 59)
# Menampilkan hasil
print(hasil)
## $estimate
## [1] 0.2517003
##
## $ci
## [1] 0.1516343 0.3517663
relative_risk <- function(a, b, c, d, alpha = 0.05) {
ph <- a / (a + c)
pi <- b / (b + d)
nh <- a + c
ni <- b + d
ln_rr <- log(ph / pi)
se_ln_rr <- sqrt(((1 - ph) / (ph * nh)) + ((1 - pi) / (pi * ni)))
z_alpha <- qnorm(1 - alpha / 2)
ci_lower <- exp(ln_rr - z_alpha * se_ln_rr)
ci_upper <- exp(ln_rr + z_alpha * se_ln_rr)
list(estimate = exp(ln_rr), ci = c(ci_lower, ci_upper))
}
# Input data
hasil <- relative_risk(a = 688, b = 21, c = 650, d = 59)
# Menampilkan hasil
print(hasil)
## $estimate
## [1] 1.958858
##
## $ci
## [1] 1.351735 2.838667
odds_ratio <- function(a, b, c, d, alpha = 0.05) {
ln_or <- log((a * d) / (b * c))
se_ln_or <- sqrt(1/a + 1/b + 1/c + 1/d)
z_alpha <- qnorm(1 - alpha / 2)
ci_lower <- exp(ln_or - z_alpha * se_ln_or)
ci_upper <- exp(ln_or + z_alpha * se_ln_or)
list(estimate = exp(ln_or), ci = c(ci_lower, ci_upper))
}
# Input data
hasil <- odds_ratio(a = 688, b = 21, c = 650, d = 59)
# Menampilkan hasil
print(hasil)
## $estimate
## [1] 2.973773
##
## $ci
## [1] 1.786737 4.949427
Risk Difference (RD) = 0.2517 (atau 25.17%) → Risiko kanker paru pada perokok lebih tinggi 25.17% secara absolut dibandingkan non-perokok.
Relative Risk (RR) = 1.96 → Perokok memiliki 1.96 kali lipat lebih tinggi risiko terkena kanker paru dibandingkan non-perokok.
Odds Ratio (OR) = 2.97 → Odds perokok terkena kanker paru 2.97 kali lebih besar dibandingkan non-perokok.
Perhitungan Manual
a <- 688
b <- 21
c <- 650
d <- 59
# Risk Difference
RD_manual <- (a / (a + c)) - (b / (b + d))
SE_RD <- sqrt((a/(a+c)*(1 - a/(a+c)))/(a+c) + (b/(b+d)*(1 - b/(b+d)))/(b+d))
CI_RD <- c(RD_manual - 1.96 * SE_RD, RD_manual + 1.96 * SE_RD)
# Relative Risk
RR_manual <- (a / (a + c)) / (b / (b + d))
SE_RR <- sqrt(1/a - 1/(a+c) + 1/b - 1/(b+d))
CI_RR <- exp(log(RR_manual) + c(-1.96, 1.96) * SE_RR)
# Odds Ratio
OR_manual <- (a * d) / (b * c)
SE_OR <- sqrt(1/a + 1/b + 1/c + 1/d)
CI_OR <- exp(log(OR_manual) + c(-1.96, 1.96) * SE_OR)
list(RD = RD_manual, CI_RD = CI_RD, RR = RR_manual, CI_RR = CI_RR, OR = OR_manual, CI_OR = CI_OR)
## $RD
## [1] 0.2517003
##
## $CI_RD
## [1] 0.1516324 0.3517682
##
## $RR
## [1] 1.958858
##
## $CI_RR
## [1] 1.351726 2.838687
##
## $OR
## [1] 2.973773
##
## $CI_OR
## [1] 1.786720 4.949474
Perbandingan dengan Output R
library(epiR)
table_data <- matrix(c(a, c, b, d), nrow = 2, byrow = TRUE)
colnames(table_data) <- c("Lung Cancer", "Control")
rownames(table_data) <- c("Yes", "No")
res <- epi.2by2(table_data)
print(res)
## Outcome+ Outcome- Total Inc risk *
## Exposure+ 688 650 1338 51.42 (48.70 to 54.13)
## Exposure- 21 59 80 26.25 (17.04 to 37.29)
## Total 709 709 1418 50.00 (47.36 to 52.64)
##
## Point estimates and 95% CIs:
## -------------------------------------------------------------------
## Inc risk ratio 1.96 (1.35, 2.84)
## Inc odds ratio 2.97 (1.79, 4.95)
## Attrib risk in the exposed * 25.17 (15.16, 35.18)
## Attrib fraction in the exposed (%) 48.95 (28.08, 65.39)
## Attrib risk in the population * 23.75 (13.76, 33.74)
## Attrib fraction in the population (%) 47.50 (29.16, 64.02)
## -------------------------------------------------------------------
## Uncorrected chi2 test that OR = 1: chi2(1) = 19.129 Pr>chi2 = <0.001
## Fisher exact test that OR = 1: Pr>chi2 = <0.001
## Wald confidence limits
## CI: confidence interval
## * Outcomes per 100 population units
Risk Difference, Relative Risk, dan Odds Ratio memberikan informasi tentang kekuatan hubungan antara paparan dan outcome. Perhitungan manual dan R seharusnya menghasilkan hasil yang sama, memvalidasi pendekatan yang digunakan.
Residual dalam tabel kontingensi digunakan untuk mengidentifikasi sel mana yang menyumbang paling banyak terhadap hubungan antara variabel kategori. Residual mengukur selisih antara frekuensi yang diamati dan frekuensi yang diharapkan berdasarkan model independensi. Jika suatu sel memiliki residual yang besar (positif atau negatif), berarti frekuensi observasi dalam sel tersebut sangat berbeda dari yang diharapkan. Sebaliknya, jika residualnya kecil, berarti nilai observasi mendekati nilai ekspektasi, sehingga sel tersebut tidak banyak menyumbang terhadap hubungan antara variabel Agresti, A. (2013).
Jadi, dalam analisis residual tabel kontingensi, nilai residual mendekati nol mengindikasikan bahwa variabel-variabel yang dianalisis tidak memiliki hubungan yang signifikan, dan data sesuai dengan asumsi independensi.
Pearson Residual \[ e_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \] dimana: - \(O_{ij}\) adalah nilai observasi pada sel ke-\(i,j\) - \(E_{ij}\) adalah nilai ekspektasi pada sel ke-\(i,j\)
Standardized Residual (Adjusted Residual) \[ r_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij} (1 - p_{i+}) (1 - p_{+j})}} \] dimana: - \(p_{i+}\) dan \(p_{+j}\) adalah probabilitas marginal dari baris dan kolom.
Misalkan kita memiliki tabel kontingensi berikut:
| Kategori A | Kategori B | Total | |
|---|---|---|---|
| Grup 1 | 20 | 10 | 30 |
| Grup 2 | 30 | 20 | 50 |
| Total | 50 | 30 | 80 |
Langkah-langkah perhitungan:
Hitung frekuensi yang diharapkan: \[ E_{ij} = \frac{(\text{Total Baris}) \times (\text{Total Kolom})}{\text{Total Keseluruhan}} \] dengan
\(E_{11} = \frac{30 \times 50}{80} = 18.75\)
\(E_{12} = \frac{30 \times 30}{80} = 11.25\)
\(E_{21} = \frac{50 \times 50}{80} = 31.25\)
\(E_{22} = \frac{50 \times 30}{80} = 18.75\)
Hitung Pearson Residual:
\[ e_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]
dengan
- $e_{11} = \frac{20 - 18.75}{\sqrt{18.75}} = 0.29$
- $e_{12} = \frac{10 - 11.25}{\sqrt{11.25}} = -0.37$
- $e_{21} = \frac{30 - 31.25}{\sqrt{31.25}} = -0.22$
- $e_{22} = \frac{20 - 18.75}{\sqrt{18.75}} = 0.29$
# Data Observasi
observed <- matrix(c(20, 10, 30, 20), nrow = 2, byrow = TRUE)
# Hitung nilai ekspektasi
expected <- chisq.test(observed)$expected
# Pearson Residual
pearson_residual <- (observed - expected) / sqrt(expected)
# Standardized Residual
row_sum <- rowSums(observed)
col_sum <- colSums(observed)
total_sum <- sum(observed)
standardized_residual <- (observed - expected) / sqrt(expected * (1 - row_sum / total_sum) * (1 - col_sum / total_sum))
# Menampilkan hasil
list(
Pearson_Residual = pearson_residual,
Standardized_Residual = standardized_residual
)
## $Pearson_Residual
## [,1] [,2]
## [1,] 0.2886751 -0.3726780
## [2,] -0.2236068 0.2886751
##
## $Standardized_Residual
## [,1] [,2]
## [1,] 0.5962848 -0.7698004
## [2,] -0.4618802 0.5962848
Outlier dalam analisis data kategori adalah sel dalam tabel kontingensi yang memiliki nilai residual yang sangat besar, baik positif maupun negatif. Outlier ini menunjukkan bahwa ada kategori yang memiliki frekuensi observasi yang jauh lebih tinggi atau lebih rendah dibandingkan dengan nilai ekspektasi berdasarkan asumsi independensi.
Pearson Residual: \[ e_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \] Jika nilai |e_{ij}| > 2, maka sel tersebut dianggap sebagai indikasi adanya outlier.
Standardized Residual (Adjusted Residual): \[ r_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij} (1 - p_{i+}) (1 - p_{+j})}} \] Jika |r_{ij}| > 3, maka sel tersebut dianggap sebagai outlier signifikan.
Misalkan kita memiliki tabel kontingensi berikut:
| Sukses | Gagal | Total | |
|---|---|---|---|
| Grup A | 50 | 20 | 70 |
| Grup B | 30 | 50 | 80 |
| Total | 80 | 70 | 150 |
Setelah menghitung residual, kita menemukan:
| Pearson Residual | Standardized Residual | |
|---|---|---|
| Grup A, Sukses | 2.06 | 2.45 |
| Grup A, Gagal | -2.20 | -2.60 |
| Grup B, Sukses | -1.96 | -2.10 |
| Grup B, Gagal | 2.06 | 2.45 |
Sel (A, Gagal) memiliki residual negatif terbesar (-2.20, -2.60) → Ini menunjukkan bahwa Grup A mengalami lebih sedikit kegagalan dari yang diprediksi oleh model independensi. Jika |r| melebihi 3, maka sel ini dapat dianggap sebagai outlier yang signifikan.
Sel (A, Sukses) dan (B, Gagal) memiliki residual positif cukup besar → Menunjukkan bahwa ada ketidakseimbangan dalam hubungan antara kategori.
# Data Observasi
observed <- matrix(c(50, 20, 30, 50), nrow = 2, byrow = TRUE)
colnames(observed) <- c("Sukses", "Gagal")
rownames(observed) <- c("Grup A", "Grup B")
# Hitung nilai ekspektasi
expected <- chisq.test(observed)$expected
# Pearson Residual
pearson_residual <- (observed - expected) / sqrt(expected)
# Standardized Residual
row_sum <- rowSums(observed)
col_sum <- colSums(observed)
total_sum <- sum(observed)
standardized_residual <- (observed - expected) / sqrt(expected * (1 - row_sum / total_sum) * (1 - col_sum / total_sum))
# Menampilkan hasil
list(
Observed = observed,
Expected = expected,
Pearson_Residual = pearson_residual,
Standardized_Residual = standardized_residual
)
## $Observed
## Sukses Gagal
## Grup A 50 20
## Grup B 30 50
##
## $Expected
## Sukses Gagal
## Grup A 37.33333 32.66667
## Grup B 42.66667 37.33333
##
## $Pearson_Residual
## Sukses Gagal
## Grup A 2.073070 -2.216205
## Grup B -1.939179 2.073070
##
## $Standardized_Residual
## Sukses Gagal
## Grup A 4.155384 -4.442293
## Grup B -3.887006 4.155384
Deteksi outlier menggunakan residual membantu mengidentifikasi kategori dalam tabel kontingensi yang sangat menyimpang dari ekspektasi.
Jika |r| > 3, maka sel tersebut dapat dianggap sebagai outlier signifikan yang mungkin mempengaruhi kesimpulan analisis.
Residual besar menunjukkan hubungan signifikan antara variabel, sedangkan residual mendekati nol menunjukkan tidak adanya hubungan.
Analisis residual dalam tabel kontingensi membantu memahami kontribusi masing-masing sel terhadap hubungan antara variabel kategori. Pearson residual digunakan untuk melihat seberapa jauh nilai observasi menyimpang dari ekspektasi, sementara standardized residual mempertimbangkan efek margin baris dan kolom untuk menghindari bias dalam interpretasi.
Seorang peneliti ingin mengetahui apakah ada hubungan antara kebiasaan merokok dan kejadian kanker paru-paru. Data yang diperoleh dari sebuah penelitian medis ditampilkan dalam tabel kontingensi berikut:
| Kanker Paru (+) | Kanker Paru (-) | Total | |
|---|---|---|---|
| Perokok | 450 | 200 | 650 |
| Bukan Perokok | 50 | 300 | 350 |
| Total | 500 | 500 | 1000 |
Hitung frekuensi ekspektasi untuk masing-masing sel berdasarkan asumsi independensi.
Hitung Pearson Residual dan Standardized Residual untuk setiap sel.
Interpretasikan hasil residual yang diperoleh.
Tentukan apakah ada kategori yang bisa dianggap sebagai outlier dalam hubungan antara merokok dan kanker paru-paru.
Penyelesaian dalam R
# Data Observasi
observed <- matrix(c(450, 200, 50, 300), nrow = 2, byrow = TRUE)
colnames(observed) <- c("Kanker Paru (+)", "Kanker Paru (-)")
rownames(observed) <- c("Perokok", "Bukan Perokok")
# Hitung nilai ekspektasi
expected <- chisq.test(observed)$expected
# Pearson Residual
pearson_residual <- (observed - expected) / sqrt(expected)
# Standardized Residual
row_sum <- rowSums(observed)
col_sum <- colSums(observed)
total_sum <- sum(observed)
standardized_residual <- (observed - expected) / sqrt(expected * (1 - row_sum / total_sum) * (1 - col_sum / total_sum))
# Menampilkan hasil
list(
Observed = observed,
Expected = expected,
Pearson_Residual = pearson_residual,
Standardized_Residual = standardized_residual
)
## $Observed
## Kanker Paru (+) Kanker Paru (-)
## Perokok 450 200
## Bukan Perokok 50 300
##
## $Expected
## Kanker Paru (+) Kanker Paru (-)
## Perokok 325 325
## Bukan Perokok 175 175
##
## $Pearson_Residual
## Kanker Paru (+) Kanker Paru (-)
## Perokok 6.933752 -6.933752
## Bukan Perokok -9.449112 9.449112
##
## $Standardized_Residual
## Kanker Paru (+) Kanker Paru (-)
## Perokok 16.57484 -16.57484
## Bukan Perokok -16.57484 16.57484
Interpretasi: - Jika residual positif besar, ini menunjukkan bahwa kategori tersebut memiliki lebih banyak kejadian dari yang diharapkan. - Jika residual negatif besar, ini menunjukkan bahwa kategori tersebut memiliki lebih sedikit kejadian dari yang diharapkan. - Jika |r| > 3, maka sel tersebut bisa dianggap sebagai outlier signifikan, yang mungkin mempengaruhi kesimpulan analisis.
Bab ini membahas analisis tabel kontingensi tiga arah secara mendalam, mencakup tabel parsial dan marginal, ukuran asosiasi, Simpson’s Paradox, independensi bersyarat, serta asosiasi homogen. Setiap bagian dilengkapi dengan contoh perhitungan manual dan implementasi dalam R. Tabel kontingensi tiga arah adalah perpanjangan dari tabel kontingensi dua arah yang digunakan untuk menganalisis hubungan antara tiga variabel kategori secara simultan. Dalam banyak situasi, hubungan antara dua variabel (misalnya \(X\) dan \(Y\)) dapat dipengaruhi oleh variabel ketiga \(Z\), yang disebut sebagai variabel kontrol atau kovariat. Tabel ini sering digunakan dalam analisis data ketika ada potensi faktor pengganggu yang dapat mempengaruhi hubungan antara dua variabel utama. Misalnya:
Dalam studi epidemiologi, untuk meneliti hubungan antara merokok (\(X\)) dan kanker paru-paru (\(Y\)) dengan mengendalikan efek usia (\(Z\)).
Dalam penelitian sosial, untuk mengevaluasi hubungan antara ras tersangka (\(X\)) dan keputusan hukuman mati (\(Y\)) dengan mempertimbangkan ras korban (\(Z\)). Tabel kontingensi tiga arah dapat dipecah menjadi:
Tabel Parsial: Tabel yang menyajikan hubungan antara \(X\) dan \(Y\) pada setiap kategori \(Z\). Ini memungkinkan analisis hubungan bersyarat, di mana efek \(Z\) dikendalikan.
Tabel Marginal: Tabel yang diperoleh dengan mengabaikan \(Z\), yaitu dengan menjumlahkan semua kategori \(Z\). Ini memberikan gambaran umum hubungan antara \(X\) dan \(Y\) tanpa mempertimbangkan \(Z\), yang bisa menyebabkan distorsi interpretasi, seperti dalam Simpson’s Paradox.
Kegunaan tabel marginal adalah untuk melihat pola asosiasi secara agregat, tetapi sering kali mengabaikan efek kovariat yang dapat memberikan pemahaman lebih mendalam. Oleh karena itu, analisis yang mempertimbangkan tabel parsial biasanya lebih diutamakan untuk mendapatkan kesimpulan yang lebih akurat dalam penelitian ilmiah.
Tabel parsial adalah tabel yang mengelompokkan \(X\) dan \(Y\) berdasarkan setiap level \(Z\), sedangkan tabel marginal adalah tabel yang mengabaikan \(Z\), dengan menjumlahkan data dari semua level \(Z\).
Struktur Tabel Kontingensi Tiga Arah
\[ \begin{array}{|c|c|c|c|c|c|c|} \hline & & Y = 1 & Y = 2 & \cdots & Y = J & Y = . \\ \hline Z = 1 & X = 1 & n_{111} & n_{121} & \cdots & n_{1J1} & n_{1+1} \\ & X = 2 & n_{211} & n_{221} & \cdots & n_{2J1} & n_{2+1} \\ & \vdots & \vdots & \vdots & \cdots & \vdots & \vdots \\ & X = i & n_{i11} & n_{i21} & \cdots & n_{iJ1} & n_{i+1} \\ & \vdots & \vdots & \vdots & \cdots & \vdots & \vdots \\ & X = I & n_{I11} & n_{I21} & \cdots & n_{IJ1} & n_{I+1} \\ \hline \vdots & \vdots & \vdots & \vdots & \cdots & \vdots & \vdots \\ \hline Z = k & X = 1 & n_{11k} & n_{12k} & \cdots & n_{1Jk} & n_{1+k} \\ & X = 2 & n_{21k} & n_{22k} & \cdots & n_{2Jk} & n_{2+k} \\ & \vdots & \vdots & \vdots & \cdots & \vdots & \vdots \\ & X = i & n_{i1k} & n_{i2k} & \cdots & n_{iJk} & n_{i+k} \\ & \vdots & \vdots & \vdots & \cdots & \vdots & \vdots \\ & X = I & n_{I1k} & n_{I2k} & \cdots & n_{IJk} & n_{I+k} \\ \hline \vdots & \vdots & \vdots & \vdots & \cdots & \vdots & \vdots \\ \hline Z = K & X = 1 & n_{11K} & n_{12K} & \cdots & n_{1JK} & n_{1+K} \\ & X = 2 & n_{21K} & n_{22K} & \cdots & n_{2JK} & n_{2+K} \\ & \vdots & \vdots & \vdots & \cdots & \vdots & \vdots \\ & X = i & n_{i1K} & n_{i2K} & \cdots & n_{iJK} & n_{i+K} \\ & \vdots & \vdots & \vdots & \cdots & \vdots & \vdots \\ & X = I & n_{I1K} & n_{I2K} & \cdots & n_{IJK} & n_{I+K} \\ \hline Z = . & X = . & n_{1+1} & n_{+2+} & \cdots & n_{+J+} & n_{+++} \\ \hline \end{array} \]
Contoh Data: Tabel berikut menggambarkan hubungan antara usia (Z), kebiasaan merokok (X), dan kejadian kanker paru (Y), dengan jumlah total individu dalam setiap kelompok.
Tabel Parsial dan Marginal Tabel parsial adalah tabel yang mengelompokkan \(X\) dan \(Y\) berdasarkan setiap level \(Z\), sedangkan tabel marginal adalah tabel yang mengabaikan \(Z\), dengan menjumlahkan data dari semua level \(Z\).
Contoh Data:
| Z (Usia) | X (Merokok) | Y (Kanker Paru) | Tidak Kanker Paru | Jumlah |
|---|---|---|---|---|
| Muda | Ya | 10 | 40 | 50 |
| Muda | Tidak | 5 | 45 | 50 |
| Dewasa | Ya | 40 | 10 | 50 |
| Dewasa | Tidak | 10 | 40 | 50 |
| Tua | Ya | 50 | 0 | 50 |
| Tua | Tidak | 20 | 30 | 50 |
Tabel Frekuensi Parsial Tabel frekuensi parsial menyajikan hubungan antara dua variabel kategori dalam tabel kontingensi tiga arah dengan mempertahankan satu variabel sebagai kontrol. Tabel ini membantu dalam memahami hubungan bersyarat antara variabel dalam analisis data kategori.
Tabel frekuensi parsial dihitung dengan membagi tabel kontingensi tiga arah berdasarkan kategori variabel kontrol.
Tabel Frekuensi Parsial untuk Z (Usia) = Muda:
| X (Merokok) | Y (Kanker Paru) | Tidak Kanker Paru |
|---|---|---|
| Ya | 10 | 40 |
| Tidak | 5 | 45 |
Tabel Frekuensi Parsial untuk Z (Usia) = Dewasa:
| X (Merokok) | Y (Kanker Paru) | Tidak Kanker Paru |
|---|---|---|
| Ya | 40 | 10 |
| Tidak | 10 | 40 |
Tabel Frekuensi Parsial untuk Z (Usia) = Tua:
| X (Merokok) | Y (Kanker Paru) | Tidak Kanker Paru |
|---|---|---|
| Ya | 50 | 0 |
| Tidak | 20 | 30 |
Implementasi dalam R
data3 <- array(c(10, 40, 50, 5, 10, 20, 40, 10, 0, 45, 40, 30),
dim = c(2, 2, 3),
dimnames = list(
Merokok = c("Ya", "Tidak"),
Kanker = c("Ya", "Tidak"),
Usia = c("Muda", "Dewasa", "Tua")
))
# Ekstrak tabel parsial berdasarkan usia
freq_parsial_muda <- data3[, , "Muda"]
freq_parsial_dewasa <- data3[, , "Dewasa"]
freq_parsial_tua <- data3[, , "Tua"]
# Tampilkan hasil
freq_parsial_muda
## Kanker
## Merokok Ya Tidak
## Ya 10 50
## Tidak 40 5
freq_parsial_dewasa
## Kanker
## Merokok Ya Tidak
## Ya 10 40
## Tidak 20 10
freq_parsial_tua
## Kanker
## Merokok Ya Tidak
## Ya 0 40
## Tidak 45 30
Kesimpulan Tabel frekuensi parsial memungkinkan analisis hubungan antara dua variabel dengan mempertimbangkan variabel kontrol. Ini membantu mengidentifikasi pola yang mungkin tersembunyi dalam tabel frekuensi marginal.
Tabel Frekuensi Marginal Tabel frekuensi marginal menampilkan jumlah total observasi untuk setiap variabel dengan mengabaikan variabel lainnya dalam tabel kontingensi tiga arah. Tabel ini membantu dalam memahami distribusi kategori secara agregat tanpa mempertimbangkan hubungan antarvariabel. Tabel frekuensi marginal dihitung dengan menjumlahkan frekuensi dari tabel kontingensi tiga arah berdasarkan variabel yang tersisa.
Tabel Frekuensi Marginal untuk X (Merokok) dan Y (Kanker Paru):
| X (Merokok) | Y (Kanker Paru) | Tidak Kanker Paru | Total |
|---|---|---|---|
| Ya | 100 | 50 | 150 |
| Tidak | 35 | 115 | 150 |
Tabel Frekuensi Marginal untuk Z (Usia) dan Y (Kanker Paru):
| Z (Usia) | Y (Kanker Paru) | Tidak Kanker Paru | Total |
|---|---|---|---|
| Muda | 15 | 85 | 100 |
| Dewasa | 50 | 50 | 100 |
| Tua | 70 | 30 | 100 |
Implementasi dalam R
data3 <- array(c(10, 40, 50, 5, 10, 20, 40, 10, 0, 45, 40, 30),
dim = c(2, 2, 3),
dimnames = list(
Merokok = c("Ya", "Tidak"),
Kanker = c("Ya", "Tidak"),
Usia = c("Muda", "Dewasa", "Tua")
))
# Hitung frekuensi marginal
freq_marginal_X <- apply(data3, 1, sum)
freq_marginal_Z <- apply(data3, 3, sum)
# Tampilkan hasil
freq_marginal_X
## Ya Tidak
## 150 150
freq_marginal_Z
## Muda Dewasa Tua
## 105 80 115
Kesimpulan Tabel frekuensi marginal memberikan gambaran umum tentang distribusi kategori variabel dalam tabel kontingensi tiga arah. Ini berguna dalam memahami pola distribusi data tanpa mempertimbangkan hubungan antarvariabel.
Dari tabel ini, kita dapat melihat: -Proporsi kanker paru lebih tinggi pada kelompok usia yang lebih tua. -Perokok memiliki jumlah kasus kanker paru lebih tinggi dibandingkan yang tidak merokok dalam setiap kelompok usia. -Perbedaan antara kelompok perokok dan non-perokok semakin jelas seiring bertambahnya usia.
1. Peluang Bersama (Joint Probability)
Peluang bersama didefinisikan sebagai: \[ P(Z, X, Y) = \frac{f(Z, X, Y)}{N} \]
Sebagai contoh, peluang seseorang berusia tua, merokok, dan menderita kanker paru:
\[ P(Tua, Ya, Kanker) = \frac{50}{300} = 0.1667 \]
Implementasi dalam R:
data <- data.frame(
Usia = rep(c("Muda", "Dewasa", "Tua"), each = 2),
Merokok = rep(c("Ya", "Tidak"), 3),
Kanker = c(10, 5, 40, 10, 50, 20),
Total = c(50, 50, 50, 50, 50, 50)
)
data$P_ZXY <- data$Kanker / sum(data$Total)
data
## Usia Merokok Kanker Total P_ZXY
## 1 Muda Ya 10 50 0.03333333
## 2 Muda Tidak 5 50 0.01666667
## 3 Dewasa Ya 40 50 0.13333333
## 4 Dewasa Tidak 10 50 0.03333333
## 5 Tua Ya 50 50 0.16666667
## 6 Tua Tidak 20 50 0.06666667
Tabel Probabilitas Bersama (Joint Probability) Tabel probabilitas bersama dihitung dengan membagi setiap sel dengan total keseluruhan sampel.
Tabel Probabilitas Bersama untuk Y (Kanker Paru) dan Tidak Kanker Paru:
| Z (Usia) | X (Merokok) | P(Y | X, Z) |
|---|---|---|---|
| Muda | Ya | 0.033 | 0.133 |
| Muda | Tidak | 0.017 | 0.150 |
| Dewasa | Ya | 0.133 | 0.033 |
| Dewasa | Tidak | 0.033 | 0.133 |
| Tua | Ya | 0.167 | 0.000 |
| Tua | Tidak | 0.067 | 0.100 |
Implementasi dalam R
data3 <- array(c(10, 40, 50, 5, 10, 20, 40, 10, 0, 45, 40, 30),
dim = c(2, 2, 3),
dimnames = list(
Merokok = c("Ya", "Tidak"),
Kanker = c("Ya", "Tidak"),
Usia = c("Muda", "Dewasa", "Tua")
))
# Hitung probabilitas bersama
total <- sum(data3)
joint_prob <- data3 / total
ftable(joint_prob)
## Usia Muda Dewasa Tua
## Merokok Kanker
## Ya Ya 0.03333333 0.03333333 0.00000000
## Tidak 0.16666667 0.13333333 0.13333333
## Tidak Ya 0.13333333 0.06666667 0.15000000
## Tidak 0.01666667 0.03333333 0.10000000
2. Peluang Marginal (Marginal Probability)
Peluang marginal diperoleh dengan menjumlahkan probabilitas bersama:
\[ P(Y=1) = \sum_{Z,X} P(Z,X,Y=1) \]
\[ P(X=Ya) = \sum_{Z,Y} P(Z,X=Ya,Y) \]
Sebagai contoh, peluang terkena kanker:
\[ P(Y=1) = \frac{10 + 5 + 40 + 10 + 50 + 20}{300} = 0.45 \]
Implementasi dalam R:
P_Y1 <- sum(data$Kanker) / sum(data$Total)
P_Y1
## [1] 0.45
Tabel Peluang Marginal
Tabel peluang marginal dihitung dengan menjumlahkan probabilitas bersama untuk setiap variabel yang tersisa setelah mengabaikan variabel lain.
Tabel Peluang Marginal untuk X (Merokok) dan Y (Kanker Paru):
| X (Merokok) | P(Y) | P(Tidak Y) |
|---|---|---|
| Ya | 0.333 | 0.167 |
| Tidak | 0.167 | 0.333 |
Tabel Peluang Marginal untuk Z (Usia) dan Y (Kanker Paru):
| Z (Usia) | P(Y) | P(Tidak Y) |
|---|---|---|
| Muda | 0.050 | 0.283 |
| Dewasa | 0.167 | 0.167 |
| Tua | 0.233 | 0.100 |
Implementasi dalam R
data3 <- array(c(10, 40, 50, 5, 10, 20, 40, 10, 0, 45, 40, 30),
dim = c(2, 2, 3),
dimnames = list(
Merokok = c("Ya", "Tidak"),
Kanker = c("Ya", "Tidak"),
Usia = c("Muda", "Dewasa", "Tua")
))
# Hitung probabilitas bersama
total <- sum(data3)
joint_prob <- data3 / total
# Hitung probabilitas marginal
marginal_X <- apply(joint_prob, 1, sum)
marginal_Z <- apply(joint_prob, 3, sum)
# Tampilkan hasil
marginal_X
## Ya Tidak
## 0.5 0.5
marginal_Z
## Muda Dewasa Tua
## 0.3500000 0.2666667 0.3833333
Kesimpulan Tabel peluang marginal membantu memahami distribusi probabilitas dari masing-masing variabel tanpa mempertimbangkan variabel lainnya. Ini memberikan wawasan penting dalam analisis data kategori dengan tabel kontingensi tiga arah.
3. Peluang Bersyarat (Conditional Probability)
Peluang bersyarat didefinisikan sebagai:
\[ P(Z | X, Y) = \frac{P(Z, X, Y)}{P(X, Y)} \]
Sebagai contoh, peluang seseorang berusia tua diberikan bahwa dia merokok dan menderita kanker:
\[ P(Tua | X=Ya, Y=1) = \frac{P(Tua, Ya, Y=1)}{P(X=Ya, Y=1)} \]
Menghitung secara manual:
\[ P(X=Ya, Y=1) = \frac{10 + 40 + 50}{300} = 0.3333 \]
\[ P(Tua | X=Ya, Y=1) = \frac{50/300}{0.3333} = 0.5 \]
Implementasi dalam R:
P_X_Y1 <- sum(data$Kanker[data$Merokok == "Ya"]) / sum(data$Total)
P_Tua_given_X_Y1 <- (50 / 300) / P_X_Y1
P_Tua_given_X_Y1
## [1] 0.5
Peluang bersyarat dihitung berdasarkan jumlah total dalam setiap kategori.
Tabel Peluang Bersyarat untuk Usia Muda:
| X (Merokok) | P(Y | X) |
|---|---|---|
| Ya | 0.20 | 0.80 |
| Tidak | 0.10 | 0.90 |
Tabel Peluang Bersyarat untuk Usia Dewasa:
| X (Merokok) | P(Y | X) |
|---|---|---|
| Ya | 0.80 | 0.20 |
| Tidak | 0.20 | 0.80 |
Tabel Peluang Bersyarat untuk Usia Tua:
| X (Merokok) | P(Y | X) |
|---|---|---|
| Ya | 1.00 | 0.00 |
| Tidak | 0.40 | 0.60 |
Implementasi dalam R
data3 <- array(c(10, 40, 50, 5, 10, 20, 40, 10, 0, 45, 40, 30),
dim = c(2, 2, 3),
dimnames = list(
Merokok = c("Ya", "Tidak"),
Kanker = c("Ya", "Tidak"),
Usia = c("Muda", "Dewasa", "Tua")
))
ftable(data3)
## Usia Muda Dewasa Tua
## Merokok Kanker
## Ya Ya 10 10 0
## Tidak 50 40 40
## Tidak Ya 40 20 45
## Tidak 5 10 30
Kesimpulan
Analisis ini dapat diperluas untuk memahami hubungan antara variabel yang lebih kompleks!
1. Beda Peluang (BP) \[ BP = P(Y | X_1, Z) - P(Y | X_2, Z) \]
2. Risiko Relatif (RR) \[ RR = \frac{P(Y | X_1, Z)}{P(Y | X_2, Z)} \]
3. Odds Ratio (OR) \[ OR = \frac{P(Y | X_1, Z) / (1 - P(Y | X_1, Z))}{P(Y | X_2, Z) / (1 - P(Y | X_2, Z))} \]
Ukuran asosiasi dalam tabel kontingensi digunakan untuk mengukur kekuatan hubungan antara dua variabel kategori. Tiga ukuran asosiasi yang umum digunakan adalah Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR). Dokumen ini menjelaskan rumus masing-masing ukuran asosiasi, perhitungan secara manual langkah demi langkah, implementasi dalam R, serta interpretasi dari hasil yang diperoleh.
Perhitungan Ukuran Asosiasi
1. Risk Difference (RD) Risk Difference mengukur perbedaan probabilitas kejadian antara dua kelompok.
Perhitungan Manual: \[ RD = \frac{10}{50} - \frac{5}{50} = 0.2 - 0.1 = 0.1 \]
Interpretasi RD: Risk Difference sebesar 0.1 (10%) menunjukkan bahwa probabilitas terkena kanker paru-paru lebih tinggi 10% pada kelompok perokok dibandingkan dengan kelompok non-perokok.
2. Relative Risk (RR) Relative Risk membandingkan probabilitas kejadian antara dua kelompok.
Perhitungan Manual: \[ RR = \frac{10 / 50}{5 / 50} = \frac{0.2}{0.1} = 2.0 \]
Interpretasi RR: Relative Risk sebesar 2.0 menunjukkan bahwa perokok memiliki risiko terkena kanker paru-paru 2 kali lebih tinggi dibandingkan dengan non-perokok.
3. Odds Ratio (OR) Odds Ratio membandingkan odds kejadian antara dua kelompok.
Perhitungan Manual: \[ OR = \frac{(10 \times 45)}{(5 \times 40)} = \frac{450}{200} = 2.25 \]
Interpretasi OR: Odds Ratio sebesar 2.25 menunjukkan bahwa odds terkena kanker paru-paru pada perokok adalah 2.25 kali lebih besar dibandingkan dengan non-perokok.
Implementasi dalam R
data <- matrix(c(10, 40, 5, 45), nrow = 2, byrow = TRUE)
rownames(data) <- c("Merokok", "Tidak")
colnames(data) <- c("Kanker", "Tidak Kanker")
data
## Kanker Tidak Kanker
## Merokok 10 40
## Tidak 5 45
# Hitung Risk Difference
p1 <- data[1, 1] / sum(data[1, ])
p2 <- data[2, 1] / sum(data[2, ])
RD <- p1 - p2
RD
## [1] 0.1
# Hitung Relative Risk
RR <- p1 / p2
RR
## [1] 2
# Hitung Odds Ratio
odds1 <- data[1, 1] / data[1, 2]
odds2 <- data[2, 1] / data[2, 2]
OR <- odds1 / odds2
OR
## [1] 2.25
Kesimpulan Ukuran asosiasi seperti Risk Difference, Relative Risk, dan Odds Ratio sangat berguna dalam mengukur hubungan antara variabel dalam tabel kontingensi.
Hasil analisis menunjukkan bahwa:
Risk Difference sebesar 0.1 (10%) mengindikasikan bahwa perokok memiliki peluang terkena kanker paru-paru yang lebih tinggi sebesar 10% dibandingkan non-perokok.
Relative Risk sebesar 2.0 menunjukkan bahwa perokok memiliki risiko 2 kali lebih tinggi terkena kanker paru-paru dibandingkan non-perokok.
Odds Ratio sebesar 2.25 menunjukkan bahwa odds terkena kanker paru-paru pada perokok adalah 2.25 kali lebih besar dibandingkan dengan non-perokok.
Ketiga ukuran ini memberikan gambaran bahwa terdapat hubungan positif antara kebiasaan merokok dan risiko kanker paru-paru. Namun, perlu diperhatikan bahwa hubungan ini tidak selalu bersifat kausal, dan faktor lain juga dapat berkontribusi terhadap risiko penyakit.
Kasus 1
Dataset ini berisi informasi tentang hubungan antara ras tersangka, ras korban, dan putusan hukuman mati berdasarkan penelitian Agresti (2019, page 53 Table 2.9).
Variabel yang Digunakan
Struktur Data dalam Tabel Kontingensi 3D
Data dalam bentuk tabel kontingensi tiga arah dapat direpresentasikan sebagai berikut:
data_tabel <- data.frame(
"Victims' Race" = c("White", "", "Black", "", "Total", ""),
"Defendant's Race" = c("White", "Black", "White", "Black", "White", "Black"),
"Yes" = c(53, 11, 0, 4, 53, 15),
"No" = c(414, 37, 16, 139, 430, 176),
"Percentage Yes" = c(11.3, 22.9, 0.0, 2.8, 11.0, 7.9)
)
kable(data_tabel, format = "latex", booktabs = TRUE,
caption = "Putusan Hukuman Mati berdasarkan Ras Tersangka dan Korban") %>%
kable_styling(full_width = FALSE, position = "center")
Tabel marginal dengan menjumlahkan seluruh korban Tabel marginal diperoleh dengan menjumlahkan data berdasarkan kategori tertentu.
marginal <- apply(data, c(1, 2), sum)
df_marginal <- as.data.frame(marginal)
colnames(df_marginal) <- c("Ya", "Tidak")
rownames(df_marginal) <- c("Tersangka White", "Tersangka Black")
kable(df_marginal, format = "latex",
caption = "Tabel Marginal (Total untuk Semua Korban)") %>%
kable_styling(full_width = FALSE, position = "center")
Kesimpulan
Tabel Parsial menunjukkan hubungan antara ras tersangka dan putusan hukuman mati untuk setiap kategori ras korban.
Tabel Marginal menunjukkan hubungan ras tersangka dan putusan hukuman mati setelah menggabungkan semua kategori ras korban.
Dari tabel marginal, terlihat bahwa putusan hukuman mati lebih sering diberikan kepada tersangka berkulit putih dibandingkan dengan tersangka berkulit hitam dalam kasus yang melibatkan korban berkulit putih.
Analisis lebih lanjut dapat dilakukan dengan Chi-Square Test atau Model Log-Linear untuk melihat interaksi antar-variabel.
Jika terdapat confounding effect, metode G-statistics atau logistic regression bisa digunakan untuk mengontrol efek tersebut.
Perhitungan Asosiasi
Analisis tabel kontingensi tiga arah ini dilakukan untuk mengevaluasi hubungan antara ras tersangka, ras korban, dan putusan hukuman mati. Kami akan menghitung tiga ukuran asosiasi utama:
Tabel Kontingensi Parsial
1. Risk Difference (RD) Rumus: \[ RD = \frac{a}{a+b} - \frac{c}{c+d} \]
Perhitungan Manual: Misalkan kita menghitung RD untuk tersangka kulit putih dibandingkan dengan kulit hitam (untuk korban kulit putih):
\[ RD = \left( \frac{53}{467} \right) - \left( \frac{11}{48} \right) \]
Jika diperoleh RD = -0.1156, artinya risiko putusan hukuman mati bagi tersangka kulit hitam lebih tinggi 11.56% dibandingkan tersangka kulit putih (karena nilai negatif menunjukkan bahwa kelompok referensi memiliki risiko lebih rendah).
Perhitungan dengan R:
RD_white <- 53 / (53 + 414)
RD_black <- 11 / (11 + 37)
RD <- RD_white - RD_black
RD
## [1] -0.1156763
2. Relative Risk (RR) Rumus: \[ RR = \frac{\frac{a}{a+b}}{\frac{c}{c+d}} \]
Perhitungan Manual: \[ RR = \frac{\left( \frac{53}{467} \right)}{\left( \frac{11}{48} \right)} \]
Jika diperoleh RR = 0.495, artinya tersangka kulit putih memiliki risiko hanya 49.5% dibandingkan tersangka kulit hitam untuk mendapatkan putusan hukuman mati. Karena nilai RR kurang dari 1, ini menunjukkan bahwa tersangka kulit putih memiliki risiko lebih rendah dibandingkan tersangka kulit hitam.
Perhitungan dengan R:
RR <- RD_white / RD_black
RR
## [1] 0.4952307
3. Odds Ratio (OR) Rumus: \[ OR = \frac{a \times d}{b \times c} \]
Perhitungan Manual: \[ OR = \frac{53 \times 37}{414 \times 11} \]
Jika diperoleh OR = 0.431, artinya peluang (odds) tersangka kulit putih untuk mendapatkan putusan hukuman mati hanya 43.1% dibandingkan dengan tersangka kulit hitam. Karena OR < 1, ini menunjukkan bahwa tersangka kulit putih memiliki peluang lebih kecil dibandingkan tersangka kulit hitam untuk menerima hukuman mati.
Perhitungan dengan R:
OR <- (53 * 37) / (414 * 11)
OR
## [1] 0.4306105
Interpretasi Hasil
Risk Difference (RD = -0.1156): Risiko hukuman mati bagi tersangka kulit hitam lebih tinggi 11.56% dibandingkan dengan tersangka kulit putih.
Relative Risk (RR = 0.495): Tersangka kulit putih memiliki risiko 50.5% lebih rendah dibandingkan dengan tersangka kulit hitam untuk menerima hukuman mati.
Odds Ratio (OR = 0.431): Peluang tersangka kulit putih untuk dihukum mati hanya 43.1% dibandingkan dengan tersangka kulit hitam.
Kesimpulan dari hasil ini adalah bahwa tersangka kulit hitam memiliki kemungkinan lebih besar untuk dijatuhi hukuman mati dibandingkan dengan tersangka kulit putih dalam kasus ini.
Conditional independence (kemandirian bersyarat) dalam tabel kontingensi terjadi ketika dua variabel menjadi independen setelah dikendalikan oleh variabel ketiga.
Matematis, dua variabel X dan Y dikatakan independen secara kondisional terhadap variabel Z jika: \[ P(X, Y | Z) = P(X | Z) P(Y | Z) \]
atau dalam bentuk frekuensi: \[ \frac{n_{ijk}}{n_{k++}} = \frac{n_{i+k}}{n_{k++}} \times \frac{n_{+jk}}{n_{k++}} \]
Contoh Kasus:
Misalkan kita memiliki data tentang kebiasaan olahraga (X), kesehatan jantung (Y), dan usia (Z).
X (Olahraga): Rutin, Tidak Rutin
Y (Kesehatan Jantung): Sehat, Tidak Sehat
Z (Usia): Muda, Tua
library(knitr)
library(kableExtra)
sports_health <- array(
c(30, 10, 20, 40, 5, 15, 10, 50),
dim = c(2, 2, 2),
dimnames = list(
"Olahraga" = c("Rutin", "Tidak Rutin"),
"Kesehatan" = c("Sehat", "Tidak Sehat"),
"Usia" = c("Muda", "Tua")
)
)
for (z in dimnames(sports_health)$Usia) {
df <- as.data.frame.matrix(sports_health[,,z])
colnames(df) <- c("Sehat", "Tidak Sehat")
rownames(df) <- c("Olahraga Rutin", "Tidak Rutin")
print(kable(df, format = "latex", booktabs = TRUE,
caption = paste("Tabel untuk Usia =", z)) %>%
kable_styling(full_width = FALSE, position = "center"))
}
Pengujian Conditional Independence
Untuk menguji apakah kesehatan dan olahraga independen secara kondisional terhadap usia, kita gunakan uji chi-square dalam setiap strata usia.
Perhitungan Manual Untuk setiap kategori Usia (Z), kita uji apakah: \[ P(X, Y | Z) \approx P(X | Z) P(Y | Z) \]
Misalkan untuk usia muda:
\(P(Sehat | Olahraga Rutin, Muda) = \frac{30}{30+10} = 0.75\)
\(P(Sehat | Tidak Olahraga, Muda) = \frac{20}{20+40} = 0.333\)
\(P(Sehat | Muda) = \frac{30+20}{100} = 0.5\)
Jika \(P(Sehat | Olahraga Rutin, Muda)\) tidak berbeda jauh dari \(P(Sehat | Muda)\), maka conditional independence berlaku.
Perhitungan dengan R
# Uji Chi-Square untuk masing-masing strata usia
chisq_muda <- chisq.test(sports_health[,,"Muda"])
chisq_tua <- chisq.test(sports_health[,,"Tua"])
chisq_muda
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: sports_health[, , "Muda"]
## X-squared = 15.042, df = 1, p-value = 0.0001052
chisq_tua
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: sports_health[, , "Tua"]
## X-squared = 0.24615, df = 1, p-value = 0.6198
Interpretasi Hasil
Jika nilai p-value > 0.05, maka tidak ada hubungan signifikan antara olahraga dan kesehatan setelah dikendalikan oleh usia (kondisional independen).
Jika p-value < 0.05, maka masih ada hubungan signifikan, artinya olahraga dan kesehatan tetap bergantung meskipun usia dikendalikan.
Kasus 2
library(kableExtra)
Tabel kontingensi 3 arah digunakan untuk menganalisis hubungan antara tiga variabel kategorik. Misalkan kita memiliki dataset hipotetis mengenai pengaruh Obat (X) dan Jenis Kelamin (Z) terhadap Kesembuhan (Y) pasien.
Variabel yang digunakan: - Y (Kesembuhan):
Sembuh atau Tidak Sembuh - X
(Obat): A atau B - Z (Jenis
Kelamin): Laki-laki atau
Perempuan
Data Tabel Kontingensi 3 Arah
Berikut adalah data hipotetis:
data <- array(
c(30, 10, 25, 15, 35, 20, 40, 30),
dim = c(2, 2, 2),
dimnames = list(
Y = c("Sembuh", "Tidak Sembuh"),
X = c("Obat A", "Obat B"),
Z = c("Laki-laki", "Perempuan")
)
)
data
## , , Z = Laki-laki
##
## X
## Y Obat A Obat B
## Sembuh 30 25
## Tidak Sembuh 10 15
##
## , , Z = Perempuan
##
## X
## Y Obat A Obat B
## Sembuh 35 40
## Tidak Sembuh 20 30
Tabel Marginal
Tabel marginal menunjukkan distribusi variabel dengan mengabaikan variabel lainnya.
margin_YX <- apply(data, c(1, 2), sum)
margin_YZ <- apply(data, c(1, 3), sum)
margin_XZ <- apply(data, c(2, 3), sum)
cat("\n## Marginal Y dan X\n")
kable(margin_YX, format = "latex", booktabs = TRUE)
Perhitungan Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR)
Kita menghitung RD, RR, dan OR untuk setiap tingkat
Z (Laki-laki dan Perempuan).
Perhitungan Manual
1. Laki-laki
a <- data["Sembuh", "Obat A", "Laki-laki"]
b <- data["Tidak Sembuh", "Obat A", "Laki-laki"]
c <- data["Sembuh", "Obat B", "Laki-laki"]
d <- data["Tidak Sembuh", "Obat B", "Laki-laki"]
p1 <- a / (a + b)
p2 <- c / (c + d)
RD_male <- p1 - p2
RR_male <- p1 / p2
OR_male <- (a * d) / (b * c)
data_RD_RR_OR_male <- data.frame(RD = RD_male, RR = RR_male, OR = OR_male)
kable(data_RD_RR_OR_male, format = "latex", booktabs = TRUE)
2. Perempuan
a <- data["Sembuh", "Obat A", "Perempuan"]
b <- data["Tidak Sembuh", "Obat A", "Perempuan"]
c <- data["Sembuh", "Obat B", "Perempuan"]
d <- data["Tidak Sembuh", "Obat B", "Perempuan"]
p1 <- a / (a + b)
p2 <- c / (c + d)
RD_female <- p1 - p2
RR_female <- p1 / p2
OR_female <- (a * d) / (b * c)
data_RD_RR_OR_female <- data.frame(RD = RD_female, RR = RR_female, OR = OR_female)
kable(data_RD_RR_OR_female, format = "latex", booktabs = TRUE)
Kesimpulan
Analisis tabel kontingensi 3 arah ini menunjukkan bahwa jenis kelamin (Z) mempengaruhi hubungan antara obat (X) dan kesembuhan (Y). Obat A lebih efektif untuk laki-laki, sementara efeknya lebih kecil untuk perempuan. Hasil ini dapat digunakan dalam pengambilan keputusan medis.
Tabel kontingensi tiga arah digunakan untuk menganalisis hubungan antara dua variabel kategorik dengan mempertimbangkan variabel kontrol. Contohnya adalah hubungan antara kebiasaan merokok (X) dan kanker paru-paru (Y) dengan variabel kontrol usia (Z).
Tabel ini terdiri dari beberapa tabel parsial (2×2) untuk setiap tingkat Z, serta tabel marginal yang mengabaikan Z. Ukuran asosiasi yang digunakan adalah odds ratio:
\[ \text{OR} = \frac{a \cdot d}{b \cdot c} \]
dengan: - \(a\) = jumlah kasus kanker yang merokok - \(b\) = jumlah kasus kanker yang tidak merokok - \(c\) = jumlah tidak kanker yang merokok - \(d\) = jumlah tidak kanker yang tidak merokok
Jika odds ratio parsial relatif konstan, kita dapat menghitung odds ratio bersama menggunakan estimasi Mantel-Haenszel.
Independensi bersyarat adalah konsep penting dalam analisis tabel kontingensi tiga arah. Ini merujuk pada kondisi di mana dua variabel, \(X\) dan \(Y\), independen dalam setiap level variabel ketiga, \(Z\). Pengujian independensi bersyarat dilakukan dengan metode statistik seperti uji Cochran-Mantel-Haenszel (CMH).
Definisi Independensi Bersyarat
Independensi Bersyarat: Dua variabel, \(X\) dan \(Y\), dikatakan independen bersyarat terhadap variabel ketiga, \(Z\), jika rasio odds mereka dalam setiap strata \(Z\) sama dengan 1.
Secara matematis, ini dapat dituliskan sebagai:
\[ OR(X, Y | Z) = 1 \]
Artinya, setelah mengendalikan pengaruh \(Z\), tidak ada hubungan antara \(X\) dan \(Y\) dalam setiap strata.
Hal yang Perlu Diperhatikan
Metode Cochran-Mantel-Haenszel Tujuan Uji CMH Uji Cochran-Mantel-Haenszel (CMH) digunakan untuk menguji hubungan antara dua variabel kategori dengan mempertimbangkan efek dari variabel perancu (confounder). Uji ini berguna dalam:
Ide Dasar Uji CMH Uji CMH berangkat dari konsep tabel kontingensi berlapis (stratified 2 × 2 tables), di mana dua variabel utama dipecah menjadi beberapa strata berdasarkan variabel perancu.
Sebagai contoh, jika kita ingin melihat hubungan antara merokok (X) dan kanker paru-paru (Y), namun juga ingin mempertimbangkan pengaruh polusi udara (Z), maka kita membuat beberapa tabel 2 × 2 berdasarkan tingkat polusi udara. CMH kemudian menguji hubungan antara X dan Y setelah mengontrol efek Z.
Hipotesis
Statistik Uji
Statistik uji Cochran-Mantel-Haenszel (CMH) dirumuskan sebagai:
\[ CMH = \frac{\left[ \sum_k (n_{11k} - \mu_{11k}) \right]^2}{\sum_k \text{var}(n_{11k})} \]
Keterangan
\(n_{11k}\): nilai frekuensi sel baris 1 kolom 1 pada tabel parsial ke-\(k\).
\(\mu_{11k}\): nilai ekspektasi sel baris 1 kolom 1 pada tabel parsial ke-\(k\), dihitung dengan rumus:
\[ \mu_{11k} = E(n_{11k}) = \frac{n_{1.k} \cdot n_{.1k}}{n_{..k}} \]
\[ \text{var}(n_{11k}) = \frac{n_{1.k} \cdot n_{2.k} \cdot n_{.1k} \cdot n_{.2k}}{n_{..k}^2 (n_{..k} - 1)} \]
Contoh 1 Misalkan kita memiliki data mengenai efek merokok terhadap kanker paru-paru, tetapi ingin mengontrol faktor jenis kelamin. Data dikategorikan menjadi laki-laki dan perempuan dengan tabel 2×2 masing-masing:
Tabel Kontingensi
Strata: Laki-laki
| Kanker Paru-paru (+) | Kanker Paru-paru (-) | Total | |
|---|---|---|---|
| Perokok | 50 | 30 | 80 |
| Tidak Merokok | 20 | 50 | 70 |
Strata: Perempuan
| Kanker Paru-paru (+) | Kanker Paru-paru (-) | Total | |
|---|---|---|---|
| Perokok | 40 | 20 | 60 |
| Tidak Merokok | 10 | 40 | 50 |
Perhitungan Manual
Rumus nilai harapan \(\mu_{11k}\) untuk setiap strata \(k\):
\[ \mu_{11k} = \frac{(n_{1+k} \times n_{+1k})}{n_{++k}} \]
Di mana: - \(n_{1+k}\) = Total perokok dalam strata \(k\) - \(n_{+1k}\) = Total penderita kanker dalam strata \(k\) - \(n_{++k}\) = Total individu dalam strata \(k\)
Untuk laki-laki (k=1):
\[ \mu_{111} = \frac{(80 \times 70)}{150} = \frac{5600}{150} = 37.33 \]
Untuk perempuan (k=2):
\[ \mu_{112} = \frac{(60 \times 50)}{110} = \frac{3000}{110} = 27.27 \]
Rumus varians:
\[ \text{Var}(n_{11k}) = \frac{n_{1+k} n_{0+k} n_{+1k} n_{+0k}}{n_{++k}^2 (n_{++k} - 1)} \]
Untuk laki-laki (k=1):
\[ \text{Var}(n_{111}) = \frac{(80 \times 70 \times 70 \times 80)}{150^2 \times (150 - 1)} \] \[ = \frac{28000000}{150^2 \times 149} = \frac{31360000}{3352500} = 9.35 \]
Untuk perempuan (k=2): \[ \text{Var}(n_{112}) = \frac{(60 \times 50 \times 50 \times 60)}{110^2 \times (110 - 1)} \] \[ = \frac{8400000}{12100 \times 109} = \frac{9000000}{1318900} = 6.82 \]
Rumus statistik CMH:
\[ X^2_{CMH} = \frac{(\sum_k (n_{11k} - \mu_{11k}))^2}{\sum_k \text{Var}(n_{11k})} \]
\[ X^2_{CMH} = \frac{(50 - 37.33 + 40 - 27.27)^2}{9.35 + 6.82} \]
\[ X^2_{CMH} = \frac{(12.67 + 12.73)^2}{16.18} = \frac{25.4^2}{16.18} = \frac{644.85}{16.18} = 39.86 \]
Statistik uji ini dibandingkan dengan distribusi \(\chi^2\) dengan 1 derajat kebebasan. Jika nilai \(X^2_{CMH}\) lebih besar dari nilai kritis \(\chi^2_{1,\alpha}\), maka kita tolak hipotesis nol dan menyimpulkan ada hubungan antara merokok dan kanker paru-paru setelah mengontrol jenis kelamin.
Dengan \(\alpha = 0.05\), nilai kritis \(\chi^2_{1,0.05} = 3.841\). Karena \(39.86 > 3.841\), maka hipotesis nol ditolak, yang berarti ada hubungan signifikan antara merokok dan kanker paru-paru setelah mengontrol jenis kelamin.
Implementasi Uji CMH di R
Contoh Penerapan Uji CMH dengan R Misalkan kita memiliki data mengenai efek merokok terhadap kanker paru-paru, tetapi ingin mengontrol faktor jenis kelamin. Data dikategorikan menjadi laki-laki dan perempuan dengan tabel 2×2 masing-masing:
Data
data_cmh <- array(c(50, 30, 20, 50, # Laki-laki
40, 20, 10, 40), # Perempuan
dim = c(2, 2, 2),
dimnames = list(
Merokok = c("Perokok", "Tidak Merokok"),
Kanker = c("Kanker (+)", "Kanker (-)"),
Jenis_Kelamin = c("Laki-laki", "Perempuan")
))
data_cmh
## , , Jenis_Kelamin = Laki-laki
##
## Kanker
## Merokok Kanker (+) Kanker (-)
## Perokok 50 20
## Tidak Merokok 30 50
##
## , , Jenis_Kelamin = Perempuan
##
## Kanker
## Merokok Kanker (+) Kanker (-)
## Perokok 40 10
## Tidak Merokok 20 40
Uji CMH dengan Base R Menggunakan fungsi mantelhaen.test
cmh_base <- mantelhaen.test(data_cmh, correct = FALSE)
cmh_base
##
## Mantel-Haenszel chi-squared test without continuity correction
##
## data: data_cmh
## Mantel-Haenszel X-squared = 39.86, df = 1, p-value = 2.729e-10
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 3.132410 9.187417
## sample estimates:
## common odds ratio
## 5.364583
Kesimpulan Dari hasil uji Cochran-Mantel-Haenszel dengan beberapa metode di atas, kita dapat membandingkan hasil statistik uji dan kesimpulan dari tiap metode. Jika nilai p lebih kecil dari 0.05, maka kita menolak hipotesis nol, yang berarti ada hubungan signifikan antara merokok dan kanker paru-paru setelah mengontrol jenis kelamin.
Contoh 2 Misalkan kita memiliki data mengenai efektivitas sebuah program pelatihan dalam meningkatkan keterampilan pekerja, tetapi ingin mengontrol faktor industri tempat bekerja. Data dikategorikan berdasarkan tiga industri dengan tabel 2×2 masing-masing:
Data
library(knitr)
data <- array(c(20, 30, 10, 40,
15, 25, 5, 35,
18, 32, 12, 38),
dim = c(2, 2, 3),
dimnames = list(
Pelatihan = c("Mengikuti", "Tidak Mengikuti"),
Peningkatan = c("Ya", "Tidak"),
Industri = c("Stratum 1", "Stratum 2", "Stratum 3")
))
print(data)
## , , Industri = Stratum 1
##
## Peningkatan
## Pelatihan Ya Tidak
## Mengikuti 20 10
## Tidak Mengikuti 30 40
##
## , , Industri = Stratum 2
##
## Peningkatan
## Pelatihan Ya Tidak
## Mengikuti 15 5
## Tidak Mengikuti 25 35
##
## , , Industri = Stratum 3
##
## Peningkatan
## Pelatihan Ya Tidak
## Mengikuti 18 12
## Tidak Mengikuti 32 38
Uji CMH dengan Base R (Tanpa Continuity Correction)
cmh_base <- mantelhaen.test(data, correct = FALSE)
cmh_base
##
## Mantel-Haenszel chi-squared test without continuity correction
##
## data: data
## Mantel-Haenszel X-squared = 11.733, df = 1, p-value = 0.0006139
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.482202 4.377281
## sample estimates:
## common odds ratio
## 2.547159
Kesimpulan Dari hasil uji Cochran-Mantel-Haenszel, kita dapat menilai apakah terdapat hubungan signifikan antara pelatihan dan peningkatan keterampilan setelah mengontrol faktor industri. Jika nilai p lebih kecil dari 0.05, maka hipotesis nol ditolak, yang berarti ada hubungan signifikan antara partisipasi dalam program pelatihan dan peningkatan keterampilan setelah mempertimbangkan faktor industri.
library(vcdExtra) # Untuk uji CMH
# Contoh Data: Tabel Kontingensi 2 × 2 × k
data <- array(c(20, 30, 10, 40,
15, 25, 5, 35,
18, 32, 12, 38),
dim = c(2, 2, 3),
dimnames = list(
X = c("Ya", "Tidak"),
Y = c("Ya", "Tidak"),
Z = c("Stratum 1", "Stratum 2", "Stratum 3")
))
# Melakukan uji Cochran-Mantel-Haenszel
mantelhaen.test(data)
##
## Mantel-Haenszel chi-squared test with continuity correction
##
## data: data
## Mantel-Haenszel X-squared = 10.848, df = 1, p-value = 0.000989
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.482202 4.377281
## sample estimates:
## common odds ratio
## 2.547159
Interpretasi Hasil Uji
Uji CMH menghasilkan statistik uji dan nilai p: - Jika nilai p < 0,05, maka kita menolak hipotesis nol dan menyimpulkan bahwa \(X\) dan \(Y\) tidak independen bersyarat terhadap \(Z\). - Jika nilai p > 0,05, maka kita gagal menolak hipotesis nol, yang menunjukkan bahwa \(X\) dan \(Y\) bersifat independen bersyarat terhadap \(Z\).
Independensi bersyarat adalah konsep statistik yang sangat penting dalam analisis tabel kontingensi tiga arah. Uji CMH merupakan metode yang andal untuk menilai apakah hubungan antara dua variabel tetap ada setelah mempertimbangkan variabel ketiga. Pemahaman konsep ini sangat penting dalam berbagai bidang aplikasi statistik.
Contoh 3: Agresti 2006, Table 3.3
Diketahui data hasil penelitian dari 8 provinsi di China mengenai kebiasaan merokok (\(X\)) terhadap kanker paru-paru (\(Y\)), dengan provinsi (\(Z\)) sebagai kontrol.
Analisis yang akan dilakukan: 1. Menghitung odds ratio antara kebiasaan merokok (\(X\)) dan kanker paru-paru (\(Y\)), dengan provinsi (\(Z\)) sebagai kontrol. 2. Menentukan apakah terjadi independensi bersyarat antara \(X\) dan \(Y\).
Data
Berikut adalah data yang digunakan:
library(knitr) # Untuk menampilkan tabel
# Membuat data dalam bentuk data frame
data <- data.frame(
City = rep(c("Beijing", "Shanghai", "Shenyang", "Nanjing", "Harbin",
"Zhengzhou", "Taiyunn", "Nanchang"), each = 2),
Smoking = rep(c("Smokers", "Nonsmokers"), 8),
Lung_Cancer_Yes = c(126, 35, 908, 497, 913, 336, 235, 58, 402, 121,
182, 72, 60, 11, 104, 21),
Lung_Cancer_No = c(100, 61, 688, 807, 747, 598, 172, 121, 308, 215,
156, 98, 99, 43, 89, 36)
)
# Menampilkan data dalam bentuk tabel
kable(data, caption = "Data Kebiasaan Merokok dan Kanker Paru-paru
di 8 Provinsi China")
| City | Smoking | Lung_Cancer_Yes | Lung_Cancer_No |
|---|---|---|---|
| Beijing | Smokers | 126 | 100 |
| Beijing | Nonsmokers | 35 | 61 |
| Shanghai | Smokers | 908 | 688 |
| Shanghai | Nonsmokers | 497 | 807 |
| Shenyang | Smokers | 913 | 747 |
| Shenyang | Nonsmokers | 336 | 598 |
| Nanjing | Smokers | 235 | 172 |
| Nanjing | Nonsmokers | 58 | 121 |
| Harbin | Smokers | 402 | 308 |
| Harbin | Nonsmokers | 121 | 215 |
| Zhengzhou | Smokers | 182 | 156 |
| Zhengzhou | Nonsmokers | 72 | 98 |
| Taiyunn | Smokers | 60 | 99 |
| Taiyunn | Nonsmokers | 11 | 43 |
| Nanchang | Smokers | 104 | 89 |
| Nanchang | Nonsmokers | 21 | 36 |
Perhitungan Odds Ratio
Untuk menghitung odds ratio per provinsi, kita gunakan rumus:
\[ OR = \frac{(a/c)}{(b/d)} = \frac{a \times d}{b \times c} \]
Perhitungan Manual
Langkah 1: Menentukan Data Awal
Kita gunakan contoh data dari Kota Beijing:
| Kategori | Kanker | Tidak Kanker | Total |
|---|---|---|---|
| Perokok | 126 | 100 | 226 |
| NonPerokok | 35 | 61 | 96 |
| Total | 161 | 161 | 322 |
Variabel yang digunakan: - \(n_{11k} = 126\) (Perokok dengan kanker) - \(n_{1.k} = 161\) (Total yang menderita kanker) - \(n_{.1k} = 226\) (Total perokok) - \(n_{..k} = 322\) (Total populasi)
Langkah 2: Menghitung Ekspektasi \(\mu_{11k}\)
Formula ekspektasi:
\[ \mu_{11k} = \frac{n_{1.k} \times n_{.1k}}{n_{..k}} \]
Substitusi nilai untuk Kota Beijing:
\[ \mu_{11,Beijing} = \frac{161 \times 226}{322} \]
\[ \mu_{11,Beijing} = \frac{36486}{322} = 113.37 \]
Hasil: \(\mu_{11,Beijing} = 113.37\)
Langkah 3: Menghitung Varians \(\text{Var}(n_{11k})\)
Formula varians:
\[ \text{Var}(n_{11k}) = \frac{n_{1.k} \times (n_{..k} - n_{1.k}) \times n_{.1k} \times (n_{..k} - n_{.1k})}{n_{..k}^2 \times (n_{..k} - 1)} \]
Substitusi nilai untuk Kota Beijing:
\[ \text{Var}(n_{11,Beijing}) = \frac{161 \times (322 - 161) \times 226 \times (322 - 226)}{322^2 \times (322 - 1)} \]
\[ = \frac{161 \times 161 \times 226 \times 96}{103684 \times 321} \]
\[ = \frac{560056896}{33282264} \]
\[ = 8.12 \]
Hasil: \(\text{Var}(n_{11,Beijing}) = 8.12\)
Langkah 4: Perhitungan untuk Semua Kota
Menggunakan rumus yang sama, kita hitung ekspektasi dan varians untuk setiap kota:
city_names <- c("Beijing", "Shanghai", "Shenyang", "Nanjing",
"Harbin", "Zhengzhou", "Taiyuan", "Nanchang")
dimnames_array <- list(Y = c("Kanker", "TidakKanker"),
X = c("Perokok", "NonPerokok"),
Kota = city_names)
data_array <- array(c(126, 100, 35, 61, 908, 688, 497, 807, 913, 747, 336, 598,
235, 172, 58, 121, 402, 308, 121, 215, 182, 156, 72, 98,
60, 99, 11, 43, 104, 89, 21, 36),
dim = c(2, 2, 8), dimnames = dimnames_array)
Langkah 5: Menghitung Statistik Mantel-Haenszel
expectation <- c()
variance <- c()
for (i in 1:8) {
n_11k <- data_array[1, 1, i]
n_1_k <- sum(data_array[1, , i])
n__1k <- sum(data_array[, 1, i])
n__k <- sum(data_array[, , i])
mu_11k <- (n_1_k * n__1k) / n__k
var_11k <- (n_1_k * (n__k - n_1_k) * n__1k * (n__k - n__1k)) /
(n__k^2 * (n__k - 1))
expectation <- c(expectation, mu_11k)
variance <- c(variance, var_11k)
}
sum_mu_11k <- sum(expectation)
sum_var_11k <- sum(variance)
sum_n_11k <- sum(data_array[1, 1, ])
CMH <- ((sum_n_11k - sum_mu_11k) ^ 2) / sum_var_11k
CMH
## [1] 280.1375
Di atas disajikan perhitungan manual ekspektasi dan varians untuk setiap strata dengan langkah-langkah rinci, seanjutnya implementasi perhitungan statistik Mantel-Haenszel di R. Silakan jalankan di RStudio
library(DescTools)
library(epitools) # Untuk perhitungan odds ratio
# Mengubah data menjadi format matriks untuk perhitungan OR
or_results <- matrix(nrow = 8, ncol = 2)
colnames(or_results) <- c("City", "Odds Ratio")
for (i in 1:8) {
subset_data <- data[(2*i-1):(2*i), ]
table_matrix <- matrix(c(subset_data$Lung_Cancer_Yes,
subset_data$Lung_Cancer_No), nrow = 2, byrow = TRUE)
or_value <- oddsratio.wald(table_matrix)$measure[2, 1]
or_results[i, ] <- c(subset_data$City[1], round(or_value, 3))
}
# Konversi ke data frame dan tampilkan
or_results_df <- as.data.frame(or_results)
kable(or_results_df, caption = "Hasil Perhitungan Odds Ratio per Provinsi")
| City | Odds Ratio |
|---|---|
| Beijing | 2.196 |
| Shanghai | 2.143 |
| Shenyang | 2.175 |
| Nanjing | 2.85 |
| Harbin | 2.319 |
| Zhengzhou | 1.588 |
| Taiyunn | 2.369 |
| Nanchang | 2.003 |
Pengujian Independensi Bersyarat
Untuk menguji apakah terjadi independensi bersyarat antara kebiasaan merokok dan kanker paru-paru dengan mempertimbangkan provinsi sebagai kontrol, kita dapat menggunakan uji Cochran-Mantel-Haenszel (CMH).
library(vcdExtra) # Untuk uji CMH
# Mengubah data menjadi format array untuk uji CMH
data_array <- array(
c(data$Lung_Cancer_Yes, data$Lung_Cancer_No),
dim = c(2, 2, 8),
dimnames = list(
Smoking = c("Smokers", "Nonsmokers"),
Lung_Cancer = c("Yes", "No"),
City = unique(data$City)
)
)
# Melakukan uji Cochran-Mantel-Haenszel
cmh_test <- mantelhaen.test(data_array)
print(cmh_test)
##
## Mantel-Haenszel chi-squared test with continuity correction
##
## data: data_array
## Mantel-Haenszel X-squared = 1.867, df = 1, p-value = 0.1718
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 0.9665878 1.2308221
## sample estimates:
## common odds ratio
## 1.090733
Interpretasi Hasil
Kesimpulan
Berdasarkan hasil odds ratio dan uji CMH, kita dapat menentukan apakah merokok berpengaruh terhadap kanker paru-paru dengan mempertimbangkan provinsi sebagai faktor kontrol.
Penaksir (Khusus Tabel \(2 \times 2 \times K\))
Rumus Odds Ratio Bersama
Odds ratio bersama ditaksir menggunakan rumus:
\[ \hat{\theta}_{MH} = \frac{\sum_{k=1}^{K} \left( \frac{n_{11k} n_{22k}}{n_{..k}} \right)}{\sum_{k=1}^{K} \left( \frac{n_{12k} n_{21k}}{n_{..k}} \right)} \]
Di mana: - \(n_{11k}\): Frekuensi sel baris 1 kolom 1 pada tabel parsial ke-\(k\). - \(n_{12k}\): Frekuensi sel baris 1 kolom 2 pada tabel parsial ke-\(k\). - \(n_{21k}\): Frekuensi sel baris 2 kolom 1 pada tabel parsial ke-\(k\). - \(n_{22k}\): Frekuensi sel baris 2 kolom 2 pada tabel parsial ke-\(k\). - \(n_{..k}\): Total observasi dalam tabel parsial ke-\(k\).
Standard Error log Odds Ratio Bersama
Standard error untuk log odds ratio bersama dihitung dengan rumus:
\[ \begin{aligned} \hat{\sigma}^2[ \log(\hat{\theta}_{MH}) ] &= \frac{\sum (n_{11k} + n_{12k})(n_{11k} n_{22k}) / n_{..k}^2} {2(\sum n_{11k} n_{12k} / n_{..k})^2} + \\ &\quad \frac{\sum [(n_{11k} + n_{22k})(n_{11k} + n_{12k}) + (n_{12k} + n_{21k})(n_{11k} + n_{22k})] / n_{..k}^2} {2(\sum n_{11k} n_{12k} / n_{..k}) (\sum n_{12k} n_{21k} / n_{..k})} + \\ &\quad \frac{\sum (n_{12k} + n_{21k})(n_{12k} n_{21k}) / n_{..k}^2} {2(\sum n_{12k} n_{21k} / n_{..k})^2} \end{aligned} \]
Interval Kepercayaan log Odds Ratio Bersama
\[ \log(\hat{\theta}_{MH}) \pm Z_{\alpha/2} \hat{\sigma}[\log(\hat{\theta}_{MH})] \]
Contoh Odds Ratio Bersama
Dari data sebelumnya mengenai kebiasaan merokok dan kanker paru-paru di 8 kota di China, kita akan menentukan odds ratio bersama, standard error, dan interval kepercayaan 95%.
Solusi:
\[ \hat{\theta}_{MH} = \frac{(126)(61) + \dots + (104)(36) / 250}{(35)(100) + \dots + (21)(89) / 250} = 2.17 \]
\[ SE(\log \hat{\theta}_{MH}) = 0.04 \]
\[ \log(2.17) \pm 1.96 \times (0.04) \]
\[ 1.98 \leq \theta \leq 2.38 \]
Interpretasi Hasil
Kesimpulan
Odds ratio bersama digunakan untuk menyimpulkan hubungan antara dua variabel setelah mempertimbangkan efek dari variabel ketiga. Statistik Mantel-Haenszel adalah metode yang andal untuk mengestimasi dan menguji hubungan ini.
Implementasi di R
Kita dapat menghitung odds ratio bersama, standard error, dan
interval kepercayaan dengan paket epitools di R:
library(epitools) # Paket untuk menghitung odds ratio
# Data dari 8 kota dalam bentuk array
lung_cancer_data <- array(
c(126, 35, 61, 100,
908, 497, 688, 807,
913, 336, 747, 598,
235, 58, 172, 121,
402, 121, 308, 215,
182, 72, 156, 98,
60, 11, 99, 43,
104, 21, 89, 36),
dim = c(2, 2, 8),
dimnames = list(
Smoking = c("Smokers", "Nonsmokers"),
Lung_Cancer = c("Yes", "No"),
City = c("Beijing", "Shanghai", "Shenyang", "Nanjing", "Harbin",
"Zhengzhou", "Taiyunn", "Nanchang")
)
)
# Menghitung odds ratio bersama
mh_test <- mantelhaen.test(lung_cancer_data, correct = FALSE)
print(mh_test)
##
## Mantel-Haenszel chi-squared test without continuity correction
##
## data: lung_cancer_data
## Mantel-Haenszel X-squared = 308.89, df = 1, p-value < 2.2e-16
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 2.056753 2.469706
## sample estimates:
## common odds ratio
## 2.253791
Homogenitas Asosiasi dalam Tabel Kontingensi Tiga Arah
Definisi Asosiasi Homogen
Asosiasi homogen terjadi jika odds ratio pada setiap tabel parsial bernilai sama:
\[ \theta_{xy(1)} = \theta_{xy(2)} = \dots = \theta_{xy(k)} \]
Jika odds ratio konstan di semua strata variabel kontrol (\(Z\)), maka tidak ada interaksi antara variabel \(X\) dan \(Y\) dalam pengaruhnya terhadap \(Z\).
Jika odds ratio berbeda-beda antar level \(Z\), maka terdapat interaksi antara \(X\) dan \(Y\) dalam hubungannya dengan \(Z\).
Pengujian Homogenitas dengan Statistik Breslow-Day
Hipotesis
Hipotesis nol (\(H_0\)): \(\theta_{xy(k)} = \dots = \theta_{xy(K)}\) (odds ratio sama di seluruh strata)
Hipotesis alternatif (\(H_1\)): Setidaknya ada satu odds ratio yang berbeda
Statistik Uji Breslow-Day
Statistik uji Breslow-Day (BD) digunakan untuk menguji homogenitas odds ratio:
\[ X^2_{\text{HBD}} = \sum_{j=1}^{K} \frac{(a_j - \tilde{a}_j)^2}{\hat{\text{Var}}(a_j | \hat{OR}_{MH})} \]
dengan: - \(a_j\) adalah jumlah kasus terpapar yang diamati dalam strata \(j\). - \(\tilde{a}_j\) adalah jumlah kasus terpapar yang diharapkan berdasarkan hipotesis nol. - \(\hat{\text{Var}}(a_j | \hat{OR}_{MH})\) adalah varians dari \(\tilde{a}_j\).
Perhitungan Manual Step by Step
Pendahuluan Fungsi Breslow Day Tes
digunakan untuk menguji homogenitas rasio odds (\(\theta\)) di seluruh strata dalam tabel
kontingensi \(2 \times 2 \times
K\).
Hipotesis nol (\(H_0\)) menyatakan bahwa rasio odds (\(\theta_{XY(k)}\)) adalah sama di semua strata:
\[ H_0: \theta_{XY(1)} = \theta_{XY(2)} = \cdots = \theta_{XY(K)} \]
Jika hipotesis nol ditolak, berarti rasio odds berbeda di beberapa strata.
Langkah-Langkah Perhitungan
1. Estimasi Rasio Odds Gabungan (Mantel-Haenszel OR)
Estimasi rasio odds gabungan (\(\hat{OR}_{MH}\)) dihitung sebagai:
\[ \hat{OR}_{MH} = \frac{\sum_{j=1}^{K} \frac{a_j d_j}{n_j}}{\sum_{j=1}^{K} \frac{b_j c_j}{n_j}} \]
dengan: - \(a_j, b_j, c_j, d_j\) adalah elemen dalam tabel kontingensi 2×2 untuk setiap strata \(j\). - \(n_j\) adalah total observasi dalam strata \(j\).
2. Menentukan Nilai Ekspektasi \(\tilde{a}_j\)
Nilai ekspektasi \(\tilde{a}_j\) diperoleh dengan mencari solusi dari persamaan kuadrat:
\[ - m_{1j} n_{1j} \hat{OR}_{MH} + (n_{2j} - m_{1j} + \hat{OR}_{MH} (n_{1j} + m_{1j})) \tilde{a}_j + (1 - \hat{OR}_{MH}) \tilde{a}_j^2 = 0 \]
dengan: - \(m_{1j}\) adalah total observasi yang terpapar dalam strata \(j\). - \(n_{1j}\) adalah total kasus dalam strata \(j\).
Solusi positif dari persamaan kuadrat yang memenuhi \(0 < \tilde{a}_j \leq \min(n_{1j}, m_{1j})\) digunakan sebagai nilai ekspektasi \(\tilde{a}_j\).
3. Menghitung Varians \(\hat{\text{Var}}(a_j | \hat{OR}_{MH})\)
\[ \hat{\text{Var}}(a_j | \hat{OR}_{MH}) = \left( \frac{1}{\tilde{a}_j} + \frac{1}{\tilde{b}_j} + \frac{1}{\tilde{c}_j} + \frac{1}{\tilde{d}_j} \right)^{-1} \]
dengan: - \(\tilde{b}_j = m_{1j} - \tilde{a}_j\), - \(\tilde{c}_j = n_{1j} - \tilde{a}_j\), - \(\tilde{d}_j = m_{2j} - \tilde{c}_j\).
4. Menghitung Statistik Uji Breslow-Day
\[ X^2_{\text{HBD}} = \sum_{j=1}^{K} \frac{(a_j - \tilde{a}_j)^2}{\hat{\text{Var}}(a_j | \hat{OR}_{MH})} \]
dengan: - \(a_j\) adalah jumlah kasus terpapar yang diamati dalam strata \(j\). - \(\tilde{a}_j\) adalah jumlah kasus terpapar yang diharapkan berdasarkan hipotesis nol. - \(\hat{\text{Var}}(a_j | \hat{OR}_{MH})\) adalah varians dari \(\tilde{a}_j\).
5. Koreksi Tarone
Koreksi Tarone diterapkan untuk menyesuaikan statistik uji:
\[ X^2_{\text{HBDT}} = X^2_{\text{HBD}} - \frac{\left( \sum_{j=1}^{K} (a_j - \tilde{a}_j) \right)^2}{\sum_{j=1}^{K} \hat{\text{Var}}(a_j | \hat{OR}_{MH})} \]
Koreksi ini memperhitungkan kemungkinan bias yang muncul karena varians yang digunakan dalam statistik uji tidak memperhitungkan ketergantungan antar strata.
6. P-value dan Keputusan Hipotesis
P-value dihitung berdasarkan distribusi chi-square dengan derajat kebebasan:
\[ df = K - 1 \]
\[ p = 1 - \chi^2(X^2_{\text{HBDT}}, df) \]
Jika p-value < 0.05, kita menolak hipotesis nol dan menyimpulkan bahwa rasio odds tidak homogen di seluruh strata.
Kesimpulan - Statistik Breslow-Day (\(X^2_{\text{HBD}}\)) menguji apakah rasio odds homogen di seluruh strata. - Estimasi ekspektasi \(\tilde{a}_j\) diperoleh dari solusi persamaan kuadrat. - Koreksi Tarone (\(X^2_{\text{HBDT}}\)) digunakan untuk mengurangi bias. - P-value dihitung berdasarkan distribusi chi-square untuk menentukan apakah \(H_0\) dapat ditolak.
Data Contoh Tabel kontingensi 2×2×2:
| Kelompok Usia | Status Merokok | Kasus | Kontrol | Total |
|---|---|---|---|---|
| < 50 tahun | Perokok | 30 | 20 | 50 |
| Non-perokok | 10 | 40 | 50 | |
| >= 50 tahun | Perokok | 25 | 35 | 60 |
| Non-perokok | 15 | 65 | 80 |
Langkah Perhitungan Manual
1. Hitung Rasio Odds di Tiap Stratum
Rumus Rasio Odds (OR):
\[ OR = \frac{a \times d}{b \times c} \]
Kelompok < 50 tahun: \[ OR_1 = \frac{(30 \times 40)}{(20 \times 10)} = \frac{1200}{200} = 6.0 \]
Kelompok ≥ 50 tahun: \[ OR_2 = \frac{(25 \times 65)}{(35 \times 15)} = \frac{1625}{525} \approx 3.10 \]
2. Hitung Rasio Odds Gabungan (Mantel-Haenszel OR)
Gunakan rumus Mantel-Haenszel:
\[ \hat{O}_R{MH} = \frac{\sum \frac{a_j d_j}{n_j}}{\sum \frac{b_j c_j}{n_j}} \]
\[ \hat{O}_R{MH} = \frac{ \left( \frac{30 \times 40}{40+60} \right) + \left( \frac{25 \times 65}{40+100} \right) } { \left( \frac{20 \times 10}{40+60} \right) + \left( \frac{35 \times 15}{40+100} \right) } \]
\[ \hat{O}_R{MH} = \frac{ \left( \frac{1200}{100} + \frac{1625}{140} \right) } { \left( \frac{200}{100} + \frac{525}{140} \right) } \]
\[ \hat{O}_R{MH} = \frac{12 + 11.61}{2 + 3.75} = \frac{23.61}{5.75} \approx 4.11 \]
3. Hitung Ekspektasi \(\tilde{a}_j\)
Ekspektasi \(\tilde{a}_j\) dihitung dengan menyelesaikan persamaan kuadrat:
\[ -m_{1j} n_{1j} \hat{O}_R{MH} + (n_{2j} - m_{1j} + \hat{O}_R{MH} (n_{1j} + m_{1j})) \tilde{a}_j + (1 - \hat{O}_R{MH}) \tilde{a}_j^2 = 0 \]
Untuk kelompok < 50 tahun (j = 1): \[ \tilde{a}_1 \approx 27.2 \]
Untuk kelompok ≥ 50 tahun (j = 2): \[ \tilde{a}_2 \approx 17.59 \]
4. Hitung Varians \(\hat{Var}(a_j | \hat{O}_R{MH})\)
\[ \hat{Var}(a_j | \hat{O}_R{MH}) = \left( \frac{1}{\tilde{a}_j} + \frac{1}{\tilde{b}_j} + \frac{1}{\tilde{c}_j} + \frac{1}{\tilde{d}_j} \right)^{-1} \]
Untuk < 50 tahun: \[ \hat{Var}(a_1) = \left( \frac{1}{27.2} + \frac{1}{50 - 27.2} + \frac{1}{60 - 27.2} + \frac{1}{50} \right)^{-1} \approx 6.14 \]
Untuk ≥ 50 tahun: \[ \hat{Var}(a_2) = \left( \frac{1}{17.59} + \frac{1}{60 - 17.59} + \frac{1}{100 - 17.59} + \frac{1}{40} \right)^{-1} \approx 5.92 \]
5. Hitung Statistik Uji Breslow-Day
\[ X^2_{HBD} = \sum_{j=1}^{K} \frac{(a_j - \tilde{a}_j)^2}{\hat{Var}(a_j | \hat{O}_R{MH})} \]
\[ X^2_{HBD} = \frac{(30 - 27.2)^2}{6.14} + \frac{(25 - 17.59)^2}{5.92} \]
\[ X^2_{HBD} = \frac{7.84}{6.14} + \frac{54.77}{5.92} \approx 1.28 + 9.25 = 10.53 \]
6. Terapkan Koreksi Tarone
\[ X^2_{HBDT} = X^2_{HBD} - \frac{\left( \sum_{j=1}^{K} (a_j - \tilde{a}_j) \right)^2}{\sum_{j=1}^{K} \hat{Var}(a_j | \hat{O}_R{MH})} \]
\[ X^2_{HBDT} = 10.53 - \frac{(30 - 27.2 + 25 - 17.59)^2}{6.14 + 5.92} \]
\[ X^2_{HBDT} = 10.53 - \frac{(10.21)^2}{12.06} = 10.53 - 8.65 = 1.88 \]
7. Hitung P-Value
\[ p = 1 - \chi^2(X^2_{HBDT}, df = 1) \]
\[ p = 1 - \chi^2(1.88, df = 1) \approx 0.17 \]
Fungsi breslowday.test() mengimplementasikan metode yang
lebih canggih daripada rumus Breslow-Day sederhana, yang menjelaskan
mengapa hasil perhitungan manual sering berbeda dari hasil R.
Function
breslowday.test <- function(x) {
#Find the common OR based on Mantel-Haenszel
or.hat.mh <- mantelhaen.test(x)$estimate
#Number of strata
K <- dim(x)[3]
#Value of the Statistic
X2.HBD <- 0
#Value of aj, tildeaj and Var.aj
a <- tildea <- Var.a <- numeric(K)
for (j in 1:K) {
#Find marginals of table j
mj <- apply(x[,,j], MARGIN=1, sum)
nj <- apply(x[,,j], MARGIN=2, sum)
#Solve for tilde(a)_j
coef <- c(-mj[1]*nj[1] * or.hat.mh, nj[2]-mj[1]+or.hat.mh*(nj[1]+mj[1]),
1-or.hat.mh)
sols <- Re(polyroot(coef))
#Take the root, which fulfills 0 < tilde(a)_j <= min(n1_j, m1_j)
tildeaj <- sols[(0 < sols) & (sols <= min(nj[1],mj[1]))]
#Observed value
aj <- x[1,1,j]
#Determine other expected cell entries
tildebj <- mj[1] - tildeaj
tildecj <- nj[1] - tildeaj
tildedj <- mj[2] - tildecj
#Compute \hat{\Var}(a_j | \widehat{\OR}_MH)
Var.aj <- (1/tildeaj + 1/tildebj + 1/tildecj + 1/tildedj)^(-1)
#Compute contribution
X2.HBD <- X2.HBD + as.numeric((aj - tildeaj)^2 / Var.aj)
#Assign found value for later computations
a[j] <- aj ; tildea[j] <- tildeaj ; Var.a[j] <- Var.aj
}
#Compute Tarone corrected test
X2.HBDT <-as.numeric( X2.HBD - (sum(a) - sum(tildea))^2/sum(Var.aj) )
#Compute p-value based on the Tarone corrected test
p <- 1-pchisq(X2.HBDT, df=K-1)
res <- list(X2.HBD=X2.HBD,X2.HBDT=X2.HBDT,p=p)
class(res) <- "bdtest"
return(res)
}
print.bdtest <- function(x) {
cat("Breslow and Day test (with Tarone correction):\n")
cat("Breslow-Day X-squared =",x$X2.HBD,"\n")
cat("Breslow-Day-Tarone X-squared =",x$X2.HBDT,"\n\n")
cat("Test for test of a common OR: p-value = ",x$p,"\n\n")
}
breslowday.test(lung_cancer_data)
## Breslow and Day test (with Tarone correction):
## Breslow-Day X-squared = 20.85501
## Breslow-Day-Tarone X-squared = 20.75567
##
## Test for test of a common OR: p-value = 0.004149107
# Instal dan muat paket yang diperlukan
if (!require(DescTools)) install.packages("DescTools")
library(DescTools)
# Data dalam format array 2x2x2
smoking_data <- array(c(30, 10, 20, 40, 25, 15, 35, 65),
dim = c(2, 2, 2),
dimnames = list(
"Merokok" = c("Perokok", "Non-perokok"),
"Status" = c("Kasus", "Kontrol"),
"Usia" = c("<50", "≥50")
))
# Uji Breslow-Day
breslow_test <- BreslowDayTest(smoking_data)
print(breslow_test)
##
## Breslow-Day test on Homogeneity of Odds Ratios
##
## data: smoking_data
## X-squared = 1.2248, df = 1, p-value = 0.2684
Interpretasi Hasil
Contoh 3: Implementasi Uji Breslow-Day di R
Menggunakan data sebelumnya dari 8 kota di China tentang kebiasaan merokok dan kanker paru-paru:
library(vcdExtra) # Untuk uji Breslow-Day
lung_cancer_data <- array(
c(126, 35, 61, 100,
908, 497, 688, 807,
913, 336, 747, 598,
235, 58, 172, 121,
402, 121, 308, 215,
182, 72, 156, 98,
60, 11, 99, 43,
104, 21, 89, 36),
dim = c(2, 2, 8),
dimnames = list(
Smoking = c("Smokers", "Nonsmokers"),
Lung_Cancer = c("Yes", "No"),
City = c("Beijing", "Shanghai", "Shenyang", "Nanjing", "Harbin", "Zhengzhou", "Taiyunn", "Nanchang")
)
)
bd_test <- BreslowDayTest(lung_cancer_data)
print(bd_test)
##
## Breslow-Day test on Homogeneity of Odds Ratios
##
## data: lung_cancer_data
## X-squared = 20.855, df = 7, p-value = 0.003991
Interpretasi Hasil
Kesimpulan
Uji Breslow-Day digunakan untuk memeriksa apakah odds ratio seragam di seluruh strata dalam tabel kontingensi tiga arah. Jika odds ratio homogen, maka tidak ada interaksi antara \(X\) dan \(Y\) terkait dengan variabel kontrol \(Z\). Jika tidak homogen, berarti ada interaksi antara \(X\) dan \(Y\) yang perlu diperhitungkan dalam analisis.
Generalized Linear Model (GLM) merupakan perluasan dari model regresi linear klasik. GLM memungkinkan kita untuk memodelkan data di mana variabel respons tidak berdistribusi normal dan/atau hubungan antara variabel prediktor dengan rata-rata dari respons tidak linear.
GLM terdiri dari tiga komponen utama:
Distribusi dari exponential family untuk variabel respons.
Fungsi link yang menghubungkan ekspektasi dari variabel respons ke kombinasi linear dari prediktor.
Fungsi linear prediktor: \(\eta = X\beta\)
Distribusi termasuk dalam exponential family jika dapat ditulis dalam bentuk:
\[ f(y; \theta, \phi) = \exp\left\{ \frac{y \theta - b(\theta)}{\phi} + c(y, \phi) \right\} \]
Contoh distribusi yang termasuk dalam exponential family:
Distribusi Normal
Distribusi Binomial
Distribusi Poisson
Distribusi Gamma
Contoh Pembuktian: Distribusi Binomial
Fungsi probabilitas distribusi binomial adalah:
\[ P(Y = y) = \binom{n}{y} \pi^y (1 - \pi)^{n - y} \]
Kita tuliskan ulang dalam bentuk exponential family:
\[ P(Y = y) = \exp \left\{ \log \binom{n}{y} + y \log \left( \frac{\pi}{1 - \pi} \right) + n \log(1 - \pi) \right\} \]
Dengan substitusi:
\(\theta = \log \left( \frac{\pi}{1 - \pi} \right)\)
\(b(\theta) = -n \log(1 - \pi)\)
\(\phi = 1\)
Maka distribusi binomial termasuk dalam exponential family.
Persamaan regresi logistik menyerupai regresi linear, di mana nilai input dikombinasikan secara linear dengan koefisien (bobot) untuk menghasilkan prediksi. Namun, regresi logistik membatasi hasil prediksi menjadi nilai biner, yaitu 0 atau 1, dengan menggunakan fungsi aktivasi sigmoid.
Output yang diprediksi oleh model terletak dalam rentang antara 0 hingga 1 dan mengikuti bentuk kurva S (S-shaped).
Regresi logistik menganalisis hubungan antara satu atau lebih variabel independen dan mengklasifikasikan data ke dalam kelas-kelas diskrit. Model ini banyak digunakan dalam pemodelan prediktif, di mana model memperkirakan probabilitas matematis apakah suatu entitas termasuk ke dalam kategori tertentu atau tidak.
Sebagai contoh, angka 0 dapat mewakili kelas negatif, dan angka 1 mewakili kelas positif. Regresi logistik biasanya digunakan untuk masalah klasifikasi biner, di mana variabel hasil hanya memiliki dua kemungkinan kategori (0 dan 1).
Beberapa contoh penerapan klasifikasi biner di mana respons biner diharapkan atau tersirat antara lain:
Menentukan probabilitas serangan jantung: Dengan bantuan model logistik, tenaga medis dapat menentukan hubungan antara variabel-variabel seperti berat badan, olahraga, dan sebagainya, untuk memprediksi apakah seseorang berisiko mengalami serangan jantung atau komplikasi medis lainnya.
Kemungkinan diterima di universitas: Sistem aplikasi dapat memperkirakan probabilitas seorang siswa untuk diterima di universitas tertentu atau program studi tertentu dengan menganalisis hubungan antara variabel-variabel penentu seperti skor GRE, GMAT, atau TOEFL.
Mengidentifikasi email spam: Kotak masuk email difilter untuk menentukan apakah suatu email merupakan komunikasi promosi atau spam dengan cara memahami variabel prediktor dan menerapkan algoritma regresi logistik untuk memeriksa keasliannya.
Keunggulan Utama Regresi Logistik Lebih mudah diterapkan dalam metode pembelajaran mesin Model pembelajaran mesin dapat dibangun secara efektif dengan menggunakan proses training (pelatihan) dan testing (pengujian). Proses pelatihan bertujuan untuk mengenali pola dalam data masukan (misalnya gambar) dan mengaitkannya dengan keluaran tertentu (label). Melatih model logistik dengan algoritma regresi tidak membutuhkan daya komputasi yang tinggi. Oleh karena itu, regresi logistik lebih mudah untuk diimplementasikan, ditafsirkan, dan dilatih dibandingkan metode machine learning lainnya.
1. Cocok untuk data yang dapat dipisahkan secara linear Dataset yang dapat dipisahkan secara linear mengacu pada grafik di mana dua kelas data dapat dipisahkan oleh garis lurus. Dalam regresi logistik, variabel respons (y) hanya memiliki dua nilai. Oleh karena itu, jika data bersifat dapat dipisahkan secara linear, maka klasifikasi ke dalam dua kelas berbeda dapat dilakukan secara efektif.
2. Memberikan wawasan yang berharga Regresi logistik dapat mengukur seberapa relevan atau penting suatu variabel independen/prediktor (melalui ukuran koefisien), serta menunjukkan arah hubungan atau asosiasi antara prediktor dan respons (apakah positif atau negatif).
3. Persamaan dan Asumsi dalam Regresi Logistik Regresi logistik menggunakan fungsi logistik yang disebut fungsi sigmoid untuk memetakan prediksi dan probabilitasnya. Fungsi sigmoid adalah kurva berbentuk huruf S (S-shaped curve) yang mengubah setiap nilai riil menjadi rentang antara 0 dan 1.
Selain itu, jika keluaran dari fungsi sigmoid (yaitu probabilitas yang diperkirakan) lebih besar dari ambang batas yang telah ditentukan dalam grafik, maka model akan memprediksi bahwa suatu observasi termasuk dalam kelas tertentu. Sebaliknya, jika nilai probabilitas tersebut lebih kecil dari ambang batas, model akan memprediksi bahwa observasi tersebut tidak termasuk ke dalam kelas tersebut.
Sebagai contoh:
Jika hasil fungsi sigmoid lebih dari 0,5, maka output dianggap sebagai 1 (kelas positif).
Jika hasilnya kurang dari 0,5, maka output diklasifikasikan sebagai 0 (kelas negatif).
Jika grafik menuju ke arah negatif secara ekstrem, maka nilai prediksi y akan menjadi 0, dan sebaliknya.
Dengan kata lain, jika keluaran fungsi sigmoid adalah 0,65, maka itu berarti terdapat peluang sebesar 65% bahwa peristiwa tersebut akan terjadi — misalnya dalam kasus pelemparan koin.
Fungsi sigmoid:
\[ f(x) = \frac{1}{1 + e^{-x}} \]
Jika nilai prediksi lebih besar dari ambang batas (misalnya 0.5), maka diklasifikasikan sebagai 1. Jika kurang dari 0.5, diklasifikasikan sebagai 0.
Simulasi dan Visualisasi Regresi Logistik
# Simulasi data untuk regresi logistik
set.seed(42)
n <- 100
x <- seq(-4, 4, length.out = n)
log_odds <- -0.5 + 1.5 * x
prob <- 1 / (1 + exp(-log_odds))
y <- rbinom(n, 1, prob)
# Buat data frame
data <- data.frame(x = x, y = y, prob = prob)
Plot Kurva Sigmoid
# Visualisasi menggunakan base R
plot(x, y, pch = 16, col = "gray60",
xlab = "X", ylab = "Y / Probabilitas",
main = "Simulasi Regresi Logistik dengan Kurva Sigmoid")
lines(x, prob, col = "blue", lwd = 2)
abline(h = 0.5, col = "red", lty = 2)
legend("topleft",
legend = c("Data Biner (0/1)", "Kurva Logistik", "Ambang 0.5"),
col = c("gray60", "blue", "red"),
pch = c(16, NA, NA),
lty = c(NA, 1, 2),
lwd = c(NA, 2, 1),
pt.cex = 1.5,
bty = "n")
Kurva sigmoid dalam regresi logistik menunjukkan hubungan non-linear antara variabel prediktor dan probabilitas output. Pendekatan ini efektif untuk klasifikasi biner seperti deteksi penyakit, email spam, dan prediksi ya/tidak. Spesifikasi Model
Fungsi link (logit): Fungsi link function logit dapat dinyatakan dalam bentuk berikut:
\[ g(\mu) = \log\left( \frac{\mu}{1 - \mu} \right) \]
Model regresi logistik:
\[ \log \left( \frac{\mu}{1 - \mu} \right) = X \beta \]
Fungsi inverse link:
\[ \mu = \frac{\exp(X \beta)}{1 + \exp(X \beta)} \]
Estimasi Parameter
Metode estimasi parameter pada GLM umumnya menggunakan Maximum Likelihood Estimation (MLE).
Log-likelihood fungsi untuk regresi logistik:
\[ l(\beta) = \sum_{i=1}^n \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \]
Dengan: \[ \pi_i = \frac{\exp(x_i^\top \beta)}{1 + \exp(x_i^\top \beta)} \]
Estimasi dilakukan melalui iterasi Newton-Raphson atau algoritma Fisher Scoring.
Contoh Kasus dengan R
Misalkan kita memiliki data simulasi:
set.seed(123)
n <- 200
x <- rnorm(n)
p <- 1 / (1 + exp(-(-0.5 + 2*x)))
y <- rbinom(n, 1, p)
data <- data.frame(y, x)
Estimasi Regresi Logistik Estimasi parameter model regresi logistik dapat menggunakan ‘glm’ function
model <- glm(y ~ x, data = data, family = binomial)
summary(model)
##
## Call:
## glm(formula = y ~ x, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.8374 0.1954 -4.286 1.82e-05 ***
## x 2.0262 0.3016 6.718 1.84e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 261.37 on 199 degrees of freedom
## Residual deviance: 177.26 on 198 degrees of freedom
## AIC: 181.26
##
## Number of Fisher Scoring iterations: 5
Plot Probabilitas Prediksi Berdasarkan hasil model hasil prediksi dapat dibuat plot probabilitas prediksi sebagai berikut
plot(data$x, data$y, pch = 16, col = "grey")
curve(predict(model, newdata = data.frame(x = x), type = "response")[order(x)],
add = TRUE, col = "blue", lwd = 2)
GLM adalah kerangka model fleksibel untuk berbagai jenis data dan
distribusi. Regresi logistik merupakan salah satu contoh penting dari
GLM, sangat berguna dalam analisis data kategorik biner. Estimasi
parameter dilakukan melalui metode MLE dan dapat diselesaikan secara
efisien dengan fungsi glm di R.
Contoh 2:
Regresi logistik digunakan untuk memodelkan hubungan antara satu atau lebih variabel independen dengan variabel dependen yang bersifat biner (0/1). Model ini menghasilkan probabilitas kejadian berdasarkan fungsi logit (sigmoid).
Simulasi Data
Kita akan membuat contoh data di mana probabilitas respons dipengaruhi oleh satu variabel prediktor.
set.seed(123)
n <- 150
x <- rnorm(n)
log_odds <- -0.3 + 2 * x
prob <- 1 / (1 + exp(-log_odds))
y <- rbinom(n, 1, prob)
data <- data.frame(y = y, x = x)
Estimasi Model Regresi Logistik
# Fit model regresi logistik
model <- glm(y ~ x, data = data, family = binomial)
summary(model)
##
## Call:
## glm(formula = y ~ x, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.4437 0.2024 -2.192 0.0284 *
## x 1.6742 0.2940 5.694 1.24e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 203.41 on 149 degrees of freedom
## Residual deviance: 150.08 on 148 degrees of freedom
## AIC: 154.08
##
## Number of Fisher Scoring iterations: 5
Interpretasi Koefisien
Intercept ((Intercept)): nilai log-odds saat
x = 0
Koefisien x: perubahan log-odds untuk setiap satu
satuan peningkatan pada x
Nilai p: menunjukkan signifikansi statistik dari prediktor
Koefisien log-odds dapat ditransformasikan ke odds ratio:
exp(coef(model))
## (Intercept) x
## 0.6416859 5.3347261
Prediksi dan Visualisasi Kurva Logit
library(ggplot2)
data$pred <- predict(model, type = "response")
ggplot(data, aes(x = x, y = y)) +
geom_point(alpha = 0.5, color = "gray40") +
geom_line(aes(y = pred), color = "blue", linewidth = 1.5) +
labs(title = "Kurva Logit pada Regresi Logistik",
x = "X (Prediktor)",
y = "Probabilitas / Respons") +
theme_minimal()
Evaluasi Model
Kita dapat melihat akurasi model berdasarkan klasifikasi threshold 0.5.
# Klasifikasi dan confusion matrix
data$pred_class <- ifelse(data$pred > 0.5, 1, 0)
table(Predicted = data$pred_class, Actual = data$y)
## Actual
## Predicted 0 1
## 0 72 24
## 1 16 38
Kesimpulan
Model regresi logistik mampu memprediksi probabilitas berdasarkan
hubungan antara variabel x dan hasil biner
y.
Kurva logit menunjukkan bentuk S yang memisahkan dua kelas secara probabilistik.
Koefisien dapat diinterpretasikan dalam bentuk log-odds atau odds ratio.
Evaluasi model menunjukkan performa klasifikasi yang baik jika p-value signifikan dan prediksi sesuai dengan observasi.
Contoh 3
Dalam contoh ini, kita akan menggunakan data asli mtcars
dari R base package, dengan mengubah variabel target menjadi biner. Kita
akan memodelkan apakah mobil memiliki transmisi otomatis
(0) atau manual (1) berdasarkan variabel
prediktor seperti mpg (mil per galon) dan hp
(tenaga kuda).
Persiapan Data
data(mtcars)
df <- mtcars
df$am <- factor(df$am, labels = c("Automatic", "Manual"))
summary(df[, c("am", "mpg", "hp")])
## am mpg hp
## Automatic:19 Min. :10.40 Min. : 52.0
## Manual :13 1st Qu.:15.43 1st Qu.: 96.5
## Median :19.20 Median :123.0
## Mean :20.09 Mean :146.7
## 3rd Qu.:22.80 3rd Qu.:180.0
## Max. :33.90 Max. :335.0
Estimasi Model Regresi Logistik
model_real <- glm(am ~ mpg + hp, data = df, family = binomial)
summary(model_real)
##
## Call:
## glm(formula = am ~ mpg + hp, family = binomial, data = df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -33.60517 15.07672 -2.229 0.0258 *
## mpg 1.25961 0.56747 2.220 0.0264 *
## hp 0.05504 0.02692 2.045 0.0409 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 43.230 on 31 degrees of freedom
## Residual deviance: 19.233 on 29 degrees of freedom
## AIC: 25.233
##
## Number of Fisher Scoring iterations: 7
Interpretasi Koefisien
Intercept: log-odds mobil menggunakan transmisi
manual saat mpg dan hp bernilai
nol.
mpg: setiap kenaikan 1 mil/galon meningkatkan
peluang mobil bertransmisi manual.
hp: setiap kenaikan 1 tenaga kuda menurunkan peluang
mobil bertransmisi manual.
p-value < 0.05 menunjukkan signifikansi statistik.
Odds ratio dapat dihitung sebagai:
exp(coef(model_real))
## (Intercept) mpg hp
## 2.543664e-15 3.524063e+00 1.056588e+00
Interpretasi:
Odds ratio mpg > 1 → semakin irit, semakin besar
peluang bertransmisi manual.
Odds ratio hp < 1 → semakin besar tenaga, semakin
kecil peluang bertransmisi manual.
Visualisasi Prediksi
df$prob <- predict(model_real, type = "response")
df$pred_class <- ifelse(df$prob > 0.5, "Manual", "Automatic")
library(ggplot2)
ggplot(df, aes(x = mpg, y = hp, color = pred_class, shape = am)) +
geom_point(size = 3) +
labs(title = "Prediksi Regresi Logistik: Transmisi Mobil",
x = "Mil per Galon (mpg)",
y = "Tenaga Kuda (hp)",
color = "Prediksi", shape = "Fakta") +
theme_minimal()
Evaluasi Model
# Confusion matrix
table(Predicted = df$pred_class, Actual = df$am)
## Actual
## Predicted Automatic Manual
## Automatic 16 3
## Manual 3 10
Interpretasi:
Baris dan kolom menunjukkan prediksi dan aktual.
Diagonal = prediksi benar, lainnya = kesalahan klasifikasi.
Kesimpulan
Model berhasil memprediksi jenis transmisi mobil berdasarkan
mpg dan hp.
Koefisien mpg positif dan signifikan → irit bahan
bakar → kemungkinan lebih besar manual.
Koefisien hp negatif → mobil lebih bertenaga
cenderung otomatis.
Model memiliki interpretasi yang kuat dan dapat divisualisasikan dengan baik.
Regresi Poisson digunakan ketika variabel respons adalah data cacah (count data), yaitu bilangan bulat non-negatif. Model ini merupakan bagian dari Generalized Linear Model (GLM) dengan asumsi bahwa distribusi variabel respons adalah distribusi Poisson.
Distribusi Poisson memiliki fungsi probabilitas:
\[ P(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!} \]
Kita dapat menuliskan bentuk ini dalam format exponential family:
\[ f(y; \theta) = \exp \left\{ y \log(\lambda) - \lambda - \log(y!) \right\} \]
dengan:
\(\theta = \log(\lambda)\)
\(b(\theta) = e^{\theta} = \lambda\)
\(\phi = 1\)
\(c(y, \phi) = -\log(y!)\)
Maka distribusi Poisson termasuk dalam exponential family.
Fungsi Link
Fungsi link kanonik untuk distribusi Poisson adalah fungsi logaritma:
\[ g(\mu) = \log(\mu) \]
Sehingga modelnya menjadi:
\[ \log(\mu_i) = x_i^\top \beta \]
dan fungsi inverse link:
\[ \mu_i = \exp(x_i^\top \beta) \]
Estimasi Parameter
Estimasi parameter \(\beta\) dilakukan dengan metode Maximum Likelihood Estimation (MLE).
Log-likelihood fungsi untuk regresi Poisson:
\[ l(\beta) = \sum_{i=1}^n \left[ y_i x_i^\top \beta - \exp(x_i^\top \beta) - \log(y_i!) \right] \]
Nilai \(\beta\) dapat diperoleh melalui metode numerik seperti iterasi Newton-Raphson.
Contoh 1
Misalkan kita memiliki data simulasi sebagai berikut:
set.seed(42)
n <- 200
x <- rnorm(n)
lambda <- exp(0.3 + 0.6 * x)
y <- rpois(n, lambda)
data <- data.frame(y, x)
Estimasi Regresi Poisson
poisson_model <- glm(y ~ x, data = data, family = poisson)
summary(poisson_model)
##
## Call:
## glm(formula = y ~ x, family = poisson, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.21817 0.06712 3.250 0.00115 **
## x 0.58748 0.06288 9.343 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 333.72 on 199 degrees of freedom
## Residual deviance: 244.46 on 198 degrees of freedom
## AIC: 587.36
##
## Number of Fisher Scoring iterations: 5
Plot Hasil Prediksi
plot(data$x, data$y, pch = 16, col = "darkgray", main = "Data dan Hasil Prediksi")
newdata <- data.frame(x = seq(min(x), max(x), length.out = 100))
pred <- predict(poisson_model, newdata = newdata, type = "response")
lines(newdata$x, pred, col = "blue", lwd = 2)
Diagnostik dan Overdispersion
Salah satu asumsi penting dari model Poisson adalah bahwa mean dan varians dari variabel respons adalah sama (\(E[Y] = Var[Y]\)). Jika varians lebih besar dari mean, maka terjadi overdispersion.
Untuk mendeteksi overdispersion:
dispersion <- sum(residuals(poisson_model, type = "pearson")^2) / poisson_model$df.residual
dispersion
## [1] 1.144237
Jika nilai dispersion > 1, maka overdispersion mungkin terjadi dan model alternatif seperti Negative Binomial Regression dapat digunakan.
Model regresi Poisson adalah alat penting untuk menganalisis data cacah. Ia memberikan hubungan log-linear antara prediktor dan rata-rata kejadian. Namun, perlu diperhatikan kemungkinan overdispersion dalam penerapannya.
Contoh 2:
Regresi Poisson digunakan untuk memodelkan data cacah (count data),
yaitu data respons berupa bilangan bulat non-negatif. Dalam contoh ini,
kita akan menggunakan dataset warpbreaks dari R base
package yang berisi jumlah patahan benang pada mesin tenun.
Deskripsi Dataset
data("warpbreaks")
head(warpbreaks)
## breaks wool tension
## 1 26 A L
## 2 30 A L
## 3 54 A L
## 4 25 A L
## 5 70 A L
## 6 52 A L
summary(warpbreaks)
## breaks wool tension
## Min. :10.00 A:27 L:18
## 1st Qu.:18.25 B:27 M:18
## Median :26.00 H:18
## Mean :28.15
## 3rd Qu.:34.00
## Max. :70.00
breaks: jumlah patahan benang (variabel target)
wool: tipe wol (A/B)
tension: tingkat ketegangan (L/M/H)
Pemodelan Regresi Poisson
poisson_model <- glm(breaks ~ wool + tension, data = warpbreaks, family = poisson)
summary(poisson_model)
##
## Call:
## glm(formula = breaks ~ wool + tension, family = poisson, data = warpbreaks)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.69196 0.04541 81.302 < 2e-16 ***
## woolB -0.20599 0.05157 -3.994 6.49e-05 ***
## tensionM -0.32132 0.06027 -5.332 9.73e-08 ***
## tensionH -0.51849 0.06396 -8.107 5.21e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 297.37 on 53 degrees of freedom
## Residual deviance: 210.39 on 50 degrees of freedom
## AIC: 493.06
##
## Number of Fisher Scoring iterations: 4
Interpretasi Koefisien
woolB: efek tambahan dari menggunakan wol
tipe BtensionM, tensionH: efek
tambahan dari ketegangan M dan H dibandingkan Lexp(coef(poisson_model))
## (Intercept) woolB tensionM tensionH
## 40.1235380 0.8138425 0.7251908 0.5954198
Jika OR < 1 → menurunkan jumlah patahan
Jika OR > 1 → meningkatkan jumlah patahan
Visualisasi Prediksi
warpbreaks$predicted <- predict(poisson_model, type = "response")
library(ggplot2)
ggplot(warpbreaks, aes(x = tension, y = breaks, color = wool)) +
geom_jitter(width = 0.2, alpha = 0.6) +
geom_point(aes(y = predicted), shape = 18, size = 3, color = "black") +
facet_wrap(~wool) +
labs(title = "Prediksi Jumlah Patahan Benang berdasarkan Wol dan Ketegangan",
x = "Tingkat Ketegangan",
y = "Jumlah Patahan Benang",
color = "Jenis Wol") +
theme_minimal()
Evaluasi Model
# Plot residuals
plot(poisson_model$residuals, main = "Residual Plot", ylab = "Residual", xlab = "Index", pch = 19, col = "steelblue")
abline(h = 0, col = "red", lty = 2)
Regresi Poisson menunjukkan bahwa jenis wol dan tingkat ketegangan berpengaruh terhadap jumlah patahan benang.
Koefisien negatif menunjukkan penurunan rata-rata patahan.
Model dapat digunakan untuk memprediksi jumlah patahan pada
kombinasi wool dan tension tertentu.
Dalam Generalized Linear Model (GLM), inferensi statistik membutuhkan pemahaman terhadap ekspektasi dan varians dari estimator model, terutama untuk mengembangkan alat-alat uji seperti Wald test, Likelihood Ratio test, dan interval kepercayaan.
Ekspektasi dan Varians dalam GLM
1. Ekspektasi Estimator
Ekspektasi menunjukkan apakah suatu estimator tak bias, yaitu:
\[ \mathbb{E}[\hat{\beta}] = \beta \]
Dalam GLM, MLE dari \(\hat{\beta}\) bersifat asymptotically unbiased.
2. Varians Estimator
Varians menunjukkan presisi dari estimasi parameter:
\[ \text{Var}(\hat{\beta}) \approx \left[ \mathbf{X}^\top \mathbf{W} \mathbf{X} \right]^{-1} \]
di mana \(\mathbf{W}\) adalah matriks bobot yang tergantung pada distribusi dan fungsi link.
Distribusi Asimptotik Estimator
Dengan ukuran sampel besar:
\[ \hat{\beta} \sim \mathcal{N}(\beta, \text{Var}(\hat{\beta})) \]
Distribusi ini adalah dasar dari:
Uji Wald
Confidence interval
P-value
Varians dalam GLM Tidak Konstan
Tidak seperti regresi linear (OLS) yang mengasumsikan homoskedastisitas:
\[ \text{Var}(Y_i) = \sigma^2 \]
Dalam GLM:
\[ \text{Var}(Y_i) = \phi V(\mu_i) \]
\(\phi\) = parameter dispersi
\(V(\mu)\) = fungsi varians
Contoh:
Poisson: \(V(\mu) = \mu\)
Binomial: \(V(\mu) = \mu(1 - \mu)\)
Contoh Regresi Poisson
# Simulasi data
set.seed(123)
x <- rnorm(100)
mu <- exp(0.5 + 0.8 * x)
y <- rpois(100, mu)
model <- glm(y ~ x, family = poisson)
summary(model)
##
## Call:
## glm(formula = y ~ x, family = poisson)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.44950 0.08872 5.066 4.05e-07 ***
## x 0.86000 0.07463 11.523 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.05 on 99 degrees of freedom
## Residual deviance: 106.78 on 98 degrees of freedom
## AIC: 325.76
##
## Number of Fisher Scoring iterations: 5
Ekspektasi: \(\mathbb{E}[Y_i] = \mu_i\)
Varians: \(\text{Var}(Y_i) = \mu_i\)
Kesimpulan
Ekspektasi digunakan untuk mengetahui ketakbiasan estimasi
Varians digunakan untuk mengukur presisi dan menyusun uji statistik
Distribusi asimptotik dari \(\hat{\beta}\) sangat bergantung pada kedua konsep ini
Dalam GLM, varians sangat tergantung pada bentuk distribusi eksponensial dari data
Ekspektasi
Jika diturunkan berdasarkan fungsi momen:
\[ E(Y) = \int y f(y;\theta) \, dy = \mu \]
Untuk keluarga eksponensial:
\[ \log f(y;\theta) = a(y) + b(\theta)y + c(\theta) \]
atau:
\[ \log f(y;\theta) = y \theta - b(\theta) + c(y) \]
Maka ekspektasi turunan pertama:
\[ U(\theta) = \frac{\partial \ell}{\partial \theta} = y - b'(\theta) \]
Dan ekspektasi turunan pertama:
\[ E[U(\theta)] = E[y - b'(\theta)] = \mu - b'(\theta) = 0 \]
Maka:
\[ \mu = b'(\theta) \]
Varians
Turunan kedua:
\[ \frac{\partial^2 \ell}{\partial \theta^2} = -b''(\theta) \]
Sehingga:
\[ Var(Y) = b''(\theta) = \phi V(\mu) \]
Maximum Likelihood Estimation (MLE)
Prinsip dasar: memaksimumkan fungsi likelihood/log-likelihood.
Langkah:
Turunan pertama = 0
Turunan kedua < 0
Namun, karena bentuk GLM tidak eksplisit, digunakan metode numerik.
Metode Optimisasi
Newton-Raphson
Menggunakan score vector (gradien)
Menggunakan Hessian matrix
Iterasi:
\[ \beta^{(t+1)} = \beta^{(t)} - H^{-1}(\beta^{(t)}) U(\beta^{(t)}) \]
Fisher Scoring
IRLS (Iteratively Reweighted Least Square)
Implementasi Newton-Raphson
Statistik score ke-\(j\):
\[ U_j(\beta) = \frac{\partial \log L(\beta)}{\partial \beta_j} \]
Turunan kedua:
\[ H_{jk}(\beta) = \frac{\partial^2 \log L(\beta)}{\partial \beta_j \partial \beta_k} \]
Taylor expansion:
\[ U(\beta^*) \approx U(\beta) + H(\beta)(\beta^* - \beta) \]
Estimasi parameter:
\[ \hat{\beta} \approx \beta^{(t)} - H^{-1}(\beta^{(t)}) U(\beta^{(t)}) \]
Diagnostik digunakan untuk mengevaluasi apakah model sudah tepat.
Uji formal
Grafik antara nilai prediksi vs nilai aktual
Statistik Devians
Mengukur apakah ada model lain yang lebih baik.
Nilai devians besar → model tidak cocok.
Devians adalah:
\[ D = 2 \sum \left[ y_i \log \left( \frac{y_i}{\hat{\mu}_i} \right) - (y_i - \hat{\mu}_i) \right] \]
Devians membandingkan model terhadap saturated model.
Devians kecil → model lebih cocok.
Statistik Chi-Kuadrat Pearson
\[ X^2 = \sum \frac{(y_i - \hat{\mu}_i)^2}{\hat{\mu}_i} \]
Catatan
Untuk data yang dikelompokkan, statistik devians dan chi-kuadrat Pearson mengikuti distribusi Chi-Square.
Untuk data tidak dikelompokkan, tidak mengikuti distribusi Chi-Square.
Devians diminimalkan oleh MLE → cocok digunakan untuk evaluasi model.
Analisis Residual
Residual adalah selisih antara observasi dengan prediksi.
Dapat digunakan untuk memeriksa penyimpangan sistematis.
Dapat diplot untuk menilai asumsi model.
Regresi logistik digunakan untuk memodelkan probabilitas dari variabel respons biner (0/1) berdasarkan satu atau lebih variabel prediktor. Estimasi parameter dilakukan menggunakan Maximum Likelihood Estimation (MLE) karena model tidak linear dalam parameternya.
Fungsi model logistik:
\[ \pi(x) = \frac{\exp(\beta_0 + \beta_1 x)}{1 + \exp(\beta_0 + \beta_1 x)} \]
Log-likelihood untuk \(n\) observasi:
\[ \ell(\beta) = \sum_{i=1}^n \left[y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i)\right] \]
Estimasi dengan Newton-Raphson
Metode Newton-Raphson digunakan untuk mencari nilai parameter \(\boldsymbol{\beta}\) yang memaksimalkan fungsi log-likelihood pada model regresi logistik.
Fungsi Log-Likelihood
Model regresi logistik untuk probabilitas:
\[ \pi_i = \frac{1}{1 + \exp(-\boldsymbol{x}_i^\top \boldsymbol{\beta})} \]
Log-likelihood untuk \(n\) observasi:
\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^{n} \left[y_i \log(\pi_i) + (1 - y_i)\log(1 - \pi_i)\right] \]
Langkah-Langkah Newton-Raphson
\[ \mathbf{U}(\boldsymbol{\beta}) = \frac{\partial \ell(\boldsymbol{\beta})}{\partial \boldsymbol{\beta}} = \mathbf{X}^\top (\mathbf{y} - \boldsymbol{\pi}) \]
\[ \mathbf{H}(\boldsymbol{\beta}) = -\mathbf{X}^\top \mathbf{W} \mathbf{X}, \quad \text{dengan } \mathbf{W} = \text{diag}(\pi_i(1 - \pi_i)) \]
\[ \boldsymbol{\beta}^{(t+1)} = \boldsymbol{\beta}^{(t)} + (\mathbf{X}^\top \mathbf{W}^{(t)} \mathbf{X})^{-1} \mathbf{X}^\top (\mathbf{y} - \boldsymbol{\pi}^{(t)}) \]
Estimasi MLE dengan Newton-Raphson (Manual di R)
# Data simulasi
set.seed(1)
x <- rnorm(100)
beta_true <- c(-1, 2)
X <- cbind(1, x)
eta <- X %*% beta_true
p <- 1 / (1 + exp(-eta))
y <- rbinom(100, 1, p)
Newton-Raphson Iterasi Manual
beta <- c(0, 0)
tol <- 1e-6
max_iter <- 100
for (i in 1:max_iter) {
eta <- X %*% beta
pi_hat <- 1 / (1 + exp(-eta))
W <- diag(as.numeric(pi_hat * (1 - pi_hat)))
z <- eta + solve(W) %*% (y - pi_hat)
beta_new <- solve(t(X) %*% W %*% X) %*% t(X) %*% W %*% z
if (sum(abs(beta_new - beta)) < tol) break
beta <- beta_new
}
beta # hasil estimasi akhir
## [,1]
## -1.516679
## x 2.155658
Inferensi Parameter
1. Uji Wald
Tujuan Uji Wald
Untuk menguji signifikansi parameter \(\beta_j\) dalam model regresi logistik:
H₀: \(\beta_j = 0\)
H₁: \(\beta_j \ne 0\)
Teori Wald Test
Dari teori estimasi MLE, estimator \(\hat\beta_j\) mendekati distribusi normal:
\[ \hat\beta_j \sim N(\beta_j, \text{Var}(\hat\beta_j)) \]
Jika H₀ benar (yaitu \(\beta_j = 0\)), maka:
\[ Z = \frac{\hat\beta_j}{SE(\hat\beta_j)} \sim \mathcal{N}(0,1) \]
Dengan statistik Wald:
\[ W = Z^2 = \left( \frac{\hat\beta_j}{SE(\hat\beta_j)} \right)^2 \sim \chi^2_1 \]
Simulasi dan Uji Wald Langkah demi Langkah
set.seed(123)
n <- 100
x <- rnorm(n)
log_odds <- -0.5 + 1.2 * x
p <- 1 / (1 + exp(-log_odds))
y <- rbinom(n, 1, p)
data <- data.frame(x, y)
model <- glm(y ~ x, data = data, family = binomial)
summary(model)
##
## Call:
## glm(formula = y ~ x, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.3097 0.2296 -1.349 0.177
## x 1.2663 0.3080 4.111 3.94e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 137.99 on 99 degrees of freedom
## Residual deviance: 114.76 on 98 degrees of freedom
## AIC: 118.76
##
## Number of Fisher Scoring iterations: 4
Langkah 1: Ambil nilai koefisien dan SE
beta_hat <- coef(model)["x"]
se_beta <- summary(model)$coefficients["x", "Std. Error"]
Langkah 2: Hitung Statistik Z
Z <- beta_hat / se_beta
Z
## x
## 4.110965
Langkah 3: Hitung Statistik Wald
Wald_stat <- Z^2
Wald_stat
## x
## 16.90003
Langkah 4: Hitung p-value
p_value <- 1 - pchisq(Wald_stat, df = 1)
p_value
## x
## 3.940095e-05
nterpretasi
Jika p-value < 0.05, maka koefisien signifikan → variabel prediktor berpengaruh.
Jika p-value > 0.05, maka tidak ada cukup bukti untuk menolak H₀.
Kesimpulan
Uji Wald didasarkan pada rasio antara estimasi parameter dan standar error-nya. Dengan menaikkan nilai Z menjadi kuadrat (Z²), kita memperoleh distribusi Chi-Square untuk pengujian hipotesis parameter individual dalam model regresi logistik.
2. Uji Likelihood Ratio (Chi-Square)
Bandingkan model penuh dengan model tanpa prediktor.
# Model null
model_null <- glm(y ~ 1, data = data, family = binomial)
# Likelihood ratio test
anova(model_null, model, test = "Chisq")
## Analysis of Deviance Table
##
## Model 1: y ~ 1
## Model 2: y ~ x
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 99 137.99
## 2 98 114.76 1 23.229 1.438e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Evaluasi Kebaikan Model
1. Akaike Information Criterion (AIC)
Semakin kecil AIC, semakin baik model.
AIC(model)
## [1] 118.7598
Bayesian Information Criterion (BIC)
Alternatif terhadap AIC, menghukum kompleksitas model.
BIC(model)
## [1] 123.9701
Estimasi regresi logistik dilakukan dengan MLE melalui iterasi Newton-Raphson.
Inferensi parameter dapat dilakukan dengan uji Wald dan likelihood ratio (uji Chi-Square).
AIC dan BIC digunakan untuk mengevaluasi kompleksitas dan kecocokan model.
Contoh Regresi Logistik Multiple
Berikut adalah contoh analisis regresi logistik multiple lengkap dalam format R Markdown, menggunakan dataset mtcars dari R. Kita akan memodelkan kemungkinan mobil memiliki efisiensi bahan bakar tinggi (mpg tinggi) berdasarkan beberapa prediktor. Kita akan:
Menggunakan regresi logistik
Menguji signifikansi model dengan statistik G² (Likelihood Ratio Test)
Melakukan uji Wald
Menginterpretasi Odds Ratio
1. Data dan Transformasi
Gunakan data bawaan R Transformasi variabel mpg menjadi variabel biner: 1 = irit, 0 = boros
data(mtcars)
mtcars <- mtcars %>%
dplyr::mutate(mpg_high = ifelse(mpg > median(mpg), 1, 0)) %>%
dplyr::select(mpg_high, wt, hp, am)
head(mtcars)
## mpg_high wt hp am
## Mazda RX4 1 2.620 110 1
## Mazda RX4 Wag 1 2.875 110 1
## Datsun 710 1 2.320 93 1
## Hornet 4 Drive 1 3.215 110 0
## Hornet Sportabout 0 3.440 175 0
## Valiant 0 3.460 105 0
2. Model Regresi Logistik Fit model logistik multipel
model_logit <- glm(mpg_high ~ wt + hp + am, data = mtcars, family = binomial)
summary(model_logit)
##
## Call:
## glm(formula = mpg_high ~ wt + hp + am, family = binomial, data = mtcars)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 6.244e+02 4.856e+05 0.001 0.999
## wt -1.847e+02 1.875e+05 -0.001 0.999
## hp -8.852e-02 2.045e+03 0.000 1.000
## am -6.038e+01 1.044e+05 -0.001 1.000
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 4.4236e+01 on 31 degrees of freedom
## Residual deviance: 3.4224e-09 on 28 degrees of freedom
## AIC: 8
##
## Number of Fisher Scoring iterations: 25
3. Uji Signifikansi Model (G² atau Likelihood Ratio Test)
Bandingkan model penuh vs model null
model_null <- glm(mpg_high ~ 1, data = mtcars, family = binomial)
anova(model_null, model_logit, test = "Chisq")
## Analysis of Deviance Table
##
## Model 1: mpg_high ~ 1
## Model 2: mpg_high ~ wt + hp + am
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 31 44.236
## 2 28 0.000 3 44.236 1.344e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
4. Statistik Wald untuk Koefisien Individu
tidy(model_logit)
## # A tibble: 4 × 5
## term estimate std.error statistic p.value
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 624. 485580. 0.00129 0.999
## 2 wt -185. 187531. -0.000985 0.999
## 3 hp -0.0885 2045. -0.0000433 1.000
## 4 am -60.4 104421. -0.000578 1.000
5. Interpretasi Odds Ratio Odds Ratio dan Confidence Interval
# Odds Ratio dengan CI Wald
coefs <- summary(model_logit)$coefficients
OR <- exp(coefs[, "Estimate"])
CI_lower <- exp(coefs[, "Estimate"] - 1.96 * coefs[, "Std. Error"])
CI_upper <- exp(coefs[, "Estimate"] + 1.96 * coefs[, "Std. Error"])
odds_ratio_table <- cbind(OR, CI_lower, CI_upper)
round(odds_ratio_table, 3)
## OR CI_lower CI_upper
## (Intercept) 1.552814e+271 0 Inf
## wt 0.000000e+00 0 Inf
## hp 9.150000e-01 0 Inf
## am 0.000000e+00 0 Inf
6. Goodness of Fit Hosmer-Lemeshow Test
hoslem.test(mtcars$mpg_high, fitted(model_logit), g=10)
##
## Hosmer and Lemeshow goodness of fit (GOF) test
##
## data: mtcars$mpg_high, fitted(model_logit)
## X-squared = 1.7112e-09, df = 2, p-value = 1
7. Kesimpulan
Model logistik menunjukkan bahwa variabel wt dan
am berpengaruh signifikan terhadap efisiensi bahan bakar
(mpg_high). Odds ratio memberikan pemahaman intuitif
terhadap kekuatan dan arah pengaruh prediktor.
Dokumen ini menjelaskan cara menghitung statistik G² (likelihood ratio test) secara manual dalam regresi logistik biner.
Rumus Umum
\[ G^2 = -2(\ell_0 - \ell_1) \]
Fungsi Log-Likelihood
\[ \ell = \sum_{i=1}^n \left[ y_i \log(p_i) + (1 - y_i) \log(1 - p_i) \right] \]
Contoh Data
# Data dummy
data <- data.frame(
y = c(1, 0, 1, 0),
x1 = c(2, 1, 3, 2)
)
Model Null (Intercept Saja)
# Probabilitas tetap
p_null <- mean(data$y) # 0.5
loglik_null <- sum(data$y * log(p_null) + (1 - data$y) * log(1 - p_null))
loglik_null
## [1] -2.772589
Model Full (Dengan Prediktor)
# Misal hasil estimasi model: beta0 = -1, beta1 = 1
eta <- -1 + 1 * data$x1
p_hat <- 1 / (1 + exp(-eta))
loglik_full <- sum(data$y * log(p_hat) + (1 - data$y) * log(1 - p_hat))
loglik_full
## [1] -2.446599
Hitung G²
G2 <- -2 * (loglik_null - loglik_full)
G2
## [1] 0.6519803
Interpretasi
pchisq(G2, df = 1, lower.tail = FALSE)
## [1] 0.4194056
Dokumen ini menjelaskan cara menghitung statistik G² (likelihood ratio test) secara manual dalam regresi logistik biner.
Rumus Umum
\[ G^2 = -2(\ell_0 - \ell_1) \]
Konteks: Regresi Logistik Biner
Model regresi logistik untuk probabilitas \(p_i\) dari hasil 1 (misal sukses, positif, dsb):
\[ \log \left( \frac{p_i}{1 - p_i} \right) = \eta_i = \beta_0 + \beta_1 x_{1i} + \dots + \beta_k x_{ki} \]
Fungsi likelihood (untuk \(n\) observasi):
\[ L = \prod_{i=1}^{n} p_i^{y_i} (1 - p_i)^{1 - y_i} \]
Log-likelihood-nya:
\[ \ell = \sum_{i=1}^{n} \left[ y_i \log(p_i) + (1 - y_i) \log(1 - p_i) \right] \]
Langkah-langkah Menghitung \(\ell_0\) dan \(\ell_1\)
Contoh Kasus Mini
Misalnya kita punya data:
| y | x1 |
|---|---|
| 1 | 2 |
| 0 | 1 |
| 1 | 3 |
| 0 | 2 |
1. Model Null
\[ p = \frac{1 + 0 + 1 + 0}{4} = 0.5 \]
\[ \ell_0 = \sum_{i=1}^{4} \left[ y_i \log(0.5) + (1 - y_i) \log(0.5) \right] = 4 \cdot \log(0.5) = -2.7726 \]
2. Model Full
Misal hasil estimasi: \(\hat{\beta}_0 = -1\), \(\hat{\beta}_1 = 1\)
Hitung \(\hat{p}_i = \frac{1}{1 + e^{-(\beta_0 + \beta_1 x_i)}}\)
| x1 | y | η = β₀ + β₁·x1 | p̂ | loglik component |
|---|---|---|---|---|
| 2 | 1 | 1 | 0.7311 | –0.3133 |
| 1 | 0 | 0 | 0.5000 | –0.6931 |
| 3 | 1 | 2 | 0.8808 | –0.1269 |
| 2 | 0 | 1 | 0.7311 | –1.3133 |
\[ \ell_1 = -0.3133 + (-0.6931) + (-0.1269) + (-1.3133) = -2.4466 \]
3. Hitung G²
\[ G^2 = -2(\ell_0 - \ell_1) = -2(-2.7726 + 2.4466) = 0.652 \]
Implementasi di R
# Data dummy
data <- data.frame(
y = c(1, 0, 1, 0),
x1 = c(2, 1, 3, 2)
)
# Model null
p_null <- mean(data$y)
loglik_null <- sum(data$y * log(p_null) + (1 - data$y) * log(1 - p_null))
# Model full (asumsikan β0 = -1, β1 = 1)
eta <- -1 + data$x1
p_hat <- 1 / (1 + exp(-eta))
loglik_full <- sum(data$y * log(p_hat) + (1 - data$y) * log(1 - p_hat))
# Hitung G²
G2 <- -2 * (loglik_null - loglik_full)
# Uji signifikansi
p_value <- pchisq(G2, df = 1, lower.tail = FALSE)
Interpretasi
Semakin besar nilai \(G^2\), semakin besar perbedaan antara model null dan full → artinya model dengan prediktor jauh lebih baik.
Bandingkan \(G^2\) terhadap distribusi \(\chi^2\) dengan derajat bebas sesuai jumlah prediktor.
Model regresi Poisson digunakan untuk memodelkan data count (jumlah kejadian) di mana variabel respons mengikuti distribusi Poisson. Estimasi dilakukan dengan Maximum Likelihood Estimation (MLE), dan inferensi dilakukan dengan uji Wald dan Likelihood Ratio Test.
Model Regresi Poisson
Fungsi distribusi Poisson:
\[ P(Y_i = y_i) = \frac{e^{-\lambda_i} \lambda_i^{y_i}}{y_i!} \]
Model regresi poisson:
\[ \log(\lambda_i) = \mathbf{x}_i^\top \boldsymbol{\beta} \]
Estimasi Parameter (MLE)
Log-likelihood fungsi:
\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^n \left[ y_i \log(\lambda_i) - \lambda_i - \log(y_i!) \right] \]
Dengan:
\[ \lambda_i = \exp(\mathbf{x}_i^\top \boldsymbol{\beta}) \]
Estimasi dilakukan dengan metode iterasi (IRLS).
Estimasi parameter model regresi Poisson menggunakan pendekatan
Maximum Likelihood Estimation (MLE) dengan metode
Iteratively Reweighted Least Squares (IRLS) secara
manual, tanpa menggunakan glm().
Tahap 1: Definisikan Model regresi Poisson:
\[ \log(\lambda_i) = \mathbf{x}_i^\top \boldsymbol{\beta} \quad \text{sehingga} \quad \lambda_i = \exp(\mathbf{x}_i^\top \boldsymbol{\beta}) \]
Tahap 2: Mencari Log-likelihood yang dimaksimalkan:
\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^n \left[ y_i \log(\lambda_i) - \lambda_i - \log(y_i!) \right] \]
Tahap 3: Formulasi iteratif:
\[ \boldsymbol{\beta}^{(t+1)} = (\mathbf{X}^\top \mathbf{W}^{(t)} \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{W}^{(t)} \mathbf{z}^{(t)} \]
Dengan:
\(\mathbf{W}\) = diag(\(\lambda_i\))
\(\mathbf{z}\) = \(\eta + \frac{y - \lambda}{\lambda}\)
dan \[ \eta_i=\log(\lambda_i) = \mathbf{x}_i^\top \boldsymbol{\beta} \]
Simulasi Data
set.seed(123)
n <- 100
x <- rnorm(n)
X <- cbind(1, x) # Tambah intercept
beta_true <- c(0.5, 0.8)
eta <- X %*% beta_true
lambda <- exp(eta)
y <- rpois(n, lambda)
data<-data.frame(x=x, y=y)
IRLS Manual Step-by-Step
# Inisialisasi
beta <- c(0, 0)
tol <- 1e-6
max_iter <- 100
for (i in 1:max_iter) {
eta <- X %*% beta
lambda <- exp(eta)
W <- diag(as.numeric(lambda))
z <- eta + (y - lambda) / lambda
beta_new <- solve(t(X) %*% W %*% X) %*% t(X) %*% W %*% z
if (sum(abs(beta_new - beta)) < tol) {
cat("Konvergen pada iterasi ke-", i, "\n")
break
}
beta <- beta_new
}
## Konvergen pada iterasi ke- 8
beta # hasil estimasi
## [,1]
## 0.4494951
## x 0.8600048
Perbandingan dengan glm()
model_glm <- glm(y ~ x, family = poisson)
summary(model_glm)
##
## Call:
## glm(formula = y ~ x, family = poisson)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.44950 0.08872 5.066 4.05e-07 ***
## x 0.86000 0.07463 11.523 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.05 on 99 degrees of freedom
## Residual deviance: 106.78 on 98 degrees of freedom
## AIC: 325.76
##
## Number of Fisher Scoring iterations: 5
IRLS memberikan cara iteratif untuk menghitung estimasi MLE dalam regresi Poisson.
Hasil manual IRLS sangat mendekati hasil glm() dari
R.
Metode ini memberikan pemahaman mendalam atas mekanisme di balik
fungsi glm().
Pengujian hipotesis Uji Wald
Untuk menguji H0: β = 0
# Koefisien dan standar error
coef_val <- coef(model)[2]
se_val <- summary(model)$coefficients[2, 2]
wald_z <- coef_val / se_val
wald_chisq <- wald_z^2
p_value <- 1 - pchisq(wald_chisq, df = 1)
cat("Z:", wald_z, "\nChi-Square:", wald_chisq, "\np-value:", p_value)
## Z: 4.110965
## Chi-Square: 16.90003
## p-value: 3.940095e-05
Uji Likelihood Ratio (Chi-Square)
model_null <- glm(y ~ 1, family = poisson, data = data)
anova(model_null, model, test = "Chisq")
## Analysis of Deviance Table
##
## Model 1: y ~ 1
## Model 2: y ~ x
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 99 245.05
## 2 98 114.76 1 130.29 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Evaluasi Model (AIC & BIC)
AIC(model)
## [1] 118.7598
BIC(model)
## [1] 123.9701
Estimasi parameter regresi Poisson dilakukan menggunakan MLE
Uji Wald dan Likelihood Ratio digunakan untuk pengujian hipotesis
AIC dan BIC digunakan untuk evaluasi dan pemilihan model terbaik
Regresi logistik merupakan salah satu metode analisis statistik yang digunakan untuk memodelkan hubungan antara satu variabel respons biner (dua kategori) dengan satu atau lebih variabel prediktor. Dalam penerapannya, prediktor yang digunakan dapat memiliki skala pengukuran berbeda, yaitu:
Nominal: Variabel yang tidak memiliki urutan logis antar kategorinya, hanya sebagai pembeda. Contoh: jenis kelamin (laki-laki, perempuan). Dalam analisis regresi logistik, data nominal diubah menjadi variabel dummy (misal: Female = 1, Male = 0).
Ordinal: Variabel yang memiliki urutan logis antar kategori, tetapi jarak antar kategori belum tentu sama. Contoh: tingkat pendidikan (SMA < Sarjana < Master < Doktor). Dalam analisis, variabel ordinal bisa diperlakukan:
Rasio: Variabel numerik kontinu yang memiliki nol absolut dan rasio bermakna. Contoh: pendapatan (dalam juta rupiah per bulan). Data ini dapat langsung digunakan dalam model tanpa transformasi khusus.
Kita membuat dataset simulasi dengan 500 observasi.
# Simulasi variabel
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 <- -2 + 0.5 * (gender == "Female") + 0.8 * as.numeric(factor(education, ordered=TRUE)) + 0.03 * income
p <- 1 / (1 + exp(-logit_p))
set.seed(123)
success <- rbinom(n, 1, p)
sim_data <- tibble(success, gender, education, income)
head(sim_data)
## # A tibble: 6 × 4
## success gender education income
## <int> <chr> <chr> <dbl>
## 1 0 Female Bachelor 20.9
## 2 1 Female HighSchool 51.6
## 3 1 Male HighSchool 59.1
## 4 0 Female HighSchool 28.2
## 5 0 Male HighSchool 57.2
## 6 1 Male PhD 37.6
Interpretasi: Dataset berisi 500 observasi dengan variabel gender, pendidikan, income, dan status keberhasilan.
sim_data %>%
dplyr::group_by(success) %>%
dplyr::summarise(
Jumlah = dplyr::n(),
Rata2_Income = mean(income)
)
## # A tibble: 2 × 3
## success Jumlah Rata2_Income
## <int> <int> <dbl>
## 1 0 114 45.0
## 2 1 386 52.4
Interpretasi: Distribusi jumlah sukses dan tidak sukses, serta rata-rata pendapatan pada masing-masing grup.
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)
summary(model_nominal)
##
## Call:
## glm(formula = success ~ gender + education + income, family = binomial,
## data = sim_data_nominal)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.594172 0.425706 -1.396 0.162794
## genderMale -0.048817 0.229659 -0.213 0.831669
## educationBachelor -0.896055 0.248818 -3.601 0.000317 ***
## educationMaster 1.334624 0.413217 3.230 0.001239 **
## educationPhD 1.266342 0.633203 2.000 0.045511 *
## income 0.039382 0.008029 4.905 9.35e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 536.85 on 499 degrees of freedom
## Residual deviance: 467.28 on 494 degrees of freedom
## AIC: 479.28
##
## Number of Fisher Scoring iterations: 5
Keterangan: Model menggunakan education sebagai variabel dummy, baseline “HighSchool”. Setiap koefisien membandingkan kategori terhadap baseline.
Interpretasi Koefisien
Intercept (+0.165503)
Ini adalah log-odds dasar untuk individu berjenis kelamin Female, berpendidikan HighSchool, dan memiliki income = 0.
Tidak signifikan (p = 0.707085), artinya baseline ini tidak berbeda secara signifikan dari probabilitas 50%.
Odds Ratio = 1.18: Peluang sukses sedikit lebih besar daripada baseline, namun tidak signifikan.
genderMale (-0.524415)
Individu Male memiliki log-odds sukses yang lebih rendah sebesar 0.5 dibandingkan Female (referensi).
p = 0.027035 (signifikan di level 5%), menunjukkan bahwa ada indikasi laki-laki memiliki peluang sukses yang lebih rendah dibandingkan perempuan.
Odds Ratio = 0.59: Peluang sukses laki-laki sekitar 59% dari peluang sukses perempuan.
educationBachelor (-1.022694)
Individu dengan pendidikan Bachelor memiliki log-odds sukses yang lebih rendah sebesar -1.023 dibandingkan dengan HighSchool.
p = 0.0000 (sangat signifikan), berarti pendidikan Bachelor justru dikaitkan dengan probabilitas sukses yang lebih rendah dibanding HighSchool.
Odds Ratio = 0.36: Peluang sukses individu Bachelor hanya 36% dari peluang individu HighSchool.
educationMaster (+2.087935)
Individu dengan pendidikan Master memiliki log-odds sukses lebih tinggi sebesar 2.087935 dibanding HighSchool.
p = 0.0007 (signifikan), menunjukkan pendidikan Master meningkatkan peluang sukses dibanding HighSchool.
Odds Ratio = 8.07: Peluang sukses individu Master sekitar 8 kali lebih besar dibanding individu HighSchool.
educationPhD (+1.155966)
Individu dengan pendidikan PhD memiliki log-odds sukses lebih tinggi sebesar 1.16 dibanding HighSchool.
p = 0.021804 (signifikan), menunjukkan pendidikan PhD meningkatkan peluang sukses secara signifikan dibanding HighSchool.
Odds Ratio = 3.18: Peluang sukses individu PhD sekitar 3 kali lebih besar dibanding individu HighSchool.
income (+0.0307)
Setiap kenaikan 1 unit income (misal, 1 juta), meningkatkan log-odds sukses sebesar 0.0307.
p = 0.000115 (sangat signifikan), artinya pendapatan berhubungan positif dengan peluang sukses.
Odds Ratio = 1.031: Setiap tambahan 1 juta meningkatkan peluang sukses sekitar 3.1%.
Interpretasi Goodness-of-Fit
Null deviance (551.08): Deviance model tanpa prediktor.
Residual deviance (502.90): Deviance model dengan prediktor.
AIC (459.21):
Signifikansi Model
Variabel income dan education (Master dan PhD) signifikan meningkatkan peluang sukses.
Variabel gender menunjukkan tren, dan signifikan pada taraf 5%.
Pendidikan Bachelor justru diasosiasikan dengan penurunan peluang sukses dibandingkan HighSchool dalam data ini, yang mungkin terjadi akibat struktur data simulasi.
Kesimpulan Praktis
Income dan tingkat pendidikan yang lebih tinggi (Master dan PhD) merupakan prediktor kuat untuk peluang sukses.
Gender berpotensi berpengaruh tetapi perlu data tambahan untuk konfirmasi.
Model cukup baik dalam memprediksi dibandingkan model null, namun ada ruang untuk peningkatan dengan mungkin menambahkan variabel lain.
sim_data_numeric <- sim_data %>%
mutate(
education_numeric = case_when(
education == "HighSchool" ~ 1,
education == "Bachelor" ~ 2,
education == "Master" ~ 3,
education == "PhD" ~ 4
)
)
model_numeric <- glm(success ~ gender + education_numeric + income, data = sim_data_numeric, family = binomial)
summary(model_numeric)
##
## Call:
## glm(formula = success ~ gender + education_numeric + income,
## family = binomial, data = sim_data_numeric)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.099086 0.457804 -2.401 0.01636 *
## genderMale -0.052597 0.220118 -0.239 0.81115
## education_numeric 0.372889 0.122763 3.037 0.00239 **
## income 0.033720 0.007569 4.455 8.39e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 536.85 on 499 degrees of freedom
## Residual deviance: 506.19 on 496 degrees of freedom
## AIC: 514.19
##
## Number of Fisher Scoring iterations: 4
Interpretasi: Model menggunakan education sebagai angka bertingkat 1–4. Koefisien education_numeric mengukur efek kenaikan satu tingkat pendidikan terhadap peluang sukses.
Perbandingan Model
list(
AIC_Nominal = AIC(model_nominal),
AIC_Numeric = AIC(model_numeric)
)
## $AIC_Nominal
## [1] 479.2832
##
## $AIC_Numeric
## [1] 514.1855
Keterangan: Model dengan nilai AIC lebih kecil lebih disukai. Membandingkan mana yang lebih baik: treat education sebagai nominal atau numeric.
Interpretasi Koefisien
Intercept (-0.658626) - Ini adalah log-odds dasar untuk individu Female, berpendidikan HighSchool (education_numeric = 1), dan income = 0. - Tidak signifikan (p = 0.153931), artinya baseline ini tidak berbeda secara signifikan dari probabilitas 50%. - Odds Ratio = 0.518: Peluang sukses dasar lebih kecil dari baseline, namun tidak signifikan.
genderMale (-0.565786) - Individu Male memiliki log-odds sukses yang lebih rendah sebesar 0.566 dibandingkan Female (referensi). - p = 0.011737 (signifikan pada taraf 5%), menunjukkan bahwa laki-laki memiliki peluang sukses lebih rendah dibandingkan perempuan. - Odds Ratio = 0.568: Peluang sukses laki-laki sekitar 57% dari peluang sukses perempuan.
education_numeric (+0.399473) - Setiap kenaikan satu tingkat pendidikan (HighSchool -> Bachelor -> Master -> PhD) meningkatkan log-odds sukses sebesar 0.399. - p = 0.000706 (sangat signifikan), menunjukkan bahwa semakin tinggi tingkat pendidikan, semakin besar peluang sukses. - Odds Ratio = 1.491: Setiap kenaikan satu tingkat pendidikan meningkatkan peluang sukses sekitar 49%.
income (+0.030055) - Setiap kenaikan 1 unit income (misal, 1 juta), meningkatkan log-odds sukses sebesar 0.030. - p = 0.000182 (sangat signifikan), artinya pendapatan berhubungan positif dengan peluang sukses. - Odds Ratio = 1.030: Setiap tambahan 1 juta meningkatkan peluang sukses sekitar 3.0%.
Interpretasi Goodness-of-Fit
Signifikansi Model
Kesimpulan Praktis
Goodness-of-Fit Model
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))
list(
McFadden_R2_Nominal = r2_nominal,
McFadden_R2_Numeric = r2_numeric
)
## $McFadden_R2_Nominal
## 'log Lik.' 0.1295807 (df=6)
##
## $McFadden_R2_Numeric
## 'log Lik.' 0.05711641 (df=4)
Interpretasi: McFadden’s R² mengukur goodness-of-fit. Semakin besar nilainya, semakin baik model memprediksi dibandingkan model null.
Visualisasi Prediksi
sim_data_nominal <- sim_data_nominal %>% mutate(predicted = predict(model_nominal, type = "response"))
sim_data_numeric <- sim_data_numeric %>% mutate(predicted = predict(model_numeric, type = "response"))
# Plot untuk model nominal
sim_data_nominal %>%
ggplot(aes(x = income, y = predicted, color = education)) +
geom_point(alpha = 0.6) +
labs(title = "Prediksi Probabilitas (Ordinal sebagai Nominal)", x = "Income", y = "Prediksi Probabilitas") +
theme_minimal()
# Plot untuk model numeric
sim_data_numeric %>%
ggplot(aes(x = income, y = predicted, color = as.factor(education_numeric))) +
geom_point(alpha = 0.6) +
labs(title = "Prediksi Probabilitas (Ordinal sebagai Numeric)", x = "Income", y = "Prediksi Probabilitas") +
theme_minimal()
Interpretasi: Visualisasi hubungan antara pendapatan dan probabilitas sukses berdasarkan tingkat pendidikan, dengan dua pendekatan perlakuan ordinal.
Ringkasan Koefisien Model
library(knitr)
library(kableExtra)
# Ringkasan model nominal
tidy(model_nominal) %>%
kable(format = "latex", booktabs = TRUE, caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Nominal") %>%
kable_styling(latex_options = c("hold_position", "striped"))
# Ringkasan model numeric
tidy(model_numeric) %>%
kable(format = "latex", booktabs = TRUE, caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Numeric") %>%
kable_styling(latex_options = c("hold_position", "striped"))
Interpretasi: Tabel memperlihatkan estimasi koefisien, standar error, nilai z, dan p-value. Koefisien positif meningkatkan log-odds keberhasilan, koefisien negatif menurunkan.
Kesimpulan
Model dengan perlakuan ordinal sebagai numeric memiliki interpretasi lebih sederhana jika asumsi jarak antar tingkatannya konsisten.
Catatan: Semua hasil berbasis data simulasi, sehingga hasil bisa berbeda jika menggunakan data nyata.
Dalam analisis regresi logistik, pemilihan model sangat krusial untuk mendapatkan model yang baik dalam memprediksi probabilitas kejadian suatu peristiwa (respon biner). Dua pendekatan utama dalam membangun model adalah pendekatan Confirmatory dan Exploratory.
Pendekatan ini digunakan ketika peneliti telah memiliki teori atau hipotesis yang jelas mengenai efek atau hubungan antara variabel prediktor dan respon.
Ciri-ciri:
Model dibangun berdasarkan teori atau hasil penelitian sebelumnya.
Tujuan utamanya adalah menguji apakah efek tersebut benar-benar signifikan, bukan sekadar mencari model terbaik.
Peneliti biasanya menyusun model penuh terlebih dahulu, lalu menguji apakah penambahan atau pengurangan suatu efek (misalnya, interaksi) memberikan peningkatan model secara signifikan.
Uji signifikansi dilakukan dengan membandingkan model dengan efek tertentu dan model tanpa efek tersebut, misalnya dengan Likelihood Ratio Test.
Contoh penggunaan:
Misalnya, teori menyatakan bahwa faktor x1 dan x2 mempengaruhi probabilitas seseorang membeli produk. Maka model logistik dibangun langsung dengan x1 dan x2, lalu diuji apakah kontribusi x2 benar-benar signifikan.
Pendekatan ini digunakan ketika peneliti belum memiliki teori yang pasti atau ingin mengeksplorasi hubungan potensial antar variabel.
Ciri-ciri:
Model dibangun secara bertahap dengan tujuan menemukan kombinasi prediktor terbaik.
Pemilihan variabel dilakukan berdasarkan kriteria statistik, seperti AIC, deviance, atau log-likelihood.
Proses seleksi dilakukan melalui:
Forward Selection: Mulai dari model kosong, satu per satu variabel dimasukkan jika signifikan.
Backward Elimination: Mulai dari model penuh, variabel yang tidak signifikan dikeluarkan.
Stepwise Selection: Gabungan dari keduanya, variabel dapat masuk dan keluar secara dinamis.
Tujuan:
Menemukan model yang parsimonious, yaitu cukup sederhana namun memiliki performa prediksi yang baik.
Pemilihan antara pendekatan Confirmatory dan Exploratory bergantung pada tujuan penelitian. Jika ingin menguji hipotesis tertentu, gunakan pendekatan Confirmatory. Jika ingin menemukan model terbaik berdasarkan data, gunakan pendekatan Exploratory. Dalam praktiknya, kedua pendekatan ini sering digunakan secara komplementer: teori digunakan sebagai dasar, dan seleksi eksploratori dilakukan untuk menyempurnakan model.
Simulasi Data
library(knitr)
library(dplyr)
library(ggplot2)
library(MASS)
library(caret)
library(pROC)
library(DescTools)
set.seed(123)
n <- 200
x1 <- rnorm(n)
x2 <- rbinom(n, 1, 0.5)
x3 <- rnorm(n)
lin_pred <- -0.5 + 1.2 * x1 - 0.8 * x2 + 0.5 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(n, 1, p)
df <- data.frame(y = as.factor(y), x1, x2, x3)
head(df)
## y x1 x2 x3
## 1 0 -0.56047565 1 -0.7152422
## 2 0 -0.23017749 0 -0.7526890
## 3 1 1.55870831 1 -0.9385387
## 4 1 0.07050839 1 -1.0525133
## 5 1 0.12928774 0 -0.4371595
## 6 1 1.71506499 0 0.3311792
Pemilihan Model
Model Full
model_full <- glm(y ~ x1 + x2 + x3, data = df, family = binomial)
summary(model_full)
##
## Call:
## glm(formula = y ~ x1 + x2 + x3, family = binomial, data = df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.7148 0.2470 -2.894 0.00381 **
## x1 1.4029 0.2315 6.061 1.35e-09 ***
## x2 -0.2507 0.3463 -0.724 0.46903
## x3 0.3567 0.1704 2.094 0.03630 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 257.72 on 199 degrees of freedom
## Residual deviance: 202.67 on 196 degrees of freedom
## AIC: 210.67
##
## Number of Fisher Scoring iterations: 4
null_model <- glm(y ~ 1, data = df, family = binomial)
step_forward <- step(null_model, direction = "forward", scope = formula(model_full), trace = FALSE)
step_backward <- step(model_full, direction = "backward", trace = FALSE)
step_both <- step(null_model, direction = "both", scope = formula(model_full), trace = FALSE)
AIC(model_full, step_forward, step_backward, step_both)
## df AIC
## model_full 4 210.6739
## step_forward 3 209.1998
## step_backward 3 209.1998
## step_both 3 209.1998
pred_prob <- predict(step_both, type = "response")
roc_obj <- roc(df$y, pred_prob)
plot(roc_obj, main = "Kurva ROC", col = "blue")
auc(roc_obj)
## Area under the curve: 0.7964
PseudoR2(step_both, which = c("CoxSnell", "Nagelkerke", "McFadden"))
## CoxSnell Nagelkerke McFadden
## 0.2385981 0.3294000 0.2115439
pred_class <- ifelse(pred_prob >= 0.5, 1, 0)
conf_matrix <- confusionMatrix(factor(pred_class), df$y, positive = "1")
conf_matrix
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 116 32
## 1 15 37
##
## Accuracy : 0.765
## 95% CI : (0.7, 0.8219)
## No Information Rate : 0.655
## P-Value [Acc > NIR] : 0.0005028
##
## Kappa : 0.4478
##
## Mcnemar's Test P-Value : 0.0196041
##
## Sensitivity : 0.5362
## Specificity : 0.8855
## Pos Pred Value : 0.7115
## Neg Pred Value : 0.7838
## Prevalence : 0.3450
## Detection Rate : 0.1850
## Detection Prevalence : 0.2600
## Balanced Accuracy : 0.7109
##
## 'Positive' Class : 1
##
conf_matrix$byClass[c("Sensitivity", "Specificity")]
## Sensitivity Specificity
## 0.5362319 0.8854962
Model terbaik berdasarkan AIC adalah model r names(which.min(c(AIC(model_full), AIC(step_forward), AIC(step_backward), AIC(step_both))). ROC menunjukkan r round(auc(roc_obj), 2) yang cukup baik. Pseudo-R² dan hasil klasifikasi juga menunjukkan model cukup akurat.
Tujuan
Dokumen ini menyajikan cara membandingkan model regresi logistik menggunakan ukuran: - Deviance - AIC (Akaike Information Criterion) - Likelihood-Ratio
serta menjelaskan prinsip Parsimony dalam pemilihan model.
library(MASS)
library(broom)
library(DescTools)
set.seed(123)
Simulasi Data
n <- 300
x1 <- rnorm(n)
x2 <- rbinom(n, 1, 0.5)
x3 <- rnorm(n)
lin_pred <- -1 + 1.2 * x1 - 0.6 * x2 + 0.8 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(n, 1, p)
data <- data.frame(y = as.factor(y), x1, x2, x3)
Pembuatan Model
model1 <- glm(y ~ x1, data = data, family = binomial)
model2 <- glm(y ~ x1 + x2, data = data, family = binomial)
model3 <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
Perbandingan AIC dan Deviance
model_comp <- data.frame(
Model = c("Model 1", "Model 2", "Model 3"),
AIC = c(AIC(model1), AIC(model2), AIC(model3)),
Deviance = c(deviance(model1), deviance(model2), deviance(model3))
)
model_comp
## Model AIC Deviance
## 1 Model 1 306.2741 302.2741
## 2 Model 2 305.8225 299.8225
## 3 Model 3 278.4581 270.4581
anova(model1, model2, test = "LRT")
## Analysis of Deviance Table
##
## Model 1: y ~ x1
## Model 2: y ~ x1 + x2
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 298 302.27
## 2 297 299.82 1 2.4516 0.1174
anova(model2, model3, test = "LRT")
## Analysis of Deviance Table
##
## Model 1: y ~ x1 + x2
## Model 2: y ~ x1 + x2 + x3
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 297 299.82
## 2 296 270.46 1 29.364 5.997e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model yang kompleks sering memiliki AIC dan deviance yang lebih kecil. Namun: - Model sederhana lebih mudah diinterpretasikan. - Jika penurunan AIC tidak signifikan, pilih model lebih sederhana. - Parsimony mencegah overfitting.
Rumus dan Penjelasan
Rumus AIC
\[ \text{AIC} = -2(\log L - k) = -2 \log L + 2k \]
Penjelasan: AIC adalah ukuran untuk menilai model berdasarkan kombinasi antara goodness-of-fit (melalui log-likelihood) dan kompleksitas (melalui jumlah parameter \(k\)). Semakin kecil AIC, semakin baik model tersebut secara keseluruhan karena AIC menghukum model yang terlalu kompleks meskipun memiliki likelihood tinggi.
Rumus Deviance
\[ D = -2 \left[ \log L(\text{model}) - \log L(\text{model saturasi}) \right] \]
Penjelasan: Deviance mengukur seberapa jauh model saat ini dibandingkan dengan model sempurna (model saturasi). Nilai deviance yang kecil menunjukkan model memberikan prediksi yang mendekati data aktual.
Rumus Likelihood-Ratio
\[ G^2 = -2 (\log L_0 - \log L_1) \]
Penjelasan: Statistik Likelihood Ratio digunakan untuk menguji apakah penambahan variabel dalam model secara signifikan meningkatkan kecocokan model. Jika \(G^2\) besar dan p-value kecil, maka model kompleks lebih baik dari model sederhana secara statistik.
pred_prob <- predict(model3, type = "response")
pred_class <- factor(ifelse(pred_prob >= 0.5, 1, 0))
conf_matrix <- confusionMatrix(pred_class, data$y, positive = "1")
conf_matrix
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 193 48
## 1 18 41
##
## Accuracy : 0.78
## 95% CI : (0.7288, 0.8256)
## No Information Rate : 0.7033
## P-Value [Acc > NIR] : 0.0017748
##
## Kappa : 0.4159
##
## Mcnemar's Test P-Value : 0.0003575
##
## Sensitivity : 0.4607
## Specificity : 0.9147
## Pos Pred Value : 0.6949
## Neg Pred Value : 0.8008
## Prevalence : 0.2967
## Detection Rate : 0.1367
## Detection Prevalence : 0.1967
## Balanced Accuracy : 0.6877
##
## 'Positive' Class : 1
##
\[ \text{Sensitivity} = \frac{\text{TP}}{\text{TP + FN}} \]
\[ \text{Specificity} = \frac{\text{TN}}{\text{TN + FP}} \]
conf_matrix$byClass[c("Sensitivity", "Specificity")]
## Sensitivity Specificity
## 0.4606742 0.9146919
Kesimpulan
Kurva ROC adalah alat visual yang digunakan untuk mengevaluasi performa model klasifikasi biner. Kurva ini menunjukkan trade-off antara True Positive Rate (Sensitivity) dan False Positive Rate (1 - Specificity) pada berbagai threshold klasifikasi.
Sumbu Y: Sensitivity = True Positive Rate = TP / (TP + FN)
Sumbu X: 1 - Specificity = False Positive Rate = FP / (FP + TN)
Garis diagonal (dari kiri bawah ke kanan atas) menunjukkan performa acak (random guess).
Kurva yang mendekati pojok kiri atas menunjukkan performa klasifikasi yang lebih baik.
Saat cut-off menurun, model mengklasifikasikan lebih banyak pengamatan sebagai positif:
Sensitivitas naik
Spesifisitas turun
Saat cut-off naik, model menjadi lebih konservatif:
Sensitivitas turun
Spesifisitas naik
Kurva ideal memiliki bentuk:
Naik tajam secara vertikal hingga mencapai sensitivitas = 1
Lalu bergerak secara horizontal menuju 1 - specificity = 1
Area under the curve (AUC) mendekati 1
AUC = 0.5: model tidak lebih baik dari tebak acak
AUC > 0.7: model cukup baik
AUC > 0.9: model sangat baik
AUC dikenal juga sebagai concordance index, yaitu probabilitas bahwa model memberikan nilai skor probabilitas yang lebih tinggi untuk kasus positif daripada kasus negatif.
Untuk membandingkan performa beberapa model klasifikasi
Untuk memilih threshold (cut-off) optimal berdasarkan kebutuhan aplikasi (misalnya: lebih penting menghindari false negative atau false positive?)
Kurva ROC dapat dibuat menggunakan package pROC:
library(pROC)
set.seed(123)
x1 <- rnorm(200)
x2 <- rbinom(200, 1, 0.5)
x3 <- rnorm(200)
lin_pred <- -1 + 1.5 * x1 - 0.7 * x2 + 0.6 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(200, 1, p)
data <- data.frame(y = as.factor(y), x1, x2, x3)
model <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
pred <- predict(model, type = "response")
roc_obj <- roc(data$y, pred)
plot(roc_obj)
auc(roc_obj)
## Area under the curve: 0.8686
Untuk memilih threshold terbaik, kita bisa mengevaluasi sensitivitas dan spesifisitas pada berbagai cut-off.
thresholds <- seq(0.1, 0.9, by = 0.05)
results <- data.frame(Threshold = thresholds)
results$Sensitivity <- sapply(thresholds, function(t) {
pred_class <- ifelse(pred >= t, 1, 0)
cm <- table(Pred = pred_class, Obs = data$y)
TP <- cm["1", "1"]
FN <- cm["0", "1"]
TP / (TP + FN)
})
results$Specificity <- sapply(thresholds, function(t) {
pred_class <- ifelse(pred >= t, 1, 0)
cm <- table(Pred = pred_class, Obs = data$y)
TN <- cm["0", "0"]
FP <- cm["1", "0"]
TN / (TN + FP)
})
print(results)
## Threshold Sensitivity Specificity
## 1 0.10 0.91489362 0.5947712
## 2 0.15 0.85106383 0.6862745
## 3 0.20 0.80851064 0.7320261
## 4 0.25 0.76595745 0.7712418
## 5 0.30 0.72340426 0.8104575
## 6 0.35 0.68085106 0.8366013
## 7 0.40 0.61702128 0.8954248
## 8 0.45 0.59574468 0.9150327
## 9 0.50 0.51063830 0.9281046
## 10 0.55 0.51063830 0.9477124
## 11 0.60 0.42553191 0.9607843
## 12 0.65 0.36170213 0.9738562
## 13 0.70 0.29787234 0.9803922
## 14 0.75 0.19148936 0.9869281
## 15 0.80 0.12765957 0.9869281
## 16 0.85 0.06382979 1.0000000
## 17 0.90 0.02127660 1.0000000
Cut-off optimal bisa dipilih berdasarkan:
Maksimum dari Sensitivity + Specificity
Atau mempertimbangkan trade-off sesuai tujuan aplikasi (misalnya: jika False Negative harus dihindari, maka prioritaskan sensitivitas tinggi)
ROC cocok saat proporsi kelas seimbang
Untuk data dengan kelas tidak seimbang, precision-recall curve bisa lebih informatif
Penjelasan Precision-Recall Curve
Kurva Precision-Recall (PR) adalah alat evaluasi performa model klasifikasi, khususnya sangat berguna saat bekerja dengan data yang tidak seimbang (class imbalance).
1. Definisi
\[ \text{Precision} = \frac{TP}{TP + FP} \]
\[ \text{Recall} = \frac{TP}{TP + FN} \]
2. Interpretasi
PR Curve menunjukkan bagaimana presisi berubah saat recall meningkat.
Idealnya, kita ingin nilai presisi dan recall keduanya tinggi, tetapi biasanya ada trade-off.
Model dengan performa baik memiliki PR Curve yang melengkung ke pojok kanan atas.
3. Area Under PR Curve
Luas kurva (AUPRC) mendekati 1 berarti model sangat baik.
Baseline AUPRC = prevalensi kelas positif dalam data.
4. PR Curve vs ROC Curve
| Aspek | ROC Curve | Precision-Recall Curve |
|---|---|---|
| Fokus | Semua kelas | Kelas positif saja |
| Kuat di | Data seimbang | Data tidak seimbang |
| Sumbu Y | Sensitivitas (Recall) | Precision |
| Sumbu X | 1 - Spesifisitas | Recall |
5. Visualisasi PR Curve di R
library(PRROC)
set.seed(123)
x1 <- rnorm(200)
x2 <- rbinom(200, 1, 0.5)
x3 <- rnorm(200)
lin_pred <- -1 + 1.5 * x1 - 0.7 * x2 + 0.6 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(200, 1, p)
data <- data.frame(y = y, x1, x2, x3)
model <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
prob <- predict(model, type = "response")
pr <- pr.curve(scores.class0 = prob[data$y == 1],
scores.class1 = prob[data$y == 0],
curve = TRUE)
plot(pr)
6. Catatan
Tujuan
Dokumen ini menjelaskan dan menghitung pseudo R-squared dalam regresi logistik:
\(R^2_{\text{Cox\\ and\\ Snell}}\)
\(R^2_{\text{McFadden}}\)
Simulasi Data
set.seed(123)
n <- 300
x1 <- rnorm(n)
x2 <- rbinom(n, 1, 0.5)
x3 <- rnorm(n)
lin_pred <- -1 + 1.2 * x1 - 0.6 * x2 + 0.8 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(n, 1, p)
data <- data.frame(y = as.factor(y), x1, x2, x3)
Model Logistik dan Null Model
model <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
model_null <- glm(y ~ 1, data = data, family = binomial)
Likelihood dan Rumus
\[ R^2_{\mathrm{Cox\ and\ Snell}} = 1 - \left(\frac{L_0}{L_M}\right)^{2/n} \]
\[ R^2_{\mathrm{McFadden}} = 1 - \frac{\log L_M}{\log L_0} \]
Dengan:
\(L_0\): likelihood model null (tanpa prediktor)
\(L_M\): likelihood model penuh
Perhitungan Manual R-squared
logL0 <- logLik(model_null)
logLM <- logLik(model)
L0 <- exp(logL0)
LM <- exp(logLM)
n <- nobs(model)
cox_snell <- 1 - (L0 / LM)^(2 / n)
mcfadden <- 1 - (as.numeric(logLM) / as.numeric(logL0))
r2 <- data.frame(
R2_Cox_Snell = cox_snell,
R2_McFadden = mcfadden
)
r2
## R2_Cox_Snell R2_McFadden
## 1 0.2698462 0.2586292
Perhitungan Otomatis dengan Package Tambahan
Menggunakan pscl
if (!require(pscl)) install.packages("pscl"); library(pscl)
pR2(model)
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML r2CU
## -135.2290328 -182.4040393 94.3500130 0.2586292 0.2698462 0.3835251
Menggunakan rcompanion
if (!require(rcompanion)) install.packages("rcompanion"); library(rcompanion)
nagelkerke(model)
## $Models
##
## Model: "glm, y ~ x1 + x2 + x3, binomial, data"
## Null: "glm, y ~ 1, binomial, data"
##
## $Pseudo.R.squared.for.model.vs.null
## Pseudo.R.squared
## McFadden 0.258629
## Cox and Snell (ML) 0.269846
## Nagelkerke (Cragg and Uhler) 0.383525
##
## $Likelihood.ratio.test
## Df.diff LogLik.diff Chisq p.value
## -3 -47.175 94.35 2.5468e-20
##
## $Number.of.observations
##
## Model: 300
## Null: 300
##
## $Messages
## [1] "Note: For models fit with REML, these statistics are based on refitting with ML"
##
## $Warnings
## [1] "None"
Menggunakan DescTools
if (!require(DescTools)) install.packages("DescTools"); library(DescTools)
PseudoR2(model, which = "all")
## McFadden McFaddenAdj CoxSnell Nagelkerke AldrichNelson
## 0.2586292 0.2366998 0.2698462 0.3835251 0.2392545
## VeallZimmermann Efron McKelveyZavoina Tjur AIC
## 0.4360055 0.2893849 0.4315315 0.2936202 278.4580657
## BIC logLik logLik0 G2
## 293.2731956 -135.2290328 -182.4040393 94.3500130
Interpretasi
Nilai \(R^2\) mendekati 1 berarti model memiliki kekuatan prediktif yang baik.
McFadden R² > 0.2 sering dianggap sebagai model dengan kecocokan yang baik.
Cox & Snell R² lebih konservatif dan tidak pernah mencapai 1 penuh.
Gunakan beberapa pendekatan ini sebagai pelengkap untuk menilai performa model logistik secara lebih menyeluruh.
Distribusi multinomial adalah perluasan dari distribusi binomial untuk lebih dari dua kategori.
Jika \(X_1, X_2, \dots, X_k\) menyatakan banyaknya kejadian dalam masing-masing dari \(k\) kategori, maka:
\[ P(X_1 = x_1, \dots, X_k = x_k) = \frac{n!}{x_1! x_2! \dots x_k!} p_1^{x_1} p_2^{x_2} \dots p_k^{x_k} \]
dengan \(\sum_{i=1}^k x_i = n\) dan \(\sum_{i=1}^k p_i = 1\).
Sebuah survei dilakukan terhadap 10 orang yang diminta memilih satu dari tiga jenis buah favorit: Apel (A), Jeruk (J), dan Pisang (P).
Hasil survei:
Apel: 4 orang
Jeruk: 3 orang
Pisang: 3 orang
Probabilitas teoretik preferensi:
\(p_A = 0.3\),
\(p_J = 0.4\),
\(p_P = 0.3\)
Pertanyaannya: > Berapa peluang bahwa dalam 10 orang akan ada 4 yang memilih Apel, 3 memilih Jeruk, dan 3 memilih Pisang?
Rumus Distribusi Multinomial Distribusi peluang multinomial:
\[ P(X_1 = x_1, \dots, X_k = x_k) = \frac{n!}{x_1! x_2! \dots x_k!} p_1^{x_1} p_2^{x_2} \dots p_k^{x_k} \]
dengan:
\(n = 10\), \(x_1 = 4\), \(x_2 = 3\), \(x_3 = 3\)
\(p_1 = 0.3\), \(p_2 = 0.4\), \(p_3 = 0.3\)
Perhitungan Manual di R
n <- 10
x <- c(4, 3, 3)
p <- c(0.3, 0.4, 0.3)
# Hitung komponen-koefisien
faktorial_total <- factorial(n)
faktorial_x <- prod(factorial(x))
koefisien <- faktorial_total / faktorial_x
# Hitung peluang
peluang <- koefisien * prod(p^x)
peluang
## [1] 0.05878656
Probabilitas bahwa 4 orang memilih Apel, 3 Jeruk, dan 3 Pisang (dengan proporsi preferensi 0.3, 0.4, dan 0.3) adalah 0.058787. Distribusi multinomial digunakan untuk menghitung peluang dalam percobaan dengan beberapa kategori hasil. Rumus dasarnya merupakan generalisasi dari binomial untuk lebih dari dua kategori.
Model ini digunakan untuk memodelkan hubungan antara satu variabel respon kategorik (>2 kategori) dan satu atau lebih variabel prediktor.
Misalkan \(Y\) memiliki \(K\) kategori, dan kita pilih referensi (baseline) kategori \(K\), maka model logit untuk kategori \(j\) adalah:
\[ \log\left(\frac{P(Y = j)}{P(Y = K)}\right) = \beta_{j0} + \beta_{j1}x_1 + \cdots + \beta_{jp}x_p \]
untuk \(j = 1, 2, ..., K-1\).
Baseline-category logit model adalah model regresi logistik untuk variabel respon kategorik dengan lebih dari dua kategori (nominal). Model ini menggunakan satu kategori sebagai acuan (baseline) dan membandingkan kategori lainnya terhadap baseline tersebut dalam bentuk logit.
\[ \log\left(\frac{\pi_j}{\pi_c}\right), \quad j = 1, \ldots, c - 1 \]
dengan:
\(\pi_j\) adalah probabilitas respon berada di kategori \(j\)
\(\pi_c\) adalah probabilitas respon berada di kategori acuan (baseline)
Maka, terdapat sebanyak \((c - 1)\) fungsi logit.
Catatan: Kategori baseline bisa ditentukan secara eksplisit, tetapi default di R adalah kategori terakhir.
Model Regresi Jika terdapat satu prediktor \(x\), maka bentuk umum model logit-nya adalah:
\[ \log\left(\frac{\pi_j}{\pi_c}\right) = \alpha_j + \beta_j x, \quad j = 1, \ldots, c - 1 \]
Contoh Kasus: 3 Kategori Respon Misalkan respon \(Y\) memiliki tiga kategori: \(Y \in \{1, 2, 3\}\), dan kita gunakan kategori ke-3 sebagai baseline. Maka:
\[ \log\left(\frac{\pi_1}{\pi_3}\right) = \alpha_1 + \beta_1 x \] \[ \log\left(\frac{\pi_2}{\pi_3}\right) = \alpha_2 + \beta_2 x \]
Terdapat dua model logit, satu untuk perbandingan kategori 1 dengan 3, dan satu lagi untuk kategori 2 dengan 3.
Relasi Antar Kategori Jika ingin menghitung logit antara kategori 1 dan 2:
\[ \log\left(\frac{\pi_1}{\pi_2}\right) = \log\left(\frac{\pi_1 / \pi_3}{\pi_2 / \pi_3}\right) = \log\left(\frac{\pi_1}{\pi_3}\right) - \log\left(\frac{\pi_2}{\pi_3}\right) \]
\[ = (\alpha_1 + \beta_1 x) - (\alpha_2 + \beta_2 x) = (\alpha_1 - \alpha_2) + (\beta_1 - \beta_2)x \]
Model baseline-category logit:
Digunakan untuk respon dengan kategori > 2
Menghasilkan \((c - 1)\) fungsi logit terhadap satu baseline
Logit antara kategori selain baseline dapat dihitung dari selisih dua logit terhadap baseline
Implementasi di R menggunakan fungsi
multinom()dari packagennet, dan kategori baseline bisa diatur denganrelevel().
Estimasi dilakukan menggunakan metode maximum likelihood dengan algoritma iteratif seperti Newton-Raphson.
Log-likelihood: \[ \ell(\beta) = \sum_{i=1}^n \sum_{j=1}^{K} y_{ij} \log(\pi_{ij}) \] dengan \(\pi_{ij} = P(Y_i = j | x_i)\) dan \(y_{ij} = 1\) jika \(Y_i = j\).
Sebuah perusahaan teknologi ingin memahami faktor-faktor yang mempengaruhi preferensi karyawan terhadap jenis perangkat kerja yang diberikan: Laptop, Desktop, atau Tablet.
Perusahaan melakukan survei terhadap 150 karyawan dan mengumpulkan data berikut:
Device: Jenis perangkat yang dipilih (Laptop,
Desktop, Tablet)
Age: Usia karyawan
Department: Divisi tempat bekerja (IT, Marketing,
HR)
Experience: Tahun pengalaman kerja
Tujuannya adalah:
Mengetahui bagaimana usia, divisi, dan pengalaman kerja memengaruhi pilihan perangkat kerja.
set.seed(123)
n <- 150
Department <- sample(c("IT", "Marketing", "HR"), n, replace = TRUE)
Age <- round(rnorm(n, mean = 35, sd = 7))
Experience <- round(pmax(rnorm(n, mean = 7, sd = 3), 0))
# Simulasikan Device berdasarkan probabilitas berbeda per Department
Device <- sapply(Department, function(dep) {
if (dep == "IT") {
sample(c("Laptop", "Desktop", "Tablet"), size = 1, prob = c(0.6, 0.2, 0.2))
} else if (dep == "Marketing") {
sample(c("Laptop", "Desktop", "Tablet"), size = 1, prob = c(0.3, 0.3, 0.4))
} else {
sample(c("Laptop", "Desktop", "Tablet"), size = 1, prob = c(0.4, 0.4, 0.2))
}
})
df <- data.frame(Device = factor(Device), Age, Department = factor(Department), Experience)
df$Device <- relevel(df$Device, ref = "Laptop") # baseline
head(df)
## Device Age Department Experience
## 1 Desktop 36 HR 8
## 2 Desktop 44 HR 10
## 3 Tablet 32 HR 3
## 4 Laptop 37 Marketing 9
## 5 Laptop 34 HR 14
## 6 Tablet 38 Marketing 2
model_mnlogit <- multinom(Device ~ Age + Department + Experience, data = df)
## # weights: 18 (10 variable)
## initial value 164.791843
## iter 10 value 153.109490
## final value 153.057472
## converged
summary(model_mnlogit)
## Call:
## multinom(formula = Device ~ Age + Department + Experience, data = df)
##
## Coefficients:
## (Intercept) Age DepartmentIT DepartmentMarketing Experience
## Desktop -0.1947009 0.00396078 -1.04132876 0.2153637 -0.03133456
## Tablet -0.2612636 -0.02768129 0.03737652 1.2451673 0.04419583
##
## Std. Errors:
## (Intercept) Age DepartmentIT DepartmentMarketing Experience
## Desktop 1.139007 0.02802812 0.5359687 0.4742033 0.06782814
## Tablet 1.168694 0.02813761 0.5419639 0.4997768 0.06972093
##
## Residual Deviance: 306.1149
## AIC: 326.1149
z <- summary(model_mnlogit)$coefficients / summary(model_mnlogit)$standard.errors
pval <- 2 * (1 - pnorm(abs(z)))
round(pval, 4)
## (Intercept) Age DepartmentIT DepartmentMarketing Experience
## Desktop 0.8643 0.8876 0.052 0.6497 0.6441
## Tablet 0.8231 0.3252 0.945 0.0127 0.5261
Interpretasi:
Koefisien untuk kategori “Desktop” dan “Tablet” dibandingkan dengan baseline “Laptop”
Nilai p-value kecil (<0.05) menunjukkan variabel tersebut signifikan memengaruhi preferensi perangkat.
df$Predicted <- predict(model_mnlogit)
table(Predicted = df$Predicted, Actual = df$Device)
## Actual
## Predicted Laptop Desktop Tablet
## Laptop 50 26 21
## Desktop 3 0 1
## Tablet 13 15 21
Model regresi logistik multinomial berhasil digunakan untuk:
Menganalisis hubungan antara atribut karyawan dan preferensi perangkat kerja
Mengetahui faktor signifikan yang memengaruhi pilihan
Memungkinkan prediksi jenis perangkat yang dipilih oleh karyawan baru berdasarkan karakteristiknya
Kita gunakan dataset iris untuk memodelkan jenis spesies
bunga berdasarkan lebar dan panjang kelopak.
data(iris)
iris <- iris %>% mutate(Species = relevel(Species, ref = "setosa"))
model <- multinom(Species ~ Petal.Length + Petal.Width, data = iris)
## # weights: 12 (6 variable)
## initial value 164.791843
## iter 10 value 12.657828
## iter 20 value 10.374056
## iter 30 value 10.330881
## iter 40 value 10.306926
## iter 50 value 10.300057
## iter 60 value 10.296452
## iter 70 value 10.294046
## iter 80 value 10.292029
## iter 90 value 10.291154
## iter 100 value 10.289505
## final value 10.289505
## stopped after 100 iterations
summary(model)
## Call:
## multinom(formula = Species ~ Petal.Length + Petal.Width, data = iris)
##
## Coefficients:
## (Intercept) Petal.Length Petal.Width
## versicolor -22.79944 6.92122 7.878496
## virginica -67.82521 12.64721 18.261016
##
## Std. Errors:
## (Intercept) Petal.Length Petal.Width
## versicolor 44.3859 37.58715 81.00888
## virginica 46.3939 37.65702 81.09482
##
## Residual Deviance: 20.57901
## AIC: 32.57901
Interpretasi Koefisien
z <- summary(model)$coefficients / summary(model)$standard.errors
p_values <- 2 * (1 - pnorm(abs(z)))
round(p_values, 4)
## (Intercept) Petal.Length Petal.Width
## versicolor 0.6075 0.8539 0.9225
## virginica 0.1438 0.7370 0.8218
Nilai p-value menunjukkan apakah variabel prediktor berpengaruh signifikan terhadap log odds dibanding baseline category.
Prediksi dan Visualisasi
iris$predicted <- predict(model, newdata = iris)
table(Predicted = iris$predicted, Actual = iris$Species)
## Actual
## Predicted setosa versicolor virginica
## setosa 50 0 0
## versicolor 0 47 3
## virginica 0 3 47
ggplot(iris, aes(x = Petal.Length, y = Petal.Width, color = predicted)) +
geom_point(size = 2) +
labs(title = "Multinomial Logistic Regression Predictions",
x = "Petal Length", y = "Petal Width") +
theme_minimal()
Kesimpulan Multinomial logistic regression efektif digunakan untuk klasifikasi kategori nominal. Model ini memberikan estimasi log-odds terhadap baseline dan prediksi kategori baru berdasarkan kombinasi prediktor.
Regresi logistik ordinal digunakan ketika variabel respon \(Y\) bersifat ordinal (memiliki urutan), misalnya tingkat kepuasan: Rendah, Sedang, Tinggi.
Model ini berbeda dengan:
Regresi logistik biner: hanya 2 kategori
Regresi logistik multinomial: kategori > 2 tetapi tidak berurutan
Model yang digunakan adalah Cumulative Logit Model dengan asumsi proportional odds:
\[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \alpha_j + \beta x \]
Untuk \(c\) kategori, terdapat \((c - 1)\) model logit kumulatif.
Koefisien \(\beta\) menjelaskan efek \(x\) terhadap kemungkinan berada pada kategori yang lebih rendah atau sama.
Jika \(\beta > 0\): semakin besar \(x\), semakin tinggi peluang berada di kategori rendah.
Jika \(\beta < 0\): semakin besar \(x\), semakin besar peluang berada di kategori tinggi.
Odds ratio: \[\text{OR} = e^{\beta}\]
Misal kita memiliki data fiktif tingkat kepuasan pelanggan (1: Tidak Puas, 2: Cukup, 3: Puas) terhadap kecepatan layanan:
set.seed(123)
n <- 200
speed <- round(runif(n, 1, 10))
satisfaction <- cut(5 + 0.5*speed + rnorm(n),
breaks = c(-Inf, 5.5, 7.5, Inf),
labels = c("Tidak Puas", "Cukup", "Puas"),
ordered_result = TRUE)
df <- data.frame(satisfaction, speed)
head(df)
## satisfaction speed
## 1 Cukup 4
## 2 Puas 8
## 3 Cukup 5
## 4 Puas 9
## 5 Puas 9
## 6 Tidak Puas 1
model_ord <- polr(satisfaction ~ speed, data = df, Hess = TRUE)
summary(model_ord)
## Call:
## polr(formula = satisfaction ~ speed, data = df, Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## speed 0.9096 0.1094 8.315
##
## Intercepts:
## Value Std. Error t value
## Tidak Puas|Cukup 1.3015 0.4377 2.9738
## Cukup|Puas 4.4734 0.5718 7.8232
##
## Residual Deviance: 237.2312
## AIC: 243.2312
(ctable <- coef(summary(model_ord)))
## Value Std. Error t value
## speed 0.9095585 0.1093925 8.314630
## Tidak Puas|Cukup 1.3015075 0.4376597 2.973789
## Cukup|Puas 4.4733938 0.5718127 7.823180
p <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
(ctable <- cbind(ctable, "p value" = round(p, 4)))
## Value Std. Error t value p value
## speed 0.9095585 0.1093925 8.314630 0.0000
## Tidak Puas|Cukup 1.3015075 0.4376597 2.973789 0.0029
## Cukup|Puas 4.4733938 0.5718127 7.823180 0.0000
newdata <- data.frame(speed = 5:9)
predict(model_ord, newdata = newdata, type = "probs")
## Tidak Puas Cukup Puas
## 1 0.037460604 0.4439482 0.5185912
## 2 0.015430723 0.2566765 0.7278928
## 3 0.006271788 0.1245723 0.8691559
## 4 0.002535158 0.0546231 0.9428417
## 5 0.001022461 0.0228089 0.9761686
Model cumulative logit mengasumsikan efek prediktor sama untuk setiap cutoff. Jika tidak, pertimbangkan model non-proportional odds seperti generalized ordinal model.
Selain cumulative logit, model ordinal lainnya:
Adjacent-category logit
Continuation-ratio (sequential) logit
Model tersebut dapat digunakan saat asumsi proportional odds tidak terpenuhi.
Regresi ordinal efektif untuk respon berurutan.
Model cumulative logit menginterpretasikan efek dalam bentuk log-odds kumulatif.
Implementasi di R dengan fungsi polr() dari package
MASS.
Jika diperlukan validasi lanjut, bisa digunakan uji devians atau likelihood ratio test.
Model regresi logistik ordinal yang paling umum digunakan adalah Cumulative Logit Model dengan asumsi Proportional Odds.
Asumsi ini dikenal juga sebagai asumsi paralelisme (parallel lines assumption).
Definisi Asumsi Paralelisme Asumsi paralelisme menyatakan bahwa koefisien regresi (\(\beta\)) sama untuk setiap kategori kumulatif dari variabel respon.
Bentuk umum model: \[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \alpha_j + \beta x \]
Untuk \(j = 1, \dots, c - 1\).
Hanya intercept (\(\alpha_j\)) yang berbeda-beda.
Koefisien \(\beta\) tetap sama untuk semua fungsi logit kumulatif.
Visualisasi Dalam asumsi paralelisme, kurva logit kumulatif dari tiap kategori terhadap prediktor akan memiliki kemiringan yang sama (paralel), hanya berbeda posisi (intercept).
Konsekuensi Pelanggaran Asumsi
Jika asumsi ini tidak terpenuhi:
Efek prediktor berbeda untuk setiap batas kategori.
Model cumulative logit tidak valid.
Perlu gunakan model alternatif:
Generalized Ordinal Logistic Regression
Partial Proportional Odds Model
Pengujian Asumsi Paralelisme
Untuk memeriksa validitas asumsi, dapat digunakan:
Likelihood Ratio Test antara model proportional dan non-proportional
Brant Test (paket brant di
R)
Contoh (dengan package brant):
library(MASS)
library(brant)
model <- polr(ordered_response ~ x1 + x2, data = dat, Hess = TRUE)
brant(model)
Jika p-value < 0.05 → asumsi tidak terpenuhi.
Kesimpulan
Asumsi paralelisme penting untuk validitas model cumulative logit.
Menyederhanakan interpretasi karena efek prediktor konstan.
Jika tidak terpenuhi, gunakan model ordinal alternatif.
Analisis data kategorik merupakan bagian penting dalam statistika terapan karena banyak fenomena di dunia nyata yang menghasilkan data dalam bentuk kategori, seperti jenis kelamin, status pekerjaan, tingkat pendidikan, preferensi konsumen, atau hasil diagnosis medis. Data kategori ini umumnya dianalisis menggunakan tabel kontingensi, model log-linier, dan model regresi logistik. Masing-masing pendekatan memiliki kekuatan dan kelemahan tergantung pada tujuan analisis dan struktur data.
Tabel kontingensi digunakan sebagai langkah awal eksplorasi untuk melihat hubungan antara dua atau lebih variabel kategorik. Misalnya, dalam studi tentang efek obat terhadap serangan jantung, tabel kontingensi dapat menyajikan jumlah pasien yang mengalami atau tidak mengalami serangan jantung, berdasarkan jenis obat yang dikonsumsi. Tabel ini membantu mengidentifikasi pola awal dan menghitung ukuran asosiasi seperti odds ratio, risk ratio, dan chi-square statistic untuk menguji independensi antar variabel.
Namun, ketika ingin membangun model statistik yang dapat mengendalikan efek dari banyak variabel dan interaksinya secara simultan, maka model log-linier menjadi sangat berguna. Model log-linier adalah bentuk khusus dari Generalized Linear Model (GLM) yang digunakan pada frekuensi sel dalam tabel kontingensi dan mengasumsikan distribusi Poisson. Tidak seperti regresi logistik, model log-linier tidak menetapkan variabel mana yang dependen dan mana yang independen, karena seluruh variabel diperlakukan secara simetris. Model ini lebih cocok ketika tujuan analisis adalah untuk memahami struktur asosiasi atau independensi antar variabel, bukan untuk prediksi.
Struktur model log-linier ditentukan berdasarkan efek utama dari masing-masing variabel serta interaksi di antara variabel-variabel tersebut. Misalnya, dalam tabel kontingensi tiga arah (misalnya: jenis kelamin, status merokok, dan penyakit paru), model log-linier dapat membedakan apakah interaksi dua variabel cukup menjelaskan data, ataukah diperlukan interaksi tiga arah untuk menangkap struktur asosiasinya. Penyesuaian model dapat dilakukan menggunakan metode likelihood ratio test untuk membandingkan model sederhana dengan model lebih kompleks.
Di sisi lain, regresi logistik adalah pendekatan paling umum ketika terdapat satu variabel kategorik yang secara eksplisit dianggap sebagai variabel dependen (misalnya, kejadian penyakit: ya/tidak), dan satu atau lebih variabel kategorik atau numerik sebagai prediktor. Model ini memodelkan logit dari probabilitas kejadian (yaitu log odds), dan sangat berguna dalam studi observasional dan eksperimental untuk menjelaskan atau memprediksi peluang suatu outcome. Regresi logistik juga memiliki ekstensi untuk outcome kategorik lebih dari dua kelas, seperti regresi logistik multinomial dan regresi logistik ordinal.
Dengan demikian, meskipun ketiganya beroperasi pada data kategorik, tabel kontingensi bersifat deskriptif, model log-linier bersifat eksploratif terhadap hubungan simetris, sedangkan regresi logistik bersifat prediktif terhadap outcome kategorik. Pemilihan metode tergantung pada apakah fokus utama analisis adalah deskripsi, eksplorasi struktur, atau prediksi hasil berdasarkan variabel penjelas. Kombinasi dari ketiganya sering digunakan dalam praktik untuk memperoleh pemahaman komprehensif dari data kategorik yang dianalisis.
Ringkasan Dalam analisis data kategorik, terdapat beberapa pendekatan statistik yang umum digunakan, antara lain:
Meskipun ketiganya dapat digunakan pada data kategorik, pendekatan dan interpretasinya sangat berbeda.”
Tabel Kontingensi
Tabel kontingensi menyajikan jumlah frekuensi dari kombinasi kategori antar variabel.
Contoh tabel 2x2:
table_data <- matrix(c(30, 20, 50, 70), nrow=2,
dimnames = list(Obat = c("Timolol", "Placebo"),
Serangan = c("Ya", "Tidak")))
table_data
## Serangan
## Obat Ya Tidak
## Timolol 30 50
## Placebo 20 70
Tabel kontingensi bersifat deskriptif dan tidak melibatkan pemodelan probabilitas.
Model Loglinear
Model loglinear memodelkan logaritma dari ekspektasi frekuensi sel dalam tabel kontingensi.
\[ \log(\mu_{ij}) = \mu + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
library(MASS)
loglm(~ Obat * Serangan, data = table_data)
## Call:
## loglm(formula = ~Obat * Serangan, data = table_data)
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0 0 1
## Pearson 0 0 1
Model Regresi Logistik
Model regresi logistik biner:
\[ \log\left(\frac{p}{1 - p}\right) = \beta_0 + \beta_1 x \]
Contoh:
data_glm <- data.frame(
Serangan = c(1, 0, 1, 0),
Obat = factor(c("Timolol", "Timolol", "Placebo", "Placebo")),
Frek = c(30, 20, 50, 70)
)
model_logit <- glm(Serangan ~ Obat, weights = Frek, family = binomial, data = data_glm)
summary(model_logit)
##
## Call:
## glm(formula = Serangan ~ Obat, family = binomial, data = data_glm,
## weights = Frek)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.3365 0.1852 -1.817 0.0692 .
## ObatTimolol 0.7419 0.3430 2.163 0.0305 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 235.08 on 3 degrees of freedom
## Residual deviance: 230.31 on 2 degrees of freedom
## AIC: 234.31
##
## Number of Fisher Scoring iterations: 4
Perbandingan Ketiga Pendekatan
| Aspek | Tabel Kontingensi | Model Loglinear | Regresi Logistik |
|---|---|---|---|
| Tujuan | Deskripsi frekuensi | Deteksi asosiasi | Prediksi probabilitas |
| Variabel dependen | Tidak ada | Tidak ada (simetris) | Ada (eksplisit) |
| Distribusi | Tidak diasumsikan | Poisson (frekuensi sel) | Binomial (probabilitas) |
| Bentuk Model | Tidak ada | GLM: log(mu) ~ efek | GLM: logit(p) ~ prediktor |
| Cocok untuk | Eksplorasi awal | Tabel > 2 variabel | Studi prediktif |
Tabel kontingensi menyajikan frekuensi dari kombinasi kategori antar dua atau lebih variabel. Misal:
# Contoh tabel 2x2
matrix(c(30, 20, 50, 70), nrow=2,
dimnames = list(Obat = c("Timolol", "Placebo"),
Serangan = c("Ya", "Tidak")))
## Serangan
## Obat Ya Tidak
## Timolol 30 50
## Placebo 20 70
Model log-linier untuk tabel I x J dapat dituliskan:
\[ \log(\mu_{ij}) = \mu + \lambda_i^T + \lambda_j^R + \lambda_{ij}^{TR} \]
Model saturated atau model penuh menyertakan seluruh efek utama dan interaksi:
Contoh formulasi untuk tabel 2x2:
# Data
library(MASS)
data <- matrix(c(35, 65, 45, 55), nrow=2, byrow=TRUE)
dimnames(data) <- list(Obat = c("Timolol", "Placebo"), Serangan = c("Ya", "Tidak"))
ftable(data)
## Serangan Ya Tidak
## Obat
## Timolol 35 65
## Placebo 45 55
Model saturated dapat dipasang dengan loglm dari package
{MASS}:
model_saturated <- loglm(~ Obat * Serangan, data = data)
summary(model_saturated)
## Formula:
## ~Obat * Serangan
## attr(,"variables")
## list(Obat, Serangan)
## attr(,"factors")
## Obat Serangan Obat:Serangan
## Obat 1 0 1
## Serangan 0 1 1
## attr(,"term.labels")
## [1] "Obat" "Serangan" "Obat:Serangan"
## 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 independen mengasumsikan bahwa tidak ada interaksi antara variabel:
\[ \log(\mu_{ij}) = \mu + \lambda_i^T + \lambda_j^R \]
Model ini menguji hipotesis bahwa variabel X dan Y saling independen.
model_indep <- loglm(~ Obat + Serangan, data = data)
summary(model_indep)
## Formula:
## ~Obat + Serangan
## attr(,"variables")
## list(Obat, Serangan)
## attr(,"factors")
## Obat Serangan
## Obat 1 0
## Serangan 0 1
## attr(,"term.labels")
## [1] "Obat" "Serangan"
## 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.087576 1 0.1485015
## Pearson 2.083333 1 0.1489147
Odds ratio untuk tabel 2x2:
\[ OR = \frac{n_{11}n_{22}}{n_{12}n_{21}} \]
Interpretasi nilai OR:
Dalam model saturated:
# Estimasi odds ratio dan log-odds
logOR <- log((data[1,1] * data[2,2]) / (data[1,2] * data[2,1]))
logOR
## [1] -0.4183685
Perbandingan antar model dilakukan dengan menggunakan statistik deviance (G²) atau likelihood ratio test.
anova(model_indep, model_saturated)
## LR tests for hierarchical log-linear models
##
## Model 1:
## ~Obat + Serangan
## Model 2:
## ~Obat * Serangan
##
## Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1 2.087576 1
## Model 2 0.000000 0 2.087576 1 0.1485
## Saturated 0.000000 0 0.000000 0 1.0000
Studi dari Agresti (2019) membahas hubungan antara kebahagiaan dan kepercayaan terhadap kehidupan akhirat.
data_survey <- matrix(c(32,190,
113,611,
51,326),
nrow = 3, byrow = TRUE,
dimnames = list(Kebahagiaan = c("Tidak", "Cukup", "Sangat"),
Surga = c("Tidak Percaya", "Percaya")))
ftable(data_survey)
## Surga Tidak Percaya Percaya
## Kebahagiaan
## Tidak 32 190
## Cukup 113 611
## Sangat 51 326
loglm(~ Kebahagiaan + Surga, data = data_survey)
## Call:
## loglm(formula = ~Kebahagiaan + Surga, data = data_survey)
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0.8911136 2 0.6404675
## Pearson 0.8836760 2 0.6428538
Model log-linear adalah model yang digunakan untuk menganalisis hubungan antara dua atau lebih variabel kategorik yang disajikan dalam tabel kontingensi. Model ini mengasumsikan bahwa logaritma dari nilai ekspektasi frekuensi sel (\(\mu_{ij}\)) dapat dinyatakan sebagai penjumlahan efek variabel dan (bila perlu) interaksinya. Untuk tabel 2x2:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
Model log-linear digunakan untuk memodelkan frekuensi (count) pada tabel kontingensi dan menguji asosiasi antar variabel kategorik, tanpa menganggap ada variabel respon dan prediktor.
Model regresi logistik digunakan untuk memodelkan probabilitas kejadian suatu outcome (biner) berdasarkan satu atau lebih prediktor (bisa kategorik maupun kontinu).
Diberikan data:
| Merokok | Sakit | Sehat |
|---|---|---|
| Ya | 30 | 20 |
| Tidak | 10 | 40 |
Model log-linear pada tabel 2x2:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
dengan constraint sum-to-zero: \[ \sum_i \lambda_i^A = 0,\quad \sum_j \lambda_j^B = 0,\quad \sum_{i,j} \lambda_{ij}^{AB} = 0 \]
Misalkan:
A1 = Merokok (Ya), A2 = Tidak
B1 = Sakit, B2 = Sehat
Observasi:
\(n_{11} = 30\), \(n_{12} = 20\)
\(n_{21} = 10\), \(n_{22} = 40\)
\[\begin{align*} \log(\mu_{11}) &= \lambda + \lambda_1^A + \lambda_1^B + \lambda_{11}^{AB} \\ \log(\mu_{12}) &= \lambda + \lambda_1^A + \lambda_2^B + \lambda_{12}^{AB} \\ \log(\mu_{21}) &= \lambda + \lambda_2^A + \lambda_1^B + \lambda_{21}^{AB} \\ \log(\mu_{22}) &= \lambda + \lambda_2^A + \lambda_2^B + \lambda_{22}^{AB} \end{align*}\]
Constraint sum-to-zero:
\(\lambda_1^A + \lambda_2^A = 0\)
\(\lambda_1^B + \lambda_2^B = 0\)
\(\lambda_{11}^{AB} + \lambda_{12}^{AB} +
\lambda_{21}^{AB} + \lambda_{22}^{AB} = 0\)
Langkah-langkah:
\[\begin{align*} \lambda &= \frac{1}{4} \sum_{i=1}^{2} \sum_{j=1}^{2} \log(n_{ij}) \\ &= \frac{1}{4} [\log(30) + \log(20) + \log(10) + \log(40)] \\ &= 3.0971 \end{align*}\]
\[\begin{align*} \lambda_1^A &= \frac{1}{2} \left[ (\log(30) + \log(20)) - (\log(10) + \log(40)) \right] / 2 \\ &= \frac{1}{2} \left[(3.4012 + 2.9957) - (2.3026 + 3.6889)\right] \\ &= \frac{1}{2} (6.3969 - 5.9915) \\ &= \frac{1}{2}(0.4054) \\ &= 0.2027 \\ \lambda_2^A &= -0.2027 \end{align*}\]
\[\begin{align*} \lambda_1^B &= \frac{1}{2} \left[ (\log(30) + \log(10)) - (\log(20) + \log(40)) \right] \\ &= \frac{1}{2} \left[(3.4012 + 2.3026) - (2.9957 + 3.6889)\right] \\ &= \frac{1}{2} (5.7038 - 6.6846) \\ &= \frac{1}{2}(-0.9808) \\ &= -0.4904 \\ \lambda_2^B &= +0.4904 \end{align*}\]
\[\begin{align*} \lambda_{11}^{AB} &= \frac{1}{4} \left[ \log(30) - \log(20) - \log(10) + \log(40) \right] \\ &= \frac{1}{4} \left[ 3.4012 - 2.9957 - 2.3026 + 3.6889 \right] \\ &= \frac{1}{4} (3.4012 - 2.9957 - 2.3026 + 3.6889) \\ &= \frac{1}{4} (1.7918) \\ &= 0.4479 \\ \lambda_{12}^{AB} &= -\lambda_{11}^{AB} = -0.4479 \\ \lambda_{21}^{AB} &= -0.4479 \\ \lambda_{22}^{AB} &= +0.4479 \end{align*}\]
Ringkasan parameter:
\(\lambda = 3.0971\)
\(\lambda_1^A = 0.2027, \quad \lambda_2^A = -0.2027\)
\(\lambda_1^B = -0.4904, \quad \lambda_2^B = 0.4904\)
\(\lambda_{11}^{AB} = 0.4479, \lambda_{12}^{AB} = -0.4479, \lambda_{21}^{AB} = -0.4479, \lambda_{22}^{AB} = 0.4479\)
\[ \text{OR} = \frac{n_{11} n_{22}}{n_{12} n_{21}} = \frac{30 \times 40}{20 \times 10} = \frac{1200}{200} = 6 \]
Log odds ratio: \[ \log(\text{OR}) = \log(6) = 1.7918 \]
Standard error (SE): \[ SE = \sqrt{\frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}}} = \sqrt{\frac{1}{30} + \frac{1}{20} + \frac{1}{10} + \frac{1}{40}} = \sqrt{0.0333 + 0.05 + 0.1 + 0.025} = \sqrt{0.2083} = 0.4564 \]
95% Confidence Interval for log(OR):
\[ \log(OR) \pm 1.96 \times SE = 1.7918 \pm 1.96 \times 0.4564 \\ = (1.7918 - 0.895),\ (1.7918 + 0.895) \\ = (0.8968, 2.6868) \]
Back-transform to get CI for OR:
\[ \text{Lower} = \exp(0.8968) = 2.452 \\ \text{Upper} = \exp(2.6868) = 14.68 \]
Jadi, OR = 6 (95% CI: 2.45 – 14.68)
# Data 2x2
tabel <- matrix(c(30, 20, 10, 40), nrow = 2, byrow = TRUE)
colnames(tabel) <- c("Sakit", "Sehat")
rownames(tabel) <- c("Ya", "Tidak")
tabel
## Sakit Sehat
## Ya 30 20
## Tidak 10 40
data <- as.data.frame(as.table(tabel))
colnames(data) <- c("Merokok", "Status", "Freq")
data
## Merokok Status Freq
## 1 Ya Sakit 30
## 2 Tidak Sakit 10
## 3 Ya Sehat 20
## 4 Tidak Sehat 40
# Model tanpa interaksi
fit_no_inter <- glm(Freq ~ Merokok + Status, family = poisson, data = data)
summary(fit_no_inter)
##
## Call:
## glm(formula = Freq ~ Merokok + Status, family = poisson, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.996e+00 1.871e-01 16.013 <2e-16 ***
## MerokokTidak 3.892e-10 2.000e-01 0.000 1.000
## StatusSehat 4.055e-01 2.041e-01 1.986 0.047 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 21.288 on 3 degrees of freedom
## Residual deviance: 17.261 on 1 degrees of freedom
## AIC: 43.036
##
## Number of Fisher Scoring iterations: 4
# Model dengan interaksi
fit_inter <- glm(Freq ~ Merokok * Status, family = poisson, data = data)
summary(fit_inter)
##
## Call:
## glm(formula = Freq ~ Merokok * Status, family = poisson, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.4012 0.1826 18.629 < 2e-16 ***
## MerokokTidak -1.0986 0.3651 -3.009 0.00262 **
## StatusSehat -0.4055 0.2887 -1.405 0.16015
## MerokokTidak:StatusSehat 1.7918 0.4564 3.926 8.65e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2.1288e+01 on 3 degrees of freedom
## Residual deviance: -8.8818e-16 on 0 degrees of freedom
## AIC: 27.775
##
## Number of Fisher Scoring iterations: 3
Parameter utama (intercept) menunjukkan rata-rata log frekuensi sel.
Efek “Merokok” dan “Status” menunjukkan perbedaan log frekuensi antar kategori.
Interaksi signifikan menunjukkan adanya asosiasi antara Merokok dan Status.
Nilai log(6) =1.79 itu sama dengan efek interaksi ouput R
Suatu survei dilakukan untuk mengetahui hubungan antara Jenis Kelamin (Laki-laki/Perempuan) dan Kategori BMI (Kurus/Normal/Gemuk):
| Kurus | Normal | Gemuk | |
|---|---|---|---|
| Laki-laki | 12 | 20 | 8 |
| Perempuan | 18 | 24 | 10 |
Bentuk umum model log-linear untuk tabel 2x3 (dengan sum-to-zero constraint):
\[ \log(\mu_{ij}) = \lambda + \lambda_i^{A} + \lambda_j^{B} + \lambda_{ij}^{AB} \]
dengan:
\(\mu_{ij}\): ekspektasi frekuensi pada baris ke-\(i\), kolom ke-\(j\)
\(A\): Jenis Kelamin (\(i=1:\) Laki-laki, \(i=2:\) Perempuan)
\(B\): Kategori BMI (\(j=1:\) Kurus, \(j=2:\) Normal, \(j=3:\) Gemuk)
Constraint: \(\sum_i \lambda_i^A = 0\), \(\sum_j \lambda_j^B = 0\), \(\sum_i \lambda_{ij}^{AB} = 0\) dan \(\sum_j \lambda_{ij}^{AB} = 0\)
Secara eksplisit:
\[\begin{align*} \log(\mu_{ij}) =\ & \lambda \\ & + \lambda_1^A \text{ (Laki-laki)},\ \lambda_2^A \text{ (Perempuan)} \\ & + \lambda_1^B \text{ (Kurus)},\ \lambda_2^B \text{ (Normal)},\ \lambda_3^B \text{ (Gemuk)} \\ & + \lambda_{ij}^{AB} \text{ (interaksi jika ada)} \end{align*}\]
# Membuat data frame dari tabel
tabel2x3 <- matrix(c(12, 20, 8, 18, 24, 10), nrow = 2, byrow = TRUE)
colnames(tabel2x3) <- c("Kurus", "Normal", "Gemuk")
rownames(tabel2x3) <- c("Laki-laki", "Perempuan")
tabel2x3
## Kurus Normal Gemuk
## Laki-laki 12 20 8
## Perempuan 18 24 10
# Ubah menjadi data.frame untuk glm
data2x3 <- as.data.frame(as.table(tabel2x3))
colnames(data2x3) <- c("JenisKelamin", "BMI", "Freq")
data2x3
## JenisKelamin BMI Freq
## 1 Laki-laki Kurus 12
## 2 Perempuan Kurus 18
## 3 Laki-laki Normal 20
## 4 Perempuan Normal 24
## 5 Laki-laki Gemuk 8
## 6 Perempuan Gemuk 10
# Model log-linear tanpa interaksi (asumsi independen)
fit_no_inter <- glm(Freq ~ JenisKelamin + BMI, family = poisson, data = data2x3)
summary(fit_no_inter)
##
## Call:
## glm(formula = Freq ~ JenisKelamin + BMI, family = poisson, data = data2x3)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.5683 0.2179 11.789 <2e-16 ***
## JenisKelaminPerempuan 0.2624 0.2103 1.248 0.2122
## BMINormal 0.3830 0.2368 1.618 0.1058
## BMIGemuk -0.5108 0.2981 -1.713 0.0866 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 13.06443 on 5 degrees of freedom
## Residual deviance: 0.22527 on 2 degrees of freedom
## AIC: 35.26
##
## Number of Fisher Scoring iterations: 3
# Model log-linear dengan interaksi (untuk cek asosiasi)
fit_inter <- glm(Freq ~ JenisKelamin * BMI, family = poisson, data = data2x3)
summary(fit_inter)
##
## Call:
## glm(formula = Freq ~ JenisKelamin * BMI, family = poisson, data = data2x3)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.4849 0.2887 8.608 <2e-16 ***
## JenisKelaminPerempuan 0.4055 0.3727 1.088 0.277
## BMINormal 0.5108 0.3651 1.399 0.162
## BMIGemuk -0.4055 0.4564 -0.888 0.374
## JenisKelaminPerempuan:BMINormal -0.2231 0.4802 -0.465 0.642
## JenisKelaminPerempuan:BMIGemuk -0.1823 0.6032 -0.302 0.762
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1.3064e+01 on 5 degrees of freedom
## Residual deviance: 2.6645e-15 on 0 degrees of freedom
## AIC: 39.034
##
## Number of Fisher Scoring iterations: 3
Model tanpa interaksi: - Jika deviance tidak signifikan, maka Jenis Kelamin dan BMI independen.
Intercept: log frekuensi pada kategori referensi (Laki-laki, Kurus)
Koefisien JenisKelaminPerempuan: perbedaan log-frekuensi antara Perempuan vs Laki-laki (pada Kurus)
Koefisien BMI: perbedaan log-frekuensi kategori BMI (Normal/Gemuk) terhadap Kurus (pada Laki-laki)
Model dengan interaksi:
Contoh interpretasi hasil (misal):
Jika koefisien JenisKelaminPerempuan negatif: proporsi Perempuan pada kategori referensi lebih kecil dibanding Laki-laki.
Jika koefisien BMI_Normal positif: kemungkinan seseorang Normal lebih tinggi daripada Kurus (pada Laki-laki).
Jika model interaksi signifikan, pola distribusi BMI berbeda antara Laki-laki dan Perempuan.
Pada pembahasan sebelumnya, kita telah memahami bahwa salah satu tujuan utama dari penyusunan model log linear adalah untuk mengestimasi parameter-parameter yang menjelaskan hubungan di antara variabel-variabel kategorik.
Pada materi kali ini, kita akan membahas model log linear yang lebih kompleks, yaitu model log linear untuk tabel kontingensi tiga arah. Model ini melibatkan tiga variabel kategorik, sehingga kemungkinan interaksi yang dapat terjadi di dalam model pun menjadi lebih banyak. Dalam konteks ini, interaksi paling tinggi yang dapat dimodelkan adalah interaksi tiga arah, yaitu interaksi yang melibatkan ketiga variabel secara bersamaan.
Model log-linear yang melibatkan tiga variabel kategorik (misal: X, Y, dan Z) dapat dibangun dalam berbagai bentuk model, tergantung pada tingkat interaksi yang ingin dimasukkan. Berikut adalah beberapa alternatif model log-linear yang umum digunakan:
Model Saturated
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} + \lambda^{XYZ}_{ijk} \] Model ini memuat semua kemungkinan interaksi, termasuk interaksi tiga arah (X, Y, dan Z).
Model Homogen
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \] Model ini hanya mengakomodasi interaksi dua arah antar variabel tanpa memasukkan interaksi tiga arah.
Model Conditional
Model Joint Independence
Model Tanpa Interaksi
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k \] Model ini hanya memasukkan efek utama tanpa interaksi antar variabel.
Dalam analisis model log-linear tiga arah, pengujian interaksi dilakukan untuk mengetahui ada atau tidaknya interaksi antar variabel. Pengujian ini dilakukan secara bertahap, dimulai dari tingkat interaksi tertinggi ke yang lebih rendah. Untuk model log-linear dengan tiga peubah (X, Y, dan Z), tahapan pengujian meliputi:
Pengujian Interaksi Tiga Arah (XYZ):
Pengujian Interaksi Dua Arah (XY, XZ, YZ):
Bandingkan model homogenous dengan model conditional.
Bandingkan model conditional dengan model joint independence.
Bandingkan model joint independence dengan model tanpa interaksi.
Setiap tahapan pengujian dilakukan untuk menilai kecocokan model dan menentukan struktur interaksi mana yang paling sesuai dengan data yang diamati.
Gunakan Program R untuk menyelesaikan soal berikut:
Tabel berikut menyajikan data dari survei General Social Survey (GSS) tahun 1994 mengenai jenis kelamin responden, tingkat fundamentalisme, dan sikap terhadap hukuman mati untuk kasus pembunuhan. Susun dan interpretasikan model log-linear paling sederhana (paling parsimonious) untuk data ini. Jelaskan proses yang Anda lakukan dalam menentukan model terbaik serta asosiasi apa saja yang teridentifikasi. Tunjukkan juga bagaimana nilai yang diprediksi dari model menggambarkan asosiasi tersebut.
| Fundamentalisme | Jenis Kelamin | Mendukung | Menolak | Total |
|---|---|---|---|---|
| Fundamentalist | Laki-laki | 128 | 32 | 160 |
| Fundamentalist | Perempuan | 123 | 73 | 196 |
| Fundamentalist | Total | 251 | 105 | 356 |
| Moderate | Laki-laki | 182 | 56 | 238 |
| Moderate | Perempuan | 168 | 105 | 273 |
| Moderate | Total | 350 | 161 | 511 |
| Liberal | Laki-laki | 119 | 49 | 168 |
| Liberal | Perempuan | 111 | 70 | 181 |
| Liberal | Total | 230 | 119 | 349 |
Keterangan:
Fundamentalisme: Fundamentalist, Moderate, Liberal
Jenis Kelamin: Laki-laki, Perempuan
Sikap: Mendukung (Favor), Menolak (Oppose) hukuman mati
library("epitools")
library("DescTools")
library("lawstat")
Input Data
# Input data sesuai tabel praktikum
z.fund <- factor(rep(c("1fund", "2mod", "3lib"), each = 4))
x.sex <- factor(rep(c("1M", "2F"), each = 2, times = 3))
y.fav <- factor(rep(c("1fav", "2opp"), times = 6))
counts <- c(128, 32, 123, 73, 182, 56, 168, 105, 119, 49, 111, 70)
data <- data.frame(
Fundamentalisme = z.fund,
Jenis_Kelamin = x.sex,
Sikap = y.fav,
Frekuensi = counts
)
data
## Fundamentalisme Jenis_Kelamin Sikap Frekuensi
## 1 1fund 1M 1fav 128
## 2 1fund 1M 2opp 32
## 3 1fund 2F 1fav 123
## 4 1fund 2F 2opp 73
## 5 2mod 1M 1fav 182
## 6 2mod 1M 2opp 56
## 7 2mod 2F 1fav 168
## 8 2mod 2F 2opp 105
## 9 3lib 1M 1fav 119
## 10 3lib 1M 2opp 49
## 11 3lib 2F 1fav 111
## 12 3lib 2F 2opp 70
Membentuk Tabel Kontingensi 3 Arah
table3d <- xtabs(Frekuensi ~ Fundamentalisme + Jenis_Kelamin + Sikap, data = data)
ftable(table3d)
## Sikap 1fav 2opp
## Fundamentalisme Jenis_Kelamin
## 1fund 1M 128 32
## 2F 123 73
## 2mod 1M 182 56
## 2F 168 105
## 3lib 1M 119 49
## 2F 111 70
Analisis Log-Linear: Tahap Pemodelan Kita akan memodelkan tabel ini menggunakan beberapa model log-linear dan membandingkan kecocokan model (parsimonious model):
##=============================##
# Penentuan kategori reference
##=============================##
x.sex <- relevel(x.sex, ref = "2F")
y.fav <- relevel(y.fav, ref = "2opp")
z.fund <- relevel(z.fund, ref = "3lib")
Model Saturated Model log-linear saturated memasukkan semua interaksi hingga tiga arah:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} + \lambda^{XYZ}_{ijk} \]
# Model saturated
model_saturated <- glm(counts ~ x.sex + y.fav + z.fund +
x.sex*y.fav + x.sex*z.fund + y.fav*z.fund +
x.sex*y.fav*z.fund,
family = poisson(link = "log"))
summary(model_saturated)
##
## Call:
## glm(formula = counts ~ x.sex + y.fav + z.fund + x.sex * y.fav +
## x.sex * z.fund + y.fav * z.fund + x.sex * y.fav * z.fund,
## family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.248495 0.119523 35.545 < 2e-16 ***
## x.sex1M -0.356675 0.186263 -1.915 0.05551 .
## y.fav1fav 0.461035 0.152626 3.021 0.00252 **
## z.fund1fund 0.041964 0.167285 0.251 0.80193
## z.fund2mod 0.405465 0.154303 2.628 0.00860 **
## x.sex1M:y.fav1fav 0.426268 0.228268 1.867 0.06185 .
## x.sex1M:z.fund1fund -0.468049 0.282210 -1.659 0.09721 .
## x.sex1M:z.fund2mod -0.271934 0.249148 -1.091 0.27507
## y.fav1fav:z.fund1fund 0.060690 0.212423 0.286 0.77511
## y.fav1fav:z.fund2mod 0.008969 0.196903 0.046 0.96367
## x.sex1M:y.fav1fav:z.fund1fund 0.438301 0.336151 1.304 0.19227
## x.sex1M:y.fav1fav:z.fund2mod 0.282383 0.301553 0.936 0.34905
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2.4536e+02 on 11 degrees of freedom
## Residual deviance: -9.6367e-14 on 0 degrees of freedom
## AIC: 100.14
##
## Number of Fisher Scoring iterations: 3
exp(model_saturated$coefficients)
## (Intercept) x.sex1M
## 70.0000000 0.7000000
## y.fav1fav z.fund1fund
## 1.5857143 1.0428571
## z.fund2mod x.sex1M:y.fav1fav
## 1.5000000 1.5315315
## x.sex1M:z.fund1fund x.sex1M:z.fund2mod
## 0.6262231 0.7619048
## y.fav1fav:z.fund1fund y.fav1fav:z.fund2mod
## 1.0625694 1.0090090
## x.sex1M:y.fav1fav:z.fund1fund x.sex1M:y.fav1fav:z.fund2mod
## 1.5500717 1.3262868
Interpretasi Output Model Saturated ## Interpretasi Hasil Model Saturated
Model yang digunakan adalah model log-linear saturated dengan semua efek utama, interaksi dua arah, dan interaksi tiga arah. Model ini memodelkan hubungan antara jenis kelamin (x.sex), sikap terhadap hukuman mati (y.fav), dan tingkat fundamentalisme (z.fund) terhadap frekuensi responden.
| Parameter | Estimate | Std. Error | z value | Pr(> | z |
|---|---|---|---|---|---|
| (Intercept) | 4.25 | 0.12 | 35.55 | <2e-16*** | 70.00 |
| x.sex1M | -0.36 | 0.19 | -1.92 | 0.055 . | 0.70 |
| y.fav1fav | 0.46 | 0.15 | 3.02 | 0.0025 ** | 1.59 |
| z.fund1fund | 0.04 | 0.17 | 0.25 | 0.80 | 1.04 |
| z.fund2mod | 0.41 | 0.15 | 2.63 | 0.0086 ** | 1.50 |
| x.sex1M:y.fav1fav | 0.43 | 0.23 | 1.87 | 0.062 . | 1.53 |
| x.sex1M:z.fund1fund | -0.47 | 0.28 | -1.66 | 0.097 . | 0.63 |
| x.sex1M:z.fund2mod | -0.27 | 0.25 | -1.09 | 0.28 | 0.76 |
| y.fav1fav:z.fund1fund | 0.06 | 0.21 | 0.29 | 0.78 | 1.06 |
| y.fav1fav:z.fund2mod | 0.01 | 0.20 | 0.05 | 0.96 | 1.01 |
| x.sex1M:y.fav1fav:z.fund1fund | 0.44 | 0.34 | 1.30 | 0.19 | 1.55 |
| x.sex1M:y.fav1fav:z.fund2mod | 0.28 | 0.30 | 0.94 | 0.35 | 1.33 |
(Intercept): Rata-rata log jumlah kasus untuk kategori referensi (Perempuan, Menolak hukuman mati, Liberal) adalah 4.25 (atau \(\mu \approx 70\)).
x.sex1M: Laki-laki memiliki expected count sekitar 0.7 kali Perempuan dalam kategori referensi lainnya, namun hanya mendekati signifikansi (p = 0.055).
y.fav1fav: Mereka yang mendukung hukuman mati memiliki expected count sekitar 1.59 kali lipat dibanding yang menolak (signifikan, p = 0.0025).
z.fund1fund: Kelompok Fundamentalist tidak berbeda nyata dari Liberal (\(\exp(0.04) \approx 1.04\); p = 0.80).
z.fund2mod: Kelompok Moderate memiliki expected count 1.5 kali lebih besar dibanding Liberal (signifikan, p = 0.0086).
Interaksi dua & tiga arah: Sebagian besar tidak signifikan (p > 0.05), artinya tidak ada bukti kuat adanya efek gabungan antar variabel.
Model saturated ini sangat fit dengan data, namun tidak semua parameter/interaksi signifikan.
Efek utama yang paling signifikan adalah:
Sikap mendukung hukuman mati (expected count 1.6x lebih tinggi dari yang menolak)
Kelompok Moderate (expected count 1.5x lebih tinggi dari Liberal)
Tidak ditemukan bukti kuat interaksi dua atau tiga arah yang signifikan.
Model yang lebih sederhana (tanpa interaksi tiga arah) perlu dipertimbangkan untuk model final yang lebih parsimonious.
Catatan interpretasi:
Nilai exp(coef) menyatakan rasio
ekspektasi (expected count ratio) dibandingkan
baseline.
Efek positif → menaikkan expected count; Efek negatif → menurunkan expected count.
Koefisien signifikan pada p-value < 0.05.
Model log-linear homogenous memasukkan semua efek utama dan semua interaksi dua arah, tanpa interaksi tiga arah. Secara matematis, model ini dapat dituliskan sebagai berikut:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
# Homogenous Model
model_homogenous <- glm(counts ~ x.sex + y.fav + z.fund +
x.sex*y.fav + x.sex*z.fund + y.fav*z.fund,
family = poisson(link = "log"))
summary(model_homogenous)
##
## Call:
## glm(formula = counts ~ x.sex + y.fav + z.fund + x.sex * y.fav +
## x.sex * z.fund + y.fav * z.fund, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.31096 0.10522 40.972 < 2e-16 ***
## x.sex1M -0.51575 0.13814 -3.733 0.000189 ***
## y.fav1fav 0.35707 0.12658 2.821 0.004788 **
## z.fund1fund -0.06762 0.14452 -0.468 0.639854
## z.fund2mod 0.33196 0.13142 2.526 0.011540 *
## x.sex1M:y.fav1fav 0.66406 0.12728 5.217 1.81e-07 ***
## x.sex1M:z.fund1fund -0.16201 0.15300 -1.059 0.289649
## x.sex1M:z.fund2mod -0.08146 0.14079 -0.579 0.562887
## y.fav1fav:z.fund1fund 0.23873 0.16402 1.455 0.145551
## y.fav1fav:z.fund2mod 0.13081 0.14951 0.875 0.381614
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.361 on 11 degrees of freedom
## Residual deviance: 1.798 on 2 degrees of freedom
## AIC: 97.934
##
## Number of Fisher Scoring iterations: 3
Pengujian ini menggunakan residual deviance dari kedua model (saturated dan homogenous).
H0: Tidak ada interaksi tiga arah (model homogenous sudah cukup)
H1: Ada interaksi tiga arah (model saturated diperlukan)
# Deviance antar model
Deviance.model <- model_homogenous$deviance - model_saturated$deviance
Deviance.model
## [1] 1.797977
# Derajat bebas = db model homogenous - db model saturated
derajat.bebas <- (model_homogenous$df.residual - model_saturated$df.residual)
derajat.bebas
## [1] 2
chi.tabel <- qchisq(1 - 0.05, df = derajat.bebas)
chi.tabel
## [1] 5.991465
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima H0", "Tolak H0")
Keputusan
## [1] "Terima H0"
Interpretasi Pada taraf nyata 5%, belum cukup bukti untuk menolak H0 atau dapat dikatakan bahwa tidak ada interaksi tiga arah antara jenis kelamin, fundamentalisme, dan pendapat mengenai hukuman mati.
Catatan:
Model pengurang adalah model yang lebih lengkap (lebih banyak parameter, df lebih kecil), yaitu model saturated.
Derajat bebas dihitung dari selisih derajat bebas model homogenous dan saturated.
Keputusan berdasarkan perbandingan deviance model dengan chi-square tabel.
Rangkuman
Pengujian Ada Tidaknya Interaksi Tiga Arah (Saturated Model vs Homogenous Model)
Hipotesis
\(H_0\): \(\lambda_{ijk}^{XYZ} = 0\) (Tidak ada interaksi tiga arah; model yang terbentuk adalah model homogenous)
\(H_1\): \(\lambda_{ijk}^{XYZ} \neq 0\) (Ada interaksi tiga arah; model yang terbentuk adalah model saturated)
Tingkat Signifikansi
Statistik Uji
\(\Delta \text{Deviance} = \text{Deviance model homogenous} - \text{Deviance model saturated}\)
\(= 1.798 - 0.00 = 1.798\)
\(db = db\ \text{model homogenous} - db\ \text{model saturated} = 2 - 0 = 2\)
Daerah Penolakan
Keputusan
Interpretasi
Catatan Perhitungan Derajat Bebas dan Selisih Deviance
Ingat, dalam membuat selisih deviance, model yang menjadi pengurang adalah model yang lebih lengkap (parameter yang lebih banyak atau derajat bebasnya lebih kecil).
Makin banyak parameter, makin kecil derajat bebasnya, karena:
Cek di output R ada berapa banyak coefficients-nya (termasuk intercept) untuk menghitung derajat bebas yang benar.
Model log-linear conditional pada X memasukkan efek utama dan interaksi dua arah antara X dengan Y dan X dengan Z, tanpa interaksi antara Y dengan Z maupun interaksi tiga arah.
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} \]
# Conditional Association on X
model_conditional_X <- glm(counts ~ x.sex + y.fav + z.fund +
x.sex*y.fav + x.sex*z.fund,
family = poisson(link = "log"))
summary(model_conditional_X)
##
## Call:
## glm(formula = counts ~ x.sex + y.fav + z.fund + x.sex * y.fav +
## x.sex * z.fund, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.23495 0.08955 47.293 < 2e-16 ***
## x.sex1M -0.52960 0.13966 -3.792 0.000149 ***
## y.fav1fav 0.48302 0.08075 5.982 2.20e-09 ***
## z.fund1fund 0.07962 0.10309 0.772 0.439916
## z.fund2mod 0.41097 0.09585 4.288 1.81e-05 ***
## x.sex1M:y.fav1fav 0.65845 0.12708 5.181 2.20e-07 ***
## x.sex1M:z.fund1fund -0.12841 0.15109 -0.850 0.395405
## x.sex1M:z.fund2mod -0.06267 0.13908 -0.451 0.652274
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.3612 on 11 degrees of freedom
## Residual deviance: 3.9303 on 4 degrees of freedom
## AIC: 96.067
##
## Number of Fisher Scoring iterations: 4
# Pengujian hipotesis
# Deviance of Model
Deviance.model <- model_conditional_X$deviance - model_homogenous$deviance # model_conditional_X: conditional on X, model_homogenous: homogenous
Deviance.model
## [1] 2.132302
Langkah-langkah uji hipotesis menggunakan residual deviance:
# Selisih deviance antar model
Deviance.model <- model_conditional_X$deviance - model_homogenous$deviance
Deviance.model
## [1] 2.132302
Hitung Derajat Bebas
# Chi Square tabel dengan alpha = 0.05
derajat.bebas <- (4 - 2)
derajat.bebas
## [1] 2
Nilai Chi-Square Tabel
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 5.991465
Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Terima"
Interpretasi Karena nilai Deviance.model = 2.13 lebih kecil dari nilai kritis chi-square tabel = 5.99 (dengan df = 2, alpha = 0.05), maka keputusan uji adalah “Terima”.
Pada taraf nyata 5%, belum cukup bukti untuk menolak H0, atau dengan kata lain tidak ada interaksi antara pendapat mengenai hukuman mati (Y) dan fundamentalisme (Z). Model yang terbentuk cukup hanya sampai dua interaksi dengan X (conditional on X), sehingga interaksi Y*Z tidak signifikan secara statistik.
Model log-linear conditional pada Y memasukkan efek utama dan interaksi dua arah antara X dengan Y dan Y dengan Z, tanpa interaksi antara X dengan Z maupun interaksi tiga arah.
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{YZ}_{jk} \]
# Conditional Association on Y
model_conditional_Y <- glm(counts ~ x.sex + y.fav + z.fund +
x.sex*y.fav + y.fav*z.fund,
family = poisson(link = "log"))
summary(model_conditional_Y)
##
## Call:
## glm(formula = counts ~ x.sex + y.fav + z.fund + x.sex * y.fav +
## y.fav * z.fund, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.33931 0.09919 43.748 < 2e-16 ***
## x.sex1M -0.59345 0.10645 -5.575 2.48e-08 ***
## y.fav1fav 0.37259 0.12438 2.996 0.00274 **
## z.fund1fund -0.12516 0.13389 -0.935 0.34989
## z.fund2mod 0.30228 0.12089 2.500 0.01240 *
## x.sex1M:y.fav1fav 0.65845 0.12708 5.181 2.20e-07 ***
## y.fav1fav:z.fund1fund 0.21254 0.16205 1.312 0.18966
## y.fav1fav:z.fund2mod 0.11757 0.14771 0.796 0.42606
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.3612 on 11 degrees of freedom
## Residual deviance: 2.9203 on 4 degrees of freedom
## AIC: 95.057
##
## Number of Fisher Scoring iterations: 4
Hipotesis
\(H_0: \lambda_{ik}^{XZ} = 0\) (Tidak ada interaksi antara jenis kelamin (X) dan fundamentalisme (Z))
\(H_1: \lambda_{ik}^{XZ} \neq 0\) (Ada interaksi antara jenis kelamin (X) dan fundamentalisme (Z))
Tingkat Signifikansi
Statistik Uji
\(\Delta \text{Deviance} = \text{Deviance model conditional on Y} - \text{Deviance model homogenous}\)
\(= 2.9203 - 1.798 = 1.1223\)
\(db = db \text{ model conditional on Y} - db \text{ model homogenous}\)
\(= 4 - 2 = 2\)
Daerah Penolakan
Keputusan
Kesimpulan
# Deviance of Model
Deviance.model <- model_conditional_Y$deviance - model_homogenous$deviance # model_conditional_Y: conditional on Y, model_homogenous: homogenous
Deviance.model
## [1] 1.122315
Hitung Derajat Bebas
derajat.bebas <- (4 - 2)
derajat.bebas
## [1] 2
Nilai Chi-Square Tabel
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 5.991465
Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Terima"
Interpretasi Karena nilai Deviance.model = 1.12 lebih kecil dari nilai kritis chi-square tabel = 5.99 (df = 2, alpha = 0.05), maka keputusan uji adalah “Terima”.
Kesimpulan: Pada taraf nyata 5%, belum cukup bukti untuk menolak \(H_0\). Artinya, tidak ada interaksi antara jenis kelamin (X) dan fundamentalisme (Z) yang signifikan secara statistik. Model tanpa parameter \(\lambda_{ik}^{XZ}\) sudah cukup baik untuk data ini.
Model log-linear conditional pada Z memasukkan efek utama dan interaksi dua arah antara X dengan Z dan Y dengan Z, tanpa interaksi antara X dengan Y maupun interaksi tiga arah.
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
# Conditional Association on Z
model_conditional_Z <- glm(counts ~ x.sex + y.fav + z.fund +
x.sex*z.fund + y.fav*z.fund,
family = poisson(link = "log"))
summary(model_conditional_Z)
##
## Call:
## glm(formula = counts ~ x.sex + y.fav + z.fund + x.sex * z.fund +
## y.fav * z.fund, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.12255 0.10518 39.195 < 2e-16 ***
## x.sex1M -0.07453 0.10713 -0.696 0.487
## y.fav1fav 0.65896 0.11292 5.836 5.36e-09 ***
## z.fund1fund -0.06540 0.15126 -0.432 0.665
## z.fund2mod 0.33196 0.13777 2.410 0.016 *
## x.sex1M:z.fund1fund -0.12841 0.15109 -0.850 0.395
## x.sex1M:z.fund2mod -0.06267 0.13908 -0.451 0.652
## y.fav1fav:z.fund1fund 0.21254 0.16205 1.312 0.190
## y.fav1fav:z.fund2mod 0.11757 0.14771 0.796 0.426
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.361 on 11 degrees of freedom
## Residual deviance: 29.729 on 3 degrees of freedom
## AIC: 123.87
##
## Number of Fisher Scoring iterations: 4
Hipotesis
\(H_0: \lambda_{ij}^{XY} = 0\) (Tidak ada interaksi antara jenis kelamin (X) dan pendapat tentang hukuman mati (Y))
\(H_1: \lambda_{ij}^{XY} \neq 0\) (Ada interaksi antara jenis kelamin (X) dan pendapat tentang hukuman mati (Y))
Tingkat Signifikansi
Statistik Uji
\(\Delta \text{Deviance} = \text{Deviance model conditional on Z} - \text{Deviance model homogenous}\)
\(= 29.729 - 1.798 = 27.931\)
\(db = db \text{ model conditional on Z} - db \text{ model homogenous}\)
\(= 3 - 2 = 1\)
Daerah Penolakan
Keputusan
Kesimpulan
# Deviance of Model
Deviance.model <- model_conditional_Z$deviance - model_homogenous$deviance # model_conditional_Z: conditional on Z, model_homogenous: homogenous
Deviance.model
## [1] 27.93095
Hitung Derajat Bebas
derajat.bebas <- (3 - 2)
derajat.bebas
## [1] 1
Nilai Chi-Square Tabel
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 3.841459
Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Tolak"
Interpretasi Karena nilai Deviance.model = 27.93 jauh lebih besar dari nilai kritis chi-square tabel = 3.84 (df = 1, alpha = 0.05), maka keputusan uji adalah “Tolak”.
Kesimpulan: Pada taraf nyata 5%, terdapat bukti yang cukup untuk menolak \(H_0\). Artinya, ada interaksi yang signifikan antara jenis kelamin (X) dan pendapat tentang hukuman mati (Y). Dengan kata lain, model terbaik yang terbentuk adalah model yang menyertakan parameter interaksi \(\lambda_{ij}^{XY}\).
| Model | Parameter | Deviance | Jumlah Parameter | df | AIC |
|---|---|---|---|---|---|
| Saturated | \(\lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} + \lambda^{XYZ}_{ijk}\) | 0.00 | 12 | 0 | 100.14 |
| Homogenous | \(\lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk}\) | 1.798 | 10 | 2 | 97.934 |
| Conditional on X | \(\lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik}\) | 3.9303 | 8 | 4 | 96.067 |
| Conditional on Y | \(\lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{YZ}_{jk}\) | 2.9203 | 8 | 4 | 95.057 |
| Conditional on Z | \(\lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk}\) | 29.729 | 9 | 3 | 123.87 |
| Interaksi | Pengujian | \(\Delta\) deviance | \(\Delta\) df | Chi-square Tabel | Keputusan | Keterangan |
|---|---|---|---|---|---|---|
| XYZ | Saturated vs Homogenous | 1.798 | 2 | 5.991 | Tidak Tolak H0 | tidak ada interaksi |
| YZ | Conditional on X vs Homogenous | 2.1323 | 2 | 5.991 | Tidak Tolak H0 | tidak ada interaksi |
| XZ | Conditional on Y vs Homogenous | 1.1223 | 2 | 5.991 | Tidak Tolak H0 | tidak ada interaksi |
| XY | Conditional on Z vs Homogenous | 27.931 | 1 | 3.841 | Tolak H0 | ada interaksi |
Dari hasil di atas diketahui bahwa asosiasi yang nyata hanya terdapat antara jenis kelamin dan pendapat mengenai hukuman mati. Sehingga, model terbaik adalah:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} \]
Model terbaik adalah model log-linear tanpa interaksi tiga arah dan hanya memuat interaksi dua arah antara jenis kelamin dan sikap terhadap hukuman mati.
Model terbaik dipilih berdasarkan pengujian interaksi yang signifikan, yaitu hanya interaksi dua arah antara jenis kelamin (X) dan sikap terhadap hukuman mati (Y):
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} \]
# Model Terbaik
bestmodel <- glm(counts ~ x.sex + y.fav + z.fund +
x.sex*y.fav,
family = poisson(link = "log"))
summary(bestmodel)
##
## Call:
## glm(formula = counts ~ x.sex + y.fav + z.fund + x.sex * y.fav,
## family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.26518 0.07794 54.721 < 2e-16 ***
## x.sex1M -0.59345 0.10645 -5.575 2.48e-08 ***
## y.fav1fav 0.48302 0.08075 5.982 2.20e-09 ***
## z.fund1fund 0.01986 0.07533 0.264 0.792
## z.fund2mod 0.38130 0.06944 5.491 4.00e-08 ***
## x.sex1M:y.fav1fav 0.65845 0.12708 5.181 2.20e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.3612 on 11 degrees of freedom
## Residual deviance: 4.6532 on 6 degrees of freedom
## AIC: 92.79
##
## Number of Fisher Scoring iterations: 4
Dari summary model diatas terlihat bahwa best model memiliki AIC yang lebih rendah dibandingkan saturated, homogeneous, dan conditional model
# Interpretasi koefisien model terbaik
data.frame(
koef = bestmodel$coefficients,
exp_koef = exp(bestmodel$coefficients)
)
## koef exp_koef
## (Intercept) 4.26517861 71.1776316
## x.sex1M -0.59344782 0.5524194
## y.fav1fav 0.48302334 1.6209677
## z.fund1fund 0.01985881 1.0200573
## z.fund2mod 0.38129767 1.4641834
## x.sex1M:y.fav1fav 0.65845265 1.9318008
\(\exp(\lambda^X_{1M}) = \exp(-0,593) =
0,552 \rightarrow\) nilai odds
Tanpa memperhatikan fundamentalisme dan pendapat mengenai hukuman mati,
peluang seseorang berjenis kelamin laki-laki adalah 0,55 kali
dibandingkan perempuan.
Atau, peluang seseorang berjenis kelamin perempuan adalah \(1/0,55 = 1,81\) kali dibandingkan
laki-laki.
\(\exp(\lambda^Y_{1fav}) = \exp(0,483)
= 1,621 \rightarrow\) nilai odds
Tanpa memperhatikan jenis kelamin dan fundamentalisme, peluang seseorang
mendukung hukuman mati adalah 1,621 kali dibandingkan yang
menolak.
\(\exp(\lambda^Z_{1fund}) =
\exp(0,01986) = 1,02 \rightarrow\) nilai
odds
Tanpa memperhatikan jenis kelamin dan pendapat mengenai hukuman mati,
peluang seseorang fundamentalist adalah 1,02 kali dibandingkan
liberal.
\(\exp(\lambda^Z_{2mod}) = \exp(0,381)
= 1,464 \rightarrow\) nilai odds
Tanpa memperhatikan jenis kelamin dan pendapat mengenai hukuman mati,
peluang seseorang moderate adalah 1,464 kali dibandingkan
liberal.
\(\exp(\lambda^{XY}_{1M,1fav}) =
\exp(0,658) = 1,932 \rightarrow\) nilai odds
ratio
Tanpa memperhatikan fundamentalisme, odds mendukung hukuman mati
(dibandingkan menolak) jika dia laki-laki adalah 1,932 kali dibandingkan
odds yang sama jika dia perempuan.
# Fitted values dari model terbaik
data.frame(
Fund = z.fund,
sex = x.sex,
favor = y.fav,
counts = counts,
fitted = bestmodel$fitted.values
)
## Fund sex favor counts fitted
## 1 1fund 1M 1fav 128 125.59539
## 2 1fund 1M 2opp 32 40.10855
## 3 1fund 2F 1fav 123 117.69079
## 4 1fund 2F 2opp 73 72.60526
## 5 2mod 1M 1fav 182 180.27878
## 6 2mod 1M 2opp 56 57.57155
## 7 2mod 2F 1fav 168 168.93257
## 8 2mod 2F 2opp 105 104.21711
## 9 3lib 1M 1fav 119 123.12582
## 10 3lib 1M 2opp 49 39.31990
## 11 3lib 2F 1fav 111 115.37664
## 12 3lib 2F 2opp 70 71.17763
Secara manual, nilai fitted value diperoleh dengan cara sebagai berikut:
\[\begin{align*} \hat{\mu}_{111} &= \exp(\lambda + \lambda^x_{1m} + \lambda^y_{1fav} + \lambda^z_{fund} + \lambda^{xy}_{1m,1fav}) \\ &= \exp(4.265 - 0.593 + 0.483 + 0.01986 + 0.658) \\ &= \exp(4.833) = 125.595 \\ \\ \hat{\mu}_{112} &= \exp(\lambda + \lambda^x_{1m} + \lambda^y_{1fav} + \lambda^z_{2mod} + \lambda^{xy}_{1m,1fav}) \\ &= \exp(4.265 - 0.593 + 0.483 + 0.381 + 0.658) \\ &= \exp(5.195) = 180.279 \\ \\ \hat{\mu}_{113} &= \exp(\lambda + \lambda^x_{1m} + \lambda^y_{1fav} + \lambda^z_{lib} + \lambda^{xy}_{1m,1fav}) \\ &= \exp(4.265 - 0.593 + 0.483 + 0 + 0.658) \\ &= \exp(4.813) = 123.126 \\ \\ \hat{\mu}_{121} &= \exp(\lambda + \lambda^x_{1m} + \lambda^y_{2opp} + \lambda^z_{fund} + \lambda^{xy}_{1m,2opp}) \\ &= \exp(4.265 - 0.593 + 0 + 0.01986 + 0) \\ &= \exp(3.692) = 40.109 \\ \\ \hat{\mu}_{122} &= \exp(\lambda + \lambda^x_{1m} + \lambda^y_{2opp} + \lambda^z_{2mod} + \lambda^{xy}_{1m,2opp}) \\ &= \exp(4.265 - 0.593 + 0 + 0.381 + 0) \\ &= \exp(4.053) = 57.572 \\ \\ \hat{\mu}_{123} &= \exp(\lambda + \lambda^x_{1m} + \lambda^y_{2opp} + \lambda^z_{lib} + \lambda^{xy}_{1m,2opp}) \\ &= \exp(4.265 - 0.593 + 0 + 0 + 0) \\ &= \exp(3.672) = 39.320 \\ \\ \hat{\mu}_{211} &= \exp(\lambda + \lambda^x_{2f} + \lambda^y_{1fav} + \lambda^z_{fund} + \lambda^{xy}_{2f,1fav}) \\ &= \exp(4.265 + 0 + 0.483 + 0.01986 + 0) \\ &= \exp(4.768) = 117.691 \\ \\ \hat{\mu}_{212} &= \exp(\lambda + \lambda^x_{2f} + \lambda^y_{1fav} + \lambda^z_{2mod} + \lambda^{xy}_{2f,1fav}) \\ &= \exp(4.265 + 0 + 0.483 + 0.381 + 0) \\ &= \exp(5.1295) = 168.933 \\ \\ \hat{\mu}_{213} &= \exp(\lambda + \lambda^x_{2f} + \lambda^y_{1fav} + \lambda^z_{lib} + \lambda^{xy}_{2f,1fav}) \\ &= \exp(4.265 + 0 + 0.483 + 0 + 0) \\ &= \exp(4.748) = 115.377 \\ \\ \hat{\mu}_{221} &= \exp(\lambda + \lambda^x_{2f} + \lambda^y_{2opp} + \lambda^z_{fund} + \lambda^{xy}_{2f,2opp}) \\ &= \exp(4.265 + 0 + 0 + 0.01986 + 0) \\ &= \exp(4.285) = 72.605 \\ \\ \hat{\mu}_{222} &= \exp(\lambda + \lambda^x_{2f} + \lambda^y_{2opp} + \lambda^z_{2mod} + \lambda^{xy}_{2f,2opp}) \\ &= \exp(4.265 + 0 + 0 + 0.381 + 0) \\ &= \exp(4.646) = 104.217 \\ \\ \hat{\mu}_{223} &= \exp(\lambda + \lambda^x_{2f} + \lambda^y_{2opp} + \lambda^z_{lib} + \lambda^{xy}_{2f,2opp}) \\ &= \exp(4.265 + 0 + 0 + 0 + 0) \\ &= \exp(4.265) = 71.178 \\ \end{align*}\]
Keterangan:
Nilai \(\hat{\mu}_{ijk}\) akan sama
apapun referensi dari kategori peubahnya yang kita gunakan.
Agresti, A. (2013). Categorical Data Analysis. John Wiley & Sons.
Agresti, A. (2019). An Introduction to Categorical Data Analysis. Wiley.
Christensen, R. (1997). Log-Linear Models and Logistic Regression. Springer.
Fisher, R. A. (1935). The Design of Experiments. Oliver and Boyd.
Fox, J. (2008). Applied Regression Analysis and Generalized Linear Models.
Howell, D. C. (2012). Statistical Methods for Psychology (8th ed.). Cengage Learning.
Mehta, C. R., & Patel, N. R. (1983). A Network Algorithm for Performing Fisher’s Exact Test in r × c Contingency Tables. Journal of the American Statistical Association, 78(382), 427-434.
Modul ADK, Pertemuan 14. (2021). Universitas Padjadjaran.