Kata Pengantar

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.

1 Analisis Data Kategori

1.1 Data Kategori

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.

1.2 Tabel Kontingensi

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:

  1. Tabel 2x2
    Terdiri dari dua variabel kategori, masing-masing dengan dua kategori.
    Contoh: Merokok (Ya/Tidak) vs. Penyakit (Ada/Tidak Ada)
  2. Tabel RxC (Baris x Kolom)
    Digunakan jika variabel memiliki lebih dari dua kategori.
    Contoh: Pendidikan (SMA, D3, S1) vs. Status Kerja (Tetap, Kontrak, Lepas)
  3. Tabel Kontingensi Tiga Arah (3D)
    Melibatkan tiga variabel kategori sekaligus. Biasanya dipecah menjadi beberapa tabel parsial 2D untuk analisis lanjutan.

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

1.3 Distribusi Frekuensi dan Proporsi dalam Tabel Kontingensi

Dalam tabel kontingensi, kita dapat menganalisis beberapa bentuk distribusi yang penting untuk memahami hubungan antar variabel kategori, yaitu:

  • Frekuensi Absolut
  • Frekuensi Relatif
  • Distribusi Marginal
  • Distribusi Kondisional

1.3.1 Frekuensi Absolut

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

1.3.2 Frekuensi Relatif

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:

  • 30% dari responden adalah terpapar dan mengalami kejadian.
  • 10% dari responden adalah terpapar dan tidak mengalami kejadian.
  • 15% dari responden adalah tidak terpapar dan mengalami kejadian.
  • 45% dari responden adalah tidak terpapar dan tidak mengalami kejadian.

Frekuensi relatif membantu membandingkan sebaran antar kategori, terutama saat total data besar atau tidak seimbang.

1.3.3 Distribusi Marginal

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:

  • Frekuensi marginal baris:
    • Terpapar: 30 + 10 = 40
    • Tidak Terpapar: 15 + 45 = 60
  • Frekuensi marginal kolom:
    • Kejadian Ya: 30 + 15 = 45
    • Kejadian Tidak: 10 + 45 = 55
  • Proporsi marginal:
    • Proporsi Terpapar: 40 / 100 = 0.40
    • Proporsi Tidak Terpapar: 60 / 100 = 0.60
    • Proporsi Kejadian Ya: 45 / 100 = 0.45
    • Proporsi Kejadian Tidak: 55 / 100 = 0.55

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:

  • 40% responden adalah kelompok terpapar.
  • 45% responden mengalami kejadian.

Distribusi marginal membantu kita memahami distribusi total dari satu variabel sebelum membahas relasinya dengan variabel lain.

1.3.4 Distribusi Kondisional

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

  • Distribusi kondisional baris: proporsi berdasarkan baris (misal: proporsi kejadian dalam kelompok paparan tertentu)
  • Distribusi kondisional kolom: proporsi berdasarkan kolom (misal: proporsi paparan dalam kelompok kejadian tertentu)

Contoh Data:

Kejadian Ya Kejadian Tidak Total
Terpapar 30 10 40
Tidak Terpapar 15 45 60
Jumlah 45 55 100

Perhitungan Manual:

  • Distribusi Kondisional Baris (Paparan):
    • Terpapar:
      • Kejadian Ya: 30 / 40 = 0.75
      • Kejadian Tidak: 10 / 40 = 0.25
    • Tidak Terpapar:
      • Kejadian Ya: 15 / 60 = 0.25
      • Kejadian Tidak: 45 / 60 = 0.75
  • Distribusi Kondisional Kolom (Kejadian):
    • Kejadian Ya:
      • Terpapar: 30 / 45 = 0.67
      • Tidak Terpapar: 15 / 45 = 0.33
    • Kejadian Tidak:
      • Terpapar: 10 / 55 = 0.18
      • Tidak Terpapar: 45 / 55 = 0.82

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:

  • Di antara kelompok Terpapar, 75% mengalami kejadian.
  • Di antara individu yang mengalami kejadian, 67% berasal dari kelompok Terpapar.

Distribusi kondisional sangat penting dalam analisis hubungan antar variabel dan menjadi dasar untuk analisis lebih lanjut seperti regresi logistik atau uji asosiasi.

2 Desain Sampling

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:

2.1 Experiment

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:

  • Ada perlakuan (treatment) yang diberikan oleh peneliti.
  • Adanya kelompok kontrol dan perlakuan.
  • Penempatan subjek biasanya dilakukan secara acak (randomisasi).
  • Dilakukan dalam kondisi yang terkontrol.

Bagaimana Dilakukannya:

  1. Menentukan populasi dan unit observasi.
  2. Membagi subjek ke dalam kelompok perlakuan dan kontrol (secara acak).
  3. Memberikan perlakuan hanya kepada kelompok perlakuan.
  4. Mengamati dan mencatat variabel hasil pada kedua kelompok.
  5. Menganalisis perbedaan antar kelompok menggunakan uji statistik.

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?

  • Saat ingin menguji hipotesis kausal (penyebab dan akibat).
  • Jika peneliti memiliki kontrol penuh atas lingkungan dan perlakuan.
  • Ketika memungkinkan untuk melakukan randomisasi.
  • Cocok dalam pengujian efektivitas intervensi seperti program, kebijakan, atau obat.

Keunggulan:

  • Memiliki validitas internal tinggi.
  • Mengurangi potensi bias jika dilakukan secara acak dan terkendali.

Kelemahan:

  • Tidak selalu etis (misalnya pada manusia).
  • Biaya dan waktu pelaksanaan bisa tinggi.
  • Kadang kurang mencerminkan kondisi nyata (validitas eksternal rendah).

2.2 Cohort

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:

  • Tidak ada intervensi dari peneliti (observasional).
  • Subjek dikelompokkan berdasarkan status paparan.
  • Diikuti secara prospektif (ke depan) atau retrospektif (menggunakan data historis).
  • Cocok untuk mempelajari insidensi (kejadian baru) dari suatu outcome.

Bagaimana Dilakukannya:

  1. Identifikasi kelompok dengan paparan dan tanpa paparan.
  2. Amati kedua kelompok dari waktu ke waktu.
  3. Catat apakah outcome terjadi (misalnya penyakit, perubahan status, dll).
  4. Bandingkan risiko/kejadian antara kelompok.

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?

  • Saat ingin mempelajari hubungan antara faktor risiko dan outcome.
  • Jika outcome bersifat jarang namun paparan cukup umum.
  • Ketika ingin menghitung insidensi atau estimasi relative risk (RR).

Keunggulan:

  • Dapat menunjukkan hubungan temporal (paparan terjadi sebelum outcome).
  • Cocok untuk banyak outcome dari satu paparan.

Kelemahan:

  • Membutuhkan waktu lama (terutama jika prospektif).
  • Biaya relatif tinggi.
  • Risiko kehilangan partisipan (attrition).

2.3 Case-Control Study

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:

  • Berbasis pada outcome (kasus dan kontrol ditentukan di awal).
  • Bersifat retrospektif – menelusuri paparan masa lalu.
  • Tidak mengukur insidensi, tetapi mengukur asosiasi (misalnya Odds Ratio).
  • Efisien untuk kondisi yang jarang terjadi atau butuh waktu lama untuk muncul.

Bagaimana Dilakukannya:

  1. Identifikasi kelompok kasus (memiliki outcome) dan kontrol (tidak memiliki outcome).
  2. Telusuri riwayat paparan terhadap faktor yang dicurigai.
  3. Hitung proporsi paparan di antara kasus dan kontrol.
  4. Analisis apakah terdapat asosiasi antara paparan dan outcome.

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?

  • Saat outcome sangat jarang terjadi (misalnya kanker langka, kejadian fatal).
  • Jika waktu atau biaya terbatas.
  • Ketika tidak memungkinkan melakukan studi prospektif.

Keunggulan:

  • Lebih cepat dan murah dibanding kohort atau eksperimen.
  • Efisien untuk kondisi langka atau dengan waktu perkembangan panjang.

Kelemahan:

  • Rentan terhadap bias (misalnya recall bias).
  • Tidak bisa mengukur risiko secara langsung (tidak menghitung insidensi).
  • Tidak bisa membuktikan hubungan kausal secara pasti.

3 Tabel Kontingensi 2 × 2

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?

3.1 Distribusi Peluang dalam Tabel Kontingensi 2 × 2

3.1.1 Peluang Bersama

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

  • \(P(A \cap B)\): Peluang kejadian A dan B terjadi bersamaan
  • \(f(A \cap B)\): Frekuensi absolut pada sel yang sesuai
  • \(n\): Jumlah total observasi dalam tabel

Peluang bersama digunakan untuk menganalisis distribusi probabilitas dua variabel kategori secara bersamaan.

3.1.2 Peluang Marginal

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

  • \(P(A)\): Peluang marginal untuk kejadian A (misalnya suatu kategori baris)
  • \(P(B)\): Peluang marginal untuk kejadian B (misalnya suatu kategori kolom)
  • \(P(A \cap B_j)\): Peluang bersama antara A dan setiap kategori B

Peluang marginal memberikan gambaran distribusi total dari masing-masing variabel kategori secara terpisah.

3.1.3 Peluang Bersyarat

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

  • \(P(A | B)\): Peluang A terjadi dengan syarat B terjadi
  • \(P(A \cap B)\): Peluang bersama A dan B
  • \(P(B)\): Peluang marginal dari B

Peluang bersyarat sangat penting dalam analisis hubungan antar variabel kategori, termasuk dalam pengukuran asosiasi dan inferensi kausal.

3.1.4 Contoh: Analisis Peluang pada Tabel Kontingensi 2 × 2

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 responden merokok dan mengalami penyakit adalah 0.30 atau 30%.
  • Peluang responden merokok dan tidak mengalami penyakit adalah 0.10 atau 30%.
  • Peluang responden tidak merokok dan mengalami penyakit adalah 0.15 atau 15%.
  • Peluang responden tidak merokok dan tidak mengalami penyakit adalah 0.45 atau 45%.

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:

  • 40% responden adalah perokok.
  • 60% responden adalah bukan perokok.
  • 45% responden mengalami penyakit.
  • 55% responden tidak mengalami penyakit.

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:

  • Di antara perokok, 75% mengalami penyakit.
  • Di antara penderita penyakit, sekitar 66.7% adalah perokok.

3.2 Ukuran Asosiasi dalam Data Kategori 2 × 2

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:

  • Menilai apakah hubungan antara dua variabel bersifat positif, negatif, atau tidak ada hubungan.
  • Mengukur besarnya risiko atau peluang suatu outcome berdasarkan paparan tertentu.
  • Dasar pengambilan keputusan dalam penelitian epidemiologi, kesehatan masyarakat, dan ilmu sosial.

Ukuran Asosiasi yang Umum Digunakan:

  1. Risk Difference (RD) – Selisih risiko antar kelompok
  2. Relative Risk (RR) – Perbandingan risiko relatif antar kelompok
  3. Odds Ratio (OR) – Perbandingan peluang (odds) antar kelompok

Ketiga ukuran ini digunakan sesuai dengan desain studi dan tujuan analisis.

3.2.1 Risk Difference (RD)

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

  • \(P(Kejadian | Terpapar)\): Proporsi kejadian pada kelompok yang terpapar
  • \(P(Kejadian | Tidak\ Terpapar)\): Proporsi kejadian pada kelompok yang tidak terpapar
  • \(RD\): Selisih risiko antara dua kelompok

Interpretasi:

  • Jika \(RD > 0\): paparan meningkatkan risiko kejadian
  • Jika \(RD < 0\): paparan menurunkan risiko kejadian
  • Jika \(RD = 0\): tidak ada perbedaan risiko antara dua kelompok

Nilai RD dinyatakan dalam satuan desimal atau persen dan sangat mudah diinterpretasikan karena menunjukkan selisih risiko absolut antar kelompok.

3.2.2 Relative Risk (RR)

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

  • \(P(Kejadian | Terpapar)\): Risiko kejadian di kelompok terpapar
  • \(P(Kejadian | Tidak\ Terpapar)\): Risiko kejadian di kelompok tidak terpapar
  • \(RR\): Nilai risiko relatif

Interpretasi:

  • Jika \(RR > 1\): paparan meningkatkan risiko kejadian
  • Jika \(RR < 1\): paparan menurunkan risiko kejadian (efek protektif)
  • Jika \(RR = 1\): tidak ada perbedaan risiko antar kelompok

