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:
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.
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:
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
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.
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.
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.
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.
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:
Membantu menemukan pola tersembunyi dalam kelompok data. Misalnya, tren peningkatan preferensi produk tertentu berdasarkan kelompok usia atau wilayah.
Menilai apakah dua atau lebih variabel kategori saling berkaitan. Contohnya, apakah jenis kelamin berkorelasi dengan jenis pekerjaan yang dipilih?
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.
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.
Analisis data kategori tidak hanya berguna dalam bidang akademik, tetapi juga memiliki dampak signifikan dalam berbagai sektor praktis. Berikut beberapa contoh penerapan dan manfaatnya:
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.
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 dilakukan untuk menguji hipotesis nol bahwa tidak ada hubungan antara dua variabel kategori.
# 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
Ketika data kategorik kita menjadi variabel respon (Y), dan kita ingin tahu apa yang memengaruhinya, Regresi Logistik jadi jawabannya!
Regresi logistik digunakan saat: Variabel dependen adalah kategori biner (contoh: Ya/Tidak, Sukses/Gagal) Ingin mengetahui faktor-faktor yang memengaruhi peluang suatu kejadian terjadi
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)
\[ \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 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
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!
Kalau kamu punya tabel frekuensi antara dua variabel kategorik, misalnya: - Jenis Produk vs Tipe Konsumen - Wilayah vs Preferensi Pilihan - Fakultas vs Hobi Mahasiswa
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")
Dalam analisis data kategori, metode pohon keputusan (Decision Tree) dan Random Forest sangat berguna untuk klasifikasi dan prediksi berdasarkan variabel kategorik maupun campuran.
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.
Misalnya, kita ingin memprediksi apakah seseorang akan membeli produk berdasarkan: - Usia (Kategori: Muda, Dewasa, Tua) - Status (Pelajar, Bekerja, Pensiunan) - Pendapatan (Rendah, Menengah, Tinggi)
# 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) *
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 |
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.
| 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 |
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)
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
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:
# 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
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.
Distribusi Binomial berlaku jika:
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\)
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%.
# 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:
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.
Distribusi Multinomial digunakan ketika:
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:
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%
# 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
Distribusi ini cocok saat:
Distribusi Poisson cocok digunakan saat kita ingin mengetahui jumlah kejadian dalam suatu periode waktu atau area tertentu, tanpa batas atas jumlah kejadian.
Contoh:
\[ P(X = x) = \frac{e^{-\lambda} \cdot \lambda^x}{x!} \]
di mana:
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%
# 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:
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.
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.
Eksperimen adalah jenis paling terkontrol dari prospective sampling. Dalam eksperimen:
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:
Kelebihan:
Kekurangan:
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:
Kekurangan:
# 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.
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.
Studi kasus-kontrol adalah bentuk paling umum dari retrospective sampling. Dalam desain ini:
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:
Kekurangan:
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:
Kekurangan:
# 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.
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 |
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 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:
Tabel ini menjadi dasar untuk menghitung berbagai distribusi peluang (bersama, marginal, bersyarat) serta ukuran asosiasi seperti Risk Difference, Relative Risk, dan Odds Ratio.
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.
\[ P(A \cap B) = \frac{\text{Frekuensi pada sel } (A,B)}{n} \]
Keterangan:
| 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:
a / nb / nc / nd / nPeluang 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.
\[ 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.
| 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.
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”.
\[ 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.
| 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} \]
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.
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 |
\[ P(A \cap B) = \frac{\text{Frekuensi A dan B}}{n} \]
\[ P(A) = \frac{\text{Jumlah dalam baris/kolom}}{n} \]
\[ P(A|B) = \frac{P(A \cap B)}{P(B)} \]
# 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 :
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.
Ukuran asosiasi sangat berguna dalam berbagai konteks seperti:
Dengan tabel kontingensi 2x2, kita bisa menghitung ukuran asosiasi untuk menjawab pertanyaan-pertanyaan semacam itu secara kuantitatif dan objektif.
Ada beberapa ukuran asosiasi yang populer digunakan dalam konteks tabel 22, yaitu:
Masing-masing memiliki konteks penggunaan yang khas. Sebagai contoh :
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.
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.
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} \]
Relative Risk (RR) atau risiko relatif mengukur seberapa besar risiko kejadian pada kelompok terpapar dibandingkan dengan kelompok tidak terpapar.
\[ \text{RR} = \frac{\frac{a}{a + b}}{\frac{c}{c + d}} \]
Contoh: RR = 2 artinya kelompok terpapar memiliki risiko 2 kali lebih besar mengalami outcome dibandingkan yang tidak terpapar.
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).
\[ \text{OR} = \frac{a \cdot d}{b \cdot c} \]
Atau bisa juga ditulis:
\[ \text{OR} = \frac{\text{Odds di kelompok terpapar}}{\text{Odds di kelompok tidak terpapar}} = \frac{a/b}{c/d} \]
Contoh: OR = 3 berarti odds outcome di kelompok terpapar tiga kali lebih besar dibandingkan yang tidak terpapar.
| 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.
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:
\[ 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.
\[ 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.
\[ 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.
# 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
| 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 |
Kapan sebaiknya menggunakan Tabel Kontingensi 22?
Kapan menghitung Peluang Bersama, Marginal, dan Bersyarat?
Kapan memakai Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR)?
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
Inferensi statistik adalah proses membuat kesimpulan umum tentang populasi berdasarkan data sampel.
Dalam konteks tabel kontingensi dua arah, kita tertarik pada:
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?
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 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.
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%.
# 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
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?
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”.
| Ingin Kembali | Tidak Ingin Kembali | Total | |
|---|---|---|---|
| Puas | 70 | 10 | 80 |
| Tidak Puas | 20 | 100 | 120 |
\[ 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
\[ 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.
# 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
Uji Chi-Square merupakan metode paling umum dalam analisis data kategori untuk mengevaluasi apakah dua variabel kategori saling berkaitan atau independen.
Untuk mengetahui apakah distribusi satu variabel berbeda tergantung pada kategori variabel lainnya.
| Kepuasan | Ya (Kembali) | Tidak | Total |
|---|---|---|---|
| Puas | 70 | 10 | 80 |
| Tidak Puas | 20 | 100 | 120 |
| Total | 90 | 110 | 200 |
\[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
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.
# 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.
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.
| Obat | Sembuh | Tidak Sembuh | Total |
|---|---|---|---|
| A | 3 | 1 | 4 |
| B | 1 | 3 | 4 |
| Total | 4 | 4 | 8 |
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.
# 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.
| 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.
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.
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)
Berikut adalah beberapa jenis residual yang sering digunakan dalam deteksi outlier:
\[ 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.
\[ SR_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}(1 - p_{i.})(1 - p_{.j})}} \]
Adjusted residual mempertimbangkan koreksi atas dependensi struktur baris dan kolom. Nilai-nilainya digunakan dalam output software seperti SPSS.
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 |
# 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 :
Aturan umum:
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?
# 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")
| 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)
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.
Misalnya kita memiliki 3 variabel:
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:
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\).
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:
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.
Tabel Marginal:
| X Y | Y=0 | Y=1 | Total |
|---|---|---|---|
| X=0 | 18 | 12 | 30 |
| X=1 | 18 | 12 | 30 |
| Total | 36 | 24 | 60 |
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 |
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
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.
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:
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 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:
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.
Tabel peluang marginal menunjukkan peluang dari satu peristiwa tanpa mempertimbangkan peristiwa lainnya. Ini dapat dihitung dengan menjumlahkan nilai-nilai dalam tabel probabilitas bersama.
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.
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 |
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 \]
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 \]
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
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.
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 untuk menghitung Beda Peluang (RD) adalah:
\[ RD = P(\text{Event A}) - P(\text{Event B}) \]
Di mana:
Misalkan dalam studi mengenai vaksinasi, kita memiliki dua kelompok:
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.
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:
Menggunakan data dari contoh sebelumnya:
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.
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:
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.
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.
Dari data di atas:
\[ RD = 0.6 - 0.8 = -0.2 \]
\[ RR = \frac{0.6}{0.8} = 0.75 \]
\[ OR = \frac{0.6 / 0.4}{0.8 / 0.2} = \frac{1.5}{4} = 0.375 \]
# 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.
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 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\).
Misalkan kita memiliki data tentang faktor-faktor yang mempengaruhi risiko penyakit:
Kita ingin menguji apakah merokok dan penyakit jantung adalah independen setelah mengontrol usia.
Untuk memeriksa conditional independence, kita membagi data berdasarkan usia, kemudian melakukan uji Chi-Square pada setiap kelompok usia.
| Merokok / Penyakit Jantung | Ya | Tidak |
|---|---|---|
| Ya | 20 | 30 |
| Tidak | 50 | 100 |
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.
# 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
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.
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\).
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 \]
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 \]
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
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.
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:
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.
Membuat Tabel Kontingensi 3x2 untuk setiap strata (variabel pembaur Z).
Menghitung Chi-Square untuk Setiap Strata:
Menghitung Statistik CMH:
Menghitung Nilai p:
Keputusan Uji:
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 |
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 |
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.
Menghitung Statistik CMH:
\[ \text{Statistik CMH} = \frac{\sum (\text{chi-square untuk setiap strata})}{\text{df total}} \]
df total adalah derajat kebebasan dari statistik gabungan.
Menghitung Nilai p:
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.
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.
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.
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.
Menentukan Nilai a, b, c, d: Dari tabel kontingensi, kita bisa melihat nilai-nilai berikut:
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.
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.
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 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.
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.
Menentukan Tabel Kontingensi untuk Setiap
Strata
Buat tabel 2x2 untuk masing-masing strata yang akan diuji.
Menghitung Odds Ratio pada Setiap Strata
Hitung Odds Ratio untuk setiap tabel 2x2 di
masing-masing strata.
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).
Menghitung Statistik Breslow-Day (Q)
Gunakan rumus di atas untuk menghitung statistik
Q.
Menghitung Nilai P
Hitung nilai p berdasarkan distribusi chi-square dengan derajat
kebebasan \(k - 1\), dimana \(k\) adalah jumlah strata.
Keputusan Uji
Misalkan kita memiliki data tentang hubungan antara Merokok dan Penyakit Jantung pada dua strata usia ( 40 tahun dan > 40 tahun) seperti berikut:
| Usia | Merokok | Tidak Merokok | Total |
|---|---|---|---|
| 40 | 25 | 75 | 100 |
| > 40 | 40 | 60 | 100 |
| Total | 65 | 135 | 200 |
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 |
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 \]
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 \]
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 \]
Menghitung Nilai P (P-value) untuk statistik chi-square dengan derajat kebebasan 1:
Keputusan Uji:
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.
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:
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
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) |
Fungsi link (\(g(\mu)\)) adalah fungsi yang menghubungkan rata-rata dari distribusi (\(\mu = E[Y]\)) dengan fungsi linear prediktor:
\[ g(\mu) = \eta \]
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 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
Regresi logistik digunakan ketika variabel respon bersifat kategorik (umumnya biner: 0 atau 1). Tujuan dari model ini adalah untuk memodelkan probabilitas terjadinya suatu peristiwa.
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)}} \]
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()
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.
\[ 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).
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
# 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()
Model memperkirakan bahwa probabilitas kelulusan meningkat seiring meningkatnya nilai, dan lebih tinggi bagi siswa yang mengikuti bimbingan belajar.
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)
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
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.
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
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()
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.
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:
Model regresi Poisson secara umum: \[ E(Y_i) = \mu_i = \exp(\beta_0 + \beta_1X_{i1} + \ldots + \beta_kX_{ik}) \]
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.
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
Koefisien untuk variabel promosi menunjukkan pengaruh promosi terhadap rata-rata jumlah pelanggan. Jika koefisien promosi positif, maka promosi meningkatkan jumlah pelanggan secara signifikan.
# 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()
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.
Inferensi dalam GLM dilakukan untuk memahami pengaruh variabel prediktor terhadap respon serta menguji signifikansi parameter. Secara umum, pendekatan inferensial melibatkan:
Digunakan untuk menguji signifikansi koefisien: \[ Z = \frac{\hat{\beta}}{SE(\hat{\beta})} \] Jika \(|Z| > Z_{\alpha/2}\), maka parameter signifikan.
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.
Menggunakan turunan pertama dari fungsi log-likelihood untuk menilai signifikansi parameter saat nilai parameter diasumsikan nol.
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\)
# 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
# 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 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
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.
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:
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\))
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.
Tentukan fungsi likelihood: \[ L(\beta) = \prod_{i=1}^{n} p_i^{y_i} (1 - p_i)^{1 - y_i} \]
Ambil log-likelihood: \[ \ell(\beta) = \sum_{i=1}^{n} [y_i \log(p_i) + (1 - y_i)\log(1 - p_i)] \]
Gunakan turunan dan Newton-Raphson atau metode numerik lainnya untuk menemukan \(\hat{\beta}\).
# 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")
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.
Inferensi parameter dalam Generalized Linear Model (GLM) dilakukan untuk menguji apakah parameter dalam model secara statistik signifikan. Ini dilakukan melalui:
Dalam regresi logistik, estimasi parameter dilakukan dengan metode Maximum Likelihood Estimation (MLE).
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 LRT digunakan untuk membandingkan model penuh (dengan semua parameter) dengan model terbatas (sub-model). Hipotesis:
Statistik uji:
\[ G^2 = -2(\ell_0 - \ell_1) \]
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
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.
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.
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).
Semakin kecil nilai AIC atau BIC, maka model dianggap lebih baik.
# 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
Model regresi Poisson digunakan untuk data jumlah (count data) yang mengikuti distribusi Poisson.
\[ P(Y = y) = \frac{e^{-\lambda} \lambda^y}{y!} \]
\[ \log(\lambda) = \beta_0 + \beta_1X_1 + ... + \beta_pX_p \]
Dilakukan dengan metode Maximum Likelihood Estimation (MLE).
Dilakukan dengan melihat nilai p-value dari masing-masing koefisien regresi (uji Wald), dan juga bisa menggunakan deviance atau uji likelihood ratio.
# 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")
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
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
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
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
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
Model Dummy:
Model Numeric:
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
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.
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 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:
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
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")
| 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 |
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.
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 |
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.
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.
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).
Kurva ROC adalah grafik yang menggambarkan hubungan antara:
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.
AUC mengukur luas di bawah kurva ROC. Nilai AUC berkisar dari 0 hingga 1:
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).
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.
Terdapat beberapa jenis Pseudo R-squared, yang umum digunakan di antaranya:
| Jenis Pseudo R | Rumus | Interpretasi Umum |
|---|---|---|
| McFadden | Paling sering digunakan, mirip R pada regresi | |
| Cox & Snell | 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
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
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.
| Kelas Aktual = 1 | Kelas Aktual = 0 | |
|---|---|---|
| Prediksi = 1 | True Positive (TP) | False Positive (FP) |
| Prediksi = 0 | False Negative (FN) | True Negative (TN) |
Beberapa ukuran evaluasi yang penting:
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.
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.
Beberapa metode populer untuk membandingkan model regresi logistik adalah:
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.
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.
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.
Deviance adalah ukuran ketidaksesuaian model. Deviance residuals yang lebih kecil menunjukkan model yang lebih baik.
Misalkan kita memiliki dua model regresi logistik:
usia dan
tidurusia,
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.
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.
Statistik uji LRT dihitung dengan rumus:
\[ G^2 = -2 \times (\log L_0 - \log L_1) \]
di mana:
Nilai \(G^2\) mengikuti distribusi Chi-square dengan derajat kebebasan sama dengan selisih jumlah parameter antara dua model.
Misal, kita punya dua model:
model1: model dengan variabel usia dan
tidurmodel2: 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:
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.
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.
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 :
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.
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.
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
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.
Prinsip Parsimony menuntun kita memilih model yang efisien dan sederhana agar:
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 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) |
\[ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} \]
Mengukur proporsi prediksi yang benar dari keseluruhan data.
\[ \text{Sensitivity} = \frac{TP}{TP + FN} \]
Mengukur kemampuan model dalam mendeteksi kelas positif dengan benar.
\[ \text{Specificity} = \frac{TN}{TN + FP} \]
Mengukur kemampuan model dalam mendeteksi kelas negatif dengan benar.
\[ \text{Precision} = \frac{TP}{TP + FP} \]
Mengukur proporsi prediksi positif yang benar-benar positif.
# 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.
Kurva ROC adalah grafik yang menunjukkan performa model klasifikasi biner pada berbagai threshold (cut-off) probabilitas. Kurva ini mengilustrasikan trade-off antara:
\[ TPR = \frac{TP}{TP + FN} \]
\[ FPR = \frac{FP}{FP + TN} = 1 - \text{Specificity} \]
ROC plot menempatkan FPR pada sumbu X dan TPR pada sumbu Y.
AUC adalah nilai luas di bawah kurva ROC. Nilainya antara 0 dan 1.
# 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 :
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.
Precision-Recall (PR) Curve adalah grafik yang menunjukkan trade-off antara:
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.
\[ \text{Precision} = \frac{TP}{TP + FP} \]
\[ \text{Recall} = \frac{TP}{TP + FN} \]
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.
\[ R^2_{\text{McFadden}} = 1 - \frac{\ln L_{\text{model}}}{\ln L_{\text{null}}} \]
Nilai berkisar antara 0 dan 1, dengan nilai lebih tinggi menunjukkan model yang lebih baik.
\[ 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.
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}}} \]
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
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.
Distribusi ini digunakan untuk menggambarkan probabilitas berbagai kemungkinan hasil dalam suatu percobaan dengan lebih dari dua kategori, misalnya:
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:
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")
Gunakan distribusi ini ketika:
Catatan Tambahan : Distribusi multinomial adalah dasar penting dalam regresi logistik multinomial, di mana kita memodelkan probabilitas relatif dari masing-masing kategori berdasarkan prediktor.
Untuk memahami konsep distribusi multinomial dan aplikasinya dalam regresi logistik multinomial, mari kita pelajari melalui sebuah studi kasus yang realistis dan aplikatif.
Misalkan dilakukan survei terhadap 300 mahasiswa untuk mengetahui pilihan moda transportasi utama yang digunakan saat pergi ke kampus. Terdapat tiga pilihan:
Berikut hasilnya:
| Moda Transportasi | Jumlah Mahasiswa |
|---|---|
| Mobil | 90 |
| Motor | 150 |
| Transportasi Umum | 60 |
| Total | 300 |
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:
\[ 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} \]
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 \]
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.
# 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")
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.
nnet dan caret di R mendukung
analisis regresi logistik multinomial dengan mudah.Gunakan model ini ketika:
| 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 |
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
Regresi logistik multinomial memodelkan log-odds dari tiap kategori terhadap kategori referensi (baseline).
Misal:
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:
# 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
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).
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:
Pemilihan baseline penting karena:
Misal variabel respons “Moda” memiliki tiga kategori:
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)} \]
Misal dari model didapat:
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 \]
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")
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.
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} \]
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.
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
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).
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.
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:
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).
Setelah membangun dan mengevaluasi model regresi logistik multinomial, langkah penting berikutnya adalah menggunakan model tersebut untuk prediksi dan menilai akurasi prediksi (validasi model).
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:
# 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.
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:
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.
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.
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:
Model ini mengasumsikan proportional odds, yakni bahwa koefisien \(\beta_i\) sama untuk semua kategori \(j\).
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 \]
Untuk memudahkan interpretasi, koefisien \(\beta_i\) sering diterjemahkan ke dalam odds ratio (OR):
\[ OR_i = e^{-\beta_i} \]
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.
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:
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.
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).
# 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 :
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.
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})} \]
# 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 :
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 predict() pada objek polr dapat
digunakan dengan argumen type = "prob" untuk menghasilkan
probabilitas prediksi untuk setiap kategori.
# 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 :
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.
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.
Paket VGAM menyediakan fungsi vglm() untuk
model ordinal dengan lebih fleksibel, dan fungsi
nominal_test() dari paket ordinal untuk
menguji asumsi ini.
Jika asumsi paralelisme pada model regresi logistik ordinal tidak terpenuhi, ada beberapa alternatif model yang dapat digunakan:
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.
Adjacent Categories Logit Model
Model ini membandingkan log-odds dari kategori yang berdekatan, bukan
kumulatif.
Continuation Ratio Model
Model ini membangun log-odds berdasarkan rasio kategori yang
berurutan.
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.
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:
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:
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.
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 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:
Model ini fleksibel dan dapat disesuaikan dengan memasukkan atau menghilangkan efek-efek tertentu sesuai hipotesis penelitian.
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 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 \]
Model ini mengasumsikan bahwa frekuensi sel mengikuti distribusi Poisson.
\[ \log(\mu_{ij}) = \lambda + \lambda_A(i) + \lambda_B(j) \]
\[ \log(\mu_{ij}) = \lambda + \lambda_A(i) + \lambda_B(j) + \lambda_{AB}(i,j) \]
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 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
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.
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.
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.
# 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 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:
# 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.
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.
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.
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 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:
- 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.
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.
| 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 |
# 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.
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.
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.
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:
- 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.
Model independent biasanya diuji dengan goodness-of-fit test (Chi-square atau deviance) terhadap model saturated.
# 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.
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.
Misalkan kita memiliki tabel 2x2:
| B=1 | B=2 | |
|---|---|---|
| A=1 | \(n_{11}\) | \(n_{12}\) |
| A=2 | \(n_{21}\) | \(n_{22}\) |
\[ \text{Odds}_{A=1} = \frac{n_{11}}{n_{12}} \]
\[ \text{Odds}_{A=2} = \frac{n_{21}}{n_{22}} \]
\[ OR = \frac{\text{Odds}_{A=1}}{\text{Odds}_{A=2}} = \frac{n_{11} \times n_{22}}{n_{12} \times n_{21}} \]
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.
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.
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).
loglin() di RContoh 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.
Setelah estimasi parameter model loglinier penuh (saturated model), sering kali kita ingin menyederhanakan model dengan menghilangkan parameter yang tidak signifikan. Model lebih sederhana biasanya:
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) \]
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.
Model dengan AIC lebih kecil dianggap lebih baik:
\[ AIC = G^2 - 2 \times df \]
Alternatif AIC dengan penalti lebih besar untuk kompleksitas:
\[ BIC = G^2 - \log(N) \times df \]
dimana \(N\) adalah jumlah observasi.
# 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.
Misalkan kita memiliki data survei mengenai kepercayaan terhadap surga, dikumpulkan berdasarkan tiga variabel kategorik:
Data disajikan dalam bentuk tabel kontingensi 3 dimensi dengan frekuensi responden di setiap kombinasi kategori.
# 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
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.
| 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 + … |
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
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
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
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
# 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
Interpretasi parameter log-linear:
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 |
Untuk tabel kontingensi 2x3, misalnya hubungan antara Vaksinasi (2 kategori) dan Kesehatan (3 kategori), bentuk umum model log-linear yang digunakan adalah:
\[ \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.
\[ \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.
| 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:
Ini menunjukkan bahwa Distribusi status kesehatan tidak seragam antara kelompok yang sudah dan belum divaksin.Artinya, status vaksinasi berpengaruh terhadap status kesehatan anak.
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.
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.
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).
| 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.
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.
Misalkan terdapat tiga variabel kategorik:
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} \]
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):
| B1 | B2 | |
|---|---|---|
| A1 | \(n_{111}\) | \(n_{121}\) |
| A2 | \(n_{211}\) | \(n_{221}\) |
| 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).
| 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 |
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:
\[ \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} \]
\[ \log(\mu_{ijk}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^C_k + \lambda^{AB}_{ij} + \lambda^{AC}_{ik} + \lambda^{BC}_{jk} \]
Contoh: \[ \log(\mu_{ijk}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^C_k + \lambda^{AC}_{ik} + \lambda^{BC}_{jk} \]
| 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 |
Model log-linear tiga arah digunakan untuk memodelkan frekuensi harapan \(\mu_{ijk}\) pada tabel kontingensi dengan tiga variabel kategorik: A, B, dan C.
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:
\[ \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} \]
\[ \log(\mu_{ijk}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^C_k + \lambda^{AB}_{ij} + \lambda^{AC}_{ik} + \lambda^{BC}_{jk} \]
\[ \log(\mu_{ijk}) = \lambda + \lambda^A_i + \lambda^B_j + \lambda^C_k + \lambda^{AC}_{ik} + \lambda^{BC}_{jk} \]
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.
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.
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.
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) \]
Jika \(G^2\) kecil, maka model dianggap cocok dengan data.
\[ X^2 = \sum_{i,j,k} \frac{(n_{ijk} - \hat{\mu}_{ijk})^2}{\hat{\mu}_{ijk}} \]
Untuk uji G atau X, nilai statistik diuji dengan distribusi chi-square dengan derajat kebebasan:
\[ df = (\text{jumlah sel}) - (\text{jumlah parameter model}) \]
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
# 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
loglm() dan glm()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.
Kita gunakan data tabel kontingensi 222 berikut:
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).
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.
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")))
library(vcd)
mosaic(data, shade = TRUE, legend = TRUE,
main = "Mosaic Plot Tabel Kontingensi 2x2x2")
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()
# 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.
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:
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.
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.
## 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
# 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")
Dalam analisis model log-linear tiga arah, kita akan membandingkan dua model utama:
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 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.
\[ \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
🔹 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
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
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.
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\)
Taraf signifikansi yang digunakan:
\[ \alpha = 0{,}05 \]
Uji berdasarkan selisih deviance antara model homogenous dan conditional on X:
\[ G^2 = D_{\text{Conditional on X}} - D_{\text{Homogenous}} \]
Tolak H₀ jika:
\[ G^2 > \chi^2_{(1-\alpha, \text{df})} \]
# 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.
Pada bagian ini, kita akan menampilkan kembali perhitungan statistik uji selisih deviance antara model conditional on Gender dan model homogenous, secara eksplisit dan sistematis.
# 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
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).
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{YZ}_{jk} \]
# 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
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.
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\)
\[ \alpha = 0{,}05 \]
Statistik uji G² dihitung berdasarkan selisih deviance:
\[ G^2 = D_{\text{Conditional on Y}} - D_{\text{Homogenous}} \]
Tolak H₀ jika:
\[ G^2 > \chi^2_{(1 - \alpha, df)} \]
# 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
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.
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.
\[ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} \]
# 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
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.
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\)
\[ \alpha = 0{,}05 \]
Statistik uji G² dihitung berdasarkan selisih deviance:
\[ G^2 = D_{\text{Conditional on Z}} - D_{\text{Homogenous}} \]
Tolak H₀ jika:
\[ G^2 > \chi^2_{(1 - \alpha, df)} \]
# 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
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.
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.
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₀
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
Model homogenous sudah cukup menjelaskan data karena interaksi tiga arah tidak signifikan.
Dari tiga model conditional:
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.
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
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
# 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
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} \]
# 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 |
# 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")
| 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 |
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} \]
# 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")
| 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 |
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:
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.
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:
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()
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
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
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 <- 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
Dari tabel kontingensi dua arah, terlihat bahwa distribusi tenaga kesehatan laki-laki dan perempuan tidak merata di seluruh kategori:
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.
Tabel kontingensi tiga arah digunakan untuk melihat apakah hubungan tersebut konsisten antar wilayah, dengan menggunakan data dari tiga kabupaten:
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.
Model GLM Poisson juga digunakan sebagai pendekatan regresi untuk memprediksi jumlah tenaga kesehatan berdasarkan:
Hasil model:
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.
Berdasarkan latar belakang di atas, rumusan masalah dalam analisis ini adalah:
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 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.
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:
Format data adalah per kecamatan, dan digunakan dalam bentuk tabel kontingensi 3 arah: Kecamatan × Kategori Gizi × Tahun.
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:
Deviance = 763.38 dengan
p-value < 2.2e-16Interpretasi: > 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.
### 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:
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:
| 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.
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:
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.
Uji terhadap tiga model conditional independence (yang mengabaikan satu dari tiga interaksi dua arah) juga menunjukkan bahwa:
Hal ini menegaskan bahwa ketiga variabel saling berinteraksi secara kompleks, dan tidak dapat disederhanakan secara signifikan.
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.
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.
Modul Analisis Data Kategori. (2023). Program Studi Statistika, Universitas Padjadjaran.
Siregar, A. P. (2021). Pengantar Statistika untuk Penelitian Sosial dan Ekonomi. Medan: CV. Widya Pustaka.
Statistikian.com. (2022). Jenis Data dalam Statistika dan Contohnya. Diakses dari https://statistikian.com/jenis-data-dalam-statistika/
Dwi, L. (2020). Penerapan Algoritma Apriori dalam Menganalisis Pola Pembelian Produk. Jurnal Ilmiah Sistem Informasi, 15(2), 8895.
Blog DQLab. (2023). Pahami K-Means Clustering dalam Data Science. Diakses dari https://dqlab.id/
Materi Kuliah Analisis Data Kategorik. (2023). Fakultas MIPA, Universitas Padjadjaran.
R Documentation. (2024). R Functions and Examples. Diakses dari https://www.rdocumentation.org/
Agresti, A. (2002). Categorical Data Analysis. New York: John Wiley & Sons. (Digunakan sebagai referensi tambahan dasar teori, jika dibutuhkan)
Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning (2nd ed.). Springer. (Sebagai referensi tambahan untuk clustering dan model statistik)
Dinas Statistik Indonesia. (2023). Contoh Tabel Kontingensi dan Aplikasinya. Diakses dari https://bps.go.id/
UjiStatistik.com. (2023). Uji Proporsi Dua Sampel dan Interpretasinya. Diakses dari https://ujistatistik.com/uji-proporsi-2-sampel/
Septiani, D. (2023). Analisis Asosiasi dengan RD, RR, dan OR. Jurnal Statistika Terapan, 18(1), 334