Model log-linear adalah model yang digunakan untuk menganalisis hubungan antara dua atau lebih variabel kategorik yang disajikan dalam tabel kontingensi. Model ini mengasumsikan bahwa logaritma dari nilai ekspektasi frekuensi sel (μ_ij) dapat dinyatakan sebagai penjumlahan efek variabel dan (bila perlu) interaksinya. Untuk tabel 2x2:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
Model log-linear digunakan untuk memodelkan frekuensi (count) pada tabel kontingensi dan menguji asosiasi antar variabel kategorik, tanpa menganggap ada variabel respon dan prediktor.
Model regresi logistik digunakan untuk memodelkan probabilitas kejadian suatu outcome (biner) berdasarkan satu atau lebih prediktor (bisa kategorik maupun kontinu).
Diberikan data:
Merokok | Sakit | Sehat |
---|---|---|
Ya | 30 | 20 |
Tidak | 10 | 40 |
Model log-linear pada tabel 2x2:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
dengan constraint sum-to-zero: \[ \sum_i \lambda_i^A = 0,\quad \sum_j \lambda_j^B = 0,\quad \sum_{i,j} \lambda_{ij}^{AB} = 0 \]
Misalkan:
A1 = Merokok (Ya), A2 = Tidak
B1 = Sakit, B2 = Sehat
Observasi:
\(n_{11} = 30\), \(n_{12} = 20\)
\(n_{21} = 10\), \(n_{22} = 40\)
\[ \begin{align*} \log(\mu_{11}) &= \lambda + \lambda_1^A + \lambda_1^B + \lambda_{11}^{AB} \\ \log(\mu_{12}) &= \lambda + \lambda_1^A + \lambda_2^B + \lambda_{12}^{AB} \\ \log(\mu_{21}) &= \lambda + \lambda_2^A + \lambda_1^B + \lambda_{21}^{AB} \\ \log(\mu_{22}) &= \lambda + \lambda_2^A + \lambda_2^B + \lambda_{22}^{AB} \end{align*} \]
Constraint sum-to-zero:
\(\lambda_1^A + \lambda_2^A = 0\)
\(\lambda_1^B + \lambda_2^B = 0\)
\(\lambda_{11}^{AB} + \lambda_{12}^{AB} +
\lambda_{21}^{AB} + \lambda_{22}^{AB} = 0\)
Langkah-langkah:
\[ \begin{align*} \lambda &= \frac{1}{4} \sum_{i=1}^{2} \sum_{j=1}^{2} \log(n_{ij}) \\ &= \frac{1}{4} [\log(30) + \log(20) + \log(10) + \log(40)] \\ &= 3.0971 \end{align*} \]
Efek utama A (Merokok): \[ \lambda_1^A = \frac{1}{2} \left[ (\log(30) + \log(20)) - (\log(10) + \log(40)) \right] / 2 \\ = \frac{1}{2} \left[(3.4012 + 2.9957) - (2.3026 + 3.6889)\right] \\ = \frac{1}{2} (6.3969 - 5.9915) = \frac{1}{2}(0.4054) = 0.2027 \] \[ \lambda_2^A = -0.2027 \]
Efek utama B (Status): \[ \lambda_1^B = \frac{1}{2} \left[ (\log(30) + \log(10)) - (\log(20) + \log(40)) \right] \\ = \frac{1}{2} \left[(3.4012 + 2.3026) - (2.9957 + 3.6889)\right] \\ = \frac{1}{2} (5.7038 - 6.6846) = \frac{1}{2}(-0.9808) = -0.4904 \] \[ \lambda_2^B = +0.4904 \]
Efek interaksi: \[ \lambda_{11}^{AB} = \frac{1}{4} [\log(30) - \log(20) - \log(10) + \log(40)] \\ = \frac{1}{4} [3.4012 - 2.9957 - 2.3026 + 3.6889] \\ = \frac{1}{4} (3.4012 - 2.9957 - 2.3026 + 3.6889) \\ = \frac{1}{4} (1.7918) = 0.4479 \] \[ \lambda_{12}^{AB} = -\lambda_{11}^{AB} = -0.4479 \\ \lambda_{21}^{AB} = -0.4479 \\ \lambda_{22}^{AB} = +0.4479 \]
Ringkasan parameter:
\[ \text{OR} = \frac{n_{11} n_{22}}{n_{12} n_{21}} = \frac{30 \times 40}{20 \times 10} = \frac{1200}{200} = 6 \]
Log odds ratio: \[ \log(\text{OR}) = \log(6) = 1.7918 \]
Standard error (SE): \[ SE = \sqrt{\frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}}} = \sqrt{\frac{1}{30} + \frac{1}{20} + \frac{1}{10} + \frac{1}{40}} = \sqrt{0.0333 + 0.05 + 0.1 + 0.025} = \sqrt{0.2083} = 0.4564 \]
95% Confidence Interval for log(OR):
\[ \log(OR) \pm 1.96 \times SE = 1.7918 \pm 1.96 \times 0.4564 \\ = (1.7918 - 0.895),\ (1.7918 + 0.895) \\ = (0.8968, 2.6868) \]
Back-transform to get CI for OR:
\[ \text{Lower} = \exp(0.8968) = 2.452 \\ \text{Upper} = \exp(2.6868) = 14.68 \]
Jadi, OR = 6 (95% CI: 2.45 – 14.68)
# Data 2x2
tabel <- matrix(c(30, 20, 10, 40), nrow = 2, byrow = TRUE)
colnames(tabel) <- c("Sakit", "Sehat")
rownames(tabel) <- c("Ya", "Tidak")
tabel
## Sakit Sehat
## Ya 30 20
## Tidak 10 40
data <- as.data.frame(as.table(tabel))
colnames(data) <- c("Merokok", "Status", "Freq")
data
## Merokok Status Freq
## 1 Ya Sakit 30
## 2 Tidak Sakit 10
## 3 Ya Sehat 20
## 4 Tidak Sehat 40
# Model tanpa interaksi
fit_no_inter <- glm(Freq ~ Merokok + Status, family = poisson, data = data)
summary(fit_no_inter)
##
## Call:
## glm(formula = Freq ~ Merokok + Status, family = poisson, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.996e+00 1.871e-01 16.013 <2e-16 ***
## MerokokTidak 3.892e-10 2.000e-01 0.000 1.000
## StatusSehat 4.055e-01 2.041e-01 1.986 0.047 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 21.288 on 3 degrees of freedom
## Residual deviance: 17.261 on 1 degrees of freedom
## AIC: 43.036
##
## Number of Fisher Scoring iterations: 4
# Model dengan interaksi
fit_inter <- glm(Freq ~ Merokok * Status, family = poisson, data = data)
summary(fit_inter)
##
## Call:
## glm(formula = Freq ~ Merokok * Status, family = poisson, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.4012 0.1826 18.629 < 2e-16 ***
## MerokokTidak -1.0986 0.3651 -3.009 0.00262 **
## StatusSehat -0.4055 0.2887 -1.405 0.16015
## MerokokTidak:StatusSehat 1.7918 0.4564 3.926 8.65e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2.1288e+01 on 3 degrees of freedom
## Residual deviance: -8.8818e-16 on 0 degrees of freedom
## AIC: 27.775
##
## Number of Fisher Scoring iterations: 3
Parameter utama (intercept) menunjukkan rata-rata log frekuensi sel.
Efek “Merokok” dan “Status” menunjukkan perbedaan log frekuensi antar kategori.
Interaksi signifikan menunjukkan adanya asosiasi antara Merokok dan Status.
Nilai log(6) =1.79 itu sama dengan efek interaksi ouput R
Suatu survei dilakukan untuk mengetahui hubungan antara Jenis Kelamin (Laki-laki/Perempuan) dan Kategori BMI (Kurus/Normal/Gemuk):
Kurus | Normal | Gemuk | |
---|---|---|---|
Laki-laki | 12 | 20 | 8 |
Perempuan | 18 | 24 | 10 |
Bentuk umum model log-linear untuk tabel 2x3 (dengan sum-to-zero constraint):
\[ \log(\mu_{ij}) = \lambda + \lambda_i^{A} + \lambda_j^{B} + \lambda_{ij}^{AB} \]
dengan:
\(\mu_{ij}\): ekspektasi frekuensi pada baris ke-\(i\), kolom ke-\(j\)
\(A\): Jenis Kelamin (\(i=1:\) Laki-laki, \(i=2:\) Perempuan)
\(B\): Kategori BMI (\(j=1:\) Kurus, \(j=2:\) Normal, \(j=3:\) Gemuk)
Constraint: \(\sum_i \lambda_i^A = 0\), \(\sum_j \lambda_j^B = 0\), \(\sum_i \lambda_{ij}^{AB} = 0\) dan \(\sum_j \lambda_{ij}^{AB} = 0\)
Secara eksplisit: \[ \begin{align*} \log(\mu_{ij}) =\ & \lambda \\ & + \lambda_1^A \text{ (Laki-laki)},\ \lambda_2^A \text{ (Perempuan)} \\ & + \lambda_1^B \text{ (Kurus)},\ \lambda_2^B \text{ (Normal)},\ \lambda_3^B \text{ (Gemuk)} \\ & + \lambda_{ij}^{AB} \text{ (interaksi jika ada)} \end{align*} \]
# Membuat data frame dari tabel
tabel2x3 <- matrix(c(12, 20, 8, 18, 24, 10), nrow = 2, byrow = TRUE)
colnames(tabel2x3) <- c("Kurus", "Normal", "Gemuk")
rownames(tabel2x3) <- c("Laki-laki", "Perempuan")
tabel2x3
## Kurus Normal Gemuk
## Laki-laki 12 20 8
## Perempuan 18 24 10
# Ubah menjadi data.frame untuk glm
data2x3 <- as.data.frame(as.table(tabel2x3))
colnames(data2x3) <- c("JenisKelamin", "BMI", "Freq")
data2x3
## JenisKelamin BMI Freq
## 1 Laki-laki Kurus 12
## 2 Perempuan Kurus 18
## 3 Laki-laki Normal 20
## 4 Perempuan Normal 24
## 5 Laki-laki Gemuk 8
## 6 Perempuan Gemuk 10
# Model log-linear tanpa interaksi (asumsi independen)
fit_no_inter <- glm(Freq ~ JenisKelamin + BMI, family = poisson, data = data2x3)
summary(fit_no_inter)
##
## Call:
## glm(formula = Freq ~ JenisKelamin + BMI, family = poisson, data = data2x3)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.5683 0.2179 11.789 <2e-16 ***
## JenisKelaminPerempuan 0.2624 0.2103 1.248 0.2122
## BMINormal 0.3830 0.2368 1.618 0.1058
## BMIGemuk -0.5108 0.2981 -1.713 0.0866 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 13.06443 on 5 degrees of freedom
## Residual deviance: 0.22527 on 2 degrees of freedom
## AIC: 35.26
##
## Number of Fisher Scoring iterations: 3
# Model log-linear dengan interaksi (untuk cek asosiasi)
fit_inter <- glm(Freq ~ JenisKelamin * BMI, family = poisson, data = data2x3)
summary(fit_inter)
##
## Call:
## glm(formula = Freq ~ JenisKelamin * BMI, family = poisson, data = data2x3)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.4849 0.2887 8.608 <2e-16 ***
## JenisKelaminPerempuan 0.4055 0.3727 1.088 0.277
## BMINormal 0.5108 0.3651 1.399 0.162
## BMIGemuk -0.4055 0.4564 -0.888 0.374
## JenisKelaminPerempuan:BMINormal -0.2231 0.4802 -0.465 0.642
## JenisKelaminPerempuan:BMIGemuk -0.1823 0.6032 -0.302 0.762
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1.3064e+01 on 5 degrees of freedom
## Residual deviance: 2.6645e-15 on 0 degrees of freedom
## AIC: 39.034
##
## Number of Fisher Scoring iterations: 3
Model tanpa interaksi: - Jika deviance tidak signifikan, maka Jenis Kelamin dan BMI independen.
Intercept: log frekuensi pada kategori referensi (Laki-laki, Kurus)
Koefisien JenisKelaminPerempuan: perbedaan log-frekuensi antara Perempuan vs Laki-laki (pada Kurus)
Koefisien BMI: perbedaan log-frekuensi kategori BMI (Normal/Gemuk) terhadap Kurus (pada Laki-laki)
Model dengan interaksi:
Contoh interpretasi hasil (misal):
Jika koefisien JenisKelaminPerempuan negatif: proporsi Perempuan pada kategori referensi lebih kecil dibanding Laki-laki.
Jika koefisien BMI_Normal positif: kemungkinan seseorang Normal lebih tinggi daripada Kurus (pada Laki-laki).
Jika model interaksi signifikan, pola distribusi BMI berbeda antara Laki-laki dan Perempuan.