Relative Risk sering digunakan dalam studi kohort dan eksperimen di mana insidensi kejadian dapat dihitung secara langsung.

3.2.3 Odds Ratio (OR)

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:

  • Jika \(OR > 1\): peluang kejadian lebih besar pada kelompok terpapar
  • Jika \(OR < 1\): peluang kejadian lebih kecil pada kelompok terpapar
  • Jika \(OR = 1\): tidak ada perbedaan peluang kejadian antara dua kelompok

Odds Ratio sering dipakai sebagai alternatif Relative Risk, terutama saat penelitian tidak bisa mengukur risiko secara langsung seperti pada studi retrospektif atau penyakit langka.

3.2.4 Perbandingan Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR)

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:

  • RD memberikan ukuran absolut — seberapa banyak risiko meningkat atau berkurang.
  • RR memberikan ukuran relatif — berapa kali lipat risiko lebih tinggi atau rendah.
  • OR memperkirakan RR ketika kejadian sangat jarang, dan digunakan saat tidak bisa mengukur insidensi langsung (Agresti, 2013; Kleinbaum & Klein, 2010).

Contoh Interpretasi (asumsikan hasil perhitungan):

  • \(RD = 0.50\): Risiko pada kelompok terpapar meningkat sebesar 50% dibanding yang tidak terpapar.
  • \(RR = 3.0\): Kelompok terpapar memiliki risiko 3 kali lebih besar.
  • \(OR = 6.0\): Peluang kejadian pada kelompok terpapar 6 kali lebih tinggi dibanding tidak terpapar.

Catatan Penting:

  • Jika outcome jarang, maka nilai OR ≈ RR.
  • Jika outcome tidak jarang, maka OR bisa melebih-lebihkan asosiasi dibanding RR (Agresti, 2013).
  • Dalam publikasi medis, RR dan RD lebih mudah dipahami oleh pembaca awam dibanding OR (Kleinbaum & Klein, 2010).

3.2.5 Contoh: Menghitung RD, RR, dan OR

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

4 Inferensi Tabel Kontingensi Dua Arah

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.

4.1 Estimasi

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.

4.1.1 Estimasi Titik

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:

  • \(a\): jumlah kejadian dalam kelompok terpapar
  • \(a + b\): total individu dalam kelompok terpapar

4.1.2 Estimasi Interval

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:

  • \(\hat{p}\) adalah estimasi proporsi kejadian
  • \(Z\) adalah nilai Z untuk tingkat kepercayaan (untuk 95% confidence, \(Z \approx 1.96\))
  • \(n\) adalah jumlah total observasi dalam kelompok

4.2 Uji Hipotesis

4.2.1 Uji Proporsi

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:

  • Hipotesis nol \(H_0\): Tidak ada perbedaan proporsi antara kelompok atau populasi. \[ H_0 : p = p_0 \]
  • Hipotesis alternatif \(H_a\): Ada perbedaan proporsi. \[ H_a : p \neq p_0 \]

Rumus Uji Proporsi:

Statistik uji untuk uji proporsi adalah: \[ z = \frac{\hat{p} - p_0}{\sqrt{\frac{p_0(1 - p_0)}{n}}} \] dimana:

  • \(\hat{p}\) adalah proporsi kejadian dalam sampel
  • \(p_0\) adalah proporsi yang diharapkan berdasarkan hipotesis nol
  • \(n\) adalah ukuran sampel

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:

  • Hipotesis Nol (H0): Proporsi orang yang merokok di kota A sama dengan proporsi di kota B.
    \(p_A = p_B\)
  • Hipotesis Alternatif (H1): Proporsi orang yang merokok di kota A berbeda dari proporsi di kota B.
    \(p_A \neq p_B\)

Perhitungan Manual

1. Tentukan Proporsi di Setiap Kota

  • Proporsi di kota A (\(\hat{p}_A\)):

\[ \hat{p}_A = \frac{120}{200} = 0.60 \]

  • Proporsi di kota B (\(\hat{p}_B\)):

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

  • \(\hat{p}\) adalah proporsi gabungan (total kejadian dibagi total jumlah sampel) \[ \hat{p} = \frac{120 + 100}{200 + 150} = \frac{220}{350} \approx 0.6286 \]

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

  • Nilai statistik uji (z): Nilai statistik uji yang diperoleh dari perhitungan manual dan R digunakan untuk menguji apakah perbedaan proporsi antara dua kelompok ini signifikan atau tidak.
  • p-value > alpha (0.05), maka tidak terdapat perbedaan proporsi orang merokok di kota A dan kota B.

4.2.2 Uji Asosiasi

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.

4.2.2.1 Risk Difference (RD)

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:

  • \(P(Kejadian | Terpapar)\) adalah proporsi kejadian pada kelompok terpapar
  • \(P(Kejadian | Tidak\ Terpapar)\) adalah proporsi kejadian pada kelompok tidak terpapar

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

  • \(\hat{p}_A\): Proporsi kejadian pada kelompok terpapar
  • \(\hat{p}_B\): Proporsi kejadian pada kelompok tidak terpapar
  • \(\hat{p}\): Proporsi gabungan dari kedua kelompok
  • \(n_A\): Ukuran sampel pada kelompok terpapar
  • \(n_B\): Ukuran sampel pada kelompok tidak terpapar

4.2.2.2 Relative Risk (RR)

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:

  • \(P(Kejadian | Terpapar)\) adalah proporsi kejadian pada kelompok terpapar
  • \(P(Kejadian | Tidak\ Terpapar)\) adalah proporsi kejadian pada kelompok tidak terpapar

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:

  • \(a\), \(b\), \(c\), dan \(d\) adalah frekuensi dari tabel kontingensi 2 × 2.

4.2.2.3 Odds Ratio (OR)

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:

  • \(a\): Jumlah kejadian pada kelompok terpapar
  • \(b\): Jumlah yang tidak mengalami kejadian pada kelompok terpapar
  • \(c\): Jumlah kejadian pada kelompok tidak terpapar
  • \(d\): Jumlah yang tidak mengalami kejadian pada kelompok tidak terpapar

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.

4.2.3 Uji Independensi

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

4.2.3.1 Uji Chi-Square

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:

  • E (Pria, Makan Sayur): \[ E = \frac{50 \times 75}{100} = 37.5 \]
  • E (Pria, Tidak Makan Sayur): \[ E = \frac{50 \times 25}{100} = 12.5 \]
  • E (Wanita, Makan Sayur): \[ E = \frac{50 \times 75}{100} = 37.5 \]
  • E (Wanita, Tidak Makan Sayur): \[ E = \frac{50 \times 25}{100} = 12.5 \]

2. Hitung Statistik Uji Chi-Square:

Rumus Chi-Square: \[ \chi^2 = \sum \frac{(O - E)^2}{E} \]

Dimana:

  • \(O\) adalah frekuensi yang diamati
  • \(E\) adalah frekuensi yang diharapkan

Mari kita hitung Chi-Square untuk setiap sel:

  • Untuk Pria, Makan Sayur: \[ \frac{(35 - 37.5)^2}{37.5} = \frac{(-2.5)^2}{37.5} = \frac{6.25}{37.5} = 0.1667 \]
  • Untuk Pria, Tidak Makan Sayur: \[ \frac{(15 - 12.5)^2}{12.5} = \frac{(2.5)^2}{12.5} = \frac{6.25}{12.5} = 0.5 \]
  • Untuk Wanita, Makan Sayur: \[ \frac{(40 - 37.5)^2}{37.5} = \frac{(2.5)^2}{37.5} = \frac{6.25}{37.5} = 0.1667 \]
  • Untuk Wanita, Tidak Makan Sayur: \[ \frac{(10 - 12.5)^2}{12.5} = \frac{(-2.5)^2}{12.5} = \frac{6.25}{12.5} = 0.5 \]

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

4.2.3.2 Partisi Chi-Square

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:

  • \(O\) adalah frekuensi yang diamati
  • \(E\) adalah frekuensi yang diharapkan

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

  • Tabel 1 (18-30 Tahun vs 31-45 Tahun): Nilai p-value = 0.0394, yang lebih kecil dari alpha 0.05. Maka, tolak H0. Artinya, ada hubungan yang signifikan antara kelompok umur 18-30 tahun dan 31-45 tahun dalam kebiasaan menggunakan teknologi.
  • Tabel 2 (31-45 Tahun vs 46+ Tahun): Nilai p-value = 0.5576, yang lebih besar dari alpha (0.05). Maka, terima H0. Artinya, tidak ada hubungan yang signifikan antara kelompok umur 31-45 tahun dan 46+ tahun dalam kebiasaan menggunakan teknologi.
  • Tabel 3 (18-30 Tahun vs 46+ Tahun): Nilai p-value = 0.01018, yang lebih kecil dari alpha 0.05. Maka, tolak H0. Artinya, ada hubungan yang signifikan antara kelompok umur 18-30 tahun dan 46+ tahun dalam kebiasaan menggunakan teknologi.

4.2.3.3 Uji Likelihood Ratio

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:

  • \(O\) adalah frekuensi yang diamati (observed frequency),
  • \(E\) adalah frekuensi yang diharapkan (expected frequency).

Langkah-langkah Uji Likelihood Ratio:

  1. Membuat tabel kontingensi yang akan diuji.
  2. Menghitung frekuensi yang diharapkan (E) untuk setiap sel dalam tabel.
  3. Menghitung statistik Likelihood Ratio (G²) menggunakan rumus di atas.
  4. Tentukan derajat kebebasan (df) untuk menghitung p-value dan lakukan interpretasi.

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.

4.2.3.4 Uji Exact Fisher

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

  • Akurasi tinggi pada data kecil: Uji ini memberikan hasil yang lebih tepat daripada uji Chi-Square pada tabel 2 × 2 dengan frekuensi kecil.
  • Tidak tergantung pada ukuran sampel besar: Uji Exact Fisher cocok untuk digunakan pada tabel kontingensi dengan sampel kecil atau distribusi tidak normal.

Langkah-langkah Uji Exact Fisher

  1. Membuat tabel kontingensi 2 × 2 untuk dua variabel kategori.
  2. Menguji hipotesis menggunakan uji Exact Fisher untuk menentukan apakah ada hubungan antara kedua variabel.
  3. Menghitung p-value untuk menguji signifikansi hasil.
  4. Menentukan kesimpulan berdasarkan p-value (menolak atau gagal menolak hipotesis nol).

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.

4.3 Analisis Residual dalam Tabel Kontingensi

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.

4.3.1 Jenis Residual

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:

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

    • \(O_{ij}\) adalah frekuensi yang diamati,
    • \(E_{ij}\) adalah frekuensi yang diharapkan.
  2. 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}}} \]

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

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

  • Laki-laki, Makan Sayur: 1.5 (Lebih banyak laki-laki yang makan sayur dari yang diharapkan).
  • Perempuan, Makan Sayur: -1.5 (Lebih sedikit perempuan yang makan sayur dari yang diharapkan).
  • Laki-laki, Tidak Makan Sayur: -1.5 (Lebih sedikit laki-laki yang tidak makan sayur dari yang diharapkan).
  • Perempuan, Tidak Makan Sayur: 1.5 (Lebih banyak perempuan yang tidak makan sayur dari yang diharapkan).

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.

4.3.2 Deteksi Outlier dalam Analisis Data Kategori menggunakan Residual

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:

  1. Menghitung residual standar atau Pearson untuk setiap sel dalam tabel kontingensi.
  2. Identifikasi residual dengan nilai absolut lebih besar dari 2 atau 3. Residual yang besar mengindikasikan bahwa sel tersebut memiliki perbedaan yang signifikan antara frekuensi yang diamati dan yang diharapkan.
  3. Tinjau hasil residual standar atau Pearson: Jika nilai residual lebih besar dari 2 atau lebih kecil dari -2 (untuk standar residual), maka itu dapat dianggap sebagai outlier.

Langkah-langkah Deteksi Outlier:

  1. Hitung residual standar atau Pearson untuk setiap sel.
  2. Identifikasi residual dengan nilai lebih besar dari 2 atau lebih kecil dari -2.
  3. Tandai sel-sel tersebut sebagai outlier jika mereka menunjukkan perbedaan signifikan dari yang diharapkan.

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.

5 Tabel Kontingensi Tiga Arah

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.

