Kata Pengantar

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 —

1 Pendahuluan

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.

1.1 Tujuan Analisis Data Kategori

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:

1.1.1 Menemukan Pola dan Tren

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.

1.1.2 Menilai Hubungan Antarvariabel

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.

1.1.3 Mendukung Pengambilan Keputusan

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.

1.1.4 Membangun Model Prediktif

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.

1.2 Definisi dan Ruang Lingkup Analisis Data Kategori

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.

1.2.1 Skala Nominal dan Ordinal

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.

1.2.2 Data Biner dan Multikategori

  • 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.

1.3 Perbedaan dengan Data Kuantitatif

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.

1.4 Manfaat Analisis Data Kategori di Berbagai Sektor

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:

1.4.1 Ilmu Sosial dan Psikologi

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.

1.4.2 Dunia Kesehatan dan Medis

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.

1.4.3 Bisnis dan Pemasaran

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.

1.4.4 Dunia Pendidikan

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.

1.4.5 Kebijakan dan Administrasi Publik

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.

1.4.6 Keamanan dan Kriminologi

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.

2 Metode dalam Analisis Data Kategori

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:

2.1 Tabel Kontingensi dan Uji Chi-Square

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.

2.2 Regresi Logistik

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.

2.3 Analisis Correspondence (CA)

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.

2.4 Decision Tree dan Random Forest

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.

3 Distribusi Probabilitas dalam Data Kategori

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:

3.1 Distribusi Bernoulli

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

3.2 Distribusi Binomial

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

3.3 Distribusi Multinomial

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

3.4 Distribusi Poisson

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

4 Desain Sampling dalam Analisis Data Kategori

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.


4.1 Prospective Sampling

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.

4.1.1 Eksperimen

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.

4.1.2 Studi Kohort

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.


4.2 Retrospective Sampling

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.

4.2.1 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.

4.2.2 Studi Kohort Retrospektif

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.

4.3 Tabel Perbandingan Desain Sampling

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.

5 Tabel Kontingensi 2×2

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:

5.1 Distribusi Peluang dalam Tabel Kontingensi 2 × 2

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.


5.1.1 Peluang Bersama

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} \]


5.1.2 Peluang Marginal

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}\)


5.1.3 Peluang Bersyarat

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

  • \(P(\text{Sering, Obesitas}) = \dfrac{300}{1000} = 0{,}30\)
  • \(P(\text{Sering, Tidak Obesitas}) = \dfrac{150}{1000} = 0{,}15\)
  • \(P(\text{Jarang, Obesitas}) = \dfrac{100}{1000} = 0{,}10\)
  • \(P(\text{Jarang, Tidak Obesitas}) = \dfrac{450}{1000} = 0{,}45\)

Langkah 2: Peluang Marginal

  • \(P(\text{Sering}) = \dfrac{450}{1000} = 0{,}45\)
  • \(P(\text{Jarang}) = \dfrac{550}{1000} = 0{,}55\)
  • \(P(\text{Obesitas}) = \dfrac{400}{1000} = 0{,}40\)
  • \(P(\text{Tidak Obesitas}) = \dfrac{600}{1000} = 0{,}60\)

Langkah 3: Peluang Bersyarat

  • \(P(\text{Obesitas | Sering}) = \dfrac{300}{450} = 0{,}6667\)
  • \(P(\text{Obesitas | Jarang}) = \dfrac{100}{550} = 0{,}1818\)

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.

5.2 Ukuran Asosiasi dalam Data Kategori 2 × 2

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

  • Menilai hubungan antara jenis kelamin dan pilihan karier, atau antara pendidikan dan partisipasi politik.

3. Psikologi

  • Mengkaji pengaruh perlakuan (terapi/pendekatan) terhadap hasil biner seperti “berhasil/gagal”, “sembuh/tidak”.

4. Pemasaran

  • Apakah jenis promosi tertentu meningkatkan kemungkinan konsumen membeli produk?

5. Pendidikan

  • Apakah metode pembelajaran tertentu meningkatkan kelulusan ujian dibandingkan metode lain?

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.

5.2.1 Risk Difference (RD)

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:

  • RD = 0.3 berarti bahwa kelompok yang sering mengonsumsi (misalnya, dalam konteks ini, kelompok yang terpapar) memiliki risiko 30% lebih tinggi untuk mengalami obesitas dibandingkan dengan kelompok yang jarang mengonsumsi (kelompok yang tidak terpapar).

5.2.2 Relative Risk (RR)

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:

  • RR = 2 menunjukkan bahwa kelompok yang sering mengonsumsi (kelompok terpapar) memiliki risiko kejadian obesitas sekitar 2 kali lebih tinggi dibandingkan dengan kelompok yang jarang mengonsumsi (kelompok tidak terpapar).

5.2.3 Odds Ratio (OR)

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:

  • OR = 3.5 menunjukkan bahwa peluang kejadian obesitas pada kelompok yang sering mengonsumsi adalah 3.5 kali lebih tinggi dibandingkan dengan kelompok yang jarang mengonsumsi.

5.2.4 Perbandingan RD, RR, OR

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:

  • \(a\): jumlah kejadian pada kelompok terpapar
  • \(b\): jumlah tidak kejadian pada kelompok terpapar
  • \(c\): jumlah kejadian pada kelompok tidak terpapar
  • \(d\): jumlah tidak kejadian pada kelompok tidak terpapar

6 Inferensi Tabel Kontingensi Dua Arah

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.

6.1 Estimasi

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:

6.1.1 Estimasi Titik

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.

6.1.2 Estimasi Interval

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.

6.2 Uji Hipotesis

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.

6.2.1 Uji Proporsi

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:

  1. Hitung Proporsi Sampel
  • \(\hat{p}_1= \frac{60}{100} = 0.6\)

  • \(\hat{p}_2= \frac{35}{100} = 0.35\)

  1. Hitung Proporsi Gabungan
  • \(\hat{p}= \frac{60+35}{100+100} = \frac{95}{200} = 0.475\)
  1. Hitung Statistik Uji Z
  • \(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.

6.2.2 Uji Asosiasi (RD, RR, OR)

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:

  1. Risk Difference (RD) – Menunjukkan perbedaan risiko absolut antara dua kelomp

  2. ok.

  3. Relative Risk (RR) – Menggambarkan perbandingan risiko kejadian antara dua kelompok.

  4. 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.

6.2.2.1 Risk Difference (RD):

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)} \]

6.2.2.2 Relative Risk (RR):

\[ 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))} \]

6.2.2.3 Odds Ratio (OR):

