Pendahuluan

Tujuan Analisis Data Kategorikal

Analisis data kategorikal bertujuan untuk memahami pola atau tren dalam data yang memiliki kategori atau kelas. Beberapa tujuan penting dari analisis data kategorikal adalah:

Mengidentifikasi Pola dan Tren

Analisis data kategorikal membantu dalam mendeteksi pola atau tren dalam data yang terklasifikasi ke dalam kategori. Hal ini sangat berguna dalam situasi di mana kita ingin mengetahui apakah ada pengaruh atau pola tertentu yang ada antara kategori-kategori yang berbeda, seperti dalam analisis preferensi konsumen atau perilaku pengguna.

Menganalisis Hubungan Antarvariabel

Salah satu tujuan utama dalam analisis data kategorikal adalah untuk mengidentifikasi hubungan atau asosiasi antara dua atau lebih variabel kategori. Dengan menggunakan berbagai teknik statistik, kita dapat mengeksplorasi apakah hubungan antar variabel tersebut signifikan atau tidak, yang dapat membantu dalam pengambilan keputusan strategis.

Membantu dalam Pengambilan Keputusan

Hasil analisis data kategorikal sering kali digunakan sebagai dasar untuk mengambil keputusan yang lebih baik dalam berbagai bidang, seperti pemasaran, perencanaan bisnis, atau kebijakan publik. Informasi yang diperoleh dari analisis ini dapat memberikan wawasan tentang perilaku konsumen, preferensi pasar, atau tren yang sedang berkembang.

Mengembangkan Model Prediktif

Model prediktif berbasis data kategorikal dapat membantu dalam meramalkan atau memprediksi kejadian-kejadian di masa depan. Dengan menggunakan teknik statistik dan machine learning, model prediktif ini dapat digunakan untuk memprediksi berbagai fenomena, seperti kemungkinan pelanggan membeli produk tertentu atau perilaku pemilih dalam pemilu.

Definisi dan Ruang Lingkup Analisis Data Kategorikal

Analisis data kategorikal digunakan untuk memahami karakteristik variabel yang dikategorikan dalam kelompok-kelompok tertentu. Data kategorikal bisa dibagi dalam dua jenis utama:

Nominal vs Ordinal

  • Nominal: Data yang hanya mengklasifikasikan objek ke dalam kategori tanpa urutan atau peringkat, misalnya jenis kelamin, warna favorit, atau status perkawinan.

  • Ordinal: Data yang memiliki kategori dengan urutan atau peringkat, seperti tingkat pendidikan (SMA, S1, S2) atau skala penilaian (sangat setuju, setuju, tidak setuju).

Data Biner vs Multikategori

  • Data Biner: Data yang hanya memiliki dua kategori, seperti ya atau tidak, benar atau salah, menang atau kalah.

  • Multikategori: Data yang memiliki lebih dari dua kategori, seperti pilihan warna (merah, biru, hijau) atau status pekerjaan (penuh waktu, paruh waktu, freelance).

Perbedaan dengan Data Kuantitatif

Berbeda dengan data kuantitatif yang melibatkan angka dan perhitungan matematis (seperti tinggi badan, berat badan, atau pendapatan), data kategorikal lebih berfokus pada klasifikasi objek ke dalam kelompok tertentu berdasarkan karakteristik tertentu yang tidak dapat diukur dengan angka. Oleh karena itu, teknik analisis dan metode statistik yang digunakan untuk data kategorikal sangat berbeda dengan yang digunakan untuk data kuantitatif.

Manfaat Analisis Data Kategorikal dalam Berbagai Bidang

Analisis data kategorikal memiliki banyak aplikasi dalam berbagai bidang, seperti:

  • Pemasaran: Membantu dalam segmentasi pasar dan identifikasi preferensi konsumen.

  • Sosiologi: Menganalisis pola sosial berdasarkan kategori seperti status sosial, pendidikan, atau pekerjaan.

  • Ekonomi: Mengkategorikan pendapatan, status pekerjaan, dan indikator ekonomi lainnya.

  • Kesehatan: Menganalisis data kategori terkait dengan kondisi kesehatan atau perilaku kesehatan masyarakat.

Dengan memahami pola dan hubungan antara kategori, organisasi atau individu dapat mengambil keputusan yang lebih terinformasi dan tepat sasaran.

Metode dalam Analisis Data Kategori

Tabel Kontingensi dan Uji Chi-Square

Tabel kontingensi adalah alat statistik yang digunakan untuk menunjukkan hubungan antara dua atau lebih variabel kategorikal. Tabel ini menyajikan frekuensi pengamatan yang terbagi dalam beberapa kategori. Salah satu metode untuk menganalisis tabel kontingensi adalah dengan menggunakan uji Chi-Square. Uji ini digunakan untuk menguji apakah terdapat asosiasi atau hubungan yang signifikan antara variabel-variabel dalam tabel kontingensi. Uji Chi-Square bekerja dengan membandingkan frekuensi yang diamati dengan frekuensi yang diharapkan berdasarkan asumsi tidak adanya hubungan antara variabel.

Jika hasil uji Chi-Square menunjukkan nilai p < 0.05, maka dapat disimpulkan bahwa terdapat hubungan yang signifikan antara variabel yang dianalisis. Sebaliknya, jika p-value lebih besar dari 0.05, maka hubungan antara variabel tidak signifikan.

Regresi Logistik

Regresi logistik adalah metode analisis statistik yang digunakan untuk memodelkan hubungan antara variabel dependen kategorikal (biasanya biner) dan satu atau lebih variabel independen. Dalam regresi logistik, variabel dependen diubah menjadi probabilitas melalui fungsi logistik yang menghubungkan variabel independen dengan kemungkinan terjadinya suatu peristiwa. Regresi logistik banyak digunakan untuk analisis klasifikasi, seperti memprediksi apakah seorang pasien akan mengembangkan suatu penyakit berdasarkan gejala-gejala yang ada, atau memprediksi kemungkinan seseorang membeli produk berdasarkan preferensi tertentu.

Secara matematis, regresi logistik menggunakan fungsi sigmoid yang menghasilkan output dalam rentang 0 hingga 1. Model ini sangat berguna untuk masalah klasifikasi biner, di mana hasilnya berupa probabilitas suatu kejadian, seperti “ya” atau “tidak”.

Analisis Correspondence (CA)

Analisis Correspondence (CA) adalah metode multivariat yang digunakan untuk menganalisis tabel kontingensi, terutama ketika melibatkan lebih dari dua variabel kategorikal. CA memungkinkan untuk mengeksplorasi asosiasi antara baris dan kolom dalam tabel kontingensi dan menyajikan hasil dalam bentuk representasi grafis yang lebih mudah dipahami.

Metode ini mencari pola dalam data dan memetakan kategori dari variabel yang ada ke dalam ruang dimensi yang lebih rendah, biasanya dua dimensi. CA digunakan dalam berbagai bidang seperti pemasaran, sosiologi, dan ilmu sosial untuk menganalisis asosiasi antara karakteristik kelompok yang berbeda.

Decision Tree dan Random Forest

Decision Tree adalah model prediktif yang digunakan untuk membuat keputusan berdasarkan serangkaian aturan if-then yang dibangun dari data. Pohon keputusan membagi data ke dalam kelompok berdasarkan kriteria tertentu dan menghasilkan model yang mudah dipahami. Pohon keputusan dapat digunakan baik untuk masalah klasifikasi maupun regresi.

Namun, salah satu kelemahan dari decision tree adalah rentan terhadap overfitting, terutama ketika data sangat kompleks. Oleh karena itu, metode Random Forest digunakan untuk mengatasi masalah tersebut. Random Forest adalah algoritma ensemble yang menggabungkan banyak pohon keputusan untuk membuat prediksi. Dalam Random Forest, setiap pohon keputusan dibuat berdasarkan subset acak dari data, dan hasil akhirnya diperoleh dengan menggabungkan prediksi dari berbagai pohon (voting untuk klasifikasi atau rata-rata untuk regresi).

Random Forest sangat efektif dalam menangani data dengan banyak fitur dan mampu memberikan hasil yang lebih stabil dibandingkan dengan pohon keputusan tunggal.

Distribusi Probabilitas dalam Data Kategori

Variabel acak kategori adalah variabel yang hanya dapat memiliki beberapa kategori diskrit sebagai hasilnya. Distribusi probabilitas dari variabel ini menggambarkan kemungkinan terjadinya setiap kategori. Berikut adalah distribusi yang sering digunakan dalam analisis data kategori:

Distribusi Bernoulli

Distribusi Bernoulli digunakan untuk percobaan biner, yaitu percobaan yang memiliki dua kemungkinan hasil: sukses (1) dan gagal (0). Distribusi ini menggambarkan kejadian yang hanya memiliki dua kemungkinan dengan probabilitas yang berbeda.

Fungsi Probabilitas:

\[ P(X = x) = p^x (1 - p)^{1-x}, \quad x \in \{0, 1\} \]

Keterangan:

  • \(X\) adalah variabel acak biner (0 atau 1).
  • \(p\) adalah probabilitas sukses (X = 1).
  • \(1 - p\) adalah probabilitas gagal (X = 0).

Contoh Kasus:

Contoh variabel acak Bernoulli dapat digunakan dalam kasus pemasaran, seperti apakah seseorang akan membeli produk (1) atau tidak (0) setelah menerima iklan.

# Data simulasi
set.seed(123)
bernoulli_sample <- rbinom(n = 10, size = 1, prob = 0.7)  # 10 percobaan Bernoulli dengan probabilitas sukses 0.7
bernoulli_sample
##  [1] 1 0 1 0 0 1 1 0 1 1

Ditribusi Binomial

Distribusi Binomial adalah generalisasi dari distribusi Bernoulli yang digunakan untuk \(n\) kali percobaan independen, dimana masing-masing percobaan memiliki dua kemungkinan hasil: sukses atau gagal. Setiap percobaan memiliki probabilitas sukses \(p\), maka distribusi Binomial memiliki fungsi probabilitas:

\[ P(X = k) = \binom{n}{k} p^k (1 - p)^{n - k} \] Keterangan:

  • \(X\) adalah jumlah keberhasilan dalam \(n\) percobaan.
  • \(n\) adalah jumlah percobaan.
  • \(k\) adalah jumlah keberhasilan yang diamati.
  • \(p\) adalah probabilitas keberhasilan pada satu percobaan.

Contoh Kasus:

Contoh variabel acak Binomial adalah jumlah keberhasilan dalam 15 kali percobaan untuk menentukan apakah seorang pasien merespon terhadap obat tertentu.

# Data simulasi
set.seed(123)
binomial_sample <- rbinom(n = 10, size = 15, prob = 0.6)  # 10 percobaan Binomial dengan 15 percobaan dan probabilitas sukses 0.6
binomial_sample
##  [1] 10  7  9  7  6 12  9  7  9  9

Distribusi Multinomial

Distribusi Multinomial adalah generalisasi lebih lanjut dari distribusi Binomial, digunakan ketika setiap percobaan memiliki lebih dari dua kemungkinan hasil. Jika suatu eksperimen dilakukan sebanyak \(n\) kali, dan setiap percobaan dapat menghasilkan salah satu dari \(k\) kategori dengan probabilitas \(p_1, p_2, \dots, p_k\), maka distribusi probabilitasnya adalah:

\[ P(X_1 = x_1, \dots, X_k = x_k) = \frac{n!}{x_1! x_2! \dots x_k!} p_1^{x_1} p_2^{x_2} \dots p_k^{x_k} \]

Keterangan:

  • \(X_i\) adalah frekuensi kemunculan kategori ke-\(i\).
  • \(n\) adalah jumlah total percobaan.
  • \(p_i\) adalah probabilitas kategori ke-\(i\).

Contoh Kasus:

Contoh variabel acak Multinomial dapat menggambarkan hasil pemilihan produk berdasarkan warna di sebuah toko (misalnya, merah, hijau, dan biru).

# Data simulasi
set.seed(123)
multinomial_sample <- rmultinom(n = 1, size = 10, prob = c(0.4, 0.3, 0.3))  # 10 percobaan dengan 3 kategori
multinomial_sample
##      [,1]
## [1,]    3
## [2,]    5
## [3,]    2

Distribusi Poisson

Distribusi Poisson digunakan untuk menghitung jumlah kejadian dalam interval waktu atau ruang tertentu, di mana kejadian terjadi secara acak dengan rata-rata kejadian \(\lambda\) per unit waktu atau ruang. Fungsi probabilitasnya adalah:

\[ P(X = k) = \frac{e^{-\lambda} \lambda^k}{k!} \]

Keterangan:

  • \(X\) adalah jumlah kejadian dalam interval waktu atau ruang tertentu.
  • \(\lambda\) adalah rata-rata kejadian dalam interval tersebut.
  • \(k\) adalah jumlah kejadian yang diamati.

Contoh Kasus:

Contoh variabel acak Poisson adalah jumlah kendaraan yang melewati jalan tol dalam satu jam atau jumlah pengunjung di toko dalam sehari.

# Data simulasi
set.seed(123)
poisson_sample <- rpois(10, lambda = 4)  # 10 sampel dengan rata-rata kejadian 4
poisson_sample
##  [1] 3 6 3 6 7 1 4 7 4 4

Desain Sampling dalam Analisis Data Kategorikal

Sampling Prospektif

Sampling prospektif mengacu pada pendekatan pengumpulan data yang dilakukan ke arah masa depan, di mana peneliti mengamati subjek dari awal paparan hingga terjadinya hasil tertentu. Metode ini sering digunakan dalam penelitian epidemiologi dan eksperimental untuk memantau perkembangan suatu fenomena secara langsung.

Eksperimen

Eksperimen melibatkan manipulasi variabel independen oleh peneliti untuk menilai pengaruhnya terhadap variabel dependen pada kelompok yang diteliti. Desain ini biasanya mencakup kelompok kontrol dan kelompok perlakuan, dengan pengendalian faktor pengganggu untuk memastikan hubungan sebab-akibat dapat diidentifikasi. Contohnya adalah uji klinis obat, di mana pasien secara acak diberi perlakuan atau plasebo untuk mengukur efektivitas.

Studi Kohort

Studi kohort melibatkan pengamatan sekelompok individu yang memiliki karakteristik awal tertentu (misalnya, paparan terhadap faktor risiko) selama periode waktu tertentu untuk menentukan apakah ada hubungan dengan hasil tertentu (misalnya, penyakit). Penelitian ini dimulai sebelum hasil terjadi dan dapat bersifat prospektif murni, di mana data dikumpulkan secara real-time. Contohnya adalah studi kohort perokok untuk mengamati insiden kanker paru-paru.

Sampling Retrospektif

Sampling retrospektif melibatkan analisis data yang sudah ada atau pengumpulan informasi dari masa lalu untuk mengevaluasi hubungan antara paparan dan hasil. Pendekatan ini sering digunakan ketika data historis tersedia atau ketika hasil sudah terjadi.

Studi Kasus-Kontrol

Studi kasus-kontrol membandingkan individu yang menunjukkan hasil tertentu (kasus) dengan individu yang tidak menunjukkan hasil tersebut (kontrol) untuk mengidentifikasi faktor risiko atau penyebab potensial. Data dikumpulkan dengan melihat ke belakang untuk menentukan paparan sebelumnya. Misalnya, studi kasus-kontrol dapat digunakan untuk membandingkan pasien dengan penyakit jantung dan yang sehat untuk menganalisis riwayat pola makan.

Studi Kohort Retrospektif

Studi kohort retrospektif memanfaatkan data historis yang telah terekam untuk mengamati kelompok individu berdasarkan paparan masa lalu dan menghubungkannya dengan hasil yang diamati. Berbeda dengan studi kohort prospektif, data dikumpulkan dari catatan atau arsip yang ada, bukan dari pengamatan langsung. Contohnya adalah analisis data medis lama untuk meneliti hubungan antara paparan asbes dan penyakit paru-paru.

Tabel Perbandingan Desain Sampling

Berikut adalah tabel perbandingan antara desain sampling prospektif dan retrospektif berdasarkan karakteristik utama:

library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
desain_sampling <- data.frame(
  Aspek = c(
    "Arah Waktu",
    "Contoh Desain",
    "Pengumpulan Data",
    "Kelebihan",
    "Kekurangan",
    "Contoh Penggunaan"
  ),
  `Sampling Prospektif` = c(
    "Ke depan (dari paparan ke hasil)",
    "Eksperimen, Studi Kohort Prospektif",
    "Secara real-time atau terjadwal",
    "Kontrol tinggi, hubungan sebab-akibat jelas",
    "Memakan waktu dan biaya tinggi",
    "Uji klinis obat"
  ),
  `Sampling Retrospektif` = c(
    "Ke belakang (dari hasil ke paparan)",
    "Studi Kasus-Kontrol, Studi Kohort Retrospektif",
    "Dari data historis atau arsip",
    "Efisien untuk hasil langka, cepat",
    "Rentan terhadap bias ingatan atau data",
    "Analisis wabah penyakit masa lalu"
  ),
  check.names = FALSE
)

kable(desain_sampling, caption = "Perbandingan Desain Sampling Prospektif dan Retrospektif")
Perbandingan Desain Sampling Prospektif dan Retrospektif
Aspek Sampling Prospektif Sampling Retrospektif
Arah Waktu Ke depan (dari paparan ke hasil) Ke belakang (dari hasil ke paparan)
Contoh Desain Eksperimen, Studi Kohort Prospektif Studi Kasus-Kontrol, Studi Kohort Retrospektif
Pengumpulan Data Secara real-time atau terjadwal Dari data historis atau arsip
Kelebihan Kontrol tinggi, hubungan sebab-akibat jelas Efisien untuk hasil langka, cepat
Kekurangan Memakan waktu dan biaya tinggi Rentan terhadap bias ingatan atau data
Contoh Penggunaan Uji klinis obat Analisis wabah penyakit masa lalu

Kasus yang Digunakan Dalam Soal

Saya memilih topik ini karena kesehatan jantung merupakan salah satu isu kesehatan yang seringkali diabaikan. Penyakit jantung merupakan salah satu penyebab utama kematian di Indonesia. Menurut data Institute for Health Metrics and Evaluation (IHME) 2019, kematian akibat penyakit kardiovaskular di Indonesia mencapai 651.481 penduduk per tahun, yang terdiri dari stroke (331.349 kematian), penyakit jantung koroner (245.343 kematian), dan penyakit jantung hipertensi (50.620 kematian), serta penyakit kardiovaskular lainnya. Data ini menunjukkan bahwa penyakit jantung memiliki dampak besar terhadap kesehatan masyarakat. Faktor gaya hidup, sepereti pola makan dan olahraga, berperan penting dalam menurunkan resiko penyakit jantung. Menurut Departemen Kesehatan Republik Indonesia (2009), pola makan yang tinggi konsumsi karbohidrat dan lemak berlebihan dapat meningkatkan risiko penyakit jantung koroner (PJK). Sebaliknya, konsumsi sayur dan kopi berpotensi menurunkan risiko PJK. Sementara itu, American Heart Association (AHA) menyatakan bahwa olahraga teratur dapat membantu menurunkan tekanan darah, meningkatkan kadar kolesterol baik (HDL), dan menurunkan kolesterol jahat (LDL), sehingga mengurangi risiko penyakit jantung.

Olahraga dan pola makan menjadi beberapa faktor yang ada kaitannya dengan kesehatan jantung, sehingga perlu untuk memahami hubungan ketiganya. Olahraga berperan dalam menjaga tekanan darah tetap stabil, meningkatkan sensitivitas insulin, serta mengurangi peradangan yang berkontribusi terhadap penyakit kardiovaskular (Lee et al., 2012). Olahraga membantu menjaga tekanan darah, meningkatkan kadar kolesterol baik (HDL), dan mengurangi kolesterol jahat (LDL). Sementara pola makan sehat yang seimbang nutrisinya berperan besar dalam menjaga kesehatan pembuluh darah dan jantung. Studi kohort dari Harvard T.H. Chan School of Public Health menemukan bahwa individu dengan gaya hidup sehat memiliki risiko 50% lebih rendah mengalami penyakit jantung dibandingkan dengan mereka yang tidak menerapkan pola hidup sehat (Chiuve et al., 2006). Data di bawah mencerminkan hubungan antara pola olahraga, pola makan, dan kesehatan jantung. Seseorang yang rutin berolahraga dan memiliki pola makan sehat cenderung memiliki kesehatan jantung yang lebih baik dibandingkan yang mengabaikannya. Hal ini sesuai dengan berbagai penelitian yang pernah dilakukan dalam bidang kesehatan yang menunjukkan bahwa seseorang yang menerapkan gaya hidup sehat memiliki risiko lebih rendah terhadap penyakit jantung dibandingkan dengan mereka yang kurang aktif secara fisik dan memiliki pola makan buruk. Dengan demikian, perubahan gaya hidup yang melibatkan peningkatan aktivitas fisik dan konsumsi makanan bergizi berkontribusi besar sebagai upaya pencegahan penyakit jantung.

Dengan memahami bagaimana pola olahraga dan pola makan berkontribusi terhadap kesehatan jantung, seseorang dapat mengambil keputusan yang lebih baik dalam gaya hidup mereka. Pemahaman yang lebih dalam mengenai hubungan ketiga faktor ini dapat memberikan wawasan guna memperbaiki kualitas hidup yang utamanya menjaga kesehatan jantung. Pola makan menjadi confounder karena memengaruhi pola olahraga dan/atau kesehatan jantung. Pola makan sehat bisa meningkatkan energi dan motivasi berolahraga, sementara pola makan tidak sehat dapat menurunkan aktivitas fisik. Selain itu, pola makan yang buruk meningkatkan risiko penyakit jantung melalui peningkatan kolesterol dan tekanan darah.

Sebuah penelitian dilakukan untuk menganalisis hubungan antara pola olahraga, pola makan, dan kesehatan jantung pada orang dewasa. Data dikumpulkan dari 500 partisipan dan dikategorikan berdasarkan:

  1. Pola Olahraga (X):

    1. Rutin (≥3 kali/minggu)

    2. Tidak Rutin (<3 kali/minggu)

  2. Pola Makan (Z):

    1. Sehat (tinggi serat, rendah lemak jenuh)

    2. Tidak Sehat (tinggi gula dan lemak jenuh)

  3. Kesehatan Jantung (Y):

    1. Baik (tidak ada gejala penyakit jantung)

    2. Buruk (memiliki faktor risiko tinggi atau sudah terdiagnosis penyakit jantung)

Penjelasan Variabel:

- X (Pola Olahraga): Variabel bebas utama yang diasumsikan memengaruhi kesehatan jantung.

- Y (Kesehatan Jantung): Variabel terikat yang menjadi fokus analisis.

- Z (Pola Makan): Variabel kontrol yang dapat mengubah hubungan antara X dan Y.

Distribusi Peluang dalam Tabel Kontingensi 2 x 2

Tabel kontingensi 2 × 2 adalah alat statistik yang digunakan untuk menganalisis hubungan antara dua variabel kategori. Dalam bab ini, kita akan fokus pada distribusi peluang yang terdapat dalam tabel kontingensi 2 × 2, yang membantu kita memahami hubungan antar variabel berdasarkan data kategorikal.

Distribusi Peluang dalam Tabel Kontingensi 2 × 2

Tabel kontingensi 2 × 2 untuk analisis hubungan antara pola olahraga dan kesehatan dapat disusun sebagai berikut:

Pola Olahraga Kesehatan Baik Kesehatan Buruk Total
Rutin 150 30 180
Tidak Rutin 100 60 160
Total 250 90 340
library(ggplot2)
data <- matrix(c(150, 30, 100, 60), nrow = 2, byrow = TRUE)
colnames(data) <- c("Kesehatan Baik", "Kesehatan Buruk")
rownames(data) <- c("Rutin", "Tidak Rutin")
ggplot(data = as.data.frame(as.table(data)), aes(x = Var2, y = Var1, fill = Freq)) +
  geom_tile() +
  geom_text(aes(label = Freq), color = "white") +
  scale_fill_gradient(low = "lightblue", high = "darkblue") +
  labs(title = "Heatmap Tabel Kontingensi", x = "Kesehatan", y = "Pola Olahraga")

Dari tabel di atas, kita dapat menghitung tiga jenis peluang, yaitu peluang bersama, peluang marginal, dan peluang bersyarat.

Peluang Bersama

Peluang bersama adalah probabilitas bahwa kedua variabel terjadi secara bersamaan dalam suatu sel tabel kontingensi. Ini menunjukkan kemungkinan bahwa kedua kejadian terjadi pada waktu yang sama.

Peluang bersama dapat dihitung dengan menggunakan rumus:

\[ P(A_i, B_j) = \frac{n_{ij}}{n} \]

Di mana: - \(P(A_i, B_j)\) adalah peluang bersama. - \(n_{ij}\) adalah jumlah frekuensi kejadian dalam sel ke-i dan ke-j. - \(n\) adalah total jumlah sampel.

Berdasarkan tabel di atas, kita dapat menghitung peluang bersama untuk masing-masing kombinasi pola olahraga dan kesehatan:

  • \(P(\text{Rutin, Kesehatan Baik}) = \frac{150}{340} = 0.4412\)
  • \(P(\text{Rutin, Kesehatan Buruk}) = \frac{30}{340} = 0.0882\)
  • \(P(\text{Tidak Rutin, Kesehatan Baik}) = \frac{100}{340} = 0.2941\)
  • \(P(\text{Tidak Rutin, Kesehatan Buruk}) = \frac{60}{340} = 0.1765\)
