BAB 1 : Definisi Analisis Data Katgeori

1.1 Mengapa Data Kategori Penting?

Pernahkah kamu mengikuti survei yang menanyakan “Apakah Anda puas dengan layanan ini?” dengan pilihan jawaban seperti “Sangat Puas”, “Puas”, “Tidak Puas”? Atau mungkin, melihat hasil pemilu dengan klasifikasi partai politik yang dipilih oleh masyarakat?

Semua contoh tersebut melibatkan data kategorijenis data yang tidak diukur dengan angka secara langsung, tetapi diklasifikasikan ke dalam kelompok atau kategori tertentu. Dalam dunia yang kompleks ini, tidak semua hal bisa diukur dengan angka. Perasaan, preferensi, status sosial, bahkan keputusan pembelian sering kali muncul dalam bentuk kategori.

Data kategori penting karena:

  • Data kategori mencerminkan realitas sehari-hari: Banyak fenomena di dunia sosial, politik, medis, dan bisnis muncul dalam bentuk kategori.
  • Data kategori membantu kita memahami hubungan antar variabel non-numerik, seperti hubungan antara tingkat pendidikan dan jenis pekerjaan.
  • Pengambilan keputusan berbasis kategori lebih intuitif: Pemerintah membuat kebijakan untuk kategori tertentu (misalnya kelompok rentan), bukan berdasarkan angka semata.
  • Data kategori juga digunakan dalam model prediktif, seperti dalam klasifikasi machine learning (contoh: prediksi churn pelanggan berdasarkan status kategori langganan).

Dengan memahami data kategori, kita bisa mengolah informasi yang tampaknya sederhana menjadi wawasan yang bermakna. Inilah mengapa analisis data kategori menjadi bagian penting dalam statistik terapan dan ilmu data modern.

1.2 Apa Itu Data Kategori?

Secara sederhana, data kategori (categorical data) adalah data yang mengelompokkan objek atau individu ke dalam kategori atau label tertentu, bukan berdasarkan ukuran atau perhitungan angka.

Berbeda dengan data kuantitatif seperti tinggi badan atau penghasilan, data kategori menjawab pertanyaan seperti: - Apa jenis kelamin seseorang? - Apa pilihan makanan favorit? - Termasuk kelompok umur mana seseorang?

Data kategori dapat dibagi menjadi beberapa jenis:

1.2.1 Data Nominal

Data nominal adalah data kategori tanpa urutan atau hierarki. Artinya, satu kategori tidak lebih tinggi atau lebih rendah dari kategori lain.

Contoh: - Warna favorit: Merah, Biru, Kuning - Status pernikahan: Menikah, Belum Menikah, Cerai - Jenis kelamin: Laki-laki, Perempuan

1.2.2 Data Ordinal

Data ordinal adalah data kategori yang memiliki urutan atau tingkatan, tetapi jarak antar tingkatannya tidak diketahui secara pasti.

Contoh: - Tingkat kepuasan: Tidak Puas, Cukup Puas, Puas, Sangat Puas - Pendidikan terakhir: SMP, SMA, S1, S2, S3 - Skor rasa makanan: Buruk, Biasa, Enak, Lezat Ada urutan yang bermakna, meskipun selisihnya tidak kuantitatif.

1.2.3 Data Biner (Dikotom)

Data biner adalah data kategori dengan dua kategori saja, seperti ya/tidak, benar/salah, atau 1/0.

Contoh: - Apakah responden merokok? (Ya/Tidak) - Lulus atau tidak lulus ujian - Memiliki akun TikTok? (1 = Ya, 0 = Tidak) - Biner bisa berupa nominal (tidak ada urutan) maupun ordinal (ada urutan implisit), tergantung konteksnya.

1.2.4 Data Multikategori

Jika data biner hanya memiliki dua kategori, maka data multikategori memiliki tiga atau lebih kategori.

Contoh: - Jenis kendaraan: Motor, Mobil, Sepeda - Preferensi kopi: Hitam, Susu, Latte, Cappuccino - Kategori ini bisa bersifat nominal atau ordinal, tergantung sifat dan urutannya.

1.3 Perbedaan dengan Data Kuantitatif

Analisis data kategori berbeda secara fundamental dengan analisis data kuantitatif. Data kuantitatif mengukur besaran numerik dan dapat dihitung secara matematis, sedangkan data kategori mencerminkan klasifikasi atau label yang tidak selalu memiliki urutan atau interval yang tetap.

Aspek Data Kategori Data Kuantitatif
Tipe Nilai Label atau kategori Angka atau nilai numerik
Contoh Jenis kelamin, warna mobil, tingkat pendidikan Pendapatan, tinggi badan, suhu
Operasi Matematika Tidak bisa dijumlahkan atau dirata-rata Bisa dilakukan operasi matematis seperti rata-rata, selisih
Skala Pengukuran Nominal dan ordinal Interval dan rasio
Contoh Analisis Uji chi-square, proporsi, OR, RR Regresi linear, ANOVA, korelasi Pearson

Pemilihan metode analisis sangat dipengaruhi oleh jenis data yang dimiliki. Misalnya, jika kita ingin menguji hubungan antara dua variabel kategori seperti jenis kelamin dan preferensi produk, maka kita tidak bisa menggunakan regresi linear, melainkan uji asosiasi seperti Chi-Square atau uji Fisher.

Catatan: Mencampur metode kuantitatif untuk data kategori bisa menghasilkan interpretasi yang salah. Oleh karena itu, penting untuk mengenali tipe data sejak awal proses analisis.

1.4 Apa Tujuan Analisis Data Kategori?

Analisis data kategori bukan sekadar menghitung frekuensi atau membuat tabel. Tujuan utamanya jauh lebih luas dan strategis, terutama dalam memahami fenomena sosial, perilaku manusia, serta tren populasi dari data yang bersifat klasifikasi.

Berikut adalah beberapa tujuan utama dari analisis data kategori:

1. Mengidentifikasi Pola dan Tren

Membantu menemukan pola tersembunyi dalam kelompok data. Misalnya, tren peningkatan preferensi produk tertentu berdasarkan kelompok usia atau wilayah.

2. Menganalisis Hubungan Antarvariabel

Menilai apakah dua atau lebih variabel kategori saling berkaitan. Contohnya, apakah jenis kelamin berkorelasi dengan jenis pekerjaan yang dipilih?

3. Membantu Pengambilan Keputusan

Banyak kebijakan publik, strategi pemasaran, atau keputusan manajerial dibuat berdasarkan informasi kategori. Misalnya, hasil survei yang menunjukkan kelompok usia mana yang paling rentan terhadap hoaks digital.

4. Mengembangkan Model Prediktif

Meskipun berbasis kategori, data ini tetap bisa digunakan dalam model klasifikasi seperti decision tree, naive Bayes, atau logistic regression untuk memprediksi kemungkinan suatu kejadian.

Kesimpulan: Analisis data kategori tidak hanya menjawab “berapa banyak” tetapi juga “mengapa” dan “bagaimana” suatu kategori muncul atau saling berinteraksi.

1.4 Manfaat Analisis Data Kategori dalam Berbagai Bidang

Analisis data kategori tidak hanya berguna dalam bidang akademik, tetapi juga memiliki dampak signifikan dalam berbagai sektor praktis. Berikut beberapa contoh penerapan dan manfaatnya:

1.5.1 Ilmu Sosial dan Psikologi

  • Manfaat: Menilai hubungan antara karakteristik sosial (seperti jenis kelamin, status sosial, atau tingkat pendidikan) dan perilaku individu.
  • Contoh: Analisis hubungan antara tingkat pendidikan dan preferensi politik menggunakan uji chi-square.

1.5.2 Kesehatan dan Kedokteran

  • Manfaat: Membantu mengevaluasi efektivitas pengobatan, prevalensi penyakit, atau faktor risiko.
  • Contoh: Perbandingan antara kelompok yang menerima vaksin dengan yang tidak, menggunakan odds ratio (OR) dalam studi case-control.

1.5.3 Pemasaran dan Bisnis

  • Manfaat: Menganalisis preferensi konsumen berdasarkan kategori seperti umur, jenis kelamin, atau lokasi.
  • Contoh: Segmentasi pasar untuk produk tertentu berdasarkan data demografis dalam bentuk tabel kontingensi.

1.5.4 Pendidikan

  • Manfaat: Mengevaluasi efektivitas metode pengajaran atau keterlibatan siswa berdasarkan kategori.
  • Contoh: Uji proporsi antara metode pembelajaran daring vs luring terhadap tingkat kelulusan.

1.5.5 Kebijakan Publik dan Pemerintahan

  • Manfaat: Mengambil keputusan berbasis data dari survei penduduk, data pemilu, atau data kependudukan lainnya.
  • Contoh: Analisis tingkat partisipasi pemilih berdasarkan kelompok umur atau wilayah.

1.5.6 Keamanan dan Kriminalitas

  • Manfaat: Mengidentifikasi pola kriminalitas berdasarkan lokasi, jenis kejahatan, atau waktu kejadian.
  • Contoh: Menentukan hubungan antara wilayah geografis dan jenis tindak kriminal yang dominan.

BAB 2 :Mengenal Teknik-Teknik Penting dalam Analisis Data Kategori

2.1 Membaca Pola Lewat Tabel Kontingensi dan Uji Chi-Square

Tabel kontingensi adalah alat sederhana tapi sangat powerful dalam analisis data kategori. Dengan tabel ini, kita bisa melihat hubungan antara dua variabel kategori secara visual dan kuantitatif.

Apa Itu Tabel Kontingensi?

Tabel kontingensi (sering juga disebut cross-tabulation) menyajikan frekuensi gabungan dari dua variabel kategori. Bentuk paling sederhana adalah tabel 2x2, tetapi bisa juga lebih besar (rxk) tergantung jumlah kategori masing-masing variabel.

Contoh: Data hasil survey preferensi kopi dan usia

< 30 Tahun 30 Tahun Total
Suka Kopi 40 30 70
Tidak Suka 20 10 30
Total 60 40 100

Uji Chi-Square: Apakah Ada Hubungan?

Uji Chi-Square dilakukan untuk menguji hipotesis nol bahwa tidak ada hubungan antara dua variabel kategori.

Hipotesis:

  • H (null): Tidak ada hubungan antara variabel A dan B.
  • H (alternatif): Ada hubungan antara variabel A dan B.

Contoh Analisis di R

# Data contoh
data <- matrix(c(40, 30, 20, 10), nrow = 2, byrow = TRUE)
dimnames(data) <- list(Kopi = c("Suka", "Tidak Suka"),
                       Usia = c("<30", ">=30"))
data <- as.table(data)

# Tampilkan tabel
data
##             Usia
## Kopi         <30 >=30
##   Suka        40   30
##   Tidak Suka  20   10
# Uji Chi-Square
chisq.test(data)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  data
## X-squared = 0.44643, df = 1, p-value = 0.504

Interpretasi Output - p-value < 0.05 Tolak H Ada hubungan antara usia dan preferensi kopi - p-value 0.05 Gagal tolak H Tidak ada hubungan signifikan

2.2 Prediksi dengan Regresi Logistik

Ketika data kategorik kita menjadi variabel respon (Y), dan kita ingin tahu apa yang memengaruhinya, Regresi Logistik jadi jawabannya!

Kapan Digunakan?

Regresi logistik digunakan saat: Variabel dependen adalah kategori biner (contoh: Ya/Tidak, Sukses/Gagal) Ingin mengetahui faktor-faktor yang memengaruhi peluang suatu kejadian terjadi


Ilustrasi Kasus

Seorang peneliti ingin mengetahui apakah umur dan jenis kelamin memengaruhi kemungkinan seseorang membeli produk secara impulsif di TikTok Shop.
Variabel target: Impulsif (1 = Ya, 0 = Tidak)


Bentuk Umum Model

\[ \text{logit}(p) = \ln\left(\frac{p}{1 - p}\right) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_k X_k \]

Di mana: - \(p\) = probabilitas respon 1 (kejadian terjadi) - \(\beta\) = koefisien model - \(X\) = variabel prediktor


Contoh Analisis di R

# Contoh data dummy
data <- data.frame(
  impulsif = c(1, 0, 1, 1, 0, 0, 1, 0, 1, 0),
  umur = c(20, 23, 19, 25, 30, 32, 18, 29, 22, 35),
  gender = factor(c("P", "L", "P", "P", "L", "L", "P", "L", "P", "L"))
)

# Model regresi logistik
model <- glm(impulsif ~ umur + gender, data = data, family = binomial)

# Ringkasan hasil
summary(model)
## 
## Call:
## glm(formula = impulsif ~ umur + gender, family = binomial, data = data)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.457e+01  3.775e+05       0        1
## umur         8.965e-14  1.251e+04       0        1
## genderP      4.913e+01  1.398e+05       0        1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1.3863e+01  on 9  degrees of freedom
## Residual deviance: 4.2867e-10  on 7  degrees of freedom
## AIC: 6
## 
## Number of Fisher Scoring iterations: 23

Interpretasi Output > Koefisien Positif peluang impulsif meningkat jika variabel tersebut naik > Koefisien Negatif peluang impulsif menurun > p-value < 0.05 variabel signifikan dalam model

2.3 Analisis Correspondence (CA)

Analisis Correspondence (CA) adalah teknik eksploratif yang digunakan untuk memvisualisasikan hubungan antara dua variabel kategorik dalam sebuah tabel kontingensi. Cocok banget buat kamu yang suka visualisasi interaktif!


Tujuan CA

  • Menyederhanakan tabel kontingensi ke dalam dimensi 2D atau 3D
  • Menggambarkan asosiasi antara kategori baris dan kolom
  • Menyajikan hubungan secara grafik sehingga pola tersembunyi bisa terlihat dengan jelas!

Kapan Cocok Digunakan?

Kalau kamu punya tabel frekuensi antara dua variabel kategorik, misalnya: - Jenis Produk vs Tipe Konsumen - Wilayah vs Preferensi Pilihan - Fakultas vs Hobi Mahasiswa


Contoh Kasus

Seorang analis ingin mengeksplorasi hubungan antara jenis minuman dan waktu konsumsi.

# Tabel kontingensi dummy
minuman <- matrix(
  c(30, 10, 5,
    15, 20, 10,
    5, 15, 30),
  nrow = 3,
  dimnames = list(
    Minuman = c("Kopi", "Teh", "Jus"),
    Waktu = c("Pagi", "Siang", "Malam")
  )
)
minuman
##        Waktu
## Minuman Pagi Siang Malam
##    Kopi   30    15     5
##    Teh    10    20    15
##    Jus     5    10    30
# Install dan panggil package
library(FactoMineR)
## Warning: package 'FactoMineR' was built under R version 4.3.3
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.3.3
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
# Jalankan Correspondence Analysis
ca_result <- CA(minuman, graph = FALSE)

# Tampilkan hasil ringkasan
summary(ca_result)
## 
## Call:
## CA(X = minuman, graph = FALSE) 
## 
## The chi square of independence between the two variables is equal to 44.60988 (p-value =  4.792216e-09 ).
## 
## Eigenvalues
##                        Dim.1   Dim.2
## Variance               0.283   0.035
## % of var.             88.924  11.076
## Cumulative % of var.  88.924 100.000
## 
## Rows
##         Iner*1000     Dim.1     ctr    cos2     Dim.2     ctr    cos2  
## Kopi  |   152.857 |   0.645  52.475   0.973 |  -0.108  11.810   0.027 |
## Teh   |    25.485 |  -0.074   0.620   0.069 |   0.272  67.238   0.931 |
## Jus   |   140.300 |  -0.643  46.905   0.947 |  -0.152  20.952   0.053 |
## 
## Columns
##         Iner*1000     Dim.1     ctr    cos2     Dim.2     ctr    cos2  
## Pagi  |   140.300 |   0.643  46.905   0.947 |  -0.152  20.952   0.053 |
## Siang |    25.485 |   0.074   0.620   0.069 |   0.272  67.238   0.931 |
## Malam |   152.857 |  -0.645  52.475   0.973 |  -0.108  11.810   0.027 |
# Visualisasi CA
fviz_ca_biplot(ca_result, repel = TRUE) +
  labs(title = "Peta Correspondence Analysis",
       subtitle = "Hubungan antara Jenis Minuman dan Waktu Konsumsi")

# Visualisasi CA
fviz_ca_biplot(ca_result, repel = TRUE) +
  labs(title = "Peta Correspondence Analysis",
       subtitle = "Hubungan antara Jenis Minuman dan Waktu Konsumsi")

2.4 Decision Tree dan Random Forest

Dalam analisis data kategori, metode pohon keputusan (Decision Tree) dan Random Forest sangat berguna untuk klasifikasi dan prediksi berdasarkan variabel kategorik maupun campuran.


Apa itu Decision Tree?

Decision Tree adalah algoritma pemodelan prediktif yang membagi data secara berulang berdasarkan fitur-fitur tertentu untuk memaksimalkan pemisahan antar kategori.

Ibaratnya seperti kita membuat bagan keputusan, dari akar ke daun.


Kelebihan Decision Tree

  • Sangat visual dan mudah dipahami
  • Tidak perlu asumsi statistik
  • Cocok untuk data kategori

Contoh Kasus

Misalnya, kita ingin memprediksi apakah seseorang akan membeli produk berdasarkan: - Usia (Kategori: Muda, Dewasa, Tua) - Status (Pelajar, Bekerja, Pensiunan) - Pendapatan (Rendah, Menengah, Tinggi)


Implementasi di R

# Install dan panggil library
library(rpart)
# Dataset contoh
data <- data.frame(
  Usia = c("Muda", "Muda", "Dewasa", "Tua", "Dewasa", "Tua"),
  Status = c("Pelajar", "Bekerja", "Bekerja", "Pensiunan", "Pelajar", "Bekerja"),
  Beli = c("Tidak", "Ya", "Ya", "Tidak", "Ya", "Tidak")
)

# Buat model pohon keputusan
tree_model <- rpart(Beli ~ Usia + Status, data = data, method = "class")
tree_model
## n= 6 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
## 1) root 6 3 Tidak (0.5000000 0.5000000) *

Apa itu Random Forest?

Random Forest adalah kumpulan dari banyak Decision Tree yang bekerja bersama untuk membuat keputusan yang lebih stabil dan akurat.Selain itu Random Forest Lebih tahan terhadap overfitting dan cocok untuk dataset besar dan kompleks

library(randomForest)
## Warning: package 'randomForest' was built under R version 4.3.3
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
## 
##     margin
# Ubah variabel menjadi faktor
data$Usia <- as.factor(data$Usia)
data$Status <- as.factor(data$Status)
data$Beli <- as.factor(data$Beli)

# Model Random Forest
rf_model <- randomForest(Beli ~ Usia + Status, data = data, ntree = 100)
print(rf_model)
## 
## Call:
##  randomForest(formula = Beli ~ Usia + Status, data = data, ntree = 100) 
##                Type of random forest: classification
##                      Number of trees: 100
## No. of variables tried at each split: 1
## 
##         OOB estimate of  error rate: 66.67%
## Confusion matrix:
##       Tidak Ya class.error
## Tidak     1  2   0.6666667
## Ya        2  1   0.6666667
Metode Kelebihan Kekurangan
Decision Tree Mudah dibaca, cepat Rentan overfitting
Random Forest Akurat, tahan noise & overfitting Sulit diinterpretasi, lebih berat

BAB 3: Distribusi Probabilitas dalam Data Kategori

Pada analisis data kategori, kita sering dihadapkan dengan data diskrit seperti “ya/tidak”, “setuju/tidak setuju”, “tinggi/sedang/rendah”, dan sejenisnya. Untuk memahami dan memodelkan probabilitas dari kategori-kategori tersebut, kita memerlukan model probabilitas yang sesuai.

Distribusi probabilitas dalam konteks data kategori tidak hanya membantu dalam pengambilan keputusan, tapi juga dalam membangun model statistik seperti regresi logistik atau machine learning berbasis klasifikasi.


Tujuan Bab Ini

  • Mengenal jenis-jenis distribusi probabilitas untuk data kategori
  • Memahami karakteristik, rumus, dan penerapannya di dunia nyata
  • Menjelajahi implementasi praktisnya dengan bahasa R

Topik yang Akan Dibahas

Distribusi Cocok untuk tipe data Contoh aplikasi
Bernoulli Biner (2 kategori) Lulus / Tidak Lulus
Binomial Banyak ulangan Bernoulli Jumlah pembeli dari 10 orang
Multinomial Multikategori (>2 kategori) Preferensi merek (A, B, C)
Poisson Hitungan kejadian (count data) Jumlah keluhan pelanggan dalam 1 hari

3.1 Distribusi Bernoulli

Distribusi Bernoulli digunakan untuk data yang hanya memiliki dua kemungkinan hasil: sukses (1)
gagal (0)

Distribusi ini sangat berguna untuk menganalisis data biner, seperti: - Apakah pelanggan membeli produk? (ya/tidak) - Apakah siswa lulus ujian? (lulus/gagal) - Apakah pasien sembuh? (sembuh/tidak)

Definisi dan Fungsi Probabilitas

Jika peluang sukses adalah \( p \), maka:

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

Dimana: - \( X \): variabel acak Bernoulli - \( p \): probabilitas sukses - \( 1-p \): probabilitas gagal

Parameter & Notasi

  • Notasi: \( X (p) \)
  • Nilai harapan: \( E(X) = p \)
  • Varians: \( (X) = p(1 - p) \)

Contoh Kasus

Sebuah survei menanyakan apakah seseorang menggunakan masker di tempat umum. Dari data diketahui bahwa 80% responden menjawab “Ya”. Jika kita memilih satu responden secara acak:

  • Probabilitas memakai masker = 0.8
  • Probabilitas tidak memakai masker = 0.2

Implementasi di R

# Set probabilitas sukses
p <- 0.8

# Simulasi 10 observasi Bernoulli
set.seed(123)
sample_rv <- rbinom(n = 10, size = 1, prob = p)
sample_rv
##  [1] 1 1 1 0 0 1 1 0 1 1
  • Gunakan distribusi Bernoulli untuk analisis awal sebelum masuk ke regresi logistik.
  • Cocok untuk menyederhanakan data multikategori jadi biner (misal: suka vs tidak suka).

3.2 Distribusi Binomial

Distribusi Binomial adalah perluasan dari distribusi Bernoulli. Kalau Bernoulli hanya melibatkan satu percobaan (misalnya: berhasil atau gagal), maka Binomial digunakan ketika kita melakukan n percobaan independen dengan dua kemungkinan hasil di tiap percobaan.


Ciri-Ciri Distribusi Binomial

Distribusi Binomial berlaku jika:

  • Terdapat n percobaan yang identik
  • Tiap percobaan hanya memiliki 2 kemungkinan hasil (sukses/gagal)
  • Probabilitas sukses p tetap untuk setiap percobaan
  • Setiap percobaan bersifat independen

Rumus Distribusi Binomial

Jika \(X\) adalah jumlah keberhasilan dalam \(n\) percobaan, maka:

\[ P(X = x) = \binom{n}{x} \cdot p^x \cdot (1-p)^{n-x} \]

dengan: - \(\binom{n}{x}\) = kombinasi = jumlah cara memilih x sukses dari n percobaan
- \(p\) = peluang sukses dalam satu percobaan
- \(1 - p\) = peluang gagal
- \(x = 0, 1, ..., n\)


Contoh Kasus

Sebuah perusahaan ingin tahu kemungkinan mendapatkan 3 pelanggan puas dari 5 orang yang diwawancara, dengan asumsi probabilitas kepuasan pelanggan sebesar 0.7.

\[ P(X = 3) = \binom{5}{3} \cdot 0.7^3 \cdot (1 - 0.7)^{5 - 3} = 10 \cdot 0.343 \cdot 0.09 = 0.3087 \]

Jadi, probabilitasnya adalah 0.3087 atau 30.87%.


Implementasi di R

# P(X = 3) untuk n = 5 dan p = 0.7
dbinom(3, size = 5, prob = 0.7)
## [1] 0.3087
# Probabilitas kumulatif  3
pbinom(3, size = 5, prob = 0.7)
## [1] 0.47178
# Visualisasi distribusi binomial
x <- 0:5
y <- dbinom(x, size = 5, prob = 0.7)

barplot(y, names.arg = x,
        col = "#FFA07A", 
        main = "Distribusi Binomial (n=5, p=0.7)",
        xlab = "Jumlah Keberhasilan", 
        ylab = "Probabilitas")

## Kapan Menggunakan Distribusi Binomial? Gunakan Binomial jika kamu sedang:

  • Menghitung peluang dari jumlah keberhasilan dalam percobaan terbatas
  • Meneliti efektivitas kampanye promosi (berapa banyak respon positif)
  • Menganalisis hasil tes medis dalam kelompok kecil

3.3 Distribusi Multinomial

Distribusi Multinomial adalah perluasan dari distribusi Binomial ketika kita memiliki lebih dari dua kategori hasil dalam tiap percobaan.

Kalau Binomial cuma mengenal “sukses” dan “gagal”, Multinomial mengenal banyak hasil seperti: Apel, Pisang, dan Jeruk semuanya dalam satu percobaan.


Ciri-Ciri Distribusi Multinomial

Distribusi Multinomial digunakan ketika:

  • Tiap percobaan memiliki k hasil yang saling eksklusif
  • Dilakukan sebanyak n percobaan
  • Probabilitas tiap kategori tetap: \(p_1, p_2, ..., p_k\)
  • Percobaan bersifat independen

Rumus Distribusi Multinomial

Jika \(X_1, X_2, ..., X_k\) adalah jumlah kemunculan dari masing-masing kategori, maka:

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

dengan:

  • \(\sum x_i = n\)
  • \(\sum p_i = 1\)

Contoh Kasus

Sebuah toko buah mencatat preferensi 10 pelanggan terhadap 3 buah: Apel (), Pisang (), dan Jeruk (). Diketahui probabilitas memilih masing-masing buah adalah 0.4, 0.3, dan 0.3. Berapa peluang tepat 4 orang memilih apel, 3 pisang, dan 3 jeruk?

\[ P(4,3,3) = \frac{10!}{4!3!3!} \cdot 0.4^4 \cdot 0.3^3 \cdot 0.3^3 = 4200 \cdot 0.0256 \cdot 0.027 \cdot 0.027 = 0.0779 \]

Jadi, peluangnya adalah 7.79%


Implementasi di R

# Menggunakan fungsi dmultinom
dmultinom(c(4, 3, 3), prob = c(0.4, 0.3, 0.3))
## [1] 0.07838208

Note:Untuk simulasi atau analisis, kita sering memakai multinomial saat menangani hasil survei dengan banyak kategori jawaban

Kapan Menggunakan Distribusi Multinomial?

Distribusi ini cocok saat:

  • Meneliti preferensi produk dengan banyak pilihan
  • Analisis hasil voting dengan lebih dari dua kandidat
  • Klasifikasi teks dalam kategori yang banyak

3.4 Distribusi Poisson

Distribusi Poisson cocok digunakan saat kita ingin mengetahui jumlah kejadian dalam suatu periode waktu atau area tertentu, tanpa batas atas jumlah kejadian.

Contoh:

  • Jumlah kecelakaan lalu lintas per minggu
  • Jumlah pelanggan datang ke toko dalam satu jam
  • Jumlah kesalahan pengetikan dalam 1 halaman

Karakteristik Distribusi Poisson

  • Kejadian terjadi secara acak & independen
  • Probabilitas kejadian dalam interval kecil sebanding dengan panjang interval
  • Rata-rata kejadian per interval = \(\lambda\)
  • Nilai variabel acak: \(x = 0, 1, 2, \dots\)

Rumus Distribusi Poisson

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

di mana:

  • \(\lambda\) = rata-rata kejadian dalam satu interval
  • \(x\) = jumlah kejadian
  • \(e\) 2.71828

Contoh Kasus

Sebuah call center menerima rata-rata 3 panggilan masuk tiap menit. Berapa probabilitas menerima tepat 5 panggilan dalam satu menit?

\[ P(X = 5) = \frac{e^{-3} \cdot 3^5}{5!} = \frac{0.0498 \cdot 243}{120} = 0.1008 \]

Peluangnya adalah 10.08%


Implementasi di R

# Probabilitas tepat 5 kejadian dengan lambda = 3
dpois(5, lambda = 3)
## [1] 0.1008188
# Distribusi kumulatif ( 5 kejadian)
ppois(5, lambda = 3)
## [1] 0.9160821
# Simulasi 20 pengamatan dari distribusi Poisson
rpois(20, lambda = 3)
##  [1] 6 3 4 3 1 5 2 0 2 6 5 4 3 8 4 4 3 3 2 1

Tips Analisis : Distribusi Poisson sering menjadi dasar model regresi Poisson,terutama saat respons berupa jumlah kejadian dan melibatkan variabel prediktor.

Contohnya:

  • Regresi Poisson untuk memodelkan jumlah pasien datang berdasarkan hari dan cuaca
  • Menggunakan Generalized Linear Model (GLM) dengan link log untuk data count

BAB 4: Desain Sampling dalam Analisis Data Kategori

Dalam analisis data, cara kita mengumpulkan data sangat menentukan kualitas dan validitas hasil analisis. Oleh karena itu, pemilihan desain sampling (rancangan pengambilan sampel) menjadi langkah penting, terlebih ketika berhadapan dengan data kategori, yaitu data yang berupa klasifikasi atau label seperti jenis kelamin, status merokok, pilihan produk, tingkat kepuasan, dan sebagainya.

Desain sampling bukan hanya tentang memilih siapa yang akan diteliti, tetapi juga mencakup:

Dalam data kategori, desain sampling memengaruhi:

Oleh karena itu, sebelum memutuskan jenis uji statistik atau model regresi yang akan digunakan, kita perlu terlebih dahulu memahami bagaimana data itu dikumpulkan.

4.1 Prospective Sampling

Prospective sampling adalah pendekatan di mana peneliti memulai dari faktor risiko atau eksposur, kemudian mengikuti subjek dari waktu ke waktu untuk melihat apakah mereka mengalami outcome tertentu. Artinya, data dikumpulkan ke depan dari waktu pengamatan awal. Desain ini memungkinkan peneliti mengamati kejadian saat atau setelah eksposur, sehingga mendukung inferensi kausalitas yang lebih kuat.

Metode ini banyak digunakan dalam penelitian klinis, epidemiologi, dan eksperimen sosial, di mana peneliti ingin melihat dampak dari suatu perlakuan atau kondisi terhadap hasil tertentu.

4.1.1 Eksperimen

Eksperimen adalah jenis paling terkontrol dari prospective sampling. Dalam eksperimen:

  • Peneliti secara acak memberikan perlakuan atau intervensi kepada kelompok eksperimen,
  • Sementara kelompok kontrol tidak mendapatkannya (atau mendapat perlakuan plasebo),
  • Outcome kemudian diukur dan dibandingkan.

Contoh:Sebuah penelitian ingin menguji apakah pelatihan soft skill dapat meningkatkan kemampuan komunikasi mahasiswa. Mahasiswa dibagi secara acak menjadi dua kelompok: satu mengikuti pelatihan, satu tidak. Setelah satu bulan, kemampuan komunikasi diukur dan dibandingkan.

Eksperimen dapat dilakukan dalam bentuk:

  • Randomized Controlled Trial (RCT): paling kuat dalam inferensi kausal.
  • Quasi-experiment: tidak ada randomisasi, tapi masih ada pembagian perlakuan.

Kelebihan:

  • Inferensi sebab-akibat kuat
  • Kontrol penuh atas perlakuan dan waktu pengamatan

Kekurangan:

  • Biaya mahal dan memakan waktu
  • Tidak selalu etis (misal: memberi eksposur bahaya)

4.1.2 Studi Kohort (Prospektif)

Dalam studi kohort prospektif, kelompok individu yang terekspos dan tidak terpapar suatu faktor diikuti dari waktu awal hingga outcome terjadi. Tidak seperti eksperimen, peneliti tidak mengatur perlakuan, hanya mengamati kelompok yang sudah berbeda sejak awal.

Contoh: Peneliti mengikuti dua kelompok pekerja: satu kelompok terpapar asap rokok di tempat kerja, dan satu lagi tidak. Selama 5 tahun, mereka diamati apakah mengalami penurunan fungsi paru-paru.

Kelebihan:

  • Cocok untuk mengamati kejadian yang umum
  • Dapat menghitung insiden, risk ratio, dan rate

Kekurangan:

  • Butuh waktu lama
  • Potensi kehilangan subjek selama periode pengamatan (loss to follow-up)

Implementasi di R (Contoh Simulasi)

# Simulasi hasil studi kohort
exposed <- c(35, 65)      # 35 positif outcome, 65 negatif
unexposed <- c(20, 80)    # 20 positif outcome, 80 negatif

data <- matrix(c(exposed, unexposed), nrow = 2, byrow = TRUE)
colnames(data) <- c("Outcome: Yes", "Outcome: No")
rownames(data) <- c("Exposed", "Unexposed")
data <- as.table(data)

# Hitung Risk Ratio
library(epitools)
riskratio(data)
## $data
##           Outcome: Yes Outcome: No Total
## Exposed             35          65   100
## Unexposed           20          80   100
## Total               55         145   200
## 
## $measure
##                         NA
## risk ratio with 95% C.I. estimate    lower    upper
##                Exposed   1.000000       NA       NA
##                Unexposed 1.230769 1.034175 1.464736
## 
## $p.value
##            NA
## two-sided   midp.exact fisher.exact chi.square
##   Exposed           NA           NA         NA
##   Unexposed  0.0185135   0.02611795 0.01752886
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tips:Jika kamu ingin menyimpulkan sebab-akibat, desain prospektif (khususnya eksperimen) adalah pilihan yang terbaik, Catat waktu pengamatan dengan rapi karena urutan waktu adalah kunci di desain ini.

4.2 Retrospective Sampling

Retrospective sampling adalah pendekatan di mana peneliti memulai dari outcome yang sudah terjadi, lalu melihat ke belakang untuk mengetahui apakah subjek memiliki faktor risiko atau eksposur tertentu. Artinya, data dikumpulkan dari masa lalu, sering kali dari rekam medis, arsip, atau wawancara.

Jenis desain ini efisien untuk kejadian yang langka dan outcome yang sudah terjadi, terutama bila tidak mungkin menunggu kejadian itu terjadi di masa depan.


4.2.1 Studi Kasus-Kontrol

Studi kasus-kontrol adalah bentuk paling umum dari retrospective sampling. Dalam desain ini:

  • Kelompok kasus: individu yang telah mengalami outcome tertentu (misal: terkena penyakit),
  • Kelompok kontrol: individu yang tidak mengalami outcome,
  • Peneliti kemudian melihat kembali apakah mereka memiliki eksposur tertentu di masa lalu.

Contoh:Dalam studi kanker paru-paru, 100 pasien yang menderita kanker (kasus) dibandingkan dengan 100 orang sehat (kontrol) untuk melihat apakah mereka memiliki riwayat merokok.

Kelebihan:

  • Efisien untuk penyakit langka
  • Cepat dan murah dibanding studi kohort

Kekurangan:

  • Tidak bisa menghitung risiko langsung (hanya odds ratio)
  • Potensi bias ingatan dan bias seleksi

4.2.2 Studi Kohort Retrospektif

Studi kohort retrospektif mirip dengan kohort prospektif, tetapi data masa lalu sudah tersedia. Peneliti mengidentifikasi kelompok eksposur dan non-eksposur dari data arsip, lalu melihat apakah mereka mengalami outcome.

Contoh:Perusahaan mengamati data 10 tahun lalu: apakah karyawan yang bekerja malam hari (eksposur) memiliki risiko lebih tinggi mengalami gangguan metabolisme dibanding yang bekerja siang.

Kelebihan:

  • Bisa dilakukan lebih cepat karena datanya sudah ada
  • Cocok untuk jangka waktu panjang tanpa harus menunggu lama

Kekurangan:

  • Data tidak dikumpulkan untuk keperluan penelitian awal keterbatasan variabel
  • Kualitas data historis mungkin tidak konsisten

Implementasi di R (Contoh Kasus-Kontrol)

# Simulasi studi kasus-kontrol
# Baris: Kasus vs Kontrol; Kolom: Terpapar vs Tidak
data <- matrix(c(45, 15, 25, 55), nrow = 2, byrow = TRUE)
colnames(data) <- c("Terpapar", "Tidak")
rownames(data) <- c("Kasus", "Kontrol")
data <- as.table(data)

# Hitung Odds Ratio
library(epitools)
oddsratio(data)
## $data
##         Terpapar Tidak Total
## Kasus         45    15    60
## Kontrol       25    55    80
## Total         70    70   140
## 
## $measure
##                         NA
## odds ratio with 95% C.I. estimate    lower    upper
##                  Kasus   1.000000       NA       NA
##                  Kontrol 6.462513 3.098142 14.13467
## 
## $p.value
##          NA
## two-sided   midp.exact fisher.exact   chi.square
##   Kasus             NA           NA           NA
##   Kontrol 2.744484e-07 4.804947e-07 2.999548e-07
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Catatan:Dalam studi retrospective, kita tidak bisa menentukan kausalitas sekuat desain prospektif karena arah waktunya sudah “dibalik”. Namun, studi ini sangat berguna jika data tersedia dan waktu terbatas.

4.3 Tabel Perbandingan Desain Sampling

Untuk memahami perbedaan utama antar desain sampling dalam analisis data kategori, berikut adalah ringkasan dalam bentuk tabel:

Jenis Desain Arah Waktu Titik Awal Pengamatan Fokus Utama Contoh Studi Cocok Untuk…
Eksperimen Prospektif Peneliti memberikan perlakuan Efek perlakuan terhadap hasil Uji coba obat baru terhadap keberhasilan penyembuhan Uji kausalitas langsung
Kohort Prospektif Prospektif Identifikasi eksposur Perkembangan outcome ke depan Apakah perokok akan lebih mungkin terkena kanker paru di masa depan Outcome umum, eksposur jelas
Kasus-Kontrol Retrospektif Outcome sudah terjadi Riwayat eksposur masa lalu Apakah penderita kanker memiliki riwayat merokok lebih tinggi dari kontrol Outcome langka, cepat
Kohort Retrospektif Retrospektif Riwayat eksposur (data arsip) Outcome sudah terjadi Apakah shift malam 10 tahun lalu berdampak pada kesehatan saat ini Data historis tersedia

Tips Penting Memilih Desain

  • Pilih eksperimen jika kamu bisa mengontrol perlakuan dan ingin menguji kausalitas.
  • Gunakan kohort prospektif jika eksposur sudah jelas dan bisa diamati ke depan.
  • Pilih kasus-kontrol untuk penyakit/langka yang jarang muncul.
  • Gunakan kohort retrospektif jika data historis tersedia dan lengkap.

BAB 5: Tabel Kontingensi 2 x 2

Tabel kontingensi 2X 2 adalah alat yang sangat umum dan berguna dalam analisis data kategori, khususnya ketika kita ingin mengetahui apakah terdapat hubungan antara dua variabel kategorik yang masing-masing memiliki dua kategori (disebut juga data dikotomi). Dalam banyak kasus di dunia nyata, seperti bidang kesehatan, psikologi, pemasaran, atau sosiologi, kita sering menjumpai situasi seperti:

Nah, tabel kontingensi menyusun data tersebut dalam format dua arah yang memudahkan kita menganalisis distribusi peluang dan kekuatan hubungan antarvariabel. Dalam bab ini, kita akan membahas:

Tabel Kontingensi 2X2

Tabel kontingensi 2x2 memiliki struktur sebagai berikut:

Kejadian (Ya) Kejadian (Tidak) Total
Paparan (Ya) a b a + b
Paparan (Tidak) c d c + d
Total a + c b + d n

Keterangan:

  • a = jumlah individu yang terpapar dan mengalami kejadian,
  • b = jumlah individu yang terpapar dan tidak mengalami kejadian,
  • c = jumlah individu tidak terpapar tapi mengalami kejadian,
  • d = jumlah individu tidak terpapar dan tidak mengalami kejadian,
  • n = total keseluruhan observasi.

Tabel ini menjadi dasar untuk menghitung berbagai distribusi peluang (bersama, marginal, bersyarat) serta ukuran asosiasi seperti Risk Difference, Relative Risk, dan Odds Ratio.

5.1.1 Peluang Bersama (Joint Probability)

Peluang bersama (joint probability) adalah probabilitas bahwa dua kejadian terjadi secara bersamaan. Dalam konteks tabel kontingensi 22, ini merujuk pada proporsi individu yang memiliki kombinasi tertentu dari dua variabel kategori.

Misalnya, berapa probabilitas seseorang terpapar dan mengalami kejadian? Maka yang dimaksud adalah peluang bersama untuk sel a.

Rumus Umum:

\[ P(A \cap B) = \frac{\text{Frekuensi pada sel } (A,B)}{n} \]

Keterangan:

  • \(P(A \cap B)\): peluang bersama antara kejadian A dan B.
  • Frekuensi pada sel \((A,B)\): jumlah observasi yang memenuhi kedua kondisi A dan B.
  • \(n\): total seluruh observasi dalam tabel. Jika kita memiliki tabel 22 seperti ini:
Kejadian (Ya) Kejadian (Tidak) Total
Paparan (Ya) a b a + b
Paparan (Tidak) c d c + d
Total a + c b + d n

Maka peluang bersama setiap sel dapat dihitung sebagai:

  • P(Paparan = Ya dan Kejadian = Ya) = a / n
  • P(Paparan = Ya dan Kejadian = Tidak) = b / n
  • P(Paparan = Tidak dan Kejadian = Ya) = c / n
  • P(Paparan = Tidak dan Kejadian = Tidak) = d / n
Catatan:
  • Jumlah seluruh peluang bersama harus = 1.
  • Rumusnya berlaku umum untuk semua ukuran tabel kontingensi, tidak hanya 22.

5.1.2 Peluang Marginal

Peluang marginal (marginal probability) adalah peluang dari suatu kejadian tanpa mempertimbangkan kejadian lainnya. Dalam konteks tabel kontingensi, peluang ini dihitung dari total baris atau kolom tertentu dibandingkan dengan total keseluruhan observasi.

Rumus Umum:

\[ P(A) = \frac{\text{Jumlah total baris atau kolom untuk A}}{n} \]

Keterangan: - \(A\): suatu kategori tunggal, misalnya “Paparan = Ya” atau “Kejadian = Tidak”. - \(n\): total seluruh observasi dalam tabel.

Contoh Berdasarkan Tabel Kontingensi:

Kejadian = Ya Kejadian = Tidak Total
Paparan = Ya a b a + b
Paparan = Tidak c d c + d
Total a + c b + d n

Peluang marginal dari “Paparan = Ya”: \[ P(\text{Paparan = Ya}) = \frac{a + b}{n} \]

Peluang marginal dari “Kejadian = Tidak”: \[ P(\text{Kejadian = Tidak}) = \frac{b + d}{n} \]

Catatan: Peluang marginal sering menjadi dasar untuk menguji asumsi independensi antar variabel dalam tabel kontingensi.

Tips: Nilai peluang marginal dapat digunakan untuk membandingkan seberapa umum suatu kategori terjadi secara keseluruhan, tanpa dipengaruhi oleh kondisi lainnya.

5.1.3 Peluang Bersyarat

Peluang bersyarat (conditional probability) adalah peluang terjadinya suatu kejadian dengan syarat bahwa kejadian lain sudah terjadi.

Definisi: Peluang bersyarat dari kejadian \(A\) dengan syarat \(B\) dinotasikan sebagai \(P(A|B)\), dan berarti “peluang A terjadi jika B telah terjadi”.

Rumus Umum:

\[ P(A|B) = \frac{P(A \cap B)}{P(B)} \]

Keterangan: - \(P(A \cap B)\): peluang bersama dari A dan B. - \(P(B)\): peluang dari kejadian yang diketahui telah terjadi.


Contoh Berdasarkan Tabel Kontingensi:

Kejadian = Ya Kejadian = Tidak Total
Paparan = Ya a b a + b
Paparan = Tidak c d c + d
Total a + c b + d n

Peluang terjadinya Kejadian = Ya, dengan syarat Paparan = Ya: \[ P(\text{Kejadian = Ya} \mid \text{Paparan = Ya}) = \frac{a}{a + b} \]

Peluang terjadinya Kejadian = Tidak, dengan syarat Paparan = Tidak: \[ P(\text{Kejadian = Tidak} \mid \text{Paparan = Tidak}) = \frac{d}{c + d} \]

Interpretasi:

Peluang bersyarat sangat penting untuk memahami hubungan antar dua variabel. Jika peluang bersyarat berbeda secara signifikan antara kategori, maka ada kemungkinan kuat bahwa dua variabel tersebut saling bergantung.

Tips: Peluang bersyarat digunakan dalam penghitungan ukuran asosiasi seperti Relative Risk dan Odds Ratio, serta dalam model prediktif seperti regresi logistik.

Contoh Kasus: Analisis Tabel Kontingensi 2x2

Misalkan kita memiliki data sebagai berikut:

Sejumlah 100 orang diteliti untuk mengetahui hubungan antara kebiasaan merokok dan kejadian penyakit paru-paru.

Penyakit Paru = Ya Penyakit Paru = Tidak Total
Merokok = Ya 30 20 50
Merokok = Tidak 10 40 50
Total 40 60 100

Peluang Bersama (Joint Probability)

\[ P(A \cap B) = \frac{\text{Frekuensi A dan B}}{n} \]

  • \(P(\text{Merokok = Ya} \cap \text{Penyakit = Ya}) = \frac{30}{100} = 0.30\)
  • \(P(\text{Merokok = Ya} \cap \text{Penyakit = Tidak}) = \frac{20}{100} = 0.20\)
  • \(P(\text{Merokok = Tidak} \cap \text{Penyakit = Ya}) = \frac{10}{100} = 0.10\)
  • \(P(\text{Merokok = Tidak} \cap \text{Penyakit = Tidak}) = \frac{40}{100} = 0.40\)

Peluang Marginal (Marginal Probability)

\[ P(A) = \frac{\text{Jumlah dalam baris/kolom}}{n} \]

  • \(P(\text{Merokok = Ya}) = \frac{50}{100} = 0.50\)
  • \(P(\text{Merokok = Tidak}) = \frac{50}{100} = 0.50\)
  • \(P(\text{Penyakit = Ya}) = \frac{40}{100} = 0.40\)
  • \(P(\text{Penyakit = Tidak}) = \frac{60}{100} = 0.60\)

Peluang Bersyarat (Conditional Probability)

\[ P(A|B) = \frac{P(A \cap B)}{P(B)} \]

  • \(P(\text{Penyakit = Ya} \mid \text{Merokok = Ya}) = \frac{30}{50} = 0.60\)
  • \(P(\text{Penyakit = Ya} \mid \text{Merokok = Tidak}) = \frac{10}{50} = 0.20\)
  • \(P(\text{Merokok = Ya} \mid \text{Penyakit = Ya}) = \frac{30}{40} = 0.75\)
  • \(P(\text{Merokok = Tidak} \mid \text{Penyakit = Tidak}) = \frac{40}{60} = 0.6667\)

Implementasi di R

# Membuat tabel kontingensi
tabel <- matrix(c(30, 20, 10, 40), 
                nrow = 2, byrow = TRUE,
                dimnames = list(Merokok = c("Ya", "Tidak"),
                                Penyakit = c("Ya", "Tidak")))
tabel
##        Penyakit
## Merokok Ya Tidak
##   Ya    30    20
##   Tidak 10    40
# Hitung total pengamatan
total <- sum(tabel)

# Peluang bersama
peluang_bersama <- tabel / total
peluang_bersama
##        Penyakit
## Merokok  Ya Tidak
##   Ya    0.3   0.2
##   Tidak 0.1   0.4
# Peluang marginal
peluang_marginal_baris <- rowSums(tabel) / total
peluang_marginal_kolom <- colSums(tabel) / total

peluang_marginal_baris
##    Ya Tidak 
##   0.5   0.5
peluang_marginal_kolom
##    Ya Tidak 
##   0.4   0.6
# Peluang bersyarat
peluang_bersyarat_merokok_ya <- tabel["Ya", ] / sum(tabel["Ya", ])
peluang_bersyarat_merokok_tidak <- tabel["Tidak", ] / sum(tabel["Tidak", ])

peluang_bersyarat_merokok_ya
##    Ya Tidak 
##   0.6   0.4
peluang_bersyarat_merokok_tidak
##    Ya Tidak 
##   0.2   0.8

Interpretasi :

  • Peluang seseorang merokok dan sakit paru-paru adalah 30%.
  • Peluang seseorang merokok adalah 50%, dan di antara perokok, peluang sakit adalah 60%.
  • Peluang non-perokok terkena penyakit jauh lebih kecil yaitu 20%.

5.2 Ukuran Asosiasi dalam Data Kategori 2x2

Setelah kita memahami bagaimana menghitung berbagai jenis peluang dari tabel kontingensi 22, pertanyaan penting berikutnya adalah:

“Seberapa kuat hubungan antara dua variabel kategori tersebut?”

Di sinilah ukuran asosiasi menjadi alat penting dalam analisis data kategori. Ukuran-ukuran ini membantu kita untuk mengkuantifikasi kekuatan dan arah hubungan antara dua variabel kategori misalnya, antara kebiasaan merokok dan kejadian penyakit, atau antara penggunaan media sosial dan kesehatan mental.

Kapan Kita Butuh Ukuran Asosiasi?

Ukuran asosiasi sangat berguna dalam berbagai konteks seperti:

  • Penelitian Kesehatan: Apakah konsumsi alkohol berkaitan dengan risiko kanker?
  • Ilmu Sosial: Apakah status pekerjaan terkait dengan tingkat kepuasan hidup?
  • Pemasaran: Apakah jenis kelamin berkaitan dengan preferensi produk?

Dengan tabel kontingensi 2x2, kita bisa menghitung ukuran asosiasi untuk menjawab pertanyaan-pertanyaan semacam itu secara kuantitatif dan objektif.

Apa Saja Ukurannya?

Ada beberapa ukuran asosiasi yang populer digunakan dalam konteks tabel 22, yaitu:

  1. Risk Difference (RD): Mengukur selisih risiko antara dua kelompok.
  2. Relative Risk (RR): Perbandingan risiko antara dua kelompok.
  3. Odds Ratio (OR): Perbandingan odds antara dua kelompok.

Masing-masing memiliki konteks penggunaan yang khas. Sebagai contoh :

  • RR dan RD biasanya digunakan dalam studi prospektif seperti eksperimen atau studi kohort.
  • OR lebih umum dalam studi retrospektif seperti studi kasus-kontrol.

Catatan: Nilai ukuran asosiasi ini tidak hanya memberi tahu apakah ada hubungan, tapi seberapa besar hubungan itu yang bisa berdampak penting dalam pengambilan keputusan kebijakan atau praktik medis.

5.2.1 Risk Difference (RD)

Risk Difference (RD) atau selisih risiko adalah ukuran asosiasi yang menunjukkan perbedaan probabilitas kejadian antara dua kelompok. RD memberitahu kita seberapa besar selisih risiko antara kelompok yang terpapar (exposed) dan tidak terpapar (unexposed) terhadap suatu variabel.

Rumus Umum

Jika kita punya tabel kontingensi 22 seperti ini:

Outcome Positif Outcome Negatif Total
Terpapar a b a + b
Tidak Terpapar c d c + d

Maka, Risk Difference dihitung sebagai:

\[ \text{RD} = \frac{a}{a + b} - \frac{c}{c + d} \]

  • \(\frac{a}{a + b}\): Risiko pada kelompok terpapar
  • \(\frac{c}{c + d}\): Risiko pada kelompok tidak terpapar

Interpretasi

  • RD = 0 Tidak ada perbedaan risiko
  • RD > 0 Risiko lebih besar pada kelompok terpapar
  • RD < 0 Risiko lebih besar pada kelompok tidak terpapar

5.2.2 Relative Risk (RR)

Relative Risk (RR) atau risiko relatif mengukur seberapa besar risiko kejadian pada kelompok terpapar dibandingkan dengan kelompok tidak terpapar.

Rumus Umum

\[ \text{RR} = \frac{\frac{a}{a + b}}{\frac{c}{c + d}} \]

  • RR membandingkan proporsi kejadian antara dua kelompok.

Interpretasi

  • RR = 1 Risiko sama pada kedua kelompok (tidak ada asosiasi)
  • RR > 1 Risiko lebih tinggi pada kelompok terpapar
  • RR < 1 Risiko lebih rendah pada kelompok terpapar (mungkin bersifat protektif)

Contoh: RR = 2 artinya kelompok terpapar memiliki risiko 2 kali lebih besar mengalami outcome dibandingkan yang tidak terpapar.

5.2.3 Odds Ratio (OR)

Odds Ratio (OR) adalah ukuran asosiasi yang membandingkan odds (peluang kejadian dibanding tidak kejadian) antara kelompok terpapar dan tidak terpapar.

OR sering digunakan dalam studi kasus-kontrol karena tidak memungkinkan untuk menghitung risiko langsung (tidak diketahui total populasi).

Rumus Umum

\[ \text{OR} = \frac{a \cdot d}{b \cdot c} \]

  • \(a \cdot d\): Hasil diagonal utama
  • \(b \cdot c\): Hasil diagonal seberangnya

Atau bisa juga ditulis:

\[ \text{OR} = \frac{\text{Odds di kelompok terpapar}}{\text{Odds di kelompok tidak terpapar}} = \frac{a/b}{c/d} \]

Interpretasi

  • OR = 1 Tidak ada asosiasi
  • OR > 1 Odds lebih tinggi pada kelompok terpapar
  • OR < 1 Odds lebih rendah pada kelompok terpapar

Contoh: OR = 3 berarti odds outcome di kelompok terpapar tiga kali lebih besar dibandingkan yang tidak terpapar.

Perbandingan Singkat

Ukuran Asosiasi Interpretasi Sederhana Kapan Digunakan?
RD Selisih risiko Studi kohort, eksperimen
RR Perbandingan risiko Studi kohort, eksperimen
OR Perbandingan odds Studi kasus-kontrol, regresi

Selanjutnya, mari kita lihat contoh nyata menghitung ketiga ukuran ini secara manual dan menggunakan R.

Contoh Kasus: Ukuran Asosiasi dalam Tabel Kontingensi 2x2

Sebuah penelitian ingin mengetahui hubungan antara kebiasaan merokok dengan kejadian penyakit paru-paru. Hasil observasi terhadap 200 orang ditampilkan dalam tabel berikut:

Sakit Paru-Paru Tidak Sakit Total
Perokok 40 60 100
Bukan Perokok 10 90 100
Total 50 150 200

Mari kita simbolkan:

  • a = 40
  • b = 60
  • c = 10
  • d = 90

Perhitungan Manual

Risk Difference (RD)

\[ RD = \frac{a}{a + b} - \frac{c}{c + d} = \frac{40}{100} - \frac{10}{100} = 0.4 - 0.1 = 0.3 \]

Interpretasi: Perokok memiliki risiko terkena penyakit paru-paru lebih tinggi sebesar 30% dibanding bukan perokok.


Relative Risk (RR)

\[ RR = \frac{a/(a + b)}{c/(c + d)} = \frac{40/100}{10/100} = \frac{0.4}{0.1} = 4 \]

Interpretasi: Perokok memiliki 4 kali lipat risiko terkena penyakit paru-paru dibanding bukan perokok.


Odds Ratio (OR)

\[ OR = \frac{a \cdot d}{b \cdot c} = \frac{40 \cdot 90}{60 \cdot 10} = \frac{3600}{600} = 6 \]

Interpretasi: Odds perokok terkena penyakit paru-paru adalah 6 kali lebih besar daripada bukan perokok.


Implementasi di R

# Data tabel kontingensi
tabel <- matrix(c(40, 60, 10, 90), nrow = 2, byrow = TRUE)
colnames(tabel) <- c("Sakit", "Tidak_Sakit")
rownames(tabel) <- c("Perokok", "Bukan_Perokok")
tabel <- as.table(tabel)

# Tampilkan tabel
tabel
##               Sakit Tidak_Sakit
## Perokok          40          60
## Bukan_Perokok    10          90
# Hitung ukuran asosiasi
a <- 40; b <- 60; c <- 10; d <- 90

# Risk Difference
RD <- (a / (a + b)) - (c / (c + d))
# Relative Risk
RR <- (a / (a + b)) / (c / (c + d))
# Odds Ratio
OR <- (a * d) / (b * c)

cat("Risk Difference (RD):", RD, "\n")
## Risk Difference (RD): 0.3
cat("Relative Risk (RR):", RR, "\n")
## Relative Risk (RR): 4
cat("Odds Ratio (OR):", OR, "\n")
## Odds Ratio (OR): 6

Tabel Ringkasan Ukuran Asosiasi 2x2

Ukuran Asosiasi Rumus Nilai & Interpretasi Cocok Untuk Studi Keterangan Tambahan
Risk Difference (RD) \(RD = \frac{a}{a+b} - \frac{c}{c+d}\) 0 = tidak ada efek
>0 = efek positif
<0 = efek negatif
Eksperimen, Kohort Prospektif Menunjukkan selisih absolut risiko
Relative Risk (RR) \(RR = \frac{a/(a+b)}{c/(c+d)}\) 1 = tidak ada efek
>1 = risiko lebih tinggi
<1 = risiko lebih rendah
Eksperimen, Kohort Mudah dipahami awam; butuh proporsi
Odds Ratio (OR) \(OR = \frac{a \cdot d}{b \cdot c}\) 1 = tidak ada asosiasi
>1 = asosiasi positif
<1 = negatif
Kasus-Kontrol, Retrospektif Bisa mendekati RR saat kejadian jarang

Tips Kontekstual Penggunaan

Kapan sebaiknya menggunakan Tabel Kontingensi 22?

  • Saat kamu menganalisis hubungan antara dua variabel kategori biner, misalnya: Ya/Tidak, Positif/Negatif, Sakit/Sehat.
  • Contoh: Meneliti hubungan antara kebiasaan merokok (Ya/Tidak) dengan status penyakit paru-paru (Ada/Tidak).

Kapan menghitung Peluang Bersama, Marginal, dan Bersyarat?

  • Gunakan Peluang Bersama saat ingin tahu kombinasi dua kejadian sekaligus.
  • Gunakan Peluang Marginal saat hanya tertarik dengan salah satu variabel, tanpa mempedulikan variabel lainnya.
  • Gunakan Peluang Bersyarat saat ingin tahu probabilitas suatu kejadian dengan asumsi kejadian lainnya sudah terjadi.

Kapan memakai Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR)?

  • RD cocok untuk melihat selisih risiko secara langsung (misalnya untuk evaluasi program kesehatan).
  • RR sangat berguna dalam studi kohort atau eksperimen, karena menunjukkan seberapa besar peningkatan risiko.
  • OR sering digunakan dalam studi kasus-kontrol, karena tidak tergantung pada distribusi total populasi.

BAB 6 : INFERENSI DALAM TABEL KONTINGENSI 2X2

6.1 Pendahuluan: Kenapa Inferensi Diperlukan?

Bayangkan kamu sedang melakukan survei terhadap 200 pelanggan restoran untuk mengetahui hubungan antara kepuasan layanan dan keinginan untuk kembali. Kamu menemukan bahwa sebagian besar pelanggan yang puas, ingin kembali. Tapi…

Apakah hasil ini berlaku juga untuk seluruh pelanggan yang belum disurvei? Inilah pertanyaan inti dalam inferensi statistik


Apa itu Inferensi Statistik?

Inferensi statistik adalah proses membuat kesimpulan umum tentang populasi berdasarkan data sampel.

Dalam konteks tabel kontingensi dua arah, kita tertarik pada:

  • Apakah dua variabel kategori berhubungan?
  • Seberapa kuat hubungan itu?
  • Apakah hasil hubungan itu bermakna secara statistik?

Contoh Kasus:

Kamu mengamati data seperti ini dari sebuah survei:

Ingin Kembali Tidak Ingin Kembali Total
Puas 70 10 80
Tidak Puas 20 100 120
Total 90 110 200

Dari tabel ini kamu bisa menghitung proporsi dan melihat pola, tetapi apakah pola ini signifikan?
Dengan kata lain: apakah ini terjadi karena kebetulan saja, atau benar-benar ada asosiasi antara kepuasan dan keinginan kembali?


Mengapa Ini Penting?

  • Dalam dunia nyata, kita tidak bisa meneliti seluruh populasi.
  • Maka, kita perlu mengandalkan estimasi dan uji hipotesis untuk memastikan bahwa temuan kita tidak disebabkan oleh fluktuasi acak.
  • Dengan inferensi, kita bisa mendukung pengambilan keputusan berbasis data.

Tips Kontekstual

  • Gunakan inferensi hanya jika data diperoleh dari sampel acak atau studi representatif.
  • Pastikan ukuran sampel mencukupi agar estimasi dan pengujian tidak bias.
  • Selalu padukan nilai statistik dengan interpretasi kontekstual (apa arti angka itu dalam kasus nyata).

6.2 Estimasi dalam Tabel Kontingensi

Sebelum kita menguji hipotesis, penting untuk mengetahui berapa besar proporsi atau risiko dari suatu kejadian pada masing-masing kelompok. Inilah yang disebut dengan proses estimasi.

Estimasi terbagi dua:

  • Estimasi Titik: Nilai tunggal terbaik sebagai dugaan parameter populasi.
  • Estimasi Interval: Rentang nilai yang diyakini memuat parameter populasi dengan tingkat keyakinan tertentu (misalnya 95%).

6.2.1 Estimasi Titik

Estimasi titik sangat sederhana. Misalnya, kita ingin mengestimasi proporsi pelanggan puas yang ingin kembali berdasarkan data berikut:

Ingin Kembali Tidak Ingin Kembali Total
Puas 70 10 80
Tidak Puas 20 100 120
Total 90 110 200

Estimasi titik proporsi pelanggan puas yang ingin kembali: \[ \hat{p}_{puas} = \frac{70}{80} = 0.875 \]

Artinya, sekitar 87.5% dari pelanggan yang puas ingin kembali.


6.2.2 Estimasi Interval (Confidence Interval)

Untuk mengetahui seberapa yakin kita terhadap estimasi titik, kita gunakan interval kepercayaan (confidence interval, CI).

Untuk proporsi, rumus CI: \[ \hat{p} \pm z_{\alpha/2} \sqrt{\frac{\hat{p}(1 - \hat{p})}{n}} \]

Dengan: - \(\hat{p}\) = proporsi sampel - \(z_{\alpha/2}\) = nilai z dari distribusi normal standar (contoh: 1.96 untuk 95% CI) - \(n\) = jumlah sampel

Contoh: hitung 95% CI untuk \(\hat{p}_{puas}\)

\[ \hat{p} = 0.875,\quad n = 80,\quad z = 1.96 \] \[ CI = 0.875 \pm 1.96 \times \sqrt{\frac{0.875 \times 0.125}{80}} \approx 0.875 \pm 0.074 \] \[ CI = (0.801,\ 0.949) \]

Jadi, kita 95% yakin bahwa proporsi pelanggan puas yang ingin kembali berada antara 80.1% hingga 94.9%.


Implementasi di R

# Data
x <- 70       # jumlah yang ingin kembali
n <- 80       # total yang puas

# Estimasi titik
p_hat <- x / n

# Estimasi interval 95%
z <- 1.96
se <- sqrt(p_hat * (1 - p_hat) / n)
ci_lower <- p_hat - z * se
ci_upper <- p_hat + z * se

c(p_hat = p_hat, CI_lower = ci_lower, CI_upper = ci_upper)
##    p_hat CI_lower CI_upper 
## 0.875000 0.802528 0.947472

6.3 Uji Hipotesis dalam Tabel Kontingensi 22

Setelah kita memiliki estimasi, langkah selanjutnya adalah menentukan apakah perbedaan yang diamati itu signifikan secara statistik atau hanya terjadi karena kebetulan.

Uji hipotesis membantu kita menjawab pertanyaan seperti: > Apakah ada perbedaan proporsi antara dua kelompok? Apakah dua variabel kategori saling berhubungan?


6.3.1 Uji Proporsi Dua Kelompok (Z-test untuk dua proporsi)

Uji proporsi digunakan saat kita ingin membandingkan dua proporsi dari dua kelompok independen, contohnya membandingkan proporsi pelanggan yang ingin kembali antara kelompok “Puas” dan “Tidak Puas”.

Hipotesis

  • H (nol): Tidak ada perbedaan proporsi (\(p_1 = p_2\))
  • H (alternatif): Ada perbedaan proporsi (\(p_1 \ne p_2\))

Contoh Data

Ingin Kembali Tidak Ingin Kembali Total
Puas 70 10 80
Tidak Puas 20 100 120

Rumus Statistik Uji

\[ z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{p(1-p) \left(\frac{1}{n_1} + \frac{1}{n_2}\right)}} \] Dengan: - \(\hat{p}_1 = 70/80 = 0.875\) - \(\hat{p}_2 = 20/120 = 0.167\) - \(p = \frac{70 + 20}{80 + 120} = 0.45\) proporsi gabungan

Perhitungan Manual

\[ z = \frac{0.875 - 0.167}{\sqrt{0.45(1 - 0.45)\left(\frac{1}{80} + \frac{1}{120}\right)}} \approx \frac{0.708}{0.089} \approx 7.96 \]

Nilai z = 7.96 sangat besar, sehingga H ditolak. Artinya, terdapat perbedaan signifikan proporsi antara dua kelompok.


Implementasi di R

# Data
success <- c(70, 20)
total <- c(80, 120)

# Uji proporsi dua sampel
prop.test(success, total, correct = FALSE)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  success out of total
## X-squared = 97.306, df = 1, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  0.6098543 0.8068124
## sample estimates:
##    prop 1    prop 2 
## 0.8750000 0.1666667

Catatan : Gunakan uji proporsi jika ingin mengetahui efektivitas kampanye, pengaruh pelayanan, atau perbedaan tingkat kepuasan antar dua kelompok serta pastikan sampel independen dan besar cukup agar hasil uji valid

6.3.2 Uji Asosiasi (Chi-Square Test of Independence)

Uji Chi-Square merupakan metode paling umum dalam analisis data kategori untuk mengevaluasi apakah dua variabel kategori saling berkaitan atau independen.

Tujuan

Untuk mengetahui apakah distribusi satu variabel berbeda tergantung pada kategori variabel lainnya.

Hipotesis

  • H (nol): Tidak ada asosiasi antara dua variabel variabel independen.
  • H (alternatif): Ada asosiasi antara dua variabel variabel tidak independen.

Contoh Tabel Kontingensi

Kepuasan Ya (Kembali) Tidak Total
Puas 70 10 80
Tidak Puas 20 100 120
Total 90 110 200

Rumus Chi-Square

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

  • \(O_{ij}\): frekuensi observasi
  • \(E_{ij}\): frekuensi harapan, dihitung dengan: \[ E_{ij} = \frac{(\text{baris total}) \times (\text{kolom total})}{\text{total keseluruhan}} \]

Perhitungan Manual (Ringkas)

Contoh \(E_{11} = \frac{80 \times 90}{200} = 36\)

\[ \chi^2 = \frac{(70 - 36)^2}{36} + \frac{(10 - 44)^2}{44} + \cdots \]

Hitung seluruh komponen dan jumlahkan untuk mendapatkan nilai chi-square total.


Implementasi di R

# Membuat tabel kontingensi
data <- matrix(c(70, 10, 20, 100),
               nrow = 2,
               byrow = TRUE)
dimnames(data) <- list(
  Kepuasan = c("Puas", "Tidak Puas"),
  Kembali = c("Ya", "Tidak")
)

# Uji Chi-Square
chisq.test(data, correct = FALSE)
## 
##  Pearson's Chi-squared test
## 
## data:  data
## X-squared = 97.306, df = 1, p-value < 2.2e-16

Catatan : Cocok digunakan dalam survei pelanggan, riset sosial, dan data observasi untuk mencari tahu apakah dua faktor saling berkaitan.

6.3.3 Uji Independensi (Fishers Exact Test)

Uji Fishers Exact Test adalah alternatif dari uji Chi-Square untuk data kategori 2x2 ketika jumlah pengamatan kecil, terutama jika terdapat frekuensi harapan di bawah 5.


Kapan Digunakan?

  • Tabel kontingensi 2 x 2
  • Ukuran sampel kecil
  • Beberapa sel memiliki frekuensi < 5
  • Data berasal dari sampling acak sederhana

Hipotesis

  • H (nol): Tidak ada hubungan antara dua variabel (independen)
  • H (alternatif): Ada hubungan antara dua variabel (terkait)

Contoh Kasus

Obat Sembuh Tidak Sembuh Total
A 3 1 4
B 1 3 4
Total 4 4 8

Konsep Perhitungan

Rumus tidak ditulis eksplisit karena perhitungan Fisher dilakukan dengan menghitung semua kemungkinan kombinasi tabel dengan margin tetap dan membandingkan probabilitasnya.

\[ p = \frac{{\binom{a+b}{a} \binom{c+d}{c}}}{{\binom{n}{a+c}}} \]

Namun, dalam praktik, perhitungannya dilakukan langsung menggunakan software statistik.


Implementasi di R

# Tabel data kecil
fisher_data <- matrix(c(3, 1, 1, 3),
                      nrow = 2,
                      byrow = TRUE)
dimnames(fisher_data) <- list(
  Obat = c("A", "B"),
  Status = c("Sembuh", "Tidak Sembuh")
)

# Uji Fisher
fisher.test(fisher_data)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  fisher_data
## p-value = 0.4857
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
##    0.2117329 621.9337505
## sample estimates:
## odds ratio 
##   6.408309

Catatan : Gunakan Fisher untuk penelitian klinis kecil, studi awal, atau eksperimen terbatas,Uji ini lebih konservatif daripada Chi-Square.

Tabel Perbandingan: Uji Proporsi, Chi-Square, dan Fishers Exact Test

Aspek Uji Proporsi (Z-Test) Uji Chi-Square Fishers Exact Test
Jenis Data Kategori 22 (proporsi) Kategori 22 atau lebih Kategori 22 (terutama jika frekuensi kecil)
Asumsi Data besar, distribusi mendekati normal Frekuensi harapan tiap sel > 5 Tidak memerlukan asumsi distribusi
Output Nilai Z dan p-value Nilai Chi-square dan p-value p-value
Keakuratan Kurang akurat bila ukuran sampel kecil Kurang akurat bila ada sel dengan frekuensi kecil Sangat akurat untuk sampel kecil
Komputasi Cepat dan sederhana Sederhana dan umum tersedia di software statistik Lebih kompleks secara komputasi
Cocok digunakan saat… Sampel besar dan distribusi mendekati normal Mayoritas sel memiliki E_ij > 5 Terdapat sel dengan E_ij < 5 atau total n kecil

Tips: Gunakan Fisher jika total responden < 30 atau tabel memiliki sel dengan ekspektasi < 5.

6.4 Analisis Residual dalam Tabel Kontingensi

Setelah melakukan uji Chi-Square atau Fisher untuk mengetahui apakah ada hubungan antara dua variabel, kita bisa melangkah lebih jauh dengan melakukan analisis residual.

Tujuannya? Mengetahui sel mana yang menyumbang signifikan terhadap asosiasi yang ditemukan.


Apa itu Residual?

Residual adalah selisih antara nilai yang diamati (observed) dan nilai yang diharapkan (expected). Dalam tabel kontingensi, residual membantu kita melihat sejauh mana data aktual menyimpang dari model independensi.

Rumus umum residual: \[ \text{Residual}_{ij} = O_{ij} - E_{ij} \]

Keterangan: - \(O_{ij}\): frekuensi observasi pada sel ke-\(i,j\) - \(E_{ij}\): frekuensi harapan jika tidak ada hubungan (independen)


Jenis Residual

Berikut adalah beberapa jenis residual yang sering digunakan dalam deteksi outlier:

1. Pearson Residual

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

Interpretasi:

-Jika \(|R_{ij}| > 2\), maka sel tersebut bisa dianggap mencurigakan. - Cocok untuk ukuran sampel besar.

2. Standardized Residual (SR)

\[ SR_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}(1 - p_{i.})(1 - p_{.j})}} \]

  • Memperhitungkan variabilitas dari proporsi baris dan kolom.

3. Adjusted Residual

Adjusted residual mempertimbangkan koreksi atas dependensi struktur baris dan kolom. Nilai-nilainya digunakan dalam output software seperti SPSS.


Contoh Kasus dan Perhitungan di R

Misalkan kamu memiliki data preferensi terhadap dua merek minuman:

Suka Merek A Suka Merek B Total
Pria 30 20 50
Wanita 10 40 50
Total 40 60 100

Implementasi di R

# Data Observasi
observed <- matrix(c(30, 20, 10, 40), nrow = 2, byrow = TRUE)
rownames(observed) <- c("Pria", "Wanita")
colnames(observed) <- c("Merek A", "Merek B")

# Uji Chi-Square tanpa koreksi
chi_result <- chisq.test(observed, correct = FALSE)

# Lihat residual Pearson
chi_result$residuals
##          Merek A   Merek B
## Pria    2.236068 -1.825742
## Wanita -2.236068  1.825742
# Lihat expected
chi_result$expected
##        Merek A Merek B
## Pria        20      30
## Wanita      20      30

Interpretasi Residual :

  • Sel (Pria, Merek A): Residual positif tinggi lebih banyak dari ekspektasi.
  • Sel (Wanita, Merek A): Residual negatif lebih sedikit dari ekspektasi.
  • Residual tinggi (positif/negatif) = indikasi penyimpangan dari independensi potensi outlier atau pola menarik!

Aturan umum:

  • Residual > +2 frekuensi terlalu tinggi.
  • Residual< 2 frekuensi terlalu rendah.
  • Residual antara -2 dan 2 dalam batas wajar.

6.5 Deteksi Outlier Menggunakan Residual

Dalam analisis data kategori, khususnya saat menggunakan tabel kontingensi, kita tidak hanya ingin mengetahui apakah terdapat asosiasi antara dua variabel, tetapi juga apakah terdapat sel-sel yang menyimpang secara signifikan dari ekspektasi. Sel-sel ini bisa menjadi indikasi outlier atau pola khusus dalam data. ### Kapan Residual Dianggap Outlier?

  • Jika nilai residual (Pearson atau deviance) lebih dari 2 atau kurang dari -2, maka bisa dianggap indikasi outlier.
  • Nilai > 3 sangat mencurigakan sebagai outlier kuat.

Contoh Implementasi di R

# Simulasi kombinasi faktor
x.sex <- factor(rep(c("F", "M"), each = 6))     # 2 level
y.fav <- factor(rep(c("tidak", "favor"), times = 6))  # 2 level
z.fund <- factor(rep(c("liberal", "moderat", "fundamental"), times = 4))  # 3 level

# Frekuensi kejadian tiap kombinasi
counts <- c(10, 18, 8, 14, 9, 12, 5, 15, 7, 20, 6, 13)  # total 12 kombinasi
table_data <- data.frame(
  Gender = x.sex,
  Favor = y.fav,
  Fund = z.fund,
  Observed = counts
)

knitr::kable(table_data, caption = "Tabel Kontingensi 3 Arah")
Tabel Kontingensi 3 Arah
Gender Favor Fund Observed
F tidak liberal 10
F favor moderat 18
F tidak fundamental 8
F favor liberal 14
F tidak moderat 9
F favor fundamental 12
M tidak liberal 5
M favor moderat 15
M tidak fundamental 7
M favor liberal 20
M tidak moderat 6
M favor fundamental 13
# Model log-linear (interaksi 2 arah: sex*fav + fund)
model <- glm(counts ~ x.sex * y.fav + z.fund, family = poisson)
summary(model)
## 
## Call:
## glm(formula = counts ~ x.sex * y.fav + z.fund, family = poisson)
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        2.55309    0.20107  12.698   <2e-16 ***
## x.sexM             0.08701    0.20871   0.417   0.6768    
## y.favtidak        -0.48835    0.24447  -1.998   0.0458 *  
## z.fundliberal      0.20294    0.21309   0.952   0.3409    
## z.fundmoderat      0.18232    0.21409   0.852   0.3944    
## x.sexM:y.favtidak -0.49248    0.36899  -1.335   0.1820    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 21.8449  on 11  degrees of freedom
## Residual deviance:  2.3134  on  6  degrees of freedom
## AIC: 64.786
## 
## Number of Fisher Scoring iterations: 4
# Hitung residual
res_pearson <- residuals(model, type = "pearson")
res_deviance <- residuals(model, type = "deviance")

# Gabungkan ke dataframe
res_df <- data.frame(
  Gender = x.sex,
  Favor = y.fav,
  Fund = z.fund,
  Observed = counts,
  Fitted = fitted(model),
  Pearson = res_pearson,
  Deviance = res_deviance
)

# Lihat kandidat outlier (residual > 2 atau < -2)
subset(res_df, abs(Pearson) > 2 | abs(Deviance) > 2)
## [1] Gender   Favor    Fund     Observed Fitted   Pearson  Deviance
## <0 rows> (or 0-length row.names)

BAB 7: Tabel Kontingensi 3 Arah

Teori Tabel Kontingensi 3 Arah

Tabel kontingensi 3 arah digunakan untuk menganalisis hubungan antara tiga variabel kategorik. Dalam tabel ini, kita dapat melihat bagaimana dua variabel berhubungan, sambil mempertimbangkan pengaruh variabel ketiga.

Tabel ini terdiri dari baris dan kolom yang mewakili dua variabel, sementara variabel ketiga digunakan untuk membuat strata atau subkelompok. Tabel kontingensi 3 arah memungkinkan kita untuk mengidentifikasi hubungan bersyarat antara dua variabel, dengan mempertimbangkan efek dari variabel ketiga.


Struktur Tabel Kontingensi 3 Arah

Misalnya kita memiliki 3 variabel:

  • X (variabel pertama)
  • Y (variabel kedua)
  • Z (variabel ketiga)

Struktur tabel kontingensi 3 arah bisa terlihat seperti ini:

Y = 0 Y = 1 Total
X = 0, Z = 0 a11 a12 a1+
X = 0, Z = 1 a21 a22 a2+
X = 1, Z = 0 a31 a32 a3+
X = 1, Z = 1 a41 a42 a4+
Total b1+ b2+ n

Keterangan:

  • \(a11, a12, a21, \dots\) adalah frekuensi sel di dalam tabel.
  • \(a1+, a2+, a3+, a4+\) adalah jumlah per kombinasi X dan Z.
  • \(b1+, b2+\) adalah jumlah per kategori Y.
  • \(n\) adalah total seluruh data.

7.1 Tabel Parsial dan Marginal

7.1.1 Tabel Marginal

Tabel marginal menunjukkan jumlah total untuk setiap variabel tanpa memperhatikan variabel lainnya. Tabel ini memberikan gambaran umum mengenai distribusi frekuensi pada setiap variabel secara terpisah.

Contoh Tabel Marginal:

Dari tabel kontingensi 3 arah sebelumnya, kita bisa menghitung jumlah marginal untuk setiap kategori variabel \(X\), \(Y\), dan \(Z\).

7.1.2. Tabel Parsial

Tabel parsial menunjukkan distribusi frekuensi bersyarat berdasarkan dua variabel tertentu, sambil mengontrol atau mempertimbangkan variabel ketiga. Tabel ini membantu kita melihat hubungan antara dua variabel dengan kondisi tetap pada variabel ketiga.

Contoh Tabel Parsial:

  • Tabel parsial \(P(X|Z=0)\) menunjukkan distribusi frekuensi X dengan mengontrol variabel Z = 0.

Contoh Data dan Perhitungan Manual

Misalnya kita memiliki data sebagai berikut:

X  Y Y=0 Y=1 Total
X=0, Z=0 10 5 15
X=0, Z=1 8 7 15
X=1, Z=0 6 9 15
X=1, Z=1 12 3 15
Total 36 24 60

Dari tabel ini, kita dapat menghitung tabel marginal dan parsial.

Langkah 1: Hitung Tabel Marginal

  • Total untuk X = 0: \(a11 + a12 + a21 + a22 = 10 + 5 + 8 + 7 = 30\)
  • Total untuk X = 1: \(a31 + a32 + a41 + a42 = 6 + 9 + 12 + 3 = 30\)
  • Total untuk Y = 0: \(b1+ = a11 + a21 + a31 + a41 = 10 + 8 + 6 + 12 = 36\)
  • Total untuk Y = 1: \(b2+ = a12 + a22 + a32 + a42 = 5 + 7 + 9 + 3 = 24\)

Tabel Marginal:

X  Y Y=0 Y=1 Total
X=0 18 12 30
X=1 18 12 30
Total 36 24 60

Langkah 2: Hitung Tabel Parsial

Misalnya, kita ingin menghitung tabel parsial \(P(X|Z=0)\), yang menunjukkan distribusi frekuensi X dengan Z = 0:

X  Y Y=0 Y=1 Total
X=0 10 5 15
X=1 6 9 15
Total 16 14 30

Implementasi dengan R

Berikut adalah implementasi di R untuk menghitung tabel marginal dan parsial:

# Membuat tabel kontingensi
data <- matrix(c(10, 5, 8, 7, 6, 9, 12, 3), nrow = 4, byrow = TRUE,
              dimnames = list(X = c("X=0, Z=0", "X=0, Z=1", "X=1, Z=0", "X=1, Z=1"),
                              Y = c("Y=0", "Y=1")))

# Menampilkan tabel kontingensi
cat("Tabel Kontingensi:\n")
## Tabel Kontingensi:
print(data)
##           Y
## X          Y=0 Y=1
##   X=0, Z=0  10   5
##   X=0, Z=1   8   7
##   X=1, Z=0   6   9
##   X=1, Z=1  12   3
# Tabel Marginal
marginal <- margin.table(data, 1)  # Total per X
cat("\nTabel Marginal X:\n")
## 
## Tabel Marginal X:
print(marginal)
## X
## X=0, Z=0 X=0, Z=1 X=1, Z=0 X=1, Z=1 
##       15       15       15       15
marginal_Y <- margin.table(data, 2)  # Total per Y
cat("\nTabel Marginal Y:\n")
## 
## Tabel Marginal Y:
print(marginal_Y)
## Y
## Y=0 Y=1 
##  36  24
# Tabel Parsial P(X|Z=0)
parsial_Z0 <- data[1:2, ]  # Sel dengan Z=0
cat("\nTabel Parsial P(X|Z=0):\n")
## 
## Tabel Parsial P(X|Z=0):
print(parsial_Z0)
##           Y
## X          Y=0 Y=1
##   X=0, Z=0  10   5
##   X=0, Z=1   8   7

Kesimpulan

  • Tabel Kontingensi 3 Arah sangat berguna untuk menganalisis hubungan antara tiga variabel kategorik sekaligus. Ini memberikan wawasan yang lebih mendalam tentang asosiasi bersyarat antar variabel, dan memperlihatkan bagaimana dua variabel dapat saling mempengaruhi setelah mempertimbangkan variabel ketiga.

  • Tabel Marginal memberikan informasi mengenai distribusi total frekuensi untuk setiap kategori dalam variabel tanpa memperhatikan hubungan dengan variabel lainnya. Tabel ini berguna untuk mendapatkan gambaran umum distribusi data.

  • Tabel Parsial sangat penting ketika kita ingin menganalisis distribusi bersyarat antara dua variabel sambil mengontrol variabel ketiga. Ini membantu untuk mengeksplorasi bagaimana hubungan antar variabel berubah ketika satu variabel dikendalikan.

Secara keseluruhan, teknik ini sangat penting dalam analisis data kategorik, terutama ketika kita ingin memahami hubungan lebih kompleks antara beberapa variabel. Dengan menghitung tabel marginal dan tabel parsial, kita dapat memisahkan efek dan melihat bagaimana setiap variabel berkontribusi pada hasil keseluruhan.

7.2 Distribusi Peluang

Peluang Bersama (Joint Probability)

Peluang bersama atau joint probability adalah peluang bahwa dua peristiwa terjadi secara bersamaan. Misalnya, kita ingin mengetahui peluang bahwa variabel \(X = 0\) dan \(Y = 1\) terjadi bersama-sama. Peluang ini biasanya dilambangkan dengan \(P(X = x, Y = y)\), yang dapat dihitung menggunakan data frekuensi bersama.

Rumus untuk menghitung peluang bersama dua peristiwa \(X\) dan \(Y\) adalah:

\[ P(X = x, Y = y) = \frac{\text{Frekuensi bersama}}{\text{Total sampel}} \]

Di mana:

  • Frekuensi bersama adalah jumlah kasus di mana kedua peristiwa \(X = x\) dan \(Y = y\) terjadi.
  • Total sampel adalah jumlah seluruh pengamatan dalam data.

Peluang Marginal

Peluang marginal adalah peluang dari satu peristiwa saja, tanpa mempertimbangkan peristiwa lainnya. Peluang marginal untuk variabel \(X\) adalah total peluang dari semua nilai yang mungkin dari variabel \(X\), tanpa memperhatikan nilai \(Y\).

Peluang marginal untuk \(X\) dihitung sebagai jumlah dari peluang bersama untuk setiap nilai \(X\) dengan semua nilai \(Y\):

\[ P(X = x) = \sum_{y} P(X = x, Y = y) \]

Begitu pula untuk peluang marginal \(Y\):

\[ P(Y = y) = \sum_{x} P(X = x, Y = y) \]


Peluang Bersyarat (Conditional Probability)

Peluang bersyarat adalah peluang bahwa peristiwa \(X\) terjadi, dengan kondisi bahwa peristiwa \(Y\) telah terjadi. Peluang bersyarat dihitung dengan menggunakan rumus:

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

Di mana:

  • \(P(X = x | Y = y)\) adalah peluang bersyarat bahwa \(X = x\) diberikan \(Y = y\).
  • \(P(X = x, Y = y)\) adalah peluang bersama dari \(X = x\) dan \(Y = y\).
  • \(P(Y = y)\) adalah peluang marginal dari \(Y = y\).

7.3 Tabel Probabilitas Bersama, Marginal, dan Bersyarat

1. Tabel Probabilitas Bersama

Tabel probabilitas bersama menunjukkan peluang bahwa kedua variabel terjadi bersama. Jika kita memiliki tabel kontingensi, kita dapat menghitung peluang bersama dengan membagi frekuensi bersama dengan jumlah total sampel.

2. Tabel Peluang Marginal

Tabel peluang marginal menunjukkan peluang dari satu peristiwa tanpa mempertimbangkan peristiwa lainnya. Ini dapat dihitung dengan menjumlahkan nilai-nilai dalam tabel probabilitas bersama.

3. Tabel Peluang Bersyarat

Tabel peluang bersyarat menunjukkan peluang suatu peristiwa terjadi dengan kondisi peristiwa lainnya. Ini dihitung dengan membagi nilai dalam tabel probabilitas bersama dengan total kolom atau baris yang sesuai.


Contoh Perhitungan Manual

Misalkan kita memiliki data sebagai berikut (tabel frekuensi):

X  Y Y=0 Y=1 Total
X=0 10 5 15
X=1 6 9 15
Total 16 14 30

Langkah 1: Hitung Peluang Bersama

Misalkan kita ingin menghitung peluang bersama \(P(X=0, Y=0)\):

\[ P(X = 0, Y = 0) = \frac{\text{Frekuensi}(X=0, Y=0)}{\text{Total Sampel}} = \frac{10}{30} = 0.3333 \]

Langkah 2: Hitung Peluang Marginal

Untuk menghitung peluang marginal \(P(X=0)\):

\[ P(X = 0) = \frac{\text{Total frekuensi untuk X=0}}{\text{Total Sampel}} = \frac{15}{30} = 0.5 \]

Untuk menghitung peluang marginal \(P(Y=0)\):

\[ P(Y = 0) = \frac{\text{Total frekuensi untuk Y=0}}{\text{Total Sampel}} = \frac{16}{30} = 0.5333 \]

Langkah 3: Hitung Peluang Bersyarat

Untuk menghitung peluang bersyarat \(P(X=0 | Y=0)\):

\[ P(X = 0 | Y = 0) = \frac{P(X = 0, Y = 0)}{P(Y = 0)} = \frac{0.3333}{0.5333} = 0.625 \]


Berikut adalah implementasi di R untuk menghitung peluang bersama, peluang marginal, dan peluang bersyarat:

# Membuat tabel kontingensi
data <- matrix(c(10, 5, 6, 9), nrow = 2, byrow = TRUE, 
              dimnames = list(X = c("X=0", "X=1"), Y = c("Y=0", "Y=1")))

# Menampilkan tabel kontingensi
cat("Tabel Kontingensi:\n")
## Tabel Kontingensi:
print(data)
##      Y
## X     Y=0 Y=1
##   X=0  10   5
##   X=1   6   9
# Total sampel
total_sample <- sum(data)

# Peluang bersama P(X=0, Y=0)
p_joint <- data[1,1] / total_sample
cat("\nPeluang Bersama P(X=0, Y=0):\n")
## 
## Peluang Bersama P(X=0, Y=0):
print(p_joint)
## [1] 0.3333333
# Peluang marginal P(X=0)
p_x0 <- sum(data[1,]) / total_sample
cat("\nPeluang Marginal P(X=0):\n")
## 
## Peluang Marginal P(X=0):
print(p_x0)
## [1] 0.5
# Peluang marginal P(Y=0)
p_y0 <- sum(data[,1]) / total_sample
cat("\nPeluang Marginal P(Y=0):\n")
## 
## Peluang Marginal P(Y=0):
print(p_y0)
## [1] 0.5333333
# Peluang bersyarat P(X=0 | Y=0)
p_conditional <- p_joint / p_y0
cat("\nPeluang Bersyarat P(X=0 | Y=0):\n")
## 
## Peluang Bersyarat P(X=0 | Y=0):
print(p_conditional)
## [1] 0.625

7.4 Ukuran Asosiasi

Ukuran asosiasi digunakan untuk mengukur kekuatan dan arah hubungan antara dua variabel. Dalam analisis data kategorik, kita sering menggunakan tiga ukuran asosiasi utama: Beda Peluang (Risk Difference, RD), Risiko Relatif (Relative Risk, RR), dan Odds Ratio (OR). Berikut adalah penjelasan dan rumus untuk masing-masing.

1. Beda Peluang (Risk Difference, RD)

Beda peluang adalah selisih antara dua peluang, yang digunakan untuk mengukur perbedaan peluang terjadinya peristiwa di antara dua kelompok. Biasanya, ukuran ini digunakan untuk membandingkan dua kelompok atau kategori dalam suatu studi.

Rumus

Rumus untuk menghitung Beda Peluang (RD) adalah:

\[ RD = P(\text{Event A}) - P(\text{Event B}) \]

Di mana:

  • \(P(\text{Event A})\) adalah peluang kejadian pada kelompok A.
  • \(P(\text{Event B})\) adalah peluang kejadian pada kelompok B.

Contoh Kasus

Misalkan dalam studi mengenai vaksinasi, kita memiliki dua kelompok:

  • Kelompok A (divaksinasi): 40 dari 100 orang terinfeksi.
  • Kelompok B (tidak divaksinasi): 70 dari 100 orang terinfeksi.

Peluang infeksi untuk kelompok A = \(\frac{40}{100} = 0.4\) Peluang infeksi untuk kelompok B = \(\frac{70}{100} = 0.7\)

Maka, beda peluang (RD) adalah:

\[ RD = 0.4 - 0.7 = -0.3 \]

Artinya, kelompok yang divaksinasi memiliki 30% risiko lebih rendah untuk terinfeksi dibandingkan kelompok yang tidak divaksinasi.


2. Risiko Relatif (Relative Risk, RR)

Risiko relatif adalah rasio antara dua peluang, yang digunakan untuk menunjukkan seberapa besar risiko terjadinya peristiwa pada satu kelompok dibandingkan dengan kelompok lainnya.

Rumus untuk menghitung Risiko Relatif (RR) adalah:

\[ RR = \frac{P(\text{Event A})}{P(\text{Event B})} \]

Di mana:

  • \(P(\text{Event A})\) adalah peluang kejadian pada kelompok A.
  • \(P(\text{Event B})\) adalah peluang kejadian pada kelompok B.

Contoh Kasus

Menggunakan data dari contoh sebelumnya:

  • Kelompok A (divaksinasi): 40 dari 100 orang terinfeksi.
  • Kelompok B (tidak divaksinasi): 70 dari 100 orang terinfeksi.

Peluang infeksi untuk kelompok A = \(\frac{40}{100} = 0.4\) Peluang infeksi untuk kelompok B = \(\frac{70}{100} = 0.7\)

Maka, risiko relatif (RR) adalah:

\[ RR = \frac{0.4}{0.7} \approx 0.571 \]

Artinya, kelompok yang divaksinasi memiliki 57% risiko infeksi dibandingkan dengan kelompok yang tidak divaksinasi.


3. Odds Ratio (OR)

Odds ratio adalah rasio antara peluang terjadinya peristiwa dan peluang tidak terjadinya peristiwa dalam dua kelompok yang berbeda. OR sering digunakan dalam studi kasus kontrol dan merupakan ukuran asosiasi yang lebih tepat jika data tidak seimbang.

Rumus untuk menghitung Odds Ratio (OR) adalah:

\[ OR = \frac{P(\text{Event A}) / (1 - P(\text{Event A}))}{P(\text{Event B}) / (1 - P(\text{Event B}))} \]

Di mana:

  • \(P(\text{Event A})\) adalah peluang kejadian pada kelompok A.
  • \(P(\text{Event B})\) adalah peluang kejadian pada kelompok B.

Contoh Kasus

Menggunakan data yang sama: - Kelompok A (divaksinasi): 40 dari 100 orang terinfeksi. - Kelompok B (tidak divaksinasi): 70 dari 100 orang terinfeksi.

Peluang infeksi untuk kelompok A = \(\frac{40}{100} = 0.4\) Peluang infeksi untuk kelompok B = \(\frac{70}{100} = 0.7\)

Maka, odds ratio (OR) adalah:

\[ OR = \frac{0.4 / (1 - 0.4)}{0.7 / (1 - 0.7)} = \frac{0.4 / 0.6}{0.7 / 0.3} = \frac{0.6667}{2.3333} \approx 0.286 \]

Artinya, kelompok yang divaksinasi memiliki odds infeksi 0.286 kali lebih rendah dibandingkan dengan kelompok yang tidak divaksinasi.


Struktur Data dalam Kontingensi 3D

Tabel Kontingensi 3D

Tabel kontingensi 3D digunakan untuk menganalisis hubungan antara tiga variabel kategorik. Struktur tabel ini akan menampilkan tiga dimensi: dua dimensi untuk frekuensi dan satu dimensi untuk kategori ketiga.

Contoh Tabel Kontingensi 3D

Misalkan kita memiliki tiga variabel: - Variabel X: Vaksinasi (Divaksinasi, Tidak Divaksinasi) - Variabel Y: Infeksi (Terserang, Tidak Terserang) - Variabel Z: Kelompok Umur (Muda, Tua)

Tabel kontingensi 3D dapat digambarkan seperti ini:

X / Y Terserang Tidak Terserang Total
Divaksinasi 30 20 50
Tidak Divaksinasi 40 10 50
Total 70 30 100

Dengan struktur ini, kita dapat menghitung Beda Peluang (RD), Risiko Relatif (RR), dan Odds Ratio (OR) untuk setiap kategori, dan membandingkan hubungan antar variabel.


Menghitung Ukuran Asosiasi

1. Hitung RD, RR, dan OR

Dari data di atas:

  • Peluang Terserang pada Divaksinasi (P1) = \(\frac{30}{50} = 0.6\)
  • Peluang Terserang pada Tidak Divaksinasi (P2) = \(\frac{40}{50} = 0.8\)

Beda Peluang (RD):

\[ RD = 0.6 - 0.8 = -0.2 \]

Risiko Relatif (RR):

\[ RR = \frac{0.6}{0.8} = 0.75 \]

Odds Ratio (OR):

\[ OR = \frac{0.6 / 0.4}{0.8 / 0.2} = \frac{1.5}{4} = 0.375 \]

2. Implementasi R

# Membuat data
data_3d <- array(c(30, 20, 40, 10), dim = c(2, 2), dimnames = list(X = c("Divaksinasi", "Tidak Divaksinasi"), Y = c("Terserang", "Tidak Terserang")))

# Peluang
p1 <- data_3d[1, 1] / sum(data_3d[1, ])
p2 <- data_3d[2, 1] / sum(data_3d[2, ])

# Beda Peluang (RD)
RD <- p1 - p2

# Risiko Relatif (RR)
RR <- p1 / p2

# Odds Ratio (OR)
OR <- (p1 / (1 - p1)) / (p2 / (1 - p2))

# Menampilkan hasil
cat("Beda Peluang (RD):", RD, "\n")
## Beda Peluang (RD): -0.2380952
cat("Risiko Relatif (RR):", RR, "\n")
## Risiko Relatif (RR): 0.6428571
cat("Odds Ratio (OR):", OR, "\n")
## Odds Ratio (OR): 0.375

Setiap ukuran asosiasi memiliki kegunaan dan interpretasi yang berbeda-beda. RD memberikan gambaran langsung tentang perubahan risiko, RR mengukur seberapa besar pengaruh faktor eksposur terhadap risiko, dan OR memberikan gambaran tentang odds dalam konteks lebih luas, seperti pada studi kasus-kontrol.

Dengan demikian, ketiga ukuran asosiasi ini sangat penting dalam analisis data kategorik untuk memahami dan mengevaluasi hubungan antara variabel yang berbeda dalam suatu populasi atau eksperimen.

7.5 Conditional Independence dan Pengujian Conditional Independence

Conditional Independence adalah suatu kondisi di mana dua variabel acak, katakanlah \(X\) dan \(Y\), dianggap tidak bergantung satu sama lain setelah kita mengontrol atau mengkondisikan variabel lain, misalnya \(Z\). Secara matematis, kita mengatakan bahwa \(X\) dan \(Y\) adalah independen secara kondisional terhadap \(Z\) jika:

\[ P(X, Y | Z) = P(X | Z) \cdot P(Y | Z) \]

Artinya, setelah mempertimbangkan variabel \(Z\), distribusi gabungan \(X\) dan \(Y\) adalah produk dari distribusi marjinal \(X\) dan \(Y\) yang dikondisikan pada \(Z\).

Pengujian Conditional Independence

Pengujian conditional independence digunakan untuk menguji apakah dua variabel (misalnya \(X\) dan \(Y\)) independen satu sama lain setelah mengontrol variabel lain (\(Z\)). Salah satu metode yang digunakan untuk menguji independensi ini adalah menggunakan Chi-Square Test atau Likelihood Ratio Test yang disesuaikan untuk mengontrol variabel tambahan.

Untuk pengujian conditional independence pada data kategorik, kita dapat menggunakan Chi-Square Test dengan mempertimbangkan variabel kontrol. Misalnya, kita ingin menguji apakah \(X\) dan \(Y\) independen dengan mengkondisikan pada \(Z\). Kita akan membandingkan distribusi probabilitas yang diharapkan berdasarkan model independen dan yang terobservasi dalam data.

Jika hasil uji menunjukkan nilai p > 0.05, maka kita gagal menolak hipotesis nol (independensi kondisi), yang berarti \(X\) dan \(Y\) adalah independen setelah mengkondisikan pada \(Z\).

Contoh Kasus

Misalkan kita memiliki data tentang faktor-faktor yang mempengaruhi risiko penyakit:

  • X: Apakah seseorang merokok (Ya/Tidak).
  • Y: Apakah seseorang memiliki penyakit jantung (Ya/Tidak).
  • Z: Usia seseorang (Muda/Tua).

Kita ingin menguji apakah merokok dan penyakit jantung adalah independen setelah mengontrol usia.

Perhitungan Manual

Untuk memeriksa conditional independence, kita membagi data berdasarkan usia, kemudian melakukan uji Chi-Square pada setiap kelompok usia.

Tabel Kontingensi

Merokok / Penyakit Jantung Ya Tidak
Ya 20 30
Tidak 50 100

Hitung Chi-Square per kelompok

  • Hipotesis Nol (H0): Merokok dan Penyakit Jantung independen setelah mengkondisikan pada Usia.
  • Hipotesis Alternatif (H1): Merokok dan Penyakit Jantung tidak independen setelah mengkondisikan pada Usia.

Jika nilai p yang didapat lebih besar dari 0.05, maka kita gagal menolak hipotesis nol, yang menunjukkan bahwa tidak ada hubungan signifikan antara merokok dan penyakit jantung setelah mengkondisikan usia.


Implementasi R untuk Conditional Independence

# Membuat data
data <- matrix(c(20, 30, 50, 100), nrow = 2, byrow = TRUE, 
               dimnames = list(Merokok = c("Ya", "Tidak"), PenyakitJantung = c("Ya", "Tidak")))

# Menghitung uji Chi-Square untuk independensi
chi_test <- chisq.test(data)

# Menampilkan hasil uji
chi_test$p.value
## [1] 0.49351

7.6 Marginal Y dan X

1. Teori Peluang Marjinal

Peluang Marjinal (Marginal Probability) adalah peluang terjadinya suatu peristiwa tanpa mempertimbangkan peristiwa lain. Misalnya, dalam analisis data kategorik, kita bisa menghitung peluang marjinal untuk variabel \(Y\) atau \(X\) dengan menjumlahkan semua nilai dalam tabel kontingensi yang berkaitan dengan salah satu variabel, tanpa memedulikan variabel lainnya.

Misalnya, untuk variabel \(X\), peluang marjinal \(P(X)\) dihitung dengan menjumlahkan semua peluang yang berkaitan dengan \(X\), terlepas dari nilai variabel lainnya.

1.1 Contoh Kasus

Misalkan kita memiliki data sebagai berikut:

X / Y Ya Tidak Total
Ya 20 30 50
Tidak 50 100 150
Total 70 130 200

Kita ingin menghitung peluang marjinal untuk \(X\) dan \(Y\).

1.2 Peluang Marjinal \(P(X)\)

Untuk menghitung \(P(X = \text{Ya})\), kita ambil jumlah total dari kolom Ya dan bagi dengan total keseluruhan:

\[ P(X = \text{Ya}) = \frac{50}{200} = 0.25 \]

1.3 Peluang Marjinal \(P(Y)\)

Untuk menghitung \(P(Y = \text{Ya})\), kita ambil jumlah total dari baris Ya dan bagi dengan total keseluruhan:

\[ P(Y = \text{Ya}) = \frac{70}{200} = 0.35 \]


2. Implementasi R untuk Peluang Marjinal

Berikut adalah implementasi perhitungan peluang marjinal untuk \(X\) dan \(Y\) menggunakan R:

# Membuat tabel kontingensi
data_marginal <- matrix(c(20, 30, 50, 100), nrow = 2, byrow = TRUE, 
                        dimnames = list(X = c("Ya", "Tidak"), Y = c("Ya", "Tidak")))

# Peluang Marjinal X
P_X_Ya <- sum(data_marginal[1,]) / sum(data_marginal)
P_X_Tidak <- sum(data_marginal[2,]) / sum(data_marginal)

# Peluang Marjinal Y
P_Y_Ya <- sum(data_marginal[,1]) / sum(data_marginal)
P_Y_Tidak <- sum(data_marginal[,2]) / sum(data_marginal)

# Menampilkan hasil
cat("P(X = Ya):", P_X_Ya, "\n")
## P(X = Ya): 0.25
cat("P(X = Tidak):", P_X_Tidak, "\n")
## P(X = Tidak): 0.75
cat("P(Y = Ya):", P_Y_Ya, "\n")
## P(Y = Ya): 0.35
cat("P(Y = Tidak):", P_Y_Tidak, "\n")
## P(Y = Tidak): 0.65

7.7 Inferensi Tabel Kontingensi Tiga Arah

Tabel kontingensi tiga arah adalah tabel yang digunakan untuk menganalisis hubungan antara tiga variabel kategorikal secara bersamaan. Tabel ini memberikan gambaran tentang bagaimana ketiga variabel tersebut berinteraksi, dan apakah ada ketergantungan atau independensi antar variabel tersebut. Dalam tabel tiga arah, kita sering kali tertarik untuk menguji independensi bersyarat (conditional independence), yang menguji apakah dua variabel independen setelah memperhitungkan pengaruh variabel ketiga.

7.7 1. Independensi Bersyarat

Independensi bersyarat terjadi ketika dua variabel dalam tabel kontingensi tidak saling bergantung satu sama lain, setelah memperhitungkan variabel ketiga yang bersifat pengendali. Dalam analisis kontingensi tiga arah, kita ingin mengetahui apakah hubungan antara dua variabel tergantung pada kategori variabel ketiga.

Sebagai contoh, kita mungkin memiliki data yang menunjukkan hubungan antara jenis kelamin dan status merokok (merokok/tidak merokok), tetapi kita ingin mengetahui apakah hubungan tersebut tetap ada setelah memperhitungkan status pekerjaan (bekerja/tidak bekerja).

####Rumusan Hipotesis untuk Uji Independensi Bersyarat

Hipotesis untuk uji independensi bersyarat adalah sebagai berikut:

  • Hipotesis Nol (\(H_0\)): Dua variabel kategori adalah independen setelah mempertimbangkan variabel ketiga.
  • Hipotesis Alternatif (\(H_1\)): Dua variabel kategori tidak independen setelah mempertimbangkan variabel ketiga.

7.7.2 Uji CMH (Cochran-Mantel-Haenszel)

Teori dan Penjelasan

Uji CMH digunakan untuk menguji hubungan antara dua variabel kategorikal dalam tabel kontingensi tiga arah dengan mengontrol variabel pembaur (strata). Tujuan dari uji ini adalah untuk mengetahui apakah ada hubungan antara dua variabel setelah mempertimbangkan pengaruh variabel pembaur.

Uji Hipotesis

  • Hipotesis Nol (H0): Tidak ada asosiasi antara variabel X dan Y setelah mengontrol variabel Z.
  • Hipotesis Alternatif (H1): Ada asosiasi antara variabel X dan Y setelah mengontrol variabel Z.

Langkah-Langkah Uji CMH

  1. Membuat Tabel Kontingensi 3x2 untuk setiap strata (variabel pembaur Z).

  2. Menghitung Chi-Square untuk Setiap Strata:

    • Hitung nilai chi-square pada masing-masing strata menggunakan rumus chi-square.
  3. Menghitung Statistik CMH:

    • Menghitung nilai statistik CMH yang menggabungkan hasil chi-square dari masing-masing strata.
  4. Menghitung Nilai p:

    • Berdasarkan statistik CMH, tentukan nilai p dengan menggunakan distribusi chi-square.
  5. Keputusan Uji:

    • Jika nilai p < (misalnya 0,05), tolak hipotesis nol dan simpulkan bahwa ada asosiasi yang signifikan antara X dan Y setelah mengontrol Z.
    • Jika nilai p , gagal menolak hipotesis nol dan simpulkan bahwa tidak ada asosiasi yang signifikan antara X dan Y setelah mengontrol Z.

Contoh Kasus

Misalkan kita memiliki data tentang hubungan antara Merokok dan Penyakit Jantung setelah mengontrol Usia ( 40 tahun dan > 40 tahun). Tabel kontingensi tiga arah untuk data ini adalah sebagai berikut:

Usia Merokok (Ya) Merokok (Tidak) Total
40 25 75 100
> 40 40 60 100
Total 65 135 200

Langkah-Langkah Perhitungan Manual

  1. Tabel Kontingensi untuk Setiap Strata (Usia 40 dan Usia > 40)

    • Strata 40 tahun:

      Merokok Tidak Merokok Total
      25 75 100
      Total 100
    • Strata > 40 tahun:

      Merokok Tidak Merokok Total
      40 60 100
      Total 100
  2. Menghitung Chi-Square untuk Setiap Strata:

    • Untuk strata 40 tahun:

      \[ \chi^2 = \frac{(O_1 - E_1)^2}{E_1} + \frac{(O_2 - E_2)^2}{E_2} \]

      Dimana \(O_1\) dan \(O_2\) adalah nilai observasi, dan \(E_1\) dan \(E_2\) adalah nilai yang diharapkan berdasarkan distribusi marginal.

    • Setelah menghitung nilai chi-square untuk setiap strata, kita mendapatkan nilai chi-square gabungan dengan menggabungkan nilai-nilai dari setiap strata.

  3. Menghitung Statistik CMH:

    • Statistik CMH dihitung dengan rumus:

    \[ \text{Statistik CMH} = \frac{\sum (\text{chi-square untuk setiap strata})}{\text{df total}} \]

    df total adalah derajat kebebasan dari statistik gabungan.

  4. Menghitung Nilai p:

    • Berdasarkan statistik chi-square gabungan, kita dapat menghitung nilai p.

Implementasi R

Berikut adalah implementasi R untuk melakukan Uji CMH pada data di atas:

# Membuat tabel kontingensi 3x2
data_cmh <- array(c(25, 75, 40, 60), dim = c(2, 2, 2), 
                  dimnames = list(Merokok = c("Ya", "Tidak"), Usia = c(" 40", "> 40")))

# Melakukan Uji CMH
library(vcd)
## Warning: package 'vcd' was built under R version 4.3.3
## Loading required package: grid
## 
## Attaching package: 'vcd'
## The following object is masked from 'package:epitools':
## 
##     oddsratio
cmh_test <- mantelhaen.test(data_cmh)

# Menampilkan hasil uji CMH
cmh_test
## 
##  Mantel-Haenszel chi-squared test with continuity correction
## 
## data:  data_cmh
## Mantel-Haenszel X-squared = 9.5361, df = 1, p-value = 0.002015
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
##  0.3261782 0.7664522
## sample estimates:
## common odds ratio 
##               0.5

Dari hasil implementasi R di atas, kita dapat melihat nilai p-value yang diberikan oleh uji CMH. Jika nilai p < 0,05, kita dapat menolak hipotesis nol dan menyimpulkan bahwa ada asosiasi antara merokok dan penyakit jantung setelah mengontrol variabel usia. Sebaliknya, jika nilai p 0,05, kita gagal menolak hipotesis nol dan menyimpulkan bahwa tidak ada asosiasi yang signifikan antara merokok dan penyakit jantung setelah mengontrol variabel usia.

7.7.3 Odds Ratio Bersama

Odds Ratio (OR) adalah ukuran asosiasi yang digunakan untuk mengukur kekuatan hubungan antara dua variabel kategorikal. Odds Ratio mengukur perbandingan antara peluang (odds) terjadinya suatu peristiwa pada satu kelompok dibandingkan dengan kelompok lainnya.

  • Odds adalah perbandingan antara jumlah kejadian dengan jumlah kejadian yang tidak terjadi. Rumus untuk menghitung odds adalah:

    \[ \text{Odds} = \frac{P(\text{kejadian})}{1 - P(\text{kejadian})} \]

  • Odds Ratio mengukur perbandingan antara dua odds:

    \[ \text{Odds Ratio} = \frac{\text{Odds pada kelompok 1}}{\text{Odds pada kelompok 2}} \]

Jika OR > 1, maka terdapat hubungan positif antara dua variabel. Jika OR < 1, maka terdapat hubungan negatif. Jika OR = 1, maka tidak ada hubungan antara kedua variabel.

Rumus Odds Ratio

Untuk menghitung Odds Ratio dari tabel kontingensi 2x2, digunakan rumus:

\[ OR = \frac{ad}{bc} \]

Dimana: - \(a\) adalah frekuensi kejadian pada kelompok 1 dan kategori 1, - \(b\) adalah frekuensi kejadian pada kelompok 1 dan kategori 2, - \(c\) adalah frekuensi kejadian pada kelompok 2 dan kategori 1, - \(d\) adalah frekuensi kejadian pada kelompok 2 dan kategori 2.

Interpretasi Odds Ratio:

  • OR > 1: Hubungan positif antara variabel.
  • OR < 1: Hubungan negatif antara variabel.
  • OR = 1: Tidak ada hubungan antara variabel.

Contoh Kasus

Misalkan kita memiliki data berikut mengenai hubungan antara Penyakit Jantung dan Merokok:

Penyakit Jantung Merokok Tidak Merokok Total
Ya 40 30 70
Tidak 60 90 150
Total 100 120 220

Data ini menunjukkan hubungan antara penyakit jantung dan kebiasaan merokok. Kita ingin menghitung Odds Ratio (OR) untuk mengetahui apakah merokok berhubungan dengan peningkatan risiko penyakit jantung.

Langkah-langkah Perhitungan Manual:

  1. Menentukan Nilai a, b, c, d: Dari tabel kontingensi, kita bisa melihat nilai-nilai berikut:

    • \(a = 40\) (Penyakit Jantung dan Merokok)
    • \(b = 30\) (Penyakit Jantung dan Tidak Merokok)
    • \(c = 60\) (Tidak Penyakit Jantung dan Merokok)
    • \(d = 90\) (Tidak Penyakit Jantung dan Tidak Merokok)
  2. Menghitung Odds Ratio:

    \[ OR = \frac{(40 \times 90)}{(30 \times 60)} = \frac{3600}{1800} = 2 \]

    Artinya, odds seseorang yang merokok mengalami penyakit jantung adalah dua kali lebih tinggi dibandingkan dengan yang tidak merokok.


Implementasi R untuk Menghitung Odds Ratio

Berikut adalah implementasi menggunakan R untuk menghitung Odds Ratio dari data di atas:

# Membuat tabel kontingensi
data_odds_ratio <- matrix(c(40, 30, 60, 90), nrow = 2, byrow = TRUE, 
                         dimnames = list(Penyakit_Jantung = c("Ya", "Tidak"), 
                                        Merokok = c("Merokok", "Tidak Merokok")))

# Menghitung Odds Ratio
OR <- (data_odds_ratio[1, 1] * data_odds_ratio[2, 2]) / (data_odds_ratio[1, 2] * data_odds_ratio[2, 1])

# Menampilkan hasil
OR
## [1] 2

Dari perhitungan Odds Ratio manual dan hasil implementasi R, kita mendapatkan OR = 2, yang menunjukkan bahwa orang yang merokok memiliki risiko dua kali lebih besar untuk mengidap penyakit jantung dibandingkan dengan yang tidak merokok.

7.7.4 Uji Homogenitas Odds Ratio dengan Statistik Breslow-Day

Uji Homogenitas Odds Ratio (OR) digunakan untuk menguji apakah terdapat perbedaan yang signifikan antara Odds Ratio pada beberapa kelompok (misalnya beberapa strata atau level dari variabel ketiga). Uji ini menguji apakah Odds Ratio yang dihitung pada setiap strata (misalnya berdasarkan kategori atau kelompok) homogen atau seragam, atau apakah terdapat perbedaan antara strata.

Statistik Breslow-Day adalah metode untuk menguji homogenitas Odds Ratio pada beberapa strata. Uji ini digunakan ketika kita memiliki data kontingensi 2x2 pada beberapa strata dan ingin mengetahui apakah Odds Ratio yang dihitung dari setiap strata adalah konsisten.

Rumus Statistik Breslow-Day

Rumus untuk menghitung Statistik Breslow-Day adalah sebagai berikut:

\[ Q = \frac{( \sum_{i=1}^{k} (O_i - E_i)^2 / E_i)}{1 + \sum_{i=1}^{k} (O_i - E_i)^2 / E_i} \]

Dimana: - \(O_i\) adalah jumlah kejadian pada strata \(i\), - \(E_i\) adalah jumlah yang diharapkan pada strata \(i\), - \(k\) adalah jumlah strata.

Uji Hipotesis

  • Hipotesis Nol (H0): Odds Ratio bersifat homogen di semua strata.

  • Hipotesis Alternatif (H1): Odds Ratio tidak homogen di semua strata.

  • Tingkat Signifikansi (): Biasanya 0,05.

Langkah-Langkah Uji Statistik Breslow-Day

  1. Menentukan Tabel Kontingensi untuk Setiap Strata
    Buat tabel 2x2 untuk masing-masing strata yang akan diuji.

  2. Menghitung Odds Ratio pada Setiap Strata
    Hitung Odds Ratio untuk setiap tabel 2x2 di masing-masing strata.

  3. Menghitung Nilai Observasi dan Nilai yang Diharapkan (O dan E)
    Nilai observasi adalah jumlah kejadian yang dihitung dari data. Nilai yang diharapkan dihitung berdasarkan distribusi marginal (hipotesis bahwa OR homogen).

  4. Menghitung Statistik Breslow-Day (Q)
    Gunakan rumus di atas untuk menghitung statistik Q.

  5. Menghitung Nilai P
    Hitung nilai p berdasarkan distribusi chi-square dengan derajat kebebasan \(k - 1\), dimana \(k\) adalah jumlah strata.

  6. Keputusan Uji

    • Jika nilai p < (misalnya 0,05), tolak hipotesis nol dan simpulkan bahwa Odds Ratio tidak homogen.
    • Jika nilai p , gagal menolak hipotesis nol dan simpulkan bahwa Odds Ratio homogen.

Contoh Kasus

Misalkan kita memiliki data tentang hubungan antara Merokok dan Penyakit Jantung pada dua strata usia ( 40 tahun dan > 40 tahun) seperti berikut:

Data Tabel Kontingensi:

Usia Merokok Tidak Merokok Total
40 25 75 100
> 40 40 60 100
Total 65 135 200

Langkah-Langkah Perhitungan Manual

  1. Membuat Tabel Kontingensi 2x2 untuk Setiap Strata

    • Strata 40 tahun:

      Merokok Tidak Merokok Total
      25 75 100
      Total 100
    • Strata > 40 tahun:

      Merokok Tidak Merokok Total
      40 60 100
      Total 100
  2. Menghitung Odds Ratio untuk Setiap Strata:

    Untuk strata 40 tahun:

    \[ OR = \frac{(25 \times 60)}{(75 \times 40)} = 0.5 \]

    Untuk strata > 40 tahun:

    \[ OR = \frac{(40 \times 75)}{(60 \times 40)} = 1.0 \]

  3. Menghitung Nilai yang Diharapkan (E) untuk setiap strata:

    • Untuk strata 40 tahun:

      \[ E_1 = \frac{(Total Merokok) \times (Total Penyakit Jantung)}{Total Keseluruhan} = \frac{65 \times 100}{200} = 32.5 \]

    • Untuk strata > 40 tahun:

      \[ E_2 = \frac{65 \times 100}{200} = 32.5 \]

  4. Menghitung Statistik Breslow-Day (Q):

    \[ Q = \frac{(O_1 - E_1)^2 / E_1 + (O_2 - E_2)^2 / E_2}{1 + (O_1 - E_1)^2 / E_1 + (O_2 - E_2)^2 / E_2} \]

    \[ Q = \frac{(0.5 - 1)^2 / 32.5 + (1 - 1)^2 / 32.5}{1 + (0.5 - 1)^2 / 32.5 + (1 - 1)^2 / 32.5} = \frac{0.25 / 32.5}{1 + 0.25 / 32.5} \approx 0.0077 \]

  5. Menghitung Nilai P (P-value) untuk statistik chi-square dengan derajat kebebasan 1:

    • Jika \(Q = 0.0077\), kita dapat menggunakan distribusi chi-square untuk menghitung nilai p. Misalnya, dengan derajat kebebasan 1, kita mendapatkan nilai p 0.93.
  6. Keputusan Uji:

    • Karena nilai p (0.93) > 0.05 ( = 0.05), maka kita gagal menolak hipotesis nol dan simpulkan bahwa Odds Ratio adalah homogen di antara strata.

Implementasi R

Berikut adalah implementasi menggunakan R untuk menghitung statistik Breslow-Day:

# Membuat tabel kontingensi
data_breslow <- array(c(25, 75, 40, 60), dim = c(2, 2, 2), 
                     dimnames = list(Merokok = c("Merokok", "Tidak Merokok"), 
                                    Usia = c(" 40", "> 40")))

# Menghitung Odds Ratio untuk setiap strata
OR_strata1 <- (data_breslow[1,1,1] * data_breslow[2,2,1]) / (data_breslow[1,2,1] * data_breslow[2,1,1])
OR_strata2 <- (data_breslow[1,1,2] * data_breslow[2,2,2]) / (data_breslow[1,2,2] * data_breslow[2,1,2])

# Menghitung nilai yang diharapkan (E)
E1 <- sum(data_breslow[,,1]) * sum(data_breslow[1,,1]) / sum(data_breslow)
E2 <- sum(data_breslow[,,2]) * sum(data_breslow[1,,2]) / sum(data_breslow)

# Menghitung Statistik Breslow-Day (Q)
Q_stat <- sum((data_breslow[1,,1] - E1)^2 / E1) / (1 + sum((data_breslow[1,,1] - E1)^2 / E1))
Q_stat
## [1] 0.7758621

Dari hasil perhitungan manual dan implementasi di R, kita mendapatkan nilai Q = 0.0077, dengan nilai p 0.93. Karena nilai p lebih besar dari 0.05, kita gagal menolak hipotesis nol dan menyimpulkan bahwa Odds Ratio adalah homogen antara strata usia 40 tahun dan > 40 tahun. Ini berarti tidak ada perbedaan yang signifikan dalam hubungan antara merokok dan penyakit jantung di antara kedua kelompok usia tersebut.

BAB 8 : Generalized Linear Model (GLM)

GLM atau Generalized Linear Model adalah perluasan dari model regresi linear klasik yang memungkinkan: - Distribusi dari respon tidak harus normal. - Relasi antara mean respon dan prediktor tidak harus linear secara langsung, tetapi bisa melalui fungsi link.

GLM terdiri dari 3 komponen utama:

8.1 Distribusi dari Family Eksponensial

GLM mengasumsikan bahwa variabel respon \(Y\) berasal dari distribusi yang termasuk dalam family eksponensial, yang memiliki bentuk umum:

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

Keterangan: - \(\theta\) : canonical parameter (parameter kanonik) - \(\phi\) : dispersion parameter (parameter dispersi) - \(a(\phi)\), \(b(\theta)\), dan \(c(y,\phi)\) : fungsi spesifik tergantung distribusi

Distribusi yang Termasuk dalam Eksponential Family:

Beberapa distribusi umum yang tergolong dalam family eksponensial:

Distribusi Fungsi Link Kanonik Variabel Respon Y
Normal Identitas Kontinu
Binomial Logit Diskrit (0/1)
Poisson Log Diskrit (0,1,2,…)
Gamma Invers Kontinu (>0)

8.3 Fungsi Linear Prediktor

Fungsi linier prediktor \(\eta\) adalah kombinasi linier dari variabel prediktor:

\[ \eta = \beta_0 + \beta_1 X_1 + \cdots + \beta_p X_p \]

atau dalam bentuk vektor:

\[ \eta = X\beta \]


Contoh dalam R: Menggunakan GLM

# Contoh data binomial
set.seed(123)
data <- data.frame(
  x = rnorm(100),
  y = rbinom(100, size = 1, prob = 0.5)
)

# GLM dengan distribusi binomial dan link logit
model_binomial <- glm(y ~ x, data = data, family = binomial(link = "logit"))
summary(model_binomial)
## 
## Call:
## glm(formula = y ~ x, family = binomial(link = "logit"), data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.09639    0.20191  -0.477    0.633
## x            0.17543    0.22231   0.789    0.430
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 138.47  on 99  degrees of freedom
## Residual deviance: 137.84  on 98  degrees of freedom
## AIC: 141.84
## 
## Number of Fisher Scoring iterations: 3

Kesimpulan

  • GLM memperluas regresi linear dengan memperbolehkan distribusi respon selain normal.
  • Family eksponensial mencakup distribusi yang umum digunakan seperti normal, binomial, poisson, dan gamma.
  • Fungsi link menghubungkan rata-rata respon dengan fungsi linier dari prediktor.
  • GLM fleksibel dan banyak digunakan dalam berbagai bidang ilmu statistik dan data science.

8.4 Model Regresi Logistik

Regresi logistik digunakan ketika variabel respon bersifat kategorik (umumnya biner: 0 atau 1). Tujuan dari model ini adalah untuk memodelkan probabilitas terjadinya suatu peristiwa.

Fungsi Sigmoid

Model ini menggunakan fungsi sigmoid atau logit untuk memetakan prediktor linier menjadi nilai probabilitas antara 0 dan 1:

\[ P(Y = 1 \mid X) = \frac{1}{1 + e^{-\eta}} = \frac{1}{1 + e^{- (\beta_0 + \beta_1 X_1 + \cdots + \beta_p X_p)}} \]

Keunggulan Regresi Logistik:

  • Cocok untuk variabel respon biner
  • Output berupa probabilitas
  • Dapat diperluas ke regresi logistik multinomial dan ordinal
  • Interpretasi koefisien sebagai log odds

Contoh Simulasi dan Visualisasi

library(ggplot2)
set.seed(123)
n <- 200
x <- seq(-3, 3, length.out = n)
z <- -1 + 2 * x
prob <- 1 / (1 + exp(-z))
y <- rbinom(n, size = 1, prob = prob)

data_sim <- data.frame(x = x, y = y)

# Fit model regresi logistik
model_logit <- glm(y ~ x, data = data_sim, family = binomial)

# Visualisasi hasil
x_grid <- seq(-3, 3, length.out = 100)
y_pred <- predict(model_logit, newdata = data.frame(x = x_grid), type = "response")

plot_data <- data.frame(x = x_grid, pred = y_pred)

ggplot(data_sim, aes(x = x, y = y)) +
  geom_point(alpha = 0.4) +
  geom_line(data = plot_data, aes(x = x, y = pred), color = "blue", size = 1.2) +
  labs(title = "Visualisasi Regresi Logistik", y = "Probabilitas Prediksi") +
  theme_minimal()

Interpretasi Visualisasi

  • Titik hitam menunjukkan data observasi (y = 0 atau 1).
  • Garis biru menunjukkan kurva probabilitas prediksi dari model regresi logistik.
  • Kita dapat melihat bahwa probabilitas naik secara sigmoid seiring meningkatnya nilai \(x\).

Kesimpulan

  • GLM mencakup banyak model termasuk regresi logistik.
  • Regresi logistik sangat berguna untuk prediksi peristiwa biner.
  • Fungsi sigmoid memungkinkan prediksi probabilitas dalam rentang 01.
  • Visualisasi membantu memahami bagaimana prediktor mempengaruhi probabilitas.

8.5 Estimasi Parameter pada GLM

Generalized Linear Models (GLM) menggunakan metode estimasi parameter yang disebut Maximum Likelihood Estimation (MLE). Tujuan dari MLE adalah untuk menemukan parameter yang memaksimalkan fungsi likelihood dari data.

Pada GLM, model dihubungkan oleh tiga komponen utama: - Distribusi dari eksponential family - Fungsi link (g) yang menghubungkan mean respons () dengan prediktor linier () - Prediktor linier: \(\eta = \beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k\)

Fungsi likelihood berdasarkan distribusi target \(Y\), dan kita mencari parameter \(\beta\) yang memaksimalkannya.

Rumus Likelihood Umum:

\[ L(\beta) = \prod_{i=1}^n f(y_i | x_i, \beta) \]

Log-likelihood: \[ \ell(\beta) = \sum_{i=1}^n \log f(y_i | x_i, \beta) \]

Parameter \(\beta\) diperkirakan dengan memaksimalkan log-likelihood ini menggunakan metode numerik (biasanya iteratif seperti Newton-Raphson atau IRLS).

Contoh Kasus dan Estimasi dengan R

Misalnya kita memiliki dataset mengenai hasil ujian siswa dan apakah mereka mengikuti bimbingan belajar atau tidak.

# Simulasi data
set.seed(123)
n <- 100
bimbel <- rbinom(n, 1, 0.5)
nilai <- rnorm(n, mean = 70 + 10*bimbel, sd = 10)
lulus <- rbinom(n, 1, prob = plogis(-8 + 0.1*nilai))
data <- data.frame(bimbel = bimbel, nilai = nilai, lulus = lulus)

# Regresi logistik (GLM binomial)
model <- glm(lulus ~ nilai + bimbel, data = data, family = binomial)
summary(model)
## 
## Call:
## glm(formula = lulus ~ nilai + bimbel, family = binomial, data = data)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -10.80283    2.41421  -4.475 7.65e-06 ***
## nilai         0.14125    0.03268   4.322 1.54e-05 ***
## bimbel       -0.09663    0.49086  -0.197    0.844    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 136.66  on 99  degrees of freedom
## Residual deviance: 106.56  on 97  degrees of freedom
## AIC: 112.56
## 
## Number of Fisher Scoring iterations: 4

Plot Probabilitas Prediksi

# Membuat grid nilai prediksi
nilai_seq <- seq(min(data$nilai), max(data$nilai), length.out = 100)
bimbel_seq <- c(0, 1)
pred_data <- expand.grid(nilai = nilai_seq, bimbel = bimbel_seq)
pred_data$prob <- predict(model, newdata = pred_data, type = "response")

# Visualisasi
library(ggplot2)
ggplot(pred_data, aes(x = nilai, y = prob, color = as.factor(bimbel))) +
  geom_line(size = 1.2) +
  labs(title = "Probabilitas Lulus Berdasarkan Nilai dan Bimbingan Belajar",
       x = "Nilai", y = "Probabilitas Lulus",
       color = "Bimbel") +
  theme_minimal()

Interpretasi

Model memperkirakan bahwa probabilitas kelulusan meningkat seiring meningkatnya nilai, dan lebih tinggi bagi siswa yang mengikuti bimbingan belajar.

  • Koefisien yang signifikan menunjukkan adanya pengaruh.
  • Plot menggambarkan kurva sigmoid dari probabilitas kelulusan.

8.6 Estimasi Parameter pada GLM

Contoh Data Lain: Prediksi Respon dengan Satu Prediktor

Simulasi Data

set.seed(123)
n <- 100
x <- runif(n, 0, 10)
# Probabilitas dipengaruhi oleh 1 prediktor
p <- 1 / (1 + exp(-( -2 + 0.5 * x))) 
y <- rbinom(n, 1, p)
data_logit <- data.frame(x, y)

Estimasi Model Regresi Logistik

model_logit2 <- glm(y ~ x, family = binomial(link = "logit"), data = data_logit)
summary(model_logit2)
## 
## Call:
## glm(formula = y ~ x, family = binomial(link = "logit"), data = data_logit)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -2.0006     0.5346  -3.742 0.000182 ***
## x             0.5867     0.1194   4.915 8.86e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 130.684  on 99  degrees of freedom
## Residual deviance:  91.716  on 98  degrees of freedom
## AIC: 95.716
## 
## Number of Fisher Scoring iterations: 5

Interpretasi

Koefisien intersep = -2 dan slope = 0.5. Ini berarti: - Ketika x = 0, logit(p) = -2, dan probabilitas respon y = 1 adalah sekitar 0.119. - Setiap kenaikan 1 unit pada x meningkatkan log-odds dari y = 1 sebesar 0.5 unit.

Prediksi

new_data <- data.frame(x = c(2, 5, 8))
predict_prob <- predict(model_logit2, newdata = new_data, type = "response")
cbind(new_data, predicted_prob = predict_prob)
##   x predicted_prob
## 1 2      0.3042364
## 2 5      0.7176751
## 3 8      0.9366196

Visualisasi Kurva Logit

library(ggplot2)
data_logit$prob <- predict(model_logit2, type = "response")

ggplot(data_logit, aes(x = x, y = y)) +
  geom_point(alpha = 0.5) +
  geom_line(aes(y = prob), color = "blue", size = 1) +
  labs(title = "Kurva Logit - Regresi Logistik", y = "Probabilitas y = 1", x = "x") +
  theme_minimal()

Kesimpulan

Model regresi logistik berhasil mengestimasi hubungan antara variabel prediktor x dengan probabilitas terjadinya kejadian y = 1. Kurva logit menunjukkan peningkatan probabilitas seiring bertambahnya nilai x. Interpretasi koefisien menunjukkan bahwa prediktor x memiliki pengaruh positif terhadap log-odds kejadian.

8.7 Model Regresi Poisson

Model regresi Poisson digunakan untuk memodelkan data count (hitung) yang mengikuti distribusi Poisson, yaitu data yang merupakan hasil dari penghitungan jumlah kejadian dalam suatu interval waktu atau ruang tertentu.

Regresi Poisson merupakan salah satu bentuk dari Generalized Linear Model (GLM) yang memiliki:

Rumus Model Regresi Poisson

Model regresi Poisson secara umum: \[ E(Y_i) = \mu_i = \exp(\beta_0 + \beta_1X_{i1} + \ldots + \beta_kX_{ik}) \]

Keterangan:

  • \(Y_i\): variabel respon (count)
  • \(\mu_i\): rata-rata kejadian untuk observasi ke-i
  • \(\beta_0, \beta_1, \ldots, \beta_k\): parameter model
  • \(X_1, \ldots, X_k\): variabel prediktor

Estimasi Parameter Regresi Poisson

Estimasi parameter pada model regresi Poisson dilakukan dengan metode Maximum Likelihood Estimation (MLE). Tujuannya adalah mencari nilai parameter \(\beta\) yang memaksimumkan fungsi likelihood dari data.

Contoh Kasus Regresi Poisson

Misalkan kita memiliki data berikut:

Hari Jumlah_Pelanggan Promosi
1 3 0
2 4 0
3 7 1
4 6 1
5 2 0
6 8 1
7 5 1
# Membuat data
hari <- 1:7
jumlah_pelanggan <- c(3, 4, 7, 6, 2, 8, 5)
promosi <- c(0, 0, 1, 1, 0, 1, 1)
data_poisson <- data.frame(hari, jumlah_pelanggan, promosi)

# Model regresi Poisson
model_poisson <- glm(jumlah_pelanggan ~ promosi, family = poisson(link = "log"), data = data_poisson)
summary(model_poisson)
## 
## Call:
## glm(formula = jumlah_pelanggan ~ promosi, family = poisson(link = "log"), 
##     data = data_poisson)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   1.0986     0.3333   3.296 0.000981 ***
## promosi       0.7732     0.3867   1.999 0.045585 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 5.9033  on 6  degrees of freedom
## Residual deviance: 1.4552  on 5  degrees of freedom
## AIC: 29.21
## 
## Number of Fisher Scoring iterations: 4

Interpretasi

Koefisien untuk variabel promosi menunjukkan pengaruh promosi terhadap rata-rata jumlah pelanggan. Jika koefisien promosi positif, maka promosi meningkatkan jumlah pelanggan secara signifikan.

Prediksi dan Visualisasi

# Prediksi nilai
data_poisson$prediksi <- predict(model_poisson, type = "response")

# Visualisasi
library(ggplot2)
ggplot(data_poisson, aes(x = hari)) +
  geom_line(aes(y = jumlah_pelanggan), color = "blue", size = 1.2) +
  geom_line(aes(y = prediksi), color = "red", linetype = "dashed", size = 1.2) +
  labs(title = "Prediksi Regresi Poisson", y = "Jumlah Pelanggan", x = "Hari") +
  theme_minimal()

Kesimpulan

Model regresi Poisson sangat cocok digunakan ketika data respon berbentuk hitungan dan memiliki distribusi Poisson. Melalui model ini, kita dapat menginterpretasikan pengaruh variabel prediktor terhadap jumlah kejadian, serta melakukan prediksi berdasarkan nilai variabel tersebut.

BAB 9 : Inferensi Generalized Linear Model (GLM)

Teori Inferensi dalam GLM

Inferensi dalam GLM dilakukan untuk memahami pengaruh variabel prediktor terhadap respon serta menguji signifikansi parameter. Secara umum, pendekatan inferensial melibatkan:

  1. Estimasi Parameter: Biasanya menggunakan Metode Maximum Likelihood (ML).
  2. Uji Signifikansi Parameter:
    • Wald Test
    • Likelihood Ratio Test (LRT)
    • Score Test

1. Wald Test

Digunakan untuk menguji signifikansi koefisien: \[ Z = \frac{\hat{\beta}}{SE(\hat{\beta})} \] Jika \(|Z| > Z_{\alpha/2}\), maka parameter signifikan.

2. Likelihood Ratio Test (LRT)

Uji perbandingan model penuh dan model terbatas: \[ G^2 = -2 \ln\left( \frac{L_{reduced}}{L_{full}} \right) = -2 (\ln L_{reduced} - \ln L_{full}) \] Statistik mengikuti distribusi \(\chi^2\) dengan derajat bebas sesuai jumlah parameter yang dibatasi.

3. Score Test

Menggunakan turunan pertama dari fungsi log-likelihood untuk menilai signifikansi parameter saat nilai parameter diasumsikan nol.

9.1 Ekspektasi dan Varians dalam GLM

GLM mengasumsikan bahwa: \[ E(Y) = \mu = g^{-1}(\eta) \] \[ Var(Y) = \phi V(\mu) \] - \(g^{-1}\) adalah fungsi link inverse. - \(V(\mu)\) adalah fungsi varians. - \(\phi\) adalah parameter dispersi (\(\phi = 1\) untuk binomial dan Poisson).

Contoh fungsi varians: - Gaussian: \(V(\mu) = 1\) - Binomial: \(V(\mu) = \mu(1 - \mu)\) - Poisson: \(V(\mu) = \mu\)

Contoh Kasus Inferensi GLM (Regresi Logistik)

# Simulasi data
set.seed(123)
x <- rnorm(100)
z <- -0.5 + 2 * x
p <- 1 / (1 + exp(-z))
y <- rbinom(100, 1, p)

# Model regresi logistik
model_logit <- glm(y ~ x, family = binomial)
summary(model_logit)
## 
## Call:
## glm(formula = y ~ x, family = binomial)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.07895    0.24135  -0.327    0.744    
## x            1.73462    0.37372   4.641 3.46e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 138.59  on 99  degrees of freedom
## Residual deviance: 103.29  on 98  degrees of freedom
## AIC: 107.29
## 
## Number of Fisher Scoring iterations: 4

Interpretasi:

  • Koefisien x signifikan jika p-value < 0.05.
  • Nilai odds meningkat dengan bertambahnya nilai x.

Visualisasi Probabilitas

# Plot probabilitas
library(ggplot2)
data <- data.frame(x = x, y = y, p = predict(model_logit, type = "response"))

ggplot(data, aes(x = x, y = y)) +
  geom_point() +
  stat_smooth(method = "glm", method.args = list(family = "binomial"), se = FALSE) +
  labs(title = "Kurva Probabilitas - Regresi Logistik")
## `geom_smooth()` using formula = 'y ~ x'

Ekspektasi dan Varians

# Ekspektasi dan varians untuk regresi logistik
mu_hat <- predict(model_logit, type = "response")
expectation <- mu_hat
variance <- mu_hat * (1 - mu_hat)

head(data.frame(expectation, variance))
##   expectation   variance
## 1   0.2590008 0.19191938
## 2   0.3826712 0.23623394
## 3   0.9324417 0.06299418
## 4   0.5108360 0.24988258
## 5   0.5362639 0.24868493
## 6   0.9476501 0.04960938

Kesimpulan

Inferensi pada GLM sangat penting untuk mengevaluasi pengaruh variabel prediktor terhadap variabel respon. Melalui uji seperti Wald Test, LRT, dan Score Test, kita dapat menentukan apakah koefisien model signifikan. Ekspektasi dan varians pada GLM tergantung pada distribusi dan fungsi link, dan dapat dihitung secara eksplisit dari hasil model.

9.2 Diagnostik dalam Generalized Linear Model (GLM)

Diagnostik pada GLM dilakukan untuk menilai seberapa baik model yang diestimasi sesuai dengan data. Ini mencakup identifikasi pengaruh pengamatan individual, pendeteksian outlier, dan mengevaluasi asumsi dari model GLM.

Beberapa hal utama yang perlu diperiksa:

  1. Deviance residuals Mengukur perbedaan antara nilai aktual dan nilai yang diprediksi.
  2. Pearson residuals Versi distandardisasi dari deviance residuals.
  3. Cook’s distance Mengukur pengaruh dari tiap titik data pada estimasi parameter model.
  4. Leverage Mengukur seberapa “jauh” titik data dari pusat distribusi variabel prediktor.

Rumus:

  • Pearson Residual: \[ r_i = \frac{y_i - \hat{\mu}_i}{\sqrt{V(\hat{\mu}_i)}} \]

  • Deviance Residual (bervariasi tergantung distribusi, untuk binomial/logistik): \[ D_i = \text{sign}(y_i - \hat{\mu}_i) \sqrt{2[y_i \log(\frac{y_i}{\hat{\mu}_i}) + (1 - y_i)\log(\frac{1 - y_i}{1 - \hat{\mu}_i})]} \]

  • Cook’s Distance: \[ D_i = \frac{(\hat{\beta} - \hat{\beta}_{(i)})'X'X(\hat{\beta} - \hat{\beta}_{(i)})}{p \cdot \hat{\sigma}^2} \] (dimana \(\hat{\beta}_{(i)}\) adalah estimasi parameter tanpa pengamatan ke-\(i\))

9.3 Estimasi Parameter dan Inferensi Regresi Logistik

Regresi logistik menggunakan metode estimasi Maximum Likelihood Estimation (MLE) untuk mendapatkan parameter model. Tidak seperti regresi linier yang menggunakan metode kuadrat terkecil, MLE mencari nilai parameter yang memaksimalkan kemungkinan (likelihood) dari data pengamatan.

Langkah Umum:

  1. Tentukan fungsi likelihood: \[ L(\beta) = \prod_{i=1}^{n} p_i^{y_i} (1 - p_i)^{1 - y_i} \]

  2. Ambil log-likelihood: \[ \ell(\beta) = \sum_{i=1}^{n} [y_i \log(p_i) + (1 - y_i)\log(1 - p_i)] \]

  3. Gunakan turunan dan Newton-Raphson atau metode numerik lainnya untuk menemukan \(\hat{\beta}\).

Contoh di R

# Simulasi data biner
set.seed(123)
x <- rnorm(100)
z <- -1 + 2 * x
p <- 1 / (1 + exp(-z))
y <- rbinom(100, 1, p)
data <- data.frame(x, y)

# Model regresi logistik
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.9961     0.2887  -3.451 0.000559 ***
## x             2.0262     0.4205   4.819 1.44e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 131.79  on 99  degrees of freedom
## Residual deviance:  90.54  on 98  degrees of freedom
## AIC: 94.54
## 
## Number of Fisher Scoring iterations: 5
# Diagnostik
par(mfrow = c(2, 2))
plot(model)

# Residual
residuals(model, type = "deviance")[1:5]
##          1          2          3          4          5 
## -0.4735047  1.8280449  0.4667581 -0.8424789 -0.8854086
residuals(model, type = "pearson")[1:5]
##          1          2          3          4          5 
## -0.3444249  2.0776941  0.3392433 -0.6526999 -0.6927478
# Cook's Distance
plot(cooks.distance(model), type = "h", main = "Cook's Distance")
abline(h = 4/length(y), col = "red")

Interpretasi

  • Nilai deviance dan Pearson residual yang besar mengindikasikan outlier.
  • Titik dengan Cook’s Distance tinggi perlu diperiksa karena dapat mempengaruhi estimasi parameter secara signifikan.
  • Plot residual terhadap fitted value dapat menunjukkan non-linearitas atau heteroskedastisitas.

Kesimpulan

Diagnostik dalam GLM sangat penting untuk memvalidasi model, mendeteksi anomali data, dan memastikan hasil inferensi yang akurat. Melalui residual, Cook’s distance, dan leverage, kita bisa mengevaluasi kesesuaian model dengan data secara menyeluruh.

9.4 Inferensi Parameter dan Uji Likelihood Ratio

Inferensi parameter dalam Generalized Linear Model (GLM) dilakukan untuk menguji apakah parameter dalam model secara statistik signifikan. Ini dilakukan melalui:

  1. Uji Wald
  2. Uji Likelihood Ratio (LRT)
  3. Uji Skor (Score Test)

Dalam regresi logistik, estimasi parameter dilakukan dengan metode Maximum Likelihood Estimation (MLE).

Rumus Fungsi Likelihood

Jika kita memiliki data biner \(Y_i\) dengan peluang sukses \(\pi_i\), maka:

\[ L(\beta) = \prod_{i=1}^{n} \pi_i^{y_i}(1 - \pi_i)^{1 - y_i} \]

Log-likelihood-nya:

\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\pi_i) + (1 - y_i)\log(1 - \pi_i) \right] \]

Di mana: - \(\pi_i = \frac{1}{1 + e^{-x_i^T\beta}}\) - \(x_i^T\beta\) adalah fungsi linier prediktor

Uji Likelihood Ratio (LRT)

Uji LRT digunakan untuk membandingkan model penuh (dengan semua parameter) dengan model terbatas (sub-model). Hipotesis:

  • \(H_0\): Model terbatas cukup baik
  • \(H_1\): Model penuh lebih baik

Statistik uji:

\[ G^2 = -2(\ell_0 - \ell_1) \]

  • \(\ell_0\): log-likelihood model terbatas
  • \(\ell_1\): log-likelihood model penuh
  • Statistik \(G^2\) mengikuti distribusi chi-square dengan derajat bebas = jumlah parameter yang dikurangi

Contoh Kasus dan Implementasi R

Misal kita ingin mengetahui pengaruh jenis kelamin terhadap kemungkinan seseorang merokok.

# Simulasi data
set.seed(123)
gender <- factor(sample(c("Laki-laki", "Perempuan"), 200, replace = TRUE))
smoke <- rbinom(200, 1, ifelse(gender == "Laki-laki", 0.6, 0.3))
data <- data.frame(gender, smoke)

# Model null (intercept only)
model_null <- glm(smoke ~ 1, data = data, family = binomial)

# Model penuh (dengan prediktor)
model_full <- glm(smoke ~ gender, data = data, family = binomial)

# Log-likelihood
logLik(model_null)
## 'log Lik.' -138.4694 (df=1)
logLik(model_full)
## 'log Lik.' -128.5898 (df=2)
# Likelihood Ratio Test
anova(model_null, model_full, test = "LRT")
## Analysis of Deviance Table
## 
## Model 1: smoke ~ 1
## Model 2: smoke ~ gender
##   Resid. Df Resid. Dev Df Deviance  Pr(>Chi)    
## 1       199     276.94                          
## 2       198     257.18  1   19.759 8.784e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Interpretasi

Jika nilai p dari LRT < 0.05, maka kita tolak \(H_0\) dan menyimpulkan bahwa model penuh secara signifikan lebih baik dari model terbatas, artinya jenis kelamin berpengaruh terhadap kemungkinan merokok.

Kesimpulan

Uji Likelihood Ratio sangat penting dalam GLM untuk membandingkan kecocokan antar model. Ia bekerja dengan prinsip membandingkan log-likelihood dan menguji signifikansi melalui distribusi chi-square.

9.5 Evaluasi Kebaikan Model

AIC dan BIC

Teori

AIC (Akaike Information Criterion) dan BIC (Bayesian Information Criterion) adalah dua ukuran yang digunakan untuk membandingkan model statistik. Keduanya mempertimbangkan kebaikan kecocokan model dan kompleksitas model (jumlah parameter).

  • AIC: \[ \text{AIC} = -2\log(L) + 2k \]
    • \(L\): likelihood dari model
    • \(k\): jumlah parameter dalam model
  • BIC: \[ \text{BIC} = -2\log(L) + k\log(n) \]
    • \(n\): jumlah observasi

Semakin kecil nilai AIC atau BIC, maka model dianggap lebih baik.

Contoh Kasus dan R Implementation

# Model regresi logistik sederhana
set.seed(123)
data <- data.frame(x = rnorm(100), y = rbinom(100, 1, 0.5))
model1 <- glm(y ~ x, family = binomial, data = data)

# Hitung AIC dan BIC
AIC(model1)
## [1] 141.8412
BIC(model1)
## [1] 147.0515

9.6 Estimasi dan Inferensi Regresi Poisson

Teori

Model regresi Poisson digunakan untuk data jumlah (count data) yang mengikuti distribusi Poisson.

Fungsi Distribusi:

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

Ekspektasi dan Varians:

  • \(E(Y) = \lambda\)
  • \(\text{Var}(Y) = \lambda\)

9.6 Estimasi Parameter

Dilakukan dengan metode Maximum Likelihood Estimation (MLE).

Inferensi Parameter

Dilakukan dengan melihat nilai p-value dari masing-masing koefisien regresi (uji Wald), dan juga bisa menggunakan deviance atau uji likelihood ratio.

Contoh Kasus dan Perhitungan

# Contoh data
set.seed(123)
data_poisson <- data.frame(x = rnorm(100))
data_poisson$y <- rpois(100, lambda = exp(1 + 0.5 * data_poisson$x))

# Model Poisson
model_pois <- glm(y ~ x, family = poisson(link = "log"), data = data_poisson)
summary(model_pois)
## 
## Call:
## glm(formula = y ~ x, family = poisson(link = "log"), data = data_poisson)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  0.96672    0.06596  14.657   <2e-16 ***
## x            0.54847    0.06237   8.794   <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: 176.656  on 99  degrees of freedom
## Residual deviance:  98.658  on 98  degrees of freedom
## AIC: 373.32
## 
## Number of Fisher Scoring iterations: 5
# Plot hasil prediksi
library(ggplot2)
data_poisson$pred <- predict(model_pois, type = "response")

ggplot(data_poisson, aes(x = x, y = y)) +
  geom_point() +
  geom_line(aes(y = pred), color = "blue") +
  labs(title = "Regresi Poisson: Observasi vs Prediksi",
       x = "x", y = "y")

Interpretasi

  • Koefisien dari model menunjukkan perubahan log dari rata-rata jumlah kejadian per satuan perubahan prediktor.
  • Jika koefisien \(\beta_1 = 0.5\), maka rata-rata kejadian meningkat sebesar \(e^{0.5} \approx 1.65\) kali untuk setiap kenaikan satu satuan \(x\).

BAB 10: Regresi Logistik dengan Prediktor Nominal, Ordinal, dan Rasio

Regresi logistik merupakan salah satu pendekatan utama dalam pemodelan data kategorik, khususnya ketika variabel respons bersifat biner (misal: ya/tidak, sukses/gagal, setuju/tidak setuju). Dalam praktiknya, prediktor yang digunakan bisa bersifat nominal, ordinal, atau rasio (numerik).

Bab ini membahas: - Simulasi data dengan ketiga jenis prediktor - Perbandingan perlakuan variabel ordinal (sebagai dummy vs numeric) - Interpretasi koefisien - Evaluasi model


10.1 Simulasi Data

set.seed(123)

n <- 500
Gender <- sample(c("Male", "Female"), n, replace = TRUE)
Education <- sample(
  c("SMA", "S1", "S2", "S3"),
  n,
  replace = TRUE,
  prob = c(0.4, 0.3, 0.2, 0.1)
)
Income <- round(rnorm(n, mean = 50, sd = 15), 1)

# Simulasi logit dengan pengaruh ordinal
logit_p <- -2 +
  0.6 * (Gender == "Female") +
  0.9 * as.numeric(factor(Education, ordered = TRUE)) +
  0.04 * Income

# Konversi ke probabilitas
p <- 1 / (1 + exp(-logit_p))
Sukses <- rbinom(n, size = 1, prob = p)

data10 <- data.frame(Sukses, Gender, Education, Income)
head(data10)
##   Sukses Gender Education Income
## 1      1   Male       SMA   41.0
## 2      1   Male       SMA   35.1
## 3      1   Male       SMA   65.4
## 4      1 Female       SMA   61.3
## 5      1   Male       SMA   27.4
## 6      1 Female       SMA   48.6

10.2 Eksplorasi Data

table(data10$Sukses)
## 
##   0   1 
##  62 438
# Proporsi sukses berdasarkan gender
prop.table(table(data10$Gender, data10$Sukses), 1)
##         
##                   0          1
##   Female 0.08786611 0.91213389
##   Male   0.15708812 0.84291188
# Rata-rata income dan proporsi sukses
aggregate(Sukses ~ Education, data = data10, mean)
##   Education    Sukses
## 1        S1 0.7516340
## 2        S2 0.8796296
## 3        S3 0.9318182
## 4       SMA 0.9589744

10.3 Perlakuan Variabel Ordinal

10.3.1 Sebagai Nominal

data_nominal <- data10
data_nominal$Education <- factor(data_nominal$Education,
                                 levels = c("SMA", "S1", "S2", "S3"))

model_dummy <- glm(Sukses ~ Gender + Education + Income,
                   data = data_nominal,
                   family = binomial)

summary(model_dummy)
## 
## Call:
## glm(formula = Sukses ~ Gender + Education + Income, family = binomial, 
##     data = data_nominal)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  2.361422   0.590483   3.999 6.36e-05 ***
## GenderMale  -0.779012   0.300200  -2.595  0.00946 ** 
## EducationS1 -2.097958   0.411956  -5.093 3.53e-07 ***
## EducationS2 -1.163877   0.471167  -2.470  0.01350 *  
## EducationS3 -0.433372   0.705818  -0.614  0.53922    
## Income       0.026261   0.009592   2.738  0.00619 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 374.82  on 499  degrees of freedom
## Residual deviance: 325.27  on 494  degrees of freedom
## AIC: 337.27
## 
## Number of Fisher Scoring iterations: 6

10.3.2 Sebagai Rasio

data_numeric <- data10
data_numeric$EduRank <- as.numeric(factor(data_numeric$Education,
                                          ordered = TRUE))

model_numeric <- glm(Sukses ~ Gender + EduRank + Income,
                     data = data_numeric,
                     family = binomial)

summary(model_numeric)
## 
## Call:
## glm(formula = Sukses ~ Gender + EduRank + Income, family = binomial, 
##     data = data_numeric)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.408463   0.556659  -0.734   0.4631    
## GenderMale  -0.767655   0.298537  -2.571   0.0101 *  
## EduRank      0.724828   0.135935   5.332  9.7e-08 ***
## Income       0.026093   0.009588   2.721   0.0065 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 374.82  on 499  degrees of freedom
## Residual deviance: 325.82  on 496  degrees of freedom
## AIC: 333.82
## 
## Number of Fisher Scoring iterations: 6

10.4 Interpretasi Hasil Model

Model Dummy:

  • Setiap koefisien Education dibandingkan terhadap referensi (SMA)
  • Income → semakin besar, peluang sukses meningkat
  • GenderFemale → interpretasi relatif terhadap Male

Model Numeric:

  • EduRank → menunjukkan bahwa semakin tinggi pendidikan (SMA → S3), peluang sukses meningkat linier.
exp(coef(model_dummy))
## (Intercept)  GenderMale EducationS1 EducationS2 EducationS3      Income 
##  10.6060224   0.4588592   0.1227068   0.3122731   0.6483195   1.0266086
exp(coef(model_numeric))
## (Intercept)  GenderMale     EduRank      Income 
##   0.6646710   0.4640999   2.0643766   1.0264364

10.5 Evaluasi dan Perbandingan Model

AIC(model_dummy)
## [1] 337.2719
AIC(model_numeric)
## [1] 333.8242
BIC(model_dummy)
## [1] 362.5596
BIC(model_numeric)
## [1] 350.6826

Jika AIC/BIC lebih kecil pada model numeric, maka perlakuan ordinal sebagai ranking lebih efisien. Namun, jika efek tidak linier antar level, sebaiknya treat sebagai dummy.

10.6 Kesimpulan

  • Prediktor ordinal bisa diperlakukan sebagai dummy atau numerik.
  • Model numerik lebih ringkas, tetapi harus hati-hati terhadap asumsi linier antar level.
  • Model dummy lebih fleksibel, tapi lebih kompleks secara parameter.
  • Evaluasi model (AIC/BIC) dapat digunakan untuk memilih perlakuan terbaik.

BAB 11 : Pemilihan Model Regresi Logistik

11.1 Pendekatan Confirmatory dan Exploratory

Regresi logistik adalah metode statistik yang digunakan untuk memodelkan hubungan antara satu variabel respons kategorik (biasanya biner) dengan satu atau lebih variabel prediktor. Dalam regresi logistik biner, respons biasanya dikodekan sebagai 0 dan 1, yang mencerminkan dua kategori seperti “ya/tidak”, “lulus/tidak lulus”, atau “sakit/sehat”. Langkah awal dalam membangun model regresi logistik adalah memilih pendekatan yang sesuai untuk menyusun struktur model. Secara umum, terdapat dua pendekatan utama dalam membangun model regresi logistik, yaitu pendekatan konfirmatori (confirmatory) dan eksploratori (exploratory).

Pendekatan Konfirmatori (Confirmatory Approach)

Pendekatan konfirmatori digunakan ketika peneliti telah memiliki hipotesis atau landasan teoritis yang kuat tentang hubungan antara variabel bebas dan variabel respons. Dalam konteks ini, model dibangun berdasarkan teori, literatur terdahulu, atau pengalaman profesional, bukan semata-mata berdasarkan hasil eksplorasi data.

Ciri-ciri pendekatan konfirmatori:

  • Model dibentuk berdasarkan asumsi teoritis.
  • Variabel yang dimasukkan dipilih secara a priori.
  • Tujuan utama adalah menguji hipotesis yang sudah dirumuskan sebelumnya.

Contoh Kasus:

Misalkan kita ingin memprediksi kemungkinan seseorang memiliki asuransi berdasarkan tingkat pendidikan dan pendapatan. Berdasarkan literatur, dua variabel ini secara teoritis berkaitan erat dengan kepemilikan asuransi.

# Contoh data sederhana
data_kesehatan <- data.frame(
  asuransi = c(1, 0, 1, 1, 0, 0, 1, 0, 1, 0),
  pendidikan = c(16, 12, 18, 14, 10, 11, 15, 12, 17, 13),
  pendapatan = c(7, 3, 10, 8, 2, 4, 9, 5, 11, 3)
)

# Model regresi logistik konfirmatori
model_konfirmatori <- glm(asuransi ~ pendidikan + pendapatan, 
                          data = data_kesehatan, 
                          family = binomial)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# Ringkasan model
summary(model_konfirmatori)
## 
## Call:
## glm(formula = asuransi ~ pendidikan + pendapatan, family = binomial, 
##     data = data_kesehatan)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)
## (Intercept)   -154.252 497315.544       0        1
## pendidikan       6.378  54680.585       0        1
## pendapatan      10.985  47186.004       0        1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1.3863e+01  on 9  degrees of freedom
## Residual deviance: 5.1301e-10  on 7  degrees of freedom
## AIC: 6
## 
## Number of Fisher Scoring iterations: 24

#Pendekatan Eksploratori (Exploratory Approach) Pendekatan ini dilakukan ketika tidak ada teori atau hipotesis yang kuat sebelumnya. Tujuannya adalah mengeksplorasi pola dari data dan mencari variabel-variabel yang memiliki pengaruh signifikan.

Contoh Kasus:Kita memiliki data survei tentang stres dengan banyak variabel prediktor seperti jenis kelamin, durasi tidur, konsumsi kafein, olahraga, dan sebagainya.

# Contoh data eksplorasi (simulasi)
set.seed(123)
data_stres <- data.frame(
  stres = sample(0:1, 100, replace = TRUE),
  usia = sample(18:65, 100, replace = TRUE),
  tidur = rnorm(100, mean = 6, sd = 1),
  kafein = rpois(100, lambda = 2),
  olahraga = sample(0:1, 100, replace = TRUE)
)

# Model eksploratori awal
model_eksploratori <- glm(stres ~ ., data = data_stres, family = binomial)

# Ringkasan model
summary(model_eksploratori)
## 
## Call:
## glm(formula = stres ~ ., family = binomial, data = data_stres)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)  1.88311    1.53948   1.223    0.221
## usia        -0.02275    0.01599  -1.422    0.155
## tidur       -0.26078    0.22460  -1.161    0.246
## kafein       0.01860    0.14778   0.126    0.900
## olahraga     0.58615    0.43469   1.348    0.178
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 136.66  on 99  degrees of freedom
## Residual deviance: 130.74  on 95  degrees of freedom
## AIC: 140.74
## 
## Number of Fisher Scoring iterations: 4

Perbandingan Pendekatan Confirmatory dan Exploratory

Pendekatan konfirmatori dan eksploratori memiliki tujuan, asumsi, dan strategi berbeda dalam membangun model regresi logistik. Tabel berikut merangkum perbedaan keduanya:

# Tabel perbandingan pendekatan
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
comparison <- data.frame(
  Aspek = c(
    "Dasar Pemilihan Variabel",
    "Tujuan Utama",
    "Kapan Digunakan",
    "Kelebihan",
    "Kekurangan",
    "Risiko Umum",
    "Contoh Penerapan"
  ),
  Konfirmatori = c(
    "Berdasarkan teori atau literatur sebelumnya",
    "Menguji hipotesis spesifik",
    "Jika telah tersedia dasar teori yang kuat",
    "Kuat secara teoritis dan mudah direplikasi",
    "Kurang fleksibel untuk data baru atau kompleks",
    "Bias konfirmasi (confirmation bias)",
    "Menilai pengaruh pendidikan dan pendapatan terhadap kepemilikan asuransi"
  ),
  Eksploratori = c(
    "Berdasarkan eksplorasi data dan korelasi awal",
    "Menemukan pola atau hubungan baru",
    "Jika belum ada teori yang jelas atau untuk data baru",
    "Fleksibel dan dapat mengungkap insight tersembunyi",
    "Lebih rentan terhadap overfitting",
    "Overfitting atau menemukan pola yang tidak generalizable",
    "Mencari faktor-faktor yang berhubungan dengan stres pada mahasiswa"
  )
)

kable(comparison, caption = "Tabel Perbandingan Pendekatan Confirmatory dan Exploratory dalam Regresi Logistik", align = "l")
Tabel Perbandingan Pendekatan Confirmatory dan Exploratory dalam Regresi Logistik
Aspek Konfirmatori Eksploratori
Dasar Pemilihan Variabel Berdasarkan teori atau literatur sebelumnya Berdasarkan eksplorasi data dan korelasi awal
Tujuan Utama Menguji hipotesis spesifik Menemukan pola atau hubungan baru
Kapan Digunakan Jika telah tersedia dasar teori yang kuat Jika belum ada teori yang jelas atau untuk data baru
Kelebihan Kuat secara teoritis dan mudah direplikasi Fleksibel dan dapat mengungkap insight tersembunyi
Kekurangan Kurang fleksibel untuk data baru atau kompleks Lebih rentan terhadap overfitting
Risiko Umum Bias konfirmasi (confirmation bias) Overfitting atau menemukan pola yang tidak generalizable
Contoh Penerapan Menilai pengaruh pendidikan dan pendapatan terhadap kepemilikan asuransi Mencari faktor-faktor yang berhubungan dengan stres pada mahasiswa

11.2 Metode Stepwise: Forward, Backward, dan Kedua Arah

Dalam membangun model regresi logistik, sering kali kita dihadapkan pada banyak kandidat variabel prediktor. Menyertakan semua variabel bisa menyebabkan model menjadi rumit dan rentan terhadap overfitting, sementara menghilangkan terlalu banyak variabel dapat mengurangi kekuatan prediksi model.

Oleh karena itu, salah satu pendekatan populer untuk memilih variabel secara sistematis adalah menggunakan metode stepwise. Metode ini membantu dalam memilih subset variabel terbaik berdasarkan kriteria statistik tertentu.

Jenis Metode Stepwise

Ada tiga jenis utama metode stepwise:

Metode Penjelasan Singkat
Forward Selection Memulai dari model kosong, menambahkan variabel satu per satu berdasarkan kontribusi terbaik (biasanya berdasarkan AIC atau p-value)
Backward Elimination Memulai dari model penuh, menghapus variabel satu per satu yang paling tidak signifikan
Stepwise (Two-way) Kombinasi dari forward dan backward; variabel dapat ditambahkan atau dihapus dalam setiap langkah

Dasar Pemilihan: Akaike Information Criterion (AIC)

Metode stepwise umumnya menggunakan AIC (Akaike Information Criterion) sebagai kriteria evaluasi model. Semakin rendah nilai AIC, semakin baik model dalam hal keseimbangan antara fit dan kompleksitas.

AIC = -2 * LogLikelihood + 2 * k
Di mana k adalah jumlah parameter dalam model.


Contoh Penerapan di R

Kita akan menggunakan dataset simulasi data_stres dari bagian sebelumnya:

# Dataset simulasi
set.seed(123)
data_stres <- data.frame(
  stres = sample(0:1, 100, replace = TRUE),
  usia = sample(18:65, 100, replace = TRUE),
  tidur = rnorm(100, mean = 6, sd = 1),
  kafein = rpois(100, lambda = 2),
  olahraga = sample(0:1, 100, replace = TRUE),
  merokok = sample(0:1, 100, replace = TRUE),
  jam_sosmed = rnorm(100, mean = 3, sd = 1.2)
)
# Forward: mulai dari model kosong
null_model <- glm(stres ~ 1, data = data_stres, family = binomial)

# Full model
full_model <- glm(stres ~ ., data = data_stres, family = binomial)

# Pemilihan forward
model_forward <- step(null_model, 
                      scope = list(lower = null_model, upper = full_model),
                      direction = "forward")
## Start:  AIC=138.66
## stres ~ 1
## 
##              Df Deviance    AIC
## + tidur       1   134.18 138.18
## + olahraga    1   134.62 138.62
## <none>            136.66 138.66
## + usia        1   134.68 138.68
## + jam_sosmed  1   135.53 139.53
## + merokok     1   136.05 140.05
## + kafein      1   136.66 140.66
## 
## Step:  AIC=138.18
## stres ~ tidur
## 
##              Df Deviance    AIC
## <none>            134.18 138.18
## + jam_sosmed  1   132.52 138.52
## + usia        1   132.59 138.59
## + olahraga    1   132.81 138.81
## + merokok     1   133.41 139.41
## + kafein      1   134.18 140.18
summary(model_forward)
## 
## Call:
## glm(formula = stres ~ tidur, family = binomial, data = data_stres)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)   1.7032     1.3017   1.308    0.191
## tidur        -0.3326     0.2165  -1.536    0.124
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 136.66  on 99  degrees of freedom
## Residual deviance: 134.18  on 98  degrees of freedom
## AIC: 138.18
## 
## Number of Fisher Scoring iterations: 4

Interpretasi: Variabel ditambahkan satu per satu. Setiap langkah memilih variabel dengan kontribusi terbesar terhadap penurunan AIC. Hasil akhirnya adalah model dengan variabel-variabel terbaik dari sisi efisiensi informasi.

# Backward: mulai dari model lengkap
model_backward <- step(full_model, direction = "backward")
## Start:  AIC=141.21
## stres ~ usia + tidur + kafein + olahraga + merokok + jam_sosmed
## 
##              Df Deviance    AIC
## - kafein      1   127.24 139.24
## - merokok     1   128.47 140.47
## - tidur       1   129.19 141.19
## <none>            127.21 141.21
## - usia        1   129.44 141.44
## - olahraga    1   129.72 141.72
## - jam_sosmed  1   129.91 141.91
## 
## Step:  AIC=139.24
## stres ~ usia + tidur + olahraga + merokok + jam_sosmed
## 
##              Df Deviance    AIC
## - merokok     1   128.48 138.48
## - tidur       1   129.20 139.20
## <none>            127.24 139.24
## - usia        1   129.47 139.47
## - olahraga    1   129.79 139.79
## - jam_sosmed  1   129.92 139.92
## 
## Step:  AIC=138.48
## stres ~ usia + tidur + olahraga + jam_sosmed
## 
##              Df Deviance    AIC
## - tidur       1   130.19 138.19
## <none>            128.48 138.48
## - usia        1   130.60 138.60
## - jam_sosmed  1   130.76 138.76
## - olahraga    1   130.93 138.93
## 
## Step:  AIC=138.19
## stres ~ usia + olahraga + jam_sosmed
## 
##              Df Deviance    AIC
## - jam_sosmed  1   132.16 138.16
## <none>            130.19 138.19
## - usia        1   132.82 138.82
## - olahraga    1   133.49 139.49
## 
## Step:  AIC=138.16
## stres ~ usia + olahraga
## 
##            Df Deviance    AIC
## <none>          132.16 138.16
## - usia      1   134.62 138.62
## - olahraga  1   134.68 138.68
summary(model_backward)
## 
## Call:
## glm(formula = stres ~ usia + olahraga, family = binomial, data = data_stres)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)  0.39305    0.72152   0.545    0.586
## usia        -0.02453    0.01580  -1.553    0.120
## olahraga     0.66719    0.42495   1.570    0.116
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 136.66  on 99  degrees of freedom
## Residual deviance: 132.16  on 97  degrees of freedom
## AIC: 138.16
## 
## Number of Fisher Scoring iterations: 4
# Stepwise dua arah
model_stepwise <- step(null_model, 
                       scope = list(lower = null_model, upper = full_model),
                       direction = "both")
## Start:  AIC=138.66
## stres ~ 1
## 
##              Df Deviance    AIC
## + tidur       1   134.18 138.18
## + olahraga    1   134.62 138.62
## <none>            136.66 138.66
## + usia        1   134.68 138.68
## + jam_sosmed  1   135.53 139.53
## + merokok     1   136.05 140.05
## + kafein      1   136.66 140.66
## 
## Step:  AIC=138.18
## stres ~ tidur
## 
##              Df Deviance    AIC
## <none>            134.18 138.18
## + jam_sosmed  1   132.52 138.52
## + usia        1   132.59 138.59
## - tidur       1   136.66 138.66
## + olahraga    1   132.81 138.81
## + merokok     1   133.41 139.41
## + kafein      1   134.18 140.18
summary(model_stepwise)
## 
## Call:
## glm(formula = stres ~ tidur, family = binomial, data = data_stres)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)   1.7032     1.3017   1.308    0.191
## tidur        -0.3326     0.2165  -1.536    0.124
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 136.66  on 99  degrees of freedom
## Residual deviance: 134.18  on 98  degrees of freedom
## AIC: 138.18
## 
## Number of Fisher Scoring iterations: 4

Interpretasi: Model ini lebih fleksibel. Setelah menambahkan variabel, algoritma dapat menghapus variabel sebelumnya jika dianggap tidak lagi signifikan secara keseluruhan.

Catatan Tambahan: Metode stepwise bersifat otomatis dan data-driven, namun tetap perlu penilaian substansial berdasarkan konteks penelitian.Jika digunakan secara berlebihan, dapat meningkatkan risiko data dredging dan overfitting, terutama pada dataset kecil.

Kesimpulan Metode stepwise membantu dalam menyusun model regresi logistik yang optimal dengan cara sistematis. Pemilihan metode (forward, backward, atau two-way) tergantung pada kondisi awal model dan jumlah variabel. Setelah model terbaik diperoleh, langkah selanjutnya adalah mengevaluasi performa model melalui kurva ROC, AUC, pseudo R-squared, dan tabel klasifikasi.

11.3 Evaluasi Model: ROC dan AUC

Setelah model regresi logistik dibangun, langkah penting berikutnya adalah mengevaluasi kemampuan prediksi model. Salah satu metode yang paling umum digunakan adalah dengan kurva ROC (Receiver Operating Characteristic) dan AUC (Area Under the Curve).


Apa itu Kurva ROC?

Kurva ROC adalah grafik yang menggambarkan hubungan antara:

  • True Positive Rate (TPR) = Sensitivitas
  • False Positive Rate (FPR) = 1 - Spesifisitas

ROC membantu kita menilai kemampuan model membedakan antara kelas 0 dan 1.

TPR (Sensitivitas) = TP / (TP + FN)
FPR (1 - Spesifisitas) = FP / (FP + TN)

Setiap titik pada kurva ROC menunjukkan pasangan TPR dan FPR pada ambang batas (threshold) yang berbeda dari prediksi probabilitas model logistik.


Apa itu AUC (Area Under Curve)?

AUC mengukur luas di bawah kurva ROC. Nilai AUC berkisar dari 0 hingga 1:

  • AUC = 1 Prediksi sempurna
  • AUC > 0.9 Sangat baik
  • AUC 0.70.9 Cukup baik
  • AUC < 0.7 Kurang baik
  • AUC = 0.5 Sama dengan tebak-tebakan acak

Contoh Perhitungan ROC & AUC di R

Gunakan data simulasi yang sama:

# Load package
library(pROC)  # untuk ROC dan AUC
## Warning: package 'pROC' was built under R version 4.3.3
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
library(ggplot2)

# Buat model logistik
model <- glm(stres ~ usia + tidur + kafein, 
             data = data_stres, 
             family = binomial)

# Hitung probabilitas prediksi
data_stres$prob_prediksi <- predict(model, type = "response")

# ROC curve dan AUC
roc_obj <- roc(data_stres$stres, data_stres$prob_prediksi)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
roc_obj
## 
## Call:
## roc.default(response = data_stres$stres, predictor = data_stres$prob_prediksi)
## 
## Data: data_stres$prob_prediksi in 57 controls (data_stres$stres 0) < 43 cases (data_stres$stres 1).
## Area under the curve: 0.6181
# Plot kurva ROC
plot(roc_obj, col = "blue", main = "Kurva ROC")

# Nilai AUC
auc(roc_obj)
## Area under the curve: 0.6181
# Konversi ke data frame
roc_df <- data.frame(
  fpr = rev(roc_obj$specificities),
  tpr = rev(roc_obj$sensitivities)
)

# Plot dengan ggplot
ggplot(roc_df, aes(x = 1 - fpr, y = tpr)) +
  geom_line(color = "blue", size = 1) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "gray") +
  labs(title = "Kurva ROC",
       x = "False Positive Rate (1 - Specificity)",
       y = "True Positive Rate (Sensitivity)") +
  theme_minimal()

Kesimpulan ROC dan AUC adalah alat yang sangat berguna dalam mengevaluasi performa klasifikasi model logistik. Semakin tinggi nilai AUC, semakin baik model dalam mengklasifikasikan observasi. Namun, untuk dataset yang sangat tidak seimbang (misalnya jumlah kelas 1 sangat sedikit dibanding kelas 0), kurva lain seperti Precision-Recall Curve (PR Curve) dapat memberikan evaluasi yang lebih akurat (dibahas pada bagian 11.11).

11.4 Pseudo R-Squared

Dalam regresi linear, R-squared menunjukkan proporsi variasi variabel dependen yang dapat dijelaskan oleh model. Namun, dalam regresi logistik, R-squared tidak dapat digunakan karena model logistik menggunakan likelihood, bukan sum of squares.

Sebagai gantinya, digunakan ukuran yang dikenal sebagai Pseudo R-squared untuk menilai goodness-of-fit dari model.


Jenis-jenis Pseudo R-Squared

Terdapat beberapa jenis Pseudo R-squared, yang umum digunakan di antaranya:

Jenis Pseudo R Rumus Interpretasi Umum
McFadden formula Paling sering digunakan, mirip R pada regresi
Cox & Snell formula Tidak mencapai nilai maksimum 1
Nagelkerke Penyesuaian Cox & Snell agar bisa mencapai nilai maksimum 1 Interpretasi lebih mudah karena rentangnya 01

Keterangan: - \(L_0\): log-likelihood dari model null (tanpa prediktor) - \(L_1\): log-likelihood dari model dengan prediktor - \(n\): jumlah observasi


Contoh Perhitungan Pseudo R di R

Gunakan kembali model logistik sebelumnya:

# Model logistik
model_log <- glm(stres ~ usia + tidur + kafein, 
                 data = data_stres, 
                 family = binomial)
# Install jika belum tersedia
# install.packages("pscl")

library(pscl)
## Warning: package 'pscl' was built under R version 4.3.3
## Classes and Methods for R originally developed in the
## Political Science Computational Laboratory
## Department of Political Science
## Stanford University (2002-2015),
## by and under the direction of Simon Jackman.
## hurdle and zeroinfl functions by Achim Zeileis.
# Hitung pseudo R-squared
pseudo_r2 <- pR2(model_log)
## fitting null model for pseudo-r2
pseudo_r2
##          llh      llhNull           G2     McFadden         r2ML         r2CU 
## -66.29484826 -68.33149136   4.07328619   0.02980534   0.03991443   0.05357388

11.5 Tabel Klasifikasi dan Evaluasi

Setelah mendapatkan prediksi probabilitas dari model regresi logistik, langkah selanjutnya adalah mengevaluasi performa prediksi menggunakan tabel klasifikasi.

Tabel klasifikasi (confusion matrix) membandingkan hasil prediksi model dengan data aktual. Dari tabel ini, kita bisa menghitung berbagai ukuran evaluasi seperti akurasi, sensitivitas, spesifisitas, dan lainnya.


Tabel Klasifikasi 2x2

Kelas Aktual = 1 Kelas Aktual = 0
Prediksi = 1 True Positive (TP) False Positive (FP)
Prediksi = 0 False Negative (FN) True Negative (TN)

Ukuran Evaluasi Model

Beberapa ukuran evaluasi yang penting:

  • Akurasi = (TP + TN) / (TP + TN + FP + FN)
  • Sensitivitas (Recall/TPR) = TP / (TP + FN)
  • Spesifisitas = TN / (TN + FP)
  • Precision (PPV) = TP / (TP + FP)
  • F1-Score = 2 (Precision Recall) / (Precision + Recall)

Contoh Perhitungan di R

Gunakan model yang sudah dibangun sebelumnya.

# Menentukan threshold
threshold <- 0.5

# Membuat prediksi kelas berdasarkan threshold
data_stres$pred_class <- ifelse(data_stres$prob_prediksi >= threshold, 1, 0)

# Konversi ke faktor agar confusionMatrix dapat digunakan
data_stres$pred_class <- factor(data_stres$pred_class, levels = c(1, 0))
data_stres$stres <- factor(data_stres$stres, levels = c(1, 0))
# Asumsi:
# - data_stres$stres = label asli
# - data_stres$pred_class = prediksi kelas (0 atau 1)

# Buat confusion matrix
table(Predicted = data_stres$pred_class, Actual = data_stres$stres)
##          Actual
## Predicted  1  0
##         1 14 11
##         0 29 46
conf <- table(Predicted = data_stres$pred_class, Actual = data_stres$stres)

# Akurasi
accuracy <- sum(diag(conf)) / sum(conf)

# Sensitivitas (recall positif)
sensitivity <- conf["1", "1"] / sum(conf[, "1"])

# Spesifisitas
specificity <- conf["0", "0"] / sum(conf[, "0"])

# Tampilkan hasil
list(accuracy = accuracy, sensitivity = sensitivity, specificity = specificity)
## $accuracy
## [1] 0.6
## 
## $sensitivity
## [1] 0.3255814
## 
## $specificity
## [1] 0.8070175

Kesimpulan Tabel klasifikasi membantu kita mengukur performa model dalam memprediksi kelas secara benar atau salah. Kombinasi metrik seperti akurasi, sensitivitas, spesifisitas, precision, dan F1-score memberikan pemahaman yang lebih menyeluruh atas kualitas model. Evaluasi ini sangat penting sebelum menggunakan model untuk pengambilan keputusan nyata.

11.6 Metode Perbandingan Model dalam Regresi Logistik

Saat membangun model regresi logistik, sering kali kita membandingkan beberapa model untuk memilih model terbaik. Pemilihan model yang optimal bertujuan untuk mendapatkan model yang sederhana namun tetap memiliki kemampuan prediksi yang baik.


Pendekatan Perbandingan Model

Beberapa metode populer untuk membandingkan model regresi logistik adalah:

  1. Likelihood-Ratio Test (LRT)
  2. Akaike Information Criterion (AIC)
  3. Bayesian Information Criterion (BIC)
  4. Deviance
  5. Pseudo R-squared

1. Likelihood-Ratio Test (LRT)

LRT digunakan untuk menguji apakah model yang lebih kompleks (dengan lebih banyak variabel) memberikan perbaikan signifikan dibandingkan model yang lebih sederhana (nested model).

Rumus statistik LRT:

\[ G^2 = -2 \times (\log L_0 - \log L_1) \]

di mana: - \(\log L_0\) = log-likelihood model sederhana - \(\log L_1\) = log-likelihood model kompleks

Statistik \(G^2\) mengikuti distribusi chi-square dengan derajat kebebasan sama dengan selisih jumlah parameter antara dua model.


2. Akaike Information Criterion (AIC)

AIC mengukur kualitas model dengan mempertimbangkan goodness-of-fit dan kompleksitas model:

\[ AIC = -2 \times \log L + 2k \]

di mana: - \(\log L\) adalah log-likelihood model - \(k\) adalah jumlah parameter model

Model dengan nilai AIC lebih kecil dianggap lebih baik.


3. Bayesian Information Criterion (BIC)

BIC mirip AIC tetapi penalti terhadap kompleksitas model lebih berat:

\[ BIC = -2 \times \log L + k \times \log n \]

di mana: - \(n\) adalah jumlah observasi

Model dengan BIC terkecil dipilih.


4. Deviance

Deviance adalah ukuran ketidaksesuaian model. Deviance residuals yang lebih kecil menunjukkan model yang lebih baik.


Contoh Perbandingan Model di R

Misalkan kita memiliki dua model regresi logistik:

  • Model 1 (sederhana): menggunakan prediktor usia dan tidur
  • Model 2 (kompleks): menggunakan usia, tidur, dan kafein
# Model sederhana
model1 <- glm(stres ~ usia + tidur, data = data_stres, family = binomial)

# Model kompleks
model2 <- glm(stres ~ usia + tidur + kafein, data = data_stres, family = binomial)

# Likelihood Ratio Test
anova(model1, model2, test = "Chisq")
## Analysis of Deviance Table
## 
## Model 1: stres ~ usia + tidur
## Model 2: stres ~ usia + tidur + kafein
##   Resid. Df Resid. Dev Df   Deviance Pr(>Chi)
## 1        97     132.59                       
## 2        96     132.59  1 3.2625e-05   0.9954
AIC(model1, model2)
##        df      AIC
## model1  3 138.5897
## model2  4 140.5897
BIC(model1, model2)
##        df      BIC
## model1  3 146.4052
## model2  4 151.0104

Interpretasi : - Jika p-value dari LRT < 0.05, model kompleks secara signifikan lebih baik. - Jika AIC/BIC model kompleks lebih kecil, model tersebut lebih efisien. Namun, jika perbedaan AIC/BIC sangat kecil, pilih model yang lebih sederhana (prinsip parsimony).

Kesimpulan Perbandingan model adalah tahap penting dalam membangun model regresi logistik untuk memilih model terbaik yang seimbang antara kompleksitas dan kemampuan prediksi. Penggunaan LRT, AIC, dan BIC secara bersamaan memberikan gambaran yang komprehensif.

11.7 Likelihood-Ratio Test (LRT)

Likelihood-Ratio Test (LRT) adalah metode statistik yang digunakan untuk membandingkan dua model yang bersarang (nested models) dalam regresi logistik. Tujuannya adalah menguji apakah penambahan variabel independen secara signifikan memperbaiki model.


Konsep Likelihood dan Log-Likelihood

  • Likelihood adalah fungsi yang mengukur seberapa baik model menjelaskan data yang diamati.
  • Log-Likelihood adalah logaritma dari likelihood yang lebih mudah dihitung dan diinterpretasikan.

Statistik Uji LRT

Statistik uji LRT dihitung dengan rumus:

\[ G^2 = -2 \times (\log L_0 - \log L_1) \]

di mana:

  • \(\log L_0\) = log-likelihood model sederhana (null model)
  • \(\log L_1\) = log-likelihood model kompleks (model alternatif)

Distribusi Statistik Uji

Nilai \(G^2\) mengikuti distribusi Chi-square dengan derajat kebebasan sama dengan selisih jumlah parameter antara dua model.


Hipotesis Uji

  • H0 (Null Hypothesis): Model sederhana cukup, variabel tambahan tidak signifikan.
  • H1 (Alternative Hypothesis): Model kompleks lebih baik, variabel tambahan signifikan.

Contoh di R

Misal, kita punya dua model:

  • model1: model dengan variabel usia dan tidur
  • model2: model dengan variabel usia, tidur, dan kafein
# Model sederhana
model1 <- glm(stres ~ usia + tidur, data = data_stres, family = binomial)

# Model kompleks
model2 <- glm(stres ~ usia + tidur + kafein, data = data_stres, family = binomial)

# Melakukan Likelihood Ratio Test
lrt_result <- anova(model1, model2, test = "Chisq")
print(lrt_result)
## Analysis of Deviance Table
## 
## Model 1: stres ~ usia + tidur
## Model 2: stres ~ usia + tidur + kafein
##   Resid. Df Resid. Dev Df   Deviance Pr(>Chi)
## 1        97     132.59                       
## 2        96     132.59  1 3.2625e-05   0.9954

Interpretasi Output : Output anova() akan memberikan tabel dengan nilai:

  • Deviance: ukuran kesalahan model.
  • Chisq: nilai statistik uji
  • Pr(>Chi): p-value uji. Jika p-value < 0.05, kita tolak H0 dan menyimpulkan bahwa model dengan variabel tambahan (kafein) secara signifikan lebih baik.

Kesimpulan Likelihood-Ratio Test adalah alat penting untuk menentukan apakah penambahan variabel dalam model regresi logistik meningkatkan performa model secara signifikan. Dengan menguji nested models, LRT membantu memilih model yang lebih baik tanpa menambah variabel yang tidak berguna.

11.8 Prinsip Parsimony


Apa Itu Prinsip Parsimony?

Prinsip parsimony, juga dikenal sebagai prinsip kesederhanaan atau Occams Razor, menyatakan bahwa dari dua model yang memiliki kemampuan prediksi hampir sama, model yang lebih sederhana harus dipilih.

Dalam konteks regresi logistik, ini berarti memilih model dengan jumlah variabel prediktor yang lebih sedikit, selama model tersebut masih cukup akurat dan tidak kehilangan informasi penting.


Mengapa Prinsip Parsimony Penting?

  • Menghindari overfitting: Model yang terlalu kompleks cenderung menangkap noise pada data, bukan pola sebenarnya.
  • Kemudahan interpretasi: Model sederhana lebih mudah dipahami dan dijelaskan kepada pemangku kepentingan.
  • Efisiensi komputasi: Model dengan lebih sedikit variabel membutuhkan waktu proses yang lebih cepat.
  • Generalisasi yang lebih baik: Model sederhana biasanya lebih stabil saat diterapkan pada data baru.

Cara Menerapkan Prinsip Parsimony

  1. Gunakan metode seleksi variabel, seperti:
    • Stepwise selection (forward, backward, atau kedua arah)
    • Lasso regression (regularisasi)
  2. Evaluasi model dengan metrik seperti AIC dan BIC, yang memberikan penalti pada kompleksitas model.
  3. Uji signifikansi variabel secara individual, hilangkan variabel yang tidak signifikan.
  4. Perhatikan konteks dan domain masalah, pastikan variabel penting tidak dihilangkan.

Contoh Implementasi di R

Misalnya, kita memiliki model awal dengan banyak variabel dan ingin memilih model yang lebih sederhana menggunakan stepwise backward selection berdasarkan AIC:

# Model awal dengan semua variabel
model_full <- glm(stres ~ usia + tidur + kafein , data = data_stres, family = binomial)

# Backward stepwise selection
library(MASS)
model_step <- stepAIC(model_full, direction = "backward")
## Start:  AIC=140.59
## stres ~ usia + tidur + kafein
## 
##          Df Deviance    AIC
## - kafein  1   132.59 138.59
## - usia    1   134.18 140.18
## <none>        132.59 140.59
## - tidur   1   134.68 140.68
## 
## Step:  AIC=138.59
## stres ~ usia + tidur
## 
##         Df Deviance    AIC
## - usia   1   134.18 138.18
## <none>       132.59 138.59
## - tidur  1   134.68 138.68
## 
## Step:  AIC=138.18
## stres ~ tidur
## 
##         Df Deviance    AIC
## <none>       134.18 138.18
## - tidur  1   136.66 138.66
summary(model_step)
## 
## Call:
## glm(formula = stres ~ tidur, family = binomial, data = data_stres)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)  -1.7032     1.3017  -1.308    0.191
## tidur         0.3326     0.2165   1.536    0.124
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 136.66  on 99  degrees of freedom
## Residual deviance: 134.18  on 98  degrees of freedom
## AIC: 138.18
## 
## Number of Fisher Scoring iterations: 4

Interpretasi :

  • Fungsi stepAIC() akan mengeliminasi variabel satu per satu yang tidak memberikan kontribusi signifikan berdasarkan nilai AIC.
  • Model akhir biasanya lebih sederhana dengan nilai AIC yang lebih rendah. Dengan demikian, prinsip parsimony tercapai tanpa mengorbankan kemampuan prediksi secara signifikan.

Kesimpulan Prinsip parsimony membantu memilih model regresi logistik yang optimal dengan mengutamakan kesederhanaan dan efektivitas. Model yang sederhana namun informatif lebih baik digunakan dibandingkan model yang kompleks tanpa manfaat signifikan.

11.8 Prinsip Parsimony


Pengertian Prinsip Parsimony

Prinsip parsimony (atau prinsip kesederhanaan) adalah konsep dalam pemodelan statistik yang menyatakan:

“Model terbaik adalah model yang sesederhana mungkin, namun tetap cukup baik untuk menjelaskan data.”

Artinya, jika dua model memiliki performa yang hampir sama, model dengan jumlah parameter lebih sedikit lebih diutamakan.


Mengapa Prinsip Parsimony Penting?

  • Menghindari overfitting: Model yang terlalu kompleks dapat menangkap noise sebagai pola, sehingga kurang mampu menggeneralisasi data baru.
  • Interpretasi yang lebih mudah: Model dengan sedikit variabel lebih mudah dipahami dan dijelaskan.
  • Efisiensi komputasi: Model sederhana membutuhkan waktu pelatihan dan prediksi yang lebih cepat.
  • Kestabilan model: Model sederhana cenderung lebih stabil terhadap variasi data.

Prinsip Parsimony dan Penalti pada Kompleksitas Model

Metode evaluasi model seperti AIC dan BIC secara otomatis memasukkan penalti untuk kompleksitas model, sehingga membantu menerapkan prinsip parsimony.

Rumus AIC:

\[ AIC = -2 \times \log L + 2k \]

Rumus BIC:

\[ BIC = -2 \times \log L + k \log n \]

Dimana: - \(\log L\) = Log-likelihood model - \(k\) = Jumlah parameter model - \(n\) = Jumlah observasi


Contoh Ilustrasi

Misal kita memiliki dua model regresi logistik:

Model Log-Likelihood (\(\log L\)) Jumlah Parameter (k) AIC BIC
1 -120 3 \(-2 \times (-120) + 2 \times 3 = 246\) \(-2 \times (-120) + 3 \times \log n\)
2 -115 6 \(-2 \times (-115) + 2 \times 6 = 242\) \(-2 \times (-115) + 6 \times \log n\)

Model 2 memiliki log-likelihood lebih baik (lebih tinggi) dan AIC lebih kecil, tapi BIC bisa lebih besar jika \(n\) besar karena penalti kompleksitas yang lebih berat.


Cara Menggunakan Prinsip Parsimony

  1. Bandingkan nilai AIC dan BIC untuk model alternatif.
  2. Pilih model dengan nilai AIC atau BIC terendah (bisa berbeda, perhatikan konteks).
  3. Perhatikan signifikansi variabel dan hapus variabel yang tidak signifikan.
  4. Gunakan metode stepwise selection untuk mengoptimalkan model secara otomatis.

Kesimpulan

Prinsip Parsimony menuntun kita memilih model yang efisien dan sederhana agar:

  • Tidak overfit,
  • Lebih mudah dipahami,
  • Lebih cepat dijalankan,
  • Memiliki kemampuan prediksi yang baik.

11.9 Evaluasi Tabel Klasifikasi dan Akurasi Model


11.9.1 Pengantar

Setelah membangun model regresi logistik, evaluasi performa model sangat penting. Salah satu cara yang umum adalah menggunakan tabel klasifikasi (confusion matrix) yang membandingkan hasil prediksi model dengan data aktual.


Tabel Klasifikasi (Confusion Matrix)

Tabel klasifikasi untuk masalah klasifikasi biner dapat ditulis sebagai berikut:

Prediksi Positif Prediksi Negatif
Aktual Positif True Positive (TP) False Negative (FN)
Aktual Negatif False Positive (FP) True Negative (TN)
  • True Positive (TP): Jumlah kasus positif yang diprediksi positif dengan benar.
  • False Negative (FN): Jumlah kasus positif yang diprediksi negatif secara salah.
  • False Positive (FP): Jumlah kasus negatif yang diprediksi positif secara salah.
  • True Negative (TN): Jumlah kasus negatif yang diprediksi negatif dengan benar.

Ukuran Evaluasi Akurasi Model

  1. Akurasi (Accuracy):

\[ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} \]

Mengukur proporsi prediksi yang benar dari keseluruhan data.


  1. Sensitivitas (Recall / True Positive Rate):

\[ \text{Sensitivity} = \frac{TP}{TP + FN} \]

Mengukur kemampuan model dalam mendeteksi kelas positif dengan benar.


  1. Spesifisitas (True Negative Rate):

\[ \text{Specificity} = \frac{TN}{TN + FP} \]

Mengukur kemampuan model dalam mendeteksi kelas negatif dengan benar.


  1. Precision:

\[ \text{Precision} = \frac{TP}{TP + FP} \]

Mengukur proporsi prediksi positif yang benar-benar positif.


Contoh Implementasi di R

# Data aktual dan probabilitas prediksi
actual <- factor(c(1,0,1,1,0,0,1,0,1,0), levels = c(0,1))
predicted_prob <- c(0.9, 0.1, 0.8, 0.7, 0.4, 0.3, 0.85, 0.2, 0.6, 0.1)

# Tentukan threshold
threshold <- 0.5
predicted <- ifelse(predicted_prob > threshold, 1, 0)
predicted <- factor(predicted, levels = c(0,1))

# Confusion matrix
conf_matrix <- table(Predicted = predicted, Actual = actual)
print(conf_matrix)
##          Actual
## Predicted 0 1
##         0 5 0
##         1 0 5
# Ekstrak nilai dari confusion matrix
TP <- conf_matrix["1", "1"]  # True Positives
TN <- conf_matrix["0", "0"]  # True Negatives
FP <- conf_matrix["1", "0"]  # False Positives
FN <- conf_matrix["0", "1"]  # False Negatives

# Hitung metrik
accuracy     <- (TP + TN) / sum(conf_matrix)
sensitivity  <- TP / (TP + FN)  # recall
specificity  <- TN / (TN + FP)

# Tampilkan hasil
cat("Akurasi     :", round(accuracy, 3), "\n")
## Akurasi     : 1
cat("Sensitivitas:", round(sensitivity, 3), "\n")
## Sensitivitas: 1
cat("Spesifisitas:", round(specificity, 3), "\n")
## Spesifisitas: 1

Catatan Penting :Pemilihan threshold (cut-off) dapat memengaruhi hasil evaluasi. Threshold default biasanya 0.5..

Kesimpulan Tabel klasifikasi dan ukuran akurasi model memberikan gambaran praktis tentang seberapa baik model regresi logistik memprediksi kelas pada data uji. Pemahaman sensitivitas dan spesifisitas sangat penting agar model dapat diaplikasikan sesuai kebutuhan domain.

11.10 Detail ROC: Penjelasan Kurva ROC (Receiver Operating Characteristic)


Apa itu Kurva ROC?

Kurva ROC adalah grafik yang menunjukkan performa model klasifikasi biner pada berbagai threshold (cut-off) probabilitas. Kurva ini mengilustrasikan trade-off antara:

  • True Positive Rate (TPR) atau Sensitivitas
  • False Positive Rate (FPR) = 1 - Spesifisitas

Definisi dan Rumus

  • True Positive Rate (TPR) / Sensitivitas:

\[ TPR = \frac{TP}{TP + FN} \]

  • False Positive Rate (FPR):

\[ FPR = \frac{FP}{FP + TN} = 1 - \text{Specificity} \]

ROC plot menempatkan FPR pada sumbu X dan TPR pada sumbu Y.


Interpretasi Kurva ROC

  • Kurva yang mendekati sudut kiri atas menunjukkan performa model yang baik: sensitivitas tinggi dan false positive rendah.
  • Garis diagonal (dari kiri bawah ke kanan atas) menunjukkan model tanpa kemampuan prediksi (random guess).
  • Area di bawah kurva (AUC) digunakan sebagai ukuran performa model.

Area Under the Curve (AUC)

AUC adalah nilai luas di bawah kurva ROC. Nilainya antara 0 dan 1.

  • AUC = 1: Model sempurna
  • AUC = 0.5: Model seperti tebakan acak
  • AUC < 0.5: Model lebih buruk dari tebakan acak

Contoh Menghitung dan Membuat Kurva ROC di R

# Paket yang dibutuhkan
library(pROC)

# Data contoh: probabilitas prediksi dan kelas aktual
actual <- c(1,0,1,1,0,0,1,0,1,0)
predicted_prob <- c(0.9, 0.1, 0.8, 0.7, 0.4, 0.3, 0.85, 0.2, 0.6, 0.1)

# Membuat objek ROC
roc_obj <- roc(actual, predicted_prob)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
# Plot ROC curve
plot(roc_obj, col = "blue", main = "ROC Curve")

# Menghitung AUC
auc_value <- auc(roc_obj)
print(paste("AUC:", round(auc_value, 3)))
## [1] "AUC: 1"

Interpretasi :

  • Grafik ROC menampilkan kurva yang mengukur performa model pada semua threshold.
  • Nilai AUC yang lebih tinggi menandakan model dengan kemampuan klasifikasi yang lebih baik.
  • ROC membantu memilih threshold cut-off yang optimal sesuai kebutuhan.

Kesimpulan Kurva ROC dan nilai AUC adalah alat evaluasi yang sangat berguna untuk menilai dan membandingkan model klasifikasi biner, termasuk regresi logistik. Evaluasi ini memberikan gambaran lengkap bagaimana model berperforma pada berbagai threshold.

11.11 Precision-Recall Curve (PR Curve)


Apa itu Precision-Recall Curve?

Precision-Recall (PR) Curve adalah grafik yang menunjukkan trade-off antara:

  • Precision (Presisi)
  • Recall (Sensitivitas / True Positive Rate)

pada berbagai threshold model klasifikasi.

PR Curve sangat berguna terutama ketika data tidak seimbang (imbalance classes), misalnya kasus dengan jumlah positif jauh lebih sedikit daripada negatif.


Definisi dan Rumus

  • Precision:

\[ \text{Precision} = \frac{TP}{TP + FP} \]

  • Recall (Sensitivitas):

\[ \text{Recall} = \frac{TP}{TP + FN} \]


Mengapa PR Curve Penting?

  • Pada data yang tidak seimbang, kurva ROC bisa memberikan gambaran optimis yang menyesatkan.
  • PR Curve lebih fokus pada performa model dalam memprediksi kelas minoritas (positif).
  • Area di bawah PR Curve (Average Precision) menjadi ukuran kinerja yang lebih tepat dalam kasus tersebut.

11.12 Pseudo R-squared pada Regresi Logistik


Pengantar

Dalam regresi linear, nilai R-squared mengukur proporsi variasi variabel dependen yang dapat dijelaskan oleh variabel independen. Namun, pada regresi logistik yang menggunakan variabel dependen kategori, R-squared tradisional tidak dapat digunakan secara langsung.

Sebagai gantinya, berbagai ukuran Pseudo R-squared dikembangkan untuk mengukur goodness-of-fit model regresi logistik.


Beberapa Jenis Pseudo R-squared

  1. McFadden’s R-squared

\[ R^2_{\text{McFadden}} = 1 - \frac{\ln L_{\text{model}}}{\ln L_{\text{null}}} \]

  • \(\ln L_{\text{model}}\) = log-likelihood dari model yang diestimasi
  • \(\ln L_{\text{null}}\) = log-likelihood dari model nol (hanya intercept)

Nilai berkisar antara 0 dan 1, dengan nilai lebih tinggi menunjukkan model yang lebih baik.


  1. Cox & Snell R-squared

\[ R^2_{\text{Cox-Snell}} = 1 - \left(\frac{L_{\text{null}}}{L_{\text{model}}}\right)^{\frac{2}{n}} \]

Namun, nilai maksimum dari Cox & Snell R-squared kurang dari 1, sehingga interpretasinya terbatas.


  1. Nagelkerke R-squared

Nagelkerke mengoreksi Cox & Snell agar nilai maksimum menjadi 1:

\[ R^2_{\text{Nagelkerke}} = \frac{R^2_{\text{Cox-Snell}}}{1 - L_{\text{null}}^{\frac{2}{n}}} \]


Interpretasi

  • Pseudo R-squared tidak sama persis dengan R-squared dalam regresi linear, tetapi memberi gambaran tentang seberapa baik model cocok dengan data.
  • Nilai yang lebih tinggi menunjukkan model dengan kecocokan lebih baik.
  • Nilai sekitar 0.2 - 0.4 sudah dianggap cukup baik dalam konteks regresi logistik.

11.12 Pseudo R-squared pada Regresi Logistik

Contoh Menghitung Pseudo R-squared di R

install.packages("pscl")
## Warning: package 'pscl' is in use and will not be installed
library(pscl)

# Hitung pseudo R-squared otomatis
pseudo_r2 <- pR2(model)
## fitting null model for pseudo-r2
print(pseudo_r2)
##          llh      llhNull           G2     McFadden         r2ML         r2CU 
## -66.29484826 -68.33149136   4.07328619   0.02980534   0.03991443   0.05357388
# Install jika belum ada
# install.packages("DescTools")

library(DescTools)
## Warning: package 'DescTools' was built under R version 4.3.3
# Menghitung Pseudo R-squared
pseudo_r2_desc <- PseudoR2(model, which = c("McFadden", "CoxSnell", "Nagelkerke"))
print(pseudo_r2_desc)
##   McFadden   CoxSnell Nagelkerke 
## 0.02980534 0.03991443 0.05357388

Bab 12: Analisis Kategori Multinomial dan Regresi Multinomial

12.1 Mengenal Distribusi Multinomial

Distribusi multinomial adalah perluasan dari distribusi binomial untuk kasus di mana hasil percobaan terdiri dari lebih dari dua kategori yang saling eksklusif. Distribusi ini sering muncul dalam konteks survei, klasifikasi, dan preferensi pilihan.

Pengantar Konsep Multinomial

Distribusi ini digunakan untuk menggambarkan probabilitas berbagai kemungkinan hasil dalam suatu percobaan dengan lebih dari dua kategori, misalnya:

  • Responden memilih salah satu dari tiga merek minuman ringan.
  • Seseorang memilih moda transportasi: mobil, motor, atau kereta.
  • Mahasiswa memilih jurusan: Statistika, Ekonomi, atau Teknik.

Rumus Distribusi Multinomial

Secara matematis, jika terdapat k kategori dengan probabilitas masing-masing \(\pi_1, \pi_2, \dots, \pi_k\), dan total percobaan sebanyak \(n\), maka distribusi probabilitasnya:

\[ P(Y_1 = y_1, \dots, Y_k = y_k) = \frac{n!}{y_1! y_2! \dots y_k!} \pi_1^{y_1} \pi_2^{y_2} \dots \pi_k^{y_k} \]

dengan syarat:

  • \(y_1 + y_2 + \dots + y_k = n\)
  • \(\pi_1 + \pi_2 + \dots + \pi_k = 1\)

Ciri-ciri Distribusi Multinomial

  • Setiap percobaan menghasilkan satu dari k kategori yang saling eksklusif.
  • Probabilitas setiap kategori tetap pada setiap percobaan.
  • Setiap percobaan independen satu sama lain.
  • Jumlah total percobaan tetap (n tetap).

Contoh Sederhana di R

Misalkan kita melakukan 10 percobaan, dan probabilitas memilih A, B, atau C masing-masing 0.3, 0.4, dan 0.3.

# Distribusi probabilitas multinomial
prob <- c(0.3, 0.4, 0.3)
n <- 10

# Menghitung probabilitas 3A, 4B, 3C
dmultinom(c(3, 4, 3), prob = prob)
## [1] 0.07838208
set.seed(123)

# Simulasi 1000 percobaan
simulasi <- rmultinom(n = 1000, size = 10, prob = prob)
hasil <- t(simulasi)

# Ubah menjadi data frame
df <- as.data.frame(hasil)
names(df) <- c("A", "B", "C")

# Plot distribusi jumlah kategori A
library(ggplot2)
ggplot(df, aes(x = A)) +
  geom_histogram(binwidth = 1, fill = "skyblue", color = "black") +
  labs(title = "Distribusi Jumlah Kategori A dari 1000 Simulasi", x = "Jumlah A", y = "Frekuensi")

Kapan Menggunakan Distribusi Multinomial?

Gunakan distribusi ini ketika:

  • Data Anda terdiri dari lebih dari dua pilihan kategori.
  • Anda ingin mengetahui distribusi probabilitas dari jumlah kemunculan setiap kategori dalam sejumlah percobaan.
  • Anda akan membangun model klasifikasi dengan target kategori nominal > 2 (misalnya, Regresi Logistik Multinomial).

Catatan Tambahan : Distribusi multinomial adalah dasar penting dalam regresi logistik multinomial, di mana kita memodelkan probabilitas relatif dari masing-masing kategori berdasarkan prediktor.

12.2 Studi Kasus Data Multinomial

Untuk memahami konsep distribusi multinomial dan aplikasinya dalam regresi logistik multinomial, mari kita pelajari melalui sebuah studi kasus yang realistis dan aplikatif.


Studi Kasus: Pemilihan Moda Transportasi Mahasiswa

Misalkan dilakukan survei terhadap 300 mahasiswa untuk mengetahui pilihan moda transportasi utama yang digunakan saat pergi ke kampus. Terdapat tiga pilihan:

  • Mobil (kategori 1)
  • Motor (kategori 2)
  • Transportasi umum (kategori 3)

Berikut hasilnya:

Moda Transportasi Jumlah Mahasiswa
Mobil 90
Motor 150
Transportasi Umum 60
Total 300

Representasi Sebagai Multinomial

Jumlah mahasiswa yang memilih masing-masing moda (\(y_1 = 90\), \(y_2 = 150\), \(y_3 = 60\)) dapat dianggap sebagai realisasi dari variabel acak \((Y_1, Y_2, Y_3)\) yang mengikuti distribusi multinomial dengan parameter:

  • \(n = 300\)
  • Probabilitas masing-masing moda: \(\pi_1, \pi_2, \pi_3\)

Rumus Distribusi Multinomial (Review)

\[ P(Y_1 = y_1, Y_2 = y_2, Y_3 = y_3) = \frac{n!}{y_1! y_2! y_3!} \cdot \pi_1^{y_1} \cdot \pi_2^{y_2} \cdot \pi_3^{y_3} \]


Perhitungan Manual: Estimasi Probabilitas Kategori

Karena kita belum tahu \(\pi\), kita bisa estimasi secara frekuensi relatif:

\[ \hat{\pi}_1 = \frac{90}{300} = 0.30 \quad ; \quad \hat{\pi}_2 = \frac{150}{300} = 0.50 \quad ; \quad \hat{\pi}_3 = \frac{60}{300} = 0.20 \]


Perhitungan Probabilitas Kombinasi Ini

Menggunakan rumus:

\[ P = \frac{300!}{90! \cdot 150! \cdot 60!} \cdot 0.3^{90} \cdot 0.5^{150} \cdot 0.2^{60} \]

Perhitungan ini secara manual sangat besar nilainya dan tidak praktis jika dihitung manual. Maka, kita gunakan fungsi dmultinom() di R untuk menghitungnya.


Implementasi di R

# Parameter dan data
prob <- c(0.3, 0.5, 0.2)
n <- 300
kategori <- c(90, 150, 60)

# Hitung probabilitas dengan distribusi multinomial
dmultinom(kategori, prob = prob)
## [1] 0.003055008
library(ggplot2)

# Buat data frame
df <- data.frame(
  Moda = c("Mobil", "Motor", "Transportasi Umum"),
  Jumlah = c(90, 150, 60)
)

# Pie Chart
ggplot(df, aes(x = "", y = Jumlah, fill = Moda)) +
  geom_col(width = 1) +
  coord_polar(theta = "y") +
  theme_void() +
  labs(title = "Distribusi Moda Transportasi Mahasiswa")

12.3 Regresi Logistik Multinomial Konsep Dasar

Regresi logistik multinomial digunakan untuk memodelkan hubungan antara variabel respons kategorik dengan lebih dari dua kategori dan satu atau lebih variabel prediktor (bebas), baik kategorik maupun kontinu.

Poin-Poin Penting

  1. Distribusi Multinomial digunakan sebagai dasar probabilitas untuk variabel dependen kategorik (>2 kategori).
  2. Model baseline-category logit membandingkan setiap kategori terhadap satu kategori acuan.
  3. Estimasi parameter dilakukan dengan metode maximum likelihood estimation (MLE).
  4. Koefisien dalam model menunjukkan perubahan log-odds dari suatu kategori terhadap baseline ketika prediktor berubah.
  5. Evaluasi model dilakukan melalui:
    • Uji signifikansi koefisien (z-value dan p-value)
    • Akurasi prediksi
    • Confusion matrix
    • Validasi silang (cross-validation)
  6. Paket nnet dan caret di R mendukung analisis regresi logistik multinomial dengan mudah.

Kapan Menggunakan Regresi Logistik Multinomial?

Gunakan model ini ketika:

  • Variabel respon memiliki lebih dari dua kelas.
  • Tidak ada urutan yang alami antar kelas.
  • Ingin mengetahui bagaimana prediktor memengaruhi probabilitas pemilihan kelas tertentu.

Kelebihan dan Kelemahan

Aspek Kelebihan Kelemahan
Interpretasi Mudah dimengerti dalam konteks log-odds Interpretasi bisa rumit untuk banyak kategori
Aplikasi Cocok untuk klasifikasi kategori nominal Tidak cocok untuk kategori ordinal
Performa MLE efisien jika asumsi terpenuhi Sensitif terhadap multikolinearitas dan outlier

Contoh Kasus Lanjutan

Kita lanjut dari studi kasus sebelumnya:

Kita ingin memodelkan hubungan antara moda transportasi utama mahasiswa (mobil, motor, transportasi umum) dengan variabel prediktor:
- Jarak rumah ke kampus (dalam km) variabel numerik
- Status kepemilikan kendaraan pribadi (punya / tidak punya) variabel kategorik


Struktur Model

Regresi logistik multinomial memodelkan log-odds dari tiap kategori terhadap kategori referensi (baseline).

Misal:

  • \(Y \in \{1 = \text{Mobil}, 2 = \text{Motor}, 3 = \text{Umum} \}\)
  • Kategori baseline: Transportasi Umum (kategori 3)

Model:

\[ \log\left(\frac{P(Y = 1)}{P(Y = 3)}\right) = \beta_{10} + \beta_{11} x_1 + \beta_{12} x_2 \] \[ \log\left(\frac{P(Y = 2)}{P(Y = 3)}\right) = \beta_{20} + \beta_{21} x_1 + \beta_{22} x_2 \]

dengan:

  • \(x_1 =\) jarak rumah ke kampus
  • \(x_2 =\) status kendaraan pribadi (0 = tidak punya, 1 = punya)

Asumsi Model

  1. Independensi Observasi
  2. Tidak ada multikolinearitas
  3. Jumlah data cukup besar
  4. Kategori bersifat eksklusif dan saling lepas

Implementasi di R: Persiapan Data

# Simulasi data
set.seed(123)
n <- 300
jarak <- round(runif(n, 1, 15), 1)
kendaraan <- sample(c("Punya", "Tidak"), n, replace = TRUE)

# Probabilitas transportasi tergantung pada variabel
prob_mobil <- ifelse(kendaraan == "Punya", 0.4 - 0.02 * jarak, 0.1)
prob_motor <- ifelse(kendaraan == "Punya", 0.5 - 0.01 * jarak, 0.3)
prob_umum <- 1 - prob_mobil - prob_motor

# Sampling berdasarkan probabilitas
mode_transport <- mapply(function(p1, p2, p3) {
  sample(c("Mobil", "Motor", "Umum"), 1, prob = c(p1, p2, p3))
}, prob_mobil, prob_motor, prob_umum)

# Data frame
df <- data.frame(
  Moda = as.factor(mode_transport),
  Jarak = jarak,
  Kendaraan = as.factor(kendaraan)
)
# Package nnet untuk multinomial logistic regression
library(nnet)
# Model regresi (baseline: "Umum")
model_mn <- multinom(Moda ~ Jarak + Kendaraan, data = df)
## # weights:  12 (6 variable)
## initial  value 329.583687 
## iter  10 value 284.632063
## final  value 284.627334 
## converged
summary(model_mn)
## Call:
## multinom(formula = Moda ~ Jarak + Kendaraan, data = df)
## 
## Coefficients:
##       (Intercept)     Jarak KendaraanTidak
## Motor  -0.5806436 0.1198425       1.587478
## Umum   -1.3102624 0.1791426       2.280654
## 
## Std. Errors:
##       (Intercept)      Jarak KendaraanTidak
## Motor   0.3989604 0.04849607      0.4172393
## Umum    0.4263526 0.04939775      0.4199172
## 
## Residual Deviance: 569.2547 
## AIC: 581.2547
#odds ratio dan uji signifikan
exp(coef(model_mn))
##       (Intercept)    Jarak KendaraanTidak
## Motor   0.5595381 1.127319       4.891398
## Umum    0.2697493 1.196191       9.783073
z_values <- summary(model_mn)$coefficients / summary(model_mn)$standard.errors
p_values <- 2 * (1 - pnorm(abs(z_values)))
p_values
##       (Intercept)        Jarak KendaraanTidak
## Motor 0.145560927 0.0134667707   1.419654e-04
## Umum  0.002117842 0.0002872522   5.597685e-08

12.3.1 Baseline-Category Logit Model

Pada regresi logistik multinomial, pendekatan yang paling umum digunakan adalah baseline-category logit model (juga dikenal sebagai generalized logits model). Model ini digunakan ketika variabel respons (Y) bersifat kategorik dengan lebih dari dua kategori nominal (tanpa urutan).


Konsep Utama

Baseline-category logit model membandingkan setiap kategori dengan satu kategori acuan (baseline). Kita akan membangun model dalam bentuk:

\[ \log\left(\frac{P(Y = j)}{P(Y = b)}\right) = \beta_{j0} + \beta_{j1}x_1 + \beta_{j2}x_2 + \ldots + \beta_{jp}x_p, \quad \text{untuk } j \neq b \]

Dengan:

  • \(Y\) = variabel kategorik respons dengan \(k\) kategori
  • \(b\) = kategori baseline (acuan)
  • \(x_1, x_2, \ldots, x_p\) = prediktor
  • \(\beta_{j}\) = koefisien regresi untuk kategori \(j\) relatif terhadap baseline

Mengapa Baseline-Category?

Pemilihan baseline penting karena:

  • Semua perbandingan interpretasi log-odds atau odds ratio akan relatif terhadap kategori ini.
  • Pemilihan baseline bersifat arbitrer namun strategis (misalnya, kategori yang paling umum atau paling netral sering dipilih sebagai baseline).

Contoh Logit Multinomial

Misal variabel respons “Moda” memiliki tiga kategori:

  • Mobil
  • Motor
  • Umum baseline

Maka dua persamaan logit yang dibentuk adalah:

\[ \log\left(\frac{P(\text{Mobil})}{P(\text{Umum})}\right) = \beta_{10} + \beta_{11}x_1 + \beta_{12}x_2 \]

\[ \log\left(\frac{P(\text{Motor})}{P(\text{Umum})}\right) = \beta_{20} + \beta_{21}x_1 + \beta_{22}x_2 \]

Dengan probabilitas total:

\[ P(Y = j) = \frac{\exp(\eta_j)}{1 + \sum_{l \neq b} \exp(\eta_l)}, \quad \text{dengan } \eta_j = \beta_{j0} + \sum_{k} \beta_{jk}x_k \]

\[ P(Y = b) = \frac{1}{1 + \sum_{l \neq b} \exp(\eta_l)} \]


Contoh Perhitungan Sederhana

Misal dari model didapat:

  • \(\log\left(\frac{P(\text{Mobil})}{P(\text{Umum})}\right) = 0.5 + 0.2x_1 - 0.8x_2\)
  • \(\log\left(\frac{P(\text{Motor})}{P(\text{Umum})}\right) = -0.3 + 0.1x_1 + 0.5x_2\)

Untuk individu dengan: - \(x_1 =\) Jarak = 10 - \(x_2 =\) Kendaraan = 1 (punya)

Hitung \(\eta\):

\[ \eta_{\text{Mobil}} = 0.5 + 0.2(10) - 0.8(1) = 1.7 \] \[ \eta_{\text{Motor}} = -0.3 + 0.1(10) + 0.5(1) = 1.2 \]

Maka:

\[ P(\text{Mobil}) = \frac{\exp(1.7)}{1 + \exp(1.7) + \exp(1.2)} \approx \frac{5.47}{1 + 5.47 + 3.32} \approx 0.49 \]

\[ P(\text{Motor}) \approx \frac{3.32}{1 + 5.47 + 3.32} \approx 0.30 \]

\[ P(\text{Umum}) = \frac{1}{1 + 5.47 + 3.32} \approx 0.09 \]


Kesimpulan

  • Model baseline-category logit memungkinkan kita untuk membandingkan probabilitas tiap kategori terhadap kategori acuan.
  • Sangat berguna ketika kita memiliki kategori nominal yang tidak bisa diurutkan.
  • Interpretasi koefisien mirip dengan regresi logistik biner, tetapi per kategori terhadap baseline.
library(ggplot2)

# Buat data frame
df <- data.frame(
  Moda = c("Mobil", "Motor", "Transportasi Umum"),
  Jumlah = c(90, 150, 60)
)

# Pie Chart
ggplot(df, aes(x = "", y = Jumlah, fill = Moda)) +
  geom_col(width = 1) +
  coord_polar(theta = "y") +
  theme_void() +
  labs(title = "Distribusi Moda Transportasi Mahasiswa")

library(ggplot2)

# Buat data frame
df <- data.frame(
  Moda = c("Mobil", "Motor", "Transportasi Umum"),
  Jumlah = c(90, 150, 60)
)

# Pie Chart
ggplot(df, aes(x = "", y = Jumlah, fill = Moda)) +
  geom_col(width = 1) +
  coord_polar(theta = "y") +
  theme_void() +
  labs(title = "Distribusi Moda Transportasi Mahasiswa")

12.4 Estimasi Parameter

Setelah model baseline-category logit ditentukan, langkah selanjutnya adalah mengestimasi parameter (koefisien regresi). Estimasi dilakukan dengan pendekatan Maximum Likelihood Estimation (MLE), seperti pada regresi logistik biner.


Rumus Fungsi Likelihood

Misalkan terdapat \(k\) kategori (dengan kategori ke-\(b\) sebagai baseline), maka probabilitas untuk setiap observasi ke-\(i\) adalah:

\[ P(Y_i = j) = \begin{cases} \frac{\exp(\eta_{ij})}{1 + \sum_{l \neq b} \exp(\eta_{il})}, & \text{j} \neq b \\ \frac{1}{1 + \sum_{l \neq b} \exp(\eta_{il})}, & \text{j} = b \end{cases} \]

di mana: \[ \eta_{ij} = \beta_{j0} + \beta_{j1}x_{i1} + \ldots + \beta_{jp}x_{ip} \]


Tujuan Estimasi

MLE digunakan untuk mencari nilai koefisien \(\beta\) yang memaksimalkan likelihood gabungan dari semua observasi:

\[ L(\beta) = \prod_{i=1}^{n} \prod_{j=1}^{k} \left[ P(Y_i = j) \right]^{y_{ij}} \]

atau log-likelihood:

\[ \ell(\beta) = \sum_{i=1}^{n} \sum_{j=1}^{k} y_{ij} \log(P(Y_i = j)) \]

dengan \(y_{ij} = 1\) jika observasi ke-\(i\) termasuk dalam kategori \(j\), dan 0 jika tidak.


Estimasi di R

Mari kita gunakan paket nnet::multinom() untuk melakukan estimasi parameter regresi logistik multinomial:

# Memuat data bawaan
library(nnet)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:MASS':
## 
##     select
## The following object is masked from 'package:randomForest':
## 
##     combine
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Gunakan data iris (kategori: Species)
data(iris)

# Kita hanya ambil dua prediktor agar sederhana
iris_mlr <- iris %>% select(Species, Sepal.Length, Petal.Length)

# Membuat model regresi logistik multinomial
model <- multinom(Species ~ Sepal.Length + Petal.Length, data = iris_mlr)
## # weights:  12 (6 variable)
## initial  value 164.791843 
## iter  10 value 18.981186
## iter  20 value 12.160261
## iter  30 value 11.971191
## iter  40 value 11.944095
## iter  50 value 11.937191
## iter  60 value 11.935067
## iter  70 value 11.932985
## iter  80 value 11.931635
## iter  90 value 11.930633
## final  value 11.930582 
## converged
# Melihat koefisien hasil estimasi
summary(model)
## Call:
## multinom(formula = Species ~ Sepal.Length + Petal.Length, data = iris_mlr)
## 
## Coefficients:
##            (Intercept) Sepal.Length Petal.Length
## versicolor    13.76541    -9.740989     14.10694
## virginica    -25.65809   -13.742448     27.31466
## 
## Std. Errors:
##            (Intercept) Sepal.Length Petal.Length
## versicolor    8.015896     11.84867     25.19824
## virginica     9.024190     12.01401     25.56996
## 
## Residual Deviance: 23.86116 
## AIC: 35.86116
z <- summary(model)$coefficients / summary(model)$standard.errors
p <- (1 - pnorm(abs(z), 0, 1)) * 2
p
##            (Intercept) Sepal.Length Petal.Length
## versicolor 0.085930836    0.4110106    0.5755897
## virginica  0.004465499    0.2526780    0.2854157

12.5 Nilai P-Value dan Interpretasi Koefisien

Tujuan

Setelah memperoleh estimasi parameter dari model multinomial logit, langkah berikutnya adalah mengevaluasi signifikansi statistik dari masing-masing prediktor melalui nilai p-value. Nilai ini membantu menentukan apakah koefisien dalam model berbeda secara signifikan dari nol (tidak berpengaruh).


Rumus Nilai z dan p-value

Untuk setiap koefisien \(\beta\), kita dapat menghitung nilai statistik z sebagai:

\[ z = \frac{\hat{\beta}}{SE(\hat{\beta})} \]

Kemudian, p-value diperoleh dari distribusi normal standar:

\[ p = 2 \times (1 - \Phi(|z|)) \]

di mana \(\Phi\) adalah fungsi distribusi kumulatif dari distribusi normal standar.


Implementasi di R

Kita lanjutkan dari model yang telah kita buat sebelumnya:

library(nnet)
library(dplyr)

# Model dari sebelumnya
model <- multinom(Species ~ Sepal.Length + Petal.Length, data = iris)
## # weights:  12 (6 variable)
## initial  value 164.791843 
## iter  10 value 18.981186
## iter  20 value 12.160261
## iter  30 value 11.971191
## iter  40 value 11.944095
## iter  50 value 11.937191
## iter  60 value 11.935067
## iter  70 value 11.932985
## iter  80 value 11.931635
## iter  90 value 11.930633
## final  value 11.930582 
## converged
# Menghitung z-value dan p-value secara manual
z_values <- summary(model)$coefficients / summary(model)$standard.errors
p_values <- 2 * (1 - pnorm(abs(z_values)))

# Menampilkan hasil
z_values
##            (Intercept) Sepal.Length Petal.Length
## versicolor    1.717265   -0.8221166    0.5598384
## virginica    -2.843257   -1.1438689    1.0682324
p_values
##            (Intercept) Sepal.Length Petal.Length
## versicolor 0.085930836    0.4110106    0.5755897
## virginica  0.004465499    0.2526780    0.2854157

Interpretasi:

  • p-value untuk Petal.Length < 0.05, maka kita simpulkan: “Variabel Petal.Length secara signifikan berpengaruh terhadap peluang suatu bunga menjadi versicolor atau virginica, dibandingkan dengan baseline (setosa).”
  • Koefisien positif menunjukkan kenaikan log-odds seiring meningkatnya nilai prediktor, sedangkan negatif menunjukkan penurunan.

Catatan : Nilai p-value < 0.05 umumnya dianggap signifikan, tetapi perlu disesuaikan dengan konteks dan kebutuhan pengujian, signifikansi statistik tidak selalu berarti penting secara praktis. Penting juga untuk melihat besar efek (magnitude of effect).

12.6 Prediksi dan Validasi

Tujuan

Setelah membangun dan mengevaluasi model regresi logistik multinomial, langkah penting berikutnya adalah menggunakan model tersebut untuk prediksi dan menilai akurasi prediksi (validasi model).


Fungsi Prediksi di R

Kita dapat menggunakan fungsi predict() dari model multinom() untuk: - Memprediksi kelas (kategori) dari observasi baru. - Menghasilkan probabilitas dari tiap kategori.

# Prediksi kelas
predicted_class <- predict(model, newdata = iris_mlr, type = "class")

# Prediksi probabilitas
predicted_prob <- predict(model, newdata = iris_mlr, type = "probs")
# Confusion Matrix
table(Predicted = predicted_class, Actual = iris_mlr$Species)
##             Actual
## Predicted    setosa versicolor virginica
##   setosa         50          0         0
##   versicolor      0         47         2
##   virginica       0          3        48
# Menghitung akurasi prediksi
accuracy <- mean(predicted_class == iris_mlr$Species)
accuracy
## [1] 0.9666667

Interpretasi:

  • Nilai akurasi menunjukkan proporsi observasi yang diprediksi dengan benar oleh model.
  • Visualisasi Probabilitas Prediksi Untuk memahami bagaimana model “yakin” dalam prediksi terhadap tiap kelas, kita dapat mem-plot probabilitas prediksi.
# Visualisasi probabilitas prediksi untuk 10 observasi pertama
head(predicted_prob, 10)
##       setosa   versicolor    virginica
## 1  0.9999999 9.552231e-08 1.062438e-25
## 2  0.9999993 6.701871e-07 1.659423e-24
## 3  0.9999989 1.147177e-06 1.687914e-24
## 4  0.9999490 5.104678e-05 1.572810e-21
## 5  0.9999997 2.530175e-07 4.198849e-25
## 6  0.9999996 3.539467e-07 6.231660e-24
## 7  0.9999875 1.245456e-05 1.024313e-22
## 8  0.9999990 1.037067e-06 6.447485e-24
## 9  0.9999126 8.737501e-05 1.599757e-21
## 10 0.9999973 2.746958e-06 2.548101e-23

Catatan - Akurasi bisa menyesatkan jika distribusi kategori tidak seimbang (misalnya, satu kelas mendominasi). - Alternatif lain: Precision, Recall, dan F1-score untuk evaluasi yang lebih menyeluruh. - Prediksi dilakukan dengan fungsi predict() baik untuk kelas maupun probabilitas. - Validasi dilakukan melalui confusion matrix dan akurasi prediksi. - Untuk validasi yang lebih kuat, gunakan k-fold cross-validation.

12.8 Contoh Kasus Tambahan: Regresi Logistik Multinomial di R

Studi Kasus 2: Prediksi Jenis Kendaraan Berdasarkan Karakteristik Pengguna

Deskripsi Data: Dataset hipotetik berikut berisi informasi tentang jenis kendaraan yang digunakan responden berdasarkan usia, pendapatan, dan status keluarga.

# Simulasi data
set.seed(123)
data_kendaraan <- data.frame(
  usia = round(runif(200, 20, 60)),
  pendapatan = round(rnorm(200, 50, 15), 1),
  status_keluarga = sample(c("Lajang", "Menikah"), 200, replace = TRUE),
  kendaraan = sample(c("Motor", "Mobil", "Sepeda"), 200, replace = TRUE)
)

# Lihat data awal
head(data_kendaraan)
##   usia pendapatan status_keluarga kendaraan
## 1   32       39.3         Menikah    Sepeda
## 2   52       53.9         Menikah     Motor
## 3   36       46.3         Menikah    Sepeda
## 4   55       44.8          Lajang     Motor
## 5   58       35.7          Lajang    Sepeda
## 6   22       49.3          Lajang    Sepeda
# Pastikan variabel kategorik dikonversi ke faktor
data_kendaraan$status_keluarga <- as.factor(data_kendaraan$status_keluarga)
data_kendaraan$kendaraan <- as.factor(data_kendaraan$kendaraan)
#Estimasi Model Multinomial Logistic Regression
library(nnet)
model_kendaraan <- multinom(kendaraan ~ usia + pendapatan + status_keluarga, data = data_kendaraan)
## # weights:  15 (8 variable)
## initial  value 219.722458 
## iter  10 value 216.262011
## final  value 216.259242 
## converged
summary(model_kendaraan)
## Call:
## multinom(formula = kendaraan ~ usia + pendapatan + status_keluarga, 
##     data = data_kendaraan)
## 
## Coefficients:
##        (Intercept)         usia  pendapatan status_keluargaMenikah
## Motor    1.1390751 -0.010513732 -0.01910397             0.35909335
## Sepeda   0.4230532  0.006228275 -0.00987453             0.05755651
## 
## Std. Errors:
##        (Intercept)       usia pendapatan status_keluargaMenikah
## Motor    0.9777055 0.01679100 0.01274113              0.3653544
## Sepeda   0.9308711 0.01561103 0.01179653              0.3410278
## 
## Residual Deviance: 432.5185 
## AIC: 448.5185

Interpretasi:

  • Output akan memberikan koefisien untuk masing-masing kategori dibandingkan terhadap baseline (misal, “Motor” secara default sebagai baseline):
  • Positifnya koefisien untuk “Mobil” atau “Sepeda” menunjukkan kecenderungan memilih kendaraan tersebut dibanding “Motor”, dengan asumsi variabel lain konstan.
  • P-value rendah menunjukkan signifikansi pengaruh prediktor terhadap pilihan kendaraan.

Evaluasi Model :

# Prediksi kelas
predicted_vehicle <- predict(model_kendaraan, newdata = data_kendaraan)

# Confusion matrix
table(Predicted = predicted_vehicle, Actual = data_kendaraan$kendaraan)
##          Actual
## Predicted Mobil Motor Sepeda
##    Mobil      9     4      9
##    Motor      7    11     10
##    Sepeda    47    45     58
# Akurasi model
mean(predicted_vehicle == data_kendaraan$kendaraan)
## [1] 0.39
# Visualisasi probabilitas (10 observasi pertama)
head(predict(model_kendaraan, type = "probs"), 10)
##        Mobil     Motor    Sepeda
## 1  0.2599337 0.3920421 0.3480242
## 2  0.3088670 0.2856197 0.4055133
## 3  0.2819995 0.3567607 0.3612398
## 4  0.3198889 0.2381583 0.4419528
## 5  0.2942610 0.2525815 0.4531575
## 6  0.3286736 0.3176698 0.3536566
## 7  0.3003037 0.2938398 0.4058565
## 8  0.2309154 0.3556161 0.4134685
## 9  0.3182515 0.2742484 0.4075001
## 10 0.3357996 0.2977719 0.3664286

Kesimpulan Kasus ini menunjukkan penerapan model regresi logistik multinomial untuk prediksi jenis kendaraan berdasarkan karakteristik sosial ekonomi. Analisis ini dapat diperluas dengan menambah interaksi antar variabel atau mengganti baseline sesuai kebutuhan analisis.

BAB 13: Regresi Logistik Ordinal

Regresi logistik ordinal adalah salah satu metode analisis regresi yang digunakan untuk memodelkan hubungan antara variabel dependen ordinal dengan satu atau lebih variabel independen. Variabel dependen ordinal adalah variabel kategori yang memiliki tingkatan atau urutan, namun jarak antar kategori tidak harus sama. Contoh variabel ordinal adalah tingkat kepuasan pelanggan (sangat tidak puas, tidak puas, netral, puas, sangat puas), tingkat pendidikan (SD, SMP, SMA, Sarjana), dan lain-lain.

Metode ini sangat berguna ketika data respons tidak bersifat nominal (tanpa urutan) atau kontinu, tapi dalam bentuk kelas yang terurut. Model regresi logistik ordinal memungkinkan kita mengestimasi probabilitas bahwa sebuah observasi jatuh pada kategori tertentu atau lebih rendah (cumulative probabilities) berdasarkan variabel prediktor.

13.1 Konsep Cumulative Logit Model

Model cumulative logit memodelkan log odds kumulatif dari kategori respons sebagai fungsi linear dari prediktor. Misalkan variabel respons \(Y\) memiliki \(J\) kategori berurutan \(\{1, 2, \ldots, J\}\). Model cumulative logit adalah:

\[ \log \left( \frac{P(Y \leq j)}{P(Y > j)} \right) = \alpha_j - \beta_1 x_1 - \beta_2 x_2 - \ldots - \beta_k x_k, \quad j = 1, 2, \ldots, J-1 \]

Dimana:

  • \(P(Y \leq j)\) adalah probabilitas bahwa respon berada pada kategori \(j\) atau lebih rendah,
  • \(\alpha_j\) adalah intercept (threshold) untuk kategori ke-\(j\),
  • \(\beta_i\) adalah koefisien regresi untuk variabel prediktor \(x_i\).

Model ini mengasumsikan proportional odds, yakni bahwa koefisien \(\beta_i\) sama untuk semua kategori \(j\).

13.2 Interpretasi Koefisien

Setelah model cumulative logit berhasil diestimasi, langkah penting berikutnya adalah menginterpretasikan koefisien regresi \(\beta_i\). Koefisien ini menggambarkan pengaruh variabel prediktor terhadap peluang kumulatif dari respons ordinal.

Recall model cumulative logit:

\[ \log \left( \frac{P(Y \leq j)}{P(Y > j)} \right) = \alpha_j - \beta_1 x_1 - \beta_2 x_2 - \cdots - \beta_k x_k \]

Interpretasi Koefisien \(\beta_i\)

  • Koefisien \(\beta_i\) menunjukkan perubahan log odds kumulatif untuk kenaikan satu satuan pada prediktor \(x_i\), dengan variabel lain dianggap tetap konstan.
  • Jika \(\beta_i > 0\), maka peningkatan \(x_i\) menurunkan peluang kumulatif \(P(Y \leq j)\) (karena tanda minus di depan \(\beta_i\)), yang berarti meningkatkan peluang respons berada di kategori yang lebih tinggi.
  • Jika \(\beta_i < 0\), maka peningkatan \(x_i\) meningkatkan peluang kumulatif \(P(Y \leq j)\), atau dengan kata lain, menggeser respons ke kategori yang lebih rendah.

Odds Ratio (OR)

Untuk memudahkan interpretasi, koefisien \(\beta_i\) sering diterjemahkan ke dalam odds ratio (OR):

\[ OR_i = e^{-\beta_i} \]

  • Jika \(OR_i > 1\), peningkatan satu unit pada \(x_i\) meningkatkan peluang berada di kategori yang lebih tinggi.
  • Jika \(OR_i < 1\), peningkatan satu unit pada \(x_i\) menurunkan peluang berada di kategori yang lebih tinggi.

Contoh Interpretasi

Misalkan kita memiliki koefisien \(\beta_1 = 0.5\) untuk variabel \(x_1\), maka:
\[ OR_1 = e^{-0.5} \approx 0.61 < 1 \]

Artinya, kenaikan satu unit pada \(x_1\) akan meningkatkan peluang kumulatif \(P(Y \leq j)\), atau kemungkinan respons berada di kategori yang lebih rendah meningkat.


Pada bagian selanjutnya, kita akan melihat contoh implementasi regresi logistik ordinal di R beserta interpretasi koefisiennya.

13.3 Contoh Data: Kepuasan Pelanggan

Untuk mengilustrasikan regresi logistik ordinal, kita gunakan contoh data fiktif mengenai tingkat kepuasan pelanggan terhadap sebuah layanan. Variabel dependen adalah kepuasan yang berordo (ordinal) dengan kategori:

  • 1 = Tidak Puas
  • 2 = Cukup Puas
  • 3 = Puas
  • 4 = Sangat Puas

Variabel prediktor yang digunakan adalah:
- Usia (dalam tahun)
- Pendapatan (dalam juta rupiah per bulan)
- Frekuensi (frekuensi menggunakan layanan dalam sebulan)

Berikut contoh sebagian data (dalam format tabel):

ID Kepuasan Usia Pendapatan Frekuensi
1 3 25 4.5 8
2 2 40 3.2 4
3 4 35 5.0 10

Data ini akan kita gunakan untuk membangun model cumulative logit dan menginterpretasi hasilnya.


Selanjutnya, kita akan membahas bagaimana melakukan estimasi model regresi logistik ordinal dengan menggunakan perangkat lunak R.

13.4 Estimasi ModelRegresi Logistik Ordinal

Untuk mengestimasi model regresi logistik ordinal, paket R yang umum digunakan adalah MASS dengan fungsi polr() (Proportional Odds Logistic Regression). Fungsi ini mengasumsikan model cumulative logit dengan asumsi paralel (proportional odds).

Contoh Kode Estimasi Model di R

# Memuat paket yang dibutuhkan
library(MASS)

# Contoh data fiktif
data <- data.frame(
  Kepuasan = factor(c(3, 2, 4, 1, 3, 4, 2, 1, 3, 4),
                    levels = c(1, 2, 3, 4), ordered = TRUE),
  Usia = c(25, 40, 35, 30, 28, 45, 50, 33, 29, 42),
  Pendapatan = c(4.5, 3.2, 5.0, 2.8, 4.0, 5.5, 3.0, 2.5, 4.2, 5.1),
  Frekuensi = c(8, 4, 10, 3, 7, 11, 5, 2, 7, 9)
)

# Estimasi model cumulative logit
model_ordinal <- polr(Kepuasan ~ Usia + Pendapatan + Frekuensi, data = data, Hess = TRUE)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# Ringkasan hasil model
summary(model_ordinal)
## Call:
## polr(formula = Kepuasan ~ Usia + Pendapatan + Frekuensi, data = data, 
##     Hess = TRUE)
## 
## Coefficients:
##               Value Std. Error  t value
## Usia         0.1862      2.192  0.08494
## Pendapatan -17.1577    451.552 -0.03800
## Frekuensi   20.4525    258.619  0.07908
## 
## Intercepts:
##     Value    Std. Error t value 
## 1|2  25.7338 492.7411     0.0522
## 2|3  67.5337 173.0703     0.3902
## 3|4  97.8825 236.2204     0.4144
## 
## Residual Deviance: 0.00913657 
## AIC: 12.00914

Interpretasi Output :

  • Coefficients (koefisien regresi): Menunjukkan pengaruh masing-masing prediktor terhadap log odds kumulatif.
  • Intercepts (thresholds): Titik cut-off antara kategori ordinal.
  • Standard errors dan t-values: Untuk uji signifikansi.
  • Koefisien negatif atau positif mengindikasikan arah hubungan antara variabel prediktor dengan peluang kategori kepuasan yang lebih tinggi, sesuai penjelasan pada bagian sebelumnya.

13.5 Nilai P-Value

Fungsi polr() dari paket MASS secara default tidak memberikan nilai p-value untuk koefisien regresi. Namun, p-value penting untuk menguji signifikansi setiap prediktor dalam model.

Cara Menghitung P-Value

Nilai p-value dapat dihitung secara manual menggunakan statistik z, yang diperoleh dari koefisien dibagi dengan standar error, lalu menggunakan distribusi normal standar.

Rumus untuk menghitung nilai p-value dua sisi:

\[ p = 2 \times \left(1 - \Phi(|z|)\right) \]

di mana \(\Phi\) adalah fungsi distribusi kumulatif standar normal, dan

\[ z = \frac{\hat{\beta}}{SE(\hat{\beta})} \]

Contoh Perhitungan P-Value di R

# Menghitung p-value dari model yang sudah dibuat
coef_table <- coef(summary(model_ordinal))
p_values <- 2 * (1 - pnorm(abs(coef_table[, "t value"])))
coef_table <- cbind(coef_table, "p value" = p_values)

print(coef_table)
##                  Value Std. Error     t value   p value
## Usia         0.1861811   2.191965  0.08493800 0.9323107
## Pendapatan -17.1576935 451.552376 -0.03799713 0.9696900
## Frekuensi   20.4524995 258.618588  0.07908364 0.9369661
## 1|2         25.7338309 492.741137  0.05222586 0.9583487
## 2|3         67.5336699 173.070327  0.39020941 0.6963817
## 3|4         97.8824704 236.220399  0.41436925 0.6786037

Interpretasi :

  • Jika p-value < 0.05, variabel tersebut berpengaruh signifikan terhadap tingkat kepuasan pelanggan.
  • Jika p-value 0.05, variabel tersebut tidak signifikan.

13.6 Prediksi Probabilitas

Setelah model regresi logistik ordinal diestimasi, kita dapat menggunakan model tersebut untuk memprediksi probabilitas setiap kategori ordinal untuk observasi baru atau data yang sudah ada.

Fungsi Prediksi di R

Fungsi predict() pada objek polr dapat digunakan dengan argumen type = "prob" untuk menghasilkan probabilitas prediksi untuk setiap kategori.

Contoh Prediksi Probabilitas

# Prediksi probabilitas kategori kepuasan untuk data yang sama
pred_prob <- predict(model_ordinal, newdata = data, type = "prob")

# Menampilkan probabilitas prediksi
print(pred_prob)
##               1            2            3            4
## 1  4.237164e-29 6.032741e-11 9.989068e-01 1.093185e-03
## 2  1.806454e-04 9.998194e-01 3.996803e-15 0.000000e+00
## 3  6.017710e-44 8.567826e-26 1.297739e-12 1.000000e+00
## 4  9.989229e-01 1.077063e-03 0.000000e+00 0.000000e+00
## 5  3.476681e-24 4.949965e-06 9.999950e-01 1.333764e-08
## 6  6.519208e-50 9.281845e-32 1.405889e-18 1.000000e+00
## 7  1.190213e-15 9.994102e-01 5.897658e-04 0.000000e+00
## 8  1.000000e+00 4.249339e-10 0.000000e+00 0.000000e+00
## 9  8.924948e-23 1.270545e-04 9.998729e-01 5.195631e-10
## 10 6.934034e-35 9.872460e-17 1.493114e-03 9.985069e-01

Interpretasi :

  • Setiap baris menunjukkan probabilitas prediksi untuk setiap kategori kepuasan (misal: 1, 2, 3, 4) dari masing-masing observasi.
  • Probabilitas ini menggambarkan kemungkinan responden masuk ke dalam kategori kepuasan tertentu berdasarkan nilai variabel prediktor mereka.

13.7 Goodness-of-Fit dan Proportional Odds

Goodness-of-Fit

Goodness-of-Fit mengukur seberapa baik model regresi logistik ordinal cocok dengan data yang diamati. Salah satu metode yang sering digunakan adalah uji deviance (likelihood ratio test) dan statistik Pearson chi-square.

Rumus deviance:

\[ D = -2 \times \left( \log L(\hat{\theta}) - \log L(\text{saturated}) \right) \]

di mana \(\log L(\hat{\theta})\) adalah log-likelihood model yang diestimasi, dan \(\log L(\text{saturated})\) adalah log-likelihood model sempurna.

Nilai deviance yang kecil menunjukkan model yang baik.

Asumsi Proportional Odds (Paralelisme)

Model cumulative logit mengasumsikan bahwa koefisien prediktor adalah sama di setiap level kategori (paralel), artinya efek variabel prediktor tidak berubah antar kategori.

Jika asumsi ini dilanggar, model tidak sesuai dan interpretasi koefisien menjadi tidak valid.

Uji Asumsi Paralelisme di R

Paket VGAM menyediakan fungsi vglm() untuk model ordinal dengan lebih fleksibel, dan fungsi nominal_test() dari paket ordinal untuk menguji asumsi ini.

13.8 Alternatif Model Ordinal

Jika asumsi paralelisme pada model regresi logistik ordinal tidak terpenuhi, ada beberapa alternatif model yang dapat digunakan:

  1. Partial Proportional Odds Model
    Model ini mengizinkan beberapa prediktor memiliki koefisien berbeda antar kategori, sedangkan yang lain tetap konstan. Pendekatan ini lebih fleksibel dan bisa mengatasi pelanggaran asumsi paralelisme.

  2. Adjacent Categories Logit Model
    Model ini membandingkan log-odds dari kategori yang berdekatan, bukan kumulatif.

  3. Continuation Ratio Model
    Model ini membangun log-odds berdasarkan rasio kategori yang berurutan.

  4. Multinomial Logistic Regression
    Jika tidak ada struktur ordinal yang kuat, model multinomial bisa dipakai tanpa asumsi urutan kategori.

Kesimpulan :

_ Regresi logistik ordinal cocok untuk variabel respon yang bersifat ordinal dengan urutan kategori. - Model cumulative logit mengasumsikan efek konstan (paralel) antar kategori. - Interpretasi koefisien menunjukkan perubahan log-odds kumulatif respon. - Penting menguji signifikansi koefisien dengan p-value, prediksi probabilitas untuk observasi baru, dan mengevaluasi goodness-of-fit. - Uji asumsi paralelisme harus dilakukan; bila tidak terpenuhi, alternatif model seperti partial proportional odds dapat dipilih. - Pemilihan model yang tepat dan evaluasi menyeluruh meningkatkan kualitas analisis dan keputusan berbasis data.

BAB 14: Log Linear Model

Model Log Linear adalah sebuah model statistik yang digunakan untuk menganalisis hubungan antara dua atau lebih variabel kategori (nominal atau ordinal) yang disajikan dalam bentuk tabel kontingensi (contingency table).

Model ini menghubungkan logaritma dari frekuensi harapan dalam setiap sel tabel kontingensi dengan kombinasi efek utama dan interaksi dari variabel-variabel kategori tersebut. Dengan kata lain, model ini memodelkan bagaimana variabel kategori saling berhubungan dan apakah ada pola interaksi yang signifikan di antara mereka.

Model ini sangat penting untuk memahami struktur data kategorikal multi-dimensi dan dapat dipakai untuk:

Mengapa Menggunakan Log Linear Model?

  • Data kategori sering muncul dalam bentuk tabel kontingensi yang menyajikan frekuensi pengamatan per kombinasi kategori.
  • Model log linear menggunakan distribusi Poisson untuk memodelkan frekuensi ini.
  • Model ini fleksibel karena dapat memasukkan berbagai tingkat interaksi antar variabel (efek utama, interaksi dua variabel, interaksi tiga variabel, dan seterusnya).
  • Memberikan kerangka kerja untuk pengujian hipotesis tentang independensi dan interaksi antar variabel.

Struktur Model Log Linear

Misalkan kita memiliki \(k\) variabel kategori, dengan variabel ke-\(j\) memiliki \(I_j\) kategori.

Tabel kontingensi \(k\)-dimensional memiliki sel-sel yang diindeks oleh \(\mathbf{i} = (i_1, i_2, ..., i_k)\) di mana \(i_j = 1, 2, ..., I_j\).

Misalkan \(n_{\mathbf{i}}\) adalah frekuensi observasi pada sel \(\mathbf{i}\), dan \(\mu_{\mathbf{i}} = E(n_{\mathbf{i}})\) adalah frekuensi harapan.

Model log linear menyatakan bahwa:

\[ \log(\mu_{\mathbf{i}}) = \lambda + \sum_{j=1}^k \lambda_j(i_j) + \sum_{j<l} \lambda_{jl}(i_j, i_l) + \sum_{j<l<m} \lambda_{jlm}(i_j, i_l, i_m) + \cdots \]

Dimana:

  • \(\lambda\) adalah parameter intercept (konstanta),
  • \(\lambda_j(i_j)\) adalah efek utama variabel ke-\(j\),
  • \(\lambda_{jl}(i_j, i_l)\) adalah efek interaksi dua variabel,
  • \(\lambda_{jlm}(i_j, i_l, i_m)\) adalah efek interaksi tiga variabel, dan seterusnya.

Interpretasi Parameter

  • Efek utama \(\lambda_j(i_j)\) menggambarkan kontribusi variabel kategori ke-\(j\) pada log frekuensi harapan.
  • Efek interaksi \(\lambda_{jl}(i_j, i_l)\) menggambarkan bagaimana dua variabel kategori berinteraksi dalam mempengaruhi frekuensi.
  • Jika tidak ada interaksi, model menjadi model independen di mana variabel tidak saling memengaruhi.
  • Model dengan semua efek interaksi hingga tingkat maksimal disebut model saturated (model jenuh) yang secara sempurna menggambarkan data.

Asumsi Model

  • Data berupa frekuensi dari tabel kontingensi.
  • Observasi dalam setiap sel independen.
  • Frekuensi data mengikuti distribusi Poisson.

14.1 Tabel Kontingensi dan Model Loglinier

Pendahuluan

Tabel kontingensi merupakan tabel yang digunakan untuk menyajikan data kategorikal yang dikumpulkan berdasarkan dua atau lebih variabel kategori. Biasanya, tabel ini menampilkan frekuensi kejadian kombinasi kategori variabel tersebut.

Model loglinier adalah model statistik yang digunakan untuk menganalisis tabel kontingensi dengan tujuan untuk memahami hubungan antar variabel kategorikal. Model ini menghubungkan logaritma dari frekuensi harapan (expected frequencies) dalam tabel kontingensi dengan efek utama dan interaksi antar variabel kategori.

Definisi dan Notasi

Misalkan terdapat \(k\) variabel kategori dengan masing-masing variabel memiliki \(I_1, I_2, \ldots, I_k\) kategori. Maka tabel kontingensi yang terbentuk adalah tabel \(k\)-dimensi dengan jumlah sel sebanyak \(I_1 \times I_2 \times \cdots \times I_k\).

Setiap sel tabel ditandai dengan indeks \(\mathbf{i} = (i_1, i_2, \ldots, i_k)\) dimana \(i_j = 1, 2, \ldots, I_j\).

Misalkan \(n_{\mathbf{i}}\) adalah frekuensi observasi pada sel \(\mathbf{i}\), dan \(\mu_{\mathbf{i}} = E(n_{\mathbf{i}})\) adalah frekuensi harapan pada sel tersebut.

Model Loglinier Umum

Model loglinier menyatakan bahwa logaritma dari frekuensi harapan adalah kombinasi linier dari efek-efek utama dan interaksi variabel, yakni:

\[ \log(\mu_{\mathbf{i}}) = \lambda + \sum_{j=1}^k \lambda_j(i_j) + \sum_{j<l} \lambda_{jl}(i_j, i_l) + \sum_{j<l<m} \lambda_{jlm}(i_j, i_l, i_m) + \cdots \]

dimana:

  • \(\lambda\) adalah parameter intercept (konstanta),
  • \(\lambda_j(i_j)\) adalah efek utama variabel ke-\(j\),
  • \(\lambda_{jl}(i_j, i_l)\) adalah efek interaksi dua variabel \(j\) dan \(l\),
  • \(\lambda_{jlm}(i_j, i_l, i_m)\) adalah efek interaksi tiga variabel, dan seterusnya.

Model ini fleksibel dan dapat disesuaikan dengan memasukkan atau menghilangkan efek-efek tertentu sesuai hipotesis penelitian.

Asumsi Model Loglinier

  • Data adalah frekuensi jumlah kejadian dalam setiap sel tabel kontingensi.
  • Observasi independen.
  • Model menggunakan distribusi Poisson untuk frekuensi observasi. ### Tabel Kontingensi

Tabel kontingensi adalah tabel yang menyajikan frekuensi pengamatan untuk dua atau lebih variabel kategori secara bersamaan. Contoh paling sederhana adalah tabel dua arah (2-way contingency table) yang menampilkan frekuensi berdasarkan dua variabel kategori.

B=1 B=2 B=3
A=1 20 15 30
A=2 25 10 20

Tabel di atas adalah tabel kontingensi dua arah dengan variabel A dan B.

Model Log Linear

Model log linear memodelkan hubungan antara variabel kategori dengan memodelkan logaritma nilai harapan frekuensi sel pada tabel kontingensi sebagai fungsi linear dari efek variabel dan interaksi variabel.

Rumus umum model log linear untuk \(k\) variabel:

\[ \log(\mu_{i_1 i_2 \dots i_k}) = \lambda + \sum_j \lambda_j(i_j) + \sum_{j<l} \lambda_{jl}(i_j, i_l) + \sum_{j<l<m} \lambda_{jlm}(i_j, i_l, i_m) + \cdots \]

  • \(\mu_{i_1 i_2 \dots i_k}\): nilai harapan frekuensi pada sel kombinasi kategori
  • \(\lambda\): intercept
  • \(\lambda_j(i_j)\): efek utama variabel \(j\)
  • \(\lambda_{jl}(i_j, i_l)\): interaksi dua variabel, dan seterusnya

Model ini mengasumsikan bahwa frekuensi sel mengikuti distribusi Poisson.

Contoh Model untuk Dua Variabel

  • Model Independen (tanpa interaksi):

\[ \log(\mu_{ij}) = \lambda + \lambda_A(i) + \lambda_B(j) \]

  • Model dengan Interaksi:

\[ \log(\mu_{ij}) = \lambda + \lambda_A(i) + \lambda_B(j) + \lambda_{AB}(i,j) \]

Model Loglinier vs Regresi Logistik

  • Model Log Linear fokus pada memodelkan frekuensi sel pada tabel kontingensi dan digunakan untuk menganalisis hubungan antar variabel kategori secara keseluruhan.

  • Regresi Logistik (misalnya multinomial logistic regression) memodelkan probabilitas dari kategori respon sebagai fungsi dari variabel prediktor. Regresi logistik digunakan jika ada satu variabel dependen kategori yang diprediksi oleh variabel bebas.

Rumus regresi logistik multinomial:

\[ \log \frac{P(Y = j)}{P(Y = baseline)} = \beta_{0j} + \beta_{1j}X_1 + \cdots + \beta_{pj}X_p \]

Sedangkan model log linear fokus ke sel frekuensi, regresi logistik fokus ke probabilitas outcome kategori.


Contoh Perhitungan Model Log Linear di R

# Contoh data 2x3
data <- array(c(20, 15, 30, 25, 10, 20), dim = c(2, 3),
              dimnames = list(A = c("1", "2"),
                              B = c("1", "2", "3")))

# Melihat data
print(data)
##    B
## A    1  2  3
##   1 20 30 10
##   2 15 25 20
# Uji independensi variabel A dan B (chi-square)
chisq.test(data)
## 
##  Pearson's Chi-squared test
## 
## data:  data
## X-squared = 4.5022, df = 2, p-value = 0.1053
# Model log linear: interaksi A dan B
model_loglin <- loglin(data, margin = list(c(1, 2)), fit = TRUE)
## 2 iterations: deviation 0
print(model_loglin)
## $lrt
## [1] 0
## 
## $pearson
## [1] 0
## 
## $df
## [1] 0
## 
## $margin
## $margin[[1]]
## [1] "A" "B"
## 
## 
## $fit
##    B
## A    1  2  3
##   1 20 30 10
##   2 15 25 20
# Model tanpa interaksi (independen)
model_indep <- loglin(data, margin = list(c(1), c(2)), fit = TRUE)
## 2 iterations: deviation 0
print(model_indep)
## $lrt
## [1] 4.56989
## 
## $pearson
## [1] 4.502165
## 
## $df
## [1] 2
## 
## $margin
## $margin[[1]]
## [1] "A"
## 
## $margin[[2]]
## [1] "B"
## 
## 
## $fit
##    B
## A      1    2  3
##   1 17.5 27.5 15
##   2 17.5 27.5 15

Perbandingan Pendekatan Umum pada Analisis Data Kategori:

Tabel Kontingensi, Model Log Linear, dan Regresi Logistik

1. Tabel Kontingensi

  • Deskripsi:
    Tabel frekuensi yang menampilkan jumlah pengamatan pada setiap kombinasi kategori dari dua atau lebih variabel kategori.

  • Tujuan:
    Mengamati hubungan sederhana antar variabel kategori.

  • Kelebihan:
    Mudah dibuat dan dianalisis, cocok untuk eksplorasi awal.

  • Kekurangan:
    Hanya cocok untuk analisis sederhana, sulit mengontrol variabel lain.


2. Model Log Linear

  • Deskripsi:
    Model yang memodelkan logaritma nilai harapan frekuensi sel dalam tabel kontingensi sebagai fungsi linear dari efek variabel dan interaksinya.

  • Rumus umum:

\[ \log(\mu_{i_1 i_2 \dots i_k}) = \lambda + \sum_j \lambda_j(i_j) + \sum_{j<l} \lambda_{jl}(i_j, i_l) + \cdots \]

  • Distribusi:
    Mengasumsikan frekuensi sel mengikuti distribusi Poisson.

  • Tujuan:
    Menganalisis asosiasi dan interaksi antar variabel kategori secara simultan.

  • Kelebihan:
    Memungkinkan model yang kompleks dengan interaksi banyak variabel.

  • Kekurangan:
    Interpretasi parameter agak rumit, fokus pada frekuensi, bukan probabilitas outcome.


3. Regresi Logistik

  • Deskripsi:
    Model regresi yang memodelkan probabilitas outcome kategori sebagai fungsi variabel prediktor.

  • Rumus multinomial logistik:

\[ \log \frac{P(Y = j)}{P(Y = baseline)} = \beta_{0j} + \beta_{1j}X_1 + \cdots + \beta_{pj}X_p \]

  • Distribusi:
    Mengasumsikan outcome kategori mengikuti distribusi multinomial.

  • Tujuan:
    Mengestimasi pengaruh variabel bebas terhadap probabilitas kategori outcome.

  • Kelebihan:
    Parameter mudah diinterpretasikan sebagai pengaruh variabel prediktor.

  • Kekurangan:
    Tidak memodelkan frekuensi secara keseluruhan, fokus pada outcome.


Contoh Perbandingan Sederhana di R

# Data contoh 2x2
data <- matrix(c(30, 20, 10, 40), nrow=2, byrow=TRUE,
               dimnames=list(A=c("Yes","No"), B=c("High","Low")))

# 1. Tabel kontingensi: hanya frekuensi
print(data)
##      B
## A     High Low
##   Yes   30  20
##   No    10  40
# 2. Model Log Linear: uji interaksi A dan B
loglin_model <- loglin(data, margin=list(c(1), c(2)), fit=TRUE)
## 2 iterations: deviation 0
print(loglin_model)
## $lrt
## [1] 17.26092
## 
## $pearson
## [1] 16.66667
## 
## $df
## [1] 1
## 
## $margin
## $margin[[1]]
## [1] "A"
## 
## $margin[[2]]
## [1] "B"
## 
## 
## $fit
##      B
## A     High Low
##   Yes   20  30
##   No    20  30
# 3. Regresi logistik (mengubah data ke bentuk data frame)
library(dplyr)
df <- data.frame(
  A = factor(rep(c("Yes","No"), each=2)),
  B = factor(rep(c("High","Low"), times=2)),
  count = as.vector(data)
)

# Replikasi data sesuai count
df_expanded <- df %>% tidyr::uncount(count)

# Fit regresi logistik dengan A sebagai outcome dan B sebagai predictor
model_logit <- glm(A ~ B, family=binomial, data=df_expanded)
summary(model_logit)
## 
## Call:
## glm(formula = A ~ B, family = binomial, data = df_expanded)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   0.4055     0.2887   1.405     0.16    
## BLow         -1.7918     0.4564  -3.926 8.65e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 134.60  on 99  degrees of freedom
## Residual deviance: 117.34  on 98  degrees of freedom
## AIC: 121.34
## 
## Number of Fisher Scoring iterations: 4

Estimasi Parameter dan Uji Model

Estimasi parameter model log linier biasanya dilakukan dengan metode maksimum likelihood (ML) menggunakan iterative fitting seperti algoritma iteratively reweighted least squares (IRLS).

Uji signifikansi model dan efek interaksi dapat dilakukan dengan:

  • Likelihood Ratio Test (LRT)
  • Pearson Chi-Square Test
  • Deviance

Contoh Perhitungan Model Log Linier di R

# Data contoh 2x2
data <- matrix(c(30, 20, 10, 40), nrow=2, byrow=TRUE,
               dimnames=list(A=c("Yes","No"), B=c("High","Low")))

# Model log linier dengan interaksi (saturated model)
loglin_model <- loglin(data, margin=list(c(1), c(2), c(1,2)), fit=TRUE)
## 2 iterations: deviation 0
print(loglin_model)
## $lrt
## [1] 0
## 
## $pearson
## [1] 0
## 
## $df
## [1] 0
## 
## $margin
## $margin[[1]]
## [1] "A"
## 
## $margin[[2]]
## [1] "B"
## 
## $margin[[3]]
## [1] "A" "B"
## 
## 
## $fit
##      B
## A     High Low
##   Yes   30  20
##   No    10  40
# Model tanpa interaksi (independence model)
loglin_model_ind <- loglin(data, margin=list(c(1), c(2)), fit=TRUE)
## 2 iterations: deviation 0
print(loglin_model_ind)
## $lrt
## [1] 17.26092
## 
## $pearson
## [1] 16.66667
## 
## $df
## [1] 1
## 
## $margin
## $margin[[1]]
## [1] "A"
## 
## $margin[[2]]
## [1] "B"
## 
## 
## $fit
##      B
## A     High Low
##   Yes   20  30
##   No    20  30
# Perbandingan goodness-of-fit dengan Likelihood Ratio Test
deviance_diff <- loglin_model_ind$deviance - loglin_model$deviance
df_diff <- loglin_model_ind$df - loglin_model$df
p_value <- pchisq(deviance_diff, df_diff, lower.tail=FALSE)

cat("Likelihood Ratio Test Statistic:", deviance_diff, "\n")
## Likelihood Ratio Test Statistic:
cat("Degrees of Freedom:", df_diff, "\n")
## Degrees of Freedom: 1
cat("P-value:", p_value, "\n")
## P-value:

Interpretasi Model saturasi (dengan interaksi) selalu fit sempurna karena memasukkan semua efek dan interaksi.

Model independensi mengasumsikan tidak ada asosiasi antara variabel A dan B.

Jika nilai p-value uji Likelihood Ratio Test kecil (<0.05), maka model tanpa interaksi tidak cocok, artinya ada interaksi antara variabel kategori.

14.2 Model Saturated

Pengertian Model Saturated

Model saturated adalah model loglinear yang memasukkan semua parameter interaksi hingga tingkat tertinggi antara variabel dalam tabel kontingensi. Artinya, model ini merepresentasikan data dengan sempurna tanpa ada residual (selisih antara data observasi dan prediksi model), sehingga nilai deviance atau chi-square goodness-of-fit-nya adalah nol.

Model saturated memberikan estimasi yang paling fleksibel karena mencakup semua efek utama dan interaksi. Oleh karena itu, model ini sering digunakan sebagai model referensi (full model) untuk menguji model-model yang lebih sederhana.


Notasi dan Rumus Model Saturated

Misalkan ada tabel kontingensi dengan \(k\) variabel kategorikal, masing-masing dengan \(I_1, I_2, ..., I_k\) kategori. Jumlah pengamatan di setiap sel diberi label \(n_{i_1 i_2 \dots i_k}\).

Model saturated loglinear dapat dituliskan sebagai:

\[ \log(m_{i_1 i_2 \dots i_k}) = \lambda + \sum_{r=1}^k \lambda_r(i_r) + \sum_{r<s} \lambda_{rs}(i_r, i_s) + \cdots + \lambda_{1,2,\dots,k}(i_1, i_2, \dots, i_k) \]

di mana:
- \(m_{i_1 i_2 \dots i_k}\) adalah expected count pada sel \((i_1, i_2, \dots, i_k)\),
- \(\lambda\) adalah parameter intercept (overall mean),
- \(\lambda_r(i_r)\) adalah parameter efek utama variabel ke-\(r\),
- \(\lambda_{rs}(i_r, i_s)\) adalah parameter interaksi dua variabel,
- dan seterusnya sampai interaksi tertinggi semua variabel.


Parameter Identifikasi dan Pembatasan

Karena jumlah parameter bisa sangat banyak, diperlukan pembatasan agar model dapat diestimasi dengan baik. Salah satu pembatasan umum adalah:

\[ \sum_{i_r} \lambda_r(i_r) = 0, \quad \sum_{i_r} \lambda_{rs}(i_r, i_s) = 0, \quad \text{dan seterusnya} \]

Pembatasan ini disebut “sum-to-zero constraints” dan mencegah parameter menjadi tidak teridentifikasi (tidak unik).


Estimasi Parameter dengan Maximum Likelihood

Estimasi parameter model saturated dilakukan menggunakan Maximum Likelihood Estimation (MLE). Model ini mengasumsikan bahwa pengamatan di setiap sel mengikuti distribusi multinomial (atau Poisson untuk data frekuensi) dan likelihood dibentuk berdasarkan probabilitas masing-masing sel.

Karena model saturated memiliki parameter sebanyak jumlah sel dikurangi satu, maka model ini selalu fit dengan data (deviasi = 0).


Kelebihan dan Kekurangan Model Saturated

Kelebihan:
- Model ini memberikan fit sempurna ke data observasi.
- Berguna sebagai model pembanding (full model) untuk uji signifikansi model lain.

Kekurangan:
- Parameter yang sangat banyak, sehingga sulit diinterpretasi.
- Cenderung overfitting, sehingga kurang cocok untuk prediksi atau generalisasi.


Uji Signifikansi Interaksi Menggunakan Model Saturated

Model saturated digunakan sebagai model lengkap dalam uji likelihood ratio test (LRT). Misalnya, untuk menguji apakah interaksi antara dua variabel signifikan, kita bandingkan model saturated dengan model yang menghilangkan interaksi tersebut:

\[ G^2 = 2 \sum n_{i_1 i_2 \dots i_k} \log \frac{n_{i_1 i_2 \dots i_k}}{\hat{m}_{i_1 i_2 \dots i_k}} \]

dengan \(\hat{m}\) adalah expected count dari model yang lebih sederhana.


Visualisasi Hubungan Model Saturated dengan Model Lain

Model Interaksi Yang Termasuk Keterangan
Model Saturated Semua interaksi hingga tingkat tertinggi Fit sempurna, overfit
Model Independen Hanya efek utama variabel Asumsi variabel independen
Model Parsimonious Subset interaksi yang signifikan Model yang lebih sederhana

Contoh Perhitungan Model Saturated di R

# Data contoh: Tabel 2x2x2
data <- array(c(20, 15, 25, 10, 30, 5, 15, 20), dim = c(2, 2, 2),
              dimnames = list(A = c("1", "2"), B = c("1", "2"), C = c("1", "2")))

# Fit model saturated menggunakan fungsi loglin
model_sat <- loglin(data, margin = list(1,2,3), fit = TRUE)
## 2 iterations: deviation 0
# Lihat hasil expected counts (fit sempurna)
model_sat$fit
## , , C = 1
## 
##    B
## A      1    2
##   1 22.5 22.5
##   2 12.5 12.5
## 
## , , C = 2
## 
##    B
## A      1    2
##   1 22.5 22.5
##   2 12.5 12.5
# Deviance model saturated (harus nol)
model_sat$lrt
## [1] 16.29769

Kesimpulan Model saturated merupakan model paling kompleks yang memuat semua interaksi antara variabel dalam tabel kontingensi. Meski fit-nya sempurna, model ini sering tidak praktis karena kompleksitasnya. Model ini sangat penting sebagai acuan dalam pengujian model yang lebih sederhana menggunakan uji likelihood ratio.

14.3 Model Independent

Pengertian Model Independent

Model Independent adalah model loglinear paling sederhana yang hanya memasukkan efek utama dari setiap variabel tanpa memasukkan interaksi antar variabel. Model ini mengasumsikan bahwa semua variabel dalam tabel kontingensi bersifat independen satu sama lain.

Model ini cocok jika kita ingin mengetahui apakah variabel-variabel tersebut benar-benar tidak saling memengaruhi, atau hanya memiliki efek individual.


Notasi dan Rumus Model Independent

Misalkan tabel kontingensi dengan \(k\) variabel kategorikal seperti sebelumnya. Model independent dapat ditulis sebagai:

\[ \log(m_{i_1 i_2 \dots i_k}) = \lambda + \sum_{r=1}^k \lambda_r(i_r) \]

di mana:
- \(m_{i_1 i_2 \dots i_k}\) adalah expected count pada sel \((i_1, i_2, \dots, i_k)\),
- \(\lambda\) adalah parameter intercept,
- \(\lambda_r(i_r)\) adalah parameter efek utama variabel ke-\(r\).

Tidak ada istilah interaksi dalam model ini, yang berarti variabel-variabel dianggap berdiri sendiri.


Interpretasi

  • Efek utama variabel menunjukkan pengaruh individual variabel terhadap frekuensi.
  • Karena tidak ada interaksi, model ini mengasumsikan variabel tidak berasosiasi satu sama lain.
  • Jika model ini fit dengan baik, maka data tidak menunjukkan asosiasi antar variabel.

Estimasi Parameter

Parameter diestimasi dengan metode Maximum Likelihood Estimation (MLE). Expected counts \(\hat{m}_{i_1 i_2 \dots i_k}\) dapat dihitung dari marginal totals tabel kontingensi.

Misalnya untuk 2 variabel \(A\) dan \(B\):

\[ \hat{m}_{ij} = \frac{n_{i+} \times n_{+j}}{n_{++}} \]

di mana:
- \(n_{i+}\) adalah total baris \(i\) (marginal total untuk variabel \(A\)),
- \(n_{+j}\) adalah total kolom \(j\) (marginal total untuk variabel \(B\)),
- \(n_{++}\) adalah total keseluruhan.


Kelebihan dan Kekurangan

Kelebihan:
- Model paling sederhana dan mudah diinterpretasi.
- Menghemat jumlah parameter.

Kekurangan:
- Sering tidak sesuai dengan data nyata karena asumsi independensi yang kuat.
- Tidak bisa menangkap interaksi antar variabel.


Uji Kecocokan Model Independent

Model independent biasanya diuji dengan goodness-of-fit test (Chi-square atau deviance) terhadap model saturated.


Contoh Perhitungan Model Independent di R

# Data contoh: tabel 2x2x2
data <- array(c(20, 15, 25, 10, 30, 5, 15, 20), dim = c(2, 2, 2),
              dimnames = list(A = c("1", "2"), B = c("1", "2"), C = c("1", "2")))

# Fit model independent (hanya efek utama) dengan loglin
model_indep <- loglin(data, margin = list(1, 2, 3), fit = TRUE)
## 2 iterations: deviation 0
# Expected counts hasil model independent
model_indep$fit
## , , C = 1
## 
##    B
## A      1    2
##   1 22.5 22.5
##   2 12.5 12.5
## 
## , , C = 2
## 
##    B
## A      1    2
##   1 22.5 22.5
##   2 12.5 12.5
# Statistik goodness-of-fit (deviance)
model_indep$lrt
## [1] 16.29769
# p-value untuk uji kecocokan model independent
p_value <- 1 - pchisq(model_indep$lrt, df = model_indep$df)
p_value
## [1] 0.002644649

Kesimpulan Model independent adalah model loglinear dasar yang hanya memasukkan efek utama tanpa interaksi. Model ini cocok digunakan sebagai baseline untuk menguji keberadaan interaksi antar variabel dengan membandingkan dengan model yang lebih kompleks seperti model saturated.

14.4 Odds Ratio dan Interpretasi

Pengertian Odds Ratio (OR)

Odds Ratio (OR) adalah ukuran asosiasi antara dua kategori variabel dalam tabel kontingensi, yang menggambarkan kekuatan hubungan atau asosiasi antara variabel-variabel kategorikal.

OR sering digunakan untuk menginterpretasikan interaksi dalam model loglinier, terutama untuk tabel 2x2.


Rumus Odds dan Odds Ratio

Misalkan kita memiliki tabel 2x2:

B=1 B=2
A=1 \(n_{11}\) \(n_{12}\)
A=2 \(n_{21}\) \(n_{22}\)
  • Odds dari \(B=1\) terhadap \(B=2\) pada level \(A=1\) adalah:

\[ \text{Odds}_{A=1} = \frac{n_{11}}{n_{12}} \]

  • Odds dari \(B=1\) terhadap \(B=2\) pada level \(A=2\) adalah:

\[ \text{Odds}_{A=2} = \frac{n_{21}}{n_{22}} \]

  • Odds Ratio (OR) antara \(A=1\) dan \(A=2\) adalah:

\[ OR = \frac{\text{Odds}_{A=1}}{\text{Odds}_{A=2}} = \frac{n_{11} \times n_{22}}{n_{12} \times n_{21}} \]


Interpretasi Odds Ratio

  • \(OR = 1\) : Tidak ada asosiasi antara variabel \(A\) dan \(B\) (independen).
  • \(OR > 1\) : Ada asosiasi positif; kejadian pada \(A=1\) lebih mungkin terkait dengan \(B=1\).
  • \(OR < 1\) : Ada asosiasi negatif; kejadian pada \(A=1\) kurang mungkin terkait dengan \(B=1\).

Odds Ratio dalam Model Loglinier

Model loglinier dapat dinyatakan sebagai:

\[ \log(m_{ij}) = \lambda + \lambda_A(i) + \lambda_B(j) + \lambda_{AB}(i,j) \]

Dimana \(\lambda_{AB}(i,j)\) adalah parameter interaksi yang merepresentasikan asosiasi antar variabel.

Odds ratio dapat dihitung dari parameter interaksi:

\[ OR = \exp\left( \lambda_{AB}(1,1) + \lambda_{AB}(2,2) - \lambda_{AB}(1,2) - \lambda_{AB}(2,1) \right) \]


Odds Ratio adalah ukuran penting dalam analisis tabel kontingensi dan model loglinier, untuk mengetahui kekuatan dan arah asosiasi antar variabel kategorikal. Interpretasi OR membantu memahami interaksi dalam data.

14.5 Estimasi Parameter

Pengertian Estimasi Parameter

Estimasi parameter pada model loglinier bertujuan menentukan nilai parameter \(\lambda\) pada model, yaitu efek utama dan interaksi antar variabel kategori yang menjelaskan hubungan dalam tabel kontingensi.

Model loglinier umum untuk dua variabel kategori \(A\) dan \(B\) dengan level \(i\) dan \(j\):

\[ \log(m_{ij}) = \lambda + \lambda_A(i) + \lambda_B(j) + \lambda_{AB}(i,j) \]

dimana: - \(m_{ij}\) adalah frekuensi yang diharapkan untuk sel ke-\(ij\). - \(\lambda\) adalah parameter intercept (konstanta). - \(\lambda_A(i)\) dan \(\lambda_B(j)\) adalah parameter efek utama. - \(\lambda_{AB}(i,j)\) adalah parameter interaksi.


Metode Estimasi: Maximum Likelihood Estimation (MLE)

Parameter \(\lambda\) diestimasi dengan metode Maximum Likelihood, yaitu mencari nilai parameter yang memaksimalkan kemungkinan data yang diamati.

MLE untuk model loglinier umumnya diselesaikan dengan algoritma Iterative Proportional Fitting (IPF).


Estimasi Parameter dengan Fungsi loglin() di R

Contoh data tabel 2x2:

# Data tabel 2x2
data <- matrix(c(30, 10, 20, 40), nrow = 2, byrow = TRUE,
               dimnames = list(A = c("1", "2"), B = c("1", "2")))

# Estimasi model loglinier dengan interaksi (saturated model)
model <- loglin(data, margin = list(c(1), c(2), c(1,2)), fit = TRUE)
## 2 iterations: deviation 0
# Tampilkan parameter estimasi
model$param
## NULL

Penjelasan Nilai positif parameter menunjukkan efek atau asosiasi yang meningkatkan frekuensi pada sel tersebut.

Nilai negatif menunjukkan efek penurunan.

Parameter interaksi penting untuk menguji apakah hubungan antara variabel signifikan.

Kesimpulan Estimasi parameter pada model loglinier memberikan informasi kuantitatif tentang pengaruh variabel dan interaksinya. Estimasi ini penting untuk pemodelan hubungan variabel kategori.

14.6 Model Lebih Sederhana dan Perbandingan Model

Pengantar

Setelah estimasi parameter model loglinier penuh (saturated model), sering kali kita ingin menyederhanakan model dengan menghilangkan parameter yang tidak signifikan. Model lebih sederhana biasanya:

  • Memiliki lebih sedikit parameter (efek utama dan interaksi)
  • Masih mampu menjelaskan data dengan baik
  • Mudah diinterpretasi

Contoh Model Lebih Sederhana

Misalnya dari model penuh:

\[ \log(m_{ijk}) = \lambda + \lambda_A(i) + \lambda_B(j) + \lambda_C(k) + \lambda_{AB}(i,j) + \lambda_{AC}(i,k) + \lambda_{BC}(j,k) + \lambda_{ABC}(i,j,k) \]

Kita dapat menyederhanakan dengan menghilangkan interaksi tiga arah \(\lambda_{ABC}\) jika tidak signifikan:

\[ \log(m_{ijk}) = \lambda + \lambda_A(i) + \lambda_B(j) + \lambda_C(k) + \lambda_{AB}(i,j) + \lambda_{AC}(i,k) + \lambda_{BC}(j,k) \]


Cara Memilih Model

1. Likelihood Ratio Test (LRT)

Uji apakah model sederhana lebih buruk secara signifikan dibanding model penuh:

\[ G^2 = 2 \sum O_i \log \frac{O_i}{E_i} \]

dimana: - \(O_i\) = frekuensi observasi - \(E_i\) = frekuensi ekspektasi dari model

Nilai \(G^2\) mengikuti distribusi Chi-square dengan derajat kebebasan sama dengan selisih jumlah parameter.


2. AIC (Akaike Information Criterion)

Model dengan AIC lebih kecil dianggap lebih baik:

\[ AIC = G^2 - 2 \times df \]


3. BIC (Bayesian Information Criterion)

Alternatif AIC dengan penalti lebih besar untuk kompleksitas:

\[ BIC = G^2 - \log(N) \times df \]

dimana \(N\) adalah jumlah observasi.


Contoh di R: Perbandingan Model

# Data tabel 3 dimensi
data <- array(c(30, 20, 10, 40, 50, 25, 15, 35), dim = c(2,2,2),
              dimnames = list(A = c("1", "2"),
                              B = c("1", "2"),
                              C = c("1", "2")))

# Model penuh (saturated)
model_full <- loglin(data, margin = list(c(1), c(2), c(3),
                                        c(1,2), c(1,3), c(2,3), c(1,2,3)),
                     fit = TRUE)
## 2 iterations: deviation 7.105427e-15
# Model tanpa interaksi tiga arah
model_reduced <- loglin(data, margin = list(c(1), c(2), c(3),
                                           c(1,2), c(1,3), c(2,3)),
                        fit = TRUE)
## 4 iterations: deviation 0.02544858
# Bandingkan deviance (G^2)
dev_full <- model_full$lrt
dev_reduced <- model_reduced$lrt

# Derajat kebebasan
df_full <- model_full$df
df_reduced <- model_reduced$df

# Uji Likelihood Ratio Test
lrt_stat <- dev_reduced - dev_full
df_diff <- df_reduced - df_full
p_value <- pchisq(lrt_stat, df = df_diff, lower.tail = FALSE)

cat("Likelihood Ratio Test:\n")
## Likelihood Ratio Test:
cat("Statistik =", lrt_stat, "\n")
## Statistik = 0.1743186
cat("Df =", df_diff, "\n")
## Df = 1
cat("P-value =", p_value, "\n")
## P-value = 0.6763019
# AIC
aic_full <- dev_full - 2*df_full
aic_reduced <- dev_reduced - 2*df_reduced
cat("AIC model penuh:", aic_full, "\n")
## AIC model penuh: 0
cat("AIC model reduced:", aic_reduced, "\n")
## AIC model reduced: -1.825681

Kesimpulan Pemilihan model loglinier dilakukan dengan menguji pengaruh penghapusan parameter interaksi. Model lebih sederhana yang tetap menjelaskan data secara baik lebih praktis dan mudah diinterpretasi.

14.7 Studi Kasus: Kepercayaan terhadap Surga

Deskripsi Studi Kasus

Misalkan kita memiliki data survei mengenai kepercayaan terhadap surga, dikumpulkan berdasarkan tiga variabel kategorik:

  • Jenis Kelamin (A): Pria, Wanita
  • Usia (B): Muda, Tua
  • Kepercayaan terhadap Surga (C): Percaya, Ragu, Tidak Percaya

Data disajikan dalam bentuk tabel kontingensi 3 dimensi dengan frekuensi responden di setiap kombinasi kategori.


Tujuan Analisis

  • Memahami hubungan antar variabel dengan model loglinier
  • Menentukan apakah ada interaksi antar variabel yang signifikan
  • Menginterpretasi odds ratio untuk memahami pengaruh masing-masing variabel

Data Simulasi

# Membuat data simulasi
data_surga <- array(c(
  30, 10, 5,   # Pria, Muda: Percaya, Ragu, Tidak Percaya
  20, 5, 2,    # Pria, Tua: Percaya, Ragu, Tidak Percaya
  25, 15, 10,  # Wanita, Muda: Percaya, Ragu, Tidak Percaya
  15, 10, 8    # Wanita, Tua: Percaya, Ragu, Tidak Percaya
), dim = c(2,2,3),
dimnames = list(
  JenisKelamin = c("Pria", "Wanita"),
  Usia = c("Muda", "Tua"),
  Kepercayaan = c("Percaya", "Ragu", "Tidak Percaya")
))
# Melihat data
print(data_surga)
## , , Kepercayaan = Percaya
## 
##             Usia
## JenisKelamin Muda Tua
##       Pria     30   5
##       Wanita   10  20
## 
## , , Kepercayaan = Ragu
## 
##             Usia
## JenisKelamin Muda Tua
##       Pria      5  25
##       Wanita    2  15
## 
## , , Kepercayaan = Tidak Percaya
## 
##             Usia
## JenisKelamin Muda Tua
##       Pria     10  10
##       Wanita   15   8
# Total responden
sum(data_surga)
## [1] 155
#Estimasi model loglinier
#Model penuh dengan semua interaksi
model_full <- loglin(data_surga, margin = list(c(1), c(2), c(3),
                                              c(1,2), c(1,3), c(2,3), c(1,2,3)),
                     fit = TRUE)
## 2 iterations: deviation 1.776357e-15
summary(model_full)
##         Length Class  Mode   
## lrt      1     -none- numeric
## pearson  1     -none- numeric
## df       1     -none- numeric
## margin   7     -none- list   
## fit     12     -none- numeric
#Model Sederhana
#Misal model tanpa interaksi tiga arah:
model_reduced <- loglin(data_surga, margin = list(c(1), c(2), c(3),
                                                 c(1,2), c(1,3), c(2,3)),
                        fit = TRUE)
## 5 iterations: deviation 0.09938393
summary(model_reduced)
##         Length Class  Mode   
## lrt      1     -none- numeric
## pearson  1     -none- numeric
## df       1     -none- numeric
## margin   6     -none- list   
## fit     12     -none- numeric
#Perbandingan model
# Likelihood ratio test
lrt_stat <- model_reduced$lrt - model_full$lrt
df_diff <- model_reduced$df - model_full$df
p_value <- pchisq(lrt_stat, df = df_diff, lower.tail = FALSE)

cat("Likelihood Ratio Test:\n")
## Likelihood Ratio Test:
cat("Statistik =", lrt_stat, "\n")
## Statistik = 13.8408
cat("Df =", df_diff, "\n")
## Df = 2
cat("P-value =", p_value, "\n")
## P-value = 0.0009874351

BAB 15: Model Log-Linear 2 Arah


15.1 Apa Itu Model Log-Linear?

Model log-linear adalah model statistik yang digunakan untuk menganalisis hubungan antara dua atau lebih variabel kategori dalam bentuk tabel kontingensi. Model ini menjelaskan bagaimana frekuensi dalam setiap sel tabel dapat dijelaskan oleh efek dari masing-masing variabel serta interaksinya — dengan asumsi distribusi Poisson.


15.2 Perbedaan Log-Linear vs Regresi Logistik

Aspek Log-Linear Regresi Logistik
Tujuan Menjelaskan hubungan antar variabel kategori Memprediksi probabilitas outcome
Tipe variabel Semua variabel kategorik Respon: kategorik, Prediktor: bisa campuran
Bentuk data Tabel kontingensi (frekuensi) Data individual (baris per subjek)
Distribusi Poisson Binomial
Model log(μ) = efek + interaksi logit(p) = β₀ + β₁X + …

15.3 Analisis Tabel Kontingensi 2x2

Misalkan kita punya data:

Merokok Kanker Frekuensi
Ya Ya 20
Ya Tidak 80
Tidak Ya 10
Tidak Tidak 90
# Buat ulang tabel kontingensi
data_matrix <- matrix(c(20, 80, 10, 90), nrow = 2, byrow = TRUE,
                      dimnames = list(
                        Merokok = c("Ya", "Tidak"),
                        Kanker = c("Ya", "Tidak")
                      ))

# Ubah ke data frame dengan format panjang
data_df <- as.data.frame(as.table(data_matrix))

# Lihat hasil
head(data_df)
##   Merokok Kanker Freq
## 1      Ya     Ya   20
## 2   Tidak     Ya   10
## 3      Ya  Tidak   80
## 4   Tidak  Tidak   90

15.4 Bentuk Model Log-Linear

Model log-linear bertujuan untuk memodelkan frekuensi yang diharapkan (\(\mu_{ij}\)) dalam tabel kontingensi berdasarkan pengaruh variabel-variabel kategorik.

Untuk tabel 2x2, bentuk model log-linear saturated adalah:

\[ \log(\mu_{ij}) = \lambda + \lambda_i^{(A)} + \lambda_j^{(B)} + \lambda_{ij}^{(AB)} \]

Keterangan: - \(\mu_{ij}\): nilai ekspektasi (rata-rata Poisson) di sel ke-(i,j) - \(\lambda\): intercept - \(\lambda_i^{(A)}\): efek dari kategori ke-i pada variabel A - \(\lambda_j^{(B)}\): efek dari kategori ke-j pada variabel B - \(\lambda_{ij}^{(AB)}\): efek interaksi antara A dan B


15.5 Estimasi Parameter Model (Manual dengan Sum-to-Zero)

Kita gunakan data Merokok vs Kanker:

data <- matrix(c(20, 80, 10, 90), nrow = 2, byrow = TRUE)
dimnames(data) <- list(
  Merokok = c("Ya", "Tidak"),
  Kanker = c("Ya", "Tidak")
)
data
##        Kanker
## Merokok Ya Tidak
##   Ya    20    80
##   Tidak 10    90

15.6 Hitung Odds Ratio dan Interval Kepercayaan

OR <- (20 * 90) / (80 * 10)
OR
## [1] 2.25
se_log_or <- sqrt(1/20 + 1/80 + 1/10 + 1/90)
ci_lower <- exp(log(OR) - 1.96 * se_log_or)
ci_upper <- exp(log(OR) + 1.96 * se_log_or)
c(CI_Lower = ci_lower, CI_Upper = ci_upper)
## CI_Lower CI_Upper 
## 0.994280 5.091624

15.7 Fitting Model Log-Linear dengan R

# Fit model log-linear
model <- glm(Freq ~ Merokok * Kanker, family = poisson, data = data_df)
summary(model)
## 
## Call:
## glm(formula = Freq ~ Merokok * Kanker, family = poisson, data = data_df)
## 
## Coefficients:
##                          Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                2.9957     0.2236  13.397  < 2e-16 ***
## MerokokTidak              -0.6931     0.3873  -1.790   0.0735 .  
## KankerTidak                1.3863     0.2500   5.545 2.94e-08 ***
## MerokokTidak:KankerTidak   0.8109     0.4167   1.946   0.0516 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 1.1216e+02  on 3  degrees of freedom
## Residual deviance: 1.6875e-14  on 0  degrees of freedom
## AIC: 29.561
## 
## Number of Fisher Scoring iterations: 3

15.8 Interpretasi Parameter

Interpretasi parameter log-linear:

  • Efek positif → frekuensi aktual lebih besar dari yang diharapkan jika tidak ada asosiasi.
  • Interaksi signifikan → menunjukkan adanya ketergantungan antara Merokok dan Kanker.
  • Model tanpa interaksi mengasumsikan independensi antar variabel.

15.9 Analisis Data Tabel Kontingensi 2x3

Sekarang kita analisis data kategorik dalam tabel 2x3, misalnya hubungan antara status vaksinasi dan tingkat kesehatan balita:

Vaksinasi Sehat Sakit Ringan Sakit Berat
Sudah 30 50 20
Belum 60 40 10

15.10 Bentuk Model Log-Linear untuk Tabel 2x3

Untuk tabel kontingensi 2x3, misalnya hubungan antara Vaksinasi (2 kategori) dan Kesehatan (3 kategori), bentuk umum model log-linear yang digunakan adalah:

🔹 Model Tanpa Interaksi (Independensi):

\[ \log(\mu_{ij}) = \lambda + \lambda_i^{(Vaksinasi)} + \lambda_j^{(Kesehatan)} \]

Model ini mengasumsikan bahwa variabel Vaksinasi dan Kesehatan tidak saling bergantung — frekuensi pada setiap sel hanya bergantung pada efek marjinal masing-masing.


🔹 Model dengan Interaksi (Saturated):

\[ \log(\mu_{ij}) = \lambda + \lambda_i^{(Vaksinasi)} + \lambda_j^{(Kesehatan)} + \lambda_{ij}^{(Interaksi)} \]

Model ini mengijinkan adanya ketergantungan antar kategori, dengan menambahkan efek interaksi antara Vaksinasi dan Kesehatan. Ini adalah model saturated untuk tabel 2x3.


Perbandingan Kedua Model:

Aspek Tanpa Interaksi Dengan Interaksi (Saturated)
Kompleksitas Lebih sederhana Lebih kompleks
Hubungan antar variabel Dianggap independen Dapat menangkap ketergantungan
Digunakan saat Uji independensi Estimasi model penuh

Catatan: - Pada data nyata, kita sering membandingkan kedua model dengan uji deviance (lihat subbab 15.11). - Jika interaksi signifikan → gunakan model saturated - Jika tidak signifikan → model independensi bisa cukup mewakili data

# Matrix tabel kontingensi 2x3
data_2x3 <- matrix(c(30, 50, 20, 60, 40, 10), nrow = 2, byrow = TRUE,
                   dimnames = list(
                     Vaksinasi = c("Sudah", "Belum"),
                     Kesehatan = c("Sehat", "Ringan", "Berat")
                   ))

# Ubah ke data.frame
df_2x3 <- as.data.frame(as.table(data_2x3))

# Lihat datanya
head(df_2x3)
##   Vaksinasi Kesehatan Freq
## 1     Sudah     Sehat   30
## 2     Belum     Sehat   60
## 3     Sudah    Ringan   50
## 4     Belum    Ringan   40
## 5     Sudah     Berat   20
## 6     Belum     Berat   10
#Model tanpa interaksi:
model_indep <- glm(Freq ~ Vaksinasi + Kesehatan, family = poisson, data = df_2x3)
summary(model_indep)
## 
## Call:
## glm(formula = Freq ~ Vaksinasi + Kesehatan, family = poisson, 
##     data = df_2x3)
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)      3.758e+00  1.279e-01  29.390  < 2e-16 ***
## VaksinasiBelum   9.531e-02  1.382e-01   0.690     0.49    
## KesehatanRingan -9.100e-14  1.491e-01   0.000     1.00    
## KesehatanBerat  -1.099e+00  2.108e-01  -5.211 1.88e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 54.341  on 5  degrees of freedom
## Residual deviance: 14.229  on 2  degrees of freedom
## AIC: 53.692
## 
## Number of Fisher Scoring iterations: 4
#Model dengan interaksi:
model_interaksi <- glm(Freq ~ Vaksinasi * Kesehatan, family = poisson, data = df_2x3)
summary(model_interaksi)
## 
## Call:
## glm(formula = Freq ~ Vaksinasi * Kesehatan, family = poisson, 
##     data = df_2x3)
## 
## Coefficients:
##                                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                      3.4012     0.1826  18.629  < 2e-16 ***
## VaksinasiBelum                   0.6931     0.2236   3.100  0.00194 ** 
## KesehatanRingan                  0.5108     0.2309   2.212  0.02697 *  
## KesehatanBerat                  -0.4055     0.2887  -1.405  0.16015    
## VaksinasiBelum:KesehatanRingan  -0.9163     0.3082  -2.973  0.00295 ** 
## VaksinasiBelum:KesehatanBerat   -1.3863     0.4472  -3.100  0.00194 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance:  5.4341e+01  on 5  degrees of freedom
## Residual deviance: -4.4409e-15  on 0  degrees of freedom
## AIC: 43.463
## 
## Number of Fisher Scoring iterations: 3
anova(model_indep, model_interaksi, test = "Chisq")
## Analysis of Deviance Table
## 
## Model 1: Freq ~ Vaksinasi + Kesehatan
## Model 2: Freq ~ Vaksinasi * Kesehatan
##   Resid. Df Resid. Dev Df Deviance  Pr(>Chi)    
## 1         2     14.229                          
## 2         0      0.000  2   14.229 0.0008132 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Interpretasi:

  • Karena p-value < 0.05, maka:
  • Interaksi antara status vaksinasi dan status kesehatan adalah signifikan.

Ini menunjukkan bahwa Distribusi status kesehatan tidak seragam antara kelompok yang sudah dan belum divaksin.Artinya, status vaksinasi berpengaruh terhadap status kesehatan anak.

BAB 16: Model Log-Linear Tiga Arah

16.1 Pendahuluan: Mengapa Model Log-Linear Tiga Arah Penting?

Model log-linear tiga arah adalah perluasan dari model log-linear dua arah yang memungkinkan kita menganalisis lebih dari dua variabel kategori secara simultan dalam satu tabel kontingensi. Model ini sangat berguna ketika data yang dikumpulkan melibatkan tiga faktor kategorik dan kita ingin memahami hubungan kompleks di antara mereka, termasuk efek interaksi tingkat tinggi.

Contoh Masalah Nyata:

Bayangkan sebuah studi yang melibatkan tiga variabel kategori: - Jenis Kelamin (A): Pria, Wanita - Status Merokok (B): Ya, Tidak - Status Penyakit Jantung (C): Ada, Tidak

Jika kita hanya melihat hubungan antara dua variabel, misalnya antara merokok dan penyakit jantung, tanpa memperhitungkan jenis kelamin, kita mungkin kehilangan pola penting yang hanya terlihat jika kita mempertimbangkan ketiga variabel secara bersamaan.


Kelebihan Menggunakan Model Tiga Arah:

  • Mendeteksi Interaksi Tingkat Tinggi: Seperti interaksi tiga arah antara A, B, dan C, yang tidak dapat dilihat dari dua arah saja.
  • Menghindari Analisis Parsial: Menganalisis hanya dua variabel bisa menghasilkan kesimpulan yang menyesatkan jika ada pengaruh dari variabel ketiga (contoh klasik: Simpson’s Paradox).
  • Model yang Lebih Realistis: Dalam banyak aplikasi nyata (kesehatan, pemasaran, sosiologi), data bersifat multi-dimensional.
  • Fleksibel untuk Berbagai Tujuan Analisis: Termasuk menguji independensi bersyarat dan pemodelan asosiatif kompleks.

Struktur Data dan Tujuan Model:

Model log-linear tiga arah digunakan untuk: - Memodelkan frekuensi harapan dari kombinasi tiga variabel kategori. - Menentukan apakah ada interaksi antara tiga variabel (apakah efek satu variabel tergantung pada dua variabel lainnya). - Mengevaluasi ketergantungan pasangan variabel dengan mengontrol variabel ketiga (independensi bersyarat).


Aplikasi Nyata Model Log-Linear Tiga Arah:

Bidang Contoh
Kesehatan Jenis Kelamin Pola Merokok Status Penyakit
Pemasaran Usia Jenis Produk Keputusan Pembelian
Sosial Pendidikan Jenis Kelamin Dukungan terhadap Kebijakan

Dengan memahami model log-linear tiga arah, kita akan mampu mengeksplorasi hubungan multi-dimensi dalam data kategorik secara lebih utuh dan valid.


16.2 Struktur Tabel Kontingensi Tiga Arah dan Notasi Sel

Dalam model log-linear tiga arah, data dikumpulkan dalam bentuk tabel kontingensi tiga dimensi (tiga arah), yang merepresentasikan frekuensi gabungan dari tiga variabel kategorik. Setiap kombinasi dari ketiga variabel ini membentuk satu sel pada tabel, yang memiliki nilai frekuensi observasi.

Notasi Umum:

Misalkan terdapat tiga variabel kategorik:

  • \(A\) dengan \(I\) kategori (misal: jenis kelamin),
  • \(B\) dengan \(J\) kategori (misal: status merokok),
  • \(C\) dengan \(K\) kategori (misal: status penyakit).

Frekuensi pengamatan untuk kombinasi kategori \(A = i\), \(B = j\), dan \(C = k\) dinyatakan dengan:

\[ n_{ijk} \quad \text{(frekuensi observasi)} \]

dan frekuensi harapan (expected frequency) dilambangkan sebagai:

\[ \mu_{ijk} \]


Bentuk Tabel Kontingensi 3 Arah

Misalnya kita memiliki tabel dengan ukuran 2 2 2, maka tabel bisa dibayangkan sebagai dua buah tabel 2 2, satu untuk setiap level dari variabel ketiga (C):

Jika C = 1

B1 B2
A1 \(n_{111}\) \(n_{121}\)
A2 \(n_{211}\) \(n_{221}\)

Jika C = 2

B1 B2
A1 \(n_{112}\) \(n_{122}\)
A2 \(n_{212}\) \(n_{222}\)

Jadi, ada total \(I \times J \times K\) sel dalam tabel (di atas: \(2 2 2 = 8\) sel).


Notasi Sel Lengkap:

A B C Notasi Frekuensi
1 1 1 \(n_{111}\) Observasi untuk A1, B1, C1
1 2 1 \(n_{121}\) Observasi untuk A1, B2, C1
2 1 1 \(n_{211}\) Observasi untuk A2, B1, C1
2 2 1 \(n_{221}\) Observasi untuk A2, B2, C1
1 1 2 \(n_{112}\) Observasi untuk A1, B1, C2
1 2 2 \(n_{122}\) Observasi untuk A1, B2, C2
2 1 2 \(n_{212}\) Observasi untuk A2, B1, C2
2 2 2 \(n_{222}\) Observasi untuk A2, B2, C2

Mengapa Struktur Ini Penting?

  • Struktur tabel menentukan kompleksitas model yang akan digunakan.
  • Menjadi dasar untuk menyusun model log-linear tiga arah dan memilih interaksi mana yang akan diuji.
  • Notasi \(n_{ijk}\) dan \(\mu_{ijk}\) akan digunakan dalam seluruh pembahasan estimasi parameter, pengujian model, dan perhitungan odds ratio.

16.3 Jenis-jenis Model Log-Linear Tiga Arah

Dalam tabel kontingensi tiga arah, kita bisa membentuk berbagai jenis model log-linear berdasarkan struktur dan tingkat interaksi antar variabel. Model-model ini merepresentasikan tingkat ketergantungan yang berbeda antara variabel A, B, dan C.

Model log-linear tiga arah dapat diklasifikasikan menjadi tiga kelompok besar:


16.3.1 Model Saturated (Penuh)

\[ \log(\mu_{ijk}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^C_k + \lambda^{AB}_{ij} + \lambda^{AC}_{ik} + \lambda^{BC}_{jk} + \lambda^{ABC}_{ijk} \]

  • Mengikutkan semua efek utama, dua arah, dan tiga arah.
  • Tidak menyisakan error (fit sempurna), tetapi tidak efisien karena menggunakan semua parameter.
  • Cocok untuk pembandingan, bukan sebagai model akhir yang hemat parameter.

16.3.2 Model Homogeneous Association (Tanpa Interaksi 3 Arah)

\[ \log(\mu_{ijk}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^C_k + \lambda^{AB}_{ij} + \lambda^{AC}_{ik} + \lambda^{BC}_{jk} \]

  • Tidak menyertakan interaksi tiga arah \(\lambda^{ABC}_{ijk}\)
  • Mengasumsikan asosiasi antara setiap pasangan tetap konstan di level variabel ketiga.
  • Model yang paling umum digunakan ketika ketiga variabel diasumsikan saling berasosiasi secara berpasangan.

16.3.3 Model Conditional Independence

Contoh: \[ \log(\mu_{ijk}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^C_k + \lambda^{AC}_{ik} + \lambda^{BC}_{jk} \]

  • Mengasumsikan bahwa A dan B bersifat independen secara kondisional terhadap C.
  • Dikenal sebagai model bebas kondisional (conditional independence).
  • Berguna untuk menyelidiki apakah satu pasangan variabel benar-benar tidak saling memengaruhi jika variabel ketiga dikontrol.

Perbandingan Struktur Model

Model Interaksi 2 Arah Interaksi 3 Arah Cocok untuk…
Saturated Ya Ya Perbandingan model, tidak hemat
Homogeneous Association Ya Tidak Analisis hubungan antar pasangan
Conditional Independence Sebagian Tidak Uji bebas kondisional

16.4 Penyusunan dan Penulisan Bentuk Umum Model Log-Linear Tiga Arah

Model log-linear tiga arah digunakan untuk memodelkan frekuensi harapan \(\mu_{ijk}\) pada tabel kontingensi dengan tiga variabel kategorik: A, B, dan C.


Bentuk Umum Model

Model log-linear yang umum digunakan dituliskan sebagai:

\[ \log(\mu_{ijk}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^C_k + \lambda^{AB}_{ij} + \lambda^{AC}_{ik} + \lambda^{BC}_{jk} + \lambda^{ABC}_{ijk} \]

Keterangan:

  • \(\lambda\): konstanta (intersep)
  • \(\lambda^A_i\), \(\lambda^B_j\), \(\lambda^C_k\): efek utama dari masing-masing variabel
  • \(\lambda^{AB}_{ij}\), \(\lambda^{AC}_{ik}\), \(\lambda^{BC}_{jk}\): efek interaksi dua arah
  • \(\lambda^{ABC}_{ijk}\): efek interaksi tiga arah (tersulit ditafsirkan, tetapi menunjukkan apakah hubungan antara dua variabel bergantung pada variabel ketiga)

Contoh Spesifik Model

Model Saturated:

\[ \log(\mu_{ijk}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^C_k + \lambda^{AB}_{ij} + \lambda^{AC}_{ik} + \lambda^{BC}_{jk} + \lambda^{ABC}_{ijk} \]

Model Homogeneous Association:

\[ \log(\mu_{ijk}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^C_k + \lambda^{AB}_{ij} + \lambda^{AC}_{ik} + \lambda^{BC}_{jk} \]

Model Conditional Independence (contoh: A B | C):

\[ \log(\mu_{ijk}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^C_k + \lambda^{AC}_{ik} + \lambda^{BC}_{jk} \]


16.5 Strategi Pemilihan Model dan Prinsip Parsimony

Dalam analisis log-linear tiga arah, terdapat banyak kemungkinan model yang bisa dibentuk. Namun, tidak semua model perlu atau sebaiknya digunakan. Kita harus memilih model yang cukup menjelaskan data namun tetap sederhana dan efisien.

Inilah mengapa kita membutuhkan strategi pemilihan model dan prinsip yang disebut parsimony.


Apa itu Prinsip Parsimony?

Prinsip parsimony menyatakan bahwa:

“Gunakan model yang paling sederhana yang masih dapat menjelaskan data dengan baik.”

Artinya, jika dua model memberikan penjelasan yang sebanding terhadap data, maka model yang lebih sedikit parameternya lebih disukai.


Strategi Umum Pemilihan Model

  1. Mulai dari Model Saturated
    • Cocok sebagai model awal karena memuat seluruh interaksi.
    • Memiliki deviance = 0, tetapi tidak hemat parameter.
  2. Coba Model Simpangan (Reduced Models)
    • Hapus interaksi tiga arah terlebih dahulu.
    • Lalu, evaluasi apakah penghapusan tersebut secara signifikan menurunkan kecocokan model.
  3. Gunakan Uji Likelihood Ratio Test (G)
    • Bandingkan model dengan dan tanpa komponen tertentu.
    • Hitung: \[ G^2 = 2 \sum_{ijk} n_{ijk} \log\left(\frac{n_{ijk}}{\hat{\mu}_{ijk}}\right) \]
    • Bandingkan dengan distribusi \(\chi^2\) untuk menilai apakah perbedaan signifikan.
  4. Gunakan AIC (Akaike Information Criterion)
    • AIC = Deviance + 2 Jumlah parameter
    • Pilih model dengan AIC terkecil.
  5. Periksa Residual
    • Residual Pearson atau deviance residual besar pada sel tertentu mengindikasikan model tidak fit pada sel itu.

16.6 Uji Goodness-of-Fit dan Perbandingan Model

Setelah memilih dan membangun beberapa model log-linear, langkah penting berikutnya adalah mengevaluasi apakah model yang kita pilih cocok dengan data atau tidak. Evaluasi ini dilakukan menggunakan uji Goodness-of-Fit.


A. Ukuran Goodness-of-Fit

1. Deviance (G)

Mengukur seberapa jauh model memprediksi frekuensi pengamatan dibandingkan dengan model saturated (model yang sangat cocok).

\[ G^2 = 2 \sum_{i,j,k} n_{ijk} \log\left( \frac{n_{ijk}}{\hat{\mu}_{ijk}} \right) \]

  • \(n_{ijk}\): frekuensi observasi
  • \(\hat{\mu}_{ijk}\): frekuensi harapan dari model

Jika \(G^2\) kecil, maka model dianggap cocok dengan data.

2. Pearson Chi-Square (X)

\[ X^2 = \sum_{i,j,k} \frac{(n_{ijk} - \hat{\mu}_{ijk})^2}{\hat{\mu}_{ijk}} \]


B. Derajat Kebebasan (df)

Untuk uji G atau X, nilai statistik diuji dengan distribusi chi-square dengan derajat kebebasan:

\[ df = (\text{jumlah sel}) - (\text{jumlah parameter model}) \]


C. Nilai p-value

  • Jika p-value > 0.05 model cocok dengan data (tidak ada cukup bukti menolak model)
  • Jika p-value < 0.05 model tidak cocok (fit buruk)

D. Perbandingan Model (Likelihood Ratio Test)

Jika kita punya dua model bersarang (nested), kita dapat membandingkannya menggunakan uji:

\[ \Delta G^2 = G^2_{\text{model kecil}} - G^2_{\text{model besar}} \]

Derajat kebebasan: selisih jumlah parameternya


E. Implementasi di R

# Misal: model tanpa interaksi tiga arah vs model saturated
library(MASS)

# data harus dalam bentuk tabel 3 arah
tab <- array(c(15, 25, 10, 20, 30, 40, 20, 30), dim = c(2, 2, 2),
             dimnames = list(A = c("A1", "A2"),
                             B = c("B1", "B2"),
                             C = c("C1", "C2")))

model_saturated <- loglm(~ A * B * C, data = tab)
model_noABC <- loglm(~ A * B + A * C + B * C, data = tab)

# Goodness-of-Fit masing-masing model
summary(model_saturated)
## Formula:
## ~A * B * C
## attr(,"variables")
## list(A, B, C)
## attr(,"factors")
##   A B C A:B A:C B:C A:B:C
## A 1 0 0   1   1   0     1
## B 0 1 0   1   0   1     1
## C 0 0 1   0   1   1     1
## attr(,"term.labels")
## [1] "A"     "B"     "C"     "A:B"   "A:C"   "B:C"   "A:B:C"
## attr(,"order")
## [1] 1 1 1 2 2 2 3
## 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_noABC)
## Formula:
## ~A * B + A * C + B * C
## attr(,"variables")
## list(A, B, C)
## attr(,"factors")
##   A B C A:B A:C B:C
## A 1 0 0   1   1   0
## B 0 1 0   1   0   1
## C 0 0 1   0   1   1
## attr(,"term.labels")
## [1] "A"   "B"   "C"   "A:B" "A:C" "B:C"
## attr(,"order")
## [1] 1 1 1 2 2 2
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
## 
## Statistics:
##                         X^2 df  P(> X^2)
## Likelihood Ratio 0.01046175  1 0.9185323
## Pearson          0.01045701  1 0.9185507
# Perbandingan model
anova(model_noABC, model_saturated)
## LR tests for hierarchical log-linear models
## 
## Model 1:
##  ~A * B + A * C + B * C 
## Model 2:
##  ~A * B * C 
## 
##             Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1   0.01046175  1                                    
## Model 2   0.00000000  0 0.01046175         1        0.91853
## Saturated 0.00000000  0 0.00000000         0        1.00000
# Nilai AIC
extractAIC(model_saturated)
## [1]  8 16
extractAIC(model_noABC)
## [1]  7.00000 14.01046

16.7 Fitting Model Log-Linear Tiga Arah di R dengan loglm() dan glm()

Pendahuluan

Model log-linear adalah alat statistik untuk menganalisis hubungan dan interaksi antar variabel kategori. Di R, paket MASS menyediakan fungsi loglm() untuk fitting model log-linear, sedangkan fungsi glm() dengan family Poisson juga dapat digunakan untuk tujuan serupa.

Data Contoh

Kita gunakan data tabel kontingensi 222 berikut:

Membuat data tabel 2x2x2

data <- array(c(18, 12, 20, 15, 10, 8, 14, 9),
              dim = c(2, 2, 2),
              dimnames = list(A = c("a1", "a2"),
                              B = c("b1", "b2"),
                              C = c("c1", "c2")))

data
## , , C = c1
## 
##     B
## A    b1 b2
##   a1 18 20
##   a2 12 15
## 
## , , C = c2
## 
##     B
## A    b1 b2
##   a1 10 14
##   a2  8  9
#Fitting Model Log-Linear dengan loglm()
#Model Saturated (semua interaksi)
library(MASS)

model_saturated <- loglm(~ A * B * C, data = data)
summary(model_saturated)
## Formula:
## ~A * B * C
## attr(,"variables")
## list(A, B, C)
## attr(,"factors")
##   A B C A:B A:C B:C A:B:C
## A 1 0 0   1   1   0     1
## B 0 1 0   1   0   1     1
## C 0 0 1   0   1   1     1
## attr(,"term.labels")
## [1] "A"     "B"     "C"     "A:B"   "A:C"   "B:C"   "A:B:C"
## attr(,"order")
## [1] 1 1 1 2 2 2 3
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
## 
## Statistics:
##                  X^2 df P(> X^2)
## Likelihood Ratio   0  0        1
## Pearson            0  0        1
#Model Tanpa Interaksi Tiga Arah
model_no_3way <- loglm(~ A * B + A * C + B * C, data = data)
summary(model_no_3way)
## Formula:
## ~A * B + A * C + B * C
## attr(,"variables")
## list(A, B, C)
## attr(,"factors")
##   A B C A:B A:C B:C
## A 1 0 0   1   1   0
## B 0 1 0   1   0   1
## C 0 0 1   0   1   1
## attr(,"term.labels")
## [1] "A"   "B"   "C"   "A:B" "A:C" "B:C"
## attr(,"order")
## [1] 1 1 1 2 2 2
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
## 
## Statistics:
##                        X^2 df  P(> X^2)
## Likelihood Ratio 0.1708241  1 0.6793805
## Pearson          0.1708653  1 0.6793439

Fitting Model Log-Linear dengan glm() Kita juga bisa menggunakan fungsi glm() dengan family poisson() untuk fitting model log-linear.

# Konversi data ke data frame untuk glm
df <- as.data.frame(as.table(data))
head(df)
##    A  B  C Freq
## 1 a1 b1 c1   18
## 2 a2 b1 c1   12
## 3 a1 b2 c1   20
## 4 a2 b2 c1   15
## 5 a1 b1 c2   10
## 6 a2 b1 c2    8
#Model Saturated
model_glm <- glm(Freq ~ A * B * C, family = poisson(), data = df)
summary(model_glm)
## 
## Call:
## glm(formula = Freq ~ A * B * C, family = poisson(), data = df)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   2.8904     0.2357  12.263   <2e-16 ***
## Aa2          -0.4055     0.3727  -1.088    0.277    
## Bb2           0.1054     0.3249   0.324    0.746    
## Cc2          -0.5878     0.3944  -1.490    0.136    
## Aa2:Bb2       0.1178     0.5055   0.233    0.816    
## Aa2:Cc2       0.1823     0.6032   0.302    0.762    
## Bb2:Cc2       0.2311     0.5263   0.439    0.661    
## Aa2:Bb2:Cc2  -0.3365     0.8143  -0.413    0.679    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 9.7209e+00  on 7  degrees of freedom
## Residual deviance: 4.4409e-16  on 0  degrees of freedom
## AIC: 51.111
## 
## Number of Fisher Scoring iterations: 3
#Model Tanpa Interaksi Tiga Arah
model_glm_no_3way <- glm(Freq ~ A * B + A * C + B * C, family = poisson(), data = df)
summary(model_glm_no_3way)
## 
## Call:
## glm(formula = Freq ~ A * B + A * C + B * C, family = poisson(), 
##     data = df)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  2.861759   0.228555  12.521   <2e-16 ***
## Aa2         -0.335413   0.329776  -1.017    0.309    
## Bb2          0.159043   0.298330   0.533    0.594    
## Cc2         -0.509648   0.342526  -1.488    0.137    
## Aa2:Bb2     -0.011774   0.396067  -0.030    0.976    
## Aa2:Cc2     -0.002826   0.404875  -0.007    0.994    
## Bb2:Cc2      0.090964   0.401173   0.227    0.821    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 9.72087  on 7  degrees of freedom
## Residual deviance: 0.17082  on 1  degrees of freedom
## AIC: 49.282
## 
## Number of Fisher Scoring iterations: 3

Kesimpulan:

-Fungsi loglm() adalah cara praktis dan cepat untuk fitting model log-linear pada data tabel kontingensi. - Fungsi glm() memberikan fleksibilitas lebih untuk pengujian model berbasis regresi Poisson. - Pemilihan model harus mempertimbangkan kesesuaian dan kesederhanaan model (prinsip parsimoni).

16.9 Visualisasi dan Interpretasi Interaksi Tiga Arah

Pendahuluan

Setelah melakukan fitting model log-linear tiga arah, langkah penting berikutnya adalah memvisualisasikan dan menginterpretasikan interaksi antar variabel. Visualisasi membantu memahami pola interaksi yang kompleks dan memberikan gambaran intuitif.


Data Contoh

Kita gunakan data kontingensi 222 yang sama seperti sebelumnya:

data <- array(c(18, 12, 20, 15, 10, 8, 14, 9),
              dim = c(2, 2, 2),
              dimnames = list(A = c("a1", "a2"),
                              B = c("b1", "b2"),
                              C = c("c1", "c2")))
  1. Mosaic Plot untuk Visualisasi Interaksi Mosaic plot menunjukkan proporsi frekuensi pada kombinasi kategori dan dapat memperlihatkan interaksi.
library(vcd)

mosaic(data, shade = TRUE, legend = TRUE,
       main = "Mosaic Plot Tabel Kontingensi 2x2x2")

  1. Interaction Plot (Interaksi Dua Arah) Untuk variabel tiga arah, kita dapat membuat plot interaksi dua arah dalam setiap level variabel ketiga.
library(ggplot2)
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.3.3
# Ubah data menjadi data frame untuk ggplot
df <- as.data.frame(as.table(data))

# Plot interaksi A dan B pada level C = c1 dan c2
ggplot(df, aes(x = A, y = Freq, color = B, group = B)) +
  geom_line() +
  geom_point() +
  facet_wrap(~ C) +
  labs(title = "Interaction Plot antara A dan B pada tiap level C",
       y = "Frekuensi") +
  theme_minimal()

  1. Plot Interaksi Tiga Arah dengan interaction.plot Fungsi dasar R ini mempermudah melihat interaksi tiga arah.
# interaction.plot untuk variabel A, B, dan C
interaction.plot(df$B, df$A, df$Freq, 
                 type = "b", col = 1:2, pch = 19,
                 legend = TRUE,
                 xlab = "B", ylab = "Frekuensi",
                 trace.label = "A",
                 main = "Interaction Plot A dan B untuk tiap level C")

# Buat untuk setiap level C secara manual
with(subset(df, C == "c1"),
     interaction.plot(B, A, Freq, main = "Level C = c1"))

with(subset(df, C == "c2"),
     interaction.plot(B, A, Freq, main = "Level C = c2"))

Kesimpulan Visualisasi adalah alat penting untuk memahami interaksi kompleks dalam model log-linear tiga arah. Kombinasi mosaic plot dan interaction plot dapat memberikan wawasan intuitif sebelum dan setelah fitting model.

BAB 17 : Uji Model Interaksi 3 Arah

17.1 Pengantar dan Penentuan Referensi

Konteks Interaksi Tiga Arah

Dalam analisis data kategori, kita sering menjumpai situasi di mana dua variabel tampak saling berhubungan, namun hubungan tersebut ternyata bergantung pada keberadaan variabel ketiga. Hal ini disebut sebagai interaksi tiga arah, dan penting untuk dianalisis dalam model log-linear agar kita tidak membuat simpulan yang keliru.

Sebagai ilustrasi:

  • X: Jenis Kelamin (Pria/Wanita)
  • Y: Preferensi Produk (A/B)
  • Z: Kelompok Usia (Muda/Tua)

Kita ingin mengetahui:
Apakah perbedaan preferensi produk antara pria dan wanita berubah tergantung kelompok usia?
Jika iya, maka ketiga variabel tersebut memiliki interaksi tiga arah.

Tujuan Menganalisis Interaksi Tiga Arah

  • Menangkap hubungan kompleks yang tidak terlihat dalam dua arah saja
  • Menentukan struktur model terbaik yang dapat menjelaskan data
  • Menghindari kesalahan interpretasi akibat mengabaikan variabel ketiga

Pentingnya Penentuan Kategori Referensi

Dalam model log-linear, setiap kategori variabel dikonversi ke dalam parameter log, dan salah satu kategori perlu dijadikan referensi (baseline) dengan nilai parameter 0. Pemilihan referensi penting karena akan memengaruhi cara kita membaca dan menginterpretasikan koefisien model.

Prinsip Umum dalam Menentukan Referensi:

  • Pilih kategori yang paling umum muncul dalam data
  • Pilih kategori yang logis dijadikan dasar perbandingan
  • Konsisten dalam penggunaan referensi pada semua variabel

17.2 Input Data dan Tabel Kontingensi Tiga Arah

##  Data Baru
# Variabel kategori
z.segment <- factor(rep(c("Muda", "Dewasa", "Tua"), each = 4))
x.gender <- factor(rep(c("Laki-laki", "Perempuan"), each = 2, times = 3))
y.preference <- factor(rep(c("A", "B"), times = 6))

# Frekuensi fiktif
counts <- c(95, 45, 88, 67, 120, 55, 115, 72, 101, 38, 93, 60)

# Gabungkan ke dalam data frame
data <- data.frame(
  Segment = z.segment,
  Gender = x.gender,
  Preference = y.preference,
  Freq = counts
)

# Tampilkan data
data
##    Segment    Gender Preference Freq
## 1     Muda Laki-laki          A   95
## 2     Muda Laki-laki          B   45
## 3     Muda Perempuan          A   88
## 4     Muda Perempuan          B   67
## 5   Dewasa Laki-laki          A  120
## 6   Dewasa Laki-laki          B   55
## 7   Dewasa Perempuan          A  115
## 8   Dewasa Perempuan          B   72
## 9      Tua Laki-laki          A  101
## 10     Tua Laki-laki          B   38
## 11     Tua Perempuan          A   93
## 12     Tua Perempuan          B   60
# Data tadi
data <- data.frame(
  Segment = z.segment,
  Gender = x.gender,
  Preference = y.preference,
  Freq = counts
)

# Tabel kontingensi 3 arah
tabel3d <- xtabs(Freq ~ Gender + Preference + Segment, data = data)

# Lihat hasilnya
tabel3d
## , , Segment = Dewasa
## 
##            Preference
## Gender        A   B
##   Laki-laki 120  55
##   Perempuan 115  72
## 
## , , Segment = Muda
## 
##            Preference
## Gender        A   B
##   Laki-laki  95  45
##   Perempuan  88  67
## 
## , , Segment = Tua
## 
##            Preference
## Gender        A   B
##   Laki-laki 101  38
##   Perempuan  93  60

17.3 Penentuan Kategori Referensi

# Pastikan referensi sesuai dan tersedia dalam faktor
data$Gender     <- relevel(data$Gender, ref = "Perempuan")
data$Preference <- relevel(data$Preference, ref = "A")
data$Segment    <- relevel(data$Segment, ref = "Muda")

17.4 Model Saturated dan Homogenous

Dalam analisis model log-linear tiga arah, kita akan membandingkan dua model utama:

  • Model Saturated: memuat semua efek utama, interaksi dua arah, dan interaksi tiga arah
  • Model Homogenous: memuat semua efek utama dan interaksi dua arah saja (tidak ada interaksi tiga arah)

Model Saturated

Model saturated adalah model log-linear paling lengkap, ditulis sebagai:

\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} + \lambda^{XYZ}_{ijk} \]

Artinya: - Memuat semua efek utama (Gender, Preference, Segment) - Memuat semua interaksi dua arah (GenderPreference, GenderSegment, PreferenceSegment) - Memuat interaksi tiga arah (GenderPreference*Segment)

# Model saturated
mod_saturated <- glm(Freq ~ Gender * Preference * Segment,
                     data = data,
                     family = poisson())

# Ringkasan model
summary(mod_saturated)
## 
## Call:
## glm(formula = Freq ~ Gender * Preference * Segment, family = poisson(), 
##     data = data)
## 
## Coefficients:
##                                            Estimate Std. Error z value Pr(>|z|)
## (Intercept)                                4.477337   0.106600  42.001   <2e-16
## GenderLaki-laki                            0.076540   0.147953   0.517   0.6049
## PreferenceB                               -0.272644   0.162139  -1.682   0.0927
## SegmentDewasa                              0.267595   0.141631   1.889   0.0588
## SegmentTua                                 0.055263   0.148716   0.372   0.7102
## GenderLaki-laki:PreferenceB               -0.474570   0.242976  -1.953   0.0508
## GenderLaki-laki:SegmentDewasa             -0.033980   0.197279  -0.172   0.8632
## GenderLaki-laki:SegmentTua                 0.005981   0.206261   0.029   0.9769
## PreferenceB:SegmentDewasa                 -0.195622   0.221074  -0.885   0.3762
## PreferenceB:SegmentTua                    -0.165611   0.231751  -0.715   0.4749
## GenderLaki-laki:PreferenceB:SegmentDewasa  0.162678   0.328842   0.495   0.6208
## GenderLaki-laki:PreferenceB:SegmentTua    -0.064709   0.350248  -0.185   0.8534
##                                              
## (Intercept)                               ***
## GenderLaki-laki                              
## PreferenceB                               .  
## SegmentDewasa                             .  
## SegmentTua                                   
## GenderLaki-laki:PreferenceB               .  
## GenderLaki-laki:SegmentDewasa                
## GenderLaki-laki:SegmentTua                   
## PreferenceB:SegmentDewasa                    
## PreferenceB:SegmentTua                       
## GenderLaki-laki:PreferenceB:SegmentDewasa    
## GenderLaki-laki:PreferenceB:SegmentTua       
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance:  1.0414e+02  on 11  degrees of freedom
## Residual deviance: -4.1336e-28  on  0  degrees of freedom
## AIC: 97.822
## 
## Number of Fisher Scoring iterations: 3

Model Homogenous

Model homogenous adalah model log-linear yang memuat: - Efek utama dari masing-masing variabel (Gender, Preference, Segment) - Seluruh interaksi dua arah antar variabel (Gender:Preference, Gender:Segment, Preference:Segment) - Tanpa interaksi tiga arah (Gender:Preference:Segment)

Model ini lebih sederhana dibandingkan model saturated, dan digunakan untuk menguji apakah interaksi tiga arah benar-benar dibutuhkan untuk menjelaskan hubungan antar variabel.

Bentuk Model:

\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]

Model ini tidak menyertakan \(\lambda^{XYZ}_{ijk}\), sehingga mengasumsikan tidak ada interaksi tiga arah antar ketiga variabel.

# Model homogenous (tanpa interaksi tiga arah)
mod_homogenous <- glm(Freq ~ (Gender + Preference + Segment)^2,
                      data = data,
                      family = poisson(link = "log"))

# Ringkasan hasil model
summary(mod_homogenous)
## 
## Call:
## glm(formula = Freq ~ (Gender + Preference + Segment)^2, family = poisson(link = "log"), 
##     data = data)
## 
## Coefficients:
##                               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                    4.48558    0.09901  45.305  < 2e-16 ***
## GenderLaki-laki                0.06060    0.12786   0.474  0.63554    
## PreferenceB                   -0.29182    0.13540  -2.155  0.03114 *  
## SegmentDewasa                  0.23800    0.12808   1.858  0.06313 .  
## SegmentTua                     0.06514    0.13383   0.487  0.62645    
## GenderLaki-laki:PreferenceB   -0.43164    0.13726  -3.145  0.00166 ** 
## GenderLaki-laki:SegmentDewasa  0.02335    0.15791   0.148  0.88244    
## GenderLaki-laki:SegmentTua    -0.01318    0.16629  -0.079  0.93682    
## PreferenceB:SegmentDewasa     -0.12191    0.16373  -0.745  0.45651    
## PreferenceB:SegmentTua        -0.19331    0.17340  -1.115  0.26493    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 104.13797  on 11  degrees of freedom
## Residual deviance:   0.50529  on  2  degrees of freedom
## AIC: 94.327
## 
## Number of Fisher Scoring iterations: 3

17.5 Goodness-of-Fit & Uji Selisih Deviance

🔹 1. Hitung Deviance & df Kedua Model

# Deviance & df untuk kedua model
mod_saturated$deviance
## [1] -4.133631e-28
mod_saturated$df.residual
## [1] 0
mod_homogenous$deviance
## [1] 0.5052907
mod_homogenous$df.residual
## [1] 2

🔹 2. Hitung Selisih Deviance & df

# Selisih deviance dan df
G2 <- mod_homogenous$deviance - mod_saturated$deviance
df <- mod_homogenous$df.residual - mod_saturated$df.residual

🔹 3. Hitung p-value Uji Chi-Square

# P-value dari uji G2
p_value <- 1 - pchisq(G2, df)
p_value
## [1] 0.7767433

🔹 4. Keputusan

# Output hasil uji
cat("G2 =", G2, "\n")
## G2 = 0.5052907
cat("df =", df, "\n")
## df = 2
cat("p-value =", p_value, "\n")
## p-value = 0.7767433
if (p_value < 0.05) {
  cat("Keputusan: Tolak H0 → Interaksi tiga arah signifikan\n")
} else {
  cat("Keputusan: Gagal tolak H0 → Interaksi tiga arah tidak signifikan\n")
}
## Keputusan: Gagal tolak H0 → Interaksi tiga arah tidak signifikan

BAB 18: Uji Model Interaksi Dua Arah (Homogenous vs Conditional on X)

18.1 Model Conditional on X

Model log-linear conditional on X memasukkan efek utama dan dua interaksi dua arah, yaitu: - Interaksi antara X dan Y - Interaksi antara X dan Z

Namun tidak memasukkan interaksi antara Y dan Z maupun interaksi tiga arah.

Bentuk umum model log-linear conditional on X adalah:

\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} \]

# Model Conditional on X
model_conditional_X <- glm(
  Freq ~ Gender + Preference + Segment +
    Gender:Preference + Gender:Segment,
  family = poisson(link = "log"),
  data = data
)

# Lihat ringkasan model
summary(model_conditional_X)
## 
## Call:
## glm(formula = Freq ~ Gender + Preference + Segment + Gender:Preference + 
##     Gender:Segment, family = poisson(link = "log"), data = data)
## 
## Coefficients:
##                                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                    4.529227   0.088373  51.251  < 2e-16 ***
## GenderLaki-laki                0.050061   0.126153   0.397  0.69150    
## PreferenceB                   -0.397055   0.091671  -4.331 1.48e-05 ***
## SegmentDewasa                  0.187683   0.108624   1.728  0.08402 .  
## SegmentTua                    -0.012987   0.113963  -0.114  0.90927    
## GenderLaki-laki:PreferenceB   -0.431434   0.137166  -3.145  0.00166 ** 
## GenderLaki-laki:SegmentDewasa  0.035460   0.157023   0.226  0.82134    
## GenderLaki-laki:SegmentTua     0.005819   0.165302   0.035  0.97192    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 104.1380  on 11  degrees of freedom
## Residual deviance:   1.7871  on  4  degrees of freedom
## AIC: 91.609
## 
## Number of Fisher Scoring iterations: 3

18.2 Pengujian Ada Tidaknya Interaksi antara Y dan Z (Homogenous vs Conditional on X)

Pengujian ini bertujuan untuk mengetahui apakah interaksi antara variabel Y (Sikap) dan Z (Fundamentalisme) signifikan. Jika interaksi tersebut tidak signifikan, maka model Conditional on X sudah cukup untuk menjelaskan struktur data.


18.2.1 Hipotesis

  • H₀ (Hipotesis Nol): Tidak ada interaksi antara Y dan Z
    \(\lambda^{YZ}_{jk} = 0\)

  • H₁ (Hipotesis Alternatif): Ada interaksi antara Y dan Z
    \(\lambda^{YZ}_{jk} \ne 0\)


18.2.2 Tingkat Signifikansi

Taraf signifikansi yang digunakan:

\[ \alpha = 0{,}05 \]


18.2.3 Statistik Uji

Uji berdasarkan selisih deviance antara model homogenous dan conditional on X:

\[ G^2 = D_{\text{Conditional on X}} - D_{\text{Homogenous}} \]


18.2.4 Daerah Penolakan

Tolak H₀ jika:

\[ G^2 > \chi^2_{(1-\alpha, \text{df})} \]


18.2.5 Perhitungan R

# Model conditional on Gender (tanpa interaksi Y:Z)
model_conditional_X <- glm(
  Freq ~ Gender + Preference + Segment +
    Gender:Preference + Gender:Segment,
  data = data,
  family = poisson(link = "log")
)

# Bandingkan dengan model homogenous (semua interaksi 2 arah)
model_homogenous <- glm(
  Freq ~ (Gender + Preference + Segment)^2,
  data = data,
  family = poisson(link = "log")
)

# Hitung G² dan p-value
G2 <- model_conditional_X$deviance - model_homogenous$deviance
df <- model_conditional_X$df.residual - model_homogenous$df.residual
pval <- 1 - pchisq(G2, df)
chi_critical <- qchisq(0.95, df)

# Tampilkan hasil
cat("G² =", G2, "\n")
## G² = 1.28185
cat("df =", df, "\n")
## df = 2
cat("p-value =", pval, "\n")
## p-value = 0.5268049
cat("Chi-square kritis =", chi_critical, "\n")
## Chi-square kritis = 5.991465

##18.2.6 Keputusan dan Kesimpulan

if (G2 > chi_critical) {
  cat("Keputusan: Tolak H0 → Interaksi Preference dan Segment signifikan\n")
  cat("Kesimpulan: Model homogenous lebih sesuai.\n")
} else {
  cat("Keputusan: Gagal tolak H0 → Interaksi Preference dan Segment tidak signifikan\n")
  cat("Kesimpulan: Model conditional on Gender sudah cukup.\n")
}
## Keputusan: Gagal tolak H0 → Interaksi Preference dan Segment tidak signifikan
## Kesimpulan: Model conditional on Gender sudah cukup.

18.3 Pengujian Selisih Deviance (Conditional on X vs Homogenous)

Pada bagian ini, kita akan menampilkan kembali perhitungan statistik uji selisih deviance antara model conditional on Gender dan model homogenous, secara eksplisit dan sistematis.


18.3.1 Tabel Perbandingan Deviance

# Tabel perbandingan deviance dan df
tabel_dev <- data.frame(
  Model = c("Conditional on Gender", "Homogenous"),
  Deviance = c(model_conditional_X$deviance, model_homogenous$deviance),
  df = c(model_conditional_X$df.residual, model_homogenous$df.residual)
)
tabel_dev
##                   Model  Deviance df
## 1 Conditional on Gender 1.7871408  4
## 2            Homogenous 0.5052907  2
# Hitung selisih deviance dan df
G2 <- model_conditional_X$deviance - model_homogenous$deviance
df <- model_conditional_X$df.residual - model_homogenous$df.residual
p_value <- 1 - pchisq(G2, df)
chi_critical <- qchisq(0.95, df)

# Tampilkan hasil lengkap
hasil <- data.frame(
  `G² (ΔDeviance)` = round(G2, 3),
  `df` = df,
  `Chi-square kritis (α=0.05)` = round(chi_critical, 3),
  `p-value` = round(p_value, 4),
  `Keputusan` = ifelse(G2 > chi_critical, "Tolak H₀", "Gagal Tolak H₀")
)

hasil
##   G...ΔDeviance. df Chi.square.kritis..α.0.05. p.value      Keputusan
## 1          1.282  2                      5.991  0.5268 Gagal Tolak H₀

###18.3.3 Interpretasi

  • Tolak H₀ → Interaksi Preference dan Segment signifikan → Model homogenous lebih tepat.
  • Gagal Tolak H₀ → Interaksi tidak signifikan → Model conditional on Gender sudah cukup.

BAB 19: Uji Model Interaksi Dua Arah (Conditional on Y vs Homogenous)

19.1 Model Conditional on Y

Model Conditional on Y memuat: - Efek utama semua variabel (Gender, Preference, Segment) - Interaksi antara Preference:Gender (Y:X) - Interaksi antara Preference:Segment (Y:Z)

Model ini tidak memuat interaksi antara Gender dan Segment (X:Z) dan tidak memuat interaksi tiga arah. Tujuannya adalah untuk melihat apakah interaksi antara Gender dan Segment (X:Z) bisa diabaikan jika kita mengkondisikan pada Y (Preference).


Bentuk Model Log-Linear:

\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{YZ}_{jk} \]


Implementasi di R

# Model Conditional on Y
model_conditional_Y <- glm(
  Freq ~ Gender + Preference + Segment +
    Gender:Preference + Preference:Segment,
  data = data,
  family = poisson(link = "log")
)

# Ringkasan hasil model
summary(model_conditional_Y)
## 
## Call:
## glm(formula = Freq ~ Gender + Preference + Segment + Gender:Preference + 
##     Preference:Segment, family = poisson(link = "log"), data = data)
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                  4.48311    0.08491  52.801  < 2e-16 ***
## GenderLaki-laki              0.06538    0.08089   0.808  0.41891    
## PreferenceB                 -0.29139    0.13489  -2.160  0.03075 *  
## SegmentDewasa                0.25010    0.09859   2.537  0.01119 *  
## SegmentTua                   0.05837    0.10305   0.566  0.57109    
## GenderLaki-laki:PreferenceB -0.43143    0.13717  -3.145  0.00166 ** 
## PreferenceB:SegmentDewasa   -0.12441    0.16286  -0.764  0.44491    
## PreferenceB:SegmentTua      -0.19190    0.17249  -1.113  0.26589    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 104.13797  on 11  degrees of freedom
## Residual deviance:   0.56106  on  4  degrees of freedom
## AIC: 90.383
## 
## Number of Fisher Scoring iterations: 3

19.2 Pengujian Ada Tidaknya Interaksi antara Gender dan Segment (Conditional on Y vs Homogenous)

Pengujian ini bertujuan untuk mengevaluasi apakah terdapat interaksi antara Gender (X) dan Segment (Z). Jika interaksi tidak signifikan, maka model conditional on Y (Preference) sudah cukup.


19.2.1 Hipotesis

  • H₀ (Hipotesis Nol): Tidak ada interaksi antara Gender dan Segment
    \(\lambda^{XZ}_{ik} = 0\)

  • H₁ (Hipotesis Alternatif): Ada interaksi antara Gender dan Segment
    \(\lambda^{XZ}_{ik} \ne 0\)


19.2.2 Tingkat Signifikansi

\[ \alpha = 0{,}05 \]


19.2.3 Statistik Uji

Statistik uji G² dihitung berdasarkan selisih deviance:

\[ G^2 = D_{\text{Conditional on Y}} - D_{\text{Homogenous}} \]


19.2.4 Daerah Penolakan

Tolak H₀ jika:

\[ G^2 > \chi^2_{(1 - \alpha, df)} \]


19.2.5 Perhitungan R

# Hitung G² dan p-value untuk pengujian Conditional on Y vs Homogenous
G2 <- model_conditional_Y$deviance - model_homogenous$deviance
df <- model_conditional_Y$df.residual - model_homogenous$df.residual
p_value <- 1 - pchisq(G2, df)
chi_critical <- qchisq(0.95, df)

# Tampilkan hasil
cat("G² =", G2, "\n")
## G² = 0.05577147
cat("df =", df, "\n")
## df = 2
cat("Chi-square kritis =", chi_critical, "\n")
## Chi-square kritis = 5.991465
cat("p-value =", p_value, "\n")
## p-value = 0.9724995

Keputusan dan Kesimpulan

if (G2 > chi_critical) {
  cat("Keputusan: Tolak H₀ → Interaksi Gender dan Segment signifikan\n")
  cat("Kesimpulan: Model homogenous dibutuhkan.\n")
} else {
  cat("Keputusan: Gagal tolak H₀ → Interaksi Gender dan Segment tidak signifikan\n")
  cat("Kesimpulan: Model conditional on Preference sudah cukup.\n")
}
## Keputusan: Gagal tolak H₀ → Interaksi Gender dan Segment tidak signifikan
## Kesimpulan: Model conditional on Preference sudah cukup.

BAB 20: Uji Model Interaksi Dua Arah (Conditional on Z vs Homogenous)

20.1 Model Conditional on Z

Model Conditional on Z (Segment) memuat: - Efek utama semua variabel (Gender, Preference, Segment) - Interaksi Gender:Segment (X:Z) - Interaksi Preference:Segment (Y:Z)

Model ini tidak memuat interaksi antara Gender dan Preference (X:Y) dan juga tidak memuat interaksi tiga arah.


Bentuk Model Log-Linear:

\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]


Implementasi di R

# Model Conditional on Z
  model_conditional_Z <- glm(
  Freq ~ Gender + Preference + Segment +
    Gender:Segment + Preference:Segment,
  data = data,
  family = poisson(link = "log")
)

# Ringkasan hasil model
summary(model_conditional_Z)
## 
## Call:
## glm(formula = Freq ~ Gender + Preference + Segment + Gender:Segment + 
##     Preference:Segment, family = poisson(link = "log"), data = data)
## 
## Coefficients:
##                                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                    4.565936   0.092338  49.448  < 2e-16 ***
## GenderLaki-laki               -0.101783   0.116595  -0.873    0.383    
## PreferenceB                   -0.490987   0.119971  -4.093 4.27e-05 ***
## SegmentDewasa                  0.233114   0.123963   1.881    0.060 .  
## SegmentTua                     0.055606   0.129585   0.429    0.668    
## GenderLaki-laki:SegmentDewasa  0.035460   0.157023   0.226    0.821    
## GenderLaki-laki:SegmentTua     0.005819   0.165302   0.035    0.972    
## PreferenceB:SegmentDewasa     -0.124411   0.162857  -0.764    0.445    
## PreferenceB:SegmentTua        -0.191903   0.172487  -1.113    0.266    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 104.138  on 11  degrees of freedom
## Residual deviance:  10.485  on  3  degrees of freedom
## AIC: 102.31
## 
## Number of Fisher Scoring iterations: 4

20.2 Pengujian Ada Tidaknya Interaksi antara Gender dan Preference (Conditional on Z vs Homogenous)

Pengujian ini bertujuan untuk mengevaluasi apakah terdapat interaksi antara Gender (X) dan Preference (Y). Jika interaksi tidak signifikan, maka model Conditional on Z (Segment) sudah cukup.


20.2.1 Hipotesis

  • H₀ (Hipotesis Nol): Tidak ada interaksi antara Gender dan Preference
    \(\lambda^{XY}_{ij} = 0\)

  • H₁ (Hipotesis Alternatif): Ada interaksi antara Gender dan Preference
    \(\lambda^{XY}_{ij} \ne 0\)


20.2.2 Tingkat Signifikansi

\[ \alpha = 0{,}05 \]


20.2.3 Statistik Uji

Statistik uji G² dihitung berdasarkan selisih deviance:

\[ G^2 = D_{\text{Conditional on Z}} - D_{\text{Homogenous}} \]


20.2.4 Daerah Penolakan

Tolak H₀ jika:

\[ G^2 > \chi^2_{(1 - \alpha, df)} \]


20.2.5 Perhitungan R

# Hitung G² dan p-value
G2 <- model_conditional_Z$deviance - model_homogenous$deviance
df <- model_conditional_Z$df.residual - model_homogenous$df.residual
p_value <- 1 - pchisq(G2, df)
chi_critical <- qchisq(0.95, df)

# Tampilkan hasil
cat("G² =", G2, "\n")
## G² = 9.979731
cat("df =", df, "\n")
## df = 1
cat("Chi-square kritis =", chi_critical, "\n")
## Chi-square kritis = 3.841459
cat("p-value =", p_value, "\n")
## p-value = 0.001582728

20.2.6 Keputusan dan Kesimpulan

if (G2 > chi_critical) {
  cat("Keputusan: Tolak H₀ → Interaksi Gender dan Preference signifikan\n")
  cat("Kesimpulan: Model homogenous dibutuhkan.\n")
} else {
  cat("Keputusan: Gagal tolak H₀ → Interaksi Gender dan Preference tidak signifikan\n")
  cat("Kesimpulan: Model conditional on Segment sudah cukup.\n")
}
## Keputusan: Tolak H₀ → Interaksi Gender dan Preference signifikan
## Kesimpulan: Model homogenous dibutuhkan.

BAB 21: Pemilihan Model Terbaik

21.1 Ringkasan Model Log-Linier

Pada analisis ini telah dibangun lima model log-linear sebagai berikut:

Model Struktur Interaksi
Saturated Semua efek utama, interaksi 2 arah, dan 3 arah
Homogenous Semua efek utama dan interaksi 2 arah saja
Conditional on Gender (X) Efek utama + interaksi X:Y dan X:Z
Conditional on Preference (Y) Efek utama + interaksi Y:X dan Y:Z
Conditional on Segment (Z) Efek utama + interaksi Z:X dan Z:Y

Setiap model mengasumsikan struktur ketergantungan antar variabel yang berbeda, dan akan dibandingkan berdasarkan Goodness-of-Fit dan kesederhanaan struktur model.


21.2 Ringkasan Pengujian Interaksi 3 Arah dan 2 Arah

Berikut adalah hasil pengujian deviance antar model:

# Buat ringkasan uji deviance dalam satu tabel
uji_model <- data.frame(
  Perbandingan = c(
    "Saturated vs Homogenous",
    "Homogenous vs Conditional on X",
    "Homogenous vs Conditional on Y",
    "Homogenous vs Conditional on Z"
  ),
  G2 = c(
    mod_homogenous$deviance - mod_saturated$deviance,
    model_conditional_X$deviance - mod_homogenous$deviance,
    model_conditional_Y$deviance - mod_homogenous$deviance,
    model_conditional_Z$deviance - mod_homogenous$deviance
  ),
  df = c(
    mod_homogenous$df.residual - mod_saturated$df.residual,
    model_conditional_X$df.residual - mod_homogenous$df.residual,
    model_conditional_Y$df.residual - mod_homogenous$df.residual,
    model_conditional_Z$df.residual - mod_homogenous$df.residual
  )
)

# Tambahkan p-value
uji_model$p_value <- 1 - pchisq(uji_model$G2, uji_model$df)

# Tambahkan keputusan
uji_model$Keputusan <- ifelse(uji_model$p_value < 0.05, "Tolak H₀", "Gagal Tolak H₀")

uji_model
##                     Perbandingan         G2 df     p_value      Keputusan
## 1        Saturated vs Homogenous 0.50529071  2 0.776743301 Gagal Tolak H₀
## 2 Homogenous vs Conditional on X 1.28185013  2 0.526804871 Gagal Tolak H₀
## 3 Homogenous vs Conditional on Y 0.05577147  2 0.972499484 Gagal Tolak H₀
## 4 Homogenous vs Conditional on Z 9.97973052  1 0.001582728       Tolak H₀

21.3 Kesimpulan Pemilihan Model Terbaik

Berdasarkan hasil pengujian selisih deviance pada model log-linear, berikut adalah kesimpulan akhir:

  • Uji Saturated vs Homogenous
    → Gagal tolak H₀
    → Artinya: interaksi tiga arah tidak signifikan → model homogenous cukup

  • Uji Homogenous vs Conditional on X
    → Gagal tolak H₀
    → Artinya: model conditional on X cukup baik

  • Uji Homogenous vs Conditional on Y
    → Gagal tolak H₀
    → Artinya: model conditional on Y cukup baik

  • Uji Homogenous vs Conditional on Z
    → Tolak H₀
    → Artinya: interaksi Gender dan Preference signifikan → model conditional on Z terlalu sederhana


Kesimpulan:

Model homogenous sudah cukup menjelaskan data karena interaksi tiga arah tidak signifikan.

Dari tiga model conditional:

  • Model conditional on X (Gender) dan model conditional on Y (Preference) tidak berbeda signifikan dari homogenous.
  • Tetapi model conditional on Z (Segment) ditolak, artinya terlalu sederhana.

Maka, model terbaik yang dipilih adalah:

Model Conditional on Gender (X)
karena: - Tidak berbeda signifikan dari model homogenous - Lebih sederhana dari model homogenous - Lebih masuk akal secara substantif (misalnya dalam konteks sosial, Gender memengaruhi hubungan antara Preference dan Segment)

Model ini akan digunakan pada bab selanjutnya untuk interpretasi dan estimasi nilai dugaan.

BAB 22: Model Terbaik

22.1 Pemilihan Model

Berdasarkan hasil uji deviance dan pertimbangan struktur model yang lebih sederhana, model terbaik yang dipilih adalah:

Model Conditional on Gender (X)

Model ini memasukkan: - Efek utama: Gender, Preference, Segment - Interaksi dua arah: Gender × Preference dan Gender × Segment - Tidak memasukkan interaksi Preference × Segment maupun interaksi tiga arah


22.2 Bentuk Umum Model Log-Linear

Model log-linear dapat dituliskan sebagai:

\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} \]

Keterangan: - \(\mu_{ijk}\): nilai harapan frekuensi untuk kombinasi ke-i (Gender), ke-j (Preference), dan ke-k (Segment) - \(\lambda\): intercept - \(\lambda^X_i\): efek utama Gender ke-i - \(\lambda^Y_j\): efek utama Preference ke-j - \(\lambda^Z_k\): efek utama Segment ke-k - \(\lambda^{XY}_{ij}\): efek interaksi antara Gender dan Preference - \(\lambda^{XZ}_{ik}\): efek interaksi antara Gender dan Segment


22.3 Implementasi Model Terbaik di R

# Model terbaik: Conditional on Gender (X)
model_terbaik <- glm(
  Freq ~ Gender + Preference + Segment +
    Gender:Preference + Gender:Segment,
  data = data,
  family = poisson(link = "log")
)

# Ringkasan model terbaik
summary(model_terbaik)
## 
## Call:
## glm(formula = Freq ~ Gender + Preference + Segment + Gender:Preference + 
##     Gender:Segment, family = poisson(link = "log"), data = data)
## 
## Coefficients:
##                                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                    4.529227   0.088373  51.251  < 2e-16 ***
## GenderLaki-laki                0.050061   0.126153   0.397  0.69150    
## PreferenceB                   -0.397055   0.091671  -4.331 1.48e-05 ***
## SegmentDewasa                  0.187683   0.108624   1.728  0.08402 .  
## SegmentTua                    -0.012987   0.113963  -0.114  0.90927    
## GenderLaki-laki:PreferenceB   -0.431434   0.137166  -3.145  0.00166 ** 
## GenderLaki-laki:SegmentDewasa  0.035460   0.157023   0.226  0.82134    
## GenderLaki-laki:SegmentTua     0.005819   0.165302   0.035  0.97192    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 104.1380  on 11  degrees of freedom
## Residual deviance:   1.7871  on  4  degrees of freedom
## AIC: 91.609
## 
## Number of Fisher Scoring iterations: 3

BAB 23: Interpretasi Koefisien Model Terbaik

23.1 Interpretasi Koefisien Model Terbaik

Model terbaik yang digunakan adalah model conditional on Gender (X), dengan struktur:

\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} \]


Estimasi Parameter Model

# Tampilkan koefisien model
coef(summary(model_terbaik))
##                                   Estimate Std. Error     z value     Pr(>|z|)
## (Intercept)                    4.529226809 0.08837295 51.25128278 0.000000e+00
## GenderLaki-laki                0.050060629 0.12615286  0.39682515 6.914964e-01
## PreferenceB                   -0.397054630 0.09167059 -4.33131961 1.482183e-05
## SegmentDewasa                  0.187683500 0.10862409  1.72782571 8.401948e-02
## SegmentTua                    -0.012987196 0.11396293 -0.11395983 9.092696e-01
## GenderLaki-laki:PreferenceB   -0.431433899 0.13716562 -3.14535017 1.658881e-03
## GenderLaki-laki:SegmentDewasa  0.035460051 0.15702334  0.22582663 8.213363e-01
## GenderLaki-laki:SegmentTua     0.005818706 0.16530162  0.03520054 9.719198e-01
# Ubah ke odds ratio
exp(coef(model_terbaik))
##                   (Intercept)               GenderLaki-laki 
##                    92.6868687                     1.0513348 
##                   PreferenceB                 SegmentDewasa 
##                     0.6722973                     1.2064516 
##                    SegmentTua   GenderLaki-laki:PreferenceB 
##                     0.9870968                     0.6495770 
## GenderLaki-laki:SegmentDewasa    GenderLaki-laki:SegmentTua 
##                     1.0360963                     1.0058357

Berikut adalah hasil transformasi eksponensial dari koefisien model (dalam bentuk odds ratio):

Parameter Odds Ratio Interpretasi
(Intercept) 92.69 Nilai dugaan frekuensi pada kategori referensi (Gender = Perempuan, Preference = A, Segment = Muda)
GenderLaki-laki 1.05 Laki-laki memiliki peluang 1.05 kali frekuensi perempuan (tidak signifikan)
PreferenceB 0.67 Responden dengan preferensi B memiliki frekuensi 33% lebih rendah dari preferensi A
SegmentDewasa 1.21 Segmen Dewasa memiliki frekuensi 21% lebih tinggi dari segmen Muda
SegmentTua 0.99 Segmen Tua hampir sama frekuensinya dengan segmen Muda (tidak berbeda nyata)
GenderLaki-laki:PreferenceB 0.65 Kombinasi Laki-laki & Preferensi B memiliki frekuensi 35% lebih rendah dari Perempuan & Preferensi A
GenderLaki-laki:SegmentDewasa 1.04 Kombinasi Laki-laki & Segmen Dewasa memiliki frekuensi 4% lebih tinggi dari Perempuan & Segmen Muda
GenderLaki-laki:SegmentTua 1.01 Kombinasi Laki-laki & Segmen Tua memiliki frekuensi hampir sama dengan baseline

Catatan:

  • Kategori referensi adalah:
    • Gender = Perempuan
    • Preference = A
    • Segment = Muda
  • Semua interpretasi dilakukan relatif terhadap referensi.
  • Jika odds ratio > 1 → frekuensi lebih tinggi dari referensi.
  • Jika odds ratio < 1 → frekuensi lebih rendah dari referensi.
  • Jika ≈ 1 → tidak ada perbedaan berarti.

BAB 24: NILAI DUGAAN MODEL TERBAIK

24.1 Nilai Fitted dari Model Terbaik

Menampilkan nilai dugaan (fitted values) dari model terbaik

# Fitted values dari model terbaik
data.frame(
  Segment = z.fund,
  Gender = x.sex,
  Preference = y.fav,
  Observasi = counts,
  Fitted = round(model_terbaik$fitted.values, 2)
)
##        Segment Gender Preference Observasi Fitted
## 1      liberal      F      tidak        95  97.44
## 2      moderat      F      favor        45  42.56
## 3  fundamental      F      tidak        88  92.69
## 4      liberal      F      favor        67  62.31
## 5      moderat      F      tidak       120 121.81
## 6  fundamental      F      favor        55  53.19
## 7      liberal      M      tidak       115 111.82
## 8      moderat      M      favor        72  75.18
## 9  fundamental      M      tidak       101  96.75
## 10     liberal      M      favor        38  42.25
## 11     moderat      M      tidak        93  91.49
## 12 fundamental      M      favor        60  61.51
data$Fitted <- round(fitted(model_terbaik), 2)
knitr::kable(data, caption = "Tabel Observasi dan Nilai Dugaan dari Model Terbaik")
Tabel Observasi dan Nilai Dugaan dari Model Terbaik
Segment Gender Preference Freq Fitted
Muda Laki-laki A 95 97.44
Muda Laki-laki B 45 42.56
Muda Perempuan A 88 92.69
Muda Perempuan B 67 62.31
Dewasa Laki-laki A 120 121.81
Dewasa Laki-laki B 55 53.19
Dewasa Perempuan A 115 111.82
Dewasa Perempuan B 72 75.18
Tua Laki-laki A 101 96.75
Tua Laki-laki B 38 42.25
Tua Perempuan A 93 91.49
Tua Perempuan B 60 61.51

24.2 Perhitungan Manual Nilai Dugaan (Fitted Value)

Model: Conditional on Gender

Model terbaik memuat: - Efek utama: Gender, Preference, Segment - Interaksi dua arah: Gender:Preference, Gender:Segment

Formulasi model:

\[ \log(\mu_{ijk}) = \lambda + \lambda^{G}_{i} + \lambda^{P}_{j} + \lambda^{S}_{k} + \lambda^{GP}_{ij} + \lambda^{GS}_{ik} \]

24.2.1 Koefisien Model

# Simpan koefisien dari summary(model_terbaik)
coefs <- coef(model_terbaik)

coefs
##                   (Intercept)               GenderLaki-laki 
##                   4.529226809                   0.050060629 
##                   PreferenceB                 SegmentDewasa 
##                  -0.397054630                   0.187683500 
##                    SegmentTua   GenderLaki-laki:PreferenceB 
##                  -0.012987196                  -0.431433899 
## GenderLaki-laki:SegmentDewasa    GenderLaki-laki:SegmentTua 
##                   0.035460051                   0.005818706
# Buat data frame hasil manual
perhitungan_manual <- data.frame(
  Segment = c("Muda", "Muda", "Muda", "Muda"),
  Gender = c("Laki-laki", "Laki-laki", "Perempuan", "Perempuan"),
  Preference = c("A", "B", "A", "B"),
  log_mu = c(
    4.529227 + 0.050061,
    4.529227 + 0.050061 - 0.397055 - 0.431434,
    4.529227,
    4.529227 - 0.397055
  )
)

# Hitung nilai dugaan
perhitungan_manual$Fitted <- round(exp(perhitungan_manual$log_mu), 2)

knitr::kable(perhitungan_manual, caption = "Tabel Perhitungan Manual Nilai Dugaan")
Tabel Perhitungan Manual Nilai Dugaan
Segment Gender Preference log_mu Fitted
Muda Laki-laki A 4.579288 97.44
Muda Laki-laki B 3.750799 42.56
Muda Perempuan A 4.529227 92.69
Muda Perempuan B 4.132172 62.31

BAB 25 : Studi Kasus Real

25.1 Studi Kasus 1

Latar Belakang

Kesehatan adalah hak dasar setiap warga negara, dan kualitas pelayanan kesehatan sangat bergantung pada ketersediaan serta distribusi tenaga kesehatan yang merata. Namun, di berbagai daerah di Indonesia, termasuk di Provinsi Jawa Barat, masih ditemukan ketimpangan jumlah tenaga kesehatan baik dari sisi kategori profesi (seperti dokter umum, spesialis, perawat, dan bidan) maupun dari aspek jenis kelamin.

Sebagai provinsi dengan jumlah penduduk terbesar di Indonesia, Jawa Barat menghadapi tantangan besar dalam pemenuhan kebutuhan tenaga kesehatan di rumah sakit. Dalam konteks perencanaan SDM kesehatan, data distribusi berdasarkan jenis kelamin dan kategori tenaga medis sangat penting untuk:

  • Mengetahui kecenderungan gender dalam pilihan profesi medis
  • Mengukur potensi kesenjangan akses layanan medis spesifik
  • Menyusun kebijakan yang lebih inklusif dan tepat sasaran
  • Menyeimbangkan distribusi antara kota dan kabupaten

Data real dari Open Data Jabar tahun 2023 ini memberikan informasi faktual tentang jumlah tenaga kesehatan yang bekerja di rumah sakit berdasarkan jenis kelamin dan kategori profesi di 27 kabupaten/kota.


Tujuan Analisis

Analisis ini bertujuan untuk mengeksplorasi hubungan antara jenis kelamin dan kategori tenaga kesehatan secara umum dan pada beberapa wilayah berbeda. Beberapa metode analisis data kategorik yang diterapkan:

  • Tabel Kontingensi 2 Arah
  • Tabel Kontingensi 3 Arah
  • Uji Independensi
  • Uji Cochran-Mantel-Haenszel (CMH)

Import dan Persiapan Data

library(dplyr)
library(ggplot2)
library(vcdExtra)
## Warning: package 'vcdExtra' was built under R version 4.3.3
## Loading required package: gnm
## Warning: package 'gnm' was built under R version 4.3.3
## 
## Attaching package: 'vcdExtra'
## The following object is masked from 'package:dplyr':
## 
##     summarise
## The following object is masked from 'package:epitools':
## 
##     expand.table
# Import data
data <- read.csv("Data-Real-ADK.csv", sep = ";", dec = ",", header = TRUE)
head(data)
##     Provinsi     Kabupaten.Kota   Kategori.Nakes Jenis.Kelamin Jumlah Tahun
## 1 JAWA BARAT    KABUPATEN BOGOR DOKTER SPESIALIS     LAKI-LAKI    415  2023
## 2 JAWA BARAT    KABUPATEN BOGOR DOKTER SPESIALIS     PEREMPUAN    321  2023
## 3 JAWA BARAT KABUPATEN SUKABUMI DOKTER SPESIALIS     LAKI-LAKI     92  2023
## 4 JAWA BARAT KABUPATEN SUKABUMI DOKTER SPESIALIS     PEREMPUAN     66  2023
## 5 JAWA BARAT  KABUPATEN CIANJUR DOKTER SPESIALIS     LAKI-LAKI     54  2023
## 6 JAWA BARAT  KABUPATEN CIANJUR DOKTER SPESIALIS     PEREMPUAN     30  2023
# Cek struktur data
str(data)
## 'data.frame':    216 obs. of  6 variables:
##  $ Provinsi      : chr  "JAWA BARAT" "JAWA BARAT" "JAWA BARAT" "JAWA BARAT" ...
##  $ Kabupaten.Kota: chr  "KABUPATEN BOGOR" "KABUPATEN BOGOR" "KABUPATEN SUKABUMI" "KABUPATEN SUKABUMI" ...
##  $ Kategori.Nakes: chr  "DOKTER SPESIALIS" "DOKTER SPESIALIS" "DOKTER SPESIALIS" "DOKTER SPESIALIS" ...
##  $ Jenis.Kelamin : chr  "LAKI-LAKI" "PEREMPUAN" "LAKI-LAKI" "PEREMPUAN" ...
##  $ Jumlah        : int  415 321 92 66 54 30 120 99 55 29 ...
##  $ Tahun         : int  2023 2023 2023 2023 2023 2023 2023 2023 2023 2023 ...
#Ringkasan Variabel Kategorik
table(data$Kategori.Nakes)
## 
##           DOKTER GIGI DOKTER GIGI SPESIALIS      DOKTER SPESIALIS 
##                    54                    54                    54 
##           DOKTER UMUM 
##                    54
table(data$Jenis.Kelamin)
## 
## LAKI-LAKI PEREMPUAN 
##       108       108
table(data$Kabupaten.Kota)
## 
##       KABUPATEN BANDUNG KABUPATEN BANDUNG BARAT        KABUPATEN BEKASI 
##                       8                       8                       8 
##         KABUPATEN BOGOR        KABUPATEN CIAMIS       KABUPATEN CIANJUR 
##                       8                       8                       8 
##       KABUPATEN CIREBON         KABUPATEN GARUT     KABUPATEN INDRAMAYU 
##                       8                       8                       8 
##      KABUPATEN KARAWANG      KABUPATEN KUNINGAN    KABUPATEN MAJALENGKA 
##                       8                       8                       8 
##   KABUPATEN PANGANDARAN    KABUPATEN PURWAKARTA        KABUPATEN SUBANG 
##                       8                       8                       8 
##      KABUPATEN SUKABUMI      KABUPATEN SUMEDANG   KABUPATEN TASIKMALAYA 
##                       8                       8                       8 
##            KOTA BANDUNG             KOTA BANJAR             KOTA BEKASI 
##                       8                       8                       8 
##              KOTA BOGOR             KOTA CIMAHI            KOTA CIREBON 
##                       8                       8                       8 
##              KOTA DEPOK           KOTA SUKABUMI        KOTA TASIKMALAYA 
##                       8                       8                       8
ggplot(data, aes(x = Kategori.Nakes, y = Jumlah, fill = Jenis.Kelamin)) +
  geom_col(position = "dodge") +
  labs(
    title = "Distribusi Tenaga Kesehatan Berdasarkan Jenis Kelamin dan Kategori",
    x = "Kategori Tenaga Kesehatan",
    y = "Jumlah"
  ) +
  theme_minimal() +
  coord_flip()

Analisis 1: Tabel Kontingensi Dua Arah

tab_2d <- xtabs(Jumlah ~ Jenis.Kelamin + Kategori.Nakes, data = data)
tab_2d
##              Kategori.Nakes
## Jenis.Kelamin DOKTER GIGI DOKTER GIGI SPESIALIS DOKTER SPESIALIS DOKTER UMUM
##     LAKI-LAKI         242                   207             4056        3033
##     PEREMPUAN         763                   393             3179        4293

Uji Chi-Square

chi_result <- chisq.test(tab_2d)
chi_result
## 
##  Pearson's Chi-squared test
## 
## data:  tab_2d
## X-squared = 579.91, df = 3, p-value < 2.2e-16

\[ \chi^2 = 579.91, \quad \text{df} = 3, \quad p\text{-value} < 2.2 \times 10^{-16} \]

Interpretasi: Terdapat hubungan yang signifikan antara jenis kelamin dan kategori tenaga kesehatan.

#Ukuran Kekuatan Hubungan (Cramer’s V)

library(vcd)
assocstats(tab_2d)
##                     X^2 df P(> X^2)
## Likelihood Ratio 593.14  3        0
## Pearson          579.91  3        0
## 
## Phi-Coefficient   : NA 
## Contingency Coeff.: 0.186 
## Cramer's V        : 0.189

Analisis 2: Tabel Kontingensi Tiga Arah dan Uji CMH

data_subset <- data %>% 
  filter(Kabupaten.Kota %in% c("KABUPATEN BANDUNG", "KABUPATEN BOGOR", "KABUPATEN GARUT"))

tab_3d <- xtabs(Jumlah ~ Jenis.Kelamin + Kategori.Nakes + Kabupaten.Kota, data = data_subset)
tab_3d
## , , Kabupaten.Kota = KABUPATEN BANDUNG
## 
##              Kategori.Nakes
## Jenis.Kelamin DOKTER GIGI DOKTER GIGI SPESIALIS DOKTER SPESIALIS DOKTER UMUM
##     LAKI-LAKI          10                     0              120          95
##     PEREMPUAN          35                    12               99         156
## 
## , , Kabupaten.Kota = KABUPATEN BOGOR
## 
##              Kategori.Nakes
## Jenis.Kelamin DOKTER GIGI DOKTER GIGI SPESIALIS DOKTER SPESIALIS DOKTER UMUM
##     LAKI-LAKI          14                    19              415         194
##     PEREMPUAN          62                    27              321         374
## 
## , , Kabupaten.Kota = KABUPATEN GARUT
## 
##              Kategori.Nakes
## Jenis.Kelamin DOKTER GIGI DOKTER GIGI SPESIALIS DOKTER SPESIALIS DOKTER UMUM
##     LAKI-LAKI           3                     0               55          55
##     PEREMPUAN           7                     2               29          44
CMHtest(tab_3d)
## $`Kabupaten.Kota:KABUPATEN BANDUNG`
## Cochran-Mantel-Haenszel Statistics for Jenis.Kelamin by Kategori.Nakes 
##  in stratum Kabupaten.Kota:KABUPATEN BANDUNG 
## 
##                  AltHypothesis   Chisq Df       Prob
## cor        Nonzero correlation  1.3191  1 2.5075e-01
## rmeans  Row mean scores differ  1.3191  1 2.5075e-01
## cmeans  Col mean scores differ 32.1024  3 4.9797e-07
## general    General association 32.1024  3 4.9797e-07
## 
## 
## $`Kabupaten.Kota:KABUPATEN BOGOR`
## Cochran-Mantel-Haenszel Statistics for Jenis.Kelamin by Kategori.Nakes 
##  in stratum Kabupaten.Kota:KABUPATEN BOGOR 
## 
##                  AltHypothesis   Chisq Df       Prob
## cor        Nonzero correlation  1.8825  1 1.7005e-01
## rmeans  Row mean scores differ  1.8825  1 1.7005e-01
## cmeans  Col mean scores differ 87.4207  3 7.8429e-19
## general    General association 87.4207  3 7.8429e-19
## 
## 
## $`Kabupaten.Kota:KABUPATEN GARUT`
## Cochran-Mantel-Haenszel Statistics for Jenis.Kelamin by Kategori.Nakes 
##  in stratum Kabupaten.Kota:KABUPATEN GARUT 
## 
##                  AltHypothesis   Chisq Df     Prob
## cor        Nonzero correlation 0.70804  1 0.400096
## rmeans  Row mean scores differ 0.70804  1 0.400096
## cmeans  Col mean scores differ 8.10577  3 0.043876
## general    General association 8.10577  3 0.043876

Model GLM Poisson

model_glm <- glm(Jumlah ~ Jenis.Kelamin + Kategori.Nakes + Kabupaten.Kota,
                 data = data_subset, family = poisson(link = "log"))
summary(model_glm)
## 
## Call:
## glm(formula = Jumlah ~ Jenis.Kelamin + Kategori.Nakes + Kabupaten.Kota, 
##     family = poisson(link = "log"), data = data_subset)
## 
## Coefficients:
##                                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                          2.68537    0.09808  27.378  < 2e-16 ***
## Jenis.KelaminPEREMPUAN               0.17550    0.04332   4.051 5.10e-05 ***
## Kategori.NakesDOKTER GIGI SPESIALIS -0.78085    0.15589  -5.009 5.47e-07 ***
## Kategori.NakesDOKTER SPESIALIS       2.07082    0.09271  22.335  < 2e-16 ***
## Kategori.NakesDOKTER UMUM            1.94700    0.09340  20.847  < 2e-16 ***
## Kabupaten.KotaKABUPATEN BOGOR        0.99543    0.05098  19.526  < 2e-16 ***
## Kabupaten.KotaKABUPATEN GARUT       -0.99420    0.08382 -11.861  < 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: 3053.00  on 23  degrees of freedom
## Residual deviance:  178.59  on 17  degrees of freedom
## AIC: 315.51
## 
## Number of Fisher Scoring iterations: 5

Kesimpulan

Hubungan antara Jenis Kelamin dan Kategori Tenaga Kesehatan

Dari tabel kontingensi dua arah, terlihat bahwa distribusi tenaga kesehatan laki-laki dan perempuan tidak merata di seluruh kategori:

  • Perempuan mendominasi kategori Dokter Gigi dan Dokter Gigi Spesialis
  • Laki-laki lebih banyak pada kategori Dokter Spesialis
  • Kategori Dokter Umum cenderung seimbang

Uji Chi-Square menghasilkan:

\(\chi^2 = 579.91\), df = 3, p-value < 2.2e-16

Ini berarti terdapat hubungan yang sangat signifikan antara jenis kelamin dan kategori tenaga kesehatan. Distribusi ini tidak terjadi secara kebetulan.


Konsistensi Hubungan di Berbagai Wilayah: Uji CMH

Tabel kontingensi tiga arah digunakan untuk melihat apakah hubungan tersebut konsisten antar wilayah, dengan menggunakan data dari tiga kabupaten:

  • Kabupaten Bandung
  • Kabupaten Bogor
  • Kabupaten Garut

Uji Cochran-Mantel-Haenszel (CMH) menunjukkan bahwa hubungan antara jenis kelamin dan kategori tenaga kesehatan tetap signifikan dan konsisten di ketiga wilayah tersebut.

Artinya, pola dominasi jenis kelamin dalam kategori profesi bukan hanya lokal, tetapi terlihat merata di berbagai kabupaten.


Pemodelan Tambahan: Generalized Linear Model (GLM)

Model GLM Poisson juga digunakan sebagai pendekatan regresi untuk memprediksi jumlah tenaga kesehatan berdasarkan:

  • Jenis Kelamin
  • Kategori Tenaga Kesehatan
  • Kabupaten/Kota

Hasil model:

  • Koefisien Jenis.KelaminPEREMPUAN = 0.175 (p < 0.001)
    → Perempuan secara signifikan lebih banyak dibanding laki-laki
  • Kategori Dokter Spesialis dan Dokter Umum memiliki efek positif besar terhadap jumlah tenaga kesehatan
  • Kabupaten Bogor memiliki jumlah yang jauh lebih tinggi dibanding referensi (Kabupaten Bandung), sedangkan Garut justru lebih rendah

Simpulan Umum

  • Terdapat hubungan yang sangat signifikan antara jenis kelamin dan kategori tenaga kesehatan
  • Pola tersebut konsisten di berbagai kabupaten
  • Model GLM memperkuat temuan bahwa jenis kelamin dan lokasi geografis secara statistik memengaruhi jumlah tenaga kesehatan per kategori

Rekomendasi

  • Pemerataan distribusi tenaga kesehatan berbasis gender perlu dipertimbangkan, terutama untuk kategori yang masih timpang
  • Data ini dapat menjadi dasar untuk kebijakan rekrutmen dan pelatihan berbasis wilayah dan kebutuhan tenaga kesehatan

25.2 Studi Kasus 2

Latar belakang

Masalah gizi pada balita merupakan isu krusial dalam bidang kesehatan masyarakat, khususnya di negara berkembang seperti Indonesia. Status gizi yang buruk pada usia balita tidak hanya berdampak pada pertumbuhan fisik anak, tetapi juga berpengaruh jangka panjang terhadap perkembangan kognitif, produktivitas masa depan, dan bahkan risiko penyakit kronis di usia dewasa. Oleh karena itu, pengawasan dan evaluasi terhadap status gizi balita menjadi bagian penting dalam agenda pembangunan kesehatan nasional.

Kota Surabaya, sebagai salah satu kota metropolitan di Indonesia, telah menunjukkan komitmennya dalam mendukung pencapaian target pembangunan berkelanjutan (SDGs), termasuk dalam bidang penurunan stunting dan perbaikan gizi masyarakat. Pemerintah Kota Surabaya melalui Dinas Kesehatan secara rutin mengumpulkan data status gizi balita dari seluruh kecamatan, yang kemudian dirilis sebagai data terbuka (open data) agar dapat dimanfaatkan oleh berbagai pihak.

Salah satu pendekatan statistik yang dapat digunakan untuk memahami pola dan hubungan antara kategori gizi, wilayah, dan waktu adalah analisis log-linear. Analisis ini cocok digunakan untuk data kategori dalam bentuk tabel kontingensi tiga arah. Dengan log-linear, kita dapat mengevaluasi apakah terdapat hubungan yang signifikan antara faktor lokasi (kecamatan), jenis gangguan gizi (kurang, pendek, buruk), dan tahun pencatatan serta mengidentifikasi adanya interaksi antar variabel.

Melalui analisis ini, diharapkan kita tidak hanya memahami pola distribusi status gizi balita secara deskriptif, tetapi juga dapat mengungkap hubungan multivariat yang mungkin tersembunyi antar kategori. Hasil analisis log-linear ini juga berpotensi memberikan masukan berbasis data kepada pengambil kebijakan daerah untuk merancang intervensi yang lebih tepat sasaran dan efektif.

Rumusan Masalah

Berdasarkan latar belakang di atas, rumusan masalah dalam analisis ini adalah:

  • Apakah terdapat hubungan yang signifikan antara kecamatan, kategori status gizi, dan tahun pencatatan?
  • Apakah terdapat interaksi dua arah atau tiga arah antar variabel tersebut?
  • Model log-linear seperti apa yang paling sesuai untuk menggambarkan hubungan antar variabel tersebut?

Tujuan

Adapun tujuan dari analisis ini adalah:

  • Untuk mendeskripsikan distribusi jumlah balita berdasarkan kategori gizi di berbagai kecamatan di Kota Surabaya pada tahun 2024.

  • Untuk membangun model log-linear dari tabel kontingensi tiga arah antara kecamatan, kategori status gizi, dan tahun pencatatan.

  • Untuk mengevaluasi interaksi dua arah dan tiga arah dalam model log-linear dan memilih model terbaik berdasarkan nilai deviance dan signifikansi.

Manfaat

Manfaat yang diharapkan dari analisis ini adalah:

  • Memberikan informasi berbasis data kepada pihak Dinas Kesehatan dan pembuat kebijakan di Surabaya tentang sebaran status gizi balita.

  • Menyediakan pendekatan analisis alternatif dengan metode log-linear yang dapat digunakan untuk data kategorik dalam bidang kesehatan masyarakat.

  • Memberikan contoh nyata penggunaan statistik multivariat kategori untuk mahasiswa, peneliti, dan analis data sosial kesehatan.

Sumber Data

Data yang digunakan dalam analisis ini bersumber dari:

Portal Open Data Kota Surabaya File: 2024_Jumlah Status Gizi Balita Berdasarkan Indeks Menurut Kecamatan.csv 2023_Jumlah Status Gizi Balita Berdasarkan Indeks Menurut Kecamatan.csv

Diunduh dari: https://data.surabaya.go.id (akses Mei 2025)

Data ini memuat jumlah balita dari masing-masing kecamatan di Surabaya yang masuk dalam beberapa kategori status gizi:

  • Gizi kurang berdasarkan BB/U
  • Pendek berdasarkan TB/U
  • Gizi kurang (BB/TB < -2 s.d -3 SD)
  • Gizi buruk (BB/TB < -3 SD)

Format data adalah per kecamatan, dan digunakan dalam bentuk tabel kontingensi 3 arah: Kecamatan × Kategori Gizi × Tahun.

Deskripsi Data dan Preprocessing

Struktur Data

Dataset ini berisi jumlah balita dari masing-masing kecamatan di Kota Surabaya tahun 2023 dan 2024 yang tergolong ke dalam beberapa kategori status gizi. Berikut adalah lima baris pertama dari dataset:

library(readr)
## Warning: package 'readr' was built under R version 4.3.3
library(dplyr)
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.3.3
## 
## Attaching package: 'tidyr'
## The following object is masked from 'package:reshape2':
## 
##     smiths
# Gunakan read.csv2() khusus untuk CSV dengan delimiter titik koma
data_2023 <- read.csv2("Data tahun 2023.csv", stringsAsFactors = FALSE)
data_2024 <- read.csv2("Data tahun 2024.csv", stringsAsFactors = FALSE)


data_2023$tahun <- "2023"
data_2024$tahun <- "2024"
data_all <- rbind(data_2023, data_2024)
data_all
##          KECAMATAN balita_gizi_kurang__bb_u_ balita_pendek_tb_u_
## 1         Asemrowo                        10                  18
## 2           Benowo                        38                  17
## 3          Bubutan                       198                  38
## 4            Bulak                        36                  21
## 5      Dukuh Pakis                         9                  18
## 6         Gayungan                       160                  13
## 7          Genteng                        20                  22
## 8           Gubeng                        22                  25
## 9     Gunung Anyar                       318                  31
## 10       Jambangan                        10                  12
## 11   Karang Pilang                        46                  13
## 12        Kenjeran                       639                  66
## 13      Krembangan                       171                  46
## 14     Lakarsantri                        61                  46
## 15       Mulyorejo                        16                  24
## 16 Pabean Cantikan                        30                  25
## 17           Pakal                        16                  13
## 18         Rungkut                       240                  64
## 19      Sambikerep                        32                  29
## 20         Sawahan                        31                  43
## 21        Semampir                        68                  89
## 22       Simokerto                        22                  38
## 23        Sukolilo                        39                  36
## 24   Sukomanunggal                        33                  29
## 25      Tambaksari                       213                  52
## 26          Tandes                        16                  26
## 27       Tegalsari                        69                  19
## 28       Tenggilis                        15                  15
## 29          Wiyung                        12                  21
## 30        Wonocolo                        16                  31
## 31       Wonokromo                       394                  42
## 32        Asemrowo                        28                  18
## 33          Benowo                        34                  68
## 34         Bubutan                        37                  28
## 35           Bulak                        38                  20
## 36     Dukuh Pakis                        11                  16
## 37        Gayungan                       145                   6
## 38         Genteng                        35                  12
## 39          Gubeng                        40                  23
## 40    Gunung Anyar                        46                  17
## 41       Jambangan                       190                   9
## 42   Karang Pilang                        18                  11
## 43        Kenjeran                       403                  54
## 44      Krembangan                       119                  33
## 45     Lakarsantri                        58                  34
## 46       Mulyorejo                       318                  13
## 47 Pabean Cantikan                         4                  18
## 48           Pakal                        13                  13
## 49         Rungkut                       120                  35
## 50      Sambikerep                        37                  26
## 51         Sawahan                        63                  61
## 52        Semampir                        78                 100
## 53       Simokerto                        30                  28
## 54        Sukolilo                        44                  22
## 55   Sukomanunggal                       138                  25
## 56      Tambaksari                       177                  53
## 57          Tandes                        45                  17
## 58       Tegalsari                        17                  17
## 59       Tenggilis                        24                  14
## 60          Wiyung                        26                  14
## 61        Wonocolo                        58                  19
## 62       Wonokromo                       349                  34
##    BALITA.GIZI.KURANG..BB.TB......2.s.d..3.SD.
## 1                                            9
## 2                                           23
## 3                                           20
## 4                                           27
## 5                                            3
## 6                                           75
## 7                                            6
## 8                                          311
## 9                                          245
## 10                                          10
## 11                                         189
## 12                                         238
## 13                                          45
## 14                                          28
## 15                                          19
## 16                                          29
## 17                                          10
## 18                                         324
## 19                                          15
## 20                                          16
## 21                                         150
## 22                                          25
## 23                                          15
## 24                                           4
## 25                                         121
## 26                                          17
## 27                                         220
## 28                                           2
## 29                                           5
## 30                                          52
## 31                                          79
## 32                                          11
## 33                                          39
## 34                                          23
## 35                                          19
## 36                                          11
## 37                                          39
## 38                                          11
## 39                                          24
## 40                                          11
## 41                                          53
## 42                                           1
## 43                                         171
## 44                                         127
## 45                                          42
## 46                                          20
## 47                                          21
## 48                                          24
## 49                                         239
## 50                                          26
## 51                                         157
## 52                                         472
## 53                                          18
## 54                                          33
## 55                                          24
## 56                                         230
## 57                                          44
## 58                                          41
## 59                                           7
## 60                                          44
## 61                                          69
## 62                                         127
##    BALITA.GIZI.BURUK..BB.TB.....3.SD. tahun
## 1                                   0  2023
## 2                                   6  2023
## 3                                   7  2023
## 4                                   1  2023
## 5                                   4  2023
## 6                                   1  2023
## 7                                   0  2023
## 8                                   3  2023
## 9                                   2  2023
## 10                                  0  2023
## 11                                  3  2023
## 12                                  8  2023
## 13                                  7  2023
## 14                                  3  2023
## 15                                  0  2023
## 16                                  0  2023
## 17                                  1  2023
## 18                                 11  2023
## 19                                  6  2023
## 20                                  8  2023
## 21                                 15  2023
## 22                                  5  2023
## 23                                  1  2023
## 24                                  0  2023
## 25                                  8  2023
## 26                                  0  2023
## 27                                  2  2023
## 28                                  6  2023
## 29                                  5  2023
## 30                                  0  2023
## 31                                  5  2023
## 32                                  0  2024
## 33                                 12  2024
## 34                                  3  2024
## 35                                  3  2024
## 36                                  2  2024
## 37                                  0  2024
## 38                                  0  2024
## 39                                  3  2024
## 40                                  0  2024
## 41                                  1  2024
## 42                                  0  2024
## 43                                  5  2024
## 44                                  2  2024
## 45                                  2  2024
## 46                                  0  2024
## 47                                  0  2024
## 48                                  1  2024
## 49                                  3  2024
## 50                                  7  2024
## 51                                  8  2024
## 52                                 25  2024
## 53                                  4  2024
## 54                                  0  2024
## 55                                  0  2024
## 56                                 10  2024
## 57                                  0  2024
## 58                                  1  2024
## 59                                  4  2024
## 60                                  5  2024
## 61                                  3  2024
## 62                                  5  2024
# Lihat kolom
colnames(data_all)
## [1] "KECAMATAN"                                  
## [2] "balita_gizi_kurang__bb_u_"                  
## [3] "balita_pendek_tb_u_"                        
## [4] "BALITA.GIZI.KURANG..BB.TB......2.s.d..3.SD."
## [5] "BALITA.GIZI.BURUK..BB.TB.....3.SD."         
## [6] "tahun"
head(data_all)
##     KECAMATAN balita_gizi_kurang__bb_u_ balita_pendek_tb_u_
## 1    Asemrowo                        10                  18
## 2      Benowo                        38                  17
## 3     Bubutan                       198                  38
## 4       Bulak                        36                  21
## 5 Dukuh Pakis                         9                  18
## 6    Gayungan                       160                  13
##   BALITA.GIZI.KURANG..BB.TB......2.s.d..3.SD.
## 1                                           9
## 2                                          23
## 3                                          20
## 4                                          27
## 5                                           3
## 6                                          75
##   BALITA.GIZI.BURUK..BB.TB.....3.SD. tahun
## 1                                  0  2023
## 2                                  6  2023
## 3                                  7  2023
## 4                                  1  2023
## 5                                  4  2023
## 6                                  1  2023
colnames(data_all)[1:5] <- c("KECAMATAN", "gizi_bb_u", "pendek_tb_u", 
                             "gizi_kurang_bbtb", "gizi_buruk_bbtb")
library(tidyr)
library(dplyr)

data_long <- data_all %>%
  pivot_longer(cols = -c(KECAMATAN, tahun),
               names_to = "kategori_gizi",
               values_to = "jumlah") %>%
  mutate(jumlah = as.numeric(jumlah))
head(data_long)
## # A tibble: 6 × 4
##   KECAMATAN tahun kategori_gizi    jumlah
##   <chr>     <chr> <chr>             <dbl>
## 1 Asemrowo  2023  gizi_bb_u            10
## 2 Asemrowo  2023  pendek_tb_u          18
## 3 Asemrowo  2023  gizi_kurang_bbtb      9
## 4 Asemrowo  2023  gizi_buruk_bbtb       0
## 5 Benowo    2023  gizi_bb_u            38
## 6 Benowo    2023  pendek_tb_u          17
str(data_long)
## tibble [248 × 4] (S3: tbl_df/tbl/data.frame)
##  $ KECAMATAN    : chr [1:248] "Asemrowo" "Asemrowo" "Asemrowo" "Asemrowo" ...
##  $ tahun        : chr [1:248] "2023" "2023" "2023" "2023" ...
##  $ kategori_gizi: chr [1:248] "gizi_bb_u" "pendek_tb_u" "gizi_kurang_bbtb" "gizi_buruk_bbtb" ...
##  $ jumlah       : num [1:248] 10 18 9 0 38 17 23 6 198 38 ...

#Analisis Model Log Linier

table_gizi <- xtabs(jumlah ~ KECAMATAN + kategori_gizi + tahun, data = data_long)
ftable(table_gizi)
##                                  tahun 2023 2024
## KECAMATAN       kategori_gizi                   
## Asemrowo        gizi_bb_u                10   28
##                 gizi_buruk_bbtb           0    0
##                 gizi_kurang_bbtb          9   11
##                 pendek_tb_u              18   18
## Benowo          gizi_bb_u                38   34
##                 gizi_buruk_bbtb           6   12
##                 gizi_kurang_bbtb         23   39
##                 pendek_tb_u              17   68
## Bubutan         gizi_bb_u               198   37
##                 gizi_buruk_bbtb           7    3
##                 gizi_kurang_bbtb         20   23
##                 pendek_tb_u              38   28
## Bulak           gizi_bb_u                36   38
##                 gizi_buruk_bbtb           1    3
##                 gizi_kurang_bbtb         27   19
##                 pendek_tb_u              21   20
## Dukuh Pakis     gizi_bb_u                 9   11
##                 gizi_buruk_bbtb           4    2
##                 gizi_kurang_bbtb          3   11
##                 pendek_tb_u              18   16
## Gayungan        gizi_bb_u               160  145
##                 gizi_buruk_bbtb           1    0
##                 gizi_kurang_bbtb         75   39
##                 pendek_tb_u              13    6
## Genteng         gizi_bb_u                20   35
##                 gizi_buruk_bbtb           0    0
##                 gizi_kurang_bbtb          6   11
##                 pendek_tb_u              22   12
## Gubeng          gizi_bb_u                22   40
##                 gizi_buruk_bbtb           3    3
##                 gizi_kurang_bbtb        311   24
##                 pendek_tb_u              25   23
## Gunung Anyar    gizi_bb_u               318   46
##                 gizi_buruk_bbtb           2    0
##                 gizi_kurang_bbtb        245   11
##                 pendek_tb_u              31   17
## Jambangan       gizi_bb_u                10  190
##                 gizi_buruk_bbtb           0    1
##                 gizi_kurang_bbtb         10   53
##                 pendek_tb_u              12    9
## Karang Pilang   gizi_bb_u                46   18
##                 gizi_buruk_bbtb           3    0
##                 gizi_kurang_bbtb        189    1
##                 pendek_tb_u              13   11
## Kenjeran        gizi_bb_u               639  403
##                 gizi_buruk_bbtb           8    5
##                 gizi_kurang_bbtb        238  171
##                 pendek_tb_u              66   54
## Krembangan      gizi_bb_u               171  119
##                 gizi_buruk_bbtb           7    2
##                 gizi_kurang_bbtb         45  127
##                 pendek_tb_u              46   33
## Lakarsantri     gizi_bb_u                61   58
##                 gizi_buruk_bbtb           3    2
##                 gizi_kurang_bbtb         28   42
##                 pendek_tb_u              46   34
## Mulyorejo       gizi_bb_u                16  318
##                 gizi_buruk_bbtb           0    0
##                 gizi_kurang_bbtb         19   20
##                 pendek_tb_u              24   13
## Pabean Cantikan gizi_bb_u                30    4
##                 gizi_buruk_bbtb           0    0
##                 gizi_kurang_bbtb         29   21
##                 pendek_tb_u              25   18
## Pakal           gizi_bb_u                16   13
##                 gizi_buruk_bbtb           1    1
##                 gizi_kurang_bbtb         10   24
##                 pendek_tb_u              13   13
## Rungkut         gizi_bb_u               240  120
##                 gizi_buruk_bbtb          11    3
##                 gizi_kurang_bbtb        324  239
##                 pendek_tb_u              64   35
## Sambikerep      gizi_bb_u                32   37
##                 gizi_buruk_bbtb           6    7
##                 gizi_kurang_bbtb         15   26
##                 pendek_tb_u              29   26
## Sawahan         gizi_bb_u                31   63
##                 gizi_buruk_bbtb           8    8
##                 gizi_kurang_bbtb         16  157
##                 pendek_tb_u              43   61
## Semampir        gizi_bb_u                68   78
##                 gizi_buruk_bbtb          15   25
##                 gizi_kurang_bbtb        150  472
##                 pendek_tb_u              89  100
## Simokerto       gizi_bb_u                22   30
##                 gizi_buruk_bbtb           5    4
##                 gizi_kurang_bbtb         25   18
##                 pendek_tb_u              38   28
## Sukolilo        gizi_bb_u                39   44
##                 gizi_buruk_bbtb           1    0
##                 gizi_kurang_bbtb         15   33
##                 pendek_tb_u              36   22
## Sukomanunggal   gizi_bb_u                33  138
##                 gizi_buruk_bbtb           0    0
##                 gizi_kurang_bbtb          4   24
##                 pendek_tb_u              29   25
## Tambaksari      gizi_bb_u               213  177
##                 gizi_buruk_bbtb           8   10
##                 gizi_kurang_bbtb        121  230
##                 pendek_tb_u              52   53
## Tandes          gizi_bb_u                16   45
##                 gizi_buruk_bbtb           0    0
##                 gizi_kurang_bbtb         17   44
##                 pendek_tb_u              26   17
## Tegalsari       gizi_bb_u                69   17
##                 gizi_buruk_bbtb           2    1
##                 gizi_kurang_bbtb        220   41
##                 pendek_tb_u              19   17
## Tenggilis       gizi_bb_u                15   24
##                 gizi_buruk_bbtb           6    4
##                 gizi_kurang_bbtb          2    7
##                 pendek_tb_u              15   14
## Wiyung          gizi_bb_u                12   26
##                 gizi_buruk_bbtb           5    5
##                 gizi_kurang_bbtb          5   44
##                 pendek_tb_u              21   14
## Wonocolo        gizi_bb_u                16   58
##                 gizi_buruk_bbtb           0    3
##                 gizi_kurang_bbtb         52   69
##                 pendek_tb_u              31   19
## Wonokromo       gizi_bb_u               394  349
##                 gizi_buruk_bbtb           5    5
##                 gizi_kurang_bbtb         79  127
##                 pendek_tb_u              42   34
#Model Saturated (dengan semua interaksi)
mod_saturated <- glm(jumlah ~ KECAMATAN * kategori_gizi * tahun,
                     family = poisson, data = data_long)
summary(mod_saturated)
## 
## Call:
## glm(formula = jumlah ~ KECAMATAN * kategori_gizi * tahun, family = poisson, 
##     data = data_long)
## 
## Coefficients:
##                                                                    Estimate
## (Intercept)                                                       2.303e+00
## KECAMATANBenowo                                                   1.335e+00
## KECAMATANBubutan                                                  2.986e+00
## KECAMATANBulak                                                    1.281e+00
## KECAMATANDukuh Pakis                                             -1.054e-01
## KECAMATANGayungan                                                 2.773e+00
## KECAMATANGenteng                                                  6.931e-01
## KECAMATANGubeng                                                   7.885e-01
## KECAMATANGunung Anyar                                             3.459e+00
## KECAMATANJambangan                                               -1.038e-13
## KECAMATANKarang Pilang                                            1.526e+00
## KECAMATANKenjeran                                                 4.157e+00
## KECAMATANKrembangan                                               2.839e+00
## KECAMATANLakarsantri                                              1.808e+00
## KECAMATANMulyorejo                                                4.700e-01
## KECAMATANPabean Cantikan                                          1.099e+00
## KECAMATANPakal                                                    4.700e-01
## KECAMATANRungkut                                                  3.178e+00
## KECAMATANSambikerep                                               1.163e+00
## KECAMATANSawahan                                                  1.131e+00
## KECAMATANSemampir                                                 1.917e+00
## KECAMATANSimokerto                                                7.885e-01
## KECAMATANSukolilo                                                 1.361e+00
## KECAMATANSukomanunggal                                            1.194e+00
## KECAMATANTambaksari                                               3.059e+00
## KECAMATANTandes                                                   4.700e-01
## KECAMATANTegalsari                                                1.932e+00
## KECAMATANTenggilis                                                4.055e-01
## KECAMATANWiyung                                                   1.823e-01
## KECAMATANWonocolo                                                 4.700e-01
## KECAMATANWonokromo                                                3.674e+00
## kategori_gizigizi_buruk_bbtb                                     -2.761e+01
## kategori_gizigizi_kurang_bbtb                                    -1.054e-01
## kategori_gizipendek_tb_u                                          5.878e-01
## tahun2024                                                         1.030e+00
## KECAMATANBenowo:kategori_gizigizi_buruk_bbtb                      2.576e+01
## KECAMATANBubutan:kategori_gizigizi_buruk_bbtb                     2.426e+01
## KECAMATANBulak:kategori_gizigizi_buruk_bbtb                       2.402e+01
## KECAMATANDukuh Pakis:kategori_gizigizi_buruk_bbtb                 2.679e+01
## KECAMATANGayungan:kategori_gizigizi_buruk_bbtb                    2.253e+01
## KECAMATANGenteng:kategori_gizigizi_buruk_bbtb                    -6.931e-01
## KECAMATANGubeng:kategori_gizigizi_buruk_bbtb                      2.561e+01
## KECAMATANGunung Anyar:kategori_gizigizi_buruk_bbtb                2.254e+01
## KECAMATANJambangan:kategori_gizigizi_buruk_bbtb                   4.600e-09
## KECAMATANKarang Pilang:kategori_gizigizi_buruk_bbtb               2.488e+01
## KECAMATANKenjeran:kategori_gizigizi_buruk_bbtb                    2.322e+01
## KECAMATANKrembangan:kategori_gizigizi_buruk_bbtb                  2.441e+01
## KECAMATANLakarsantri:kategori_gizigizi_buruk_bbtb                 2.459e+01
## KECAMATANMulyorejo:kategori_gizigizi_buruk_bbtb                  -4.700e-01
## KECAMATANPabean Cantikan:kategori_gizigizi_buruk_bbtb            -1.099e+00
## KECAMATANPakal:kategori_gizigizi_buruk_bbtb                       2.483e+01
## KECAMATANRungkut:kategori_gizigizi_buruk_bbtb                     2.452e+01
## KECAMATANSambikerep:kategori_gizigizi_buruk_bbtb                  2.593e+01
## KECAMATANSawahan:kategori_gizigizi_buruk_bbtb                     2.625e+01
## KECAMATANSemampir:kategori_gizigizi_buruk_bbtb                    2.609e+01
## KECAMATANSimokerto:kategori_gizigizi_buruk_bbtb                   2.612e+01
## KECAMATANSukolilo:kategori_gizigizi_buruk_bbtb                    2.394e+01
## KECAMATANSukomanunggal:kategori_gizigizi_buruk_bbtb              -1.194e+00
## KECAMATANTambaksari:kategori_gizigizi_buruk_bbtb                  2.432e+01
## KECAMATANTandes:kategori_gizigizi_buruk_bbtb                     -4.700e-01
## KECAMATANTegalsari:kategori_gizigizi_buruk_bbtb                   2.406e+01
## KECAMATANTenggilis:kategori_gizigizi_buruk_bbtb                   2.669e+01
## KECAMATANWiyung:kategori_gizigizi_buruk_bbtb                      2.673e+01
## KECAMATANWonocolo:kategori_gizigizi_buruk_bbtb                   -4.700e-01
## KECAMATANWonokromo:kategori_gizigizi_buruk_bbtb                   2.324e+01
## KECAMATANBenowo:kategori_gizigizi_kurang_bbtb                    -3.967e-01
## KECAMATANBubutan:kategori_gizigizi_kurang_bbtb                   -2.187e+00
## KECAMATANBulak:kategori_gizigizi_kurang_bbtb                     -1.823e-01
## KECAMATANDukuh Pakis:kategori_gizigizi_kurang_bbtb               -9.933e-01
## KECAMATANGayungan:kategori_gizigizi_kurang_bbtb                  -6.523e-01
## KECAMATANGenteng:kategori_gizigizi_kurang_bbtb                   -1.099e+00
## KECAMATANGubeng:kategori_gizigizi_kurang_bbtb                     2.754e+00
## KECAMATANGunung Anyar:kategori_gizigizi_kurang_bbtb              -1.554e-01
## KECAMATANJambangan:kategori_gizigizi_kurang_bbtb                  1.054e-01
## KECAMATANKarang Pilang:kategori_gizigizi_kurang_bbtb              1.518e+00
## KECAMATANKenjeran:kategori_gizigizi_kurang_bbtb                  -8.823e-01
## KECAMATANKrembangan:kategori_gizigizi_kurang_bbtb                -1.230e+00
## KECAMATANLakarsantri:kategori_gizigizi_kurang_bbtb               -6.733e-01
## KECAMATANMulyorejo:kategori_gizigizi_kurang_bbtb                  2.772e-01
## KECAMATANPabean Cantikan:kategori_gizigizi_kurang_bbtb            7.146e-02
## KECAMATANPakal:kategori_gizigizi_kurang_bbtb                     -3.646e-01
## KECAMATANRungkut:kategori_gizigizi_kurang_bbtb                    4.055e-01
## KECAMATANSambikerep:kategori_gizigizi_kurang_bbtb                -6.523e-01
## KECAMATANSawahan:kategori_gizigizi_kurang_bbtb                   -5.560e-01
## KECAMATANSemampir:kategori_gizigizi_kurang_bbtb                   8.965e-01
## KECAMATANSimokerto:kategori_gizigizi_kurang_bbtb                  2.332e-01
## KECAMATANSukolilo:kategori_gizigizi_kurang_bbtb                  -8.502e-01
## KECAMATANSukomanunggal:kategori_gizigizi_kurang_bbtb             -2.005e+00
## KECAMATANTambaksari:kategori_gizigizi_kurang_bbtb                -4.601e-01
## KECAMATANTandes:kategori_gizigizi_kurang_bbtb                     1.660e-01
## KECAMATANTegalsari:kategori_gizigizi_kurang_bbtb                  1.265e+00
## KECAMATANTenggilis:kategori_gizigizi_kurang_bbtb                 -1.910e+00
## KECAMATANWiyung:kategori_gizigizi_kurang_bbtb                    -7.701e-01
## KECAMATANWonocolo:kategori_gizigizi_kurang_bbtb                   1.284e+00
## KECAMATANWonokromo:kategori_gizigizi_kurang_bbtb                 -1.502e+00
## KECAMATANBenowo:kategori_gizipendek_tb_u                         -1.392e+00
## KECAMATANBubutan:kategori_gizipendek_tb_u                        -2.238e+00
## KECAMATANBulak:kategori_gizipendek_tb_u                          -1.127e+00
## KECAMATANDukuh Pakis:kategori_gizipendek_tb_u                     1.054e-01
## KECAMATANGayungan:kategori_gizipendek_tb_u                       -3.098e+00
## KECAMATANGenteng:kategori_gizipendek_tb_u                        -4.925e-01
## KECAMATANGubeng:kategori_gizipendek_tb_u                         -4.600e-01
## KECAMATANGunung Anyar:kategori_gizipendek_tb_u                   -2.916e+00
## KECAMATANJambangan:kategori_gizipendek_tb_u                      -4.055e-01
## KECAMATANKarang Pilang:kategori_gizipendek_tb_u                  -1.851e+00
## KECAMATANKenjeran:kategori_gizipendek_tb_u                       -2.858e+00
## KECAMATANKrembangan:kategori_gizipendek_tb_u                     -1.901e+00
## KECAMATANLakarsantri:kategori_gizipendek_tb_u                    -8.700e-01
## KECAMATANMulyorejo:kategori_gizipendek_tb_u                      -1.823e-01
## KECAMATANPabean Cantikan:kategori_gizipendek_tb_u                -7.701e-01
## KECAMATANPakal:kategori_gizipendek_tb_u                          -7.954e-01
## KECAMATANRungkut:kategori_gizipendek_tb_u                        -1.910e+00
## KECAMATANSambikerep:kategori_gizipendek_tb_u                     -6.862e-01
## KECAMATANSawahan:kategori_gizipendek_tb_u                        -2.606e-01
## KECAMATANSemampir:kategori_gizipendek_tb_u                       -3.187e-01
## KECAMATANSimokerto:kategori_gizipendek_tb_u                      -4.124e-02
## KECAMATANSukolilo:kategori_gizipendek_tb_u                       -6.678e-01
## KECAMATANSukomanunggal:kategori_gizipendek_tb_u                  -7.170e-01
## KECAMATANTambaksari:kategori_gizipendek_tb_u                     -1.998e+00
## KECAMATANTandes:kategori_gizipendek_tb_u                         -1.023e-01
## KECAMATANTegalsari:kategori_gizipendek_tb_u                      -1.877e+00
## KECAMATANTenggilis:kategori_gizipendek_tb_u                      -5.878e-01
## KECAMATANWiyung:kategori_gizipendek_tb_u                         -2.817e-02
## KECAMATANWonocolo:kategori_gizipendek_tb_u                        7.361e-02
## KECAMATANWonokromo:kategori_gizipendek_tb_u                      -2.826e+00
## KECAMATANBenowo:tahun2024                                        -1.141e+00
## KECAMATANBubutan:tahun2024                                       -2.707e+00
## KECAMATANBulak:tahun2024                                         -9.756e-01
## KECAMATANDukuh Pakis:tahun2024                                   -8.289e-01
## KECAMATANGayungan:tahun2024                                      -1.128e+00
## KECAMATANGenteng:tahun2024                                       -4.700e-01
## KECAMATANGubeng:tahun2024                                        -4.318e-01
## KECAMATANGunung Anyar:tahun2024                                  -2.963e+00
## KECAMATANJambangan:tahun2024                                      1.915e+00
## KECAMATANKarang Pilang:tahun2024                                 -1.968e+00
## KECAMATANKenjeran:tahun2024                                      -1.491e+00
## KECAMATANKrembangan:tahun2024                                    -1.392e+00
## KECAMATANLakarsantri:tahun2024                                   -1.080e+00
## KECAMATANMulyorejo:tahun2024                                      1.960e+00
## KECAMATANPabean Cantikan:tahun2024                               -3.045e+00
## KECAMATANPakal:tahun2024                                         -1.237e+00
## KECAMATANRungkut:tahun2024                                       -1.723e+00
## KECAMATANSambikerep:tahun2024                                    -8.844e-01
## KECAMATANSawahan:tahun2024                                       -3.205e-01
## KECAMATANSemampir:tahun2024                                      -8.924e-01
## KECAMATANSimokerto:tahun2024                                     -7.195e-01
## KECAMATANSukolilo:tahun2024                                      -9.090e-01
## KECAMATANSukomanunggal:tahun2024                                  4.011e-01
## KECAMATANTambaksari:tahun2024                                    -1.215e+00
## KECAMATANTandes:tahun2024                                         4.454e-03
## KECAMATANTegalsari:tahun2024                                     -2.431e+00
## KECAMATANTenggilis:tahun2024                                     -5.596e-01
## KECAMATANWiyung:tahun2024                                        -2.564e-01
## KECAMATANWonocolo:tahun2024                                       2.582e-01
## KECAMATANWonokromo:tahun2024                                     -1.151e+00
## kategori_gizigizi_buruk_bbtb:tahun2024                           -1.030e+00
## kategori_gizigizi_kurang_bbtb:tahun2024                          -8.289e-01
## kategori_gizipendek_tb_u:tahun2024                               -1.030e+00
## KECAMATANBenowo:kategori_gizigizi_buruk_bbtb:tahun2024            1.834e+00
## KECAMATANBubutan:kategori_gizigizi_buruk_bbtb:tahun2024           1.860e+00
## KECAMATANBulak:kategori_gizigizi_buruk_bbtb:tahun2024             2.074e+00
## KECAMATANDukuh Pakis:kategori_gizigizi_buruk_bbtb:tahun2024       1.358e-01
## KECAMATANGayungan:kategori_gizigizi_buruk_bbtb:tahun2024         -2.417e+01
## KECAMATANGenteng:kategori_gizigizi_buruk_bbtb:tahun2024           4.700e-01
## KECAMATANGubeng:kategori_gizigizi_buruk_bbtb:tahun2024            4.318e-01
## KECAMATANGunung Anyar:kategori_gizigizi_buruk_bbtb:tahun2024     -2.303e+01
## KECAMATANJambangan:kategori_gizigizi_buruk_bbtb:tahun2024         2.339e+01
## KECAMATANKarang Pilang:kategori_gizigizi_buruk_bbtb:tahun2024    -2.443e+01
## KECAMATANKenjeran:kategori_gizigizi_buruk_bbtb:tahun2024          1.021e+00
## KECAMATANKrembangan:kategori_gizigizi_buruk_bbtb:tahun2024        1.394e-01
## KECAMATANLakarsantri:kategori_gizigizi_buruk_bbtb:tahun2024       6.746e-01
## KECAMATANMulyorejo:kategori_gizigizi_buruk_bbtb:tahun2024        -1.960e+00
## KECAMATANPabean Cantikan:kategori_gizigizi_buruk_bbtb:tahun2024   3.045e+00
## KECAMATANPakal:kategori_gizigizi_buruk_bbtb:tahun2024             1.237e+00
## KECAMATANRungkut:kategori_gizigizi_buruk_bbtb:tahun2024           4.235e-01
## KECAMATANSambikerep:kategori_gizigizi_buruk_bbtb:tahun2024        1.039e+00
## KECAMATANSawahan:kategori_gizigizi_buruk_bbtb:tahun2024           3.205e-01
## KECAMATANSemampir:kategori_gizigizi_buruk_bbtb:tahun2024          1.403e+00
## KECAMATANSimokerto:kategori_gizigizi_buruk_bbtb:tahun2024         4.963e-01
## KECAMATANSukolilo:kategori_gizigizi_buruk_bbtb:tahun2024         -2.439e+01
## KECAMATANSukomanunggal:kategori_gizigizi_buruk_bbtb:tahun2024    -4.011e-01
## KECAMATANTambaksari:kategori_gizigizi_buruk_bbtb:tahun2024        1.438e+00
## KECAMATANTandes:kategori_gizigizi_buruk_bbtb:tahun2024           -4.454e-03
## KECAMATANTegalsari:kategori_gizigizi_buruk_bbtb:tahun2024         1.737e+00
## KECAMATANTenggilis:kategori_gizigizi_buruk_bbtb:tahun2024         1.542e-01
## KECAMATANWiyung:kategori_gizigizi_buruk_bbtb:tahun2024            2.564e-01
## KECAMATANWonocolo:kategori_gizigizi_buruk_bbtb:tahun2024          2.614e+01
## KECAMATANWonokromo:kategori_gizigizi_buruk_bbtb:tahun2024         1.151e+00
## KECAMATANBenowo:kategori_gizigizi_kurang_bbtb:tahun2024           1.468e+00
## KECAMATANBubutan:kategori_gizigizi_kurang_bbtb:tahun2024          2.646e+00
## KECAMATANBulak:kategori_gizigizi_kurang_bbtb:tahun2024            4.235e-01
## KECAMATANDukuh Pakis:kategori_gizigizi_kurang_bbtb:tahun2024      1.928e+00
## KECAMATANGayungan:kategori_gizigizi_kurang_bbtb:tahun2024         2.735e-01
## KECAMATANGenteng:kategori_gizigizi_kurang_bbtb:tahun2024          8.755e-01
## KECAMATANGubeng:kategori_gizigizi_kurang_bbtb:tahun2024          -2.331e+00
## KECAMATANGunung Anyar:kategori_gizigizi_kurang_bbtb:tahun2024    -3.410e-01
## KECAMATANJambangan:kategori_gizigizi_kurang_bbtb:tahun2024       -4.478e-01
## KECAMATANKarang Pilang:kategori_gizigizi_kurang_bbtb:tahun2024   -3.475e+00
## KECAMATANKenjeran:kategori_gizigizi_kurang_bbtb:tahun2024         9.593e-01
## KECAMATANKrembangan:kategori_gizigizi_kurang_bbtb:tahun2024       2.229e+00
## KECAMATANLakarsantri:kategori_gizigizi_kurang_bbtb:tahun2024      1.285e+00
## KECAMATANMulyorejo:kategori_gizigizi_kurang_bbtb:tahun2024       -2.109e+00
## KECAMATANPabean Cantikan:kategori_gizigizi_kurang_bbtb:tahun2024  2.521e+00
## KECAMATANPakal:kategori_gizigizi_kurang_bbtb:tahun2024            1.912e+00
## KECAMATANRungkut:kategori_gizigizi_kurang_bbtb:tahun2024          1.218e+00
## KECAMATANSambikerep:kategori_gizigizi_kurang_bbtb:tahun2024       1.234e+00
## KECAMATANSawahan:kategori_gizigizi_kurang_bbtb:tahun2024          2.403e+00
## KECAMATANSemampir:kategori_gizigizi_kurang_bbtb:tahun2024         1.838e+00
## KECAMATANSimokerto:kategori_gizigizi_kurang_bbtb:tahun2024        1.903e-01
## KECAMATANSukolilo:kategori_gizigizi_kurang_bbtb:tahun2024         1.497e+00
## KECAMATANSukomanunggal:kategori_gizigizi_kurang_bbtb:tahun2024    1.190e+00
## KECAMATANTambaksari:kategori_gizigizi_kurang_bbtb:tahun2024       1.656e+00
## KECAMATANTandes:kategori_gizigizi_kurang_bbtb:tahun2024           7.459e-01
## KECAMATANTegalsari:kategori_gizigizi_kurang_bbtb:tahun2024        5.498e-01
## KECAMATANTenggilis:kategori_gizigizi_kurang_bbtb:tahun2024        1.612e+00
## KECAMATANWiyung:kategori_gizigizi_kurang_bbtb:tahun2024           2.231e+00
## KECAMATANWonocolo:kategori_gizigizi_kurang_bbtb:tahun2024        -1.760e-01
## KECAMATANWonokromo:kategori_gizigizi_kurang_bbtb:tahun2024        1.425e+00
## KECAMATANBenowo:kategori_gizipendek_tb_u:tahun2024                2.527e+00
## KECAMATANBubutan:kategori_gizipendek_tb_u:tahun2024               2.402e+00
## KECAMATANBulak:kategori_gizipendek_tb_u:tahun2024                 9.268e-01
## KECAMATANDukuh Pakis:kategori_gizipendek_tb_u:tahun2024           7.112e-01
## KECAMATANGayungan:kategori_gizipendek_tb_u:tahun2024              3.549e-01
## KECAMATANGenteng:kategori_gizipendek_tb_u:tahun2024              -1.361e-01
## KECAMATANGubeng:kategori_gizipendek_tb_u:tahun2024                3.484e-01
## KECAMATANGunung Anyar:kategori_gizipendek_tb_u:tahun2024          2.362e+00
## KECAMATANJambangan:kategori_gizipendek_tb_u:tahun2024            -2.203e+00
## KECAMATANKarang Pilang:kategori_gizipendek_tb_u:tahun2024         1.801e+00
## KECAMATANKenjeran:kategori_gizipendek_tb_u:tahun2024              1.290e+00
## KECAMATANKrembangan:kategori_gizipendek_tb_u:tahun2024            1.060e+00
## KECAMATANLakarsantri:kategori_gizipendek_tb_u:tahun2024           7.778e-01
## KECAMATANMulyorejo:kategori_gizipendek_tb_u:tahun2024            -2.573e+00
## KECAMATANPabean Cantikan:kategori_gizipendek_tb_u:tahun2024       2.716e+00
## KECAMATANPakal:kategori_gizipendek_tb_u:tahun2024                 1.237e+00
## KECAMATANRungkut:kategori_gizipendek_tb_u:tahun2024               1.119e+00
## KECAMATANSambikerep:kategori_gizipendek_tb_u:tahun2024            7.752e-01
## KECAMATANSawahan:kategori_gizipendek_tb_u:tahun2024               6.701e-01
## KECAMATANSemampir:kategori_gizipendek_tb_u:tahun2024              1.009e+00
## KECAMATANSimokerto:kategori_gizipendek_tb_u:tahun2024             4.141e-01
## KECAMATANSukolilo:kategori_gizipendek_tb_u:tahun2024              4.165e-01
## KECAMATANSukomanunggal:kategori_gizipendek_tb_u:tahun2024        -5.495e-01
## KECAMATANTambaksari:kategori_gizipendek_tb_u:tahun2024            1.234e+00
## KECAMATANTandes:kategori_gizipendek_tb_u:tahun2024               -4.293e-01
## KECAMATANTegalsari:kategori_gizipendek_tb_u:tahun2024             2.319e+00
## KECAMATANTenggilis:kategori_gizipendek_tb_u:tahun2024             4.906e-01
## KECAMATANWiyung:kategori_gizipendek_tb_u:tahun2024               -1.490e-01
## KECAMATANWonocolo:kategori_gizipendek_tb_u:tahun2024             -7.478e-01
## KECAMATANWonokromo:kategori_gizipendek_tb_u:tahun2024             9.396e-01
##                                                                  Std. Error
## (Intercept)                                                       3.162e-01
## KECAMATANBenowo                                                   3.554e-01
## KECAMATANBubutan                                                  3.241e-01
## KECAMATANBulak                                                    3.575e-01
## KECAMATANDukuh Pakis                                              4.595e-01
## KECAMATANGayungan                                                 3.260e-01
## KECAMATANGenteng                                                  3.873e-01
## KECAMATANGubeng                                                   3.814e-01
## KECAMATANGunung Anyar                                             3.212e-01
## KECAMATANJambangan                                                4.472e-01
## KECAMATANKarang Pilang                                            3.489e-01
## KECAMATANKenjeran                                                 3.187e-01
## KECAMATANKrembangan                                               3.253e-01
## KECAMATANLakarsantri                                              3.412e-01
## KECAMATANMulyorejo                                                4.031e-01
## KECAMATANPabean Cantikan                                          3.651e-01
## KECAMATANPakal                                                    4.031e-01
## KECAMATANRungkut                                                  3.227e-01
## KECAMATANSambikerep                                               3.623e-01
## KECAMATANSawahan                                                  3.637e-01
## KECAMATANSemampir                                                 3.387e-01
## KECAMATANSimokerto                                                3.814e-01
## KECAMATANSukolilo                                                 3.545e-01
## KECAMATANSukomanunggal                                            3.610e-01
## KECAMATANTambaksari                                               3.236e-01
## KECAMATANTandes                                                   4.031e-01
## KECAMATANTegalsari                                                3.384e-01
## KECAMATANTenggilis                                                4.082e-01
## KECAMATANWiyung                                                   4.282e-01
## KECAMATANWonocolo                                                 4.031e-01
## KECAMATANWonokromo                                                3.202e-01
## kategori_gizigizi_buruk_bbtb                                      1.893e+05
## kategori_gizigizi_kurang_bbtb                                     4.595e-01
## kategori_gizipendek_tb_u                                          3.944e-01
## tahun2024                                                         3.684e-01
## KECAMATANBenowo:kategori_gizigizi_buruk_bbtb                      1.893e+05
## KECAMATANBubutan:kategori_gizigizi_buruk_bbtb                     1.893e+05
## KECAMATANBulak:kategori_gizigizi_buruk_bbtb                       1.893e+05
## KECAMATANDukuh Pakis:kategori_gizigizi_buruk_bbtb                 1.893e+05
## KECAMATANGayungan:kategori_gizigizi_buruk_bbtb                    1.893e+05
## KECAMATANGenteng:kategori_gizigizi_buruk_bbtb                     2.678e+05
## KECAMATANGubeng:kategori_gizigizi_buruk_bbtb                      1.893e+05
## KECAMATANGunung Anyar:kategori_gizigizi_buruk_bbtb                1.893e+05
## KECAMATANJambangan:kategori_gizigizi_buruk_bbtb                   2.678e+05
## KECAMATANKarang Pilang:kategori_gizigizi_buruk_bbtb               1.893e+05
## KECAMATANKenjeran:kategori_gizigizi_buruk_bbtb                    1.893e+05
## KECAMATANKrembangan:kategori_gizigizi_buruk_bbtb                  1.893e+05
## KECAMATANLakarsantri:kategori_gizigizi_buruk_bbtb                 1.893e+05
## KECAMATANMulyorejo:kategori_gizigizi_buruk_bbtb                   2.678e+05
## KECAMATANPabean Cantikan:kategori_gizigizi_buruk_bbtb             2.678e+05
## KECAMATANPakal:kategori_gizigizi_buruk_bbtb                       1.893e+05
## KECAMATANRungkut:kategori_gizigizi_buruk_bbtb                     1.893e+05
## KECAMATANSambikerep:kategori_gizigizi_buruk_bbtb                  1.893e+05
## KECAMATANSawahan:kategori_gizigizi_buruk_bbtb                     1.893e+05
## KECAMATANSemampir:kategori_gizigizi_buruk_bbtb                    1.893e+05
## KECAMATANSimokerto:kategori_gizigizi_buruk_bbtb                   1.893e+05
## KECAMATANSukolilo:kategori_gizigizi_buruk_bbtb                    1.893e+05
## KECAMATANSukomanunggal:kategori_gizigizi_buruk_bbtb               2.678e+05
## KECAMATANTambaksari:kategori_gizigizi_buruk_bbtb                  1.893e+05
## KECAMATANTandes:kategori_gizigizi_buruk_bbtb                      2.678e+05
## KECAMATANTegalsari:kategori_gizigizi_buruk_bbtb                   1.893e+05
## KECAMATANTenggilis:kategori_gizigizi_buruk_bbtb                   1.893e+05
## KECAMATANWiyung:kategori_gizigizi_buruk_bbtb                      1.893e+05
## KECAMATANWonocolo:kategori_gizigizi_buruk_bbtb                    2.678e+05
## KECAMATANWonokromo:kategori_gizigizi_buruk_bbtb                   1.893e+05
## KECAMATANBenowo:kategori_gizigizi_kurang_bbtb                     5.300e-01
## KECAMATANBubutan:kategori_gizigizi_kurang_bbtb                    5.159e-01
## KECAMATANBulak:kategori_gizigizi_kurang_bbtb                      5.253e-01
## KECAMATANDukuh Pakis:kategori_gizigizi_kurang_bbtb                8.097e-01
## KECAMATANGayungan:kategori_gizigizi_kurang_bbtb                   4.803e-01
## KECAMATANGenteng:kategori_gizigizi_kurang_bbtb                    6.540e-01
## KECAMATANGubeng:kategori_gizigizi_kurang_bbtb                     5.097e-01
## KECAMATANGunung Anyar:kategori_gizigizi_kurang_bbtb               4.673e-01
## KECAMATANJambangan:kategori_gizigizi_kurang_bbtb                  6.412e-01
## KECAMATANKarang Pilang:kategori_gizigizi_kurang_bbtb              4.880e-01
## KECAMATANKenjeran:kategori_gizigizi_kurang_bbtb                   4.657e-01
## KECAMATANKrembangan:kategori_gizigizi_kurang_bbtb                 4.891e-01
## KECAMATANLakarsantri:kategori_gizigizi_kurang_bbtb                5.130e-01
## KECAMATANMulyorejo:kategori_gizigizi_kurang_bbtb                  5.712e-01
## KECAMATANPabean Cantikan:kategori_gizigizi_kurang_bbtb            5.281e-01
## KECAMATANPakal:kategori_gizigizi_kurang_bbtb                      6.112e-01
## KECAMATANRungkut:kategori_gizigizi_kurang_bbtb                    4.673e-01
## KECAMATANSambikerep:kategori_gizigizi_kurang_bbtb                 5.559e-01
## KECAMATANSawahan:kategori_gizigizi_kurang_bbtb                    5.531e-01
## KECAMATANSemampir:kategori_gizigizi_kurang_bbtb                   4.822e-01
## KECAMATANSimokerto:kategori_gizigizi_kurang_bbtb                  5.446e-01
## KECAMATANSukolilo:kategori_gizigizi_kurang_bbtb                   5.508e-01
## KECAMATANSukomanunggal:kategori_gizigizi_kurang_bbtb              7.010e-01
## KECAMATANTambaksari:kategori_gizigizi_kurang_bbtb                 4.734e-01
## KECAMATANTandes:kategori_gizigizi_kurang_bbtb                     5.766e-01
## KECAMATANTegalsari:kategori_gizigizi_kurang_bbtb                  4.797e-01
## KECAMATANTenggilis:kategori_gizigizi_kurang_bbtb                  8.819e-01
## KECAMATANWiyung:kategori_gizigizi_kurang_bbtb                     7.032e-01
## KECAMATANWonocolo:kategori_gizigizi_kurang_bbtb                   5.411e-01
## KECAMATANWonokromo:kategori_gizigizi_kurang_bbtb                  4.757e-01
## KECAMATANBenowo:kategori_gizipendek_tb_u                          4.906e-01
## KECAMATANBubutan:kategori_gizipendek_tb_u                         4.323e-01
## KECAMATANBulak:kategori_gizipendek_tb_u                           4.806e-01
## KECAMATANDukuh Pakis:kategori_gizipendek_tb_u                     5.676e-01
## KECAMATANGayungan:kategori_gizipendek_tb_u                        4.886e-01
## KECAMATANGenteng:kategori_gizipendek_tb_u                         5.010e-01
## KECAMATANGubeng:kategori_gizipendek_tb_u                          4.909e-01
## KECAMATANGunung Anyar:kategori_gizipendek_tb_u                    4.370e-01
## KECAMATANJambangan:kategori_gizipendek_tb_u                       5.821e-01
## KECAMATANKarang Pilang:kategori_gizipendek_tb_u                   5.042e-01
## KECAMATANKenjeran:kategori_gizipendek_tb_u                        4.151e-01
## KECAMATANKrembangan:kategori_gizipendek_tb_u                      4.280e-01
## KECAMATANLakarsantri:kategori_gizipendek_tb_u                     4.401e-01
## KECAMATANMulyorejo:kategori_gizipendek_tb_u                       5.096e-01
## KECAMATANPabean Cantikan:kategori_gizipendek_tb_u                 4.784e-01
## KECAMATANPakal:kategori_gizipendek_tb_u                           5.431e-01
## KECAMATANRungkut:kategori_gizipendek_tb_u                         4.187e-01
## KECAMATANSambikerep:kategori_gizipendek_tb_u                      4.704e-01
## KECAMATANSawahan:kategori_gizipendek_tb_u                         4.594e-01
## KECAMATANSemampir:kategori_gizipendek_tb_u                        4.260e-01
## KECAMATANSimokerto:kategori_gizipendek_tb_u                       4.768e-01
## KECAMATANSukolilo:kategori_gizipendek_tb_u                        4.571e-01
## KECAMATANSukomanunggal:kategori_gizipendek_tb_u                   4.694e-01
## KECAMATANTambaksari:kategori_gizipendek_tb_u                      4.237e-01
## KECAMATANTandes:kategori_gizipendek_tb_u                          5.065e-01
## KECAMATANTegalsari:kategori_gizipendek_tb_u                       4.719e-01
## KECAMATANTenggilis:kategori_gizipendek_tb_u                       5.375e-01
## KECAMATANWiyung:kategori_gizipendek_tb_u                          5.353e-01
## KECAMATANWonocolo:kategori_gizipendek_tb_u                        5.003e-01
## KECAMATANWonokromo:kategori_gizipendek_tb_u                       4.265e-01
## KECAMATANBenowo:tahun2024                                         4.375e-01
## KECAMATANBubutan:tahun2024                                        4.096e-01
## KECAMATANBulak:tahun2024                                          4.357e-01
## KECAMATANDukuh Pakis:tahun2024                                    5.811e-01
## KECAMATANGayungan:tahun2024                                       3.858e-01
## KECAMATANGenteng:tahun2024                                        4.629e-01
## KECAMATANGubeng:tahun2024                                         4.541e-01
## KECAMATANGunung Anyar:tahun2024                                   4.007e-01
## KECAMATANJambangan:tahun2024                                      4.909e-01
## KECAMATANKarang Pilang:tahun2024                                  4.615e-01
## KECAMATANKenjeran:tahun2024                                       3.738e-01
## KECAMATANKrembangan:tahun2024                                     3.873e-01
## KECAMATANLakarsantri:tahun2024                                    4.115e-01
## KECAMATANMulyorejo:tahun2024                                      4.487e-01
## KECAMATANPabean Cantikan:tahun2024                                6.473e-01
## KECAMATANPakal:tahun2024                                          5.245e-01
## KECAMATANRungkut:tahun2024                                        3.850e-01
## KECAMATANSambikerep:tahun2024                                     4.404e-01
## KECAMATANSawahan:tahun2024                                        4.288e-01
## KECAMATANSemampir:tahun2024                                       4.040e-01
## KECAMATANSimokerto:tahun2024                                      4.631e-01
## KECAMATANSukolilo:tahun2024                                       4.290e-01
## KECAMATANSukomanunggal:tahun2024                                  4.162e-01
## KECAMATANTambaksari:tahun2024                                     3.822e-01
## KECAMATANTandes:tahun2024                                         4.695e-01
## KECAMATANTegalsari:tahun2024                                      4.572e-01
## KECAMATANTenggilis:tahun2024                                      4.940e-01
## KECAMATANWiyung:tahun2024                                         5.075e-01
## KECAMATANWonocolo:tahun2024                                       4.642e-01
## KECAMATANWonokromo:tahun2024                                      3.757e-01
## kategori_gizigizi_buruk_bbtb:tahun2024                            2.678e+05
## kategori_gizigizi_kurang_bbtb:tahun2024                           5.811e-01
## kategori_gizipendek_tb_u:tahun2024                                4.968e-01
## KECAMATANBenowo:kategori_gizigizi_buruk_bbtb:tahun2024            2.678e+05
## KECAMATANBubutan:kategori_gizigizi_buruk_bbtb:tahun2024           2.678e+05
## KECAMATANBulak:kategori_gizigizi_buruk_bbtb:tahun2024             2.678e+05
## KECAMATANDukuh Pakis:kategori_gizigizi_buruk_bbtb:tahun2024       2.678e+05
## KECAMATANGayungan:kategori_gizigizi_buruk_bbtb:tahun2024          3.279e+05
## KECAMATANGenteng:kategori_gizigizi_buruk_bbtb:tahun2024           3.787e+05
## KECAMATANGubeng:kategori_gizigizi_buruk_bbtb:tahun2024            2.678e+05
## KECAMATANGunung Anyar:kategori_gizigizi_buruk_bbtb:tahun2024      3.279e+05
## KECAMATANJambangan:kategori_gizigizi_buruk_bbtb:tahun2024         3.279e+05
## KECAMATANKarang Pilang:kategori_gizigizi_buruk_bbtb:tahun2024     3.279e+05
## KECAMATANKenjeran:kategori_gizigizi_buruk_bbtb:tahun2024          2.678e+05
## KECAMATANKrembangan:kategori_gizigizi_buruk_bbtb:tahun2024        2.678e+05
## KECAMATANLakarsantri:kategori_gizigizi_buruk_bbtb:tahun2024       2.678e+05
## KECAMATANMulyorejo:kategori_gizigizi_buruk_bbtb:tahun2024         3.787e+05
## KECAMATANPabean Cantikan:kategori_gizigizi_buruk_bbtb:tahun2024   3.787e+05
## KECAMATANPakal:kategori_gizigizi_buruk_bbtb:tahun2024             2.678e+05
## KECAMATANRungkut:kategori_gizigizi_buruk_bbtb:tahun2024           2.678e+05
## KECAMATANSambikerep:kategori_gizigizi_buruk_bbtb:tahun2024        2.678e+05
## KECAMATANSawahan:kategori_gizigizi_buruk_bbtb:tahun2024           2.678e+05
## KECAMATANSemampir:kategori_gizigizi_buruk_bbtb:tahun2024          2.678e+05
## KECAMATANSimokerto:kategori_gizigizi_buruk_bbtb:tahun2024         2.678e+05
## KECAMATANSukolilo:kategori_gizigizi_buruk_bbtb:tahun2024          3.279e+05
## KECAMATANSukomanunggal:kategori_gizigizi_buruk_bbtb:tahun2024     3.787e+05
## KECAMATANTambaksari:kategori_gizigizi_buruk_bbtb:tahun2024        2.678e+05
## KECAMATANTandes:kategori_gizigizi_buruk_bbtb:tahun2024            3.787e+05
## KECAMATANTegalsari:kategori_gizigizi_buruk_bbtb:tahun2024         2.678e+05
## KECAMATANTenggilis:kategori_gizigizi_buruk_bbtb:tahun2024         2.678e+05
## KECAMATANWiyung:kategori_gizigizi_buruk_bbtb:tahun2024            2.678e+05
## KECAMATANWonocolo:kategori_gizigizi_buruk_bbtb:tahun2024          3.279e+05
## KECAMATANWonokromo:kategori_gizigizi_buruk_bbtb:tahun2024         2.678e+05
## KECAMATANBenowo:kategori_gizigizi_kurang_bbtb:tahun2024           6.801e-01
## KECAMATANBubutan:kategori_gizigizi_kurang_bbtb:tahun2024          6.807e-01
## KECAMATANBulak:kategori_gizigizi_kurang_bbtb:tahun2024            6.939e-01
## KECAMATANDukuh Pakis:kategori_gizigizi_kurang_bbtb:tahun2024      9.818e-01
## KECAMATANGayungan:kategori_gizigizi_kurang_bbtb:tahun2024         6.244e-01
## KECAMATANGenteng:kategori_gizigizi_kurang_bbtb:tahun2024          8.209e-01
## KECAMATANGubeng:kategori_gizigizi_kurang_bbtb:tahun2024           6.731e-01
## KECAMATANGunung Anyar:kategori_gizigizi_kurang_bbtb:tahun2024     6.765e-01
## KECAMATANJambangan:kategori_gizigizi_kurang_bbtb:tahun2024        7.496e-01
## KECAMATANKarang Pilang:kategori_gizigizi_kurang_bbtb:tahun2024    1.192e+00
## KECAMATANKenjeran:kategori_gizigizi_kurang_bbtb:tahun2024         5.932e-01
## KECAMATANKrembangan:kategori_gizigizi_kurang_bbtb:tahun2024       6.181e-01
## KECAMATANLakarsantri:kategori_gizigizi_kurang_bbtb:tahun2024      6.564e-01
## KECAMATANMulyorejo:kategori_gizigizi_kurang_bbtb:tahun2024        7.113e-01
## KECAMATANPabean Cantikan:kategori_gizigizi_kurang_bbtb:tahun2024  8.386e-01
## KECAMATANPakal:kategori_gizigizi_kurang_bbtb:tahun2024            7.867e-01
## KECAMATANRungkut:kategori_gizigizi_kurang_bbtb:tahun2024          5.979e-01
## KECAMATANSambikerep:kategori_gizigizi_kurang_bbtb:tahun2024       7.079e-01
## KECAMATANSawahan:kategori_gizigizi_kurang_bbtb:tahun2024          6.743e-01
## KECAMATANSemampir:kategori_gizigizi_kurang_bbtb:tahun2024         6.116e-01
## KECAMATANSimokerto:kategori_gizigizi_kurang_bbtb:tahun2024        7.156e-01
## KECAMATANSukolilo:kategori_gizigizi_kurang_bbtb:tahun2024         6.950e-01
## KECAMATANSukomanunggal:kategori_gizigizi_kurang_bbtb:tahun2024    8.167e-01
## KECAMATANTambaksari:kategori_gizigizi_kurang_bbtb:tahun2024       6.006e-01
## KECAMATANTandes:kategori_gizigizi_kurang_bbtb:tahun2024           7.099e-01
## KECAMATANTegalsari:kategori_gizigizi_kurang_bbtb:tahun2024        6.633e-01
## KECAMATANTenggilis:kategori_gizigizi_kurang_bbtb:tahun2024        1.044e+00
## KECAMATANWiyung:kategori_gizigizi_kurang_bbtb:tahun2024           8.260e-01
## KECAMATANWonocolo:kategori_gizigizi_kurang_bbtb:tahun2024         6.717e-01
## KECAMATANWonokromo:kategori_gizigizi_kurang_bbtb:tahun2024        6.031e-01
## KECAMATANBenowo:kategori_gizipendek_tb_u:tahun2024                6.133e-01
## KECAMATANBubutan:kategori_gizipendek_tb_u:tahun2024               5.839e-01
## KECAMATANBulak:kategori_gizipendek_tb_u:tahun2024                 6.313e-01
## KECAMATANDukuh Pakis:kategori_gizipendek_tb_u:tahun2024           7.529e-01
## KECAMATANGayungan:kategori_gizipendek_tb_u:tahun2024              7.096e-01
## KECAMATANGenteng:kategori_gizipendek_tb_u:tahun2024               6.739e-01
## KECAMATANGubeng:kategori_gizipendek_tb_u:tahun2024                6.331e-01
## KECAMATANGunung Anyar:kategori_gizipendek_tb_u:tahun2024          6.023e-01
## KECAMATANJambangan:kategori_gizipendek_tb_u:tahun2024             7.393e-01
## KECAMATANKarang Pilang:kategori_gizipendek_tb_u:tahun2024         7.014e-01
## KECAMATANKenjeran:kategori_gizipendek_tb_u:tahun2024              5.334e-01
## KECAMATANKrembangan:kategori_gizipendek_tb_u:tahun2024            5.596e-01
## KECAMATANLakarsantri:kategori_gizipendek_tb_u:tahun2024           5.759e-01
## KECAMATANMulyorejo:kategori_gizipendek_tb_u:tahun2024             6.566e-01
## KECAMATANPabean Cantikan:kategori_gizipendek_tb_u:tahun2024       7.910e-01
## KECAMATANPakal:kategori_gizipendek_tb_u:tahun2024                 7.349e-01
## KECAMATANRungkut:kategori_gizipendek_tb_u:tahun2024               5.509e-01
## KECAMATANSambikerep:kategori_gizipendek_tb_u:tahun2024            6.149e-01
## KECAMATANSawahan:kategori_gizipendek_tb_u:tahun2024               5.785e-01
## KECAMATANSemampir:kategori_gizipendek_tb_u:tahun2024              5.437e-01
## KECAMATANSimokerto:kategori_gizipendek_tb_u:tahun2024             6.226e-01
## KECAMATANSukolilo:kategori_gizipendek_tb_u:tahun2024              6.070e-01
## KECAMATANSukomanunggal:kategori_gizipendek_tb_u:tahun2024         5.990e-01
## KECAMATANTambaksari:kategori_gizipendek_tb_u:tahun2024            5.434e-01
## KECAMATANTandes:kategori_gizipendek_tb_u:tahun2024                6.549e-01
## KECAMATANTegalsari:kategori_gizipendek_tb_u:tahun2024             6.570e-01
## KECAMATANTenggilis:kategori_gizipendek_tb_u:tahun2024             7.023e-01
## KECAMATANWiyung:kategori_gizipendek_tb_u:tahun2024                6.983e-01
## KECAMATANWonocolo:kategori_gizipendek_tb_u:tahun2024              6.414e-01
## KECAMATANWonokromo:kategori_gizipendek_tb_u:tahun2024             5.527e-01
##                                                                  z value
## (Intercept)                                                        7.281
## KECAMATANBenowo                                                    3.756
## KECAMATANBubutan                                                   9.212
## KECAMATANBulak                                                     3.583
## KECAMATANDukuh Pakis                                              -0.229
## KECAMATANGayungan                                                  8.506
## KECAMATANGenteng                                                   1.790
## KECAMATANGubeng                                                    2.067
## KECAMATANGunung Anyar                                             10.772
## KECAMATANJambangan                                                 0.000
## KECAMATANKarang Pilang                                             4.374
## KECAMATANKenjeran                                                 13.045
## KECAMATANKrembangan                                                8.726
## KECAMATANLakarsantri                                               5.300
## KECAMATANMulyorejo                                                 1.166
## KECAMATANPabean Cantikan                                           3.009
## KECAMATANPakal                                                     1.166
## KECAMATANRungkut                                                   9.847
## KECAMATANSambikerep                                                3.211
## KECAMATANSawahan                                                   3.111
## KECAMATANSemampir                                                  5.660
## KECAMATANSimokerto                                                 2.067
## KECAMATANSukolilo                                                  3.840
## KECAMATANSukomanunggal                                             3.307
## KECAMATANTambaksari                                                9.453
## KECAMATANTandes                                                    1.166
## KECAMATANTegalsari                                                 5.708
## KECAMATANTenggilis                                                 0.993
## KECAMATANWiyung                                                    0.426
## KECAMATANWonocolo                                                  1.166
## KECAMATANWonokromo                                                11.473
## kategori_gizigizi_buruk_bbtb                                       0.000
## kategori_gizigizi_kurang_bbtb                                     -0.229
## kategori_gizipendek_tb_u                                           1.490
## tahun2024                                                          2.795
## KECAMATANBenowo:kategori_gizigizi_buruk_bbtb                       0.000
## KECAMATANBubutan:kategori_gizigizi_buruk_bbtb                      0.000
## KECAMATANBulak:kategori_gizigizi_buruk_bbtb                        0.000
## KECAMATANDukuh Pakis:kategori_gizigizi_buruk_bbtb                  0.000
## KECAMATANGayungan:kategori_gizigizi_buruk_bbtb                     0.000
## KECAMATANGenteng:kategori_gizigizi_buruk_bbtb                      0.000
## KECAMATANGubeng:kategori_gizigizi_buruk_bbtb                       0.000
## KECAMATANGunung Anyar:kategori_gizigizi_buruk_bbtb                 0.000
## KECAMATANJambangan:kategori_gizigizi_buruk_bbtb                    0.000
## KECAMATANKarang Pilang:kategori_gizigizi_buruk_bbtb                0.000
## KECAMATANKenjeran:kategori_gizigizi_buruk_bbtb                     0.000
## KECAMATANKrembangan:kategori_gizigizi_buruk_bbtb                   0.000
## KECAMATANLakarsantri:kategori_gizigizi_buruk_bbtb                  0.000
## KECAMATANMulyorejo:kategori_gizigizi_buruk_bbtb                    0.000
## KECAMATANPabean Cantikan:kategori_gizigizi_buruk_bbtb              0.000
## KECAMATANPakal:kategori_gizigizi_buruk_bbtb                        0.000
## KECAMATANRungkut:kategori_gizigizi_buruk_bbtb                      0.000
## KECAMATANSambikerep:kategori_gizigizi_buruk_bbtb                   0.000
## KECAMATANSawahan:kategori_gizigizi_buruk_bbtb                      0.000
## KECAMATANSemampir:kategori_gizigizi_buruk_bbtb                     0.000
## KECAMATANSimokerto:kategori_gizigizi_buruk_bbtb                    0.000
## KECAMATANSukolilo:kategori_gizigizi_buruk_bbtb                     0.000
## KECAMATANSukomanunggal:kategori_gizigizi_buruk_bbtb                0.000
## KECAMATANTambaksari:kategori_gizigizi_buruk_bbtb                   0.000
## KECAMATANTandes:kategori_gizigizi_buruk_bbtb                       0.000
## KECAMATANTegalsari:kategori_gizigizi_buruk_bbtb                    0.000
## KECAMATANTenggilis:kategori_gizigizi_buruk_bbtb                    0.000
## KECAMATANWiyung:kategori_gizigizi_buruk_bbtb                       0.000
## KECAMATANWonocolo:kategori_gizigizi_buruk_bbtb                     0.000
## KECAMATANWonokromo:kategori_gizigizi_buruk_bbtb                    0.000
## KECAMATANBenowo:kategori_gizigizi_kurang_bbtb                     -0.749
## KECAMATANBubutan:kategori_gizigizi_kurang_bbtb                    -4.239
## KECAMATANBulak:kategori_gizigizi_kurang_bbtb                      -0.347
## KECAMATANDukuh Pakis:kategori_gizigizi_kurang_bbtb                -1.227
## KECAMATANGayungan:kategori_gizigizi_kurang_bbtb                   -1.358
## KECAMATANGenteng:kategori_gizigizi_kurang_bbtb                    -1.680
## KECAMATANGubeng:kategori_gizigizi_kurang_bbtb                      5.404
## KECAMATANGunung Anyar:kategori_gizigizi_kurang_bbtb               -0.333
## KECAMATANJambangan:kategori_gizigizi_kurang_bbtb                   0.164
## KECAMATANKarang Pilang:kategori_gizigizi_kurang_bbtb               3.112
## KECAMATANKenjeran:kategori_gizigizi_kurang_bbtb                   -1.895
## KECAMATANKrembangan:kategori_gizigizi_kurang_bbtb                 -2.514
## KECAMATANLakarsantri:kategori_gizigizi_kurang_bbtb                -1.312
## KECAMATANMulyorejo:kategori_gizigizi_kurang_bbtb                   0.485
## KECAMATANPabean Cantikan:kategori_gizigizi_kurang_bbtb             0.135
## KECAMATANPakal:kategori_gizigizi_kurang_bbtb                      -0.597
## KECAMATANRungkut:kategori_gizigizi_kurang_bbtb                     0.868
## KECAMATANSambikerep:kategori_gizigizi_kurang_bbtb                 -1.173
## KECAMATANSawahan:kategori_gizigizi_kurang_bbtb                    -1.005
## KECAMATANSemampir:kategori_gizigizi_kurang_bbtb                    1.859
## KECAMATANSimokerto:kategori_gizigizi_kurang_bbtb                   0.428
## KECAMATANSukolilo:kategori_gizigizi_kurang_bbtb                   -1.543
## KECAMATANSukomanunggal:kategori_gizigizi_kurang_bbtb              -2.860
## KECAMATANTambaksari:kategori_gizigizi_kurang_bbtb                 -0.972
## KECAMATANTandes:kategori_gizigizi_kurang_bbtb                      0.288
## KECAMATANTegalsari:kategori_gizigizi_kurang_bbtb                   2.637
## KECAMATANTenggilis:kategori_gizigizi_kurang_bbtb                  -2.165
## KECAMATANWiyung:kategori_gizigizi_kurang_bbtb                     -1.095
## KECAMATANWonocolo:kategori_gizigizi_kurang_bbtb                    2.373
## KECAMATANWonokromo:kategori_gizigizi_kurang_bbtb                  -3.156
## KECAMATANBenowo:kategori_gizipendek_tb_u                          -2.838
## KECAMATANBubutan:kategori_gizipendek_tb_u                         -5.178
## KECAMATANBulak:kategori_gizipendek_tb_u                           -2.345
## KECAMATANDukuh Pakis:kategori_gizipendek_tb_u                      0.186
## KECAMATANGayungan:kategori_gizipendek_tb_u                        -6.341
## KECAMATANGenteng:kategori_gizipendek_tb_u                         -0.983
## KECAMATANGubeng:kategori_gizipendek_tb_u                          -0.937
## KECAMATANGunung Anyar:kategori_gizipendek_tb_u                    -6.673
## KECAMATANJambangan:kategori_gizipendek_tb_u                       -0.697
## KECAMATANKarang Pilang:kategori_gizipendek_tb_u                   -3.672
## KECAMATANKenjeran:kategori_gizipendek_tb_u                        -6.886
## KECAMATANKrembangan:kategori_gizipendek_tb_u                      -4.442
## KECAMATANLakarsantri:kategori_gizipendek_tb_u                     -1.977
## KECAMATANMulyorejo:kategori_gizipendek_tb_u                       -0.358
## KECAMATANPabean Cantikan:kategori_gizipendek_tb_u                 -1.610
## KECAMATANPakal:kategori_gizipendek_tb_u                           -1.465
## KECAMATANRungkut:kategori_gizipendek_tb_u                         -4.560
## KECAMATANSambikerep:kategori_gizipendek_tb_u                      -1.459
## KECAMATANSawahan:kategori_gizipendek_tb_u                         -0.567
## KECAMATANSemampir:kategori_gizipendek_tb_u                        -0.748
## KECAMATANSimokerto:kategori_gizipendek_tb_u                       -0.087
## KECAMATANSukolilo:kategori_gizipendek_tb_u                        -1.461
## KECAMATANSukomanunggal:kategori_gizipendek_tb_u                   -1.527
## KECAMATANTambaksari:kategori_gizipendek_tb_u                      -4.716
## KECAMATANTandes:kategori_gizipendek_tb_u                          -0.202
## KECAMATANTegalsari:kategori_gizipendek_tb_u                       -3.979
## KECAMATANTenggilis:kategori_gizipendek_tb_u                       -1.094
## KECAMATANWiyung:kategori_gizipendek_tb_u                          -0.053
## KECAMATANWonocolo:kategori_gizipendek_tb_u                         0.147
## KECAMATANWonokromo:kategori_gizipendek_tb_u                       -6.627
## KECAMATANBenowo:tahun2024                                         -2.607
## KECAMATANBubutan:tahun2024                                        -6.608
## KECAMATANBulak:tahun2024                                          -2.239
## KECAMATANDukuh Pakis:tahun2024                                    -1.426
## KECAMATANGayungan:tahun2024                                       -2.924
## KECAMATANGenteng:tahun2024                                        -1.015
## KECAMATANGubeng:tahun2024                                         -0.951
## KECAMATANGunung Anyar:tahun2024                                   -7.394
## KECAMATANJambangan:tahun2024                                       3.901
## KECAMATANKarang Pilang:tahun2024                                  -4.264
## KECAMATANKenjeran:tahun2024                                       -3.987
## KECAMATANKrembangan:tahun2024                                     -3.595
## KECAMATANLakarsantri:tahun2024                                    -2.625
## KECAMATANMulyorejo:tahun2024                                       4.368
## KECAMATANPabean Cantikan:tahun2024                                -4.703
## KECAMATANPakal:tahun2024                                          -2.359
## KECAMATANRungkut:tahun2024                                        -4.475
## KECAMATANSambikerep:tahun2024                                     -2.008
## KECAMATANSawahan:tahun2024                                        -0.747
## KECAMATANSemampir:tahun2024                                       -2.209
## KECAMATANSimokerto:tahun2024                                      -1.553
## KECAMATANSukolilo:tahun2024                                       -2.119
## KECAMATANSukomanunggal:tahun2024                                   0.964
## KECAMATANTambaksari:tahun2024                                     -3.179
## KECAMATANTandes:tahun2024                                          0.009
## KECAMATANTegalsari:tahun2024                                      -5.316
## KECAMATANTenggilis:tahun2024                                      -1.133
## KECAMATANWiyung:tahun2024                                         -0.505
## KECAMATANWonocolo:tahun2024                                        0.556
## KECAMATANWonokromo:tahun2024                                      -3.064
## kategori_gizigizi_buruk_bbtb:tahun2024                             0.000
## kategori_gizigizi_kurang_bbtb:tahun2024                           -1.426
## kategori_gizipendek_tb_u:tahun2024                                -2.072
## KECAMATANBenowo:kategori_gizigizi_buruk_bbtb:tahun2024             0.000
## KECAMATANBubutan:kategori_gizigizi_buruk_bbtb:tahun2024            0.000
## KECAMATANBulak:kategori_gizigizi_buruk_bbtb:tahun2024              0.000
## KECAMATANDukuh Pakis:kategori_gizigizi_buruk_bbtb:tahun2024        0.000
## KECAMATANGayungan:kategori_gizigizi_buruk_bbtb:tahun2024           0.000
## KECAMATANGenteng:kategori_gizigizi_buruk_bbtb:tahun2024            0.000
## KECAMATANGubeng:kategori_gizigizi_buruk_bbtb:tahun2024             0.000
## KECAMATANGunung Anyar:kategori_gizigizi_buruk_bbtb:tahun2024       0.000
## KECAMATANJambangan:kategori_gizigizi_buruk_bbtb:tahun2024          0.000
## KECAMATANKarang Pilang:kategori_gizigizi_buruk_bbtb:tahun2024      0.000
## KECAMATANKenjeran:kategori_gizigizi_buruk_bbtb:tahun2024           0.000
## KECAMATANKrembangan:kategori_gizigizi_buruk_bbtb:tahun2024         0.000
## KECAMATANLakarsantri:kategori_gizigizi_buruk_bbtb:tahun2024        0.000
## KECAMATANMulyorejo:kategori_gizigizi_buruk_bbtb:tahun2024          0.000
## KECAMATANPabean Cantikan:kategori_gizigizi_buruk_bbtb:tahun2024    0.000
## KECAMATANPakal:kategori_gizigizi_buruk_bbtb:tahun2024              0.000
## KECAMATANRungkut:kategori_gizigizi_buruk_bbtb:tahun2024            0.000
## KECAMATANSambikerep:kategori_gizigizi_buruk_bbtb:tahun2024         0.000
## KECAMATANSawahan:kategori_gizigizi_buruk_bbtb:tahun2024            0.000
## KECAMATANSemampir:kategori_gizigizi_buruk_bbtb:tahun2024           0.000
## KECAMATANSimokerto:kategori_gizigizi_buruk_bbtb:tahun2024          0.000
## KECAMATANSukolilo:kategori_gizigizi_buruk_bbtb:tahun2024           0.000
## KECAMATANSukomanunggal:kategori_gizigizi_buruk_bbtb:tahun2024      0.000
## KECAMATANTambaksari:kategori_gizigizi_buruk_bbtb:tahun2024         0.000
## KECAMATANTandes:kategori_gizigizi_buruk_bbtb:tahun2024             0.000
## KECAMATANTegalsari:kategori_gizigizi_buruk_bbtb:tahun2024          0.000
## KECAMATANTenggilis:kategori_gizigizi_buruk_bbtb:tahun2024          0.000
## KECAMATANWiyung:kategori_gizigizi_buruk_bbtb:tahun2024             0.000
## KECAMATANWonocolo:kategori_gizigizi_buruk_bbtb:tahun2024           0.000
## KECAMATANWonokromo:kategori_gizigizi_buruk_bbtb:tahun2024          0.000
## KECAMATANBenowo:kategori_gizigizi_kurang_bbtb:tahun2024            2.159
## KECAMATANBubutan:kategori_gizigizi_kurang_bbtb:tahun2024           3.888
## KECAMATANBulak:kategori_gizigizi_kurang_bbtb:tahun2024             0.610
## KECAMATANDukuh Pakis:kategori_gizigizi_kurang_bbtb:tahun2024       1.963
## KECAMATANGayungan:kategori_gizigizi_kurang_bbtb:tahun2024          0.438
## KECAMATANGenteng:kategori_gizigizi_kurang_bbtb:tahun2024           1.066
## KECAMATANGubeng:kategori_gizigizi_kurang_bbtb:tahun2024           -3.462
## KECAMATANGunung Anyar:kategori_gizigizi_kurang_bbtb:tahun2024     -0.504
## KECAMATANJambangan:kategori_gizigizi_kurang_bbtb:tahun2024        -0.597
## KECAMATANKarang Pilang:kategori_gizigizi_kurang_bbtb:tahun2024    -2.915
## KECAMATANKenjeran:kategori_gizigizi_kurang_bbtb:tahun2024          1.617
## KECAMATANKrembangan:kategori_gizigizi_kurang_bbtb:tahun2024        3.606
## KECAMATANLakarsantri:kategori_gizigizi_kurang_bbtb:tahun2024       1.957
## KECAMATANMulyorejo:kategori_gizigizi_kurang_bbtb:tahun2024        -2.965
## KECAMATANPabean Cantikan:kategori_gizigizi_kurang_bbtb:tahun2024   3.006
## KECAMATANPakal:kategori_gizigizi_kurang_bbtb:tahun2024             2.431
## KECAMATANRungkut:kategori_gizigizi_kurang_bbtb:tahun2024           2.037
## KECAMATANSambikerep:kategori_gizigizi_kurang_bbtb:tahun2024        1.743
## KECAMATANSawahan:kategori_gizigizi_kurang_bbtb:tahun2024           3.564
## KECAMATANSemampir:kategori_gizigizi_kurang_bbtb:tahun2024          3.005
## KECAMATANSimokerto:kategori_gizigizi_kurang_bbtb:tahun2024         0.266
## KECAMATANSukolilo:kategori_gizigizi_kurang_bbtb:tahun2024          2.154
## KECAMATANSukomanunggal:kategori_gizigizi_kurang_bbtb:tahun2024     1.457
## KECAMATANTambaksari:kategori_gizigizi_kurang_bbtb:tahun2024        2.758
## KECAMATANTandes:kategori_gizigizi_kurang_bbtb:tahun2024            1.051
## KECAMATANTegalsari:kategori_gizigizi_kurang_bbtb:tahun2024         0.829
## KECAMATANTenggilis:kategori_gizigizi_kurang_bbtb:tahun2024         1.544
## KECAMATANWiyung:kategori_gizigizi_kurang_bbtb:tahun2024            2.700
## KECAMATANWonocolo:kategori_gizigizi_kurang_bbtb:tahun2024         -0.262
## KECAMATANWonokromo:kategori_gizigizi_kurang_bbtb:tahun2024         2.363
## KECAMATANBenowo:kategori_gizipendek_tb_u:tahun2024                 4.121
## KECAMATANBubutan:kategori_gizipendek_tb_u:tahun2024                4.113
## KECAMATANBulak:kategori_gizipendek_tb_u:tahun2024                  1.468
## KECAMATANDukuh Pakis:kategori_gizipendek_tb_u:tahun2024            0.945
## KECAMATANGayungan:kategori_gizipendek_tb_u:tahun2024               0.500
## KECAMATANGenteng:kategori_gizipendek_tb_u:tahun2024               -0.202
## KECAMATANGubeng:kategori_gizipendek_tb_u:tahun2024                 0.550
## KECAMATANGunung Anyar:kategori_gizipendek_tb_u:tahun2024           3.922
## KECAMATANJambangan:kategori_gizipendek_tb_u:tahun2024             -2.979
## KECAMATANKarang Pilang:kategori_gizipendek_tb_u:tahun2024          2.568
## KECAMATANKenjeran:kategori_gizipendek_tb_u:tahun2024               2.418
## KECAMATANKrembangan:kategori_gizipendek_tb_u:tahun2024             1.894
## KECAMATANLakarsantri:kategori_gizipendek_tb_u:tahun2024            1.351
## KECAMATANMulyorejo:kategori_gizipendek_tb_u:tahun2024             -3.919
## KECAMATANPabean Cantikan:kategori_gizipendek_tb_u:tahun2024        3.434
## KECAMATANPakal:kategori_gizipendek_tb_u:tahun2024                  1.684
## KECAMATANRungkut:kategori_gizipendek_tb_u:tahun2024                2.032
## KECAMATANSambikerep:kategori_gizipendek_tb_u:tahun2024             1.261
## KECAMATANSawahan:kategori_gizipendek_tb_u:tahun2024                1.159
## KECAMATANSemampir:kategori_gizipendek_tb_u:tahun2024               1.856
## KECAMATANSimokerto:kategori_gizipendek_tb_u:tahun2024              0.665
## KECAMATANSukolilo:kategori_gizipendek_tb_u:tahun2024               0.686
## KECAMATANSukomanunggal:kategori_gizipendek_tb_u:tahun2024         -0.917
## KECAMATANTambaksari:kategori_gizipendek_tb_u:tahun2024             2.271
## KECAMATANTandes:kategori_gizipendek_tb_u:tahun2024                -0.656
## KECAMATANTegalsari:kategori_gizipendek_tb_u:tahun2024              3.530
## KECAMATANTenggilis:kategori_gizipendek_tb_u:tahun2024              0.699
## KECAMATANWiyung:kategori_gizipendek_tb_u:tahun2024                -0.213
## KECAMATANWonocolo:kategori_gizipendek_tb_u:tahun2024              -1.166
## KECAMATANWonokromo:kategori_gizipendek_tb_u:tahun2024              1.700
##                                                                  Pr(>|z|)    
## (Intercept)                                                      3.30e-13 ***
## KECAMATANBenowo                                                  0.000172 ***
## KECAMATANBubutan                                                  < 2e-16 ***
## KECAMATANBulak                                                   0.000339 ***
## KECAMATANDukuh Pakis                                             0.818628    
## KECAMATANGayungan                                                 < 2e-16 ***
## KECAMATANGenteng                                                 0.073502 .  
## KECAMATANGubeng                                                  0.038701 *  
## KECAMATANGunung Anyar                                             < 2e-16 ***
## KECAMATANJambangan                                               1.000000    
## KECAMATANKarang Pilang                                           1.22e-05 ***
## KECAMATANKenjeran                                                 < 2e-16 ***
## KECAMATANKrembangan                                               < 2e-16 ***
## KECAMATANLakarsantri                                             1.16e-07 ***
## KECAMATANMulyorejo                                               0.243641    
## KECAMATANPabean Cantikan                                         0.002624 ** 
## KECAMATANPakal                                                   0.243641    
## KECAMATANRungkut                                                  < 2e-16 ***
## KECAMATANSambikerep                                              0.001325 ** 
## KECAMATANSawahan                                                 0.001864 ** 
## KECAMATANSemampir                                                1.51e-08 ***
## KECAMATANSimokerto                                               0.038701 *  
## KECAMATANSukolilo                                                0.000123 ***
## KECAMATANSukomanunggal                                           0.000941 ***
## KECAMATANTambaksari                                               < 2e-16 ***
## KECAMATANTandes                                                  0.243641    
## KECAMATANTegalsari                                               1.14e-08 ***
## KECAMATANTenggilis                                               0.320621    
## KECAMATANWiyung                                                  0.670245    
## KECAMATANWonocolo                                                0.243641    
## KECAMATANWonokromo                                                < 2e-16 ***
## kategori_gizigizi_buruk_bbtb                                     0.999884    
## kategori_gizigizi_kurang_bbtb                                    0.818628    
## kategori_gizipendek_tb_u                                         0.136142    
## tahun2024                                                        0.005192 ** 
## KECAMATANBenowo:kategori_gizigizi_buruk_bbtb                     0.999891    
## KECAMATANBubutan:kategori_gizigizi_buruk_bbtb                    0.999898    
## KECAMATANBulak:kategori_gizigizi_buruk_bbtb                      0.999899    
## KECAMATANDukuh Pakis:kategori_gizigizi_buruk_bbtb                0.999887    
## KECAMATANGayungan:kategori_gizigizi_buruk_bbtb                   0.999905    
## KECAMATANGenteng:kategori_gizigizi_buruk_bbtb                    0.999998    
## KECAMATANGubeng:kategori_gizigizi_buruk_bbtb                     0.999892    
## KECAMATANGunung Anyar:kategori_gizigizi_buruk_bbtb               0.999905    
## KECAMATANJambangan:kategori_gizigizi_buruk_bbtb                  1.000000    
## KECAMATANKarang Pilang:kategori_gizigizi_buruk_bbtb              0.999895    
## KECAMATANKenjeran:kategori_gizigizi_buruk_bbtb                   0.999902    
## KECAMATANKrembangan:kategori_gizigizi_buruk_bbtb                 0.999897    
## KECAMATANLakarsantri:kategori_gizigizi_buruk_bbtb                0.999896    
## KECAMATANMulyorejo:kategori_gizigizi_buruk_bbtb                  0.999999    
## KECAMATANPabean Cantikan:kategori_gizigizi_buruk_bbtb            0.999997    
## KECAMATANPakal:kategori_gizigizi_buruk_bbtb                      0.999895    
## KECAMATANRungkut:kategori_gizigizi_buruk_bbtb                    0.999897    
## KECAMATANSambikerep:kategori_gizigizi_buruk_bbtb                 0.999891    
## KECAMATANSawahan:kategori_gizigizi_buruk_bbtb                    0.999889    
## KECAMATANSemampir:kategori_gizigizi_buruk_bbtb                   0.999890    
## KECAMATANSimokerto:kategori_gizigizi_buruk_bbtb                  0.999890    
## KECAMATANSukolilo:kategori_gizigizi_buruk_bbtb                   0.999899    
## KECAMATANSukomanunggal:kategori_gizigizi_buruk_bbtb              0.999996    
## KECAMATANTambaksari:kategori_gizigizi_buruk_bbtb                 0.999898    
## KECAMATANTandes:kategori_gizigizi_buruk_bbtb                     0.999999    
## KECAMATANTegalsari:kategori_gizigizi_buruk_bbtb                  0.999899    
## KECAMATANTenggilis:kategori_gizigizi_buruk_bbtb                  0.999888    
## KECAMATANWiyung:kategori_gizigizi_buruk_bbtb                     0.999887    
## KECAMATANWonocolo:kategori_gizigizi_buruk_bbtb                   0.999999    
## KECAMATANWonokromo:kategori_gizigizi_buruk_bbtb                  0.999902    
## KECAMATANBenowo:kategori_gizigizi_kurang_bbtb                    0.454133    
## KECAMATANBubutan:kategori_gizigizi_kurang_bbtb                   2.24e-05 ***
## KECAMATANBulak:kategori_gizigizi_kurang_bbtb                     0.728524    
## KECAMATANDukuh Pakis:kategori_gizigizi_kurang_bbtb               0.219918    
## KECAMATANGayungan:kategori_gizigizi_kurang_bbtb                  0.174418    
## KECAMATANGenteng:kategori_gizigizi_kurang_bbtb                   0.093013 .  
## KECAMATANGubeng:kategori_gizigizi_kurang_bbtb                    6.53e-08 ***
## KECAMATANGunung Anyar:kategori_gizigizi_kurang_bbtb              0.739404    
## KECAMATANJambangan:kategori_gizigizi_kurang_bbtb                 0.869477    
## KECAMATANKarang Pilang:kategori_gizigizi_kurang_bbtb             0.001861 ** 
## KECAMATANKenjeran:kategori_gizigizi_kurang_bbtb                  0.058158 .  
## KECAMATANKrembangan:kategori_gizigizi_kurang_bbtb                0.011927 *  
## KECAMATANLakarsantri:kategori_gizigizi_kurang_bbtb               0.189396    
## KECAMATANMulyorejo:kategori_gizigizi_kurang_bbtb                 0.627440    
## KECAMATANPabean Cantikan:kategori_gizigizi_kurang_bbtb           0.892371    
## KECAMATANPakal:kategori_gizigizi_kurang_bbtb                     0.550798    
## KECAMATANRungkut:kategori_gizigizi_kurang_bbtb                   0.385566    
## KECAMATANSambikerep:kategori_gizigizi_kurang_bbtb                0.240615    
## KECAMATANSawahan:kategori_gizigizi_kurang_bbtb                   0.314707    
## KECAMATANSemampir:kategori_gizigizi_kurang_bbtb                  0.062985 .  
## KECAMATANSimokerto:kategori_gizigizi_kurang_bbtb                 0.668498    
## KECAMATANSukolilo:kategori_gizigizi_kurang_bbtb                  0.122737    
## KECAMATANSukomanunggal:kategori_gizigizi_kurang_bbtb             0.004237 ** 
## KECAMATANTambaksari:kategori_gizigizi_kurang_bbtb                0.331014    
## KECAMATANTandes:kategori_gizigizi_kurang_bbtb                    0.773436    
## KECAMATANTegalsari:kategori_gizigizi_kurang_bbtb                 0.008374 ** 
## KECAMATANTenggilis:kategori_gizigizi_kurang_bbtb                 0.030371 *  
## KECAMATANWiyung:kategori_gizigizi_kurang_bbtb                    0.273429    
## KECAMATANWonocolo:kategori_gizigizi_kurang_bbtb                  0.017656 *  
## KECAMATANWonokromo:kategori_gizigizi_kurang_bbtb                 0.001597 ** 
## KECAMATANBenowo:kategori_gizipendek_tb_u                         0.004545 ** 
## KECAMATANBubutan:kategori_gizipendek_tb_u                        2.25e-07 ***
## KECAMATANBulak:kategori_gizipendek_tb_u                          0.019045 *  
## KECAMATANDukuh Pakis:kategori_gizipendek_tb_u                    0.852751    
## KECAMATANGayungan:kategori_gizipendek_tb_u                       2.29e-10 ***
## KECAMATANGenteng:kategori_gizipendek_tb_u                        0.325623    
## KECAMATANGubeng:kategori_gizipendek_tb_u                         0.348807    
## KECAMATANGunung Anyar:kategori_gizipendek_tb_u                   2.51e-11 ***
## KECAMATANJambangan:kategori_gizipendek_tb_u                      0.486112    
## KECAMATANKarang Pilang:kategori_gizipendek_tb_u                  0.000241 ***
## KECAMATANKenjeran:kategori_gizipendek_tb_u                       5.74e-12 ***
## KECAMATANKrembangan:kategori_gizipendek_tb_u                     8.93e-06 ***
## KECAMATANLakarsantri:kategori_gizipendek_tb_u                    0.048057 *  
## KECAMATANMulyorejo:kategori_gizipendek_tb_u                      0.720528    
## KECAMATANPabean Cantikan:kategori_gizipendek_tb_u                0.107468    
## KECAMATANPakal:kategori_gizipendek_tb_u                          0.143043    
## KECAMATANRungkut:kategori_gizipendek_tb_u                        5.11e-06 ***
## KECAMATANSambikerep:kategori_gizipendek_tb_u                     0.144627    
## KECAMATANSawahan:kategori_gizipendek_tb_u                        0.570594    
## KECAMATANSemampir:kategori_gizipendek_tb_u                       0.454473    
## KECAMATANSimokerto:kategori_gizipendek_tb_u                      0.931067    
## KECAMATANSukolilo:kategori_gizipendek_tb_u                       0.144044    
## KECAMATANSukomanunggal:kategori_gizipendek_tb_u                  0.126646    
## KECAMATANTambaksari:kategori_gizipendek_tb_u                     2.41e-06 ***
## KECAMATANTandes:kategori_gizipendek_tb_u                         0.839962    
## KECAMATANTegalsari:kategori_gizipendek_tb_u                      6.93e-05 ***
## KECAMATANTenggilis:kategori_gizipendek_tb_u                      0.274135    
## KECAMATANWiyung:kategori_gizipendek_tb_u                         0.958027    
## KECAMATANWonocolo:kategori_gizipendek_tb_u                       0.883028    
## KECAMATANWonokromo:kategori_gizipendek_tb_u                      3.42e-11 ***
## KECAMATANBenowo:tahun2024                                        0.009123 ** 
## KECAMATANBubutan:tahun2024                                       3.88e-11 ***
## KECAMATANBulak:tahun2024                                         0.025143 *  
## KECAMATANDukuh Pakis:tahun2024                                   0.153754    
## KECAMATANGayungan:tahun2024                                      0.003458 ** 
## KECAMATANGenteng:tahun2024                                       0.309951    
## KECAMATANGubeng:tahun2024                                        0.341634    
## KECAMATANGunung Anyar:tahun2024                                  1.43e-13 ***
## KECAMATANJambangan:tahun2024                                     9.59e-05 ***
## KECAMATANKarang Pilang:tahun2024                                 2.01e-05 ***
## KECAMATANKenjeran:tahun2024                                      6.69e-05 ***
## KECAMATANKrembangan:tahun2024                                    0.000324 ***
## KECAMATANLakarsantri:tahun2024                                   0.008677 ** 
## KECAMATANMulyorejo:tahun2024                                     1.26e-05 ***
## KECAMATANPabean Cantikan:tahun2024                               2.56e-06 ***
## KECAMATANPakal:tahun2024                                         0.018336 *  
## KECAMATANRungkut:tahun2024                                       7.65e-06 ***
## KECAMATANSambikerep:tahun2024                                    0.044637 *  
## KECAMATANSawahan:tahun2024                                       0.454811    
## KECAMATANSemampir:tahun2024                                      0.027189 *  
## KECAMATANSimokerto:tahun2024                                     0.120319    
## KECAMATANSukolilo:tahun2024                                      0.034122 *  
## KECAMATANSukomanunggal:tahun2024                                 0.335212    
## KECAMATANTambaksari:tahun2024                                    0.001480 ** 
## KECAMATANTandes:tahun2024                                        0.992430    
## KECAMATANTegalsari:tahun2024                                     1.06e-07 ***
## KECAMATANTenggilis:tahun2024                                     0.257299    
## KECAMATANWiyung:tahun2024                                        0.613330    
## KECAMATANWonocolo:tahun2024                                      0.577982    
## KECAMATANWonokromo:tahun2024                                     0.002186 ** 
## kategori_gizigizi_buruk_bbtb:tahun2024                           0.999997    
## kategori_gizigizi_kurang_bbtb:tahun2024                          0.153754    
## kategori_gizipendek_tb_u:tahun2024                               0.038224 *  
## KECAMATANBenowo:kategori_gizigizi_buruk_bbtb:tahun2024           0.999995    
## KECAMATANBubutan:kategori_gizigizi_buruk_bbtb:tahun2024          0.999994    
## KECAMATANBulak:kategori_gizigizi_buruk_bbtb:tahun2024            0.999994    
## KECAMATANDukuh Pakis:kategori_gizigizi_buruk_bbtb:tahun2024      1.000000    
## KECAMATANGayungan:kategori_gizigizi_buruk_bbtb:tahun2024         0.999941    
## KECAMATANGenteng:kategori_gizigizi_buruk_bbtb:tahun2024          0.999999    
## KECAMATANGubeng:kategori_gizigizi_buruk_bbtb:tahun2024           0.999999    
## KECAMATANGunung Anyar:kategori_gizigizi_buruk_bbtb:tahun2024     0.999944    
## KECAMATANJambangan:kategori_gizigizi_buruk_bbtb:tahun2024        0.999943    
## KECAMATANKarang Pilang:kategori_gizigizi_buruk_bbtb:tahun2024    0.999941    
## KECAMATANKenjeran:kategori_gizigizi_buruk_bbtb:tahun2024         0.999997    
## KECAMATANKrembangan:kategori_gizigizi_buruk_bbtb:tahun2024       1.000000    
## KECAMATANLakarsantri:kategori_gizigizi_buruk_bbtb:tahun2024      0.999998    
## KECAMATANMulyorejo:kategori_gizigizi_buruk_bbtb:tahun2024        0.999996    
## KECAMATANPabean Cantikan:kategori_gizigizi_buruk_bbtb:tahun2024  0.999994    
## KECAMATANPakal:kategori_gizigizi_buruk_bbtb:tahun2024            0.999996    
## KECAMATANRungkut:kategori_gizigizi_buruk_bbtb:tahun2024          0.999999    
## KECAMATANSambikerep:kategori_gizigizi_buruk_bbtb:tahun2024       0.999997    
## KECAMATANSawahan:kategori_gizigizi_buruk_bbtb:tahun2024          0.999999    
## KECAMATANSemampir:kategori_gizigizi_buruk_bbtb:tahun2024         0.999996    
## KECAMATANSimokerto:kategori_gizigizi_buruk_bbtb:tahun2024        0.999999    
## KECAMATANSukolilo:kategori_gizigizi_buruk_bbtb:tahun2024         0.999941    
## KECAMATANSukomanunggal:kategori_gizigizi_buruk_bbtb:tahun2024    0.999999    
## KECAMATANTambaksari:kategori_gizigizi_buruk_bbtb:tahun2024       0.999996    
## KECAMATANTandes:kategori_gizigizi_buruk_bbtb:tahun2024           1.000000    
## KECAMATANTegalsari:kategori_gizigizi_buruk_bbtb:tahun2024        0.999995    
## KECAMATANTenggilis:kategori_gizigizi_buruk_bbtb:tahun2024        1.000000    
## KECAMATANWiyung:kategori_gizigizi_buruk_bbtb:tahun2024           0.999999    
## KECAMATANWonocolo:kategori_gizigizi_buruk_bbtb:tahun2024         0.999936    
## KECAMATANWonokromo:kategori_gizigizi_buruk_bbtb:tahun2024        0.999997    
## KECAMATANBenowo:kategori_gizigizi_kurang_bbtb:tahun2024          0.030869 *  
## KECAMATANBubutan:kategori_gizigizi_kurang_bbtb:tahun2024         0.000101 ***
## KECAMATANBulak:kategori_gizigizi_kurang_bbtb:tahun2024           0.541666    
## KECAMATANDukuh Pakis:kategori_gizigizi_kurang_bbtb:tahun2024     0.049620 *  
## KECAMATANGayungan:kategori_gizigizi_kurang_bbtb:tahun2024        0.661407    
## KECAMATANGenteng:kategori_gizigizi_kurang_bbtb:tahun2024         0.286211    
## KECAMATANGubeng:kategori_gizigizi_kurang_bbtb:tahun2024          0.000535 ***
## KECAMATANGunung Anyar:kategori_gizigizi_kurang_bbtb:tahun2024    0.614195    
## KECAMATANJambangan:kategori_gizigizi_kurang_bbtb:tahun2024       0.550253    
## KECAMATANKarang Pilang:kategori_gizigizi_kurang_bbtb:tahun2024   0.003552 ** 
## KECAMATANKenjeran:kategori_gizigizi_kurang_bbtb:tahun2024        0.105812    
## KECAMATANKrembangan:kategori_gizigizi_kurang_bbtb:tahun2024      0.000311 ***
## KECAMATANLakarsantri:kategori_gizigizi_kurang_bbtb:tahun2024     0.050308 .  
## KECAMATANMulyorejo:kategori_gizigizi_kurang_bbtb:tahun2024       0.003026 ** 
## KECAMATANPabean Cantikan:kategori_gizigizi_kurang_bbtb:tahun2024 0.002643 ** 
## KECAMATANPakal:kategori_gizigizi_kurang_bbtb:tahun2024           0.015073 *  
## KECAMATANRungkut:kategori_gizigizi_kurang_bbtb:tahun2024         0.041674 *  
## KECAMATANSambikerep:kategori_gizigizi_kurang_bbtb:tahun2024      0.081353 .  
## KECAMATANSawahan:kategori_gizigizi_kurang_bbtb:tahun2024         0.000365 ***
## KECAMATANSemampir:kategori_gizigizi_kurang_bbtb:tahun2024        0.002652 ** 
## KECAMATANSimokerto:kategori_gizigizi_kurang_bbtb:tahun2024       0.790303    
## KECAMATANSukolilo:kategori_gizigizi_kurang_bbtb:tahun2024        0.031277 *  
## KECAMATANSukomanunggal:kategori_gizigizi_kurang_bbtb:tahun2024   0.145092    
## KECAMATANTambaksari:kategori_gizigizi_kurang_bbtb:tahun2024      0.005816 ** 
## KECAMATANTandes:kategori_gizigizi_kurang_bbtb:tahun2024          0.293446    
## KECAMATANTegalsari:kategori_gizigizi_kurang_bbtb:tahun2024       0.407191    
## KECAMATANTenggilis:kategori_gizigizi_kurang_bbtb:tahun2024       0.122468    
## KECAMATANWiyung:kategori_gizigizi_kurang_bbtb:tahun2024          0.006925 ** 
## KECAMATANWonocolo:kategori_gizigizi_kurang_bbtb:tahun2024        0.793260    
## KECAMATANWonokromo:kategori_gizigizi_kurang_bbtb:tahun2024       0.018131 *  
## KECAMATANBenowo:kategori_gizipendek_tb_u:tahun2024               3.77e-05 ***
## KECAMATANBubutan:kategori_gizipendek_tb_u:tahun2024              3.90e-05 ***
## KECAMATANBulak:kategori_gizipendek_tb_u:tahun2024                0.142098    
## KECAMATANDukuh Pakis:kategori_gizipendek_tb_u:tahun2024          0.344897    
## KECAMATANGayungan:kategori_gizipendek_tb_u:tahun2024             0.617016    
## KECAMATANGenteng:kategori_gizipendek_tb_u:tahun2024              0.839919    
## KECAMATANGubeng:kategori_gizipendek_tb_u:tahun2024               0.582080    
## KECAMATANGunung Anyar:kategori_gizipendek_tb_u:tahun2024         8.78e-05 ***
## KECAMATANJambangan:kategori_gizipendek_tb_u:tahun2024            0.002889 ** 
## KECAMATANKarang Pilang:kategori_gizipendek_tb_u:tahun2024        0.010243 *  
## KECAMATANKenjeran:kategori_gizipendek_tb_u:tahun2024             0.015598 *  
## KECAMATANKrembangan:kategori_gizipendek_tb_u:tahun2024           0.058178 .  
## KECAMATANLakarsantri:kategori_gizipendek_tb_u:tahun2024          0.176814    
## KECAMATANMulyorejo:kategori_gizipendek_tb_u:tahun2024            8.90e-05 ***
## KECAMATANPabean Cantikan:kategori_gizipendek_tb_u:tahun2024      0.000596 ***
## KECAMATANPakal:kategori_gizipendek_tb_u:tahun2024                0.092269 .  
## KECAMATANRungkut:kategori_gizipendek_tb_u:tahun2024              0.042200 *  
## KECAMATANSambikerep:kategori_gizipendek_tb_u:tahun2024           0.207364    
## KECAMATANSawahan:kategori_gizipendek_tb_u:tahun2024              0.246653    
## KECAMATANSemampir:kategori_gizipendek_tb_u:tahun2024             0.063484 .  
## KECAMATANSimokerto:kategori_gizipendek_tb_u:tahun2024            0.506002    
## KECAMATANSukolilo:kategori_gizipendek_tb_u:tahun2024             0.492582    
## KECAMATANSukomanunggal:kategori_gizipendek_tb_u:tahun2024        0.358950    
## KECAMATANTambaksari:kategori_gizipendek_tb_u:tahun2024           0.023172 *  
## KECAMATANTandes:kategori_gizipendek_tb_u:tahun2024               0.512066    
## KECAMATANTegalsari:kategori_gizipendek_tb_u:tahun2024            0.000415 ***
## KECAMATANTenggilis:kategori_gizipendek_tb_u:tahun2024            0.484818    
## KECAMATANWiyung:kategori_gizipendek_tb_u:tahun2024               0.831002    
## KECAMATANWonocolo:kategori_gizipendek_tb_u:tahun2024             0.243707    
## KECAMATANWonokromo:kategori_gizipendek_tb_u:tahun2024            0.089117 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 2.1482e+04  on 247  degrees of freedom
## Residual deviance: 3.6947e-10  on   0  degrees of freedom
## AIC: 1637.9
## 
## Number of Fisher Scoring iterations: 23
# Model Homogeneous (tanpa interaksi 3 arah)
mod_homogeneous <- glm(jumlah ~ (KECAMATAN + kategori_gizi + tahun)^2,
                       family = poisson, data = data_long)

# Bandingkan dengan saturated
anova(mod_homogeneous, mod_saturated, test = "Chisq")
## Analysis of Deviance Table
## 
## Model 1: jumlah ~ (KECAMATAN + kategori_gizi + tahun)^2
## Model 2: jumlah ~ KECAMATAN * kategori_gizi * tahun
##   Resid. Df Resid. Dev Df Deviance  Pr(>Chi)    
## 1        90     763.38                          
## 2         0       0.00 90   763.38 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Hasil analisis model log-linear menunjukkan bahwa:

  • Model saturated yang mencakup semua interaksi (KECAMATAN * kategori_gizi * tahun) memiliki residual deviance = 0, yang menunjukkan bahwa model sangat pas dengan data.
  • Ketika dibandingkan dengan model homogeneous (tanpa interaksi 3 arah), didapatkan:
    • Deviance = 763.38 dengan p-value < 2.2e-16
    • Artinya, interaksi tiga arah antara kecamatan, kategori gizi, dan tahun signifikan secara statistik.

Interpretasi: > Distribusi jumlah balita berdasarkan status gizi berbeda-beda antar kecamatan, dan perbedaannya juga berubah dari tahun ke tahun. Artinya, efek kategori gizi tidak sama di semua kecamatan dan tidak konstan antar tahun.

Uji Conditional Independence

### Kondisional pada Kecamatan
mod_cond_kecamatan <- glm(jumlah ~ KECAMATAN * kategori_gizi + KECAMATAN * tahun,
                          family = poisson, data = data_long)

anova(mod_cond_kecamatan, mod_homogeneous, test = "Chisq")
## Analysis of Deviance Table
## 
## Model 1: jumlah ~ KECAMATAN * kategori_gizi + KECAMATAN * tahun
## Model 2: jumlah ~ (KECAMATAN + kategori_gizi + tahun)^2
##   Resid. Df Resid. Dev Df Deviance  Pr(>Chi)    
## 1        93     821.50                          
## 2        90     763.38  3   58.121 1.481e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
### Kondisional pada Kategori Gizi
mod_cond_gizi <- glm(jumlah ~ kategori_gizi * KECAMATAN + kategori_gizi * tahun,
                     family = poisson, data = data_long)

anova(mod_cond_gizi, mod_homogeneous, test = "Chisq")
## Analysis of Deviance Table
## 
## Model 1: jumlah ~ kategori_gizi * KECAMATAN + kategori_gizi * tahun
## Model 2: jumlah ~ (KECAMATAN + kategori_gizi + tahun)^2
##   Resid. Df Resid. Dev Df Deviance  Pr(>Chi)    
## 1       120    2804.53                          
## 2        90     763.38 30   2041.2 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
### Kondisional pada Tahun
mod_cond_tahun <- glm(jumlah ~ tahun * KECAMATAN + tahun * kategori_gizi,
                      family = poisson, data = data_long)

anova(mod_cond_tahun, mod_homogeneous, test = "Chisq")
## Analysis of Deviance Table
## 
## Model 1: jumlah ~ tahun * KECAMATAN + tahun * kategori_gizi
## Model 2: jumlah ~ (KECAMATAN + kategori_gizi + tahun)^2
##   Resid. Df Resid. Dev Df Deviance  Pr(>Chi)    
## 1       180     3917.8                          
## 2        90      763.4 90   3154.4 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Uji conditional independence dilakukan untuk melihat apakah hubungan antar dua variabel cukup menjelaskan pola data setelah mengendalikan variabel ketiga. Tiga model diuji:

  • Kondisional pada kecamatan
  • Kondisional pada kategori gizi
  • Kondisional pada tahun

Semua uji menghasilkan p-value < 0.05, yang berarti semua model conditional independence secara signifikan lebih buruk dibandingkan model homogeneous. Oleh karena itu:

AIC(mod_saturated, mod_homogeneous, mod_cond_kecamatan,
    mod_cond_gizi, mod_cond_tahun)
##                     df      AIC
## mod_saturated      248 1637.921
## mod_homogeneous    158 2221.303
## mod_cond_kecamatan 155 2273.424
## mod_cond_gizi      128 4202.449
## mod_cond_tahun      68 5195.711

untuk menentukan model terbaik, kita membandingkan lima model menggunakan kriteria:

  • AIC (Akaike Information Criterion): Semakin kecil, semakin baik
  • Derajat Bebas (df): Menggambarkan kompleksitas model
  • Deviance: Semakin kecil → semakin sesuai dengan data
Model DF AIC
Saturated 248 1637.92
Homogeneous 158 2221.30
Conditional on Kecamatan 155 2273.42
Conditional on Kategori Gizi 128 4202.45
Conditional on Tahun 68 5195.71

interpretasi: > Model saturated memiliki AIC terendah dan deviance = 0, menjadikannya model terbaik dalam menjelaskan hubungan antara kecamatan, kategori gizi, dan tahun. Model-model lain memiliki AIC yang jauh lebih tinggi, menandakan bahwa mereka tidak mampu menangkap kompleksitas interaksi antar variabel.

Oleh karena itu, model saturated dipilih sebagai model final dalam analisis ini.

Kesimpulan

Analisis log-linear pada data status gizi balita berdasarkan kecamatan dan tahun memberikan pemahaman yang mendalam mengenai pola keterkaitan antara tiga variabel kategori: KECAMATAN, kategori gizi, dan TAHUN.

Berikut poin-poin utama dari hasil analisis:

Interaksi Tiga Arah Signifikan

Hasil uji terhadap model homogeneous dibandingkan dengan model saturated menunjukkan bahwa interaksi tiga arah antara kecamatan, kategori gizi, dan tahun sangat signifikan (p-value < 2.2e-16). Hal ini mengindikasikan bahwa:

Pola distribusi status gizi balita tidak hanya berbeda antar kecamatan, tetapi juga berubah dari tahun ke tahun, dan perbedaan tersebut tidak bersifat seragam untuk setiap kategori gizi.


Model Conditional Independence Tidak Memadai

Uji terhadap tiga model conditional independence (yang mengabaikan satu dari tiga interaksi dua arah) juga menunjukkan bahwa:

  • Setiap model conditional memiliki p-value sangat kecil dibanding homogeneous
  • Artinya, semua hubungan dua arah saja tidak cukup menjelaskan struktur data

Hal ini menegaskan bahwa ketiga variabel saling berinteraksi secara kompleks, dan tidak dapat disederhanakan secara signifikan.


Model Saturated adalah Model Terbaik

Dari perbandingan AIC dan deviance:

Model DF AIC
Saturated 248 1637.9
Homogeneous 158 2221.3
Conditional on Kecamatan 155 2273.4
Conditional on Kategori Gizi 128 4202.4
Conditional on Tahun 68 5195.7

Model saturated memiliki nilai AIC terendah, yang menunjukkan bahwa model tersebut paling baik dalam mewakili data secara statistik tanpa overfitting.


Implikasi

  • Kebijakan gizi di Surabaya perlu disesuaikan secara lokal (per kecamatan) dan mempertimbangkan perubahan antar tahun.
  • Intervensi tidak bisa bersifat general, karena pola gizi buruk atau pendek tidak seragam di seluruh kecamatan, dan juga berubah antar tahun.
  • Diperlukan pendekatan berbasis data dan spasial untuk mengarahkan bantuan secara lebih efektif.

Penutup

Melalui pendekatan log-linear, kita dapat memahami bagaimana struktur dan dinamika masalah gizi balita di Surabaya terjadi dalam konteks wilayah dan waktu. Pendekatan ini membuka peluang untuk pengambilan keputusan yang lebih cerdas dan terarah dalam upaya perbaikan status gizi anak di tingkat lokal.

Referensi

  1. Modul Analisis Data Kategori. (2023). Program Studi Statistika, Universitas Padjadjaran.

  2. Siregar, A. P. (2021). Pengantar Statistika untuk Penelitian Sosial dan Ekonomi. Medan: CV. Widya Pustaka.

  3. Statistikian.com. (2022). Jenis Data dalam Statistika dan Contohnya. Diakses dari https://statistikian.com/jenis-data-dalam-statistika/

  4. Dwi, L. (2020). Penerapan Algoritma Apriori dalam Menganalisis Pola Pembelian Produk. Jurnal Ilmiah Sistem Informasi, 15(2), 8895.

  5. Blog DQLab. (2023). Pahami K-Means Clustering dalam Data Science. Diakses dari https://dqlab.id/

  6. Materi Kuliah Analisis Data Kategorik. (2023). Fakultas MIPA, Universitas Padjadjaran.

  7. R Documentation. (2024). R Functions and Examples. Diakses dari https://www.rdocumentation.org/

  8. Agresti, A. (2002). Categorical Data Analysis. New York: John Wiley & Sons. (Digunakan sebagai referensi tambahan dasar teori, jika dibutuhkan)

  9. Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning (2nd ed.). Springer. (Sebagai referensi tambahan untuk clustering dan model statistik)

  10. Dinas Statistik Indonesia. (2023). Contoh Tabel Kontingensi dan Aplikasinya. Diakses dari https://bps.go.id/

  11. UjiStatistik.com. (2023). Uji Proporsi Dua Sampel dan Interpretasinya. Diakses dari https://ujistatistik.com/uji-proporsi-2-sampel/

  12. Septiani, D. (2023). Analisis Asosiasi dengan RD, RR, dan OR. Jurnal Statistika Terapan, 18(1), 334