Puji syukur ke hadirat Tuhan Yang Maha Esa karena atas limpahan rahmat, taufik, dan hidayah-Nya, penulisan buku berjudul “Analisis Data Kategori: Panduan Teori dan Praktikum dalam R Studio” ini dapat diselesaikan dengan baik dan tepat waktu. Buku ini hadir sebagai bentuk kontribusi dalam memperluas literatur statistik, khususnya dalam bidang analisis data kategori yang memiliki peran penting dalam penelitian sosial, kesehatan, dan ilmu terapan lainnya.
Penulisan buku ini dilandasi oleh kebutuhan akan referensi yang tidak hanya membahas teori secara konseptual, tetapi juga disertai dengan panduan praktis yang aplikatif. Oleh karena itu, buku ini dirancang untuk memberikan pemahaman menyeluruh, mulai dari konsep dasar seperti tabel kontingensi dan uji chi-kuadrat, hingga model lanjutan seperti regresi logistik dan model log-linear. Setiap topik disertai contoh penerapan menggunakan software R Studio, sehingga pembaca dapat langsung menghubungkan teori dengan praktik.
Penulis menyadari bahwa belajar statistik, khususnya topik data kategori, sering kali terasa abstrak dan teknis. Oleh sebab itu, pendekatan yang digunakan dalam buku ini adalah menjelaskan dengan bahasa yang lugas, disertai ilustrasi dan contoh kasus yang relevan agar memudahkan pembaca dalam memahami setiap konsep yang disampaikan.
Ucapan terima kasih penulis sampaikan kepada seluruh pihak yang telah memberikan dukungan selama proses penyusunan buku ini. Terima kasih yang sebesar-besarnya kepada para dosen, rekan mahasiswa, dan semua pihak yang telah memberi masukan, semangat, maupun kritik yang membangun.
Penulis juga menyadari bahwa tidak ada karya yang sempurna. Oleh karena itu, kritik dan saran dari para pembaca sangat penulis harapkan untuk perbaikan dan pengembangan di masa mendatang. Semoga buku ini dapat memberikan manfaat bagi pembaca dalam memahami dan menerapkan analisis data kategori, serta menjadi referensi yang berguna dalam pembelajaran dan penelitian.
Dalam era informasi yang berkembang pesat, kemampuan untuk memahami dan mengolah data menjadi semakin penting. Tidak hanya data numerik yang berbentuk angka-angka kuantitatif, namun juga data yang bersifat kualitatif atau kategorikal. Data kategori merupakan jenis data yang umum ditemukan dalam berbagai bidang seperti kesehatan, pendidikan, pemasaran, politik, dan ilmu sosial. Data ini tidak menggambarkan besaran numerik, melainkan klasifikasi atau kelompok, seperti jenis kelamin, status pekerjaan, atau tingkat kepuasan.
Analisis data kategori menjadi salah satu cabang penting dalam ilmu statistik yang bertujuan untuk memahami karakteristik, distribusi, dan hubungan antara variabel-variabel kategori. Pendekatan ini digunakan untuk merangkum informasi, mendeteksi pola, serta mengevaluasi kecenderungan dalam populasi berdasarkan data kategori yang tersedia. Walaupun tidak bersifat numerik dalam arti konvensional, data kategori memiliki struktur dan informasi yang kaya serta dapat memberikan wawasan yang berarti apabila dianalisis dengan tepat.
Buku ini disusun untuk memberikan pemahaman mendalam mengenai konsep dan aplikasi analisis data kategori. Materi disajikan secara sistematis, dimulai dari pengenalan dasar hingga ke pembahasan analisis yang lebih kompleks, sehingga diharapkan mampu memberikan gambaran yang komprehensif kepada pembaca. Penyajian disertai dengan contoh-contoh kontekstual dan aplikatif guna mendekatkan konsep statistik dengan persoalan nyata yang sering ditemui dalam penelitian.
Diharapkan, buku ini dapat menjadi referensi yang bermanfaat dalam kajian-kajian akademik maupun profesional. Dengan memahami prinsip-prinsip dasar dan logika analisis data kategori, pembaca akan memiliki fondasi yang kuat dalam membuat interpretasi dan pengambilan keputusan yang didasarkan pada bukti data yang sahih.
Merupakan analisis yang fokus terhadap data yang diklasifikasikan ke dalam data kategori, atau yang dapat diklasifikasikan kepada data yang bersifat nominal atau ordinal. Contoh data kategori mencakup jenis kelamin, tingkat pendidikan dan lainnya yang bersifat membedakan.
Analisis dilakukan untuk beberapa hal seperti
Mengidentifikasi pola dan tren data
menganalisis hubungan antar variabel
Mengembangkan model
dan lainnya
Analisis data kategori berfokus pada bagaimana pola, frekuensi, dan distribusi dari kategori-kategori tersebut muncul dalam suatu kumpulan data. Tujuannya bukan hanya untuk mengetahui seberapa banyak orang memilih satu kategori tertentu, tetapi juga untuk memahami konteks, hubungan, dan makna dari pilihan-pilihan tersebut. Dengan memahami data kategori, kita bisa memperoleh wawasan tentang sikap, karakteristik, dan preferensi individu atau kelompok dalam sebuah populasi.
Pentingnya analisis data kategori terletak pada kemampuannya menjelaskan hal-hal yang tidak bisa direpresentasikan oleh angka secara langsung. Ia menjadi jembatan antara fenomena sosial, psikologis, atau budaya dengan data yang bisa dianalisis secara sistematis. Oleh karena itu, meskipun sederhana dalam bentuknya, data kategori tetap memiliki kedalaman makna yang besar dan layak dipahami secara cermat.
Analisis ini dilakukan untuk memahami data yang tidak bersifat numerik secara langsung, tetapi juga membawa makna besar dalam bentuk klasifikasi, pilihan dan atribut yang menjadi dasar dalam banyak penelitian empiris modern
Analisis data kategori ini merupakan analisis yang dilakukan pada data yang bersifat diskrit, yakni data yang berskala nominal atau ordinal. Data nominal merupakan data yang bersifat sebagai pembeda. Misal jenis kelamin, tinggi-rendah dan lainnya sedangkan data ordinal merupakan data yang selain menjadi pembeda juga memiliki tingkatan seperti tingkat pendidikan (SD,SMP,SMA) dan lainnya.
Analisis ini berguna di banyak bidang. Sebagai contoh penggunaan dalam bidang sosial yakni survei mengenai hubungan sosial ekonomi dengan tingkat pendidikan. Dalam Bidang psikologi dapat dilakukan untuk data-data kategori psikologi. Dalam bidang kesehatan seperti efektivitas pengobatan terapi dan banyak manfaat lainnya.
Bnayak metode yang dapat digunakan dalam analisis data kategori tergantung pada tujuan analisisnya. Beberapa contohnya adalah
Tabel kontingensi
Metode ini memperlihatkan distribusi frekuensi gabungan antara dua atau lebih variabel kategori. Dengan ini, kita dapat dengan mudah melihat pola hubungan atau kecenderungan antara variabel.
Dari tabel kontingensi tersebut, analisis dapat dilanjutkan menggunakan uji chi-square (chi-square test of independence). Uji ini berguna untuk mengetahui apakah terdapat hubungan yang signifikan secara statistik antara dua variabel kategori.
Regresi Logistik
Metode ini digunakan untuk memodelkan hubungan antara satu variabel dependen kategori (biasanya berskala binomial seperti “ya” atau “tidak”) dengan satu atau lebih variabel independen yang dapat berupa numerik maupun kategori. Regresi logistik tidak hanya mampu mengidentifikasi faktor-faktor yang memengaruhi suatu kejadian, tetapi juga dapat memprediksi probabilitas terjadinya kejadian tersebut. Bila variabel dependennya memiliki lebih dari dua kategori, maka digunakan regresi logistik multinomial.
Analisis Korespondensi
Metode ini digunakan untuk memvisualisasikan hubungan antara kategori dalam tabel kontingensi secara grafis dalam ruang dua dimensi. Teknik ini sangat bermanfaat untuk menemukan pola dan asosiasi antara kategori dari dua variabel, terutama dalam analisis survei atau data kualitatif lainnya.
Random Forest
alah satu algoritma yang sangat efektif, khususnya untuk tugas klasifikasi, yaitu ketika tujuan analisis adalah menentukan kategori atau label suatu data berdasarkan sejumlah fitur input. Misalnya, memprediksi apakah seseorang akan membeli produk (kategori: ya atau tidak), mengidentifikasi jenis kelamin berdasarkan preferensi konsumen, atau mengklasifikasikan jenis keluhan pelanggan berdasarkan isi pesan.
Dalam analisis inferensi, perlu dipastikan bahwa asumsi mengenai distribusi peluang terpenuhi. Misal dalam model ANOVA, asumsi normalitas mengambil peran sentral. Oleh karena itu, pada analisis data kategoripun demikian
Distribusi Binomial
Seringkali, data kategorikal berasal dari n percobaan yang independen dan memiliki dua kemungkinan hasil yakni berhasil atau gagal. Percobaan yang dilakukan untuk satu individu disebut sebagai percobaan bernouli. Namun ketika dilakukan n kali percobaan dengan setiap individu dalam n bersifat independen, maka variabel acak Y (respon) akan mengikuti distribusi binomial dengan persamaan
\[ P(X = k) = \binom{n}{k} p^k (1 - p)^{n - k} \]
Contoh sebuah kuis memiliki 10 soal dengan jawaban benar atau salah. Seorang siswa tidak siap dengan kuis dadakan tersebut dan menjawab secara acak. Peluang menjawab benar adalah 0,2. Maka peluang menjawab 7 benar adalah
\[ \begin{aligned} P(X = 7) &= \binom{10}{7} (0.2)^7 (1 - 0.2)^{10 - 7} \\ &= \binom{10}{7} (0.2)^7 (0.8)^3 \\ &= 120 \times 0.000128 \times 0.512 \\ &= 120 \times 0.000065536 \\ &= 0.00786432 \\ &\approx {0.0079} \end{aligned} \]
Distribusi ini adalah distribusi dasar dalam analisis data kategori.
Distribusi Multinomial
Distribusi ini adalah lanjutan dari distribusi binomial. Ketika hasil yang mungkin terjadi lebih dari dua kemungkinan seperti tinggi, sedang, rendah sehingga persamaannya berubah menjadi
\[ P(X_1 = x_1, \dots, X_k = x_k) = \frac{n!}{x_1! \, x_2! \, \dots \, x_k!} \, p_1^{x_1} \, p_2^{x_2} \, \dots \, p_k^{x_k} \]
Ini merupakan distribusi yang sering muncul dalam kasus analisis data kategori
Distribusi Poisson
Distribusi ini digunakan untuk menghitung sebuah kejadian yang jarang terjadi dalam interval waktu tertentu. Fungsi probabilitasnya adalah
\[ P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!} \]
Ini biasanya terjadi pada kejadian yang tidak diharapkan seperti bencana atau hal lainnya.
Desain sampling memiliki peran yang cukup dalam menentukan validitas dan reliabilitas hasil penelitian. Dalam penelitian terdapat beberapa desain sampling. Pengklasifikasiannya adalah sebagai berikut
Prospective Sampling
Merupakan suatu desain sampling dimana variabel respons Y diukur setelah perlakukan atau pengelompokan dikerjakan terlebih dahulu. Pada desain ini peneliti memiliki kendali utnuk menetapkan siapa yang akan masuk grup mana. Contoh dari sampling ini adalah
Clinical Trial (Studi Eksperimen)
Subjek secara acak dialokasikan ke dalam kelompok perlakuan dan kontrol. Tekniknya meliputi SRS, Stratisfied dan Cluster sampling.
Cohort Study
Observasional dimana individu di amati dari waktu ke waktu. tekniknya ada sensus, sistematik, matched sampling dan lainnya.
Retrospective Sampling
merupakan metode yang mana data dikumpulkan dari peristiwa yang telah terjadi sebelumnya. alias variabel Y ditentukan terlebih dahulu, kemudian baru variabel X. Contoh dari sampling ini adalah
Studi kasus-kontrol
Sekelompok individu dengan kasus A dibandingkan dengan sekelompok kasus yang tidak mengalami kasus A. Contoh tekniknya adlaah puposive, snowball, incidence sampling, dan lainnya.
Studi Kohort Restrospektif
Menggunakan data historis dalam mengelompokkan individu. Contoh tekniknya adalah convenience sampling, quota sampling dan case-based sampling.
Cross Sectional
Desain ini tidak membatas variabel mana yang menjadi prediktor dan mana yang menjadi respon.
Tabel kontingensi adalah sebuah cara penyajian data dalam bentuk matriks atau tabel yang digunakan untuk menampilkan hubungan antara dua atau lebih variabel kategori. Dalam tabel ini, baris dan kolom merepresentasikan kategori dari masing-masing variabel, dan setiap sel di dalam tabel menunjukkan jumlah kejadian (frekuensi) yang sesuai dengan kombinasi kategori-kategori tersebut. Tabel kontingensi sering digunakan sebagai langkah awal untuk mengenali pola, hubungan, atau ketidakteraturan dalam data kategori.
Sebagai contoh, sebuah tabel kontingensi bisa menunjukkan hubungan antara jenis kelamin (laki-laki/perempuan) dan preferensi warna (merah/biru/hijau). Setiap sel dalam tabel tersebut akan berisi jumlah orang dalam kombinasi kategori tersebut, misalnya berapa banyak laki-laki yang memilih merah, atau perempuan yang memilih biru. Penyajian seperti ini membantu kita untuk melihat distribusi data secara menyeluruh sekaligus membandingkan antar kategori dengan lebih mudah.
Tabel kontingensi menjadi alat penting dalam analisis data kategori karena ia menyederhanakan informasi yang kompleks ke dalam bentuk yang terstruktur dan mudah dibaca. Lewat tabel ini, peneliti bisa mulai menelusuri apakah ada indikasi hubungan antar variabel, kesamaan distribusi, atau perbedaan yang mencolok. Dengan kata lain, tabel kontingensi tidak hanya berfungsi sebagai alat penyajian data, tapi juga sebagai jendela awal untuk memahami interaksi antara kategori-kategori yang ada.
Pada bab ini akan dibahas mengenai tabel kontingensi 2 arah.
Misalnya variabel X memiliki dua kategori: \(x_1\) dan \(x_2\), serta variabel Y memiliki dua kategori: \(y_1\) dan \(y_2\).
| \(y_1\) | \(y_2\) | Total | |
|---|---|---|---|
| \(x_1\) | \(n_{11}\) | \(n_{12}\) | \(n_{1.}\) |
| \(x_2\) | \(n_{21}\) | \(n_{22}\) | \(n_{2.}\) |
| Total | \(n_{.1}\) | \(n_{.2}\) | \(n_{..}\) |
Keterangan:
Pada tabel kontingensi, apabila X dan Y merupakan variabel acak dan pemilihan sampelnya juga acak, maka disebutkan bahwa tabel tersebut memiliki distribusi peluang.
Pada tabel kontingensi, distribusi peluang terdiri atas :
Joint Probability Peluang bersama menunjukkan peluang dua kejadian terjadi bersamaan.
Rumus umum: \[ P(A \cap B) = \frac{n(A \cap B)}{n(Total)}\]
Marginal Probability Peluang marjinal didapat dari total baris/kolom dibagi total keseluruhan.
Rumus: \[ P(A) = \frac{n(A)}{n(Total)} \]
Conditional Probability Peluang bersyarat adalah peluang satu kejadian terjadi jika kejadian lain sudah terjadi.
Rumus: \[ P(A|B) = \frac{P(A \cap B)}{P(B)} \]
Misalkan kita punya data tentang kebiasaan olahraga dan cara bangun tidur pada 100 orang. Pada faktor olahraga terdapat dua taraf yakni kebiasaan sering olahraga dan jarang olahraga sedangkan untuk faktor bangun ada dua taraf yakni langsung bangun atau tunda terlebih dahulu selama 5 menit.
| Langsung Bangun | Tunda-Tunda dulu | Total | |
|---|---|---|---|
| Olahraga | 40 | 10 | 50 |
| Tidak | 20 | 30 | 50 |
| Total | 60 | 40 | 100 |
Langkah 1: Peluang Bersama
Hitung:
Langkah 2: Peluang Marjinal
Hitung:
Langkah 3: Peluang Bersyarat
Hitung:
Pada peluang bersyarat dapat diambil interpretasi yakni \(P(Langsung | Olahraga) = 0.8\)
\(P(Tunda | Tidak Olahraga) = 0.4\)
Menunjukkan bahwa orang yang sering berolahraga lebih cenderung langsung bangun daripada orang yang jarang berolahraga.
Hubungan antar variabel acak X dan Y yang keduanya bersifat kategori dalam tabel kontingensi dinamakan dengan asosiasi. Asosiasi ini dibentuk dari distribusi peluang bersyaratnya. Ada 3 jenis ukuran asosiasi pada tabel kontingensi 2 arah yakni
Beda Peluang (Risk Difference)
Ukuran absolut yang menggambarkan beda antara probabilitas dari dua kelompok berbeda. Rumusnya sebagai berikut
Rumus: \[ RD = \left( \frac{n_{11}}{n_{1.}} \right) -\left( \frac{n_{21}}{n_{2.}} \right) \]
Resiko Relatif (Relative Risk)
Ukuran yang digunakan untuk membandingkan resiko kejadian suatu peristiwa antara dua kelompok, yakni kejadian A dan bukan A.
Rumus: \[ RR = \frac{ \left( \frac{n_{11}}{n_{1.}} \right) }{ \left( \frac{n_{21}}{n_{2.}} \right) } \]
Rasio Odds (Odds ratio)
Ukuran yang digunakan untuk membandingkan peluang terjadinya kejadian dua kelompok yakni kelompok kejadian A dan bukan A. Bedanya sama resiko relatif, odd ratio ini membandingkan peluangnya sedangkan RR hanya membandingkan resikonya.
Rumus: \[ OR = \frac{ \left( \frac{n_{11}}{n_{12}} \right) }{ \left( \frac{n_{21}}{n_{22}} \right) } = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}} \]
Pada soal sebelumnya telah diperoleh beberapa nilai, sehingga dapat dilanjutkan perhitungan ukuran asosiasinya.
Beda Peluang
Beda peluang mengukur selisih risiko absolut antara dua kelompok.
Rumus: \[ RD = P(Langsung | Olahraga) - P(Tunda | Tidak Olahraga) \]
Hitung:
\(RD = 0.8 - 0.4 = 0.4\)
Orang yang berolahraga memiliki peluang 40% lebih besar untuk langsung bangun dari tidur dibandingkan dengan yang tidak berolahraga.
Resiko Relatif
Mengukur perbandingan risiko antara dua kelompok.
Rumus: \[ RR = \frac{P(Langsung | Olahraga)}{P(Tunda| Tidak Olahraga)} \]
Hitung:
\(RR = \frac{0.8}{0.4} = 2\)
Orang yang berolahraga memiliki 2 kali lipat kemungkinan untuk dapat langsung bangun dari tidur dibandingkan yang tidak berolahraga.
Odd Ratio
Mengukur perbandingan odds antara dua kelompok.
Rumus: \[ OR = \frac{(40/10)}{(20/30)} = \frac{4}{0.6667} \approx 6 \]
Peluang untuk orang dapat langsung bangun dari tidur pada orang yang berolahraga adalah 6 kali lebih tinggi dibandingkan yang tidak berolahraga.
Contoh Perhitungan R :
RD <- function(n11, n12, n21, n22) {
(n11 / (n11 + n12))- (n21 / (n21 + n22))
}
RD(40, 10, 20, 30)
## [1] 0.4
RR <- function(n11, n12, n21, n22) {
(n11 / (n11 + n12)) / (n21 / (n21 + n22))
}
RR(40, 10, 20, 30)
## [1] 2
OR <- function(n11, n12, n21, n22) {
(n11 * n22) / (n12 * n21)
}
OR(40, 10, 20, 30)
## [1] 6Inferensial dalam konteks tabel kontingensi dua arah mengacu pada proses menarik kesimpulan tentang hubungan antara dua variabel kategori dalam populasi, berdasarkan data sampel yang disajikan dalam tabel tersebut. Dalam hal ini, analisis tidak hanya berhenti pada pengamatan data yang terlihat di tabel, tetapi juga melibatkan pertanyaan lebih lanjut seperti: “Apakah pola ini terjadi karena kebetulan dalam sampel, atau mencerminkan pola nyata di populasi?” Dengan kata lain, pendekatan inferensial bertujuan untuk menguji apakah ada asosiasi yang bermakna antara dua variabel kategori.
Melalui analisis inferensial, kita dapat mengembangkan pemahaman yang lebih dalam mengenai bagaimana dua variabel saling berhubungan, apakah hubungan itu bersifat lemah atau kuat, atau bahkan tidak ada sama sekali. Ini penting karena dalam banyak situasi, perbedaan yang tampak mencolok di tabel belum tentu berarti signifikan secara statistik. Oleh karena itu, pendekatan inferensial membantu membedakan antara pola yang kebetulan muncul dalam sampel dengan pola yang kemungkinan besar berlaku di seluruh populasi.
\[ \hat{p}_1 = \frac{n_{11}}{n_{1.}} \]
\[ \hat{p} \pm z_{\alpha/2} \cdot \sqrt{ \frac{\hat{p} (1 - \hat{p})}{n} } \]
Uji ini digunakan untuk membandingkan proporsi kejadian antara dua kelompok dalam tabel kontingensi terutama untuk menentukan apakah terdapat perbedaan signifikan dalam proporsi kejadian.
Untuk menguji hal tersebut, diawali dengan menyatakan hipotesis yakni
H0 : Tidak ada perbedaan antara dua kelompok, yaitu \[ p_1 = p_2 \]
H1 : Terdepat perbedaan proporsi antara dua kelompok.
Untuk formulanya sebagai berikut
estimasi proporsi masing masing
\[ \hat{p}_1 = \frac{n_{11}}{n_{1.}} = \frac{40}{50} = 0.8 \]
dan
\[ \hat{p}_2 = \frac{n_{21}}{n_{2.}} = \frac{20}{50} = 0.4 \]
estimasi proporsi gabungan
\[ \hat{p} = \frac{n_{11}+{n_{21}}}{{n_{1.}}+{n_{2.}} } = 0.6 \]
statistik uji Z
Statsitik uji Z mengikuti distribusi normal baku (0,1) dan p value dihitung berdasarkan nilai kritis.
\[ Z = \frac{\hat{p}_1 + \hat{p}_2}{\sqrt{\hat{p}(1 - \hat{p})\left( \frac{1}{n_1} + \frac{1}{n_2} \right)}} \\ = \frac{0.8 + 0.4}{\sqrt{0.6(1 - 0.6)\left( \frac{1}{50} + \frac{1}{50} \right)}} \\ = 15.042 \]
Evaluasi
Jika nilai Z lebih dari nilai kritis atau p-value kurang dari alpha yang ditetapkan, maka dapat diyakini bahwa ada perbedaan proporsi dari kedua kelompok tersebut.
Contoh perhitungan menggunakan R
# Matriks data: baris = Olahraga, kolom = Bangun
data <- matrix(c(40, 10, 20, 30), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Olahraga" = c("Ya", "Tidak"),
"Sehat" = c("Langsung", "Tunda"))
data
## Sehat
## Olahraga Langsung Tunda
## Ya 40 10
## Tidak 20 30
# Uji Proporsi dengan variabel yang benar
prop_test <- prop.test(x =c(data[1,1], data[2,1]),
n =c(sum(data[1,]), sum(data[2,])))
print(prop_test)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(data[1, 1], data[2, 1]) out of c(sum(data[1, ]), sum(data[2, ]))
## X-squared = 15.042, df = 1, p-value = 0.0001052
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## 0.2046955 0.5953045
## sample estimates:
## prop 1 prop 2
## 0.8 0.4
Karena nilai p-value kurang dari 5% sesuai taraf yang ditetapkan, dapat dipercaya bahwa proporsi kejadian antar kebiasaan olahraga dan cara bangun tidur berbeda signifikan.
Uji asosiasi ini bertujuan mengukur hubungan antar dua variabel kategori. Dengan ini disusun hipotesis sebagai berikut
H0 : Tidak ada asosiasi antara dua variabel
H1 : Terdapat asosiasi antara dua variabel
Adapun formulanya sebagai berikut
Beda Peluang Rumus RD
\[ RD = \hat{p}_1 - \hat{p}_2 \]
Rumus Standar Error RD
\[ SE(RD) = \sqrt{ \frac{\hat{p}_1 (1 - \hat{p}_1)}{n_1} + \frac{\hat{p}_2 (1 - \hat{p}_2)}{n_2} } \]
Rumus Statistik Uji Z \[ Z = \frac{RD}{SE(RD)} = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{ \frac{\hat{p}_1 (1 - \hat{p}_1)}{n_1} + \frac{\hat{p}_2 (1 - \hat{p}_2)}{n_2} }} \]
Resiko Relatif
Rumus :
\[ RR = \frac{\hat{p}_1}{\hat{p}_2} \]
Standar Error
\[ SE(\ln RR) = \sqrt{ \frac{1 - \hat{p}_1}{x_1} + \frac{1 - \hat{p}_2}{x_2} } \]
Statistik Z
\[ Z = \frac{\ln(RR)}{SE(\ln RR)} \]
Odd 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 = \frac{\ln(OR)}{SE(\ln OR)} \]
Contoh Perhitungan
Pada kasus sebelumnya dijelaskan ada 2 kondisi yakni kebiasaan
olahraga dan cara bangun tidur. Untuk perhitungan contoh dilakukan pada
interval odd ratio sebagai berikut.
Tadi diperoleh bahwa nilai odd rationya adalah = 6
Maka sesuaikan rumusnya
\(SE(\ln OR) = \sqrt{ \frac{1}{40} + \frac{1}{10} + \frac{1}{20} + \frac{1}{30}} = 0.4564\)
Maka diperoleh nilai Z
\[ Z = \frac{(OR)}{SE(\ln(OR)} = \frac{6}{0.4565} = 3.9255 \]
n11 <- 40
n12 <- 10
n21 <- 20
n22 <- 30
n1. <- n11 + n12
n2. <- n21 + n22
# Risk Difference
p1<-(n11/n1.)
p2<-(n21/n2.)
rd <- p1- p2
se_rd <- sqrt((p1 * (1- p1) / n1.) + p2*((1- p2) / n2.))
z_rd <- rd / se_rd
# Relative Risk
rr <- (n11/n1.) / (n21/n2.)
se_ln_rr <- sqrt((1/n11)- (1/n1.) + (1/n21)- (1/n2.))
z_rr <- log(rr) / se_ln_rr
# Odds Ratio
or <- (n11 * n22) / (n12 * n21)
se_ln_or <- sqrt((1/n11) + (1/n12) + (1/n21) + (1/n22))
z_or <- log(or) / se_ln_or
# Hasil
list(RD = rd, SE_RD = se_rd, Z_RD = z_rd, RR = rr, SE_Ln_RR = se_ln_rr, Z_RR = z_rr, OR = or, SE_Ln_OR = se_ln_or, Z_OR = z_or)
## $RD
## [1] 0.4
##
## $SE_RD
## [1] 0.08944272
##
## $Z_RD
## [1] 4.472136
##
## $RR
## [1] 2
##
## $SE_Ln_RR
## [1] 0.1870829
##
## $Z_RR
## [1] 3.705028
##
## $OR
## [1] 6
##
## $SE_Ln_OR
## [1] 0.4564355
##
## $Z_OR
## [1] 3.925548
Dengan nilai Z setiap perhitungan dapat dilakukan penilaian terhadap signifikansi masing masing ukuran asosiasi. Jika menggunakan alpha = 5% maka nilai kritisnya adalah 1,96 yang berarti ketiga ukuran asosiasi tersebut memberikan perbedaan yang signifikan karena nilai Z melebihi nilai kritisnya.
Uji ini digunakan untuk menentukan apakah ada hubungan statistik antara dua variabel kategorikal. Uji yang digunakan salah satunya adlaah uji Chi-Square dengan rumus
\[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
dimana :
O = nilai observasi dalam tabel kontingensi
E = nilai yang diharapkan dan diperoleh dari rumus
\[ E_{ij} = \frac{R_i \cdot C_j}{N} \]
di mana: - \(R_i\): jumlah total baris ke-\(i\) - \(C_j\): jumlah total kolom ke-\(j\) - \(N\): total seluruh observasi
Sama halnya dengan uji Z, uji chi square juga memiliki ketentuan hipotesis sebagai berikut
H0 : Tidak terdapat hubungan antar kelompok
H1 : Terdapat hubungan signifikan antar kelompok
Dengan ketentuan jika nilai chi-square lebih dari nilai kritis atau p-value kurang dari alpha, maka H0 ditolak.
Contoh Perhitungan : Pada kasus sebelumnya, kita memiliki data, oleh karena itu kita akan melihat apakah ada hubungan antara kebiasaan olahraga dengan cara bangun tidur.
Secara Manual : Misalkan kita memiliki tabel berikut:
| Kejadian Ya | Kejadian Tidak | Total | |
|---|---|---|---|
| Terpapar | 40 | 10 | 50 |
| Tidak Terpapar | 20 | 30 | 50 |
| Total | 50 | 50 | 100 |
Hitung nilai yang diharapkan \(E\):
\[ E_{11} = \frac{50 \times 50}{100} = 25 \]
\[ E_{12} = \frac{50 \times 50}{100} = 25 \]
\[ E_{21} = \frac{50 \times 50}{100} = 25 \]
\[ E_{22} = \frac{50 \times 50}{100} = 25 \]
Hitung nilai \(\chi^2\):
\[ \chi^2 = \frac{(40 - 25)^2}{25} + \frac{(10 - 25)^2}{25} + \frac{(20 - 25)^2}{25} + \frac{(30 - 25)^2}{25} \]
\[ = 15.042 \] Hitung Derajat Kebebasan
\[ df = (2 - 1)(2 - 1) = 1 \]
Jika \(p\)-value < 0.05, maka kita menolak hipotesis nol.
Dengan ini diperoleh bahwa kita menolak H0 yang menandakan kalau ada hubungan antara kebiasaan olahraga dengan cara bangun tidur.
Perhitungan R :
#Load data
data <- matrix(c(40, 10, 20, 30), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Olahraga" = c("Ya", "Tidak"), "Cara Bangun" = c("Ya", "Tidak"))
print(data)
## Cara Bangun
## Olahraga Ya Tidak
## Ya 40 10
## Tidak 20 30
#Uji
chisq_test <- chisq.test(data)
print(chisq_test)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data
## X-squared = 15.042, df = 1, p-value = 0.0001052
Dengan perhitungan tersebut diperoleh nilai p-value yang kurang dari alpha (0,05). Oleh karena itu dapat disimpulkan bahwa terdapat hubungan antara kebiasaan olahraga dengan cara bangun tidur
Selain dengan chi-square dapat dihitung juga dengan metode lain seperti
Partisi Chi-Square
metode untuk membagi total nilai chi-square menjadi beberapa bagian sesuai dengan perbandingan yang lebih spesifik antar kategori. Dengan membandingkan setiap bagian, peneliti dapat mengidentifikasi sumber ketidaksesuaian dalam data. Ini memungkinkan analisis yang lebih terfokus dibanding hanya melihat uji chi-square secara keseluruhan.
Contoh kasus : Dilakukan sebuah survey dan diperoleh data dengan kriteria sebagai berikut
| Gender | Democrat | Republican | Independent | Total |
|---|---|---|---|---|
| Female | 495 | 272 | 590 | 1357 |
| Male | 330 | 265 | 498 | 1093 |
| Total | 825 | 537 | 1088 | 2450 |
Maka diminta apakah ada hubungan antara gender dengan identifikasi partai politik?
Langkah pertama yakni dengan menghitungan chi-square secara keseluruhan
# Data Observasi
data_matrix <- matrix(c(495, 272, 590, 330, 265, 498), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Democrat", "Republican", "Independent")
rownames(data_matrix) <- c("Female", "Male")
# Uji Chi-Square
chi_test <- chisq.test(data_matrix)
# Hasil
list(
Chi_Square = chi_test$statistic,
P_Value = chi_test$p.value,
Decision = ifelse(chi_test$p.value < 0.05, "Tolak H0 (Ada hubungan)", "Gagal Tolak H0 (Tidak ada hubungan)")
)
## $Chi_Square
## X-squared
## 12.56926
##
## $P_Value
## [1] 0.00186475
##
## $Decision
## [1] "Tolak H0 (Ada hubungan)"
Langkah selanjutnya adalah dengan melakukan partisi chi–square democrat vs republician dan partisi democrat + republic vs independet. Terakhir tinggal di bandingkan dengan nilai chi square tabel
# Data Observasi
data_matrix <- matrix(c(495, 272, 330, 265), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Democrat", "Republican")
rownames(data_matrix) <- c("Female", "Male")
# Uji Chi-Square Partisi 1
chi_test1 <- chisq.test(data_matrix)
# Data Partisi 2
data_matrix2 <- matrix(c(767, 590, 595, 498), nrow = 2, byrow = TRUE)
colnames(data_matrix2) <- c("Dem+Rep", "Independent")
rownames(data_matrix2) <- c("Female", "Male")
# Uji Chi-Square Partisi 2
chi_test2 <- chisq.test(data_matrix2)
# Hasil
list(Chi_Square_Partisi1 = chi_test1, Chi_Square_Partisi2 = chi_test2)
## $Chi_Square_Partisi1
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data_matrix
## X-squared = 11.178, df = 1, p-value = 0.0008279
##
##
## $Chi_Square_Partisi2
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data_matrix2
## X-squared = 0.98267, df = 1, p-value = 0.3215
Dengan ini diperoleh bahwa gender mempengaruhi pemilihan democrat dan republic. Hal ini ditunjukkan jelas dengan nilai pvalue yang sangat kecil. Sedangkan pilihan independent tidak berpengaruh signifikan berdasarkan gender.
Uji Likelihood Ratio
Ini merupakan alternatif dari pengujian chisquare.
\[ G^2 = 2 \sum_{i=1}^{k} O_i \ln\left(\frac{O_i}{E_i}\right) \]
Dimana:
- \(O_i\) = Frekuensi yang diamati pada kategori \(i\)
- \(E_i\) = Frekuensi yang diharapkan pada kategori \(i\) berdasarkan distribusi yang dihipotesiskan,
- \(k\) = Jumlah kategori atau kelompok yang ada dalam data,
- \(\ln\) = Fungsi logaritma natural.
Perhitungannya manual :
Langkah 1: Hitung Frekuensi Ekspektasi \[\hat{\mu}_{11} = \frac{50 \times 50}{100} =
25\]
\[\hat{\mu}_{12} = \frac{50 \times 50}{100} =
25\]
\[\hat{\mu}_{21} = \frac{50 \times 50}{100} =
25\]
\[\hat{\mu}_{22} = \frac{50 \times 50}{100} =
25\] Langkah 2 : Hitung Statistik Uji G \[
G^2 = 2 \left[
40 \ln\left(\frac{40}{25}\right) +
10 \ln\left(\frac{10}{25}\right) +
20 \ln\left(\frac{20}{25}\right) +
30 \ln\left(\frac{30}{25}\right)
\right]
\] \[
= 17.26
\]
Langkah 3 : Bandingkan dengan Distribusi Chi Square
\[ (I - 1)(J - 1) = (2 - 1)(2 - 1) = 1 \]
\[ \chi^2_{0.05, 1} = 3.841 \]
Karena \[G^2 = 17.26 > 3.841\] maka tolak \[H_0\] dan simpulkan bahwa ada hubungan signifikan antara status merokok dan kanker paru-paru. Demikian juga dengan perhitungan menggunakan R
# Data Observasi
data <- matrix(c(40, 10, 20, 30), nrow = 2, byrow = TRUE)
colnames(data) <- c("Langsung", "Tunda")
rownames(data) <- c("Olahraga", "Jarang")
# Hitung Frekuensi Ekspektasi
data_expected <- chisq.test(data)$expected
# Hitung Statistik G²
G2 <- 2 * sum(data * log(data / data_expected))
# Nilai kritis chi-square untuk df = 1 dan alpha = 0.05
critical_value <- qchisq(0.95, df = 1)
# Hasil
list(G2 = G2, Critical_Value = critical_value, Decision = ifelse(G2 > critical_value, "Reject H0", "Fail to Reject H0")
)
## $G2
## [1] 17.26092
##
## $Critical_Value
## [1] 3.841459
##
## $Decision
## [1] "Reject H0"
Uji Exact Fisher
Digunakan untuk menguji hubungan antara dua variabel kategori dalam tabel kontingensi kecil, terutama ukuran 2x2, ketika frekuensi sel rendah. Uji ini memberikan nilai p yang akurat tanpa mengandalkan distribusi chi-square. \[ P = \frac{ \binom{a + b}{a} \binom{c + d}{c} }{ \binom{n}{a + c} } \] Cocok untuk sampel kecil dan ketika asumsi uji chi-square tidak dipenuhi.
data <- matrix(c(40, 10, 20, 30), nrow = 2, byrow = TRUE)
fisher.test(data)
##
## Fisher's Exact Test for Count Data
##
## data: data
## p-value = 8.309e-05
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 2.265787 16.390918
## sample estimates:
## odds ratio
## 5.881258Dalam tabel kontingensi, analisis residual digunakan untuk mengidentifikasi sel yang menyumbang paling banyak terhadap hubungan antara variabel. Jika nilai residual 0 maka variabel baris dan kolom tidak punya hubungan kuat atau polanya tidak jelas. Dalam pengerjaannnya ada 2 macam analisis untuk residual, yakni
Pearson Residual
Selisih antara frekuensi yang diobservasi (O) dan diharapkan (E) dalam sebuah sel, yang kemudian dibagi dengan akar dari nilai yang diharapkan. Rumusnya adalah:
\[ r_{ij}^{(P)} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]
Nilai residual ini menunjukkan seberapa besar deviasi antara data aktual dengan ekspektasi berdasarkan hipotesis nol. Semakin besar nilainya (positif atau negatif), semakin besar kontribusi sel tersebut terhadap nilai total chi-square, dan semakin “tidak sesuai” sel tersebut dengan model nol.
Standardized Residual
Standardized Residual adalah Pearson Residual yang telah disesuaikan dengan mempertimbangkan varians dari distribusi. Dalam konteks tabel kontingensi, residual ini dihitung untuk memperbaiki bias dan ketidakseimbangan dalam data. Rumus umumnya adalah:
\[ r_{ij}^{(S)} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}(1 - p_{i.})(1 - p_{.j})}} \]
Residual ini memberikan ukuran yang lebih tepat tentang keanehan suatu sel, dengan memperhitungkan posisi sel dalam struktur tabel. Nilai residual yang lebih besar dari ±2 sering dianggap menunjukkan bahwa sel tersebut menyimpang secara signifikan dari yang diharapkan.
Contoh perhitungannya
# Data Observasi
observed <- matrix(c(40, 10, 20, 30), nrow = 2, byrow = TRUE)
# Hitung nilai ekspektasi
expected <- chisq.test(observed)$expected
# Pearson Residual
pearson_residual <- (observed- expected) / sqrt(expected)
# Standardized Residual
row_sum <- rowSums(observed)
col_sum <- colSums(observed)
total_sum <- sum(observed)
# Menampilkan hasil
standardized_residual <- (observed- expected) / sqrt(expected * (1- row_sum/total_sum)*(1-col_sum/total_sum))
list(
Pearson_Residual = pearson_residual,
Standardized_Residual = standardized_residual
)
## $Pearson_Residual
## [,1] [,2]
## [1,] 1.825742 -2.236068
## [2,] -1.825742 2.236068
##
## $Standardized_Residual
## [,1] [,2]
## [1,] 4.082483 -5.000000
## [2,] -3.333333 4.082483
Kemudian dapat juga mendeteksi outlier. Outlier sendiri adalah data yang jauh dari penyebaran data lainnya. Contoh perhitungannya sebagai berikut
# Data Observasi
observed <- matrix(c(40, 10, 20, 30), nrow = 2, byrow = TRUE)
colnames(observed) <- c("Sukses", "Gagal")
rownames(observed) <- c("Grup A", "Grup B")
# Hitung nilai ekspektasi
expected <- chisq.test(observed)$expected
# Pearson Residual
pearson_residual <- (observed- expected) / sqrt(expected)
# Standardized Residual
row_sum <- rowSums(observed)
col_sum <- colSums(observed)
total_sum <- sum(observed)
standardized_residual <- (observed- expected) / sqrt(expected * (1- row_sum/total_sum)*(1-col_sum/total_sum))
# Menampilkan hasil
list(
Observed = observed,
Expected = expected,
Pearson_Residual = pearson_residual,
Standardized_Residual = standardized_residual
)
## $Observed
## Sukses Gagal
## Grup A 40 10
## Grup B 20 30
##
## $Expected
## Sukses Gagal
## Grup A 30 20
## Grup B 30 20
##
## $Pearson_Residual
## Sukses Gagal
## Grup A 1.825742 -2.236068
## Grup B -1.825742 2.236068
##
## $Standardized_Residual
## Sukses Gagal
## Grup A 4.082483 -5.000000
## Grup B -3.333333 4.082483
Jika nilai | r | > 3, maka data tersebut dianggap sebagai outlier. Pada data ini dapat dilihat bahwa terdapat outlier jika diuji menggunakan standardized residual, namun dengan pearson tidak terdapat outlier yang signifikan.
Pada Bab 2 ini dibahas beberapa analisis terhadap tabel kontingensi 2 arah.
Merupakan tabel yang digunakan muntuk meyajikan dan menganalisis 3 variabel kategori secara langsung. Dalam banyak situasi, biasanya hubungan dari variabel X dan Y dapat diperngaruhi oleh variabel lainnya, misalkan Z. Oleh karena itu variabel Z ini disebut sebagai variabel kontrol atau kovariat.
Contohnya
Hubungan antara kebiasaan begadang dengan seringnya lupa pada mahasiswa dan pekerja.
Kebiasaan orang-orang sekarang adalah bekerja ketika mepet dengan deadlinenya. Hal ini jadi salah satu pemicu utama banyak orang-orang menjadikan begadang menjadi kebiasaan. Padahal sebenarnya kebiasaan begadang merupakan kebiasaan buruk yang mungkin saja memberikan pengaruh yang buruk. Kebiasaan ini telah menjalar ke semua kelompok manusia, terutama mahasiswa dan orang yang bekerja.
Mahasiswa sering begadang untuk menyelesaikan tuntutan akademik seperti mengerjakan tugas atau sibuk dengan kegiatan keorganisasian atau bahkan sibuk dengan hiburan hingga lupa istirahat. Sementara itu, pekerja begadang karena beban kerja tinggi tekanan dan lainnya. Hal ini bisa saja menjadi salah satu alasan turunya daya ingat dan konsentrasi.
Menurut Walker (2017), kebiasaan begadang merupakan kebiasaan yang membawa efek buruk, karena tidur memberikan fungsi yang baik untuk otak, termasuk memori dan konsentrasi. Selain itu, dikuatkan oleh Curcio (2006) menyatakan bahwa kurang tidur dapat memengauhi kemampuan belajar dan daya ingat.
Untuk itu, pada kasus ini akan dianalisis dari 120 orang responden untuk mengetahui apakah kebiasaan begadang secara signifikan memengauhi seseorang menjadi lebih sering lupa. Variabel yang digunakan adalah sebagai berikut
X = Kebiasaan begadang (Ya atau Tidak)
Y = Sering Lupa (Ya atau Tidak)
Z = Status (Mahasiswa atau Pekerja)
Untuk hasil survei dapat diperoleh sebagai berikut
| Status | Begadang | Sering Lupa YA | Sering Lupa Tidak |
|---|---|---|---|
| Mahasiswa | Ya | 30 | 10 |
| Mahasiswa | Tidak | 8 | 12 |
| Pekerja | Ya | 18 | 7 |
| Pekerja | Tidak | 10 | 25 |
Pada data ini, variabel status bekerja sebagai variabel confounder. Confounder adalah variabel yang bisa memengaruhi baik variabel independen (X) maupun variabel dependen (Y). Hal ini terkadang bisa memberikan hubungan antar variabel dependen dan independent padahal sebenarnya hubungan terjadi karena confounder yang bukan sebab utama dari kasus tersebut.
Pada kasus tadi, variabel pekerja dan mahasiswa ini dapat menjadi confouder karena dapat memengaruhi kebiasaan begadang maupun sering lupa. Jika hal ini tidak dikontrol, hubungan antar keduanya bisa tampak lebih kuat maupun lebih lemah. oleh karena itu perlu adanya kontrol terhadap variabel Z ini agar dapat memastikan bahwa kebiasaan begadang memang menjadi faktor utama dari sering lupa.
Tabel parsial merupakan tabel yang menyajikan hubungan natara X dan Y pada setiap kategori Z. INi memungkinkan analisis hubungan bersyarat dimana efek Z dikendalikan.
Tabel Marginal adalah tabel yang diperoleh dengan mengabaikan Z yaitu dengan menjumlahkan semua kateogir Z. Ini memberikan gambaran umum antara X dan Y tanpa mempertimbangkan Z. Hal ini yang dapat menyebabkan distorsi interpretasi seperti dalan Simpson’ Paradox.
Simpson paradox adalah enomena dalam analisis data dimana tren atau hubungan yang terlihat pada kelompok kecil berbalik arah atau hilang ketika data digabungkan secara keseluruhan.
Oleh karena itu, analisis yang mempertimbangkan tabel parsial lebih diutamakan untuk mendapatkan kesimpulan yang lebih akurat dalam penelitian Ilmiah.
Pada kasus sebelumya, kita dapat membentuk tabel frekuensi parsial dan marginalnya sebagai berikut
Tabel Parsial
Tabel ini merupakan tabel yang menyajikan data dari dua variabel dari tabel kontingensi tiga arah dengan satu variabel lainnya sebagai kontrol.
# Instal Package
library(knitr)
# Data awal
data <- array(
c(30,10,8,12,18,7,10,25),
dim = c(2,2,2),
dimnames = list(
Y = c("Sering Lupa", "Tidak Sering Lupa"),
X = c("Begadang", "Tidak Begadang"),
Z = c("Mahasiswa", "Bekerja")
)
)
data
## , , Z = Mahasiswa
##
## X
## Y Begadang Tidak Begadang
## Sering Lupa 30 8
## Tidak Sering Lupa 10 12
##
## , , Z = Bekerja
##
## X
## Y Begadang Tidak Begadang
## Sering Lupa 18 10
## Tidak Sering Lupa 7 25Tabel Marginal
Tabel yang menampilkan jumlah total observasi untuk setiap variabel dengan mengabaikan variabel lainnya dalam tabel kontingensi tiga arah.
margin_YX <- apply(data, c(1,2),sum)
margin_YZ <- apply(data, c(1,3),sum)
margin_XZ <- apply(data, c(2,3),sum)
cat("\n ##Marginal Y dan X \n")
##
## ##Marginal Y dan X
kable(data, format = "html", booktabs = TRUE)
|
Begadang.Mahasiswa |
Tidak Begadang.Mahasiswa |
Begadang.Bekerja |
Tidak Begadang.Bekerja |
|
|---|---|---|---|---|
|
Sering Lupa |
30 |
8 |
18 |
10 |
|
Tidak Sering Lupa |
10 |
12 |
7 |
25 |
kable(margin_YX, format = "html", booktabs = TRUE)
|
Begadang |
Tidak Begadang |
|
|---|---|---|
|
Sering Lupa |
48 |
18 |
|
Tidak Sering Lupa |
17 |
37 |
Tabel Peluang Bersama, Marginal dan Bersyarat
Tabel peluang bersama didefinisikan sebagai tabel yang berisi peluang bersama dari setiap sel. Tabel peluang Marginal merupakan sum dari peluang bersama sedangkan tabel peluang bersyarat merupakan tabel yang dihitung berdasarkan jumlah total dalam setiap kategori. Contohnya :
data3 <- array(c(30, 10, 8, 12, 18, 7, 10, 25),
dim = c(2, 2, 2),
dimnames = list(
Begadang = c("Ya", "Tidak"),
Pelupa = c("Ya", "Tidak"),
Status = c("Mahasiswa", "Pekerja")
))
# Hitung probabilitas bersama
total <- sum(data3)
joint_prob <- data3 / total
ftable(joint_prob)
## Status Mahasiswa Pekerja
## Begadang Pelupa
## Ya Ya 0.25000000 0.15000000
## Tidak 0.06666667 0.08333333
## Tidak Ya 0.08333333 0.05833333
## Tidak 0.10000000 0.20833333
# Hitung probabilitas marginal
marginal_X <- apply(joint_prob, 1, sum)
marginal_Z <- apply(joint_prob, 3, sum)
# Tampilkan hasil
marginal_X
## Ya Tidak
## 0.55 0.45Ukuran asosiasi adalah ukuran yang digunakan untuk mengukur hubungan antara dua variabel, terutama dalam data kategorik. Ada beberapa yang akan diujikan yakni beda peluang, resiko relatif dan odd ratio. Sama halnya dengan tabel kontingensi dua arah, perhitungan ukuran asosiasi ini menggunakan formula yang sama dengan tabel peluang yang telah diberikan sebelumnya.
Ukuran asosiasi digunakan untuk melihat interpretasi dari tabel mahasiswa.
a <-data["Sering Lupa", "Begadang", "Mahasiswa"]
b <-data["Tidak Sering Lupa", "Begadang", "Mahasiswa"]
c <-data["Sering Lupa", "Tidak Begadang", "Mahasiswa"]
d <-data["Tidak Sering Lupa", "Tidak Begadang", "Mahasiswa"]
p1 <- a / (a + b)
p2 <- c / (c + d)
RD_mhs <- p1 - p2
RR_mhs <- p1 / p2
OR_mhs <- (a*d)/(b*c)
ukuran_asosiasi_mhs <- data.frame(
Statistik = c("RD", "RR", "OR"),
Nilai = c(RD_mhs, RR_mhs, OR_mhs)
)
kable(ukuran_asosiasi_mhs, format = "html", booktabs = TRUE, col.names = c("Ukuran Asosiasi", "Nilai"))
| Ukuran Asosiasi | Nilai |
|---|---|
| RD | 0.350 |
| RR | 1.875 |
| OR | 4.500 |
Dengan ini diperoleh bahwa
a <-data["Sering Lupa", "Begadang", "Bekerja"]
b <-data["Tidak Sering Lupa", "Begadang", "Bekerja"]
c <-data["Sering Lupa", "Tidak Begadang", "Bekerja"]
d <-data["Tidak Sering Lupa", "Tidak Begadang", "Bekerja"]
p1 <- a / (a + b)
p2 <- c / (c + d)
RD_bkr <- p1 - p2
RR_bkr <- p1 / p2
OR_bkr <- (a*d)/(b*c)
ukuran_asosiasi_bkr <- data.frame(
Statistik = c("RD", "RR", "OR"),
Nilai = c(RD_bkr, RR_bkr, OR_bkr)
)
kable(ukuran_asosiasi_bkr, format = "html", booktabs = TRUE, col.names = c("Ukuran Asosiasi", "Nilai"))
| Ukuran Asosiasi | Nilai |
|---|---|
| RD | 0.4342857 |
| RR | 2.5200000 |
| OR | 6.4285714 |
Dengan ini diperoleh bahwa
a <-margin_YX["Sering Lupa", "Begadang"]
b <-margin_YX["Tidak Sering Lupa", "Begadang"]
c <-margin_YX["Sering Lupa", "Tidak Begadang"]
d <-margin_YX["Tidak Sering Lupa", "Tidak Begadang"]
p1 <- a / (a + b)
p2 <- c / (c + d)
RD_marginal <- p1 - p2
RR_marginal <- p1 / p2
OR_marginal <- (a*d)/(b*c)
ukuran_asosiasi_marginal <- data.frame(
Statistik = c("RD", "RR", "OR"),
Nilai = c(RD_marginal, RR_marginal, OR_marginal)
)
kable(ukuran_asosiasi_marginal, format = "html", booktabs = TRUE, col.names = c("Ukuran Asosiasi", "Nilai"))
| Ukuran Asosiasi | Nilai |
|---|---|
| RD | 0.4111888 |
| RR | 2.2564103 |
| OR | 5.8039216 |
Dengan ini diperoleh bahwa
Mengacu pada situasi di mana dua variabel bebas secara statistik jika diketahui nilai dari variabel ketiga. Dalam kata lain, dua variabel tampak memiliki hubungan, tetapi hubungan itu sebenarnya dijelaskan sepenuhnya oleh variabel ketiga.
\[ P(X, Y \mid Z) = P(X \mid Z) \cdot P(Y \mid Z) \] Dalam bentuk frekuensi
\[ \frac{n_{ijk}}{n_{k++}} = \left( \frac{n_{i+k}}{n_{k++}} \right) \cdot \left( \frac{n_{+jk}}{n_{k++}} \right) \]
Selain itu, dilakukan pengujian terhadap conditional Independent untuk membuktikan apakah sebuah variabel memiliki hubungan signifikan setelah dikendalikan oleh variabel kontrol. Contoh perhitungannya :
library(knitr)
library(kableExtra)
data <- array(
c(30, 10, 8, 12, 18, 7, 10, 25),
dim = c(2, 2, 2),
dimnames = list(
"Begadang" = c("Ya", "Tidak"),
"Pelupa" = c("Ya", "Tidak"),
"Status" = c("Mahasiswa", "Pekerja")
)
)
for (z in dimnames(data)$Status) {
df <- as.data.frame.matrix(data[,,z])
colnames(df) <- c("Ya", "Tidak")
rownames(df) <- c("Ya", "Tidak")
print(kable(df, format = "pandoc", booktabs = TRUE,
caption = paste("Tabel untuk status =", z)) %>%
kable_styling(full_width = FALSE, position = "center"))
}
##
##
## Table: Tabel untuk status = Mahasiswa
##
## Ya Tidak
## ------ --- ------
## Ya 30 8
## Tidak 10 12
##
##
## Table: Tabel untuk status = Pekerja
##
## Ya Tidak
## ------ --- ------
## Ya 18 10
## Tidak 7 25
# Uji Chi-Square untuk masing-masing strata usia
chisq_muda <- chisq.test(data[,,"Mahasiswa"])
chisq_tua <- chisq.test(data[,,"Pekerja"])
chisq_muda
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data[, , "Mahasiswa"]
## X-squared = 5.6071, df = 1, p-value = 0.01789
chisq_tua
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data[, , "Pekerja"]
## X-squared = 9.375, df = 1, p-value = 0.0022
Dengan ini dapat dilihat bahwa terdapat hubungan signifikan antara kebiasaan begadang dengan frekuensi sering lupa setelah dikontrol oleh variabel status.
Indenpendensi bersyarat merupakan konsep penting dalam analisis tabel kontingensi 3 arah. Ini merujuk pada kondisi dimana dua variabel pada setiap level variabel ketiga. Secara matematis dapat ditulisankan sebagai :
\[ OR(X, Y \mid Z) = 1 \]
Meskipun mereka X dan Y independent, tapi tidak menutup kemungkinan bahwa mereka tidak independet pada tabel marginalnya yang ini disebut sebagai simpson paradox.
Uji Mantel-Haenszel digunakan untuk menguji hubungan dua variabel sambil mengontrol variabel ketiga. Jadi disini dilihat apakah hubungan kebiasaan begadang dan sering lupa tetap signifikan setelah dikontrol berdasarkan status. Rumus dari CMH adalah sebagai berikut
\[ \chi^2_{\text{CMH}} = \frac{\left[ \sum_{k=1}^K \left( a_k - \frac{(a_k + b_k)(a_k + c_k)}{n_k} \right) \right]^2} {\sum_{k=1}^K \frac{(a_k + b_k)(c_k + d_k)(a_k + c_k)(b_k + d_k)}{n_k^2(n_k - 1)}} \]
Metode ini berguna dalam pengendalian faktor rancu ketika tabel kontingensi berlapis, mampu menguji hipotesis dua variabel akibat variabel ketiga serta bias dalam pembaurannya. Contoh perhitungannya dapat dilakukan dengan soal sebelumnya. Menggunakan fungsi mantelhaen.test pada R dan diperoleh hasil sebagai berikut
library(vcdExtra)
mantelhaen.test(data, correct = FALSE)
##
## Mantel-Haenszel chi-squared test without continuity correction
##
## data: data
## Mantel-Haenszel X-squared = 17.69, df = 1, p-value = 2.6e-05
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 2.412071 12.089198
## sample estimates:
## common odds ratio
## 5.4
Pada pengujian diatas, diperoleh beberapa kesimpulan :
Odd rasio bersama ini diperoleh ketika terdapat tabel kontingensi dengan ukuran (2 x 2 x k) yang hal ini menyebabkan akan ada K odd rasio bersyarat. Jika odd rasio bersyarat ini relatif sama dan memiliki arah yang sama, maka bisa ditentukan nilai tunggal rasio yang disebut dengan odd rasio bersama. Formula odd rasio bersama ini adalah
penaksir
\[ \theta_{\text{MH}} = \frac{ \sum_{k=1}^{K} \frac{n_{11k} \cdot n_{22k}}{n_{\cdot \cdot k}} }{ \sum_{k=1}^{K} \frac{n_{12k} \cdot n_{21k}}{n_{\cdot \cdot k}} } \] Dengan:
standar error
Standar error dari \(\log(\theta_{\text{MH}})\) didekati dengan:
\[ \sigma^2 \left[ \log(\theta_{\text{MH}}) \right] = \frac{ \sum\limits_{k=1}^{K} (n_{12k} + n_{21k}) \cdot \left( \frac{n_{12k} \cdot n_{21k}}{n_{\cdot \cdot k}^2} \right) } { 2 \left( \sum\limits_{k=1}^{K} \frac{n_{12k} \cdot n_{21k}}{n_{\cdot \cdot k}} \right)^2 } \]
Dengan:
Dengan \(w_k\) adalah bobot strata \(k\).
Interval kepercayaan \(100(1 - \alpha)\%\) untuk odds ratio Mantel-Haenszel diberikan oleh:
\[ \log(\theta_{\text{MH}}) \pm z_{\alpha/2} \cdot \sigma\left[ \log(\theta_{\text{MH}}) \right] \]
Sehingga, bentuk interval kepercayaan untuk \(\theta_{\text{MH}}\) adalah:
\[ \left( \exp\left[ \log(\theta_{\text{MH}}) - z_{\alpha/2} \cdot \sigma \right], \quad \exp\left[ \log(\theta_{\text{MH}}) + z_{\alpha/2} \cdot \sigma \right] \right) \]
Sebagai contoh, tersedia data berikut
| City | Smooking | Kanker (YA) | Kanker (NO) |
|---|---|---|---|
| Beijing | Smoker | 126 | 100 |
| Beijing | Non Smoker | 35 | 61 |
| Shanghai | Smoker | 908 | 688 |
| Shanghai | Non Smoker | 497 | 807 |
| Shenyang | Smoker | 913 | 747 |
| Shenyang | Non Smoker | 336 | 598 |
| Nanjing | Smoker | 235 | 172 |
| Nanjing | Non Smoker | 58 | 121 |
| Harbin | Smoker | 402 | 308 |
| Harbin | Non Smoker | 121 | 215 |
| Zhengzou | Smoker | 182 | 156 |
| Zhengzou | Non Smoker | 72 | 98 |
| Taiyuun | Smoker | 60 | 99 |
| Taiyuun | Non Smoker | 11 | 43 |
| Nanchang | Smoker | 104 | 89 |
| Nanchang | Non Smoker | 21 | 36 |
Diketahui data hasil peneltiain 8 provinsi di China mengenai kebiasaan merokok (X), kanker paru (Y) dan provinsi (Z). Hitung odd rasio bersamanya.
library(epitools) # Paket untuk menghitung odds ratio
# Data dari 8 kota dalam bentuk array
lung_cancer_data <- array(
c(126, 35, 61, 100,
908, 497, 688, 807,
913, 336, 747, 598,
235, 58, 172, 121,
402, 121, 308, 215,
182, 72, 156, 98,
60, 11, 99, 43,
104, 21, 89, 36),
dim = c(2, 2, 8),
dimnames = list(
Smoking = c("Smokers", "Nonsmokers"),
Lung_Cancer = c("Yes", "No"),
City = c("Beijing", "Shanghai", "Shenyang", "Nanjing", "Harbin",
"Zhengzhou", "Taiyunn", "Nanchang")
)
)
# Menghitung odds ratio bersama
mh_test <- mantelhaen.test(lung_cancer_data, correct = FALSE)
print(mh_test)
##
## Mantel-Haenszel chi-squared test without continuity correction
##
## data: lung_cancer_data
## Mantel-Haenszel X-squared = 308.89, df = 1, p-value < 2.2e-16
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 2.056753 2.469706
## sample estimates:
## common odds ratio
## 2.253791
Dari output tersebut dapat dilihat bahwa odd rasio bersamanya adalah 2,25 yang mengartikan bahwa orang yang merokok memiliki peluang 2,25x lebih besar untuk terkena kanker daripada orang yang tidak merokok.
Homogenitas ini terjadi jika odd rasio pada setiao tabel parsial bernilai sama
\[ \theta_{XY}^{(1)} = \theta_{XY}^{(2)} = \cdots = \theta_{XY}^{(K)} \]
Jika odd rasio berbeda di setiap kontrol (Z) maka terdapat interaksi antara X dan Y dalam hubungannya terhadap Z dan berlaku sebaliknya. Hipotesis dari pengujian ini adalah
H0 : odd rasio sama pada seluruh strata
H1 : Setidaknya ada satu odd rasio yang berbeda
Untuk menguji homogenitas, digunakan uji Breslow-Day. Ini ditujukan untuk melihat apakah kebiasaan begadang dan frekuensi lupa berbeda secara signifikan antara dua kelompok mahasiswa dan bekerja. Rumus dari Breslow Day adalah sebagai berikut
\[ Q_{\text{BD}} = \sum_{k=1}^K \frac{\left( \hat{\text{OR}}_k - \hat{\text{OR}}_{\text{MH}} \right)^2}{\text{Var}(\hat{\text{OR}}_k)} \]
Stastitik ini mengikuti distribusi chi square dengan derajat bebas = k - 1 sehingga pengambilan keputusannya dalapt dilakukan dengan perbandingan terhadap nilai chi square tabel.
library(DescTools)
library(vcdExtra)
breslow_test <- BreslowDayTest(data)
print(breslow_test)
##
## Breslow-Day test on Homogeneity of Odds Ratios
##
## data: data
## X-squared = 0.18726, df = 1, p-value = 0.6652
Pada hasil di atas diperoleh p-value bernilai 0,6652 yang mana keputusannya adalah menerima H0. Jadi antara kebiasaan begadang dan frekuensi lupa pada kelompok mahasiswa dan pekerja relatif sama alias homogen.
Dari beberapa contoh soal mengenai kasusu kebiasaan begadang terhadap frekuensi lupa dengan kontrol status sebagai berikut
Pada Bab ini dicobakan beberapa pengerjaan dengan penjelasan sebagai berikut
Generalized Linear Model (GLM) adalah suatu kerangka statistik yang memperluas model regresi linear dengan memungkinkan variabel respon mengikuti distribusi yang tidak harus normal, seperti binomial, Poisson, atau gamma. GLM menghubungkan nilai harapan dari variabel respon dengan kombinasi linear dari variabel prediktor melalui suatu fungsi link. Model ini digunakan untuk menganalisis berbagai jenis data, terutama ketika asumsi normalitas tidak terpenuhi.
GLM memiliki 3 komponen utama yakni
Komponen Acak
Nilai pengamatan variabel Y yang saling bebas dan berdistribusi keluarga eksponensial. Jadi variabel responnya mengikuti distribusi-distribusi yang termasuk ke dalam keluarga eksponen, contohnya distribusi normal dan poisson mengikuti kaidah exponential family. Untuk menentukan apakah sebuah distribusi mengikuti keluarga eksponensial, dapat dilakukan dengan pengujian atau pembuktian rumus berikut
\[ f(y; \theta) = \exp\left(a(y) \cdot b(\theta) + c(\theta) + d(y)\right) \]
Jika variabel acak dengan distribusi tertentu dapat dinyatakan dalam bentuk di atas, maka dinyatakan bahwa distribusi tersebut merupakan bagian dari exponential family. Contoh \[ P(Y = y) = p^y (1 - p)^{1 - y} \]
Dengan substitusi \(p = \frac{e^\theta}{1 + e^\theta}\), maka bentuk exponential family-nya menjadi: \[ P(Y = y) = \exp \left( y \cdot \log\left( \frac{\pi}{1 - \pi} \right) + n \cdot \log(1 - \pi) + \log \binom{n}{y} \right) \]
Dengan ini dapat dilihat bahwa distribusi binomial mengikuti kaidah keluarga eksponen
Komponen sistematik
Satu set parameter B dan variabel explanatory X yang membentuk kombinasi linear : \[ \eta = \alpha + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_p X_p \]
Bisa dikatakan bahwa ini adalah bentuk dari model linearnya.
Fungsi Penghubung (Link Function)
Merupakan fungsi penghubung antara komponen sistematik dengan nilai ekspektasi dari komponen acak.
Untuk nilai respon biner dapat dianalisis melalui model regresi logistik. Regresi Logistik hampir sama dengan model linear yang mana menginput kombinasi koefisien untuk menghasilkan prediksi, namun bedanya model ini hanya untuk data biner yang nanti prediksinya akan mengikuti kurva S (S-Shape). Sebagai contoh analisis terhadap kemungkinana seorang siswa diterima di perguruan tinggi tertentu berdasarkan nilai A, B dan C. Outputnya adalah perkiraan probabilitas seorang siswa diterima dengan menganalisis variabel variabel penentunya.
Secara teknis, Regresi Logistik lebih mudah diterapkan dalam metode pembelajaran. Regresi ini menggunakan fungsi sigmoid dalam memetakan prediksi dan probabilitasnya. Fungsi Sigmoid sendiri adalah kurva berbentuk S yang mengubah setiap nilai riil menjadi rentang antara 0 dan 1. Formula fungsi sigmoid sebagai berikut
\[ \mu = \frac{1}{1 + e^{-\eta}} \]
Jika hasil fungsi lebih dari ambang batas, maka model akan diperkirakan masuk ke kelompok tertentu. Misal ambang batas yang ditetapkan adalah 0.5. Ketika hasil nya kurang dari 0.5, maka dianggap masuk kelas bawah (biner = 0) dan sebaliknya.
Regresi logistik memiliki sejumlah keunggulan yang membuatnya populer dalam penerapan pembelajaran mesin. Salah satu alasan utamanya adalah kemudahan dalam implementasi dan efisiensi komputasi. Proses pembelajaran mesin umumnya melibatkan tahap pelatihan dan pengujian, di mana model dilatih untuk mengenali pola dari data masukan dan mengaitkannya dengan keluaran yang sesuai. Regresi logistik dapat dilatih dengan cepat dan tidak membutuhkan sumber daya komputasi yang besar, sehingga sangat cocok untuk digunakan terutama pada tahap awal pengembangan model. Selain itu, regresi logistik juga mudah untuk ditafsirkan, menjadikannya pilihan yang tepat bagi peneliti atau praktisi yang menginginkan hasil analisis yang transparan dan dapat dijelaskan secara logis.
Keunggulan lainnya terletak pada kemampuannya untuk bekerja secara efektif pada data yang dapat dipisahkan secara linear, yaitu ketika dua kelas dalam data dapat dipisahkan dengan garis lurus. Dalam konteks klasifikasi biner, regresi logistik mampu memetakan probabilitas suatu kejadian menggunakan fungsi logistik atau sigmoid, yang menghasilkan output dalam rentang 0 hingga 1. Fungsi ini memungkinkan prediksi probabilistik yang berguna dalam banyak aplikasi nyata. Selain itu, model ini juga memberikan informasi yang bernilai tentang pengaruh masing-masing variabel prediktor terhadap hasil, baik dari segi besar pengaruh maupun arah hubungannya, apakah positif atau negatif. Hal ini membuat regresi logistik tidak hanya berguna untuk prediksi, tetapi juga untuk eksplorasi dan pemahaman struktur data.
Simulasi Struktur Data dan Visualisasi
Sebuah perusahaan sedang meneliti hubungan antara skor psikotes pelamar dengan kemungkinan diterima bekerja. Peneliti mensimulasikan data untuk 50 pelamar, di mana skor psikotes (variabel x) diasumsikan berkisar dari sangat rendah (-7) hingga sangat tinggi (+7).
library(ggplot2)
#Simulasi Data Logistik
set.seed(28)
n <- 50
x <- seq(-7,7,length.out = n)
log.odds <- (-0.5) + 0.5 * x
prob <- 1 / (1 + exp(-log.odds))
y <- rbinom(n,1,prob)
data <- data.frame(x = x, y=y, prob = prob)
head(data)
## x y prob
## 1 -7.000000 0 0.01798621
## 2 -6.714286 0 0.02069111
## 3 -6.428571 0 0.02379294
## 4 -6.142857 0 0.02734679
## 5 -5.857143 0 0.03141437
## 6 -5.571429 0 0.03606454
#Visualisasi
plot (x,y,pch = 16, col ="gray60",
xlab = "X", ylab = "Probabilities",
main = "Simulasi Regresi Logistik dengan kurva sigmoid")
lines(x,prob, col = "blue", lwd = 2)
abline( h=0.5 , col = "red", lty = 2)
legend ("topleft",
legend = c("Data biner(0/1)", "Kurva Logsitik", "Ambang 0.5"),
col = c("gray60", "blue", "red"),
pch = c(16,NA,NA),
lwd = c(NA,2,1),
lty = c(NA,1,2),
pt.cex = 1.5,
bty = "n")
Kurva sigmoid dalam regresi logistik menunjukkan hubungan non-linear antara variabel prediktor dan probabilitas output. Pendekatan ini efektif untuk klasifikasi biner seperti deteksi penyakit, email spam, danprediksi ya/tidak.
Model ini sangat efektif digunakan pada data yang dapat dipisahkan
secara linear, yaitu ketika dua kelas dapat dipisahkan oleh sebuah garis
lurus. Regresi logistik menggunakan fungsi logistik atau sigmoid untuk
memetakan nilai input menjadi probabilitas antara 0 dan 1. Secara
matematis, fungsi link logit dituliskan sebagai:
\[
g(\mu) = \log\left(\frac{\mu}{1 - \mu}\right)
\]
yang kemudian dihubungkan dengan prediktor linear sebagai berikut:
\[
\log\left(\frac{\mu}{1 - \mu}\right) = X \cdot \beta
\]
Persamaan ini memungkinkan model untuk mengukur pengaruh variabel
prediktor terhadap probabilitas keluaran serta memberikan informasi arah
dan kekuatan hubungannya.
Dengan ini diperoleh fungsi inverse linknya sebagai berikut
\[ \mu = \frac{\exp(X\beta)}{1 + \exp(X\beta)} \]
Metode estimasi pada GLM umumnya menggunakan Maximum Likelihood Estimation dengan fungsi loglikelihood fungsi untuk regresi logistik :
\[ \mathcal{L}(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \] dengan : \[ \pi_i = \frac{\exp(\mathbf{x}_i^T \beta)}{1 + \exp(\mathbf{x}_i^T \beta)} \] Estimasi ini dilakukan dengan iterasi Newton-Raphson.
Contoh perhitungan dalam R
Pada contoh ini, kami akan memanfaatkan data bawaan mtcars dari paket dasar R, dengan terlebih dahulu mengubah variabel target menjadi variabel biner. Tujuan pemodelan adalah untuk memprediksi jenis transmisi mobil (apakah otomatis (0) atau manual (1)) dengan menggunakan variabel prediktor seperti konsumsi bahan bakar (mpg) dan tenaga mesin (hp).
data(mtcars)
df <- mtcars
df$am <- factor(df$am, labels = c("Automatic", "Manual"))
summary(df[, c("am", "mpg", "hp")])
## am mpg hp
## Automatic:19 Min. :10.40 Min. : 52.0
## Manual :13 1st Qu.:15.43 1st Qu.: 96.5
## Median :19.20 Median :123.0
## Mean :20.09 Mean :146.7
## 3rd Qu.:22.80 3rd Qu.:180.0
## Max. :33.90 Max. :335.0
#Estimasi Model Regresi Logistik
model_real <- glm(am ~ mpg + hp, data = df, family = binomial)
summary(model_real)
##
## Call:
## glm(formula = am ~ mpg + hp, family = binomial, data = df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -33.60517 15.07672 -2.229 0.0258 *
## mpg 1.25961 0.56747 2.220 0.0264 *
## hp 0.05504 0.02692 2.045 0.0409 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 43.230 on 31 degrees of freedom
## Residual deviance: 19.233 on 29 degrees of freedom
## AIC: 25.233
##
## Number of Fisher Scoring iterations: 7
exp(coef(model_real))
## (Intercept) mpg hp
## 2.543664e-15 3.524063e+00 1.056588e+00
df$prob <- predict(model_real, type = "response")
df$pred_class <- ifelse(df$prob > 0.5, "Manual", "Automatic")
library(ggplot2)
ggplot(df, aes(x =mpg, y = hp, color = pred_class, shape = am)) +
geom_point(size = 3) +
labs(title = "Prediksi Regresi Logistik: Transmisi Mobil",
x="Mil per Galon (mpg)",
y="Tenaga Kuda (hp)",
color = "Prediksi", shape = "Fakta") +
theme_minimal()
# Confusion matrix
table(Predicted = df$pred_class, Actual = df$am)
## Actual
## Predicted Automatic Manual
## Automatic 16 3
## Manual 3 10
Confusion matrix tersebut menunjukkan performa model dalam memprediksi jenis transmisi mobil berdasarkan variabel mpg dan hp. Dari total observasi, model berhasil mengklasifikasikan 16 mobil bertransmisi otomatis dan 10 mobil bertransmisi manual dengan benar. Terdapat kesalahan klasifikasi sebanyak 3 unit untuk masing-masing kategori, yakni 3 mobil manual diprediksi sebagai otomatis, dan sebaliknya. Secara umum, ini menunjukkan bahwa model cukup andal dalam membedakan dua jenis transmisi berdasarkan fitur yang digunakan.
Regresi Poisson adalah metode statistik yang umum digunakan untuk menganalisis data cacah atau data hitung, yaitu data yang menyatakan jumlah kejadian dalam suatu periode waktu atau wilayah tertentu. Model ini sangat cocok untuk variabel respons yang berupa bilangan bulat non-negatif seperti jumlah kecelakaan lalu lintas, jumlah panggilan telepon, atau jumlah penyakit pada populasi. Dalam regresi Poisson, diasumsikan bahwa variabel respons mengikuti distribusi Poisson, di mana rata-rata kejadian (parameter lambda) bergantung pada variabel prediktor melalui fungsi link logaritmik. Dengan kata lain, log dari nilai harapan jumlah kejadian dimodelkan sebagai kombinasi linier dari variabel-variabel independen, sehingga hubungan antara prediktor dan respons menjadi eksponensial.
Salah satu keunggulan utama regresi Poisson adalah kemampuannya untuk menangani data dengan karakteristik variansi yang sama dengan rata-rata, yang merupakan ciri khas distribusi Poisson. Model ini memungkinkan peneliti untuk memahami dan memprediksi faktor-faktor yang memengaruhi frekuensi kejadian, serta menilai signifikansi pengaruh tiap variabel prediktor secara simultan. Namun, dalam praktiknya, sering ditemukan kasus overdispersi, yaitu variansi data lebih besar dari rata-rata, yang dapat menyebabkan model Poisson standar kurang tepat. Dalam situasi seperti ini, metode alternatif seperti regresi negatif binomial bisa digunakan sebagai solusi untuk mengatasi masalah overdispersi tersebut. Regresi Poisson tetap menjadi alat analisis yang penting dalam ilmu sosial, kesehatan masyarakat, dan bidang lain yang memerlukan pemodelan data hitung.
Regresi ini cocok digunakan pada data respon cacah. Selain itu regresi poisson mengikuti keluarga eksponensial dengan
\[ P(Y = y) = \frac{\lambda^y e^{-\lambda}}{y!}, \quad y = 0, 1, 2, \dots \]
\[ f(y;\theta) = \exp\left(y \log(\lambda) - \lambda - \log(y!)\right)\ \]
Fungsi Link kanoniknya adalah
\[ g(\mu) = \log(\mu) \]
Hubungan antara prediktor dan respons dalam bentuk linear kemudian dinyatakan sebagai:
\[ \log(\mu_i) = x_i^{(T)} \beta \]
Sehingga bentuk eksponensial dari model regresi Poisson menjadi:
\[ \mu_i = \exp(x_i^{(T)} \beta) \]
Model ini memungkinkan kita untuk menafsirkan efek dari setiap variabel prediktor terhadap jumlah kejadian dalam skala logaritmik, serta memperkirakan nilai ekspektasi dari variabel cacah berdasarkan kombinasi linier prediktor.
Dalam Estimasi parameternya, dilakukan juga dengan Maximum Likelihood Estimation (MLE) dengan fungsinya sebagai berikut
\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^{n} \left[ y_i \mathbf{x_i}^T \boldsymbol{\beta} - \exp(\mathbf{x_i}^T \boldsymbol{\beta}) - \log(y_i!) \right] \]
Nilai 𝛽 dapat diperoleh melalui metode numerik seperti iterasi Newton-Raphson
Contoh perhitungannya
Sebuah perusahaan ritel ingin memahami bagaimana efektivitas iklan
online memengaruhi jumlah pelanggan yang datang ke toko fisik mereka.
Variabel x merepresentasikan skor efektivitas iklan online,
yang diperoleh melalui analisis internal terhadap berbagai indikator
kampanye pemasaran digital.
Untuk mensimulasikan hubungan ini, peneliti menghasilkan 200 data
acak skor iklan (x) dari distribusi normal. Lalu, mereka
mengasumsikan bahwa jumlah pelanggan yang datang ke toko dalam sehari
(y) mengikuti distribusi Poisson
set.seed(28)
n <- 200
x <- rnorm(n)
lambda <- exp(0.3 + 0.6 * x)
y <- rpois(n, lambda)
data <- data.frame(y, x)
head(data)
## y x
## 1 0 -1.90215722
## 2 1 -0.06429479
## 3 0 -1.33116707
## 4 1 -1.81999167
## 5 4 0.16266969
## 6 2 0.53139634
poisson_model <- glm(y ~ x, data = data, family = poisson)
summary(poisson_model)
##
## Call:
## glm(formula = y ~ x, family = poisson, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.20773 0.06738 3.083 0.00205 **
## x 0.61181 0.05946 10.290 < 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: 315.07 on 199 degrees of freedom
## Residual deviance: 206.92 on 198 degrees of freedom
## AIC: 552.44
##
## Number of Fisher Scoring iterations: 5
plot(data$x,data$y,pch=16, col="darkgray", main= "Data dan Hasil Prediksi")
newdata<-data.frame(x = seq(min(x), max(x), length.out=100))
pred <-predict(poisson_model,newdata= newdata,type= "response")
lines(newdata$x,pred, col="blue",lwd= 2)
Dari data simulasi tersebut, data dilihat bahwa intercept dan variabel prediktor(efektivitas iklan) memberikan pengaruh perubahan yang signifikan terhadap variabel respon(jumlah konsumen).
Overdispersion terjadi ketika varians lebih besar daripada rata-ratanya karena pada distribusi poisson, nilai rata rata = varians. Jika nilanya lebih dari satu (>1) maka terjadi overdispersion dan negative binomial regression adalah alternatif solusi modelnya. Untuk mendeteksinya digunakan rumusan berikut
dispersion<-sum(residuals(poisson_model, type="pearson")^2) /poisson_model$df.residual
dispersion
## [1] 0.916608
Pada pengujian tersebut, diperoleh nilai yang kurang dari 1, maka tidak terjadi overdispersion dan data simulasi ini cocok menggunakan regresi poisson.
Contoh Perhitungan 2
Regresi Poisson digunakan untuk memodelkan data cacah (count data), yaitu data respons berupa bilangan bulat non-negatif. Dalam contoh ini, kita akan menggunakan dataset warpbreaks dari R base package yang berisi jumlah patahan benang pada mesin tenun.
data("warpbreaks")
head(warpbreaks)
## breaks wool tension
## 1 26 A L
## 2 30 A L
## 3 54 A L
## 4 25 A L
## 5 70 A L
## 6 52 A L
summary(warpbreaks)
## breaks wool tension
## Min. :10.00 A:27 L:18
## 1st Qu.:18.25 B:27 M:18
## Median :26.00 H:18
## Mean :28.15
## 3rd Qu.:34.00
## Max. :70.00
poisson_model <- glm(breaks ~ wool + tension, data = warpbreaks, family = poisson)
summary(poisson_model)
##
## Call:
## glm(formula = breaks ~ wool + tension, family = poisson, data = warpbreaks)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.69196 0.04541 81.302 < 2e-16 ***
## woolB -0.20599 0.05157 -3.994 6.49e-05 ***
## tensionM -0.32132 0.06027 -5.332 9.73e-08 ***
## tensionH -0.51849 0.06396 -8.107 5.21e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 297.37 on 53 degrees of freedom
## Residual deviance: 210.39 on 50 degrees of freedom
## AIC: 493.06
##
## Number of Fisher Scoring iterations: 4
exp(coef(poisson_model))
## (Intercept) woolB tensionM tensionH
## 40.1235380 0.8138425 0.7251908 0.5954198
warpbreaks$predicted <- predict(poisson_model, type = "response")
library(ggplot2)
ggplot(warpbreaks, aes(x =tension, y=breaks, color = wool)) +
geom_jitter(width = 0.2, alpha = 0.6) +
geom_point(aes(y =predicted), shape = 18, size = 3, color = "black") +
facet_wrap(~wool) +
labs(title = "Prediksi Jumlah Patahan Benang berdasarkan Wol dan Ketegangan",
x="Tingkat Ketegangan",
y="Jumlah Patahan Benang",
color = "Jenis Wol") +
theme_minimal()
# Plot residuals
plot(poisson_model$residuals, main = "Residual Plot", ylab = "Residual", xlab = "Index", pch = 19, col = "gray60")
abline(h=0, col = "red", lty = 2)
Output regresi Poisson di atas menunjukkan bahwa variabel kategorikal wool dan tension berpengaruh signifikan terhadap jumlah patahan benang (breaks). Dari koefisien nya, terlihat bahwa kedua variabel ini memberikan koefisien negatif yang berarti semakin banyak penggunaan kedua variabel ini, maka akan menurunkan rata-rata jumlah patahan secara signifikan.
Inferensi statistik dalam GLM membutuhkan pemahaman terhadap ekspektasi dan varians dari estimator model, terutama untuk mengembangkan uji uji seperti likelihood dan interval kepercayaan.
Distribusi dalam GLM biasanya mengikuti keluarga eksponensial dengan bentuk
\[ f(y;\theta) = \exp\left(a(y)\cdot b(\theta) + c(\theta) + d(y)\right) \]
Untuk menentukan ekspektasi dan varians dalam GLM, harus memenuhi bentuk berikut
\[ \mu = b'(\theta) = \mu = \frac{ -c'(\theta) }{ b'(\theta) } \]
\[ \text{Var}(Y) = b''(\theta) = \phi V(\mu) = \frac{b''(\theta) \cdot c'(\theta) - c''(\theta) \cdot b'(\theta)}{[b'(\theta)]^3} \]
Metode penaksiran dapat dilakukan dengan beberapa metode.
Maximum Likelihood Estimation
Memaksimumkan fungsi likelihood. namun karena GLM tidak eksplisit maka digunakan metode numeric.
Newton-Raphson yang menggunakan turunan pertama fungsi likelihood yakni score vektor (gradien) dan turunan kedua, yakni Hessian matrix.
\[ \hat{\boldsymbol{\beta}} = \boldsymbol{\beta}^{(t)} - \left[ \mathbf{H}(\boldsymbol{\beta}^{(t)}) \right]^{-1} \mathbf{U}(\boldsymbol{\beta}^{(t)}) \]
Fisher Scoring, mengganti Hessian matrix pada Newton-Raphson dengan matriks informasi Fisher. Metode ini dapat digunakan untuk menentukan titik maksimum dari suatu fungsi sejalan dengan permasalahan dalam menentukan taksiran parameter MLE.
IRLS, memodifikasi Fisher sehingga estimasi mirip dengan Least Square.
Diagnostik ini dilakukan untuk mengevaluasi apakah model sudah tepat. Ini dapat dilakukan dengan beberapa analisis seperti uji formal atau dengan grafik nilai prediksi vs nilai aktual.
Pada uji formal, dapat dilakukan dengan beberapa metode seperti
Statistik Devians
Statistik devians ini mengukur apakah ada model yang lebih baik. Jika nilai devians besar, maka model keungkinan besar tidak cocok. Pada pengujiannya, model dibandingkan dengan saturated model dengan statistik berikut :
\[ D = 2 \sum_{i=1}^{n} \left[ y_i \ln\left(\frac{y_i}{\hat{\mu}_i}\right) + (1 - y_i)\ln\left(\frac{1 - y_i}{1 - \hat{\mu}_i}\right) \right] \]
Keterangan: - \(y_i\) = data aktual pada observasi ke-\(i\) - \(\hat{\mu}_i\) = nilai prediksi dari model pada observasi ke-\(i\) - \(n\) = jumlah observasi - Jika \(y_i = 0\) atau \(y_i = 1\), maka bagian log tersebut disesuaikan agar tidak terjadi log(0)
Uji Chi-Square Pearson.
Menguji apakah model lebih baik daripada tidak ada model sama sekali. Jika nilai signifikan maka model lebih baik daripada tanpa model.
\[ X^2 = \sum_{i=1}^{k} \frac{(O_i - E_i)^2}{E_i} \]
Keterangan: - \(O_i\) = frekuensi yang diamati pada kategori ke-\(i\) - \(E_i\) = frekuensi yang diharapkan pada kategori ke-\(i\) - \(k\) = jumlah kategori - Nilai \(X^2\) dibandingkan dengan nilai kritis pada distribusi chi-square dengan \(k - 1\) derajat kebebasan
Seperti di bahasain sebelumnya bahwa regresi logistik berfokus pada pembuatan model estimasi untuk data respon biner. Estimasi menggunakan MLE karena model tidak linear dalam parameternya.
Untuk estimasi menggunakan Metode Newton-Raphson yang mana metode ini mencari nilai koefisien untuk memaksimalkan fungsi log likelohood pada model regresi. Metode Log-Likelihood untuk n observasi :
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(p_i) + (1 - y_i)\log(1 - p_i) \right] \]
Model regresi logistik untuk probabilitas :
\[ p_i = \frac{1}{1 + e^{-x_i^\top \beta}} \]
Dalam proses pengerjaannya, ada proses iterasi yang menggunakan formula berikut.
\[ \beta^{(t+1)} = \beta^{(t)} + \left( X^\top W^{(t)} X \right)^{-1} X^\top (y-\pi ^{(t)}) \]
\[ W^{(t)} = \text{diag}(\pi_i(1 - \pi_i)) \]
Estimasi parameter pada model regresi logistik dilakukan dengan MLE. Metode Newton-Raphson adalah metode untuk memaksimalkan log-likelihood yang langkahlangkahnya merupakan penurunan. Penurunan pertama merupakan scoring dan penurunan kedia berupa matrix Hessian.
Sebagai contoh berikut adalah simulasi Estimasi MLE dengan Newton-Raphson
# Data simulasi
set.seed(28)
x <- rnorm(100)
beta_true <- c(-1, 2)
X <- cbind(1, x)
eta <- X %*% beta_true
p <- 1 / (1 + exp(-eta))
y <- rbinom(100, 1, p)
Newton-Raphson Iterasi manual
beta <- c(0, 0)
tol <- 1e-6
max_iter <- 100
for (i in 1:max_iter) {
eta <- X %*% beta
pi_hat <- 1 / (1 + exp(-eta))
W <- diag(as.numeric(pi_hat * (1- pi_hat)))
z <- eta + solve(W) %*% (y- pi_hat)
beta_new <- solve(t(X) %*% W %*% X) %*% t(X) %*% W %*% z
if (sum(abs(beta_new- beta)) < tol) break
beta <- beta_new
}
beta
## [,1]
## -0.8943083
## x 2.1833646
Dari syntax ini diperoleh nilai beta untuk intercept dan beta untuk variabel prediktor. Selanjutnya akan diperiksa apakah estimasi nilai beta ini memberikan pengaruh yang signifikan dalam analisis
Uji Inferensi ini berguna untuk mengevaluasi apakah taksirannya signifikan yang menandakan apakah variabel predikstor tersebut memang berpengaruh terhadap prediksi.
Uji Wald
Uji Wald adalah metode statistik yang digunakan untuk menguji signifikansi parameter dalam model regresi, baik itu regresi linier maupun model regresi lainnya, seperti regresi logistik atau regresi Poisson. Uji ini menguji apakah suatu parameter dalam model (misalnya koefisien regresi) berbeda secara signifikan dari suatu nilai tertentu (biasanya nol). Statistik uji Wald adalah
\[ W = \left( \frac{\hat{\beta}}{\text{SE}(\hat{\beta})} \right)^2 \]
Keterangan: - \(\hat{\beta}\) = estimasi koefisien regresi - \(\text{SE}(\hat{\beta})\) = standar error dari \(\hat{\beta}\) - Nilai \(W\) mengikuti distribusi chi-square dengan derajat kebebasan 1 (untuk satu koefisien).
Nilai \(W\) yang besar menunjukkan bahwa koefisien \(\hat{\beta}\) berbeda signifikan dari nol. Bandingkan nilai \(W\) dengan nilai kritis dari distribusi chi-square pada taraf signifikansi tertentu (misal: 0.05). Jika \(W\) lebih besar dari nilai kritis, maka koefisien tersebut signifikan secara statistik.
Contoh Perhitungannya
Sebuah studi dilakukan untuk meneliti apakah tingkat stres (diukur
dalam bentuk skor x, dari distribusi normal) berpengaruh
terhadap kemungkinan seseorang mengalami insomnia (y),
yaitu 1 jika insomnia terjadi dan 0 jika
tidak.
Simulasi dilakukan dengan 100 responden
set.seed(28)
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.4280 0.2327 -1.839 0.0659 .
## x 1.2162 0.2943 4.133 3.58e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 135.37 on 99 degrees of freedom
## Residual deviance: 110.72 on 98 degrees of freedom
## AIC: 114.72
##
## Number of Fisher Scoring iterations: 4
beta_hat <- coef(model)["x"]
se_beta <- summary(model)$coefficients["x", "Std. Error"]
Z <- beta_hat / se_beta
Z
## x
## 4.132766
Wald_stat <- Z^2
Wald_stat
## x
## 17.07975
p_value <- 1- pchisq(Wald_stat, df = 1)
p_value
## x
## 3.584238e-05
Kesimpulannya Dengan uji Wald diperoleh nilai p-value < alpha. Disimpulkan bahwa keofisiennya signifikan yang berarti prediktor(stress) memberikan pengaruh(insomnia).
Uji likelihood Ratio
Uji Likelihood Ratio (LR) adalah metode statistik yang digunakan untuk membandingkan dua model yang berbeda, yaitu model yang lebih kompleks (model alternatif) dan model yang lebih sederhana (model nol atau model pembanding). Uji ini menguji sejauh mana model yang lebih kompleks dapat menjelaskan data dengan lebih baik dibandingkan model yang lebih sederhana.
Contoh
# Model null
model_null <- glm(y ~ 1, data = data, family = binomial)
# Likelihood ratio test
anova(model_null, model, test = "Chisq")
## Analysis of Deviance Table
##
## Model 1: y ~ 1
## Model 2: y ~ x
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 99 135.37
## 2 98 110.72 1 24.65 6.873e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Dengan hasil ini dinyatakan pula bahwa model null juga memberikan pengaruh yang signifikan. Ini biasa juga digunakan untuk memlih model berdasarkan nilai deviance. Jika nilai deviancenya besar dan positif, maka model kompleks memang lebih baik, namun kalau nilainya kecil itu menandakan baik model kompleks ataupun sederhana tetap memberikan pengaruh yang tidak jauh. Oleh karena itu model sederhana juga baik.
Evaluasi model dengan
AIC(model)
## [1] 114.7213
BIC(model)
## [1] 119.9317
Kedua nilai ini digunakan untuk dibandingkan dengan nilai AIC dan BIC model lain. Semakin kecil nilainya maka semakin baik modelnya.
Misal kita melakukan pemodeltan terhadap data mtcars yang ada di R studio. Kita ingin memodelkan kemungkinan mobil memiliki efisiensi bahan bakar berdasarkan beberapa prediktor.
Pada tahap awal, dataset mtcars diambil dari pustaka
bawaan R dan dilakukan transformasi terhadap variabel mpg
(mile per gallon). Tujuannya adalah mengubah mpg menjadi
variabel kategorik biner bernama mpg_high, yaitu 1 jika
nilai mpg lebih tinggi dari median dan 0 jika tidak. Ini
memungkinkan kita memodelkan kemungkinan mobil termasuk kategori efisien
atau tidak. Kemudian, hanya beberapa variabel prediktor yang dipilih,
yaitu wt (berat mobil), hp
(horsepower/tenaga), dan am (tipe transmisi), untuk
digunakan dalam analisis regresi logistik.
library(dplyr)
data(mtcars)
mtcars <- mtcars %>%
mutate(mpg_high = ifelse(mpg > median(mpg), 1, 0)) %>%
select(mpg_high, wt, hp, am) # pilih beberapa prediktor
head(mtcars)
## mpg_high wt hp am
## Mazda RX4 1 2.620 110 1
## Mazda RX4 Wag 1 2.875 110 1
## Datsun 710 1 2.320 93 1
## Hornet 4 Drive 1 3.215 110 0
## Hornet Sportabout 0 3.440 175 0
## Valiant 0 3.460 105 0
Model regresi logistik dibentuk untuk memprediksi probabilitas bahwa
mpg_high bernilai 1 (efisien) berdasarkan wt,
hp, dan am. Fungsi glm()
digunakan dengan keluarga distribusi binomial, karena targetnya bersifat
biner. Hasil summary(model_logit) memberikan informasi
tentang nilai koefisien regresi, standar error, nilai z, dan p-value
untuk setiap prediktor. Ini membantu kita memahami pengaruh
masing-masing variabel terhadap kemungkinan efisiensi bahan bakar.
model_logit <- glm(mpg_high ~ wt + hp + am, data = mtcars, family = binomial)
summary(model_logit)
##
## Call:
## glm(formula = mpg_high ~ wt + hp + am, family = binomial, data = mtcars)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 6.244e+02 4.856e+05 0.001 0.999
## wt -1.847e+02 1.875e+05 -0.001 0.999
## hp -8.852e-02 2.045e+03 0.000 1.000
## am -6.038e+01 1.044e+05 -0.001 1.000
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 4.4236e+01 on 31 degrees of freedom
## Residual deviance: 3.4224e-09 on 28 degrees of freedom
## AIC: 8
##
## Number of Fisher Scoring iterations: 25
Untuk menguji apakah model dengan prediktor
(model_logit) secara signifikan lebih baik daripada model
tanpa prediktor (model_null), digunakan uji Likelihood
Ratio. Fungsi anova() dengan opsi
test = "Chisq" membandingkan kedua model. Jika hasil uji
menunjukkan nilai p yang signifikan, maka dapat disimpulkan bahwa
menambahkan prediktor secara keseluruhan memang memberikan informasi
tambahan yang signifikan dalam menjelaskan efisiensi bahan bakar.
model_null <- glm(mpg_high ~ 1, data = mtcars, family = binomial)
anova(model_null, model_logit, test = "Chisq")
## Analysis of Deviance Table
##
## Model 1: mpg_high ~ 1
## Model 2: mpg_high ~ wt + hp + am
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 31 44.236
## 2 28 0.000 3 44.236 1.344e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Uji Wald digunakan untuk menguji signifikansi masing-masing koefisien
regresi secara individu. Fungsi tidy() dari paket
broom menyajikan hasil koefisien, error standar, nilai z,
dan p-value untuk masing-masing prediktor dengan cara yang lebih ringkas
dan rapi. Hasil uji ini membantu mengetahui prediktor mana yang
berkontribusi signifikan terhadap model.
library(broom)
tidy(model_logit)
## # A tibble: 4 × 5
## term estimate std.error statistic p.value
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 624. 485580. 0.00129 0.999
## 2 wt -185. 187531. -0.000985 0.999
## 3 hp -0.0885 2045. -0.0000433 1.00
## 4 am -60.4 104421. -0.000578 1.00
Odds ratio dihitung dengan mengubah koefisien regresi (dalam log odds) ke skala odds yang lebih mudah dipahami dengan menggunakan eksponensial. Selain itu, juga dihitung confidence interval 95% untuk masing-masing odds ratio dengan pendekatan Wald. Interpretasi dari odds ratio memungkinkan kita mengetahui seberapa besar peluang efisiensi bahan bakar berubah untuk setiap satu unit perubahan prediktor, sambil mempertahankan prediktor lain konstan.
# Odds Ratio dengan CI Wald
coefs <- summary(model_logit)$coefficients
OR <- exp(coefs[, "Estimate"])
CI_lower <- exp(coefs[, "Estimate"]- 1.96 * coefs[, "Std. Error"])
CI_upper <- exp(coefs[, "Estimate"] + 1.96 * coefs[, "Std. Error"])
odds_ratio_table <- cbind(OR, CI_lower, CI_upper)
round(odds_ratio_table, 3)
## OR CI_lower CI_upper
## (Intercept) 1.552814e+271 0 Inf
## wt 0.000000e+00 0 Inf
## hp 9.150000e-01 0 Inf
## am 0.000000e+00 0 Inf
Uji Hosmer-Lemeshow digunakan untuk menilai kecocokan model terhadap data. Dalam uji ini, prediksi model dibagi ke dalam beberapa grup (misalnya 10 grup), lalu dibandingkan antara frekuensi aktual dan prediksi di masing-masing grup. Hasil uji memberikan p-value; jika tidak signifikan (p > 0.05), maka model dianggap cukup baik dalam menjelaskan data yang diamati dan tidak ada perbedaan signifikan antara prediksi dan observasi.
library(ResourceSelection)
hoslem.test(mtcars$mpg_high, fitted(model_logit), g=10)
##
## Hosmer and Lemeshow goodness of fit (GOF) test
##
## data: mtcars$mpg_high, fitted(model_logit)
## X-squared = 1.7112e-09, df = 2, p-value = 1
Kesimpulan Model logistik menunjukkan bahwa variabel predikstor tidak memberikan pengaruh signifikan. Hal ini dibuktikan dengan p value yang besar.
Pengujian likelihood ratio dalam regresi logistik digunakan untuk membandingkan dua model: model null dan model full. Model null adalah model yang hanya mencakup intercept (tanpa variabel prediktor), sedangkan model full mencakup satu atau lebih variabel prediktor yang diduga berpengaruh terhadap variabel respons. Tujuan pengujian ini adalah untuk mengetahui apakah penambahan variabel prediktor dalam model full memberikan peningkatan signifikan terhadap kecocokan model dibanding model null. Statistik uji dihitung dengan rumus
\[ G^2 = -2(\ell_0 - \ell_1) \]
Jika nilai ini lebih besar dari nilai kritis (atau p-value < 0.05), maka hipotesis nol ditolak.
Hipotesis nol (H₀) dalam pengujian ini menyatakan bahwa model null sudah cukup baik menjelaskan data, artinya variabel prediktor dalam model full tidak memberikan tambahan informasi yang signifikan. Sebaliknya, hipotesis alternatif (H₁) menyatakan bahwa model full memberikan peningkatan kecocokan yang signifikan. Jika H₀ ditolak, maka disimpulkan bahwa setidaknya satu prediktor dalam model full berpengaruh secara signifikan terhadap variabel respons, sehingga model full lebih layak digunakan daripada model null. Interpretasi dari hasil pengujian ini membantu menentukan apakah penambahan variabel dalam model logistik memang memberikan manfaat nyata dalam menjelaskan variabilitas data.
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(p_i) + (1 - y_i)\log(1 - p_i) \right] \]
Untuk nilai model tersebut dapat dihitung dengan fungsi log likelihood pada persamaan diatas.
Contoh perhitungannya :
Misal kita punya data
Model null dari model ini dapat dihitung dengan cara
\[ p = \frac{1 + 0 + 1 + 0}{4} = 0.5 \]
\[ \ell_0 = \sum_{i=1}^{4} \left[ y_i \log(0.5) + (1 - y_i) \log(0.5) \right] = 4 \cdot \log(0.5) = -2.7726 \]
Kemudian misalkan hasil estimasi: \(\hat{\beta}_0 = -1\), \(\hat{\beta}_1 = 1\)
Maka hitung \(\hat{p}_i\):
\[ \hat{p}_i = \frac{1}{1 + e^{-(\hat{\beta}_0 + \hat{\beta}_1 x_i)}} \]
Dengan rumus tersebut, maka dapat diperoleh nilai loglik componentnya, tinggal dijumlahkan nilai tersebut sesuai formula pada fungsi log likelihoodnya:
\[ \ell_1 = -0.3133 + (-0.6931) + (-0.1269) + (-1.3133) = -2.4466 \]
Setelah diperoleh nilai l0 dan l1, maka dapat dihitung nilai likelihoodnya
\[ G^2 = -2(\ell_0 - \ell_1) = -2(-2.7726 + 2.4466) = 0.652 \]Nantinya nilai dari likelihood ini dibandingkan dengan chi square tabel. Jika keputusannya adalah tolak H0 maka model full lebih berpengaruh secara signifikan daripada model null.
Model ini digunakan untuk data yang bersifat cacah dan menggunakan pendekatan MLE dengan metode IRLS. Model poisson berbentuk
\[
\mathbb{P}(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!}, \quad y = 0, 1,
2, \dots
\]
Misal sampel acak Y berdistribusi poisson dan rata rata bergantung pada
vairabel bebas X, maka model regresinya akan menjadi
\[ \eta_i = \log(\lambda_i) = x_i^\top\beta \]
Untuk estimasi parameternya menggunakan pendekatan Maximum Likelihood Estimation (MLE) dengan metode Iteratively Reweighted Least Square (IRLS). Dengan model regresi sebelumya dapat dicari fungsi Log Likelihood yang dimaksimalkan
\[
\ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\mu_i) - \mu_i - \log(y_i!)
\right]
\]
Serta formulasi iteratif IRLS :
\[ \beta^{(t+1)} = \left( X^\top W^{(t)} X \right)^{-1} X^\top W^{(t)} z^{(t)} \]
Dengan :
\[ W = \text{diag}(\lambda_i) \]
\[ z = \eta + \frac{y - \lambda}{\lambda} \]
dan
\[ \eta_i = \log(\lambda_i) = x_i^\top \beta \]
Simulasi data :
Sebuah perusahaan digital marketing ingin mengetahui apakah tingkat
aktivitas online pengguna (x) memengaruhi jumlah
klik iklan (y) yang mereka lakukan dalam satu
minggu. Aktivitas online diukur berdasarkan skor yang diperoleh dari
kombinasi frekuensi akses dan durasi online.
set.seed(28)
n <- 100
x <- rnorm(n)
X <- cbind(1, x) # Tambah intercept
beta_true <- c(0.5, 0.8)
eta <- X %*% beta_true
lambda <- exp(eta)
y <- rpois(n, lambda)
# Inisialisasi IRLS manual
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- 9
beta # hasil estimasi
## [,1]
## 0.5085490
## x 0.8049463
model_glm <- glm(y ~ x, family = poisson)
summary(model_glm)
##
## Call:
## glm(formula = y ~ x, family = poisson)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.50855 0.08495 5.986 2.14e-09 ***
## x 0.80495 0.06562 12.266 < 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: 275.55 on 99 degrees of freedom
## Residual deviance: 121.89 on 98 degrees of freedom
## AIC: 335.84
##
## Number of Fisher Scoring iterations: 5
Metode IRLS ini memberikan cara iteratif untuk menghitung estimasi MLE nya. Dapat dilihat pada hasil syntax diatas sebagai berikut
Pengujian Hipotesis
Menggunakan uji Wald, likelihood ratio serta evaluasinya dengan AIC dan BIC
# Koefisien dan standar error
coef_val <- coef(model)[2]
se_val <- summary(model)$coefficients[2, 2]
wald_z <- coef_val / se_val
wald_chisq <- wald_z^2
p_value <- 1- pchisq(wald_chisq, df = 1)
cat("Z:", wald_z, "\nChi-Square:", wald_chisq, "\np-value:", p_value)
## Z: 4.132766
## Chi-Square: 17.07975
## p-value: 3.584238e-05
model_null <- glm(y ~ 1, family = poisson, data = data)
anova(model_null, model, test = "Chisq")
## Analysis of Deviance Table
##
## Model 1: y ~ 1
## Model 2: y ~ x
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 99 73.111
## 2 98 110.721 1 -37.61
AIC(model)
## [1] 114.7213
BIC(model)
## [1] 119.9317
Dari perhitungan tersebut diperoleh beberapa hal berikut
Regresi logistik adalah suatu metode dalam analisis statistik yang digunakan untuk memodelkan hubungan antara satu variabel dependen (respon) yang bersifat kategorik biner, yaitu hanya memiliki dua kemungkinan hasil, seperti “ya” atau “tidak”, “sukses” atau “gagal”, “1” atau “0”, dengan satu atau lebih variabel independen (prediktor) yang dapat berskala nominal, ordinal, interval, maupun rasio. Metode ini merupakan bagian dari model regresi general linear model yang dimodifikasi untuk menangani keluaran yang tidak bersifat kontinu dan tidak mengikuti distribusi normal.
Berbeda dengan regresi linear yang menggunakan fungsi linear untuk memprediksi nilai respon, regresi logistik menggunakan fungsi logit (log-odds) untuk memodelkan probabilitas kejadian dari salah satu kategori. Dengan kata lain, regresi logistik tidak secara langsung memprediksi nilai kategorik, tetapi memprediksi probabilitas bahwa suatu peristiwa (kategori 1) akan terjadi berdasarkan nilai dari variabel-variabel prediktor yang diberikan. Probabilitas tersebut kemudian ditransformasikan melalui fungsi logistik (sigmoid) agar nilainya berada dalam rentang 0 hingga 1.
Dalam penerapannya, regresi logistik ini dapat digunakan ketika variabel predikstornya memiliki skala pengukuran yang berbeda. Skala pengukuran tersebut meliputi :
nominal, variabel yang tidak memiliki urutan antar kategorinya, hanya sebagai pembeda dari satu variabel dengan variabel lainnya.
ordinal, variabel yang memiliki urutan tapi jarak antar kategorinya tidak dapat dihitung
rasio, variabel kontinu yang memiliki nol absolut dan rasio bermakna.
Untuk lebih jelas dilakukan simulasi sebagai berikut. Misal kita punya data 500 observasi dan akan dilihat pengaruh setiap variabel terhadap peluang sukses. Pada simulasi ini akan dibandingkan antara perlakuan ordinal ketika ditreatment dengan nominal dan ditreatment dengan numerik.
# Simulasi variabel
n <- 500
gender <- sample(c("Male", "Female"), n, replace = TRUE)
education <- sample(c("HighSchool", "Bachelor", "Master", "PhD"), n,
replace = TRUE, prob = c(0.4, 0.3, 0.2, 0.1))
income <- rnorm(n, mean = 50, sd = 15)
logit_p <--2 + 0.5 * (gender == "Female") + 0.8 *
as.numeric(factor(education, ordered=TRUE)) + 0.03 * income
p <- 1 / (1 + exp(-logit_p))
set.seed(28)
success <- rbinom(n, 1, p)
sim_data <- tibble(success, gender, education, income)
head(sim_data)
## # A tibble: 6 × 4
## success gender education income
## <int> <chr> <chr> <dbl>
## 1 1 Male Master 72.4
## 2 1 Male Master 31.9
## 3 1 Female Bachelor 42.5
## 4 0 Male Bachelor 49.3
## 5 1 Male HighSchool 63.9
## 6 1 Female HighSchool 56.7
sim_data %>%
dplyr::group_by(success) %>%
dplyr::summarise(
Jumlah = dplyr::n(),
Rata2_Income = mean(income)
)
## # A tibble: 2 × 3
## success Jumlah Rata2_Income
## <int> <int> <dbl>
## 1 0 121 44.0
## 2 1 379 51.0
Distribusi jumlah sukses dan tidak sukses, serta rata rata pendapatan pada masing masing grup.
Treatment sebagai Nominal (Dummy)
Pada treatment ini variabel ordinal didefinisikan sebagai variabel nomimal sehingga variabel Highschool akan membandingkan dengan baselinenya.
sim_data_nominal <- sim_data %>%
mutate(
education = factor(education, levels = c("HighSchool", "Bachelor", "Master", "PhD"))
)
model_nominal <- glm(success ~ gender + education + income, data = sim_data_nominal, family = binomial)
summary(model_nominal)
##
## Call:
## glm(formula = success ~ gender + education + income, family = binomial,
## data = sim_data_nominal)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.500233 0.416402 -1.201 0.22963
## genderMale -0.549040 0.221714 -2.476 0.01327 *
## educationBachelor -0.408949 0.241178 -1.696 0.08996 .
## educationMaster 1.164894 0.391783 2.973 0.00295 **
## educationPhD 1.100415 0.513165 2.144 0.03200 *
## income 0.038608 0.008266 4.671 3e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 553.37 on 499 degrees of freedom
## Residual deviance: 499.95 on 494 degrees of freedom
## AIC: 511.95
##
## Number of Fisher Scoring iterations: 5
Interpretasi Koefisien
Intercept merupakan log-odds dasar untuk individu berjenis kelamin perempuan (Female, berpendidikan HighSchool dan income = 0. Individu ini menjadi baseline untuk interpretasi dari variabel lainnya sehingga setiap pengujian variabel lainnya akn dibandingkan dengan nilai yang ada di variabel baseline.
Pada Goodness of Fit dapat dilihat bahwa terdapat penurunan null deviance terhadap residual deviance. Hal ini menunjukkan bahwa model membawa informasi yang cukup baik. Kemudian ada nilai AIC yang mana semakin kecil nilai AIC, maka model semakin baik dan kompleks
Variabel income,gender dan education signifikan pada alpha 10% dalam meningkatkan peluang sukses .
Treatment sebagai Rasio ( Numeric )
sim_data_numeric <- sim_data %>%
mutate(
education_numeric = case_when(
education == "HighSchool" ~ 1,
education == "Bachelor" ~ 2,
education == "Master" ~ 3,
education == "PhD" ~ 4
)
)
model_numeric <- glm(success ~ gender + education_numeric + income, data = sim_data_numeric, family = binomial)
summary(model_numeric)
##
## Call:
## glm(formula = success ~ gender + education_numeric + income,
## family = binomial, data = sim_data_numeric)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.959587 0.448869 -2.138 0.03253 *
## genderMale -0.572377 0.218642 -2.618 0.00885 **
## education_numeric 0.364025 0.120454 3.022 0.00251 **
## income 0.036216 0.008013 4.520 6.19e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 553.37 on 499 degrees of freedom
## Residual deviance: 515.19 on 496 degrees of freedom
## AIC: 523.19
##
## Number of Fisher Scoring iterations: 4
Dari simulasi tersebut diperoleh bahwa semua variabel memberikan pengaruh yang signifikan terhadap peluang sukses
Perbandingan Model
list(
AIC_Nominal = AIC(model_nominal),
AIC_Numeric = AIC(model_numeric)
)
## $AIC_Nominal
## [1] 511.9455
##
## $AIC_Numeric
## [1] 523.19
nullmod <- glm(success ~ 1, data = sim_data, family = binomial)
r2_nominal <- 1- (logLik(model_nominal)/logLik(nullmod))
r2_numeric <- 1- (logLik(model_numeric)/logLik(nullmod))
list(
McFadden_R2_Nominal = r2_nominal,
McFadden_R2_Numeric = r2_numeric
)
## $McFadden_R2_Nominal
## 'log Lik.' 0.09655104 (df=6)
##
## $McFadden_R2_Numeric
## 'log Lik.' 0.06900278 (df=4)
Pada dua pengujian diatas dapat dilihat bahwa model dengan variabel ordinal dilakukan pendekatan dengan nominal lebih baik daripada pendekatan numerik. Hal ini dibuktikan dengan nilai AIC yang lebih rendah pada model nominal dan nilai McFadden Ryang memberikan nilai lebih besar dair pendekatan numerik.
Visualisasi Prediksi
sim_data_nominal <- sim_data_nominal %>% mutate(predicted = predict(model_nominal, type = "response"))
sim_data_numeric <- sim_data_numeric %>% mutate(predicted = predict(model_numeric, type = "response"))
# Plot untuk model nominal
sim_data_nominal %>%
ggplot(aes(x = income, y =predicted, color = education)) +
geom_point(alpha = 0.6) +
labs(title = "Prediksi Probabilitas (Ordinal sebagai Nominal)", x= "Income", y="Prediksi Probabilitas") +
theme_minimal()
# Plot untuk model numeric
sim_data_numeric %>%
ggplot(aes(x = income, y =predicted, color = as.factor(education_numeric))) +
geom_point(alpha = 0.6) +
labs(title = "Prediksi Probabilitas (Ordinal sebagai Numeric)", x= "Income", y="Prediksi Probabilitas") +
theme_minimal()
Ringkasan Koefisien Model
library(knitr)
library(kableExtra)
fmt <- ifelse(knitr::is_latex_output(), "latex", "html")
# Ringkasan model nominal
tidy(model_nominal) %>%
kable(format = fmt, booktabs = TRUE, caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Nominal") %>%
kable_styling(latex_options = c("hold_position", "striped"))
| term | estimate | std.error | statistic | p.value |
|---|---|---|---|---|
| (Intercept) | -0.5002334 | 0.4164019 | -1.201323 | 0.2296258 |
| genderMale | -0.5490396 | 0.2217143 | -2.476338 | 0.0132738 |
| educationBachelor | -0.4089492 | 0.2411782 | -1.695631 | 0.0899559 |
| educationMaster | 1.1648941 | 0.3917827 | 2.973317 | 0.0029460 |
| educationPhD | 1.1004148 | 0.5131649 | 2.144369 | 0.0320033 |
| income | 0.0386077 | 0.0082655 | 4.670929 | 0.0000030 |
# Ringkasan model numeric
tidy(model_numeric) %>%
kable(format = fmt, booktabs = TRUE, caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Numeric") %>%
kable_styling(latex_options = c("hold_position", "striped"))
| term | estimate | std.error | statistic | p.value |
|---|---|---|---|---|
| (Intercept) | -0.9595872 | 0.4488688 | -2.137790 | 0.0325338 |
| genderMale | -0.5723768 | 0.2186416 | -2.617877 | 0.0088479 |
| education_numeric | 0.3640247 | 0.1204543 | 3.022098 | 0.0025103 |
| income | 0.0362157 | 0.0080130 | 4.519639 | 0.0000062 |
Tabel tersebut memberikan estimasi koefisien, standar error, nilai z dan p value. Koefisien postif berarti meningkatkan log odds peluang sukses sedangkan keofisien negatif menurukan.
Dengan ini diperoleh kesimpulannya bahwa
Dalam regresi logistik, memilih model yang tepat merupakan langkah penting untuk memperoleh prediksi probabilitas yang akurat terhadap suatu kejadian biner. Terdapat dua pendekatan utama yang umum digunakan dalam membangun model, yaitu pendekatan Confirmatory dan Exploratory.
Confirmatory
Pendekatan ini digunakan ketika peneliti telah memiliki teori atau hipotesis yang spesifik mengenai hubungan antara variabel prediktor dan variabel respon.
Ciri-ciri utama pendekatan ini antara lain:
Model dikembangkan berdasarkan landasan teori atau hasil penelitian terdahulu.
Fokus utamanya adalah menguji apakah suatu pengaruh memang signifikan secara statistik, bukan semata-mata mencari model dengan kinerja terbaik.
Peneliti biasanya memulai dengan model lengkap, kemudian mengevaluasi apakah menambahkan atau menghapus suatu efek (seperti interaksi antar variabel) memberikan perbedaan signifikan dalam kualitas model.
Pengujian signifikansi dilakukan dengan membandingkan model yang mengandung efek tertentu dengan model yang tidak, misalnya menggunakan Likelihood Ratio Test.
Contoh penerapan:
Jika suatu teori menyatakan bahwa variabel x1 dan x2 memengaruhi
kemungkinan seseorang membeli produk, maka model logistik langsung
dibangun dengan kedua variabel tersebut. Selanjutnya, diuji apakah
keberadaan x2 dalam model benar-benar memberikan kontribusi yang
signifikan.
Explanatory
Pendekatan Eksploratori digunakan ketika peneliti belum memiliki teori yang jelas atau ingin menggali kemungkinan hubungan antar variabel yang belum diketahui.
Ciri-ciri pendekatan ini meliputi:
Model dikembangkan secara bertahap dengan tujuan menemukan kombinasi variabel prediktor yang optimal.
Pemilihan variabel didasarkan pada pertimbangan statistik seperti AIC, deviance, atau log-likelihood.
Proses seleksi variabel dapat dilakukan dengan beberapa metode, yakni Forward Selection dengan dimulai dari model kosong, lalu variabel ditambahkan satu per satu jika terbukti signifikan. Backward Elimination dengan dimulai dari model lengkap, kemudian variabel yang tidak signifikan dihapus. Stepwise Selection adalah gabungan keduanya, di mana variabel dapat masuk atau keluar model secara dinamis berdasarkan kriteria statistik.
Tujuan utama dari pendekatan ini adalah memperoleh model yang parsimonious, yaitu model yang cukup sederhana namun tetap memiliki kemampuan prediksi yang baik.
Pemilihan antara pendekatan Confirmatory dan Exploratory bergantung pada tujuan analisis: Jika tujuannya untuk menguji hipotesis tertentu, gunakan pendekatan Confirmatory.Jika tujuannya untuk menemukan model terbaik berdasarkan pola dalam data, gunakan pendekatan Exploratory.
Dalam praktiknya, kedua pendekatan ini sering saling melengkapi: teori digunakan sebagai fondasi awal, kemudian pendekatan eksploratori diterapkan untuk menyempurnakan struktur model.
Seseorang ingin meneliti apakah karakteristik individu seperti
tingkat stres (x1), status merokok (x2), dan
aktivitas fisik (x3) memengaruhi kemungkinan terkena
insomnia (y). Data disimulasikan menggunakan model regresi
logistik.
library(knitr)
library(dplyr)
library(ggplot2)
library(MASS)
library(caret)
library(pROC)
library(DescTools)
set.seed(28)
n <- 200
x1 <- rnorm(n)
x2 <- rbinom(n, 1, 0.5)
x3 <- rnorm(n)
lin_pred <--0.5 + 1.2 * x1- 0.8 * x2 + 0.5 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(n, 1, p)
df <- data.frame(y =as.factor(y), x1, x2, x3)
head(df)
## y x1 x2 x3
## 1 0 -1.90215722 0 -0.8897054
## 2 0 -0.06429479 0 -2.1269942
## 3 0 -1.33116707 0 -1.3989726
## 4 0 -1.81999167 1 -0.5385668
## 5 0 0.16266969 1 1.3377003
## 6 0 0.53139634 1 0.4151210
model_full <- glm(y ~ x1 + x2 + x3, data = df, family = binomial)
summary(model_full)
##
## Call:
## glm(formula = y ~ x1 + x2 + x3, family = binomial, data = df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.5749 0.2461 -2.336 0.01949 *
## x1 1.3974 0.2366 5.907 3.49e-09 ***
## x2 -0.7872 0.3727 -2.112 0.03467 *
## x3 0.4651 0.1787 2.603 0.00925 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 244.35 on 199 degrees of freedom
## Residual deviance: 185.01 on 196 degrees of freedom
## AIC: 193.01
##
## Number of Fisher Scoring iterations: 5
Dari hasil tersebut dapat dilihat bahwa semua variabel X memberikan pengaruh yang signifikan .
null_model <- glm(y ~ 1, data = df, family = binomial)
step_forward <- step(null_model, direction = "forward", scope = formula(model_full), trace = FALSE)
step_backward <- step(model_full, direction = "backward", trace = FALSE)
step_both <- step(null_model, direction = "both", scope = formula(model_full), trace = FALSE)
AIC(model_full, step_forward, step_backward, step_both)
## df AIC
## model_full 4 193.0117
## step_forward 4 193.0117
## step_backward 4 193.0117
## step_both 4 193.0117
Diperoleh nilai AIC yang sama untuk setiap metode seleksi. Untuk itu, analisis selanjutnya boleh memakaimetode manapun. Namun disini kita akan mencoba untuk menggunakan metode stepwise selection.
pred_prob <- predict(step_both, type = "response")
roc_obj <- roc(df$y, pred_prob)
plot(roc_obj, main = "Kurva ROC", col = "blue")
auc(roc_obj)
## Area under the curve: 0.8225
PseudoR2(step_both, which = c("CoxSnell", "Nagelkerke", "McFadden"))
## CoxSnell Nagelkerke McFadden
## 0.2567110 0.3639846 0.2428283
pred_class <- ifelse(pred_prob >= 0.5, 1, 0)
conf_matrix <- confusionMatrix(factor(pred_class), df$y, positive = "1")
conf_matrix
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 123 33
## 1 17 27
##
## Accuracy : 0.75
## 95% CI : (0.684, 0.8084)
## No Information Rate : 0.7
## P-Value [Acc > NIR] : 0.06955
##
## Kappa : 0.3557
##
## Mcnemar's Test P-Value : 0.03389
##
## Sensitivity : 0.4500
## Specificity : 0.8786
## Pos Pred Value : 0.6136
## Neg Pred Value : 0.7885
## Prevalence : 0.3000
## Detection Rate : 0.1350
## Detection Prevalence : 0.2200
## Balanced Accuracy : 0.6643
##
## 'Positive' Class : 1
##
conf_matrix$byClass[c("Sensitivity", "Specificity")]
## Sensitivity Specificity
## 0.4500000 0.8785714
Pada seluruh pengujian diatas, diperoleh bahwa metode seleksi terbaik adalah stepwise selection. Kemudian modenya dapat memprediksi dengan akurasi 75% (cukup baik) Nilai R square psuedo cukup baik juga. Setiap variabel x memberikan pengaruh yang signifikan Kemudian pada klasifikasinya cukup baik dengan 123 posisif ditebak benar, 27 negatif ditebak benar, 33 positif malah ditebak negatif dan 17 positif, malah dianggap negatif yang mana positif adalah mengalami insomnia sedangkan negatif adalah tidak mengalami.
Pada bagian ini akan dibahas mengenai cara membandingkan model regresi logistik menggunakan ukuran yakni Deviance AIC (Akaike Information Criterion), Likelihood-Ratio serta menjelaskan prinsip Parsimony dalam pemilihan model
Seorang peneliti ingin mengetahui apakah faktor usia
(x1), jenis kelamin (x2), dan tingkat
aktivitas harian (x3) berpengaruh terhadap kemungkinan
seseorang mengalami tekanan darah tinggi (y). Data
disimulasikan menggunakan model regresi logistik dengan 300
observasi.
library(MASS)
library(broom)
library(DescTools)
set.seed(28)
n <- 300
x1 <- rnorm(n)
x2 <- rbinom(n, 1, 0.5)
x3 <- rnorm(n)
lin_pred <--1 + 1.2 * x1- 0.6 * x2 + 0.8 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(n, 1, p)
data <- data.frame(y = as.factor(y), x1, x2, x3)
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)
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 299.0623 295.0623
## 2 Model 2 295.6804 289.6804
## 3 Model 3 268.8393 260.8393
Model 3 memiliki nilai AIC dan deviance paling rendah dibandingkan Model 1 dan Model 2, menandakan bahwa ia merupakan model dengan fit terbaik dan kompleksitas paling efisien. Penurunan AIC yang cukup besar dari Model 2 ke Model 3 menunjukkan peningkatan signifikan dalam kinerja model. Oleh karena itu, Model 3 lebih disarankan untuk digunakan dalam analisis lebih lanjut.
anova(model1, model2, test = "LRT")
## Analysis of Deviance Table
##
## Model 1: y ~ x1
## Model 2: y ~ x1 + x2
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 298 295.06
## 2 297 289.68 1 5.3819 0.02035 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(model2, model3, test = "LRT")
## Analysis of Deviance Table
##
## Model 1: y ~ x1 + x2
## Model 2: y ~ x1 + x2 + x3
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 297 289.68
## 2 296 260.84 1 28.841 7.857e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Dengan likelihood ratio test ini dapat dilihat pengaruh dari variabelnya. Ketika membandingkan model 1 dan 2 yang mana model 2 menambahkan variabel x2, model mampu menjelaskan data dengan lebih baik yang berarti bahwa model 2 memiliki pengaruh signifikan dalam pemodelan.
Selanjutnya ketika uji model 2 dan 3 dengan perbandingkan menambah variabel X3, juga memberikan pengaruh yang signifikan sehingga model 3 menjadi model yang paling cocok untu kmenjealskan data.
Model yang lebih kompleks cenderung menghasilkan nilai AIC dan deviance yang lebih rendah. Namun, model yang lebih sederhana sering kali lebih mudah untuk diinterpretasikan. Jika penurunan nilai AIC tidak terlalu signifikan, maka lebih disarankan memilih model yang lebih sederhana. Prinsip parsimony penting dalam pemodelan karena dapat mencegah terjadinya overfitting terhadap data.
Rumus AIC dinyatakan sebagai:
\[ \text{AIC} = -2(\log L - k) = -2 \log L + 2k \]
di mana log𝐿 adalah nilai log-likelihood dari model, dan 𝑘 adalah jumlah parameter dalam model. AIC digunakan untuk mengevaluasi keseimbangan antara kesesuaian model (melalui log-likelihood) dan kompleksitas model (melalui jumlah parameter). AIC yang lebih kecil menunjukkan model yang lebih baik secara keseluruhan, karena AIC memberikan penalti terhadap model yang terlalu kompleks meskipun memiliki likelihood tinggi.
Deviance didefinisikan dengan rumus:
\[ D = -2 \left[ \log L(\text{model}) - \log L(\text{model saturasi}) \right] \]
Deviance mengukur sejauh mana model saat ini menyimpang dari model saturasi (model yang cocok sempurna dengan data). Semakin kecil nilai deviance, semakin baik model dalam memprediksi data aktual.
Sementara itu, statistik Likelihood Ratio (G²) dihitung dengan rumus: \[ G^2 = -2 \left( \log L_0 - \log L_1 \right) \] di mana log𝐿₀ adalah log-likelihood model yang lebih sederhana, dan log𝐿₁ adalah log-likelihood model yang lebih kompleks. G² digunakan untuk menguji apakah penambahan variabel ke dalam model memberikan peningkatan signifikan terhadap kecocokan model. Jika nilai G² cukup besar dan p-value yang menyertainya kecil, maka model yang lebih kompleks dianggap lebih unggul secara statistik.
pred_prob <- predict(model3, type = "response")
pred_class <- factor(ifelse(pred_prob >= 0.5, 1, 0))
conf_matrix <- confusionMatrix(pred_class, data$y, positive = "1")
conf_matrix
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 202 41
## 1 16 41
##
## Accuracy : 0.81
## 95% CI : (0.761, 0.8528)
## No Information Rate : 0.7267
## P-Value [Acc > NIR] : 0.0005172
##
## Kappa : 0.4714
##
## Mcnemar's Test P-Value : 0.0014785
##
## Sensitivity : 0.5000
## Specificity : 0.9266
## Pos Pred Value : 0.7193
## Neg Pred Value : 0.8313
## Prevalence : 0.2733
## Detection Rate : 0.1367
## Detection Prevalence : 0.1900
## Balanced Accuracy : 0.7133
##
## 'Positive' Class : 1
##
Dari output tersebut dapat dilihat akurasinya sebesar 81% yang menyatakan ini sangat baik.
Sensitivitas adalah kemampuan model untuk mendekteksi kelas positif dengan tepat
\[ \text{Sensitivity} = \frac{TP}{TP + FN} \]
Spesifisitas adalah kemampuan odel untuk mendeteksi kelas negatif dengan tepat.
\[ \text{Specificity} = \frac{TN}{TN + FP} \]
Dengan : TP adalah jumlah kasus positif yang diprediksi benar oleh model FN adalah jumlah kasus positif yang salah diprediksi oleh model TN adalah jumlah kasus negatif yang diprediksi benar oleh model FP adalah jumlah kasus negatif yang salah diprediksi oleh model
conf_matrix$byClass[c("Sensitivity", "Specificity")]
## Sensitivity Specificity
## 0.5000000 0.9266055
Hasilnya menyatakan bahwa model masih cukup baik untuk mendeteksi kelas positif namun sangat baik mendekateksi kelas negatif.
Dengan ini dapat dilihat beberapa metode evaluasi model yakni
Deviance yang semakin kecil berarti semakin baik kecocokan modelnya,
AIC yang rendah memmberikan keseimbangan antara kecocokan dan kompleksitas
Likelihood reasio test untuk mengevaluasi apakah model kompleks signifikan,
tabel klasifikasi membantuk menilai kinerja prediksi aktual dan prediksi model, serta
prinsip parsimony mengutamakan model sederhana jika performanya mirip
Kurva ROC adalah alat visual yang digunakan untuk mengevaluasi performa klasifikasi data biner. Kurva ini cocok untuk data yang proporsi kelasnya seimbang. Kurva ini dianggap ideal jika memiliki bentuk
Kurva ROC ini memmberikan perbandingan peforma beberapa model klasifikasi serta memberikan pilihan optimal berdasarkan kebutuuhan aplikasi. Misal lebih baik menghindari false negatif atau positif?
Contoh
Seorang peneliti ingin mengkaji apakah variabel usia
(x1), jenis kelamin (x2), dan pola tidur
(x3) dapat memprediksi kemungkinan seseorang mengalami
gangguan kecemasan (y). Data disimulasikan menggunakan
model regresi logistik, dan performa model dievaluasi menggunakan kurva
ROC. Hasil area under the curve (AUC) menunjukkan seberapa baik model
membedakan antara individu yang mengalami kecemasan dan yang tidak.
library(pROC)
set.seed(28)
x1 <- rnorm(200)
x2 <- rbinom(200, 1, 0.5)
x3 <- rnorm(200)
lin_pred <--1 + 1.5 * x1- 0.7 * x2 + 0.6 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(200, 1, p)
data <- data.frame(y = as.factor(y), x1, x2, x3)
model <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
pred <- predict(model, type = "response")
roc_obj <- roc(data$y, pred)
plot(roc_obj)
auc(roc_obj)
## Area under the curve: 0.8718
Simulasi Pemilihan Threshold Optimal
Untuk memilih threshold terbaik, kita bisa mengevaluasi sensitivitas dan spesifisitas pada berbagai cut-off.
thresholds <- seq(0.1, 0.9, by = 0.05)
results <- data.frame(Threshold = thresholds)
results$Sensitivity <- sapply(thresholds, function(t) {
pred_class <- ifelse(pred >= t, 1, 0)
cm <- table(Pred = pred_class, Obs = data$y)
TP <- cm["1", "1"]
FN <- cm["0", "1"]
TP / (TP + FN)
})
results$Specificity <- sapply(thresholds, function(t) {
pred_class <- ifelse(pred >= t, 1, 0)
cm <- table(Pred = pred_class, Obs = data$y)
TN <- cm["0", "0"]
FP <- cm["1", "0"]
TN / (TN + FP)
})
print(results)
## Threshold Sensitivity Specificity
## 1 0.10 0.9615385 0.5405405
## 2 0.15 0.9423077 0.6486486
## 3 0.20 0.8653846 0.6959459
## 4 0.25 0.8076923 0.7500000
## 5 0.30 0.7307692 0.8108108
## 6 0.35 0.6538462 0.8445946
## 7 0.40 0.6346154 0.8851351
## 8 0.45 0.5576923 0.9189189
## 9 0.50 0.5576923 0.9256757
## 10 0.55 0.5000000 0.9324324
## 11 0.60 0.4615385 0.9459459
## 12 0.65 0.4038462 0.9527027
## 13 0.70 0.3076923 0.9797297
## 14 0.75 0.2884615 0.9864865
## 15 0.80 0.2115385 0.9864865
## 16 0.85 0.1730769 0.9932432
## 17 0.90 0.1153846 1.0000000
Cut-off optimal bisa dipilih berdasarkan maksimum dari Sensitivity + Specificity Atau mempertimbangkan trade-off sesuai tujuan aplikasi (misalnya: jika False Negative harus dihindari, maka prioritaskan sensitivitas tinggi).
Kurva Precision-Recall (PR) adalah alat evaluasi performa model klasifikasi, khususnya sangat berguna saat bekerja dengan data yang tidak seimbang (class imbalance). Ada dua komponen yakni
Precision (Presisi), yakni proporsi hasil prediksi positif memang benar bernilai positif.
\[ \text{Precision} = \frac{TP}{TP + FP} \]
Recall (Sensitivitas), yakni proporsi berhasil memprediksi positif ketika data tersebut memang positif
\[ \text{Recall} = \frac{TP}{TP + FN} \]
PR Curve ini menunjukkan bagaimana presisi berubah saat recall meningkat. Ideealinya kita ingin kedua nilai ini tinggi namun karena ada trade off maka model yang dianggap baik itu adalah model yang PR Curvenya melengkung ke pojok kanan atas. Luas kurva mendekati satu berarti model sangat baik.
contoh
Seorang peneliti ingin mengkaji apakah variabel usia
(x1), jenis kelamin (x2), dan pola tidur
(x3) dapat memprediksi kemungkinan seseorang mengalami
gangguan kecemasan (y). Data disimulasikan menggunakan
model regresi logistik, dan performa model dievaluasi menggunakan PR
Curve.
library(PRROC)
set.seed(28)
x1 <- rnorm(200)
x2 <- rbinom(200, 1, 0.5)
x3 <- rnorm(200)
lin_pred <--1 + 1.5 * x1- 0.7 * x2 + 0.6 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(200, 1, p)
data <- data.frame(y = y, x1, x2, x3)
model <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
prob <- predict(model, type = "response")
pr <- pr.curve(scores.class0 = prob[data$y == 1],
scores.class1 = prob[data$y == 0],
curve = TRUE)
plot(pr)
PR Curve cocok untuk analisis data yang kelas positifnya jauh lebih jarang daripada kelas negatif seperti deteksi penipuan dan diagnosis penyakit langka. Dibanding dengan ROC Curve, PR Curve ini fokus pada kelas positif saja.
Pseudo R-squared pada regresi logistik bertujuan untuk memberikan ukuran seberapa baik model menjelaskan variasi dalam data, sebagai analog dari R-squared pada regresi linear. Karena regresi logistik memodelkan probabilitas kejadian dari variabel biner, maka R-squared konvensional tidak dapat digunakan, sehingga dikembangkan beberapa versi Pseudo R-squared seperti McFadden, Cox & Snell, dan Nagelkerke. Nilai ini digunakan untuk menilai kualitas model, membandingkan beberapa model, serta mengevaluasi peningkatan performa saat menambahkan variabel baru. Meskipun tidak memiliki interpretasi sekuat R-squared linear, Pseudo R-squared tetap berguna dalam menilai kecocokan model logistik secara umum.
Contoh
Seorang peneliti ingin mengkaji apakah variabel usia
(x1), jenis kelamin (x2), dan pola tidur
(x3) dapat memprediksi kemungkinan seseorang mengalami
gangguan kecemasan (y). Data disimulasikan menggunakan
model regresi logistik, dan performa adalah menggunakan Psuedo R
Squared
Simulasi
set.seed(28)
n <- 300
x1 <- rnorm(n)
x2 <- rbinom(n, 1, 0.5)
x3 <- rnorm(n)
lin_pred <--1 + 1.2 * x1- 0.6 * x2 + 0.8 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(n, 1, p)
data <- data.frame(y = as.factor(y), x1, x2, x3)
model logistik dan null
model <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
model_null <- glm(y ~ 1, data = data, family = binomial)
Like lihood dan Rumus
Rumus Cox and Snell \[ R^2_{\text{Cox and Snell}} = 1 - \left( \frac{L_0}{L_M} \right)^{2/n} \]
Rumus McFadden \[ R^2_{\text{McFadden}} = 1 - \frac{\log L_M}{\log L_0} \]
dengan L0 adalah likelihood model null (tanpa prediktor ) dan LM adlaah likelihood penuh.
Perhitungan Manual R Square
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.2618645 0.258827
Perhitungan menggunakan package
Ketika menggunakan Package, diperoleh beberapa nilai pseudonya. Package yang dapat digunakan ada package rcompanion, DecsTools, dan pscl.
Menggunakan pscl
library(pscl)
pR2(model)
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML r2CU
## -130.4196517 -175.9638404 91.0883775 0.2588270 0.2618645 0.3791889
Menggunakan rcompanion
library(rcompanion)
nagelkerke(model)
## $Models
##
## Model: "glm, y ~ x1 + x2 + x3, binomial, data"
## Null: "glm, y ~ 1, binomial, data"
##
## $Pseudo.R.squared.for.model.vs.null
## Pseudo.R.squared
## McFadden 0.258827
## Cox and Snell (ML) 0.261865
## Nagelkerke (Cragg and Uhler) 0.379189
##
## $Likelihood.ratio.test
## Df.diff LogLik.diff Chisq p.value
## -3 -45.544 91.088 1.2787e-19
##
## $Number.of.observations
##
## Model: 300
## Null: 300
##
## $Messages
## [1] "Note: For models fit with REML, these statistics are based on refitting with ML"
##
## $Warnings
## [1] "None"
Menggunakan DecsTools
library(DescTools)
PseudoR2(model, which = "all")
## McFadden McFaddenAdj CoxSnell Nagelkerke AldrichNelson
## 0.2588270 0.2360950 0.2618645 0.3791889 0.2329100
## VeallZimmermann Efron McKelveyZavoina Tjur AIC
## 0.4314536 0.3017814 0.4586520 0.2954017 268.8393033
## BIC logLik logLik0 G2
## 283.6544332 -130.4196517 -175.9638404 91.0883775
Dengan ini diperoleh beberapa nilai R Square, namun biasanya digunakan McFadden R Square dan Cox & Snell R Square. Umumnya nilai R Square mendekati 1 berarti model memiliki kekuatan prediktif yang baik. Namun menurut McFadden (1977), nilai ini dianggap sebagai model dengan kecocokan baik ketika nilainya lebih dari 0,2. Sedangkan nilai Cox & Snell tidak memiliki kriteria khusus sehingga nilai ini lebih cocok untuk membandingkan satu model dengna model lainnya.
Distribusi multinomial adalah generalisasi dari distribusi binomial untuk lebih dari dua kategori. Distribusi ini menggambarkan probabilitas hasil dari sejumlah percobaan independen yang masing-masing menghasilkan satu dari k kemungkinan kategori, dengan probabilitas tetap untuk setiap kategori dan total percobaan sebanyak n. Jika X₁, X₂, …, Xₖ adalah jumlah kejadian dalam masing-masing kategori dan p₁, p₂, …, pₖ adalah probabilitas masing-masing kategori (dengan ∑pᵢ = 1), maka vektor (X₁, X₂, …, Xₖ) mengikuti distribusi multinomial dengan parameter n dan p.
\[ P(X_1 = x_1, \ldots, X_k = x_k) = \frac{n!}{x_1! \cdot x_2! \cdots x_k!} \cdot p_1^{x_1} \cdot p_2^{x_2} \cdots p_k^{x_k}, \quad\\ \text{dengan } \sum_{i=1}^{k} x_i = n, \sum_{i=1}^{k} p_i = 1 \]
Sebuah survei dilakukan terhadap 10 mahasiswa tentang minuman favorit mereka: kopi, teh, atau susu. Diketahui bahwa secara umum 50% mahasiswa menyukai kopi, 30% teh, dan 20% susu. Hitung probabilitas bahwa dari 10 mahasiswa, 5 memilih kopi, 3 teh, dan 2 susu.
Langkah pertama : Deklarasikan hal yang diketahui
\[ \text{Diketahui } n = 10, \; p_1 = 0.5, \; p_2 = 0.3, \; p_3 = 0.2 \\ \text{Ingin dicari: } P(X_1 = 5, X_2 = 3, X_3 = 2) \]
Langkah Kedua : Gunakan rumus dan Hitung
\[ P(5,3,2) = \frac{10!}{5! \cdot 3! \cdot 2!} \cdot (0.5)^5 \cdot (0.3)^3 \cdot (0.2)^2 \]
\[ = \frac{3628800}{120 \cdot 6 \cdot 2} \cdot 0.03125 \cdot 0.027 \cdot 0.04 \]
\[ = 2520 \cdot 0.00003375 = 0.08505 \]
Langkah Ketiga : Kesimpulan
Dengan perhitungan diperolh bahwa peluang 10 mahasiswa tersebut memperoleh 5 kopi, 3 teh dan 2 susu adalah 8,5%.
n <- 10
x <- c(5, 3, 2)
p <- c(0.5, 0.3, 0.2)
# Hitung komponen-koefisien
faktorial_total <- factorial(n)
faktorial_x <- prod(factorial(x))
koefisien <- faktorial_total / faktorial_x
# Hitung peluang
peluang <- koefisien * prod(p^x)
peluang
## [1] 0.08505
Dengan ini diperleh bahwa pelaung mahasiswa memiilih 5 kopi 3 teh dan 2 susu adalah 8,5%.
Multinomial logistic regression adalah metode statistik yang digunakan untuk memodelkan hubungan antara satu variabel kategorik nominal dengan lebih dari dua kategori dan satu atau lebih variabel independen. Berbeda dengan regresi logistik biner yang hanya membedakan dua kelas, multinomial logit digunakan ketika variabel dependen tidak memiliki urutan alami antar kategorinya, misalnya dalam kasus memilih jenis transportasi (mobil, motor, jalan kaki). Model ini sangat berguna ketika kita ingin memahami bagaimana variabel-variabel prediktor mempengaruhi probabilitas suatu observasi termasuk ke dalam salah satu dari beberapa kategori. \[ \textbf{Model Logit untuk Kategori ke-}j: \\ \log\left(\frac{P(Y = j)}{P(Y = k)}\right) = \beta_{j0} + \beta_{j1}X_1 + \beta_{j2}X_2 + \dots + \beta_{jp}X_p, \quad\\ \text{untuk } j = 1, 2, \dots, k-1 \]
\[ \textbf{Fungsi Probabilitas Kategori ke-}j: \\ P(Y = j) = \frac{e^{\eta_j}}{\sum_{l=1}^{k} e^{\eta_l}}, \quad\\ \\ \text{dengan } \eta_j = \beta_{j0} + \beta_{j1}X_1 + \dots + \beta_{jp}X_p \]
Baseline-category logit model adalah model regresi logistik untuk variabel respon kategorik dengan lebih dari dua kategori (nominal). Model ini menggunakan satu kategori sebagai acuan (baseline) dan membandingkan kategori lainnya terhadap baseline tersebut dalam bentuk logit
\[ \log\left(\frac{\pi(j)}{\pi(c)}\right), \quad \text{untuk } j = 1, \dots, c-1 \]
Dengan pi(j) adalah probabilitas respon berada dalam kategori j sedangkan pi(c) adalah probabilitas respon berada di kategori acuan. Maka, terdapat sebanyak (𝑐 − 1) fungsi logit.
Catatan: Kategori baseline bisa ditentukan secara eksplisit, tetapi default di R adalah kategori terakhir.
Model Regresi Jika terdapat satu prediktor 𝑥, maka bentuk umum model logit-nya adalah:
\[ \log\left(\frac{\pi(j)}{\pi(c)}\right) = \alpha_j + \beta_j x \]
Contoh Kasus: 3 Kategori Respon Misalkan respon 𝑌 memiliki tiga kategori: 𝑌 ∈ {1,2,3}, dan kita gunakan kategori ke-3 sebagai baseline. Maka
\[ \log\left(\frac{\pi_1}{\pi_3}\right) = \alpha_1 + \beta_1 x \] \[ \log\left(\frac{\pi_2}{\pi_3}\right) = \alpha_2 + \beta_2 x \]
Terdapat dua model logit, satu untuk perbandingan kategori 1 dengan 3, dan satu lagi untuk kategori 2 dengan 3. Relasi Antar Kategori Jika ingin menghitung logit antara kategori 1 dan 2
\[ \log\left(\frac{\pi_1/\pi_3}{\pi_2/\pi_3}\right) = \log\left(\frac{\pi_1}{\pi_3}\right) - \log\left(\frac{\pi_2}{\pi_3}\right) \] \[ (\alpha_1 + \beta_1 x) - (\alpha_2 + \beta_2 x) = (\alpha_1 - \alpha_2) + (\beta_1 - \beta_2)x \] Model baseline-category logit digunakan unruk respon kategori yang lebih dari dua. sehingga menghasilkan fungsi logit terhadap satu baseline.
Estimasi dilakukan menggunakan metode maximum likelihood dengan algoritma iteratif seperti Newton Raphson. Log-likelihood:
\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^{n} \sum_{j=1}^{K} y_{ij} \log(\pi_{ij}) \]
Sebuah perusahaan teknologi ingin memahami faktor-faktor yang mempengaruhi preferensi karyawan terhadap jenis perangkat kerja yang diberikan: Laptop, Desktop, atau Tablet. Perusahaan melakukan survei terhadap 150 karyawan dan mengumpulkan data berikut:
Device: Jenis perangkat yang dipilih (Laptop, Desktop, Tablet)
Age: Usia karyawan
Department: Divisi tempat bekerja (IT, Marketing, HR)
Experience: Tahun pengalaman kerja
Tujuannya adalah: Mengetahui bagaimana usia, divisi, dan pengalaman kerja memengaruhi pilihan perangkat kerja.
Simulasi
set.seed(28)
n <- 150
Department <- sample(c("IT", "Marketing", "HR"), n, replace = TRUE)
Age <- round(rnorm(n, mean = 35, sd = 7))
Experience <- round(pmax(rnorm(n, mean = 7, sd = 3), 0))
# Simulasikan Device berdasarkan probabilitas berbeda per Department
Device <- sapply(Department, function(dep) {
if (dep == "IT") {
sample(c("Laptop", "Desktop", "Tablet"), size = 1, prob = c(0.6, 0.2, 0.2))
} else if (dep == "Marketing") {
sample(c("Laptop", "Desktop", "Tablet"), size = 1, prob = c(0.3, 0.3, 0.4))
} else {
sample(c("Laptop", "Desktop", "Tablet"), size = 1, prob = c(0.4, 0.4, 0.2))
}
})
df <- data.frame(Device = factor(Device), Age, Department = factor(Department), Experience)
df$Device <- relevel(df$Device, ref = "Laptop") # baseline
head(df)
## Device Age Department Experience
## 1 Laptop 31 IT 8
## 2 Laptop 36 IT 8
## 3 Laptop 37 IT 8
## 4 Laptop 34 IT 10
## 5 Desktop 21 Marketing 11
## 6 Tablet 31 Marketing 9
Estimasi Model
library(nnet)
model_mnlogit <- multinom(Device ~ Age + Department + Experience, data = df)
## # weights: 18 (10 variable)
## initial value 164.791843
## iter 10 value 141.736231
## final value 141.098538
## converged
summary(model_mnlogit)
## Call:
## multinom(formula = Device ~ Age + Department + Experience, data = df)
##
## Coefficients:
## (Intercept) Age DepartmentIT DepartmentMarketing Experience
## Desktop 1.301547 -0.03860602 -2.2684307 -0.08200637 0.02670575
## Tablet -2.292099 0.01684437 -0.5505138 1.34794203 0.10732146
##
## Std. Errors:
## (Intercept) Age DepartmentIT DepartmentMarketing Experience
## Desktop 1.111799 0.02879988 0.6118749 0.4667083 0.06984485
## Tablet 1.305083 0.03064649 0.5930516 0.5421861 0.07647548
##
## Residual Deviance: 282.1971
## AIC: 302.1971
Nilai P-Value dan Interpretasi
z <- summary(model_mnlogit)$coefficients / summary(model_mnlogit)$standard.errors
pval <- 2 * (1- pnorm(abs(z)))
round(pval, 4)
## (Intercept) Age DepartmentIT DepartmentMarketing Experience
## Desktop 0.2417 0.1801 0.0002 0.8605 0.7022
## Tablet 0.0790 0.5826 0.3533 0.0129 0.1605
Interpretasi
Koefisien untuk kategori “Desktop” dan “Tablet” dibandingkan dengan baseline “Laptop”. Jika Nilai p-value kecil (< 0.05) menunjukkan variabel tersebut signifikan memengaruhi preferensi perangkat.
Prediksi dan Validasi
df$Predicted <- predict(model_mnlogit)
table(Predicted = df$Predicted, Actual = df$Device)
## Actual
## Predicted Laptop Desktop Tablet
## Laptop 40 9 13
## Desktop 18 27 12
## Tablet 10 10 11
Kesimpulan
Model regresi logistik multinomial tersebut menjelaskan hasil signifikansi dari setiap variabel serta tabel klasifikasi prediksinya. Dari tabel dapat dilihat bahwa 40 laptop berhasil dianggap sebagai laptop, namun 18 lainnya dianggap seagai desktop dan 10 lainnya dianggap tablet.
Pada kasus ini dicoba menggunakan set data yang ada di R, yakni data iris.
data(iris)
iris <- iris %>% mutate(Species = relevel(Species, ref = "setosa"))
model <- multinom(Species ~ Petal.Length + Petal.Width, data = iris)
## # weights: 12 (6 variable)
## initial value 164.791843
## iter 10 value 12.657828
## iter 20 value 10.374056
## iter 30 value 10.330881
## iter 40 value 10.306926
## iter 50 value 10.300057
## iter 60 value 10.296452
## iter 70 value 10.294046
## iter 80 value 10.292029
## iter 90 value 10.291154
## iter 100 value 10.289505
## final value 10.289505
## stopped after 100 iterations
summary(model)
## Call:
## multinom(formula = Species ~ Petal.Length + Petal.Width, data = iris)
##
## Coefficients:
## (Intercept) Petal.Length Petal.Width
## versicolor -22.79944 6.92122 7.878496
## virginica -67.82521 12.64721 18.261016
##
## Std. Errors:
## (Intercept) Petal.Length Petal.Width
## versicolor 44.3859 37.58715 81.00888
## virginica 46.3939 37.65702 81.09482
##
## Residual Deviance: 20.57901
## AIC: 32.57901
Interpretasi koefisien
z <- summary(model)$coefficients / summary(model)$standard.errors
p_values <- 2 * (1- pnorm(abs(z)))
round(p_values, 4)
## (Intercept) Petal.Length Petal.Width
## versicolor 0.6075 0.8539 0.9225
## virginica 0.1438 0.7370 0.8218
Disini dapat dilihat bahwa p valuenya lebih dari taraf signifikansi, berarti semua variabel tidak memberikan pengaruh yang signifikan sehingga ini menjelaskan bahwa variabel tersebut tidak menjelaskan pengaruhnya terhadap probabilitas kelas.
Prediksi dan Visualisasi
iris$predicted <- predict(model, newdata = iris)
table(Predicted = iris$predicted, Actual = iris$Species)
## Actual
## Predicted setosa versicolor virginica
## setosa 50 0 0
## versicolor 0 47 3
## virginica 0 3 47
ggplot(iris, aes(x =Petal.Length, y= Petal.Width, color = predicted)) +
geom_point(size = 2) +
labs(title = "Multinomial Logistic Regression Predictions", x="Petal Length", y = "Petal Width") +
theme_minimal()
Meskipun p value tadi memberikan keputusan yang tidak signifikan, namun pada pengklasifikasiannya diperoleh hasil yang baik. ini bisa saja terjadi mungkin karena adanya asumsi lain seperti multikolinearitas dan lainnya.
Oleh karena itu, jika tujuannya adalah mengklasifikasikan sebuah data, maka model ini sudah cocok. Tapi jika tujuannya adalah untuk membuat model, maka ini belum menjadi model yang baik.
Distribusi Multinomial adalah distribusi kategori yang variabel responnya lebih dari 2 pilihan.
Multinomial logistic regression efektif digunakan untuk klasifikasi kategori nominal. Model ini memberikan estimasi log-odds terhadap baseline dan prediksi kategori baru berdasarkan kombinasi prediktor.
Proses analisisnya dimulai dengan input data dan estimasi parameter. Kemudian menggunakan statistik z untuk melihat signifikansi parameter yang diestimasi tadi. Apakah variabel memberikan pengaruh terhadap model? Terakhir diperiksa hasil prediksi menggunakan confus matrix (tabel pengklasifikasian) untuk melihat hasil klasifikasi data.
Regresi logistik ordinal adalah metode statistik yang digunakan untuk memodelkan hubungan antara variabel respon kategorik yang memiliki urutan (ordinal) dengan satu atau lebih variabel prediktor. Tidak seperti regresi logistik multinomial yang tidak mempertimbangkan urutan kategori, regresi logistik ordinal memanfaatkan informasi tentang peringkat atau tingkat kategori respon, misalnya tingkat kepuasan dari “sangat tidak puas” hingga “sangat puas”.
Model yang paling umum digunakan adalah cumulative logit model dengan asumsi proportional odds, di mana logit dari probabilitas kumulatif untuk setiap ambang batas kategori dimodelkan sebagai fungsi linear dari prediktor. Asumsi ini menyatakan bahwa pengaruh setiap prediktor adalah konstan di seluruh ambang kategori, yang menjadikan model lebih sederhana dan efisien dibandingkan model tanpa asumsi tersebut. Regresi logistik ordinal cocok digunakan ketika tujuan analisis adalah untuk memahami atau memprediksi peluang relatif suatu observasi berada di atau di bawah suatu tingkat kategori.
Model yang digunakan adalah Cumulative Logit Model dengan asumsi proportional odds:
\[ \log\left( \frac{P(Y \leq j)}{P(Y > j)} \right) = \alpha_j + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_p X_p, \quad \\ \text{untuk } j = 1, 2, \dots, J - 1 \]
Interpretasi Keofesien
Koefisien 𝛽 menjelaskan efek 𝑥 terhadap kemungkinan berada pada kategori yang lebih rendah atau sama. Jika 𝛽>0: semakin besar 𝑥, semakin tinggi peluang berada di kategori rendah. Jika 𝛽<0: semakin besar 𝑥, semakin besar peluang berada di kategori tinggi. Odds ratio:
\[ \text{OR} = e^{\beta} \]
Misal kita memiliki data fiktif tingkat kepuasan pelanggan (1: Tidak Puas, 2: Cukup, 3: Puas) terhadap kecepatan layanan (1-10) :
set.seed(28)
n <- 200
speed <- round(runif(n, 1, 10))
satisfaction <- cut(5 + 0.5*speed + rnorm(n),
breaks = c(-Inf, 5.5, 7.5, Inf),
labels = c("Tidak Puas", "Cukup", "Puas"),
ordered_result = TRUE)
df <- data.frame(satisfaction, speed)
head(df)
## satisfaction speed
## 1 Cukup 1
## 2 Cukup 2
## 3 Puas 5
## 4 Puas 9
## 5 Tidak Puas 2
## 6 Puas 8
Estimasi Model
model_ord <- polr(satisfaction ~ speed, data = df, Hess = TRUE)
summary(model_ord)
## Call:
## polr(formula = satisfaction ~ speed, data = df, Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## speed 0.845 0.09771 8.648
##
## Intercepts:
## Value Std. Error t value
## Tidak Puas|Cukup 1.2120 0.3990 3.0379
## Cukup|Puas 4.3249 0.5332 8.1113
##
## Residual Deviance: 241.3823
## AIC: 247.3823
Nilai P value
(ctable <- coef(summary(model_ord)))
## Value Std. Error t value
## speed 0.8449704 0.0977117 8.647587
## Tidak Puas|Cukup 1.2120113 0.3989650 3.037889
## Cukup|Puas 4.3249415 0.5332006 8.111284
p <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
(ctable <- cbind(ctable, "p value" = round(p, 4)))
## Value Std. Error t value p value
## speed 0.8449704 0.0977117 8.647587 0.0000
## Tidak Puas|Cukup 1.2120113 0.3989650 3.037889 0.0024
## Cukup|Puas 4.3249415 0.5332006 8.111284 0.0000
Dari hasil p value ini dapat dilihat bahwa setiap variabel memberikan pengaruh yang signifikan terhadap model
Prediksi Peluang
newdata <- data.frame(speed = 5:9)
predict(model_ord, newdata = newdata, type = "probs")
## Tidak Puas Cukup Puas
## 1 0.046849132 0.47815236 0.4749985
## 2 0.020677576 0.30126016 0.6780623
## 3 0.008988488 0.16041632 0.8305952
## 4 0.003881085 0.07667453 0.9194444
## 5 0.001670897 0.03460008 0.9637290
Hasil ini memberikan kejelasan peluang ketika tingkat pelayanannya bernilai 5 sampai 9. Sebagai contoh, ketika kecepatan pelayanannya 5 maka peluang konsumen memberikan penilaian puas adalah 0,4749. Atau contoh selanjutnya ketika kecepatan pelayanannya 9, maka peluang konsumen memberikan penilaian tidak puas adalah 0,0016.
Goodness-of-Fit dan Proportional Odds
Model cumulative logit mengasumsikan efek prediktor sama untuk setiap cutoff. Jika efek predikstor ini tidak sama, maka dapat dipertimbangkan untuk menggunakan model lain seperti Generalized Ordinal Model, Adjacent-Category Logit dan Continuation Ratio (Sequential) logit karena model ini cdapat digunakan ketika asumsi proportional odds tidak terpenuhi.
Dalam Model Regresi Logistik Ordinal, metode yang sering diguakan adalah cumulative logit dengan asumsi proporsional odds. Asumsi ini juga disebut sebagai Asumsi Paralelisme. Asumsi ini menyatakan bahwa koeisien setiap katefori kumulatif variabel respon sama.
Bentuk umum model:
\[ \log\left( \frac{P(Y \leq j)}{P(Y > j)} \right) = \alpha_j + \beta x \]
Jika menggunakan modal cumulative logit ini, maka asumsi paralelisme harus terpenuhi. Jika tidak bisa menyebabkan salah interpretasi . Pengujiannya dapat menggunakan uji likelihood ratio test atau uji brant.
set.seed(28)
n <- 200
speed <- round(runif(n, 1, 10))
satisfaction <- cut(5 + 0.5*speed + rnorm(n),
breaks = c(-Inf, 5.5, 7.5, Inf),
labels = c("Tidak Puas", "Cukup", "Puas"),
ordered_result = TRUE)
df <- data.frame(satisfaction, speed)
head(df)
## satisfaction speed
## 1 Cukup 1
## 2 Cukup 2
## 3 Puas 5
## 4 Puas 9
## 5 Tidak Puas 2
## 6 Puas 8
library(MASS)
library(brant)
model <- polr(satisfaction ~ speed, data = df, Hess = TRUE)
brant(model)
## --------------------------------------------
## Test for X2 df probability
## --------------------------------------------
## Omnibus 0.59 1 0.44
## speed 0.59 1 0.44
## --------------------------------------------
##
## H0: Parallel Regression Assumption holds
Dari pengujian ini dapat dilihat nilai probability adalah 0,44. Pada pengujian brant, probability ini sama dengan nilai p value. Sehingga dapat dilihat bahwa kita gagal menolak H0 yang berarti data memenuhi asumsi paralelisme.
Regresi Logistik Ordinal adalah metode statistik yang digunakan pada variabel respon ordinal untuk memprediksi. Umumnya, model ini menggunakan model cumulative logit model yang harus memenuhi asumsi proportional odds. Jika model tidak memeuhi asumsi proportional odds, maka dapat dilakukan dengan model lain seperti Adjacent Category Logit, Contionuation Ratio (Sequential) Logit, Generalized Ordinal Model dan lainnya. Dalam pengujian, diperoleh prediksi peluang kejadian sebuah kegiatan. Kemudian juga dilakukan pengujian asumsi proportional odds (paralelisme) menggunakan library brant.
Model log-linier adalah bentuk khusus dari Generalized Linear Model (GLM) yang digunakan pada frekuensi sel dalam tabel kontingensi dan mengasumsikan distribusi Poisson. Tidak seperti regresi logistik, model log-linier tidak menetapkan variabel mana yang dependen dan mana yang independen, karena seluruh variabel diperlakukan secara simetris. Model ini lebih cocok ketika tujuan analisis adalah untuk memahami struktur asosiasi atau independensi antar variabel, bukan untuk prediksi.
Struktur model log-linier ditentukan berdasarkan efek utama dari masing-masing variabel serta interaksi di antara variabel-variabel tersebut. Misalnya, dalam tabel kontingensi tiga arah (misalnya: jenis kelamin, status merokok, dan penyakit paru), model log-linier dapat membedakan apakah interaksi dua variabel cukup menjelaskan data, ataukah diperlukan interaksi tiga arah untuk menangkap struktur asosiasinya. Penyesuaian model dapat dilakukan menggunakan metode likelihood ratio test untuk membandingkan model sederhana dengan model lebih kompleks.
Di sisi lain, regresi logistik adalah pendekatan paling umum ketika terdapat satu variabel kategorik yang secara eksplisit dianggap sebagai variabel dependen (misalnya, kejadian penyakit: ya/tidak), dan satu atau lebih variabel kategorik atau numerik sebagai prediktor. Model ini memodelkan logit dari probabilitas kejadian (yaitu log odds), dan sangat berguna dalam studi observasional dan eksperimental untuk menjelaskan atau memprediksi peluang suatu outcome. Regresi logistik juga memiliki ekstensi untuk outcome kategorik lebih dari dua kelas, seperti regresi logistik multinomial dan regresi logistik ordinal.
Tabel Kontingensi
Tabel Kontingensi menyajikan frekuensi dari kombinasi kategori variabel. Contoh
table_data <- matrix(c(30, 20, 50, 70), nrow=2,
dimnames = list(Obat = c("Timolol", "Placebo"),
Serangan = c("Ya", "Tidak")))
table_data
## Serangan
## Obat Ya Tidak
## Timolol 30 50
## Placebo 20 70
Model Log Linear
Model loglinear memodelkan logaritma dari ekspektasi frekuensi sel dalam tabel kontingensi.
\[ \log(\mu_{ij}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^{AB}_{ij} \]
Model ini cocok untuk menyelidiki asosiasi dan independensi antar variabel. Tidak ada membedakan secara jelas mana yang variabel respon mana penjelas serta umum digunakan pada tabel multi dimensi.
library(MASS)
loglm(~ Obat * Serangan, data = table_data)
## Call:
## loglm(formula = ~Obat * Serangan, data = table_data)
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0 0 1
## Pearson 0 0 1
Model Regresi Logistik
Ini digunakan untuk data respon biner dengan
\[ \log\left(\frac{p}{1 - p}\right) = \beta_0 + \beta_1 x \]
Model ini bertujuan untuk memprediksi peluang suatu outcome dan sering digunakan pada studi observasional atau eksperimental.
data_glm <- data.frame(
Serangan = c(1, 0, 1, 0),
Obat = factor(c("Timolol", "Timolol", "Placebo", "Placebo")),
Frek = c(30, 20, 50, 70)
)
model_logit <- glm(Serangan ~ Obat, weights = Frek, family = binomial, data = data_glm)
summary(model_logit)
##
## Call:
## glm(formula = Serangan ~ Obat, family = binomial, data = data_glm,
## weights = Frek)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.3365 0.1852 -1.817 0.0692 .
## ObatTimolol 0.7419 0.3430 2.163 0.0305 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 235.08 on 3 degrees of freedom
## Residual deviance: 230.31 on 2 degrees of freedom
## AIC: 234.31
##
## Number of Fisher Scoring iterations: 4
Perbandingan Ketika Pendekatan
| Aspek | Tabel Kontingensi | Model Loglinear | Regresi Logistik |
|---|---|---|---|
| Tujuan | Deskripsi frekuensi | Deteksi asosiasi | Prediksi probabilitas |
| Variabel dependen | Tidak ada | Tidak ada (simetris) | Ada (eksplisit) |
| Distribusi | Tidak diasumsikan | Poisson (frekuensi sel) | Binomial (probabilitas) |
| Bentuk Model | Tidak ada | GLM: log(mu) ~ efek | GLM: logit(p) ~ prediktor |
| Cocok untuk | Eksplorasi awal | Tabel > 2 variabel | Studi prediktif |
Tabel kontingensi menyajikan frekuensi dari kombinasi kategori antar dua atau lebih variabel. Misal:
# Contoh tabel 2x2
matrix(c(30, 20, 50, 70), nrow=2,
dimnames = list(Obat = c("Timolol", "Placebo"),
Serangan = c("Ya", "Tidak")))
## Serangan
## Obat Ya Tidak
## Timolol 30 50
## Placebo 20 70
Model log-linier untuk tabel I x J dapat dituliskan:
\[ \log(\mu_{ij}) = \lambda + \lambda^T_i + \lambda^R_j + \lambda^{TR}_{ij} \]
Model saturated atau model penuh menyertakan seluruh efek utama dan interaksi sehingga cocok sempurna terhadap data dan tidak mengasumsikan independensi antar variabel
Contoh formulasi untuk tabel 2x2:
# Data
library(MASS)
data <- matrix(c(35, 65, 45, 55), nrow=2, byrow=TRUE)
dimnames(data) <- list(Obat = c("Timolol", "Placebo"), Serangan = c("Ya", "Tidak"))
ftable(data)
## Serangan Ya Tidak
## Obat
## Timolol 35 65
## Placebo 45 55
Model saturated dapat dipasang dengan loglm dari
package {MASS}:
model_saturated <- loglm(~ Obat * Serangan, data = data)
summary(model_saturated)
## Formula:
## ~Obat * Serangan
## attr(,"variables")
## list(Obat, Serangan)
## attr(,"factors")
## Obat Serangan Obat:Serangan
## Obat 1 0 1
## Serangan 0 1 1
## attr(,"term.labels")
## [1] "Obat" "Serangan" "Obat:Serangan"
## attr(,"order")
## [1] 1 1 2
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0 0 1
## Pearson 0 0 1
Model independen mengasumsikan bahwa tidak ada interaksi antara variabel:
\[ \log(\mu_{ij}) = \mu + \lambda^T_i + \lambda^R_j \]
Model ini menguji hipotesis bahwa variabel X dan Y saling independen.
model_indep <- loglm(~ Obat + Serangan, data = data)
summary(model_indep)
## Formula:
## ~Obat + Serangan
## attr(,"variables")
## list(Obat, Serangan)
## attr(,"factors")
## Obat Serangan
## Obat 1 0
## Serangan 0 1
## attr(,"term.labels")
## [1] "Obat" "Serangan"
## attr(,"order")
## [1] 1 1
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 2.087576 1 0.1485015
## Pearson 2.083333 1 0.1489147
Odd Rasio untuk tabel 2x2 :
\[ \text{OR} = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}} \]
Interpretasi nilai OR:
OR = 1: Tidak ada asosiasi
OR > 1: Asosiasi positif
OR < 1: Asosiasi negatif
Dalam model saturated, estimasi dilakukan dengan pembatasan seperti sum-to-zero dan estimasi parameter juga dilakukan dengan iterative proportional fitting (IPF)
# Estimasi odds ratio dan log-odds
logOR <- log((data[1,1] * data[2,2]) / (data[1,2] * data[2,1]))
logOR
## [1] -0.4183685
Perbandingan antar model dilakukan dengan menggunakan statistik deviance (G²) atau likelihood ratio test.
anova(model_indep, model_saturated)
## LR tests for hierarchical log-linear models
##
## Model 1:
## ~Obat + Serangan
## Model 2:
## ~Obat * Serangan
##
## Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1 2.087576 1
## Model 2 0.000000 0 2.087576 1 0.1485
## Saturated 0.000000 0 0.000000 0 1.0000
Studi dari Agresti (2019) membahas hubungan antara kebahagiaan dan kepercayaan terhadap kehidupan akhirat.
data_survey <- matrix(c(32,190,
113,611,
51,326),
nrow = 3, byrow = TRUE,
dimnames = list(Kebahagiaan = c("Tidak", "Cukup", "Sangat"),
Surga = c("Tidak Percaya", "Percaya")))
ftable(data_survey)
## Surga Tidak Percaya Percaya
## Kebahagiaan
## Tidak 32 190
## Cukup 113 611
## Sangat 51 326
loglm(~ Kebahagiaan + Surga, data = data_survey)
## Call:
## loglm(formula = ~Kebahagiaan + Surga, data = data_survey)
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0.8911136 2 0.6404675
## Pearson 0.8836760 2 0.6428538
P value untuk kedua uji jauh lebih besar dari 0,05 yang berarti tidak ada bukti untuk menolak hipotesis null. Artinya tidak ada hubungan secara statstik antara kebahagiaan dengan kepercayaan terhadap surga.
Model log-linear adalah model yang digunakan untuk menganalisis hubungan antara dua atau lebih variabel kategorik yang disajikan dalam tabel kontingensi. Model ini mengasumsikan bahwa logaritma dari nilai ekspektasi frekuensi sel (μijμij) dapat dinyatakan sebagai penjumlahan efek variabel dan (bila perlu) interaksinya. Untuk tabel 2x2:
\[ \log(\mu_{ij}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^{AB}_{ij} \]
Model log-linear digunakan untuk memodelkan frekuensi (count) pada tabel kontingensi dan menguji asosiasi antar variabel kategorik, tanpa menganggap ada variabel respon dan prediktor.
Model regresi logistik digunakan untuk memodelkan probabilitas kejadian suatu outcome (biner) berdasarkan satu atau lebih prediktor (bisa kategorik maupun kontinu).
Sistem Persamaan Log Linear dan constraint sum to zero
\[ \begin{aligned} \log(\mu_{11}) &= \lambda + \lambda^A_1 + \lambda^B_1 + \lambda^{AB}_{11} \\ \log(\mu_{12}) &= \lambda + \lambda^A_1 + \lambda^B_2 + \lambda^{AB}_{12} \\ \log(\mu_{21}) &= \lambda + \lambda^A_2 + \lambda^B_1 + \lambda^{AB}_{21} \\ \log(\mu_{22}) &= \lambda + \lambda^A_2 + \lambda^B_2 + \lambda^{AB}_{22} \\ \\ \lambda^A_1 + \lambda^A_2 &= 0 \\ \lambda^B_1 + \lambda^B_2 &= 0 \\ \lambda^{AB}_{11} + \lambda^{AB}_{12} + \lambda^{AB}_{21} + \lambda^{AB}_{22} &= 0 \end{aligned} \]
Rumus estimasi parameter dengan sum to zero constraint
\[ \lambda^A_1 = \frac{1}{2} \left[ (\log \mu_{11} + \log \mu_{12}) - (\log \mu_{21} + \log \mu_{22}) \right] \]
\[ \lambda^B_1 = \frac{1}{2} \left[ (\log \mu_{11} + \log \mu_{21}) - (\log \mu_{12} + \log \mu_{22}) \right] \]
\[ \lambda^{AB}_{12} = \frac{1}{4} \left[ \log \mu_{12} - \log \mu_{11} - \log \mu_{22} + \log \mu_{21} \right] \]
Diberikan data:
| Merokok | Sakit | Sehat |
|---|---|---|
| Ya | 30 | 20 |
| Tidak | 10 | 40 |
model log linearnya adalah
\[ \log(\mu_{ij}) = \lambda + \lambda^T_i + \lambda^R_j + \lambda^{TR}_{ij} \]
dengan constraint sum to zero :
\[ \sum_i \lambda^A_i = 0 \]
\[ \sum_j \lambda^B_j = 0 \]
\[ \sum_{i,j} \lambda^{AB}_{ij} = 0 \]
Misal
A1 = Merokok (Ya), A2 = Tidak
B1 = Sakit, B2 = Sehat
Observasi:
n11=30, n12=20n
n21=10, n22=40n
\[ \begin{aligned} \log(\mu_{11}) &= \lambda + \lambda^A_1 + \lambda^B_1 + \lambda^{AB}_{11} \\ \log(\mu_{12}) &= \lambda + \lambda^A_1 + \lambda^B_2 + \lambda^{AB}_{12} \\ \log(\mu_{21}) &= \lambda + \lambda^A_2 + \lambda^B_1 + \lambda^{AB}_{21} \\ \log(\mu_{22}) &= \lambda + \lambda^A_2 + \lambda^B_2 + \lambda^{AB}_{22} \\ \\ \lambda^A_1 + \lambda^A_2 &= 0 \\ \lambda^B_1 + \lambda^B_2 &= 0 \\ \lambda^{AB}_{11} + \lambda^{AB}_{12} + \lambda^{AB}_{21} + \lambda^{AB}_{22} &= 0 \end{aligned} \]
Langkah-langkah:
\[ \begin{aligned} \lambda &= \frac{1}{4} \sum_{i=1}^2 \sum_{j=1}^2 \log(n_{ij}) \\ &= \frac{1}{4} \big[ \log(30) + \log(20) + \log(10) + \log(40) \big] \\ &= 3.0971 \end{aligned} \]
\[ \begin{aligned} \lambda^A_1 &= \frac{1}{2} \big[ (\log 30 + \log 20) - (\log 10 + \log 40) \big] \\ &= \frac{1}{2} \big[ (3.4012 + 2.9957) - (2.3026 + 3.6889) \big] \\ &= \frac{1}{2} (6.3969 - 5.9915) \\ &= \frac{1}{2} (0.4054) \\ &= 0.2027 \\ \lambda^A_2 &= -0.2027 \end{aligned} \]
\[ \begin{aligned} \lambda^B_1 &= \frac{1}{2} \big[ (\log 30 + \log 10) - (\log 20 + \log 40) \big] \\ &= \frac{1}{2} \big[ (3.4012 + 2.3026) - (2.9957 + 3.6889) \big] \\ &= \frac{1}{2} (5.7038 - 6.6846) \\ &= \frac{1}{2} (-0.9808) \\ &= -0.4904 \\ \lambda^B_2 &= +0.4904 \end{aligned} \]
\[ \begin{aligned} \lambda^{AB}_{11} &= \frac{1}{4} \big[ \log(30) - \log(20) - \log(10) + \log(40) \big] \\ &= \frac{1}{4} \big[ 3.4012 - 2.9957 - 2.3026 + 3.6889 \big] \\ &= \frac{1}{4} (1.7918) \\ &= 0.4479 \\ \lambda^{AB}_{12} &= -\lambda^{AB}_{11} = -0.4479 \\ \lambda^{AB}_{21} &= -0.4479 \\ \lambda^{AB}_{22} &= +0.4479 \end{aligned} \]
\[ \begin{aligned} \text{OR} &= \frac{n_{11} n_{22}}{n_{12} n_{21}} = \frac{30 \times 40}{20 \times 10} = \frac{1200}{200} = 6 \end{aligned} \]
Log odds ratio:
\[ \log(\text{OR}) = \log(6) = 1.7918 \] Standard error (SE):
\[ \begin{aligned} SE &= \sqrt{\frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}}} \\ &= \sqrt{\frac{1}{30} + \frac{1}{20} + \frac{1}{10} + \frac{1}{40}} \\ &= \sqrt{0.0333 + 0.05 + 0.1 + 0.025} \\ &= \sqrt{0.2083} \\ &= 0.4564 \end{aligned} \]
95% Confidence Interval for log(OR):
\[ \begin{aligned} \log(\text{OR}) \pm 1.96 \times SE &= 1.7918 \pm 1.96 \times 0.4564 \\ &= (1.7918 - 0.895), (1.7918 + 0.895) \\ &= (0.8968, 2.6868) \end{aligned} \]
Back-transform to get CI for OR:
\[ \begin{aligned} \text{Lower} &= \exp(0.8968) = 2.452 \\ \text{Upper} &= \exp(2.6868) = 14.68 \end{aligned} \]
Jadi, OR = 6 (95% CI: 2.45 – 14.68)
# Data 2x2
tabel <- matrix(c(30, 20, 10, 40), nrow = 2, byrow = TRUE)
colnames(tabel) <- c("Sakit", "Sehat")
rownames(tabel) <- c("Ya", "Tidak")
tabel
## Sakit Sehat
## Ya 30 20
## Tidak 10 40
data <- as.data.frame(as.table(tabel))
colnames(data) <- c("Merokok", "Status", "Freq")
data
## Merokok Status Freq
## 1 Ya Sakit 30
## 2 Tidak Sakit 10
## 3 Ya Sehat 20
## 4 Tidak Sehat 40
# Model tanpa interaksi
fit_no_inter <- glm(Freq ~ Merokok + Status, family = poisson, data = data)
summary(fit_no_inter)
##
## Call:
## glm(formula = Freq ~ Merokok + Status, family = poisson, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.996e+00 1.871e-01 16.013 <2e-16 ***
## MerokokTidak 3.892e-10 2.000e-01 0.000 1.000
## StatusSehat 4.055e-01 2.041e-01 1.986 0.047 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 21.288 on 3 degrees of freedom
## Residual deviance: 17.261 on 1 degrees of freedom
## AIC: 43.036
##
## Number of Fisher Scoring iterations: 4
# Model dengan interaksi
fit_inter <- glm(Freq ~ Merokok * Status, family = poisson, data = data)
summary(fit_inter)
##
## Call:
## glm(formula = Freq ~ Merokok * Status, family = poisson, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.4012 0.1826 18.629 < 2e-16 ***
## MerokokTidak -1.0986 0.3651 -3.009 0.00262 **
## StatusSehat -0.4055 0.2887 -1.405 0.16015
## MerokokTidak:StatusSehat 1.7918 0.4564 3.926 8.65e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2.1288e+01 on 3 degrees of freedom
## Residual deviance: 3.9968e-15 on 0 degrees of freedom
## AIC: 27.775
##
## Number of Fisher Scoring iterations: 3
Parameter utama (intercept) menunjukkan rata-rata log frekuensi sel.
Efek “Merokok” dan “Status” menunjukkan perbedaan log frekuensi antar kategori.
Interaksi signifikan menunjukkan adanya asosiasi antara Merokok dan Status.
Nilai log(6) =1.79 itu sama dengan efek interaksi ouput R
Suatu survei dilakukan untuk mengetahui hubungan antara Jenis Kelamin (Laki-laki/Perempuan) dan Kategori BMI (Kurus/Normal/Gemuk):
| Kurus | Normal | Gemuk | |
|---|---|---|---|
| Laki-laki | 12 | 20 | 8 |
| Perempuan | 18 | 24 | 10 |
Bentuk umum model log-linear untuk tabel 2x3 (dengan sum-to-zero constraint):
\[ \log(\mu_{ij}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^{AB}_{ij} \]
# Membuat data frame dari tabel
tabel2x3 <- matrix(c(12, 20, 8, 18, 24, 10), nrow = 2, byrow = TRUE)
colnames(tabel2x3) <- c("Kurus", "Normal", "Gemuk")
rownames(tabel2x3) <- c("Laki-laki", "Perempuan")
tabel2x3
## Kurus Normal Gemuk
## Laki-laki 12 20 8
## Perempuan 18 24 10
# Ubah menjadi data.frame untuk glm
data2x3 <- as.data.frame(as.table(tabel2x3))
colnames(data2x3) <- c("JenisKelamin", "BMI", "Freq")
data2x3
## JenisKelamin BMI Freq
## 1 Laki-laki Kurus 12
## 2 Perempuan Kurus 18
## 3 Laki-laki Normal 20
## 4 Perempuan Normal 24
## 5 Laki-laki Gemuk 8
## 6 Perempuan Gemuk 10
# Model log-linear tanpa interaksi (asumsi independen)
fit_no_inter <- glm(Freq ~ JenisKelamin + BMI, family = poisson, data = data2x3)
summary(fit_no_inter)
##
## Call:
## glm(formula = Freq ~ JenisKelamin + BMI, family = poisson, data = data2x3)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.5683 0.2179 11.789 <2e-16 ***
## JenisKelaminPerempuan 0.2624 0.2103 1.248 0.2122
## BMINormal 0.3830 0.2368 1.618 0.1058
## BMIGemuk -0.5108 0.2981 -1.713 0.0866 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 13.06443 on 5 degrees of freedom
## Residual deviance: 0.22527 on 2 degrees of freedom
## AIC: 35.26
##
## Number of Fisher Scoring iterations: 3
# Model log-linear dengan interaksi (untuk cek asosiasi)
fit_inter <- glm(Freq ~ JenisKelamin * BMI, family = poisson, data = data2x3)
summary(fit_inter)
##
## Call:
## glm(formula = Freq ~ JenisKelamin * BMI, family = poisson, data = data2x3)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.4849 0.2887 8.608 <2e-16 ***
## JenisKelaminPerempuan 0.4055 0.3727 1.088 0.277
## BMINormal 0.5108 0.3651 1.399 0.162
## BMIGemuk -0.4055 0.4564 -0.888 0.374
## JenisKelaminPerempuan:BMINormal -0.2231 0.4802 -0.465 0.642
## JenisKelaminPerempuan:BMIGemuk -0.1823 0.6032 -0.302 0.762
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1.3064e+01 on 5 degrees of freedom
## Residual deviance: -9.0719e-30 on 0 degrees of freedom
## AIC: 39.034
##
## Number of Fisher Scoring iterations: 3
Model tanpa interaksi: - Jika deviance tidak signifikan, maka Jenis Kelamin dan BMI independen.
Intercept: log frekuensi pada kategori referensi (Laki-laki, Kurus)
Koefisien JenisKelaminPerempuan: perbedaan log-frekuensi antara Perempuan vs Laki-laki (pada Kurus)
Koefisien BMI: perbedaan log-frekuensi kategori BMI (Normal/Gemuk) terhadap Kurus (pada Laki-laki)
Model dengan interaksi:
Contoh interpretasi hasil (misal):
Jika koefisien JenisKelaminPerempuan negatif: proporsi Perempuan pada kategori referensi lebih kecil dibanding Laki-laki.
Jika koefisien BMI_Normal positif: kemungkinan seseorang Normal lebih tinggi daripada Kurus (pada Laki-laki).
Jika model interaksi signifikan, pola distribusi BMI berbeda antara Laki-laki dan Perempuan.
Pada pembahasan sebelumnya, kita telah memahami bahwa salah satu tujuan utama dari penyusunan model log linear adalah untuk mengestimasi parameter-parameter yang menjelaskan hubungan di antara variabel-variabel kategorik.
Pada materi kali ini, kita akan membahas model log linear yang lebih kompleks, yaitu model log linear untuk tabel kontingensi tiga arah. Model ini melibatkan tiga variabel kategorik, sehingga kemungkinan interaksi yang dapat terjadi di dalam model pun menjadi lebih banyak. Dalam konteks ini, interaksi paling tinggi yang dapat dimodelkan adalah interaksi tiga arah, yaitu interaksi yang melibatkan ketiga variabel secara bersamaan.
Model log-linear yang melibatkan tiga variabel kategorik (misal: X, Y, dan Z) dapat dibangun dalam berbagai bentuk model, tergantung pada tingkat interaksi yang ingin dimasukkan. Berikut adalah beberapa alternatif model log-linear yang umum digunakan:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} + \lambda^{XYZ}_{ijk} \]
Model ini memuat semua kemungkinan interaksi, termasuk interaksi tiga arah (X, Y, dan Z).
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
Model ini hanya mengakomodasi interaksi dua arah antar variabel tanpa
memasukkan interaksi tiga arah.
Model Conditional
Conditional pada X:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} \]
Memuat interaksi X dengan Y dan X dengan Z.
*Conditional pada Y*:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{YZ}_{jk} \]
Memuat interaksi Y dengan X dan Y dengan Z.
*Conditional pada Z*:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
Memuat interaksi Z dengan X dan Z dengan Y.
Model Joint Independence
Independensi antara X & Y:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} \]
*Independensi antara X & Z*:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XZ}_{ik} \] Z
*Independensi antara Y & Z*:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{YZ}_{jk} \] Z
Model Tanpa Interaksi
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k \]
Model ini hanya memasukkan efek utama tanpa interaksi antar variabel.
Dalam analisis model log-linear tiga arah, pengujian interaksi dilakukan untuk mengetahui ada atau tidaknya interaksi antar variabel. Pengujian ini dilakukan secara bertahap, dimulai dari tingkat interaksi tertinggi ke yang lebih rendah. Untuk model log-linear dengan tiga peubah (X, Y, dan Z), tahapan pengujian meliputi:
Pengujian Interaksi Tiga Arah (XYZ):
Pengujian Interaksi Dua Arah (XY, XZ, YZ):
Bandingkan model homogenous dengan model conditional.
Bandingkan model conditional dengan model joint independence.
Bandingkan model joint independence dengan model tanpa interaksi.
Setiap tahapan pengujian dilakukan untuk menilai kecocokan model dan menentukan struktur interaksi mana yang paling sesuai dengan data yang diamati.
Tabel berikut menyajikan data dari survei General Social Survey (GSS) tahun 1994 mengenai jenis kelamin responden, tingkat fundamentalisme, dan sikap terhadap hukuman mati untuk kasus pembunuhan. Susun dan interpretasikan model log-linear paling sederhana (paling parsimonious) untuk data ini. Jelaskan proses yang Anda lakukan dalam menentukan model terbaik serta asosiasi apa saja yang teridentifikasi. Tunjukkan juga bagaimana nilai yang diprediksi dari model menggambarkan asosiasi tersebut.
| Fundamentalisme | Jenis Kelamin | Mendukung | Menolak | Total |
|---|---|---|---|---|
| Fundamentalist | Laki-laki | 128 | 32 | 160 |
| Fundamentalist | Perempuan | 123 | 73 | 196 |
| Fundamentalist | Total | 251 | 105 | 356 |
| Moderate | Laki-laki | 182 | 56 | 238 |
| Moderate | Perempuan | 168 | 105 | 273 |
| Moderate | Total | 350 | 161 | 511 |
| Liberal | Laki-laki | 119 | 49 | 168 |
| Liberal | Perempuan | 111 | 70 | 181 |
| Liberal | Total | 230 | 119 | 349 |
Keterangan:
Fundamentalisme: Fundamentalist, Moderate, Liberal
Jenis Kelamin: Laki-laki, Perempuan
Sikap: Mendukung (Favor), Menolak (Oppose) hukuman mati
library("epitools")
library("DescTools")
library("lawstat")
# Input data sesuai tabel praktikum
z.fund <- factor(rep(c("1fund", "2mod", "3lib"), each = 4))
x.sex <- factor(rep(c("1M", "2F"), each = 2, times = 3))
y.fav <- factor(rep(c("1fav", "2opp"), times = 6))
counts <- c(128, 32, 123, 73, 182, 56, 168, 105, 119, 49, 111, 70)
data <- data.frame(
Fundamentalisme = z.fund,
Jenis_Kelamin = x.sex,
Sikap = y.fav,
Frekuensi = counts
)
data
## Fundamentalisme Jenis_Kelamin Sikap Frekuensi
## 1 1fund 1M 1fav 128
## 2 1fund 1M 2opp 32
## 3 1fund 2F 1fav 123
## 4 1fund 2F 2opp 73
## 5 2mod 1M 1fav 182
## 6 2mod 1M 2opp 56
## 7 2mod 2F 1fav 168
## 8 2mod 2F 2opp 105
## 9 3lib 1M 1fav 119
## 10 3lib 1M 2opp 49
## 11 3lib 2F 1fav 111
## 12 3lib 2F 2opp 70
# Membuat tabel 3d
table3d <- xtabs(Frekuensi ~ Fundamentalisme + Jenis_Kelamin + Sikap, data = data)
ftable(table3d)
## Sikap 1fav 2opp
## Fundamentalisme Jenis_Kelamin
## 1fund 1M 128 32
## 2F 123 73
## 2mod 1M 182 56
## 2F 168 105
## 3lib 1M 119 49
## 2F 111 70
Dari sini kita dapat melihat tabel 3 arah dari studi kasus tersebut. Analisis Log-Linear dilakukan model log-linear dan membandingkan kecocokan model (parsimonious model)
##=============================##
# Penentuan kategori reference
##=============================##
x.sex <- relevel(x.sex, ref = "2F")
y.fav <- relevel(y.fav, ref = "2opp")
z.fund <- relevel(z.fund, ref = "3lib")
Bagian ini adalah penetuan baseline dari variabel yang ada yakni pada variabel gender, perempuan digunakan sebagai baseline. Pada variabel sikap hukuman mati, menolak dianggap baseline dan liberal menjadi baseline untuk variabel tingkat fundamentalisme.
Model Saturated Model log-linear saturated memasukkan semua interaksi hingga tiga arah:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} + \lambda^{XYZ}_{ijk} \]
Dengan ini dibentuk :
# Model saturated
model_saturated <- glm(counts ~ x.sex + y.fav + z.fund +
x.sex*y.fav + x.sex*z.fund + y.fav*z.fund +
x.sex*y.fav*z.fund,
family = poisson(link = "log"))
summary(model_saturated)
##
## Call:
## glm(formula = counts ~ x.sex + y.fav + z.fund + x.sex * y.fav +
## x.sex * z.fund + y.fav * z.fund + x.sex * y.fav * z.fund,
## family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.248495 0.119523 35.545 < 2e-16 ***
## x.sex1M -0.356675 0.186263 -1.915 0.05551 .
## y.fav1fav 0.461035 0.152626 3.021 0.00252 **
## z.fund1fund 0.041964 0.167285 0.251 0.80193
## z.fund2mod 0.405465 0.154303 2.628 0.00860 **
## x.sex1M:y.fav1fav 0.426268 0.228268 1.867 0.06185 .
## x.sex1M:z.fund1fund -0.468049 0.282210 -1.659 0.09721 .
## x.sex1M:z.fund2mod -0.271934 0.249148 -1.091 0.27507
## y.fav1fav:z.fund1fund 0.060690 0.212423 0.286 0.77511
## y.fav1fav:z.fund2mod 0.008969 0.196903 0.046 0.96367
## x.sex1M:y.fav1fav:z.fund1fund 0.438301 0.336151 1.304 0.19227
## x.sex1M:y.fav1fav:z.fund2mod 0.282383 0.301553 0.936 0.34905
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2.4536e+02 on 11 degrees of freedom
## Residual deviance: 5.9952e-15 on 0 degrees of freedom
## AIC: 100.14
##
## Number of Fisher Scoring iterations: 3
exp(model_saturated$coefficients)
## (Intercept) x.sex1M
## 70.0000000 0.7000000
## y.fav1fav z.fund1fund
## 1.5857143 1.0428571
## z.fund2mod x.sex1M:y.fav1fav
## 1.5000000 1.5315315
## x.sex1M:z.fund1fund x.sex1M:z.fund2mod
## 0.6262231 0.7619048
## y.fav1fav:z.fund1fund y.fav1fav:z.fund2mod
## 1.0625694 1.0090090
## x.sex1M:y.fav1fav:z.fund1fund x.sex1M:y.fav1fav:z.fund2mod
## 1.5500717 1.3262868
Model yang digunakan adalah model log-linear saturated dengan semua efek utama, interaksi dua arah, dan interaksi tiga arah. Model ini memodelkan hubungan antara jenis kelamin (x.sex), sikap terhadap hukuman mati (y.fav), dan tingkat fundamentalisme (z.fund) terhadap frekuensi responden.
Pada output diatas dapat dlihat hasil estimasi perhitungannya. diperoleh bahwa estimasi untuk intercept sebesar 4,24 yang berarti rata rata log jumlah kasus untuk kategori referensi adalah 4,24. Kemudian laki laki memiliki expected count sebesar 0,7 kali perempuan dalam kategoru referensi lainnya. dan dapat dilihat hasil variabel lain.
Dapat dilihat pada output bahwa intercept, pernyataan mendukung, moderate memberikan pengaruh yang signifikan pada taraf 5%. Sedangkan yang lainnya tidak memberikan pengaruh signifikan pada taraf tersebut.
Residual deviance ≈ 0 menandakan model saturated benar-benar fit terhadap data (seluruh variasi data dijelaskan oleh model). AIC = 100.14 dapat digunakan untuk perbandingan dengan model yang lebih sederhana.
Model saturated ini sangat fit dengan data, namun tidak semua parameter/interaksi signifikan.
Efek utama yang paling signifikan adalah:
Sikap mendukung hukuman mati (expected count 1.6x lebih tinggi dari yang menolak)
Kelompok Moderate (expected count 1.5x lebih tinggi dari Liberal)
Tidak ditemukan bukti kuat interaksi dua atau tiga arah yang signifikan.
Model yang lebih sederhana (tanpa interaksi tiga arah) perlu dipertimbangkan untuk model final yang lebih parsimonious.
Catatan interpretasi:
Nilai exp(coef) menyatakan rasio ekspektasi
(expected count ratio) dibandingkan baseline.
Efek positif → menaikkan expected count; Efek negatif → menurunkan expected count.
Koefisien signifikan pada p-value < 0.05.
Model log-linear homogenous memasukkan semua efek utama dan semua interaksi dua arah, tanpa interaksi tiga arah. Secara matematis, model ini dapat dituliskan sebagai berikut:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
# Homogenous Model
model_homogenous <- glm(counts ~ x.sex + y.fav + z.fund +
x.sex*y.fav + x.sex*z.fund + y.fav*z.fund,
family = poisson(link = "log"))
summary(model_homogenous)
##
## Call:
## glm(formula = counts ~ x.sex + y.fav + z.fund + x.sex * y.fav +
## x.sex * z.fund + y.fav * z.fund, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.31096 0.10522 40.972 < 2e-16 ***
## x.sex1M -0.51575 0.13814 -3.733 0.000189 ***
## y.fav1fav 0.35707 0.12658 2.821 0.004788 **
## z.fund1fund -0.06762 0.14452 -0.468 0.639854
## z.fund2mod 0.33196 0.13142 2.526 0.011540 *
## x.sex1M:y.fav1fav 0.66406 0.12728 5.217 1.81e-07 ***
## x.sex1M:z.fund1fund -0.16201 0.15300 -1.059 0.289649
## x.sex1M:z.fund2mod -0.08146 0.14079 -0.579 0.562887
## y.fav1fav:z.fund1fund 0.23873 0.16402 1.455 0.145551
## y.fav1fav:z.fund2mod 0.13081 0.14951 0.875 0.381614
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.361 on 11 degrees of freedom
## Residual deviance: 1.798 on 2 degrees of freedom
## AIC: 97.934
##
## Number of Fisher Scoring iterations: 3
Pengujian ini menggunakan residual deviance dari kedua model (saturated dan homogenous).Jika selisih deviance model homogenous dengan model saturated lebih besar daripada daerah kritis penolaknnya, maka dianggap tidak ada pengaruh dari interaksi 3 arah.
Hipotesis
H0: Tidak ada interaksi tiga arah (model homogenous sudah cukup)
H1: Ada interaksi tiga arah (model saturated diperlukan)
Hitung Selisih Deviance
# Deviance antar model
Deviance.model <- model_homogenous$deviance - model_saturated$deviance
Deviance.model
## [1] 1.797977
# Hitung derajat bebas
# Derajat bebas = db model homogenous - db model saturated
derajat.bebas <- (model_homogenous$df.residual - model_saturated$df.residual)
derajat.bebas
## [1] 2
# Chisquare
chi.tabel <- qchisq(1 - 0.05, df = derajat.bebas)
chi.tabel
## [1] 5.991465
# Keputusan
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima H0", "Tolak H0")
Keputusan
## [1] "Terima H0"
Interpretasi Pada taraf nyata 5%, belum cukup bukti untuk menolak H0 atau dapat dikatakan bahwa tidak ada interaksi tiga arah antara jenis kelamin, fundamentalisme, dan pendapat mengenai hukuman mati.
Catatan:
Model pengurang adalah model yang lebih lengkap (lebih banyak parameter, df lebih kecil), yaitu model saturated.
Derajat bebas dihitung dari selisih derajat bebas model homogenous dan saturated.
Keputusan berdasarkan perbandingan deviance model dengan chi-square tabel.
Dari perhitungan tersebut, maka dapat diuji hipotesisnya yakni :
Hipotesis
H0 : (Tidak ada interaksi tiga arah; model yang terbentuk adalah model homogenous)
H1 : (Ada interaksi tiga arah; model yang terbentuk adalah model saturated)
Tingkat Signifikansi
α = 5%
Statistik Uji
Δ Deviance = Deviance model homogenous − Deviance model saturated
= 1.798 − 0.00
= 1.798
db = db model homogenous − db model saturated
= 2−0
= 2
Daerah Penolakan
Tolak H0 jika Δ Deviance > χ2(0.05,2)
= χ2(0.05,2)
= 5.991
Keputusan
Karena 1.798 < 5.991, maka terima H0
Interpretasi
Pada taraf nyata 5%, belum cukup bukti untuk menolak H0 atau dapat dikatakan bahwa tidak ada interaksi tiga arah antara jenis kelamin, fundamentalisme, dan pendapat mengenai hukuman mati.
Ingat, dalam membuat selisih deviance, model yang menjadi pengurang adalah model yang lebih lengkap (parameter yang lebih banyak atau derajat bebasnya lebih kecil).
Makin banyak parameter, makin kecil derajat bebasnya, karena:
Cek di output R ada berapa banyak coefficients-nya (termasuk intercept) untuk menghitung derajat bebas yang benar.
Model log-linear conditional pada X memasukkan efek utama dan interaksi dua arah antara X dengan Y dan X dengan Z, tanpa interaksi antara Y dengan Z maupun interaksi tiga arah.
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} \]
# Conditional Association on X
model_conditional_X <- glm(counts ~ x.sex + y.fav + z.fund +
x.sex*y.fav + x.sex*z.fund,
family = poisson(link = "log"))
summary(model_conditional_X)
##
## Call:
## glm(formula = counts ~ x.sex + y.fav + z.fund + x.sex * y.fav +
## x.sex * z.fund, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.23495 0.08955 47.293 < 2e-16 ***
## x.sex1M -0.52960 0.13966 -3.792 0.000149 ***
## y.fav1fav 0.48302 0.08075 5.982 2.20e-09 ***
## z.fund1fund 0.07962 0.10309 0.772 0.439916
## z.fund2mod 0.41097 0.09585 4.288 1.81e-05 ***
## x.sex1M:y.fav1fav 0.65845 0.12708 5.181 2.20e-07 ***
## x.sex1M:z.fund1fund -0.12841 0.15109 -0.850 0.395405
## x.sex1M:z.fund2mod -0.06267 0.13908 -0.451 0.652274
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.3612 on 11 degrees of freedom
## Residual deviance: 3.9303 on 4 degrees of freedom
## AIC: 96.067
##
## Number of Fisher Scoring iterations: 4
Pengujian Ada Tidaknya Interaksi Antara Y dan Z (Homogenous Model vs Conditional Association on X)
Hipotesis
H0 : (Tidak ada interaksi antara pendapat hukuman mati (Y) dan fundamentalisme (Z))
H1 : (Ada interaksi antara pendapat hukuman mati (Y) dan fundamentalisme (Z))
Tingkat Signifikansi
α = 5%
Statistik Uji
Δ Deviance = Deviance model conditional on X − Deviance model homogenous
= 3.903 − 1.798
= 2.132
db = db model conditional on X − db model homogenous
= 4 − 2
= 2
Daerah Penolakan
Tolak H0 jika Δ Deviance > χ2(0.05,2)
= 5.991
Keputusan
Karena 2.132 < 5.991, maka terima H0
Kesimpulan
Dengan taraf nyata 5%, belum cukup bukti untuk menolak H0 atau dapat dikatakan bahwa tidak ada interaksi antara pendapat tentang hukuman mati dan fundamentalisme. Dengan kata lain, model yang terbentuk adalah model tanpa parameter λ
# Pengujian hipotesis
# Deviance of Model
Deviance.model <- model_conditional_X$deviance - model_homogenous$deviance # model_conditional_X: conditional on X, model_homogenous: homogenous
Deviance.model
## [1] 2.132302
Langkah-langkah uji hipotesis menggunakan residual deviance:
# Selisih deviance antar model
Deviance.model <- model_conditional_X$deviance - model_homogenous$deviance
Deviance.model
## [1] 2.132302
# Chi Square tabel dengan alpha = 0.05
derajat.bebas <- (4 - 2)
derajat.bebas
## [1] 2
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 5.991465
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Terima"
Interpretasi Karena nilai Deviance.model = 2.13 lebih kecil dari nilai kritis chi-square tabel = 5.99 (dengan df = 2, alpha = 0.05), maka keputusan uji adalah “Terima”.
Pada taraf nyata 5%, belum cukup bukti untuk menolak H0, atau dengan kata lain tidak ada interaksi antara pendapat mengenai hukuman mati (Y) dan fundamentalisme (Z). Model yang terbentuk cukup hanya sampai dua interaksi dengan X (conditional on X), sehingga interaksi Y*Z tidak signifikan secara statistik.
Model log-linear conditional pada Y memasukkan efek utama dan interaksi dua arah antara X dengan Y dan Y dengan Z, tanpa interaksi antara X dengan Z maupun interaksi tiga arah.
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{YZ}_{jk} \]
# Conditional Association on Y
model_conditional_Y <- glm(counts ~ x.sex + y.fav + z.fund +
x.sex*y.fav + y.fav*z.fund,
family = poisson(link = "log"))
summary(model_conditional_Y)
##
## Call:
## glm(formula = counts ~ x.sex + y.fav + z.fund + x.sex * y.fav +
## y.fav * z.fund, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.33931 0.09919 43.748 < 2e-16 ***
## x.sex1M -0.59345 0.10645 -5.575 2.48e-08 ***
## y.fav1fav 0.37259 0.12438 2.996 0.00274 **
## z.fund1fund -0.12516 0.13389 -0.935 0.34989
## z.fund2mod 0.30228 0.12089 2.500 0.01240 *
## x.sex1M:y.fav1fav 0.65845 0.12708 5.181 2.20e-07 ***
## y.fav1fav:z.fund1fund 0.21254 0.16205 1.312 0.18966
## y.fav1fav:z.fund2mod 0.11757 0.14771 0.796 0.42606
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.3612 on 11 degrees of freedom
## Residual deviance: 2.9203 on 4 degrees of freedom
## AIC: 95.057
##
## Number of Fisher Scoring iterations: 4
Pengujian Ada Tidaknya Interaksi antara X dan Z (Homogenous model vs Conditional Association on Y)
Hipotesis
H0 : (Tidak ada interaksi antara jenis kelamin (X) dan fundamentalisme (Z))
H1 : (Ada interaksi antara jenis kelamin (X) dan fundamentalisme (Z))
Tingkat Signifikansi
Statistik Uji
Δ Deviance = Deviance model conditional on Y − Deviance model homogenous
= 2.9203 − 1.798
= 1.1223
db = db model conditional on Y − db model homogenous
= 4 − 2
= 2
Daerah Penolakan
Tolak H0 jika Δ Deviance > χ2(0.05,2)
= 5.991
Keputusan
Kesimpulan
# Deviance of Model
Deviance.model <- model_conditional_Y$deviance - model_homogenous$deviance # model_conditional_Y: conditional on Y, model_homogenous: homogenous
Deviance.model
## [1] 1.122315
derajat.bebas <- (4 - 2)
derajat.bebas
## [1] 2
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 5.991465
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Terima"
Interpretasi Karena nilai Deviance.model = 1.12 lebih kecil dari nilai kritis chi-square tabel = 5.99 (df = 2, alpha = 0.05), maka keputusan uji adalah “Terima”.
Kesimpulan: Pada taraf nyata 5%, belum cukup bukti untuk menolak H0. Artinya, tidak ada interaksi antara jenis kelamin (X) dan fundamentalisme (Z) yang signifikan secara statistik. Model tanpa parameter λ(XZ) sudah cukup baik untuk data ini.
Model log-linear conditional pada Z memasukkan efek utama dan interaksi dua arah antara X dengan Z dan Y dengan Z, tanpa interaksi antara X dengan Y maupun interaksi tiga arah.
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
# Conditional Association on Z
model_conditional_Z <- glm(counts ~ x.sex + y.fav + z.fund +
x.sex*z.fund + y.fav*z.fund,
family = poisson(link = "log"))
summary(model_conditional_Z)
##
## Call:
## glm(formula = counts ~ x.sex + y.fav + z.fund + x.sex * z.fund +
## y.fav * z.fund, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.12255 0.10518 39.195 < 2e-16 ***
## x.sex1M -0.07453 0.10713 -0.696 0.487
## y.fav1fav 0.65896 0.11292 5.836 5.36e-09 ***
## z.fund1fund -0.06540 0.15126 -0.432 0.665
## z.fund2mod 0.33196 0.13777 2.410 0.016 *
## x.sex1M:z.fund1fund -0.12841 0.15109 -0.850 0.395
## x.sex1M:z.fund2mod -0.06267 0.13908 -0.451 0.652
## y.fav1fav:z.fund1fund 0.21254 0.16205 1.312 0.190
## y.fav1fav:z.fund2mod 0.11757 0.14771 0.796 0.426
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.361 on 11 degrees of freedom
## Residual deviance: 29.729 on 3 degrees of freedom
## AIC: 123.87
##
## Number of Fisher Scoring iterations: 4
Pengujian Ada Tidaknya Interaksi antara X dan Y (Homogenous model vs Conditional Association on Z)
Hipotesis
H0 : (Tidak ada interaksi antara jenis kelamin (X) dan pendapat tentang hukuman mati (Y))
H1 : (Ada interaksi antara jenis kelamin (X) dan pendapat tentang hukuman mati (Y))
Tingkat Signifikansi
Statistik Uji
Δ Deviance = Deviance model conditional on Z − Deviance model homogenous
= 29.729 − 1.798
= 27.931
db = db model conditional on Z − db model homogenous
= 3 − 2
= 1
Daerah Penolakan
Tolak H0 jika Δ Deviance > χ2(0.05,1)
= 3.841
Keputusan
Kesimpulan
# Deviance of Model
Deviance.model <- model_conditional_Z$deviance - model_homogenous$deviance # model_conditional_Z: conditional on Z, model_homogenous: homogenous
Deviance.model
## [1] 27.93095
derajat.bebas <- (3 - 2)
derajat.bebas
## [1] 1
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 3.841459
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Tolak"
Interpretasi Karena nilai Deviance.model = 27.93 jauh lebih besar dari nilai kritis chi-square tabel = 3.84 (df = 1, alpha = 0.05), maka keputusan uji adalah “Tolak”.
Kesimpulan: Pada taraf nyata 5%, terdapat bukti yang cukup untuk menolak H0H0. Artinya, ada interaksi yang signifikan antara jenis kelamin (X) dan pendapat tentang hukuman mati (Y). Dengan kata lain, model terbaik yang terbentuk adalah model yang menyertakan parameter interaksi λ(XY).
| Model | Parameter | Deviance | Jumlah Parameter | df | AIC |
|---|---|---|---|---|---|
| Saturated | Full Faktor | 0.00 | 12 | 0 | 100.14 |
| Homogenous | Tanpa Interaksi XYZ | 1.798 | 10 | 2 | 97.934 |
| Conditional on X | Faktor Utama dan Interaksi X | 3.9303 | 8 | 4 | 96.067 |
| Conditional on Y | Faktor Utama dan Interaksi Y | 2.9203 | 8 | 4 | 95.057 |
| Conditional on Z | Faktor Utama dan Interaksi Z | 29.729 | 9 | 3 | 123.87 |
| Interaksi | Pengujian | ΔΔ deviance | ΔΔ df | Chi-square Tabel | Keputusan | Keterangan |
|---|---|---|---|---|---|---|
| XYZ | Saturated vs Homogenous | 1.798 | 2 | 5.991 | Tidak Tolak H0 | tidak ada interaksi |
| YZ | Conditional on X vs Homogenous | 2.1323 | 2 | 5.991 | Tidak Tolak H0 | tidak ada interaksi |
| XZ | Conditional on Y vs Homogenous | 1.1223 | 2 | 5.991 | Tidak Tolak H0 | tidak ada interaksi |
| XY | Conditional on Z vs Homogenous | 27.931 | 1 | 3.841 | Tolak H0 | ada interaksi |
Dari hasil di atas diketahui bahwa asosiasi yang nyata hanya terdapat antara jenis kelamin dan pendapat mengenai hukuman mati. Sehingga, model terbaik adalah:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} \]
Model terbaik adalah model log-linear tanpa interaksi tiga arah dan hanya memuat interaksi dua arah antara jenis kelamin dan sikap terhadap hukuman mati.
Model terbaik dipilih berdasarkan pengujian interaksi yang signifikan, yaitu hanya interaksi dua arah antara jenis kelamin (X) dan sikap terhadap hukuman mati (Y):
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} \]
# Model Terbaik
bestmodel <- glm(counts ~ x.sex + y.fav + z.fund +
x.sex*y.fav,
family = poisson(link = "log"))
summary(bestmodel)
##
## Call:
## glm(formula = counts ~ x.sex + y.fav + z.fund + x.sex * y.fav,
## family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.26518 0.07794 54.721 < 2e-16 ***
## x.sex1M -0.59345 0.10645 -5.575 2.48e-08 ***
## y.fav1fav 0.48302 0.08075 5.982 2.20e-09 ***
## z.fund1fund 0.01986 0.07533 0.264 0.792
## z.fund2mod 0.38130 0.06944 5.491 4.00e-08 ***
## x.sex1M:y.fav1fav 0.65845 0.12708 5.181 2.20e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.3612 on 11 degrees of freedom
## Residual deviance: 4.6532 on 6 degrees of freedom
## AIC: 92.79
##
## Number of Fisher Scoring iterations: 4
Dari summary model diatas terlihat bahwa best model memiliki AIC yang lebih rendah dibandingkan saturated, homogeneous, dan conditional model
# Interpretasi koefisien model terbaik
data.frame(
koef = bestmodel$coefficients,
exp_koef = exp(bestmodel$coefficients)
)
## koef exp_koef
## (Intercept) 4.26517861 71.1776316
## x.sex1M -0.59344782 0.5524194
## y.fav1fav 0.48302334 1.6209677
## z.fund1fund 0.01985881 1.0200573
## z.fund2mod 0.38129767 1.4641834
## x.sex1M:y.fav1fav 0.65845265 1.9318008
exp(λX(Pria))=e xp(−0,593) =0,552 → nilai
odds
Tanpa memperhatikan fundamentalisme dan pendapat mengenai hukuman mati,
peluang seseorang berjenis kelamin laki-laki adalah 0,55 kali
dibandingkan perempuan.
Atau, peluang seseorang berjenis kelamin perempuan adalah 1 / (0,55) =
1,81 kali dibandingkan laki-laki.
exp(λY(dukung)) = exp(0,483) = 1,621 → nilai
odds
Tanpa memperhatikan jenis kelamin dan fundamentalisme, peluang seseorang
mendukung hukuman mati adalah 1,621 kali dibandingkan yang
menolak.
exp(λZ(funda)) = exp(0,01986) = 1,02 → nilai
odds
Tanpa memperhatikan jenis kelamin dan pendapat mengenai hukuman mati,
peluang seseorang fundamentalist adalah 1,02 kali dibandingkan
liberal.
exp(λZ(moderate)) = exp(0,381) = 1,464 → nilai
odds
Tanpa memperhatikan jenis kelamin dan pendapat mengenai hukuman mati,
peluang seseorang moderate adalah 1,464 kali dibandingkan
liberal.
exp(λXY(laki,dukung)) = exp(0,658) = 1,932 → nilai odds
ratio
Tanpa memperhatikan fundamentalisme, odds mendukung hukuman mati
(dibandingkan menolak) jika dia laki-laki adalah 1,932 kali dibandingkan
odds yang sama jika dia perempuan.
# Fitted values dari model terbaik
data.frame(
Fund = z.fund,
sex = x.sex,
favor = y.fav,
counts = counts,
fitted = bestmodel$fitted.values
)
## Fund sex favor counts fitted
## 1 1fund 1M 1fav 128 125.59539
## 2 1fund 1M 2opp 32 40.10855
## 3 1fund 2F 1fav 123 117.69079
## 4 1fund 2F 2opp 73 72.60526
## 5 2mod 1M 1fav 182 180.27878
## 6 2mod 1M 2opp 56 57.57155
## 7 2mod 2F 1fav 168 168.93257
## 8 2mod 2F 2opp 105 104.21711
## 9 3lib 1M 1fav 119 123.12582
## 10 3lib 1M 2opp 49 39.31990
## 11 3lib 2F 1fav 111 115.37664
## 12 3lib 2F 2opp 70 71.17763
Secara manual, nilai fitted value diperoleh dengan cara sebagai berikut:
\[ \begin{aligned} \hat{\mu}_{111} &= \exp(\lambda + \lambda_{x_{1m}} + \lambda_{y_{1fav}} + \lambda_{z_{fund}} + \lambda_{xy_{1m,1fav}}) \\ &= \exp(4.265 - 0.593 + 0.483 + 0.01986 + 0.658) \\ =\exp(4.833) \\ &=125.595 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{112} &= \exp(\lambda + \lambda_{x_{1m}} + \lambda_{y_{1fav}} + \lambda_{z_{2mod}} + \lambda_{xy_{1m,1fav}}) \\ &= \exp(4.265 - 0.593 + 0.483 + 0.381 + 0.658) \\ &= \exp(5.195) \\ &= 180.279 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{113} &= \exp(\lambda + \lambda_{x_{1m}} + \lambda_{y_{1fav}} + \lambda_{z_{lib}} + \lambda_{xy_{1m,1fav}}) \\ &= \exp(4.265 - 0.593 + 0.483 + 0 + 0.658) \\ &= \exp(4.813) \\ &= 123.126 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{121} &= \exp(\lambda + \lambda_{x_{1m}} + \lambda_{y_{2opp}} + \lambda_{z_{fund}} + \lambda_{xy_{1m,2opp}}) \\ & = \exp(4.265 - 0.593 + 0 + 0.01986 + 0) \\ & = \exp(3.692) \\ & = 40.109 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{122} &= \exp(\lambda + \lambda_{x_{1m}} + \lambda_{y_{2opp}} + \lambda_{z_{2mod}} + \lambda_{xy_{1m,2opp}}) \\ & = \exp(4.265 - 0.593 + 0 + 0.381 + 0) \\ & = \exp(4.053) \\ & = 57.572 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{123} &= \exp(\lambda + \lambda_{x_{1m}} + \lambda_{y_{2opp}} + \lambda_{z_{lib}} + \lambda_{xy_{1m,2opp}}) \\ &= \exp(4.265 - 0.593 + 0 + 0 + 0) \\ &= \exp(3.672) \\ &= 39.320 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{211} &= \exp(\lambda + \lambda_{x_{2f}} + \lambda_{y_{1fav}} + \lambda_{z_{fund}} + \lambda_{xy_{2f,1fav}}) \\ &= \exp(4.265 + 0 + 0.483 + 0.01986 + 0) \\ &= \exp(4.768) \\ &= 117.691 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{212} &= \exp(\lambda + \lambda_{x_{2f}} + \lambda_{y_{1fav}} + \lambda_{z_{2mod}} + \lambda_{xy_{2f,1fav}}) \\ &= \exp(4.265 + 0 + 0.483 + 0.381 + 0) \\ &= \exp(5.1295) \\ &= 168.933 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{213} &= \exp(\lambda + \lambda_{x_{2f}} + \lambda_{y_{1fav}} + \lambda_{z_{lib}} + \lambda_{xy_{2f,1fav}}) \\ &= \exp(4.265 + 0 + 0.483 + 0 + 0) \\ &= \exp(4.748) \\ &= 115.377 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{221} &= \exp(\lambda + \lambda_{x_{2f}} + \lambda_{y_{2opp}} + \lambda_{z_{fund}} + \lambda_{xy_{2f,2opp}}) \\ &= \exp(4.265 + 0 + 0 + 0.01986 + 0) \\ &= \exp(4.285) \\ &= 72.605 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{222} &= \exp(\lambda + \lambda_{x_{2f}} + \lambda_{y_{2opp}} + \lambda_{z_{2mod}} + \lambda_{xy_{2f,2opp}}) \\ &= \exp(4.265 + 0 + 0 + 0.381 + 0) \\ &= \exp(4.646) \\ &= 104.217 \end{aligned} \]
\[ \begin{aligned} \hat{\mu}_{223} &= \exp(\lambda + \lambda_{x_{2f}} + \lambda_{y_{2opp}} + \lambda_{z_{lib}} + \lambda_{xy_{2f,2opp}}) \\ &= \exp(4.265 + 0 + 0 + 0 + 0) \\ &= \exp(4.265) \\ &= 71.178 \end{aligned} \]
Fitted Value ini memberikan prediksi banyaknya sebuah kejadian misal prediksi fundamentalisme seorang laki laki yang mendukung hukuman mati adalah 125,59 alias 126. Mendekati nilai aslinya yakni 128 orang.
Log Linear Model adalah bentuk khusus yang digunakan pada frekeunsi sel tabel kontingensi dan berdistribusi poisson. Pada Model ini dilakukan beberapa kali penentuan signifikansi variabel hingga diperoleh model terbaiknya. Pada tabel kontingensi 2 x 2, akan diperoleh model hingga interaksi antara A dan B yang disebut model saturated. Kemudian diseleksi dengan model tanpa interaksi untuk menentukan model mana yang lebih baik. Pada Tabel kontingensi 2 x 3, sama yakni akan ada interaksi antara A dan B. Kemudian dibandingkan dengan model tanpa interaksi. Jika model tanpa interaksi memberikan hasil yang signifikan maka model tanpa interaksi lebih cocok. Pada tabel kontingensi 3 x 3, akan diperoleh model yang lebih kompleks yakni ada interaksi 2 variabel dan interaksi 3 variabel. Untuk itu dilakukan pengujian saturated(full model) vs homogenous (model tanpa interaksi 3 arah). Jika terdapat variabel yang tidak signifikan, maka dilanjutkan untuk menguji pada interaksi tingkat 2 dan model independent menggunakan selisih nilai deviance. Diakhir dapat dilakukan interpretasi koefisien model untuk melihat kesimpulan model serta dapat dilihat kemampuan model dalam memprediksi menggunakan fitting.
Penutup
Buku ini telah menguraikan berbagai konsep dasar serta penerapan analisis data kategori secara sistematis dan terstruktur. Dimulai dari pengertian data kategori, penyusunan tabel kontingensi, hingga pendekatan inferensial yang relevan, pembaca diarahkan untuk memahami pentingnya analisis ini dalam menjawab pertanyaan-pertanyaan riset yang melibatkan data klasifikasi atau kategorisasi.
Melalui berbagai contoh, penjelasan teori, dan ilustrasi praktis, diharapkan buku ini tidak hanya menambah wawasan konseptual tetapi juga membekali pembaca dengan keterampilan analitis yang aplikatif. Analisis data kategori memiliki kontribusi yang signifikan dalam banyak bidang, karena mampu menjelaskan dinamika hubungan antar variabel yang tidak dapat diukur secara langsung melalui data kuantitatif.
Masih banyak kekurangan buku ini. Namun harapannya buku ini dapat memberikan kontribusi nyata dalam pengembangan literasi statistik di kalangan akademisi maupun praktisi. Pemahaman terhadap data kategori merupakan salah satu langkah penting dalam membentuk pengambilan keputusan yang berbasis data, dan buku ini diharapkan dapat menjadi salah satu rujukan yang terpercaya dalam proses tersebut.
Referensi
Agresti, A. (2013). Categorical Data Analysis (3rd ed.). Hoboken, NJ: Wiley.
Agresti, A. (2019). An Introduction to Categorical Data Analysis (2nd ed.). Hoboken, NJ: Wiley.
Christensen, R. (2005). Categorical Data Analysis Using the SAS System (2nd ed.). Cary, NC: SAS Institute Inc.
Dobson, A. J., & Barnett, A. G. (2008). An Introduction to Generalized Linear Models (3rd ed.). Boca Raton, FL: Chapman & Hall/CRC.
Haryadi, S., & Marwan. (2020). Pengantar Model Linier Umum (Generalized Linear Model). Bandung: Alfabeta.
Kleinbaum, D. G., & Klein, M. (2010). Logistic Regression: A Self-Learning Text (3rd ed.). New York, NY: Springer.
Kurnia, A., & Setyawan, W. (2019). Analisis Log-Linear untuk Data Kategori. Malang: UB Press.
Menard, S. (2002). Applied Logistic Regression Analysis (2nd ed.). Thousand Oaks, CA: SAGE Publications.
Modul ADK, Pertemuan 14. (2021). Universitas Padjadjaran.
Utami, R. P., & Nurkholis, M. (2018). Regresi Multinomial: Teori dan Aplikasi dengan SPSS dan R. Surabaya: Airlangga University Press.
Widodo, A. (2016). Analisis Tabel Kontingensi dalam Penelitian Sosial (Edisi Revisi). Yogyakarta: Pustaka Pelajar.