\[ 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:

  • Relative Risk:
$$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:

  • Odds Ratio:
$$
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.

6.2.3 Uji Independensi

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.

6.2.3.1 Uji Chi-Square

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.

6.2.3.2 Partisi Chi-Square

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:

  1. Menyusun tabel kontingensi berukuran \(I \times J\) dan menghitung nilai Chi-Square total.

  2. Memecah tabel utama menjadi sejumlah tabel \(2\times2\) sebanyak \((I - 1)(J - 1)\) kombinasi.

  3. Menghitung nilai statistik Chi-Square untuk masing-masing tabel \(2 \times 2\) yang terbentuk.

  4. 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:

  1. Lakukan Chi-Square Secara Keseluruhan
    1. Hitung Frekuensi Ekspektasi Frekuensi ekspektasi dihitung menggunakan rumus:

\[ 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 \]

    1. Hitung Statistik Uji Chi-Square Rumus statistik Chi-Square:

    \[ \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:

    • Kopi:
      \[ \chi^2 = \frac{(390 - 364.5)^2}{364.5} = \frac{650.25}{364.5} \approx 1.784 \]
    • Teh:
      \[ \chi^2 = \frac{(250 - 252)^2}{252} = \frac{4}{252} \approx 0.0159 \]
    • Minuman Dingin:
      \[ \chi^2 = \frac{(260 - 283.5)^2}{283.5} = \frac{552.25}{283.5} \approx 1.948 \]
  • \[ \chi^2 \approx 1.46 + 0.013 + 1.594 + 1.784 + 0.0159 + 1.948 = 6.815 \]

  1. Bandingkan dengan Distribusi Chi-Square Derajat bebas:

\[ (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.

  1. Lakukan Partisi Chi-Square

Partisi 1: Kopi vs. Teh

Jenis Kelamin Kopi Teh Total
Perempuan 420 310 730
Laki-laki 390 250 640
Total 810 560 1370
  • Perempuan, Kopi: \(E_{11} = \frac{730 \times 810}{1370} \approx 431.39\)
  • Perempuan, Teh: \(E_{12} = \frac{730 \times 560}{1370} \approx 298.61\)
  • Laki-laki, Kopi: \(E_{21} = \frac{640 \times 810}{1370} \approx 378.61\)
  • Laki-laki, Teh: \(E_{22} = \frac{640 \times 560}{1370} \approx 261.39\)

Hitung Chi-Square untuk Partisi Ini:

  • \(\frac{(420 - 431.39)^2}{431.39} \approx 0.300\)
  • \(\frac{(310 - 298.61)^2}{298.61} \approx 0.436\)
  • \(\frac{(390 - 378.61)^2}{378.61} \approx 0.342\)
  • \(\frac{(250 - 261.39)^2}{261.39} \approx 0.497\)

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:

  • \(\frac{(730 - 753.5)^2}{753.5} = \frac{552.25}{753.5} \approx 0.733\)
  • \(\frac{(370 - 346.5)^2}{346.5} = \frac{552.25}{346.5} \approx 1.594\)
  • \(\frac{(640 - 616.5)^2}{616.5} = \frac{552.25}{616.5} \approx 0.896\)
  • \(\frac{(260 - 283.5)^2}{283.5} = \frac{552.25}{283.5} \approx 1.948\)

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.

6.2.3.3 Uji Likelihood Ratio (G²)

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

  • \(\hat{\mu}_{11} = \dfrac{1338 \times 709}{1418} = 669\)
  • \(\hat{\mu}_{12} = \dfrac{1338 \times 709}{1418} = 669\)
  • \(\hat{\mu}_{21} = \dfrac{80 \times 709}{1418} = 40\)
  • \(\hat{\mu}_{22} = \dfrac{80 \times 709}{1418} = 40\)

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

  • Derajat bebas = \((r - 1)(c - 1) = (2 - 1)(2 - 1) = 1\)
  • Nilai kritis \(\chi^2_{0.05, 1} = 3.841\)

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 :

  • 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.

6.2.3.4 Uji Exact Fisher

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:

  1. Asumsikan hipotesis nol (tidak ada hubungan antara dua variabel).
  2. Hitung probabilitas tabel yang diamati menggunakan distribusi hipergeometrik:
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.

6.3 Analisis Residual dalam Tabel Kontingensi

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.

6.3.1 Jenis Residual

6.3.1.1 Pearson Residual

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:

  1. Hitung frekuensi yang diharapkan:

\[ e = \frac{(\text{Total Baris}) \times (\text{Total Kolom})}{\text{Total Keseluruhan}} \]

  • \(e_{11} = \frac{30 \times 50}{80} = 18.75\)
  • \(e_{12} = \frac{30 \times 30}{80} = 11.25\)
  • \(e_{21} = \frac{50 \times 50}{80} = 31.25\)
  • \(e_{22} = \frac{50 \times 30}{80} = 18.75\)
  1. Hitung Pearson Residual:

\[ e_{ij} = \frac{o_{ij} - e_{ij}}{\sqrt{e_{ij}}} \]

dengan

  • \(e_{11} = \frac{20 - 18.75}{\sqrt{18.75}} = 0.29\)
  • \(e_{12} = \frac{10 - 11.25}{\sqrt{11.25}} = -0.37\)
  • \(e_{21} = \frac{30 - 31.25}{\sqrt{31.25}} = -0.22\)
  • \(e_{22} = \frac{20 - 18.75}{\sqrt{18.75}} = 0.29\)
# 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

6.3.2 Deteksi Outlier dalam Analisis Data Kategori Menggunakan Residual

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.

6.3.2.1 Menggunakan Residual untuk Mendeteksi Outlier

  • 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.

6.3.2.2 Contoh Deteksi Outlier dalam Tabel Kontingensi Misalkan kita memiliki tabel kontingensi berikut:

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
  • Sel (A, Gagal) memiliki residual negatif terbesar (-2.20, -2.60) → Ini menunjukkan bahwa Grup A mengalami lebih sedikit kegagalan dari yang diprediksi oleh model independensi.
  • Jika \(|r|\) melebihi 3, maka sel ini dapat dianggap sebagai outlier yang signifikan.
  • Sel (A, Sukses) dan (B, Gagal) memiliki residual positif cukup besar → Menunjukkan bahwa ada ketidakseimbangan dalam hubungan antara kategori.

6.3.2.3 Implementasi dalam R untuk Deteksi Outlier

# 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:

    • Bukan Perokok dengan Kanker Paru (+): −9.449
    • Perokok dengan Kanker Paru (+): +6.934
      Ini menunjukkan bahwa perokok jauh lebih banyak menderita kanker dari yang diharapkan, sedangkan bukan perokok jauh lebih sedikit dari yang diperkirakan.

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.

7 Tabel Kontingensi Tiga Arah

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.

7.1 Tabel Parsial dan Marginal

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.

7.1.1 Struktur Tabel Kontingensi Tiga Arah

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} \]

7.1.2 Tabel Parsial dan Marginal

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

7.1.2.1 Tabel Frekuensi Parsial

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.

7.1.2.2 Tabel Frekuensi Marginal

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.

7.2 Distribusi Peluang

7.2.1 Peluang Bersama (Joint Probability)

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

7.2.1.1 Tabel Probabilitas Bersama

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

7.2.2 Peluang Marginal (Marginal Probability)

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

7.2.2.1 Tabel Peluang Marginal

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.

7.3 Tabel Peluang Bersyarat

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

7.4 Ukuran Asosiasi

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:

  • Perokok terkena kanker = 10
  • Perokok tidak terkena kanker = 40
  • Non-perokok terkena kanker = 5
  • Non-perokok tidak terkena kanker = 45

\[ 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)

7.4.1 Tabel Kontingensi Parsial

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
  1. Relative Risk (RR)

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
  1. Odds Ratio (OR)

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.

7.5 Conditional Independence

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

  • \(P(\text{Sehat} \mid \text{Rutin}, \text{Muda}) = \frac{30}{30 + 10} = 0.75\)
  • \(P(\text{Sehat} \mid \text{Tidak Rutin}, \text{Muda}) = \frac{20}{20 + 40} = 0.333\)
  • \(P(\text{Sehat} \mid \text{Muda}) = \frac{30 + 20}{100} = 0.5\)

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

7.6 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.

7.7 Inferensi Tabel Kontingensi Tiga Arah

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.

7.7.1 Independensi Bersyarat dalam Tabel Kontingensi Tiga Arah

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.

7.7.2 Pengujian Statistik untuk Independensi Bersyarat

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

  • Hipotesis nol (H0): \(\theta_{xy(k)} = 1\) untuk setiap \(k = 1, 2, \ldots, K\)
  • Hipotesis alternatif (H1): \(\theta_{xy(k)} \neq 1\) untuk paling sedikit satu \(k\)

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

  1. Menghitung nilai harapan \(e_{11k}\)
    Rumus nilai harapan \(e_{11k}\) untuk setiap strata \(k\):
    \[ e_{11k} = \frac{(n_{1+k} \times n_{+1k})}{n_{++k}} \]
    Dimana:
  • \(n_{1+k}\) = Total perokok dalam strata \(k\)
  • \(n_{+1k}\) = Total penderita kanker dalam strata \(k\)
  • \(n_{++k}\) = Total individu dalam strata \(k\)

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 \]


  1. Menghitung varians Var(\(e_{11k}\))
    Rumus varians:
    \[ Var(e_{11k}) = \frac{n_{1+k} n_{0+k} n_{+1k} n_{+0k}}{n_{++k}^2 (n_{++k} - 1)} \]

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 \]


  1. Menghitung Statistik CMH
    Rumus statistik CMH:
    \[ \chi^2_{CMH} = \frac{\left( \sum_k (n_{11k} - e_{11k}) \right)^2}{\sum_k Var(e_{11k})} \]

