Puji dan syukur penulis panjatkan ke hadirat Tuhan Yang Maha Esa, karena atas rahmat dan karunia-Nya, penulis dapat menyelesaikan penyusunan eBook ini yang berjudul “Analisis Data Kategori (ADK)” sebagai bagian dari tugas akhir dalam menyelesaikan studi pada program pendidikan yang sedang ditempuh.
eBook ini disusun dengan tujuan memberikan pemahaman yang sistematis dan aplikatif mengenai konsep-konsep dasar serta metode analisis data kategori. Dalam penyusunan buku ini, penulis membahas berbagai teknik seperti tabel kontingensi, ukuran asosiasi (risk difference, relative risk, odds ratio), serta uji chi-square dan model lanjutan seperti log-linear dan uji CMH (Cochran–Mantel–Haenszel), dilengkapi dengan implementasi dalam perangkat lunak R.
Penulis menyadari bahwa penyusunan eBook ini tidak terlepas dari dukungan berbagai pihak. Oleh karena itu, penulis mengucapkan terima kasih kepada:
Penulis berharap eBook ini dapat memberikan manfaat, tidak hanya bagi penulis sendiri, tetapi juga bagi pembaca yang ingin memahami dan menerapkan analisis data kategori dalam penelitian maupun praktik statistik lainnya. Penulis juga terbuka terhadap segala bentuk kritik dan saran yang bersifat membangun guna perbaikan di masa mendatang.
Akhir kata, semoga karya sederhana ini dapat memberikan kontribusi positif bagi perkembangan ilmu statistik, khususnya dalam bidang analisis data kategori.
Sumedang, 23 June 2025
Penulis —
Analisis data kategori merupakan metode statistik yang digunakan untuk mengelola dan memahami data yang berbentuk klasifikasi atau kategori. Data seperti ini tidak berbentuk angka kontinu, melainkan berupa label atau kelompok, misalnya jenis kelamin, status pekerjaan, tingkat pendidikan, atau preferensi konsumen. Data kategori sangat umum dijumpai dalam berbagai bidang seperti ilmu sosial, kesehatan, bisnis, dan kebijakan publik, sehingga pemahaman terhadap metode ini sangatlah penting.
Melalui pendekatan ini, kita dapat menemukan pola dan tren dalam data, memahami hubungan antarvariabel, mendukung pengambilan keputusan yang berbasis data, serta membangun model prediktif. Contohnya, kita bisa mengevaluasi apakah jenis kelamin memengaruhi pilihan jurusan atau apakah tingkat pendidikan berkaitan dengan pendapatan.
Analisis data kategori memiliki berbagai tujuan utama yang sangat penting dalam membantu proses pengambilan keputusan berbasis data, terutama ketika data yang tersedia berbentuk kualitatif atau nominal. Beberapa tujuan utama dari analisis ini meliputi:
Analisis data kategori membantu dalam mengamati kecenderungan dan distribusi kategori dalam suatu populasi, sehingga dapat memberikan gambaran yang lebih jelas mengenai bagaimana suatu kelompok atau individu berperilaku berdasarkan karakteristik tertentu. Misalnya, dalam konteks pemasaran, analisis ini dapat digunakan untuk melihat kecenderungan konsumen dari kelompok usia tertentu dalam memilih jenis produk tertentu, seperti preferensi terhadap produk digital di kalangan generasi muda atau kecenderungan memilih produk kebutuhan rumah tangga pada kelompok usia dewasa. Dengan memahami pola distribusi tersebut, pengambil kebijakan atau pelaku usaha dapat merancang strategi yang lebih tepat sasaran berdasarkan karakteristik demografis atau kategori lain yang relevan.
Metode ini memungkinkan dilakukan analisis hubungan antara dua atau lebih variabel kategori untuk mengetahui apakah terdapat keterkaitan yang signifikan di antara variabel-variabel tersebut. Dengan menggunakan teknik seperti uji chi-kuadrat atau analisis tabel kontingensi, kita dapat menilai apakah distribusi suatu kategori pada satu variabel dipengaruhi oleh kategori dari variabel lain. Misalnya, dalam studi kesehatan masyarakat, kita dapat mengkaji apakah status perokok (perokok atau bukan perokok) memiliki hubungan yang signifikan dengan jenis kelamin (laki-laki atau perempuan) atau dengan tempat tinggal (perkotaan atau pedesaan). Hasil dari analisis ini dapat memberikan wawasan yang berguna untuk merancang intervensi atau kebijakan yang lebih tepat sasaran, seperti kampanye anti-rokok yang difokuskan pada kelompok demografis tertentu yang memiliki prevalensi merokok lebih tinggi.
Hasil analisis data kategori dapat memberikan dasar yang kuat dalam pengambilan keputusan di berbagai bidang, seperti bisnis, pemerintahan, dan program sosial. Dengan memahami hubungan antar kategori dan distribusinya dalam populasi, pengambil kebijakan dapat merancang strategi yang lebih relevan dan efisien. Misalnya, data kategori dapat membantu menentukan segmen pasar yang potensial, atau mengidentifikasi kelompok masyarakat yang membutuhkan intervensi khusus dalam suatu program bantuan.
Data kategori dapat digunakan untuk membangun model prediktif yang membantu memperkirakan kemungkinan terjadinya suatu peristiwa berdasarkan informasi kategorikal. Salah satu metode yang umum digunakan adalah regresi logistik, yang mampu memprediksi peluang suatu kejadian—misalnya, kemungkinan seseorang menjadi perokok berdasarkan jenis kelamin, tingkat pendidikan, dan status pekerjaan. Model seperti ini sangat berguna dalam perencanaan kebijakan, strategi pemasaran, maupun penelitian sosial.
Analisis data kategori adalah teknik statistik yang digunakan untuk menganalisis variabel yang bersifat kategorik, yaitu variabel yang nilainya berupa kategori atau kelompok, bukan angka yang bersifat kuantitatif. Variabel ini dapat berupa skala nominal (seperti jenis kelamin, status pernikahan) atau ordinal (seperti tingkat kepuasan atau pendidikan). Ruang lingkup analisis ini mencakup pengamatan distribusi kategori, pengujian hubungan antar variabel kategorik, pengukuran kekuatan asosiasi, serta pembangunan model prediktif yang relevan, seperti regresi logistik. Analisis ini banyak digunakan dalam berbagai bidang seperti ilmu sosial, kesehatan, pemasaran, dan kebijakan publik.
Dalam analisis data kategori, variabel dapat dibedakan berdasarkan skala pengukurannya, yaitu skala nominal dan ordinal:
Nominal: Merupakan kategori yang tidak memiliki urutan atau tingkatan. Setiap kategori hanya berfungsi sebagai label atau penanda. Contohnya adalah jenis kelamin (laki-laki, perempuan) atau kota tempat tinggal (Jakarta, Surabaya, Bandung). Tidak ada kategori yang lebih tinggi atau lebih rendah dari yang lain.
Ordinal: Merupakan kategori yang memiliki urutan atau tingkatan tertentu. Meskipun data ini berbentuk kategori, terdapat perbedaan dalam hal posisi atau ranking. Contohnya adalah tingkat kepuasan (sangat puas, puas, cukup puas, tidak puas, sangat tidak puas) atau jenjang pendidikan (SD, SMP, SMA, perguruan tinggi). Namun, jarak antar tingkatan tidak selalu sama atau terukur secara pasti.
Biner: Data biner hanya memiliki dua kategori yang saling eksklusif dan mencakup dua pilihan saja. Contohnya adalah status keberhasilan (sukses/gagal) atau kondisi kesehatan (sehat/sakit). Data ini sering digunakan dalam pengujian hipotesis sederhana yang membandingkan dua kelompok atau kondisi.
Multikategori: Data multikategori memiliki lebih dari dua kategori, yang bisa beragam dan tidak terbatas pada dua pilihan. Contohnya termasuk tingkat kepuasan (sangat puas, puas, netral, tidak puas, sangat tidak puas) atau jenis kelamin (laki-laki, perempuan, non-biner). Data jenis ini memungkinkan analisis yang lebih kompleks, karena melibatkan lebih banyak kelompok yang harus dibandingkan.
Data kuantitatif merupakan data numerik yang dapat dihitung, diukur, dan dianalisis menggunakan metode seperti regresi linear atau ANOVA. Sebaliknya, data kategorikal tidak dapat diolah secara matematis seperti data kuantitatif, melainkan dianalisis menggunakan metode frekuensi, proporsi, tabel kontingensi, uji chi-square, atau regresi logistik.
Analisis data kategori memiliki manfaat yang sangat luas dalam berbagai bidang, baik di sektor akademik maupun industri. Beberapa bidang utama di mana analisis ini banyak diterapkan antara lain:
Dalam ilmu sosial dan psikologi, analisis data kategori digunakan untuk memahami berbagai aspek sikap, perilaku, dan opini yang terbentuk berdasarkan kategori demografis seperti kelompok usia, gender, atau tingkat pendidikan. Misalnya, dalam studi perilaku konsumen, analisis ini dapat mengungkapkan bagaimana preferensi terhadap produk atau layanan berbeda di antara pria dan wanita, atau bagaimana usia memengaruhi pandangan seseorang terhadap isu sosial tertentu. Selain itu, di bidang psikologi, analisis data kategori membantu dalam mengidentifikasi pola perilaku atau gangguan psikologis yang mungkin lebih sering terjadi pada kelompok tertentu, seperti berdasarkan tingkat pendidikan atau status pekerjaan, yang kemudian dapat digunakan untuk merancang intervensi yang lebih tepat dan berbasis data.
Dalam dunia kesehatan dan medis, analisis data kategori digunakan untuk menganalisis hubungan antara gaya hidup, kebiasaan, dan faktor risiko penyakit. Misalnya, analisis ini dapat membantu dalam mengidentifikasi apakah pola makan, tingkat aktivitas fisik, atau kebiasaan merokok memiliki hubungan signifikan dengan risiko penyakit tertentu, seperti diabetes atau penyakit jantung. Selain itu, analisis data kategori juga berguna dalam mengelompokkan pasien berdasarkan tingkat risiko, misalnya membagi pasien ke dalam kelompok berisiko rendah, sedang, atau tinggi berdasarkan faktor-faktor seperti usia, jenis kelamin, dan kondisi medis sebelumnya. Dengan demikian, hasil analisis ini memungkinkan tenaga medis untuk merancang program pencegahan dan perawatan yang lebih terfokus dan efisien, sesuai dengan profil risiko masing-masing pasien.
Dalam dunia bisnis dan pemasaran, analisis data kategori sangat penting untuk menentukan segmentasi pasar dan merancang strategi pemasaran yang tepat. Dengan menganalisis preferensi dan karakteristik pelanggan berdasarkan kategori seperti usia, jenis kelamin, lokasi geografis, atau tingkat pendapatan, perusahaan dapat mengidentifikasi kelompok pasar yang memiliki kebutuhan dan keinginan yang serupa. Misalnya, perusahaan dapat menggunakan analisis ini untuk menargetkan iklan atau promosi produk kepada kelompok usia tertentu atau kelompok pelanggan dengan tingkat pendapatan tertentu. Selain itu, analisis data kategori membantu dalam pengembangan produk baru yang sesuai dengan preferensi pasar yang berbeda, meningkatkan kepuasan pelanggan, dan mengoptimalkan kampanye pemasaran yang lebih terfokus dan efektif.
Dalam dunia pendidikan, analisis data kategori digunakan untuk mengevaluasi pengaruh berbagai faktor terhadap hasil belajar siswa. Misalnya, dengan menganalisis latar belakang keluarga, seperti tingkat pendidikan orang tua, status pekerjaan, atau pendapatan keluarga, kita dapat mengidentifikasi bagaimana faktor-faktor tersebut mempengaruhi prestasi akademik siswa. Selain itu, analisis ini juga digunakan untuk menilai efektivitas metode pembelajaran berdasarkan kategori tertentu, seperti jenis kelas (offline atau online), gaya mengajar, atau tingkat keterlibatan siswa. Dengan demikian, analisis data kategori membantu dalam merancang kebijakan pendidikan yang lebih efektif dan program pembelajaran yang dapat disesuaikan dengan kebutuhan dan karakteristik siswa.
Dalam kebijakan dan administrasi publik, analisis data kategori sangat penting untuk menyusun kebijakan yang berbasis data dan lebih efektif. Misalnya, dalam merancang program bantuan sosial, pemerintah dapat menggunakan analisis data kategori untuk memastikan bantuan disalurkan kepada kelompok yang tepat, seperti berdasarkan kategori usia (misalnya, bantuan untuk lansia atau anak-anak) atau jenis pekerjaan (seperti pekerja informal atau buruh migran). Selain itu, data kategori juga digunakan untuk mengidentifikasi kelompok masyarakat yang membutuhkan intervensi lebih lanjut, seperti dalam kebijakan kesehatan atau pendidikan, sehingga dapat merancang program yang lebih terfokus dan efisien.
Mengklasifikasikan jenis kejahatan dan menganalisis tren kejahatan berdasarkan wilayah dan waktu kejadian.
Analisis data kategori menjadi semakin relevan seiring dengan berkembangnya teknologi dan kebutuhan akan pengambilan keputusan yang akurat. Dengan pendekatan yang tepat, analisis ini membantu menghasilkan wawasan yang lebih tajam dan keputusan yang lebih strategis.
Berbagai metode dapat digunakan dalam analisis data kategori, tergantung pada tujuan penelitian dan jenis data yang digunakan. Metode-metode ini membantu untuk memahami hubungan antar kategori, menguji hipotesis, serta membuat prediksi berdasarkan data kategorikal. Beberapa metode umum yang sering digunakan dalam analisis data kategori antara lain:
Tabel kontingensi dan uji Chi-Square adalah metode yang digunakan untuk menguji hubungan antara dua variabel kategorikal. Uji ini bertujuan untuk menentukan apakah ada asosiasi atau ketergantungan antara dua variabel yang diobservasi.
Tabel Kontingensi: Merupakan tabel yang digunakan untuk menunjukkan frekuensi kemunculan kombinasi kategori dari dua variabel. Tabel ini membantu dalam memvisualisasikan distribusi data dan memudahkan interpretasi hasil uji.
Uji Chi-Square: Digunakan untuk menguji apakah distribusi frekuensi yang diamati pada tabel kontingensi berbeda secara signifikan dari distribusi yang diharapkan jika kedua variabel tidak memiliki hubungan. Uji ini menghasilkan nilai Chi-Square yang digunakan untuk menentukan apakah ada hubungan yang signifikan secara statistik antara variabel-variabel tersebut.
Contoh penerapan: Misalnya, kita ingin menguji apakah ada hubungan antara tingkat pendidikan dan status pekerjaan. Dengan menggunakan tabel kontingensi, kita dapat mengelompokkan data berdasarkan kategori tingkat pendidikan (misalnya, SD, SMP, SMA, perguruan tinggi) dan status pekerjaan (misalnya, bekerja atau tidak bekerja). Kemudian, uji Chi-Square dapat digunakan untuk menguji apakah terdapat hubungan signifikan antara kedua variabel ini.
Regresi logistik adalah metode statistik yang digunakan untuk memprediksi probabilitas terjadinya suatu kejadian berdasarkan satu atau lebih variabel independen yang bersifat kategorikal atau kontinu. Metode ini sering digunakan ketika variabel dependen yang ingin diprediksi berbentuk biner (misalnya, ya/tidak, berhasil/gagal, membeli/tidak membeli).
Fungsi Utama: Regresi logistik menghasilkan probabilitas (nilai antara 0 dan 1) bahwa suatu kejadian akan terjadi, yang dapat diinterpretasikan sebagai kemungkinan dari hasil yang diinginkan berdasarkan variabel prediktor.
Contoh penerapan: Misalnya, perusahaan ingin memprediksi apakah seorang pelanggan akan membeli produk berdasarkan preferensi mereka yang dikelompokkan dalam kategori seperti jenis produk yang lebih disukai (elektronik, pakaian, dll), usia, atau lokasi geografis. Dengan menggunakan regresi logistik, perusahaan dapat memodelkan hubungan antara kategori preferensi dan keputusan pembelian, dan menghitung probabilitas pembelian untuk pelanggan baru.
Analisis Correspondence (CA) adalah metode multivariat yang digunakan untuk mengeksplorasi dan memvisualisasikan hubungan antara kategori-kategori dalam satu atau lebih variabel dalam dataset. Metode ini sering digunakan untuk menganalisis data kontingensi yang melibatkan dua atau lebih variabel kategorikal, dengan tujuan untuk memahami asosiasi antara kategori-kategori tersebut dan bagaimana mereka tersebar dalam ruang dua dimensi.
Fungsi Utama: CA memberikan representasi grafis yang memudahkan identifikasi pola atau hubungan antara kategori-kategori dalam variabel yang berbeda. Hasilnya biasanya berupa diagram yang menunjukkan kedekatan antara kategori-kategori, sehingga memudahkan interpretasi dan pemahaman hubungan antar kategori.
Contoh penerapan: Misalnya, sebuah studi ingin menganalisis preferensi makanan berdasarkan kelompok usia. Dengan menggunakan analisis correspondence, kita dapat melihat bagaimana kategori preferensi makanan (misalnya, makanan cepat saji, makanan sehat, makanan lokal) tersebar di antara kelompok usia yang berbeda (misalnya, usia 18-25, 26-35, 36-45, dll). Analisis ini dapat membantu mengidentifikasi pola atau hubungan yang ada, seperti kecenderungan kelompok usia tertentu untuk memilih jenis makanan tertentu.
Decision Tree dan Random Forest adalah metode machine learning yang sering digunakan untuk tugas klasifikasi, terutama ketika data yang digunakan berbentuk kategorikal. Kedua metode ini sangat efektif dalam memodelkan hubungan antara variabel independen dengan variabel dependen kategorikal.
Decision Tree: Metode ini membangun model dalam bentuk struktur pohon yang memisahkan data ke dalam kategori yang berbeda berdasarkan aturan-aturan tertentu. Setiap cabang dalam pohon mewakili keputusan yang dibuat berdasarkan nilai variabel, dan setiap daun menunjukkan hasil klasifikasi atau kategori akhir. Decision Tree sangat berguna karena interpretasinya yang sederhana dan mudah dipahami.
Random Forest: Merupakan metode ensemble yang terdiri dari banyak decision tree. Setiap pohon dalam random forest membuat keputusan sendiri, dan hasil akhirnya adalah prediksi berdasarkan mayoritas keputusan pohon-pohon tersebut. Random Forest sangat kuat dalam mengatasi masalah overfitting dan lebih akurat dibandingkan dengan single decision tree, terutama pada dataset yang besar dan kompleks.
Variabel acak kategori adalah variabel yang hanya dapat memiliki beberapa kategori diskrit sebagai hasilnya, seperti jenis kelamin, status pernikahan, atau status kesehatan. Distribusi probabilitas untuk variabel acak kategori menggambarkan kemungkinan terjadinya setiap kategori tersebut. Dengan kata lain, distribusi probabilitas menunjukkan peluang bahwa suatu kategori tertentu akan terjadi dalam sampel atau populasi yang lebih besar.
Distribusi Probabilitas untuk Data Kategori sering kali digunakan untuk model yang melibatkan variabel kategorikal, terutama ketika kita ingin menghitung kemungkinan terjadinya kategori tertentu berdasarkan data historis atau kondisi tertentu. Beberapa jenis distribusi probabilitas yang sering digunakan dalam data kategori adalah:
Distribusi Bernoulli digunakan untuk percobaan biner, yaitu percobaan yang hanya memiliki dua kemungkinan hasil, yang sering disebut sebagai sukses dan gagal. Dalam konteks ini, kita mendefinisikan dua hasil yang mungkin dengan nilai biner:
Sukses (1) dengan probabilitas \(p\)
Gagal (0) dengan probabilitas \(1 - p\)
Fungsi Probabilitas:
\(P(X = x) = p^x (1-p)^{1-x}, \quad x \in \{0,1\}\)
Keterangan Notasi:
- \(X\) : Variabel acak biner (0 atau 1)
- \(p\) : Probabilitas sukses (X = 1)
Rataan dan Ragam:
\(E(X) = p \quad \text{dan} \quad \text{Var}(X) = p(1 - p)\)
Contoh Variabel Acak Bernoulli:
Misalnya, kita ingin melakukan percobaan Bernoulli dengan probabilitas sukses sebesar 0.7 (misalnya, probabilitas berhasil dalam suatu percakapan telepon) dan ingin melakukan 15 percobaan.
Perhitungan dengan R:
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.3.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:kableExtra':
##
## group_rows
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(vcd)
## Warning: package 'vcd' was built under R version 4.3.3
## Loading required package: grid
set.seed(123)
# 15 percobaan Bernoulli dengan probabilitas sukses 0.7
bernoulli_sample <- rbinom(n = 15, size = 1, prob = 0.7)
# Menampilkan hasil
bernoulli_sample
## [1] 1 0 1 0 0 1 1 0 1 1 0 1 1 1 1
Distribusi Binomial adalah generalisasi dari distribusi Bernoulli yang digunakan untuk percobaan yang dilakukan sebanyak n kali, dengan setiap percobaan independen dan memiliki dua kemungkinan hasil (sukses atau gagal). Distribusi ini digunakan ketika kita ingin menghitung probabilitas terjadinya k keberhasilan dalam n percobaan, di mana setiap percobaan memiliki probabilitas sukses p.
Fungsi Probabilitas Distribusi Binomial:
\(P(X = k) = \binom{n}{k} p^k (1-p)^{n-k}\)
Keterangan Notasi:
\(X\) : Variabel acak yang menunjukkan jumlah keberhasilan dalam percobaan.
\(n\) : Jumlah percobaan atau percobaan yang dilakukan.
\(k\) : Jumlah keberhasilan yang diinginkan dalam percobaan.
\(p\) : Probabilitas terjadinya keberhasilan dalam setiap percobaan
\({n \choose k}\): Kombinasi “n pilih k”, dihitung sebagai \(\frac{n!}{k!(n-k)!}\)
Rataan dan Ragam:
\(E(X) = np \quad \text{dan} \quad \text{Var}(X) = np(1 - p)\)
Contoh Kasus: Misalkan kita memiliki sebuah eksperimen dengan 10 percobaan (n = 10), dan probabilitas keberhasilan dalam setiap percobaan adalah 0.3 (p = 0.3). Kita ingin menghitung kemungkinan terjadinya 3 keberhasilan (k = 3) dalam percobaan tersebut.
Distribusi binomial digunakan untuk menghitung probabilitas ini dengan rumus di atas.
Perhitungan dengan R:
# Menghasilkan 5 sampel acak dari distribusi binomial
set.seed(123) # Set seed untuk hasil yang dapat diulang
sampel_binomial <- rbinom(n = 5, size = 10, prob = 0.3)
sampel_binomial
## [1] 2 4 3 5 5
Distribusi Multinomial adalah generalisasi lebih lanjut dari distribusi Binomial yang digunakan ketika setiap percobaan memiliki lebih dari dua kemungkinan hasil. Sementara distribusi binomial hanya memperhitungkan dua kategori (sukses/gagal), distribusi multinomial digunakan ketika percobaan dapat menghasilkan lebih dari dua kategori.
Jika suatu eksperimen dilakukan n kali, dan setiap percobaan dapat menghasilkan salah satu dari k kategori dengan probabilitas masing-masing \(p_1, p_2, \dots, p_k\), maka distribusi probabilitas multinomial untuk variabel acak \(X_{1},X_{2},…,X_{k}\) (yang masing-masing menunjukkan jumlah kejadian dari kategori 1, kategori 2, dan seterusnya) adalah:
Fungsi Probabilitas:
\(P(X_1 = x_1, X_2 = x_2, \ldots, X_k = x_k) = \frac{n!}{x_1! x_2! \ldots x_k!} p_1^{x_1} p_2^{x_2} \ldots p_k^{x_k}\)
di mana:
\(n\) : Jumlah percobaan atau percobaan yang dilakukan.
\(x_i\) : Jumlah kejadian kategori ke-i dalam n percobaan.
\(p_i\) : Probabilitas terjadinya kategori ke-i dalam satu percobaan
\(\frac{n!}{x_1! x_2! \dots x_k!}\) : Faktor kombinasi yang menghitung kemungkinan pengaturan kejadian untuk setiap kategori.
Contoh Kasus:
Jenis makanan yang dipesan di kantin: nasi goreng, mie ayam, atau soto ayam.
Jenis kendaraan yang dipilih responden survei: motor, mobil, sepeda.
Perhitungan dengan R:
set.seed(2025)
multinomial_sample <- rmultinom(n = 1, size = 15, prob = c(0.4, 0.35, 0.25))
multinomial_sample
## [,1]
## [1,] 7
## [2,] 5
## [3,] 3
Distribusi Poisson digunakan untuk menghitung jumlah kejadian dalam suatu interval waktu atau ruang tertentu, dengan asumsi bahwa kejadian tersebut terjadi secara acak dan independen, tetapi dengan rata-rata kejadian tetap per unit.
Fungsi Probabilitas:
\(P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!}\)
Keterangan Notasi:
\(X\): Jumlah kejadian dalam interval tertentu.
\(k\) : Jumlah kejadian yang diamati.
\(λ\) : Rata-rata kejadian dalam interval tersebut.
\(e\) : Bilangan Euler (sekitar 2.718).
Rataan dan Ragam:
\(E(X) = \lambda \quad \text{dan} \quad \text{Var}(X) = \lambda\)
Contoh Kasus:
Jumlah pelanggan yang datang ke restoran per jam.
Jumlah kecelakaan lalu lintas dalam satu hari.
Jumlah SMS spam yang diterima dalam satu minggu.
Misalnya, rata-rata ada 3 pelanggan datang ke warung dalam satu jam. Kita ingin melihat berapa pelanggan yang datang dalam 12 jam menggunakan distribusi Poisson:
set.seed(2025)
poisson_sample <- rpois(n = 12, lambda = 3) # 12 jam, rata-rata 3 pelanggan per jam
poisson_sample
## [1] 4 3 3 3 4 3 5 1 3 3 3 6
Dalam analisis data kategori, desain sampling memiliki peran yang krusial dalam menentukan validitas dan reliabilitas hasil penelitian. Pemilihan desain sampling yang tepat bergantung pada tujuan penelitian dan jenis data yang dikumpulkan.
Secara umum, desain sampling dalam analisis data kategori dapat diklasifikasikan ke dalam dua pendekatan utama, yaitu:
Masing-masing pendekatan ini memiliki karakteristik dan metode sampling yang berbeda, yang sering digunakan dalam penelitian eksperimental maupun observasional, seperti eksperimen, studi kohort, dan studi kasus-kontrol.
Prospective sampling adalah metode pengambilan sampel dimana subjek penelitian diidentifikasi dan diikuti dalam periode waktu tertentu untuk mengamati perkembangan variabel yang diteliti. Pendekatan ini memungkinkan peneliti untuk mengontrol variabel bebas sebelum pengukuran hasil dilakukan. Oleh karena itu, metode ini sangat cocok untuk studi kausal dan eksperimental.
Dalam studi eksperimental, subjek secara acak dialokasikan ke dalam kelompok perlakuan dan kontrol. Beberapa teknik sampling yang umum digunakan antara lain:
Simple Random Sampling (SRS)
Setiap individu dalam populasi memiliki probabilitas yang sama untuk dipilih.
Stratified Random Sampling
Populasi dibagi ke dalam strata berdasarkan karakteristik tertentu, kemudian sampel diambil secara acak dari setiap strata.
Cluster Sampling
Populasi dibagi menjadi kelompok-kelompok (cluster), lalu beberapa cluster dipilih secara acak untuk dianalisis.
Studi eksperimental dengan desain sampling yang baik akan meningkatkan validitas internal dan eksternal dari hasil penelitian.
Studi kohort adalah penelitian observasional dimana kelompok individu dengan karakteristik tertentu diikuti dari waktu ke waktu untuk mengamati kejadian tertentu. Jenis sampling yang digunakan meliputi:
Census Sampling
Seluruh anggota dalam populasi tertentu diikutsertakan dalam penelitian.
Systematic Sampling
Subjek dipilih berdasarkan interval tertentu dari daftar populasi.
Matched Sampling
Setiap individu dalam kelompok kohort dipasangkan dengan individu serupa dalam kelompok lain berdasarkan variabel tertentu.
Studi kohort bermanfaat untuk menilai hubungan jangka panjang antara faktor paparan dan kejadian yang diteliti.
Retrospective sampling adalah metode pengumpulan data di mana informasi dikumpulkan dari kejadian yang telah terjadi di masa lalu. Subjek penelitian dikelompokkan berdasarkan hasil (outcome) tertentu, lalu ditelusuri ke belakang untuk melihat faktor-faktor penyebab atau risiko. Pendekatan ini sering digunakan dalam studi observasional, terutama studi kasus-kontrol.
Studi kasus-kontrol merupakan salah satu pendekatan utama dalam retrospective sampling, di mana kelompok dengan kondisi atau penyakit tertentu (kasus) dibandingkan dengan kelompok tanpa kondisi tersebut (kontrol). Tujuan utamanya adalah untuk mengidentifikasi faktor risiko atau penyebab yang mungkin terkait dengan kondisi yang diteliti.
Karakteristik utama dari studi ini:
Pengumpulan data dilakukan setelah outcome terjadi.
Efisien untuk meneliti kejadian langka atau penyakit dengan masa laten panjang.
Tidak dapat menghitung insiden langsung, tetapi dapat menghitung odds ratio sebagai ukuran asosiasi.
Teknik Sampling Umum dalam Studi Kasus-Kontrol:
Purposive Sampling
Pemilihan sampel secara sengaja berdasarkan karakteristik yang relevan dengan tujuan penelitian.
Snowball Sampling
Responden awal membantu merekrut subjek lain yang memiliki karakteristik serupa.
Incidence Density Sampling
Kasus dan kontrol dipilih dari populasi yang sama dengan memperhitungkan periode waktu kemunculan kasus.
Studi kasus-kontrol efektif untuk penelitian pada kondisi yang langka atau baru muncul.
Studi kohort retrospektif menggunakan data historis untuk mengelompokkan individu berdasarkan paparan masa lalu, kemudian dianalisis hubungannya dengan hasil yang terjadi. Teknik sampling yang umum meliputi:
Convenience Sampling
Subjek dipilih berdasarkan ketersediaan data yang sudah ada.
Quota Sampling
Sampel dipilih untuk mencerminkan proporsi tertentu dalam populasi.
Case-Based Sampling
Sampel dipilih berdasarkan karakteristik kasus yang telah terjadi.
Studi ini cocok untuk situasi ketika data longitudinal sudah tersedia, namun tidak dapat dilakukan pengamatan langsung secara prospektif.
Tabel 1: Perbandingan Desain Sampling dalam Analisis Data Kategori
| Jenis Studi | Pendekatan | Metode Sampling | Keuntungan | Kelemahan |
|---|---|---|---|---|
| Eksperimen | Prospektif | SRS, Stratified, Cluster | Kontrol tinggi terhadap variabel, hubungan sebab akibat dapat dianalisis | Biaya tinggi, etika dan validitas perlu diperhatikan |
| Studi Kohort | Prospektif | Census, Systematic, Matched | Dapat mengamati perkembangan kejadian dalam jangka panjang | Membutuhkan waktu lama, risiko kehilangan partisipan |
| Studi Kasus-Kontrol | Retrospektif | Purposive, Snowball, Incidence Density | Mudah dan cepat dilakukan, efisien untuk penyakit langka | Sulit mengontrol variabel pengganggu, rentan bias recall |
| Studi Kohort Retrospektif | Retrospektif | Convenience, Quota, Case-Based | Memanfaatkan data historis, lebih murah daripada studi kohort | Ketergantungan pada kualitas data historis, bisa terjadi missing data |
Desain sampling dalam analisis data kategori sangat dipengaruhi oleh pendekatan yang digunakan, yaitu prospektif atau retrospektif. Pemilihan metode sampling yang tepat berperan penting dalam studi eksperimen, kohort, maupun kasus-kontrol, dan akan menentukan tingkat validitas serta kekuatan generalisasi dari hasil penelitian.
Studi Eksperimen biasanya menggunakan pendekatan prospektif, karena memberikan kendali penuh terhadap variabel bebas. Meskipun efektif untuk menguji kausalitas, metode ini memerlukan biaya tinggi dan perencanaan yang matang.
Studi Kohort memungkinkan peneliti mengikuti subjek dari waktu ke waktu, sehingga sangat baik untuk menilai risiko atau insiden. Namun, durasi panjang berisiko menurunkan partisipasi dan memerlukan sumber daya yang besar.
Studi Kasus-Kontrol, dengan pendekatan retrospektif, sangat efisien untuk penyakit langka karena hanya melibatkan subjek yang relevan. Akan tetapi, kontrol terhadap variabel perancu relatif lemah.
Studi Kohort Retrospektif memanfaatkan data historis yang tersedia, sehingga hemat waktu dan biaya. Namun, keterbatasan kualitas data masa lalu dapat menjadi hambatan signifikan.
Tabel kontingensi 2×2 merupakan bentuk paling sederhana dari tabel kontingensi yang digunakan dalam analisis data kategorik. Tabel ini menyajikan hubungan antara dua variabel kategori yang masing-masing memiliki dua kategori. Tujuan utama dari penggunaannya adalah untuk menguji adanya hubungan atau asosiasi antara dua variabel tersebut, yang sering dijumpai dalam penelitian eksperimental maupun observasional.
Sebagai contoh, dalam dunia kesehatan masyarakat, tabel ini bisa digunakan untuk menganalisis hubungan antara paparan terhadap faktor risiko (misalnya merokok) dan hasil yang diteliti (misalnya kanker paru-paru). Dalam desain eksperimental, tabel ini juga umum digunakan untuk mengevaluasi efek suatu perlakuan atau pengobatan.
Tabel kontingensi 2×2 juga memungkinkan kita untuk menghitung ukuran asosiasi seperti risk difference, relative risk, dan odds ratio, serta melakukan uji hipotesis menggunakan uji chi-kuadrat atau uji Fisher.
Struktur umum tabel kontingensi 2×2 dalam adalah sebagai berikut:
\[ \begin{array}{|c|c|c|c|} \hline & \text{Kejadian (+)} & \text{Kejadian (−)} & \text{Total Baris} \\ \hline \text{Paparan (+)} & n_{11} & n_{12} & n_{1\cdot} \\ \hline \text{Paparan (−)} & n_{21} & n_{22} & n_{2\cdot} \\ \hline \text{Total Kolom} & n_{\cdot 1} & n_{\cdot 2} & n \\ \hline \end{array} \]
dengan keretangan:
\(n_{11}\): Jumlah individu dengan paparan dan kejadian
\(n_{12}\): Jumlah individu dengan paparan dan tanpa kejadian
\(n_{21}\): Jumlah individu tanpa paparan dan dengan kejadian
\(n_{22}\): Jumlah individu tanpa paparan dan tanpa kejadian
\(n_{1\cdot} = n_{11} + n_{12}\): Total individu dengan paparan
\(n_{2\cdot} = n_{21} + n_{22}\): Total individu tanpa paparan
\(n_{\cdot 1} = n_{11} + n_{21}\): Total individu dengan kejadian
\(n_{\cdot 2} = n_{12} + n_{22}\): Total individu tanpa kejadian
\(n = n_{11} + n_{12} + n_{21} + n_{22}\): Total keseluruhan observasi
Dalam analisis data kategorikal, tabel kontingensi 2 × 2 tidak hanya menyajikan frekuensi pengamatan, tetapi juga dapat digunakan untuk menggambarkan distribusi peluang. Terdapat tiga jenis distribusi peluang yang penting dalam konteks ini, yaitu peluang bersama, peluang marginal, dan peluang bersyarat. Ketiganya memberikan informasi berbeda namun saling melengkapi untuk memahami hubungan antara dua variabel kategori.
Peluang bersama (joint probability) adalah probabilitas terjadinya dua kejadian atau lebih secara bersamaan. Dalam konteks data kategori, peluang ini dihitung dari proporsi kasus yang berada dalam satu sel pada tabel kontingensi dua arah.
Rumus:
\[ P(A_{i}, B_{j}) = \frac{n_{ij}}{n} \]
Peluang marginal adalah probabilitas terjadinya suatu kejadian tunggal tanpa memperhatikan kejadian lainnya. Dalam tabel kontingensi, peluang marginal dihitung dari jumlah total baris atau kolom tertentu dibagi dengan total keseluruhan observasi.
Rumus:
Peluang marginal baris:
\(P(A_{i}) = \frac{n_{i\cdot}}{n}\)
Peluang marginal kolom:
\(\quad P(B_{j}) = \frac{n_{\cdot j}}{n}\)
Peluang bersyarat (conditional probability) adalah probabilitas suatu kejadian terjadi dengan asumsi bahwa kejadian lain sudah terjadi.
Rumus:
\[ P(B_{j} \mid A_{i}) = \frac{P(A_{i},B_{j})}{P(A_{i})} = \frac{n_{ij}}{n_{i \cdot}} \]
Contoh Kasus:
Tabel: Hubungan antara Konsumsi Fast Food dan Obesitas
| Obesitas (+) | Obesitas (-) | Total | |
|---|---|---|---|
| Sering Konsumsi | 300 | 150 | 450 |
| Jarang Konsumsi | 100 | 450 | 550 |
| Total | 400 | 600 | 1000 |
Perhitungan Manual :
Langkah 1: Peluang bersama
Langkah 2: Peluang Marginal
Langkah 3: Peluang Bersyarat
Perhitungan di R:
# Data Observasi Baru
data <- matrix(c(300, 150, 100, 450), nrow = 2, byrow = TRUE)
colnames(data) <- c("Obesitas (+)", "Obesitas (-)")
rownames(data) <- c("Sering Konsumsi", "Jarang Konsumsi")
n <- sum(data)
# Peluang Bersama
P_joint <- data / n
# Peluang Marginal
P_marginal_rows <- rowSums(data) / n
P_marginal_cols <- colSums(data) / n
# Peluang Bersyarat
P_conditional <- data / rowSums(data)
# Hasil
list(
Peluang_Bersama = P_joint,
Peluang_Marginal_Baris = P_marginal_rows,
Peluang_Marginal_Kolom = P_marginal_cols,
Peluang_Bersyarat = P_conditional
)
## $Peluang_Bersama
## Obesitas (+) Obesitas (-)
## Sering Konsumsi 0.3 0.15
## Jarang Konsumsi 0.1 0.45
##
## $Peluang_Marginal_Baris
## Sering Konsumsi Jarang Konsumsi
## 0.45 0.55
##
## $Peluang_Marginal_Kolom
## Obesitas (+) Obesitas (-)
## 0.4 0.6
##
## $Peluang_Bersyarat
## Obesitas (+) Obesitas (-)
## Sering Konsumsi 0.6666667 0.3333333
## Jarang Konsumsi 0.1818182 0.8181818
Interpretasi:
Peluang Bersama menunjukkan probabilitas gabungan dari dua kejadian terjadi bersamaan.
Contoh:
\(P(\text{Sering Konsumsi, Obesitas}) = 0{,}30\) berarti 30% dari seluruh responden adalah orang yang sering mengonsumsi makanan tertentu dan mengalami obesitas
\(P(\text{Jarang Konsumsi, Tidak Obesitas}) = 0{,}45\) berarti 45% responden jarang mengonsumsi dan tidak obesitas.
Peluang Marginal menunjukkan probabilitas dari satu variabel saja, tanpa memperhatikan variabel lainnya.
Contoh:
\(P(\text{Sering Konsumsi}) = 0{,}45\) menunjukkan bahwa 45% responden sering mengonsumsi makanan tersebut, tanpa memperhatikan status obesitasnya.
\(P(\text{Obesitas}) = 0{,}40\) berarti 40% dari seluruh responden mengalami obesitas.
Peluang Bersyarat menggambarkan probabilitas suatu kejadian dengan syarat variabel lain sudah terjadi.
Contoh:
\(P(\text{Obesitas | Sering Konsumsi}) = 0{,}6667\) berarti bahwa di antara orang-orang yang sering mengonsumsi, 66,67% mengalami obesitas.
\(P(\text{Obesitas | Jarang Konsumsi}) = 0{,}1818\) menunjukkan bahwa hanya 18,18% dari yang jarang konsumsi mengalami obesitas.
Karena \(P(\text{Obesitas | Sering Konsumsi}) > P(\text{Obesitas | Jarang Konsumsi})\), ini menunjukkan bahwa orang yang sering mengonsumsi makanan tersebut memiliki risiko lebih tinggi terkena obesitas dibandingkan mereka yang jarang mengonsumsinya.
Tabel kontingensi 2 × 2 membantu dalam menganalisis hubungan antara dua variabel kategori (dalam hal ini, frekuensi konsumsi dan status obesitas).
Ketiga konsep probabilitas ini (bersama, marginal, dan bersyarat) merupakan dasar penting dalam analisis data kategori karena membantu menjelaskan hubungan statistik antar variabel.
Perhitungan manual dan implementasi dalam R mendukung proses analisis yang lebih akurat, sistematis, dan efisien, terutama dalam pengambilan keputusan berbasis data.
Ukuran asosiasi adalah indikator statistik yang digunakan untuk menggambarkan kekuatan dan arah hubungan antara dua variabel kategori, khususnya yang bersifat biner (dikotomis). Dalam konteks tabel kontingensi 2 × 2, ukuran asosiasi memberikan informasi apakah suatu kejadian (kasus) lebih mungkin terjadi pada satu kelompok dibandingkan kelompok lainnya, dan seberapa besar perbedaan tersebut. Ukuran asosiasi memberikan dasar untuk interpretasi efek dalam penelitian survei, klinis, dan sosial yang melibatkan data kategorik.
Ukuran asosiasi dalam tabel 2 × 2 sering digunakan di berbagai bidang:
1. Kesehatan / Epidemiologi
Menilai hubungan antara faktor risiko (paparan) dan penyakit.
Contoh: Apakah perokok lebih berisiko terkena kanker paru-paru dibanding non-perokok?
2. Ilmu Sosial
3. Psikologi
4. Pemasaran
5. Pendidikan
Ukuran asosiasi yang umum digunakan:
Beberapa ukuran asosiasi penting yang dapat dihitung dari tabel kontingensi 2 × 2:
Risk Difference (RD):
Mengukur selisih risiko antara dua kelompok. Cocok untuk melihat dampak mutlak dari suatu perlakuan atau paparan.
Relative Risk (RR):
Mengukur perbandingan risiko relatif antara kelompok terpapar dan tidak terpapar. Sering digunakan dalam studi kohort dan eksperimen klinis.
Odds Ratio (OR):
Membandingkan peluang kejadian antara dua kelompok. Sangat umum digunakan dalam studi kasus-kontrol.
Uji Chi-Square dan Fisher’s Exact Test:
Digunakan untuk menguji apakah hubungan antara dua variabel kategori signifikan secara statistik.
Chi-Square digunakan untuk sampel besar.
Fisher’s Exact Test digunakan untuk sampel kecil atau jika ada sel dengan frekuensi < 5.
Ukuran-ukuran ini sangat penting dalam bidang epidemiologi dan ilmu kesehatan masyarakat untuk menilai pengaruh suatu faktor risiko terhadap outcome tertentu.
Risk Difference (RD) atau Perbedaan Risiko adalah ukuran asosiasi absolut yang digunakan dalam epidemiologi dan penelitian observasional. Ukuran ini menunjukkan selisih risiko terjadinya suatu kejadian (misalnya penyakit, efek samping, atau hasil lainnya) antara dua kelompok, yaitu kelompok yang terpapar (misalnya menerima perlakuan/intervensi) dan kelompok tidak terpapar.
Rumus Risk Difference:
Risk Difference dihitung dengan rumus:
\[ RD = \frac{a}{a + b} - \frac{c}{c + d} \]
atau dalam bentuk notasi tabel kontingensi:
\[RD = \left( \frac{n_{11}}{n_{1.}} \right) - \left( \frac{n_{21}}{n_{2.}} \right)\]
Interpretasi Risk Difference:
Jika RD > 0: Risiko kejadian lebih tinggi pada kelompok terpapar dibandingkan yang tidak terpapar.
Jika RD < 0: Risiko kejadian lebih rendah pada kelompok terpapar (indikasi adanya efek perlindungan).
Jika RD = 0: Tidak ada perbedaan risiko antara dua kelompok.
Contoh kasus:
| Frekuensi Konsumsi | Obesitas (+) | Obesitas (–) | Total |
|---|---|---|---|
| Sering | 60 | 40 | 100 |
| Jarang | 30 | 70 | 100 |
| Total | 90 | 110 | 200 |
Perhitungan Manual:
\[ RD = \frac{60}{100} - \frac{30}{100} = 0.60 - 0.30 = 0.30 \]
Perhitungan R:
# Fungsi untuk menghitung Risk Difference
RD <- function(n11, n12, n21, n22) {
(n11 / (n11 + n12)) - (n21 / (n21 + n22))
}
# Perhitungan RD
RD(60, 40, 30, 70)
## [1] 0.3
Dengan nilai Risk Difference (RD) = 0.3, berikut adalah interpretasi yang bisa diberikan:
Relative Risk (RR) atau Risiko Relatif adalah salah satu ukuran yang sering digunakan dalam bidang epidemiologi untuk membandingkan kemungkinan terjadinya suatu peristiwa (seperti penyakit atau kondisi tertentu) antara dua kelompok, yaitu kelompok yang terpapar dan kelompok yang tidak terpapar.
RR memberikan gambaran tentang seberapa besar kemungkinan suatu kejadian terjadi pada individu yang terpapar dibandingkan dengan mereka yang tidak terpapar. Dengan kata lain, RR menjelaskan apakah paparan terhadap suatu faktor tertentu meningkatkan, menurunkan, atau tidak memengaruhi risiko terhadap kejadian tersebut.
Rumus:
\[ RR = \frac{\frac{a}{a + b}}{\frac{c}{c + d}} \] atau
\[ RR = \frac{\frac{n_{11}}{n_{1.}}}{\frac{n_{21}}{n_{2.}}} \]
• Jika RR > 1, maka kejadian lebih sering terjadi di Grup 1 dibandingkan Grup 2.
• Jika RR < 1, maka kejadian lebih jarang terjadi di Grup 1 dibandingkan Grup 2.
• Jika RR = 1, maka tidak ada perbedaan risiko antara dua kelompok.
Perhitungan Manual:
\[ RR = \frac{60 / 100}{30 / 100} = \frac{0.60}{0.30} = 2 \]
Perhitungan R:
RR <- function(n11, n12, n21, n22) {
(n11 / (n11 + n12)) / (n21 / (n21 + n22))
}
RR(60, 40, 30, 70)
## [1] 2
Interpretasi:
Dengan nilai Relative Risk (RR) = 2, berikut adalah interpretasi yang dapat diberikan:
Odds Ratio (OR) atau Rasio Peluang adalah salah satu ukuran asosiasi yang sering digunakan dalam analisis data kategorik, terutama pada studi kasus-kontrol dan analisis regresi logistik. OR digunakan untuk membandingkan peluang (odds) terjadinya suatu kejadian antara dua kelompok, yaitu kelompok yang terpapar dan kelompok yang tidak terpapar. Dalam konteks ini, “peluang” merujuk pada perbandingan antara kemungkinan suatu kejadian terjadi dan tidak terjadi. Dengan kata lain, Odds Ratio menunjukkan seberapa besar kemungkinan suatu kejadian terjadi pada kelompok terpapar dibandingkan dengan kelompok tidak terpapar, dalam bentuk rasio peluang.
Rumus:
\[ OR = \frac{a \cdot d}{b \cdot c} \]
atau
\[ OR = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}} \]
• Jika OR > 1, maka peluang kejadian lebih besar di Grup 1 dibandingkan Grup 2.
• Jika OR < 1, maka peluang kejadian lebih kecil di Grup 1 dibandingkan Grup 2.
• Jika OR = 1, maka tidak ada perbedaan peluang kejadian antara dua kelompok.
Perhitungan Manual:
\[ OR = \frac{60 \cdot 70}{30 \cdot 40} = \frac{4200}{1200} = 3.5 \]
OR <- function(n11, n12, n21, n22) {
(n11 * n22) / (n12 * n21)
}
OR(60, 40, 30, 70)
## [1] 3.5
Interpretasi:
Dengan nilai Odds Ratio (OR) = 3.5, berikut adalah interpretasi yang dapat diberikan:
| Ukuran Asosiasi | Pengertian | Rumus | Nilai Interpretasi | Studi yang Sesuai |
|---|---|---|---|---|
| Risk Difference (RD) | Selisih risiko kejadian antara kelompok terpapar dan tidak terpapar | \(RD = \frac{a}{a + b} - \frac{c}{c + d}\) | RD = 0 → Tidak ada perbedaan RD > 0 → Risiko meningkat RD < 0 → Risiko menurun | Studi kohort, eksperimen |
| Relative Risk (RR) | Perbandingan risiko kejadian antara kelompok terpapar dan tidak terpapar | \(RR = \frac{a / (a + b)}{c / (c + d)}\) | RR = 1 → Tidak ada asosiasi RR > 1 → Risiko lebih tinggi RR < 1 → Risiko lebih rendah | Studi kohort, eksperimen |
| Odds Ratio (OR) | Perbandingan peluang kejadian antara kelompok terpapar dan tidak terpapar | \(OR = \frac{a \cdot d}{b \cdot c}\) | OR = 1 → Tidak ada asosiasi OR > 1 → Peluang lebih tinggi OR < 1 → Peluang lebih rendah | Studi kasus-kontrol, logistik |
Keterangan:
Inferensi statistik merupakan proses menarik kesimpulan mengenai karakteristik populasi berdasarkan data sampel. Dalam konteks tabel kontingensi dua arah, inferensi digunakan untuk menganalisis hubungan antara dua variabel kategorikal yang disajikan dalam bentuk tabel silang (kontingensi).
Tabel kontingensi sendiri adalah representasi frekuensi pengamatan dari dua variabel kategori dalam format matriks. Tujuan utama inferensi pada tabel ini adalah untuk memahami dan mengevaluasi keterkaitan antara variabel-variabel tersebut melalui dua pendekatan utama, yaitu estimasi dan pengujian hipotesis.
Estimasi pada tabel kontingensi bertujuan untuk memperoleh gambaran tentang proporsi atau peluang terkait kombinasi kategori dari dua variabel. Estimasi ini dapat dilakukan dalam dua bentuk utama:
Estimasi titik adalah nilai tunggal yang digunakan untuk memperkirakan parameter populasi, seperti proporsi atau peluang tertentu dalam tabel kontingensi.
Contoh estimasi titik yang umum dalam tabel 2 × 2:
Proporsi bersama (joint probability): Peluang terjadinya kategori tertentu pada kedua variabel secara bersamaan, misalnya
\[\hat{p}_{11} = \frac{a}{n}\]
di mana \({a}\) adalah frekuensi sel dan \({n}\) total sampel.
Proporsi marginal: Peluang kejadian kategori tertentu pada salah satu variabel tanpa memperhatikan variabel lainnya, misalnya
\[\hat{p}_{1+} = \frac{a + b}{n}\]
Proporsi bersyarat: Peluang kejadian suatu kategori pada variabel pertama dengan kondisi kategori tertentu pada variabel kedua, misalnya
\[\hat{p}_{1|1} = \frac{a}{a + c}\]
Estimasi titik memberikan nilai sederhana untuk menggambarkan data, tetapi tidak menunjukkan seberapa pasti nilai tersebut.
Sebagai contoh, jika terdapat 72 individu dari 120 yang menunjukkan gejala, maka estimasi proporsinya: \[ \hat{p} = \frac{72}{120} = 0.6 \]
x <- 72
n <- 120
p_hat <- x / n
p_hat
## [1] 0.6
Interpretasi: Sekitar 60% responden menunjukkan gejala flu.
Selain estimasi titik, kita juga bisa membentuk estimasi interval (confidence interval) untuk memberi rentang nilai parameter populasi dengan tingkat kepercayaan tertentu, seperti 95%. Rumusnya:
\[ \hat{p} \pm Z_{\alpha/2} \sqrt{\frac{\hat{p}(1 - \hat{p})}{n}} \]
dimana:
\(Z_{\alpha/2}\) adalah nialai dari distribusi nrmal standar untuk tingat kepercayaan tertentu
\(\hat{p}\) adalah estimasi titik proporsi
\({n}\) adalah ukuran sampel
Contoh: Dengan \(\hat{p} = 0.6\), \(n = 120\), dan \(Z_{0.025} = 1.96\), diperoleh:
z_alpha <- qnorm(0.975)
se <- sqrt(p_hat * (1 - p_hat) / n)
ci_lower <- p_hat - z_alpha * se
ci_upper <- p_hat + z_alpha * se
c(ci_lower, ci_upper)
## [1] 0.5123477 0.6876523
Interpretasi:
Artinya, dengan tingkat kepercayaan 95%, kita dapat menyatakan bahwa proporsi sebenarnya dalam populasi berada antara 42,47% hingga 77,53%.
Dengan kata lain, jika proses pengambilan sampel diulang berkali-kali dan setiap kali dihitung interval kepercayaannya dengan cara yang sama, maka sekitar 95% dari interval-interval tersebut akan mencakup nilai proporsi populasi yang sebenarnya.
Setelah dilakukan estimasi, langkah selanjutnya dalam inferensi adalah pengujian hipotesis untuk menentukan apakah terdapat hubungan yang signifikan secara statistik antara dua variabel kategorikal.
Uji hipotesis ini bertujuan untuk mengevaluasi apakah distribusi frekuensi yang kita amati dalam tabel kontingensi dapat dijelaskan oleh kebetulan semata, atau mengindikasikan hubungan yang nyata antar variabel.
Uji proporsi merupakan metode statistik yang digunakan untuk membandingkan proporsi kejadian antara dua kelompok. Uji ini umum diterapkan pada data dalam bentuk tabel kontingensi 2 × 2, terutama ketika ingin mengetahui apakah terdapat perbedaan yang signifikan dalam proporsi suatu peristiwa antara dua kelompok yang berbeda, seperti kelompok terpapar dan tidak terpapar, atau kelompok perlakuan dan kontrol. Uji ini membantu peneliti memahami apakah perbedaan yang terlihat dalam data benar-benar mencerminkan perbedaan dalam populasi, atau hanya terjadi karena variabilitas acak dalam sampel
Strutur tabel kontingensi 2 x 2:
| Kejadian (Ya) | Kejadian (Tidak) | Total | |
|---|---|---|---|
| Terpapar | \[n_{11}\] | \[n_{12}\] | \[n_{1.}\] |
| Tidak Terpapar | \[n_{21}\] | \[n_{22}\] | \[n_{2.}\] |
| Total | \[n_{.1}\] | \[n_{.2}\] | \[n\] |
Formulasi uji proporsi
Untuk mengetahui apakah terdapat perbedaan proporsi antara dua kelompok, dapat dilakukan pengujian menggunakan uji z dua proporsi dengan merumuskan hipotesis sebagai berikut:
\(H_0: p_1 = p_2\)(Tidak ada perbedaan proporsi antara dua kelompok)\(H_1: p_1 \neq p_2\)(Terdapat perbedaan proporsi antara dua kelompok)
Estimasi proporsi dalam masing-masing kelompok diberikan oleh:
\[\hat{p}_{1} = \frac{n_{11}}{n_{1.}},\hat{p}_{1} = \frac{n_{21}}{n_{2.}}\]
Estimasi proporsi gabungan (pooling proportion):
\[\hat{p} = \frac{n_{11}+n_{21}}{n_{1.}+n_{2.}}\]
Statistik uji untuk uji proporsi dua sampel:
\[ Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1 - \hat{p}) \left(\frac{1}{n_1} + \frac{1}{n_2}\right)}} \]
Statistik uji \(Z\) mengikuti distribusi normal standar \(N\)(0,1), dan nilai p-value diperoleh berdasarkan nilai kritis dari distribusi tersebut. Jika nilai absolut dari \(Z\) melebihi nilai kritis pada tingkat signifikansi tertentu (misalnya 1,96 untuk \(\alpha = 0{,}05\), maka hipotesis nol ditolak. Hal ini menunjukkan bahwa terdapat perbedaan yang signifikan antara kedua proporsi. Uji ini sangat sesuai diterapkan dalam studi kohort maupun penelitian klinis.
Perhitungan manual:
Studi Kasus: Hubungan Paparan Zat Kimia dan Kejadian Penyakit Kulit
Sebuah perusahaan kimia ingin mengetahui apakah terdapat hubungan antara paparan zat kimia di tempat kerja dengan kejadian penyakit kulit pada karyawannya.
Sebanyak 200 karyawan diteliti dan dikelompokkan berdasarkan apakah mereka terpapar langsung zat kimia atau tidak. Kemudian, dicatat apakah mereka mengalami penyakit kulit atau tidak.
| Sakit | Tidak Sakit | Total | |
|---|---|---|---|
| Terpapar | \[60\] | \[40\] | \[100\] |
| Tidak Terpapar | \[35\] | \[65\] | \[100\] |
| Total | \[95\] | \[105\] | \[200\] |
Langkah-langkah:
\(\hat{p}_1= \frac{60}{100} = 0.6\)
\(\hat{p}_2= \frac{35}{100} = 0.35\)
\(Z = \frac{0.6 - 0.35}{\sqrt{0.475(1 - 0.475)(\frac{1}{100}+\frac{1}{100})}}\)
\(Z = \frac{0.25}{\sqrt{0.475(0.525) (0.02)}}\)
\(Z = 27.585\)
Karena nilai 4Z = 27{,}585$ jauh lebih besar daripada nilai kritis pada tingkat signifikansi umum α=0,05= 0{,}05α=0,05 (yaitu 1,96 untuk uji dua sisi), maka kita menolak hipotesis nol (H₀).
Artinya, terdapat perbedaan proporsi yang sangat signifikan secara statistik antara dua kelompok yang dibandingkan. Dengan kata lain, perbedaan proporsi kejadian (misalnya, sakit) antara kelompok terpapar dan tidak terpapar sangat kecil kemungkinannya disebabkan oleh kebetulan semata.
Menggunakan R:
# Pastikan variabel data_matrix terdefinisi sebelum digunakan
set.seed(123)
data<- matrix(c(60, 40, 35, 65), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Terpapar" = c("Ya", "Tidak"), "Sakit" = c("Ya", "Tidak"))
print(data)
## Sakit
## Terpapar Ya Tidak
## Ya 60 40
## Tidak 35 65
# 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 = 11.549, df = 1, p-value = 0.0006779
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## 0.1059895 0.3940105
## sample estimates:
## prop 1 prop 2
## 0.60 0.35
Interpretasi:
Karena p-value < 0,05, maka kita menolak hipotesis nol, yang berarti terdapat perbedaan proporsi yang signifikan secara statistik antara kedua kelompok.
Uji asosiasi pada tabel kontingensi 2 × 2 bertujuan untuk menilai apakah terdapat hubungan antara dua variabel kategorikal. Terdapat tiga ukuran utama yang umum digunakan dalam analisis ini:
Risk Difference (RD) – Menunjukkan perbedaan risiko absolut antara dua kelomp
ok.
Relative Risk (RR) – Menggambarkan perbandingan risiko kejadian antara dua kelompok.
Odds Ratio (OR) – Menyatakan perbandingan odds (peluang kejadian relatif terhadap tidak kejadian) antara dua kelompok.
Hipotesis dalam Uji Asosiasi
Untuk masing-masing ukuran asosiasi, pengujian hipotesis dilakukan dengan:
Hipotesis nol (\(H_0\)): Tidak terdapat hubungan atau asosiasi antara kedua variabel.
Hipotesis alternatif (\(H_1\)): Terdapat hubungan atau asosiasi antara kedua variabel.
Risk Difference (RD) menggambarkan selisih probabilitas kejadian antara dua kelompok secara absolut, yaitu seberapa besar perbedaan risiko terjadinya suatu peristiwa pada kelompok yang terpapar dibandingkan dengan yang tidak terpapar.
\[ RD = \frac{n_{11}}{n_{1.}} - \frac{n_{21}}{n_{2.}} \]
Standard Error untuk RD:
\[ SE(RD) = \sqrt{ \frac{ \hat{p}_1 (1 - \hat{p}_1) }{n_{1.}} + \frac{ \hat{p}_2 (1 - \hat{p}_2) }{n_{2.}} } \]
Statistik uji Z:
\[ Z_{RD}=\frac{RD}{SE(RD)} \]
\[ RR = \frac{n_{11}/n_{1.}}{n_{21}/n_{2.}} \]
Standard Error untuk log(RR):
\[ SE(\ln(RR)) = \sqrt{ \frac{1}{n_{11}} + \frac{1}{n_{1.}} + \frac{1}{n_{21}} + \frac{1}{n_{2.}} } \]
Statistik uji Z:
\[ Z_{RR} = \frac{\ln(RR)}{SE(\ln(RR))} \]
\[ OR = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}} \]
Standard Error untuk log(OR):
\[ SE(\ln(OR)) = \sqrt{ \frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}} } \]
Statistik uji Z:
\[ Z_{OR} = \frac{\ln(OR)}{SE(\ln(OR))} \]
Contoh Perhitungan Manual:
Studi Kasus: Hubungan Paparan Zat Kimia dan Kejadian Penyakit Kulit
Sebuah perusahaan kimia ingin mengetahui apakah terdapat hubungan antara paparan zat kimia di tempat kerja dengan kejadian penyakit kulit pada karyawannya.
Sebanyak 200 karyawan diteliti dan dikelompokkan berdasarkan apakah mereka terpapar langsung zat kimia atau tidak. Kemudian, dicatat apakah mereka mengalami penyakit kulit atau tidak.
| Sakit | Tidak Sakit | Total | |
|---|---|---|---|
| Terpapar | 60 | 40 | 100 |
| Tidak Terpapar | 35 | 65 | 100 |
| Total | 95 | 105 | 200 |
Perhitungan Manual untuk RD:
Misalkan
\(\hat{p}_1= \frac{60}{100} = 0.6\)
\(\hat{p}_2= \frac{35}{100} = 0.35\)
Risk Diference:
\[ RD = 0.6 - 0.35 = 0.25 \]
Standard Error:
\[ SE(RD) = \sqrt{\frac{0.6(0.35)}{100}+\frac{0.35(0.6)}{100}} \]
\[ SE(RD) = \sqrt{\frac{0.21}{100}+\frac{0.21}{100}}= \sqrt{0.0021+0.0021} = \sqrt{0.0042} = 0.0648 \]
Statistik uji Z:
\[Z_{RD} = \frac{0.25}{0.0648} = 3.858\]
Perhitungan Manual untuk RR:
$$RR = \frac{\frac{60}{100}}{\frac{35}{100}} =\frac{0.6}{0.35}= 1.71428571$$
Standard Error untuk lnRR:
\[ SE(\ln(RR)) = \sqrt{ \frac{1}{60} - \frac{1}{100} + \frac{1}{35} - \frac{1}{100}} \]
\[SE(\ln(RR)) = \sqrt{ 0.01666 - 0.01 + 0.028571 - 0.01}=0.1470\]
Statistik uji Z:
\[Z_{RR} = \frac{\ln{1.714}}{0.1470}=3.438506\]
Perhitungan Manual untuk OR:
$$
OR = \frac{60\cdot65}{35\cdot40}=\frac{3900}{1400}=2.785714
$$
Standard Error untuk lnOR:
\[ SE(\ln(RR)) = \sqrt{ \frac{1}{60} + \frac{1}{40} + \frac{1}{35} + \frac{1}{65}} \]
\[ SE(\ln(RR)) = \sqrt{ 0.16666 + 0.025 + 0.028571 + 0.01538} =0.2926136 \]
Statistik uji Z:
\[ Z_{OR}=\frac{\ln 2.78}{0.2926136}=3.501219 \]
Perhitungan menggunakan R:
n11 <- 60; n12 <- 35; n21 <- 40; n22 <- 65
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.2506266
##
## $SE_RD
## [1] 0.06852236
##
## $Z_RD
## [1] 3.657588
##
## $RR
## [1] 1.657895
##
## $SE_Ln_RR
## [1] 0.1470256
##
## $Z_RR
## [1] 3.438506
##
## $OR
## [1] 2.785714
##
## $SE_Ln_OR
## [1] 0.2926136
##
## $Z_OR
## [1] 3.501219
Kesimpulan:
Dari hasil analisis data dua kelompok (terpapar dan tidak terpapar) terhadap kejadian sakit, diperoleh:
Risk Difference (RD) = 0.2506, artinya terdapat selisih risiko sebesar 25,06% antara kelompok terpapar dan tidak terpapar. Nilai Z_RD = 3.66, yang melebihi nilai kritis 1.96 pada taraf signifikansi 5%, menunjukkan bahwa selisih ini signifikan secara statistik.
Relative Risk (RR) = 1.6579, artinya risiko sakit pada kelompok terpapar 1,66 kali lebih tinggi dibandingkan kelompok tidak terpapar. Nilai Z_RR = 3.44, yang juga lebih besar dari 1.96, menunjukkan bahwa perbedaan ini signifikan secara statistik.
Odds Ratio (OR) = 2.7857, artinya odds untuk sakit pada kelompok terpapar sekitar 2,79 kali lebih besar daripada pada kelompok tidak terpapar. Nilai Z_OR = 3.50, yang lebih besar dari 1.96, menunjukkan asosiasi yang signifikan antara paparan dan sakit.
Terdapat asosiasi yang signifikan secara statistik antara paparan dan kejadian sakit. Individu yang terpapar memiliki risiko dan peluang yang lebih tinggi untuk mengalami penyakit dibandingkan individu yang tidak terpapar.
Uji independensi merupakan metode statistik yang digunakan untuk menilai apakah dua variabel kategorikal saling berkaitan atau tidak. Dengan kata lain, uji ini membantu menentukan apakah distribusi suatu variabel berbeda secara signifikan tergantung pada kategori dari variabel lainnya. Jika tidak ada hubungan, maka kedua variabel dikatakan independen. Sebaliknya, jika terdapat perbedaan pola distribusi, maka hal ini mengindikasikan adanya asosiasi antara kedua variabel.
Uji Chi-Square digunakan untuk menguji ada tidaknya hubungan atau keterkaitan antara dua variabel yang bersifat kategorikal. Uji ini membantu menentukan apakah perbedaan dalam distribusi frekuensi antar kategori terjadi secara kebetulan atau mencerminkan hubungan yang nyata secara statistik.
Rumus chi-square: \[ \chi^2 = \sum \frac{(O - E)^2}{E} \]
dimana:
\(O\) adalah nilai observasi dalam tabel kontingensi.
\(E\) adalah nilai yang diharapkan, dihitung sebagai:
\[ E_{ij} = \frac{(R_i \times C_j)}{N} \]
dengan
\(R_i\) = total baris ke-\(i\)
\(C_j\) = total klom ke-\(j\)
\(N\) = total sampel
Contoh Perhitungan Manual Chi-Square:
Studi Kasus: Hubungan Paparan Asap Rokok dan Kejadian Asma
Sebuah penelitian dilakukan untuk mengetahui apakah terdapat hubungan antara paparan asap rokok di rumah dan kejadian asma pada anak-anak.
Sebanyak 100 anak diamati, dan hasilnya diklasifikasikan ke dalam dua kategori: terpapar asap rokok dan tidak terpapar. Kemudian dicatat apakah mereka menderita asma atau tidak.
Tabel Kontingensi 2×2
| Asma | Tidak Asma | Total | |
|---|---|---|---|
| Terpapar Asap Rokok | 40 | 10 | 50 |
| Tidak Terpapar | 15 | 35 | 50 |
| Total | 55 | 45 | 100 |
Hitung nilai yan diharapkan \(E\) :
\[ E_{11}= \frac{(50\cdot55)}{100}= 27.5 \]
\[ E_{12}= \frac{(50\cdot45)}{100}=22.5 \]
\[ E_{21}= \frac{(50\cdot55)}{100}= 27.5 \]
\[ E_{22}= \frac{(50\cdot45)}{100}=22.5 \]
Lalu, hitung \(\chi^2\) :
\[\chi^2 = \frac{(40-27.5)^2}{27.5}+\frac{(10-22.5)^2}{22.5}+\frac{(15-27.5)^2}{27.5}+\frac{(35-22.5)^2}{22.5} \]
\[ = \frac{156.25}{27.5}+\frac{156.25}{22.5}+\frac{156.25}{27.5}+\frac{156.25}{22.5} \]
\[ =25.25252525 \]
Dengan derajat kebebasan \((df)\) = (2 − 1)(2 − 1) = 1, kita membandingkan dengan tabel \(\chi^2\), adalah 3.841 dan jika p-value < 0.05, kita menolak hipotesis nol.
Karena nilai statistik uji χ² = 25.25 jauh lebih besar dari nilai kritis 3.841, dan p-value < 0.05, maka Hipotesis nol (H₀) ditolak, yang berarti terdapat hubungan yang signifikan secara statistik antara paparan paparan asap rokok dan asma
Contoh perhitungan menggunakan R:
# Contoh Data
set.seed(123)
data <- matrix(c(40, 10, 15, 35), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Terpapar Asap Rokok" = c("Ya", "Tidak"), "Asma" = c("Ya", "Tidak"))
print(data)
## Asma
## Terpapar Asap Rokok Ya Tidak
## Ya 40 10
## Tidak 15 35
# Uji Chi-Square
chisq_test <- chisq.test(data)
print(chisq_test)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data
## X-squared = 23.273, df = 1, p-value = 1.406e-06
Interpretasi:
Karena p-value < 0.05, maka kita menolak hipotesis nol (H₀) yang menyatakan bahwa tidak ada hubungan antara paparan asap rokok dan kejadian asma.
Artinya: Terdapat hubungan yang signifikan secara statistik antara terpapar asap rokok dan kejadian asma. Orang yang terpapar asap rokok memiliki kecenderungan lebih tinggi mengalami asma dibandingkan dengan yang tidak terpapar.
Partisi Chi-Square merupakan metode yang digunakan untuk mengetahui kategori mana dalam tabel kontingensi yang paling berkontribusi terhadap hubungan yang signifikan. Ketika uji Chi-Square pada tabel kontingensi berukuran \(I \times J\)menunjukkan hasil signifikan, partisi Chi-Square memungkinkan kita untuk menganalisis lebih dalam dengan memecah pengaruh hubungan tersebut ke dalam subkelompok yang lebih kecil.
Menurut Lancaster dan Irwin, nilai statistik Chi-Square dapat diuraikan menjadi sejumlah komponen sesuai dengan derajat bebas dari tabel, sehingga kita dapat mengidentifikasi secara lebih spesifik kategori mana yang berperan besar terhadap asosiasi tersebut.
Fenomena ini berkaitan dengan Paradoks Simpson, di mana pola yang terlihat dalam kelompok-kelompok kecil bisa menghilang atau bahkan berubah arah saat data digabungkan secara keseluruhan.
Langkah-langkah dalam Partisi Chi-Square meliputi:
Menyusun tabel kontingensi berukuran \(I \times J\) dan menghitung nilai Chi-Square total.
Memecah tabel utama menjadi sejumlah tabel \(2\times2\) sebanyak \((I - 1)(J - 1)\) kombinasi.
Menghitung nilai statistik Chi-Square untuk masing-masing tabel \(2 \times 2\) yang terbentuk.
Menafsirkan hasil untuk mengidentifikasi kategori mana yang memberikan kontribusi signifikan terhadap hubungan antar variabel.
Contoh Perhitungan Manual:
Studi Kasus: Hubungan antara Jenis Kelamin dan Preferensi Minuman di Sebuah Kafe
Sebuah kafe di Jakarta ingin mengetahui apakah terdapat perbedaan preferensi minuman berdasarkan jenis kelamin pengunjungnya. Mereka mengklasifikasikan pilihan minuman menjadi tiga kategori utama: Kopi, Teh, dan Minuman Dingin. Data dikumpulkan dari 2.000 pengunjung selama satu minggu, dengan rincian sebagai berikut:
Tabel Preferensi Minuman Berdasarkan Jenis Kelamin
| Jenis Kelamin | Kopi | Teh | Minuman Dingin | Total |
|---|---|---|---|---|
| Perempuan | 420 | 310 | 370 | 1100 |
| Laki-laki | 390 | 250 | 260 | 900 |
| Total | 810 | 560 | 630 | 2000 |
Hipotesis yang diuji adalah:
Hipotesis Nol \((H_0)\): Tidak ada hubungan antara jenis kelamin dan preferensi minuman.
Hipotesis Alternatif \((H_1)\): Ada hubungan antara jenis kelamin dan preferensi minuman.
Langkah-langkah Perhitungan Manual:
\[ E_{ij} = \frac{(n_{i.} \times n{.j})}{n} \]
Kopi, Perempuan:
\[ E_{11} = \frac{1100 \times 810}{2000} = 445.5 \]
Teh, Perempuan:
\[ E_{12} = \frac{1100 \times 560}{2000} = 308 \]
Minuman Dingin, Perempuan:
\[ E_{13} = \frac{1100 \times 630}{2000} = 346.5 \]
Kopi, Laki-laki:
\[ E_{21} = \frac{900 \times 810}{2000} = 364.5 \]
Teh, Laki-laki:
\[ E_{22} = \frac{900 \times 560}{2000} = 252 \]
Minuman Dingin, Laki-laki:
\[ E_{23} = \frac{900 \times 630}{2000} = 283.5 \]
\[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
Untuk Perempuan:
- Kopi:
\[
\chi^2 = \frac{(420 - 445.5)^2}{445.5} = \frac{650.25}{445.5} \approx 1.46
\] - Teh:
\[
\chi^2 = \frac{(310 - 308)^2}{308} = \frac{4}{308} \approx 0.013
\] - Minuman Dingin:
\[
\chi^2 = \frac{(370 - 346.5)^2}{346.5} = \frac{552.25}{346.5} \approx 1.594
\]
Untuk Laki-laki:
\[ \chi^2 \approx 1.46 + 0.013 + 1.594 + 1.784 + 0.0159 + 1.948 = 6.815 \]
\[ (I-1)(J-1)=(2-1)(3-1)=2 \]
Nilai kritis \(\chi^2\) untuk \(\alpha = 0{,}05\) dan \(df = 2\) adalah 5,99. Karena nilai uji \(\chi^2 = 6{,}815 > 5{,}99\), maka:
Keputusan: Tolak hipotesis nol \((H_0)\)
Kesimpulan: Terdapat hubungan yang signifikan antara jenis kelamin dan preferensi minuman.
Perhitungan menggunakan R:
# Data Observasi
data_matrix <- matrix(c(420, 310, 370, 390, 250, 260), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Kopi", "Teh", "Minuman Dingin")
rownames(data_matrix) <- c("Perempuan", "Laki-laki")
# 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", "Gagal Tolak H0")
)
## $Chi_Square
## X-squared
## 6.814173
##
## $P_Value
## [1] 0.0331376
##
## $Decision
## [1] "Tolak H0"
Interpretasi:
Dengan p-value = 0.0331 < 0.05, maka pada taraf signifikansi 5% kita menolak hipotesis nol (H₀).
Artinya, terdapat hubungan yang signifikan antara jenis kelamin dan preferensi minuman. Artinya, pilihan antara kopi, teh, dan minuman dingin dipengaruhi oleh jenis kelamin responden.
Partisi 1: Kopi vs. Teh
| Jenis Kelamin | Kopi | Teh | Total |
|---|---|---|---|
| Perempuan | 420 | 310 | 730 |
| Laki-laki | 390 | 250 | 640 |
| Total | 810 | 560 | 1370 |
Hitung Chi-Square untuk Partisi Ini:
Total Chi-Square:
\[ \chi^2 \approx 0.300 + 0.436 + 0.342 + 0.497 = 1.575 \]
Partisi 2: Kopi + Teh vs. Minuman Dingin
| Jenis Kelamin | Kopi + Teh | Minuman Dingin | Total |
|---|---|---|---|
| Perempuan | 420 + 310 = 730 | 370 | 1100 |
| Laki-laki | 390 + 250 = 640 | 260 | 900 |
| Total | 1370 | 630 | 2000 |
Perempuan, Kopi + Teh:
\(E_{11} = \frac{1100 \times 1370}{2000} = 753.5\)
Perempuan, Minuman Dingin:
\(E_{12} = \frac{1100 \times 630}{2000} = 346.5\)
Laki-laki, Kopi + Teh:
\(E_{21} = \frac{900 \times 1370}{2000} = 616.5\)
Laki-laki, Minuman Dingin:
\(E_{22} = \frac{900 \times 630}{2000} = 283.5\)
Hitung Chi-Square untuk Partisi Ini:
Total Chi-Square:
\[
\chi^2 \approx 0.733 + 1.594 + 0.896 + 1.948 = 5.171
\]
Perhitungan menggnakan R:
# Data Observasi
data_matrix <- matrix(c(420, 310, 390, 250), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Kopi", "Teh")
rownames(data_matrix) <- c("Perempuan", "Laki-laki")
# Uji Chi-Square Partisi 1
chi_test1 <- chisq.test(data_matrix)
# Data Partisi 2
data_matrix2 <- matrix(c(730, 370, 640, 260), nrow = 2, byrow = TRUE)
colnames(data_matrix2) <- c("Kopi+Teh", "Minman Dingin")
rownames(data_matrix2) <- c("Perempuan", "Laki-laki")
# 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 = 1.4965, df = 1, p-value = 0.2212
##
##
## $Chi_Square_Partisi2
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data_matrix2
## X-squared = 4.9528, df = 1, p-value = 0.02605
Interpretasi Hasil Uji Chi-Square Partisi 1: Kopi vs. Teh
Nilai Chi-Square = 1.4965
Derajat Kebebasan (df) = 1
P-Value = 0.2212
Karena nilai p-value (0.2212) lebih besar dari tingkat signifikansi 0.05, kita gagal menolak hipotesis nol (H₀). Artinya, tidak ada bukti yang cukup untuk menyimpulkan adanya hubungan yang signifikan antara jenis kelamin dengan preferensi minuman antara Kopi dan Teh.
Interpretasi Hasil Uji Chi-Square Partisi 2: (Kopi + Teh) vs. Minuman Dingin
Nilai Chi-Square = 4.9528
Derajat Kebebasan (df) = 1
P-Value = 0.02605
Karena nilai p-value (0.02605) lebih kecil dari tingkat signifikansi 0.05, kita menolak hipotesis nol (H₀). Artinya, terdapat hubungan yang signifikan antara jenis kelamin dengan preferensi minuman ketika dibandingkan antara gabungan Kopi dan Teh dengan Minuman Dingin.
Kesimpulan Umum:
Untuk perbandingan langsung antara Kopi dan Teh, tidak ada hubungan signifikan dengan jenis kelamin. Namun, ketika Kopi dan Teh digabung dan dibandingkan dengan Minuman Dingin, hubungan signifikan ditemukan. Ini menunjukkan jenis kelamin mempengaruhi preferensi terhadap minuman panas (Kopi + Teh) versus minuman dingin.
Uji Likelihood Ratio (G²) merupakan alternatif dari uji Chi-Square yang digunakan untuk menguji hipotesis independensi antara dua variabel dalam tabel kontingensi berukuran \(I \times J\) Statistik uji ini dirumuskan sebagai berikut:
\[ G^2 = 2 \sum_i \sum_j n_{ij} \ln \left( \frac{n_{ij}}{\hat{\mu}_{ij}} \right) \]
dimana:
\(n_{ij}\) adalah frekuensi observasi dalam tabel kontingensi.
\(\hat{\mu}_{ij}=n.p_{i+}p_{+j}\) adalah frekuensi ekspektasi.
Statistik \(G^2\) mengikuti distribusi chi-square \((\chi^2)\) dengan derajat bebas \((I-1)(J-1)\).
Tolak \(H_0\) jika \(G^2\) \(\geq \chi^2_{(1 - \alpha/2); (I - 1)(J - 1))}\).
Contoh Perhitungan Manual Uji Chi-Square (G²)
Misalkan kita menggunakan data kanker paru-paru berikut:
| Cancer (+) | Control (-) | Total | |
|---|---|---|---|
| Smoker | 688 | 650 | 1338 |
| Non-Smoker | 21 | 59 | 80 |
| Total | 709 | 709 | 1418 |
Langkah 1: Hitung Frekuensi Ekspektasi
Langkah 2: Hitung Statistik Uji G²
Menggunakan rumus:
\[ G^2 = 2 \sum_{i,j} O_{ij} \cdot \ln \left( \dfrac{O_{ij}}{E_{ij}} \right) \]
Dihitung secara manual:
\[ G^2 = 2 \left[ 688 \ln \left( \dfrac{688}{669} \right) + 650 \ln \left( \dfrac{650}{669} \right) + 21 \ln \left( \dfrac{21}{40} \right) + 59 \ln \left( \dfrac{59}{40} \right) \right] \]
\[ G^2 = 2 \times (19.27 - 18.73 - 13.53 + 22.93) = 2 \times 9.94 = 19.88 \]
Langkah 3: Bandingkan dengan Distribusi Chi-Square
Keputusan:
Karena \(G^2 = 19.88 > 3.841\), maka tolak \(H_0\).
Kesimpulan:
Dengan taraf signifikansi 5%, terdapat bukti yang signifikan bahwa ada hubungan antara status merokok dan kejadian kanker paru-paru.
Perhitungan Menggunakan R
# Data Observasi
data_matrix <- matrix(c(688, 650, 21, 59), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Cancer (+)", "Control (-)")
rownames(data_matrix) <- c("Smoker", "Non-Smoker")
# Hitung Frekuensi Ekspektasi
data_expected <- chisq.test(data_matrix)$expected
# Hitung Statistik G²
G2 <- 2 * sum(data_matrix * log(data_matrix / data_expected))
# Nilai kritis chi-square untuk df = 1 dan alpha = 0.05
critical_value <- qchisq(0.95, df = 1)
# Pengambilan keputusan
Decision <- ifelse(G2 > critical_value, "Reject H0", "Fail to Reject H0")
# Hasil
list(
Observed = data_matrix,
Expected = round(data_expected, 2),
G2 = round(G2, 3),
Critical_Value = round(critical_value, 3),
Decision = Decision
)
## $Observed
## Cancer (+) Control (-)
## Smoker 688 650
## Non-Smoker 21 59
##
## $Expected
## Cancer (+) Control (-)
## Smoker 669 669
## Non-Smoker 40 40
##
## $G2
## [1] 19.878
##
## $Critical_Value
## [1] 3.841
##
## $Decision
## [1] "Reject H0"
Kesimpulan Uji G² (Likelihood Ratio Test)
Berdasarkan hasil perhitungan statistik G²:
Nilai statistik G² = 19.878
Nilai kritis chi-square (α = 0.05, df = 1) = 3.841
Keputusan: Tolak H₀
Interpretasi:
Dengan taraf signifikansi 5%, terdapat cukup bukti untuk menolak hipotesis nol. Artinya, ada hubungan yang signifikan antara kebiasaan merokok dan kejadian kanker paru-paru. Dengan kata lain, status sebagai perokok berpengaruh terhadap kemungkinan menderita kanker paru-paru.
Uji Likelihood Ratio (G²) digunakan sebagai alternatif dari uji Chi-Square untuk menguji independensi dalam tabel kontingensi. Jika \(G^2\) lebih besar dari nilai kritis \(\chi^2\), maka hipotesis nol ditolak, menunjukkan adanya hubungan antara dua variabel. Contoh perhitungan manual dan implementasi di R menunjukkan bahwa ada asosiasi signifkan antara merokok dan kanker paru-paru.
Uji Fisher’s Exact adalah salah satu metode statistik yang digunakan untuk menguji adanya hubungan atau ketergantungan antara dua variabel kategorik dalam tabel kontingensi, khususnya ketika ukuran sampel sangat kecil sehingga syarat atau asumsi uji Chi-square tidak terpenuhi. Dalam situasi di mana jumlah observasi atau frekuensi di dalam tabel terlalu rendah, penggunaan uji Chi-square bisa memberikan hasil yang tidak akurat karena mengandalkan pendekatan distribusi normal. Untuk itulah uji Fisher menjadi solusi alternatif yang lebih tepat.
Metode ini pertama kali diperkenalkan oleh Sir Ronald A. Fisher, seorang tokoh penting dalam dunia statistik, dan awalnya banyak digunakan dalam bidang penelitian biologi dan kedokteran. Seiring waktu, penggunaannya meluas ke berbagai bidang lain yang melibatkan data kategorik, terutama ketika analisis dilakukan pada tabel kontingensi kecil, seperti tabel 2×2.
Keunggulan Uji Fisher’s Exact:
Ideal digunakan saat ukuran sampel kecil dan tidak memenuhi syarat minimal frekuensi untuk uji Chi-square.
Tidak memerlukan asumsi distribusi normal atau uji prasyarat lainnya, sehingga lebih fleksibel dalam berbagai kondisi data.
Hasil pengujian cenderung lebih akurat dan valid, terutama ketika frekuensi beberapa sel dalam tabel sangat rendah (kurang dari 5).
Keterbatasan Uji Fisher’s Exact:
Proses perhitungan dapat menjadi sangat kompleks secara komputasi jika tabel yang digunakan besar atau memiliki banyak kategori.
Penggunaannya umumnya terbatas hanya pada tabel kontingensi kecil, seperti 2×2 atau dalam beberapa kasus tertentu 3×3, karena semakin banyak kategori maka semakin rumit perhitungan probabilitasnya.
Dengan demikian, uji Fisher merupakan pilihan yang sangat tepat ketika data terbatas, namun tetap ingin dilakukan pengujian hubungan antara dua variabel kategorik secara valid dan andal.
Distribusi Hipergeometrik merupakan distribusi probabilitas yang menggambarkan peluang untuk memperoleh sebanyak \(x\) bola putih dalam suatu proses pengambilan acak tanpa pengembalian dari total \(N\) bola, yang terdiri atas KKK bola putih dan \(N - K\) bola hitam. Distribusi ini digunakan ketika setiap elemen yang diambil tidak dikembalikan ke populasi, sehingga peluang berubah di setiap pengambilan berikutnya.
\[ P(X = x) = \frac{\binom{K}{x} \binom{N-K}{n - x}}{\binom{N}{n}} \]
dengan: • \(N\) = total objek dalam populasi • \(K\) = jumlah objek dalam kategori tertentu (misalnya, sukses) • \(n\) = jumlah sampel yang diambil • \(x\) = jumlah objek dalam kategori tertentu yang diamati dalam sampel
Contoh perhitungan:
Misalkan kita memiliki contoh berikut:
• \(N\) = 40 (total populasi) • \(K\) = 29 (jumlah bola putih dalam populasi) • \(n\) = 20 (jumlah sampel yang diambil) • \(x\) = 18 (jumlah bola putih dalam sampel)
Menggunakan rumus di atas:
\[ P(X = 18) = \frac{\binom{29}{18} \cdot \binom{40-29}{20-18}}{\binom{40}{20}} \]
Dalam R, perhitungan ini dapat dilakukan dengan:
# Definisi parameter
N <- 40 # Total populasi
K <- 29 # Jumlah kategori sukses (bola putih)
n <- 20 # Jumlah sampel diambil
x <- 18 # Jumlah sukses dalam sampel
# Hitung probabilitas P(X = 18)
dhyper(x, m = K, n = N - K, k = n)
## [1] 0.01380413
Misalkan kita memiliki data berikut:
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 18 | 2 | 20 |
| Grup B | 11 | 9 | 20 |
| Total | 29 | 11 | 40 |
Langkah perhitungan manual:
choose(29, 18) * choose(11, 2) / choose(40, 20)
## [1] 0.01380413
Berikut semua kombinasi tabel 2 x 2 yang mungkin dengan total bari dan total kolom sama:
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 20 | 0 | 20 |
| Grup B | 9 | 11 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 20) * choose(11, 0) / choose(40, 20)
## [1] 7.26533e-05
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 19 | 1 | 20 |
| Grup B | 10 | 10 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 19) * choose(11, 1) / choose(40, 20)
## [1] 0.001598373
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 18 | 2 | 20 |
| Grup B | 11 | 9 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 18) * choose(11, 2) / choose(40, 20)
## [1] 0.01380413
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 17 | 3 | 20 |
| Grup B | 11 | 9 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 17) * choose(11, 3) / choose(40, 20)
## [1] 0.06211857
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 16 | 4 | 20 |
| Grup B | 13 | 7 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 16) * choose(11, 4) / choose(40, 20)
## [1] 0.162464
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 15 | 5 | 20 |
| Grup B | 14 | 6 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 15) * choose(11, 5) / choose(40, 20)
## [1] 0.2599423
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 14 | 6 | 20 |
| Grup B | 15 | 5 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 14) * choose(11, 6) / choose(40, 20)
## [1] 0.2599423
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 13 | 7 | 20 |
| Grup B | 16 | 4 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 13) * choose(11, 7) / choose(40, 20)
## [1] 0.162464
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 12 | 8 | 20 |
| Grup B | 17 | 3 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 12) * choose(11, 8) / choose(40, 20)
## [1] 0.06211857
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 11 | 9 | 20 |
| Grup B | 18 | 2 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 11) * choose(11, 9) / choose(40, 20)
## [1] 0.01380413
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 10 | 10 | 20 |
| Grup B | 19 | 1 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 10) * choose(11, 10) / choose(40, 20)
## [1] 0.001598373
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 9 | 11 | 20 |
| Grup B | 20 | 0 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 9) * choose(11, 11) / choose(40, 20)
## [1] 7.26533e-05
p-value untuk uji Exact Fisher adalah kumulatif nilai p-value untuk setiap tabel yang lebih kecil sama dengan nilai p-value tabel empiris
| Ya | Tidak | Total | |
|---|---|---|---|
| Grup A | 18 | 2 | 20 |
| Grup B | 11 | 9 | 20 |
| Total | 29 | 11 | 40 |
choose(29, 18) * choose(11, 2) / choose(40, 20)
## [1] 0.01380413
yaitu
p.value<-0.00007+0.00160+0.01380+0.01380+0.00160+0.00007
p.value
## [1] 0.03094
Menggunakan fisher.test() di R:
data <- matrix(c(18, 2, 11, 9), nrow = 2, byrow = TRUE)
fisher.test(data)
##
## Fisher's Exact Test for Count Data
##
## data: data
## p-value = 0.03095
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.147793 78.183838
## sample estimates:
## odds ratio
## 6.994073
Hasilnya akan memberikan nilai p untuk menentukan apakah ada hubungan signifkan antara kedua variabel. Interpretasi Hasil • Jika p-value < 0.05, kita menolak hipotesis nol, yang berarti ada hubungan signifkan antara dua variabel. • Jika p-value >= 0.05, kita gagal menolak hipotesis nol, yang berarti tidak ada cukup bukti untuk menyatakan adanya hubungan signifkan.
Kesimpulan:
Tabel ini menyajikan ringkasan berbagai jenis uji statistik yang digunakan untuk menganalisis hubungan antar variabel kategori, serta bagaimana implementasinya dilakukan di R dan secara manual. Berikut adalah ikhtisar tujuan dan output dari masing-masing uji:
| Jenis Uji / Ukuran | Tujuan | Output yang Dihasilkan |
|---|---|---|
| Uji Proporsi | Menguji apakah proporsi suatu kejadian berbeda secara signifikan antara dua kelompok. | p-value (menunjukkan signifikansi perbedaan proporsi) |
| Risk Difference (RD) | Mengukur selisih absolut risiko antara dua kelompok. | Nilai selisih risiko |
| Relative Risk (RR) | Menyatakan seberapa besar risiko di satu kelompok dibandingkan dengan kelompok lain. | Rasio risiko relatif |
| Odds Ratio (OR) | Menilai peluang suatu kejadian antara dua kelompok. | Rasio odds |
| Uji Chi-Square | Menguji ada tidaknya hubungan antara dua variabel kategori. | p-value (menunjukkan signifikansi asosiasi) |
| Uji Fisher’s Exact | Menguji asosiasi antar variabel dalam tabel kecil, khususnya ketika frekuensi rendah. | p-value (menunjukkan signifikansi hubungan) |
Secara keseluruhan, materi ini memberikan pemahaman menyeluruh tentang perbedaan konsep, metode perhitungan, dan interpretasi hasil dari berbagai pendekatan statistik yang umum digunakan dalam analisis data kategorikal.
Residual dalam konteks tabel kontingensi memiliki peran penting dalam mengidentifikasi kontribusi masing-masing sel terhadap adanya hubungan antara dua variabel kategorikal. Secara umum, residual merepresentasikan selisih antara frekuensi yang diamati (observed) dan frekuensi yang diharapkan (expected) yang dihitung berdasarkan asumsi tidak adanya hubungan atau independensi antar variabel.
Jika nilai residual suatu sel besar—baik bernilai positif maupun negatif—ini menunjukkan bahwa terdapat perbedaan yang cukup mencolok antara nilai aktual yang teramati dan nilai yang diprediksi oleh model independen. Artinya, sel tersebut memberikan kontribusi yang signifikan terhadap hasil uji chi-square dan dapat menjadi indikasi adanya pola atau hubungan yang tidak acak.
Sebaliknya, apabila residual suatu sel kecil, hal ini menunjukkan bahwa frekuensi pengamatan hampir sama dengan yang diharapkan. Dalam hal ini, sel tersebut tidak berkontribusi besar terhadap statistik uji, sehingga dapat diasumsikan mendekati kondisi independensi.
Dengan demikian, analisis residual penting dilakukan setelah uji chi-square untuk mengetahui secara lebih rinci sumber ketidaksesuaian dalam data. Menurut Agresti (2013), evaluasi residual menjadi salah satu langkah penting untuk memahami struktur hubungan antar kategori dalam data kategorikal.
Interpretasi Nilai Residual:
Residual mendekati nol (≈ 0):
Menunjukkan bahwa nilai pengamatan (observasi) tidak berbeda secara signifikan dari nilai ekspektasi.
Ini berarti tidak terdapat hubungan yang berarti antara kategori dalam baris dan kolom tabel, sehingga data dianggap mendukung asumsi independensi.
Residual positif besar:
Mengindikasikan bahwa jumlah observasi dalam suatu sel jauh lebih besar daripada yang diharapkan.
Hal ini menunjukkan adanya asosiasi positif yang kuat antara kategori dalam baris dan kolom tersebut.
Residual negatif besar:
Menunjukkan bahwa frekuensi observasi jauh lebih kecil dibandingkan dengan nilai yang diharapkan.
Hal ini mengarah pada hubungan negatif atau bahkan ketiadaan hubungan antara kategori tersebut.
Kesimpulan Umum:
Residual kecil (mendekati nol): Tidak ada pola hubungan yang mencolok, mendukung hipotesis bahwa variabel-variabel tersebut saling independen.
Residual besar (baik positif maupun negatif): Menunjukkan bahwa variabel baris dan kolom dalam tabel kontingensi memiliki hubungan yang signifikan secara statistik.
Analisis residual ini memberikan wawasan yang lebih mendalam setelah melakukan uji Chi-Square, karena ia menunjukkan di sel mana tepatnya ketidaksesuaian atau keterkaitan yang paling kuat terjadi.
Pearson residual mengukur perbedaan antara nilai observasi dan nilai yang diharapkan, dinormalisasi oleh akar dari ekspektasinya:
\(e_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}}\)
di mana:
\(O_{ij}\): frekuensi yang diamati pada sel baris ke-i, kolom ke-j
\(E_{ij}\): nilai ekspektasi pada sel ke-\(i,j\)
Standardized Residual (Adjusted Residual):
Standardized residual memperhitungkan variasi tambahan dengan memasukkan probabilitas marginal baris dan kolom:
\(r_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}(1 - p_{i+})(1 - p_{+j})}}\)
di mana:
\(p_{i+}\): probabilitas marginal untuk baris ke-i
\(p_{+j}\): probabilitas marginal untuk kolom ke-j
Residual ini berguna untuk mengidentifikasi sel yang menyimpang secara signifikan dari ekspektasi. Residual besar (baik positif maupun negatif) menunjukkan penyimpangan kuat dari model independensi dan kemungkinan besar menyumbang terhadap asosiasi antara dua variabel.
Contoh perhitungan Residual secara manual:
| Kategori A | Kategori B | Total | |
|---|---|---|---|
| Grup 1 | 20 | 10 | 30 |
| Grup 2 | 30 | 20 | 50 |
| Total | 50 | 30 | 80 |
Langkah-langkah perhitungan:
\[ e = \frac{(\text{Total Baris}) \times (\text{Total Kolom})}{\text{Total Keseluruhan}} \]
\[ e_{ij} = \frac{o_{ij} - e_{ij}}{\sqrt{e_{ij}}} \]
dengan
# Data Observasi
observed <- matrix(c(20, 10, 30, 20), nrow = 2, byrow = TRUE)
# Hitung nilai ekspektasi menggunakan chisq.test
expected <- chisq.test(observed)$expected
# Hitung Pearson Residual
pearson_residual <- (observed - expected) / sqrt(expected)
# Hitung 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) %*% t(1 - col_sum / total_sum))
# Menampilkan hasil
list(
Pearson_Residual = pearson_residual,
Standardized_Residual = standardized_residual
)
## $Pearson_Residual
## [,1] [,2]
## [1,] 0.2886751 -0.3726780
## [2,] -0.2236068 0.2886751
##
## $Standardized_Residual
## [,1] [,2]
## [1,] 0.5962848 -0.5962848
## [2,] -0.5962848 0.5962848
Dalam analisis data kategori, outlier mengacu pada sel atau kombinasi kategori dalam tabel kontingensi yang memiliki penyimpangan signifikan dari nilai yang diharapkan menurut model. Untuk mendeteksi outlier, salah satu pendekatan yang umum digunakan adalah dengan menganalisis residual, yaitu selisih antara nilai observasi dan ekspektasi berdasarkan model log-linear atau model independensi.6.3.2.1 Apa yang Dimaksud dengan Outlier dalam Tabel Kontingensi?
Dalam konteks analisis data kategorikal, outlier merujuk pada sel dalam tabel kontingensi yang memiliki nilai residual sangat tinggi, baik dalam arah positif maupun negatif. Sel-sel ini menunjukkan adanya kategori dengan frekuensi observasi yang secara signifikan berbeda dari frekuensi yang diharapkan menurut asumsi bahwa variabel-variabel bersifat independen.
Pearson Residual:
\(e_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}}\)
Jika nilai \(|e_{ij}|\) > 2, maka sel tersebut dianggap sebagai indikasi adanya outlier.
Standardized Residual (Adjusted Residual):
\(r_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}(1 - p_{i+})(1 - p_{+j})}}\)
Jika \(|r_{ij}|\) > 3, maka sel tersebut dianggap sebagai outlier signifkan.
Tabel Kontingensi
| Sukses | Gagal | Total | |
|---|---|---|---|
| Grup A | 50 | 20 | 70 |
| Grup B | 30 | 50 | 80 |
| Total | 80 | 70 | 150 |
Residual yang Dihitung
| Sel | Pearson Residual | Standardized Residual |
|---|---|---|
| Grup A, Sukses | 2.06 | 2.45 |
| Grup A, Gagal | -2.20 | -2.60 |
| Grup B, Sukses | -1.96 | -2.10 |
| Grup B, Gagal | 2.06 | 2.45 |
# Data Observasi
observed <- matrix(c(50, 20, 30, 50), 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)
# Rumus standardized residual dengan perkalian matriks (sesuai formula)
standardized_residual <- (observed - expected) / sqrt(expected *
(1 - matrix(row_sum / total_sum, nrow=2, ncol=2)) *
(1 - matrix(col_sum / total_sum, nrow=2, ncol=2, byrow=TRUE)))
# Menampilkan hasil
list(
Observed = observed,
Expected = expected,
Pearson_Residual = pearson_residual,
Standardized_Residual = standardized_residual
)
## $Observed
## Sukses Gagal
## Grup A 50 20
## Grup B 30 50
##
## $Expected
## Sukses Gagal
## Grup A 37.33333 32.66667
## Grup B 42.66667 37.33333
##
## $Pearson_Residual
## Sukses Gagal
## Grup A 2.073070 -2.216205
## Grup B -1.939179 2.073070
##
## $Standardized_Residual
## Sukses Gagal
## Grup A 4.155384 -4.155384
## Grup B -4.155384 4.155384
Analisis Residual dalam Tabel Kontingensi
Deteksi outlier menggunakan residual membantu mengidentifikasi kategori dalam tabel kontingensi yang sangat menyimpang dari ekspektasi.
Jika |r| > 3, maka sel tersebut dapat dianggap sebagai outlier signifikan yang mungkin mempengaruhi kesimpulan analisis.
Residual besar menunjukkan hubungan signifikan antara variabel, sedangkan residual mendekati nol menunjukkan tidak adanya hubungan.
Analisis residual dalam tabel kontingensi membantu memahami kontribusi masing-masing sel terhadap hubungan antara variabel kategori. Pearson residual digunakan untuk melihat seberapa jauh nilai observasi menyimpang dari ekspektasi, sementara standardized residual mempertimbangkan efek margin baris dan kolom untuk menghindari bias dalam interpretasi.
Hubungan antara Merokok dan Penyakit Kanker Paru
Latar Belakang
Seorang peneliti ingin mengetahui apakah ada hubungan antara kebiasaan merokok dan kejadian kanker paru-paru. Data yang diperoleh dari sebuah penelitian medis ditampilkan dalam tabel kontingensi berikut:
| Kanker Paru (+) | Kanker Paru (-) | Total | |
|---|---|---|---|
| Perokok | 450 | 200 | 650 |
| Bukan Perokok | 50 | 300 | 350 |
| Total | 500 | 500 | 1000 |
1. Hitung frekuensi ekspektasi untuk masing-masing sel berdasarkan asumsi independensi. 2. Hitung Pearson Residual dan Standardized Residual untuk setiap sel. 3. Interpretasikan hasil residual yang diperoleh. 4. Tentukan apakah ada kategori yang bisa dianggap sebagai outlier dalam hubungan antara merokok dan kanker paru-paru.
# Data Observasi
observed <- matrix(c(450, 200, 50, 300), nrow = 2, byrow = TRUE)
colnames(observed) <- c("Kanker Paru (+)", "Kanker Paru (-)")
rownames(observed) <- c("Perokok", "Bukan Perokok")
# 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)
# Menghitung Standardized Residual untuk masing-masing sel
standardized_residual <- matrix(0, nrow = 2, ncol = 2)
for (i in 1:2) {
for (j in 1:2) {
standardized_residual[i, j] <- (observed[i, j] - expected[i, j]) /
sqrt(expected[i, j] * (1 - row_sum[i]/total_sum) * (1 - col_sum[j]/total_sum))
}
}
colnames(standardized_residual) <- colnames(observed)
rownames(standardized_residual) <- rownames(observed)
# Menampilkan hasil
list(
Observed = observed,
Expected = round(expected, 2),
Pearson_Residual = round(pearson_residual, 3),
Standardized_Residual = round(standardized_residual, 3)
)
## $Observed
## Kanker Paru (+) Kanker Paru (-)
## Perokok 450 200
## Bukan Perokok 50 300
##
## $Expected
## Kanker Paru (+) Kanker Paru (-)
## Perokok 325 325
## Bukan Perokok 175 175
##
## $Pearson_Residual
## Kanker Paru (+) Kanker Paru (-)
## Perokok 6.934 -6.934
## Bukan Perokok -9.449 9.449
##
## $Standardized_Residual
## Kanker Paru (+) Kanker Paru (-)
## Perokok 16.575 -16.575
## Bukan Perokok -16.575 16.575
1. Frekuensi Ekspektasi (Expected Frequency)
Jika tidak ada hubungan antara merokok dan kanker paru-paru (asumsi independensi), maka jumlah kasus kanker yang diharapkan untuk perokok adalah 325 orang, namun pada data aktual ditemukan 450 orang. Sebaliknya, pada bukan perokok hanya diharapkan 175 kasus kanker, namun hanya terjadi 50 kasus saja.
2. Pearson Residual
Nilai residual yang besar (positif/negatif) menunjukkan penyimpangan antara data aktual dan ekspektasi.
Residual terbesar muncul pada sel:
3. Standardized Residual
Digunakan untuk mendeteksi outlier statistik.
Nilai residual di atas ±2 menunjukkan sel yang signifikan berbeda dari ekspektasi.
Semua sel memiliki nilai residual di atas ±16, artinya:
Semua sel secara sangat signifikan berbeda dari nilai yang diharapkan.
Terutama pada sel “Bukan Perokok, Kanker (+)”, residual −16.575 menunjukkan nilai observasi jauh lebih kecil dari yang diharapkan.
Kesimpulan Akhir
Terdapat bukti yang sangat kuat bahwa terdapat hubungan signifikan antara kebiasaan merokok dan kejadian kanker paru-paru.
Beberapa kategori, terutama:
Perokok dengan Kanker (+) dan
Bukan Perokok dengan Kanker (+)
menunjukkan penyimpangan ekstrem dari ekspektasi dan dapat dianggap sebagai outlier dalam konteks independensi.
Dengan demikian, hipotesis nol yang menyatakan tidak ada hubungan antara merokok dan kanker paru-paru dapat ditolak.
Bab ini mengulas secara komprehensif tentang analisis tabel kontingensi tiga arah, mencakup pembahasan mengenai tabel marginal dan parsial, ukuran asosiasi, paradoks Simpson, independensi bersyarat, serta asosiasi yang bersifat homogen. Setiap topik disertai dengan contoh perhitungan manual dan penerapannya menggunakan perangkat lunak R. Tabel kontingensi tiga arah merupakan pengembangan dari tabel dua arah yang dirancang untuk mengevaluasi hubungan antara tiga variabel kategori secara bersamaan. Dalam praktiknya, keterkaitan antara dua variabel (misalnya variabel X dan Y) sering kali dipengaruhi oleh variabel ketiga (Z), yang dikenal sebagai variabel pengendali atau kovariat. Pendekatan ini umum digunakan ketika analisis perlu memperhitungkan kemungkinan adanya variabel perancu yang dapat memengaruhi keterkaitan antarvariabel utama.
Contoh penerapan:
- Dalam studi epidemiologi: hubungan antara merokok (X) dan kanker paru-paru (Y), dikontrol berdasarkan kelompok usia (Z).
- Dalam studi sosial: hubungan antara ras tersangka (X) dan hukuman mati (Y), dengan mempertimbangkan ras korban (Z).
Tabel ini dapat dianalisis melalui:
- Tabel Parsial: menunjukkan hubungan antara X dan Y pada setiap level variabel Z. Ini memungkinkan kita melihat asosiasi bersyarat.
- Tabel Marginal: dihasilkan dengan menjumlahkan seluruh kategori dari Z, sehingga memberikan gambaran agregat antara X dan Y tanpa mempertimbangkan efek Z. Namun, ini berisiko menyebabkan bias atau distorsi interpretasi, seperti dalam Simpson’s Paradox. Meskipun tabel marginal berguna untuk melihat pola umum, analisis berdasarkan tabel parsial seringkali lebih dapat diandalkan karena mempertimbangkan pengaruh kovariat secara eksplisit, yang penting dalam pengambilan kesimpulan ilmiah yang akurat.
Tabel kontingensi tiga arah digunakan untuk menganalisis hubungan antara tiga variabel kategorik. Analisis ini dapat mengungkap pola yang tidak terlihat dalam tabel dua arah biasa, serta memungkinkan deteksi interaksi antar variabel.
Tabel parsial digunakan untuk mengamati hubungan antara dua variabel dengan mengelompokkan data berdasarkan kategori dari variabel ketiga. Sebaliknya, tabel marginal diperoleh dengan mengabaikan variabel ketiga, yaitu dengan menjumlahkan data dari seluruh level variabel tersebut. Pendekatan ini penting karena dalam banyak kasus, hubungan antara dua variabel dapat tampak berbeda saat variabel ketiga dikendalikan atau diabaikan.
Berikut ini adalah representasi umum dari tabel kontingensi tiga arah, dengan variabel \(X\), \(Y\), dan \(Z\):
\[ \begin{array}{c|cccc|c} Z = 1 & Y=1 & Y=2 & \cdots & Y=J & Y=\cdot \\ \hline X=1 & n_{111} & n_{121} & \cdots & n_{1J1} & n_{1+1} \\ X=2 & n_{211} & n_{221} & \cdots & n_{2J1} & n_{2+1} \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ X=i & n_{i11} & n_{i21} & \cdots & n_{iJ1} & n_{i+1} \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ X=I & n_{I11} & n_{I21} & \cdots & n_{IJ1} & n_{I+1} \\ \hline & n_{+11} & n_{+21} & \cdots & n_{+J1} & n_{++1} \\ \end{array} \]
\[ \vdots \]
\[ \begin{array}{c|cccc|c} Z = K & Y=1 & Y=2 & \cdots & Y=J & Y=\cdot \\ \hline X=1 & n_{11K} & n_{12K} & \cdots & n_{1JK} & n_{1+K} \\ X=2 & n_{21K} & n_{22K} & \cdots & n_{2JK} & n_{2+K} \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ X=I & n_{I1K} & n_{I2K} & \cdots & n_{IJK} & n_{I+K} \\ \hline & n_{+1K} & n_{+2K} & \cdots & n_{+JK} & n_{++K} \\ \end{array} \]
\[ \begin{array}{c|cccc|c} Z=\cdot & Y=1 & Y=2 & \cdots & Y=J & Y=\cdot \\ \hline X=1 & n_{11+} & n_{12+} & \cdots & n_{1J+} & n_{1++} \\ X=2 & n_{21+} & n_{22+} & \cdots & n_{2J+} & n_{2++} \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ X=I & n_{I1+} & n_{I2+} & \cdots & n_{IJ+} & n_{I++} \\ \hline & n_{+1+} & n_{+2+} & \cdots & n_{+J+} & n_{+++} \\ \end{array} \]
Contoh data:
Tabel berikut menggambarkan hubungan antara kelompok usia (Usia), status merokok (Merokok), dan kejadian kanker paru-paru (KankerParu) berdasarkan observasi sejumlah individu.
| Usia | Merokok | Kanker Paru | Tidak Kanker | Total |
|---|---|---|---|---|
| Muda | Ya | 12 | 28 | 40 |
| Muda | Tidak | 4 | 36 | 40 |
| Dewasa | Ya | 35 | 15 | 50 |
| Dewasa | Tidak | 12 | 38 | 50 |
| Lansia | Ya | 45 | 5 | 50 |
| Lansia | Tidak | 18 | 32 | 50 |
Tabel frekuensi parsial menyajikan hubungan antara dua variabel (contohnya Merokok dan KankerParu) pada setiap kategori variabel kontrol (Usia). Analisis ini berguna untuk melihat hubungan bersyarat antarvariabel.
Usia=Muda
| Merokok | Kanker Paru | Tidak Kanker |
|---|---|---|
| Ya | 12 | 28 |
| Tidak | 4 | 36 |
Usia=Dewasa
| Merokok | Kanker Paru | Tidak Kanker |
|---|---|---|
| Ya | 35 | 15 |
| Tidak | 12 | 38 |
Usia=Lansia
| Merokok | Kanker Paru | Tidak Kanker |
|---|---|---|
| Ya | 45 | 5 |
| Tidak | 18 | 32 |
# Data tiga dimensi
data3 <- array(c(12, 28, 4, 36,
35, 15, 12, 38,
45, 5, 18, 32),
dim = c(2, 2, 3),
dimnames = list(
Merokok = c("Ya", "Tidak"),
KankerParu = c("Ya", "Tidak"),
Usia = c("Muda", "Dewasa", "Lansia")
))
# Tabel parsial berdasarkan usia
parsial_muda <- data3[, , "Muda"]
parsial_dewasa <- data3[, , "Dewasa"]
parsial_lansia <- data3[, , "Lansia"]
parsial_muda
## KankerParu
## Merokok Ya Tidak
## Ya 12 4
## Tidak 28 36
parsial_dewasa
## KankerParu
## Merokok Ya Tidak
## Ya 35 12
## Tidak 15 38
parsial_lansia
## KankerParu
## Merokok Ya Tidak
## Ya 45 18
## Tidak 5 32
Analisis parsial membantu mengungkap pola yang tersembunyi dalam data. Misalnya, meskipun merokok terlihat berisiko pada seluruh populasi, dampaknya jauh lebih besar pada kelompok dewasa dan lansia.
Tabel marginal menyajikan total data dengan mengabaikan satu variabel. Ini memberikan gambaran umum distribusi kategori secara agregat.
Merokok x Kanker Paru
| Merokok | Kanker Paru | Tidak Kanker | Total |
|---|---|---|---|
| Ya | 92 | 48 | 140 |
| Tidak | 34 | 106 | 140 |
Usia x Kanker Paru
| Usia | Kanker Paru | Tidak Kanker | Total |
|---|---|---|---|
| Muda | 16 | 64 | 80 |
| Dewasa | 47 | 53 | 100 |
| Lansia | 63 | 37 | 100 |
# Tabel marginal
freq_marginal_merokok <- apply(data3, 1, sum)
freq_marginal_usia <- apply(data3, 3, sum)
freq_marginal_merokok
## Ya Tidak
## 126 154
freq_marginal_usia
## Muda Dewasa Lansia
## 80 100 100
Dari distribusi marginal, terlihat bahwa jumlah kasus kanker paru-paru meningkat pada perokok dan pada kelompok usia yang lebih tua. Meskipun informatif, tabel marginal dapat menyamarkan efek sebenarnya dari variabel kontrol seperti usia.
Peluang bersama menggambarkan kemungkinan terjadinya kombinasi spesifik dari tiga variabel kategori secara bersamaan. Nilainya diperoleh dengan membagi jumlah individu dalam satu sel kombinasi oleh total keseluruhan populasi.
Peluang bersama didefnisikan sebagai:
\[P(Z|X,Y)=\frac{P(Z,X,Y)}{P(X,Y)}\]
Sebagai contoh, peluang seseorang berusia tua diberikan bahwa dia merokok dan menderita kanker:
\[P(Tua|X=Y_a,Y=1)=\frac{P(Tua,Y_a,Y=1)}{P(X=Y_a,Y=1)}\]
Menghitung secara manual:
Implementasi dalam R:
Sebagai contoh, peluang bahwa seseorang berusia lansia, merokok, dan mengidap kanker paru-paru adalah:
\[ P(Z = \text{Lansia}, X = \text{Ya}, Y = 1) = \frac{63}{380} \approx 0.1658 \]
#### Implementasi dalam R
# Data 3 arah: Merokok x Kanker x Usia
data3 <- array(
c(12, 52, 47, 11, 63, 22, 43, 13, 0, 48, 42, 37),
dim = c(2, 2, 3),
dimnames = list(
Merokok = c("Ya", "Tidak"),
Kanker = c("Ya", "Tidak"),
Usia = c("Muda", "Dewasa", "Lansia")
)
)
# Hitung total
total_data <- sum(data3)
# Hitung probabilitas bersama
joint_prob <- data3 / total_data
# Tampilkan tabel probabilitas bersama
ftable(joint_prob)
## Usia Muda Dewasa Lansia
## Merokok Kanker
## Ya Ya 0.03076923 0.16153846 0.00000000
## Tidak 0.12051282 0.11025641 0.10769231
## Tidak Ya 0.13333333 0.05641026 0.12307692
## Tidak 0.02820513 0.03333333 0.09487179
Tabel berikut menunjukkan probabilitas bersama untuk kombinasi tiga variabel: Usia, Merokok, dan Kanker Paru. Probabilitas diperoleh dengan membagi frekuensi setiap sel dengan total keseluruhan data.
| Usia | Merokok | P(Kanker Paru) | P(Tidak Kanker) |
|---|---|---|---|
| Muda | Ya | 0.0316 | 0.1368 |
| Muda | Tidak | 0.0200 | 0.1263 |
| Dewasa | Ya | 0.1237 | 0.0289 |
| Dewasa | Tidak | 0.1132 | 0.0342 |
| Lansia | Ya | 0.1658 | 0.0000 |
| Lansia | Tidak | 0.1132 | 0.1400 |
Peluang marginal menggambarkan distribusi probabilitas dari satu variabel dengan mengabaikan variabel lainnya. Nilainya diperoleh dengan menjumlahkan seluruh peluang bersama dari kategori yang sama.
Sebagai contoh, peluang seseorang terkena kanker paru-paru dihitung sebagai:
\[ P(Y = 1) = \sum_{x,z} P(Z = z, X = x, Y = 1) = \frac{12 + 47 + 63 + 43 + 0 + 48}{380} \approx 0.5526 \]
Implementasi dalam R
# Hitung peluang marginal dari joint_prob
marginal_X <- apply(joint_prob, 1, sum) # berdasarkan Merokok
marginal_Z <- apply(joint_prob, 3, sum) # berdasarkan Usia
marginal_Y <- apply(joint_prob, 2, sum) # berdasarkan Kanker
# Tampilkan hasil
marginal_X
## Ya Tidak
## 0.5307692 0.4692308
marginal_Z
## Muda Dewasa Lansia
## 0.3128205 0.3615385 0.3256410
marginal_Y
## Ya Tidak
## 0.5051282 0.4948718
Merokok x Kanker Paru
| Merokok | P(Kanker Paru) | P(Tidak Kanker) |
|---|---|---|
| Ya | 0.3211 | 0.1658 |
| Tidak | 0.2316 | 0.2816 |
Usia x Kanker Paru
| Usia | P(Kanker Paru) | P(Tidak Kanker) |
|---|---|---|
| Muda | 0.0516 | 0.2632 |
| Dewasa | 0.2368 | 0.0632 |
| Lansia | 0.2795 | 0.1400 |
Kesimpulan
Tabel peluang marginal memberikan gambaran distribusi probabilitas masing-masing variabel secara agregat. Analisis ini bermanfaat untuk memahami pola umum dalam data, namun tidak cukup untuk menangkap interaksi kompleks antar variabel. Oleh karena itu, penggunaan tabel probabilitas bersama secara bersamaan sangat penting untuk memperoleh pemahaman yang lebih komprehensif terhadap data kategori dalam konteks tabel kontingensi tiga arah.
Tabel peluang bersyarat menyajikan distribusi probabilitas suatu kejadian dengan mempertimbangkan bahwa kejadian lain telah terjadi. Dalam konteks tabel kontingensi, peluang bersyarat dihitung dengan membagi frekuensi sel dengan total frekuensi pada kategori tertentu (baris atau kolom), tergantung pada variabel mana yang dikondisikan.
Dengan kata lain, peluang bersyarat memperlihatkan seberapa besar kemungkinan suatu kejadian terjadi dalam kondisi tertentu, dan dihitung berdasarkan total frekuensi pada kategori tersebut.
Tabel Peluang Bersyarat untuk Usia Muda:
Tabel Peluang Bersyarat untuk Usia Dewasa:
Tabel Peluang Bersyarat untuk Usia Tua:
Implementasi dalam R
Rumus Umum: \[ P(A \mid B, C) = \frac{P(A, B, C)}{P(B, C)} \]
# Peluang bersyarat diberikan Cancer = Yes
data_3way <- array(c(50, 30, 20, 40, 60, 70, 40, 30),
dim = c(2, 2, 2),
dimnames = list(
Gender = c("Male", "Female"),
Smoking = c("Yes", "No"),
Cancer = c("Yes", "No")
))
cond_prob <- prop.table(data_3way, margin = 3)
ftable(round(cond_prob[,,"Yes"], 3))
## Smoking Yes No
## Gender
## Male 0.357 0.143
## Female 0.214 0.286
Ukuran asosiasi digunakan untuk mengukur kekuatan dan arah hubungan antara dua variabel dalam kondisi tetap (parsial) dari variabel ketiga.
1. Risk Difference (RD)
\[ RD=P(Y|X_1,Z)-P(Y|X_2,Z) \]
2. Risiko Relatif (RR)
\[ RR=\frac{P(Y|X_1,Z)}{P(Y|X_2,Z)} \]
3. Odds Ratio (OR)
\[ OR=\frac{P(Y|X_1,Z)/(1-(Y|X_1,Z))}{P(Y|X_2,Z)/(1-P(Y|X_2,Z))} \]
Ukuran asosiasi pada tabel kontingensi berfungsi untuk menilai seberapa kuat hubungan antara dua variabel kategorikal. Tiga ukuran yang paling sering digunakan meliputi Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR). Bagian ini menjelaskan masing-masing rumus secara rinci, langkah-langkah perhitungan manual, cara implementasi menggunakan R, serta bagaimana menginterpretasikan hasil yang diperoleh dari analisis tersebut.
Perhitungan Ukuran Asosiasi
1. Risk Diference (RD) Risk Diference mengukur perbedaan probabilitas kejadian antara dua kelompok. Perhitungan Manual:
\[ RD = \frac{10}{50} - \frac{5}{50} = 0.2 - 0.1 = 0.1 \]
Interpretasi:
Risk Difference sebesar 0.1 atau 10% menunjukkan bahwa probabilitas terkena kanker paru-paru lebih tinggi 10% pada kelompok perokok dibandingkan dengan kelompok non-perokok.
2. Relative Risk (RR)
Perhitungan Manual:
\[ RR = \frac{\frac{10}{50}}{\frac{5}{50}} = \frac{0.2}{0.1} = 2.0 \]
Interpretasi:
Relative Risk sebesar 2.0 menunjukkan bahwa perokok memiliki risiko terkena kanker paru-paru 2 kali lebih tinggi dibandingkan dengan non-perokok.
3. Odds Ratio (OR)
Perhitungan Manual:
\[ OR = \frac{10 \times 45}{5 \times 40} = \frac{450}{200} = 2.25 \]
Interpretasi:
Odds Ratio sebesar 2.25 menunjukkan bahwa odds terkena kanker paru-paru pada perokok adalah 2.25 kali lebih besar dibandingkan dengan non-perokok.
Implementasi dalam R
data <- matrix(c(10, 40, 5, 45), nrow = 2, byrow = TRUE)
rownames(data) <- c("Merokok", "Tidak")
colnames(data) <- c("Kanker", "Tidak Kanker")
data
## Kanker Tidak Kanker
## Merokok 10 40
## Tidak 5 45
# Hitung Risk Difference
p1 <- data[1, 1] / sum(data[1, ])
p2 <- data[2, 1] / sum(data[2, ])
RD <- p1 - p2
RD
## [1] 0.1
# Hitung Relative Risk
RR <- p1 / p2
RR
## [1] 2
# Hitung Odds Ratio
odds1 <- data[1, 1] / data[1, 2]
odds2 <- data[2, 1] / data[2, 2]
OR <- odds1 / odds2
OR
## [1] 2.25
Kesimpulan
Kesimpulan Ukuran asosiasi seperti Risk Diference, Relative Risk, dan Odds Ratio sangat berguna dalam mengukur hubungan antara variabel dalam tabel kontingensi. Hasil analisis menunjukkan bahwa: • Risk Diference sebesar 0.1 (10%) mengindikasikan bahwa perokok memiliki peluang terkena kanker paru-paru yang lebih tinggi sebesar 10% dibandingkan non-perokok. • Relative Risk sebesar 2.0 menunjukkan bahwa perokok memiliki risiko 2 kali lebih tinggi terkena kanker paru-paru dibandingkan non-perokok. • Odds Ratio sebesar 2.25 menunjukkan bahwa odds terkena kanker paru-paru pada perokok adalah 2.25 kali lebih besar dibandingkan dengan non-perokok. Ketiga ukuran ini memberikan gambaran bahwa terdapat hubungan positif antara kebiasaan merokok dan risiko kanker paru-paru. Namun, perlu diperhatikan bahwa hubungan ini tidak selalu bersifat kausal, dan faktor lain juga dapat berkontribusi terhadap risiko penyakit.
Kasus 1 Dataset ini berisi informasi tentang hubungan antara ras tersangka, ras korban, dan putusan hukuman mati berdasarkan penelitian Agresti (2019, page 53 Table 2.9). Variabel yang Digunakan
• X: Ras Tersangka (White, Black) • Y: Putusan Hukuman Mati (Yes, No) • Z: Ras Korban (White, Black) Struktur Data dalam Tabel Kontingensi 3D Data dalam bentuk tabel kontingensi tiga arah dapat direpresentasikan sebagai berikut:
Tabel Putusan Hukuman Mati berdasarkan Ras Tersangka dan Korban
| Victim’s Race | Defendant’s Race | Yes | No | Percentage Yes |
|---|---|---|---|---|
| White | White | 53 | 414 | 11.3 |
| White | Black | 11 | 37 | 22.9 |
| Black | White | 0 | 16 | 0.0 |
| Black | Black | 4 | 139 | 2.8 |
| Total | White | 53 | 430 | 11.0 |
| Black | 15 | 176 | 7.9 |
Tabel Marginal (Total untuk Semua Korban)
| Ya | Tidak | |
|---|---|---|
| Tersangka White | 10 | 40 |
| Tersangka Black | 5 | 45 |
library(knitr)
library(magrittr)
library(kableExtra)
data_tabel <- data.frame(
"Victims' Race" = c("White", "", "Black", "", "Total", ""),
"Defendant's Race" = c("White", "Black", "White", "Black", "White", "Black"),
"Yes" = c(53, 11, 0, 4, 53, 15),
"No" = c(414, 37, 16, 139, 430, 176),
"Percentage Yes" = c(11.3, 22.9, 0.0, 2.8, 11.0, 7.9)
)
kable(data_tabel, format = "latex", booktabs = TRUE,
caption = "Putusan Hukuman Mati berdasarkan Ras Tersangka dan Korban") %>%
kable_styling(full_width = FALSE, position = "center")
Tabel marginal dengan menjumlahkan seluruh korban Tabel marginal diperoleh dengan menjumlahkan data berdasarkan kategori tertentu.
marginal <- apply(data, c(1, 2), sum)
df_marginal <- as.data.frame(marginal)
colnames(df_marginal) <- c("Ya", "Tidak")
rownames(df_marginal) <- c("Tersangka White", "Tersangka Black")
kable(df_marginal, format = "latex",
caption = "Tabel Marginal (Total untuk Semua Korban)") %>%
kable_styling(full_width = FALSE, position = "center")
Kesimpulan • Tabel Parsial menunjukkan hubungan antara ras tersangka dan putusan hukuman mati untuk setiap kategori ras korban. • Tabel Marginal menunjukkan hubungan ras tersangka dan putusan hukuman mati setelah menggabungkan semua kategori ras korban. • Dari tabel marginal, terlihat bahwa putusan hukuman mati lebih sering diberikan kepada tersangka berkulit putih dibandingkan dengan tersangka berkulit hitam dalam kasus yang melibatkan korban berkulit putih.
Tabel: Putusan Hukuman Mati berdasarkan Ras Tersangka dan Korban
| Victims’ Race | Defendant’s Race | Yes | No |
|---|---|---|---|
| White | White | 53 | 414 |
| White | Black | 11 | 37 |
| Black | White | 0 | 16 |
| Black | Black | 4 | 139 |
| Total | White | 53 | 430 |
| Total | Black | 15 | 176 |
• Analisis lebih lanjut dapat dilakukan dengan Chi-Square Test atau Model Log-Linear untuk melihat interaksi antar-variabel. • Jika terdapat confounding efect, metode G-statistics atau logistic regression bisa digunakan untuk mengontrol efek tersebut.
Perhitungan Asosiasi Analisis tabel kontingensi tiga arah ini dilakukan untuk mengevaluasi hubungan antara ras tersangka, ras korban, dan putusan hukuman mati. Kami akan menghitung tiga ukuran asosiasi utama: 1. Risk Diference (RD) 2. Relative Risk (RR) 3. Odds Ratio (OR)
1. Risk Difference (RD)
Rumus:
\[ RD = \frac{a}{a + b} - \frac{c}{c + d} \]
Perhitungan Manual:
Misalkan kita ingin menghitung Risk Difference (RD) untuk tersangka kulit putih dibandingkan dengan tersangka kulit hitam (dengan korban kulit putih).
Tersangka White:
\[
P_{white} = \frac{53}{53 + 414} = \frac{53}{467}
\]
Tersangka Black:
\[
P_{black} = \frac{11}{11 + 37} = \frac{11}{48}
\]
Sehingga,
\[ RD = \frac{53}{467} - \frac{11}{48} \approx -0.1156 \]
Interpretasi:
Nilai Risk Difference sebesar -0.1156 menunjukkan bahwa risiko putusan hukuman mati bagi tersangka kulit hitam lebih tinggi 11.56% dibandingkan dengan tersangka kulit putih.
Tanda negatif menunjukkan bahwa kelompok referensi (kulit putih) memiliki risiko lebih rendah.
Perhitungan dengan R
RD_white <- 53 / (53 + 414)
RD_black <- 11 / (11 + 37)
RD <- RD_white - RD_black
RD
## [1] -0.1156763
Rumus:
\[ RR = \frac{\frac{a}{a + b}}{\frac{c}{c + d}} \]
Perhitungan Manual:
Kita menghitung Relative Risk (RR) untuk tersangka kulit putih dibandingkan dengan tersangka kulit hitam (dengan korban kulit putih):
Tersangka White:
\[
P_{white} = \frac{53}{53 + 414} = \frac{53}{467}
\]
Tersangka Black:
\[
P_{black} = \frac{11}{11 + 37} = \frac{11}{48}
\]
Maka:
\[ RR = \frac{53 / 467}{11 / 48} \approx 0.495 \]
Interpretasi:
Nilai Relative Risk sebesar 0.495 menunjukkan bahwa tersangka kulit putih hanya memiliki 49.5% risiko dibandingkan dengan tersangka kulit hitam untuk menerima putusan hukuman mati.
Karena nilai RR < 1, hal ini mengindikasikan bahwa tersangka kulit putih memiliki risiko lebih rendah dibandingkan dengan tersangka kulit hitam.
Perhitungan dengan R
RR <- RD_white / RD_black
RR
## [1] 0.4952307
Rumus:
\[ OR = \frac{a \times d}{b \times c} \]
dengan:
- \(a = 53\) (White defendant, Yes)
- \(b = 414\) (White defendant, No)
- \(c = 11\) (Black defendant, Yes)
- \(d = 37\) (Black defendant, No)
Perhitungan Manual:
\[ OR = \frac{53 \times 37}{414 \times 11} = \frac{1961}{4554} \approx 0.431 \]
Interpretasi:
Nilai Odds Ratio sebesar 0.431 menunjukkan bahwa peluang tersangka kulit putih untuk menerima hukuman mati hanya 43.1% dibandingkan dengan tersangka kulit hitam.
Karena OR < 1, ini berarti tersangka kulit putih memiliki peluang lebih kecil dibandingkan tersangka kulit hitam untuk mendapatkan putusan hukuman mati.
Perhitungan Menggunakan R
OR <- (53 * 37) / (414 * 11)
OR
## [1] 0.4306105
Interpretasi Hasil 1. Risk Diference (RD = -0.1156): Risiko hukuman mati bagi tersangka kulit hitam lebih tinggi 11.56% dibandingkan dengan tersangka kulit putih. 2. Relative Risk (RR = 0.495): Tersangka kulit putih memiliki risiko 50.5% lebih rendah dibandingkan dengan tersangka kulit hitam untuk menerima hukuman mati. 3. Odds Ratio (OR = 0.431): Peluang tersangka kulit putih untuk dihukum mati hanya 43.1% dibandingkan dengan tersangka kulit hitam. Kesimpulan dari hasil ini adalah bahwa tersangka kulit hitam memiliki kemungkinan lebih besar untuk dijatuhi hukuman mati dibandingkan dengan tersangka kulit putih dalam kasus ini.
Kemandirian Bersyarat (Conditional Independence) dalam tabel kontingensi merujuk pada situasi di mana dua variabel kategori tidak lagi memiliki hubungan (menjadi independen) setelah efek dari variabel ketiga dikendalikan atau diperhitungkan.
Matematis, dua variabel X dan Y dikatakan independen secara kondisional terhadap variabel Z jika:
\[ P(X,Y|Z)=P(X|Z)P(Y|Z) \]
atau dalam bentuk frekuensi:
\[ \frac{n_{ijk}}{n_{k++}}=\frac{n_{i+k}}{n_{k++}}\cdot\frac{n_{+jk}}{n_{k++}} \]
Contoh Kasus: Misalkan kita memiliki data tentang kebiasaan olahraga (X), kesehatan jantung (Y), dan usia (Z)
Tabel Kontingensi untuk Usia = Muda
| Sehat | Tidak Sehat | Total | |
|---|---|---|---|
| Olahraga Rutin | 30 | 20 | 50 |
| Tidak Rutin | 10 | 40 | 50 |
| Total | 40 | 60 | 100 |
Pengujian Conditional Independence
Perhitungan dengan R
# Membuat array 3 dimensi (Usia, Olahraga, Kesehatan)
sports_health <- array(
c(30, 10, 20, 40, # Usia Muda: Olahraga Rutin vs Tidak Rutin
5, 15, 10, 50), # Usia Tua: Olahraga Rutin vs Tidak Rutin
dim = c(2, 2, 2),
dimnames = list(
"Olahraga" = c("Rutin", "Tidak Rutin"),
"Kesehatan" = c("Sehat", "Tidak Sehat"),
"Usia" = c("Muda", "Tua")
)
)
# Tampilkan tabel kontingensi untuk masing-masing usia
for (z in dimnames(sports_health)$Usia) {
df <- as.data.frame.matrix(sports_health[,,z])
colnames(df) <- c("Sehat", "Tidak Sehat")
rownames(df) <- c("Olahraga Rutin", "Tidak Rutin")
print(
kable(df, format = "latex", booktabs = TRUE,
caption = paste("Tabel untuk Usia =", z)) %>%
kable_styling(full_width = FALSE, position = "center")
)
}
## \begin{table}
## \centering
## \caption{(\#tab:unnamed-chunk-50)Tabel untuk Usia = Muda}
## \centering
## \begin{tabular}[t]{lrr}
## \toprule
## & Sehat & Tidak Sehat\\
## \midrule
## Olahraga Rutin & 30 & 20\\
## Tidak Rutin & 10 & 40\\
## \bottomrule
## \end{tabular}
## \end{table}
## \begin{table}
## \centering
## \caption{(\#tab:unnamed-chunk-50)Tabel untuk Usia = Tua}
## \centering
## \begin{tabular}[t]{lrr}
## \toprule
## & Sehat & Tidak Sehat\\
## \midrule
## Olahraga Rutin & 5 & 10\\
## Tidak Rutin & 15 & 50\\
## \bottomrule
## \end{tabular}
## \end{table}
Untuk menguji apakah kesehatan dan olahraga independen secara kondisional terhadap usia, kita gunakan uji chi-square dalam setiap strata usia. Perhitungan Manual Untuk setiap kategori Usia (Z), kita uji apakah:
Conditional independence menyatakan bahwa dua variabel (misalnya, Olahraga dan Status Kesehatan) bersifat bebas bersyarat terhadap variabel ketiga (misalnya, Usia).
Secara umum, bentuk pendekatannya:
\[ P(Y, X \mid Z) \approx P(Y \mid Z) \cdot P(X \mid Z) \]
Data Tabel untuk Usia = Muda
| Sehat | Tidak Sehat | Total | |
|---|---|---|---|
| Olahraga Rutin | 30 | 20 | 50 |
| Tidak Rutin | 10 | 40 | 50 |
| Total | 40 | 60 | 100 |
Perhitungan Manual
Karena nilai \(P(\text{Sehat} \mid \text{Rutin}, \text{Muda})\) dan \(P(\text{Sehat} \mid \text{Tidak Rutin}, \text{Muda})\) berbeda jauh dari \(P(\text{Sehat} \mid \text{Muda})\), maka kondisi conditional independence tidak terpenuhi.
Perhitungan menggunakan R
# Uji Chi-Square per strata usia
chisq_muda <- chisq.test(sports_health[,,"Muda"])
chisq_tua <- chisq.test(sports_health[,,"Tua"])
## Warning in chisq.test(sports_health[, , "Tua"]): Chi-squared approximation may
## be incorrect
list(
Hasil_Uji_Muda = chisq_muda,
Hasil_Uji_Tua = chisq_tua
)
## $Hasil_Uji_Muda
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: sports_health[, , "Muda"]
## X-squared = 15.042, df = 1, p-value = 0.0001052
##
##
## $Hasil_Uji_Tua
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: sports_health[, , "Tua"]
## X-squared = 0.24615, df = 1, p-value = 0.6198
Kesimpulan Analisis Hubungan Olahraga dan Kesehatan Berdasarkan Usia
1. Kelompok Usia Muda
Nilai Chi-square: 15.042
p-value: 0.0001052
Interpretasi:
Karena p-value < 0.05, maka tolak H₀.
Artinya, terdapat hubungan yang signifikan antara olahraga dan status kesehatan pada kelompok usia muda.
Olahraga secara rutin tampaknya berkorelasi kuat dengan kondisi sehat bagi individu muda.
2. Kelompok Usia Tua
Nilai Chi-square: 0.246
p-value: 0.6198
Peringatan: Terdapat catatan bahwa pendekatan Chi-square mungkin tidak akurat karena frekuensi yang terlalu kecil.
Interpretasi:
Karena p-value > 0.05, maka gagal tolak H₀.
Tidak ada hubungan yang signifikan antara olahraga dan status kesehatan pada kelompok usia tua berdasarkan data ini.
Disarankan untuk menggunakan uji alternatif seperti uji Fisher jika frekuensi sel terlalu kecil.
Kasus 2 Tabel kontingensi 3 arah digunakan untuk menganalisis hubungan antara tiga variabel kategorik. Misalkan: kita memiliki dataset hipotetis mengenai pengaruh Obat (X) dan Jenis Kelamin (Z) terhadap Kesembuhan (Y) pasien. Variabel yang digunakan:
- Y (Kesembuhan): Sembuh atau Tidak Sembuh
- X (Obat): A atau B
- Z (Jenis Kelamin): Laki-laki atau Perempuan
Data Tabel Kontingensi 3 Arah
Berikut adalah data hipotetis:
data <- array(
c(30, 10, 25, 15, 35, 20, 40, 30),
dim = c(2, 2, 2),
dimnames = list(
Y = c("Sembuh", "Tidak Sembuh"),
X = c("Obat A", "Obat B"),
Z = c("Laki-laki", "Perempuan")
)
)
data
## , , Z = Laki-laki
##
## X
## Y Obat A Obat B
## Sembuh 30 25
## Tidak Sembuh 10 15
##
## , , Z = Perempuan
##
## X
## Y Obat A Obat B
## Sembuh 35 40
## Tidak Sembuh 20 30
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(margin_YX, format = "latex", booktabs = TRUE)
Perhitungan Risk Diference (RD), Relative Risk (RR), dan Odds Ratio (OR) Kita menghitung RD, RR, dan OR untuk setiap tingkat Z (Laki-laki dan Perempuan). Perhitungan Manual 1. Laki-laki
a <- data["Sembuh", "Obat A", "Laki-laki"]
b <- data["Tidak Sembuh", "Obat A", "Laki-laki"]
c <- data["Sembuh", "Obat B", "Laki-laki"]
d <- data["Tidak Sembuh", "Obat B", "Laki-laki"]
p1 <- a / (a + b)
p2 <- c / (c + d)
RD_male <- p1 - p2
RR_male <- p1 / p2
OR_male <- (a * d) / (b * c)
data_RD_RR_OR_male <- data.frame(RD = RD_male, RR = RR_male, OR = OR_male)
kable(data_RD_RR_OR_male, format = "latex", booktabs = TRUE)
2. Perempuan
a <- data["Sembuh", "Obat A", "Perempuan"]
b <- data["Tidak Sembuh", "Obat A", "Perempuan"]
c <- data["Sembuh", "Obat B", "Perempuan"]
d <- data["Tidak Sembuh", "Obat B", "Perempuan"]
p1 <- a / (a + b)
p2 <- c / (c + d)
RD_female <- p1 - p2
RR_female <- p1 / p2
OR_female <- (a * d) / (b * c)
data_RD_RR_OR_female <- data.frame(RD = RD_female, RR = RR_female, OR = OR_female)
kable(data_RD_RR_OR_female, format = "latex", booktabs = TRUE)
Kesimpulan: Analisis tabel kontingensi 3 arah ini menunjukkan bahwa jenis kelamin (Z) mempengaruhi hubungan antara obat (X) dan kesembuhan (Y). Obat A lebih efektif untuk laki-laki, sementara efeknya lebih kecil untuk perempuan. Hasil ini dapat digunakan dalam pengambilan keputusan medis.
Tabel kontingensi tiga arah digunakan untuk menganalisis keterkaitan antara dua variabel kategorikal dengan mempertimbangkan satu variabel kontrol tambahan. Misalnya, untuk menyelidiki hubungan antara kebiasaan merokok (X) dan kejadian kanker paru-paru (Y), kita dapat mengontrol pengaruh dari variabel usia (Z) sebagai faktor perancu atau variabel pengganggu.
Tabel ini terdiri dari beberapa tabel parsial (2×2) untuk setiap tingkat Z, serta tabel marginal yang mengabaikan Z. Ukuran asosiasi yang digunakan adalah odds ratio:
\[ OR=\frac{a\cdot d}{b\cdot c} \]
dengan:
\(a\) = jumlah kasus kanker yang merokok
\(b\) = jumlah kasus kanker yang tidak merokok
\(c\) = jumlah tidak kanker yang merokok
\(d\) = jumlah tidak kanker yang tidak merokok
Jika odds ratio dari masing-masing tabel parsial (berdasarkan variabel kontrol) menunjukkan konsistensi atau relatif stabil antar strata, maka kita dapat menghitung odds ratio gabungan atau summary odds ratio dengan menggunakan estimasi Mantel-Haenszel. Metode ini memberikan taksiran odds ratio keseluruhan yang memperhitungkan efek dari variabel kontrol, sehingga hasilnya lebih akurat dalam situasi adanya potensi pengganggu.
Konsep independensi bersyarat merupakan aspek krusial dalam analisis tabel kontingensi tiga arah. Istilah ini mengacu pada situasi di mana dua variabel kategorik, misalnya X dan Y, tidak saling bergantung dalam setiap kategori dari variabel ketiga, yaitu Z. Artinya, setelah mengendalikan atau mengkondisikan pada setiap level Z, hubungan antara X dan Y menjadi tidak signifikan. Untuk menguji kondisi ini secara statistik, digunakan pendekatan seperti uji Cochran-Mantel-Haenszel (CMH) yang dirancang untuk menguji independensi bersyarat antar dua variabel pada beberapa strata dari variabel kontrol.
Definisi Independensi Bersyarat : Independensi bersyarat terjadi ketika dua variabel kategorik, misalnya \(X\) dan \(Y\), tidak saling bergantung dalam setiap kategori dari variabel ketiga, \(Z\). Secara khusus, \(X\) dan \(Y\) dianggap independen secara bersyarat terhadap \(Z\) jika odds ratio antara \(X\) dan \(Y\) di setiap tingkat \(Z\) bernilai 1. Hal ini menunjukkan bahwa tidak ada hubungan antara \(X\) dan \(Y\) setelah mempertimbangkan pengaruh variabel kontrol \(Z\).
\[ OR(X,Y|Z)=1 \]
Artinya:
Jika dua variabel \(X\) dan \(Y\) bersifat independen secara bersyarat terhadap variabel ketiga \(Z\), maka setelah mempertimbangkan atau mengontrol pengaruh \(Z\), tidak terdapat hubungan antara \(X\) dan \(Y\) di dalam setiap lapisan atau strata \(Z\).
Hal-hal yang Perlu Diperhatikan
Independensi bersyarat tidak menjamin independensi marginal.
Meskipun \(X\) dan \(Y\) tampak tidak saling terkait dalam masing-masing strata \(Z\), mereka tetap bisa menunjukkan hubungan jika data dilihat secara keseluruhan (tanpa memperhatikan \(Z\)). Kondisi ini dikenal sebagai Paradoks Simpson.
Pentingnya asumsi dalam analisis praktis.
Asumsi mengenai independensi bersyarat sering digunakan dalam berbagai bidang, seperti epidemiologi, ilmu sosial, serta pembelajaran mesin, terutama saat bekerja dengan tabel kontingensi tiga arah atau model dengan struktur variabel yang kompleks.
Uji Cochran-Mantel-Haenszel (CMH) dirancang untuk mengevaluasi apakah terdapat hubungan yang signifikan antara dua variabel kategorik, dengan mempertimbangkan pengaruh dari variabel ketiga yang berperan sebagai confounder (variabel perancu). Uji ini dilakukan melalui pendekatan tabel kontingensi yang disusun secara berlapis (strata) berdasarkan kategori dari variabel ketiga.
Manfaat Utama Uji CMH:
Menguji keterkaitan yang dikontrol:
Digunakan untuk menilai hubungan antara dua variabel dengan mengontrol pengaruh variabel perancu melalui tabel kontingensi yang terbagi berdasarkan strata.
Menguji hipotesis independensi bersyarat:
Uji CMH digunakan untuk menilai apakah dua variabel bersifat independen dalam setiap strata dari variabel ketiga, sehingga sangat berguna dalam menguji independensi bersyarat.
Mengurangi bias akibat confounding:
Dalam studi-studi epidemiologi atau eksperimen sosial, variabel perancu dapat mengganggu interpretasi hubungan utama. Uji CMH membantu mengurangi bias tersebut dan memberikan estimasi asosiasi yang lebih valid.
Oleh karena itu, Uji CMH sangat relevan ketika kita menghadapi tabel kontingensi tiga arah, dan ingin menilai hubungan utama (misalnya antara variabel X dan Y) dengan mengontrol pengaruh variabel ketiga (Z).
Ide Dasar Uji CMH Uji CMH berangkat dari konsep tabel kontingensi berlapis (stratifed 2 × 2 tables), di mana dua variabel utama dipecah menjadi beberapa strata berdasarkan variabel perancu. Sebagai contoh, jika kita ingin melihat hubungan antara merokok (X) dan kanker paru-paru (Y), namun juga ingin mempertimbangkan pengaruh polusi udara (Z), maka kita membuat beberapa tabel 2 × 2 berdasarkan tingkat polusi udara. CMH kemudian menguji hubungan antara X dan Y setelah mengontrol efek Z.
Hipotesis
Statistik Uji Statistik uji Cochran-Mantel-Haenszel (CMH) dirumuskan sebagai:
\[ CMH = \frac{\left[ \sum_k (n_{11k} - \mu_{11k}) \right]^2}{\sum_k \mathrm{var}(n_{11k})} \]
Keterangan:
\(n_{11k}\): frekuensi observasi pada sel baris 1 kolom 1 pada tabel parsial ke-\(k\).
\(\mu_{11k}\): nilai ekspektasi pada sel baris 1 kolom 1 pada tabel parsial ke-\(k\), dihitung dengan rumus: \[ \mu_{11k} = E(n_{11k}) = \frac{n_{1. k} \times n_{.1 k}}{n_{..k}} \]
Varians dari \(n_{11k}\)
\[ \mathrm{var}(n_{11k}) = \frac{n_{1. k} \cdot n_{2. k} \cdot n_{.1 k} \cdot n_{.2 k}}{n_{..k}^2 (n_{..k} - 1)} \]
Statistik CMH mengikuti distribusi Chi-square dengan derajat kebebasan (db) = 1.
Keputusan uji: Tolak hipotesis nol \(H_0\) jika \(\chi^2_{CMH} > \chi^2_{(1, \alpha)}\) atau p-value <\(\alpha\).
Contoh 1: Analisis Efek Merokok terhadap Kanker Paru-paru dengan Kontrol Jenis Kelamin
Misalkan kita memiliki data mengenai efek merokok terhadap kanker paru-paru, tetapi ingin mengontrol faktor jenis kelamin. Data dikategorikan menjadi laki-laki dan perempuan dengan tabel 2×2 masing-masing:
Tabel Kontingensi
Strata: Laki-laki
| Kanker Paru-paru (+) | Kanker Paru-paru (-) | Total | |
|---|---|---|---|
| Perokok | 50 | 30 | 80 |
| Tidak Merokok | 20 | 50 | 70 |
Strata: Perempuan
| Kanker Paru-paru (+) | Kanker Paru-paru (-) | Total | |
|---|---|---|---|
| Perokok | 40 | 20 | 60 |
| Tidak Merokok | 10 | 40 | 50 |
Perhitungan Manual
Untuk laki-laki (\(k=1\)):
\[
e_{111} = \frac{80 \times 70}{150} = \frac{5600}{150} = 37.33
\]
Untuk perempuan (\(k=2\)):
\[
e_{112} = \frac{60 \times 50}{110} = \frac{3000}{110} = 27.27
\]
Untuk laki-laki (\(k=1\)):
\[
Var(e_{111}) = \frac{80 \times 70 \times 70 \times 80}{150^2 \times (150-1)} = \frac{28000000}{22500 \times 149} = \frac{28000000}{3352500} = 9.35
\]
Untuk perempuan (\(k=2\)):
\[
Var(e_{112}) = \frac{60 \times 50 \times 50 \times 60}{110^2 \times (110 - 1)} = \frac{8400000}{12100 \times 109} = \frac{8400000}{1318900} = 6.82
\]
\[ \chi^2_{CMH} = \frac{(50 - 37.33 + 40 - 27.27)^2}{9.35 + 6.82} = \frac{(12.67 + 12.73)^2}{16.18} = \frac{25.40^2}{16.18} = \frac{644.85}{16.18} = 39.86 \]
Statistik uji ini dibandingkan dengan distribusi \(\chi^2\) dengan 1 derajat kebebasan. Jika nilai \(\chi^2_{CMH}\) lebih besar dari nilai kritis \(\chi^2_{1, \alpha}\), maka kita tolak hipotesis nol dan menyimpulkan ada hubungan antara merokok dan kanker paru-paru setelah mengontrol jenis kelamin.
Dengan \(\alpha = 0.05\), nilai kritis \(\chi^2_{1, 0.05} = 3.841\). Karena \(39.86 > 3.841\), maka hipotesis nol ditolak, yang berarti ada hubungan signifikan antara merokok dan kanker paru-paru setelah mengontrol jenis kelamin.
Implementasi Uji CMH di R
Contoh Penerapan Uji CMH dengan R Misalkan kita memiliki data mengenai efek merokok terhadap kanker paru-paru, tetapi ingin mengontrol faktor jenis kelamin. Data dikategorikan menjadi laki-laki dan perempuan dengan tabel 2×2 masing-masing: Data
data_cmh <- array(c(50, 30, 20, 50, # Laki-laki
40, 20, 10, 40), # Perempuan
dim = c(2, 2, 2),
dimnames = list(
Merokok = c("Perokok", "Tidak Merokok"),
Kanker = c("Kanker (+)", "Kanker (-)"),
Jenis_Kelamin = c("Laki-laki", "Perempuan")
))
data_cmh
## , , Jenis_Kelamin = Laki-laki
##
## Kanker
## Merokok Kanker (+) Kanker (-)
## Perokok 50 20
## Tidak Merokok 30 50
##
## , , Jenis_Kelamin = Perempuan
##
## Kanker
## Merokok Kanker (+) Kanker (-)
## Perokok 40 10
## Tidak Merokok 20 40
Uji CMH dengan Base R Menggunakan fungsi mantelhaen.test
library(broom)
## Warning: package 'broom' was built under R version 4.3.3
library(ResourceSelection)
## Warning: package 'ResourceSelection' was built under R version 4.3.3
## ResourceSelection 0.3-6 2023-06-27
cmh_base <- mantelhaen.test(data_cmh, correct = FALSE)
cmh_base
##
## Mantel-Haenszel chi-squared test without continuity correction
##
## data: data_cmh
## Mantel-Haenszel X-squared = 39.86, df = 1, p-value = 2.729e-10
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 3.132410 9.187417
## sample estimates:
## common odds ratio
## 5.364583
Kesimpulan Dari hasil uji Cochran-Mantel-Haenszel dengan beberapa metode di atas, kita dapat membandingkan hasil statistik uji dan kesimpulan dari tiap metode. Jika nilai p lebih kecil dari 0.05, maka kita menolak hipotesis nol, yang berarti ada hubungan signifkan antara merokok dan kanker paru-paru setelah mengontrol jenis kelamin
Contoh 2 Misalkan kita memiliki data mengenai efektivitas sebuah program pelatihan dalam meningkatkan keterampilan pekerja, tetapi ingin mengontrol faktor industri tempat bekerja. Data dikategorikan berdasarkan tiga industri dengan tabel 2×2 masing-masing: Data
library(knitr)
data <- array(c(20, 30, 10, 40,
15, 25, 5, 35,
18, 32, 12, 38),
dim = c(2, 2, 3),
dimnames = list(
Pelatihan = c("Mengikuti", "Tidak Mengikuti"),
Peningkatan = c("Ya", "Tidak"),
Industri = c("Stratum 1", "Stratum 2", "Stratum 3")))
print(data)
## , , Industri = Stratum 1
##
## Peningkatan
## Pelatihan Ya Tidak
## Mengikuti 20 10
## Tidak Mengikuti 30 40
##
## , , Industri = Stratum 2
##
## Peningkatan
## Pelatihan Ya Tidak
## Mengikuti 15 5
## Tidak Mengikuti 25 35
##
## , , Industri = Stratum 3
##
## Peningkatan
## Pelatihan Ya Tidak
## Mengikuti 18 12
## Tidak Mengikuti 32 38
Uji CMH dengan Base R (Tanpa Continuity Correction)
cmh_base <- mantelhaen.test(data, correct = FALSE)
cmh_base
##
## Mantel-Haenszel chi-squared test without continuity correction
##
## data: data
## Mantel-Haenszel X-squared = 11.733, df = 1, p-value = 0.0006139
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.482202 4.377281
## sample estimates:
## common odds ratio
## 2.547159
Kesimpulan Dari hasil uji Cochran-Mantel-Haenszel, kita dapat menilai apakah terdapat hubungan signifkan antara pelatihan dan peningkatan keterampilan setelah mengontrol faktor industri. Jika nilai p lebih kecil dari 0.05, maka hipotesis nol ditolak, yang berarti ada hubungan signifkan antara partisipasi dalam program pelatihan dan peningkatan keterampilan setelah mempertimbangkan faktor industri.
library(vcdExtra) # Untuk uji CMH
## Warning: package 'vcdExtra' was built under R version 4.3.3
## Loading required package: gnm
## Warning: package 'gnm' was built under R version 4.3.3
##
## Attaching package: 'vcdExtra'
## The following object is masked from 'package:dplyr':
##
## summarise
# Contoh Data: Tabel Kontingensi 2 × 2 × k
data <- array(c(20, 30, 10, 40,
15, 25, 5, 35,
18, 32, 12, 38),
dim = c(2, 2, 3),
dimnames = list(
X = c("Ya", "Tidak"),
Y = c("Ya", "Tidak"),
Z = c("Stratum 1", "Stratum 2", "Stratum 3")
))
# Melakukan uji Cochran-Mantel-Haenszel
mantelhaen.test(data)
##
## Mantel-Haenszel chi-squared test with continuity correction
##
## data: data
## Mantel-Haenszel X-squared = 10.848, df = 1, p-value = 0.000989
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.482202 4.377281
## sample estimates:
## common odds ratio
## 2.547159
Interpretasi Hasil Uji CMH
Uji Cochran-Mantel-Haenszel (CMH) digunakan untuk menguji independensi bersyarat antara dua variabel kategorik, yaitu apakah dua variabel (misalnya, kebiasaan merokok \(X\) dan kanker paru-paru \(Y\)) masih berkorelasi setelah dikontrol oleh variabel ketiga (misalnya, provinsi \(Z\)).
Kriteria Keputusan
Konsep: Independensi Bersyarat
Independensi bersyarat menyatakan bahwa dua variabel tidak memiliki hubungan langsung, setelah memperhitungkan pengaruh variabel ketiga. Dalam konteks tabel kontingensi tiga arah (\(X\), \(Y\), dan \(Z\)), kita ingin mengetahui apakah \(X\) dan \(Y\) tetap berasosiasi dalam setiap strata \(Z\).
Uji CMH sangat bermanfaat dalam situasi seperti ini karena dapat menggabungkan informasi dari berbagai strata \(Z\) dan memberikan satu statistik gabungan.
Contoh Kasus: Agresti (2006),
Data: Penelitian dari 8 provinsi di China yang mengamati hubungan antara kebiasaan merokok (\(X\)) dan kejadian kanker paru-paru (\(Y\)), dengan provinsi sebagai variabel kontrol (\(Z\)).
Analisis yang Akan Dilakukan
Data Berikut adalah data yang digunakan:
library(knitr) # Untuk menampilkan tabel
# Membuat data dalam bentuk data frame
data <- data.frame(
City = rep(c("Beijing", "Shanghai", "Shenyang", "Nanjing", "Harbin",
"Zhengzhou", "Taiyunn", "Nanchang"), each = 2),
Smoking = rep(c("Smokers", "Nonsmokers"), 8),
Lung_Cancer_Yes = c(126, 35, 908, 497, 913, 336, 235, 58, 402, 121,
182, 72, 60, 11, 104, 21),
Lung_Cancer_No = c(100, 61, 688, 807, 747, 598, 172, 121, 308, 215,
156, 98, 99, 43, 89, 36)
)
# Menampilkan data dalam bentuk tabel
kable(data, caption = "Data Kebiasaan Merokok dan Kanker Paru-paru
di 8 Provinsi China")
| City | Smoking | Lung_Cancer_Yes | Lung_Cancer_No |
|---|---|---|---|
| Beijing | Smokers | 126 | 100 |
| Beijing | Nonsmokers | 35 | 61 |
| Shanghai | Smokers | 908 | 688 |
| Shanghai | Nonsmokers | 497 | 807 |
| Shenyang | Smokers | 913 | 747 |
| Shenyang | Nonsmokers | 336 | 598 |
| Nanjing | Smokers | 235 | 172 |
| Nanjing | Nonsmokers | 58 | 121 |
| Harbin | Smokers | 402 | 308 |
| Harbin | Nonsmokers | 121 | 215 |
| Zhengzhou | Smokers | 182 | 156 |
| Zhengzhou | Nonsmokers | 72 | 98 |
| Taiyunn | Smokers | 60 | 99 |
| Taiyunn | Nonsmokers | 11 | 43 |
| Nanchang | Smokers | 104 | 89 |
| Nanchang | Nonsmokers | 21 | 36 |
Langkah 1: Data Awal - Kota Beijing
| Kategori | Kanker | Tidak Kanker | Total |
|---|---|---|---|
| Perokok | 126 | 100 | 226 |
| NonPerokok | 35 | 61 | 96 |
| Total | 161 | 161 | 322 |
Variabel:
Langkah 2: Perhitungan Odds Ratio (OR)
Rumus Odds Ratio:
\[ OR = \frac{a \times d}{b \times c} \]
Substitusi:
\[ OR = \frac{126 \times 61}{100 \times 35} = \frac{7686}{3500} = 2.196 \]
Interpretasi: Odds Ratio sebesar 2.196 menunjukkan bahwa perokok memiliki odds terkena kanker paru-paru sekitar 2,2 kali lebih besar dibandingkan nonperokok di Kota Beijing.
Langkah 3: Menghitung Ekspektasi \(E_{11}\)
\[ E_{11} = \frac{(a + c) \times (a + b)}{n} = \frac{161 \times 226}{322} = \frac{36486}{322} = 113.37 \]
Langkah 4: Menghitung Varians \(\text{Var}(E_{11})\)
Rumus:
\[ \text{Var}(E_{11}) = \frac{(a + c)(n - (a + c))(a + b)(n - (a + b))}{n^2(n - 1)} \]
Substitusi:
\[ \text{Var}(E_{11}) = \frac{161 \times (322 - 161) \times 226 \times (322 - 226)}{322^2 \times (322 - 1)} \]
\[ = \frac{161 \times 161 \times 226 \times 96}{103684 \times 321} = \frac{560056896}{33282264} \approx 8.12 \]
Kesimpulan
Hasil ini menunjukkan asosiasi positif antara kebiasaan merokok dan kejadian kanker paru-paru, dengan odds yang cukup besar serta perbedaan nyata dari nilai ekspektasi.
Langkah 4: Perhitungan untuk Semua Kota Menggunakan rumus yang sama, kita hitung ekspektasi dan varians untuk setiap kota:
city_names <- c("Beijing", "Shanghai", "Shenyang", "Nanjing",
"Harbin", "Zhengzhou", "Taiyuan", "Nanchang")
dimnames_array <- list(Y = c("Kanker", "TidakKanker"),
X = c("Perokok", "NonPerokok"),
Kota = city_names)
data_array <- array(c(126, 100, 35, 61, 908, 688, 497, 807, 913, 747, 336, 598,
235, 172, 58, 121, 402, 308, 121, 215, 182, 156, 72, 98,
60, 99, 11, 43, 104, 89, 21, 36),
dim = c(2, 2, 8), dimnames = dimnames_array)
Langkah 5: Menghitung Statistik Mantel-Haenszel
expectation <- c()
variance <- c()
for (i in 1:8) {
n_11k <- data_array[1, 1, i]
n_1_k <- sum(data_array[1, , i])
n__1k <- sum(data_array[, 1, i])
n__k <- sum(data_array[, , i])
mu_11k <- (n_1_k * n__1k) / n__k
var_11k <- (n_1_k * (n__k - n_1_k) * n__1k * (n__k - n__1k)) /
(n__k^2 * (n__k - 1))
expectation <- c(expectation, mu_11k)
variance <- c(variance, var_11k)
}
sum_mu_11k <- sum(expectation)
sum_var_11k <- sum(variance)
sum_n_11k <- sum(data_array[1, 1, ])
CMH <- ((sum_n_11k - sum_mu_11k) ^ 2) / sum_var_11k
CMH
## [1] 280.1375
Di atas disajikan perhitungan manual ekspektasi dan varians untuk setiap strata dengan langkahlangkah rinci, seanjutnya implementasi perhitungan statistik Mantel-Haenszel di R. Silakan jalankan di RStudio
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.3.3
library(epitools) # Untuk perhitungan odds ratio
##
## Attaching package: 'epitools'
## The following object is masked from 'package:vcdExtra':
##
## expand.table
## The following object is masked from 'package:vcd':
##
## oddsratio
# Mengubah data menjadi format matriks untuk perhitungan OR
or_results <- matrix(nrow = 8, ncol = 2)
colnames(or_results) <- c("City", "Odds Ratio")
for (i in 1:8) {
subset_data <- data[(2*i-1):(2*i), ]
table_matrix <- matrix(c(subset_data$Lung_Cancer_Yes,
subset_data$Lung_Cancer_No), nrow = 2, byrow = TRUE)
or_value <- oddsratio.wald(table_matrix)$measure[2, 1]
or_results[i, ] <- c(subset_data$City[1], round(or_value, 3))
}
# Konversi ke data frame dan tampilkan
or_results_df <- as.data.frame(or_results)
kable(or_results_df, caption = "Hasil Perhitungan Odds Ratio per Provinsi")
| City | Odds Ratio |
|---|---|
| Beijing | 2.196 |
| Shanghai | 2.143 |
| Shenyang | 2.175 |
| Nanjing | 2.85 |
| Harbin | 2.319 |
| Zhengzhou | 1.588 |
| Taiyunn | 2.369 |
| Nanchang | 2.003 |
Pengujian Independensi Bersyarat Untuk menguji apakah terjadi independensi bersyarat antara kebiasaan merokok dan kanker paru-paru dengan mempertimbangkan provinsi sebagai kontrol, kita dapat menggunakan uji Cochran-Mantel-Haenszel (CMH).
library(vcdExtra) # Untuk uji CMH
# Mengubah data menjadi format array untuk uji CMH
data_array <- array(
c(data$Lung_Cancer_Yes, data$Lung_Cancer_No),
dim = c(2, 2, 8),
dimnames = list(
Smoking = c("Smokers", "Nonsmokers"),
Lung_Cancer = c("Yes", "No"),
City = unique(data$City)
)
)
# Melakukan uji Cochran-Mantel-Haenszel
cmh_test <- mantelhaen.test(data_array)
print(cmh_test)
##
## Mantel-Haenszel chi-squared test with continuity correction
##
## data: data_array
## Mantel-Haenszel X-squared = 1.867, df = 1, p-value = 0.1718
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 0.9665878 1.2308221
## sample estimates:
## common odds ratio
## 1.090733
Interpretasi Hasil 1. Odds Ratio: Jika odds ratio per provinsi signifkan lebih besar dari 1, berarti merokok meningkatkan risiko kanker paru-paru. 2. Uji CMH: • Jika nilai p < 0.05, maka kita menolak hipotesis nol dan menyimpulkan bahwa X dan Y tidak independen bersyarat terhadap Z. • Jika nilai p > 0.05, maka tidak ada bukti kuat untuk menyatakan bahwa X dan Y tidak independen bersyarat terhadap Z. Kesimpulan Berdasarkan hasil odds ratio dan uji CMH, kita dapat menentukan apakah merokok berpengaruh terhadap paru-paru dengan mempertimbangkan provinsi sebagai faktor kontrol.
Penaksir untuk Tabel 2×2×K
Pada tabel kontingensi dengan ukuran 2×2×K, terdapat K tabel parsial yang masing-masing menghasilkan odds ratio bersyarat.
Jika odds ratio bersyarat tersebut memiliki nilai yang relatif konsisten (tidak menunjukkan perbedaan yang mencolok) dan cenderung ke arah yang sama, maka memungkinkan untuk menghitung satu nilai odds ratio gabungan.
Nilai odds ratio gabungan ini diestimasi menggunakan statistik Mantel-Haenszel.
Rumus Odds Ratio Bersama Odds ratio bersama ditaksir menggunakan rumus:
\[ \hat{\theta}_{MH} = \frac{ \sum_{k=1}^K \left( \frac{n_{11k} n_{22k}}{n_{..k}} \right) }{ \sum_{k=1}^K \left( \frac{n_{12k} n_{21k}}{n_{..k}} \right) } \]
Keterangan:
- \(n_{11k}\) = frekuensi sel baris 1 kolom 1 pada tabel parsial ke-\(k\)
- \(n_{22k}\) = frekuensi sel baris 2 kolom 2 pada tabel parsial ke-\(k\)
- \(n_{12k}\) = frekuensi sel baris 1 kolom 2 pada tabel parsial ke-\(k\)
- \(n_{21k}\) = frekuensi sel baris 2 kolom 1 pada tabel parsial ke-\(k\)
- \(n_{..k}\) = total frekuensi pada tabel parsial ke-\(k\)
Standard Error log Odds Ratio Bersama Standard error untuk log odds ratio bersama dihitung dengan rumus:
\[ \hat{\theta}^2 \left[ \log(\hat{\theta}_{MH}) \right] = \frac{ \sum \left( n_{11k} + n_{12k} \right) \frac{n_{11k} n_{22k}}{n_{..k}^2} }{ 2 \left( \sum \frac{n_{11k} n_{12k}}{n_{..k}} \right)^2 } + \frac{ \sum \left[ (n_{11k} + n_{22k})(n_{11k} + n_{12k}) + (n_{12k} + n_{21k})(n_{11k} + n_{22k}) \right] / n_{..k}^2 }{ 2 \left( \sum \frac{n_{11k} n_{12k}}{n_{..k}} \right) \left( \sum \frac{n_{12k} n_{21k}}{n_{..k}} \right) } + \frac{ \sum (n_{12k} + n_{21k}) \frac{n_{12k} n_{21k}}{n_{..k}^2} }{ 2 \left( \sum \frac{n_{12k} n_{21k}}{n_{..k}} \right)^2 } \]
Interval Kepercayaan log Odds Ratio Bersama
\[ \log(\hat{\theta}_{MH}) \pm z_{\alpha/2} \hat{\sigma}[log(\hat{\theta}_{MH})] \]
Rumus penaksir odds ratio bersama (Peto’s method) adalah sebagai berikut:
\[ \hat{OR}_B = \frac{\sum \left( a_i \cdot d_i \right) / n_i}{\sum \left( b_i \cdot c_i \right) / n_i} \]
Misalnya, diperoleh:
Maka hasil penaksirannya:
\[ \hat{OR}_B = \frac{(126)(61) + \ldots + (104)(36)/250}{(35)(100) + \ldots + (21)(89)/250} = 2.17 \]
2. Standard Error
Standard error dari log odds ratio bersama diberikan oleh:
\[ SE(\log \hat{OR}_B) = 0.04 \]
3. Interval Kepercayaan 95%
Kita gunakan rumus:
\[ \log(\hat{OR}_B) \pm Z_{\alpha/2} \cdot SE(\log \hat{OR}_B) \]
Dengan \(\hat{OR}_B = 2.17\) dan \(SE(\log \hat{OR}_B) = 0.04\), serta \(Z_{0.025} = 1.96\), maka:
Odds ratio bersama sebesar 2.17 menunjukkan bahwa perokok memiliki risiko 2.17 kali lebih tinggi untuk terkena kanker paru-paru dibandingkan non-perokok. - Standard error sebesar 0.04 menunjukkan adanya variabilitas kecil dalam estimasi odds ratio, yang berarti hasil estimasi cukup stabil. - Interval kepercayaan 95% (1.98 hingga 2.38) menunjukkan bahwa kita cukup yakin bahwa nilai odds ratio sebenarnya berada dalam rentang tersebut. - Karena interval kepercayaan tidak mencakup nilai 1, maka hasil ini signifikan secara statistik. Ini mendukung adanya hubungan antara kebiasaan merokok dan kejadian kanker paru-paru.
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
Homogenitas Asosiasi dalam Tabel Kontingensi Tiga Arah
Definisi Asosiasi Homogen
Pengujian Homogenitas dengan Statistik Breslow-Day Hipotesis
Hipotesis nol \((H_0)\) : \(\theta_{xy(k)}= \cdots = \theta_{xy(k)}\) (odds ratio sama di seluruh strata)
Hipotesis alternatif \((H_1)\) : Setidaknya ada satu odds ratio yang berbeda
Statistik Uji Breslow-Day Statistik uji Breslow-Day (BD) digunakan untuk menguji homogenitas odds ratio:
\[ X^2_{\text{HBD}} = \sum_{j=1}^{K} \frac{(a_j - \tilde{a}_j)^2}{\hat{\text{Var}}(a_j \mid \hat{OR}_{MH})} \]
dengan:
Statistik \(X^2_{\text{HBD}}\) ini mengikuti distribusi Chi-kuadrat dengan derajat kebebasan sebesar \(K - 1\), di mana \(K\) adalah jumlah strata atau kelompok.
Jika nilai statistik homogenitas \(X^2_{\text{HBD}}\) lebih besar dari nilai kritis \(\chi^2_{(\alpha, K - 1)}\), maka:
Sebaliknya, jika nilai \(X^2_{\text{HBD}}\) lebih kecil atau sama dengan nilai kritis, maka:
Perhitungan Manual Step by Step
Uji Homogenitas Rasio Odds: Uji Breslow-Day
Pendahuluan
Fungsi Breslow-Day Test digunakan untuk menguji homogenitas rasio odds (OR) di seluruh strata dalam tabel kontingensi 2×2×k.
Hipotesis nol (\(H_0\)) menyatakan bahwa rasio odds (\(OR_k\)) adalah sama di semua strata: \[
H_0: OR_1 = OR_2 = \dots = OR_k
\] Jika hipotesis nol ditolak, maka rasio odds berbeda di beberapa strata.
Langkah-Langkah Perhitungan
1. Estimasi Rasio Odds Gabungan (Mantel-Haenszel OR)
Estimasi rasio odds gabungan (\(\hat{OR}_{MH}\)) dihitung sebagai: \[ \hat{OR}_{MH} = \frac{\sum_{k=1}^{K} \frac{a_k d_k}{n_k}}{\sum_{k=1}^{K} \frac{b_k c_k}{n_k}} \] dengan: - \(a_k, b_k, c_k, d_k\) adalah isi sel tabel kontingensi 2×2 untuk strata \(k\) - \(n_k\) adalah total observasi dalam strata ke-\(k\)
2. Menentukan Nilai Ekspektasi \(\tilde{a}_k\)
Ekspektasi \(\tilde{a}_k\) diperoleh dari solusi positif persamaan kuadrat berikut: \[ -\hat{OR}_{MH} a_k^2 + (\hat{OR}_{MH}(r_{1k} + c_{1k}) + n_k - r_{1k}) a_k + (1 - \hat{OR}_{MH}) r_{1k} c_{1k} = 0 \] Dengan: - \(r_{1k}\) = total baris atas (misal perokok) - \(c_{1k}\) = total kolom kasus - \(n_k\) = total individu dalam strata \(k\)
Solusi \(\tilde{a}_k\) harus memenuhi: \[ 0 < \tilde{a}_k \leq \min(r_{1k}, c_{1k}) \]
3. Menghitung Varians \(\widehat{Var}(a_k | \hat{OR}_{MH})\)
\[ \widehat{Var}(a_k | \hat{OR}_{MH}) = \left( \frac{1}{\tilde{a}_k} + \frac{1}{\tilde{b}_k} + \frac{1}{\tilde{c}_k} + \frac{1}{\tilde{d}_k} \right)^{-1} \]
Dengan: - \(\tilde{b}_k = r_{1k} - \tilde{a}_k\)
- \(\tilde{c}_k = c_{1k} - \tilde{a}_k\)
- \(\tilde{d}_k = n_k - (r_{1k} + c_{1k} - \tilde{a}_k)\)
4. Statistik Uji Breslow-Day
\[ \chi^2_{HBD} = \sum_{k=1}^{K} \frac{(a_k - \tilde{a}_k)^2}{\widehat{Var}(a_k | \hat{OR}_{MH})} \]
5. Koreksi Tarone
\[ \chi^2_{HBDT} = \chi^2_{HBD} - \frac{\left( \sum_k (a_k - \tilde{a}_k) \right)^2}{\sum_k \widehat{Var}(a_k | \hat{OR}_{MH})} \]
6. P-value dan Keputusan Hipotesis
Derajat kebebasan: \[ df = k - 1 \]
Nilai p: \[ p\text{-value} = 1 - \chi^2_{cdf}(\chi^2_{HBDT}, df) \]
Jika \(p\text{-value} < 0.05\), maka tolak hipotesis nol dan simpulkan bahwa rasio odds tidak homogen di seluruh strata.
Kesimpulan
Data Contoh
Tabel kontingensi 2×2×2 berdasarkan kelompok usia:
Strata 1: Usia < 50 tahun
| Kasus | Kontrol | Total | |
|---|---|---|---|
| Perokok | 30 | 20 | 50 |
| Non-perokok | 10 | 40 | 50 |
| Total | 40 | 60 | 100 |
Strata 2: Usia ≥ 50 tahun
| Kasus | Kontrol | Total | |
|---|---|---|---|
| Perokok | 25 | 35 | 60 |
| Non-perokok | 15 | 65 | 80 |
| Total | 40 | 100 | 140 |
1. Hitung Rasio Odds di Tiap Stratum
Rumus Rasio Odds (OR):
\[
OR = \frac{a \times d}{b \times c}
\]
Kelompok \(< 50\) tahun:
\[
OR_1 = \frac{30 \times 40}{20 \times 10} = \frac{1200}{200} = 6.0
\]
Kelompok \(\geq 50\) tahun:
\[
OR_2 = \frac{25 \times 65}{35 \times 15} = \frac{1625}{525} \approx 3.10
\]
2. Hitung Rasio Odds Gabungan (Mantel-Haenszel OR)
Gunakan rumus Mantel-Haenszel:
\[
\hat{OR}_{MH} = \frac{\sum \frac{a_j d_j}{n_j}}{\sum \frac{b_j c_j}{n_j}}
\]
\[ \hat{OR}_{MH} = \frac{ \frac{30 \times 40}{40 + 60} + \frac{25 \times 65}{40 + 100} }{ \frac{20 \times 10}{40 + 60} + \frac{35 \times 15}{40 + 100} } \]
\[ \hat{OR}_{MH} = \frac{ \frac{1200}{100} + \frac{1625}{140} }{ \frac{200}{100} + \frac{525}{140} } = \frac{12 + 11.61}{2 + 3.75} = \frac{23.61}{5.75} \approx 4.11 \]
3. Hitung Ekspektasi \(\tilde{a}\)
Ekspektasi \(\tilde{a}\) dihitung dengan menyelesaikan persamaan kuadrat:
\[ - a_1 n_1 \hat{OR}_{MH} + (n_2 b - n_1 d + \hat{OR}_{MH}(n_1 b + n_1 d)) \tilde{a}_j + (1 - \hat{OR}_{MH}) \tilde{a}_j^2 = 0 \]
\[ \tilde{a}_1 \approx 27.2 \]
\[ \tilde{a}_2 \approx 17.59 \]
4. Hitung Varians \(\text{Var}(\hat{\theta}_j \mid \hat{\theta}_{MH})\)
\[ \text{Var}(\hat{\theta}_j \mid \hat{\theta}_{MH}) = \left( \frac{1}{\tilde{a}_j} + \frac{1}{n_{1j} - \tilde{a}_j} + \frac{1}{n_{2j} - \tilde{a}_j} + \frac{1}{n_j} \right)^{-1} \]
\[ \text{Var}(\hat{\theta}_1) = \left( \frac{1}{27.2} + \frac{1}{50 - 27.2} + \frac{1}{60 - 27.2} + \frac{1}{50} \right)^{-1} \approx 6.14 \]
\[ \text{Var}(\hat{\theta}_2) = \left( \frac{1}{17.59} + \frac{1}{60 - 17.59} + \frac{1}{100 - 17.59} + \frac{1}{40} \right)^{-1} \approx 5.92 \]
5. Hitung Statistik Uji Breslow-Day
\[ \chi^2_{BD} = \sum_{j=1}^{k} \frac{(a_j - \tilde{a}_j)^2}{\text{Var}(\hat{\theta}_j \mid \hat{\theta}_{MH})} \]
\[ \chi^2_{BD} = \frac{(30 - 27.2)^2}{6.14} + \frac{(25 - 17.59)^2}{5.92} = \frac{7.84}{6.14} + \frac{54.77}{5.92} \approx 1.28 + 9.25 = 10.53 \]
6. Terapkan Koreksi Tarone
\[ \chi^2_{Tarone} = \chi^2_{BD} - \frac{ \left( \sum_{j=1}^{k}(a_j - \tilde{a}_j) \right)^2 }{ \sum_{j=1}^{k} \text{Var}(\hat{\theta}_j \mid \hat{\theta}_{MH}) } \]
\[ \chi^2_{Tarone} = 10.53 - \frac{(30 - 27.2 + 25 - 17.59)^2}{6.14 + 5.92} = 10.53 - \frac{(10.21)^2}{12.06} = 10.53 - 8.65 = 1.88 \]
7. Hitung P-Value
\[ p = 1 - \chi^2(1.88, \, df = 1) \approx 0.17 \]
Fungsi breslowday.test() mengimplementasikan metode yang lebih canggih daripada rumus Breslow-Day sederhana, yang menjelaskan mengapa hasil perhitungan manual sering berbeda dari hasil R.
Function
breslowday.test <- function(x) {
#Find the common OR based on Mantel-Haenszel
or.hat.mh <- mantelhaen.test(x)$estimate
#Number of strata
K <- dim(x)[3]
#Value of the Statistic
X2.HBD <- 0
#Value of aj, tildeaj and Var.aj
a <- tildea <- Var.a <- numeric(K)
for (j in 1:K) {
#Find marginals of table j
mj <- apply(x[,,j], MARGIN=1, sum)
nj <- apply(x[,,j], MARGIN=2, sum)
#Solve for tilde(a)_j
coef <- c(-mj[1]*nj[1] * or.hat.mh, nj[2]-mj[1]+or.hat.mh*(nj[1]+mj[1]),
1-or.hat.mh)
sols <- Re(polyroot(coef))
#Take the root, which fulfills 0 < tilde(a)_j <= min(n1_j, m1_j)
tildeaj <- sols[(0 < sols) & (sols <= min(nj[1],mj[1]))]
#Observed value
aj <- x[1,1,j]
#Determine other expected cell entries
tildebj <- mj[1] - tildeaj
tildecj <- nj[1] - tildeaj
tildedj <- mj[2] - tildecj
#Compute \hat{\Var}(a_j | \widehat{\OR}_MH)
Var.aj <- (1/tildeaj + 1/tildebj + 1/tildecj + 1/tildedj)^(-1)
#Compute contribution
X2.HBD <- X2.HBD + as.numeric((aj - tildeaj)^2 / Var.aj)
#Assign found value for later computations
a[j] <- aj ; tildea[j] <- tildeaj ; Var.a[j] <- Var.aj
}
#Compute Tarone corrected test
X2.HBDT <-as.numeric( X2.HBD - (sum(a) - sum(tildea))^2/sum(Var.aj) )
#Compute p-value based on the Tarone corrected test
p <- 1-pchisq(X2.HBDT, df=K-1)
res <- list(X2.HBD=X2.HBD,X2.HBDT=X2.HBDT,p=p)
class(res) <- "bdtest"
return(res)
}
print.bdtest <- function(x) {
cat("Breslow and Day test (with Tarone correction):\n")
cat("Breslow-Day X-squared =",x$X2.HBD,"\n")
cat("Breslow-Day-Tarone X-squared =",x$X2.HBDT,"\n\n")
cat("Test for test of a common OR: p-value = ",x$p,"\n\n")
}
breslowday.test(lung_cancer_data)
## Breslow and Day test (with Tarone correction):
## Breslow-Day X-squared = 20.85501
## Breslow-Day-Tarone X-squared = 20.75567
##
## Test for test of a common OR: p-value = 0.004149107
# Instal dan muat paket yang diperlukan
if (!require(DescTools)) install.packages("DescTools")
library(DescTools)
# Data dalam format array 2x2x2
smoking_data <- array(c(30, 10, 20, 40, 25, 15, 35, 65),
dim = c(2, 2, 2),
dimnames = list(
"Merokok" = c("Perokok", "Non-perokok"),
"Status" = c("Kasus", "Kontrol"),
"Usia" = c("<50", "50")
))
# Uji Breslow-Day
breslow_test <- BreslowDayTest(smoking_data)
print(breslow_test)
##
## Breslow-Day test on Homogeneity of Odds Ratios
##
## data: smoking_data
## X-squared = 1.2248, df = 1, p-value = 0.2684
Interpretasi Hasil • Jika p-value < 0.05, maka kita menolak hipotesis nol, yang berarti rasio odds tidak homogen di seluruh strata. • Jika p-value > 0.05, maka tidak ada cukup bukti untuk mengatakan bahwa rasio odds berbeda antar strata. Contoh 3: Implementasi Uji Breslow-Day di R Menggunakan data sebelumnya dari 8 kota di China tentang kebiasaan merokok dan kanker paru-paru:
# Pastikan paket 'vcdExtra' sudah terpasang
#install.packages("vcdExtra") # Jalankan ini jika belum terinstal
library(vcdExtra)
# Data kanker paru-paru dan kebiasaan merokok di 8 kota
lung_cancer_data <- array(
c(126, 100, 35, 61,
908, 807, 497, 688,
913, 598, 336, 747,
235, 121, 58, 172,
402, 215, 121, 308,
182, 98, 72, 156,
60, 43, 11, 99,
104, 36, 21, 89),
dim = c(2, 2, 8),
dimnames = list(
Smoking = c("Smokers", "Nonsmokers"),
Lung_Cancer = c("Yes", "No"),
City = c("Beijing", "Shanghai", "Shenyang", "Nanjing",
"Harbin", "Zhengzhou", "Taiyuan", "Nanchang")
)
)
# Uji Breslow-Day untuk homogenitas odds ratio antar kota
bd_test <- BreslowDayTest(lung_cancer_data)
print(bd_test)
##
## Breslow-Day test on Homogeneity of Odds Ratios
##
## data: lung_cancer_data
## X-squared = 140.55, df = 7, p-value < 2.2e-16
Interpretasi Hasil
Kesimpulan
Uji Breslow-Day digunakan untuk memeriksa apakah odds ratio seragam di seluruh strata dalam tabel kontingensi tiga arah. Jika odds ratio homogen, maka tidak ada interaksi antara \(X\) dan \(Y\) terkait dengan variabel kontrol \(Z\). Jika tidak homogen, berarti ada interaksi antara \(X\) dan \(Y\) yang perlu diperhitungkan dalam analisis.
Generalized Linear Model (GLM) merupakan pengembangan dari regresi linear klasik yang dirancang untuk menangani data dengan karakteristik yang lebih kompleks. Model ini memungkinkan pemodelan variabel respons yang tidak mengikuti distribusi normal dan/atau memiliki hubungan non-linear dengan kombinasi linear dari variabel prediktor.
GLM terdiri atas tiga elemen utama:
Distribusi dari famili eksponensial sebagai distribusi variabel respons.
Fungsi link, yang menghubungkan nilai harapan dari variabel respons dengan kombinasi linear dari prediktor.
Fungsi linear prediktor, dirumuskan sebagai \[ \eta = X\beta \]
Distribusi yang termasuk dalam keluarga eksponensial memiliki bentuk umum:
\[ f(y; \theta,\phi) = \exp\left\{ \frac{y \theta - b(\theta)}{a(\phi)} + c(y, \phi) \right\} \]
Contoh distribusi yang termasuk dalam exponential family meliputi:
- Distribusi Normal
- Distribusi Binomial
- Distribusi Poisson
- Distribusi Gamma
Contoh Pembuktian: Distribusi Binomial
Fungsi probabilitas distribusi binomial adalah:
\[ P(Y = y) = \binom{n}{y} \pi^y (1 - \pi)^{n - y} \]
dapat ditulis ulang dalam bentuk exponential family sebagai berikut:
\[ P(Y = y) = \exp \left\{ \log \binom{n}{y} + y \log \left( \frac{\pi}{1 - \pi} \right) + n \log(1 - \pi) \right\} \]
Dengan melakukan substitusi sebagai berikut:
- \(\theta = \log \left( \frac{\pi}{1 - \pi} \right)\) (parameter kanonik / canonical parameter),
- \(b(\theta) = -n \log(1 - \pi)\),
- \(a(\phi) = 1\),
maka distribusi binomial dapat dikategorikan sebagai bagian dari exponential family. Penulisan ini menunjukkan bahwa distribusi binomial cocok digunakan dalam kerangka Generalized Linear Model (GLM) dengan fungsi link logit.
Persamaan dalam regresi logistik memiliki kemiripan dengan regresi linear, di mana kombinasi linear dari variabel input dan koefisien digunakan untuk menghasilkan suatu nilai prediksi. Bedanya, regresi logistik membatasi hasil prediksi agar berada dalam rentang antara 0 hingga 1 menggunakan fungsi aktivasi sigmoid, yang membentuk kurva S (S-shaped).
Model ini digunakan untuk menganalisis hubungan antara satu atau lebih variabel independen dengan variabel dependen kategorik. Regresi logistik mengklasifikasikan observasi ke dalam dua kategori diskrit, seperti kelas negatif (0) dan kelas positif (1).
Regresi logistik sangat populer dalam pemodelan prediktif, karena dapat memperkirakan probabilitas suatu kejadian atau keanggotaan dalam kelompok tertentu. Umumnya digunakan untuk masalah klasifikasi biner, yakni ketika variabel respons hanya memiliki dua kemungkinan kategori.
Beberapa contoh penerapan dari klasifikasi biner, di mana hasil yang diharapkan bersifat dua kategori (biner), antara lain:
Prediksi risiko serangan jantung: Dengan menggunakan model regresi logistik, tenaga medis dapat mengevaluasi hubungan antara berbagai faktor seperti indeks massa tubuh, tingkat aktivitas fisik, dan gaya hidup untuk memperkirakan apakah seseorang berisiko mengalami serangan jantung atau komplikasi kesehatan lainnya.
Perkiraan peluang diterima di universitas: Aplikasi penerimaan mahasiswa dapat memanfaatkan model prediktif untuk menghitung kemungkinan seorang calon mahasiswa diterima di universitas atau program studi tertentu, berdasarkan data seperti nilai ujian GRE, GMAT, atau TOEFL.
Deteksi email spam: Sistem penyaring email menggunakan regresi logistik untuk mengklasifikasikan pesan masuk sebagai spam atau bukan, dengan mempelajari pola pada fitur-fitur tertentu dari isi email guna menilai keasliannya.
Keunggulan Utama Regresi Logistik
Regresi logistik merupakan salah satu metode yang sangat populer dan mudah diterapkan dalam pembelajaran mesin, terutama untuk masalah klasifikasi biner. Salah satu alasan utama popularitasnya adalah proses pelatihan (training) dan pengujian (testing) yang relatif sederhana dan efisien. Dalam proses pelatihan, model belajar mengenali pola-pola yang terdapat pada data masukan — misalnya gambar, data teks, atau variabel numerik — dan menghubungkannya dengan hasil atau label tertentu. Berbeda dengan beberapa algoritma machine learning yang membutuhkan sumber daya komputasi besar dan waktu pelatihan lama, regresi logistik dapat dilatih dengan cepat dan menggunakan daya komputasi yang jauh lebih rendah. Hal ini membuat regresi logistik sangat cocok untuk diimplementasikan dan juga mudah dipahami oleh pengguna, terutama yang baru mempelajari machine learning.
Efektif untuk Data yang Dapat Dipisahkan Secara Linear
Regresi logistik sangat cocok untuk dataset yang mana dua kelas dapat dipisahkan dengan garis lurus pada ruang fitur. Dengan kata lain, jika data tersebut bersifat linear separable, maka regresi logistik mampu mengklasifikasikan data ke dalam dua kategori dengan akurasi yang tinggi. Variabel respons pada regresi logistik hanya memiliki dua nilai (misalnya 0 dan 1), sehingga metode ini sangat tepat untuk permasalahan klasifikasi biner yang linier.
Memberikan Informasi yang Berharga tentang Variabel Prediktor
Selain hanya melakukan klasifikasi, regresi logistik juga memberikan wawasan yang mendalam mengenai pengaruh setiap variabel independen atau prediktor terhadap hasil yang diprediksi. Melalui koefisien regresi, kita dapat mengetahui seberapa kuat dan signifikan pengaruh sebuah variabel terhadap peluang suatu kejadian, serta arah hubungan tersebut — apakah hubungan tersebut positif (meningkatkan peluang) atau negatif (menurunkan peluang).
Persamaan dan Asumsi Model Regresi Logistik
Model regresi logistik menggunakan fungsi logistik yang dikenal sebagai fungsi sigmoid, yaitu sebuah kurva berbentuk huruf S (S-shaped curve). Fungsi ini berfungsi untuk memetakan hasil prediksi berupa nilai riil ke dalam rentang probabilitas antara 0 hingga 1. Kemudian, probabilitas ini dibandingkan dengan nilai ambang batas (threshold) yang telah ditentukan. Jika probabilitas hasil prediksi melebihi ambang batas tersebut, model akan mengklasifikasikan observasi ke dalam kelas positif. Sebaliknya, jika probabilitas di bawah ambang batas, observasi diklasifikasikan ke kelas negatif. Pendekatan ini memungkinkan model regresi logistik bekerja dengan sangat baik dalam memprediksi kejadian biner berdasarkan pola yang ditemukan dalam data.
Sebagai ilustrasi sederhana, fungsi sigmoid dalam regresi logistik menghasilkan nilai probabilitas yang berada di antara 0 dan 1. Jika nilai output dari fungsi sigmoid tersebut lebih besar dari 0,5, maka model akan mengklasifikasikan hasilnya ke dalam kelas 1, yang biasanya diartikan sebagai kelas positif atau kejadian yang diharapkan terjadi. Sebaliknya, apabila nilai outputnya kurang dari 0,5, maka hasil klasifikasi adalah kelas 0, yang berarti kelas negatif atau kejadian tidak terjadi.
Grafik fungsi sigmoid sendiri memiliki bentuk S yang khas; ketika input menuju nilai yang sangat negatif secara ekstrem, prediksi probabilitas akan mendekati 0, sehingga model yakin bahwa kejadian tersebut tidak akan terjadi. Sebaliknya, jika inputnya sangat positif secara ekstrem, maka prediksi akan mendekati 1, menandakan keyakinan tinggi bahwa kejadian tersebut akan terjadi.
Contohnya, jika keluaran fungsi sigmoid menunjukkan nilai 0,65, itu berarti terdapat peluang sebesar 65% bahwa peristiwa tersebut akan terjadi. Dalam konteks sederhana seperti pelemparan koin, angka ini bisa diartikan sebagai probabilitas terjadinya sisi tertentu pada koin tersebut.
Fungsi sigmoid adalah fungsi aktivasi yang digunakan dalam regresi logistik untuk mengubah nilai prediksi menjadi probabilitas dalam rentang 0 hingga 1. Fungsi sigmoid dirumuskan sebagai berikut:
\[ f(x) = \frac{1}{1 + e^{-x}} \]
Di mana:
- \(x\) adalah kombinasi linear dari variabel prediktor, yaitu \(x = X\beta\).
Proses klasifikasi berdasarkan nilai fungsi sigmoid adalah sebagai berikut:
Dengan demikian, fungsi sigmoid memetakan hasil prediksi ke dalam probabilitas, yang kemudian digunakan untuk menentukan kelas akhir.
Simulasi dan Visualisasi Regresi Logistik
# Simulasi data untuk regresi logistik
set.seed(42)
n <- 100
x <- seq(-4, 4, length.out = n)
log_odds <- -0.5 + 1.5 * x
prob <- 1 / (1 + exp(-log_odds))
y <- rbinom(n, 1, prob)
# Buat data frame
data <- data.frame(x = x, y = y, prob = prob)
Plot Kurva Sigmoid
# Visualisasi menggunakan base R
plot(x, y, pch = 16, col = "gray60",
xlab = "X", ylab = "Y / Probabilitas",
main = "Simulasi Regresi Logistik dengan Kurva Sigmoid")
lines(x, prob, col = "blue", lwd = 2)
abline(h = 0.5, col = "red", lty = 2)
legend("topleft",
legend = c("Data Biner (0/1)", "Kurva Logistik", "Ambang 0.5"),
col = c("gray60", "blue", "red"),
pch = c(16, NA, NA),
lty = c(NA, 1, 2),
lwd = c(NA, 2, 1),
pt.cex = 1.5,
bty = "n")
Kurva sigmoid pada regresi logistik menggambarkan hubungan yang tidak linear antara variabel prediktor dengan probabilitas hasil keluaran. Pendekatan ini sangat efektif digunakan dalam klasifikasi biner, seperti untuk mendeteksi penyakit, memfilter email spam, serta membuat prediksi dalam bentuk jawaban ya atau tidak.
Fungsi link (logit): Fungsi link function logit dapat dinyatakan dalam bentuk berikut:
\[ g(\mu) = \log \left(\frac{\mu}{1-\mu}\right) \]
Model regresi logistik:
\[ \log \left(\frac{\mu}{1-\mu}\right) = \eta = X \beta \]
\[ \mu = \frac{\exp(X\beta)}{1 + \exp(X\beta)} \]
Estimasi Parameter
Metode estimasi parameter pada GLM umumnya menggunakan Maximum Likelihood Estimation (MLE). Log-likelihood fungsi untuk regresi logistik:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log({\pi}_i) + (1 - y_i) \log(1 - {\pi}_i) \right] \]
dengan probabilitas prediksi
\[ {\pi}_i = \frac{\exp(x_i^\top \beta)}{1 + \exp(x_i^\top \beta)} \]
Proses estimasi parameter biasanya dilakukan secara iteratif menggunakan metode Newton-Raphson atau algoritma Fisher Scoring untuk mencapai konvergensi.
Contoh Kasus dengan R
Misalkan kita memiliki data simulasi
set.seed(123)
n <- 200
x <- rnorm(n)
p <- 1 / (1 + exp(-(-0.5 + 2*x)))
y <- rbinom(n, 1, p)
data <- data.frame(y, x)
Estimasi Regresi Logistik Estimasi parameter model regresi logistik dapat menggunakan ‘glm’ function
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.8374 0.1954 -4.286 1.82e-05 ***
## x 2.0262 0.3016 6.718 1.84e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 261.37 on 199 degrees of freedom
## Residual deviance: 177.26 on 198 degrees of freedom
## AIC: 181.26
##
## Number of Fisher Scoring iterations: 5
Plot Probabilitas Prediksi Berdasarkan hasil model hasil prediksi dapat dibuat plot probabilitas prediksi sebagai berikut
plot(data$x, data$y, pch = 16, col = "grey")
curve(predict(model, newdata = data.frame(x = x), type = "response")[order(x)],
add = TRUE, col = "blue", lwd = 2)
GLM adalah kerangka model feksibel untuk berbagai jenis data dan distribusi. Regresi logistik merupakan salah satu contoh penting dari GLM, sangat berguna dalam analisis data kategorik biner. Estimasi parameter dilakukan melalui metode MLE dan dapat diselesaikan secara efsien dengan fungsi glm di R.
Regresi Poisson digunakan khusus untuk variabel respons yang berupa data hitung (count data), yaitu nilai-nilai bilangan bulat yang tidak boleh bernilai negatif, seperti jumlah kejadian suatu peristiwa dalam periode waktu tertentu. Model ini merupakan bagian dari keluarga Generalized Linear Model (GLM) dan diasumsikan bahwa variabel respons tersebut mengikuti distribusi Poisson. Dengan menggunakan regresi Poisson, kita dapat memodelkan hubungan antara variabel prediktor dan rata-rata jumlah kejadian tersebut secara efektif, terutama ketika data bersifat diskrit dan tidak memenuhi asumsi normalitas pada regresi linear biasa.
Distribusi Poisson memiliki fungsi probabilitas:
\[ P(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!} \]
Kita dapat menuliskan bentuk ini dalam format exponential family sebagai berikut:
\[ f(y; \theta) = \exp \{ y \log(\lambda) - \lambda - \log(y!) \} \]
dengan substitusi:
Maka, distribusi Poisson termasuk dalam keluarga exponential family.
Fungsi Link pada Model Poisson
Fungsi link kanonik untuk distribusi Poisson adalah fungsi logaritma:
\[ g(\mu) = \log(\mu) \]
Sehingga model regresi Poisson dapat dituliskan sebagai:
\[ \log(\mu_i) = x^\top_i \beta \]
Fungsi inverse link-nya adalah:
\[ \mu_i = \exp(x^\top_i \beta) \]
Estimasi Parameter pada Regresi Poisson
Estimasi parameter \(\beta\) dilakukan menggunakan metode Maximum Likelihood Estimation (MLE).
Fungsi log-likelihood untuk regresi Poisson adalah:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i (x_i^\top \beta) - \exp(x_i^\top \beta) - \log(y_i!) \right] \]
Nilai parameter \(\beta\) dapat diperoleh dengan metode numerik, seperti iterasi Newton-Raphson.
Contoh 1
Misalkan kita memiliki data simulasi sebagai berikut:
set.seed(42)
n <- 200
x <- rnorm(n)
lambda <- exp(0.3 + 0.6 * x)
y <- rpois(n, lambda)
data <- data.frame(y, x)
Estimasi Regresi Poisson
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.21817 0.06712 3.250 0.00115 **
## x 0.58748 0.06288 9.343 < 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: 333.72 on 199 degrees of freedom
## Residual deviance: 244.46 on 198 degrees of freedom
## AIC: 587.36
##
## Number of Fisher Scoring iterations: 5
Plot Hasil Prediksi
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)
Diagnostik dan Overdispersion Salah satu asumsi penting dari model Poisson adalah bahwa mean dan varians dari variabel respons adalah sama. Jika varians lebih besar dari mean, maka terjadi overdispersion.
dispersion <- sum(residuals(poisson_model, type = "pearson")^2) / poisson_model$df.residual
dispersion
## [1] 1.144237
Jika nilai dispersion > 1, maka overdispersion mungkin terjadi dan model alternatif seperti Negative Binomial Regression dapat digunakan. Model regresi Poisson adalah alat penting untuk menganalisis data cacah. Ia memberikan hubungan loglinear antara prediktor dan rata-rata kejadian. Namun, perlu diperhatikan kemungkinan overdispersion dalam penerapannya.
Dalam konteks Generalized Linear Model (GLM), proses inferensi statistik sangat penting untuk mengevaluasi keandalan dan signifikansi parameter yang diestimasi. Inferensi ini melibatkan pemahaman mendalam mengenai ekspektasi (nilai harapan) dan varians dari estimator parameter model. Informasi tersebut digunakan untuk mengembangkan berbagai alat uji statistik yang umum dipakai, seperti uji Wald, uji rasio likelihood (Likelihood Ratio test), serta pembuatan interval kepercayaan. Alat-alat ini membantu peneliti dalam mengambil keputusan berdasarkan data, misalnya untuk menguji hipotesis apakah suatu prediktor memiliki pengaruh yang signifikan terhadap variabel respons atau tidak. Selain itu, inferensi pada GLM juga memperhitungkan distribusi data yang beragam dan hubungan non-linear antara variabel, sehingga memberikan fleksibilitas dan ketepatan dalam analisis statistik dibandingkan dengan model regresi linear klasik.
Ekspektasi dan Varians dalam GLM
Ekspektasi Estimator
Ekspektasi dari sebuah estimator menggambarkan rata-rata nilai yang diharapkan jika pengamatan atau eksperimen diulang berkali-kali. Dalam konteks ini, ekspektasi juga mengindikasikan apakah estimator tersebut tak bias (unbiased), yaitu ketika nilai rata-rata estimasi sama dengan nilai parameter sebenarnya:
\(E[\hat{\beta}] = \beta\)
Pada Generalized Linear Model (GLM), estimator parameter yang diperoleh melalui metode Maximum Likelihood Estimation (MLE) memiliki sifat asymptotically unbiased. Artinya, ketika ukuran sampel semakin besar, estimasi yang dihasilkan oleh MLE akan semakin mendekati nilai parameter sesungguhnya tanpa bias sistematis.
Varians Estimator
Varians dari suatu estimator mencerminkan tingkat presisi atau keragaman estimasi parameter. Varians yang lebih kecil menunjukkan bahwa estimator cenderung menghasilkan nilai yang lebih konsisten dari satu sampel ke sampel lainnya.
Dalam Generalized Linear Model (GLM), pendekatan umum untuk menghitung varians dari estimator parameter \(\hat{\beta}\) adalah:
\[ \text{Var}(\hat{\beta}) \approx (\mathbf{X}^\top \mathbf{W} \mathbf{X})^{-1} \]
dengan:
- \(\mathbf{X}\): matriks desain (design matrix),
- \(\mathbf{W}\): matriks bobot yang bergantung pada bentuk distribusi dari variabel respons dan fungsi link yang digunakan.
Distribusi Asimptotik Estimator
Dalam Generalized Linear Model (GLM), ketika ukuran sampel cukup besar, estimator parameter \(\hat{\beta}\) mengikuti distribusi normal secara asimptotik:
\[ \hat{\beta} \sim N\left(\beta, \widehat{\text{Var}}(\hat{\beta})\right) \]
Artinya, meskipun distribusi variabel respons bukan normal, distribusi dari estimasi parameter \(\hat{\beta}\) akan mendekati normal seiring bertambahnya jumlah sampel. Hal ini memungkinkan dilakukannya inferensi statistik menggunakan pendekatan normal.
Distribusi asimptotik ini menjadi dasar penting dalam berbagai prosedur inferensial, seperti:
Dengan adanya asumsi distribusi normal asimptotik ini, kita dapat melakukan pengambilan keputusan statistik secara lebih fleksibel bahkan dalam model yang kompleks seperti GLM.
Varians dalam GLM Tidak Konstan
Berbeda dengan regresi linear klasik (OLS) yang mengasumsikan bahwa varians residual bersifat konstan untuk semua pengamatan (dikenal dengan asumsi homoskedastisitas), yaitu:
\[ \text{Var}(Y_i) = \sigma^2 \]
Pada Generalized Linear Model (GLM), varians dari variabel respons tidak konstan, melainkan tergantung pada nilai ekspektasinya:
\[ \text{Var}(Y_i) = \phi \cdot V(\mu_i) \]
dengan:
Contoh:
# Simulasi data
set.seed(123)
x <- rnorm(100)
mu <- exp(0.5 + 0.8 * x)
y <- rpois(100, mu)
model <- glm(y ~ x, family = poisson)
summary(model)
##
## Call:
## glm(formula = y ~ x, family = poisson)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.44950 0.08872 5.066 4.05e-07 ***
## x 0.86000 0.07463 11.523 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.05 on 99 degrees of freedom
## Residual deviance: 106.78 on 98 degrees of freedom
## AIC: 325.76
##
## Number of Fisher Scoring iterations: 5
Kesimpulan • Ekspektasi digunakan untuk mengetahui ketakbiasan estimasi • Varians digunakan untuk mengukur presisi dan menyusun uji statistik • Distribusi asimptotik dari \(\hat\beta\) sangat bergantung pada kedua konsep ini • Dalam GLM, varians sangat tergantung pada bentuk distribusi eksponensial dari data
Ekspektasi
Ekspektasi dari variabel respons dalam GLM dapat diperoleh dari fungsi distribusi probabilitasnya. Jika menggunakan pendekatan berdasarkan fungsi momen:
\[ \mathbb{E}(Y) = \int y \cdot f(y; \theta) \, dy = \mu \]
Untuk distribusi yang termasuk dalam keluarga eksponensial, bentuk umum fungsi log-likelihood-nya adalah:
\[ \log f(y; \theta) = a(y) \cdot y - b(\theta) + c(\theta) \]
atau dapat pula dituliskan sebagai:
\[ \log f(y; \theta) = y\theta - b(\theta) + c(y) \]
Dengan notasi tersebut, maka ekspektasi \(\mathbb{U}(\theta)\) diperoleh dari turunan pertama:
\[ \mathbb{U}(\theta) = \frac{\partial \ell}{\partial \theta} = y- b'(\theta). \]
Dan ekspektasi turunan pertama:
\[ \mathbb{E} [U(\theta)] = \mathbb{E}[y - b'(\theta)] = \mu - b'(\theta) = 0 \]
Maka:
\[ \mu = b'(\theta) \]
Varians Turunan kedua:
\[ \frac{\partial^2 \ell}{\partial \theta^2} = -b''(\theta) \]
Sehingga:
\[ \text{Var}(Y) = b''(\theta) = \phi V(\mu) \]
Maximum Likelihood Estimation (MLE)
merupakan metode yang umum digunakan dalam statistika untuk mengestimasi parameter model dengan cara memaksimumkan kemungkinan (likelihood) bahwa data yang diamati diperoleh dari model yang dibentuk. Dengan kata lain, MLE bertujuan mencari nilai parameter yang membuat data yang diamati menjadi paling mungkin (most probable) muncul.
Prinsip Dasar
MLE bekerja berdasarkan prinsip bahwa nilai parameter terbaik adalah yang memaksimalkan fungsi likelihood \(L(\theta)\), atau lebih sering dalam praktik digunakan log-likelihood \(ℓ(\theta)=log L(\theta)\), karena bentuk log-likelihood biasanya lebih sederhana untuk dianalisis dan dioptimasi secara matematis.
Langkah-Langkah Umum
Proses estimasi parameter menggunakan MLE melibatkan dua langkah utama:
Menentukan turunan pertama dari fungsi log-likelihood terhadap parameter dan menyamakannya dengan nol. Ini bertujuan untuk menemukan titik stasioner, yaitu kandidat untuk maksimum atau minimum:
\[ \frac{\partial\ell(\theta)}{\partial \theta}=0 \]
Memeriksa turunan kedua untuk memastikan bahwa titik tersebut merupakan maksimum, bukan minimum:
\[ \frac {\partial^2\ell(\theta)}{\partial \theta^2} < 0 \]
Tantangan dalam GLM
Pada model Generalized Linear Model (GLM), fungsi log-likelihood seringkali memiliki bentuk yang kompleks dan tidak dapat diselesaikan secara analitik (tidak eksplisit). Oleh karena itu, pendekatan numerik diperlukan untuk menemukan estimasi parameter.
Metode Optimisasi: Newton-Raphson
Metode Newton-Raphson merupakan salah satu teknik optimisasi numerik yang paling umum digunakan untuk mencari estimasi parameter dalam statistik, khususnya dalam konteks Maximum Likelihood Estimation (MLE) untuk Generalized Linear Models (GLM).
Prinsip Dasar
Tujuan utama metode ini adalah untuk menemukan nilai parameter yang memaksimalkan fungsi log-likelihood. Prosesnya dilakukan secara iteratif dengan menggunakan informasi dari turunan pertama dan kedua dari fungsi log-likelihood.
Komponen Utama
Score Vector (Vektor Skor / Gradien):
Merupakan turunan pertama dari log-likelihood terhadap parameter, yaitu:
\[ U(\beta) = \frac{d\ell(\beta)}{d\beta} \]
Vektor ini menunjukkan arah kenaikan tercepat dari log-likelihood.
Hessian Matrix (Matriks Hessian)
Merupakan turunan kedua dari log-likelihood terhadap parameter, yaitu: \[
H(\beta) = \frac{d^2\ell(\beta)}{d\beta^2}
\]Matriks ini mencerminkan kelengkungan dari permukaan log-likelihood.
Prosedur Iteratif
Nilai parameter diperbarui menggunakan rumus iteratif:
\[ \beta^{(t+1)} = \beta^{(t)} - H^{-1}(\beta^{(t)}) U(\beta^{(t)}) \]
Artinya, nilai parameter pada iterasi berikutnya diperoleh dari nilai saat ini dikurangi hasil perkalian invers Hessian dengan vektor skor.
Fisher Scoring
Fisher Scoring merupakan bentuk modifikasi dari metode Newton-Raphson dalam optimasi parameter. Perbedaannya terletak pada penggunaan matriks informasi Fisher sebagai pengganti dari matriks Hessian. Matriks informasi Fisher adalah ekspektasi dari matriks Hessian, sehingga memberikan pendekatan yang lebih stabil secara numerik untuk estimasi parameter, terutama dalam konteks model-model statistik seperti GLM.
IRLS (Iteratively Reweighted Least Squares)
IRLS adalah pengembangan lebih lanjut dari Fisher Scoring yang secara khusus digunakan dalam model regresi seperti regresi logistik dan regresi Poisson. Metode ini mengiterasi prosedur regresi least square (kuadrat terkecil), namun dengan bobot yang diperbarui di setiap langkah. Hasil akhirnya menyerupai regresi kuadrat terkecil, namun telah disesuaikan untuk kasus di mana asumsi normalitas atau homoskedastisitas tidak terpenuhi, seperti dalam Generalized Linear Models.
Metode ini sangat berguna karena memungkinkan penerapan algoritma yang efisien dan konvergen secara cepat untuk berbagai jenis distribusi dalam keluarga eksponensial.
Implementasi Newton-Raphson
Statistik score ke-$j$: \[ U_i(\beta) = \frac{\partial \log L(\beta)}{\partial \beta_i} \]
Turunan kedua: \[ H_{ij}(\beta) = \frac{\partial^2 \log L(\beta)}{\partial \beta_i \partial \beta_j} \]
Taylor expansion: \[ U(\beta^*) \approx U(\beta) + H(\beta)(\beta^* - \beta) \]
Estimasi parameter: \[ \beta \approx \hat{\beta}^{(k)} - H^{-1}(\hat{\beta}^{(k)}) U(\hat{\beta}^{(k)}) \]
Diagnostik dalam Generalized Linear Model (GLM) bertujuan untuk menilai apakah model yang dibangun sudah sesuai dengan data dan asumsi yang mendasarinya. Evaluasi ini penting untuk memastikan keandalan hasil analisis.
Beberapa pendekatan yang umum digunakan dalam diagnostik model meliputi:
Uji formal, seperti deviance test atau goodness-of-fit test, untuk mengukur sejauh mana model mampu menjelaskan variabilitas dalam data.
Visualisasi grafis, misalnya dengan membandingkan nilai prediksi dari model terhadap nilai aktual (observasi), untuk melihat pola penyimpangan atau kesalahan sistematis dalam model.
Pendekatan ini membantu dalam mengidentifikasi potensi masalah seperti outlier, leverage tinggi, atau kesalahan spesifikasi model.
Statistik Devians • Mengukur apakah ada model lain yang lebih baik. • Nilai devians besar → model tidak cocok. • Devians adalah:
\[ D = 2 \sum \left[ y_i \log \left( \frac{y_i}{\hat{\mu}_i} \right) - (y_i - \hat{\mu}_i) \right] \] • Devians membandingkan model terhadap saturated model. • Devians kecil → model lebih cocok.
Statistik Chi-Kuadrat Pearson • Menguji apakah model lebih baik daripada tidak ada model sama sekali. • Statistik:
\[ \chi^2 =\frac{\sum (y_i - \hat{\mu}_i)^2}{\hat\mu_{i}} \]
• Jika signifkan → model lebih baik daripada tanpa model.
Catatan • Untuk data yang dikelompokkan, statistik devians dan chi-kuadrat Pearson mengikuti distribusi ChiSquare. • Untuk data tidak dikelompokkan, tidak mengikuti distribusi Chi-Square. • Devians diminimalkan oleh MLE → cocok digunakan untuk evaluasi model.
Analisis Residual • Residual adalah selisih antara observasi dengan prediksi. • Dapat digunakan untuk memeriksa penyimpangan sistematis. • Dapat diplot untuk menilai asumsi model.
Regresi logistik digunakan untuk memodelkan peluang kejadian variabel respons yang bersifat biner (0 atau 1) dengan mempertimbangkan satu atau lebih variabel prediktor. Estimasi parameter pada regresi logistik dilakukan melalui metode Maximum Likelihood Estimation (MLE), karena hubungan model terhadap parameter tidak bersifat linear.
Fungsi model logistik:
\[ \pi(x) = \frac{\exp(\beta_0 + \beta_1 x)}{1 + \exp(\beta_0 + \beta_1 x)} \]
Log-likelihood untuk \(n\) observasi:
\[ \ell(\beta) = \sum_{i=1}^n \left[y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i)\right] \]
Estimasi dengan Newton-Raphson
Metode Newton-Raphson merupakan teknik iteratif yang digunakan untuk menemukan estimasi parameter \(\beta\) yang paling optimal dengan memaksimalkan fungsi log-likelihood pada model regresi logistik. Proses ini melibatkan perhitungan turunan pertama dan kedua dari fungsi log-likelihood untuk memperbarui nilai parameter secara berulang hingga konvergen, sehingga diperoleh estimasi parameter yang paling sesuai dengan data.
Model regresi logistik untuk probabilitas:
\[ \pi = \frac{1}{1 + \exp(-X^\top \beta)} \]
Log-likelihood untuk \(n\) observasi:
\[ \ell(\beta) = \sum_{i=1}^n \left[y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i)\right] \]
Langkah-Langkah Newton-Raphson
Turunan Pertama (Score Function)
\[
U(\beta) = \frac{\partial \ell(\beta)}{\partial \beta} = X^\top (y - \pi)
\]
Turunan Kedua (Hessian Matrix)
\[
H(\beta) = -X^\top W X, \quad \text{dengan} \quad W = \text{diag}(\pi_i (1 - \pi_i))
\]
Iterasi Newton-Raphson
\[
\beta^{(t+1)} = \beta^{(t)} + (X^\top W^{(t)} X)^{-1} X^\top (y - \pi^{(t)})
\]
Estimasi MLE dengan Newton-Raphson (Manual di R)
# Data simulasi
set.seed(1)
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 # hasil estimasi akhir
## [,1]
## -1.516679
## x 2.155658
• Estimasi parameter pada model regresi logistik dilakukan dengan MLE. • Newton-Raphson adalah metode numerik yang digunakan untuk memaksimalkan log-likelihood. • Iterasi didasarkan pada turunan pertama (score) dan kedua (Hessian).
• Prosedur identik dengan IRLS (Iteratively Reweighted Least Squares) dalam implementasi GLM.
Inferensi Parameter
1. Uji Wald
Tujuan Uji Wald
Uji Wald digunakan untuk menguji signifikansi parameter \(\beta_j\) dalam model regresi logistik dengan hipotesis:
- \(H_0: \beta_j = 0\)
- \(H_a: \beta_j \neq 0\)
Teori Wald Test
Berdasarkan teori estimasi Maximum Likelihood Estimation (MLE), estimator \(\hat{\beta}_j\) mendekati distribusi normal:
\[
\hat{\beta}_j \sim N(\beta_j, \mathrm{Var}(\hat{\beta}_j))
\]
Jika \(H_0\) benar (yaitu \(\beta_j = 0\)), maka statistik:
\[
Z = \frac{\hat{\beta}_j}{\sqrt{\mathrm{Var}(\hat{\beta}_j)}} \sim N(0,1)
\]
Statistik Wald yang digunakan adalah:
\[
W = Z^2 = \left(\frac{\hat{\beta}_j}{\sqrt{\mathrm{Var}(\hat{\beta}_j)}}\right)^2 \sim \chi^2_1
\]
Simulasi dan Uji Wald Langkah demi Langkah
set.seed(123)
n <- 100
x <- rnorm(n)
log_odds <- -0.5 + 1.2 * x
p <- 1 / (1 + exp(-log_odds))
y <- rbinom(n, 1, p)
data <- data.frame(x, y)
model <- glm(y ~ x, data = data, family = binomial)
summary(model)
##
## Call:
## glm(formula = y ~ x, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.3097 0.2296 -1.349 0.177
## x 1.2663 0.3080 4.111 3.94e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 137.99 on 99 degrees of freedom
## Residual deviance: 114.76 on 98 degrees of freedom
## AIC: 118.76
##
## Number of Fisher Scoring iterations: 4
Langkah 1: Ambil nilai koefsien dan SE
beta_hat <- coef(model)["x"]
se_beta <- summary(model)$coefficients["x", "Std. Error"]
Langkah 2: Hitung Statistik Z
Z <- beta_hat / se_beta
Z
## x
## 4.110965
Langkah 3: Hitung Statistik Wald
Wald_stat <- Z^2
Wald_stat
## x
## 16.90003
Langkah 4: Hitung p-value
p_value <- 1 - pchisq(Wald_stat, df = 1)
p_value
## x
## 3.940095e-05
Interpretasi • Jika p-value < 0.05, maka koefsien signifkan → variabel prediktor berpengaruh. • Jika p-value > 0.05, maka tidak ada cukup bukti untuk menolak \(H_0\). Kesimpulan Uji Wald didasarkan pada rasio antara estimasi parameter dan standar error-nya. Dengan menaikkan nilai Z menjadi kuadrat (Z²), kita memperoleh distribusi Chi-Square untuk pengujian hipotesis parameter individual dalam model regresi logistik
2. Uji Likelihood Ratio (Chi-Square) Bandingkan model penuh dengan model tanpa prediktor.
# 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 137.99
## 2 98 114.76 1 23.229 1.438e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Evaluasi Kebaikan Model 1. Akaike Information Criterion (AIC) Semakin kecil AIC, semakin baik model.
AIC(model)
## [1] 118.7598
Bayesian Information Criterion (BIC) Alternatif terhadap AIC, menghukum kompleksitas model.
BIC(model)
## [1] 123.9701
• Estimasi regresi logistik dilakukan dengan MLE melalui iterasi Newton-Raphson. • Inferensi parameter dapat dilakukan dengan uji Wald dan likelihood ratio (uji Chi-Square). • AIC dan BIC digunakan untuk mengevaluasi kompleksitas dan kecocokan model.
Contoh Regresi Logistik Multiple Berikut adalah contoh analisis regresi logistik multiple lengkap dalam format R Markdown, menggunakan dataset mtcars dari R. Kita akan memodelkan kemungkinan mobil memiliki efsiensi bahan bakar tinggi (mpg tinggi) berdasarkan beberapa prediktor. Kita akan: Menggunakan regresi logistik
Menguji signifkansi model dengan statistik G² (Likelihood Ratio Test)
Melakukan uji Wald
Menginterpretasi Odds Ratio
1. Data dan Transformasi Gunakan data bawaan R Transformasi variabel mpg menjadi variabel biner: 1 = irit, 0 = boros
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
2. Model Regresi Logistik Fit model logistik multipel
model_logit <- glm(mpg_high ~ wt + hp + am, data = mtcars, family = binomial)
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
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
3. Uji Signifkansi Model (G² atau Likelihood Ratio Test) Bandingkan model penuh vs model null
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
4. Statistik Wald untuk Koefsien Individu
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
5. Interpretasi Odds Ratio Odds Ratio dan Confdence Interval
# 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
6. Goodness of Fit Hosmer-Lemeshow Test
hoslem.test(mtcars$mpg_high, fitted(model_logit), g=10)
## Warning in hoslem.test(mtcars$mpg_high, fitted(model_logit), g = 10): The data
## did not allow for the requested number of bins.
##
## 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
7. Kesimpulan Model logistik menunjukkan bahwa variabel wt dan am berpengaruh signifkan terhadap efsiensi bahan bakar (mpg_high). Odds ratio memberikan pemahaman intuitif terhadap kekuatan dan arah pengaruh prediktor.
Dokumen ini menjelaskan cara menghitung statistik G² (likelihood ratio test) secara manual pada regresi logistik biner.
Rumus Umum
\[
G^2 = -2(\ell_0 - \ell_1)
\] - \(\ell_0\) : log-likelihood dari model null (tanpa prediktor)
- \(\ell_1\) : log-likelihood dari model full (dengan prediktor)
Fungsi Log-Likelihood
\[ \ell = \sum_{i=1}^n \left[ y_i \log(\hat{p}_i) + (1 - y_i) \log(1 - \hat{p}_i) \right] \]
Contoh Data
# Data dummy
data <- data.frame(
y = c(1, 0, 1, 0),
x1 = c(2, 1, 3, 2)
)
Model Null (Intercept Saja)
# Probabilitas tetap
p_null <- mean(data$y) # 0.5
loglik_null <- sum(data$y * log(p_null) + (1 - data$y) * log(1 - p_null))
loglik_null
## [1] -2.772589
Model Full (Dengan Prediktor)
# Misal hasil estimasi model: beta0 = -1, beta1 = 1
eta <- -1 + 1 * data$x1
p_hat <- 1 / (1 + exp(-eta))
loglik_full <- sum(data$y * log(p_hat) + (1 - data$y) * log(1 - p_hat))
loglik_full
## [1] -2.446599
Hitung \(G^2\)
G2 <- -2 * (loglik_null - loglik_full)
G2
## [1] 0.6519803
Interpretasi • Bandingkan nilai \(G^2\) dengan distribusi \(\chi^2\) dengan df = jumlah prediktor. • Jika p-value < 0.05 → model dengan prediktor signifkan lebih baik.
pchisq(G2, df = 1, lower.tail = FALSE)
## [1] 0.4194056
Dokumen ini menjelaskan cara menghitung statistik G² (likelihood ratio test) secara manual dalam regresi logistik biner.
Rumus Umum
\[
G^2 = -2(\ell_0 - \ell_1)
\] - \(\ell_0\): log-likelihood dari model null (model tanpa prediktor)
- \(\ell_1\): log-likelihood dari model full (model dengan prediktor)
Konteks: Regresi Logistik Biner
Model regresi logistik untuk probabilitas \(\pi_i\) dari hasil 1 (misalnya sukses, positif, dsb) adalah:
\[ \log \left( \frac{\pi_i}{1 - \pi_i} \right) = \eta_i = \beta_0 + \beta_1 x_{1i} + \cdots + \beta_p x_{pi} \]
Fungsi likelihood untuk \(n\) observasi adalah:
\[ L(\beta) = \prod_{i=1}^n \pi_i^{y_i} (1 - \pi_i)^{1 - y_i} \]
Log-likelihood-nya adalah:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \]
Langkah-langkah Menghitung \(ℓ_0\) dan \(ℓ_1\) 1. Hitung probabilitas \(p_i\) dari model null dan full 2. Gunakan rumus log-likelihood di atas untuk masing-masing model
Contoh Kasus Mini
Misalkan kita memiliki data berikut:
| y | x1 |
|---|---|
| 1 | 2 |
| 0 | 1 |
| 1 | 3 |
| 0 | 2 |
Model Null
Model null mengasumsikan probabilitas konstan \(\hat{\pi} = \frac{1 + 0 + 1 + 0}{4} = 0.5\).
Log-likelihood model null dihitung sebagai:
\[ \ell_0 = \sum_{i=1}^4 \left[ y_i \log(0.5) + (1 - y_i) \log(0.5) \right] = 4 \times \log(0.5) = -2.7726 \]
2. Model Full
Misal hasil estimasi parameter adalah:
\[
\hat{\beta}_0 = -1, \quad \hat{\beta}_1 = 1
\]
Probabilitas prediksi dihitung dengan fungsi logistik:
\[
\hat{p} = \frac{1}{1 + \exp[-(\hat{\beta}_0 + \hat{\beta}_1 x_1)]}
\]
| x1 | y | Linear predictor \(\eta = \hat{\beta}_0 + \hat{\beta}_1 x_1\) | \(\hat{p}\) | Komponen log-likelihood \ |
|---|---|---|---|---|
| 2 | 1 | 1 | 0.7311 | \(\log(0.7311) = -0.3133\) \ |
| 1 | 0 | 0 | 0.5000 | \(\log(1 - 0.5) = -0.6931\) \ |
| 3 | 1 | 2 | 0.8808 | \(\log(0.8808) = -0.1269\) \ |
| 2 | 0 | 1 | 0.7311 | \(\log(1 - 0.7311) = -1.3133\) \ |
Jumlah log-likelihood model penuh:
\[
\ell_1 = -0.3133 + (-0.6931) + (-0.1269) + (-1.3133) = -2.4466
\]
3. Hitung Statistik G²
\[ G^2 = -2(\ell_0 - \ell_1) = -2(-2.7726 + 2.4466) = 0.652 \]
Implementasi di R
# Data dummy
data <- data.frame(
y = c(1, 0, 1, 0),
x1 = c(2, 1, 3, 2)
)
# Model null
p_null <- mean(data$y)
loglik_null <- sum(data$y * log(p_null) + (1 -data$y) * log(1 - p_null))
# Model full (asumsikan �0 = -1, �1 = 1)
eta <- -1 + data$x1
p_hat <- 1 / (1 + exp(-eta))
loglik_full <- sum(data$y * log(p_hat) + (1 - data$y) * log(1 - p_hat))
# Hitung G²
G2 <- -2 * (loglik_null - loglik_full)
# Uji signifikansi
p_value <- pchisq(G2, df = 1, lower.tail = FALSE)
Interpretasi Statistik G²
Nilai statistik G² menunjukkan perbedaan antara model null (tanpa prediktor) dan model full (dengan prediktor).
Semakin besar nilai G², semakin signifikan perbedaan antara kedua model tersebut.
Artinya, model dengan prediktor dianggap jauh lebih baik dalam menjelaskan data dibanding model null.
Untuk menentukan signifikansi, nilai G² dibandingkan dengan distribusi chi-kuadrat (\(\chi^2\)) dengan derajat kebebasan (df) sama dengan jumlah prediktor dalam model.
Jika \(G^2\) lebih besar dari nilai kritis \(\chi^2\) pada tingkat signifikansi tertentu (misal 0.05), maka hipotesis nol (model null) ditolak, dan model dengan prediktor dianggap signifikan.
Metode Estimasi dan Inferensi pada Regresi Poisson secara lebih rinci
Model regresi Poisson merupakan pendekatan statistik yang dirancang khusus untuk memodelkan data berupa hitungan (count data), yaitu variabel respons yang menunjukkan jumlah kejadian dalam suatu interval waktu atau ruang tertentu. Dalam model ini, variabel respons diasumsikan mengikuti distribusi Poisson yang memiliki sifat unik, seperti varians yang sama dengan rata-rata. Untuk menentukan nilai parameter model, digunakan metode estimasi maksimum likelihood (Maximum Likelihood Estimation atau MLE), yang berusaha menemukan parameter yang paling mungkin menghasilkan data yang diamati. Setelah parameter diestimasi, tahap inferensi dilakukan untuk menguji signifikansi parameter dan kecocokan model. Beberapa metode inferensi yang umum digunakan adalah uji Wald dan uji rasio likelihood (Likelihood Ratio Test), yang membantu menilai apakah variabel prediktor memberikan kontribusi signifikan terhadap model. Melalui proses ini, peneliti dapat membuat kesimpulan yang valid tentang hubungan antara variabel prediktor dan variabel respons count dalam konteks regresi Poisson.
Model Regresi Poisson
Fungsi distribusi Poisson:
\[ P(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!} \]
Model regresi Poisson:
\[ \log(\lambda) = \mathbf{x}^\top \boldsymbol{\beta} \]
Estimasi Parameter (MLE)
Fungsi log-likelihood:
\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^n \left[ y_i \log(\lambda_i) - \lambda_i - \log(y_i!) \right] \]
Dengan:
\[ \lambda_i = \exp(\mathbf{x}_i^\top \boldsymbol{\beta}) \]
Estimasi dilakukan dengan metode iterasi (IRLS)
Estimasi parameter pada model regresi Poisson dilakukan menggunakan metode iteratif, khususnya melalui pendekatan Iteratively Reweighted Least Squares (IRLS). Metode ini merupakan cara numerik yang digunakan untuk memperoleh nilai parameter maksimum likelihood secara bertahap dengan memperbarui bobot dan nilai prediksi hingga konvergen. Pendekatan IRLS ini memungkinkan estimasi parameter dilakukan secara manual tanpa mengandalkan fungsi otomatis seperti glm() pada perangkat lunak statistik. Dengan demikian, proses ini memberikan pemahaman yang lebih mendalam tentang mekanisme estimasi dalam model regresi Poisson serta fleksibilitas dalam penyesuaian metode sesuai kebutuhan analisis.
Tahap Estimasi Model Regresi Poisson
Tahap 1: Definisikan Model
Model regresi Poisson dinyatakan sebagai:
\[
\log(\lambda) = \mathbf{x}^\top \boldsymbol{\beta} \quad \text{sehingga} \quad \lambda = \exp(\mathbf{x}^\top \boldsymbol{\beta})
\]
Tahap 2: Mencari Log-likelihood yang Dimaksimalkan
Fungsi log-likelihood:
\[
\ell(\boldsymbol{\beta}) = \sum_{i=1}^n \left[ y_i \log(\lambda_i) - \lambda_i - \log(y_i!) \right]
\]
Tahap 3: Formulasi Iteratif (Fisher Scoring / IRLS)
Estimasi parameter dilakukan dengan iterasi:
\[
\boldsymbol{\beta}^{(t+1)} = (X^\top W^{(t)} X)^{-1} X^\top W^{(t)} \mathbf{z}^{(t)}
\]
Dengan:
- \(W = \mathrm{diag}(\lambda_i)\)
- \(\mathbf{z} = \eta^{(t)} + (y - \lambda^{(t)}) / \lambda^{(t)}\)
- \(\eta = \log(\lambda) = X \boldsymbol{\beta}\)
Simulasi Data
set.seed(123)
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)
data<-data.frame(x=x, y=y)
IRLS Manual Step-by-Step
# Inisialisasi
beta <- c(0, 0)
tol <- 1e-6
max_iter <- 100
for (i in 1:max_iter) {
eta <- X %*% beta
lambda <- exp(eta)
W <- diag(as.numeric(lambda))
z <- eta + (y - lambda) / lambda
beta_new <- solve(t(X) %*% W %*% X) %*% t(X) %*% W %*% z
if (sum(abs(beta_new - beta)) < tol) {
cat("Konvergen pada iterasi ke-", i, "\n")
break
}
beta <- beta_new
}
## Konvergen pada iterasi ke- 8
beta # hasil estimasi
## [,1]
## 0.4494951
## x 0.8600048
Perbandingan dengan glm()
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.44950 0.08872 5.066 4.05e-07 ***
## x 0.86000 0.07463 11.523 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 245.05 on 99 degrees of freedom
## Residual deviance: 106.78 on 98 degrees of freedom
## AIC: 325.76
##
## Number of Fisher Scoring iterations: 5
• IRLS memberikan cara iteratif untuk menghitung estimasi MLE dalam regresi Poisson. • Hasil manual IRLS sangat mendekati hasil glm() dari R. • Metode ini memberikan pemahaman mendalam atas mekanisme di balik fungsi glm().
Pengujian hipotesis Uji Wald
Uji Wald digunakan untuk menguji hipotesis nol pada parameter model, yaitu:
\[ H_0: \beta = 0 \]
# Koefisien dan standar error
coef_val <- coef(model)[2]
se_val <- summary(model)$coefficients[2, 2]
wald_z <- coef_val / se_val
wald_chisq <- wald_z^2
p_value <- 1 - pchisq(wald_chisq, df = 1)
cat("Z:", wald_z, "\nChi-Square:", wald_chisq, "\np-value:", p_value)
## Z: 4.110965
## Chi-Square: 16.90003
## p-value: 3.940095e-05
Uji Likelihood Ratio (Chi-Square)
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 245.05
## 2 98 114.76 1 130.29 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Evaluasi Model (AIC & BIC)
AIC(model)
## [1] 118.7598
BIC(model)
## [1] 123.9701
Estimasi parameter dalam regresi Poisson diperoleh melalui pendekatan Maximum Likelihood Estimation (MLE), yang bertujuan memaksimalkan kemungkinan terjadinya data yang diamati.
Untuk melakukan pengujian hipotesis terhadap parameter model, digunakan dua metode utama, yaitu Uji Wald dan Likelihood Ratio Test, guna menilai signifikansi kontribusi variabel prediktor.
Dalam proses evaluasi dan pemilihan model yang paling sesuai, digunakan kriteria informasi seperti AIC (Akaike Information Criterion) dan BIC (Bayesian Information Criterion), yang mempertimbangkan keseimbangan antara kualitas model dan kompleksitasnya.
Pendahuluan
Penelitian ini bertujuan untuk menganalisis hubungan antara status merokok, jenis kelamin, dan biaya asuransi kesehatan berdasarkan data individu dari Amerika Serikat. Analisis dilakukan menggunakan metode statistik untuk data kategori, termasuk tabel kontingensi, uji chi-square, dan uji Cochran-Mantel-Haenszel (CMH).
Dataset diambil dari: Kaggle - Medical Cost Personal Dataset
Deskripsi Data
Dataset terdiri dari 1.338 observasi dan 7 variabel, yaitu: age, sex, bmi, children, smoker, region, dan charges.
data1 <- read.csv("C:\\Users\\inspi\\Downloads\\insurance.csv")
head(data1)
## age sex bmi children smoker region charges
## 1 19 female 27.900 0 yes southwest 16884.924
## 2 18 male 33.770 1 no southeast 1725.552
## 3 28 male 33.000 3 no southeast 4449.462
## 4 33 male 22.705 0 no northwest 21984.471
## 5 32 male 28.880 0 no northwest 3866.855
## 6 31 female 25.740 0 no southeast 3756.622
Tabel Kontingensi
Tabel kontingensi dua arah antara sex (jenis kelamin) dan smoker (status merokok):
tab_sex_smoker <- table(data1$sex, data1$smoker)
tab_sex_smoker
##
## no yes
## female 547 115
## male 517 159
Tabel Kontingensi dan Uji Chi-Square
Jenis Kelamin vs Status Merokok
Hitung proporsi, odds ratio, dan uji chi-square untuk melihat ada tidaknya hubungan antara jenis kelamin dan status perokok.
library(gmodels)
## Warning: package 'gmodels' was built under R version 4.3.3
## Registered S3 method overwritten by 'gdata':
## method from
## reorder.factor DescTools
tab_sex_smoker <- table(data1$sex, data1$smoker)
tab_sex_smoker
##
## no yes
## female 547 115
## male 517 159
CrossTable(data1$sex, data1$smoker, chisq = TRUE, prop.chisq = FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 1338
##
##
## | data1$smoker
## data1$sex | no | yes | Row Total |
## -------------|-----------|-----------|-----------|
## female | 547 | 115 | 662 |
## | 0.826 | 0.174 | 0.495 |
## | 0.514 | 0.420 | |
## | 0.409 | 0.086 | |
## -------------|-----------|-----------|-----------|
## male | 517 | 159 | 676 |
## | 0.765 | 0.235 | 0.505 |
## | 0.486 | 0.580 | |
## | 0.386 | 0.119 | |
## -------------|-----------|-----------|-----------|
## Column Total | 1064 | 274 | 1338 |
## | 0.795 | 0.205 | |
## -------------|-----------|-----------|-----------|
##
##
## Statistics for All Table Factors
##
##
## Pearson's Chi-squared test
## ------------------------------------------------------------
## Chi^2 = 7.765921 d.f. = 1 p = 0.005324114
##
## Pearson's Chi-squared test with Yates' continuity correction
## ------------------------------------------------------------
## Chi^2 = 7.392911 d.f. = 1 p = 0.006548144
##
##
Interpretasi: Terdapat hubungan yang signifikan antara jenis kelamin dan status merokok (p < 0.05).
Status Merokok vs Biaya Asuransi
Kategorisasi biaya menjadi: Rendah, Sedang, Tinggi.
data1$biaya_kat <- cut(data1$charges,
breaks = quantile(data1$charges, probs = c(0, 0.33, 0.66, 1)),
labels = c("Rendah", "Sedang", "Tinggi"), include.lowest = TRUE)
tab_smoker_charges <- table(data1$smoker, data1$biaya_kat)
tab_smoker_charges
##
## Rendah Sedang Tinggi
## no 442 441 181
## yes 0 0 274
library(gmodels)
CrossTable(data1$smoker, data1$biaya_kat, chisq = TRUE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | Chi-square contribution |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 1338
##
##
## | data1$biaya_kat
## data1$smoker | Rendah | Sedang | Tinggi | Row Total |
## -------------|-----------|-----------|-----------|-----------|
## no | 442 | 441 | 181 | 1064 |
## | 23.309 | 23.256 | 90.368 | |
## | 0.415 | 0.414 | 0.170 | 0.795 |
## | 1.000 | 1.000 | 0.398 | |
## | 0.330 | 0.330 | 0.135 | |
## -------------|-----------|-----------|-----------|-----------|
## yes | 0 | 0 | 274 | 274 |
## | 90.514 | 90.309 | 350.917 | |
## | 0.000 | 0.000 | 1.000 | 0.205 |
## | 0.000 | 0.000 | 0.602 | |
## | 0.000 | 0.000 | 0.205 | |
## -------------|-----------|-----------|-----------|-----------|
## Column Total | 442 | 441 | 455 | 1338 |
## | 0.330 | 0.330 | 0.340 | |
## -------------|-----------|-----------|-----------|-----------|
##
##
## Statistics for All Table Factors
##
##
## Pearson's Chi-squared test
## ------------------------------------------------------------
## Chi^2 = 668.6739 d.f. = 2 p = 6.299602e-146
##
##
##
Interpretasi: Terdapat hubungan yang sangat signifikan antara status merokok dan kategori biaya asuransi.
Analisis
Uji Cochran-Mantel-Haenszel (CMH)
Uji ini dilakukan untuk mengetahui apakah hubungan antara status merokok dan kanker (proksi dari biaya tinggi) tetap konsisten setelah dikendalikan oleh usia.
Hipotesis:
data_cmh <- array(c(10, 40, 5, 45,
40, 10, 10, 40,
50, 0, 20, 30),
dim = c(2, 2, 3),
dimnames = list(
Merokok = c("Ya", "Tidak"),
KankerParu = c("Ya", "Tidak"),
Usia = c("Muda", "Dewasa", "Tua")
))
mantelhaen.test(data_cmh)
##
## Mantel-Haenszel chi-squared test with continuity correction
##
## data: data_cmh
## Mantel-Haenszel X-squared = 69.022, df = 1, p-value < 2.2e-16
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 6.010313 23.297918
## sample estimates:
## common odds ratio
## 11.83333
Hasil uji CMH:
- \(X²\) = 69.022
- df = 1 - p-value < 2.2e-16
- Common Odds Ratio = 11.83 (95% CI: 6.01 – 23.30)
Interpretasi: Setelah mengendalikan variabel usia, terdapat asosiasi yang sangat signifikan antara merokok dan kejadian kanker. Odds ratio menunjukkan bahwa perokok memiliki kemungkinan terkena kanker lebih dari 11 kali lipat dibandingkan bukan perokok.
Kesimpulan:
Analisis Tambahan: Merokok dan Biaya Asuransi
Melihat pengaruh status merokok terhadap kategori biaya:
tab_smoker_charges <- table(data1$smoker, data1$biaya_kat)
tab_smoker_charges
##
## Rendah Sedang Tinggi
## no 442 441 181
## yes 0 0 274
CrossTable(data1$smoker, data1$biaya_kat, chisq = TRUE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | Chi-square contribution |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 1338
##
##
## | data1$biaya_kat
## data1$smoker | Rendah | Sedang | Tinggi | Row Total |
## -------------|-----------|-----------|-----------|-----------|
## no | 442 | 441 | 181 | 1064 |
## | 23.309 | 23.256 | 90.368 | |
## | 0.415 | 0.414 | 0.170 | 0.795 |
## | 1.000 | 1.000 | 0.398 | |
## | 0.330 | 0.330 | 0.135 | |
## -------------|-----------|-----------|-----------|-----------|
## yes | 0 | 0 | 274 | 274 |
## | 90.514 | 90.309 | 350.917 | |
## | 0.000 | 0.000 | 1.000 | 0.205 |
## | 0.000 | 0.000 | 0.602 | |
## | 0.000 | 0.000 | 0.205 | |
## -------------|-----------|-----------|-----------|-----------|
## Column Total | 442 | 441 | 455 | 1338 |
## | 0.330 | 0.330 | 0.340 | |
## -------------|-----------|-----------|-----------|-----------|
##
##
## Statistics for All Table Factors
##
##
## Pearson's Chi-squared test
## ------------------------------------------------------------
## Chi^2 = 668.6739 d.f. = 2 p = 6.299602e-146
##
##
##
Kesimpulan
Ringkasan Temuan
Penjelasan Akhir
Dari seluruh hasil pengujian, dapat disimpulkan bahwa status merokok merupakan faktor yang sangat menentukan dalam peningkatan risiko penyakit dan biaya asuransi kesehatan. Uji CMH memberikan keyakinan tambahan bahwa hubungan tersebut tidak hanya terjadi secara keseluruhan, tetapi juga konsisten di seluruh kategori usia.
Analisis ini menegaskan pentingnya pengendalian faktor perancu seperti usia ketika mengevaluasi asosiasi dalam data kategori, dan menunjukkan bagaimana metode statistik seperti uji chi-square dan CMH dapat memberikan wawasan yang lebih dalam terhadap hubungan antar variabel.
Regresi logistik adalah salah satu teknik analisis statistik yang digunakan untuk memodelkan hubungan antara variabel respons biner (yang hanya memiliki dua kategori, seperti “ya” dan “tidak”) dengan satu atau lebih variabel prediktor. Dalam praktiknya, variabel prediktor yang digunakan dapat memiliki berbagai jenis skala pengukuran, antara lain:
Nominal: Merupakan variabel kategori tanpa urutan logis antar kategorinya. Variabel ini hanya berfungsi sebagai pembeda. Contohnya adalah jenis kelamin (laki-laki, perempuan). Untuk keperluan analisis regresi logistik, variabel nominal biasanya dikonversi menjadi variabel dummy, seperti: Perempuan = 1, Laki-laki = 0.
Ordinal: Jenis variabel yang memiliki urutan logis antar kategori, tetapi selisih antar kategorinya tidak harus sama. Contohnya adalah jenjang pendidikan (SMA < Sarjana < Master < Doktor). Dalam analisis regresi logistik, variabel ordinal dapat ditangani dengan dua pendekatan:
Diperlakukan sebagai nominal, dengan membuat variabel dummy untuk tiap kategori.
Atau diperlakukan seperti variabel interval atau rasio dengan memberikan skor numerik yang mencerminkan urutan (misalnya, SMA = 1, Sarjana = 2, dan seterusnya).
Rasio: Merupakan variabel numerik kontinu yang memiliki nol mutlak dan rasio yang bermakna. Contoh dari variabel rasio adalah pendapatan per bulan (dalam juta rupiah). Variabel jenis ini dapat langsung digunakan dalam model regresi logistik tanpa memerlukan transformasi tambahan.
Kita membuat dataset simulasi dengan 500 observasi.
# Set seed untuk reprodusibilitas
set.seed(123)
# 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)
# Hitung probabilitas logistik
logit_p <- -2 +
0.5 * (gender == "Female") +
0.8 * as.numeric(factor(education, levels = c("HighSchool", "Bachelor", "Master", "PhD"), ordered = TRUE)) +
0.03 * income
# Konversi ke probabilitas
p <- 1 / (1 + exp(-logit_p))
# Simulasi variabel biner (misalnya sukses atau tidak)
success <- rbinom(n, 1, p)
# Buat data frame
library(tibble)
sim_data <- tibble(success, gender, education, income)
# Tampilkan data awal
head(sim_data)
## # A tibble: 6 × 4
## success gender education income
## <int> <chr> <chr> <dbl>
## 1 1 Male HighSchool 41.0
## 2 0 Male HighSchool 35.1
## 3 1 Male HighSchool 65.4
## 4 1 Female HighSchool 61.3
## 5 0 Male HighSchool 27.4
## 6 1 Female HighSchool 48.6
Interpretasi: Dataset berisi 500 observasi dengan variabel gender, pendidikan, income, dan status keberhasilan.
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 129 45.8
## 2 1 371 51.4
Interpretasi: Distribusi jumlah sukses dan tidak sukses, serta rata-rata pendapatan pada masing-masing grup.
# Set seed untuk reprodusibilitas
set.seed(123)
# 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)
# Hitung logit probabilitas
logit_p <- -2 +
0.5 * (gender == "Female") +
0.8 * as.numeric(factor(education, levels = c("HighSchool", "Bachelor", "Master", "PhD"), ordered = TRUE))+
0.03 * income
# Konversi logit ke probabilitas
p <- 1 / (1 + exp(-logit_p))
# Simulasi respons biner
success <- rbinom(n, 1, p)
# Gabungkan ke dalam data frame (tibble)
library(tibble)
sim_data <- tibble(success, gender, education, income)
# Lihat 6 baris pertama
head(sim_data)
## # A tibble: 6 × 4
## success gender education income
## <int> <chr> <chr> <dbl>
## 1 1 Male HighSchool 41.0
## 2 0 Male HighSchool 35.1
## 3 1 Male HighSchool 65.4
## 4 1 Female HighSchool 61.3
## 5 0 Male HighSchool 27.4
## 6 1 Female HighSchool 48.6
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.831544 0.402350 -2.067 0.038761 *
## genderMale -0.461352 0.222030 -2.078 0.037720 *
## educationBachelor 1.080520 0.254757 4.241 2.22e-05 ***
## educationMaster 1.731202 0.335986 5.153 2.57e-07 ***
## educationPhD 2.089672 0.552991 3.779 0.000158 ***
## income 0.028489 0.007404 3.848 0.000119 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 570.95 on 499 degrees of freedom
## Residual deviance: 505.95 on 494 degrees of freedom
## AIC: 517.95
##
## Number of Fisher Scoring iterations: 4
Keterangan: Model menggunakan education sebagai variabel dummy, baseline “HighSchool”. Setiap koefsien membandingkan kategori terhadap baseline.
Interpretasi Koefsien
Intercept (+0.165503)
Ini adalah log-odds dasar untuk individu berjenis kelamin Female, berpendidikan HighSchool, dan memiliki income = 0.
Tidak signifkan (p = 0.707085), artinya baseline ini tidak berbeda secara signifkan dari probabilitas 50%.
Odds Ratio = 1.18: Peluang sukses sedikit lebih besar daripada baseline, namun tidak signifkan.
genderMale (-0.524415)
Individu Male memiliki log-odds sukses yang lebih rendah sebesar 0.5 dibandingkan Female (referensi).
p = 0.027035 (signifkan di level 5%), menunjukkan bahwa ada indikasi laki-laki memiliki peluang sukses yang lebih rendah dibandingkan perempuan.
Odds Ratio = 0.59: Peluang sukses laki-laki sekitar 59% dari peluang sukses perempuan.
educationBachelor (-1.022694)
Individu dengan pendidikan Bachelor memiliki log-odds sukses yang lebih rendah sebesar -1.023 dibandingkan dengan HighSchool.
p = 0.0000 (sangat signifkan), berarti pendidikan Bachelor justru dikaitkan dengan probabilitas sukses yang lebih rendah dibanding HighSchool.
Odds Ratio = 0.36: Peluang sukses individu Bachelor hanya 36% dari peluang individu HighSchool.
educationMaster (+2.087935)
Individu dengan pendidikan Master memiliki log-odds sukses lebih tinggi sebesar 2.087935 dibanding HighSchool.
p = 0.0007 (signifkan), menunjukkan pendidikan Master meningkatkan peluang sukses dibanding HighSchool.
Odds Ratio = 8.07: Peluang sukses individu Master sekitar 8 kali lebih besar dibanding individu HighSchool. educationPhD (+1.155966)
Individu dengan pendidikan PhD memiliki log-odds sukses lebih tinggi sebesar 1.16 dibanding HighSchool.
p = 0.021804 (signifkan), menunjukkan pendidikan PhD meningkatkan peluang sukses secara signifkan dibanding HighSchool.
Odds Ratio = 3.18: Peluang sukses individu PhD sekitar 3 kali lebih besar dibanding individu HighSchool.
income (+0.0307)
Setiap kenaikan 1 unit income (misal, 1 juta), meningkatkan log-odds sukses sebesar 0.0307.
p = 0.000115 (sangat signifkan), artinya pendapatan berhubungan positif dengan peluang sukses.
Odds Ratio = 1.031: Setiap tambahan 1 juta meningkatkan peluang sukses sekitar 3.1%.
Interpretasi Goodness-of-Fit
Null deviance (551.08): Deviance model tanpa prediktor.
Residual deviance (502.90): Deviance model dengan prediktor. Penurunan dari null deviance ke residual deviance menunjukkan model membawa informasi yang cukup baik.
AIC (459.21): Digunakan untuk membandingkan model: semakin kecil AIC, semakin baik model dalam menyeimbangkan goodness-of-fit dan kompleksitas.
Signifkansi Model
Variabel income dan education (Master dan PhD) signifkan meningkatkan peluang sukses.
Variabel gender menunjukkan tren, dan signifkan pada taraf 5%.
Pendidikan Bachelor justru diasosiasikan dengan penurunan peluang sukses dibandingkan HighSchool dalam data ini, yang mungkin terjadi akibat struktur data simulasi.
Kesimpulan Praktis
Income dan tingkat pendidikan yang lebih tinggi (Master dan PhD) merupakan prediktor kuat untuk peluang sukses.
Gender berpotensi berpengaruh tetapi perlu data tambahan untuk konfrmasi.
Model cukup baik dalam memprediksi dibandingkan model null, namun ada ruang untuk peningkatan dengan mungkin menambahkan variabel lain.
# Konversi education ke numerik dan jalankan regresi logistik
library(dplyr)
sim_data_numeric <- sim_data %>%
mutate(
education_numeric = case_when(
education == "HighSchool" ~ 1,
education == "Bachelor" ~ 2,
education == "Master" ~ 3,
education == "PhD" ~ 4
)
)
# Jalankan model regresi logistik
model_numeric <- glm(success ~ gender + education_numeric + income,
data = sim_data_numeric,
family = binomial)
# Tampilkan ringkasan model
summary(model_numeric)
##
## Call:
## glm(formula = success ~ gender + education_numeric + income,
## family = binomial, data = sim_data_numeric)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.582153 0.452056 -3.500 0.000465 ***
## genderMale -0.468967 0.220701 -2.125 0.033595 *
## education_numeric 0.836119 0.135331 6.178 6.48e-10 ***
## income 0.028165 0.007354 3.830 0.000128 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 570.95 on 499 degrees of freedom
## Residual deviance: 507.66 on 496 degrees of freedom
## AIC: 515.66
##
## Number of Fisher Scoring iterations: 4
Interpretasi: Model menggunakan education sebagai angka bertingkat 1–4. Koefsien education_numeric mengukur efek kenaikan satu tingkat pendidikan terhadap peluang sukses.
Perbandingan Model
Keterangan:
Model dengan nilai AIC lebih kecil lebih disukai. Membandingkan mana yang lebih baik: treat education sebagai nominal atau numeric.
Interpretasi Koefsien
Intercept (-0.658626)
Ini adalah log-odds dasar untuk individu Female, berpendidikan HighSchool (education_numeric = 1), dan income = 0.
Tidak signifkan (p = 0.153931), artinya baseline ini tidak berbeda secara signifkan dari probabilitas 50%.
Odds Ratio = 0.518: Peluang sukses dasar lebih kecil dari baseline, namun tidak signifkan.
genderMale (-0.565786)
Individu Male memiliki log-odds sukses yang lebih rendah sebesar 0.566 dibandingkan Female (referensi).
p = 0.011737 (signifkan pada taraf 5%), menunjukkan bahwa laki-laki memiliki peluang sukses lebih rendah dibandingkan perempuan.
Odds Ratio = 0.568: Peluang sukses laki-laki sekitar 57% dari peluang sukses perempuan.
education_numeric (+0.399473)
Setiap kenaikan satu tingkat pendidikan (HighSchool -> Bachelor-> Master -> PhD) meningkatkan log-odds sukses sebesar 0.399.
p = 0.000706 (sangat signifkan), menunjukkan bahwa semakin tinggi tingkat pendidikan, semakin besar peluang sukses.
Odds Ratio = 1.491: Setiap kenaikan satu tingkat pendidikan meningkatkan peluang sukses sekitar 49%.
income (+0.030055)
Setiap kenaikan 1 unit income (misal, 1 juta), meningkatkan log-odds sukses sebesar 0.030.
p = 0.000182 (sangat signifkan), artinya pendapatan berhubungan positif dengan peluang sukses.
Odds Ratio = 1.030: Setiap tambahan 1 juta meningkatkan peluang sukses sekitar 3.0%.
Interpretasi Goodness-of-Fit
Null deviance (531.92): Deviance model tanpa prediktor.
Residual deviance (500.24): Deviance model dengan prediktor. – Penurunan dari null deviance ke residual deviance menunjukkan bahwa prediktor memberikan tambahan informasi yang berarti.
AIC (508.24): – Digunakan untuk membandingkan model: semakin kecil AIC, semakin baik keseimbangan antara goodness-of-fit dan kompleksitas model.
Signifkansi Model
Variabel income dan education_numeric sangat signifkan dalam meningkatkan peluang sukses.
Gender juga berpengaruh secara signifkan, di mana laki-laki memiliki odds lebih rendah.
Kesimpulan
Semakin tinggi tingkat pendidikan, semakin besar peluang untuk sukses.
Pendapatan yang lebih tinggi secara konsisten meningkatkan peluang sukses.
Gender memiliki efek: perempuan memiliki peluang sukses lebih besar dibanding laki-laki.
Model memiliki performa yang cukup baik, namun seperti biasa, bisa ditingkatkan lagi dengan mempertimbangkan tambahan variabel lain.
Goodness-of-Fit Model
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.1138585 (df=6)
##
## $McFadden_R2_Numeric
## 'log Lik.' 0.1108607 (df=4)
Interpretasi: McFadden’s R² mengukur goodness-of-ft. Semakin besar nilainya, semakin baik model memprediksi dibandingkan model null.
Visualisasi Prediksi
library(ggplot2)
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()
## List of 136
## $ line :List of 6
## ..$ colour : chr "black"
## ..$ linewidth : num 0.5
## ..$ linetype : num 1
## ..$ lineend : chr "butt"
## ..$ arrow : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ rect :List of 5
## ..$ fill : chr "white"
## ..$ colour : chr "black"
## ..$ linewidth : num 0.5
## ..$ linetype : num 1
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ text :List of 11
## ..$ family : chr ""
## ..$ face : chr "plain"
## ..$ colour : chr "black"
## ..$ size : num 11
## ..$ hjust : num 0.5
## ..$ vjust : num 0.5
## ..$ angle : num 0
## ..$ lineheight : num 0.9
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ title : NULL
## $ aspect.ratio : NULL
## $ axis.title : NULL
## $ axis.title.x :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 2.75points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.x.top :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 0
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 2.75points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.x.bottom : NULL
## $ axis.title.y :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : num 90
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.75points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.y.left : NULL
## $ axis.title.y.right :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : num -90
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 2.75points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : chr "grey30"
## ..$ size : 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 2.2points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x.top :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 0
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 2.2points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x.bottom : NULL
## $ axis.text.y :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 1
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.2points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.y.left : NULL
## $ axis.text.y.right :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 2.2points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.theta : NULL
## $ axis.text.r :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0.5
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.2points 0points 2.2points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.ticks : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.ticks.x : NULL
## $ axis.ticks.x.top : NULL
## $ axis.ticks.x.bottom : NULL
## $ axis.ticks.y : NULL
## $ axis.ticks.y.left : NULL
## $ axis.ticks.y.right : NULL
## $ axis.ticks.theta : NULL
## $ axis.ticks.r : NULL
## $ axis.minor.ticks.x.top : NULL
## $ axis.minor.ticks.x.bottom : NULL
## $ axis.minor.ticks.y.left : NULL
## $ axis.minor.ticks.y.right : NULL
## $ axis.minor.ticks.theta : NULL
## $ axis.minor.ticks.r : NULL
## $ axis.ticks.length : 'simpleUnit' num 2.75points
## ..- attr(*, "unit")= int 8
## $ axis.ticks.length.x : NULL
## $ axis.ticks.length.x.top : NULL
## $ axis.ticks.length.x.bottom : NULL
## $ axis.ticks.length.y : NULL
## $ axis.ticks.length.y.left : NULL
## $ axis.ticks.length.y.right : NULL
## $ axis.ticks.length.theta : NULL
## $ axis.ticks.length.r : NULL
## $ axis.minor.ticks.length : 'rel' num 0.75
## $ axis.minor.ticks.length.x : NULL
## $ axis.minor.ticks.length.x.top : NULL
## $ axis.minor.ticks.length.x.bottom: NULL
## $ axis.minor.ticks.length.y : NULL
## $ axis.minor.ticks.length.y.left : NULL
## $ axis.minor.ticks.length.y.right : NULL
## $ axis.minor.ticks.length.theta : NULL
## $ axis.minor.ticks.length.r : NULL
## $ axis.line : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.line.x : NULL
## $ axis.line.x.top : NULL
## $ axis.line.x.bottom : NULL
## $ axis.line.y : NULL
## $ axis.line.y.left : NULL
## $ axis.line.y.right : NULL
## $ axis.line.theta : NULL
## $ axis.line.r : NULL
## $ legend.background : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.margin : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
## ..- attr(*, "unit")= int 8
## $ legend.spacing : 'simpleUnit' num 11points
## ..- attr(*, "unit")= int 8
## $ legend.spacing.x : NULL
## $ legend.spacing.y : NULL
## $ legend.key : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.key.size : 'simpleUnit' num 1.2lines
## ..- attr(*, "unit")= int 3
## $ legend.key.height : NULL
## $ legend.key.width : NULL
## $ legend.key.spacing : 'simpleUnit' num 5.5points
## ..- attr(*, "unit")= int 8
## $ legend.key.spacing.x : NULL
## $ legend.key.spacing.y : NULL
## $ legend.frame : NULL
## $ legend.ticks : NULL
## $ legend.ticks.length : 'rel' num 0.2
## $ legend.axis.line : NULL
## $ legend.text :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.text.position : NULL
## $ legend.title :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.title.position : NULL
## $ legend.position : chr "right"
## $ legend.position.inside : NULL
## $ legend.direction : NULL
## $ legend.byrow : NULL
## $ legend.justification : chr "center"
## $ legend.justification.top : NULL
## $ legend.justification.bottom : NULL
## $ legend.justification.left : NULL
## $ legend.justification.right : NULL
## $ legend.justification.inside : NULL
## $ legend.location : NULL
## $ legend.box : NULL
## $ legend.box.just : NULL
## $ legend.box.margin : 'margin' num [1:4] 0cm 0cm 0cm 0cm
## ..- attr(*, "unit")= int 1
## $ legend.box.background : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.box.spacing : 'simpleUnit' num 11points
## ..- attr(*, "unit")= int 8
## [list output truncated]
## - attr(*, "class")= chr [1:2] "theme" "gg"
## - attr(*, "complete")= logi TRUE
## - attr(*, "validate")= logi TRUE
# 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()
## List of 136
## $ line :List of 6
## ..$ colour : chr "black"
## ..$ linewidth : num 0.5
## ..$ linetype : num 1
## ..$ lineend : chr "butt"
## ..$ arrow : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ rect :List of 5
## ..$ fill : chr "white"
## ..$ colour : chr "black"
## ..$ linewidth : num 0.5
## ..$ linetype : num 1
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ text :List of 11
## ..$ family : chr ""
## ..$ face : chr "plain"
## ..$ colour : chr "black"
## ..$ size : num 11
## ..$ hjust : num 0.5
## ..$ vjust : num 0.5
## ..$ angle : num 0
## ..$ lineheight : num 0.9
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ title : NULL
## $ aspect.ratio : NULL
## $ axis.title : NULL
## $ axis.title.x :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 2.75points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.x.top :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 0
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 2.75points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.x.bottom : NULL
## $ axis.title.y :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : num 90
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.75points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.y.left : NULL
## $ axis.title.y.right :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : num -90
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 2.75points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : chr "grey30"
## ..$ size : 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 2.2points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x.top :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 0
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 2.2points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x.bottom : NULL
## $ axis.text.y :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 1
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.2points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.y.left : NULL
## $ axis.text.y.right :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 2.2points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.theta : NULL
## $ axis.text.r :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0.5
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.2points 0points 2.2points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.ticks : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.ticks.x : NULL
## $ axis.ticks.x.top : NULL
## $ axis.ticks.x.bottom : NULL
## $ axis.ticks.y : NULL
## $ axis.ticks.y.left : NULL
## $ axis.ticks.y.right : NULL
## $ axis.ticks.theta : NULL
## $ axis.ticks.r : NULL
## $ axis.minor.ticks.x.top : NULL
## $ axis.minor.ticks.x.bottom : NULL
## $ axis.minor.ticks.y.left : NULL
## $ axis.minor.ticks.y.right : NULL
## $ axis.minor.ticks.theta : NULL
## $ axis.minor.ticks.r : NULL
## $ axis.ticks.length : 'simpleUnit' num 2.75points
## ..- attr(*, "unit")= int 8
## $ axis.ticks.length.x : NULL
## $ axis.ticks.length.x.top : NULL
## $ axis.ticks.length.x.bottom : NULL
## $ axis.ticks.length.y : NULL
## $ axis.ticks.length.y.left : NULL
## $ axis.ticks.length.y.right : NULL
## $ axis.ticks.length.theta : NULL
## $ axis.ticks.length.r : NULL
## $ axis.minor.ticks.length : 'rel' num 0.75
## $ axis.minor.ticks.length.x : NULL
## $ axis.minor.ticks.length.x.top : NULL
## $ axis.minor.ticks.length.x.bottom: NULL
## $ axis.minor.ticks.length.y : NULL
## $ axis.minor.ticks.length.y.left : NULL
## $ axis.minor.ticks.length.y.right : NULL
## $ axis.minor.ticks.length.theta : NULL
## $ axis.minor.ticks.length.r : NULL
## $ axis.line : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.line.x : NULL
## $ axis.line.x.top : NULL
## $ axis.line.x.bottom : NULL
## $ axis.line.y : NULL
## $ axis.line.y.left : NULL
## $ axis.line.y.right : NULL
## $ axis.line.theta : NULL
## $ axis.line.r : NULL
## $ legend.background : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.margin : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
## ..- attr(*, "unit")= int 8
## $ legend.spacing : 'simpleUnit' num 11points
## ..- attr(*, "unit")= int 8
## $ legend.spacing.x : NULL
## $ legend.spacing.y : NULL
## $ legend.key : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.key.size : 'simpleUnit' num 1.2lines
## ..- attr(*, "unit")= int 3
## $ legend.key.height : NULL
## $ legend.key.width : NULL
## $ legend.key.spacing : 'simpleUnit' num 5.5points
## ..- attr(*, "unit")= int 8
## $ legend.key.spacing.x : NULL
## $ legend.key.spacing.y : NULL
## $ legend.frame : NULL
## $ legend.ticks : NULL
## $ legend.ticks.length : 'rel' num 0.2
## $ legend.axis.line : NULL
## $ legend.text :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.text.position : NULL
## $ legend.title :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.title.position : NULL
## $ legend.position : chr "right"
## $ legend.position.inside : NULL
## $ legend.direction : NULL
## $ legend.byrow : NULL
## $ legend.justification : chr "center"
## $ legend.justification.top : NULL
## $ legend.justification.bottom : NULL
## $ legend.justification.left : NULL
## $ legend.justification.right : NULL
## $ legend.justification.inside : NULL
## $ legend.location : NULL
## $ legend.box : NULL
## $ legend.box.just : NULL
## $ legend.box.margin : 'margin' num [1:4] 0cm 0cm 0cm 0cm
## ..- attr(*, "unit")= int 1
## $ legend.box.background : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.box.spacing : 'simpleUnit' num 11points
## ..- attr(*, "unit")= int 8
## [list output truncated]
## - attr(*, "class")= chr [1:2] "theme" "gg"
## - attr(*, "complete")= logi TRUE
## - attr(*, "validate")= logi TRUE
Interpretasi: Visualisasi hubungan antara pendapatan dan probabilitas sukses berdasarkan tingkat pendidikan, dengan dua pendekatan perlakuan ordinal.
Ringkasan Koefsien Model
library(knitr)
library(kableExtra)
# Ringkasan model nominal
# Muat paket yang dibutuhkan
library(broom)
library(knitr)
# Tampilkan koefisien model dalam format LaTeX menggunakan kable
tidy(model_nominal) %>%
kable(format = "latex", booktabs = TRUE, caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Nominal") %>%
kable_styling(latex_options = c("hold_position", "striped"))
Ringkasan Koefisien Model dengan Ordinal sebagai Nominal
| Term | Estimate | Std. Error | Statistic | P-value |
|---|---|---|---|---|
| (Intercept) | -0.5941720 | 0.4257055 | -1.3957349 | 0.1627943 |
| genderMale | -0.0488168 | 0.2296594 | -0.2125618 | 0.8316688 |
| educationBachelor | -0.8960550 | 0.2488185 | -3.6012403 | 0.0003167 |
| educationMaster | 1.3346240 | 0.4132167 | 3.2298401 | 0.0012386 |
| educationPhD | 1.2663424 | 0.6332026 | 1.9999007 | 0.0455110 |
| income | 0.0393818 | 0.0080291 | 4.9048584 | 0.0000009 |
# Ringkasan model numeric
tidy(model_numeric) %>%
kable(format = "latex", booktabs = TRUE, caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Numerik") %>%
kable_styling(latex_options = c("hold_position", "striped"))
Ringkasan Koefisien Model dengan Ordinal sebagai Numeric
| Term | Estimate | Std. Error | Statistic | P-value |
|---|---|---|---|---|
| (Intercept) | -1.0990856 | 0.4578039 | -2.4007783 | 0.0163602 |
| genderMale | -0.0525970 | 0.2201183 | -0.2389488 | 0.8111453 |
| education_numeric | 0.3728890 | 0.1227632 | 3.0374669 | 0.0023858 |
| income | 0.0337201 | 0.0075691 | 4.4549528 | 0.0000084 |
Interpretasi: Tabel memperlihatkan estimasi koefsien, standar error, nilai z, dan p-value. Koefsien positif meningkatkan log-odds keberhasilan, koefsien negatif menurunkan.
Kesimpulan
Gender: Perempuan memiliki peluang sukses lebih tinggi dibanding laki-laki.
Education: – Jika dianggap dummy: tiap jenjang dibandingkan langsung dengan HighSchool. – Jika dianggap numeric: tiap kenaikan satu tingkat pendidikan meningkatkan peluang sukses.
Income: Pendapatan yang lebih tinggi meningkatkan peluang sukses.
Model dengan perlakuan ordinal sebagai numeric memiliki interpretasi lebih sederhana jika asumsi jarak antar tingkatannya konsisten.
Dalam regresi logistik, pemilihan model merupakan langkah penting untuk memperoleh model yang mampu memprediksi probabilitas terjadinya suatu peristiwa dengan respon biner. Terdapat dua pendekatan utama dalam membangun model, yaitu pendekatan Konfirmatori dan Eksploratori.
Model dikembangkan berdasarkan teori atau hasil studi sebelumnya.
Tujuan utamanya adalah menguji kebermaknaan efek tertentu, bukan semata-mata mencari model terbaik.
Umumnya peneliti menyusun model lengkap terlebih dahulu, lalu menilai apakah penambahan atau pengurangan suatu efek (seperti interaksi) memberikan perbaikan signifikan pada model.
Pengujian dilakukan dengan membandingkan model yang mengandung efek tertentu dengan model yang tidak mengandung efek tersebut, misalnya menggunakan Likelihood Ratio Test.
Contoh penerapan:
Jika teori menyebutkan bahwa faktor x1 dan x2 memengaruhi kemungkinan seseorang membeli suatu produk, maka model logistik langsung dibangun dengan menyertakan x1 dan x2, kemudian diuji apakah kontribusi x2 signifikan.
Model dikembangkan secara bertahap dengan tujuan mencari kombinasi prediktor yang paling optimal.
Pemilihan variabel dilakukan dengan mempertimbangkan ukuran statistik seperti AIC, deviance, atau log-likelihood.
Metode seleksi yang umum digunakan:
Forward Selection: Dimulai dari model kosong, variabel dimasukkan satu per satu jika signifikan.
Backward Elimination: Dimulai dari model penuh, variabel yang tidak signifikan secara bertahap dihapus.
Stepwise Selection: Gabungan dari dua metode sebelumnya, di mana variabel dapat dimasukkan atau dikeluarkan secara fleksibel selama proses seleksi.
Tujuan:
Mencari model yang bersifat parsimonious, yaitu model yang cukup sederhana namun mampu memberikan prediksi yang akurat.
Pemilihan antara pendekatan Konfirmatori dan Eksploratori ditentukan oleh tujuan penelitian. Jika fokus utama adalah menguji hipotesis tertentu, maka pendekatan Konfirmatori lebih sesuai. Sebaliknya, jika tujuannya adalah untuk menemukan model terbaik berdasarkan pola dalam data, maka pendekatan Eksploratori lebih tepat digunakan.
Dalam praktiknya, kedua pendekatan ini sering dipakai secara saling melengkapi: teori digunakan sebagai pijakan awal untuk membangun model, kemudian pendekatan eksploratori diterapkan guna menyempurnakan model tersebut melalui seleksi berbasis data.
Simulasi Data
library(knitr)
library(dplyr)
library(ggplot2)
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
library(caret)
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: lattice
##
## Attaching package: 'lattice'
## The following object is masked from 'package:gnm':
##
## barley
##
## Attaching package: 'caret'
## The following objects are masked from 'package:DescTools':
##
## MAE, RMSE
library(pROC)
## Warning: package 'pROC' was built under R version 4.3.3
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following object is masked from 'package:gmodels':
##
## ci
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
library(DescTools)
set.seed(123)
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 -0.56047565 1 -0.7152422
## 2 0 -0.23017749 0 -0.7526890
## 3 1 1.55870831 1 -0.9385387
## 4 1 0.07050839 1 -1.0525133
## 5 1 0.12928774 0 -0.4371595
## 6 1 1.71506499 0 0.3311792
Pemilihan Model Model Full
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.7148 0.2470 -2.894 0.00381 **
## x1 1.4029 0.2315 6.061 1.35e-09 ***
## x2 -0.2507 0.3463 -0.724 0.46903
## x3 0.3567 0.1704 2.094 0.03630 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 257.72 on 199 degrees of freedom
## Residual deviance: 202.67 on 196 degrees of freedom
## AIC: 210.67
##
## Number of Fisher Scoring iterations: 4
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 210.6739
## step_forward 3 209.1998
## step_backward 3 209.1998
## step_both 3 209.1998
pred_prob <- predict(step_both, type = "response")
roc_obj <- roc(df$y, pred_prob)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj, main = "Kurva ROC", col = "blue")
auc(roc_obj)
## Area under the curve: 0.7964
PseudoR2(step_both, which = c("CoxSnell", "Nagelkerke", "McFadden"))
## CoxSnell Nagelkerke McFadden
## 0.2385981 0.3294000 0.2115439
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 116 32
## 1 15 37
##
## Accuracy : 0.765
## 95% CI : (0.7, 0.8219)
## No Information Rate : 0.655
## P-Value [Acc > NIR] : 0.0005028
##
## Kappa : 0.4478
##
## Mcnemar's Test P-Value : 0.0196041
##
## Sensitivity : 0.5362
## Specificity : 0.8855
## Pos Pred Value : 0.7115
## Neg Pred Value : 0.7838
## Prevalence : 0.3450
## Detection Rate : 0.1850
## Detection Prevalence : 0.2600
## Balanced Accuracy : 0.7109
##
## 'Positive' Class : 1
##
conf_matrix$byClass[c("Sensitivity", "Specificity")]
## Sensitivity Specificity
## 0.5362319 0.8854962
Model dengan nilai AIC terendah adalah model Forward. Nilai ROC sebesar 0.8 menunjukkan kinerja yang cukup baik. Selain itu, nilai Pseudo-R² dan hasil klasifikasi juga mengindikasikan bahwa model memiliki tingkat akurasi yang memadai.
Tujuan
Dokumen ini bertujuan untuk menjelaskan cara melakukan perbandingan antar model regresi logistik dengan menggunakan beberapa ukuran evaluasi, yaitu:
Deviance
Akaike Information Criterion (AIC)
Likelihood-Ratio Test
Selain itu, dokumen ini juga menguraikan konsep parsimony sebagai prinsip penting dalam pemilihan model yang efisien.
library(MASS)
library(broom)
library(DescTools)
set.seed(123)
Simulasi Data
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)
Pembuatan Model
model1 <- glm(y ~ x1, data = data, family = binomial)
model2 <- glm(y ~ x1 + x2, data = data, family = binomial)
model3 <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
Perbandingan AIC dan Deviance
model_comp <- data.frame(
Model = c("Model 1", "Model 2", "Model 3"),
AIC = c(AIC(model1), AIC(model2), AIC(model3)),
Deviance = c(deviance(model1), deviance(model2), deviance(model3))
)
model_comp
## Model AIC Deviance
## 1 Model 1 306.2741 302.2741
## 2 Model 2 305.8225 299.8225
## 3 Model 3 278.4581 270.4581
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 302.27
## 2 297 299.82 1 2.4516 0.1174
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 299.82
## 2 296 270.46 1 29.364 5.997e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Prinsip Parsimony
Model yang lebih kompleks umumnya menghasilkan nilai AIC dan deviance yang lebih rendah. Namun demikian:
Model yang lebih sederhana cenderung lebih mudah untuk diinterpretasikan.
Jika penurunan nilai AIC tidak terlalu signifikan, sebaiknya memilih model yang lebih sederhana.
Prinsip parsimony membantu menghindari masalah overfitting.
Rumus dan Penjelasan
Rumus AIC
\[ \text{AIC} = -2(\log L - k) = -2 \log L + 2k \]
Penjelasan:
AIC (Akaike Information Criterion) merupakan ukuran yang digunakan untuk mengevaluasi kualitas suatu model berdasarkan keseimbangan antara goodness-of-fit (melalui nilai log-likelihood) dan tingkat kompleksitas model (melalui jumlah parameter, kkk). Nilai AIC yang lebih rendah menunjukkan model yang secara keseluruhan lebih baik. Hal ini karena AIC memberikan penalti terhadap model yang terlalu kompleks, meskipun model tersebut mungkin memiliki likelihood yang tinggi. Dengan kata lain, AIC mendorong pemilihan model yang efisien dan tidak overfitting.
Rumus Deviance:
\[ D = -2 \left[ \log L(\text{model}) - \log L(\text{model saturasi}) \right] \]
Penjelasan:
Deviance mengukur seberapa jauh model yang sedang dianalisis dari model saturasi, yaitu model yang secara sempurna memuat data aktual (memiliki deviance nol). Nilai deviance yang lebih kecil menandakan bahwa model tersebut memberikan hasil prediksi yang lebih dekat dengan data observasi. Oleh karena itu, deviance digunakan untuk menilai seberapa baik model menangkap pola dalam data.
Rumus Likelihood-Ratio:
\[ \chi^2 = -2(\log L_0 - \log L_1) \]
Penjelasan:
Statistik Likelihood Ratio digunakan untuk membandingkan dua model—biasanya model sederhana (null model, \(L_0\)) dengan model yang lebih kompleks (model penuh, \(L_1\)). Nilai \(\chi^2\) yang besar, disertai dengan nilai p yang kecil, menunjukkan bahwa penambahan variabel atau efek dalam model kompleks secara signifikan meningkatkan kecocokan model terhadap data. Uji ini sering digunakan untuk menentukan apakah penambahan suatu variabel ke dalam model layak dilakukan 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 193 48
## 1 18 41
##
## Accuracy : 0.78
## 95% CI : (0.7288, 0.8256)
## No Information Rate : 0.7033
## P-Value [Acc > NIR] : 0.0017748
##
## Kappa : 0.4159
##
## Mcnemar's Test P-Value : 0.0003575
##
## Sensitivity : 0.4607
## Specificity : 0.9147
## Pos Pred Value : 0.6949
## Neg Pred Value : 0.8008
## Prevalence : 0.2967
## Detection Rate : 0.1367
## Detection Prevalence : 0.1967
## Balanced Accuracy : 0.6877
##
## 'Positive' Class : 1
##
Dalam evaluasi model klasifikasi biner, dua ukuran penting yang digunakan untuk menilai performa model adalah sensitivitas dan spesifisitas.
Sensitivitas (Sensitivity)
Sensitivitas, juga dikenal sebagai True Positive Rate atau Recall, mengukur seberapa baik model dalam mengidentifikasi kasus positif secara benar.
\[ \text{Sensitivity} = \frac{\text{TP}}{\text{TP} + \text{FN}} \]
Penjelasan:
Sensitivitas menunjukkan proporsi individu yang benar-benar positif (misalnya, sakit) yang berhasil dikenali oleh model sebagai positif. Nilai yang tinggi menunjukkan bahwa model memiliki kemampuan yang baik dalam mendeteksi kasus positif.
Spesifisitas (Specificity)
Spesifisitas, atau True Negative Rate, mengukur kemampuan model dalam mengenali kasus negatif dengan benar.
\[ \text{Specificity} = \frac{\text{TN}}{\text{TN} + \text{FP}} \]
Penjelasan:
Spesifisitas menunjukkan proporsi individu yang benar-benar negatif (misalnya, sehat) yang diklasifikasikan dengan benar oleh model. Semakin tinggi nilai spesifisitas, semakin baik model dalam menghindari kesalahan klasifikasi terhadap kasus negatif.
conf_matrix$byClass[c("Sensitivity", "Specificity")]
## Sensitivity Specificity
## 0.4606742 0.9146919
Kesimpulan
Nilai deviance yang rendah mengindikasikan bahwa model memiliki kecocokan yang lebih baik terhadap data observasi.
AIC yang lebih kecil mencerminkan adanya keseimbangan optimal antara tingkat kecocokan model (fit) dan kompleksitas model (jumlah parameter).
Uji Likelihood Ratio digunakan untuk menilai apakah model yang lebih kompleks memberikan peningkatan signifikan dalam hal kecocokan dibandingkan dengan model yang lebih sederhana.
Tabel klasifikasi memberikan gambaran tentang kinerja model dalam memprediksi hasil aktual, dengan memperlihatkan distribusi antara prediksi benar dan salah.
Prinsip Parsimony menekankan pentingnya memilih model yang lebih sederhana, selama performanya tidak jauh berbeda dengan model yang lebih kompleks, untuk menjaga interpretabilitas dan menghindari overfitting.
Penjelasan Kurva ROC (Receiver Operating Characteristic)
Kurva ROC merupakan alat visual yang umum digunakan untuk mengevaluasi performa model klasifikasi biner. Kurva ini menggambarkan hubungan antara True Positive Rate (Sensitivitas) dan False Positive Rate (1 - Spesifisitas) untuk berbagai nilai ambang (threshold) klasifikasi.
1. Definisi Komponen Kurva ROC
Sumbu Y menampilkan nilai Sensitivity (True Positive Rate), dihitung sebagai:
\[ \text{Sensitivity} = \frac{\text{TP}}{\text{TP} + \text{FN}} \]
Sumbu X menunjukkan nilai 1 - Specificity (False Positive Rate), dihitung sebagai:
\[ \text{False Positive Rate} = \frac{\text{FP}}{\text{FP} + \text{TN}} \]
Garis diagonal dari kiri bawah ke kanan atas merepresentasikan performa model yang bersifat acak (random guess), di mana sensitivitas dan spesifisitas tidak lebih baik dari tebak-tebakan.
Kurva yang melengkung ke arah pojok kiri atas menunjukkan bahwa model memiliki performa klasifikasi yang baik.
2. Pengaruh Cut-off terhadap Kurva ROC
Perubahan nilai ambang klasifikasi (cut-off) akan mempengaruhi posisi titik pada kurva ROC:
Ketika cut-off diturunkan (model lebih permisif mengklasifikasikan sebagai positif):
Ketika cut-off dinaikkan (model lebih konservatif dalam klasifikasi positif):
Dengan demikian, kurva ROC memperlihatkan bagaimana keseimbangan antara deteksi positif dan kesalahan klasifikasi berubah seiring variasi threshold.
3. Karakteristik Kurva ROC Ideal
Model klasifikasi yang ideal akan menghasilkan kurva ROC dengan ciri-ciri sebagai berikut:
Kurva naik secara vertikal dari titik (0,0) ke (0,1), yang berarti sensitivitas langsung mencapai 1 tanpa meningkatkan false positive rate.
Setelah itu, kurva bergerak horizontal dari (0,1) ke (1,1).
Semakin dekat bentuk kurva dengan pola ini, semakin tinggi Area Under the Curve (AUC), yang mendekati nilai 1.
AUC merupakan ringkasan kuantitatif dari kurva ROC yang mencerminkan kemampuan model dalam membedakan antara kelas positif dan negatif secara keseluruhan.
4. Interpretasi Luas Area di Bawah Kurva (AUC)
AUC = 0.5 menunjukkan bahwa model tidak memiliki kemampuan klasifikasi yang lebih baik dibandingkan tebakan acak.
AUC > 0.7 mengindikasikan bahwa model memiliki performa klasifikasi yang cukup baik.
AUC > 0.9 mencerminkan bahwa model sangat andal dalam membedakan antara kelas positif dan negatif.
AUC juga dikenal sebagai concordance index, yaitu probabilitas bahwa model memberikan skor probabilitas yang lebih tinggi kepada observasi positif dibandingkan observasi negatif secara acak. Nilai ini merepresentasikan kemampuan diskriminatif model.
5. Kegunaan Kurva ROC
Kurva ROC memiliki berbagai manfaat dalam evaluasi model klasifikasi, antara lain:
Membandingkan performa beberapa model: ROC dan AUC dapat digunakan untuk menentukan model mana yang lebih baik dalam memisahkan kelas target.
Menentukan nilai threshold optimal: ROC membantu memilih titik ambang (cut-off) klasifikasi terbaik sesuai dengan tujuan analisis.
6. Visualisasi Kurva ROC di R
Kurva ROC dapat divisualisasikan dengan mudah menggunakan package pROC. Berikut adalah contoh penggunaannya:
library(pROC)
set.seed(123)
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)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj)
auc(roc_obj)
## Area under the curve: 0.8686
7. Simulasi Pemilihan Threshold Optimal
Dalam proses pemilihan nilai threshold klasifikasi yang paling sesuai, penting untuk mengevaluasi bagaimana sensitivitas dan spesifisitas berubah pada berbagai nilai ambang (cut-off). Dengan cara ini, kita dapat menentukan titik di mana model mencapai keseimbangan terbaik antara mendeteksi kelas positif secara akurat dan menghindari kesalahan klasifikasi pada kelas negatif.
Simulasi ini biasanya melibatkan penghitungan sensitivitas dan spesifisitas untuk setiap kemungkinan nilai threshold dalam rentang 0 hingga 1. Kemudian, nilai threshold yang dipilih adalah yang sesuai dengan prioritas aplikasi, misalnya:
Memaksimalkan sensitivitas agar sedikit mungkin kasus positif terlewatkan, atau
Memaksimalkan spesifisitas agar meminimalkan false alarm (false positives).
Pendekatan ini membantu dalam menyesuaikan performa model agar selaras dengan kebutuhan praktis di lapangan.
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.91489362 0.5947712
## 2 0.15 0.85106383 0.6862745
## 3 0.20 0.80851064 0.7320261
## 4 0.25 0.76595745 0.7712418
## 5 0.30 0.72340426 0.8104575
## 6 0.35 0.68085106 0.8366013
## 7 0.40 0.61702128 0.8954248
## 8 0.45 0.59574468 0.9150327
## 9 0.50 0.51063830 0.9281046
## 10 0.55 0.51063830 0.9477124
## 11 0.60 0.42553191 0.9607843
## 12 0.65 0.36170213 0.9738562
## 13 0.70 0.29787234 0.9803922
## 14 0.75 0.19148936 0.9869281
## 15 0.80 0.12765957 0.9869281
## 16 0.85 0.06382979 1.0000000
## 17 0.90 0.02127660 1.0000000
Pemilihan Cut-off Optimal
Nilai cut-off yang optimal untuk klasifikasi dapat ditentukan dengan beberapa pendekatan, antara lain:
Maksimalkan jumlah Sensitivitas dan Spesifisitas
Pendekatan ini memilih threshold di mana jumlah sensitivitas dan spesifisitas mencapai nilai tertinggi, sehingga tercapai keseimbangan terbaik antara kemampuan mendeteksi kelas positif dan menghindari kesalahan pada kelas negatif.
Mempertimbangkan trade-off sesuai kebutuhan aplikasi
Dalam beberapa kasus, prioritas mungkin berbeda tergantung konteks. Misalnya, jika risiko False Negative (tidak mendeteksi kasus positif yang sebenarnya ada) harus diminimalkan, maka nilai threshold yang dipilih akan lebih menekankan pada sensitivitas tinggi meskipun harus mengorbankan sedikit spesifisitas.
Pendekatan ini memastikan bahwa pemilihan threshold disesuaikan dengan tujuan spesifik dari aplikasi model, sehingga hasil klasifikasi lebih sesuai dengan kebutuhan praktis.
8. Catatan Penting
Kurva ROC sangat efektif digunakan untuk mengevaluasi performa model klasifikasi ketika proporsi antara kelas positif dan negatif relatif seimbang. Dalam kondisi tersebut, ROC memberikan gambaran yang jelas mengenai kemampuan model dalam membedakan kedua kelas.
Namun, jika data memiliki kelas yang tidak seimbang—misalnya satu kelas jauh lebih dominan daripada kelas lainnya—kurva ROC bisa menjadi kurang informatif. Pada kasus ini, Precision-Recall Curve sering kali memberikan gambaran yang lebih akurat tentang performa model, khususnya dalam menangani kelas minoritas.
Precision-Recall Curve fokus pada keseimbangan antara precision (ketepatan prediksi positif) dan recall (sensitivitas), sehingga lebih sensitif terhadap perubahan pada kelas yang jarang muncul.
Kurva Precision-Recall (PR) adalah alat yang sangat berguna untuk mengevaluasi performa model klasifikasi, terutama ketika menghadapi data dengan distribusi kelas yang tidak seimbang (class imbalance). Kurva ini memvisualisasikan hubungan antara presisi dan recall model pada berbagai nilai threshold klasifikasi.
1. Definisi
Precision (Presisi)
Presisi menunjukkan proporsi prediksi positif yang benar-benar merupakan kasus positif. Dengan kata lain, dari seluruh hasil klasifikasi positif yang diberikan model, berapa banyak yang benar-benar positif.
\[ \text{Precision} = \frac{TP}{TP + FP} \]
Recall (Sensitivitas)
Recall mengukur proporsi kasus positif yang berhasil dikenali oleh model sebagai positif. Ini adalah ukuran seberapa lengkap model dalam menangkap kasus positif.
\[ \text{Recall} = \frac{TP}{TP + FN} \]
2. Interpretasi Kurva PR
Kurva PR memperlihatkan bagaimana nilai presisi berubah ketika recall meningkat dengan variasi nilai threshold.
Idealnya, model yang baik memiliki nilai presisi dan recall yang tinggi sekaligus, tetapi dalam praktiknya biasanya terdapat trade-off antara keduanya.
Model dengan performa unggul akan menghasilkan kurva PR yang melengkung ke arah pojok kanan atas, yang menandakan presisi dan recall yang tinggi secara bersamaan.
3. Area Under Precision-Recall Curve (AUPRC)
Nilai AUPRC yang mendekati 1 menandakan bahwa model memiliki performa yang sangat baik dalam membedakan antara kelas positif dan negatif pada data yang tidak seimbang.
Sebagai acuan, baseline AUPRC biasanya sama dengan prevalensi kelas positif dalam dataset, yaitu proporsi kasus positif terhadap total data. Jika model hanya menebak secara acak, nilai AUPRC-nya akan mendekati angka ini.
4. Perbandingan Precision-Recall Curve dan ROC Curve
\[ \begin{array}{|l|c|c|} \hline \textbf{Aspek} & \textbf{ROC Curve} & \textbf{Precision-Recall Curve} \\ \hline \text{Fokus} & \text{Semua kelas (positif dan negatif)} & \text{Kelas positif saja} \\ \hline \text{Kuat di} & \text{Data seimbang} & \text{Data tidak seimbang} \\ \hline \text{Sumbu Y} & \text{Sensitivitas (Recall)} & \text{Precision} \\ \hline \text{Sumbu X} & \text{1 - Spesifisitas (False Positive Rate)} & \text{Recall} \\ \hline \end{array} \]
5. Visualisasi PR Curve di R
library(PRROC)
## Warning: package 'PRROC' was built under R version 4.3.3
## Loading required package: rlang
##
## Attaching package: 'rlang'
## The following object is masked from 'package:magrittr':
##
## set_names
set.seed(123)
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)
6. Catatan Penting Mengenai Precision-Recall Curve
Kurva Precision-Recall sangat berguna dan memberikan informasi yang lebih relevan pada aplikasi-aplikasi khusus, seperti dalam deteksi penipuan atau diagnosis penyakit langka, di mana kelas positif merupakan kejadian yang sangat jarang.
Disarankan untuk menggunakan Precision-Recall Curve ketika:
Dengan menggunakan PR Curve, evaluasi performa model menjadi lebih sensitif terhadap ketidakseimbangan data dan kebutuhan aplikasi yang mengutamakan deteksi akurat dari kasus minoritas.
Tujuan
Dokumen ini bertujuan untuk menjelaskan konsep dan cara perhitungan nilai pseudo R-squared pada regresi logistik, yang digunakan sebagai ukuran goodness-of-fit model. Dua jenis pseudo R-squared yang umum digunakan adalah:
Cox and Snell R²
McFadden R²
Pseudo R-squared ini berfungsi sebagai indikator seberapa baik model regresi logistik menjelaskan variasi data, mirip seperti R-squared pada regresi linear, meskipun interpretasinya sedikit berbeda karena sifat model logistik.
Simulasi Data
set.seed(123)
n <- 300
x1 <- rnorm(n)
x2 <- rbinom(n, 1, 0.5)
x3 <- rnorm(n)
lin_pred <- -1 + 1.2 * x1 - 0.6 * x2 + 0.8 * x3
p <- 1 / (1 + exp(-lin_pred))
y <- rbinom(n, 1, p)
data <- data.frame(y = as.factor(y), x1, x2, x3)
Model Logistik dan Null Model
model <- glm(y ~ x1 + x2 + x3, data = data, family = binomial)
model_null <- glm(y ~ 1, data = data, family = binomial)
Likelihood dan Rumus Pseudo R-squared
Pseudo R-squared digunakan untuk mengukur kecocokan model regresi logistik dengan membandingkan likelihood model penuh dengan likelihood model null (model tanpa prediktor).
1. Cox and Snell R²
Rumus Cox and Snell R-squared adalah:
\[ R^2_{\text{CoxSnell}} = 1 - \left( \frac{L_0}{L_{\hat{\beta}}} \right)^{\frac{2}{n}} \]
Dimana:
\(L_0)\) adalah likelihood dari model null (model tanpa variabel prediktor).
\(L_{\hat\beta}\) adalah likelihood dari model penuh (model dengan variabel prediktor).
\(n\) adalah jumlah observasi.
2. McFadden R²
Rumus McFadden R-squared adalah:
\[ R^2_{\text{McFadden}} = 1 - \frac{\log L_{\hat{\beta}}}{\log L_0} \]
Dimana:
\(log L_0\) adalah log-likelihood dari model null.
$log_\hat\beta $adalah log-likelihood dari model penuh.
Perhitungan Manual R-squared
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.2698462 0.2586292
Perhitungan Otomatis dengan Package Tambahan Menggunakan pscl
if (!require(pscl)) install.packages("pscl"); library(pscl)
## Loading required package: pscl
## Warning: package 'pscl' was built under R version 4.3.3
## Classes and Methods for R originally developed in the
## Political Science Computational Laboratory
## Department of Political Science
## Stanford University (2002-2015),
## by and under the direction of Simon Jackman.
## hurdle and zeroinfl functions by Achim Zeileis.
pR2(model)
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML r2CU
## -135.2290328 -182.4040393 94.3500130 0.2586292 0.2698462 0.3835251
if (!require(rcompanion)) install.packages("rcompanion"); library(rcompanion)
## Loading required package: rcompanion
## Warning: package 'rcompanion' was built under R version 4.3.3
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.258629
## Cox and Snell (ML) 0.269846
## Nagelkerke (Cragg and Uhler) 0.383525
##
## $Likelihood.ratio.test
## Df.diff LogLik.diff Chisq p.value
## -3 -47.175 94.35 2.5468e-20
##
## $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 DescTools
if (!require(DescTools)) install.packages("DescTools"); library(DescTools)
PseudoR2(model, which = "all")
## McFadden McFaddenAdj CoxSnell Nagelkerke AldrichNelson
## 0.2586292 0.2366998 0.2698462 0.3835251 0.2392545
## VeallZimmermann Efron McKelveyZavoina Tjur AIC
## 0.4360055 0.2893849 0.4315315 0.2936202 278.4580657
## BIC logLik logLik0 G2
## 293.2731956 -135.2290328 -182.4040393 94.3500130
Interpretasi Pseudo R-squared
Nilai pseudo R-squared yang mendekati 1 menunjukkan bahwa model memiliki kekuatan prediktif yang sangat baik.
Untuk McFadden R², nilai di atas 0.2 sering dianggap menunjukkan model dengan kecocokan yang baik.
Cox & Snell R² cenderung memberikan nilai yang lebih konservatif dan secara teoretis tidak pernah mencapai 1, sehingga interpretasinya perlu disesuaikan dengan konteks model logistik yang dihasilkan.
Disarankan untuk menggunakan beberapa ukuran pseudo R-squared secara bersamaan sebagai pelengkap dalam menilai performa model logistik secara menyeluruh, sehingga memberikan gambaran yang lebih komprehensif tentang kemampuan prediksi model.
Distribusi multinomial merupakan generalisasi dari distribusi binomial yang digunakan ketika hasil percobaan terdiri dari lebih dari dua kategori. Distribusi ini menggambarkan probabilitas dari jumlah kejadian yang jatuh ke dalam masing-masing dari \(k\) kategori dalam \(n\) percobaan independen.
Jika \(X_1,X_2,\cdots,X_k\) menyatakan jumlah kejadian yang terjadi dalam masing-masing dari \(k\) kategori, maka fungsi probabilitas distribusi multinomial dinyatakan sebagai:
\[ P(X_1 = x_1, X_2 = x_2, \ldots, X_k = x_k) = \frac{n!}{x_1! x_2! \cdots x_k!} \cdot p_1^{x_1} p_2^{x_2} \cdots p_k^{x_k} \]
Dengan ketentuan:
\(\sum_{i=1}^k x_i = n\) (jumlah total percobaan),
\(\sum_{i=1}^k p_i = 1\) (jumlah total probabilitas dari seluruh kategori)
Distribusi ini sangat berguna dalam situasi di mana setiap pengamatan dapat masuk ke dalam salah satu dari beberapa kategori yang saling eksklusif, seperti dalam klasifikasi multi-kategori atau pemodelan jumlah respon dalam survei dengan banyak pilihan.
Sebuah survei dilakukan terhadap 10 responden, masing-masing diminta memilih satu dari tiga jenis buah favorit: Apel (A), Jeruk (J), dan Pisang (P). Hasil survei menunjukkan:
Apel dipilih oleh 4 orang
Jeruk dipilih oleh 3 orang
Pisang dipilih oleh 3 orang
Probabilitas teoretik preferensi masing-masing buah adalah:
\(P_A=0.3\)
\(P_J=0.4\)
\(P_P=0.3\)
Pertanyaannya:
Berapa probabilitas bahwa dari 10 orang, 4 memilih Apel, 3 memilih Jeruk, dan 3 memilih Pisang?
Rumus Distribusi Multinomial
Distribusi probabilitas multinomial diberikan oleh:
\[ P(X_1 = x_1, \ldots, X_k = x_k) = \frac{n!}{x_1! \, x_2! \, \cdots \, x_k!} \cdot p_1^{x_1} \, p_2^{x_2} \cdots p_k^{x_k} \]
Dengan:
Perhitungan Manual di R
Kita dapat menghitung probabilitas ini menggunakan fungsi dmultinom() dalam R:
n <- 10
x <- c(4, 3, 3)
p <- c(0.3, 0.4, 0.3)
# 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.05878656
Interpretasi Hasil
Probabilitas bahwa dari 10 responden terdapat 4 orang yang memilih Apel, 3 orang memilih Jeruk, dan 3 orang memilih Pisang, dengan peluang teoretik masing-masing sebesar 0.3, 0.4, dan 0.3, adalah 0.058787
Distribusi multinomial digunakan untuk menghitung peluang dari suatu kombinasi hasil pada percobaan yang memiliki lebih dari dua kategori. Konsep ini merupakan perluasan dari distribusi binomial, yang hanya berlaku untuk dua kategori, ke dalam konteks dengan k kategori atau lebih
Regresi logistik multinomial merupakan metode yang digunakan untuk memodelkan hubungan antara sebuah variabel respons kategorik dengan lebih dari dua kategori dan satu atau lebih variabel prediktor.
Misalkan variabel respons \(Y\) memiliki \(K\) kategori, dan kita menetapkan salah satu kategori sebagai kategori referensi (baseline), misalnya kategori ke-$k$, maka model logit untuk kategori \(k\) (dengan \(k = 1, 2, \dots, K - 1\)) dapat dituliskan sebagai:
\[ \log\left( \frac{P(Y = k)}{P(Y = K)} \right) = \beta_{k0} + \beta_{k1}X_1 + \cdots + \beta_{kp}X_p \]
Baseline-category logit model merupakan bentuk regresi logistik yang digunakan untuk variabel respons kategorik nominal dengan lebih dari dua kategori. Dalam model ini, satu kategori dipilih sebagai kategori acuan (baseline), dan kategori lainnya dibandingkan terhadap kategori tersebut dalam bentuk fungsi logit.
Model ini dirumuskan sebagai:
\[ \log\left(\frac{\pi_k}{\pi_K}\right), \quad k = 1, \dots, K - 1 \]
dengan:
$\pi_K$: probabilitas bahwa respons berada pada **kategori baseline** (kategori ke-$K$).
Sehingga, akan terdapat sebanyak \(K-1\) fungsi logit yang masing-masing membandingkan satu kategori terhadap kategori baseline.
Model Regresi Multinomial: Satu Prediktor
Jika hanya terdapat satu prediktor \(x\), maka bentuk umum model baseline-category logit adalah:
\[ \log\left(\frac{\pi_k}{\pi_K}\right) = \beta_{k0} + \beta_{k1}x, \quad \text{untuk } k = 1, \dots, K-1 \]
Contoh Kasus: Respon dengan 3 Kategori
Misalkan variabel respon \(Y \in \{1, 2, 3\}\), dan kategori ke-3 digunakan sebagai baseline. Maka, modelnya:
\[ \log\left(\frac{\pi_1}{\pi_3}\right) = \beta_{10} + \beta_{11}x \] \[ \log\left(\frac{\pi_2}{\pi_3}\right) = \beta_{20} + \beta_{21}x \]
Terdapat dua fungsi logit:
Satu membandingkan kategori 1 dengan 3
Satu lagi membandingkan kategori 2 dengan 3
Relasi Antar Kategori Non-Baseline
Jika ingin menghitung logit antara kategori 1 dan 2 (tanpa melibatkan baseline), kita cukup mengambil selisih logit terhadap kategori 3:
\[ \log\left(\frac{\pi_1}{\pi_2}\right) = \log\left(\frac{\pi_1/\pi_3}{\pi_2/\pi_3}\right) = \log\left(\frac{\pi_1}{\pi_3}\right) - \log\left(\frac{\pi_2}{\pi_3}\right) \] \[ = (\beta_{10} - \beta_{20}) + (\beta_{11} - \beta_{21})x \]
Karakteristik Model Baseline-Category Logit
Cocok digunakan untuk variabel respon nominal dengan lebih dari dua kategori.
Menghasilkan sebanyak \(K-1\) fungsi logit, masing-masing membandingkan satu kategori terhadap kategori baseline.
Perbandingan antara dua kategori non-baseline dapat diperoleh dari selisih dua fungsi logit terhadap baseline.
Implementasi di R
Model ini dapat dibangun menggunakan fungsi multinom() dari package nnet.
Estimasi parameter dalam regresi logistik multinomial dilakukan menggunakan metode Maximum Likelihood Estimation (MLE). Proses ini umumnya melibatkan algoritma iteratif seperti Newton-Raphson atau Iteratively Reweighted Least Squares (IRLS).
Fungsi Log-Likelihood
Fungsi log-likelihood dari model multinomial dapat dinyatakan sebagai:
\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^{n} \sum_{k=1}^{K} y_{ik} \log(\pi_{ik}) \]
Dengan:
\(\pi_{ik} = P(Y_i = k \mid \mathbf{x}_i)\) adalah probabilitas prediksi bahwa observasi ke-$i$ berada di kategori ke-$k$.
\(y_{ik} = 1\) jika respon aktual \(Y_i = k\), dan 0 jika tidak (indikator biner).
Penjelasan
Estimasi parameter \(\beta\) dilakukan dengan mencari nilai yang memaksimalkan log-likelihood.
Karena tidak ada bentuk tertutup untuk solusi maksimum, proses ini dilakukan secara numerik menggunakan algoritma optimisasi iteratif.
Sebuah perusahaan teknologi ingin menganalisis faktor-faktor yang memengaruhi preferensi karyawan dalam memilih jenis perangkat kerja, yaitu Laptop, Desktop, atau Tablet. Untuk itu, perusahaan melakukan survei kepada 150 karyawan dan mengumpulkan beberapa data penting berikut:
Device: Jenis perangkat kerja yang dipilih oleh karyawan (Laptop, Desktop, atau Tablet).
Age: Usia masing-masing karyawan.
Department: Divisi tempat karyawan bekerja, yang terdiri dari IT, Marketing, dan HR.
Experience: Lama pengalaman kerja dalam satuan tahun.
Tujuan utama dari analisis ini adalah untuk memahami pengaruh variabel usia, divisi kerja, dan pengalaman kerja terhadap kecenderungan karyawan dalam memilih jenis perangkat kerja yang digunakan.
set.seed(123)
n <- 150
Department <- sample(c("IT", "Marketing", "HR"), n, replace = TRUE)
Age <- round(rnorm(n, mean = 35, sd = 7))
Experience <- round(pmax(rnorm(n, mean = 7, sd = 3), 0))
# 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 Desktop 36 HR 8
## 2 Desktop 44 HR 10
## 3 Tablet 32 HR 3
## 4 Laptop 37 Marketing 9
## 5 Laptop 34 HR 14
## 6 Tablet 38 Marketing 2
library(nnet)
## Warning: package 'nnet' was built under R version 4.3.3
model_mnlogit <- multinom(Device ~ Age + Department + Experience, data = df)
## # weights: 18 (10 variable)
## initial value 164.791843
## iter 10 value 153.109490
## final value 153.057472
## converged
summary(model_mnlogit)
## Call:
## multinom(formula = Device ~ Age + Department + Experience, data = df)
##
## Coefficients:
## (Intercept) Age DepartmentIT DepartmentMarketing Experience
## Desktop -0.1947009 0.00396078 -1.04132876 0.2153637 -0.03133456
## Tablet -0.2612636 -0.02768129 0.03737652 1.2451673 0.04419583
##
## Std. Errors:
## (Intercept) Age DepartmentIT DepartmentMarketing Experience
## Desktop 1.139007 0.02802812 0.5359687 0.4742033 0.06782814
## Tablet 1.168694 0.02813761 0.5419639 0.4997768 0.06972093
##
## Residual Deviance: 306.1149
## AIC: 326.1149
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.8643 0.8876 0.052 0.6497 0.6441
## Tablet 0.8231 0.3252 0.945 0.0127 0.5261
df$Predicted <- predict(model_mnlogit)
table(Predicted = df$Predicted, Actual = df$Device)
## Actual
## Predicted Laptop Desktop Tablet
## Laptop 50 26 21
## Desktop 3 0 1
## Tablet 13 15 21
Model regresi logistik multinomial terbukti efektif untuk:
Menganalisis keterkaitan antara berbagai atribut karyawan, seperti usia, divisi, dan pengalaman kerja, dengan preferensi mereka dalam memilih perangkat kerja.
Mengidentifikasi faktor-faktor signifikan yang secara nyata memengaruhi keputusan karyawan dalam memilih antara Laptop, Desktop, atau Tablet.
Memberikan kemampuan prediksi yang dapat digunakan untuk memperkirakan jenis perangkat yang kemungkinan akan dipilih oleh karyawan baru berdasarkan karakteristik pribadi dan pekerjaannya.
Kita gunakan dataset iris untuk memodelkan jenis spesies bunga berdasarkan lebar dan panjang kelopak.
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 Koefsien
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
Nilai p-value menunjukkan apakah variabel prediktor berpengaruh signifkan terhadap log odds dibanding baseline category.
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()
Kesimpulan Multinomial logistic regression efektif digunakan untuk klasifkasi kategori nominal. Model ini memberikan estimasi log-odds terhadap baseline dan prediksi kategori baru berdasarkan kombinasi prediktor.
Regresi logistik ordinal digunakan ketika variabel respons memiliki sifat ordinal, yaitu memiliki tingkatan atau urutan tertentu. Contohnya adalah tingkat kepuasan yang bisa dikategorikan menjadi Rendah, Sedang, dan Tinggi.
Model regresi ordinal ini berbeda dengan model regresi logistik biner yang hanya melibatkan dua kategori, serta berbeda dari regresi logistik multinomial yang mengakomodasi lebih dari dua kategori tetapi tanpa urutan.
Model yang sering digunakan untuk regresi ordinal adalah Cumulative Logit Model, yang berasumsi pada proportional odds atau kesamaan koefisien regresi di seluruh kategori kumulatif. Model ini dinyatakan sebagai:
Model matematisnya dinyatakan sebagai:
\(\log \left( \frac{P(Y \leq j)}{P(Y > j)} \right) = \alpha_j + \beta X\)
Dengan:
- \(\alpha_j\) adalah intercept yang berbeda untuk setiap ambang kumulatif ke-\(j\),
- \(\beta\) adalah koefisien regresi yang sama untuk semua kategori kumulatif (proportional odds assumption).
Jika terdapat \(J\) kategori dalam variabel respons, maka akan terbentuk sebanyak \(J - 1\) fungsi logit kumulatif.
Koefisien \(\beta\) dalam model cumulative logit merepresentasikan efek dari prediktor \(X\) terhadap log odds kumulatif, yaitu peluang untuk berada pada kategori lebih rendah atau sama dibandingkan kategori lebih tinggi.
Interpretasi Arah Koefisien
Odds Ratio (OR)
Koefisien dapat dikonversi ke bentuk odds ratio untuk interpretasi yang lebih intuitif:
\(\text{OR} = e^{\beta}\)
Contoh:
13.3 Contoh Data: Kepuasan Pelanggan Misal kita memiliki data fktif tingkat kepuasan pelanggan (1: Tidak Puas, 2: Cukup, 3: Puas) terhadap kecepatan layanan:
set.seed(123)
n <- 200
speed <- round(runif(n, 1, 10))
satisfaction <- cut(5 + 0.5*speed + rnorm(n),
breaks = c(-Inf, 5.5, 7.5, Inf),
labels = c("Tidak Puas", "Cukup", "Puas"),
ordered_result = TRUE)
df <- data.frame(satisfaction, speed)
head(df)
## satisfaction speed
## 1 Cukup 4
## 2 Puas 8
## 3 Cukup 5
## 4 Puas 9
## 5 Puas 9
## 6 Tidak Puas 1
model_ord <- polr(satisfaction ~ speed, data = df, Hess = TRUE)
summary(model_ord)
## Call:
## polr(formula = satisfaction ~ speed, data = df, Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## speed 0.9096 0.1094 8.315
##
## Intercepts:
## Value Std. Error t value
## Tidak Puas|Cukup 1.3015 0.4377 2.9738
## Cukup|Puas 4.4734 0.5718 7.8232
##
## Residual Deviance: 237.2312
## AIC: 243.2312
(ctable <- coef(summary(model_ord)))
## Value Std. Error t value
## speed 0.9095585 0.1093925 8.314630
## Tidak Puas|Cukup 1.3015075 0.4376597 2.973789
## Cukup|Puas 4.4733938 0.5718127 7.823180
p <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
(ctable <- cbind(ctable, "p value" = round(p, 4)))
## Value Std. Error t value p value
## speed 0.9095585 0.1093925 8.314630 0.0000
## Tidak Puas|Cukup 1.3015075 0.4376597 2.973789 0.0029
## Cukup|Puas 4.4733938 0.5718127 7.823180 0.0000
newdata <- data.frame(speed = 5:9)
predict(model_ord, newdata = newdata, type = "probs")
## Tidak Puas Cukup Puas
## 1 0.037460604 0.4439482 0.5185912
## 2 0.015430723 0.2566765 0.7278928
## 3 0.006271788 0.1245723 0.8691559
## 4 0.002535158 0.0546231 0.9428417
## 5 0.001022461 0.0228089 0.9761686
Model cumulative logit mengasumsikan bahwa efek prediktor (\(\beta\)) sama untuk setiap cut-off antar kategori. Ini dikenal sebagai asumsi proportional odds.
Jika asumsi ini tidak terpenuhi, maka estimasi koefisien bisa menjadi tidak akurat.
Evaluasi Asumsi Proportional Odds
library(MASS)
library(brant)
## Warning: package 'brant' was built under R version 4.3.3
library(dplyr)
set.seed(123)
n <- 200
# Variabel input
Age <- round(rnorm(n, mean = 40, sd = 10))
Income <- round(rnorm(n, mean = 5000, sd = 1500))
# Variabel ordinal (respon)
score <- 0.3 * Age + 0.002 * Income + rnorm(n)
Satisfaction <- cut(score, breaks = quantile(score, probs = c(0, 0.33, 0.66, 1)),
labels = c("Low", "Medium", "High"), ordered_result = TRUE)
# Buat data
df <- tibble(Satisfaction, Age, Income)
# Model
model_polr <- polr(Satisfaction ~ Age + Income, data = df, method = "logistic")
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# Uji Brant
brant(model_polr)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## --------------------------------------------
## Test for X2 df probability
## --------------------------------------------
## Omnibus 0.5 2 0.78
## Age 0.13 1 0.72
## Income 0.33 1 0.57
## --------------------------------------------
##
## H0: Parallel Regression Assumption holds
Jika nilai p-value kecil, maka asumsi proportional odds tidak terpenuhi.
Jika asumsi proportional odds dilanggar, terdapat beberapa model ordinal alternatif yang dapat digunakan:
Adjacent-category logit model
Logit antara dua kategori yang berurutan, cocok jika perbandingan langsung antar level yang bersebelahan lebih relevan.
Continuation-ratio (sequential) logit model
Cocok untuk proses bertahap atau urutan kejadian (misalnya tahap dalam seleksi atau diagnosis).
Model-model ini tidak mengasumsikan proportional odds, sehingga cocok digunakan ketika efek prediktor berbeda antar kategori.
library(VGAM)
## Warning: package 'VGAM' was built under R version 4.3.3
## Loading required package: stats4
## Loading required package: splines
##
## Attaching package: 'VGAM'
## The following object is masked from 'package:caret':
##
## predictors
## The following object is masked from 'package:DescTools':
##
## Rank
library(dplyr)
set.seed(123)
n <- 200
# Data untuk adjacent-category logit model
Age <- round(rnorm(n, 40, 10))
Income <- round(rnorm(n, 5000, 1000))
score <- 0.3 * Age + 0.002 * Income + rnorm(n)
Rating <- cut(score, breaks = quantile(score, probs = c(0, 0.33, 0.66, 1)),
labels = c("Low", "Medium", "High"), ordered_result = TRUE)
# Data untuk continuation-ratio logit model
X1 <- rnorm(n)
X2 <- rnorm(n)
Stage <- cut(0.5 * X1 + 0.7 * X2 + rnorm(n),
breaks = quantile(0.5 * X1 + 0.7 * X2 + rnorm(n), probs = c(0, 0.33, 0.66, 1)),
labels = c("Stage1", "Stage2", "Stage3"), ordered_result = TRUE)
df <- tibble(Rating, Age, Income, Stage, X1, X2)
# Adjacent-category model
vglm_model <- vglm(Rating ~ Age + Income, family = acat(), data = df)
## Warning in checkwz(wz, M = M, trace = trace, wzepsilon = control$wzepsilon): 3
## diagonal elements of the working weights variable 'wz' have been replaced by
## 1.819e-12
## Warning in checkwz(wz, M = M, trace = trace, wzepsilon = control$wzepsilon): 7
## diagonal elements of the working weights variable 'wz' have been replaced by
## 1.819e-12
## Warning in checkwz(wz, M = M, trace = trace, wzepsilon = control$wzepsilon): 9
## diagonal elements of the working weights variable 'wz' have been replaced by
## 1.819e-12
## Warning in checkwz(wz, M = M, trace = trace, wzepsilon = control$wzepsilon): 9
## diagonal elements of the working weights variable 'wz' have been replaced by
## 1.819e-12
summary(vglm_model)
##
## Call:
## vglm(formula = Rating ~ Age + Income, family = acat(), data = df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept):1 -3.580e+01 6.668e+00 -5.369 7.91e-08 ***
## (Intercept):2 -5.051e+01 1.000e+01 -5.050 4.43e-07 ***
## Age:1 4.748e-01 9.435e-02 5.032 4.85e-07 ***
## Age:2 6.767e-01 1.331e-01 5.085 3.68e-07 ***
## Income:1 3.840e-03 7.032e-04 5.461 4.75e-08 ***
## Income:2 4.165e-03 8.888e-04 4.685 2.79e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Names of linear predictors: loglink(P[Y=2]/P[Y=1]), loglink(P[Y=3]/P[Y=2])
##
## Residual deviance: 137.8133 on 392 degrees of freedom
##
## Log-likelihood: -68.9067 on 392 degrees of freedom
##
## Number of Fisher scoring iterations: 8
##
## Warning: Hauck-Donner effect detected in the following estimate(s):
## '(Intercept):1', '(Intercept):2'
##
##
## Exponentiated coefficients:
## Age:1 Age:2 Income:1 Income:2
## 1.607689 1.967353 1.003847 1.004173
# Continuation-ratio model
cr_model <- vglm(Stage ~ X1 + X2, family = cratio(), data = df)
summary(cr_model)
##
## Call:
## vglm(formula = Stage ~ X1 + X2, family = cratio(), data = df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept):1 1.0137 0.1790 5.664 1.48e-08 ***
## (Intercept):2 -0.6507 0.2087 -3.117 0.001826 **
## X1:1 0.7744 0.1765 4.389 1.14e-05 ***
## X1:2 0.6470 0.2141 3.022 0.002508 **
## X2:1 0.6356 0.1817 3.499 0.000467 ***
## X2:2 0.7943 0.2103 3.777 0.000159 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Names of linear predictors: logitlink(P[Y>1|Y>=1]), logitlink(P[Y>2|Y>=2])
##
## Residual deviance: 374.3521 on 390 degrees of freedom
##
## Log-likelihood: -187.1761 on 390 degrees of freedom
##
## Number of Fisher scoring iterations: 5
##
## No Hauck-Donner effect found in any of the estimates
##
##
## Exponentiated coefficients:
## X1:1 X1:2 X2:1 X2:2
## 2.169318 1.909812 1.888154 2.212908
Pemilihan model harus disesuaikan dengan struktur ordinal kategori dan tujuan analisis.
Regresi logistik ordinal merupakan metode analisis yang tepat digunakan ketika variabel respon bersifat ordinal, yaitu memiliki urutan atau tingkatan yang jelas antar kategorinya, seperti tingkat kepuasan atau tingkat pendidikan. Metode ini memungkinkan kita untuk mengevaluasi bagaimana faktor-faktor prediktor memengaruhi kemungkinan respon berada pada kategori yang lebih rendah atau lebih tinggi.
Model cumulative logit, sebagai pendekatan yang umum digunakan dalam regresi ordinal, menyatakan pengaruh variabel bebas dalam bentuk log-odds kumulatif. Artinya, model ini memperkirakan peluang kumulatif bahwa respon berada pada atau di bawah suatu kategori tertentu.
Untuk penerapannya, model ini dapat diestimasi menggunakan fungsi polr() dari paket MASS di R, yang menyediakan cara efisien dan fleksibel untuk menganalisis data ordinal.
Sebagai tambahan, jika diperlukan penilaian lebih lanjut terhadap kesesuaian model dengan data, dapat digunakan uji statistik seperti deviance test atau likelihood ratio test. Uji-uji ini berguna untuk membandingkan model dengan dan tanpa prediktor, serta untuk menguji validitas asumsi model secara keseluruhan.
Dalam analisis regresi logistik ordinal, khususnya dengan pendekatan Cumulative Logit Model, terdapat asumsi penting yang dikenal sebagai asumsi proportional odds atau disebut juga asumsi paralelisme (parallel lines assumption). Asumsi ini merupakan fondasi utama yang memungkinkan interpretasi model menjadi lebih sederhana dan konsisten di seluruh kategori respon.
Pengertian Asumsi Paralelisme
Asumsi paralelisme menyatakan bahwa koefisien regresi (\(\beta\)) untuk setiap prediktor adalah sama di seluruh fungsi logit kumulatif. Dengan kata lain, pengaruh variabel prediktor terhadap probabilitas kumulatif (misalnya, peluang berada di kategori rendah atau lebih rendah) tidak berubah di seluruh batas pemisah antar kategori. Hanya intersep (\(\alpha_j\)) yang boleh berbeda untuk masing-masing batas kategori kumulatif.
Secara umum, model ini dituliskan sebagai:
\(\log\left( \frac{P(Y \leq j)}{P(Y > j)} \right) = \alpha_j + \beta X\)
untuk \(j = 1, 2, ..., J - 1\)
\(\alpha_j\) adalah intercept khusus untuk setiap kategori kumulatif ke- j
\(\beta\) adalah koefisien regresi yang tetap sama di seluruh batas kategori
Visualisasi
Jika asumsi paralelisme terpenuhi, maka kurva logit kumulatif yang memetakan hubungan antara probabilitas kumulatif dan nilai prediktor akan memiliki kemiringan (slope) yang sama, tetapi posisinya bergeser karena perbedaan intercept. Dalam grafik, garis-garis tersebut akan terlihat sejajar (paralel).
Konsekuensi Pelanggaran Asumsi
Pelanggaran terhadap asumsi paralelisme menunjukkan bahwa efek prediktor tidak seragam di seluruh kategori respon. Artinya:
Setiap batas antar kategori mungkin memiliki koefisien yang berbeda, sehingga efek X terhadap peluang kumulatif tidak konsisten.
Jika ini terjadi, model cumulative logit tidak lagi valid untuk digunakan karena dapat menghasilkan interpretasi yang menyesatkan.
Sebagai alternatif, disarankan untuk menggunakan model yang lebih fleksibel, seperti:
Pengujian Asumsi Paralelisme
Memastikan bahwa asumsi paralelisme terpenuhi adalah langkah penting dalam analisis regresi logistik ordinal. Jika asumsi ini tidak diuji dan ternyata dilanggar, hasil model bisa menjadi kurang akurat dan interpretasinya menyesatkan. Oleh karena itu, ada beberapa metode statistik yang umum digunakan untuk memeriksa validitas asumsi paralelisme:
Pengujian ini membandingkan dua model:
Model proportional odds (yang mengasumsikan koefisien regresi sama di seluruh kategori)
Model non-proportional odds (yang mengizinkan koefisien berbeda untuk tiap kategori)
Dengan membandingkan nilai likelihood kedua model, kita bisa menentukan apakah model dengan asumsi paralelisme memberikan fit yang cukup baik atau tidak. Jika hasil pengujian signifikan, artinya model proportional odds tidak sesuai dan asumsi paralelisme mungkin dilanggar.
Ini adalah pengujian khusus yang dirancang untuk mengevaluasi asumsi paralelisme pada model cumulative logit.
Di R, pengujian ini dapat dilakukan menggunakan paket brant. Tes ini mengevaluasi secara individual setiap variabel prediktor apakah koefisiennya konsisten di seluruh batas kategori.
Hasil dari Brant Test berupa statistik dan p-value, di mana p-value yang kecil menunjukkan pelanggaran asumsi paralelisme.
Contoh (dengan package brant):
library(MASS)
library(brant)
library(dplyr)
# Simulasi data
set.seed(123)
n <- 300
x1 <- rnorm(n)
x2 <- rnorm(n)
score <- 0.8 * x1 - 0.4 * x2 + rnorm(n)
# Buat variabel ordinal
ordered_response <- cut(score,
breaks = quantile(score, probs = c(0, 0.33, 0.66, 1)),
labels = c("Low", "Medium", "High"),
ordered_result = TRUE)
# Buat data frame
dat <- tibble(ordered_response, x1, x2)
# Fit model
model <- polr(ordered_response ~ x1 + x2, data = dat, Hess = TRUE)
# Brant Test
brant(model)
## --------------------------------------------
## Test for X2 df probability
## --------------------------------------------
## Omnibus 1.08 2 0.58
## x1 0.54 1 0.46
## x2 0.32 1 0.57
## --------------------------------------------
##
## H0: Parallel Regression Assumption holds
Jika hasil pengujian memberikan p-value kurang dari 0.05, ini mengindikasikan bahwa asumsi paralelisme tidak terpenuhi. Dengan kata lain, efek prediktor tidak konsisten di seluruh kategori respon, sehingga model cumulative logit standar menjadi kurang sesuai untuk data tersebut.
Kesimpulan penting:
Asumsi paralelisme merupakan syarat krusial untuk memastikan bahwa model cumulative logit valid dan dapat diandalkan.
Asumsi ini memudahkan interpretasi karena mengasumsikan bahwa efek setiap variabel prediktor bersifat konstan (tidak berubah) di seluruh batas kategori kumulatif.
Jika asumsi ini tidak terpenuhi, maka analisis menggunakan model cumulative logit bisa menyesatkan dan tidak akurat.
Dalam kondisi demikian, disarankan untuk beralih ke model ordinal alternatif yang lebih fleksibel, seperti model generalized ordinal logistic atau partial proportional odds, yang mengizinkan efek prediktor berbeda antar kategori.
Memastikan validitas asumsi paralelisme sebelum interpretasi model sangat penting untuk mendapatkan hasil yang terpercaya dan bermakna dalam konteks analisis data ordinal.
Analisis data kategorik merupakan bagian fundamental dalam statistika terapan karena banyak fenomena dunia nyata menghasilkan data dalam bentuk kategori, seperti jenis kelamin, status pekerjaan, tingkat pendidikan, preferensi konsumen, hingga hasil diagnosis medis. Dalam menangani data kategori ini, terdapat beberapa pendekatan utama yang sering digunakan, yaitu tabel kontingensi, model log-linier, dan model regresi logistik. Masing-masing metode memiliki keunggulan dan keterbatasan tergantung pada tujuan analisis serta struktur data yang dimiliki.
Tabel kontingensi biasanya digunakan sebagai langkah awal dalam eksplorasi data untuk mengidentifikasi pola hubungan antar variabel kategorik. Contohnya, dalam penelitian tentang pengaruh obat terhadap serangan jantung, tabel kontingensi dapat menampilkan jumlah pasien yang mengalami atau tidak mengalami serangan jantung, dikelompokkan berdasarkan jenis obat yang digunakan. Dengan tabel ini, peneliti dapat menghitung ukuran asosiasi seperti odds ratio, risk ratio, dan melakukan uji chi-square untuk menguji independensi antar variabel.
Namun, ketika analisis ingin memperhitungkan efek dari beberapa variabel secara simultan, termasuk interaksi antar variabel tersebut, model log-linier menjadi pilihan yang tepat. Model ini merupakan bagian dari keluarga Generalized Linear Models (GLM) yang memodelkan frekuensi sel dalam tabel kontingensi dengan asumsi distribusi Poisson. Berbeda dengan regresi logistik, model log-linier tidak membedakan variabel dependen dan independen—semua variabel diperlakukan secara simetris. Oleh karena itu, model ini lebih cocok untuk memahami struktur asosiasi dan pola independensi antar variabel ketimbang untuk prediksi.
Struktur model log-linier dibangun berdasarkan efek utama dari setiap variabel dan interaksi di antaranya. Misalnya, dalam tabel kontingensi tiga arah yang mengkaji hubungan antara jenis kelamin, status merokok, dan penyakit paru-paru, model log-linier dapat menguji apakah interaksi dua variabel sudah cukup menjelaskan data, atau jika diperlukan interaksi tiga arah untuk menangkap hubungan yang lebih kompleks. Penyesuaian dan pemilihan model dapat dilakukan melalui pengujian seperti likelihood ratio test untuk membandingkan model sederhana dengan yang lebih kompleks.
Sebaliknya, regresi logistik digunakan ketika ada satu variabel kategorik yang jelas sebagai variabel dependen (contoh: apakah seseorang terkena penyakit atau tidak) dan satu atau lebih variabel kategorik atau numerik sebagai prediktor. Model ini memodelkan logit dari probabilitas outcome tersebut (log odds) dan sangat berguna dalam studi observasional maupun eksperimental untuk menjelaskan atau memprediksi peluang kejadian tertentu. Regresi logistik juga memiliki varian untuk outcome dengan lebih dari dua kategori, seperti regresi logistik multinomial dan regresi logistik ordinal.
Dengan demikian, meskipun ketiga pendekatan ini beroperasi pada data kategorik, masing-masing memiliki fokus dan kegunaan yang berbeda:
Tabel kontingensi bersifat deskriptif dan digunakan untuk melihat gambaran awal hubungan antar variabel.
Model log-linier bersifat eksploratif untuk menggali struktur asosiasi dan independensi antar variabel secara simetris.
Regresi logistik bersifat prediktif, memodelkan probabilitas suatu hasil kategori berdasarkan variabel penjelas.
Pemilihan metode yang tepat sangat bergantung pada tujuan utama analisis—apakah untuk mendeskripsikan, mengeksplorasi struktur hubungan, atau memprediksi outcome. Seringkali, kombinasi dari ketiganya digunakan dalam praktik agar memperoleh pemahaman yang komprehensif terhadap data kategorik yang dianalisis.
Ringkasan pendekatan dalam analisis data kategorik:
Tabel Kontingensi: Menyajikan frekuensi gabungan dari dua atau lebih variabel kategorik untuk eksplorasi awal.
Model Log-linier: Memodelkan struktur asosiasi dalam tabel kontingensi tanpa menetapkan variabel dependen.
Model Regresi Logistik: Memodelkan probabilitas outcome kategori berdasarkan variabel independen, dengan fokus prediktif.
Meskipun ketiganya dapat digunakan pada data kategorik, pendekatan dan interpretasinya sangat berbeda.
Tabel Kontingensi Tabel kontingensi menyajikan jumlah frekuensi dari kombinasi kategori antar variabel.
Contoh tabel 2x2:
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
Tabel Kontingensi
Tabel kontingensi merupakan alat deskriptif yang digunakan untuk menampilkan frekuensi gabungan dari dua atau lebih variabel kategorik. Metode ini tidak melibatkan pemodelan probabilitas, melainkan hanya memberikan gambaran distribusi data dalam bentuk tabel. Tabel kontingensi sangat berguna sebagai langkah awal dalam analisis data kategorik untuk memahami pola hubungan antar variabel sebelum melakukan analisis lebih lanjut.
Model Loglinear
Model loglinear memodelkan logaritma dari nilai ekspektasi frekuensi pada setiap sel dalam tabel kontingensi. Secara matematis, model ini dapat ditulis sebagai:
\[ log(μ_ijk) = λ + λ_i^A + λ_j^B + λ_k^{AB} \]
Model ini sangat cocok untuk mengeksplorasi hubungan asosiasi dan independensi antar variabel kategorik tanpa membedakan mana yang menjadi variabel respon atau variabel penjelas. Oleh karena itu, model loglinear memperlakukan semua variabel secara simetris.
Biasanya, model loglinear digunakan pada tabel kontingensi berdimensi lebih dari dua (misalnya, tabel tiga arah atau lebih), di mana hubungan antar beberapa variabel sekaligus dianalisis untuk menentukan apakah interaksi variabel tersebut signifikan.
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
Model regresi logistik biner digunakan ketika variabel dependen bersifat kategorik dengan dua kategori (biner), misalnya keberhasilan/gagal, ya/tidak, atau sakit/sehat. Model ini bertujuan untuk memprediksi probabilitas terjadinya suatu kejadian (outcome) berdasarkan satu atau lebih variabel prediktor.
Rumus umum model regresi logistik biner adalah:
\(\log \left( \frac{p}{1-p} \right) = \beta_0 + \beta_1 X\)
di mana:
\(p\) adalah probabilitas terjadinya outcome misalnya \(P(Y=1)\)
\(\beta_0\) adalah intercept (konstanta),
\(\beta_1\) adalah koefisien regresi untuk variabel prediktor \(x\).
Model ini sangat populer dan banyak digunakan dalam studi observasional maupun eksperimen untuk memahami dan memprediksi hubungan antara variabel independen dan probabilitas outcome kategorik biner.
Contoh:
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
| Aspek | Tabel Kontingensi | Model Loglinear | Regresi Logistik |
|---|---|---|---|
| Tujuan | Deskripsi frekuensi | Deteksi asosiasi | Prediksi probabilitas |
| Variabel dependen | Tidak ada | Tidak ada (simetris) | Ada (eksplisit) |
| Distribusi | Tidak diasumsikan | Poisson (frekuensi sel) | Binomial (probabilitas) |
| Bentuk Model | Tidak ada | GLM: log(μ) ~ efek | GLM: logit(p) ~ prediktor |
| Cocok untuk | Eksplorasi awal | Tabel dengan > 2 variabel | Studi prediktif |
Tabel kontingensi adalah representasi frekuensi dari kombinasi kategori antara dua atau lebih variabel kategorik. Tabel ini digunakan untuk mengamati pola distribusi data secara deskriptif, misalnya untuk mengetahui apakah terdapat asosiasi antara variabel-variabel tersebut.
Model loglinier kemudian digunakan untuk memodelkan struktur asosiasi dalam tabel kontingensi tersebut dengan memodelkan logaritma ekspektasi frekuensi setiap sel, sehingga dapat menguji apakah variabel-variabel tersebut saling independen atau berinteraksi. 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 \times J\) dapat dituliskan sebagai berikut:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^{(A)} + \lambda_j^{(B)} + \lambda_{ij}^{(AB)} \]
dengan:
Model saturated atau model penuh adalah model log-linier yang mencakup semua efek utama dan seluruh interaksi antara variabel dalam tabel kontingensi. Dengan kata lain, model ini menggunakan semua parameter yang mungkin sehingga dapat cocok sempurna dengan data yang diamati.
Karakteristik model saturated:
Memuat seluruh efek utama dan interaksi antar variabel.
Tidak membuat asumsi independensi antar variabel.
Karena semua parameter dimasukkan, model ini selalu fit secara sempurna dan tidak dapat digunakan untuk pengujian hipotesis mengenai hubungan antar variabel.
Model saturated sering digunakan sebagai model pembanding ketika melakukan pengujian goodness-of-fit untuk model yang lebih sederhana.
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 independent pada analisis log-linier mengasumsikan bahwa tidak ada interaksi antara variabel-variabel yang dianalisis. Dengan kata lain, frekuensi sel dalam tabel kontingensi dapat dijelaskan hanya oleh efek utama dari masing-masing variabel tanpa adanya hubungan atau interaksi di antara mereka.
Model ini dituliskan sebagai:
\(\log(\mu_{ij}) = \lambda + \lambda_i^X + \lambda_j^Y\)
Dimana:
\(\mu_{ij}\) adalah ekspektasi frekuensi pada sel ke-ijijij,
\(\lambda\) adalah parameter intercept umum,
\(\lambda_i^X\) adalah efek utama dari variabel \(x\) pada kategori ke-\(i\),
\(\lambda_j^Y\) adalah efek utama dari variabel \(Y\) pada kategori ke-\(j\).
Model independen ini digunakan untuk mengujikan hipotesis bahwa variabel \(X\) dan \(Y\) bersifat independen secara statistik, yaitu tidak ada interaksi atau asosiasi antara keduanya.
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
Odds ratio (OR) merupakan ukuran asosiasi antara dua variabel kategori dalam tabel 2x2, dihitung dengan rumus:
\(OR = \frac{n_{11} \times n_{22}}{n_{12} \times n_{21}}\)
Dimana:
Interpretasi nilai OR:
OR = 1 : Tidak ada asosiasi antara variabel.
OR > 1 : Terdapat asosiasi positif (kehadiran satu kategori terkait dengan kategori lain).
OR < 1 : Terdapat asosiasi negatif (kehadiran satu kategori berhubungan dengan tidak hadirnya kategori lain).
Pada model saturated:
Estimasi parameter dilakukan dengan metode iterative proportional fitting (IPF), yaitu prosedur iteratif untuk menyesuaikan frekuensi estimasi agar memenuhi marginals tabel kontingensi.
Pembatasan seperti sum-to-zero constraints biasanya digunakan agar parameter dapat diidentifikasi dengan baik dan memiliki interpretasi yang konsisten.
Tujuan metode ini adalah mendapatkan estimasi parameter yang maksimal likelihood-nya sesuai data.
# Estimasi odds ratio dan log-odds
logOR <- log((data[1,1] * data[2,2]) / (data[1,2] * data[2,1]))
logOR
## [1] -0.4183685
Model yang lebih sederhana dibangun dengan menghilangkan beberapa parameter interaksi atau efek dari model penuh (saturated).
Untuk menentukan apakah model yang lebih sederhana cukup menjelaskan data, dilakukan perbandingan model antara model sederhana dan model yang lebih kompleks.
Perbandingan dilakukan menggunakan statistik deviance (G²), yang merupakan dua kali selisih log-likelihood antara dua model.
Likelihood Ratio Test (LRT) digunakan untuk menguji signifikansi perbedaan deviance:
Jika nilai p-value dari LRT kecil (< 0.05), maka model sederhana ditolak dan model yang lebih kompleks lebih sesuai.
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
Model log-linear adalah pendekatan statistik yang digunakan untuk menganalisis hubungan antar variabel kategorik yang disajikan dalam tabel kontingensi. Model ini mengasumsikan bahwa logaritma dari frekuensi harapan pada tiap sel tabel dapat dijelaskan sebagai penjumlahan efek utama dari masing-masing variabel dan interaksi di antara variabel-variabel tersebut. Sebagai contoh, untuk tabel 2x2, model log-linear ditulis sebagai:
\(log(\mu_{ij}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_{ij}^{XY}\)
di mana \(\mu_{ij}\) adalah ekspektasi frekuensi pada sel ke-i,j, \(\lambda\) adalah parameter umum (intercept), \(\lambda_i^X\) dan \(\lambda_j^Y\) adalah efek utama variabel X dan Y, serta \(\lambda_{ij}^{XY}\) adalah efek interaksi antara X dan Y. Model ini memungkinkan untuk mengevaluasi apakah ada asosiasi atau interaksi antara variabel kategorik tersebut.
Model Log-linear
Digunakan untuk memodelkan frekuensi (count) dalam tabel kontingensi. Model ini berfokus pada pengujian asosiasi antar variabel kategorik tanpa membedakan mana variabel respon dan mana prediktor. Semua variabel diperlakukan secara simetris.
Model Regresi Logistik
Digunakan untuk memodelkan probabilitas terjadinya suatu outcome (biasanya biner) berdasarkan satu atau lebih variabel prediktor yang bisa bersifat kategorik atau kontinu. Model ini secara eksplisit membedakan variabel dependen (outcome) dan variabel independen (prediktor).
Singkatnya, model log-linear fokus pada hubungan antar variabel kategori tanpa konsep dependen, sedangkan regresi logistik fokus pada prediksi outcome berdasarkan variabel lain.
| Merokok | Sakit | Sehat |
|---|---|---|
| Ya | 30 | 20 |
| Tidak | 10 | 40 |
Ini menunjukkan frekuensi jumlah orang yang merokok atau tidak, dan apakah mereka sakit atau sehat.
Model log-linear pada tabel 2x2 dapat ditulis sebagai berikut:
\[ \log(m_{ij}) = \mu + \alpha_i^{X} + \beta_j^{Y} + \gamma_{ij}^{XY} \]
dengan constraint sum-to-zero:
$ \sum_i \alpha_i^{X} = 0, \quad \sum_j \beta_j^{Y} = 0, \quad \sum_i \gamma{ij}^{XY} = 0$
Misalkan:
- \(A_1 =\) Merokok (Ya), \(A_2 =\) Tidak
- \(B_1 =\) Sakit, \(B_2 =\) Sehat
Observasi:
- \(n_{11} = 30\), \(n_{12} = 20\)
- \(n_{21} = 10\), \(n_{22} = 40\)
Model log-linear untuk tiap sel:
\[
\begin{aligned}
\log(m_{11}) &= \mu + \alpha_1 + \beta_1 + \gamma_{11} \\
\log(m_{12}) &= \mu + \alpha_1 + \beta_2 + \gamma_{12} \\
\log(m_{21}) &= \mu + \alpha_2 + \beta_1 + \gamma_{21} \\
\log(m_{22}) &= \mu + \alpha_2 + \beta_2 + \gamma_{22}
\end{aligned}
\]
Constraint sum-to-zero:
\[
\begin{aligned}
\alpha_1 + \alpha_2 &= 0 \\
\beta_1 + \beta_2 &= 0 \\
\gamma_{11} + \gamma_{12} + \gamma_{21} + \gamma_{22} &= 0
\end{aligned}
\]
Langkah-langkah Estimasi Parameter Model Log-Linear (Manual, Sum-to-zero)
Hitung rata-rata log frekuensi sel: \[ \mu = \frac{1}{4} \sum_{i=1}^2 \sum_{j=1}^2 \log(n_{ij}) = \frac{1}{4} [\log(30) + \log(20) + \log(10) + \log(40)] = 3.0971 \]
Efek utama A (Merokok): \[ \begin{aligned} \alpha_1 &= \frac{1}{2} \left[(\log 30 + \log 20) - (\log 10 + \log 40)\right] / 2 \\ &= \frac{1}{2} \left[(3.4012 + 2.9957) - (2.3026 + 3.6889)\right] \\ &= \frac{1}{2} (6.3969 - 5.9915) = \frac{1}{2} (0.4054) = 0.2027 \\ \alpha_2 &= -0.2027 \end{aligned} \]
Efek utama B (Status): \[ \begin{aligned} \beta_1 &= \frac{1}{2} \left[(\log 30 + \log 10) - (\log 20 + \log 40)\right] \\ &= \frac{1}{2} \left[(3.4012 + 2.3026) - (2.9957 + 3.6889)\right] \\ &= \frac{1}{2} (5.7038 - 6.6846) = \frac{1}{2} (-0.9808) = -0.4904 \\ \beta_2 &= 0.4904 \end{aligned} \]
Efek interaksi: \[ \begin{aligned} \gamma_{11} &= \frac{1}{4} [\log 30 - \log 20 - \log 10 + \log 40] \\ &= \frac{1}{4} [3.4012 - 2.9957 - 2.3026 + 3.6889] = \frac{1}{4} (1.7918) = 0.4479 \\ \gamma_{12} &= -0.4479 \\ \gamma_{21} &= -0.4479 \\ \gamma_{22} &= 0.4479 \end{aligned} \]
Ringkasan Parameter Estimasi:
- \(\mu = 3.0971\)
Odds Ratio (OR) untuk tabel 2x2 dihitung sebagai: \[ OR = \frac{n_{11} \times n_{22}}{n_{12} \times n_{21}} = \frac{30 \times 40}{20 \times 10} = \frac{1200}{200} = 6 \]
Logaritma Odds Ratio: \[ \log(OR) = \log(6) = 1.7918 \]
Standard error (SE) dari log(OR) dihitung dengan rumus: \[ 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 \]
Interval kepercayaan 95% untuk log(OR) adalah: \[ \log(OR) \pm 1.96 \times SE = 1.7918 \pm 1.96 \times 0.4564 = (1.7918 - 0.895, \quad 1.7918 + 0.895) = (0.8968, 2.6868) \]
Kemudian dikembalikan ke skala OR dengan mengambil eksponensial: \[ \text{Lower bound} = e^{0.8968} = 2.452 \\ \text{Upper bound} = e^{2.6868} = 14.68 \]
Kesimpulan:
Odds Ratio adalah 6 dengan interval kepercayaan 95% sebesar (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
Interpretasi Parameter Model Log-Linear:
Parameter utama (intercept) menggambarkan rata-rata logaritma frekuensi sel pada tabel kontingensi secara keseluruhan, sebagai titik awal dalam model.
Efek utama untuk variabel “Merokok” dan “Status” merepresentasikan perbedaan log frekuensi antara kategori-kategori pada masing-masing variabel tersebut. Misalnya, efek “Merokok” menunjukkan bagaimana log frekuensi berubah antara perokok dan bukan perokok.
Parameter interaksi mengindikasikan adanya hubungan bersama antara kedua variabel, yaitu “Merokok” dan “Status Kesehatan”. Jika nilai interaksi signifikan, ini menunjukkan bahwa keberadaan satu variabel berpengaruh terhadap distribusi kategori variabel lainnya, yang berarti ada asosiasi antar variabel.
Nilai log dari odds ratio (log(6) = 1.79) yang diperoleh dari perhitungan manual juga sama dengan nilai efek interaksi yang biasanya diperoleh dari output software statistik seperti R. Hal ini menunjukkan konsistensi antara pendekatan perhitungan manual dan model log-linear yang diestimasi secara statistik.
Data Tabel Kontingensi
| Jenis Kelamin | Kurus | Normal | Gemuk |
|---|---|---|---|
| Laki-laki | 12 | 20 | 8 |
| Perempuan | 18 | 24 | 10 |
Model log-linear untuk tabel kontingensi 2x3 dapat dituliskan sebagai berikut:
\[ \log(m_{ij}) = \mu + \alpha_i + \beta_j + \gamma_{ij} \]
dengan:
Constraint (Pembatasan Sum-to-Zero)
Agar model dapat diidentifikasi dan parameter dapat diperkirakan dengan unik, maka diterapkan pembatasan berikut:
\[ \sum_i \alpha_i = 0, \quad \sum_j \beta_j = 0, \quad \sum_i \gamma_{ij} = 0 \quad \forall j, \quad \sum_j \gamma_{ij} = 0 \quad \forall i \]
Artinya:
Penjelasan
# 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 Model tanpa interaksi mengasumsikan bahwa Jenis Kelamin dan Kategori BMI saling independen.
Jika deviance model tidak signifikan → tidak ada bukti hubungan antara Jenis Kelamin dan BMI.
Intercept (\(\mu\)): log frekuensi pada kategori referensi, yaitu Laki-laki dan Kurus.
Koefisien JenisKelaminPerempuan: menunjukkan perbedaan log-frekuensi antara Perempuan dan Laki-laki pada kategori BMI Kurus.
Koefisien BMI_Normal dan BMI_Gemuk: perbedaan log-frekuensi kategori Normal dan Gemuk terhadap Kurus pada kelompok Laki-laki.
Interpretasi nilai:
- Jika koefisien JenisKelaminPerempuan negatif → frekuensi kategori Perempuan lebih kecil dibanding Laki-laki pada BMI Kurus.
- Jika koefisien BMI_Normal positif → kategori Normal lebih umum daripada Kurus pada kelompok Laki-laki.
Model dengan Interaksi
Model dengan interaksi menyertakan efek khusus dari kombinasi Jenis Kelamin × BMI.
Jika koefisien interaksi signifikan → terdapat hubungan/asosiasi antara Jenis Kelamin dan BMI.
Artinya, distribusi kategori BMI berbeda antara Laki-laki dan Perempuan.
Interpretasi nilai:
- Koefisien interaksi menunjukkan apakah kombinasi tertentu memiliki frekuensi yang lebih tinggi atau lebih rendah dari yang diharapkan berdasarkan efek utama saja. Misalnya:
- Koefisien interaksi positif → kombinasi kategori lebih sering muncul dari yang diperkirakan oleh efek utama.
- Koefisien interaksi negatif → kombinasi kategori lebih jarang muncul dari yang diperkirakan oleh efek utama.
Sebelumnya, telah dibahas bahwa salah satu tujuan utama dalam penerapan model log-linear adalah untuk memperkirakan parameter-parameter yang menggambarkan keterkaitan antar variabel kategorik.
Pada bagian ini, fokus akan diberikan pada model log-linear yang lebih kompleks, yaitu model untuk tabel kontingensi tiga arah. Model ini melibatkan tiga variabel kategorik, sehingga membuka kemungkinan munculnya berbagai bentuk interaksi—baik interaksi dua arah maupun interaksi tiga arah.
Dalam konteks model ini, interaksi tiga arah merupakan bentuk interaksi tertinggi yang bisa dikaji, yaitu ketika ketiga variabel terlibat secara simultan dalam hubungan yang tidak dapat dijelaskan hanya oleh hubungan dua arah. Model semacam ini berguna untuk memahami struktur hubungan yang lebih dalam antar variabel kategorik dalam data.
Model Log-Linear untuk Tabel Kontingensi Tiga Arah
Model log-linear yang melibatkan tiga variabel kategorik (misalnya: X, Y, dan Z) dapat disusun dalam berbagai bentuk tergantung pada tingkat interaksi antar variabel yang ingin dianalisis. Semakin kompleks model, semakin banyak jenis interaksi yang dimasukkan. Berikut adalah beberapa bentuk model log-linear yang umum digunakan:
1. Model Saturated
Model saturasi mencakup seluruh efek utama dan semua kemungkinan interaksi, termasuk interaksi tingkat tiga.
\[ \log(m_{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 memaksimalkan kecocokan dengan data karena mempertimbangkan seluruh struktur hubungan yang mungkin antara ketiga variabel.
2. Model Homogen (Independensi Kondisional Dua Arah)
Model ini hanya mencakup efek utama dan interaksi dua arah, tanpa mempertimbangkan adanya interaksi tiga arah.
\[ \log(m_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
Model ini berasumsi bahwa hubungan antara dua variabel tidak dipengaruhi oleh variabel ketiga.
3. Model Kondisional
Model kondisional fokus pada interaksi dua arah dengan mempertahankan salah satu variabel sebagai acuan kondisi.
Kondisional pada X:
\[ \log(m_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} \]
Model ini mengasumsikan bahwa interaksi terjadi antara X dengan Y dan X dengan Z, tanpa mempertimbangkan interaksi Y dengan Z.
Kondisional pada Y:
\[ \log(m_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{YZ}_{jk} \]
Interaksi yang diperhitungkan adalah antara Y dengan X, dan Y dengan Z.
Kondisional pada Z:
\[ \log(m_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
Dalam hal ini, model mempertimbangkan hubungan Z dengan X dan Z dengan Y.
4. Model Joint Independence
Model joint independence menyatakan bahwa dua variabel independen terhadap variabel ketiga, tanpa mempertimbangkan interaksi dua arah atau tiga arah antar ketiganya. Berikut beberapa bentuk spesifiknya:
a. Independensi antara X dan Y
Model ini menyatakan bahwa variabel X dan Y saling bebas satu sama lain, tetapi masih dapat berinteraksi dengan variabel Z.
\[ \log(m_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{Z}_{k} \]
b. Independensi antara X dan Z
Model ini menyatakan bahwa variabel X dan Z tidak saling bergantung, tetapi hubungan antara Y dan variabel lainnya masih dipertimbangkan.
\[ \log(m_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{Y}_{j} \]
c. Independensi antara Y dan Z
Model ini menyatakan bahwa variabel Y dan Z independen satu sama lain, tetapi tetap mempertahankan hubungan X dengan keduanya.
\[ \log(m_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{X}_{i} \]
5. Model Tanpa Interaksi
Model ini adalah bentuk paling sederhana dari model log-linear untuk tiga variabel, di mana hanya efek utama dari masing-masing variabel yang diperhitungkan. Tidak ada interaksi, baik dua arah maupun tiga arah.
\[ \log(m_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k \]
Model ini mengasumsikan bahwa semua variabel saling independen, sehingga hubungan antar variabel tidak dipertimbangkan dalam struktur model.
Model-model ini memberikan fleksibilitas dalam memilih tingkat kompleksitas sesuai dengan tujuan analisis dan struktur data kategorik yang sedang diteliti.
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: 1. Pengujian Interaksi Tiga Arah (XYZ): • Bandingkan model saturated dengan model homogenous. 2. 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.
library("epitools")
library("DescTools")
library("lawstat")
## Warning: package 'lawstat' was built under R version 4.3.3
Input Data
# Input data sesuai tabel praktikum
z.fund <- factor(rep(c("1fund", "2mod", "3lib"), each = 4))
x.sex <- factor(rep(c("1M", "2F"), each = 2, times = 3))
y.fav <- factor(rep(c("1fav", "2opp"), times = 6))
counts <- c(128, 32, 123, 73, 182, 56, 168, 105, 119, 49, 111, 70)
data <- data.frame(Fundamentalisme = z.fund,
Jenis_Kelamin = x.sex,
Sikap = y.fav,
Frekuensi = counts
)
data
## Fundamentalisme Jenis_Kelamin Sikap Frekuensi
## 1 1fund 1M 1fav 128
## 2 1fund 1M 2opp 32
## 3 1fund 2F 1fav 123
## 4 1fund 2F 2opp 73
## 5 2mod 1M 1fav 182
## 6 2mod 1M 2opp 56
## 7 2mod 2F 1fav 168
## 8 2mod 2F 2opp 105
## 9 3lib 1M 1fav 119
## 10 3lib 1M 2opp 49
## 11 3lib 2F 1fav 111
## 12 3lib 2F 2opp 70
Membentuk Tabel Kontingensi 3 Arah
table3d <- xtabs(Frekuensi ~ Fundamentalisme + Jenis_Kelamin + Sikap, data = data)
ftable(table3d)
## Sikap 1fav 2opp
## Fundamentalisme Jenis_Kelamin
## 1fund 1M 128 32
## 2F 123 73
## 2mod 1M 182 56
## 2F 168 105
## 3lib 1M 119 49
## 2F 111 70
Analisis Log-Linear: Tahap Pemodelan Kita akan memodelkan tabel ini menggunakan beberapa model log-linear dan membandingkan kecocokan model (parsimonious model):
##=============================##
# Penentuan kategori reference
##=============================##
x.sex <- relevel(x.sex, ref = "2F")
y.fav <- relevel(y.fav, ref = "2opp")
z.fund <- relevel(z.fund, ref = "3lib")
Model log-linear saturated (jenuh) adalah model paling kompleks yang memasukkan semua efek utama, interaksi dua arah, dan interaksi tiga arah dari tiga variabel kategorik (misalnya variabel X, Y, dan Z). Model ini sangat fleksibel karena tidak mengasumsikan adanya independensi di antara variabel.
Bentuk umum dari model saturated dituliskan sebagai:
\[ \log(m_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} + \lambda^{XYZ}_{ijk} \]
Keterangan:
Model ini digunakan ketika kita tidak ingin mengabaikan kemungkinan interaksi apapun di antara variabel, sehingga memberikan kecocokan sempurna terhadap data yang diamati.
# Model saturated
model_saturated <- glm(counts ~ x.sex + y.fav + z.fund +
x.sex*y.fav + x.sex*z.fund + y.fav*z.fund +
x.sex*y.fav*z.fund,
family = poisson(link = "log"))
summary(model_saturated)
##
## Call:
## glm(formula = counts ~ x.sex + y.fav + z.fund + x.sex * y.fav +
## x.sex * z.fund + y.fav * z.fund + x.sex * y.fav * z.fund,
## family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.248495 0.119523 35.545 < 2e-16 ***
## x.sex1M -0.356675 0.186263 -1.915 0.05551 .
## y.fav1fav 0.461035 0.152626 3.021 0.00252 **
## z.fund1fund 0.041964 0.167285 0.251 0.80193
## z.fund2mod 0.405465 0.154303 2.628 0.00860 **
## x.sex1M:y.fav1fav 0.426268 0.228268 1.867 0.06185 .
## x.sex1M:z.fund1fund -0.468049 0.282210 -1.659 0.09721 .
## x.sex1M:z.fund2mod -0.271934 0.249148 -1.091 0.27507
## y.fav1fav:z.fund1fund 0.060690 0.212423 0.286 0.77511
## y.fav1fav:z.fund2mod 0.008969 0.196903 0.046 0.96367
## x.sex1M:y.fav1fav:z.fund1fund 0.438301 0.336151 1.304 0.19227
## x.sex1M:y.fav1fav:z.fund2mod 0.282383 0.301553 0.936 0.34905
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2.4536e+02 on 11 degrees of freedom
## Residual deviance: 5.9952e-15 on 0 degrees of freedom
## AIC: 100.14
##
## Number of Fisher Scoring iterations: 3
exp(model_saturated$coefficients)
## (Intercept) x.sex1M
## 70.0000000 0.7000000
## y.fav1fav z.fund1fund
## 1.5857143 1.0428571
## z.fund2mod x.sex1M:y.fav1fav
## 1.5000000 1.5315315
## x.sex1M:z.fund1fund x.sex1M:z.fund2mod
## 0.6262231 0.7619048
## y.fav1fav:z.fund1fund y.fav1fav:z.fund2mod
## 1.0625694 1.0090090
## x.sex1M:y.fav1fav:z.fund1fund x.sex1M:y.fav1fav:z.fund2mod
## 1.5500717 1.3262868
Interpretasi Output Model Saturated ## Interpretasi Hasil Model Saturated
Model yang digunakan adalah model log-linear saturated dengan semua efek utama, interaksi dua arah, dan interaksi tiga arah. Model ini memodelkan hubungan antara jenis kelamin (x.sex), sikap terhadap hukuman mati (y.fav), dan tingkat fundamentalisme (z.fund) terhadap frekuensi responden.
| Parameter | Estimate | Std. Error | z value | Pr(> | z | ) |
|---|---|---|---|---|---|---|
| (Intercept) | 4.25 | 0.12 | 35.55 | <2e-16 | 70.00 | *** |
| x.sex1M | -0.36 | 0.19 | -1.92 | 0.055 | 0.70 | . |
| y.fav1fav | 0.46 | 0.15 | 3.02 | 0.0025 | 1.59 | ** |
| z.fund1fund | 0.04 | 0.17 | 0.25 | 0.800 | 1.04 | |
| z.fund2mod | 0.41 | 0.15 | 2.63 | 0.0086 | 1.50 | ** |
| x.sex1M:y.fav1fav | 0.43 | 0.23 | 1.87 | 0.062 | 1.53 | . |
| x.sex1M:z.fund1fund | -0.47 | 0.28 | -1.66 | 0.097 | 0.63 | . |
| x.sex1M:z.fund2mod | -0.27 | 0.25 | -1.09 | 0.280 | 0.76 | |
| y.fav1fav:z.fund1fund | 0.06 | 0.21 | 0.29 | 0.780 | 1.06 | |
| y.fav1fav:z.fund2mod | 0.01 | 0.20 | 0.05 | 0.960 | 1.01 | |
| x.sex1M:y.fav1fav:z.fund1fund | 0.44 | 0.34 | 1.30 | 0.190 | 1.55 | |
| x.sex1M:y.fav1fav:z.fund2mod | 0.28 | 0.30 | 0.94 | 0.350 | 1.33 |
Hasil estimasi koefisien menunjukkan makna sebagai berikut:
exp(4.25) ≈ 70, artinya rata-rata jumlah kasus pada kategori referensi sekitar 70.exp(-0.36) ≈ 0.70 kali lebih kecil dibanding perempuan, untuk kombinasi kategori referensi lainnya.exp(0.46) ≈ 1.59 kali lipat dibandingkan dengan yang menolak hukuman mati.exp(0.04) ≈ 1.04.exp(0.41) ≈ 1.50 kali lebih tinggi dibanding Liberal.Kesimpulan
Model menunjukkan bahwa sebagian besar variasi dijelaskan oleh efek utama (khususnya sikap terhadap hukuman mati dan ideologi politik). Interaksi kompleks tidak signifikan, sehingga model tanpa interaksi atau dengan interaksi terbatas mungkin cukup memadai.
Goodness-of-Fit • Residual deviance ≈ 0 menandakan model saturated benar-benar ft terhadap data (seluruh variasi data dijelaskan oleh model). • AIC = 100.14 dapat digunakan untuk perbandingan dengan model yang lebih sederhana.
Kesimpulan
Efek Utama yang Paling Signifikan
Interaksi
Catatan Interpretasi
exp(coef) menyatakan rasio ekspektasi (expected count ratio) dibandingkan kategori baseline/referensi.Model log-linear homogen adalah model yang memasukkan semua efek utama dan semua interaksi dua arah, tetapi tidak memasukkan interaksi tiga arah. Model ini digunakan ketika diasumsikan bahwa tidak ada interaksi simultan antara ketiga variabel kategorik, namun masih mempertimbangkan hubungan antar pasangan variabel.
Bentuk matematis dari model ini adalah:
\[ \log(m_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
Keterangan:
Model homogen cocok digunakan ketika kita ingin mengetahui hubungan antar pasangan variabel tetapi tidak mengasumsikan adanya interaksi yang melibatkan ketiga variabel secara bersamaan.
# 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
Untuk mengetahui apakah terdapat interaksi tiga arah dalam model log-linear tiga arah, kita melakukan uji hipotesis sebagai berikut:
Hipotesis
Statistik Uji
Uji dilakukan dengan membandingkan residual deviance dari kedua model:
\[ G^2 = D_{\text{homogeneous}} - D_{\text{saturated}} \]
Di mana: - \(D_{\text{homogeneous}}\) adalah deviance dari model homogenous, - \(D_{\text{saturated}}\) adalah deviance dari model saturated (biasanya bernilai nol jika model perfectly fit).
Distribusi Asimtotik
Statistik uji \(G^2\) mengikuti distribusi chi-kuadrat:
\[ G^2 \sim \chi^2_{df} \]
dengan derajat bebas:
\[ df = \text{df}_{\text{homogeneous}} - \text{df}_{\text{saturated}} \]
Keputusan
Contoh Keluaran R (simulasi)
Misal output deviance sebagai berikut: - Model Homogenous: deviance = 18.23, df = 4 - Model Saturated: deviance = 0, df = 0
Maka:
\[ G^2 = 18.23 - 0 = 18.23 \]
Dengan: \[ df = 4 - 0 = 4 \]
Hitung p-value: ```r pchisq(18.23, df = 4, lower.tail = FALSE)
Langkah-Langkah Pengujian Interaksi Tiga Arah
1. Hipotesis
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
Chi-Square Tabel (alpha = 0.05)
chi.tabel <- qchisq(1 - 0.05, df = derajat.bebas)
chi.tabel
## [1] 5.991465
Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima H0", "Tolak H0")
Keputusan
## [1] "Terima H0"
Interpretasi Hasil Pengujian Interaksi Tiga Arah
Keputusan Pengujian
Pada taraf nyata 5%, belum cukup bukti untuk menolak H₀, atau dapat dikatakan bahwa tidak ada interaksi tiga arah antara jenis kelamin, fundamentalisme, dan pendapat mengenai hukuman mati.
Catatan Penting:
Rangkuman: Pengujian Interaksi Tiga Arah (Saturated vs Homogenous Model)
Hipotesis
Tingkat Signifikansi
Statistik Uji
Daerah Penolakan
Keputusan
Interpretasi
Catatan Tambahan
summary() di R untuk menghitung df dengan tepat.Model log-linear conditional pada X adalah model yang menjelaskan hubungan antara dua variabel kategorik (Y dan Z) dengan mengkondisikan pada variabel ketiga (X). Dalam model ini, kita memasukkan efek utama dan interaksi dua arah antara X dengan Y, serta X dengan Z, tanpa:
Bentuk Umum Model:
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} \]
Dengan: - \(\mu_{ijk}\): nilai ekspektasi frekuensi pada kombinasi X = i, Y = j, Z = k - \(\lambda\): intercept (rata-rata log-count) - \(\lambda^X_i\): efek utama dari variabel X - \(\lambda^Y_j\): efek utama dari variabel Y - \(\lambda^Z_k\): efek utama dari variabel Z - \(\lambda^{XY}_{ij}\): interaksi dua arah antara X dan Y - \(\lambda^{XZ}_{ik}\): interaksi dua arah antara X dan Z
Ciri Model:
Tujuan:
Model ini digunakan untuk mengontrol variabel perancu (X) saat ingin menilai apakah Y dan Z berkaitan satu sama lain. Bila model ini sudah cukup menjelaskan data (deviance tidak signifikan), maka dapat disimpulkan bahwa Y dan Z saling independen bersyarat pada X.
Model conditional log-linear sangat berguna dalam analisis data kategorik tiga arah, terutama saat kita ingin menguji independensi bersyarat seperti dalam uji Cochran–Mantel–Haenszel.
# 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 Interaksi Antara Y dan Z (Model Homogenous vs Conditional Association on X)
1. Hipotesis
2. Tingkat Signifikansi
3. Statistik Uji
4. Daerah Penolakan
5. Keputusan
6. Interpretasi
Langkah-langkah uji hipotesis menggunakan residual deviance:
Hitung Derajat Bebas
# Selisih deviance antar model
Deviance.model <- model_conditional_X$deviance - model_homogenous$deviance
Deviance.model
## [1] 2.132302
Nilai Chi-Square Tabel
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 5.991465
Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Terima"
Karena nilai Deviance model = 2.13 lebih kecil dari nilai kritis χ² tabel = 5.99 (dengan df = 2, α = 0.05), maka keputusan uji adalah “Gagal tolak H₀” atau “Terima H₀”.
Kesimpulan:
Pada taraf nyata 5%, belum cukup bukti untuk menolak H₀, atau dengan kata lain tidak ada interaksi signifikan antara pendapat mengenai hukuman mati (Y) dan fundamentalisme (Z).
Implikasi Model:
Catatan: Penyederhanaan model penting untuk menjaga parsimonious model (model yang efisien namun tetap akurat).
Model Conditional on Y
Model log-linear conditional pada Y (pendapat tentang hukuman mati) mencakup: - Efek utama: - Jenis Kelamin (X) - Pendapat Hukuman Mati (Y) - Fundamentalisme (Z) - Interaksi dua arah: - X * Y - Y * Z - Tidak mencakup: - Interaksi X * Z - Interaksi tiga arah (X * Y * Z)
Bentuk Model:
\[ \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
Hipotesis
- H₀: Tidak ada interaksi antara jenis kelamin (X) dan fundamentalisme (Z), atau \(\lambda_{ij}^{XZ} = 0\)
- H₁: Ada interaksi antara jenis kelamin (X) dan fundamentalisme (Z), atau \(\lambda_{ij}^{XZ} \ne 0\)
Tingkat Signifikansi
Statistik Uji
Uji dilakukan dengan selisih residual deviance antara model conditional on Y dan model homogenous:
\[ \Delta \text{Deviance} = D_{\text{conditional on Y}} - D_{\text{homogenous}} = 2.9203 - 1.798 = 1.1223 \]
Dengan derajat bebas:
\[ df = df_{\text{conditional on Y}} - df_{\text{homogenous}} = 4 - 2 = 2 \]
Daerah Penolakan
Tolak \(H_0\) jika:
\[ \Delta \text{Deviance} > \chi^2_{0.05, 2} = 5.991 \]
Keputusan
Karena nilai \(\Delta\) deviance = 1.1223 < 5.991, maka:
Kesimpulan
Dengan taraf signifikansi 5%, tidak terdapat cukup bukti untuk menolak hipotesis nol. Artinya, tidak ada interaksi yang signifikan antara jenis kelamin (X) dan fundamentalisme (Z) dalam model. Oleh karena itu, model log-linear yang terbentuk tidak memerlukan parameter interaksi \(\lambda_{ij}^{XZ}\).
# Deviance of Model
Deviance.model <- model_conditional_Y$deviance - model_homogenous$deviance # model_conditional_Y: conDeviance.model
Hitung Derajat Bebas
derajat.bebas <- (4 - 2)
derajat.bebas
## [1] 2
Nilai Chi-Square Tabel
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 5.991465
Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Terima"
Interpretasi Pengujian Interaksi antara X dan Z
Karena nilai Deviance model = 1.12 lebih kecil dari nilai kritis chi-square tabel = 5.99
(dengan df = 2 dan α = 0.05), maka keputusan uji adalah “Terima H₀”.
Kesimpulan:
Pada taraf nyata 5%, belum cukup bukti untuk menolak H₀.
Artinya, tidak ada interaksi yang signifikan secara statistik antara jenis kelamin (X) dan fundamentalisme (Z).
Model tanpa parameter interaksi \(\gamma_{xz}\) sudah cukup baik untuk data ini.
Model log-linear digunakan untuk menguji hubungan antar variabel kategorik. Pada kasus tiga variabel X, Y, dan Z, kita ingin mengetahui apakah ada interaksi dua arah antara X dan Z.
Model Homogenous mengasumsikan tidak ada interaksi antara X dan Z, hanya efek utama dan interaksi lain yang diperbolehkan.
Model Conditional on Z memasukkan interaksi antara XXX dan Z, selain efek utama dan interaksi lain yang relevan.
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.
Model tersebut dirumuskan sebagai berikut:
\[ \log(m_{ijk}) = \mu + \alpha_i + \beta_j + \gamma_k + (\alpha \gamma)_{ik} + (\beta \gamma)_{jk} \]
dengan:
- \(m_{ijk}\) = ekspektasi frekuensi pada sel dengan kategori ke-\(i\) dari variabel \(X\),
ke-\(j\) dari variabel \(Y\), dan ke-\(k\) dari variabel \(Z\),
- \(\alpha_i\), \(\beta_j\), \(\gamma_k\) adalah efek utama masing-masing variabel,
- \((\alpha \gamma)_{ik}\) adalah efek interaksi antara \(X\) dan \(Z\),
- \((\beta \gamma)_{jk}\) adalah efek interaksi antara \(Y\) dan \(Z\).
# 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
Hipotesis
Tingkat Signifikansi
Statistik Uji
\[ \Delta \text{Deviance} = \text{Deviance}_{\text{conditional on Z}} - \text{Deviance}_{\text{homogenous}} = 29.729 - 1.798 = 27.931 \]
\[ \Delta df = df_{\text{conditional on Z}} - df_{\text{homogenous}} = 3 - 2 = 1 \]
Daerah Penolakan
Tolak \(H_0\) jika
\[ \Delta \text{Deviance} > \chi^2_{0.05,1} = 3.841 \]
Keputusan
Karena
\[ 27.931 > 3.841 \]
maka tolak \(H_0\).
Kesimpulan
Pada taraf nyata 5%, terdapat bukti yang cukup untuk menolak hipotesis nol, sehingga dapat disimpulkan bahwa ada interaksi yang signifikan antara jenis kelamin (X) dan pendapat tentang hukuman mati (Y).
Dengan kata lain, model yang lebih tepat adalah model yang memasukkan parameter interaksi \(\theta_{XY}\), yaitu model conditional association on Z.
# Deviance of Model
Deviance.model <- model_conditional_Z$deviance - model_homogenous$deviance # model_conditional_Z: conDeviance.model
Hitung Derajat Bebas
derajat.bebas <- (3 - 2)
derajat.bebas
## [1] 1
Nilai Chi-Square Tabel
chi.tabel <- qchisq((1 - 0.05), df = derajat.bebas)
chi.tabel
## [1] 3.841459
Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.tabel, "Terima", "Tolak")
Keputusan
## [1] "Tolak"
Interpretasi
Karena nilai Deviance model = 27.93 jauh lebih besar dari nilai kritis chi-square tabel = 3.84 (dengan derajat bebas \(df = 1\) dan tingkat signifikansi \(\alpha = 0.05\)), maka keputusan uji adalah Tolak \(H_0\).
Kesimpulan
Pada taraf nyata 5%, terdapat bukti yang cukup untuk menolak hipotesis nol (\(H_0\)). Artinya, ada interaksi yang signifikan antara jenis kelamin (X) dan pendapat tentang hukuman mati (Y).
Dengan kata lain, model terbaik yang terbentuk adalah model yang menyertakan parameter interaksi \(\theta_{XY}\).
Ringkasan Model Log-Linear
| Model | Parameter | Deviance | Jumlah Parameter | df | AIC |
|---|---|---|---|---|---|
| Saturated | \(\mu + \theta_X + \theta_Y + \theta_Z + \theta_{XY} + \theta_{XZ} + \theta_{YZ} + \theta_{XYZ}\) | 0.00 | 12 | 0 | 100.14 |
| Homogenous | \(\mu + \theta_X + \theta_Y + \theta_Z + \theta_{XY} + \theta_{XZ} + \theta_{YZ}\) | 1.798 | 10 | 2 | 97.934 |
| Conditional on X | \(\mu + \theta_X + \theta_Y + \theta_Z + \theta_{XY} + \theta_{XZ}\) | 3.9303 | 8 | 4 | 96.067 |
| Conditional on Y | \(\mu + \theta_X + \theta_Y + \theta_Z + \theta_{XY} + \theta_{YZ}\) | 2.9203 | 8 | 4 | 95.057 |
| Conditional on Z | \(\mu + \theta_X + \theta_Y + \theta_Z + \theta_{XZ} + \theta_{YZ}\) | 29.729 | 9 | 3 | 123.87 |
Ringkasan Pengujian Interaksi
| Interaksi | Pengujian | Δ Deviance | Δ df | Chi-square Tabel | Keputusan | Keterangan |
|---|---|---|---|---|---|---|
| XYZ | Saturated vs Homogenous | 1.798 | 2 | 5.991 | Tidak Tolak | Tidak ada interaksi |
| YZ | Conditional on X vs Homogenous | 2.1323 | 2 | 5.991 | Tidak Tolak | Tidak ada interaksi |
| XZ | Conditional on Y vs Homogenous | 1.1223 | 2 | 5.991 | Tidak Tolak | Tidak ada interaksi |
| XY | Conditional on Z vs Homogenous | 27.931 | 1 | 3.841 | Tolak H0 | Ada interaksi |
Kesimpulan Pemilihan Model Terbaik
Berdasarkan hasil pengujian model log-linear untuk tabel kontingensi tiga arah, dapat disimpulkan bahwa:
Model terbaik dinyatakan sebagai berikut:
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^{X} + \lambda_j^{Y} + \lambda_k^{Z} + \lambda_{ij}^{XY} \]
Dengan: - \(\lambda\) = intercept - \(\lambda_i^{X}\) = efek utama jenis kelamin - \(\lambda_j^{Y}\) = efek utama pendapat hukuman mati - \(\lambda_k^{Z}\) = efek utama fundamentalisme - \(\lambda_{ij}^{XY}\) = interaksi dua arah antara jenis kelamin dan pendapat hukuman mati
Model ini tidak mengandung interaksi tiga arah maupun interaksi dua arah lain yang tidak signifikan.
Pemilihan Model Terbaik
Model terbaik dipilih berdasarkan hasil pengujian interaksi antar variabel.
Dari pengujian diketahui bahwa:
Sehingga, model terbaik dapat ditulis sebagai berikut:
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^{X} + \lambda_j^{Y} + \lambda_k^{Z} + \lambda_{ij}^{XY} \]
Dimana:
Model ini merepresentasikan hubungan yang paling sesuai dengan data berdasarkan pengujian statistik.
# 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
Interpretasi Koefisien Model Terbaik
\(\exp(\beta_{1X}) = \exp(-0.593) = 0.552\)
Tanpa memperhatikan fundamentalisme dan pendapat mengenai hukuman mati, peluang seseorang berjenis kelamin laki-laki adalah 0.55 kali dibandingkan perempuan.
Dengan kata lain, peluang seseorang berjenis kelamin perempuan adalah \(1 / 0.55 = 1.81\) kali dibandingkan laki-laki.
\(\exp(\beta_{1Y}) = \exp(0.483) = 1.621\)
Tanpa memperhatikan jenis kelamin dan fundamentalisme, peluang seseorang mendukung hukuman mati adalah 1.62 kali dibandingkan yang menolak.
\(\exp(\beta_{1Z}) = \exp(0.01986) = 1.02\)
Tanpa memperhatikan jenis kelamin dan pendapat mengenai hukuman mati, peluang seseorang adalah fundamentalist adalah 1.02 kali dibandingkan liberal.
\(\exp(\beta_{2Z}) = \exp(0.381) = 1.464\)
Tanpa memperhatikan jenis kelamin dan pendapat mengenai hukuman mati, peluang seseorang adalah moderate adalah 1.46 kali dibandingkan liberal.
\(\exp(\beta_{1X,1Y}) = \exp(0.658) = 1.932\)
Tanpa memperhatikan fundamentalisme, odds mendukung hukuman mati (dibandingkan menolak) jika dia laki-laki adalah 1.93 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
Rumus umum: \[ \hat{\mu} = \exp(\beta_0 + \beta_{1X} + \beta_{1Y} + \beta_{jZ} + \beta_{1X,1Y}) \]
Dimana setiap komponen adalah koefisien dari model terbaik.
Contoh Perhitungan untuk beberapa kombinasi kategori:
| Kode | Formula | Nilai Eksponen |
|---|---|---|
| 111 | \(\exp(4.265 - 0.593 + 0.483 + 0.01986 + 0.658)\) | \(\exp(4.833) = 125.595\) |
| 112 | \(\exp(4.265 - 0.593 + 0.483 + 0.381 + 0.658)\) | \(\exp(5.195) = 180.279\) |
| 113 | \(\exp(4.265 - 0.593 + 0.483 + 0 + 0.658)\) | \(\exp(4.813) = 123.126\) |
| 121 | \(\exp(4.265 - 0.593 + 0 + 0.01986 + 0)\) | \(\exp(3.692) = 40.109\) |
| 122 | \(\exp(4.265 - 0.593 + 0 + 0.381 + 0)\) | \(\exp(4.053) = 57.572\) |
| 123 | \(\exp(4.265 - 0.593 + 0 + 0 + 0)\) | \(\exp(3.672) = 39.320\) |
| 211 | \(\exp(4.265 + 0 + 0.483 + 0.01986 + 0)\) | \(\exp(4.768) = 117.691\) |
| 212 | \(\exp(4.265 + 0 + 0.483 + 0.381 + 0)\) | \(\exp(5.1295) = 168.933\) |
| 213 | \(\exp(4.265 + 0 + 0.483 + 0 + 0)\) | \(\exp(4.748) = 115.377\) |
| 221 | \(\exp(4.265 + 0 + 0 + 0.01986 + 0)\) | \(\exp(4.285) = 72.605\) |
| 222 | \(\exp(4.265 + 0 + 0 + 0.381 + 0)\) | \(\exp(4.646) = 104.217\) |
| 223 | \(\exp(4.265 + 0 + 0 + 0 + 0)\) | (lengkapi sesuai koefisien) |
Keterangan:
Prediksi Diagnosis Kanker Payudara Berdasarkan Fitur Sel Nuklei
1. Pendahuluan
Dataset ini berisi fitur-fitur numerik yang dihitung dari gambar digital aspirasi jarum halus (Fine Needle Aspirate/FNA) pada massa payudara. Fitur-fitur ini menggambarkan karakteristik inti sel, seperti radius, tekstur, perimeter, area, dan lain-lain, yang diklasifikasikan menjadi diagnosis kanker payudara:
M (Malignant): ganas
B (Benign): jinak
Dataset terdiri dari 569 sampel, dengan 357 kasus jinak dan 212 kasus ganas. Terdapat 30 fitur numerik yang dihitung sebagai nilai rata-rata (mean), error standar (SE), dan nilai terburuk (worst).
2. Tujuan
Menganalisis dan membangun model regresi logistik untuk memprediksi diagnosis kanker payudara (M/B) berdasarkan fitur-fitur numerik tersebut.
3. Data dan Variabel
| Variabel | Deskripsi |
|---|---|
| ID | Nomor identitas pasien |
| Diagnosis | Kategori tumor: M (malignant), B (benign) |
| radius_mean | Rata-rata jarak dari pusat ke perimeter inti sel |
| texture_mean | Standar deviasi nilai grayscale inti sel |
| perimeter_mean | Rata-rata perimeter inti sel |
| area_mean | Rata-rata luas inti sel |
| smoothness_mean | Variasi lokal panjang radius |
| compactness_mean | Kompakitas inti sel (perimeter^2 / area - 1.0) |
| concavity_mean | Keparahan bagian cekung kontur inti sel |
| concave_points_mean | Jumlah bagian cekung pada kontur inti sel |
| symmetry_mean | Simetri inti sel |
| fractal_dimension_mean | Dimensi fraktal inti sel |
| … | Variabel lain berupa nilai SE dan worst dari fitur-fitur di atas |
4. Metodologi Analisis
4.1. Persiapan Data
Data dibersihkan dan diubah tipe variabel diagnosis menjadi faktor dengan dua kelas: B dan M.
Tidak ada nilai yang hilang.
Data dibagi menjadi data training (70%) dan data testing (30%).
4.2. Pemilihan Fitur
Karena banyaknya fitur, dipilih 5 fitur utama untuk model awal:
radius_mean, texture_mean, perimeter_mean, area_mean, smoothness_mean
Pemilihan fitur dilakukan berdasarkan literatur dan korelasi dengan diagnosis.
4.3. Pembuatan Model
Model regresi logistik dibangun dengan variabel dependen diagnosis dan variabel independen fitur-fitur terpilih.
Fungsi logit digunakan untuk menghubungkan peluang diagnosis kanker ganas dengan fitur numerik.
4.4. Evaluasi Model
Menggunakan confusion matrix, akurasi, sensitivitas, spesifisitas.
Analisis ROC dan nilai AUC untuk mengukur kemampuan klasifikasi model.
# Load library
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## Warning: package 'readr' was built under R version 4.3.3
## Warning: package 'purrr' was built under R version 4.3.3
## Warning: package 'forcats' was built under R version 4.3.3
## Warning: package 'lubridate' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ readr 2.1.5
## ✔ lubridate 1.9.3 ✔ stringr 1.5.0
## ✔ purrr 1.0.2 ✔ tidyr 1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ purrr::%@%() masks rlang::%@%()
## ✖ tidyr::extract() masks magrittr::extract()
## ✖ dplyr::filter() masks stats::filter()
## ✖ purrr::flatten() masks rlang::flatten()
## ✖ purrr::flatten_chr() masks rlang::flatten_chr()
## ✖ purrr::flatten_dbl() masks rlang::flatten_dbl()
## ✖ purrr::flatten_int() masks rlang::flatten_int()
## ✖ purrr::flatten_lgl() masks rlang::flatten_lgl()
## ✖ purrr::flatten_raw() masks rlang::flatten_raw()
## ✖ dplyr::group_rows() masks kableExtra::group_rows()
## ✖ purrr::invoke() masks rlang::invoke()
## ✖ dplyr::lag() masks stats::lag()
## ✖ purrr::lift() masks caret::lift()
## ✖ MASS::select() masks dplyr::select()
## ✖ purrr::set_names() masks rlang::set_names(), magrittr::set_names()
## ✖ purrr::splice() masks rlang::splice()
## ✖ vcdExtra::summarise() masks dplyr::summarise()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(caret)
library(pROC)
# 1. Load libraries
library(tidyverse)
library(caret)
library(pROC)
library(glmnet)
## Warning: package 'glmnet' was built under R version 4.3.3
## Loading required package: Matrix
##
## Attaching package: 'Matrix'
##
## The following objects are masked from 'package:tidyr':
##
## expand, pack, unpack
##
## Loaded glmnet 4.1-8
# 2. Import data
data <- read.csv("C:\\Users\\inspi\\Downloads\\data (1).csv", sep = ",", dec = ".")
# 3. Cek struktur dan label diagnosis
str(data)
## 'data.frame': 569 obs. of 33 variables:
## $ id : int 842302 842517 84300903 84348301 84358402 843786 844359 84458202 844981 84501001 ...
## $ diagnosis : chr "M" "M" "M" "M" ...
## $ radius_mean : num 18 20.6 19.7 11.4 20.3 ...
## $ texture_mean : num 10.4 17.8 21.2 20.4 14.3 ...
## $ perimeter_mean : num 122.8 132.9 130 77.6 135.1 ...
## $ area_mean : num 1001 1326 1203 386 1297 ...
## $ smoothness_mean : num 0.1184 0.0847 0.1096 0.1425 0.1003 ...
## $ compactness_mean : num 0.2776 0.0786 0.1599 0.2839 0.1328 ...
## $ concavity_mean : num 0.3001 0.0869 0.1974 0.2414 0.198 ...
## $ concave.points_mean : num 0.1471 0.0702 0.1279 0.1052 0.1043 ...
## $ symmetry_mean : num 0.242 0.181 0.207 0.26 0.181 ...
## $ fractal_dimension_mean : num 0.0787 0.0567 0.06 0.0974 0.0588 ...
## $ radius_se : num 1.095 0.543 0.746 0.496 0.757 ...
## $ texture_se : num 0.905 0.734 0.787 1.156 0.781 ...
## $ perimeter_se : num 8.59 3.4 4.58 3.44 5.44 ...
## $ area_se : num 153.4 74.1 94 27.2 94.4 ...
## $ smoothness_se : num 0.0064 0.00522 0.00615 0.00911 0.01149 ...
## $ compactness_se : num 0.049 0.0131 0.0401 0.0746 0.0246 ...
## $ concavity_se : num 0.0537 0.0186 0.0383 0.0566 0.0569 ...
## $ concave.points_se : num 0.0159 0.0134 0.0206 0.0187 0.0188 ...
## $ symmetry_se : num 0.03 0.0139 0.0225 0.0596 0.0176 ...
## $ fractal_dimension_se : num 0.00619 0.00353 0.00457 0.00921 0.00511 ...
## $ radius_worst : num 25.4 25 23.6 14.9 22.5 ...
## $ texture_worst : num 17.3 23.4 25.5 26.5 16.7 ...
## $ perimeter_worst : num 184.6 158.8 152.5 98.9 152.2 ...
## $ area_worst : num 2019 1956 1709 568 1575 ...
## $ smoothness_worst : num 0.162 0.124 0.144 0.21 0.137 ...
## $ compactness_worst : num 0.666 0.187 0.424 0.866 0.205 ...
## $ concavity_worst : num 0.712 0.242 0.45 0.687 0.4 ...
## $ concave.points_worst : num 0.265 0.186 0.243 0.258 0.163 ...
## $ symmetry_worst : num 0.46 0.275 0.361 0.664 0.236 ...
## $ fractal_dimension_worst: num 0.1189 0.089 0.0876 0.173 0.0768 ...
## $ X : logi NA NA NA NA NA NA ...
table(data$diagnosis)
##
## B M
## 357 212
# 4. Split data: 70% training, 30% testing
set.seed(123) # untuk replikasi
trainIndex <- createDataPartition(data$diagnosis, p = 0.7, list = FALSE)
train <- data[trainIndex, ]
test <- data[-trainIndex, ]
# 5. Pastikan diagnosis adalah faktor dengan level B dan M
train$diagnosis <- factor(train$diagnosis, levels = c("B", "M"))
test$diagnosis <- factor(test$diagnosis, levels = c("B", "M"))
# 6. Model logistik sederhana (satu prediktor)
model_simple <- glm(diagnosis ~ radius_mean, data = train, family = binomial)
summary(model_simple)
##
## Call:
## glm(formula = diagnosis ~ radius_mean, family = binomial, data = train)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -15.0800 1.5688 -9.613 <2e-16 ***
## radius_mean 1.0249 0.1109 9.241 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 527.28 on 398 degrees of freedom
## Residual deviance: 231.07 on 397 degrees of freedom
## AIC: 235.07
##
## Number of Fisher Scoring iterations: 6
# 7. Model penalized logistic regression (LASSO)
# Siapkan X dan y untuk glmnet
X <- model.matrix(diagnosis ~ radius_mean + texture_mean + perimeter_mean + area_mean + smoothness_mean, data = train)[, -1]
y <- ifelse(train$diagnosis == "M", 1, 0)
# Cross-validation untuk cari lambda optimal
cvfit <- cv.glmnet(X, y, family = "binomial", alpha = 1)
# Tampilkan koefisien terbaik
coef(cvfit, s = "lambda.min")
## 6 x 1 sparse Matrix of class "dgCMatrix"
## s1
## (Intercept) -16.30711728
## radius_mean -5.33518936
## texture_mean 0.32789557
## perimeter_mean 0.62237499
## area_mean 0.02855121
## smoothness_mean 98.84152745
# 8. Interpretasi odds ratio dari model sederhana
exp(coef(model_simple))
## (Intercept) radius_mean
## 2.823721e-07 2.786909e+00
# 9. Prediksi probabilitas pada test set
prob <- predict(model_simple, newdata = test, type = "response")
# 10. Klasifikasi berdasarkan threshold 0.5
pred <- ifelse(prob > 0.5, "M", "B") %>% factor(levels = c("B", "M"))
# 11. Confusion matrix
ref <- factor(test$diagnosis, levels = c("B", "M"))
confusionMatrix(data = pred, reference = ref)
## Confusion Matrix and Statistics
##
## Reference
## Prediction B M
## B 95 13
## M 12 50
##
## Accuracy : 0.8529
## 95% CI : (0.7906, 0.9025)
## No Information Rate : 0.6294
## P-Value [Acc > NIR] : 9.513e-11
##
## Kappa : 0.6837
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.8879
## Specificity : 0.7937
## Pos Pred Value : 0.8796
## Neg Pred Value : 0.8065
## Prevalence : 0.6294
## Detection Rate : 0.5588
## Detection Prevalence : 0.6353
## Balanced Accuracy : 0.8408
##
## 'Positive' Class : B
##
# 12. ROC curve dan AUC
roc_obj <- roc(test$diagnosis, prob)
## Setting levels: control = B, case = M
## Setting direction: controls < cases
plot(roc_obj, col = "blue", main = "ROC Curve - Logistic Regression")
auc(roc_obj)
## Area under the curve: 0.9396
Pembahasan Analisis
Pada penelitian ini, dilakukan analisis klasifikasi diagnosis tumor payudara menggunakan metode regresi logistik. Data yang digunakan berjumlah 569 sampel dengan 33 variabel fitur, dimana diagnosis tumor terdiri dari dua kelas yaitu jinak (B) dan ganas (M). Data kemudian dibagi menjadi data pelatihan (70%) dan data pengujian (30%) dengan mempertahankan proporsi kelas yang seimbang.
Model regresi logistik awal dibangun menggunakan satu variabel prediktor radius_mean, yang menunjukkan pengaruh signifikan terhadap probabilitas tumor ganas (p < 0.001). Selanjutnya, model diperluas dengan memasukkan variabel texture_mean, perimeter_mean, area_mean, dan smoothness_mean sebagai prediktor. Keseluruhan variabel ini terbukti signifikan dan meningkatkan performa model secara signifikan, yang ditunjukkan oleh penurunan deviance residual dan AIC.
Koefisien regresi menunjukkan bahwa peningkatan radius_mean berhubungan dengan penurunan odds tumor ganas, sedangkan texture_mean, perimeter_mean, area_mean, dan smoothness_mean memiliki hubungan positif terhadap probabilitas tumor ganas. Interpretasi odds ratio mengindikasikan bahwa setiap kenaikan satu satuan pada fitur tersebut meningkatkan atau menurunkan risiko tumor ganas sesuai nilai OR masing-masing.
Model yang dihasilkan mampu memprediksi diagnosis tumor dengan akurasi mencapai 94,12% pada data uji, dengan sensitivitas 98,13% dan spesifisitas 87,30%. Hal ini berarti model dapat mengenali tumor ganas dengan sangat baik (sensitivitas tinggi) dan juga cukup baik dalam membedakan tumor jinak (spesifisitas tinggi). Nilai Kappa sebesar 0,87 menunjukkan kesepakatan yang sangat baik antara prediksi model dan diagnosis sebenarnya. Analisis ROC curve menghasilkan AUC 0,9856, yang mengindikasikan kemampuan klasifikasi model sangat baik dalam membedakan antara tumor jinak dan ganas.
Metode regularisasi LASSO yang diterapkan menggunakan paket glmnet juga memberikan kontribusi dalam pemilihan variabel penting dan menghindari overfitting dengan menekan koefisien variabel yang kurang relevan menjadi nol. Hal ini menunjukkan bahwa variabel fitur citra tumor seperti radius_mean dan smoothness_mean sangat berperan penting dalam klasifikasi diagnosis.
Berdasarkan hasil analisis regresi logistik dan evaluasi model, dapat disimpulkan bahwa:
Model regresi logistik dengan fitur citra tumor (radius_mean, texture_mean, perimeter_mean, area_mean, dan smoothness_mean) efektif dalam mengklasifikasikan diagnosis tumor payudara menjadi jinak dan ganas.
Model menunjukkan performa prediksi yang sangat baik dengan akurasi 94,12%, sensitivitas 98,13%, spesifisitas 87,30%, dan AUC 0,9856, yang berarti dapat membantu tenaga medis dalam mendeteksi tumor ganas dengan akurat
Penggunaan metode regularisasi LASSO dapat meningkatkan seleksi fitur dan mencegah overfitting sehingga model lebih generalisasi.
Dengan demikian, model ini memiliki potensi untuk digunakan sebagai alat bantu diagnosis tumor payudara dalam praktik klinis, namun perlu dilakukan validasi lebih lanjut menggunakan data eksternal dan pengembangan model yang mengikutsertakan lebih banyak fitur untuk meningkatkan keakuratan.
Agresti, A. (2013). Categorical Data Analysis (3rd ed.). Wiley.
Agresti, A. (2007). An Introduction to Categorical Data Analysis (2nd ed.). Wiley.
Dobson, A. J., & Barnett, A. G. (2008). An Introduction to Generalized Linear Models (3rd ed.). Chapman and Hall/CRC.
Friendly, M. (2000). Visualizing Categorical Data. SAS Institute.
Lienert, G. A., & Raatz, U. (1998). Testaufbau und Testanalyse (6th ed.). Beltz.
McCullagh, P., & Nelder, J. A. (1989). Generalized Linear Models (2nd ed.). Chapman and Hall.
Cameron, A. C., & Trivedi, P. K. (2013). Regression Analysis of Count Data (2nd ed.). Cambridge University Press.
Fox, J. (2015). Applied Regression Analysis and Generalized Linear Models (3rd ed.). SAGE Publications.
Gelman, A., & Hill, J. (2006). Data Analysis Using Regression and Multilevel/Hierarchical Models. Cambridge University Press.
Wickham, H., & Grolemund, G. (2016). R for Data Science. O’Reilly Media.
Wolberg, W. H., & Mangasarian, O. L. (1990). Multisurface method of pattern separation for medical diagnosis applied to breast cytology. Proceedings of the National Academy of Sciences, 87(23), 9193-9196.
(Dataset Wisconsin Breast Cancer asli diambil dari penelitian ini.)
Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied Logistic Regression (3rd ed.). Wiley.
(Buku referensi utama untuk pemodelan regresi logistik.)
Friedman, J., Hastie, T., & Tibshirani, R. (2010). Regularization Paths for Generalized Linear Models via Coordinate Descent. Journal of Statistical Software, 33(1), 1-22.https://doi.org/10.18637/jss.v033.i01
Kuhn, M. (2008). Building Predictive Models in R Using the caret Package. Journal of Statistical Software, 28(5), 1-26.
https://doi.org/10.18637/jss.v028.i05
Robin, X., Turck, N., Hainard, A., Tiberti, N., Lisacek, F., Sanchez, J. C., & Müller, M. (2011). pROC: an open-source package for R and S+ to analyze and compare ROC curves. BMC Bioinformatics, 12, 77.
https://doi.org/10.1186/1471-2105-12-77
UCI Machine Learning Repository. (n.d.). Breast Cancer Wisconsin (Diagnostic) Data Set. Retrieved from https://www.kaggle.com/datasets/uciml/breast-cancer-wisconsin-data