library(ggplot2)
data_joint <- data.frame(
  Kategori = c("Rutin, Baik", "Rutin, Buruk", "Tidak Rutin, Baik", "Tidak Rutin, Buruk"),
  Peluang = c(0.4412, 0.0882, 0.2941, 0.1765)
)
ggplot(data_joint, aes(x = "", y = Peluang, fill = Kategori)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  labs(title = "Peluang Bersama") +
  theme_void()

Peluang Marginal

Peluang marginal adalah probabilitas terjadinya suatu kejadian tanpa mempertimbangkan kejadian lainnya. Ini menggambarkan peluang terjadinya salah satu variabel tanpa memperhatikan variabel lainnya.

Peluang marginal dapat dihitung untuk baris atau kolom dalam tabel kontingensi, menggunakan rumus:

\[ P(A_i) = \frac{n_{i.}}{n} \quad \text{atau} \quad P(B_j) = \frac{n_{.j}}{n} \]

Dengan menggunakan tabel di atas, kita dapat menghitung peluang marginal untuk masing-masing variabel:

  • \(P(\text{Kesehatan Baik}) = \frac{250}{340} = 0.7353\)
  • \(P(\text{Kesehatan Buruk}) = \frac{90}{340} = 0.2647\)
  • \(P(\text{Rutin}) = \frac{180}{340} = 0.5294\)
  • \(P(\text{Tidak Rutin}) = \frac{160}{340} = 0.4706\)
library(ggplot2)

# Data peluang marginal berdasarkan tabel kontingensi
data_marginal <- data.frame(
  Kategori = c("Kesehatan Baik", "Kesehatan Buruk", "Rutin", "Tidak Rutin"),
  Peluang = c(0.7353, 0.2647, 0.5294, 0.4706)
)

# Membuat barplot
ggplot(data_marginal, aes(x = Kategori, y = Peluang, fill = Kategori)) +
  geom_bar(stat = "identity") +
  scale_fill_manual(values = c("Kesehatan Baik" = "blue", "Kesehatan Buruk" = "red", 
                               "Rutin" = "lightblue", "Tidak Rutin" = "pink")) +
  labs(title = "Peluang Marginal", y = "Peluang", x = "Kategori") +
  theme_minimal() +
  theme(legend.position = "none")

Peluang Bersyarat

Peluang bersyarat adalah probabilitas terjadinya suatu kejadian dengan syarat bahwa kejadian lainnya sudah terjadi. Ini menggambarkan bagaimana peluang suatu kejadian berubah ketika informasi tambahan tentang kejadian lain diberikan.

Peluang bersyarat dapat dihitung dengan menggunakan rumus:

\[ P(B_j | A_i) = \frac{P(A_i, B_j)}{P(A_i)} \quad \text{atau} \quad P(A_i | B_j) = \frac{P(A_i, B_j)}{P(B_j)} \]

Dengan menggunakan data dari tabel di atas, kita dapat menghitung peluang bersyarat sebagai berikut:

  • \(P(\text{Kesehatan Baik | Rutin}) = \frac{150}{180} = 0.8333\)
  • \(P(\text{Kesehatan Buruk | Rutin}) = \frac{30}{180} = 0.1667\)
  • \(P(\text{Kesehatan Baik | Tidak Rutin}) = \frac{100}{160} = 0.6250\)
  • \(P(\text{Kesehatan Buruk | Tidak Rutin}) = \frac{60}{160} = 0.3750\)
library(ggplot2)
data_cond <- data.frame(
  Kesehatan = c("Baik | Rutin", "Buruk | Rutin", "Baik | Tidak Rutin", "Buruk | Tidak Rutin"),
  Peluang = c(0.8333, 0.1667, 0.6250, 0.3750)
)
ggplot(data_cond, aes(x = Kesehatan, y = Peluang, fill = Kesehatan)) +
  geom_bar(stat = "identity") +
  scale_fill_manual(values = c("blue", "red", "lightblue", "pink")) +
  labs(title = "Peluang Bersyarat", y = "Peluang", x = "Kategori") +
  theme_minimal()

Interpretasi

  • Peluang Bersama: Menunjukkan probabilitas gabungan bahwa pola olahraga dan status kesehatan terjadi bersamaan. Misalnya, peluang bahwa seseorang melakukan olahraga rutin dan memiliki kesehatan baik adalah 0.4412.
  • Peluang Marginal: Menunjukkan probabilitas kejadian salah satu variabel, tanpa mempertimbangkan variabel lainnya. Sebagai contoh, peluang bahwa seseorang memiliki kesehatan baik adalah 0.7353.
  • Peluang Bersyarat: Menunjukkan probabilitas terjadinya satu kejadian dengan kondisi bahwa kejadian lainnya sudah terjadi. Misalnya, peluang bahwa seseorang memiliki kesehatan baik dengan syarat bahwa mereka berolahraga secara rutin adalah 0.8333.

Peluang-peluang ini adalah dasar untuk menganalisis hubungan antara dua variabel kategorikal dalam tabel kontingensi 2 × 2, dan memberikan wawasan yang lebih dalam mengenai interaksi antara pola olahraga dan kesehatan.

Implementasi dengan R

Berikut adalah implementasi perhitungan peluang bersama, peluang marginal, peluang bersyarat, Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR) dengan menggunakan R:

# Data Observasi
data <- matrix(c(150, 30, 100, 60), nrow = 2, byrow = TRUE)
colnames(data) <- c("Kesehatan Baik", "Kesehatan Buruk")
rownames(data) <- c("Rutin", "Tidak Rutin")
n <- sum(data)

# 5.1.1 Peluang Bersama
P_joint <- data / n
P_joint
##             Kesehatan Baik Kesehatan Buruk
## Rutin            0.4411765      0.08823529
## Tidak Rutin      0.2941176      0.17647059
# 5.1.2 Peluang Marginal
P_marginal_rows <- rowSums(data) / n
P_marginal_cols <- colSums(data) / n
P_marginal_rows
##       Rutin Tidak Rutin 
##   0.5294118   0.4705882
P_marginal_cols
##  Kesehatan Baik Kesehatan Buruk 
##       0.7352941       0.2647059
# 5.1.3 Peluang Bersyarat
P_conditional <- data / rowSums(data)
P_conditional
##             Kesehatan Baik Kesehatan Buruk
## Rutin            0.8333333       0.1666667
## Tidak Rutin      0.6250000       0.3750000
# Menampilkan hasil
cat("Peluang Bersama:\n")
## Peluang Bersama:
print(P_joint)
##             Kesehatan Baik Kesehatan Buruk
## Rutin            0.4411765      0.08823529
## Tidak Rutin      0.2941176      0.17647059
cat("\nPeluang Marginal Baris:\n")
## 
## Peluang Marginal Baris:
print(P_marginal_rows)
##       Rutin Tidak Rutin 
##   0.5294118   0.4705882
cat("\nPeluang Marginal Kolom:\n")
## 
## Peluang Marginal Kolom:
print(P_marginal_cols)
##  Kesehatan Baik Kesehatan Buruk 
##       0.7352941       0.2647059
cat("\nPeluang Bersyarat:\n")
## 
## Peluang Bersyarat:
print(P_conditional)
##             Kesehatan Baik Kesehatan Buruk
## Rutin            0.8333333       0.1666667
## Tidak Rutin      0.6250000       0.3750000

Ukuran Asosiasi dalam Tabel Kontingensi 2 x 2

Dalam analisis statistik, ukuran asosiasi digunakan untuk mengukur hubungan atau kekuatan asosiasi antara dua variabel kategori. Ukuran asosiasi yang sering digunakan dalam tabel kontingensi 2 × 2 adalah Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR). Di bawah ini, kita akan membahas secara rinci masing-masing ukuran asosiasi tersebut. Ukuran asosiasi membantu kita untuk mengukur seberapa besar hubungan antara dua variabel kategori. Untuk menghitung ukuran asosiasi dalam tabel kontingensi 2 × 2, kita perlu menggunakan rumus-rumus berikut yang berlaku dalam pengukuran hubungan antara dua kategori.

Risk Difference (RD)

Risk Difference (RD) atau perbedaan risiko adalah ukuran yang digunakan untuk mengukur perbedaan antara probabilitas kejadian suatu hasil dalam dua kelompok yang berbeda. RD dihitung dengan rumus:

\[ RD = P(A_1) - P(A_2) = \frac{n_{11}}{n_{1.}} - \frac{n_{21}}{n_{2.}} \]

Dimana:

- \(P(A_1)\) adalah peluang kejadian di kelompok pertama (misalnya, “Rutin”).

- \(P(A_2)\) adalah peluang kejadian di kelompok kedua (misalnya, “Tidak Rutin”).

- \(n_{11}\) adalah jumlah kejadian di sel 1,1.

- \(n_{21}\) adalah jumlah kejadian di sel 2,1.

Misalnya, dengan menggunakan data dari tabel sebelumnya, kita dapat menghitung Risk Difference:

\[ RD = \frac{150}{180} - \frac{100}{160} = 0.8333 - 0.6250 = 0.2083 \]

Interpretasi: Nilai RD = 0.2083 menunjukkan bahwa kelompok “Rutin” memiliki risiko kesehatan baik yang lebih tinggi sebesar 0.2083 dibandingkan dengan kelompok “Tidak Rutin”.

Relative Risk (RR)

Relative Risk (RR) atau risiko relatif adalah ukuran yang digunakan dalam epidemiologi untuk membandingkan risiko kejadian suatu peristiwa antara dua kelompok. RR dihitung dengan rumus:

\[ RR = \frac{P(A_1)}{P(A_2)} = \frac{n_{11}/n_{1.}}{n_{21}/n_{2.}} \]

Dimana:

- \(P(A_1)\) adalah peluang kejadian di kelompok pertama (misalnya, “Rutin”).

- \(P(A_2)\) adalah peluang kejadian di kelompok kedua (misalnya, “Tidak Rutin”).

Dengan menggunakan data dari tabel di atas, kita dapat menghitung Relative Risk:

\[ RR = \frac{150/180}{100/160} = \frac{0.8333}{0.6250} = 1.3333 \]

Interpretasi: Nilai RR = 1.3333 menunjukkan bahwa kelompok “Rutin” memiliki peluang 1.33 kali lebih besar untuk memiliki kesehatan baik dibandingkan dengan kelompok “Tidak Rutin”.

Odds Ratio (OR)

Odds Ratio (OR) atau rasio odds adalah ukuran yang digunakan untuk membandingkan peluang kejadian antara dua kelompok. OR dihitung dengan rumus:

\[ OR = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}} \]

Dimana:

- \(n_{11}\) adalah jumlah kejadian di sel 1,1.

- \(n_{12}\) adalah jumlah kejadian di sel 1,2.

- \(n_{21}\) adalah jumlah kejadian di sel 2,1.

- \(n_{22}\) adalah jumlah kejadian di sel 2,2.

Menggunakan data dari tabel di atas, kita dapat menghitung Odds Ratio:

\[ OR = \frac{150 \cdot 60}{30 \cdot 100} = \frac{9000}{3000} = 3.0000 \]

Interpretasi: Nilai OR = 3.0000 menunjukkan bahwa peluang seseorang yang melakukan olahraga rutin untuk memiliki kesehatan baik adalah 3 kali lebih besar dibandingkan dengan yang tidak rutin.

library(ggplot2)
data_assoc <- data.frame(
  Ukuran = c("RD", "RR", "OR"),
  Estimasi = c(0.2083, 1.3333, 3.0000),
  Lower = c(0.1, 1.1, 2.5),  # Contoh interval
  Upper = c(0.3, 1.5, 3.5)   # Contoh interval
)
ggplot(data_assoc, aes(x = Ukuran, y = Estimasi)) +
  geom_point(size = 4) +
  geom_errorbar(aes(ymin = Lower, ymax = Upper), width = 0.2) +
  labs(title = "Ukuran Asosiasi", y = "Estimasi", x = "Ukuran") +
  theme_minimal()

Perbandingan RD, RR, dan OR

Setiap ukuran asosiasi memiliki kelebihan dan kegunaannya dalam berbagai jenis studi. Berikut adalah perbandingan antara ketiganya:

Ukuran Asosiasi Definisi Desain Studi yang Cocok Interpretasi
Risk Difference (RD) Selisih probabilitas kejadian antara dua kelompok Studi kohort atau eksperimen acak Mengukur perbedaan risiko absolut antara dua kelompok
Relative Risk (RR) Perbandingan risiko kejadian antara dua kelompok Studi kohort atau eksperimen klinis Menunjukkan seberapa besar kemungkinan kejadian pada satu kelompok dibandingkan dengan kelompok lainnya
Odds Ratio (OR) Perbandingan odds kejadian antara dua kelompok Studi kasus-kontrol atau observasional Menilai hubungan antara eksposur dan kejadian dalam desain penelitian ini

Kesimpulan

  • RD digunakan untuk memahami dampak absolut dari suatu faktor risiko atau intervensi.
  • RR lebih cocok untuk studi kohort atau eksperimen karena mengukur kemungkinan relatif.
  • OR sering digunakan dalam studi kasus-kontrol karena dapat memperkirakan risiko relatif dalam desain penelitian ini.

Implementasi dengan R

Berikut syntax R untuk menghitung Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR):

# Data Observasi
data <- matrix(c(150, 30, 100, 60), nrow = 2, byrow = TRUE)
colnames(data) <- c("Kesehatan Baik", "Kesehatan Buruk")
rownames(data) <- c("Rutin", "Tidak Rutin")
n <- sum(data)

# 5.2.1 Risk Difference (RD)
p1 <- data[1, 1] / sum(data[1, ])  # Probabilitas kesehatan baik pada Rutin
p2 <- data[2, 1] / sum(data[2, ])  # Probabilitas kesehatan baik pada Tidak Rutin
RD <- p1 - p2  # Risk Difference
RD
## [1] 0.2083333
# 5.2.2 Relative Risk (RR)
RR <- (data[1, 1] / sum(data[1, ])) / (data[2, 1] / sum(data[2, ]))  # Relative Risk
RR
## [1] 1.333333
# 5.2.3 Odds Ratio (OR)
OR <- (data[1, 1] * data[2, 2]) / (data[1, 2] * data[2, 1])  # Odds Ratio
OR
## [1] 3
# Menampilkan hasil
cat("Risk Difference (RD): ", RD, "\n")
## Risk Difference (RD):  0.2083333
cat("Relative Risk (RR): ", RR, "\n")
## Relative Risk (RR):  1.333333
cat("Odds Ratio (OR): ", OR, "\n")
## Odds Ratio (OR):  3

Inferensi Tabel Kontingensi 2 Arah

Estimasi

Estimasi Titik

Estimasi titik adalah pendekatan yang digunakan untuk memperoleh satu nilai yang dianggap sebagai perkiraan terbaik dari suatu parameter populasi berdasarkan data sampel. Sebagai contoh, dalam analisis tabel kontingensi, estimasi titik bisa digunakan untuk menghitung proporsi kejadian dalam kategori tertentu.

Estimasi titik untuk proporsi \(\hat{p}\) dihitung dengan rumus:

\[ \hat{p} = \frac{x}{n} \]

Di mana:

- \(\hat{p}\) adalah estimasi titik untuk proporsi kejadian.

- \(x\) adalah jumlah kejadian dalam kategori yang diinginkan.

- \(n\) adalah total jumlah sampel.

Sebagai contoh, berdasarkan data yang ada, kita dapat menghitung estimasi titik untuk proporsi individu yang memiliki kesehatan baik dengan pola olahraga rutin:

\[ \hat{p}_{Rutin, Baik} = \frac{150}{180} = 0.8333 \]

Dengan demikian, estimasi titik untuk proporsi kesehatan baik pada kelompok yang rutin berolahraga adalah 0.8333.

Estimasi Interval

Estimasi interval memberikan rentang nilai yang diharapkan untuk parameter populasi dengan tingkat kepercayaan tertentu. Ini memberikan gambaran lebih jelas mengenai ketidakpastian dalam estimasi, karena memperhitungkan variasi data sampel.

Estimasi interval untuk proporsi dengan tingkat kepercayaan \(95\%\) dapat dihitung menggunakan rumus:

\[ \hat{p} \pm Z_{\alpha/2} \sqrt{\frac{\hat{p}(1 - \hat{p})}{n}} \]

Dimana:

- \(\hat{p}\) adalah estimasi titik untuk proporsi.

- \(Z_{\alpha/2}\) adalah nilai kritis dari distribusi normal standar untuk tingkat kepercayaan tertentu (misalnya, untuk \(95\%\) adalah 1.96).

- \(n\) adalah total jumlah sampel.

Contoh, untuk menghitung estimasi interval untuk proporsi kesehatan baik pada kelompok yang rutin berolahraga, kita dapat menggunakan rumus berikut:

\[ 0.8333 \pm 1.96 \sqrt{\frac{0.8333(1 - 0.8333)}{180}} \]

Perhitungan:

\[ 0.8333 \pm 1.96 \times 0.0653 = 0.8333 \pm 0.128 \]

Sehingga, estimasi interval \(95\%\) untuk proporsi kesehatan baik pada kelompok yang rutin berolahraga adalah \((0.7053, 0.9613)\).

Dengan demikian, kita dapat mengatakan dengan tingkat kepercayaan 95% bahwa proporsi individu dengan kesehatan baik dalam kelompok yang rutin berolahraga berada di antara 0.7053 dan 0.9613.

Implementasi dalam R

Berikut adalah syntax R untuk menghitung estimasi titik dan interval untuk proporsi kesehatan baik pada kelompok “Rutin”:

# Data Observasi
n_rutin <- 180
x_rutin <- 150

# Estimasi Titik (Proporisi)
hat_p_rutin <- x_rutin / n_rutin

# Estimasi Interval (95% Confidence Interval)
Z_alpha_2 <- 1.96
SE_rutin <- sqrt((hat_p_rutin * (1 - hat_p_rutin)) / n_rutin)
margin_of_error <- Z_alpha_2 * SE_rutin
CI_lower <- hat_p_rutin - margin_of_error
CI_upper <- hat_p_rutin + margin_of_error

# Menampilkan Hasil
cat("Estimasi Titik: ", hat_p_rutin, "\n")
## Estimasi Titik:  0.8333333
cat("Estimasi Interval (95% CI): (", CI_lower, ",", CI_upper, ")\n")
## Estimasi Interval (95% CI): ( 0.7788889 , 0.8877778 )

Uji Proporsi

Pada bab ini, kita akan membahas uji proporsi untuk menguji apakah ada perbedaan signifikan antara dua kelompok: kelompok yang rutin berolahraga dan kelompok yang tidak rutin berolahraga.

Uji Hipotesis

Hipotesis dalam uji proporsi terdiri dari dua jenis:

- Hipotesis nol (H0): Tidak ada perbedaan proporsi antara dua kelompok yang diuji (proporsi kesehatan baik pada kelompok Rutin dan Tidak Rutin adalah sama).

- Hipotesis alternatif (H1): Ada perbedaan proporsi antara dua kelompok yang diuji (proporsi kesehatan baik pada kelompok Rutin dan Tidak Rutin berbeda).

Formulasi hipotesis untuk uji proporsi ini adalah: - \(H_0: P_1 = P_2\) (Tidak ada perbedaan proporsi kesehatan baik antara kelompok Rutin dan Tidak Rutin) - \(H_1: P_1 \neq P_2\) (Ada perbedaan proporsi kesehatan baik antara kelompok Rutin dan Tidak Rutin)

Dimana \(P_1\) dan \(P_2\) adalah proporsi individu dengan kesehatan baik pada masing-masing kelompok.

Statistik Uji

Statistik uji untuk uji proporsi dihitung menggunakan rumus Z sebagai berikut:

\[ Z = \frac{\hat{p_1} - \hat{p_2}}{\sqrt{\hat{p}(1 - \hat{p}) \left( \frac{1}{n_1} + \frac{1}{n_2} \right)}} \]

Dimana:

- \(\hat{p_1}\) adalah proporsi kejadian pada kelompok pertama (kelompok Rutin).

- \(\hat{p_2}\) adalah proporsi kejadian pada kelompok kedua (kelompok Tidak Rutin).

- \(\hat{p}\) adalah proporsi gabungan kejadian dari kedua kelompok, yang dihitung sebagai:

\[ \hat{p} = \frac{x_1 + x_2}{n_1 + n_2} \]

  • \(x_1 = 150\) dan \(x_2 = 100\) adalah jumlah kejadian kesehatan baik pada masing-masing kelompok.
  • \(n_1 = 180\) dan \(n_2 = 160\) adalah ukuran sampel masing-masing kelompok (Rutin dan Tidak Rutin).
Perhitungan Statistik Uji Z

Dengan data berikut: - \(x_1 = 150\), \(x_2 = 100\) (jumlah individu dengan kesehatan baik pada masing-masing kelompok) - \(n_1 = 180\), \(n_2 = 160\) (jumlah sampel untuk masing-masing kelompok)

Langkah-langkah perhitungan:

  1. Menghitung Proporsi Kejadian:
    • \(\hat{p_1} = \frac{150}{180} = 0.8333\) (Proporsi kesehatan baik pada kelompok Rutin)
    • \(\hat{p_2} = \frac{100}{160} = 0.6250\) (Proporsi kesehatan baik pada kelompok Tidak Rutin)
  2. Menghitung Proporsi Gabungan:
    • \(\hat{p} = \frac{150 + 100}{180 + 160} = \frac{250}{340} = 0.7353\)
  3. Menghitung Statistik Uji Z:
    • \(Z = \frac{0.8333 - 0.6250}{\sqrt{0.7353(1 - 0.7353) \left( \frac{1}{180} + \frac{1}{160} \right)}}\)
    • \(Z = \frac{0.2083}{\sqrt{0.7353(0.2647) \left( 0.00556 + 0.00625 \right)}}\)
    • \(Z = \frac{0.2083}{\sqrt{0.1944(0.01181)}}\)
    • \(Z = \frac{0.2083}{\sqrt{0.002295}}\)
    • \(Z = \frac{0.2083}{0.0479} = 4.3561\)
Menghitung Nilai P

Nilai p dihitung dengan menggunakan distribusi normal standar untuk uji dua sisi:

- Nilai p \(= 2 \times (1 - pnorm(4.3561))\)

- Nilai p \(\approx 0.0000\)

Keputusan

Dengan nilai p \(0.0000\), yang lebih kecil dari tingkat signifikansi \(\alpha = 0.05\), kita menolak hipotesis nol dan menerima hipotesis alternatif. Ini berarti bahwa ada perbedaan proporsi kesehatan baik yang signifikan antara kelompok Rutin dan Tidak Rutin.

Implementasi di R
# Data Observasi
data <- matrix(c(150, 30, 100, 60), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Pola Olahraga" = c("Rutin", "Tidak Rutin"), "Kesehatan" = c("Baik", "Buruk"))
print(data)
##              Kesehatan
## Pola Olahraga Baik Buruk
##   Rutin        150    30
##   Tidak Rutin  100    60
# Uji Proporsi
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 = 17.834, df = 1, p-value = 2.411e-05
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  0.1097417 0.3069250
## sample estimates:
##    prop 1    prop 2 
## 0.8333333 0.6250000

Uji Asosiasi

Uji asosiasi pada tabel kontingensi 2 × 2 digunakan untuk menilai apakah terdapat hubungan antara dua variabel kategori. Dalam studi ini, kita akan menilai hubungan antara Pola Olahraga dan Status Kesehatan.


Risk Difference (RD)

Rumus: \[ RD = \left( \frac{n_{11}}{n_{1.}} \right) - \left( \frac{n_{21}}{n_{2.}} \right) \]

\[ SE(RD) = \sqrt{ \frac{p_1(1 - p_1)}{n_{1.}} + \frac{p_2(1 - p_2)}{n_{2.}} } \quad ; \quad Z_{RD} = \frac{RD}{SE(RD)} \]

Perhitungan:

  • \(\hat{p}_1 = \frac{150}{180} = 0.8333\)
  • \(\hat{p}_2 = \frac{100}{160} = 0.625\)
  • \(RD = 0.8333 - 0.625 = \boxed{0.2083}\)

\[ SE(RD) = \sqrt{ \frac{0.8333 \cdot 0.1667}{180} + \frac{0.625 \cdot 0.375}{160} } = \sqrt{0.002237} = \boxed{0.0473} \]

\[ Z_{RD} = \frac{0.2083}{0.0473} = \boxed{4.40} \]

Interpretasi:

Terdapat perbedaan absolut sebesar 20.83% dalam proporsi individu dengan kesehatan baik antara kelompok yang berolahraga rutin dan tidak rutin. Nilai Z_RD = 4.40 menunjukkan bahwa perbedaan ini signifikan secara statistik.


Relative Risk (RR)

Rumus: \[ RR = \frac{ \frac{n_{11}}{n_{1.}} }{ \frac{n_{21}}{n_{2.}} } \quad ; \quad SE(\ln RR) = \sqrt{ \frac{1}{n_{11}} - \frac{1}{n_{1.}} + \frac{1}{n_{21}} - \frac{1}{n_{2.}} } \quad ; \quad Z_{RR} = \frac{\ln RR}{SE(\ln RR)} \]

Perhitungan:

  • \(RR = \frac{0.8333}{0.625} = \boxed{1.3333}\)

\[ SE(\ln RR) = \sqrt{ \frac{1}{150} - \frac{1}{180} + \frac{1}{100} - \frac{1}{160} } = \sqrt{0.00486} = \boxed{0.0697} \]

\[ Z_{RR} = \frac{\ln(1.3333)}{0.0697} = \boxed{4.13} \]

Interpretasi:

Individu yang berolahraga secara rutin memiliki kemungkinan 1.33 kali lebih besar untuk memiliki kesehatan baik dibandingkan mereka yang tidak berolahraga rutin. Nilai Z yang tinggi menunjukkan bahwa perbedaan ini signifikan.


Odds Ratio (OR)

Rumus: \[ OR = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}} \quad ; \quad SE(\ln OR) = \sqrt{ \frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}} } \quad ; \quad Z_{OR} = \frac{\ln OR}{SE(\ln OR)} \]

Perhitungan:

  • \(OR = \frac{150 \cdot 60}{30 \cdot 100} = \boxed{3}\)

\[ SE(\ln OR) = \sqrt{ \frac{1}{150} + \frac{1}{30} + \frac{1}{100} + \frac{1}{60} } = \sqrt{0.0667} = \boxed{0.2582} \]

\[ Z_{OR} = \frac{\ln(3)}{0.2582} = \boxed{4.25} \]

Interpretasi:

Peluang individu yang berolahraga rutin untuk memiliki kesehatan baik adalah 3 kali lebih besar dibandingkan dengan individu yang tidak berolahraga rutin. Nilai Z menunjukkan bahwa hubungan ini sangat signifikan.


Implementasi dalam R

# Input data
n11 <- 150; n12 <- 30
n21 <- 100; n22 <- 60
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 <- p1 / p2
SE_lnRR <- sqrt((1/n11) - (1/n1.) + (1/n21) - (1/n2.))
Z_RR <- log(RR) / SE_lnRR

# Odds Ratio
OR <- (n11 * n22) / (n12 * n21)
SE_lnOR <- sqrt((1/n11) + (1/n12) + (1/n21) + (1/n22))
Z_OR <- log(OR) / SE_lnOR

# Output
cat("Risk Difference:", RD, "Z =", Z_RD, "\n")
## Risk Difference: 0.2083333 Z = 4.405339
cat("Relative Risk:", RR, "Z =", Z_RR, "\n")
## Relative Risk: 1.333333 Z = 4.12615
cat("Odds Ratio:", OR, "Z =", Z_OR, "\n")
## Odds Ratio: 3 Z = 4.254907

Uji Independensi

Uji Chi-Square

Uji Chi-Square bertujuan untuk menguji apakah dua variabel kategorik bersifat independen atau saling berhubungan. Dalam konteks ini, kita menguji apakah pola olahraga dan status kesehatan saling bebas secara statistik.

Rumus:

\[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]

Dimana: - \(O_{ij}\): Observasi aktual pada sel ke-\(ij\) - \(E_{ij}\): Nilai harapan (ekspektasi) pada sel ke-\(ij\), dihitung dengan:

\[ E_{ij} = \frac{(n_{i.} \times n_{.j})}{n} \]


Perhitungan Manual:

Langkah 1: Hitung nilai harapan

  • \(E_{11} = \frac{180 \times 250}{340} = 132.35\)
  • \(E_{12} = \frac{180 \times 90}{340} = 47.65\)
  • \(E_{21} = \frac{160 \times 250}{340} = 117.65\)
  • \(E_{22} = \frac{160 \times 90}{340} = 42.35\)

Langkah 2: Hitung nilai Chi-Square

\[ \chi^2 = \frac{(150 - 132.35)^2}{132.35} + \frac{(30 - 47.65)^2}{47.65} + \frac{(100 - 117.65)^2}{117.65} + \frac{(60 - 42.35)^2}{42.35} \]

\[ = \frac{17.65^2}{132.35} + \frac{17.65^2}{47.65} + \frac{17.65^2}{117.65} + \frac{17.65^2}{42.35} \]

\[ = 2.35 + 6.53 + 2.65 + 7.35 = \boxed{18.88} \]

Langkah 3: Nilai Kritis

Derajat kebebasan: \(df = (r-1)(c-1) = (2-1)(2-1) = 1\)
Nilai kritis \(\chi^2\) pada \(\alpha = 0.05\) dan \(df = 1\) adalah 3.841


Interpretasi: Karena \(\chi^2_{hitung} = 18.88 > 3.841\), maka:

Tolak H₀ → Terdapat hubungan yang signifikan antara pola olahraga dan status kesehatan.


Implementasi dalam R:


Kesimpulan: Berdasarkan perhitungan manual dan pengujian melalui R, diperoleh nilai \(\chi^2\) sebesar 18.88 dengan p-value < 0.001. Oleh karena itu, dapat disimpulkan bahwa terdapat hubungan yang signifikan antara pola olahraga dan status kesehatan.

library(ggplot2)
proporsi <- data.frame(
  Kelompok = c("Rutin", "Tidak Rutin"),
  Proporsi = c(150/180, 100/160),
  SE = c(sqrt((150/180 * (1 - 150/180))/180), sqrt((100/160 * (1 - 100/160))/160))
)
ggplot(proporsi, aes(x = Kelompok, y = Proporsi, fill = Kelompok)) +
  geom_bar(stat = "identity", position = "dodge", alpha = 0.8) +
  geom_errorbar(aes(ymin = Proporsi - 1.96 * SE, ymax = Proporsi + 1.96 * SE), 
                width = 0.2, linewidth = 0.8) +
  scale_fill_manual(values = c("Rutin" = "skyblue", "Tidak Rutin" = "salmon")) +
  labs(title = "Perbandingan Proporsi Kesehatan Baik",
       x = "Pola Olahraga", y = "Proporsi Kesehatan Baik") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"),
        legend.position = "none")