\[ \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

  • Jika nilai p < 0,05, maka tolak H₀: terdapat hubungan antara \(X\) dan \(Y\) yang tidak independen bersyarat terhadap \(Z\).
  • Jika nilai p > 0,05, maka gagal tolak H₀: \(X\) dan \(Y\) adalah independen bersyarat terhadap \(Z\).

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

  1. Menghitung odds ratio per provinsi antara kebiasaan merokok dan kanker paru-paru.
  2. Menggunakan Uji Cochran-Mantel-Haenszel (CMH) untuk menguji apakah hubungan tersebut konsisten di seluruh provinsi.
  3. Menginterpretasikan hasil untuk melihat apakah kebiasaan merokok berkaitan secara signifikan dengan kejadian kanker paru-paru, setelah mengontrol provinsi.

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")
Table 7.1: 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:

  • \(a = 126\): Perokok dengan kanker
  • \(b = 100\): Perokok tanpa kanker
  • \(c = 35\): Nonperokok dengan kanker
  • \(d = 61\): Nonperokok tanpa kanker
  • \(n = 322\): Total populasi

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

  • Odds Ratio di Kota Beijing: 2.196
  • Nilai harapan \(E_{11}\): 113.37
  • Varians \(\text{Var}(E_{11})\): 8.12

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")
Table 7.2: 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.

7.7.3 Odds Ratio Bersama

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})] \]

  1. Penaksir Odds Ratio Bersama

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:

  • \(\sum (a_i \cdot d_i)/n_i = (126)(61) + \ldots + (104)(36)/250\)
  • \(\sum (b_i \cdot c_i)/n_i = (35)(100) + \ldots + (21)(89)/250\)

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

7.7.4 Uji Homogenitas Odds Ratio dengan Statistik Breslow-Day

Homogenitas Asosiasi dalam Tabel Kontingensi Tiga Arah

Definisi Asosiasi Homogen

  • Asosiasi homogen terjadi apabila odds ratio di setiap tabel parsial (strata) memiliki nilai yang sama: \[ \theta_{xy(1)} = \theta_{xy(2)} = \cdots = \theta_{xy(k)} \]
  • Ketika odds ratio tetap konstan di seluruh level variabel kontrol \(Z\), maka dapat disimpulkan bahwa tidak terdapat interaksi antara variabel \(X\) dan \(Y\) dalam memengaruhi \(Z\).
  • Sebaliknya, jika nilai odds ratio berbeda pada masing-masing strata \(Z\), maka hal tersebut mengindikasikan adanya interaksi antara \(X\) dan \(Y\) dalam kaitannya dengan \(Z\).

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:

  • \(a_j\): jumlah kasus yang terpapar dan diamati pada strata ke-\(j\)
  • \(\tilde{a}_j\): jumlah kasus terpapar yang diharapkan berdasarkan hipotesis nol (asumsi odds ratio homogen)
  • \(\hat{\text{Var}}(a_j \mid \hat{OR}_{MH})\): taksiran varians dari \(\tilde{a}_j\)

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:

  • Tolak \(H_0\): artinya terdapat perbedaan signifikan antar odds ratio di masing-masing strata — tidak homogen.

Sebaliknya, jika nilai \(X^2_{\text{HBD}}\) lebih kecil atau sama dengan nilai kritis, maka:

  • Gagal menolak \(H_0\): artinya tidak ada cukup bukti untuk menyatakan bahwa odds ratio berbeda — dianggap homogen.

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

  • Statistik Breslow-Day (\(\chi^2_{HBD}\)) menguji apakah rasio odds homogen di seluruh strata.
  • Nilai harapan \(\tilde{a}_k\) diperoleh dari solusi persamaan kuadrat.
  • Koreksi Tarone (\(\chi^2_{HBDT}\)) digunakan untuk mengurangi bias dalam estimasi varian gabungan.
  • P-value dihitung dari distribusi \(\chi^2\) dengan \(k-1\) derajat kebebasan.
  • Jika p-value < 0.05, maka terdapat perbedaan signifikan rasio odds antar strata.

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 \]

  • Untuk kelompok \(< 50\) tahun (\(j = 1\)):