5.1 Tabel Parsial dan Marginal

  • Tabel Parsial: Tabel ini menunjukkan distribusi data untuk dua variabel, sementara mengontrol atau mempertahankan variabel ketiga (misalnya, usia). Tabel parsial digunakan untuk menganalisis hubungan dua variabel sambil mengontrol efek dari variabel ketiga.
  • Tabel Marginal: Tabel ini menunjukkan distribusi total untuk masing-masing variabel dalam tabel kontingensi tiga arah, tanpa mempertimbangkan variabel ketiga (confounder). Tabel marginal menggambarkan distribusi keseluruhan data berdasarkan satu variabel tanpa pengaruh dari variabel lainnya.

Contoh Kasus

Misalkan kita ingin meneliti apakah perokok dapat dipengaruhi oleh jenis kelamin dengan melibatkan usia sebagai confounder. Data yang tersedia adalah sebagai berikut:

  • Variabel 1 (X1): Jenis kelamin (Laki-laki, Perempuan)
  • Variabel 2 (X2): Status merokok (Merokok, Tidak Merokok)
  • Variabel 3 (Z): Usia (Muda, Tua)

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

  • Tabel Parsial menunjukkan hubungan antara jenis kelamin dan status merokok, sementara mengontrol variabel usia (confounder). Dengan memisahkan data berdasarkan usia (muda vs tua), kita dapat melihat bagaimana hubungan antara jenis kelamin dan status merokok berubah berdasarkan kelompok usia.
  • Tabel Marginal menunjukkan distribusi keseluruhan antara jenis kelamin dan status merokok tanpa mempertimbangkan usia. Tabel ini memberikan gambaran umum tentang distribusi kedua variabel tanpa kontrol terhadap faktor confounder.
  • Tabel Parsial sangat berguna untuk mengidentifikasi confounding dan memahami bagaimana variabel ketiga (misalnya, usia) memengaruhi hubungan antara dua variabel lainnya.

5.2 Distribusi Peluang

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

    • \(f(x_1, y_1, z_1)\) adalah frekuensi kejadian bersama antara kategori \(X = x_1\), \(Y = y_1\), dan \(Z = z_1\),
    • \(N\) adalah total jumlah kejadian (total sampel).
  2. 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) \]

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

5.3 Ukuran Asosiasi

5.3.1 Tabel Kontingensi Marginal

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

  • RD = 0.35 Tanpa memperhatikan usia, risiko penyakit kanker paru pada perokok 35% lebih tinggi dibandingkan bukan perokok
  • RR = 3.33 Tanpa memperhatikan usia, perokok memiliki risiko 3.33 kali lebih tinggi menderita penyakit kanker paru dibandingkan bukan perokok
  • OR = 5.67 Tanpa memperhatikan usia, perokok memiliki peluang 5.67 kali lebih tinggi menderita kanker paru dibandingkan bukan perokok.

5.3.2 Tabel Kontingensi Parsial

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

  • RD = 0.1 Pada usia muda, risiko penyakit kanker paru pada perokok 10% lebih tinggi dibandingkan bukan perokok
  • RR = 2 Pada usia muda, perokok memiliki risiko 2 kali lebih tinggi menderita penyakit kanker paru dibandingkan bukan perokok
  • OR = 2.25 Pada usia muda, perokok memiliki peluang 2.25 kali lebih tinggi menderita kanker paru dibandingkan bukan perokok.

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

  • RD = 0.6 Pada usia dewasa, risiko penyakit kanker paru pada perokok 60% lebih tinggi dibandingkan bukan perokok
  • RR = 4 Pada usia dewasa, perokok memiliki risiko 4 kali lebih tinggi menderita penyakit kanker paru dibandingkan bukan perokok
  • OR = 16 Pada usia dewasa, perokok memiliki peluang 16 kali lebih tinggi menderita kanker paru dibandingkan bukan perokok.

Karena hasil asosiasi tabel parsial dan marginal sama, maka usia tidak efektif bila dijadikan confounder.

6 Inferensi Tabel Kontingensi Tiga Arah

6.1 Independensi Bersyarat dalam Tabel Kontingensi Tiga Arah

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.

6.2 Pengujian Statistik untuk Independensi Bersyarat

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

  • Hipotesis Nol (H0): Dua variabel X dan Y adalah independen bersyarat terhadap variabel ketiga Z.
    • Artinya: Tidak ada hubungan antara X dan Y setelah mengendalikan variabel ketiga Z. \[ H_0: OR(X, Y \mid Z) = 1 \]
  • Hipotesis Alternatif (H1): Dua variabel X dan Y tidak independen bersyarat terhadap variabel ketiga Z.
    • Artinya: Ada hubungan antara X dan Y setelah mengendalikan variabel ketiga Z. \[ H_1: OR(X, Y \mid Z) \neq 1 \]

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:

  • \(O_i\) adalah observed frequency dalam strata \(i\),
  • \(E_i\) adalah expected frequency dalam strata \(i\),
  • \(k\) adalah jumlah strata.

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

  • Tolak H0 jika p-value yang dihasilkan lebih kecil dari tingkat signifikansi (\(\alpha\)) yang ditetapkan (misalnya \(\alpha = 0.05\)).
  • Gagal tolak H0 jika p-value lebih besar dari tingkat signifikansi (\(\alpha\)).

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:

  • X: Status merokok (Merokok, Tidak Merokok)
  • Y: Kanker paru (Ya, Tidak)
  • Z: Usia (Muda, Dewasa)

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.

6.3 Odds Ratio Bersama

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:

  • \(a_i\) adalah hasil perkalian antara nilai kejadian dan non-kejadian dalam strata \(i\),
  • \(b_i\) adalah hasil perkalian antara nilai non-kejadian dan kejadian dalam strata \(i\),
  • \(k\) adalah jumlah strata dalam variabel ketiga Z.

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:

  • \(a_i, b_i, c_i, d_i\) adalah frekuensi kejadian dan non-kejadian dalam setiap strata \(i\).

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:

  • \(Z_{\alpha/2}\) adalah nilai kritis z untuk tingkat signifikansi yang ditentukan (misalnya, untuk 95% CI, \(Z_{\alpha/2} \approx 1.96\)).

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

  • Odds ratio bersama sebesar 6.833 menunjukkan bahwa perokok memiliki risiko lebih tinggi terkena kanker paru dibandingkan bukan perokok.
  • Karena interval kepercayaan tidak mencakup 1, hasil ini signifikan secara statistik, mendukung adanya hubungan antara merokok dan kanker paru-paru.

6.4 Uji Homogenitas Odds Ratio dengan Statistik Breslow-Day

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:

  • \(O_i\) adalah frekuensi yang diamati untuk strata \(i\),
  • \(E_i\) adalah frekuensi yang diharapkan untuk strata \(i\),
  • \(k\) adalah jumlah strata.

Kriteria Uji

  • Tolak H0 jika p-value yang dihasilkan lebih kecil dari tingkat signifikansi (\(\alpha\)) yang ditetapkan (misalnya \(\alpha = 0.05\)).
  • Gagal tolak H0 jika p-value lebih besar dari tingkat signifikansi (\(\alpha\)).

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:

  • X: Status merokok (Merokok, Tidak Merokok)
  • Y: Kanker paru (Ya, Tidak)
  • Z: Usia (Muda, Dewasa)

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.

7 Generalized Linear Model (GLM)

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.

7.1 Exponential Family

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:

  1. Distribusi Normal:
    • Digunakan dalam model regresi linear.
    • Fungsi link: Identitas (\(\mu = X\beta\)).
  2. Distribusi Binomial:
    • Digunakan dalam regresi logistik untuk variabel dependen biner.
    • Fungsi link: Logit (\(\text{logit}(\mu) = X\beta\)).
  3. Distribusi Poisson:
    • Digunakan dalam regresi Poisson untuk menghitung jumlah kejadian dalam interval waktu tetap atau unit pengamatan.
    • Fungsi link: Log (\(\log(\mu) = X\beta\)).
  4. Distribusi Gamma:
    • Digunakan dalam model untuk variabel kontinu yang positif dan skala tidak terbatas.
    • Fungsi link: Invers (\(\mu = X\beta\)).

Kelebihan GLM dengan Keluarga Distribusi Eksponensial

  • Fleksibilitas: Dapat menangani berbagai jenis data dan distribusi, seperti data biner (binomial), hitungan (Poisson), dan data kontinu.
  • Link Function: GLM memungkinkan penggunaan fungsi link untuk menghubungkan variabel dependen dengan prediktor secara linear, yang meningkatkan fleksibilitas dan kemampuan model.

Kesimpulan

  • Keluarga Distribusi Eksponensial adalah kelompok distribusi yang memiliki bentuk probabilitas umum dan digunakan dalam Generalized Linear Models (GLM).
  • GLM memberikan fleksibilitas yang lebih besar daripada model regresi linear tradisional, memungkinkan kita untuk bekerja dengan berbagai jenis data dan distribusi yang lebih kompleks.
  • Fungsi Link digunakan untuk menghubungkan rata-rata variabel dependen dengan fungsi linear prediktor, yang penting untuk model regresi logistik dan regresi Poisson.

7.2 Model Regresi Logistik

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:

  • \(\sigma(z)\) adalah probabilitas kejadian (output dalam rentang 0 hingga 1),
  • \(z = X\beta\) adalah kombinasi linier dari variabel prediktor \(X\) dengan koefisien \(\beta\).

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:

  • \(\mu\) adalah probabilitas kejadian (output regresi logistik),
  • \(X\beta\) adalah kombinasi linier dari variabel independen \(X\).

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:

  • \(\mu\) adalah probabilitas kejadian (output dari model),
  • \(X\beta\) adalah kombinasi linier dari variabel independen \(X\).

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

  • Koefisien β: Koefisien yang diestimasi menunjukkan perubahan dalam log odds dari kejadian untuk setiap unit perubahan dalam variabel independen.
  • Probabilitas Prediksi: Probabilitas yang diprediksi adalah probabilitas kejadian Y = 1 untuk setiap nilai X, yang dihitung menggunakan fungsi sigmoid.
  • P-value dan Nilai Z: Dalam output summary(logit_model), kita juga melihat p-value dan z-value yang menunjukkan apakah koefisien β signifikan secara statistik.

7.3 Model Regresi Poisson

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:

  • \(\lambda_i = \exp(X_i \beta)\),
  • \(y_i\) adalah jumlah kejadian untuk observasi \(i\).

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.

8 Inferensi GLM

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.

8.1 Mencari Ekspektasi dan Varians dalam 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:

  • \(\mu\) adalah ekspektasi atau rata-rata dari variabel dependen,
  • \(g^{-1}\) adalah fungsi inverse link (fungsi yang mengubah prediksi linier kembali menjadi rata-rata yang dapat diamati),
  • \(X\beta\) adalah kombinasi linier dari variabel independen \(X\) dengan koefisien \(\beta\).

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:

  • \(\phi\) adalah parameter skala (sering kali dianggap 1 untuk beberapa distribusi seperti Poisson, atau perlu diperkirakan untuk distribusi lain seperti binomial atau gamma),
  • \(\frac{\partial g^{-1}(X\beta)}{\partial (X\beta)}\) adalah derivatif dari fungsi inverse link terhadap prediktor linier \(X\beta\).

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:

  • Ekspektasi: Fungsi link untuk regresi logistik adalah logit, yang menghubungkan log odds dengan prediktor linier. Ekspektasi probabilitas \(\mu\) adalah fungsi sigmoid dari prediktor linier \(X\beta\):

\[ \mu = \frac{1}{1 + \exp(-X\beta)} \]

  • Varians: Varians dari distribusi binomial adalah \(\mu(1 - \mu)\), di mana \(\mu\) adalah probabilitas kejadian yang diprediksi.

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

8.2 Metode Penaksiran Parameter

8.2.1 Maximum Likelihood Estimation (MLE)

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.

8.2.2 Metode Optimisasi: Newton-Raphson dan Fisher Scoring

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:

  • \(\beta^{(old)}\) adalah nilai parameter saat ini,
  • \(\nabla L(\beta^{(old)})\) adalah gradient (turunan pertama) dari fungsi log-likelihood,
  • \(H(\beta^{(old)})\) adalah hessian (turunan kedua) dari fungsi log-likelihood.

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:

  • \(I(\beta^{(old)})\) adalah informasi Fisher (ekspektasi dari hessian),
  • \(\nabla L(\beta^{(old)})\) adalah gradient (turunan pertama) dari fungsi log-likelihood.

