Pengertian Data Kategori
Data kategori adalah jenis data yang merepresentasikan karakteristik
kualitatif dari objek pengamatan dalam bentuk kategori atau label. Tidak
seperti data kuantitatif yang bersifat numerik dan dapat diukur secara
kontinu, data kategori hanya menunjukkan keanggotaan suatu observasi
dalam kelompok tertentu tanpa nilai numerik yang bermakna secara
aritmetika.
Contoh data kategori antara lain: - Jenis kelamin: Laki-laki atau Perempuan - Status pernikahan: Menikah, Belum Menikah, Cerai - Warna favorit: Merah, Biru, Hijau
Pengertian Analisis Data Kategori
Analisis data kategori adalah serangkaian metode statistik yang
digunakan untuk menggambarkan, menyimpulkan, dan memodelkan hubungan
antar variabel kategorik. Karena data kategori tidak memenuhi asumsi
distribusi normal dan tidak dapat digunakan dalam perhitungan seperti
rata-rata atau standar deviasi, maka teknik khusus seperti tabel
kontingensi, uji chi-square (\(\chi^2\)), dan regresi logistik
digunakan.
Tujuan dari analisis ini adalah untuk: 1. Menguji apakah terdapat asosiasi atau ketergantungan antar variabel kategori 2. Memprediksi hasil kategori berdasarkan satu atau lebih variabel penjelas 3. Menyusun model statistika yang cocok untuk data klasifikasi
Analisis data kategori digunakan untuk memahami dan menginterpretasikan data yang bersifat diskrit dan terbagi ke dalam kelompok tertentu. Data ini lazim dijumpai dalam berbagai penelitian sosial, medis, dan bisnis. Berikut adalah tujuan utama dari analisis data kategori:
Data kategori dapat digunakan untuk melihat distribusi kategori dalam satu variabel maupun hubungan antar kategori dalam dua atau lebih variabel. Hal ini penting untuk memahami pola-pola umum atau tren yang sedang berlangsung.
Melalui tabel kontingensi dan uji statistik seperti uji chi-square (\(\chi^2\)), kita dapat mengetahui apakah terdapat asosiasi yang signifikan antara dua variabel kategori.
Informasi dari analisis data kategori dapat dijadikan dasar pengambilan keputusan strategis, seperti penentuan target pasar atau kebijakan publik berbasis data.
Teknik seperti regresi logistik (\(\log \left(\frac{p}{1-p}\right)\)) digunakan untuk memprediksi probabilitas terjadinya suatu kejadian berdasarkan variabel-variabel kategori dan numerik.
Analisis terhadap data ordinal dapat mempertimbangkan urutan kategorinya (misalnya dalam regresi logistik ordinal), sedangkan data nominal biasanya dianalisis berdasarkan frekuensi atau proporsi.
Analisis terhadap variabel biner sering menggunakan regresi logistik biner, sementara untuk multikategori digunakan model regresi logistik multinomial.
Aspek | Data Kategori | Data Kuantitatif |
---|---|---|
Sifat | Diskrit, kelompok | Numerik, kontinu |
Operasi Statistik | Frekuensi, proporsi, chi-square | Rata-rata, standar deviasi, regresi linear |
Representasi | Tabel kontingensi, bar chart | Histogram, scatter plot |
Menilai hubungan antara latar belakang responden (gender, pendidikan, status sosial) dengan sikap atau perilaku tertentu, misalnya dalam survei opini publik atau studi perilaku konsumen.
Menilai efektivitas pengobatan berdasarkan kategori seperti jenis kelamin, status merokok, dan riwayat penyakit menggunakan tabel kontingensi dan regresi logistik.
Analisis segmen pelanggan berdasarkan preferensi produk, tingkat kepuasan, dan respons terhadap kampanye pemasaran.
Menghubungkan kategori prestasi belajar (tinggi/sedang/rendah) dengan metode belajar atau latar belakang siswa.
Evaluasi program berdasarkan kelompok demografis yang berbeda: misalnya efektivitas bantuan sosial antar wilayah atau kelompok usia.
Analisis distribusi kejahatan berdasarkan kategori waktu, tempat, jenis kejahatan, dan demografi pelaku/korban.
Tabel kontingensi adalah matriks dua arah atau lebih yang menyajikan frekuensi pengamatan untuk kombinasi kategori dari dua atau lebih variabel.
Uji Chi-Square (\(\chi^2\)) digunakan untuk menguji apakah terdapat hubungan antara dua variabel kategori.
\[ \chi^2 = \sum \frac{(O - E)^2}{E} \] Keterangan: - \(O\): Frekuensi yang diamati (Observed) - \(E\): Frekuensi yang diharapkan (Expected)
set.seed(123)
mat <- matrix(c(45, 55, 30, 70), nrow = 2, byrow = TRUE,
dimnames = list(Gender = c("Male", "Female"),
Response = c("Yes", "No")))
mat
## Response
## Gender Yes No
## Male 45 55
## Female 30 70
chisq.test(mat)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: mat
## X-squared = 4.1813, df = 1, p-value = 0.04087
Jika nilai p-value dari hasil uji Chi-Square lebih kecil dari tingkat signifikansi (misalnya 0.05), maka kita menolak hipotesis nol dan menyimpulkan bahwa ada hubungan antara variabel-variabel tersebut.
Regresi logistik digunakan untuk memodelkan hubungan antara satu variabel respons biner (kategori: 0 atau 1) dengan satu atau lebih variabel prediktor.
\[ \log\left(\frac{p}{1 - p}\right) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_k X_k \]
set.seed(123)
data <- data.frame(
age = rnorm(200, 35, 10),
gender = factor(sample(c("M", "F"), 200, replace = TRUE))
)
data$y <- rbinom(200, 1, plogis(-1 + 0.04 * data$age + ifelse(data$gender == "M", 0.6, 0)))
model <- glm(y ~ age + gender, data = data, family = "binomial")
summary(model)
##
## Call:
## glm(formula = y ~ age + gender, family = "binomial", data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.05560 0.68396 -3.005 0.002652 **
## age 0.07084 0.01881 3.765 0.000166 ***
## genderM 0.59214 0.31947 1.854 0.063810 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 258.98 on 199 degrees of freedom
## Residual deviance: 240.77 on 197 degrees of freedom
## AIC: 246.77
##
## Number of Fisher Scoring iterations: 3
Koefisien dari model logistik merepresentasikan log-odds. Jika koefisien positif, maka peluang terjadinya kejadian (y = 1) meningkat seiring bertambahnya nilai prediktor.
Analisis Correspondence adalah teknik eksplorasi yang digunakan untuk memvisualisasikan hubungan antara dua atau lebih variabel kategori dalam tabel kontingensi besar.
library(ca)
## Warning: package 'ca' was built under R version 4.4.3
data(smoke)
ca_result <- ca(smoke)
plot(ca_result)
Peta dua dimensi yang dihasilkan membantu mengidentifikasi kedekatan antara baris dan kolom dalam struktur data kategori.
Decision Tree membagi data ke dalam kelompok berdasarkan nilai dari fitur input menggunakan algoritma seperti CART. Metode ini sangat berguna dalam klasifikasi data kategori.
Random Forest menggabungkan banyak decision tree untuk meningkatkan akurasi dan mengurangi overfitting dengan cara voting mayoritas.
library(randomForest)
set.seed(123)
data$gender <- as.factor(data$gender)
data$y <- as.factor(data$y)
rf_model <- randomForest(y ~ age + gender, data = data, ntree = 100)
print(rf_model)
##
## Call:
## randomForest(formula = y ~ age + gender, data = data, ntree = 100)
## Type of random forest: classification
## Number of trees: 100
## No. of variables tried at each split: 1
##
## OOB estimate of error rate: 39%
## Confusion matrix:
## 0 1 class.error
## 0 6 64 0.9142857
## 1 14 116 0.1076923
Random Forest memberikan prediksi berbasis voting mayoritas dari banyak decision tree dan sering kali memberikan akurasi lebih baik dibandingkan satu pohon keputusan.
Distribusi Bernoulli adalah distribusi probabilitas diskret yang menggambarkan suatu proses dengan dua kemungkinan hasil: sukses (1) dan gagal (0). Distribusi ini sangat cocok untuk data kategori biner.
Distribusi Bernoulli digunakan untuk: - Memodelkan data dengan dua kategori, seperti lulus/gagal, ya/tidak. - Dasar untuk distribusi Binomial (karena Binomial adalah hasil penjumlahan dari beberapa Bernoulli). - Digunakan dalam evaluasi prediksi klasifikasi biner seperti True Positive/False Negative.
\[ P(X = x) = p^x (1 - p)^{1 - x}, \quad x \in \{0, 1\}, \quad 0 \leq p \leq 1 \] Keterangan: - \(x\): Hasil dari percobaan (0 atau 1) - \(p\): Probabilitas sukses
set.seed(123)
bernoulli_data <- rbinom(1000, size = 1, prob = 0.6)
table(bernoulli_data)
## bernoulli_data
## 0 1
## 393 607
Hasil simulasi akan menunjukkan frekuensi dari 0 dan 1. Misalnya, dengan \(p = 0.6\), maka sekitar 60% observasi akan menghasilkan 1 (sukses). Distribusi Bernoulli sangat bermanfaat dalam pengukuran hasil eksperimen atau kuesioner dengan jawaban “ya/tidak”.
Distribusi Binomial adalah perpanjangan dari distribusi Bernoulli yang memodelkan jumlah keberhasilan dari \(n\) percobaan independen yang masing-masing memiliki probabilitas keberhasilan \(p\).
Distribusi Binomial berguna untuk: - Menentukan peluang terjadinya \(k\) keberhasilan dalam \(n\) percobaan. - Digunakan dalam konteks uji hipotesis proporsi. - Cocok untuk mengamati kejadian seperti jumlah pelanggan yang membeli dari 10 orang yang dihubungi.
\[ P(X = k) = \binom{n}{k} p^k (1 - p)^{n - k}, \quad k = 0, 1, ..., n \]
set.seed(123)
binom_data <- rbinom(n = 1000, size = 10, prob = 0.5)
table(binom_data)
## binom_data
## 0 1 2 3 4 5 6 7 8 9 10
## 2 11 43 126 200 241 213 106 48 9 1
Distribusi hasil akan menunjukkan jumlah keberhasilan dari 10 percobaan. Misalnya, berapa banyak responden dari 10 orang yang memilih produk tertentu. Bentuk distribusinya cenderung simetris bila \(p = 0.5\) dan condong bila \(p \neq 0.5\).
Distribusi Multinomial adalah generalisasi dari distribusi Binomial di mana setiap percobaan memiliki lebih dari dua kemungkinan hasil. Cocok digunakan untuk variabel kategori yang memiliki lebih dari dua kelas.
\[ P(X_1 = x_1, ..., X_k = x_k) = \frac{n!}{x_1!x_2!...x_k!} p_1^{x_1} \cdots p_k^{x_k} \] Keterangan: - \(x_i\): jumlah observasi pada kategori ke-\(i\) - \(p_i\): probabilitas kategori ke-\(i\) - \(\sum x_i = n\), \(\sum p_i = 1\)
set.seed(123)
multi_data <- rmultinom(n = 1, size = 100, prob = c(0.4, 0.35, 0.25))
dimnames(multi_data) <- list(c("A", "B", "C"), NULL)
multi_data
## [,1]
## A 39
## B 36
## C 25
Hasil simulasi menggambarkan jumlah responden yang memilih masing-masing dari tiga kategori. Misalnya, dalam survei politik: 40 orang ke Partai A, 35 ke B, dan 25 ke C dari 100 responden.
Distribusi Poisson digunakan untuk memodelkan jumlah kejadian dalam interval waktu atau ruang tertentu dengan asumsi kejadian bersifat independen dan rata-rata kejadian (\(\lambda\)) diketahui.
\[ P(X = k) = \frac{e^{-\lambda} \lambda^k}{k!}, \quad k = 0, 1, 2, ... \]
set.seed(123)
poisson_data <- rpois(100, lambda = 3)
table(poisson_data)
## poisson_data
## 0 1 2 3 4 5 6 7 8
## 5 14 24 20 22 9 4 1 1
Distribusi ini memodelkan “jumlah” kejadian dalam unit waktu. Misalnya, jumlah pelanggan datang per jam adalah sekitar rata-rata 3, tetapi bisa jadi 1 atau 5 secara acak.
Desain sampling adalah langkah awal yang penting dalam suatu penelitian, khususnya pada tahap pengumpulan data. Tujuan utamanya adalah memastikan data yang terkumpul dapat memberikan gambaran yang akurat tentang populasi yang diteliti.
Dalam konteks analisis data kategori, desain sampling berfokus pada metode yang digunakan untuk memilih sampel dari populasi. Sampel yang dipilih dengan cara yang tepat diharapkan dapat mewakili populasi secara keseluruhan. Oleh karena itu, pemilihan sampel yang benar menjadi faktor kunci dalam menjamin keabsahan dan keandalan hasil analisis yang diperoleh.
Pada umumnya, desain sampling untuk analisis data kategori dapat dibagi dalam dua kategori utama, yaitu prospective sampling dan retrospective sampling. Masing-masing pendekatan ini memiliki ciri khas dan cara pemilihan sampel yang berbeda-beda.
Prospective sampling adalah metode pengambilan sampel di mana peneliti memantau partisipan dari waktu sekarang ke masa depan untuk mencatat kejadian atau hasil tertentu. Metode ini umumnya digunakan dalam penelitian longitudinal atau studi kohort prospektif. Dalam pendekatan ini, data dikumpulkan seiring berjalannya waktu untuk mengamati perkembangan kejadian yang relevan.
Beberapa tipe desain sampling dalam pendekatan ini meliputi:
Dalam penelitian eksperimental, pemilihan subjek dilakukan secara acak untuk dimasukkan ke dalam kelompok perlakuan atau kelompok kontrol. Beberapa teknik sampling yang umum digunakan dalam pendekatan ini antara lain:
Studi kohort merupakan jenis penelitian observasional di mana sekelompok individu (kohort) dengan karakteristik tertentu diikuti selama periode waktu yang ditentukan untuk mengamati pengaruh paparan (exposure) terhadap kejadian hasil tertentu, seperti penyakit, perilaku, atau kondisi lainnya. Beberapa teknik sampling yang umum digunakan dalam studi kohort adalah:
Retrospective sampling merupakan metode pengambilan sampel di mana peneliti menganalisis data yang telah terjadi sebelumnya untuk mengidentifikasi subjek berdasarkan hasil (outcome) yang sudah tercatat, kemudian melacak paparan (exposure) atau faktor penyebab yang berhubungan dengan hasil tersebut di masa lalu.
Dalam penelitian studi kasus-kontrol, individu dengan kondisi tertentu dibandingkan dengan individu yang tidak memiliki kondisi tersebut. Beberapa teknik sampling yang sering digunakan antara lain:
Studi kohort retrospektif menggunakan data masa lalu untuk mengelompokkan individu berdasarkan paparan yang telah terjadi, dan kemudian menganalisis hasil yang muncul. Beberapa teknik sampling yang umum digunakan antara lain:
Tabel kontingensi 2x2 digunakan untuk menampilkan data kategorik dari dua variabel, di mana masing-masing variabel memiliki dua kategori. Tabel ini sangat berguna dalam menganalisis hubungan atau asosiasi antara dua variabel, seperti dalam uji chi-kuadrat atau untuk menghitung risiko relatif (relative risk), perbedaan risiko (risk difference), dan odds ratio.
Struktur umumnya adalah sebagai berikut:
Kategori B1 | Kategori B2 | Total | |
---|---|---|---|
Kategori A1 | a | b | a + b |
Kategori A2 | c | d | c + d |
Total | a + c | b + d | n |
Peluang bersama mengacu pada probabilitas bahwa kedua variabel muncul secara bersamaan dalam sebuah sel tabel kontingensi:
\[ P(A_i, B_j) = \frac{n_{ij}}{n} \]
Peluang marginal merujuk pada probabilitas terjadinya suatu variabel tanpa memperhatikan variabel lainnya.
\[ P(A_i) = \frac{n_{i.}}{n} \]
\[ P(B_j) = \frac{n_{.j}}{n} \]
Peluang bersyarat mengacu pada probabilitas terjadinya suatu kejadian dengan asumsi bahwa kejadian lain sudah terjadi:
\[ P(B_j | A_i) = \frac{P(A_i, B_j)}{P(A_i)} = \frac{n_{ij}}{n_{i.}} \]
Misalkan kita memiliki tabel yang menggambarkan hubungan antara jenis diet dan keberhasilan penurunan berat badan pada sekelompok individu.
Weight Loss Successful | Weight Loss Unsuccessful | Total | |
---|---|---|---|
Low-Carb Diet | 35 | 5 | 40 |
Low-Fat Diet | 25 | 15 | 40 |
Total | 60 | 20 | 80 |
Sumber: Adaptasi dari data yang dipublikasikan dalam studi “Effectiveness of Low-Carb vs Low-Fat Diets”, American Journal of Clinical Nutrition, 2020.
Langkah 1 : Hitung Peluang Bersama
Peluang bersama adalah probabilitas bahwa kedua variabel terjadi secara bersamaan dalam suatu sel tabel kontingensi. Berdasarkan tabel di atas, kita dapat menghitung peluang bersama untuk masing-masing kategori:
Langkah 2 : Hitung Peluang Marginal
Peluang marginal adalah probabilitas kejadian suatu variabel tanpa mempertimbangkan variabel lainnya. Berikut adalah perhitungan peluang marginal untuk setiap kategori:
Langkah 3 : Hitung Peluang Bersyarat
Peluang bersyarat adalah probabilitas suatu kejadian terjadi dengan syarat kejadian lain telah terjadi. Berikut adalah perhitungan peluang bersyarat untuk setiap kategori:
\[ P(\text{Success}|\text{Low-Carb}) = \frac{35}{40} = 0.8750 \]
\[ P(\text{Success}|\text{Low-Fat}) = \frac{25}{40} = 0.6250 \]
\[ P(\text{Unsuccessful}|\text{Low-Carb}) = \frac{5}{40} = 0.1250 \]
\[ P(\text{Unsuccessful}|\text{Low-Fat}) = \frac{15}{40} = 0.3750 \]
Dengan langkah-langkah di atas, kita telah berhasil menghitung peluang bersama, peluang marginal, dan peluang bersyarat berdasarkan tabel data yang diberikan.
# Data
data <- matrix(c(35, 5, 25, 15), nrow = 2, byrow = TRUE)
colnames(data) <- c("Weight Loss Successful", "Weight Loss Unsuccessful")
rownames(data) <- c("Low-Carb Diet", "Low-Fat Diet")
n <- sum(data)
# Peluang Bersama
p_bersama <- data / n
# Peluang Marginal
p_marginal_baris <- rowSums(data) / n
p_marginal_kolumn <- colSums(data) / n
# Peluang Bersyarat
p_bersyarat <- data / rowSums(data)
# Hasil
list(Peluang_Bersama = p_bersama,
Peluang_Marginal_Baris = p_marginal_baris,
Peluang_Marginal_Kolumn = p_marginal_kolumn,
Peluang_Bersyarat = p_bersyarat)
## $Peluang_Bersama
## Weight Loss Successful Weight Loss Unsuccessful
## Low-Carb Diet 0.4375 0.0625
## Low-Fat Diet 0.3125 0.1875
##
## $Peluang_Marginal_Baris
## Low-Carb Diet Low-Fat Diet
## 0.5 0.5
##
## $Peluang_Marginal_Kolumn
## Weight Loss Successful Weight Loss Unsuccessful
## 0.75 0.25
##
## $Peluang_Bersyarat
## Weight Loss Successful Weight Loss Unsuccessful
## Low-Carb Diet 0.875 0.125
## Low-Fat Diet 0.625 0.375
Intepretasi : Jika kita membandingkan hasil peluang bersyarat, kita dapat melihat bahwa \(P(\text{Weight Loss Successful}|\text{Low-Carb Diet})\) lebih besar daripada \(P(\text{Weight Loss Successful}|\text{Low-Fat Diet})\), yang menunjukkan bahwa diet rendah karbohidrat memiliki tingkat keberhasilan yang lebih tinggi dibandingkan dengan diet rendah lemak dalam membantu penurunan berat badan.
Ukuran asosiasi dalam analisis data kategorik digunakan untuk mengukur kekuatan hubungan antara dua variabel kategorik. Ini penting untuk mengetahui apakah hubungan yang ada signifikan dan seberapa kuat hubungan tersebut. Berikut adalah beberapa ukuran asosiasi yang umum digunakan:
Risk Difference (RD), yang juga dikenal sebagai Pengurangan Risiko Absolut, digunakan untuk mengukur selisih antara tingkat risiko dua kelompok. Nilai RD menunjukkan perbedaan proporsi kejadian antara kelompok yang terpapar dan yang tidak terpapar.
Rumus:
\[ RD = \frac{a}{a + b} - \frac{c}{c + d} \]
Keterangan: - Jika \(RD > 0\), maka risiko kejadian lebih tinggi pada Grup 1 dibandingkan dengan Grup 2. - Jika \(RD < 0\), maka risiko kejadian lebih rendah pada Grup 1 dibandingkan dengan Grup 2. - Jika \(RD = 0\), maka tidak ada perbedaan risiko antara dua kelompok.
Relative Risk (RR) digunakan untuk membandingkan kemungkinan terjadinya suatu kejadian pada kelompok yang terpapar dibandingkan dengan kelompok yang tidak terpapar.
Rumus:
\[ RR = \frac{a / (a + b)}{c / (c + d)} \]
Keterangan: - Jika \(RR > 1\), maka kejadian lebih sering terjadi pada Grup 1 dibandingkan Grup 2. - Jika \(RR < 1\), maka kejadian lebih jarang terjadi pada Grup 1 dibandingkan Grup 2. - Jika \(RR = 1\), maka tidak ada perbedaan antara kedua kelompok.
Odds Ratio digunakan untuk membandingkan peluang terjadinya suatu kejadian antara dua kelompok. Biasanya digunakan dalam studi kasus-kontrol.
Rumus:
\[ OR = \frac{a \cdot d}{b \cdot c} \]
Keterangan: - Jika \(OR > 1\), maka peluang kejadian lebih besar pada Grup 1 dibandingkan Grup 2. - Jika \(OR < 1\), maka peluang kejadian lebih kecil pada Grup 1 dibandingkan Grup 2. - Jika \(OR = 1\), maka tidak ada perbedaan peluang kejadian antara kedua kelompok.
Misalkan kita memiliki data yang menunjukkan hubungan antara dua jenis diet (Low-Carb Diet dan Low-Fat Diet) dengan keberhasilan penurunan berat badan pada sekelompok orang. Berikut adalah tabel kontingensi 2x2 untuk data tersebut:
Weight Loss Successful | Weight Loss Unsuccessful | Total | |
---|---|---|---|
Low-Carb Diet | 35 | 5 | 40 |
Low-Fat Diet | 25 | 15 | 40 |
Total | 60 | 20 | 80 |
Sumber: Adaptasi dari studi “Effectiveness of Low-Carb vs Low-Fat Diets”, American Journal of Clinical Nutrition, 2020.
Langkah pertama adalah menghitung Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR) menggunakan rumus yang telah disebutkan sebelumnya.
Perhitungan Risk Difference (RD):
\[ RD = \frac{35}{35 + 5} - \frac{25}{25 + 15} = \frac{35}{40} - \frac{25}{40} = 0.875 - 0.625 = 0.25 \]
Perhitungan Relative Risk (RR):
\[ RR = \frac{\frac{35}{40}}{\frac{25}{40}} = \frac{0.875}{0.625} = 1.4 \]
Perhitungan Odds Ratio (OR):
\[ OR = \frac{35 \cdot 15}{5 \cdot 25} = \frac{525}{125} = 4.2 \]
# Data
a <- 35
b <- 5
c <- 25
d <- 15
# Risk Difference
RD <- (a / (a + b)) - (c / (c + d))
# Relative Risk
RR <- (a / (a + b)) / (c / (c + d))
# Odds Ratio
OR <- (a * d) / (b * c)
# Hasil
list(Risk_Difference = RD, Relative_Risk = RR, Odds_Ratio = OR)
## $Risk_Difference
## [1] 0.25
##
## $Relative_Risk
## [1] 1.4
##
## $Odds_Ratio
## [1] 4.2
Intepretasi :
Estimasi titik dalam konteks data kategori, khususnya dalam tabel kontingensi dua arah, biasanya ditujukan untuk menghitung proporsi atau odds ratio dari kategori tertentu.
Contoh: \[ \hat{p} = \frac{x}{n} \] Dimana: - \(x\) = jumlah kejadian kategori yang diamati - \(n\) = total sampel
Untuk membuat estimasi yang mencerminkan ketidakpastian pengukuran, interval kepercayaan digunakan. Salah satu metode yang umum digunakan adalah interval kepercayaan Wald:
\[ \hat{p} \pm Z_{1-\alpha/2} \cdot \sqrt{\frac{\hat{p}(1 - \hat{p})}{n}} \]
Namun untuk nilai \(p\) mendekati 0 atau 1, metode Wilson Score atau Clopper-Pearson lebih direkomendasikan karena lebih akurat.
Digunakan untuk menguji apakah proporsi kategori tertentu berbeda dengan nilai yang ditentukan.
Hipotesis: - \(H_0: p = p_0\) - \(H_1: p \neq p_0\)
Statistik uji: \[ Z = \frac{\hat{p} - p_0}{\sqrt{\frac{p_0(1 - p_0)}{n}}} \]
Untuk mengevaluasi apakah dua variabel kategori saling terkait dalam tabel kontingensi.
Statistik Chi-Square: \[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
Contoh kode simulasi:
observed <- matrix(c(30, 10, 20, 40), nrow = 2)
chisq.test(observed)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: observed
## X-squared = 15.042, df = 1, p-value = 0.0001052
Sama seperti uji asosiasi, namun khusus difokuskan untuk memverifikasi ketergantungan antar variabel kategori dalam tabel kontingensi.
Jika p-value < 0.05, maka hipotesis nol ditolak dan kedua variabel dikatakan tidak independen (ada hubungan).
Kelebihan uji ini: - Umum digunakan dalam data survei dan eksperimen sosial - Memberikan insight dasar sebelum membangun model log-linear
Analisis residual berguna untuk mengetahui sel mana dalam tabel kontingensi yang menyumbang paling besar terhadap statistik uji.
Jenis residual: - Residual mentah: \[ R_{ij} = O_{ij} - E_{ij} \] - Pearson Residual: \[ r_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \] - Standardized residual (Z-score-like)
Jika nilai residual besar (positif atau negatif), maka sel tersebut menyimpang secara signifikan dari ekspektasi.
Dengan menganalisis residual, kita dapat mendeteksi anomali (outlier) dalam distribusi kategori.
Contoh:
model <- chisq.test(matrix(c(50, 20, 30, 40), nrow = 2))
model$observed
## [,1] [,2]
## [1,] 50 30
## [2,] 20 40
model$expected
## [,1] [,2]
## [1,] 40 40
## [2,] 30 30
model$residuals
## [,1] [,2]
## [1,] 1.581139 -1.581139
## [2,] -1.825742 1.825742
Jika residual > 2 atau < -2, maka kemungkinan besar sel tersebut adalah kontributor signifikan terhadap ketidaksesuaian model.
Bab ini akan mengupas secara mendalam tentang tabel kontingensi tiga arah, termasuk pembahasan mengenai tabel parsial dan marginal, ukuran asosiasi, paradoks Simpson, independensi bersyarat, serta asosiasi homogen. Setiap topik dilengkapi dengan contoh perhitungan manual dan implementasi dalam R.
Tabel kontingensi tiga arah merupakan pengembangan dari tabel kontingensi dua arah yang digunakan untuk menganalisis hubungan antara tiga variabel kategori secara bersamaan. Dalam beberapa kasus, hubungan antara dua variabel (misalnya X dan Y) bisa dipengaruhi oleh variabel ketiga Z, yang dikenal sebagai variabel kontrol atau kovariat. Tabel ini umumnya digunakan dalam analisis data yang melibatkan faktor-faktor pengganggu yang dapat memengaruhi hubungan antara dua variabel utama. Sebagai contoh:
Tabel kontingensi tiga arah umumnya dibagi menjadi dua jenis, yaitu:
Tabel Parsial: Tabel yang menampilkan hubungan antara X dan Y di setiap kategori Z. Ini memungkinkan analisis yang memperhitungkan efek Z, sehingga memberikan pemahaman yang lebih mendalam tentang hubungan yang bersyarat.
Tabel Marginal: Tabel yang dihasilkan dengan mengabaikan variabel Z, yaitu dengan menjumlahkan seluruh kategori Z. Ini memberikan gambaran umum hubungan antara X dan Y tanpa mempertimbangkan Z. Namun, analisis dengan tabel marginal sering kali dapat mengarah pada distorsi interpretasi, seperti yang terlihat pada Paradoks Simpson.
Kegunaan Tabel Marginal
Tabel marginal berguna untuk melihat pola asosiasi secara keseluruhan tanpa memperhitungkan variabel kontrol. Namun, dalam banyak kasus, tabel marginal mungkin tidak memberikan gambaran yang akurat karena mengabaikan efek yang dimiliki oleh variabel Z. Oleh karena itu, untuk mendapatkan hasil yang lebih tepat dan mendalam, analisis yang melibatkan tabel parsial biasanya lebih disarankan dalam penelitian ilmiah.
Tabel parsial adalah tabel yang mengelompokkan𝑋dan𝑌berdasarkan setiap level 𝑍, sedangkan tabel marginal adalah tabel yang mengabaikan𝑍,dengan menjumlahkan data dari semua level𝑍.
Contoh :
Tabel berikut menunjukkan data mengenai peristiwa pertama kali melakukan hubungan seksual pada remaja berusia 15 dan 16 tahun berdasarkan ras dan jenis kelamin.
Ras | Jenis Kelamin | Ya (Intercourse) | Tidak (No) |
---|---|---|---|
Putih | Laki-laki | 43 | 134 |
Putih | Perempuan | 26 | 149 |
Hitam | Laki-laki | 29 | 23 |
Hitam | Perempuan | 22 | 36 |
Sumber: S. P. Morgan dan J. D. Tenchman, J.{Marriage Fam.} 50: 929–936 (1988). Dicetak kembali dengan izin dari National Council on Family Relations.
Membuat Tabel Parsial
Tabel frekuensi parsial menyajikan hubungan antara dua variabel kategori dalam tabel kontingensi tiga arah dengan mempertimbangkan satu variabel sebagai kontrol. Tabel ini membantu dalam menambah hubungan bersyarat antara variabel dalam analisis data kategori.
Tabel Frekuensi Parsial untuk Z (Ras) = Putih:
Jenis Kelamin | Ya (Intercourse) | Tidak (No) |
---|---|---|
Laki-laki | 43 | 134 |
Perempuan | 26 | 149 |
Tabel Frekuensi Parsial untuk Z (Ras) = Putih menunjukkan hubungan antara jenis kelamin dan apakah individu tersebut sudah atau belum melakukan hubungan seksual.
Tabel Frekuensi Parsial untuk Z (Ras) = Hitam:
Jenis Kelamin | Ya (Intercourse) | Tidak (No) |
---|---|---|
Laki-laki | 29 | 23 |
Perempuan | 22 | 36 |
Tabel Frekuensi Parsial untuk Z (Ras) = Hitam menunjukkan hubungan antara jenis kelamin dan apakah individu tersebut sudah atau belum melakukan hubungan seksual pada kelompok ras Hitam.
Membuat Tabel Parsial Menggunakan R
# Membuat data dengan array
data3 <- array(
c(43, 26, 134, 149, 29, 22, 23, 36),
dim = c(2, 2, 2),
dimnames = list(
Jenis_Kelamin = c("Laki-laki", "Perempuan"),
Intercourse = c("Ya", "Tidak"),
Ras = c("Putih", "Hitam")
)
)
# Tampilkan array untuk memastikan datanya
data3
## , , Ras = Putih
##
## Intercourse
## Jenis_Kelamin Ya Tidak
## Laki-laki 43 134
## Perempuan 26 149
##
## , , Ras = Hitam
##
## Intercourse
## Jenis_Kelamin Ya Tidak
## Laki-laki 29 23
## Perempuan 22 36
# Ekstrak tabel frekuensi parsial berdasarkan ras
freq_parsial_putih <- data3[, , "Putih"]
freq_parsial_hitam <- data3[, , "Hitam"]
# Tampilkan hasil frekuensi parsial
freq_parsial_putih
## Intercourse
## Jenis_Kelamin Ya Tidak
## Laki-laki 43 134
## Perempuan 26 149
freq_parsial_hitam
## Intercourse
## Jenis_Kelamin Ya Tidak
## Laki-laki 29 23
## Perempuan 22 36
Tabel frekuensi marginal menampilkan jumlah total observasi untuk setiap variabel dengan mengabaikan variabel lainnya dalam tabel kontingensi tiga arah. Tabel ini membantu dalam memahami distribusi kategori secara agregat tanpa mempertimbangkan hubungan antarvariabel. Tabel frekuensi marginal dihitung dengan menjumlahkan frekuensi dari tabel kontingensi tiga arah berdasarkan variabel yang tersisa.
Membuat Tabel Marginal
abel Frekuensi Marginal untuk Ras dan Intercourse
Ras | Yes | No | Total |
---|---|---|---|
White | 69 | 283 | 352 |
Black | 51 | 59 | 110 |
Total | 120 | 342 | 462 |
Tabel Frekuensi Marginal untuk Gender dan Intercourse
Gender | Yes | No | Total |
---|---|---|---|
Male | 72 | 157 | 229 |
Female | 48 | 185 | 233 |
Total | 120 | 342 | 462 |
Membuat Tabel Marginal Menggunakan R
# Membuat data dengan array
data3 <- array(
c(43, 26, 134, 149, 29, 22, 23, 36),
dim = c(2, 2, 2),
dimnames = list(
Jenis_Kelamin = c("Laki-laki", "Perempuan"),
Intercourse = c("Ya", "Tidak"),
Ras = c("Putih", "Hitam")
)
)
# Tampilkan array untuk memastikan datanya
data3
## , , Ras = Putih
##
## Intercourse
## Jenis_Kelamin Ya Tidak
## Laki-laki 43 134
## Perempuan 26 149
##
## , , Ras = Hitam
##
## Intercourse
## Jenis_Kelamin Ya Tidak
## Laki-laki 29 23
## Perempuan 22 36
# Ekstrak tabel frekuensi parsial berdasarkan ras
freq_marginal_X<-apply(data3,1,sum)
freq_marginal_Z<-apply(data3,3,sum)
# Tampilkan hasil frekuensi parsial
freq_marginal_X
## Laki-laki Perempuan
## 229 233
freq_marginal_Z
## Putih Hitam
## 352 110
Misalkan
Tabel berikut menunjukkan data mengenai peristiwa pertama kali melakukan hubungan seksual pada remaja berusia 15 dan 16 tahun berdasarkan ras dan jenis kelamin.
Ras | Jenis Kelamin | Ya (Intercourse) | Tidak (No) |
---|---|---|---|
Putih | Laki-laki | 43 | 134 |
Putih | Perempuan | 26 | 149 |
Hitam | Laki-laki | 29 | 23 |
Hitam | Perempuan | 22 | 36 |
Sumber: S. P. Morgan dan J. D. Tenchman, J.{Marriage Fam.} 50: 929–936 (1988). Dicetak kembali dengan izin dari National Council on Family Relations.
Peluan bersama didefinisikan sebagai:
\[ P(Z, X, Y) = \frac{f(Z, X, Y)}{N} \] Contoh Perhitungan dengan Data diatas
# Load library yang diperlukan
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:randomForest':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Data dalam format array 3D
data <- array(
c(43, 26, 134, 149, # Putih
29, 22, 23, 36), # Hitam
dim = c(2, 2, 2),
dimnames = list(
"Jenis Kelamin" = c("Lelaki", "Perempuan"),
"Intercouse" = c("Ya", "Tidak"),
"Ras" = c("Putih", "Hitam")
)
)
# Menampilkan tabel
print(data)
## , , Ras = Putih
##
## Intercouse
## Jenis Kelamin Ya Tidak
## Lelaki 43 134
## Perempuan 26 149
##
## , , Ras = Hitam
##
## Intercouse
## Jenis Kelamin Ya Tidak
## Lelaki 29 23
## Perempuan 22 36
total <- sum(data)
joint_prob <- data/ total
ftable(joint_prob)
## Ras Putih Hitam
## Jenis Kelamin Intercouse
## Lelaki Ya 0.09307359 0.06277056
## Tidak 0.29004329 0.04978355
## Perempuan Ya 0.05627706 0.04761905
## Tidak 0.32251082 0.07792208
Intepretasi : Pria yang tidak berhubungan seksual cenderung lebih banyak berkulit putih dibandingkan dengan kulit hitam, sedangkan wanita yang tidak berhubungan seksual cenderung lebih banyak berkulit putih juga.
Peluang marginal didefinisikan sebagai berikut
untuk Ras: \[ P(Z) = \frac{n(Z)}{N} \]
marginal_Z <- apply(joint_prob, 3, sum)
marginal_Z
## Putih Hitam
## 0.7619048 0.2380952
Intepretasi : Proporsi Ras Putih lebih banyak dibanding ras Hitam.
Untuk Gender: \[ P(X) = \frac{n(X)}{N} \]
marginal_X <- apply(joint_prob, 1, sum)
marginal_X
## Lelaki Perempuan
## 0.495671 0.504329
Intepretasi : Proporsi perempuan lebih banyak dibanding laki - laki
Contoh : Mencari peluang seseorang ber - ras tertentu jika ia laki - laki dan melakukan hubungan seksual: \[ P(Ras| X = Laki-laki,Y=1) = \frac{P(Ras,Laki-laki,Y=1)}{P(X=Laki - laki,Y=1)} \]
p_Z_given_X_Y <- prop.table(data, margin = c(1,2))
p_Z_given_X_Y
## , , Ras = Putih
##
## Intercouse
## Jenis Kelamin Ya Tidak
## Lelaki 0.5972222 0.8535032
## Perempuan 0.5416667 0.8054054
##
## , , Ras = Hitam
##
## Intercouse
## Jenis Kelamin Ya Tidak
## Lelaki 0.4027778 0.1464968
## Perempuan 0.4583333 0.1945946
Intepretasi : Peluang seseorang memiliki ras putih ketika ia laki - laki dan melakukan hubungan seksual adalah 0.597. Dan peluang seseorang memiliki ras hitam ketika ia laki - laki dan melakukan hubungan seksual adalah 0.403
\[ RD = \frac{a}{a + b} - \frac{c}{c + d} \]
# Hitung RD untuk masing-masing ras
rd_putih <- (data["Lelaki", "Ya", "Putih"] / sum(data["Lelaki", , "Putih"])) -
(data["Perempuan", "Ya", "Putih"] / sum(data["Perempuan", , "Putih"]))
rd_hitam <- (data["Lelaki", "Ya", "Hitam"] / sum(data["Lelaki", , "Hitam"])) -
(data["Perempuan", "Ya", "Hitam"] / sum(data["Perempuan", , "Hitam"]))
rd_putih
## [1] 0.09436642
rd_hitam
## [1] 0.178382
Intepretasi : Perbedaan peluang (RD) menunjukkan bahwa laki - laki meningkatkan potensi untuk melakukan hubungan seksual sekitar 0.0943 (9.4%) untuk ras putih dan sekitar 0.178382 untuk ras hitam.
\[ RR = \frac{a / (a + b)}{c / (c + d)} \]
#Menghitung RR untuk masing masing ras
rr_putih <- (data["Lelaki", "Ya", "Putih"] / sum(data["Lelaki", , "Putih"])) /
(data["Perempuan", "Ya", "Putih"] / sum(data["Perempuan", , "Putih"]))
rr_hitam <- (data["Lelaki", "Ya", "Hitam"] / sum(data["Lelaki", , "Hitam"])) /
(data["Perempuan", "Ya", "Hitam"] / sum(data["Perempuan", , "Hitam"]))
rr_putih
## [1] 1.635159
rr_hitam
## [1] 1.47028
Intepretasi : Risiko relatif (RR) menunjukkan bahwa laki - laki memiliki 1.5 kali lipat potensi melakukan hubungan seksual dibandingkan perempuan untuk ras putih , dan 1.47 kali lipat untuk ras hitam.
\[ OR = \frac{a \cdot d}{b \cdot c} \]
# Menghitung Odds Ratio untuk masing masing ras
or_putih <- (data["Lelaki", "Ya", "Putih"] / data["Lelaki", "Tidak", "Putih"]) /
(data["Perempuan", "Ya", "Putih"] / data["Perempuan", "Tidak", "Putih"])
or_hitam <- (data["Lelaki", "Ya", "Hitam"] / data["Lelaki", "Tidak", "Hitam"]) /
(data["Perempuan", "Ya", "Hitam"] / data["Perempuan", "Tidak", "Hitam"])
or_putih
## [1] 1.838978
or_hitam
## [1] 2.063241
Intepretasi :
Odds Ratio (OR) mengindikasikan bahwa kemungkinan laki-laki melakukan hubungan seksual 1,83 kali lebih besar dibandingkan perempuan pada kelompok ras putih, dan 2,063 kali lebih besar pada kelompok ras hitam.
Analisis tabel kontingensi tiga arah bertujuan untuk memahami hubungan antara dua variabel kategori dengan memperhitungkan pengaruh dari variabel ketiga sebagai pengontrol. Misalnya, kita ingin meneliti apakah terdapat perbedaan perilaku hubungan seksual pertama kali di usia 16–17 tahun (Y) antara laki-laki dan perempuan (X), sambil mengendalikan faktor ras (Z).
Dalam pendekatan ini, data disajikan dalam bentuk beberapa tabel parsial 2×2 berdasarkan setiap kategori variabel kontrol (Z), serta satu tabel marginal yang mengabaikan pengaruh Z secara keseluruhan.
Ukuran asosiasi utama yang digunakan untuk membandingkan hubungan antara dua variabel dalam setiap tabel parsial adalah odds ratio (OR). Jika nilai OR dari masing-masing tabel parsial menunjukkan pola yang seragam atau tidak jauh berbeda, maka kita dapat menyimpulkan adanya asosiasi yang konsisten. Dalam kasus seperti itu, estimasi odds ratio gabungan dapat dihitung menggunakan pendekatan Mantel-Haenszel, yang memberikan ukuran asosiasi keseluruhan dengan mempertimbangkan variabel kontrol.
Independensi bersyarat adalah konsep penting dalam analisis data ketika kita ingin melihat hubungan antara dua hal (misalnya, jenis kelamin dan perilaku) sambil mempertimbangkan pengaruh dari faktor ketiga (seperti ras atau tingkat pendidikan). Dua variabel dikatakan independen secara bersyarat terhadap variabel ketiga jika peluang (odds) hubungan di setiap kelompok dari variabel ketiga kurang lebih sama, yaitu mendekati 1. Untuk mengetahui hal ini secara statistik, biasanya digunakan uji Cochran-Mantel-Haenszel (CMH) yang dirancang khusus untuk melihat hubungan dua variabel dengan mengontrol faktor lain.
Salah satu metode statistik yang umum digunakan untuk menguji independensi bersyarat dalam tabel kontingensi tiga arah adalah Uji Cochran-Mantel-Haenszel (CMH). Uji ini bertujuan untuk mengevaluasi apakah terdapat hubungan yang konsisten antara dua variabel kategori (misalnya X dan Y), setelah mengendalikan pengaruh dari variabel ketiga (Z), yang bisa menjadi faktor pengganggu atau confounder.
Dengan kata lain, uji CMH membantu menentukan apakah hubungan antara X dan Y tetap ada atau berubah ketika kita memperhitungkan keberadaan Z dalam analisis. Jika tidak ada perbedaan yang signifikan dalam odds ratio antar strata Z, maka bisa disimpulkan bahwa X dan Y saling independen secara bersyarat terhadap Z.
Statistik uji Cochran-Mantel-Haenszel (CMH) dirumuskan sebagai:
\[ CMH = \frac{\sum_k \left( n_{1ik} - \mu_{1ik} \right)^2}{\sum_k \text{var}(n_{1ik})} \]
Keterangan
\[ \mu_{1ik} = E(n_{1ik}) = \frac{n_{1.k} \cdot n_{1ik}}{n_{.k}} \]
Varians dari \(n_{1ik}\) diberikan oleh:
\[ \text{var}(n_{1ik}) = \frac{n_{1.k} \cdot n_{2.k} \cdot n_{1ik} \cdot n_{2.k}}{n_{2.k}^2 \cdot (n_{.k} - 1)} \]
Contoh:
Untuk memahami bagaimana uji Cochran-Mantel-Haenszel (CMH) digunakan, kita akan melihat contoh sederhana yang mengevaluasi hubungan antara merokok (X) dan kanker paru-paru (Y), dengan jenis kelamin (Z) sebagai variabel kontrol. Data ini diklasifikasikan dalam dua tabel 2×2, masing-masing untuk kelompok laki-laki dan perempuan:
Tabel Kontingensi
Ras: Putih
Intercourse (Ya) | Intercourse (Tidak) | Total | |
---|---|---|---|
Laki-laki | 43 | 134 | 177 |
Perempuan | 26 | 149 | 175 |
Ras: Hitam
Intercourse (Ya) | Intercourse (Tidak) | Total | |
---|---|---|---|
Laki-laki | 29 | 23 | 52 |
Perempuan | 22 | 36 | 58 |
Perhitungan manual
Rumus nilai harapan \(\mu_{1ik}\) untuk setiap strata \(k\):
\[ \mu_{1ik} = \frac{(n_{i+k} \times n_{+ik})}{n_{++k}} \]
Di mana: - \(n_{i+k}\) = Total laki - laki dalam strata \(k\) - \(n_{+ik}\) = Total Intercourse dalam strata \(k\) - \(n_{++k}\) = Total individu dalam strata \(k\)
Untuk Ras Putih (k=1):
\[ \mu_{111} = \frac{(177 \times 69)}{352} = 34.696 \]
Untuk Ras Hitam (k=2):
\[ \mu_{112} = \frac{(52 \times 51)}{110} = 24,109 \]
Rumus varians:
\[ \text{Var}(n_{1ik}) = \frac{n_{i+k} \times n_{0+k} \times n_{+ik} \times n_{+0k}}{n_{++k}^2 \times (n_{++k} - 1)} \]
Untuk Ras Putih (k=1):
\[ \text{Var}(n_{111}) = \frac{(177 \times 134 \times 43 \times 149)}{352^2 \times (352 - 1)} = 13.91 \]
Untuk Ras Hitam (k=2):
\[ \text{Var}(n_{112}) = \frac{(175 \times 149 \times 26 \times 134)}{350^2 \times (350 - 1)} = 9.91 \]
Rumus statistik CMH:
\[ X^2_{CMH} = \frac{\sum_k (n_{1ik} - \mu_{1ik})^2}{\sum_k \text{Var}(n_{1ik})} \]
\[ X^2_{CMH} = \frac{((43 - 34.696) + (29 - 24.109))^2}{13.91 + 9.91} = 7.309 \]
Intepretasi : Misalkan dengan taraf signifikansi 5%, maka kita memiliki nilai kritis sebesar 3.841. Dikarenakan 7.309 > 3.841 maka hipotesis nol ditolak yang berarti terdapat hubungan signifikan antara jenis kelamin terhadap perlakuan intercourse setelah mengontrol variabel ras.
Perhitungan dengan R
data_cmh <- array(
c(43, 26, 134, 149, # Putih
29, 22, 23, 36), # Hitam
dim = c(2, 2, 2),
dimnames = list(
"Jenis Kelamin" = c("Lelaki", "Perempuan"),
"Intercouse" = c("Ya", "Tidak"),
"Ras" = c("Putih", "Hitam")
)
)
# Menampilkan tabel
print(data_cmh)
## , , Ras = Putih
##
## Intercouse
## Jenis Kelamin Ya Tidak
## Lelaki 43 134
## Perempuan 26 149
##
## , , Ras = Hitam
##
## Intercouse
## Jenis Kelamin Ya Tidak
## Lelaki 29 23
## Perempuan 22 36
cmh_base <- mantelhaen.test(data, correct = FALSE)
cmh_base
##
## Mantel-Haenszel chi-squared test without continuity correction
##
## data: data
## Mantel-Haenszel X-squared = 8.3751, df = 1, p-value = 0.003804
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.229343 2.967939
## sample estimates:
## common odds ratio
## 1.910135
Intepretasi dan Kesimpulan : Karena nilai p sebesar 0.003804 lebih kecil dari taraf signifikansi 0.05, maka keputusan yang diambil adalah menolak hipotesis nol (H₀). Hal ini menunjukkan bahwa terdapat hubungan yang signifikan secara statistik antara kebiasaan merokok dan kejadian kanker paru-paru, setelah mengendalikan variabel jenis kelamin sebagai faktor perancu.
Generalized Linear Model (GLM) adalah sebuah pengembangan dari model regresi linear klasik. GLM dirancang untuk memodelkan data di mana variabel respons tidak mengikuti distribusi normal, atau hubungan antara variabel prediktor dengan rata-rata variabel respons tidak bersifat linear. GLM terdiri dari tiga komponen utama:
Distribusi dikatakan termasuk dalam keluarga eksponensial (exponential family) jika dapat ditulis dalam bentuk umum sebagai berikut:
\[ f(y; \theta, \phi) = \exp \left\{ \frac{y\theta - b(\theta)}{\phi} + c(y, \phi) \right\} \]
Contoh Distribusi yang Termasuk Exponential Family:
Contoh Pembuktian: Distribusi Binomial
Fungsi probabilitas distribusi binomial adalah:
\[ P(Y = y) = \binom{n}{y} \pi^y (1 - \pi)^{n - y} \]
Tuliskan ulang dalam bentuk exponential family:
\[ P(Y = y) = \exp \left\{ \log \binom{n}{y} + y \log \left( \frac{\pi}{1 - \pi} \right) + n \log (1 - \pi) \right\} \]
Dengan substitusi:
Kesimpulan : Dengan bentuk tersebut, maka distribusi binomial termasuk dalam keluarga exponential family.
Regresi Logistik mirip dengan regresi linear dalam hal penggabungan nilai input secara linear menggunakan bobot (koefisien) untuk menghasilkan prediksi. Perbedaannya adalah regresi logistik membatasi hasil prediksi menjadi nilai biner, yaitu 0 atau 1, dengan bantuan fungsi sigmoid sebagai fungsi aktivasi. Fungsi sigmoid ini mengubah output menjadi nilai antara 0 dan 1, membentuk kurva berbentuk S.
Model ini digunakan untuk menganalisis hubungan antara satu atau lebih variabel independen dan untuk mengklasifikasikan data ke dalam kategori diskrit. Artinya, regresi logistik sangat berguna dalam masalah klasifikasi, terutama yang memiliki dua kategori kemungkinan (dikenal sebagai klasifikasi biner).
Sebagai contoh, angka 0 dapat melambangkan kegagalan, sementara angka 1 menunjukkan keberhasilan.
Beberapa contoh penerapan regresi logistik dalam klasifikasi biner antara lain:
Memprediksi Pembelian Produk: Model regresi logistik dapat digunakan untuk memperkirakan apakah seorang pelanggan akan membeli suatu produk berdasarkan variabel seperti usia, penghasilan, status pernikahan, dan frekuensi kunjungan ke toko.
Memprediksi Kegagalan Mesin: Dalam industri manufaktur, regresi logistik dapat digunakan untuk memprediksi apakah sebuah mesin akan mengalami kegagalan berdasarkan faktor-faktor seperti umur mesin, jam operasional, suhu, dan tekanan.
Memprediksi Kemungkinan Penurunan Harga Saham: Dalam pasar keuangan, model regresi logistik dapat digunakan untuk memperkirakan apakah harga saham suatu perusahaan akan turun pada periode tertentu berdasarkan variabel seperti kinerja keuangan, tren pasar, dan faktor makroekonomi.
Keunggulan Utama Regresi Logistik
Regresi logistik sangat cocok digunakan dalam Machine Learning Proses pelatihan (training) dan pengujian (testing) relatif sederhana. Model ini belajar dari pola-pola dalam data input dan menghubungkannya dengan output (label). Karena tidak membutuhkan komputasi yang tinggi, regresi logistik mudah diimplementasikan, dipahami, dan dilatih dibandingkan dengan metode lain dalam Machine Learning.
Cocok untuk data yang bisa dipisahkan secara linear Jika dua kelas data bisa dipisahkan dengan garis lurus (linear), maka regresi logistik akan sangat efektif dalam mengklasifikasikan data tersebut ke dalam dua kelompok berbeda. Dalam konteks ini, variabel target (y) hanya memiliki dua nilai, sehingga model bisa menentukan batas yang jelas di antara keduanya.
Memberikan wawasan yang bermakna Regresi logistik juga bisa menunjukkan seberapa besar pengaruh suatu variabel terhadap hasil akhir, melalui koefisiennya. Selain itu, model ini juga menunjukkan apakah hubungan antar variabel bersifat positif atau negatif.
Persamaan dan Asumsi dalam Regresi Logistik Model ini menggunakan fungsi sigmoid, yaitu fungsi matematika berbentuk kurva S yang mengubah nilai output ke dalam rentang antara 0 dan 1. Jika hasil dari fungsi sigmoid (yang merepresentasikan probabilitas) lebih tinggi dari ambang batas tertentu, maka model akan mengklasifikasikan data sebagai bagian dari suatu kelas. Sebaliknya, jika di bawah ambang tersebut, maka data dianggap tidak termasuk dalam kelas itu.
Selain itu, jika keluaran dari fungsi sigmoid (yaitu probabilitas yang diperkirakan) lebih besar dari ambang batas yang telah ditentukan, maka model akan memprediksi bahwa observasi tersebut termasuk dalam kelas tertentu. Sebaliknya, jika nilai probabilitas tersebut lebih kecil dari ambang batas, model akan memprediksi bahwa observasi tersebut tidak termasuk ke dalam kelas tersebut.
Sebagai contoh:
Fungsi sigmoid digunakan dalam regresi logistik untuk mengubah nilai prediksi menjadi probabilitas. Rumus dari fungsi sigmoid yaitu: \[ f(x) = \frac{1}{1 + e^{-x}} \]
# Simulasi data untuk regresi logistik
set.seed(42)
n <- 100
x <- seq(-4, 4, length.out = n)
log_odds <- -0.5 + 1.5 * x
prob <- 1 / (1 + exp(-log_odds))
y <- rbinom(n, 1, prob)
# Buat data frame
data <- data.frame(x=x, y=y, prob = prob)
Plot Kurva Sigmoid
# Visualisasi menggunakan base R plot
# Visualisasi menggunakan base R
# Plot the data
plot(x, y,
pch = 16,
col = "gray60",
xlab = "X",
ylab = "Y / Probabilitas",
main = "Simulasi Regresi Logistik dengan Kurva Sigmoid")
lines(x, prob, col = "blue", lwd = 2)
abline(h = 0.5, col = "red", lty = 2)
legend("topleft", legend = c("Data Biner (0/1)", "Kurva Logistik", "Ambang 0.5"),
col = c("gray60", "blue", "red"),
pch = c(16, NA, NA),
lty = c(NA, 1, 2),
lwd = c(NA, 2, 1),
pt.cex = 1.5, bty = "n")
Kurva sigmoid dalam regresi logistik menunjukkan hubungan non-linear antaravariabel prediktor dan probabilitas output. Pendekatan ini efektif untuk klasifikasi biner seperti deteksi penyakit, kelulusan siswa, dan prediksi ya/tidak.
Fungsi Link (Logit): Fungsi link logit dapat dinyatakan dalam bentuk berikut:
\[ g(\mu) = \log \left( \frac{\mu}{1 - \mu} \right) \]
Model Regresi Logistik:
\[ \log \left( \frac{\mu}{1 - \mu} \right) = X\beta \]
Fungsi Inverse Link:
\[ \mu = \frac{\exp(X\beta)}{1 + \exp(X\beta)} \]
Estimasi Parameter
Metode estimasi parameter pada GLM umumnya menggunakan Maximum Likelihood Estimation (MLE).
Log-likelihood fungsi untuk regresi logistik:
\[ l(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \] Dengan:
\[ \pi_i = \frac{\exp(X\beta)}{1 + \exp(X\beta)} \]
Contoh Kasus dengan R
Misalkan kita memiliki tabel tentang hubungan antara metode pengobatan dan kesembuhan kanker.
Cancer Controlled | Cancer Not Controlled | Total | |
---|---|---|---|
Surgery | 21 | 2 | 23 |
Radiation Therapy | 15 | 3 | 18 |
Total | 36 | 5 | 41 |
Source : Reprinted with permisiion from W.M. Mendenhall, R.R. Million D.E. Sharkey, and N.J. Cassisi, Internat. J. Radiat. Oncol. Biol. Phys. 10: 357-363 (1984), Pergamon Press plc.
# Buat data frame berdasarkan tabel
data <- data.frame(
Treatment = c(rep(1, 21), rep(1, 2), # Surgery: Controlled (21), Not Controlled (2)
rep(0, 15), rep(0, 3)), # Radiation: Controlled (15), Not Controlled (3)
CancerControlled = c(rep(1, 21), rep(0, 2),
rep(1, 15), rep(0, 3))
)
# Tampilkan data
head(data)
Estimasi Regresi Logistik Estimasi parameter model regresi logistik dapat menggunakan ‘glm’ function
model <- glm(CancerControlled ~ Treatment, data = data, family = binomial)
summary(model)
##
## Call:
## glm(formula = CancerControlled ~ Treatment, family = binomial,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.6094 0.6325 2.545 0.0109 *
## Treatment 0.7419 0.9735 0.762 0.4460
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 30.405 on 40 degrees of freedom
## Residual deviance: 29.810 on 39 degrees of freedom
## AIC: 33.81
##
## Number of Fisher Scoring iterations: 5
Interpretasi Koefisien
• Intercept ((Intercept)): nilai log-odds saat x=0
• Koefisien x: perubahan log-odds untuk setiap satu satuan peningkatan pada x
• Nilai p: menunjukkan signifikansi statistik dari prediktor
Koefisien log-odds dapat ditransformasikan ke odds ratio:
exp(coef(model))
## (Intercept) Treatment
## 5.0 2.1
Prediksi dan Visualisasi Kurva Logit
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
##
## Attaching package: 'ggplot2'
## The following object is masked from 'package:randomForest':
##
## margin
data$pred <- predict(model, type = "response")
ggplot(data, aes(x=Treatment, y=CancerControlled)) +
geom_point(alpha = 0.5, color = "gray40") +
geom_line(aes(y=pred), color = "blue", linewidth = 1.5) +
labs(title = "Kurva Logit pada Regresi Logistik",
x="X (Prediktor)",
y="Probabilitas / Respons") +
theme_minimal()
GLM adalah kerangka model fleksibel untuk berbagai jenis data dan distribusi. Regresi logistik merupakan salah satu contoh penting dari GLM, sangat berguna dalam analisis data kategorik biner. Estimasi parameter dilakukan melalui metode MLE dan dapat diselesaikan secara efisien dengan fungsi glm di R.
Regresi Poisson digunakan ketika variabel respons adalah data cacah (count data),yaitu bilangan bulat non negatif. Model ini merupakan bagian dari Generalized Linear Model(GLM) dengan asumsi bahwa distribusi variabel respons adalah distribusi Poisson.
Distribusi Poisson memiliki fungsi probabilitas:
\[ P(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!} \]
Distribusi Poisson dapat dituliskan dalam bentuk exponential family sebagai berikut:
\[ f(y; \theta) = \exp \left\{ y \log(\lambda) - \lambda - \log(y!) \right\} \]
dengan:
Maka distribusi Poisson termasuk dalam exponential family.
Fungsi Link
Fungsi link kanonik untuk distribusi Poisson adalah fungsi logaritma:
\[ g(\mu) = \log(\mu) \]
Sehingga modelnya menjadi:
\[ \log(\mu_i) = x_i^T \beta \]
dan fungsi inverse link:
\[ \mu_i = \exp(x_i^T \beta) \]
Estimasi Parameter
Estimasi parameter \(( \beta )\)
dilakukan dengan metode Maximum Likelihood Estimation
(MLE).
Log-likelihood fungsi untuk regresi Poisson:
\[ l(\beta) = \sum_{i=1}^n \left[ y_i x_i^T \beta - \exp(x_i^T \beta) - \log(y_i!) \right] \]
Nilai \(( \beta )\) dapat diperoleh melalui metode numerik seperti iterasi Newton-Raphson.
Contoh:
Misalkan kita memiliki data sebagai berikut:
# Buat data frame berdasarkan tabel
data <- data.frame(
Treatment = c(rep(1, 21), rep(1, 2), # Surgery: Controlled (21), Not Controlled (2)
rep(0, 15), rep(0, 3)), # Radiation: Controlled (15), Not Controlled (3)
CancerControlled = c(rep(1, 21), rep(0, 2),
rep(1, 15), rep(0, 3))
)
# Tampilkan data
head(data)
lambda <- exp(0.3 + 0.6 * data$Treatment)
Estimasi Regresi Poisson
poisson_model <- glm(CancerControlled ~ Treatment, data = data, family = poisson())
summary(poisson_model)
##
## Call:
## glm(formula = CancerControlled ~ Treatment, family = poisson(),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.18232 0.25819 -0.706 0.480
## Treatment 0.09135 0.33806 0.270 0.787
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 9.3638 on 40 degrees of freedom
## Residual deviance: 9.2905 on 39 degrees of freedom
## AIC: 85.29
##
## Number of Fisher Scoring iterations: 4
Plot Hasil Prediksi
plot(data$Treatment, data$CancerControlled, pch = 16, col = "darkgray", main = "Data dan Hasil Prediksi")
newdata <- data.frame(Treatment=seq(min(data$Treatment), max(data$Treatment), length.out = 100))
pred <- predict(poisson_model, newdata = newdata, type = "response")
lines(newdata$Treatment, pred, col = "blue", lwd = 2)
Diagnostik dan Overdispersion
Salah satu asumsi penting dari model Poisson adalah bahwa mean dan varians dari variabel respons adalah sama (𝐸[𝑌]=𝑉𝑎𝑟[𝑌]). Jika varians lebih besar dari mean, maka terjadi overdispersion. Untuk mendeteksi overdispersion:
dispersion <- sum(residuals(poisson_model, type = "pearson")^2) / poisson_model$df.residual
dispersion
## [1] 0.1282051
Jika nilai dispersion > 1, maka overdispersion mungkin terjadi dan model alternatif seperti Negative Binomial Regression dapat digunakan.
exp(coef(poisson_model))
## (Intercept) Treatment
## 0.8333333 1.0956522
Visualisasi Prediksi
data$predicted <- predict(poisson_model, type = "response")
library(ggplot2)
ggplot(data, aes(x=data$Treatment, y=data$CancerControlled)) +
geom_jitter(width = 0.2, alpha = 0.6) +
geom_point(aes(CancerControlled=predicted), shape = 18, size = 3, color = "black") +
labs(title = "Prediksi", x="Treatment", y="CancerControlled") +
theme_minimal()
## Warning in geom_point(aes(CancerControlled = predicted), shape = 18, size = 3,
## : Ignoring unknown aesthetics: CancerControlled
## Warning: Use of `data$Treatment` is discouraged.
## ℹ Use `Treatment` instead.
## Warning: Use of `data$CancerControlled` is discouraged.
## ℹ Use `CancerControlled` instead.
## Warning: Use of `data$Treatment` is discouraged.
## ℹ Use `Treatment` instead.
## Warning: Use of `data$CancerControlled` is discouraged.
## ℹ Use `CancerControlled` instead.
Evaluasi Model
# Plot residuals
plot(poisson_model$residuals,
main = "Residual Plot",
ylab = "Residual",
xlab = "Index",
pch = 19,
col = "steelblue")
abline(h = 0, col = "red", lty = 2)
Dalam Generalized Linear Model (GLM), inferensi statistik membutuhkan pemahaman terhadap ekspektasi dan variansi dari estimator model, terutama untuk mengembangkan alat-alat uji seperti Wald test, Likelihood Ratio test, dan interval kepercayaan.
Ekspektasi dan Varians dalam GLM
Ekspektasi menunjukkan apakah suatu estimator tak bias, yaitu:
\[ \mathbb{E}[\hat{\beta}] = \beta \]
Dalam GLM, MLE dari \(\hat{\beta}\) bersifat asymptotically unbiased.
Varians menunjukkan presisi dari estimasi parameter:
\[ \text{Var}(\hat{\beta}) \approx (\mathbf{X}^T \mathbf{W} \mathbf{X})^{-1} \]
dimana \(\mathbf{W}\) adalah matriks bobot yang tergantung pada distribusi dan fungsi link.
Distribusi Asimptotik Estimator
Dengan ukuran sampel besar:
\[ \hat{\beta} \sim \mathcal{N}(\beta, \text{Var}(\hat{\beta})) \]
Distribusi ini adalah dasar dari:
Varians dalam GLM Tidak Konstan
Tidak seperti regresi linear (OLS) yang mengasumsikan homoskedastisitas:
\[ \text{Var}(Y_i) = \sigma^2 \]
Dalam GLM:
\[ \text{Var}(Y_i) = \phi V(\mu_i) \]
Contoh:
Contoh Regresi Poisson
# Buat data frame berdasarkan tabel
data <- data.frame(
Treatment = c(rep(1, 21), rep(1, 2), # Surgery: Controlled (21), Not Controlled (2)
rep(0, 15), rep(0, 3)), # Radiation: Controlled (15), Not Controlled (3)
CancerControlled = c(rep(1, 21), rep(0, 2),
rep(1, 15), rep(0, 3))
)
# Tampilkan data
head(data)
# Ringkasan model regresi Poisson
model <- glm(CancerControlled ~ Treatment, data = data, family = poisson())
summary(model)
##
## Call:
## glm(formula = CancerControlled ~ Treatment, family = poisson(),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.18232 0.25819 -0.706 0.480
## Treatment 0.09135 0.33806 0.270 0.787
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 9.3638 on 40 degrees of freedom
## Residual deviance: 9.2905 on 39 degrees of freedom
## AIC: 85.29
##
## Number of Fisher Scoring iterations: 4
Kesimpulan:
Ekspektasi
Jika diturunkan berdasarkan fungsi momen:
\[ E(Y) = \int y f(y; \theta) \, dy = \mu \]
Untuk keluarga eksponensial:
\[ \log f(y; \theta) = a(y) + b(\theta) y + c(\theta) \]
atau:
\[ \log f(y; \theta) = y \theta - b(\theta) + c(y) \]
Maka ekspektasi turunan pertama:
\[ U(\theta) = \frac{\partial \ell}{\partial \theta} = y - b'(\theta) \] Dan ekspektasi turunan pertama:
\[ \mathbb{E}[U(\theta)] = \mathbb{E}[y - b'(\theta)] = \mu - b'(\theta) = 0 \]
Maka:
\[ \mu = b'(\theta) \]
Varians
Turunan kedua:
\[ \frac{\partial^2 \ell}{\partial \theta^2} = -b''(\theta) \]
Sehingga:
\[ \text{Var}(Y) = b''(\theta) = \phi V(\mu) \]
Maximum Likelihood Estimation (MLE)
Namun, karena bentuk GLM tidak eksplisit, digunakan metode numerik.
Metode Optimisasi: Newton-Raphson
Iterasi:
\[ \beta^{(t+1)} = \beta^{(t)} - H^{-1}(\beta^{(t)}) U(\beta^{(t)}) \] Fisher Scoring
IRLS (Iteratively Reweighted Least Square) - Modifikasi dari Fisher scoring, hasil estimasi mirip dengan Least Square.
Implementasi Newton-Raphson Statistik score ke-𝑗 Statistik score ke-𝑗:
\[ U_j(\beta) = \frac{\partial \log L(\beta)}{\partial \beta_j} \] Turunan kedua:
\[ H_{jk}(\beta) = \frac{\partial^2 \log L(\beta)}{\partial \beta_j \partial \beta_k} \]
Taylor expansion:
\[ U(\beta^*) \approx U(\beta) + H(\beta)(\beta^* - \beta) \]
Estimasi parameter:
\[ \hat{\beta} \approx \beta^{(t)} - H^{-1}(\beta^{(t)}) U(\beta^{(t)}) \]
Diagnostik digunakan untuk mengevaluasi apakah model sudah tepat.
Statistik Devians
\[ D = 2 \sum \left[ y_i \log \left( \frac{y_i}{\hat{\mu}_i} \right) - (y_i - \hat{\mu}_i) \right] \]
Statistik Chi-Kuadrat Pearson
\[ X^2 = \sum \left( \frac{(y_i - \hat{\mu}_i)^2}{\hat{\mu}_i} \right) \] • Jika signifikan → model lebih baik daripada tanpa model.
Catatan
• Untuk data yang dikelompokkan, statistik devians dan chi-kuadrat Pearson mengikuti distribusi ChiSquare.
• Untuk data tidak dikelompokkan, tidak mengikuti distribusi Chi-Square.
• Devians diminimalkan oleh MLE → cocok digunakan untuk evaluasi model.
Analisis Residual
• Residual adalah selisih antara observasi dengan prediksi.
• Dapat digunakan untuk memeriksa penyimpangan sistematis.
• Dapat diplot untuk menilai asumsi model
Regresi logistik digunakan untuk memodelkan probabilitas dari variabel respons biner (0/1) berdasarkan satu atau lebih variabel prediktor. Estimasi parameter dilakukan menggunakan Maximum Likelihood Estimation (MLE) karena model tidak linear dalam parameternya.
Fungsi model logistik:
\[ \pi(x) = \frac{\exp(\beta_0 + \beta_1 x)}{1 + \exp(\beta_0 + \beta_1 x)} \]
Log-likelihood untuk \(( n )\) observasi:
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \] Estimasi dengan Newton-Raphson
Metode Newton-Raphson digunakan untuk mencari nilai parameter \(( \beta )\) yang memaksimalkan fungsi log-likelihood pada model regresi logistik.
Fungsi Log-Likelihood
Model regresi logistik untuk probabilitas:
\[ \pi_i = \frac{1}{1 + \exp(-x_i^\top \beta)} \]
Log-likelihood untuk \(( n )\) observasi:
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \]
Langkah-langkah Newton-Raphson Turunan dalam Estimasi Logistik
\[ U(\beta) = \frac{\partial \ell(\beta)}{\partial \beta} = X^\top (y - \pi) \]
\[ H(\beta) = -X^\top W X, \quad \text{dengan } W = \text{diag}(\pi_i (1 - \pi_i)) \]
\[ \beta^{(t+1)} = \beta^{(t)} + (X^\top W^{(t)} X)^{-1} X^\top (y - \pi^{(t)}) \]
Estimasi MLE dengan Newton-Raphson (Manual di R)
# Buat data frame berdasarkan tabel
data <- data.frame(
Treatment = c(rep(1, 21), rep(1, 2), # Surgery: Controlled (21), Not Controlled (2)
rep(0, 15), rep(0, 3)), # Radiation: Controlled (15), Not Controlled (3)
CancerControlled = c(rep(1, 21), rep(0, 2),
rep(1, 15), rep(0, 3))
)
# Tampilkan data
head(data)
beta_true <- c(-1, 2)
X <- cbind(1, data$Treatment)
eta <- X %*% beta_true
p <- 1 / (1 + exp(-eta))
Newton-Raphson Iterasi Manual
# Inisialisasi
beta <- matrix(0, ncol = 1, nrow = ncol(X))
tol <- 1e-6
max_iter <- 100
# Iterasi Newton-Raphson
for (i in 1:max_iter) {
eta <- X %*% beta
pi_hat <- 1 / (1 + exp(-eta))
W <- diag(as.vector(pi_hat * (1 - pi_hat)))
z <- eta + (data$CancerControlled- pi_hat) / (pi_hat * (1 - pi_hat))
beta_new <- solve(t(X) %*% W %*% X) %*% (t(X) %*% W %*% z)
if (sum(abs(beta_new - beta)) < tol) break
beta <- beta_new
}
# Hasil akhir
beta
## [,1]
## [1,] 1.6094379
## [2,] 0.7419373
• Estimasi parameter pada model regresi logistik dilakukan dengan MLE. • Newton-Raphson adalah metode numerik yang digunakan untuk memaksimalkan log-likelihood.
• Iterasi didasarkan pada turunan pertama (score) dan kedua (Hessian).
• Prosedur identik dengan IRLS (Iteratively Reweighted Least Squares) dalam implementasi GLM.
Inferensi Parameter
Tujuan Uji Wald
Untuk menguji signifikansi parameter \((
\beta_j )\) dalam model regresi logistik:
Teori Wald Test
Dari teori estimasi MLE, estimator \((
\hat{\beta}_j )\) mendekati distribusi normal:
\[ \hat{\beta}_j \sim N(\beta_j, \text{Var}(\hat{\beta}_j)) \]
Jika \(( H_0 )\) benar (yaitu \(( \beta_j = 0 )\)), maka:
\[ Z = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim N(0,1) \]
Dengan Statistik Wald:
\[ W = Z^2 = \left( \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \right)^2 \sim \chi^2_1 \]
Uji Wald Langkah demi Langkah
# Buat data frame berdasarkan tabel
data <- data.frame(
Treatment = c(rep(1, 21), rep(1, 2), # Surgery: Controlled (21), Not Controlled (2)
rep(0, 15), rep(0, 3)), # Radiation: Controlled (15), Not Controlled (3)
CancerControlled = c(rep(1, 21), rep(0, 2),
rep(1, 15), rep(0, 3))
)
log_odds <- -0.5 + 1.2 * data$Treatment
p <- 1 / (1 + exp(-log_odds))
model <- glm(CancerControlled ~ Treatment, data = data, family = binomial)
summary(model)
##
## Call:
## glm(formula = CancerControlled ~ Treatment, family = binomial,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.6094 0.6325 2.545 0.0109 *
## Treatment 0.7419 0.9735 0.762 0.4460
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 30.405 on 40 degrees of freedom
## Residual deviance: 29.810 on 39 degrees of freedom
## AIC: 33.81
##
## Number of Fisher Scoring iterations: 5
Langkah 1: Ambil nilai koefisien dan standard error (SE)
beta_hat <- coef(model)["Treatment"]
se_beta <- summary(model)$coefficients["Treatment", "Std. Error"]
Langkah 2: Hitung Statistik Z
Z <- beta_hat / se_beta
Z
## Treatment
## 0.7621674
Langkah 3: Hitung Statistik Wald
Wald_stat <- Z^2
Wald_stat
## Treatment
## 0.5808991
Langkah 4: Hitung p-value
p_value <- 1 - pchisq(Wald_stat, df = 1)
p_value
## Treatment
## 0.4459601
Interpretasi
• Jika p-value < 0.05, maka koefisien signifikan → variabel prediktor berpengaruh.
• Jika p-value > 0.05, maka tidak ada cukup bukti untuk menolak - \(( H_0 )\)
Kesimpulan
Uji Wald didasarkan pada rasio antara estimasi parameter dan standar error-nya. Dengan menaikkan nilai Z menjadi kuadrat (Z²), kita memperoleh distribusi Chi-Square untuk pengujian hipotesis parameter individual dalam model regresi logistik
Bandingkan model penuh dengan model tanpa prediktor
# Model null
model_null <- glm(CancerControlled ~ 1, data = data, family = binomial)
# Likelihood ratio test
anova(model_null, model, test = "Chisq")
Evaluasi Kebaikan Model
Semakin kecil AIC, semakin baik model.
AIC(model)
## [1] 33.81041
Alternatif terhadap AIC, menghukum kompleksitas model.
BIC(model)
## [1] 37.23755
• Estimasi regresi logistik dilakukan dengan MLE melalui iterasi Newton-Raphson.
• Inferensi parameter dapat dilakukan dengan uji Wald dan likelihood ratio (uji Chi-Square).
• AIC dan BIC digunakan untuk mengevaluasi kompleksitas dan kecocokan model.
Model regresi Poisson digunakan untuk memodelkan data count (jumlah kejadian) dimana variabel respons mengikuti distribusi Poisson. Estimasi dilakukan dengan Maximum Likelihood Estimation (MLE), dan inferensi dilakukan dengan uji Wald dan Likelihood Ratio Test.
Model Regresi Poisson
Distribusi Poisson:
\[ P(Y_i = y_i) = \frac{e^{-\lambda_i} \lambda_i^{y_i}}{y_i!} \]
Model regresi Poisson:
\[ \log(\lambda_i) = x_i^T \beta \] Estimasi Parameter (MLE)
Log-likelihood fungsi:
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\lambda_i) - \lambda_i - \log(y_i!) \right] \]
Dengan:
\[ \lambda_i = \exp(x_i^T \beta) \]
Estimasi dilakukan dengan metode iterasi (IRLS)
Estimasi parameter model regresi Poisson menggunakan pendekatan
Maximum Likelihood Estimation (MLE) dengan metode
Iteratively Reweighted Least Squares (IRLS) secara
manual, tanpa menggunakan glm()
.
Tahap 1: Definisikan Model Regresi Poisson
\[ \log(\lambda_i) = x_i^T \beta \quad \Rightarrow \quad \lambda_i = \exp(x_i^T \beta) \]
Tahap 2: Mencari Log-likelihood yang dimaksimumkan
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\lambda_i) - \lambda_i - \log(y_i!) \right] \] Tahap 3: Formulasi iteratif:
\[ \beta^{(t+1)} = \left( \mathbf{X}^T \mathbf{W}^{(t)} \mathbf{X} \right)^{-1} \mathbf{X}^T \mathbf{W}^{(t)} \mathbf{z}^{(t)} \]
Dengan:
dan
\[ \eta_i = \log(\lambda_i) = x_i^T \beta \] Simulasi Data
# Buat data frame berdasarkan tabel
data <- data.frame(
Treatment = c(rep(1, 21), rep(1, 2), # Surgery: Controlled (21), Not Controlled (2)
rep(0, 15), rep(0, 3)), # Radiation: Controlled (15), Not Controlled (3)
CancerControlled = c(rep(1, 21), rep(0, 2),
rep(1, 15), rep(0, 3))
)
X <- cbind(1, data$Treatment) # Tambah intercept
beta_true <- c(0.5, 0.8)
eta <- X %*% beta_true
lambda <- exp(eta)
IRLS Manual Step-by-Step
# Inisialisasi
beta <- c(0, 0)
tol <- 1e-6
max_iter <- 100
for (i in 1:max_iter) {
eta <- X %*% beta
lambda <- exp(eta)
W <- diag(as.numeric(lambda))
z <- eta + (data$CancerControlled - lambda) / lambda
beta_new <- solve(t(X) %*% W %*% X) %*% t(X) %*% W %*% z
if (sum(abs(beta_new - beta)) < tol) {
cat("Konvergen pada iterasi ke-", i, "\n")
break
}
beta <- beta_new
}
## Konvergen pada iterasi ke- 4
beta # hasil estimasi
## [,1]
## [1,] -0.18232155
## [2,] 0.09134977
Perbandingan dengan glm
model_glm <- glm(data$CancerControlled ~ data$Treatment, family = poisson())
summary(model_glm)
##
## Call:
## glm(formula = data$CancerControlled ~ data$Treatment, family = poisson())
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.18232 0.25819 -0.706 0.480
## data$Treatment 0.09135 0.33806 0.270 0.787
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 9.3638 on 40 degrees of freedom
## Residual deviance: 9.2905 on 39 degrees of freedom
## AIC: 85.29
##
## Number of Fisher Scoring iterations: 4
• IRLS memberikan cara iteratif untuk menghitung estimasi MLE dalam regresi Poisson.
• Hasil manual IRLS sangat mendekati hasil glm() dari R.
• Metode ini memberikan pemahaman mendalam atas mekanisme di balik fungsi glm().
Pengujian hipotesis Uji Wald
Untuk menguji H0: = 0
# Koefisien dan standar error
coef_val <- coef(model)[2]
se_val <- summary(model)$coefficients[2, 2]
wald_z <- coef_val / se_val
wald_chisq <- wald_z^2
p_value <- 1 - pchisq(wald_chisq, df = 1)
cat("Z:", wald_z, "\nChi-Square:", wald_chisq, "\np-value:", p_value)
## Z: 0.7621674
## Chi-Square: 0.5808991
## p-value: 0.4459601
Uji Likelihood Ratio (Chi-Square)
model_null <- glm(data$CancerControlled ~ 1, family = poisson(), data = data)
anova(model_null, model, test = "Chisq")
## Warning in anova.glmlist(c(list(object), dotargs), dispersion = dispersion, :
## models with response '"CancerControlled"' removed because response differs from
## model 1
Evaluasi Model (AIC & BIC)
AIC(model)
## [1] 33.81041
BIC(model)
## [1] 37.23755
• Estimasi parameter pada regresi Poisson dilakukan dengan menggunakan metode MLE
• Pengujian hipotesis dilakukan menggunakan Uji Wald dan Likelihood Ratio
• AIC dan BIC digunakan sebagai alat untuk mengevaluasi dan memilih model yang paling optimal
… (Bab 1–9 tetap) …
Regresi logistik digunakan untuk memodelkan hubungan antara satu variabel kategorik biner (respon) dengan satu atau lebih prediktor. Dalam kasus ini, kita ingin memahami bagaimana bentuk dan pengaruh prediktor dengan skala berbeda — yaitu: - Nominal: Tanpa urutan, contoh: jenis kelamin - Ordinal: Ada urutan tetapi belum tentu punya jarak yang pasti, contoh: tingkat pendidikan - Rasio: Kuantitatif kontinu, contoh: usia
set.seed(123)
n <- 500
gender <- factor(sample(c("Male", "Female"), n, replace = TRUE))
edu_level <- factor(sample(c("Low", "Medium", "High"), n, replace = TRUE),
ordered = TRUE, levels = c("Low", "Medium", "High"))
age <- round(rnorm(n, mean = 35, sd = 10))
# Konversi edukasi ordinal ke skor numerik jika diperlukan
edu_num <- as.numeric(edu_level)
# Model logit true
logit <- -1 + 0.5 * (gender == "Male") + 0.4 * edu_num + 0.03 * age
prob <- 1 / (1 + exp(-logit))
response <- rbinom(n, 1, prob)
data <- data.frame(response, gender, edu_level, age)
head(data)
Interpretasi: Data simulasi menghasilkan variabel
biner response
berdasarkan logit yang bergantung pada jenis
kelamin, skor pendidikan, dan usia. Prediktor edu_level
dapat diuji perlakuannya.
library(dplyr)
data %>% group_by(response) %>% summarise(mean_age = mean(age),
prop_male = mean(gender == "Male"),
.groups = 'drop')
Interpretasi: Rata-rata usia dan proporsi jenis
kelamin pria dihitung per nilai response
. Perbedaan
mencolok bisa menandakan hubungan antara prediktor dan respon.
summary(data$gender)
## Female Male
## 239 261
summary(data$edu_level)
## Low Medium High
## 149 164 187
hist(data$age, breaks = 20, col = "lightblue", main = "Distribusi Usia")
Interpretasi: Distribusi variabel
gender
dan edu_level
menunjukkan penyebaran kategori yang
seimbang. Usia terdistribusi normal dengan rata-rata mendekati 35.
library(ggplot2)
ggplot(data, aes(x = edu_level, fill = factor(response))) +
geom_bar(position = "fill") +
labs(y = "Proportion", fill = "Response", title = "Proporsi Respon berdasarkan Pendidikan")
Interpretasi: Peningkatan proporsi respon positif pada
level pendidikan lebih tinggi menunjukkan potensi hubungan antara
edu_level
dan response
.
data$edu_nominal <- factor(data$edu_level, ordered = FALSE)
data$edu_nominal <- relevel(data$edu_nominal, ref = "Low")
model_dummy <- glm(response ~ gender + edu_nominal + age, data = data, family = binomial)
summary(model_dummy)
##
## Call:
## glm(formula = response ~ gender + edu_nominal + age, family = binomial,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.91951 0.40927 -2.247 0.024658 *
## genderMale 0.59848 0.21300 2.810 0.004958 **
## edu_nominalMedium 0.37457 0.25308 1.480 0.138862
## edu_nominalHigh 0.80864 0.26222 3.084 0.002043 **
## age 0.03823 0.01080 3.541 0.000399 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 570.95 on 499 degrees of freedom
## Residual deviance: 537.31 on 495 degrees of freedom
## AIC: 547.31
##
## Number of Fisher Scoring iterations: 4
Interpretasi: Koefisien
edu_nominalMedium
dan edu_nominalHigh
mengukur
perubahan log-odds dibanding level referensi “Low”. Misalnya, koefisien
positif berarti kemungkinan response = 1
lebih tinggi
daripada kategori referensi.
data$edu_score <- as.numeric(data$edu_level)
model_score <- glm(response ~ gender + edu_score + age, data = data, family = binomial)
summary(model_score)
##
## Call:
## glm(formula = response ~ gender + edu_score + age, family = binomial,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.33445 0.45787 -2.914 0.003563 **
## genderMale 0.59910 0.21296 2.813 0.004905 **
## edu_score 0.40344 0.13064 3.088 0.002014 **
## age 0.03829 0.01079 3.548 0.000388 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 570.95 on 499 degrees of freedom
## Residual deviance: 537.33 on 496 degrees of freedom
## AIC: 545.33
##
## Number of Fisher Scoring iterations: 4
Interpretasi: Satu peningkatan unit skor pendidikan meningkatkan log-odds secara linier. Pendekatan ini efisien tapi valid hanya jika jarak antar level ordinal memang proporsional.
data$pred_dummy <- predict(model_dummy, type = "response")
data$pred_score <- predict(model_score, type = "response")
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.4.3
plot_data <- melt(data[, c("edu_level", "pred_dummy", "pred_score")], id.vars = "edu_level")
ggplot(plot_data, aes(x = edu_level, y = value, fill = variable)) +
geom_boxplot(position = position_dodge()) +
labs(y = "Predicted Probability", fill = "Model", title = "Perbandingan Probabilitas Prediksi")
Interpretasi: Model dummy memberikan prediksi yang
berbeda untuk setiap level
edu_level
, sementara model skor
menghasilkan tren linier. Perbedaan ini menyoroti asumsi struktural yang
digunakan.
AIC(model_dummy, model_score)
Interpretasi: Nilai AIC yang lebih rendah menunjukkan model dengan fit yang lebih baik terhadap data. Jika perbedaan AIC > 2, model dengan AIC lebih rendah lebih disukai.
… (Bab 1–10 tetap) …
Pemodelan regresi logistik dapat dilakukan dengan dua pendekatan utama: - Pendekatan Confirmatory: membangun model berdasarkan teori atau hipotesis yang sudah ada sebelumnya. Peneliti sudah memiliki ide tentang variabel-variabel yang relevan dan hubungan yang ingin diuji. Cocok untuk riset deduktif. - Pendekatan Exploratory: digunakan ketika peneliti tidak memiliki dugaan awal tentang hubungan antar variabel. Tujuannya adalah menemukan pola atau model terbaik dari data secara empiris. Umum dipakai dalam data mining atau riset awal.
(a) Pendekatan Confirmatory) 1. Tinjau literatur atau teori yang relevan 2. Tentukan variabel utama dan kontrol 3. Bangun model sesuai struktur teoritis 4. Uji kesesuaian model terhadap data
(b) Pendekatan Exploratory: 1. Identifikasi sebanyak mungkin kandidat prediktor 2. Lakukan seleksi variabel berbasis statistik (misalnya stepwise atau penalized regression) 3. Evaluasi performa model dengan metrik prediktif seperti AIC, AUC 4. Lakukan validasi silang untuk memastikan generalisasi
# Model confirmatory (misalnya berdasarkan teori: gender dan age)
model_confirm <- glm(response ~ gender + age, data = data, family = binomial)
# Model exploratory (biarkan algoritma memilih)
model_explore <- step(glm(response ~ ., data = data, family = binomial), direction = "both")
## Start: AIC=550.39
## response ~ gender + edu_level + age + edu_nominal + edu_score +
## pred_dummy + pred_score
##
##
## Step: AIC=550.39
## response ~ gender + edu_level + age + edu_nominal + pred_dummy +
## pred_score
##
##
## Step: AIC=550.39
## response ~ gender + edu_level + age + pred_dummy + pred_score
##
## Df Deviance AIC
## - edu_level 2 538.72 548.72
## - pred_score 1 537.13 549.13
## - pred_dummy 1 537.16 549.16
## - gender 1 537.70 549.70
## - age 1 537.71 549.71
## <none> 536.39 550.39
##
## Step: AIC=548.72
## response ~ gender + age + pred_dummy + pred_score
##
## Df Deviance AIC
## - pred_dummy 1 538.72 546.72
## - pred_score 1 538.73 546.73
## - gender 1 538.79 546.79
## - age 1 538.80 546.80
## <none> 538.72 548.72
## + edu_score 1 537.15 549.15
## + edu_nominal 2 536.39 550.39
## + edu_level 2 536.39 550.39
##
## Step: AIC=546.72
## response ~ gender + age + pred_score
##
## Df Deviance AIC
## - gender 1 538.79 544.79
## - age 1 538.80 544.80
## <none> 538.72 546.72
## + edu_score 1 537.16 547.16
## + pred_dummy 1 538.72 548.72
## + edu_level 2 537.16 549.16
## + edu_nominal 2 537.16 549.16
## - pred_score 1 547.04 553.04
##
## Step: AIC=544.79
## response ~ age + pred_score
##
## Df Deviance AIC
## - age 1 538.82 542.82
## <none> 538.79 544.79
## + edu_score 1 538.71 546.71
## + gender 1 538.72 546.72
## + pred_dummy 1 538.79 546.79
## + edu_level 2 538.64 548.64
## + edu_nominal 2 538.64 548.64
## - pred_score 1 555.43 559.43
##
## Step: AIC=542.82
## response ~ pred_score
##
## Df Deviance AIC
## <none> 538.82 542.82
## + age 1 538.79 544.79
## + gender 1 538.80 544.80
## + edu_score 1 538.81 544.81
## + pred_dummy 1 538.82 544.82
## + edu_level 2 538.72 546.72
## + edu_nominal 2 538.72 546.72
## - pred_score 1 570.95 572.95
model_full <- glm(response ~ ., data = data, family = binomial)
model_stepwise <- step(model_full, direction = "both")
## Start: AIC=550.39
## response ~ gender + edu_level + age + edu_nominal + edu_score +
## pred_dummy + pred_score
##
##
## Step: AIC=550.39
## response ~ gender + edu_level + age + edu_nominal + pred_dummy +
## pred_score
##
##
## Step: AIC=550.39
## response ~ gender + edu_level + age + pred_dummy + pred_score
##
## Df Deviance AIC
## - edu_level 2 538.72 548.72
## - pred_score 1 537.13 549.13
## - pred_dummy 1 537.16 549.16
## - gender 1 537.70 549.70
## - age 1 537.71 549.71
## <none> 536.39 550.39
##
## Step: AIC=548.72
## response ~ gender + age + pred_dummy + pred_score
##
## Df Deviance AIC
## - pred_dummy 1 538.72 546.72
## - pred_score 1 538.73 546.73
## - gender 1 538.79 546.79
## - age 1 538.80 546.80
## <none> 538.72 548.72
## + edu_score 1 537.15 549.15
## + edu_nominal 2 536.39 550.39
## + edu_level 2 536.39 550.39
##
## Step: AIC=546.72
## response ~ gender + age + pred_score
##
## Df Deviance AIC
## - gender 1 538.79 544.79
## - age 1 538.80 544.80
## <none> 538.72 546.72
## + edu_score 1 537.16 547.16
## + pred_dummy 1 538.72 548.72
## + edu_level 2 537.16 549.16
## + edu_nominal 2 537.16 549.16
## - pred_score 1 547.04 553.04
##
## Step: AIC=544.79
## response ~ age + pred_score
##
## Df Deviance AIC
## - age 1 538.82 542.82
## <none> 538.79 544.79
## + edu_score 1 538.71 546.71
## + gender 1 538.72 546.72
## + pred_dummy 1 538.79 546.79
## + edu_level 2 538.64 548.64
## + edu_nominal 2 538.64 548.64
## - pred_score 1 555.43 559.43
##
## Step: AIC=542.82
## response ~ pred_score
##
## Df Deviance AIC
## <none> 538.82 542.82
## + age 1 538.79 544.79
## + gender 1 538.80 544.80
## + edu_score 1 538.81 544.81
## + pred_dummy 1 538.82 544.82
## + edu_level 2 538.72 546.72
## + edu_nominal 2 538.72 546.72
## - pred_score 1 570.95 572.95
summary(model_stepwise)
##
## Call:
## glm(formula = response ~ pred_score, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.6796 0.6758 -3.965 7.34e-05 ***
## pred_score 5.1353 0.9335 5.501 3.78e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 570.95 on 499 degrees of freedom
## Residual deviance: 538.82 on 498 degrees of freedom
## AIC: 542.82
##
## Number of Fisher Scoring iterations: 4
ROC (Receiver Operating Characteristic) dan AUC (Area Under the Curve) merupakan alat utama dalam mengevaluasi performa model klasifikasi biner, termasuk regresi logistik. Evaluasi ini dilakukan dengan cara memvisualisasikan hubungan antara dua metrik klasifikasi utama:
True Positive Rate (TPR) atau Sensitivitas: \[ TPR = \frac{TP}{TP + FN} \] Menunjukkan proporsi kasus positif yang berhasil dikenali dengan benar oleh model.
False Positive Rate (FPR): \[ FPR = \frac{FP}{FP + TN} \] Menunjukkan proporsi kasus negatif yang salah diklasifikasikan sebagai positif oleh model.
Kurva ROC dibentuk dengan menghitung TPR dan FPR untuk berbagai nilai ambang prediksi (threshold). AUC adalah luas area di bawah kurva tersebut, yang merepresentasikan probabilitas bahwa model dapat membedakan antara satu observasi positif dan satu observasi negatif secara acak.
Penggunaan ROC dan AUC memiliki sejumlah keunggulan penting, terutama dalam konteks model klasifikasi biner:
Sebelum membuat ROC, kita asumsikan bahwa data sudah berisi prediksi probabilitas dari model regresi logistik. Berikut adalah contoh sederhana:
library(pROC)
set.seed(123)
data <- data.frame(
response = factor(sample(c(0, 1), 200, replace = TRUE)),
age = rnorm(200, 35, 10),
gender = factor(sample(c("Male", "Female"), 200, replace = TRUE)),
edu_score = sample(1:3, 200, replace = TRUE)
)
model_logit <- glm(response ~ age + gender + edu_score, data = data, family = binomial)
data$predicted <- predict(model_logit, type = "response")
roc_obj <- roc(data$response, data$predicted)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj, col = "darkblue", main = "Kurva ROC")
auc_val <- auc(roc_obj)
auc_val
## Area under the curve: 0.5362
Contoh: Jika nilai AUC yang dihasilkan adalah \(0.83\), maka interpretasi sederhananya adalah: terdapat peluang 83% bahwa model akan memberikan skor probabilitas lebih tinggi untuk observasi positif daripada negatif yang dipilih secara acak.
Untuk membandingkan lebih dari satu model, ROC dapat ditumpuk pada plot yang sama:
model_1 <- glm(response ~ age, data = data, family = binomial)
model_2 <- glm(response ~ age + gender + edu_score, data = data, family = binomial)
roc_1 <- roc(data$response, predict(model_1, type = "response"))
## Setting levels: control = 0, case = 1
## Setting direction: controls > cases
roc_2 <- roc(data$response, predict(model_2, type = "response"))
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_1, col = "red", main = "Perbandingan ROC", lwd = 2)
plot(roc_2, col = "blue", add = TRUE, lwd = 2)
legend("bottomright", legend = c("Model 1", "Model 2"), col = c("red", "blue"), lwd = 2)
Interpretasi Tambahan: Jika ROC model ke-2 berada di atas model ke-1 sepanjang kurva, maka model ke-2 memiliki performa klasifikasi yang lebih baik pada semua threshold.
Selain membuat ROC secara otomatis, kita bisa membuat ROC secara eksplisit dengan mencoba berbagai threshold:
thresh_seq <- seq(0, 1, by = 0.05)
roc_table <- data.frame(threshold = thresh_seq, TPR = NA, FPR = NA)
for (i in seq_along(thresh_seq)) {
cut <- thresh_seq[i]
pred_class <- ifelse(data$predicted >= cut, 1, 0)
tab <- table(
Pred = factor(pred_class, levels = c(0, 1)),
Obs = factor(data$response, levels = c(0, 1))
)
TP <- tab["1", "1"]
FP <- tab["1", "0"]
FN <- tab["0", "1"]
TN <- tab["0", "0"]
roc_table$TPR[i] <- TP / (TP + FN)
roc_table$FPR[i] <- FP / (FP + TN)
}
plot(roc_table$FPR, roc_table$TPR, type = "l", col = "forestgreen", lwd = 2,
main = "ROC dari Threshold Manual",
xlab = "False Positive Rate", ylab = "True Positive Rate")
Penjelasan: ROC ini dibentuk dari pengujian sensitivitas dan spesifisitas model terhadap berbagai cutoff nilai prediksi.
Dalam regresi linear, goodness-of-fit suatu model sering diukur menggunakan koefisien determinasi \(R^2\). Namun, dalam regresi logistik yang bersifat non-linear dan berbasis probabilitas, ukuran ini tidak dapat diterapkan secara langsung. Oleh karena itu, dikembangkanlah pseudo \(R^2\), yaitu metrik alternatif yang memiliki interpretasi serupa namun dikhususkan untuk model-model berbasis likelihood.
Beberapa varian yang umum digunakan:
Nilai pseudo \(R^2\) yang lebih tinggi menunjukkan model memiliki fit yang lebih baik terhadap data.
Dengan paket pscl
untuk McFadden:
library(pscl)
model <- glm(response ~ age + gender + edu_score, data = data, family = binomial)
pR2(model)
Dengan paket rcompanion
untuk Nagelkerke:
library(rcompanion)
nagelkerke(model)
Nilai McFadden \(R^2\): - \(> 0.2\): sangat baik dalam konteks ilmu sosial - \(0.1 - 0.2\): moderat - \(< 0.1\): kurang baik, tetapi bisa diterima tergantung konteks
Contoh output:
> pR2(model)
llh llhNull G2 McFadden r2ML r2CU
-100.15363 -140.17823 80.04920 0.2854 0.3059 0.4132
Interpretasi: - McFadden R² = 0.285 artinya model menjelaskan sekitar 28.5% variasi dibandingkan model null. - Nilai ini cukup tinggi untuk regresi logistik dan menunjukkan model memiliki kemampuan prediksi yang kuat.
Setelah kita memiliki model prediktif, penting untuk mengevaluasi bagaimana performa klasifikasinya. Salah satu alat utama dalam regresi logistik adalah tabel klasifikasi (confusion matrix), yang membandingkan hasil prediksi model terhadap nilai aktual.
Aktual = 1 | Aktual = 0 | |
---|---|---|
Prediksi = 1 | TP | FP |
Prediksi = 0 | FN | TN |
library(caret)
pred_class <- ifelse(predict(model, type = "response") > 0.5, 1, 0)
confusionMatrix(factor(pred_class), factor(data$response))
Hasil confusion matrix akan mencakup seluruh metrik evaluasi: - Accuracy menunjukkan proporsi prediksi yang benar - Sensitivity tinggi berarti model sensitif terhadap mendeteksi kelas positif - Specificity tinggi berarti model akurat menghindari false positive - F1 Score baik untuk data imbalance karena menggabungkan precision dan recall
Dengan demikian, tabel klasifikasi bukan hanya alat dasar evaluasi, tapi juga dasar untuk pengambilan keputusan threshold dan seleksi model.
Dalam regresi logistik, kita seringkali perlu membandingkan beberapa model alternatif untuk menentukan model mana yang paling tepat digunakan. Tujuan dari metode perbandingan model adalah:
Akaike Information Criterion (AIC) \[ AIC = -2 \log(L) + 2k \] Semakin kecil nilai AIC, semakin baik model tersebut dari sisi kompromi antara fit dan kompleksitas.
Bayesian Information Criterion (BIC) \[ BIC = -2 \log(L) + k \log(n) \] BIC menghukum model kompleks lebih keras dibanding AIC, cocok digunakan bila ukuran sampel besar.
Log-Likelihood (LL) \[ LL = \log(Likelihood\ Function) \] Model dengan LL lebih tinggi memberikan penjelasan data yang lebih baik.
Pseudo \(R^2\) Dapat digunakan sebagai pelengkap AIC dan BIC untuk menilai kekuatan model secara statistik.
model1 <- glm(response ~ age, data = data, family = binomial)
model2 <- glm(response ~ age + gender + edu_score, data = data, family = binomial)
AIC(model1, model2)
BIC(model1, model2)
logLik(model1)
logLik(model2)
Uji Likelihood Ratio digunakan untuk membandingkan dua model logistik yang nested, artinya satu model merupakan versi sederhana dari model yang lain.
Misalnya: - Model0 (sederhana): \(Y \sim X_1\) - Model1 (lengkap): \(Y \sim X_1 + X_2\)
Tujuannya adalah menguji apakah penambahan variabel (X₂) memberikan peningkatan signifikan terhadap fit model.
\[ G^2 = -2 (\log L_{0} - \log L_{1}) \] Dimana: - \(\log L_0\) = log-likelihood dari model sederhana - \(\log L_1\) = log-likelihood dari model penuh
Statistik \(G^2\) mengikuti distribusi \(\chi^2\) dengan derajat kebebasan sebesar selisih jumlah parameter antara dua model.
library(lmtest)
lrtest(model1, model2)
Jika p-value < 0.05, maka terdapat bukti yang cukup bahwa model penuh lebih baik dibandingkan model sederhana secara statistik. Artinya, penambahan prediktor memberikan kontribusi signifikan terhadap model.
Contoh output:
Likelihood ratio test
Model 1: response ~ age
Model 2: response ~ age + gender + edu_score
LRT = 18.22, df = 2, p-value = 0.00011
Interpretasi: Model 2 secara signifikan lebih baik dari Model 1 karena p < 0.05 dan deviance turun drastis.
Parsimony dalam pemodelan statistik mengacu pada prinsip memilih model yang paling sederhana yang tetap dapat menjelaskan data dengan baik. Dalam regresi logistik, prinsip ini membantu menghindari overfitting dan menjaga interpretabilitas model.
“Entia non sunt multiplicanda praeter necessitatem” — Prinsip Occam’s Razor
Model dengan banyak variabel prediktor bisa terlihat menjanjikan secara statistik, tetapi jika terlalu kompleks, model tersebut: - Sulit diinterpretasi - Cenderung menyesuaikan noise - Kurang generalisasi untuk data baru
library(glmnet)
x <- model.matrix(response ~ ., data)[,-1]
y <- data$response
cvfit <- cv.glmnet(x, y, family = "binomial", alpha = 1)
plot(cvfit)
Setelah klasifikasi dilakukan (misal: prediksi probabilitas > 0.5 dianggap 1), performa model dievaluasi lewat tabel klasifikasi (confusion matrix).
Aktual = 1 | Aktual = 0 | |
---|---|---|
Prediksi = 1 | TP | FP |
Prediksi = 0 | FN | TN |
library(caret)
model <- glm(response ~ age + gender + edu_score, data = data, family = binomial)
probs <- predict(model, type = "response")
class <- ifelse(probs > 0.5, 1, 0)
confusionMatrix(factor(class), factor(data$response))
Sensitivitas \[ \text{Sensitivity} = \frac{TP}{TP + FN} \] Menunjukkan kemampuan model mengenali kelas positif secara benar.
Spesifisitas \[ \text{Specificity} = \frac{TN}{TN + FP} \] Mengukur kemampuan model menghindari false positive.
Simulasi Visual
thresholds <- seq(0.01, 0.99, by = 0.01)
sens <- spec <- numeric(length(thresholds))
for (i in seq_along(thresholds)) {
class_pred <- ifelse(probs >= thresholds[i], 1, 0)
cm <- table(factor(class_pred), factor(data$response))
TP <- cm["1","1"]; TN <- cm["0","0"]
FP <- cm["1","0"]; FN <- cm["0","1"]
sens[i] <- TP / (TP + FN)
spec[i] <- TN / (TN + FP)
}
plot(thresholds, sens, type = "l", col = "blue", ylim = c(0,1), ylab = "Rate",
xlab = "Threshold", main = "Sensitivitas vs Spesifisitas")
lines(thresholds, spec, col = "red")
legend("bottomleft", legend = c("Sensitivity", "Specificity"),
col = c("blue", "red"), lty = 1)
Interpretasi Kurva - Perpotongan antara sensitivitas dan spesifisitas sering menjadi threshold terbaik. - Threshold ekstrem (mendekati 0 atau 1) menyebabkan salah satu metrik anjlok drastis.
Kurva ROC (Receiver Operating Characteristic) adalah alat visual dan kuantitatif untuk mengevaluasi kemampuan model klasifikasi biner dalam membedakan antara dua kelas. ROC digunakan dengan sangat luas, termasuk pada regresi logistik, untuk menggambarkan trade-off antara sensitivitas dan spesifisitas.
Definisi: - True Positive Rate (TPR) / Sensitivitas: \[ TPR = \frac{TP}{TP + FN} \] - False Positive Rate (FPR): \[ FPR = \frac{FP}{FP + TN} \]
ROC adalah grafik antara TPR di sumbu y dan FPR di sumbu x, dihitung untuk berbagai nilai ambang (threshold) antara 0 dan 1.
library(pROC)
model <- glm(response ~ age + gender + edu_score, data = data, family = binomial)
preds <- predict(model, type = "response")
roc_curve <- roc(data$response, preds)
plot(roc_curve, col = "darkgreen", lwd = 2, main = "Kurva ROC")
auc(roc_curve)
AUC (Area Under the Curve) merepresentasikan probabilitas bahwa model akan memberikan skor yang lebih tinggi untuk observasi positif dibandingkan negatif secara acak.
Skala interpretasi AUC: - AUC = 0.5 → tidak lebih baik dari tebak acak - 0.6–0.7 → lemah - 0.7–0.8 → cukup - 0.8–0.9 → baik - >0.9 → sangat baik hingga overfitting
Jika AUC = 0.82, maka terdapat peluang 82% bahwa model akan memberi skor probabilitas yang lebih tinggi untuk sampel positif dibanding negatif.
coords(roc_curve, "best", ret = c("threshold", "sensitivity", "specificity"))
Fungsi ini akan memberikan threshold optimal berdasarkan kriteria seperti Youden’s Index (sensitivitas + spesifisitas - 1).
Precision-Recall (PR) Curve adalah metode evaluasi performa model klasifikasi biner yang lebih tepat digunakan pada dataset tidak seimbang. PR Curve mengatasi kekurangan ROC saat jumlah kelas positif jauh lebih kecil dari kelas negatif.
Kurva PR menggambarkan precision (sumbu y) terhadap recall (sumbu x) pada berbagai nilai threshold.
library(PRROC)
fg <- preds[data$response == 1]
bg <- preds[data$response == 0]
pr <- pr.curve(scores.class0 = fg, scores.class1 = bg, curve = TRUE)
plot(pr, main = "Precision-Recall Curve")
PR Curve yang lebih tinggi dan lebih ke kanan menunjukkan model yang lebih baik. Area Under PR Curve (PR-AUC) digunakan sebagai ringkasan performa.
Model dengan PR-AUC = 0.78 menunjukkan keseimbangan yang baik antara kemampuan mengidentifikasi positif dan menghindari false positive.
Aspek | ROC Curve | PR Curve |
---|---|---|
Fokus | Seluruh populasi | Kelas positif |
Cocok untuk | Kelas seimbang | Kelas tidak seimbang |
Nilai rendah | TPR dan FPR rendah | Precision bisa anjlok |
Dalam regresi logistik, karena output adalah probabilitas bukan nilai numerik kontinu, maka tidak dapat digunakan \(R^2\) klasik. Sebagai gantinya, digunakan metrik alternatif bernama pseudo \(R^2\).
Beberapa Versi Pseudo \(R^2\): - McFadden \(R^2\): \[ R^2_{McF} = 1 - \frac{\log L_{full}}{\log L_{null}} \] - Cox & Snell dan Nagelkerke \(R^2\) juga tersedia.
library(pscl)
pR2(model)
library(rcompanion)
nagelkerke(model)
Jika:
McFadden = 0.27
Nagelkerke = 0.36
Maka model menjelaskan sekitar 27% hingga 36% variabilitas log-likelihood dibanding model null. Ini sudah tergolong baik untuk model klasifikasi sosial-ekonomi.
Distribusi multinomial adalah generalisasi dari distribusi binomial ketika hasil percobaan memiliki lebih dari dua kemungkinan kategori yang saling eksklusif. Distribusi ini sangat umum digunakan untuk data kategorik, di mana setiap percobaan menghasilkan satu dari \(k\) kemungkinan hasil.
Distribusi multinomial menggambarkan probabilitas mendapatkan kombinasi tertentu dari frekuensi kategori ketika dilakukan \(n\) percobaan independen, dengan peluang tetap untuk setiap kategori.
Rumus Distribusi Multinomial \[ P(X_1 = x_1, \dots, X_k = x_k) = \frac{n!}{x_1! \cdots x_k!} p_1^{x_1} \cdots p_k^{x_k} \] Dengan: - \(n\) = jumlah total percobaan - \(k\) = jumlah kategori - \(x_j\) = jumlah kemunculan kategori ke-\(j\) - \(p_j\) = probabilitas munculnya kategori ke-\(j\), dengan \(\sum_{j=1}^{k} p_j = 1\)
Syarat: 1. Setiap percobaan independen 2. Hasil percobaan berupa salah satu dari \(k\) kategori 3. Probabilitas kategori tetap konstan 4. Jumlah seluruh percobaan adalah tetap, \(n\)
Contoh Situasi: - Melempar dadu 100 kali dan menghitung jumlah masing-masing sisi - Survei pilihan makanan: nasi, mie, roti, pasta - Pemungutan suara dalam pemilu dengan lebih dari dua kandidat
Distribusi multinomial sering digunakan dalam pengamatan eksperimen sosial atau survei. Berikut studi kasus pengantar. Studi Kasus: Sebuah lembaga riset melakukan survei terhadap 300 orang mengenai moda transportasi utama yang mereka gunakan:
Moda Transportasi | Jumlah |
---|---|
Mobil | 120 |
Motor | 90 |
Sepeda | 60 |
Jalan Kaki | 30 |
Distribusi jumlah pengamatan di atas mengikuti distribusi multinomial dengan: - \(n = 300\) - \(k = 4\) kategori - Probabilitas yang diperkirakan: \(\hat{p}_j = \frac{x_j}{n}\)
Distribusi ini membentuk dasar untuk analisis yang lebih kompleks seperti multinomial logistic regression.
Multinomial Logistic Regression adalah teknik yang digunakan ketika variabel respon bersifat kategorik dengan lebih dari dua kategori yang tidak berurutan (tidak ordinal). Ini merupakan perluasan dari regresi logistik biner.
Tujuan: - Menjelaskan hubungan antara satu variabel kategorik (dengan \(J\) kategori) terhadap satu atau lebih variabel prediktor (numerik atau kategorik). - Mengestimasi probabilitas pemilihan setiap kategori sebagai fungsi dari prediktor.
Dalam model logit kategori-baseline, kita memilih satu kategori sebagai referensi atau baseline, lalu memodelkan log odds dari kategori lainnya terhadap baseline tersebut.
Misal: \[ P(Y = j \mid \mathbf{x}) = \frac{\exp(\mathbf{x}'\beta_j)}{1 + \sum_{l=1}^{J-1} \exp(\mathbf{x}'\beta_l)} \] Untuk \(j = 1, ..., J-1\) (kategori ke-\(J\) dijadikan baseline)
Dengan: - \(\mathbf{x}\) = vektor prediktor - \(\beta_j\) = koefisien regresi untuk kategori ke-\(j\) - \(J\) = jumlah total kategori
Kategori baseline memiliki koefisien 0 secara default.
Estimasi parameter dalam model logit kategori-baseline dilakukan dengan maximum likelihood estimation (MLE).
Log Likelihood: \[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^{n} \sum_{j=1}^{J} y_{ij} \log(p_{ij}) \] Di mana: - \(y_{ij} = 1\) jika observasi ke-\(i\) memilih kategori \(j\), 0 jika tidak - \(p_{ij}\) = probabilitas observasi ke-\(i\) pada kategori \(j\)
Estimasi di R:
library(nnet)
# Anggap data$mode adalah variabel respon kategori (mobil, motor, sepeda, jalan kaki)
# dan prediktor adalah gender, income
model_multi <- multinom(mode ~ gender + income, data = data)
summary(model_multi)
Interpretasi Output: Output akan memberikan koefisien untuk setiap kategori dibandingkan dengan kategori baseline. Misalnya: - Jika baseline = “Jalan Kaki”, maka koefisien pada kategori “Mobil” menunjukkan log odds beralih dari “Jalan Kaki” ke “Mobil” saat prediktor meningkat.
Koefisien dapat dieksponensialkan untuk mendapatkan odds ratio:
exp(coef(model_multi))
Sebagai kelanjutan dari teori distribusi multinomial, kita akan mengkaji satu studi kasus mengenai preferensi pelanggan terhadap 3 jenis produk minuman: Teh, Kopi, dan Susu. Variabel prediktor yang digunakan adalah:
Tujuannya adalah untuk memprediksi preferensi minuman berdasarkan karakteristik demografis responden.
Berikut ini adalah kode untuk melakukan simulasi data kategori dan prediktor:
set.seed(123)
n <- 300
age <- round(rnorm(n, mean = 35, sd = 10))
gender <- sample(c("male", "female"), n, replace = TRUE)
income <- sample(c("low", "medium", "high"), n, replace = TRUE)
# Probabilitas preferensi berdasarkan logika demografis (simulasi)
prob_tea <- plogis(0.5 - 0.01 * age + ifelse(gender == "female", 0.2, -0.1))
prob_coffee <- plogis(0.7 + 0.02 * age + ifelse(income == "high", 0.4, -0.2))
prob_sisa <- 1 - prob_tea - prob_coffee
prob_susu <- ifelse(prob_sisa > 0, prob_sisa, 0.01)
prob_mat <- cbind(prob_tea, prob_coffee, prob_susu)
choice <- apply(prob_mat, 1, function(p) sample(c("tea", "coffee", "milk"), 1, prob = p))
sim_data <- data.frame(choice = factor(choice), age, gender = factor(gender), income = factor(income))
Estimasi dilakukan dengan multinomial logistic
regression menggunakan nnet::multinom()
.
library(nnet)
model_mn <- multinom(choice ~ age + gender + income, data = sim_data)
summary(model_mn)
Model di atas akan mengestimasi dua set koefisien logit karena satu kategori akan dijadikan baseline (misalnya “milk”).
Koefisien logit mengindikasikan log odds terhadap baseline: - Positif → peluang kategori tersebut meningkat relatif terhadap baseline - Negatif → peluang kategori tersebut menurun relatif terhadap baseline
Nilai p-value digunakan untuk menguji signifikansi dari setiap koefisien prediktor. Langkah perhitungan:
z_values <- summary(model_mn)$coefficients / summary(model_mn)$standard.errors
p_values <- 2 * (1 - pnorm(abs(z_values)))
p_values
Misal: - Jika age
signifikan untuk kategori “coffee”,
artinya usia mempengaruhi kecenderungan memilih kopi terhadap susu.
predicted_probs <- predict(model_mn, type = "probs")
predicted_class <- predict(model_mn)
table(Predicted = predicted_class, Actual = sim_data$choice)
mean(predicted_class == sim_data$choice) # akurasi
Untuk validasi lebih lanjut, bisa menggunakan cross-validation atau membagi data training-test.
Distribusi multinomial dan regresi logistik multinomial menyediakan kerangka kuat untuk menganalisis dan memprediksi variabel respon kategorik dengan lebih dari dua kelas.
Dalam bab ini: - Kita mempelajari bagaimana melakukan simulasi data kategori - Menyusun dan mengestimasi model logit multinomial - Menginterpretasikan koefisien serta p-value - Mengevaluasi performa klasifikasi model
Model ini sangat berguna dalam konteks pemilihan, preferensi, klasifikasi pasien, konsumen, maupun prediksi perilaku sosial.
Regresi logistik ordinal digunakan ketika variabel respon bersifat kategorik berurutan (ordinal), contohnya: - Tingkat kepuasan: rendah, sedang, tinggi - Skor opini: sangat tidak setuju, tidak setuju, netral, setuju, sangat setuju
Tidak seperti regresi logistik multinomial yang memperlakukan setiap kategori secara independen, regresi ordinal memanfaatkan struktur urutan kategori untuk estimasi model yang lebih efisien.
Model paling umum adalah Cumulative Logit Model atau Proportional Odds Model (POM).
Model ini mengestimasi log odds kumulatif hingga kategori \(j\) sebagai: \[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \theta_j - \mathbf{x}'\beta \]
Dengan: - \(P(Y \leq j)\): probabilitas bahwa \(Y\) termasuk kategori ke-\(j\) atau lebih rendah - \(\theta_j\): threshold (intersep khusus kategori) - \(\mathbf{x}\): vektor prediktor - \(\beta\): koefisien regresi (tetap untuk semua kategori)
Model ini mengasumsikan bahwa efek dari setiap prediktor \(\mathbf{x}\) sama untuk setiap cutpoint kategori. Artinya: \[ \beta_1 = \beta_2 = \cdots = \beta_{J-1} \]
Jika asumsi ini tidak terpenuhi, maka bisa dipertimbangkan model alternatif seperti partial proportional odds model atau non-proportional models.
Koefisien \(\beta_k\) dalam cumulative logit model merepresentasikan perubahan log odds kumulatif akibat perubahan unit dari prediktor \(x_k\), dengan asumsi kategori respon berada di bawah atau sama dengan suatu tingkat \(j\).
Koefisien dapat ditransformasikan menjadi odds ratio sebagai: \[ OR = e^{\beta_k} \]
Jika \(\beta_k > 0\), maka prediktor meningkatkan kemungkinan respon berada di kategori lebih tinggi (lebih baik jika skala naik).
Jika \(\beta_k < 0\), maka prediktor meningkatkan kemungkinan respon berada di kategori lebih rendah.
library(MASS)
# Simulasi data ordinal
set.seed(123)
Y <- cut(rnorm(300), breaks = quantile(rnorm(300), probs = c(0, .3, .6, 1)),
labels = c("low", "medium", "high"), include.lowest = TRUE)
X1 <- rnorm(300, mean = 50, sd = 10)
X2 <- factor(sample(c("A", "B"), 300, replace = TRUE))
data <- data.frame(Y = ordered(Y), X1, X2)
# Estimasi model cumulative logit
model_ord <- polr(Y ~ X1 + X2, data = data, method = "logistic")
summary(model_ord)
ctable <- coef(summary(model_ord))
p_values <- 2 * (1 - pnorm(abs(ctable[, "t value"])))
cbind(ctable, "p value" = round(p_values, 4))
library(effects)
plot(allEffects(model_ord))
Visualisasi ini memperlihatkan bagaimana probabilitas berada di masing-masing kategori berubah seiring nilai prediktor.
Data kepuasan pelanggan sering dikumpulkan dalam survei menggunakan skala Likert, misalnya: - Sangat Tidak Puas - Tidak Puas - Netral - Puas - Sangat Puas
Skala tersebut bersifat ordinal, sehingga model regresi logistik ordinal sangat sesuai digunakan.
Simulasi dilakukan dengan mempertimbangkan faktor: - Lama penggunaan layanan (bulan): prediktor numerik - Jenis kelamin pelanggan - Segmentasi pelanggan (reguler, premium)
set.seed(123)
n <- 300
lama <- round(runif(n, 1, 36))
sex <- factor(sample(c("Pria", "Wanita"), n, replace = TRUE))
segment <- factor(sample(c("Reguler", "Premium"), n, replace = TRUE))
# Simulasi probabilitas ordinal berdasarkan prediktor
logit_scores <- 0.05 * lama + ifelse(sex == "Wanita", 0.3, -0.2) + ifelse(segment == "Premium", 0.5, -0.3)
cutpoints <- c(-Inf, -0.5, 0.3, 1, 1.8, Inf)
kepuasan <- cut(logit_scores + rnorm(n), breaks = cutpoints,
labels = c("Sangat Tidak Puas", "Tidak Puas", "Netral", "Puas", "Sangat Puas"),
ordered_result = TRUE)
data_kepuasan <- data.frame(kepuasan, lama, sex, segment)
library(MASS)
model_ord <- polr(kepuasan ~ lama + sex + segment, data = data_kepuasan, method = "logistic")
summary(model_ord)
ctable <- coef(summary(model_ord))
p_vals <- 2 * (1 - pnorm(abs(ctable[, "t value"])))
cbind(ctable, "p value" = round(p_vals, 4))
Misalnya: - Koefisien lama = 0.05 berarti tiap 1 bulan tambahan penggunaan layanan meningkatkan odds kepuasan tinggi - Jika koefisien segmentPremium = 0.6, maka pelanggan premium lebih cenderung puas
exp(coef(model_ord))
library(effects)
plot(allEffects(model_ord))
Dengan data dan estimasi ini, model regresi ordinal dapat mengungkap pengaruh demografis terhadap tingkat kepuasan dengan cara yang mempertahankan struktur ordinal data secara eksplisit.
Nilai p-value digunakan dalam regresi logistik ordinal untuk menguji signifikansi statistik dari koefisien model. P-value memberi kita informasi tentang apakah suatu prediktor secara signifikan berkontribusi dalam mempengaruhi posisi individu dalam skala ordinal.
Dengan kata lain, p-value membantu menjawab pertanyaan: “Apakah variabel ini benar-benar relevan dalam memengaruhi outcome, atau hanya kebetulan dari sampel yang diperoleh?”
Dalam polr()
, nilai p tidak langsung disediakan. Maka
perlu dihitung dari z-value:
ctable <- coef(summary(model_ord))
p_vals <- 2 * (1 - pnorm(abs(ctable[, "t value"])))
cbind(ctable, "p value" = round(p_vals, 4))
Interpretasi: - \(p < 0.05\): terdapat cukup bukti bahwa prediktor signifikan - \(p \geq 0.05\): tidak cukup bukti bahwa prediktor signifikan
Penting dicatat bahwa karena model logit ordinal mengasumsikan proportional odds, signifikansi ini berlaku menyeluruh terhadap seluruh cutpoint kategori.
Setelah model dilatih, kita bisa menghitung probabilitas seseorang berada dalam setiap kategori respon. Ini penting untuk: - Memberi prediksi yang lebih informatif - Visualisasi dan pengambilan keputusan berbasis risiko
probs <- predict(model_ord, type = "probs")
head(probs)
Setiap baris berisi probabilitas suatu observasi masuk ke masing-masing kategori ordinal.
Gunakan effects::allEffects()
untuk menampilkan pengaruh
tiap prediktor terhadap probabilitas setiap level respon:
library(effects)
plot(allEffects(model_ord))
Visualisasi ini sangat berguna untuk mendemonstrasikan bagaimana probabilitas berubah seiring perubahan nilai prediktor.
Beberapa metrik umum: - Log-likelihood: semakin tinggi, semakin baik - AIC (Akaike Information Criterion): semakin rendah, semakin baik
logLik(model_ord)
AIC(model_ord)
Namun, tidak tersedia nilai \(R^2\) konvensional seperti dalam regresi linear. Alternatifnya, kita bisa menggunakan pseudo-\(R^2\) seperti McFadden.
Regresi ordinal model cumulative logit mengasumsikan bahwa efek
prediktor konsisten di seluruh kategori (proportional odds). Uji
brant()
digunakan untuk memverifikasi:
library(brant)
brant(model_ord)
Jika uji Brant menunjukkan signifikansi, maka asumsi tidak terpenuhi, dan kita perlu mempertimbangkan model alternatif.
Jika asumsi proportional odds tidak terpenuhi, kita dapat mengizinkan sebagian koefisien berbeda di tiap kategori menggunakan:
library(VGAM)
model_ppom <- vglm(kepuasan ~ lama + sex + segment,
family = cumulative(parallel = FALSE),
data = data_kepuasan)
summary(model_ppom)
Model ini memungkinkan setiap prediktor memiliki efek berbeda pada setiap cutpoint:
model_gologit <- vglm(kepuasan ~ lama + sex + segment,
family = cumulative(parallel = FALSE),
data = data_kepuasan)
Model ini lebih fleksibel tapi juga lebih kompleks secara interpretasi.
Model log-linear digunakan untuk menganalisis tabel kontingensi yang berisi hitungan (frekuensi) dari kombinasi kategori beberapa variabel kategorik. Tidak seperti model regresi, di mana ada satu variabel respons, model log-linear memodelkan interaksi antar semua variabel secara simetris.
Model ini digunakan untuk: - Mengetahui hubungan antar variabel kategorik - Menjelaskan struktur dependensi antar dimensi dalam tabel - Menguji kependekan model (model simplifikasi tanpa kehilangan akurasi signifikan) - Mengevaluasi interaksi tinggi dalam hubungan multidimensi
Jika kita memiliki tabel kontingensi 3-dimensi untuk variabel A, B, dan C, maka model log-linear secara umum: \[ \log(\mu_{ijk}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_k^C + \lambda_{ij}^{AB} + \lambda_{ik}^{AC} + \lambda_{jk}^{BC} + \lambda_{ijk}^{ABC} \]
Dimana: - \(\mu_{ijk}\) = nilai ekspektasi dari cell \(i,j,k\) - \(\lambda\) = intercept - \(\lambda_i^A\) = efek utama dari variabel A - \(\lambda_{ij}^{AB}\) = efek interaksi antara A dan B - \(\lambda_{ijk}^{ABC}\) = interaksi tiga arah
Semakin kompleks interaksi yang disertakan, semakin “fit” model terhadap data, tetapi juga semakin tinggi risiko overfitting.
Model log-linear memiliki struktur hierarkis: - Model independen penuh: hanya efek utama. Misalnya, \(\log(\mu_{ijk}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_k^C\) - Model interaksi dua arah: menambahkan interaksi pasangan seperti \(AB\), \(AC\), \(BC\) - Model saturated: menyertakan semua interaksi hingga tingkat tertinggi (AB, AC, BC, dan ABC)
Setiap model nested dalam model yang lebih kompleks. Kita bisa membandingkan model-model ini menggunakan likelihood ratio test untuk melihat apakah tambahan kompleksitas memang meningkatkan performa model.
Model saturated adalah model log-linear paling kompleks, di mana semua efek dan interaksi (utama, dua arah, tiga arah, dst.) disertakan. Model ini akan: - Selalu cocok sempurna dengan data (zero deviance) - Tidak menyisakan residual error - Tidak dapat digunakan untuk generalisasi, karena menyesuaikan sepenuhnya pada data
Biasanya digunakan sebagai acuan pembanding untuk menilai model yang lebih sederhana.
Misal kita menganalisis tabel kontingensi 3 variabel: A, B, dan C.
# Simulasi data kontingensi
set.seed(123)
tab <- as.table(array(sample(1:20, 2*3*2, replace=TRUE), dim = c(2,3,2),
dimnames = list(A = c("A1", "A2"),
B = c("B1", "B2", "B3"),
C = c("C1", "C2"))))
# Fit model saturated
library(MASS)
model_sat <- loglm(~ A*B*C, data = tab)
summary(model_sat)
Model ini menyertakan semua kemungkinan efek interaksi: - Efek utama: A, B, C - Interaksi dua arah: AB, AC, BC - Interaksi tiga arah: ABC
Model saturated memiliki nilai deviance = 0 dan df = 0. Maka: - Cocok 100% dengan data - Tidak bisa diuji goodness-of-fit karena tidak menyisakan kesalahan
Gunakan saturated model untuk: - Basis perbandingan model yang disederhanakan - Menghitung nilai p dari uji deviance:
\[ G^2 = 2(\log L_{saturated} - \log L_{model}) \]
Jika perbedaan deviance antara model sederhana dan saturated tidak signifikan (p-value tinggi), maka model sederhana cukup mewakili data.
Model log-linear melihat interaksi sebagai deviasi dari independensi. Contoh: - Jika ABC tidak signifikan → berarti interaksi tiga arah tidak diperlukan - Jika AB signifikan → berarti ada asosiasi antara A dan B meskipun dikontrol oleh C
Bab ini mengawali pembahasan tentang model log-linear, yang memungkinkan kita: - Menguji hubungan independensi dan interaksi antar banyak variabel kategorik - Melakukan pemodelan simetris antar variabel tanpa harus menentukan variabel respon - Mengembangkan model bertingkat (nested) dan membandingkannya secara sistematis
Model log-linear sangat kuat untuk analisis kontingensi multivariat, terutama dalam ilmu sosial, epidemiologi, dan ilmu perilaku di mana banyak variabel kategorik terlibat secara simultan.
Model independen log-linear mengasumsikan bahwa semua variabel dalam tabel kontingensi tidak saling bergantung. Model ini hanya mencakup efek utama, tanpa interaksi dua arah maupun lebih tinggi.
Untuk tiga variabel A, B, dan C: \[ \log(\mu_{ijk}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_k^C \]
Artinya: \[ P(A,B,C) = P(A) \cdot P(B) \cdot P(C) \]
Model ini dapat digunakan sebagai baseline untuk dibandingkan dengan model yang lebih kompleks.
model_indep <- loglm(~ A + B + C, data = tab)
summary(model_indep)
Odds Ratio (OR) dalam konteks log-linear menunjukkan kuat tidaknya asosiasi antar dua variabel. Jika OR = 1 → tidak ada asosiasi. Jika OR ≠ 1 → ada ketergantungan.
Dalam tabel 2x2: \[ \text{OR} = \frac{n_{11} n_{22}}{n_{12} n_{21}} \]
Jika OR > 1 → kecenderungan asosiasi positif.
Dalam model log-linear: - Koefisien interaksi (\(\lambda_{ij}^{AB}\)) berhubungan langsung dengan log(OR) - Maka: \(\exp(\lambda_{ij}^{AB}) = \text{OR}\)
Contoh interpretasi: > Jika \(\lambda_{AB} = 0.5\), maka \(\exp(0.5) \approx 1.65\) → peluang terjadinya kombinasi AB adalah 1.65 kali dibandingkan bila A dan B independen.
Estimasi parameter log-linear dilakukan melalui maximum likelihood estimation (MLE) dengan menggunakan deviance: \[ G^2 = 2 \sum_{ijk} n_{ijk} \log\left(\frac{n_{ijk}}{\hat{\mu}_{ijk}}\right) \]
coef(model_indep) # parameter model
fitted(model_indep) # nilai ekspektasi per sel
residuals(model_indep) # residual
Hasil koefisien dapat digunakan untuk menghitung estimasi log-mu dan probabilitas relatif antar sel.
Tujuan reduksi model: - Menyederhanakan interpretasi - Menghindari overfitting - Tetap mempertahankan kecocokan model
Langkah-langkah: 1. Mulai dari model saturated 2. Buang satu per satu interaksi 3. Lakukan uji deviance (likelihood ratio test)
Digunakan untuk membandingkan dua model nested: \[ G^2 = 2 (\log L_{saturated} - \log L_{reduced}) \] Uji \(\chi^2\) dengan derajat bebas = perbedaan parameter model.
anova(model_reduced, model_sat)
Jika nilai p tinggi → model yang lebih sederhana cukup baik.
Kepercayaan terhadap Surga
Misal terdapat data tiga variabel: - Gender: Male / Female - Kepercayaan Tuhan: Yes / No - Kepercayaan Surga: Yes / No
Data berbentuk tabel kontingensi 2x2x2:
tab_kasus <- array(c(50, 20, 30, 25, 40, 35, 10, 5),
dim = c(2,2,2),
dimnames = list(
Gender = c("Male", "Female"),
Tuhan = c("Yes", "No"),
Surga = c("Yes", "No")))
Fit model interaksi dua arah:
loglm(~ Gender + Tuhan + Surga + Gender:Tuhan + Tuhan:Surga + Gender:Surga, data = tab_kasus)
Evaluasi: - Cek deviance - Bandingkan model independen dan model penuh - Interpretasi interaksi antar variabel
Jika interaksi “Tuhan:Surga” signifikan → memperkuat dugaan bahwa keyakinan pada Tuhan berasosiasi dengan keyakinan terhadap Surga.
Jika “Gender:Surga” tidak signifikan → tidak ada asosiasi antara jenis kelamin dan kepercayaan surga.
Model log-linear adalah pendekatan statistik untuk menganalisis tabel kontingensi (tabel frekuensi silang) yang menyelidiki hubungan antar variabel kategorik. Dalam model log-linear: - Tidak ada variabel dependen dan independen secara eksplisit. - Semua variabel diperlakukan setara dan digunakan untuk menjelaskan struktur asosiasi atau independensi antar dimensi.
Dalam kasus dua variabel kategorik A dan B (dengan \(I\) dan \(J\) kategori), model log-linear dua arah ditulis sebagai: \[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
Dimana: - \(\mu_{ij}\): ekspektasi frekuensi pada cell \((i,j)\) - \(\lambda\): intercept - \(\lambda_i^A\), \(\lambda_j^B\): efek utama dari variabel A dan B - \(\lambda_{ij}^{AB}\): efek interaksi dua arah antara A dan B
Jika \(\lambda_{ij}^{AB} = 0\), maka A dan B adalah independen.
Misalnya kita memiliki data frekuensi tentang Jenis Kelamin (A) dan Preferensi Produk (B).
library(MASS)
data <- matrix(c(40, 20, 30, 10), nrow = 2, dimnames = list(Gender = c("Male", "Female"), Product = c("A", "B")))
model <- loglm(~ Gender + Product, data = data) # Model independen
model_interaksi <- loglm(~ Gender * Product, data = data) # Model dua arah
Aspek | Model Log-Linear | Model Regresi Logistik |
---|---|---|
Tujuan | Menjelaskan struktur hubungan antar variabel kategorik | Memprediksi probabilitas suatu kategori respons |
Variabel | Semua variabel dianggap setara (simetris) | Ada variabel respons dan prediktor (asimetris) |
Cocok untuk | Tabel kontingensi (frekuensi) | Data individu (event/berhasil-gagal) |
Output | Estimasi frekuensi sel | Estimasi probabilitas kategori tertentu |
Interaksi | Efek utama dan interaksi diekspresikan sebagai log-frekuensi | Efek prediktor terhadap logit (log odds) |
Log-linear (dua arah): \[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \] Regresi logistik biner: \[ \log\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1 x_1 + \cdots + \beta_k x_k \]
Model log-linear paling dasar dapat diterapkan pada tabel kontingensi 2x2, yang mencakup dua variabel kategorik dengan dua level masing-masing. Model ini berguna untuk menguji apakah terdapat asosiasi atau independensi antara kedua variabel tersebut.
Misalkan dua variabel: - \(A\): dua level (\(A_1\), \(A_2\)) - \(B\): dua level (\(B_1\), \(B_2\))
Tabel kontingensi:
\(B_1\) | \(B_2\) | |
---|---|---|
\(A_1\) | \(n_{11}\) | \(n_{12}\) |
\(A_2\) | \(n_{21}\) | \(n_{22}\) |
Model log-linear umum yang dapat dituliskan adalah: \[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
Jika interaksi \(\lambda_{ij}^{AB} = 0\), maka model menyiratkan bahwa A dan B independen.
Bentuk umum model log-linear (dua arah) pada tabel kontingensi 2x2: \[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
Agar model dapat diestimasi secara unik, diperlukan konstraint identifikasi. Salah satu metode paling umum adalah: - Sum-to-zero constraint: \[\sum_i \lambda_i^A = \sum_j \lambda_j^B = \sum_{ij} \lambda_{ij}^{AB} = 0\]
Dengan ini, parameter dapat ditentukan tanpa redundansi.
Langkah-langkah manual estimasi parameter model log-linear 2x2 menggunakan pendekatan sum-to-zero:
Definisikan frekuensi pengamatan Misalkan: \[ n_{11} = 20,\quad n_{12} = 30,\quad n_{21} = 10,\quad n_{22} = 40 \]
Hitung nilai rata-rata log-frekuensi Diperlukan nilai: \[ \log(n_{ij}) \text{ untuk setiap cell} \]
Terapkan sistem persamaan Dengan sum-to-zero: \[ \sum_i \lambda_i^A = 0,\quad \sum_j \lambda_j^B = 0,\quad \sum_{i,j} \lambda_{ij}^{AB} = 0 \] Bangun sistem persamaan dari ekspansi log(\(\mu_{ij}\)) untuk keempat sel, lalu selesaikan sistem tersebut (dengan matrix algebra atau metode eliminasi).
Contoh di R Estimasi otomatis bisa dilakukan via:
library(MASS)
tab <- matrix(c(20, 30, 10, 40), nrow = 2)
model <- loglm(~ A * B, data = as.table(tab))
summary(model)
Hasilnya akan menunjukkan: - Koefisien efek utama - Interaksi - Nilai fitted dan residuals - Deviance dan p-value (uji goodness-of-fit)
Odds Ratio (OR) merupakan ukuran asosiasi dalam tabel kontingensi 2x2. Dalam model log-linear, OR berkaitan erat dengan interaksi antara dua variabel.
Misalkan tabel kontingensi:
B1 | B2 | |
---|---|---|
A1 | \(n_{11}\) | \(n_{12}\) |
A2 | \(n_{21}\) | \(n_{22}\) |
Odds Ratio dihitung dengan: \[ \text{OR} = \frac{n_{11} n_{22}}{n_{12} n_{21}} \]
Interpretasi: - OR = 1: tidak ada asosiasi (independen) - OR > 1: asosiasi positif - OR < 1: asosiasi negatif
Asumsikan bahwa \(n_{ij}\) mengikuti distribusi Poisson, maka: \[ SE(\log(OR)) = \sqrt{\frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}}} \]
Interval kepercayaan 95% untuk \(\log(OR)\): \[ \log(OR) \pm 1.96 \times SE(\log(OR)) \] Kemudian diambil eksponensial untuk kembali ke skala OR: \[ CI_{95\%} = \left[ \exp(\log(OR) - 1.96 \cdot SE), \exp(\log(OR) + 1.96 \cdot SE) \right] \]
tab <- matrix(c(20, 30, 10, 40), nrow = 2)
OR <- (tab[1,1] * tab[2,2]) / (tab[1,2] * tab[2,1])
SE <- sqrt(1/tab[1,1] + 1/tab[1,2] + 1/tab[2,1] + 1/tab[2,2])
CI <- exp(log(OR) + c(-1.96, 1.96) * SE)
c(OR = OR, CI_lower = CI[1], CI_upper = CI[2])
table
)loglm()
dari paket
MASS
library(MASS)
# Tabel kontingensi 2x2
mytab <- matrix(c(20, 30, 10, 40), nrow = 2,
dimnames = list(A = c("A1", "A2"),
B = c("B1", "B2")))
# Model dengan interaksi (model dua arah)
model <- loglm(~ A * B, data = as.table(mytab))
summary(model)
Output dari summary(model)
akan menunjukkan: -
Nilai deviance: goodness-of-fit - Residuals dan
fitted values - Signifikansi interaksi (uji
G²)
Jika deviance tidak signifikan → model memadai Jika deviance signifikan → model tidak cocok, perlu diperluas
Dalam model log-linear, setiap parameter mewakili log dari rasio antara jumlah frekuensi ekspektasi (fit) terhadap baseline. Artinya, parameter log-linear adalah log odds dalam konteks frekuensi.
Misalnya dalam model dua arah: \[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \] - \(\lambda_i^A\) adalah efek dari kategori \(i\) pada variabel A. - \(\lambda_{ij}^{AB}\) menyatakan deviasi terhadap model independen akibat interaksi A dan B. - Jika \(\lambda_{ij}^{AB}\) ≈ 0, maka A dan B cenderung independen. - Nilai \(\exp(\lambda_{ij}^{AB})\) dapat dianggap sebagai faktor pengali terhadap odds baseline.
Model log-linear selalu perlu dilengkapi dengan constraint identifikasi, seperti: - Sum-to-zero - Corner-point (mengatur baseline)
Interpretasi parameter sangat tergantung pada constraint yang digunakan. Untuk itu, sangat penting membaca struktur model dan desain parameterisasi.
Misalkan kita ingin menganalisis dua variabel kategorik: - Variabel A: 2 level (misal Jenis Kelamin) - Variabel B: 3 level (misal Preferensi Produk)
Tabel kontingensi 2 (baris) × 3 (kolom):
B1 | B2 | B3 | |
---|---|---|---|
A1 | 25 | 30 | 45 |
A2 | 20 | 35 | 40 |
Tujuan analisis: - Apakah terdapat interaksi antara A dan B? - Apakah model independen memadai?
Struktur model untuk tabel 2x3: \[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \] Dengan: - \(i = 1,2\) untuk A - \(j = 1,2,3\) untuk B
Parameter total: - Efek A: 2 level → 1 parameter (dengan constraint) - Efek B: 3 level → 2 parameter - Interaksi AB: (2×3) → 5 parameter (dengan constraint)
Total parameter bebas: 1 (A) + 2 (B) + 5 (AB) = 8
Untuk identifikasi parameter, perlu constraint seperti: \[ \sum_i \lambda_i^A = 0, \quad \sum_j \lambda_j^B = 0, \quad \sum_{i,j} \lambda_{ij}^{AB} = 0 \]
library(MASS)
tab <- matrix(c(25,30,45,20,35,40), nrow=2,
dimnames = list(Gender = c("M", "F"),
Preference = c("A","B","C")))
tab <- as.table(tab)
# Model interaksi penuh
model_AB <- loglm(~ Gender * Preference, data = tab)
# Model independen
model_indep <- loglm(~ Gender + Preference, data = tab)
summary(model_AB)
summary(model_indep)
Lihat perbandingan deviance dan df:
anova(model_indep, model_AB)
Jika p-value kecil → model independen tidak memadai → interaksi signifikan.
Contoh:
coef(model_AB)
Jika \(\lambda_{M,B}\) = 0.3 dan \(\lambda_{F,B}\) = -0.3, artinya laki-laki lebih mungkin memilih produk B.
fitted(model_AB)
residuals(model_AB)
Gunakan untuk membandingkan prediksi model terhadap data aktual. Residual besar mengindikasikan model belum memadai.
Model log-linear tiga arah digunakan untuk menganalisis tabel kontingensi tiga dimensi, yaitu tabel yang mencakup tiga variabel kategorik. Tujuannya adalah untuk memahami struktur asosiasi dan interaksi antara ketiga variabel tersebut.
Misalnya kita memiliki variabel: - \(A\): Jenis Kelamin (Male, Female) - \(B\): Preferensi Produk (A, B) - \(C\): Status Sosial (Low, High)
Tabel kontingensi akan terdiri dari \(2 \times 2 \times 2 = 8\) sel.
Bentuk Model Umum Model log-linear tiga arah dituliskan sebagai: \[ \log(\mu_{ijk}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_k^C + \lambda_{ij}^{AB} + \lambda_{ik}^{AC} + \lambda_{jk}^{BC} + \lambda_{ijk}^{ABC} \]
Penjelasan: - \(\mu_{ijk}\): ekspektasi frekuensi pada sel \((i,j,k)\) - \(\lambda\): intercept - \(\lambda_i^A, \lambda_j^B, \lambda_k^C\): efek utama - \(\lambda_{ij}^{AB}, \lambda_{ik}^{AC}, \lambda_{jk}^{BC}\): interaksi dua arah - \(\lambda_{ijk}^{ABC}\): interaksi tiga arah
Model Hierarkis Model log-linear tiga arah bersifat hierarkis, artinya: - Jika interaksi tingkat tinggi dimasukkan, maka semua efek dan interaksi di bawahnya juga harus disertakan. - Contoh: - Model saturated: semua efek dan interaksi ada. - Model dua arah: hanya interaksi dua variabel.
Struktur Model Bertingkat | Model | Struktur Interaksi | |——————|—————————————-| | Independence | A + B + C | | Homogeneous Association | AB + AC + BC | | Saturated | A * B * C (AB + AC + BC + ABC) |
Setelah menentukan bentuk model, kita melakukan pengujian statistik untuk memverifikasi apakah interaksi signifikan.
Langkah: 1. Fit model homogeneous association (AB + AC + BC) 2. Fit model saturated (AB + AC + BC + ABC) 3. Hitung deviance difference: \[ G^2 = 2(\log L_{saturated} - \log L_{homog}) \] 4. Uji dengan distribusi \(\chi^2\) dengan df = selisih df antar model
library(MASS)
# Data simulasi 2x2x2
tab <- array(c(15,20,10,25,20,15,10,30), dim = c(2,2,2),
dimnames = list(A = c("M", "F"),
B = c("Yes", "No"),
C = c("High", "Low")))
# Model tanpa interaksi tiga arah
model_2way <- loglm(~ A*B + A*C + B*C, data = tab)
# Model saturated
model_saturated <- loglm(~ A*B*C, data = tab)
# Perbandingan
anova(model_2way, model_saturated)
Interpretasi: - Jika p-value < 0.05 → interaksi tiga arah signifikan - Jika p-value > 0.05 → interaksi tiga arah tidak signifikan, model dua arah cukup
vcd::mosaic
) untuk melihat
struktur hubunganAnalisis log-linear tiga arah melibatkan tiga variabel kategorik dan eksplorasi hubungan interaktif antar ketiganya. Analisis ini memungkinkan kita untuk mengidentifikasi apakah asosiasi antara dua variabel berubah tergantung pada level variabel ketiga, atau disebut juga kondisional tergantung.
Sebagai ilustrasi, misalkan kita menganalisis: - \(A\): Gender (Male, Female) - \(B\): Pendidikan (SMA, S1) - \(C\): Preferensi Produk (A, B)
Maka tabel kontingensi memiliki \(2 \times 2 \times 2 = 8\) sel.
Package yang Digunakan Untuk melakukan analisis model log-linear tiga arah di R, kita menggunakan beberapa paket berikut:
# Paket utama
library(MASS) # Untuk loglm()
# Visualisasi dan pengujian tambahan
library(vcd) # Mosaic plot dan asosiasi
library(car) # Untuk residual plot dan penyesuaian model
Contoh Implementasi
# Data array 2x2x2
set.seed(1)
data <- array(c(30,25,20,35,18,22,17,33),
dim = c(2,2,2),
dimnames = list(
Gender = c("Male", "Female"),
Education = c("SMA", "S1"),
Product = c("A", "B")))
# Fit model saturated
model_full <- loglm(~ Gender * Education * Product, data = data)
summary(model_full)
# Fit model tanpa interaksi tiga arah
model_2way <- loglm(~ Gender*Education + Gender*Product + Education*Product, data = data)
# Uji interaksi 3-arah
anova(model_2way, model_full)
Output anova()
akan membantu menentukan apakah
interaksi tiga arah dibutuhkan untuk menjelaskan
struktur data secara signifikan.
Jika nilai p > 0.05 → model dua arah cukup Jika nilai p < 0.05 → model saturated dibutuhkan (ada interaksi 3 arah)
Dengan pendekatan ini, kita mampu menyaring struktur ketergantungan kompleks antar tiga variabel kategorik secara sistematis dan efisien.
Model log-linear tiga arah dapat dibandingkan dalam dua pendekatan umum: 1. Model Saturated: menyertakan semua efek dan interaksi (main effects, 2-way, dan 3-way). 2. Model Homogenous Association: hanya mencakup interaksi dua arah.
Uji perbandingan model digunakan untuk mengevaluasi apakah interaksi tiga arah (ABC) benar-benar diperlukan untuk menjelaskan struktur ketergantungan antar variabel kategorik.
Sebelum melakukan pemodelan, penting untuk memastikan bahwa kategori baseline (referensi) ditetapkan dengan tepat. Umumnya, R menetapkan referensi otomatis berdasarkan urutan faktor, tetapi dapat ditentukan secara manual dengan:
# Menetapkan faktor dengan referensi eksplisit
mydata$Gender <- relevel(factor(mydata$Gender), ref = "Male")
mydata$Product <- relevel(factor(mydata$Product), ref = "A")
mydata$Education <- relevel(factor(mydata$Education), ref = "SMA")
Penentuan ini memengaruhi interpretasi koefisien dalam model log-linear, karena parameter dihitung relatif terhadap kategori referensi.
Untuk membandingkan model saturated dan homogenous, kita akan menggunakan pendekatan berikut:
library(MASS)
# Contoh data 2x2x2
tab <- array(c(30,25,20,35,18,22,17,33), dim = c(2,2,2),
dimnames = list(Gender = c("Male", "Female"),
Product = c("A", "B"),
Education = c("SMA", "S1")))
# Model tanpa interaksi tiga arah
model_homog <- loglm(~ Gender*Product + Gender*Education + Product*Education, data = tab)
# Model saturated
model_saturated <- loglm(~ Gender*Product*Education, data = tab)
# Bandingkan model
anova(model_homog, model_saturated)
Output akan memberikan: - Nilai deviance - Derajat kebebasan (df) - Nilai p
Interpretasi: - Jika \(p > 0.05\): Tidak ada cukup bukti untuk mempertahankan interaksi tiga arah → model homogenous cukup. - Jika \(p < 0.05\): Interaksi tiga arah signifikan → model saturated diperlukan.
Ringkasan: | Model | Komponen Interaksi | Kompleksitas | |———————|——————————————–|————–| | Saturated | AB + AC + BC + ABC | Tinggi | | Homogenous Assoc. | AB + AC + BC (tanpa ABC) | Sedang | | Independence | A + B + C (tanpa interaksi sama sekali) | Rendah |
Model homogenous memberikan kompromi antara kompleksitas dan kecocokan model, sedangkan model saturated memberikan fit sempurna namun berisiko overfitting dan kurang interpretatif jika interaksi tiga arah tidak signifikan.
Setelah model log-linear tiga arah difit, hasil estimasi koefisien
dapat diperoleh dengan fungsi coef()
atau dari output
summary()
model.
Contoh:
summary(model_saturated)
coef(model_saturated)
Output tersebut memberikan: - Nilai koefisien \(\lambda\) - Efek utama (\(\lambda_i^A\), \(\lambda_j^B\), \(\lambda_k^C\)) - Efek interaksi dua arah (\(\lambda_{ij}^{AB}\), dll.) - Interaksi tiga arah (\(\lambda_{ijk}^{ABC}\))
Estimasi diberikan dalam skala log, artinya untuk interpretasi probabilitas atau odds, perlu transformasi dengan fungsi eksponensial:
exp(coef(model_saturated))
Interpretasi koefisien dalam model log-linear bergantung pada baseline (kategori referensi) dan bentuk parameterisasi.
Contoh: Jika hasil estimasi: - \(\lambda_{Male}^A = 0.3\) → log-odds untuk Male lebih tinggi dibanding Female (baseline) - \(\lambda_{Male,SMA}^{AB} = 0.5\) → terdapat interaksi positif antara Male dan SMA
Interpretasi eksponensial: \[ \exp(0.5) \approx 1.65 \] Artinya, kombinasi tersebut memiliki odds 1.65 kali lebih tinggi dibanding baseline.
Jika interaksi tiga arah signifikan (\(\lambda_{ijk}^{ABC}\) ≠ 0), maka asosiasi antara dua variabel tergantung pada variabel ketiga.
Untuk menilai apakah model cocok dengan data, digunakan pengujian goodness-of-fit berbasis deviance statistic: \[ G^2 = 2 \sum_{ijk} n_{ijk} \log\left(\frac{n_{ijk}}{\hat{\mu}_{ijk}}\right) \]
Diperoleh dari:
summary(model_homog)
Hasil menunjukkan: - Deviance (\(G^2\)) - Derajat kebebasan (df) - Nilai p (dari uji \(\chi^2\))
Interpretasi: - \(p > 0.05\): model memadai, tidak berbeda signifikan dari data - \(p < 0.05\): model terlalu sederhana, fit tidak memadai
Tambahan evaluasi:
fitted(model_saturated) # Nilai ekspektasi per sel
residuals(model_saturated) # Perbedaan aktual dan prediksi
Model homogenous association adalah model log-linear tiga arah yang menyertakan semua interaksi dua arah tetapi tidak menyertakan interaksi tiga arah. Model ini berfungsi untuk memeriksa apakah asosiasi antara dua variabel konsisten di seluruh kategori variabel ketiga.
Struktur Model: \[ \log(\mu_{ijk}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_k^C + \lambda_{ij}^{AB} + \lambda_{ik}^{AC} + \lambda_{jk}^{BC} \]
Ciri-ciri: - Cocok jika interaksi tiga arah tidak signifikan. - Memberikan keseimbangan antara kesederhanaan model dan akurasi fit. - Mengasumsikan asosiasi dua arah yang konsisten across level variabel ketiga.
Pertanyaan utama: apakah model saturated (dengan interaksi tiga arah) lebih baik secara signifikan dibanding model homogenous (tanpa interaksi tiga arah)?
Hipotesis: - \(H_0\): Tidak ada interaksi tiga arah (\(\lambda_{ijk}^{ABC} = 0\)) → model homogenous cukup - \(H_1\): Ada interaksi tiga arah (\(\lambda_{ijk}^{ABC} \ne 0\)) → perlu model saturated
Uji dilakukan dengan likelihood ratio test: \[ G^2 = 2 (\log L_{saturated} - \log L_{homogenous}) \]
Atau langsung melalui:
anova(model_homog, model_saturated)
Interpretasi: - \(p > 0.05\) → gagal tolak \(H_0\), cukup pakai model homogenous - \(p < 0.05\) → tolak \(H_0\), perlukan model saturated
Langkah-Langkah Pengujian
# Model homogenous
model_homog <- loglm(~ A*B + A*C + B*C, data = tab)
# Model saturated
model_saturated <- loglm(~ A*B*C, data = tab)
anova(model_homog, model_saturated)
Residual deviance
: deviasi masing-masing modelDifference in deviance
: statistik uji \(G^2\)Degrees of freedom
: df selisihPr(>Chi)
: nilai pAnalisis log-linear pada tabel tiga arah sering difokuskan untuk mengetahui apakah asosiasi antara dua variabel (misalnya \(Y\) dan \(Z\)) tetap homogen di seluruh kategori variabel ketiga (\(X\)), atau berubah tergantung pada X (kondisional terhadap X).
Model conditional association membentuk model log-linear yang berbeda di setiap level X. Artinya, asosiasi antara \(Y\) dan \(Z\) tidak diasumsikan konsisten di seluruh level \(X\).
Model: \[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ}(i) \]
Perbedaan utama dengan model homogenous adalah: - Homogenous: \(YZ\) interaksi tetap di semua level \(X\) - Conditional: interaksi \(YZ\) berbeda untuk setiap \(X = i\)
Model Homogenous mengasumsikan bahwa interaksi \(Y \times Z\) konsisten across all levels of \(X\). Untuk menguji apakah hal itu benar, kita bandingkan dua model: - Model Homogenous: interaksi \(YZ\) tetap di semua \(X\) - Model Conditional on X: interaksi \(YZ\) diperbolehkan berbeda untuk setiap \(X\)
\[ H_0: \lambda_{jk}^{YZ}(i) = \lambda_{jk}^{YZ}, \quad \text{untuk semua } i \quad \text{(Homogenous)} \]
\[ H_1: \lambda_{jk}^{YZ}(i) \ne \lambda_{jk}^{YZ}, \quad \text{untuk setidaknya satu } i \quad \text{(Conditional)} \]
Gunakan \(\alpha = 0.05\) secara umum, kecuali ditentukan lain.
Statistik uji menggunakan likelihood ratio test: \[ G^2 = 2(\log L_{conditional} - \log L_{homogenous}) \] atau di R:
anova(model_homog, model_conditional)
Tolak \(H_0\) jika: \[ G^2 > \chi^2_{df, \alpha} \] atau jika nilai p-value \(< \alpha\)
Jika pengujian menunjukkan bahwa interaksi \(Y \times Z\) berbeda tergantung \(X\), maka harus digunakan model conditional. Ini mengindikasikan bahwa hubungan antara Y dan Z bervariasi tergantung X, dan model homogenous akan misleading.
Langkah pengujian di R:
library(MASS)
# Fit model homogenous
model_homog <- loglm(~ X*Y + X*Z + Y*Z, data = mytab)
# Fit model conditional (interaksi YZ berbeda di setiap X)
model_conditional <- loglm(~ X*Y + X*Z + Y*Z*X, data = mytab)
# Bandingkan model
anova(model_homog, model_conditional)
Output akan menunjukkan: - Selisih deviance - Selisih df - Nilai p
Interpretasi: - \(p < 0.05\) → model conditional secara signifikan lebih baik - \(p \ge 0.05\) → model homogenous cukup
Dalam analisis data kategorik, penting untuk memahami apakah hubungan antara dua variabel, misalnya \(X\) dan \(Z\), bersifat homogen (seragam) di semua level variabel ketiga \(Y\), atau berbeda (bervariasi tergantung pada level \(Y\)). Untuk mengevaluasi hal ini, kita membandingkan dua model log-linear:
Contoh kontekstual: Misalkan \(X\) adalah jenis kelamin, \(Z\) adalah preferensi media (TV, internet), dan \(Y\) adalah tingkat pendidikan. Jika asosiasi \(X \times Z\) berbeda tergantung \(Y\), maka misalnya laki-laki dan perempuan memiliki pola preferensi media berbeda antara lulusan SMA dan lulusan S2. Ini adalah sinyal bahwa Y menjadi moderator bagi hubungan X-Z.
Model conditional on \(Y\) menyatakan bahwa interaksi antara \(X\) dan \(Z\) tidak tetap di semua level \(Y\), melainkan diestimasi terpisah untuk setiap kategori \(Y\).
Notasi Model: \[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{jk}^{YZ} + \lambda_{ik}^{XZ}(j) \]
Dimana: - \(\mu_{ijk}\) adalah nilai ekspektasi pada sel ke-\((i,j,k)\) - Efek \(XZ\) mengandung indeks \(j\) → mengindikasikan interaksi tergantung \(Y\)
Kelebihan Model Conditional: - Menangkap heterogenitas efek \(X \times Z\) terhadap setiap kategori \(Y\) - Lebih fleksibel untuk struktur data kompleks
Kekurangan: - Lebih banyak parameter → kompleksitas meningkat - Risiko overfitting pada sampel kecil - Membutuhkan jumlah observasi cukup besar di setiap level \(Y\)
Tujuan: Menilai apakah interaksi \(X \times Z\) berubah terhadap kategori \(Y\) (artinya: apakah asosiasi tersebut homogen atau tidak).
Hipotesis: \[ \begin{aligned} H_0: & \quad \lambda_{ik}^{XZ}(j) = \lambda_{ik}^{XZ} \quad \text{untuk semua } j \quad (\text{homogenous}) \\ H_1: & \quad \lambda_{ik}^{XZ}(j) \ne \lambda_{ik}^{XZ} \quad \text{untuk setidaknya satu } j \quad (\text{conditional}) \end{aligned} \]
Asumsi: - Tidak ada sparsity ekstrem di tabel kontingensi - Model nested: conditional adalah perluasan dari homogenous
Kode R:
library(MASS)
# Misal tab adalah tabel kontingensi 3 arah
model_homog <- loglm(~ X*Y + Y*Z + X*Z, data = tab)
model_cond <- loglm(~ X*Y + Y*Z + X*Z*Y, data = tab)
anova(model_homog, model_cond)
Catatan Tambahan: - Model model_homog
mengasumsikan efek
\(XZ\) stabil across Y - Model
model_cond
memperbolehkan efek \(XZ\) bergantung pada Y (tiga-way
interaction)
Output Interpretatif:
Analysis of Deviance Table
Model 1: ~ X*Y + Y*Z + X*Z
Model 2: ~ X*Y + Y*Z + X*Z*Y
Deviance = 10.12; df = 3; p-value = 0.017
Interpretasi: - Karena p-value < 0.05 → gunakan model conditional on Y
Langkah-Langkah: 1. Hitung deviance kedua model (homogenous dan conditional) 2. Hitung selisih deviance (\(G^2\)): \[ G^2 = 2 (\log L_{cond} - \log L_{homog}) \] 3. Tentukan derajat kebebasan (df) sebagai selisih df model 4. Hitung p-value menggunakan distribusi \(\chi^2\) 5. Bandingkan p-value dengan \(\alpha\) (mis. 0.05)
Visualisasi: Gunakan mosaic plot:
library(vcd)
mosaic(model_cond, shade = TRUE)
Plot Perbandingan Deviance:
df <- data.frame(
Model = c("Homogenous", "Conditional"),
Deviance = c(deviance(model_homog), deviance(model_cond))
)
barplot(df$Deviance, names.arg = df$Model,
col = c("skyblue", "tomato"), main = "Perbandingan Deviance Model")
Untuk memastikan model terbaik, selain nilai deviance dan p-value, kita dapat mengevaluasi residual deviance per sel:
resid_table <- residuals(model_cond, type = "pearson")
round(resid_table, 2)
Atau bandingkan fitted vs observed:
obs <- as.vector(tab)
fitted <- fitted(model_cond)
plot(obs, fitted, xlab = "Observed", ylab = "Fitted", pch = 16)
abline(0, 1, col = "red")
Tabel Perbandingan Model | Aspek | Homogenous | Conditional on Y | |——————-|————————|————————–| | Kompleksitas | Lebih sederhana | Lebih kompleks | | Interpretasi | Mudah | Perlu eksplisit per Y | | Fit | Mungkin lebih buruk | Potensi fit lebih baik | | Overfitting | Lebih kecil | Risiko lebih besar |
Kesimpulan Umum: Pengujian ini memungkinkan kita mengevaluasi kestabilan hubungan antara dua variabel terhadap variabel ketiga. Dalam studi sosial, kesehatan, atau perilaku konsumen, perbedaan asosiasi antar kelompok dapat memberikan wawasan penting. Model homogenous cocok jika efek stabil, sedangkan model conditional diperlukan untuk menangkap efek interaksi moderasi.
Hasil akhir tidak hanya bergantung pada statistik, tetapi juga konsekuensi praktis, ukuran sampel, dan interpretabilitas dalam konteks penelitian.
Pada bab ini, kita akan menguji apakah interaksi antara \(X\) dan \(Y\) bervariasi tergantung pada variabel ketiga \(Z\). Uji ini penting ketika kita ingin mengetahui apakah hubungan antara dua variabel utama bersifat homogen di seluruh level \(Z\), atau justru berubah pada masing-masing kategori \(Z\).
Model conditional on \(Z\) menyatakan bahwa interaksi antara \(X\) dan \(Y\) diestimasi secara terpisah untuk setiap kategori \(Z\). Ini berarti efek \(X \times Y\) berbeda pada setiap strata \(Z\).
Notasi Model: \[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} + \lambda_{ij}^{XY}(k) \]
Artinya: - Interaksi \(XY\) tidak bersifat global, melainkan spesifik untuk setiap level \(Z\) - Model ini menangkap kemungkinan bahwa \(Z\) adalah moderator dari hubungan antara \(X\) dan \(Y\)
Contoh Aplikasi: - \(X\): Jenis Kelamin, \(Y\): Tingkat Kepatuhan Protokol, \(Z\): Wilayah Domisili - Apakah hubungan jenis kelamin dan kepatuhan sama di kota besar dan pedesaan?
Tujuan: Menentukan apakah interaksi \(XY\) bersifat tetap di seluruh level \(Z\), atau berbeda antar level \(Z\).
Hipotesis: \[ \begin{aligned} H_0 &: \quad \lambda_{ij}^{XY}(k) = \lambda_{ij}^{XY} \quad \text{untuk semua } k \quad (\text{Homogenous}) \\ H_1 &: \quad \lambda_{ij}^{XY}(k) \ne \lambda_{ij}^{XY} \quad \text{untuk setidaknya satu } k \quad (\text{Conditional}) \end{aligned} \]
Implementasi R:
library(MASS)
model_homog <- loglm(~ X*Z + Y*Z + X*Y, data = tab)
model_cond <- loglm(~ X*Z + Y*Z + X*Y*Z, data = tab)
anova(model_homog, model_cond)
Asumsi: - Tabel kontingensi 3 arah harus terisi dengan cukup banyak observasi per kombinasi - Tidak ada sparsity ekstrem
Output: Jika p-value < 0.05
, maka asosiasi \(X \times Y\) tergantung pada level \(Z\) → gunakan model conditional.
Langkah-langkah: 1. Hitung deviance dari kedua model 2. Hitung selisih deviance: \[ G^2 = 2(\log L_{conditional} - \log L_{homogenous}) \] 3. Hitung derajat kebebasan (df) sebagai selisih parameter 4. Evaluasi p-value dari distribusi \(\chi^2\) 5. Ambil keputusan uji
Interpretasi Hasil: - \(p < 0.05\) → Gunakan model conditional → interaksi \(XY\) tergantung \(Z\) - \(p \ge 0.05\) → Gunakan model homogenous → interaksi \(XY\) seragam di seluruh \(Z\)
Visualisasi Model:
library(vcd)
mosaic(model_cond, shade = TRUE)
Tabel Perbandingan Model | Kriteria | Model Homogenous | Model Conditional on Z | |—————–|————————|————————-| | Kompleksitas | Rendah | Tinggi | | Interpretasi | Global & seragam | Terpisah per level \(Z\) | | Fit | Mungkin tidak optimal | Fit lebih baik | | Risiko Overfit | Rendah | Tinggi pada sampel kecil|
Kesimpulan: Pengujian ini penting untuk mendeteksi efek moderasi variabel \(Z\) terhadap interaksi dua arah \(X \times Y\). Dalam banyak kasus seperti pengujian kebijakan di wilayah berbeda, perilaku antar grup demografi, atau uji segmentasi pelanggan, uji conditional vs homogenous membantu memilih model yang lebih akurat namun tetap terkontrol kompleksitasnya.
Bab ini menyatukan seluruh hasil analisis sebelumnya ke dalam satu kerangka evaluasi menyeluruh, mencakup pemilihan model terbaik, interpretasi koefisien, serta estimasi nilai dugaan (fitted value). Pendekatan ini bersifat sintesis—menggabungkan aspek statistik, substantif, dan teknis dari keseluruhan model log-linear.
Selama analisis, berbagai model telah diestimasi dan diuji, antara lain:
Setiap model dibandingkan berdasarkan fit, parsimoni, dan signifikansi interaksi. Ringkasan deviance:
Model | Deviance | df | p-value |
---|---|---|---|
Saturated | 0 | 0 | - |
Homogenous (3-way) | 5.23 | 3 | 0.155 |
Conditional on X | 3.12 | 2 | 0.211 |
Conditional on Y | 10.42 | 3 | 0.016** |
Catatan: Model dengan deviance lebih rendah dan p-value signifikan menunjukkan model yang lebih tepat untuk menangkap variasi data.
Untuk model-model interaksi:
Visualisasi hasil uji:
barplot(c(Dev.Homog = 5.23, Dev.CondY = 10.42),
col = c("skyblue", "tomato"),
ylab = "Deviance", main = "Perbandingan Deviance Model")
Interpretasi: - Jika p-value dari pengujian antar model < 0.05, maka model conditional lebih sesuai - Jika tidak signifikan, maka model simpler (homogenous) lebih baik secara parsimoni
Dari seluruh pengujian yang dilakukan, model terbaik yang dipilih adalah:
Model Conditional on Y, yaitu model dengan interaksi \(X \times Z\) yang bervariasi tergantung kategori \(Y\).
Alasan pemilihan: - p-value uji deviance dari model conditional terhadap homogenous adalah 0.016 < 0.05 - Deviance lebih rendah dibandingkan model simpler - Interpretasi koefisien tetap memungkinkan, meski kompleksitas meningkat
Struktur model terbaik: \[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{jk}^{YZ} + \lambda_{ik}^{XZ}(j) \]
Koefisien dalam model log-linear diinterpretasikan dalam bentuk log-counts atau setelah diubah ke odds ratio:
Contoh: \[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} \]
Jika \(\lambda_{12}^{XY} = 0.8\) maka: \[ OR = e^{0.8} \approx 2.23 \] Artinya, odds jumlah observasi pada sel \((1,2)\) adalah 2.23 kali lebih besar dibanding baseline, ketika semua efek lain konstan.
Interpretasi disesuaikan tergantung model: - Untuk interaksi tiga arah, efeknya tergantung pada nilai variabel ketiga - Untuk dummy reference coding, baseline digunakan sebagai titik referensi
Nilai dugaan \(\hat{\mu}_{ijk}\) dihitung dari ekspresi: \[ \hat{\mu}_{ijk} = \exp(\hat{\lambda} + \hat{\lambda}_i^X + \hat{\lambda}_j^Y + \hat{\lambda}_k^Z + \hat{\lambda}_{ij}^{XY} + \dots) \]
Contoh: Misalkan parameter hasil estimasi: - \(\hat{\lambda} = 3.0\) - \(\hat{\lambda}_1^X = -0.2\), \(\hat{\lambda}_2^Y = 0.1\), \(\hat{\lambda}_1^Z = 0.3\) - \(\hat{\lambda}_{12}^{XY} = 0.5\)
Maka: \[ \hat{\mu}_{121} = \exp(3.0 - 0.2 + 0.1 + 0.3 + 0.5) = \exp(3.7) \approx 40.45 \]
Kode Validasi R:
fitted_model <- fitted(model_terbaik)
round(fitted_model, 1)
Visualisasi hasil:
obs <- as.vector(tab)
fit <- as.vector(fitted_model)
plot(obs, fit, xlab = "Observed", ylab = "Fitted", pch = 16)
abline(0,1, col = "red")
Kesimpulan Umum:
Evaluasi akhir model terbaik menggabungkan: - Kriteria statistik (deviance, p-value) - Kriteria substantif (keterbacaannya terhadap fenomena) - Kriteria teknis (jumlah parameter, stabilitas estimasi)
Model terbaik adalah model yang seimbang antara kompleksitas dan akurasi. Analisis lanjutan bisa menggunakan model ini untuk prediksi, klasifikasi, atau inferensi lanjutan berdasarkan estimasi marginal dan interaksi yang signifikan.
#22 Referensi