\[ \tilde{a}_1 \approx 27.2 \]

  • Untuk kelompok \(\geq 50\) tahun (\(j = 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} \]

  • Untuk \(< 50\) tahun:

\[ \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 \]

  • Untuk \(\geq 50\) tahun:

\[ \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

  • Jika p-value < 0.05, maka tolak \(H_0\), artinya odds ratio tidak homogen di seluruh strata \(j\), ada interaksi antara \(X\) dan \(Y\).
  • Jika p-value > 0.05, maka gagal menolak \(H_0\), yang berarti odds ratio seragam di seluruh strata \(j\).

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.

8 Generalized Linear Model (GLM)

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:

  1. Distribusi dari famili eksponensial sebagai distribusi variabel respons.

  2. Fungsi link, yang menghubungkan nilai harapan dari variabel respons dengan kombinasi linear dari prediktor.

  3. Fungsi linear prediktor, dirumuskan sebagai \[ \eta = X\beta \]

8.1 Exponential Family

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.

8.2 Model Regresi Logistik

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.

  1. 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.

  2. 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).

  3. 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:

  • Jika nilai prediksi \(f(x)\) lebih besar dari ambang batas (threshold), misalnya 0.5, maka hasil klasifikasi adalah 1 (kelas positif).
  • Jika nilai prediksi \(f(x)\) kurang dari 0.5, maka hasil klasifikasi adalah 0 (kelas negatif).

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 \]

  • Fungsi inverse link (fungsi logit terbalik):

\[ \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.

8.3 Model Regresi Poisson

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:

  • \(\theta = \log(\lambda)\)
  • \(b(\theta) = e^{\theta} = \lambda\)
  • \(a(\phi) = 1\)
  • \(c(y, \phi) = -\log(y!)\)

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.

9 Inferensi GLM

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

  1. 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.

  2. 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:

    • Uji Wald: digunakan untuk menguji apakah parameter tertentu signifikan secara statistik.
    • Confidence Interval (CI): digunakan untuk membentuk rentang nilai yang kemungkinan besar mengandung parameter sebenarnya, dengan tingkat kepercayaan tertentu (misalnya 95%).
    • P-value: digunakan untuk menentukan signifikansi statistik dari suatu parameter atau model.

    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:

    • \(\phi\) = parameter dispersi, yang nilainya tergantung pada jenis distribusi (misalnya, untuk distribusi Poisson, \(\phi = 1\)).
    • \(V(\mu_i)\) = fungsi varians, yaitu bentuk spesifik fungsi varians yang sesuai dengan distribusi dari ekspektasi \(\mu_i = \mathbb{E}[Y_i]\).

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

9.1 Mencari Ekspektasi dan Varians dalam GLM

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) \]

9.2 Metode Penaksiran Parameter

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:

  1. 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 \]

  2. 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

  1. 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.

  2. 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)}) \]

9.3 Diagnostik Model GLM

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.

9.3.1 Residual

  • Deviance Residual: \[ r_i^D = \text{sign}(y_i - \hat{\mu}_i) \sqrt{2[y_i \log(y_i/\hat{\mu}_i) - (y_i - \hat{\mu}_i)]} \]
  • Pearson Residual: \[ r_i^P = \frac{y_i - \hat{\mu}_i}{\sqrt{V(\hat{\mu}_i)}} \]

9.4 Detail Metode Estimasi dan Inferensi Regresi Logistik

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

  1. Turunan Pertama (Score Function)
    \[ U(\beta) = \frac{\partial \ell(\beta)}{\partial \beta} = X^\top (y - \pi) \]

  2. Turunan Kedua (Hessian Matrix)
    \[ H(\beta) = -X^\top W X, \quad \text{dengan} \quad W = \text{diag}(\pi_i (1 - \pi_i)) \]

  3. 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.

9.4.1 Menghitung G² secara Manual dalam Regresi Logistik

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

9.4.1.1 Perhitungan Manual

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.

9.5 Detail Metode Estimasi dan Inferensi Regresi Poisson

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.

9.6 Contoh Kasus

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:

  • H0: Tidak ada hubungan antara jenis kelamin dan status perokok.
  • H1: Ada hubungan antara jenis kelamin dan status perokok.
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:

  • Terdapat hubungan yang signifikan antara jenis kelamin dan status perokok.
  • Perokok memiliki kemungkinan besar berada pada kategori biaya asuransi tinggi.
  • Hasil uji CMH mengonfirmasi bahwa hubungan antara merokok dan dampak kesehatan tetap signifikan bahkan setelah mengontrol usia.
  • Analisis ini menunjukkan pentingnya pengendalian faktor perancu dalam analisis data kategori.

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

  • Jenis kelamin dan status merokok terbukti memiliki hubungan yang signifikan (p = 0.006548). Ini menunjukkan bahwa distribusi perokok tidak merata antara laki-laki dan perempuan.
  • Status merokok dan biaya asuransi juga memiliki hubungan yang sangat kuat (p < 2.2e-16). Seluruh perokok berada pada kategori biaya tinggi, mengindikasikan bahwa merokok sangat mempengaruhi beban biaya kesehatan.
  • Uji Cochran-Mantel-Haenszel (CMH) dengan p-value < 2.2e-16 dan odds ratio gabungan sebesar 11.83 menunjukkan bahwa hubungan antara merokok dan kejadian kanker tetap signifikan bahkan setelah dikendalikan oleh faktor usia.

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.

10 Regresi Logistik dengan Prediktor Nominal, Ordinal, dan Rasio

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:

10.1 Simulasi Data

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.

10.2 Eksplorasi Data

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.

10.3 Perlakuan Variabel Ordinal

10.3.1 Treat sebagai Nominal (Dummy)

# 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.

10.3.2 Treat sebagai Rasio (Numeric Rank)

# 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.

11 Pemilihan Model Regresi Logistik dan Evaluasi

11.1 Membangun Model Regresi Logistik: Pendekatan Confrmatory dan Exploratory

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.

  1. Konfirmatori (Confirmatory Approach)
    Pendekatan ini digunakan ketika peneliti telah memiliki teori atau hipotesis yang jelas mengenai pengaruh atau hubungan antara variabel prediktor dengan variabel respon.
    Karakteristik:
  • 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.

  1. Eksploratori (Exploratory Approach)
    Pendekatan ini diterapkan ketika belum ada teori yang pasti atau ketika peneliti ingin menyelidiki hubungan potensial antar variabel.
    Karakteristik:
  • 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