8.2.3 Iteratively Reweighted Least Squares (IRLS)

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.

8.3 Diagnostik Model GLM

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.

8.3.1 Statistik Deviance dalam GLM

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:

  • \(L(\text{model penuh})\) adalah log-likelihood dari model yang diperkirakan,
  • \(L(\text{model saturasi})\) adalah log-likelihood dari model saturasi (model dengan jumlah parameter yang lebih banyak).

Deviance lebih rendah menunjukkan bahwa model lebih baik cocok dengan data.

8.3.2 Chi-Square Pearson dalam GLM

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:

  • \(O_i\) adalah nilai yang diamati (observed value),
  • \(E_i\) adalah nilai yang diharapkan (expected value).

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.

8.3.3 Analisis Residual dalam GLM

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

  • Raw Residual: \[ r_{\text{raw}} = y_i - \hat{y}_i \]
  • Deviance Residual: \[ r_{\text{dev}} = \text{sign}(y_i - \hat{y}_i) \sqrt{D_i} \] Di mana \(D_i\) adalah kontribusi deviance untuk pengamatan \(i\).
  • Pearson Residual: \[ r_{\text{pearson}} = \frac{y_i - \hat{y}_i}{\sqrt{\hat{y}_i (1 - \hat{y}_i)}} \]

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.

8.4 Detail Metode Estimasi dan Inferensi Regresi Logistik

8.4.1 Estimasi MLE Regresi Logistik

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:

  • \(\mu\) adalah probabilitas kejadian \(P(Y = 1)\),
  • \(X\) adalah variabel independen,
  • \(\beta\) adalah parameter model yang perlu diperkirakan.

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

8.4.2 Estimasi Parameter dengan Newton-Raphson

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

  1. Inisialisasi parameter \(\beta\) dengan nilai awal (misalnya, 0).
  2. Hitung gradien dari log-likelihood, yaitu turunan pertama dari log-likelihood terhadap \(\beta\).
  3. Hitung hessian, yaitu turunan kedua dari log-likelihood terhadap \(\beta\).
  4. Perbarui parameter \(\beta\) menggunakan rumus Newton-Raphson: \[ \beta^{(new)} = \beta^{(old)} - \left[ H(\beta^{(old)}) \right]^{-1} \nabla L(\beta^{(old)}) \]
  5. Ulangi langkah 2-4 hingga konvergensi tercapai (parameter berubah sangat sedikit antara iterasi).

8.4.3 Inferensi Parameter dalam Regresi Logistik

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:

8.4.3.1 Uji Wald

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.

8.4.3.2 Uji Likelihood Ratio (Chi-Square)

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:

  • \(L(\text{model null})\) adalah log-likelihood dari model dengan hanya intercept (tanpa prediktor),
  • \(L(\text{model penuh})\) adalah log-likelihood dari model yang lengkap (dengan semua prediktor).

Jika nilai statistik Chi-Square lebih besar dari nilai kritis pada derajat kebebasan tertentu, kita menolak hipotesis nol.

8.4.4 Evaluasi Kebaikan Model

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:

  • \(\log L\) adalah log-likelihood dari model,
  • \(k\) adalah jumlah parameter dalam model.

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

8.5 Detail Metode Estimasi dan Inferensi Regresi Poisson

8.5.1 Fungsi Distribusi Poisson dan Model Regresi Poisson

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:

  • \(\lambda\) adalah parameter rata-rata atau tingkat kejadian yang diharapkan,
  • \(y\) adalah jumlah kejadian yang diamati.

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:

  • \(X\beta\) adalah kombinasi linier dari variabel independen \(X\),
  • \(\beta\) adalah parameter yang diestimasi.

8.5.2 Estimasi Parameter dengan MLE dan IRLS

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

8.5.3 Pengujian Hipotesis

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)

8.5.4 Evaluasi Model

# 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

9 Contoh Kasus Data Real

9.1 Pendahuluan

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.

9.2 Data

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:

  • X = Masa Pendidikan responden dalam tahun (<= 8, 9-12, dan >= 13)
  • Y = Sikap responden terhadap peran tradisional wanita (Setuju dan Tidak Setuju)
  • Z = Jenis kelamin responden (pria dan wanita)

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

9.3 Tabel Parsial Pria

data_pria <- subset(data, JenisKelamin == "Pria")[, -1]
kable(data_pria, caption = "Tabel Parsial (Pria)")
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)")
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

  • RD = 0.246 Ketika seseorang adalah pria, sikap setuju terhadap peran tradisional wanita pada orang yang masa pendidikannya kurang dari 9 tahun 24.6% lebih tinggi dibandingkan orang yang masa pendidikannya 9-12 tahun.
  • RR = 1.683 Ketika seseorang adalah pria, orang yang masa pendidikannya kurang dari 9 tahun memiliki risiko 1.683 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya 9-12 tahun.
  • OR = 2.73 Ketika seseorang adalah pria, orang yang masa pendidikannya kurang dari 9 tahun memiliki peluang 2.73 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya 9-12 tahun.

9-12 VS >= 13

  • RD = 0.162 Ketika seseorang adalah pria, sikap setuju terhadap peran tradisional wanita pada orang yang masa pendidikannya 9-12 tahun 16.2% lebih tinggi dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.
  • RR = 1.822 Ketika seseorang adalah pria, orang yang masa pendidikannya 9-12 tahun memiliki risiko 1.822 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.
  • OR = 2.283 Ketika seseorang adalah pria, orang yang masa pendidikannya 9-12 tahun memiliki peluang 2.283 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.

<=8 VS >= 13

  • RD = 0.408 Ketika seseorang adalah pria, sikap setuju terhadap peran tradisional wanita pada orang yang masa pendidikannya kurang dari 9 tahun 40.8% lebih tinggi dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.
  • RR = 3.066 Ketika seseorang adalah pria, orang yang masa pendidikannya kurang dari 9 tahun memiliki risiko 3.066 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.
  • OR = 6.232 Ketika seseorang adalah pria, orang yang masa pendidikannya kurang dari 9 tahun memiliki peluang 6.232 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.

9.4 Tabel Parsial Wanita

data_wanita <- subset(data, JenisKelamin == "Wanita")[, -1]
kable(data_wanita, caption = "Tabel Parsial (Wanita)")
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)")
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

  • RD = 0.271 Ketika seseorang adalah wanita, sikap setuju terhadap peran tradisional wanita pada orang yang masa pendidikannya kurang dari 9 tahun 27.1% lebih tinggi dibandingkan orang yang masa pendidikannya 9-12 tahun.
  • RR = 1.714 Ketika seseorang adalah wanita, orang yang masa pendidikannya kurang dari 9 tahun memiliki risiko 1.714 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya 9-12 tahun.
  • OR = 3.041 Ketika seseorang adalah wanita, orang yang masa pendidikannya kurang dari 9 tahun memiliki peluang 3.041 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya 9-12 tahun.

9-12 VS >= 13

  • RD = 0.249 Ketika seseorang adalah wanita, sikap setuju terhadap peran tradisional wanita pada orang yang masa pendidikannya 9-12 tahun 24.9% lebih tinggi dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.
  • RR = 2.913 Ketika seseorang adalah wanita, orang yang masa pendidikannya 9-12 tahun memiliki risiko 2.913 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.
  • OR = 4.083 Ketika seseorang adalah wanita, orang yang masa pendidikannya 9-12 tahun memiliki peluang 4.083 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.

<=8 VS >= 13

  • RD = 0.52 Ketika seseorang adalah wanita, sikap setuju terhadap peran tradisional wanita pada orang yang masa pendidikannya kurang dari 9 tahun 52% lebih tinggi dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.
  • RR = 4.993 Ketika seseorang adalah wanita, orang yang masa pendidikannya kurang dari 9 tahun memiliki risiko 4.993 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.
  • OR = 12.414 Ketika seseorang adalah wanita, orang yang masa pendidikannya kurang dari 9 tahun memiliki peluang 12.414 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.

9.5 Tabel Marginal

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

  • RD = 0.471 Tanpa memperhatikan jenis kelamin, sikap setuju terhadap peran tradisional wanita pada orang yang masa pendidikannya kurang dari 9 tahun 47.1% lebih tinggi dibandingkan orang yang masa pendidikannya 9-12 tahun.
  • RR = 3.865 Tanpa memperhatikan jenis kelamin, orang yang masa pendidikannya kurang dari 9 tahun memiliki risiko 3.865 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya 9-12 tahun.
  • OR = 8.857 Tanpa memperhatikan jenis kelamin, orang yang masa pendidikannya kurang dari 9 tahun memiliki peluang 8.857 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya 9-12 tahun.

9-12 VS >= 13

  • RD = -0.207 Tanpa memperhatikan jenis kelamin, sikap setuju terhadap peran tradisional wanita pada orang yang masa pendidikannya 9-12 tahun 20.7% lebih rendah dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.
  • RR = 0.443 Ketika seseorang adalah wanita, orang yang masa pendidikannya 9-12 tahun memiliki risiko 0.443 kali lebih rendah untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.
  • OR = 0.333 Tanpa memperhatikan jenis kelamin, orang yang masa pendidikannya 9-12 tahun memiliki peluang 0.333 kali lebih rendah untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.

<=8 VS >= 13

  • RD = 0.264 Tanpa memperhatikan jenis kelamin, sikap setuju terhadap peran tradisional wanita pada orang yang masa pendidikannya kurang dari 9 tahun 25.4% lebih tinggi dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.
  • RR = 1.711 Tanpa memperhatikan jenis kelamin, orang yang masa pendidikannya kurang dari 9 tahun memiliki risiko 1.711 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.
  • OR = 2.949 Tanpa memperhatikan jenis kelamin, orang yang masa pendidikannya kurang dari 9 tahun memiliki peluang 2.949 kali lebih tinggi untuk memiliki sikap setuju terhadap peran tradisional wanita dibandingkan orang yang masa pendidikannya lebih dari 12 tahun.

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.

9.6 Uji Independensi Bersyarat (Cochran-Mantel-Haenszel)

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.

10 Regresi Logistik dengan Prediktor Nominal, Ordinal, dan Rasio

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:

10.1 Simulasi Data

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:

  • Status Pekerjaan (Nominal: Pekerja (1) atau Pelajar (0)).
  • Frekuensi Penggunaan Aplikasi (Ordinal: Jarang, Sedang, Sering).
  • Pendapatan Bulanan (Numerik: dalam satuan ribuan IDR).

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.

10.2 Eksplorasi Data

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

10.3 Perlakuan Variabel Ordinal

10.3.1 Treat sebagai Nominal (Dummy)

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)

  • Ini adalah log-odds dasar untuk individu berstatus Pelajar, frekuensi penggunaan Jarang, dan memiliki income = 0.
  • Signifikan (p-value = 0.0109), artinya baseline ini berbeda secara signifikan dari probabilitas 50%.
  • Odds Ratio: OR = \(e^{-0.7531} \approx 0.471\). Ini menunjukkan bahwa peluang sukses individu dengan kondisi baseline (Female, Jarang, pendapatan = 0) adalah sekitar 47% dibandingkan dengan probabilitas 50%.

job_statusPelajar (0.1239)

  • Individu Pelajar memiliki log-odds sukses yang lebih tinggi sebesar 0.1239 dibandingkan dengan individu Pekerja (kategori referensi).
  • p = 0.4938 (tidak signifikan pada level 5%), artinya status pekerjaan tidak berhubungan secara signifikan dengan keputusan untuk berlangganan paket premium.
  • Odds Ratio: OR = \(e^{0.1239} \approx 1.131\). Ini menunjukkan bahwa peluang sukses untuk Pelajar adalah sekitar 113% dari peluang sukses untuk Pekerja. Namun, karena tidak signifikan, ini tidak menunjukkan hubungan yang kuat.

usage_frequencySedang (-0.007758)

  • Frekuensi penggunaan aplikasi “Sedang” memiliki log-odds sukses yang lebih rendah sebesar 0.007758 dibandingkan dengan kategori “Jarang” (kategori referensi).
  • p = 0.9723 (tidak signifikan), artinya perubahan frekuensi penggunaan aplikasi dari “Jarang” ke “Sedang” tidak berpengaruh terhadap peluang sukses.
  • Odds Ratio: OR = \(e^{-0.007758} \approx 0.992\). Peluang sukses untuk individu dengan frekuensi penggunaan “Sedang” hanya 99.2% dari peluang sukses untuk individu dengan frekuensi “Jarang”, tetapi tidak signifikan.