Partisi Chi-Square

Partisi Chi-Square digunakan untuk mengetahui kontribusi masing-masing sel terhadap total nilai \(\chi^2\). Hal ini bermanfaat untuk mengidentifikasi kombinasi kategori yang memberikan pengaruh paling besar terhadap adanya hubungan antar variabel.

Nilai Harapan (E):

  • \(E_{11} = \frac{180 \times 250}{340} = 132.35\)
  • \(E_{12} = \frac{180 \times 90}{340} = 47.65\)
  • \(E_{21} = \frac{160 \times 250}{340} = 117.65\)
  • \(E_{22} = \frac{160 \times 90}{340} = 42.35\)

Perhitungan Kontribusi Tiap Sel:

\[ \chi^2_{ij} = \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]

  • \(\chi^2_{11} = \frac{(150 - 132.35)^2}{132.35} = \frac{312.3}{132.35} = 2.36\)
  • \(\chi^2_{12} = \frac{(30 - 47.65)^2}{47.65} = \frac{312.3}{47.65} = 6.55\)
  • \(\chi^2_{21} = \frac{(100 - 117.65)^2}{117.65} = \frac{312.3}{117.65} = 2.65\)
  • \(\chi^2_{22} = \frac{(60 - 42.35)^2}{42.35} = \frac{312.3}{42.35} = 7.37\)

Total \(\chi^2\)

\[ \chi^2_{total} = 2.36 + 6.55 + 2.65 + 7.37 = \boxed{18.93} \]

Catatan: Hasil pembulatan dapat berbeda sedikit dari 18.88 karena pendekatan desimal.

Interpretasi

Sel dengan kontribusi tertinggi adalah: - \(\chi^2_{22} = 7.37\), yaitu kategori Tidak Rutin - Kesehatan Buruk - Diikuti oleh \(\chi^2_{12} = 6.55\), yaitu Rutin - Kesehatan Buruk

Artinya, kategori individu yang tidak rutin berolahraga namun memiliki kesehatan buruk, serta individu yang rutin berolahraga namun tidak sehat, merupakan penyumbang deviasi terbesar terhadap ketidaksesuaian dengan asumsi independensi.


Implementasi dalam R:

# Input data
observed <- matrix(c(150, 30, 100, 60), nrow = 2, byrow = TRUE)
colnames(observed) <- c("Kesehatan Baik", "Kesehatan Buruk")
rownames(observed) <- c("Rutin", "Tidak Rutin")

# Uji Chi-Square
chisq_test <- chisq.test(observed, correct = FALSE)
expected <- chisq_test$expected

# Kontribusi tiap sel terhadap nilai chi-square
partisi <- (observed - expected)^2 / expected
partisi
sum(partisi) # verifikasi total chi-square

Kesimpulan:

Partisi Chi-Square memberikan informasi lebih rinci mengenai kontribusi masing-masing sel terhadap ketidaksesuaian model independensi. Kategori Tidak Rutin - Kesehatan Buruk memberikan kontribusi tertinggi terhadap nilai \(\chi^2\), yang mendukung hasil sebelumnya bahwa terdapat hubungan signifikan antara pola olahraga dan status kesehatan.

Uji Likelihood Ratio (G²)

Uji Likelihood Ratio (G²) merupakan alternatif dari uji Chi-Square yang digunakan untuk menguji hipotesis independensi pada tabel kontingensi. G² lebih sensitif pada perbedaan kecil antara nilai observasi dan harapan.

Rumus: \[ G^2 = 2 \sum O_{ij} \ln \left(\frac{O_{ij}}{E_{ij}} \right) \]

Dimana:

- \(O_{ij}\): Observasi aktual pada sel ke-\(ij\)

- \(E_{ij}\): Nilai harapan pada sel ke-\(ij\)

Nilai Harapan (E):

  • \(E_{11} = \frac{180 \times 250}{340} = 132.35\)
  • \(E_{12} = \frac{180 \times 90}{340} = 47.65\)
  • \(E_{21} = \frac{160 \times 250}{340} = 117.65\)
  • \(E_{22} = \frac{160 \times 90}{340} = 42.35\)

Perhitungan Manual:

\[ G^2 = 2 \times \left[ (150 \times \ln(150 / 132.35)) + (30 \times \ln(30 / 47.65)) + (100 \times \ln(100 / 117.65)) + (60 \times \ln(60 / 42.35)) \right] \]

\[ = 2 \times [(150 \times 0.1254) + (30 \times -0.4767) + (100 \times -0.1614) + (60 \times 0.3365)] \]

\[ = 2 \times [18.81 - 14.30 - 16.14 + 20.19] = 2 \times 8.56 = \boxed{17.12} \]

Derajat Kebebasan: \[ df = (r - 1)(c - 1) = (2 - 1)(2 - 1) = 1 \]

Nilai kritis \(G^2\) pada taraf signifikansi 0.05 dan df = 1 adalah 3.841.


Interpretasi :

Karena \(G^2 = 17.12 > 3.841\), maka tolak H₀. Artinya, terdapat hubungan signifikan antara pola olahraga dan status kesehatan.


Implementasi dalam R:

# Data observasi
observed <- matrix(c(150, 30, 100, 60), nrow = 2, byrow = TRUE)
colnames(observed) <- c("Kesehatan Baik", "Kesehatan Buruk")
rownames(observed) <- c("Rutin", "Tidak Rutin")

# Hitung nilai ekspektasi dari uji chi-square
expected <- chisq.test(observed, correct = FALSE)$expected

# Hitung G^2 secara manual
G2 <- 2 * sum(observed * log(observed / expected))
G2

Kesimpulan Nilai G² sebesar 17.12 menunjukkan adanya ketidaksesuaian signifikan antara nilai observasi dan ekspektasi di bawah asumsi independensi. Hal ini menguatkan hasil uji Chi-Square sebelumnya, yaitu bahwa pola olahraga dan status kesehatan tidak bersifat independen.

Uji Exact Fisher

Uji Exact Fisher digunakan untuk menguji independensi dua variabel kategorik dalam tabel kontingensi 2x2, terutama jika ukuran sampel kecil. Uji ini menggunakan distribusi hipergeometrik untuk menghitung probabilitas semua kemungkinan tabel yang memiliki margin sama dengan tabel observasi.

Rumus Fisher Exact (distribusi hipergeometrik): \[ P = \frac{{\binom{a+b}{a} \cdot \binom{c+d}{c}}}{\binom{n}{a+c}} \] Dimana: - \(a = 150\), \(b = 30\), \(c = 100\), \(d = 60\) - \(n = 340\) = jumlah total


6.2.3.4.1 Distribusi Hipergeometrik

Distribusi hipergeometrik digunakan untuk menghitung probabilitas mendapatkan sejumlah keberhasilan tertentu dalam sampel tanpa pengembalian dari populasi terbatas.

Rumus: \[ P(X = x) = \frac{\binom{K}{x} \binom{N-K}{n-x}}{\binom{N}{n}} \]

Dalam konteks uji Fisher: - \(K =\) total “sukses” dalam populasi = 250 (kesehatan baik) - \(N =\) total populasi = 340 - \(n =\) ukuran baris (misal: 180 untuk “rutin”) - \(x =\) jumlah keberhasilan dalam baris = 150


6.2.3.4.2 Contoh Perhitungan Manual

Langkah-langkah:

Hitung nilai peluang dengan distribusi hipergeometrik:

\[ P = \frac{\binom{250}{150} \cdot \binom{90}{30}}{\binom{340}{180}} \]

  1. Hitung nilai kombinasi:
  • \(\binom{250}{150} \approx 2.13 \times 10^{72}\)
  • \(\binom{90}{30} \approx 1.37 \times 10^{25}\)
  • \(\binom{340}{180} \approx 1.24 \times 10^{98}\)
  1. Masukkan ke rumus: \[ P = \frac{(2.13 \times 10^{72}) \cdot (1.37 \times 10^{25})}{1.24 \times 10^{98}} = \frac{2.92 \times 10^{97}}{1.24 \times 10^{98}} \approx 0.0236 \]

Nilai probabilitas \(P \approx 0.0236\) (hasil pendekatan manual menggunakan bilangan kombinasi besar)


Implementasi dalam R:

# Matriks data
observed <- matrix(c(150, 30, 100, 60), nrow = 2, byrow = TRUE)
colnames(observed) <- c("Kesehatan Baik", "Kesehatan Buruk")
rownames(observed) <- c("Rutin", "Tidak Rutin")

# Uji Fisher Exact
fisher_test <- fisher.test(observed)
fisher_test

Output R: Hasil menunjukkan p-value sangat kecil:

Fisher's Exact Test for Count Data

p-value = 2.359e-05
alternative hypothesis: true odds ratio is not equal to 1

Kesimpulan Perhitungan manual berdasarkan rumus distribusi hipergeometrik menunjukkan nilai \(P \approx 0.0236\), sedangkan implementasi di R menunjukkan p-value yang lebih akurat, yaitu 2.359e-05. Keduanya menunjukkan bahwa pola olahraga dan status kesehatan tidak bersifat independen. Hasil ini konsisten dengan uji Chi-Square dan G² sebelumnya.

Analisis Residual dalam Tabel Kontingensi

Analisis residual dalam tabel kontingensi digunakan untuk mengidentifikasi sel-sel yang paling berkontribusi terhadap adanya hubungan antara dua variabel kategori. Residual dihitung sebagai selisih antara frekuensi aktual (observasi) dan frekuensi yang diperkirakan (ekspektasi) berdasarkan asumsi bahwa variabel-variabel tersebut tidak saling berkaitan (independen).

Semakin besar nilai residual (baik positif maupun negatif), semakin besar pula deviasi antara data observasi dengan model independen. Sebaliknya, nilai residual yang mendekati nol menunjukkan bahwa data observasi cukup konsisten dengan model independen.

Interpretasi Residual:

  • Residual ≈ 0: Tidak ada perbedaan berarti antara nilai aktual dan nilai yang diprediksi oleh model → mengindikasikan bahwa kedua variabel cenderung tidak memiliki keterkaitan yang signifikan.
  • Residual positif besar: Frekuensi aktual jauh lebih tinggi dari ekspektasi → menunjukkan adanya keterkaitan positif antara dua kategori dalam sel tersebut.
  • Residual negatif besar: Frekuensi aktual jauh lebih rendah dari ekspektasi → mengindikasikan adanya ketidaksesuaian atau hubungan negatif.
  • Residual kecil (positif atau negatif): Variabel-variabel dalam tabel tidak menunjukkan pola hubungan yang jelas atau signifikan.

Kesimpulan:

Jika residual-residual yang dihasilkan mendekati nol, maka data mendukung asumsi bahwa tidak terdapat hubungan antara variabel kategori. Namun, jika terdapat residual yang besar, baik positif maupun negatif, maka dapat disimpulkan bahwa terdapat kontribusi signifikan dari sel tersebut terhadap ketidaksesuaian model independensi.


Jenis Residual

Pengertian Residual

Residual adalah selisih antara nilai yang diamati (observed) dan nilai yang diperkirakan (expected). Dalam analisis data kontingensi, ada dua jenis residual yang digunakan untuk mengukur deviasi antara nilai yang diamati dan yang diperkirakan:

1. Pearson Residual: Mengukur deviasi antara nilai observasi dan yang diperkirakan.

2. Standardized Residual: Versi standar dari Pearson Residual yang mempertimbangkan ukuran variabilitas dari masing-masing kategori.


1. Pearson Residual

Pearson Residual (\(e_{ij}\)) dihitung menggunakan rumus:

\[ e_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]

Di mana:

- \(O_{ij}\) adalah nilai observasi pada sel ke-ij.

- \(E_{ij}\) adalah nilai yang diharapkan pada sel ke-ij, dihitung berdasarkan distribusi marginal.

Langkah-langkah Perhitungan Pearson Residual

Misalkan kita memiliki tabel kontingensi berikut yang menggambarkan hubungan antara pola olahraga dan kesehatan:

Pola Olahraga Kesehatan Baik Kesehatan Buruk Total
Rutin 150 30 180
Tidak Rutin 100 60 160
Total 250 90 340

Langkah 1: Hitung Frekuensi yang Diharapkan

Frekuensi yang diharapkan (\(E_{ij}\)) dihitung dengan rumus:

\[ E_{ij} = \frac{\text{Total Baris} \times \text{Total Kolom}}{\text{Total Keseluruhan}} \]

  • Untuk sel Rutin - Kesehatan Baik:

\[ E_{11} = \frac{180 \times 250}{340} = 132.35 \]

  • Untuk sel Rutin - Kesehatan Buruk:

\[ E_{12} = \frac{180 \times 90}{340} = 47.65 \]

  • Untuk sel Tidak Rutin - Kesehatan Baik:

\[ E_{21} = \frac{160 \times 250}{340} = 117.65 \]

  • Untuk sel Tidak Rutin - Kesehatan Buruk:

\[ E_{22} = \frac{160 \times 90}{340} = 42.35 \]

Langkah 2: Hitung Pearson Residual

Sekarang menghitung Pearson Residual untuk setiap sel berdasarkan rumus:

\[ e_{11} = \frac{150 - 132.35}{\sqrt{132.35}} = 1.54 \]

\[ e_{12} = \frac{30 - 47.65}{\sqrt{47.65}} = -2.56 \]

\[ e_{21} = \frac{100 - 117.65}{\sqrt{117.65}} = -1.63 \]

\[ e_{22} = \frac{60 - 42.35}{\sqrt{42.35}} = 2.71 \]

library(vcd)
## Warning: package 'vcd' was built under R version 4.3.3
## Loading required package: grid
data <- matrix(c(150, 30, 100, 60), nrow = 2, byrow = TRUE)
colnames(data) <- c("Kesehatan Baik", "Kesehatan Buruk")
rownames(data) <- c("Rutin", "Tidak Rutin")
mosaic(data, shade = TRUE, legend = TRUE, main = "Mosaic Plot Tabel Kontingensi")


2. Standardized Residual (Residual Terstandarisasi)

Standardized Residual (\(r_{ij}\)) dihitung dengan rumus:

\[ r_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}} \cdot \sqrt{(1 - p_i)(1 - p_j)}} \]

Di mana:

- \(p_i\) adalah probabilitas marginal baris (yaitu \(\frac{\text{Total Baris}}{\text{Total Keseluruhan}}\)).

- \(p_j\) adalah probabilitas marginal kolom (yaitu \(\frac{\text{Total Kolom}}{\text{Total Keseluruhan}}\)).


Langkah-langkah Perhitungan Standardized Residual

Langkah 1: Hitung Probabilitas Marginal

  • Untuk baris pertama (Rutin):

\[ p_1 = \frac{180}{340} = 0.529 \]

  • Untuk kolom pertama (Kesehatan Baik):

\[ p_1 = \frac{250}{340} = 0.735 \]

Langkah 2: Hitung Standardized Residual

Sekarang menghitung Standardized Residual untuk setiap sel berdasarkan rumus:

\[ r_{11} = \frac{150 - 132.35}{\sqrt{132.35} \cdot \sqrt{(1 - 0.529)(1 - 0.735)}} = 1.54 \]

\[ r_{12} = \frac{30 - 47.65}{\sqrt{47.65} \cdot \sqrt{(1 - 0.529)(1 - 0.265)}} = -2.56 \]

\[ r_{21} = \frac{100 - 117.65}{\sqrt{117.65} \cdot \sqrt{(1 - 0.529)(1 - 0.265)}} = -1.63 \]

\[ r_{22} = \frac{60 - 42.35}{\sqrt{42.35} \cdot \sqrt{(1 - 0.529)(1 - 0.735)}} = 2.71 \]


Implementasi dalam R

Berikut adalah kode dalam R untuk menghitung Pearson dan Standardized Residual berdasarkan data yang telah diberikan:

# Data Observasi
observed <- matrix(c(150, 30, 100, 60), nrow = 2, byrow = TRUE)

# Hitung nilai ekspektasi menggunakan chi-squared test
expected <- chisq.test(observed)$expected

# Pearson Residual
pearson_residual <- (observed - expected) / sqrt(expected)

# Standardized Residual
row_sum <- rowSums(observed)
col_sum <- colSums(observed)
total_sum <- sum(observed)
standardized_residual <- (observed - expected) / sqrt(expected * (1 - row_sum / total_sum) * (1 - col_sum / total_sum))

# Menampilkan hasil
list(Pearson_Residual = pearson_residual, Standardized_Residual = standardized_residual)
## $Pearson_Residual
##           [,1]      [,2]
## [1,]  1.533930 -2.556550
## [2,] -1.626978  2.711631
## 
## $Standardized_Residual
##           [,1]      [,2]
## [1,]  4.346135 -7.243558
## [2,] -2.607681  4.346135

Deteksi Outlier dalam Analisis Data Kategori Menggunakan Residual

Apa Itu Outlier dalam Tabel Kontingensi?

Outlier dalam analisis data kategori adalah sel dalam tabel kontingensi yang memiliki nilai residual yang sangat besar, baik itu positif maupun negatif. Outlier mengindikasikan adanya kategori yang memiliki frekuensi observasi yang sangat tinggi atau sangat rendah jika dibandingkan dengan nilai yang diperkirakan berdasarkan asumsi independensi.


Menggunakan Residual untuk Mendeteksi Outlier

Pearson Residual

Pearson residual \(e_{ij}\) dihitung dengan rumus berikut:

\[ e_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]

Jika nilai \(|e_{ij}| > 2\), maka nilai tersebut dianggap sebagai indikasi adanya outlier.

Standardized Residual (Residual Terstandarisasi)

Residual terstandarisasi \(r_{ij}\) dihitung dengan rumus:

\[ r_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}} \cdot \sqrt{(1 - p_i)(1 - p_j)}} \]

Jika \(|r_{ij}| > 3\), maka residual tersebut dianggap sebagai outlier signifikan.


eteksi Outlier dalam Tabel Kontingensi

Misalkan kita memiliki tabel kontingensi berikut yang menunjukkan hubungan antara Pola Olahraga dan Kesehatan Jantung.

Tabel Data yang Benar:

Pola Olahraga Kesehatan Baik Kesehatan Buruk Total
Rutin 150 30 180
Tidak Rutin 100 60 160
Total 250 90 340

Langkah 1: Hitung Frekuensi yang Diharapkan

Frekuensi yang diharapkan \(E_{ij}\) dihitung menggunakan rumus:

\[ E_{ij} = \frac{\text{Total Baris} \times \text{Total Kolom}}{\text{Total Keseluruhan}} \]

Perhitungan Frekuensi yang Diharapkan:

  • Untuk sel Rutin - Kesehatan Baik:

\[ E_{11} = \frac{180 \times 250}{340} = 132.35 \]

  • Untuk sel Rutin - Kesehatan Buruk:

\[ E_{12} = \frac{180 \times 90}{340} = 47.65 \]

  • Untuk sel Tidak Rutin - Kesehatan Baik:

\[ E_{21} = \frac{160 \times 250}{340} = 117.65 \]

  • Untuk sel Tidak Rutin - Kesehatan Buruk:

\[ E_{22} = \frac{160 \times 90}{340} = 42.35 \]


Langkah 2: Hitung Pearson Residual

Sekarang kita dapat menghitung Pearson Residual untuk setiap sel. Residual Pearson (\(e_{ij}\)) dihitung dengan rumus:

\[ e_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]

  • Untuk sel Rutin - Kesehatan Baik:

\[ e_{11} = \frac{150 - 132.35}{\sqrt{132.35}} = 1.54 \]

  • Untuk sel Rutin - Kesehatan Buruk:

\[ e_{12} = \frac{30 - 47.65}{\sqrt{47.65}} = -2.56 \]

  • Untuk sel Tidak Rutin - Kesehatan Baik:

\[ e_{21} = \frac{100 - 117.65}{\sqrt{117.65}} = -1.63 \]

  • Untuk sel Tidak Rutin - Kesehatan Buruk:

\[ e_{22} = \frac{60 - 42.35}{\sqrt{42.35}} = 2.71 \]


Langkah 3: Hitung Standardized Residual

Standardized Residual (\(r_{ij}\)) dihitung dengan rumus:

\[ r_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}} \cdot \sqrt{(1 - p_i)(1 - p_j)}} \]

Di mana: - \(p_i\) adalah probabilitas marginal baris (yaitu \(\frac{\text{Total Baris}}{\text{Total Keseluruhan}}\)). - \(p_j\) adalah probabilitas marginal kolom (yaitu \(\frac{\text{Total Kolom}}{\text{Total Keseluruhan}}\)).

Perhitungan Probabilitas Marginal:

  • Untuk baris pertama (Rutin):

\[ p_1 = \frac{180}{340} = 0.529 \]

  • Untuk kolom pertama (Kesehatan Baik):

\[ p_1 = \frac{250}{340} = 0.735 \]

Perhitungan Standardized Residual:

Sekarang kita dapat menghitung Standardized Residual untuk setiap sel berdasarkan rumus di atas.

  • Untuk sel Rutin - Kesehatan Baik:

\[ r_{11} = \frac{150 - 132.35}{\sqrt{132.35} \cdot \sqrt{(1 - 0.529)(1 - 0.735)}} = 1.54 \]

  • Untuk sel Rutin - Kesehatan Buruk:

\[ r_{12} = \frac{30 - 47.65}{\sqrt{47.65} \cdot \sqrt{(1 - 0.529)(1 - 0.265)}} = -2.56 \]

  • Untuk sel Tidak Rutin - Kesehatan Baik:

\[ r_{21} = \frac{100 - 117.65}{\sqrt{117.65} \cdot \sqrt{(1 - 0.529)(1 - 0.735)}} = -1.63 \]

  • Untuk sel Tidak Rutin - Kesehatan Buruk:

\[ r_{22} = \frac{60 - 42.35}{\sqrt{42.35} \cdot \sqrt{(1 - 0.529)(1 - 0.735)}} = 2.71 \]


Langkah 4: Menilai Outlier

  • Grup Rutin - Kesehatan Baik memiliki Pearson Residual 1.54, yang tidak melebihi 2, sehingga tidak dianggap sebagai outlier.
  • Grup Rutin - Kesehatan Buruk memiliki Pearson Residual -2.56, yang lebih kecil dari -2, menunjukkan bahwa ini adalah outlier.
  • Grup Tidak Rutin - Kesehatan Baik memiliki Pearson Residual -1.63, yang tidak melebihi 2 atau -2, sehingga ini bukan outlier.
  • Grup Tidak Rutin - Kesehatan Buruk memiliki Pearson Residual 2.71, yang lebih besar dari 2, menunjukkan bahwa ini adalah outlier.

Implementasi dalam R

# Data Observasi
observed <- matrix(c(150, 30, 100, 60), nrow = 2, byrow = TRUE)
colnames(observed) <- c("Kesehatan Baik", "Kesehatan Buruk")
rownames(observed) <- c("Rutin", "Tidak Rutin")

# Hitung nilai ekspektasi (Expected Frequency)
expected <- chisq.test(observed)$expected

# Pearson Residual
pearson_residual <- (observed - expected) / sqrt(expected)

# Standardized Residual
# Menghitung probabilitas marginal baris dan kolom
row_sum <- rowSums(observed)
col_sum <- colSums(observed)
total_sum <- sum(observed)

# Menghitung residual terstandarisasi
standardized_residual <- (observed - expected) / sqrt(expected * (1 - row_sum / total_sum) * (1 - col_sum / total_sum))

# Deteksi Outlier
outlier_pearson <- abs(pearson_residual) > 2  # Pearson Residual Outliers
outlier_standardized <- abs(standardized_residual) > 3  # Standardized Residual Outliers

# Menampilkan hasil
results <- list(
  Observed = observed,
  Expected = expected,
  Pearson_Residual = pearson_residual,
  Standardized_Residual = standardized_residual,
  Outlier_Pearson = outlier_pearson,
  Outlier_Standardized = outlier_standardized
)

# Menampilkan hasil
print(results)
## $Observed
##             Kesehatan Baik Kesehatan Buruk
## Rutin                  150              30
## Tidak Rutin            100              60
## 
## $Expected
##             Kesehatan Baik Kesehatan Buruk
## Rutin             132.3529        47.64706
## Tidak Rutin       117.6471        42.35294
## 
## $Pearson_Residual
##             Kesehatan Baik Kesehatan Buruk
## Rutin             1.533930       -2.556550
## Tidak Rutin      -1.626978        2.711631
## 
## $Standardized_Residual
##             Kesehatan Baik Kesehatan Buruk
## Rutin             4.346135       -7.243558
## Tidak Rutin      -2.607681        4.346135
## 
## $Outlier_Pearson
##             Kesehatan Baik Kesehatan Buruk
## Rutin                FALSE            TRUE
## Tidak Rutin          FALSE            TRUE
## 
## $Outlier_Standardized
##             Kesehatan Baik Kesehatan Buruk
## Rutin                 TRUE            TRUE
## Tidak Rutin          FALSE            TRUE

Tabel Kontingensi Tiga Arah

Bab ini membahas analisis tabel kontingensi tiga arah, yang mencakup tabel parsial dan marginal, ukuran asosiasi, Simpson’s Paradox, independensi bersyarat, dan asosiasi hoongan. Tabel kontingensi tiga arah digunakan untuk menganalisis hubungan antara dua variabel kategori secara simultan, dengan mempertimbangkan variabel kontrol yang dapat memengaruhi hubungan tersebut. Dalam hal ini, pola makan (Z) adalah variabel kontrol yang dapat memengaruhi hubungan antara pola olahraga (X) dan kesehatan jantung (Y).

Penjelasan Variabel:

Tabel Kontingensi Tiga Arah

Tabel berikut menggambarkan hubungan antara pola olahraga, pola makan, dan kesehatan jantung:

Pola Olahraga Pola Makan Kesehatan Jantung Baik Kesehatan Jantung Buruk Total
Rutin Sehat 150 30 180
Rutin Tidak Sehat 90 50 140
Tidak Rutin Sehat 100 60 160
Tidak Rutin Tidak Sehat 50 70 120
Total 390 210 600

Tabel Parsial dan Marginal

Langkah 1: Tabel Marginal Tabel marginal adalah tabel yang hanya mempertimbangkan total baris dan kolom tanpa memperhitungkan faktor pengganggu lainnya (yaitu, pola makan dalam hal ini). Tabel ini memberikan gambaran umum hubungan antara pola olahraga dan kesehatan jantung, tanpa mempertimbangkan perbedaan pola makan.

Tabel Marginal:

Pola Olahraga Kesehatan Jantung Baik Kesehatan Jantung Buruk Total
Rutin 240 80 320
Tidak Rutin 150 130 280
Total 390 210 600

Langkah 2: Tabel Parsial Tabel parsial memungkinkan kita untuk memeriksa hubungan antara dua variabel utama sambil mengendalikan efek faktor lain (variabel ketiga). Dalam hal ini, kita ingin melihat hubungan antara pola olahraga dan kesehatan jantung dengan mengendalikan efek pola makan (Z).

Misalnya, kita dapat menghitung tabel parsial berdasarkan kategori pola makan sehat dan tidak sehat untuk melihat hubungan antara pola olahraga dan kesehatan jantung setelah mengendalikan efek pola makan.

Tabel Parsial:

Pola Makan Sehat

Pola Olahraga Kesehatan Jantung Baik Kesehatan Jantung Buruk Total
Rutin 150 30 180
Tidak Rutin 100 60 160
Total 250 90 340

Tabel Parsial:

Pola Makan Tidak Sehat

Pola Olahraga Kesehatan Jantung Baik Kesehatan Jantung Buruk Total
Rutin 90 50 140
Tidak Rutin 50 70 120
Total 140 120 260

Berikut adalah implementasi dalam R untuk menghitung Tabel Parsial dan Tabel Marginal:

# Data Observasi
observed <- matrix(c(150, 30, 90, 50, 100, 60, 50, 70), nrow = 4, byrow = TRUE)
colnames(observed) <- c("Kesehatan Jantung Baik", "Kesehatan Jantung Buruk")
rownames(observed) <- c("Rutin Sehat", "Rutin Tidak Sehat", "Tidak Rutin Sehat", "Tidak Rutin Tidak Sehat")

# Tabel Kontingensi
chisq_test <- chisq.test(observed)
expected <- chisq_test$expected

# Tabel Marginal
freq_marginal <- apply(observed, 2, sum)

# Tabel Parsial berdasarkan Pola Makan Sehat
observed_sehat <- observed[1:2, 1:2]  # Rutin Sehat dan Tidak Rutin Sehat
freq_parsial_sehat <- apply(observed_sehat, 2, sum)

# Tabel Parsial berdasarkan Pola Makan Tidak Sehat
observed_tidak_sehat <- observed[3:4, 1:2]  # Rutin Tidak Sehat dan Tidak Rutin Tidak Sehat
freq_parsial_tidak_sehat <- apply(observed_tidak_sehat, 2, sum)

# Menampilkan hasil
list(
  Observed = observed,
  Expected = expected,
  Tabel_Marginal = freq_marginal,
  Tabel_Parsial_Sehat = freq_parsial_sehat,
  Tabel_Parsial_Tidak_Sehat = freq_parsial_tidak_sehat
)
## $Observed
##                         Kesehatan Jantung Baik Kesehatan Jantung Buruk
## Rutin Sehat                                150                      30
## Rutin Tidak Sehat                           90                      50
## Tidak Rutin Sehat                          100                      60
## Tidak Rutin Tidak Sehat                     50                      70
## 
## $Expected
##                         Kesehatan Jantung Baik Kesehatan Jantung Buruk
## Rutin Sehat                                117                      63
## Rutin Tidak Sehat                           91                      49
## Tidak Rutin Sehat                          104                      56
## Tidak Rutin Tidak Sehat                     78                      42
## 
## $Tabel_Marginal
##  Kesehatan Jantung Baik Kesehatan Jantung Buruk 
##                     390                     210 
## 
## $Tabel_Parsial_Sehat
##  Kesehatan Jantung Baik Kesehatan Jantung Buruk 
##                     240                      80 
## 
## $Tabel_Parsial_Tidak_Sehat
##  Kesehatan Jantung Baik Kesehatan Jantung Buruk 
##                     150                     130

Distribusi Peluang

  1. Peluang Bersama (Joint Probability)

Peluang bersama didefinisikan sebagai:

\[ P(Z, X, Y) = \frac{n_{Z, X, Y}}{N} \]

Dimana:

- \(n_{Z, X, Y}\) adalah jumlah observasi untuk kombinasi tertentu dari tiga variabel kategori,

- \(N\) adalah total keseluruhan observasi.

Perhitungan Manual Semua Peluang Bersama

\[ \begin{aligned} P(\text{Sehat}, \text{Rutin}, \text{Baik}) &= \frac{150}{600} = 0.25 \\ P(\text{Sehat}, \text{Rutin}, \text{Buruk}) &= \frac{30}{600} = 0.05 \\ P(\text{Tidak Sehat}, \text{Rutin}, \text{Baik}) &= \frac{90}{600} = 0.15 \\ P(\text{Tidak Sehat}, \text{Rutin}, \text{Buruk}) &= \frac{50}{600} = 0.0833 \\ P(\text{Sehat}, \text{Tidak Rutin}, \text{Baik}) &= \frac{100}{600} = 0.1667 \\ P(\text{Sehat}, \text{Tidak Rutin}, \text{Buruk}) &= \frac{60}{600} = 0.10 \\ P(\text{Tidak Sehat}, \text{Tidak Rutin}, \text{Baik}) &= \frac{50}{600} = 0.0833 \\ P(\text{Tidak Sehat}, \text{Tidak Rutin}, \text{Buruk}) &= \frac{70}{600} = 0.1167 \end{aligned} \]

Implementasi dalam R

# Data kombinasi kategori
data <- data.frame(
  Olahraga = rep(c("Rutin", "Tidak Rutin"), each = 4),
  Makan = rep(c("Sehat", "Tidak Sehat"), times = 2, each = 2),
  Kesehatan = rep(c("Baik", "Buruk"), times = 4),
  Total = c(150, 30, 90, 50, 100, 60, 50, 70)
)

# Hitung probabilitas bersama
data$P_ZXY <- data$Total / sum(data$Total)

# Tampilkan tabel
knitr::kable(data, digits = 4)
Olahraga Makan Kesehatan Total P_ZXY
Rutin Sehat Baik 150 0.2500
Rutin Sehat Buruk 30 0.0500
Rutin Tidak Sehat Baik 90 0.1500
Rutin Tidak Sehat Buruk 50 0.0833
Tidak Rutin Sehat Baik 100 0.1667
Tidak Rutin Sehat Buruk 60 0.1000
Tidak Rutin Tidak Sehat Baik 50 0.0833
Tidak Rutin Tidak Sehat Buruk 70 0.1167

Tabel Probabilitas Bersama untuk Y (Baik/Buruk):

# Lihat distribusi peluang gabungan berdasarkan kesehatan
table_joint <- xtabs(P_ZXY ~ Olahraga + Makan + Kesehatan, data = data)
ftable(round(table_joint, 4))
##                         Kesehatan   Baik  Buruk
## Olahraga    Makan                              
## Rutin       Sehat                 0.2500 0.0500
##             Tidak Sehat           0.1500 0.0833
## Tidak Rutin Sehat                 0.1667 0.1000
##             Tidak Sehat           0.0833 0.1167

Array 3D Alternatif

# Array 3 dimensi
data3 <- array(c(150, 30, 90, 50, 100, 60, 50, 70),
               dim = c(2, 2, 2),
               dimnames = list(
                 Kesehatan = c("Baik", "Buruk"),
                 Makan = c("Sehat", "Tidak Sehat"),
                 Olahraga = c("Rutin", "Tidak Rutin")
               ))

# Probabilitas bersama
total <- sum(data3)
joint_prob <- round(data3 / total, 4)

ftable(joint_prob)
##                       Olahraga  Rutin Tidak Rutin
## Kesehatan Makan                                  
## Baik      Sehat                0.2500      0.1667
##           Tidak Sehat          0.1500      0.0833
## Buruk     Sehat                0.0500      0.1000
##           Tidak Sehat          0.0833      0.1167

Interpretasi:

  • Peluang bersama tertinggi adalah kombinasi Rutin, Sehat, Baik:
    \[ P(\text{Sehat}, \text{Rutin}, \text{Baik}) = \frac{150}{600} = 0.25 \]

  • Peluang terendah adalah kombinasi Sehat, Rutin, Buruk:
    \[ P(\text{Sehat}, \text{Rutin}, \text{Buruk}) = \frac{30}{600} = 0.05 \]

  1. Peluang Marginal (Marginal Probability)

Peluang marginal diperoleh dengan menjumlahkan probabilitas bersama untuk setiap variabel yang tersisa setelah mengabaikan variabel lain.

Peluang Kesehatan Jantung Baik (Y = Baik)

Untuk menghitung Peluang Marginal Kesehatan Jantung Baik (Y = Baik), kita menjumlahkan probabilitas untuk semua kombinasi Pola Olahraga (X) dan Pola Makan (Z) ketika Kesehatan Jantung adalah Baik (Y = Baik).

\[ P(Y = \text{Baik}) = \sum_{Z, X} P(Z, X, Y = \text{Baik}) = \frac{150 + 90 + 100 + 50}{600} = \frac{390}{600} = 0.65 \]

Peluang Kesehatan Jantung Buruk (Y = Buruk)

Untuk menghitung Peluang Marginal Kesehatan Jantung Buruk (Y = Buruk), kita menjumlahkan probabilitas untuk semua kombinasi Pola Olahraga (X) dan Pola Makan (Z) ketika Kesehatan Jantung adalah Buruk (Y = Buruk).

\[ P(Y = \text{Buruk}) = \sum_{Z, X} P(Z, X, Y = \text{Buruk}) = \frac{30 + 50 + 60 + 70}{600} = \frac{210}{600} = 0.35 \]

Peluang Pola Olahraga Rutin (X = Rutin)

Untuk menghitung Peluang Marginal Pola Olahraga Rutin (X = Rutin), kita menjumlahkan probabilitas untuk semua kombinasi Pola Makan (Z) dan Kesehatan Jantung (Y) ketika Pola Olahraga adalah Rutin:

\[ P(X = \text{Rutin}) = P(\text{Sehat}, \text{Rutin}, \text{Baik}) + P(\text{Sehat}, \text{Rutin}, \text{Buruk}) + P(\text{Tidak Sehat}, \text{Rutin}, \text{Baik}) + P(\text{Tidak Sehat}, \text{Rutin}, \text{Buruk}) \]

Dengan perhitungan manual:

\[ P(X = \text{Rutin}) = \frac{150 + 30 + 90 + 50}{600} = \frac{320}{600} = 0.5333 \]

Peluang Pola Makan Sehat (Z = Sehat)

Untuk menghitung Peluang Marginal Pola Makan Sehat (Z = Sehat), akan dijumlahkan probabilitas untuk semua kombinasi Pola Olahraga (X) dan Kesehatan Jantung (Y) ketika Pola Makan adalah Sehat:

\[ P(Z = \text{Sehat}) = P(\text{Sehat}, \text{Rutin}, \text{Baik}) + P(\text{Sehat}, \text{Rutin}, \text{Buruk}) + P(\text{Sehat}, \text{Tidak Rutin}, \text{Baik}) + P(\text{Sehat}, \text{Tidak Rutin}, \text{Buruk}) \]

Dengan perhitungan manual:

\[ P(Z = \text{Sehat}) = \frac{150 + 30 + 100 + 60}{600} = \frac{340}{600} = 0.5667 \]

Implementasi dalam R

# Data kombinasi kategori
data <- data.frame(
  Olahraga = rep(c("Rutin", "Tidak Rutin"), each = 4),
  Makan = rep(c("Sehat", "Tidak Sehat"), times = 2, each = 2),
  Kesehatan = rep(c("Baik", "Buruk"), times = 4),
  Total = c(150, 30, 90, 50, 100, 60, 50, 70)
)

# Hitung probabilitas bersama
data$P_ZXY <- data$Total / sum(data$Total)

# Tampilkan tabel
knitr::kable(data, digits = 4)
Olahraga Makan Kesehatan Total P_ZXY
Rutin Sehat Baik 150 0.2500
Rutin Sehat Buruk 30 0.0500
Rutin Tidak Sehat Baik 90 0.1500
Rutin Tidak Sehat Buruk 50 0.0833
Tidak Rutin Sehat Baik 100 0.1667
Tidak Rutin Sehat Buruk 60 0.1000
Tidak Rutin Tidak Sehat Baik 50 0.0833
Tidak Rutin Tidak Sehat Buruk 70 0.1167

Perhitungan Peluang Marginal untuk Kesehatan Jantung (Baik dan Buruk)

# Peluang marginal Kesehatan Jantung (Y)
P_Ybaik <- sum(data$Total[data$Kesehatan == "Baik"]) / sum(data$Total)
P_Yburuk <- sum(data$Total[data$Kesehatan == "Buruk"]) / sum(data$Total)

P_Ybaik  # Peluang Kesehatan Jantung Baik
## [1] 0.65
P_Yburuk  # Peluang Kesehatan Jantung Buruk
## [1] 0.35

Tabel Peluang Marginal

Tabel peluang marginal dihitung dengan menjumlahkan probabilitas bersama untuk setiap variabel yang tersisa setelah mengabaikan variabel lain. Berikut adalah Tabel Peluang Marginal untuk Pola Olahraga dan Kesehatan Jantung, serta Pola Makan dan Kesehatan Jantung.

Tabel Peluang Marginal untuk Pola Olahraga (X) dan Kesehatan Jantung (Y)

# Hitung probabilitas marginal untuk Pola Olahraga (X) dan Kesehatan Jantung (Y)
marginal_X_Y <- aggregate(P_ZXY ~ Olahraga + Kesehatan, data = data, sum)

# Tampilkan tabel peluang marginal
knitr::kable(marginal_X_Y, digits = 4)
Olahraga Kesehatan P_ZXY
Rutin Baik 0.4000
Tidak Rutin Baik 0.2500
Rutin Buruk 0.1333
Tidak Rutin Buruk 0.2167

Tabel Peluang Marginal untuk Pola Makan (Z) dan Kesehatan Jantung (Y)

# Hitung probabilitas marginal untuk Pola Makan (Z) dan Kesehatan Jantung (Y)
marginal_Z_Y <- aggregate(P_ZXY ~ Makan + Kesehatan, data = data, sum)

# Tampilkan tabel peluang marginal
knitr::kable(marginal_Z_Y, digits = 4)
Makan Kesehatan P_ZXY
Sehat Baik 0.4167
Tidak Sehat Baik 0.2333
Sehat Buruk 0.1500
Tidak Sehat Buruk 0.2000

Interpretasi

  • Peluang Marginal Kesehatan Jantung Baik (Y = Baik): Probabilitas bahwa seseorang memiliki kesehatan jantung baik (Y = Baik) tanpa memperhatikan pola makan dan pola olahraga adalah 0.65.
  • Peluang Marginal Kesehatan Jantung Buruk (Y = Buruk): Probabilitas bahwa seseorang memiliki kesehatan jantung buruk (Y = Buruk) tanpa memperhatikan pola makan dan pola olahraga adalah 0.35.
  • Peluang Marginal Pola Olahraga (Rutin): Probabilitas seseorang yang rutin berolahraga, tanpa memperhatikan pola makan dan kesehatan jantung adalah 0.5333.
  • Peluang Marginal Pola Makan (Sehat): Probabilitas seseorang yang memiliki pola makan sehat, tanpa memperhatikan pola olahraga dan kesehatan jantung adalah 0.5667.

Kesimpulan

Tabel peluang marginal membantu memahami distribusi probabilitas dari masing-masing variabel tanpa mempertimbangkan variabel lainnya. Ini memberikan wawasan penting dalam analisis data kategori dengan tabel kontingensi tiga arah.

  1. Peluang Bersyarat (Conditional Probability)

Peluang bersyarat didefinisikan sebagai:

\[ P(Z|X, Y) = \frac{P(Z, X, Y)}{P(X, Y)} \]

Dimana:

- \(P(Z|X, Y)\) adalah peluang terjadinya Z dengan syarat X dan Y sudah terjadi,

- \(P(Z, X, Y)\) adalah peluang bersama untuk kombinasi Z, X, dan Y,

- \(P(X, Y)\) adalah peluang bersama untuk kombinasi X dan Y.

Sebagai contoh, kita ingin menghitung peluang seseorang berpola makan sehat (Z) dan rutin berolahraga (X), diberikan bahwa orang tersebut memiliki kesehatan jantung buruk (Y). Secara manual, peluang bersyarat ini dapat dihitung dengan rumus:

\[ P(Z = \text{Sehat} | X = \text{Rutin}, Y = \text{Buruk}) = \frac{P(Z = \text{Sehat}, X = \text{Rutin}, Y = \text{Buruk})}{P(X = \text{Rutin}, Y = \text{Buruk})} \]

Menghitung secara manual:

\[ P(Z = \text{Sehat}, X = \text{Rutin}, Y = \text{Buruk}) = 30 / 600 = 0.05 \]

\[ P(X = \text{Rutin}, Y = \text{Buruk}) = \frac{30 + 50}{600} = 0.1333 \]

\[ P(Z = \text{Sehat} | X = \text{Rutin}, Y = \text{Buruk}) = \frac{30 / 600}{(30 + 50) / 600} = \frac{0.05}{0.1333} = 0.375 \]

Implementasi dalam R

# Data kombinasi kategori
data <- data.frame(
  Olahraga = rep(c("Rutin", "Tidak Rutin"), each = 4),
  Makan = rep(c("Sehat", "Tidak Sehat"), times = 2, each = 2),
  Kesehatan = rep(c("Baik", "Buruk"), times = 4),
  Total = c(150, 30, 90, 50, 100, 60, 50, 70)
)

# Hitung probabilitas bersama
data$P_ZXY <- data$Total / sum(data$Total)

# Menghitung peluang bersyarat berdasarkan Pola Olahraga dan Kesehatan Jantung
P_X_Y <- sum(data$Total[data$Olahraga == "Rutin" & data$Kesehatan == "Buruk"]) / sum(data$Total)
P_Z_given_X_Y <- (30 / 600) / P_X_Y
P_X_Y  # Peluang X = Rutin dan Y = Buruk
## [1] 0.1333333
P_Z_given_X_Y  # Peluang Makan Sehat dengan Rutin dan Buruk
## [1] 0.375

Interpretasi

  • Peluang Bersyarat: Peluang seseorang memiliki pola makan sehat dan rutin berolahraga, diberikan bahwa mereka memiliki kesehatan jantung buruk, adalah 0.375.

Kesimpulan

Peluang bersyarat memberikan gambaran bagaimana perubahan dalam satu variabel mempengaruhi distribusi variabel lainnya, mengingat variabel lainnya sudah diketahui.

Tabel Peluang Bersyarat

Peluang bersyarat dihitung berdasarkan jumlah total dalam setiap kategori.

Tabel Peluang Bersyarat untuk Kesehatan Jantung

Peluang bersyarat dihitung dengan rumus berikut:

\[ P(Z|X, Y) = \frac{P(Z, X, Y)}{P(X, Y)} \]

Dimana:

- \[ P(Z|X, Y)\] adalah peluang terjadinya Z dengan syarat X dan Y sudah terjadi.

- \[P(Z, X, Y)\] adalah peluang bersama untuk kombinasi Z, X, dan Y.

- \[P(X, Y)\] adalah peluang bersama untuk kombinasi X dan Y.

Sebagai contoh, kita ingin menghitung peluang seseorang berpola makan sehat (Z) dan rutin berolahraga (X), diberikan bahwa orang tersebut memiliki kesehatan jantung buruk (Y).

\[ P(Z=\text{Sehat} | X=\text{Rutin}, Y=\text{Buruk}) = \frac{P(Z=\text{Sehat}, X=\text{Rutin}, Y=\text{Buruk})}{P(X=\text{Rutin}, Y=\text{Buruk})} \]

Menghitung secara manual:

\[ P(Z=\text{Sehat}, X=\text{Rutin}, Y=\text{Buruk}) = \frac{30}{600} = 0.05 \]

\[ P(X=\text{Rutin}, Y=\text{Buruk}) = \frac{30 + 50}{600} = 0.1333 \]

\[ P(Z=\text{Sehat} | X=\text{Rutin}, Y=\text{Buruk}) = \frac{0.05}{0.1333} = 0.375 \]

Implementasi dalam R

# Data kombinasi kategori
data <- data.frame(
  Olahraga = rep(c("Rutin", "Tidak Rutin"), each = 4),
  Makan = rep(c("Sehat", "Tidak Sehat"), times = 2, each = 2),
  Kesehatan = rep(c("Baik", "Buruk"), times = 4),
  Total = c(150, 30, 90, 50, 100, 60, 50, 70)
)

# Hitung probabilitas bersama
data$P_ZXY <- data$Total / sum(data$Total)

# Tampilkan tabel
knitr::kable(data, digits = 4)
Olahraga Makan Kesehatan Total P_ZXY
Rutin Sehat Baik 150 0.2500
Rutin Sehat Buruk 30 0.0500
Rutin Tidak Sehat Baik 90 0.1500
Rutin Tidak Sehat Buruk 50 0.0833
Tidak Rutin Sehat Baik 100 0.1667
Tidak Rutin Sehat Buruk 60 0.1000
Tidak Rutin Tidak Sehat Baik 50 0.0833
Tidak Rutin Tidak Sehat Buruk 70 0.1167
# Peluang bersyarat untuk Pola Olahraga dan Kesehatan Jantung
P_Ybaik <- sum(data$Total[data$Kesehatan == "Baik"]) / sum(data$Total)
P_X_Ybaik <- sum(data$Total[data$Olahraga == "Rutin" & data$Kesehatan == "Baik"]) / sum(data$Total)
P_X_given_Ybaik <- P_X_Ybaik / P_Ybaik

P_X_Ybaik  # Peluang Rutin dan Baik
## [1] 0.4
P_X_given_Ybaik  # Peluang Rutin pada Baik
## [1] 0.6153846

Ukuran Asosiasi

Ukuran asosiasi digunakan untuk mengukur kekuatan hubungan antara dua variabel kategori. Tiga ukuran asosiasi yang umum digunakan adalah Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR). Dokumen ini menjelaskan rumus masing-masing ukuran asosiasi, perhitungan secara manual langkah demi langkah, implementasi dalam R, serta interpretasi dari hasil yang diperoleh.

  1. Beda Peluang (BP)

Risk Difference (RD) mengukur perbedaan probabilitas kejadian antara dua kelompok yang berbeda.


\[ RD = P(Y=1|X=1) - P(Y=1|X=0) \]


Perhitungan Manual:

Sebagai contoh, kita menghitung Risk Difference untuk kejadian Kesehatan Jantung Buruk berdasarkan Pola Olahraga:

\[ P(\text{Buruk}, X = \text{Rutin}) = \frac{30 + 50}{600} = 0.1333 \]

\[ P(\text{Buruk}, X = \text{Tidak Rutin}) = \frac{60 + 70}{600} = 0.2167 \]

\[ RD = 0.1333 - 0.2167 = -0.0833 \]

  1. Relative Risk (RR)

Relative Risk (RR) mengukur perbandingan antara dua kelompok, yaitu rasio antara probabilitas kejadian pada kelompok pertama dibandingkan dengan kelompok kedua.

\[ RR = \frac{P(Y=1|X=1)}{P(Y=1|X=0)} \]

Perhitungan Manual:

Menghitung Relative Risk untuk kejadian Kesehatan Jantung Buruk antara yang Rutin dan Tidak Rutin:

\[ RR = \frac{0.1333}{0.2167} = 0.615 \]

Odds Ratio (OR) mengukur odds kejadian pada kelompok pertama dibandingkan dengan kelompok kedua.

\[ OR = \frac{P(Y=1|X=1)/(1 - P(Y=1|X=1))}{P(Y=1|X=0)/(1 - P(Y=1|X=0))} \]

Perhitungan Manual:

Menghitung Odds Ratio untuk kejadian Kesehatan Jantung Buruk antara Rutin dan Tidak Rutin:

\[ \text{Odds untuk Rutin} = \frac{P(\text{Buruk}, X=\text{Rutin})}{1 - P(\text{Buruk}, X=\text{Rutin})} = \frac{0.1333}{1 - 0.1333} = 0.1538 \]

\[ \text{Odds untuk Tidak Rutin} = \frac{P(\text{Buruk}, X=\text{Tidak Rutin})}{1 - P(\text{Buruk}, X=\text{Tidak Rutin})} = \frac{0.2167}{1 - 0.2167} = 0.276 \]

\[ OR = \frac{0.1538}{0.276} = 0.557 \]

Implementasi dalam R

# Data dalam bentuk matrix
data <- data.frame(
  Olahraga = rep(c("Rutin", "Tidak Rutin"), each = 4),
  Makan = rep(c("Sehat", "Tidak Sehat"), times = 2, each = 2),
  Kesehatan = rep(c("Baik", "Buruk"), times = 4),
  Total = c(150, 30, 90, 50, 100, 60, 50, 70)
)

# Hitung probabilitas bersama
data$P_ZXY <- data$Total / sum(data$Total)

# Tampilkan tabel
knitr::kable(data, digits = 4)
Olahraga Makan Kesehatan Total P_ZXY
Rutin Sehat Baik 150 0.2500
Rutin Sehat Buruk 30 0.0500
Rutin Tidak Sehat Baik 90 0.1500
Rutin Tidak Sehat Buruk 50 0.0833
Tidak Rutin Sehat Baik 100 0.1667
Tidak Rutin Sehat Buruk 60 0.1000
Tidak Rutin Tidak Sehat Baik 50 0.0833
Tidak Rutin Tidak Sehat Buruk 70 0.1167
# Peluang Kesehatan Jantung Buruk untuk Pola Olahraga Rutin dan Tidak Rutin
P_Yburuk_Rutin <- sum(data$Total[data$Olahraga == "Rutin" & data$Kesehatan == "Buruk"]) / sum(data$Total)
P_Yburuk_TidakRutin <- sum(data$Total[data$Olahraga == "Tidak Rutin" & data$Kesehatan == "Buruk"]) / sum(data$Total)

# Risk Difference (RD)
RD <- P_Yburuk_Rutin - P_Yburuk_TidakRutin

# Relative Risk (RR)
RR <- P_Yburuk_Rutin / P_Yburuk_TidakRutin

# Odds Ratio (OR)
odds_Rutin <- P_Yburuk_Rutin / (1 - P_Yburuk_Rutin)
odds_TidakRutin <- P_Yburuk_TidakRutin / (1 - P_Yburuk_TidakRutin)
OR <- odds_Rutin / odds_TidakRutin

# Hasil
RD
## [1] -0.08333333
RR
## [1] 0.6153846
OR
## [1] 0.556213

Interpretasi Hasil:

  • Risk Difference (RD): RD sebesar -0.0833 (atau -8.33%) menunjukkan bahwa orang yang rutin berolahraga memiliki peluang lebih rendah 8.33% untuk mengalami kesehatan jantung buruk dibandingkan dengan orang yang tidak rutin berolahraga.

  • Relative Risk (RR): RR sebesar 0.615 menunjukkan bahwa orang yang rutin berolahraga memiliki 61.5% dari risiko kesehatan jantung buruk dibandingkan dengan orang yang tidak rutin berolahraga.

  • Odds Ratio (OR): OR sebesar 0.557 menunjukkan bahwa odds orang yang rutin berolahraga untuk mengalami kesehatan jantung buruk adalah 0.557 kali lebih rendah dibandingkan dengan orang yang tidak rutin berolahraga.

Tabel Kontingensi Parsial

Tabel kontingensi parsial digunakan untuk mengukur hubungan antara dua variabel kategori setelah mengendalikan satu variabel lain. Pada bagian ini, kita akan menghitung tabel kontingensi parsial untuk variabel Pola Olahraga (X) dan Kesehatan Jantung (Y), dengan mengendalikan Pola Makan (Z).

Implementasi dalam R

# Data kombinasi kategori
data <- data.frame(
  Olahraga = rep(c("Rutin", "Tidak Rutin"), each = 4),
  Makan = rep(c("Sehat", "Tidak Sehat"), times = 2, each = 2),
  Kesehatan = rep(c("Baik", "Buruk"), times = 4),
  Total = c(150, 30, 90, 50, 100, 60, 50, 70)
)

# Hitung probabilitas bersama
data$P_ZXY <- data$Total / sum(data$Total)

# Tampilkan tabel
knitr::kable(data, digits = 4)
Olahraga Makan Kesehatan Total P_ZXY
Rutin Sehat Baik 150 0.2500
Rutin Sehat Buruk 30 0.0500
Rutin Tidak Sehat Baik 90 0.1500
Rutin Tidak Sehat Buruk 50 0.0833
Tidak Rutin Sehat Baik 100 0.1667
Tidak Rutin Sehat Buruk 60 0.1000
Tidak Rutin Tidak Sehat Baik 50 0.0833
Tidak Rutin Tidak Sehat Buruk 70 0.1167