11.2 Metode Stepwise: Forward, Backward, dan Kedua Arah

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

11.3 Evaluasi Model: ROC dan AUC

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

11.4 Pseudo R-Squared

PseudoR2(step_both, which = c("CoxSnell", "Nagelkerke", "McFadden"))
##   CoxSnell Nagelkerke   McFadden 
##  0.2385981  0.3294000  0.2115439

11.5 Tabel Klasifkasi dan Evaluasi

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.

11.6 Metode Perbandingan Model dalam Regresi Logistik

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

11.7 Likelihood-Ratio Test

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

11.8 Prinsip Parsimony

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.

11.9 Evaluasi Tabel Klasifkasi dan Akurasi Model

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               
## 

11.9.1 Sensitivitas dan Spesifsitas

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.

11.10 Detail ROCPenjelasan Kurva ROC (Receiver Operating Characteristic)

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):

    • Sensitivitas meningkat
    • Spesifisitas menurun
  • Ketika cut-off dinaikkan (model lebih konservatif dalam klasifikasi positif):

    • Sensitivitas menurun
    • Spesifisitas meningkat

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.

    • Misalnya, dalam kasus medis, mungkin lebih penting untuk meminimalkan false negative daripada false positive agar tidak melewatkan kasus penyakit.

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.

11.11 Precision-Recall Curve (PR Curve)

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:

    • Kelas positif jauh lebih sedikit dibandingkan kelas negatif (data sangat tidak seimbang).
    • Fokus utama aplikasi adalah memastikan presisi tinggi pada kelas minoritas agar meminimalkan kesalahan positif palsu (false positives) yang dapat berakibat serius.

Dengan menggunakan PR Curve, evaluasi performa model menjadi lebih sensitif terhadap ketidakseimbangan data dan kebutuhan aplikasi yang mengutamakan deteksi akurat dari kasus minoritas.

11.12 Pseudo R-squared pada Regresi Logistik

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.

12 Apa itu Distribusi Multinomial

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:

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.

12.1 Studi Kasus

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:

  • \(n = 10\)   (jumlah total orang)
  • \(x_1 = 4\), \(x_2 = 3\), \(x_3 = 3\)   (jumlah pemilih untuk tiap buah: Apel, Jeruk, Pisang)
  • \(p_1 = 0.3\), \(p_2 = 0.4\), \(p_3 = 0.3\)   (peluang teoretik untuk masing-masing buah)

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

12.2 Multinomial Logistic Regression

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 \]

12.2.1 Baseline-category logit model

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 ke-\(k\),
$\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.

12.2.2 Estimasi Parameter

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.

12.3 Contoh Kasus

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.

12.4 Simulasi Data

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

12.5 Estimasi Model

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

12.6 Nilai P-Value dan Interpretasi

z <- summary(model_mnlogit)$coefficients / summary(model_mnlogit)$standard.errors
pval <- 2 * (1 - pnorm(abs(z)))
round(pval, 4)
##         (Intercept)    Age DepartmentIT DepartmentMarketing Experience
## Desktop      0.8643 0.8876        0.052              0.6497     0.6441
## Tablet       0.8231 0.3252        0.945              0.0127     0.5261

12.7 Prediksi dan Validasi

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

12.8 Kesimpulan

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.

12.8.1 Contoh Kasus 2 di R

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.

13 Regresi logistik ordinal

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.

13.1 Konsep Cumulative Logit Model

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.

13.2 Interpretasi Koefsien

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

  • Jika \(\beta > 0\): semakin besar nilai \(X\), maka peluang untuk berada di kategori rendah meningkat.
  • Jika \(\beta < 0\): semakin besar nilai \(X\), maka peluang untuk berada di kategori tinggi meningkat.

Odds Ratio (OR)

Koefisien dapat dikonversi ke bentuk odds ratio untuk interpretasi yang lebih intuitif:

\(\text{OR} = e^{\beta}\)

  • Jika OR > 1: menunjukkan peningkatan odds untuk kategori rendah saat \(X\) meningkat.
  • Jika OR < 1: menunjukkan peningkatan odds untuk kategori tinggi saat \(X\) meningkat.

Contoh:

  • Jika \(\beta = 0.7\), maka \(\text{OR} = e^{0.7} \approx 2.01\), artinya peningkatan 1 unit pada \(X\) menggandakan peluang berada di kategori yang lebih rendah.

13.3 Contoh Data: Kepuasan Pelanggan

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

13.4 Estimasi Model Ordinal

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

13.5 Nilai P-Value

(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

13.6 Prediksi Probabilitas

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

13.7 Goodness-of-Fit dan Proportional Odds

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

  • Asumsi ini dapat diuji dengan Brant test.
  • Jika hasil uji menunjukkan pelanggaran signifikan, maka perlu dipertimbangkan model alternatif.
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.

13.8 Alternatif Model Ordinal

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.

13.9 Kesimpulan

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.

13.10 Asumsi Paralelisme dalam Regresi Logistik Ordinal

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:

    • Generalized Ordinal Logistic Regression, yang mengizinkan koefisien berbeda untuk tiap batas
    • Partial Proportional Odds Model, yang hanya melonggarkan asumsi paralelisme untuk prediktor tertentu

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:

  • Likelihood Ratio Test (LRT)

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.

  • Brant Test

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.

14 Log Linear Model

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:

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:

  1. Tabel Kontingensi: Menyajikan frekuensi gabungan dari dua atau lebih variabel kategorik untuk eksplorasi awal.

  2. Model Log-linier: Memodelkan struktur asosiasi dalam tabel kontingensi tanpa menetapkan variabel dependen.

  3. 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:

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

14.1 Tabel Kontingensi dan Model Loglinier

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:

  • \(\mu_{ij}\) adalah ekspektasi frekuensi pada sel ke-\(i,j\)
  • \(\lambda\) adalah parameter intercept (konstanta)
  • \(\lambda_i^{(A)}\) adalah efek utama dari variabel \(A\) pada kategori ke-\(i\)
  • \(\lambda_j^{(B)}\) adalah efek utama dari variabel \(B\) pada kategori ke-\(j\)
  • \(\lambda_{ij}^{(AB)}\) adalah efek interaksi antara variabel \(A\) dan \(B\)

14.2 Model Saturated

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

14.3 Model Independent

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

14.4 Odds Ratio dan Interpretasi

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:

  • \(n_{11}\) ​, \(n_{12}\), \(n_{21}\), \(n_{22}\) adalah frekuensi pada masing-masing sel tabel 2x2.

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).

14.5 Estimasi Parameter

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