usage_frequencySering (0.0161)

  • Frekuensi penggunaan aplikasi “Sering” memiliki log-odds sukses yang lebih tinggi sebesar 0.01610 dibandingkan dengan kategori “Jarang”.
  • p = 0.9420 (tidak signifikan), artinya perubahan frekuensi penggunaan aplikasi dari “Jarang” ke “Sering” juga tidak berpengaruh terhadap peluang sukses.
  • Odds Ratio: OR = \(e^{0.01610} \approx 1.016\). Peluang sukses untuk individu dengan frekuensi penggunaan “Sering” adalah 101.6% dari peluang sukses untuk individu dengan frekuensi “Jarang”, namun ini juga tidak signifikan.

monthly_income (0.00007877)

  • Setiap kenaikan 1000 rupiah pendapatan bulanan meningkatkan log-odds sukses sebesar 0.00007877.
  • p = 0.0403 (signifikan pada level 5%), artinya pendapatan bulanan berhubungan positif dengan peluang sukses untuk berlangganan paket premium.
  • Odds Ratio: OR = \(e^{0.00007877} \approx 1.00008\). Setiap tambahan 1000 rupiah meningkatkan peluang sukses sekitar 0.008%. Meskipun kecil, ini menunjukkan bahwa pendapatan memiliki pengaruh positif terhadap keputusan pelanggan untuk memilih paket premium.

Interpretasi Goodness of Fit

  • Null Deviance (687.30): Ini adalah deviance dari model tanpa prediktor (hanya intercept). Semakin tinggi nilai deviance, semakin buruk model dalam menjelaskan data.
  • Residual Deviance (682.67): Deviance dari model dengan prediktor. Penurunan dari null deviance ke residual deviance menunjukkan bahwa model yang dibuat dengan prediktor memberikan informasi yang lebih baik.
  • AIC (692.67): AIC digunakan untuk membandingkan model dengan model lain. Model dengan AIC lebih kecil lebih baik dalam menyeimbangkan goodness-of-fit dan kompleksitas model.

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

  • Pendapatan bulanan memiliki pengaruh signifikan terhadap peluang berlangganan paket premium, sedangkan status pekerjaan dan frekuensi penggunaan aplikasi tidak memiliki pengaruh signifikan.
  • Individu Pelajar sedikit lebih mungkin untuk berlangganan dibandingkan Pekerja, meskipun ini tidak signifikan dalam model.
  • Model secara keseluruhan menunjukkan kecocokan yang cukup baik dengan data, meskipun ada beberapa variabel yang tidak signifikan.

10.3.2 Treat sebagai Rasio (Numeric Rank)

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)

  • Ini adalah log-odds dasar untuk individu Pelajar, frekuensi penggunaan aplikasi (usage_frequency_numeric) = 0, dan pendapatan = 0.
  • Signifikan (p-value = 0.0282), artinya baseline ini berbeda secara signifikan dari probabilitas 50%.
  • Odds Ratio: \(\text{OR} = e^{-0.7660} \approx 0.465\). Ini menunjukkan bahwa peluang sukses individu dengan kondisi baseline (Pelajar, penggunaan aplikasi = 0, pendapatan = 0) adalah sekitar 46.5% dibandingkan dengan probabilitas 50%.

job_statusPelajar (0.1239)

  • Individu Pelajar memiliki log-odds sukses yang lebih tinggi sebesar 0.1239 dibandingkan dengan individu Pekerja (kategori referensi).
  • p = 0.4938 (tidak signifikan pada level 5%), artinya status pekerjaan tidak berhubungan secara signifikan dengan keputusan untuk berlangganan paket premium.
  • Odds Ratio: \(\text{OR} = e^{0.1239} \approx 1.131\). Ini menunjukkan bahwa peluang sukses untuk Pelajar adalah sekitar 113% dari peluang sukses untuk Pekerja. Namun, karena tidak signifikan, ini tidak menunjukkan hubungan yang kuat.

usage_frequency_numeric (0.008210)

  • Setiap kenaikan satu unit pada frekuensi penggunaan aplikasi meningkatkan log-odds sukses sebesar 0.008210.
  • p = 0.9409 (tidak signifikan), artinya frekuensi penggunaan aplikasi yang lebih tinggi tidak berpengaruh secara signifikan terhadap peluang sukses.
  • Odds Ratio: \(\text{OR} = e^{0.008210} \approx 1.008\). Peluang sukses untuk individu dengan frekuensi penggunaan aplikasi lebih tinggi adalah 1.008 kali peluang sukses individu dengan frekuensi lebih rendah, namun ini tidak signifikan.

monthly_income (0.00007866)

  • Setiap kenaikan 1 unit pendapatan (misalnya, 1 juta rupiah) meningkatkan log-odds sukses sebesar 0.00007866.
  • p = 0.0405 (signifikan pada level 5%), artinya pendapatan bulanan berhubungan positif dengan peluang sukses untuk berlangganan paket premium.
  • Odds Ratio: \(\text{OR} = e^{0.00007866} \approx 1.00008\). Setiap tambahan 1 juta IDR meningkatkan peluang sukses sekitar 0.008%. Meskipun kecil, ini menunjukkan bahwa pendapatan memiliki pengaruh positif terhadap keputusan pelanggan untuk memilih paket premium.

Interpretasi Goodness of Fit

  • Null Deviance (687.30). Ini adalah deviance dari model tanpa prediktor (hanya intercept).Semakin tinggi nilai deviance, semakin buruk model dalam menjelaskan data.
  • Residual Deviance (682.68). Deviance dari model dengan prediktor.Penurunan dari null deviance ke residual deviance menunjukkan bahwa model yang dibuat dengan prediktor memberikan informasi yang lebih baik.
  • AIC (690.68). AIC digunakan untuk membandingkan model dengan model lain.Model dengan AIC lebih kecil lebih baik dalam menyeimbangkan goodness-of-fit dan kompleksitas model.

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

  • Pendapatan bulanan memiliki pengaruh signifikan terhadap peluang berlangganan paket premium, di mana setiap kenaikan pendapatan meningkatkan peluang sukses sekitar 0.008%.
  • Frekuensi penggunaan aplikasi tidak berpengaruh signifikan terhadap keputusan berlangganan paket premium, baik untuk kategori “Sedang” maupun “Sering”.
  • Individu Pelajar memiliki sedikit peluang lebih besar untuk berlangganan dibandingkan individu Pekerja, meskipun ini tidak signifikan.
  • Model memiliki performa yang cukup baik, namun masih dapat ditingkatkan dengan menambahkan variabel lain untuk meningkatkan kecocokan model.

10.4 Perbandingan Model

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:

    • Frekuensi penggunaan aplikasi memiliki pengaruh yang tidak signifikan terhadap peluang sukses.
    • Untuk frekuensi penggunaan “Sedang” dan “Sering”, p-value masing-masing adalah 0.9723 dan 0.9420, yang menunjukkan bahwa perubahan frekuensi penggunaan aplikasi tidak memengaruhi keputusan untuk berlangganan paket premium.
    • Meskipun frekuensi penggunaan aplikasi “Sering” sedikit lebih tinggi peluang suksesnya, perbedaan ini tidak signifikan dan tidak menunjukkan pengaruh yang kuat terhadap peluang berlangganan.
  • Monthly Income:

    • Pendapatan bulanan memiliki pengaruh positif yang signifikan terhadap peluang sukses untuk berlangganan paket premium.
    • Setiap tambahan 1 juta IDR dalam pendapatan bulanan meningkatkan peluang sukses sekitar 0.008% (p = 0.0405, yang signifikan pada level 5%).
    • Ini menunjukkan bahwa pendapatan lebih tinggi secara konsisten meningkatkan peluang sukses dalam memilih paket premium.

11 Pemilihan Model Regresi Logistik dan Evaluasi

11.1 Membangun Model Regresi Logistik: Pendekatan Confirmatory dan Exploratory

Dalam membangun model regresi logistik, terdapat dua pendekatan umum yang digunakan, yaitu:

  1. Pendekatan Confirmatory (Konfirmatori)

    • Digunakan ketika peneliti memiliki hipotesis atau teori sebelumnya mengenai variabel mana yang seharusnya dimasukkan dalam model.
    • Pendekatan ini lebih bersifat “deduktif”.
    • Contohnya, dalam studi epidemiologi, model dibangun berdasarkan pengetahuan klinis atau hasil penelitian terdahulu.
    • Tujuan utama dari pendekatan ini adalah untuk menguji apakah hubungan yang telah diasumsikan sebelumnya benar-benar signifikan secara statistik.
  2. Pendekatan Exploratory (Eksploratori)

    • Digunakan ketika belum ada informasi yang cukup mengenai hubungan antar variabel, sehingga perlu dilakukan eksplorasi terhadap data.
    • Peneliti mencoba berbagai kombinasi variabel untuk menemukan model terbaik.
    • Biasanya menggunakan teknik seperti stepwise selection untuk memilih variabel yang signifikan.
    • Pendekatan ini bersifat “data-driven” dan lebih fleksibel, tetapi rentan terhadap overfitting jika tidak dilakukan dengan hati-hati.

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.

11.2 Metode Stepwise (Forward, Backward, Kedua Arah)

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:

  1. Metode Forward Selection

    • Dimulai dengan model kosong (tidak ada variabel).
    • Tambahkan satu per satu variabel yang paling signifikan (berdasarkan AIC, deviance, atau p-value).
    • Proses berhenti saat tidak ada variabel baru yang menurunkan AIC secara signifikan.
  2. Metode Backward Elimination

    • Dimulai dengan model lengkap (semua variabel masuk).
    • Hapus variabel satu per satu yang kontribusinya paling kecil (paling tidak signifikan).
    • Proses berakhir saat tidak ada lagi variabel yang dapat dieliminasi tanpa meningkatkan AIC.
  3. Metode Stepwise (Bidirectional)

    • Kombinasi forward dan backward.
    • Model dapat menambahkan atau menghapus variabel pada setiap langkahnya.
    • Digunakan untuk efisiensi dan fleksibilitas tinggi.

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.

11.3 ROC, AUC, PR Curve

11.3.1 ROC dan AUC

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

  • True Positive Rate (TPR) juga dikenal sebagai sensitivitas, yaitu:

\[ \text{TPR} = \frac{\text{True Positive}}{\text{True Positive} + \text{False Negative}} \]

  • False Positive Rate (FPR) juga dikenal sebagai spesifisitas adalah:

\[ \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 = 0.5: Model tidak lebih baik dari tebak-tebakan acak
  • AUC > 0.7: Model cukup baik
  • AUC > 0.9: Model sangat baik

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.

11.3.2 PR Curve

Precision-Recall Curve (PR Curve) adalah grafik yang menggambarkan hubungan antara Precision (Presisi) dan Recall (Sensitivitas) pada berbagai ambang batas prediksi.

  • Precision adalah proporsi prediksi positif yang benar, dihitung dengan rumus:

\[ \text{Precision} = \frac{\text{True Positive}}{\text{True Positive} + \text{False Positive}} \]

  • Recall adalah proporsi data positif yang berhasil terdeteksi:

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

  • ROC mempertimbangkan semua kelas dan ambang batas, tapi bisa terlalu optimis pada data yang tidak seimbang.
  • PR Curve lebih fokus pada performa dalam mendeteksi kelas positif, terutama saat jumlah kasus positif jauh lebih sedikit dari negatif.

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

11.3.3 Interpretasi

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

11.4 Pseudo R-Squared

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:

  1. Cox and Snell (1989)

Pseudo R-squared versi Cox & Snell didefinisikan sebagai:

\[ R^2_{CS} = 1 - \left(\frac{L_0}{L_M}\right)^{2/n} \]

  • \(L_0\): likelihood dari model null (tanpa prediktor)
  • \(L_M\): likelihood dari model dengan prediktor
  • \(n\): jumlah observasi

Namun, nilai maksimum dari \(R^2_{CS}\) tidak mencapai 1, sehingga interpretasinya agak terbatas.

  1. McFadden (1972)

Rumus:

\[ R^2_{McF} = 1 - \frac{\ln L_M}{\ln L_0} \]

  • Lebih sederhana dan langsung membandingkan log-likelihood model penuh dengan model null.
  • Nilai antara 0.2–0.4 sudah dianggap sangat baik dalam regresi logistik.

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.

11.5 Tabel Klasifikasi dan Evaluasi

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:

  • True Positive (TP): Model memprediksi 1 dan aktualnya 1
  • False Positive (FP): Model memprediksi 1 padahal aktualnya 0
  • True Negative (TN): Model memprediksi 0 dan aktualnya 0
  • False Negative (FN): Model memprediksi 0 padahal aktualnya 1

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.

11.6 Perbandingan Model Regresi Logistik

Dalam mengevaluasi dan membandingkan model regresi logistik, terdapat beberapa kriteria statistik yang sering digunakan:

11.6.1 AIC (Akaike Information Criterion)

AIC digunakan untuk membandingkan beberapa model, dengan rumus:

\[ AIC = -2 \cdot \ln(L) + 2k \]

  • \(L\): likelihood dari model
  • \(k\): jumlah parameter dalam model

Semakin kecil nilai AIC, maka semakin baik model (dengan catatan kompleksitas model tidak terlalu tinggi).

11.6.2 Deviance

Deviance mengukur kesesuaian model terhadap data:

  • Null deviance: deviance dari model tanpa prediktor
  • Residual deviance: deviance dari model saat ini
  • Penurunan deviance menunjukkan bahwa model lebih baik dari model null.

11.6.3 Likelihood Ratio Test (LRT)

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.

11.6.4 Prinsip Parsimony

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.

12 Distribusi Multinomial

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.

12.1 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

  • Setiap set koefisien menjelaskan log-odds memilih kategori \(j\) dibanding kategori baseline.
  • Jika koefisien \(\beta_{1j}\) bernilai positif, maka peningkatan \(x_1\) meningkatkan peluang memilih kategori \(j\) dibanding baseline.
  • Untuk mendapatkan odds ratio, cukup lakukan eksponensiasi pada koefisien: \(e^{\beta_{ij}}\).

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.

12.2 Simulasi dan Eksplorasi Data

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

12.3 Pemodelan Regresi Multinomial di R

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:

  • Jalan Kaki (JK)
  • Motor (M)
  • Mobil (baseline / referensi)

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

  • Jalan Kaki vs Mobil
    • Koefisien jarak = −0.697, p < 0.001 → signifikan → semakin jauh jarak, semakin kecil kemungkinan memilih jalan kaki dibanding mobil
    • Koefisien punya_motor = 0.586, p = 0.134 → tidak signifikan → tidak ada bukti kuat bahwa memiliki motor memengaruhi peluang memilih jalan kaki dibanding mobil.
  • Motor vs Mobil
    • Koefisien jarak = −0.312, p < 0.001 → signifikan → semakin jauh jarak, semakin kecil kemungkinan memilih motor dibanding mobil
    • Koefisien punya_motor = 0.948, p = 0.001 → signifikan → memiliki motor meningkatkan kemungkinan memilih motor dibanding mobil

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

12.4 Evaluasi Model

Evaluasi model logistik multinomial dapat dilakukan dengan beberapa pendekatan, antara lain menggunakan nilai AIC, pseudo R-squared, dan confusion matrix untuk melihat performa klasifikasi.

12.4.1 AIC dan Deviance

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

12.4.2 Pseudo R-Squared

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

12.4.3 Confusion Matrix dan Akurasi

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

12.5 Prediksi dan Visualisasi Hasil Prediksi

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.

12.6 Perbandingan Model Alternatif

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.

13 Regresi Logistik Ordinal

13.1 Apa itu Regresi Logistik Ordinal

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:

  • Tingkat stres: Rendah, Sedang, Tinggi
  • Kepuasan pengguna: Tidak Puas, Netral, Puas
  • Persepsi risiko: Rendah, Sedang, Tinggi

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)
Contoh Data Tingkat Stres Mahasiswa Selama Ujian
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:

  • jumlah_mk: jumlah mata kuliah yang diambil selama semester ini
  • tidur: durasi tidur rata-rata (jam per hari)
  • siap_ujian: status kesiapan ujian (Siap / Tidak Siap)

13.2 Model Cumulative Logit

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:

  • \(\theta_j\): intercept khusus untuk batas ke-\(j\)
  • \(\beta_1, \dots, \beta_k\): koefisien regresi (sama untuk semua batas)
  • \(X_1, \dots, X_k\): variabel prediktor
  • \(P(Y \leq j)\): probabilitas kumulatif respon berada di kategori ke-\(j\) atau lebih rendah

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.795
    • Sedang | Tinggi = 1.233
      Nilai ini merepresentasikan batas antara kategori stres dan digunakan untuk menghitung probabilitas kumulatif.

Secara keseluruhan, tidak ada prediktor dalam model ini yang signifikan secara statistik pada tingkat signifikansi 5%.

13.3 Asumsi Paralelisme (Proportional Odds)

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.

  • Hipotesis nol (H0): Asumsi paralelisme terpenuhi, yaitu \(\beta_{1} = \beta_{2} = \dots = \beta_{J-1}\)
  • Hipotesis alternatif (H1): Terdapat minimal satu koefisien yang berbeda antar 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

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

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

13.4 Prediksi Probabilitas Kategori

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

  • Mahasiswa 1 (6 MK, tidur 5 jam, siap ujian) Probabilitas tertinggi = 0.463 pada kategori Sedang → diprediksi memiliki tingkat stres Sedang.
  • Mahasiswa 2 (8 MK, tidur 7 jam, tidak siap ujian): Probabilitas tertinggi = 0.325 pada kategori Tinggi → diprediksi mengalami stres Tinggi, meskipun selisih dengan kategori Sedang tipis.
  • Mahasiswa 3 (5 MK, tidur 4.5 jam, tidak siap ujian): Probabilitas tertinggi = 0.467 pada kategori Sedang → diprediksi memiliki stres Sedang, walau peluang stres rendah cukup besar (25%).

13.5 Evaluasi Model

Setelah membangun model cumulative logit dan memprediksi probabilitas, kita perlu mengevaluasi kualitas model secara keseluruhan.

Evaluasi model dilakukan dengan beberapa cara:

  1. Deviance dan AIC

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
  1. Pseudo R-Squared (McFadden)

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.

14 Log-Linear Model

14.1 Apa itu Model Log-Linear?

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.

14.2 Tabel Kontingensi dan Frekuensi

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:

  • Variabel A (misalnya jenis kelamin: Laki-laki, Perempuan)
  • Variabel B (misalnya status merokok: Ya, Tidak)

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_{++}\)
  • \(n_{ij}\): frekuensi observasi untuk kombinasi ke-\(i\), \(j\)
  • \(n_{i+}\): jumlah total baris ke-\(i\)
  • \(n_{+j}\): jumlah total kolom ke-\(j\)
  • \(n_{++}\): total keseluruhan observasi

Tabel ini disebut juga tabel frekuensi silang (cross-tabulation).

Notasi Umum

Dalam konteks model log-linear, kita menggunakan:

  • \(n_{ij}\): nilai observasi aktual (frekuensi hasil pengamatan)
  • \(\mu_{ij}\): nilai ekspektasi frekuensi menurut model

Untuk tabel tiga arah (variabel A, B, dan C), notasi diperluas menjadi \(n_{ijk}\) dan \(\mu_{ijk}\).

Tujuan Penggunaan Tabel Kontingensi

  • Mengetahui apakah terdapat hubungan antara dua atau lebih variabel kategorik
  • Melihat pola distribusi frekuensi antar kategori
  • Menjadi dasar untuk membangun model log-linear

14.3 Bentuk Umum Model Log-Linear

14.3.1 Model Dua Arah

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:

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

Model ini disebut model penuh (saturated) karena mencakup semua komponen: efek utama dan interaksi.

14.3.2 Model Tiga Arah

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:

  • Efek utama: \(\lambda_i^A, \lambda_j^B, \lambda_k^C\)
  • Interaksi dua arah: \(\lambda_{ij}^{AB}, \lambda_{ik}^{AC}, \lambda_{jk}^{BC}\)
  • Interaksi tiga arah: \(\lambda_{ijk}^{ABC}\)

Sifat Model Log-Linear

  • Model independen hanya menyertakan efek utama
  • Model dengan interaksi dua arah mengasumsikan ada ketergantungan pasangan variabel
  • Model penuh (saturated) menjelaskan semua variasi (kesesuaian sempurna)

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.

14.4 Tujuan Analisis Log-Linear

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:

    • Kecocokan dengan data (goodness-of-fit)
    • Kesederhanaan model
    • Interpretasi yang bermakna secara substantif
  • 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.

14.5 Kategori Model Log-Linear

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.

14.5.1 Model Independensi

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.

14.5.2 Model Parsial (Partial Association)

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.

14.5.3 Model Saturated (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.

14.6 Kapan Menggunakan Model Log-Linear?

Model log-linear cocok digunakan dalam analisis data kategorik ketika:

  • Semua variabel bersifat kategorik Tidak ada variabel numerik yang diharapkan menjadi respon atau prediktor.
  • Tujuan analisis adalah menguji hubungan antar variabel, bukan memprediksi satu variabel tertentu. Misalnya, ingin mengetahui apakah jenis kelamin berhubungan dengan preferensi belanja dan status pernikahan secara bersamaan.
  • Tidak ada variabel yang ditetapkan sebagai respon Berbeda dengan regresi logistik yang menetapkan satu variabel sebagai respon, log-linear memperlakukan semua variabel secara setara.
  • Data disajikan dalam bentuk tabel kontingensi Seperti data frekuensi survei, hasil pengamatan dalam studi sosial, atau eksperimen yang dikelompokkan.

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

15 Model Log-Linear Dua Arah

15.1 Model Log-Linear pada Tabel Kontingensi 2 Arah

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:

  • Variabel \(A\) dengan kategori \(i = 1, 2, \dots, I\)
  • Variabel \(B\) dengan kategori \(j = 1, 2, \dots, J\)

Maka bentuk umum model log-linear dua arah adalah:

\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]

di mana:

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

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.

15.2 Estimasi Parameter Log-Linear 2 Arah

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:

  • \(\sum_i \lambda_i^A = 0\)
  • \(\sum_j \lambda_j^B = 0\)
  • \(\sum_i \lambda_{ij}^{AB} = 0\)
  • \(\sum_j \lambda_{ij}^{AB} = 0\)

Dengan ini, hanya satu nilai untuk setiap efek yang perlu dihitung. Misalnya, untuk tabel 2×2:

  • \(\lambda_2^A = -\lambda_1^A\)
  • \(\lambda_2^B = -\lambda_1^B\)
  • \(\lambda_{12}^{AB} = -\lambda_{11}^{AB}\)
  • \(\lambda_{21}^{AB} = -\lambda_{11}^{AB}\)
  • \(\lambda_{22}^{AB} = \lambda_{11}^{AB}\)

Rumus Estimasi Parameter

Dengan asumsi \(\mu_{ij} = n_{ij}\) pada model saturated, parameter dapat dihitung sebagai:

  • Efek utama untuk variabel A: \[ \lambda_1^A = \frac{1}{2} \left[ \log(\mu_{11}) + \log(\mu_{12}) - \log(\mu_{21}) - \log(\mu_{22}) \right] \]
  • Efek utama untuk variabel B: \[ \lambda_1^B = \frac{1}{2} \left[ \log(\mu_{11}) + \log(\mu_{21}) - \log(\mu_{12}) - \log(\mu_{22}) \right] \]
  • Efek interaksi: \[ \lambda_{11}^{AB} = \frac{1}{4} \left[ \log(\mu_{12}) - \log(\mu_{11}) - \log(\mu_{22}) + \log(\mu_{21}) \right] \]

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

15.3 Analisis Data Tabel Kontingensi 2×2

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

    • \(A_1\): Formal
    • \(A_2\): Informal
  • Variabel \(B\): Kebiasaan Berolahraga

    • \(B_1\): Ya
    • \(B_2\): Tidak
Notasi Nilai Observasi
\(n_{11}\) 20
\(n_{12}\) 30
\(n_{21}\) 10
\(n_{22}\) 40

Total responden: \(n_{++} = 100\)

15.3.1 Bentuk Model Log-Linear

Bentuk umum model log-linear dua arah adalah:

\[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \]

