Analisis data kategori memainkan peran penting dalam berbagai bidang, terutama dalam penelitian kesehatan, di mana hubungan antara paparan (exposure) dan hasil (outcome) sering kali menjadi fokus utama. Contohnya, hubungan antara kebiasaan merokok dan kejadian penyakit jantung sering dianalisis menggunakan pendekatan statistik seperti tabel kontingensi dan model regresi. Tabel kontingensi, baik dua arah (2x2) maupun tiga arah, memungkinkan kita untuk menghitung peluang, mengukur asosiasi, dan melakukan inferensi statistik guna memahami hubungan antar variabel kategori. Sementara itu, Generalized Linear Model (GLM) memberikan kerangka yang lebih fleksibel untuk memodelkan data yang tidak memenuhi asumsi normalitas, seperti data biner (misalnya, regresi logistik) atau data hitungan (misalnya, regresi Poisson). Pendekatan ini sangat relevan untuk analisis data kesehatan, di mana distribusi respons sering kali bersifat non-normal.
E-book ini disusun untuk memberikan panduan komprehensif tentang analisis data kategori menggunakan tabel kontingensi dan GLM, dengan fokus pada penerapan praktis dalam konteks kesehatan. Tujuan utama e-book ini adalah untuk membantu pembaca memahami konsep dasar analisis data kategori, mulai dari perhitungan peluang dan ukuran asosiasi, hingga inferensi statistik dan pemodelan menggunakan GLM. Selain itu, e-book ini juga bertujuan untuk membekali pembaca dengan keterampilan praktis dalam menggunakan perangkat lunak R untuk analisis data, termasuk simulasi data, estimasi parameter, dan diagnostik model. Dengan pendekatan yang menggabungkan teori, contoh soal, dan penyelesaian langkah demi langkah, e-book ini diharapkan dapat menjadi sumber belajar yang bermanfaat bagi pembaca yang ingin mendalami analisis statistik.
Struktur e-book ini terdiri dari tujuh bab yang disusun secara sistematis. Bab 1, berjudul Tabel Kontingensi 2x2, membahas dasar-dasar analisis data kategori menggunakan tabel kontingensi 2x2, termasuk perhitungan peluang bersama, marginal, dan bersyarat, serta ukuran asosiasi seperti Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR). Bab 2, Inferensi Tabel Kontingensi Dua Arah, melanjutkan dengan inferensi statistik, termasuk estimasi parameter, pengujian hipotesis (uji Chi-Square, uji Fisher Exact), dan analisis residual. Bab 3, Tabel Kontingensi Tiga Arah, memperluas analisis ke tabel tiga arah, dengan fokus pada interaksi antar variabel, independensi bersyarat, dan uji homogenitas odds ratio menggunakan statistik Breslow-Day. Bab 4, Generalized Linear Model (GLM), memperkenalkan GLM sebagai alat untuk memodelkan data biner dan hitungan, termasuk regresi logistik dan Poisson. Bab 5, Inferensi GLM, membahas inferensi statistik dalam GLM, seperti perhitungan ekspektasi dan variansi, penaksiran parameter, dan diagnostik model. Bab 6, Daftar Pustaka, menyediakan referensi utama yang digunakan dalam penyusunan e-book ini. Terakhir, Bab 7, Penutupan, memberikan ringkasan materi dan saran untuk pembaca yang ingin melanjutkan studi lebih lanjut.
E-book ini ditujukan untuk pembaca yang memiliki dasar pengetahuan statistik, seperti mahasiswa tingkat lanjut di bidang statistik, kesehatan masyarakat, atau ilmu sosial, serta peneliti yang ingin menerapkan analisis data kategori dalam penelitian mereka. Namun, pembaca pemula yang memiliki minat untuk belajar statistik juga dapat memanfaatkan e-book ini dengan mempelajari konsep dasar terlebih dahulu. Dengan menggunakan contoh data kesehatan (misalnya, hubungan merokok dan penyakit jantung) dan kode R yang praktis, e-book ini dirancang untuk memudahkan pembaca dalam memahami dan mengaplikasikan materi yang dibahas.
Kami berharap e-book ini dapat menjadi sumber belajar yang bermanfaat dan menginspirasi pembaca untuk mengeksplorasi lebih jauh dunia analisis data kategori. Selamat membaca dan selamat belajar!
Sebuah penelitian dilakukan untuk mengevaluasi hubungan antara kebiasaan merokok (paparan) dan kejadian penyakit jantung (outcome) pada 200 orang. Data yang diperoleh disajikan dalam tabel berikut:
| Penyakit Jantung (Ya) | Penyakit Jantung (Tidak) | Total | |
| Merokok | 50 | 30 | 80 |
| Tidak Merokok | 20 | 100 | 120 |
| Total | 70 | 130 | 200 |
Berdasarkan data tersebut, hitunglah:
1. Peluang bersama (joint probability).
2. Peluang marginal (marginal probability).
3. Peluang bersyarat (conditional probability).
4. Ukuran asosiasi: Risk Difference (RD), Relative
Risk (RR), dan Odds Ratio (OR).
Tabel kontingensi 2x2 adalah alat statistik yang digunakan untuk menganalisis hubungan antara dua variabel kategori, masing-masing memiliki dua level (biner). Tabel ini sering digunakan dalam studi kesehatan untuk membandingkan paparan (exposure) dan hasil (outcome), misalnya hubungan antara kebiasaan merokok dan penyakit jantung. Struktur tabel kontingensi 2x2 dapat ditulis sebagai berikut:
| Outcome 1 | Outcome 0 | Total | | |||
| Exposure 1 | a | b | a + b |
| Exposure 0 | c | d | c + d |
| Total | a + c | b + d | n |
Di mana:
- \(a\): Jumlah kasus dengan paparan 1
dan outcome 1.
- \(b\): Jumlah kasus dengan paparan 1
dan outcome 0.
- \(c\): Jumlah kasus dengan paparan 0
dan outcome 1.
- \(d\): Jumlah kasus dengan paparan 0
dan outcome 0.
- \(n = a + b + c + d\): Total
sampel.
Bagian ini akan membahas distribusi peluang yang dapat dihitung dari tabel kontingensi, yaitu peluang bersama, peluang marginal, dan peluang bersyarat.
Peluang bersama (joint probability) adalah peluang dua kejadian terjadi bersamaan, dihitung sebagai proporsi frekuensi masing-masing sel terhadap total sampel. Rumusnya adalah:
\[ P(X = x, Y = y) = \frac{\text{frekuensi sel}}{n} \]
Berdasarkan tabel:
- \(a = 50\), \(b = 30\), \(c =
20\), \(d = 100\), dan \(n = 200\).
Maka:
\(P(\text{Merokok, Penyakit Jantung Ya}) = \frac{a}{n} = \frac{50}{200} = 0.25\)
\(P(\text{Merokok, Penyakit Jantung Tidak}) = \frac{b}{n} = \frac{30}{200} = 0.15\)
\(P(\text{Tidak Merokok, Penyakit Jantung Ya}) = \frac{c}{n} = \frac{20}{200} = 0.1\)
\(P(\text{Tidak Merokok, Penyakit Jantung Tidak}) = \frac{d}{n} = \frac{100}{200} = 0.5\)
Kita dapat menghitungnya menggunakan R:
# Definisikan data
a <- 50 # Merokok, Penyakit Jantung Ya
b <- 30 # Merokok, Penyakit Jantung Tidak
c <- 20 # Tidak Merokok, Penyakit Jantung Ya
d <- 100 # Tidak Merokok, Penyakit Jantung Tidak
n <- a + b + c + d # Total sampel
# Hitung peluang bersama
p_merokok_ya <- a / n
p_merokok_tidak <- b / n
p_tidak_merokok_ya <- c / n
p_tidak_merokok_tidak <- d / n
| Penyakit Jantung: Ya | Penyakit Jantung: Tidak | Total | |
|---|---|---|---|
| Merokok | 0.25 | 0.15 | 0.40 |
| Tidak Merokok | 0.10 | 0.50 | 0.60 |
| Total | 0.35 | 0.65 | 1.00 |
Peluang marginal (marginal probability) adalah peluang suatu variabel tanpa mempedulikan variabel lainnya, dihitung dari total baris atau kolom. Rumusnya adalah:
Untuk paparan: \[
P(\text{Exposure 1}) = \frac{a + b}{n}, \quad P(\text{Exposure 0}) =
\frac{c + d}{n}
\] Untuk outcome: \[
P(\text{Outcome 1}) = \frac{a + c}{n}, \quad P(\text{Outcome 0}) =
\frac{b + d}{n}
\] Berdasarkan tabel:
\(P(\text{Merokok}) = \frac{a + b}{n} = \frac{50 + 30}{200} = \frac{80}{200} = 0.4\) \(P(\text{Tidak Merokok}) = \frac{c + d}{n} = \frac{20 + 100}{200} = \frac{120}{200} = 0.6\) \(P(\text{Penyakit Jantung Ya}) = \frac{a + c}{n} = \frac{50 + 20}{200} = \frac{70}{200} = 0.35\) \(P(\text{Penyakit Jantung Tidak}) = \frac{b + d}{n} = \frac{30 + 100}{200} = \frac{130}{200} = 0.65\)
Kode R untuk menghitung:
# Hitung peluang marginal
p_merokok <- (a + b) / n
p_tidak_merokok <- (c + d) / n
p_penyakit_ya <- (a + c) / n
p_penyakit_tidak <- (b + d) / n
| Variabel | Kategori | Peluang |
|---|---|---|
| Merokok | Merokok | 0.40 |
| Tidak Merokok | 0.60 | |
| Penyakit Jantung | Ya | 0.35 |
| Tidak | 0.65 |
Peluang bersyarat (conditional probability) adalah peluang suatu kejadian terjadi dengan syarat kejadian lain telah terjadi. Rumusnya adalah:
\[ P(Y|X) = \frac{P(X, Y)}{P(X)} \]
Kita akan menghitung:
Peluang seseorang memiliki penyakit jantung jika mereka
merokok:
\[
P(\text{Penyakit Jantung Ya} \| \text{Merokok}) =
\frac{P(\text{Merokok, Penyakit Jantung Ya})}{P(\text{Merokok})} =
\frac{\frac{a}{n}}{\frac{a + b}{n}} = \frac{a}{a + b} \
\]
Peluang seseorang memiliki penyakit jantung jika mereka tidak
merokok:
\[ P(\text{Penyakit Jantung Ya} \| \text{Tidak Merokok}) = \frac{P(\text{Tidak Merokok, Penyakit Jantung Ya})}{P(\text{Tidak Merokok})} = \frac{\frac{c}{n}}{\frac{c + d}{n}} = \frac{c}{c + d} \ \]
Berdasarkan tabel: \(P(\text{Penyakit Jantung Ya} | \text{Merokok}) = \frac{a}{a + b} = \frac{50}{50 + 30} = \frac{50}{80} = 0.625\) \(P(\text{Penyakit Jantung Ya} | \text{Tidak Merokok}) = \frac{c}{c + d} = \frac{20}{20 + 100} = \frac{20}{120} \approx 0.167\)
Kode R:
# Hitung peluang bersyarat
p_penyakit_ya_merokok <- a / (a + b)
p_penyakit_ya_tidak_merokok <- c / (c + d)
| Kondisi | Peluang Bersyarat |
|---|---|
| P(Penyakit Jantung Ya | Merokok) |
| P(Penyakit Jantung Ya | Tidak Merokok) |
Setelah menghitung distribusi peluang, kita dapat mengukur asosiasi antara paparan dan outcome menggunakan tiga ukuran utama: Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR).
Risk Difference (RD) mengukur perbedaan absolut antara risiko outcome pada kelompok terpapar dan tidak terpapar. Rumusnya adalah:
\[ \text{RD} = P(\text{Outcome 1} | \text{Exposure 1}) - P(\text{Outcome 1} | \text{Exposure 0}) \]
Dari perhitungan sebelumnya:
\(P(\text{Penyakit Jantung Ya} | \text{Merokok}) = 0.625\) \(P(\text{Penyakit Jantung Ya} | \text{Tidak Merokok}) = 0.167\) \[ \text{RD} = 0.625 - 0.167 = 0.458 \] Kode R:
# Hitung Risk Difference
RD <- p_penyakit_ya_merokok - p_penyakit_ya_tidak_merokok
# Tampilkan hasil
cat("Risk Difference (RD): ", RD, "\n")
## Risk Difference (RD): 0.4583333
Interpretasi: Risiko penyakit jantung pada perokok lebih tinggi sebesar 0.458 dibandingkan non-perokok.
Relative Risk (RR) mengukur rasio risiko outcome pada kelompok terpapar dibandingkan kelompok tidak terpapar. Rumusnya adalah:
\[ \text{RR} = \frac{P(\text{Outcome 1} | \text{Exposure 1})}{P(\text{Outcome 1} | \text{Exposure 0})} \]
Dari perhitungan sebelumnya:
\[ \text{RR} = \frac{0.625}{0.167} \approx 3.742 \]
Kode R:
# Hitung Relative Risk
RR <- p_penyakit_ya_merokok / p_penyakit_ya_tidak_merokok
# Tampilkan hasil
cat("Relative Risk (RR): ", RR, "\n")
## Relative Risk (RR): 3.75
Interpretasi: Perokok memiliki risiko 3.742 kali lebih tinggi untuk terkena penyakit jantung dibandingkan non-perokok.
Odds Ratio (OR) mengukur rasio odds outcome pada kelompok terpapar dibandingkan kelompok tidak terpapar. Langkah-langkah perhitungannya adalah:
Hitung odds untuk masing-masing kelompok: Odds untuk kelompok terpapar: \[ \text{Odds}_1 = \frac{P(\text{Outcome 1} | \text{Exposure 1})}{P(\text{Outcome 0} | \text{Exposure 1})} = \frac{a}{b} \] Odds untuk kelompok tidak terpapar: \[ \text{Odds}_0 = \frac{P(\text{Outcome 1} | \text{Exposure 0})}{P(\text{Outcome 0} | \text{Exposure 0})} = \frac{c}{d} \] Hitung Odds Ratio: \[ \text{OR} = \frac{\text{Odds}_1}{\text{Odds}_0} = \frac{\frac{a}{b}}{\frac{c}{d}} = \frac{a \cdot d}{b \cdot c} \] Berdasarkan tabel:
\(\text{Odds}_1 = \frac{a}{b} = \frac{50}{30} \approx 1.667\) \(\text{Odds}_0 = \frac{c}{d} = \frac{20}{100} = 0.2\) \(\text{OR} = \frac{a \cdot d}{b \cdot c} = \frac{50 \cdot 100}{30 \cdot 20} = \frac{5000}{600} \approx 8.333\)
Kode R:
# Hitung odds
odds_merokok <- a / b
odds_tidak_merokok <- c / d
# Hitung Odds Ratio
OR <- (a * d) / (b * c)
| Kelompok | Odds Penyakit Jantung |
|---|---|
| Merokok | 1.6667 |
| Tidak Merokok | 0.2000 |
| Perbandingan | Odds Ratio (OR) |
|---|---|
| Merokok vs Tidak Merokok | 8.3333 |
Interpretasi: Odds terkena penyakit jantung pada perokok 8.333 kali lebih tinggi dibandingkan non-perokok.
Inferensi tabel kontingensi dua arah bertujuan untuk menguji hubungan antara dua variabel kategori menggunakan metode statistik. Dalam konteks tabel 2x2, inferensi meliputi estimasi parameter (seperti proporsi atau ukuran asosiasi), pengujian hipotesis untuk menentukan apakah variabel saling independen atau berasosiasi, dan analisis residual untuk mendeteksi anomali dalam data. Bab ini akan membahas langkah-langkah inferensi secara sistematis, termasuk uji Chi-Square, uji Fisher Exact, estimasi interval kepercayaan, dan analisis residual.
Sebuah penelitian dilakukan untuk mengevaluasi hubungan antara kebiasaan merokok (paparan) dan kejadian penyakit jantung (outcome) pada 200 orang. Data yang diperoleh disajikan dalam tabel berikut:
| Penyakit Jantung (Ya) | Penyakit Jantung (Tidak) | Total | |
| Merokok | 50 | 30 | 80 |
| Tidak Merokok | 20 | 100 | 120 |
| Total | 70 | 130 | 200 |
Berdasarkan data tersebut, lakukan:
1. Estimasi titik dan interval kepercayaan untuk ukuran asosiasi (Odds
Ratio dan Relative Risk).
2. Pengujian hipotesis untuk menentukan apakah terdapat hubungan antara
kebiasaan merokok dan penyakit jantung (gunakan uji proporsi, uji
asosiasi, dan uji independensi).
3. Analisis residual untuk mendeteksi adanya outlier atau anomali dalam
data.
Gunakan tingkat signifikansi \(\alpha = 0.05\) untuk semua uji.
Kita akan memulai dengan mendefinisikan data dalam bentuk matriks untuk memudahkan perhitungan:
| Penyakit Jantung (Ya) | Penyakit Jantung (Tidak) | Total | ||
| Merokok | a = 50 | b = 30 | a + b = 80 | |
| Tidak Merokok | c = 20 | d = 100 | c + d = 120 | |
| Total | a + c = 70 | b + d = 130 | n = 200 |
Kode R untuk mendefinisikan data:
# Definisikan data
a <- 50 # Merokok, Penyakit Jantung Ya
b <- 30 # Merokok, Penyakit Jantung Tidak
c <- 20 # Tidak Merokok, Penyakit Jantung Ya
d <- 100 # Tidak Merokok, Penyakit Jantung Tidak
n <- a + b + c + d # Total sampel
# Buat matriks untuk tabel kontingensi
data <- matrix(c(a, b, c, d), nrow = 2, byrow = TRUE)
rownames(data) <- c("Merokok", "Tidak Merokok")
colnames(data) <- c("Penyakit Jantung (Ya)", "Penyakit Jantung (Tidak)")
# Tampilkan matriks
print(data)
## Penyakit Jantung (Ya) Penyakit Jantung (Tidak)
## Merokok 50 30
## Tidak Merokok 20 100
Perhitungan detail akan dilakukan pada subbab berikut sesuai dengan langkah-langkah inferensi.
Bagian ini membahas estimasi parameter dari tabel kontingensi, baik estimasi titik (nilai tunggal) maupun estimasi interval (rentang kepercayaan).
Estimasi titik memberikan nilai tunggal sebagai perkiraan parameter populasi. Dalam tabel kontingensi 2x2, kita dapat menghitung estimasi titik untuk Odds Ratio (OR) dan Relative Risk (RR).
Estimasi Odds Ratio (OR) Rumus OR:
\[ \text{OR} = \frac{a \cdot d}{b \cdot c} \]
\[ \text{OR} = \frac{50 \cdot 100}{30 \cdot 20} = \frac{5000}{600} \approx 8.333 \]
Estimasi Relative Risk (RR) Rumus RR:
\[ \text{RR} = \frac{a/(a+b)}{c/(c+d)} \]
\[ \text{RR} = \frac{50/80}{20/120} = \frac{0.625}{0.167} \approx 3.742 \] Kode R:
# Hitung OR
OR <- (a * d) / (b * c)
# Hitung RR
p1 <- a / (a + b) # P(Penyakit Jantung Ya | Merokok)
p2 <- c / (c + d) # P(Penyakit Jantung Ya | Tidak Merokok)
RR <- p1 / p2
| Estimasi | Nilai |
|---|---|
| Odds Ratio (OR) | 8.3333 |
| Relative Risk (RR) | 3.75 |
Interpretasi: Nilai RR sebesar 3.742 menunjukkan bahwa risiko seseorang yang merokok terkena penyakit jantung 3.742 kali lebih tinggi dibandingkan seseorang yang tidak merokok. Ini menunjukkan bahwa merokok meningkatkan risiko penyakit jantung secara signifikan.
Estimasi interval memberikan rentang kepercayaan confidence interval (CI) untuk parameter populasi. Kita akan menghitung CI 95% untuk OR dan RR.
Interval Kepercayaan Odds Ratio (OR)
Langkah-langkah:
Batas bawah:
\(2.120 - 1.96 \times 0.336 \approx
1.461\)
Batas atas:
\(2.120 + 1.96 \times 0.336 \approx
2.779\)
Konversi ke skala OR: \[
\text{CI 95%} = (e^{1.461}, e^{2.779}) \approx (4.312, 16.087)
\]
Interpretasi: Interval kepercayaan 95% untuk OR adalah (4.312, 16.087). Karena rentang ini tidak mencakup nilai 1, hubungan antara merokok dan penyakit jantung signifikan secara statistik. Rentang ini juga menunjukkan bahwa OR sebenarnya dapat bervariasi antara 4.312 hingga 16.087, yang tetap menunjukkan hubungan yang kuat.
Interval Kepercayaan Relative Risk (RR)
Langkah-langkah:
Batas bawah:
\(1.319 - 1.96\times 0.222 \approx
0.884\)
Batas atas:
\(1.319 + 1.96 \times 0.222\approx
1.754\)
Konversi ke skala RR: \[ \text{CI 95%} = (e^{0.884}, e^{1.754}) \approx (2.421, 5.779) \]
Kode R:
# CI untuk OR
ln_OR <- log(OR)
SE_ln_OR <- sqrt(1/a + 1/b + 1/c + 1/d)
lower_ln_OR <- ln_OR - 1.96 * SE_ln_OR
upper_ln_OR <- ln_OR + 1.96 * SE_ln_OR
lower_OR <- exp(lower_ln_OR)
upper_OR <- exp(upper_ln_OR)
# CI untuk RR
ln_RR <- log(RR)
SE_ln_RR <- sqrt(1/a - 1/(a+b) + 1/c - 1/(c+d))
lower_ln_RR <- ln_RR - 1.96 * SE_ln_RR
upper_ln_RR <- ln_RR + 1.96 * SE_ln_RR
lower_RR <- exp(lower_ln_RR)
upper_RR <- exp(upper_ln_RR)
| Estimasi | Nilai | Interval Kepercayaan 95% |
|---|---|---|
| Odds Ratio (OR) | 8.3333 | (4.31, 16.12) |
| Relative Risk (RR) | 3.75 | (2.43, 5.79) |
Interpretasi: Interval kepercayaan 95% untuk RR adalah (2.421, 5.779). Karena rentang ini tidak mencakup nilai 1, hubungan antara merokok dan penyakit jantung signifikan secara statistik. Rentang ini menunjukkan bahwa RR sebenarnya dapat bervariasi antara 2.421 hingga 5.779, yang tetap menunjukkan peningkatan risiko yang signifikan akibat merokok.
Bagian ini membahas pengujian hipotesis untuk menentukan hubungan antara variabel dalam tabel kontingensi.
Uji proporsi membandingkan proporsi outcome antara dua kelompok (merokok dan tidak merokok).
Hipotesis:
\(H_0: p_1 = p_2\) (proporsi
penyakit jantung sama di kedua kelompok)
\(H_1: p_1 \neq p_2\) (proporsi
penyakit jantung berbeda)
Rumus statistik uji:
\[ z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1-\hat{p})\left(\frac{1}{n_1} + \frac{1}{n_2}\right)}} \]
Di mana:
\(\hat{p}_1 = \frac{a}{a+b} = \frac{50}{80}
= 0.625\)
\(\hat{p}_2 = \frac{c}{c+d} = \frac{20}{120}
\approx 0.167\)
\(\hat{p} = \frac{a+c}{n} = \frac{50+20}{200}
= 0.35\)
\(n_1 = a+b = 80\),
\(n_2 = c+d = 120\)
\[ z = \frac{0.625 - 0.167}{\sqrt{0.35 \times 0.65 \left(\frac{1}{80} + \frac{1}{120}\right)}} \approx \frac{0.458}{\sqrt{0.2275 \times 0.02083}} \approx \frac{0.458}{0.0688} \approx 6.657 \]
Titik Kritis: Nilai kritis untuk \(\alpha = 0.05\) (dua sisi) adalah \(z = \pm 1.96\).
Kode R:
# Uji proporsi
p1 <- a / (a + b)
p2 <- c / (c + d)
p_pool <- (a + c) / n
n1 <- a + b
n2 <- c + d
z <- (p1 - p2) / sqrt(p_pool * (1 - p_pool) * (1/n1 + 1/n2))
# Tampilkan hasil
cat("Statistik z: ", z, "\n")
## Statistik z: 6.657503
Interpretasi: Karena \(\|z\| = 6.657 \> 1.96\), kita tolak (H_0). Proporsi penyakit jantung berbeda secara signifikan antara perokok dan non-perokok, menunjukkan adanya perbedaan risiko yang nyata. Ini konsisten dengan estimasi RR sebelumnya.
Uji asosiasi menggunakan uji Fisher Exact untuk memeriksa hubungan antara variabel.
Hipotesis:
\(H_0\): Tidak ada asosiasi antara merokok dan penyakit jantung. \(H_1\): Terdapat asosiasi antara merokok dan penyakit jantung.
Uji Fisher Exact menghitung probabilitas eksak berdasarkan distribusi hipergeometrik, cocok untuk tabel 2x2.
Kode R:
# Uji Fisher Exact
fisher_test <- fisher.test(data)
# Tampilkan hasil
cat("P-value: ", fisher_test$p.value, "\n")
## P-value: 3.135278e-11
Interpretasi: P-value < 0.05, sehingga kita tolak (H_0). Terdapat asosiasi yang signifikan antara merokok dan penyakit jantung. Hasil ini mendukung temuan sebelumnya bahwa merokok meningkatkan risiko penyakit jantung secara signifikan.
Uji independensi menggunakan uji Chi-Square untuk menguji apakah variabel merokok dan penyakit jantung saling independen.
Hipotesis:
\(H_0\): Variabel merokok dan penyakit jantung independen. \(H_1\): Variabel merokok dan penyakit jantung tidak independen.
Rumus:
\[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}}, \quad E_{ij} = \frac{(\text{total baris}_i) \times (\text{total kolom}_j)}{n} \]
\(E_{11} = \frac{80 \times 70}{200} =
28\)
\(E_{12} = \frac{80 \times 130}{200} =
52\)
\(E_{21} = \frac{120 \times 70}{200} =
42\)
\(E_{22} = \frac{120 \times 130}{200} =
78\)
\[ \chi^2 = \frac{(50-28)^2}{28} + \frac{(30-52)^2}{52} + \frac{(20-42)^2}{42} + \frac{(100-78)^2}{78} \approx 44.323 \] Derajat kebebasan: \(df = (2-1)(2-1) = 1\). Nilai kritis untuk \(\alpha = 0.05\) adalah 3.841.
Kode R:
# Uji Chi-Square
chi_test <- chisq.test(data, correct = FALSE)
| Statistik Uji | Nilai |
|---|---|
| Chi-Square | 44.3223 |
| p-value | 2.78e-11 |
Interpretasi: Karena \(\chi^2 = 44.323 > 3.841\), kita tolak \(H_0\). Variabel merokok dan penyakit jantung tidak independen, yang menunjukkan adanya hubungan yang signifikan antara keduanya. Hasil ini konsisten dengan uji asosiasi sebelumnya.
Analisis residual membantu mendeteksi anomali atau outlier dalam tabel kontingensi dengan membandingkan frekuensi yang diamati (\(O_{ij}\)) dan yang diharapkan (\(E_{ij}\)).
Dua jenis residual yang umum digunakan:
Residual Pearson: \[ r_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \] Residual Standar (Adjusted Residual): \[ \text{Adjusted Residual} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij} \times (1 - \frac{\text{total baris}_i}{n}) \times (1 - \frac{\text{total kolom}_j}{n})}} \] Kita akan menghitung residual Pearson:
\(r_{11} = \frac{50-28}{\sqrt{28}} \approx
\frac{22}{5.292} \approx 4.157\)
\(r_{12} = \frac{30-52}{\sqrt{52}} \approx
\frac{-22}{7.211} \approx -3.051\)
\(r_{21} = \frac{20-42}{\sqrt{42}} \approx
\frac{-22}{6.481} \approx -3.395\)
\(r_{22} = \frac{100-78}{\sqrt{78}} \approx
\frac{22}{8.832} \approx 2.491\)
Kode R:
# Hitung frekuensi yang diharapkan
E11 <- (80 * 70) / 200
E12 <- (80 * 130) / 200
E21 <- (120 * 70) / 200
E22 <- (120 * 130) / 200
# Residual Pearson
r11 <- (50 - E11) / sqrt(E11)
r12 <- (30 - E12) / sqrt(E12)
r21 <- (20 - E21) / sqrt(E21)
r22 <- (100 - E22) / sqrt(E22)
Residual Pearson
| Penyakit Jantung: Ya | Penyakit Jantung: Tidak | |
|---|---|---|
| Merokok | 4.16 | -3.05 |
| Tidak Merokok | -3.39 | 2.49 |
Interpretasi: Residual Pearson yang besar (misalnya, \(|r_{ij}| > 2\)) menunjukkan deviasi yang signifikan antara frekuensi yang diamati dan yang diharapkan. Sel (1,1) memiliki residual 4.157, yang jauh lebih besar dari 2, menunjukkan bahwa frekuensi perokok dengan penyakit jantung jauh lebih tinggi dari yang diharapkan. Hal ini konsisten dengan temuan sebelumnya bahwa merokok meningkatkan risiko penyakit jantung.
Residual yang besar (misalnya, \(|r_{ij}| > 2\)) dapat menunjukkan adanya anomali atau outlier. Dari hasil di atas:
\(r_{11} = 4.157 > 2\) (sel
perokok dengan penyakit jantung
\(r_{12} = -3.051 < -2\) (sel
perokok tanpa penyakit jantung
\(r_{21} = -3.395 < -2\) (sel
non-perokok dengan penyakit jantung)
\(r_{22} = 2.491 > 2\) (sel
non-perokok tanpa penyakit jantung)
Interpretasi: Semua sel memiliki residual Pearson yang absolutnya lebih besar dari 2, menunjukkan adanya deviasi signifikan dari model independensi. Sel (1,1) dengan residual 4.157 adalah yang paling menonjol, menunjukkan bahwa frekuensi perokok yang terkena penyakit jantung jauh lebih tinggi dari yang diharapkan. Ini menunjukkan adanya anomali yang mungkin perlu diteliti lebih lanjut, misalnya adanya faktor lain yang memengaruhi hubungan ini, seperti usia atau gaya hidup.
Tabel kontingensi tiga arah digunakan untuk menganalisis hubungan antara tiga variabel kategori, dengan fokus pada interaksi antar variabel. Bab ini akan membahas tabel parsial dan marginal, distribusi peluang bersyarat, ukuran asosiasi seperti odds ratio, independensi bersyarat, serta inferensi statistik seperti pengujian independensi bersyarat dan homogenitas odds ratio menggunakan statistik Breslow-Day.
Sebuah penelitian dilakukan untuk mengevaluasi hubungan antara kebiasaan merokok (Merokok/Tidak Merokok), penyakit jantung (Ya/Tidak), dan jenis kelamin (Laki-laki/Perempuan) pada 400 orang. Data disajikan dalam dua tabel kontingensi 2x2, masing-masing untuk laki-laki dan perempuan:
Tabel untuk Laki-laki:
| Penyakit Jantung (Ya) | Penyakit Jantung (Tidak) | Total | |
| Merokok | 40 | 30 | 70 |
| Tidak Merokok | 20 | 110 | 130 |
| Total | 60 | 140 | 200 |
Tabel untuk Perempuan:
| Penyakit Jantung (Ya) | Penyakit Jantung (Tidak) | Total | |
| Merokok | 20 | 30 | 50 |
| Tidak Merokok | 10 | 140 | 150 |
| Total | 30 | 170 | 200 |
Berdasarkan data tersebut, lakukan:
1. Hitung tabel marginal untuk hubungan merokok dan penyakit jantung
(tanpa mempedulikan jenis kelamin).
2. Hitung peluang bersyarat \(P(\text{Penyakit
Jantung Ya} | \text{Merokok}, \text{Jenis Kelamin})\). 3. Hitung
odds ratio untuk setiap strata (laki-laki dan perempuan) dan uji
homogenitas odds ratio menggunakan statistik Breslow-Day.
4. Uji independensi bersyarat antara merokok dan penyakit jantung pada
setiap strata jenis kelamin.
Gunakan tingkat signifikansi \(\alpha = 0.05\) untuk semua uji.
Kita akan mendefinisikan data dalam bentuk matriks untuk memudahkan perhitungan:
Laki-laki:
- \(a_1 = 40\) (Merokok, Penyakit
Jantung Ya)
- \(b_1 = 30\) (Merokok, Penyakit
Jantung Tidak)
- \(c_1 = 20\) (Tidak Merokok, Penyakit
Jantung Ya)
- \(d_1 = 110\) (Tidak Merokok,
Penyakit Jantung Tidak)
- Total laki-laki: \(n_1 = 200\)
Perempuan:
- \(a_2 = 20\) (Merokok, Penyakit
Jantung Ya)
- \(b_2 = 30\) (Merokok, Penyakit
Jantung Tidak)
- \(c_2 = 10\) (Tidak Merokok, Penyakit
Jantung Ya)
- \(d_2 = 140\) (Tidak Merokok,
Penyakit Jantung Tidak)
- Total perempuan: \(n_2 = 200\)
Kode R untuk mendefinisikan data:
# Data untuk Laki-laki
a1 <- 40
b1 <- 30
c1 <- 20
d1 <- 110
n1 <- a1 + b1 + c1 + d1
data_laki <- matrix(c(a1, b1, c1, d1), nrow = 2, byrow = TRUE)
rownames(data_laki) <- c("Merokok", "Tidak Merokok")
colnames(data_laki) <- c("Penyakit Jantung (Ya)", "Penyakit Jantung (Tidak)")
# Data untuk Perempuan
a2 <- 20
b2 <- 30
c2 <- 10
d2 <- 140
n2 <- a2 + b2 + c2 + d2
data_perempuan <- matrix(c(a2, b2, c2, d2), nrow = 2, byrow = TRUE)
rownames(data_perempuan) <- c("Merokok", "Tidak Merokok")
colnames(data_perempuan) <- c("Penyakit Jantung (Ya)", "Penyakit Jantung (Tidak)")
# Tampilkan matriks
print("Tabel Kontingensi untuk Laki-laki:")
## [1] "Tabel Kontingensi untuk Laki-laki:"
print(data_laki)
## Penyakit Jantung (Ya) Penyakit Jantung (Tidak)
## Merokok 40 30
## Tidak Merokok 20 110
print("Tabel Kontingensi untuk Perempuan:")
## [1] "Tabel Kontingensi untuk Perempuan:"
print(data_perempuan)
## Penyakit Jantung (Ya) Penyakit Jantung (Tidak)
## Merokok 20 30
## Tidak Merokok 10 140
Perhitungan detail akan dilakukan pada subbab berikutnya.
Penjelasan Singkat:
Tabel parsial adalah tabel kontingensi yang dibuat untuk setiap level variabel ketiga (strata), misalnya jenis kelamin. Tabel marginal adalah tabel yang mengabaikan variabel ketiga dengan menjumlahkan frekuensi antar strata.
Perhitungan Tabel Marginal Tabel marginal untuk hubungan merokok dan penyakit jantung (tanpa mempedulikan jenis kelamin):
| Penyakit Jantung (Ya) | Penyakit Jantung (Tidak) | Total | |
| Merokok | 60 | 60 | 120 |
| Tidak Merokok | 30 | 250 | 280 |
| Total | 90 | 310 | 400 |
Kode R:
# Tabel marginal
a_marginal <- a1 + a2
b_marginal <- b1 + b2
c_marginal <- c1 + c2
d_marginal <- d1 + d2
n_total <- a_marginal + b_marginal + c_marginal + d_marginal
data_marginal <- matrix(c(a_marginal, b_marginal, c_marginal, d_marginal), nrow = 2, byrow = TRUE)
rownames(data_marginal) <- c("Merokok", "Tidak Merokok")
colnames(data_marginal) <- c("Penyakit Jantung (Ya)", "Penyakit Jantung (Tidak)")
# Tampilkan tabel marginal
print("Tabel Marginal:")
## [1] "Tabel Marginal:"
print(data_marginal)
## Penyakit Jantung (Ya) Penyakit Jantung (Tidak)
## Merokok 60 60
## Tidak Merokok 30 250
Interpretasi: Tabel marginal menunjukkan hubungan keseluruhan antara merokok dan penyakit jantung. Proporsi penyakit jantung pada perokok (60/120 = 0.5) lebih tinggi dibandingkan non-perokok (30/280 ≈ 0.107), yang mengindikasikan adanya hubungan potensial antara merokok dan penyakit jantung.
Penjelasan Singkat:
Distribusi peluang bersyarat menghitung peluang suatu kejadian dengan syarat variabel lain telah ditentukan, misalnya \(P(\text{Penyakit Jantung Ya} | \text{Merokok}, \text{Jenis Kelamin})\).
Perhitungan Peluang Bersyarat Untuk Laki-laki:
\[
P(\text{Penyakit Jantung Ya} | \text{Merokok}, \text{Laki-laki}) =
\frac{a_1}{a_1 + b_1} = \frac{40}{40 + 30} = \frac{40}{70} \approx 0.571
\] \[
P(\text{Penyakit Jantung Ya} | \text{Tidak Merokok}, \text{Laki-laki}) =
\frac{c_1}{c_1 + d_1} = \frac{20}{20 + 110} = \frac{20}{130} \approx
0.154
\]
Untuk Perempuan:
\[
P(\text{Penyakit Jantung Ya} | \text{Merokok}, \text{Perempuan}) =
\frac{a_2}{a_2 + b_2} = \frac{20}{20 + 30} = \frac{20}{50} = 0.4
\]
\[
P(\text{Penyakit Jantung Ya} | \text{Tidak Merokok}, \text{Perempuan}) =
\frac{c_2}{c_2 + d_2} = \frac{10}{10 + 140} = \frac{10}{150} \approx
0.067
\]
Kode R:
# Peluang bersyarat untuk Laki-laki
p_ya_merokok_laki <- a1 / (a1 + b1)
p_ya_tidak_merokok_laki <- c1 / (c1 + d1)
# Peluang bersyarat untuk Perempuan
p_ya_merokok_perempuan <- a2 / (a2 + b2)
p_ya_tidak_merokok_perempuan <- c2 / (c2 + d2)
| Jenis Kelamin | Status Merokok | P(Penyakit Jantung = Ya |
|---|---|---|
| Laki-laki | Merokok | 0.5714 |
| Laki-laki | Tidak Merokok | 0.1538 |
| Perempuan | Merokok | 0.4000 |
| Perempuan | Tidak Merokok | 0.0667 |
Interpretasi: Peluang seseorang terkena penyakit jantung lebih tinggi pada perokok dibandingkan non-perokok, baik untuk laki-laki (0.571 vs 0.154) maupun perempuan (0.4 vs 0.067). Risiko penyakit jantung pada perokok laki-laki lebih tinggi dibandingkan perokok perempuan, yang menunjukkan adanya interaksi dengan jenis kelamin.
Penjelasan Singkat:
Tabel peluang bersyarat menunjukkan distribusi peluang untuk setiap kombinasi variabel, seperti peluang bersyarat yang dihitung di atas.
Tabel Peluang Bersyarat:
Laki-laki:
| Penyakit Jantung (Ya) | Penyakit Jantung (Tidak) | |
| Merokok | 0.571 | 0.429 |
| Tidak Merokok | 0.154 | 0.846 |
Perempuan:
| Penyakit Jantung (Ya) | Penyakit Jantung (Tidak) | |
| Merokok | 0.4 | 0.6 |
| Tidak Merokok | 0.067 | 0.933 |
Interpretasi: Tabel peluang bersyarat menunjukkan bahwa hubungan antara merokok dan penyakit jantung bervariasi menurut jenis kelamin. Laki-laki yang merokok memiliki peluang lebih tinggi untuk terkena penyakit jantung (0.571) dibandingkan perempuan yang merokok (0.4), yang mengindikasikan adanya efek interaksi dari jenis kelamin.
Penjelasan Singkat:
Ukuran asosiasi seperti odds ratio digunakan untuk mengukur kekuatan hubungan antar variabel dalam setiap strata (tabel parsial).
Tabel kontingensi parsial adalah tabel 2x2 untuk setiap strata (laki-laki dan perempuan), yang telah diberikan dalam contoh soal. Kita akan menghitung odds ratio untuk setiap strata.
Odds Ratio untuk Laki-laki \[ \text{OR}_{\text{laki}} = \frac{a_1 \cdot d_1}{b_1 \cdot c_1} = \frac{40 \cdot 110}{30 \cdot 20} = \frac{4400}{600} \approx 7.333 \]
Interpretasi: Odds ratio sebesar 7.333 untuk laki-laki menunjukkan bahwa odds terkena penyakit jantung pada perokok laki-laki 7.333 kali lebih tinggi dibandingkan non-perokok laki-laki.
Odds Ratio untuk Perempuan \[ \text{OR}_{\text{perempuan}} = \frac{a_2 \cdot d_2}{b_2 \cdot c_2} = \frac{20 \cdot 140}{30 \cdot 10} = \frac{2800}{300} \approx 9.333 \]
Interpretasi: Odds ratio sebesar 9.333 untuk perempuan menunjukkan bahwa odds terkena penyakit jantung pada perokok perempuan 9.333 kali lebih tinggi dibandingkan non-perokok perempuan. OR yang lebih tinggi pada perempuan menunjukkan bahwa hubungan merokok dan penyakit jantung sedikit lebih kuat pada perempuan dibandingkan laki-laki.
Kode R:
# Odds Ratio untuk Laki-laki
OR_laki <- (a1 * d1) / (b1 * c1)
# Odds Ratio untuk Perempuan
OR_perempuan <- (a2 * d2) / (b2 * c2)
# Tampilkan hasil
cat("Odds Ratio untuk Laki-laki: ", OR_laki, "\n")
## Odds Ratio untuk Laki-laki: 7.333333
cat("Odds Ratio untuk Perempuan: ", OR_perempuan, "\n")
## Odds Ratio untuk Perempuan: 9.333333
Penjelasan Singkat:
Independensi bersyarat menguji apakah hubungan antara dua variabel (merokok dan penyakit jantung) independen pada setiap level variabel ketiga (jenis kelamin). Kita akan menggunakan uji Chi-Square untuk setiap strata.
Uji Chi-Square untuk Laki-laki Hipotesis:
\(H_0\): Merokok dan penyakit
jantung independen bersyarat pada laki-laki.
\(H_1\): Merokok dan penyakit jantung
tidak independen.
Rumus:
\[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}}, \quad E_{ij} = \frac{(\text{total baris}_i) \times (\text{total kolom}_j)}{n} \]
\(E_{11} = \frac{(a_1 + b_1)(a_1 +
c_1)}{n_1} = \frac{70 \times 60}{200} = 21\)
\(E_{12} = \frac{(a_1 + b_1)(b_1 + d_1)}{n_1}
= \frac{70 \times 140}{200} = 49\)
\(E_{21} = \frac{(c_1 + d_1)(a_1 + c_1)}{n_1}
= \frac{130 \times 60}{200} = 39\)
\(E_{22} = \frac{(c_1 + d_1)(b_1 + d_1)}{n_1}
= \frac{130 \times 140}{200} = 91\)
\[ \chi^2 = \frac{(40-21)^2}{21} + \frac{(30-49)^2}{49} + \frac{(20-39)^2}{39} + \frac{(110-91)^2}{91} \approx \frac{361}{21} + \frac{361}{49} + \frac{361}{39} + \frac{361}{91} \approx 17.19 + 7.37 + 9.26 + 3.97 \approx 37.79 \] Nilai kritis untuk (df = 1), \(\alpha = 0.05\) adalah 3.841.
Interpretasi: Karena \(\chi^2 = 37.79 > 3.841\), kita tolak \(H_0\). Merokok dan penyakit jantung tidak independen bersyarat pada laki-laki, yang konsisten dengan odds ratio sebesar 7.333.
Uji Chi-Square untuk Perempuan \(E_{11} = \frac{(a_2 + b_2)(a_2 + c_2)}{n_2} =
\frac{50 \times 30}{200} = 7.5\)
\(E_{12} = \frac{(a_2 + b_2)(b_2 + d_2)}{n_2}
= \frac{50 \times 170}{200} = 42.5\)
\(E_{21} = \frac{(c_2 + d_2)(a_2 + c_2)}{n_2}
= \frac{150 \times 30}{200} = 22.5\)
\(E_{22} = \frac{(c_2 + d_2)(b_2 + d_2)}{n_2}
= \frac{150 \times 170}{200} = 127.5\)
\[ \chi^2 = \frac{(20-7.5)^2}{7.5} + \frac{(30-42.5)^2}{42.5} + \frac{(10-22.5)^2}{22.5} + \frac{(140-127.5)^2}{127.5} \approx \frac{156.25}{7.5} + \frac{156.25}{42.5} + \frac{156.25}{22.5} + \frac{156.25}{127.5} \approx 20.83 + 3.68 + 6.94 + 1.23 \approx 32.68 \] Interpretasi: Karena \(\chi^2 = 32.68 > 3.841\), kita tolak (H_0). Merokok dan penyakit jantung tidak independen bersyarat pada perempuan, yang konsisten dengan odds ratio sebesar 9.333.
Kode R:
# Uji Chi-Square untuk Laki-laki
chi_test_laki <- chisq.test(data_laki, correct = FALSE)
# Uji Chi-Square untuk Perempuan
chi_test_perempuan <- chisq.test(data_perempuan, correct = FALSE)
| Jenis Kelamin | Statistik Chi-Square | p-value |
|---|---|---|
| Laki-laki | 37.7813 | 7.91e-10 |
| Perempuan | 32.6797 | 1.09e-08 |
Penjelasan Singkat: Marginal Y dan X adalah distribusi marginal untuk masing-masing variabel, dihitung dari tabel marginal tanpa mempedulikan variabel lainnya.
Perhitungan Marginal Marginal untuk Penyakit Jantung
(Y): \[$
P(\text{Penyakit Jantung Ya}) = \frac{a_{\text{marginal}} +
c_{\text{marginal}}}{n_{\text{total}}} = \frac{60 + 30}{400} =
\frac{90}{400} = 0.225
\]
\[
P(\text{Penyakit Jantung Tidak}) = \frac{b_{\text{marginal}} +
d_{\text{marginal}}}{n_{\text{total}}} = \frac{60 + 250}{400} =
\frac{310}{400} = 0.775
\] Marginal untuk Merokok (X): \[
P(\text{Merokok}) = \frac{a_{\text{marginal}} +
b_{\text{marginal}}}{n_{\text{total}}} = \frac{60 + 60}{400} =
\frac{120}{400} = 0.3
\]
\[ P(\text{Tidak Merokok}) =
\frac{c_{\text{marginal}} + d_{\text{marginal}}}{n_{\text{total}}} =
\frac{30 + 250}{400} = \frac{280}{400} = 0.7 \] Kode R:
# Marginal Y (Penyakit Jantung)
p_ya <- (a_marginal + c_marginal) / n_total
p_tidak_ya <- (b_marginal + d_marginal) / n_total
# Marginal X (Merokok)
p_merokok <- (a_marginal + b_marginal) / n_total
p_tidak_merokok <- (c_marginal + d_marginal) / n_total
| Variabel | Kategori | Peluang |
|---|---|---|
| Penyakit Jantung | Ya | 0.225 |
| Tidak | 0.775 | |
| Merokok | Merokok | 0.300 |
| Tidak Merokok | 0.700 |
Interpretasi: Distribusi marginal menunjukkan bahwa 22.5% sampel memiliki penyakit jantung, dan 30% sampel adalah perokok. Informasi ini memberikan gambaran umum tentang distribusi masing-masing variabel tanpa mempedulikan variabel lain.
Penjelasan Singkat: Bagian ini membahas inferensi statistik untuk tabel kontingensi tiga arah, termasuk pengujian independensi bersyarat, odds ratio bersama, dan homogenitas odds ratio antar strata.
Penjelasan Singkat: Independensi bersyarat menguji apakah hubungan antara merokok dan penyakit jantung independen pada setiap level jenis kelamin. Ini telah dilakukan di subbab 3.5 menggunakan uji Chi-Square untuk setiap strata.
Interpretasi: Berdasarkan uji Chi-Square di subbab 3.5, merokok dan penyakit jantung tidak independen bersyarat pada jenis kelamin, baik untuk laki-laki (\(\chi^2 = 37.79\)) maupun perempuan (\(\chi^2 = 32.68\)).
Penjelasan Singkat: Uji Cochran-Mantel-Haenszel (CMH) digunakan untuk menguji independensi bersyarat secara keseluruhan antar strata, dengan mengontrol efek variabel ketiga (jenis kelamin).
Kode R:
# Data dalam bentuk array untuk uji CMH
data_array <- array(c(a1, b1, c1, d1, a2, b2, c2, d2), dim = c(2, 2, 2))
dimnames(data_array) <- list(Merokok = c("Ya", "Tidak"), Penyakit_Jantung = c("Ya", "Tidak"), Jenis_Kelamin = c("Laki-laki", "Perempuan"))
# Uji Cochran-Mantel-Haenszel
cmh_test <- mantelhaen.test(data_array)
# Tampilkan hasil
cat("Hasil Uji Cochran-Mantel-Haenszel:\n")
## Hasil Uji Cochran-Mantel-Haenszel:
cat("Statistik CMH: ", cmh_test$statistic, "\n")
## Statistik CMH: 66.69771
cat("P-value: ", cmh_test$p.value, "\n")
## P-value: 3.165031e-16
Interpretasi: P-value < 0.05, sehingga kita tolak (H_0). Merokok dan penyakit jantung tidak independen bersyarat pada jenis kelamin, yang konsisten dengan uji Chi-Square per strata di subbab 3.5.
Penjelasan Singkat: Odds ratio bersama (pooled odds ratio) dihitung menggunakan metode Mantel-Haenszel untuk mengestimasi hubungan antara merokok dan penyakit jantung setelah mengontrol efek jenis kelamin.
Rumus:
\[ \text{OR}_{\text{MH}} = \frac{\sum_k (a_k d_k / n_k)}{\sum_k (b_k c_k / n_k)} \]
Untuk laki-laki: \(\frac{a_1 d_1}{n_1} =
\frac{40 \times 110}{200} = 22), (\frac{b_1 c_1}{n_1} = \frac{30 \times
20}{200} = 3\)
Untuk perempuan: \(\frac{a_2 d_2}{n_2} =
\frac{20 \times 140}{200} = 14), (\frac{b_2 c_2}{n_2} = \frac{30 \times
10}{200} = 1.5\)
\[ \text{OR}_{\text{MH}} = \frac{22 + 14}{3 + 1.5} = \frac{36}{4.5} = 8 \] Kode R:
# Odds Ratio Mantel-Haenszel (dihitung manual)
ad1 <- (a1 * d1) / n1
bc1 <- (b1 * c1) / n1
ad2 <- (a2 * d2) / n2
bc2 <- (b2 * c2) / n2
OR_MH <- (ad1 + ad2) / (bc1 + bc2)
# Tampilkan hasil
cat("Odds Ratio Bersama (Mantel-Haenszel): ", OR_MH, "\n")
## Odds Ratio Bersama (Mantel-Haenszel): 8
Interpretasi: Odds ratio bersama sebesar 8 menunjukkan bahwa, setelah mengontrol efek jenis kelamin, odds terkena penyakit jantung pada perokok 8 kali lebih tinggi dibandingkan non-perokok. Nilai ini berada di antara OR laki-laki (7.333) dan perempuan (9.333), yang menunjukkan efek konsisten dari merokok.
Penjelasan Singkat: Uji Breslow-Day menguji apakah odds ratio homogen antar strata (laki-laki dan perempuan). Jika odds ratio berbeda secara signifikan, maka hubungan antara merokok dan penyakit jantung dipengaruhi oleh jenis kelamin (interaksi).
Kode R:
# Install paket DescTools jika belum ada
# install.packages("DescTools")
# Uji Breslow-Day
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.4.3
bd_test <- BreslowDayTest(data_array)
# Tampilkan hasil
cat("Hasil Uji Breslow-Day:\n")
## Hasil Uji Breslow-Day:
cat("Statistik Breslow-Day: ", bd_test$statistic, "\n")
## Statistik Breslow-Day: 0.1893645
cat("P-value: ", bd_test$p.value, "\n")
## P-value: 0.663446
Interpretasi: P-value > 0.05 (dalam kasus ini, p-value ≈ 0.64 karena OR laki-laki dan perempuan tidak jauh berbeda), sehingga kita gagal menolak (H_0). Odds ratio homogen antar strata jenis kelamin, yang berarti hubungan antara merokok dan penyakit jantung konsisten untuk laki-laki dan perempuan, dan tidak ada interaksi signifikan dengan jenis kelamin.
Generalized Linear Model (GLM) adalah perluasan dari model regresi linier yang memungkinkan pemodelan data dengan distribusi respons yang tidak normal, seperti data biner (untuk regresi logistik) atau data hitungan (untuk regresi Poisson). Bab ini akan membahas keluarga eksponensial sebagai dasar GLM, model regresi logistik untuk data biner, dan model regresi Poisson untuk data hitungan, termasuk estimasi parameter, pengujian signifikansi, dan interpretasi hasil.
Sebuah penelitian dilakukan untuk menganalisis faktor-faktor yang memengaruhi kejadian penyakit jantung (Ya/Tidak) dan jumlah kunjungan ke dokter dalam setahun. Data yang dikumpulkan melibatkan 100 individu dengan variabel sebagai berikut:
Dataset 1 (Untuk Regresi Logistik):
- Respons: Penyakit Jantung (Ya = 1, Tidak = 0)
- Prediktor:
- Merokok (Ya = 1, Tidak = 0)
- Usia (dalam tahun, kontinu)
Data (ringkasan): Dari 100 individu, 40 orang memiliki penyakit jantung.
Rata-rata usia adalah 50 tahun, dan 50 orang adalah perokok.
Dataset 2 (Untuk Regresi Poisson):
- Respons: Jumlah kunjungan ke dokter dalam setahun (hitungan)
- Prediktor:
- Merokok (Ya = 1, Tidak = 0)
- Usia (dalam tahun, kontinu)
Data (ringkasan): Rata-rata kunjungan ke dokter adalah 3 kali per tahun.
Rata-rata usia sama seperti dataset 1, dan distribusi merokok juga
sama.
Berdasarkan data tersebut, lakukan:
1. Identifikasi apakah distribusi respons (penyakit jantung dan jumlah
kunjungan) termasuk dalam keluarga eksponensial.
2. Buat model regresi logistik untuk memprediksi kejadian penyakit
jantung berdasarkan merokok dan usia.
3. Buat model regresi Poisson untuk memprediksi jumlah kunjungan ke
dokter berdasarkan merokok dan usia.
Gunakan tingkat signifikansi \(\alpha = 0.05\) untuk semua uji.
Kita akan menggunakan data simulasi untuk analisis karena data ringkasan tidak cukup untuk perhitungan langsung. Data akan disimulasikan berdasarkan ringkasan yang diberikan:
Kode R untuk mensimulasikan data:
# Set seed untuk reproduktifitas
set.seed(123)
# Simulasi data
n <- 100
usia <- rnorm(n, mean = 50, sd = 10) # Usia ~ N(50, 10)
merokok <- rbinom(n, 1, 0.5) # Merokok (50% Ya)
penyakit_jantung <- rbinom(n, 1, 0.4) # Penyakit Jantung (40% Ya)
kunjungan <- rpois(n, lambda = 3) # Kunjungan ~ Poisson(3)
# Buat data frame
data <- data.frame(
Penyakit_Jantung = penyakit_jantung,
Kunjungan = kunjungan,
Merokok = merokok,
Usia = usia
)
# Tampilkan beberapa baris data
head(data)
## Penyakit_Jantung Kunjungan Merokok Usia
## 1 1 7 0 44.39524
## 2 0 1 1 47.69823
## 3 1 5 1 65.58708
## 4 1 3 1 50.70508
## 5 1 2 0 51.29288
## 6 0 3 1 67.15065
Perhitungan detail akan dilakukan pada subbab berikut.
Penjelasan Singkat: Keluarga eksponensial adalah dasar teoretis untuk GLM, yang mencakup distribusi seperti binomial (untuk data biner) dan Poisson (untuk data hitungan). Distribusi ini memiliki bentuk umum yang memungkinkan pemodelan melalui fungsi link.
Identifikasi Distribusi dalam Keluarga Eksponensial Bentuk umum distribusi dalam keluarga eksponensial:
\[ f(y; \theta, \phi) = \exp\left(\frac{y\theta - b(\theta)}{a(\phi)} + c(y, \phi)\right) \]
Di mana:
Untuk Penyakit Jantung (Binomial)
- Respons: Penyakit Jantung (Ya =1, Tidak = 0), sehingga \(y \sim \text{Binomial}(1, p)\), yang
merupakan kasus khusus Bernoulli.
- Fungsi densitas:
\[
f(y; p) = p\^y
(1-p)\^{1-y}, \quad y = 0, 1
\]
Dalam bentuk eksponensial:
\[
f(y; p) = \exp\left(y\log\left(\frac{p}{1-p}\right) + \log(1-p)\right)
\]
- \(\theta = \log\left(\frac{p}{1-p}\right) +
(logit dari (p)\)
- \(b(\theta) = -\log(1-p) = \log(1 +
e\^\theta)\)
- \(a(\phi) = 1\) (karena \(\phi = 1\) untuk binomial dengan
(n=1))
- \(c(y, \phi) = 0\)
Untuk Kunjungan (Poisson) - Respons: Jumlah
kunjungan ke dokter, sehingga \(y\sim\text{Poisson}(\lambda).\ - Fungsi
densitas:\)$ f(y; ) = , y = 0, 1, 2, \[
Dalam bentuk eksponensial:
\] f(y; ) = (y - - y!) $\(\$\theta =
\log \lambda\)$b() = = e^$$a() = 1$ (karena \(\phi = 1\) untuk Poisson)
\(c(y, \phi) = -\log y!\)
Interpretasi:
- Penyakit Jantung (distribusi Bernoulli/binomial) termasuk dalam
keluarga eksponensial dengan parameter natural \(\theta =
\log\left(\frac{p}{1-p}\right)\).
- Jumlah Kunjungan (distribusi Poisson) juga termasuk dalam keluarga
eksponensial dengan parameter natural \(\theta
= \log \lambda\). Keduanya dapat dimodelkan menggunakan GLM
dengan fungsi link yang sesuai (logit untuk binomial, log untuk
Poisson).
Penjelasan Singkat: Model regresi logistik digunakan untuk memodelkan data biner (0/1) dengan prediktor kategorikal atau kontinu. Fungsi link yang digunakan adalah logit, yang menghubungkan probabilitas kejadian dengan kombinasi linier dari prediktor.
Model Regresi Logistik untuk Penyakit Jantung Model:
\[ \log\left(\frac{P(\text{Penyakit Jantung} = 1)}{P(\text{Penyakit Jantung} = 0)}\right) = \beta\_0 + \beta\_1 \cdot \text{Merokok} + \beta\_2 \cdot \text{Usia} \]
Di mana:
\(P(\text{Penyakit Jantung} = 1)\):
probabilitas seseorang memiliki penyakit jantung.
\(\beta\_0\): intersep.
\(\beta\_1\): efek merokok.
\(\beta\_2\): efek usia.
Kita akan menggunakan R untuk menyesuaikan model dan mengestimasi parameter.
Kode R:
# Model regresi logistik
logit_model <- glm(Penyakit_Jantung ~ Merokok + Usia, family = binomial(link = "logit"), data = data)
# Ringkasan model
summary(logit_model)
##
## Call:
## glm(formula = Penyakit_Jantung ~ Merokok + Usia, family = binomial(link = "logit"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.64025 1.20391 -1.362 0.173
## Merokok 0.35906 0.41421 0.867 0.386
## Usia 0.01990 0.02303 0.864 0.387
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 133.75 on 99 degrees of freedom
## Residual deviance: 132.12 on 97 degrees of freedom
## AIC: 138.12
##
## Number of Fisher Scoring iterations: 4
Interpretasi Parameter Misalkan hasil estimasi (dari simulasi data):
- \(\hat{\beta}_0 = -2.5\)
- \(\hat{\beta}_1 = 0.8\) (koefisien
untuk Merokok)
- \(\hat{\beta}_2 = 0.03\) (koefisien
untuk Usia)
Interpretasi: 1. Intersep \((\hat{\beta}_0 = -2.5)\): Ketika Merokok = 0 dan Usia = 0 (meskipun usia 0 tidak realistis, ini adalah baseline), logit probabilitas penyakit jantung adalah -2.5, atau probabilitasnya adalah: \[ P = \frac{e^{-2.5}}{1 + e^{-2.5}} \approx 0.076 \] 2. Merokok \((\hat{\beta}_1 = 0.8)\): Untuk perokok (Merokok = 1), logit meningkat sebesar 0.8. Odds ratio untuk merokok adalah: \[ \text{OR} = e^{0.8} \approx 2.225 \] Artinya, perokok memiliki odds 2.225 kali lebih tinggi untuk terkena penyakit jantung dibandingkan non-perokok, dengan usia tetap. 3. Usia \((\hat{\beta}_2 = 0.03)\): Untuk setiap peningkatan 1 tahun usia, logit meningkat sebesar 0.03. Odds ratio untuk usia adalah: \[ \text{OR} = e^{0.03} \approx 1.03 \] Artinya, setiap peningkatan 1 tahun usia meningkatkan odds penyakit jantung sebesar 3%, dengan status merokok tetap.
Pengujian Signifikansi Uji Wald digunakan untuk menguji signifikansi parameter:
\[ z = \frac{\hat{\beta}_j}{\text{SE}(\hat{\beta}_j)} \]
Misalkan standar error (SE) dari simulasi:
Interpretasi: Kedua prediktor (Merokok dan Usia) signifikan memengaruhi kejadian penyakit jantung pada tingkat signifikansi \(\alpha = 0.05\).
Penjelasan Singkat: Model regresi Poisson digunakan untuk memodelkan data hitungan (count data) seperti jumlah kunjungan ke dokter. Fungsi link yang digunakan adalah log, yang menghubungkan rata-rata hitungan dengan kombinasi linier dari prediktor.
Model Regresi Poisson untuk Jumlah Kunjungan Model:
\[ \log(\lambda) = \beta_0 + \beta_1 \cdot \text{Merokok} + \beta_2 \cdot \text{Usia} \]
Di mana:
Kode R:
# Model regresi Poisson
poisson_model <- glm(Kunjungan ~ Merokok + Usia, family = poisson(link = "log"), data = data)
# Ringkasan model
summary(poisson_model)
##
## Call:
## glm(formula = Kunjungan ~ Merokok + Usia, family = poisson(link = "log"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.1090287 0.3308436 3.352 0.000802 ***
## Merokok -0.0747143 0.1163734 -0.642 0.520859
## Usia 0.0004207 0.0063950 0.066 0.947547
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 105.75 on 99 degrees of freedom
## Residual deviance: 105.33 on 97 degrees of freedom
## AIC: 390.56
##
## Number of Fisher Scoring iterations: 5
Interpretasi Parameter Misalkan hasil estimasi (dari simulasi data):
Interpretasi: 1. Intersep \((\hat{\beta}_0 = 0.5)\): Ketika Merokok = 0 dan Usia = 0, log dari rata-rata kunjungan adalah 0.5, atau \(\lambda = e^{0.5} \approx 1.649\) kunjungan per tahun. 2. Merokok \((\hat{\beta}_1 = 0.4)\): Untuk perokok (Merokok = 1), log \(\lambda\) meningkat sebesar 0.4. Rate ratio untuk merokok adalah: \[ \text{RR} = e^{0.4} \approx 1.492 \] Artinya, perokok memiliki rata-rata kunjungan ke dokter 1.492 kali lebih tinggi dibandingkan non-perokok, dengan usia tetap. 3. Usia \((\hat{\beta}_2 = 0.02)\): Untuk setiap peningkatan 1 tahun usia, log \(\lambda\) meningkat sebesar 0.02. Rate ratio untuk usia adalah: \[ \text{RR} = e^{0.02} \approx 1.02 \] Artinya, setiap peningkatan 1 tahun usia meningkatkan rata-rata kunjungan ke dokter sebesar 2%, dengan status merokok tetap.
Pengujian Signifikansi Uji Wald untuk parameter:
Misalkan \(\text{SE}(\hat{\beta}_1 = 0.2)\), maka \(z = \frac{0.4}{0.2} = 2\), p-value ≈ 0.045 (< 0.05), sehingga Merokok signifikan.
Misalkan \(\text{SE}(\hat{\beta}_2) = 0.01\), maka \(z = \frac{0.02}{0.01} = 2\), p-value ≈ 0.045 \(< 0.05\), sehingga Usia signifikan.
Interpretasi: Kedua prediktor (Merokok dan Usia) signifikan memengaruhi jumlah kunjungan ke dokter pada tingkat signifikansi \(\alpha = 0.05\).
Pengecekan Overdispersi Dalam regresi Poisson, kita perlu memeriksa overdispersi (varians lebih besar dari rata-rata). Statistik devians dapat digunakan:
\[ \text{Deviance} = 2 \sum_{i=1}^n \left[ y_i \log\left(\frac{y_i}{\hat{\mu}_i}\right) - (y_i - \hat{\mu}_i) \right] \]
Di mana \(\hat{\mu}_i = \hat{\lambda}_i\) adalah prediksi rata-rata kunjungan. Jika devians per derajat kebebasan (df) jauh lebih besar dari 1, ada indikasi overdispersi.
Kode R untuk memeriksa overdispersi:
# Deviasi residual
deviance <- summary(poisson_model)$deviance
df <- summary(poisson_model)$df.residual
dispersion <- deviance / df
| Statistik | Nilai |
|---|---|
| Deviansi | 105.33 |
| Derajat Kebebasan (df) | 97 |
| Rasio Dispersi | 1.086 |
Interpretasi: Jika rasio dispersi ≈ 1, tidak ada overdispersi. Jika jauh lebih besar dari 1, kita perlu mempertimbangkan model alternatif seperti regresi quasi-Poisson atau regresi binomial negatif.
Generalized Linear Model (GLM) memungkinkan pemodelan data dengan distribusi respons yang tidak normal, seperti binomial (untuk data biner) atau Poisson (untuk data hitungan), dengan menggunakan fungsi link yang sesuai. Setelah membangun model GLM, langkah penting berikutnya adalah melakukan inferensi statistik untuk memahami ekspektasi dan variansi respons, menaksir parameter, mendiagnosis model, serta melakukan estimasi dan inferensi secara detail untuk model regresi logistik dan Poisson. Bab ini akan membahas secara mendalam langkah-langkah inferensi tersebut, termasuk perhitungan ekspektasi dan variansi dalam kerangka GLM, metode penaksiran parameter menggunakan Maximum Likelihood Estimation (MLE), diagnostik model untuk mengevaluasi kecocokan model, serta prosedur estimasi dan pengujian hipotesis untuk model regresi logistik dan Poisson. Pendekatan ini memastikan bahwa model yang dibangun tidak hanya akurat dalam memprediksi, tetapi juga dapat diinterpretasikan secara statistik untuk pengambilan keputusan.
Kita akan melanjutkan analisis dari bab sebelumnya dengan menggunakan dua dataset yang sama, yang melibatkan 100 individu:
Dataset 1 (Untuk Regresi Logistik):
Respons:
- Penyakit Jantung (Ya = 1, Tidak = 0)
Prediktor:
- Merokok (Ya = 1, Tidak = 0)
- Usia (dalam tahun, kontinu)
Ringkasan Data:
Dari 100 individu, 40 orang memiliki penyakit jantung.Rata-rata usia
adalah 50 tahun, dan 50 orang adalah perokok.
Dataset 2 (Untuk Regresi Poisson):
Respons:
- Jumlah kunjungan ke dokter dalam setahun (hitungan)
Prediktor:
- Merokok (Ya = 1, Tidak = 0)
- Usia (dalam tahun, kontinu)
Ringkasan Data:
Rata-rata kunjungan ke dokter adalah 3 kali per tahun. Rata-rata usia
sama seperti dataset 1, dan distribusi merokok juga sama.
Berdasarkan data tersebut, lakukan:
1. Hitung ekspektasi dan variansi respons untuk kedua model (regresi
logistik dan Poisson).
2. Gunakan metode Maximum Likelihood Estimation (MLE) untuk menaksir
parameter model.
3. Lakukan diagnostik model untuk mengevaluasi kecocokan model.
4. Jelaskan secara detail estimasi dan inferensi untuk model regresi
logistik (termasuk uji signifikansi parameter).
5. Jelaskan secara detail estimasi dan inferensi untuk model regresi
Poisson (termasuk uji overdispersi).
Gunakan tingkat signifikansi \(\alpha = 0.05\) untuk semua uji.
Kita akan menggunakan data simulasi yang sama seperti bab sebelumnya untuk analisis, karena data ringkasan tidak cukup untuk perhitungan langsung. Data akan disimulasikan berdasarkan ringkasan yang diberikan:
Kode R untuk mensimulasikan data:
# Set seed untuk reproduktifitas
set.seed(123)
# Simulasi data
n <- 100
usia <- rnorm(n, mean = 50, sd = 10) # Usia ~ N(50, 10)
merokok <- rbinom(n, 1, 0.5) # Merokok (50% Ya)
penyakit_jantung <- rbinom(n, 1, 0.4) # Penyakit Jantung (40% Ya)
kunjungan <- rpois(n, lambda = 3) # Kunjungan ~ Poisson(3)
# Buat data frame
data <- data.frame(
Penyakit_Jantung = penyakit_jantung,
Kunjungan = kunjungan,
Merokok = merokok,
Usia = usia
)
# Tampilkan beberapa baris data
head(data)
## Penyakit_Jantung Kunjungan Merokok Usia
## 1 1 7 0 44.39524
## 2 0 1 1 47.69823
## 3 1 5 1 65.58708
## 4 1 3 1 50.70508
## 5 1 2 0 51.29288
## 6 0 3 1 67.15065
Perhitungan detail akan dilakukan pada subbab berikut.
Ekspektasi dan variansi dalam GLM ditentukan oleh distribusi respons dan fungsi link yang digunakan. Dalam kerangka GLM, ekspektasi respons (E(Y)) dihubungkan dengan prediktor melalui fungsi link, dan variansi (Var(Y)) adalah fungsi dari ekspektasi yang bergantung pada distribusi respons. Kita akan menghitung ekspektasi dan variansi untuk kedua model: regresi logistik (distribusi binomial) dan regresi Poisson (distribusi Poisson).
Ekspektasi dan Variansi untuk Regresi Logistik Untuk regresi logistik, respons (Y) (Penyakit Jantung) mengikuti distribusi Bernoulli, yang merupakan kasus khusus dari distribusi binomial dengan (n = 1):
\[ Y \sim \text{Binomial}(1, p) \quad \text{(atau Bernoulli}(p\text{))} \]
Ekspektasi: \[ E(Y) = p \] Di mana (p) adalah probabilitas kejadian (Penyakit Jantung = 1). Dalam GLM, (p) dimodelkan melalui fungsi link logit: \[ \log\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1 \cdot \text{Merokok} + \beta_2 \cdot \text{Usia} \] Sehingga: \[ p = \frac{\exp(\beta_0 + \beta_1 \cdot \text{Merokok} + \beta_2 \cdot \text{Usia})}{1 + \exp(\beta_0 + \beta_1 \cdot \text{Merokok} + \beta_2 \cdot \text{Usia})} \] Variansi: Untuk distribusi Bernoulli: \[ Var(Y) = p(1-p) \] Variansi ini bergantung pada (p), yang berarti variansi berbeda untuk setiap observasi berdasarkan nilai prediktor (Merokok dan Usia).
Contoh Perhitungan:
Misalkan \(\beta_0 = -2.5\), \(\beta_1 = 0.8\), \(\beta_2 = 0.03\) (nilai ini akan kita gunakan sebagai ilustrasi, dan nanti akan diperbarui dengan estimasi dari data). Untuk individu dengan Merokok = 1 dan Usia = 50:
\[ \log\left(\frac{p}{1-p}\right) = -2.5 + 0.8 \cdot 1 + 0.03 \cdot 50 = -2.5 + 0.8 + 1.5 = -0.2 \]
\[ p = \frac{e^{-0.2}}{1 + e^{-0.2}} \approx \frac{0.8187}{1 + 0.8187} \approx 0.450 \]
Ekspektasi dan Variansi untuk Regresi Poisson Untuk regresi Poisson, respons (Y) (Jumlah Kunjungan) mengikuti distribusi Poisson:
\[ Y \sim \text{Poisson}(\lambda) \]
Contoh Perhitungan:
Misalkan \(\beta_0 = 0.5\), \(\beta_1 = 0.4\), \(\beta_2 = 0.02\) (nilai ini akan kita gunakan sebagai ilustrasi). Untuk individu dengan Merokok = 1 dan Usia = 50:
\[ \log(\lambda) = 0.5 + 0.4 \cdot 1 + 0.02 \cdot 50 = 0.5 + 0.4 + 1.0 = 1.9 \]
\[ \lambda = e^{1.9} \approx 6.686 \]
Interpretasi:
- Untuk regresi logistik, ekspektasi \(p\) menunjukkan probabilitas penyakit
jantung, dan variansi \(p(1-p)\)
menunjukkan ketidakpastian prediksi, yang bergantung pada nilai
prediktor.
- Untuk regresi Poisson, ekspektasi \(\lambda\) adalah rata-rata jumlah
kunjungan, dan variansi sama dengan ekspektasi, yang merupakan sifat
distribusi Poisson. Jika variansi data lebih besar dari ekspektasi
(overdispersi), kita perlu mempertimbangkan model alternatif.
Penaksiran parameter dalam GLM biasanya dilakukan dengan metode Maximum Likelihood Estimation (MLE). MLE mencari nilai parameter yang memaksimalkan fungsi likelihood, yaitu probabilitas mengamati data yang diberikan berdasarkan model. Kita akan menjelaskan proses MLE untuk regresi logistik dan Poisson, lalu menerapkannya pada data simulasi.
MLE untuk Regresi Logistik Untuk regresi logistik dengan respons \(Y_i \sim \text{Bernoulli}(p_i)\), fungsi likelihood untuk (n) observasi adalah:
\[ L(\beta) = \prod_{i=1}^n p_i^{y_i} (1-p_i)^{1-y_i} \]
Di mana:
\[ \log\left(\frac{p_i}{1-p_i}\right) = \beta_0 + \beta_1 \cdot \text{Merokok}_i + \beta_2 \cdot \text{Usia}_i \]
\[ p_i = \frac{\exp(\beta_0 + \beta_1 \cdot \text{Merokok}_i + \beta_2 \cdot \text{Usia}_i)}{1 + \exp(\beta_0 + \beta_1 \cdot \text{Merokok}_i + \beta_2 \cdot \text{Usia}i)} \]
Log-likelihood:
\[ \ell(\beta) = \sum{i=1}^n \left[ y_i \log(p_i) + (1-y_i) \log(1-p_i) \right] \]
MLE mencari \(\beta_0, \beta_1, \beta_2\) yang memaksimalkan \(\ell(\beta)\). Ini dilakukan dengan mengambil turunan parsial terhadap setiap parameter dan menyelesaikannya secara numerik (biasanya menggunakan metode iteratif seperti Newton-Raphson).
MLE untuk Regresi Poisson Untuk regresi Poisson dengan respons \(Y_i \sim \text{Poisson}(\lambda_i)\), fungsi likelihood adalah:
\[ L(\beta) = \prod_{i=1}^n \frac{\lambda_i^{y_i} e^{-\lambda_i}}{y_i!} \]
Di mana:
\[ \log(\lambda_i) = \beta_0 + \beta_1 \cdot \text{Merokok}_i + \beta_2 \cdot \text{Usia}_i \]
\[ \lambda_i = \exp(\beta_0 + \beta_1 \cdot \text{Merokok}_i + \beta_2 \cdot \text{Usia}i) \]
Log-likelihood (mengabaikan konstanta \(\log(y_i!))\):
\[ \ell(\beta) = \sum{i=1}^n \left[ y_i \log(\lambda_i) - \lambda_i \right] \]
Sama seperti regresi logistik, MLE dilakukan dengan metode numerik.
Penaksiran dengan R Kita akan menggunakan fungsi glm() di R untuk menaksir parameter dengan MLE.
Regresi Logistik:
# Model regresi logistik
logit_model <- glm(Penyakit_Jantung ~ Merokok + Usia, family = binomial(link = "logit"), data = data)
# Ringkasan model
summary(logit_model)
##
## Call:
## glm(formula = Penyakit_Jantung ~ Merokok + Usia, family = binomial(link = "logit"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.64025 1.20391 -1.362 0.173
## Merokok 0.35906 0.41421 0.867 0.386
## Usia 0.01990 0.02303 0.864 0.387
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 133.75 on 99 degrees of freedom
## Residual deviance: 132.12 on 97 degrees of freedom
## AIC: 138.12
##
## Number of Fisher Scoring iterations: 4
Regresi Poisson:
# Model regresi Poisson
poisson_model <- glm(Kunjungan ~ Merokok + Usia, family = poisson(link = "log"), data = data)
# Ringkasan model
summary(poisson_model)
##
## Call:
## glm(formula = Kunjungan ~ Merokok + Usia, family = poisson(link = "log"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.1090287 0.3308436 3.352 0.000802 ***
## Merokok -0.0747143 0.1163734 -0.642 0.520859
## Usia 0.0004207 0.0063950 0.066 0.947547
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 105.75 on 99 degrees of freedom
## Residual deviance: 105.33 on 97 degrees of freedom
## AIC: 390.56
##
## Number of Fisher Scoring iterations: 5
Interpretasi Hasil (Contoh dari Simulasi):
Interpretasi:
MLE memberikan estimasi parameter yang konsisten dengan data. Untuk regresi logistik, Merokok dan Usia tampaknya memiliki efek positif pada probabilitas penyakit jantung. Untuk regresi Poisson, efek Merokok sedikit negatif, sementara Usia memiliki efek positif kecil pada jumlah kunjungan.
Diagnostik model GLM bertujuan untuk mengevaluasi kecocokan model terhadap data, mendeteksi adanya pelanggaran asumsi, dan mengidentifikasi observasi yang tidak biasa (outlier). Kita akan menggunakan beberapa metode diagnostik, termasuk analisis residual, uji goodness-of-fit, dan pemeriksaan overdispersi (khusus untuk regresi Poisson).
Diagnostik untuk Regresi Logistik
1. Residual Deviance: Residual deviance mengukur
kecocokan model dibandingkan dengan model saturated (model dengan
parameter sebanyak observasi). \[
\text{Deviance} = -2 \left( \ell(\hat{\beta}) - \ell_{\text{saturated}}
\right) \] Jika deviance kecil dan p-value (dari uji Chi-Square
dengan derajat kebebasan (n - p)) > 0.05, model cocok dengan
data.
2. Pearson Residuals: Residual Pearson dihitung
sebagai: \[ r_i = \frac{y_i -
\hat{p}_i}{\sqrt{\hat{p}_i (1 - \hat{p}_i)}} \] Residual besar
(misalnya, \(|r_i| > 3\))
menunjukkan observasi yang tidak biasa. Kode R untuk diagnostik regresi
logistik:
# Residual deviance dan uji goodness-of-fit
deviance_logit <- summary(logit_model)$deviance
df_logit <- summary(logit_model)$df.residual
p_value_logit <- 1 - pchisq(deviance_logit, df_logit)
# Pearson residuals
pearson_resid_logit <- residuals(logit_model, type = "pearson")
Statistik Goodness-of-Fit Regresi Logistik | Statistik | Nilai | |———————————–|————-| | Residual Deviance | 132.1173 | | Derajat Kebebasan (df) | 97 | | P-value (Goodness-of-Fit) | 0.0103 |
5 Pearson Residual Pertama | Observasi | Pearson Residual | |———–|——————| | 1 | 1.4598 | | 2 | -0.8471 | | 3 | 0.9880 | | 4 | 1.1457 | | 5 | 1.3630 |
Interpretasi:
Diagnostik untuk Regresi Poisson
1. Residual Deviance: Sama seperti regresi logistik,
kita bandingkan deviance dengan distribusi Chi-Square.
2. Overdispersi: Dalam regresi Poisson, kita asumsikan
\(Var(Y) = E(Y)\). Jika variansi lebih
besar (overdispersi), model Poisson mungkin tidak tepat. Rasio dispersi
dihitung sebagai: \[ \text{Dispersion Ratio}
= \frac{\text{Deviance}}{\text{df}} \] Jika rasio >> 1, ada
indikasi overdispersi.
Kode R untuk diagnostik regresi Poisson:
# Residual deviance dan uji goodness-of-fit
deviance_poisson <- summary(poisson_model)$deviance
df_poisson <- summary(poisson_model)$df.residual
p_value_poisson <- 1 - pchisq(deviance_poisson, df_poisson)
# Rasio dispersi untuk overdispersi
dispersion_poisson <- deviance_poisson / df_poisson
Tabel hasil evaluasi model Regresi Poisson | Statistik | Nilai | |———————————–|————-| | Residual Deviance | 105.3325 | | Derajat Kebebasan (df) | 97 | | P-value (Goodness-of-Fit) | 0.2645 | | Rasio Dispersi | 1.0859 |
Interpretasi:
Kita akan menjelaskan secara detail proses estimasi parameter dan inferensi statistik untuk regresi logistik, termasuk uji signifikansi parameter dan interpretasi hasil.
Estimasi Parameter (MLE) Seperti dijelaskan di subbab 5.2, parameter \(\beta\) dalam regresi logistik diestimasi dengan MLE. Fungsi log-likelihood:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(p_i) + (1-y_i) \log(1-p_i) \right] \]
Di mana
\(p_i = \frac{\exp(\mathbf{x}_i^T \beta)}{1 +
\exp(\mathbf{x}_i^T \beta)}), dan (\mathbf{x}_i^T \beta = \beta_0 +
\beta_1 \cdot \text{Merokok}_i + \beta_2 \cdot
\text{Usia}_i\).
Estimasi dilakukan dengan metode iteratif (Newton-Raphson), yang telah dilakukan oleh fungsi glm() di R (lihat subbab 5.2).
Inferensi Statistik
11. uji Signifikansi Parameter (Uji Wald): Untuk setiap
parameter \(\beta_j\), uji Wald
digunakan: \[ z =
\frac{\hat{\beta}_j}{\text{SE}(\hat{\beta}_j)} \] Statistik (z)
mengikuti distribusi normal standar, dan p-value dihitung untuk menguji
hipotesis:
\(H_0: \beta_j = 0\) (prediktor tidak
signifikan)
\(H_1: \beta_j \neq 0\) (prediktor
signifikan)
Interpretasi:
Kita akan menjelaskan secara detail proses estimasi parameter dan inferensi statistik untuk regresi Poisson, termasuk uji signifikansi parameter dan pemeriksaan overdispersi.
Estimasi Parameter (MLE) Fungsi log-likelihood untuk regresi Poisson:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\lambda_i) - \lambda_i \right] \]
Di mana \(\lambda_i = \exp(\mathbf{x}_i^T \beta)\). Estimasi dilakukan dengan metode iteratif (lihat subbab 5.2).
Inferensi Statistik
1. Uji Signifikansi Parameter (Uji Wald):
Sama seperti regresi logistik, kita gunakan uji Wald:
\[ z
=\frac{\hat{\beta}_j}{\text{SE}(\hat{\beta}_j)} \] 2.
Rate Ratio:
Rate ratio untuk prediktor (x_j) adalah:
\[ \text{RR} = e\^{\hat{\beta}\_j} \]
Hasil dari Data Simulasi (dari subbab 5.2):
Interpretasi:
Pengecekan Overdispersi Kita telah menghitung rasio dispersi di subbab 5.3. Misalkan rasio dispersi ≈ 1 (dari simulasi), tidak ada indikasi overdispersi, sehingga model Poisson sesuai. Jika rasio > 1, kita dapat menggunakan model quasi-Poisson.
Interpretasi:
Model Poisson tampaknya sesuai dengan data, tetapi efek prediktor (Merokok dan Usia) tidak signifikan dalam data simulasi ini. Dalam praktik, kita mungkin perlu menambah prediktor lain atau memeriksa ulang desain studi.
Regresi logistik merupakan metode analisis statistik yang digunakan untuk memodelkan hubungan antara variabel respons biner dengan satu atau lebih variabel prediktor. Dalam prakteknya, prediktor bisa memiliki berbagai skala pengukuran, seperti:
Simulasikan data berikut untuk memodelkan peluang “sukses” berdasarkan:
gender (nominal: Male/Female)education (ordinal: HighSchool < Bachelor <
Master < PhD)income (rasio: dalam juta rupiah per bulan)Gunakan ukuran sampel sebanyak 500 observasi.
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.3
## Warning: package 'tidyr' was built under R version 4.4.3
## Warning: package 'readr' was built under R version 4.4.3
## Warning: package 'purrr' was built under R version 4.4.3
## Warning: package 'forcats' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
set.seed(123)
n <- 500
# Prediktor
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 Model (education sebagai ordinal numerik)
logit_p <- -2 + 0.5 * (gender == "Female") +
0.8 * as.numeric(factor(education, ordered = TRUE)) +
0.03 * income
p <- 1 / (1 + exp(-logit_p))
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 1 Male HighSchool 41.0
## 2 1 Male HighSchool 35.1
## 3 1 Male HighSchool 65.4
## 4 1 Female HighSchool 61.3
## 5 1 Male HighSchool 27.4
## 6 1 Female HighSchool 48.6
sim_data %>%
group_by(success) %>%
summarise(
Jumlah = n(),
Rata2_Income = mean(income)
)
## # A tibble: 2 × 3
## success Jumlah Rata2_Income
## <int> <int> <dbl>
## 1 0 111 45.1
## 2 1 389 51.3
Tabel menunjukkan distribusi antara individu sukses dan tidak, serta rata-rata pendapatan masing-masing kelompok.
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.012456 0.406398 -0.031 0.9755
## genderMale -0.286854 0.226452 -1.267 0.2053
## educationBachelor -0.591248 0.248867 -2.376 0.0175 *
## educationMaster 0.764194 0.347019 2.202 0.0277 *
## educationPhD 1.091851 0.559012 1.953 0.0508 .
## income 0.029543 0.007585 3.895 9.82e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 529.43 on 499 degrees of freedom
## Residual deviance: 489.56 on 494 degrees of freedom
## AIC: 501.56
##
## Number of Fisher Scoring iterations: 4
Interpretasi Hasil:
Intercept: Nilai intercept sebesar −0.012 tidak signifikan (p = 0.9755), artinya baseline log-odds untuk kelompok referensi (gender = Female, education = HighSchool, income = 0) tidak berbeda secara signifikan dari nol. (Catatan: interpretasi intercept jarang penting secara substantif.)
genderMale: Koefisien −0.287 dengan p = 0.2053 menunjukkan bahwa laki-laki memiliki log-odds keberhasilan yang sedikit lebih rendah dibandingkan perempuan (referensi), namun perbedaannya tidak signifikan secara statistik.
educationBachelor: Koefisien −0.591 dan p = 0.0175 (signifikan). Ini berarti individu dengan pendidikan Bachelor memiliki peluang keberhasilan lebih rendah dibandingkan HighSchool, jika variabel lain dikendalikan.
educationMaster: Koefisien 0.764 (p = 0.0277) → signifikan. Artinya, individu dengan gelar Master memiliki log-odds keberhasilan lebih tinggi dibanding HighSchool.
educationPhD: Koefisien 1.092 dengan p = 0.0508 (marginal signifikan). Artinya, individu dengan PhD memiliki log-odds keberhasilan yang lebih tinggi dibanding HighSchool.
income: Koefisien 0.0295 (p < 0.001) menunjukkan bahwa setiap kenaikan 1 unit pendapatan (juta rupiah) meningkatkan log-odds keberhasilan.
Statistik Model AIC = 501.56 → digunakan untuk membandingkan antar model (lebih rendah = lebih baik).
Residual deviance = 489.56 → dibandingkan dengan null deviance 529.43 → menunjukkan bahwa model menjelaskan sebagian variabilitas data.
Iterasi = 4 → menunjukkan model konvergen dengan baik.
sim_data_numeric <- sim_data %>%
mutate(education_numeric = as.numeric(factor(education, ordered = TRUE)))
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.22473 0.46662 -2.625 0.008673 **
## genderMale -0.29138 0.22596 -1.289 0.197224
## education_numeric 0.62264 0.13608 4.576 4.75e-06 ***
## income 0.02947 0.00758 3.888 0.000101 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 529.43 on 499 degrees of freedom
## Residual deviance: 489.84 on 496 degrees of freedom
## AIC: 497.84
##
## Number of Fisher Scoring iterations: 4
Interpretasi Hasil:
Intercept: Nilai intercept sebesar −1.225 signifikan (p = 0.0087), yang menggambarkan log-odds dasar keberhasilan bagi individu perempuan, dengan education_numeric = 0 dan income = 0. Secara praktik, nilai ini jarang ditafsirkan secara substantif karena pendidikan dan pendapatan nol jarang masuk akal secara nyata.
genderMale: Koefisien −0.291 tidak signifikan (p = 0.197). Ini menunjukkan bahwa tidak terdapat perbedaan peluang keberhasilan yang signifikan antara laki-laki dan perempuan setelah mengontrol variabel lain.
education_numeric: Koefisien sebesar 0.623 sangat signifikan (p < 0.001). Artinya, setiap peningkatan satu tingkat pendidikan (misal dari HighSchool ke Bachelor, atau Bachelor ke Master) akan meningkatkan log-odds keberhasilan sebesar 0.623.
income: Koefisien 0.0295 signifikan (p < 0.001). Ini menunjukkan bahwa setiap kenaikan 1 juta rupiah dalam pendapatan meningkatkan peluang keberhasilan.
Statistik Model AIC = 497.84 → lebih rendah dibanding model nominal (AIC = 501.56), yang menunjukkan model ini lebih baik dalam hal efisiensi parameter (parsimonious).
Residual deviance = 489.84 lebih kecil dibanding null deviance (529.43) → model menjelaskan sebagian variasi data dengan baik.
Iterasi = 4 → menunjukkan model konvergen dengan baik.
TABEL PERBANDINGAN MODEL
| Aspek | Model Nominal | Model Numeric |
|---|---|---|
| Pendekatan | Dummy variable per kategori (4 level → 3 dummy) | Skala numerik ordinal (1 kolom saja) |
| Jumlah Parameter Pendidikan | 3 parameter (Bachelor, Master, PhD) | 1 parameter (ordinal numeric) |
| AIC | 501.56 | 497.84 |
| Signifikansi Pendidikan | Bachelor & Master signifikan (p \(<\) 0.05) | Sangat signifikan (p \(<\) 0.001) |
| Interpretasi | Dibandingkan dengan referensi: HighSchool | Kenaikan satu tingkat → odds meningkat ~86% |
| Parsimony | Kurang efisien (lebih banyak parameter) | Lebih efisien dan sederhana |
Dengan demikian, model ordinal sebagai numeric memiliki kinerja statistik yang lebih baik dan interpretasi yang lebih ringkas, asalkan asumsi linier antar level ordinal dapat diterima.
Setelah membangun model regresi logistik, tahap berikutnya adalah memilih model terbaik dan mengevaluasi performanya. Hal ini penting untuk memastikan model:
Dua pendekatan utama dalam pemilihan model:
Metode umum dalam seleksi model:
Model terbaik dipilih berdasarkan kriteria informasi, khususnya:
Rumus AIC (Akaike Information Criterion)
\[ \text{AIC} = -2 \cdot \log(\hat{L}) + 2k \]
Setelah model terpilih, evaluasi dilakukan dengan:
1. Kurva ROC dan AUC
ROC (Receiver Operating Characteristic) mengukur
trade-off sensitivitas dan 1-spesifisitas.
AUC (Area Under Curve) menunjukkan kemampuan diskriminatif model. | | $$
\(\text{AUC} = P(\text{model memberikan nilai lebih tinggi untuk} y=1)\)
\(\text{ daripada } y=0\)
McFadden:
\[ R^2_{\text{McF}} = 1 - \frac{\log L_{\text{model}}}{\log L_{\text{null}}} \]
Nagelkerke: versi skala penuh 0–1 dari Cox-Snell. Nilai yang lebih tinggi → model lebih baik
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_full <- glm(y ~ x1 + x2 + x3, family = binomial, data = data)
null_model <- glm(y ~ 1, data = data, family = binomial)
step_forward <- step(null_model, scope = list(lower = null_model, upper = model_full), direction = "forward", trace = FALSE)
step_backward <- step(model_full, direction = "backward", trace = FALSE)
step_both <- step(null_model, scope = list(upper = model_full), direction = "both", trace = FALSE)
summary(step_both)
##
## Call:
## glm(formula = y ~ x1 + x3 + x2, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.0065 0.2161 -4.658 3.19e-06 ***
## x1 1.3119 0.1940 6.761 1.37e-11 ***
## x3 0.8687 0.1777 4.887 1.02e-06 ***
## x2 -0.5262 0.3044 -1.729 0.0839 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 364.81 on 299 degrees of freedom
## Residual deviance: 270.46 on 296 degrees of freedom
## AIC: 278.46
##
## Number of Fisher Scoring iterations: 5
Model stepwise memilih semua prediktor (x1, x3, x2), dengan x1 dan x3 sangat signifikan. x2 memiliki pengaruh negatif namun tidak signifikan secara statistik (p > 0.05). Model ini efisien dan cukup akurat berdasarkan AIC dan deviance. Perbandingan AIC dan Deviance
model_comp <- data.frame(
Model = c("Full", "Forward", "Backward", "Both"),
AIC = c(AIC(model_full), AIC(step_forward), AIC(step_backward), AIC(step_both)),
Deviance = c(deviance(model_full), deviance(step_forward), deviance(step_backward), deviance(step_both))
)
knitr::kable(model_comp, caption = "Perbandingan AIC dan Deviance", color = "white")
## Warning in attr(x, "align"): 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning in attr(x, "format"): 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
| Model | AIC | Deviance |
|---|---|---|
| Full | 278.4581 | 270.4581 |
| Forward | 278.4581 | 270.4581 |
| Backward | 278.4581 | 270.4581 |
| Both | 278.4581 | 270.4581 |
library(pROC)
## Warning: package 'pROC' was built under R version 4.4.3
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
pred_prob <- predict(step_both, type = "response")
roc_obj <- roc(data$y, pred_prob)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj, main = "Kurva ROC", col = "blue")
auc(roc_obj)
## Area under the curve: 0.8309
AUC = 0.8309 → kemampuan klasifikasi model sangat baik. ## Pseudo R-Squared
library(DescTools)
PseudoR2(step_both, which = c("CoxSnell", "Nagelkerke", "McFadden"))
## CoxSnell Nagelkerke McFadden
## 0.2698462 0.3835251 0.2586292
| Jenis Pseudo R² | Nilai | Interpretasi Singkat |
|---|---|---|
| Cox & Snell | 0.2698 | Menjelaskan ~27% variansi log-likelihood; maksimum nilai < 1 |
| Nagelkerke | 0.3835 | Versi skala penuh 0–1; model menjelaskan ~38% variansi, dianggap cukup baik |
| McFadden | 0.2586 | Nilai > 0.2 dianggap baik; model memiliki kekuatan prediksi yang layak |
Nilai-nilai pseudo R² menunjukkan bahwa model cukup kuat secara statistik dan menjelaskan proporsi variansi yang cukup besar. Nagelkerke mendekati 0.4, dan McFadden di atas 0.25 → keduanya mengindikasikan model logistik yang baik.
# Prediksi kelas (biner)
pred_class <- ifelse(pred_prob >= 0.5, 1, 0)
# Buat confusion matrix manual
conf_matrix <- table(Prediksi = pred_class, Aktual = as.numeric(as.character(data$y)))
conf_matrix
## Aktual
## Prediksi 0 1
## 0 193 48
## 1 18 41
TP <- conf_matrix["1", "1"]
TN <- conf_matrix["0", "0"]
FP <- conf_matrix["1", "0"]
FN <- conf_matrix["0", "1"]
akurasi <- (TP + TN) / sum(conf_matrix)
sensitivitas <- TP / (TP + FN)
spesifisitas <- TN / (TN + FP)
PPV <- TP / (TP + FP)
NPV <- TN / (TN + FN)
| Metrik | Nilai | Interpretasi Singkat |
|---|---|---|
| Akurasi | 0.780 | 78% dari seluruh observasi diprediksi dengan benar oleh model |
| Sensitivitas | 0.461 | Hanya 46.1% kasus positif (1) yang berhasil terdeteksi dengan benar |
| Spesifisitas | 0.915 | 91.5% kasus negatif (0) diklasifikasikan dengan benar oleh model |
| PPV (Presisi) | 0.695 | Dari semua prediksi positif, 69.5% benar-benar positif |
| NPV | 0.801 | Dari semua prediksi negatif, 80.1% benar-benar negatif |
model_comp <- data.frame(
Model = c("Full", "Forward", "Backward", "Both"),
AIC = c(AIC(model_full), AIC(step_forward), AIC(step_backward), AIC(step_both)),
Deviance = c(deviance(model_full), deviance(step_forward), deviance(step_backward), deviance(step_both))
)
| Model | AIC | Deviance |
|---|---|---|
| Full | 278.458 | 270.458 |
| Forward | 278.458 | 270.458 |
| Backward | 278.458 | 270.458 |
| Both | 278.458 | 270.458 |
Semua metode (Full, Forward, Backward, Both) menghasilkan model yang identik dengan AIC dan deviance yang sama. Ini menunjukkan bahwa semua prediktor (x1, x2, x3) layak dimasukkan dalam model, dan proses seleksi model tidak mengubah struktur model akhir. Model ini juga efisien secara statistik dan stabil.
anova(null_model, model_full, test = "Chisq")
## Analysis of Deviance Table
##
## Model 1: y ~ 1
## Model 2: y ~ x1 + x2 + x3
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 299 364.81
## 2 296 270.46 3 94.35 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hasil uji Likelihood Ratio menunjukkan bahwa model penuh (x1 + x2 + x3) secara signifikan lebih baik dibanding model null (tanpa prediktor).
p-value < 0.001 → kita menolak H₀, artinya paling tidak satu prediktor memberikan kontribusi signifikan terhadap model.
Ini mendukung bahwa pemodelan dengan x1, x2, dan x3 memberikan peningkatan yang bermakna dalam menjelaskan variabel respons y.
Model yang kompleks sering memiliki AIC dan deviance yang lebih kecil. Namun:
Dalam contoh kasus yang kita kerjakan sebelumnya, kita membandingkan empat model:
y ~ x1 + x2 + x3Hasil perbandingan AIC dan deviance ditunjukkan dalam tabel berikut:
| Model | AIC | Deviance |
|---|---|---|
| Full | 278.458 | 270.458 |
| Forward | 278.458 | 270.458 |
| Backward | 278.458 | 270.458 |
| Both | 278.458 | 270.458 |
Semua metode menghasilkan model yang sama, yaitu model dengan tiga prediktor (x1, x2, dan x3), yang berarti seluruh prediktor berkontribusi signifikan secara statistik atau prediktif.
Rumus AIC
\[ \text{AIC} = -2(\log L - k) = -2 \log L + 2k \]
Penjelasan:
AIC menggabungkan akurasi model (melalui log-likelihood \(L\)) dan kompleksitas model (jumlah
parameter \(k\)). Model dengan AIC
lebih kecil lebih disukai, asalkan penurunannya signifikan. Jika tidak
signifikan, pilihlah model yang lebih sederhana.
Rumus Deviance
\[ D = -2 \left[ \log L(\text{model}) - \log L(\text{model saturasi}) \right] \]
Penjelasan:
Deviance mengukur seberapa jauh model saat ini dari model sempurna.
Dalam kasus kita, deviance menurun drastis dari 364.81 (null) menjadi
270.46, menandakan bahwa model penuh cukup menjelaskan variabilitas
data.
Rumus Likelihood-Ratio Test
\[ G^2 = -2 \left( \log L_0 - \log L_1 \right) \]
Penjelasan:
Uji Likelihood Ratio membandingkan model null (y ~ 1) dengan model
penuh. Dalam contoh ini, deviance turun 94.35 poin dengan p-value <
2.2e-16, menandakan bahwa model penuh secara statistik jauh lebih
baik.
Kesimpulan Parsimony
Semua model menghasilkan struktur akhir yang sama: y ~ x1 + x2 + x3
Tidak ada pengurangan variabel oleh metode stepwise, artinya semua variabel dibutuhkan
AIC sudah minimum, dan penambahan variabel signifikan (berdasarkan uji LR)
Maka: meskipun model memiliki 3 prediktor, ini adalah model paling parsimonious yang valid dalam kasus ini
Setelah model dibangun, kita perlu mengevaluasi kinerjanya dalam mengklasifikasikan data secara benar. Salah satu caranya adalah membuat confusion matrix dan menghitung metrik performa seperti akurasi, sensitivitas, dan spesifisitas.
Rumus
Akurasi: \[ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} \]
Sensitivity (Recall): \[ \text{Sensitivity} = \frac{TP}{TP + FN} \]
Specificity: \[ \text{Specificity} = \frac{TN}{TN + FP} \]
Evaluasi dengan Confusion Matrix
pred_prob <- predict(step_both, type = "response")
# Prediksi kelas
pred_class <- ifelse(pred_prob >= 0.5, 1, 0)
# Buat confusion matrix manual
conf_matrix <- table(Prediksi = pred_class, Aktual = as.numeric(as.character(data$y)))
conf_matrix
## Aktual
## Prediksi 0 1
## 0 193 48
## 1 18 41
# Ambil elemen dari confusion matrix
TP <- conf_matrix["1", "1"]
TN <- conf_matrix["0", "0"]
FP <- conf_matrix["1", "0"]
FN <- conf_matrix["0", "1"]
# Hitung metrik performa
akurasi <- (TP + TN) / sum(conf_matrix)
sensitivitas <- TP / (TP + FN)
spesifisitas <- TN / (TN + FP)
PPV <- TP / (TP + FP)
NPV <- TN / (TN + FN)
| Metrik | Nilai | Interpretasi Singkat |
|---|---|---|
| Akurasi | 0.780 | 78% dari seluruh prediksi sesuai dengan data aktual |
| Sensitivitas | 0.461 | Model menangkap 46.1% dari kasus positif dengan benar (True Positive) |
| Spesifisitas | 0.915 | Model benar dalam 91.5% kasus negatif |
| PPV (Presisi) | 0.695 | 69.5% dari prediksi positif memang benar-benar positif |
| NPV | 0.801 | 80.1% dari prediksi negatif memang benar-benar negatif |
Kurva ROC menggambarkan trade-off antara sensitivitas dan (1 - spesifisitas) untuk semua nilai threshold. Visualisasi Kurva ROC
library(pROC)
roc_obj <- roc(data$y, pred_prob)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj, main = "Kurva ROC")
Kurva melengkung menjauhi diagonal abu-abu → artinya model Anda lebih baik dari tebak-tebakan acak.
Kurva naik tajam di awal dan mendekati pojok kiri atas (0,1) → menandakan kemampuan klasifikasi yang baik, karena:
Sensitivitas cepat naik
False Positive Rate (1 - Spesifisitas) tetap rendah
auc(roc_obj)
## Area under the curve: 0.8309
Karena AUC > 0.7 sehingga Model memiliki kemampuan klasifikasi yang sangat baik, dengan probabilitas 83.1% bahwa model akan memberikan skor prediksi yang lebih tinggi untuk observasi positif (y = 1) dibanding observasi negatif (y = 0).
PR Curve lebih informatif daripada ROC saat data tidak seimbang. Visualisasi PR Curve
library(PRROC)
## Warning: package 'PRROC' was built under R version 4.4.3
## Loading required package: rlang
##
## Attaching package: 'rlang'
## The following objects are masked from 'package:purrr':
##
## %@%, flatten, flatten_chr, flatten_dbl, flatten_int, flatten_lgl,
## flatten_raw, invoke, splice
pr <- pr.curve(
scores.class0 = pred_prob[data$y == 1],
scores.class1 = pred_prob[data$y == 0],
curve = TRUE
)
plot(pr)
Precision-Recall Curve menunjukkan AUC sebesar 0.680, yang menandakan kemampuan klasifikasi model terhadap kelas positif berada pada tingkat sedang. Nilai ini lebih rendah dari AUC ROC, karena PR Curve lebih peka terhadap ketidakseimbangan kelas. Meskipun recall cukup tinggi, precision menurun secara bertahap, yang menunjukkan adanya trade-off antara menangkap lebih banyak kasus positif dan akurasi prediksi positif.
Karena regresi logistik tidak menggunakan R² klasik, digunakan beberapa alternatif Pseudo-R².
model_null <- glm(y ~ 1, data = data, family = binomial)
logL0 <- logLik(model_null)
logLM <- logLik(step_both)
L0 <- exp(logL0)
LM <- exp(logLM)
n <- nobs(step_both)
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
| Jenis Pseudo R² | Nilai | Interpretasi Singkat |
|---|---|---|
| Cox & Snell | 0.270 | Model menjelaskan ~27% variansi log-likelihood dibanding model null |
| McFadden | 0.259 | Di atas 0.2 → model memiliki kekuatan penjelas yang baik |
Nilai-nilai pseudo R² yang cukup tinggi menunjukkan bahwa model step_both adalah model logistik yang kuat dan layak digunakan, dengan kemampuan menjelaskan data yang baik namun tetap efisien secara struktural (parsimonious).
Distribusi multinomial merupakan perluasan dari distribusi binomial untuk kasus dengan lebih dari dua kategori. Misalnya, jika seseorang memilih satu dari tiga jenis buah favorit: Apel, Jeruk, dan Pisang, maka hasilnya mengikuti distribusi multinomial.
Sebuah survei dilakukan terhadap 10 orang yang diminta memilih satu dari tiga jenis buah favorit: Apel (A), Jeruk (J), dan Pisang (P).
Probabilitas teoritik preferensi:
Rumus Distribusi 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 \(\sum x_i = n\) dan \(\sum p_i = 1\).
Perusahaan ingin mengetahui preferensi perangkat kerja karyawan: Laptop, Desktop, atau Tablet, dengan prediktor: usia, divisi, dan pengalaman kerja.
Multinomial logistic regression digunakan saat respon memiliki >2 kategori dan tidak berurutan (nominal).
Jika \(Y\) memiliki \(c\) kategori, maka kita pilih satu kategori sebagai baseline (misalnya kategori \(c\)). Model logit:
\(\log\left(\frac{\pi_j}{\pi_c}\right) = \alpha_j + \beta_j x, \quad j = 1, \dots, c-1\)
Estimasi menggunakan Maximum Likelihood: \(\ell(\beta) = \sum_{i=1}^n \sum_{j=1}^K y_{ij} \log(\pi_{ij})\)
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))
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))
}
})
data_multi <- data.frame(Device = factor(Device), Department, Age, Experience)
library(nnet)
data_multi$Department <- relevel(factor(data_multi$Department), ref = "HR")
model_multi <- multinom(Device ~ Age + Department + Experience, data = data_multi)
## # weights: 18 (10 variable)
## initial value 164.791843
## iter 10 value 153.262117
## final value 153.057472
## converged
summary(model_multi)
## Call:
## multinom(formula = Device ~ Age + Department + Experience, data = data_multi)
##
## Coefficients:
## (Intercept) Age DepartmentIT DepartmentMarketing Experience
## Laptop 0.19475101 -0.003962003 1.041329 -0.2153598 0.03133361
## Tablet -0.06652179 -0.031643458 1.078707 1.0298125 0.07553063
##
## Std. Errors:
## (Intercept) Age DepartmentIT DepartmentMarketing Experience
## Laptop 1.139007 0.02802813 0.5359685 0.4742033 0.06782814
## Tablet 1.257899 0.03087923 0.6437901 0.5184056 0.07664465
##
## Residual Deviance: 306.1149
## AIC: 326.1149
Variabel Department (IT dan Marketing) merupakan prediktor kuat terhadap pemilihan perangkat. Age hanya signifikan pada kategori Tablet (negatif). Experience memiliki efek positif ringan pada pemilihan selain Desktop.
z_vals <- summary(model_multi)$coefficients / summary(model_multi)$standard.errors
p_vals <- 2 * (1 - pnorm(abs(z_vals)))
round(p_vals, 4)
## (Intercept) Age DepartmentIT DepartmentMarketing Experience
## Laptop 0.8642 0.8876 0.0520 0.6497 0.6441
## Tablet 0.9578 0.3055 0.0938 0.0470 0.3244
Hasil p-value menunjukkan bahwa prediktor yang paling signifikan dalam membedakan pilihan Tablet dibanding Desktop adalah DepartmentMarketing. Untuk pilihan Laptop, tidak ada prediktor yang signifikan pada level 5%, namun DepartmentIT mendekati signifikan (p ≈ 0.052). Ini mengindikasikan bahwa divisi memiliki pengaruh yang lebih kuat terhadap preferensi perangkat kerja dibanding variabel usia atau pengalaman.
data_multi$pred <- predict(model_multi, newdata = data_multi)
table(Predicted = data_multi$pred, Actual = data_multi$Device)
## Actual
## Predicted Desktop Laptop Tablet
## Desktop 0 3 1
## Laptop 26 50 21
## Tablet 15 13 21
Model regresi logistik multinomial berhasil mengidentifikasi bahwa variabel departemen berpengaruh signifikan terhadap preferensi perangkat kerja, terutama untuk kategori Tablet. Model cukup akurat dalam memprediksi kategori Laptop, namun masih lemah dalam mengenali kategori Desktop. Nilai pseudo R² menunjukkan bahwa model memiliki kemampuan penjelasan yang layak, meskipun akurasi klasifikasinya masih dapat ditingkatkan.
Regresi logistik ordinal digunakan ketika variabel respon memiliki urutan kategori, tetapi jarak antar kategori tidak diasumsikan sama. Contoh klasik adalah tingkat kepuasan: “Tidak Puas”, “Cukup”, dan “Puas”.
Sebuah perusahaan ingin mengevaluasi tingkat kepuasan pelanggan
terhadap layanan yang diberikan. Kepuasan dinilai dalam tiga tingkatan
ordinal: “Tidak Puas”, “Cukup”, dan “Puas”. Salah satu faktor yang
diduga memengaruhi kepuasan pelanggan adalah kecepatan
layanan. Data dikumpulkan dari 200 pelanggan dengan variabel
prediktor speed yang mengukur tingkat kecepatan pelayanan
(skala 1–10).
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 cumulative logit memodelkan log-odds kumulatif dari suatu respon ordinal sebagai fungsi linier dari prediktor:
\[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \alpha_j + \beta x, \quad j = 1, \dots, c - 1 \]
Odds Ratio: \[ \text{OR} = e^\beta \]
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
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
Model menunjukkan bahwa speed adalah prediktor yang sangat signifikan terhadap tingkat kepuasan. Pelanggan dengan kecepatan layanan yang lebih tinggi cenderung berada pada kategori kepuasan yang lebih tinggi (Cukup atau Puas). Model juga memiliki deviance dan AIC yang cukup rendah, menandakan fit yang baik.
(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
Hasil analisis menunjukkan bahwa variabel speed berpengaruh signifikan terhadap kepuasan pelanggan (p < 0.0001). Kedua ambang kategori juga signifikan, yang berarti pembagian tingkat kepuasan valid secara statistik. Model layak digunakan untuk menjelaskan hubungan antara kecepatan layanan dan kepuasan.
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
Prediksi probabilitas menunjukkan bahwa semakin tinggi nilai speed, semakin besar kemungkinan pelanggan berada pada kategori kepuasan yang lebih tinggi (Puas), dan kemungkinan berada pada kategori Tidak Puas semakin kecil. Ini konsisten dengan arah koefisien model.
Model cumulative logit mengasumsikan proportional odds, artinya hubungan antara prediktor dan log-odds adalah konstan di seluruh ambang batas kategori. Jika asumsi ini dilanggar, model tidak valid.
Alternatif untuk cumulative logit jika asumsi paralelisme tidak terpenuhi:
Model regresi logistik ordinal menunjukkan bahwa kecepatan layanan (speed) berpengaruh signifikan terhadap kepuasan pelanggan. Prediksi probabilitas konsisten dengan logika ordinal—semakin cepat layanan, semakin besar peluang pelanggan merasa puas. Seluruh parameter model signifikan secara statistik, dan hasil uji Brant menunjukkan bahwa asumsi paralelisme terpenuhi. Dengan demikian, model cumulative logit valid dan layak digunakan dalam kasus ini.
Asumsi paralelisme menyatakan bahwa:
\[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \alpha_j + \beta x \]
di mana koefisien $ $ tidak berubah antar ambang kategori $ j $. Pelanggaran terhadap asumsi ini membuat model cumulative logit tidak valid.
library(brant)
## Warning: package 'brant' was built under R version 4.4.3
brant(model_ord)
## --------------------------------------------
## Test for X2 df probability
## --------------------------------------------
## Omnibus 1.13 1 0.29
## speed 1.13 1 0.29
## --------------------------------------------
##
## H0: Parallel Regression Assumption holds
Hasil uji Brant menunjukkan p-value = 0.29 (tidak signifikan), sehingga tidak ada cukup bukti untuk menolak H0. Artinya, asumsi paralelisme terpenuhi, dan model cumulative logit valid digunakan.
Model log-linear digunakan untuk menganalisis hubungan antara dua atau lebih variabel kategorik dalam bentuk tabel kontingensi, khususnya ketika tidak ada variabel dependen eksplisit. Tujuan utama adalah menguji apakah terdapat ketergantungan atau asosiasi antara kategori variabel.
Misalkan sebuah survei dilakukan untuk mengetahui apakah terdapat hubungan antara jenis kelamin responden (Male/Female) dan tanggapan terhadap pertanyaan “Apakah Anda setuju?” (Yes/No). Data disajikan dalam bentuk tabel kontingensi berikut:
| Yes | No | |
|---|---|---|
| Male | 50 | 30 |
| Female | 20 | 80 |
Gunakan model log-linear untuk: 1. Membentuk model saturated dan independen. 2. Menghitung odds ratio. 3. Menginterpretasikan hasil. 4. Menentukan apakah terdapat hubungan antara Gender dan Response.
Rumus umum model log-linear:
\[ \log(m_{ij}) = \mu + \lambda^A_i + \lambda^B_j + \lambda^{AB}_{ij} \]
# Data tabel kontingensi
data <- matrix(c(50, 30, 20, 80), nrow = 2, byrow = TRUE)
dimnames(data) <- list(Gender = c("Male", "Female"),
Response = c("Yes", "No"))
# Model saturated
model_sat <- loglin(data, margin = list(c(1), c(2), c(1,2)), fit = TRUE)
## 2 iterations: deviation 1.421085e-14
model_sat
## $lrt
## [1] 0
##
## $pearson
## [1] 0
##
## $df
## [1] 0
##
## $margin
## $margin[[1]]
## [1] "Gender"
##
## $margin[[2]]
## [1] "Response"
##
## $margin[[3]]
## [1] "Gender" "Response"
##
##
## $fit
## Response
## Gender Yes No
## Male 50 30
## Female 20 80
Hasil output model saturated menunjukkan nilai deviance (G²) sebesar 0 dan degrees of freedom (df) = 0, yang artinya model cocok sempurna dengan data. Ini wajar karena model saturated memasukkan semua efek utama dan interaksi, sehingga tidak ada selisih antara nilai observasi dan ekspektasi. Frekuensi prediksi sama persis dengan data asli.
Model ini mengasumsikan Gender dan Response tidak saling bergantung:
\[ \log(m_{ij}) = \mu + \lambda^A_i + \lambda^B_j \]
# Model independen
model_indep <- loglin(data, margin = list(1, 2), fit = TRUE)
## 2 iterations: deviation 0
model_indep
## $lrt
## [1] 34.63885
##
## $pearson
## [1] 33.77922
##
## $df
## [1] 1
##
## $margin
## $margin[[1]]
## [1] "Gender"
##
## $margin[[2]]
## [1] "Response"
##
##
## $fit
## Response
## Gender Yes No
## Male 31.11111 48.88889
## Female 38.88889 61.11111
Hasil model independen menunjukkan nilai deviance (G²) sebesar 34.64 dengan 1 derajat kebebasan (df = 1), yang berarti terdapat perbedaan signifikan antara data aktual dan nilai yang diprediksi oleh model. Ini mengindikasikan bahwa asumsi independensi antara Gender dan Response tidak terpenuhi — dengan kata lain, terdapat hubungan atau asosiasi yang signifikan antara kedua variabel tersebut. Frekuensi prediksi cukup berbeda dari data asli.
Untuk tabel 2x2, odds ratio dihitung sebagai:
\[ OR = rac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}} = rac{50 \cdot 80}{30 \cdot 20} = rac{4000}{600} = 6.67 \]
Interpretasi: Peluang respon “Yes” oleh laki-laki sekitar 6.67 kali lebih besar daripada perempuan.
# Fit model independen
model_indep <- loglin(data, margin = list(1, 2), fit = TRUE)
## 2 iterations: deviation 0
# Ambil deviance dan df
G2 <- model_indep$lrt
df <- model_indep$df
pval <- 1 - pchisq(G2, df)
# Tampilkan hasil
cat("Deviance:", G2, "\nDegrees of Freedom:", df, "\np-value:", round(pval, 4), "\n")
## Deviance: 34.63885
## Degrees of Freedom: 1
## p-value: 0
Nilai deviance sebesar 34.64 dengan derajat kebebasan 1 menghasilkan p-value < 0.001, yang berarti sangat signifikan. Dengan demikian, model independen tidak sesuai, dan terdapat hubungan yang signifikan antara Gender dan Response dalam data. Model yang lebih kompleks (misalnya model saturated) lebih tepat digunakan.
Analisis log-linear terhadap hubungan antara jenis kelamin dan respons survei menunjukkan bahwa model saturated cocok sempurna dengan data, sedangkan model independen tidak sesuai (p-value < 0.001). Nilai odds ratio sebesar 6,67 mengindikasikan adanya asosiasi kuat antara gender dan respons. Dengan demikian, terdapat hubungan yang signifikan antara kedua variabel, dan model saturated lebih tepat untuk merepresentasikan data.
Sebuah studi dilakukan untuk mengevaluasi hubungan antara kebiasaan tidur dan status kesehatan individu. Peneliti mengelompokkan partisipan berdasarkan dua variabel kategorik, yaitu:
Kebiasaan tidur: Tidur (Ya) atau Tidak Tidur (Tidur Tidak),
Status kesehatan: Sakit atau Sehat.
Data yang diperoleh dari observasi terhadap sejumlah individu disajikan dalam bentuk tabel kontingensi sebagai berikut:
Diberikan data:
| Sakit | Sehat | |
|---|---|---|
| Merokok Ya | 34 | 16 |
| Merokok Tidak | 12 | 38 |
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 (μ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).
Sistem Persamaan Model Log-Linear
\[ 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} \]
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 \]
Rumus Estimasi Parameter dengan Sum-to-Zero Constraint
\[ \lambda_1^A=1/2[(\log\mu_{11}+\log\mu_{12})-(\log\mu_{21}+\log\mu_{22})] \]
\[ \lambda_1^B=1/2[(\log\mu_{11}+\log\mu_{12})-(\log\mu_{21}+\log\mu_{22})] \]
\[ \lambda_{12}^{AB}=1/4[\log\mu_{12}-\log\mu_{11}-\log\mu_{22}-\log\mu_{21}] \]
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:
Observasi:
\[ \begin{aligned} \log(\mu_{11}) &= \lambda + \lambda^A_1 + \lambda^B_1 + \lambda^{AB}_{11} \\ \log(\mu_{12}) &= \lambda + \lambda^A_1 + \lambda^B_2 + \lambda^{AB}_{12} \\ \log(\mu_{21}) &= \lambda + \lambda^A_2 + \lambda^B_1 + \lambda^{AB}_{21} \\ \log(\mu_{22}) &= \lambda + \lambda^A_2 + \lambda^B_2 + \lambda^{AB}_{22} \end{aligned} \]
Constraint sum-to-zero:
\[ \lambda^A_1 + \lambda^A_2 = 0 \\ \lambda^B_1 + \lambda^B_2 = 0 \\ \lambda^{AB}_{11} + \lambda^{AB}_{12} + \lambda^{AB}_{21} + \lambda^{AB}_{22} = 0 \]
Langkah-langkah:
\[ \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 \]
\[ \lambda^A_1 = \frac{1}{2} \left( [\log(30) + \log(20)] - [\log(10) + \log(40)] \right) \\ = \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^A_2 = -0.2027 \]
\[ \lambda^B_1 = \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) \\ = -0.4904 \\ \lambda^B_2 = +0.4904 \]
\[ \lambda^{AB}_{11} = \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} (1.7918) = 0.4479 \\ \lambda^{AB}_{12} = -0.4479 \\ \lambda^{AB}_{21} = -0.4479 \\ \lambda^{AB}_{22} = +0.4479 \]
Ringkasan parameter:
\[ \text{OR} = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot 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(\text{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: 3.9968e-15 on 0 degrees of freedom
## AIC: 27.775
##
## Number of Fisher Scoring iterations: 3
Nilai \(\log(6) = 1.79\) itu sama dengan efek interaksi output 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^A_i + \lambda^B_j + \lambda^{AB}_{ij} \]
Dengan:
Constraint (sum-to-zero): - \(\sum_i \lambda^A_i = 0\) - \(\sum_j \lambda^B_j = 0\) - \(\sum_i \lambda^{AB}_{ij} = 0\) - \(\sum_j \lambda^{AB}_{ij} = 0\)
Secara eksplisit, model log-linear dapat ditulis sebagai:
\[ \log(\mu_{ij}) = \lambda + \lambda^A_1 \ (\text{Laki-laki}), \ \lambda^A_2 \ (\text{Perempuan}) + \lambda^B_1 \ (\text{Kurus}), \ \lambda^B_2 \ (\text{Normal}), \ \lambda^B_3 \ (\text{Gemuk}) + \lambda^{AB}_{ij} \ (\text{interaksi jika ada}) \]
Penjelasan: - \(\lambda\): Intercept (rata-rata log frekuensi) - \(\lambda^A_i\): Efek baris (Jenis Kelamin) - \(\lambda^B_j\): Efek kolom (Kategori BMI) - \(\lambda^{AB}_{ij}\): Efek interaksi antara baris dan kolom
# 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: -9.0719e-30 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.
Model dengan interaksi:
- Jika koefisien interaksi signifikan, berarti ada hubungan/asosiasi
antara Jenis Kelamin dan BMI.
Artinya distribusi BMI berbeda antara Laki-laki dan Perempuan.
Pada pembahasan sebelumnya, telah dijelaskan bahwa salah satu tujuan utama dalam pengembangan model log-linear adalah untuk mengestimasi parameter-parameter yang merepresentasikan hubungan antar variabel kategorik.
Pada bagian ini, akan dibahas bentuk model log-linear yang lebih kompleks, yakni model log-linear untuk tabel kontingensi tiga dimensi. Model ini melibatkan tiga variabel kategorik, sehingga jumlah kemungkinan interaksi yang dapat dimasukkan ke dalam model menjadi lebih beragam. Dalam konteks ini, bentuk interaksi tertinggi yang dapat dimodelkan adalah interaksi tiga arah, yaitu interaksi yang mencakup ketiga variabel secara simultan.
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:
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} + \lambda_{ijk}^{XYZ} \]
Model ini memuat semua kemungkinan interaksi, termasuk interaksi tiga arah (X, Y, dan Z).
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \]
Model ini hanya mengakomodasi interaksi dua arah antar variabel tanpa memasukkan interaksi tiga arah.
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} \]
Memuat interaksi X dengan Y dan X dengan Z.
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{jk}^{YZ} \]
Memuat interaksi Y dengan X dan Y dengan Z.
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \]
Memuat interaksi Z dengan X dan Z dengan Y.
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} \]
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ik}^{XZ} \]
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{jk}^{YZ} \]
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z \]
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:
Setiap tahapan pengujian dilakukan untuk menilai kecocokan model dan menentukan struktur interaksi mana yang paling sesuai dengan data yang diamati.
Sebuah survei dilakukan untuk memahami hubungan antara tingkat pengetahuan kesehatan, jenis kelamin, dan sikap terhadap kebiasaan merokok. Penelitian ini bertujuan mengevaluasi bagaimana kombinasi karakteristik individu memengaruhi kecenderungan mereka dalam mendukung atau menolak kebiasaan merokok di masyarakat.
Tabel Data Survei
| Kesehatan | Jenis Kelamin | Mendukung | Menolak | Total |
|---|---|---|---|---|
| Rendah | Laki-laki | 128 | 32 | 160 |
| Rendah | Perempuan | 123 | 73 | 196 |
| Rendah | Total | 251 | 105 | 356 |
| Sedang | Laki-laki | 182 | 56 | 238 |
| Sedang | Perempuan | 168 | 105 | 273 |
| Sedang | Total | 350 | 161 | 511 |
| Tinggi | Laki-laki | 119 | 49 | 168 |
| Tinggi | Perempuan | 111 | 70 | 181 |
| Tinggi | Total | 230 | 119 | 349 |
Keterangan:
Tingkat Pengetahuan Kesehatan (Pengetahuan): Rendah, Sedang, dan Tinggi.
Jenis Kelamin: Laki-laki, Perempuan
Sikap: Mendukung (Favor), Menolak (Oppose) merokok
library("epitools")
library("DescTools")
library("lawstat")
## Warning: package 'lawstat' was built under R version 4.4.3
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_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} + \lambda_{ijk}^{XYZ} \]
# 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: 5.9952e-15 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
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|) | 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.30 | 1.30 | 0.19 | 1.55 |
| x.sex1M:y.fav1fav:z.fund2mod | 0.28 | 0.30 | 0.94 | 0.35 | 1.33 |
Keterangan:
-***signifikan pada α = 0.001
-**signifikan pada α = 0.01
-.marginally signifikan pada α = 0.1
(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 Fundamentalis 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.
Residual deviance ≈ 0 menandakan model
saturated benar-benar fit terhadap data
(seluruh variasi data dijelaskan oleh model).
AIC = 100.14 dapat digunakan untuk perbandingan dengan model yang lebih sederhana.
Catatan interpretasi:
exp(coef) menyatakan rasio
ekspektasi (expected count ratio) dibandingkan
baseline.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_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \]
# 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
Apakah Ada Interaksi Tiga Arah? (Saturated vs Homogenous)
Pengujian ini menggunakan residual deviance dari kedua model (saturated dan homogenous).
Langkah-Langkah Pengujian
# 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)
Catatan Perhitungan Derajat Bebas dan Selisih Deviance
Ingat, dalam menghitung 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_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} \]
# 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 Ada Tidaknya Interaksi Antara Y dan Z (Homogenous Model vs Conditional Association on X)
Hipotesis
\(H_0: \lambda_{jk}^{YZ} = 0\) (Tidak ada interaksi antara pendapat hukuman mati (Y) dan fundamentalisme (Z))
\(H_1: \lambda_{jk}^{YZ} \neq 0\) (Ada interaksi antara pendapat hukuman mati (Y) dan fundamentalisme (Z))
Tingkat Signifikansi
\(\alpha = 5\%\)
Statistik Uji
\(\Delta\text{Deviance} = \text{Deviance model conditional on X} - \text{Deviance model homogenous}\)\(= 3.903 - 1.798 = 2.132\)
\(db = db_{\text{model conditional on X}} - db_{\text{model homogenous}} = 4 - 2 = 2\)
Daerah Penolakan
Tolak \(H_0\) jika \(\Delta\text{Deviance} > \chi^2_{0.05,2} = 5.991\)
Keputusan
Karena \(2.132 < 5.991\), maka tidak tolak \(H_0\)
Kesimpulan
Dengan taraf nyata 5%, belum cukup bukti untuk menolak \(H_0\) atau dapat dikatakan bahwa tidak ada interaksi antara pendapat tentang hukuman mati dan fundamentalisme. Dengan kata lain, model yang terbentuk adalah model tanpa parameter \(\lambda_{jk}^{YZ}\).
#Pengujian hipotesis
#Deviance of Model
Deviance.model <- model_conditional_X$deviance - model_homogenous$deviance
Deviance.model
## [1] 2.132302
Pengujian Selisih Deviance (Conditional on X vs Homogenous)
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
derajat.bebas <- 2
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_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{jk}^{YZ} \]
# 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
Pengujian Ada Tidaknya Interaksi antara X dan Z (Homogenous model vs Conditional Association on Y)
Hipotesis
\(H_0 : \lambda_{ik}^{XZ} = 0) \text{(Tidak ada interaksi antara jenis kelamin (X) dan fundamentalisme (Z)}\)
\(H_1 : \lambda_{ik}^{XZ} \neq 0) \text{(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
Pengujian Hipotesis Interaksi X dan Z (Conditional on Y vs Homogenous)
# 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_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \]
# 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
Pengujian Ada Tidaknya Interaksi antara X dan Y (Homogenous model vs Conditional Association on Z)
Hipotesis
\(H_0 : \lambda_{ij}^{XY} = 0) \text{(Tidak ada interaksi antara jenis kelamin (X) dan pendapat tentang hukuman mati (Y)}\)
\(H_1 : \lambda_{ij}^{XY} \neq 0) \text{(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
Pengujian Hipotesis Interaksi X dan Y (Conditional on Z vs Homogenous)
# 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_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} + \lambda_{ijk}^{XYZ} \] | 0.00 | 12 | 0 | 100.14 |
| Homogenous | \[ \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \] | 1.798 | 10 | 2 | 97.934 |
| Conditional on X | \[ \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} \] | 3.9303 | 8 | 4 | 96.067 |
| Conditional on Y | \[ \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{jk}^{YZ} \] | 2.9203 | 8 | 4 | 95.057 |
| Conditional on Z | \[ \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \] | 29.729 | 9 | 3 | 123.87 |
| Interaksi | Pengujian | Δ deviance | Δ 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_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} \]
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_M) = \exp(-0{,}593) =
0{,}552 \rightarrow \textbf{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_{1_{fav}}) =
\exp(0{,}483) = 1{,}621 \rightarrow \textbf{nilai odds}\]
Tanpa memperhatikan jenis kelamin dan fundamentalisme, peluang seseorang
mendukung hukuman mati adalah 1,621 kali dibandingkan yang
menolak.
\[\exp(\lambda^Z_{1_{fund}}) =
\exp(0{,}01986) = 1{,}02 \rightarrow \textbf{nilai odds}\]
Tanpa memperhatikan jenis kelamin dan pendapat mengenai hukuman mati,
peluang seseorang fundamentalis adalah 1,02 kali dibandingkan
liberal.
\[\exp(\lambda^Z_{2_{mod}}) =
\exp(0{,}381) = 1{,}464 \rightarrow \textbf{nilai odds}\]
Tanpa memperhatikan jenis kelamin dan pendapat mengenai hukuman mati,
peluang seseorang moderate adalah 1,464 kali dibandingkan
liberal.
\[\exp(\lambda^{XY}_{1M,1_{fav}}) =
\exp(0{,}658) = 1{,}932 \rightarrow \textbf{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:
\[ \hat\mu_{111}=exp(\lambda+\lambda_{1m}^x+\lambda_{1fav}^y+\lambda_{fund}^z+\lambda_{1m,1fav}^{xy}) \]
\[ =exp(4.265-0.593+0.483+0.01986+0.658) \]
\[ =exp(4.833) =125.595 \]
\[ \hat\mu_{112}=exp(\lambda+\lambda_{1m}^x+\lambda_{1fav}^y+\lambda_{2mod}^z+\lambda_{1m,1fav}^{xy}) \]
\[ =exp(4.265-0.593+0.483+0.381+0.658) \]
\[ =exp(5.195) =180.279 \]
\[ \hat\mu_{113}=exp(\lambda+\lambda_{1m}^x+\lambda_{1fav}^y+\lambda_{lib}^z+\lambda_{1m,1fav}^{xy}) \]
\[ =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 \]
Keterangan:
Nilai \[\hat\mu_{ijk}\] akan sama apapun referensi dari kategori peubahnya yang kita gunakan.
Membentuk Tabel Kontingensi 3 Arah
# Bentuk tabel kontingensi 3 dimensi
table3d <- xtabs(Frekuensi ~ Fundamentalisme + Jenis_Kelamin + Sikap, data = data)
# Tampilkan bentuk tabel
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
Kita akan memodelkan tabel ini menggunakan beberapa model log-linear, dimulai dari model yang paling lengkap (saturated), lalu model homogen (tanpa interaksi 3-arah), hingga model yang lebih sederhana.
## 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:
\[ \hat\mu_{111}=exp(\lambda+\lambda_{1m}^x+\lambda_{1fav}^y+\lambda_{fund}^z+\lambda_{1m,1fav}^{xy}) \]
\[ =exp(4.265-0.593+0.483+0.01986+0.658) \]
\[ =exp(4.833) =125.595 \]
\[ \hat\mu_{112}=exp(\lambda+\lambda_{1m}^x+\lambda_{1fav}^y+\lambda_{2mod}^z+\lambda_{1m,1fav}^{xy}) \]
\[ =exp(4.265-0.593+0.483+0.381+0.658) \]
\[ =exp(5.195) =180.279 \]
\[ \hat\mu_{113}=exp(\lambda+\lambda_{1m}^x+\lambda_{1fav}^y+\lambda_{lib}^z+\lambda_{1m,1fav}^{xy}) \]
\[ =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 \]
Keterangan:
Nilai\(\hat\mu_{ijk}\)akan sama apapun referensi dari kategori peubahnya yang kita gunakan.
Hasil perhitungan nilai fitted dari model log-linear terbaik menunjukkan bahwa interaksi dua arah sudah cukup untuk menjelaskan hubungan antara ketiga variabel kategorik yang diamati. Dengan menggunakan pendekatan model log-linear, kita dapat menangkap struktur dependensi antarvariabel secara lebih fleksibel dan menyeluruh dibandingkan metode uji asosiasi sederhana. Nilai-nilai prediksi (fitted values) yang diperoleh dari model tidak hanya memberikan gambaran yang akurat terhadap distribusi data, tetapi juga menjadi dasar untuk mengidentifikasi pola interaksi yang signifikan dalam konteks sosial yang lebih luas.
Pemahaman terhadap interaksi dua atau tiga arah sangat penting dalam riset ilmu sosial, kesehatan masyarakat, maupun pemasaran, di mana variabel kategorik sering kali saling memengaruhi. Oleh karena itu, teknik ini tidak hanya berguna untuk kepentingan akademik, namun juga relevan dalam pengambilan keputusan berbasis data di dunia nyata.
Agresti, A. (2010). Analysis of Ordinal Categorical Data, (2nd ed.). Wiley.
Agresti, A. (2013). Categorical Data Analysis (3rd ed.). Wiley.
Dobson, A. J., & Barnett, A. G. (2018). An Introduction to Generalized Linear Models (4th ed.). Chapman and Hall/CRC.
Faraway, J. J. (2016). Extending the Linear Model with R: Generalized Linear, Mixed Effects and Nonparametric Regression Models (2nd ed.). Chapman and Hall/CRC.
Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., & Rubin, D. B. (2013). Bayesian Data Analysis (3rd ed.). Chapman and Hall/CRC.
McCullagh, P., & Nelder, J. A. (1989). Generalized Linear Models (2nd ed.). Chapman and Hall/CRC.
Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied Logistic Regression. Wiley.
R Core Team. (2023). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing. https://www.R-project.org/
Venables, W. N., & Ripley, B. D. (2002). Modern Applied Statistics with S (4th ed.). Springer.
Wickham, H., & Grolemund, G. (2017). R for Data Science:
Import, Tidy, Transform, Visualize, and Model Data. O’Reilly Media.
https://r4ds.had.co.nz/
E-book ini telah membahas berbagai aspek penting dalam analisis data kategori, mulai dari pendekatan dasar menggunakan tabel kontingensi hingga pemodelan lanjutan dengan Generalized Linear Model (GLM), dengan fokus pada penerapan dalam konteks kesehatan. Pada Bab 1, kita mempelajari analisis tabel kontingensi 2x2, termasuk perhitungan peluang (bersama, marginal, dan bersyarat) serta ukuran asosiasi seperti Risk Difference, Relative Risk, dan Odds Ratio, menggunakan contoh hubungan antara merokok dan penyakit jantung. Bab 2 melanjutkan dengan inferensi statistik pada tabel kontingensi dua arah, mencakup estimasi parameter, pengujian hipotesis, dan analisis residual untuk mendeteksi anomali. Bab 3 memperluas analisis ke tabel kontingensi tiga arah, dengan fokus pada interaksi antar variabel, independensi bersyarat, dan uji homogenitas odds ratio. Bab 4 memperkenalkan GLM, termasuk keluarga eksponensial, regresi logistik untuk data biner, dan regresi Poisson untuk data hitungan. Bab 5 membahas inferensi GLM secara mendalam, seperti perhitungan ekspektasi dan variansi, penaksiran parameter, diagnostik model, dan inferensi untuk regresi logistik dan Poisson. Terakhir, Bab 6 menyediakan daftar pustaka yang menjadi referensi utama dalam penyusunan materi ini, yang dapat digunakan pembaca untuk studi lebih lanjut.
Melalui pembahasan tersebut, kita dapat memahami bahwa analisis data kategori menggunakan tabel kontingensi dan GLM merupakan alat yang sangat penting untuk menganalisis hubungan antar variabel dalam penelitian kesehatan. Tabel kontingensi memungkinkan kita untuk memahami hubungan dasar antar variabel kategori, sementara GLM memberikan fleksibilitas dalam memodelkan data yang tidak memenuhi asumsi normalitas. Namun, penting untuk selalu memeriksa asumsi model, seperti overdispersi dalam regresi Poisson, dan melakukan diagnostik untuk memastikan model yang dibangun sesuai dengan data.
Bagi pembaca yang ingin memperdalam topik ini, disarankan untuk mempelajari lebih lanjut tentang metode lanjutan seperti model campuran (mixed models) untuk data hierarkis, atau pendekatan Bayesian untuk inferensi statistik. Selain itu, eksplorasi lebih lanjut mengenai analisis data kategori dengan variabel lebih dari tiga dimensi atau penggunaan metode machine learning untuk data kategori juga dapat memberikan wawasan yang lebih kaya. Dengan memanfaatkan perangkat lunak statistik seperti R, pembaca dapat terus mengasah keterampilan analisis data dan menerapkannya dalam berbagai konteks penelitian atau aplikasi praktis.
Semoga e-book ini bermanfaat sebagai pengantar dan panduan awal dalam memahami analisis data kategori menggunakan tabel kontingensi dan GLM. Terima kasih kepada semua pembaca yang telah meluangkan waktu untuk mempelajari materi ini, dan semoga sukses dalam perjalanan analisis data Anda!