14.6 Model Lebih Sederhana dan Perbandingan Model

  • 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:

    • H0: Model sederhana cukup memadai (tidak ada perbedaan berarti)
    • H1: Model penuh lebih baik
  • 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

14.7 Studi Kasus: Kepercayaan terhadap Surga

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

15 MODEL LOG LINEAR 2 ARAH

15.1 Jelaskan secara singkat apa yang dimaksud dengan model log-linear pada tabel kontingensi.

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.

15.2 Sebutkan perbedaan utama antara model log-linear dan model regresi logistik!

  • 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.

15.3 Analisis Data Tabel Kontingensi 2x2

Merokok Sakit Sehat
Ya 30 20
Tidak 10 40

Ini menunjukkan frekuensi jumlah orang yang merokok atau tidak, dan apakah mereka sakit atau sehat.

15.4 Bentuk Model Log-Linear

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$

15.5 Estimasi Parameter Model (Manual, Sum-to-zero)

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)

  1. 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 \]

  2. 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} \]

  3. 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} \]

  4. 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\)

    • \(\alpha_1 = 0.2027\), \(\alpha_2 = -0.2027\)
    • \(\beta_1 = -0.4904\), \(\beta_2 = 0.4904\)
    • \(\gamma_{11} = 0.4479\), \(\gamma_{12} = -0.4479\), \(\gamma_{21} = -0.4479\), \(\gamma_{22} = 0.4479\)

15.6 Hitung Odds Ratio dan Interval Kepercayaan

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).

15.7 Fitting Model Log-Linear dengan R

# 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

15.8 Intepretasi Parameter

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.

15.9 Analisis Data Tabel Kontingensi 2x3

Data Tabel Kontingensi

Jenis Kelamin Kurus Normal Gemuk
Laki-laki 12 20 8
Perempuan 18 24 10

15.10 Bentuk Model Log-Linear untuk Tabel 2x3

Model log-linear untuk tabel kontingensi 2x3 dapat dituliskan sebagai berikut:

\[ \log(m_{ij}) = \mu + \alpha_i + \beta_j + \gamma_{ij} \]

dengan:

  • \(m_{ij}\) = ekspektasi frekuensi pada baris ke-\(i\) dan kolom ke-\(j\)
  • \(i = 1, 2\) (Kategori Jenis Kelamin, dimana 1 = Laki-laki, 2 = Perempuan)
  • \(j = 1, 2, 3\) (Kategori BMI, dimana 1 = Kurus, 2 = Normal, 3 = Gemuk)
  • \(\mu\) = parameter intercept (overall mean efek pada log-frekuensi)
  • \(\alpha_i\) = efek utama baris ke-\(i\) (efek Jenis Kelamin)
  • \(\beta_j\) = efek utama kolom ke-\(j\) (efek Kategori BMI)
  • \(\gamma_{ij}\) = efek interaksi antara baris ke-\(i\) dan kolom ke-\(j\)

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:

  • Jumlah efek utama Jenis Kelamin adalah nol: \(\alpha_1 + \alpha_2 = 0\)
  • Jumlah efek utama BMI adalah nol: \(\beta_1 + \beta_2 + \beta_3 = 0\)
  • Jumlah efek interaksi sepanjang baris dan kolom juga nol untuk menjaga identifikasi model.

Penjelasan

  • Intercept \(\mu\) mencerminkan rata-rata log frekuensi keseluruhan pada semua sel tabel.
  • Efek utama \(\alpha_i\) menggambarkan perbedaan rata-rata log frekuensi antar kategori Jenis Kelamin (Laki-laki vs Perempuan).
  • Efek utama \(\beta_j\) menggambarkan perbedaan rata-rata log frekuensi antar kategori BMI (Kurus, Normal, Gemuk).
  • Interaksi \(\gamma_{ij}\) menangkap adanya asosiasi khusus antara kategori Jenis Kelamin dan kategori BMI, yang tidak bisa dijelaskan oleh efek utama saja.

15.11 Fitting Model Log-Linear di R

# 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

15.12 Intepretasi

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.

16 Model Log Linear Tiga Arah

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.

16.1 Model Log-Linear untuk Tabel Tiga Arah

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.

16.2 Pengujian Interaksi dalam Model Log-Linear Tiga Arah

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.

16.3 Analisis Log-Linear untuk Tabel Tiga Arah

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):

17 UJI MODEL INTERAKSI TIGA ARAH (SATURATED VS HOMOGENOUS)

17.0.1 Penentuan Kategori Referensi

##=============================##
# 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:

  • \(\lambda\) : konstanta (intersep),
  • \(\lambda^X_i, \lambda^Y_j, \lambda^Z_k\) : efek utama dari masing-masing variabel X, Y, dan Z,
  • \(\lambda^{XY}_{ij}, \lambda^{XZ}_{ik}, \lambda^{YZ}_{jk}\) : interaksi dua arah antar variabel,
  • \(\lambda^{XYZ}_{ijk}\) : interaksi tiga arah yang melibatkan X, Y, dan Z secara bersamaan.

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

17.0.2 Ringkasan Model

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.

17.0.3 Hasil Estimasi Koefsien

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

17.0.4 Interpretasi Koefsien

Hasil estimasi koefisien menunjukkan makna sebagai berikut:

  • (Intercept):
    • Nilai intercept sebesar 4.25 merepresentasikan rata-rata log dari jumlah kasus pada kategori referensi:
      • Perempuan,
      • Menolak hukuman mati,
      • Liberal.
    • Jika diubah ke skala hitungan: exp(4.25) ≈ 70, artinya rata-rata jumlah kasus pada kategori referensi sekitar 70.
  • x.sex1M:
    • Laki-laki memiliki expected count sekitar exp(-0.36) ≈ 0.70 kali lebih kecil dibanding perempuan, untuk kombinasi kategori referensi lainnya.
    • Hanya mendekati signifikan (p = 0.055), sehingga efek ini belum cukup kuat secara statistik.
  • y.fav1fav:
    • Mereka yang mendukung hukuman mati memiliki expected count sekitar exp(0.46) ≈ 1.59 kali lipat dibandingkan dengan yang menolak hukuman mati.
    • Efek ini signifikan (p = 0.0025), menunjukkan asosiasi kuat antara sikap terhadap hukuman mati dan jumlah kasus.
  • z.fund1fund:
    • Kelompok Fundamentalis tidak memiliki perbedaan signifikan dibanding Liberal (kategori referensi), dengan nilai odds ratio exp(0.04) ≈ 1.04.
    • Tidak signifikan (p = 0.80).
  • z.fund2mod:
    • Kelompok Moderate memiliki expected count exp(0.41) ≈ 1.50 kali lebih tinggi dibanding Liberal.
    • Efek ini signifikan (p = 0.0086), menunjukkan bahwa kelompok Moderate memiliki representasi lebih besar.
  • Interaksi Dua dan Tiga Arah:
    • Sebagian besar interaksi dua arah dan tiga arah tidak signifikan (p > 0.05).
    • Artinya, tidak ada bukti kuat adanya efek gabungan antar variabel seperti:
      • interaksi antara jenis kelamin dan sikap,
      • atau interaksi kompleks antara jenis kelamin, sikap, dan pandangan ideologi.

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.