Dengan:

  • \(i = 1\) untuk Formal, \(i = 2\) untuk Informal
  • \(j = 1\) untuk Ya, \(j = 2\) untuk Tidak

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:

  • \(\lambda_1^A + \lambda_2^A = 0\)
  • \(\lambda_1^B + \lambda_2^B = 0\)
  • \(\lambda_{11}^{AB} + \lambda_{12}^{AB} = 0\)
  • \(\lambda_{11}^{AB} + \lambda_{21}^{AB} = 0\)

Constraint ini memastikan bahwa efek parameter merepresentasikan deviasi dari rata-rata dan membuat model teridentifikasi.

15.3.2 Estimasi Parameter Model (Manual, Sum-to-Zero)

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

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

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

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

  • Nilai \(\lambda_{11}^{AB}\) yang negatif menunjukkan bahwa kombinasi Formal dan Olahraga: Ya memiliki frekuensi lebih rendah dari yang diharapkan jika independen.
  • Nilai interaksi lainnya berlawanan tanda sesuai constraint, menandakan adanya pola ketergantungan antara pekerjaan dan kebiasaan olahraga.

15.3.3 Hitung Odds Ratio dan Interval Kepercayaan

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

  • Odds Ratio = 2.67 → menunjukkan bahwa responden dari pekerjaan formal memiliki peluang berolahraga 2.67 kali lebih besar dibanding informal.
  • CI 95% untuk OR: (1.09, 6.52) → karena CI tidak mengandung 1, maka kita simpulkan bahwa terdapat hubungan signifikan antara jenis pekerjaan dan kebiasaan olahraga.

15.3.4 Fitting Model Log-Linear dengan R

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.

  • PekerjaanInformal:
    Estimasi = 6.52e-14, p-value = 1.000 → tidak signifikan
    → Artinya, tidak ada perbedaan jumlah antara pekerjaan Formal dan Informal secara terpisah.
  • OlahragaTidak:
    Estimasi = 0.847, p-value = 0.0001 (***)
    → Signifikan → Ada pengaruh kebiasaan olahraga terhadap jumlah frekuensi.
  • Residual deviance = 4.83, df = 1
    → Masih agak besar untuk model kecil → indikasi fit tidak sempurna
  • AIC = 30.606

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.

  • PekerjaanInformal:
    Estimasi = –0.693, p = 0.073 → marginal, tidak signifikan pada 5% tapi dekat
  • OlahragaTidak:
    Estimasi = 0.406, p = 0.160 → tidak signifikan
  • Interaksi PekerjaanInformal:OlahragaTidak:
    Estimasi = 0.981, **p = 0.0316 (*)
    → Signifikan → Artinya,
    kombinasi Informal dan Tidak Olahraga** punya frekuensi lebih tinggi dari yang diharapkan jika hanya efek utama yang dipertimbangkan.
  • Residual deviance ≈ 0 (4.44e-16), df = 0 → cocok sempurna (saturated)
  • AIC = 27.775, lebih kecil dari model sebelumnya

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.

15.4 Analisis Data Tabel Kontingensi 2×3

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

    • \(A_1\): Formal
    • \(A_2\): Informal
  • \(B\): Kebiasaan Olahraga

    • \(B_1\): Rutin
    • \(B_2\): Kadang
    • \(B_3\): Tidak

15.4.1 Bentuk Model Log-Linear

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

15.4.2 Fitting Model Log-Linear di R

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.

  • (Intercept) = 2.303
    → Ini adalah \(\log(\mu)\) untuk kategori referensi:
    Pekerjaan = Formal, Olahraga = Rutin
    Maka: \[ \mu_{\text{Formal, Rutin}} = e^{2.303} \approx 10 \]
  • PekerjaanInformal = 1.707e-11
    → Tidak ada perbedaan log-frekuensi antara Informal dan Formal (jika olahraga tetap).
    Artinya, model ini mengasumsikan bahwa jenis pekerjaan tidak memengaruhi frekuensi.
  • OlahragaKadang = –0.6931
    → Dibandingkan olahraga Rutin, kategori Kadang menghasilkan frekuensi lebih rendah:
    \[ e^{-0.6931} \approx 0.5 \] → Hanya setengah dari frekuensi olahraga rutin.
  • OlahragaTidak = 1.253
    → Dibandingkan olahraga Rutin, kategori Tidak olahraga memiliki frekuensi lebih tinggi:
    \[ e^{1.253} \approx 3.5 \] → Lebih dari 3 kali lipat dari Rutin.
  • Residual deviance = 6.666 (df = 2)
  • AIC = 40.44

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

  • (Intercept) = 2.7081
    → Ini adalah \(\log(\mu)\) untuk kategori referensi:
    Pekerjaan = Formal, Olahraga = Rutin
    Sehingga: \[ \mu_{\text{Formal, Rutin}} = e^{2.7081} \approx 15 \]
  • PekerjaanInformal = –1.0986
    → Dibandingkan Formal, kategori Informal memiliki rata-rata log-frekuensi yang lebih rendah sebesar 1.0986 jika jenis olahraga tetap.
    \[ \text{Rate Informal} = e^{-1.0986} \approx 0.333 \] → Artinya, frekuensinya sekitar sepertiga dari Formal (jika olahraga sama).
  • OlahragaKadang = –1.0986
    → Dibandingkan olahraga Rutin, kategori Kadang memiliki frekuensi sekitar sepertiga:
    \[ e^{-1.0986} \approx 0.333 \]
  • OlahragaTidak = 0.6931
    → Dibandingkan olahraga Rutin, kategori Tidak olahraga memiliki frekuensi sekitar 2 kali lebih tinggi: \[ e^{0.6931} \approx 2 \]
  • PekerjaanInformal × OlahragaKadang = 1.0986
    → Kombinasi ini menambah log-frekuensi sebesar 1.0986 dibandingkan model tanpa interaksi.
    \[ e^{1.0986} \approx 3 \] → Frekuensi menjadi 3 kali lipat lebih besar dari yang diperkirakan oleh efek utama saja.
  • PekerjaanInformal × OlahragaTidak = 1.3863
    → Interaksi ini menunjukkan bahwa responden dari pekerjaan Informal yang tidak berolahraga memiliki frekuensi hampir 4 kali lipat dari yang diperkirakan hanya dari efek utama.
    \[ e^{1.3863} \approx 4 \]
  • Residual deviance ≈ 0 (df = 0)
  • AIC = 37.774

Jadi, model dengan interaksi lebih baik karena fit sempurna (deviance ≈ 0), AIC lebih rendah, serta terdapat interaksi signifikan antara jenis pekerjaan dan intensitas olahraga.

16 Model Log-Linear Tiga Arah

16.1 Model Log-Linear untuk Tabel Tiga Arah

Model log-linear tiga arah digunakan untuk menganalisis hubungan antara tiga variabel kategorik dalam bentuk tabel kontingensi tiga dimensi.

Misalkan terdapat tiga variabel kategorik:

  • \(X\) dengan kategori \(i = 1, 2, \dots, I\)
  • \(Y\) dengan kategori \(j = 1, 2, \dots, J\)
  • \(Z\) dengan kategori \(k = 1, 2, \dots, K\)

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:

  1. Model Saturated

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

  • Memuat semua efek utama, dua arah, dan tiga arah
  • Model paling kompleks dan selalu cocok sempurna dengan data (deviance = 0)
  • Digunakan sebagai pembanding terhadap model lain
  1. Model Homogenous Association

\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{ij}^{XY} + \lambda_{ik}^{XZ} + \lambda_{jk}^{YZ} \]

  • Tidak memuat interaksi tiga arah (\(\lambda_{ijk}^{XYZ} = 0\))
  • Mengasumsikan asosiasi dua arah konsisten di seluruh level variabel ketiga
  1. Model Conditional Independence (misal: Y ⊥ Z | X)

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

  1. Model Joint Independence (misal: YZ ⊥ X)

\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z + \lambda_{jk}^{YZ} \]

  • Mengasumsikan variabel Y dan Z berasosiasi, tetapi secara bersama independen dari X
  1. Model Mutual Independence (Tanpa Interaksi)

\[ \log(\mu_{ijk}) = \lambda + \lambda_i^X + \lambda_j^Y + \lambda_k^Z \]

  • Mengasumsikan semua variabel saling independen
  • Model paling sederhana dan biasanya tidak cocok untuk data nyata

16.2 Pengujian Interaksi dalam Model Log-Linear Tiga Arah

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:

  1. Uji Interaksi Tiga Arah

    • Membandingkan model saturated dengan model homogenous
    • Apakah terdapat interaksi antara \(X\), \(Y\), dan \(Z\) secara bersamaan?
  2. Uji Interaksi Dua Arah (Conditional Association)

    • Menguji interaksi antar dua variabel dengan mengondisikan variabel ketiga:
    • Apakah ada interaksi Y dan Z jika X tetap (Y ⊥̸ Z | X)?
    • Apakah ada interaksi X dan Z jika Y tetap (X ⊥̸ Z | Y)?
    • Apakah ada interaksi X dan Y jika Z tetap (X ⊥̸ Y | Z)?

Pengujian dilakukan dengan membandingkan nilai deviance antar model dan menggunakan uji Chi-Square terhadap selisih deviance.

16.3 Analisis Tabel Kontingensi 3 Arah

Misalnya, sebuah survei dilakukan terhadap 120 responden untuk mengetahui hubungan antara:

  • Jenis Kelamin (X): Laki-laki, Perempuan
  • Status Merokok (Y): Ya, Tidak
  • Status Kesehatan (Z): Sakit, Sehat

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

16.4 Uji Model Interaksi Tiga Arah (Saturated VS Homogenous)

16.4.1 Model Saturated

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:

  • Jenis_Kelamin: “1M” sebagai referensi
  • Merokok: “1Ya” sebagai referensi
  • Kesehatan: “1Skt” 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

  • (Intercept) = 2.996
    → Ini adalah \(\log(\mu)\) untuk sel referensi:
    Laki-laki, Merokok, dan Sakit
    \[ \mu_{1M,1Ya,1Skt} = e^{2.996} \approx 20 \]
  • Jenis_Kelamin2F = –0.693
    → Jika responden perempuan (dibanding laki-laki), log-frekuensi menurun 0.693 (jika Merokok & Kesehatan tetap).
    \[ e^{-0.693} \approx 0.5 \Rightarrow \text{Frekuensinya separuhnya} \]
  • Merokok2Tdk = –1.386, signifikan (p = 0.0055)
    → Tidak merokok dikaitkan dengan penurunan log-frekuensi sebesar 1.386 dibanding merokok.
    \[ e^{-1.386} \approx 0.25 \]
  • Kesehatan2Sht = –0.693
    → Sehat memiliki frekuensi 0.5x dari Sakit jika faktor lain tetap. \[ e^{-0.693} \approx 0.5 \]
  • Jenis_Kelamin2F : Merokok2Tdk = 0.693
    → Kombinasi perempuan dan tidak merokok menghasilkan frekuensi 2× dari yang diperkirakan oleh efek utama saja.
    \[ e^{0.693} \approx 2 \]
    Tapi tidak signifikan (p = 0.35)
  • Jenis_Kelamin2F : Kesehatan2Sht \[ \approx \] 0 → Tidak ada efek tambahan dari kombinasi Perempuan & Sehat → tidak signifikan
  • Merokok2Tdk : Kesehatan2Sht = 2.303, signifikan (p < 0.001)
    → Kombinasi Tidak Merokok dan Sehat sangat berpengaruh → Frekuensi ≈ 10× lebih besar dari yang diperkirakan oleh efek utama saja
    \[ e^{2.303} \approx 10 \]
  • Jenis_Kelamin2F : Merokok2Tdk : Kesehatan2Sht = 0.470
    → Kombinasi spesifik Perempuan, Tidak Merokok, Sehat menambah log-frekuensi sebesar 0.47, namun tidak signifikan (p = 0.623)
  • Residual Deviance = ~0, df = 0
  • AIC = 50.192

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.

16.4.2 Model Homogenous

