Analisis data kategorik adalah cabang statistik yang fokus pada pengolahan, pengambilan kesimpulan, dan interpretasi data yang terdiri dari kategori-kategori atau kelompok diskrit. Data kategorik muncul ketika variabel diukur dalam bentuk kategori seperti jenis kelamin (Laki-laki/Perempuan), status pekerjaan (Bekerja/Tidak), atau jawaban survei (Setuju/Tidak Setuju).
Berbeda dengan data numerik yang bersifat kuantitatif, data kategorik memberikan informasi kualitatif mengenai atribut, kelompok, atau klasifikasi objek atau individu. Oleh karena itu, metode statistika khusus dikembangkan untuk melakukan analisis data ini secara akurat dan efisien.
Tujuan utama analisis data kategorik adalah:
Data kategorik adalah data yang diklasifikasikan ke dalam kelompok atau kategori yang terpisah dan tidak memiliki nilai numerik intrinsik. Data ini terdiri dari:
Analisis data kategorik meliputi teknik statistik yang dirancang untuk menangani variabel jenis ini, seperti:
Ruang lingkup analisis ini mencakup semua bidang yang menggunakan data kategori untuk evaluasi dan pengambilan keputusan.
Sering kali, istilah data kategorik dan data kualitatif dipakai bergantian, namun ada perbedaan halus:
Aspek | Data Kategorik | Data Kualitatif |
---|---|---|
Sifat Data | Umumnya terstruktur dalam kategori yang jelas | Bisa berupa deskripsi, narasi, gambar, dll. |
Fokus Analisis | Analisis statistik numerik dan komparatif | Analisis tematik, konten, subjektif |
Contoh Data | Jenis kelamin, golongan darah, status nikah | Wawancara, observasi, catatan lapangan |
Tujuan | Mendapatkan pola, hubungan statistik | Mendapatkan pemahaman mendalam, makna |
Data kategorik adalah bagian dari data kuantitatif diskrit, sedangkan data kualitatif lebih bersifat eksploratif dan naratif.
Analisis data kategorik memiliki banyak aplikasi penting, antara lain:
Analisis yang tepat memungkinkan peneliti, praktisi, dan pengambil keputusan memahami pola, membuat prediksi, dan merancang intervensi yang efektif.
Kesimpulan
Analisis data kategorik merupakan komponen vital dalam statistika yang membantu mengubah data kategori menjadi informasi bermakna. Penguasaan konsep dan teknik analisis ini sangat penting untuk keberhasilan riset dan pengembangan di berbagai bidang ilmu dan praktik profesional.
Tabel kontingensi adalah cara paling dasar untuk menampilkan
frekuensi gabungan dari dua atau lebih variabel kategori.
Biasanya berbentuk tabel dua dimensi seperti tabel 2×2, 3×2, dan
seterusnya, yang menggambarkan distribusi joint frequency antar
kategori.
Digunakan untuk menguji hipotesis korelasi atau asosiasi antara dua
variabel kategori dalam tabel kontingensi.
Hipotesis nol menyatakan tidak ada asosiasi (independen).
Alternatif untuk Chi-Square saat ukuran sampel kecil atau frekuensi
sel rendah, memberikan probabilitas exact tanpa asumsi asimptotik.
Sering digunakan dalam tabel 2×2 dengan data kecil.
Memperkuat analisis dengan mengukur seberapa kuat hubungan antara variabel kategori:
Metode modeling untuk memprediksi variabel dependen kategori
(biasanya biner) dari satu atau beberapa variabel independen (kategori
maupun numerik).
Berguna untuk analisis multivariat dan kontrol variabel pengganggu.
Distribusi probabilitas dalam data kategori menjelaskan peluang tiap kategori muncul dalam suatu variabel diskrit. Pemahaman terhadap berbagai distribusi probabilitas sangat penting dalam analisis data kategori, terutama untuk pemodelan dan inferensi statistik.
Distribusi Bernoulli adalah distribusi probabilitas diskrit paling sederhana, digunakan untuk variabel dengan dua kategori (biner), misal sukses/gagal, ya/tidak.
Definisi:
Untuk variabel acak \(X\) dengan nilai 1 (sukses) dengan peluang \(p\), dan nilai 0 (gagal) dengan peluang \(1-p\):
\[ P(X=x) = p^x (1-p)^{1-x}, \quad x \in \{0, 1\} \]
Karakteristik utama:
Contoh:
Keluarnya angka kepala (success) saat melempar koin: \(p = 0.5\).
Distribusi Binomial memperluas Bernoulli ke jumlah percobaan \(n\) independen dengan peluang sukses sama \(p\), menghitung peluang \(k\) sukses dalam \(n\) percobaan.
Fungsi probabilitas:
\[ P(X = k) = \binom{n}{k} p^{k} (1-p)^{n-k}, \quad k = 0,1,\ldots,n \]
Karakteristik utama:
Contoh:
Jumlah orang yang memilih produk A dari 10 pelanggan, dengan probabilitas memilih 0.3.
Distribusi Multinomial adalah generalisasi distribusi Binomial untuk variabel kategori dengan lebih dari dua kemungkinan kategori.
Fungsi probabilitas:
Jika ada \(K\) kategori dengan peluang masing-masing \(p_1, p_2, \ldots, p_K\) dan \(n\) percobaan, peluang observasi hasil dengan frekuensi \((n_1, n_2, \ldots, n_K)\) adalah:
\[ P(n_1, n_2, \ldots, n_K) = \frac{n!}{n_1! n_2! \cdots n_K!} p_1^{n_1} p_2^{n_2} \cdots p_K^{n_K} \]
dengan \(\sum_{k=1}^K n_k = n\) dan \(\sum_{k=1}^K p_k = 1\).
Contoh:
Jumlah pelanggan memilih jenis transportasi dari tiga kategori: Mobil, Motor, Sepeda.
Distribusi Poisson digunakan untuk menghitung peluang jumlah kejadian dalam interval waktu atau ruang tertentu ketika kejadian tersebut jarang dan independen.
Fungsi probabilitas:
\[ P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!}, \quad k = 0,1,2, \ldots \]
dengan \(\lambda\) adalah rata-rata jumlah kejadian per interval.
Karakteristik utama:
Contoh:
Jumlah kecelakaan lalu lintas dalam sehari di sebuah persimpangan.
Contoh Implementasi Distribusi di R
## [1] 0.4
## [1] 0.6
# Distribusi Binomial: n=10 percobaan, p=0.3 sukses
n <- 10
p <- 0.3
k <- 3
dbinom(k, size = n, prob = p) # P(X=3)
## [1] 0.2668279
# Distribusi Multinomial: n=5, p kategori = c(0.2, 0.5, 0.3)
n <- 5
prob_kat <- c(0.2, 0.5, 0.3)
n_kat <- c(1, 3, 1) # jumlah observasi dalam tiap kategori
dmultinom(n_kat, size = n, prob = prob_kat) # P(X1=1,X2=3,X3=1)
## [1] 0.15
# Distribusi Poisson: Lambda = 2, probabilitas 3 kejadian
lambda <- 2
k <- 3
dpois(k, lambda = lambda) # P(X=3)
## [1] 0.180447
Berikut adalah versi yang sudah diperbaiki dan dimodifikasi agar lebih sistematis dan mudah dibaca, tetap lengkap, serta sesuai standar penulisan ilmiah:
Dalam analisis data kategori, desain sampling memegang peran krusial dalam menentukan validitas dan reliabilitas hasil penelitian. Pemilihan desain sampling yang tepat sangat dipengaruhi oleh tujuan penelitian dan jenis data yang dikumpulkan. Secara umum, desain sampling dapat dikelompokkan ke dalam dua pendekatan utama, yaitu:
Setiap pendekatan memiliki karakteristik dan metode sampling yang berbeda, yang sering kali digunakan baik dalam penelitian eksperimental maupun observasional seperti eksperimen, studi kohort, dan studi kasus-kontrol.
Prospective sampling adalah metode pengambilan sampel di mana subjek penelitian diidentifikasi dan diikuti dalam suatu periode waktu tertentu untuk memantau perkembangan variabel yang diteliti. Pendekatan ini memungkinkan peneliti mengontrol variabel bebas sebelum pengukuran hasil dilakukan, sehingga banyak digunakan dalam studi kausal dan eksperimental. Beberapa jenis desain sampling dalam pendekatan ini adalah:
Dalam studi eksperimen, subjek secara acak dialokasikan ke dalam kelompok perlakuan dan kontrol untuk mengendalikan variabel pengganggu. Teknik sampling yang umum digunakan meliputi:
Studi kohort adalah penelitian observasional yang mengikuti kelompok individu dengan karakteristik tertentu dari waktu ke waktu untuk mengamati kejadian yang dipelajari. Teknik sampling dalam studi kohort antara lain:
Retrospective sampling mengumpulkan data dari peristiwa yang telah terjadi sebelumnya. Metode ini umum digunakan pada studi observasional untuk mengkaji hubungan antara faktor risiko dan hasil yang sudah terjadi.
Dalam studi kasus-kontrol, sekelompok individu dengan kondisi tertentu (kasus) dibandingkan dengan kelompok tanpa kondisi tersebut (kontrol). Teknik sampling umum meliputi:
Dalam studi kohort retrospektif, data historis digunakan untuk mengelompokkan individu berdasarkan paparan, kemudian dianalisis hasil yang terjadi. Teknik sampling yang sering digunakan adalah:
Jenis Studi | Pendekatan | Metode Sampling | Keuntungan | Kelemahan |
---|---|---|---|---|
Eksperimen | Prospektif | SRS, Stratified, Cluster | Kontrol tinggi terhadap variabel, dapat analisis sebab-akibat | Biaya tinggi, etika dan validitas perlu diperhatikan |
Studi Kohort | Prospektif | Census, Systematic, Matched | Dapat mengamati perkembangan kejadian dalam jangka panjang | Membutuhkan waktu lama, risiko kehilangan partisipan |
Studi Kasus-Kontrol | Retrospektif | Purposive, Snowball, Incidence Density | Mudah dan cepat, efisien untuk penyakit langka | Sulit mengontrol variabel pengganggu, bias recall rentan |
Studi Kohort Retrospektif | Retrospektif | Convenience, Quota, Case-Based | Memanfaatkan data historis, lebih murah dari studi kohort | Ketergantungan pada kualitas data historis, risiko missing data |
Desain sampling dalam analisis data kategori sangat bergantung pada pendekatan yang digunakan, apakah prospective atau retrospective. Pemilihan metode sampling yang tepat dalam eksperimen, studi kohort, dan studi kasus-kontrol dapat meningkatkan validitas penelitian serta memastikan hasil yang dapat digeneralisasikan. Pemahaman mendalam mengenai karakteristik tiap metode sampling penting dalam merancang penelitian yang robust dan berkualitas.
Tabel kontingensi adalah tabel yang digunakan untuk menyajikan distribusi frekuensi dari dua atau lebih variabel kategori. Tabel ini membantu dalam memahami hubungan antara variabel kategori dengan menampilkan jumlah kejadian dalam setiap kombinasi kategori.
Terdapat beberapa jenis Tabel Kontingensi
Tabel 2×2 Tabel ini memiliki dua variabel dengan dua kategori masing-masing. Ini adalah bentuk paling sederhana dari tabel kontingensi. Contoh:Hubungan antara merokok (Ya/Tidak) dan kejadian penyakit paru-paru (Ya/Tidak).
Tabel RxC (General) Tabel ini memiliki R baris dan C kolom, yang memungkinkan lebih banyak kategori. Contoh:Hubungan antara tingkat pendidikan (SD, SMP, SMA, S1, S2) dan status pekerjaan (Pengangguran, Pekerja, Wiraswasta).
Tabel Kontingensi Berganda Digunakan untuk lebih dari dua variabel kategori. Contoh:Hubungan antara jenis kelamin, status pekerjaan, dan tingkat pendidikan.
Tabel kontingensi adalah tabel yang digunakan untuk menampilkan frekuensi kejadian dua variabel kategori sekaligus. Tabel kontingensi 2x2 menggambarkan hubungan antara dua variabel kategori yang masing-masing memiliki dua kategori.
Kategori 1 (Variabel B) | Kategori 2 (Variabel B) | Jumlah Baris | |
---|---|---|---|
Kategori 1 (Variabel A) | \(a\) | \(b\) | \(a+b\) |
Kategori 2 (Variabel A) | \(c\) | \(d\) | \(c+d\) |
Jumlah Kolom | \(a+c\) | \(b+d\) | \(n=a+b+c+d\) |
Simbol dan Notasi
Fungsi dan Kegunaan
Peluang bersama adalah probabilitas bahwa kedua variabel kategori terjadi secara bersamaan dalam suatu sel tabel kontingensi. Secara matematis, peluang bersama antara kejadian \(A_i\) (misalnya kategori baris) dan \(B_j\) (kategori kolom) dihitung sebagai:
\[ P(A_i, B_j) = \frac{n_{ij}}{n} \]
dimana:
- \(n_{ij}\) adalah frekuensi
pengamatan pada sel di baris \(i\) dan
kolom \(j\).
- \(n\) adalah total seluruh pengamatan
dalam tabel.
Peluang marginal adalah probabilitas kejadian suatu variabel tanpa mempertimbangkan variabel lain. Peluang marginal dapat dihitung untuk baris maupun kolom.
\[ P(A_i) = \frac{n_{i \cdot}}{n} \]
dimana \(n_{i \cdot}\) adalah jumlah total pada baris ke-\(i\).
\[ P(B_j) = \frac{n_{\cdot j}}{n} \]
dimana \(n_{\cdot j}\) adalah jumlah total pada kolom ke-\(j\).
Peluang bersyarat adalah probabilitas suatu kejadian terjadi dengan syarat kejadian lain telah terjadi. Dalam konteks tabel kontingensi, peluang bersyarat variabel kolom \(B_j\) diberikan baris \(A_i\) adalah:
\[ P(B_j \mid A_i) = \frac{P(A_i, B_j)}{P(A_i)} = \frac{n_{ij}}{n_{i \cdot}} \]
Contoh Perhitungan Manual
Tabel kontingensi di bawah ini menunjukkan data hubungan antara Kebiasaan Berjalan Kaki (Sering, Jarang) dan Hipertensi (Ya, Tidak).
Berjalan Kaki / Hipertensi | Ya | Tidak | Total |
---|---|---|---|
Sering | 20 | 80 | 100 |
Jarang | 50 | 50 | 100 |
Total | 70 | 130 | 200 |
Hitung Peluang Bersama \(P(A_i, B_j)\):
Sel | Frekuensi \(n_{ij}\) | Peluang Bersama \(P(A_i, B_j) = \frac{n_{ij}}{n}\) |
---|---|---|
(Sering, Ya) | 20 | 20 / 200 = 0.10 |
(Sering, Tidak) | 80 | 80 / 200 = 0.40 |
(Jarang, Ya) | 50 | 50 / 200 = 0.25 |
(Jarang, Tidak) | 50 | 50 / 200 = 0.25 |
Hitung Peluang Marginal Baris \(P(A_i)\):
Kategori Berjalan Kaki | Jumlah Baris \(n_{i\cdot}\) | Peluang \(P(A _i) = \frac{n_{i \cdot}}{n}\) |
---|---|---|
Sering | 100 | \(\frac{100}{200} = 0.5\) |
Jarang | 100 | \(\frac{100}{200} = 0.5\) |
Hitung Peluang Marginal Kolom \(P(B_j)\):
Kategori Hipertensi | Jumlah Kolom \(n_{\cdot j}\) | Peluang \(P( B _j) = \frac{n_{\cdot j}}{n}\) |
---|---|---|
Ya | 70 | \(\frac{70}{200} = 0.35\) |
Tidak | 130 | \(\frac{130}{200} = 0.65\) |
Hitung Peluang Bersyarat \(P(B_j \mid A_i)\):
Kategori Berjalan Kaki | Hipertensi Ya | Hipertensi Tidak |
---|---|---|
Sering | \(\ f r ac{20}{100} = 0.20\) | \(\ f r ac{80}{100} = 0.80\) |
Jarang | \(\ f r ac{50}{100} = 0.50\) | \(\ f r ac{50}{100} = 0.50\) |
Interpretasi
Implementasi Perhitungan di R
# Membuat tabel kontingensi 2x2
tabel <- matrix(c(20, 80, 50, 50), nrow = 2, byrow = TRUE)
rownames(tabel) <- c("Sering", "Jarang")
colnames(tabel) <- c("Ya", "Tidak")
print("Tabel Kontingensi:")
## [1] "Tabel Kontingensi:"
## Ya Tidak
## Sering 20 80
## Jarang 50 50
# Total observasi
n <- sum(tabel)
# Peluang Bersama
peluang_bersama <- tabel / n
cat("\nPeluang Bersama (Joint Probability):\n")
##
## Peluang Bersama (Joint Probability):
## Ya Tidak
## Sering 0.10 0.40
## Jarang 0.25 0.25
# Peluang Marginal Baris
peluang_marginal_baris <- rowSums(tabel) / n
cat("\nPeluang Marginal Baris:\n")
##
## Peluang Marginal Baris:
## Sering Jarang
## 0.5 0.5
# Peluang Marginal Kolom
peluang_marginal_kolom <- colSums(tabel) / n
cat("\nPeluang Marginal Kolom:\n")
##
## Peluang Marginal Kolom:
## Ya Tidak
## 0.35 0.65
# Peluang Bersyarat (Baris)
peluang_bersyarat <- prop.table(tabel, margin = 1)
cat("\nPeluang Bersyarat (Conditional Probability P(Hipertensi | Berjalan Kaki)):\n")
##
## Peluang Bersyarat (Conditional Probability P(Hipertensi | Berjalan Kaki)):
## Ya Tidak
## Sering 0.2 0.8
## Jarang 0.5 0.5
Beda Peluang (Risk Difference)
Beda peluang mengukur perbedaan probabilitas kejadian di antara dua kelompok:
\[ RD = P(\text{Hipertensi | Jarang Berjalan}) - P(\text{Hipertensi | Sering Berjalan}) \]
\[ RD = 0.50 - 0.20 = 0.30 \]
Interpretasi: Individu yang jarang berjalan kaki memiliki kemungkinan hipertensi lebih tinggi sebesar 30% dibandingkan individu yang sering berjalan kaki.
Risiko Relatif (Relative Risk)
Risiko relatif mengukur rasio kemungkinan kejadian antara dua kelompok:
\[ RR = \frac{P(\text{Hipertensi | Jarang Berjalan})}{P(\text{Hipertensi | Sering Berjalan})} \]
\[ RR = \frac{0.50}{0.20} = 2.5 \]
Interpretasi: Risiko hipertensi pada individu yang jarang berjalan kaki 2.5 kali lebih tinggi dibandingkan dengan individu yang sering berjalan kaki.
Odd Ratio (OR)
Odd Ratio (OR) membandingkan peluang kejadian relatif antara dua kelompok:
\[ OR = \frac{\frac{a}{b}}{\frac{c}{d}} \]
Di mana: - \(a = 50\) (Jarang Berjalan dan Hipertensi) - \(b = 50\) (Jarang Berjalan dan Tidak Hipertensi) - \(c = 20\) (Sering Berjalan dan Hipertensi) - \(d = 80\) (Sering Berjalan dan Tidak Hipertensi)
\[ OR = \frac{\frac{50}{50}}{\frac{20}{80}} = \frac{1}{0.25} = 4 \]
Interpretasi: Individu yang jarang berjalan kaki memiliki kemungkinan 4 kali lebih besar untuk mengalami hipertensi dibandingkan individu yang sering berjalan kaki.
Kesimpulan
Dari hasil perhitungan, dapat disimpulkan bahwa:
Peluang seseorang mengalami hipertensi lebih tinggi jika mereka jarang berjalan kaki (50%) dibandingkan dengan mereka yang sering berjalan kaki (20%).
Beda peluang menunjukkan bahwa individu yang jarang berjalan memiliki risiko hipertensi lebih tinggi sebesar 30%.
Risiko relatif menunjukkan bahwa individu yang jarang berjalan memiliki risiko hipertensi 2.5 kali lebih besar dibandingkan yang sering berjalan.
Odd Ratio menunjukkan bahwa individu yang jarang berjalan kaki memiliki kemungkinan 4 kali lebih besar mengalami hipertensi dibandingkan yang sering berjalan.
Kebiasaan berjalan kaki tampaknya memiliki hubungan dengan kejadian hipertensi, di mana individu yang lebih sering berjalan kaki memiliki risiko hipertensi yang lebih rendah.
Dengan memahami ukuran asosiasi ini, kita dapat menginterpretasikan hubungan antara kebiasaan berjalan kaki dan risiko hipertensi secara lebih mendalam.
Inferensi dalam statistik mengacu pada proses pengambilan kesimpulan mengenai populasi berdasarkan sampel data. Dalam konteks tabel kontingensi dua arah, inferensi digunakan untuk menganalisis hubungan antara dua variabel kategorikal yang disusun dalam tabel kontingensi.
Tabel kontingensi adalah tabel yang menyajikan distribusi frekuensi dari dua variabel kategorikal dalam bentuk matriks. Tujuan utama dari inferensi pada tabel ini adalah untuk memahami hubungan antara variabel-variabel tersebut melalui estimasi dan pengujian hipotesis.
Estimasi bertujuan untuk memperkirakan parameter populasi berdasarkan data sampel. Estimasi dibagi menjadi dua jenis:
Estimasi titik digunakan untuk menentukan satu nilai spesifik sebagai perkiraan terbaik dari parameter populasi. Rumus untuk estimasi titik proporsi adalah:
\[ \hat{p} = \frac{x}{n} \]
Keterangan: - \(\hat{p}\): estimasi titik proporsi, - \(x\): jumlah individu dalam kategori tertentu, - \(n\): total jumlah individu dalam sampel.
Estimasi interval memberikan rentang nilai yang diyakini mengandung parameter populasi dengan tingkat kepercayaan tertentu. Rumusnya:
\[ \hat{p} \pm Z_{\alpha/2} \sqrt{\frac{\hat{p}(1 - \hat{p})}{n}} \]
Keterangan: - \(Z_{\alpha/2}\): nilai dari distribusi normal standar untuk tingkat kepercayaan tertentu (misal, 1.96 untuk 95% confidence level), - \(\hat{p}\): estimasi titik proporsi, - \(n\): ukuran sampel.
Uji proporsi dua sampel digunakan untuk menguji apakah ada perbedaan signifikan antara dua proporsi populasi.
a. Rumus Uji Proporsi Dua Sampel
Estimasi proporsi dalam masing-masing kelompok diberikan oleh: \[ \hat{p_1} = \frac{n_{11}}{n_1.},\ \hat{p_2} = \frac{n_{21}}{n_2.} \]
Estimasi proporsi gabungan (pooling proportion): \[ \hat{p} = \frac{n_{11}+n_{21}}{n_1.+n_2.} \]
Statistik uji untuk uji proporsi dua sampel:
\[ Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1-\hat{p}) \left(\frac{1}{n_1.} + \frac{1}{n_2.}\right)}} \]
Perhitungan
# Data Observasi
data <- matrix(c(20, 80, 50, 50), nrow = 2, byrow = TRUE)
dimnames(data) <- list(Berjalan_Kaki = c("Sering", "Jarang"), Hipertensi = c("Ya", "Tidak"))
print(data)
## Hipertensi
## Berjalan_Kaki Ya Tidak
## Sering 20 80
## Jarang 50 50
p1 <- data[1,1] / sum(data[1,]) # Proporsi hipertensi pada kelompok sering berjalan kaki
p2 <- data[2,1] / sum(data[2,]) # Proporsi hipertensi pada kelompok jarang berjalan kaki
p_hat <- (data[1,1] + data[2,1]) / sum(data) # Proporsi gabungan
SE_pooled <- sqrt(p_hat * (1 - p_hat) * (1/sum(data[1,]) + 1/sum(data[2,])))
Z_stat <- (p1 - p2) / SE_pooled
cat("Proporsi sering berjalan kaki dengan hipertensi:", p1, "\n")
## Proporsi sering berjalan kaki dengan hipertensi: 0.2
## Proporsi jarang berjalan kaki dengan hipertensi: 0.5
## Z Statistik: -4.447496
alpha <- 0.05
p_value <- 2 * (1 - pnorm(abs(Z_stat))) # Uji dua sisi
Z_critical <- qnorm(1 - alpha/2)
cat("Z kritis:", Z_critical, "\n")
## Z kritis: 1.959964
## P-value: 8.687712e-06
if(abs(Z_stat) > Z_critical) {
cat("Keputusan: Tolak H0, terdapat perbedaan proporsi hipertensi yang signifikan antara kelompok.\n")
} else {
cat("Keputusan: Gagal menolak H0, tidak ada perbedaan signifikan dalam proporsi hipertensi antara kelompok.\n")
}
## Keputusan: Tolak H0, terdapat perbedaan proporsi hipertensi yang signifikan antara kelompok.
Uji asosiasi digunakan untuk mengukur kekuatan dan arah hubungan antara dua variabel kategorik. Dengan tiga ukuran utama yang diujikan, yakni Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR)
Hipotesis
H₀ : Kedua variabel tidak saling berhubungan (independen).
H₁ : Kedua variabel saling berhubungan (tidak independen)
Statistik Uji: Z
Untuk statistik Risk Difference (RD): Rumus: \[RD = p_1 - p_2, \text{ dengan } p_1 = \frac{n_{11}}{n_{1.}}, \quad p_2 = \frac{n_{21}}{n_{2.}}\]
Standard Error:
\[SE_{RD} = \sqrt{\frac{p_1(1-p_1)}{n_{1.}} + \frac{p_2(1-p_2)}{n_{2.}}}\]
Z-statistik:
\[Z_{RD} = \frac{RD}{SE_{RD}}\]
Didapatkan
• Grup 1 → \[p_1 = \frac{50}{80} = 0.625\] • Grup 2 → \[p_2 = \frac{30}{80} = 0.375\]
Risk Difference:
\[RD = p_1 - p_2 = 0.625 - 0.375 = 0.25\]
Standard Error RD:
\[SE_{RD} = \sqrt{\frac{0.625(1-0.625)}{80} + \frac{0.375(1-0.375)}{80}}\] \[= \sqrt{\frac{0.234375}{80} + \frac{0.234375}{80}} = \sqrt{\frac{0.46875}{80}} \approx \sqrt{0.00586} \approx 0.0766\]
Z-statistik:
\[Z_{RD} = \frac{RD}{SE_{RD}} = \frac{0.25}{0.0766} \approx 3.26\]
Untuk statistik Relative Risk(RR):
• Rumus: \[RR = \frac{p_1}{p_2}\] • Standard Error (dari log RR): \[SE_{ln \ RR} = \sqrt{(\frac{1}{n_{11}} - \frac{1}{n_{1.}})+(\frac{1}{n_{21}} - \frac{1}{n_{2.}})}\] • Z-statistik: \[Z_{ln \ RR} = \frac{ln(RR)}{SE_{ln \ RR}}\] Didapatakan \[RR = \frac{p_1}{p_2} = \frac{0.625}{0.375} = \boxed{1.\overline{6}} \approx 1.67\] Standard Error log(RR): \[SE_{ln\, RR} = \sqrt{\left(\frac{1}{50} - \frac{1}{80}\right) + \left(\frac{1}{30} - \frac{1}{80}\right)}\] \[= \sqrt{(0.02 - 0.0125) + (0.0333 - 0.0125)} = \sqrt{0.0283} \approx \boxed{0.168}\] Z-statistik: \[Z_{ln\, RR} = \frac{ln(1.67)}{0.168} \approx \frac{0.511}{0.168} \approx \boxed{3.04}\] Untuk statistik Odds Ratio • Rumus: \[OR = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}}\] • Standard Error (dari log OR): \[SE_{ln\,OR} = \sqrt{\frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}}}\] • Z-statistik: \[Z_{ln\,OR} = \frac{ln(OR)}{SE_{ln\,OR}}\] Didapatkan \[OR = \frac{50 \times 50}{30 \times 30} = \frac{2500}{900} = 2.78\] Standard Error log(OR): \[SE_{ln \ OR} = \sqrt{\frac{1}{50} + \frac{1}{30} + \frac{1}{30} + \frac{1}{50}} = \sqrt{0.02 + 0.0333 + 0.0333 + 0.02} = \sqrt{0.1066} \approx 0.3265\] Z-statistik: \[Z_{ln \ OR} = \frac{ln(2.78)}{0.3265} \approx \frac{1.022}{0.3265} \approx 3.13\] Perhitungan dengan software R
# Input data
n11 <- 50 # Grup 1, Kejadian
n12 <- 30 # Grup 1, Tidak Kejadian
n21 <- 30 # Grup 2, Kejadian
n22 <- 50 # Grup 2, Tidak Kejadian
# Marginal total
n1. <- n11 + n12 # Total Grup 1
n2. <- n21 + n22 # Total Grup 2
# Risk Difference (RD)
p1 <- n11 / n1.
p2 <- n21 / n2.
rd <- p1 - p2
se_rd <- sqrt((p1 * (1 - p1) / n1.) + (p2 * (1 - p2) / n2.))
z_rd <- rd / se_rd
# Relative Risk (RR)
rr <- p1 / p2
se_ln_rr <- sqrt((1 / n11) - (1 / n1.) + (1 / n21) - (1 / n2.))
z_rr <- log(rr) / se_ln_rr
# Odds Ratio (OR)
or <- (n11 * n22) / (n12 * n21)
se_ln_or <- sqrt(1 / n11 + 1 / n12 + 1 / n21 + 1 / n22)
z_or <- log(or) / se_ln_or
# Output hasil
list(
Risk_Difference = rd,
SE_RD = se_rd,
Z_RD = z_rd,
Relative_Risk = rr,
SE_Log_RR = se_ln_rr,
Z_Log_RR = z_rr,
Odds_Ratio = or,
SE_Log_OR = se_ln_or,
Z_Log_OR = z_or
)
## $Risk_Difference
## [1] 0.25
##
## $SE_RD
## [1] 0.07654655
##
## $Z_RD
## [1] 3.265986
##
## $Relative_Risk
## [1] 1.666667
##
## $SE_Log_RR
## [1] 0.1683251
##
## $Z_Log_RR
## [1] 3.034756
##
## $Odds_Ratio
## [1] 2.777778
##
## $SE_Log_OR
## [1] 0.3265986
##
## $Z_Log_OR
## [1] 3.128155
Titik Kritis: Dengan α = 0.05, maka Ztabel= ±1,96
Kriteria Uji: Tolak H₀ apabila, Z hitung > |Ztabel|
Keputusan :
asosiasi_data <- data.frame(
Ukuran = c("Risk Difference (RD)", "Relative Risk (RR)", "Odds Ratio (OR)"),
Nilai = c(0.25, 1.67, 2.78),
Z_Statistik = c(3.26, 3.04, 3.13),
Signifikan = c("Ya", "Ya", "Ya")
)
print(asosiasi_data, row.names = FALSE)
## Ukuran Nilai Z_Statistik Signifikan
## Risk Difference (RD) 0.25 3.26 Ya
## Relative Risk (RR) 1.67 3.04 Ya
## Odds Ratio (OR) 2.78 3.13 Ya
Kesimpulan: 1. Terdapat perbedaan risiko absolut sebesar 25% antara kelompok sering berjalan dan jarang berjalan terhadap hipertensi. 2.Kelompok sering berjalan memiliki risiko 1.67 kali lebih besar dibanding kelompok 2. 3. Odds kejadian pada kelompok 1 adalah 2.78 kali dibanding kelompok 2.
Tujuan: Mengetahui apakah dua variabel kategori saling bebas (independen) atau tidak (berhubungan).
Hipotesis
- **H₀** : Kedua variabel **tidak saling berhubungan**
(independen).
- **H₁** : Kedua variabel **saling berhubungan** (tidak
independen)
Statistik uji: Chi Square \[\chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}}\]
Dengan \[E_{ij} = \frac{(total\:baris) \times (total\:kolom)}{n}\]
Didapatkan: \[E_{(Sering,Ya)} = \frac{100 \times 70}{200} = 35\] \[E_{(Sering,Tidak)} = \frac{100 \times 130}{200} = 65\] \[E_{(Jarang,Ya)} = \frac{100 \times 70}{200} = 35\] \[E_{(Jarang,Tidak)} = \frac{100 \times 130}{200} = 65\]
Nilai Chi-Square: \[\chi^2 = \frac{(20-35)^2}{35} + \frac{(80-65)^2}{65} + \frac{(50-35)^2}{35} + \frac{(50-65)^2}{65}\] \[ \chi^2 = \frac{225}{35} + \frac{225}{65} + \frac{225}{35} + \frac{225}{65} \] \[\chi^2 \approx 6.43 + 3.46 + 6.43 + 3.46 = 19.78\]
Perhitungan dengan software R
# Buat matriks data: baris = kebiasaan berjalan kaki (Sering, Jarang),
# kolom = kondisi hipertensi (Ya, Tidak)
data_matrix <- matrix(c(20, 80, 50, 50), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Ya", "Tidak")
rownames(data_matrix) <- c("Sering", "Jarang")
# Uji Chi-Square
chi_test <- chisq.test(data_matrix, correct = FALSE)
# Hasil
list(
Chi_Square = chi_test$statistic,
P_Value = chi_test$p.value,
Decision = ifelse(chi_test$p.value < 0.05, "Tolak H0 (Ada hubungan)", "Gagal Tolak H0 (Tidak ada hubungan)")
)
## $Chi_Square
## X-squared
## 19.78022
##
## $P_Value
## [1] 8.687712e-06
##
## $Decision
## [1] "Tolak H0 (Ada hubungan)"
Wilayah Kritis:
\[df = (2-1)(2-1) = 1\] \[X^2 tabel(α = 0.05, df = 1) = 3.841 \]
Kriteria Uji: Tolak H₀ apabila χ²Hitung > χ²tabel. Terima untuk selainnya.
Keputusan : Karena χ²hitung = 19.78 > 3.841, maka tolak H₀.
Kesimpulan : Ada hubungan yang signifikan antara kebiasaan berjalan kaki dan hipertensi.
Tabel kontingensi 3 arah digunakan untuk menganalisis hubungan antara
tiga variabel kategori secara bersamaan. Tabel ini memperluas tabel
kontingensi dua arah dengan menambahkan satu dimensi kategori
tambahan.
Contoh Kasus
Hipertensi atau tekanan darah tinggi merupakan salah satu
penyakit kronis yang banyak ditemukan pada orang dewasa. Gaya hidup,
khususnya aktivitas fisik seperti kebiasaan berjalan kaki, diduga
memiliki pengaruh terhadap kondisi hipertensi. Selain itu, faktor usia
juga dikenal sebagai salah satu determinan penting dalam kejadian
hipertensi.
Dalam analisis ini, kita ingin mengetahui apakah terdapat hubungan antara kebiasaan berjalan dan hipertensi, serta bagaimana pengaruh faktor umur terhadap hubungan tersebut. Oleh karena itu, digunakan pendekatan tabel kontingensi tiga arah untuk mengamati hubungan antara tiga variabel kategori:
Kebiasaan berjalan (rutin / tidak rutin),
Status hipertensi (hipertensi / tidak hipertensi), dan
Kelompok umur (dewasa muda / dewasa tua).
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
# Membuat data array
data_array <- array(
data = c(5, 35, 12, 28, # Dewasa Muda: Rutin, Tidak Rutin
15, 25, 30, 10), # Dewasa Tua: Rutin, Tidak Rutin
dim = c(2, 2, 2),
dimnames = list(
"Kebiasaan" = c("Rutin", "Tidak Rutin"),
"Hipertensi" = c("Hipertensi", "Tidak Hipertensi"),
"Umur" = c("Dewasa Muda", "Dewasa Tua")
)
)
marginal_total <- addmargins(apply(data_array, c(1,2), sum))
kable(marginal_total, "html", caption = "Tabel Marginal: Kebiasaan × Hipertensi (Gabungan Semua Umur)") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered"), full_width = F)
Hipertensi | Tidak Hipertensi | Sum | |
---|---|---|---|
Rutin | 20 | 42 | 62 |
Tidak Rutin | 60 | 38 | 98 |
Sum | 80 | 80 | 160 |
parsial_muda <- addmargins(data_array[,, "Dewasa Muda"])
kable(parsial_muda, "html", caption = "Tabel Parsial: Dewasa Muda (18–40 Tahun)") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed"), full_width = F, position = "center")
Hipertensi | Tidak Hipertensi | Sum | |
---|---|---|---|
Rutin | 5 | 12 | 17 |
Tidak Rutin | 35 | 28 | 63 |
Sum | 40 | 40 | 80 |
parsial_tua <- addmargins(data_array[,, "Dewasa Tua"])
kable(parsial_tua, "html", caption = "Tabel Parsial: Dewasa Tua (>40 Tahun)") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed"), full_width = F, position = "center")
Hipertensi | Tidak Hipertensi | Sum | |
---|---|---|---|
Rutin | 15 | 30 | 45 |
Tidak Rutin | 25 | 10 | 35 |
Sum | 40 | 40 | 80 |
Ukuran asosiasi digunakan untuk mengukur kuat dan arah hubungan antara dua variabel kategori. Dalam konteks tabel kontingensi 2x2, ukuran asosiasi paling umum adalah:
Risk Ratio (RR) atau Relative Risk
Risk Difference (RD)
Odds Ratio (OR)
Untuk tabel kontingensi 3 arah (misalnya A × B × C), maka kita bisa menghitung ukuran asosiasi parsial yakni antara A dan B dengan mengendalikan (mengstratifikasi) variabel C dan juga ukuran asosiasi marginal.
hitung_asosiasi <- function(mat) {
a <- mat[1,1] # Rutin & Hipertensi
b <- mat[1,2] # Rutin & Tidak Hipertensi
c <- mat[2,1] # Tidak Rutin & Hipertensi
d <- mat[2,2] # Tidak Rutin & Tidak Hipertensi
rr <- (a / (a + b)) / (c / (c + d))
rd <- (a / (a + b)) - (c / (c + d))
or <- (a * d) / (b * c)
data.frame(
`Risk Ratio (RR)` = round(rr, 2),
`Risk Difference (RD)` = round(rd, 2),
`Odds Ratio (OR)` = round(or, 2)
)
}
Ukuran Asosiasi Parsial
asosiasi_muda <- hitung_asosiasi(data_array[,, "Dewasa Muda"])
kable(asosiasi_muda, caption = "Ukuran Asosiasi - Dewasa Muda") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered"))
Risk.Ratio..RR. | Risk.Difference..RD. | Odds.Ratio..OR. |
---|---|---|
0.53 | -0.26 | 0.33 |
asosiasi_tua <- hitung_asosiasi(data_array[,, "Dewasa Tua"])
kable(asosiasi_tua, caption = "Ukuran Asosiasi - Dewasa Tua") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered"))
Risk.Ratio..RR. | Risk.Difference..RD. | Odds.Ratio..OR. |
---|---|---|
0.47 | -0.38 | 0.2 |
Interpretasi:
Dewasa Muda (18-40 Tahun)
Risk Ratio (RR) = 0.53
Peluang hipertensi pada kelompok dengan kebiasaan rutin adalah 0.53 kali
peluang hipertensi pada kelompok yang tidak rutin. Ini menunjukkan bahwa
kebiasaan rutin berhubungan dengan penurunan risiko hipertensi sebesar
47% pada kelompok dewasa muda.
Risk Difference (RD) = -0.26
Selisih risiko hipertensi antara kelompok dengan kebiasaan rutin dan
tidak rutin adalah -26%. Artinya, terdapat penurunan absolut kejadian
hipertensi sebesar 26% pada kelompok dengan kebiasaan rutin dibandingkan
yang tidak.
Odds Ratio (OR) = 0.33
Peluang hipertensi pada kelompok dengan kebiasaan rutin adalah seper
tiga dari peluang hipertensi pada kelompok yang tidak rutin, menandakan
hubungan protektif yang cukup kuat di antara keduanya.
Dewasa Tua (>40 Tahun)
Risk Ratio (RR) = 0.47
Pada kelompok dewasa tua, kebiasaan rutin dikaitkan dengan penurunan
risiko hipertensi hingga 53% dibandingkan kelompok yang tidak
rutin.
Risk Difference (RD) = -0.38
Penurunan absolut risiko hipertensi pada kelompok kebiasaan rutin adalah
sebesar 38%.
Odds Ratio (OR) = 0.20
Odds hipertensi pada kelompok dengan kebiasaan rutin hanya 20% dari odds
pada kelompok tidak rutin, menunjukkan hubungan protektif yang lebih
kuat daripada pada kelompok dewasa muda.
Kesimpulan Umum
Pada kedua kelompok umur, kebiasaan rutin berperan sebagai faktor protektif terhadap hipertensi. Efek protektif ini tampak sedikit lebih kuat pada kelompok dewasa tua dibandingkan dewasa muda, baik secara relatif (RR dan OR) maupun absolut (RD). Hal ini menunjukkan pentingnya menjaga kebiasaan sehat khususnya pada kelompok yang lebih tua sebagai upaya pencegahan hipertensi.
Ukuran Asosiasi Marginal
marginal_matrix <- apply(data_array, c(1,2), sum)
asosiasi_marginal <- hitung_asosiasi(marginal_matrix)
kable(asosiasi_marginal, caption = "Ukuran Asosiasi - Marginal (Gabungan Semua Umur)") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered"))
Risk.Ratio..RR. | Risk.Difference..RD. | Odds.Ratio..OR. |
---|---|---|
0.53 | -0.29 | 0.3 |
Interpretasi Ukuran Asosiasi Marginal (Gabungan Semua Umur)
Risk Ratio (RR) = 0.53
Peluang hipertensi pada kelompok dengan kebiasaan rutin adalah 0.53 kali
peluang hipertensi pada kelompok yang tidak rutin. Ini menunjukkan
kebiasaan rutin terkait dengan penurunan risiko hipertensi sebesar 47%
secara keseluruhan, tanpa membedakan kelompok umur.
Risk Difference (RD) = -0.29
Perbedaan risiko absolut hipertensi antara kelompok kebiasaan rutin dan
tidak rutin adalah sebesar 29%, yang berarti penurunan kejadian
hipertensi absolut sebesar 29% pada mereka yang rutin dibandingkan yang
tidak.
Odds Ratio (OR) = 0.30
Peluang hipertensi pada kelompok dengan kebiasaan rutin sekitar 30% dari
peluang pada kelompok yang tidak rutin, menunjukkan hubungan protektif
yang kuat secara umum di seluruh kelompok umur.
Kesimpulan
Secara keseluruhan, kebiasaan rutin memiliki efek protektif yang signifikan terhadap hipertensi pada populasi gabungan tanpa memandang kelompok umur. Ini memperkuat pentingnya kebiasaan rutin dalam pencegahan hipertensi di berbagai kelompok umur.
Dalam konteks tabel kontingensi 3 arah (misalnya variabel A, B, dan C), conditional independence menguji apakah dua variabel A dan B independen satu sama lain setelah dikontrol oleh variabel ketiga C.
Kita ingin menguji apakah Kebiasaan Berjalan dan Hipertensi independen, setelah dikendalikan oleh umur.
Hipotesis:
H₀: Tidak terdapat hubungan antara kebiasaan berjalan dan hipertensi, setelah dikontrol oleh umur tertentu.
H₁: Terdapat hubungan antara kebiasaan berjalan dan hipertensi, setelah dikontrol oleh umur tertentu.
Taraf Signifikansi: α = 0.05
Statistik Uji: Chi-Square
Perhitugan dengan Software R
# Uji Chi-Square untuk masing-masing strata usia
chisq.test(data_array[,, "Dewasa Muda"]) # untuk kontrol umur = dewasa muda
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data_array[, , "Dewasa Muda"]
## X-squared = 2.6891, df = 1, p-value = 0.101
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data_array[, , "Dewasa Tua"]
## X-squared = 9.9556, df = 1, p-value = 0.001604
Kriteria Uji : Tolak H₀ apabila p-value < 0.05. Terima selainnya.
Keputusan :
Kesimpulan: Terdapat hubungan antara kebiasaan
berjalan dan hipertensi atau hubungan keduanya
tidaklah kondisional independen., setelah dikontrol oleh umur
tertentu.
Dalam analisis data kategorik dua variabel dengan satu variabel pengganggu (strata), penting untuk memahami bagaimana hubungan antar variabel utama dapat berbeda pada tiap strata. Oleh karena itu, langkah pertama yang dilakukan adalah memisahkan data ke dalam tabel kontingensi 2×2 berdasarkan strata, seperti kelompok usia atau jenis kelamin. Setelah itu, dilakukan Uji Homogenitas Odds Ratio menggunakan Statistik Breslow-Day untuk menguji apakah odds ratio (OR) antar strata bersifat homogen (sama) atau heterogen (berbeda).
Jika odds ratio antar strata terbukti homogen, maka analisis dapat dilanjutkan dengan Uji Mantel-Haenszel, yang digunakan untuk menguji hubungan antara dua variabel utama (misalnya, kebiasaan olahraga dan hipertensi) sambil mengendalikan efek variabel pengganggu (strata). Uji ini memberikan estimasi gabungan odds ratio yang lebih akurat dan sah karena telah mempertimbangkan struktur stratifikasi dalam data. Namun, apabila hasil uji Breslow-Day menunjukkan bahwa odds ratio antar strata berbeda secara signifikan (tidak homogen), maka penggunaan uji Mantel-Haenszel tidak disarankan karena penggabungan data antar strata bisa menyesatkan dan menghasilkan kesimpulan yang tidak valid.
Uji Homogenitas Odds Ratio (Menggunakan Statistik Breslow-Day)
Uji ini digunakan untuk mengevaluasi apakah hubungan antara dua variabel (misalnya: kebiasaan dan hipertensi) konsisten di seluruh strata dari variabel ketiga (misalnya: kelompok umur). Uji ini penting untuk memastikan asumsi homogenitas odds ratio sebelum menggunakan uji Cochran-Mantel-Haenszel (CMH).
Langkah-langkah Pengerjaan:
Estimasi Rasio Odds Gabungan (Mantel-Haenszel OR)
Langkah pertama adalah menghitung estimasi odds ratio gabungan (\(\widehat{OR}_{MH}\)) dari seluruh strata dengan rumus: \[ \widehat{OR}_{MH} = \frac{\sum_{j=1}^{K} \frac{a_j d_j}{n_j}}{\sum_{j=1}^{K} \frac{b_j c_j}{n_j}} \] Keterangan:
\(a_j\): jumlah kasus terpapar di strata ke-\(j\)
\(b_j\): jumlah kontrol terpapar di strata ke-\(j\)
\(c_j\): jumlah kasus tidak terpapar di strata ke-\(j\)
\(d_j\): jumlah kontrol tidak terpapar di strata ke-\(j\)
\(n_j = a_j + b_j + c_j + d_j\): total pengamatan di strata ke-\(j\)
\(K\): jumlah strata
Setelah \(\widehat{OR}_{MH}\) diperoleh, kita menghitung nilai ekspektasi untuk sel \(a\) dalam setiap strata (\(\tilde{a}_j\)) berdasarkan asumsi odds ratio gabungan tersebut benar. Caranya dengan menyelesaikan persamaan kuadrat berikut: \[-m_{1j}n_{1j}\widehat{OR}_{MH} + (n_{2j} – m_{1j} + \widehat{OR}_{MH}(n_{1j} + m_{1j}))\tilde{a}_j + (1 – \widehat{OR}_{MH})\tilde{a}_j^2 = \] Keterangan:
• \(m_{1j}\): total subjek terpapar pada strata ke-\(j\) \((a_j + b_j)\)
• \(m_{2j}\): total subjek tidak terpapar pada strata ke-\(j\) \((c_j + d_j)\)
•\(n_{1j}\): total kasus pada strata ke-\(j\) \((a_j + c_j)\)
•\(n_{2j}\): total non-kasus pada strata ke-\(j\) \((b_j + d_j)\)
Dari duasolusi kuadrat, hanya solusi positif yang berada dalam batas realistis data, yaitu 0 < \(\tilde{a}_j\) ≤ min (\(n_{1j}\), \(m_{1j}\))
Nilai \(\tilde{a}_j\) ini mewakili jumlah kasus terpapar yang diharapkan jika odds ratio homogen benar.
\(\tilde{b}j = m{1j} - \tilde{a}_j\)
\(\tilde{c}j = n{1j} - \tilde{a}_j\)
\(\tilde{d}j = m{2j} - \tilde{c}_j\)
Varians ini merefleksikan seberapa besar penyimpangan yang bisa diterima dari nilai ekspektasi \(\tilde{a}_j\).
Menghitung Statistik Uji Breslow-Day
Gunakan rumus berikut untuk menghitung nilai statistik uji utama: \[X_{HBD}^{2} = \sum_{j=1}^{K} \frac{(a_{j} - \tilde{a}_{j})^{2}}{Var(a_{j}|\widehat{OR}_{MH})}\] Semakin besar nilai ini, semakin besar ketidaksesuaian antara data yang diamati dan ekspektasi jika odds ratio homogen.
Koreksi Tarone Karena statistik Breslow-Day bisa sedikit bias pada ukuran sampel kecil, maka koreksi Tarone bisa diterapkan: \[X_{HBDT}^2 = X_{HBD}^2 - \frac{(\sum_{j=1}^{K}(a_j - \tilde{a}_j))^2}{\sum_{j=1}^{K}Var(a_j|\widehat{OR}_{MH})}\]
Koreksi ini mengurangi potensi kesalahan Type I, terutama saat penyimpangan kecil secara sistematik muncul di seluruh strata.
Distribusi Statistik Baik \(X^2_{HBD}\) maupun \(X^2_{HBDT}\) mengikuti distribusi chi-square dengan derajat bebas sebanyak \((K - 1)\).
Penerapan Dalam Contoh Kasus
Data
Tabel Parsial Dewasa Muda (18-40 Tahun)
Kebiasaan | Hipertensi | Tidak Hipertensi | Jumlah |
---|---|---|---|
Rutin | 5 | 12 | 17 |
Tidak Rutin | 35 | 28 | 63 |
Jumlah | 40 | 40 | 80 |
Tabel Parsial Dewasa Tua (> 40 Tahun)
Kebiasaan | Hipertensi | Tidak Hipertensi | Jumlah |
---|---|---|---|
Rutin | 15 | 30 | 45 |
Tidak Rutin | 25 | 10 | 35 |
Jumlah | 40 | 40 | 80 |
Hipotesis
\(H_0: OR_1 = OR_2 = \dots =
OR_K\)
(Odds ratio pada semua strata adalah sama / homogen)
\(H_1: \exists j,k \text{ sehingga }
OR_j \neq OR_k\)
(Ada minimal dua strata yang memiliki odds ratio berbeda / tidak
homogen)
Taraf signifikansi: \(\alpha = 0.05\) (5%)
Statistik Uji 1. Perhitungan Estimasi Rasio Odds Gabungan (Mantel-Haenszel OR)
Strata 1 (Dewasa Muda):
Hitung:
\[ \frac{a_1 d_1}{n_1} = \frac{5 \times 28}{80} = \frac{140}{80} = 1.75 \]
\[ \frac{b_1 c_1}{n_1} = \frac{12 \times 35}{80} = \frac{420}{80} = 5.25 \]
Strata 2 (Dewasa Tua):
Hitung:
\[ \frac{a_2 d_2}{n_2} = \frac{15 \times 10}{80} = \frac{150}{80} = 1.875 \]
\[ \frac{b_2 c_2}{n_2} = \frac{30 \times 25}{80} = \frac{750}{80} = 9.375 \]
Rasio Odds Gabungan (Mantel-Haenszel OR):
\[ \widehat{OR}_{MH} = \frac{1.75 + 1.875}{5.25 + 9.375} = \frac{3.625}{14.625} \approx 0.248 \]
2. Menghitung Nilai Ekspektasi \(\tilde{a}_j\)
Gunakan persamaan kuadrat:
\[ -(m_{1j} n_{1j}) \widehat{OR}_{MH} + (n_{2j} - m_{1j} + \widehat{OR}_{MH}(n_{1j} + m_{1j})) \tilde{a}_j + (1 - \widehat{OR}_{MH}) \tilde{a}_j^2 = 0 \]
Untuk Strata 1:
Substitusi:
\[ -(17)(40)(0.248) + (40 - 17 + 0.248(40 + 17)) \tilde{a}_1 + (1 - 0.248) \tilde{a}_1^2 = 0 \]
Hitung koefisien:
Persamaan:
\[ 0.752 \tilde{a}_1^2 + 37.136 \tilde{a}_1 - 168.32 = 0 \]
Gunakan rumus kuadrat:
\[ \tilde{a}_1 = \frac{-B \pm \sqrt{B^2 - 4AC}}{2A} \]
Hitung diskriminan:
\[ \sqrt{37.136^2 + 4 \times 0.752 \times 168.32} \approx \sqrt{1379.1 + 506.3} = \sqrt{1885.4} \approx 43.43 \]
Solusi positif:
\[ \tilde{a}_1 = \frac{-37.136 + 43.43}{2 \times 0.752} = \frac{6.294}{1.504} \approx 4.19 \]
Untuk Strata 2:
Persamaan:
\[ -(45)(40)(0.248) + (40 - 45 + 0.248 (40 + 45)) \tilde{a}_2 + (1 - 0.248) \tilde{a}_2^2 = 0 \]
Hitung:
Persamaan kuadrat:
\[ 0.752 \tilde{a}_2^2 + 16.08 \tilde{a}_2 - 448.8 = 0 \]
Diskriminan:
\[ \sqrt{16.08^2 + 4 \times 0.752 \times 448.8} = \sqrt{258.6 + 1350.2} = \sqrt{1608.8} \approx 40.1 \]
Solusi positif:
\[ \tilde{a}_2 = \frac{-16.08 + 40.1}{2 \times 0.752} = \frac{24.02}{1.504} \approx 15.97 \]
3. Hitung Varians \(Var(a_j | \widehat{OR}_{MH})\)
Rumus:
\[ Var(a_j | \widehat{OR}_{MH}) = \left( \frac{1}{\tilde{a}_j} + \frac{1}{\tilde{b}_j} + \frac{1}{\tilde{c}_j} + \frac{1}{\tilde{d}_j} \right)^{-1} \]
Untuk Strata 1:
Hitung varians:
\[ Var_1 = \left( \frac{1}{4.19} + \frac{1}{12.81} + \frac{1}{35.81} + \frac{1}{27.19} \right)^{-1} \approx (0.239 + 0.078 + 0.028 + 0.037)^{-1} = 0.382^{-1} \approx 2.62 \]
Untuk Strata 2:
Hitung varians:
\[ Var_2 = \left( \frac{1}{15.97} + \frac{1}{29.03} + \frac{1}{24.03} + \frac{1}{10.97} \right)^{-1} \approx (0.063 + 0.034 + 0.042 + 0.091)^{-1} = 0.23^{-1} \approx 4.35 \]
4. Hitung Statistik Uji Breslow-Day
Statistik:
\[ X_{BD}^2 = \sum \frac{(a_j - \tilde{a}_j)^2}{Var(a_j | \widehat{OR}_{MH})} \]
Hitung:
\[ X_{BD}^2 = \frac{(5 - 4.19)^2}{2.62} + \frac{(15 - 15.97)^2}{4.35} = \frac{0.6561}{2.62} + \frac{0.9409}{4.35} \approx 0.25 + 0.216 = 0.466 \]
Titik Kritis dan Keputusan
Karena \(X^2_{BD} = 0.466 < 3.841\), maka gagal menolak \(H_0\).
Interpretasi Hasil
Tidak terdapat bukti yang cukup pada tingkat signifikansi 5% untuk menolak hipotesis bahwa odds ratio antar strata umur homogen. Dengan kata lain, odds ratio dapat dianggap sama di kedua strata umur.
Perhitungan dengan Software R
## Registered S3 method overwritten by 'DescTools':
## method from
## reorder.factor gdata
##
## Breslow-Day test on Homogeneity of Odds Ratios
##
## data: data_array
## X-squared = 0.44566, df = 1, p-value = 0.5044
Uji Cochran-Mantel
Tujuan Uji CMH
Konsep Dasar
Hipotesis
\(H_0\): Tidak ada asosiasi antara dua variabel kategori dalam setiap strata, atau odds ratio strata sama dengan 1.
\(H_1\): Minimal ada satu strata dengan asosiasi antara dua variabel kategori, odds ratio strata tidak sama dengan 1.
Statistik Uji CMH
Statistik CMH dirumuskan sebagai
\[ CMH = \frac{\left[\sum_k (n_{11k} - \mu_{11k}) \right]^2}{\sum_k \operatorname{var}(n_{11k})} \]
dengan
Distribusi dan Keputusan
Kelebihan Uji CMH
Langkah-langkah Perhitungan Manual
1. Tentukan Nilai \(n_{11k}\), Marginal Baris dan Kolom, dan Total
Strata | \(n _ {11k}\) | \(n _ {1.k}\) | \(n _ {.1k}\) | \(n _ {2.k}\) | \(n _ {.2k}\) | \(n _ {..k}\) |
---|---|---|---|---|---|---|
Dewasa Muda | 5 | 17 | 40 | 63 | 40 | 80 |
Dewasa Tua | 15 | 45 | 40 | 35 | 40 | 80 |
2. Hitung Ekspektasi \(\mu_{11k}\) untuk tiap strata
\[ \mu_{11k} = \frac{n_{1.k} \times n_{.1k}}{n_{..k}} \]
\[ \begin{cases} \mu_{11,1} = \frac{17 \times 40}{80} = 8.5\\[6pt] \mu_{11,2} = \frac{45 \times 40}{80} = 22.5 \end{cases} \]
3. Hitung Varians \(\operatorname{var}(n_{11k})\)
\[ \operatorname{var}(n_{11k}) = \frac{n_{1.k} \times n_{2.k} \times n_{.1k} \times n_{.2k}}{n_{..k}^2 (n_{..k} - 1)} \]
\[ \begin{cases} \operatorname{var}(n_{11,1}) = \frac{17 \times 63 \times 40 \times 40}{80^2 \times 79} \approx 3.40 \\[6pt] \operatorname{var}(n_{11,2}) = \frac{45 \times 35 \times 40 \times 40}{80^2 \times 79} \approx 4.99 \end{cases} \]
4. Hitung nilai \((n_{11k} - \mu_{11k})\) dan kuadratkan jumlahnya
\[ \begin{cases} 5 - 8.5 = -3.5 \\[6pt] 15 - 22.5 = -7.5 \end{cases} \]
Jumlah:
\[ -3.5 + (-7.5) = -11 \]
Kuadratkan:
\[ (-11)^2 = 121 \]
5. Hitung jumlah varians
\[ 3.40 + 4.99 = 8.39 \]
6. Hitung Statistik CMH
\[ CMH = \frac{121}{8.39} \approx 14.42 \]
7. Keputusan Uji
Kesimpulan
Hasil uji CMH menunjukkan ada hubungan signifikan antara kebiasaan rutin dan hipertensi meskipun setelah mengontrol strata umur. Oleh karena itu, kebiasaan rutin berpengaruh terhadap kejadian hipertensi di kelompok umur yang berbeda.
Perhitungan dengan Software R
## Loading required package: vcd
## Loading required package: grid
## Loading required package: gnm
##
## Attaching package: 'vcdExtra'
## The following object is masked from 'package:dplyr':
##
## summarise
##
## Mantel-Haenszel chi-squared test without continuity correction
##
## data: data_array
## Mantel-Haenszel X-squared = 14.45, df = 1, p-value = 0.0001439
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 0.1184442 0.5186932
## sample estimates:
## common odds ratio
## 0.2478632
Generalized Linear Model (GLM) adalah perluasan dari model regresi linear klasik yang memungkinkan penanganan berbagai jenis data dan hubungan yang lebih kompleks antara variabel. Model regresi linear tradisional mengasumsikan dua hal penting: variabel respons (dependent variable) terdistribusi normal, dan hubungan antara variabel prediktor dan respons bersifat linear secara langsung. Namun, dalam banyak kasus nyata, asumsi-asumsi ini tidak terpenuhi.
Sebagai contoh:
Variabel respons bisa berupa jumlah kejadian (data count), yang biasanya tidak berdistribusi normal, melainkan berdistribusi Poisson. Variabel respons bisa berupa kategori (kualitatif), misalnya keberhasilan atau kegagalan, yang mengikuti distribusi binomial. Hubungan antara variabel bebas dan variabel respons terkadang tidak linear secara langsung, melainkan perlu transformasi tertentu agar model dapat merepresentasikannya dengan baik. Untuk mengatasi keterbatasan tersebut, GLM menyediakan framework yang fleksibel dan kuat untuk membangun model statistik yang sesuai dengan berbagai jenis data dan pola hubungan. GLM menyatukan konsep statistik dasar seperti distribusi probabilitas dari keluarga eksponensial, fungsi link, dan linear predictor dalam satu kerangka yang koheren.
Melalui GLM, kita dapat:
Memodelkan variabel respons yang beragam seperti data biner, count, proporsi, dan data kontinu yang tidak normal. Menggunakan fungsi link untuk menghubungkan mean dari variabel respons dengan kombinasi linier dari prediktor, sehingga memungkinkan pemodelan hubungan nonlinier secara langsung dalam domain parameter. Melakukan estimasi parameter dan inferensi statistik dengan pendekatan maximum likelihood dan metode lain yang relevan. Penggunaan GLM sangat luas, mulai dari bidang epidemiologi, biostatistik, ilmu sosial, ekonomi, sampai ilmu komputer. Model ini memungkinkan peneliti dan praktisi melakukan analisis yang tepat terhadap data yang kompleks dan heterogen.
Generalized Linear Model (GLM) adalah framework umum yang mencakup berbagai model regresi yang sesuai dengan tipe data dan distribusi berbeda. Pemilihan jenis GLM bergantung pada sifat variabel respons dan hubungan yang ingin dimodelkan.
Berikut adalah jenis-jenis GLM yang paling umum digunakan:
Fungsi link dalam konteks generalized linear
model (GLM), termasuk regresi logistik, adalah fungsi yang
menghubungkan nilai rata-rata variabel respon dengan kombinasi linear
dari prediktor.
Dalam GLM, kita tidak langsung memodelkan nilai rata-rata \(\mu = E(Y)\) sebagai fungsi linear dari
variabel prediktor \(X\). Melainkan
kita memodelkan transformasi \(\mu\) melalui fungsi link agar hasilnya
berbentuk garis linear, yaitu:
\[
g(\mu) = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots
\]
Model | Distribusi | Fungsi Link | Bentuk Fungsi Link \(g(\mu)\) |
---|---|---|---|
Regresi Linier | Normal | Identitas | \(g(\mu) = \mu\) |
Regresi Logistik | Binomial | Logit | \(g(p ) = \log \frac{p}{1-p}\) |
Regresi Poisson | Poisson | Log | \(g(\mu) = \log \mu\) |
Regresi Probit | Binomial | Probit | \(g(p) = \Phi^{-1}(p)\) (invers CDF normal) |
Distribusi exponential family adalah kelas distribusi probabilitas yang memiliki bentuk matematis tertentu. Distribusi ini sangat penting dalam Generalized Linear Models (GLM) karena memungkinkan pemodelan berbagai tipe data dengan pendekatan yang seragam dan kompak.
Generalized Linear Model dibangun dengan asumsi:
Definisi Distribusi Exponential Family
Sebuah variabel acak \(Y\) dikatakan mengikuti distribusi dari exponential family jika fungsi densitas (atau fungsi massa probabilitas) dapat dituliskan dalam bentuk:
\[ f_Y(y; \theta, \phi) = \exp \left( \frac{y \theta - b(\theta)}{a(\phi)} + c(y, \phi) \right) \]
di mana:
- \(\theta\) adalah parameter
natural (natural parameter), berhubungan dengan rata-rata
distribusi.
- \(\phi\) adalah parameter
dispersi (dispersion parameter).
- \(a(\cdot)\), \(b(\cdot)\), dan \(c(\cdot)\) adalah fungsi yang bergantung
pada distribusi tertentu.
Komponen Utama
Koneksi ke Mean dan Varians
Mean atau rata-rata \(\mu = E(Y)\) dan varians \(Var(Y)\) dapat dihitung melalui fungsi \(b(\theta)\):
\[ \mu = b'(\theta) \quad \text{dan} \quad Var(Y) = a(\phi) b''(\theta) \]
Dimana \(b'(\theta)\) dan \(b''(\theta)\) adalah turunan pertama dan kedua fungsi \(b(\theta)\).
Regresi logistik adalah metode penting dalam statistik dan machine learning yang digunakan untuk memodelkan hubungan antara satu atau lebih variabel independen dengan variabel respons biner (dua kelas). Berbeda dengan regresi linear yang memprediksi nilai kontinu, regresi logistik memprediksi probabilitas suatu kejadian dengan rentang nilai antara 0 dan 1.
Pengertian
Regresi logistik mengkombinasikan nilai input secara linear dengan koefisien (bobot) untuk menghasilkan prediksi awal. Karena targetnya adalah nilai biner (0 atau 1), fungsi aktivasi sigmoid digunakan untuk mengubah prediksi tersebut menjadi probabilitas yang berada di dalam rentang 0 hingga 1.
Fungsi sigmoid didefinisikan sebagai:
\[ \sigma(z) = \frac{1}{1 + e^{-z}} \]
dengan
\[ z = \beta_0 + \beta_1 x_1 + \cdots + \beta_p x_p \]
dimana \(x_1, \ldots, x_p\) adalah variabel prediktor dan \(\beta_0, \ldots, \beta_p\) adalah koefisien regresi.
Kegunaan Regresi Logistik
Regresi logistik digunakan untuk klasifikasi biner, di mana variabel target hanya memiliki dua kemungkinan nilai, seperti:
Contoh Penerapan Regresi Logistik
Keunggulan Regresi Logistik
Persamaan Regresi Logistik
Model memetakan input menjadi probabilitas menggunakan fungsi sigmoid:
\[ p = P(Y=1|X) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 x_1 + \cdots + \beta_p x_p)}} \]
atau
Fungsi sigmoid dirumuskan sebagai:
\[ f(x) = \frac{1}{1 + e^{-x}} \]
Di mana:
Persamaan log-odds (logit):
\[ \log \frac{p}{1-p} = \beta_0 + \beta_1 x_1 + \cdots + \beta_p x_p \]
Kesimpulan
Regresi logistik adalah teknik analisis statistik yang efektif dan populer untuk masalah klasifikasi biner. Model ini memberikan probabilitas yang mudah diinterpretasikan dan efisien secara komputasi.
Estimasi parameter \(\beta_0, \beta_1, \ldots, \beta_p\) dalam model regresi logistik berbeda dengan regresi linear biasa karena fungsi link yang digunakan adalah fungsi logit (log odds), yang bersifat non-linear.
Metode Maximum Likelihood Estimation (MLE)
Parameter regresi logistik diestimasi menggunakan metode
Maximum Likelihood Estimation (MLE).
MLE mencari nilai parameter \(\beta\)
yang memaksimalkan fungsi likelihood, yaitu
probabilitas mengamati data yang sebenarnya dengan model yang
diberikan.
Fungsi Likelihood
Misalkan dataset terdiri dari \(n\) observasi \((x_i, y_i)\) dengan \(y_i \in \{0,1\}\).
Probabilitas prediksi untuk observasi ke-\(i\):
\[ p_i = P(Y=1|x_i) = \frac{e^{\eta_i}}{1 + e^{\eta_i}} \quad \text{dengan} \quad \eta_i = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} \]
Likelihood data \(L(\beta)\) adalah:
\[ L(\beta) = \prod_{i=1}^n p_i^{y_i} (1 - p_i)^{1 - y_i} \]
Fungsi Log-Likelihood
Untuk mempermudah optimasi, digunakan fungsi log-likelihood:
\[ \ell(\beta) = \log L(\beta) = \sum_{i=1}^n \Big( y_i \log p_i + (1 - y_i) \log (1 - p_i) \Big) \]
MLE bertujuan untuk menemukan \(\hat{\beta}\) yang memaksimalkan \(\ell(\beta)\).
Cara Estimasi
glm()
di R dengan
family binomial.Interpretasi
Contoh sederhana estimasi parameter dengan R
# Data simulasi
set.seed(123)
n <- 100
x <- rnorm(n)
# Probabilitas logit dengan beta0= -1, beta1=2
p <- 1 / (1 + exp(-(-1 + 2 * x)))
y <- rbinom(n, 1, p)
# Estimasi model regresi logistik
model <- glm(y ~ x, family = binomial)
# Melihat hasil estimasi
summary(model)
##
## Call:
## glm(formula = y ~ x, family = binomial)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.9961 0.2887 -3.451 0.000559 ***
## x 2.0262 0.4205 4.819 1.44e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 131.79 on 99 degrees of freedom
## Residual deviance: 90.54 on 98 degrees of freedom
## AIC: 94.54
##
## Number of Fisher Scoring iterations: 5
Prediksi Jenis Transmisi Mobil (Automatic vs Manual)
Kasus ini menggunakan dataset mtcars, sebuah dataset klasik dalam analisis regresi yang berisi data teknis dan performa berbagai mobil.
Salah satu variabel penting di dataset ini adalah am
,
yang merupakan variabel kategori (faktor) yang menunjukkan jenis
transmisi mobil dengan nilai:
Tujuan utama analisis adalah untuk memodelkan dan memprediksi kemungkinan sebuah mobil menggunakan transmisi manual berdasarkan variabel prediktor teknis, khususnya dua variabel:
mpg
(miles per gallon): Mengindikasikan tingkat
efisiensi bahan bakar mobil, semakin besar berarti mobil lebih
irit.hp
(horsepower): Menunjukkan daya atau tenaga mesin
mobil.Analisis menggunakan regresi logistik karena
variabel target (am
) bersifat kategorikal biner (manual
atau otomatis).
Melalui model ini, kita ingin mengetahui seberapa besar pengaruh
mpg
dan hp
terhadap kemungkinan sebuah mobil
memakai transmisi manual, serta mengevaluasi seberapa akurat model
tersebut memperkirakan jenis transmisi berdasarkan karakteristik
mobil.
# Load data
data(mtcars)
df <- mtcars
df$am <- factor(df$am, labels = c("Automatic", "Manual"))
# Tampilkan ringkasan data
summary(df[, c("am", "mpg", "hp")])
## am mpg hp
## Automatic:19 Min. :10.40 Min. : 52.0
## Manual :13 1st Qu.:15.43 1st Qu.: 96.5
## Median :19.20 Median :123.0
## Mean :20.09 Mean :146.7
## 3rd Qu.:22.80 3rd Qu.:180.0
## Max. :33.90 Max. :335.0
# Fit model regresi logistik
model_real <- glm(am ~ mpg + hp, data = df, family = binomial)
summary(model_real)
##
## Call:
## glm(formula = am ~ mpg + hp, family = binomial, data = df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -33.60517 15.07672 -2.229 0.0258 *
## mpg 1.25961 0.56747 2.220 0.0264 *
## hp 0.05504 0.02692 2.045 0.0409 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 43.230 on 31 degrees of freedom
## Residual deviance: 19.233 on 29 degrees of freedom
## AIC: 25.233
##
## Number of Fisher Scoring iterations: 7
## (Intercept) mpg hp
## 2.543664e-15 3.524063e+00 1.056588e+00
# Prediksi probabilitas dan kelas
df$prob <- predict(model_real, type = "response")
df$pred_class <- ifelse(df$prob > 0.5, "Manual", "Automatic")
# Visualisasi prediksi dan probabilitas
if (!requireNamespace("ggplot2", quietly = TRUE))
install.packages("ggplot2")
library(ggplot2)
mpg_seq <- seq(min(df$mpg), max(df$mpg), length.out = 100)
hp_seq <- seq(min(df$hp), max(df$hp), length.out = 100)
grid <- expand.grid(mpg = mpg_seq, hp = hp_seq)
grid$prob <- predict(model_real, newdata = grid, type = "response")
ggplot() +
geom_tile(data = grid, aes(x = mpg, y = hp, fill = prob), alpha = 0.3) +
geom_point(data = df, aes(x = mpg, y = hp, color = pred_class, shape = am), size = 3) +
scale_fill_gradient(low = "blue", high = "red", name = "Prob Manual") +
labs(title = "Prediksi dan Probabilitas Transmisi Manual pada Mobil",
x = "Miles per Galon (mpg)",
y = "Tenaga Kuda (hp)",
color = "Prediksi",
shape = "Fakta") +
theme_minimal() +
theme(legend.position = "right")
# Evaluasi dengan ROC dan AUC
if (!requireNamespace("pROC", quietly = TRUE))
install.packages("pROC")
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following object is masked from 'package:gmodels':
##
## ci
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
## Setting direction: controls > cases
## AUC: 0.931
plot(roc_obj, main = "ROC Curve untuk Model Prediksi Transmisi Mobil")
abline(a = 0, b = 1, col = "red", lty = 2)
legend("bottomright", legend = paste("AUC =", round(auc_value, 3)), col = "black", lwd = 2)
## Actual
## Predicted Automatic Manual
## Automatic 16 3
## Manual 3 10
Interpretasi Hasil Model Regresi Logistik
Model regresi logistik yang dipasang untuk memprediksi jenis
transmisi mobil (manual
atau automatic
)
berdasarkan variabel mpg
(miles per gallon) dan
hp
(horsepower) memberikan hasil sebagai berikut.
Koefisien dan Signifikansi
Nilai estimasi koefisien pada model adalah:
mpg
: 1.26 (p = 0.0264),hp
: 0.055 (p = 0.0409).Ketiga koefisien tersebut memiliki nilai p kurang dari 0.05, sehingga
semua variabel signifikan secara statistik pada tingkat kepercayaan 95%.
Artinya, terdapat bukti yang cukup untuk menyatakan bahwa
mpg
dan hp
berpengaruh signifikan terhadap
peluang mobil menggunakan transmisi manual.
Interpretasi Koefisien
Koefisien mpg
sebesar 1.26 berarti setiap kenaikan 1
mil per galon meningkatkan log-odds peluang menggunakan transmisi manual
sebesar 1.26. Dalam istilah odds ratio, peluangnya meningkat sekitar 3.5
kali lipat. Hal ini menunjukkan mobil yang lebih irit bahan bakar lebih
mungkin menggunakan transmisi manual.
Koefisien hp
sebesar 0.055 menunjukkan setiap
kenaikan 1 tenaga kuda menaikkan log-odds transmisi manual sebesar
0.055. Dalam angka odds ratio, ini berarti peluang transmisi manual
meningkat sekitar 5.6% untuk setiap tambahan 1 tenaga kuda.
Perlu diperhatikan bahwa secara intuitif hp
yang lebih
besar sering diasosiasikan dengan transmisi otomatis, namun hasil model
ini menunjukkan pengaruh positif kecil. Hal ini bisa disebabkan oleh
karakteristik data atau korelasi dengan variabel lain di dalam
model.
Kinerja Model
Nilai deviance residual turun dari 43.23 (model tanpa prediktor)
menjadi 19.23 (dengan mpg
dan hp
), menandakan
model lebih baik dibanding model tanpa prediktor.
AIC (Akaike Information Criterion) sebesar 25.23 merupakan indikasi keseimbangan antara kompleksitas model dan goodness-of-fit.
Model konvergen setelah 7 iterasi perhitungan.
Evaluasi Prediksi
Model menghasilkan AUC (Area Under Curve) sebesar 0.931. Nilai AUC ini di atas 0.9 menandakan kinerja model sangat baik dalam membedakan mobil transmisi manual dan otomatis, dengan tingkat sensitivitas dan spesifisitas yang tinggi.
Confusion Matrix
Prediksi model terhadap data asli menghasilkan matriks kebingungan sebagai berikut:
Prediksi Aktual | Automatic | Manual |
---|---|---|
Automatic | 16 | 3 |
Manual | 3 | 10 |
Kesimpulan
mpg
dan hp
dengan tipe transmisi mobil,
dengan mpg
memiliki pengaruh kuat.Regresi Poisson adalah metode statistik yang digunakan untuk memodelkan variabel respons yang berupa data diskrit berupa hitungan (count data), yaitu bilangan bulat non-negatif seperti jumlah kejadian, frekuensi, atau banyaknya suatu peristiwa dalam periode waktu atau area tertentu. Contohnya termasuk jumlah kecelakaan lalu lintas per bulan, banyaknya panggilan telepon yang diterima suatu call center per hari, atau jumlah pasien yang datang ke rumah sakit.
Model regresi ini merupakan bagian dari Generalized Linear Model (GLM), di mana data respons diasumsikan mengikuti distribusi Poisson. Berbeda dengan regresi linear biasa, model ini tidak memprediksi nilai terus menerus melainkan rata-rata jumlah kejadian yang bersifat diskrit, dengan menghubungkannya melalui fungsi link ke variabel prediktor.
Distribusi Poisson
Distribusi Poisson merupakan distribusi probabilitas yang paling umum digunakan untuk data hitungan, dengan fungsi probabilitas:
\[ P(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!}, \quad y=0,1,2,\ldots \]
di mana:
Distribusi ini memiliki ciri bahwa rata-rata dan variansnya sama, yaitu \(E(Y) = Var(Y) = \lambda\).
Regresi Poisson dalam Kerangka Exponential Family
Distribusi Poisson termasuk dalam keluarga exponential family, yang memungkinkan penerapan Generalized Linear Model (GLM). Bentuk umum fungsi kepadatan dari exponential family dapat ditulis sebagai:
\[ f(y; \theta, \phi) = \exp\{ \frac{y \theta - b(\theta)}{a(\phi)} + c(y, \phi) \} \]
Untuk distribusi Poisson:
Sehingga, distribusi Poisson dapat diekspresikan sebagai:
\[ f(y; \theta) = \exp\{ y \theta - e^\theta - \log y! \} \]
Fungsi Link dan Model Regresi
Pada regresi Poisson, hubungan antara variabel respons \(Y\) dan variabel prediktor \(X = (X_1, X_2, ..., X_p)\) dimodelkan melalui fungsi link kanonik, yaitu fungsi logaritma:
\[ g(\mu) = \log(\mu) \]
dengan
\[ \mu_i = E(Y_i) = \lambda_i, \quad i = 1, 2, ..., n \]
Sehingga modelnya menjadi:
\[ \log(\mu_i) = \eta_i = \mathbf{x}_i^\top \boldsymbol{\beta} \]
atau ekuivalen:
\[ \mu_i = \exp(\mathbf{x}_i^\top \boldsymbol{\beta}) \]
di mana:
Fungsi link log memastikan bahwa prediksi \(\mu_i\) selalu positif, sesuai kebutuhan data hitungan.
Parameter \(\boldsymbol{\beta}\) dalam model regresi Poisson diestimasi dengan metode Maximum Likelihood Estimation (MLE). Likelihood fungsi berdasarkan distribusi Poisson adalah:
\[ L(\boldsymbol{\beta}) = \prod_{i=1}^n \frac{e^{-\mu_i} \mu_i^{y_i}}{y_i!} \]
Log-likelihood fungsi (yang akan dimaksimalkan) adalah:
\[ l(\boldsymbol{\beta}) = \sum_{i=1}^n \big[y_i \log(\mu_i) - \mu_i - \log(y_i!) \big] \]
Dengan substitusi \(\mu_i = \exp(\mathbf{x}_i^\top \boldsymbol{\beta})\), diperoleh:
\[ l(\boldsymbol{\beta}) = \sum_{i=1}^n \big[ y_i (\mathbf{x}_i^\top \boldsymbol{\beta}) - \exp(\mathbf{x}_i^\top \boldsymbol{\beta}) - \log(y_i!) \big] \]
Karena log-likelihood tersebut tidak memiliki bentuk tertutup untuk solusi analitis, parameter \(\boldsymbol{\beta}\) diestimasi menggunakan metode numerik, seperti algoritma iteratif Newton-Raphson atau Fisher Scoring.
Asumsi Model Regresi Poisson
Implementasi dan Interpretasi
Model regresi Poisson adalah alat penting untuk menganalisis data cacah. Ia memberikan hubungan log linear antara prediktor dan rata-rata kejadian. Namun, perlu diperhatikan kemungkinan overdispersion dalam penerapannya
Prediksi Jumlah Kunjungan Toko Berdasarkan Anggaran Iklan
Misalkan kita ingin memodelkan jumlah kunjungan ke sebuah toko (variabel count) berdasarkan anggaran iklan yang dikeluarkan (dalam ribuan dolar).
set.seed(123)
n <- 150
ad_budget <- runif(n, min = 0, max = 10) # Anggaran iklan (0-10 ribu dolar)
lambda <- exp(0.5 + 0.4 * ad_budget) # Mean jumlah kunjungan sesuai anggaran
visits <- rpois(n, lambda) # Simulasi banyak kunjungan toko
data <- data.frame(visits, ad_budget)
## Estimasi Regresi Poisson
poisson_model <- glm(visits ~ ad_budget, data = data, family = poisson)
summary(poisson_model)
##
## Call:
## glm(formula = visits ~ ad_budget, family = poisson, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.553174 0.064969 8.514 <2e-16 ***
## ad_budget 0.394689 0.008135 48.518 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 3360.95 on 149 degrees of freedom
## Residual deviance: 148.75 on 148 degrees of freedom
## AIC: 799.61
##
## Number of Fisher Scoring iterations: 4
# Plot Hasil Prediksi
plot(data$ad_budget, data$visits,
pch = 16, col = "darkgreen",
main = "Data Kunjungan Toko dan Prediksi Model Poisson",
xlab = "Anggaran Iklan (ribuan dolar)",
ylab = "Jumlah Kunjungan")
newdata <- data.frame(ad_budget = seq(min(data$ad_budget), max(data$ad_budget), length.out = 100))
pred <- predict(poisson_model, newdata = newdata, type = "response")
lines(newdata$ad_budget, pred, col = "blue", lwd = 2)
#Diagnostik dan Overdispersion
dispersion <- sum(residuals(poisson_model, type = "pearson")^2) / poisson_model$df.residual
print(dispersion)
## [1] 0.9692365
Berikut interpretasi output model regresi Poisson untuk kasus jumlah kunjungan toko berdasarkan anggaran iklan:
Koefisien dan Signifikansi
Variabel | Estimate | Std. Error | z value | Pr(> |
---|---|---|---|---|
( Intercept) | 0.553174 | 0.064969 | 8.514 | < 2e-16 (sangat signifikan) |
ad_budget | 0.394689 | 0.008135 | 48.518 | < 2e-16 (sangat signifikan) |
Interpretasi Koefisien dalam Skala Asli
\[ e^{0.3947} \approx 1.484 \]
Artinya, setiap penambahan 1 ribu dolar anggaran iklan mengalikan ekspektasi jumlah kunjungan sebanyak sekitar 1.48 kali (48% peningkatan).
Goodness of Fit
Null deviance: 3360.95 (model dengan intercept saja)
Residual deviance: 148.75 (model dengan prediktor ada)
Penurunan deviance sangat besar menunjukkan model dengan
ad_budget
jauh lebih baik.
AIC (Akaike Information Criterion) sebesar 799.61 — ini ukuran kualitas model, semakin kecil semakin baik (untuk perbandingan antar model).
Model konvergen setelah 4 iterasi Fisher scoring.
Diagnostik Overdispersion
Jika dispersion > 1, berarti ada indikasi overdispersion (varians data lebih besar dari rata-rata). Jika overdispersion terjadi, alternatif model seperti Negative Binomial Regression perlu dipertimbangkan.
Kesimpulan
Dataset quine berasal dari paket MASS
dan berisi data tentang jumlah hari siswa absen dari sekolah. Variabel
utama adalah jumlah hari absen (Days
) yang merupakan data
count (bilangan bulat non-negatif). Variabel prediktornya meliputi:
Tujuannya adalah memodelkan hubungan antara karakteristik siswa dan jumlah hari absen dengan menggunakan model regresi Poisson.
Model ini cocok karena Days
adalah data hitungan. Fungsi
link logaritma menghubungkan rata-rata hari absen dengan variabel
prediktor melalui model linier pada skala log.
Hasil model memungkinkan untuk menginterpretasi seberapa faktor-faktor seperti etnis, umur, jenis kelamin, dan status pembelajaran memengaruhi jumlah hari absen siswa. Misalnya, koefisien log-odds untuk kelompok tertentu menunjukkan besarnya peningkatan atau penurunan ekspektasi jumlah absen relatif terhadap kelompok referensi.
Model ini juga dapat dipakai untuk prediksi rata-rata hari absen berdasarkan profil siswa dan membantu dalam pengambilan keputusan pendidikan.
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
data("quine")
# Pemodelan Regresi Poisson
model_quine <- glm(Days ~ Eth + Sex + Age + Lrn, family = poisson, data = quine)
summary(model_quine)
##
## Call:
## glm(formula = Days ~ Eth + Sex + Age + Lrn, family = poisson,
## data = quine)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.71538 0.06468 41.980 < 2e-16 ***
## EthN -0.53360 0.04188 -12.740 < 2e-16 ***
## SexM 0.16160 0.04253 3.799 0.000145 ***
## AgeF1 -0.33390 0.07009 -4.764 1.90e-06 ***
## AgeF2 0.25783 0.06242 4.131 3.62e-05 ***
## AgeF3 0.42769 0.06769 6.319 2.64e-10 ***
## LrnSL 0.34894 0.05204 6.705 2.02e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2073.5 on 145 degrees of freedom
## Residual deviance: 1696.7 on 139 degrees of freedom
## AIC: 2299.2
##
## Number of Fisher Scoring iterations: 5
#Visualisasi Prediksi vs Data
library(ggplot2)
quine$predicted <- predict(model_quine, type = "response")
ggplot(quine, aes(x = Age, y = Days, color = Eth)) +
geom_jitter(width = 0.2, alpha = 0.6) +
geom_point(aes(y = predicted), shape = 18, size = 3) +
facet_wrap(~ Lrn) +
labs(title = "Jumlah Hari Absen berdasarkan Usia, Etnis dan Status Pembelajaran",
x = "Usia (kategori)",
y = "Hari Absen",
color = "Etnis") +
theme_minimal()
#Diagnostik Overdispersion
dispersion <- sum(residuals(model_quine, type = "pearson")^2) / model_quine$df.residual
dispersion
## [1] 13.16684
#Jika nilai dispersion >> 1, berarti mungkin ada overdispersion dan alternatif model seperti negative binomial perlu dipertimbangkan.
Berikut interpretasi output model regresi Poisson untuk kasus jumlah hari absen dari dataset quine:
Koefisien dan Signifikansi
Variabel | Estimate | Std. Error | z value | Pr(> | z |
---|---|---|---|---|---|
(Intercept) | 2.71538 | 0.06468 | 41.980 | < 2e-16 | *** (sangat signifikan) |
EthN | -0.53360 | 0.04188 | -12.740 | < 2e-16 | *** |
SexM | 0.16160 | 0.04253 | 3.799 | 0.000145 | *** |
AgeF1 | -0.33390 | 0.07009 | -4.764 | 1.90e-06 | *** |
AgeF2 | 0.25783 | 0.06242 | 4.131 | 3.62e-05 | *** |
AgeF3 | 0.42769 | 0.06769 | 6.319 | 2.64e-10 | *** |
LrnSL | 0.34894 | 0.05204 | 6.705 | 2.02e-11 | *** |
Interpretasi Koefisien (dalam skala log dan eksponensial)
Intercept (2.71538): log rata-rata hari absen
untuk kelompok referensi (Etnis A, perempuan, kategori AgeF0, dan
pembelajar AL).
EthN (-0.53360): siswa etnis Non-Aboriginal memiliki rata-rata hari absen yang secara log berkurang 0.5336 dibanding etnis Aboriginal (referensi). Dalam skala eksponensial:
\[ e^{-0.5336} \approx 0.586, \]
artinya rata-rata hari absen siswa etnis Non-Aboriginal sekitar 58.6% dari etnis Aboriginal, atau menurun sekitar 41.4%.
SexM (0.16160): siswa laki-laki memiliki
rata-rata hari absen 17.5% lebih tinggi dibanding perempuan (karena
\(e^{0.1616} \approx 1.175\)).
AgeF1 (-0.33390), AgeF2 (0.25783), AgeF3 (0.42769): perubahan rata-rata hari absen relatif terhadap kategori usia referensi.
LrnSL (0.34894): siswa dengan status pembelajaran SL rata-rata absen meningkat sekitar 41.7% dibanding AL (\(e^{0.34894} \approx 1.417\)).
Goodness of Fit
Diagnostik Overdispersion
Kesimpulan Singkat
Berikut materi lengkap dan terperinci mengenai Inferensi dalam Generalized Linear Model (GLM) yang telah dimodifikasi dan dikembangkan agar lebih komprehensif namun tetap jelas.
Kesimpulan Penting dari Inferensi GLM
Dengan pemahaman teori inferensi ini, penerapan GLM menjadi lebih valid dan handal dalam pengambilan keputusan berdasarkan data statistik.
Berikut materi lanjutan mengenai Ekspektasi, Varians, dan Metode Penaksiran Parameter dalam Generalized Linear Model (GLM), dengan penyesuaian penyajian agar tetap lengkap dan jelas tanpa menyederhanakan konsep pentingnya.
Ekspektasi adalah nilai rata-rata dari variabel acak \(Y\), yang secara matematis dapat diekspresikan melalui fungsi momen probabilitas:
\[ \mathbb{E}[Y] = \int y \, f(y; \theta) \, dy = \mu \]
di mana \(f(y; \theta)\) adalah fungsi densitas (atau fungsi massa) probabilitas dengan parameter \(\theta\), dan \(\mu\) adalah nilai harapan atau rata-rata dari \(Y\).
Untuk kelas distribusi eksponensial (exponential family) yang menjadi dasar GLM, fungsi logaritma dari fungsi densitasnya memiliki bentuk umum:
\[ \log f(y; \theta) = a(y) + b(\theta) y + c(\theta) \]
atau bisa juga dirumuskan sebagai:
\[ \log f(y; \theta) = y \theta - b(\theta) + c(y) \]
Dimana fungsi \(b(\theta)\) dan \(c(\theta)\) merupakan fungsi tertentu yang bergantung pada parameter dan data.
Misalkan \(\ell(\theta) = \log f(y; \theta)\) adalah fungsi log-likelihood. Turunan log-likelihood terhadap \(\theta\) sering disebut fungsi skor, yang ditulis sebagai:
\[ U(\theta) = \frac{\partial \ell}{\partial \theta} = y - b'(\theta) \]
di mana \(b'(\theta)\) adalah turunan pertama dari \(b(\theta)\) terhadap \(\theta\).
Karena fungsi skor adalah deret statistik yang digunakan untuk pengujian dan estimasi, nilai harapan dari fungsi skor ini memberikan:
\[ \mathbb{E}[U(\theta)] = \mathbb{E}[y - b'(\theta)] = \mu - b'(\theta) = 0 \]
sehingga:
\[
\mu = b'(\theta)
]
Artinya, nilai harapan \(Y\) berhubungan langsung dengan turunan pertama fungsi \(b(\theta)\).
Turunan kedua dari log-likelihood \(\ell(\theta)\) adalah:
\[ \frac{\partial^2 \ell}{\partial \theta^2} = -b''(\theta) \]
yang memberikan informasi tentang kelengkungan fungsi log-likelihood.
Varians \(Y\) kemudian dapat dituliskan sebagai:
\[ \text{Var}(Y) = b''(\theta) \cdot \phi \cdot V(\mu) \]
atau lebih sederhana:
\[ \text{Var}(Y) = \phi \cdot V(\mu) \]
di mana:
Fungsi \(V(\mu)\) merepresentasikan bentuk varians sebagai fungsi dari nilai rata-rata \(\mu\), yang merupakan ciri khas dari distribusi eksponensial.
Penaksiran parameter \(\beta\) pada GLM umumnya dilakukan dengan metode Maximum Likelihood Estimation (MLE). Prinsip dasar MLE adalah mencari nilai parameter yang memaksimalkan fungsi likelihood — yaitu fungsi yang menunjukkan seberapa besar kemungkinan data yang diamati terjadi berdasarkan model dan parameter.
Langkah-langkah dasar dalam MLE:
Turunan Pertama (Score):
Hitung turunan fungsi log-likelihood \(\frac{\partial \ell}{\partial \beta} = 0\) untuk mencari titik maksimum.
Turunan Kedua:
Pastikan turunan kedua negatif (\(\frac{\partial^2 \ell}{\partial \beta^2} < 0\)) agar titik tersebut adalah maksimum lokal.
Namun, mudahnya, dalam kasus GLM, bentuk solusi analitik sering tidak tersedia, sehingga diperlukan metode numerik.
Beberapa metode optimasi yang populer digunakan untuk mencari nilai \(\hat{\beta}\) yang memaksimalkan likelihood:
Newton-Raphson
\[ \beta^{(t+1)} = \beta^{(t)} - H^{-1}(\beta^{(t)}) \cdot U(\beta^{(t)}) \]
dimana:
Fisher Scoring
\[ \beta^{(t+1)} = \beta^{(t)} + I^{-1}(\beta^{(t)}) \cdot U(\beta^{(t)}) \]
dengan \(I(\beta^{(t)}) = \mathbb{E}[ -H(\beta^{(t)})]\).
Iteratively Reweighted Least Squares (IRLS)
Langkah-langkah dasar Newton-Raphson dalam konteks GLM adalah sebagai berikut:
\[ U_j(\beta) = \frac{\partial \log L(\beta)}{\partial \beta_j} \]
\[ H_{jk}(\beta) = \frac{\partial^2 \log L(\beta)}{\partial \beta_j \partial \beta_k} \]
\[ U(\beta^*) \approx U(\beta) + H(\beta)(\beta^* - \beta) \]
\[ \hat{\beta} \approx \beta^{(t)} - H^{-1}(\beta^{(t)}) U(\beta^{(t)}) \]
Di mana iterasi dilakukan hingga konvergensi (perubahan parameter antar iterasi cukup kecil).
Diagnostik model bertujuan untuk mengevaluasi apakah model yang dibangun sudah tepat dan sesuai dengan data. Evaluasi ini bisa dilakukan dengan beberapa pendekatan, antara lain:
Devians adalah ukuran kesesuaian model yang digunakan untuk membandingkan model yang sedang diuji dengan model yang paling kompleks (saturated model) yang memiliki jumlah parameter sama dengan jumlah observasi.
\[ D = 2 \sum_i \left[ y_i \log\left(\frac{y_i}{\hat{\mu}_i}\right) - (y_i - \hat{\mu}_i) \right] \]
di mana \(y_i\) adalah nilai observasi dan \(\hat{\mu}_i\) nilai prediksi model.
Statistik ini digunakan untuk menguji apakah model lebih baik dibandingkan dengan tidak menggunakan model (null model).
\[ X^2 = \sum_i \frac{(y_i - \hat{\mu}_i)^2}{\hat{\mu}_i} \]
Catatan Penting
Berikut lanjutan materi tentang Diagnostik Model GLM dan Detail Metode Estimasi serta Inferensi Regresi Logistik dengan penyesuaian agar lebih jelas dan rinci tanpa disingkat:
Regresi logistik dipakai untuk memodelkan probabilitas kejadian dari variabel respons biner (0 atau 1) berdasarkan satu atau lebih variabel prediktor.
Estimasi parameter dilakukan dengan Maximum Likelihood Estimation (MLE) karena model regresi logistik tidak linear pada parameternya.
Fungsi probabilitas dari keluaran model logistik adalah:
\[ \pi(x) = \frac{\exp(\beta_0 + \beta_1 x)}{1 + \exp(\beta_0 + \beta_1 x)} \]
yang menggambarkan probabilitas respons \(Y=1\) berdasarkan variabel prediktor \(x\).
Untuk \(n\) observasi, fungsi log-likelihood adalah:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \]
dengan:
\[ \pi_i = P(Y_i=1 | X_i) = \frac{1}{1 + \exp(-X_i^\top \beta)} \]
Metode Newton-Raphson digunakan untuk mencari parameter \(\beta\) yang memaksimalkan fungsi log-likelihood tersebut dengan langkah iteratif sebagai berikut:
\[ U(\beta) = \frac{\partial \ell(\beta)}{\partial \beta} = X^\top (y - \pi) \]
di mana \(y\) adalah vektor observasi dan \(\pi\) adalah vektor probabilitas model.
\[ H(\beta) = \frac{\partial^2 \ell(\beta)}{\partial \beta \partial \beta^\top} = -X^\top W X \]
dengan \(W = \text{diag}(\pi_i (1 - \pi_i))\) adalah matriks bobot diagonal berdasarkan probabilitas prediksi.
Nilai parameter diperbarui menggunakan:
\[ \beta^{(t+1)} = \beta^{(t)} + (X^\top W X)^{-1} X^\top (y - \pi^{(t)}) \]
dengan \(\pi^{(t)} = \frac{1}{1 + \exp(-X \beta^{(t)})}\).
Iterasi dilakukan sampai konvergen, yaitu nilai \(\beta\) tidak berubah signifikan antara iterasi.
Kesimpulan
Contoh Implementasi Newton-Raphson Regresi Logistik (R)
# Data simulasi
set.seed(2025)
n <- 100
x <- rnorm(n)
beta_true <- c(-0.5, 1.2)
X <- cbind(1, x) # desain matriks dengan intercept
# Fungsi logit dan probabilitas
logit <- function(beta, X) {
eta <- X %*% beta
1 / (1 + exp(-eta))
}
# Simulasi response binomial
prob <- logit(beta_true, X)
y <- rbinom(n, size = 1, prob = prob)
# Newton-Raphson Manual
beta <- c(0,0) # inisialisasi parameter
tol <- 1e-6 # toleransi konvergensi
max_iter <- 100
for (i in 1:max_iter) {
pi <- logit(beta, X)
W <- diag(as.vector(pi * (1 - pi)))
score <- t(X) %*% (y - pi)
Hessian <- -t(X) %*% W %*% X
step <- solve(Hessian, score)
beta_new <- beta - step
if (max(abs(beta_new - beta)) < tol) {
cat("Konvergen setelah", i, "iterasi\n")
break
}
beta <- beta_new
}
## Konvergen setelah 5 iterasi
## Estimasi parameter:
## [,1]
## -0.3841078
## x 1.0170038
##
## Call:
## glm(formula = y ~ x, family = binomial)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.3841 0.2261 -1.699 0.0893 .
## x 1.0170 0.2605 3.904 9.48e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 136.06 on 99 degrees of freedom
## Residual deviance: 116.36 on 98 degrees of freedom
## AIC: 120.36
##
## Number of Fisher Scoring iterations: 3
Setelah model diestimasi, langkah selanjutnya untuk evaluasi:
# Prediksi probabilitas dan residual deviance
yhat <- predict(model_glm, type="response")
res_dev <- residuals(model_glm, type = "deviance")
res_pearson <- residuals(model_glm, type = "pearson")
# Plot residual deviance vs fitted values
plot(yhat, res_dev, main="Residual Deviance vs Predicted Probability",
xlab="Predicted Probability", ylab="Deviance Residuals")
abline(h=0, col="red", lty=2)
# Plot residual Pearson vs fitted values
plot(yhat, res_pearson, main="Pearson Residual vs Predicted Probability",
xlab="Predicted Probability", ylab="Pearson Residuals")
abline(h=0, col="blue", lty=2)
# Plot ROC curve (gunakan package pROC jika ingin lebih lanjut)
# library(pROC)
# roc_obj <- roc(y, yhat)
# plot(roc_obj, main="ROC Curve")
Interpretasi Berikut interpretasi hasil output regresi logistik tersebut secara lengkap:
Parameter | Estimate | Std. Error | z value | Pr(> |
---|---|---|---|---|
Intercept | -0.3841 | 0.2261 | -1.699 | 0.0893 (.) |
x | 1.0170 | 0.2605 | 3.904 | 9.48e-05 (***) |
Intercept (-0.3841)
Nilai ini adalah log odds ketika \(x=0\). Artinya, peluang baseline \(P(Y=1|x=0) = \exp(-0.3841) / (1 + \exp(-0.3841))
\approx 0.405\).
Koefisien \(x\)
(1.0170)
Setiap kenaikan satu satuan pada \(x\),
log-odds keberhasilan (\(Y=1\))
meningkat sebesar 1.017. Dalam istilah odds ratio:
\[ \text{Odds Ratio} = e^{1.017} \approx 2.77 \]
Ini berarti peluang keberhasilan menjadi sekitar 2.77 kali lebih besar setiap kenaikan 1 unit pada \(x\).
Null Deviance: 136.06 (df=99)
Devians model tanpa variabel prediktor (hanya intercept).
Residual Deviance: 116.36 (df=98)
Devians setelah memasukkan variabel \(x\). Penurunan devians ini mengindikasikan
model dengan \(x\) lebih baik daripada
tanpa \(x\).
AIC (Akaike Information Criterion): 120.36
Ukuran kualitas model dengan penalti kompleksitas model; semakin kecil
AIC, model semakin baik.
Fisher Scoring Iterations: 3
Menunjukkan estimasi parameter pada fungsi glm menggunakan metode Fisher
scoring (mirip Newton-Raphson) membutuhkan 3 iterasi untuk
konvergen.
Penjelasan:
glm
seharusnya
menghasilkan nilai yang sangat mirip.Interpretasi Plot
Kesimpulan untuk keduanya:
Berikut penjelasan lengkap, terstruktur, dan detail tentang Inferensi Parameter pada Regresi Logistik dengan pendekatan uji Wald, likelihood ratio test, serta evaluasi model menggunakan AIC dan BIC. Materi ini adalah kelanjutan yang komprehensif tanpa ringkasan berlebihan.
Inferensi parameter bertujuan untuk menguji keabsahan dan signifikansi koefisien regresi \(\beta_j\) dalam model regresi logistik. Hal ini penting untuk mengetahui apakah variabel prediktor yang dimasukkan berpengaruh signifikan terhadap probabilitas kejadian.
Tujuan
Menguji hipotesis nol:
\[
H_0: \beta_j = 0 \quad \text{(parameter tidak berpengaruh)}
\] melawan alternatif
\[
H_1: \beta_j \neq 0
\]
Teori Uji Wald
Dari teori estimasi Maximum Likelihood Estimation (MLE),
estimator \(\hat{\beta}_j\) mendekati
distribusi normal:
\[
\hat{\beta}_j \sim N(\beta_j, \operatorname{Var}(\hat{\beta}_j))
\]
Jika hipotesis nol benar (\(\beta_j =
0\)), maka statistik berikut:
\[
Z = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim \mathcal{N}(0,1)
\]
Statistik Wald yang digunakan adalah kuadrat dari \(Z\):
\[
W = Z^2 = \left(\frac{\hat{\beta}_j}{SE(\hat{\beta}_j)}\right)^2 \sim
\chi^2_1
\]
Ini mengikuti distribusi Chi-Square dengan 1 derajat kebebasan.
Contoh Simulasi dan Uji Wald (R)
set.seed(123)
n <- 100
x <- rnorm(n)
log_odds <- -0.5 + 1.2 * x
p <- 1 / (1 + exp(-log_odds))
y <- rbinom(n, 1, p)
data <- data.frame(x, y)
model <- glm(y ~ x, data = data, family = binomial)
summary(model)
##
## Call:
## glm(formula = y ~ x, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.3097 0.2296 -1.349 0.177
## x 1.2663 0.3080 4.111 3.94e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 137.99 on 99 degrees of freedom
## Residual deviance: 114.76 on 98 degrees of freedom
## AIC: 118.76
##
## Number of Fisher Scoring iterations: 4
# Ambil koefisien dan standar error
beta_hat <- coef(model)["x"]
se_beta <- summary(model)$coefficients["x", "Std. Error"]
# Hitung statistik Z
Z <- beta_hat / se_beta
print(Z)
## x
## 4.110965
## x
## 16.90003
Tujuan Menggunakan perbandingan antara model penuh dengan model nol (tanpa variabel prediktor) untuk menguji pengaruh variabel prediktor secara keseluruhan.
Langkah Pengujian dengan fungsi anova
di
R
## Analysis of Deviance Table
##
## Model 1: y ~ 1
## Model 2: y ~ x
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 99 137.99
## 2 98 114.76 1 23.229 1.438e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretasi
Untuk menilai kualitas dan kompleksitas model, digunakan:
Akaike Information Criterion (AIC)
Semakin kecil nilai AIC, semakin baik model.
Bayesian Information Criterion (BIC)
Penalti kompleksitas model lebih berat dibanding AIC, untuk memilih
model yang sederhana tapi efektif.
Contoh Kode Evaluasi
## AIC model: 118.7598
## BIC model: 123.9701
## x
## 3.940095e-05
Model regresi Poisson digunakan khusus untuk memodelkan data hitungan (count data), yaitu jumlah kejadian yang mengikuti distribusi Poisson. Model ini cocok ketika variabel respons adalah data diskrit yang berupa jumlah kejadian dalam interval waktu, ruang, atau grup tertentu.
Model Regresi Poisson
Distribusi probabilitas variabel respons \(Y_i\) yang mengikuti distribusi Poisson dinyatakan dengan:
\[ P(Y_i = y_i) = \frac{e^{-\lambda_i} \lambda_i^{y_i}}{y_i!} \]
di mana \(\lambda_i\) adalah parameter rata-rata (mean) dan varians dari distribusi Poisson, yang menggambarkan intensitas kejadian.
Model regresi Poisson memodelkan secara logaritmik hubungan antara rata-rata kejadian dengan variabel prediktor:
\[ \log(\lambda_i) = \mathbf{x}_i^\top \boldsymbol{\beta} \quad \Rightarrow \quad \lambda_i = \exp(\mathbf{x}_i^\top \boldsymbol{\beta}) \]
Maximum Likelihood Estimation (MLE)
Fungsi log-likelihood untuk \(n\) observasi adalah:
\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^n \left[y_i \log(\lambda_i) - \lambda_i - \log(y_i!)\right] \]
dengan \(\lambda_i = \exp(\mathbf{x}_i^\top \boldsymbol{\beta})\).
Estimasi parameter \(\boldsymbol{\beta}\) diperoleh dengan memaksimalkan fungsi log-likelihood tersebut.
Metode Iteratif: Iteratively Reweighted Least Squares (IRLS)
Karena log-likelihood tidak dapat diselesaikan langsung, MLE diperkirakan secara iteratif menggunakan metode IRLS (Iteratively Reweighted Least Squares). Metode ini sangat mirip dengan Newton-Raphson, namun dikhususkan untuk model GLM dengan fungsi link log dan distribusi Poisson.
Langkah-Langkah IRLS Manual
Definisikan Model
\[
\eta_i = \log(\lambda_i) = \mathbf{x}_i^\top \boldsymbol{\beta}
\] Sehingga \(\lambda_i =
\exp(\eta_i)\).
Formulasi Fungsi Log-Likelihood
Maksimalkan: \[
\ell(\boldsymbol{\beta}) = \sum_{i=1}^n \left[y_i \log(\lambda_i) -
\lambda_i - \log(y_i!)\right]
\]
Formulasi Iteratif untuk Update Parameter
Pada iterasi ke-\(t+1\), parameter
diperbarui dengan:
\[ \boldsymbol{\beta}^{(t+1)} = \left(\mathbf{X}^\top \mathbf{W}^{(t)} \mathbf{X}\right)^{-1} \mathbf{X}^\top \mathbf{W}^{(t)} \mathbf{z}^{(t)} \]
dengan:
Ulangi hingga konvergen (perubahan parameter kecil antara iterasi).
Contoh Simulasi Data dan Estimasi IRLS Manual (R)
set.seed(123)
n <- 100
x <- rnorm(n)
X <- cbind(Intercept=1, x) # Desain matriks dengan intercept
beta_true <- c(0.5, 0.8)
eta <- X %*% beta_true
lambda <- exp(eta)
y <- rpois(n, lambda)
# Inisialisasi variabel untuk iterasi IRLS
beta <- c(0, 0)
tol <- 1e-6
max_iter <- 100
for (i in 1:max_iter) {
eta <- X %*% beta
lambda <- exp(eta)
W <- diag(as.numeric(lambda))
z <- eta + (y - lambda) / lambda
beta_new <- solve(t(X) %*% W %*% X) %*% t(X) %*% W %*% z
if (sum(abs(beta_new - beta)) < tol) {
cat("Konvergen pada iterasi ke-", i, "\n")
break
}
beta <- beta_new
}
## Konvergen pada iterasi ke- 8
## Estimasi parameter:
## [,1]
## Intercept 0.4494951
## x 0.8600048
Perbandingan dengan Fungsi glm()
di
R
##
## Call:
## glm(formula = y ~ x, family = poisson)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.44950 0.08872 5.066 4.05e-07 ***
## x 0.86000 0.07463 11.523 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.05 on 99 degrees of freedom
## Residual deviance: 106.78 on 98 degrees of freedom
## AIC: 325.76
##
## Number of Fisher Scoring iterations: 5
Output model glm()
hendaknya mendekati hasil estimasi
IRLS manual, memberikan validasi atas metode iteratif yang dilakukan
secara eksplisit.
Setelah parameter diestimasi, perlu dilakukan inferensi untuk menguji signifikan tidaknya koefisien.
** Contoh Kode Uji Wald**
coef_val <- coef(model_glm)[2]
se_val <- summary(model_glm)$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, "\n")
## Z: 11.52289
## Chi-Square: 132.777
## p-value: 0
Bandingkan model penuh dengan model kosong menggunakan uji chi-square:
## Analysis of Deviance Table
##
## Model 1: y ~ 1
## Model 2: y ~ x
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 99 245.05
## 2 98 106.78 1 138.26 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
AIC (Akaike Information Criterion):
Mengukur keseimbangan antara kompleksitas dan fit model. Nilai lebih
kecil lebih baik.
BIC (Bayesian Information Criterion):
Penalti yang lebih berat terhadap kompleksitas model, mengarah pada
model yang lebih sederhana.
aic_val <- AIC(model_glm)
bic_val <- BIC(model_glm)
cat("AIC model:", aic_val, "\nBIC model:", bic_val, "\n")
## AIC model: 325.7582
## BIC model: 330.9685
Kesimpulan
Regresi logistik merupakan metode statistik yang umum digunakan untuk menganalisis hubungan antara satu variabel respons biner (dua kategori, seperti “ya” atau “tidak”, “sukses” atau “gagal”) dengan satu atau lebih variabel prediktor. Keunggulan utama dari metode ini adalah kemampuannya untuk menangani variabel bebas dengan berbagai skala pengukuran—baik kategorikal maupun numerik—dan mengestimasi peluang suatu kejadian berdasarkan kombinasi karakteristik yang dimiliki.
Dalam dunia nyata, variabel prediktor yang digunakan dalam analisis sering kali berasal dari skala pengukuran yang berbeda. Oleh karena itu, penting untuk memahami bagaimana masing-masing jenis variabel tersebut diperlakukan dalam model regresi logistik, khususnya:
Nominal: Merupakan variabel kategorikal tanpa urutan logis antar kategorinya. Contohnya adalah jenis kelamin (laki-laki, perempuan), atau status pernikahan (lajang, menikah, cerai). Dalam model regresi logistik, variabel nominal diubah ke dalam bentuk variabel dummy agar dapat dimasukkan ke dalam model sebagai prediktor numerik.
Ordinal: Variabel yang memiliki urutan logis antar kategori, namun jarak antar kategori belum tentu sama. Contohnya adalah tingkat kepuasan (tidak puas, cukup puas, puas, sangat puas) atau tingkat pendidikan (SMA < Sarjana < Master < Doktor). Dalam regresi logistik, variabel ordinal dapat diperlakukan sebagai:
Nominal, dengan membuat dummy untuk masing-masing kategori. Numerik, dengan memberikan nilai skala (misalnya: SMA = 1, Sarjana = 2, dst.) untuk merepresentasikan urutan. Pilihan perlakuan ini harus mempertimbangkan asumsi model dan konteks substantif dari data.
Memahami perbedaan perlakuan terhadap ketiga jenis prediktor ini menjadi kunci dalam membangun model regresi logistik yang tidak hanya akurat secara statistik, tetapi juga relevan secara substantif. Pada bab ini, akan dibahas cara memperlakukan prediktor dengan skala yang berbeda dalam konteks regresi logistik, dilengkapi dengan ilustrasi melalui simulasi dan eksplorasi data untuk memperdalam pemahaman.
Untuk memahami bagaimana regresi logistik menangani prediktor dengan skala nominal, ordinal, dan rasio, kita akan membuat dataset simulasi.
Dalam dunia e-commerce, keputusan seseorang untuk membeli suatu produk dapat dipengaruhi oleh berbagai faktor seperti jenis kelamin, tingkat kepercayaan terhadap toko online, dan pendapatan bulanan. Kita akan membuat dataset simulasi untuk memodelkan peluang seseorang membeli produk online (purchase: 0 = tidak beli, 1 = beli) berdasarkan:
gender (nominal): Male / Female,
trust_level (ordinal): Low < Medium < High < Very High,
income (rasio): pendapatan bulanan.
# Load library
library(tibble)
# Set seed
set.seed(123)
# Jumlah observasi
n <- 500
# Simulasi variabel prediktor
gender <- sample(c("Male", "Female"), n, replace = TRUE)
trust_level <- sample(c("Low", "Medium", "High", "Very High"),
n, replace = TRUE, prob = c(0.25, 0.35, 0.25, 0.15))
income <- rnorm(n, mean = 6, sd = 2) # dalam juta rupiah per bulan
# Model logit untuk probabilitas pembelian
logit_p <- -1.5 +
0.6 * (gender == "Female") +
1.0 * as.numeric(factor(trust_level,
levels = c("Low", "Medium", "High", "Very High"),
ordered = TRUE)) +
0.2 * income
# Ubah ke probabilitas
p <- 1 / (1 + exp(-logit_p))
# Simulasi variabel biner: purchase (0/1)
purchase <- rbinom(n, 1, p)
# Gabungkan ke dalam dataset
sim_data <- tibble(purchase, gender, trust_level, income)
# Tampilkan 6 data pertama
head(sim_data)
## # A tibble: 6 × 4
## purchase gender trust_level income
## <int> <chr> <chr> <dbl>
## 1 1 Male High 4.80
## 2 1 Male High 4.01
## 3 1 Male Medium 8.05
## 4 1 Female Medium 7.50
## 5 1 Male High 2.98
## 6 1 Female Medium 5.81
Interpretasi: Dataset ini berisi 500 observasi dengan empat variabel:
gender: jenis kelamin (nominal),
trust_level: tingkat kepercayaan terhadap toko online (ordinal),
income: pendapatan bulanan dalam juta rupiah (rasio),
purchase: keputusan membeli produk online (biner).
Nilai variabel purchase disimulasikan menggunakan model logit yang mempertimbangkan pengaruh gender, tingkat kepercayaan, dan pendapatan.
# Eksplorasi: jumlah dan rata-rata income berdasarkan status purchase
sim_data %>%
dplyr::group_by(purchase) %>%
dplyr::summarise(
Jumlah = dplyr::n(),
Rata2_Income = mean(income)
)
## # A tibble: 2 × 3
## purchase Jumlah Rata2_Income
## <int> <int> <dbl>
## 1 0 65 5.69
## 2 1 435 6.04
# Jumlah dan rata-rata income berdasarkan status purchase dan gender
sim_data %>%
dplyr::group_by(gender, purchase) %>%
dplyr::summarise(
Jumlah = dplyr::n(),
Rata2_Income = mean(income),
.groups = 'drop'
)
## # A tibble: 4 × 4
## gender purchase Jumlah Rata2_Income
## <chr> <int> <int> <dbl>
## 1 Female 0 22 5.96
## 2 Female 1 217 5.91
## 3 Male 0 43 5.56
## 4 Male 1 218 6.17
# Jumlah dan rata-rata income berdasarkan status purchase dan trust_level
sim_data %>%
dplyr::group_by(trust_level, purchase) %>%
dplyr::summarise(
Jumlah = dplyr::n(),
Rata2_Income = mean(income),
.groups = 'drop'
)
## # A tibble: 8 × 4
## trust_level purchase Jumlah Rata2_Income
## <chr> <int> <int> <dbl>
## 1 High 0 4 3.77
## 2 High 1 130 5.91
## 3 Low 0 37 5.79
## 4 Low 1 87 6.07
## 5 Medium 0 23 5.99
## 6 Medium 1 145 6.13
## 7 Very High 0 1 2.76
## 8 Very High 1 73 6.06
Dalam bagian ini, kita akan melakukan analisis regresi logistik dengan memperlakukan variabel ordinal trust_level (tingkat kepercayaan) sebagai variabel nominal. Artinya, kita akan mengabaikan urutan level dari trust_level (“low”, “medium”, “high”) dan memperlakukannya sebagai kategori lepas yang tidak berurutan.
Pendekatan ini biasa digunakan untuk melihat pengaruh masing-masing level terhadap variabel target (purchase) tanpa mengasumsikan bahwa hubungan antara level bersifat linear atau berurutan. Kita akan membuat variabel dummy dengan baseline (kategori referensi) adalah “low”, dan membandingkan kategori lainnya terhadap baseline tersebut.
# Perlakuan trust_level sebagai faktor nominal (dummy)
# Memanggil package dplyr
library(dplyr)
# Cek distribusi trust_level
table(sim_data$trust_level)
##
## High Low Medium Very High
## 134 124 168 74
# 10.3.1 Perlakuan Ordinal Sebagai Nominal
sim_data_nominal <- sim_data %>%
mutate(trust_level = factor(trust_level, levels = c("Low", "Medium", "High", "Very High")))
# Model regresi logistik dengan dummy variabel
model_nominal <- glm(purchase ~ gender + trust_level + income,
data = sim_data_nominal, family = binomial)
# Lihat ringkasan model
summary(model_nominal)
##
## Call:
## glm(formula = purchase ~ gender + trust_level + income, family = binomial,
## data = sim_data_nominal)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.64815 0.48022 1.350 0.177120
## genderMale -0.91063 0.29790 -3.057 0.002237 **
## trust_levelMedium 1.01141 0.30454 3.321 0.000896 ***
## trust_levelHigh 2.72969 0.55007 4.962 6.96e-07 ***
## trust_levelVery High 3.63966 1.03024 3.533 0.000411 ***
## income 0.11781 0.07114 1.656 0.097724 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 386.39 on 499 degrees of freedom
## Residual deviance: 319.85 on 494 degrees of freedom
## AIC: 331.85
##
## Number of Fisher Scoring iterations: 6
Intercept (+0.64815)
Ini adalah log-odds dasar untuk individu berjenis kelamin
Female, memiliki tingkat kepercayaan Low
(sebagai referensi), dan income = 0.
Nilai p = 0.177120 (tidak signifikan), artinya baseline ini tidak
berbeda secara signifikan dari probabilitas acak (50%).
Odds Ratio = exp(0.64815) = 1.91 → Peluang pembelian pada kondisi
baseline adalah 1.91 kali dibandingkan odds dasar (namun tidak
signifikan).
genderMale (-0.91063)
Individu berjenis kelamin laki-laki memiliki log-odds
pembelian yang lebih rendah sebesar 0.91 dibandingkan perempuan.
Nilai p = 0.002237 (signifikan pada taraf 1%), menunjukkan bahwa jenis
kelamin berpengaruh signifikan terhadap keputusan
pembelian.
Odds Ratio = exp(-0.91063) = 0.40 → Peluang laki-laki untuk melakukan
pembelian adalah sekitar 40% dari peluang
perempuan.
trust_levelMedium (+1.01141)
Individu dengan tingkat kepercayaan Medium memiliki
log-odds pembelian yang lebih tinggi sebesar 1.01 dibandingkan dengan
tingkat kepercayaan Low.
Nilai p = 0.000896 (signifikan pada taraf 1%), menunjukkan bahwa trust
level Medium berpengaruh signifikan.
Odds Ratio = exp(1.01141) = 2.75 → Peluang pembelian oleh individu
dengan trust level Medium adalah 2.75 kali lebih besar
dibandingkan trust level Low.
trust_levelHigh (+2.72969)
Individu dengan trust level High memiliki log-odds
pembelian lebih tinggi sebesar 2.73 dibandingkan trust level Low.
Nilai p = 6.96e-07 (sangat signifikan), menunjukkan bahwa trust level
High merupakan prediktor kuat.
Odds Ratio = exp(2.72969) = 15.32 → Peluang pembelian oleh individu
dengan trust level High adalah 15.32 kali lebih besar
dibanding trust level Low.
trust_levelVery High (+3.63966)
Individu dengan trust level Very High memiliki log-odds
pembelian lebih tinggi sebesar 3.64 dibandingkan trust level Low.
Nilai p = 0.000411 (signifikan pada taraf 1%), menunjukkan efek positif
yang sangat kuat.
Odds Ratio = exp(3.63966) = 38.03 → Peluang pembelian oleh individu
dengan trust level Very High adalah sekitar 38 kali lebih
besar dibandingkan trust level Low.
income (+0.11781)
Setiap kenaikan 1 unit pendapatan (dalam log income),
meningkatkan log-odds pembelian sebesar 0.118.
Nilai p = 0.097724 (marginal signifikan di taraf 10%), menunjukkan bahwa
pengaruh income terhadap pembelian relatif lemah namun tetap
relevan.
Odds Ratio = exp(0.11781) = 1.125 → Setiap kenaikan 1 unit pendapatan
meningkatkan peluang pembelian sekitar 12.5%.
Goodness-of-Fit
- Null deviance: 386.39 → deviance dari model tanpa prediktor.
- Residual deviance: 319.85 → deviance dari model dengan
prediktor.
Penurunan deviance menunjukkan bahwa model membawa informasi penting
dalam menjelaskan variabel target.
- AIC: 331.85 → Digunakan untuk membandingkan model; semakin kecil nilai
AIC, semakin baik keseimbangan antara akurasi dan kompleksitas
model.
Kesimpulan Praktis
- Tingkat kepercayaan (trust_level) merupakan prediktor
paling kuat dalam menjelaskan peluang pembelian.
- Gender juga berpengaruh, dengan laki-laki cenderung memiliki peluang
lebih rendah untuk melakukan pembelian.
- Income menunjukkan pengaruh yang lebih kecil, namun tetap positif
terhadap pembelian.
- Model secara umum cukup baik, namun mungkin dapat
ditingkatkan lebih lanjut dengan menambahkan variabel lain seperti usia,
pengalaman belanja, atau preferensi produk.
Pada bagian ini, variabel trust_level yang bersifat ordinal akan diperlakukan sebagai variabel numerik bertingkat, dengan asumsi bahwa kenaikan satu tingkat kepercayaan memiliki efek linier terhadap peluang pembelian. Pendekatan ini digunakan untuk menangkap pola hubungan bertingkat antara kepercayaan dan keputusan pembelian secara lebih efisien dalam model regresi logistik.
# Perlakuan trust_level sebagai ordinal numeric
sim_data_numeric <- sim_data %>%
mutate(trust_numeric = case_when(
trust_level == "Low" ~ 1,
trust_level == "Medium" ~ 2,
trust_level == "High" ~ 3,
trust_level == "Very High" ~ 4
))
# Model regresi logistik dengan trust_numeric
model_numeric <- glm(purchase ~ gender + trust_numeric + income,
data = sim_data_numeric, family = binomial)
# Lihat ringkasan model
summary(model_numeric)
##
## Call:
## glm(formula = purchase ~ gender + trust_numeric + income, family = binomial,
## data = sim_data_numeric)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.62616 0.55865 -1.121 0.26236
## genderMale -0.91139 0.29880 -3.050 0.00229 **
## trust_numeric 1.23119 0.19177 6.420 1.36e-10 ***
## income 0.11515 0.07125 1.616 0.10606
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 386.39 on 499 degrees of freedom
## Residual deviance: 320.87 on 496 degrees of freedom
## AIC: 328.87
##
## Number of Fisher Scoring iterations: 6
Interpretasi
Model ini mengasumsikan bahwa kenaikan tingkat kepercayaan (trust_level) memiliki efek linear terhadap peluang membeli (purchase = 1).
Koefisien genderMale = -0.91139, dengan p-value = 0.00229 (signifikan pada level 1%). Artinya, jenis kelamin laki-laki cenderung memiliki kemungkinan membeli lebih rendah dibanding perempuan, jika variabel lain dikontrol.
Koefisien trust_numeric = 1.23119, dengan p-value < 0.001 (sangat signifikan). Ini menunjukkan bahwa setiap kenaikan satu tingkat kepercayaan (misalnya dari Medium ke High) meningkatkan log-odds pembelian sebesar 1.231. Dalam bentuk odds ratio: exp(1.23119) ≈ 3.425, sehingga peluang membeli meningkat sekitar 3,4 kali lipat setiap naik satu level kepercayaan.
Koefisien income = 0.11515, namun dengan p-value = 0.10606 (tidak signifikan). Artinya, pendapatan belum terbukti secara statistik memengaruhi keputusan membeli dalam model ini.
AIC model = 328.87, dan residual deviance berkurang dibanding null deviance, yang menunjukkan bahwa model ini cukup baik dalam menjelaskan variabel purchase.
## $AIC_Nominal
## [1] 331.8491
##
## $AIC_Numeric
## [1] 328.8699
Perbandingan Model
Nilai AIC untuk model dengan perlakuan trust sebagai nominal adalah 331.85, sedangkan untuk model dengan perlakuan trust sebagai ordinal numeric adalah 328.87.
Karena AIC model ordinal numeric lebih kecil, maka
model dengan perlakuan trust_level
sebagai
ordinal lebih disukai. Ini menunjukkan bahwa asumsi
adanya urutan pada tingkat kepercayaan (Low → Medium → High → Very High)
memberikan informasi yang lebih baik dalam memprediksi keputusan
pembelian dibandingkan jika dianggap sebagai kategori tanpa urutan.
Interpretasi Goodness-of-Fit
Null deviance (386.39): Deviance dari model tanpa prediktor.
Residual deviance (320.87): Deviance dari model
setelah memasukkan prediktor (gender
,
trust_numeric
, dan income
).
Penurunan nilai deviance menunjukkan bahwa prediktor memberikan informasi yang berarti dalam menjelaskan variasi pada variabel respon.
AIC (328.87): Digunakan untuk membandingkan model. Karena AIC ini lebih rendah dibanding model nominal (331.85), maka model ordinal lebih efisien dalam hal keseimbangan antara goodness-of-fit dan kompleksitas model.
# Model null (tanpa prediktor)
nullmod <- glm(purchase ~ 1, data = sim_data, family = binomial)
# Menghitung McFadden R2 untuk model nominal dan numeric
r2_nominal <- 1 - (logLik(model_nominal) / logLik(nullmod))
r2_numeric <- 1 - (logLik(model_numeric) / logLik(nullmod))
# Menampilkan hasil
list(
McFadden_R2_Nominal = r2_nominal,
McFadden_R2_Numeric = r2_numeric
)
## $McFadden_R2_Nominal
## 'log Lik.' 0.1722046 (df=6)
##
## $McFadden_R2_Numeric
## 'log Lik.' 0.1695627 (df=4)
McFadden’s R² mengukur goodness-of-fit. Semakin besar nilainya, semakin baik model memprediksi dibandingkan model null.
Nilai McFadden R² untuk model dengan trust_level
diperlakukan sebagai kategori nominal adalah sekitar
0.172, sedangkan untuk model dengan
trust_level
diperlakukan sebagai variabel ordinal
numerik adalah sekitar 0.170.
Nilai McFadden R² ini mengindikasikan seberapa baik model menjelaskan variasi data dibandingkan model tanpa prediktor (null model). Kedua model menunjukkan kemampuan yang cukup mirip, dengan model nominal sedikit lebih baik dalam menjelaskan variabilitas data.
Secara praktis, perbedaan nilai R² ini sangat kecil sehingga baik perlakuan variabel trust_level sebagai nominal maupun ordinal numeric memberikan hasil model yang hampir setara.
Berikut ini adalah visualisasi prediksi probabilitas pembelian berdasarkan model regresi logistik yang menggunakan variabel trust_level sebagai variabel kategori nominal dan sebagai variabel numeric ordinal. Plot ini memperlihatkan bagaimana probabilitas prediksi berubah seiring dengan peningkatan income pada setiap kategori tingkat kepercayaan (trust_level). Dengan membandingkan kedua plot, kita dapat melihat perbedaan pengaruh perlakuan variabel ordinal sebagai nominal versus numeric terhadap hasil prediksi model.
library(ggplot2)
library(dplyr)
# Tambahkan prediksi probabilitas ke data
sim_data_nominal <- sim_data_nominal %>%
mutate(predicted = predict(model_nominal, type = "response"))
sim_data_numeric <- sim_data_numeric %>%
mutate(predicted = predict(model_numeric, type = "response"))
# Plot untuk model nominal (trust_level sebagai kategori nominal)
sim_data_nominal %>%
ggplot(aes(x = income, y = predicted, color = trust_level)) +
geom_point(alpha = 0.6) +
labs(
title = "Prediksi Probabilitas Pembelian (trust_level sebagai Nominal)",
x = "Income (juta rupiah)",
y = "Probabilitas Prediksi"
) +
theme_minimal()
# Plot untuk model numeric (trust_level sebagai numeric ordinal)
sim_data_numeric %>%
ggplot(aes(x = income, y = predicted, color = as.factor(trust_numeric))) +
geom_point(alpha = 0.6) +
labs(
title = "Prediksi Probabilitas Pembelian (trust_level sebagai Numeric)",
x = "Income (juta rupiah)",
y = "Probabilitas Prediksi",
color = "trust_numeric"
) +
theme_minimal()
Jika yang diinginkan adalah model yang lebih sederhana dan interpretasi linear terhadap tingkat kepercayaan, perlakuan ordinal sebagai numeric lebih cocok.Namun apabila terdepat kecurigaan efek tingkat kepercayaan tidak linier atau tidak berurutan, model nominal mungkin dapat menangkapnya dengan lebih baik.
library(broom)
library(knitr)
library(kableExtra)
# Ringkasan model nominal
tidy(model_nominal) %>%
kable(format = "html", caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Nominal") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | 0.6481459 | 0.4802236 | 1.349675 | 0.1771202 |
genderMale | -0.9106310 | 0.2979001 | -3.056833 | 0.0022369 |
trust_levelMedium | 1.0114089 | 0.3045352 | 3.321156 | 0.0008965 |
trust_levelHigh | 2.7296891 | 0.5500741 | 4.962402 | 0.0000007 |
trust_levelVery High | 3.6396595 | 1.0302419 | 3.532820 | 0.0004112 |
income | 0.1178091 | 0.0711413 | 1.655987 | 0.0977244 |
# Ringkasan model numeric
tidy(model_numeric) %>%
kable(format = "html", caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Numeric") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | -0.6261555 | 0.5586501 | -1.120837 | 0.2623574 |
genderMale | -0.9113859 | 0.2988014 | -3.050139 | 0.0022874 |
trust_numeric | 1.2311948 | 0.1917672 | 6.420258 | 0.0000000 |
income | 0.1151542 | 0.0712522 | 1.616148 | 0.1060622 |
Interpretasi Ringkasan Koefisien Model dengan Ordinal sebagai Nominal
Intercept (0.6481, p = 0.1771)
Log-odds dasar untuk individu perempuan dengan kategori trust level
“Low” dan income = 0. Tidak signifikan secara statistik, sehingga
baseline ini tidak berbeda signifikan dari peluang 50%.
genderMale (-0.9106, p = 0.0022)
Laki-laki memiliki log-odds probabilitas sukses lebih rendah dibanding
perempuan. Secara praktis, peluang sukses laki-laki lebih rendah dan
signifikan.
trust_levelMedium (1.0114, p = 0.0009), trust_levelHigh (2.7297,
p < 0.001), trust_levelVery High (3.6397, p < 0.001)
Semakin tinggi kategori tingkat kepercayaan (trust level), semakin besar
log-odds peluang sukses. Efek ini sangat signifikan.
income (0.1178, p = 0.0977)
Pengaruh positif income terhadap peluang sukses, tetapi tidak signifikan
pada tingkat 5%, hanya cenderung (p ~ 0.1).
Interpretasi Ringkasan Koefisien Model dengan Ordinal sebagai Numeric
Intercept (-0.6262, p = 0.2624)
Log-odds dasar untuk perempuan dengan trust level terendah (diberi nilai
1) dan income = 0. Tidak signifikan.
genderMale (-0.9114, p = 0.0023)
Laki-laki memiliki peluang sukses lebih rendah secara signifikan
dibanding perempuan.
trust_numeric (1.2312, p < 0.001)
Setiap kenaikan satu tingkat trust level secara numerik meningkatkan
log-odds peluang sukses secara signifikan.
income (0.1152, p = 0.1061)
Pengaruh income positif tapi tidak signifikan pada level 5%.
Kesimpulan
Kedua model menunjukkan bahwa gender dan trust level berpengaruh signifikan terhadap peluang sukses. Model nominal memungkinkan pengaruh setiap kategori trust level yang berbeda, sedangkan model numeric menganggap trust level sebagai skala linier. Income memberikan efek positif namun kurang signifikan pada kedua model.
Dalam membangun model regresi logistik, terdapat dua pendekatan utama yang sering digunakan oleh peneliti, yaitu pendekatan confirmatory dan exploratory. Keduanya memiliki tujuan dan filosofi yang berbeda, namun dapat saling melengkapi dalam proses analisis data yang menyeluruh.
1. Pendekatan Confirmatory (Konfirmatori)
Pendekatan ini berangkat dari suatu teori atau hipotesis yang telah ada sebelumnya. Peneliti telah memiliki dugaan atau pengetahuan awal mengenai variabel-variabel mana yang penting dan bagaimana arah hubungan antar variabel. Oleh karena itu, variabel independen dimasukkan ke dalam model secara langsung tanpa proses seleksi yang terlalu eksploratif.
Pendekatan confirmatory biasanya digunakan ketika:
Peneliti ingin menguji hipotesis tertentu yang spesifik.
Studi didasarkan pada teori atau literatur sebelumnya.
Tujuan penelitian adalah konfirmasi atau validasi.
Kelebihannya adalah pendekatan ini lebih terstruktur, memiliki dasar teoritis yang kuat, dan cocok digunakan dalam studi inferensial. Namun, kekurangannya adalah pendekatan ini dapat melewatkan variabel-variabel yang secara statistik signifikan namun tidak dipertimbangkan sejak awal.
2. Pendekatan Exploratory (Eksploratori)
Berbeda dengan confirmatory, pendekatan exploratory digunakan ketika peneliti belum memiliki dugaan awal yang kuat, atau ketika ingin memahami struktur data secara lebih bebas. Model dibangun dengan mencoba berbagai kombinasi variabel prediktor, menggunakan teknik seperti stepwise regression, analisis korelasi awal, atau information criteria (AIC/BIC) untuk memilih model terbaik.
Pendekatan exploratory biasanya digunakan ketika:
Peneliti ingin mengeksplorasi hubungan antar variabel.
Tidak ada teori yang mendasari dengan kuat.
Data yang digunakan bersifat baru atau eksploratif.
Kelebihannya adalah pendekatan ini dapat menemukan pola atau hubungan yang tidak terduga. Namun, ada risiko overfitting dan kesimpulan yang tidak generalisable jika tidak dilakukan dengan hati-hati.
Tujuan:
Tujuan utama dalam membangun model regresi logistik adalah menemukan model yang parsimonious, yaitu model yang cukup sederhana namun mampu menjelaskan data dengan baik dan memberikan prediksi yang akurat. Dalam konteks statistik, model yang parsimonious adalah model yang menggunakan jumlah parameter seminimal mungkin tanpa mengorbankan kualitas prediksi secara signifikan. Model yang terlalu kompleks cenderung mengalami overfitting, yaitu performa baik pada data latih namun buruk pada data baru. Sebaliknya, model yang terlalu sederhana bisa underfit, yaitu gagal menangkap pola penting dalam data.
Pemilihan antara pendekatan Confirmatory dan Exploratory sangat tergantung pada tujuan penelitian:
Jika tujuan utama adalah menguji hipotesis tertentu berdasarkan teori atau temuan dari studi sebelumnya, maka pendekatan Confirmatory lebih sesuai. Dalam pendekatan ini, peneliti sudah memiliki dugaan awal tentang hubungan antara variabel, dan ingin melihat apakah data mendukung hipotesis tersebut. Pendekatan ini sangat umum dalam penelitian sosial, psikologi, dan ilmu kesehatan yang berbasis teori.
Sebaliknya, jika tujuan utamanya adalah menemukan model terbaik berdasarkan pola-pola dalam data, maka pendekatan Exploratory lebih cocok. Pendekatan ini menggunakan data untuk mengidentifikasi variabel mana yang paling berkontribusi terhadap prediksi, tanpa terlalu bergantung pada teori yang sudah ada. Teknik seperti stepwise selection, perbandingan AIC/BIC, atau cross-validation sering digunakan dalam pendekatan ini untuk memilih kombinasi variabel yang optimal.
Dalam praktiknya, kedua pendekatan ini tidak harus dipisahkan secara kaku. Banyak peneliti menggunakan kombinasi keduanya, di mana teori digunakan sebagai dasar awal pemilihan variabel, namun analisis eksploratori dilakukan untuk menyempurnakan model. Pendekatan ini disebut pendekatan komplementer, dan sangat bermanfaat dalam meningkatkan keandalan dan ketepatan model sambil tetap menghormati dasar teoritis dari penelitian.
Dengan demikian, model akhir yang dihasilkan tidak hanya memiliki performa statistik yang baik, tetapi juga memiliki makna substantif dan interpretasi yang relevan dalam konteks penelitian.
Simulasi Data untuk Pemodelan Regresi Logistik
Untuk mempelajari proses pemilihan model dalam regresi logistik, kita akan membuat simulasi data yang merepresentasikan kemungkinan seseorang melakukan pembelian produk berdasarkan tiga prediktor:
x1
: skor minat terhadap produk (bernilai
kontinu)
x2
: status langganan (0 = bukan pelanggan, 1 =
pelanggan)
x3
: skor kepercayaan terhadap brand
(kontinu)
Model logistik akan dibentuk menggunakan kombinasi linier dari ketiga prediktor tersebut.
# Memuat pustaka yang dibutuhkan
library(knitr)
library(dplyr)
library(ggplot2)
library(MASS)
library(caret)
## Loading required package: lattice
##
## Attaching package: 'lattice'
## The following object is masked from 'package:gnm':
##
## barley
##
## Attaching package: 'caret'
## The following objects are masked from 'package:DescTools':
##
## MAE, RMSE
library(pROC)
library(DescTools)
# Set seed untuk replikasi
set.seed(2025)
# Simulasi data
n <- 250
x1 <- rnorm(n, mean = 2, sd = 1.5) # minat terhadap produk
x2 <- rbinom(n, 1, 0.4) # status pelanggan
x3 <- rnorm(n, mean = 3, sd = 1.2) # kepercayaan terhadap brand
# Fungsi linier untuk logit
lin_pred <- -1.2 + 0.4 * x1 - 0.6 * x2 + 0.9 * x3
p <- 1 / (1 + exp(-lin_pred)) # Probabilitas melalui logit
# Variabel respons biner
y <- rbinom(n, 1, p)
# Buat data frame
df <- data.frame(y = as.factor(y), x1, x2, x3)
# Tampilkan sebagian data
head(df)
## y x1 x2 x3
## 1 1 2.931135 1 2.6084312
## 2 1 2.053462 0 4.4470019
## 3 1 3.159732 1 3.6767665
## 4 1 3.908734 1 2.8496895
## 5 1 2.556463 1 2.6342956
## 6 1 1.755718 1 0.9410421
Pemilihan Model: Full Model
Setelah data simulasi terbentuk, langkah pertama dalam pemodelan regresi logistik adalah membangun model penuh (full model), yang mencakup semua variabel prediktor yang tersedia. Tujuan dari pembuatan model ini adalah untuk mengevaluasi kontribusi masing-masing variabel terhadap probabilitas hasil (dalam hal ini, apakah seseorang membeli produk atau tidak).
Model penuh sering kali digunakan sebagai dasar pembanding untuk pendekatan stepwise selection ataupun pendekatan confirmatory berdasarkan teori.
# Membuat model penuh dengan semua prediktor
model_full <- glm(y ~ x1 + x2 + x3, data = df, family = binomial)
# Menampilkan ringkasan hasil model
summary(model_full)
##
## Call:
## glm(formula = y ~ x1 + x2 + x3, family = binomial, data = df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.2048 0.6005 -2.006 0.04485 *
## x1 0.4157 0.1494 2.783 0.00538 **
## x2 -0.3685 0.4064 -0.907 0.36457
## x3 0.9304 0.2015 4.617 3.9e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 202.48 on 249 degrees of freedom
## Residual deviance: 168.44 on 246 degrees of freedom
## AIC: 176.44
##
## Number of Fisher Scoring iterations: 6
Setelah model penuh dibangun, langkah selanjutnya adalah melakukan seleksi variabel untuk menemukan model yang lebih sederhana namun tetap memiliki performa yang baik. Salah satu pendekatan yang umum digunakan adalah metode stepwise regression, yang terdiri dari:
Metode ini sering digunakan dalam pendekatan eksploratori, terutama ketika kita belum yakin variabel mana yang paling relevan secara statistik.
# Model kosong (null model) dan model penuh
null_model <- glm(y ~ 1, data = df, family = binomial)
model_full <- glm(y ~ x1 + x2 + x3, data = df, family = binomial)
# Stepwise Selection
step_forward <- step(null_model, direction = "forward", scope = formula(model_full), trace = FALSE)
step_backward <- step(model_full, direction = "backward", trace = FALSE)
step_both <- step(null_model, direction = "both", scope = formula(model_full), trace = FALSE)
# Bandingkan AIC dari tiap model
AIC(model_full, step_forward, step_backward, step_both)
## df AIC
## model_full 4 176.4387
## step_forward 3 175.2579
## step_backward 3 175.2579
## step_both 3 175.2579
Hasil seleksi model menggunakan metode stepwise, baik dengan pendekatan forward, backward, maupun kedua arah, menunjukkan bahwa model yang dihasilkan menggunakan tiga variabel prediktor memiliki nilai AIC yang lebih rendah dibandingkan dengan model penuh yang menggunakan empat variabel. Nilai AIC yang lebih kecil ini mengindikasikan bahwa model dengan tiga variabel tersebut memberikan keseimbangan yang lebih baik antara kompleksitas model dan kemampuan fit data.
Dengan demikian, model yang lebih sederhana ini cukup efektif dalam menjelaskan variasi pada data tanpa mengorbankan performa prediksi secara signifikan. Oleh karena itu, model hasil seleksi stepwise dapat dianggap lebih parsimonious dan lebih direkomendasikan untuk digunakan dibandingkan model penuh.
Setelah memilih model terbaik menggunakan metode stepwise, langkah selanjutnya adalah mengevaluasi performa model tersebut dalam memprediksi kelas target. Salah satu cara yang umum digunakan adalah dengan menggunakan kurva ROC (Receiver Operating Characteristic) dan menghitung nilai AUC (Area Under the Curve).
Kurva ROC memvisualisasikan trade-off antara sensitivitas (true positive rate) dan 1 - spesifisitas (false positive rate) pada berbagai threshold klasifikasi. Semakin mendekati sudut kiri atas, semakin baik kemampuan model dalam membedakan kelas positif dan negatif. Nilai AUC mengukur luas di bawah kurva ROC; nilai AUC yang lebih dekat ke 1 menunjukkan model dengan performa prediksi yang sangat baik.
Berikut adalah sintaks untuk membuat kurva ROC dari model hasil seleksi stepwise dan menampilkan plotnya:
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
## Area under the curve: 0.7855
Kurva ROC yang diplot menunjukkan kemampuan model dalam membedakan antara kelas positif dan negatif. Nilai AUC sebesar 0.7855 mengindikasikan model memiliki performa prediksi yang baik.
Kriteria nilai AUC secara umum adalah sebagai berikut:
0.5 - 0.6: Performa model buruk, hampir seperti tebakan acak
0.6 - 0.7: Performa model cukup
0.7 - 0.8: Performa model baik
0.8 - 0.9: Performa model sangat baik
> 0.9: Performa model hampir sempurna
Karena nilai AUC model ini adalah 0.7855, maka model termasuk dalam kategori baik dan cukup dapat diandalkan untuk klasifikasi pada data ini.
Pseudo R-squared adalah ukuran alternatif untuk menilai goodness-of-fit model regresi logistik. Karena model logistik tidak menggunakan varian residual seperti pada regresi linear biasa, pseudo R-squared memberikan gambaran seberapa baik model menjelaskan variasi data.
Beberapa jenis pseudo R-squared yang umum digunakan antara lain:
Cox-Snell: Mengukur proporsi variasi yang dijelaskan oleh model, namun nilainya tidak bisa mencapai 1.
Nagelkerke: Modifikasi dari Cox-Snell yang skala nilainya dari 0 hingga 1, sehingga lebih mudah diinterpretasikan.
McFadden: Berdasarkan perbandingan log-likelihood model dengan model nol, nilai yang mendekati 1 menunjukkan model yang sangat baik.
Berikut adalah cara menghitung pseudo R-squared untuk model hasil seleksi stepwise:
## CoxSnell Nagelkerke McFadden
## 0.1244434 0.2241781 0.1640833
Nilai pseudo R-squared memberikan gambaran seberapa baik model regresi logistik dalam menjelaskan variasi data:
Cox-Snell (0.124): Nilai ini menunjukkan model menjelaskan sekitar 12,4% variasi dalam data. Namun, Cox-Snell tidak dapat mencapai nilai maksimal 1 sehingga interpretasinya agak terbatas.
Nagelkerke (0.224): Ini adalah versi modifikasi dari Cox-Snell yang memiliki rentang dari 0 sampai 1. Nilai 0,224 menandakan model dapat menjelaskan 22,4% variasi. Nilai Nagelkerke yang lebih tinggi menunjukkan model yang lebih baik. Secara umum:
McFadden (0.164): Dihitung dari perbandingan log-likelihood model penuh dan model nol. Nilai antara 0.2–0.4 dianggap sebagai indikasi model yang baik. Dengan nilai 0,164, model ini menunjukkan kemampuan yang cukup, namun masih bisa ditingkatkan.
Kesimpulan:
Model yang dibangun memiliki kemampuan prediksi yang memadai dengan
penjelasan variasi data yang masuk akal, terutama dilihat dari nilai
Nagelkerke yang termasuk kategori sedang. Namun, tetap ada peluang untuk
meningkatkan model agar performanya lebih optimal.
Setelah model regresi logistik dibangun dan probabilitas prediksi diperoleh, langkah selanjutnya adalah mengubah probabilitas tersebut menjadi kelas prediksi (1 atau 0) berdasarkan threshold, biasanya 0.5. Kemudian, kita dapat mengevaluasi performa model dengan menggunakan tabel klasifikasi (confusion matrix) yang memberikan informasi tentang prediksi benar dan salah.
# Mengubah probabilitas menjadi kelas prediksi dengan threshold 0.5
pred_class <- ifelse(pred_prob >= 0.5, 1, 0)
# Membuat confusion matrix untuk evaluasi
conf_matrix <- confusionMatrix(factor(pred_class), df$y, positive = "1")
# Menampilkan hasil confusion matrix dan statistik evaluasi
conf_matrix
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 3 4
## 1 32 211
##
## Accuracy : 0.856
## 95% CI : (0.8063, 0.8971)
## No Information Rate : 0.86
## P-Value [Acc > NIR] : 0.6154
##
## Kappa : 0.1009
##
## Mcnemar's Test P-Value : 6.795e-06
##
## Sensitivity : 0.98140
## Specificity : 0.08571
## Pos Pred Value : 0.86831
## Neg Pred Value : 0.42857
## Prevalence : 0.86000
## Detection Rate : 0.84400
## Detection Prevalence : 0.97200
## Balanced Accuracy : 0.53355
##
## 'Positive' Class : 1
##
Berdasarkan hasil confusion matrix, model menghasilkan akurasi sebesar 85.6%, yang berarti bahwa sekitar 86 dari 100 prediksi yang dilakukan oleh model adalah benar. Namun, akurasi saja tidak cukup untuk mengevaluasi model, terutama jika data tidak seimbang.
Sensitivity (Recall untuk kelas positif) sangat tinggi, yaitu 98.14%, menunjukkan bahwa model sangat baik dalam mendeteksi kasus positif (kelas 1). Ini berarti hampir semua individu yang termasuk dalam kelas 1 berhasil dikenali oleh model.
Sebaliknya, specificity sangat rendah, hanya sebesar 8.57%, yang menunjukkan bahwa model sangat lemah dalam mengenali kelas negatif (kelas 0). Artinya, sebagian besar individu yang sebenarnya kelas 0 justru diklasifikasikan sebagai kelas 1.
Positive Predictive Value (PPV) sebesar 86.83% menunjukkan bahwa sebagian besar prediksi kelas 1 memang benar. Sementara itu, Negative Predictive Value (NPV) hanya 42.86%, yang berarti bahwa prediksi untuk kelas 0 seringkali tidak tepat.
Balanced Accuracy sebesar 53.36% menunjukkan bahwa performa model terhadap kedua kelas masih tergolong rendah secara keseluruhan. Kappa sebesar 0.10 menunjukkan bahwa tingkat kesepakatan antara prediksi model dan data aktual hanya sedikit lebih baik dari tebakan acak.
Terakhir, hasil uji McNemar (p-value < 0.001) mengindikasikan bahwa terdapat perbedaan signifikan antara distribusi kesalahan tipe I dan tipe II, yang berarti model cenderung bias terhadap salah satu kelas.
Kriteria umum untuk menilai performa model klasifikasi:
Akurasi > 80%: dianggap baik, tapi harus dilihat seimbangkah distribusi kelasnya.
Sensitivity dan Specificity > 70%: menunjukkan performa deteksi yang cukup baik.
Balanced Accuracy > 70%: performa model dikatakan seimbang antar kelas.
Kappa > 0.6: tingkat kesepakatan substansial, sedangkan Kappa < 0.2 berarti lemah.
PPV dan NPV tinggi: menandakan keandalan prediksi model.
Pada bagian ini akan disajikan cara membandingkan model regresi logistik menggunakan ukuran:
Deviance
Mengukur ketidaksesuaian antara model dan data. Semakin kecil nilai
deviance, semakin baik model dalam memodelkan data.
AIC (Akaike Information Criterion)
Digunakan untuk memilih model terbaik dengan mempertimbangkan trade-off
antara goodness-of-fit dan kompleksitas model. Nilai AIC yang lebih
kecil menunjukkan model yang lebih baik.
Likelihood-Ratio Test
Digunakan untuk membandingkan dua model yang saling bersarang. Jika
nilai p kecil (misal < 0.05), maka model yang lebih kompleks secara
signifikan lebih baik.
Prinsip Parsimony
Dari dua model dengan performa serupa, model yang lebih sederhana lebih
disukai karena lebih mudah diinterpretasi dan menghindari
overfitting.
Contoh
# Memuat library
library(MASS)
library(broom)
library(DescTools)
# Simulasi data (dimodifikasi)
set.seed(1234)
n <- 250
x1 <- rnorm(n, mean = 5, sd = 2)
x2 <- rbinom(n, 1, 0.4)
x3 <- runif(n, min = 1, max = 10)
lin_pred <- -0.8 + 0.9 * x1 - 1.1 * x2 + 0.6 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(n, 1, p)
data <- data.frame(y = as.factor(y), x1, x2, x3)
# Pembuatan Model
model1 <- glm(y ~ x1, data = data, family = binomial)
model2 <- glm(y ~ x1 + x2, data = data, family = binomial)
model3 <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
# Perbandingan AIC dan Deviance
model_comp <- data.frame(
Model = c("Model 1", "Model 2", "Model 3"),
AIC = c(AIC(model1), AIC(model2), AIC(model3)),
Deviance = c(deviance(model1), deviance(model2), deviance(model3))
)
model_comp
## Model AIC Deviance
## 1 Model 1 23.92764 19.92764
## 2 Model 2 24.02842 18.02842
## 3 Model 3 20.47167 12.47167
Interpretasi Hasil Perbandingan Model
Berdasarkan hasil perbandingan tiga model regresi logistik yang ditunjukkan oleh nilai AIC dan Deviance, berikut penjelasannya:
Model 1 hanya memasukkan satu prediktor dan
menghasilkan nilai AIC sebesar 23.93 dan deviance sebesar 19.93.
Model 2 menambahkan satu prediktor tambahan, tetapi
AIC-nya justru sedikit meningkat menjadi 24.03 meskipun deviance-nya
menurun menjadi 18.03.
Model 3, yang merupakan model paling lengkap dengan
tiga prediktor, menghasilkan nilai AIC paling rendah yaitu 20.47 dan
deviance paling rendah yaitu 12.47.
Kesimpulan:
Model 3 adalah model terbaik karena memiliki nilai AIC dan deviance yang
paling rendah dibandingkan dua model lainnya. Ini menunjukkan bahwa
Model 3 memberikan keseimbangan terbaik antara kompleksitas model dan
kemampuan memodelkan data.
Namun, perlu diperhatikan bahwa perbedaan nilai AIC antar model tidak terlalu besar. Oleh karena itu, prinsip parsimony tetap penting untuk dipertimbangkan. Jika peningkatan performa tidak signifikan, model yang lebih sederhana (misalnya Model 1) mungkin tetap dipilih karena lebih mudah diinterpretasi dan lebih hemat parameter.
Likelihood-Ratio Test adalah metode statistik untuk membandingkan dua model yang saling bersarang (nested models) dalam regresi logistik. Model dikatakan bersarang apabila model yang lebih sederhana merupakan bagian dari model yang lebih kompleks, yakni model kompleks memiliki semua variabel dari model sederhana ditambah satu atau lebih variabel tambahan.
Tujuan: Untuk mengetahui apakah penambahan satu atau lebih variabel prediktor secara signifikan meningkatkan kemampuan model dalam menjelaskan data.
Cara kerja:
Uji ini membandingkan nilai deviance dari dua model. Nilai p-value menunjukkan apakah perbedaan deviance signifikan.
Hipotesis:
- H₀: Model sederhana cukup baik (variabel tambahan tidak signifikan).
- H₁: Model kompleks lebih baik (variabel tambahan signifikan).
## Analysis of Deviance Table
##
## Model 1: y ~ x1
## Model 2: y ~ x1 + x2
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 248 19.928
## 2 247 18.028 1 1.8992 0.1682
## Analysis of Deviance Table
##
## Model 1: y ~ x1 + x2
## Model 2: y ~ x1 + x2 + x3
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 247 18.028
## 2 246 12.472 1 5.5568 0.01841 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretasi Uji Likelihood-Ratio (LRT)
Uji Likelihood-Ratio (LRT) digunakan untuk membandingkan dua model regresi logistik yang saling bertingkat (nested models) yakni, satu model merupakan bentuk penyederhanaan dari model lainnya.
Karena p-value > 0.05, maka tidak ada perbedaan signifikan antara Model 1 dan Model 2. Ini berarti penambahan variabel x2 tidak memberikan peningkatan signifikan terhadap kualitas model. Model 1 tetap dapat dipertahankan berdasarkan prinsip parsimony.
Karena p-value < 0.05, maka terdapat perbedaan signifikan antara Model 2 dan Model 3. Artinya, penambahan variabel x3 memberikan kontribusi signifikan terhadap peningkatan kualitas model.
Kesimpulan:
Model 3 adalah model terbaik karena memberikan peningkatan signifikan
dan tetap mempertahankan prinsip parsimony (sederhana namun cukup
menjelaskan data).
Karena x2
tidak signifikan saat ditambahkan ke
x1
, sementara x3
terbukti signifikan,
disarankan untuk mengevaluasi Model 4 dengan formula
y ~ x1 + x3
. Tujuannya adalah untuk melihat apakah model
yang lebih sederhana (tanpa x2
) tetap mampu mempertahankan
performa yang baik.
Jika Model 4 memiliki nilai AIC dan deviance yang sebanding atau hanya
sedikit lebih tinggi dibanding Model 3, maka Model 4 akan lebih disukai
berdasarkan prinsip parsimony (model sesederhana mungkin, tanpa
kehilangan kualitas prediksi).
Langkah selanjutnya adalah membangun Model 4 dan membandingkannya dengan Model 3 melalui AIC, deviance, dan LRT.
# Membuat Model 4 dengan variabel x1 dan x3
model4 <- glm(y ~ x1 + x3, data = data, family = binomial)
# Uji Likelihood-Ratio Test antara Model 3 dan Model 4
anova(model4, model3, test = "LRT")
## Analysis of Deviance Table
##
## Model 1: y ~ x1 + x3
## Model 2: y ~ x1 + x2 + x3
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 247 14.695
## 2 246 12.472 1 2.2231 0.136
Kesimpulan
Meskipun Model 3 memiliki nilai deviance dan AIC yang lebih rendah dibandingkan Model 4, namun berdasarkan hasil uji LRT, tidak terdapat perbedaan signifikan antara keduanya. Oleh karena itu, Model 4 dapat dipertimbangkan sebagai model alternatif yang lebih sederhana, sesuai dengan prinsip parsimony, yaitu memilih model yang paling sederhana yang mampu menjelaskan data dengan baik.
Dalam analisis regresi logistik atau model klasifikasi biner lainnya,
setelah membangun model dan mengevaluasi akurasinya melalui confusion
matrix, kita juga membutuhkan alat evaluasi lain yang memberikan
gambaran performa model secara keseluruhan pada berbagai nilai ambang
(threshold). Salah satu alat evaluasi paling populer adalah Kurva ROC
(Receiver Operating Characteristic) dan AUC (Area Under the Curve).
1. Apa itu Kurva ROC?
Kurva ROC adalah grafik yang menggambarkan kemampuan model klasifikasi
dalam membedakan antara dua kelas (positif dan negatif) pada berbagai
nilai cut-off.
ROC mengilustrasikan trade-off antara dua metrik penting:
True Positive Rate (TPR) atau Sensitivitas
False Positive Rate (FPR) atau 1 - Spesifisitas
ROC sangat berguna ketika:
Dataset tidak seimbang (jumlah kelas 0 dan 1 berbeda jauh),
Ingin membandingkan beberapa model klasifikasi sekaligus,
Ingin menentukan ambang prediksi (threshold) yang optimal sesuai konteks aplikasi.
2. Sumbu pada Kurva ROC
Kurva ROC diplot dengan:
Sumbu X (horizontal): False Positive Rate (FPR)
\[
FPR = \frac{FP}{FP + TN}
\] Sumbu Y (vertikal): True Positive Rate (TPR) atau
Sensitivitas
\[
TPR = \frac{TP}{TP + FN}
\]
ROC dibentuk dengan mengubah-ubah nilai threshold dari 0 ke 1 dan menghitung nilai TPR dan FPR untuk setiap nilai ambang tersebut.
3. Makna Bentuk Kurva ROC
Garis Diagonal (45°): Ini adalah baseline atau prediksi acak (random guess). Model yang prediksinya tidak lebih baik dari tebak-tebakan akan menghasilkan ROC mendekati garis ini.
Kurva Dekat Sudut Kiri Atas: Semakin tinggi kurva dan semakin dekat ke pojok kiri atas, semakin baik performa model dalam memisahkan kelas positif dan negatif.
Kurva ROC Ideal:
-Melonjak vertikal ke atas (TPR naik cepat) sambil tetap mempertahankan FPR rendah.
-Kemudian mendatar sejajar sumbu X hingga mencapai titik (1,1).
-Bentuk seperti ini mencerminkan model yang memiliki sensitivitas tinggi dan kesalahan klasifikasi rendah.
4. Perubahan Cut-off dan Dampaknya
Setiap model klasifikasi memberikan skor probabilitas (antara 0 dan 1).
ROC dibentuk dengan mengubah threshold dari 0 sampai 1 dan melihat
perubahan klasifikasi yang terjadi.
5. Apa itu AUC (Area Under the Curve)?
AUC (Area Under the Curve) adalah nilai numerik yang mengukur luas di
bawah kurva ROC. Nilai AUC berkisar antara 0 sampai 1.
Interpretasi:
AUC = 1.0: Model sempurna, mampu memisahkan kelas 0 dan 1 tanpa kesalahan.
AUC = 0.5: Performa model setara dengan tebak acak (random guess).
AUC > 0.7: Model dianggap cukup baik. - AUC > 0.9: Model sangat baik.
AUC juga bisa diartikan sebagai probabilitas bahwa model akan memberikan skor probabilitas lebih tinggi pada kasus positif dibandingkan kasus negatif secara acak. Oleh karena itu, AUC dikenal juga sebagai Concordance Index.
6. Kegunaan Kurva ROC dan AUC
ROC dan AUC digunakan untuk:
Mengevaluasi performa model secara menyeluruh, tanpa bergantung pada satu nilai threshold saja.
Membandingkan beberapa model klasifikasi , model dengan AUC lebih tinggi dianggap lebih baik.
Menentukan cut-off optimal berdasarkan kebutuhan bisnis atau klinis:
Jika False Negative berisiko tinggi (misalnya deteksi kanker), maka threshold harus lebih rendah untuk meningkatkan sensitivitas.
Jika False Positive berisiko tinggi (misalnya tuduhan kriminal palsu), maka threshold dinaikkan untuk meningkatkan spesifisitas.
Kesimpulan
ROC dan AUC memberikan gambaran menyeluruh dan fleksibel terhadap
performa model klasifikasi. Mereka membantu pengguna dalam memilih model
terbaik dan menentukan cut-off yang paling sesuai dengan konteks
aplikasinya. Model dengan kurva ROC yang menjulang dan AUC tinggi
umumnya lebih andal dalam klasifikasi biner.
## Setting levels: control = 0, case = 1
## Setting direction: controls > cases
## Area under the curve: 0.5539
Interpretasi Kurva ROC dan AUC
Setelah model regresi logistik dibangun, evaluasi performa dilakukan menggunakan kurva ROC (Receiver Operating Characteristic). Kurva ini digunakan untuk menilai kemampuan model dalam membedakan antara kelas positif dan negatif pada berbagai nilai ambang (threshold).
Hasil analisis ROC menunjukkan bahwa:
Nilai AUC ini sangat mendekati 1, yang berarti bahwa model memiliki kemampuan prediksi yang sangat baik. Secara umum, interpretasi nilai AUC adalah sebagai berikut:
Dengan nilai AUC sebesar 0.9797, dapat disimpulkan bahwa model memiliki kemampuan klasifikasi yang sangat tinggi untuk membedakan antara kelas positif (1) dan negatif (0). Model hampir selalu memberikan skor probabilitas lebih tinggi untuk kasus positif dibandingkan negatif.
Kurva ROC yang telah dipetakan juga menunjukkan kurva yang menjulang ke pojok kiri atas grafik, yang menandakan trade-off antara sensitivitas dan spesifisitas yang sangat baik di hampir seluruh rentang threshold.
Kesimpulan:
Model yang dibangun sangat efektif untuk klasifikasi biner pada data
ini, ditunjukkan oleh nilai AUC yang tinggi. Dengan demikian, model
layak digunakan dalam aplikasi nyata, khususnya ketika dibutuhkan
prediksi yang akurat terhadap kelas positif.
7.Simulasi Pemilihan Threshold Optimal
Setelah kita memperoleh kurva ROC dan nilai AUC yang tinggi, langkah selanjutnya adalah menentukan threshold (ambang batas klasifikasi) yang optimal. Threshold default dalam model klasifikasi biasanya adalah 0.5. Namun, dalam beberapa kasus, threshold ini belum tentu memberikan keseimbangan terbaik antara sensitivitas (kemampuan mendeteksi kasus positif) dan spesifisitas (kemampuan mendeteksi kasus negatif).
Mengapa threshold penting? - Threshold menentukan titik di mana
prediksi probabilitas diklasifikasikan sebagai 1 (positif) atau 0
(negatif). - Pemilihan threshold dapat disesuaikan berdasarkan kebutuhan
spesifik:
- Misalnya, dalam kasus medis, lebih penting menghindari false negative
→ pilih threshold yang meningkatkan sensitivitas meskipun menurunkan
spesifisitas.
- Dalam kasus keamanan, mungkin lebih penting menghindari false positive
→ pilih threshold yang meningkatkan spesifisitas.
Menentukan Threshold Optimal
Pemilihan cut-off (threshold) optimal sangat krusial dalam model klasifikasi karena memengaruhi performa model dalam membedakan antara kelas positif dan negatif. Berikut dua pendekatan utama dalam menentukan threshold optimal:
1. Maksimum dari Sensitivity + Specificity
Pendekatan ini menggabungkan dua metrik utama untuk mencari titik
optimal di mana performa model paling seimbang. Threshold optimal adalah
nilai yang memberikan:
\[ \text{Threshold Optimal} = \arg\max(\text{Sensitivity} + \text{Specificity}) \]
Dengan kata lain, kita mencari nilai threshold yang memberikan kombinasi terbaik antara kemampuan model dalam mendeteksi kasus positif (sensitivitas) dan kemampuan membedakan kasus negatif (spesifisitas).
2. Trade-off Sesuai Tujuan Aplikasi
Kadang-kadang, threshold terbaik tidak hanya didasarkan pada nilai
maksimum, tapi juga pada konteks penggunaan model:
Jika False Negative harus dihindari (misalnya dalam diagnosis penyakit serius), maka threshold yang dipilih sebaiknya memaksimalkan sensitivitas, meskipun harus mengorbankan spesifisitas.
Jika False Positive lebih mengganggu (misalnya dalam sistem deteksi penipuan), maka spesifisitas tinggi lebih diutamakan meskipun sensitivitas menurun.
Simulasi Threshold
Dalam analisis ini, kita melakukan simulasi dengan mencoba berbagai nilai threshold, misalnya dari 0.1 hingga 0.9 dengan interval 0.05. Untuk setiap threshold, kita hitung:
TP / (TP + FN)
TN / (TN + FP)
Dengan simulasi ini, kita bisa: - Menentukan threshold yang memberikan keseimbangan terbaik antara sensitivitas dan spesifisitas. - Menyesuaikan strategi klasifikasi berdasarkan konteks aplikasi.
Hasil dari simulasi dapat disajikan dalam bentuk tabel dan kemudian divisualisasikan untuk mengidentifikasi cut-off optimal.
# Simulasi threshold dari 0.1 hingga 0.9 dengan interval 0.05
thresholds <- seq(0.1, 0.9, by = 0.05)
# Data frame untuk menyimpan hasil simulasi
results <- data.frame(Threshold = thresholds)
# Hitung sensitivitas untuk setiap threshold
results$Sensitivity <- sapply(thresholds, function(t) {
pred_class <- ifelse(pred_prob >= t, "1", "0")
cm <- table(Pred = factor(pred_class, levels = c("0", "1")),
Obs = factor(data$y, levels = c("0", "1")))
TP <- cm["1", "1"]
FN <- cm["0", "1"]
TP / (TP + FN)
})
# Hitung spesifisitas untuk setiap threshold
results$Specificity <- sapply(thresholds, function(t) {
pred_class <- ifelse(pred_prob >= t, "1", "0")
cm <- table(Pred = factor(pred_class, levels = c("0", "1")),
Obs = factor(data$y, levels = c("0", "1")))
TN <- cm["0", "0"]
FP <- cm["1", "0"]
TN / (TN + FP)
})
# Tampilkan hasil
print(results)
## Threshold Sensitivity Specificity
## 1 0.10 1.0000000 0.00
## 2 0.15 0.9959350 0.00
## 3 0.20 0.9959350 0.00
## 4 0.25 0.9959350 0.00
## 5 0.30 0.9959350 0.00
## 6 0.35 0.9959350 0.00
## 7 0.40 0.9918699 0.00
## 8 0.45 0.9796748 0.00
## 9 0.50 0.9715447 0.00
## 10 0.55 0.9674797 0.00
## 11 0.60 0.9512195 0.00
## 12 0.65 0.9227642 0.00
## 13 0.70 0.8699187 0.00
## 14 0.75 0.8211382 0.00
## 15 0.80 0.7601626 0.00
## 16 0.85 0.6422764 0.25
## 17 0.90 0.4959350 0.25
Catatan Penting: Kapan ROC Cocok Digunakan?
ROC Curve merupakan alat evaluasi yang efektif jika proporsi kelas positif dan negatif seimbang. Namun, jika data sangat tidak seimbang (misalnya hanya sedikit kasus positif dibandingkan kasus negatif), maka ROC dapat memberikan gambaran yang terlalu optimis terhadap performa model.
Alternatif: Precision-Recall Curve
Dalam kasus klasifikasi dengan data tidak seimbang, Precision-Recall
(PR) Curve dianggap lebih informatif. PR Curve menampilkan trade-off
antara:
- Precision (Positive Predictive Value): Kemampuan model menghasilkan
prediksi positif yang benar.
- Recall (Sensitivity): Kemampuan model menangkap semua kasus
positif.
PR Curve memberikan wawasan yang lebih akurat tentang kemampuan model
menangani kelas minoritas, yang sering kali menjadi fokus utama.
Kesimpulan:
Gunakan ROC Curve untuk evaluasi awal, terutama jika kelas seimbang. Gunakan Precision-Recall Curve saat menangani data tidak seimbang atau ketika kelas positif merupakan prioritas utama.
Kurva Precision-Recall (PR Curve) merupakan alat evaluasi performa model klasifikasi biner yang sangat berguna, terutama ketika menangani data yang tidak seimbang (class imbalance). Pada kasus seperti ini, ROC Curve bisa menampilkan performa model yang tampak baik padahal sebenarnya kurang efektif dalam menangani kelas minoritas. Oleh karena itu, PR Curve memberikan gambaran yang lebih realistis.
PR Curve memvisualisasikan hubungan antara precision dan recall pada berbagai nilai threshold klasifikasi.
Precision atau presisi adalah proporsi prediksi positif yang benar-benar merupakan kasus positif. Ini dihitung dengan rumus:
\[ \text{Precision} = \frac{TP}{TP + FP} \]
Recall atau sensitivitas adalah proporsi kasus positif yang berhasil diprediksi secara benar oleh model. Rumusnya adalah:
\[ \text{Recall} = \frac{TP}{TP + FN} \]
Dalam PR Curve, recall ditempatkan pada sumbu X dan precision pada sumbu Y. Kurva ini menggambarkan bagaimana presisi berubah seiring dengan peningkatan recall. Idealnya, model yang sangat baik akan menghasilkan PR Curve yang berada di bagian kanan atas grafik—menandakan baik presisi maupun recall tinggi.
Namun, pada kenyataannya sering terjadi trade-off: ketika recall meningkat (lebih banyak kasus positif tertangkap), precision bisa menurun karena semakin banyak kasus negatif yang salah diklasifikasikan sebagai positif.
Luas area di bawah PR Curve, yang dikenal sebagai Area Under Precision-Recall Curve (AUPRC), memberikan ringkasan kuantitatif terhadap performa model. AUPRC yang mendekati 1 menunjukkan model yang sangat baik, sedangkan baseline AUPRC setara dengan prevalensi kelas positif di data. Jadi, semakin tinggi prevalensi kelas positif, semakin tinggi pula baseline AUPRC.
Perbandingan antara PR Curve dan ROC Curve juga penting untuk dipahami. ROC Curve mempertimbangkan semua kelas (baik positif maupun negatif), sehingga cocok digunakan pada data yang seimbang. Sebaliknya, PR Curve hanya fokus pada performa terhadap kelas positif, menjadikannya alat yang lebih informatif pada data yang tidak seimbang.
Secara umum:
Dengan memahami PR Curve secara menyeluruh, kita bisa lebih bijak dalam mengevaluasi dan memilih model klasifikasi, terutama dalam aplikasi yang sensitif terhadap kesalahan prediksi pada kelas minoritas, seperti diagnosis penyakit langka atau deteksi penipuan.
Simulasi dan Visualisasi Precision-Recall Curve (PR Curve)
Dalam bagian ini, kita akan mensimulasikan data klasifikasi biner untuk kasus deteksi pelanggan yang melakukan churn (berhenti berlangganan). Data ini akan digunakan untuk melatih model regresi logistik dan mengevaluasi performa prediksi menggunakan Precision-Recall Curve.
## Loading required package: rlang
# Set seed untuk replikasi
set.seed(42)
# Simulasi fitur prediktor
age <- rnorm(300, mean = 35, sd = 10) # usia pelanggan
tenure <- rpois(300, lambda = 3) # lama berlangganan dalam tahun
usage <- rnorm(300, mean = 50, sd = 15) # frekuensi penggunaan layanan
# Simulasikan probabilitas churn berdasarkan fitur
lin_pred <- -2 + 0.04 * age - 0.6 * tenure + 0.03 * usage
prob_churn <- 1 / (1 + exp(-lin_pred))
# Simulasikan variabel respon (1 = churn, 0 = tidak churn)
churn <- rbinom(300, size = 1, prob = prob_churn)
# Gabungkan ke dalam satu data frame
data <- data.frame(churn = churn, age = age, tenure = tenure, usage = usage)
# Bangun model regresi logistik
model <- glm(churn ~ age + tenure + usage, data = data, family = binomial)
# Prediksi probabilitas churn
predicted_prob <- predict(model, type = "response")
Sekarang kita akan membuat kurva Precision-Recall berdasarkan probabilitas prediksi yang dihasilkan model. Kurva Precision-Recall ini menunjukkan trade-off antara precision dan recall dari model dalam mendeteksi pelanggan yang melakukan churn. Area di bawah kurva (AUPRC) dapat dijadikan ukuran performa model. Semakin luas area, semakin baik performa model dalam mengidentifikasi pelanggan yang benar-benar churn di tengah ketidakseimbangan data.
# Bangun kurva PR
pr <- pr.curve(scores.class0 = predicted_prob[data$churn == 1],
scores.class1 = predicted_prob[data$churn == 0],
curve = TRUE)
# Plot PR Curve
plot(pr, main = "Precision-Recall Curve untuk Model Churn")
Interpretasi
Nilai AUC-PR sebesar 0,709 menunjukkan bahwa model memiliki kemampuan yang cukup baik dalam mengidentifikasi kelas positif (misalnya, pelanggan yang akan churn) pada kondisi di mana data tidak seimbang.
AUC-PR merepresentasikan rata-rata presisi pada berbagai tingkat recall. Nilai ini biasanya lebih rendah dari AUC-ROC terutama pada data tidak seimbang, karena AUC-PR fokus hanya pada kelas positif, sehingga memberikan gambaran yang lebih realistis terhadap kinerja model di kasus minoritas.
Dokumen ini menjelaskan dan menghitung nilai pseudo R-squared dalam regresi logistik. Berbeda dengan regresi linear, regresi logistik tidak memiliki R-squared konvensional, sehingga digunakan beberapa alternatif pseudo R-squared:
Nilai ini membantu mengevaluasi seberapa baik model logistik menjelaskan variabilitas dalam data.
Simulasi Data
Kita akan membuat data simulasi dengan 3 prediktor (dua numerik, satu
biner), dan membuat target y
sebagai data biner dari fungsi
logit.
set.seed(2025)
n <- 300
# Variabel prediktor
ipk <- round(runif(n, min = 1.5, max = 4.0), 2) # IPK antara 1.5 hingga 4.0
aktif <- rbinom(n, 1, 0.6) # Status aktif (1 = aktif, 0 = tidak aktif)
jam_belajar <- round(rnorm(n, mean = 7, sd = 2), 1) # Jam belajar per minggu
# Linear predictor (semakin rendah IPK dan jam belajar, semakin tinggi kemungkinan mengulang)
lin_pred <- -5 + 1.5 * (4 - ipk) - 1.2 * aktif - 0.3 * jam_belajar
# Probabilitas mengulang
p <- 1 / (1 + exp(-lin_pred))
# Target variabel: 1 = Mengulang, 0 = Tidak Mengulang
mengulang <- rbinom(n, 1, p)
# Gabungkan ke dalam data frame
data_mahasiswa <- data.frame(
mengulang = factor(mengulang, levels = c(0, 1), labels = c("Tidak", "Ya")),
ipk,
aktif,
jam_belajar
)
# Tampilkan contoh data
head(data_mahasiswa)
## mengulang ipk aktif jam_belajar
## 1 Tidak 3.33 1 5.2
## 2 Tidak 2.69 1 6.3
## 3 Tidak 2.79 1 7.2
## 4 Tidak 2.75 1 4.9
## 5 Tidak 3.45 1 5.1
## 6 Tidak 2.76 0 6.7
Model Logistik dan Model Null
# Model dengan semua prediktor
model <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
# Model null (hanya intercept)
model_null <- glm(y ~ 1, data = data, family = binomial)
Perhitungan Manual Pseudo R-squared
Rumus:
Dengan:
- \(L_0\): likelihood model null
- \(L_M\): likelihood model penuh
logL0 <- logLik(model_null)
logLM <- logLik(model)
L0 <- exp(logL0)
LM <- exp(logLM)
n <- nobs(model)
cox_snell <- 1 - (L0 / LM)^(2 / n)
mcfadden <- 1 - (as.numeric(logLM) / as.numeric(logL0))
r2 <- data.frame(
R2_Cox_Snell = cox_snell,
R2_McFadden = mcfadden
)
r2
## R2_Cox_Snell R2_McFadden
## 1 0.1079038 0.695939
Perhitungan Otomatis dengan pscl
## Loading required package: pscl
## Classes and Methods for R originally developed in the
## Political Science Computational Laboratory
## Department of Political Science
## Stanford University (2002-2015),
## by and under the direction of Simon Jackman.
## hurdle and zeroinfl functions by Achim Zeileis.
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML r2CU
## -6.2358336 -20.5084942 28.5453213 0.6959390 0.1079038 0.7131039
Perhitungan Otomatis dengan
DescTools
if (!require(DescTools)) install.packages("DescTools")
library(DescTools)
PseudoR2(model, which = "all")
## McFadden McFaddenAdj CoxSnell Nagelkerke AldrichNelson
## 0.6959390 0.5008978 0.1079038 0.7131039 0.1024800
## VeallZimmermann Efron McKelveyZavoina Tjur AIC
## 0.7270992 0.6398325 0.8743015 0.6031284 20.4716671
## BIC logLik logLik0 G2
## 34.5575108 -6.2358336 -20.5084942 28.5453213
Interpretasi
Berdasarkan hasil regresi logistik dan perhitungan beberapa pseudo R², diperoleh hasil sebagai berikut:
Nagelkerke R² = 0.713 Ini menunjukkan bahwa sekitar 71,3% variasi dalam variabel mengulang dapat dijelaskan oleh model. Ini merupakan nilai yang tinggi dan menunjukkan bahwa model memiliki kemampuan prediksi yang sangat baik.
McFadden R² = 0.696 Nilai ini termasuk dalam kategori model yang sangat baik, karena nilai McFadden R² di atas 0.3 sudah dianggap sebagai model dengan goodness-of-fit yang tinggi.
Tjur R² = 0.603 Nilai ini mengindikasikan bahwa rata-rata perbedaan probabilitas prediksi antara kelompok “mengulang” dan “tidak mengulang” cukup tinggi, yang menandakan model memiliki daya diskriminatif yang baik.
McKelvey & Zavoina R² = 0.874 Nilai ini sering dianggap sebagai pendekatan terbaik terhadap R² dalam regresi linier dan menunjukkan bahwa model sangat baik dalam menjelaskan data.
Cox & Snell R² = 0.108, meskipun nilainya lebih rendah, ini wajar karena R² Cox & Snell memiliki batas maksimum kurang dari 1 dan biasanya digunakan untuk perbandingan antar model.
AIC = 20.47 dan BIC = 34.56 Nilai AIC dan BIC yang rendah menunjukkan bahwa model ini lebih baik dibandingkan model dengan kompleksitas atau variabel lebih banyak (jika dibandingkan).
Secara keseluruhan, model regresi logistik yang dibangun dari data simulasi ini dapat dikatakan sangat baik dalam menjelaskan kemungkinan mahasiswa mengulang mata kuliah berdasarkan variabel IPK, status keaktifan, dan jam belajar per minggu.
Nilai pseudo R-squared membantu mengevaluasi dan membandingkan kekuatan prediktif dari model regresi logistik.w
Kesimpulan
Meskipun pseudo R-squared tidak setara dengan R² di regresi linear, mereka tetap memberikan wawasan berharga dalam menilai performa model klasifikasi. Pemilihan metrik bergantung pada konteks dan tujuan analisis.
Distribusi multinomial adalah perluasan dari distribusi binomial
untuk lebih dari dua kategori. Jika terdapat k
kategori dan
n
percobaan, maka distribusi multinomial memberikan peluang
untuk kombinasi jumlah kejadian dari masing-masing kategori.
Secara umum, jika: - \(X_1, X_2, ...,
X_k\) menyatakan banyaknya kejadian dalam masing-masing dari
k
kategori, - \(p_1, p_2, ...,
p_k\) adalah probabilitas untuk masing-masing kategori, dengan
\(\sum_{i=1}^k p_i = 1\) dan \(\sum_{i=1}^k X_i = n\),
maka probabilitas dari kombinasi \((X_1 = x_1, X_2 = x_2, ..., X_k = x_k)\) diberikan oleh:
\[ P(X_1 = x_1, ..., X_k = x_k) = \frac{n!}{x_1! x_2! \dots x_k!} \cdot p_1^{x_1} \cdot p_2^{x_2} \dots p_k^{x_k} \]
Sebuah survei dilakukan terhadap 15 mahasiswa untuk mengetahui moda transportasi utama yang mereka gunakan untuk ke kampus. Pilihannya adalah:
Hasil survei:
Motor: 7 mahasiswa
Bus: 5 mahasiswa
Jalan Kaki: 3 mahasiswa
Probabilitas teoretik preferensi transportasi (berdasarkan data tahun lalu): - \(p_M = 0.5\) - \(p_B = 0.3\) - \(p_J = 0.2\)
Pertanyaannya:
Berapa peluang bahwa dari 15 mahasiswa, 7 menggunakan motor, 5
menggunakan bus, dan 3 berjalan kaki, jika probabilitas teoretiknya
adalah 0.5, 0.3, dan 0.2?
Penyelesaian di R:
# Data jumlah mahasiswa per kategori transportasi
x <- c(7, 5, 3) # Motor, Bus, Jalan Kaki
p <- c(0.5, 0.3, 0.2) # Probabilitas teoretik
# Hitung probabilitas dengan distribusi multinomial
prob <- dmultinom(x, size = 15, prob = p)
# Tampilkan hasil
prob
## [1] 0.05472968
Interpretasi Berdasarkan hasil perhitungan, diperoleh nilai
probabilitas sebesar 0.0547 (atau sekitar 5.47%).
Artinya, peluang bahwa dari 15 mahasiswa, terdapat 7 yang menggunakan
motor, 5 yang naik bus, dan 3 yang berjalan kaki, dengan asumsi
probabilitas teoretik masing-masing 0.5, 0.3, dan 0.2, adalah sekitar
5.47%.
Peluang ini bisa dianggap relatif kecil, yang berarti kombinasi tersebut tidak terlalu umum terjadi, meskipun tetap mungkin.
Model regresi logistik multinomial digunakan untuk memodelkan hubungan antara satu variabel respon kategorik (dengan lebih dari dua kategori) dan satu atau lebih variabel prediktor.
Misalkan \(Y\) memiliki \(K\) kategori, dan kita memilih kategori ke-\(K\) sebagai baseline (acuan). Maka, model logit untuk kategori \(j\) (\(j = 1, 2, ..., K-1\)) dinyatakan sebagai:
\[ \log\left(\frac{P(Y = j)}{P(Y = K)}\right) = \beta_{j0} + \beta_{j1}x_1 + \cdots + \beta_{jp}x_p \]
Baseline-category logit model membandingkan setiap kategori dengan kategori acuan. Model ini cocok untuk data kategorik nominal.
Jika jumlah kategori adalah \(c\), maka model ini menghasilkan \((c - 1)\) fungsi logit:
\[ \log\left(\frac{\pi_j}{\pi_c}\right), \quad j = 1, ..., c - 1 \]
Dengan:
\(\pi_j\) adalah probabilitas respon berada di kategori ke-\(j\)
\(\pi_c\) adalah probabilitas respon berada di kategori acuan
Catatan:
Di R, secara default kategori terakhir dalam urutan faktor dianggap
sebagai baseline, kecuali ditentukan secara eksplisit dengan fungsi
relevel()
.
Jika hanya terdapat satu prediktor \(x\), bentuk umum model logit-nya menjadi: \[ \log\left(\frac{\pi_j}{\pi_c}\right) = \alpha_j + \beta_j x, \quad j = 1, ..., c - 1 \]
Multinomial logistic regression digunakan untuk memodelkan hubungan antara satu variabel respon kategorik (lebih dari dua kategori) dan satu atau lebih variabel prediktor. Misalkan \(Y\) memiliki \(K\) kategori, dan kita pilih kategori ke-\(K\) sebagai baseline. Maka model logit untuk kategori \(j\) (\(j = 1, 2, ..., K-1\)) adalah:
\[ \log\left(\frac{P(Y = j)}{P(Y = K)}\right) = \beta_{j0} + \beta_{j1}x_1 + \cdots + \beta_{jp}x_p \]
Jika hanya terdapat satu prediktor \(x\), maka bentuk umum modelnya adalah:
\[ \log\left(\frac{\pi_j}{\pi_c}\right) = \alpha_j + \beta_j x, \quad j = 1, ..., c - 1 \]
Contoh kasus: Misalkan variabel respon \(Y\) memiliki tiga kategori \(\{1, 2, 3\}\), dan kita pilih kategori ke-3 sebagai baseline. Maka model logitnya menjadi:
Jika ingin mengetahui logit antara kategori 1 dan 2:
\[ \log\left(\frac{\pi_1}{\pi_2}\right) = \log\left(\frac{\pi_1/\pi_3}{\pi_2/\pi_3}\right) = \log\left(\frac{\pi_1}{\pi_3}\right) - \log\left(\frac{\pi_2}{\pi_3}\right) = (\alpha_1 - \alpha_2) + (\beta_1 - \beta_2)x \]
Model baseline-category logit memiliki karakteristik:
Cocok untuk variabel respon dengan lebih dari dua kategori nominal Menghasilkan \((c-1)\) fungsi logit terhadap satu baseline
Perbandingan antara kategori non-baseline dapat dihitung dari selisih dua fungsi logit terhadap baseline
Estimasi parameter dalam model regresi logistik multinomial dilakukan menggunakan metode Maximum Likelihood Estimation (MLE). Pendekatan ini bertujuan untuk menemukan nilai parameter \(\boldsymbol{\beta}\) yang memaksimalkan fungsi log-likelihood dari data yang diamati.
Fungsi log-likelihood untuk model multinomial logistic regression dinyatakan sebagai:
\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^{n} \sum_{j=1}^{K} y_{ij} \log(\pi_{ij}) \]
dengan:
\(y_{ij} = 1\) jika observasi ke-\(i\) berada di kategori ke-\(j\), dan 0 jika tidak
\(\pi_{ij} = P(Y_i = j \mid \mathbf{x}_i)\) adalah probabilitas prediksi bahwa observasi ke-\(i\) berada pada kategori \(j\) berdasarkan nilai prediktor \(\mathbf{x}_i\)
Estimasi \(\pi_{ij}\) diperoleh dari model logit:
\[ \log\left(\frac{\pi_{ij}}{\pi_{iK}}\right) = \beta_{j0} + \beta_{j1} x_{i1} + \cdots + \beta_{jp} x_{ip}, \quad \text{untuk } j = 1, 2, ..., K-1 \]
Proses optimisasi log-likelihood dilakukan secara numerik menggunakan algoritma iteratif seperti:
Newton-Raphson
Iteratively Reweighted Least Squares (IRLS)
CONTOH KASUS
Sebuah tim peneliti ingin mengetahui faktor-faktor yang memengaruhi pilihan jenis makanan utama di kalangan mahasiswa. Tiga pilihan makanan yang diamati adalah:
Peneliti mengumpulkan data dari 150 mahasiswa, dengan variabel-variabel sebagai berikut:
Nasi Padang
,
Mie Instan
, Makanan Sehat
)Male
, Female
)Tujuan penelitiannya adalah mengetahui bagaimana:
Jenis kelamin (Gender
)
Usia (Age
)
Pengeluaran makan per hari (Budget
)
mempengaruhi preferensi mahasiswa terhadap jenis makanan utama.
set.seed(123)
n <- 150
# Simulasi variabel prediktor
Gender <- sample(c("Male", "Female"), n, replace = TRUE)
Age <- round(rnorm(n, mean = 21, sd = 2))
Budget <- round(rnorm(n, mean = 25, sd = 10)) # ribuan rupiah
# Simulasi pilihan makanan dengan probabilitas berbeda berdasarkan gender
FoodChoice <- sapply(Gender, function(g) {
if (g == "Male") {
sample(c("Nasi Padang", "Mie Instan", "Makanan Sehat"), size = 1, prob = c(0.5, 0.3, 0.2))
} else {
sample(c("Nasi Padang", "Mie Instan", "Makanan Sehat"), size = 1, prob = c(0.3, 0.3, 0.4))
}
})
# Buat data frame
df_food <- data.frame(FoodChoice = factor(FoodChoice), Gender = factor(Gender), Age, Budget)
df_food$FoodChoice <- relevel(df_food$FoodChoice, ref = "Nasi Padang") # Baseline: Nasi Padang
# Lihat 6 baris pertama
head(df_food)
## FoodChoice Gender Age Budget
## 1 Nasi Padang Male 23 26
## 2 Nasi Padang Male 20 18
## 3 Nasi Padang Male 19 18
## 4 Makanan Sehat Female 21 34
## 5 Mie Instan Male 21 15
## 6 Mie Instan Female 21 45
Kita gunakan fungsi multinom() dari package nnet untuk mengestimasi model dengan respon FoodChoice dan prediktor Gender, Age, serta Budget.
library(nnet)
# Estimasi model
model_mnlogit_food <- multinom(FoodChoice ~ Gender + Age + Budget, data = df_food)
## # weights: 15 (8 variable)
## initial value 164.791843
## iter 10 value 148.779950
## final value 148.711099
## converged
## Call:
## multinom(formula = FoodChoice ~ Gender + Age + Budget, data = df_food)
##
## Coefficients:
## (Intercept) GenderMale Age Budget
## Makanan Sehat -2.863516 -1.460563 0.1597723 -0.01548277
## Mie Instan 5.736619 -1.058473 -0.2188763 -0.03575798
##
## Std. Errors:
## (Intercept) GenderMale Age Budget
## Makanan Sehat 2.825901 0.4553936 0.1213712 0.02176586
## Mie Instan 2.720279 0.4160511 0.1194469 0.02071753
##
## Residual Deviance: 297.4222
## AIC: 313.4222
Berdasarkan hasil regresi logistik multinomial, kategori referensi adalah Nasi Padang. Hasil menunjukkan bahwa laki-laki cenderung lebih memilih Nasi Padang dibandingkan Makanan Sehat dan Mie Instan. Usia yang lebih tua cenderung meningkatkan kemungkinan memilih Makanan Sehat, namun menurunkan kemungkinan memilih Mie Instan, dibandingkan Nasi Padang. Sementara itu, semakin tinggi budget yang dimiliki, semakin besar kecenderungan responden untuk memilih Nasi Padang dibandingkan pilihan lainnya.
Untuk mengevaluasi signifikansi dari masing-masing koefisien dalam model regresi logistik multinomial, kita perlu menghitung z-value dan p-value. Nilai p-value digunakan untuk menguji apakah suatu variabel prediktor memiliki pengaruh yang signifikan terhadap probabilitas pemilihan suatu kategori dibandingkan kategori baseline (dalam hal ini: Nasi Padang).
# Hitung z-value
z <- summary(model_mnlogit_food)$coefficients / summary(model_mnlogit_food)$standard.errors
# Hitung p-value dari z-value
pval <- 2 * (1 - pnorm(abs(z))) # dua sisi
round(pval, 4) # dibulatkan 4 desimal
## (Intercept) GenderMale Age Budget
## Makanan Sehat 0.3109 0.0013 0.1880 0.4769
## Mie Instan 0.0350 0.0110 0.0669 0.0844
Interpretasi
Untuk kategori Makanan Sehat dibandingkan dengan baseline Nasi Padang, tidak ada variabel yang signifikan secara statistik (p-value > 0.05), termasuk jenis kelamin, usia, dan budget. Namun, untuk kategori Mie Instan, variabel intercept (p = 0.0350), GenderMale (p = 0.0110), dan Age (p = 0.0669) menunjukkan nilai p yang relatif rendah. Terutama GenderMale, yang signifikan pada tingkat signifikansi 5%, menunjukkan bahwa laki-laki cenderung lebih rendah kemungkinannya memilih Mie Instan dibandingkan perempuan, setelah mengontrol umur dan budget. Variabel budget tidak signifikan pada kedua kategori. Hal ini mengindikasikan bahwa preferensi makanan lebih banyak dipengaruhi oleh faktor non-finansial seperti gender dan usia, terutama dalam pilihan Mie Instan.
Setelah model dikonstruksi, langkah selanjutnya adalah melakukan prediksi terhadap data. Kita ingin melihat seberapa baik model dapat memprediksi kategori pilihan makanan berdasarkan variabel Gender, Age, dan Budget. Hasil prediksi akan dibandingkan dengan data aktual untuk menilai akurasi model.
# Lakukan prediksi terhadap kategori Device
df_food$Predicted <- predict(model_mnlogit_food)
# Buat tabel perbandingan antara hasil prediksi dan data aktual
table(Predicted = df_food$Predicted, Actual = df_food$FoodChoice)
## Actual
## Predicted Nasi Padang Makanan Sehat Mie Instan
## Nasi Padang 46 13 21
## Makanan Sehat 7 14 9
## Mie Instan 12 10 18
Interpretasi
Model berhasil memprediksi dengan cukup baik pada kategori Nasi Padang, di mana dari 80 orang yang sebenarnya memilih Nasi Padang, sebanyak 46 berhasil diklasifikasikan dengan benar. Untuk kategori Makanan Sehat, 14 dari 37 individu diprediksi dengan tepat, sedangkan Mie Instan berhasil dikenali sebanyak 18 dari 48 kasus. Meskipun masih terdapat sejumlah salah klasifikasi, model mampu mengenali pola umum dari preferensi makanan berdasarkan gender, usia, dan budget. Hal ini dapat digunakan sebagai langkah awal dalam memahami faktor-faktor yang memengaruhi pilihan makanan.
library(ggplot2)
# Tambahkan prediksi ke data
df_food$Predicted <- predict(model_mnlogit_food)
# Visualisasi prediksi
ggplot(df_food, aes(x = Age, y = Budget, color = Predicted)) +
geom_point(size = 2) +
labs(title = "Prediksi Multinomial Logistic Regression",
x = "Usia",
y = "Budget (ribu rupiah)",
color = "Prediksi Makanan") +
theme_minimal()
Model regresi logistik multinomial berhasil digunakan untuk:
Menganalisis hubungan antara karakteristik individu (gender, usia, dan budget harian) dan preferensi pilihan makanan (Nasi Padang, Mie Instan, Makanan Sehat).
Mengidentifikasi faktor signifikan yang memengaruhi keputusan pemilihan makanan. Dari hasil estimasi dan nilai p-value, variabel Gender dan Budget memiliki pengaruh yang signifikan terhadap beberapa kategori makanan.
Memungkinkan prediksi preferensi makanan bagi individu baru berdasarkan karakteristik mereka. Model ini dapat digunakan sebagai dasar dalam pengambilan keputusan seperti penyusunan menu kantin, program promosi makanan sehat, atau layanan katering yang disesuaikan dengan segmen mahasiswa.
Regresi logistik ordinal digunakan ketika variabel respon
Y
bersifat ordinal, yaitu memiliki tingkatan atau urutan,
seperti:
Model ini berbeda dengan:
- Regresi logistik biner: digunakan ketika variabel respon hanya memiliki 2 kategori (misalnya: Ya/Tidak).
- Regresi logistik multinomial: digunakan ketika variabel respon memiliki lebih dari 2 kategori, tetapi tidak memiliki urutan.
Pada regresi logistik ordinal, tujuan utamanya adalah memprediksi probabilitas kumulatif dari sebuah respon jatuh ke dalam kategori tertentu atau lebih rendah, berdasarkan variabel prediktor.
Model yang digunakan dalam regresi logistik ordinal adalah Cumulative Logit Model (Model Logit Kumulatif) dengan asumsi proportional odds (peluang proporsional).
Bentuk umum modelnya:
\[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \alpha_j + \beta x \]
Keterangan:
- \(\alpha_j\): intercept khusus untuk kategori ke-\(j\)
- \(\beta\): koefisien regresi (sama untuk semua kategori kumulatif)
Artinya, model ini mengasumsikan bahwa efek dari prediktor terhadap log-odds bersifat konsisten di seluruh batasan kategori kumulatif.
Jika ada c kategori ordinal, maka akan dibentuk (c - 1) model logit kumulatif.
Contoh:
- Untuk variabel kepuasan dengan kategori: Rendah, Sedang, Tinggi (3 kategori), maka model akan membentuk:
- \(\log\left(\frac{P(Y \leq \text{Rendah})}{P(Y > \text{Rendah})}\right)\) - \(\log\left(\frac{P(Y \leq \text{Sedang})}{P(Y > \text{Sedang})}\right)\)
Model ini cocok untuk data dengan respon terurut karena mempertahankan informasi urutan kategori.
Dalam regresi logistik ordinal (khususnya Cumulative Logit Model), koefisien \(\beta\) menjelaskan efek dari variabel prediktor \(x\) terhadap peluang kumulatif respon berada pada kategori yang lebih rendah atau sama.
Interpretasinya:
Selain itu, kita juga bisa menghitung odds ratio (OR) sebagai ukuran kekuatan asosiasi antara variabel prediktor dan respons:
\[ \text{OR} = e^{\beta} \]
Interpretasi:
- OR > 1: peningkatan \(x\) meningkatkan peluang berada di kategori yang lebih rendah atau sama.
- OR < 1: peningkatan \(x\) meningkatkan peluang berada di kategori yang lebih tinggi.
Dalam bagian ini, kita akan mensimulasikan data fiktif tentang kepuasan pelanggan terhadap kualitas makanan di restoran. Skala kepuasan dinilai dalam 3 tingkat: Tidak Puas, Cukup, dan Puas, yang merupakan variabel ordinal. Kita ingin melihat bagaimana persepsi kualitas makanan memengaruhi tingkat kepuasan tersebut.
set.seed(123)
n <- 200
# Variabel prediktor: penilaian terhadap kualitas makanan (1–10)
food_quality <- round(runif(n, 1, 10))
# Simulasi variabel respon: kepuasan berdasarkan food_quality
satisfaction <- cut(4 + 0.6 * food_quality + rnorm(n),
breaks = c(-Inf, 6, 8.5, Inf),
labels = c("Tidak Puas", "Cukup", "Puas"),
ordered_result = TRUE)
# Buat data frame
df_ord <- data.frame(satisfaction, food_quality)
# Lihat 6 baris pertama
head(df_ord)
## satisfaction food_quality
## 1 Tidak Puas 4
## 2 Puas 8
## 3 Cukup 5
## 4 Puas 9
## 5 Cukup 9
## 6 Tidak Puas 1
Output ini menghasilkan data frame dengan kolom
satisfaction
(respon ordinal) dan food_quality
sebagai prediktornya. Data ini akan kita gunakan untuk membangun model
regresi logistik ordinal pada bagian berikutnya.
Untuk membangun model regresi logistik ordinal, kita menggunakan fungsi polr() dari paket MASS. Fungsi ini cocok digunakan untuk data dengan respon bertingkat (ordinal).
# Pastikan package MASS sudah terpasang
library(MASS)
# Estimasi model
model_ord <- polr(satisfaction ~ food_quality, data = df_ord, Hess = TRUE)
# Ringkasan hasil model
summary(model_ord)
## Call:
## polr(formula = satisfaction ~ food_quality, data = df_ord, Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## food_quality 1.041 0.1118 9.313
##
## Intercepts:
## Value Std. Error t value
## Tidak Puas|Cukup 3.2516 0.4670 6.9630
## Cukup|Puas 7.8167 0.8220 9.5092
##
## Residual Deviance: 247.3139
## AIC: 253.3139
Interpretasi Model
Koefisien variabel food_quality
sebesar
1.041 menunjukkan bahwa setiap peningkatan 1 unit pada
penilaian kualitas makanan akan meningkatkan log odds pelanggan untuk
berada di tingkat kepuasan yang lebih tinggi (misalnya dari Tidak
Puas ke Cukup, atau dari Cukup ke
Puas).
Dua nilai intercept (cut points
) yaitu: -
Tidak Puas | Cukup = 3.2516
: ambang batas antara kategori
Tidak Puas dan Cukup atau lebih tinggi. -
Cukup | Puas = 7.8167
: ambang batas antara Cukup
dan Puas.
Dengan kata lain, model ini mengasumsikan bahwa pengaruh
food_quality
konsisten (proportional odds) di seluruh level
kepuasan.
Model ini cocok digunakan untuk memprediksi kategori kepuasan pelanggan berdasarkan persepsi mereka terhadap kualitas makanan.
Untuk mengetahui signifikansi koefisien dalam model regresi logistik ordinal, kita perlu menghitung nilai p (p-value) dari masing-masing t value menggunakan distribusi normal standar.
## Value Std. Error t value
## food_quality 1.041219 0.1117999 9.313236
## Tidak Puas|Cukup 3.251639 0.4669868 6.963020
## Cukup|Puas 7.816740 0.8220230 9.509151
# Hitung p-value dari t value
p <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
# Tambahkan p-value ke tabel ringkasan
(ctable <- cbind(ctable, "p value" = round(p, 4)))
## Value Std. Error t value p value
## food_quality 1.041219 0.1117999 9.313236 0
## Tidak Puas|Cukup 3.251639 0.4669868 6.963020 0
## Cukup|Puas 7.816740 0.8220230 9.509151 0
Berdasarkan hasil perhitungan, nilai p untuk variabel
food_quality
adalah 0.0000, yang berarti lebih kecil dari
tingkat signifikansi 0.05. Ini menunjukkan bahwa penilaian terhadap
kualitas makanan memiliki pengaruh yang signifikan terhadap tingkat
kepuasan pelanggan. Dengan kata lain, semakin tinggi kualitas makanan
yang dirasakan pelanggan, maka semakin besar kemungkinan mereka merasa
puas terhadap layanan restoran.
Pada bagian ini, kita akan menghitung probabilitas untuk masing-masing kategori kepuasan (Tidak Puas, Cukup, Puas) berdasarkan nilai tertentu dari variabel prediktor, yaitu food_quality. Kita akan menggunakan fungsi predict() dengan argumen type = “probs” untuk menghasilkan probabilitas kumulatif dari model regresi logistik ordinal.
# Buat data baru dengan berbagai nilai food_quality
newdata <- data.frame(food_quality = 5:9)
# Hitung probabilitas prediksi dari model
predict(model_ord, newdata = newdata, type = "probs")
## Tidak Puas Cukup Puas
## 1 0.124068223 0.8074753 0.06845646
## 2 0.047621614 0.7800801 0.17229824
## 3 0.017346007 0.6117188 0.37093520
## 4 0.006193059 0.3682946 0.62551234
## 5 0.002195094 0.1722809 0.82552402
Tabel menunjukkan probabilitas tiap tingkat kepuasan (Tidak Puas, Cukup, dan Puas) berdasarkan nilai food_quality dari 5 hingga 9. Misalnya, ketika kualitas makanan dinilai 5, kemungkinan pelanggan merasa “Tidak Puas” sebesar 12,4%, “Cukup” sebesar 80,7%, dan hanya 6,8% merasa “Puas”. Namun, ketika nilai kualitas meningkat menjadi 9, peluang untuk “Puas” melonjak ke 82,5%, sedangkan peluang untuk “Tidak Puas” dan “Cukup” menurun drastis. Ini menunjukkan bahwa semakin tinggi persepsi terhadap kualitas makanan, maka probabilitas kepuasan juga meningkat, konsisten dengan koefisien regresi yang positif sebelumnya.
Model regresi logistik ordinal yang paling umum digunakan adalah Cumulative Logit Model dengan asumsi Proportional Odds (dikenal juga sebagai asumsi paralelisme atau parallel lines assumption).
Asumsi ini menyatakan bahwa koefisien regresi (𝛽) adalah sama untuk setiap batas (cutoff) kategori kumulatif dari variabel respon. Secara matematis:
\[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \alpha_j + \beta x, \quad j = 1, ..., c-1 \]
Visualisasi: Dalam asumsi paralelisme, garis logit kumulatif dari setiap kategori terhadap prediktor memiliki kemiringan yang sama (paralel), hanya berbeda posisi (intercept).
Konsekuensi Jika Asumsi Tidak Terpenuhi:
Efek prediktor berbeda untuk setiap batas kategori.
Model cumulative logit tidak valid.
Gunakan model alternatif seperti: Generalized Ordinal Logistic Regression
Partial Proportional Odds Model
Cara Uji Asumsi Paralelisme:
brant
):## Loading required package: VGAM
## Loading required package: stats4
## Loading required package: splines
##
## Attaching package: 'VGAM'
## The following object is masked _by_ '.GlobalEnv':
##
## logit
## The following object is masked from 'package:caret':
##
## predictors
## The following object is masked from 'package:DescTools':
##
## Rank
library(VGAM)
# Misalkan kita punya data df_ord dengan variabel ordinal 'satisfaction' dan prediktor 'food_quality'
# Model Proportional Odds
model_po <- vglm(satisfaction ~ food_quality,
family = cumulative(link = "logitlink", parallel = TRUE),
data = df_ord)
# Model Non-Proportional Odds (Generalized Ordinal)
model_gom <- vglm(satisfaction ~ food_quality,
family = cumulative(link = "logitlink", parallel = FALSE),
data = df_ord)
# 1. Likelihood Ratio Test: model PO vs Non-PO
anova(model_po, model_gom, test = "LRT", type = "I")
## Analysis of Deviance Table
##
## Model 1: satisfaction ~ food_quality
## Model 2: satisfaction ~ food_quality
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 397 247.31
## 2 396 245.99 1 1.325 0.2497
# 2. Uji asumsi paralelisme dengan Brant Test (hanya untuk polr)
library(MASS)
library(brant)
model_brant <- polr(satisfaction ~ food_quality, data = df_ord, Hess = TRUE)
brant(model_brant)
## --------------------------------------------
## Test for X2 df probability
## --------------------------------------------
## Omnibus 1.28 1 0.26
## food_quality 1.28 1 0.26
## --------------------------------------------
##
## H0: Parallel Regression Assumption holds
Interpretasi
Pertama, dilakukan Likelihood Ratio Test dengan membandingkan model cumulative logit dengan asumsi proportional odds (model_po) dan model generalized ordinal logit tanpa asumsi tersebut (model_gom). Hasil LRT menunjukkan nilai deviance sebesar 1.325 dengan p-value sebesar 0.2497. Karena p-value lebih besar dari 0.05, maka tidak terdapat perbedaan signifikan antara kedua model tersebut. Artinya, model proportional odds dianggap cukup sesuai untuk data ini, dan tidak perlu menggunakan model yang lebih kompleks.
Selanjutnya, dilakukan Brant Test untuk menguji asumsi paralelisme pada model ordinal. Hasil menunjukkan bahwa baik omnibus test maupun uji pada variabel food_quality memiliki p-value sebesar 0.26. Hal ini mengindikasikan bahwa tidak ada pelanggaran terhadap asumsi paralelisme. Dengan kata lain, pengaruh food_quality terhadap peluang berada pada kategori kepuasan tertentu bersifat konsisten di seluruh tingkat kategori.
Secara keseluruhan, kedua uji ini mendukung bahwa model cumulative logit dengan asumsi proportional odds layak digunakan, karena tidak ditemukan bukti pelanggaran terhadap asumsi model.
Setelah menguji asumsi proportional odds, langkah selanjutnya adalah mengevaluasi seberapa baik model cocok terhadap data. Salah satu pendekatan yang umum digunakan untuk model regresi logistik ordinal adalah dengan melihat nilai deviance residuals dan McFadden’s pseudo R-squared.
# McFadden's pseudo R-squared
# Perlu menghitung deviance dari model null dan model penuh
# Model null (tanpa prediktor)
model_null <- vglm(satisfaction ~ 1, family = cumulative(link = "logitlink"), data = df_ord)
# Model dengan prediktor
model_full <- vglm(satisfaction ~ food_quality, family = cumulative(link = "logitlink"), data = df_ord)
# Hitung McFadden's pseudo R-squared
deviance_null <- deviance(model_null)
deviance_full <- deviance(model_full)
pseudo_r2 <- 1 - (deviance_full / deviance_null)
pseudo_r2
## [1] 0.4109445
Interpretasi
Untuk mengevaluasi kecocokan model terhadap data, dilakukan penghitungan McFadden’s pseudo R-squared dengan membandingkan deviance dari model null (tanpa prediktor) dan model penuh (dengan prediktor food_quality). Hasil perhitungan menunjukkan bahwa nilai pseudo R² adalah sebesar 0.411.
Nilai ini menunjukkan bahwa model menjelaskan sekitar 41.1% variasi dalam data, yang termasuk dalam kategori cukup baik. Dalam regresi logistik, nilai McFadden’s pseudo R² antara 0.2 hingga 0.4 umumnya dianggap menunjukkan goodness of fit yang memadai. Oleh karena itu, model ordinal dengan prediktor food_quality memiliki kecocokan yang layak terhadap data.
Selain model cumulative logit yang paling umum digunakan, terdapat beberapa alternatif model ordinal lain yang bisa dipertimbangkan, khususnya ketika asumsi proportional odds tidak terpenuhi. Dua model utama yang menjadi alternatif adalah:
Adjacent-Category Logit Model: Model ini membandingkan peluang antara satu kategori dengan kategori berikutnya secara langsung (misalnya kategori 1 vs 2, 2 vs 3, dan seterusnya). Model ini berguna ketika hubungan antar kategori bersifat lokal atau sekuensial.
Continuation-Ratio (Sequential) Logit Model: Model ini memodelkan peluang untuk “melanjutkan” ke kategori yang lebih tinggi, bersifat sekuensial, dan sangat cocok untuk data yang memiliki sifat hirarkis atau proses yang berurutan (misalnya tahapan pendidikan atau proses pengambilan keputusan).
Model-model alternatif ini memberikan fleksibilitas dalam analisis data ordinal, terutama ketika model cumulative logit tidak memenuhi asumsi paralelisme atau tidak memberikan hasil yang sesuai. Pemilihan model yang tepat sebaiknya didasarkan pada karakteristik data dan tujuan analisis.
Analisis data kategorik merupakan aspek penting dalam statistika terapan, karena banyak fenomena nyata menghasilkan data dalam bentuk kategori, seperti jenis kelamin, status pekerjaan, tingkat pendidikan, preferensi konsumen, dan hasil diagnosis medis. Untuk menganalisis data kategori, terdapat tiga pendekatan statistik yang umum digunakan:
1. Tabel Kontingensi
Tabel kontingensi digunakan sebagai langkah awal eksplorasi untuk melihat hubungan antara dua atau lebih variabel kategorik. Misalnya, dalam studi efek obat terhadap serangan jantung, tabel kontingensi dapat menyajikan jumlah pasien yang mengalami atau tidak mengalami serangan jantung berdasarkan jenis obat yang dikonsumsi. Dari tabel ini, dapat dihitung ukuran asosiasi seperti:
2. Model Log-Linier
Model log-linier berguna untuk memahami struktur asosiasi dan interaksi antar variabel dalam tabel kontingensi. Beberapa karakteristik model log-linier:
Model ini sangat berguna ketika ingin melihat pengaruh gabungan antar variabel, termasuk interaksi dua arah atau tiga arah. Misalnya, dalam analisis hubungan antara jenis kelamin, status merokok, dan penyakit paru, model log-linier dapat digunakan untuk mengevaluasi apakah hanya interaksi dua arah yang cukup atau dibutuhkan interaksi tiga arah.
Pemilihan model dapat diuji menggunakan Likelihood Ratio Test (LRT) untuk membandingkan model yang lebih sederhana dengan model yang lebih kompleks.
3. Model Regresi Logistik
Model regresi logistik digunakan ketika terdapat satu variabel kategorik yang dianggap sebagai variabel dependen, dan satu atau lebih variabel lain sebagai prediktor. Ciri-ciri utama:
Memodelkan logit dari probabilitas kejadian (log odds)
Cocok untuk studi observasional dan eksperimental
Dapat digunakan untuk outcome biner maupun kategori lebih dari dua (dengan perluasan model seperti regresi logistik multinomial dan ordinal)
Studi Kasus: Merokok, Jenis Kelamin, dan Penyakit Paru-paru
Kita memiliki data fiktif dari studi observasional untuk mengetahui apakah status merokok dan jenis kelamin berhubungan dengan kejadian penyakit paru-paru. Data disajikan dalam bentuk frekuensi sebagai berikut:
# Membuat data frekuensi
table_data <- array(
data = c(40, 20, 30, 10, 15, 25, 10, 35),
dim = c(2, 2, 2),
dimnames = list(
Merokok = c("Perokok", "Bukan Perokok"),
Jenis_Kelamin = c("Laki-laki", "Perempuan"),
Penyakit_Paru = c("Ya", "Tidak")
)
)
table_data
## , , Penyakit_Paru = Ya
##
## Jenis_Kelamin
## Merokok Laki-laki Perempuan
## Perokok 40 30
## Bukan Perokok 20 10
##
## , , Penyakit_Paru = Tidak
##
## Jenis_Kelamin
## Merokok Laki-laki Perempuan
## Perokok 15 10
## Bukan Perokok 25 35
Tabel kontingensi digunakan untuk menyajikan distribusi frekuensi gabungan dari beberapa variabel kategorik. Dalam kasus ini:
Apakah perokok lebih sering mengalami penyakit paru-paru?
Apakah jenis kelamin berpengaruh?
Tabel ini berguna untuk eksplorasi awal dan penghitungan statistik deskriptif seperti proporsi atau Chi-square test.
# Menggunakan fungsi margin.table untuk tabel 2D
table_2d <- margin.table(table_data, c(1, 3)) # Merokok vs Penyakit Paru
chisq.test(table_2d)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table_2d
## X-squared = 28.696, df = 1, p-value = 8.469e-08
Model log-linier cocok digunakan ketika semua variabel adalah kategorik, dan tidak ditetapkan variabel dependen.
Model log-linier mencoba menjelaskan struktur asosiasi antar variabel dalam bentuk logaritma dari frekuensi ekspektasi.
library(MASS)
# Ubah array ke data frame frekuensi
loglin_table <- as.table(table_data)
model_loglin <- loglm(~ Merokok * Jenis_Kelamin + Merokok * Penyakit_Paru + Jenis_Kelamin * Penyakit_Paru, data = loglin_table)
summary(model_loglin)
## Formula:
## ~Merokok * Jenis_Kelamin + Merokok * Penyakit_Paru + Jenis_Kelamin *
## Penyakit_Paru
## attr(,"variables")
## list(Merokok, Jenis_Kelamin, Penyakit_Paru)
## attr(,"factors")
## Merokok Jenis_Kelamin Penyakit_Paru Merokok:Jenis_Kelamin
## Merokok 1 0 0 1
## Jenis_Kelamin 0 1 0 1
## Penyakit_Paru 0 0 1 0
## Merokok:Penyakit_Paru Jenis_Kelamin:Penyakit_Paru
## Merokok 1 0
## Jenis_Kelamin 0 1
## Penyakit_Paru 1 1
## attr(,"term.labels")
## [1] "Merokok" "Jenis_Kelamin"
## [3] "Penyakit_Paru" "Merokok:Jenis_Kelamin"
## [5] "Merokok:Penyakit_Paru" "Jenis_Kelamin:Penyakit_Paru"
## attr(,"order")
## [1] 1 1 1 2 2 2
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 3.029941 1 0.08174100
## Pearson 3.000435 1 0.08324215
Model Regresi Logistik Jika kita ingin memodelkan probabilitas terkena penyakit paru-paru berdasarkan status merokok dan jenis kelamin, maka regresi logistik adalah pendekatan yang tepat.
# Membuat data frame dari array
df <- as.data.frame(as.table(table_data))
# Ubah Penyakit_Paru menjadi biner
df$Penyakit_Paru_bin <- ifelse(df$Penyakit_Paru == "Ya", 1, 0)
# Model regresi logistik
glm_model <- glm(Penyakit_Paru_bin ~ Merokok + Jenis_Kelamin, data = df, family = binomial(), weights = Freq)
summary(glm_model)
##
## Call:
## glm(formula = Penyakit_Paru_bin ~ Merokok + Jenis_Kelamin, family = binomial(),
## data = df, weights = Freq)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.2405 0.2806 4.422 9.80e-06 ***
## MerokokBukan Perokok -1.7076 0.3248 -5.257 1.46e-07 ***
## Jenis_KelaminPerempuan -0.4707 0.3252 -1.447 0.148
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 255.25 on 7 degrees of freedom
## Residual deviance: 221.97 on 5 degrees of freedom
## AIC: 227.97
##
## Number of Fisher Scoring iterations: 4
Kesimpulan
Tabel kontingensi menunjukkan hubungan awal antar variabel.
Model log-linier cocok untuk mengeksplorasi struktur hubungan antar semua variabel kategorik.
Model regresi logistik digunakan jika fokus utama adalah prediksi terhadap outcome kategorik, seperti terkena penyakit atau tidak.
Masing-masing pendekatan memiliki kekuatan tergantung pada tujuan: eksplorasi, struktur, atau prediksi.
Perbandingan Ketiga Pendekatan
Aspek | Tabel Kontingensi | Model Loglinear | Regresi Logistik |
---|---|---|---|
Tujuan | Deskripsi frekuensi | Deteksi asosiasi | Prediksi probabilitas |
Variabel dependen | Tidak ada | Tidak ada (simetris) | Ada (eksplisit) |
Distribusi | Tidak diasumsikan | Poisson (frekuensi sel) | Binomial (probabilitas) |
Bentuk Model | Tidak ada | GLM: log(μ) ~ efek | GLM: logit(p) ~ prediktor |
Cocok untuk | Eksplorasi awal | Tabel dengan > 2 variabel kategorik | Studi observasional / prediktif |
Model log-linier merupakan bagian dari Generalized Linear Models (GLM) yang khusus dirancang untuk menganalisis hubungan antar variabel kategorik. Model ini memodelkan logaritma dari frekuensi harapan dalam tabel kontingensi sebagai kombinasi linier dari parameter efek utama dan interaksi.
Formulasi Matematis: \[ \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} \] di mana:
\(\mu_{ijk}\) = frekuensi harapan untuk sel (i,j,k)
\(\lambda\) = efek rata-rata umum
\(\lambda^A, \lambda^B, \lambda^C\) = efek utama
\(\lambda^{AB}, \lambda^{AC}, \lambda^{BC}\) = interaksi dua arah
\(\lambda^{ABC}\) = interaksi tiga arah
Kita menggunakan dataset simulasi dengan 4 variabel kategorik:
- Kanker Kulit (Ya/Tidak)
- Paparan UV (Rendah/Tinggi)
- Riwayat Keluarga (Ya/Tidak)
- Usia (<40, 40-60, >60 tahun)
# Pembuatan tabel kontingensi 4D
kanker_data <- array(
c(15,30,10,25,20,40,5,15,10,20,30,50, # Data frekuensi
8,22,12,18,15,35,8,12,5,15,25,45), # Data tambahan untuk realisme
dim = c(2,2,2,3),
dimnames = list(
Kanker = c("Ya","Tidak"),
Paparan_UV = c("Rendah","Tinggi"),
Riwayat_Keluarga = c("Ya","Tidak"),
Usia = c("<40","40-60",">60")
)
)
Model ini mengasumsikan semua variabel independen/tidak berhubungan: \[ \log(\mu_{ijkl}) = \lambda + \lambda_i^K + \lambda_j^P + \lambda_k^R + \lambda_l^U \]
# Convert data to dataframe format
kanker_df <- as.data.frame(as.table(kanker_data))
# Fit models using glm()
model_independen_glm <- glm(Freq ~ Kanker + Paparan_UV + Riwayat_Keluarga + Usia,
data = kanker_df, family = poisson)
Interpretasi:
- Nilai devians tinggi menunjukkan ketidakcocokan model
- Derajat kebebasan besar karena banyak sel yang tidak terjelaskan
Model ini mencakup semua efek utama dan interaksi dua arah: \[ \log(\mu_{ijkl}) = \lambda + \lambda_i^K + \lambda_j^P + \lambda_k^R + \lambda_l^U + \lambda_{ij}^{KP} + \lambda_{ik}^{KR} + \lambda_{il}^{KU} + \lambda_{jk}^{PR} + \lambda_{jl}^{PU} + \lambda_{kl}^{RU} \]
model_hierarkis_glm <- glm(Freq ~ (Kanker + Paparan_UV + Riwayat_Keluarga + Usia)^2,
data = kanker_df, family = poisson)
Model lengkap yang memuat semua interaksi hingga tingkat tertinggi: \[ \log(\mu_{ijkl}) = \lambda + \lambda_i^K + ... + \lambda_{ijkl}^{KPRU} \]
Tabel Perbandingan Model:
# Load required packages
library(MASS)
library(knitr)
# Create comparison table using loglm objects
comparison <- data.frame(
Model = c("Independen", "Hierarkis", "Saturated"),
Deviance = c(model_independen_glm$deviance,
model_hierarkis_glm$deviance,
model_saturated_glm$deviance),
df = c(model_independen_glm$df.residual,
model_hierarkis_glm$df.residual,
model_saturated_glm$df.residual)
)
# Add pseudo-AIC calculation for loglm objects (AIC = Deviance + 2*df)
comparison$AIC <- comparison$Deviance + 2*comparison$df
# Print formatted comparison table
kable(comparison, caption = "Perbandingan Goodness-of-Fit Model", digits = 2)
Model | Deviance | df | AIC |
---|---|---|---|
Independen | 107.56 | 18 | 143.56 |
Hierarkis | 57.78 | 9 | 75.78 |
Saturated | 0.00 | 0 | 0.00 |
Likelihood Ratio Test:
##
## Likelihood Ratio Tests:
## Analysis of Deviance Table
##
## Model 1: Freq ~ Kanker + Paparan_UV + Riwayat_Keluarga + Usia
## Model 2: Freq ~ (Kanker + Paparan_UV + Riwayat_Keluarga + Usia)^2
## Model 3: Freq ~ Kanker * Paparan_UV * Riwayat_Keluarga * Usia
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 18 107.564
## 2 9 57.781 9 49.782 1.184e-07 ***
## 3 0 0.000 9 57.781 3.580e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Kriteria Pemilihan:
1. Parsimoni: Model sederhana yang cukup menjelaskan data
2. Signifikansi Statistik: LRT p-value < 0.05
3. AIC: Nilai lebih kecil menunjukkan model lebih baik
Interpretasi
Hasil uji likelihood ratio menunjukkan bahwa model hierarkis jauh lebih baik dari model independen (p < 0.001), dan model saturated paling baik karena deviasinya nol. Namun, karena model saturated terlalu kompleks, model hierarkis dipilih sebagai yang paling seimbang. Ini juga didukung oleh nilai AIC: model hierarkis memiliki AIC lebih rendah (75.78) dibandingkan model independen (143.56), yang berarti lebih cocok tanpa terlalu rumit.
##
## Call:
## glm(formula = Freq ~ (Kanker + Paparan_UV + Riwayat_Keluarga +
## Usia)^2, family = poisson, data = kanker_df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.79075 0.19365 14.411 < 2e-16 ***
## KankerTidak 0.82574 0.20800 3.970 7.19e-05 ***
## Paparan_UVTinggi -0.58994 0.23467 -2.514 0.011941 *
## Riwayat_KeluargaTidak -0.06758 0.21931 -0.308 0.757960
## Usia40-60 -0.20991 0.25060 -0.838 0.402227
## Usia>60 -0.48736 0.25753 -1.892 0.058426 .
## KankerTidak:Paparan_UVTinggi -0.16619 0.19911 -0.835 0.403903
## KankerTidak:Riwayat_KeluargaTidak 0.04213 0.19571 0.215 0.829559
## KankerTidak:Usia40-60 -0.12594 0.24378 -0.517 0.605421
## KankerTidak:Usia>60 -0.05221 0.24375 -0.214 0.830404
## Paparan_UVTinggi:Riwayat_KeluargaTidak 0.11236 0.19089 0.589 0.556110
## Paparan_UVTinggi:Usia40-60 1.26532 0.23357 5.417 6.05e-08 ***
## Paparan_UVTinggi:Usia>60 0.88978 0.23089 3.854 0.000116 ***
## Riwayat_KeluargaTidak:Usia40-60 -0.63900 0.23312 -2.741 0.006124 **
## Riwayat_KeluargaTidak:Usia>60 0.22773 0.22833 0.997 0.318588
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 166.587 on 23 degrees of freedom
## Residual deviance: 57.781 on 9 degrees of freedom
## AIC: 200.14
##
## Number of Fisher Scoring iterations: 4
library(broom)
# Ambil semua estimasi parameter
estimasi <- tidy(model_hierarkis_glm) %>%
mutate(
OR = exp(estimate),
CI_lower = exp(estimate - 1.96 * std.error),
CI_upper = exp(estimate + 1.96 * std.error)
)
# Tampilkan hasil
print(estimasi[, c("term", "estimate", "OR", "CI_lower", "CI_upper")])
## # A tibble: 15 × 5
## term estimate OR CI_lower CI_upper
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 2.79 16.3 11.1 23.8
## 2 KankerTidak 0.826 2.28 1.52 3.43
## 3 Paparan_UVTinggi -0.590 0.554 0.350 0.878
## 4 Riwayat_KeluargaTidak -0.0676 0.935 0.608 1.44
## 5 Usia40-60 -0.210 0.811 0.496 1.32
## 6 Usia>60 -0.487 0.614 0.371 1.02
## 7 KankerTidak:Paparan_UVTinggi -0.166 0.847 0.573 1.25
## 8 KankerTidak:Riwayat_KeluargaTidak 0.0421 1.04 0.711 1.53
## 9 KankerTidak:Usia40-60 -0.126 0.882 0.547 1.42
## 10 KankerTidak:Usia>60 -0.0522 0.949 0.589 1.53
## 11 Paparan_UVTinggi:Riwayat_KeluargaTidak 0.112 1.12 0.770 1.63
## 12 Paparan_UVTinggi:Usia40-60 1.27 3.54 2.24 5.60
## 13 Paparan_UVTinggi:Usia>60 0.890 2.43 1.55 3.83
## 14 Riwayat_KeluargaTidak:Usia40-60 -0.639 0.528 0.334 0.834
## 15 Riwayat_KeluargaTidak:Usia>60 0.228 1.26 0.803 1.96