17.0.5 Goodness-of-Fit

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.

17.0.6 Kesimpulan

Kesimpulan

  • Model saturated ini memberikan kecocokan sempurna terhadap data, karena menyertakan seluruh efek utama dan interaksi dua serta tiga arah.
  • Namun, tidak semua parameter (khususnya interaksi) bersifat signifikan secara statistik.

Efek Utama yang Paling Signifikan

  • Sikap mendukung hukuman mati:
    • Expected count 1.6 kali lebih tinggi dibandingkan yang menolak hukuman mati.
  • Kelompok Moderate:
    • Expected count 1.5 kali lebih tinggi dibandingkan kelompok Liberal.

Interaksi

  • Tidak ditemukan bukti kuat adanya interaksi dua arah maupun tiga arah yang signifikan (p > 0.05).
  • Hal ini menunjukkan bahwa struktur interaksi kompleks mungkin tidak diperlukan, dan model yang lebih parsimonious (lebih sederhana) tanpa interaksi tiga arah dapat dipertimbangkan sebagai model final.

Catatan Interpretasi

  • Nilai exp(coef) menyatakan rasio ekspektasi (expected count ratio) dibandingkan kategori baseline/referensi.
  • Efek positif pada koefisien → menaikkan expected count.
  • Efek negatif pada koefisien → menurunkan expected count.
  • Parameter dianggap signifikan bila p-value < 0.05.

17.1 Model Homogenous

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:

  • \(\lambda\) : konstanta (intersep),
  • \(\lambda^X_i, \lambda^Y_j, \lambda^Z_k\) : efek utama dari masing-masing variabel X, Y, dan Z,
  • \(\lambda^{XY}_{ij}, \lambda^{XZ}_{ik}, \lambda^{YZ}_{jk}\) : interaksi dua arah antar variabel.

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

17.2 Uji Hipotesis: Apakah Ada Interaksi Tiga Arah? (Saturated vs Homogenous)

Untuk mengetahui apakah terdapat interaksi tiga arah dalam model log-linear tiga arah, kita melakukan uji hipotesis sebagai berikut:

Hipotesis

  • H₀: Tidak terdapat interaksi tiga arah (model homogenous sudah cukup).
  • H₁: Terdapat interaksi tiga arah (model saturated lebih baik).

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

  • Jika nilai \(p\)-value < α (biasanya 0.05), maka tolak H₀: ada interaksi tiga arah.
  • Jika \(p\)-value ≥ α, maka gagal tolak H₀: tidak ada interaksi tiga arah, model homogenous sudah cukup.

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)

17.2.1 Langkah-Langkah Pengujian

Langkah-Langkah Pengujian Interaksi Tiga Arah

1. Hipotesis

  • H₀ (Hipotesis nol): Tidak ada interaksi tiga arah antar variabel (model homogenous sudah cukup untuk menjelaskan hubungan).
  • H₁ (Hipotesis alternatif): Ada interaksi tiga arah antar variabel (model saturated diperlukan untuk menjelaskan hubungan secara lengkap).

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:

  • Model pengurang adalah model yang lebih lengkap (lebih banyak parameter, derajat bebas lebih kecil), yaitu model saturated.
  • Derajat bebas (df) dihitung dari selisih df model homogenous dan saturated.
  • Keputusan diambil berdasarkan perbandingan Δ deviance dengan nilai χ² tabel pada df yang sesuai.

Rangkuman: Pengujian Interaksi Tiga Arah (Saturated vs Homogenous Model)

Hipotesis

  • H₀: Tidak ada interaksi tiga arah (model homogenous cukup)
  • H₁: Ada interaksi tiga arah (model saturated diperlukan)

Tingkat Signifikansi

  • α = 0.05

Statistik Uji

  • ΔDeviance = Deviance(model homogenous) − Deviance(model saturated)
  • ΔDeviance = 1.798 − 0.00 = 1.798
  • df = df(homogenous) − df(saturated) = 2 − 0 = 2

Daerah Penolakan

  • Tolak H₀ jika ΔDeviance > χ²0.05,2 = 5.991

Keputusan

  • Karena 1.798 < 5.991, maka tidak tolak H0

Interpretasi

  • Pada taraf nyata 5%, tidak terdapat cukup bukti untuk menyatakan adanya interaksi tiga arah antara jenis kelamin, fundamentalisme, dan pendapat mengenai hukuman mati.

Catatan Tambahan

  • Semakin banyak parameter, semakin kecil derajat bebas model.
  • df = jumlah sel tabel kontingensi − jumlah parameter model
  • Misal: tabel 2×2×3 memiliki 12 sel → df = 12 − jumlah parameter
  • Cek kembali jumlah parameter pada output summary() di R untuk menghitung df dengan tepat.

18 UJI MODEL INTERAKSI DUA ARAH (HOMOGENOUS VS CONDITIONAL ON X)

18.1 Model Conditional on X

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:

  • Interaksi antara Y dan Z
  • Interaksi tiga arah antara X, Y, dan Z

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:

  • Tidak termasuk: \(\lambda^{YZ}_{jk}\) → artinya, Y dan Z dianggap independen bersyarat pada X
  • Tidak termasuk: \(\lambda^{XYZ}_{ijk}\) → artinya, tidak ada interaksi tiga arah

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

18.2 Pengujian Ada Tidaknya Interaksi Antara Y dan Z (Homogenous Model vs Conditional Association on X)

Pengujian Interaksi Antara Y dan Z (Model Homogenous vs Conditional Association on X)

1. Hipotesis

  • H₀: Tidak ada interaksi antara pendapat hukuman mati (Y) dan fundamentalisme (Z), atau \(\lambda^{YZ}_{jk} = 0\)
  • H₁: Ada interaksi antara pendapat hukuman mati (Y) dan fundamentalisme (Z), atau \(\lambda^{YZ}_{jk} \neq 0\)

2. Tingkat Signifikansi

  • \(\alpha = 5\%\)

3. Statistik Uji

  • \(\Delta \text{Deviance} = \text{Deviance}_{\text{Conditional on X}} - \text{Deviance}_{\text{Homogenous}}\)
  • \(\Delta \text{Deviance} = 3.903 - 1.798 = 2.132\)
  • Derajat bebas: \[ df = df_{\text{Conditional on X}} - df_{\text{Homogenous}} = 4 - 2 = 2 \]