Interpretasi Hasil :

  • Pola Olahraga Rutin dan Pola Makan Sehat: Peluang seseorang dengan Pola Olahraga Rutin dan Pola Makan Sehat memiliki Kesehatan Jantung Baik adalah 83.33%. Ini menunjukkan bahwa pola makan sehat sangat berpengaruh dalam meningkatkan kesehatan jantung pada mereka yang rutin berolahraga.

  • Pola Olahraga Tidak Rutin dan Pola Makan Sehat: Peluang seseorang dengan Pola Olahraga Tidak Rutin dan Pola Makan Sehat memiliki Kesehatan Jantung Baik adalah 62.5%. Meskipun pola makan sehat tetap memberikan keuntungan, dampak dari Pola Olahraga Tidak Rutin sedikit mengurangi peluang ini.

  • Pola Olahraga Rutin dan Pola Makan Tidak Sehat: Peluang seseorang dengan Pola Olahraga Rutin dan Pola Makan Tidak Sehat memiliki Kesehatan Jantung Baik adalah 64.29%. Ini menunjukkan bahwa meskipun pola makan tidak sehat, Pola Olahraga Rutin tetap memberikan keuntungan dalam hal kesehatan jantung.

  • Pola Olahraga Tidak Rutin dan Pola Makan Tidak Sehat: Peluang seseorang dengan Pola Olahraga Tidak Rutin dan Pola Makan Tidak Sehat memiliki Kesehatan Jantung Baik adalah 41.67%. Pada kelompok ini, Pola Makan Tidak Sehat sangat memengaruhi hasil kesehatan jantung yang lebih buruk, bahkan pada mereka yang tidak rutin berolahraga.

Conditional Independence

Pada bagian ini, kita akan membahas tentang Independensi Bersyarat antara dua variabel kategorik, yaitu Pola Olahraga dan Pola Makan, dengan mengontrol Kesehatan Jantung sebagai variabel ketiga. Uji ini digunakan untuk mengeksplorasi apakah hubungan antara Pola Olahraga dan Pola Makan tetap ada setelah memperhitungkan Kesehatan Jantung.

Langkah 1: Membuat Tabel Kontingensi

Untuk memulai, kita akan membuat tabel kontingensi berdasarkan data yang tersedia. Tabel ini menunjukkan distribusi frekuensi dari Pola Olahraga, Pola Makan, dan Kesehatan Jantung.

# Data Observasi
data <- matrix(c(150, 30, 90, 50, 100, 60, 50, 70), nrow = 4, byrow = TRUE)
colnames(data) <- c("Kesehatan Jantung Baik", "Kesehatan Jantung Buruk")
rownames(data) <- c("Rutin, Sehat", "Rutin, Tidak Sehat", "Tidak Rutin, Sehat", "Tidak Rutin, Tidak Sehat")

# Tampilkan tabel
data
##                          Kesehatan Jantung Baik Kesehatan Jantung Buruk
## Rutin, Sehat                                150                      30
## Rutin, Tidak Sehat                           90                      50
## Tidak Rutin, Sehat                          100                      60
## Tidak Rutin, Tidak Sehat                     50                      70

Langkah 2: Uji Chi-Square untuk Indepensi

Uji Chi-Square dapat digunakan untuk menguji apakah dua variabel dalam tabel kontingensi independen satu sama lain. Jika kita ingin menguji independensi bersyarat, kita harus memisahkan tabel berdasarkan kategori Kesehatan Jantung dan kemudian menghitung apakah ada hubungan antara Pola Olahraga dan Pola Makan di dalam setiap kategori.

# Uji Chi-Square untuk Independensi di dalam kategori Kesehatan Jantung Baik
data_baik <- data[, 1]
chi_baik <- chisq.test(matrix(data_baik, nrow = 2, byrow = TRUE))

# Uji Chi-Square untuk Independensi di dalam kategori Kesehatan Jantung Buruk
data_buruk <- data[, 2]
chi_buruk <- chisq.test(matrix(data_buruk, nrow = 2, byrow = TRUE))

# Tampilkan hasil uji Chi-Square
chi_baik
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  matrix(data_baik, nrow = 2, byrow = TRUE)
## X-squared = 0.52713, df = 1, p-value = 0.4678
chi_buruk
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  matrix(data_buruk, nrow = 2, byrow = TRUE)
## X-squared = 1.1817, df = 1, p-value = 0.277

Langkah 3: Interpretasi Hasil

Uji Chi-Square untuk Kesehatan Jantung Baik Uji ini menguji apakah Pola Olahraga dan Pola Makan bersifat independen dalam kategori Kesehatan Jantung Baik. Jika p-value lebih kecil dari 0.05, maka kita dapat menolak hipotesis nol dan menyimpulkan bahwa ada hubungan antara Pola Olahraga dan Pola Makan.

Uji Chi-Square untuk Kesehatan Jantung Buruk Uji ini menguji apakah Pola Olahraga dan Pola Makan bersifat independen dalam kategori Kesehatan Jantung Buruk. Sama seperti sebelumnya, jika p-value lebih kecil dari 0.05, kita dapat menolak hipotesis nol dan menyimpulkan bahwa ada hubungan antara kedua variabel ini.

Jika hasil uji Chi-Square menunjukkan bahwa kedua variabel independen di dalam masing-masing kategori, maka kita dapat mengatakan bahwa Pola Olahraga dan Pola Makan bersifat independen bersyarat dengan Kesehatan Jantung.

Langkah 4: Hasil Uji

# Tampilkan keputusan apakah Hipotesis Nol ditolak atau tidak
list(
  Chi_Square_Baik = chi_baik$statistic, 
  P_Value_Baik = chi_baik$p.value, 
  Decision_Baik = ifelse(chi_baik$p.value < 0.05, "Reject H0", "Fail to Reject H0"),
  
  Chi_Square_Buruk = chi_buruk$statistic, 
  P_Value_Buruk = chi_buruk$p.value, 
  Decision_Buruk = ifelse(chi_buruk$p.value < 0.05, "Reject H0", "Fail to Reject H0")
)
## $Chi_Square_Baik
## X-squared 
## 0.5271268 
## 
## $P_Value_Baik
## [1] 0.4678173
## 
## $Decision_Baik
## [1] "Fail to Reject H0"
## 
## $Chi_Square_Buruk
## X-squared 
##  1.181671 
## 
## $P_Value_Buruk
## [1] 0.2770161
## 
## $Decision_Buruk
## [1] "Fail to Reject H0"

Kesimpulan Berdasarkan hasil uji Chi-Square yang dilakukan, kita dapat menarik kesimpulan apakah Pola Olahraga dan Pola Makan bersifat independen bersyarat dengan Kesehatan Jantung. Jika p-value lebih kecil dari 0.05 untuk kedua kategori Kesehatan Jantung Baik dan Kesehatan Jantung Buruk, maka kita dapat mengatakan bahwa ada ketergantungan antara Pola Olahraga dan Pola Makan setelah mengontrol Kesehatan Jantung.

Marginal Y dan X

  1. Tabel Data

Berikut adalah data yang digunakan untuk menghitung marginal:

Pola Olahraga Pola Makan Kesehatan Jantung Baik Kesehatan Jantung Buruk Total
Rutin Sehat 150 30 180
Rutin Tidak Sehat 90 50 140
Tidak Rutin Sehat 100 60 160
Tidak Rutin Tidak Sehat 50 70 120
Total 390 210 600
  1. Menghitung Marginal Y (Kesehatan Jantung Baik dan Buruk)

Marginal \(Y\) adalah total untuk masing-masing kategori dari variabel kesehatan jantung, yang didapat dengan menjumlahkan nilai-nilai pada kolom “Kesehatan Jantung Baik” dan “Kesehatan Jantung Buruk”.

Kesehatan Jantung Baik (Marginal Y):

\[ 150 + 90 + 100 + 50 = 390 \]

Kesehatan Jantung Buruk (Marginal Y):

\[ 30 + 50 + 60 + 70 = 210 \]

  1. Menghitung Marginal X (Pola Olahraga dan Pola Makan)

Marginal \(X\) adalah total untuk masing-masing kategori dari pola olahraga dan pola makan, yang dihitung dengan menjumlahkan seluruh nilai pada baris untuk kategori pola olahraga dan pola makan.

Pola Olahraga Rutin (Marginal X):

\[ 150 + 30 + 90 + 50 = 320 \]

Pola Olahraga Tidak Rutin (Marginal X):

\[ 100 + 60 + 50 + 70 = 280 \]

Pola Makan Sehat (Marginal X):

\[ 150 + 90 + 100 + 50 = 390 \]

Pola Makan Tidak Sehat (Marginal X):

\[ 30 + 50 + 60 + 70 = 210 \]

  1. Tabel Marginal

Berikut adalah hasil tabel marginal setelah perhitungan:

Pola Olahraga Pola Makan Kesehatan Jantung Baik Kesehatan Jantung Buruk Total
Rutin Sehat 150 30 180
Rutin Tidak Sehat 90 50 140
Tidak Rutin Sehat 100 60 160
Tidak Rutin Tidak Sehat 50 70 120
Total Y 390 210 600
Total X
Rutin 320
Tidak Rutin 280
Sehat 390
Tidak Sehat 210
  1. Kesimpulan
  • Marginal Y:
    • Total untuk “Kesehatan Jantung Baik” adalah 390.
    • Total untuk “Kesehatan Jantung Buruk” adalah 210.
  • Marginal X:
    • Total untuk “Rutin” adalah 320.
    • Total untuk “Tidak Rutin” adalah 280.
    • Total untuk “Sehat” adalah 390.
    • Total untuk “Tidak Sehat” adalah 210.

Inferensi Tabel Kontingensi Tiga Arah

Disini melakukan analisis tabel kontingensi tiga arah untuk menganalisis hubungan antara dua variabel kategori dengan memperhitungkan variabel kontrol. Misalnya ingin mengetahui hubungan antara kebiasaan berolahraga (X) dan pola makan (Y) dengan kesehatan jantung (Z), dengan variabel kontrol usia. Tujuan analisis ini adalah untuk mengevaluasi apakah ada hubungan yang signifikan antara kebiasaan berolahraga dan kesehatan jantung, dengan mempertimbangkan pola makan sebagai kontrol.

Langkah-langkah Analisis: Menyiapkan Tabel Kontingensi Tiga Arah

Berdasarkan data yang diberikan, kita akan membuat tabel kontingensi yang menunjukkan hubungan antara pola olahraga, pola makan, dan kesehatan jantung.

Uji Cochran-Mantel-Haenszel

Pengujian ini dilakukan untuk menilai apakah ada hubungan antara kebiasaan olahraga dan kesehatan jantung setelah mengontrol pola makan.

Rumus CMH:

\[ CMH = \sum \frac{(n_{11k} - \mu_{11k})^2}{var(n_{11k})} \]

Uji CMH digunakan untuk mengetahui apakah hubungan antara kebiasaan olahraga dan kesehatan jantung tetap signifikan setelah mengontrol pola makan.

Definisi dan Penjelasan Uji Cochran-Mantel-Haenszel Dalam analisis ini, kita akan menggunakan uji CMH untuk menguji asosiasi antara variabel bebas (X) dan terikat (Y), dengan mempertimbangkan efek dari variabel kontrol (Z).

Dalam kasus ini, X adalah kebiasaan berolahraga, Y adalah kesehatan jantung, dan Z adalah pola makan.

Implementasi dalam R

# Membuat data untuk tabel kontingensi
data_cmh <- array(c(150, 30, 90, 50, 100, 60, 50, 70),
                  dim = c(2, 2, 2),
                  dimnames = list(
                    Pola_Olahraga = c("Rutin", "Tidak Rutin"),
                    Pola_Makan = c("Sehat", "Tidak Sehat"),
                    Kesehatan_Jantung = c("Baik", "Buruk")
                  ))

# Melihat struktur data
data_cmh
## , , Kesehatan_Jantung = Baik
## 
##              Pola_Makan
## Pola_Olahraga Sehat Tidak Sehat
##   Rutin         150          90
##   Tidak Rutin    30          50
## 
## , , Kesehatan_Jantung = Buruk
## 
##              Pola_Makan
## Pola_Olahraga Sehat Tidak Sehat
##   Rutin         100          50
##   Tidak Rutin    60          70
# Uji Cochran-Mantel-Haenszel menggunakan fungsi mantelhaen.test
library(vcd)
cmh_base <- mantelhaen.test(data_cmh, correct = FALSE)

# Menampilkan hasil uji
cmh_base
## 
##  Mantel-Haenszel chi-squared test without continuity correction
## 
## data:  data_cmh
## Mantel-Haenszel X-squared = 26.862, df = 1, p-value = 2.185e-07
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
##  1.773553 3.606622
## sample estimates:
## common odds ratio 
##          2.529138

Interpretasi Hasil: p-value yang sangat kecil (< 0.05) menunjukkan bahwa menolak hipotesis nol (yang menyatakan bahwa tidak ada hubungan antara kebiasaan berolahraga dan kesehatan jantung setelah mengontrol pola makan).

Ini berarti ada hubungan signifikan antara kebiasaan berolahraga dan kesehatan jantung, dengan kontrol terhadap pola makan.

Odds Ratio (OR) sebesar 2.529138 menunjukkan bahwa kebiasaan berolahraga (dalam hal ini pola olahraga rutin) meningkatkan peluang seseorang memiliki kesehatan jantung yang baik sekitar 2.5 kali dibandingkan dengan mereka yang tidak rutin berolahraga, setelah mengontrol pola makan.

Confidence interval (95%) yang tidak mencakup angka 1 ([1.773553, 3.606622]) mendukung kesimpulan bahwa odds ratio yang berbeda dari 1 adalah signifikan.

Kesimpulan: Dari hasil uji CMH, kita dapat menyimpulkan bahwa ada hubungan signifikan antara kebiasaan berolahraga dan kesehatan jantung setelah mengontrol pola makan. Orang yang berolahraga rutin memiliki peluang yang lebih besar untuk memiliki kesehatan jantung yang baik dibandingkan dengan yang tidak berolahraga rutin.

Generalized Linear Model (GLM)

Generalized Linear Model (GLM) merupakan perluasan dari model regresi linear klasik. GLM memungkinkan kita untuk memodelkan data di mana variabel respons tidak berdistribusi normal dan/atau hubungan antara variabel prediktor dengan rata-rata dari respons tidak linear.

GLM terdiri dari tiga komponen utama sebagai berikut:

  1. Distribusi dari Exponential Family untuk Variabel Respons GLM memungkinkan kita untuk menggunakan berbagai distribusi untuk variabel respons yang berasal dari exponential family. Beberapa distribusi yang termasuk dalam exponential family adalah:

Setiap distribusi ini memiliki karakteristik dan kegunaan yang berbeda sesuai dengan jenis data yang dimiliki.

  1. Fungsi Link yang Menghubungkan Ekspektasi Variabel Respons ke Kombinasi Linear dari Prediktor Fungsi link adalah fungsi yang menghubungkan ekspektasi (rata-rata) dari variabel respons (\(E(Y)\)) ke kombinasi linear dari prediktor. Fungsi link ini bisa berbeda tergantung pada jenis distribusi yang digunakan. Misalnya:

Dengan kata lain, fungsi link \(g(\mu)\) adalah transformasi dari rata-rata respons, di mana \(\mu = E(Y)\).

  1. Fungsi Linear Prediktor: Fungsi linear prediktor adalah kombinasi linear dari variabel prediktor yang digunakan untuk memodelkan ekspektasi dari variabel respons. Fungsi ini biasanya berbentuk seperti: \[ \eta = X \beta \] di mana:

Contoh Implementasi GLM dalam R

Untuk mengimplementasikan GLM dalam R, kita dapat menggunakan fungsi glm() dari package stats. Berikut adalah contoh penggunaan GLM untuk regresi logistik (model binomial):

# Contoh data
data <- data.frame(
  outcome = c(1, 0, 1, 0, 1, 0, 1, 0, 1, 0),
  predictor = c(2.3, 2.8, 3.1, 1.5, 3.4, 2.9, 4.0, 1.2, 3.7, 2.0)
)

# Membuat model GLM dengan distribusi binomial dan fungsi link logit
model <- glm(outcome ~ predictor, data = data, family = binomial(link = "logit"))

# Menampilkan ringkasan model
summary(model)
## 
## Call:
## glm(formula = outcome ~ predictor, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)   -7.353      4.688  -1.569    0.117
## predictor      2.676      1.634   1.637    0.102
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 13.8629  on 9  degrees of freedom
## Residual deviance:  7.8439  on 8  degrees of freedom
## AIC: 11.844
## 
## Number of Fisher Scoring iterations: 5

Exponential Family

Dalam Generalized Linear Model (GLM), variabel respons \(Y\) dianggap berasal dari exponential family of distributions. Keluarga distribusi eksponensial mencakup berbagai distribusi yang sering digunakan dalam analisis statistik, seperti distribusi normal, binomial, Poisson, dan lainnya.

Apa itu Exponential Family?

Distribusi dikatakan termasuk dalam keluarga eksponensial jika fungsi densitas atau fungsi massa probabilitasnya dapat ditulis dalam bentuk umum berikut:

\[ f_Y(y; \theta, \phi) = \exp \left( \frac{y \theta - b(\theta)}{\phi} + c(y, \phi) \right) \]

Di mana:

- \(\theta\) adalah parameter yang disebut natural parameter.

- \(b(\theta)\) adalah fungsi yang disebut bias function.

- \(\phi\) adalah parameter skala (sering diasumsikan \(\phi = 1\)).

- \(c(y, \phi)\) adalah fungsi yang tidak bergantung pada parameter \(\theta\).

Distribusi yang termasuk dalam keluarga eksponensial ini memiliki beberapa karakteristik yang serupa dan memungkinkan kita untuk menerapkan GLM untuk berbagai jenis data yang mengikuti distribusi yang berbeda.

Contoh Distribusi dalam Exponential Family

Beberapa distribusi yang termasuk dalam keluarga eksponensial adalah:

  1. Distribusi Normal (untuk regresi linier): \[ f_Y(y; \mu, \sigma^2) = \frac{1}{\sqrt{2\pi \sigma^2}} \exp\left(-\frac{(y-\mu)^2}{2\sigma^2}\right) \]
    • Parameter: \(\theta = \mu\), \(\phi = \sigma^2\)
    • Fungsi link yang digunakan adalah identity link: \(\eta = \mu\)
  2. Distribusi Binomial (untuk regresi logistik): \[ f_Y(y; n, p) = \binom{n}{y} p^y (1-p)^{n-y} \]
    • Parameter: \(\theta = \log \left( \frac{p}{1-p} \right)\) (logit link)
    • Fungsi link yang digunakan adalah logit link: \(\eta = \log \left( \frac{p}{1-p} \right)\)
  3. Distribusi Poisson (untuk regresi log-linear): \[ f_Y(y; \lambda) = \frac{\lambda^y e^{-\lambda}}{y!} \]
    • Parameter: \(\theta = \log(\lambda)\)
    • Fungsi link yang digunakan adalah log link: \(\eta = \log(\lambda)\)
  4. Distribusi Gamma: \[ f_Y(y; \alpha, \beta) = \frac{y^{\alpha - 1} e^{-y/\beta}}{\Gamma(\alpha) \beta^{\alpha}} \]
    • Parameter: \(\theta = \frac{1}{\beta}\)
    • Fungsi link yang digunakan adalah inverse link: ( =

Model Regresi Logistik

Persamaan regresi logistik merupakan bentuk perluasan dari regresi linier, di mana nilai-nilai input dikombinasikan secara linier dengan koefisien (bobot) untuk menghasilkan prediksi. Namun, regresi logistik membatasi hasil prediksi menjadi nilai biner, yaitu 0 atau 1, dengan menggunakan fungsi aktivasi sigmoid.

Hasil yang diprediksi oleh model akan berada dalam rentang antara 0 hingga 1 dan membentuk sebuah kurva S (sigmoid).

Aplikasi dan Penjelasan Regresi Logistik Regresi logistik digunakan untuk menganalisis hubungan antara satu atau lebih variabel independen dengan variabel dependen yang bersifat biner (dua kategori). Model ini banyak digunakan dalam berbagai aplikasi prediktif, terutama yang berkaitan dengan perkiraan probabilitas suatu kejadian atau apakah suatu entitas termasuk dalam kategori tertentu atau tidak.

Sebagai contoh, angka 0 dapat mewakili kelas negatif, dan angka 1 mewakili kelas positif. Model regresi logistik sering diterapkan pada masalah klasifikasi biner, di mana variabel hasil hanya memiliki dua kemungkinan kategori (0 dan 1).

Beberapa contoh penerapan klasifikasi biner antara lain:

Menentukan probabilitas serangan jantung: Dengan menggunakan model regresi logistik, kita dapat mengukur hubungan antara variabel-variabel seperti berat badan, pola makan, olahraga, dan faktor-faktor lainnya, untuk memperkirakan apakah seseorang berisiko mengalami serangan jantung atau tidak.

Kemungkinan diterima di universitas: Sistem aplikasi dapat digunakan untuk memperkirakan probabilitas seorang siswa diterima di universitas tertentu berdasarkan data variabel prediktor seperti nilai ujian GRE, GMAT, atau TOEFL.

  • Prediksi Keberhasilan Kampanye Pemasaran: Regresi logistik digunakan untuk memprediksi apakah seorang pelanggan akan merespons kampanye pemasaran tertentu. Berdasarkan variabel seperti usia, pendapatan, preferensi produk, dan lainnya, model ini dapat memperkirakan probabilitas seorang pelanggan akan membeli produk setelah menerima tawaran.

  • Penilaian Risiko Kesehatan: Dalam dunia kesehatan, regresi logistik dapat digunakan untuk memprediksi kemungkinan seseorang mengalami penyakit tertentu berdasarkan faktor risiko, seperti kebiasaan makan, tingkat aktivitas fisik, tekanan darah, dan riwayat keluarga.

  • Deteksi Penipuan dalam Transaksi Keuangan: Regresi logistik digunakan untuk mengidentifikasi transaksi yang berpotensi penipuan dalam sistem perbankan atau e-commerce. Berdasarkan variabel seperti pola pengeluaran, lokasi transaksi, dan jenis barang yang dibeli, model ini dapat memperkirakan probabilitas apakah transaksi tersebut sah atau tidak.

  • Pemilihan Kandidat Pekerjaan: Regresi logistik dapat membantu perusahaan memprediksi apakah seorang pelamar pekerjaan akan diterima atau tidak berdasarkan variabel seperti pengalaman kerja, pendidikan, dan keterampilan yang dimiliki.

  • Kemudahan dalam penerapan: Regresi logistik mudah diterapkan pada banyak aplikasi praktis, di antaranya dalam bidang kedokteran (memprediksi penyakit), pemasaran (menganalisis kecenderungan pembelian), dan rekayasa sosial (mengukur risiko kejahatan).

Langkah-Langkah Penggunaan Regresi Logistik Membangun dataset dengan hubungan linier: Dataset yang digunakan dalam regresi logistik biasanya dipisahkan dalam dua kelas data (misalnya, 0 dan 1) untuk membangun model prediktif. Dalam hal ini, hubungan antar variabel perlu diuji untuk memastikan bahwa data tersebut sesuai untuk model logistik.

Menilai hasil yang diprediksi: Setelah model dilatih, prediksi hasil regresi logistik akan memberikan probabilitas antara 0 dan 1. Model ini dapat memberikan informasi tentang kemungkinan suatu kejadian atau status berdasarkan data prediktor yang diberikan.

Model regresi logistik untuk klasifikasi: Regresi logistik adalah alat yang ampuh untuk memetakan hasil prediksi ke dalam probabilitas, dan untuk keperluan klasifikasi biner, hasil tersebut akan mengarahkan data ke dalam dua kategori yang berbeda.

Model regresi logistik digunakan untuk memprediksi probabilitas dari sebuah peristiwa biner. Hasil dari model ini dapat digambarkan dengan menggunakan kurva sigmoid yang menunjukkan hubungan non-linear antara variabel prediktor dan probabilitas hasil yang diinginkan (0 atau 1).

Berikut adalah langkah-langkah untuk membuat simulasi dan visualisasi kurva regresi logistik:

# Simulasi data untuk regresi logistik
set.seed(42) # Menetapkan seed untuk reprodusibilitas
n <- 100 # Jumlah sampel
x <- seq(-4, 4, length.out = n) # Variabel prediktor X
log_odds <- -0.5 + 1.5 * x # Log odds yang dihitung dari X
prob <- 1 / (1 + exp(-log_odds)) # Probabilitas dengan fungsi sigmoid
y <- rbinom(n, 1, prob) # Variabel respons biner (0 atau 1)

# Membuat data frame dari hasil simulasi
data <- data.frame(x = x, y = y, prob = prob)

# Visualisasi plot kurva regresi logistik
plot(x, prob, type = "l", col = "blue", lwd = 2, 
     xlab = "Prediktor X", ylab = "Probabilitas Y", 
     main = "Simulasi Regresi Logistik dengan Kurva Sigmoid")
abline(h = 0.5, col = "red", lty = 2) # Menambahkan garis ambang batas
points(x, y, pch = 20, col = "gray") # Menampilkan data biner
legend("topright", legend = c("Kurva Logistik", "Ambang 0.5"), 
       col = c("blue", "red"), lty = c(1, 2), lwd = 2)

Hasil visualisasi ini menunjukkan hubungan antara nilai prediktor 𝑋 dan probabilitas 𝑌, di mana kurva sigmoid menggambarkan perubahan probabilitas dari 0 menjadi 1. Fungsi sigmoid yang digunakan untuk menghitung probabilitas adalah sebagai berikut:

\[ f(x) = \frac{1}{1 + e^{-x}} \]

Kurva ini menghasilkan probabilitas yang selalu terletak di antara 0 dan 1, dan ambang batas 0.5 digunakan untuk menentukan klasifikasi antara dua kategori. Jika hasil fungsi sigmoid lebih besar dari 0.5, maka kelas yang diprediksi adalah 1 (positif), dan jika lebih kecil dari 0.5, kelas yang diprediksi adalah 0 (negatif).

Estimasi Parameter Metode estimasi parameter dalam Generalized Linear Model (GLM) umumnya menggunakan teknik Maximum Likelihood Estimation (MLE). Dalam konteks regresi logistik, log-likelihood fungsi digunakan untuk memodelkan data.

Dengan kata lain, estimasi parameter dilakukan melalui iterasi Newton-Raphson atau algoritma Fisher Scoring.

Contoh Kasus dengan R:

Misalkan kita memiliki data simulasi sebagai berikut:

set.seed(123)
n2 <- 200
x2 <- rnorm(n2)
y2 <- 1 / (1 + exp(-(-0.5 + 2*x)))
y2 <- rbinom(1, n, y2)
data2 <- data.frame(x, y2)

Estimasi model regresi logistik dapat dilakukan dengan menggunakan fungsi glm dari R:

model <- glm(y ~ x, data = data2, family = binomial)
summary(model)
## 
## Call:
## glm(formula = y ~ x, family = binomial, data = data2)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -0.2455     0.3536  -0.694    0.487    
## x             1.5125     0.3024   5.002 5.67e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 138.469  on 99  degrees of freedom
## Residual deviance:  53.232  on 98  degrees of freedom
## AIC: 57.232
## 
## Number of Fisher Scoring iterations: 6

Plot Probabilitas Prediksi Berdasarkan hasil model regresi logistik, maka akan dimplot hasil prediksi dalam bentuk plot probabilitas prediksi, seperti yang ditunjukkan di bawah ini.

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)
legend("topright", c("Data Biner (0/1)", "Kurva Logistik", "Ambang 0.5"),
       col = c("grey", "blue", "red"), pch = c(16, NA, NA), lty = c(NA, 1, 2))

Contoh Kasus : Regresi Logistik untuk Memprediksi Keberhasilan Ujian

Regresi logistik digunakan untuk memodelkan hubungan antara satu atau lebih variabel independen dengan variabel dependen biner (0/1). Dalam contoh ini, kita akan memodelkan probabilitas keberhasilan ujian berdasarkan jam belajar.

Simulasi Data

Kita akan membuat data simulasi di mana probabilitas respons (berhasil/gagal ujian) dipengaruhi oleh jumlah jam belajar. Dalam contoh ini, kita akan melakukan analisis regresi logistik untuk memodelkan probabilitas keberhasilan ujian (variabel respons biner: 0 untuk gagal, 1 untuk berhasil) berdasarkan jumlah jam belajar (variabel prediktor). Model regresi logistik digunakan karena variabel respons bersifat biner, dengan probabilitas keberhasilan dihubungkan melalui fungsi logit:

\[ \log\left(\frac{\pi_i}{1 - \pi_i}\right) = \beta_0 + \beta_1 x_i \]

Di mana:

- \(\pi_i\): Probabilitas keberhasilan ujian untuk observasi ke-\(i\).

- \(\beta_0\): Intersep (log-odds ketika \(x_i = 0\)).

- \(\beta_1\): Koefisien untuk variabel prediktor \(x_i\) (jam belajar).

- \(x_i\): Jumlah jam belajar.

# Simulasi Data
set.seed(123)
n <- 200  # Jumlah sampel
x <- rnorm(n)  # Jam belajar (variabel prediktor)
log_odds <- -0.5 + 0.3 * x  # Hubungan log-odds
prob <- 1 / (1 + exp(-log_odds))  # Fungsi sigmoid
y <- rbinom(n, 1, prob)  # Keberhasilan ujian (0 atau 1)
data <- data.frame(y = y, x = x)  # Membuat data frame
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.4699     0.1458  -3.222  0.00127 **
## x             0.1747     0.1550   1.127  0.25977   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 266.58  on 199  degrees of freedom
## Residual deviance: 265.31  on 198  degrees of freedom
## AIC: 269.31
## 
## Number of Fisher Scoring iterations: 4
exp(coef(model))
## (Intercept)           x 
##   0.6250903   1.1908887
data$pred <- predict(model, type = "response")
head(data)
library(ggplot2)
ggplot(data, aes(x = x, y = y)) +
  geom_point(alpha = 0.5, color = "gray40") +
  geom_line(aes(y = pred), color = "blue", linewidth = 1.5) +
  labs(title = "Kurva Logit pada Regresi Logistik: Prediksi Keberhasilan Ujian",
       x = "Jam Belajar (x)",
       y = "Probabilitas / Respons") +
  theme_minimal()# Klasifikasi dan confusion matrix

data$pred_class <- ifelse(data$pred > 0.5, 1, 0)
table(Predicted = data$pred_class, Actual = data$y)
##          Actual
## Predicted   0   1
##         0 123  76
##         1   0   1

Model Regresi Poisson

Model regresi Poisson digunakan saat variabel respons berupa data cacah (count data), yakni bilangan bulat non-negatif. Model ini merupakan bagian dari Generalized Linear Model (GLM), dengan asumsi bahwa distribusi variabel respons mengikuti distribusi Poisson.

Distribusi Poisson memiliki fungsi probabilitas sebagai berikut: \[ P(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!} \]

Bentuk ini dituliskan dalam format exponential family:

\[ f(y; \theta) = \exp \left( y \log(\lambda) - \lambda - \log(y!) \right) \]

dengan : \[ \theta = \log(\lambda) \]

\[ b(\theta) = e^\lambda \]

\[ \phi = 1 \]

\[ c(y, \phi) = -\log(y!) \]

Fungsi Link

Fungsi link yang digunakan untuk distribusi Poisson adalah fungsi logaritma: \[ g(\mu) = \log(\mu) \]

Sehingga model regresi Poisson menjadi: \[ \log(\mu) = x_i^T \beta \]

dan fungsi inverse link: \[ \mu_i = \exp(x_i^T \beta) \]

Estimasi Parameter Estimasi parameter𝛽dilakukan dengan metode Maximum Likelihood Estimation (MLE). Log-likelihood fungsi untuk regresi Poisson:

\[ l(\beta) = \sum_{i=1}^{n} \left[ y_i x_i^T \beta - \exp(x_i^T \beta) - \log(y_i!) \right] \]

Nilai𝛽dapat diperoleh melalui metode numerik seperti iterasi Newton-Raphson.

Contoh : Ini merupakan data simulasi :

set.seed(42)
n3 <- 200
x3 <- rnorm(n)
lambda <- exp(0.3 + 0.6 * x3)
y3 <- rpois(n3, lambda)
data3 <- data.frame(y3, x3)

Estimasi model regresi Poisson dapat dilakukan dengan menggunakan fungsi glm di R:

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.9586     0.1144  -8.378   <2e-16 ***
## x             0.1056     0.1190   0.887    0.375    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 146.99  on 199  degrees of freedom
## Residual deviance: 146.22  on 198  degrees of freedom
## AIC: 304.22
## 
## Number of Fisher Scoring iterations: 5

Berdasarkan hasil model regresi Poisson, kita dapat memplot 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)

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

Untuk memeriksa adanya overdispersion, kita dapat menghitung nilai dispersion:

dispersion <- sum(residuals(poisson_model, type = "pearson")^2) / poisson_model$df.residual
dispersion
## [1] 0.6221788

Jika nilai dispersion lebih besar dari 1, maka terjadi overdispersion, dan model alternatif seperti Negative Binomial Regression dapat dipertimbangkan.

Jika nilai dispersion lebih besar dari 1, maka overdispersion mungkin terjadi dan model alternatif seperti Negative Binomial Regression dapat digunakan.

Interpretasi: Nilai dispersion ini lebih kecil dari 1, yang menunjukkan bahwa tidak terjadi overdispersion dalam model Poisson Anda. Ini berarti bahwa model Poisson Anda cukup baik dalam menjelaskan variabilitas data.

Regresi Poisson digunakan ketika variabel respons berupa hitungan kejadian, seperti jumlah produksi barang rusak di lini produksi berdasarkan shift kerja dan jenis mesin.

Simulasi Data

set.seed(123)
n <- 100
shift <- factor(sample(c("Pagi", "Siang", "Malam"), n, replace = TRUE))
mesin <- factor(sample(c("A", "B"), n, replace = TRUE))

# Rata-rata kerusakan tergantung shift dan jenis mesin
lambda <- ifelse(shift == "Pagi" & mesin == "A", 2,
                 ifelse(shift == "Pagi" & mesin == "B", 3,
                        ifelse(shift == "Siang" & mesin == "A", 4,
                               ifelse(shift == "Siang" & mesin == "B", 5,
                                      ifelse(shift == "Malam" & mesin == "A", 6, 7)))))

rusak <- rpois(n, lambda)
data_prod <- data.frame(rusak, shift, mesin)
head(data_prod)

Pemodelan Regresi Poisson

model_poisson <- glm(rusak ~ shift + mesin, data = data_prod, family = poisson)
summary(model_poisson)
## 
## Call:
## glm(formula = rusak ~ shift + mesin, family = poisson, data = data_prod)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  1.77220    0.08614  20.573  < 2e-16 ***
## shiftPagi   -1.01396    0.13117  -7.730 1.08e-14 ***
## shiftSiang  -0.46083    0.10942  -4.212 2.54e-05 ***
## mesinB       0.18927    0.09814   1.929   0.0538 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 182.06  on 99  degrees of freedom
## Residual deviance: 109.67  on 96  degrees of freedom
## AIC: 428.31
## 
## Number of Fisher Scoring iterations: 5

Interpretasi Koefisien

exp(coef(model_poisson))
## (Intercept)   shiftPagi  shiftSiang      mesinB 
##   5.8837646   0.3627798   0.6307623   1.2083722
  • Intersep adalah estimasi rata-rata kerusakan untuk kategori referensi.
  • Koefisien lainnya menunjukkan rasio rata-rata relatif terhadap kategori referensi.

Visualisasi Prediksi

data_prod$pred <- predict(model_poisson, type = "response")

library(ggplot2)
ggplot(data_prod, aes(x = shift, y = rusak, color = mesin)) +
  geom_jitter(width = 0.2, alpha = 0.5) +
  geom_point(aes(y = pred), shape = 18, size = 3, color = "black") +
  facet_wrap(~mesin) +
  labs(title = "Prediksi Jumlah Barang Rusak berdasarkan Shift dan Mesin",
       x = "Shift Kerja", y = "Jumlah Rusak") +
  theme_minimal()

Evaluasi Model

plot(model_poisson$residuals, main = "Plot Residual", ylab = "Residual", xlab = "Index", pch = 20)
abline(h = 0, col = "red", lty = 2)

Kesimpulan

  • Model regresi Poisson menunjukkan bahwa shift kerja dan jenis mesin berpengaruh pada jumlah produksi rusak.
  • Koefisien negatif menandakan efek pengurangan kejadian.
  • Prediksi dapat digunakan untuk kontrol kualitas produksi secara lebih presisi.

Inferensi GLM

Model Generalized Linear Model (GLM) membutuhkan pemahaman tentang ekspektasi dan varians dari estimator model, terutama untuk mengembangkan alat-alat uji seperti Wald test, Likelihood Ratio test, dan interval kepercayaan.

Ekspektasi dan Varians dalam GLM 1. Ekspektasi Estimator Ekspektasi menunjukkan apakah estimator dari parameter model tak bias, yakni: \[ E[\hat{\beta}] = \beta \] Dalam GLM, estimasi parameter𝛽yang diperoleh melalui metode Maximum Likelihood Estimation (MLE) bersifat asymptotically unbiased.

  1. Varians Estimator Varians menunjukkan presisi dari estimator parameter. Dalam GLM, varians tidak selalu konstan, dan ini berbeda dengan regresi linier (OLS) yang mengasumsikan homoskedastisitas, di mana varians tetap sama di setiap level prediktor.

Untuk GLM, varians dari 𝑌𝑖diberikan oleh: \[ \text{Var}(Y_i) = \phi V(\mu_i) \] Dengan :

- \(\phi\) adalah parameter dispersi yang menggambarkan seberapa besar variance di luar ekspektasi rata-rata.

- \(V(\mu_i)\) adalah fungsi variance yang bergantung pada rata-rata \(\mu_i\).

Contoh Regresi Poisson

Regresi Poisson digunakan ketika variabel respons adalah data cacah (count data) yang bernilai non-negatif. Ini merupakan contoh dari GLM, dengan asumsi bahwa distribusi variabel respons mengikuti distribusi Poisson. Fungsi probabilitas dari distribusi Poisson dapat dituliskan sebagai berikut:

\[ P(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!} \] Di mana \(\lambda\) adalah rate-rata dari distribusi tersebut.

Distribusi Poisson termasuk dalam exponential family dan memiliki fungsi logaritma berikut:

\[ g(\mu) = \log(\mu) \] Maka modelnya menjadi: \[ \log(\mu_i) = x_i^T \beta \]

Dan fungsi invers link: \[ \mu_i = \exp(x_i^T \beta) \] Estimasi Parameter

Estimasi parameter dalam model Poisson dilakukan menggunakan Maximum Likelihood Estimation (MLE). Fungsi log-likelihood untuk regresi Poisson dapat dituliskan sebagai berikut: \[ l(\beta) = \sum_{i=1}^{n} \left[ y_i x_i^T \beta - \exp(x_i^T \beta) - \log(y_i!) \right] \] Nilai dari parameter𝛽dapat diperoleh melalui metode numerik seperti iterasi Newton-Raphson.

Contoh Implementasi Regresi Poisson dalam R:

# Simulasi data
set.seed(42)
x <- rnorm(100)
lambda <- exp(0.5 + 0.8 * x)
y <- rpois(100, lambda)
data <- data.frame(y, x)

# Estimasi Model 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.30010    0.09827   3.054  0.00226 ** 
## x            0.94078    0.08242  11.414  < 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: 271.67  on 99  degrees of freedom
## Residual deviance: 121.84  on 98  degrees of freedom
## AIC: 316.02
## 
## Number of Fisher Scoring iterations: 5

Ini adalah log(λ) saat nilai x = 0.

λ saat x = 0 = exp(0.30010) ≈ 1.35 kejadian rata-rata.

Koefisien x = 0.94078

Untuk setiap kenaikan 1 unit pada variabel x, log(λ) meningkat sebesar 0.94078.

Dalam bentuk rasio kejadian: exp(0.94078) ≈ 2.56 → kejadian meningkat 2.56 kali lipat setiap kenaikan 1 unit x.

Sangat signifikan (p < 0.001).

Menunjukkan bahwa variabel x adalah prediktor yang signifikan terhadap variabel y.

Penurunan deviance yang besar menunjukkan bahwa model lebih baik daripada model tanpa prediktor.

AIC = 316.02

Nilai AIC yang relatif rendah menandakan model cukup baik (untuk perbandingan antar model).

Setiap kenaikan 1 unit pada x, jumlah kejadian meningkat 2.56 kali.

Model cukup baik dalam menjelaskan variasi data (berdasarkan deviance dan AIC).

Plot Hasil Prediksi Berdasarkan hasil estimasi model regresi Poisson, kita dapat memvisualisasikan hasil prediksi menggunakan plot berikut:

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 Pada model Poisson, diasumsikan bahwa rata-rata dan varians dari variabel respons adalah sama. Jika varians lebih besar dari rata-rata, maka overdispersion mungkin terjadi. Hal ini dapat didiagnosis dengan menghitung nilai dispersion:

dispersion <- sum(residuals(poisson_model, type = "pearson")^2) / poisson_model$df.residual
dispersion
## [1] 1.267096

Menghitung Ekspektasi dan Varians dalam GLM

Ekspektasi

Ekspektasi dari variabel acak \(Y\) dapat dihitung berdasarkan fungsi momen:

\[ E(Y') = \int y f(y; \theta) \, dy = \mu \]

Untuk keluarga distribusi eksponensial, fungsi probabilitasnya dapat dituliskan sebagai:

\[ P(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!} \]

Sehingga bentuk logaritmanya menjadi:

\[ \log f(y; \theta) = a(y) + b(\theta) y + c(\theta) \]

Atau, dalam bentuk lain:

\[ \log f(y; \theta) = y \log (\mu) - \mu \]

Untuk menghitung ekspektasi, kita menggunakan turunan pertama dari log-likelihood yang diturunkan terhadap \(\theta\). Ekspektasi turunan pertama menunjukkan bahwa:

\[ E[U(\theta)] = E[Y - b'(\theta)] = \mu - b'(\theta) = 0 \]

Sehingga kita mendapatkan:

\[ \mu = b'(\theta) \]

Varians

Untuk menghitung varians, kita perlu menurunkan log-likelihood dua kali terhadap \(\theta\). Turunan kedua dari log-likelihood memberikan informasi mengenai varians \(Y'\).

\[ \frac{\partial^2 \ell}{\partial \theta^2} = -b''(\theta) \]

Dengan demikian, variansnya adalah:

\[ V(Y') = b''(\theta) \cdot \phi \cdot V(\mu) \]

Dimana \(\phi\) adalah parameter dispersi, yang mengukur variasi tambahan yang terjadi.

Pendahuluan Kita akan mengilustrasikan perhitungan ekspektasi dan varians dalam Generalized Linear Model (GLM) menggunakan data hipotetis tentang jumlah hari sakit seorang pekerja berdasarkan jam kerja per minggu. Data ini diasumsikan mengikuti distribusi Poisson, yang merupakan anggota keluarga distribusi eksponensial.

Data Hipotetis Misalkan kita memiliki data sebagai berikut: - Jam kerja per minggu: 20, 30, 40, 50 jam. - Jumlah hari sakit per bulan: 5, 4, 3, 2 hari.

Kita akan memodelkan hubungan ini menggunakan GLM dengan fungsi taut (link function) log.

Implementasi di R

# Memuat library
library(stats)

# Data
jam_kerja <- c(20, 30, 40, 50)
hari_sakit <- c(5, 4, 3, 2)

# Membuat model GLM dengan distribusi Poisson
model <- glm(hari_sakit ~ jam_kerja, family = poisson(link = "log"))

# Ringkasan model
summary(model)
## 
## Call:
## glm(formula = hari_sakit ~ jam_kerja, family = poisson(link = "log"))
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)   
## (Intercept)  2.22395    0.82321   2.702   0.0069 **
## jam_kerja   -0.02926    0.02477  -1.181   0.2376   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 1.471633  on 3  degrees of freedom
## Residual deviance: 0.026106  on 2  degrees of freedom
## AIC: 16.378
## 
## Number of Fisher Scoring iterations: 3

Menghitung Ekspektasi

Berdasarkan teori GLM, ekspektasi \(E(Y) = \mu\), di mana \(\mu = b'(\theta)\). Untuk distribusi Poisson dengan fungsi taut log, \(\log(\mu) = X\beta\), dan \(\mu = e^{X\beta}\).

# Mengambil koefisien dari model
coef_model <- coef(model)

# Fungsi untuk menghitung ekspektasi
mu <- exp(coef_model[1] + coef_model[2] * jam_kerja)
cat("Ekspektasi (mu) untuk setiap jam kerja:\n")
## Ekspektasi (mu) untuk setiap jam kerja:
print(mu)
## [1] 5.148850 3.842745 2.867959 2.140446

Menghitung Varians

Untuk distribusi Poisson, varians \(V(Y) = \mu \cdot \phi\), di mana \(\phi\) adalah parameter dispersi (untuk Poisson, \(\phi = 1\)).

# Varians (asumsi phi = 1 untuk Poisson)
phi <- 1
varians <- mu * phi
cat("Varians untuk setiap jam kerja:\n")
## Varians untuk setiap jam kerja:
print(varians)
## [1] 5.148850 3.842745 2.867959 2.140446

Visualisasi

Mari kita buat plot sederhana untuk melihat hubungan antara jam kerja dan ekspektasi hari sakit.

# Plot
plot(jam_kerja, hari_sakit, pch = 16, col = "blue", 
     xlab = "Jam Kerja per Minggu", ylab = "Hari Sakit per Bulan",
     main = "Hubungan Jam Kerja dan Hari Sakit")
lines(jam_kerja, mu, col = "red", lwd = 2)
legend("topright", legend = c("Data", "Ekspektasi"), col = c("blue", "red"), pch = c(16, NA), lty = c(NA, 1))

Interpretasi

  • Ekspektasi hari sakit menurun seiring meningkatnya jam kerja, yang konsisten dengan model Poisson.
  • Varians sama dengan ekspektasi karena sifat distribusi Poisson (equidispersion).
  • Visualisasi menunjukkan kecocokan model dengan data observasi.

Kesimpulan

Model GLM dengan distribusi Poisson berhasil menangkap hubungan antara jam kerja dan hari sakit. Ekspektasi dan varians dapat dihitung berdasarkan fungsi taut log, sesuai dengan teori yang dibahas.


Metode Penaksiran Parameter

Maximum Likelihood Estimation (MLE)

Proses penaksiran parameter dalam GLM umumnya menggunakan metode Maximum Likelihood Estimation (MLE), yang memiliki beberapa langkah utama sebagai berikut:

  • Langkah-langkah MLE:
    • Turunan pertama = 0: Mencari nilai parameter yang memaksimalkan fungsi likelihood.
    • Turunan kedua < 0: Mengevaluasi konvergensi algoritma.

Namun, karena bentuk fungsi likelihood pada GLM tidak memiliki solusi analitik langsung, metode numerik digunakan untuk mencari parameter yang tepat.

Metode Optimisasi

Newton-Raphson

  • Mengasumsikan penggunaan score vector (gradien) untuk memaksimalkan log-likelihood.
  • Menggunakan Hessian matrix, yaitu matriks informasi kedua, untuk meningkatkan akurasi dalam menemukan parameter.

Iterative Reweighted Least Square (IRLS)

  • Sebagai modifikasi dari Fisher Scoring, IRLS menggunakan pendekatan mirip dengan Least Square untuk memperbaiki estimasi parameter.

Iterasi Newton-Raphson

Proses iterasi Newton-Raphson dalam GLM dilakukan menggunakan rumus sebagai berikut:

\[ \beta^{(t+1)} = \beta^{(t)} - H^{-1}(\beta^{(t)}) U(\beta^{(t)}) \]

Dimana \(U(\beta)\) adalah score vector dan \(H(\beta)\) adalah Hessian matrix.

Fisher Scoring

Fisher Scoring adalah modifikasi dari metode Newton-Raphson, dimana Hessian digantikan dengan matriks informasi Fisher. Hal ini dilakukan untuk memperbaiki akurasi estimasi parameter.

Implementasi Newton-Raphson

Statistik score pada iterasi ke-\(k\) dapat dihitung dengan rumus:

\[ U_j(\beta) = \frac{\partial \log L(\beta)}{\partial \beta_j} \]

Turunan kedua (Hessian matrix) adalah sebagai berikut:

\[ H_{jk}(\beta) = \frac{\partial^2 \log L(\beta)}{\partial \beta_j \partial \beta_k} \]

Dengan menggunakan Taylor expansion, kita dapat mengekspresikan:

\[ U(\beta) \approx U(\beta^{(t)}) + H(\beta^{(t)})(\beta - \beta^{(t)}) \]

Estimasi Parameter

Estimasi parameter \(\beta\) pada iterasi berikutnya dapat dihitung dengan menggunakan rumus:

\[ \hat{\beta} \approx \beta^{(t)} - H^{-1}(\beta^{(t)}) U(\beta^{(t)}) \]

Metode ini terus diulang hingga konvergensi tercapai.

Penjelasan:

Newton-Raphson: Sebuah metode iteratif untuk menemukan solusi dengan menggunakan gradien (score vector) dan matriks Hessian.

IRLS: Sebuah pendekatan alternatif dalam GLM, yang mendekati Least Square untuk estimasi parameter.

Fisher Scoring: Modifikasi Newton-Raphson, menggantikan Hessian dengan informasi Fisher.

Contoh Kasus Kita akan mengilustrasikan metode penaksiran parameter menggunakan Newton-Raphson dan Fisher Scoring dalam Generalized Linear Model (GLM) dengan data hipotetis tentang jumlah kecelakaan kerja berdasarkan jam kerja lembur per minggu. Data ini diasumsikan mengikuti distribusi Poisson.

Data Hipotetis - Jam kerja lembur per minggu: 5, 10, 15, 20 jam. - Jumlah kecelakaan kerja per bulan: 8, 6, 4, 3.

Implementasi di R

# Memuat library
library(stats)

# Data
jam_lembur <- c(5, 10, 15, 20)
kecelakaan <- c(8, 6, 4, 3)
X <- model.matrix(~ jam_lembur)  # Matriks desain
y <- kecelakaan

# Fungsi log-likelihood untuk distribusi Poisson
log_likelihood <- function(beta, X, y) {
  mu <- exp(X %*% beta)
  -sum(y * log(mu) - mu)
}

# Score vector (turunan pertama)
score <- function(beta, X, y) {
  mu <- exp(X %*% beta)
  t(X) %*% (y - mu)
}

# Hessian matrix (turunan kedua)
hessian <- function(beta, X, y) {
  mu <- exp(X %*% beta)
  -t(X) %*% diag(as.vector(mu)) %*% X
}

# Inisialisasi parameter awal
beta_init <- c(2, -0.1)
beta_current <- beta_init
tolerance <- 1e-6
max_iter <- 100
iter <- 0

# Iterasi Newton-Raphson
while (iter < max_iter) {
  s <- score(beta_current, X, y)
  h <- hessian(beta_current, X, y)
  beta_new <- beta_current - solve(h) %*% s
  if (max(abs(beta_new - beta_current)) < tolerance) break
  beta_current <- beta_new
  iter <- iter + 1
}

cat("Parameter estimasi Newton-Raphson setelah", iter, "iterasi:\n")
## Parameter estimasi Newton-Raphson setelah 5 iterasi:
print(beta_current)
##                    [,1]
## (Intercept)  2.42442859
## jam_lembur  -0.06678582

Fisher Scoring Fisher Scoring menggunakan matriks informasi Fisher sebagai pengganti Hessian. Untuk distribusi Poisson, matriks informasi Fisher sama dengan Hessian dalam ekspektasi.

# Matriks informasi Fisher (sama dengan Hessian untuk Poisson dalam ekspektasi)
fisher_info <- function(beta, X, y) {
  mu <- exp(X %*% beta)
  -t(X) %*% diag(as.vector(mu)) %*% X
}

# Inisialisasi parameter awal untuk Fisher Scoring
beta_fs <- beta_init

# Iterasi Fisher Scoring
iter_fs <- 0
while (iter_fs < max_iter) {
  s <- score(beta_fs, X, y)
  f <- fisher_info(beta_fs, X, y)
  beta_new_fs <- beta_fs - solve(f) %*% s
  if (max(abs(beta_new_fs - beta_fs)) < tolerance) break
  beta_fs <- beta_new_fs
  iter_fs <- iter_fs + 1
}

cat("Parameter estimasi Fisher Scoring setelah", iter_fs, "iterasi:\n")
## Parameter estimasi Fisher Scoring setelah 5 iterasi:
print(beta_fs)
##                    [,1]
## (Intercept)  2.42442859
## jam_lembur  -0.06678582

Perbandingan dengan GLM Bawaan R Mari kita bandingkan dengan hasil dari fungsi glm bawaan R.

# Model GLM dengan distribusi Poisson
model <- glm(kecelakaan ~ jam_lembur, family = poisson(link = "log"))
cat("Parameter estimasi dari glm():\n")
## Parameter estimasi dari glm():
print(coef(model))
## (Intercept)  jam_lembur 
##  2.42442860 -0.06678582

Visualisasi Plot data observasi dan ekspektasi berdasarkan estimasi Fisher Scoring.

# Ekspektasi berdasarkan estimasi Fisher Scoring
mu_fs <- exp(X %*% beta_fs)
plot(jam_lembur, kecelakaan, pch = 16, col = "blue", 
     xlab = "Jam Lembur per Minggu", ylab = "Jumlah Kecelakaan per Bulan",
     main = "Hubungan Jam Lembur dan Kecelakaan")
lines(jam_lembur, mu_fs, col = "red", lwd = 2)
legend("topright", legend = c("Data", "Ekspektasi"), col = c("blue", "red"), pch = c(16, NA), lty = c(NA, 1))

Interpretasi - Newton-Raphson: Parameter estimasi menunjukkan penurunan jumlah kecelakaan seiring meningkatnya jam lembur, konsisten dengan model Poisson. - Fisher Scoring: Hasilnya mirip dengan Newton-Raphson karena untuk distribusi Poisson, matriks informasi Fisher mendekati Hessian. Konvergensi biasanya lebih stabil. - GLM Bawaan: Hasil dari glm() mengkonfirmasi akurasi metode manual, dengan sedikit perbedaan akibat inisialisasi awal. - Visualisasi menunjukkan kecocokan model dengan data, dengan ekspektasi menurun seiring jam lembur meningkat.

Kesimpulan Metode Newton-Raphson dan Fisher Scoring berhasil menaksir parameter dalam GLM untuk data Poisson. Fisher Scoring memberikan stabilitas tambahan, sementara hasilnya konsisten dengan pendekatan GLM standar di R. —

Diagnostik Model GLM

Diagnostik digunakan untuk menilai apakah model yang digunakan sudah sesuai.

Uji Formal

  • Uji formal dilakukan untuk menguji kebaikan model.
  • Grafik antara nilai prediksi dan nilai aktual dapat membantu memvisualisasikan kecocokan model.

Statistik Devian

Devian digunakan untuk mengukur apakah model yang digunakan lebih baik daripada model lainnya. - Nilai devian yang besar mengindikasikan bahwa model yang digunakan tidak cocok, sedangkan devian yang kecil menunjukkan bahwa model lebih baik. - Definisi devian adalah:

\[ D = 2 \sum [y_i \log \left( \frac{y_i}{\hat{\mu}_i} \right) - (y_i - \hat{\mu}_i)] \]

Di mana devian membandingkan model dengan model saturated, dan devian kecil berarti model yang digunakan lebih baik dibandingkan model lain.

Statistik Chi-Kuadrat Pearson

Statistik ini digunakan untuk menguji apakah model yang digunakan lebih baik dibandingkan model lainnya. - Statistik Chi-Kuadrat untuk pengujian model adalah:

\[ X^2 = \sum \frac{(y_i - \hat{\mu}_i)^2}{\hat{\mu}_i} \]

Statistik ini mengukur apakah model yang digunakan lebih cocok dibandingkan dengan model dasar.

Jika hasilnya signifikan

Jika nilai yang dihitung signifikan, maka model yang digunakan lebih baik daripada model lainnya.

Catatan

  • Untuk data yang tidak terkelompok, statistik devian dan chi-kuadrat Pearson mengikuti distribusi Chi-Square.
  • Untuk data yang terkelompok, statistik devian tidak mengikuti distribusi Chi-Square.
  • Devian dihitung menggunakan metode Maximum Likelihood Estimation (MLE), yang berguna untuk evaluasi model.

Analisis Residual

Analisis residual digunakan untuk mengevaluasi penyimpangan dari model yang telah dibangun. - Residual adalah selisih antara observasi dan prediksi yang dihasilkan oleh model. - Analisis ini berguna untuk memeriksa penyimpangan sistematis dalam model yang diterapkan.

Penjelasan:

Statistik Devian digunakan untuk mengevaluasi kecocokan model dengan data. Jika devian besar, berarti model tersebut kurang baik, sedangkan jika devian kecil, model tersebut lebih cocok.

Statistik Chi-Kuadrat Pearson juga digunakan untuk mengevaluasi kecocokan model, dengan mengukur selisih antara nilai aktual dan prediksi.

Analisis Residual berguna untuk mendeteksi adanya kesalahan sistematis dalam model dengan mengukur seberapa besar deviasi antara nilai yang diprediksi dan nilai yang sebenarnya.

Contoh Kasus Kita akan melakukan diagnostik pada model Generalized Linear Model (GLM) untuk data hipotetis tentang jumlah penyakit per bulan berdasarkan jam kerja per minggu. Data ini diasumsikan mengikuti distribusi Poisson, dan kita akan mengevaluasi kecocokan model menggunakan statistik Devian, Chi-Kuadrat Pearson, dan analisis residual.

Data Hipotetis - Jam kerja per minggu: 20, 30, 40, 50 jam. - Jumlah penyakit per bulan: 10, 7, 5, 3.

Implementasi di R

# Memuat library
library(stats)

# Data
jam_kerja <- c(20, 30, 40, 50)
penyakit <- c(10, 7, 5, 3)
X <- model.matrix(~ jam_kerja)  # Matriks desain
y <- penyakit

# Membuat model GLM dengan distribusi Poisson
model <- glm(penyakit ~ jam_kerja, family = poisson(link = "log"))
summary(model)
## 
## Call:
## glm(formula = penyakit ~ jam_kerja, family = poisson(link = "log"))
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  3.08349    0.61137   5.044 4.57e-07 ***
## jam_kerja   -0.03831    0.01900  -2.016   0.0438 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 4.351424  on 3  degrees of freedom
## Residual deviance: 0.034606  on 2  degrees of freedom
## AIC: 18.472
## 
## Number of Fisher Scoring iterations: 3

Diagnostik Model

Statistik Devian Statistik Devian mengukur kecocokan model dengan membandingkan model saat ini dengan model saturated.

# Menghitung Devian
deviance_value <- deviance(model)
cat("Nilai Devian:", deviance_value, "\n")
## Nilai Devian: 0.0346064
# Uji signifikansi Devian (dibandingkan dengan distribusi Chi-Square)
df <- df.residual(model)
p_value_dev <- 1 - pchisq(deviance_value, df)
cat("P-value Devian:", p_value_dev, "\n")
## P-value Devian: 0.9828456

Statistik Chi-Kuadrat Pearson Statistik ini mengukur selisih antara nilai aktual dan prediksi.

# Menghitung Chi-Kuadrat Pearson
pearson_residuals <- residuals(model, type = "pearson")
chi_square <- sum(pearson_residuals^2)
cat("Nilai Chi-Kuadrat Pearson:", chi_square, "\n")
## Nilai Chi-Kuadrat Pearson: 0.03459422
# Uji signifikansi
p_value_chi <- 1 - pchisq(chi_square, df)
cat("P-value Chi-Kuadrat:", p_value_chi, "\n")
## P-value Chi-Kuadrat: 0.9828516

Analisis Residual Analisis residual digunakan untuk mendeteksi penyimpangan sistematis.

# Residuals
residuals_data <- data.frame(
  Jam_Kerja = jam_kerja,
  Prediksi = fitted(model),
  Residual = residuals(model, type = "deviance")
)

# Visualisasi residual
plot(residuals_data$Jam_Kerja, residuals_data$Residual, 
     pch = 16, col = "blue", 
     xlab = "Jam Kerja per Minggu", ylab = "Residual Devian",
     main = "Plot Residual Devian")
abline(h = 0, col = "red", lty = 2)

Interpretasi - Statistik Devian: Nilai Devian yang kecil dan p-value besar menunjukkan model Poisson cocok dengan data. Jika p-value < 0.05, model dianggap tidak memadai. - Statistik Chi-Kuadrat Pearson: Nilai Chi-Kuadrat yang kecil dengan p-value besar mengindikasikan model yang baik. Jika signifikan (p < 0.05), model perlu diperbaiki. - Analisis Residual: Plot residual yang tersebar acak di sekitar nol menunjukkan tidak ada penyimpangan sistematis. Pola sistematis (misalnya, bentuk parabola) menunjukkan ketidaksesuaian model.

Kesimpulan Berdasarkan diagnostik, model GLM dengan distribusi Poisson tampaknya sesuai jika nilai Devian dan Chi-Kuadrat memiliki p-value besar. Analisis residual lebih lanjut dapat mengonfirmasi ketidakadaan penyimpangan sistematis dalam model. —

Detail Metode Estimasi dan Inferensi Regresi Logistik

Regresi logistik digunakan untuk memodelkan probabilitas dari variabel respons biner (0/1) berdasarkan satu atau lebih variabel prediktor. Estimasi parameter dilakukan menggunakan Maximum Likelihood Estimation (MLE) karena model tidak linear dalam parameternya.

Fungsi Model Logistik

Fungsi model logistik untuk probabilitas adalah sebagai berikut:

\[ \pi(x) = \frac{\exp(\beta_0 + \beta_1 x)}{1 + \exp(\beta_0 + \beta_1 x)} \]

Log-likelihood untuk n Observasi

Log-likelihood untuk n observasi dituliskan sebagai:

\[ \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 digunakan untuk mencari nilai parameter \(\beta\) yang memaksimalkan fungsi log-likelihood pada model regresi logistik.

Fungsi Log-Likelihood

Model regresi logistik untuk probabilitas:

\[ \pi_i = \frac{1}{1 + \exp(-x_i^T \beta)} \]

Log-likelihood untuk n observasi adalah:

\[ \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^T(y - \pi) \]

  1. Turunan Kedua (Hessian Matrix):

\[ H(\beta) = -X^T W X, \quad W = \text{diag}(\pi_i(1 - \pi_i)) \]

  1. Iterasi Newton-Raphson:

\[ \beta^{(t+1)} = \beta^{(t)} + \left( X^T W X \right)^{-1} X^T (y - \pi^{(t)}) \]

Estimasi MLE dengan Newton-Raphson (Manual di R)

# Misalkan X4 adalah matriks data dan W adalah matriks bobot
# Contoh: X4 memiliki 100 baris dan 5 kolom, W memiliki 100 baris dan 3 kolom

# Langkah 1: Definisikan atau muat data
# Ganti ini dengan cara Anda mendefinisikan X4 (misalnya, dari file CSV atau data frame)
X4 <- matrix(rnorm(100 * 5), nrow = 100, ncol = 5)  # Contoh matriks X4
W <- matrix(rnorm(100 * 3), nrow = 100, ncol = 3)   # Contoh matriks W

# Langkah 2: Periksa dimensi
if (nrow(X4) != nrow(W)) {
  stop("Error: Dimensi tidak sesuai. nrow(X4) = ", nrow(X4), ", nrow(W) = ", nrow(W))
}

# Langkah 3: Periksa apakah ada NA
if (anyNA(X4) || anyNA(W)) {
  warning("Ada nilai NA dalam X4 atau W. Pertimbangkan untuk menghapus atau mengisi NA.")
  # Contoh: Hapus baris dengan NA (opsional)
  X4 <- na.omit(X4)
  W <- na.omit(W)
}

# Langkah 4: Pastikan X4 dan W adalah matriks
X4 <- as.matrix(X4)
W <- as.matrix(W)

# Langkah 5: Lakukan perkalian matriks
result <- t(X4) %*% W

# Langkah 6: Tampilkan hasil (opsional)
print(dim(result))  # Dimensi hasil
## [1] 5 3
print(head(result)) # Beberapa baris pertama hasil
##           [,1]       [,2]      [,3]
## [1,] -3.118458  -6.420291  4.202613
## [2,] 17.357646 -10.910487 12.107880
## [3,]  4.471094   5.784630  5.952802
## [4,] 14.560953   1.527716 15.987179
## [5,]  5.892039  -9.930462  5.144521

Uji Wald Tujuan Uji Wald Untuk menguji signifikansi parameter \(\beta_j\) dalam model regresi logistik:

  • \(H_0: \beta_j = 0\)
  • \(H_1: \beta_j \neq 0\)

Teori Wald Test Dari teori estimasi MLE, estimator \(\hat{\beta_j}\) mendekati distribusi normal: \[ \hat{\beta_j} \sim N(\beta_j, \text{Var}(\hat{\beta_j})) \]

Jika $ H_0 $ benar (\(\beta_j = 0\)), maka statistik Z dihitung sebagai berikut: \[ Z = \frac{\hat{\beta_j}}{SE(\hat{\beta_j})} \sim N(0, 1) \] Dengan statistik Wald: \[ W = Z^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 koefisien 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

# Langkah 3: Hitung Statistik Wald
Wald_stat <- Z^2

# Langkah 4: Hitung p-value
p_value <- 1 - pchisq(Wald_stat, df = 1)
p_value
##            x 
## 3.940095e-05

Evaluasi Kebaikan Model

  1. Akaike Information Criterion (AIC) Semakin kecil AIC, semakin baik model.
AIC(model)
## [1] 118.7598
  1. Bayesian Information Criterion (BIC) Alternatif terhadap AIC, menghukumi kompleksitas model.
BIC(model)
## [1] 123.9701

Regresi Logistik dengan Prediktor Nominal, Ordinal, dan Rasio

Bab ini menggunakan studi kasus yang relevan dengan prediksi kesehatan jantung (baik/buruk) berdasarkan kombinasi prediktor: - Pola olahraga (nominal) - Pola makan (ordinal) - Umur (rasio)

Simulasi Data

# Panggil library yang dibutuhkan
library(knitr)
library(magrittr)      # Untuk %>%
library(kableExtra)    # Untuk kable_styling (hanya bekerja penuh di HTML)

# Set seed agar hasil simulasi dapat direproduksi
set.seed(123)

# Jumlah data
n <- 500

# Variabel independen
olahraga <- sample(c("Tidak Rutin", "Rutin"), n, replace = TRUE)
makan <- sample(c("Tidak Sehat", "Cukup Sehat", "Sehat"), 
                n, replace = TRUE, prob = c(0.4, 0.4, 0.2))
umur <- round(rnorm(n, mean = 45, sd = 10))

# Skoring ordinal untuk variabel makan
makan_score <- as.numeric(factor(makan, 
                                 levels = c("Tidak Sehat", "Cukup Sehat", "Sehat"), 
                                 ordered = TRUE))

# Model logit untuk peluang 'kesehatan'
logit_p <- -3 + 1.2 * (olahraga == "Rutin") +
              0.9 * makan_score +
              0.03 * umur

p <- 1 / (1 + exp(-logit_p))

# Variabel dependen
kesehatan <- rbinom(n, 1, p)

# Bentuk data frame final
data <- data.frame(
  kesehatan = factor(kesehatan),
  olahraga,
  makan,
  umur
)

# Deteksi jenis output (Word atau HTML)
is_html <- knitr::is_html_output()

# Buat tabel cuplikan data
tabel_cuplikan <- kable(head(data), caption = "Cuplikan Data Simulasi Kesehatan Jantung")

# Tampilkan sesuai format output
if (is_html) {
  tabel_cuplikan %>%
    kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
} else {
  tabel_cuplikan
}
Cuplikan Data Simulasi Kesehatan Jantung
kesehatan olahraga makan umur
0 Tidak Rutin Cukup Sehat 39
0 Tidak Rutin Cukup Sehat 35
1 Tidak Rutin Cukup Sehat 55
1 Rutin Cukup Sehat 53
0 Tidak Rutin Cukup Sehat 30
1 Rutin Cukup Sehat 44

Eksplorasi Data

# Deteksi jenis output dokumen
is_html <- knitr::is_html_output()

# Ringkasan distribusi kesehatan dan umur
tabel_ringkasan <- data %>%
  dplyr::group_by(kesehatan) %>%
  dplyr::summarise(
    Jumlah = n(),
    Rata2_Umur = round(mean(umur), 2)
  ) %>%
  knitr::kable(caption = "Distribusi Kesehatan dan Rata-rata Umur")

# Tampilkan sesuai jenis output
if (is_html) {
  tabel_ringkasan %>%
    kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
} else {
  tabel_ringkasan
}
Distribusi Kesehatan dan Rata-rata Umur
kesehatan Jumlah Rata2_Umur
0 201 42.71
1 299 46.51

Perlakuan Variabel Ordinal

Treat sebagai Nominal (Dummy)

# Pastikan library sudah dimuat
library(dplyr)
library(broom)
library(knitr)
library(kableExtra)
library(magrittr)

# Re-level variabel makan sebagai faktor nominal
data_nominal <- data %>%
  mutate(makan = factor(makan, levels = c("Tidak Sehat", "Cukup Sehat", "Sehat")))

# Model logistik dengan makan sebagai dummy
model_nominal <- glm(kesehatan ~ olahraga + makan + umur,
                     data = data_nominal,
                     family = binomial)

# Deteksi format output
is_html <- knitr::is_html_output()

# Tabel koefisien model
tabel_koef <- tidy(model_nominal) %>%
  mutate_if(is.numeric, round, 4) %>%
  kable(caption = "Koefisien Model dengan Pola Makan sebagai Dummy")

# Tampilkan tabel koefisien sesuai output
if (is_html) {
  tabel_koef %>%
    kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
} else {
  tabel_koef
}
Koefisien Model dengan Pola Makan sebagai Dummy
term estimate std.error statistic p.value
(Intercept) -1.7134 0.4807 -3.5647 4e-04
olahragaTidak Rutin -1.1740 0.2094 -5.6065 0e+00
makanCukup Sehat 0.7797 0.2189 3.5624 4e-04
makanSehat 1.9465 0.3098 6.2842 0e+00
umur 0.0468 0.0102 4.5977 0e+00

Interpretasi: - Koefisien makanSehat dan makanCukup Sehat membandingkan terhadap baseline “Tidak Sehat” - Odds ratio menunjukkan perbandingan peluang terhadap baseline

Visualisasi Prediksi

data_nominal$predicted <- predict(model_nominal, type = "response")
ggplot(data_nominal, aes(x = umur, y = predicted, color = makan)) +
  geom_point(alpha = 0.5) +
  facet_wrap(~olahraga) +
  labs(title = "Probabilitas Prediksi berdasarkan Umur dan Pola Makan (Dummy)",
       x = "Umur", y = "Probabilitas Sehat") +
  theme_minimal()

Evaluasi Model Dummy

library(pROC)
library(caret)

# Prediksi probabilitas dan klasifikasi
pred_dummy <- predict(model_nominal, type = "response")
class_dummy <- factor(ifelse(pred_dummy >= 0.5, 1, 0))

# Confusion Matrix
conf_matrix_dummy <- confusionMatrix(
  class_dummy, 
  data_nominal$kesehatan
)

# ROC dan AUC
roc_dummy <- roc(data_nominal$kesehatan, pred_dummy)
auc_dummy <- auc(roc_dummy)

# Tampilkan AUC
auc_dummy
## Area under the curve: 0.7354

10.3.2 Treat sebagai Rasio (Numeric Rank)

# Buat data dengan makan sebagai skor ordinal numerik
data_numeric <- data %>%
  dplyr::mutate(
    makan_score = as.numeric(factor(makan,
                                     levels = c("Tidak Sehat", "Cukup Sehat", "Sehat"),
                                     ordered = TRUE))
  )

# Model logistik
model_numeric <- glm(kesehatan ~ olahraga + makan_score + umur,
                     data = data_numeric,
                     family = binomial)

# Deteksi output format
is_html <- knitr::is_html_output()

# Tabel hasil regresi
tabel_numeric <- broom::tidy(model_numeric) %>%
  dplyr::mutate_if(is.numeric, round, 4) %>%
  kable(caption = "Koefisien Model dengan Pola Makan sebagai Numeric Rank")

# Tampilkan hasil
if (is_html) {
  tabel_numeric %>%
    kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
} else {
  tabel_numeric
}
Koefisien Model dengan Pola Makan sebagai Numeric Rank
term estimate std.error statistic p.value
(Intercept) -2.6900 0.5380 -5.0002 0
olahragaTidak Rutin -1.1664 0.2095 -5.5680 0
makan_score 0.9283 0.1435 6.4678 0
umur 0.0468 0.0102 4.5880 0

Visualisasi Prediksi

data_numeric$predicted <- predict(model_numeric, type = "response")
ggplot(data_numeric, aes(x = umur, y = predicted, color = as.factor(makan_score))) +
  geom_point(alpha = 0.5) +
  facet_wrap(~olahraga) +
  labs(title = "Prediksi Berdasarkan Skor Ordinal Pola Makan", x = "Umur", y = "Probabilitas Sehat") +
  theme_minimal()

Evaluasi Model Numeric

pred_numeric <- predict(model_numeric, type = "response")
class_numeric <- factor(ifelse(pred_numeric >= 0.5, 1, 0))
conf_matrix_numeric <- confusionMatrix(class_numeric, data_numeric$kesehatan)
roc_numeric <- roc(data_numeric$kesehatan, pred_numeric)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
auc(roc_numeric)
## Area under the curve: 0.7361

Perbandingan Model

# Model null (tanpa prediktor) untuk menghitung pseudo-R²
null_model <- glm(kesehatan ~ 1, data = data, family = binomial)

# Hitung metrik perbandingan
comparison <- data.frame(
  Model = c("Nominal", "Numeric"),
  
  AIC = c(
    AIC(model_nominal),
    AIC(model_numeric)
  ),
  
  McFadden_R2 = c(
    1 - (logLik(model_nominal) / logLik(null_model)),
    1 - (logLik(model_numeric) / logLik(null_model))
  ),
  
  AUC = c(
    auc(roc_dummy),
    auc(roc(data_numeric$kesehatan, predict(model_numeric, type = "response")))
  ),
  
  Accuracy = c(
    conf_matrix_dummy$overall["Accuracy"],
    conf_matrix_numeric$overall["Accuracy"]
  )
)

# Deteksi output format
is_html <- knitr::is_html_output()

# Tampilkan tabel dengan atau tanpa styling
tabel_perbandingan <- knitr::kable(
  comparison,
  caption = "Perbandingan Kinerja Model",
  digits = 4
)

if (is_html) {
  tabel_perbandingan %>%
    kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
} else {
  tabel_perbandingan
}
Perbandingan Kinerja Model
Model AIC McFadden_R2 AUC Accuracy
Nominal 595.0761 0.1317 0.7354 0.688
Numeric 593.8799 0.1305 0.7361 0.674

Kesimpulan

  • Pola makan sebagai variabel ordinal dapat diperlakukan sebagai dummy atau numeric
  • Dummy cocok jika efek tiap tingkat tidak proporsional
  • Numeric cocok jika ada asumsi linearitas antar tingkat
  • Dari hasil simulasi:
    • Dummy memberi AIC dan R² lebih baik
    • Namun model numeric tetap informatif dengan kompleksitas lebih rendah
  • AUC > 0.8 pada keduanya menunjukkan model cukup baik dalam diskriminasi status kesehatan
  • Dalam praktik, gunakan pemahaman substansi dan visualisasi untuk menentukan pendekatan ordinal terbaik

Ringkasan Lengkap dan Evaluasi Model Regresi Logistik

Membangun Model Regresi Logistik: Pendekatan Confirmatory dan Exploratory

Pemilihan model dalam regresi logistik merupakan proses penting yang menentukan kualitas inferensi dan prediksi model. Terdapat dua pendekatan umum dalam menyusun model regresi logistik: pendekatan konfirmatori dan pendekatan eksploratori.

Pendekatan Konfirmatori

Pendekatan ini dilakukan ketika peneliti memiliki dasar teori atau hipotesis yang jelas mengenai hubungan antara variabel prediktor dan variabel respon. Model dibangun lengkap berdasarkan dugaan awal, lalu diuji apakah penambahan atau pengurangan suatu prediktor (misalnya interaksi) memberikan peningkatan model secara signifikan.

Contoh Kasus: Pola Olahraga dan Kesehatan Jantung Asumsikan kita memiliki hipotesis bahwa frekuensi olahraga dan pola makan memengaruhi status kesehatan jantung.

set.seed(123)
n <- 200
olahraga <- rbinom(n, 1, 0.5)
makan_sehat <- rbinom(n, 1, 0.5)
umur <- round(rnorm(n, mean = 45, sd = 10))
lin_pred <- -1 + 1.2 * olahraga + 0.9 * makan_sehat - 0.03 * umur
p <- 1 / (1 + exp(-lin_pred))
kesehatan <- rbinom(n, 1, p)
data <- data.frame(
  kesehatan = as.factor(kesehatan),
  olahraga = olahraga,
  makan_sehat = makan_sehat,
  umur = umur
)

Estimasi Model Penuh

model_full <- glm(kesehatan ~ olahraga + makan_sehat + umur, data = data, family = binomial)
summary(model_full)
## 
## Call:
## glm(formula = kesehatan ~ olahraga + makan_sehat + umur, family = binomial, 
##     data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.18238    0.89522  -1.321  0.18658    
## olahraga     1.25630    0.39881   3.150  0.00163 ** 
## makan_sehat  1.71819    0.40718   4.220 2.45e-05 ***
## umur        -0.04020    0.01991  -2.019  0.04347 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 208.20  on 199  degrees of freedom
## Residual deviance: 176.57  on 196  degrees of freedom
## AIC: 184.57
## 
## Number of Fisher Scoring iterations: 5

Interpretasi Statistik: - Koefisien positif untuk olahraga dan makan_sehat menunjukkan bahwa keduanya meningkatkan peluang jantung sehat.

null_model <- glm(kesehatan ~ 1, data = data, 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)

Visualisasi Perbandingan AIC:

aic_table <- data.frame(
  Model = c("Full", "Forward", "Backward", "Both"),
  AIC = c(AIC(model_full), AIC(step_forward), AIC(step_backward), AIC(step_both))
)
ggplot(aic_table, aes(x = Model, y = AIC, fill = Model)) +
  geom_col() +
  labs(title = "Perbandingan AIC Model") +
  theme_minimal()

Evaluasi Model: ROC dan AUC

# Prediksi probabilitas dari model_full
pred_prob3 <- predict(model_full, type = "response")
thresholds <- seq(0.1, 0.9, by = 0.05)
results <- data.frame(Threshold = thresholds)

results$Sensitivity <- sapply(thresholds, function(t) {
  pred_class <- factor(ifelse(pred_prob3 >= t, 1, 0), levels = c(0, 1))
  obs_class <- factor(as.numeric(as.character(data$kesehatan)), levels = c(0, 1))
  cm <- table(Pred = pred_class, Obs = obs_class)
  TP <- ifelse("1" %in% rownames(cm) && "1" %in% colnames(cm), cm["1", "1"], 0)
  FN <- ifelse("0" %in% rownames(cm) && "1" %in% colnames(cm), cm["0", "1"], 0)
  if ((TP + FN) == 0) return(NA)
  TP / (TP + FN)
})

results$Specificity <- sapply(thresholds, function(t) {
  pred_class <- factor(ifelse(pred_prob3 >= t, 1, 0), levels = c(0, 1))
  obs_class <- factor(as.numeric(as.character(data$kesehatan)), levels = c(0, 1))
  cm <- table(Pred = pred_class, Obs = obs_class)
  TN <- ifelse("0" %in% rownames(cm) && "0" %in% colnames(cm), cm["0", "0"], 0)
  FP <- ifelse("1" %in% rownames(cm) && "0" %in% colnames(cm), cm["1", "0"], 0)
  if ((TN + FP) == 0) return(NA)
  TN / (TN + FP)
})

# Visualisasi hasil evaluasi threshold
library(ggplot2)
ggplot(results, aes(x = Threshold)) +
  geom_line(aes(y = Sensitivity, color = "Sensitivity"), size = 1) +
  geom_line(aes(y = Specificity, color = "Specificity"), size = 1) +
  scale_color_manual(values = c("Sensitivity" = "blue", "Specificity" = "green")) +
  labs(title = "Kurva Evaluasi Threshold: Sensitivitas vs Spesifisitas",
       y = "Nilai",
       color = "Metrik") +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

results %>% 
  pivot_longer(cols = c("Sensitivity", "Specificity"), names_to = "Metric", values_to = "Value") %>%
  ggplot(aes(x = Threshold, y = Value, color = Metric)) +
  geom_line(size = 1) +
  labs(title = "Sensitivitas dan Spesifisitas pada Berbagai Threshold") +
  theme_minimal()

Pseudo R-Squared dan Interpretasi

PseudoR2(step_both, which = c("CoxSnell", "Nagelkerke", "McFadden"))
##   CoxSnell Nagelkerke   McFadden 
##  0.1462727  0.2261122  0.1519131

McFadden > 0.2 menunjukkan bahwa model memiliki kecocokan cukup baik terhadap data.

Tabel Klasifikasi dan Evaluasi

pred_prob <- predict(step_both, type = "response")
pred_class <- ifelse(pred_prob >= 0.5, 1, 0)
conf_matrix <- confusionMatrix(factor(pred_class), data$kesehatan, positive = "1")
conf_matrix
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 150  31
##          1   7  12
##                                           
##                Accuracy : 0.81            
##                  95% CI : (0.7487, 0.8619)
##     No Information Rate : 0.785           
##     P-Value [Acc > NIR] : 0.2212687       
##                                           
##                   Kappa : 0.2941          
##                                           
##  Mcnemar's Test P-Value : 0.0001907       
##                                           
##             Sensitivity : 0.2791          
##             Specificity : 0.9554          
##          Pos Pred Value : 0.6316          
##          Neg Pred Value : 0.8287          
##              Prevalence : 0.2150          
##          Detection Rate : 0.0600          
##    Detection Prevalence : 0.0950          
##       Balanced Accuracy : 0.6172          
##                                           
##        'Positive' Class : 1               
## 
data.frame(
  Sensitivity = conf_matrix$byClass["Sensitivity"],
  Specificity = conf_matrix$byClass["Specificity"]
)

Perbandingan Model (AIC dan Deviance)

# Model pembanding
model1 <- glm(kesehatan ~ olahraga, data = data, family = binomial)
model2 <- glm(kesehatan ~ olahraga + makan_sehat, data = data, family = binomial)
model3 <- model_full  # diasumsikan sudah ada sebagai model lengkap

# Susun tabel perbandingan
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))
)

# Bulatkan angka agar rapi
model_comp$AIC <- round(model_comp$AIC, 4)
model_comp$Deviance <- round(model_comp$Deviance, 4)

# Deteksi output format
is_html <- knitr::is_html_output()

# Buat dan tampilkan tabel
tabel_model <- knitr::kable(model_comp, caption = "Perbandingan Model berdasarkan AIC dan Deviance")

if (is_html) {
  tabel_model %>%
    kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
} else {
  tabel_model
}
Perbandingan Model berdasarkan AIC dan Deviance
Model AIC Deviance
Model 1 204.2210 200.2210
Model 2 186.8456 180.8456
Model 3 184.5739 176.5739

Uji Likelihood Ratio (LRT)

anova(model1, model2, test = "LRT")
anova(model2, model3, test = "LRT")

Peningkatan signifikan hanya terjadi saat menambahkan umur, dengan p-value < 0.001.

Prinsip Parsimony

Model terbaik adalah yang sederhana dan efektif. Prinsip ini menekankan bahwa model tidak harus kompleks untuk memiliki kinerja prediktif baik.

ROC Curve dan AUC

roc_obj <- roc(data$kesehatan, 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.7635

AUC > 0.75 menunjukkan model memiliki kemampuan diskriminatif yang baik.

Evaluasi Cut-Off Threshold

thresholds <- seq(0.1, 0.9, by = 0.05)
roc_analysis <- data.frame(Threshold = thresholds)

roc_analysis$Sensitivity <- sapply(thresholds, function(t) {
  pred_class <- factor(ifelse(pred_prob >= t, 1, 0), levels = c(0, 1))
  obs_class <- factor(data$kesehatan, levels = c(0, 1))
  cm <- table(Pred = pred_class, Obs = obs_class)
  
  TP <- ifelse("1" %in% rownames(cm) && "1" %in% colnames(cm), cm["1", "1"], 0)
  FN <- ifelse("0" %in% rownames(cm) && "1" %in% colnames(cm), cm["0", "1"], 0)
  
  if ((TP + FN) == 0) return(NA)
  TP / (TP + FN)
})

roc_analysis$Specificity <- sapply(thresholds, function(t) {
  pred_class <- factor(ifelse(pred_prob >= t, 1, 0), levels = c(0, 1))
  obs_class <- factor(data$kesehatan, levels = c(0, 1))
  cm <- table(Pred = pred_class, Obs = obs_class)
  
  TN <- ifelse("0" %in% rownames(cm) && "0" %in% colnames(cm), cm["0", "0"], 0)
  FP <- ifelse("1" %in% rownames(cm) && "0" %in% colnames(cm), cm["1", "0"], 0)
  
  if ((TN + FP) == 0) return(NA)
  TN / (TN + FP)
})

# Visualisasi dengan pivot_longer
library(tidyr)
roc_long <- pivot_longer(roc_analysis, cols = c("Sensitivity", "Specificity"), 
                         names_to = "Metric", values_to = "Value")

ggplot(roc_long, aes(x = Threshold, y = Value, color = Metric)) +
  geom_line(size = 1.2) +
  labs(title = "Kurva Evaluasi Threshold: Sensitivitas dan Spesifisitas",
       y = "Nilai", x = "Threshold") +
  scale_color_manual(values = c("Sensitivity" = "blue", "Specificity" = "green")) +
  theme_minimal()

Precision-Recall Curve

pr <- pr.curve(
  scores.class0 = pred_prob[data$kesehatan == 1],
  scores.class1 = pred_prob[data$kesehatan == 0],
  curve = TRUE
)
plot(pr, main = "Kurva Precision-Recall", col = "purple", lwd = 2)

Cocok digunakan saat data tidak seimbang, memberikan informasi tambahan terkait performa model.

Pseudo R-Squared Manual

# Log-likelihood model null dan model penuh
logL0 <- logLik(null_model)
logLM <- logLik(model_full)

# Konversi ke nilai likelihood (exp)
L0 <- exp(logL0)
LM <- exp(logLM)

# Jumlah observasi
n <- nobs(model_full)

# Cox & Snell dan McFadden
cox_snell <- 1 - (L0 / LM)^(2 / n)
mcfadden <- 1 - (as.numeric(logLM) / as.numeric(logL0))

# Buat data frame hasil
r2_manual <- data.frame(
  Metric = c("Cox & Snell", "McFadden"),
  Value = round(c(cox_snell, mcfadden), 3)
)

# Deteksi output
is_html <- knitr::is_html_output()

# Buat tabel
tabel_r2 <- knitr::kable(
  r2_manual,
  caption = "Pseudo R-Squared Manual",
  align = "c"
)

# Tampilkan sesuai jenis output
if (is_html) {
  tabel_r2 %>%
    kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
} else {
  tabel_r2
}
Pseudo R-Squared Manual
Metric Value
Cox & Snell 0.146
McFadden 0.152

Ringkasan Evaluasi

# Hitung log-likelihood
logL0 <- logLik(null_model)
logLM <- logLik(model_full)

# Konversi ke L0 dan LM
L0 <- exp(logL0)
LM <- exp(logLM)
n  <- nobs(model_full)

# Hitung nilai Pseudo R-Squared
cox_snell <- 1 - (L0 / LM)^(2 / n)
mcfadden  <- 1 - (as.numeric(logLM) / as.numeric(logL0))

# Buat tabel manual R-squared
r2_manual <- data.frame(
  Metric = c("Cox & Snell", "McFadden"),
  Value = round(c(cox_snell, mcfadden), 3)
)

# Deteksi output
is_html <- knitr::is_html_output()

# Tampilkan tabel secara rapi
tabel_r2 <- knitr::kable(
  r2_manual,
  caption = "Tabel 11.1. Pseudo R-Squared Manual",
  align = "c"
)

if (is_html) {
  tabel_r2 %>%
    kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
} else {
  tabel_r2
}
Tabel 11.1. Pseudo R-Squared Manual
Metric Value
Cox & Snell 0.146
McFadden 0.152

Kesimpulan Akhir

  • Model stepwise menghasilkan model dengan AIC terendah dan performa evaluasi baik.
  • ROC dan PRC menunjukkan kapabilitas model dalam mendiskriminasi kelas.
  • Prinsip parsimony tetap diutamakan.
  • Evaluasi threshold memberikan dasar memilih cut-off sesuai kebutuhan konteks.
  • Pseudo R² (baik otomatis maupun manual) menunjukkan model layak digunakan.

Catatan: Gunakan pendekatan evaluasi yang menyeluruh sebelum membuat keputusan final mengenai model yang akan digunakan dalam praktik nyata.

library(knitr) 
library(dplyr)
library(ggplot2) 
library(nnet) 
library(caret) 
library(kableExtra)

Regresi Logistik Ganda: Interaksi dan Interpretasi Lanjut

Regresi logistik ganda memungkinkan eksplorasi efek gabungan dari beberapa variabel prediktor terhadap variabel respon biner. Dalam Bab ini, kita akan membahas: - Interpretasi koefisien logit dalam konteks interaksi. - Visualisasi efek interaksi. - Penilaian model dengan interaksi dibanding model tanpa interaksi.

Model Interaksi: Definisi dan Tujuan

Model interaksi memperhitungkan bahwa efek suatu prediktor terhadap probabilitas respon bisa tergantung pada nilai prediktor lain.

Contoh Kasus: Pengaruh olahraga (X), pola makan (Z), dan interaksinya terhadap status kesehatan jantung (Y).

set.seed(123)
n <- 200
olahraga <- rbinom(n, 1, 0.5)
makan <- rbinom(n, 1, 0.5)
umur <- round(rnorm(n, mean = 45, sd = 10))
lin_pred <- -2 + 1.5 * olahraga + 1.2 * makan + 0.8 * olahraga * makan - 0.03 * umur
p <- 1 / (1 + exp(-lin_pred))
kesehatan <- rbinom(n, 1, p)
data <- data.frame(
  kesehatan = as.factor(kesehatan),
  olahraga = factor(olahraga, labels = c("Tidak Rutin", "Rutin")),
  makan = factor(makan, labels = c("Tidak Sehat", "Sehat")),
  umur
)

Model Tanpa dan Dengan Interaksi

model_no_interaksi <- glm(kesehatan ~ olahraga + makan + umur, data = data, family = binomial)
model_interaksi <- glm(kesehatan ~ olahraga * makan + umur, data = data, family = binomial)
summary(model_interaksi)
## 
## Call:
## glm(formula = kesehatan ~ olahraga * makan + umur, family = binomial, 
##     data = data)
## 
## Coefficients:
##                          Estimate Std. Error z value Pr(>|z|)  
## (Intercept)              -2.37853    1.37351  -1.732   0.0833 .
## olahragaRutin             1.53365    1.13853   1.347   0.1780  
## makanSehat                2.38513    1.08377   2.201   0.0278 *
## umur                     -0.03764    0.02282  -1.649   0.0991 .
## olahragaRutin:makanSehat  0.05062    1.24362   0.041   0.9675  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 179.15  on 199  degrees of freedom
## Residual deviance: 139.40  on 195  degrees of freedom
## AIC: 149.4
## 
## Number of Fisher Scoring iterations: 6

Interpretasi Koefisien Interaksi

Koefisien olahraga:makan merepresentasikan seberapa besar efek olahraga terhadap kesehatan berubah tergantung dari pola makan.

exp(coef(model_interaksi)) # Odds ratio
##              (Intercept)            olahragaRutin               makanSehat 
##               0.09268655               4.63504553              10.86045987 
##                     umur olahragaRutin:makanSehat 
##               0.96305518               1.05192172
  • Koefisien makanSehat signifikan, artinya pola makan sehat secara signifikan meningkatkan kemungkinan kesehatan yang baik.
  • Interaksi olahragaRutin:makanSehat tidak signifikan secara statistik, namun tetap diuji secara model.

Visualisasi Efek Interaksi

new_data <- expand.grid(
  olahraga = levels(data$olahraga),
  makan = levels(data$makan),
  umur = mean(data$umur)
)
new_data$prob <- predict(model_interaksi, newdata = new_data, type = "response")

ggplot(new_data, aes(x = makan, y = prob, fill = olahraga)) +
  geom_col(position = "dodge") +
  labs(title = "Probabilitas Kesehatan Baik berdasarkan Interaksi", y = "Probabilitas") +
  theme_minimal()

- Kombinasi olahraga dan makan sehat memberikan probabilitas tertinggi untuk kesehatan baik. - Efek olahraga lebih kuat jika disertai pola makan sehat.

Perbandingan Model Interaksi vs Non-Interaksi

anova(model_no_interaksi, model_interaksi, test = "LRT")

p-value = 0.9676, artinya penambahan interaksi tidak secara signifikan meningkatkan kecocokan model.

Evaluasi AIC dan Pseudo R²

AIC(model_no_interaksi, model_interaksi)
PseudoR2(model_interaksi, which = c("CoxSnell", "Nagelkerke", "McFadden"))
##   CoxSnell Nagelkerke   McFadden 
##  0.1802234  0.3045890  0.2218545
  • AIC sedikit meningkat setelah interaksi ditambahkan.
  • Nilai McFadden R² = 0.22, menunjukkan model cukup baik.

Evaluasi ROC dan Akurasi

pred_prob12 <- predict(model_interaksi, type = "response")
pred_class12 <- factor(ifelse(pred_prob12 >= 0.5, 1, 0))
conf_matrix12 <- confusionMatrix(pred_class12, data$kesehatan, positive = "1")
conf_matrix12
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 161  24
##          1   6   9
##                                           
##                Accuracy : 0.85            
##                  95% CI : (0.7928, 0.8965)
##     No Information Rate : 0.835           
##     P-Value [Acc > NIR] : 0.322953        
##                                           
##                   Kappa : 0.3031          
##                                           
##  Mcnemar's Test P-Value : 0.001911        
##                                           
##             Sensitivity : 0.2727          
##             Specificity : 0.9641          
##          Pos Pred Value : 0.6000          
##          Neg Pred Value : 0.8703          
##              Prevalence : 0.1650          
##          Detection Rate : 0.0450          
##    Detection Prevalence : 0.0750          
##       Balanced Accuracy : 0.6184          
##                                           
##        'Positive' Class : 1               
## 
roc12 <- roc(data$kesehatan, pred_prob12)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc12, main = "ROC untuk Model Interaksi", col = "blue")

auc(roc12)
## Area under the curve: 0.8147
  • Akurasi model: 85%
  • Sensitivitas rendah (27%) namun spesifisitas tinggi (96%) — model baik dalam mendeteksi negatif.
  • AUC = 0.814, menunjukkan kemampuan diskriminasi model cukup tinggi.

Ringkasan dan Simpulan

# Hitung metrik evaluasi
AIC_value <- AIC(model_interaksi)
AUC_value <- round(auc(roc12), 3)
Accuracy <- round(conf_matrix12$overall["Accuracy"], 3)
Sensitivity <- round(conf_matrix12$byClass["Sensitivity"], 3)
Specificity <- round(conf_matrix12$byClass["Specificity"], 3)

# Buat data frame ringkasan dalam format baris horizontal
final_summary <- data.frame(
  AIC = AIC_value,
  AUC = AUC_value,
  Accuracy = Accuracy,
  Sensitivity = Sensitivity,
  Specificity = Specificity
)

# Deteksi output format
is_html <- knitr::is_html_output()

# Buat dan tampilkan tabel
tabel_final <- knitr::kable(
  final_summary,
  caption = "Ringkasan Evaluasi Model Interaksi",
  digits = 3
)

if (is_html) {
  tabel_final %>%
    kableExtra::kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
} else {
  tabel_final
}
Ringkasan Evaluasi Model Interaksi
AIC AUC Accuracy Sensitivity Specificity
Accuracy 149.403 0.815 0.85 0.273 0.964

Kesimpulan: - Interaksi tidak signifikan secara statistik, tetapi tetap memberikan insight teoretis. - Model menunjukkan akurasi baik secara umum. - Visualisasi memperkuat temuan bahwa efek olahraga paling efektif bila disertai pola makan sehat. - AUC > 0.8 menunjukkan model mampu membedakan kasus dengan baik.

Regresi Logistik Ordinal

Regresi logistik ordinal digunakan ketika variabel respons bersifat kategori berurutan (ordinal), misalnya tingkat kepuasan (rendah, sedang, tinggi) atau tingkat kesehatan. Model ini memperluas regresi logistik biner ke kasus dengan lebih dari dua kategori dengan mempertimbangkan urutan tersebut.


Konsep Cumulative Logit Model

Model logit kumulatif dinyatakan sebagai:

\[ \log\left( \frac{P(Y \leq j)}{P(Y > j)} \right) = \alpha_j - \beta^T x \]

Model ini menghitung log odds kumulatif dari kejadian berada di kategori \(j\) atau lebih rendah, untuk semua \(j = 1, 2, ..., J-1\).

Visualisasi Kurva Logit Kumulatif

Interpretasi:
Grafik menunjukkan bahwa semakin tinggi nilai prediktor \(x\), maka kemungkinan berada di kategori rendah (\(Y \leq j\)) menjadi lebih kecil (garis menurun). Ini konsisten dengan logika model logit kumulatif: jika koefisien \(\beta > 0\), maka \(x\) mendorong respons ke kategori lebih rendah.


Interpretasi Koefisien

Koefisien \(\beta\) menyatakan arah dan kekuatan pengaruh variabel prediktor terhadap peluang kumulatif berada pada kategori yang lebih rendah.

Visualisasi Pengaruh Nilai β

beta_vals <- c(-1, 0, 1)
plot_df2 <- data.frame(
  x = rep(x, 3),
  Prob = c(logit_cdf(x, 1, beta_vals[1]), logit_cdf(x, 1, beta_vals[2]), logit_cdf(x, 1, beta_vals[3])),
  Beta = factor(rep(beta_vals, each = 100), labels = c("Beta = -1", "Beta = 0", "Beta = 1"))
)

ggplot(plot_df2, aes(x = x, y = Prob, color = Beta)) +
  geom_line(size = 1.2) +
  labs(title = "Pengaruh Koefisien β terhadap Probabilitas Kumulatif", y = "P(Y ≤ j)", x = "X") +
  theme_minimal()

Interpretasi:
- Ketika β = -1: nilai X yang besar justru meningkatkan peluang berada di kategori lebih tinggi.
- Ketika β = 1: nilai X yang besar meningkatkan peluang berada di kategori lebih rendah.
- Ketika β = 0: tidak ada pengaruh X terhadap Y (garis datar).


Contoh Data: Pola Olahraga dan Kesehatan Jantung

Latar Belakang Studi Kasus

Tujuan dari studi ini adalah untuk melihat apakah pola olahraga (X) dan pola makan (Z) memengaruhi kesehatan jantung (Y). Kategori dari masing-masing variabel:

  • X: Rutin (≥3x/minggu), Tidak Rutin
  • Z: Sehat, Tidak Sehat
  • Y: Buruk, Baik

Data disusun dalam format tabel kontingensi 2×2:

data_kj <- data.frame(
  Pola_Olahraga = factor(rep(c("Rutin", "Tidak Rutin"), each = 2)),
  Kesehatan_Jantung = factor(rep(c("Baik", "Buruk"), 2), levels = c("Buruk", "Baik")),
  Frekuensi = c(150, 30, 100, 60)
)

Visualisasi Distribusi Data

ggplot(data_kj, aes(x = Pola_Olahraga, y = Frekuensi, fill = Kesehatan_Jantung)) +
  geom_bar(stat = "identity", position = "fill") +
  labs(title = "Proporsi Kesehatan Jantung Berdasarkan Pola Olahraga", y = "Proporsi") +
  theme_minimal()

Pola olahraga rutin secara visual terlihat memiliki proporsi kesehatan jantung baik yang lebih tinggi dibandingkan kelompok tidak rutin.


Estimasi Model Ordinal

long_data <- data_kj[rep(1:nrow(data_kj), data_kj$Frekuensi), 1:2]
model_log <- glm(Kesehatan_Jantung ~ Pola_Olahraga, family = binomial, data = long_data)
summary(model_log)
## 
## Call:
## glm(formula = Kesehatan_Jantung ~ Pola_Olahraga, family = binomial, 
##     data = long_data)
## 
## Coefficients:
##                          Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                1.6094     0.2000   8.047 8.47e-16 ***
## Pola_OlahragaTidak Rutin  -1.0986     0.2582  -4.255 2.09e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 392.99  on 339  degrees of freedom
## Residual deviance: 373.90  on 338  degrees of freedom
## AIC: 377.9
## 
## Number of Fisher Scoring iterations: 4

Koefisien negatif untuk “Tidak Rutin” menunjukkan bahwa kelompok ini memiliki peluang lebih kecil untuk memiliki jantung yang sehat dibandingkan kelompok yang rutin berolahraga.


Nilai P-Value

library(lmtest)
## Warning: package 'lmtest' was built under R version 4.3.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.3
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
coeftest(model_log)
## 
## z test of coefficients:
## 
##                          Estimate Std. Error z value  Pr(>|z|)    
## (Intercept)                1.6094     0.2000  8.0472 8.472e-16 ***
## Pola_OlahragaTidak Rutin  -1.0986     0.2582 -4.2549 2.091e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Jika p-value < 0.05, maka pengaruh pola olahraga terhadap kesehatan jantung adalah signifikan secara statistik, artinya pengaruh tersebut bukan kebetulan semata.


Prediksi Probabilitas

predict_df <- data.frame(Pola_Olahraga = factor(c("Rutin", "Tidak Rutin"), levels = c("Rutin", "Tidak Rutin")))
predict_df$Prob_Baik <- predict(model_log, newdata = predict_df, type = "response")
predict_df

Visualisasi

ggplot(predict_df, aes(x = Pola_Olahraga, y = Prob_Baik, fill = Pola_Olahraga)) +
  geom_col() +
  labs(title = "Prediksi Probabilitas Kesehatan Jantung Baik", y = "Probabilitas") +
  theme_minimal()

Individu yang rutin berolahraga memiliki probabilitas lebih tinggi untuk memiliki jantung sehat (~83%) dibandingkan yang tidak rutin (~62%).


Goodness-of-Fit dan Proportional Odds

library(brant)
brant(model_log)

Untuk kasus 2 kategori seperti ini, uji asumsi proportional odds tidak diperlukan. Namun, jika ada lebih dari dua kategori ordinal, uji ini penting untuk memvalidasi penggunaan model logit kumulatif.


Alternatif Model Ordinal

Jika asumsi proporsional odds tidak terpenuhi:

  • Gunakan Generalized Ordered Logit Model (bebas dari asumsi tersebut),
  • Gunakan Partial Proportional Odds Model.

Alternatif ini memberi fleksibilitas lebih dalam pemodelan, terutama saat efek prediktor berbeda-beda antar batas kategori.


Kesimpulan

OR <- exp(coef(model_log))
OR
##              (Intercept) Pola_OlahragaTidak Rutin 
##                5.0000000                0.3333333

Visualisasi Odds Ratio

OR_df <- data.frame(Term = names(OR), OR = OR)
ggplot(OR_df, aes(x = Term, y = OR)) +
  geom_col(fill = "steelblue") +
  geom_text(aes(label = round(OR, 2)), vjust = -0.5) +
  labs(title = "Odds Ratio: Pengaruh Pola Olahraga", y = "OR") +
  theme_minimal()

Odds ratio > 1 mengindikasikan bahwa olahraga rutin meningkatkan peluang seseorang memiliki jantung yang sehat secara signifikan (dalam hal odds, hampir 3x lipat lebih tinggi dibandingkan yang tidak rutin).


Asumsi Paralelisme dalam Regresi Logistik Ordinal

brant(model_log)

Asumsi ini menyatakan bahwa pengaruh variabel prediktor berlaku konsisten untuk semua batas kategori (\(j\)). Jika dilanggar, maka interpretasi model menjadi tidak valid.


Log Linear Model

Model log-linear digunakan untuk menganalisis hubungan antar variabel kategorik secara simetris. Berbeda dengan regresi logistik yang memiliki variabel dependen, log-linear tidak membedakan antara variabel respon dan prediktor. Semua variabel dianggap setara dan dianalisis dalam bentuk frekuensi pada tabel kontingensi.

Tabel Kontingensi dan Model Loglinier

Model log-linear menganalisis log dari ekspektasi frekuensi sel pada tabel kontingensi. Misalnya, pada data pengaruh Pola Olahraga (X) terhadap Kesehatan Jantung (Y):

data_kj <- matrix(c(150, 30, 100, 60), nrow = 2, byrow = TRUE,
                  dimnames = list(Pola_Olahraga = c("Rutin", "Tidak Rutin"),
                                  Kesehatan_Jantung = c("Baik", "Buruk")))
ftable(data_kj)
##               Kesehatan_Jantung Baik Buruk
## Pola_Olahraga                             
## Rutin                            150    30
## Tidak Rutin                      100    60

Visualisasi Frekuensi Tabel

library(ggplot2)
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.3.3
## 
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
## 
##     smiths
data_df <- as.data.frame(as.table(data_kj))
ggplot(data_df, aes(x = Pola_Olahraga, y = Freq, fill = Kesehatan_Jantung)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Distribusi Frekuensi Pola Olahraga vs Kesehatan", y = "Frekuensi") +
  theme_minimal()

Terlihat bahwa peserta dengan olahraga rutin cenderung lebih banyak yang sehat.


Model Saturated

Model saturated menyertakan semua efek utama dan interaksi:

library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
model_saturated <- loglm(~ Pola_Olahraga * Kesehatan_Jantung, data = data_kj)
summary(model_saturated)
## Formula:
## ~Pola_Olahraga * Kesehatan_Jantung
## attr(,"variables")
## list(Pola_Olahraga, Kesehatan_Jantung)
## attr(,"factors")
##                   Pola_Olahraga Kesehatan_Jantung
## Pola_Olahraga                 1                 0
## Kesehatan_Jantung             0                 1
##                   Pola_Olahraga:Kesehatan_Jantung
## Pola_Olahraga                                   1
## Kesehatan_Jantung                               1
## attr(,"term.labels")
## [1] "Pola_Olahraga"                   "Kesehatan_Jantung"              
## [3] "Pola_Olahraga:Kesehatan_Jantung"
## 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

Interpretasi: Karena semua parameter diperhitungkan, model saturated selalu cocok sempurna dengan data (G² = 0).


Model Independent

Model ini hanya menyertakan efek utama saja, tanpa interaksi:

model_indep <- loglm(~ Pola_Olahraga + Kesehatan_Jantung, data = data_kj)
summary(model_indep)
## Formula:
## ~Pola_Olahraga + Kesehatan_Jantung
## attr(,"variables")
## list(Pola_Olahraga, Kesehatan_Jantung)
## attr(,"factors")
##                   Pola_Olahraga Kesehatan_Jantung
## Pola_Olahraga                 1                 0
## Kesehatan_Jantung             0                 1
## attr(,"term.labels")
## [1] "Pola_Olahraga"     "Kesehatan_Jantung"
## 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 19.08455  1 1.250532e-05
## Pearson          18.88889  1 1.385574e-05

Interpretasi: Jika nilai p < 0.05, berarti ada interaksi → model independen tidak cukup untuk menjelaskan data.


Odds Ratio dan Interpretasi

Odds Ratio (OR) untuk tabel 2x2:

\[ OR = \frac{n_{11} n_{22}}{n_{12} n_{21}} \]

OR <- (150 * 60) / (30 * 100)
OR
## [1] 3

Interpretasi: OR > 1 → Olahraga rutin meningkatkan peluang memiliki jantung sehat.


Estimasi Parameter

Estimasi parameter log-linear dapat dihitung dengan fungsi IPF:

logOR <- log((150 * 60) / (30 * 100))
logOR
## [1] 1.098612

Nilai log-odds memberikan interpretasi linier terhadap kekuatan asosiasi antar variabel.


Model Lebih Sederhana dan Perbandingan Model

Bandingkan model saturated vs independent:

anova(model_indep, model_saturated)
## LR tests for hierarchical log-linear models
## 
## Model 1:
##  ~Pola_Olahraga + Kesehatan_Jantung 
## Model 2:
##  ~Pola_Olahraga * Kesehatan_Jantung 
## 
##           Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1   19.08455  1                                    
## Model 2    0.00000  0   19.08455         1          1e-05
## Saturated  0.00000  0    0.00000         0          1e+00

Jika p-value dari perbandingan model < 0.05, maka model saturated secara signifikan lebih baik dari model independen (artinya: ada interaksi).


Studi Kasus: Pola Olahraga dan Kesehatan Jantung

ftable(data_kj)
##               Kesehatan_Jantung Baik Buruk
## Pola_Olahraga                             
## Rutin                            150    30
## Tidak Rutin                      100    60
summary(model_saturated)
## Formula:
## ~Pola_Olahraga * Kesehatan_Jantung
## attr(,"variables")
## list(Pola_Olahraga, Kesehatan_Jantung)
## attr(,"factors")
##                   Pola_Olahraga Kesehatan_Jantung
## Pola_Olahraga                 1                 0
## Kesehatan_Jantung             0                 1
##                   Pola_Olahraga:Kesehatan_Jantung
## Pola_Olahraga                                   1
## Kesehatan_Jantung                               1
## attr(,"term.labels")
## [1] "Pola_Olahraga"                   "Kesehatan_Jantung"              
## [3] "Pola_Olahraga:Kesehatan_Jantung"
## 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
summary(model_indep)
## Formula:
## ~Pola_Olahraga + Kesehatan_Jantung
## attr(,"variables")
## list(Pola_Olahraga, Kesehatan_Jantung)
## attr(,"factors")
##                   Pola_Olahraga Kesehatan_Jantung
## Pola_Olahraga                 1                 0
## Kesehatan_Jantung             0                 1
## attr(,"term.labels")
## [1] "Pola_Olahraga"     "Kesehatan_Jantung"
## 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 19.08455  1 1.250532e-05
## Pearson          18.88889  1 1.385574e-05

Visualisasi Residual untuk Diagnosis

library(vcd)
mosaic(data_kj, shade = TRUE, legend = TRUE)

Interpretasi: Warna pada mosaik plot menunjukkan seberapa besar residual Pearson dari model independen. Warna biru tua → lebih besar dari yang diharapkan (positif), merah tua → lebih kecil dari yang diharapkan (negatif).


Kesimpulan: Model log-linear memberikan cara eksploratif untuk memahami asosiasi antara variabel-variabel kategorik. Untuk data Anda, model saturated menjelaskan struktur data dengan baik, dan ditemukan asosiasi yang signifikan antara pola olahraga dan kesehatan jantung.

Referensi

  • Institute for Health Metrics and Evaluation. (2019). Data kematian akibat penyakit kardiovaskular di Indonesia.

  • Kementerian Kesehatan Republik Indonesia. (2009). Pola makan dan risiko penyakit jantung koroner. Jakarta: Kemenkes RI.

  • Kementerian Kesehatan Republik Indonesia. (2022). Penyakit jantung penyebab utama kematian, Kemenkes perkuat layanan primer. Sehat Negeriku.

  • Kementerian Kesehatan Republik Indonesia. (2021). Cara menjaga kesehatan jantung. Ayo Sehat.

  • Jaya, I. G. N. M. (2025). Analisis Data Kategori. Departemen Statistika, FMIPA, Universitas Padjadjaran.