Puji dan syukur penulis panjatkan atas terselesaikannya eBook yang berjudul “Analisis Data Kategori”. eBook ini disusun untuk memenuhi salah satu tugas pada mata kuliah Analisis Data Kategori.
Dalam penyusunan eBook ini, penulis berusaha menyajikan materi secara sistematis dan mudah dipahami. Pembahasan mencakup teori, contoh kasus, hingga implementasi analisis menggunakan bahasa pemrograman R dengan bantuan R Markdown. Harapannya, eBook ini tidak hanya menjadi tugas semata, tetapi juga dapat menjadi referensi belajar bagi mahasiswa lainnya.
Penulis menyadari bahwa eBook ini masih jauh dari sempurna. Oleh karena itu, kritik dan saran yang membangun sangat penulis harapkan demi perbaikan di masa yang akan datang.
Akhir kata, penulis mengucapkan terima kasih kepada dosen pengampu mata kuliah Analisis Data Kategori atas bimbingan dan arahannya selama proses pembelajaran berlangsung.
Pengertian
Data kategori adalah jenis data yang diklasifikasikan ke dalam kelompok
atau kategori. Data ini tidak memiliki nilai numerik atau urutan
alami.
Contoh Implementasi Analisis Data Kategori
(ADK)
- Dalam kesehatan: Kategori penyakit (ringan, sedang, berat) - Dalam
pemasaran: Preferensi konsumen (suka, tidak suka, netral) - Dalam
pendidikan: Tingkat kepuasan mahasiswa terhadap pengajaran
Analisis ini sangat berguna untuk mencari pola dan hubungan antar variabel non-numerik.
Pengertian
Tabel kontingensi adalah tabel yang menyajikan frekuensi gabungan dari
dua atau lebih variabel kategori. Tabel ini digunakan untuk melihat
adanya hubungan atau asosiasi antar variabel tersebut.
Jenis-jenis Tabel Kontingensi:
Contoh Implementasi Tabel Kontingensi 2x2 di R:
# Membuat tabel 2x2
data <- matrix(c(30, 10, 15, 45), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Terpapar" = c("Ya", "Tidak"),
"Kejadian" = c("Ya", "Tidak"))
data
## Kejadian
## Terpapar Ya Tidak
## Ya 30 10
## Tidak 15 45
Dalam tabel kontingensi, kita dapat menganalisis beberapa bentuk distribusi yang penting untuk memahami hubungan antar variabel kategori, yaitu:
Pengertian
Frekuensi absolut adalah jumlah kejadian atau observasi dalam
masing-masing sel pada tabel kontingensi.
Contoh dan Perhitungan:
# Data 2x2
data <- matrix(c(30, 10, 15, 45), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Paparan" = c("Ya", "Tidak"),
"Kejadian" = c("Ya", "Tidak"))
data
## Kejadian
## Paparan Ya Tidak
## Ya 30 10
## Tidak 15 45
Interpretasi: 30 individu terpapar dan mengalami kejadian, 10 individu terpapar dan tidak mengalami kejadian, 15 individu tidak terpapar dan mengalami kejadian, 45 individu tidak terpapar dan tidak mengalami kejadian
Pengertian
Frekuensi relatif adalah proporsi dari frekuensi absolut terhadap total
keseluruhan data. Ini memberikan gambaran perbandingan antar kategori
dalam satu tabel kontingensi.
Rumus Frekuensi Relatif:
\[ \text{Frekuensi Relatif} = \frac{\text{Frekuensi Absolut}}{\text{Total Observasi}} \]
Contoh Kasus:
Sebuah studi menghasilkan data berikut:
Kejadian Ya | Kejadian Tidak | |
---|---|---|
Terpapar | 30 | 10 |
Tidak Terpapar | 15 | 45 |
Total Observasi:
\[
n = 30 + 10 + 15 + 45 = 100
\]
Perhitungan Manual:
Frekuensi Relatif (Terpapar, Ya):
\[
\frac{30}{100} = 0.30
\]
Frekuensi Relatif (Terpapar, Tidak):
\[
\frac{10}{100} = 0.10
\]
Frekuensi Relatif (Tidak Terpapar, Ya):
\[
\frac{15}{100} = 0.15
\]
Frekuensi Relatif (Tidak Terpapar, Tidak):
\[
\frac{45}{100} = 0.45
\]
Perhitungan di R:
data <- matrix(c(30, 10, 15, 45), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Paparan" = c("Ya", "Tidak"),
"Kejadian" = c("Ya", "Tidak"))
data
## Kejadian
## Paparan Ya Tidak
## Ya 30 10
## Tidak 15 45
# Total observasi
total <- sum(data)
# Hitung frekuensi relatif secara manual
frekuensi_relatif_manual <- round(data / total, 2)
frekuensi_relatif_manual
## Kejadian
## Paparan Ya Tidak
## Ya 0.30 0.10
## Tidak 0.15 0.45
Interpretasi:
Frekuensi relatif membantu membandingkan sebaran antar kategori, terutama saat total data besar atau tidak seimbang.
Pengertian
Distribusi marginal adalah distribusi total dari satu variabel dengan
mengabaikan variabel lainnya.
Dalam tabel kontingensi, ini diperoleh dengan menjumlahkan baris (untuk
distribusi marginal baris) atau kolom (untuk distribusi marginal
kolom).
Rumus Distribusi Marginal:
Frekuensi Marginal (baris):
\[
f(A_i) = \sum_j f(A_i, B_j)
\]
Frekuensi Marginal (kolom):
\[
f(B_j) = \sum_i f(A_i, B_j)
\]
Contoh Tabel:
Kejadian Ya | Kejadian Tidak | Jumlah | |
---|---|---|---|
Terpapar | 30 | 10 | 40 |
Tidak Terpapar | 15 | 45 | 60 |
Jumlah | 45 | 55 | 100 |
Perhitungan Manual:
Perhitungan di R:
data <- matrix(c(30, 10, 15, 45), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Paparan" = c("Ya", "Tidak"),
"Kejadian" = c("Ya", "Tidak"))
# Frekuensi marginal
marginal_baris <- rowSums(data)
marginal_kolom <- colSums(data)
# Proporsi marginal
prop_marginal_baris <- round(marginal_baris / sum(data), 2)
prop_marginal_kolom <- round(marginal_kolom / sum(data), 2)
list(
Frekuensi_Marginal_Baris = marginal_baris,
Proporsi_Marginal_Baris = prop_marginal_baris,
Frekuensi_Marginal_Kolom = marginal_kolom,
Proporsi_Marginal_Kolom = prop_marginal_kolom
)
## $Frekuensi_Marginal_Baris
## Ya Tidak
## 40 60
##
## $Proporsi_Marginal_Baris
## Ya Tidak
## 0.4 0.6
##
## $Frekuensi_Marginal_Kolom
## Ya Tidak
## 45 55
##
## $Proporsi_Marginal_Kolom
## Ya Tidak
## 0.45 0.55
Interpretasi:
Distribusi marginal membantu kita memahami distribusi total dari satu variabel sebelum membahas relasinya dengan variabel lain.
Pengertian
Distribusi kondisional menunjukkan proporsi atau peluang suatu kejadian
terjadi dengan syarat kejadian lain telah
diketahui.
Ini berguna untuk melihat bagaimana suatu variabel kategori
terdistribusi di dalam level kategori variabel lainnya.
Rumus Distribusi Kondisional:
\[ P(A_i | B_j) = \frac{f(A_i, B_j)}{f(B_j)} \]
Contoh Data:
Kejadian Ya | Kejadian Tidak | Total | |
---|---|---|---|
Terpapar | 30 | 10 | 40 |
Tidak Terpapar | 15 | 45 | 60 |
Jumlah | 45 | 55 | 100 |
Perhitungan Manual:
Perhitungan di R:
data <- matrix(c(30, 10, 15, 45), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Paparan" = c("Ya", "Tidak"),
"Kejadian" = c("Ya", "Tidak"))
# Distribusi kondisional per baris (Paparan)
prop_kondisional_baris <- round(prop.table(data, margin = 1), 2)
# Distribusi kondisional per kolom (Kejadian)
prop_kondisional_kolom <- round(prop.table(data, margin = 2), 2)
list(
Proporsi_Kondisional_Baris = prop_kondisional_baris,
Proporsi_Kondisional_Kolom = prop_kondisional_kolom
)
## $Proporsi_Kondisional_Baris
## Kejadian
## Paparan Ya Tidak
## Ya 0.75 0.25
## Tidak 0.25 0.75
##
## $Proporsi_Kondisional_Kolom
## Kejadian
## Paparan Ya Tidak
## Ya 0.67 0.18
## Tidak 0.33 0.82
Interpretasi:
Distribusi kondisional sangat penting dalam analisis hubungan antar variabel dan menjadi dasar untuk analisis lebih lanjut seperti regresi logistik atau uji asosiasi.
Pengertian
Desain sampling merupakan kerangka atau strategi dalam memilih sebagian
anggota dari populasi untuk dijadikan sampel dalam penelitian. Dalam
analisis data kategori, desain sampling mempengaruhi validitas hasil
analisis dan generalisasi ke populasi.
Tujuan Desain Sampling:
Pentingnya Desain yang Tepat: Pemilihan desain sampling yang sesuai sangat krusial karena akan berdampak pada:
Pengertian
Eksperimen adalah desain penelitian di mana peneliti secara aktif
memberikan perlakuan (treatment) kepada subjek dan kemudian mengamati
dampaknya terhadap variabel hasil. Desain ini bertujuan untuk
mengidentifikasi hubungan sebab-akibat antara dua variabel.
Ciri-ciri Desain Eksperimen:
Bagaimana Dilakukannya:
Contoh Implementasi:
Sebuah rumah sakit ingin mengetahui efektivitas obat baru terhadap penyembuhan pasien.
100 pasien dibagi secara acak menjadi 2 kelompok: - Kelompok A diberi obat baru (treatment) - Kelompok B diberi plasebo (kontrol)
Setelah 7 hari, tingkat kesembuhan diukur dan dibandingkan.
Kapan Menggunakan Desain Eksperimen?
Keunggulan:
Kelemahan:
Pengertian
Studi kohort adalah desain observasional yang melibatkan pengamatan
terhadap sekelompok individu (kohort) dalam jangka waktu tertentu,
berdasarkan status paparan terhadap suatu faktor. Tujuannya adalah
melihat apakah paparan tersebut berkaitan dengan kejadian suatu
outcome.
Ciri-ciri Studi Kohort:
Bagaimana Dilakukannya:
Contoh Implementasi:
Sebuah studi ingin mengetahui apakah konsumsi minuman manis berkaitan dengan risiko diabetes.
500 orang diamati selama 5 tahun: - Kelompok A: rutin konsumsi minuman manis - Kelompok B: tidak konsumsi
Setelah periode tersebut, dicatat berapa banyak yang mengidap diabetes di tiap kelompok.
Kapan Menggunakan Studi Kohort?
Keunggulan:
Kelemahan:
Pengertian
Studi kasus-kontrol adalah desain observasional retrospektif yang
membandingkan individu dengan outcome tertentu (kasus)
dan individu tanpa outcome tersebut (kontrol), lalu
menelusuri apakah mereka memiliki paparan terhadap faktor tertentu.
Ciri-ciri Studi Kasus-Kontrol:
Bagaimana Dilakukannya:
Contoh Implementasi:
Peneliti ingin mengetahui apakah merokok berhubungan dengan kanker paru-paru.
- Kelompok Kasus: 200 orang dengan kanker paru.
- Kelompok Kontrol: 200 orang tanpa kanker paru.
Ditelusuri riwayat merokok masing-masing individu.
Hasil menunjukkan lebih banyak kasus yang memiliki riwayat merokok dibandingkan kontrol.
Kapan Menggunakan Studi Kasus-Kontrol?
Keunggulan:
Kelemahan:
Pengertian
Tabel kontingensi 2 × 2 adalah bentuk paling sederhana dari tabel
kontingensi yang digunakan untuk menganalisis hubungan antara dua
variabel kategori, masing-masing dengan dua kategori.
Tabel ini sering digunakan dalam studi eksperimental maupun
observasional, terutama saat ingin menganalisis data biner seperti:
ada/tidak ada, ya/tidak, positif/negatif.
Struktur Umum Tabel 2 × 2:
Kejadian Ya | Kejadian Tidak | |
---|---|---|
Terpapar | a | b |
Tidak Terpapar | c | d |
Mengapa Tabel 2x2 Penting?
Peluang bersama (joint probability) adalah peluang terjadinya dua kejadian secara bersamaan, yaitu kejadian pada baris dan kolom tertentu dalam tabel kontingensi 2 × 2.
\[ P(A \cap B) = \frac{f(A \cap B)}{n} \]
Peluang bersama digunakan untuk menganalisis distribusi probabilitas dua variabel kategori secara bersamaan.
Peluang marginal adalah peluang suatu kejadian tunggal tanpa mempertimbangkan kejadian lain. Dalam tabel kontingensi, peluang marginal diperoleh dengan menjumlahkan peluang bersama dari baris atau kolom tertentu.
Untuk baris: \[ P(A) = \sum_j P(A \cap B_j) \]
Untuk kolom: \[ P(B) = \sum_i P(A_i \cap B) \]
Peluang marginal memberikan gambaran distribusi total dari masing-masing variabel kategori secara terpisah.
Peluang bersyarat (conditional probability) adalah peluang suatu kejadian terjadi dengan asumsi bahwa kejadian lain telah diketahui terjadi. Dalam tabel kontingensi 2 × 2, ini digunakan untuk melihat hubungan antar dua variabel kategori.
\[ P(A | B) = \frac{P(A \cap B)}{P(B)} = \frac{f(A \cap B)}{f(B)} \]
Peluang bersyarat sangat penting dalam analisis hubungan antar variabel kategori, termasuk dalam pengukuran asosiasi dan inferensi kausal.
Kasus:
Sebuah penelitian ingin melihat hubungan antara status merokok dan
kejadian penyakit paru-paru. Data dari 100 responden disajikan dalam
tabel berikut:
Penyakit Ya | Penyakit Tidak | Total | |
---|---|---|---|
Merokok | 30 | 10 | 40 |
Tidak Merokok | 15 | 45 | 60 |
Total | 45 | 55 | 100 |
Peluang Bersama
\[ P(Merokok \cap Penyakit) = \frac{30}{100} = 0.30 \] \[ P(Merokok \cap Tidak Penyakit) = \frac{10}{100} = 0.10 \] \[ P(Tidak Merokok \cap Penyakit) = \frac{15}{100} = 0.15 \] \[ P(Tidak Merokok \cap Tidak Penyakit) = \frac{45}{100} = 0.45 \]
data <- matrix(c(30, 10, 15, 45), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Merokok" = c("Ya", "Tidak"),
"Penyakit" = c("Ya", "Tidak"))
data
## Penyakit
## Merokok Ya Tidak
## Ya 30 10
## Tidak 15 45
# Peluang bersama
joint <- round(prop.table(data), 2)
joint
## Penyakit
## Merokok Ya Tidak
## Ya 0.30 0.10
## Tidak 0.15 0.45
Interpretasi:
Peluang Marjinal
\[ P(Merokok) = \frac{40}{100} = 0.40 \] \[ P(Tidak Merokok) = \frac{60}{100} = 0.60 \] \[ P(Penyakit) = \frac{45}{100} = 0.45 \] \[ P(Tidak Penyakit) = \frac{55}{100} = 0.55 \]
# Peluang marginal
margin_row <- round(prop.table(rowSums(data)), 2)
margin_col <- round(prop.table(colSums(data)), 2)
list(Peluang_Merokok = margin_row,
Peluang_Penyakit = margin_col)
## $Peluang_Merokok
## Ya Tidak
## 0.4 0.6
##
## $Peluang_Penyakit
## Ya Tidak
## 0.45 0.55
Interpretasi:
Peluang Bersyarat
\[ P(Penyakit | Merokok) = \frac{30}{40} = 0.75 \] \[ P(Penyakit | Tidak Merokok) = \frac{15}{60} = 0.25 \] \[ P(Merokok | Penyakit) = \frac{30}{45} = 0.667 \] \[ P(Merokok | Tidak Penyakit) = \frac{10}{55} = 0.182 \]
# Peluang bersyarat per baris (Penyakit | Merokok)
cond_row <- round(prop.table(data, margin = 1), 2)
# Peluang bersyarat per kolom (Merokok | Penyakit)
cond_col <- round(prop.table(data, margin = 2), 2)
list(Peluang_Bersyarat_Baris = cond_row,
Peluang_Bersyarat_Kolom = cond_col)
## $Peluang_Bersyarat_Baris
## Penyakit
## Merokok Ya Tidak
## Ya 0.75 0.25
## Tidak 0.25 0.75
##
## $Peluang_Bersyarat_Kolom
## Penyakit
## Merokok Ya Tidak
## Ya 0.67 0.18
## Tidak 0.33 0.82
Interpretasi:
Pengertian
Ukuran asosiasi digunakan untuk mengevaluasi kekuatan dan arah hubungan
antara dua variabel kategori dalam tabel kontingensi 2 × 2 (Agresti,
2013).
Dengan menggunakan ukuran ini, kita dapat menilai seberapa besar
pengaruh suatu faktor (misalnya paparan) terhadap suatu outcome
(kejadian).
Tujuan Penggunaan Ukuran Asosiasi:
Ukuran Asosiasi yang Umum Digunakan:
Ketiga ukuran ini digunakan sesuai dengan desain studi dan tujuan analisis.
Pengertian
Risk Difference (RD), atau selisih risiko, adalah ukuran asosiasi yang
menunjukkan perbedaan risiko (probabilitas kejadian) antara dua
kelompok—biasanya kelompok yang terpapar dan tidak terpapar.
\[ RD = P(Kejadian | Terpapar) - P(Kejadian | Tidak\ Terpapar) \]
Interpretasi:
Nilai RD dinyatakan dalam satuan desimal atau persen dan sangat mudah diinterpretasikan karena menunjukkan selisih risiko absolut antar kelompok.
Pengertian
Relative Risk (RR), atau risiko relatif, adalah perbandingan antara
risiko kejadian pada kelompok yang terpapar dengan risiko kejadian pada
kelompok yang tidak terpapar.
RR menggambarkan seberapa besar kemungkinan suatu kejadian terjadi pada
kelompok terpapar dibandingkan dengan kelompok kontrol (tidak
terpapar).
\[ RR = \frac{P(Kejadian | Terpapar)}{P(Kejadian | Tidak\ Terpapar)} \]
Interpretasi:
Relative Risk sering digunakan dalam studi kohort dan eksperimen di mana insidensi kejadian dapat dihitung secara langsung.
Pengertian
Odds Ratio (OR) adalah ukuran asosiasi yang digunakan untuk
membandingkan peluang (odds) terjadinya suatu kejadian pada kelompok
yang terpapar dengan peluang kejadian tersebut pada kelompok yang tidak
terpapar.
OR sangat sering digunakan dalam studi kasus-kontrol, di mana insidensi atau probabilitas kejadian tidak dapat diukur secara langsung.
\[ OR = \frac{a \cdot d}{b \cdot c} \]
Dengan susunan tabel kontingensi:
Kejadian Ya | Kejadian Tidak | |
---|---|---|
Terpapar | a | b |
Tidak Terpapar | c | d |
Interpretasi:
Odds Ratio sering dipakai sebagai alternatif Relative Risk, terutama saat penelitian tidak bisa mengukur risiko secara langsung seperti pada studi retrospektif atau penyakit langka.
Tujuan Perbandingan:
Meskipun ketiga ukuran ini sama-sama digunakan untuk mengukur asosiasi
antara dua variabel kategori, masing-masing memiliki
interpretasi, kekuatan, dan
konteks penggunaan yang berbeda.
Ukuran | Interpretasi | Kapan Digunakan | Sifat |
---|---|---|---|
RD | Selisih risiko antara dua kelompok | Studi eksperimental atau kohort | Risiko absolut |
RR | Perbandingan risiko | Studi kohort atau eksperimen | Risiko relatif |
OR | Perbandingan odds (peluang) | Studi kasus-kontrol dan regresi logistik | Mendekati RR jika outcome jarang |
Perbandingan Konseptual:
Contoh Interpretasi (asumsikan hasil perhitungan):
Catatan Penting:
Kasus:
Dalam suatu penelitian, 100 responden dibagi berdasarkan kebiasaan
merokok dan status penyakit paru-paru. Data hasil observasi disajikan
dalam tabel berikut:
Penyakit Ya | Penyakit Tidak | Total | |
---|---|---|---|
Merokok | 30 | 10 | 40 |
Tidak Merokok | 15 | 45 | 60 |
Total | 45 | 55 | 100 |
Perhitungan Manual
Risk Difference (RD)
\[ RD = P(Penyakit | Merokok) - P(Penyakit | Tidak\ Merokok) = \frac{30}{40} - \frac{15}{60} = 0.75 - 0.25 = 0.50 \]
Interpretasi RD:
Risiko penyakit pada perokok lebih tinggi 50%
dibandingkan yang tidak merokok.
Relative Risk (RR)
\[ RR = \frac{P(Penyakit | Merokok)}{P(Penyakit | Tidak\ Merokok)} = \frac{30/40}{15/60} = 0.75 / 0.25 = 3.0 \]
Interpretasi RR:
Perokok memiliki risiko 3 kali lebih besar untuk
terkena penyakit dibandingkan non-perokok.
Odds Ratio (OR)
\[ OR = \frac{a \cdot d}{b \cdot c} = \frac{30 \cdot 45}{10 \cdot 15} = \frac{1350}{150} = 9.0 \]
Interpretasi OR: Peluang terkena penyakit paru-paru pada perokok adalah 9 kali lebih besar dibandingkan yang tidak merokok.
Perhitungan di R
# Data observasi
data <- matrix(c(30, 10, 15, 45), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Merokok" = c("Ya", "Tidak"),
"Penyakit" = c("Ya", "Tidak"))
data
## Penyakit
## Merokok Ya Tidak
## Ya 30 10
## Tidak 15 45
# Komponen
a <- data[1, 1]
b <- data[1, 2]
c <- data[2, 1]
d <- data[2, 2]
# Perhitungan
rd <- round((a / (a + b)) - (c / (c + d)), 2)
rr <- round((a / (a + b)) / (c / (c + d)), 2)
or <- round((a * d) / (b * c), 2)
list(
"Risk Difference (RD)" = rd,
"Relative Risk (RR)" = rr,
"Odds Ratio (OR)" = or
)
## $`Risk Difference (RD)`
## [1] 0.5
##
## $`Relative Risk (RR)`
## [1] 3
##
## $`Odds Ratio (OR)`
## [1] 9
Inferensi tabel kontingensi dua arah berkaitan dengan pengambilan kesimpulan tentang hubungan antara dua variabel kategori dari sampel yang diambil, dan menggeneralisasi kesimpulan ini ke populasi yang lebih luas. Dalam analisis ini, estimasi digunakan untuk memperoleh informasi yang lebih mendalam mengenai asosiasi yang diamati, dan inferensi dilakukan menggunakan teknik statistik.
Estimasi adalah proses untuk mendapatkan perkiraan parameter populasi berdasarkan data sampel. Dalam konteks tabel kontingensi dua arah, estimasi dapat berupa estimasi titik atau estimasi interval.
Pengertian
Estimasi titik adalah proses memperkirakan nilai suatu parameter
populasi menggunakan nilai tunggal yang dihitung dari sampel. Dalam
tabel kontingensi dua arah, estimasi titik bisa berupa estimasi proporsi
kejadian, seperti proporsi individu yang terpapar dan mengalami kejadian
dalam kelompok terpapar.
Rumus Estimasi Titik:
Untuk estimasi proporsi kejadian dalam kelompok terpapar: \[ \hat{p} = \frac{a}{a + b} \] dimana:
Pengertian
Estimasi interval memberikan rentang nilai yang mungkin mencakup
parameter populasi, disertai dengan tingkat keyakinan (confidence level)
tertentu. Dalam konteks tabel kontingensi, estimasi interval digunakan
untuk memperkirakan parameter seperti proporsi atau perbedaan antara dua
proporsi dengan memberikan rentang nilai, misalnya interval kepercayaan
(confidence interval) untuk proporsi atau perbedaan proporsi.
Rumus Estimasi Interval untuk Proporsi:
Interval kepercayaan 95% untuk proporsi dapat dihitung dengan rumus:
\[ IC = \hat{p} \pm Z \times \sqrt{\frac{\hat{p}(1 - \hat{p})}{n}} \]
di mana:
Pengertian
Uji proporsi digunakan untuk menguji apakah proporsi kejadian dalam satu
kelompok sampel berbeda secara signifikan dari proporsi yang diharapkan
berdasarkan populasi atau kelompok lain. Uji ini sering digunakan dalam
eksperimen, survei, dan studi observasional.
Hipotesis Nol dan Alternatif:
Rumus Uji Proporsi:
Statistik uji untuk uji proporsi adalah: \[ z = \frac{\hat{p} - p_0}{\sqrt{\frac{p_0(1 - p_0)}{n}}} \] dimana:
Tingkat Signifikansi (alpha):
Biasanya tingkat signifikansi yang digunakan adalah 0.05, yang berarti
kita akan menolak hipotesis nol jika nilai p lebih kecil dari 0.05.
Contoh Kasus
Sebuah penelitian dilakukan untuk menguji apakah proporsi orang yang merokok di kota A berbeda dengan proporsi orang yang merokok di kota B. Dalam survei di kota A, 120 dari 200 orang merokok. Di kota B, 100 dari 150 orang merokok.
Kita akan melakukan uji proporsi untuk menguji hipotesis berikut:
Perhitungan Manual
1. Tentukan Proporsi di Setiap Kota
\[ \hat{p}_A = \frac{120}{200} = 0.60 \]
\[ \hat{p}_B = \frac{100}{150} = 0.67 \]
2. Hitung Statistik Uji Proporsi
Statistik uji untuk uji proporsi adalah:
\[ z = \frac{\hat{p}_A - \hat{p}_B}{\sqrt{\hat{p}(1 - \hat{p}) \left(\frac{1}{n_A} + \frac{1}{n_B}\right)}} \]
Di mana:
Sekarang, substitusi ke dalam rumus:
\[ z = \frac{0.60 - 0.67}{\sqrt{0.6286 \times (1 - 0.6286) \left(\frac{1}{200} + \frac{1}{150}\right)}} \]
Perhitungan di R
# Data dari kedua kota
n_A <- 200 # Jumlah di Kota A
n_B <- 150 # Jumlah di Kota B
a_A <- 120 # Merokok di Kota A
a_B <- 100 # Merokok di Kota B
# Proporsi pada masing-masing kota
p_A <- a_A / n_A
p_B <- a_B / n_B
# Proporsi gabungan
p_combined <- (a_A + a_B) / (n_A + n_B)
# Statistik uji proporsi
z <- (p_A - p_B) / sqrt(p_combined * (1 - p_combined) * (1/n_A + 1/n_B))
z
## [1] -1.277381
# Menggunakan prop.test untuk uji proporsi
result <- prop.test(x = c(a_A, a_B), n = c(n_A, n_B))
result
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(a_A, a_B) out of c(n_A, n_B)
## X-squared = 1.3586, df = 1, p-value = 0.2438
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.17399286 0.04065953
## sample estimates:
## prop 1 prop 2
## 0.6000000 0.6666667
Interpretasi
Pengertian
Uji asosiasi digunakan untuk mengukur apakah ada hubungan yang
signifikan antara dua variabel kategori dalam tabel kontingensi dua
arah. Dalam uji asosiasi, kita menguji hipotesis untuk mengetahui apakah
ada perbedaan atau asosiasi antara dua kelompok berdasarkan faktor
tertentu.
Hipotesis Uji Asosiasi
Untuk menguji asosiasi antara dua variabel kategori, kita dapat menggunakan berbagai ukuran asosiasi seperti Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR). Secara umum, hipotesis yang diuji adalah:
Hipotesis Nol (H0): Tidak ada asosiasi antara dua variabel kategori (misalnya, paparan tidak mempengaruhi kejadian). \[ H_0: p_{\text{terpapar}} = p_{\text{tidak terpapar}} \]
Hipotesis Alternatif (H1): Ada asosiasi antara dua variabel kategori (misalnya, paparan mempengaruhi kejadian). \[ H_1: p_{\text{terpapar}} \neq p_{\text{tidak terpapar}} \]
Untuk menguji hipotesis ini, kita akan menghitung statistik uji untuk setiap ukuran asosiasi (RD, RR, dan OR) dan menentukan apakah ada cukup bukti untuk menolak hipotesis nol.
Risk Difference (RD) adalah perbedaan antara proporsi kejadian pada kelompok terpapar dan kelompok tidak terpapar. RD mengukur perbedaan risiko absolut antara dua kelompok.
Rumus Uji Hipotesis untuk RD:
\[ RD = P(Kejadian | Terpapar) - P(Kejadian | Tidak\ Terpapar) \]
Di mana:
Statistik Uji: Statistik uji untuk RD dihitung menggunakan distribusi normal. Statistik uji untuk RD adalah:
\[ SE(RD) = \sqrt{\frac{\hat{p}_1 (1 - \hat{p}_1)}{n_1} + \frac{\hat{p}_2 (1 - \hat{p}_2)}{n_2}} \]
\[ Z_{RD} = \frac{RD}{SE(RD)} \]
Relative Risk (RR) atau risiko relatif mengukur perbandingan antara dua proporsi, yaitu proporsi kejadian pada kelompok terpapar dibandingkan dengan kelompok tidak terpapar.
Rumus Uji Hipotesis untuk RR:
\[ RR = \frac{P(Kejadian | Terpapar)}{P(Kejadian | Tidak\ Terpapar)} \]
Di mana:
Statistik Uji: Statistik uji untuk RR dihitung dengan rumus berikut, yang menggunakan distribusi normal untuk menghitung nilai z:
\[ Z_{RR} = \frac{\log(RR)}{\sqrt{\left(\frac{1}{a} - \frac{1}{a + b}\right) + \left(\frac{1}{c} - \frac{1}{c + d}\right)}} \]
Dimana:
Odds Ratio (OR) mengukur perbandingan antara odds (peluang) terjadinya suatu kejadian pada kelompok terpapar dibandingkan dengan kelompok tidak terpapar. OR digunakan terutama dalam studi kasus-kontrol.
Rumus Uji Hipotesis untuk OR:
\[ OR = \frac{a \cdot d}{b \cdot c} \]
Di mana:
Statistik Uji: Untuk uji Odds Ratio (OR), kita dapat menggunakan rumus logaritma untuk menghitung statistik uji dan memperoleh nilai z untuk menguji hipotesis:
\[ z = \frac{\log(OR)}{\sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}}} \]
Contoh Kasus:
Sebuah studi dilakukan untuk mengetahui apakah ada hubungan antara paparan merokok dan penyakit paru-paru. Data yang diperoleh disajikan dalam tabel kontingensi 2 × 2 berikut:
Penyakit Ya | Penyakit Tidak | Total | |
---|---|---|---|
Terpapar | 30 | 10 | 40 |
Tidak Terpapar | 15 | 45 | 60 |
Total | 45 | 55 | 100 |
Hipotesis yang Diuji:
Hipotesis Nol (H0): Tidak ada asosiasi antara
paparan merokok dan penyakit paru-paru.
\(p_{\text{terpapar}} = p_{\text{tidak
terpapar}}\)
Hipotesis Alternatif (H1): Ada asosiasi antara
paparan merokok dan penyakit paru-paru.
\(p_{\text{terpapar}} \neq p_{\text{tidak
terpapar}}\)
Perhitungan Manual
1. Tentukan Proporsi Kejadian Penyakit pada Masing-Masing Kelompok
Proporsi pada kelompok terpapar: \[ \hat{p}_{\text{terpapar}} = \frac{30}{40} = 0.75 \]
Proporsi pada kelompok tidak terpapar: \[ \hat{p}_{\text{tidak terpapar}} = \frac{15}{60} = 0.25 \]
2. Hitung Statistik Uji untuk Risk Difference (RD)
Risk Difference adalah perbedaan antara proporsi kejadian pada dua kelompok: \[ RD = P(Kejadian \mid Terpapar) - P(Kejadian \mid Tidak\ Terpapar) = \frac{30}{40} - \frac{15}{60} = 0.75 - 0.25 = 0.50 \]
\[ \hat{p} = \frac{30 + 15}{40 + 60} = \frac{45}{100} = 0.45 \]
\[ SE(RD) = \sqrt{\frac{p_1(1 - p_1)}{n_1} + \frac{p_2(1 - p_2)}{n_2}} = \sqrt{\frac{0.75(1 - 0.75)}{40} + \frac{0.25(1 - 0.25)}{60}} \]
\[ SE(RD) = \sqrt{\frac{0.75 \times 0.25}{40} + \frac{0.25 \times 0.75}{60}} = \sqrt{\frac{0.1875}{40} + \frac{0.1875}{60}} = \sqrt{0.0046875 + 0.003125} = \sqrt{0.0078125} \approx 0.0884 \]
\[ Z_{RD} = \frac{RD}{SE(RD)} = \frac{0.50}{0.0884} \approx 5.66 \]
3. Hitung Statistik Uji untuk Relative Risk (RR)
Relative Risk (RR) adalah perbandingan antara proporsi kejadian pada kelompok terpapar dan tidak terpapar: \[ RR = \frac{P(Kejadian | Terpapar)}{P(Kejadian | Tidak\ Terpapar)} = \frac{0.75}{0.25} = 3.0 \]
\[ z = \frac{\log(RR)}{\sqrt{\left(\frac{1}{a} - \frac{1}{a + b}\right) + \left(\frac{1}{c} - \frac{1}{c + d}\right)}} \]
\[ z = \frac{\log(3.0)}{\sqrt{\left(\frac{1}{30} - \frac{1}{40}\right) + \left(\frac{1}{15} - \frac{1}{60}\right)}} = \frac{1.0986}{\sqrt{(0.0333 - 0.025) + (0.0667 - 0.0167)}} \]
\[ = \frac{1.0986}{\sqrt{0.0083 + 0.05}} = \frac{1.0986}{\sqrt{0.0583}} = \frac{1.0986}{0.2414} \approx 4.55 \]
4. Hitung Statistik Uji untuk Odds Ratio (OR)
Odds Ratio (OR) adalah perbandingan antara peluang (odds) kejadian pada dua kelompok: \[ OR = \frac{a \cdot d}{b \cdot c} = \frac{30 \cdot 45}{10 \cdot 15} = 9.0 \]
\[ z = \frac{\log(9.0)}{\sqrt{\frac{1}{30} + \frac{1}{10} + \frac{1}{15} + \frac{1}{45}}} \]
\[ z = \frac{2.1972}{\sqrt{\frac{1}{30} + \frac{1}{10} + \frac{1}{15} + \frac{1}{45}}} \]
\[ z = \frac{2.1972}{\sqrt{0.0333 + 0.1 + 0.0667 + 0.0222}} = \frac{2.1972}{\sqrt{0.2222}} = \frac{2.1972}{0.4714} \approx 4.66 \]
Perhitungan di R
# Data dari tabel kontingensi
a <- 30 # Penyakit Ya, Terpapar
b <- 10 # Penyakit Tidak, Terpapar
c <- 15 # Penyakit Ya, Tidak Terpapar
d <- 45 # Penyakit Tidak, Tidak Terpapar
n_terpapar <- a + b
n_tidak_terpapar <- c + d
# Proporsi pada masing-masing kelompok
p_terpapar <- a / n_terpapar
p_tidak_terpapar <- c / n_tidak_terpapar
# Risk Difference (RD)
RD <- p_terpapar - p_tidak_terpapar
# Standard Error untuk RD (non-pooled)
se_RD <- sqrt((p_terpapar * (1 - p_terpapar)) / n_terpapar +
(p_tidak_terpapar * (1 - p_tidak_terpapar)) / n_tidak_terpapar)
# Z untuk RD
z_RD <- RD / se_RD
# Relative Risk (RR)
RR <- p_terpapar / p_tidak_terpapar
z_RR <- log(RR) / sqrt(1/a - 1/n_terpapar + 1/c - 1/n_tidak_terpapar)
# Odds Ratio (OR)
OR <- (a * d) / (b * c)
z_OR <- log(OR) / sqrt(1/a + 1/b + 1/c + 1/d)
# Menampilkan hasil
list(RD = RD, RR = RR, OR = OR, z_RD = z_RD, z_RR = z_RR, z_OR = z_OR)
## $RD
## [1] 0.5
##
## $RR
## [1] 3
##
## $OR
## [1] 9
##
## $z_RD
## [1] 5.656854
##
## $z_RR
## [1] 4.548687
##
## $z_OR
## [1] 4.661017
Interpretasi Nilai statistik uji (Z) dari RD, RR, dan OR semuanya lebih besar dari titik kritis Z tabel (1.96), maka tolak H0. Artinya, ada asosiasi antara paparan merokok dan penyakit paru-paru.
Uji independensi digunakan untuk menguji apakah dua variabel kategori dalam tabel kontingensi dua arah saling berhubungan atau tidak. Dengan kata lain, uji ini menguji apakah dua variabel tersebut independen satu sama lain atau berhubungan.
Hipotesis yang Diuji:
Hipotesis Nol (H0): Dua variabel kategori dalam
tabel kontingensi independen satu sama lain.
\[
H_0: \text{Variabel A independen dengan Variabel B}
\]
Hipotesis Alternatif (H1): Ada hubungan atau
asosiasi antara dua variabel kategori, yaitu kedua variabel tersebut
berhubungan.
\[
H_1: \text{Variabel A berhubungan dengan Variabel B}
\]
Uji Chi-Square adalah uji statistik yang digunakan untuk menguji apakah ada perbedaan signifikan antara frekuensi yang diamati dan frekuensi yang diharapkan dalam sebuah tabel kontingensi. Uji ini digunakan untuk menentukan apakah ada hubungan atau asosiasi antara dua variabel kategori. Uji Chi-Square umumnya digunakan untuk menguji independensi antara dua variabel dalam tabel kontingensi. Dalam konteks ini, kita ingin menguji apakah kedua variabel tersebut independen satu sama lain atau saling berhubungan.
Rumus Uji Chi-Square:
Uji Chi-Square dihitung dengan rumus berikut:
\[ \chi^2 = \sum \frac{(O - E)^2}{E} \]
Dimana: - \(\chi^2\) adalah statistik uji Chi-Square - \(O\) adalah frekuensi yang diamati - \(E\) adalah frekuensi yang diharapkan
Frekuensi yang diharapkan dihitung dengan rumus: \[ E = \frac{(\text{Total Baris}) \times (\text{Total Kolom})}{\text{Total Keseluruhan}} \]
Statistik uji Chi-Square dihitung untuk setiap sel dalam tabel kontingensi, dan kemudian dijumlahkan untuk mendapatkan nilai Chi-Square total. Kemudian nilai chi-square hitung dibandingkan dengan chi-square tabel dengan df = (jumlah baris - 1) * (jumlah kolom - 1)
Contoh Kasus:
Sebuah penelitian dilakukan untuk menguji apakah terdapat hubungan antara jenis kelamin dan kebiasaan makan sayur. Data yang diperoleh dari 100 orang yang disurvei disajikan dalam tabel kontingensi 2 × 2 berikut:
Makan Sayur | Tidak Makan Sayur | Total | |
---|---|---|---|
Pria | 35 | 15 | 50 |
Wanita | 40 | 10 | 50 |
Total | 75 | 25 | 100 |
Hipotesis yang Diuji:
Hipotesis Nol (H₀): Tidak ada hubungan atau
asosiasi antara jenis kelamin dan kebiasaan
makan sayur.
\[
H_0: \text{Jenis Kelamin dan Kebiasaan Makan Sayur adalah Independen}
\]
Hipotesis Alternatif (H₁): Ada hubungan atau
asosiasi antara jenis kelamin dan kebiasaan
makan sayur.
\[
H_1: \text{Jenis Kelamin dan Kebiasaan Makan Sayur Berhubungan}
\]
1. Frekuensi yang Diharapkan (E):
Frekuensi yang diharapkan untuk setiap sel dihitung dengan rumus:
\[ E = \frac{(\text{Total Baris}) \times (\text{Total Kolom})}{\text{Total Keseluruhan}} \]
Untuk contoh ini:
2. Hitung Statistik Uji Chi-Square:
Rumus Chi-Square: \[ \chi^2 = \sum \frac{(O - E)^2}{E} \]
Dimana:
Mari kita hitung Chi-Square untuk setiap sel:
Jumlahkan semua nilai tersebut untuk mendapatkan nilai Chi-Square total:
\[ \chi^2 = 0.1667 + 0.5 + 0.1667 + 0.5 = 1.333 \]
3. Derajat Kebebasan (df): \[ df = (r - 1) \times (c - 1) \] Dimana: - \(r\) = jumlah baris (2) - \(c\) = jumlah kolom (2)
Jadi, derajat kebebasan adalah: \[ df = (2 - 1) \times (2 - 1) = 1 \]
Perhitungan Uji Chi-Square di R
# Membuat tabel kontingensi
data_matrix <- matrix(c(35, 15, 40, 10), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Makan Sayur", "Tidak Makan Sayur")
rownames(data_matrix) <- c("Pria", "Wanita")
# Uji Chi-Square
chi_square_test <- chisq.test(data_matrix, correct = FALSE)
# Menampilkan hasil uji Chi-Square
chi_square_test
##
## Pearson's Chi-squared test
##
## data: data_matrix
## X-squared = 1.3333, df = 1, p-value = 0.2482
Interpretasi p-value (0.2482) > alpha (0.05), maka terima H0. Artinya, Jenis Kelamin dan Kebiasaan Makan Sayur adalah Independen. Tidak ada hubungan atau asosiasi antara jenis kelamin dan kebiasaan makan sayur
Setelah kita melakukan Uji Chi-Square untuk menguji independensi antara dua variabel kategori dalam tabel kontingensi, kita dapat melakukan partisi Chi-Square. Partisi Chi-Square digunakan untuk menentukan bagian mana dari tabel yang memberikan kontribusi paling besar terhadap nilai statistik Chi-Square total.
Pada dasarnya, partisi Chi-Square membantu kita untuk memahami sel mana atau kategori mana yang paling berkontribusi terhadap perbedaan antara frekuensi yang diamati dan frekuensi yang diharapkan dalam tabel kontingensi.
Contoh Kasus: Tabel Kontingensi 3 × 2
Misalkan kita memiliki data mengenai penggunaan teknologi (misalnya, komputer atau smartphone) pada tiga kelompok umur yang berbeda. Data yang diperoleh disajikan dalam tabel kontingensi 3 × 2 berikut:
Menggunakan Teknologi | Tidak Menggunakan Teknologi | Total | |
---|---|---|---|
18-30 Tahun | 60 | 10 | 70 |
31-45 Tahun | 50 | 20 | 70 |
46+ Tahun | 40 | 20 | 60 |
Total | 150 | 50 | 200 |
CHI-SQUARE KESELURUHAN
Langkah 1: Menghitung Frekuensi yang Diharapkan (E):
Frekuensi yang diharapkan dihitung dengan rumus:
\[ E = \frac{(\text{Total Baris}) \times (\text{Total Kolom})}{\text{Total Keseluruhan}} \]
Untuk contoh ini, kita akan menghitung frekuensi yang diharapkan untuk setiap sel dalam tabel kontingensi.
Frekuensi yang Diharapkan untuk 18-30 Tahun, Menggunakan Teknologi: \[ E_{1,1} = \frac{70 \times 150}{200} = 52.5 \]
Frekuensi yang Diharapkan untuk 18-30 Tahun, Tidak Menggunakan Teknologi: \[ E_{1,2} = \frac{70 \times 50}{200} = 17.5 \]
Frekuensi yang Diharapkan untuk 31-45 Tahun, Menggunakan Teknologi: \[ E_{2,1} = \frac{70 \times 150}{200} = 52.5 \]
Frekuensi yang Diharapkan untuk 31-45 Tahun, Tidak Menggunakan Teknologi: \[ E_{2,2} = \frac{70 \times 50}{200} = 17.5 \]
Frekuensi yang Diharapkan untuk 46+ Tahun, Menggunakan Teknologi: \[ E_{3,1} = \frac{60 \times 150}{200} = 45 \]
Frekuensi yang Diharapkan untuk 46+ Tahun, Tidak Menggunakan Teknologi: \[ E_{3,2} = \frac{60 \times 50}{200} = 15 \]
Langkah 2: Menghitung Statistik Chi-Square
Statistik uji Chi-Square dihitung menggunakan rumus berikut:
\[ \chi^2 = \sum \frac{(O - E)^2}{E} \]
Di mana:
Mari kita hitung nilai Chi-Square untuk setiap sel dalam tabel:
Untuk 18-30 Tahun, Menggunakan Teknologi: \[ \frac{(60 - 52.5)^2}{52.5} = \frac{7.5^2}{52.5} = \frac{56.25}{52.5} = 1.0714 \]
Untuk 18-30 Tahun, Tidak Menggunakan Teknologi: \[ \frac{(10 - 17.5)^2}{17.5} = \frac{(-7.5)^2}{17.5} = \frac{56.25}{17.5} = 3.2143 \]
Untuk 31-45 Tahun, Menggunakan Teknologi: \[ \frac{(50 - 52.5)^2}{52.5} = \frac{-2.5^2}{52.5} = \frac{6.25}{52.5} = 0.1190 \]
Untuk 31-45 Tahun, Tidak Menggunakan Teknologi: \[ \frac{(20 - 17.5)^2}{17.5} = \frac{2.5^2}{17.5} = \frac{6.25}{17.5} = 0.3571 \]
Untuk 46+ Tahun, Menggunakan Teknologi: \[ \frac{(40 - 45)^2}{45} = \frac{-5^2}{45} = \frac{25}{45} = 0.5556 \]
Untuk 46+ Tahun, Tidak Menggunakan Teknologi: \[ \frac{(20 - 15)^2}{15} = \frac{5^2}{15} = \frac{25}{15} = 1.6667 \]
Sekarang, jumlahkan semua hasil Chi-Square tersebut untuk mendapatkan nilai Chi-Square total:
\[ \chi^2 = 1.0714 + 3.2143 + 0.1190 + 0.3571 + 0.5556 + 1.6667 = 6.9841 \]
Langkah 3: Uji Hipotesis Chi-Square
Dengan derajat kebebasan (df) dihitung sebagai:
\[ df = (r - 1) \times (c - 1) \]
Di mana \(r = 3\) dan \(c = 2\), maka:
\[ df = (3 - 1) \times (2 - 1) = 2 \times 1 = 2 \]
Perhitungan di R
# Membuat tabel kontingensi 3x2
data_matrix <- matrix(c(60, 10, 50, 20, 40, 20), nrow = 3, byrow = TRUE)
colnames(data_matrix) <- c("Menggunakan Teknologi", "Tidak Menggunakan Teknologi")
rownames(data_matrix) <- c("18-30 Tahun", "31-45 Tahun", "46+ Tahun")
# Uji Chi-Square
chi_square_test <- chisq.test(data_matrix, correct = FALSE)
# Menampilkan hasil uji Chi-Square
chi_square_test
##
## Pearson's Chi-squared test
##
## data: data_matrix
## X-squared = 6.9841, df = 2, p-value = 0.03044
Interpretasi p-value (0.03044) lebih kecil dari alpha 0.05, maka tolak H0. Artinya, ada hubungan yang signifikan antara kelompok umur dan kebiasaan menggunakan teknologi.
CHI-SQUARE TABEL PARTISI
Langkah 1: Memecah Tabel 3 × 2 Menjadi Beberapa Tabel 2 × 2
Tabel 3 × 2 akan dipartisi menjadi tiga tabel 2 × 2, masing-masing sebagai berikut:
Tabel 1: 18-30 Tahun vs 31-45 Tahun
Menggunakan Teknologi | Tidak Menggunakan Teknologi | Total | |
---|---|---|---|
18-30 Tahun | 60 | 10 | 70 |
31-45 Tahun | 50 | 20 | 70 |
Total | 110 | 30 | 140 |
Tabel 2: 31-45 Tahun vs 46+ Tahun
Menggunakan Teknologi | Tidak Menggunakan Teknologi | Total | |
---|---|---|---|
31-45 Tahun | 50 | 20 | 70 |
46+ Tahun | 40 | 20 | 60 |
Total | 90 | 40 | 130 |
Tabel 3: 18-30 Tahun vs 46+ Tahun
Menggunakan Teknologi | Tidak Menggunakan Teknologi | Total | |
---|---|---|---|
18-30 Tahun | 60 | 10 | 70 |
46+ Tahun | 40 | 20 | 60 |
Total | 100 | 30 | 130 |
Langkah 2: Menghitung Statistik Chi-Square untuk Setiap Tabel 2 × 2
Untuk menghitung statistik Chi-Square dan
p-value pada setiap tabel 2 × 2, kita akan menggunakan
fungsi chisq.test()
di R.
Perhitungan di R
# Membuat tabel kontingensi 3x2
data_matrix_1 <- matrix(c(60, 10, 50, 20), nrow = 2, byrow = TRUE)
colnames(data_matrix_1) <- c("Menggunakan Teknologi", "Tidak Menggunakan Teknologi")
rownames(data_matrix_1) <- c("18-30 Tahun", "31-45 Tahun")
data_matrix_2 <- matrix(c(50, 20, 40, 20), nrow = 2, byrow = TRUE)
colnames(data_matrix_2) <- c("Menggunakan Teknologi", "Tidak Menggunakan Teknologi")
rownames(data_matrix_2) <- c("31-45 Tahun", "46+ Tahun")
data_matrix_3 <- matrix(c(60, 10, 40, 20), nrow = 2, byrow = TRUE)
colnames(data_matrix_3) <- c("Menggunakan Teknologi", "Tidak Menggunakan Teknologi")
rownames(data_matrix_3) <- c("18-30 Tahun", "46+ Tahun")
# Uji Chi-Square untuk masing-masing tabel
chi_square_test_1 <- chisq.test(data_matrix_1, correct = FALSE)
chi_square_test_2 <- chisq.test(data_matrix_2, correct = FALSE)
chi_square_test_3 <- chisq.test(data_matrix_3, correct = FALSE)
# Menampilkan hasil uji Chi-Square untuk tiap tabel
chi_square_test_1
##
## Pearson's Chi-squared test
##
## data: data_matrix_1
## X-squared = 4.2424, df = 1, p-value = 0.03943
chi_square_test_2
##
## Pearson's Chi-squared test
##
## data: data_matrix_2
## X-squared = 0.34392, df = 1, p-value = 0.5576
chi_square_test_3
##
## Pearson's Chi-squared test
##
## data: data_matrix_3
## X-squared = 6.6032, df = 1, p-value = 0.01018
Interpretasi
Uji Likelihood Ratio (LR) adalah alternatif dari Uji Chi-Square yang digunakan untuk menguji apakah ada hubungan atau asosiasi antara dua variabel kategori. Uji ini mengukur perbedaan antara likelihood (kemungkinan) dari data yang diamati dan likelihood dari data yang diharapkan.
Uji Likelihood Ratio sangat berguna ketika data lebih kompleks atau ketika ada beberapa sel dengan frekuensi yang sangat kecil. Uji ini lebih cenderung digunakan ketika Uji Chi-Square tidak memberikan hasil yang baik.
Statistik Uji Likelihood Ratio
Statistik Likelihood Ratio dihitung menggunakan rumus berikut:
\[ G^2 = 2 \sum O \log \left( \frac{O}{E} \right) \]
Di mana:
Langkah-langkah Uji Likelihood Ratio:
Contoh Kasus:
Kita akan menggunakan contoh data yang menggambarkan hubungan antara jenis kelamin dan kebiasaan makan sayur pada 100 orang yang disurvei.
Makan Sayur | Tidak Makan Sayur | Total | |
---|---|---|---|
Laki-laki | 30 | 10 | 40 |
Perempuan | 40 | 20 | 60 |
Total | 70 | 30 | 100 |
# Data Observasi
data_matrix <- matrix(c(30, 10, 40, 20), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Makan Sayur", "Tidak Makan Sayur")
rownames(data_matrix) <- c("Laki-laki", "Perempuan")
# Hitung Frekuensi Ekspektasi
data_expected <- chisq.test(data_matrix)$expected
# Menambahkan kondisi untuk menangani nilai 0 dalam log
# Menggunakan log untuk menghindari masalah dengan log(0) yang tidak terdefinisi
log_expected <- ifelse(data_expected == 0, 0, log(data_matrix / data_expected))
# Hitung Statistik G²
G2 <- 2 * sum(data_matrix * log_expected)
# Nilai kritis chi-square untuk df = 1 dan alpha = 0.05
critical_value <- qchisq(0.95, df = 1)
# Hasil
list(G2 = G2, Critical_Value = critical_value, Decision = ifelse(G2 > critical_value, "Reject H0", "Fail to Reject H0"))
## $G2
## [1] 0.8043486
##
## $Critical_Value
## [1] 3.841459
##
## $Decision
## [1] "Fail to Reject H0"
Interpretasi Gagal menolak H0. Artinya, tidak ada hubungan antara jenis kelamin dengan kebiasaan makan sayur.
Uji Fisher’s Exact Test adalah uji statistik yang digunakan untuk menguji hubungan antara dua variabel kategori pada tabel 2 × 2. Uji ini digunakan ketika kita memiliki frekuensi yang sangat kecil dalam tabel kontingensi (misalnya, ada banyak sel dengan nilai yang sangat rendah atau bahkan 0), yang membuat Uji Chi-Square tidak dapat diandalkan.
Uji Fisher’s Exact Test lebih tepat digunakan daripada Uji Chi-Square saat data kecil atau saat frekuensi di beberapa sel sangat rendah (biasanya lebih kecil dari 5). Uji ini menghitung probabilitas eksak dari distribusi data yang diamati berdasarkan model hipotesis nol.
Hipotesis yang Diuji dalam Uji Fisher’s Exact
Hipotesis Nol (H₀): Tidak ada hubungan atau asosiasi antara dua variabel kategori (variabel tersebut independen).
\[ H_0: \text{Variabel A independen dengan Variabel B} \]
Hipotesis Alternatif (H₁): Ada hubungan atau asosiasi antara dua variabel kategori (variabel tersebut berhubungan).
\[ H_1: \text{Variabel A berhubungan dengan Variabel B} \]
Prinsip Dasar Uji Exact Fisher
Uji Fisher’s Exact menghitung probabilitas untuk mendapatkan distribusi yang lebih ekstrem dari data yang diamati berdasarkan distribusi hipotesis nol. Dalam hal ini, kita mengasumsikan bahwa kedua variabel tersebut independen, dan kita menghitung probabilitas memperoleh data yang diamati atau data yang lebih ekstrem jika hipotesis nol benar.
Keunggulan Uji Exact Fisher
Langkah-langkah Uji Exact Fisher
Contoh Kasus:
Misalkan kita memiliki data yang menunjukkan hubungan antara jenis kelamin dan kebiasaan makan sayur pada 40 orang yang disurvei.
Makan Sayur | Tidak Makan Sayur | Total | |
---|---|---|---|
Laki-laki | 6 | 4 | 10 |
Perempuan | 12 | 18 | 30 |
Total | 18 | 22 | 40 |
# Membuat tabel kontingensi 2x2
data_matrix <- matrix(c(6, 4, 12, 18), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Makan Sayur", "Tidak Makan Sayur")
rownames(data_matrix) <- c("Laki-laki", "Perempuan")
# Uji Exact Fisher
fisher_test <- fisher.test(data_matrix)
# Menampilkan hasil uji Fisher
fisher_test
##
## Fisher's Exact Test for Count Data
##
## data: data_matrix
## p-value = 0.3003
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 0.4182292 13.0641895
## sample estimates:
## odds ratio
## 2.20365
p-value 0.3003 > alpha 0.05, gagal menolak hipotesis nol dan menyimpulkan bahwa tidak ada hubungan yang signifikan antara jenis kelamin dengan kebiasaan makan sayur.
Analisis residual adalah salah satu teknik untuk mengevaluasi seberapa baik model Uji Chi-Square atau Uji Fisher dalam memodelkan hubungan antara dua variabel kategori dalam tabel kontingensi. Residual mengukur selisih antara frekuensi yang diamati dan frekuensi yang diharapkan.
Analisis residual sering digunakan untuk mengidentifikasi pola-pola yang tidak dijelaskan oleh model atau untuk mendeteksi outlier dalam data.
Ada beberapa jenis residual yang dapat digunakan dalam analisis tabel kontingensi. Setiap jenis residual memberikan informasi yang berbeda mengenai perbedaan antara frekuensi yang diamati dan yang diharapkan.
Beberapa jenis residual yang umum digunakan dalam analisis tabel kontingensi adalah:
Residual Biasa (Raw Residual)
Residual biasa adalah selisih antara frekuensi yang diamati dan
frekuensi yang diharapkan, tanpa normalisasi atau penyesuaian lebih
lanjut. Ini adalah bentuk paling sederhana dari residual.
Rumus untuk Residual Biasa adalah: \[ r_{ij} = O_{ij} - E_{ij} \] Di mana:
Residual Standar (Standardized Residual)
Residual standar dihitung dengan cara membagi residual biasa dengan
simpangan baku dari frekuensi yang diharapkan. Residual
ini memungkinkan kita untuk mengetahui seberapa besar perbedaan relatif
antara frekuensi yang diamati dan yang diharapkan.
Rumus untuk Residual Standar adalah: \[ r_{ij}^* = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]
Residual Pearson (Pearson Residual)
Residual Pearson adalah jenis residual standar yang digunakan dalam uji
Chi-Square Pearson. Residual Pearson mengukur sejauh
mana frekuensi yang diamati berbeda dari yang diharapkan, dibagi dengan
simpangan baku yang lebih lengkap.
Rumus untuk Residual Pearson adalah: \[ r_{ij}^{\text{Pearson}} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}(1 - p_{ij})}} \] Di mana \(p_{ij}\) adalah proporsi dari tabel yang sesuai.
Residual Deviasi (Deviance Residual)
Residual deviasi sering digunakan dalam konteks model regresi untuk
mengukur ketidaksesuaian antara nilai yang diamati dan model yang
dihasilkan. Residual ini diukur dengan menggunakan log-likelihood.
Rumus untuk Residual Deviasi adalah: \[ r_{ij}^{\text{Deviance}} = \text{sign}(O_{ij} - E_{ij}) \cdot \sqrt{2 \cdot [O_{ij} \log(\frac{O_{ij}}{E_{ij}}) + (E_{ij} - O_{ij})]} \]
Penerapan Jenis Residual dalam Tabel Kontingensi Setiap jenis residual memiliki kegunaan dan aplikasi yang berbeda tergantung pada konteks analisis dan tujuan penelitian.
Residual Biasa: Menunjukkan perbedaan langsung antara frekuensi yang diamati dan frekuensi yang diharapkan. Residual biasa sering digunakan sebagai titik awal dalam mendeteksi perbedaan yang tidak dijelaskan oleh model.
Residual Standar: Digunakan untuk menilai perbedaan relatif antara observasi dan frekuensi yang diharapkan. Residual standar memberikan ukuran yang lebih baik tentang sejauh mana sel tertentu berbeda dari yang diharapkan, terutama ketika distribusi frekuensi bervariasi.
Residual Pearson: Memiliki kegunaan yang lebih besar dalam Uji Chi-Square karena memberikan ukuran ketidaksesuaian dalam distribusi yang lebih jelas, dan lebih sensitif terhadap variasi data di sekitar nilai rata-rata.
Residual Deviasi: Lebih sering digunakan dalam analisis model yang lebih kompleks, seperti regresi logistik atau model deviasi, untuk mendeteksi pengaruh deviasi atau outlier.
Contoh Perhitungan
Misalkan kita memiliki tabel kontingensi berikut yang menunjukkan hubungan antara jenis kelamin dan kebiasaan makan sayur pada 40 orang yang disurvei.
Makan Sayur | Tidak Makan Sayur | Total | |
---|---|---|---|
Laki-laki | 6 | 4 | 10 |
Perempuan | 12 | 18 | 30 |
Total | 18 | 22 | 40 |
# Data Observasi
data_matrix <- matrix(c(6, 4, 12, 18), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Makan Sayur", "Tidak Makan Sayur")
rownames(data_matrix) <- c("Laki-laki", "Perempuan")
# Hitung Frekuensi yang Diharapkan
data_expected <- chisq.test(data_matrix)$expected
## Warning in chisq.test(data_matrix): Chi-squared approximation may be incorrect
# Hitung Residual Biasa
residual_raw <- data_matrix - data_expected
# Hitung Residual Standar
residual_standard <- residual_raw / sqrt(data_expected)
# Hitung Residual Pearson
residual_pearson <- residual_raw / sqrt(data_expected * (1 - (data_matrix / sum(data_matrix))))
# Tampilkan hasil
list(Raw_Residual = residual_raw, Standard_Residual = residual_standard, Pearson_Residual = residual_pearson)
## $Raw_Residual
## Makan Sayur Tidak Makan Sayur
## Laki-laki 1.5 -1.5
## Perempuan -1.5 1.5
##
## $Standard_Residual
## Makan Sayur Tidak Makan Sayur
## Laki-laki 0.7071068 -0.6396021
## Perempuan -0.4082483 0.3692745
##
## $Pearson_Residual
## Makan Sayur Tidak Makan Sayur
## Laki-laki 0.766965 -0.6741999
## Perempuan -0.487950 0.4979296
Interpretasi Residual Biasa (Raw Residual):
Residual Standar: Menunjukkan kontribusi relatif masing-masing sel terhadap perbedaan keseluruhan. Nilai lebih besar atau lebih kecil dari 2 atau -2 menandakan kontribusi signifikan.
Residual Pearson: Memberikan informasi lebih sensitif tentang perbedaan yang lebih kompleks dan lebih banyak digunakan dalam uji Chi-Square.
Pengertian Outlier Outlier adalah data yang memiliki nilai yang sangat berbeda atau ekstrem dibandingkan dengan data lainnya. Dalam konteks tabel kontingensi, outlier mengacu pada sel yang memiliki frekuensi yang jauh lebih besar atau lebih kecil dari yang diharapkan.
Deteksi Outlier Menggunakan Residual Residual digunakan untuk mendeteksi outlier karena mereka mengukur selisih antara frekuensi yang diamati dan frekuensi yang diharapkan. Sel-sel dengan residual yang sangat besar atau sangat kecil menunjukkan ketidaksesuaian yang lebih besar dan dapat dianggap sebagai outlier.
Beberapa langkah untuk mendeteksi outlier menggunakan residual:
Langkah-langkah Deteksi Outlier:
Contoh Kasus:
Misalkan kita menggunakan tabel yang sama dari contoh sebelumnya untuk mendeteksi outlier menggunakan residual standar.
Makan Sayur | Tidak Makan Sayur | Total | |
---|---|---|---|
Laki-laki | 6 | 4 | 10 |
Perempuan | 12 | 18 | 30 |
Total | 18 | 22 | 40 |
# Data Observasi
data_matrix <- matrix(c(6, 4, 12, 18), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Makan Sayur", "Tidak Makan Sayur")
rownames(data_matrix) <- c("Laki-laki", "Perempuan")
# Menghitung Frekuensi yang Diharapkan
data_expected <- chisq.test(data_matrix)$expected
## Warning in chisq.test(data_matrix): Chi-squared approximation may be incorrect
# Hitung Residual Standar
residual_standard <- (data_matrix - data_expected) / sqrt(data_expected)
# Identifikasi Outlier: Jika residual lebih besar dari 2 atau lebih kecil dari -2
outliers <- abs(residual_standard) > 2
# Menampilkan hasil
list(Residual_Standard = residual_standard, Outliers = outliers)
## $Residual_Standard
## Makan Sayur Tidak Makan Sayur
## Laki-laki 0.7071068 -0.6396021
## Perempuan -0.4082483 0.3692745
##
## $Outliers
## Makan Sayur Tidak Makan Sayur
## Laki-laki FALSE FALSE
## Perempuan FALSE FALSE
Interpretasi Tidak ada outlier yang terdeteksi dalam data ini. Semua nilai residual standar berada dalam batas yang wajar (antara -2 dan 2). Dengan kata lain, frekuensi yang diamati cukup konsisten dengan frekuensi yang diharapkan, dan tidak ada sel yang memberikan kontribusi yang sangat besar terhadap perbedaan yang diamati.
Tabel Kontingensi Tiga Arah adalah tabel yang digunakan untuk menganalisis hubungan antara tiga variabel kategori. Tabel ini mengembangkan konsep dari tabel kontingensi dua arah dengan menambahkan satu variabel tambahan. Dengan kata lain, tabel ini memungkinkan kita untuk melihat interaksi atau hubungan antara lebih dari dua variabel dalam satu model.
Biasanya, tabel kontingensi tiga arah digunakan untuk menganalisis hubungan simultan antara tiga kategori atau faktor yang berbeda, dan dapat menunjukkan apakah ada interaksi antara ketiganya.
Struktur Tabel Kontingensi Tiga Arah Tabel kontingensi tiga arah terdiri dari sel-sel yang mewakili kombinasi dari ketiga variabel. Pada umumnya, tabel ini memiliki dimensi (I × J × K), di mana:
Contoh Tabel Kontingensi Tiga Arah
Misalkan kita memiliki data mengenai jenis kelamin (Laki-laki, Perempuan), status merokok (Merokok, Tidak Merokok), dan kebiasaan makan sayur (Makan Sayur, Tidak Makan Sayur). Tabel kontingensi tiga arah untuk data ini dapat disusun sebagai berikut:
Makan Sayur | Tidak Makan Sayur | Total | |
---|---|---|---|
Laki-laki, Merokok | 10 | 5 | 15 |
Laki-laki, Tidak Merokok | 12 | 8 | 20 |
Perempuan, Merokok | 7 | 13 | 20 |
Perempuan, Tidak Merokok | 18 | 10 | 28 |
Total | 47 | 36 | 83 |
Confounding dalam Tabel Kontingensi Tiga Arah
Dalam tabel kontingensi tiga arah, confounding terjadi ketika variabel ketiga memengaruhi hubungan antara dua variabel lainnya. Confounding dapat menyebabkan hasil yang bias jika variabel ketiga tidak dikendalikan dalam analisis.
Apa itu Confounding?
Confounding terjadi ketika ada variabel ketiga yang memengaruhi hubungan antara dua variabel yang sedang dianalisis. Variabel ketiga ini disebut confounder. Ketika tidak mengontrol variabel confounder, hubungan antara dua variabel utama bisa menjadi terdistorsi.
Misalnya, dalam contoh ini, status merokok dapat menjadi confounder dalam hubungan antara jenis kelamin dan kebiasaan makan sayur. Perempuan lebih cenderung tidak merokok dan lebih cenderung makan sayur, sementara laki-laki lebih banyak merokok dan lebih sedikit makan sayur. Tanpa mempertimbangkan status merokok, kita mungkin tidak melihat hubungan yang sebenarnya antara jenis kelamin dan kebiasaan makan sayur.
Contoh Kasus
Misalkan kita ingin meneliti apakah perokok dapat dipengaruhi oleh jenis kelamin dengan melibatkan usia sebagai confounder. Data yang tersedia adalah sebagai berikut:
Data Tabel Kontingensi Tiga Arah
Muda, Merokok | Muda, Tidak Merokok | Tua, Merokok | Tua, Tidak Merokok | Total | |
---|---|---|---|---|---|
Laki-laki | 15 | 10 | 5 | 20 | 50 |
Perempuan | 10 | 20 | 15 | 5 | 50 |
Total | 25 | 30 | 20 | 25 | 100 |
Tabel Parsial
Tabel parsial mengontrol usia sebagai confounder, sehingga kita akan membuat dua tabel parsial berdasarkan usia: satu untuk muda dan satu untuk tua. Tabel parsial akan menunjukkan distribusi antara jenis kelamin dan status merokok, mengontrol usia.
Tabel Parsial: Usia Muda
Merokok | Tidak Merokok | Total | |
---|---|---|---|
Laki-laki | 15 | 10 | 25 |
Perempuan | 10 | 20 | 30 |
Total | 25 | 30 | 55 |
Tabel Parsial: Usia Tua
Merokok | Tidak Merokok | Total | |
---|---|---|---|
Laki-laki | 5 | 20 | 25 |
Perempuan | 15 | 5 | 20 |
Total | 20 | 25 | 45 |
Tabel Marginal
Tabel marginal menggambarkan distribusi jenis kelamin dan status merokok tanpa mempertimbangkan usia (confounder). Tabel ini menunjukkan distribusi keseluruhan data tanpa kontrol terhadap usia.
Tabel Marginal untuk Jenis Kelamin dan Status Merokok
Merokok | Tidak Merokok | Total | |
---|---|---|---|
Laki-laki | 20 | 30 | 50 |
Perempuan | 25 | 25 | 50 |
Total | 45 | 55 | 100 |
Kesimpulan
Peluang Bersama (Joint Probability)
Peluang bersama mengukur probabilitas dua (atau lebih) kejadian yang
terjadi bersamaan dalam satu model tiga variabel. Ini dihitung dengan
membagi frekuensi kejadian bersama dengan total jumlah kejadian
keseluruhan.
Rumus untuk Peluang Bersama: \[ P(X = x_1, Y = y_1, Z = z_1) = \frac{f(x_1, y_1, z_1)}{N} \] Di mana:
Peluang Marginal (Marginal Probability)
Peluang marginal mengukur probabilitas terjadinya satu kejadian untuk
satu variabel, tanpa mempertimbangkan kejadian variabel lainnya. Pada
tabel tiga arah, kita menghitung peluang marginal untuk masing-masing
variabel dengan menjumlahkan peluang bersama yang relevan.
Rumus untuk Peluang Marginal untuk satu variabel: \[ P(X = x_1) = \sum_{y_1, z_1} P(X = x_1, Y = y_1, Z = z_1) \] \[ P(Y = y_1) = \sum_{x_1, z_1} P(X = x_1, Y = y_1, Z = z_1) \] \[ P(Z = z_1) = \sum_{x_1, y_1} P(X = x_1, Y = y_1, Z = z_1) \]
Peluang Bersyarat (Conditional
Probability)
Peluang bersyarat mengukur probabilitas satu kejadian terjadi, diberikan
kejadian lainnya. Misalnya, peluang bersyarat untuk usia
(Z) dengan status merokok (X) dan
kanker paru (Y).
Rumus untuk Peluang Bersyarat: \[ P(Z = z_1 \mid X = x_1, Y = y_1) = \frac{P(X = x_1, Y = y_1, Z = z_1)}{P(X = x_1, Y = y_1)} \] \[ P(X = x_1 \mid Y = y_1, Z = z_1) = \frac{P(X = x_1, Y = y_1, Z = z_1)}{P(Y = y_1, Z = z_1)} \] \[ P(Y = y_1 \mid X = x_1, Z = z_1) = \frac{P(X = x_1, Y = y_1, Z = z_1)}{P(X = x_1, Z = z_1)} \]
Contoh Kasus:
Misalkan kita ingin meneliti apakah merokok dipengaruhi oleh jenis kelamin (X) dan usia (Z) sebagai confounder dalam hubungannya dengan kanker paru (Y). Data yang tersedia adalah sebagai berikut:
Kanker Paru (Ya) | Kanker Paru (Tidak) | Jumlah | |
---|---|---|---|
Muda, Merokok | 10 | 40 | 50 |
Muda, Tidak Merokok | 5 | 45 | 50 |
Dewasa, Merokok | 40 | 10 | 50 |
Dewasa, Tidak Merokok | 10 | 40 | 50 |
Tua, Merokok | 50 | 0 | 50 |
Tua, Tidak Merokok | 20 | 30 | 50 |
Total | 135 | 165 | 300 |
Menghitung Peluang Bersama, Marginal, dan Bersyarat di R
# Data Observasi
data_matrix <- matrix(c(10, 40, 5, 45, 40, 10, 10, 40, 50, 0, 20, 30), nrow = 6, byrow = TRUE)
colnames(data_matrix) <- c("Kanker Paru (Ya)", "Kanker Paru (Tidak)")
rownames(data_matrix) <- c("Muda, Merokok", "Muda, Tidak Merokok", "Dewasa, Merokok", "Dewasa, Tidak Merokok", "Tua, Merokok", "Tua, Tidak Merokok")
# Total jumlah observasi
total <- sum(data_matrix)
# Peluang Bersama
joint_probability <- data_matrix / total
# Peluang Marginal untuk Jenis Kelamin dan Merokok
marginal_gender_smoking <- rowSums(data_matrix) / total
# Peluang Marginal untuk Kanker Paru
marginal_cancer <- colSums(data_matrix) / total
# Peluang Marginal untuk Usia
marginal_age <- apply(data_matrix, 2, sum) / total
# Peluang Bersyarat P(Usia | Merokok, Kanker Paru)
conditional_probability_age <- joint_probability[, "Kanker Paru (Ya)"] / marginal_cancer["Kanker Paru (Ya)"]
# Menampilkan hasil dalam bentuk tabel
list(
Joint_Probability = joint_probability,
Marginal_Probability_Gender_Smoking = marginal_gender_smoking,
Marginal_Probability_Cancer = marginal_cancer,
Marginal_Probability_Age = marginal_age,
Conditional_Probability_Age = conditional_probability_age
)
## $Joint_Probability
## Kanker Paru (Ya) Kanker Paru (Tidak)
## Muda, Merokok 0.03333333 0.13333333
## Muda, Tidak Merokok 0.01666667 0.15000000
## Dewasa, Merokok 0.13333333 0.03333333
## Dewasa, Tidak Merokok 0.03333333 0.13333333
## Tua, Merokok 0.16666667 0.00000000
## Tua, Tidak Merokok 0.06666667 0.10000000
##
## $Marginal_Probability_Gender_Smoking
## Muda, Merokok Muda, Tidak Merokok Dewasa, Merokok
## 0.1666667 0.1666667 0.1666667
## Dewasa, Tidak Merokok Tua, Merokok Tua, Tidak Merokok
## 0.1666667 0.1666667 0.1666667
##
## $Marginal_Probability_Cancer
## Kanker Paru (Ya) Kanker Paru (Tidak)
## 0.45 0.55
##
## $Marginal_Probability_Age
## Kanker Paru (Ya) Kanker Paru (Tidak)
## 0.45 0.55
##
## $Conditional_Probability_Age
## Muda, Merokok Muda, Tidak Merokok Dewasa, Merokok
## 0.07407407 0.03703704 0.29629630
## Dewasa, Tidak Merokok Tua, Merokok Tua, Tidak Merokok
## 0.07407407 0.37037037 0.14814815
Contoh Kasus:
Misalkan kita ingin meneliti apakah merokok memengaruhi kejadian kanker paru dengan usia sebagai confounder. Tabel data yang diberikan adalah sebagai berikut:
Kanker Paru (Ya) | Kanker Paru (Tidak) | Total | |
---|---|---|---|
Muda, Merokok | 10 | 40 | 50 |
Muda, Tidak Merokok | 5 | 45 | 50 |
Dewasa, Merokok | 40 | 10 | 50 |
Dewasa, Tidak Merokok | 10 | 40 | 50 |
Total | 65 | 135 | 200 |
Tabel Marginal
Kanker Paru (Ya) | Kanker Paru (Tidak) | Total | |
---|---|---|---|
Merokok | 50 | 50 | 100 |
Tidak Merokok | 15 | 85 | 100 |
Total | 65 | 135 | 200 |
# Data observasi
data <- matrix(c(50, 50, 15, 85), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Merokok" = c("Ya", "Tidak"),
"Kanker Paru" = c("Ya", "Tidak"))
data
## Kanker Paru
## Merokok Ya Tidak
## Ya 50 50
## Tidak 15 85
# Komponen
a <- data[1, 1]
b <- data[1, 2]
c <- data[2, 1]
d <- data[2, 2]
# Perhitungan
rd <- round((a / (a + b)) - (c / (c + d)), 2)
rr <- round((a / (a + b)) / (c / (c + d)), 2)
or <- round((a * d) / (b * c), 2)
list(
"Risk Difference (RD)" = rd,
"Relative Risk (RR)" = rr,
"Odds Ratio (OR)" = or
)
## $`Risk Difference (RD)`
## [1] 0.35
##
## $`Relative Risk (RR)`
## [1] 3.33
##
## $`Odds Ratio (OR)`
## [1] 5.67
Interpretasi
Usia Muda
Kanker Paru (Ya) | Kanker Paru (Tidak) | Total | |
---|---|---|---|
Merokok | 10 | 40 | 50 |
Tidak Merokok | 5 | 45 | 50 |
Total | 15 | 85 | 100 |
# Data observasi
data <- matrix(c(10, 40, 5, 45), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Merokok" = c("Ya", "Tidak"),
"Kanker Paru" = c("Ya", "Tidak"))
data
## Kanker Paru
## Merokok Ya Tidak
## Ya 10 40
## Tidak 5 45
# Komponen
a <- data[1, 1]
b <- data[1, 2]
c <- data[2, 1]
d <- data[2, 2]
# Perhitungan
rd <- round((a / (a + b)) - (c / (c + d)), 2)
rr <- round((a / (a + b)) / (c / (c + d)), 2)
or <- round((a * d) / (b * c), 2)
list(
"Risk Difference (RD)" = rd,
"Relative Risk (RR)" = rr,
"Odds Ratio (OR)" = or
)
## $`Risk Difference (RD)`
## [1] 0.1
##
## $`Relative Risk (RR)`
## [1] 2
##
## $`Odds Ratio (OR)`
## [1] 2.25
Interpretasi
Usia Dewasa
Kanker Paru (Ya) | Kanker Paru (Tidak) | Total | |
---|---|---|---|
Merokok | 40 | 10 | 50 |
Tidak Merokok | 10 | 40 | 50 |
Total | 50 | 50 | 100 |
# Data observasi
data <- matrix(c(40, 10, 10, 40), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Merokok" = c("Ya", "Tidak"),
"Kanker Paru" = c("Ya", "Tidak"))
data
## Kanker Paru
## Merokok Ya Tidak
## Ya 40 10
## Tidak 10 40
# Komponen
a <- data[1, 1]
b <- data[1, 2]
c <- data[2, 1]
d <- data[2, 2]
# Perhitungan
rd <- round((a / (a + b)) - (c / (c + d)), 2)
rr <- round((a / (a + b)) / (c / (c + d)), 2)
or <- round((a * d) / (b * c), 2)
list(
"Risk Difference (RD)" = rd,
"Relative Risk (RR)" = rr,
"Odds Ratio (OR)" = or
)
## $`Risk Difference (RD)`
## [1] 0.6
##
## $`Relative Risk (RR)`
## [1] 4
##
## $`Odds Ratio (OR)`
## [1] 16
Interpretasi
Karena hasil asosiasi tabel parsial dan marginal sama, maka usia tidak efektif bila dijadikan confounder.
Independensi bersyarat adalah konsep penting dalam analisis tabel kontingensi tiga arah. Ini merujuk pada kondisi di mana dua variabel, X dan Y, dianggap independen setelah mengendalikan pengaruh dari variabel ketiga, Z.
Secara matematis, dua variabel X dan Y dikatakan independen bersyarat terhadap variabel Z jika rasio odds mereka dalam setiap strata Z adalah sama dengan 1. Dalam hal ini, tidak ada hubungan antara X dan Y setelah mengendalikan pengaruh dari Z.
Formula untuk Independensi Bersyarat
Independensi bersyarat antara X dan Y dengan kontrol pada Z dapat dinyatakan dengan rasio odds yang sama dengan 1 dalam setiap strata dari variabel ketiga Z:
\[ OR(X, Y | Z) = 1 \]
Ini menunjukkan bahwa X dan Y tidak memiliki asosiasi dalam setiap strata Z, artinya X dan Y adalah independen setelah mempertimbangkan pengaruh Z.
Pengujian Independensi Bersyarat
Pengujian independensi bersyarat biasanya dilakukan menggunakan uji Cochran-Mantel-Haenszel (CMH). Uji CMH digunakan untuk menguji apakah ada hubungan antara dua variabel (X dan Y) setelah mengendalikan pengaruh variabel ketiga (Z). Uji ini menggabungkan informasi dari berbagai strata untuk menguji hipotesis mengenai independensi bersyarat.
Hipotesis nol dalam uji CMH adalah bahwa X dan Y adalah independen setelah mengendalikan Z. Jika uji menunjukkan bahwa rasio odds dalam strata Z berbeda dari 1, maka kita menolak hipotesis nol dan menyimpulkan bahwa X dan Y tidak independen bersyarat terhadap Z.
Paradoks Simpson
Paradoks Simpson adalah fenomena yang terjadi ketika X dan Y tampaknya memiliki hubungan dalam data keseluruhan (tabel marginal), namun setelah mempertimbangkan variabel ketiga (Z), hubungan tersebut hilang atau bahkan berbalik arah dalam setiap strata Z.
Ini menunjukkan bahwa meskipun X dan Y tampak terkait dalam data keseluruhan, hubungan tersebut bisa jadi disebabkan oleh variabel ketiga (Z), dan hubungan asli antara X dan Y sebenarnya tidak ada ketika kita mengendalikan Z.
Contoh Paradoks Simpson
Misalkan kita memiliki data yang menunjukkan hubungan antara jenis kelamin (X) dan kebiasaan makan sayur (Y), dengan status merokok (Z) sebagai variabel ketiga. Tabel marginal menunjukkan bahwa perempuan lebih cenderung makan sayur daripada laki-laki, namun setelah kita mengendalikan status merokok (Z), kita menemukan bahwa laki-laki yang tidak merokok lebih cenderung makan sayur daripada perempuan yang tidak merokok.
Ini adalah contoh Paradoks Simpson, di mana hubungan yang tampaknya ada dalam tabel marginal menghilang setelah mempertimbangkan variabel ketiga Z.
Aplikasi Independensi Bersyarat dalam Analisis
Independensi bersyarat sering digunakan dalam studi epidemiologi, ilmu sosial, dan model pembelajaran mesin yang menganalisis tabel kontingensi terstruktur. Dalam bidang ini, kita sering ingin memahami hubungan antara dua variabel sambil mengendalikan pengaruh dari variabel lain, seperti status merokok, usia, atau faktor risiko lainnya.
Pengujian statistik untuk independensi bersyarat digunakan untuk menguji apakah dua variabel X dan Y tetap independen setelah mengendalikan variabel ketiga Z. Salah satu metode yang sering digunakan untuk pengujian ini adalah Cochran-Mantel-Haenszel Test (CMH).
CMH digunakan untuk menguji hipotesis mengenai independensi bersyarat antara dua variabel dalam tabel kontingensi tiga arah, dengan mengendalikan pengaruh dari variabel ketiga.
Hipotesis dalam Uji Cochran-Mantel-Haenszel
Statistik Uji Cochran-Mantel-Haenszel (CMH)
Uji Cochran-Mantel-Haenszel menghitung rasio odds (Odds Ratio) untuk setiap strata variabel Z, dan kemudian menggabungkannya untuk memberikan satu statistik uji.
Statistik uji untuk CMH adalah statistik chi-squared yang dapat dihitung sebagai:
\[ \chi^2 = \frac{( \sum_{i=1}^{k} (O_i - E_i)^2 / E_i )}{\text{derajat kebebasan}} \]
Di mana:
Jika nilai statistik uji chi-squared lebih besar dari nilai kritis pada tingkat signifikansi tertentu (misalnya \(\alpha = 0.05\)), maka kita menolak hipotesis nol.
Kriteria Uji
Contoh Kasus
Mari kita gunakan contoh data berikut untuk melakukan uji Cochran-Mantel-Haenszel (CMH):
Kanker Paru (Ya) | Kanker Paru (Tidak) | Total | |
---|---|---|---|
Muda, Merokok | 10 | 40 | 50 |
Muda, Tidak Merokok | 5 | 45 | 50 |
Dewasa, Merokok | 40 | 10 | 50 |
Dewasa, Tidak Merokok | 10 | 40 | 50 |
Total | 65 | 135 | 200 |
Variabel:
Tujuan kita adalah untuk menguji apakah ada hubungan antara status merokok dan kanker paru, setelah mengendalikan usia sebagai variabel ketiga (Z).
# Membuat data dalam bentuk array 3 dimensi untuk uji CMH
data <- array(c(10, 5, 40, 45, 40, 10, 10, 40), dim = c(2, 2, 2))
dimnames(data) <- list("Status Merokok" = c("Merokok", "Tidak Merokok"),
"Kanker Paru" = c("Ya", "Tidak"),
"Usia" = c("Muda", "Dewasa"))
data
## , , Usia = Muda
##
## Kanker Paru
## Status Merokok Ya Tidak
## Merokok 10 40
## Tidak Merokok 5 45
##
## , , Usia = Dewasa
##
## Kanker Paru
## Status Merokok Ya Tidak
## Merokok 40 10
## Tidak Merokok 10 40
# Melakukan uji Cochran-Mantel-Haenszel
cmh_test <- mantelhaen.test(data, correct = FALSE)
# Menampilkan hasil uji CMH
cmh_test
##
## Mantel-Haenszel chi-squared test without continuity correction
##
## data: data
## Mantel-Haenszel X-squared = 32.126, df = 1, p-value = 1.445e-08
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 3.306205 14.123276
## sample estimates:
## common odds ratio
## 6.833333
Interpretasi p-value < alpha (0.05), maka tolak H0. Variabel kanker paru dan status merokok tidak independen bersyarat terhadap usia. Artinya, terdapat hubungan antara status merokok dan kanker paru setelah mengendalikan variabel usia.
Odds Ratio Bersama digunakan untuk menghitung perbandingan odds dalam tabel kontingensi 2x2xk (tiga variabel), dengan menggabungkan informasi dari beberapa strata dalam variabel ketiga (Z). Odds Ratio Bersama memberikan gambaran bagaimana hubungan antara dua variabel (X dan Y) berubah setelah mempertimbangkan variabel ketiga (Z).
Rumus Odds Ratio Bersama
Untuk tabel 2x2xk, odds ratio bersama dihitung dengan cara menggabungkan odds ratio dari masing-masing strata. Rumusnya adalah:
\[ OR_{\text{bersama}} = \frac{\sum_{i=1}^k a_i}{\sum_{i=1}^k b_i} \]
Dimana:
Standar Error Log Odds Ratio Bersama
Standar error untuk log odds ratio bersama dihitung dengan rumus:
\[ SE_{\log(OR_{\text{bersama}})} = \sqrt{\sum_{i=1}^k \left( \frac{1}{a_i} + \frac{1}{b_i} + \frac{1}{c_i} + \frac{1}{d_i} \right)} \]
Dimana:
Interval Kepercayaan Log Odds Ratio Bersama
Interval kepercayaan (CI) untuk log odds ratio bersama dapat dihitung dengan rumus:
\[ CI_{\log(OR_{\text{bersama}})} = \log(OR_{\text{bersama}}) \pm Z_{\alpha/2} \cdot SE_{\log(OR_{\text{bersama}})} \]
Dimana:
CI untuk odds ratio bersama dihitung dengan mengubah kembali ke bentuk odds ratio:
\[ CI_{\text{OR}} = \exp(CI_{\log(OR_{\text{bersama}})}) \]
Contoh Kasus
Kita akan menggunakan data berikut untuk menghitung odds ratio bersama:
Kanker Paru (Ya) | Kanker Paru (Tidak) | Total | |
---|---|---|---|
Muda, Merokok | 10 | 40 | 50 |
Muda, Tidak Merokok | 5 | 45 | 50 |
Dewasa, Merokok | 40 | 10 | 50 |
Dewasa, Tidak Merokok | 10 | 40 | 50 |
Total | 65 | 135 | 200 |
# Membuat data dalam bentuk array 3 dimensi untuk uji CMH
data <- array(c(10, 5, 40, 45, 40, 10, 10, 40), dim = c(2, 2, 2))
dimnames(data) <- list("Status Merokok" = c("Merokok", "Tidak Merokok"),
"Kanker Paru" = c("Ya", "Tidak"),
"Usia" = c("Muda", "Dewasa"))
data
## , , Usia = Muda
##
## Kanker Paru
## Status Merokok Ya Tidak
## Merokok 10 40
## Tidak Merokok 5 45
##
## , , Usia = Dewasa
##
## Kanker Paru
## Status Merokok Ya Tidak
## Merokok 40 10
## Tidak Merokok 10 40
# Melakukan uji Cochran-Mantel-Haenszel
cmh_test <- mantelhaen.test(data, correct = FALSE)
# Menampilkan hasil uji CMH
cmh_test
##
## Mantel-Haenszel chi-squared test without continuity correction
##
## data: data
## Mantel-Haenszel X-squared = 32.126, df = 1, p-value = 1.445e-08
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 3.306205 14.123276
## sample estimates:
## common odds ratio
## 6.833333
Interpretasi
Definisi Asosiasi Homogen
Asosiasi homogen dalam konteks tabel kontingensi tiga arah merujuk pada kondisi di mana odds ratio antara dua variabel (X dan Y) konsisten di seluruh strata dari variabel ketiga (Z). Dengan kata lain, jika odds ratio untuk setiap strata (misalnya strata usia) adalah sama, kita dapat mengatakan bahwa asosiasi antara X dan Y adalah homogen di seluruh strata Z.
Sebaliknya, jika odds ratio bervariasi antara strata, maka asosiasi antara X dan Y tidak homogen. Dalam hal ini, kita perlu melakukan uji untuk menguji homogenitas odds ratio.
Hipotesis dalam Uji Homogenitas Odds Ratio
Uji homogenitas odds ratio dilakukan dengan menggunakan statistik Breslow-Day. Berikut adalah hipotesis yang diuji:
Hipotesis Nol (H0): Odds ratio adalah homogen di seluruh strata variabel ketiga Z. Dengan kata lain, odds ratio tidak berbeda antara strata. \[ H_0: \text{Homogenitas Odds Ratio} \quad \text{atau} \quad OR_1 = OR_2 = ... = OR_k \]
Hipotesis Alternatif (H1): Odds ratio tidak homogen di seluruh strata variabel ketiga Z. Dengan kata lain, odds ratio berbeda antara strata. \[ H_1: \text{Odds Ratio Tidak Homogen} \]
Statistik Uji Breslow-Day
Statistik uji Breslow-Day digunakan untuk menguji homogenitas odds ratio di antara strata. Uji ini menghasilkan statistik chi-squared yang mengukur apakah terdapat perbedaan signifikan dalam odds ratio di seluruh strata.
Statistik uji Breslow-Day dihitung dengan rumus:
\[ \chi^2 = \frac{(O_1 - E_1)^2 / E_1 + (O_2 - E_2)^2 / E_2 + ... + (O_k - E_k)^2 / E_k}{\text{derajat kebebasan}} \]
Di mana:
Kriteria Uji
Contoh Kasus:
Mari kita gunakan contoh data berikut yang telah kita pakai sebelumnya untuk melakukan uji homogenitas odds ratio menggunakan statistik Breslow-Day:
Kanker Paru (Ya) | Kanker Paru (Tidak) | Total | |
---|---|---|---|
Muda, Merokok | 10 | 40 | 50 |
Muda, Tidak Merokok | 5 | 45 | 50 |
Dewasa, Merokok | 40 | 10 | 50 |
Dewasa, Tidak Merokok | 10 | 40 | 50 |
Total | 65 | 135 | 200 |
Variabel:
Tujuan kita adalah untuk menguji apakah odds ratio antara status merokok dan kanker paru adalah homogen setelah mengendalikan Usia sebagai variabel ketiga (Z).
# Data Observasi untuk Uji Breslow-Day
data <- array(c(10, 5, 40, 45, 40, 10, 10, 40), dim = c(2, 2, 2))
dimnames(data) <- list("Status Merokok" = c("Merokok", "Tidak Merokok"),
"Kanker Paru" = c("Ya", "Tidak"),
"Usia" = c("Muda", "Dewasa"))
data
## , , Usia = Muda
##
## Kanker Paru
## Status Merokok Ya Tidak
## Merokok 10 40
## Tidak Merokok 5 45
##
## , , Usia = Dewasa
##
## Kanker Paru
## Status Merokok Ya Tidak
## Merokok 40 10
## Tidak Merokok 10 40
# Uji Homogenitas Odds Ratio dengan Statistik Breslow-Day
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.4.3
breslow_day_test <- BreslowDayTest(data)
# Menampilkan hasil uji Breslow-Day
breslow_day_test
##
## Breslow-Day test on Homogeneity of Odds Ratios
##
## data: data
## X-squared = 6.7807, df = 1, p-value = 0.009215
Interpretasi p-value (0.009) < alpha (0.05), maka tolak H0. Artinya, odds ratio tidak homogen di seluruh strata Usia dan ada interaksi antara status merokok dan kanker paru.
Generalized Linear Models (GLM) adalah model statistik yang memperluas konsep model regresi linear tradisional. GLM memungkinkan kita untuk bekerja dengan berbagai jenis distribusi dari variabel dependen, termasuk distribusi yang tidak memiliki sifat normal. GLM terdiri dari tiga komponen utama: distribusi keluarga eksponensial, fungsi link, dan fungsi linear prediktor.
Definisi Keluarga Distribusi Eksponensial
Keluarga distribusi eksponensial adalah kelompok distribusi yang memiliki bentuk probabilitas yang sama, dan merupakan bagian inti dalam Generalized Linear Models (GLM). Distribusi eksponensial adalah keluarga distribusi yang memiliki bentuk umum sebagai berikut:
\[ f(y;\theta,\phi) = \exp\left(\frac{y\theta - b(\theta)}{\phi} + c(y,\phi)\right) \]
Di mana: - \(y\) adalah variabel dependen (data yang diamati), - \(\theta\) adalah parameter alami atau parameter distribusi, - \(\phi\) adalah parameter skala yang sering kali dianggap tetap (biasanya \(\phi = 1\)), - \(b(\theta)\) adalah fungsi pembentuk yang tergantung pada \(\theta\), - \(c(y, \phi)\) adalah fungsi yang hanya bergantung pada data \(y\) dan parameter skala \(\phi\).
Contoh Keluarga Distribusi Eksponensial
Beberapa distribusi yang termasuk dalam keluarga distribusi eksponensial adalah: 1. Distribusi Normal: Jika \(b(\theta) = \frac{\theta^2}{2}\), maka distribusi ini merupakan distribusi normal. 2. Distribusi Poisson: Jika \(b(\theta) = \theta\), distribusi ini menghasilkan distribusi Poisson. 3. Distribusi Binomial: Untuk kasus distribusi binomial, distribusi ini dapat dijelaskan sebagai bagian dari keluarga eksponensial dengan menggunakan logit link.
Secara umum, keluarga distribusi eksponensial mencakup distribusi yang memiliki fungsi kepadatan probabilitas dalam bentuk eksponensial yang spesifik dan dapat digunakan dalam model regresi GLM.
Fungsi Link dalam GLM
Fungsi link adalah fungsi yang menghubungkan rata-rata dari variabel dependen (misalnya, rata-rata dari \(Y\)) dengan fungsi linear prediktor (kombinasi linier dari variabel independen). Fungsi link mengubah prediksi model menjadi mean atau nilai yang lebih mudah diinterpretasikan dalam konteks model. Dalam GLM, fungsi link yang umum digunakan termasuk: - Logit: Digunakan dalam model regresi logistik. - Log: Digunakan dalam model regresi Poisson. - Identitas: Digunakan dalam model regresi linear biasa.
Keuntungan dari Keluarga Distribusi Eksponensial dalam GLM
Salah satu keuntungan utama menggunakan keluarga distribusi eksponensial dalam Generalized Linear Models (GLM) adalah fleksibilitasnya. GLM memungkinkan kita untuk bekerja dengan berbagai jenis data dan distribusi yang lebih luas daripada model regresi linear biasa.
Contoh Distribusi dalam Keluarga Eksponensial
Berikut adalah beberapa distribusi yang tergolong dalam keluarga distribusi eksponensial dan contohnya dalam GLM:
Kelebihan GLM dengan Keluarga Distribusi Eksponensial
Kesimpulan
Model regresi logistik digunakan untuk memodelkan hubungan antara variabel dependen biner (misalnya, 0 atau 1) dan satu atau lebih variabel independen. Berbeda dengan regresi linier biasa, yang memprediksi nilai kontinu, regresi logistik memprediksi probabilitas kejadian dua hasil yang berbeda (seperti sukses atau gagal).
Fungsi Sigmoid
Regresi logistik menggunakan fungsi sigmoid (atau kurva logistik) untuk mengubah output linier menjadi probabilitas. Fungsi sigmoid didefinisikan sebagai:
\[ \sigma(z) = \frac{1}{1 + \exp(-z)} \]
Di mana:
Fungsi sigmoid memastikan bahwa outputnya selalu berada dalam rentang [0, 1], yang membuatnya cocok untuk masalah klasifikasi biner.
Fungsi Link (Logit)
Dalam regresi logistik, kita menghubungkan log odds (logaritma dari perbandingan odds) dengan fungsi linier dari variabel independen. Fungsi link yang digunakan adalah logit:
\[ \text{logit}(\mu) = \log\left(\frac{\mu}{1-\mu}\right) = X\beta \]
Di mana:
Model regresi logistik mengasumsikan bahwa log odds dari probabilitas kejadian adalah fungsi linier dari variabel independen.
Fungsi Inverse Logit
Fungsi inverse logit digunakan untuk mengubah log odds kembali menjadi probabilitas. Ini adalah fungsi sigmoid yang telah dijelaskan sebelumnya. Fungsi inverse logit:
\[ \mu = \frac{1}{1 + \exp(-X\beta)} \]
Di sini, \(X\beta\) adalah kombinasi linier dari variabel independen.
Estimasi Parameter dengan MLE (Maximum Likelihood Estimation)
Dalam regresi logistik, Maximum Likelihood Estimation (MLE) digunakan untuk memperkirakan parameter model (koefisien \(\beta\)). Estimasi MLE mencari nilai parameter yang memaksimalkan likelihood dari data yang diamati.
Fungsi likelihood untuk model regresi logistik adalah:
\[ L(\beta) = \prod_{i=1}^n \mu_i^{y_i}(1 - \mu_i)^{(1 - y_i)} \]
Di mana \(\mu_i\) adalah probabilitas kejadian untuk pengamatan \(i\), dan \(y_i\) adalah hasil observasi (0 atau 1).
Iterasi Newton-Raphson atau Fisher Scoring digunakan untuk mengoptimalkan fungsi likelihood dan mencari nilai parameter yang memaksimalkan likelihood.
Simulasi dan Visualisasi Regresi Logistik
# Simulasi data untuk regresi logistik
set.seed(42)
n <- 1000 # jumlah data
X <- rnorm(n) # variabel independen
beta <- 1.5 # koefisien parameter
p <- 1 / (1 + exp(-(beta * X))) # probabilitas kejadian
y <- rbinom(n, 1, p) # data biner
# Visualisasi kurva sigmoid
plot(X, p, type = "l", col = "blue", lwd = 2, main = "Kurva Sigmoid", xlab = "X", ylab = "P(Y=1)")
points(X, p, col = ifelse(y == 1, "red", "green"), pch = 19) # Titik data biner
Pada plot di atas, kita menggambarkan kurva sigmoid dan titik-titik yang
mewakili data biner (merah untuk kejadian dan hijau untuk
non-kejadian).
Estimasi Parameter dengan MLE (Maximum Likelihood Estimation)
Estimasi parameter untuk regresi logistik dilakukan
dengan menggunakan Maximum Likelihood Estimation (MLE).
Fungsi glm()
di R memungkinkan kita untuk
melakukan estimasi parameter model regresi logistik. Proses ini
bertujuan untuk memaksimalkan fungsi likelihood yang
menunjukkan seberapa baik model menjelaskan data yang diamati.
Dalam regresi logistik, kita mengasumsikan bahwa hubungan antara variabel independen dan probabilitas kejadian mengikuti fungsi sigmoid. MLE mencari parameter \(\beta\) yang memaksimalkan likelihood dari data yang diamati.
Fungsi Link dan Estimasi dengan MLE
Fungsi link untuk model regresi logistik adalah logit yang menghubungkan log odds dari probabilitas kejadian dengan fungsi linier dari variabel prediktor:
\[ \text{logit}(\mu) = \log\left(\frac{\mu}{1-\mu}\right) = X\beta \]
Di mana:
Estimasi Parameter dengan Fungsi glm()
di
R
Kita akan menggunakan fungsi glm()
di R
untuk memperkirakan parameter \(\beta\)
dari model regresi logistik. Fungsi glm() di R menggunakan algoritma
iterasi Newton-Raphson atau Fisher Scoring
# Simulasi data untuk regresi logistik
set.seed(42)
n <- 1000 # jumlah data
X <- rnorm(n) # variabel independen
beta <- 1.5 # koefisien parameter
p <- 1 / (1 + exp(-(beta * X))) # probabilitas kejadian
y <- rbinom(n, 1, p) # data biner
# Estimasi parameter dengan regresi logistik menggunakan glm()
logit_model <- glm(y ~ X, family = binomial(link = "logit"))
# Menampilkan hasil estimasi parameter
summary(logit_model)
##
## Call:
## glm(formula = y ~ X, family = binomial(link = "logit"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.04405 0.07376 0.597 0.55
## X 1.37695 0.09840 13.994 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1386.3 on 999 degrees of freedom
## Residual deviance: 1090.7 on 998 degrees of freedom
## AIC: 1094.7
##
## Number of Fisher Scoring iterations: 4
Setelah estimasi parameter dilakukan, kita dapat memplot probabilitas prediksi untuk data baru.
# Probabilitas prediksi dari model
predicted_prob <- predict(logit_model, type = "response")
# Visualisasi probabilitas prediksi
plot(X, predicted_prob, type = "l", col = "blue", lwd = 2, main = "Probabilitas Prediksi", xlab = "X", ylab = "P(Y=1)")
Interpretasi
Model regresi Poisson digunakan untuk memodelkan variabel dependen yang berbentuk hitung atau count data, seperti jumlah kejadian dalam waktu tertentu atau jumlah kejadian dalam unit pengamatan. Model ini sangat berguna dalam analisis data frekuensi kejadian yang memiliki distribusi Poisson.
Model regresi Poisson berasumsi bahwa variabel dependen mengikuti distribusi Poisson dengan parameter \(\lambda\), yang merupakan rata-rata kejadian dalam suatu unit waktu atau ruang.
Fungsi Probabilitas Distribusi Poisson dalam Format Exponential Family
Distribusi Poisson adalah anggota dari keluarga distribusi eksponensial. Fungsi distribusi Poisson adalah:
\[ P(Y = y) = \frac{\lambda^y e^{-\lambda}}{y!}, \quad y = 0, 1, 2, \dots \]
Di mana: - \(\lambda\) adalah parameter rata-rata atau tingkat kejadian yang diharapkan, - \(y\) adalah jumlah kejadian yang diamati.
Dalam konteks exponential family, fungsi distribusi Poisson dapat ditulis sebagai:
\[ f(y;\theta,\phi) = \exp\left( \frac{y\theta - b(\theta)}{\phi} + c(y,\phi) \right) \]
Dengan \(\theta = \log(\lambda)\), yang menghubungkan rata-rata kejadian dengan parameter model.
Fungsi Link dalam Model Regresi Poisson
Model regresi Poisson menggunakan fungsi log link, yang menghubungkan rata-rata kejadian \(\lambda\) dengan kombinasi linier dari variabel prediktor \(X\):
\[ \log(\lambda) = X\beta \]
Di sini, \(X\beta\) adalah kombinasi linier dari variabel prediktor dan koefisien parameter \(\beta\), yang diestimasi menggunakan teknik Maximum Likelihood Estimation (MLE).
Estimasi Parameter dengan MLE (Maximum Likelihood Estimation)
Dalam model regresi Poisson, kita menggunakan Maximum Likelihood Estimation (MLE) untuk memperkirakan parameter \(\beta\). Fungsi likelihood untuk model Poisson adalah:
\[ L(\beta) = \prod_{i=1}^n \frac{\lambda_i^{y_i} e^{-\lambda_i}}{y_i!} \]
Log-likelihood untuk model Poisson adalah:
\[ \log(L(\beta)) = \sum_{i=1}^n \left( y_i \log(\lambda_i) - \lambda_i - \log(y_i!) \right) \]
Di mana:
Simulasi dan Estimasi Regresi Poisson di R
# Simulasi data untuk regresi Poisson
set.seed(42)
n <- 1000 # jumlah data
X <- rnorm(n) # variabel independen
lambda <- exp(0.5 * X) # rata-rata kejadian (lambda)
y <- rpois(n, lambda) # data Poisson
# Estimasi model regresi Poisson menggunakan glm()
poisson_model <- glm(y ~ X, family = poisson(link = "log"))
# Menampilkan hasil estimasi parameter
summary(poisson_model)
##
## Call:
## glm(formula = y ~ X, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.01314 0.03282 0.40 0.689
## X 0.49373 0.02937 16.81 <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: 1369.2 on 999 degrees of freedom
## Residual deviance: 1089.7 on 998 degrees of freedom
## AIC: 2616.1
##
## Number of Fisher Scoring iterations: 5
Setelah estimasi parameter dilakukan, kita dapat memplot probabilitas prediksi atau nilai rata-rata kejadian yang diprediksi berdasarkan model.
# Prediksi hasil dari model regresi Poisson
predicted_lambda <- predict(poisson_model, type = "response")
# Visualisasi hasil prediksi
plot(X, predicted_lambda, type = "l", col = "blue", lwd = 2, main = "Hasil Prediksi Regresi Poisson", xlab = "X", ylab = "Prediksi Lambda (Rata-rata Kejadian)")
points(X, predicted_lambda, col = ifelse(y == 1, "red", "green"), pch = 19) # Titik data biner
Setelah model diestimasi, kita harus memeriksa beberapa diagnostik untuk
memastikan bahwa model regresi Poisson sesuai dengan data. Salah satu
hal yang perlu diperiksa adalah overdispersion.
Overdispersion terjadi ketika varians data lebih besar daripada mean, yang berarti bahwa model Poisson tidak cukup fleksibel untuk menangani data tersebut. Untuk menguji overdispersion, kita dapat membandingkan nilai deviance dan derajat kebebasan dari model.
# Menghitung deviance dan derajat kebebasan
deviance_value <- deviance(poisson_model)
df_residual_value <- df.residual(poisson_model)
# Menampilkan hasil deviance dan derajat kebebasan
deviance_value
## [1] 1089.726
df_residual_value
## [1] 998
# Uji overdispersion
overdispersion <- deviance_value / df_residual_value
overdispersion
## [1] 1.091909
Nilai overdispersi lebih besar ari 1, tapi masih mendekati 1, ini berarti bahwa model Poisson cukup baik, tetapi ada sedikit deviasi dari asumsi dasar.
Model Generalized Linear Models (GLM) adalah perluasan dari model regresi klasik yang memungkinkan kita untuk menangani berbagai jenis data dan distribusi, seperti data biner (regresi logistik), data count (regresi Poisson), dan data kontinu yang tidak mengikuti distribusi normal.
Pada GLM, kita menghubungkan variabel dependen dengan variabel independen melalui fungsi link dan mengasumsikan bahwa data mengikuti salah satu dari distribusi keluarga eksponensial. Pada bab ini, kita akan fokus pada dua aspek penting dari inferensi GLM: ekspektasi dan varians dari model GLM.
Ekspektasi dalam GLM Ekspektasi (atau mean) dari variabel dependen dalam model GLM dapat dihitung dengan menggunakan fungsi link dan parameter distribusi. Secara umum, untuk model GLM, ekspektasi \(\mu\) dari variabel dependen \(Y\) dapat dituliskan sebagai:
\[ \mu = E(Y) = g^{-1}(X\beta) \]
Di mana:
Varians dalam GLM
Varians dari variabel dependen dalam model GLM juga tergantung pada jenis distribusi yang digunakan. Dalam GLM, kita mengasumsikan bahwa varians dari \(Y\) memiliki bentuk yang tergantung pada rata-rata \(\mu\). Varians untuk model GLM dapat ditulis sebagai:
\[ \text{Var}(Y) = \phi \cdot \text{Var}(Y_i) = \phi \cdot \left( \frac{\partial g^{-1}(X\beta)}{\partial (X\beta)} \right)^2 \]
Di mana:
Beberapa contoh distribusi dalam keluarga eksponensial dan variansnya adalah: - Distribusi Poisson: Varians sama dengan rata-rata \(\mu\), yaitu \(\text{Var}(Y) = \mu\). - Distribusi Binomial: Varians adalah \(\mu(1-\mu)\), di mana \(\mu\) adalah probabilitas keberhasilan dalam percobaan. - Distribusi Gamma: Variansnya adalah \(\alpha \mu^2\), di mana \(\alpha\) adalah parameter bentuk distribusi Gamma.
Contoh Perhitungan Ekspektasi dan Varians dalam GLM
Untuk model regresi logistik (sebuah jenis GLM dengan distribusi binomial), ekspektasi dan variansnya dihitung sebagai berikut:
\[ \mu = \frac{1}{1 + \exp(-X\beta)} \]
Visualisasi Ekspektasi dan Varians
Setelah kita mengetahui rumus ekspektasi dan varians dalam GLM, kita bisa mensimulasikan data dan memvisualisasikan ekspektasi serta varians dari model GLM.
# Simulasi data untuk regresi logistik
set.seed(42)
n <- 1000 # jumlah data
X <- rnorm(n) # variabel independen
beta <- 1.5 # koefisien parameter
mu <- 1 / (1 + exp(-(beta * X))) # ekspektasi (probabilitas)
y <- rbinom(n, 1, mu) # data biner (0 atau 1)
# Visualisasi ekspektasi dan varians
plot(X, mu, type = "l", col = "blue", lwd = 2, main = "Ekspektasi Probabilitas Kejadian", xlab = "X", ylab = "P(Y=1)")
points(X, mu, col = ifelse(y == 1, "red", "green"), pch = 19) # Titik data biner
Maximum Likelihood Estimation (MLE) adalah metode yang digunakan untuk memperkirakan parameter dari model statistika. Dalam konteks Generalized Linear Models (GLM), MLE berusaha untuk menemukan nilai parameter yang memaksimalkan likelihood data yang diamati.
Fungsi likelihood untuk model GLM ditulis sebagai produk dari fungsi distribusi f(y_i; θ, φ) untuk setiap pengamatan \(i\), di mana \(θ\) adalah parameter yang ingin diperkirakan.
Fungsi Likelihood dalam GLM
Secara umum, fungsi likelihood dalam GLM untuk data \(Y = y_1, y_2, ..., y_n\) adalah:
\[ L(\theta) = \prod_{i=1}^n f(y_i; \theta) \]
Log-likelihood (untuk memudahkan optimisasi) adalah:
\[ \log L(\theta) = \sum_{i=1}^n \log f(y_i; \theta) \]
Untuk memaksimalkan log-likelihood dan menemukan nilai parameter \(\beta\), kita perlu menggunakan metode optimisasi numerik.
Newton-Raphson Newton-Raphson adalah metode optimisasi yang digunakan untuk mencari nilai parameter yang memaksimalkan fungsi log-likelihood. Metode ini menggunakan informasi dari turunan pertama (gradient) dan turunan kedua (hessian) untuk memperbarui nilai parameter pada setiap iterasi.
Formula untuk pembaruan parameter menggunakan Newton-Raphson adalah:
\[ \beta^{(new)} = \beta^{(old)} - \left[ H(\beta^{(old)}) \right]^{-1} \nabla L(\beta^{(old)}) \]
Di mana:
Fisher Scoring
Fisher Scoring adalah variasi dari metode Newton-Raphson, yang menggantikan hessian dengan informasi Fisher, yaitu ekspektasi dari turunan kedua dari log-likelihood. Formula Fisher Scoring adalah:
\[ \beta^{(new)} = \beta^{(old)} - \left[ I(\beta^{(old)}) \right]^{-1} \nabla L(\beta^{(old)}) \]
Di mana:
IRLS adalah teknik lain untuk memperkirakan parameter model GLM. Metode ini menggunakan iterasi yang menggabungkan least squares dengan pembobotan yang diperbarui pada setiap iterasi.
Pada dasarnya, IRLS memecahkan sistem persamaan linear yang diperbarui di setiap langkah iterasi dengan pembobotan berdasarkan probabilitas yang diprediksi.
Setelah membangun model Generalized Linear Models (GLM), penting untuk melakukan diagnostik model untuk memastikan bahwa model yang telah dibangun sesuai dengan data yang dianalisis. Beberapa teknik diagnostik yang umum digunakan adalah statistik deviance, Chi-Square Pearson, dan analisis residual.
Deviance adalah ukuran ketidaksesuaian model terhadap data yang diamati. Dalam GLM, deviance diukur dengan membandingkan log-likelihood dari model yang telah dibangun dengan log-likelihood dari model saturasi (model yang memiliki parameter sebanyak jumlah data dan memberikan kecocokan sempurna).
Secara matematis, deviance untuk model GLM dapat dihitung sebagai:
\[ D = -2 \left[ \log L(\text{model penuh}) - \log L(\text{model saturasi}) \right] \]
Di mana:
Deviance lebih rendah menunjukkan bahwa model lebih baik cocok dengan data.
Chi-Square Pearson adalah statistik yang digunakan untuk mengukur seberapa baik model GLM cocok dengan data, terutama untuk model Poisson dan Binomial.
Untuk tabel kontingensi, Chi-Square Pearson dihitung sebagai:
\[ \chi^2 = \sum \frac{(O_i - E_i)^2}{E_i} \]
Di mana:
Nilai Chi-Square Pearson yang tinggi menunjukkan bahwa model mungkin tidak cukup cocok dengan data, sementara nilai yang rendah menunjukkan bahwa model cocok dengan data.
Analisis residual digunakan untuk menilai sejauh mana model Generalized Linear Models (GLM) cocok dengan data. Residuals adalah perbedaan antara nilai yang diamati dan nilai yang diprediksi oleh model.
Tipe residual yang sering digunakan dalam GLM adalah: 1. Raw Residual: Selisih langsung antara nilai yang diamati dan nilai prediksi. 2. Deviance Residual: Residual yang dikalibrasi menggunakan deviance model. 3. Pearson Residual: Residual yang dibagi dengan akar dari nilai yang diharapkan.
Residual Formula
Menggunakan Residual untuk Diagnostik
Residual dapat digunakan untuk mendiagnosis kesalahan model, seperti outlier dan pengaruh titik data yang ekstrem. Jika residual menunjukkan pola sistematis, ini mungkin menunjukkan bahwa model tidak cukup baik dalam menangkap hubungan antara variabel.
Maximum Likelihood Estimation (MLE) adalah metode yang paling umum digunakan untuk memperkirakan parameter dalam regresi logistik. MLE mencari parameter yang memaksimalkan log-likelihood dari model terhadap data yang diamati.
Model regresi logistik menghubungkan probabilitas kejadian (Y = 1) dengan variabel independen X melalui fungsi sigmoid. Fungsi link yang digunakan adalah logit, yang menghubungkan log odds dengan kombinasi linier dari prediktor \(X\).
Fungsi Model Logistik
Model regresi logistik digunakan untuk memodelkan probabilitas kejadian sebagai fungsi logit dari variabel independen \(X\). Fungsi logit untuk regresi logistik adalah sebagai berikut:
\[ \log\left(\frac{\mu}{1 - \mu}\right) = X\beta \]
Di mana:
Fungsi sigmoid yang mengubah log odds menjadi probabilitas adalah:
\[ \mu = \frac{1}{1 + \exp(-(X\beta))} \]
Log-Likelihood untuk Regresi Logistik
Log-likelihood untuk model regresi logistik dihitung sebagai:
\[ \log L(\beta) = \sum_{i=1}^n \left( y_i \log(\mu_i) + (1 - y_i) \log(1 - \mu_i) \right) \]
Di mana: - \(y_i\) adalah nilai yang diamati (0 atau 1), - \(\mu_i\) adalah probabilitas kejadian yang diprediksi untuk observasi \(i\).
Newton-Raphson adalah metode optimisasi yang digunakan untuk memperkirakan parameter \(\beta\) dengan memaksimalkan log-likelihood. Prosesnya melibatkan perhitungan gradien (turunan pertama) dan hessian (turunan kedua) dari log-likelihood.
Langkah-langkah Newton-Raphson
Setelah parameter model regresi logistik diestimasi menggunakan MLE, kita perlu melakukan inferensi untuk menilai signifikansi parameter. Dua uji yang umum digunakan untuk menguji signifikansi parameter dalam regresi logistik adalah:
Uji Wald menguji apakah koefisien \(\beta\) berbeda signifikan dari nol. Statistik uji Wald dihitung sebagai:
\[ W = \frac{\hat{\beta}^2}{\text{Var}(\hat{\beta})} \]
Di mana: - \(\hat{\beta}\) adalah estimasi koefisien parameter, - \(\text{Var}(\hat{\beta})\) adalah varians dari estimasi koefisien parameter.
Jika \(W\) lebih besar dari nilai kritis distribusi chi-square, kita menolak hipotesis nol dan menyimpulkan bahwa parameter signifikan.
Uji Likelihood Ratio menguji apakah model regresi logistik yang lebih kompleks memberikan peningkatan yang signifikan dalam penjelasan data dibandingkan dengan model yang lebih sederhana (misalnya, model dengan hanya intercept). Statistik uji Likelihood Ratio dihitung sebagai:
\[ G^2 = -2 \left[ \log L(\text{model null}) - \log L(\text{model penuh}) \right] \]
Di mana:
Jika nilai statistik Chi-Square lebih besar dari nilai kritis pada derajat kebebasan tertentu, kita menolak hipotesis nol.
Untuk menilai kebaikan model dalam regresi logistik, kita sering menggunakan dua kriteria informasi: AIC dan BIC.
Akaike Information Criterion (AIC)
AIC digunakan untuk membandingkan model yang berbeda dan memilih model terbaik dengan mengurangi likelihood dan penalti terhadap jumlah parameter. AIC dihitung sebagai:
\[ AIC = -2 \log L + 2k \]
Di mana:
Model dengan AIC yang lebih rendah dianggap lebih baik.
Bayesian Information Criterion (BIC)
BIC juga digunakan untuk membandingkan model yang berbeda, tetapi BIC memberikan penalti yang lebih besar untuk model yang lebih kompleks dibandingkan dengan AIC. BIC dihitung sebagai:
\[ BIC = -2 \log L + k \log n \]
Di mana: - \(n\) adalah jumlah pengamatan dalam data.
Seperti AIC, model dengan BIC yang lebih rendah dianggap lebih baik.
Implementasi Estimasi dan Inferensi Regresi Logistik di R
# Simulasi data untuk regresi logistik
set.seed(42)
n <- 1000 # jumlah data
X <- rnorm(n) # variabel independen
beta_true <- 1.5 # koefisien parameter
mu <- 1 / (1 + exp(-(beta_true * X))) # ekspektasi (probabilitas)
y <- rbinom(n, 1, mu) # data biner (0 atau 1)
# Estimasi model regresi logistik menggunakan glm()
logit_model <- glm(y ~ X, family = binomial(link = "logit"))
# Menampilkan hasil estimasi parameter
summary(logit_model)
##
## Call:
## glm(formula = y ~ X, family = binomial(link = "logit"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.04405 0.07376 0.597 0.55
## X 1.37695 0.09840 13.994 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1386.3 on 999 degrees of freedom
## Residual deviance: 1090.7 on 998 degrees of freedom
## AIC: 1094.7
##
## Number of Fisher Scoring iterations: 4
# Menghitung AIC dan BIC
AIC(logit_model)
## [1] 1094.711
BIC(logit_model)
## [1] 1104.526
Distribusi Poisson digunakan untuk memodelkan count data atau jumlah kejadian yang terjadi dalam unit waktu atau ruang tertentu. Fungsi distribusi Poisson untuk variabel acak \(Y\) adalah:
\[ P(Y = y) = \frac{\lambda^y e^{-\lambda}}{y!}, \quad y = 0, 1, 2, \dots \]
Di mana:
Model Regresi Poisson mengasumsikan bahwa data Y mengikuti distribusi Poisson dengan parameter \(\lambda\) yang diprediksi oleh fungsi log link sebagai berikut:
\[ \log(\lambda) = X\beta \]
Di mana:
Maximum Likelihood Estimation (MLE) adalah metode yang digunakan untuk mengestimasi parameter dalam model regresi Poisson. Untuk memaksimalkan log-likelihood dan mendapatkan parameter \(\beta\), kita menggunakan algoritma optimasi.
Selain itu, kita juga bisa menggunakan Iteratively Reweighted Least Squares (IRLS) untuk estimasi parameter dalam regresi Poisson. IRLS merupakan teknik yang menggabungkan least squares dengan pembobotan yang diperbarui setiap iterasi.
# Simulasi data untuk regresi Poisson
set.seed(42)
n <- 1000 # jumlah data
X <- rnorm(n) # variabel independen
lambda <- exp(0.5 * X) # rata-rata kejadian (lambda)
y <- rpois(n, lambda) # data Poisson
# Estimasi model regresi Poisson menggunakan glm()
poisson_model <- glm(y ~ X, family = poisson(link = "log"))
# Menampilkan hasil estimasi parameter
summary(poisson_model)
##
## Call:
## glm(formula = y ~ X, family = poisson(link = "log"))
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.01314 0.03282 0.40 0.689
## X 0.49373 0.02937 16.81 <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: 1369.2 on 999 degrees of freedom
## Residual deviance: 1089.7 on 998 degrees of freedom
## AIC: 2616.1
##
## Number of Fisher Scoring iterations: 5
Uji Wald Uji Wald digunakan untuk menguji signifikansi parameter regresi, yang tersedia dalam output summary(poisson_model). Kita dapat menggunakan z-value dan p-value untuk menentukan signifikansi.
# Uji Wald (p-value untuk parameter)
wald_test <- summary(poisson_model)$coefficients[, 4]
wald_test
## (Intercept) X
## 6.888981e-01 2.082488e-63
Interpretasi p-value < 0.05, maka tolak hipotesis nol bahwa koefisien parameter sama dengan nol, yang berarti parameter signifikan.
Uji Likelihood Ratio Uji Likelihood Ratio membandingkan model yang lebih kompleks dengan model yang lebih sederhana. Nilai log-likelihood dari model penuh dan model null digunakan untuk menghitung statistik uji.
# Uji Likelihood Ratio
log_likelihood_full <- logLik(poisson_model) # Log-likelihood model penuh
poisson_model_null <- glm(y ~ 1, family = poisson(link = "log")) # Model null (hanya intercept)
log_likelihood_null <- logLik(poisson_model_null) # Log-likelihood model null
# Statistik uji Likelihood Ratio (G^2)
LR_stat <- -2 * (log_likelihood_null - log_likelihood_full)
p_value_LR <- 1 - pchisq(LR_stat, df = 1) # derajat kebebasan 1 karena satu parameter ditambahkan
LR_stat
## 'log Lik.' 279.4387 (df=1)
p_value_LR
## 'log Lik.' 0 (df=1)
Interpretasi p-value < 0.05, tolak hipotesis nol bahwa model null (model dengan hanya intercept) sama baiknya dengan model penuh (dengan prediktor)
# Menghitung AIC dan BIC
AIC_value <- AIC(poisson_model)
BIC_value <- BIC(poisson_model)
AIC_value
## [1] 2616.093
BIC_value
## [1] 2625.909
didapatkan nilai AIC = 2616.093 dan BIC = 2625.909
Sikap terhadap peran wanita dalam masyarakat telah lama menjadi isu yang menarik perhatian banyak kalangan, terutama dalam konteks peran tradisional yang masih menganggap wanita hanya sebatas di ranah domestik. Pandangan ini banyak dipengaruhi oleh norma sosial, budaya, dan pendidikan. Salah satu pandangan yang masih berkembang di masyarakat adalah anggapan bahwa wanita sebaiknya menjaga rumah tangga dan mendampingi suami selamanya, alih-alih memiliki karier atau mengembangkan potensi diri di luar rumah.
Masa pendidikan seseorang dapat mempengaruhi pandangannya terhadap berbagai isu sosial, termasuk peran gender. Pendidikan yang lebih tinggi seringkali dikaitkan dengan pemahaman yang lebih luas terhadap kesetaraan gender dan hak-hak individu, sehingga diharapkan dapat mengubah sikap tradisional terhadap peran wanita. Namun, di sisi lain, pandangan ini mungkin berbeda berdasarkan jenis kelamin, yang dapat menjadi faktor pembeda dalam cara seseorang menginterpretasikan peran wanita dalam masyarakat.
Pusat Penelitian Pendapat Nasional (National Opinion Research Center) melakukan survei sosial pada tahun 1975 untuk mengkaji hubungan antara jenis kelamin, tingkat pendidikan, dan sikap terhadap peran wanita. Data yang diperoleh dari survei ini digunakan untuk mengeksplorasi apakah tingkat pendidikan memengaruhi sikap terhadap peran wanita, serta bagaimana jenis kelamin dapat memoderasi hubungan ini. Oleh karena itu, penting untuk memahami apakah pendidikan menjadi faktor yang signifikan dalam membentuk pandangan seseorang terhadap peran wanita dalam rumah tangga, dengan memperhatikan peran jenis kelamin sebagai faktor kontrol.
Data yang digunakan diperoleh dari artikel Maryana pada tahun 2023 yang didapat dari Pusat Penelitian Pendapat Nasional (National Opinion Research Center). Survey social umum 1975 dilakukan untuk melihat perbandingan dari jenis kelamin dan tingkat pendidikan responden dalam menentukan sikap terhadap peran wanita. Pernyataan yang diajukan “Wanita sebaiknya menjaga atau memelihara rumah mereka dan ikut suami selamanya”. Variabel-variabel dalam data yang digunakan yaitu:
Berikut adalah data yang digunakan.
# Library yang diperlukan
library(knitr)
## Warning: package 'knitr' was built under R version 4.4.3
# Membuat data frame dengan jumlah baris yang benar
data <- data.frame(
JenisKelamin = rep(c("Pria", "Wanita"), each = 3), # Replikasi untuk jenis kelamin
MasaPendidikan = rep(c("<= 8", "9-12", ">= 13"), 2), # Replikasi untuk masa pendidikan
Setuju = c(72, 110, 44, 158, 173, 28), # Jumlah yang setuju
TidakSetuju = c(47, 196, 179, 85, 283, 187) # Jumlah yang tidak setuju
)
# Tampilkan data frame
kable(data, caption = "Tabel Sikap terhadap Peran Wanita Berdasarkan Jenis Kelamin dan Pendidikan")
JenisKelamin | MasaPendidikan | Setuju | TidakSetuju |
---|---|---|---|
Pria | <= 8 | 72 | 47 |
Pria | 9-12 | 110 | 196 |
Pria | >= 13 | 44 | 179 |
Wanita | <= 8 | 158 | 85 |
Wanita | 9-12 | 173 | 283 |
Wanita | >= 13 | 28 | 187 |
Data tersebut digunakan untuk mencari tahu apakah benar semakin sebentar masa pendidikan, maka semakin banyak pula orang yang setuju dengan peran tradisional perempuan dengan jenis kelamin sebagai kontrolnya.
data_pria <- subset(data, JenisKelamin == "Pria")[, -1]
kable(data_pria, caption = "Tabel Parsial (Pria)")
MasaPendidikan | Setuju | TidakSetuju |
---|---|---|
<= 8 | 72 | 47 |
9-12 | 110 | 196 |
>= 13 | 44 | 179 |
Ukuran Asosiasi
# Fungsi untuk menghitung RD, RR, dan OR
compute_measures <- function(df, jenis_kelamin) {
# Ekstrak nilai dari tabel kontingensi
a1 <- df$Setuju[1] # Pendidikan ≤ 8, Setuju
b1 <- df$TidakSetuju[1] # Pendidikan ≤ 8, Tidak Setuju
a2 <- df$Setuju[2] # Pendidikan 9-12, Setuju
b2 <- df$TidakSetuju[2] # Pendidikan 9-12, Tidak Setuju
a3 <- df$Setuju[3] # Pendidikan ≥ 13, Setuju
b3 <- df$TidakSetuju[3] # Pendidikan ≥ 13, Tidak Setuju
# Hitung Risk Difference (RD)
P1 <- a1 / (a1 + b1) # Risiko pada pendidikan ≤ 8
P2 <- a2 / (a2 + b2) # Risiko pada pendidikan 9-12
P3 <- a3 / (a3 + b3) # Risiko pada pendidikan ≥ 13
RD1_2 <- P1 - P2 # RD antara pendidikan ≤ 8 dan 9-12
RD2_3 <- P2 - P3 # RD antara pendidikan 9-12 dan ≥ 13
RD1_3 <- P1 - P3 # RD antara pendidikan ≤ 8 dan ≥ 13
# Hitung Risk Ratio (RR)
RR1_2 <- P1 / P2 # RR antara pendidikan ≤ 8 dan 9-12
RR2_3 <- P2 / P3 # RR antara pendidikan 9-12 dan ≥ 13
RR1_3 <- P1 / P3 # RR antara pendidikan ≤ 8 dan ≥ 13
# Hitung Odds Ratio (OR)
OR1_2 <- (a1 * b2) / (b1 * a2) # OR antara pendidikan ≤ 8 dan 9-12
OR2_3 <- (a2 * b3) / (b2 * a3) # OR antara pendidikan 9-12 dan ≥ 13
OR1_3 <- (a1 * b3) / (b1 * a3) # OR antara pendidikan ≤ 8 dan ≥ 13
# Buat tabel hasil untuk kelompok jenis kelamin tertentu
result <- data.frame(
JenisKelamin = jenis_kelamin,
Risk_Difference_1_2 = round(RD1_2, 3),
Risk_Difference_2_3 = round(RD2_3, 3),
Risk_Difference_1_3 = round(RD1_3, 3),
Risk_Ratio_1_2 = round(RR1_2, 3),
Risk_Ratio_2_3 = round(RR2_3, 3),
Risk_Ratio_1_3 = round(RR1_3, 3),
Odds_Ratio_1_2 = round(OR1_2, 3),
Odds_Ratio_2_3 = round(OR2_3, 3),
Odds_Ratio_1_3 = round(OR1_3, 3) # Tambahkan OR1_3
)
return(result)
}
# Hitung asosiasi untuk kelompok jenis kelamin
measures_pria <- compute_measures(data_pria, "Pria")
# Tampilkan hasil perhitungan untuk masing-masing kelompok jenis kelamin
kable(measures_pria, caption = "Risk Difference, Risk Ratio, dan Odds Ratio per Kelompok Jenis Kelamin (Pria)")
JenisKelamin | Risk_Difference_1_2 | Risk_Difference_2_3 | Risk_Difference_1_3 | Risk_Ratio_1_2 | Risk_Ratio_2_3 | Risk_Ratio_1_3 | Odds_Ratio_1_2 | Odds_Ratio_2_3 | Odds_Ratio_1_3 |
---|---|---|---|---|---|---|---|---|---|
Pria | 0.246 | 0.162 | 0.408 | 1.683 | 1.822 | 3.066 | 2.73 | 2.283 | 6.232 |
<= 8 VS 9-12
9-12 VS >= 13
<=8 VS >= 13
data_wanita <- subset(data, JenisKelamin == "Wanita")[, -1]
kable(data_wanita, caption = "Tabel Parsial (Wanita)")
MasaPendidikan | Setuju | TidakSetuju | |
---|---|---|---|
4 | <= 8 | 158 | 85 |
5 | 9-12 | 173 | 283 |
6 | >= 13 | 28 | 187 |
Ukuran Asosiasi
# Hitung asosiasi untuk kelompok jenis kelamin
measures_wanita <- compute_measures(data_wanita, "Wanita")
# Tampilkan hasil perhitungan untuk masing-masing kelompok jenis kelamin
kable(measures_wanita, caption = "Risk Difference, Risk Ratio, dan Odds Ratio per Kelompok Jenis Kelamin (Wanita)")
JenisKelamin | Risk_Difference_1_2 | Risk_Difference_2_3 | Risk_Difference_1_3 | Risk_Ratio_1_2 | Risk_Ratio_2_3 | Risk_Ratio_1_3 | Odds_Ratio_1_2 | Odds_Ratio_2_3 | Odds_Ratio_1_3 |
---|---|---|---|---|---|---|---|---|---|
Wanita | 0.271 | 0.249 | 0.52 | 1.714 | 2.913 | 4.993 | 3.041 | 4.083 | 12.414 |
<= 8 VS 9-12
9-12 VS >= 13
<=8 VS >= 13
# Membuat tabel marjinal dengan menjumlahkan semua kelompok masa pendidikan
data_marjinal <- aggregate(cbind(Setuju, TidakSetuju) ~ MasaPendidikan, data = data, sum)
# Menampilkan tabel marjinal
kable(data_marjinal, caption = "Tabel Marjinal (Masa Pendidikan)")
MasaPendidikan | Setuju | TidakSetuju |
---|---|---|
<= 8 | 230 | 132 |
>= 13 | 72 | 366 |
9-12 | 283 | 479 |
Ukuran Asosiasi
# Fungsi untuk menghitung RD, RR, dan OR berdasarkan tabel marjinal
compute_association_measures <- function(df) {
# Ekstrak nilai dari tabel kontingensi
a1 <- df$Setuju[1] # Pendidikan ≤ 8, Setuju
b1 <- df$TidakSetuju[1] # Pendidikan ≤ 8, Tidak Setuju
a2 <- df$Setuju[2] # Pendidikan 9-12, Setuju
b2 <- df$TidakSetuju[2] # Pendidikan 9-12, Tidak Setuju
a3 <- df$Setuju[3] # Pendidikan ≥ 13, Setuju
b3 <- df$TidakSetuju[3] # Pendidikan ≥ 13, Tidak Setuju
# Hitung Risk Difference (RD)
P1 <- a1 / (a1 + b1) # Risiko pada pendidikan ≤ 8
P2 <- a2 / (a2 + b2) # Risiko pada pendidikan 9-12
P3 <- a3 / (a3 + b3) # Risiko pada pendidikan ≥ 13
RD1_2 <- P1 - P2 # RD antara pendidikan ≤ 8 dan 9-12
RD2_3 <- P2 - P3 # RD antara pendidikan 9-12 dan ≥ 13
RD1_3 <- P1 - P3 # RD antara pendidikan ≤ 8 dan ≥ 13
# Hitung Risk Ratio (RR)
RR1_2 <- P1 / P2 # RR antara pendidikan ≤ 8 dan 9-12
RR2_3 <- P2 / P3 # RR antara pendidikan 9-12 dan ≥ 13
RR1_3 <- P1 / P3 # RR antara pendidikan ≤ 8 dan ≥ 13
# Hitung Odds Ratio (OR)
OR1_2 <- (a1 * b2) / (b1 * a2) # OR antara pendidikan ≤ 8 dan 9-12
OR2_3 <- (a2 * b3) / (b2 * a3) # OR antara pendidikan 9-12 dan ≥ 13
OR1_3 <- (a1 * b3) / (b1 * a3) # OR antara pendidikan ≤ 8 dan ≥ 13
# Buat tabel hasil untuk ukuran asosiasi
result <- data.frame(
Risk_Difference_1_2 = round(RD1_2, 3),
Risk_Difference_2_3 = round(RD2_3, 3),
Risk_Difference_1_3 = round(RD1_3, 3),
Risk_Ratio_1_2 = round(RR1_2, 3),
Risk_Ratio_2_3 = round(RR2_3, 3),
Risk_Ratio_1_3 = round(RR1_3, 3),
Odds_Ratio_1_2 = round(OR1_2, 3),
Odds_Ratio_2_3 = round(OR2_3, 3),
Odds_Ratio_1_3 = round(OR1_3, 3)
)
return(result)
}
# Hitung asosiasi untuk tabel marjinal
measures_marginal_association <- compute_association_measures(data_marjinal)
# Tampilkan hasil perhitungan ukuran asosiasi
kable(measures_marginal_association, caption = "Ukuran Asosiasi (RD, RR, dan OR) Berdasarkan Masa Pendidikan")
Risk_Difference_1_2 | Risk_Difference_2_3 | Risk_Difference_1_3 | Risk_Ratio_1_2 | Risk_Ratio_2_3 | Risk_Ratio_1_3 | Odds_Ratio_1_2 | Odds_Ratio_2_3 | Odds_Ratio_1_3 |
---|---|---|---|---|---|---|---|---|
0.471 | -0.207 | 0.264 | 3.865 | 0.443 | 1.711 | 8.857 | 0.333 | 2.949 |
<= 8 VS 9-12
9-12 VS >= 13
<=8 VS >= 13
Kesimpulan Asosiasi bersyarat dan asosiasi marginal memberikan hasil kesimpulan yang berbeda. Hal ini berarti bahwa Jenis Kelamin merupakan confounder yang berpengaruh signifikan dalam hubungan antara masa pendidikan dan sikap terhadao peran tradisional wanita. Dari hasil asosiasi juga didapatkan bahwa dengan mengontrol jenis kelamin, semakin rendah masa pendidikan seseorang, maka semakin besar peluang orang tersebut akan memiliki sikap setuju terhadap peran tradisional wanita.
Hipotesis
Hipotesis Nol (H₀): Tidak ada hubungan antara Masa Pendidikan dan Sikap terhadap peran wanita, setelah mengendalikan Jenis Kelamin sebagai variabel confounder.
Hipotesis Alternatif (H₁): Ada hubungan antara Masa Pendidikan dan Sikap terhadap peran wanita, setelah mengendalikan Jenis Kelamin sebagai variabel confounder.
Uji Cochran-Mantel-Haenszel
# Membuat tabel kontingensi tiga arah berdasarkan Jenis Kelamin dan Masa Pendidikan
# Data setuju dan tidak setuju untuk setiap kelompok Jenis Kelamin
# Data Marjinal untuk Jenis Kelamin dan Masa Pendidikan
data_contingency <- array(c(
72, 47, 110, 196, 44, 179, # Pria (Setuju, Tidak Setuju)
158, 85, 173, 283, 28, 187 # Wanita (Setuju, Tidak Setuju)
), dim = c(2, 3, 2))
data_contingency
## , , 1
##
## [,1] [,2] [,3]
## [1,] 72 110 44
## [2,] 47 196 179
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 158 173 28
## [2,] 85 283 187
# Tabel Kontingensi: Baris 1 = Jenis Kelamin Pria, Baris 2 = Jenis Kelamin Wanita
# Kolom 1: Setuju, Kolom 2: Tidak Setuju, Kolom 3: Masa Pendidikan (≤ 8, 9-12, ≥ 13)
# Uji Cochran-Mantel-Haenszel
cmh_test <- mantelhaen.test(data_contingency)
# Tampilkan hasil uji
cmh_test
##
## Cochran-Mantel-Haenszel test
##
## data: data_contingency
## Cochran-Mantel-Haenszel M^2 = 184.65, df = 2, p-value < 2.2e-16
Interpretasi Didapatkan p-value < alpha (0.05), maka tolak H0 dan disimpulkan bahwa ada hubungan yang signifikan antara Masa Pendidikan dan Sikap terhadap peran wanita, setelah mengendalikan Jenis Kelamin.
Regresi logistik adalah salah satu teknik statistik yang digunakan untuk memodelkan hubungan antara satu variabel respon biner dan satu atau lebih variabel prediktor. Dalam hal ini, prediktor dapat berupa variabel kategorik (nominal atau ordinal) maupun numerik (rasio).
Pada bagian ini, akan dibahas bagaimana menangani berbagai jenis variabel prediktor dalam regresi logistik:
Model regresi logistik biner secara umum dapat dituliskan dalam bentuk:
\[ \log \left( \frac{\pi(x)}{1 - \pi(x)} \right) = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_p x_p \]
dengan:
Misalkan, sebuah perusahaan layanan streaming musik ingin mengetahui faktor-faktor yang memengaruhi keputusan pelanggan untuk berlangganan paket premium atau tidak. Perusahaan ingin menganalisis apakah ada faktor-faktor tertentu yang memengaruhi apakah seorang pelanggan memilih untuk berlangganan paket premium (Yes = 1) atau hanya menggunakan paket gratis (No = 0).
Sebagai respons (dependen), perusahaan ingin mengetahui apakah pelanggan memilih paket premium atau paket gratis.
Variabel prediktor yang dipertimbangkan dalam analisis ini adalah:
Tujuan dari analisis ini adalah untuk mengetahui apakah status pekerjaan, frekuensi penggunaan aplikasi, dan pendapatan bulanan memengaruhi kemungkinan seorang pelanggan memilih untuk berlangganan paket premium.
Untuk keperluan analisis ini, akan dilakukan simulasi data. Misalnya, kita simulasi 500 responden dengan distribusi yang seimbang antara pekerja dan pelajar, dan menggunakan skala ordinal untuk frekuensi penggunaan aplikasi serta numerik untuk pendapatan bulanan.
# Set seed for reproducibility
set.seed(42)
# Simulasi data
n <- 500 # jumlah responden
# Variabel status pekerjaan (Nominal: Pekerja, Pelajar)
job_status <- sample(c("Pekerja", "Pelajar"), n, replace = TRUE)
# Variabel frekuensi penggunaan aplikasi (Ordinal: Jarang, Sedang, Sering)
usage_frequency <- sample(c("Jarang", "Sedang", "Sering"), n, replace = TRUE)
# Variabel pendapatan bulanan (Numerik: dalam ribuan IDR)
monthly_income <- sample(2000:10000, n, replace = TRUE)
# Variabel keputusan berlangganan (Nominal binari: 1 = Premium, 0 = Gratis)
subscription <- sample(c(0, 1), n, replace = TRUE)
# Menggabungkan semua variabel dalam satu data frame
data <- data.frame(
Job_Status = job_status,
Usage_Frequency = usage_frequency,
Monthly_Income = monthly_income,
Subscription = subscription
)
# Menampilkan beberapa data pertama
head(data)
## Job_Status Usage_Frequency Monthly_Income Subscription
## 1 Pekerja Sering 4336 0
## 2 Pekerja Jarang 3399 1
## 3 Pekerja Sedang 5838 0
## 4 Pekerja Sedang 7362 0
## 5 Pelajar Jarang 6785 0
## 6 Pelajar Sering 4697 0
Interpretasi: Dataset berisi 500 observasi dengan variabel status pekerjaan, frekuensi penggunaan, pendapatan bulanan, dan status berlangganan.
# Melihat frekuensi status berlangganan
table(data$Subscription)
##
## 0 1
## 277 223
Interpretasi: Dari 500 observasi, sebanyak 277 responden hanya menggunakan paket gratis, sedangkan 223 lainnya berlangganan paket premium.
# Memuat dplyr
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Menghitung rata-rata monthly income berdasarkan subscription (0 = Gratis, 1 = Premium)
data %>%
group_by(Subscription) %>%
summarise(Avg_Monthly_Income = mean(Monthly_Income))
## # A tibble: 2 × 2
## Subscription Avg_Monthly_Income
## <dbl> <dbl>
## 1 0 5737.
## 2 1 6169.
Interpretasi: Responden yang hanya menggunakan paket gratis memiliki rata-rata penghasilan bulanan yang lebih kecil dibandingkan responden yang berlangganan paket premium.
data_nominal <- data %>%
mutate(
usage_frequency = factor(usage_frequency, levels = c("Jarang", "Sedang", "Sering"))
)
model_nominal <- glm(subscription ~ job_status + usage_frequency + monthly_income, data = data_nominal, family = binomial)
summary(model_nominal)
##
## Call:
## glm(formula = subscription ~ job_status + usage_frequency + monthly_income,
## family = binomial, data = data_nominal)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -7.531e-01 2.957e-01 -2.546 0.0109 *
## job_statusPelajar 1.239e-01 1.811e-01 0.684 0.4938
## usage_frequencySedang -7.758e-03 2.233e-01 -0.035 0.9723
## usage_frequencySering 1.610e-02 2.215e-01 0.073 0.9420
## monthly_income 7.877e-05 3.842e-05 2.050 0.0403 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 687.30 on 499 degrees of freedom
## Residual deviance: 682.67 on 495 degrees of freedom
## AIC: 692.67
##
## Number of Fisher Scoring iterations: 4
Keterangan: Model menggunakan usage_frequency sebagai variabel dummy, baseline “Jarang”. Setiap koefisien membandingkan kategori terhadap baseline.
Interpretasi Koefisien
Intercept (-0.7531)
job_statusPelajar (0.1239)
usage_frequencySedang (-0.007758)
usage_frequencySering (0.0161)
monthly_income (0.00007877)
Interpretasi Goodness of Fit
Secara keseluruhan, model ini menunjukkan penurunan deviance yang baik dan AIC yang tidak terlalu tinggi, yang menunjukkan model ini memberikan kecocokan yang cukup baik dengan data.
Kesimpulan
data_numeric <- data %>%
mutate(
usage_frequency_numeric = case_when(
usage_frequency == "Jarang" ~ 1,
usage_frequency == "Sedang" ~ 2,
usage_frequency == "Sering" ~ 3,
)
)
model_numeric <- glm(subscription ~ job_status + usage_frequency_numeric + monthly_income, data = data_numeric, family = binomial)
summary(model_numeric)
##
## Call:
## glm(formula = subscription ~ job_status + usage_frequency_numeric +
## monthly_income, family = binomial, data = data_numeric)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -7.660e-01 3.490e-01 -2.195 0.0282 *
## job_statusPelajar 1.239e-01 1.811e-01 0.684 0.4938
## usage_frequency_numeric 8.210e-03 1.108e-01 0.074 0.9409
## monthly_income 7.866e-05 3.839e-05 2.049 0.0405 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 687.30 on 499 degrees of freedom
## Residual deviance: 682.68 on 496 degrees of freedom
## AIC: 690.68
##
## Number of Fisher Scoring iterations: 4
Keterangan: Model menggunakan usage_frequency sebagai angka bertingkat 1-3. Koefisien usage_frequency_numeric mengukur efek kenaikan satu tingkat frekuensi penggunaan terhadap peluang sukses.
Interpretasi Koefisien
Intercept (-0.7660)
job_statusPelajar (0.1239)
usage_frequency_numeric (0.008210)
monthly_income (0.00007866)
Interpretasi Goodness of Fit
Model ini menunjukkan penurunan deviance yang baik dan AIC yang tidak terlalu tinggi, yang menunjukkan model ini memberikan kecocokan yang cukup baik dengan data.
Kesimpulan Praktis
list(
AIC_Nominal = AIC(model_nominal),
AIC_Numeric = AIC(model_numeric)
)
## $AIC_Nominal
## [1] 692.6737
##
## $AIC_Numeric
## [1] 690.6804
Keterangan: Model dengan nilai AIC lebih kecil lebih disukai. Membandingkan mana yang lebih baik: usage frequency sebagai nominal atau numeric.
Interpretasi: Dari hasil AIC, dapat dilihat bahwa model numeric memiliki nilai AIC yang lebih kecil daripada model nominal. Oleh karena itu, model yang lebih cocok digunakan adalah model numeric.
Goodness of Fit Model
nullmod <- glm(subscription ~ 1, data = data, family = binomial)
r2_nominal <- 1- (logLik(model_nominal)/logLik(nullmod))
r2_numeric <- 1- (logLik(model_numeric)/logLik(nullmod))
list(
McFadden_R2_Nominal = r2_nominal,
McFadden_R2_Numeric = r2_numeric
)
## $McFadden_R2_Nominal
## 'log Lik.' 0.006736645 (df=5)
##
## $McFadden_R2_Numeric
## 'log Lik.' 0.006726781 (df=4)
Interpretasi: McFadden’s R² mengukur goodness-of-fit. Semakin besar nilainya, semakin baik model memprediksi dibandingkan model null. Dapat dilihat bahwa hasilnya tidak berbeda jauh antara model nominal dan numeric dengan hasil R² model nominal yang lebih besar.
Visualisasi Prediksi
sim_data_nominal <- data_nominal %>% mutate(predicted = predict(model_nominal, type = "response"))
sim_data_numeric <- data_numeric %>% mutate(predicted = predict(model_numeric, type = "response"))
# Plot untuk model nominal
library(ggplot2)
sim_data_nominal %>%
ggplot(aes(x = monthly_income, y =predicted, color = usage_frequency)) +
geom_point(alpha = 0.6) +
labs(title = "Prediksi Probabilitas (Ordinal sebagai Nominal)", x= "Monthly Income", y="Prediksi Probabilitas")
theme_minimal()
## List of 136
## $ line :List of 6
## ..$ colour : chr "black"
## ..$ linewidth : num 0.5
## ..$ linetype : num 1
## ..$ lineend : chr "butt"
## ..$ arrow : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ rect :List of 5
## ..$ fill : chr "white"
## ..$ colour : chr "black"
## ..$ linewidth : num 0.5
## ..$ linetype : num 1
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ text :List of 11
## ..$ family : chr ""
## ..$ face : chr "plain"
## ..$ colour : chr "black"
## ..$ size : num 11
## ..$ hjust : num 0.5
## ..$ vjust : num 0.5
## ..$ angle : num 0
## ..$ lineheight : num 0.9
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ title : NULL
## $ aspect.ratio : NULL
## $ axis.title : NULL
## $ axis.title.x :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 2.75points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.x.top :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 0
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 2.75points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.x.bottom : NULL
## $ axis.title.y :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : num 90
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.75points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.y.left : NULL
## $ axis.title.y.right :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : num -90
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 2.75points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : chr "grey30"
## ..$ size : 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 2.2points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x.top :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 0
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 2.2points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x.bottom : NULL
## $ axis.text.y :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 1
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.2points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.y.left : NULL
## $ axis.text.y.right :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 2.2points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.theta : NULL
## $ axis.text.r :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0.5
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.2points 0points 2.2points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.ticks : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.ticks.x : NULL
## $ axis.ticks.x.top : NULL
## $ axis.ticks.x.bottom : NULL
## $ axis.ticks.y : NULL
## $ axis.ticks.y.left : NULL
## $ axis.ticks.y.right : NULL
## $ axis.ticks.theta : NULL
## $ axis.ticks.r : NULL
## $ axis.minor.ticks.x.top : NULL
## $ axis.minor.ticks.x.bottom : NULL
## $ axis.minor.ticks.y.left : NULL
## $ axis.minor.ticks.y.right : NULL
## $ axis.minor.ticks.theta : NULL
## $ axis.minor.ticks.r : NULL
## $ axis.ticks.length : 'simpleUnit' num 2.75points
## ..- attr(*, "unit")= int 8
## $ axis.ticks.length.x : NULL
## $ axis.ticks.length.x.top : NULL
## $ axis.ticks.length.x.bottom : NULL
## $ axis.ticks.length.y : NULL
## $ axis.ticks.length.y.left : NULL
## $ axis.ticks.length.y.right : NULL
## $ axis.ticks.length.theta : NULL
## $ axis.ticks.length.r : NULL
## $ axis.minor.ticks.length : 'rel' num 0.75
## $ axis.minor.ticks.length.x : NULL
## $ axis.minor.ticks.length.x.top : NULL
## $ axis.minor.ticks.length.x.bottom: NULL
## $ axis.minor.ticks.length.y : NULL
## $ axis.minor.ticks.length.y.left : NULL
## $ axis.minor.ticks.length.y.right : NULL
## $ axis.minor.ticks.length.theta : NULL
## $ axis.minor.ticks.length.r : NULL
## $ axis.line : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.line.x : NULL
## $ axis.line.x.top : NULL
## $ axis.line.x.bottom : NULL
## $ axis.line.y : NULL
## $ axis.line.y.left : NULL
## $ axis.line.y.right : NULL
## $ axis.line.theta : NULL
## $ axis.line.r : NULL
## $ legend.background : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.margin : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
## ..- attr(*, "unit")= int 8
## $ legend.spacing : 'simpleUnit' num 11points
## ..- attr(*, "unit")= int 8
## $ legend.spacing.x : NULL
## $ legend.spacing.y : NULL
## $ legend.key : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.key.size : 'simpleUnit' num 1.2lines
## ..- attr(*, "unit")= int 3
## $ legend.key.height : NULL
## $ legend.key.width : NULL
## $ legend.key.spacing : 'simpleUnit' num 5.5points
## ..- attr(*, "unit")= int 8
## $ legend.key.spacing.x : NULL
## $ legend.key.spacing.y : NULL
## $ legend.frame : NULL
## $ legend.ticks : NULL
## $ legend.ticks.length : 'rel' num 0.2
## $ legend.axis.line : NULL
## $ legend.text :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.text.position : NULL
## $ legend.title :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.title.position : NULL
## $ legend.position : chr "right"
## $ legend.position.inside : NULL
## $ legend.direction : NULL
## $ legend.byrow : NULL
## $ legend.justification : chr "center"
## $ legend.justification.top : NULL
## $ legend.justification.bottom : NULL
## $ legend.justification.left : NULL
## $ legend.justification.right : NULL
## $ legend.justification.inside : NULL
## $ legend.location : NULL
## $ legend.box : NULL
## $ legend.box.just : NULL
## $ legend.box.margin : 'margin' num [1:4] 0cm 0cm 0cm 0cm
## ..- attr(*, "unit")= int 1
## $ legend.box.background : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.box.spacing : 'simpleUnit' num 11points
## ..- attr(*, "unit")= int 8
## [list output truncated]
## - attr(*, "class")= chr [1:2] "theme" "gg"
## - attr(*, "complete")= logi TRUE
## - attr(*, "validate")= logi TRUE
# Plot untuk model numeric
sim_data_numeric %>%
ggplot(aes(x = monthly_income, y =predicted, color = as.factor(usage_frequency_numeric))) +
geom_point(alpha = 0.6) +
labs(title = "Prediksi Probabilitas (Ordinal sebagai Numeric)", x= "Monthly Income", y="Prediksi Probabilitas")
theme_minimal()
## List of 136
## $ line :List of 6
## ..$ colour : chr "black"
## ..$ linewidth : num 0.5
## ..$ linetype : num 1
## ..$ lineend : chr "butt"
## ..$ arrow : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ rect :List of 5
## ..$ fill : chr "white"
## ..$ colour : chr "black"
## ..$ linewidth : num 0.5
## ..$ linetype : num 1
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ text :List of 11
## ..$ family : chr ""
## ..$ face : chr "plain"
## ..$ colour : chr "black"
## ..$ size : num 11
## ..$ hjust : num 0.5
## ..$ vjust : num 0.5
## ..$ angle : num 0
## ..$ lineheight : num 0.9
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ title : NULL
## $ aspect.ratio : NULL
## $ axis.title : NULL
## $ axis.title.x :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 2.75points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.x.top :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 0
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 2.75points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.x.bottom : NULL
## $ axis.title.y :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : num 90
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.75points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.y.left : NULL
## $ axis.title.y.right :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : num -90
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 2.75points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : chr "grey30"
## ..$ size : 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 2.2points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x.top :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 0
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 2.2points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x.bottom : NULL
## $ axis.text.y :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 1
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.2points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.y.left : NULL
## $ axis.text.y.right :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 2.2points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.theta : NULL
## $ axis.text.r :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0.5
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.2points 0points 2.2points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.ticks : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.ticks.x : NULL
## $ axis.ticks.x.top : NULL
## $ axis.ticks.x.bottom : NULL
## $ axis.ticks.y : NULL
## $ axis.ticks.y.left : NULL
## $ axis.ticks.y.right : NULL
## $ axis.ticks.theta : NULL
## $ axis.ticks.r : NULL
## $ axis.minor.ticks.x.top : NULL
## $ axis.minor.ticks.x.bottom : NULL
## $ axis.minor.ticks.y.left : NULL
## $ axis.minor.ticks.y.right : NULL
## $ axis.minor.ticks.theta : NULL
## $ axis.minor.ticks.r : NULL
## $ axis.ticks.length : 'simpleUnit' num 2.75points
## ..- attr(*, "unit")= int 8
## $ axis.ticks.length.x : NULL
## $ axis.ticks.length.x.top : NULL
## $ axis.ticks.length.x.bottom : NULL
## $ axis.ticks.length.y : NULL
## $ axis.ticks.length.y.left : NULL
## $ axis.ticks.length.y.right : NULL
## $ axis.ticks.length.theta : NULL
## $ axis.ticks.length.r : NULL
## $ axis.minor.ticks.length : 'rel' num 0.75
## $ axis.minor.ticks.length.x : NULL
## $ axis.minor.ticks.length.x.top : NULL
## $ axis.minor.ticks.length.x.bottom: NULL
## $ axis.minor.ticks.length.y : NULL
## $ axis.minor.ticks.length.y.left : NULL
## $ axis.minor.ticks.length.y.right : NULL
## $ axis.minor.ticks.length.theta : NULL
## $ axis.minor.ticks.length.r : NULL
## $ axis.line : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.line.x : NULL
## $ axis.line.x.top : NULL
## $ axis.line.x.bottom : NULL
## $ axis.line.y : NULL
## $ axis.line.y.left : NULL
## $ axis.line.y.right : NULL
## $ axis.line.theta : NULL
## $ axis.line.r : NULL
## $ legend.background : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.margin : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
## ..- attr(*, "unit")= int 8
## $ legend.spacing : 'simpleUnit' num 11points
## ..- attr(*, "unit")= int 8
## $ legend.spacing.x : NULL
## $ legend.spacing.y : NULL
## $ legend.key : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.key.size : 'simpleUnit' num 1.2lines
## ..- attr(*, "unit")= int 3
## $ legend.key.height : NULL
## $ legend.key.width : NULL
## $ legend.key.spacing : 'simpleUnit' num 5.5points
## ..- attr(*, "unit")= int 8
## $ legend.key.spacing.x : NULL
## $ legend.key.spacing.y : NULL
## $ legend.frame : NULL
## $ legend.ticks : NULL
## $ legend.ticks.length : 'rel' num 0.2
## $ legend.axis.line : NULL
## $ legend.text :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.text.position : NULL
## $ legend.title :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.title.position : NULL
## $ legend.position : chr "right"
## $ legend.position.inside : NULL
## $ legend.direction : NULL
## $ legend.byrow : NULL
## $ legend.justification : chr "center"
## $ legend.justification.top : NULL
## $ legend.justification.bottom : NULL
## $ legend.justification.left : NULL
## $ legend.justification.right : NULL
## $ legend.justification.inside : NULL
## $ legend.location : NULL
## $ legend.box : NULL
## $ legend.box.just : NULL
## $ legend.box.margin : 'margin' num [1:4] 0cm 0cm 0cm 0cm
## ..- attr(*, "unit")= int 1
## $ legend.box.background : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.box.spacing : 'simpleUnit' num 11points
## ..- attr(*, "unit")= int 8
## [list output truncated]
## - attr(*, "class")= chr [1:2] "theme" "gg"
## - attr(*, "complete")= logi TRUE
## - attr(*, "validate")= logi TRUE
Interpretasi: Visualisasi hubungan antara pendapatan bulanan dan probabilitas sukses berdasarkan frekuensi penggunaan, dengan dua pendekatan perlakuan ordinal. Dapat dilihat bahwa dengan dua pendekatan ordinal, grafik terlihat mirip.
Ringkasan Koefisien Model
library(knitr)
library(kableExtra)
library(broom)
# Ringkasan model nominal
tidy(model_nominal) %>%
kable(format = "latex", booktabs = TRUE, caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Nominal") %>%
kable_styling(latex_options = c("hold_position", "striped"))
# Ringkasan model numeric
tidy(model_numeric) %>%
kable(format = "latex", booktabs = TRUE, caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Numeric") %>%
kable_styling(latex_options = c("hold_position", "striped"))
Interpretasi: Tabel memperlihatkan estimasi koefisien, standar error, nilai z, dan p-value. Koefisien positif meningkatkan log-odds keberhasilan, koefisien negatif menurunkan.
Kesimpulan
Job Status: Pelajar memiliki peluang sukses yang lebih tinggi dibandingkan dengan Pekerja (kategori referensi), meskipun hasil ini tidak signifikan (p = 0.4938). Artinya, meskipun ada sedikit indikasi bahwa pelajar lebih mungkin untuk memilih paket premium, perbedaan ini tidak cukup kuat untuk dianggap signifikan dalam model.
Usage Frequency:
Monthly Income:
Dalam membangun model regresi logistik, terdapat dua pendekatan umum yang digunakan, yaitu:
Pendekatan Confirmatory (Konfirmatori)
Pendekatan Exploratory (Eksploratori)
Kedua pendekatan ini tidak saling bertentangan dan sering kali digunakan secara bersamaan. Misalnya, peneliti dapat memulai dengan pendekatan konfirmatori berdasarkan teori, lalu melakukan eksplorasi untuk mencari kemungkinan interaksi atau variabel tambahan yang signifikan.
Penting untuk selalu mempertimbangkan konteks dan tujuan analisis dalam memilih pendekatan pemodelan yang tepat.
Pemilihan variabel dalam regresi logistik dapat dilakukan menggunakan pendekatan stepwise selection, yaitu proses otomatis untuk memilih subset prediktor terbaik berdasarkan kriteria statistik tertentu. Terdapat tiga metode utama:
Metode Forward Selection
Metode Backward Elimination
Metode Stepwise (Bidirectional)
Simulasi Data dan Implementasi di R
# Simulasi data
set.seed(60)
n <- 200
x1 <- rnorm(n, mean = 50, sd = 10)
x2 <- rbinom(n, 1, 0.4)
x3 <- runif(n, 20, 60)
linpred <- -2 + 0.05*x3 - 0.6*x2
prob <- 1 / (1 + exp(-linpred))
y <- rbinom(n, 1, prob)
data <- data.frame(y, x1, x2, x3)
head(data)
## y x1 x2 x3
## 1 1 57.20645 1 47.09625
## 2 0 54.99906 0 27.05044
## 3 0 44.24911 1 34.39904
## 4 0 48.46405 0 58.37422
## 5 1 32.66808 0 59.95299
## 6 0 32.78248 1 25.88972
# Model awal lengkap
full_model <- glm(y ~ ., data = data, family = binomial)
# Forward
forward_model <- step(glm(y ~ 1, data = data, family = binomial),
direction = "forward",
scope = formula(full_model), trace = FALSE)
# Backward
backward_model <- step(full_model, direction = "backward", trace = FALSE)
# Stepwise
stepwise_model <- step(glm(y ~ 1, data = data, family = binomial),
scope = formula(full_model),
direction = "both", trace = FALSE)
# Ringkasan model
summary(full_model)
##
## Call:
## glm(formula = y ~ ., family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.13064 0.95578 -0.137 0.891278
## x1 -0.01961 0.01539 -1.274 0.202756
## x2 -1.07406 0.32089 -3.347 0.000817 ***
## x3 0.03178 0.01293 2.458 0.013975 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 274.83 on 199 degrees of freedom
## Residual deviance: 254.01 on 196 degrees of freedom
## AIC: 262.01
##
## Number of Fisher Scoring iterations: 4
summary(forward_model)
##
## Call:
## glm(formula = y ~ x2 + x3, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.13697 0.54666 -2.080 0.037540 *
## x2 -1.09582 0.31948 -3.430 0.000603 ***
## x3 0.03221 0.01286 2.505 0.012255 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 274.83 on 199 degrees of freedom
## Residual deviance: 255.66 on 197 degrees of freedom
## AIC: 261.66
##
## Number of Fisher Scoring iterations: 4
summary(backward_model)
##
## Call:
## glm(formula = y ~ x2 + x3, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.13697 0.54666 -2.080 0.037540 *
## x2 -1.09582 0.31948 -3.430 0.000603 ***
## x3 0.03221 0.01286 2.505 0.012255 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 274.83 on 199 degrees of freedom
## Residual deviance: 255.66 on 197 degrees of freedom
## AIC: 261.66
##
## Number of Fisher Scoring iterations: 4
summary(stepwise_model)
##
## Call:
## glm(formula = y ~ x2 + x3, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.13697 0.54666 -2.080 0.037540 *
## x2 -1.09582 0.31948 -3.430 0.000603 ***
## x3 0.03221 0.01286 2.505 0.012255 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 274.83 on 199 degrees of freedom
## Residual deviance: 255.66 on 197 degrees of freedom
## AIC: 261.66
##
## Number of Fisher Scoring iterations: 4
Dari hasil di atas, dapat dilihat variabel-variabel mana saja yang terpilih ke dalam model. Dari ketiga metode stepwise (forward, backward, dan keduanya) menunjukkan bahwa model terbaik yang terbentuk adalah model dengan dua prediktor, yaitu x2 dan x3.
Receiver Operating Characteristic
Receiver Operating Characteristic (ROC) curve adalah grafik yang digunakan untuk mengevaluasi performa model klasifikasi biner dengan membandingkan True Positive Rate (TPR) terhadap False Positive Rate (FPR) pada berbagai nilai ambang batas (threshold).
\[ \text{TPR} = \frac{\text{True Positive}}{\text{True Positive} + \text{False Negative}} \]
\[ \text{FPR} = \frac{\text{False Positive}}{\text{False Positive} + \text{True Negative}} \]
ROC curve menggambarkan seberapa baik model dapat membedakan antara dua kelas (positif dan negatif). Semakin melengkung ke kiri atas, semakin baik model tersebut.
Area Under the Curve (AUC)
AUC adalah nilai yang mewakili luas di bawah kurva ROC. Nilai AUC berkisar antara 0 hingga 1 dan memiliki interpretasi sebagai berikut:
AUC juga dapat ditafsirkan sebagai probabilitas bahwa model akan memberikan skor prediksi yang lebih tinggi untuk observasi positif dibandingkan observasi negatif secara acak.
Implementasi ROC dan AUC di R
library(pROC)
# Prediksi probabilitas dari model stepwise
prob <- predict(stepwise_model, type = "response")
roc_obj <- roc(data$y, prob)
# Plot ROC
plot(roc_obj, main = "ROC Curve Model Stepwise", col = "blue")
auc(roc_obj)
## Area under the curve: 0.6839
Interpretasi Berdasarkan plot ROC yang ditampilkan, model menghasilkan nilai AUC sebesar 0.684. Ini menunjukkan bahwa kemampuan model dalam membedakan antara kelas 1 dan 0 tergolong cukup baik. Artinya, model bisa memprediksi dengan benar sekitar 68% dari waktu saat membandingkan satu data positif dan satu data negatif secara acak.
Precision-Recall Curve (PR Curve) adalah grafik yang menggambarkan hubungan antara Precision (Presisi) dan Recall (Sensitivitas) pada berbagai ambang batas prediksi.
\[ \text{Precision} = \frac{\text{True Positive}}{\text{True Positive} + \text{False Positive}} \]
\[ \text{Recall} = \frac{\text{True Positive}}{\text{True Positive} + \text{False Negative}} \]
PR Curve sangat berguna terutama pada dataset yang memiliki distribusi kelas tidak seimbang (class imbalance), karena lebih fokus pada prediksi kelas positif. Semakin tinggi kurva dan semakin dekat ke sudut kanan atas, maka semakin baik performa model.
Perbandingan PR Curve dan ROC
Implementasi PR Curve di R
library(PRROC)
# Buat PR curve
pr_obj <- pr.curve(scores.class0 = prob[data$y == 1],
scores.class1 = prob[data$y == 0],
curve = TRUE)
# Plot PR curve
plot(pr_obj, main = "Precision-Recall Curve")
Berdasarkan grafik Precision-Recall Curve yang ditampilkan, nilai AUC sebesar 0.64 menunjukkan bahwa model memiliki kemampuan yang cukup baik dalam mengidentifikasi kelas positif. Kurva terlihat tidak terlalu tinggi dan cenderung menurun seiring meningkatnya recall, yang menandakan bahwa saat recall meningkat, precision justru menurun. Ini berarti model dapat menemukan banyak kasus positif (recall tinggi), tapi sebagian prediksi positifnya salah (precision menurun).
Pseudo R-Squared adalah ukuran goodness-of-fit dalam model regresi logistik yang berfungsi sebagai alternatif dari koefisien determinasi \(R^2\) pada regresi linear. Nilai ini menunjukkan seberapa baik model menjelaskan variabilitas data.
Beberapa jenis pseudo R-squared yang umum digunakan:
Pseudo R-squared versi Cox & Snell didefinisikan sebagai:
\[ R^2_{CS} = 1 - \left(\frac{L_0}{L_M}\right)^{2/n} \]
Namun, nilai maksimum dari \(R^2_{CS}\) tidak mencapai 1, sehingga interpretasinya agak terbatas.
Rumus:
\[ R^2_{McF} = 1 - \frac{\ln L_M}{\ln L_0} \]
Implementasi di R
library(pscl)
# Hitung pseudo R-squared
pR2(stepwise_model)
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML
## -127.82788396 -137.41698406 19.17820020 0.06978104 0.09143696
## r2CU
## 0.12241369
Interpretasi Berdasarkan hasil perhitungan pseudo R-squared, nilai McFadden sebesar 0.0698 menunjukkan bahwa model hanya mampu menjelaskan sekitar 7% dari variasi log-likelihood dibandingkan dengan model tanpa prediktor. Nilai ini tergolong rendah, sehingga menunjukkan bahwa model belum cukup baik dalam menjelaskan hubungan antara variabel prediktor dan respon. Nilai lainnya seperti r2ML (Cox and Snell) = 0.0914 dan r2CU (Nagelkerke) = 0.1224 juga menunjukkan hal yang sama.
Salah satu cara sederhana dan umum untuk mengevaluasi hasil klasifikasi dari model regresi logistik adalah dengan menggunakan tabel klasifikasi atau confusion matrix. Tabel ini membandingkan hasil prediksi model terhadap nilai aktual kelas.
Tabel ini terdiri dari empat komponen:
Dari confusion matrix, kita dapat menghitung beberapa metrik penting:
Akurasi (Accuracy): \[ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} \]
Sensitivitas (Recall / TPR): \[ \text{Sensitivity} = \frac{TP}{TP + FN} \]
Spesifisitas (TNR): \[ \text{Specificity} = \frac{TN}{TN + FP} \]
Implementasi di R
library(caret)
# Prediksi kelas (threshold 0.5)
pred_class <- ifelse(prob >= 0.5, 1, 0)
# Konversi ke faktor
pred_class <- factor(pred_class, levels = c(0, 1))
actual <- factor(data$y, levels = c(0, 1))
# Buat confusion matrix
conf_mat <- confusionMatrix(pred_class, actual)
conf_mat
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 79 40
## 1 32 49
##
## Accuracy : 0.64
## 95% CI : (0.5693, 0.7065)
## No Information Rate : 0.555
## P-Value [Acc > NIR] : 0.009032
##
## Kappa : 0.2646
##
## Mcnemar's Test P-Value : 0.409395
##
## Sensitivity : 0.7117
## Specificity : 0.5506
## Pos Pred Value : 0.6639
## Neg Pred Value : 0.6049
## Prevalence : 0.5550
## Detection Rate : 0.3950
## Detection Prevalence : 0.5950
## Balanced Accuracy : 0.6311
##
## 'Positive' Class : 0
##
Interpretasi Berdasarkan confusion matrix, model berhasil mengklasifikasikan data dengan akurasi sebesar 64%, yang berarti 64% prediksi model sesuai dengan kelas sebenarnya. Sensitivitas (kemampuan mendeteksi kelas 0 sebagai 0) sebesar 71.17%, menunjukkan bahwa model cukup baik dalam mengenali kelas negatif. Namun, spesifisitas hanya 55.06%, artinya model masih cukup sering salah memprediksi kelas 1 sebagai 0.
Dalam mengevaluasi dan membandingkan model regresi logistik, terdapat beberapa kriteria statistik yang sering digunakan:
AIC digunakan untuk membandingkan beberapa model, dengan rumus:
\[ AIC = -2 \cdot \ln(L) + 2k \]
Semakin kecil nilai AIC, maka semakin baik model (dengan catatan kompleksitas model tidak terlalu tinggi).
Deviance mengukur kesesuaian model terhadap data:
Uji ini digunakan untuk membandingkan dua model, yaitu model penuh dan model sederhana (nested model). Rumus statistik uji:
\[ G^2 = -2 \cdot (\ln L_{restricted} - \ln L_{full}) \]
Nilai \(G^2\) mengikuti distribusi chi-square dengan derajat bebas sesuai selisih jumlah parameter antar model.
Dalam memilih model terbaik, prinsip parsimony menyarankan agar kita memilih model yang sederhana namun cukup baik menjelaskan data. Artinya, lebih baik memilih model dengan sedikit prediktor yang relevan daripada model kompleks dengan banyak prediktor tapi hanya sedikit memberi tambahan informasi.
Implementasi di R
# AIC
AIC(stepwise_model)
## [1] 261.6558
AIC(full_model)
## [1] 262.0104
# Null dan residual deviance
summary(stepwise_model)$null.deviance
## [1] 274.834
summary(stepwise_model)$deviance
## [1] 255.6558
# Likelihood Ratio Test otomatis (via anova)
anova(glm(y ~ 1, data = data, family = binomial),
stepwise_model,
test = "Chisq")
## Analysis of Deviance Table
##
## Model 1: y ~ 1
## Model 2: y ~ x2 + x3
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 199 274.83
## 2 197 255.66 2 19.178 6.847e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretasi Berdasarkan hasil perbandingan model, nilai AIC dari model stepwise (261.66) lebih kecil dibandingkan model penuh (262.01), yang menunjukkan bahwa model stepwise sedikit lebih efisien. Selain itu, terdapat penurunan deviance dari 274.83 (null model) menjadi 255.66 (model stepwise), yang menandakan peningkatan kesesuaian model terhadap data. Hasil Likelihood Ratio Test juga signifikan, yang berarti bahwa model dengan prediktor x2 dan x3 secara statistik lebih baik dibandingkan model tanpa prediktor. Dengan mempertimbangkan prinsip parsimony, model stepwise dapat dianggap cukup baik dan efisien tanpa terlalu kompleks.
Distribusi multinomial adalah generalisasi dari distribusi binomial yang digunakan untuk memodelkan hasil dari percobaan dengan lebih dari dua kategori yang saling eksklusif. Jika dalam distribusi binomial hanya ada dua kemungkinan (sukses dan gagal), maka dalam distribusi multinomial bisa ada tiga atau lebih hasil yang mungkin.
Notasi dan Rumus
Misalkan terdapat \(k\) kategori dengan probabilitas kejadian masing-masing \(\pi_1, \pi_2, \dots, \pi_k\) dan jumlah total percobaan \(n\), maka fungsi probabilitas dari distribusi multinomial adalah:
\[ P(Y_1 = y_1, \dots, Y_k = y_k) = \frac{n!}{y_1!y_2!\cdots y_k!} \pi_1^{y_1} \pi_2^{y_2} \cdots \pi_k^{y_k} \]
dengan syarat: - \(\sum_{i=1}^{k} y_i = n\) - \(\sum_{i=1}^{k} \pi_i = 1\) - \(0 \leq \pi_i \leq 1\)
Contoh Kasus Misalkan kita melempar dadu sebanyak 60 kali. Probabilitas munculnya masing-masing mata dadu adalah \(\pi_i = \frac{1}{6}\). Hasil pengamatan dapat berupa jumlah kemunculan tiap angka: \(Y_1 = 12\), \(Y_2 = 10\), …, \(Y_6 = 9\).
Data ini dapat dimodelkan dengan distribusi multinomial: \[ (Y_1, Y_2, \dots, Y_6) \sim \text{Multinomial}(n=60, \pi_1 = \dots = \pi_6 = 1/6) \]
Perbedaan dengan Binomial | Binomial | Multinomial | |———-|————–| | Dua kategori (sukses/gagal) | \(\geq 3\) kategori | | Probabilitas satu kejadian | Probabilitas untuk tiap kategori | | Model: \(\text{Binomial}(n, p)\) | Model: \(\text{Multinomial}(n, \pi_1, \dots, \pi_k)\) |
Distribusi multinomial digunakan sebagai dasar dalam membangun model regresi logistik multinomial.
Regresi logistik multinomial digunakan ketika variabel respon memiliki lebih dari dua kategori yang tidak berurutan. Model ini merupakan perpanjangan dari regresi logistik biner dan sering disebut sebagai baseline-category logit model.
Bentuk Model
Salah satu kategori dijadikan sebagai kategori referensi (baseline), dan kategori lainnya dibandingkan terhadap baseline tersebut dalam bentuk log-odds.
Misalkan \(Y\) memiliki \(K\) kategori: \(1, 2, ..., K\), dan kategori \(K\) dipilih sebagai baseline, maka model ditulis sebagai:
\[ \log\left(\frac{\pi_j(x)}{\pi_K(x)}\right) = \beta_{0j} + \beta_{1j}x_1 + \cdots + \beta_{pj}x_p, \quad j = 1, \dots, K-1 \]
dimana: - \(\pi_j(x)\) adalah probabilitas memilih kategori ke-\(j\) - \(\pi_K(x)\) adalah probabilitas baseline - \(x_1, \dots, x_p\) adalah prediktor - \(\beta_{ij}\) adalah koefisien regresi untuk kategori \(j\) terhadap baseline
Estimasi Parameter dengan MLE
Parameter dalam regresi logistik multinomial diestimasi menggunakan metode Maximum Likelihood Estimation (MLE). Fungsi likelihood model untuk \(n\) observasi dengan \(K\) kategori didefinisikan sebagai:
\[ L(\boldsymbol{\beta}) = \prod_{i=1}^{n} \prod_{j=1}^{K} \pi_j(x_i)^{y_{ij}} \]
dengan \(y_{ij} = 1\) jika observasi \(i\) berada di kategori \(j\), dan 0 jika tidak. Fungsi log-likelihood-nya menjadi:
\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^{n} \sum_{j=1}^{K} y_{ij} \log(\pi_j(x_i)) \]
Nilai \(\pi_j(x)\) dihitung dari model:
\[ \pi_j(x) = \frac{\exp(\beta_{0j} + \beta_{1j}x_1 + \cdots + \beta_{pj}x_p)}{1 + \sum_{l=1}^{K-1} \exp(\beta_{0l} + \beta_{1l}x_1 + \cdots + \beta_{pl}x_p)} \]
Untuk kategori referensi \(K\), digunakan:
\[ \pi_K(x) = \frac{1}{1 + \sum_{l=1}^{K-1} \exp(\beta_{0l} + \beta_{1l}x_1 + \cdots + \beta_{pl}x_p)} \]
Estimasi parameter dilakukan secara numerik menggunakan metode iteratif seperti Newton-Raphson hingga nilai log-likelihood konvergen.
Interpretasi Koefisien
Asumsi Model - Kategori respon bersifat saling eksklusif dan tidak berurutan - Observasi independen - Tidak ada multikolinearitas antar prediktor
Regresi logistik multinomial banyak digunakan dalam kasus seperti pemilihan merek produk, pilihan transportasi, atau preferensi kategori lainnya yang terdiri dari lebih dari dua kelas.
Misalnya, kita ingin memodelkan pilihan tipe transportasi seseorang (“Mobil”, “Motor”, “Jalan Kaki”) berdasarkan beberapa faktor prediktor seperti jarak (dalam km) dan status memiliki kendaraan pribadi.
Simulasi Data
set.seed(123)
library(dplyr)
n <- 300
# Prediktor
jarak <- runif(n, 0.5, 10) # jarak dalam km
punya_motor <- rbinom(n, 1, 0.6)
# Probabilitas transportasi
log_odds_motor <- 1 - 0.3 * jarak + 0.7 * punya_motor
log_odds_jalan <- 2 - 0.6 * jarak - 0.5 * punya_motor
# Hitung probabilitas dari log-odds
odds_motor <- exp(log_odds_motor)
odds_jalan <- exp(log_odds_jalan)
odds_mobil <- 1 # baseline
total <- odds_motor + odds_jalan + odds_mobil
p_motor <- odds_motor / total
p_jalan <- odds_jalan / total
p_mobil <- odds_mobil / total
# Sampling kategori transportasi
transportasi <- mapply(function(pm, pj, pb) {
sample(c("Motor", "Jalan Kaki", "Mobil"), size = 1, prob = c(pm, pj, pb))
}, p_motor, p_jalan, p_mobil)
# Gabung data
sim_data <- data.frame(
transportasi = factor(transportasi),
jarak = jarak,
punya_motor = factor(punya_motor)
)
head(sim_data)
## transportasi jarak punya_motor
## 1 Jalan Kaki 3.2319864 0
## 2 Motor 7.9888988 1
## 3 Mobil 4.3852808 0
## 4 Mobil 8.8886653 0
## 5 Mobil 9.4344392 0
## 6 Jalan Kaki 0.9327867 1
Eksplorasi Data
library(ggplot2)
table(sim_data$transportasi)
##
## Jalan Kaki Mobil Motor
## 50 134 116
ggplot(sim_data, aes(x = transportasi, fill = transportasi)) +
geom_bar() +
labs(title = "Distribusi Pilihan Transportasi") +
theme_minimal()
ggplot(sim_data, aes(x = jarak, fill = transportasi)) +
geom_density(alpha = 0.5) +
labs(title = "Distribusi Jarak berdasarkan Transportasi") +
theme_minimal()
Interpretasi Dari hasil eksplorasi data, terlihat bahwa mayoritas responden memilih mobil sebagai moda transportasi, diikuti oleh motor, dan yang paling sedikit adalah jalan kaki. Distribusi jarak menunjukkan bahwa semakin jauh jarak tempuh, semakin besar kecenderungan seseorang memilih kendaraan bermotor. Pengguna jalan kaki umumnya menempuh jarak yang lebih pendek, sedangkan pengguna mobil cenderung pada jarak yang lebih jauh. Pola ini mengindikasikan adanya hubungan potensial antara jarak dan pilihan transportasi
Pemodelan dan Estimasi Parameter
library(nnet)
# Pastikan respon adalah faktor
sim_data$transportasi <- relevel(sim_data$transportasi, ref = "Mobil")
# Fit model
model_mn <- multinom(transportasi ~ jarak + punya_motor, data = sim_data)
## # weights: 12 (6 variable)
## initial value 329.583687
## iter 10 value 261.120162
## final value 261.031998
## converged
summary(model_mn)
## Call:
## multinom(formula = transportasi ~ jarak + punya_motor, data = sim_data)
##
## Coefficients:
## (Intercept) jarak punya_motor1
## Jalan Kaki 1.872618 -0.6965632 0.5862651
## Motor 1.033549 -0.3118536 0.9476431
##
## Std. Errors:
## (Intercept) jarak punya_motor1
## Jalan Kaki 0.4593502 0.09770122 0.3911817
## Motor 0.3687073 0.05763623 0.2890722
##
## Residual Deviance: 522.064
## AIC: 534.064
Signifikansi
z <- summary(model_mn)$coefficients / summary(model_mn)$standard.errors
p_values <- 2 * (1 - pnorm(abs(z)))
round(p_values, 4)
## (Intercept) jarak punya_motor1
## Jalan Kaki 0.0000 0 0.134
## Motor 0.0051 0 0.001
Interpretasi Model
Model memprediksi pilihan transportasi dengan tiga kategori:
Model membangun dua logit terhadap baseline “Mobil”:
Logit JK vs Mobil: \[ \log\left(\frac{P(\text{Jalan Kaki})}{P(\text{Mobil})}\right) = \beta^{(JK)}_0 + \beta^{(JK)}_1 \cdot \text{jarak} + \beta^{(JK)}_2 \cdot \text{punya\_motor} \]
Logit M vs Mobil: \[ \log\left(\frac{P(\text{Motor})}{P(\text{Mobil})}\right) = \beta^{(M)}_0 + \beta^{(M)}_1 \cdot \text{jarak} + \beta^{(M)}_2 \cdot \text{punya\_motor} \]
Interpretasi Koefisien dan P-value
Interpretasi dalam Odds Ratio
Perbandingan | Koef. (jarak) | OR jarak | Interpretasi | Signifikansi |
---|---|---|---|---|
Jalan Kaki vs Mobil | -0.697 | 0.498 | Peluang memilih jalan kaki dibanding mobil turun 50.2% tiap kenaikan jarak 1 km | Signifikan |
Motor vs Mobil | -0.312 | 0.732 | Peluang memilih motor dibanding mobil turun 26.8% tiap kenaikan jarak 1 km | Signifikan |
Perbandingan | Koef. (punya_motor) | OR motor | Interpretasi | Signifikansi |
---|---|---|---|---|
Jalan Kaki vs Mobil | 0.586 | 1.797 | tidak ada bukti kuat bahwa memiliki motor memengaruhi peluang memilih jalan kaki dibanding mobil | Tidak signifikan |
Motor vs Mobil | 0.948 | 2.582 | Peluang memilih motor dibanding mobil naik 2.58× jika punya motor | Signifikan |
Evaluasi model logistik multinomial dapat dilakukan dengan beberapa pendekatan, antara lain menggunakan nilai AIC, pseudo R-squared, dan confusion matrix untuk melihat performa klasifikasi.
Nilai AIC digunakan untuk membandingkan model – semakin kecil AIC, semakin baik model. Residual deviance dapat dibandingkan dengan null deviance untuk melihat peningkatan kualitas model dari baseline.
# AIC
AIC(model_mn)
## [1] 534.064
# Null dan residual deviance
model_mn$deviance
## [1] 522.064
library(pscl)
pR2(model_mn)
## fitting null model for pseudo-r2
## # weights: 6 (2 variable)
## initial value 329.583687
## final value 307.806597
## converged
## llh llhNull G2 McFadden r2ML r2CU
## -261.0319983 -307.8065974 93.5491982 0.1519610 0.2678945 0.3073849
Kita dapat membandingkan prediksi model dengan kelas asli:
library(caret)
# Prediksi kelas
pred_mn <- predict(model_mn)
# Confusion matrix
confusionMatrix(pred_mn, sim_data$transportasi)
## Confusion Matrix and Statistics
##
## Reference
## Prediction Mobil Jalan Kaki Motor
## Mobil 99 10 45
## Jalan Kaki 4 15 11
## Motor 31 25 60
##
## Overall Statistics
##
## Accuracy : 0.58
## 95% CI : (0.5219, 0.6365)
## No Information Rate : 0.4467
## P-Value [Acc > NIR] : 2.421e-06
##
## Kappa : 0.3052
##
## Mcnemar's Test P-Value : 0.01413
##
## Statistics by Class:
##
## Class: Mobil Class: Jalan Kaki Class: Motor
## Sensitivity 0.7388 0.3000 0.5172
## Specificity 0.6687 0.9400 0.6957
## Pos Pred Value 0.6429 0.5000 0.5172
## Neg Pred Value 0.7603 0.8704 0.6957
## Prevalence 0.4467 0.1667 0.3867
## Detection Rate 0.3300 0.0500 0.2000
## Detection Prevalence 0.5133 0.1000 0.3867
## Balanced Accuracy 0.7037 0.6200 0.6064
Interpretasi Berdasarkan hasil evaluasi, model menghasilkan nilai AIC sebesar 534.064 dan pseudo R-squared McFadden sebesar 0.152, yang menunjukkan bahwa model dapat menjelaskan sekitar 15.2% variasi dalam data—cukup baik untuk model klasifikasi dengan tiga kelas. Hasil confusion matrix menunjukkan bahwa model memiliki akurasi keseluruhan sebesar 58%, lebih tinggi dari no information rate (44.7%) dengan p-value yang signifikan. Sensitivitas tertinggi terdapat pada kelas “Mobil” (73.9%), sedangkan sensitivitas paling rendah terdapat pada “Jalan Kaki” (30%).
Setelah model dilatih, kita dapat menggunakan model tersebut untuk melakukan prediksi terhadap kategori respon dan probabilitas masing-masing kategori untuk setiap observasi. Hal ini dapat membantu memahami seberapa besar kemungkinan seseorang memilih kategori tertentu berdasarkan variabel prediktor.
Prediksi Kategori dan Probabilitas
# Prediksi kelas
predicted_class <- predict(model_mn)
# Prediksi probabilitas untuk setiap kategori
predicted_probs <- predict(model_mn, type = "probs")
# Gabungkan hasil ke dalam data frame
hasil_prediksi <- cbind(sim_data, prediksi = predicted_class, predicted_probs)
head(hasil_prediksi)
## transportasi jarak punya_motor prediksi Mobil Jalan Kaki Motor
## 1 Jalan Kaki 3.2319864 0 Motor 0.36890174 0.25261469 0.3784836
## 2 Motor 7.9888988 1 Mobil 0.60783797 0.02722181 0.3649402
## 3 Mobil 4.3852808 0 Mobil 0.49438761 0.15161016 0.3540022
## 4 Mobil 8.8886653 0 Mobil 0.84096251 0.01119702 0.1478405
## 5 Mobil 9.4344392 0 Mobil 0.86401342 0.00786579 0.1281208
## 6 Jalan Kaki 0.9327867 1 Jalan Kaki 0.07983213 0.48738975 0.4327781
Visualisasi Hasil Prediksi
library(ggplot2)
# Ubah data menjadi format long untuk visualisasi
hasil_prediksi_long <- tidyr::pivot_longer(
hasil_prediksi,
cols = c("Mobil", "Motor", "Jalan Kaki"),
names_to = "kategori",
values_to = "probabilitas"
)
# Plot probabilitas prediksi terhadap jarak
ggplot(hasil_prediksi_long, aes(x = jarak, y = probabilitas, color = kategori)) +
geom_smooth(se = FALSE) +
labs(title = "Probabilitas Prediksi Transportasi berdasarkan Jarak",
x = "Jarak (km)", y = "Probabilitas") +
theme_minimal()
Interpretasi Berdasarkan visualisasi hasil prediksi, terlihat bahwa semakin besar jarak tempuh, maka probabilitas memilih mobil semakin meningkat secara konsisten. Sebaliknya, probabilitas memilih jalan kaki menurun tajam seiring bertambahnya jarak, yang masuk akal karena berjalan jauh menjadi kurang praktis. Sementara itu, motor memiliki pola melengkung, di mana probabilitasnya naik pada jarak menengah (sekitar 3–4 km), lalu menurun kembali untuk jarak yang lebih jauh. Pola ini menunjukkan bahwa motor lebih disukai untuk jarak sedang, sedangkan mobil lebih dominan untuk jarak jauh, dan jalan kaki hanya menjadi pilihan utama saat jarak sangat pendek.
Pada bagian ini, kita membandingkan model regresi logistik
multinomial penuh (menggunakan prediktor jarak
dan
punya_motor
) dengan model alternatif yang lebih sederhana,
yaitu hanya menggunakan jarak
saja. Tujuannya adalah untuk
mengevaluasi apakah semua prediktor memang diperlukan, ataukah model
yang lebih ringkas sudah cukup baik.
# Model alternatif hanya dengan 1 prediktor
model_sederhana <- multinom(transportasi ~ jarak, data = sim_data)
## # weights: 9 (4 variable)
## initial value 329.583687
## iter 10 value 266.649413
## iter 10 value 266.649412
## final value 266.649412
## converged
# Bandingkan AIC kedua model
AIC(model_mn, model_sederhana)
## df AIC
## model_mn 6 534.0640
## model_sederhana 4 541.2988
# Uji Likelihood Ratio Test
anova(model_sederhana, model_mn, test = "Chisq")
## Likelihood ratio tests of Multinomial Models
##
## Response: transportasi
## Model Resid. df Resid. Dev Test Df LR stat. Pr(Chi)
## 1 jarak 596 533.2988
## 2 jarak + punya_motor 594 522.0640 1 vs 2 2 11.23483 0.003634026
Interpretasi Berdasarkan hasil perbandingan model, model penuh yang menggunakan jarak dan punya_motor memiliki AIC lebih rendah (534.06) dibanding model sederhana yang hanya menggunakan jarak (AIC = 541.30). Selain itu, hasil Likelihood Ratio Test menghasilkan p-value sebesar 0.0036, yang berarti perbedaan antara kedua model signifikan secara statistik. Artinya, penambahan variabel punya_motor secara nyata meningkatkan kualitas model dalam memprediksi pilihan transportasi. Oleh karena itu, meskipun model penuh sedikit lebih kompleks, ia tetap lebih disarankan karena memberikan hasil yang lebih baik tanpa overfitting.
Regresi logistik ordinal digunakan untuk menganalisis hubungan antara satu variabel respon ordinal dengan satu atau lebih variabel prediktor. Variabel ordinal memiliki kategori yang berurutan tetapi tidak memiliki jarak numerik yang pasti, contohnya:
Model regresi logistik ordinal yang umum digunakan adalah cumulative logit model, yang mengasumsikan bahwa pengaruh prediktor terhadap kategori bersifat konsisten (disebut asumsi proportional odds).
Studi Kasus: Tingkat Stres Mahasiswa
Sebagai contoh, ingin dipelajari bagaimana jumlah mata kuliah, durasi tidur, dan status persiapan ujian memengaruhi tingkat stres mahasiswa selama masa ujian akhir.
# Paket yang dibutuhkan
library(tidyverse)
library(MASS)
library(broom)
library(knitr)
library(kableExtra)
# Simulasi data stres mahasiswa
set.seed(42)
n <- 250
data_stres <- tibble(
jumlah_mk = sample(4:8, n, replace = TRUE),
tidur = round(rnorm(n, mean = 6, sd = 1.5), 1),
siap_ujian = sample(c("Siap", "Tidak Siap"), n, replace = TRUE, prob = c(0.4, 0.6)),
stres = sample(c("Rendah", "Sedang", "Tinggi"), n, replace = TRUE,
prob = c(0.25, 0.45, 0.30))
)
# Ubah menjadi faktor ordinal
data_stres <- data_stres %>%
mutate(
stres = factor(stres, levels = c("Rendah", "Sedang", "Tinggi"), ordered = TRUE),
siap_ujian = factor(siap_ujian)
)
# Tampilkan sebagian data
kable(head(data_stres), caption = "Contoh Data Tingkat Stres Mahasiswa Selama Ujian") %>%
kable_styling(full_width = FALSE)
jumlah_mk | tidur | siap_ujian | stres |
---|---|---|---|
4 | 5.9 | Siap | Tinggi |
8 | 5.1 | Siap | Tinggi |
4 | 7.4 | Siap | Sedang |
4 | 8.7 | Siap | Tinggi |
5 | 4.0 | Tidak Siap | Tinggi |
7 | 6.1 | Tidak Siap | Sedang |
Variabel respon stres memiliki tiga kategori yang berurutan: Rendah < Sedang < Tinggi.
Variabel prediktor:
Model regresi logistik ordinal yang paling umum digunakan adalah cumulative logit model atau proportional odds model.
Secara matematis, bentuk umum model ini adalah:
\[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \theta_j - \beta_1 X_1 - \beta_2 X_2 - \cdots - \beta_k X_k \]
Untuk setiap batas kategori ordinal \(j = 1, 2, \dots, J-1\), di mana:
Pemodelan Tingkat Stres Mahasiswa
Berdasarkan data simulasi sebelumnya, kita ingin melihat bagaimana
jumlah_mk
, tidur
, dan siap_ujian
memengaruhi tingkat stres mahasiswa.
# Fitting model cumulative logit dengan MASS::polr
model_stres <- polr(stres ~ jumlah_mk + tidur + siap_ujian, data = data_stres, method = "logistic")
# Ringkasan model
summary(model_stres)
##
## Re-fitting to get Hessian
## Call:
## polr(formula = stres ~ jumlah_mk + tidur + siap_ujian, data = data_stres,
## method = "logistic")
##
## Coefficients:
## Value Std. Error t value
## jumlah_mk 0.0745310 0.08249 0.903519
## tidur -0.0004268 0.07850 -0.005437
## siap_ujianTidak Siap -0.0900367 0.24300 -0.370526
##
## Intercepts:
## Value Std. Error t value
## Rendah|Sedang -0.7954 0.7000 -1.1362
## Sedang|Tinggi 1.2326 0.7030 1.7534
##
## Residual Deviance: 528.2152
## AIC: 538.2152
Interpretasi
Jumlah Mata Kuliah
(jumlah_mk
):
Koefisien = 0.075, Odds ratio ≈ 1.078, tidak signifikan (t = 0.90)
→ Tambahan satu mata kuliah sedikit meningkatkan peluang mahasiswa
berada pada tingkat stres yang lebih rendah, namun efek ini tidak
signifikan.
Durasi Tidur (tidur
):
Koefisien = -0.0004, Odds ratio ≈ 1, tidak signifikan (t ≈ 0005)
→ idur rata-rata per hari tidak berpengaruh nyata terhadap tingkat
stres.
Status Persiapan Ujian
(siap_ujianTidak Siap
):
Koefisien = -0.090, Odds ratio ≈ 0.914, tidak signifikan (t =
-0.37)
→ Mahasiswa tidak siap ujian cenderung memiliki peluang lebih besar
mengalami stres yang tinggi, namun efeknya tidak signifikan (t =
-0.37).
Intercepts (Thresholds):
Rendah | Sedang
= -0.795Sedang | Tinggi
= 1.233Secara keseluruhan, tidak ada prediktor dalam model ini yang signifikan secara statistik pada tingkat signifikansi 5%.
Dalam model cumulative logit, kita mengasumsikan bahwa pengaruh setiap variabel prediktor terhadap peluang kumulatif adalah konstan di seluruh batas kategori ordinal. Ini dikenal sebagai asumsi paralelisme atau asumsi proportional odds.
McCullagh (1980), dalam penjelasannya tentang cumulative logit model, menekankan bahwa efek slope prediktor \(\beta\) bersifat sama untuk semua batas kategori, sehingga membuat model lebih sederhana dan lebih mudah diinterpretasikan.
Namun apabila asumsi ini tidak terpenuhi, estimasi model dapat menjadi bias atau tidak valid—nilai odds ratio dapat berbeda signifikan antar kategori. Oleh karena itu, penting untuk melakukan pengujian asumsi paralelisme seperti Brant test atau likelihood ratio test sebelum melakukan interpretasi model (Liu et al., 2023)
Rumus Model Paralel
Untuk variabel respon ordinal dengan \(J\) kategori, model cumulative logit dirumuskan sebagai:
\[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \theta_j - \beta_1 X_1 - \beta_2 X_2 - \cdots - \beta_k X_k,\quad \text{untuk } j = 1, \dots, J-1 \]
Artinya, untuk setiap batas \(j\), hanya intercept \(\theta_j\) yang berubah, sementara koefisien regresi \(\beta\) tetap sama.
Jika Asumsi Paralel Tidak Terpenuhi
Model tanpa asumsi paralel akan memisahkan koefisien regresi untuk tiap batas kategori, menjadi:
\[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \theta_j - \beta_{1j} X_1 - \beta_{2j} X_2 - \cdots - \beta_{kj} X_k \]
di mana setiap \(\beta_{ij}\) boleh berbeda-beda tergantung batas kategori \(j\). Model ini disebut non-proportional odds model atau generalized ordered logit model.
Jika model seperti ini lebih cocok, maka model cumulative logit tidak boleh digunakan.
Uji Brant
Uji Brant menguji apakah koefisien regresi berbeda secara signifikan antar batas kategori.
Uji Brant membandingkan model ordinal (proportional odds) dengan model multinomial logit dalam bentuk koefisien regresi yang dipisah untuk tiap batas, dan menggunakan uji Wald untuk menguji kesamaan koefisien.
Jika hasil uji menunjukkan p-value < 0.05, maka kita menolak H0 dan menyimpulkan bahwa asumsi paralelisme tidak terpenuhi.
library(MASS)
library(brant)
brant(model_stres)
## ----------------------------------------------------
## Test for X2 df probability
## ----------------------------------------------------
## Omnibus 7.38 3 0.06
## jumlah_mk 2.11 1 0.15
## tidur 5.49 1 0.02
## siap_ujianTidak Siap 0 1 0.95
## ----------------------------------------------------
##
## H0: Parallel Regression Assumption holds
Interpretasi
Uji Omnibus: p-value = 0.06 → lebih besar dari 0.05 → Kita tidak menolak H₀ secara keseluruhan, artinya model masih dapat dianggap memenuhi asumsi proportional odds secara global.
Uji Per Variabel: jumlah_mk → p = 0.15 → asumsi dipenuhi siap_ujianTidak Siap → p = 0.95 → asumsi sangat terpenuhi tidur → p = 0.02 → tidak memenuhi asumsi
Kesimpulan: Secara keseluruhan (uji omnibus), model masih memenuhi asumsi paralelisme. Namun, variabel tidur menunjukkan pelanggaran terhadap asumsi tersebut. Jika ingin model lebih akurat, dapat dipertimbangkan model alternatif seperti partial proportional odds model, terutama jika tidur dianggap variabel penting. Namun, untuk pembelajaran, model Cumulative Logit akan tetap dilanjutkan.
Setelah membangun model cumulative logit dan menguji asumsi paralelisme, langkah selanjutnya adalah menghitung probabilitas bahwa suatu observasi (misalnya mahasiswa tertentu) termasuk ke dalam setiap kategori respon.
# Contoh data mahasiswa baru
data_baru <- data.frame(
jumlah_mk = c(6, 8, 5),
tidur = c(5, 7, 4.5),
siap_ujian = factor(c("Siap", "Tidak Siap", "Tidak Siap"),
levels = levels(data_stres$siap_ujian))
)
# Tampilkan data
data_baru
## jumlah_mk tidur siap_ujian
## 1 6 5.0 Siap
## 2 8 7.0 Tidak Siap
## 3 5 4.5 Tidak Siap
# Prediksi probabilitas tiap kategori stres
predict(model_stres, newdata = data_baru, type = "probs")
## Rendah Sedang Tinggi
## 1 0.2243630 0.4629350 0.3127020
## 2 0.2144023 0.4602594 0.3253383
## 3 0.2542514 0.4672400 0.2785086
Interpretasi
Setelah membangun model cumulative logit dan memprediksi probabilitas, kita perlu mengevaluasi kualitas model secara keseluruhan.
Evaluasi model dilakukan dengan beberapa cara:
Deviance mengukur ketidaksesuaian model terhadap data. Semakin kecil
nilai deviance, semakin baik kecocokan model.
AIC (Akaike Information Criterion) digunakan untuk membandingkan model —
nilai yang lebih rendah menunjukkan model yang lebih baik (dengan
mempertimbangkan kompleksitas model).
# Nilai deviance
model_stres$deviance
## [1] 528.2152
# Nilai AIC
AIC(model_stres)
## [1] 538.2152
Karena regresi logistik tidak memiliki nilai \(R^2\) seperti regresi linear, maka
digunakan ukuran alternatif yaitu pseudo
R-squared.
Salah satu yang paling umum digunakan adalah McFadden’s \(R^2\), dengan rumus sebagai
berikut:
\[ R^2_{\text{McFadden}} = 1 - \frac{\log L_{\text{model}}}{\log L_{\text{null}}} \]
di mana: - \(\log L_{\text{model}}\): log-likelihood dari model penuh (dengan prediktor) - \(\log L_{\text{null}}\): log-likelihood dari model null (hanya intercept)
Nilai McFadden’s \(R^2\) berkisar
antara 0 dan 1.
Sebagai pedoman umum: - \(R^2 <
0.1\) → lemah - \(0.1 \leq R^2 <
0.2\) → moderat - \(R^2 \geq
0.2\) → cukup baik untuk data sosial atau perilaku
# Pseudo R-squared (McFadden)
library(pscl)
pR2(model_stres)
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML
## -2.641076e+02 -2.645624e+02 9.096559e-01 1.719170e-03 3.632012e-03
## r2CU
## 4.129409e-03
Interpretasi Hasil evaluasi menunjukkan bahwa nilai deviance model adalah 528.215 dan AIC-nya 538.215. Nilai-nilai ini bisa digunakan untuk membandingkan model laik. Selain itu, nilai pseudo R-squared McFadden hanya sebesar 0.0017, artinya model ini hanya bisa menjelaskan sebagian sangat kecil dari variasi data tingkat stres.
Model log-linear merupakan salah satu pendekatan statistik yang digunakan untuk menganalisis hubungan antar variabel kategorik dalam bentuk tabel kontingensi. Tidak seperti regresi logistik yang membedakan antara variabel respon dan prediktor, model log-linear memperlakukan semua variabel secara simetris. Artinya, tidak ada variabel yang dianggap sebagai variabel respon atau prediktor secara eksplisit.
Menurut Holt (1979), model log-linear sangat efektif untuk mengevaluasi struktur interaksi antar variabel kategorik dalam tabel kontingensi, terutama ketika data yang dianalisis bersifat multidimensional. Tujuan utama dari model ini adalah untuk menguji apakah terdapat ketergantungan antar variabel serta untuk memeriksa apakah model yang dibangun mampu menjelaskan pola yang terdapat dalam data.
McEvoy dan Richards (2001) menyebutkan bahwa model log-linear cocok digunakan dalam situasi di mana semua variabel bersifat kategorik dan tidak ada variabel yang diperlakukan sebagai variabel dependen. Selain itu, pendekatan ini juga sangat berguna dalam eksplorasi struktur asosiasi dan interaksi di antara dua atau lebih variabel.
Fingleton (1983) menambahkan bahwa model ini termasuk dalam keluarga Generalized Linear Models (GLM) dan biasanya diestimasi menggunakan metode maximum likelihood dengan asumsi distribusi Poisson dan fungsi link logaritma. Model ini sering digunakan dalam berbagai bidang seperti ilmu sosial, epidemiologi, dan riset kesehatan, di mana data kategorik sangat umum dijumpai.
Sebagai gambaran awal, model log-linear biasanya dituliskan dalam bentuk logaritma dari nilai ekspektasi frekuensi. Model ini kemudian dibandingkan dengan data aktual untuk menilai apakah struktur model sesuai dengan pola hubungan dalam data.
Tabel kontingensi adalah cara penyajian data kategorik berdasarkan kombinasi kategori dari dua atau lebih variabel, di mana setiap sel menampilkan frekuensi kejadian untuk kombinasi kategori tersebut (Hazra, 2016).
Contoh Tabel Kontingensi Dua Arah
Misalkan kita memiliki dua variabel:
Maka tabel kontingensi dua arah akan berbentuk sebagai berikut:
Merokok (Ya) | Merokok (Tidak) | Total | |
---|---|---|---|
Laki-laki | \(n_{11}\) | \(n_{12}\) | \(n_{1+}\) |
Perempuan | \(n_{21}\) | \(n_{22}\) | \(n_{2+}\) |
Total | \(n_{+1}\) | \(n_{+2}\) | \(n_{++}\) |
Tabel ini disebut juga tabel frekuensi silang (cross-tabulation).
Notasi Umum
Dalam konteks model log-linear, kita menggunakan:
Untuk tabel tiga arah (variabel A, B, dan C), notasi diperluas menjadi \(n_{ijk}\) dan \(\mu_{ijk}\).
Tujuan Penggunaan Tabel Kontingensi
Untuk dua variabel kategorik \(A\) dan \(B\), dengan masing-masing kategori \(i\) dan \(j\), model log-linear dasar dituliskan sebagai:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
di mana:
Model ini disebut model penuh (saturated) karena mencakup semua komponen: efek utama dan interaksi.
Untuk tiga variabel \(A, B, C\), bentuk umum model log-linear adalah:
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_k^C + \lambda_{ij}^{AB} + \lambda_{ik}^{AC} + \lambda_{jk}^{BC} + \lambda_{ijk}^{ABC} \]
Model ini mencakup:
Sifat Model Log-Linear
Struktur model log-linear dapat disesuaikan tergantung pada asumsi dan hipotesis yang ingin diuji. Model yang lebih sederhana diuji apakah sudah cukup menjelaskan data dibandingkan model yang lebih kompleks.
Analisis log-linear digunakan untuk memahami hubungan antar variabel kategorik dalam bentuk tabel kontingensi. Tujuan utamanya adalah untuk melihat apakah ada ketergantungan atau interaksi antar variabel, dan seberapa kompleks hubungan tersebut.
Beberapa tujuan utama dari analisis log-linear antara lain:
Menguji independensi antar variabel
kategorik
Misalnya: Apakah jenis kelamin berhubungan dengan preferensi
makanan?
Menguji keberadaan interaksi antara dua atau lebih
variabel
Misalnya: Apakah hubungan antara pendidikan dan pekerjaan berbeda
tergantung jenis kelamin?
Membandingkan model dengan struktur yang
berbeda
Dengan melihat apakah model sederhana (misal hanya efek utama) sudah
cukup, atau perlu menambahkan interaksi agar model lebih sesuai dengan
data.
Menentukan model yang paling sesuai berdasarkan:
Membantu menginterpretasikan pola frekuensi dalam tabel yang tidak mudah terlihat hanya dari angka-angka tabel mentah
Model log-linear sangat berguna terutama dalam studi sosial, ekonomi, kesehatan, dan pemasaran, di mana data berbentuk kategorik sering muncul dan tidak selalu memiliki variabel respon yang jelas.
Model log-linear dapat diklasifikasikan berdasarkan komponen efek yang disertakan dalam model. Semakin banyak komponen yang dimasukkan (terutama interaksi), semakin kompleks model tersebut.
Menurut Mair (2007), log‑linear adalah bagian dari Generalized Linear Models yang digunakan untuk menangkap struktur ketergantungan dalam data kontingensi multidimensi. Mair menegaskan bahwa model dapat dibangun secara bertahap.
Model ini hanya menyertakan efek utama, tanpa
interaksi antar variabel.
Contoh untuk dua variabel \(A\) dan
\(B\):
\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B \]
Model ini menyatakan bahwa \(A\) dan
\(B\) saling bebas (tidak saling
bergantung).
Cocok untuk menguji apakah dua variabel independen satu sama lain.
Model ini menyertakan interaksi dua arah antara
sebagian pasangan variabel.
Contoh model parsial untuk tiga variabel \(A,
B, C\):
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_k^C + \lambda_{ij}^{AB} + \lambda_{ik}^{AC} \]
Model ini menyatakan bahwa interaksi hanya terjadi antara \(A\)–\(B\) dan \(A\)–\(C\), tetapi tidak antara \(B\) dan \(C\).
Model parsial berguna jika kita ingin melihat hubungan sebagian antar variabel saja, tanpa mengasumsikan interaksi penuh.
Model ini menyertakan semua efek utama dan semua
interaksi (dua arah, tiga arah, dst.).
Contoh untuk tiga variabel:
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_k^C + \lambda_{ij}^{AB} + \lambda_{ik}^{AC} + \lambda_{jk}^{BC} + \lambda_{ijk}^{ABC} \]
Model ini selalu cocok secara sempurna dengan data, karena tidak ada batasan terhadap struktur hubungan antar variabel. Namun, model saturated tidak efisien secara statistik, dan biasanya tidak digunakan kecuali sebagai pembanding (baseline) untuk menguji model yang lebih sederhana.
Model log-linear cocok digunakan dalam analisis data kategorik ketika:
Perbandingan Singkat
Model | Tujuan Utama | Respon Ditentukan? | Cocok Untuk |
---|---|---|---|
Regresi Logistik | Prediksi variabel respon kategorik | Ya | Biner / Ordinal / Nominal |
Log-Linear | Analisis hubungan antar variabel | Tidak | Semua variabel kategorik |
Model log-linear digunakan untuk menjelaskan hubungan antar dua atau lebih variabel kategorik dalam bentuk tabel kontingensi. Pada tabel dua arah (2×2, 2×3, dll), model log-linear menyatakan frekuensi ekspektasi \(\mu_{ij}\) sebagai fungsi dari efek utama dan interaksi antar variabel.
Misalkan terdapat dua variabel kategorik:
Maka bentuk umum model log-linear dua arah adalah:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
di mana:
Model ini disebut juga model penuh (saturated) karena memasukkan semua komponen yang mungkin. Model saturated akan cocok sempurna dengan data (fit = 100%) dan digunakan sebagai pembanding terhadap model yang lebih sederhana.
Model Independen (Tanpa Interaksi)
Jika kita mengasumsikan bahwa variabel \(A\) dan \(B\) independen, maka komponen interaksi \(\lambda_{ij}^{AB}\) dihilangkan:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B \]
Model ini disebut model independen. Jika model ini cukup baik menjelaskan data (goodness-of-fit tinggi), maka tidak ada interaksi antara \(A\) dan \(B\), artinya keduanya tidak saling bergantung.
Setelah menentukan bentuk umum model log-linear, langkah selanjutnya adalah melakukan estimasi parameter untuk model dua arah. Estimasi ini dilakukan dengan pendekatan Maximum Likelihood Estimation (MLE) dan constraint sum-to-zero, agar parameter dapat diidentifikasi dengan benar.
Model dengan Interaksi
Model penuh (saturated) untuk tabel 2×2 dituliskan sebagai:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
Constraint: Sum-to-Zero
Agar model teridentifikasi, kita tetapkan:
Dengan ini, hanya satu nilai untuk setiap efek yang perlu dihitung. Misalnya, untuk tabel 2×2:
Rumus Estimasi Parameter
Dengan asumsi \(\mu_{ij} = n_{ij}\) pada model saturated, parameter dapat dihitung sebagai:
Parameter lainnya diperoleh dari constraint:
\[ \lambda_2^A = -\lambda_1^A, \quad \lambda_2^B = -\lambda_1^B, \quad \lambda_{12}^{AB} = -\lambda_{11}^{AB}, \quad \lambda_{21}^{AB} = -\lambda_{11}^{AB}, \quad \lambda_{22}^{AB} = \lambda_{11}^{AB} \]
Misalnya, sebuah studi dilakukan untuk melihat hubungan antara jenis pekerjaan (formal vs informal) dan kebiasaan berolahraga (ya vs tidak).
Berikut adalah data hasil observasi dari 100 responden:
Olahraga: Ya | Olahraga: Tidak | Total | |
---|---|---|---|
Formal | 20 | 30 | 50 |
Informal | 10 | 40 | 50 |
Total | 30 | 70 | 100 |
Kita nyatakan:
Variabel \(A\): Jenis Pekerjaan
Variabel \(B\): Kebiasaan Berolahraga
Notasi | Nilai Observasi |
---|---|
\(n_{11}\) | 20 |
\(n_{12}\) | 30 |
\(n_{21}\) | 10 |
\(n_{22}\) | 40 |
Total responden: \(n_{++} = 100\)
Bentuk umum model log-linear dua arah adalah:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
Dengan:
Maka, model spesifik untuk kasus ini dapat dituliskan sebagai:
\[ \begin{aligned} \log(\mu_{11}) &= \lambda + \lambda_1^A + \lambda_1^B + \lambda_{11}^{AB} \\ \log(\mu_{12}) &= \lambda + \lambda_1^A + \lambda_2^B + \lambda_{12}^{AB} \\ \log(\mu_{21}) &= \lambda + \lambda_2^A + \lambda_1^B + \lambda_{21}^{AB} \\ \log(\mu_{22}) &= \lambda + \lambda_2^A + \lambda_2^B + \lambda_{22}^{AB} \\ \end{aligned} \]
Untuk memperkirakan parameter-parameter ini secara manual, kita akan menggunakan constraint sum-to-zero, yaitu:
Constraint ini memastikan bahwa efek parameter merepresentasikan deviasi dari rata-rata dan membuat model teridentifikasi.
Kita akan menghitung parameter model log-linear dengan interaksi berdasarkan data 2×2 berikut:
Jenis Pekerjaan | Olahraga: Ya (\(j=1\)) | Olahraga: Tidak (\(j=2\)) | Jumlah |
---|---|---|---|
Formal (\(i=1\)) | \(n_{11} = 20\) | \(n_{12} = 30\) | 50 |
Informal (\(i=2\)) | \(n_{21} = 10\) | \(n_{22} = 40\) | 50 |
Total observasi:
\(n_{++} = 100\)
Langkah 1: Hitung Rata-rata log frekuensi sel
\[ \begin{aligned} \log(\mu_{11}) &= \log(20) = 2.996 \\ \log(\mu_{12}) &= \log(30) = 3.401 \\ \log(\mu_{21}) &= \log(10) = 2.303 \\ \log(\mu_{22}) &= \log(40) = 3.689 \\ \end{aligned} \]
\[ \bar{\log \mu} = \frac{1}{4} \left( \log(\mu_{11}) + \log(\mu_{12}) + \log(\mu_{21}) + \log(\mu_{22}) \right) = \frac{1}{4}(2.996 + 3.401 + 2.303 + 3.689) = \frac{12.389}{4} = 3.097 \]
Rata-rata ini akan digunakan untuk menghitung intercept \(\lambda\), yaitu:
\[ \lambda = \bar{\log \mu} = 3.097 \]
Langkah 2: Hitung parameter utama
Efek utama variabel A: \[ \lambda_1^A = \frac{1}{2} \left[ \log(\mu_{11}) + \log(\mu_{12}) - \log(\mu_{21}) - \log(\mu_{22}) \right] = \frac{1}{2} (2.996 + 3.401 - 2.303 - 3.689) = \frac{1}{2} (0.405) = 0.202 \]
Efek utama variabel B: \[ \lambda_1^B = \frac{1}{2} \left[ \log(\mu_{11}) + \log(\mu_{21}) - \log(\mu_{12}) - \log(\mu_{22}) \right] = \frac{1}{2} (2.996 + 2.303 - 3.401 - 3.689) = \frac{1}{2} (-1.791) = -0.895 \]
Efek interaksi: \[ \lambda_{11}^{AB} = \frac{1}{4} \left[ \log(\mu_{12}) - \log(\mu_{11}) - \log(\mu_{22}) + \log(\mu_{21}) \right] = \frac{1}{4} (3.401 - 2.996 - 3.689 + 2.303) = \frac{1}{4} (-0.981) = -0.245 \]
Langkah 3: Gunakan constraint untuk lengkapi semua parameter
\[ \begin{aligned} \lambda_2^A &= -\lambda_1^A = -0.202 \\ \lambda_2^B &= -\lambda_1^B = 0.895 \\ \lambda_{12}^{AB} &= -\lambda_{11}^{AB} = 0.245 \\ \lambda_{21}^{AB} &= -\lambda_{11}^{AB} = 0.245 \\ \lambda_{22}^{AB} &= \lambda_{11}^{AB} = -0.245 \\ \end{aligned} \]
Ringkasan Estimasi Parameter
Parameter | Nilai |
---|---|
\(\lambda_1^A\) | 0.202 |
\(\lambda_2^A\) | -0.202 |
\(\lambda_1^B\) | -0.895 |
\(\lambda_2^B\) | 0.895 |
\(\lambda_{11}^{AB}\) | -0.245 |
\(\lambda_{12}^{AB}\) | 0.245 |
\(\lambda_{21}^{AB}\) | 0.245 |
\(\lambda_{22}^{AB}\) | -0.245 |
Interpretasi Awal
Untuk tabel 2×2, kita dapat mengukur kekuatan asosiasi antara dua variabel kategorik menggunakan Odds Ratio (OR).
\[ OR = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}} = \frac{20 \times 40}{30 \times 10} = \frac{800}{300} = 2.67 \]
Log Odds Ratio
\[ \log(OR) = \log\left( \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}} \right) = \log\left( \frac{20 \cdot 40}{30 \cdot 10} \right) = \log\left( \frac{800}{300} \right) = \log(2.67) \approx 0.981 \]
Standard Error (SE) dari log(OR)
\[ SE_{\log(OR)} = \sqrt{ \frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}} } = \sqrt{ \frac{1}{20} + \frac{1}{30} + \frac{1}{10} + \frac{1}{40} } = \sqrt{0.05 + 0.033 + 0.1 + 0.025} = \sqrt{0.208} \approx 0.456 \]
Confidence Interval untuk log(OR)
Menggunakan CI 95%:
\[ \log(OR) \pm Z_{0.975} \cdot SE_{\log(OR)} = 0.981 \pm 1.96 \cdot 0.456 = 0.981 \pm 0.894 \]
\[ \Rightarrow \text{Lower} = 0.087, \quad \text{Upper} = 1.875 \]
Confidence Interval untuk OR
Lakukan eksponensial untuk mengubah kembali ke skala OR:
\[ CI_{OR} = \left( e^{0.087},\ e^{1.875} \right) = (1.091,\ 6.520) \]
Interpretasi
Data
# Matriks frekuensi 2x2
tabel <- matrix(c(20, 30,
10, 40),
nrow = 2,
byrow = TRUE)
colnames(tabel) <- c("Ya", "Tidak")
rownames(tabel) <- c("Formal", "Informal")
tabel
## Ya Tidak
## Formal 20 30
## Informal 10 40
# Konversi ke data frame
data <- as.data.frame(as.table(tabel))
colnames(data) <- c("Pekerjaan", "Olahraga", "Freq")
data
## Pekerjaan Olahraga Freq
## 1 Formal Ya 20
## 2 Informal Ya 10
## 3 Formal Tidak 30
## 4 Informal Tidak 40
Model Tanpa Interaksi
# Hanya efek utama
fit_no_inter <- glm(Freq ~ Pekerjaan + Olahraga,
family = poisson, data = data)
summary(fit_no_inter)
##
## Call:
## glm(formula = Freq ~ Pekerjaan + Olahraga, family = poisson,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.708e+00 2.082e-01 13.009 < 2e-16 ***
## PekerjaanInformal 6.522e-14 2.000e-01 0.000 1.000000
## OlahragaTidak 8.473e-01 2.182e-01 3.883 0.000103 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 21.2880 on 3 degrees of freedom
## Residual deviance: 4.8315 on 1 degrees of freedom
## AIC: 30.606
##
## Number of Fisher Scoring iterations: 4
Interpretasi
Model ini hanya mempertimbangkan efek utama dari Pekerjaan dan Olahraga.
Model Dengan Interaksi
fit_inter <- glm(Freq ~ Pekerjaan * Olahraga,
family = poisson, data = data)
summary(fit_inter)
##
## Call:
## glm(formula = Freq ~ Pekerjaan * Olahraga, family = poisson,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.9957 0.2236 13.397 <2e-16 ***
## PekerjaanInformal -0.6931 0.3873 -1.790 0.0735 .
## OlahragaTidak 0.4055 0.2887 1.405 0.1601
## PekerjaanInformal:OlahragaTidak 0.9808 0.4564 2.149 0.0316 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2.1288e+01 on 3 degrees of freedom
## Residual deviance: 4.4409e-16 on 0 degrees of freedom
## AIC: 27.775
##
## Number of Fisher Scoring iterations: 3
Interpretasi
Model ini memasukkan interaksi antara Pekerjaan dan Olahraga.
Jadi, model dengan interaksi lebih baik karena deviasi sangat kecil, AIC lebih rendah, dan ada interaksi signifikan antara Pekerjaan dan Olahraga. Artinya hubungan antara jenis pekerjaan dan kebiasaan olahraga tidak bersifat independen. Kombinasi tertentu (misalnya Informal + Tidak Olahraga) lebih banyak terjadi dari yang diperkirakan oleh efek utama saja.
Kita akan menganalisis hubungan antara jenis pekerjaan (Formal, Informal) dan kebiasaan berolahraga (Rutin, Kadang, Tidak) dalam tabel kontingensi 2×3 berikut:
Pekerjaan | Rutin | Kadang | Tidak |
---|---|---|---|
Formal | 15 | 5 | 30 |
Informal | 5 | 5 | 40 |
\(A\): Jenis Pekerjaan
\(B\): Kebiasaan Olahraga
Bentuk umum model log-linear dua arah:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
Dengan: - \(i = 1,2\) untuk kategori Pekerjaan (A) - \(j = 1,2,3\) untuk kategori Olahraga (B)
Model ini adalah model penuh (saturated), karena mencakup semua efek utama dan interaksi.
Jika kita ingin menguji model independen (tanpa interaksi), bentuknya menjadi:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B \]
Data
# Buat data tabel 2x3
tabel <- matrix(c(15, 5, 30,
5, 5, 40),
nrow = 2,
byrow = TRUE)
colnames(tabel) <- c("Rutin", "Kadang", "Tidak")
rownames(tabel) <- c("Formal", "Informal")
tabel
## Rutin Kadang Tidak
## Formal 15 5 30
## Informal 5 5 40
# Konversi ke data frame
data <- as.data.frame(as.table(tabel))
colnames(data) <- c("Pekerjaan", "Olahraga", "Freq")
data
## Pekerjaan Olahraga Freq
## 1 Formal Rutin 15
## 2 Informal Rutin 5
## 3 Formal Kadang 5
## 4 Informal Kadang 5
## 5 Formal Tidak 30
## 6 Informal Tidak 40
Model Tanpa Interaksi
fit_no_inter <- glm(Freq ~ Pekerjaan + Olahraga,
family = poisson, data = data)
summary(fit_no_inter)
##
## Call:
## glm(formula = Freq ~ Pekerjaan + Olahraga, family = poisson,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.303e+00 2.449e-01 9.400 < 2e-16 ***
## PekerjaanInformal 1.707e-11 2.000e-01 0.000 1.0000
## OlahragaKadang -6.931e-01 3.873e-01 -1.790 0.0735 .
## OlahragaTidak 1.253e+00 2.535e-01 4.941 7.77e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 66.025 on 5 degrees of freedom
## Residual deviance: 6.666 on 2 degrees of freedom
## AIC: 40.44
##
## Number of Fisher Scoring iterations: 4
Interpretasi
Model ini hanya menyertakan efek utama dari Pekerjaan dan Olahraga.
Model dengan Interaksi
fit_inter <- glm(Freq ~ Pekerjaan * Olahraga,
family = poisson, data = data)
summary(fit_inter)
##
## Call:
## glm(formula = Freq ~ Pekerjaan * Olahraga, family = poisson,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.7081 0.2582 10.488 <2e-16 ***
## PekerjaanInformal -1.0986 0.5164 -2.127 0.0334 *
## OlahragaKadang -1.0986 0.5164 -2.127 0.0334 *
## OlahragaTidak 0.6931 0.3162 2.192 0.0284 *
## PekerjaanInformal:OlahragaKadang 1.0986 0.8165 1.346 0.1785
## PekerjaanInformal:OlahragaTidak 1.3863 0.5701 2.432 0.0150 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 6.6025e+01 on 5 degrees of freedom
## Residual deviance: -1.5543e-15 on 0 degrees of freedom
## AIC: 37.774
##
## Number of Fisher Scoring iterations: 3
Interpretasi
Jadi, model dengan interaksi lebih baik karena fit sempurna (deviance ≈ 0), AIC lebih rendah, serta terdapat interaksi signifikan antara jenis pekerjaan dan intensitas olahraga.
Model log-linear tiga arah digunakan untuk menganalisis hubungan antara tiga variabel kategorik dalam bentuk tabel kontingensi tiga dimensi.
Misalkan terdapat tiga variabel kategorik:
Maka frekuensi ekspektasi \(\mu_{ijk}\) dimodelkan dengan:
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} + \lambda_{ijk}^{XYZ} \]
Bentuk-Bentuk Model Log-Linear Tiga Arah
Berikut adalah beberapa bentuk model log-linear tiga arah yang umum digunakan:
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} + \lambda_{ijk}^{XYZ} \]
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \]
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} \]
Tidak ada efek \(\lambda_{jk}^{YZ}\)
Mengasumsikan Y dan Z independen jika X tetap
Ada 3 kemungkinan model conditional independence tergantung variabel mana yang dikondisikan:
\(Y \perp Z \,|\, X\)
\(X \perp Z \,|\, Y\)
\(X \perp Y \,|\, Z\)
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{jk}^{YZ} \]
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z \]
Dalam model log-linear tiga arah, pengujian interaksi dilakukan untuk mengetahui apakah hubungan antar variabel melibatkan efek gabungan dari dua atau tiga variabel sekaligus. Tujuan utama dari pengujian ini adalah untuk menentukan model terbaik yang paling sesuai untuk menggambarkan struktur ketergantungan antara ketiga variabel kategorik.
Jenis Pengujian Interaksi
Pengujian dilakukan terhadap beberapa model, yaitu:
Uji Interaksi Tiga Arah
Uji Interaksi Dua Arah (Conditional Association)
Pengujian dilakukan dengan membandingkan nilai deviance antar model dan menggunakan uji Chi-Square terhadap selisih deviance.
Misalnya, sebuah survei dilakukan terhadap 120 responden untuk mengetahui hubungan antara:
Berikut adalah data hasil pengamatan dalam bentuk tabel kontingensi 2×2×2:
Jenis Kelamin | Merokok | Sakit | Sehat | Total |
---|---|---|---|---|
Laki-laki | Ya | 20 | 10 | 30 |
Laki-laki | Tidak | 5 | 25 | 30 |
Perempuan | Ya | 10 | 5 | 15 |
Perempuan | Tidak | 5 | 40 | 45 |
Total responden = 120
Input Data
# Load pustaka yang digunakan
library(epitools)
library(DescTools)
library(lawstat)
# Masukkan data
x.jk <- factor(rep(c("1M", "2F"), each = 4))
y.rokok <- factor(rep(c("1Ya", "2Tdk"), each = 2, times = 2))
z.kesehatan <- factor(rep(c("1Skt", "2Sht"), times = 4))
counts <- c(
20, 10, # 1M 1Ya 1Skt, 2Sht
5, 25, # 1M 2Tdk 1Skt, 2Sht
10, 5, # 2F 1Ya 1Skt, 2Sht
5, 40 # 2F 2Tdk 1Skt, 2Sht
)
data <- data.frame(
Jenis_Kelamin = x.jk,
Merokok = y.rokok,
Kesehatan = z.kesehatan,
Frekuensi = counts
)
data
## Jenis_Kelamin Merokok Kesehatan Frekuensi
## 1 1M 1Ya 1Skt 20
## 2 1M 1Ya 2Sht 10
## 3 1M 2Tdk 1Skt 5
## 4 1M 2Tdk 2Sht 25
## 5 2F 1Ya 1Skt 10
## 6 2F 1Ya 2Sht 5
## 7 2F 2Tdk 1Skt 5
## 8 2F 2Tdk 2Sht 40
# Bentuk tabel 3 dimensi
table3d <- xtabs(Frekuensi ~ Jenis_Kelamin + Merokok + Kesehatan, data = data)
ftable(table3d)
## Kesehatan 1Skt 2Sht
## Jenis_Kelamin Merokok
## 1M 1Ya 20 10
## 2Tdk 5 25
## 2F 1Ya 10 5
## 2Tdk 5 40
Model saturated merupakan model log-linear paling kompleks yang mencakup seluruh efek:
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} + \lambda_{ijk}^{XYZ} \]
Penentuan Kategori Referensi
Untuk membentuk model saturated dengan glm()
, R akan
menetapkan kategori pertama dari setiap faktor sebagai
referensi:
Fitting Model Saturated
# Model saturated: semua interaksi 3 arah
fit_saturated <- glm(Frekuensi ~ Jenis_Kelamin * Merokok * Kesehatan,
family = poisson(link="log"), data = data)
summary(fit_saturated)
##
## Call:
## glm(formula = Frekuensi ~ Jenis_Kelamin * Merokok * Kesehatan,
## family = poisson(link = "log"), data = data)
##
## Coefficients:
## Estimate Std. Error z value
## (Intercept) 2.996e+00 2.236e-01 13.397
## Jenis_Kelamin2F -6.931e-01 3.873e-01 -1.790
## Merokok2Tdk -1.386e+00 5.000e-01 -2.773
## Kesehatan2Sht -6.931e-01 3.873e-01 -1.790
## Jenis_Kelamin2F:Merokok2Tdk 6.931e-01 7.416e-01 0.935
## Jenis_Kelamin2F:Kesehatan2Sht -1.565e-15 6.708e-01 0.000
## Merokok2Tdk:Kesehatan2Sht 2.303e+00 6.245e-01 3.687
## Jenis_Kelamin2F:Merokok2Tdk:Kesehatan2Sht 4.700e-01 9.566e-01 0.491
## Pr(>|z|)
## (Intercept) < 2e-16 ***
## Jenis_Kelamin2F 0.073502 .
## Merokok2Tdk 0.005561 **
## Kesehatan2Sht 0.073502 .
## Jenis_Kelamin2F:Merokok2Tdk 0.349974
## Jenis_Kelamin2F:Kesehatan2Sht 1.000000
## Merokok2Tdk:Kesehatan2Sht 0.000227 ***
## Jenis_Kelamin2F:Merokok2Tdk:Kesehatan2Sht 0.623179
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 6.6338e+01 on 7 degrees of freedom
## Residual deviance: -7.5495e-15 on 0 degrees of freedom
## AIC: 50.192
##
## Number of Fisher Scoring iterations: 3
Interpretasi
Model saturated selalu fit sempurna dengan data karena mencakup semua interaksi. Beberapa efek signifikan, yaitu Merokok2Tdk (utama), Merokok2Tdk × Kesehatan2Sht (dua arah). Namun, Interaksi tiga arah tidak signifikan.
Model homogenous adalah model log-linear yang memuat:
Bentuk Model
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \]
Model ini mengasumsikan bahwa struktur asosiasi dua arah konsisten di seluruh level variabel ketiga. Dalam hal ini hubungan Jenis Kelamin, Merokok, dan Kesehatan hanya terdiri dari efek dua arah.
Fitting Model Homogenous
# Model homogenous: tanpa interaksi tiga arah
fit_homogenous <- glm(Frekuensi ~ Jenis_Kelamin * Merokok +
Jenis_Kelamin * Kesehatan +
Merokok * Kesehatan,
family = poisson (link = "log"), data = data)
summary(fit_homogenous)
##
## Call:
## glm(formula = Frekuensi ~ Jenis_Kelamin * Merokok + Jenis_Kelamin *
## Kesehatan + Merokok * Kesehatan, family = poisson(link = "log"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.0212 0.2148 14.066 < 2e-16 ***
## Jenis_Kelamin2F -0.7716 0.3578 -2.156 0.031071 *
## Merokok2Tdk -1.5206 0.4365 -3.483 0.000495 ***
## Kesehatan2Sht -0.7716 0.3578 -2.156 0.031071 *
## Jenis_Kelamin2F:Merokok2Tdk 0.9786 0.4644 2.107 0.035079 *
## Jenis_Kelamin2F:Kesehatan2Sht 0.2296 0.4767 0.482 0.630112
## Merokok2Tdk:Kesehatan2Sht 2.5103 0.4752 5.283 1.27e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 66.33793 on 7 degrees of freedom
## Residual deviance: 0.24219 on 1 degrees of freedom
## AIC: 48.435
##
## Number of Fisher Scoring iterations: 3
Interpretasi
Model homogenous fit dengan sangat baik dan lebih efisien dari model saturated. Hanya efek interaksi Jenis Kelamin dan Kesehatan yang tidak signifikan.
Hipotesis
\[ \begin{aligned} H_0 &: \text{Tidak ada interaksi tiga arah (model homogenous cukup)} \\ H_1 &: \text{Ada interaksi tiga arah (model saturated lebih baik)} \end{aligned} \]
Perhitungan Selisih Deviance dan Derajat Bebas
# Selisih deviance dan derajat bebas
G2_diff <- deviance(fit_homogenous) - deviance(fit_saturated)
df_diff <- df.residual(fit_homogenous) - df.residual(fit_saturated)
G2_diff
## [1] 0.2421889
df_diff
## [1] 1
Chi-Square Tabel
# Nilai kritis chi-square dengan α = 0.05
chi_critical <- qchisq(0.95, df = df_diff)
chi_critical
## [1] 3.841459
Keputusan Uji
Keputusan <- ifelse(G2_diff <= chi_critical, "Terima H0", "Tolak H0")
Keputusan
## [1] "Terima H0"
Kesimpulan Karena selisih deviance tidak signifikan, maka model homogenous cukup menjelaskan data. Interaksi tiga arah tidak diperlukan sehingga model homogenous dipertahankan.
Model ini disebut juga conditional association on X, karena hanya memuat interaksi antara Merokok dan Kesehatan (Y:Z) tergantung pada Jenis Kelamin (X). Dengan kata lain, kita menguji apakah hubungan antara Merokok dan Kesehatan bervariasi pada setiap level Jenis Kelamin.
Bentuk Model
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} \]
→ Tidak ada efek interaksi tiga arah
→ Tidak ada interaksi YZ (Y dan Z tergantung X)
Fitting Model Conditional on X di R
fit_condX <- glm(Frekuensi ~ Jenis_Kelamin * Merokok +
Jenis_Kelamin * Kesehatan,
family = poisson(link = "log"), data = data)
summary(fit_condX)
##
## Call:
## glm(formula = Frekuensi ~ Jenis_Kelamin * Merokok + Jenis_Kelamin *
## Kesehatan, family = poisson(link = "log"), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.526e+00 2.380e-01 10.610 < 2e-16 ***
## Jenis_Kelamin2F -1.204e+00 4.163e-01 -2.892 0.00383 **
## Merokok2Tdk 6.351e-16 2.582e-01 0.000 1.00000
## Kesehatan2Sht 3.365e-01 2.619e-01 1.285 0.19882
## Jenis_Kelamin2F:Merokok2Tdk 1.099e+00 3.944e-01 2.785 0.00534 **
## Jenis_Kelamin2F:Kesehatan2Sht 7.621e-01 3.968e-01 1.921 0.05478 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 66.338 on 7 degrees of freedom
## Residual deviance: 33.269 on 2 degrees of freedom
## AIC: 79.461
##
## Number of Fisher Scoring iterations: 5
Interpretasi
Model ini tidak memasukkan interaksi antara Merokok dan Kesehatan. Ada beberapa efek signifikan yaitu Jenis kelamin dan interaksi jenis kelamin dengan merokok.
Hipotesis
\[ \begin{aligned} H_0 &: \text{Model conditional on X cukup (tidak ada interaksi antara Y dan Z)} \\ H_1 &: \text{Model homogenous lebih baik (ada interaksi antara Y dan Z)} \end{aligned} \]
Perhitungan Selisih Deviance
# Selisih deviance dan derajat bebas
G2_diff_X <- deviance(fit_condX) - deviance(fit_homogenous)
df_diff_X <- df.residual(fit_condX) - df.residual(fit_homogenous)
G2_diff_X
## [1] 33.02638
df_diff_X
## [1] 1
Chi-Square Tabel
# Nilai kritis dengan alpha = 0.05
chi_critical_X <- qchisq(0.95, df = df_diff_X)
chi_critical_X
## [1] 3.841459
Keputusan Uji
# Keputusan
keputusan_X <- ifelse(G2_diff_X <= chi_critical_X, "Terima H0", "Tolak H0")
keputusan_X
## [1] "Tolak H0"
Kesimpulan Artinya, model conditional on X tidak cukup. Ada Interaksi antara Merokok dan Kesehatan. Model homogenous lebih baik dan tetap dipertahankan.
Model ini disebut juga conditional association on Y, karena mempertahankan interaksi dua arah Jenis Kelamin × Merokok dan Merokok × Kesehatan, tetapi tidak memuat interaksi Jenis Kelamin × Kesehatan (X × Z).
Bentuk Model
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{jk}^{YZ} \]
→ Tidak ada interaksi antara X dan Z
→ Tidak ada interaksi tiga arah
Fitting Model Conditional on Y di R
fit_condY <- glm(Frekuensi ~ Jenis_Kelamin * Merokok +
Merokok * Kesehatan,
family = poisson(link = "log"), data = data)
summary(fit_condY)
##
## Call:
## glm(formula = Frekuensi ~ Jenis_Kelamin * Merokok + Merokok *
## Kesehatan, family = poisson(link = "log"), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.9957 0.2108 14.210 < 2e-16 ***
## Jenis_Kelamin2F -0.6931 0.3162 -2.192 0.02839 *
## Merokok2Tdk -1.6094 0.4055 -3.969 7.22e-05 ***
## Kesehatan2Sht -0.6931 0.3162 -2.192 0.02839 *
## Jenis_Kelamin2F:Merokok2Tdk 1.0986 0.3944 2.785 0.00534 **
## Merokok2Tdk:Kesehatan2Sht 2.5649 0.4641 5.527 3.26e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 66.33793 on 7 degrees of freedom
## Residual deviance: 0.47261 on 2 degrees of freedom
## AIC: 46.665
##
## Number of Fisher Scoring iterations: 4
Interpretasi
Model ini mengasumsikan interaksi X × Z (Jenis Kelamin × Kesehatan) tidak diperlukan. Semua efek signifikan.
Hipotesis
\[ \begin{aligned} H_0 &: \text{Model conditional on Y cukup (tidak ada interaksi antara X dan Z)} \\ H_1 &: \text{Model homogenous lebih baik (ada interaksi antara X dan Z)} \end{aligned} \]
Perhitungan Selisih Deviance
# Selisih deviance dan derajat bebas
G2_diff_Y <- deviance(fit_condY) - deviance(fit_homogenous)
df_diff_Y <- df.residual(fit_condY) - df.residual(fit_homogenous)
G2_diff_Y
## [1] 0.23042
df_diff_Y
## [1] 1
Chi-square Tabel
# Nilai kritis dengan alpha = 0.05
chi_critical_Y <- qchisq(0.95, df = df_diff_Y)
chi_critical_Y
## [1] 3.841459
Keputusan Uji
# Keputusan
keputusan_Y <- ifelse(G2_diff_Y <= chi_critical_Y, "Terima H0", "Tolak H0")
keputusan_Y
## [1] "Terima H0"
Kesimpulan Model conditional on Y cukup. Tidak perlu memasukkan interaksi antara Jenis Kelamin dan Kesehatan (X × Z).
Model ini disebut juga conditional association on Z, karena mempertahankan interaksi antara Jenis Kelamin × Kesehatan serta Merokok × Kesehatan. Namun, tidak menyertakan interaksi antara Jenis Kelamin × Merokok.
Bentuk Model
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \]
→ Tidak ada efek interaksi antara X dan Y
→ Tidak ada interaksi tiga arah
Fitting Model Conditional on Z di R
fit_condZ <- glm(Frekuensi ~ Jenis_Kelamin * Kesehatan +
Merokok * Kesehatan,
family = poisson(link = "log"), data = data)
summary(fit_condZ)
##
## Call:
## glm(formula = Frekuensi ~ Jenis_Kelamin * Kesehatan + Merokok *
## Kesehatan, family = poisson(link = "log"), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.9312 0.2198 13.333 < 2e-16 ***
## Jenis_Kelamin2F -0.5108 0.3266 -1.564 0.11780
## Kesehatan2Sht -1.0498 0.3620 -2.900 0.00373 **
## Merokok2Tdk -1.0986 0.3651 -3.009 0.00262 **
## Jenis_Kelamin2F:Kesehatan2Sht 0.7621 0.3968 1.921 0.05478 .
## Kesehatan2Sht:Merokok2Tdk 2.5649 0.4641 5.527 3.26e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 66.3379 on 7 degrees of freedom
## Residual deviance: 4.8099 on 2 degrees of freedom
## AIC: 51.002
##
## Number of Fisher Scoring iterations: 4
Interpretasi
(Intercept) = 2.9312
→ Ini adalah \(\log(\mu)\) untuk
kategori referensi:
Laki-laki, Merokok, dan Sakit \[
\mu = e^{2.9312} \approx 18.74
\]
Jenis_Kelamin2F = –0.5108, tidak signifikan
(p = 0.118)
→ Perempuan memiliki kecenderungan frekuensi sekitar 0.6 kali dari
laki-laki. \[
e^{-0.5108} \approx 0.6
\]
Namun tidak signifikan secara statistik
Kesehatan2Sht = –1.0498, signifikan (p =
0.0037)
→ Status sehat menurunkan frekuensi dibanding sakit, yaitu 0.35. \[
e^{-1.0498} \approx 0.35
\]
Merokok2Tdk = –1.0986, signifikan (p =
0.0026)
→ Tidak merokok menurunkan frekuensi dibanding merokok, yaitu 0.33 kali.
\[
e^{-1.0986} \approx 0.33
\]
Jenis_Kelamin2F × Kesehatan2Sht = 0.7621,
marginal signifikan (p = 0.055)
→ Perempuan yang sehat memiliki frekuensi relatif lebih tinggi dari yang
diprediksi oleh efek utama saja, yaitu sebesar 2.14 kali. \[
e^{0.7621} \approx 2.14
\]
Merokok2Tdk × Kesehatan2Sht = 2.5649, sangat
signifikan (p < 0.001)
→ Responden yang sehat dan tidak merokok memiliki frekuensi sangat
tinggi, yaitu 13 kali dari yang diperkirakan efek utama. \[
e^{2.5649} \approx 13
\]
Residual Deviance = 4.81, df = 2
AIC = 51.002 → Lebih tinggi dari:
Model ini mengasumsikan bahwa interaksi antara Jenis Kelamin
dan Merokok tidak diperlukan.
Sebagian besar efek utama dan interaksi yang dipertahankan adalah
signifikan.
Hipotesis
\[ \begin{aligned} H_0 &: \text{Model conditional on Z cukup (tidak ada interaksi antara X dan Y)} \\ H_1 &: \text{Model homogenous lebih baik (ada interaksi antara X dan Y)} \end{aligned} \]
Perhitungan Selisih Deviance
# Selisih deviance dan derajat bebas
G2_diff_Z <- deviance(fit_condZ) - deviance(fit_homogenous)
df_diff_Z <- df.residual(fit_condZ) - df.residual(fit_homogenous)
G2_diff_Z
## [1] 4.567727
df_diff_Z
## [1] 1
Chi-square Tabel
# Nilai kritis dengan alpha = 0.05
chi_critical_Z <- qchisq(0.95, df = df_diff_Z)
chi_critical_Z
## [1] 3.841459
Keputusan Uji
# Keputusan
keputusan_Z <- ifelse(G2_diff_Z <= chi_critical_Z, "Terima H0", "Tolak H0")
keputusan_Z
## [1] "Tolak H0"
Kesimpulan Model conditional on Z tidak cukup. Ada Interaksi antara Jenis Kelamin dan Merokok. Model homogenous lebih baik dan tetap dipertahankan.
# Buat ringkasan deviance dan AIC untuk semua model
model_summary <- data.frame(
Model = c(
"Saturated",
"Homogenous",
"Conditional on X",
"Conditional on Y",
"Conditional on Z"
),
Parameter = c(
length(coef(fit_saturated)),
length(coef(fit_homogenous)),
length(coef(fit_condX)),
length(coef(fit_condY)),
length(coef(fit_condZ))
),
Deviance = c(
deviance(fit_saturated),
deviance(fit_homogenous),
deviance(fit_condX),
deviance(fit_condY),
deviance(fit_condZ)
),
DF = c(
df.residual(fit_saturated),
df.residual(fit_homogenous),
df.residual(fit_condX),
df.residual(fit_condY),
df.residual(fit_condZ)
),
AIC = c(
AIC(fit_saturated),
AIC(fit_homogenous),
AIC(fit_condX),
AIC(fit_condY),
AIC(fit_condZ)
)
)
model_summary
## Model Parameter Deviance DF AIC
## 1 Saturated 8 -7.549517e-15 0 50.19234
## 2 Homogenous 7 2.421889e-01 1 48.43453
## 3 Conditional on X 6 3.326857e+01 2 79.46092
## 4 Conditional on Y 6 4.726089e-01 2 46.66495
## 5 Conditional on Z 6 4.809916e+00 2 51.00226
# Ringkasan uji perbandingan antar model
uji_ringkasan <- data.frame(
Interaksi = c(
"XYZ",
"YZ",
"XZ",
"XY"
),
Model_Pembanding = c(
"Homogenous vs Saturated",
"Conditional on X vs Homogenous",
"Conditional on Y vs Homogenous",
"Conditional on Z vs Homogenous"
),
G2 = c(
deviance(fit_homogenous) - deviance(fit_saturated),
deviance(fit_condX) - deviance(fit_homogenous),
deviance(fit_condY) - deviance(fit_homogenous),
deviance(fit_condZ) - deviance(fit_homogenous)
),
df = c(
df.residual(fit_homogenous) - df.residual(fit_saturated),
df.residual(fit_condX) - df.residual(fit_homogenous),
df.residual(fit_condY) - df.residual(fit_homogenous),
df.residual(fit_condZ) - df.residual(fit_homogenous)
)
)
# Hitung nilai chi-square tabel dan keputusan
uji_ringkasan$Chi_Tabel <- qchisq(0.95, df = uji_ringkasan$df)
uji_ringkasan$Keputusan <- ifelse(uji_ringkasan$G2 <= uji_ringkasan$Chi_Tabel, "Terima H0", "Tolak H0")
uji_ringkasan
## Interaksi Model_Pembanding G2 df Chi_Tabel Keputusan
## 1 XYZ Homogenous vs Saturated 0.2421889 1 3.841459 Terima H0
## 2 YZ Conditional on X vs Homogenous 33.0263840 1 3.841459 Tolak H0
## 3 XZ Conditional on Y vs Homogenous 0.2304200 1 3.841459 Terima H0
## 4 XY Conditional on Z vs Homogenous 4.5677270 1 3.841459 Tolak H0
Berdasarkan hasil analisis dan pengujian yang telah dilakukan:
Model saturated tidak dipilih karena terlalu kompleks (fit sempurna tapi parameter banyak)
Model homogenous memberikan fit yang sangat baik dan menjelaskan struktur data secara menyeluruh
Dari pengujian interaksi:
Jadi, model conditional on Y adalah model terbaik, karena:
Berdasarkan analisis yang telah dilakukan, model terbaik yang dipilih adalah model conditional on Y. Model ini mempertahankan interaksi antara Jenis Kelamin (X) dan Merokok (Y) serta Merokok (Y) dan Kesehatan (Z). Namun tidak menyertakan interaksi antara Jenis Kelamin (X) dan Kesehatan (Z), karena tidak signifikan.
Bentuk Model:
\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{jk}^{YZ} \]
summary(fit_condY)
##
## Call:
## glm(formula = Frekuensi ~ Jenis_Kelamin * Merokok + Merokok *
## Kesehatan, family = poisson(link = "log"), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.9957 0.2108 14.210 < 2e-16 ***
## Jenis_Kelamin2F -0.6931 0.3162 -2.192 0.02839 *
## Merokok2Tdk -1.6094 0.4055 -3.969 7.22e-05 ***
## Kesehatan2Sht -0.6931 0.3162 -2.192 0.02839 *
## Jenis_Kelamin2F:Merokok2Tdk 1.0986 0.3944 2.785 0.00534 **
## Merokok2Tdk:Kesehatan2Sht 2.5649 0.4641 5.527 3.26e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 66.33793 on 7 degrees of freedom
## Residual deviance: 0.47261 on 2 degrees of freedom
## AIC: 46.665
##
## Number of Fisher Scoring iterations: 4
Interpretasi
Model ini mengasumsikan interaksi X × Z (Jenis Kelamin × Kesehatan) tidak diperlukan. Semua efek signifikan.
# Tampilkan nilai dugaan (fitted values) dari model terbaik
fitted_values <- fitted(fit_condY)
fitted_values
## 1 2 3 4 5 6 7 8
## 20 10 4 26 10 5 6 39
Gabungkan dengan Data Asli
data_dugaan <- data
data_dugaan$Dugaan <- round(fitted(fit_condY), 2)
data_dugaan
## Jenis_Kelamin Merokok Kesehatan Frekuensi Dugaan
## 1 1M 1Ya 1Skt 20 20
## 2 1M 1Ya 2Sht 10 10
## 3 1M 2Tdk 1Skt 5 4
## 4 1M 2Tdk 2Sht 25 26
## 5 2F 1Ya 1Skt 10 10
## 6 2F 1Ya 2Sht 5 5
## 7 2F 2Tdk 1Skt 5 6
## 8 2F 2Tdk 2Sht 40 39
Interpretasi
Tingkat pendidikan merupakan salah satu indikator penting dalam menilai kualitas sumber daya manusia suatu daerah. Selain faktor ekonomi, terdapat kemungkinan adanya ketimpangan berdasarkan jenis kelamin dalam pencapaian pendidikan. Ketimpangan ini dapat muncul akibat perbedaan akses, persepsi sosial, maupun prioritas dalam keluarga. Oleh karena itu, akan dicari tahu apakah terdapat hubungan antara tingkat pendidikan dan jenis kelamin dalam populasi penduduk ekonomi menengah.
Metode analisis yang akan digunakan adalah analisis log-linear dua arah, yang memungkinkan pengujian adanya ketergantungan antar dua variabel kategorik melalui model probabilistik dan pengujian statistik. Dengan pendekatan ini, akan diperoleh pemahaman yang lebih mendalam mengenai pola keterkaitan antara jenis kelamin dan tingkat pendidikan dalam populasi masyarakat ekonomi menengah.
Data diambil dari Susenas BPS Kabupaten Sleman Tahun 2008
Variabel
Pendidikan: Tingkat pendidikan tertinggi yang pernah diduduki
Jenis Kelamin:
Frekuensi: Jumlah penduduk pada masing-masing kombinasi kategori
Tabel Kontingensi Pendidikan × Jenis Kelamin
Pendidikan | Laki-laki | Perempuan |
---|---|---|
SD | 42093 | 36750 |
SMP | 23999 | 24051 |
SMA | 21706 | 11190 |
PT | 45461 | 33025 |
Berdasarkan data yang diberikan, kita akan membentuk model log-linear dua arah untuk menganalisis hubungan antara tingkat pendidikan dan jenis kelamin. Model log-linear digunakan untuk mengukur ketergantungan antara dua variabel kategorik dalam tabel kontingensi.
Model ini dapat dituliskan dalam bentuk persamaan logaritmik berikut:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]
Di mana:
Bentuk Model untuk Data Ini
Model log-linear yang sesuai untuk data ini adalah:
\[ \log(\mu_{ij}) = \lambda + \lambda_i^{Pendidikan} + \lambda_j^{Jenis Kelamin} + \lambda_{ij}^{Pendidikan:Jenis Kelamin} \]
Dengan model ini, kita dapat melihat apakah ada interaksi yang signifikan antara tingkat pendidikan dan jenis kelamin dalam menentukan frekuensi distribusi populasi.
Data
# Membuat matriks frekuensi 4x2
tabel <- matrix(c(
42093, 36750,
23999, 24051,
21706, 11190,
45461, 33025
), nrow = 4, byrow = TRUE)
colnames(tabel) <- c("Laki-laki", "Perempuan")
rownames(tabel) <- c("SD", "SMP", "SMA", "PT")
tabel
## Laki-laki Perempuan
## SD 42093 36750
## SMP 23999 24051
## SMA 21706 11190
## PT 45461 33025
# Konversi ke long format
data <- as.data.frame(as.table(tabel))
colnames(data) <- c("Pendidikan", "Jenis_Kelamin", "Freq")
data
## Pendidikan Jenis_Kelamin Freq
## 1 SD Laki-laki 42093
## 2 SMP Laki-laki 23999
## 3 SMA Laki-laki 21706
## 4 PT Laki-laki 45461
## 5 SD Perempuan 36750
## 6 SMP Perempuan 24051
## 7 SMA Perempuan 11190
## 8 PT Perempuan 33025
Model Tanpa Interaksi
# Model log-linear tanpa interaksi
fit_no_inter <- glm(Freq ~ Pendidikan + Jenis_Kelamin,
family = poisson, data = data)
summary(fit_no_inter)
##
## Call:
## glm(formula = Freq ~ Pendidikan + Jenis_Kelamin, family = poisson,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 10.694083 0.003999 2674.29 <2e-16 ***
## PendidikanSMP -0.495216 0.005787 -85.57 <2e-16 ***
## PendidikanSMA -0.874107 0.006564 -133.17 <2e-16 ***
## PendidikanPT -0.004538 0.005042 -0.90 0.368
## Jenis_KelaminPerempuan -0.238182 0.004126 -57.72 <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: 33540.7 on 7 degrees of freedom
## Residual deviance: 2407.1 on 3 degrees of freedom
## AIC: 2513.6
##
## Number of Fisher Scoring iterations: 4
Interpretasi
Variabel | Koefisien | OR (exp) | Interpretasi OR |
---|---|---|---|
(Intercept) | 10.694 | — | Basis log-frekuensi untuk SD & Laki-laki |
PendidikanSMP | -0.495 | 0.61 | Frekuensi SMP ≈ 61% dari SD (lebih rendah) |
PendidikanSMA | -0.874 | 0.42 | Frekuensi SMA ≈ 42% dari SD (lebih rendah) |
PendidikanPT | -0.005 | 0.99 | Hampir sama dengan SD (tidak signifikan) |
Jenis_KelaminPerempuan | -0.238 | 0.79 | Perempuan ≈ 79% frekuensi laki-laki pada semua pendidikan (lebih rendah) |
Model Dengan Interaksi
# Model log-linear dengan interaksi
fit_inter <- glm(Freq ~ Pendidikan * Jenis_Kelamin,
family = poisson, data = data)
summary(fit_inter)
##
## Call:
## glm(formula = Freq ~ Pendidikan * Jenis_Kelamin, family = poisson,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 10.647637 0.004874 2184.53 <2e-16 ***
## PendidikanSMP -0.561869 0.008089 -69.46 <2e-16 ***
## PendidikanSMA -0.662293 0.008356 -79.26 <2e-16 ***
## PendidikanPT 0.076973 0.006764 11.38 <2e-16 ***
## Jenis_KelaminPerempuan -0.135743 0.007139 -19.01 <2e-16 ***
## PendidikanSMP:Jenis_KelaminPerempuan 0.137908 0.011585 11.90 <2e-16 ***
## PendidikanSMA:Jenis_KelaminPerempuan -0.526825 0.013653 -38.59 <2e-16 ***
## PendidikanPT:Jenis_KelaminPerempuan -0.183847 0.010161 -18.09 <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: 3.3541e+04 on 7 degrees of freedom
## Residual deviance: 6.3383e-12 on 0 degrees of freedom
## AIC: 112.47
##
## Number of Fisher Scoring iterations: 2
Interpretasi
Variabel | Koefisien | OR (exp) | Interpretasi OR |
---|---|---|---|
PendidikanSMP | -0.562 | 0.57 | SMP ≈ 57% dari SD untuk laki-laki |
PendidikanSMA | -0.662 | 0.52 | SMA ≈ 52% dari SD untuk laki-laki |
PendidikanPT | 0.077 | 1.08 | PT ≈ 8% lebih tinggi dari SD untuk laki-laki |
Jenis_KelaminPerempuan | -0.136 | 0.87 | Perempuan di SD ≈ 87% dari laki-laki SD |
SMP × Perempuan | +0.138 | 1.15 | Perempuan SMP ≈ 15% lebih banyak dibanding prediksi tanpa interaksi |
SMA × Perempuan | -0.527 | 0.59 | Perempuan SMA ≈ 59% frekuensi dibanding prediksi tanpa interaksi |
PT × Perempuan | -0.184 | 0.83 | Perempuan PT ≈ 83% frekuensi dibanding prediksi tanpa interaksi |
Jadi, karena model interaksi memiliki deviance sangat rendah, AIC jauh lebih kecil, semua parameter signifikan, maka model dengan interaksi adalah model terbaik.
Berdasarkan hasil analisis log-linear terhadap data tingkat pendidikan dan jenis kelamin dari Susenas BPS Kabupaten Sleman Tahun 2008, diperoleh beberapa temuan penting:
Model terbaik yang menjelaskan hubungan antara jenis kelamin dan tingkat pendidikan adalah model dengan interaksi, karena:
Interpretasi koefisien model log-linear menunjukkan bahwa:
Temuan ini mengindikasikan adanya ketimpangan berdasarkan jenis kelamin dalam pencapaian pendidikan, khususnya pada jenjang pendidikan menengah dan tinggi, di kalangan masyarakat ekonomi menengah.
Hasil ini dapat menjadi dasar bagi pembuat kebijakan untuk memperhatikan kesetaraan gender dalam akses pendidikan, terutama pada jenjang pendidikan lanjutan. Program intervensi atau dukungan spesifik terhadap perempuan pada jenjang SMA dan PT mungkin diperlukan untuk mendorong kesetaraan akses pendidikan di masa mendatang.