4. Daerah Penolakan

  • Tolak H₀ jika \(\Delta \text{Deviance} > \chi^2_{0.05, 2} = 5.991\)

5. Keputusan

  • Karena \(2.132 < 5.991\), maka tidak tolak H₀

6. Interpretasi

  • Pada taraf nyata 5%, belum cukup bukti untuk menyimpulkan adanya interaksi antara pendapat mengenai hukuman mati dan fundamentalisme.
  • Dengan demikian, pendapat hukuman mati dan fundamentalisme bersifat independen bersyarat terhadap jenis kelamin (X).

18.3 Pengujian Selisih Deviance (Conditional on X vs Homogenous)

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:

  • Model log-linear conditional on X (jenis kelamin) sudah cukup baik menggambarkan hubungan antar variabel.
  • Tidak perlu menambahkan interaksi langsung antara Y dan Z (pendapat hukuman mati dan fundamentalisme).
  • Interaksi **Y*Z** tidak signifikan secara statistik, sehingga dapat disederhanakan dari model.

Catatan: Penyederhanaan model penting untuk menjaga parsimonious model (model yang efisien namun tetap akurat).

19 UJI MODEL INTERAKSI DUA ARAH (HOMOGENOUS VS CONDITIONAL ON Y)

19.1 Model Conditional on Y

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

19.2 Pengujian Ada Tidaknya Interaksi antara X dan Z (Homogenous model vs Conditional Association on Y)

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

  • \(\alpha = 5\%\)

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:

  • Tidak tolak \(H_0\)

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}\).

19.3 Pengujian Hipotesis Interaksi X dan Z (Conditional on Y vs Homogenous)

# 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.

20 UJI MODEL INTERAKSI DUA ARAH (HOMOGENOUS VS CONDITIONAL ON Z)

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.

20.1 Model Conditional on Z

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

20.2 Pengujian Ada Tidaknya Interaksi antara X dan Y (Homogenous model vs Conditional Association on Z)

Hipotesis

  • \(H_0\): Tidak ada interaksi antara jenis kelamin (X) dan pendapat tentang hukuman mati (Y), yaitu \(\theta_{XY} = 0\).
  • \(H_1\): Ada interaksi antara jenis kelamin (X) dan pendapat tentang hukuman mati (Y), yaitu \(\theta_{XY} \neq 0\).

Tingkat Signifikansi

  • \(\alpha = 5\%\)

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.

20.3 Pengujian Hipotesis Interaksi X dan Y (Conditional on Z vs Homogenous)

# 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}\).

21 PEMILIHAN MODEL TERBAIK

21.1 Ringkasan Model Log Linier

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

21.2 Ringkasan Pengujian Interaksi 3 Arah dan 2 Arah

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

21.3 Kesimpulan Pemilihan Model Terbaik

Kesimpulan Pemilihan Model Terbaik

Berdasarkan hasil pengujian model log-linear untuk tabel kontingensi tiga arah, dapat disimpulkan bahwa:

  • Asosiasi yang signifikan hanya ditemukan antara jenis kelamin (X) dan pendapat mengenai hukuman mati (Y).
  • Interaksi tiga arah serta interaksi dua arah lainnya (antara Y dan Z, atau X dan Z) tidak signifikan.
  • Oleh karena itu, model terbaik yang dipilih adalah model log-linear yang memuat efek utama dan hanya satu interaksi dua arah yang signifikan, yaitu antara jenis kelamin dan pendapat mengenai hukuman mati.

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.

22 MODEL TERBAIK

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

23 INTERPRETASI KOEFISIEN MODEL TERBAIK

# 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

23.1 Interpretasi Koefsien Model Terbaik

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.

24 NILAI DUGAAN MODEL TERBAIK

# 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

24.1 Perhitungan Manual Nilai Dugaan (Fitted Value) Model Terbaik

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:

  • Angka seperti 111, 112, … mewakili kombinasi kategori untuk variabel \(X, Y, Z\) (misal 1 = laki-laki, 2 = perempuan, dll).
  • \(\beta_0\) = intercept (4.265)
  • \(\beta_{1X}\), \(\beta_{1Y}\), \(\beta_{jZ}\) adalah koefisien untuk kategori masing-masing variabel
  • \(\beta_{1X,1Y}\) adalah koefisien interaksi antara jenis kelamin dan sikap terhadap hukuman mati

25 Studi Kasus

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:

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

4.2. Pemilihan Fitur

4.3. Pembuatan Model

4.4. Evaluasi Model

  1. Analisis dan Pembahasan
# 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.

  1. Kesimpulan

Berdasarkan hasil analisis regresi logistik dan evaluasi model, dapat disimpulkan bahwa:

  1. 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.

  2. 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

  3. Penggunaan metode regularisasi LASSO dapat meningkatkan seleksi fitur dan mencegah overfitting sehingga model lebih generalisasi.

  4. 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.

26 Referensi

  1. Agresti, A. (2013). Categorical Data Analysis (3rd ed.). Wiley.

  2. Agresti, A. (2007). An Introduction to Categorical Data Analysis (2nd ed.). Wiley.

  3. Dobson, A. J., & Barnett, A. G. (2008). An Introduction to Generalized Linear Models (3rd ed.). Chapman and Hall/CRC.

  4. Friendly, M. (2000). Visualizing Categorical Data. SAS Institute.

  5. Lienert, G. A., & Raatz, U. (1998). Testaufbau und Testanalyse (6th ed.). Beltz.

  6. McCullagh, P., & Nelder, J. A. (1989). Generalized Linear Models (2nd ed.). Chapman and Hall.

  7. Cameron, A. C., & Trivedi, P. K. (2013). Regression Analysis of Count Data (2nd ed.). Cambridge University Press.

  8. Fox, J. (2015). Applied Regression Analysis and Generalized Linear Models (3rd ed.). SAGE Publications.

  9. Gelman, A., & Hill, J. (2006). Data Analysis Using Regression and Multilevel/Hierarchical Models. Cambridge University Press.

  10. Wickham, H., & Grolemund, G. (2016). R for Data Science. O’Reilly Media.

  11. Dataset: Kaggle - Medical Cost Personal Dataset

  12. 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.)

  13. Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied Logistic Regression (3rd ed.). Wiley.
    (Buku referensi utama untuk pemodelan regresi logistik.)

  14. 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

  15. 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

  16. 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

  17. UCI Machine Learning Repository. (n.d.). Breast Cancer Wisconsin (Diagnostic) Data Set. Retrieved from https://www.kaggle.com/datasets/uciml/breast-cancer-wisconsin-data