Model homogenous adalah model log-linear yang memuat:

  • Semua efek utama
  • Semua interaksi dua arah
  • Tanpa interaksi tiga arah

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

  • (Intercept) = 3.0212
    \[ \log(\mu_{1M,1Ya,1Skt}) = 3.0212 \Rightarrow \mu = e^{3.0212} \approx 20.5 \]
    → Ini adalah frekuensi referensi (Laki-laki, Merokok, Sakit)
  • Jenis_Kelamin2F = –0.7716, signifikan (p = 0.031)
    → Perempuan memiliki frekuensi lebih rendah dibanding laki-laki , yaitu sebesar 0.462 kali \[ e^{-0.7716} \approx 0.462 \]
  • Merokok2Tdk = –1.5206, signifikan (p < 0.001)
    → Tidak merokok menurunkan frekuensi menjadi sekitar
    \[ e^{-1.5206} \approx 0.218 \]
  • Kesehatan2Sht = –0.7716, signifikan (p = 0.031)
    → Status Sehat memiliki frekuensi lebih rendah dibanding Sakit, yaitu sebesar 0.462 kali \[ e^{-0.7716} \approx 0.462 \]
  • Jenis_Kelamin2F × Merokok2Tdk = 0.9786, signifikan (p = 0.035)
    → Perempuan yang tidak merokok memiliki frekuensi lebih tinggi dibanding yang diprediksi dari efek utama saja
    \[ e^{0.9786} \approx 2.66 \]
  • Jenis_Kelamin2F × Kesehatan2Sht = 0.2296, tidak signifikan
    → Tidak ada efek tambahan yang bermakna
  • Merokok2Tdk × Kesehatan2Sht = 2.5103, sangat signifikan (p < 0.001)
    → Tidak merokok dan sehat → frekuensi meningkat sangat tajam
    \[ e^{2.5103} \approx 12.3 \]
  • Residual deviance = 0.242, df = 1
  • AIC = 48.435
    → Lebih kecil dari model saturated (AIC = 50.192)

Model homogenous fit dengan sangat baik dan lebih efisien dari model saturated. Hanya efek interaksi Jenis Kelamin dan Kesehatan yang tidak signifikan.

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

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.

16.5 Uji Model Interaksi Dua Arah (Homogenous VS Conditional on X)

16.5.1 Model Conditional on X

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

  • (Intercept) = 2.526
    → Ini adalah \(\log(\mu)\) untuk sel referensi:
    Laki-laki, Merokok, Sakit
    \[ \mu = e^{2.526} \approx 12.5 \]
  • Jenis_Kelamin2F = –1.204, signifikan (p = 0.0038)
    → Perempuan dibandingkan laki-laki memiliki frekuensi lebih rendah, sebesar 0.3 kali. \[ e^{-1.204} \approx 0.3 \]
  • Merokok2Tdk = ~0, tidak signifikan (p = 1.000)
    → Tanpa interaksi, efek “Tidak Merokok” terhadap frekuensi tidak berbeda dengan referensi
  • Kesehatan2Sht = 0.3365, tidak signifikan (p = 0.198)
    → Tidak ada pengaruh signifikan dari status Sehat jika Jenis Kelamin dan Merokok tetap
  • Jenis_Kelamin2F × Merokok2Tdk = 1.099, signifikan (p = 0.0053)
    → Untuk Perempuan yang Tidak Merokok, frekuensi meningkat secara signifikan sebesar 3 kali lebih tinggi dari yang diperkirakan oleh efek utama.
    \[ e^{1.099} \approx 3 \]
  • Jenis_Kelamin2F × Kesehatan2Sht = 0.762, marginal signifikan (p = 0.055)
    → Perempuan yang Sehat memiliki kecenderungan frekuensi 2.14 kali dari yang diperkirakan oleh efek utama saja, tetapi tidak signifikan. \[ e^{0.762} \approx 2.14 \]
  • Residual Deviance = 33.27, df = 2
  • AIC = 79.461 → jauh lebih besar dari model homogenous (AIC = 48.435) maupun saturated (AIC = 50.192)

Model ini tidak memasukkan interaksi antara Merokok dan Kesehatan. Ada beberapa efek signifikan yaitu Jenis kelamin dan interaksi jenis kelamin dengan merokok.

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

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.

16.6 Uji Model Interaksi Dua Arah (Homogenous VS Conditional on Y)

16.6.1 Model Conditional on Y

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

  • (Intercept) = 2.996
    → Ini adalah \(\log(\mu)\) untuk sel referensi:
    Laki-laki, Merokok, Sakit
    \[ \mu = e^{2.996} \approx 20 \]
  • Jenis_Kelamin2F = –0.6931, signifikan (p = 0.028)
    → Perempuan memiliki frekuensi lebih rendah daripada laki-laki:
    \[ e^{-0.6931} \approx 0.5 \]
  • Merokok2Tdk = –1.6094, signifikan (p < 0.001)
    → Tidak merokok memiliki frekuensi lebih rendah daripada merokok:
    \[ e^{-1.6094} \approx 0.2 \]
  • Kesehatan2Sht = –0.6931, signifikan (p = 0.028)
    → Responden sehat memiliki frekuensi setengah dari yang sakit \[ e^{-0.6931} \approx 0.5 \]
  • Jenis_Kelamin2F × Merokok2Tdk = 1.0986, signifikan (p = 0.005)
    → Untuk perempuan yang tidak merokok, frekuensi meningkat:
    \[ e^{1.0986} \approx 3 \]
  • Merokok2Tdk × Kesehatan2Sht = 2.5649, sangat signifikan (p < 0.001)
    → Tidak merokok dan sehat sangat meningkatkan frekuensi:
    \[ e^{2.5649} \approx 12.99 \]
  • Residual Deviance = 0.4726, df = 2
  • AIC = 46.665 → Lebih baik dari saturated (50.192) maupun homogenous (48.435)

Model ini mengasumsikan interaksi X × Z (Jenis Kelamin × Kesehatan) tidak diperlukan. Semua efek signifikan.

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

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

16.7 Uji Model Interaksi Dua Arah (Homogenous VS Conditional on Z)

16.7.1 Model Conditional on 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:

    • conditional on Y (46.665)
    • homogenous (48.435)
    • Tapi lebih rendah dari conditional on X (79.461)

Model ini mengasumsikan bahwa interaksi antara Jenis Kelamin dan Merokok tidak diperlukan.
Sebagian besar efek utama dan interaksi yang dipertahankan adalah signifikan.

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

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.

16.8 Pemilihan Model Terbaik

16.8.1 Ringkasan Model Log Linier

# 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

16.8.2 Ringkasan Pengujian Interaksi 3 Arah dan 2 Arah

# 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

16.8.3 Kesimpulan Pemilihan Model Terbaik

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:

    • Interaksi tiga arah (X:Y:Z) tidak signifikan → model homogenous cukup
    • Interaksi Y × Z dan X × Y signifikan → perlu dipertahankan
    • Interaksi X × Z tidak signifikan → bisa dihilangkan

Jadi, model conditional on Y adalah model terbaik, karena:

  • Memberikan fit sangat baik
  • Lebih sederhana dari model homogenous
  • Interaksi X × Z tidak signifikan, dan tidak perlu dimasukkan
  • Mempertahankan interaksi penting: X × Y dan Y × Z

16.9 Model Terbaik

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

16.9.1 Interpretasi Koefisien Model Terbaik

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

  • (Intercept) = 2.996
    → Ini adalah \(\log(\mu)\) untuk sel referensi:
    Laki-laki, Merokok, Sakit
    \[ \mu = e^{2.996} \approx 20 \]
  • Jenis_Kelamin2F = –0.6931, signifikan (p = 0.028)
    → Perempuan memiliki frekuensi lebih rendah daripada laki-laki:
    \[ e^{-0.6931} \approx 0.5 \]
  • Merokok2Tdk = –1.6094, signifikan (p < 0.001)
    → Tidak merokok memiliki frekuensi lebih rendah daripada merokok:
    \[ e^{-1.6094} \approx 0.2 \]
  • Kesehatan2Sht = –0.6931, signifikan (p = 0.028)
    → Responden sehat memiliki frekuensi setengah dari yang sakit \[ e^{-0.6931} \approx 0.5 \]
  • Jenis_Kelamin2F × Merokok2Tdk = 1.0986, signifikan (p = 0.005)
    → Untuk perempuan yang tidak merokok, frekuensi meningkat:
    \[ e^{1.0986} \approx 3 \]
  • Merokok2Tdk × Kesehatan2Sht = 2.5649, sangat signifikan (p < 0.001)
    → Tidak merokok dan sehat sangat meningkatkan frekuensi:
    \[ e^{2.5649} \approx 12.99 \]
  • Residual Deviance = 0.4726, df = 2
  • AIC = 46.665 → Lebih baik dari saturated (50.192) maupun homogenous (48.435)

Model ini mengasumsikan interaksi X × Z (Jenis Kelamin × Kesehatan) tidak diperlukan. Semua efek signifikan.

16.9.2 Nilai Dugaan Model Terbaik

# 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

  • Nilai dugaan sangat dekat dengan frekuensi aktual → menunjukkan bahwa model fit dengan baik terhadap data
  • Model ini berhasil menangkap struktur asosiasi antara Jenis Kelamin, Merokok, dan Kesehatan, tanpa menyertakan interaksi tiga arah maupun interaksi yang tidak signifikan

17 Studi Kasus (Data Real)

17.1 Pendahuluan

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.

17.2 Data

Data diambil dari Susenas BPS Kabupaten Sleman Tahun 2008

Variabel

  • Pendidikan: Tingkat pendidikan tertinggi yang pernah diduduki

    • SD: Sekolah Dasar
    • SMP: Sekolah Menengah Pertama
    • SMA: Sekolah Menengah Atas
    • PT: Perguruan Tinggi
  • Jenis Kelamin:

    • L: Laki-laki
    • P: Perempuan
  • 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

17.3 Analisis

17.3.1 Bentuk Model Log-Linear

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:

  • \(\mu_{ij}\) adalah frekuensi yang diharapkan untuk kombinasi kategori tingkat pendidikan (A) dan jenis kelamin (B).
  • \(\lambda\) adalah intersep (nilai rata-rata dari semua frekuensi).
  • \(\lambda_i^A\) adalah efek utama dari kategori tingkat pendidikan \(A\).
  • \(\lambda_j^B\) adalah efek utama dari kategori jenis kelamin \(B\).
  • \(\lambda_{ij}^{AB}\) adalah efek interaksi antara kategori pendidikan \(A\) dan jenis kelamin \(B\).

Bentuk Model untuk Data Ini

  • Variabel A (Pendidikan): SD, SMP, SMA, PT
  • Variabel B (Jenis Kelamin): Laki-laki, Perempuan

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.

17.3.2 Fitting Model Log-Linear dengan R

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)
  • Residual deviance: 2407.1 (p > 0.05 → poor fit)
  • AIC: 2513.6 → tinggi

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
  • Residual deviance: ≈ 0 → model sangat cocok
  • AIC: 112.47 → jauh lebih rendah dari model tanpa interaksi

Jadi, karena model interaksi memiliki deviance sangat rendah, AIC jauh lebih kecil, semua parameter signifikan, maka model dengan interaksi adalah model terbaik.

17.4 Kesimpulan

Berdasarkan hasil analisis log-linear terhadap data tingkat pendidikan dan jenis kelamin dari Susenas BPS Kabupaten Sleman Tahun 2008, diperoleh beberapa temuan penting:

  1. Model terbaik yang menjelaskan hubungan antara jenis kelamin dan tingkat pendidikan adalah model dengan interaksi, karena:

    • Memiliki residual deviance ≈ 0, menandakan model sangat cocok.
    • AIC jauh lebih kecil dibandingkan model tanpa interaksi (112.47 vs. 2513.6).
    • Semua parameter termasuk interaksi signifikan secara statistik (p < 0.001).
  2. Interpretasi koefisien model log-linear menunjukkan bahwa:

    • Terdapat perbedaan distribusi pendidikan antara laki-laki dan perempuan.
    • Odds Ratio (OR) menunjukkan bahwa perempuan cenderung memiliki frekuensi lebih rendah pada tingkat pendidikan tertentu (terutama SMA dan PT), dibandingkan laki-laki.
    • Contohnya, OR untuk interaksi SMA dan perempuan adalah 0.59, menunjukkan bahwa jumlah perempuan pada jenjang SMA hanya sekitar 59% dari prediksi berdasarkan efek utama saja.
  3. Temuan ini mengindikasikan adanya ketimpangan berdasarkan jenis kelamin dalam pencapaian pendidikan, khususnya pada jenjang pendidikan menengah dan tinggi, di kalangan masyarakat ekonomi menengah.

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

18 Referensi